diff options
author | Grant Likely <grant.likely@secretlab.ca> | 2012-02-22 20:36:17 -0500 |
---|---|---|
committer | Grant Likely <grant.likely@secretlab.ca> | 2012-02-22 20:36:17 -0500 |
commit | daefd89efc279b142bbb054577c2d706da211723 (patch) | |
tree | 2298056232548f6f22d7bbff2662a2bbf64520de | |
parent | 6e33aceda2d82126e9d08a39e21a15be0dd00a6c (diff) | |
parent | f86bcc302a8c570dd0f5a50097a6af96a0e717c2 (diff) |
Merge branch 'for_3.4/gpio/runtime-pm-cleanup' of git://git.kernel.org/pub/scm/linux/kernel/git/khilman/linux-omap-pm into gpio/next
593 files changed, 6048 insertions, 9020 deletions
diff --git a/Documentation/DocBook/device-drivers.tmpl b/Documentation/DocBook/device-drivers.tmpl index b638e50cf8f6..2f7fd4360848 100644 --- a/Documentation/DocBook/device-drivers.tmpl +++ b/Documentation/DocBook/device-drivers.tmpl | |||
@@ -50,7 +50,9 @@ | |||
50 | 50 | ||
51 | <sect1><title>Delaying, scheduling, and timer routines</title> | 51 | <sect1><title>Delaying, scheduling, and timer routines</title> |
52 | !Iinclude/linux/sched.h | 52 | !Iinclude/linux/sched.h |
53 | !Ekernel/sched.c | 53 | !Ekernel/sched/core.c |
54 | !Ikernel/sched/cpupri.c | ||
55 | !Ikernel/sched/fair.c | ||
54 | !Iinclude/linux/completion.h | 56 | !Iinclude/linux/completion.h |
55 | !Ekernel/timer.c | 57 | !Ekernel/timer.c |
56 | </sect1> | 58 | </sect1> |
@@ -216,7 +218,6 @@ X!Isound/sound_firmware.c | |||
216 | 218 | ||
217 | <chapter id="uart16x50"> | 219 | <chapter id="uart16x50"> |
218 | <title>16x50 UART Driver</title> | 220 | <title>16x50 UART Driver</title> |
219 | !Iinclude/linux/serial_core.h | ||
220 | !Edrivers/tty/serial/serial_core.c | 221 | !Edrivers/tty/serial/serial_core.c |
221 | !Edrivers/tty/serial/8250.c | 222 | !Edrivers/tty/serial/8250.c |
222 | </chapter> | 223 | </chapter> |
diff --git a/Documentation/DocBook/deviceiobook.tmpl b/Documentation/DocBook/deviceiobook.tmpl index c1ed6a49e598..54199a0dcf9a 100644 --- a/Documentation/DocBook/deviceiobook.tmpl +++ b/Documentation/DocBook/deviceiobook.tmpl | |||
@@ -317,7 +317,7 @@ CPU B: spin_unlock_irqrestore(&dev_lock, flags) | |||
317 | <chapter id="pubfunctions"> | 317 | <chapter id="pubfunctions"> |
318 | <title>Public Functions Provided</title> | 318 | <title>Public Functions Provided</title> |
319 | !Iarch/x86/include/asm/io.h | 319 | !Iarch/x86/include/asm/io.h |
320 | !Elib/iomap.c | 320 | !Elib/pci_iomap.c |
321 | </chapter> | 321 | </chapter> |
322 | 322 | ||
323 | </book> | 323 | </book> |
diff --git a/Documentation/driver-model/devres.txt b/Documentation/driver-model/devres.txt index 10c64c8a13d4..41c0c5d1ba14 100644 --- a/Documentation/driver-model/devres.txt +++ b/Documentation/driver-model/devres.txt | |||
@@ -233,6 +233,10 @@ certainly invest a bit more effort into libata core layer). | |||
233 | 6. List of managed interfaces | 233 | 6. List of managed interfaces |
234 | ----------------------------- | 234 | ----------------------------- |
235 | 235 | ||
236 | MEM | ||
237 | devm_kzalloc() | ||
238 | devm_kfree() | ||
239 | |||
236 | IO region | 240 | IO region |
237 | devm_request_region() | 241 | devm_request_region() |
238 | devm_request_mem_region() | 242 | devm_request_mem_region() |
diff --git a/Documentation/feature-removal-schedule.txt b/Documentation/feature-removal-schedule.txt index 1bea46a54b1c..a0ffac029a0d 100644 --- a/Documentation/feature-removal-schedule.txt +++ b/Documentation/feature-removal-schedule.txt | |||
@@ -510,3 +510,17 @@ Why: The pci_scan_bus_parented() interface creates a new root bus. The | |||
510 | convert to using pci_scan_root_bus() so they can supply a list of | 510 | convert to using pci_scan_root_bus() so they can supply a list of |
511 | bus resources when the bus is created. | 511 | bus resources when the bus is created. |
512 | Who: Bjorn Helgaas <bhelgaas@google.com> | 512 | Who: Bjorn Helgaas <bhelgaas@google.com> |
513 | |||
514 | ---------------------------- | ||
515 | |||
516 | What: The CAP9 SoC family will be removed | ||
517 | When: 3.4 | ||
518 | Files: arch/arm/mach-at91/at91cap9.c | ||
519 | arch/arm/mach-at91/at91cap9_devices.c | ||
520 | arch/arm/mach-at91/include/mach/at91cap9.h | ||
521 | arch/arm/mach-at91/include/mach/at91cap9_matrix.h | ||
522 | arch/arm/mach-at91/include/mach/at91cap9_ddrsdr.h | ||
523 | arch/arm/mach-at91/board-cap9adk.c | ||
524 | Why: The code is not actively maintained and platforms are now hard to find. | ||
525 | Who: Nicolas Ferre <nicolas.ferre@atmel.com> | ||
526 | Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> | ||
diff --git a/Documentation/pinctrl.txt b/Documentation/pinctrl.txt index 6727b92bc2fb..150fd3833d0b 100644 --- a/Documentation/pinctrl.txt +++ b/Documentation/pinctrl.txt | |||
@@ -857,42 +857,41 @@ case), we define a mapping like this: | |||
857 | 857 | ||
858 | ... | 858 | ... |
859 | { | 859 | { |
860 | .name "2bit" | 860 | .name = "2bit" |
861 | .ctrl_dev_name = "pinctrl-foo", | 861 | .ctrl_dev_name = "pinctrl-foo", |
862 | .function = "mmc0", | 862 | .function = "mmc0", |
863 | .group = "mmc0_1_grp", | 863 | .group = "mmc0_1_grp", |
864 | .dev_name = "foo-mmc.0", | 864 | .dev_name = "foo-mmc.0", |
865 | }, | 865 | }, |
866 | { | 866 | { |
867 | .name "4bit" | 867 | .name = "4bit" |
868 | .ctrl_dev_name = "pinctrl-foo", | 868 | .ctrl_dev_name = "pinctrl-foo", |
869 | .function = "mmc0", | 869 | .function = "mmc0", |
870 | .group = "mmc0_1_grp", | 870 | .group = "mmc0_1_grp", |
871 | .dev_name = "foo-mmc.0", | 871 | .dev_name = "foo-mmc.0", |
872 | }, | 872 | }, |
873 | { | 873 | { |
874 | .name "4bit" | 874 | .name = "4bit" |
875 | .ctrl_dev_name = "pinctrl-foo", | 875 | .ctrl_dev_name = "pinctrl-foo", |
876 | .function = "mmc0", | 876 | .function = "mmc0", |
877 | .group = "mmc0_2_grp", | 877 | .group = "mmc0_2_grp", |
878 | .dev_name = "foo-mmc.0", | 878 | .dev_name = "foo-mmc.0", |
879 | }, | 879 | }, |
880 | { | 880 | { |
881 | .name "8bit" | 881 | .name = "8bit" |
882 | .ctrl_dev_name = "pinctrl-foo", | 882 | .ctrl_dev_name = "pinctrl-foo", |
883 | .function = "mmc0", | ||
884 | .group = "mmc0_1_grp", | 883 | .group = "mmc0_1_grp", |
885 | .dev_name = "foo-mmc.0", | 884 | .dev_name = "foo-mmc.0", |
886 | }, | 885 | }, |
887 | { | 886 | { |
888 | .name "8bit" | 887 | .name = "8bit" |
889 | .ctrl_dev_name = "pinctrl-foo", | 888 | .ctrl_dev_name = "pinctrl-foo", |
890 | .function = "mmc0", | 889 | .function = "mmc0", |
891 | .group = "mmc0_2_grp", | 890 | .group = "mmc0_2_grp", |
892 | .dev_name = "foo-mmc.0", | 891 | .dev_name = "foo-mmc.0", |
893 | }, | 892 | }, |
894 | { | 893 | { |
895 | .name "8bit" | 894 | .name = "8bit" |
896 | .ctrl_dev_name = "pinctrl-foo", | 895 | .ctrl_dev_name = "pinctrl-foo", |
897 | .function = "mmc0", | 896 | .function = "mmc0", |
898 | .group = "mmc0_3_grp", | 897 | .group = "mmc0_3_grp", |
@@ -995,7 +994,7 @@ This is enabled by simply setting the .hog_on_boot field in the map to true, | |||
995 | like this: | 994 | like this: |
996 | 995 | ||
997 | { | 996 | { |
998 | .name "POWERMAP" | 997 | .name = "POWERMAP" |
999 | .ctrl_dev_name = "pinctrl-foo", | 998 | .ctrl_dev_name = "pinctrl-foo", |
1000 | .function = "power_func", | 999 | .function = "power_func", |
1001 | .hog_on_boot = true, | 1000 | .hog_on_boot = true, |
@@ -1025,7 +1024,7 @@ it, disables and releases it, and muxes it in on the pins defined by group B: | |||
1025 | 1024 | ||
1026 | foo_switch() | 1025 | foo_switch() |
1027 | { | 1026 | { |
1028 | struct pinmux pmx; | 1027 | struct pinmux *pmx; |
1029 | 1028 | ||
1030 | /* Enable on position A */ | 1029 | /* Enable on position A */ |
1031 | pmx = pinmux_get(&device, "spi0-pos-A"); | 1030 | pmx = pinmux_get(&device, "spi0-pos-A"); |
diff --git a/Documentation/power/basic-pm-debugging.txt b/Documentation/power/basic-pm-debugging.txt index 40a4c65f380a..262acf56fa79 100644 --- a/Documentation/power/basic-pm-debugging.txt +++ b/Documentation/power/basic-pm-debugging.txt | |||
@@ -15,7 +15,7 @@ test at least a couple of times in a row for confidence. [This is necessary, | |||
15 | because some problems only show up on a second attempt at suspending and | 15 | because some problems only show up on a second attempt at suspending and |
16 | resuming the system.] Moreover, hibernating in the "reboot" and "shutdown" | 16 | resuming the system.] Moreover, hibernating in the "reboot" and "shutdown" |
17 | modes causes the PM core to skip some platform-related callbacks which on ACPI | 17 | modes causes the PM core to skip some platform-related callbacks which on ACPI |
18 | systems might be necessary to make hibernation work. Thus, if you machine fails | 18 | systems might be necessary to make hibernation work. Thus, if your machine fails |
19 | to hibernate or resume in the "reboot" mode, you should try the "platform" mode: | 19 | to hibernate or resume in the "reboot" mode, you should try the "platform" mode: |
20 | 20 | ||
21 | # echo platform > /sys/power/disk | 21 | # echo platform > /sys/power/disk |
diff --git a/Documentation/power/freezing-of-tasks.txt b/Documentation/power/freezing-of-tasks.txt index 6ccb68f68da6..ebd7490ef1df 100644 --- a/Documentation/power/freezing-of-tasks.txt +++ b/Documentation/power/freezing-of-tasks.txt | |||
@@ -120,10 +120,10 @@ So in practice, the 'at all' may become a 'why freeze kernel threads?' and | |||
120 | freezing user threads I don't find really objectionable." | 120 | freezing user threads I don't find really objectionable." |
121 | 121 | ||
122 | Still, there are kernel threads that may want to be freezable. For example, if | 122 | Still, there are kernel threads that may want to be freezable. For example, if |
123 | a kernel that belongs to a device driver accesses the device directly, it in | 123 | a kernel thread that belongs to a device driver accesses the device directly, it |
124 | principle needs to know when the device is suspended, so that it doesn't try to | 124 | in principle needs to know when the device is suspended, so that it doesn't try |
125 | access it at that time. However, if the kernel thread is freezable, it will be | 125 | to access it at that time. However, if the kernel thread is freezable, it will |
126 | frozen before the driver's .suspend() callback is executed and it will be | 126 | be frozen before the driver's .suspend() callback is executed and it will be |
127 | thawed after the driver's .resume() callback has run, so it won't be accessing | 127 | thawed after the driver's .resume() callback has run, so it won't be accessing |
128 | the device while it's suspended. | 128 | the device while it's suspended. |
129 | 129 | ||
diff --git a/Documentation/stable_kernel_rules.txt b/Documentation/stable_kernel_rules.txt index 21fd05c28e73..f0ab5cf28fca 100644 --- a/Documentation/stable_kernel_rules.txt +++ b/Documentation/stable_kernel_rules.txt | |||
@@ -25,7 +25,8 @@ Procedure for submitting patches to the -stable tree: | |||
25 | 25 | ||
26 | - Send the patch, after verifying that it follows the above rules, to | 26 | - Send the patch, after verifying that it follows the above rules, to |
27 | stable@vger.kernel.org. You must note the upstream commit ID in the | 27 | stable@vger.kernel.org. You must note the upstream commit ID in the |
28 | changelog of your submission. | 28 | changelog of your submission, as well as the kernel version you wish |
29 | it to be applied to. | ||
29 | - To have the patch automatically included in the stable tree, add the tag | 30 | - To have the patch automatically included in the stable tree, add the tag |
30 | Cc: stable@vger.kernel.org | 31 | Cc: stable@vger.kernel.org |
31 | in the sign-off area. Once the patch is merged it will be applied to | 32 | in the sign-off area. Once the patch is merged it will be applied to |
diff --git a/Documentation/thermal/sysfs-api.txt b/Documentation/thermal/sysfs-api.txt index b61e46f449aa..1733ab947a95 100644 --- a/Documentation/thermal/sysfs-api.txt +++ b/Documentation/thermal/sysfs-api.txt | |||
@@ -284,7 +284,7 @@ method, the sys I/F structure will be built like this: | |||
284 | The framework includes a simple notification mechanism, in the form of a | 284 | The framework includes a simple notification mechanism, in the form of a |
285 | netlink event. Netlink socket initialization is done during the _init_ | 285 | netlink event. Netlink socket initialization is done during the _init_ |
286 | of the framework. Drivers which intend to use the notification mechanism | 286 | of the framework. Drivers which intend to use the notification mechanism |
287 | just need to call generate_netlink_event() with two arguments viz | 287 | just need to call thermal_generate_netlink_event() with two arguments viz |
288 | (originator, event). Typically the originator will be an integer assigned | 288 | (originator, event). Typically the originator will be an integer assigned |
289 | to a thermal_zone_device when it registers itself with the framework. The | 289 | to a thermal_zone_device when it registers itself with the framework. The |
290 | event will be one of:{THERMAL_AUX0, THERMAL_AUX1, THERMAL_CRITICAL, | 290 | event will be one of:{THERMAL_AUX0, THERMAL_AUX1, THERMAL_CRITICAL, |
diff --git a/Documentation/virtual/00-INDEX b/Documentation/virtual/00-INDEX index 8e601991d91c..924bd462675e 100644 --- a/Documentation/virtual/00-INDEX +++ b/Documentation/virtual/00-INDEX | |||
@@ -4,8 +4,6 @@ Virtualization support in the Linux kernel. | |||
4 | - this file. | 4 | - this file. |
5 | kvm/ | 5 | kvm/ |
6 | - Kernel Virtual Machine. See also http://linux-kvm.org | 6 | - Kernel Virtual Machine. See also http://linux-kvm.org |
7 | lguest/ | ||
8 | - Extremely simple hypervisor for experimental/educational use. | ||
9 | uml/ | 7 | uml/ |
10 | - User Mode Linux, builds/runs Linux kernel as a userspace program. | 8 | - User Mode Linux, builds/runs Linux kernel as a userspace program. |
11 | virtio.txt | 9 | virtio.txt |
diff --git a/MAINTAINERS b/MAINTAINERS index 89b70df91f4f..a1fce9a3ab20 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -2246,6 +2246,17 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/teigland/dlm.git | |||
2246 | S: Supported | 2246 | S: Supported |
2247 | F: fs/dlm/ | 2247 | F: fs/dlm/ |
2248 | 2248 | ||
2249 | DMA BUFFER SHARING FRAMEWORK | ||
2250 | M: Sumit Semwal <sumit.semwal@linaro.org> | ||
2251 | S: Maintained | ||
2252 | L: linux-media@vger.kernel.org | ||
2253 | L: dri-devel@lists.freedesktop.org | ||
2254 | L: linaro-mm-sig@lists.linaro.org | ||
2255 | F: drivers/base/dma-buf* | ||
2256 | F: include/linux/dma-buf* | ||
2257 | F: Documentation/dma-buf-sharing.txt | ||
2258 | T: git git://git.linaro.org/people/sumitsemwal/linux-dma-buf.git | ||
2259 | |||
2249 | DMA GENERIC OFFLOAD ENGINE SUBSYSTEM | 2260 | DMA GENERIC OFFLOAD ENGINE SUBSYSTEM |
2250 | M: Vinod Koul <vinod.koul@intel.com> | 2261 | M: Vinod Koul <vinod.koul@intel.com> |
2251 | M: Dan Williams <dan.j.williams@intel.com> | 2262 | M: Dan Williams <dan.j.williams@intel.com> |
@@ -2339,6 +2350,9 @@ F: include/drm/i915* | |||
2339 | 2350 | ||
2340 | DRM DRIVERS FOR EXYNOS | 2351 | DRM DRIVERS FOR EXYNOS |
2341 | M: Inki Dae <inki.dae@samsung.com> | 2352 | M: Inki Dae <inki.dae@samsung.com> |
2353 | M: Joonyoung Shim <jy0922.shim@samsung.com> | ||
2354 | M: Seung-Woo Kim <sw0312.kim@samsung.com> | ||
2355 | M: Kyungmin Park <kyungmin.park@samsung.com> | ||
2342 | L: dri-devel@lists.freedesktop.org | 2356 | L: dri-devel@lists.freedesktop.org |
2343 | S: Supported | 2357 | S: Supported |
2344 | F: drivers/gpu/drm/exynos | 2358 | F: drivers/gpu/drm/exynos |
@@ -2391,7 +2405,7 @@ F: net/bridge/netfilter/ebt*.c | |||
2391 | 2405 | ||
2392 | ECRYPT FILE SYSTEM | 2406 | ECRYPT FILE SYSTEM |
2393 | M: Tyler Hicks <tyhicks@canonical.com> | 2407 | M: Tyler Hicks <tyhicks@canonical.com> |
2394 | M: Dustin Kirkland <kirkland@canonical.com> | 2408 | M: Dustin Kirkland <dustin.kirkland@gazzang.com> |
2395 | L: ecryptfs@vger.kernel.org | 2409 | L: ecryptfs@vger.kernel.org |
2396 | W: https://launchpad.net/ecryptfs | 2410 | W: https://launchpad.net/ecryptfs |
2397 | S: Supported | 2411 | S: Supported |
@@ -4126,6 +4140,7 @@ F: fs/partitions/ldm.* | |||
4126 | 4140 | ||
4127 | LogFS | 4141 | LogFS |
4128 | M: Joern Engel <joern@logfs.org> | 4142 | M: Joern Engel <joern@logfs.org> |
4143 | M: Prasad Joshi <prasadjoshi.linux@gmail.com> | ||
4129 | L: logfs@logfs.org | 4144 | L: logfs@logfs.org |
4130 | W: logfs.org | 4145 | W: logfs.org |
4131 | S: Maintained | 4146 | S: Maintained |
@@ -4267,13 +4282,6 @@ S: Orphan | |||
4267 | F: drivers/video/matrox/matroxfb_* | 4282 | F: drivers/video/matrox/matroxfb_* |
4268 | F: include/linux/matroxfb.h | 4283 | F: include/linux/matroxfb.h |
4269 | 4284 | ||
4270 | MAX1668 TEMPERATURE SENSOR DRIVER | ||
4271 | M: "David George" <david.george@ska.ac.za> | ||
4272 | L: lm-sensors@lm-sensors.org | ||
4273 | S: Maintained | ||
4274 | F: Documentation/hwmon/max1668 | ||
4275 | F: drivers/hwmon/max1668.c | ||
4276 | |||
4277 | MAX6650 HARDWARE MONITOR AND FAN CONTROLLER DRIVER | 4285 | MAX6650 HARDWARE MONITOR AND FAN CONTROLLER DRIVER |
4278 | M: "Hans J. Koch" <hjk@hansjkoch.de> | 4286 | M: "Hans J. Koch" <hjk@hansjkoch.de> |
4279 | L: lm-sensors@lm-sensors.org | 4287 | L: lm-sensors@lm-sensors.org |
@@ -6664,7 +6672,7 @@ TTY LAYER | |||
6664 | M: Greg Kroah-Hartman <gregkh@suse.de> | 6672 | M: Greg Kroah-Hartman <gregkh@suse.de> |
6665 | S: Maintained | 6673 | S: Maintained |
6666 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty-2.6.git | 6674 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty-2.6.git |
6667 | F: drivers/tty/* | 6675 | F: drivers/tty/ |
6668 | F: drivers/tty/serial/serial_core.c | 6676 | F: drivers/tty/serial/serial_core.c |
6669 | F: include/linux/serial_core.h | 6677 | F: include/linux/serial_core.h |
6670 | F: include/linux/serial.h | 6678 | F: include/linux/serial.h |
@@ -7357,6 +7365,7 @@ S: Supported | |||
7357 | F: Documentation/hwmon/wm83?? | 7365 | F: Documentation/hwmon/wm83?? |
7358 | F: arch/arm/mach-s3c64xx/mach-crag6410* | 7366 | F: arch/arm/mach-s3c64xx/mach-crag6410* |
7359 | F: drivers/leds/leds-wm83*.c | 7367 | F: drivers/leds/leds-wm83*.c |
7368 | F: drivers/hwmon/wm83??-hwmon.c | ||
7360 | F: drivers/input/misc/wm831x-on.c | 7369 | F: drivers/input/misc/wm831x-on.c |
7361 | F: drivers/input/touchscreen/wm831x-ts.c | 7370 | F: drivers/input/touchscreen/wm831x-ts.c |
7362 | F: drivers/input/touchscreen/wm97*.c | 7371 | F: drivers/input/touchscreen/wm97*.c |
@@ -1,7 +1,7 @@ | |||
1 | VERSION = 3 | 1 | VERSION = 3 |
2 | PATCHLEVEL = 3 | 2 | PATCHLEVEL = 3 |
3 | SUBLEVEL = 0 | 3 | SUBLEVEL = 0 |
4 | EXTRAVERSION = -rc1 | 4 | EXTRAVERSION = -rc2 |
5 | NAME = Saber-toothed Squirrel | 5 | NAME = Saber-toothed Squirrel |
6 | 6 | ||
7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 24626b0419ee..a48aecc17eac 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -754,7 +754,7 @@ config ARCH_SA1100 | |||
754 | select ARCH_HAS_CPUFREQ | 754 | select ARCH_HAS_CPUFREQ |
755 | select CPU_FREQ | 755 | select CPU_FREQ |
756 | select GENERIC_CLOCKEVENTS | 756 | select GENERIC_CLOCKEVENTS |
757 | select CLKDEV_LOOKUP | 757 | select HAVE_CLK |
758 | select HAVE_SCHED_CLOCK | 758 | select HAVE_SCHED_CLOCK |
759 | select TICK_ONESHOT | 759 | select TICK_ONESHOT |
760 | select ARCH_REQUIRE_GPIOLIB | 760 | select ARCH_REQUIRE_GPIOLIB |
@@ -825,7 +825,6 @@ config ARCH_S5PC100 | |||
825 | select HAVE_CLK | 825 | select HAVE_CLK |
826 | select CLKDEV_LOOKUP | 826 | select CLKDEV_LOOKUP |
827 | select CPU_V7 | 827 | select CPU_V7 |
828 | select ARM_L1_CACHE_SHIFT_6 | ||
829 | select ARCH_USES_GETTIMEOFFSET | 828 | select ARCH_USES_GETTIMEOFFSET |
830 | select HAVE_S3C2410_I2C if I2C | 829 | select HAVE_S3C2410_I2C if I2C |
831 | select HAVE_S3C_RTC if RTC_CLASS | 830 | select HAVE_S3C_RTC if RTC_CLASS |
@@ -842,7 +841,6 @@ config ARCH_S5PV210 | |||
842 | select HAVE_CLK | 841 | select HAVE_CLK |
843 | select CLKDEV_LOOKUP | 842 | select CLKDEV_LOOKUP |
844 | select CLKSRC_MMIO | 843 | select CLKSRC_MMIO |
845 | select ARM_L1_CACHE_SHIFT_6 | ||
846 | select ARCH_HAS_CPUFREQ | 844 | select ARCH_HAS_CPUFREQ |
847 | select GENERIC_CLOCKEVENTS | 845 | select GENERIC_CLOCKEVENTS |
848 | select HAVE_SCHED_CLOCK | 846 | select HAVE_SCHED_CLOCK |
diff --git a/arch/arm/Makefile b/arch/arm/Makefile index 40319d91bb7f..1683bfb9166f 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile | |||
@@ -160,7 +160,6 @@ machine-$(CONFIG_ARCH_MSM) := msm | |||
160 | machine-$(CONFIG_ARCH_MV78XX0) := mv78xx0 | 160 | machine-$(CONFIG_ARCH_MV78XX0) := mv78xx0 |
161 | machine-$(CONFIG_ARCH_IMX_V4_V5) := imx | 161 | machine-$(CONFIG_ARCH_IMX_V4_V5) := imx |
162 | machine-$(CONFIG_ARCH_IMX_V6_V7) := imx | 162 | machine-$(CONFIG_ARCH_IMX_V6_V7) := imx |
163 | machine-$(CONFIG_ARCH_MX5) := mx5 | ||
164 | machine-$(CONFIG_ARCH_MXS) := mxs | 163 | machine-$(CONFIG_ARCH_MXS) := mxs |
165 | machine-$(CONFIG_ARCH_NETX) := netx | 164 | machine-$(CONFIG_ARCH_NETX) := netx |
166 | machine-$(CONFIG_ARCH_NOMADIK) := nomadik | 165 | machine-$(CONFIG_ARCH_NOMADIK) := nomadik |
diff --git a/arch/arm/common/gic.c b/arch/arm/common/gic.c index b2dc2dd7f1df..c47d6199b784 100644 --- a/arch/arm/common/gic.c +++ b/arch/arm/common/gic.c | |||
@@ -41,6 +41,7 @@ | |||
41 | 41 | ||
42 | #include <asm/irq.h> | 42 | #include <asm/irq.h> |
43 | #include <asm/exception.h> | 43 | #include <asm/exception.h> |
44 | #include <asm/smp_plat.h> | ||
44 | #include <asm/mach/irq.h> | 45 | #include <asm/mach/irq.h> |
45 | #include <asm/hardware/gic.h> | 46 | #include <asm/hardware/gic.h> |
46 | 47 | ||
@@ -352,11 +353,7 @@ static void __init gic_dist_init(struct gic_chip_data *gic) | |||
352 | unsigned int gic_irqs = gic->gic_irqs; | 353 | unsigned int gic_irqs = gic->gic_irqs; |
353 | struct irq_domain *domain = &gic->domain; | 354 | struct irq_domain *domain = &gic->domain; |
354 | void __iomem *base = gic_data_dist_base(gic); | 355 | void __iomem *base = gic_data_dist_base(gic); |
355 | u32 cpu = 0; | 356 | u32 cpu = cpu_logical_map(smp_processor_id()); |
356 | |||
357 | #ifdef CONFIG_SMP | ||
358 | cpu = cpu_logical_map(smp_processor_id()); | ||
359 | #endif | ||
360 | 357 | ||
361 | cpumask = 1 << cpu; | 358 | cpumask = 1 << cpu; |
362 | cpumask |= cpumask << 8; | 359 | cpumask |= cpumask << 8; |
diff --git a/arch/arm/configs/mx5_defconfig b/arch/arm/configs/imx_v6_v7_defconfig index d0d8dfece37e..3a4fb2e5fc68 100644 --- a/arch/arm/configs/mx5_defconfig +++ b/arch/arm/configs/imx_v6_v7_defconfig | |||
@@ -3,6 +3,7 @@ CONFIG_EXPERIMENTAL=y | |||
3 | CONFIG_KERNEL_LZO=y | 3 | CONFIG_KERNEL_LZO=y |
4 | CONFIG_SYSVIPC=y | 4 | CONFIG_SYSVIPC=y |
5 | CONFIG_LOG_BUF_SHIFT=18 | 5 | CONFIG_LOG_BUF_SHIFT=18 |
6 | CONFIG_CGROUPS=y | ||
6 | CONFIG_RELAY=y | 7 | CONFIG_RELAY=y |
7 | CONFIG_EXPERT=y | 8 | CONFIG_EXPERT=y |
8 | # CONFIG_SLUB_DEBUG is not set | 9 | # CONFIG_SLUB_DEBUG is not set |
@@ -14,20 +15,31 @@ CONFIG_MODULE_SRCVERSION_ALL=y | |||
14 | # CONFIG_LBDAF is not set | 15 | # CONFIG_LBDAF is not set |
15 | # CONFIG_BLK_DEV_BSG is not set | 16 | # CONFIG_BLK_DEV_BSG is not set |
16 | CONFIG_ARCH_MXC=y | 17 | CONFIG_ARCH_MXC=y |
17 | CONFIG_ARCH_MX5=y | 18 | CONFIG_MACH_MX31LILLY=y |
18 | CONFIG_MACH_MX51_BABBAGE=y | 19 | CONFIG_MACH_MX31LITE=y |
20 | CONFIG_MACH_PCM037=y | ||
21 | CONFIG_MACH_PCM037_EET=y | ||
22 | CONFIG_MACH_MX31_3DS=y | ||
23 | CONFIG_MACH_MX31MOBOARD=y | ||
24 | CONFIG_MACH_QONG=y | ||
25 | CONFIG_MACH_ARMADILLO5X0=y | ||
26 | CONFIG_MACH_KZM_ARM11_01=y | ||
27 | CONFIG_MACH_PCM043=y | ||
28 | CONFIG_MACH_MX35_3DS=y | ||
29 | CONFIG_MACH_EUKREA_CPUIMX35=y | ||
30 | CONFIG_MACH_VPR200=y | ||
31 | CONFIG_MACH_IMX51_DT=y | ||
19 | CONFIG_MACH_MX51_3DS=y | 32 | CONFIG_MACH_MX51_3DS=y |
20 | CONFIG_MACH_EUKREA_CPUIMX51=y | 33 | CONFIG_MACH_EUKREA_CPUIMX51=y |
21 | CONFIG_MACH_EUKREA_CPUIMX51SD=y | 34 | CONFIG_MACH_EUKREA_CPUIMX51SD=y |
22 | CONFIG_MACH_MX51_EFIKAMX=y | 35 | CONFIG_MACH_MX51_EFIKAMX=y |
23 | CONFIG_MACH_MX51_EFIKASB=y | 36 | CONFIG_MACH_MX51_EFIKASB=y |
24 | CONFIG_MACH_MX53_EVK=y | 37 | CONFIG_MACH_IMX53_DT=y |
25 | CONFIG_MACH_MX53_SMD=y | 38 | CONFIG_SOC_IMX6Q=y |
26 | CONFIG_MACH_MX53_LOCO=y | ||
27 | CONFIG_MACH_MX53_ARD=y | ||
28 | CONFIG_MXC_PWM=y | 39 | CONFIG_MXC_PWM=y |
29 | CONFIG_NO_HZ=y | 40 | CONFIG_NO_HZ=y |
30 | CONFIG_HIGH_RES_TIMERS=y | 41 | CONFIG_HIGH_RES_TIMERS=y |
42 | CONFIG_SMP=y | ||
31 | CONFIG_VMSPLIT_2G=y | 43 | CONFIG_VMSPLIT_2G=y |
32 | CONFIG_PREEMPT_VOLUNTARY=y | 44 | CONFIG_PREEMPT_VOLUNTARY=y |
33 | CONFIG_AEABI=y | 45 | CONFIG_AEABI=y |
@@ -49,7 +61,7 @@ CONFIG_IP_PNP_DHCP=y | |||
49 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set | 61 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set |
50 | # CONFIG_INET_XFRM_MODE_BEET is not set | 62 | # CONFIG_INET_XFRM_MODE_BEET is not set |
51 | # CONFIG_INET_LRO is not set | 63 | # CONFIG_INET_LRO is not set |
52 | # CONFIG_IPV6 is not set | 64 | CONFIG_IPV6=y |
53 | # CONFIG_WIRELESS is not set | 65 | # CONFIG_WIRELESS is not set |
54 | CONFIG_DEVTMPFS=y | 66 | CONFIG_DEVTMPFS=y |
55 | CONFIG_DEVTMPFS_MOUNT=y | 67 | CONFIG_DEVTMPFS_MOUNT=y |
@@ -68,24 +80,20 @@ CONFIG_SCSI_SCAN_ASYNC=y | |||
68 | CONFIG_ATA=y | 80 | CONFIG_ATA=y |
69 | CONFIG_PATA_IMX=y | 81 | CONFIG_PATA_IMX=y |
70 | CONFIG_NETDEVICES=y | 82 | CONFIG_NETDEVICES=y |
71 | CONFIG_MII=m | 83 | # CONFIG_NET_VENDOR_BROADCOM is not set |
72 | CONFIG_MARVELL_PHY=y | 84 | # CONFIG_NET_VENDOR_CHELSIO is not set |
73 | CONFIG_DAVICOM_PHY=y | 85 | # CONFIG_NET_VENDOR_FARADAY is not set |
74 | CONFIG_QSEMI_PHY=y | 86 | CONFIG_FEC=y |
75 | CONFIG_LXT_PHY=y | 87 | # CONFIG_NET_VENDOR_INTEL is not set |
76 | CONFIG_CICADA_PHY=y | 88 | # CONFIG_NET_VENDOR_MARVELL is not set |
77 | CONFIG_VITESSE_PHY=y | 89 | # CONFIG_NET_VENDOR_MICREL is not set |
78 | CONFIG_SMSC_PHY=y | 90 | # CONFIG_NET_VENDOR_MICROCHIP is not set |
79 | CONFIG_BROADCOM_PHY=y | 91 | # CONFIG_NET_VENDOR_NATSEMI is not set |
80 | CONFIG_ICPLUS_PHY=y | 92 | # CONFIG_NET_VENDOR_SEEQ is not set |
81 | CONFIG_REALTEK_PHY=y | 93 | CONFIG_SMC91X=y |
82 | CONFIG_NATIONAL_PHY=y | 94 | CONFIG_SMC911X=y |
83 | CONFIG_STE10XP=y | 95 | CONFIG_SMSC911X=y |
84 | CONFIG_LSI_ET1011C_PHY=y | 96 | # CONFIG_NET_VENDOR_STMICRO is not set |
85 | CONFIG_MICREL_PHY=y | ||
86 | CONFIG_NET_ETHERNET=y | ||
87 | # CONFIG_NETDEV_1000 is not set | ||
88 | # CONFIG_NETDEV_10000 is not set | ||
89 | # CONFIG_WLAN is not set | 97 | # CONFIG_WLAN is not set |
90 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set | 98 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set |
91 | CONFIG_INPUT_EVDEV=y | 99 | CONFIG_INPUT_EVDEV=y |
@@ -124,7 +132,6 @@ CONFIG_USB_EHCI_HCD=y | |||
124 | CONFIG_USB_EHCI_MXC=y | 132 | CONFIG_USB_EHCI_MXC=y |
125 | CONFIG_USB_STORAGE=y | 133 | CONFIG_USB_STORAGE=y |
126 | CONFIG_MMC=y | 134 | CONFIG_MMC=y |
127 | CONFIG_MMC_BLOCK=m | ||
128 | CONFIG_MMC_SDHCI=y | 135 | CONFIG_MMC_SDHCI=y |
129 | CONFIG_MMC_SDHCI_PLTFM=y | 136 | CONFIG_MMC_SDHCI_PLTFM=y |
130 | CONFIG_MMC_SDHCI_ESDHC_IMX=y | 137 | CONFIG_MMC_SDHCI_ESDHC_IMX=y |
@@ -133,6 +140,8 @@ CONFIG_LEDS_CLASS=y | |||
133 | CONFIG_RTC_CLASS=y | 140 | CONFIG_RTC_CLASS=y |
134 | CONFIG_RTC_INTF_DEV_UIE_EMUL=y | 141 | CONFIG_RTC_INTF_DEV_UIE_EMUL=y |
135 | CONFIG_RTC_MXC=y | 142 | CONFIG_RTC_MXC=y |
143 | CONFIG_DMADEVICES=y | ||
144 | CONFIG_IMX_SDMA=y | ||
136 | CONFIG_EXT2_FS=y | 145 | CONFIG_EXT2_FS=y |
137 | CONFIG_EXT2_FS_XATTR=y | 146 | CONFIG_EXT2_FS_XATTR=y |
138 | CONFIG_EXT2_FS_POSIX_ACL=y | 147 | CONFIG_EXT2_FS_POSIX_ACL=y |
diff --git a/arch/arm/configs/mx3_defconfig b/arch/arm/configs/mx3_defconfig deleted file mode 100644 index cb0717fbb03d..000000000000 --- a/arch/arm/configs/mx3_defconfig +++ /dev/null | |||
@@ -1,144 +0,0 @@ | |||
1 | CONFIG_EXPERIMENTAL=y | ||
2 | CONFIG_SYSVIPC=y | ||
3 | CONFIG_IKCONFIG=y | ||
4 | CONFIG_IKCONFIG_PROC=y | ||
5 | CONFIG_LOG_BUF_SHIFT=14 | ||
6 | CONFIG_EXPERT=y | ||
7 | CONFIG_SLAB=y | ||
8 | CONFIG_MODULES=y | ||
9 | CONFIG_MODULE_UNLOAD=y | ||
10 | CONFIG_MODULE_FORCE_UNLOAD=y | ||
11 | CONFIG_MODVERSIONS=y | ||
12 | # CONFIG_BLK_DEV_BSG is not set | ||
13 | CONFIG_ARCH_MXC=y | ||
14 | CONFIG_MACH_MX31ADS_WM1133_EV1=y | ||
15 | CONFIG_MACH_MX31LILLY=y | ||
16 | CONFIG_MACH_MX31LITE=y | ||
17 | CONFIG_MACH_PCM037=y | ||
18 | CONFIG_MACH_PCM037_EET=y | ||
19 | CONFIG_MACH_MX31_3DS=y | ||
20 | CONFIG_MACH_MX31MOBOARD=y | ||
21 | CONFIG_MACH_QONG=y | ||
22 | CONFIG_MACH_ARMADILLO5X0=y | ||
23 | CONFIG_MACH_KZM_ARM11_01=y | ||
24 | CONFIG_MACH_PCM043=y | ||
25 | CONFIG_MACH_MX35_3DS=y | ||
26 | CONFIG_MACH_EUKREA_CPUIMX35=y | ||
27 | CONFIG_MXC_IRQ_PRIOR=y | ||
28 | CONFIG_MXC_PWM=y | ||
29 | CONFIG_ARM_ERRATA_411920=y | ||
30 | CONFIG_NO_HZ=y | ||
31 | CONFIG_HIGH_RES_TIMERS=y | ||
32 | CONFIG_PREEMPT=y | ||
33 | CONFIG_AEABI=y | ||
34 | CONFIG_ZBOOT_ROM_TEXT=0x0 | ||
35 | CONFIG_ZBOOT_ROM_BSS=0x0 | ||
36 | CONFIG_CMDLINE="noinitrd console=ttymxc0,115200 root=/dev/mtdblock2 rw ip=off" | ||
37 | CONFIG_VFP=y | ||
38 | CONFIG_PM_DEBUG=y | ||
39 | CONFIG_NET=y | ||
40 | CONFIG_PACKET=y | ||
41 | CONFIG_UNIX=y | ||
42 | CONFIG_INET=y | ||
43 | CONFIG_IP_PNP=y | ||
44 | CONFIG_IP_PNP_DHCP=y | ||
45 | # CONFIG_INET_XFRM_MODE_TRANSPORT is not set | ||
46 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set | ||
47 | # CONFIG_INET_XFRM_MODE_BEET is not set | ||
48 | # CONFIG_INET_LRO is not set | ||
49 | # CONFIG_INET_DIAG is not set | ||
50 | # CONFIG_IPV6 is not set | ||
51 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
52 | CONFIG_FW_LOADER=m | ||
53 | CONFIG_MTD=y | ||
54 | CONFIG_MTD_CMDLINE_PARTS=y | ||
55 | CONFIG_MTD_CHAR=y | ||
56 | CONFIG_MTD_BLOCK=y | ||
57 | CONFIG_MTD_CFI=y | ||
58 | CONFIG_MTD_PHYSMAP=y | ||
59 | CONFIG_MTD_NAND=y | ||
60 | CONFIG_MTD_NAND_MXC=y | ||
61 | CONFIG_MTD_UBI=y | ||
62 | # CONFIG_BLK_DEV is not set | ||
63 | CONFIG_MISC_DEVICES=y | ||
64 | CONFIG_EEPROM_AT24=y | ||
65 | CONFIG_NETDEVICES=y | ||
66 | CONFIG_SMSC_PHY=y | ||
67 | CONFIG_NET_ETHERNET=y | ||
68 | CONFIG_SMSC911X=y | ||
69 | CONFIG_DNET=y | ||
70 | # CONFIG_NETDEV_1000 is not set | ||
71 | # CONFIG_NETDEV_10000 is not set | ||
72 | # CONFIG_INPUT_MOUSEDEV is not set | ||
73 | # CONFIG_KEYBOARD_ATKBD is not set | ||
74 | CONFIG_KEYBOARD_IMX=y | ||
75 | # CONFIG_INPUT_MOUSE is not set | ||
76 | # CONFIG_SERIO is not set | ||
77 | # CONFIG_VT is not set | ||
78 | # CONFIG_LEGACY_PTYS is not set | ||
79 | CONFIG_SERIAL_8250=m | ||
80 | CONFIG_SERIAL_8250_EXTENDED=y | ||
81 | CONFIG_SERIAL_8250_SHARE_IRQ=y | ||
82 | CONFIG_SERIAL_IMX=y | ||
83 | CONFIG_SERIAL_IMX_CONSOLE=y | ||
84 | # CONFIG_HW_RANDOM is not set | ||
85 | CONFIG_I2C=y | ||
86 | CONFIG_I2C_CHARDEV=y | ||
87 | CONFIG_I2C_IMX=y | ||
88 | CONFIG_SPI=y | ||
89 | CONFIG_W1=y | ||
90 | CONFIG_W1_MASTER_MXC=y | ||
91 | CONFIG_W1_SLAVE_THERM=y | ||
92 | # CONFIG_HWMON is not set | ||
93 | CONFIG_WATCHDOG=y | ||
94 | CONFIG_IMX2_WDT=y | ||
95 | CONFIG_MFD_WM8350_I2C=y | ||
96 | CONFIG_REGULATOR=y | ||
97 | CONFIG_REGULATOR_WM8350=y | ||
98 | CONFIG_MEDIA_SUPPORT=y | ||
99 | CONFIG_VIDEO_DEV=y | ||
100 | # CONFIG_RC_CORE is not set | ||
101 | # CONFIG_MEDIA_TUNER_CUSTOMISE is not set | ||
102 | CONFIG_SOC_CAMERA=y | ||
103 | CONFIG_SOC_CAMERA_MT9M001=y | ||
104 | CONFIG_SOC_CAMERA_MT9M111=y | ||
105 | CONFIG_SOC_CAMERA_MT9T031=y | ||
106 | CONFIG_SOC_CAMERA_MT9V022=y | ||
107 | CONFIG_SOC_CAMERA_TW9910=y | ||
108 | CONFIG_SOC_CAMERA_OV772X=y | ||
109 | CONFIG_VIDEO_MX3=y | ||
110 | # CONFIG_RADIO_ADAPTERS is not set | ||
111 | CONFIG_FB=y | ||
112 | CONFIG_SOUND=y | ||
113 | CONFIG_SND=y | ||
114 | # CONFIG_SND_ARM is not set | ||
115 | # CONFIG_SND_SPI is not set | ||
116 | CONFIG_SND_SOC=y | ||
117 | CONFIG_SND_IMX_SOC=y | ||
118 | CONFIG_SND_MXC_SOC_WM1133_EV1=y | ||
119 | CONFIG_SND_SOC_PHYCORE_AC97=y | ||
120 | CONFIG_SND_SOC_EUKREA_TLV320=y | ||
121 | CONFIG_USB=y | ||
122 | CONFIG_USB_EHCI_HCD=y | ||
123 | CONFIG_USB_EHCI_MXC=y | ||
124 | CONFIG_USB_GADGET=m | ||
125 | CONFIG_USB_FSL_USB2=m | ||
126 | CONFIG_USB_G_SERIAL=m | ||
127 | CONFIG_USB_ULPI=y | ||
128 | CONFIG_MMC=y | ||
129 | CONFIG_MMC_MXC=y | ||
130 | CONFIG_RTC_CLASS=y | ||
131 | CONFIG_RTC_MXC=y | ||
132 | CONFIG_DMADEVICES=y | ||
133 | # CONFIG_DNOTIFY is not set | ||
134 | CONFIG_TMPFS=y | ||
135 | CONFIG_JFFS2_FS=y | ||
136 | CONFIG_UBIFS_FS=y | ||
137 | CONFIG_NFS_FS=y | ||
138 | CONFIG_NFS_V3=y | ||
139 | CONFIG_NFS_V4=y | ||
140 | CONFIG_ROOT_NFS=y | ||
141 | # CONFIG_ENABLE_WARN_DEPRECATED is not set | ||
142 | # CONFIG_ENABLE_MUST_CHECK is not set | ||
143 | CONFIG_SYSCTL_SYSCALL_CHECK=y | ||
144 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | ||
diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h index b6e65dedfd71..62f8095d46de 100644 --- a/arch/arm/include/asm/assembler.h +++ b/arch/arm/include/asm/assembler.h | |||
@@ -237,7 +237,7 @@ | |||
237 | */ | 237 | */ |
238 | #ifdef CONFIG_THUMB2_KERNEL | 238 | #ifdef CONFIG_THUMB2_KERNEL |
239 | 239 | ||
240 | .macro usraccoff, instr, reg, ptr, inc, off, cond, abort, t=T() | 240 | .macro usraccoff, instr, reg, ptr, inc, off, cond, abort, t=TUSER() |
241 | 9999: | 241 | 9999: |
242 | .if \inc == 1 | 242 | .if \inc == 1 |
243 | \instr\cond\()b\()\t\().w \reg, [\ptr, #\off] | 243 | \instr\cond\()b\()\t\().w \reg, [\ptr, #\off] |
@@ -277,7 +277,7 @@ | |||
277 | 277 | ||
278 | #else /* !CONFIG_THUMB2_KERNEL */ | 278 | #else /* !CONFIG_THUMB2_KERNEL */ |
279 | 279 | ||
280 | .macro usracc, instr, reg, ptr, inc, cond, rept, abort, t=T() | 280 | .macro usracc, instr, reg, ptr, inc, cond, rept, abort, t=TUSER() |
281 | .rept \rept | 281 | .rept \rept |
282 | 9999: | 282 | 9999: |
283 | .if \inc == 1 | 283 | .if \inc == 1 |
diff --git a/arch/arm/include/asm/domain.h b/arch/arm/include/asm/domain.h index af18ceaacf5d..b5dc173d336f 100644 --- a/arch/arm/include/asm/domain.h +++ b/arch/arm/include/asm/domain.h | |||
@@ -83,9 +83,9 @@ | |||
83 | * instructions (inline assembly) | 83 | * instructions (inline assembly) |
84 | */ | 84 | */ |
85 | #ifdef CONFIG_CPU_USE_DOMAINS | 85 | #ifdef CONFIG_CPU_USE_DOMAINS |
86 | #define T(instr) #instr "t" | 86 | #define TUSER(instr) #instr "t" |
87 | #else | 87 | #else |
88 | #define T(instr) #instr | 88 | #define TUSER(instr) #instr |
89 | #endif | 89 | #endif |
90 | 90 | ||
91 | #else /* __ASSEMBLY__ */ | 91 | #else /* __ASSEMBLY__ */ |
@@ -95,9 +95,9 @@ | |||
95 | * instructions | 95 | * instructions |
96 | */ | 96 | */ |
97 | #ifdef CONFIG_CPU_USE_DOMAINS | 97 | #ifdef CONFIG_CPU_USE_DOMAINS |
98 | #define T(instr) instr ## t | 98 | #define TUSER(instr) instr ## t |
99 | #else | 99 | #else |
100 | #define T(instr) instr | 100 | #define TUSER(instr) instr |
101 | #endif | 101 | #endif |
102 | 102 | ||
103 | #endif /* __ASSEMBLY__ */ | 103 | #endif /* __ASSEMBLY__ */ |
diff --git a/arch/arm/include/asm/futex.h b/arch/arm/include/asm/futex.h index 253cc86318bf..7be54690aeec 100644 --- a/arch/arm/include/asm/futex.h +++ b/arch/arm/include/asm/futex.h | |||
@@ -75,9 +75,9 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, | |||
75 | 75 | ||
76 | #define __futex_atomic_op(insn, ret, oldval, tmp, uaddr, oparg) \ | 76 | #define __futex_atomic_op(insn, ret, oldval, tmp, uaddr, oparg) \ |
77 | __asm__ __volatile__( \ | 77 | __asm__ __volatile__( \ |
78 | "1: " T(ldr) " %1, [%3]\n" \ | 78 | "1: " TUSER(ldr) " %1, [%3]\n" \ |
79 | " " insn "\n" \ | 79 | " " insn "\n" \ |
80 | "2: " T(str) " %0, [%3]\n" \ | 80 | "2: " TUSER(str) " %0, [%3]\n" \ |
81 | " mov %0, #0\n" \ | 81 | " mov %0, #0\n" \ |
82 | __futex_atomic_ex_table("%5") \ | 82 | __futex_atomic_ex_table("%5") \ |
83 | : "=&r" (ret), "=&r" (oldval), "=&r" (tmp) \ | 83 | : "=&r" (ret), "=&r" (oldval), "=&r" (tmp) \ |
@@ -95,10 +95,10 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, | |||
95 | return -EFAULT; | 95 | return -EFAULT; |
96 | 96 | ||
97 | __asm__ __volatile__("@futex_atomic_cmpxchg_inatomic\n" | 97 | __asm__ __volatile__("@futex_atomic_cmpxchg_inatomic\n" |
98 | "1: " T(ldr) " %1, [%4]\n" | 98 | "1: " TUSER(ldr) " %1, [%4]\n" |
99 | " teq %1, %2\n" | 99 | " teq %1, %2\n" |
100 | " it eq @ explicit IT needed for the 2b label\n" | 100 | " it eq @ explicit IT needed for the 2b label\n" |
101 | "2: " T(streq) " %3, [%4]\n" | 101 | "2: " TUSER(streq) " %3, [%4]\n" |
102 | __futex_atomic_ex_table("%5") | 102 | __futex_atomic_ex_table("%5") |
103 | : "+r" (ret), "=&r" (val) | 103 | : "+r" (ret), "=&r" (val) |
104 | : "r" (oldval), "r" (newval), "r" (uaddr), "Ir" (-EFAULT) | 104 | : "r" (oldval), "r" (newval), "r" (uaddr), "Ir" (-EFAULT) |
diff --git a/arch/arm/include/asm/smp.h b/arch/arm/include/asm/smp.h index 1e5717afc4ac..ae29293270a3 100644 --- a/arch/arm/include/asm/smp.h +++ b/arch/arm/include/asm/smp.h | |||
@@ -71,12 +71,6 @@ extern void platform_secondary_init(unsigned int cpu); | |||
71 | extern void platform_smp_prepare_cpus(unsigned int); | 71 | extern void platform_smp_prepare_cpus(unsigned int); |
72 | 72 | ||
73 | /* | 73 | /* |
74 | * Logical CPU mapping. | ||
75 | */ | ||
76 | extern int __cpu_logical_map[NR_CPUS]; | ||
77 | #define cpu_logical_map(cpu) __cpu_logical_map[cpu] | ||
78 | |||
79 | /* | ||
80 | * Initial data for bringing up a secondary CPU. | 74 | * Initial data for bringing up a secondary CPU. |
81 | */ | 75 | */ |
82 | struct secondary_data { | 76 | struct secondary_data { |
diff --git a/arch/arm/include/asm/smp_plat.h b/arch/arm/include/asm/smp_plat.h index f24c1b9e211d..558d6c80aca9 100644 --- a/arch/arm/include/asm/smp_plat.h +++ b/arch/arm/include/asm/smp_plat.h | |||
@@ -43,4 +43,10 @@ static inline int cache_ops_need_broadcast(void) | |||
43 | } | 43 | } |
44 | #endif | 44 | #endif |
45 | 45 | ||
46 | /* | ||
47 | * Logical CPU mapping. | ||
48 | */ | ||
49 | extern int __cpu_logical_map[]; | ||
50 | #define cpu_logical_map(cpu) __cpu_logical_map[cpu] | ||
51 | |||
46 | #endif | 52 | #endif |
diff --git a/arch/arm/include/asm/uaccess.h b/arch/arm/include/asm/uaccess.h index b293616a1a1a..2958976d867b 100644 --- a/arch/arm/include/asm/uaccess.h +++ b/arch/arm/include/asm/uaccess.h | |||
@@ -227,7 +227,7 @@ do { \ | |||
227 | 227 | ||
228 | #define __get_user_asm_byte(x,addr,err) \ | 228 | #define __get_user_asm_byte(x,addr,err) \ |
229 | __asm__ __volatile__( \ | 229 | __asm__ __volatile__( \ |
230 | "1: " T(ldrb) " %1,[%2],#0\n" \ | 230 | "1: " TUSER(ldrb) " %1,[%2],#0\n" \ |
231 | "2:\n" \ | 231 | "2:\n" \ |
232 | " .pushsection .fixup,\"ax\"\n" \ | 232 | " .pushsection .fixup,\"ax\"\n" \ |
233 | " .align 2\n" \ | 233 | " .align 2\n" \ |
@@ -263,7 +263,7 @@ do { \ | |||
263 | 263 | ||
264 | #define __get_user_asm_word(x,addr,err) \ | 264 | #define __get_user_asm_word(x,addr,err) \ |
265 | __asm__ __volatile__( \ | 265 | __asm__ __volatile__( \ |
266 | "1: " T(ldr) " %1,[%2],#0\n" \ | 266 | "1: " TUSER(ldr) " %1,[%2],#0\n" \ |
267 | "2:\n" \ | 267 | "2:\n" \ |
268 | " .pushsection .fixup,\"ax\"\n" \ | 268 | " .pushsection .fixup,\"ax\"\n" \ |
269 | " .align 2\n" \ | 269 | " .align 2\n" \ |
@@ -308,7 +308,7 @@ do { \ | |||
308 | 308 | ||
309 | #define __put_user_asm_byte(x,__pu_addr,err) \ | 309 | #define __put_user_asm_byte(x,__pu_addr,err) \ |
310 | __asm__ __volatile__( \ | 310 | __asm__ __volatile__( \ |
311 | "1: " T(strb) " %1,[%2],#0\n" \ | 311 | "1: " TUSER(strb) " %1,[%2],#0\n" \ |
312 | "2:\n" \ | 312 | "2:\n" \ |
313 | " .pushsection .fixup,\"ax\"\n" \ | 313 | " .pushsection .fixup,\"ax\"\n" \ |
314 | " .align 2\n" \ | 314 | " .align 2\n" \ |
@@ -341,7 +341,7 @@ do { \ | |||
341 | 341 | ||
342 | #define __put_user_asm_word(x,__pu_addr,err) \ | 342 | #define __put_user_asm_word(x,__pu_addr,err) \ |
343 | __asm__ __volatile__( \ | 343 | __asm__ __volatile__( \ |
344 | "1: " T(str) " %1,[%2],#0\n" \ | 344 | "1: " TUSER(str) " %1,[%2],#0\n" \ |
345 | "2:\n" \ | 345 | "2:\n" \ |
346 | " .pushsection .fixup,\"ax\"\n" \ | 346 | " .pushsection .fixup,\"ax\"\n" \ |
347 | " .align 2\n" \ | 347 | " .align 2\n" \ |
@@ -366,10 +366,10 @@ do { \ | |||
366 | 366 | ||
367 | #define __put_user_asm_dword(x,__pu_addr,err) \ | 367 | #define __put_user_asm_dword(x,__pu_addr,err) \ |
368 | __asm__ __volatile__( \ | 368 | __asm__ __volatile__( \ |
369 | ARM( "1: " T(str) " " __reg_oper1 ", [%1], #4\n" ) \ | 369 | ARM( "1: " TUSER(str) " " __reg_oper1 ", [%1], #4\n" ) \ |
370 | ARM( "2: " T(str) " " __reg_oper0 ", [%1]\n" ) \ | 370 | ARM( "2: " TUSER(str) " " __reg_oper0 ", [%1]\n" ) \ |
371 | THUMB( "1: " T(str) " " __reg_oper1 ", [%1]\n" ) \ | 371 | THUMB( "1: " TUSER(str) " " __reg_oper1 ", [%1]\n" ) \ |
372 | THUMB( "2: " T(str) " " __reg_oper0 ", [%1, #4]\n" ) \ | 372 | THUMB( "2: " TUSER(str) " " __reg_oper0 ", [%1, #4]\n" ) \ |
373 | "3:\n" \ | 373 | "3:\n" \ |
374 | " .pushsection .fixup,\"ax\"\n" \ | 374 | " .pushsection .fixup,\"ax\"\n" \ |
375 | " .align 2\n" \ | 375 | " .align 2\n" \ |
diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index 520889cf1b5b..9fd0ba90c1d2 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S | |||
@@ -149,6 +149,11 @@ ENDPROC(ret_from_fork) | |||
149 | #endif | 149 | #endif |
150 | #endif | 150 | #endif |
151 | 151 | ||
152 | .macro mcount_adjust_addr rd, rn | ||
153 | bic \rd, \rn, #1 @ clear the Thumb bit if present | ||
154 | sub \rd, \rd, #MCOUNT_INSN_SIZE | ||
155 | .endm | ||
156 | |||
152 | .macro __mcount suffix | 157 | .macro __mcount suffix |
153 | mcount_enter | 158 | mcount_enter |
154 | ldr r0, =ftrace_trace_function | 159 | ldr r0, =ftrace_trace_function |
@@ -173,8 +178,7 @@ ENDPROC(ret_from_fork) | |||
173 | mcount_exit | 178 | mcount_exit |
174 | 179 | ||
175 | 1: mcount_get_lr r1 @ lr of instrumented func | 180 | 1: mcount_get_lr r1 @ lr of instrumented func |
176 | mov r0, lr @ instrumented function | 181 | mcount_adjust_addr r0, lr @ instrumented function |
177 | sub r0, r0, #MCOUNT_INSN_SIZE | ||
178 | adr lr, BSYM(2f) | 182 | adr lr, BSYM(2f) |
179 | mov pc, r2 | 183 | mov pc, r2 |
180 | 2: mcount_exit | 184 | 2: mcount_exit |
@@ -184,8 +188,7 @@ ENDPROC(ret_from_fork) | |||
184 | mcount_enter | 188 | mcount_enter |
185 | 189 | ||
186 | mcount_get_lr r1 @ lr of instrumented func | 190 | mcount_get_lr r1 @ lr of instrumented func |
187 | mov r0, lr @ instrumented function | 191 | mcount_adjust_addr r0, lr @ instrumented function |
188 | sub r0, r0, #MCOUNT_INSN_SIZE | ||
189 | 192 | ||
190 | .globl ftrace_call\suffix | 193 | .globl ftrace_call\suffix |
191 | ftrace_call\suffix: | 194 | ftrace_call\suffix: |
@@ -205,11 +208,11 @@ ftrace_graph_call\suffix: | |||
205 | #ifdef CONFIG_DYNAMIC_FTRACE | 208 | #ifdef CONFIG_DYNAMIC_FTRACE |
206 | @ called from __ftrace_caller, saved in mcount_enter | 209 | @ called from __ftrace_caller, saved in mcount_enter |
207 | ldr r1, [sp, #16] @ instrumented routine (func) | 210 | ldr r1, [sp, #16] @ instrumented routine (func) |
211 | mcount_adjust_addr r1, r1 | ||
208 | #else | 212 | #else |
209 | @ called from __mcount, untouched in lr | 213 | @ called from __mcount, untouched in lr |
210 | mov r1, lr @ instrumented routine (func) | 214 | mcount_adjust_addr r1, lr @ instrumented routine (func) |
211 | #endif | 215 | #endif |
212 | sub r1, r1, #MCOUNT_INSN_SIZE | ||
213 | mov r2, fp @ frame pointer | 216 | mov r2, fp @ frame pointer |
214 | bl prepare_ftrace_return | 217 | bl prepare_ftrace_return |
215 | mcount_exit | 218 | mcount_exit |
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index 129fbd55bde8..a255c39612ca 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c | |||
@@ -21,7 +21,6 @@ | |||
21 | #include <linux/init.h> | 21 | #include <linux/init.h> |
22 | #include <linux/kexec.h> | 22 | #include <linux/kexec.h> |
23 | #include <linux/of_fdt.h> | 23 | #include <linux/of_fdt.h> |
24 | #include <linux/crash_dump.h> | ||
25 | #include <linux/root_dev.h> | 24 | #include <linux/root_dev.h> |
26 | #include <linux/cpu.h> | 25 | #include <linux/cpu.h> |
27 | #include <linux/interrupt.h> | 26 | #include <linux/interrupt.h> |
@@ -160,7 +159,7 @@ static struct resource mem_res[] = { | |||
160 | .flags = IORESOURCE_MEM | 159 | .flags = IORESOURCE_MEM |
161 | }, | 160 | }, |
162 | { | 161 | { |
163 | .name = "Kernel text", | 162 | .name = "Kernel code", |
164 | .start = 0, | 163 | .start = 0, |
165 | .end = 0, | 164 | .end = 0, |
166 | .flags = IORESOURCE_MEM | 165 | .flags = IORESOURCE_MEM |
@@ -427,6 +426,20 @@ void cpu_init(void) | |||
427 | : "r14"); | 426 | : "r14"); |
428 | } | 427 | } |
429 | 428 | ||
429 | int __cpu_logical_map[NR_CPUS]; | ||
430 | |||
431 | void __init smp_setup_processor_id(void) | ||
432 | { | ||
433 | int i; | ||
434 | u32 cpu = is_smp() ? read_cpuid_mpidr() & 0xff : 0; | ||
435 | |||
436 | cpu_logical_map(0) = cpu; | ||
437 | for (i = 1; i < NR_CPUS; ++i) | ||
438 | cpu_logical_map(i) = i == cpu ? 0 : i; | ||
439 | |||
440 | printk(KERN_INFO "Booting Linux on physical CPU %d\n", cpu); | ||
441 | } | ||
442 | |||
430 | static void __init setup_processor(void) | 443 | static void __init setup_processor(void) |
431 | { | 444 | { |
432 | struct proc_info_list *list; | 445 | struct proc_info_list *list; |
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index 57db122a4f62..cdeb727527d3 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c | |||
@@ -233,20 +233,6 @@ void __ref cpu_die(void) | |||
233 | } | 233 | } |
234 | #endif /* CONFIG_HOTPLUG_CPU */ | 234 | #endif /* CONFIG_HOTPLUG_CPU */ |
235 | 235 | ||
236 | int __cpu_logical_map[NR_CPUS]; | ||
237 | |||
238 | void __init smp_setup_processor_id(void) | ||
239 | { | ||
240 | int i; | ||
241 | u32 cpu = is_smp() ? read_cpuid_mpidr() & 0xff : 0; | ||
242 | |||
243 | cpu_logical_map(0) = cpu; | ||
244 | for (i = 1; i < NR_CPUS; ++i) | ||
245 | cpu_logical_map(i) = i == cpu ? 0 : i; | ||
246 | |||
247 | printk(KERN_INFO "Booting Linux on physical CPU %d\n", cpu); | ||
248 | } | ||
249 | |||
250 | /* | 236 | /* |
251 | * Called by both boot and secondaries to move global data into | 237 | * Called by both boot and secondaries to move global data into |
252 | * per-processor storage. | 238 | * per-processor storage. |
@@ -443,9 +429,7 @@ static DEFINE_PER_CPU(struct clock_event_device, percpu_clockevent); | |||
443 | static void ipi_timer(void) | 429 | static void ipi_timer(void) |
444 | { | 430 | { |
445 | struct clock_event_device *evt = &__get_cpu_var(percpu_clockevent); | 431 | struct clock_event_device *evt = &__get_cpu_var(percpu_clockevent); |
446 | irq_enter(); | ||
447 | evt->event_handler(evt); | 432 | evt->event_handler(evt); |
448 | irq_exit(); | ||
449 | } | 433 | } |
450 | 434 | ||
451 | #ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST | 435 | #ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST |
@@ -548,7 +532,9 @@ void handle_IPI(int ipinr, struct pt_regs *regs) | |||
548 | 532 | ||
549 | switch (ipinr) { | 533 | switch (ipinr) { |
550 | case IPI_TIMER: | 534 | case IPI_TIMER: |
535 | irq_enter(); | ||
551 | ipi_timer(); | 536 | ipi_timer(); |
537 | irq_exit(); | ||
552 | break; | 538 | break; |
553 | 539 | ||
554 | case IPI_RESCHEDULE: | 540 | case IPI_RESCHEDULE: |
@@ -556,15 +542,21 @@ void handle_IPI(int ipinr, struct pt_regs *regs) | |||
556 | break; | 542 | break; |
557 | 543 | ||
558 | case IPI_CALL_FUNC: | 544 | case IPI_CALL_FUNC: |
545 | irq_enter(); | ||
559 | generic_smp_call_function_interrupt(); | 546 | generic_smp_call_function_interrupt(); |
547 | irq_exit(); | ||
560 | break; | 548 | break; |
561 | 549 | ||
562 | case IPI_CALL_FUNC_SINGLE: | 550 | case IPI_CALL_FUNC_SINGLE: |
551 | irq_enter(); | ||
563 | generic_smp_call_function_single_interrupt(); | 552 | generic_smp_call_function_single_interrupt(); |
553 | irq_exit(); | ||
564 | break; | 554 | break; |
565 | 555 | ||
566 | case IPI_CPU_STOP: | 556 | case IPI_CPU_STOP: |
557 | irq_enter(); | ||
567 | ipi_cpu_stop(cpu); | 558 | ipi_cpu_stop(cpu); |
559 | irq_exit(); | ||
568 | break; | 560 | break; |
569 | 561 | ||
570 | default: | 562 | default: |
diff --git a/arch/arm/kernel/smp_twd.c b/arch/arm/kernel/smp_twd.c index c8e938553d47..4285daa077b0 100644 --- a/arch/arm/kernel/smp_twd.c +++ b/arch/arm/kernel/smp_twd.c | |||
@@ -252,6 +252,8 @@ void __cpuinit twd_timer_setup(struct clock_event_device *clk) | |||
252 | else | 252 | else |
253 | twd_calibrate_rate(); | 253 | twd_calibrate_rate(); |
254 | 254 | ||
255 | __raw_writel(0, twd_base + TWD_TIMER_CONTROL); | ||
256 | |||
255 | clk->name = "local_timer"; | 257 | clk->name = "local_timer"; |
256 | clk->features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT | | 258 | clk->features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT | |
257 | CLOCK_EVT_FEAT_C3STOP; | 259 | CLOCK_EVT_FEAT_C3STOP; |
diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S index f76e75548670..1e19691e0406 100644 --- a/arch/arm/kernel/vmlinux.lds.S +++ b/arch/arm/kernel/vmlinux.lds.S | |||
@@ -4,6 +4,7 @@ | |||
4 | */ | 4 | */ |
5 | 5 | ||
6 | #include <asm-generic/vmlinux.lds.h> | 6 | #include <asm-generic/vmlinux.lds.h> |
7 | #include <asm/cache.h> | ||
7 | #include <asm/thread_info.h> | 8 | #include <asm/thread_info.h> |
8 | #include <asm/memory.h> | 9 | #include <asm/memory.h> |
9 | #include <asm/page.h> | 10 | #include <asm/page.h> |
@@ -181,7 +182,7 @@ SECTIONS | |||
181 | } | 182 | } |
182 | #endif | 183 | #endif |
183 | 184 | ||
184 | PERCPU_SECTION(32) | 185 | PERCPU_SECTION(L1_CACHE_BYTES) |
185 | 186 | ||
186 | #ifdef CONFIG_XIP_KERNEL | 187 | #ifdef CONFIG_XIP_KERNEL |
187 | __data_loc = ALIGN(4); /* location in binary */ | 188 | __data_loc = ALIGN(4); /* location in binary */ |
@@ -212,13 +213,13 @@ SECTIONS | |||
212 | #endif | 213 | #endif |
213 | 214 | ||
214 | NOSAVE_DATA | 215 | NOSAVE_DATA |
215 | CACHELINE_ALIGNED_DATA(32) | 216 | CACHELINE_ALIGNED_DATA(L1_CACHE_BYTES) |
216 | READ_MOSTLY_DATA(32) | 217 | READ_MOSTLY_DATA(L1_CACHE_BYTES) |
217 | 218 | ||
218 | /* | 219 | /* |
219 | * The exception fixup table (might need resorting at runtime) | 220 | * The exception fixup table (might need resorting at runtime) |
220 | */ | 221 | */ |
221 | . = ALIGN(32); | 222 | . = ALIGN(4); |
222 | __start___ex_table = .; | 223 | __start___ex_table = .; |
223 | #ifdef CONFIG_MMU | 224 | #ifdef CONFIG_MMU |
224 | *(__ex_table) | 225 | *(__ex_table) |
diff --git a/arch/arm/lib/getuser.S b/arch/arm/lib/getuser.S index 1b049cd7a49a..11093a7c3e32 100644 --- a/arch/arm/lib/getuser.S +++ b/arch/arm/lib/getuser.S | |||
@@ -31,18 +31,18 @@ | |||
31 | #include <asm/domain.h> | 31 | #include <asm/domain.h> |
32 | 32 | ||
33 | ENTRY(__get_user_1) | 33 | ENTRY(__get_user_1) |
34 | 1: T(ldrb) r2, [r0] | 34 | 1: TUSER(ldrb) r2, [r0] |
35 | mov r0, #0 | 35 | mov r0, #0 |
36 | mov pc, lr | 36 | mov pc, lr |
37 | ENDPROC(__get_user_1) | 37 | ENDPROC(__get_user_1) |
38 | 38 | ||
39 | ENTRY(__get_user_2) | 39 | ENTRY(__get_user_2) |
40 | #ifdef CONFIG_THUMB2_KERNEL | 40 | #ifdef CONFIG_THUMB2_KERNEL |
41 | 2: T(ldrb) r2, [r0] | 41 | 2: TUSER(ldrb) r2, [r0] |
42 | 3: T(ldrb) r3, [r0, #1] | 42 | 3: TUSER(ldrb) r3, [r0, #1] |
43 | #else | 43 | #else |
44 | 2: T(ldrb) r2, [r0], #1 | 44 | 2: TUSER(ldrb) r2, [r0], #1 |
45 | 3: T(ldrb) r3, [r0] | 45 | 3: TUSER(ldrb) r3, [r0] |
46 | #endif | 46 | #endif |
47 | #ifndef __ARMEB__ | 47 | #ifndef __ARMEB__ |
48 | orr r2, r2, r3, lsl #8 | 48 | orr r2, r2, r3, lsl #8 |
@@ -54,7 +54,7 @@ ENTRY(__get_user_2) | |||
54 | ENDPROC(__get_user_2) | 54 | ENDPROC(__get_user_2) |
55 | 55 | ||
56 | ENTRY(__get_user_4) | 56 | ENTRY(__get_user_4) |
57 | 4: T(ldr) r2, [r0] | 57 | 4: TUSER(ldr) r2, [r0] |
58 | mov r0, #0 | 58 | mov r0, #0 |
59 | mov pc, lr | 59 | mov pc, lr |
60 | ENDPROC(__get_user_4) | 60 | ENDPROC(__get_user_4) |
diff --git a/arch/arm/lib/putuser.S b/arch/arm/lib/putuser.S index c023fc11e86c..7db25990c589 100644 --- a/arch/arm/lib/putuser.S +++ b/arch/arm/lib/putuser.S | |||
@@ -31,7 +31,7 @@ | |||
31 | #include <asm/domain.h> | 31 | #include <asm/domain.h> |
32 | 32 | ||
33 | ENTRY(__put_user_1) | 33 | ENTRY(__put_user_1) |
34 | 1: T(strb) r2, [r0] | 34 | 1: TUSER(strb) r2, [r0] |
35 | mov r0, #0 | 35 | mov r0, #0 |
36 | mov pc, lr | 36 | mov pc, lr |
37 | ENDPROC(__put_user_1) | 37 | ENDPROC(__put_user_1) |
@@ -40,19 +40,19 @@ ENTRY(__put_user_2) | |||
40 | mov ip, r2, lsr #8 | 40 | mov ip, r2, lsr #8 |
41 | #ifdef CONFIG_THUMB2_KERNEL | 41 | #ifdef CONFIG_THUMB2_KERNEL |
42 | #ifndef __ARMEB__ | 42 | #ifndef __ARMEB__ |
43 | 2: T(strb) r2, [r0] | 43 | 2: TUSER(strb) r2, [r0] |
44 | 3: T(strb) ip, [r0, #1] | 44 | 3: TUSER(strb) ip, [r0, #1] |
45 | #else | 45 | #else |
46 | 2: T(strb) ip, [r0] | 46 | 2: TUSER(strb) ip, [r0] |
47 | 3: T(strb) r2, [r0, #1] | 47 | 3: TUSER(strb) r2, [r0, #1] |
48 | #endif | 48 | #endif |
49 | #else /* !CONFIG_THUMB2_KERNEL */ | 49 | #else /* !CONFIG_THUMB2_KERNEL */ |
50 | #ifndef __ARMEB__ | 50 | #ifndef __ARMEB__ |
51 | 2: T(strb) r2, [r0], #1 | 51 | 2: TUSER(strb) r2, [r0], #1 |
52 | 3: T(strb) ip, [r0] | 52 | 3: TUSER(strb) ip, [r0] |
53 | #else | 53 | #else |
54 | 2: T(strb) ip, [r0], #1 | 54 | 2: TUSER(strb) ip, [r0], #1 |
55 | 3: T(strb) r2, [r0] | 55 | 3: TUSER(strb) r2, [r0] |
56 | #endif | 56 | #endif |
57 | #endif /* CONFIG_THUMB2_KERNEL */ | 57 | #endif /* CONFIG_THUMB2_KERNEL */ |
58 | mov r0, #0 | 58 | mov r0, #0 |
@@ -60,18 +60,18 @@ ENTRY(__put_user_2) | |||
60 | ENDPROC(__put_user_2) | 60 | ENDPROC(__put_user_2) |
61 | 61 | ||
62 | ENTRY(__put_user_4) | 62 | ENTRY(__put_user_4) |
63 | 4: T(str) r2, [r0] | 63 | 4: TUSER(str) r2, [r0] |
64 | mov r0, #0 | 64 | mov r0, #0 |
65 | mov pc, lr | 65 | mov pc, lr |
66 | ENDPROC(__put_user_4) | 66 | ENDPROC(__put_user_4) |
67 | 67 | ||
68 | ENTRY(__put_user_8) | 68 | ENTRY(__put_user_8) |
69 | #ifdef CONFIG_THUMB2_KERNEL | 69 | #ifdef CONFIG_THUMB2_KERNEL |
70 | 5: T(str) r2, [r0] | 70 | 5: TUSER(str) r2, [r0] |
71 | 6: T(str) r3, [r0, #4] | 71 | 6: TUSER(str) r3, [r0, #4] |
72 | #else | 72 | #else |
73 | 5: T(str) r2, [r0], #4 | 73 | 5: TUSER(str) r2, [r0], #4 |
74 | 6: T(str) r3, [r0] | 74 | 6: TUSER(str) r3, [r0] |
75 | #endif | 75 | #endif |
76 | mov r0, #0 | 76 | mov r0, #0 |
77 | mov pc, lr | 77 | mov pc, lr |
diff --git a/arch/arm/lib/uaccess.S b/arch/arm/lib/uaccess.S index d0ece2aeb70d..5c908b1cb8ed 100644 --- a/arch/arm/lib/uaccess.S +++ b/arch/arm/lib/uaccess.S | |||
@@ -32,11 +32,11 @@ | |||
32 | rsb ip, ip, #4 | 32 | rsb ip, ip, #4 |
33 | cmp ip, #2 | 33 | cmp ip, #2 |
34 | ldrb r3, [r1], #1 | 34 | ldrb r3, [r1], #1 |
35 | USER( T(strb) r3, [r0], #1) @ May fault | 35 | USER( TUSER( strb) r3, [r0], #1) @ May fault |
36 | ldrgeb r3, [r1], #1 | 36 | ldrgeb r3, [r1], #1 |
37 | USER( T(strgeb) r3, [r0], #1) @ May fault | 37 | USER( TUSER( strgeb) r3, [r0], #1) @ May fault |
38 | ldrgtb r3, [r1], #1 | 38 | ldrgtb r3, [r1], #1 |
39 | USER( T(strgtb) r3, [r0], #1) @ May fault | 39 | USER( TUSER( strgtb) r3, [r0], #1) @ May fault |
40 | sub r2, r2, ip | 40 | sub r2, r2, ip |
41 | b .Lc2u_dest_aligned | 41 | b .Lc2u_dest_aligned |
42 | 42 | ||
@@ -59,7 +59,7 @@ ENTRY(__copy_to_user) | |||
59 | addmi ip, r2, #4 | 59 | addmi ip, r2, #4 |
60 | bmi .Lc2u_0nowords | 60 | bmi .Lc2u_0nowords |
61 | ldr r3, [r1], #4 | 61 | ldr r3, [r1], #4 |
62 | USER( T(str) r3, [r0], #4) @ May fault | 62 | USER( TUSER( str) r3, [r0], #4) @ May fault |
63 | mov ip, r0, lsl #32 - PAGE_SHIFT @ On each page, use a ld/st??t instruction | 63 | mov ip, r0, lsl #32 - PAGE_SHIFT @ On each page, use a ld/st??t instruction |
64 | rsb ip, ip, #0 | 64 | rsb ip, ip, #0 |
65 | movs ip, ip, lsr #32 - PAGE_SHIFT | 65 | movs ip, ip, lsr #32 - PAGE_SHIFT |
@@ -88,18 +88,18 @@ USER( T(str) r3, [r0], #4) @ May fault | |||
88 | stmneia r0!, {r3 - r4} @ Shouldnt fault | 88 | stmneia r0!, {r3 - r4} @ Shouldnt fault |
89 | tst ip, #4 | 89 | tst ip, #4 |
90 | ldrne r3, [r1], #4 | 90 | ldrne r3, [r1], #4 |
91 | T(strne) r3, [r0], #4 @ Shouldnt fault | 91 | TUSER( strne) r3, [r0], #4 @ Shouldnt fault |
92 | ands ip, ip, #3 | 92 | ands ip, ip, #3 |
93 | beq .Lc2u_0fupi | 93 | beq .Lc2u_0fupi |
94 | .Lc2u_0nowords: teq ip, #0 | 94 | .Lc2u_0nowords: teq ip, #0 |
95 | beq .Lc2u_finished | 95 | beq .Lc2u_finished |
96 | .Lc2u_nowords: cmp ip, #2 | 96 | .Lc2u_nowords: cmp ip, #2 |
97 | ldrb r3, [r1], #1 | 97 | ldrb r3, [r1], #1 |
98 | USER( T(strb) r3, [r0], #1) @ May fault | 98 | USER( TUSER( strb) r3, [r0], #1) @ May fault |
99 | ldrgeb r3, [r1], #1 | 99 | ldrgeb r3, [r1], #1 |
100 | USER( T(strgeb) r3, [r0], #1) @ May fault | 100 | USER( TUSER( strgeb) r3, [r0], #1) @ May fault |
101 | ldrgtb r3, [r1], #1 | 101 | ldrgtb r3, [r1], #1 |
102 | USER( T(strgtb) r3, [r0], #1) @ May fault | 102 | USER( TUSER( strgtb) r3, [r0], #1) @ May fault |
103 | b .Lc2u_finished | 103 | b .Lc2u_finished |
104 | 104 | ||
105 | .Lc2u_not_enough: | 105 | .Lc2u_not_enough: |
@@ -120,7 +120,7 @@ USER( T(strgtb) r3, [r0], #1) @ May fault | |||
120 | mov r3, r7, pull #8 | 120 | mov r3, r7, pull #8 |
121 | ldr r7, [r1], #4 | 121 | ldr r7, [r1], #4 |
122 | orr r3, r3, r7, push #24 | 122 | orr r3, r3, r7, push #24 |
123 | USER( T(str) r3, [r0], #4) @ May fault | 123 | USER( TUSER( str) r3, [r0], #4) @ May fault |
124 | mov ip, r0, lsl #32 - PAGE_SHIFT | 124 | mov ip, r0, lsl #32 - PAGE_SHIFT |
125 | rsb ip, ip, #0 | 125 | rsb ip, ip, #0 |
126 | movs ip, ip, lsr #32 - PAGE_SHIFT | 126 | movs ip, ip, lsr #32 - PAGE_SHIFT |
@@ -155,18 +155,18 @@ USER( T(str) r3, [r0], #4) @ May fault | |||
155 | movne r3, r7, pull #8 | 155 | movne r3, r7, pull #8 |
156 | ldrne r7, [r1], #4 | 156 | ldrne r7, [r1], #4 |
157 | orrne r3, r3, r7, push #24 | 157 | orrne r3, r3, r7, push #24 |
158 | T(strne) r3, [r0], #4 @ Shouldnt fault | 158 | TUSER( strne) r3, [r0], #4 @ Shouldnt fault |
159 | ands ip, ip, #3 | 159 | ands ip, ip, #3 |
160 | beq .Lc2u_1fupi | 160 | beq .Lc2u_1fupi |
161 | .Lc2u_1nowords: mov r3, r7, get_byte_1 | 161 | .Lc2u_1nowords: mov r3, r7, get_byte_1 |
162 | teq ip, #0 | 162 | teq ip, #0 |
163 | beq .Lc2u_finished | 163 | beq .Lc2u_finished |
164 | cmp ip, #2 | 164 | cmp ip, #2 |
165 | USER( T(strb) r3, [r0], #1) @ May fault | 165 | USER( TUSER( strb) r3, [r0], #1) @ May fault |
166 | movge r3, r7, get_byte_2 | 166 | movge r3, r7, get_byte_2 |
167 | USER( T(strgeb) r3, [r0], #1) @ May fault | 167 | USER( TUSER( strgeb) r3, [r0], #1) @ May fault |
168 | movgt r3, r7, get_byte_3 | 168 | movgt r3, r7, get_byte_3 |
169 | USER( T(strgtb) r3, [r0], #1) @ May fault | 169 | USER( TUSER( strgtb) r3, [r0], #1) @ May fault |
170 | b .Lc2u_finished | 170 | b .Lc2u_finished |
171 | 171 | ||
172 | .Lc2u_2fupi: subs r2, r2, #4 | 172 | .Lc2u_2fupi: subs r2, r2, #4 |
@@ -175,7 +175,7 @@ USER( T(strgtb) r3, [r0], #1) @ May fault | |||
175 | mov r3, r7, pull #16 | 175 | mov r3, r7, pull #16 |
176 | ldr r7, [r1], #4 | 176 | ldr r7, [r1], #4 |
177 | orr r3, r3, r7, push #16 | 177 | orr r3, r3, r7, push #16 |
178 | USER( T(str) r3, [r0], #4) @ May fault | 178 | USER( TUSER( str) r3, [r0], #4) @ May fault |
179 | mov ip, r0, lsl #32 - PAGE_SHIFT | 179 | mov ip, r0, lsl #32 - PAGE_SHIFT |
180 | rsb ip, ip, #0 | 180 | rsb ip, ip, #0 |
181 | movs ip, ip, lsr #32 - PAGE_SHIFT | 181 | movs ip, ip, lsr #32 - PAGE_SHIFT |
@@ -210,18 +210,18 @@ USER( T(str) r3, [r0], #4) @ May fault | |||
210 | movne r3, r7, pull #16 | 210 | movne r3, r7, pull #16 |
211 | ldrne r7, [r1], #4 | 211 | ldrne r7, [r1], #4 |
212 | orrne r3, r3, r7, push #16 | 212 | orrne r3, r3, r7, push #16 |
213 | T(strne) r3, [r0], #4 @ Shouldnt fault | 213 | TUSER( strne) r3, [r0], #4 @ Shouldnt fault |
214 | ands ip, ip, #3 | 214 | ands ip, ip, #3 |
215 | beq .Lc2u_2fupi | 215 | beq .Lc2u_2fupi |
216 | .Lc2u_2nowords: mov r3, r7, get_byte_2 | 216 | .Lc2u_2nowords: mov r3, r7, get_byte_2 |
217 | teq ip, #0 | 217 | teq ip, #0 |
218 | beq .Lc2u_finished | 218 | beq .Lc2u_finished |
219 | cmp ip, #2 | 219 | cmp ip, #2 |
220 | USER( T(strb) r3, [r0], #1) @ May fault | 220 | USER( TUSER( strb) r3, [r0], #1) @ May fault |
221 | movge r3, r7, get_byte_3 | 221 | movge r3, r7, get_byte_3 |
222 | USER( T(strgeb) r3, [r0], #1) @ May fault | 222 | USER( TUSER( strgeb) r3, [r0], #1) @ May fault |
223 | ldrgtb r3, [r1], #0 | 223 | ldrgtb r3, [r1], #0 |
224 | USER( T(strgtb) r3, [r0], #1) @ May fault | 224 | USER( TUSER( strgtb) r3, [r0], #1) @ May fault |
225 | b .Lc2u_finished | 225 | b .Lc2u_finished |
226 | 226 | ||
227 | .Lc2u_3fupi: subs r2, r2, #4 | 227 | .Lc2u_3fupi: subs r2, r2, #4 |
@@ -230,7 +230,7 @@ USER( T(strgtb) r3, [r0], #1) @ May fault | |||
230 | mov r3, r7, pull #24 | 230 | mov r3, r7, pull #24 |
231 | ldr r7, [r1], #4 | 231 | ldr r7, [r1], #4 |
232 | orr r3, r3, r7, push #8 | 232 | orr r3, r3, r7, push #8 |
233 | USER( T(str) r3, [r0], #4) @ May fault | 233 | USER( TUSER( str) r3, [r0], #4) @ May fault |
234 | mov ip, r0, lsl #32 - PAGE_SHIFT | 234 | mov ip, r0, lsl #32 - PAGE_SHIFT |
235 | rsb ip, ip, #0 | 235 | rsb ip, ip, #0 |
236 | movs ip, ip, lsr #32 - PAGE_SHIFT | 236 | movs ip, ip, lsr #32 - PAGE_SHIFT |
@@ -265,18 +265,18 @@ USER( T(str) r3, [r0], #4) @ May fault | |||
265 | movne r3, r7, pull #24 | 265 | movne r3, r7, pull #24 |
266 | ldrne r7, [r1], #4 | 266 | ldrne r7, [r1], #4 |
267 | orrne r3, r3, r7, push #8 | 267 | orrne r3, r3, r7, push #8 |
268 | T(strne) r3, [r0], #4 @ Shouldnt fault | 268 | TUSER( strne) r3, [r0], #4 @ Shouldnt fault |
269 | ands ip, ip, #3 | 269 | ands ip, ip, #3 |
270 | beq .Lc2u_3fupi | 270 | beq .Lc2u_3fupi |
271 | .Lc2u_3nowords: mov r3, r7, get_byte_3 | 271 | .Lc2u_3nowords: mov r3, r7, get_byte_3 |
272 | teq ip, #0 | 272 | teq ip, #0 |
273 | beq .Lc2u_finished | 273 | beq .Lc2u_finished |
274 | cmp ip, #2 | 274 | cmp ip, #2 |
275 | USER( T(strb) r3, [r0], #1) @ May fault | 275 | USER( TUSER( strb) r3, [r0], #1) @ May fault |
276 | ldrgeb r3, [r1], #1 | 276 | ldrgeb r3, [r1], #1 |
277 | USER( T(strgeb) r3, [r0], #1) @ May fault | 277 | USER( TUSER( strgeb) r3, [r0], #1) @ May fault |
278 | ldrgtb r3, [r1], #0 | 278 | ldrgtb r3, [r1], #0 |
279 | USER( T(strgtb) r3, [r0], #1) @ May fault | 279 | USER( TUSER( strgtb) r3, [r0], #1) @ May fault |
280 | b .Lc2u_finished | 280 | b .Lc2u_finished |
281 | ENDPROC(__copy_to_user) | 281 | ENDPROC(__copy_to_user) |
282 | 282 | ||
@@ -295,11 +295,11 @@ ENDPROC(__copy_to_user) | |||
295 | .Lcfu_dest_not_aligned: | 295 | .Lcfu_dest_not_aligned: |
296 | rsb ip, ip, #4 | 296 | rsb ip, ip, #4 |
297 | cmp ip, #2 | 297 | cmp ip, #2 |
298 | USER( T(ldrb) r3, [r1], #1) @ May fault | 298 | USER( TUSER( ldrb) r3, [r1], #1) @ May fault |
299 | strb r3, [r0], #1 | 299 | strb r3, [r0], #1 |
300 | USER( T(ldrgeb) r3, [r1], #1) @ May fault | 300 | USER( TUSER( ldrgeb) r3, [r1], #1) @ May fault |
301 | strgeb r3, [r0], #1 | 301 | strgeb r3, [r0], #1 |
302 | USER( T(ldrgtb) r3, [r1], #1) @ May fault | 302 | USER( TUSER( ldrgtb) r3, [r1], #1) @ May fault |
303 | strgtb r3, [r0], #1 | 303 | strgtb r3, [r0], #1 |
304 | sub r2, r2, ip | 304 | sub r2, r2, ip |
305 | b .Lcfu_dest_aligned | 305 | b .Lcfu_dest_aligned |
@@ -322,7 +322,7 @@ ENTRY(__copy_from_user) | |||
322 | .Lcfu_0fupi: subs r2, r2, #4 | 322 | .Lcfu_0fupi: subs r2, r2, #4 |
323 | addmi ip, r2, #4 | 323 | addmi ip, r2, #4 |
324 | bmi .Lcfu_0nowords | 324 | bmi .Lcfu_0nowords |
325 | USER( T(ldr) r3, [r1], #4) | 325 | USER( TUSER( ldr) r3, [r1], #4) |
326 | str r3, [r0], #4 | 326 | str r3, [r0], #4 |
327 | mov ip, r1, lsl #32 - PAGE_SHIFT @ On each page, use a ld/st??t instruction | 327 | mov ip, r1, lsl #32 - PAGE_SHIFT @ On each page, use a ld/st??t instruction |
328 | rsb ip, ip, #0 | 328 | rsb ip, ip, #0 |
@@ -351,18 +351,18 @@ USER( T(ldr) r3, [r1], #4) | |||
351 | ldmneia r1!, {r3 - r4} @ Shouldnt fault | 351 | ldmneia r1!, {r3 - r4} @ Shouldnt fault |
352 | stmneia r0!, {r3 - r4} | 352 | stmneia r0!, {r3 - r4} |
353 | tst ip, #4 | 353 | tst ip, #4 |
354 | T(ldrne) r3, [r1], #4 @ Shouldnt fault | 354 | TUSER( ldrne) r3, [r1], #4 @ Shouldnt fault |
355 | strne r3, [r0], #4 | 355 | strne r3, [r0], #4 |
356 | ands ip, ip, #3 | 356 | ands ip, ip, #3 |
357 | beq .Lcfu_0fupi | 357 | beq .Lcfu_0fupi |
358 | .Lcfu_0nowords: teq ip, #0 | 358 | .Lcfu_0nowords: teq ip, #0 |
359 | beq .Lcfu_finished | 359 | beq .Lcfu_finished |
360 | .Lcfu_nowords: cmp ip, #2 | 360 | .Lcfu_nowords: cmp ip, #2 |
361 | USER( T(ldrb) r3, [r1], #1) @ May fault | 361 | USER( TUSER( ldrb) r3, [r1], #1) @ May fault |
362 | strb r3, [r0], #1 | 362 | strb r3, [r0], #1 |
363 | USER( T(ldrgeb) r3, [r1], #1) @ May fault | 363 | USER( TUSER( ldrgeb) r3, [r1], #1) @ May fault |
364 | strgeb r3, [r0], #1 | 364 | strgeb r3, [r0], #1 |
365 | USER( T(ldrgtb) r3, [r1], #1) @ May fault | 365 | USER( TUSER( ldrgtb) r3, [r1], #1) @ May fault |
366 | strgtb r3, [r0], #1 | 366 | strgtb r3, [r0], #1 |
367 | b .Lcfu_finished | 367 | b .Lcfu_finished |
368 | 368 | ||
@@ -375,7 +375,7 @@ USER( T(ldrgtb) r3, [r1], #1) @ May fault | |||
375 | 375 | ||
376 | .Lcfu_src_not_aligned: | 376 | .Lcfu_src_not_aligned: |
377 | bic r1, r1, #3 | 377 | bic r1, r1, #3 |
378 | USER( T(ldr) r7, [r1], #4) @ May fault | 378 | USER( TUSER( ldr) r7, [r1], #4) @ May fault |
379 | cmp ip, #2 | 379 | cmp ip, #2 |
380 | bgt .Lcfu_3fupi | 380 | bgt .Lcfu_3fupi |
381 | beq .Lcfu_2fupi | 381 | beq .Lcfu_2fupi |
@@ -383,7 +383,7 @@ USER( T(ldr) r7, [r1], #4) @ May fault | |||
383 | addmi ip, r2, #4 | 383 | addmi ip, r2, #4 |
384 | bmi .Lcfu_1nowords | 384 | bmi .Lcfu_1nowords |
385 | mov r3, r7, pull #8 | 385 | mov r3, r7, pull #8 |
386 | USER( T(ldr) r7, [r1], #4) @ May fault | 386 | USER( TUSER( ldr) r7, [r1], #4) @ May fault |
387 | orr r3, r3, r7, push #24 | 387 | orr r3, r3, r7, push #24 |
388 | str r3, [r0], #4 | 388 | str r3, [r0], #4 |
389 | mov ip, r1, lsl #32 - PAGE_SHIFT | 389 | mov ip, r1, lsl #32 - PAGE_SHIFT |
@@ -418,7 +418,7 @@ USER( T(ldr) r7, [r1], #4) @ May fault | |||
418 | stmneia r0!, {r3 - r4} | 418 | stmneia r0!, {r3 - r4} |
419 | tst ip, #4 | 419 | tst ip, #4 |
420 | movne r3, r7, pull #8 | 420 | movne r3, r7, pull #8 |
421 | USER( T(ldrne) r7, [r1], #4) @ May fault | 421 | USER( TUSER( ldrne) r7, [r1], #4) @ May fault |
422 | orrne r3, r3, r7, push #24 | 422 | orrne r3, r3, r7, push #24 |
423 | strne r3, [r0], #4 | 423 | strne r3, [r0], #4 |
424 | ands ip, ip, #3 | 424 | ands ip, ip, #3 |
@@ -438,7 +438,7 @@ USER( T(ldrne) r7, [r1], #4) @ May fault | |||
438 | addmi ip, r2, #4 | 438 | addmi ip, r2, #4 |
439 | bmi .Lcfu_2nowords | 439 | bmi .Lcfu_2nowords |
440 | mov r3, r7, pull #16 | 440 | mov r3, r7, pull #16 |
441 | USER( T(ldr) r7, [r1], #4) @ May fault | 441 | USER( TUSER( ldr) r7, [r1], #4) @ May fault |
442 | orr r3, r3, r7, push #16 | 442 | orr r3, r3, r7, push #16 |
443 | str r3, [r0], #4 | 443 | str r3, [r0], #4 |
444 | mov ip, r1, lsl #32 - PAGE_SHIFT | 444 | mov ip, r1, lsl #32 - PAGE_SHIFT |
@@ -474,7 +474,7 @@ USER( T(ldr) r7, [r1], #4) @ May fault | |||
474 | stmneia r0!, {r3 - r4} | 474 | stmneia r0!, {r3 - r4} |
475 | tst ip, #4 | 475 | tst ip, #4 |
476 | movne r3, r7, pull #16 | 476 | movne r3, r7, pull #16 |
477 | USER( T(ldrne) r7, [r1], #4) @ May fault | 477 | USER( TUSER( ldrne) r7, [r1], #4) @ May fault |
478 | orrne r3, r3, r7, push #16 | 478 | orrne r3, r3, r7, push #16 |
479 | strne r3, [r0], #4 | 479 | strne r3, [r0], #4 |
480 | ands ip, ip, #3 | 480 | ands ip, ip, #3 |
@@ -486,7 +486,7 @@ USER( T(ldrne) r7, [r1], #4) @ May fault | |||
486 | strb r3, [r0], #1 | 486 | strb r3, [r0], #1 |
487 | movge r3, r7, get_byte_3 | 487 | movge r3, r7, get_byte_3 |
488 | strgeb r3, [r0], #1 | 488 | strgeb r3, [r0], #1 |
489 | USER( T(ldrgtb) r3, [r1], #0) @ May fault | 489 | USER( TUSER( ldrgtb) r3, [r1], #0) @ May fault |
490 | strgtb r3, [r0], #1 | 490 | strgtb r3, [r0], #1 |
491 | b .Lcfu_finished | 491 | b .Lcfu_finished |
492 | 492 | ||
@@ -494,7 +494,7 @@ USER( T(ldrgtb) r3, [r1], #0) @ May fault | |||
494 | addmi ip, r2, #4 | 494 | addmi ip, r2, #4 |
495 | bmi .Lcfu_3nowords | 495 | bmi .Lcfu_3nowords |
496 | mov r3, r7, pull #24 | 496 | mov r3, r7, pull #24 |
497 | USER( T(ldr) r7, [r1], #4) @ May fault | 497 | USER( TUSER( ldr) r7, [r1], #4) @ May fault |
498 | orr r3, r3, r7, push #8 | 498 | orr r3, r3, r7, push #8 |
499 | str r3, [r0], #4 | 499 | str r3, [r0], #4 |
500 | mov ip, r1, lsl #32 - PAGE_SHIFT | 500 | mov ip, r1, lsl #32 - PAGE_SHIFT |
@@ -529,7 +529,7 @@ USER( T(ldr) r7, [r1], #4) @ May fault | |||
529 | stmneia r0!, {r3 - r4} | 529 | stmneia r0!, {r3 - r4} |
530 | tst ip, #4 | 530 | tst ip, #4 |
531 | movne r3, r7, pull #24 | 531 | movne r3, r7, pull #24 |
532 | USER( T(ldrne) r7, [r1], #4) @ May fault | 532 | USER( TUSER( ldrne) r7, [r1], #4) @ May fault |
533 | orrne r3, r3, r7, push #8 | 533 | orrne r3, r3, r7, push #8 |
534 | strne r3, [r0], #4 | 534 | strne r3, [r0], #4 |
535 | ands ip, ip, #3 | 535 | ands ip, ip, #3 |
@@ -539,9 +539,9 @@ USER( T(ldrne) r7, [r1], #4) @ May fault | |||
539 | beq .Lcfu_finished | 539 | beq .Lcfu_finished |
540 | cmp ip, #2 | 540 | cmp ip, #2 |
541 | strb r3, [r0], #1 | 541 | strb r3, [r0], #1 |
542 | USER( T(ldrgeb) r3, [r1], #1) @ May fault | 542 | USER( TUSER( ldrgeb) r3, [r1], #1) @ May fault |
543 | strgeb r3, [r0], #1 | 543 | strgeb r3, [r0], #1 |
544 | USER( T(ldrgtb) r3, [r1], #1) @ May fault | 544 | USER( TUSER( ldrgtb) r3, [r1], #1) @ May fault |
545 | strgtb r3, [r0], #1 | 545 | strgtb r3, [r0], #1 |
546 | b .Lcfu_finished | 546 | b .Lcfu_finished |
547 | ENDPROC(__copy_from_user) | 547 | ENDPROC(__copy_from_user) |
diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig index 4f991f295284..71feb00a1e99 100644 --- a/arch/arm/mach-at91/Kconfig +++ b/arch/arm/mach-at91/Kconfig | |||
@@ -18,6 +18,12 @@ config HAVE_AT91_USART4 | |||
18 | config HAVE_AT91_USART5 | 18 | config HAVE_AT91_USART5 |
19 | bool | 19 | bool |
20 | 20 | ||
21 | config AT91_SAM9_ALT_RESET | ||
22 | bool | ||
23 | |||
24 | config AT91_SAM9G45_RESET | ||
25 | bool | ||
26 | |||
21 | menu "Atmel AT91 System-on-Chip" | 27 | menu "Atmel AT91 System-on-Chip" |
22 | 28 | ||
23 | choice | 29 | choice |
@@ -39,6 +45,7 @@ config ARCH_AT91SAM9260 | |||
39 | select HAVE_AT91_USART4 | 45 | select HAVE_AT91_USART4 |
40 | select HAVE_AT91_USART5 | 46 | select HAVE_AT91_USART5 |
41 | select HAVE_NET_MACB | 47 | select HAVE_NET_MACB |
48 | select AT91_SAM9_ALT_RESET | ||
42 | 49 | ||
43 | config ARCH_AT91SAM9261 | 50 | config ARCH_AT91SAM9261 |
44 | bool "AT91SAM9261" | 51 | bool "AT91SAM9261" |
@@ -46,6 +53,7 @@ config ARCH_AT91SAM9261 | |||
46 | select GENERIC_CLOCKEVENTS | 53 | select GENERIC_CLOCKEVENTS |
47 | select HAVE_FB_ATMEL | 54 | select HAVE_FB_ATMEL |
48 | select HAVE_AT91_DBGU0 | 55 | select HAVE_AT91_DBGU0 |
56 | select AT91_SAM9_ALT_RESET | ||
49 | 57 | ||
50 | config ARCH_AT91SAM9G10 | 58 | config ARCH_AT91SAM9G10 |
51 | bool "AT91SAM9G10" | 59 | bool "AT91SAM9G10" |
@@ -53,6 +61,7 @@ config ARCH_AT91SAM9G10 | |||
53 | select GENERIC_CLOCKEVENTS | 61 | select GENERIC_CLOCKEVENTS |
54 | select HAVE_AT91_DBGU0 | 62 | select HAVE_AT91_DBGU0 |
55 | select HAVE_FB_ATMEL | 63 | select HAVE_FB_ATMEL |
64 | select AT91_SAM9_ALT_RESET | ||
56 | 65 | ||
57 | config ARCH_AT91SAM9263 | 66 | config ARCH_AT91SAM9263 |
58 | bool "AT91SAM9263" | 67 | bool "AT91SAM9263" |
@@ -61,6 +70,7 @@ config ARCH_AT91SAM9263 | |||
61 | select HAVE_FB_ATMEL | 70 | select HAVE_FB_ATMEL |
62 | select HAVE_NET_MACB | 71 | select HAVE_NET_MACB |
63 | select HAVE_AT91_DBGU1 | 72 | select HAVE_AT91_DBGU1 |
73 | select AT91_SAM9_ALT_RESET | ||
64 | 74 | ||
65 | config ARCH_AT91SAM9RL | 75 | config ARCH_AT91SAM9RL |
66 | bool "AT91SAM9RL" | 76 | bool "AT91SAM9RL" |
@@ -69,6 +79,7 @@ config ARCH_AT91SAM9RL | |||
69 | select HAVE_AT91_USART3 | 79 | select HAVE_AT91_USART3 |
70 | select HAVE_FB_ATMEL | 80 | select HAVE_FB_ATMEL |
71 | select HAVE_AT91_DBGU0 | 81 | select HAVE_AT91_DBGU0 |
82 | select AT91_SAM9_ALT_RESET | ||
72 | 83 | ||
73 | config ARCH_AT91SAM9G20 | 84 | config ARCH_AT91SAM9G20 |
74 | bool "AT91SAM9G20" | 85 | bool "AT91SAM9G20" |
@@ -79,6 +90,7 @@ config ARCH_AT91SAM9G20 | |||
79 | select HAVE_AT91_USART4 | 90 | select HAVE_AT91_USART4 |
80 | select HAVE_AT91_USART5 | 91 | select HAVE_AT91_USART5 |
81 | select HAVE_NET_MACB | 92 | select HAVE_NET_MACB |
93 | select AT91_SAM9_ALT_RESET | ||
82 | 94 | ||
83 | config ARCH_AT91SAM9G45 | 95 | config ARCH_AT91SAM9G45 |
84 | bool "AT91SAM9G45" | 96 | bool "AT91SAM9G45" |
@@ -88,6 +100,7 @@ config ARCH_AT91SAM9G45 | |||
88 | select HAVE_FB_ATMEL | 100 | select HAVE_FB_ATMEL |
89 | select HAVE_NET_MACB | 101 | select HAVE_NET_MACB |
90 | select HAVE_AT91_DBGU1 | 102 | select HAVE_AT91_DBGU1 |
103 | select AT91_SAM9G45_RESET | ||
91 | 104 | ||
92 | config ARCH_AT91CAP9 | 105 | config ARCH_AT91CAP9 |
93 | bool "AT91CAP9" | 106 | bool "AT91CAP9" |
@@ -96,6 +109,7 @@ config ARCH_AT91CAP9 | |||
96 | select HAVE_FB_ATMEL | 109 | select HAVE_FB_ATMEL |
97 | select HAVE_NET_MACB | 110 | select HAVE_NET_MACB |
98 | select HAVE_AT91_DBGU1 | 111 | select HAVE_AT91_DBGU1 |
112 | select AT91_SAM9G45_RESET | ||
99 | 113 | ||
100 | config ARCH_AT91X40 | 114 | config ARCH_AT91X40 |
101 | bool "AT91x40" | 115 | bool "AT91x40" |
diff --git a/arch/arm/mach-at91/Makefile b/arch/arm/mach-at91/Makefile index 242174f9f355..705e1fbded39 100644 --- a/arch/arm/mach-at91/Makefile +++ b/arch/arm/mach-at91/Makefile | |||
@@ -8,15 +8,17 @@ obj-n := | |||
8 | obj- := | 8 | obj- := |
9 | 9 | ||
10 | obj-$(CONFIG_AT91_PMC_UNIT) += clock.o | 10 | obj-$(CONFIG_AT91_PMC_UNIT) += clock.o |
11 | obj-$(CONFIG_AT91_SAM9_ALT_RESET) += at91sam9_alt_reset.o | ||
12 | obj-$(CONFIG_AT91_SAM9G45_RESET) += at91sam9g45_reset.o | ||
11 | 13 | ||
12 | # CPU-specific support | 14 | # CPU-specific support |
13 | obj-$(CONFIG_ARCH_AT91RM9200) += at91rm9200.o at91rm9200_time.o at91rm9200_devices.o | 15 | obj-$(CONFIG_ARCH_AT91RM9200) += at91rm9200.o at91rm9200_time.o at91rm9200_devices.o |
14 | obj-$(CONFIG_ARCH_AT91SAM9260) += at91sam9260.o at91sam926x_time.o at91sam9260_devices.o sam9_smc.o at91sam9_alt_reset.o | 16 | obj-$(CONFIG_ARCH_AT91SAM9260) += at91sam9260.o at91sam926x_time.o at91sam9260_devices.o sam9_smc.o |
15 | obj-$(CONFIG_ARCH_AT91SAM9261) += at91sam9261.o at91sam926x_time.o at91sam9261_devices.o sam9_smc.o at91sam9_alt_reset.o | 17 | obj-$(CONFIG_ARCH_AT91SAM9261) += at91sam9261.o at91sam926x_time.o at91sam9261_devices.o sam9_smc.o |
16 | obj-$(CONFIG_ARCH_AT91SAM9G10) += at91sam9261.o at91sam926x_time.o at91sam9261_devices.o sam9_smc.o at91sam9_alt_reset.o | 18 | obj-$(CONFIG_ARCH_AT91SAM9G10) += at91sam9261.o at91sam926x_time.o at91sam9261_devices.o sam9_smc.o |
17 | obj-$(CONFIG_ARCH_AT91SAM9263) += at91sam9263.o at91sam926x_time.o at91sam9263_devices.o sam9_smc.o at91sam9_alt_reset.o | 19 | obj-$(CONFIG_ARCH_AT91SAM9263) += at91sam9263.o at91sam926x_time.o at91sam9263_devices.o sam9_smc.o |
18 | obj-$(CONFIG_ARCH_AT91SAM9RL) += at91sam9rl.o at91sam926x_time.o at91sam9rl_devices.o sam9_smc.o at91sam9_alt_reset.o | 20 | obj-$(CONFIG_ARCH_AT91SAM9RL) += at91sam9rl.o at91sam926x_time.o at91sam9rl_devices.o sam9_smc.o |
19 | obj-$(CONFIG_ARCH_AT91SAM9G20) += at91sam9260.o at91sam926x_time.o at91sam9260_devices.o sam9_smc.o at91sam9_alt_reset.o | 21 | obj-$(CONFIG_ARCH_AT91SAM9G20) += at91sam9260.o at91sam926x_time.o at91sam9260_devices.o sam9_smc.o |
20 | obj-$(CONFIG_ARCH_AT91SAM9G45) += at91sam9g45.o at91sam926x_time.o at91sam9g45_devices.o sam9_smc.o | 22 | obj-$(CONFIG_ARCH_AT91SAM9G45) += at91sam9g45.o at91sam926x_time.o at91sam9g45_devices.o sam9_smc.o |
21 | obj-$(CONFIG_ARCH_AT91CAP9) += at91cap9.o at91sam926x_time.o at91cap9_devices.o sam9_smc.o | 23 | obj-$(CONFIG_ARCH_AT91CAP9) += at91cap9.o at91sam926x_time.o at91cap9_devices.o sam9_smc.o |
22 | obj-$(CONFIG_ARCH_AT91X40) += at91x40.o at91x40_time.o | 24 | obj-$(CONFIG_ARCH_AT91X40) += at91x40.o at91x40_time.o |
diff --git a/arch/arm/mach-at91/at91cap9.c b/arch/arm/mach-at91/at91cap9.c index edb879ac04c8..a42edc25a87e 100644 --- a/arch/arm/mach-at91/at91cap9.c +++ b/arch/arm/mach-at91/at91cap9.c | |||
@@ -21,7 +21,6 @@ | |||
21 | #include <mach/cpu.h> | 21 | #include <mach/cpu.h> |
22 | #include <mach/at91cap9.h> | 22 | #include <mach/at91cap9.h> |
23 | #include <mach/at91_pmc.h> | 23 | #include <mach/at91_pmc.h> |
24 | #include <mach/at91_rstc.h> | ||
25 | 24 | ||
26 | #include "soc.h" | 25 | #include "soc.h" |
27 | #include "generic.h" | 26 | #include "generic.h" |
@@ -314,11 +313,6 @@ static struct at91_gpio_bank at91cap9_gpio[] __initdata = { | |||
314 | } | 313 | } |
315 | }; | 314 | }; |
316 | 315 | ||
317 | static void at91cap9_restart(char mode, const char *cmd) | ||
318 | { | ||
319 | at91_sys_write(AT91_RSTC_CR, AT91_RSTC_KEY | AT91_RSTC_PROCRST | AT91_RSTC_PERRST); | ||
320 | } | ||
321 | |||
322 | /* -------------------------------------------------------------------- | 316 | /* -------------------------------------------------------------------- |
323 | * AT91CAP9 processor initialization | 317 | * AT91CAP9 processor initialization |
324 | * -------------------------------------------------------------------- */ | 318 | * -------------------------------------------------------------------- */ |
@@ -331,13 +325,14 @@ static void __init at91cap9_map_io(void) | |||
331 | static void __init at91cap9_ioremap_registers(void) | 325 | static void __init at91cap9_ioremap_registers(void) |
332 | { | 326 | { |
333 | at91_ioremap_shdwc(AT91CAP9_BASE_SHDWC); | 327 | at91_ioremap_shdwc(AT91CAP9_BASE_SHDWC); |
328 | at91_ioremap_rstc(AT91CAP9_BASE_RSTC); | ||
334 | at91sam926x_ioremap_pit(AT91CAP9_BASE_PIT); | 329 | at91sam926x_ioremap_pit(AT91CAP9_BASE_PIT); |
335 | at91sam9_ioremap_smc(0, AT91CAP9_BASE_SMC); | 330 | at91sam9_ioremap_smc(0, AT91CAP9_BASE_SMC); |
336 | } | 331 | } |
337 | 332 | ||
338 | static void __init at91cap9_initialize(void) | 333 | static void __init at91cap9_initialize(void) |
339 | { | 334 | { |
340 | arm_pm_restart = at91cap9_restart; | 335 | arm_pm_restart = at91sam9g45_restart; |
341 | at91_extern_irq = (1 << AT91CAP9_ID_IRQ0) | (1 << AT91CAP9_ID_IRQ1); | 336 | at91_extern_irq = (1 << AT91CAP9_ID_IRQ0) | (1 << AT91CAP9_ID_IRQ1); |
342 | 337 | ||
343 | /* Register GPIO subsystem */ | 338 | /* Register GPIO subsystem */ |
diff --git a/arch/arm/mach-at91/at91sam9260.c b/arch/arm/mach-at91/at91sam9260.c index 5e46e4a96430..d4036ba43612 100644 --- a/arch/arm/mach-at91/at91sam9260.c +++ b/arch/arm/mach-at91/at91sam9260.c | |||
@@ -323,6 +323,7 @@ static void __init at91sam9260_map_io(void) | |||
323 | static void __init at91sam9260_ioremap_registers(void) | 323 | static void __init at91sam9260_ioremap_registers(void) |
324 | { | 324 | { |
325 | at91_ioremap_shdwc(AT91SAM9260_BASE_SHDWC); | 325 | at91_ioremap_shdwc(AT91SAM9260_BASE_SHDWC); |
326 | at91_ioremap_rstc(AT91SAM9260_BASE_RSTC); | ||
326 | at91sam926x_ioremap_pit(AT91SAM9260_BASE_PIT); | 327 | at91sam926x_ioremap_pit(AT91SAM9260_BASE_PIT); |
327 | at91sam9_ioremap_smc(0, AT91SAM9260_BASE_SMC); | 328 | at91sam9_ioremap_smc(0, AT91SAM9260_BASE_SMC); |
328 | } | 329 | } |
diff --git a/arch/arm/mach-at91/at91sam9261.c b/arch/arm/mach-at91/at91sam9261.c index b85b9ea60170..023c2ff138df 100644 --- a/arch/arm/mach-at91/at91sam9261.c +++ b/arch/arm/mach-at91/at91sam9261.c | |||
@@ -281,6 +281,7 @@ static void __init at91sam9261_map_io(void) | |||
281 | static void __init at91sam9261_ioremap_registers(void) | 281 | static void __init at91sam9261_ioremap_registers(void) |
282 | { | 282 | { |
283 | at91_ioremap_shdwc(AT91SAM9261_BASE_SHDWC); | 283 | at91_ioremap_shdwc(AT91SAM9261_BASE_SHDWC); |
284 | at91_ioremap_rstc(AT91SAM9261_BASE_RSTC); | ||
284 | at91sam926x_ioremap_pit(AT91SAM9261_BASE_PIT); | 285 | at91sam926x_ioremap_pit(AT91SAM9261_BASE_PIT); |
285 | at91sam9_ioremap_smc(0, AT91SAM9261_BASE_SMC); | 286 | at91sam9_ioremap_smc(0, AT91SAM9261_BASE_SMC); |
286 | } | 287 | } |
diff --git a/arch/arm/mach-at91/at91sam9263.c b/arch/arm/mach-at91/at91sam9263.c index 79e3669b1117..75e876c258af 100644 --- a/arch/arm/mach-at91/at91sam9263.c +++ b/arch/arm/mach-at91/at91sam9263.c | |||
@@ -301,6 +301,7 @@ static void __init at91sam9263_map_io(void) | |||
301 | static void __init at91sam9263_ioremap_registers(void) | 301 | static void __init at91sam9263_ioremap_registers(void) |
302 | { | 302 | { |
303 | at91_ioremap_shdwc(AT91SAM9263_BASE_SHDWC); | 303 | at91_ioremap_shdwc(AT91SAM9263_BASE_SHDWC); |
304 | at91_ioremap_rstc(AT91SAM9263_BASE_RSTC); | ||
304 | at91sam926x_ioremap_pit(AT91SAM9263_BASE_PIT); | 305 | at91sam926x_ioremap_pit(AT91SAM9263_BASE_PIT); |
305 | at91sam9_ioremap_smc(0, AT91SAM9263_BASE_SMC0); | 306 | at91sam9_ioremap_smc(0, AT91SAM9263_BASE_SMC0); |
306 | at91sam9_ioremap_smc(1, AT91SAM9263_BASE_SMC1); | 307 | at91sam9_ioremap_smc(1, AT91SAM9263_BASE_SMC1); |
diff --git a/arch/arm/mach-at91/at91sam9_alt_reset.S b/arch/arm/mach-at91/at91sam9_alt_reset.S index d3f931c5942e..518e42377171 100644 --- a/arch/arm/mach-at91/at91sam9_alt_reset.S +++ b/arch/arm/mach-at91/at91sam9_alt_reset.S | |||
@@ -23,7 +23,8 @@ | |||
23 | .globl at91sam9_alt_restart | 23 | .globl at91sam9_alt_restart |
24 | 24 | ||
25 | at91sam9_alt_restart: ldr r0, .at91_va_base_sdramc @ preload constants | 25 | at91sam9_alt_restart: ldr r0, .at91_va_base_sdramc @ preload constants |
26 | ldr r1, .at91_va_base_rstc_cr | 26 | ldr r1, =at91_rstc_base |
27 | ldr r1, [r1] | ||
27 | 28 | ||
28 | mov r2, #1 | 29 | mov r2, #1 |
29 | mov r3, #AT91_SDRAMC_LPCB_POWER_DOWN | 30 | mov r3, #AT91_SDRAMC_LPCB_POWER_DOWN |
@@ -33,11 +34,9 @@ at91sam9_alt_restart: ldr r0, .at91_va_base_sdramc @ preload constants | |||
33 | 34 | ||
34 | str r2, [r0, #AT91_SDRAMC_TR] @ disable SDRAM access | 35 | str r2, [r0, #AT91_SDRAMC_TR] @ disable SDRAM access |
35 | str r3, [r0, #AT91_SDRAMC_LPR] @ power down SDRAM | 36 | str r3, [r0, #AT91_SDRAMC_LPR] @ power down SDRAM |
36 | str r4, [r1] @ reset processor | 37 | str r4, [r1, #AT91_RSTC_CR] @ reset processor |
37 | 38 | ||
38 | b . | 39 | b . |
39 | 40 | ||
40 | .at91_va_base_sdramc: | 41 | .at91_va_base_sdramc: |
41 | .word AT91_VA_BASE_SYS + AT91_SDRAMC0 | 42 | .word AT91_VA_BASE_SYS + AT91_SDRAMC0 |
42 | .at91_va_base_rstc_cr: | ||
43 | .word AT91_VA_BASE_SYS + AT91_RSTC_CR | ||
diff --git a/arch/arm/mach-at91/at91sam9g45.c b/arch/arm/mach-at91/at91sam9g45.c index 7032dd32cdf0..1cb6a96b1c1e 100644 --- a/arch/arm/mach-at91/at91sam9g45.c +++ b/arch/arm/mach-at91/at91sam9g45.c | |||
@@ -18,7 +18,6 @@ | |||
18 | #include <asm/mach/map.h> | 18 | #include <asm/mach/map.h> |
19 | #include <mach/at91sam9g45.h> | 19 | #include <mach/at91sam9g45.h> |
20 | #include <mach/at91_pmc.h> | 20 | #include <mach/at91_pmc.h> |
21 | #include <mach/at91_rstc.h> | ||
22 | #include <mach/cpu.h> | 21 | #include <mach/cpu.h> |
23 | 22 | ||
24 | #include "soc.h" | 23 | #include "soc.h" |
@@ -318,11 +317,6 @@ static struct at91_gpio_bank at91sam9g45_gpio[] __initdata = { | |||
318 | } | 317 | } |
319 | }; | 318 | }; |
320 | 319 | ||
321 | static void at91sam9g45_restart(char mode, const char *cmd) | ||
322 | { | ||
323 | at91_sys_write(AT91_RSTC_CR, AT91_RSTC_KEY | AT91_RSTC_PROCRST | AT91_RSTC_PERRST); | ||
324 | } | ||
325 | |||
326 | /* -------------------------------------------------------------------- | 320 | /* -------------------------------------------------------------------- |
327 | * AT91SAM9G45 processor initialization | 321 | * AT91SAM9G45 processor initialization |
328 | * -------------------------------------------------------------------- */ | 322 | * -------------------------------------------------------------------- */ |
@@ -336,6 +330,7 @@ static void __init at91sam9g45_map_io(void) | |||
336 | static void __init at91sam9g45_ioremap_registers(void) | 330 | static void __init at91sam9g45_ioremap_registers(void) |
337 | { | 331 | { |
338 | at91_ioremap_shdwc(AT91SAM9G45_BASE_SHDWC); | 332 | at91_ioremap_shdwc(AT91SAM9G45_BASE_SHDWC); |
333 | at91_ioremap_rstc(AT91SAM9G45_BASE_RSTC); | ||
339 | at91sam926x_ioremap_pit(AT91SAM9G45_BASE_PIT); | 334 | at91sam926x_ioremap_pit(AT91SAM9G45_BASE_PIT); |
340 | at91sam9_ioremap_smc(0, AT91SAM9G45_BASE_SMC); | 335 | at91sam9_ioremap_smc(0, AT91SAM9G45_BASE_SMC); |
341 | } | 336 | } |
diff --git a/arch/arm/mach-at91/at91sam9g45_reset.S b/arch/arm/mach-at91/at91sam9g45_reset.S new file mode 100644 index 000000000000..0468be10980b --- /dev/null +++ b/arch/arm/mach-at91/at91sam9g45_reset.S | |||
@@ -0,0 +1,40 @@ | |||
1 | /* | ||
2 | * reset AT91SAM9G45 as per errata | ||
3 | * | ||
4 | * Copyright (C) 2011 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcosoft.com> | ||
5 | * | ||
6 | * unless the SDRAM is cleanly shutdown before we hit the | ||
7 | * reset register it can be left driving the data bus and | ||
8 | * killing the chance of a subsequent boot from NAND | ||
9 | * | ||
10 | * GPLv2 Only | ||
11 | */ | ||
12 | |||
13 | #include <linux/linkage.h> | ||
14 | #include <mach/hardware.h> | ||
15 | #include <mach/at91sam9_ddrsdr.h> | ||
16 | #include <mach/at91_rstc.h> | ||
17 | |||
18 | .arm | ||
19 | |||
20 | .globl at91sam9g45_restart | ||
21 | |||
22 | at91sam9g45_restart: | ||
23 | ldr r0, .at91_va_base_sdramc0 @ preload constants | ||
24 | ldr r1, =at91_rstc_base | ||
25 | ldr r1, [r1] | ||
26 | |||
27 | mov r2, #1 | ||
28 | mov r3, #AT91_DDRSDRC_LPCB_POWER_DOWN | ||
29 | ldr r4, =AT91_RSTC_KEY | AT91_RSTC_PERRST | AT91_RSTC_PROCRST | ||
30 | |||
31 | .balign 32 @ align to cache line | ||
32 | |||
33 | str r2, [r0, #AT91_DDRSDRC_RTR] @ disable DDR0 access | ||
34 | str r3, [r0, #AT91_DDRSDRC_LPR] @ power down DDR0 | ||
35 | str r4, [r1, #AT91_RSTC_CR] @ reset processor | ||
36 | |||
37 | b . | ||
38 | |||
39 | .at91_va_base_sdramc0: | ||
40 | .word AT91_VA_BASE_SYS + AT91_DDRSDRC0 | ||
diff --git a/arch/arm/mach-at91/at91sam9rl.c b/arch/arm/mach-at91/at91sam9rl.c index d6bcb1da11df..d2c91a841cb8 100644 --- a/arch/arm/mach-at91/at91sam9rl.c +++ b/arch/arm/mach-at91/at91sam9rl.c | |||
@@ -286,6 +286,7 @@ static void __init at91sam9rl_map_io(void) | |||
286 | static void __init at91sam9rl_ioremap_registers(void) | 286 | static void __init at91sam9rl_ioremap_registers(void) |
287 | { | 287 | { |
288 | at91_ioremap_shdwc(AT91SAM9RL_BASE_SHDWC); | 288 | at91_ioremap_shdwc(AT91SAM9RL_BASE_SHDWC); |
289 | at91_ioremap_rstc(AT91SAM9RL_BASE_RSTC); | ||
289 | at91sam926x_ioremap_pit(AT91SAM9RL_BASE_PIT); | 290 | at91sam926x_ioremap_pit(AT91SAM9RL_BASE_PIT); |
290 | at91sam9_ioremap_smc(0, AT91SAM9RL_BASE_SMC); | 291 | at91sam9_ioremap_smc(0, AT91SAM9RL_BASE_SMC); |
291 | } | 292 | } |
diff --git a/arch/arm/mach-at91/generic.h b/arch/arm/mach-at91/generic.h index 4866b8180d66..594133451c0c 100644 --- a/arch/arm/mach-at91/generic.h +++ b/arch/arm/mach-at91/generic.h | |||
@@ -58,7 +58,9 @@ extern void at91_irq_suspend(void); | |||
58 | extern void at91_irq_resume(void); | 58 | extern void at91_irq_resume(void); |
59 | 59 | ||
60 | /* reset */ | 60 | /* reset */ |
61 | extern void at91_ioremap_rstc(u32 base_addr); | ||
61 | extern void at91sam9_alt_restart(char, const char *); | 62 | extern void at91sam9_alt_restart(char, const char *); |
63 | extern void at91sam9g45_restart(char, const char *); | ||
62 | 64 | ||
63 | /* shutdown */ | 65 | /* shutdown */ |
64 | extern void at91_ioremap_shdwc(u32 base_addr); | 66 | extern void at91_ioremap_shdwc(u32 base_addr); |
diff --git a/arch/arm/mach-at91/include/mach/at91_rstc.h b/arch/arm/mach-at91/include/mach/at91_rstc.h index cbd2bf052c1f..875fa336800b 100644 --- a/arch/arm/mach-at91/include/mach/at91_rstc.h +++ b/arch/arm/mach-at91/include/mach/at91_rstc.h | |||
@@ -16,13 +16,25 @@ | |||
16 | #ifndef AT91_RSTC_H | 16 | #ifndef AT91_RSTC_H |
17 | #define AT91_RSTC_H | 17 | #define AT91_RSTC_H |
18 | 18 | ||
19 | #define AT91_RSTC_CR (AT91_RSTC + 0x00) /* Reset Controller Control Register */ | 19 | #ifndef __ASSEMBLY__ |
20 | extern void __iomem *at91_rstc_base; | ||
21 | |||
22 | #define at91_rstc_read(field) \ | ||
23 | __raw_readl(at91_rstc_base + field) | ||
24 | |||
25 | #define at91_rstc_write(field, value) \ | ||
26 | __raw_writel(value, at91_rstc_base + field); | ||
27 | #else | ||
28 | .extern at91_rstc_base | ||
29 | #endif | ||
30 | |||
31 | #define AT91_RSTC_CR 0x00 /* Reset Controller Control Register */ | ||
20 | #define AT91_RSTC_PROCRST (1 << 0) /* Processor Reset */ | 32 | #define AT91_RSTC_PROCRST (1 << 0) /* Processor Reset */ |
21 | #define AT91_RSTC_PERRST (1 << 2) /* Peripheral Reset */ | 33 | #define AT91_RSTC_PERRST (1 << 2) /* Peripheral Reset */ |
22 | #define AT91_RSTC_EXTRST (1 << 3) /* External Reset */ | 34 | #define AT91_RSTC_EXTRST (1 << 3) /* External Reset */ |
23 | #define AT91_RSTC_KEY (0xa5 << 24) /* KEY Password */ | 35 | #define AT91_RSTC_KEY (0xa5 << 24) /* KEY Password */ |
24 | 36 | ||
25 | #define AT91_RSTC_SR (AT91_RSTC + 0x04) /* Reset Controller Status Register */ | 37 | #define AT91_RSTC_SR 0x04 /* Reset Controller Status Register */ |
26 | #define AT91_RSTC_URSTS (1 << 0) /* User Reset Status */ | 38 | #define AT91_RSTC_URSTS (1 << 0) /* User Reset Status */ |
27 | #define AT91_RSTC_RSTTYP (7 << 8) /* Reset Type */ | 39 | #define AT91_RSTC_RSTTYP (7 << 8) /* Reset Type */ |
28 | #define AT91_RSTC_RSTTYP_GENERAL (0 << 8) | 40 | #define AT91_RSTC_RSTTYP_GENERAL (0 << 8) |
@@ -33,7 +45,7 @@ | |||
33 | #define AT91_RSTC_NRSTL (1 << 16) /* NRST Pin Level */ | 45 | #define AT91_RSTC_NRSTL (1 << 16) /* NRST Pin Level */ |
34 | #define AT91_RSTC_SRCMP (1 << 17) /* Software Reset Command in Progress */ | 46 | #define AT91_RSTC_SRCMP (1 << 17) /* Software Reset Command in Progress */ |
35 | 47 | ||
36 | #define AT91_RSTC_MR (AT91_RSTC + 0x08) /* Reset Controller Mode Register */ | 48 | #define AT91_RSTC_MR 0x08 /* Reset Controller Mode Register */ |
37 | #define AT91_RSTC_URSTEN (1 << 0) /* User Reset Enable */ | 49 | #define AT91_RSTC_URSTEN (1 << 0) /* User Reset Enable */ |
38 | #define AT91_RSTC_URSTIEN (1 << 4) /* User Reset Interrupt Enable */ | 50 | #define AT91_RSTC_URSTIEN (1 << 4) /* User Reset Interrupt Enable */ |
39 | #define AT91_RSTC_ERSTL (0xf << 8) /* External Reset Length */ | 51 | #define AT91_RSTC_ERSTL (0xf << 8) /* External Reset Length */ |
diff --git a/arch/arm/mach-at91/include/mach/at91cap9.h b/arch/arm/mach-at91/include/mach/at91cap9.h index 4c0e2f6011d7..61d952902f2b 100644 --- a/arch/arm/mach-at91/include/mach/at91cap9.h +++ b/arch/arm/mach-at91/include/mach/at91cap9.h | |||
@@ -83,7 +83,6 @@ | |||
83 | #define AT91_DDRSDRC0 (0xffffe600 - AT91_BASE_SYS) | 83 | #define AT91_DDRSDRC0 (0xffffe600 - AT91_BASE_SYS) |
84 | #define AT91_MATRIX (0xffffea00 - AT91_BASE_SYS) | 84 | #define AT91_MATRIX (0xffffea00 - AT91_BASE_SYS) |
85 | #define AT91_PMC (0xfffffc00 - AT91_BASE_SYS) | 85 | #define AT91_PMC (0xfffffc00 - AT91_BASE_SYS) |
86 | #define AT91_RSTC (0xfffffd00 - AT91_BASE_SYS) | ||
87 | #define AT91_GPBR (cpu_is_at91cap9_revB() ? \ | 86 | #define AT91_GPBR (cpu_is_at91cap9_revB() ? \ |
88 | (0xfffffd50 - AT91_BASE_SYS) : \ | 87 | (0xfffffd50 - AT91_BASE_SYS) : \ |
89 | (0xfffffd60 - AT91_BASE_SYS)) | 88 | (0xfffffd60 - AT91_BASE_SYS)) |
@@ -96,6 +95,7 @@ | |||
96 | #define AT91CAP9_BASE_PIOB 0xfffff400 | 95 | #define AT91CAP9_BASE_PIOB 0xfffff400 |
97 | #define AT91CAP9_BASE_PIOC 0xfffff600 | 96 | #define AT91CAP9_BASE_PIOC 0xfffff600 |
98 | #define AT91CAP9_BASE_PIOD 0xfffff800 | 97 | #define AT91CAP9_BASE_PIOD 0xfffff800 |
98 | #define AT91CAP9_BASE_RSTC 0xfffffd00 | ||
99 | #define AT91CAP9_BASE_SHDWC 0xfffffd10 | 99 | #define AT91CAP9_BASE_SHDWC 0xfffffd10 |
100 | #define AT91CAP9_BASE_RTT 0xfffffd20 | 100 | #define AT91CAP9_BASE_RTT 0xfffffd20 |
101 | #define AT91CAP9_BASE_PIT 0xfffffd30 | 101 | #define AT91CAP9_BASE_PIT 0xfffffd30 |
diff --git a/arch/arm/mach-at91/include/mach/at91cap9_ddrsdr.h b/arch/arm/mach-at91/include/mach/at91cap9_ddrsdr.h deleted file mode 100644 index 976f4a6c3353..000000000000 --- a/arch/arm/mach-at91/include/mach/at91cap9_ddrsdr.h +++ /dev/null | |||
@@ -1,108 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-at91/include/mach/at91cap9_ddrsdr.h | ||
3 | * | ||
4 | * (C) 2008 Andrew Victor | ||
5 | * | ||
6 | * DDR/SDR Controller (DDRSDRC) - System peripherals registers. | ||
7 | * Based on AT91CAP9 datasheet revision B. | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License as published by | ||
11 | * the Free Software Foundation; either version 2 of the License, or | ||
12 | * (at your option) any later version. | ||
13 | */ | ||
14 | |||
15 | #ifndef AT91CAP9_DDRSDR_H | ||
16 | #define AT91CAP9_DDRSDR_H | ||
17 | |||
18 | #define AT91_DDRSDRC_MR 0x00 /* Mode Register */ | ||
19 | #define AT91_DDRSDRC_MODE (0xf << 0) /* Command Mode */ | ||
20 | #define AT91_DDRSDRC_MODE_NORMAL 0 | ||
21 | #define AT91_DDRSDRC_MODE_NOP 1 | ||
22 | #define AT91_DDRSDRC_MODE_PRECHARGE 2 | ||
23 | #define AT91_DDRSDRC_MODE_LMR 3 | ||
24 | #define AT91_DDRSDRC_MODE_REFRESH 4 | ||
25 | #define AT91_DDRSDRC_MODE_EXT_LMR 5 | ||
26 | #define AT91_DDRSDRC_MODE_DEEP 6 | ||
27 | |||
28 | #define AT91_DDRSDRC_RTR 0x04 /* Refresh Timer Register */ | ||
29 | #define AT91_DDRSDRC_COUNT (0xfff << 0) /* Refresh Timer Counter */ | ||
30 | |||
31 | #define AT91_DDRSDRC_CR 0x08 /* Configuration Register */ | ||
32 | #define AT91_DDRSDRC_NC (3 << 0) /* Number of Column Bits */ | ||
33 | #define AT91_DDRSDRC_NC_SDR8 (0 << 0) | ||
34 | #define AT91_DDRSDRC_NC_SDR9 (1 << 0) | ||
35 | #define AT91_DDRSDRC_NC_SDR10 (2 << 0) | ||
36 | #define AT91_DDRSDRC_NC_SDR11 (3 << 0) | ||
37 | #define AT91_DDRSDRC_NC_DDR9 (0 << 0) | ||
38 | #define AT91_DDRSDRC_NC_DDR10 (1 << 0) | ||
39 | #define AT91_DDRSDRC_NC_DDR11 (2 << 0) | ||
40 | #define AT91_DDRSDRC_NC_DDR12 (3 << 0) | ||
41 | #define AT91_DDRSDRC_NR (3 << 2) /* Number of Row Bits */ | ||
42 | #define AT91_DDRSDRC_NR_11 (0 << 2) | ||
43 | #define AT91_DDRSDRC_NR_12 (1 << 2) | ||
44 | #define AT91_DDRSDRC_NR_13 (2 << 2) | ||
45 | #define AT91_DDRSDRC_CAS (7 << 4) /* CAS Latency */ | ||
46 | #define AT91_DDRSDRC_CAS_2 (2 << 4) | ||
47 | #define AT91_DDRSDRC_CAS_3 (3 << 4) | ||
48 | #define AT91_DDRSDRC_CAS_25 (6 << 4) | ||
49 | #define AT91_DDRSDRC_DLL (1 << 7) /* Reset DLL */ | ||
50 | #define AT91_DDRSDRC_DICDS (1 << 8) /* Output impedance control */ | ||
51 | |||
52 | #define AT91_DDRSDRC_T0PR 0x0C /* Timing 0 Register */ | ||
53 | #define AT91_DDRSDRC_TRAS (0xf << 0) /* Active to Precharge delay */ | ||
54 | #define AT91_DDRSDRC_TRCD (0xf << 4) /* Row to Column delay */ | ||
55 | #define AT91_DDRSDRC_TWR (0xf << 8) /* Write recovery delay */ | ||
56 | #define AT91_DDRSDRC_TRC (0xf << 12) /* Row cycle delay */ | ||
57 | #define AT91_DDRSDRC_TRP (0xf << 16) /* Row precharge delay */ | ||
58 | #define AT91_DDRSDRC_TRRD (0xf << 20) /* Active BankA to BankB */ | ||
59 | #define AT91_DDRSDRC_TWTR (1 << 24) /* Internal Write to Read delay */ | ||
60 | #define AT91_DDRSDRC_TMRD (0xf << 28) /* Load mode to active/refresh delay */ | ||
61 | |||
62 | #define AT91_DDRSDRC_T1PR 0x10 /* Timing 1 Register */ | ||
63 | #define AT91_DDRSDRC_TRFC (0x1f << 0) /* Row Cycle Delay */ | ||
64 | #define AT91_DDRSDRC_TXSNR (0xff << 8) /* Exit self-refresh to non-read */ | ||
65 | #define AT91_DDRSDRC_TXSRD (0xff << 16) /* Exit self-refresh to read */ | ||
66 | #define AT91_DDRSDRC_TXP (0xf << 24) /* Exit power-down delay */ | ||
67 | |||
68 | #define AT91_DDRSDRC_LPR 0x18 /* Low Power Register */ | ||
69 | #define AT91_DDRSDRC_LPCB (3 << 0) /* Low-power Configurations */ | ||
70 | #define AT91_DDRSDRC_LPCB_DISABLE 0 | ||
71 | #define AT91_DDRSDRC_LPCB_SELF_REFRESH 1 | ||
72 | #define AT91_DDRSDRC_LPCB_POWER_DOWN 2 | ||
73 | #define AT91_DDRSDRC_LPCB_DEEP_POWER_DOWN 3 | ||
74 | #define AT91_DDRSDRC_CLKFR (1 << 2) /* Clock Frozen */ | ||
75 | #define AT91_DDRSDRC_PASR (7 << 4) /* Partial Array Self Refresh */ | ||
76 | #define AT91_DDRSDRC_TCSR (3 << 8) /* Temperature Compensated Self Refresh */ | ||
77 | #define AT91_DDRSDRC_DS (3 << 10) /* Drive Strength */ | ||
78 | #define AT91_DDRSDRC_TIMEOUT (3 << 12) /* Time to define when Low Power Mode is enabled */ | ||
79 | #define AT91_DDRSDRC_TIMEOUT_0_CLK_CYCLES (0 << 12) | ||
80 | #define AT91_DDRSDRC_TIMEOUT_64_CLK_CYCLES (1 << 12) | ||
81 | #define AT91_DDRSDRC_TIMEOUT_128_CLK_CYCLES (2 << 12) | ||
82 | |||
83 | #define AT91_DDRSDRC_MDR 0x1C /* Memory Device Register */ | ||
84 | #define AT91_DDRSDRC_MD (3 << 0) /* Memory Device Type */ | ||
85 | #define AT91_DDRSDRC_MD_SDR 0 | ||
86 | #define AT91_DDRSDRC_MD_LOW_POWER_SDR 1 | ||
87 | #define AT91_DDRSDRC_MD_DDR 2 | ||
88 | #define AT91_DDRSDRC_MD_LOW_POWER_DDR 3 | ||
89 | |||
90 | #define AT91_DDRSDRC_DLLR 0x20 /* DLL Information Register */ | ||
91 | #define AT91_DDRSDRC_MDINC (1 << 0) /* Master Delay increment */ | ||
92 | #define AT91_DDRSDRC_MDDEC (1 << 1) /* Master Delay decrement */ | ||
93 | #define AT91_DDRSDRC_MDOVF (1 << 2) /* Master Delay Overflow */ | ||
94 | #define AT91_DDRSDRC_SDCOVF (1 << 3) /* Slave Delay Correction Overflow */ | ||
95 | #define AT91_DDRSDRC_SDCUDF (1 << 4) /* Slave Delay Correction Underflow */ | ||
96 | #define AT91_DDRSDRC_SDERF (1 << 5) /* Slave Delay Correction error */ | ||
97 | #define AT91_DDRSDRC_MDVAL (0xff << 8) /* Master Delay value */ | ||
98 | #define AT91_DDRSDRC_SDVAL (0xff << 16) /* Slave Delay value */ | ||
99 | #define AT91_DDRSDRC_SDCVAL (0xff << 24) /* Slave Delay Correction value */ | ||
100 | |||
101 | /* Register access macros */ | ||
102 | #define at91_ramc_read(num, reg) \ | ||
103 | at91_sys_read(AT91_DDRSDRC##num + reg) | ||
104 | #define at91_ramc_write(num, reg, value) \ | ||
105 | at91_sys_write(AT91_DDRSDRC##num + reg, value) | ||
106 | |||
107 | |||
108 | #endif | ||
diff --git a/arch/arm/mach-at91/include/mach/at91sam9260.h b/arch/arm/mach-at91/include/mach/at91sam9260.h index f937c476bb67..fa5ca278adeb 100644 --- a/arch/arm/mach-at91/include/mach/at91sam9260.h +++ b/arch/arm/mach-at91/include/mach/at91sam9260.h | |||
@@ -83,7 +83,6 @@ | |||
83 | #define AT91_SDRAMC0 (0xffffea00 - AT91_BASE_SYS) | 83 | #define AT91_SDRAMC0 (0xffffea00 - AT91_BASE_SYS) |
84 | #define AT91_MATRIX (0xffffee00 - AT91_BASE_SYS) | 84 | #define AT91_MATRIX (0xffffee00 - AT91_BASE_SYS) |
85 | #define AT91_PMC (0xfffffc00 - AT91_BASE_SYS) | 85 | #define AT91_PMC (0xfffffc00 - AT91_BASE_SYS) |
86 | #define AT91_RSTC (0xfffffd00 - AT91_BASE_SYS) | ||
87 | #define AT91_GPBR (0xfffffd50 - AT91_BASE_SYS) | 86 | #define AT91_GPBR (0xfffffd50 - AT91_BASE_SYS) |
88 | 87 | ||
89 | #define AT91SAM9260_BASE_ECC 0xffffe800 | 88 | #define AT91SAM9260_BASE_ECC 0xffffe800 |
@@ -92,6 +91,7 @@ | |||
92 | #define AT91SAM9260_BASE_PIOA 0xfffff400 | 91 | #define AT91SAM9260_BASE_PIOA 0xfffff400 |
93 | #define AT91SAM9260_BASE_PIOB 0xfffff600 | 92 | #define AT91SAM9260_BASE_PIOB 0xfffff600 |
94 | #define AT91SAM9260_BASE_PIOC 0xfffff800 | 93 | #define AT91SAM9260_BASE_PIOC 0xfffff800 |
94 | #define AT91SAM9260_BASE_RSTC 0xfffffd00 | ||
95 | #define AT91SAM9260_BASE_SHDWC 0xfffffd10 | 95 | #define AT91SAM9260_BASE_SHDWC 0xfffffd10 |
96 | #define AT91SAM9260_BASE_RTT 0xfffffd20 | 96 | #define AT91SAM9260_BASE_RTT 0xfffffd20 |
97 | #define AT91SAM9260_BASE_PIT 0xfffffd30 | 97 | #define AT91SAM9260_BASE_PIT 0xfffffd30 |
diff --git a/arch/arm/mach-at91/include/mach/at91sam9261.h b/arch/arm/mach-at91/include/mach/at91sam9261.h index 175604e261be..7cde2d36570e 100644 --- a/arch/arm/mach-at91/include/mach/at91sam9261.h +++ b/arch/arm/mach-at91/include/mach/at91sam9261.h | |||
@@ -68,7 +68,6 @@ | |||
68 | #define AT91_SDRAMC0 (0xffffea00 - AT91_BASE_SYS) | 68 | #define AT91_SDRAMC0 (0xffffea00 - AT91_BASE_SYS) |
69 | #define AT91_MATRIX (0xffffee00 - AT91_BASE_SYS) | 69 | #define AT91_MATRIX (0xffffee00 - AT91_BASE_SYS) |
70 | #define AT91_PMC (0xfffffc00 - AT91_BASE_SYS) | 70 | #define AT91_PMC (0xfffffc00 - AT91_BASE_SYS) |
71 | #define AT91_RSTC (0xfffffd00 - AT91_BASE_SYS) | ||
72 | #define AT91_GPBR (0xfffffd50 - AT91_BASE_SYS) | 71 | #define AT91_GPBR (0xfffffd50 - AT91_BASE_SYS) |
73 | 72 | ||
74 | #define AT91SAM9261_BASE_SMC 0xffffec00 | 73 | #define AT91SAM9261_BASE_SMC 0xffffec00 |
@@ -76,6 +75,7 @@ | |||
76 | #define AT91SAM9261_BASE_PIOA 0xfffff400 | 75 | #define AT91SAM9261_BASE_PIOA 0xfffff400 |
77 | #define AT91SAM9261_BASE_PIOB 0xfffff600 | 76 | #define AT91SAM9261_BASE_PIOB 0xfffff600 |
78 | #define AT91SAM9261_BASE_PIOC 0xfffff800 | 77 | #define AT91SAM9261_BASE_PIOC 0xfffff800 |
78 | #define AT91SAM9261_BASE_RSTC 0xfffffd00 | ||
79 | #define AT91SAM9261_BASE_SHDWC 0xfffffd10 | 79 | #define AT91SAM9261_BASE_SHDWC 0xfffffd10 |
80 | #define AT91SAM9261_BASE_RTT 0xfffffd20 | 80 | #define AT91SAM9261_BASE_RTT 0xfffffd20 |
81 | #define AT91SAM9261_BASE_PIT 0xfffffd30 | 81 | #define AT91SAM9261_BASE_PIT 0xfffffd30 |
diff --git a/arch/arm/mach-at91/include/mach/at91sam9263.h b/arch/arm/mach-at91/include/mach/at91sam9263.h index 80c915002d83..5949abda962b 100644 --- a/arch/arm/mach-at91/include/mach/at91sam9263.h +++ b/arch/arm/mach-at91/include/mach/at91sam9263.h | |||
@@ -78,7 +78,6 @@ | |||
78 | #define AT91_SDRAMC1 (0xffffe800 - AT91_BASE_SYS) | 78 | #define AT91_SDRAMC1 (0xffffe800 - AT91_BASE_SYS) |
79 | #define AT91_MATRIX (0xffffec00 - AT91_BASE_SYS) | 79 | #define AT91_MATRIX (0xffffec00 - AT91_BASE_SYS) |
80 | #define AT91_PMC (0xfffffc00 - AT91_BASE_SYS) | 80 | #define AT91_PMC (0xfffffc00 - AT91_BASE_SYS) |
81 | #define AT91_RSTC (0xfffffd00 - AT91_BASE_SYS) | ||
82 | #define AT91_GPBR (0xfffffd60 - AT91_BASE_SYS) | 81 | #define AT91_GPBR (0xfffffd60 - AT91_BASE_SYS) |
83 | 82 | ||
84 | #define AT91SAM9263_BASE_ECC0 0xffffe000 | 83 | #define AT91SAM9263_BASE_ECC0 0xffffe000 |
@@ -91,6 +90,7 @@ | |||
91 | #define AT91SAM9263_BASE_PIOC 0xfffff600 | 90 | #define AT91SAM9263_BASE_PIOC 0xfffff600 |
92 | #define AT91SAM9263_BASE_PIOD 0xfffff800 | 91 | #define AT91SAM9263_BASE_PIOD 0xfffff800 |
93 | #define AT91SAM9263_BASE_PIOE 0xfffffa00 | 92 | #define AT91SAM9263_BASE_PIOE 0xfffffa00 |
93 | #define AT91SAM9263_BASE_RSTC 0xfffffd00 | ||
94 | #define AT91SAM9263_BASE_SHDWC 0xfffffd10 | 94 | #define AT91SAM9263_BASE_SHDWC 0xfffffd10 |
95 | #define AT91SAM9263_BASE_RTT0 0xfffffd20 | 95 | #define AT91SAM9263_BASE_RTT0 0xfffffd20 |
96 | #define AT91SAM9263_BASE_PIT 0xfffffd30 | 96 | #define AT91SAM9263_BASE_PIT 0xfffffd30 |
diff --git a/arch/arm/mach-at91/include/mach/at91sam9_ddrsdr.h b/arch/arm/mach-at91/include/mach/at91sam9_ddrsdr.h index d27b15ba8ebf..e2f8da8ce5bc 100644 --- a/arch/arm/mach-at91/include/mach/at91sam9_ddrsdr.h +++ b/arch/arm/mach-at91/include/mach/at91sam9_ddrsdr.h | |||
@@ -46,10 +46,10 @@ | |||
46 | #define AT91_DDRSDRC_CAS_25 (6 << 4) | 46 | #define AT91_DDRSDRC_CAS_25 (6 << 4) |
47 | #define AT91_DDRSDRC_RST_DLL (1 << 7) /* Reset DLL */ | 47 | #define AT91_DDRSDRC_RST_DLL (1 << 7) /* Reset DLL */ |
48 | #define AT91_DDRSDRC_DICDS (1 << 8) /* Output impedance control */ | 48 | #define AT91_DDRSDRC_DICDS (1 << 8) /* Output impedance control */ |
49 | #define AT91_DDRSDRC_DIS_DLL (1 << 9) /* Disable DLL */ | 49 | #define AT91_DDRSDRC_DIS_DLL (1 << 9) /* Disable DLL [SAM9 Only] */ |
50 | #define AT91_DDRSDRC_OCD (1 << 12) /* Off-Chip Driver */ | 50 | #define AT91_DDRSDRC_OCD (1 << 12) /* Off-Chip Driver [SAM9 Only] */ |
51 | #define AT91_DDRSDRC_DQMS (1 << 16) /* Mask Data is Shared */ | 51 | #define AT91_DDRSDRC_DQMS (1 << 16) /* Mask Data is Shared [SAM9 Only] */ |
52 | #define AT91_DDRSDRC_ACTBST (1 << 18) /* Active Bank X to Burst Stop Read Access Bank Y */ | 52 | #define AT91_DDRSDRC_ACTBST (1 << 18) /* Active Bank X to Burst Stop Read Access Bank Y [SAM9 Only] */ |
53 | 53 | ||
54 | #define AT91_DDRSDRC_T0PR 0x0C /* Timing 0 Register */ | 54 | #define AT91_DDRSDRC_T0PR 0x0C /* Timing 0 Register */ |
55 | #define AT91_DDRSDRC_TRAS (0xf << 0) /* Active to Precharge delay */ | 55 | #define AT91_DDRSDRC_TRAS (0xf << 0) /* Active to Precharge delay */ |
@@ -59,7 +59,8 @@ | |||
59 | #define AT91_DDRSDRC_TRP (0xf << 16) /* Row precharge delay */ | 59 | #define AT91_DDRSDRC_TRP (0xf << 16) /* Row precharge delay */ |
60 | #define AT91_DDRSDRC_TRRD (0xf << 20) /* Active BankA to BankB */ | 60 | #define AT91_DDRSDRC_TRRD (0xf << 20) /* Active BankA to BankB */ |
61 | #define AT91_DDRSDRC_TWTR (0x7 << 24) /* Internal Write to Read delay */ | 61 | #define AT91_DDRSDRC_TWTR (0x7 << 24) /* Internal Write to Read delay */ |
62 | #define AT91_DDRSDRC_RED_WRRD (0x1 << 27) /* Reduce Write to Read Delay */ | 62 | #define AT91CAP9_DDRSDRC_TWTR (1 << 24) /* Internal Write to Read delay */ |
63 | #define AT91_DDRSDRC_RED_WRRD (0x1 << 27) /* Reduce Write to Read Delay [SAM9 Only] */ | ||
63 | #define AT91_DDRSDRC_TMRD (0xf << 28) /* Load mode to active/refresh delay */ | 64 | #define AT91_DDRSDRC_TMRD (0xf << 28) /* Load mode to active/refresh delay */ |
64 | 65 | ||
65 | #define AT91_DDRSDRC_T1PR 0x10 /* Timing 1 Register */ | 66 | #define AT91_DDRSDRC_T1PR 0x10 /* Timing 1 Register */ |
@@ -68,13 +69,14 @@ | |||
68 | #define AT91_DDRSDRC_TXSRD (0xff << 16) /* Exit self-refresh to read */ | 69 | #define AT91_DDRSDRC_TXSRD (0xff << 16) /* Exit self-refresh to read */ |
69 | #define AT91_DDRSDRC_TXP (0xf << 24) /* Exit power-down delay */ | 70 | #define AT91_DDRSDRC_TXP (0xf << 24) /* Exit power-down delay */ |
70 | 71 | ||
71 | #define AT91_DDRSDRC_T2PR 0x14 /* Timing 2 Register */ | 72 | #define AT91_DDRSDRC_T2PR 0x14 /* Timing 2 Register [SAM9 Only] */ |
72 | #define AT91_DDRSDRC_TXARD (0xf << 0) /* Exit active power down delay to read command in mode "Fast Exit" */ | 73 | #define AT91_DDRSDRC_TXARD (0xf << 0) /* Exit active power down delay to read command in mode "Fast Exit" */ |
73 | #define AT91_DDRSDRC_TXARDS (0xf << 4) /* Exit active power down delay to read command in mode "Slow Exit" */ | 74 | #define AT91_DDRSDRC_TXARDS (0xf << 4) /* Exit active power down delay to read command in mode "Slow Exit" */ |
74 | #define AT91_DDRSDRC_TRPA (0xf << 8) /* Row Precharge All delay */ | 75 | #define AT91_DDRSDRC_TRPA (0xf << 8) /* Row Precharge All delay */ |
75 | #define AT91_DDRSDRC_TRTP (0x7 << 12) /* Read to Precharge delay */ | 76 | #define AT91_DDRSDRC_TRTP (0x7 << 12) /* Read to Precharge delay */ |
76 | 77 | ||
77 | #define AT91_DDRSDRC_LPR 0x1C /* Low Power Register */ | 78 | #define AT91_DDRSDRC_LPR 0x1C /* Low Power Register */ |
79 | #define AT91CAP9_DDRSDRC_LPR 0x18 /* Low Power Register */ | ||
78 | #define AT91_DDRSDRC_LPCB (3 << 0) /* Low-power Configurations */ | 80 | #define AT91_DDRSDRC_LPCB (3 << 0) /* Low-power Configurations */ |
79 | #define AT91_DDRSDRC_LPCB_DISABLE 0 | 81 | #define AT91_DDRSDRC_LPCB_DISABLE 0 |
80 | #define AT91_DDRSDRC_LPCB_SELF_REFRESH 1 | 82 | #define AT91_DDRSDRC_LPCB_SELF_REFRESH 1 |
@@ -92,32 +94,40 @@ | |||
92 | #define AT91_DDRSDRC_UPD_MR (3 << 20) /* Update load mode register and extended mode register */ | 94 | #define AT91_DDRSDRC_UPD_MR (3 << 20) /* Update load mode register and extended mode register */ |
93 | 95 | ||
94 | #define AT91_DDRSDRC_MDR 0x20 /* Memory Device Register */ | 96 | #define AT91_DDRSDRC_MDR 0x20 /* Memory Device Register */ |
97 | #define AT91CAP9_DDRSDRC_MDR 0x1C /* Memory Device Register */ | ||
95 | #define AT91_DDRSDRC_MD (3 << 0) /* Memory Device Type */ | 98 | #define AT91_DDRSDRC_MD (3 << 0) /* Memory Device Type */ |
96 | #define AT91_DDRSDRC_MD_SDR 0 | 99 | #define AT91_DDRSDRC_MD_SDR 0 |
97 | #define AT91_DDRSDRC_MD_LOW_POWER_SDR 1 | 100 | #define AT91_DDRSDRC_MD_LOW_POWER_SDR 1 |
101 | #define AT91CAP9_DDRSDRC_MD_DDR 2 | ||
98 | #define AT91_DDRSDRC_MD_LOW_POWER_DDR 3 | 102 | #define AT91_DDRSDRC_MD_LOW_POWER_DDR 3 |
99 | #define AT91_DDRSDRC_MD_DDR2 6 | 103 | #define AT91_DDRSDRC_MD_DDR2 6 /* [SAM9 Only] */ |
100 | #define AT91_DDRSDRC_DBW (1 << 4) /* Data Bus Width */ | 104 | #define AT91_DDRSDRC_DBW (1 << 4) /* Data Bus Width */ |
101 | #define AT91_DDRSDRC_DBW_32BITS (0 << 4) | 105 | #define AT91_DDRSDRC_DBW_32BITS (0 << 4) |
102 | #define AT91_DDRSDRC_DBW_16BITS (1 << 4) | 106 | #define AT91_DDRSDRC_DBW_16BITS (1 << 4) |
103 | 107 | ||
104 | #define AT91_DDRSDRC_DLL 0x24 /* DLL Information Register */ | 108 | #define AT91_DDRSDRC_DLL 0x24 /* DLL Information Register */ |
109 | #define AT91CAP9_DDRSDRC_DLL 0x20 /* DLL Information Register */ | ||
105 | #define AT91_DDRSDRC_MDINC (1 << 0) /* Master Delay increment */ | 110 | #define AT91_DDRSDRC_MDINC (1 << 0) /* Master Delay increment */ |
106 | #define AT91_DDRSDRC_MDDEC (1 << 1) /* Master Delay decrement */ | 111 | #define AT91_DDRSDRC_MDDEC (1 << 1) /* Master Delay decrement */ |
107 | #define AT91_DDRSDRC_MDOVF (1 << 2) /* Master Delay Overflow */ | 112 | #define AT91_DDRSDRC_MDOVF (1 << 2) /* Master Delay Overflow */ |
113 | #define AT91CAP9_DDRSDRC_SDCOVF (1 << 3) /* Slave Delay Correction Overflow */ | ||
114 | #define AT91CAP9_DDRSDRC_SDCUDF (1 << 4) /* Slave Delay Correction Underflow */ | ||
115 | #define AT91CAP9_DDRSDRC_SDERF (1 << 5) /* Slave Delay Correction error */ | ||
108 | #define AT91_DDRSDRC_MDVAL (0xff << 8) /* Master Delay value */ | 116 | #define AT91_DDRSDRC_MDVAL (0xff << 8) /* Master Delay value */ |
117 | #define AT91CAP9_DDRSDRC_SDVAL (0xff << 16) /* Slave Delay value */ | ||
118 | #define AT91CAP9_DDRSDRC_SDCVAL (0xff << 24) /* Slave Delay Correction value */ | ||
109 | 119 | ||
110 | #define AT91_DDRSDRC_HS 0x2C /* High Speed Register */ | 120 | #define AT91_DDRSDRC_HS 0x2C /* High Speed Register [SAM9 Only] */ |
111 | #define AT91_DDRSDRC_DIS_ATCP_RD (1 << 2) /* Anticip read access is disabled */ | 121 | #define AT91_DDRSDRC_DIS_ATCP_RD (1 << 2) /* Anticip read access is disabled */ |
112 | 122 | ||
113 | #define AT91_DDRSDRC_DELAY(n) (0x30 + (0x4 * (n))) /* Delay I/O Register n */ | 123 | #define AT91_DDRSDRC_DELAY(n) (0x30 + (0x4 * (n))) /* Delay I/O Register n */ |
114 | 124 | ||
115 | #define AT91_DDRSDRC_WPMR 0xE4 /* Write Protect Mode Register */ | 125 | #define AT91_DDRSDRC_WPMR 0xE4 /* Write Protect Mode Register [SAM9 Only] */ |
116 | #define AT91_DDRSDRC_WP (1 << 0) /* Write protect enable */ | 126 | #define AT91_DDRSDRC_WP (1 << 0) /* Write protect enable */ |
117 | #define AT91_DDRSDRC_WPKEY (0xffffff << 8) /* Write protect key */ | 127 | #define AT91_DDRSDRC_WPKEY (0xffffff << 8) /* Write protect key */ |
118 | #define AT91_DDRSDRC_KEY (0x444452 << 8) /* Write protect key = "DDR" */ | 128 | #define AT91_DDRSDRC_KEY (0x444452 << 8) /* Write protect key = "DDR" */ |
119 | 129 | ||
120 | #define AT91_DDRSDRC_WPSR 0xE8 /* Write Protect Status Register */ | 130 | #define AT91_DDRSDRC_WPSR 0xE8 /* Write Protect Status Register [SAM9 Only] */ |
121 | #define AT91_DDRSDRC_WPVS (1 << 0) /* Write protect violation status */ | 131 | #define AT91_DDRSDRC_WPVS (1 << 0) /* Write protect violation status */ |
122 | #define AT91_DDRSDRC_WPVSRC (0xffff << 8) /* Write protect violation source */ | 132 | #define AT91_DDRSDRC_WPVSRC (0xffff << 8) /* Write protect violation source */ |
123 | 133 | ||
diff --git a/arch/arm/mach-at91/include/mach/at91sam9g45.h b/arch/arm/mach-at91/include/mach/at91sam9g45.h index f0c23c960dec..dd9c95ea0862 100644 --- a/arch/arm/mach-at91/include/mach/at91sam9g45.h +++ b/arch/arm/mach-at91/include/mach/at91sam9g45.h | |||
@@ -90,7 +90,6 @@ | |||
90 | #define AT91_DDRSDRC0 (0xffffe600 - AT91_BASE_SYS) | 90 | #define AT91_DDRSDRC0 (0xffffe600 - AT91_BASE_SYS) |
91 | #define AT91_MATRIX (0xffffea00 - AT91_BASE_SYS) | 91 | #define AT91_MATRIX (0xffffea00 - AT91_BASE_SYS) |
92 | #define AT91_PMC (0xfffffc00 - AT91_BASE_SYS) | 92 | #define AT91_PMC (0xfffffc00 - AT91_BASE_SYS) |
93 | #define AT91_RSTC (0xfffffd00 - AT91_BASE_SYS) | ||
94 | #define AT91_GPBR (0xfffffd60 - AT91_BASE_SYS) | 93 | #define AT91_GPBR (0xfffffd60 - AT91_BASE_SYS) |
95 | 94 | ||
96 | #define AT91SAM9G45_BASE_ECC 0xffffe200 | 95 | #define AT91SAM9G45_BASE_ECC 0xffffe200 |
@@ -102,6 +101,7 @@ | |||
102 | #define AT91SAM9G45_BASE_PIOC 0xfffff600 | 101 | #define AT91SAM9G45_BASE_PIOC 0xfffff600 |
103 | #define AT91SAM9G45_BASE_PIOD 0xfffff800 | 102 | #define AT91SAM9G45_BASE_PIOD 0xfffff800 |
104 | #define AT91SAM9G45_BASE_PIOE 0xfffffa00 | 103 | #define AT91SAM9G45_BASE_PIOE 0xfffffa00 |
104 | #define AT91SAM9G45_BASE_RSTC 0xfffffd00 | ||
105 | #define AT91SAM9G45_BASE_SHDWC 0xfffffd10 | 105 | #define AT91SAM9G45_BASE_SHDWC 0xfffffd10 |
106 | #define AT91SAM9G45_BASE_RTT 0xfffffd20 | 106 | #define AT91SAM9G45_BASE_RTT 0xfffffd20 |
107 | #define AT91SAM9G45_BASE_PIT 0xfffffd30 | 107 | #define AT91SAM9G45_BASE_PIT 0xfffffd30 |
diff --git a/arch/arm/mach-at91/include/mach/at91sam9rl.h b/arch/arm/mach-at91/include/mach/at91sam9rl.h index 2bb359e60b97..d7bead7118da 100644 --- a/arch/arm/mach-at91/include/mach/at91sam9rl.h +++ b/arch/arm/mach-at91/include/mach/at91sam9rl.h | |||
@@ -72,7 +72,6 @@ | |||
72 | #define AT91_SDRAMC0 (0xffffea00 - AT91_BASE_SYS) | 72 | #define AT91_SDRAMC0 (0xffffea00 - AT91_BASE_SYS) |
73 | #define AT91_MATRIX (0xffffee00 - AT91_BASE_SYS) | 73 | #define AT91_MATRIX (0xffffee00 - AT91_BASE_SYS) |
74 | #define AT91_PMC (0xfffffc00 - AT91_BASE_SYS) | 74 | #define AT91_PMC (0xfffffc00 - AT91_BASE_SYS) |
75 | #define AT91_RSTC (0xfffffd00 - AT91_BASE_SYS) | ||
76 | #define AT91_SCKCR (0xfffffd50 - AT91_BASE_SYS) | 75 | #define AT91_SCKCR (0xfffffd50 - AT91_BASE_SYS) |
77 | #define AT91_GPBR (0xfffffd60 - AT91_BASE_SYS) | 76 | #define AT91_GPBR (0xfffffd60 - AT91_BASE_SYS) |
78 | 77 | ||
@@ -84,6 +83,7 @@ | |||
84 | #define AT91SAM9RL_BASE_PIOB 0xfffff600 | 83 | #define AT91SAM9RL_BASE_PIOB 0xfffff600 |
85 | #define AT91SAM9RL_BASE_PIOC 0xfffff800 | 84 | #define AT91SAM9RL_BASE_PIOC 0xfffff800 |
86 | #define AT91SAM9RL_BASE_PIOD 0xfffffa00 | 85 | #define AT91SAM9RL_BASE_PIOD 0xfffffa00 |
86 | #define AT91SAM9RL_BASE_RSTC 0xfffffd00 | ||
87 | #define AT91SAM9RL_BASE_SHDWC 0xfffffd10 | 87 | #define AT91SAM9RL_BASE_SHDWC 0xfffffd10 |
88 | #define AT91SAM9RL_BASE_RTT 0xfffffd20 | 88 | #define AT91SAM9RL_BASE_RTT 0xfffffd20 |
89 | #define AT91SAM9RL_BASE_PIT 0xfffffd30 | 89 | #define AT91SAM9RL_BASE_PIT 0xfffffd30 |
diff --git a/arch/arm/mach-at91/include/mach/board.h b/arch/arm/mach-at91/include/mach/board.h index d0b377b21bd7..3b33f07b1e11 100644 --- a/arch/arm/mach-at91/include/mach/board.h +++ b/arch/arm/mach-at91/include/mach/board.h | |||
@@ -88,7 +88,7 @@ extern void __init at91_add_device_eth(struct macb_platform_data *data); | |||
88 | struct at91_usbh_data { | 88 | struct at91_usbh_data { |
89 | u8 ports; /* number of ports on root hub */ | 89 | u8 ports; /* number of ports on root hub */ |
90 | int vbus_pin[2]; /* port power-control pin */ | 90 | int vbus_pin[2]; /* port power-control pin */ |
91 | u8 vbus_pin_inverted; | 91 | u8 vbus_pin_active_low[2]; |
92 | u8 overcurrent_supported; | 92 | u8 overcurrent_supported; |
93 | int overcurrent_pin[2]; | 93 | int overcurrent_pin[2]; |
94 | u8 overcurrent_status[2]; | 94 | u8 overcurrent_status[2]; |
diff --git a/arch/arm/mach-at91/pm.c b/arch/arm/mach-at91/pm.c index 62ad95556c36..1606379ac284 100644 --- a/arch/arm/mach-at91/pm.c +++ b/arch/arm/mach-at91/pm.c | |||
@@ -34,7 +34,6 @@ | |||
34 | /* | 34 | /* |
35 | * Show the reason for the previous system reset. | 35 | * Show the reason for the previous system reset. |
36 | */ | 36 | */ |
37 | #if defined(AT91_RSTC) | ||
38 | 37 | ||
39 | #include <mach/at91_rstc.h> | 38 | #include <mach/at91_rstc.h> |
40 | #include <mach/at91_shdwc.h> | 39 | #include <mach/at91_shdwc.h> |
@@ -58,10 +57,10 @@ static void __init show_reset_status(void) | |||
58 | char *reason, *r2 = reset; | 57 | char *reason, *r2 = reset; |
59 | u32 reset_type, wake_type; | 58 | u32 reset_type, wake_type; |
60 | 59 | ||
61 | if (!at91_shdwc_base) | 60 | if (!at91_shdwc_base || !at91_rstc_base) |
62 | return; | 61 | return; |
63 | 62 | ||
64 | reset_type = at91_sys_read(AT91_RSTC_SR) & AT91_RSTC_RSTTYP; | 63 | reset_type = at91_rstc_read(AT91_RSTC_SR) & AT91_RSTC_RSTTYP; |
65 | wake_type = at91_shdwc_read(AT91_SHDW_SR); | 64 | wake_type = at91_shdwc_read(AT91_SHDW_SR); |
66 | 65 | ||
67 | switch (reset_type) { | 66 | switch (reset_type) { |
@@ -102,10 +101,6 @@ static void __init show_reset_status(void) | |||
102 | } | 101 | } |
103 | pr_info("AT91: Starting after %s %s\n", reason, r2); | 102 | pr_info("AT91: Starting after %s %s\n", reason, r2); |
104 | } | 103 | } |
105 | #else | ||
106 | static void __init show_reset_status(void) {} | ||
107 | #endif | ||
108 | |||
109 | 104 | ||
110 | static int at91_pm_valid_state(suspend_state_t state) | 105 | static int at91_pm_valid_state(suspend_state_t state) |
111 | { | 106 | { |
diff --git a/arch/arm/mach-at91/pm.h b/arch/arm/mach-at91/pm.h index ce9a20699111..7eb40d24242f 100644 --- a/arch/arm/mach-at91/pm.h +++ b/arch/arm/mach-at91/pm.h | |||
@@ -25,21 +25,21 @@ static inline u32 sdram_selfrefresh_enable(void) | |||
25 | : : "r" (0)) | 25 | : : "r" (0)) |
26 | 26 | ||
27 | #elif defined(CONFIG_ARCH_AT91CAP9) | 27 | #elif defined(CONFIG_ARCH_AT91CAP9) |
28 | #include <mach/at91cap9_ddrsdr.h> | 28 | #include <mach/at91sam9_ddrsdr.h> |
29 | 29 | ||
30 | 30 | ||
31 | static inline u32 sdram_selfrefresh_enable(void) | 31 | static inline u32 sdram_selfrefresh_enable(void) |
32 | { | 32 | { |
33 | u32 saved_lpr, lpr; | 33 | u32 saved_lpr, lpr; |
34 | 34 | ||
35 | saved_lpr = at91_ramc_read(0, AT91_DDRSDRC_LPR); | 35 | saved_lpr = at91_ramc_read(0, AT91CAP9_DDRSDRC_LPR); |
36 | 36 | ||
37 | lpr = saved_lpr & ~AT91_DDRSDRC_LPCB; | 37 | lpr = saved_lpr & ~AT91_DDRSDRC_LPCB; |
38 | at91_ramc_write(0, AT91_DDRSDRC_LPR, lpr | AT91_DDRSDRC_LPCB_SELF_REFRESH); | 38 | at91_ramc_write(0, AT91CAP9_DDRSDRC_LPR, lpr | AT91_DDRSDRC_LPCB_SELF_REFRESH); |
39 | return saved_lpr; | 39 | return saved_lpr; |
40 | } | 40 | } |
41 | 41 | ||
42 | #define sdram_selfrefresh_disable(saved_lpr) at91_ramc_write(0, AT91_DDRSDRC_LPR, saved_lpr) | 42 | #define sdram_selfrefresh_disable(saved_lpr) at91_ramc_write(0, AT91CAP9_DDRSDRC_LPR, saved_lpr) |
43 | #define wait_for_interrupt_enable() cpu_do_idle() | 43 | #define wait_for_interrupt_enable() cpu_do_idle() |
44 | 44 | ||
45 | #elif defined(CONFIG_ARCH_AT91SAM9G45) | 45 | #elif defined(CONFIG_ARCH_AT91SAM9G45) |
diff --git a/arch/arm/mach-at91/pm_slowclock.S b/arch/arm/mach-at91/pm_slowclock.S index f7922a436172..92dfb8461392 100644 --- a/arch/arm/mach-at91/pm_slowclock.S +++ b/arch/arm/mach-at91/pm_slowclock.S | |||
@@ -18,9 +18,8 @@ | |||
18 | 18 | ||
19 | #if defined(CONFIG_ARCH_AT91RM9200) | 19 | #if defined(CONFIG_ARCH_AT91RM9200) |
20 | #include <mach/at91rm9200_mc.h> | 20 | #include <mach/at91rm9200_mc.h> |
21 | #elif defined(CONFIG_ARCH_AT91CAP9) | 21 | #elif defined(CONFIG_ARCH_AT91CAP9) \ |
22 | #include <mach/at91cap9_ddrsdr.h> | 22 | || defined(CONFIG_ARCH_AT91SAM9G45) |
23 | #elif defined(CONFIG_ARCH_AT91SAM9G45) | ||
24 | #include <mach/at91sam9_ddrsdr.h> | 23 | #include <mach/at91sam9_ddrsdr.h> |
25 | #else | 24 | #else |
26 | #include <mach/at91sam9_sdramc.h> | 25 | #include <mach/at91sam9_sdramc.h> |
diff --git a/arch/arm/mach-at91/setup.c b/arch/arm/mach-at91/setup.c index 8bdcc3cb6012..69d3fc4c46f3 100644 --- a/arch/arm/mach-at91/setup.c +++ b/arch/arm/mach-at91/setup.c | |||
@@ -29,9 +29,12 @@ EXPORT_SYMBOL(at91_soc_initdata); | |||
29 | void __init at91rm9200_set_type(int type) | 29 | void __init at91rm9200_set_type(int type) |
30 | { | 30 | { |
31 | if (type == ARCH_REVISON_9200_PQFP) | 31 | if (type == ARCH_REVISON_9200_PQFP) |
32 | at91_soc_initdata.subtype = AT91_SOC_RM9200_BGA; | ||
33 | else | ||
34 | at91_soc_initdata.subtype = AT91_SOC_RM9200_PQFP; | 32 | at91_soc_initdata.subtype = AT91_SOC_RM9200_PQFP; |
33 | else | ||
34 | at91_soc_initdata.subtype = AT91_SOC_RM9200_BGA; | ||
35 | |||
36 | pr_info("AT91: filled in soc subtype: %s\n", | ||
37 | at91_get_soc_subtype(&at91_soc_initdata)); | ||
35 | } | 38 | } |
36 | 39 | ||
37 | void __init at91_init_irq_default(void) | 40 | void __init at91_init_irq_default(void) |
@@ -281,6 +284,15 @@ void __init at91_ioremap_shdwc(u32 base_addr) | |||
281 | pm_power_off = at91sam9_poweroff; | 284 | pm_power_off = at91sam9_poweroff; |
282 | } | 285 | } |
283 | 286 | ||
287 | void __iomem *at91_rstc_base; | ||
288 | |||
289 | void __init at91_ioremap_rstc(u32 base_addr) | ||
290 | { | ||
291 | at91_rstc_base = ioremap(base_addr, 16); | ||
292 | if (!at91_rstc_base) | ||
293 | panic("Impossible to ioremap at91_rstc_base\n"); | ||
294 | } | ||
295 | |||
284 | void __init at91_initialize(unsigned long main_clock) | 296 | void __init at91_initialize(unsigned long main_clock) |
285 | { | 297 | { |
286 | at91_boot_soc.ioremap_registers(); | 298 | at91_boot_soc.ioremap_registers(); |
diff --git a/arch/arm/mach-exynos/hotplug.c b/arch/arm/mach-exynos/hotplug.c index da70e7e39937..dd1ad55524c9 100644 --- a/arch/arm/mach-exynos/hotplug.c +++ b/arch/arm/mach-exynos/hotplug.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/io.h> | 16 | #include <linux/io.h> |
17 | 17 | ||
18 | #include <asm/cacheflush.h> | 18 | #include <asm/cacheflush.h> |
19 | #include <asm/smp_plat.h> | ||
19 | 20 | ||
20 | #include <mach/regs-pmu.h> | 21 | #include <mach/regs-pmu.h> |
21 | 22 | ||
diff --git a/arch/arm/mach-exynos/platsmp.c b/arch/arm/mach-exynos/platsmp.c index 683aec786b78..0f2035a1eb6e 100644 --- a/arch/arm/mach-exynos/platsmp.c +++ b/arch/arm/mach-exynos/platsmp.c | |||
@@ -23,6 +23,7 @@ | |||
23 | 23 | ||
24 | #include <asm/cacheflush.h> | 24 | #include <asm/cacheflush.h> |
25 | #include <asm/hardware/gic.h> | 25 | #include <asm/hardware/gic.h> |
26 | #include <asm/smp_plat.h> | ||
26 | #include <asm/smp_scu.h> | 27 | #include <asm/smp_scu.h> |
27 | 28 | ||
28 | #include <mach/hardware.h> | 29 | #include <mach/hardware.h> |
diff --git a/arch/arm/mach-highbank/highbank.c b/arch/arm/mach-highbank/highbank.c index 7afbe1e55beb..8394d512a402 100644 --- a/arch/arm/mach-highbank/highbank.c +++ b/arch/arm/mach-highbank/highbank.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <linux/smp.h> | 25 | #include <linux/smp.h> |
26 | 26 | ||
27 | #include <asm/cacheflush.h> | 27 | #include <asm/cacheflush.h> |
28 | #include <asm/smp_plat.h> | ||
28 | #include <asm/smp_scu.h> | 29 | #include <asm/smp_scu.h> |
29 | #include <asm/hardware/arm_timer.h> | 30 | #include <asm/hardware/arm_timer.h> |
30 | #include <asm/hardware/timer-sp.h> | 31 | #include <asm/hardware/timer-sp.h> |
@@ -72,9 +73,7 @@ static void __init highbank_map_io(void) | |||
72 | 73 | ||
73 | void highbank_set_cpu_jump(int cpu, void *jump_addr) | 74 | void highbank_set_cpu_jump(int cpu, void *jump_addr) |
74 | { | 75 | { |
75 | #ifdef CONFIG_SMP | ||
76 | cpu = cpu_logical_map(cpu); | 76 | cpu = cpu_logical_map(cpu); |
77 | #endif | ||
78 | writel(virt_to_phys(jump_addr), HB_JUMP_TABLE_VIRT(cpu)); | 77 | writel(virt_to_phys(jump_addr), HB_JUMP_TABLE_VIRT(cpu)); |
79 | __cpuc_flush_dcache_area(HB_JUMP_TABLE_VIRT(cpu), 16); | 78 | __cpuc_flush_dcache_area(HB_JUMP_TABLE_VIRT(cpu), 16); |
80 | outer_clean_range(HB_JUMP_TABLE_PHYS(cpu), | 79 | outer_clean_range(HB_JUMP_TABLE_PHYS(cpu), |
diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig index 0e6de366c648..4defb97bbfc8 100644 --- a/arch/arm/mach-imx/Kconfig +++ b/arch/arm/mach-imx/Kconfig | |||
@@ -22,6 +22,18 @@ config ARCH_MX25 | |||
22 | config MACH_MX27 | 22 | config MACH_MX27 |
23 | bool | 23 | bool |
24 | 24 | ||
25 | config ARCH_MX5 | ||
26 | bool | ||
27 | |||
28 | config ARCH_MX50 | ||
29 | bool | ||
30 | |||
31 | config ARCH_MX51 | ||
32 | bool | ||
33 | |||
34 | config ARCH_MX53 | ||
35 | bool | ||
36 | |||
25 | config SOC_IMX1 | 37 | config SOC_IMX1 |
26 | bool | 38 | bool |
27 | select ARCH_MX1 | 39 | select ARCH_MX1 |
@@ -73,6 +85,31 @@ config SOC_IMX35 | |||
73 | select MXC_AVIC | 85 | select MXC_AVIC |
74 | select SMP_ON_UP if SMP | 86 | select SMP_ON_UP if SMP |
75 | 87 | ||
88 | config SOC_IMX5 | ||
89 | select CPU_V7 | ||
90 | select MXC_TZIC | ||
91 | select ARCH_MXC_IOMUX_V3 | ||
92 | select ARCH_MXC_AUDMUX_V2 | ||
93 | select ARCH_HAS_CPUFREQ | ||
94 | select ARCH_MX5 | ||
95 | bool | ||
96 | |||
97 | config SOC_IMX50 | ||
98 | bool | ||
99 | select SOC_IMX5 | ||
100 | select ARCH_MX50 | ||
101 | |||
102 | config SOC_IMX51 | ||
103 | bool | ||
104 | select SOC_IMX5 | ||
105 | select ARCH_MX5 | ||
106 | select ARCH_MX51 | ||
107 | |||
108 | config SOC_IMX53 | ||
109 | bool | ||
110 | select SOC_IMX5 | ||
111 | select ARCH_MX5 | ||
112 | select ARCH_MX53 | ||
76 | 113 | ||
77 | if ARCH_IMX_V4_V5 | 114 | if ARCH_IMX_V4_V5 |
78 | 115 | ||
@@ -592,6 +629,207 @@ config MACH_VPR200 | |||
592 | Include support for VPR200 platform. This includes specific | 629 | Include support for VPR200 platform. This includes specific |
593 | configurations for the board and its peripherals. | 630 | configurations for the board and its peripherals. |
594 | 631 | ||
632 | comment "i.MX5 platforms:" | ||
633 | |||
634 | config MACH_MX50_RDP | ||
635 | bool "Support MX50 reference design platform" | ||
636 | depends on BROKEN | ||
637 | select SOC_IMX50 | ||
638 | select IMX_HAVE_PLATFORM_IMX_I2C | ||
639 | select IMX_HAVE_PLATFORM_IMX_UART | ||
640 | select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX | ||
641 | select IMX_HAVE_PLATFORM_SPI_IMX | ||
642 | help | ||
643 | Include support for MX50 reference design platform (RDP) board. This | ||
644 | includes specific configurations for the board and its peripherals. | ||
645 | |||
646 | comment "i.MX51 machines:" | ||
647 | |||
648 | config MACH_IMX51_DT | ||
649 | bool "Support i.MX51 platforms from device tree" | ||
650 | select SOC_IMX51 | ||
651 | select USE_OF | ||
652 | select MACH_MX51_BABBAGE | ||
653 | help | ||
654 | Include support for Freescale i.MX51 based platforms | ||
655 | using the device tree for discovery | ||
656 | |||
657 | config MACH_MX51_BABBAGE | ||
658 | bool "Support MX51 BABBAGE platforms" | ||
659 | select SOC_IMX51 | ||
660 | select IMX_HAVE_PLATFORM_FSL_USB2_UDC | ||
661 | select IMX_HAVE_PLATFORM_IMX2_WDT | ||
662 | select IMX_HAVE_PLATFORM_IMX_I2C | ||
663 | select IMX_HAVE_PLATFORM_IMX_UART | ||
664 | select IMX_HAVE_PLATFORM_MXC_EHCI | ||
665 | select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX | ||
666 | select IMX_HAVE_PLATFORM_SPI_IMX | ||
667 | help | ||
668 | Include support for MX51 Babbage platform, also known as MX51EVK in | ||
669 | u-boot. This includes specific configurations for the board and its | ||
670 | peripherals. | ||
671 | |||
672 | config MACH_MX51_3DS | ||
673 | bool "Support MX51PDK (3DS)" | ||
674 | select SOC_IMX51 | ||
675 | select IMX_HAVE_PLATFORM_IMX2_WDT | ||
676 | select IMX_HAVE_PLATFORM_IMX_KEYPAD | ||
677 | select IMX_HAVE_PLATFORM_IMX_UART | ||
678 | select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX | ||
679 | select IMX_HAVE_PLATFORM_SPI_IMX | ||
680 | select MXC_DEBUG_BOARD | ||
681 | help | ||
682 | Include support for MX51PDK (3DS) platform. This includes specific | ||
683 | configurations for the board and its peripherals. | ||
684 | |||
685 | config MACH_EUKREA_CPUIMX51 | ||
686 | bool "Support Eukrea CPUIMX51 module" | ||
687 | select SOC_IMX51 | ||
688 | select IMX_HAVE_PLATFORM_FSL_USB2_UDC | ||
689 | select IMX_HAVE_PLATFORM_IMX_I2C | ||
690 | select IMX_HAVE_PLATFORM_IMX_UART | ||
691 | select IMX_HAVE_PLATFORM_MXC_EHCI | ||
692 | select IMX_HAVE_PLATFORM_MXC_NAND | ||
693 | select IMX_HAVE_PLATFORM_SPI_IMX | ||
694 | help | ||
695 | Include support for Eukrea CPUIMX51 platform. This includes | ||
696 | specific configurations for the module and its peripherals. | ||
697 | |||
698 | choice | ||
699 | prompt "Baseboard" | ||
700 | depends on MACH_EUKREA_CPUIMX51 | ||
701 | default MACH_EUKREA_MBIMX51_BASEBOARD | ||
702 | |||
703 | config MACH_EUKREA_MBIMX51_BASEBOARD | ||
704 | prompt "Eukrea MBIMX51 development board" | ||
705 | bool | ||
706 | select IMX_HAVE_PLATFORM_IMX_KEYPAD | ||
707 | select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX | ||
708 | select LEDS_GPIO_REGISTER | ||
709 | help | ||
710 | This adds board specific devices that can be found on Eukrea's | ||
711 | MBIMX51 evaluation board. | ||
712 | |||
713 | endchoice | ||
714 | |||
715 | config MACH_EUKREA_CPUIMX51SD | ||
716 | bool "Support Eukrea CPUIMX51SD module" | ||
717 | select SOC_IMX51 | ||
718 | select IMX_HAVE_PLATFORM_FSL_USB2_UDC | ||
719 | select IMX_HAVE_PLATFORM_IMX_I2C | ||
720 | select IMX_HAVE_PLATFORM_IMX_UART | ||
721 | select IMX_HAVE_PLATFORM_MXC_EHCI | ||
722 | select IMX_HAVE_PLATFORM_MXC_NAND | ||
723 | select IMX_HAVE_PLATFORM_SPI_IMX | ||
724 | help | ||
725 | Include support for Eukrea CPUIMX51SD platform. This includes | ||
726 | specific configurations for the module and its peripherals. | ||
727 | |||
728 | choice | ||
729 | prompt "Baseboard" | ||
730 | depends on MACH_EUKREA_CPUIMX51SD | ||
731 | default MACH_EUKREA_MBIMXSD51_BASEBOARD | ||
732 | |||
733 | config MACH_EUKREA_MBIMXSD51_BASEBOARD | ||
734 | prompt "Eukrea MBIMXSD development board" | ||
735 | bool | ||
736 | select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX | ||
737 | select LEDS_GPIO_REGISTER | ||
738 | help | ||
739 | This adds board specific devices that can be found on Eukrea's | ||
740 | MBIMXSD evaluation board. | ||
741 | |||
742 | endchoice | ||
743 | |||
744 | config MX51_EFIKA_COMMON | ||
745 | bool | ||
746 | select SOC_IMX51 | ||
747 | select IMX_HAVE_PLATFORM_IMX_UART | ||
748 | select IMX_HAVE_PLATFORM_MXC_EHCI | ||
749 | select IMX_HAVE_PLATFORM_PATA_IMX | ||
750 | select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX | ||
751 | select IMX_HAVE_PLATFORM_SPI_IMX | ||
752 | select MXC_ULPI if USB_ULPI | ||
753 | |||
754 | config MACH_MX51_EFIKAMX | ||
755 | bool "Support MX51 Genesi Efika MX nettop" | ||
756 | select LEDS_GPIO_REGISTER | ||
757 | select MX51_EFIKA_COMMON | ||
758 | help | ||
759 | Include support for Genesi Efika MX nettop. This includes specific | ||
760 | configurations for the board and its peripherals. | ||
761 | |||
762 | config MACH_MX51_EFIKASB | ||
763 | bool "Support MX51 Genesi Efika Smartbook" | ||
764 | select LEDS_GPIO_REGISTER | ||
765 | select MX51_EFIKA_COMMON | ||
766 | help | ||
767 | Include support for Genesi Efika Smartbook. This includes specific | ||
768 | configurations for the board and its peripherals. | ||
769 | |||
770 | comment "i.MX53 machines:" | ||
771 | |||
772 | config MACH_IMX53_DT | ||
773 | bool "Support i.MX53 platforms from device tree" | ||
774 | select SOC_IMX53 | ||
775 | select USE_OF | ||
776 | select MACH_MX53_ARD | ||
777 | select MACH_MX53_EVK | ||
778 | select MACH_MX53_LOCO | ||
779 | select MACH_MX53_SMD | ||
780 | help | ||
781 | Include support for Freescale i.MX53 based platforms | ||
782 | using the device tree for discovery | ||
783 | |||
784 | config MACH_MX53_EVK | ||
785 | bool "Support MX53 EVK platforms" | ||
786 | select SOC_IMX53 | ||
787 | select IMX_HAVE_PLATFORM_IMX2_WDT | ||
788 | select IMX_HAVE_PLATFORM_IMX_UART | ||
789 | select IMX_HAVE_PLATFORM_IMX_I2C | ||
790 | select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX | ||
791 | select IMX_HAVE_PLATFORM_SPI_IMX | ||
792 | select LEDS_GPIO_REGISTER | ||
793 | help | ||
794 | Include support for MX53 EVK platform. This includes specific | ||
795 | configurations for the board and its peripherals. | ||
796 | |||
797 | config MACH_MX53_SMD | ||
798 | bool "Support MX53 SMD platforms" | ||
799 | select SOC_IMX53 | ||
800 | select IMX_HAVE_PLATFORM_IMX2_WDT | ||
801 | select IMX_HAVE_PLATFORM_IMX_I2C | ||
802 | select IMX_HAVE_PLATFORM_IMX_UART | ||
803 | select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX | ||
804 | help | ||
805 | Include support for MX53 SMD platform. This includes specific | ||
806 | configurations for the board and its peripherals. | ||
807 | |||
808 | config MACH_MX53_LOCO | ||
809 | bool "Support MX53 LOCO platforms" | ||
810 | select SOC_IMX53 | ||
811 | select IMX_HAVE_PLATFORM_IMX2_WDT | ||
812 | select IMX_HAVE_PLATFORM_IMX_I2C | ||
813 | select IMX_HAVE_PLATFORM_IMX_UART | ||
814 | select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX | ||
815 | select IMX_HAVE_PLATFORM_GPIO_KEYS | ||
816 | select LEDS_GPIO_REGISTER | ||
817 | help | ||
818 | Include support for MX53 LOCO platform. This includes specific | ||
819 | configurations for the board and its peripherals. | ||
820 | |||
821 | config MACH_MX53_ARD | ||
822 | bool "Support MX53 ARD platforms" | ||
823 | select SOC_IMX53 | ||
824 | select IMX_HAVE_PLATFORM_IMX2_WDT | ||
825 | select IMX_HAVE_PLATFORM_IMX_I2C | ||
826 | select IMX_HAVE_PLATFORM_IMX_UART | ||
827 | select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX | ||
828 | select IMX_HAVE_PLATFORM_GPIO_KEYS | ||
829 | help | ||
830 | Include support for MX53 ARD platform. This includes specific | ||
831 | configurations for the board and its peripherals. | ||
832 | |||
595 | comment "i.MX6 family:" | 833 | comment "i.MX6 family:" |
596 | 834 | ||
597 | config SOC_IMX6Q | 835 | config SOC_IMX6Q |
diff --git a/arch/arm/mach-imx/Makefile b/arch/arm/mach-imx/Makefile index f5920c24f7d7..55db9c488f2b 100644 --- a/arch/arm/mach-imx/Makefile +++ b/arch/arm/mach-imx/Makefile | |||
@@ -11,6 +11,8 @@ obj-$(CONFIG_SOC_IMX27) += clock-imx27.o mm-imx27.o ehci-imx27.o | |||
11 | obj-$(CONFIG_SOC_IMX31) += mm-imx3.o cpu-imx31.o clock-imx31.o iomux-imx31.o ehci-imx31.o | 11 | obj-$(CONFIG_SOC_IMX31) += mm-imx3.o cpu-imx31.o clock-imx31.o iomux-imx31.o ehci-imx31.o |
12 | obj-$(CONFIG_SOC_IMX35) += mm-imx3.o cpu-imx35.o clock-imx35.o ehci-imx35.o | 12 | obj-$(CONFIG_SOC_IMX35) += mm-imx3.o cpu-imx35.o clock-imx35.o ehci-imx35.o |
13 | 13 | ||
14 | obj-$(CONFIG_SOC_IMX5) += cpu-imx5.o mm-imx5.o clock-mx51-mx53.o ehci-imx5.o pm-imx5.o cpu_op-mx51.o | ||
15 | |||
14 | # Support for CMOS sensor interface | 16 | # Support for CMOS sensor interface |
15 | obj-$(CONFIG_MX1_VIDEO) += mx1-camera-fiq.o mx1-camera-fiq-ksym.o | 17 | obj-$(CONFIG_MX1_VIDEO) += mx1-camera-fiq.o mx1-camera-fiq-ksym.o |
16 | 18 | ||
@@ -75,3 +77,22 @@ obj-$(CONFIG_SOC_IMX6Q) += clock-imx6q.o mach-imx6q.o | |||
75 | ifeq ($(CONFIG_PM),y) | 77 | ifeq ($(CONFIG_PM),y) |
76 | obj-$(CONFIG_SOC_IMX6Q) += pm-imx6q.o | 78 | obj-$(CONFIG_SOC_IMX6Q) += pm-imx6q.o |
77 | endif | 79 | endif |
80 | |||
81 | # i.MX5 based machines | ||
82 | obj-$(CONFIG_MACH_MX51_BABBAGE) += mach-mx51_babbage.o | ||
83 | obj-$(CONFIG_MACH_MX51_3DS) += mach-mx51_3ds.o | ||
84 | obj-$(CONFIG_MACH_MX53_EVK) += mach-mx53_evk.o | ||
85 | obj-$(CONFIG_MACH_MX53_SMD) += mach-mx53_smd.o | ||
86 | obj-$(CONFIG_MACH_MX53_LOCO) += mach-mx53_loco.o | ||
87 | obj-$(CONFIG_MACH_MX53_ARD) += mach-mx53_ard.o | ||
88 | obj-$(CONFIG_MACH_EUKREA_CPUIMX51) += mach-cpuimx51.o | ||
89 | obj-$(CONFIG_MACH_EUKREA_MBIMX51_BASEBOARD) += eukrea_mbimx51-baseboard.o | ||
90 | obj-$(CONFIG_MACH_EUKREA_CPUIMX51SD) += mach-cpuimx51sd.o | ||
91 | obj-$(CONFIG_MACH_EUKREA_MBIMXSD51_BASEBOARD) += eukrea_mbimxsd-baseboard.o | ||
92 | obj-$(CONFIG_MX51_EFIKA_COMMON) += mx51_efika.o | ||
93 | obj-$(CONFIG_MACH_MX51_EFIKAMX) += mach-mx51_efikamx.o | ||
94 | obj-$(CONFIG_MACH_MX51_EFIKASB) += mach-mx51_efikasb.o | ||
95 | obj-$(CONFIG_MACH_MX50_RDP) += mach-mx50_rdp.o | ||
96 | |||
97 | obj-$(CONFIG_MACH_IMX51_DT) += imx51-dt.o | ||
98 | obj-$(CONFIG_MACH_IMX53_DT) += imx53-dt.o | ||
diff --git a/arch/arm/mach-imx/Makefile.boot b/arch/arm/mach-imx/Makefile.boot index 5f4d06af4912..6dfdbcc83afd 100644 --- a/arch/arm/mach-imx/Makefile.boot +++ b/arch/arm/mach-imx/Makefile.boot | |||
@@ -22,6 +22,18 @@ zreladdr-$(CONFIG_SOC_IMX35) += 0x80008000 | |||
22 | params_phys-$(CONFIG_SOC_IMX35) := 0x80000100 | 22 | params_phys-$(CONFIG_SOC_IMX35) := 0x80000100 |
23 | initrd_phys-$(CONFIG_SOC_IMX35) := 0x80800000 | 23 | initrd_phys-$(CONFIG_SOC_IMX35) := 0x80800000 |
24 | 24 | ||
25 | zreladdr-$(CONFIG_SOC_IMX50) += 0x70008000 | ||
26 | params_phys-$(CONFIG_SOC_IMX50) := 0x70000100 | ||
27 | initrd_phys-$(CONFIG_SOC_IMX50) := 0x70800000 | ||
28 | |||
29 | zreladdr-$(CONFIG_SOC_IMX51) += 0x90008000 | ||
30 | params_phys-$(CONFIG_SOC_IMX51) := 0x90000100 | ||
31 | initrd_phys-$(CONFIG_SOC_IMX51) := 0x90800000 | ||
32 | |||
33 | zreladdr-$(CONFIG_SOC_IMX53) += 0x70008000 | ||
34 | params_phys-$(CONFIG_SOC_IMX53) := 0x70000100 | ||
35 | initrd_phys-$(CONFIG_SOC_IMX53) := 0x70800000 | ||
36 | |||
25 | zreladdr-$(CONFIG_SOC_IMX6Q) += 0x10008000 | 37 | zreladdr-$(CONFIG_SOC_IMX6Q) += 0x10008000 |
26 | params_phys-$(CONFIG_SOC_IMX6Q) := 0x10000100 | 38 | params_phys-$(CONFIG_SOC_IMX6Q) := 0x10000100 |
27 | initrd_phys-$(CONFIG_SOC_IMX6Q) := 0x10800000 | 39 | initrd_phys-$(CONFIG_SOC_IMX6Q) := 0x10800000 |
diff --git a/arch/arm/mach-imx/clock-imx6q.c b/arch/arm/mach-imx/clock-imx6q.c index 9273c2a24b54..2d88f8b9a454 100644 --- a/arch/arm/mach-imx/clock-imx6q.c +++ b/arch/arm/mach-imx/clock-imx6q.c | |||
@@ -814,6 +814,16 @@ DEF_PFD(pll3_pfd_540m, PFD_480, PFD1, &pll3_usb_otg); | |||
814 | DEF_PFD(pll3_pfd_508m, PFD_480, PFD2, &pll3_usb_otg); | 814 | DEF_PFD(pll3_pfd_508m, PFD_480, PFD2, &pll3_usb_otg); |
815 | DEF_PFD(pll3_pfd_454m, PFD_480, PFD3, &pll3_usb_otg); | 815 | DEF_PFD(pll3_pfd_454m, PFD_480, PFD3, &pll3_usb_otg); |
816 | 816 | ||
817 | static unsigned long twd_clk_get_rate(struct clk *clk) | ||
818 | { | ||
819 | return clk_get_rate(clk->parent) / 2; | ||
820 | } | ||
821 | |||
822 | static struct clk twd_clk = { | ||
823 | .parent = &arm_clk, | ||
824 | .get_rate = twd_clk_get_rate, | ||
825 | }; | ||
826 | |||
817 | static unsigned long pll2_200m_get_rate(struct clk *clk) | 827 | static unsigned long pll2_200m_get_rate(struct clk *clk) |
818 | { | 828 | { |
819 | return clk_get_rate(clk->parent) / 2; | 829 | return clk_get_rate(clk->parent) / 2; |
@@ -1894,6 +1904,7 @@ static struct clk_lookup lookups[] = { | |||
1894 | _REGISTER_CLOCK("20ec000.sdma", NULL, sdma_clk), | 1904 | _REGISTER_CLOCK("20ec000.sdma", NULL, sdma_clk), |
1895 | _REGISTER_CLOCK("20bc000.wdog", NULL, dummy_clk), | 1905 | _REGISTER_CLOCK("20bc000.wdog", NULL, dummy_clk), |
1896 | _REGISTER_CLOCK("20c0000.wdog", NULL, dummy_clk), | 1906 | _REGISTER_CLOCK("20c0000.wdog", NULL, dummy_clk), |
1907 | _REGISTER_CLOCK("smp_twd", NULL, twd_clk), | ||
1897 | _REGISTER_CLOCK(NULL, "ckih", ckih_clk), | 1908 | _REGISTER_CLOCK(NULL, "ckih", ckih_clk), |
1898 | _REGISTER_CLOCK(NULL, "ckil_clk", ckil_clk), | 1909 | _REGISTER_CLOCK(NULL, "ckil_clk", ckil_clk), |
1899 | _REGISTER_CLOCK(NULL, "aips_tz1_clk", aips_tz1_clk), | 1910 | _REGISTER_CLOCK(NULL, "aips_tz1_clk", aips_tz1_clk), |
diff --git a/arch/arm/mach-mx5/clock-mx51-mx53.c b/arch/arm/mach-imx/clock-mx51-mx53.c index 4cb276977190..08470504a088 100644 --- a/arch/arm/mach-mx5/clock-mx51-mx53.c +++ b/arch/arm/mach-imx/clock-mx51-mx53.c | |||
@@ -23,7 +23,7 @@ | |||
23 | #include <mach/common.h> | 23 | #include <mach/common.h> |
24 | #include <mach/clock.h> | 24 | #include <mach/clock.h> |
25 | 25 | ||
26 | #include "crm_regs.h" | 26 | #include "crm-regs-imx5.h" |
27 | 27 | ||
28 | /* External clock values passed-in by the board code */ | 28 | /* External clock values passed-in by the board code */ |
29 | static unsigned long external_high_reference, external_low_reference; | 29 | static unsigned long external_high_reference, external_low_reference; |
diff --git a/arch/arm/mach-mx5/cpu.c b/arch/arm/mach-imx/cpu-imx5.c index 5e2e7a843860..5e2e7a843860 100644 --- a/arch/arm/mach-mx5/cpu.c +++ b/arch/arm/mach-imx/cpu-imx5.c | |||
diff --git a/arch/arm/mach-mx5/cpu_op-mx51.c b/arch/arm/mach-imx/cpu_op-mx51.c index 9d34c3d4c024..9d34c3d4c024 100644 --- a/arch/arm/mach-mx5/cpu_op-mx51.c +++ b/arch/arm/mach-imx/cpu_op-mx51.c | |||
diff --git a/arch/arm/mach-mx5/cpu_op-mx51.h b/arch/arm/mach-imx/cpu_op-mx51.h index 97477fecb469..97477fecb469 100644 --- a/arch/arm/mach-mx5/cpu_op-mx51.h +++ b/arch/arm/mach-imx/cpu_op-mx51.h | |||
diff --git a/arch/arm/mach-mx5/crm_regs.h b/arch/arm/mach-imx/crm-regs-imx5.h index 5e11ba7daee2..5e11ba7daee2 100644 --- a/arch/arm/mach-mx5/crm_regs.h +++ b/arch/arm/mach-imx/crm-regs-imx5.h | |||
diff --git a/arch/arm/mach-mx5/devices-imx50.h b/arch/arm/mach-imx/devices-imx50.h index 7216667eaafc..7216667eaafc 100644 --- a/arch/arm/mach-mx5/devices-imx50.h +++ b/arch/arm/mach-imx/devices-imx50.h | |||
diff --git a/arch/arm/mach-mx5/devices-imx51.h b/arch/arm/mach-imx/devices-imx51.h index af488bc0e225..af488bc0e225 100644 --- a/arch/arm/mach-mx5/devices-imx51.h +++ b/arch/arm/mach-imx/devices-imx51.h | |||
diff --git a/arch/arm/mach-mx5/devices-imx53.h b/arch/arm/mach-imx/devices-imx53.h index 6e1e5d1f8c3a..6e1e5d1f8c3a 100644 --- a/arch/arm/mach-mx5/devices-imx53.h +++ b/arch/arm/mach-imx/devices-imx53.h | |||
diff --git a/arch/arm/mach-mx5/efika.h b/arch/arm/mach-imx/efika.h index 014aa985faae..014aa985faae 100644 --- a/arch/arm/mach-mx5/efika.h +++ b/arch/arm/mach-imx/efika.h | |||
diff --git a/arch/arm/mach-mx5/ehci.c b/arch/arm/mach-imx/ehci-imx5.c index c17fa131728b..c17fa131728b 100644 --- a/arch/arm/mach-mx5/ehci.c +++ b/arch/arm/mach-imx/ehci-imx5.c | |||
diff --git a/arch/arm/mach-mx5/eukrea_mbimx51-baseboard.c b/arch/arm/mach-imx/eukrea_mbimx51-baseboard.c index a6a3ab8f1b1c..a6a3ab8f1b1c 100644 --- a/arch/arm/mach-mx5/eukrea_mbimx51-baseboard.c +++ b/arch/arm/mach-imx/eukrea_mbimx51-baseboard.c | |||
diff --git a/arch/arm/mach-mx5/eukrea_mbimxsd-baseboard.c b/arch/arm/mach-imx/eukrea_mbimxsd-baseboard.c index d817fc80b986..d817fc80b986 100644 --- a/arch/arm/mach-mx5/eukrea_mbimxsd-baseboard.c +++ b/arch/arm/mach-imx/eukrea_mbimxsd-baseboard.c | |||
diff --git a/arch/arm/mach-mx5/imx51-dt.c b/arch/arm/mach-imx/imx51-dt.c index e6bad17b908c..e6bad17b908c 100644 --- a/arch/arm/mach-mx5/imx51-dt.c +++ b/arch/arm/mach-imx/imx51-dt.c | |||
diff --git a/arch/arm/mach-mx5/imx53-dt.c b/arch/arm/mach-imx/imx53-dt.c index 05ebb3e68679..05ebb3e68679 100644 --- a/arch/arm/mach-mx5/imx53-dt.c +++ b/arch/arm/mach-imx/imx53-dt.c | |||
diff --git a/arch/arm/mach-mx5/board-cpuimx51.c b/arch/arm/mach-imx/mach-cpuimx51.c index 944025da8333..944025da8333 100644 --- a/arch/arm/mach-mx5/board-cpuimx51.c +++ b/arch/arm/mach-imx/mach-cpuimx51.c | |||
diff --git a/arch/arm/mach-mx5/board-cpuimx51sd.c b/arch/arm/mach-imx/mach-cpuimx51sd.c index 9fbe923c8b08..9fbe923c8b08 100644 --- a/arch/arm/mach-mx5/board-cpuimx51sd.c +++ b/arch/arm/mach-imx/mach-cpuimx51sd.c | |||
diff --git a/arch/arm/mach-mx5/board-mx50_rdp.c b/arch/arm/mach-imx/mach-mx50_rdp.c index 42b66e8d9615..42b66e8d9615 100644 --- a/arch/arm/mach-mx5/board-mx50_rdp.c +++ b/arch/arm/mach-imx/mach-mx50_rdp.c | |||
diff --git a/arch/arm/mach-mx5/board-mx51_3ds.c b/arch/arm/mach-imx/mach-mx51_3ds.c index 83eab4176ca4..83eab4176ca4 100644 --- a/arch/arm/mach-mx5/board-mx51_3ds.c +++ b/arch/arm/mach-imx/mach-mx51_3ds.c | |||
diff --git a/arch/arm/mach-mx5/board-mx51_babbage.c b/arch/arm/mach-imx/mach-mx51_babbage.c index e4b822e9f719..e4b822e9f719 100644 --- a/arch/arm/mach-mx5/board-mx51_babbage.c +++ b/arch/arm/mach-imx/mach-mx51_babbage.c | |||
diff --git a/arch/arm/mach-mx5/board-mx51_efikamx.c b/arch/arm/mach-imx/mach-mx51_efikamx.c index 3a5ed2dd885a..3a5ed2dd885a 100644 --- a/arch/arm/mach-mx5/board-mx51_efikamx.c +++ b/arch/arm/mach-imx/mach-mx51_efikamx.c | |||
diff --git a/arch/arm/mach-mx5/board-mx51_efikasb.c b/arch/arm/mach-imx/mach-mx51_efikasb.c index ea5f65b0381a..ea5f65b0381a 100644 --- a/arch/arm/mach-mx5/board-mx51_efikasb.c +++ b/arch/arm/mach-imx/mach-mx51_efikasb.c | |||
diff --git a/arch/arm/mach-mx5/board-mx53_ard.c b/arch/arm/mach-imx/mach-mx53_ard.c index 5f224f1c3eb6..753f4fc9ec04 100644 --- a/arch/arm/mach-mx5/board-mx53_ard.c +++ b/arch/arm/mach-imx/mach-mx53_ard.c | |||
@@ -32,7 +32,6 @@ | |||
32 | #include <asm/mach/arch.h> | 32 | #include <asm/mach/arch.h> |
33 | #include <asm/mach/time.h> | 33 | #include <asm/mach/time.h> |
34 | 34 | ||
35 | #include "crm_regs.h" | ||
36 | #include "devices-imx53.h" | 35 | #include "devices-imx53.h" |
37 | 36 | ||
38 | #define ARD_ETHERNET_INT_B IMX_GPIO_NR(2, 31) | 37 | #define ARD_ETHERNET_INT_B IMX_GPIO_NR(2, 31) |
@@ -189,8 +188,10 @@ static int weim_cs_config(void) | |||
189 | return -ENOMEM; | 188 | return -ENOMEM; |
190 | 189 | ||
191 | iomuxc_base = ioremap(MX53_IOMUXC_BASE_ADDR, SZ_4K); | 190 | iomuxc_base = ioremap(MX53_IOMUXC_BASE_ADDR, SZ_4K); |
192 | if (!iomuxc_base) | 191 | if (!iomuxc_base) { |
192 | iounmap(weim_base); | ||
193 | return -ENOMEM; | 193 | return -ENOMEM; |
194 | } | ||
194 | 195 | ||
195 | /* CS1 timings for LAN9220 */ | 196 | /* CS1 timings for LAN9220 */ |
196 | writel(0x20001, (weim_base + 0x18)); | 197 | writel(0x20001, (weim_base + 0x18)); |
diff --git a/arch/arm/mach-mx5/board-mx53_evk.c b/arch/arm/mach-imx/mach-mx53_evk.c index d6ce137896d6..5a72188b9cdb 100644 --- a/arch/arm/mach-mx5/board-mx53_evk.c +++ b/arch/arm/mach-imx/mach-mx53_evk.c | |||
@@ -37,7 +37,6 @@ | |||
37 | #define EVK_ECSPI1_CS1 IMX_GPIO_NR(3, 19) | 37 | #define EVK_ECSPI1_CS1 IMX_GPIO_NR(3, 19) |
38 | #define MX53EVK_LED IMX_GPIO_NR(7, 7) | 38 | #define MX53EVK_LED IMX_GPIO_NR(7, 7) |
39 | 39 | ||
40 | #include "crm_regs.h" | ||
41 | #include "devices-imx53.h" | 40 | #include "devices-imx53.h" |
42 | 41 | ||
43 | static iomux_v3_cfg_t mx53_evk_pads[] = { | 42 | static iomux_v3_cfg_t mx53_evk_pads[] = { |
diff --git a/arch/arm/mach-mx5/board-mx53_loco.c b/arch/arm/mach-imx/mach-mx53_loco.c index fd8b524e1c58..37f67cac15a4 100644 --- a/arch/arm/mach-mx5/board-mx53_loco.c +++ b/arch/arm/mach-imx/mach-mx53_loco.c | |||
@@ -32,7 +32,6 @@ | |||
32 | #include <asm/mach/arch.h> | 32 | #include <asm/mach/arch.h> |
33 | #include <asm/mach/time.h> | 33 | #include <asm/mach/time.h> |
34 | 34 | ||
35 | #include "crm_regs.h" | ||
36 | #include "devices-imx53.h" | 35 | #include "devices-imx53.h" |
37 | 36 | ||
38 | #define MX53_LOCO_POWER IMX_GPIO_NR(1, 8) | 37 | #define MX53_LOCO_POWER IMX_GPIO_NR(1, 8) |
diff --git a/arch/arm/mach-mx5/board-mx53_smd.c b/arch/arm/mach-imx/mach-mx53_smd.c index 22c53c9b18aa..8e972c5c3e13 100644 --- a/arch/arm/mach-mx5/board-mx53_smd.c +++ b/arch/arm/mach-imx/mach-mx53_smd.c | |||
@@ -31,7 +31,6 @@ | |||
31 | #include <asm/mach/arch.h> | 31 | #include <asm/mach/arch.h> |
32 | #include <asm/mach/time.h> | 32 | #include <asm/mach/time.h> |
33 | 33 | ||
34 | #include "crm_regs.h" | ||
35 | #include "devices-imx53.h" | 34 | #include "devices-imx53.h" |
36 | 35 | ||
37 | #define SMD_FEC_PHY_RST IMX_GPIO_NR(7, 6) | 36 | #define SMD_FEC_PHY_RST IMX_GPIO_NR(7, 6) |
diff --git a/arch/arm/mach-mx5/mm.c b/arch/arm/mach-imx/mm-imx5.c index bc17dfea3817..bc17dfea3817 100644 --- a/arch/arm/mach-mx5/mm.c +++ b/arch/arm/mach-imx/mm-imx5.c | |||
diff --git a/arch/arm/mach-mx5/mx51_efika.c b/arch/arm/mach-imx/mx51_efika.c index ec6ca91b299b..ec6ca91b299b 100644 --- a/arch/arm/mach-mx5/mx51_efika.c +++ b/arch/arm/mach-imx/mx51_efika.c | |||
diff --git a/arch/arm/mach-mx5/system.c b/arch/arm/mach-imx/pm-imx5.c index 5eebfaad1226..6dc093448057 100644 --- a/arch/arm/mach-mx5/system.c +++ b/arch/arm/mach-imx/pm-imx5.c | |||
@@ -1,8 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (C) 2011 Freescale Semiconductor, Inc. All Rights Reserved. | 2 | * Copyright (C) 2011 Freescale Semiconductor, Inc. All Rights Reserved. |
3 | */ | 3 | * |
4 | |||
5 | /* | ||
6 | * The code contained herein is licensed under the GNU General Public | 4 | * The code contained herein is licensed under the GNU General Public |
7 | * License. You may obtain a copy of the GNU General Public License | 5 | * License. You may obtain a copy of the GNU General Public License |
8 | * Version 2 or later at the following locations: | 6 | * Version 2 or later at the following locations: |
@@ -10,14 +8,22 @@ | |||
10 | * http://www.opensource.org/licenses/gpl-license.html | 8 | * http://www.opensource.org/licenses/gpl-license.html |
11 | * http://www.gnu.org/copyleft/gpl.html | 9 | * http://www.gnu.org/copyleft/gpl.html |
12 | */ | 10 | */ |
13 | #include <linux/platform_device.h> | 11 | #include <linux/suspend.h> |
12 | #include <linux/clk.h> | ||
14 | #include <linux/io.h> | 13 | #include <linux/io.h> |
15 | #include <mach/hardware.h> | 14 | #include <linux/err.h> |
15 | #include <asm/cacheflush.h> | ||
16 | #include <asm/tlbflush.h> | ||
16 | #include <mach/common.h> | 17 | #include <mach/common.h> |
17 | #include "crm_regs.h" | 18 | #include <mach/hardware.h> |
19 | #include "crm-regs-imx5.h" | ||
20 | |||
21 | static struct clk *gpc_dvfs_clk; | ||
18 | 22 | ||
19 | /* set cpu low power mode before WFI instruction. This function is called | 23 | /* |
20 | * mx5 because it can be used for mx50, mx51, and mx53.*/ | 24 | * set cpu low power mode before WFI instruction. This function is called |
25 | * mx5 because it can be used for mx50, mx51, and mx53. | ||
26 | */ | ||
21 | void mx5_cpu_lp_set(enum mxc_cpu_pwr_mode mode) | 27 | void mx5_cpu_lp_set(enum mxc_cpu_pwr_mode mode) |
22 | { | 28 | { |
23 | u32 plat_lpc, arm_srpgcr, ccm_clpcr; | 29 | u32 plat_lpc, arm_srpgcr, ccm_clpcr; |
@@ -80,3 +86,68 @@ void mx5_cpu_lp_set(enum mxc_cpu_pwr_mode mode) | |||
80 | __raw_writel(empgc1, MXC_SRPG_EMPGC1_SRPGCR); | 86 | __raw_writel(empgc1, MXC_SRPG_EMPGC1_SRPGCR); |
81 | } | 87 | } |
82 | } | 88 | } |
89 | |||
90 | static int mx5_suspend_prepare(void) | ||
91 | { | ||
92 | return clk_enable(gpc_dvfs_clk); | ||
93 | } | ||
94 | |||
95 | static int mx5_suspend_enter(suspend_state_t state) | ||
96 | { | ||
97 | switch (state) { | ||
98 | case PM_SUSPEND_MEM: | ||
99 | mx5_cpu_lp_set(STOP_POWER_OFF); | ||
100 | break; | ||
101 | case PM_SUSPEND_STANDBY: | ||
102 | mx5_cpu_lp_set(WAIT_UNCLOCKED_POWER_OFF); | ||
103 | break; | ||
104 | default: | ||
105 | return -EINVAL; | ||
106 | } | ||
107 | |||
108 | if (state == PM_SUSPEND_MEM) { | ||
109 | local_flush_tlb_all(); | ||
110 | flush_cache_all(); | ||
111 | |||
112 | /*clear the EMPGC0/1 bits */ | ||
113 | __raw_writel(0, MXC_SRPG_EMPGC0_SRPGCR); | ||
114 | __raw_writel(0, MXC_SRPG_EMPGC1_SRPGCR); | ||
115 | } | ||
116 | cpu_do_idle(); | ||
117 | return 0; | ||
118 | } | ||
119 | |||
120 | static void mx5_suspend_finish(void) | ||
121 | { | ||
122 | clk_disable(gpc_dvfs_clk); | ||
123 | } | ||
124 | |||
125 | static int mx5_pm_valid(suspend_state_t state) | ||
126 | { | ||
127 | return (state > PM_SUSPEND_ON && state <= PM_SUSPEND_MAX); | ||
128 | } | ||
129 | |||
130 | static const struct platform_suspend_ops mx5_suspend_ops = { | ||
131 | .valid = mx5_pm_valid, | ||
132 | .prepare = mx5_suspend_prepare, | ||
133 | .enter = mx5_suspend_enter, | ||
134 | .finish = mx5_suspend_finish, | ||
135 | }; | ||
136 | |||
137 | static int __init mx5_pm_init(void) | ||
138 | { | ||
139 | if (!cpu_is_mx51() && !cpu_is_mx53()) | ||
140 | return 0; | ||
141 | |||
142 | if (gpc_dvfs_clk == NULL) | ||
143 | gpc_dvfs_clk = clk_get(NULL, "gpc_dvfs"); | ||
144 | |||
145 | if (!IS_ERR(gpc_dvfs_clk)) { | ||
146 | if (cpu_is_mx51()) | ||
147 | suspend_set_ops(&mx5_suspend_ops); | ||
148 | } else | ||
149 | return -EPERM; | ||
150 | |||
151 | return 0; | ||
152 | } | ||
153 | device_initcall(mx5_pm_init); | ||
diff --git a/arch/arm/mach-imx/src.c b/arch/arm/mach-imx/src.c index 29bd1243781e..e15f1555c59b 100644 --- a/arch/arm/mach-imx/src.c +++ b/arch/arm/mach-imx/src.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/of.h> | 15 | #include <linux/of.h> |
16 | #include <linux/of_address.h> | 16 | #include <linux/of_address.h> |
17 | #include <linux/smp.h> | 17 | #include <linux/smp.h> |
18 | #include <asm/smp_plat.h> | ||
18 | 19 | ||
19 | #define SRC_SCR 0x000 | 20 | #define SRC_SCR 0x000 |
20 | #define SRC_GPR1 0x020 | 21 | #define SRC_GPR1 0x020 |
@@ -24,10 +25,6 @@ | |||
24 | 25 | ||
25 | static void __iomem *src_base; | 26 | static void __iomem *src_base; |
26 | 27 | ||
27 | #ifndef CONFIG_SMP | ||
28 | #define cpu_logical_map(cpu) 0 | ||
29 | #endif | ||
30 | |||
31 | void imx_enable_cpu(int cpu, bool enable) | 28 | void imx_enable_cpu(int cpu, bool enable) |
32 | { | 29 | { |
33 | u32 mask, val; | 30 | u32 mask, val; |
diff --git a/arch/arm/mach-msm/hotplug.c b/arch/arm/mach-msm/hotplug.c index 41c252de0215..a446fc14221f 100644 --- a/arch/arm/mach-msm/hotplug.c +++ b/arch/arm/mach-msm/hotplug.c | |||
@@ -11,6 +11,7 @@ | |||
11 | #include <linux/smp.h> | 11 | #include <linux/smp.h> |
12 | 12 | ||
13 | #include <asm/cacheflush.h> | 13 | #include <asm/cacheflush.h> |
14 | #include <asm/smp_plat.h> | ||
14 | 15 | ||
15 | extern volatile int pen_release; | 16 | extern volatile int pen_release; |
16 | 17 | ||
diff --git a/arch/arm/mach-msm/platsmp.c b/arch/arm/mach-msm/platsmp.c index 0b3e357c4c8c..db0117ec55f4 100644 --- a/arch/arm/mach-msm/platsmp.c +++ b/arch/arm/mach-msm/platsmp.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <asm/cacheflush.h> | 20 | #include <asm/cacheflush.h> |
21 | #include <asm/cputype.h> | 21 | #include <asm/cputype.h> |
22 | #include <asm/mach-types.h> | 22 | #include <asm/mach-types.h> |
23 | #include <asm/smp_plat.h> | ||
23 | 24 | ||
24 | #include <mach/msm_iomap.h> | 25 | #include <mach/msm_iomap.h> |
25 | 26 | ||
diff --git a/arch/arm/mach-mx5/Kconfig b/arch/arm/mach-mx5/Kconfig deleted file mode 100644 index af0c212e3c7b..000000000000 --- a/arch/arm/mach-mx5/Kconfig +++ /dev/null | |||
@@ -1,244 +0,0 @@ | |||
1 | if ARCH_MX5 | ||
2 | |||
3 | # ARCH_MX5/50/53 are left to mark places where prevent multi-soc in single | ||
4 | # image. So for most time, SOC_IMX50/51/53 should be used. | ||
5 | |||
6 | config ARCH_MX51 | ||
7 | bool | ||
8 | |||
9 | config ARCH_MX50 | ||
10 | bool | ||
11 | |||
12 | config ARCH_MX53 | ||
13 | bool | ||
14 | |||
15 | config SOC_IMX50 | ||
16 | bool | ||
17 | select CPU_V7 | ||
18 | select ARM_L1_CACHE_SHIFT_6 | ||
19 | select MXC_TZIC | ||
20 | select ARCH_MXC_IOMUX_V3 | ||
21 | select ARCH_MXC_AUDMUX_V2 | ||
22 | select ARCH_HAS_CPUFREQ | ||
23 | select ARCH_MX50 | ||
24 | |||
25 | config SOC_IMX51 | ||
26 | bool | ||
27 | select CPU_V7 | ||
28 | select ARM_L1_CACHE_SHIFT_6 | ||
29 | select MXC_TZIC | ||
30 | select ARCH_MXC_IOMUX_V3 | ||
31 | select ARCH_MXC_AUDMUX_V2 | ||
32 | select ARCH_HAS_CPUFREQ | ||
33 | select ARCH_MX51 | ||
34 | |||
35 | config SOC_IMX53 | ||
36 | bool | ||
37 | select CPU_V7 | ||
38 | select ARM_L1_CACHE_SHIFT_6 | ||
39 | select MXC_TZIC | ||
40 | select ARCH_MXC_IOMUX_V3 | ||
41 | select ARCH_MX53 | ||
42 | |||
43 | #comment "i.MX50 machines:" | ||
44 | |||
45 | config MACH_MX50_RDP | ||
46 | bool "Support MX50 reference design platform" | ||
47 | depends on BROKEN | ||
48 | select SOC_IMX50 | ||
49 | select IMX_HAVE_PLATFORM_IMX_I2C | ||
50 | select IMX_HAVE_PLATFORM_IMX_UART | ||
51 | select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX | ||
52 | select IMX_HAVE_PLATFORM_SPI_IMX | ||
53 | help | ||
54 | Include support for MX50 reference design platform (RDP) board. This | ||
55 | includes specific configurations for the board and its peripherals. | ||
56 | |||
57 | comment "i.MX51 machines:" | ||
58 | |||
59 | config MACH_IMX51_DT | ||
60 | bool "Support i.MX51 platforms from device tree" | ||
61 | select SOC_IMX51 | ||
62 | select USE_OF | ||
63 | select MACH_MX51_BABBAGE | ||
64 | help | ||
65 | Include support for Freescale i.MX51 based platforms | ||
66 | using the device tree for discovery | ||
67 | |||
68 | config MACH_MX51_BABBAGE | ||
69 | bool "Support MX51 BABBAGE platforms" | ||
70 | select SOC_IMX51 | ||
71 | select IMX_HAVE_PLATFORM_FSL_USB2_UDC | ||
72 | select IMX_HAVE_PLATFORM_IMX2_WDT | ||
73 | select IMX_HAVE_PLATFORM_IMX_I2C | ||
74 | select IMX_HAVE_PLATFORM_IMX_UART | ||
75 | select IMX_HAVE_PLATFORM_MXC_EHCI | ||
76 | select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX | ||
77 | select IMX_HAVE_PLATFORM_SPI_IMX | ||
78 | help | ||
79 | Include support for MX51 Babbage platform, also known as MX51EVK in | ||
80 | u-boot. This includes specific configurations for the board and its | ||
81 | peripherals. | ||
82 | |||
83 | config MACH_MX51_3DS | ||
84 | bool "Support MX51PDK (3DS)" | ||
85 | select SOC_IMX51 | ||
86 | select IMX_HAVE_PLATFORM_IMX2_WDT | ||
87 | select IMX_HAVE_PLATFORM_IMX_KEYPAD | ||
88 | select IMX_HAVE_PLATFORM_IMX_UART | ||
89 | select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX | ||
90 | select IMX_HAVE_PLATFORM_SPI_IMX | ||
91 | select MXC_DEBUG_BOARD | ||
92 | help | ||
93 | Include support for MX51PDK (3DS) platform. This includes specific | ||
94 | configurations for the board and its peripherals. | ||
95 | |||
96 | config MACH_EUKREA_CPUIMX51 | ||
97 | bool "Support Eukrea CPUIMX51 module" | ||
98 | select SOC_IMX51 | ||
99 | select IMX_HAVE_PLATFORM_FSL_USB2_UDC | ||
100 | select IMX_HAVE_PLATFORM_IMX_I2C | ||
101 | select IMX_HAVE_PLATFORM_IMX_UART | ||
102 | select IMX_HAVE_PLATFORM_MXC_EHCI | ||
103 | select IMX_HAVE_PLATFORM_MXC_NAND | ||
104 | select IMX_HAVE_PLATFORM_SPI_IMX | ||
105 | help | ||
106 | Include support for Eukrea CPUIMX51 platform. This includes | ||
107 | specific configurations for the module and its peripherals. | ||
108 | |||
109 | choice | ||
110 | prompt "Baseboard" | ||
111 | depends on MACH_EUKREA_CPUIMX51 | ||
112 | default MACH_EUKREA_MBIMX51_BASEBOARD | ||
113 | |||
114 | config MACH_EUKREA_MBIMX51_BASEBOARD | ||
115 | prompt "Eukrea MBIMX51 development board" | ||
116 | bool | ||
117 | select IMX_HAVE_PLATFORM_IMX_KEYPAD | ||
118 | select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX | ||
119 | select LEDS_GPIO_REGISTER | ||
120 | help | ||
121 | This adds board specific devices that can be found on Eukrea's | ||
122 | MBIMX51 evaluation board. | ||
123 | |||
124 | endchoice | ||
125 | |||
126 | config MACH_EUKREA_CPUIMX51SD | ||
127 | bool "Support Eukrea CPUIMX51SD module" | ||
128 | select SOC_IMX51 | ||
129 | select IMX_HAVE_PLATFORM_FSL_USB2_UDC | ||
130 | select IMX_HAVE_PLATFORM_IMX_I2C | ||
131 | select IMX_HAVE_PLATFORM_IMX_UART | ||
132 | select IMX_HAVE_PLATFORM_MXC_EHCI | ||
133 | select IMX_HAVE_PLATFORM_MXC_NAND | ||
134 | select IMX_HAVE_PLATFORM_SPI_IMX | ||
135 | help | ||
136 | Include support for Eukrea CPUIMX51SD platform. This includes | ||
137 | specific configurations for the module and its peripherals. | ||
138 | |||
139 | choice | ||
140 | prompt "Baseboard" | ||
141 | depends on MACH_EUKREA_CPUIMX51SD | ||
142 | default MACH_EUKREA_MBIMXSD51_BASEBOARD | ||
143 | |||
144 | config MACH_EUKREA_MBIMXSD51_BASEBOARD | ||
145 | prompt "Eukrea MBIMXSD development board" | ||
146 | bool | ||
147 | select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX | ||
148 | select LEDS_GPIO_REGISTER | ||
149 | help | ||
150 | This adds board specific devices that can be found on Eukrea's | ||
151 | MBIMXSD evaluation board. | ||
152 | |||
153 | endchoice | ||
154 | |||
155 | config MX51_EFIKA_COMMON | ||
156 | bool | ||
157 | select SOC_IMX51 | ||
158 | select IMX_HAVE_PLATFORM_IMX_UART | ||
159 | select IMX_HAVE_PLATFORM_MXC_EHCI | ||
160 | select IMX_HAVE_PLATFORM_PATA_IMX | ||
161 | select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX | ||
162 | select IMX_HAVE_PLATFORM_SPI_IMX | ||
163 | select MXC_ULPI if USB_ULPI | ||
164 | |||
165 | config MACH_MX51_EFIKAMX | ||
166 | bool "Support MX51 Genesi Efika MX nettop" | ||
167 | select LEDS_GPIO_REGISTER | ||
168 | select MX51_EFIKA_COMMON | ||
169 | help | ||
170 | Include support for Genesi Efika MX nettop. This includes specific | ||
171 | configurations for the board and its peripherals. | ||
172 | |||
173 | config MACH_MX51_EFIKASB | ||
174 | bool "Support MX51 Genesi Efika Smartbook" | ||
175 | select LEDS_GPIO_REGISTER | ||
176 | select MX51_EFIKA_COMMON | ||
177 | help | ||
178 | Include support for Genesi Efika Smartbook. This includes specific | ||
179 | configurations for the board and its peripherals. | ||
180 | |||
181 | comment "i.MX53 machines:" | ||
182 | |||
183 | config MACH_IMX53_DT | ||
184 | bool "Support i.MX53 platforms from device tree" | ||
185 | select SOC_IMX53 | ||
186 | select USE_OF | ||
187 | select MACH_MX53_ARD | ||
188 | select MACH_MX53_EVK | ||
189 | select MACH_MX53_LOCO | ||
190 | select MACH_MX53_SMD | ||
191 | help | ||
192 | Include support for Freescale i.MX53 based platforms | ||
193 | using the device tree for discovery | ||
194 | |||
195 | config MACH_MX53_EVK | ||
196 | bool "Support MX53 EVK platforms" | ||
197 | select SOC_IMX53 | ||
198 | select IMX_HAVE_PLATFORM_IMX2_WDT | ||
199 | select IMX_HAVE_PLATFORM_IMX_UART | ||
200 | select IMX_HAVE_PLATFORM_IMX_I2C | ||
201 | select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX | ||
202 | select IMX_HAVE_PLATFORM_SPI_IMX | ||
203 | select LEDS_GPIO_REGISTER | ||
204 | help | ||
205 | Include support for MX53 EVK platform. This includes specific | ||
206 | configurations for the board and its peripherals. | ||
207 | |||
208 | config MACH_MX53_SMD | ||
209 | bool "Support MX53 SMD platforms" | ||
210 | select SOC_IMX53 | ||
211 | select IMX_HAVE_PLATFORM_IMX2_WDT | ||
212 | select IMX_HAVE_PLATFORM_IMX_I2C | ||
213 | select IMX_HAVE_PLATFORM_IMX_UART | ||
214 | select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX | ||
215 | help | ||
216 | Include support for MX53 SMD platform. This includes specific | ||
217 | configurations for the board and its peripherals. | ||
218 | |||
219 | config MACH_MX53_LOCO | ||
220 | bool "Support MX53 LOCO platforms" | ||
221 | select SOC_IMX53 | ||
222 | select IMX_HAVE_PLATFORM_IMX2_WDT | ||
223 | select IMX_HAVE_PLATFORM_IMX_I2C | ||
224 | select IMX_HAVE_PLATFORM_IMX_UART | ||
225 | select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX | ||
226 | select IMX_HAVE_PLATFORM_GPIO_KEYS | ||
227 | select LEDS_GPIO_REGISTER | ||
228 | help | ||
229 | Include support for MX53 LOCO platform. This includes specific | ||
230 | configurations for the board and its peripherals. | ||
231 | |||
232 | config MACH_MX53_ARD | ||
233 | bool "Support MX53 ARD platforms" | ||
234 | select SOC_IMX53 | ||
235 | select IMX_HAVE_PLATFORM_IMX2_WDT | ||
236 | select IMX_HAVE_PLATFORM_IMX_I2C | ||
237 | select IMX_HAVE_PLATFORM_IMX_UART | ||
238 | select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX | ||
239 | select IMX_HAVE_PLATFORM_GPIO_KEYS | ||
240 | help | ||
241 | Include support for MX53 ARD platform. This includes specific | ||
242 | configurations for the board and its peripherals. | ||
243 | |||
244 | endif | ||
diff --git a/arch/arm/mach-mx5/Makefile b/arch/arm/mach-mx5/Makefile deleted file mode 100644 index 0fc60807fa2b..000000000000 --- a/arch/arm/mach-mx5/Makefile +++ /dev/null | |||
@@ -1,26 +0,0 @@ | |||
1 | # | ||
2 | # Makefile for the linux kernel. | ||
3 | # | ||
4 | |||
5 | # Object file lists. | ||
6 | obj-y := cpu.o mm.o clock-mx51-mx53.o ehci.o system.o | ||
7 | |||
8 | obj-$(CONFIG_PM) += pm-imx5.o | ||
9 | obj-$(CONFIG_CPU_FREQ_IMX) += cpu_op-mx51.o | ||
10 | obj-$(CONFIG_MACH_MX51_BABBAGE) += board-mx51_babbage.o | ||
11 | obj-$(CONFIG_MACH_MX51_3DS) += board-mx51_3ds.o | ||
12 | obj-$(CONFIG_MACH_MX53_EVK) += board-mx53_evk.o | ||
13 | obj-$(CONFIG_MACH_MX53_SMD) += board-mx53_smd.o | ||
14 | obj-$(CONFIG_MACH_MX53_LOCO) += board-mx53_loco.o | ||
15 | obj-$(CONFIG_MACH_MX53_ARD) += board-mx53_ard.o | ||
16 | obj-$(CONFIG_MACH_EUKREA_CPUIMX51) += board-cpuimx51.o | ||
17 | obj-$(CONFIG_MACH_EUKREA_MBIMX51_BASEBOARD) += eukrea_mbimx51-baseboard.o | ||
18 | obj-$(CONFIG_MACH_EUKREA_CPUIMX51SD) += board-cpuimx51sd.o | ||
19 | obj-$(CONFIG_MACH_EUKREA_MBIMXSD51_BASEBOARD) += eukrea_mbimxsd-baseboard.o | ||
20 | obj-$(CONFIG_MX51_EFIKA_COMMON) += mx51_efika.o | ||
21 | obj-$(CONFIG_MACH_MX51_EFIKAMX) += board-mx51_efikamx.o | ||
22 | obj-$(CONFIG_MACH_MX51_EFIKASB) += board-mx51_efikasb.o | ||
23 | obj-$(CONFIG_MACH_MX50_RDP) += board-mx50_rdp.o | ||
24 | |||
25 | obj-$(CONFIG_MACH_IMX51_DT) += imx51-dt.o | ||
26 | obj-$(CONFIG_MACH_IMX53_DT) += imx53-dt.o | ||
diff --git a/arch/arm/mach-mx5/Makefile.boot b/arch/arm/mach-mx5/Makefile.boot deleted file mode 100644 index ca207ca305ec..000000000000 --- a/arch/arm/mach-mx5/Makefile.boot +++ /dev/null | |||
@@ -1,9 +0,0 @@ | |||
1 | zreladdr-$(CONFIG_ARCH_MX50) += 0x70008000 | ||
2 | params_phys-$(CONFIG_ARCH_MX50) := 0x70000100 | ||
3 | initrd_phys-$(CONFIG_ARCH_MX50) := 0x70800000 | ||
4 | zreladdr-$(CONFIG_ARCH_MX51) += 0x90008000 | ||
5 | params_phys-$(CONFIG_ARCH_MX51) := 0x90000100 | ||
6 | initrd_phys-$(CONFIG_ARCH_MX51) := 0x90800000 | ||
7 | zreladdr-$(CONFIG_ARCH_MX53) += 0x70008000 | ||
8 | params_phys-$(CONFIG_ARCH_MX53) := 0x70000100 | ||
9 | initrd_phys-$(CONFIG_ARCH_MX53) := 0x70800000 | ||
diff --git a/arch/arm/mach-mx5/pm-imx5.c b/arch/arm/mach-mx5/pm-imx5.c deleted file mode 100644 index 98052fc852c7..000000000000 --- a/arch/arm/mach-mx5/pm-imx5.c +++ /dev/null | |||
@@ -1,83 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2011 Freescale Semiconductor, Inc. All Rights Reserved. | ||
3 | * | ||
4 | * The code contained herein is licensed under the GNU General Public | ||
5 | * License. You may obtain a copy of the GNU General Public License | ||
6 | * Version 2 or later at the following locations: | ||
7 | * | ||
8 | * http://www.opensource.org/licenses/gpl-license.html | ||
9 | * http://www.gnu.org/copyleft/gpl.html | ||
10 | */ | ||
11 | #include <linux/suspend.h> | ||
12 | #include <linux/clk.h> | ||
13 | #include <linux/io.h> | ||
14 | #include <linux/err.h> | ||
15 | #include <asm/cacheflush.h> | ||
16 | #include <asm/tlbflush.h> | ||
17 | #include <mach/common.h> | ||
18 | #include <mach/hardware.h> | ||
19 | #include "crm_regs.h" | ||
20 | |||
21 | static struct clk *gpc_dvfs_clk; | ||
22 | |||
23 | static int mx5_suspend_prepare(void) | ||
24 | { | ||
25 | return clk_enable(gpc_dvfs_clk); | ||
26 | } | ||
27 | |||
28 | static int mx5_suspend_enter(suspend_state_t state) | ||
29 | { | ||
30 | switch (state) { | ||
31 | case PM_SUSPEND_MEM: | ||
32 | mx5_cpu_lp_set(STOP_POWER_OFF); | ||
33 | break; | ||
34 | case PM_SUSPEND_STANDBY: | ||
35 | mx5_cpu_lp_set(WAIT_UNCLOCKED_POWER_OFF); | ||
36 | break; | ||
37 | default: | ||
38 | return -EINVAL; | ||
39 | } | ||
40 | |||
41 | if (state == PM_SUSPEND_MEM) { | ||
42 | local_flush_tlb_all(); | ||
43 | flush_cache_all(); | ||
44 | |||
45 | /*clear the EMPGC0/1 bits */ | ||
46 | __raw_writel(0, MXC_SRPG_EMPGC0_SRPGCR); | ||
47 | __raw_writel(0, MXC_SRPG_EMPGC1_SRPGCR); | ||
48 | } | ||
49 | cpu_do_idle(); | ||
50 | return 0; | ||
51 | } | ||
52 | |||
53 | static void mx5_suspend_finish(void) | ||
54 | { | ||
55 | clk_disable(gpc_dvfs_clk); | ||
56 | } | ||
57 | |||
58 | static int mx5_pm_valid(suspend_state_t state) | ||
59 | { | ||
60 | return (state > PM_SUSPEND_ON && state <= PM_SUSPEND_MAX); | ||
61 | } | ||
62 | |||
63 | static const struct platform_suspend_ops mx5_suspend_ops = { | ||
64 | .valid = mx5_pm_valid, | ||
65 | .prepare = mx5_suspend_prepare, | ||
66 | .enter = mx5_suspend_enter, | ||
67 | .finish = mx5_suspend_finish, | ||
68 | }; | ||
69 | |||
70 | static int __init mx5_pm_init(void) | ||
71 | { | ||
72 | if (gpc_dvfs_clk == NULL) | ||
73 | gpc_dvfs_clk = clk_get(NULL, "gpc_dvfs"); | ||
74 | |||
75 | if (!IS_ERR(gpc_dvfs_clk)) { | ||
76 | if (cpu_is_mx51()) | ||
77 | suspend_set_ops(&mx5_suspend_ops); | ||
78 | } else | ||
79 | return -EPERM; | ||
80 | |||
81 | return 0; | ||
82 | } | ||
83 | device_initcall(mx5_pm_init); | ||
diff --git a/arch/arm/mach-omap1/gpio15xx.c b/arch/arm/mach-omap1/gpio15xx.c index 399da4ce017b..634903ef8292 100644 --- a/arch/arm/mach-omap1/gpio15xx.c +++ b/arch/arm/mach-omap1/gpio15xx.c | |||
@@ -42,11 +42,12 @@ static struct omap_gpio_reg_offs omap15xx_mpuio_regs = { | |||
42 | .irqstatus = OMAP_MPUIO_GPIO_INT, | 42 | .irqstatus = OMAP_MPUIO_GPIO_INT, |
43 | .irqenable = OMAP_MPUIO_GPIO_MASKIT, | 43 | .irqenable = OMAP_MPUIO_GPIO_MASKIT, |
44 | .irqenable_inv = true, | 44 | .irqenable_inv = true, |
45 | .irqctrl = OMAP_MPUIO_GPIO_INT_EDGE, | ||
45 | }; | 46 | }; |
46 | 47 | ||
47 | static struct __initdata omap_gpio_platform_data omap15xx_mpu_gpio_config = { | 48 | static struct __initdata omap_gpio_platform_data omap15xx_mpu_gpio_config = { |
48 | .virtual_irq_start = IH_MPUIO_BASE, | 49 | .virtual_irq_start = IH_MPUIO_BASE, |
49 | .bank_type = METHOD_MPUIO, | 50 | .is_mpuio = true, |
50 | .bank_width = 16, | 51 | .bank_width = 16, |
51 | .bank_stride = 1, | 52 | .bank_stride = 1, |
52 | .regs = &omap15xx_mpuio_regs, | 53 | .regs = &omap15xx_mpuio_regs, |
@@ -83,11 +84,12 @@ static struct omap_gpio_reg_offs omap15xx_gpio_regs = { | |||
83 | .irqstatus = OMAP1510_GPIO_INT_STATUS, | 84 | .irqstatus = OMAP1510_GPIO_INT_STATUS, |
84 | .irqenable = OMAP1510_GPIO_INT_MASK, | 85 | .irqenable = OMAP1510_GPIO_INT_MASK, |
85 | .irqenable_inv = true, | 86 | .irqenable_inv = true, |
87 | .irqctrl = OMAP1510_GPIO_INT_CONTROL, | ||
88 | .pinctrl = OMAP1510_GPIO_PIN_CONTROL, | ||
86 | }; | 89 | }; |
87 | 90 | ||
88 | static struct __initdata omap_gpio_platform_data omap15xx_gpio_config = { | 91 | static struct __initdata omap_gpio_platform_data omap15xx_gpio_config = { |
89 | .virtual_irq_start = IH_GPIO_BASE, | 92 | .virtual_irq_start = IH_GPIO_BASE, |
90 | .bank_type = METHOD_GPIO_1510, | ||
91 | .bank_width = 16, | 93 | .bank_width = 16, |
92 | .regs = &omap15xx_gpio_regs, | 94 | .regs = &omap15xx_gpio_regs, |
93 | }; | 95 | }; |
@@ -115,7 +117,6 @@ static int __init omap15xx_gpio_init(void) | |||
115 | platform_device_register(&omap15xx_mpu_gpio); | 117 | platform_device_register(&omap15xx_mpu_gpio); |
116 | platform_device_register(&omap15xx_gpio); | 118 | platform_device_register(&omap15xx_gpio); |
117 | 119 | ||
118 | gpio_bank_count = 2; | ||
119 | return 0; | 120 | return 0; |
120 | } | 121 | } |
121 | postcore_initcall(omap15xx_gpio_init); | 122 | postcore_initcall(omap15xx_gpio_init); |
diff --git a/arch/arm/mach-omap1/gpio16xx.c b/arch/arm/mach-omap1/gpio16xx.c index 0f399bd0e70e..1c5f90e17427 100644 --- a/arch/arm/mach-omap1/gpio16xx.c +++ b/arch/arm/mach-omap1/gpio16xx.c | |||
@@ -24,6 +24,9 @@ | |||
24 | #define OMAP1610_GPIO4_BASE 0xfffbbc00 | 24 | #define OMAP1610_GPIO4_BASE 0xfffbbc00 |
25 | #define OMAP1_MPUIO_VBASE OMAP1_MPUIO_BASE | 25 | #define OMAP1_MPUIO_VBASE OMAP1_MPUIO_BASE |
26 | 26 | ||
27 | /* smart idle, enable wakeup */ | ||
28 | #define SYSCONFIG_WORD 0x14 | ||
29 | |||
27 | /* mpu gpio */ | 30 | /* mpu gpio */ |
28 | static struct __initdata resource omap16xx_mpu_gpio_resources[] = { | 31 | static struct __initdata resource omap16xx_mpu_gpio_resources[] = { |
29 | { | 32 | { |
@@ -45,11 +48,12 @@ static struct omap_gpio_reg_offs omap16xx_mpuio_regs = { | |||
45 | .irqstatus = OMAP_MPUIO_GPIO_INT, | 48 | .irqstatus = OMAP_MPUIO_GPIO_INT, |
46 | .irqenable = OMAP_MPUIO_GPIO_MASKIT, | 49 | .irqenable = OMAP_MPUIO_GPIO_MASKIT, |
47 | .irqenable_inv = true, | 50 | .irqenable_inv = true, |
51 | .irqctrl = OMAP_MPUIO_GPIO_INT_EDGE, | ||
48 | }; | 52 | }; |
49 | 53 | ||
50 | static struct __initdata omap_gpio_platform_data omap16xx_mpu_gpio_config = { | 54 | static struct __initdata omap_gpio_platform_data omap16xx_mpu_gpio_config = { |
51 | .virtual_irq_start = IH_MPUIO_BASE, | 55 | .virtual_irq_start = IH_MPUIO_BASE, |
52 | .bank_type = METHOD_MPUIO, | 56 | .is_mpuio = true, |
53 | .bank_width = 16, | 57 | .bank_width = 16, |
54 | .bank_stride = 1, | 58 | .bank_stride = 1, |
55 | .regs = &omap16xx_mpuio_regs, | 59 | .regs = &omap16xx_mpuio_regs, |
@@ -89,11 +93,13 @@ static struct omap_gpio_reg_offs omap16xx_gpio_regs = { | |||
89 | .irqenable = OMAP1610_GPIO_IRQENABLE1, | 93 | .irqenable = OMAP1610_GPIO_IRQENABLE1, |
90 | .set_irqenable = OMAP1610_GPIO_SET_IRQENABLE1, | 94 | .set_irqenable = OMAP1610_GPIO_SET_IRQENABLE1, |
91 | .clr_irqenable = OMAP1610_GPIO_CLEAR_IRQENABLE1, | 95 | .clr_irqenable = OMAP1610_GPIO_CLEAR_IRQENABLE1, |
96 | .wkup_en = OMAP1610_GPIO_WAKEUPENABLE, | ||
97 | .edgectrl1 = OMAP1610_GPIO_EDGE_CTRL1, | ||
98 | .edgectrl2 = OMAP1610_GPIO_EDGE_CTRL2, | ||
92 | }; | 99 | }; |
93 | 100 | ||
94 | static struct __initdata omap_gpio_platform_data omap16xx_gpio1_config = { | 101 | static struct __initdata omap_gpio_platform_data omap16xx_gpio1_config = { |
95 | .virtual_irq_start = IH_GPIO_BASE, | 102 | .virtual_irq_start = IH_GPIO_BASE, |
96 | .bank_type = METHOD_GPIO_1610, | ||
97 | .bank_width = 16, | 103 | .bank_width = 16, |
98 | .regs = &omap16xx_gpio_regs, | 104 | .regs = &omap16xx_gpio_regs, |
99 | }; | 105 | }; |
@@ -123,7 +129,6 @@ static struct __initdata resource omap16xx_gpio2_resources[] = { | |||
123 | 129 | ||
124 | static struct __initdata omap_gpio_platform_data omap16xx_gpio2_config = { | 130 | static struct __initdata omap_gpio_platform_data omap16xx_gpio2_config = { |
125 | .virtual_irq_start = IH_GPIO_BASE + 16, | 131 | .virtual_irq_start = IH_GPIO_BASE + 16, |
126 | .bank_type = METHOD_GPIO_1610, | ||
127 | .bank_width = 16, | 132 | .bank_width = 16, |
128 | .regs = &omap16xx_gpio_regs, | 133 | .regs = &omap16xx_gpio_regs, |
129 | }; | 134 | }; |
@@ -153,7 +158,6 @@ static struct __initdata resource omap16xx_gpio3_resources[] = { | |||
153 | 158 | ||
154 | static struct __initdata omap_gpio_platform_data omap16xx_gpio3_config = { | 159 | static struct __initdata omap_gpio_platform_data omap16xx_gpio3_config = { |
155 | .virtual_irq_start = IH_GPIO_BASE + 32, | 160 | .virtual_irq_start = IH_GPIO_BASE + 32, |
156 | .bank_type = METHOD_GPIO_1610, | ||
157 | .bank_width = 16, | 161 | .bank_width = 16, |
158 | .regs = &omap16xx_gpio_regs, | 162 | .regs = &omap16xx_gpio_regs, |
159 | }; | 163 | }; |
@@ -183,7 +187,6 @@ static struct __initdata resource omap16xx_gpio4_resources[] = { | |||
183 | 187 | ||
184 | static struct __initdata omap_gpio_platform_data omap16xx_gpio4_config = { | 188 | static struct __initdata omap_gpio_platform_data omap16xx_gpio4_config = { |
185 | .virtual_irq_start = IH_GPIO_BASE + 48, | 189 | .virtual_irq_start = IH_GPIO_BASE + 48, |
186 | .bank_type = METHOD_GPIO_1610, | ||
187 | .bank_width = 16, | 190 | .bank_width = 16, |
188 | .regs = &omap16xx_gpio_regs, | 191 | .regs = &omap16xx_gpio_regs, |
189 | }; | 192 | }; |
@@ -214,14 +217,42 @@ static struct __initdata platform_device * omap16xx_gpio_dev[] = { | |||
214 | static int __init omap16xx_gpio_init(void) | 217 | static int __init omap16xx_gpio_init(void) |
215 | { | 218 | { |
216 | int i; | 219 | int i; |
220 | void __iomem *base; | ||
221 | struct resource *res; | ||
222 | struct platform_device *pdev; | ||
223 | struct omap_gpio_platform_data *pdata; | ||
217 | 224 | ||
218 | if (!cpu_is_omap16xx()) | 225 | if (!cpu_is_omap16xx()) |
219 | return -EINVAL; | 226 | return -EINVAL; |
220 | 227 | ||
221 | for (i = 0; i < ARRAY_SIZE(omap16xx_gpio_dev); i++) | 228 | for (i = 0; i < ARRAY_SIZE(omap16xx_gpio_dev); i++) { |
222 | platform_device_register(omap16xx_gpio_dev[i]); | 229 | pdev = omap16xx_gpio_dev[i]; |
230 | pdata = pdev->dev.platform_data; | ||
231 | |||
232 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
233 | if (unlikely(!res)) { | ||
234 | dev_err(&pdev->dev, "Invalid mem resource.\n"); | ||
235 | return -ENODEV; | ||
236 | } | ||
237 | |||
238 | base = ioremap(res->start, resource_size(res)); | ||
239 | if (unlikely(!base)) { | ||
240 | dev_err(&pdev->dev, "ioremap failed.\n"); | ||
241 | return -ENOMEM; | ||
242 | } | ||
223 | 243 | ||
224 | gpio_bank_count = ARRAY_SIZE(omap16xx_gpio_dev); | 244 | __raw_writel(SYSCONFIG_WORD, base + OMAP1610_GPIO_SYSCONFIG); |
245 | iounmap(base); | ||
246 | |||
247 | /* | ||
248 | * Enable system clock for GPIO module. | ||
249 | * The CAM_CLK_CTRL *is* really the right place. | ||
250 | */ | ||
251 | omap_writel(omap_readl(ULPD_CAM_CLK_CTRL) | 0x04, | ||
252 | ULPD_CAM_CLK_CTRL); | ||
253 | |||
254 | platform_device_register(omap16xx_gpio_dev[i]); | ||
255 | } | ||
225 | 256 | ||
226 | return 0; | 257 | return 0; |
227 | } | 258 | } |
diff --git a/arch/arm/mach-omap1/gpio7xx.c b/arch/arm/mach-omap1/gpio7xx.c index 5ab63eab0ff5..4771d6b68b96 100644 --- a/arch/arm/mach-omap1/gpio7xx.c +++ b/arch/arm/mach-omap1/gpio7xx.c | |||
@@ -47,12 +47,13 @@ static struct omap_gpio_reg_offs omap7xx_mpuio_regs = { | |||
47 | .irqstatus = OMAP_MPUIO_GPIO_INT / 2, | 47 | .irqstatus = OMAP_MPUIO_GPIO_INT / 2, |
48 | .irqenable = OMAP_MPUIO_GPIO_MASKIT / 2, | 48 | .irqenable = OMAP_MPUIO_GPIO_MASKIT / 2, |
49 | .irqenable_inv = true, | 49 | .irqenable_inv = true, |
50 | .irqctrl = OMAP_MPUIO_GPIO_INT_EDGE >> 1, | ||
50 | }; | 51 | }; |
51 | 52 | ||
52 | static struct __initdata omap_gpio_platform_data omap7xx_mpu_gpio_config = { | 53 | static struct __initdata omap_gpio_platform_data omap7xx_mpu_gpio_config = { |
53 | .virtual_irq_start = IH_MPUIO_BASE, | 54 | .virtual_irq_start = IH_MPUIO_BASE, |
54 | .bank_type = METHOD_MPUIO, | 55 | .is_mpuio = true, |
55 | .bank_width = 32, | 56 | .bank_width = 16, |
56 | .bank_stride = 2, | 57 | .bank_stride = 2, |
57 | .regs = &omap7xx_mpuio_regs, | 58 | .regs = &omap7xx_mpuio_regs, |
58 | }; | 59 | }; |
@@ -88,11 +89,11 @@ static struct omap_gpio_reg_offs omap7xx_gpio_regs = { | |||
88 | .irqstatus = OMAP7XX_GPIO_INT_STATUS, | 89 | .irqstatus = OMAP7XX_GPIO_INT_STATUS, |
89 | .irqenable = OMAP7XX_GPIO_INT_MASK, | 90 | .irqenable = OMAP7XX_GPIO_INT_MASK, |
90 | .irqenable_inv = true, | 91 | .irqenable_inv = true, |
92 | .irqctrl = OMAP7XX_GPIO_INT_CONTROL, | ||
91 | }; | 93 | }; |
92 | 94 | ||
93 | static struct __initdata omap_gpio_platform_data omap7xx_gpio1_config = { | 95 | static struct __initdata omap_gpio_platform_data omap7xx_gpio1_config = { |
94 | .virtual_irq_start = IH_GPIO_BASE, | 96 | .virtual_irq_start = IH_GPIO_BASE, |
95 | .bank_type = METHOD_GPIO_7XX, | ||
96 | .bank_width = 32, | 97 | .bank_width = 32, |
97 | .regs = &omap7xx_gpio_regs, | 98 | .regs = &omap7xx_gpio_regs, |
98 | }; | 99 | }; |
@@ -122,7 +123,6 @@ static struct __initdata resource omap7xx_gpio2_resources[] = { | |||
122 | 123 | ||
123 | static struct __initdata omap_gpio_platform_data omap7xx_gpio2_config = { | 124 | static struct __initdata omap_gpio_platform_data omap7xx_gpio2_config = { |
124 | .virtual_irq_start = IH_GPIO_BASE + 32, | 125 | .virtual_irq_start = IH_GPIO_BASE + 32, |
125 | .bank_type = METHOD_GPIO_7XX, | ||
126 | .bank_width = 32, | 126 | .bank_width = 32, |
127 | .regs = &omap7xx_gpio_regs, | 127 | .regs = &omap7xx_gpio_regs, |
128 | }; | 128 | }; |
@@ -152,7 +152,6 @@ static struct __initdata resource omap7xx_gpio3_resources[] = { | |||
152 | 152 | ||
153 | static struct __initdata omap_gpio_platform_data omap7xx_gpio3_config = { | 153 | static struct __initdata omap_gpio_platform_data omap7xx_gpio3_config = { |
154 | .virtual_irq_start = IH_GPIO_BASE + 64, | 154 | .virtual_irq_start = IH_GPIO_BASE + 64, |
155 | .bank_type = METHOD_GPIO_7XX, | ||
156 | .bank_width = 32, | 155 | .bank_width = 32, |
157 | .regs = &omap7xx_gpio_regs, | 156 | .regs = &omap7xx_gpio_regs, |
158 | }; | 157 | }; |
@@ -182,7 +181,6 @@ static struct __initdata resource omap7xx_gpio4_resources[] = { | |||
182 | 181 | ||
183 | static struct __initdata omap_gpio_platform_data omap7xx_gpio4_config = { | 182 | static struct __initdata omap_gpio_platform_data omap7xx_gpio4_config = { |
184 | .virtual_irq_start = IH_GPIO_BASE + 96, | 183 | .virtual_irq_start = IH_GPIO_BASE + 96, |
185 | .bank_type = METHOD_GPIO_7XX, | ||
186 | .bank_width = 32, | 184 | .bank_width = 32, |
187 | .regs = &omap7xx_gpio_regs, | 185 | .regs = &omap7xx_gpio_regs, |
188 | }; | 186 | }; |
@@ -212,7 +210,6 @@ static struct __initdata resource omap7xx_gpio5_resources[] = { | |||
212 | 210 | ||
213 | static struct __initdata omap_gpio_platform_data omap7xx_gpio5_config = { | 211 | static struct __initdata omap_gpio_platform_data omap7xx_gpio5_config = { |
214 | .virtual_irq_start = IH_GPIO_BASE + 128, | 212 | .virtual_irq_start = IH_GPIO_BASE + 128, |
215 | .bank_type = METHOD_GPIO_7XX, | ||
216 | .bank_width = 32, | 213 | .bank_width = 32, |
217 | .regs = &omap7xx_gpio_regs, | 214 | .regs = &omap7xx_gpio_regs, |
218 | }; | 215 | }; |
@@ -242,7 +239,6 @@ static struct __initdata resource omap7xx_gpio6_resources[] = { | |||
242 | 239 | ||
243 | static struct __initdata omap_gpio_platform_data omap7xx_gpio6_config = { | 240 | static struct __initdata omap_gpio_platform_data omap7xx_gpio6_config = { |
244 | .virtual_irq_start = IH_GPIO_BASE + 160, | 241 | .virtual_irq_start = IH_GPIO_BASE + 160, |
245 | .bank_type = METHOD_GPIO_7XX, | ||
246 | .bank_width = 32, | 242 | .bank_width = 32, |
247 | .regs = &omap7xx_gpio_regs, | 243 | .regs = &omap7xx_gpio_regs, |
248 | }; | 244 | }; |
@@ -282,8 +278,6 @@ static int __init omap7xx_gpio_init(void) | |||
282 | for (i = 0; i < ARRAY_SIZE(omap7xx_gpio_dev); i++) | 278 | for (i = 0; i < ARRAY_SIZE(omap7xx_gpio_dev); i++) |
283 | platform_device_register(omap7xx_gpio_dev[i]); | 279 | platform_device_register(omap7xx_gpio_dev[i]); |
284 | 280 | ||
285 | gpio_bank_count = ARRAY_SIZE(omap7xx_gpio_dev); | ||
286 | |||
287 | return 0; | 281 | return 0; |
288 | } | 282 | } |
289 | postcore_initcall(omap7xx_gpio_init); | 283 | postcore_initcall(omap7xx_gpio_init); |
diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig index a8ba7b96dcd1..41e6612ecbaf 100644 --- a/arch/arm/mach-omap2/Kconfig +++ b/arch/arm/mach-omap2/Kconfig | |||
@@ -33,7 +33,6 @@ config ARCH_OMAP3 | |||
33 | default y | 33 | default y |
34 | select CPU_V7 | 34 | select CPU_V7 |
35 | select USB_ARCH_HAS_EHCI | 35 | select USB_ARCH_HAS_EHCI |
36 | select ARM_L1_CACHE_SHIFT_6 if !ARCH_OMAP4 | ||
37 | select ARCH_HAS_OPP | 36 | select ARCH_HAS_OPP |
38 | select PM_OPP if PM | 37 | select PM_OPP if PM |
39 | select ARM_CPU_SUSPEND if PM | 38 | select ARM_CPU_SUSPEND if PM |
diff --git a/arch/arm/mach-omap2/gpio.c b/arch/arm/mach-omap2/gpio.c index 8cbfbc2918ce..1e0b750afcaa 100644 --- a/arch/arm/mach-omap2/gpio.c +++ b/arch/arm/mach-omap2/gpio.c | |||
@@ -23,6 +23,9 @@ | |||
23 | 23 | ||
24 | #include <plat/omap_hwmod.h> | 24 | #include <plat/omap_hwmod.h> |
25 | #include <plat/omap_device.h> | 25 | #include <plat/omap_device.h> |
26 | #include <plat/omap-pm.h> | ||
27 | |||
28 | #include "powerdomain.h" | ||
26 | 29 | ||
27 | static int omap2_gpio_dev_init(struct omap_hwmod *oh, void *unused) | 30 | static int omap2_gpio_dev_init(struct omap_hwmod *oh, void *unused) |
28 | { | 31 | { |
@@ -31,6 +34,7 @@ static int omap2_gpio_dev_init(struct omap_hwmod *oh, void *unused) | |||
31 | struct omap_gpio_dev_attr *dev_attr; | 34 | struct omap_gpio_dev_attr *dev_attr; |
32 | char *name = "omap_gpio"; | 35 | char *name = "omap_gpio"; |
33 | int id; | 36 | int id; |
37 | struct powerdomain *pwrdm; | ||
34 | 38 | ||
35 | /* | 39 | /* |
36 | * extract the device id from name field available in the | 40 | * extract the device id from name field available in the |
@@ -52,7 +56,7 @@ static int omap2_gpio_dev_init(struct omap_hwmod *oh, void *unused) | |||
52 | pdata->bank_width = dev_attr->bank_width; | 56 | pdata->bank_width = dev_attr->bank_width; |
53 | pdata->dbck_flag = dev_attr->dbck_flag; | 57 | pdata->dbck_flag = dev_attr->dbck_flag; |
54 | pdata->virtual_irq_start = IH_GPIO_BASE + 32 * (id - 1); | 58 | pdata->virtual_irq_start = IH_GPIO_BASE + 32 * (id - 1); |
55 | 59 | pdata->get_context_loss_count = omap_pm_get_dev_context_loss_count; | |
56 | pdata->regs = kzalloc(sizeof(struct omap_gpio_reg_offs), GFP_KERNEL); | 60 | pdata->regs = kzalloc(sizeof(struct omap_gpio_reg_offs), GFP_KERNEL); |
57 | if (!pdata) { | 61 | if (!pdata) { |
58 | pr_err("gpio%d: Memory allocation failed\n", id); | 62 | pr_err("gpio%d: Memory allocation failed\n", id); |
@@ -61,8 +65,15 @@ static int omap2_gpio_dev_init(struct omap_hwmod *oh, void *unused) | |||
61 | 65 | ||
62 | switch (oh->class->rev) { | 66 | switch (oh->class->rev) { |
63 | case 0: | 67 | case 0: |
68 | if (id == 1) | ||
69 | /* non-wakeup GPIO pins for OMAP2 Bank1 */ | ||
70 | pdata->non_wakeup_gpios = 0xe203ffc0; | ||
71 | else if (id == 2) | ||
72 | /* non-wakeup GPIO pins for OMAP2 Bank2 */ | ||
73 | pdata->non_wakeup_gpios = 0x08700040; | ||
74 | /* fall through */ | ||
75 | |||
64 | case 1: | 76 | case 1: |
65 | pdata->bank_type = METHOD_GPIO_24XX; | ||
66 | pdata->regs->revision = OMAP24XX_GPIO_REVISION; | 77 | pdata->regs->revision = OMAP24XX_GPIO_REVISION; |
67 | pdata->regs->direction = OMAP24XX_GPIO_OE; | 78 | pdata->regs->direction = OMAP24XX_GPIO_OE; |
68 | pdata->regs->datain = OMAP24XX_GPIO_DATAIN; | 79 | pdata->regs->datain = OMAP24XX_GPIO_DATAIN; |
@@ -72,13 +83,19 @@ static int omap2_gpio_dev_init(struct omap_hwmod *oh, void *unused) | |||
72 | pdata->regs->irqstatus = OMAP24XX_GPIO_IRQSTATUS1; | 83 | pdata->regs->irqstatus = OMAP24XX_GPIO_IRQSTATUS1; |
73 | pdata->regs->irqstatus2 = OMAP24XX_GPIO_IRQSTATUS2; | 84 | pdata->regs->irqstatus2 = OMAP24XX_GPIO_IRQSTATUS2; |
74 | pdata->regs->irqenable = OMAP24XX_GPIO_IRQENABLE1; | 85 | pdata->regs->irqenable = OMAP24XX_GPIO_IRQENABLE1; |
86 | pdata->regs->irqenable2 = OMAP24XX_GPIO_IRQENABLE2; | ||
75 | pdata->regs->set_irqenable = OMAP24XX_GPIO_SETIRQENABLE1; | 87 | pdata->regs->set_irqenable = OMAP24XX_GPIO_SETIRQENABLE1; |
76 | pdata->regs->clr_irqenable = OMAP24XX_GPIO_CLEARIRQENABLE1; | 88 | pdata->regs->clr_irqenable = OMAP24XX_GPIO_CLEARIRQENABLE1; |
77 | pdata->regs->debounce = OMAP24XX_GPIO_DEBOUNCE_VAL; | 89 | pdata->regs->debounce = OMAP24XX_GPIO_DEBOUNCE_VAL; |
78 | pdata->regs->debounce_en = OMAP24XX_GPIO_DEBOUNCE_EN; | 90 | pdata->regs->debounce_en = OMAP24XX_GPIO_DEBOUNCE_EN; |
91 | pdata->regs->ctrl = OMAP24XX_GPIO_CTRL; | ||
92 | pdata->regs->wkup_en = OMAP24XX_GPIO_WAKE_EN; | ||
93 | pdata->regs->leveldetect0 = OMAP24XX_GPIO_LEVELDETECT0; | ||
94 | pdata->regs->leveldetect1 = OMAP24XX_GPIO_LEVELDETECT1; | ||
95 | pdata->regs->risingdetect = OMAP24XX_GPIO_RISINGDETECT; | ||
96 | pdata->regs->fallingdetect = OMAP24XX_GPIO_FALLINGDETECT; | ||
79 | break; | 97 | break; |
80 | case 2: | 98 | case 2: |
81 | pdata->bank_type = METHOD_GPIO_44XX; | ||
82 | pdata->regs->revision = OMAP4_GPIO_REVISION; | 99 | pdata->regs->revision = OMAP4_GPIO_REVISION; |
83 | pdata->regs->direction = OMAP4_GPIO_OE; | 100 | pdata->regs->direction = OMAP4_GPIO_OE; |
84 | pdata->regs->datain = OMAP4_GPIO_DATAIN; | 101 | pdata->regs->datain = OMAP4_GPIO_DATAIN; |
@@ -88,10 +105,17 @@ static int omap2_gpio_dev_init(struct omap_hwmod *oh, void *unused) | |||
88 | pdata->regs->irqstatus = OMAP4_GPIO_IRQSTATUS0; | 105 | pdata->regs->irqstatus = OMAP4_GPIO_IRQSTATUS0; |
89 | pdata->regs->irqstatus2 = OMAP4_GPIO_IRQSTATUS1; | 106 | pdata->regs->irqstatus2 = OMAP4_GPIO_IRQSTATUS1; |
90 | pdata->regs->irqenable = OMAP4_GPIO_IRQSTATUSSET0; | 107 | pdata->regs->irqenable = OMAP4_GPIO_IRQSTATUSSET0; |
108 | pdata->regs->irqenable2 = OMAP4_GPIO_IRQSTATUSSET1; | ||
91 | pdata->regs->set_irqenable = OMAP4_GPIO_IRQSTATUSSET0; | 109 | pdata->regs->set_irqenable = OMAP4_GPIO_IRQSTATUSSET0; |
92 | pdata->regs->clr_irqenable = OMAP4_GPIO_IRQSTATUSCLR0; | 110 | pdata->regs->clr_irqenable = OMAP4_GPIO_IRQSTATUSCLR0; |
93 | pdata->regs->debounce = OMAP4_GPIO_DEBOUNCINGTIME; | 111 | pdata->regs->debounce = OMAP4_GPIO_DEBOUNCINGTIME; |
94 | pdata->regs->debounce_en = OMAP4_GPIO_DEBOUNCENABLE; | 112 | pdata->regs->debounce_en = OMAP4_GPIO_DEBOUNCENABLE; |
113 | pdata->regs->ctrl = OMAP4_GPIO_CTRL; | ||
114 | pdata->regs->wkup_en = OMAP4_GPIO_IRQWAKEN0; | ||
115 | pdata->regs->leveldetect0 = OMAP4_GPIO_LEVELDETECT0; | ||
116 | pdata->regs->leveldetect1 = OMAP4_GPIO_LEVELDETECT1; | ||
117 | pdata->regs->risingdetect = OMAP4_GPIO_RISINGDETECT; | ||
118 | pdata->regs->fallingdetect = OMAP4_GPIO_FALLINGDETECT; | ||
95 | break; | 119 | break; |
96 | default: | 120 | default: |
97 | WARN(1, "Invalid gpio bank_type\n"); | 121 | WARN(1, "Invalid gpio bank_type\n"); |
@@ -99,6 +123,9 @@ static int omap2_gpio_dev_init(struct omap_hwmod *oh, void *unused) | |||
99 | return -EINVAL; | 123 | return -EINVAL; |
100 | } | 124 | } |
101 | 125 | ||
126 | pwrdm = omap_hwmod_get_pwrdm(oh); | ||
127 | pdata->loses_context = pwrdm_can_ever_lose_context(pwrdm); | ||
128 | |||
102 | pdev = omap_device_build(name, id - 1, oh, pdata, | 129 | pdev = omap_device_build(name, id - 1, oh, pdata, |
103 | sizeof(*pdata), NULL, 0, false); | 130 | sizeof(*pdata), NULL, 0, false); |
104 | kfree(pdata); | 131 | kfree(pdata); |
@@ -109,9 +136,6 @@ static int omap2_gpio_dev_init(struct omap_hwmod *oh, void *unused) | |||
109 | return PTR_ERR(pdev); | 136 | return PTR_ERR(pdev); |
110 | } | 137 | } |
111 | 138 | ||
112 | omap_device_disable_idle_on_suspend(pdev); | ||
113 | |||
114 | gpio_bank_count++; | ||
115 | return 0; | 139 | return 0; |
116 | } | 140 | } |
117 | 141 | ||
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index fc6987578920..59c6dc16dd1d 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c | |||
@@ -75,16 +75,6 @@ static struct powerdomain *mpu_pwrdm, *neon_pwrdm; | |||
75 | static struct powerdomain *core_pwrdm, *per_pwrdm; | 75 | static struct powerdomain *core_pwrdm, *per_pwrdm; |
76 | static struct powerdomain *cam_pwrdm; | 76 | static struct powerdomain *cam_pwrdm; |
77 | 77 | ||
78 | static inline void omap3_per_save_context(void) | ||
79 | { | ||
80 | omap_gpio_save_context(); | ||
81 | } | ||
82 | |||
83 | static inline void omap3_per_restore_context(void) | ||
84 | { | ||
85 | omap_gpio_restore_context(); | ||
86 | } | ||
87 | |||
88 | static void omap3_enable_io_chain(void) | 78 | static void omap3_enable_io_chain(void) |
89 | { | 79 | { |
90 | int timeout = 0; | 80 | int timeout = 0; |
@@ -332,8 +322,6 @@ void omap_sram_idle(void) | |||
332 | if (per_next_state < PWRDM_POWER_ON) { | 322 | if (per_next_state < PWRDM_POWER_ON) { |
333 | per_going_off = (per_next_state == PWRDM_POWER_OFF) ? 1 : 0; | 323 | per_going_off = (per_next_state == PWRDM_POWER_OFF) ? 1 : 0; |
334 | omap2_gpio_prepare_for_idle(per_going_off); | 324 | omap2_gpio_prepare_for_idle(per_going_off); |
335 | if (per_next_state == PWRDM_POWER_OFF) | ||
336 | omap3_per_save_context(); | ||
337 | } | 325 | } |
338 | 326 | ||
339 | /* CORE */ | 327 | /* CORE */ |
@@ -399,8 +387,6 @@ void omap_sram_idle(void) | |||
399 | if (per_next_state < PWRDM_POWER_ON) { | 387 | if (per_next_state < PWRDM_POWER_ON) { |
400 | per_prev_state = pwrdm_read_prev_pwrst(per_pwrdm); | 388 | per_prev_state = pwrdm_read_prev_pwrst(per_pwrdm); |
401 | omap2_gpio_resume_after_idle(); | 389 | omap2_gpio_resume_after_idle(); |
402 | if (per_prev_state == PWRDM_POWER_OFF) | ||
403 | omap3_per_restore_context(); | ||
404 | } | 390 | } |
405 | 391 | ||
406 | /* Disable IO-PAD and IO-CHAIN wakeup */ | 392 | /* Disable IO-PAD and IO-CHAIN wakeup */ |
diff --git a/arch/arm/mach-pxa/devices.c b/arch/arm/mach-pxa/devices.c index 18fd177073f4..5bc13121eac5 100644 --- a/arch/arm/mach-pxa/devices.c +++ b/arch/arm/mach-pxa/devices.c | |||
@@ -415,29 +415,9 @@ static struct resource pxa_rtc_resources[] = { | |||
415 | }, | 415 | }, |
416 | }; | 416 | }; |
417 | 417 | ||
418 | static struct resource sa1100_rtc_resources[] = { | ||
419 | [0] = { | ||
420 | .start = 0x40900000, | ||
421 | .end = 0x409000ff, | ||
422 | .flags = IORESOURCE_MEM, | ||
423 | }, | ||
424 | [1] = { | ||
425 | .start = IRQ_RTC1Hz, | ||
426 | .end = IRQ_RTC1Hz, | ||
427 | .flags = IORESOURCE_IRQ, | ||
428 | }, | ||
429 | [2] = { | ||
430 | .start = IRQ_RTCAlrm, | ||
431 | .end = IRQ_RTCAlrm, | ||
432 | .flags = IORESOURCE_IRQ, | ||
433 | }, | ||
434 | }; | ||
435 | |||
436 | struct platform_device sa1100_device_rtc = { | 418 | struct platform_device sa1100_device_rtc = { |
437 | .name = "sa1100-rtc", | 419 | .name = "sa1100-rtc", |
438 | .id = -1, | 420 | .id = -1, |
439 | .num_resources = ARRAY_SIZE(sa1100_rtc_resources), | ||
440 | .resource = sa1100_rtc_resources, | ||
441 | }; | 421 | }; |
442 | 422 | ||
443 | struct platform_device pxa_device_rtc = { | 423 | struct platform_device pxa_device_rtc = { |
diff --git a/arch/arm/mach-pxa/pxa25x.c b/arch/arm/mach-pxa/pxa25x.c index adf058fa97ee..91e4f6c03766 100644 --- a/arch/arm/mach-pxa/pxa25x.c +++ b/arch/arm/mach-pxa/pxa25x.c | |||
@@ -209,8 +209,6 @@ static struct clk_lookup pxa25x_clkregs[] = { | |||
209 | INIT_CLKREG(&clk_pxa25x_gpio11, NULL, "GPIO11_CLK"), | 209 | INIT_CLKREG(&clk_pxa25x_gpio11, NULL, "GPIO11_CLK"), |
210 | INIT_CLKREG(&clk_pxa25x_gpio12, NULL, "GPIO12_CLK"), | 210 | INIT_CLKREG(&clk_pxa25x_gpio12, NULL, "GPIO12_CLK"), |
211 | INIT_CLKREG(&clk_pxa25x_mem, "pxa2xx-pcmcia", NULL), | 211 | INIT_CLKREG(&clk_pxa25x_mem, "pxa2xx-pcmcia", NULL), |
212 | INIT_CLKREG(&clk_dummy, "pxa-gpio", NULL), | ||
213 | INIT_CLKREG(&clk_dummy, "sa1100-rtc", NULL), | ||
214 | }; | 212 | }; |
215 | 213 | ||
216 | static struct clk_lookup pxa25x_hwuart_clkreg = | 214 | static struct clk_lookup pxa25x_hwuart_clkreg = |
diff --git a/arch/arm/mach-pxa/pxa27x.c b/arch/arm/mach-pxa/pxa27x.c index 180bd8675d4b..aed6cbcf3866 100644 --- a/arch/arm/mach-pxa/pxa27x.c +++ b/arch/arm/mach-pxa/pxa27x.c | |||
@@ -230,8 +230,6 @@ static struct clk_lookup pxa27x_clkregs[] = { | |||
230 | INIT_CLKREG(&clk_pxa27x_im, NULL, "IMCLK"), | 230 | INIT_CLKREG(&clk_pxa27x_im, NULL, "IMCLK"), |
231 | INIT_CLKREG(&clk_pxa27x_memc, NULL, "MEMCLK"), | 231 | INIT_CLKREG(&clk_pxa27x_memc, NULL, "MEMCLK"), |
232 | INIT_CLKREG(&clk_pxa27x_mem, "pxa2xx-pcmcia", NULL), | 232 | INIT_CLKREG(&clk_pxa27x_mem, "pxa2xx-pcmcia", NULL), |
233 | INIT_CLKREG(&clk_dummy, "pxa-gpio", NULL), | ||
234 | INIT_CLKREG(&clk_dummy, "sa1100-rtc", NULL), | ||
235 | }; | 233 | }; |
236 | 234 | ||
237 | #ifdef CONFIG_PM | 235 | #ifdef CONFIG_PM |
diff --git a/arch/arm/mach-pxa/pxa300.c b/arch/arm/mach-pxa/pxa300.c index 0388eda7878a..40bb16501d86 100644 --- a/arch/arm/mach-pxa/pxa300.c +++ b/arch/arm/mach-pxa/pxa300.c | |||
@@ -89,7 +89,6 @@ static DEFINE_PXA3_CKEN(gcu, PXA300_GCU, 0, 0); | |||
89 | static struct clk_lookup common_clkregs[] = { | 89 | static struct clk_lookup common_clkregs[] = { |
90 | INIT_CLKREG(&clk_common_nand, "pxa3xx-nand", NULL), | 90 | INIT_CLKREG(&clk_common_nand, "pxa3xx-nand", NULL), |
91 | INIT_CLKREG(&clk_gcu, "pxa3xx-gcu", NULL), | 91 | INIT_CLKREG(&clk_gcu, "pxa3xx-gcu", NULL), |
92 | INIT_CLKREG(&clk_dummy, "sa1100-rtc", NULL), | ||
93 | }; | 92 | }; |
94 | 93 | ||
95 | static DEFINE_PXA3_CKEN(pxa310_mmc3, MMC3, 19500000, 0); | 94 | static DEFINE_PXA3_CKEN(pxa310_mmc3, MMC3, 19500000, 0); |
diff --git a/arch/arm/mach-pxa/pxa320.c b/arch/arm/mach-pxa/pxa320.c index d487e1ff4c9a..8d614ecd8e99 100644 --- a/arch/arm/mach-pxa/pxa320.c +++ b/arch/arm/mach-pxa/pxa320.c | |||
@@ -83,7 +83,6 @@ static DEFINE_PXA3_CKEN(gcu, PXA320_GCU, 0, 0); | |||
83 | static struct clk_lookup pxa320_clkregs[] = { | 83 | static struct clk_lookup pxa320_clkregs[] = { |
84 | INIT_CLKREG(&clk_pxa320_nand, "pxa3xx-nand", NULL), | 84 | INIT_CLKREG(&clk_pxa320_nand, "pxa3xx-nand", NULL), |
85 | INIT_CLKREG(&clk_gcu, "pxa3xx-gcu", NULL), | 85 | INIT_CLKREG(&clk_gcu, "pxa3xx-gcu", NULL), |
86 | INIT_CLKREG(&clk_dummy, "sa1100-rtc", NULL), | ||
87 | }; | 86 | }; |
88 | 87 | ||
89 | static int __init pxa320_init(void) | 88 | static int __init pxa320_init(void) |
diff --git a/arch/arm/mach-pxa/pxa3xx.c b/arch/arm/mach-pxa/pxa3xx.c index f107c71c7589..4f402afa6609 100644 --- a/arch/arm/mach-pxa/pxa3xx.c +++ b/arch/arm/mach-pxa/pxa3xx.c | |||
@@ -67,7 +67,6 @@ static struct clk_lookup pxa3xx_clkregs[] = { | |||
67 | INIT_CLKREG(&clk_pxa3xx_pout, NULL, "CLK_POUT"), | 67 | INIT_CLKREG(&clk_pxa3xx_pout, NULL, "CLK_POUT"), |
68 | /* Power I2C clock is always on */ | 68 | /* Power I2C clock is always on */ |
69 | INIT_CLKREG(&clk_dummy, "pxa3xx-pwri2c.1", NULL), | 69 | INIT_CLKREG(&clk_dummy, "pxa3xx-pwri2c.1", NULL), |
70 | INIT_CLKREG(&clk_dummy, "sa1100-rtc", NULL), | ||
71 | INIT_CLKREG(&clk_pxa3xx_lcd, "pxa2xx-fb", NULL), | 70 | INIT_CLKREG(&clk_pxa3xx_lcd, "pxa2xx-fb", NULL), |
72 | INIT_CLKREG(&clk_pxa3xx_camera, NULL, "CAMCLK"), | 71 | INIT_CLKREG(&clk_pxa3xx_camera, NULL, "CAMCLK"), |
73 | INIT_CLKREG(&clk_pxa3xx_ac97, NULL, "AC97CLK"), | 72 | INIT_CLKREG(&clk_pxa3xx_ac97, NULL, "AC97CLK"), |
diff --git a/arch/arm/mach-pxa/pxa95x.c b/arch/arm/mach-pxa/pxa95x.c index fccc644702e6..d082a583df78 100644 --- a/arch/arm/mach-pxa/pxa95x.c +++ b/arch/arm/mach-pxa/pxa95x.c | |||
@@ -217,7 +217,6 @@ static struct clk_lookup pxa95x_clkregs[] = { | |||
217 | INIT_CLKREG(&clk_pxa95x_pout, NULL, "CLK_POUT"), | 217 | INIT_CLKREG(&clk_pxa95x_pout, NULL, "CLK_POUT"), |
218 | /* Power I2C clock is always on */ | 218 | /* Power I2C clock is always on */ |
219 | INIT_CLKREG(&clk_dummy, "pxa3xx-pwri2c.1", NULL), | 219 | INIT_CLKREG(&clk_dummy, "pxa3xx-pwri2c.1", NULL), |
220 | INIT_CLKREG(&clk_dummy, "sa1100-rtc", NULL), | ||
221 | INIT_CLKREG(&clk_pxa95x_lcd, "pxa2xx-fb", NULL), | 220 | INIT_CLKREG(&clk_pxa95x_lcd, "pxa2xx-fb", NULL), |
222 | INIT_CLKREG(&clk_pxa95x_ffuart, "pxa2xx-uart.0", NULL), | 221 | INIT_CLKREG(&clk_pxa95x_ffuart, "pxa2xx-uart.0", NULL), |
223 | INIT_CLKREG(&clk_pxa95x_btuart, "pxa2xx-uart.1", NULL), | 222 | INIT_CLKREG(&clk_pxa95x_btuart, "pxa2xx-uart.1", NULL), |
diff --git a/arch/arm/mach-realview/hotplug.c b/arch/arm/mach-realview/hotplug.c index ac1aed2a8da4..eb55f05bef3a 100644 --- a/arch/arm/mach-realview/hotplug.c +++ b/arch/arm/mach-realview/hotplug.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/smp.h> | 13 | #include <linux/smp.h> |
14 | 14 | ||
15 | #include <asm/cacheflush.h> | 15 | #include <asm/cacheflush.h> |
16 | #include <asm/smp_plat.h> | ||
16 | 17 | ||
17 | extern volatile int pen_release; | 18 | extern volatile int pen_release; |
18 | 19 | ||
diff --git a/arch/arm/mach-realview/include/mach/board-eb.h b/arch/arm/mach-realview/include/mach/board-eb.h index 794a8d91a6a6..124bce6b4d7b 100644 --- a/arch/arm/mach-realview/include/mach/board-eb.h +++ b/arch/arm/mach-realview/include/mach/board-eb.h | |||
@@ -47,21 +47,23 @@ | |||
47 | #define REALVIEW_EB_USB_BASE 0x4F000000 /* USB */ | 47 | #define REALVIEW_EB_USB_BASE 0x4F000000 /* USB */ |
48 | 48 | ||
49 | #ifdef CONFIG_REALVIEW_EB_ARM11MP_REVB | 49 | #ifdef CONFIG_REALVIEW_EB_ARM11MP_REVB |
50 | #define REALVIEW_EB11MP_SCU_BASE 0x10100000 /* SCU registers */ | 50 | #define REALVIEW_EB11MP_PRIV_MEM_BASE 0x1F000000 |
51 | #define REALVIEW_EB11MP_GIC_CPU_BASE 0x10100100 /* Generic interrupt controller CPU interface */ | ||
52 | #define REALVIEW_EB11MP_TWD_BASE 0x10100600 | ||
53 | #define REALVIEW_EB11MP_GIC_DIST_BASE 0x10101000 /* Generic interrupt controller distributor */ | ||
54 | #define REALVIEW_EB11MP_L220_BASE 0x10102000 /* L220 registers */ | 51 | #define REALVIEW_EB11MP_L220_BASE 0x10102000 /* L220 registers */ |
55 | #define REALVIEW_EB11MP_SYS_PLD_CTRL1 0xD8 /* Register offset for MPCore sysctl */ | 52 | #define REALVIEW_EB11MP_SYS_PLD_CTRL1 0xD8 /* Register offset for MPCore sysctl */ |
56 | #else | 53 | #else |
57 | #define REALVIEW_EB11MP_SCU_BASE 0x1F000000 /* SCU registers */ | 54 | #define REALVIEW_EB11MP_PRIV_MEM_BASE 0x1F000000 |
58 | #define REALVIEW_EB11MP_GIC_CPU_BASE 0x1F000100 /* Generic interrupt controller CPU interface */ | ||
59 | #define REALVIEW_EB11MP_TWD_BASE 0x1F000600 | ||
60 | #define REALVIEW_EB11MP_GIC_DIST_BASE 0x1F001000 /* Generic interrupt controller distributor */ | ||
61 | #define REALVIEW_EB11MP_L220_BASE 0x1F002000 /* L220 registers */ | 55 | #define REALVIEW_EB11MP_L220_BASE 0x1F002000 /* L220 registers */ |
62 | #define REALVIEW_EB11MP_SYS_PLD_CTRL1 0x74 /* Register offset for MPCore sysctl */ | 56 | #define REALVIEW_EB11MP_SYS_PLD_CTRL1 0x74 /* Register offset for MPCore sysctl */ |
63 | #endif | 57 | #endif |
64 | 58 | ||
59 | #define REALVIEW_EB11MP_PRIV_MEM_SIZE SZ_8K | ||
60 | #define REALVIEW_EB11MP_PRIV_MEM_OFF(x) (REALVIEW_EB11MP_PRIV_MEM_BASE + (x)) | ||
61 | |||
62 | #define REALVIEW_EB11MP_SCU_BASE REALVIEW_EB11MP_PRIV_MEM_OFF(0) /* SCU registers */ | ||
63 | #define REALVIEW_EB11MP_GIC_CPU_BASE REALVIEW_EB11MP_PRIV_MEM_OFF(0x0100) /* Generic interrupt controller CPU interface */ | ||
64 | #define REALVIEW_EB11MP_TWD_BASE REALVIEW_EB11MP_PRIV_MEM_OFF(0x0600) | ||
65 | #define REALVIEW_EB11MP_GIC_DIST_BASE REALVIEW_EB11MP_PRIV_MEM_OFF(0x1000) /* Generic interrupt controller distributor */ | ||
66 | |||
65 | /* | 67 | /* |
66 | * Core tile identification (REALVIEW_SYS_PROCID) | 68 | * Core tile identification (REALVIEW_SYS_PROCID) |
67 | */ | 69 | */ |
diff --git a/arch/arm/mach-realview/include/mach/board-pb11mp.h b/arch/arm/mach-realview/include/mach/board-pb11mp.h index 7abf918b77e9..aa2d4e02ea2c 100644 --- a/arch/arm/mach-realview/include/mach/board-pb11mp.h +++ b/arch/arm/mach-realview/include/mach/board-pb11mp.h | |||
@@ -75,6 +75,8 @@ | |||
75 | /* | 75 | /* |
76 | * Testchip peripheral and fpga gic regions | 76 | * Testchip peripheral and fpga gic regions |
77 | */ | 77 | */ |
78 | #define REALVIEW_TC11MP_PRIV_MEM_BASE 0x1F000000 | ||
79 | #define REALVIEW_TC11MP_PRIV_MEM_SIZE SZ_8K | ||
78 | #define REALVIEW_TC11MP_SCU_BASE 0x1F000000 /* IRQ, Test chip */ | 80 | #define REALVIEW_TC11MP_SCU_BASE 0x1F000000 /* IRQ, Test chip */ |
79 | #define REALVIEW_TC11MP_GIC_CPU_BASE 0x1F000100 /* Test chip interrupt controller CPU interface */ | 81 | #define REALVIEW_TC11MP_GIC_CPU_BASE 0x1F000100 /* Test chip interrupt controller CPU interface */ |
80 | #define REALVIEW_TC11MP_TWD_BASE 0x1F000600 | 82 | #define REALVIEW_TC11MP_TWD_BASE 0x1F000600 |
diff --git a/arch/arm/mach-realview/realview_eb.c b/arch/arm/mach-realview/realview_eb.c index e62962117763..9578145f2df0 100644 --- a/arch/arm/mach-realview/realview_eb.c +++ b/arch/arm/mach-realview/realview_eb.c | |||
@@ -91,14 +91,9 @@ static struct map_desc realview_eb_io_desc[] __initdata = { | |||
91 | 91 | ||
92 | static struct map_desc realview_eb11mp_io_desc[] __initdata = { | 92 | static struct map_desc realview_eb11mp_io_desc[] __initdata = { |
93 | { | 93 | { |
94 | .virtual = IO_ADDRESS(REALVIEW_EB11MP_SCU_BASE), | 94 | .virtual = IO_ADDRESS(REALVIEW_EB11MP_PRIV_MEM_BASE), |
95 | .pfn = __phys_to_pfn(REALVIEW_EB11MP_SCU_BASE), | 95 | .pfn = __phys_to_pfn(REALVIEW_EB11MP_PRIV_MEM_BASE), |
96 | .length = SZ_4K, | 96 | .length = REALVIEW_EB11MP_PRIV_MEM_SIZE, |
97 | .type = MT_DEVICE, | ||
98 | }, { | ||
99 | .virtual = IO_ADDRESS(REALVIEW_EB11MP_GIC_DIST_BASE), | ||
100 | .pfn = __phys_to_pfn(REALVIEW_EB11MP_GIC_DIST_BASE), | ||
101 | .length = SZ_4K, | ||
102 | .type = MT_DEVICE, | 97 | .type = MT_DEVICE, |
103 | }, { | 98 | }, { |
104 | .virtual = IO_ADDRESS(REALVIEW_EB11MP_L220_BASE), | 99 | .virtual = IO_ADDRESS(REALVIEW_EB11MP_L220_BASE), |
diff --git a/arch/arm/mach-realview/realview_pb11mp.c b/arch/arm/mach-realview/realview_pb11mp.c index 127a3fd42ab1..2147335f66f5 100644 --- a/arch/arm/mach-realview/realview_pb11mp.c +++ b/arch/arm/mach-realview/realview_pb11mp.c | |||
@@ -64,15 +64,10 @@ static struct map_desc realview_pb11mp_io_desc[] __initdata = { | |||
64 | .pfn = __phys_to_pfn(REALVIEW_PB11MP_GIC_DIST_BASE), | 64 | .pfn = __phys_to_pfn(REALVIEW_PB11MP_GIC_DIST_BASE), |
65 | .length = SZ_4K, | 65 | .length = SZ_4K, |
66 | .type = MT_DEVICE, | 66 | .type = MT_DEVICE, |
67 | }, { | 67 | }, { /* Maps the SCU, GIC CPU interface, TWD, GIC DIST */ |
68 | .virtual = IO_ADDRESS(REALVIEW_TC11MP_GIC_CPU_BASE), | 68 | .virtual = IO_ADDRESS(REALVIEW_TC11MP_PRIV_MEM_BASE), |
69 | .pfn = __phys_to_pfn(REALVIEW_TC11MP_GIC_CPU_BASE), | 69 | .pfn = __phys_to_pfn(REALVIEW_TC11MP_PRIV_MEM_BASE), |
70 | .length = SZ_4K, | 70 | .length = REALVIEW_TC11MP_PRIV_MEM_SIZE, |
71 | .type = MT_DEVICE, | ||
72 | }, { | ||
73 | .virtual = IO_ADDRESS(REALVIEW_TC11MP_GIC_DIST_BASE), | ||
74 | .pfn = __phys_to_pfn(REALVIEW_TC11MP_GIC_DIST_BASE), | ||
75 | .length = SZ_4K, | ||
76 | .type = MT_DEVICE, | 71 | .type = MT_DEVICE, |
77 | }, { | 72 | }, { |
78 | .virtual = IO_ADDRESS(REALVIEW_SCTL_BASE), | 73 | .virtual = IO_ADDRESS(REALVIEW_SCTL_BASE), |
diff --git a/arch/arm/mach-sa1100/assabet.c b/arch/arm/mach-sa1100/assabet.c index ebafe8aa8956..0c4b76ab4d8e 100644 --- a/arch/arm/mach-sa1100/assabet.c +++ b/arch/arm/mach-sa1100/assabet.c | |||
@@ -202,7 +202,6 @@ static struct irda_platform_data assabet_irda_data = { | |||
202 | static struct mcp_plat_data assabet_mcp_data = { | 202 | static struct mcp_plat_data assabet_mcp_data = { |
203 | .mccr0 = MCCR0_ADM, | 203 | .mccr0 = MCCR0_ADM, |
204 | .sclk_rate = 11981000, | 204 | .sclk_rate = 11981000, |
205 | .codec = "ucb1x00", | ||
206 | }; | 205 | }; |
207 | 206 | ||
208 | static void __init assabet_init(void) | 207 | static void __init assabet_init(void) |
@@ -253,17 +252,6 @@ static void __init assabet_init(void) | |||
253 | sa11x0_register_mtd(&assabet_flash_data, assabet_flash_resources, | 252 | sa11x0_register_mtd(&assabet_flash_data, assabet_flash_resources, |
254 | ARRAY_SIZE(assabet_flash_resources)); | 253 | ARRAY_SIZE(assabet_flash_resources)); |
255 | sa11x0_register_irda(&assabet_irda_data); | 254 | sa11x0_register_irda(&assabet_irda_data); |
256 | |||
257 | /* | ||
258 | * Setup the PPC unit correctly. | ||
259 | */ | ||
260 | PPDR &= ~PPC_RXD4; | ||
261 | PPDR |= PPC_TXD4 | PPC_SCLK | PPC_SFRM; | ||
262 | PSDR |= PPC_RXD4; | ||
263 | PSDR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM); | ||
264 | PPSR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM); | ||
265 | |||
266 | ASSABET_BCR_set(ASSABET_BCR_CODEC_RST); | ||
267 | sa11x0_register_mcp(&assabet_mcp_data); | 255 | sa11x0_register_mcp(&assabet_mcp_data); |
268 | } | 256 | } |
269 | 257 | ||
diff --git a/arch/arm/mach-sa1100/cerf.c b/arch/arm/mach-sa1100/cerf.c index d12d0f48b1dc..11bb6d0b9be3 100644 --- a/arch/arm/mach-sa1100/cerf.c +++ b/arch/arm/mach-sa1100/cerf.c | |||
@@ -124,23 +124,12 @@ static void __init cerf_map_io(void) | |||
124 | static struct mcp_plat_data cerf_mcp_data = { | 124 | static struct mcp_plat_data cerf_mcp_data = { |
125 | .mccr0 = MCCR0_ADM, | 125 | .mccr0 = MCCR0_ADM, |
126 | .sclk_rate = 11981000, | 126 | .sclk_rate = 11981000, |
127 | .codec = "ucb1x00", | ||
128 | }; | 127 | }; |
129 | 128 | ||
130 | static void __init cerf_init(void) | 129 | static void __init cerf_init(void) |
131 | { | 130 | { |
132 | platform_add_devices(cerf_devices, ARRAY_SIZE(cerf_devices)); | 131 | platform_add_devices(cerf_devices, ARRAY_SIZE(cerf_devices)); |
133 | sa11x0_register_mtd(&cerf_flash_data, &cerf_flash_resource, 1); | 132 | sa11x0_register_mtd(&cerf_flash_data, &cerf_flash_resource, 1); |
134 | |||
135 | /* | ||
136 | * Setup the PPC unit correctly. | ||
137 | */ | ||
138 | PPDR &= ~PPC_RXD4; | ||
139 | PPDR |= PPC_TXD4 | PPC_SCLK | PPC_SFRM; | ||
140 | PSDR |= PPC_RXD4; | ||
141 | PSDR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM); | ||
142 | PPSR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM); | ||
143 | |||
144 | sa11x0_register_mcp(&cerf_mcp_data); | 133 | sa11x0_register_mcp(&cerf_mcp_data); |
145 | } | 134 | } |
146 | 135 | ||
diff --git a/arch/arm/mach-sa1100/clock.c b/arch/arm/mach-sa1100/clock.c index d6df9f6c9f7e..dab3c6347a8f 100644 --- a/arch/arm/mach-sa1100/clock.c +++ b/arch/arm/mach-sa1100/clock.c | |||
@@ -11,39 +11,17 @@ | |||
11 | #include <linux/clk.h> | 11 | #include <linux/clk.h> |
12 | #include <linux/spinlock.h> | 12 | #include <linux/spinlock.h> |
13 | #include <linux/mutex.h> | 13 | #include <linux/mutex.h> |
14 | #include <linux/io.h> | ||
15 | #include <linux/clkdev.h> | ||
16 | 14 | ||
17 | #include <mach/hardware.h> | 15 | #include <mach/hardware.h> |
18 | 16 | ||
19 | struct clkops { | 17 | /* |
20 | void (*enable)(struct clk *); | 18 | * Very simple clock implementation - we only have one clock to deal with. |
21 | void (*disable)(struct clk *); | 19 | */ |
22 | unsigned long (*getrate)(struct clk *); | ||
23 | }; | ||
24 | |||
25 | struct clk { | 20 | struct clk { |
26 | const struct clkops *ops; | ||
27 | unsigned long rate; | ||
28 | unsigned int enabled; | 21 | unsigned int enabled; |
29 | }; | 22 | }; |
30 | 23 | ||
31 | #define INIT_CLKREG(_clk, _devname, _conname) \ | 24 | static void clk_gpio27_enable(void) |
32 | { \ | ||
33 | .clk = _clk, \ | ||
34 | .dev_id = _devname, \ | ||
35 | .con_id = _conname, \ | ||
36 | } | ||
37 | |||
38 | #define DEFINE_CLK(_name, _ops, _rate) \ | ||
39 | struct clk clk_##_name = { \ | ||
40 | .ops = _ops, \ | ||
41 | .rate = _rate, \ | ||
42 | } | ||
43 | |||
44 | static DEFINE_SPINLOCK(clocks_lock); | ||
45 | |||
46 | static void clk_gpio27_enable(struct clk *clk) | ||
47 | { | 25 | { |
48 | /* | 26 | /* |
49 | * First, set up the 3.6864MHz clock on GPIO 27 for the SA-1111: | 27 | * First, set up the 3.6864MHz clock on GPIO 27 for the SA-1111: |
@@ -54,22 +32,38 @@ static void clk_gpio27_enable(struct clk *clk) | |||
54 | TUCR = TUCR_3_6864MHz; | 32 | TUCR = TUCR_3_6864MHz; |
55 | } | 33 | } |
56 | 34 | ||
57 | static void clk_gpio27_disable(struct clk *clk) | 35 | static void clk_gpio27_disable(void) |
58 | { | 36 | { |
59 | TUCR = 0; | 37 | TUCR = 0; |
60 | GPDR &= ~GPIO_32_768kHz; | 38 | GPDR &= ~GPIO_32_768kHz; |
61 | GAFR &= ~GPIO_32_768kHz; | 39 | GAFR &= ~GPIO_32_768kHz; |
62 | } | 40 | } |
63 | 41 | ||
42 | static struct clk clk_gpio27; | ||
43 | |||
44 | static DEFINE_SPINLOCK(clocks_lock); | ||
45 | |||
46 | struct clk *clk_get(struct device *dev, const char *id) | ||
47 | { | ||
48 | const char *devname = dev_name(dev); | ||
49 | |||
50 | return strcmp(devname, "sa1111.0") ? ERR_PTR(-ENOENT) : &clk_gpio27; | ||
51 | } | ||
52 | EXPORT_SYMBOL(clk_get); | ||
53 | |||
54 | void clk_put(struct clk *clk) | ||
55 | { | ||
56 | } | ||
57 | EXPORT_SYMBOL(clk_put); | ||
58 | |||
64 | int clk_enable(struct clk *clk) | 59 | int clk_enable(struct clk *clk) |
65 | { | 60 | { |
66 | unsigned long flags; | 61 | unsigned long flags; |
67 | 62 | ||
68 | spin_lock_irqsave(&clocks_lock, flags); | 63 | spin_lock_irqsave(&clocks_lock, flags); |
69 | if (clk->enabled++ == 0) | 64 | if (clk->enabled++ == 0) |
70 | clk->ops->enable(clk); | 65 | clk_gpio27_enable(); |
71 | spin_unlock_irqrestore(&clocks_lock, flags); | 66 | spin_unlock_irqrestore(&clocks_lock, flags); |
72 | |||
73 | return 0; | 67 | return 0; |
74 | } | 68 | } |
75 | EXPORT_SYMBOL(clk_enable); | 69 | EXPORT_SYMBOL(clk_enable); |
@@ -82,48 +76,13 @@ void clk_disable(struct clk *clk) | |||
82 | 76 | ||
83 | spin_lock_irqsave(&clocks_lock, flags); | 77 | spin_lock_irqsave(&clocks_lock, flags); |
84 | if (--clk->enabled == 0) | 78 | if (--clk->enabled == 0) |
85 | clk->ops->disable(clk); | 79 | clk_gpio27_disable(); |
86 | spin_unlock_irqrestore(&clocks_lock, flags); | 80 | spin_unlock_irqrestore(&clocks_lock, flags); |
87 | } | 81 | } |
88 | EXPORT_SYMBOL(clk_disable); | 82 | EXPORT_SYMBOL(clk_disable); |
89 | 83 | ||
90 | unsigned long clk_get_rate(struct clk *clk) | 84 | unsigned long clk_get_rate(struct clk *clk) |
91 | { | 85 | { |
92 | unsigned long rate; | 86 | return 3686400; |
93 | |||
94 | rate = clk->rate; | ||
95 | if (clk->ops->getrate) | ||
96 | rate = clk->ops->getrate(clk); | ||
97 | |||
98 | return rate; | ||
99 | } | 87 | } |
100 | EXPORT_SYMBOL(clk_get_rate); | 88 | EXPORT_SYMBOL(clk_get_rate); |
101 | |||
102 | const struct clkops clk_gpio27_ops = { | ||
103 | .enable = clk_gpio27_enable, | ||
104 | .disable = clk_gpio27_disable, | ||
105 | }; | ||
106 | |||
107 | static void clk_dummy_enable(struct clk *clk) { } | ||
108 | static void clk_dummy_disable(struct clk *clk) { } | ||
109 | |||
110 | const struct clkops clk_dummy_ops = { | ||
111 | .enable = clk_dummy_enable, | ||
112 | .disable = clk_dummy_disable, | ||
113 | }; | ||
114 | |||
115 | static DEFINE_CLK(gpio27, &clk_gpio27_ops, 3686400); | ||
116 | static DEFINE_CLK(dummy, &clk_dummy_ops, 0); | ||
117 | |||
118 | static struct clk_lookup sa11xx_clkregs[] = { | ||
119 | INIT_CLKREG(&clk_gpio27, "sa1111.0", NULL), | ||
120 | INIT_CLKREG(&clk_dummy, "sa1100-rtc", NULL), | ||
121 | }; | ||
122 | |||
123 | static int __init sa11xx_clk_init(void) | ||
124 | { | ||
125 | clkdev_add_table(sa11xx_clkregs, ARRAY_SIZE(sa11xx_clkregs)); | ||
126 | return 0; | ||
127 | } | ||
128 | |||
129 | postcore_initcall(sa11xx_clk_init); | ||
diff --git a/arch/arm/mach-sa1100/collie.c b/arch/arm/mach-sa1100/collie.c index c483912d08af..fd5652118ed1 100644 --- a/arch/arm/mach-sa1100/collie.c +++ b/arch/arm/mach-sa1100/collie.c | |||
@@ -27,7 +27,6 @@ | |||
27 | #include <linux/timer.h> | 27 | #include <linux/timer.h> |
28 | #include <linux/gpio.h> | 28 | #include <linux/gpio.h> |
29 | #include <linux/pda_power.h> | 29 | #include <linux/pda_power.h> |
30 | #include <linux/mfd/ucb1x00.h> | ||
31 | 30 | ||
32 | #include <mach/hardware.h> | 31 | #include <mach/hardware.h> |
33 | #include <asm/mach-types.h> | 32 | #include <asm/mach-types.h> |
@@ -86,15 +85,10 @@ static struct scoop_pcmcia_config collie_pcmcia_config = { | |||
86 | .num_devs = 1, | 85 | .num_devs = 1, |
87 | }; | 86 | }; |
88 | 87 | ||
89 | static struct ucb1x00_plat_data collie_ucb1x00_data = { | ||
90 | .gpio_base = COLLIE_TC35143_GPIO_BASE, | ||
91 | }; | ||
92 | |||
93 | static struct mcp_plat_data collie_mcp_data = { | 88 | static struct mcp_plat_data collie_mcp_data = { |
94 | .mccr0 = MCCR0_ADM | MCCR0_ExtClk, | 89 | .mccr0 = MCCR0_ADM | MCCR0_ExtClk, |
95 | .sclk_rate = 9216000, | 90 | .sclk_rate = 9216000, |
96 | .codec = "ucb1x00", | 91 | .gpio_base = COLLIE_TC35143_GPIO_BASE, |
97 | .codec_pdata = &collie_ucb1x00_data, | ||
98 | }; | 92 | }; |
99 | 93 | ||
100 | /* | 94 | /* |
@@ -144,8 +138,6 @@ static struct pda_power_pdata collie_power_data = { | |||
144 | static struct resource collie_power_resource[] = { | 138 | static struct resource collie_power_resource[] = { |
145 | { | 139 | { |
146 | .name = "ac", | 140 | .name = "ac", |
147 | .start = gpio_to_irq(COLLIE_GPIO_AC_IN), | ||
148 | .end = gpio_to_irq(COLLIE_GPIO_AC_IN), | ||
149 | .flags = IORESOURCE_IRQ | | 141 | .flags = IORESOURCE_IRQ | |
150 | IORESOURCE_IRQ_HIGHEDGE | | 142 | IORESOURCE_IRQ_HIGHEDGE | |
151 | IORESOURCE_IRQ_LOWEDGE, | 143 | IORESOURCE_IRQ_LOWEDGE, |
@@ -347,7 +339,8 @@ static void __init collie_init(void) | |||
347 | 339 | ||
348 | GPSR |= _COLLIE_GPIO_UCB1x00_RESET; | 340 | GPSR |= _COLLIE_GPIO_UCB1x00_RESET; |
349 | 341 | ||
350 | 342 | collie_power_resource[0].start = gpio_to_irq(COLLIE_GPIO_AC_IN); | |
343 | collie_power_resource[0].end = gpio_to_irq(COLLIE_GPIO_AC_IN); | ||
351 | platform_scoop_config = &collie_pcmcia_config; | 344 | platform_scoop_config = &collie_pcmcia_config; |
352 | 345 | ||
353 | ret = platform_add_devices(devices, ARRAY_SIZE(devices)); | 346 | ret = platform_add_devices(devices, ARRAY_SIZE(devices)); |
@@ -357,16 +350,6 @@ static void __init collie_init(void) | |||
357 | 350 | ||
358 | sa11x0_register_mtd(&collie_flash_data, collie_flash_resources, | 351 | sa11x0_register_mtd(&collie_flash_data, collie_flash_resources, |
359 | ARRAY_SIZE(collie_flash_resources)); | 352 | ARRAY_SIZE(collie_flash_resources)); |
360 | |||
361 | /* | ||
362 | * Setup the PPC unit correctly. | ||
363 | */ | ||
364 | PPDR &= ~PPC_RXD4; | ||
365 | PPDR |= PPC_TXD4 | PPC_SCLK | PPC_SFRM; | ||
366 | PSDR |= PPC_RXD4; | ||
367 | PSDR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM); | ||
368 | PPSR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM); | ||
369 | |||
370 | sa11x0_register_mcp(&collie_mcp_data); | 353 | sa11x0_register_mcp(&collie_mcp_data); |
371 | 354 | ||
372 | sharpsl_save_param(); | 355 | sharpsl_save_param(); |
diff --git a/arch/arm/mach-sa1100/cpu-sa1100.c b/arch/arm/mach-sa1100/cpu-sa1100.c index aaa8acf76b7b..19b2053f5af4 100644 --- a/arch/arm/mach-sa1100/cpu-sa1100.c +++ b/arch/arm/mach-sa1100/cpu-sa1100.c | |||
@@ -228,7 +228,7 @@ static int __init sa1100_cpu_init(struct cpufreq_policy *policy) | |||
228 | return 0; | 228 | return 0; |
229 | } | 229 | } |
230 | 230 | ||
231 | static struct cpufreq_driver sa1100_driver = { | 231 | static struct cpufreq_driver sa1100_driver __refdata = { |
232 | .flags = CPUFREQ_STICKY, | 232 | .flags = CPUFREQ_STICKY, |
233 | .verify = sa11x0_verify_speed, | 233 | .verify = sa11x0_verify_speed, |
234 | .target = sa1100_target, | 234 | .target = sa1100_target, |
diff --git a/arch/arm/mach-sa1100/generic.c b/arch/arm/mach-sa1100/generic.c index e3a28ca2a7b7..bb10ee2cb89f 100644 --- a/arch/arm/mach-sa1100/generic.c +++ b/arch/arm/mach-sa1100/generic.c | |||
@@ -217,15 +217,10 @@ static struct platform_device sa11x0uart3_device = { | |||
217 | static struct resource sa11x0mcp_resources[] = { | 217 | static struct resource sa11x0mcp_resources[] = { |
218 | [0] = { | 218 | [0] = { |
219 | .start = __PREG(Ser4MCCR0), | 219 | .start = __PREG(Ser4MCCR0), |
220 | .end = __PREG(Ser4MCCR0) + 0x1C - 1, | 220 | .end = __PREG(Ser4MCCR0) + 0xffff, |
221 | .flags = IORESOURCE_MEM, | 221 | .flags = IORESOURCE_MEM, |
222 | }, | 222 | }, |
223 | [1] = { | 223 | [1] = { |
224 | .start = __PREG(Ser4MCCR1), | ||
225 | .end = __PREG(Ser4MCCR1) + 0x4 - 1, | ||
226 | .flags = IORESOURCE_MEM, | ||
227 | }, | ||
228 | [2] = { | ||
229 | .start = IRQ_Ser4MCP, | 224 | .start = IRQ_Ser4MCP, |
230 | .end = IRQ_Ser4MCP, | 225 | .end = IRQ_Ser4MCP, |
231 | .flags = IORESOURCE_IRQ, | 226 | .flags = IORESOURCE_IRQ, |
@@ -350,29 +345,9 @@ void sa11x0_register_irda(struct irda_platform_data *irda) | |||
350 | sa11x0_register_device(&sa11x0ir_device, irda); | 345 | sa11x0_register_device(&sa11x0ir_device, irda); |
351 | } | 346 | } |
352 | 347 | ||
353 | static struct resource sa11x0rtc_resources[] = { | ||
354 | [0] = { | ||
355 | .start = 0x90010000, | ||
356 | .end = 0x900100ff, | ||
357 | .flags = IORESOURCE_MEM, | ||
358 | }, | ||
359 | [1] = { | ||
360 | .start = IRQ_RTC1Hz, | ||
361 | .end = IRQ_RTC1Hz, | ||
362 | .flags = IORESOURCE_IRQ, | ||
363 | }, | ||
364 | [2] = { | ||
365 | .start = IRQ_RTCAlrm, | ||
366 | .end = IRQ_RTCAlrm, | ||
367 | .flags = IORESOURCE_IRQ, | ||
368 | }, | ||
369 | }; | ||
370 | |||
371 | static struct platform_device sa11x0rtc_device = { | 348 | static struct platform_device sa11x0rtc_device = { |
372 | .name = "sa1100-rtc", | 349 | .name = "sa1100-rtc", |
373 | .id = -1, | 350 | .id = -1, |
374 | .resource = sa11x0rtc_resources, | ||
375 | .num_resources = ARRAY_SIZE(sa11x0rtc_resources), | ||
376 | }; | 351 | }; |
377 | 352 | ||
378 | static struct platform_device *sa11x0_devices[] __initdata = { | 353 | static struct platform_device *sa11x0_devices[] __initdata = { |
diff --git a/arch/arm/mach-sa1100/include/mach/mcp.h b/arch/arm/mach-sa1100/include/mach/mcp.h index 586cec898b35..ed1a331508a7 100644 --- a/arch/arm/mach-sa1100/include/mach/mcp.h +++ b/arch/arm/mach-sa1100/include/mach/mcp.h | |||
@@ -17,8 +17,6 @@ struct mcp_plat_data { | |||
17 | u32 mccr1; | 17 | u32 mccr1; |
18 | unsigned int sclk_rate; | 18 | unsigned int sclk_rate; |
19 | int gpio_base; | 19 | int gpio_base; |
20 | const char *codec; | ||
21 | void *codec_pdata; | ||
22 | }; | 20 | }; |
23 | 21 | ||
24 | #endif | 22 | #endif |
diff --git a/arch/arm/mach-sa1100/jornada720_ssp.c b/arch/arm/mach-sa1100/jornada720_ssp.c index f50b00bd18a0..b412fc09c80c 100644 --- a/arch/arm/mach-sa1100/jornada720_ssp.c +++ b/arch/arm/mach-sa1100/jornada720_ssp.c | |||
@@ -198,3 +198,5 @@ static int __init jornada_ssp_init(void) | |||
198 | { | 198 | { |
199 | return platform_driver_register(&jornadassp_driver); | 199 | return platform_driver_register(&jornadassp_driver); |
200 | } | 200 | } |
201 | |||
202 | module_init(jornada_ssp_init); | ||
diff --git a/arch/arm/mach-sa1100/lart.c b/arch/arm/mach-sa1100/lart.c index d117ceab6215..af4e2761f3db 100644 --- a/arch/arm/mach-sa1100/lart.c +++ b/arch/arm/mach-sa1100/lart.c | |||
@@ -24,20 +24,10 @@ | |||
24 | static struct mcp_plat_data lart_mcp_data = { | 24 | static struct mcp_plat_data lart_mcp_data = { |
25 | .mccr0 = MCCR0_ADM, | 25 | .mccr0 = MCCR0_ADM, |
26 | .sclk_rate = 11981000, | 26 | .sclk_rate = 11981000, |
27 | .codec = "ucb1x00", | ||
28 | }; | 27 | }; |
29 | 28 | ||
30 | static void __init lart_init(void) | 29 | static void __init lart_init(void) |
31 | { | 30 | { |
32 | /* | ||
33 | * Setup the PPC unit correctly. | ||
34 | */ | ||
35 | PPDR &= ~PPC_RXD4; | ||
36 | PPDR |= PPC_TXD4 | PPC_SCLK | PPC_SFRM; | ||
37 | PSDR |= PPC_RXD4; | ||
38 | PSDR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM); | ||
39 | PPSR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM); | ||
40 | |||
41 | sa11x0_register_mcp(&lart_mcp_data); | 31 | sa11x0_register_mcp(&lart_mcp_data); |
42 | } | 32 | } |
43 | 33 | ||
diff --git a/arch/arm/mach-sa1100/shannon.c b/arch/arm/mach-sa1100/shannon.c index 748d34435b3f..318b2b766a0b 100644 --- a/arch/arm/mach-sa1100/shannon.c +++ b/arch/arm/mach-sa1100/shannon.c | |||
@@ -55,22 +55,11 @@ static struct resource shannon_flash_resource = { | |||
55 | static struct mcp_plat_data shannon_mcp_data = { | 55 | static struct mcp_plat_data shannon_mcp_data = { |
56 | .mccr0 = MCCR0_ADM, | 56 | .mccr0 = MCCR0_ADM, |
57 | .sclk_rate = 11981000, | 57 | .sclk_rate = 11981000, |
58 | .codec = "ucb1x00", | ||
59 | }; | 58 | }; |
60 | 59 | ||
61 | static void __init shannon_init(void) | 60 | static void __init shannon_init(void) |
62 | { | 61 | { |
63 | sa11x0_register_mtd(&shannon_flash_data, &shannon_flash_resource, 1); | 62 | sa11x0_register_mtd(&shannon_flash_data, &shannon_flash_resource, 1); |
64 | |||
65 | /* | ||
66 | * Setup the PPC unit correctly. | ||
67 | */ | ||
68 | PPDR &= ~PPC_RXD4; | ||
69 | PPDR |= PPC_TXD4 | PPC_SCLK | PPC_SFRM; | ||
70 | PSDR |= PPC_RXD4; | ||
71 | PSDR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM); | ||
72 | PPSR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM); | ||
73 | |||
74 | sa11x0_register_mcp(&shannon_mcp_data); | 63 | sa11x0_register_mcp(&shannon_mcp_data); |
75 | } | 64 | } |
76 | 65 | ||
diff --git a/arch/arm/mach-sa1100/simpad.c b/arch/arm/mach-sa1100/simpad.c index 458ececefa58..e17c04d6e324 100644 --- a/arch/arm/mach-sa1100/simpad.c +++ b/arch/arm/mach-sa1100/simpad.c | |||
@@ -14,7 +14,6 @@ | |||
14 | #include <linux/mtd/partitions.h> | 14 | #include <linux/mtd/partitions.h> |
15 | #include <linux/io.h> | 15 | #include <linux/io.h> |
16 | #include <linux/gpio.h> | 16 | #include <linux/gpio.h> |
17 | #include <linux/mfd/ucb1x00.h> | ||
18 | 17 | ||
19 | #include <asm/irq.h> | 18 | #include <asm/irq.h> |
20 | #include <mach/hardware.h> | 19 | #include <mach/hardware.h> |
@@ -188,15 +187,10 @@ static struct resource simpad_flash_resources [] = { | |||
188 | } | 187 | } |
189 | }; | 188 | }; |
190 | 189 | ||
191 | static struct ucb1x00_plat_data simpad_ucb1x00_data = { | ||
192 | .gpio_base = SIMPAD_UCB1X00_GPIO_BASE, | ||
193 | }; | ||
194 | |||
195 | static struct mcp_plat_data simpad_mcp_data = { | 190 | static struct mcp_plat_data simpad_mcp_data = { |
196 | .mccr0 = MCCR0_ADM, | 191 | .mccr0 = MCCR0_ADM, |
197 | .sclk_rate = 11981000, | 192 | .sclk_rate = 11981000, |
198 | .codec = "ucb1300", | 193 | .gpio_base = SIMPAD_UCB1X00_GPIO_BASE, |
199 | .codec_pdata = &simpad_ucb1x00_data, | ||
200 | }; | 194 | }; |
201 | 195 | ||
202 | 196 | ||
@@ -384,16 +378,6 @@ static int __init simpad_init(void) | |||
384 | 378 | ||
385 | sa11x0_register_mtd(&simpad_flash_data, simpad_flash_resources, | 379 | sa11x0_register_mtd(&simpad_flash_data, simpad_flash_resources, |
386 | ARRAY_SIZE(simpad_flash_resources)); | 380 | ARRAY_SIZE(simpad_flash_resources)); |
387 | |||
388 | /* | ||
389 | * Setup the PPC unit correctly. | ||
390 | */ | ||
391 | PPDR &= ~PPC_RXD4; | ||
392 | PPDR |= PPC_TXD4 | PPC_SCLK | PPC_SFRM; | ||
393 | PSDR |= PPC_RXD4; | ||
394 | PSDR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM); | ||
395 | PPSR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM); | ||
396 | |||
397 | sa11x0_register_mcp(&simpad_mcp_data); | 381 | sa11x0_register_mcp(&simpad_mcp_data); |
398 | 382 | ||
399 | ret = platform_add_devices(devices, ARRAY_SIZE(devices)); | 383 | ret = platform_add_devices(devices, ARRAY_SIZE(devices)); |
diff --git a/arch/arm/mach-shmobile/smp-r8a7779.c b/arch/arm/mach-shmobile/smp-r8a7779.c index cc97ef892d1b..4fe2e9eaf501 100644 --- a/arch/arm/mach-shmobile/smp-r8a7779.c +++ b/arch/arm/mach-shmobile/smp-r8a7779.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <linux/delay.h> | 25 | #include <linux/delay.h> |
26 | #include <mach/common.h> | 26 | #include <mach/common.h> |
27 | #include <mach/r8a7779.h> | 27 | #include <mach/r8a7779.h> |
28 | #include <asm/smp_plat.h> | ||
28 | #include <asm/smp_scu.h> | 29 | #include <asm/smp_scu.h> |
29 | #include <asm/smp_twd.h> | 30 | #include <asm/smp_twd.h> |
30 | #include <asm/hardware/gic.h> | 31 | #include <asm/hardware/gic.h> |
diff --git a/arch/arm/mach-shmobile/smp-sh73a0.c b/arch/arm/mach-shmobile/smp-sh73a0.c index be1ade76ccc8..0d159d64a345 100644 --- a/arch/arm/mach-shmobile/smp-sh73a0.c +++ b/arch/arm/mach-shmobile/smp-sh73a0.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <linux/spinlock.h> | 23 | #include <linux/spinlock.h> |
24 | #include <linux/io.h> | 24 | #include <linux/io.h> |
25 | #include <mach/common.h> | 25 | #include <mach/common.h> |
26 | #include <asm/smp_plat.h> | ||
26 | #include <asm/smp_scu.h> | 27 | #include <asm/smp_scu.h> |
27 | #include <asm/smp_twd.h> | 28 | #include <asm/smp_twd.h> |
28 | #include <asm/hardware/gic.h> | 29 | #include <asm/hardware/gic.h> |
diff --git a/arch/arm/mach-ux500/Kconfig b/arch/arm/mach-ux500/Kconfig index a3e0c8692f0d..52af00446a63 100644 --- a/arch/arm/mach-ux500/Kconfig +++ b/arch/arm/mach-ux500/Kconfig | |||
@@ -7,6 +7,7 @@ config UX500_SOC_COMMON | |||
7 | select HAS_MTU | 7 | select HAS_MTU |
8 | select ARM_ERRATA_753970 | 8 | select ARM_ERRATA_753970 |
9 | select ARM_ERRATA_754322 | 9 | select ARM_ERRATA_754322 |
10 | select ARM_ERRATA_764369 | ||
10 | 11 | ||
11 | menu "Ux500 SoC" | 12 | menu "Ux500 SoC" |
12 | 13 | ||
diff --git a/arch/arm/mach-ux500/board-mop500-sdi.c b/arch/arm/mach-ux500/board-mop500-sdi.c index 23be34b3bb6e..5dde4d4ebe88 100644 --- a/arch/arm/mach-ux500/board-mop500-sdi.c +++ b/arch/arm/mach-ux500/board-mop500-sdi.c | |||
@@ -261,6 +261,8 @@ void __init mop500_sdi_init(void) | |||
261 | 261 | ||
262 | void __init snowball_sdi_init(void) | 262 | void __init snowball_sdi_init(void) |
263 | { | 263 | { |
264 | /* On Snowball MMC_CAP_SD_HIGHSPEED isn't supported (Hardware issue?) */ | ||
265 | mop500_sdi0_data.capabilities &= ~MMC_CAP_SD_HIGHSPEED; | ||
264 | /* On-board eMMC */ | 266 | /* On-board eMMC */ |
265 | db8500_add_sdi4(&mop500_sdi4_data, U8500_SDI_V2_PERIPHID); | 267 | db8500_add_sdi4(&mop500_sdi4_data, U8500_SDI_V2_PERIPHID); |
266 | /* External Micro SD slot */ | 268 | /* External Micro SD slot */ |
diff --git a/arch/arm/mach-ux500/cache-l2x0.c b/arch/arm/mach-ux500/cache-l2x0.c index 122ddde00ba7..da5569d83d58 100644 --- a/arch/arm/mach-ux500/cache-l2x0.c +++ b/arch/arm/mach-ux500/cache-l2x0.c | |||
@@ -12,44 +12,6 @@ | |||
12 | 12 | ||
13 | static void __iomem *l2x0_base; | 13 | static void __iomem *l2x0_base; |
14 | 14 | ||
15 | static inline void ux500_cache_wait(void __iomem *reg, unsigned long mask) | ||
16 | { | ||
17 | /* wait for the operation to complete */ | ||
18 | while (readl_relaxed(reg) & mask) | ||
19 | cpu_relax(); | ||
20 | } | ||
21 | |||
22 | static inline void ux500_cache_sync(void) | ||
23 | { | ||
24 | writel_relaxed(0, l2x0_base + L2X0_CACHE_SYNC); | ||
25 | ux500_cache_wait(l2x0_base + L2X0_CACHE_SYNC, 1); | ||
26 | } | ||
27 | |||
28 | /* | ||
29 | * The L2 cache cannot be turned off in the non-secure world. | ||
30 | * Dummy until a secure service is in place. | ||
31 | */ | ||
32 | static void ux500_l2x0_disable(void) | ||
33 | { | ||
34 | } | ||
35 | |||
36 | /* | ||
37 | * This is only called when doing a kexec, just after turning off the L2 | ||
38 | * and L1 cache, and it is surrounded by a spinlock in the generic version. | ||
39 | * However, we're not really turning off the L2 cache right now and the | ||
40 | * PL310 does not support exclusive accesses (used to implement the spinlock). | ||
41 | * So, the invalidation needs to be done without the spinlock. | ||
42 | */ | ||
43 | static void ux500_l2x0_inv_all(void) | ||
44 | { | ||
45 | uint32_t l2x0_way_mask = (1<<16) - 1; /* Bitmask of active ways */ | ||
46 | |||
47 | /* invalidate all ways */ | ||
48 | writel_relaxed(l2x0_way_mask, l2x0_base + L2X0_INV_WAY); | ||
49 | ux500_cache_wait(l2x0_base + L2X0_INV_WAY, l2x0_way_mask); | ||
50 | ux500_cache_sync(); | ||
51 | } | ||
52 | |||
53 | static int __init ux500_l2x0_unlock(void) | 15 | static int __init ux500_l2x0_unlock(void) |
54 | { | 16 | { |
55 | int i; | 17 | int i; |
@@ -85,9 +47,13 @@ static int __init ux500_l2x0_init(void) | |||
85 | /* 64KB way size, 8 way associativity, force WA */ | 47 | /* 64KB way size, 8 way associativity, force WA */ |
86 | l2x0_init(l2x0_base, 0x3e060000, 0xc0000fff); | 48 | l2x0_init(l2x0_base, 0x3e060000, 0xc0000fff); |
87 | 49 | ||
88 | /* Override invalidate function */ | 50 | /* |
89 | outer_cache.disable = ux500_l2x0_disable; | 51 | * We can't disable l2 as we are in non secure mode, currently |
90 | outer_cache.inv_all = ux500_l2x0_inv_all; | 52 | * this seems be called only during kexec path. So let's |
53 | * override outer.disable with nasty assignment until we have | ||
54 | * some SMI service available. | ||
55 | */ | ||
56 | outer_cache.disable = NULL; | ||
91 | 57 | ||
92 | return 0; | 58 | return 0; |
93 | } | 59 | } |
diff --git a/arch/arm/mach-ux500/hotplug.c b/arch/arm/mach-ux500/hotplug.c index 572015e57cd9..c76f0f456f04 100644 --- a/arch/arm/mach-ux500/hotplug.c +++ b/arch/arm/mach-ux500/hotplug.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/smp.h> | 13 | #include <linux/smp.h> |
14 | 14 | ||
15 | #include <asm/cacheflush.h> | 15 | #include <asm/cacheflush.h> |
16 | #include <asm/smp_plat.h> | ||
16 | 17 | ||
17 | extern volatile int pen_release; | 18 | extern volatile int pen_release; |
18 | 19 | ||
diff --git a/arch/arm/mach-ux500/platsmp.c b/arch/arm/mach-ux500/platsmp.c index a19e398dade3..d2058ef8345f 100644 --- a/arch/arm/mach-ux500/platsmp.c +++ b/arch/arm/mach-ux500/platsmp.c | |||
@@ -19,6 +19,7 @@ | |||
19 | 19 | ||
20 | #include <asm/cacheflush.h> | 20 | #include <asm/cacheflush.h> |
21 | #include <asm/hardware/gic.h> | 21 | #include <asm/hardware/gic.h> |
22 | #include <asm/smp_plat.h> | ||
22 | #include <asm/smp_scu.h> | 23 | #include <asm/smp_scu.h> |
23 | #include <mach/hardware.h> | 24 | #include <mach/hardware.h> |
24 | #include <mach/setup.h> | 25 | #include <mach/setup.h> |
diff --git a/arch/arm/mach-ux500/usb.c b/arch/arm/mach-ux500/usb.c index 0a01cbdfe063..9f9e1c203061 100644 --- a/arch/arm/mach-ux500/usb.c +++ b/arch/arm/mach-ux500/usb.c | |||
@@ -95,13 +95,7 @@ static struct musb_hdrc_config musb_hdrc_config = { | |||
95 | }; | 95 | }; |
96 | 96 | ||
97 | static struct musb_hdrc_platform_data musb_platform_data = { | 97 | static struct musb_hdrc_platform_data musb_platform_data = { |
98 | #if defined(CONFIG_USB_MUSB_OTG) | ||
99 | .mode = MUSB_OTG, | 98 | .mode = MUSB_OTG, |
100 | #elif defined(CONFIG_USB_MUSB_PERIPHERAL) | ||
101 | .mode = MUSB_PERIPHERAL, | ||
102 | #else /* defined(CONFIG_USB_MUSB_HOST) */ | ||
103 | .mode = MUSB_HOST, | ||
104 | #endif | ||
105 | .config = &musb_hdrc_config, | 99 | .config = &musb_hdrc_config, |
106 | .board_data = &musb_board_data, | 100 | .board_data = &musb_board_data, |
107 | }; | 101 | }; |
diff --git a/arch/arm/mach-vexpress/ct-ca9x4.c b/arch/arm/mach-vexpress/ct-ca9x4.c index 2b1e836a76ed..b1e87c184e54 100644 --- a/arch/arm/mach-vexpress/ct-ca9x4.c +++ b/arch/arm/mach-vexpress/ct-ca9x4.c | |||
@@ -217,7 +217,7 @@ static void __init ct_ca9x4_init(void) | |||
217 | } | 217 | } |
218 | 218 | ||
219 | #ifdef CONFIG_SMP | 219 | #ifdef CONFIG_SMP |
220 | static void ct_ca9x4_init_cpu_map(void) | 220 | static void __init ct_ca9x4_init_cpu_map(void) |
221 | { | 221 | { |
222 | int i, ncores = scu_get_core_count(MMIO_P2V(A9_MPCORE_SCU)); | 222 | int i, ncores = scu_get_core_count(MMIO_P2V(A9_MPCORE_SCU)); |
223 | 223 | ||
@@ -233,7 +233,7 @@ static void ct_ca9x4_init_cpu_map(void) | |||
233 | set_smp_cross_call(gic_raise_softirq); | 233 | set_smp_cross_call(gic_raise_softirq); |
234 | } | 234 | } |
235 | 235 | ||
236 | static void ct_ca9x4_smp_enable(unsigned int max_cpus) | 236 | static void __init ct_ca9x4_smp_enable(unsigned int max_cpus) |
237 | { | 237 | { |
238 | scu_enable(MMIO_P2V(A9_MPCORE_SCU)); | 238 | scu_enable(MMIO_P2V(A9_MPCORE_SCU)); |
239 | } | 239 | } |
diff --git a/arch/arm/mach-vexpress/hotplug.c b/arch/arm/mach-vexpress/hotplug.c index 813ee08f96e6..3034a4dab4a1 100644 --- a/arch/arm/mach-vexpress/hotplug.c +++ b/arch/arm/mach-vexpress/hotplug.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/smp.h> | 13 | #include <linux/smp.h> |
14 | 14 | ||
15 | #include <asm/cacheflush.h> | 15 | #include <asm/cacheflush.h> |
16 | #include <asm/smp_plat.h> | ||
16 | #include <asm/system.h> | 17 | #include <asm/system.h> |
17 | 18 | ||
18 | extern volatile int pen_release; | 19 | extern volatile int pen_release; |
diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig index 4cefb57d9ed2..1a3ca2488164 100644 --- a/arch/arm/mm/Kconfig +++ b/arch/arm/mm/Kconfig | |||
@@ -882,6 +882,7 @@ config CACHE_XSC3L2 | |||
882 | 882 | ||
883 | config ARM_L1_CACHE_SHIFT_6 | 883 | config ARM_L1_CACHE_SHIFT_6 |
884 | bool | 884 | bool |
885 | default y if CPU_V7 | ||
885 | help | 886 | help |
886 | Setting ARM L1 cache line size to 64 Bytes. | 887 | Setting ARM L1 cache line size to 64 Bytes. |
887 | 888 | ||
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index 6ec1226fc62d..5dc7d127a40f 100644 --- a/arch/arm/mm/init.c +++ b/arch/arm/mm/init.c | |||
@@ -310,7 +310,7 @@ static void arm_memory_present(void) | |||
310 | 310 | ||
311 | static bool arm_memblock_steal_permitted = true; | 311 | static bool arm_memblock_steal_permitted = true; |
312 | 312 | ||
313 | phys_addr_t arm_memblock_steal(phys_addr_t size, phys_addr_t align) | 313 | phys_addr_t __init arm_memblock_steal(phys_addr_t size, phys_addr_t align) |
314 | { | 314 | { |
315 | phys_addr_t phys; | 315 | phys_addr_t phys; |
316 | 316 | ||
diff --git a/arch/arm/mm/ioremap.c b/arch/arm/mm/ioremap.c index 80632e8d7538..ba159370fa5f 100644 --- a/arch/arm/mm/ioremap.c +++ b/arch/arm/mm/ioremap.c | |||
@@ -225,7 +225,8 @@ void __iomem * __arm_ioremap_pfn_caller(unsigned long pfn, | |||
225 | if ((area->flags & VM_ARM_MTYPE_MASK) != VM_ARM_MTYPE(mtype)) | 225 | if ((area->flags & VM_ARM_MTYPE_MASK) != VM_ARM_MTYPE(mtype)) |
226 | continue; | 226 | continue; |
227 | if (__phys_to_pfn(area->phys_addr) > pfn || | 227 | if (__phys_to_pfn(area->phys_addr) > pfn || |
228 | __pfn_to_phys(pfn) + size-1 > area->phys_addr + area->size-1) | 228 | __pfn_to_phys(pfn) + offset + size-1 > |
229 | area->phys_addr + area->size-1) | ||
229 | continue; | 230 | continue; |
230 | /* we can drop the lock here as we know *area is static */ | 231 | /* we can drop the lock here as we know *area is static */ |
231 | read_unlock(&vmlist_lock); | 232 | read_unlock(&vmlist_lock); |
diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S index 7e9b5bf910c1..0404ccbb8aa3 100644 --- a/arch/arm/mm/proc-v7.S +++ b/arch/arm/mm/proc-v7.S | |||
@@ -148,10 +148,6 @@ ENDPROC(cpu_v7_do_resume) | |||
148 | * Initialise TLB, Caches, and MMU state ready to switch the MMU | 148 | * Initialise TLB, Caches, and MMU state ready to switch the MMU |
149 | * on. Return in r0 the new CP15 C1 control register setting. | 149 | * on. Return in r0 the new CP15 C1 control register setting. |
150 | * | 150 | * |
151 | * We automatically detect if we have a Harvard cache, and use the | ||
152 | * Harvard cache control instructions insead of the unified cache | ||
153 | * control instructions. | ||
154 | * | ||
155 | * This should be able to cover all ARMv7 cores. | 151 | * This should be able to cover all ARMv7 cores. |
156 | * | 152 | * |
157 | * It is assumed that: | 153 | * It is assumed that: |
@@ -251,9 +247,7 @@ __v7_setup: | |||
251 | #endif | 247 | #endif |
252 | 248 | ||
253 | 3: mov r10, #0 | 249 | 3: mov r10, #0 |
254 | #ifdef HARVARD_CACHE | ||
255 | mcr p15, 0, r10, c7, c5, 0 @ I+BTB cache invalidate | 250 | mcr p15, 0, r10, c7, c5, 0 @ I+BTB cache invalidate |
256 | #endif | ||
257 | dsb | 251 | dsb |
258 | #ifdef CONFIG_MMU | 252 | #ifdef CONFIG_MMU |
259 | mcr p15, 0, r10, c8, c7, 0 @ invalidate I + D TLBs | 253 | mcr p15, 0, r10, c8, c7, 0 @ invalidate I + D TLBs |
@@ -330,16 +324,6 @@ __v7_ca5mp_proc_info: | |||
330 | .size __v7_ca5mp_proc_info, . - __v7_ca5mp_proc_info | 324 | .size __v7_ca5mp_proc_info, . - __v7_ca5mp_proc_info |
331 | 325 | ||
332 | /* | 326 | /* |
333 | * ARM Ltd. Cortex A7 processor. | ||
334 | */ | ||
335 | .type __v7_ca7mp_proc_info, #object | ||
336 | __v7_ca7mp_proc_info: | ||
337 | .long 0x410fc070 | ||
338 | .long 0xff0ffff0 | ||
339 | __v7_proc __v7_ca7mp_setup, hwcaps = HWCAP_IDIV | ||
340 | .size __v7_ca7mp_proc_info, . - __v7_ca7mp_proc_info | ||
341 | |||
342 | /* | ||
343 | * ARM Ltd. Cortex A9 processor. | 327 | * ARM Ltd. Cortex A9 processor. |
344 | */ | 328 | */ |
345 | .type __v7_ca9mp_proc_info, #object | 329 | .type __v7_ca9mp_proc_info, #object |
@@ -351,6 +335,16 @@ __v7_ca9mp_proc_info: | |||
351 | #endif /* CONFIG_ARM_LPAE */ | 335 | #endif /* CONFIG_ARM_LPAE */ |
352 | 336 | ||
353 | /* | 337 | /* |
338 | * ARM Ltd. Cortex A7 processor. | ||
339 | */ | ||
340 | .type __v7_ca7mp_proc_info, #object | ||
341 | __v7_ca7mp_proc_info: | ||
342 | .long 0x410fc070 | ||
343 | .long 0xff0ffff0 | ||
344 | __v7_proc __v7_ca7mp_setup, hwcaps = HWCAP_IDIV | ||
345 | .size __v7_ca7mp_proc_info, . - __v7_ca7mp_proc_info | ||
346 | |||
347 | /* | ||
354 | * ARM Ltd. Cortex A15 processor. | 348 | * ARM Ltd. Cortex A15 processor. |
355 | */ | 349 | */ |
356 | .type __v7_ca15mp_proc_info, #object | 350 | .type __v7_ca15mp_proc_info, #object |
diff --git a/arch/arm/plat-mxc/Kconfig b/arch/arm/plat-mxc/Kconfig index b30708e28c1d..dcebb1230f7f 100644 --- a/arch/arm/plat-mxc/Kconfig +++ b/arch/arm/plat-mxc/Kconfig | |||
@@ -17,26 +17,17 @@ config ARCH_IMX_V4_V5 | |||
17 | and ARMv5 SoCs | 17 | and ARMv5 SoCs |
18 | 18 | ||
19 | config ARCH_IMX_V6_V7 | 19 | config ARCH_IMX_V6_V7 |
20 | bool "i.MX3, i.MX6" | 20 | bool "i.MX3, i.MX5, i.MX6" |
21 | select AUTO_ZRELADDR if !ZBOOT_ROM | 21 | select AUTO_ZRELADDR if !ZBOOT_ROM |
22 | select ARM_PATCH_PHYS_VIRT | 22 | select ARM_PATCH_PHYS_VIRT |
23 | select MIGHT_HAVE_CACHE_L2X0 | 23 | select MIGHT_HAVE_CACHE_L2X0 |
24 | help | 24 | help |
25 | This enables support for systems based on the Freescale i.MX3 and i.MX6 | 25 | This enables support for systems based on the Freescale i.MX3, i.MX5 |
26 | family. | 26 | and i.MX6 family. |
27 | |||
28 | config ARCH_MX5 | ||
29 | bool "i.MX50, i.MX51, i.MX53" | ||
30 | select AUTO_ZRELADDR if !ZBOOT_ROM | ||
31 | select ARM_PATCH_PHYS_VIRT | ||
32 | help | ||
33 | This enables support for machines using Freescale's i.MX50 and i.MX53 | ||
34 | processors. | ||
35 | 27 | ||
36 | endchoice | 28 | endchoice |
37 | 29 | ||
38 | source "arch/arm/mach-imx/Kconfig" | 30 | source "arch/arm/mach-imx/Kconfig" |
39 | source "arch/arm/mach-mx5/Kconfig" | ||
40 | 31 | ||
41 | endmenu | 32 | endmenu |
42 | 33 | ||
diff --git a/arch/arm/plat-mxc/include/mach/iomux-v1.h b/arch/arm/plat-mxc/include/mach/iomux-v1.h index 6fa8a707b9a0..f7d18046c04f 100644 --- a/arch/arm/plat-mxc/include/mach/iomux-v1.h +++ b/arch/arm/plat-mxc/include/mach/iomux-v1.h | |||
@@ -96,6 +96,6 @@ extern int mxc_gpio_mode(int gpio_mode); | |||
96 | extern int mxc_gpio_setup_multiple_pins(const int *pin_list, unsigned count, | 96 | extern int mxc_gpio_setup_multiple_pins(const int *pin_list, unsigned count, |
97 | const char *label); | 97 | const char *label); |
98 | 98 | ||
99 | extern int __init imx_iomuxv1_init(void __iomem *base, int numports); | 99 | extern int imx_iomuxv1_init(void __iomem *base, int numports); |
100 | 100 | ||
101 | #endif /* __MACH_IOMUX_V1_H__ */ | 101 | #endif /* __MACH_IOMUX_V1_H__ */ |
diff --git a/arch/arm/plat-omap/include/plat/gpio.h b/arch/arm/plat-omap/include/plat/gpio.h index 9e86ee0aed0a..cb75b657b04b 100644 --- a/arch/arm/plat-omap/include/plat/gpio.h +++ b/arch/arm/plat-omap/include/plat/gpio.h | |||
@@ -162,13 +162,6 @@ | |||
162 | IH_MPUIO_BASE + ((nr) & 0x0f) : \ | 162 | IH_MPUIO_BASE + ((nr) & 0x0f) : \ |
163 | IH_GPIO_BASE + (nr)) | 163 | IH_GPIO_BASE + (nr)) |
164 | 164 | ||
165 | #define METHOD_MPUIO 0 | ||
166 | #define METHOD_GPIO_1510 1 | ||
167 | #define METHOD_GPIO_1610 2 | ||
168 | #define METHOD_GPIO_7XX 3 | ||
169 | #define METHOD_GPIO_24XX 5 | ||
170 | #define METHOD_GPIO_44XX 6 | ||
171 | |||
172 | struct omap_gpio_dev_attr { | 165 | struct omap_gpio_dev_attr { |
173 | int bank_width; /* GPIO bank width */ | 166 | int bank_width; /* GPIO bank width */ |
174 | bool dbck_flag; /* dbck required or not - True for OMAP3&4 */ | 167 | bool dbck_flag; /* dbck required or not - True for OMAP3&4 */ |
@@ -184,10 +177,21 @@ struct omap_gpio_reg_offs { | |||
184 | u16 irqstatus; | 177 | u16 irqstatus; |
185 | u16 irqstatus2; | 178 | u16 irqstatus2; |
186 | u16 irqenable; | 179 | u16 irqenable; |
180 | u16 irqenable2; | ||
187 | u16 set_irqenable; | 181 | u16 set_irqenable; |
188 | u16 clr_irqenable; | 182 | u16 clr_irqenable; |
189 | u16 debounce; | 183 | u16 debounce; |
190 | u16 debounce_en; | 184 | u16 debounce_en; |
185 | u16 ctrl; | ||
186 | u16 wkup_en; | ||
187 | u16 leveldetect0; | ||
188 | u16 leveldetect1; | ||
189 | u16 risingdetect; | ||
190 | u16 fallingdetect; | ||
191 | u16 irqctrl; | ||
192 | u16 edgectrl1; | ||
193 | u16 edgectrl2; | ||
194 | u16 pinctrl; | ||
191 | 195 | ||
192 | bool irqenable_inv; | 196 | bool irqenable_inv; |
193 | }; | 197 | }; |
@@ -198,19 +202,20 @@ struct omap_gpio_platform_data { | |||
198 | int bank_width; /* GPIO bank width */ | 202 | int bank_width; /* GPIO bank width */ |
199 | int bank_stride; /* Only needed for omap1 MPUIO */ | 203 | int bank_stride; /* Only needed for omap1 MPUIO */ |
200 | bool dbck_flag; /* dbck required or not - True for OMAP3&4 */ | 204 | bool dbck_flag; /* dbck required or not - True for OMAP3&4 */ |
205 | bool loses_context; /* whether the bank would ever lose context */ | ||
206 | bool is_mpuio; /* whether the bank is of type MPUIO */ | ||
207 | u32 non_wakeup_gpios; | ||
201 | 208 | ||
202 | struct omap_gpio_reg_offs *regs; | 209 | struct omap_gpio_reg_offs *regs; |
203 | }; | ||
204 | 210 | ||
205 | /* TODO: Analyze removing gpio_bank_count usage from driver code */ | 211 | /* Return context loss count due to PM states changing */ |
206 | extern int gpio_bank_count; | 212 | int (*get_context_loss_count)(struct device *dev); |
213 | }; | ||
207 | 214 | ||
208 | extern void omap2_gpio_prepare_for_idle(int off_mode); | 215 | extern void omap2_gpio_prepare_for_idle(int off_mode); |
209 | extern void omap2_gpio_resume_after_idle(void); | 216 | extern void omap2_gpio_resume_after_idle(void); |
210 | extern void omap_set_gpio_debounce(int gpio, int enable); | 217 | extern void omap_set_gpio_debounce(int gpio, int enable); |
211 | extern void omap_set_gpio_debounce_time(int gpio, int enable); | 218 | extern void omap_set_gpio_debounce_time(int gpio, int enable); |
212 | extern void omap_gpio_save_context(void); | ||
213 | extern void omap_gpio_restore_context(void); | ||
214 | /*-------------------------------------------------------------------------*/ | 219 | /*-------------------------------------------------------------------------*/ |
215 | 220 | ||
216 | /* Wrappers for "new style" GPIO calls, using the new infrastructure | 221 | /* Wrappers for "new style" GPIO calls, using the new infrastructure |
diff --git a/arch/arm/plat-versatile/platsmp.c b/arch/arm/plat-versatile/platsmp.c index 92f18d372b69..49c7db48c7f1 100644 --- a/arch/arm/plat-versatile/platsmp.c +++ b/arch/arm/plat-versatile/platsmp.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/smp.h> | 16 | #include <linux/smp.h> |
17 | 17 | ||
18 | #include <asm/cacheflush.h> | 18 | #include <asm/cacheflush.h> |
19 | #include <asm/smp_plat.h> | ||
19 | #include <asm/hardware/gic.h> | 20 | #include <asm/hardware/gic.h> |
20 | 21 | ||
21 | /* | 22 | /* |
diff --git a/arch/m68k/atari/config.c b/arch/m68k/atari/config.c index 4203d101363c..c4ac15c4f065 100644 --- a/arch/m68k/atari/config.c +++ b/arch/m68k/atari/config.c | |||
@@ -414,9 +414,9 @@ void __init config_atari(void) | |||
414 | * FDC val = 4 -> Supervisor only */ | 414 | * FDC val = 4 -> Supervisor only */ |
415 | asm volatile ("\n" | 415 | asm volatile ("\n" |
416 | " .chip 68030\n" | 416 | " .chip 68030\n" |
417 | " pmove %0@,%/tt1\n" | 417 | " pmove %0,%/tt1\n" |
418 | " .chip 68k" | 418 | " .chip 68k" |
419 | : : "a" (&tt1_val)); | 419 | : : "m" (tt1_val)); |
420 | } else { | 420 | } else { |
421 | asm volatile ("\n" | 421 | asm volatile ("\n" |
422 | " .chip 68040\n" | 422 | " .chip 68040\n" |
@@ -569,10 +569,10 @@ static void atari_reset(void) | |||
569 | : "d0"); | 569 | : "d0"); |
570 | } else | 570 | } else |
571 | asm volatile ("\n" | 571 | asm volatile ("\n" |
572 | " pmove %0@,%%tc\n" | 572 | " pmove %0,%%tc\n" |
573 | " jmp %1@" | 573 | " jmp %1@" |
574 | : /* no outputs */ | 574 | : /* no outputs */ |
575 | : "a" (&tc_val), "a" (reset_addr)); | 575 | : "m" (tc_val), "a" (reset_addr)); |
576 | } | 576 | } |
577 | 577 | ||
578 | 578 | ||
diff --git a/arch/m68k/include/asm/irq.h b/arch/m68k/include/asm/irq.h index 0e89fa05de0e..c1155f0e22cc 100644 --- a/arch/m68k/include/asm/irq.h +++ b/arch/m68k/include/asm/irq.h | |||
@@ -50,19 +50,6 @@ | |||
50 | 50 | ||
51 | #define IRQ_USER 8 | 51 | #define IRQ_USER 8 |
52 | 52 | ||
53 | /* | ||
54 | * various flags for request_irq() - the Amiga now uses the standard | ||
55 | * mechanism like all other architectures - IRQF_DISABLED and | ||
56 | * IRQF_SHARED are your friends. | ||
57 | */ | ||
58 | #ifndef MACH_AMIGA_ONLY | ||
59 | #define IRQ_FLG_LOCK (0x0001) /* handler is not replaceable */ | ||
60 | #define IRQ_FLG_REPLACE (0x0002) /* replace existing handler */ | ||
61 | #define IRQ_FLG_FAST (0x0004) | ||
62 | #define IRQ_FLG_SLOW (0x0008) | ||
63 | #define IRQ_FLG_STD (0x8000) /* internally used */ | ||
64 | #endif | ||
65 | |||
66 | struct irq_data; | 53 | struct irq_data; |
67 | struct irq_chip; | 54 | struct irq_chip; |
68 | struct irq_desc; | 55 | struct irq_desc; |
diff --git a/arch/m68k/kernel/process_mm.c b/arch/m68k/kernel/process_mm.c index 125f34e00bf0..099283ee1a8f 100644 --- a/arch/m68k/kernel/process_mm.c +++ b/arch/m68k/kernel/process_mm.c | |||
@@ -172,7 +172,7 @@ void flush_thread(void) | |||
172 | 172 | ||
173 | current->thread.fs = __USER_DS; | 173 | current->thread.fs = __USER_DS; |
174 | if (!FPU_IS_EMU) | 174 | if (!FPU_IS_EMU) |
175 | asm volatile ("frestore %0@" : : "a" (&zero) : "memory"); | 175 | asm volatile("frestore %0": :"m" (zero)); |
176 | } | 176 | } |
177 | 177 | ||
178 | /* | 178 | /* |
diff --git a/arch/m68k/kernel/process_no.c b/arch/m68k/kernel/process_no.c index 69c1803fcf1b..5e1078cabe0e 100644 --- a/arch/m68k/kernel/process_no.c +++ b/arch/m68k/kernel/process_no.c | |||
@@ -163,8 +163,8 @@ void flush_thread(void) | |||
163 | #ifdef CONFIG_FPU | 163 | #ifdef CONFIG_FPU |
164 | if (!FPU_IS_EMU) | 164 | if (!FPU_IS_EMU) |
165 | asm volatile (".chip 68k/68881\n\t" | 165 | asm volatile (".chip 68k/68881\n\t" |
166 | "frestore %0@\n\t" | 166 | "frestore %0\n\t" |
167 | ".chip 68k" : : "a" (&zero)); | 167 | ".chip 68k" : : "m" (zero)); |
168 | #endif | 168 | #endif |
169 | } | 169 | } |
170 | 170 | ||
diff --git a/arch/m68k/kernel/traps.c b/arch/m68k/kernel/traps.c index a76452ca964e..daaa9187654c 100644 --- a/arch/m68k/kernel/traps.c +++ b/arch/m68k/kernel/traps.c | |||
@@ -552,13 +552,13 @@ static inline void bus_error030 (struct frame *fp) | |||
552 | 552 | ||
553 | #ifdef DEBUG | 553 | #ifdef DEBUG |
554 | asm volatile ("ptestr %3,%2@,#7,%0\n\t" | 554 | asm volatile ("ptestr %3,%2@,#7,%0\n\t" |
555 | "pmove %%psr,%1@" | 555 | "pmove %%psr,%1" |
556 | : "=a&" (desc) | 556 | : "=a&" (desc), "=m" (temp) |
557 | : "a" (&temp), "a" (addr), "d" (ssw)); | 557 | : "a" (addr), "d" (ssw)); |
558 | #else | 558 | #else |
559 | asm volatile ("ptestr %2,%1@,#7\n\t" | 559 | asm volatile ("ptestr %2,%1@,#7\n\t" |
560 | "pmove %%psr,%0@" | 560 | "pmove %%psr,%0" |
561 | : : "a" (&temp), "a" (addr), "d" (ssw)); | 561 | : "=m" (temp) : "a" (addr), "d" (ssw)); |
562 | #endif | 562 | #endif |
563 | mmusr = temp; | 563 | mmusr = temp; |
564 | 564 | ||
@@ -605,20 +605,18 @@ static inline void bus_error030 (struct frame *fp) | |||
605 | !(ssw & RW) ? "write" : "read", addr, | 605 | !(ssw & RW) ? "write" : "read", addr, |
606 | fp->ptregs.pc, ssw); | 606 | fp->ptregs.pc, ssw); |
607 | asm volatile ("ptestr #1,%1@,#0\n\t" | 607 | asm volatile ("ptestr #1,%1@,#0\n\t" |
608 | "pmove %%psr,%0@" | 608 | "pmove %%psr,%0" |
609 | : /* no outputs */ | 609 | : "=m" (temp) |
610 | : "a" (&temp), "a" (addr)); | 610 | : "a" (addr)); |
611 | mmusr = temp; | 611 | mmusr = temp; |
612 | 612 | ||
613 | printk ("level 0 mmusr is %#x\n", mmusr); | 613 | printk ("level 0 mmusr is %#x\n", mmusr); |
614 | #if 0 | 614 | #if 0 |
615 | asm volatile ("pmove %%tt0,%0@" | 615 | asm volatile ("pmove %%tt0,%0" |
616 | : /* no outputs */ | 616 | : "=m" (tlong)); |
617 | : "a" (&tlong)); | ||
618 | printk("tt0 is %#lx, ", tlong); | 617 | printk("tt0 is %#lx, ", tlong); |
619 | asm volatile ("pmove %%tt1,%0@" | 618 | asm volatile ("pmove %%tt1,%0" |
620 | : /* no outputs */ | 619 | : "=m" (tlong)); |
621 | : "a" (&tlong)); | ||
622 | printk("tt1 is %#lx\n", tlong); | 620 | printk("tt1 is %#lx\n", tlong); |
623 | #endif | 621 | #endif |
624 | #ifdef DEBUG | 622 | #ifdef DEBUG |
@@ -668,13 +666,13 @@ static inline void bus_error030 (struct frame *fp) | |||
668 | 666 | ||
669 | #ifdef DEBUG | 667 | #ifdef DEBUG |
670 | asm volatile ("ptestr #1,%2@,#7,%0\n\t" | 668 | asm volatile ("ptestr #1,%2@,#7,%0\n\t" |
671 | "pmove %%psr,%1@" | 669 | "pmove %%psr,%1" |
672 | : "=a&" (desc) | 670 | : "=a&" (desc), "=m" (temp) |
673 | : "a" (&temp), "a" (addr)); | 671 | : "a" (addr)); |
674 | #else | 672 | #else |
675 | asm volatile ("ptestr #1,%1@,#7\n\t" | 673 | asm volatile ("ptestr #1,%1@,#7\n\t" |
676 | "pmove %%psr,%0@" | 674 | "pmove %%psr,%0" |
677 | : : "a" (&temp), "a" (addr)); | 675 | : "=m" (temp) : "a" (addr)); |
678 | #endif | 676 | #endif |
679 | mmusr = temp; | 677 | mmusr = temp; |
680 | 678 | ||
diff --git a/arch/m68k/mm/cache.c b/arch/m68k/mm/cache.c index 95d0bf66e2e2..3d84c1f2ffb2 100644 --- a/arch/m68k/mm/cache.c +++ b/arch/m68k/mm/cache.c | |||
@@ -52,9 +52,9 @@ static unsigned long virt_to_phys_slow(unsigned long vaddr) | |||
52 | unsigned long *descaddr; | 52 | unsigned long *descaddr; |
53 | 53 | ||
54 | asm volatile ("ptestr %3,%2@,#7,%0\n\t" | 54 | asm volatile ("ptestr %3,%2@,#7,%0\n\t" |
55 | "pmove %%psr,%1@" | 55 | "pmove %%psr,%1" |
56 | : "=a&" (descaddr) | 56 | : "=a&" (descaddr), "=m" (mmusr) |
57 | : "a" (&mmusr), "a" (vaddr), "d" (get_fs().seg)); | 57 | : "a" (vaddr), "d" (get_fs().seg)); |
58 | if (mmusr & (MMU_I|MMU_B|MMU_L)) | 58 | if (mmusr & (MMU_I|MMU_B|MMU_L)) |
59 | return 0; | 59 | return 0; |
60 | descaddr = phys_to_virt((unsigned long)descaddr); | 60 | descaddr = phys_to_virt((unsigned long)descaddr); |
diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig index 74f23a460ba2..c8d6efb99dbf 100644 --- a/arch/microblaze/Kconfig +++ b/arch/microblaze/Kconfig | |||
@@ -19,6 +19,7 @@ config MICROBLAZE | |||
19 | select GENERIC_IRQ_SHOW | 19 | select GENERIC_IRQ_SHOW |
20 | select GENERIC_PCI_IOMAP | 20 | select GENERIC_PCI_IOMAP |
21 | select GENERIC_CPU_DEVICES | 21 | select GENERIC_CPU_DEVICES |
22 | select GENERIC_ATOMIC64 | ||
22 | 23 | ||
23 | config SWAP | 24 | config SWAP |
24 | def_bool n | 25 | def_bool n |
diff --git a/arch/microblaze/include/asm/atomic.h b/arch/microblaze/include/asm/atomic.h index 6d2e1d418be7..615f53992c65 100644 --- a/arch/microblaze/include/asm/atomic.h +++ b/arch/microblaze/include/asm/atomic.h | |||
@@ -2,6 +2,7 @@ | |||
2 | #define _ASM_MICROBLAZE_ATOMIC_H | 2 | #define _ASM_MICROBLAZE_ATOMIC_H |
3 | 3 | ||
4 | #include <asm-generic/atomic.h> | 4 | #include <asm-generic/atomic.h> |
5 | #include <asm-generic/atomic64.h> | ||
5 | 6 | ||
6 | /* | 7 | /* |
7 | * Atomically test *v and decrement if it is greater than 0. | 8 | * Atomically test *v and decrement if it is greater than 0. |
diff --git a/arch/powerpc/boot/dts/fsl/mpc8536si-post.dtsi b/arch/powerpc/boot/dts/fsl/mpc8536si-post.dtsi index 89af62637707..b37da56018b6 100644 --- a/arch/powerpc/boot/dts/fsl/mpc8536si-post.dtsi +++ b/arch/powerpc/boot/dts/fsl/mpc8536si-post.dtsi | |||
@@ -236,6 +236,10 @@ | |||
236 | }; | 236 | }; |
237 | 237 | ||
238 | /include/ "pq3-esdhc-0.dtsi" | 238 | /include/ "pq3-esdhc-0.dtsi" |
239 | sdhc@2e000 { | ||
240 | compatible = "fsl,mpc8536-esdhc", "fsl,esdhc"; | ||
241 | }; | ||
242 | |||
239 | /include/ "pq3-sec3.0-0.dtsi" | 243 | /include/ "pq3-sec3.0-0.dtsi" |
240 | /include/ "pq3-mpic.dtsi" | 244 | /include/ "pq3-mpic.dtsi" |
241 | /include/ "pq3-mpic-timer-B.dtsi" | 245 | /include/ "pq3-mpic-timer-B.dtsi" |
diff --git a/arch/powerpc/boot/dts/fsl/p1010si-post.dtsi b/arch/powerpc/boot/dts/fsl/p1010si-post.dtsi index bd9e163c764b..a97d1263372c 100644 --- a/arch/powerpc/boot/dts/fsl/p1010si-post.dtsi +++ b/arch/powerpc/boot/dts/fsl/p1010si-post.dtsi | |||
@@ -158,7 +158,8 @@ | |||
158 | /include/ "pq3-usb2-dr-0.dtsi" | 158 | /include/ "pq3-usb2-dr-0.dtsi" |
159 | /include/ "pq3-esdhc-0.dtsi" | 159 | /include/ "pq3-esdhc-0.dtsi" |
160 | sdhc@2e000 { | 160 | sdhc@2e000 { |
161 | fsl,sdhci-auto-cmd12; | 161 | compatible = "fsl,p1010-esdhc", "fsl,esdhc"; |
162 | sdhci,auto-cmd12; | ||
162 | }; | 163 | }; |
163 | 164 | ||
164 | /include/ "pq3-sec4.4-0.dtsi" | 165 | /include/ "pq3-sec4.4-0.dtsi" |
diff --git a/arch/powerpc/boot/dts/fsl/p1020si-post.dtsi b/arch/powerpc/boot/dts/fsl/p1020si-post.dtsi index fc924c5ffebe..5de5fc351314 100644 --- a/arch/powerpc/boot/dts/fsl/p1020si-post.dtsi +++ b/arch/powerpc/boot/dts/fsl/p1020si-post.dtsi | |||
@@ -145,6 +145,10 @@ | |||
145 | /include/ "pq3-usb2-dr-1.dtsi" | 145 | /include/ "pq3-usb2-dr-1.dtsi" |
146 | 146 | ||
147 | /include/ "pq3-esdhc-0.dtsi" | 147 | /include/ "pq3-esdhc-0.dtsi" |
148 | sdhc@2e000 { | ||
149 | compatible = "fsl,p1020-esdhc", "fsl,esdhc"; | ||
150 | sdhci,auto-cmd12; | ||
151 | }; | ||
148 | /include/ "pq3-sec3.3-0.dtsi" | 152 | /include/ "pq3-sec3.3-0.dtsi" |
149 | 153 | ||
150 | /include/ "pq3-mpic.dtsi" | 154 | /include/ "pq3-mpic.dtsi" |
diff --git a/arch/powerpc/boot/dts/fsl/p1022si-post.dtsi b/arch/powerpc/boot/dts/fsl/p1022si-post.dtsi index 16239b199d0a..ff9ed1d87929 100644 --- a/arch/powerpc/boot/dts/fsl/p1022si-post.dtsi +++ b/arch/powerpc/boot/dts/fsl/p1022si-post.dtsi | |||
@@ -203,7 +203,8 @@ | |||
203 | 203 | ||
204 | /include/ "pq3-esdhc-0.dtsi" | 204 | /include/ "pq3-esdhc-0.dtsi" |
205 | sdhc@2e000 { | 205 | sdhc@2e000 { |
206 | fsl,sdhci-auto-cmd12; | 206 | compatible = "fsl,p1022-esdhc", "fsl,esdhc"; |
207 | sdhci,auto-cmd12; | ||
207 | }; | 208 | }; |
208 | 209 | ||
209 | /include/ "pq3-sec3.3-0.dtsi" | 210 | /include/ "pq3-sec3.3-0.dtsi" |
diff --git a/arch/powerpc/boot/dts/fsl/p2020si-post.dtsi b/arch/powerpc/boot/dts/fsl/p2020si-post.dtsi index c041050561a7..332e9e75e6c2 100644 --- a/arch/powerpc/boot/dts/fsl/p2020si-post.dtsi +++ b/arch/powerpc/boot/dts/fsl/p2020si-post.dtsi | |||
@@ -182,6 +182,10 @@ | |||
182 | /include/ "pq3-etsec1-1.dtsi" | 182 | /include/ "pq3-etsec1-1.dtsi" |
183 | /include/ "pq3-etsec1-2.dtsi" | 183 | /include/ "pq3-etsec1-2.dtsi" |
184 | /include/ "pq3-esdhc-0.dtsi" | 184 | /include/ "pq3-esdhc-0.dtsi" |
185 | sdhc@2e000 { | ||
186 | compatible = "fsl,p2020-esdhc", "fsl,esdhc"; | ||
187 | }; | ||
188 | |||
185 | /include/ "pq3-sec3.1-0.dtsi" | 189 | /include/ "pq3-sec3.1-0.dtsi" |
186 | /include/ "pq3-mpic.dtsi" | 190 | /include/ "pq3-mpic.dtsi" |
187 | /include/ "pq3-mpic-timer-B.dtsi" | 191 | /include/ "pq3-mpic-timer-B.dtsi" |
diff --git a/arch/powerpc/boot/dts/p1020rdb.dtsi b/arch/powerpc/boot/dts/p1020rdb.dtsi index b5bd86f4baf2..1fb7e0e0940f 100644 --- a/arch/powerpc/boot/dts/p1020rdb.dtsi +++ b/arch/powerpc/boot/dts/p1020rdb.dtsi | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * P1020 RDB Device Tree Source stub (no addresses or top-level ranges) | 2 | * P1020 RDB Device Tree Source stub (no addresses or top-level ranges) |
3 | * | 3 | * |
4 | * Copyright 2011 Freescale Semiconductor Inc. | 4 | * Copyright 2011-2012 Freescale Semiconductor Inc. |
5 | * | 5 | * |
6 | * Redistribution and use in source and binary forms, with or without | 6 | * Redistribution and use in source and binary forms, with or without |
7 | * modification, are permitted provided that the following conditions are met: | 7 | * modification, are permitted provided that the following conditions are met: |
@@ -190,17 +190,16 @@ | |||
190 | 190 | ||
191 | usb@22000 { | 191 | usb@22000 { |
192 | phy_type = "ulpi"; | 192 | phy_type = "ulpi"; |
193 | dr_mode = "host"; | ||
193 | }; | 194 | }; |
194 | 195 | ||
195 | /* USB2 is shared with localbus, so it must be disabled | 196 | /* USB2 is shared with localbus. It is used |
196 | by default. We can't put 'status = "disabled";' here | 197 | only in case of SPI and SD boot after |
197 | since U-Boot doesn't clear the status property when | 198 | appropriate device-tree fixup done by uboot */ |
198 | it enables USB2. OTOH, U-Boot does create a new node | ||
199 | when there isn't any. So, just comment it out. | ||
200 | usb@23000 { | 199 | usb@23000 { |
201 | phy_type = "ulpi"; | 200 | phy_type = "ulpi"; |
201 | dr_mode = "host"; | ||
202 | }; | 202 | }; |
203 | */ | ||
204 | 203 | ||
205 | mdio@24000 { | 204 | mdio@24000 { |
206 | phy0: ethernet-phy@0 { | 205 | phy0: ethernet-phy@0 { |
diff --git a/arch/powerpc/boot/dts/p1021mds.dts b/arch/powerpc/boot/dts/p1021mds.dts index d9540791e434..97116f198a37 100644 --- a/arch/powerpc/boot/dts/p1021mds.dts +++ b/arch/powerpc/boot/dts/p1021mds.dts | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * P1021 MDS Device Tree Source | 2 | * P1021 MDS Device Tree Source |
3 | * | 3 | * |
4 | * Copyright 2010 Freescale Semiconductor Inc. | 4 | * Copyright 2010,2012 Freescale Semiconductor Inc. |
5 | * | 5 | * |
6 | * This program is free software; you can redistribute it and/or modify it | 6 | * This program is free software; you can redistribute it and/or modify it |
7 | * under the terms of the GNU General Public License as published by the | 7 | * under the terms of the GNU General Public License as published by the |
@@ -151,6 +151,7 @@ | |||
151 | 151 | ||
152 | usb@22000 { | 152 | usb@22000 { |
153 | phy_type = "ulpi"; | 153 | phy_type = "ulpi"; |
154 | dr_mode = "host"; | ||
154 | }; | 155 | }; |
155 | 156 | ||
156 | mdio@24000 { | 157 | mdio@24000 { |
diff --git a/arch/powerpc/boot/dts/p2020ds.dtsi b/arch/powerpc/boot/dts/p2020ds.dtsi index c1cf6cef4dd6..d3b939c573b0 100644 --- a/arch/powerpc/boot/dts/p2020ds.dtsi +++ b/arch/powerpc/boot/dts/p2020ds.dtsi | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * P2020DS Device Tree Source stub (no addresses or top-level ranges) | 2 | * P2020DS Device Tree Source stub (no addresses or top-level ranges) |
3 | * | 3 | * |
4 | * Copyright 2011 Freescale Semiconductor Inc. | 4 | * Copyright 2011-2012 Freescale Semiconductor Inc. |
5 | * | 5 | * |
6 | * Redistribution and use in source and binary forms, with or without | 6 | * Redistribution and use in source and binary forms, with or without |
7 | * modification, are permitted provided that the following conditions are met: | 7 | * modification, are permitted provided that the following conditions are met: |
@@ -134,6 +134,7 @@ | |||
134 | &board_soc { | 134 | &board_soc { |
135 | usb@22000 { | 135 | usb@22000 { |
136 | phy_type = "ulpi"; | 136 | phy_type = "ulpi"; |
137 | dr_mode = "host"; | ||
137 | }; | 138 | }; |
138 | 139 | ||
139 | mdio@24520 { | 140 | mdio@24520 { |
diff --git a/arch/powerpc/boot/dts/p2020rdb.dts b/arch/powerpc/boot/dts/p2020rdb.dts index 26759a591712..eb8a6aa2bda5 100644 --- a/arch/powerpc/boot/dts/p2020rdb.dts +++ b/arch/powerpc/boot/dts/p2020rdb.dts | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * P2020 RDB Device Tree Source | 2 | * P2020 RDB Device Tree Source |
3 | * | 3 | * |
4 | * Copyright 2009-2011 Freescale Semiconductor Inc. | 4 | * Copyright 2009-2012 Freescale Semiconductor Inc. |
5 | * | 5 | * |
6 | * This program is free software; you can redistribute it and/or modify it | 6 | * This program is free software; you can redistribute it and/or modify it |
7 | * under the terms of the GNU General Public License as published by the | 7 | * under the terms of the GNU General Public License as published by the |
@@ -197,6 +197,7 @@ | |||
197 | 197 | ||
198 | usb@22000 { | 198 | usb@22000 { |
199 | phy_type = "ulpi"; | 199 | phy_type = "ulpi"; |
200 | dr_mode = "host"; | ||
200 | }; | 201 | }; |
201 | 202 | ||
202 | mdio@24520 { | 203 | mdio@24520 { |
diff --git a/arch/powerpc/kernel/crash.c b/arch/powerpc/kernel/crash.c index 28be3452e67a..abef75176c07 100644 --- a/arch/powerpc/kernel/crash.c +++ b/arch/powerpc/kernel/crash.c | |||
@@ -46,7 +46,6 @@ | |||
46 | 46 | ||
47 | /* This keeps a track of which one is the crashing cpu. */ | 47 | /* This keeps a track of which one is the crashing cpu. */ |
48 | int crashing_cpu = -1; | 48 | int crashing_cpu = -1; |
49 | static atomic_t cpus_in_crash; | ||
50 | static int time_to_dump; | 49 | static int time_to_dump; |
51 | 50 | ||
52 | #define CRASH_HANDLER_MAX 3 | 51 | #define CRASH_HANDLER_MAX 3 |
@@ -66,6 +65,7 @@ static int handle_fault(struct pt_regs *regs) | |||
66 | 65 | ||
67 | #ifdef CONFIG_SMP | 66 | #ifdef CONFIG_SMP |
68 | 67 | ||
68 | static atomic_t cpus_in_crash; | ||
69 | void crash_ipi_callback(struct pt_regs *regs) | 69 | void crash_ipi_callback(struct pt_regs *regs) |
70 | { | 70 | { |
71 | static cpumask_t cpus_state_saved = CPU_MASK_NONE; | 71 | static cpumask_t cpus_state_saved = CPU_MASK_NONE; |
diff --git a/arch/powerpc/kernel/legacy_serial.c b/arch/powerpc/kernel/legacy_serial.c index 3fea3689527e..bedd12e1cfbc 100644 --- a/arch/powerpc/kernel/legacy_serial.c +++ b/arch/powerpc/kernel/legacy_serial.c | |||
@@ -442,8 +442,10 @@ static void __init fixup_port_irq(int index, | |||
442 | 442 | ||
443 | port->irq = virq; | 443 | port->irq = virq; |
444 | 444 | ||
445 | #ifdef CONFIG_SERIAL_8250_FSL | ||
445 | if (of_device_is_compatible(np, "fsl,ns16550")) | 446 | if (of_device_is_compatible(np, "fsl,ns16550")) |
446 | port->handle_irq = fsl8250_handle_irq; | 447 | port->handle_irq = fsl8250_handle_irq; |
448 | #endif | ||
447 | } | 449 | } |
448 | 450 | ||
449 | static void __init fixup_port_pio(int index, | 451 | static void __init fixup_port_pio(int index, |
diff --git a/arch/powerpc/platforms/85xx/p1022_ds.c b/arch/powerpc/platforms/85xx/p1022_ds.c index bb3d84f4046f..b0984ada3f83 100644 --- a/arch/powerpc/platforms/85xx/p1022_ds.c +++ b/arch/powerpc/platforms/85xx/p1022_ds.c | |||
@@ -25,6 +25,7 @@ | |||
25 | 25 | ||
26 | #include <sysdev/fsl_soc.h> | 26 | #include <sysdev/fsl_soc.h> |
27 | #include <sysdev/fsl_pci.h> | 27 | #include <sysdev/fsl_pci.h> |
28 | #include <asm/udbg.h> | ||
28 | #include <asm/fsl_guts.h> | 29 | #include <asm/fsl_guts.h> |
29 | #include "smp.h" | 30 | #include "smp.h" |
30 | 31 | ||
diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c index f31162cfdaa9..5e155dfc4320 100644 --- a/arch/powerpc/platforms/powernv/pci-ioda.c +++ b/arch/powerpc/platforms/powernv/pci-ioda.c | |||
@@ -204,11 +204,10 @@ static void __devinit pnv_ioda_offset_bus(struct pci_bus *bus, | |||
204 | pr_devel(" -> OBR %s [%x] +%016llx\n", | 204 | pr_devel(" -> OBR %s [%x] +%016llx\n", |
205 | bus->self ? pci_name(bus->self) : "root", flags, offset); | 205 | bus->self ? pci_name(bus->self) : "root", flags, offset); |
206 | 206 | ||
207 | for (i = 0; i < 2; i++) { | 207 | pci_bus_for_each_resource(bus, r, i) { |
208 | r = bus->resource[i]; | ||
209 | if (r && (r->flags & flags)) { | 208 | if (r && (r->flags & flags)) { |
210 | bus->resource[i]->start += offset; | 209 | r->start += offset; |
211 | bus->resource[i]->end += offset; | 210 | r->end += offset; |
212 | } | 211 | } |
213 | } | 212 | } |
214 | list_for_each_entry(dev, &bus->devices, bus_list) | 213 | list_for_each_entry(dev, &bus->devices, bus_list) |
@@ -288,12 +287,17 @@ static void __devinit pnv_ioda_calc_bus(struct pci_bus *bus, unsigned int flags, | |||
288 | * assignment algorithm is going to be uber-trivial for now, we | 287 | * assignment algorithm is going to be uber-trivial for now, we |
289 | * can try to be smarter later at filling out holes. | 288 | * can try to be smarter later at filling out holes. |
290 | */ | 289 | */ |
291 | start = bus->self ? 0 : bus->resource[bres]->start; | 290 | if (bus->self) { |
292 | 291 | /* No offset for downstream bridges */ | |
293 | /* Don't hand out IO 0 */ | 292 | start = 0; |
294 | if ((flags & IORESOURCE_IO) && !bus->self) | 293 | } else { |
295 | start += 0x1000; | 294 | /* Offset from the root */ |
296 | 295 | if (flags & IORESOURCE_IO) | |
296 | /* Don't hand out IO 0 */ | ||
297 | start = hose->io_resource.start + 0x1000; | ||
298 | else | ||
299 | start = hose->mem_resources[0].start; | ||
300 | } | ||
297 | while(!list_empty(&head)) { | 301 | while(!list_empty(&head)) { |
298 | w = list_first_entry(&head, struct resource_wrap, link); | 302 | w = list_first_entry(&head, struct resource_wrap, link); |
299 | list_del(&w->link); | 303 | list_del(&w->link); |
@@ -321,13 +325,20 @@ static void __devinit pnv_ioda_calc_bus(struct pci_bus *bus, unsigned int flags, | |||
321 | empty: | 325 | empty: |
322 | /* Only setup P2P's, not the PHB itself */ | 326 | /* Only setup P2P's, not the PHB itself */ |
323 | if (bus->self) { | 327 | if (bus->self) { |
324 | WARN_ON(bus->resource[bres] == NULL); | 328 | struct resource *res = bus->resource[bres]; |
325 | bus->resource[bres]->start = 0; | 329 | |
326 | bus->resource[bres]->flags = (*size) ? flags : 0; | 330 | if (WARN_ON(res == NULL)) |
327 | bus->resource[bres]->end = (*size) ? (*size - 1) : 0; | 331 | return; |
328 | 332 | ||
329 | /* Clear prefetch bus resources for now */ | 333 | /* |
330 | bus->resource[2]->flags = 0; | 334 | * FIXME: We should probably export and call |
335 | * pci_bridge_check_ranges() to properly re-initialize | ||
336 | * the PCI portion of the flags here, and to detect | ||
337 | * what the bridge actually supports. | ||
338 | */ | ||
339 | res->start = 0; | ||
340 | res->flags = (*size) ? flags : 0; | ||
341 | res->end = (*size) ? (*size - 1) : 0; | ||
331 | } | 342 | } |
332 | 343 | ||
333 | pr_devel("<- CBR %s [%x] *size=%016llx *align=%016llx\n", | 344 | pr_devel("<- CBR %s [%x] *size=%016llx *align=%016llx\n", |
diff --git a/arch/powerpc/platforms/pseries/Kconfig b/arch/powerpc/platforms/pseries/Kconfig index ae7b6d41fed3..31f22c1f657d 100644 --- a/arch/powerpc/platforms/pseries/Kconfig +++ b/arch/powerpc/platforms/pseries/Kconfig | |||
@@ -122,7 +122,7 @@ config DTL | |||
122 | Say N if you are unsure. | 122 | Say N if you are unsure. |
123 | 123 | ||
124 | config PSERIES_IDLE | 124 | config PSERIES_IDLE |
125 | tristate "Cpuidle driver for pSeries platforms" | 125 | bool "Cpuidle driver for pSeries platforms" |
126 | depends on CPU_IDLE | 126 | depends on CPU_IDLE |
127 | depends on PPC_PSERIES | 127 | depends on PPC_PSERIES |
128 | default y | 128 | default y |
diff --git a/arch/powerpc/sysdev/fsl_pci.c b/arch/powerpc/sysdev/fsl_pci.c index 3b61e8cf3421..30eb17ecad49 100644 --- a/arch/powerpc/sysdev/fsl_pci.c +++ b/arch/powerpc/sysdev/fsl_pci.c | |||
@@ -205,12 +205,12 @@ static void __init setup_pci_atmu(struct pci_controller *hose, | |||
205 | 205 | ||
206 | if (paddr_hi == paddr_lo) { | 206 | if (paddr_hi == paddr_lo) { |
207 | pr_err("%s: No outbound window space\n", name); | 207 | pr_err("%s: No outbound window space\n", name); |
208 | return ; | 208 | goto out; |
209 | } | 209 | } |
210 | 210 | ||
211 | if (paddr_lo == 0) { | 211 | if (paddr_lo == 0) { |
212 | pr_err("%s: No space for inbound window\n", name); | 212 | pr_err("%s: No space for inbound window\n", name); |
213 | return ; | 213 | goto out; |
214 | } | 214 | } |
215 | 215 | ||
216 | /* setup PCSRBAR/PEXCSRBAR */ | 216 | /* setup PCSRBAR/PEXCSRBAR */ |
@@ -357,6 +357,7 @@ static void __init setup_pci_atmu(struct pci_controller *hose, | |||
357 | (u64)hose->dma_window_size); | 357 | (u64)hose->dma_window_size); |
358 | } | 358 | } |
359 | 359 | ||
360 | out: | ||
360 | iounmap(pci); | 361 | iounmap(pci); |
361 | } | 362 | } |
362 | 363 | ||
diff --git a/arch/s390/Makefile b/arch/s390/Makefile index e9f353341693..0ad2f1e1ce9e 100644 --- a/arch/s390/Makefile +++ b/arch/s390/Makefile | |||
@@ -88,7 +88,6 @@ KBUILD_CFLAGS += -pipe -fno-strength-reduce -Wno-sign-compare | |||
88 | KBUILD_AFLAGS += $(aflags-y) | 88 | KBUILD_AFLAGS += $(aflags-y) |
89 | 89 | ||
90 | OBJCOPYFLAGS := -O binary | 90 | OBJCOPYFLAGS := -O binary |
91 | LDFLAGS_vmlinux := -e start | ||
92 | 91 | ||
93 | head-y := arch/s390/kernel/head.o | 92 | head-y := arch/s390/kernel/head.o |
94 | head-y += arch/s390/kernel/$(if $(CONFIG_64BIT),head64.o,head31.o) | 93 | head-y += arch/s390/kernel/$(if $(CONFIG_64BIT),head64.o,head31.o) |
diff --git a/arch/s390/include/asm/kexec.h b/arch/s390/include/asm/kexec.h index cf4e47b0948c..3f30dac804ea 100644 --- a/arch/s390/include/asm/kexec.h +++ b/arch/s390/include/asm/kexec.h | |||
@@ -42,6 +42,24 @@ | |||
42 | /* The native architecture */ | 42 | /* The native architecture */ |
43 | #define KEXEC_ARCH KEXEC_ARCH_S390 | 43 | #define KEXEC_ARCH KEXEC_ARCH_S390 |
44 | 44 | ||
45 | /* | ||
46 | * Size for s390x ELF notes per CPU | ||
47 | * | ||
48 | * Seven notes plus zero note at the end: prstatus, fpregset, timer, | ||
49 | * tod_cmp, tod_reg, control regs, and prefix | ||
50 | */ | ||
51 | #define KEXEC_NOTE_BYTES \ | ||
52 | (ALIGN(sizeof(struct elf_note), 4) * 8 + \ | ||
53 | ALIGN(sizeof("CORE"), 4) * 7 + \ | ||
54 | ALIGN(sizeof(struct elf_prstatus), 4) + \ | ||
55 | ALIGN(sizeof(elf_fpregset_t), 4) + \ | ||
56 | ALIGN(sizeof(u64), 4) + \ | ||
57 | ALIGN(sizeof(u64), 4) + \ | ||
58 | ALIGN(sizeof(u32), 4) + \ | ||
59 | ALIGN(sizeof(u64) * 16, 4) + \ | ||
60 | ALIGN(sizeof(u32), 4) \ | ||
61 | ) | ||
62 | |||
45 | /* Provide a dummy definition to avoid build failures. */ | 63 | /* Provide a dummy definition to avoid build failures. */ |
46 | static inline void crash_setup_regs(struct pt_regs *newregs, | 64 | static inline void crash_setup_regs(struct pt_regs *newregs, |
47 | struct pt_regs *oldregs) { } | 65 | struct pt_regs *oldregs) { } |
diff --git a/arch/s390/kernel/vmlinux.lds.S b/arch/s390/kernel/vmlinux.lds.S index e4c79ebb40e6..21109c63eb12 100644 --- a/arch/s390/kernel/vmlinux.lds.S +++ b/arch/s390/kernel/vmlinux.lds.S | |||
@@ -9,12 +9,12 @@ | |||
9 | #ifndef CONFIG_64BIT | 9 | #ifndef CONFIG_64BIT |
10 | OUTPUT_FORMAT("elf32-s390", "elf32-s390", "elf32-s390") | 10 | OUTPUT_FORMAT("elf32-s390", "elf32-s390", "elf32-s390") |
11 | OUTPUT_ARCH(s390) | 11 | OUTPUT_ARCH(s390) |
12 | ENTRY(_start) | 12 | ENTRY(startup) |
13 | jiffies = jiffies_64 + 4; | 13 | jiffies = jiffies_64 + 4; |
14 | #else | 14 | #else |
15 | OUTPUT_FORMAT("elf64-s390", "elf64-s390", "elf64-s390") | 15 | OUTPUT_FORMAT("elf64-s390", "elf64-s390", "elf64-s390") |
16 | OUTPUT_ARCH(s390:64-bit) | 16 | OUTPUT_ARCH(s390:64-bit) |
17 | ENTRY(_start) | 17 | ENTRY(startup) |
18 | jiffies = jiffies_64; | 18 | jiffies = jiffies_64; |
19 | #endif | 19 | #endif |
20 | 20 | ||
diff --git a/arch/score/kernel/entry.S b/arch/score/kernel/entry.S index 577abba3fac6..83bb96079c43 100644 --- a/arch/score/kernel/entry.S +++ b/arch/score/kernel/entry.S | |||
@@ -408,7 +408,7 @@ ENTRY(handle_sys) | |||
408 | sw r9, [r0, PT_EPC] | 408 | sw r9, [r0, PT_EPC] |
409 | 409 | ||
410 | cmpi.c r27, __NR_syscalls # check syscall number | 410 | cmpi.c r27, __NR_syscalls # check syscall number |
411 | bgtu illegal_syscall | 411 | bgeu illegal_syscall |
412 | 412 | ||
413 | slli r8, r27, 2 # get syscall routine | 413 | slli r8, r27, 2 # get syscall routine |
414 | la r11, sys_call_table | 414 | la r11, sys_call_table |
diff --git a/arch/sparc/kernel/sun4m_irq.c b/arch/sparc/kernel/sun4m_irq.c index 422c16dad1f6..e61165161dd3 100644 --- a/arch/sparc/kernel/sun4m_irq.c +++ b/arch/sparc/kernel/sun4m_irq.c | |||
@@ -399,6 +399,9 @@ static void __init sun4m_init_timers(irq_handler_t counter_fn) | |||
399 | timers_global = (void __iomem *) | 399 | timers_global = (void __iomem *) |
400 | (unsigned long) addr[num_cpu_timers]; | 400 | (unsigned long) addr[num_cpu_timers]; |
401 | 401 | ||
402 | /* Every per-cpu timer works in timer mode */ | ||
403 | sbus_writel(0x00000000, &timers_global->timer_config); | ||
404 | |||
402 | sbus_writel((((1000000/HZ) + 1) << 10), &timers_global->l10_limit); | 405 | sbus_writel((((1000000/HZ) + 1) << 10), &timers_global->l10_limit); |
403 | 406 | ||
404 | master_l10_counter = &timers_global->l10_count; | 407 | master_l10_counter = &timers_global->l10_count; |
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 864cc6e6ac8e..5bed94e189fa 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
@@ -360,7 +360,6 @@ config X86_NUMACHIP | |||
360 | depends on NUMA | 360 | depends on NUMA |
361 | depends on SMP | 361 | depends on SMP |
362 | depends on X86_X2APIC | 362 | depends on X86_X2APIC |
363 | depends on !EDAC_AMD64 | ||
364 | ---help--- | 363 | ---help--- |
365 | Adds support for Numascale NumaChip large-SMP systems. Needed to | 364 | Adds support for Numascale NumaChip large-SMP systems. Needed to |
366 | enable more than ~168 cores. | 365 | enable more than ~168 cores. |
diff --git a/arch/x86/boot/compressed/misc.c b/arch/x86/boot/compressed/misc.c index 3a19d04cebeb..7116dcba0c9e 100644 --- a/arch/x86/boot/compressed/misc.c +++ b/arch/x86/boot/compressed/misc.c | |||
@@ -321,6 +321,8 @@ static void parse_elf(void *output) | |||
321 | default: /* Ignore other PT_* */ break; | 321 | default: /* Ignore other PT_* */ break; |
322 | } | 322 | } |
323 | } | 323 | } |
324 | |||
325 | free(phdrs); | ||
324 | } | 326 | } |
325 | 327 | ||
326 | asmlinkage void decompress_kernel(void *rmode, memptr heap, | 328 | asmlinkage void decompress_kernel(void *rmode, memptr heap, |
diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h index 17c5d4bdee5e..8d67d428b0f9 100644 --- a/arch/x86/include/asm/cpufeature.h +++ b/arch/x86/include/asm/cpufeature.h | |||
@@ -159,6 +159,7 @@ | |||
159 | #define X86_FEATURE_WDT (6*32+13) /* Watchdog timer */ | 159 | #define X86_FEATURE_WDT (6*32+13) /* Watchdog timer */ |
160 | #define X86_FEATURE_LWP (6*32+15) /* Light Weight Profiling */ | 160 | #define X86_FEATURE_LWP (6*32+15) /* Light Weight Profiling */ |
161 | #define X86_FEATURE_FMA4 (6*32+16) /* 4 operands MAC instructions */ | 161 | #define X86_FEATURE_FMA4 (6*32+16) /* 4 operands MAC instructions */ |
162 | #define X86_FEATURE_TCE (6*32+17) /* translation cache extension */ | ||
162 | #define X86_FEATURE_NODEID_MSR (6*32+19) /* NodeId MSR */ | 163 | #define X86_FEATURE_NODEID_MSR (6*32+19) /* NodeId MSR */ |
163 | #define X86_FEATURE_TBM (6*32+21) /* trailing bit manipulations */ | 164 | #define X86_FEATURE_TBM (6*32+21) /* trailing bit manipulations */ |
164 | #define X86_FEATURE_TOPOEXT (6*32+22) /* topology extensions CPUID leafs */ | 165 | #define X86_FEATURE_TOPOEXT (6*32+22) /* topology extensions CPUID leafs */ |
diff --git a/arch/x86/include/asm/uv/uv_hub.h b/arch/x86/include/asm/uv/uv_hub.h index 54a13aaebc40..21f7385badb8 100644 --- a/arch/x86/include/asm/uv/uv_hub.h +++ b/arch/x86/include/asm/uv/uv_hub.h | |||
@@ -318,13 +318,13 @@ uv_gpa_in_mmr_space(unsigned long gpa) | |||
318 | /* UV global physical address --> socket phys RAM */ | 318 | /* UV global physical address --> socket phys RAM */ |
319 | static inline unsigned long uv_gpa_to_soc_phys_ram(unsigned long gpa) | 319 | static inline unsigned long uv_gpa_to_soc_phys_ram(unsigned long gpa) |
320 | { | 320 | { |
321 | unsigned long paddr = gpa & uv_hub_info->gpa_mask; | 321 | unsigned long paddr; |
322 | unsigned long remap_base = uv_hub_info->lowmem_remap_base; | 322 | unsigned long remap_base = uv_hub_info->lowmem_remap_base; |
323 | unsigned long remap_top = uv_hub_info->lowmem_remap_top; | 323 | unsigned long remap_top = uv_hub_info->lowmem_remap_top; |
324 | 324 | ||
325 | gpa = ((gpa << uv_hub_info->m_shift) >> uv_hub_info->m_shift) | | 325 | gpa = ((gpa << uv_hub_info->m_shift) >> uv_hub_info->m_shift) | |
326 | ((gpa >> uv_hub_info->n_lshift) << uv_hub_info->m_val); | 326 | ((gpa >> uv_hub_info->n_lshift) << uv_hub_info->m_val); |
327 | gpa = gpa & uv_hub_info->gpa_mask; | 327 | paddr = gpa & uv_hub_info->gpa_mask; |
328 | if (paddr >= remap_base && paddr < remap_base + remap_top) | 328 | if (paddr >= remap_base && paddr < remap_base + remap_top) |
329 | paddr -= remap_base; | 329 | paddr -= remap_base; |
330 | return paddr; | 330 | return paddr; |
diff --git a/arch/x86/kernel/microcode_amd.c b/arch/x86/kernel/microcode_amd.c index fe86493f3ed1..ac0417be9131 100644 --- a/arch/x86/kernel/microcode_amd.c +++ b/arch/x86/kernel/microcode_amd.c | |||
@@ -311,13 +311,33 @@ out: | |||
311 | return state; | 311 | return state; |
312 | } | 312 | } |
313 | 313 | ||
314 | /* | ||
315 | * AMD microcode firmware naming convention, up to family 15h they are in | ||
316 | * the legacy file: | ||
317 | * | ||
318 | * amd-ucode/microcode_amd.bin | ||
319 | * | ||
320 | * This legacy file is always smaller than 2K in size. | ||
321 | * | ||
322 | * Starting at family 15h they are in family specific firmware files: | ||
323 | * | ||
324 | * amd-ucode/microcode_amd_fam15h.bin | ||
325 | * amd-ucode/microcode_amd_fam16h.bin | ||
326 | * ... | ||
327 | * | ||
328 | * These might be larger than 2K. | ||
329 | */ | ||
314 | static enum ucode_state request_microcode_amd(int cpu, struct device *device) | 330 | static enum ucode_state request_microcode_amd(int cpu, struct device *device) |
315 | { | 331 | { |
316 | const char *fw_name = "amd-ucode/microcode_amd.bin"; | 332 | char fw_name[36] = "amd-ucode/microcode_amd.bin"; |
317 | const struct firmware *fw; | 333 | const struct firmware *fw; |
318 | enum ucode_state ret = UCODE_NFOUND; | 334 | enum ucode_state ret = UCODE_NFOUND; |
335 | struct cpuinfo_x86 *c = &cpu_data(cpu); | ||
336 | |||
337 | if (c->x86 >= 0x15) | ||
338 | snprintf(fw_name, sizeof(fw_name), "amd-ucode/microcode_amd_fam%.2xh.bin", c->x86); | ||
319 | 339 | ||
320 | if (request_firmware(&fw, fw_name, device)) { | 340 | if (request_firmware(&fw, (const char *)fw_name, device)) { |
321 | pr_err("failed to load file %s\n", fw_name); | 341 | pr_err("failed to load file %s\n", fw_name); |
322 | goto out; | 342 | goto out; |
323 | } | 343 | } |
diff --git a/arch/x86/net/bpf_jit_comp.c b/arch/x86/net/bpf_jit_comp.c index 7b65f752c5f8..7c1b765ecc59 100644 --- a/arch/x86/net/bpf_jit_comp.c +++ b/arch/x86/net/bpf_jit_comp.c | |||
@@ -151,17 +151,18 @@ void bpf_jit_compile(struct sk_filter *fp) | |||
151 | cleanup_addr = proglen; /* epilogue address */ | 151 | cleanup_addr = proglen; /* epilogue address */ |
152 | 152 | ||
153 | for (pass = 0; pass < 10; pass++) { | 153 | for (pass = 0; pass < 10; pass++) { |
154 | u8 seen_or_pass0 = (pass == 0) ? (SEEN_XREG | SEEN_DATAREF | SEEN_MEM) : seen; | ||
154 | /* no prologue/epilogue for trivial filters (RET something) */ | 155 | /* no prologue/epilogue for trivial filters (RET something) */ |
155 | proglen = 0; | 156 | proglen = 0; |
156 | prog = temp; | 157 | prog = temp; |
157 | 158 | ||
158 | if (seen) { | 159 | if (seen_or_pass0) { |
159 | EMIT4(0x55, 0x48, 0x89, 0xe5); /* push %rbp; mov %rsp,%rbp */ | 160 | EMIT4(0x55, 0x48, 0x89, 0xe5); /* push %rbp; mov %rsp,%rbp */ |
160 | EMIT4(0x48, 0x83, 0xec, 96); /* subq $96,%rsp */ | 161 | EMIT4(0x48, 0x83, 0xec, 96); /* subq $96,%rsp */ |
161 | /* note : must save %rbx in case bpf_error is hit */ | 162 | /* note : must save %rbx in case bpf_error is hit */ |
162 | if (seen & (SEEN_XREG | SEEN_DATAREF)) | 163 | if (seen_or_pass0 & (SEEN_XREG | SEEN_DATAREF)) |
163 | EMIT4(0x48, 0x89, 0x5d, 0xf8); /* mov %rbx, -8(%rbp) */ | 164 | EMIT4(0x48, 0x89, 0x5d, 0xf8); /* mov %rbx, -8(%rbp) */ |
164 | if (seen & SEEN_XREG) | 165 | if (seen_or_pass0 & SEEN_XREG) |
165 | CLEAR_X(); /* make sure we dont leek kernel memory */ | 166 | CLEAR_X(); /* make sure we dont leek kernel memory */ |
166 | 167 | ||
167 | /* | 168 | /* |
@@ -170,7 +171,7 @@ void bpf_jit_compile(struct sk_filter *fp) | |||
170 | * r9 = skb->len - skb->data_len | 171 | * r9 = skb->len - skb->data_len |
171 | * r8 = skb->data | 172 | * r8 = skb->data |
172 | */ | 173 | */ |
173 | if (seen & SEEN_DATAREF) { | 174 | if (seen_or_pass0 & SEEN_DATAREF) { |
174 | if (offsetof(struct sk_buff, len) <= 127) | 175 | if (offsetof(struct sk_buff, len) <= 127) |
175 | /* mov off8(%rdi),%r9d */ | 176 | /* mov off8(%rdi),%r9d */ |
176 | EMIT4(0x44, 0x8b, 0x4f, offsetof(struct sk_buff, len)); | 177 | EMIT4(0x44, 0x8b, 0x4f, offsetof(struct sk_buff, len)); |
@@ -260,9 +261,14 @@ void bpf_jit_compile(struct sk_filter *fp) | |||
260 | case BPF_S_ALU_DIV_X: /* A /= X; */ | 261 | case BPF_S_ALU_DIV_X: /* A /= X; */ |
261 | seen |= SEEN_XREG; | 262 | seen |= SEEN_XREG; |
262 | EMIT2(0x85, 0xdb); /* test %ebx,%ebx */ | 263 | EMIT2(0x85, 0xdb); /* test %ebx,%ebx */ |
263 | if (pc_ret0 != -1) | 264 | if (pc_ret0 > 0) { |
264 | EMIT_COND_JMP(X86_JE, addrs[pc_ret0] - (addrs[i] - 4)); | 265 | /* addrs[pc_ret0 - 1] is start address of target |
265 | else { | 266 | * (addrs[i] - 4) is the address following this jmp |
267 | * ("xor %edx,%edx; div %ebx" being 4 bytes long) | ||
268 | */ | ||
269 | EMIT_COND_JMP(X86_JE, addrs[pc_ret0 - 1] - | ||
270 | (addrs[i] - 4)); | ||
271 | } else { | ||
266 | EMIT_COND_JMP(X86_JNE, 2 + 5); | 272 | EMIT_COND_JMP(X86_JNE, 2 + 5); |
267 | CLEAR_A(); | 273 | CLEAR_A(); |
268 | EMIT1_off32(0xe9, cleanup_addr - (addrs[i] - 4)); /* jmp .+off32 */ | 274 | EMIT1_off32(0xe9, cleanup_addr - (addrs[i] - 4)); /* jmp .+off32 */ |
@@ -335,12 +341,12 @@ void bpf_jit_compile(struct sk_filter *fp) | |||
335 | } | 341 | } |
336 | /* fallinto */ | 342 | /* fallinto */ |
337 | case BPF_S_RET_A: | 343 | case BPF_S_RET_A: |
338 | if (seen) { | 344 | if (seen_or_pass0) { |
339 | if (i != flen - 1) { | 345 | if (i != flen - 1) { |
340 | EMIT_JMP(cleanup_addr - addrs[i]); | 346 | EMIT_JMP(cleanup_addr - addrs[i]); |
341 | break; | 347 | break; |
342 | } | 348 | } |
343 | if (seen & SEEN_XREG) | 349 | if (seen_or_pass0 & SEEN_XREG) |
344 | EMIT4(0x48, 0x8b, 0x5d, 0xf8); /* mov -8(%rbp),%rbx */ | 350 | EMIT4(0x48, 0x8b, 0x5d, 0xf8); /* mov -8(%rbp),%rbx */ |
345 | EMIT1(0xc9); /* leaveq */ | 351 | EMIT1(0xc9); /* leaveq */ |
346 | } | 352 | } |
@@ -483,8 +489,9 @@ common_load: seen |= SEEN_DATAREF; | |||
483 | goto common_load; | 489 | goto common_load; |
484 | case BPF_S_LDX_B_MSH: | 490 | case BPF_S_LDX_B_MSH: |
485 | if ((int)K < 0) { | 491 | if ((int)K < 0) { |
486 | if (pc_ret0 != -1) { | 492 | if (pc_ret0 > 0) { |
487 | EMIT_JMP(addrs[pc_ret0] - addrs[i]); | 493 | /* addrs[pc_ret0 - 1] is the start address */ |
494 | EMIT_JMP(addrs[pc_ret0 - 1] - addrs[i]); | ||
488 | break; | 495 | break; |
489 | } | 496 | } |
490 | CLEAR_A(); | 497 | CLEAR_A(); |
@@ -599,13 +606,14 @@ cond_branch: f_offset = addrs[i + filter[i].jf] - addrs[i]; | |||
599 | * use it to give the cleanup instruction(s) addr | 606 | * use it to give the cleanup instruction(s) addr |
600 | */ | 607 | */ |
601 | cleanup_addr = proglen - 1; /* ret */ | 608 | cleanup_addr = proglen - 1; /* ret */ |
602 | if (seen) | 609 | if (seen_or_pass0) |
603 | cleanup_addr -= 1; /* leaveq */ | 610 | cleanup_addr -= 1; /* leaveq */ |
604 | if (seen & SEEN_XREG) | 611 | if (seen_or_pass0 & SEEN_XREG) |
605 | cleanup_addr -= 4; /* mov -8(%rbp),%rbx */ | 612 | cleanup_addr -= 4; /* mov -8(%rbp),%rbx */ |
606 | 613 | ||
607 | if (image) { | 614 | if (image) { |
608 | WARN_ON(proglen != oldproglen); | 615 | if (proglen != oldproglen) |
616 | pr_err("bpb_jit_compile proglen=%u != oldproglen=%u\n", proglen, oldproglen); | ||
609 | break; | 617 | break; |
610 | } | 618 | } |
611 | if (proglen == oldproglen) { | 619 | if (proglen == oldproglen) { |
diff --git a/arch/x86/platform/uv/tlb_uv.c b/arch/x86/platform/uv/tlb_uv.c index 9be4cff00a2d..3ae0e61abd23 100644 --- a/arch/x86/platform/uv/tlb_uv.c +++ b/arch/x86/platform/uv/tlb_uv.c | |||
@@ -1851,6 +1851,8 @@ static void __init init_per_cpu_tunables(void) | |||
1851 | bcp->cong_reps = congested_reps; | 1851 | bcp->cong_reps = congested_reps; |
1852 | bcp->cong_period = congested_period; | 1852 | bcp->cong_period = congested_period; |
1853 | bcp->clocks_per_100_usec = usec_2_cycles(100); | 1853 | bcp->clocks_per_100_usec = usec_2_cycles(100); |
1854 | spin_lock_init(&bcp->queue_lock); | ||
1855 | spin_lock_init(&bcp->uvhub_lock); | ||
1854 | } | 1856 | } |
1855 | } | 1857 | } |
1856 | 1858 | ||
diff --git a/arch/x86/platform/uv/uv_irq.c b/arch/x86/platform/uv/uv_irq.c index 374a05d8ad22..f25c2765a5c9 100644 --- a/arch/x86/platform/uv/uv_irq.c +++ b/arch/x86/platform/uv/uv_irq.c | |||
@@ -25,7 +25,7 @@ struct uv_irq_2_mmr_pnode{ | |||
25 | int irq; | 25 | int irq; |
26 | }; | 26 | }; |
27 | 27 | ||
28 | static spinlock_t uv_irq_lock; | 28 | static DEFINE_SPINLOCK(uv_irq_lock); |
29 | static struct rb_root uv_irq_root; | 29 | static struct rb_root uv_irq_root; |
30 | 30 | ||
31 | static int uv_set_irq_affinity(struct irq_data *, const struct cpumask *, bool); | 31 | static int uv_set_irq_affinity(struct irq_data *, const struct cpumask *, bool); |
diff --git a/arch/x86/xen/spinlock.c b/arch/x86/xen/spinlock.c index cc9b1e182fcf..d69cc6c3f808 100644 --- a/arch/x86/xen/spinlock.c +++ b/arch/x86/xen/spinlock.c | |||
@@ -116,9 +116,26 @@ static inline void spin_time_accum_blocked(u64 start) | |||
116 | } | 116 | } |
117 | #endif /* CONFIG_XEN_DEBUG_FS */ | 117 | #endif /* CONFIG_XEN_DEBUG_FS */ |
118 | 118 | ||
119 | /* | ||
120 | * Size struct xen_spinlock so it's the same as arch_spinlock_t. | ||
121 | */ | ||
122 | #if NR_CPUS < 256 | ||
123 | typedef u8 xen_spinners_t; | ||
124 | # define inc_spinners(xl) \ | ||
125 | asm(LOCK_PREFIX " incb %0" : "+m" ((xl)->spinners) : : "memory"); | ||
126 | # define dec_spinners(xl) \ | ||
127 | asm(LOCK_PREFIX " decb %0" : "+m" ((xl)->spinners) : : "memory"); | ||
128 | #else | ||
129 | typedef u16 xen_spinners_t; | ||
130 | # define inc_spinners(xl) \ | ||
131 | asm(LOCK_PREFIX " incw %0" : "+m" ((xl)->spinners) : : "memory"); | ||
132 | # define dec_spinners(xl) \ | ||
133 | asm(LOCK_PREFIX " decw %0" : "+m" ((xl)->spinners) : : "memory"); | ||
134 | #endif | ||
135 | |||
119 | struct xen_spinlock { | 136 | struct xen_spinlock { |
120 | unsigned char lock; /* 0 -> free; 1 -> locked */ | 137 | unsigned char lock; /* 0 -> free; 1 -> locked */ |
121 | unsigned short spinners; /* count of waiting cpus */ | 138 | xen_spinners_t spinners; /* count of waiting cpus */ |
122 | }; | 139 | }; |
123 | 140 | ||
124 | static int xen_spin_is_locked(struct arch_spinlock *lock) | 141 | static int xen_spin_is_locked(struct arch_spinlock *lock) |
@@ -164,8 +181,7 @@ static inline struct xen_spinlock *spinning_lock(struct xen_spinlock *xl) | |||
164 | 181 | ||
165 | wmb(); /* set lock of interest before count */ | 182 | wmb(); /* set lock of interest before count */ |
166 | 183 | ||
167 | asm(LOCK_PREFIX " incw %0" | 184 | inc_spinners(xl); |
168 | : "+m" (xl->spinners) : : "memory"); | ||
169 | 185 | ||
170 | return prev; | 186 | return prev; |
171 | } | 187 | } |
@@ -176,8 +192,7 @@ static inline struct xen_spinlock *spinning_lock(struct xen_spinlock *xl) | |||
176 | */ | 192 | */ |
177 | static inline void unspinning_lock(struct xen_spinlock *xl, struct xen_spinlock *prev) | 193 | static inline void unspinning_lock(struct xen_spinlock *xl, struct xen_spinlock *prev) |
178 | { | 194 | { |
179 | asm(LOCK_PREFIX " decw %0" | 195 | dec_spinners(xl); |
180 | : "+m" (xl->spinners) : : "memory"); | ||
181 | wmb(); /* decrement count before restoring lock */ | 196 | wmb(); /* decrement count before restoring lock */ |
182 | __this_cpu_write(lock_spinners, prev); | 197 | __this_cpu_write(lock_spinners, prev); |
183 | } | 198 | } |
@@ -373,6 +388,8 @@ void xen_uninit_lock_cpu(int cpu) | |||
373 | 388 | ||
374 | void __init xen_init_spinlocks(void) | 389 | void __init xen_init_spinlocks(void) |
375 | { | 390 | { |
391 | BUILD_BUG_ON(sizeof(struct xen_spinlock) > sizeof(arch_spinlock_t)); | ||
392 | |||
376 | pv_lock_ops.spin_is_locked = xen_spin_is_locked; | 393 | pv_lock_ops.spin_is_locked = xen_spin_is_locked; |
377 | pv_lock_ops.spin_is_contended = xen_spin_is_contended; | 394 | pv_lock_ops.spin_is_contended = xen_spin_is_contended; |
378 | pv_lock_ops.spin_lock = xen_spin_lock; | 395 | pv_lock_ops.spin_lock = xen_spin_lock; |
diff --git a/crypto/sha512_generic.c b/crypto/sha512_generic.c index 9ed9f60316e5..88f160b77b1f 100644 --- a/crypto/sha512_generic.c +++ b/crypto/sha512_generic.c | |||
@@ -21,8 +21,6 @@ | |||
21 | #include <linux/percpu.h> | 21 | #include <linux/percpu.h> |
22 | #include <asm/byteorder.h> | 22 | #include <asm/byteorder.h> |
23 | 23 | ||
24 | static DEFINE_PER_CPU(u64[80], msg_schedule); | ||
25 | |||
26 | static inline u64 Ch(u64 x, u64 y, u64 z) | 24 | static inline u64 Ch(u64 x, u64 y, u64 z) |
27 | { | 25 | { |
28 | return z ^ (x & (y ^ z)); | 26 | return z ^ (x & (y ^ z)); |
@@ -80,7 +78,7 @@ static inline void LOAD_OP(int I, u64 *W, const u8 *input) | |||
80 | 78 | ||
81 | static inline void BLEND_OP(int I, u64 *W) | 79 | static inline void BLEND_OP(int I, u64 *W) |
82 | { | 80 | { |
83 | W[I] = s1(W[I-2]) + W[I-7] + s0(W[I-15]) + W[I-16]; | 81 | W[I % 16] += s1(W[(I-2) % 16]) + W[(I-7) % 16] + s0(W[(I-15) % 16]); |
84 | } | 82 | } |
85 | 83 | ||
86 | static void | 84 | static void |
@@ -89,38 +87,48 @@ sha512_transform(u64 *state, const u8 *input) | |||
89 | u64 a, b, c, d, e, f, g, h, t1, t2; | 87 | u64 a, b, c, d, e, f, g, h, t1, t2; |
90 | 88 | ||
91 | int i; | 89 | int i; |
92 | u64 *W = get_cpu_var(msg_schedule); | 90 | u64 W[16]; |
93 | 91 | ||
94 | /* load the input */ | 92 | /* load the input */ |
95 | for (i = 0; i < 16; i++) | 93 | for (i = 0; i < 16; i++) |
96 | LOAD_OP(i, W, input); | 94 | LOAD_OP(i, W, input); |
97 | 95 | ||
98 | for (i = 16; i < 80; i++) { | ||
99 | BLEND_OP(i, W); | ||
100 | } | ||
101 | |||
102 | /* load the state into our registers */ | 96 | /* load the state into our registers */ |
103 | a=state[0]; b=state[1]; c=state[2]; d=state[3]; | 97 | a=state[0]; b=state[1]; c=state[2]; d=state[3]; |
104 | e=state[4]; f=state[5]; g=state[6]; h=state[7]; | 98 | e=state[4]; f=state[5]; g=state[6]; h=state[7]; |
105 | 99 | ||
106 | /* now iterate */ | 100 | #define SHA512_0_15(i, a, b, c, d, e, f, g, h) \ |
107 | for (i=0; i<80; i+=8) { | 101 | t1 = h + e1(e) + Ch(e, f, g) + sha512_K[i] + W[i]; \ |
108 | t1 = h + e1(e) + Ch(e,f,g) + sha512_K[i ] + W[i ]; | 102 | t2 = e0(a) + Maj(a, b, c); \ |
109 | t2 = e0(a) + Maj(a,b,c); d+=t1; h=t1+t2; | 103 | d += t1; \ |
110 | t1 = g + e1(d) + Ch(d,e,f) + sha512_K[i+1] + W[i+1]; | 104 | h = t1 + t2 |
111 | t2 = e0(h) + Maj(h,a,b); c+=t1; g=t1+t2; | 105 | |
112 | t1 = f + e1(c) + Ch(c,d,e) + sha512_K[i+2] + W[i+2]; | 106 | #define SHA512_16_79(i, a, b, c, d, e, f, g, h) \ |
113 | t2 = e0(g) + Maj(g,h,a); b+=t1; f=t1+t2; | 107 | BLEND_OP(i, W); \ |
114 | t1 = e + e1(b) + Ch(b,c,d) + sha512_K[i+3] + W[i+3]; | 108 | t1 = h + e1(e) + Ch(e, f, g) + sha512_K[i] + W[(i)%16]; \ |
115 | t2 = e0(f) + Maj(f,g,h); a+=t1; e=t1+t2; | 109 | t2 = e0(a) + Maj(a, b, c); \ |
116 | t1 = d + e1(a) + Ch(a,b,c) + sha512_K[i+4] + W[i+4]; | 110 | d += t1; \ |
117 | t2 = e0(e) + Maj(e,f,g); h+=t1; d=t1+t2; | 111 | h = t1 + t2 |
118 | t1 = c + e1(h) + Ch(h,a,b) + sha512_K[i+5] + W[i+5]; | 112 | |
119 | t2 = e0(d) + Maj(d,e,f); g+=t1; c=t1+t2; | 113 | for (i = 0; i < 16; i += 8) { |
120 | t1 = b + e1(g) + Ch(g,h,a) + sha512_K[i+6] + W[i+6]; | 114 | SHA512_0_15(i, a, b, c, d, e, f, g, h); |
121 | t2 = e0(c) + Maj(c,d,e); f+=t1; b=t1+t2; | 115 | SHA512_0_15(i + 1, h, a, b, c, d, e, f, g); |
122 | t1 = a + e1(f) + Ch(f,g,h) + sha512_K[i+7] + W[i+7]; | 116 | SHA512_0_15(i + 2, g, h, a, b, c, d, e, f); |
123 | t2 = e0(b) + Maj(b,c,d); e+=t1; a=t1+t2; | 117 | SHA512_0_15(i + 3, f, g, h, a, b, c, d, e); |
118 | SHA512_0_15(i + 4, e, f, g, h, a, b, c, d); | ||
119 | SHA512_0_15(i + 5, d, e, f, g, h, a, b, c); | ||
120 | SHA512_0_15(i + 6, c, d, e, f, g, h, a, b); | ||
121 | SHA512_0_15(i + 7, b, c, d, e, f, g, h, a); | ||
122 | } | ||
123 | for (i = 16; i < 80; i += 8) { | ||
124 | SHA512_16_79(i, a, b, c, d, e, f, g, h); | ||
125 | SHA512_16_79(i + 1, h, a, b, c, d, e, f, g); | ||
126 | SHA512_16_79(i + 2, g, h, a, b, c, d, e, f); | ||
127 | SHA512_16_79(i + 3, f, g, h, a, b, c, d, e); | ||
128 | SHA512_16_79(i + 4, e, f, g, h, a, b, c, d); | ||
129 | SHA512_16_79(i + 5, d, e, f, g, h, a, b, c); | ||
130 | SHA512_16_79(i + 6, c, d, e, f, g, h, a, b); | ||
131 | SHA512_16_79(i + 7, b, c, d, e, f, g, h, a); | ||
124 | } | 132 | } |
125 | 133 | ||
126 | state[0] += a; state[1] += b; state[2] += c; state[3] += d; | 134 | state[0] += a; state[1] += b; state[2] += c; state[3] += d; |
@@ -128,8 +136,6 @@ sha512_transform(u64 *state, const u8 *input) | |||
128 | 136 | ||
129 | /* erase our data */ | 137 | /* erase our data */ |
130 | a = b = c = d = e = f = g = h = t1 = t2 = 0; | 138 | a = b = c = d = e = f = g = h = t1 = t2 = 0; |
131 | memset(W, 0, sizeof(__get_cpu_var(msg_schedule))); | ||
132 | put_cpu_var(msg_schedule); | ||
133 | } | 139 | } |
134 | 140 | ||
135 | static int | 141 | static int |
diff --git a/drivers/acpi/Makefile b/drivers/acpi/Makefile index c07f44f05f9d..1567028d2038 100644 --- a/drivers/acpi/Makefile +++ b/drivers/acpi/Makefile | |||
@@ -19,7 +19,6 @@ obj-y += acpi.o \ | |||
19 | 19 | ||
20 | # All the builtin files are in the "acpi." module_param namespace. | 20 | # All the builtin files are in the "acpi." module_param namespace. |
21 | acpi-y += osl.o utils.o reboot.o | 21 | acpi-y += osl.o utils.o reboot.o |
22 | acpi-y += atomicio.o | ||
23 | acpi-y += nvs.o | 22 | acpi-y += nvs.o |
24 | 23 | ||
25 | # sleep related files | 24 | # sleep related files |
diff --git a/drivers/acpi/apei/apei-base.c b/drivers/acpi/apei/apei-base.c index e45350cb6ac8..e5d53b7ddc7e 100644 --- a/drivers/acpi/apei/apei-base.c +++ b/drivers/acpi/apei/apei-base.c | |||
@@ -596,33 +596,19 @@ int apei_read(u64 *val, struct acpi_generic_address *reg) | |||
596 | { | 596 | { |
597 | int rc; | 597 | int rc; |
598 | u64 address; | 598 | u64 address; |
599 | u32 tmp, width = reg->bit_width; | ||
600 | acpi_status status; | 599 | acpi_status status; |
601 | 600 | ||
602 | rc = apei_check_gar(reg, &address); | 601 | rc = apei_check_gar(reg, &address); |
603 | if (rc) | 602 | if (rc) |
604 | return rc; | 603 | return rc; |
605 | 604 | ||
606 | if (width == 64) | ||
607 | width = 32; /* Break into two 32-bit transfers */ | ||
608 | |||
609 | *val = 0; | 605 | *val = 0; |
610 | switch(reg->space_id) { | 606 | switch(reg->space_id) { |
611 | case ACPI_ADR_SPACE_SYSTEM_MEMORY: | 607 | case ACPI_ADR_SPACE_SYSTEM_MEMORY: |
612 | status = acpi_os_read_memory((acpi_physical_address) | 608 | status = acpi_os_read_memory64((acpi_physical_address) |
613 | address, &tmp, width); | 609 | address, val, reg->bit_width); |
614 | if (ACPI_FAILURE(status)) | 610 | if (ACPI_FAILURE(status)) |
615 | return -EIO; | 611 | return -EIO; |
616 | *val = tmp; | ||
617 | |||
618 | if (reg->bit_width == 64) { | ||
619 | /* Read the top 32 bits */ | ||
620 | status = acpi_os_read_memory((acpi_physical_address) | ||
621 | (address + 4), &tmp, 32); | ||
622 | if (ACPI_FAILURE(status)) | ||
623 | return -EIO; | ||
624 | *val |= ((u64)tmp << 32); | ||
625 | } | ||
626 | break; | 612 | break; |
627 | case ACPI_ADR_SPACE_SYSTEM_IO: | 613 | case ACPI_ADR_SPACE_SYSTEM_IO: |
628 | status = acpi_os_read_port(address, (u32 *)val, reg->bit_width); | 614 | status = acpi_os_read_port(address, (u32 *)val, reg->bit_width); |
@@ -642,31 +628,18 @@ int apei_write(u64 val, struct acpi_generic_address *reg) | |||
642 | { | 628 | { |
643 | int rc; | 629 | int rc; |
644 | u64 address; | 630 | u64 address; |
645 | u32 width = reg->bit_width; | ||
646 | acpi_status status; | 631 | acpi_status status; |
647 | 632 | ||
648 | rc = apei_check_gar(reg, &address); | 633 | rc = apei_check_gar(reg, &address); |
649 | if (rc) | 634 | if (rc) |
650 | return rc; | 635 | return rc; |
651 | 636 | ||
652 | if (width == 64) | ||
653 | width = 32; /* Break into two 32-bit transfers */ | ||
654 | |||
655 | switch (reg->space_id) { | 637 | switch (reg->space_id) { |
656 | case ACPI_ADR_SPACE_SYSTEM_MEMORY: | 638 | case ACPI_ADR_SPACE_SYSTEM_MEMORY: |
657 | status = acpi_os_write_memory((acpi_physical_address) | 639 | status = acpi_os_write_memory64((acpi_physical_address) |
658 | address, ACPI_LODWORD(val), | 640 | address, val, reg->bit_width); |
659 | width); | ||
660 | if (ACPI_FAILURE(status)) | 641 | if (ACPI_FAILURE(status)) |
661 | return -EIO; | 642 | return -EIO; |
662 | |||
663 | if (reg->bit_width == 64) { | ||
664 | status = acpi_os_write_memory((acpi_physical_address) | ||
665 | (address + 4), | ||
666 | ACPI_HIDWORD(val), 32); | ||
667 | if (ACPI_FAILURE(status)) | ||
668 | return -EIO; | ||
669 | } | ||
670 | break; | 643 | break; |
671 | case ACPI_ADR_SPACE_SYSTEM_IO: | 644 | case ACPI_ADR_SPACE_SYSTEM_IO: |
672 | status = acpi_os_write_port(address, val, reg->bit_width); | 645 | status = acpi_os_write_port(address, val, reg->bit_width); |
diff --git a/drivers/acpi/apei/einj.c b/drivers/acpi/apei/einj.c index 5b898d4dda99..4ca087dd5f4f 100644 --- a/drivers/acpi/apei/einj.c +++ b/drivers/acpi/apei/einj.c | |||
@@ -141,21 +141,6 @@ static DEFINE_MUTEX(einj_mutex); | |||
141 | 141 | ||
142 | static void *einj_param; | 142 | static void *einj_param; |
143 | 143 | ||
144 | #ifndef readq | ||
145 | static inline __u64 readq(volatile void __iomem *addr) | ||
146 | { | ||
147 | return ((__u64)readl(addr+4) << 32) + readl(addr); | ||
148 | } | ||
149 | #endif | ||
150 | |||
151 | #ifndef writeq | ||
152 | static inline void writeq(__u64 val, volatile void __iomem *addr) | ||
153 | { | ||
154 | writel(val, addr); | ||
155 | writel(val >> 32, addr+4); | ||
156 | } | ||
157 | #endif | ||
158 | |||
159 | static void einj_exec_ctx_init(struct apei_exec_context *ctx) | 144 | static void einj_exec_ctx_init(struct apei_exec_context *ctx) |
160 | { | 145 | { |
161 | apei_exec_ctx_init(ctx, einj_ins_type, ARRAY_SIZE(einj_ins_type), | 146 | apei_exec_ctx_init(ctx, einj_ins_type, ARRAY_SIZE(einj_ins_type), |
@@ -204,22 +189,21 @@ static int einj_timedout(u64 *t) | |||
204 | static void check_vendor_extension(u64 paddr, | 189 | static void check_vendor_extension(u64 paddr, |
205 | struct set_error_type_with_address *v5param) | 190 | struct set_error_type_with_address *v5param) |
206 | { | 191 | { |
207 | int offset = readl(&v5param->vendor_extension); | 192 | int offset = v5param->vendor_extension; |
208 | struct vendor_error_type_extension *v; | 193 | struct vendor_error_type_extension *v; |
209 | u32 sbdf; | 194 | u32 sbdf; |
210 | 195 | ||
211 | if (!offset) | 196 | if (!offset) |
212 | return; | 197 | return; |
213 | v = ioremap(paddr + offset, sizeof(*v)); | 198 | v = acpi_os_map_memory(paddr + offset, sizeof(*v)); |
214 | if (!v) | 199 | if (!v) |
215 | return; | 200 | return; |
216 | sbdf = readl(&v->pcie_sbdf); | 201 | sbdf = v->pcie_sbdf; |
217 | sprintf(vendor_dev, "%x:%x:%x.%x vendor_id=%x device_id=%x rev_id=%x\n", | 202 | sprintf(vendor_dev, "%x:%x:%x.%x vendor_id=%x device_id=%x rev_id=%x\n", |
218 | sbdf >> 24, (sbdf >> 16) & 0xff, | 203 | sbdf >> 24, (sbdf >> 16) & 0xff, |
219 | (sbdf >> 11) & 0x1f, (sbdf >> 8) & 0x7, | 204 | (sbdf >> 11) & 0x1f, (sbdf >> 8) & 0x7, |
220 | readw(&v->vendor_id), readw(&v->device_id), | 205 | v->vendor_id, v->device_id, v->rev_id); |
221 | readb(&v->rev_id)); | 206 | acpi_os_unmap_memory(v, sizeof(*v)); |
222 | iounmap(v); | ||
223 | } | 207 | } |
224 | 208 | ||
225 | static void *einj_get_parameter_address(void) | 209 | static void *einj_get_parameter_address(void) |
@@ -247,7 +231,7 @@ static void *einj_get_parameter_address(void) | |||
247 | if (paddrv5) { | 231 | if (paddrv5) { |
248 | struct set_error_type_with_address *v5param; | 232 | struct set_error_type_with_address *v5param; |
249 | 233 | ||
250 | v5param = ioremap(paddrv5, sizeof(*v5param)); | 234 | v5param = acpi_os_map_memory(paddrv5, sizeof(*v5param)); |
251 | if (v5param) { | 235 | if (v5param) { |
252 | acpi5 = 1; | 236 | acpi5 = 1; |
253 | check_vendor_extension(paddrv5, v5param); | 237 | check_vendor_extension(paddrv5, v5param); |
@@ -257,17 +241,17 @@ static void *einj_get_parameter_address(void) | |||
257 | if (paddrv4) { | 241 | if (paddrv4) { |
258 | struct einj_parameter *v4param; | 242 | struct einj_parameter *v4param; |
259 | 243 | ||
260 | v4param = ioremap(paddrv4, sizeof(*v4param)); | 244 | v4param = acpi_os_map_memory(paddrv4, sizeof(*v4param)); |
261 | if (!v4param) | 245 | if (!v4param) |
262 | return 0; | 246 | return NULL; |
263 | if (readq(&v4param->reserved1) || readq(&v4param->reserved2)) { | 247 | if (v4param->reserved1 || v4param->reserved2) { |
264 | iounmap(v4param); | 248 | acpi_os_unmap_memory(v4param, sizeof(*v4param)); |
265 | return 0; | 249 | return NULL; |
266 | } | 250 | } |
267 | return v4param; | 251 | return v4param; |
268 | } | 252 | } |
269 | 253 | ||
270 | return 0; | 254 | return NULL; |
271 | } | 255 | } |
272 | 256 | ||
273 | /* do sanity check to trigger table */ | 257 | /* do sanity check to trigger table */ |
@@ -276,7 +260,7 @@ static int einj_check_trigger_header(struct acpi_einj_trigger *trigger_tab) | |||
276 | if (trigger_tab->header_size != sizeof(struct acpi_einj_trigger)) | 260 | if (trigger_tab->header_size != sizeof(struct acpi_einj_trigger)) |
277 | return -EINVAL; | 261 | return -EINVAL; |
278 | if (trigger_tab->table_size > PAGE_SIZE || | 262 | if (trigger_tab->table_size > PAGE_SIZE || |
279 | trigger_tab->table_size <= trigger_tab->header_size) | 263 | trigger_tab->table_size < trigger_tab->header_size) |
280 | return -EINVAL; | 264 | return -EINVAL; |
281 | if (trigger_tab->entry_count != | 265 | if (trigger_tab->entry_count != |
282 | (trigger_tab->table_size - trigger_tab->header_size) / | 266 | (trigger_tab->table_size - trigger_tab->header_size) / |
@@ -340,6 +324,11 @@ static int __einj_error_trigger(u64 trigger_paddr, u32 type, | |||
340 | "The trigger error action table is invalid\n"); | 324 | "The trigger error action table is invalid\n"); |
341 | goto out_rel_header; | 325 | goto out_rel_header; |
342 | } | 326 | } |
327 | |||
328 | /* No action structures in the TRIGGER_ERROR table, nothing to do */ | ||
329 | if (!trigger_tab->entry_count) | ||
330 | goto out_rel_header; | ||
331 | |||
343 | rc = -EIO; | 332 | rc = -EIO; |
344 | table_size = trigger_tab->table_size; | 333 | table_size = trigger_tab->table_size; |
345 | r = request_mem_region(trigger_paddr + sizeof(*trigger_tab), | 334 | r = request_mem_region(trigger_paddr + sizeof(*trigger_tab), |
@@ -435,41 +424,41 @@ static int __einj_error_inject(u32 type, u64 param1, u64 param2) | |||
435 | if (acpi5) { | 424 | if (acpi5) { |
436 | struct set_error_type_with_address *v5param = einj_param; | 425 | struct set_error_type_with_address *v5param = einj_param; |
437 | 426 | ||
438 | writel(type, &v5param->type); | 427 | v5param->type = type; |
439 | if (type & 0x80000000) { | 428 | if (type & 0x80000000) { |
440 | switch (vendor_flags) { | 429 | switch (vendor_flags) { |
441 | case SETWA_FLAGS_APICID: | 430 | case SETWA_FLAGS_APICID: |
442 | writel(param1, &v5param->apicid); | 431 | v5param->apicid = param1; |
443 | break; | 432 | break; |
444 | case SETWA_FLAGS_MEM: | 433 | case SETWA_FLAGS_MEM: |
445 | writeq(param1, &v5param->memory_address); | 434 | v5param->memory_address = param1; |
446 | writeq(param2, &v5param->memory_address_range); | 435 | v5param->memory_address_range = param2; |
447 | break; | 436 | break; |
448 | case SETWA_FLAGS_PCIE_SBDF: | 437 | case SETWA_FLAGS_PCIE_SBDF: |
449 | writel(param1, &v5param->pcie_sbdf); | 438 | v5param->pcie_sbdf = param1; |
450 | break; | 439 | break; |
451 | } | 440 | } |
452 | writel(vendor_flags, &v5param->flags); | 441 | v5param->flags = vendor_flags; |
453 | } else { | 442 | } else { |
454 | switch (type) { | 443 | switch (type) { |
455 | case ACPI_EINJ_PROCESSOR_CORRECTABLE: | 444 | case ACPI_EINJ_PROCESSOR_CORRECTABLE: |
456 | case ACPI_EINJ_PROCESSOR_UNCORRECTABLE: | 445 | case ACPI_EINJ_PROCESSOR_UNCORRECTABLE: |
457 | case ACPI_EINJ_PROCESSOR_FATAL: | 446 | case ACPI_EINJ_PROCESSOR_FATAL: |
458 | writel(param1, &v5param->apicid); | 447 | v5param->apicid = param1; |
459 | writel(SETWA_FLAGS_APICID, &v5param->flags); | 448 | v5param->flags = SETWA_FLAGS_APICID; |
460 | break; | 449 | break; |
461 | case ACPI_EINJ_MEMORY_CORRECTABLE: | 450 | case ACPI_EINJ_MEMORY_CORRECTABLE: |
462 | case ACPI_EINJ_MEMORY_UNCORRECTABLE: | 451 | case ACPI_EINJ_MEMORY_UNCORRECTABLE: |
463 | case ACPI_EINJ_MEMORY_FATAL: | 452 | case ACPI_EINJ_MEMORY_FATAL: |
464 | writeq(param1, &v5param->memory_address); | 453 | v5param->memory_address = param1; |
465 | writeq(param2, &v5param->memory_address_range); | 454 | v5param->memory_address_range = param2; |
466 | writel(SETWA_FLAGS_MEM, &v5param->flags); | 455 | v5param->flags = SETWA_FLAGS_MEM; |
467 | break; | 456 | break; |
468 | case ACPI_EINJ_PCIX_CORRECTABLE: | 457 | case ACPI_EINJ_PCIX_CORRECTABLE: |
469 | case ACPI_EINJ_PCIX_UNCORRECTABLE: | 458 | case ACPI_EINJ_PCIX_UNCORRECTABLE: |
470 | case ACPI_EINJ_PCIX_FATAL: | 459 | case ACPI_EINJ_PCIX_FATAL: |
471 | writel(param1, &v5param->pcie_sbdf); | 460 | v5param->pcie_sbdf = param1; |
472 | writel(SETWA_FLAGS_PCIE_SBDF, &v5param->flags); | 461 | v5param->flags = SETWA_FLAGS_PCIE_SBDF; |
473 | break; | 462 | break; |
474 | } | 463 | } |
475 | } | 464 | } |
@@ -479,8 +468,8 @@ static int __einj_error_inject(u32 type, u64 param1, u64 param2) | |||
479 | return rc; | 468 | return rc; |
480 | if (einj_param) { | 469 | if (einj_param) { |
481 | struct einj_parameter *v4param = einj_param; | 470 | struct einj_parameter *v4param = einj_param; |
482 | writeq(param1, &v4param->param1); | 471 | v4param->param1 = param1; |
483 | writeq(param2, &v4param->param2); | 472 | v4param->param2 = param2; |
484 | } | 473 | } |
485 | } | 474 | } |
486 | rc = apei_exec_run(&ctx, ACPI_EINJ_EXECUTE_OPERATION); | 475 | rc = apei_exec_run(&ctx, ACPI_EINJ_EXECUTE_OPERATION); |
@@ -731,8 +720,13 @@ static int __init einj_init(void) | |||
731 | return 0; | 720 | return 0; |
732 | 721 | ||
733 | err_unmap: | 722 | err_unmap: |
734 | if (einj_param) | 723 | if (einj_param) { |
735 | iounmap(einj_param); | 724 | acpi_size size = (acpi5) ? |
725 | sizeof(struct set_error_type_with_address) : | ||
726 | sizeof(struct einj_parameter); | ||
727 | |||
728 | acpi_os_unmap_memory(einj_param, size); | ||
729 | } | ||
736 | apei_exec_post_unmap_gars(&ctx); | 730 | apei_exec_post_unmap_gars(&ctx); |
737 | err_release: | 731 | err_release: |
738 | apei_resources_release(&einj_resources); | 732 | apei_resources_release(&einj_resources); |
@@ -748,8 +742,13 @@ static void __exit einj_exit(void) | |||
748 | { | 742 | { |
749 | struct apei_exec_context ctx; | 743 | struct apei_exec_context ctx; |
750 | 744 | ||
751 | if (einj_param) | 745 | if (einj_param) { |
752 | iounmap(einj_param); | 746 | acpi_size size = (acpi5) ? |
747 | sizeof(struct set_error_type_with_address) : | ||
748 | sizeof(struct einj_parameter); | ||
749 | |||
750 | acpi_os_unmap_memory(einj_param, size); | ||
751 | } | ||
753 | einj_exec_ctx_init(&ctx); | 752 | einj_exec_ctx_init(&ctx); |
754 | apei_exec_post_unmap_gars(&ctx); | 753 | apei_exec_post_unmap_gars(&ctx); |
755 | apei_resources_release(&einj_resources); | 754 | apei_resources_release(&einj_resources); |
diff --git a/drivers/acpi/atomicio.c b/drivers/acpi/atomicio.c deleted file mode 100644 index d4a5b3d3657b..000000000000 --- a/drivers/acpi/atomicio.c +++ /dev/null | |||
@@ -1,422 +0,0 @@ | |||
1 | /* | ||
2 | * atomicio.c - ACPI IO memory pre-mapping/post-unmapping, then | ||
3 | * accessing in atomic context. | ||
4 | * | ||
5 | * This is used for NMI handler to access IO memory area, because | ||
6 | * ioremap/iounmap can not be used in NMI handler. The IO memory area | ||
7 | * is pre-mapped in process context and accessed in NMI handler. | ||
8 | * | ||
9 | * Copyright (C) 2009-2010, Intel Corp. | ||
10 | * Author: Huang Ying <ying.huang@intel.com> | ||
11 | * | ||
12 | * This program is free software; you can redistribute it and/or | ||
13 | * modify it under the terms of the GNU General Public License version | ||
14 | * 2 as published by the Free Software Foundation. | ||
15 | * | ||
16 | * This program is distributed in the hope that it will be useful, | ||
17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
19 | * GNU General Public License for more details. | ||
20 | * | ||
21 | * You should have received a copy of the GNU General Public License | ||
22 | * along with this program; if not, write to the Free Software | ||
23 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
24 | */ | ||
25 | |||
26 | #include <linux/kernel.h> | ||
27 | #include <linux/export.h> | ||
28 | #include <linux/init.h> | ||
29 | #include <linux/acpi.h> | ||
30 | #include <linux/io.h> | ||
31 | #include <linux/kref.h> | ||
32 | #include <linux/rculist.h> | ||
33 | #include <linux/interrupt.h> | ||
34 | #include <linux/slab.h> | ||
35 | #include <linux/mm.h> | ||
36 | #include <linux/highmem.h> | ||
37 | #include <acpi/atomicio.h> | ||
38 | |||
39 | #define ACPI_PFX "ACPI: " | ||
40 | |||
41 | static LIST_HEAD(acpi_iomaps); | ||
42 | /* | ||
43 | * Used for mutual exclusion between writers of acpi_iomaps list, for | ||
44 | * synchronization between readers and writer, RCU is used. | ||
45 | */ | ||
46 | static DEFINE_SPINLOCK(acpi_iomaps_lock); | ||
47 | |||
48 | struct acpi_iomap { | ||
49 | struct list_head list; | ||
50 | void __iomem *vaddr; | ||
51 | unsigned long size; | ||
52 | phys_addr_t paddr; | ||
53 | struct kref ref; | ||
54 | }; | ||
55 | |||
56 | /* acpi_iomaps_lock or RCU read lock must be held before calling */ | ||
57 | static struct acpi_iomap *__acpi_find_iomap(phys_addr_t paddr, | ||
58 | unsigned long size) | ||
59 | { | ||
60 | struct acpi_iomap *map; | ||
61 | |||
62 | list_for_each_entry_rcu(map, &acpi_iomaps, list) { | ||
63 | if (map->paddr + map->size >= paddr + size && | ||
64 | map->paddr <= paddr) | ||
65 | return map; | ||
66 | } | ||
67 | return NULL; | ||
68 | } | ||
69 | |||
70 | /* | ||
71 | * Atomic "ioremap" used by NMI handler, if the specified IO memory | ||
72 | * area is not pre-mapped, NULL will be returned. | ||
73 | * | ||
74 | * acpi_iomaps_lock or RCU read lock must be held before calling | ||
75 | */ | ||
76 | static void __iomem *__acpi_ioremap_fast(phys_addr_t paddr, | ||
77 | unsigned long size) | ||
78 | { | ||
79 | struct acpi_iomap *map; | ||
80 | |||
81 | map = __acpi_find_iomap(paddr, size/8); | ||
82 | if (map) | ||
83 | return map->vaddr + (paddr - map->paddr); | ||
84 | else | ||
85 | return NULL; | ||
86 | } | ||
87 | |||
88 | /* acpi_iomaps_lock must be held before calling */ | ||
89 | static void __iomem *__acpi_try_ioremap(phys_addr_t paddr, | ||
90 | unsigned long size) | ||
91 | { | ||
92 | struct acpi_iomap *map; | ||
93 | |||
94 | map = __acpi_find_iomap(paddr, size); | ||
95 | if (map) { | ||
96 | kref_get(&map->ref); | ||
97 | return map->vaddr + (paddr - map->paddr); | ||
98 | } else | ||
99 | return NULL; | ||
100 | } | ||
101 | |||
102 | #ifndef CONFIG_IA64 | ||
103 | #define should_use_kmap(pfn) page_is_ram(pfn) | ||
104 | #else | ||
105 | /* ioremap will take care of cache attributes */ | ||
106 | #define should_use_kmap(pfn) 0 | ||
107 | #endif | ||
108 | |||
109 | static void __iomem *acpi_map(phys_addr_t pg_off, unsigned long pg_sz) | ||
110 | { | ||
111 | unsigned long pfn; | ||
112 | |||
113 | pfn = pg_off >> PAGE_SHIFT; | ||
114 | if (should_use_kmap(pfn)) { | ||
115 | if (pg_sz > PAGE_SIZE) | ||
116 | return NULL; | ||
117 | return (void __iomem __force *)kmap(pfn_to_page(pfn)); | ||
118 | } else | ||
119 | return ioremap(pg_off, pg_sz); | ||
120 | } | ||
121 | |||
122 | static void acpi_unmap(phys_addr_t pg_off, void __iomem *vaddr) | ||
123 | { | ||
124 | unsigned long pfn; | ||
125 | |||
126 | pfn = pg_off >> PAGE_SHIFT; | ||
127 | if (page_is_ram(pfn)) | ||
128 | kunmap(pfn_to_page(pfn)); | ||
129 | else | ||
130 | iounmap(vaddr); | ||
131 | } | ||
132 | |||
133 | /* | ||
134 | * Used to pre-map the specified IO memory area. First try to find | ||
135 | * whether the area is already pre-mapped, if it is, increase the | ||
136 | * reference count (in __acpi_try_ioremap) and return; otherwise, do | ||
137 | * the real ioremap, and add the mapping into acpi_iomaps list. | ||
138 | */ | ||
139 | static void __iomem *acpi_pre_map(phys_addr_t paddr, | ||
140 | unsigned long size) | ||
141 | { | ||
142 | void __iomem *vaddr; | ||
143 | struct acpi_iomap *map; | ||
144 | unsigned long pg_sz, flags; | ||
145 | phys_addr_t pg_off; | ||
146 | |||
147 | spin_lock_irqsave(&acpi_iomaps_lock, flags); | ||
148 | vaddr = __acpi_try_ioremap(paddr, size); | ||
149 | spin_unlock_irqrestore(&acpi_iomaps_lock, flags); | ||
150 | if (vaddr) | ||
151 | return vaddr; | ||
152 | |||
153 | pg_off = paddr & PAGE_MASK; | ||
154 | pg_sz = ((paddr + size + PAGE_SIZE - 1) & PAGE_MASK) - pg_off; | ||
155 | vaddr = acpi_map(pg_off, pg_sz); | ||
156 | if (!vaddr) | ||
157 | return NULL; | ||
158 | map = kmalloc(sizeof(*map), GFP_KERNEL); | ||
159 | if (!map) | ||
160 | goto err_unmap; | ||
161 | INIT_LIST_HEAD(&map->list); | ||
162 | map->paddr = pg_off; | ||
163 | map->size = pg_sz; | ||
164 | map->vaddr = vaddr; | ||
165 | kref_init(&map->ref); | ||
166 | |||
167 | spin_lock_irqsave(&acpi_iomaps_lock, flags); | ||
168 | vaddr = __acpi_try_ioremap(paddr, size); | ||
169 | if (vaddr) { | ||
170 | spin_unlock_irqrestore(&acpi_iomaps_lock, flags); | ||
171 | acpi_unmap(pg_off, map->vaddr); | ||
172 | kfree(map); | ||
173 | return vaddr; | ||
174 | } | ||
175 | list_add_tail_rcu(&map->list, &acpi_iomaps); | ||
176 | spin_unlock_irqrestore(&acpi_iomaps_lock, flags); | ||
177 | |||
178 | return map->vaddr + (paddr - map->paddr); | ||
179 | err_unmap: | ||
180 | acpi_unmap(pg_off, vaddr); | ||
181 | return NULL; | ||
182 | } | ||
183 | |||
184 | /* acpi_iomaps_lock must be held before calling */ | ||
185 | static void __acpi_kref_del_iomap(struct kref *ref) | ||
186 | { | ||
187 | struct acpi_iomap *map; | ||
188 | |||
189 | map = container_of(ref, struct acpi_iomap, ref); | ||
190 | list_del_rcu(&map->list); | ||
191 | } | ||
192 | |||
193 | /* | ||
194 | * Used to post-unmap the specified IO memory area. The iounmap is | ||
195 | * done only if the reference count goes zero. | ||
196 | */ | ||
197 | static void acpi_post_unmap(phys_addr_t paddr, unsigned long size) | ||
198 | { | ||
199 | struct acpi_iomap *map; | ||
200 | unsigned long flags; | ||
201 | int del; | ||
202 | |||
203 | spin_lock_irqsave(&acpi_iomaps_lock, flags); | ||
204 | map = __acpi_find_iomap(paddr, size); | ||
205 | BUG_ON(!map); | ||
206 | del = kref_put(&map->ref, __acpi_kref_del_iomap); | ||
207 | spin_unlock_irqrestore(&acpi_iomaps_lock, flags); | ||
208 | |||
209 | if (!del) | ||
210 | return; | ||
211 | |||
212 | synchronize_rcu(); | ||
213 | acpi_unmap(map->paddr, map->vaddr); | ||
214 | kfree(map); | ||
215 | } | ||
216 | |||
217 | /* In NMI handler, should set silent = 1 */ | ||
218 | static int acpi_check_gar(struct acpi_generic_address *reg, | ||
219 | u64 *paddr, int silent) | ||
220 | { | ||
221 | u32 width, space_id; | ||
222 | |||
223 | width = reg->bit_width; | ||
224 | space_id = reg->space_id; | ||
225 | /* Handle possible alignment issues */ | ||
226 | memcpy(paddr, ®->address, sizeof(*paddr)); | ||
227 | if (!*paddr) { | ||
228 | if (!silent) | ||
229 | pr_warning(FW_BUG ACPI_PFX | ||
230 | "Invalid physical address in GAR [0x%llx/%u/%u]\n", | ||
231 | *paddr, width, space_id); | ||
232 | return -EINVAL; | ||
233 | } | ||
234 | |||
235 | if ((width != 8) && (width != 16) && (width != 32) && (width != 64)) { | ||
236 | if (!silent) | ||
237 | pr_warning(FW_BUG ACPI_PFX | ||
238 | "Invalid bit width in GAR [0x%llx/%u/%u]\n", | ||
239 | *paddr, width, space_id); | ||
240 | return -EINVAL; | ||
241 | } | ||
242 | |||
243 | if (space_id != ACPI_ADR_SPACE_SYSTEM_MEMORY && | ||
244 | space_id != ACPI_ADR_SPACE_SYSTEM_IO) { | ||
245 | if (!silent) | ||
246 | pr_warning(FW_BUG ACPI_PFX | ||
247 | "Invalid address space type in GAR [0x%llx/%u/%u]\n", | ||
248 | *paddr, width, space_id); | ||
249 | return -EINVAL; | ||
250 | } | ||
251 | |||
252 | return 0; | ||
253 | } | ||
254 | |||
255 | /* Pre-map, working on GAR */ | ||
256 | int acpi_pre_map_gar(struct acpi_generic_address *reg) | ||
257 | { | ||
258 | u64 paddr; | ||
259 | void __iomem *vaddr; | ||
260 | int rc; | ||
261 | |||
262 | if (reg->space_id != ACPI_ADR_SPACE_SYSTEM_MEMORY) | ||
263 | return 0; | ||
264 | |||
265 | rc = acpi_check_gar(reg, &paddr, 0); | ||
266 | if (rc) | ||
267 | return rc; | ||
268 | |||
269 | vaddr = acpi_pre_map(paddr, reg->bit_width / 8); | ||
270 | if (!vaddr) | ||
271 | return -EIO; | ||
272 | |||
273 | return 0; | ||
274 | } | ||
275 | EXPORT_SYMBOL_GPL(acpi_pre_map_gar); | ||
276 | |||
277 | /* Post-unmap, working on GAR */ | ||
278 | int acpi_post_unmap_gar(struct acpi_generic_address *reg) | ||
279 | { | ||
280 | u64 paddr; | ||
281 | int rc; | ||
282 | |||
283 | if (reg->space_id != ACPI_ADR_SPACE_SYSTEM_MEMORY) | ||
284 | return 0; | ||
285 | |||
286 | rc = acpi_check_gar(reg, &paddr, 0); | ||
287 | if (rc) | ||
288 | return rc; | ||
289 | |||
290 | acpi_post_unmap(paddr, reg->bit_width / 8); | ||
291 | |||
292 | return 0; | ||
293 | } | ||
294 | EXPORT_SYMBOL_GPL(acpi_post_unmap_gar); | ||
295 | |||
296 | #ifdef readq | ||
297 | static inline u64 read64(const volatile void __iomem *addr) | ||
298 | { | ||
299 | return readq(addr); | ||
300 | } | ||
301 | #else | ||
302 | static inline u64 read64(const volatile void __iomem *addr) | ||
303 | { | ||
304 | u64 l, h; | ||
305 | l = readl(addr); | ||
306 | h = readl(addr+4); | ||
307 | return l | (h << 32); | ||
308 | } | ||
309 | #endif | ||
310 | |||
311 | /* | ||
312 | * Can be used in atomic (including NMI) or process context. RCU read | ||
313 | * lock can only be released after the IO memory area accessing. | ||
314 | */ | ||
315 | static int acpi_atomic_read_mem(u64 paddr, u64 *val, u32 width) | ||
316 | { | ||
317 | void __iomem *addr; | ||
318 | |||
319 | rcu_read_lock(); | ||
320 | addr = __acpi_ioremap_fast(paddr, width); | ||
321 | switch (width) { | ||
322 | case 8: | ||
323 | *val = readb(addr); | ||
324 | break; | ||
325 | case 16: | ||
326 | *val = readw(addr); | ||
327 | break; | ||
328 | case 32: | ||
329 | *val = readl(addr); | ||
330 | break; | ||
331 | case 64: | ||
332 | *val = read64(addr); | ||
333 | break; | ||
334 | default: | ||
335 | return -EINVAL; | ||
336 | } | ||
337 | rcu_read_unlock(); | ||
338 | |||
339 | return 0; | ||
340 | } | ||
341 | |||
342 | #ifdef writeq | ||
343 | static inline void write64(u64 val, volatile void __iomem *addr) | ||
344 | { | ||
345 | writeq(val, addr); | ||
346 | } | ||
347 | #else | ||
348 | static inline void write64(u64 val, volatile void __iomem *addr) | ||
349 | { | ||
350 | writel(val, addr); | ||
351 | writel(val>>32, addr+4); | ||
352 | } | ||
353 | #endif | ||
354 | |||
355 | static int acpi_atomic_write_mem(u64 paddr, u64 val, u32 width) | ||
356 | { | ||
357 | void __iomem *addr; | ||
358 | |||
359 | rcu_read_lock(); | ||
360 | addr = __acpi_ioremap_fast(paddr, width); | ||
361 | switch (width) { | ||
362 | case 8: | ||
363 | writeb(val, addr); | ||
364 | break; | ||
365 | case 16: | ||
366 | writew(val, addr); | ||
367 | break; | ||
368 | case 32: | ||
369 | writel(val, addr); | ||
370 | break; | ||
371 | case 64: | ||
372 | write64(val, addr); | ||
373 | break; | ||
374 | default: | ||
375 | return -EINVAL; | ||
376 | } | ||
377 | rcu_read_unlock(); | ||
378 | |||
379 | return 0; | ||
380 | } | ||
381 | |||
382 | /* GAR accessing in atomic (including NMI) or process context */ | ||
383 | int acpi_atomic_read(u64 *val, struct acpi_generic_address *reg) | ||
384 | { | ||
385 | u64 paddr; | ||
386 | int rc; | ||
387 | |||
388 | rc = acpi_check_gar(reg, &paddr, 1); | ||
389 | if (rc) | ||
390 | return rc; | ||
391 | |||
392 | *val = 0; | ||
393 | switch (reg->space_id) { | ||
394 | case ACPI_ADR_SPACE_SYSTEM_MEMORY: | ||
395 | return acpi_atomic_read_mem(paddr, val, reg->bit_width); | ||
396 | case ACPI_ADR_SPACE_SYSTEM_IO: | ||
397 | return acpi_os_read_port(paddr, (u32 *)val, reg->bit_width); | ||
398 | default: | ||
399 | return -EINVAL; | ||
400 | } | ||
401 | } | ||
402 | EXPORT_SYMBOL_GPL(acpi_atomic_read); | ||
403 | |||
404 | int acpi_atomic_write(u64 val, struct acpi_generic_address *reg) | ||
405 | { | ||
406 | u64 paddr; | ||
407 | int rc; | ||
408 | |||
409 | rc = acpi_check_gar(reg, &paddr, 1); | ||
410 | if (rc) | ||
411 | return rc; | ||
412 | |||
413 | switch (reg->space_id) { | ||
414 | case ACPI_ADR_SPACE_SYSTEM_MEMORY: | ||
415 | return acpi_atomic_write_mem(paddr, val, reg->bit_width); | ||
416 | case ACPI_ADR_SPACE_SYSTEM_IO: | ||
417 | return acpi_os_write_port(paddr, val, reg->bit_width); | ||
418 | default: | ||
419 | return -EINVAL; | ||
420 | } | ||
421 | } | ||
422 | EXPORT_SYMBOL_GPL(acpi_atomic_write); | ||
diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c index fcc12d842bcc..412a1e04a922 100644 --- a/drivers/acpi/osl.c +++ b/drivers/acpi/osl.c | |||
@@ -31,6 +31,7 @@ | |||
31 | #include <linux/kernel.h> | 31 | #include <linux/kernel.h> |
32 | #include <linux/slab.h> | 32 | #include <linux/slab.h> |
33 | #include <linux/mm.h> | 33 | #include <linux/mm.h> |
34 | #include <linux/highmem.h> | ||
34 | #include <linux/pci.h> | 35 | #include <linux/pci.h> |
35 | #include <linux/interrupt.h> | 36 | #include <linux/interrupt.h> |
36 | #include <linux/kmod.h> | 37 | #include <linux/kmod.h> |
@@ -321,6 +322,37 @@ acpi_map_lookup_virt(void __iomem *virt, acpi_size size) | |||
321 | return NULL; | 322 | return NULL; |
322 | } | 323 | } |
323 | 324 | ||
325 | #ifndef CONFIG_IA64 | ||
326 | #define should_use_kmap(pfn) page_is_ram(pfn) | ||
327 | #else | ||
328 | /* ioremap will take care of cache attributes */ | ||
329 | #define should_use_kmap(pfn) 0 | ||
330 | #endif | ||
331 | |||
332 | static void __iomem *acpi_map(acpi_physical_address pg_off, unsigned long pg_sz) | ||
333 | { | ||
334 | unsigned long pfn; | ||
335 | |||
336 | pfn = pg_off >> PAGE_SHIFT; | ||
337 | if (should_use_kmap(pfn)) { | ||
338 | if (pg_sz > PAGE_SIZE) | ||
339 | return NULL; | ||
340 | return (void __iomem __force *)kmap(pfn_to_page(pfn)); | ||
341 | } else | ||
342 | return acpi_os_ioremap(pg_off, pg_sz); | ||
343 | } | ||
344 | |||
345 | static void acpi_unmap(acpi_physical_address pg_off, void __iomem *vaddr) | ||
346 | { | ||
347 | unsigned long pfn; | ||
348 | |||
349 | pfn = pg_off >> PAGE_SHIFT; | ||
350 | if (page_is_ram(pfn)) | ||
351 | kunmap(pfn_to_page(pfn)); | ||
352 | else | ||
353 | iounmap(vaddr); | ||
354 | } | ||
355 | |||
324 | void __iomem *__init_refok | 356 | void __iomem *__init_refok |
325 | acpi_os_map_memory(acpi_physical_address phys, acpi_size size) | 357 | acpi_os_map_memory(acpi_physical_address phys, acpi_size size) |
326 | { | 358 | { |
@@ -353,7 +385,7 @@ acpi_os_map_memory(acpi_physical_address phys, acpi_size size) | |||
353 | 385 | ||
354 | pg_off = round_down(phys, PAGE_SIZE); | 386 | pg_off = round_down(phys, PAGE_SIZE); |
355 | pg_sz = round_up(phys + size, PAGE_SIZE) - pg_off; | 387 | pg_sz = round_up(phys + size, PAGE_SIZE) - pg_off; |
356 | virt = acpi_os_ioremap(pg_off, pg_sz); | 388 | virt = acpi_map(pg_off, pg_sz); |
357 | if (!virt) { | 389 | if (!virt) { |
358 | mutex_unlock(&acpi_ioremap_lock); | 390 | mutex_unlock(&acpi_ioremap_lock); |
359 | kfree(map); | 391 | kfree(map); |
@@ -384,7 +416,7 @@ static void acpi_os_map_cleanup(struct acpi_ioremap *map) | |||
384 | { | 416 | { |
385 | if (!map->refcount) { | 417 | if (!map->refcount) { |
386 | synchronize_rcu(); | 418 | synchronize_rcu(); |
387 | iounmap(map->virt); | 419 | acpi_unmap(map->phys, map->virt); |
388 | kfree(map); | 420 | kfree(map); |
389 | } | 421 | } |
390 | } | 422 | } |
@@ -710,6 +742,67 @@ acpi_os_read_memory(acpi_physical_address phys_addr, u32 * value, u32 width) | |||
710 | return AE_OK; | 742 | return AE_OK; |
711 | } | 743 | } |
712 | 744 | ||
745 | #ifdef readq | ||
746 | static inline u64 read64(const volatile void __iomem *addr) | ||
747 | { | ||
748 | return readq(addr); | ||
749 | } | ||
750 | #else | ||
751 | static inline u64 read64(const volatile void __iomem *addr) | ||
752 | { | ||
753 | u64 l, h; | ||
754 | l = readl(addr); | ||
755 | h = readl(addr+4); | ||
756 | return l | (h << 32); | ||
757 | } | ||
758 | #endif | ||
759 | |||
760 | acpi_status | ||
761 | acpi_os_read_memory64(acpi_physical_address phys_addr, u64 *value, u32 width) | ||
762 | { | ||
763 | void __iomem *virt_addr; | ||
764 | unsigned int size = width / 8; | ||
765 | bool unmap = false; | ||
766 | u64 dummy; | ||
767 | |||
768 | rcu_read_lock(); | ||
769 | virt_addr = acpi_map_vaddr_lookup(phys_addr, size); | ||
770 | if (!virt_addr) { | ||
771 | rcu_read_unlock(); | ||
772 | virt_addr = acpi_os_ioremap(phys_addr, size); | ||
773 | if (!virt_addr) | ||
774 | return AE_BAD_ADDRESS; | ||
775 | unmap = true; | ||
776 | } | ||
777 | |||
778 | if (!value) | ||
779 | value = &dummy; | ||
780 | |||
781 | switch (width) { | ||
782 | case 8: | ||
783 | *(u8 *) value = readb(virt_addr); | ||
784 | break; | ||
785 | case 16: | ||
786 | *(u16 *) value = readw(virt_addr); | ||
787 | break; | ||
788 | case 32: | ||
789 | *(u32 *) value = readl(virt_addr); | ||
790 | break; | ||
791 | case 64: | ||
792 | *(u64 *) value = read64(virt_addr); | ||
793 | break; | ||
794 | default: | ||
795 | BUG(); | ||
796 | } | ||
797 | |||
798 | if (unmap) | ||
799 | iounmap(virt_addr); | ||
800 | else | ||
801 | rcu_read_unlock(); | ||
802 | |||
803 | return AE_OK; | ||
804 | } | ||
805 | |||
713 | acpi_status | 806 | acpi_status |
714 | acpi_os_write_memory(acpi_physical_address phys_addr, u32 value, u32 width) | 807 | acpi_os_write_memory(acpi_physical_address phys_addr, u32 value, u32 width) |
715 | { | 808 | { |
@@ -749,6 +842,61 @@ acpi_os_write_memory(acpi_physical_address phys_addr, u32 value, u32 width) | |||
749 | return AE_OK; | 842 | return AE_OK; |
750 | } | 843 | } |
751 | 844 | ||
845 | #ifdef writeq | ||
846 | static inline void write64(u64 val, volatile void __iomem *addr) | ||
847 | { | ||
848 | writeq(val, addr); | ||
849 | } | ||
850 | #else | ||
851 | static inline void write64(u64 val, volatile void __iomem *addr) | ||
852 | { | ||
853 | writel(val, addr); | ||
854 | writel(val>>32, addr+4); | ||
855 | } | ||
856 | #endif | ||
857 | |||
858 | acpi_status | ||
859 | acpi_os_write_memory64(acpi_physical_address phys_addr, u64 value, u32 width) | ||
860 | { | ||
861 | void __iomem *virt_addr; | ||
862 | unsigned int size = width / 8; | ||
863 | bool unmap = false; | ||
864 | |||
865 | rcu_read_lock(); | ||
866 | virt_addr = acpi_map_vaddr_lookup(phys_addr, size); | ||
867 | if (!virt_addr) { | ||
868 | rcu_read_unlock(); | ||
869 | virt_addr = acpi_os_ioremap(phys_addr, size); | ||
870 | if (!virt_addr) | ||
871 | return AE_BAD_ADDRESS; | ||
872 | unmap = true; | ||
873 | } | ||
874 | |||
875 | switch (width) { | ||
876 | case 8: | ||
877 | writeb(value, virt_addr); | ||
878 | break; | ||
879 | case 16: | ||
880 | writew(value, virt_addr); | ||
881 | break; | ||
882 | case 32: | ||
883 | writel(value, virt_addr); | ||
884 | break; | ||
885 | case 64: | ||
886 | write64(value, virt_addr); | ||
887 | break; | ||
888 | default: | ||
889 | BUG(); | ||
890 | } | ||
891 | |||
892 | if (unmap) | ||
893 | iounmap(virt_addr); | ||
894 | else | ||
895 | rcu_read_unlock(); | ||
896 | |||
897 | return AE_OK; | ||
898 | } | ||
899 | |||
752 | acpi_status | 900 | acpi_status |
753 | acpi_os_read_pci_configuration(struct acpi_pci_id * pci_id, u32 reg, | 901 | acpi_os_read_pci_configuration(struct acpi_pci_id * pci_id, u32 reg, |
754 | u64 *value, u32 width) | 902 | u64 *value, u32 width) |
diff --git a/drivers/acpi/processor_driver.c b/drivers/acpi/processor_driver.c index 0034ede38710..2b805d7ef317 100644 --- a/drivers/acpi/processor_driver.c +++ b/drivers/acpi/processor_driver.c | |||
@@ -84,7 +84,7 @@ static int acpi_processor_remove(struct acpi_device *device, int type); | |||
84 | static void acpi_processor_notify(struct acpi_device *device, u32 event); | 84 | static void acpi_processor_notify(struct acpi_device *device, u32 event); |
85 | static acpi_status acpi_processor_hotadd_init(struct acpi_processor *pr); | 85 | static acpi_status acpi_processor_hotadd_init(struct acpi_processor *pr); |
86 | static int acpi_processor_handle_eject(struct acpi_processor *pr); | 86 | static int acpi_processor_handle_eject(struct acpi_processor *pr); |
87 | 87 | static int acpi_processor_start(struct acpi_processor *pr); | |
88 | 88 | ||
89 | static const struct acpi_device_id processor_device_ids[] = { | 89 | static const struct acpi_device_id processor_device_ids[] = { |
90 | {ACPI_PROCESSOR_OBJECT_HID, 0}, | 90 | {ACPI_PROCESSOR_OBJECT_HID, 0}, |
@@ -423,10 +423,29 @@ static int acpi_cpu_soft_notify(struct notifier_block *nfb, | |||
423 | struct acpi_processor *pr = per_cpu(processors, cpu); | 423 | struct acpi_processor *pr = per_cpu(processors, cpu); |
424 | 424 | ||
425 | if (action == CPU_ONLINE && pr) { | 425 | if (action == CPU_ONLINE && pr) { |
426 | acpi_processor_ppc_has_changed(pr, 0); | 426 | /* CPU got physically hotplugged and onlined the first time: |
427 | acpi_processor_hotplug(pr); | 427 | * Initialize missing things |
428 | acpi_processor_reevaluate_tstate(pr, action); | 428 | */ |
429 | acpi_processor_tstate_has_changed(pr); | 429 | if (pr->flags.need_hotplug_init) { |
430 | struct cpuidle_driver *idle_driver = | ||
431 | cpuidle_get_driver(); | ||
432 | |||
433 | printk(KERN_INFO "Will online and init hotplugged " | ||
434 | "CPU: %d\n", pr->id); | ||
435 | WARN(acpi_processor_start(pr), "Failed to start CPU:" | ||
436 | " %d\n", pr->id); | ||
437 | pr->flags.need_hotplug_init = 0; | ||
438 | if (idle_driver && !strcmp(idle_driver->name, | ||
439 | "intel_idle")) { | ||
440 | intel_idle_cpu_init(pr->id); | ||
441 | } | ||
442 | /* Normal CPU soft online event */ | ||
443 | } else { | ||
444 | acpi_processor_ppc_has_changed(pr, 0); | ||
445 | acpi_processor_cst_has_changed(pr); | ||
446 | acpi_processor_reevaluate_tstate(pr, action); | ||
447 | acpi_processor_tstate_has_changed(pr); | ||
448 | } | ||
430 | } | 449 | } |
431 | if (action == CPU_DEAD && pr) { | 450 | if (action == CPU_DEAD && pr) { |
432 | /* invalidate the flag.throttling after one CPU is offline */ | 451 | /* invalidate the flag.throttling after one CPU is offline */ |
@@ -440,6 +459,71 @@ static struct notifier_block acpi_cpu_notifier = | |||
440 | .notifier_call = acpi_cpu_soft_notify, | 459 | .notifier_call = acpi_cpu_soft_notify, |
441 | }; | 460 | }; |
442 | 461 | ||
462 | /* | ||
463 | * acpi_processor_start() is called by the cpu_hotplug_notifier func: | ||
464 | * acpi_cpu_soft_notify(). Getting it __cpuinit{data} is difficult, the | ||
465 | * root cause seem to be that acpi_processor_uninstall_hotplug_notify() | ||
466 | * is in the module_exit (__exit) func. Allowing acpi_processor_start() | ||
467 | * to not be in __cpuinit section, but being called from __cpuinit funcs | ||
468 | * via __ref looks like the right thing to do here. | ||
469 | */ | ||
470 | static __ref int acpi_processor_start(struct acpi_processor *pr) | ||
471 | { | ||
472 | struct acpi_device *device = per_cpu(processor_device_array, pr->id); | ||
473 | int result = 0; | ||
474 | |||
475 | #ifdef CONFIG_CPU_FREQ | ||
476 | acpi_processor_ppc_has_changed(pr, 0); | ||
477 | #endif | ||
478 | acpi_processor_get_throttling_info(pr); | ||
479 | acpi_processor_get_limit_info(pr); | ||
480 | |||
481 | if (!cpuidle_get_driver() || cpuidle_get_driver() == &acpi_idle_driver) | ||
482 | acpi_processor_power_init(pr, device); | ||
483 | |||
484 | pr->cdev = thermal_cooling_device_register("Processor", device, | ||
485 | &processor_cooling_ops); | ||
486 | if (IS_ERR(pr->cdev)) { | ||
487 | result = PTR_ERR(pr->cdev); | ||
488 | goto err_power_exit; | ||
489 | } | ||
490 | |||
491 | dev_dbg(&device->dev, "registered as cooling_device%d\n", | ||
492 | pr->cdev->id); | ||
493 | |||
494 | result = sysfs_create_link(&device->dev.kobj, | ||
495 | &pr->cdev->device.kobj, | ||
496 | "thermal_cooling"); | ||
497 | if (result) { | ||
498 | printk(KERN_ERR PREFIX "Create sysfs link\n"); | ||
499 | goto err_thermal_unregister; | ||
500 | } | ||
501 | result = sysfs_create_link(&pr->cdev->device.kobj, | ||
502 | &device->dev.kobj, | ||
503 | "device"); | ||
504 | if (result) { | ||
505 | printk(KERN_ERR PREFIX "Create sysfs link\n"); | ||
506 | goto err_remove_sysfs_thermal; | ||
507 | } | ||
508 | |||
509 | return 0; | ||
510 | |||
511 | err_remove_sysfs_thermal: | ||
512 | sysfs_remove_link(&device->dev.kobj, "thermal_cooling"); | ||
513 | err_thermal_unregister: | ||
514 | thermal_cooling_device_unregister(pr->cdev); | ||
515 | err_power_exit: | ||
516 | acpi_processor_power_exit(pr, device); | ||
517 | |||
518 | return result; | ||
519 | } | ||
520 | |||
521 | /* | ||
522 | * Do not put anything in here which needs the core to be online. | ||
523 | * For example MSR access or setting up things which check for cpuinfo_x86 | ||
524 | * (cpu_data(cpu)) values, like CPU feature flags, family, model, etc. | ||
525 | * Such things have to be put in and set up above in acpi_processor_start() | ||
526 | */ | ||
443 | static int __cpuinit acpi_processor_add(struct acpi_device *device) | 527 | static int __cpuinit acpi_processor_add(struct acpi_device *device) |
444 | { | 528 | { |
445 | struct acpi_processor *pr = NULL; | 529 | struct acpi_processor *pr = NULL; |
@@ -495,48 +579,27 @@ static int __cpuinit acpi_processor_add(struct acpi_device *device) | |||
495 | goto err_free_cpumask; | 579 | goto err_free_cpumask; |
496 | } | 580 | } |
497 | 581 | ||
498 | #ifdef CONFIG_CPU_FREQ | 582 | /* |
499 | acpi_processor_ppc_has_changed(pr, 0); | 583 | * Do not start hotplugged CPUs now, but when they |
500 | #endif | 584 | * are onlined the first time |
501 | acpi_processor_get_throttling_info(pr); | 585 | */ |
502 | acpi_processor_get_limit_info(pr); | 586 | if (pr->flags.need_hotplug_init) |
503 | 587 | return 0; | |
504 | if (!cpuidle_get_driver() || cpuidle_get_driver() == &acpi_idle_driver) | ||
505 | acpi_processor_power_init(pr, device); | ||
506 | |||
507 | pr->cdev = thermal_cooling_device_register("Processor", device, | ||
508 | &processor_cooling_ops); | ||
509 | if (IS_ERR(pr->cdev)) { | ||
510 | result = PTR_ERR(pr->cdev); | ||
511 | goto err_power_exit; | ||
512 | } | ||
513 | 588 | ||
514 | dev_dbg(&device->dev, "registered as cooling_device%d\n", | 589 | /* |
515 | pr->cdev->id); | 590 | * Do not start hotplugged CPUs now, but when they |
591 | * are onlined the first time | ||
592 | */ | ||
593 | if (pr->flags.need_hotplug_init) | ||
594 | return 0; | ||
516 | 595 | ||
517 | result = sysfs_create_link(&device->dev.kobj, | 596 | result = acpi_processor_start(pr); |
518 | &pr->cdev->device.kobj, | 597 | if (result) |
519 | "thermal_cooling"); | ||
520 | if (result) { | ||
521 | printk(KERN_ERR PREFIX "Create sysfs link\n"); | ||
522 | goto err_thermal_unregister; | ||
523 | } | ||
524 | result = sysfs_create_link(&pr->cdev->device.kobj, | ||
525 | &device->dev.kobj, | ||
526 | "device"); | ||
527 | if (result) { | ||
528 | printk(KERN_ERR PREFIX "Create sysfs link\n"); | ||
529 | goto err_remove_sysfs; | 598 | goto err_remove_sysfs; |
530 | } | ||
531 | 599 | ||
532 | return 0; | 600 | return 0; |
533 | 601 | ||
534 | err_remove_sysfs: | 602 | err_remove_sysfs: |
535 | sysfs_remove_link(&device->dev.kobj, "thermal_cooling"); | ||
536 | err_thermal_unregister: | ||
537 | thermal_cooling_device_unregister(pr->cdev); | ||
538 | err_power_exit: | ||
539 | acpi_processor_power_exit(pr, device); | ||
540 | sysfs_remove_link(&device->dev.kobj, "sysdev"); | 603 | sysfs_remove_link(&device->dev.kobj, "sysdev"); |
541 | err_free_cpumask: | 604 | err_free_cpumask: |
542 | free_cpumask_var(pr->throttling.shared_cpu_map); | 605 | free_cpumask_var(pr->throttling.shared_cpu_map); |
@@ -735,6 +798,17 @@ static acpi_status acpi_processor_hotadd_init(struct acpi_processor *pr) | |||
735 | return AE_ERROR; | 798 | return AE_ERROR; |
736 | } | 799 | } |
737 | 800 | ||
801 | /* CPU got hot-plugged, but cpu_data is not initialized yet | ||
802 | * Set flag to delay cpu_idle/throttling initialization | ||
803 | * in: | ||
804 | * acpi_processor_add() | ||
805 | * acpi_processor_get_info() | ||
806 | * and do it when the CPU gets online the first time | ||
807 | * TBD: Cleanup above functions and try to do this more elegant. | ||
808 | */ | ||
809 | printk(KERN_INFO "CPU %d got hotplugged\n", pr->id); | ||
810 | pr->flags.need_hotplug_init = 1; | ||
811 | |||
738 | return AE_OK; | 812 | return AE_OK; |
739 | } | 813 | } |
740 | 814 | ||
diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c index 0a7ed69546ba..ca191ff97844 100644 --- a/drivers/acpi/sleep.c +++ b/drivers/acpi/sleep.c | |||
@@ -438,6 +438,14 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = { | |||
438 | }, | 438 | }, |
439 | { | 439 | { |
440 | .callback = init_nvs_nosave, | 440 | .callback = init_nvs_nosave, |
441 | .ident = "Sony Vaio VPCCW29FX", | ||
442 | .matches = { | ||
443 | DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), | ||
444 | DMI_MATCH(DMI_PRODUCT_NAME, "VPCCW29FX"), | ||
445 | }, | ||
446 | }, | ||
447 | { | ||
448 | .callback = init_nvs_nosave, | ||
441 | .ident = "Averatec AV1020-ED2", | 449 | .ident = "Averatec AV1020-ED2", |
442 | .matches = { | 450 | .matches = { |
443 | DMI_MATCH(DMI_SYS_VENDOR, "AVERATEC"), | 451 | DMI_MATCH(DMI_SYS_VENDOR, "AVERATEC"), |
diff --git a/drivers/base/Makefile b/drivers/base/Makefile index 2c8272dd93c4..610f9997a403 100644 --- a/drivers/base/Makefile +++ b/drivers/base/Makefile | |||
@@ -1,6 +1,6 @@ | |||
1 | # Makefile for the Linux device tree | 1 | # Makefile for the Linux device tree |
2 | 2 | ||
3 | obj-y := core.o sys.o bus.o dd.o syscore.o \ | 3 | obj-y := core.o bus.o dd.o syscore.o \ |
4 | driver.o class.o platform.o \ | 4 | driver.o class.o platform.o \ |
5 | cpu.o firmware.o init.o map.o devres.o \ | 5 | cpu.o firmware.o init.o map.o devres.o \ |
6 | attribute_container.o transport_class.o \ | 6 | attribute_container.o transport_class.o \ |
diff --git a/drivers/base/bus.c b/drivers/base/bus.c index 99dc5921e1dd..40fb12288ce2 100644 --- a/drivers/base/bus.c +++ b/drivers/base/bus.c | |||
@@ -915,9 +915,10 @@ static BUS_ATTR(uevent, S_IWUSR, NULL, bus_uevent_store); | |||
915 | 915 | ||
916 | /** | 916 | /** |
917 | * __bus_register - register a driver-core subsystem | 917 | * __bus_register - register a driver-core subsystem |
918 | * @bus: bus. | 918 | * @bus: bus to register |
919 | * @key: lockdep class key | ||
919 | * | 920 | * |
920 | * Once we have that, we registered the bus with the kobject | 921 | * Once we have that, we register the bus with the kobject |
921 | * infrastructure, then register the children subsystems it has: | 922 | * infrastructure, then register the children subsystems it has: |
922 | * the devices and drivers that belong to the subsystem. | 923 | * the devices and drivers that belong to the subsystem. |
923 | */ | 924 | */ |
@@ -1220,8 +1221,8 @@ static void system_root_device_release(struct device *dev) | |||
1220 | } | 1221 | } |
1221 | /** | 1222 | /** |
1222 | * subsys_system_register - register a subsystem at /sys/devices/system/ | 1223 | * subsys_system_register - register a subsystem at /sys/devices/system/ |
1223 | * @subsys - system subsystem | 1224 | * @subsys: system subsystem |
1224 | * @groups - default attributes for the root device | 1225 | * @groups: default attributes for the root device |
1225 | * | 1226 | * |
1226 | * All 'system' subsystems have a /sys/devices/system/<name> root device | 1227 | * All 'system' subsystems have a /sys/devices/system/<name> root device |
1227 | * with the name of the subsystem. The root device can carry subsystem- | 1228 | * with the name of the subsystem. The root device can carry subsystem- |
diff --git a/drivers/base/core.c b/drivers/base/core.c index 4a67cc0c8b37..74dda4f697f9 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c | |||
@@ -632,6 +632,11 @@ static void klist_children_put(struct klist_node *n) | |||
632 | * may be used for reference counting of @dev after calling this | 632 | * may be used for reference counting of @dev after calling this |
633 | * function. | 633 | * function. |
634 | * | 634 | * |
635 | * All fields in @dev must be initialized by the caller to 0, except | ||
636 | * for those explicitly set to some other value. The simplest | ||
637 | * approach is to use kzalloc() to allocate the structure containing | ||
638 | * @dev. | ||
639 | * | ||
635 | * NOTE: Use put_device() to give up your reference instead of freeing | 640 | * NOTE: Use put_device() to give up your reference instead of freeing |
636 | * @dev directly once you have called this function. | 641 | * @dev directly once you have called this function. |
637 | */ | 642 | */ |
@@ -930,6 +935,13 @@ int device_private_init(struct device *dev) | |||
930 | * to the global and sibling lists for the device, then | 935 | * to the global and sibling lists for the device, then |
931 | * adds it to the other relevant subsystems of the driver model. | 936 | * adds it to the other relevant subsystems of the driver model. |
932 | * | 937 | * |
938 | * Do not call this routine or device_register() more than once for | ||
939 | * any device structure. The driver model core is not designed to work | ||
940 | * with devices that get unregistered and then spring back to life. | ||
941 | * (Among other things, it's very hard to guarantee that all references | ||
942 | * to the previous incarnation of @dev have been dropped.) Allocate | ||
943 | * and register a fresh new struct device instead. | ||
944 | * | ||
933 | * NOTE: _Never_ directly free @dev after calling this function, even | 945 | * NOTE: _Never_ directly free @dev after calling this function, even |
934 | * if it returned an error! Always use put_device() to give up your | 946 | * if it returned an error! Always use put_device() to give up your |
935 | * reference instead. | 947 | * reference instead. |
@@ -1022,7 +1034,7 @@ int device_add(struct device *dev) | |||
1022 | device_pm_add(dev); | 1034 | device_pm_add(dev); |
1023 | 1035 | ||
1024 | /* Notify clients of device addition. This call must come | 1036 | /* Notify clients of device addition. This call must come |
1025 | * after dpm_sysf_add() and before kobject_uevent(). | 1037 | * after dpm_sysfs_add() and before kobject_uevent(). |
1026 | */ | 1038 | */ |
1027 | if (dev->bus) | 1039 | if (dev->bus) |
1028 | blocking_notifier_call_chain(&dev->bus->p->bus_notifier, | 1040 | blocking_notifier_call_chain(&dev->bus->p->bus_notifier, |
@@ -1090,6 +1102,9 @@ name_error: | |||
1090 | * have a clearly defined need to use and refcount the device | 1102 | * have a clearly defined need to use and refcount the device |
1091 | * before it is added to the hierarchy. | 1103 | * before it is added to the hierarchy. |
1092 | * | 1104 | * |
1105 | * For more information, see the kerneldoc for device_initialize() | ||
1106 | * and device_add(). | ||
1107 | * | ||
1093 | * NOTE: _Never_ directly free @dev after calling this function, even | 1108 | * NOTE: _Never_ directly free @dev after calling this function, even |
1094 | * if it returned an error! Always use put_device() to give up the | 1109 | * if it returned an error! Always use put_device() to give up the |
1095 | * reference initialized in this function instead. | 1110 | * reference initialized in this function instead. |
diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c index 26ab358dac62..6c9387d646ec 100644 --- a/drivers/base/firmware_class.c +++ b/drivers/base/firmware_class.c | |||
@@ -525,8 +525,7 @@ static int _request_firmware(const struct firmware **firmware_p, | |||
525 | if (!firmware) { | 525 | if (!firmware) { |
526 | dev_err(device, "%s: kmalloc(struct firmware) failed\n", | 526 | dev_err(device, "%s: kmalloc(struct firmware) failed\n", |
527 | __func__); | 527 | __func__); |
528 | retval = -ENOMEM; | 528 | return -ENOMEM; |
529 | goto out; | ||
530 | } | 529 | } |
531 | 530 | ||
532 | if (fw_get_builtin_firmware(firmware, name)) { | 531 | if (fw_get_builtin_firmware(firmware, name)) { |
diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c index be10a4ff6609..65558034318f 100644 --- a/drivers/base/regmap/regmap.c +++ b/drivers/base/regmap/regmap.c | |||
@@ -284,6 +284,9 @@ int regmap_reinit_cache(struct regmap *map, const struct regmap_config *config) | |||
284 | map->precious_reg = config->precious_reg; | 284 | map->precious_reg = config->precious_reg; |
285 | map->cache_type = config->cache_type; | 285 | map->cache_type = config->cache_type; |
286 | 286 | ||
287 | map->cache_bypass = false; | ||
288 | map->cache_only = false; | ||
289 | |||
287 | ret = regcache_init(map, config); | 290 | ret = regcache_init(map, config); |
288 | 291 | ||
289 | mutex_unlock(&map->lock); | 292 | mutex_unlock(&map->lock); |
diff --git a/drivers/base/sys.c b/drivers/base/sys.c deleted file mode 100644 index 409f5ce78829..000000000000 --- a/drivers/base/sys.c +++ /dev/null | |||
@@ -1,383 +0,0 @@ | |||
1 | /* | ||
2 | * sys.c - pseudo-bus for system 'devices' (cpus, PICs, timers, etc) | ||
3 | * | ||
4 | * Copyright (c) 2002-3 Patrick Mochel | ||
5 | * 2002-3 Open Source Development Lab | ||
6 | * | ||
7 | * This file is released under the GPLv2 | ||
8 | * | ||
9 | * This exports a 'system' bus type. | ||
10 | * By default, a 'sys' bus gets added to the root of the system. There will | ||
11 | * always be core system devices. Devices can use sysdev_register() to | ||
12 | * add themselves as children of the system bus. | ||
13 | */ | ||
14 | |||
15 | #include <linux/sysdev.h> | ||
16 | #include <linux/err.h> | ||
17 | #include <linux/module.h> | ||
18 | #include <linux/kernel.h> | ||
19 | #include <linux/init.h> | ||
20 | #include <linux/string.h> | ||
21 | #include <linux/pm.h> | ||
22 | #include <linux/device.h> | ||
23 | #include <linux/mutex.h> | ||
24 | #include <linux/interrupt.h> | ||
25 | |||
26 | #include "base.h" | ||
27 | |||
28 | #define to_sysdev(k) container_of(k, struct sys_device, kobj) | ||
29 | #define to_sysdev_attr(a) container_of(a, struct sysdev_attribute, attr) | ||
30 | |||
31 | |||
32 | static ssize_t | ||
33 | sysdev_show(struct kobject *kobj, struct attribute *attr, char *buffer) | ||
34 | { | ||
35 | struct sys_device *sysdev = to_sysdev(kobj); | ||
36 | struct sysdev_attribute *sysdev_attr = to_sysdev_attr(attr); | ||
37 | |||
38 | if (sysdev_attr->show) | ||
39 | return sysdev_attr->show(sysdev, sysdev_attr, buffer); | ||
40 | return -EIO; | ||
41 | } | ||
42 | |||
43 | |||
44 | static ssize_t | ||
45 | sysdev_store(struct kobject *kobj, struct attribute *attr, | ||
46 | const char *buffer, size_t count) | ||
47 | { | ||
48 | struct sys_device *sysdev = to_sysdev(kobj); | ||
49 | struct sysdev_attribute *sysdev_attr = to_sysdev_attr(attr); | ||
50 | |||
51 | if (sysdev_attr->store) | ||
52 | return sysdev_attr->store(sysdev, sysdev_attr, buffer, count); | ||
53 | return -EIO; | ||
54 | } | ||
55 | |||
56 | static const struct sysfs_ops sysfs_ops = { | ||
57 | .show = sysdev_show, | ||
58 | .store = sysdev_store, | ||
59 | }; | ||
60 | |||
61 | static struct kobj_type ktype_sysdev = { | ||
62 | .sysfs_ops = &sysfs_ops, | ||
63 | }; | ||
64 | |||
65 | |||
66 | int sysdev_create_file(struct sys_device *s, struct sysdev_attribute *a) | ||
67 | { | ||
68 | return sysfs_create_file(&s->kobj, &a->attr); | ||
69 | } | ||
70 | |||
71 | |||
72 | void sysdev_remove_file(struct sys_device *s, struct sysdev_attribute *a) | ||
73 | { | ||
74 | sysfs_remove_file(&s->kobj, &a->attr); | ||
75 | } | ||
76 | |||
77 | EXPORT_SYMBOL_GPL(sysdev_create_file); | ||
78 | EXPORT_SYMBOL_GPL(sysdev_remove_file); | ||
79 | |||
80 | #define to_sysdev_class(k) container_of(k, struct sysdev_class, kset.kobj) | ||
81 | #define to_sysdev_class_attr(a) container_of(a, \ | ||
82 | struct sysdev_class_attribute, attr) | ||
83 | |||
84 | static ssize_t sysdev_class_show(struct kobject *kobj, struct attribute *attr, | ||
85 | char *buffer) | ||
86 | { | ||
87 | struct sysdev_class *class = to_sysdev_class(kobj); | ||
88 | struct sysdev_class_attribute *class_attr = to_sysdev_class_attr(attr); | ||
89 | |||
90 | if (class_attr->show) | ||
91 | return class_attr->show(class, class_attr, buffer); | ||
92 | return -EIO; | ||
93 | } | ||
94 | |||
95 | static ssize_t sysdev_class_store(struct kobject *kobj, struct attribute *attr, | ||
96 | const char *buffer, size_t count) | ||
97 | { | ||
98 | struct sysdev_class *class = to_sysdev_class(kobj); | ||
99 | struct sysdev_class_attribute *class_attr = to_sysdev_class_attr(attr); | ||
100 | |||
101 | if (class_attr->store) | ||
102 | return class_attr->store(class, class_attr, buffer, count); | ||
103 | return -EIO; | ||
104 | } | ||
105 | |||
106 | static const struct sysfs_ops sysfs_class_ops = { | ||
107 | .show = sysdev_class_show, | ||
108 | .store = sysdev_class_store, | ||
109 | }; | ||
110 | |||
111 | static struct kobj_type ktype_sysdev_class = { | ||
112 | .sysfs_ops = &sysfs_class_ops, | ||
113 | }; | ||
114 | |||
115 | int sysdev_class_create_file(struct sysdev_class *c, | ||
116 | struct sysdev_class_attribute *a) | ||
117 | { | ||
118 | return sysfs_create_file(&c->kset.kobj, &a->attr); | ||
119 | } | ||
120 | EXPORT_SYMBOL_GPL(sysdev_class_create_file); | ||
121 | |||
122 | void sysdev_class_remove_file(struct sysdev_class *c, | ||
123 | struct sysdev_class_attribute *a) | ||
124 | { | ||
125 | sysfs_remove_file(&c->kset.kobj, &a->attr); | ||
126 | } | ||
127 | EXPORT_SYMBOL_GPL(sysdev_class_remove_file); | ||
128 | |||
129 | extern struct kset *system_kset; | ||
130 | |||
131 | int sysdev_class_register(struct sysdev_class *cls) | ||
132 | { | ||
133 | int retval; | ||
134 | |||
135 | pr_debug("Registering sysdev class '%s'\n", cls->name); | ||
136 | |||
137 | INIT_LIST_HEAD(&cls->drivers); | ||
138 | memset(&cls->kset.kobj, 0x00, sizeof(struct kobject)); | ||
139 | cls->kset.kobj.parent = &system_kset->kobj; | ||
140 | cls->kset.kobj.ktype = &ktype_sysdev_class; | ||
141 | cls->kset.kobj.kset = system_kset; | ||
142 | |||
143 | retval = kobject_set_name(&cls->kset.kobj, "%s", cls->name); | ||
144 | if (retval) | ||
145 | return retval; | ||
146 | |||
147 | retval = kset_register(&cls->kset); | ||
148 | if (!retval && cls->attrs) | ||
149 | retval = sysfs_create_files(&cls->kset.kobj, | ||
150 | (const struct attribute **)cls->attrs); | ||
151 | return retval; | ||
152 | } | ||
153 | |||
154 | void sysdev_class_unregister(struct sysdev_class *cls) | ||
155 | { | ||
156 | pr_debug("Unregistering sysdev class '%s'\n", | ||
157 | kobject_name(&cls->kset.kobj)); | ||
158 | if (cls->attrs) | ||
159 | sysfs_remove_files(&cls->kset.kobj, | ||
160 | (const struct attribute **)cls->attrs); | ||
161 | kset_unregister(&cls->kset); | ||
162 | } | ||
163 | |||
164 | EXPORT_SYMBOL_GPL(sysdev_class_register); | ||
165 | EXPORT_SYMBOL_GPL(sysdev_class_unregister); | ||
166 | |||
167 | static DEFINE_MUTEX(sysdev_drivers_lock); | ||
168 | |||
169 | /* | ||
170 | * @dev != NULL means that we're unwinding because some drv->add() | ||
171 | * failed for some reason. You need to grab sysdev_drivers_lock before | ||
172 | * calling this. | ||
173 | */ | ||
174 | static void __sysdev_driver_remove(struct sysdev_class *cls, | ||
175 | struct sysdev_driver *drv, | ||
176 | struct sys_device *from_dev) | ||
177 | { | ||
178 | struct sys_device *dev = from_dev; | ||
179 | |||
180 | list_del_init(&drv->entry); | ||
181 | if (!cls) | ||
182 | return; | ||
183 | |||
184 | if (!drv->remove) | ||
185 | goto kset_put; | ||
186 | |||
187 | if (dev) | ||
188 | list_for_each_entry_continue_reverse(dev, &cls->kset.list, | ||
189 | kobj.entry) | ||
190 | drv->remove(dev); | ||
191 | else | ||
192 | list_for_each_entry(dev, &cls->kset.list, kobj.entry) | ||
193 | drv->remove(dev); | ||
194 | |||
195 | kset_put: | ||
196 | kset_put(&cls->kset); | ||
197 | } | ||
198 | |||
199 | /** | ||
200 | * sysdev_driver_register - Register auxiliary driver | ||
201 | * @cls: Device class driver belongs to. | ||
202 | * @drv: Driver. | ||
203 | * | ||
204 | * @drv is inserted into @cls->drivers to be | ||
205 | * called on each operation on devices of that class. The refcount | ||
206 | * of @cls is incremented. | ||
207 | */ | ||
208 | int sysdev_driver_register(struct sysdev_class *cls, struct sysdev_driver *drv) | ||
209 | { | ||
210 | struct sys_device *dev = NULL; | ||
211 | int err = 0; | ||
212 | |||
213 | if (!cls) { | ||
214 | WARN(1, KERN_WARNING "sysdev: invalid class passed to %s!\n", | ||
215 | __func__); | ||
216 | return -EINVAL; | ||
217 | } | ||
218 | |||
219 | /* Check whether this driver has already been added to a class. */ | ||
220 | if (drv->entry.next && !list_empty(&drv->entry)) | ||
221 | WARN(1, KERN_WARNING "sysdev: class %s: driver (%p) has already" | ||
222 | " been registered to a class, something is wrong, but " | ||
223 | "will forge on!\n", cls->name, drv); | ||
224 | |||
225 | mutex_lock(&sysdev_drivers_lock); | ||
226 | if (cls && kset_get(&cls->kset)) { | ||
227 | list_add_tail(&drv->entry, &cls->drivers); | ||
228 | |||
229 | /* If devices of this class already exist, tell the driver */ | ||
230 | if (drv->add) { | ||
231 | list_for_each_entry(dev, &cls->kset.list, kobj.entry) { | ||
232 | err = drv->add(dev); | ||
233 | if (err) | ||
234 | goto unwind; | ||
235 | } | ||
236 | } | ||
237 | } else { | ||
238 | err = -EINVAL; | ||
239 | WARN(1, KERN_ERR "%s: invalid device class\n", __func__); | ||
240 | } | ||
241 | |||
242 | goto unlock; | ||
243 | |||
244 | unwind: | ||
245 | __sysdev_driver_remove(cls, drv, dev); | ||
246 | |||
247 | unlock: | ||
248 | mutex_unlock(&sysdev_drivers_lock); | ||
249 | return err; | ||
250 | } | ||
251 | |||
252 | /** | ||
253 | * sysdev_driver_unregister - Remove an auxiliary driver. | ||
254 | * @cls: Class driver belongs to. | ||
255 | * @drv: Driver. | ||
256 | */ | ||
257 | void sysdev_driver_unregister(struct sysdev_class *cls, | ||
258 | struct sysdev_driver *drv) | ||
259 | { | ||
260 | mutex_lock(&sysdev_drivers_lock); | ||
261 | __sysdev_driver_remove(cls, drv, NULL); | ||
262 | mutex_unlock(&sysdev_drivers_lock); | ||
263 | } | ||
264 | EXPORT_SYMBOL_GPL(sysdev_driver_register); | ||
265 | EXPORT_SYMBOL_GPL(sysdev_driver_unregister); | ||
266 | |||
267 | /** | ||
268 | * sysdev_register - add a system device to the tree | ||
269 | * @sysdev: device in question | ||
270 | * | ||
271 | */ | ||
272 | int sysdev_register(struct sys_device *sysdev) | ||
273 | { | ||
274 | int error; | ||
275 | struct sysdev_class *cls = sysdev->cls; | ||
276 | |||
277 | if (!cls) | ||
278 | return -EINVAL; | ||
279 | |||
280 | pr_debug("Registering sys device of class '%s'\n", | ||
281 | kobject_name(&cls->kset.kobj)); | ||
282 | |||
283 | /* initialize the kobject to 0, in case it had previously been used */ | ||
284 | memset(&sysdev->kobj, 0x00, sizeof(struct kobject)); | ||
285 | |||
286 | /* Make sure the kset is set */ | ||
287 | sysdev->kobj.kset = &cls->kset; | ||
288 | |||
289 | /* Register the object */ | ||
290 | error = kobject_init_and_add(&sysdev->kobj, &ktype_sysdev, NULL, | ||
291 | "%s%d", kobject_name(&cls->kset.kobj), | ||
292 | sysdev->id); | ||
293 | |||
294 | if (!error) { | ||
295 | struct sysdev_driver *drv; | ||
296 | |||
297 | pr_debug("Registering sys device '%s'\n", | ||
298 | kobject_name(&sysdev->kobj)); | ||
299 | |||
300 | mutex_lock(&sysdev_drivers_lock); | ||
301 | /* Generic notification is implicit, because it's that | ||
302 | * code that should have called us. | ||
303 | */ | ||
304 | |||
305 | /* Notify class auxiliary drivers */ | ||
306 | list_for_each_entry(drv, &cls->drivers, entry) { | ||
307 | if (drv->add) | ||
308 | drv->add(sysdev); | ||
309 | } | ||
310 | mutex_unlock(&sysdev_drivers_lock); | ||
311 | kobject_uevent(&sysdev->kobj, KOBJ_ADD); | ||
312 | } | ||
313 | |||
314 | return error; | ||
315 | } | ||
316 | |||
317 | void sysdev_unregister(struct sys_device *sysdev) | ||
318 | { | ||
319 | struct sysdev_driver *drv; | ||
320 | |||
321 | mutex_lock(&sysdev_drivers_lock); | ||
322 | list_for_each_entry(drv, &sysdev->cls->drivers, entry) { | ||
323 | if (drv->remove) | ||
324 | drv->remove(sysdev); | ||
325 | } | ||
326 | mutex_unlock(&sysdev_drivers_lock); | ||
327 | |||
328 | kobject_put(&sysdev->kobj); | ||
329 | } | ||
330 | |||
331 | EXPORT_SYMBOL_GPL(sysdev_register); | ||
332 | EXPORT_SYMBOL_GPL(sysdev_unregister); | ||
333 | |||
334 | #define to_ext_attr(x) container_of(x, struct sysdev_ext_attribute, attr) | ||
335 | |||
336 | ssize_t sysdev_store_ulong(struct sys_device *sysdev, | ||
337 | struct sysdev_attribute *attr, | ||
338 | const char *buf, size_t size) | ||
339 | { | ||
340 | struct sysdev_ext_attribute *ea = to_ext_attr(attr); | ||
341 | char *end; | ||
342 | unsigned long new = simple_strtoul(buf, &end, 0); | ||
343 | if (end == buf) | ||
344 | return -EINVAL; | ||
345 | *(unsigned long *)(ea->var) = new; | ||
346 | /* Always return full write size even if we didn't consume all */ | ||
347 | return size; | ||
348 | } | ||
349 | EXPORT_SYMBOL_GPL(sysdev_store_ulong); | ||
350 | |||
351 | ssize_t sysdev_show_ulong(struct sys_device *sysdev, | ||
352 | struct sysdev_attribute *attr, | ||
353 | char *buf) | ||
354 | { | ||
355 | struct sysdev_ext_attribute *ea = to_ext_attr(attr); | ||
356 | return snprintf(buf, PAGE_SIZE, "%lx\n", *(unsigned long *)(ea->var)); | ||
357 | } | ||
358 | EXPORT_SYMBOL_GPL(sysdev_show_ulong); | ||
359 | |||
360 | ssize_t sysdev_store_int(struct sys_device *sysdev, | ||
361 | struct sysdev_attribute *attr, | ||
362 | const char *buf, size_t size) | ||
363 | { | ||
364 | struct sysdev_ext_attribute *ea = to_ext_attr(attr); | ||
365 | char *end; | ||
366 | long new = simple_strtol(buf, &end, 0); | ||
367 | if (end == buf || new > INT_MAX || new < INT_MIN) | ||
368 | return -EINVAL; | ||
369 | *(int *)(ea->var) = new; | ||
370 | /* Always return full write size even if we didn't consume all */ | ||
371 | return size; | ||
372 | } | ||
373 | EXPORT_SYMBOL_GPL(sysdev_store_int); | ||
374 | |||
375 | ssize_t sysdev_show_int(struct sys_device *sysdev, | ||
376 | struct sysdev_attribute *attr, | ||
377 | char *buf) | ||
378 | { | ||
379 | struct sysdev_ext_attribute *ea = to_ext_attr(attr); | ||
380 | return snprintf(buf, PAGE_SIZE, "%d\n", *(int *)(ea->var)); | ||
381 | } | ||
382 | EXPORT_SYMBOL_GPL(sysdev_show_int); | ||
383 | |||
diff --git a/drivers/char/agp/backend.c b/drivers/char/agp/backend.c index 4b71647782d0..317c28ce8328 100644 --- a/drivers/char/agp/backend.c +++ b/drivers/char/agp/backend.c | |||
@@ -194,10 +194,10 @@ static int agp_backend_initialize(struct agp_bridge_data *bridge) | |||
194 | 194 | ||
195 | err_out: | 195 | err_out: |
196 | if (bridge->driver->needs_scratch_page) { | 196 | if (bridge->driver->needs_scratch_page) { |
197 | void *va = page_address(bridge->scratch_page_page); | 197 | struct page *page = bridge->scratch_page_page; |
198 | 198 | ||
199 | bridge->driver->agp_destroy_page(va, AGP_PAGE_DESTROY_UNMAP); | 199 | bridge->driver->agp_destroy_page(page, AGP_PAGE_DESTROY_UNMAP); |
200 | bridge->driver->agp_destroy_page(va, AGP_PAGE_DESTROY_FREE); | 200 | bridge->driver->agp_destroy_page(page, AGP_PAGE_DESTROY_FREE); |
201 | } | 201 | } |
202 | if (got_gatt) | 202 | if (got_gatt) |
203 | bridge->driver->free_gatt_table(bridge); | 203 | bridge->driver->free_gatt_table(bridge); |
@@ -221,10 +221,10 @@ static void agp_backend_cleanup(struct agp_bridge_data *bridge) | |||
221 | 221 | ||
222 | if (bridge->driver->agp_destroy_page && | 222 | if (bridge->driver->agp_destroy_page && |
223 | bridge->driver->needs_scratch_page) { | 223 | bridge->driver->needs_scratch_page) { |
224 | void *va = page_address(bridge->scratch_page_page); | 224 | struct page *page = bridge->scratch_page_page; |
225 | 225 | ||
226 | bridge->driver->agp_destroy_page(va, AGP_PAGE_DESTROY_UNMAP); | 226 | bridge->driver->agp_destroy_page(page, AGP_PAGE_DESTROY_UNMAP); |
227 | bridge->driver->agp_destroy_page(va, AGP_PAGE_DESTROY_FREE); | 227 | bridge->driver->agp_destroy_page(page, AGP_PAGE_DESTROY_FREE); |
228 | } | 228 | } |
229 | } | 229 | } |
230 | 230 | ||
diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c index 0b0562979171..f49bd6f47a50 100644 --- a/drivers/gpio/gpio-omap.c +++ b/drivers/gpio/gpio-omap.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <linux/io.h> | 21 | #include <linux/io.h> |
22 | #include <linux/slab.h> | 22 | #include <linux/slab.h> |
23 | #include <linux/pm_runtime.h> | 23 | #include <linux/pm_runtime.h> |
24 | #include <linux/pm.h> | ||
24 | 25 | ||
25 | #include <mach/hardware.h> | 26 | #include <mach/hardware.h> |
26 | #include <asm/irq.h> | 27 | #include <asm/irq.h> |
@@ -28,19 +29,36 @@ | |||
28 | #include <asm/gpio.h> | 29 | #include <asm/gpio.h> |
29 | #include <asm/mach/irq.h> | 30 | #include <asm/mach/irq.h> |
30 | 31 | ||
32 | #define OFF_MODE 1 | ||
33 | |||
34 | static LIST_HEAD(omap_gpio_list); | ||
35 | |||
36 | struct gpio_regs { | ||
37 | u32 irqenable1; | ||
38 | u32 irqenable2; | ||
39 | u32 wake_en; | ||
40 | u32 ctrl; | ||
41 | u32 oe; | ||
42 | u32 leveldetect0; | ||
43 | u32 leveldetect1; | ||
44 | u32 risingdetect; | ||
45 | u32 fallingdetect; | ||
46 | u32 dataout; | ||
47 | u32 debounce; | ||
48 | u32 debounce_en; | ||
49 | }; | ||
50 | |||
31 | struct gpio_bank { | 51 | struct gpio_bank { |
52 | struct list_head node; | ||
32 | unsigned long pbase; | 53 | unsigned long pbase; |
33 | void __iomem *base; | 54 | void __iomem *base; |
34 | u16 irq; | 55 | u16 irq; |
35 | u16 virtual_irq_start; | 56 | u16 virtual_irq_start; |
36 | int method; | ||
37 | u32 suspend_wakeup; | 57 | u32 suspend_wakeup; |
38 | #if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2PLUS) | ||
39 | u32 saved_wakeup; | 58 | u32 saved_wakeup; |
40 | #endif | ||
41 | u32 non_wakeup_gpios; | 59 | u32 non_wakeup_gpios; |
42 | u32 enabled_non_wakeup_gpios; | 60 | u32 enabled_non_wakeup_gpios; |
43 | 61 | struct gpio_regs context; | |
44 | u32 saved_datain; | 62 | u32 saved_datain; |
45 | u32 saved_fallingdetect; | 63 | u32 saved_fallingdetect; |
46 | u32 saved_risingdetect; | 64 | u32 saved_risingdetect; |
@@ -51,44 +69,27 @@ struct gpio_bank { | |||
51 | struct clk *dbck; | 69 | struct clk *dbck; |
52 | u32 mod_usage; | 70 | u32 mod_usage; |
53 | u32 dbck_enable_mask; | 71 | u32 dbck_enable_mask; |
72 | bool dbck_enabled; | ||
54 | struct device *dev; | 73 | struct device *dev; |
74 | bool is_mpuio; | ||
55 | bool dbck_flag; | 75 | bool dbck_flag; |
76 | bool loses_context; | ||
56 | int stride; | 77 | int stride; |
57 | u32 width; | 78 | u32 width; |
79 | int context_loss_count; | ||
80 | u16 id; | ||
81 | int power_mode; | ||
82 | bool workaround_enabled; | ||
58 | 83 | ||
59 | void (*set_dataout)(struct gpio_bank *bank, int gpio, int enable); | 84 | void (*set_dataout)(struct gpio_bank *bank, int gpio, int enable); |
85 | int (*get_context_loss_count)(struct device *dev); | ||
60 | 86 | ||
61 | struct omap_gpio_reg_offs *regs; | 87 | struct omap_gpio_reg_offs *regs; |
62 | }; | 88 | }; |
63 | 89 | ||
64 | #ifdef CONFIG_ARCH_OMAP3 | ||
65 | struct omap3_gpio_regs { | ||
66 | u32 irqenable1; | ||
67 | u32 irqenable2; | ||
68 | u32 wake_en; | ||
69 | u32 ctrl; | ||
70 | u32 oe; | ||
71 | u32 leveldetect0; | ||
72 | u32 leveldetect1; | ||
73 | u32 risingdetect; | ||
74 | u32 fallingdetect; | ||
75 | u32 dataout; | ||
76 | }; | ||
77 | |||
78 | static struct omap3_gpio_regs gpio_context[OMAP34XX_NR_GPIOS]; | ||
79 | #endif | ||
80 | |||
81 | /* | ||
82 | * TODO: Cleanup gpio_bank usage as it is having information | ||
83 | * related to all instances of the device | ||
84 | */ | ||
85 | static struct gpio_bank *gpio_bank; | ||
86 | |||
87 | /* TODO: Analyze removing gpio_bank_count usage from driver code */ | ||
88 | int gpio_bank_count; | ||
89 | |||
90 | #define GPIO_INDEX(bank, gpio) (gpio % bank->width) | 90 | #define GPIO_INDEX(bank, gpio) (gpio % bank->width) |
91 | #define GPIO_BIT(bank, gpio) (1 << GPIO_INDEX(bank, gpio)) | 91 | #define GPIO_BIT(bank, gpio) (1 << GPIO_INDEX(bank, gpio)) |
92 | #define GPIO_MOD_CTRL_BIT BIT(0) | ||
92 | 93 | ||
93 | static void _set_gpio_direction(struct gpio_bank *bank, int gpio, int is_input) | 94 | static void _set_gpio_direction(struct gpio_bank *bank, int gpio, int is_input) |
94 | { | 95 | { |
@@ -102,6 +103,7 @@ static void _set_gpio_direction(struct gpio_bank *bank, int gpio, int is_input) | |||
102 | else | 103 | else |
103 | l &= ~(1 << gpio); | 104 | l &= ~(1 << gpio); |
104 | __raw_writel(l, reg); | 105 | __raw_writel(l, reg); |
106 | bank->context.oe = l; | ||
105 | } | 107 | } |
106 | 108 | ||
107 | 109 | ||
@@ -132,6 +134,7 @@ static void _set_gpio_dataout_mask(struct gpio_bank *bank, int gpio, int enable) | |||
132 | else | 134 | else |
133 | l &= ~gpio_bit; | 135 | l &= ~gpio_bit; |
134 | __raw_writel(l, reg); | 136 | __raw_writel(l, reg); |
137 | bank->context.dataout = l; | ||
135 | } | 138 | } |
136 | 139 | ||
137 | static int _get_gpio_datain(struct gpio_bank *bank, int gpio) | 140 | static int _get_gpio_datain(struct gpio_bank *bank, int gpio) |
@@ -160,6 +163,22 @@ static inline void _gpio_rmw(void __iomem *base, u32 reg, u32 mask, bool set) | |||
160 | __raw_writel(l, base + reg); | 163 | __raw_writel(l, base + reg); |
161 | } | 164 | } |
162 | 165 | ||
166 | static inline void _gpio_dbck_enable(struct gpio_bank *bank) | ||
167 | { | ||
168 | if (bank->dbck_enable_mask && !bank->dbck_enabled) { | ||
169 | clk_enable(bank->dbck); | ||
170 | bank->dbck_enabled = true; | ||
171 | } | ||
172 | } | ||
173 | |||
174 | static inline void _gpio_dbck_disable(struct gpio_bank *bank) | ||
175 | { | ||
176 | if (bank->dbck_enable_mask && bank->dbck_enabled) { | ||
177 | clk_disable(bank->dbck); | ||
178 | bank->dbck_enabled = false; | ||
179 | } | ||
180 | } | ||
181 | |||
163 | /** | 182 | /** |
164 | * _set_gpio_debounce - low level gpio debounce time | 183 | * _set_gpio_debounce - low level gpio debounce time |
165 | * @bank: the gpio bank we're acting upon | 184 | * @bank: the gpio bank we're acting upon |
@@ -188,70 +207,74 @@ static void _set_gpio_debounce(struct gpio_bank *bank, unsigned gpio, | |||
188 | 207 | ||
189 | l = GPIO_BIT(bank, gpio); | 208 | l = GPIO_BIT(bank, gpio); |
190 | 209 | ||
210 | clk_enable(bank->dbck); | ||
191 | reg = bank->base + bank->regs->debounce; | 211 | reg = bank->base + bank->regs->debounce; |
192 | __raw_writel(debounce, reg); | 212 | __raw_writel(debounce, reg); |
193 | 213 | ||
194 | reg = bank->base + bank->regs->debounce_en; | 214 | reg = bank->base + bank->regs->debounce_en; |
195 | val = __raw_readl(reg); | 215 | val = __raw_readl(reg); |
196 | 216 | ||
197 | if (debounce) { | 217 | if (debounce) |
198 | val |= l; | 218 | val |= l; |
199 | clk_enable(bank->dbck); | 219 | else |
200 | } else { | ||
201 | val &= ~l; | 220 | val &= ~l; |
202 | clk_disable(bank->dbck); | ||
203 | } | ||
204 | bank->dbck_enable_mask = val; | 221 | bank->dbck_enable_mask = val; |
205 | 222 | ||
206 | __raw_writel(val, reg); | 223 | __raw_writel(val, reg); |
224 | clk_disable(bank->dbck); | ||
225 | /* | ||
226 | * Enable debounce clock per module. | ||
227 | * This call is mandatory because in omap_gpio_request() when | ||
228 | * *_runtime_get_sync() is called, _gpio_dbck_enable() within | ||
229 | * runtime callbck fails to turn on dbck because dbck_enable_mask | ||
230 | * used within _gpio_dbck_enable() is still not initialized at | ||
231 | * that point. Therefore we have to enable dbck here. | ||
232 | */ | ||
233 | _gpio_dbck_enable(bank); | ||
234 | if (bank->dbck_enable_mask) { | ||
235 | bank->context.debounce = debounce; | ||
236 | bank->context.debounce_en = val; | ||
237 | } | ||
207 | } | 238 | } |
208 | 239 | ||
209 | #ifdef CONFIG_ARCH_OMAP2PLUS | 240 | static inline void set_gpio_trigger(struct gpio_bank *bank, int gpio, |
210 | static inline void set_24xx_gpio_triggering(struct gpio_bank *bank, int gpio, | ||
211 | int trigger) | 241 | int trigger) |
212 | { | 242 | { |
213 | void __iomem *base = bank->base; | 243 | void __iomem *base = bank->base; |
214 | u32 gpio_bit = 1 << gpio; | 244 | u32 gpio_bit = 1 << gpio; |
215 | 245 | ||
216 | if (cpu_is_omap44xx()) { | 246 | _gpio_rmw(base, bank->regs->leveldetect0, gpio_bit, |
217 | _gpio_rmw(base, OMAP4_GPIO_LEVELDETECT0, gpio_bit, | 247 | trigger & IRQ_TYPE_LEVEL_LOW); |
218 | trigger & IRQ_TYPE_LEVEL_LOW); | 248 | _gpio_rmw(base, bank->regs->leveldetect1, gpio_bit, |
219 | _gpio_rmw(base, OMAP4_GPIO_LEVELDETECT1, gpio_bit, | 249 | trigger & IRQ_TYPE_LEVEL_HIGH); |
220 | trigger & IRQ_TYPE_LEVEL_HIGH); | 250 | _gpio_rmw(base, bank->regs->risingdetect, gpio_bit, |
221 | _gpio_rmw(base, OMAP4_GPIO_RISINGDETECT, gpio_bit, | 251 | trigger & IRQ_TYPE_EDGE_RISING); |
222 | trigger & IRQ_TYPE_EDGE_RISING); | 252 | _gpio_rmw(base, bank->regs->fallingdetect, gpio_bit, |
223 | _gpio_rmw(base, OMAP4_GPIO_FALLINGDETECT, gpio_bit, | 253 | trigger & IRQ_TYPE_EDGE_FALLING); |
224 | trigger & IRQ_TYPE_EDGE_FALLING); | 254 | |
225 | } else { | 255 | bank->context.leveldetect0 = |
226 | _gpio_rmw(base, OMAP24XX_GPIO_LEVELDETECT0, gpio_bit, | 256 | __raw_readl(bank->base + bank->regs->leveldetect0); |
227 | trigger & IRQ_TYPE_LEVEL_LOW); | 257 | bank->context.leveldetect1 = |
228 | _gpio_rmw(base, OMAP24XX_GPIO_LEVELDETECT1, gpio_bit, | 258 | __raw_readl(bank->base + bank->regs->leveldetect1); |
229 | trigger & IRQ_TYPE_LEVEL_HIGH); | 259 | bank->context.risingdetect = |
230 | _gpio_rmw(base, OMAP24XX_GPIO_RISINGDETECT, gpio_bit, | 260 | __raw_readl(bank->base + bank->regs->risingdetect); |
231 | trigger & IRQ_TYPE_EDGE_RISING); | 261 | bank->context.fallingdetect = |
232 | _gpio_rmw(base, OMAP24XX_GPIO_FALLINGDETECT, gpio_bit, | 262 | __raw_readl(bank->base + bank->regs->fallingdetect); |
233 | trigger & IRQ_TYPE_EDGE_FALLING); | 263 | |
234 | } | ||
235 | if (likely(!(bank->non_wakeup_gpios & gpio_bit))) { | 264 | if (likely(!(bank->non_wakeup_gpios & gpio_bit))) { |
236 | if (cpu_is_omap44xx()) { | 265 | _gpio_rmw(base, bank->regs->wkup_en, gpio_bit, trigger != 0); |
237 | _gpio_rmw(base, OMAP4_GPIO_IRQWAKEN0, gpio_bit, | 266 | bank->context.wake_en = |
238 | trigger != 0); | 267 | __raw_readl(bank->base + bank->regs->wkup_en); |
239 | } else { | ||
240 | /* | ||
241 | * GPIO wakeup request can only be generated on edge | ||
242 | * transitions | ||
243 | */ | ||
244 | if (trigger & IRQ_TYPE_EDGE_BOTH) | ||
245 | __raw_writel(1 << gpio, bank->base | ||
246 | + OMAP24XX_GPIO_SETWKUENA); | ||
247 | else | ||
248 | __raw_writel(1 << gpio, bank->base | ||
249 | + OMAP24XX_GPIO_CLEARWKUENA); | ||
250 | } | ||
251 | } | 268 | } |
269 | |||
252 | /* This part needs to be executed always for OMAP{34xx, 44xx} */ | 270 | /* This part needs to be executed always for OMAP{34xx, 44xx} */ |
253 | if (cpu_is_omap34xx() || cpu_is_omap44xx() || | 271 | if (!bank->regs->irqctrl) { |
254 | (bank->non_wakeup_gpios & gpio_bit)) { | 272 | /* On omap24xx proceed only when valid GPIO bit is set */ |
273 | if (bank->non_wakeup_gpios) { | ||
274 | if (!(bank->non_wakeup_gpios & gpio_bit)) | ||
275 | goto exit; | ||
276 | } | ||
277 | |||
255 | /* | 278 | /* |
256 | * Log the edge gpio and manually trigger the IRQ | 279 | * Log the edge gpio and manually trigger the IRQ |
257 | * after resume if the input level changes | 280 | * after resume if the input level changes |
@@ -264,17 +287,11 @@ static inline void set_24xx_gpio_triggering(struct gpio_bank *bank, int gpio, | |||
264 | bank->enabled_non_wakeup_gpios &= ~gpio_bit; | 287 | bank->enabled_non_wakeup_gpios &= ~gpio_bit; |
265 | } | 288 | } |
266 | 289 | ||
267 | if (cpu_is_omap44xx()) { | 290 | exit: |
268 | bank->level_mask = | 291 | bank->level_mask = |
269 | __raw_readl(bank->base + OMAP4_GPIO_LEVELDETECT0) | | 292 | __raw_readl(bank->base + bank->regs->leveldetect0) | |
270 | __raw_readl(bank->base + OMAP4_GPIO_LEVELDETECT1); | 293 | __raw_readl(bank->base + bank->regs->leveldetect1); |
271 | } else { | ||
272 | bank->level_mask = | ||
273 | __raw_readl(bank->base + OMAP24XX_GPIO_LEVELDETECT0) | | ||
274 | __raw_readl(bank->base + OMAP24XX_GPIO_LEVELDETECT1); | ||
275 | } | ||
276 | } | 294 | } |
277 | #endif | ||
278 | 295 | ||
279 | #ifdef CONFIG_ARCH_OMAP1 | 296 | #ifdef CONFIG_ARCH_OMAP1 |
280 | /* | 297 | /* |
@@ -286,23 +303,10 @@ static void _toggle_gpio_edge_triggering(struct gpio_bank *bank, int gpio) | |||
286 | void __iomem *reg = bank->base; | 303 | void __iomem *reg = bank->base; |
287 | u32 l = 0; | 304 | u32 l = 0; |
288 | 305 | ||
289 | switch (bank->method) { | 306 | if (!bank->regs->irqctrl) |
290 | case METHOD_MPUIO: | ||
291 | reg += OMAP_MPUIO_GPIO_INT_EDGE / bank->stride; | ||
292 | break; | ||
293 | #ifdef CONFIG_ARCH_OMAP15XX | ||
294 | case METHOD_GPIO_1510: | ||
295 | reg += OMAP1510_GPIO_INT_CONTROL; | ||
296 | break; | ||
297 | #endif | ||
298 | #if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) | ||
299 | case METHOD_GPIO_7XX: | ||
300 | reg += OMAP7XX_GPIO_INT_CONTROL; | ||
301 | break; | ||
302 | #endif | ||
303 | default: | ||
304 | return; | 307 | return; |
305 | } | 308 | |
309 | reg += bank->regs->irqctrl; | ||
306 | 310 | ||
307 | l = __raw_readl(reg); | 311 | l = __raw_readl(reg); |
308 | if ((l >> gpio) & 1) | 312 | if ((l >> gpio) & 1) |
@@ -312,31 +316,21 @@ static void _toggle_gpio_edge_triggering(struct gpio_bank *bank, int gpio) | |||
312 | 316 | ||
313 | __raw_writel(l, reg); | 317 | __raw_writel(l, reg); |
314 | } | 318 | } |
319 | #else | ||
320 | static void _toggle_gpio_edge_triggering(struct gpio_bank *bank, int gpio) {} | ||
315 | #endif | 321 | #endif |
316 | 322 | ||
317 | static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger) | 323 | static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger) |
318 | { | 324 | { |
319 | void __iomem *reg = bank->base; | 325 | void __iomem *reg = bank->base; |
326 | void __iomem *base = bank->base; | ||
320 | u32 l = 0; | 327 | u32 l = 0; |
321 | 328 | ||
322 | switch (bank->method) { | 329 | if (bank->regs->leveldetect0 && bank->regs->wkup_en) { |
323 | #ifdef CONFIG_ARCH_OMAP1 | 330 | set_gpio_trigger(bank, gpio, trigger); |
324 | case METHOD_MPUIO: | 331 | } else if (bank->regs->irqctrl) { |
325 | reg += OMAP_MPUIO_GPIO_INT_EDGE / bank->stride; | 332 | reg += bank->regs->irqctrl; |
326 | l = __raw_readl(reg); | 333 | |
327 | if ((trigger & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_BOTH) | ||
328 | bank->toggle_mask |= 1 << gpio; | ||
329 | if (trigger & IRQ_TYPE_EDGE_RISING) | ||
330 | l |= 1 << gpio; | ||
331 | else if (trigger & IRQ_TYPE_EDGE_FALLING) | ||
332 | l &= ~(1 << gpio); | ||
333 | else | ||
334 | goto bad; | ||
335 | break; | ||
336 | #endif | ||
337 | #ifdef CONFIG_ARCH_OMAP15XX | ||
338 | case METHOD_GPIO_1510: | ||
339 | reg += OMAP1510_GPIO_INT_CONTROL; | ||
340 | l = __raw_readl(reg); | 334 | l = __raw_readl(reg); |
341 | if ((trigger & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_BOTH) | 335 | if ((trigger & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_BOTH) |
342 | bank->toggle_mask |= 1 << gpio; | 336 | bank->toggle_mask |= 1 << gpio; |
@@ -345,15 +339,15 @@ static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger) | |||
345 | else if (trigger & IRQ_TYPE_EDGE_FALLING) | 339 | else if (trigger & IRQ_TYPE_EDGE_FALLING) |
346 | l &= ~(1 << gpio); | 340 | l &= ~(1 << gpio); |
347 | else | 341 | else |
348 | goto bad; | 342 | return -EINVAL; |
349 | break; | 343 | |
350 | #endif | 344 | __raw_writel(l, reg); |
351 | #ifdef CONFIG_ARCH_OMAP16XX | 345 | } else if (bank->regs->edgectrl1) { |
352 | case METHOD_GPIO_1610: | ||
353 | if (gpio & 0x08) | 346 | if (gpio & 0x08) |
354 | reg += OMAP1610_GPIO_EDGE_CTRL2; | 347 | reg += bank->regs->edgectrl2; |
355 | else | 348 | else |
356 | reg += OMAP1610_GPIO_EDGE_CTRL1; | 349 | reg += bank->regs->edgectrl1; |
350 | |||
357 | gpio &= 0x07; | 351 | gpio &= 0x07; |
358 | l = __raw_readl(reg); | 352 | l = __raw_readl(reg); |
359 | l &= ~(3 << (gpio << 1)); | 353 | l &= ~(3 << (gpio << 1)); |
@@ -361,40 +355,14 @@ static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger) | |||
361 | l |= 2 << (gpio << 1); | 355 | l |= 2 << (gpio << 1); |
362 | if (trigger & IRQ_TYPE_EDGE_FALLING) | 356 | if (trigger & IRQ_TYPE_EDGE_FALLING) |
363 | l |= 1 << (gpio << 1); | 357 | l |= 1 << (gpio << 1); |
364 | if (trigger) | 358 | |
365 | /* Enable wake-up during idle for dynamic tick */ | 359 | /* Enable wake-up during idle for dynamic tick */ |
366 | __raw_writel(1 << gpio, bank->base + OMAP1610_GPIO_SET_WAKEUPENA); | 360 | _gpio_rmw(base, bank->regs->wkup_en, 1 << gpio, trigger); |
367 | else | 361 | bank->context.wake_en = |
368 | __raw_writel(1 << gpio, bank->base + OMAP1610_GPIO_CLEAR_WAKEUPENA); | 362 | __raw_readl(bank->base + bank->regs->wkup_en); |
369 | break; | 363 | __raw_writel(l, reg); |
370 | #endif | ||
371 | #if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) | ||
372 | case METHOD_GPIO_7XX: | ||
373 | reg += OMAP7XX_GPIO_INT_CONTROL; | ||
374 | l = __raw_readl(reg); | ||
375 | if ((trigger & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_BOTH) | ||
376 | bank->toggle_mask |= 1 << gpio; | ||
377 | if (trigger & IRQ_TYPE_EDGE_RISING) | ||
378 | l |= 1 << gpio; | ||
379 | else if (trigger & IRQ_TYPE_EDGE_FALLING) | ||
380 | l &= ~(1 << gpio); | ||
381 | else | ||
382 | goto bad; | ||
383 | break; | ||
384 | #endif | ||
385 | #ifdef CONFIG_ARCH_OMAP2PLUS | ||
386 | case METHOD_GPIO_24XX: | ||
387 | case METHOD_GPIO_44XX: | ||
388 | set_24xx_gpio_triggering(bank, gpio, trigger); | ||
389 | return 0; | ||
390 | #endif | ||
391 | default: | ||
392 | goto bad; | ||
393 | } | 364 | } |
394 | __raw_writel(l, reg); | ||
395 | return 0; | 365 | return 0; |
396 | bad: | ||
397 | return -EINVAL; | ||
398 | } | 366 | } |
399 | 367 | ||
400 | static int gpio_irq_type(struct irq_data *d, unsigned type) | 368 | static int gpio_irq_type(struct irq_data *d, unsigned type) |
@@ -412,12 +380,12 @@ static int gpio_irq_type(struct irq_data *d, unsigned type) | |||
412 | if (type & ~IRQ_TYPE_SENSE_MASK) | 380 | if (type & ~IRQ_TYPE_SENSE_MASK) |
413 | return -EINVAL; | 381 | return -EINVAL; |
414 | 382 | ||
415 | /* OMAP1 allows only only edge triggering */ | 383 | bank = irq_data_get_irq_chip_data(d); |
416 | if (!cpu_class_is_omap2() | 384 | |
417 | && (type & (IRQ_TYPE_LEVEL_LOW|IRQ_TYPE_LEVEL_HIGH))) | 385 | if (!bank->regs->leveldetect0 && |
386 | (type & (IRQ_TYPE_LEVEL_LOW|IRQ_TYPE_LEVEL_HIGH))) | ||
418 | return -EINVAL; | 387 | return -EINVAL; |
419 | 388 | ||
420 | bank = irq_data_get_irq_chip_data(d); | ||
421 | spin_lock_irqsave(&bank->lock, flags); | 389 | spin_lock_irqsave(&bank->lock, flags); |
422 | retval = _set_gpio_triggering(bank, GPIO_INDEX(bank, gpio), type); | 390 | retval = _set_gpio_triggering(bank, GPIO_INDEX(bank, gpio), type); |
423 | spin_unlock_irqrestore(&bank->lock, flags); | 391 | spin_unlock_irqrestore(&bank->lock, flags); |
@@ -484,6 +452,7 @@ static void _enable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask) | |||
484 | } | 452 | } |
485 | 453 | ||
486 | __raw_writel(l, reg); | 454 | __raw_writel(l, reg); |
455 | bank->context.irqenable1 = l; | ||
487 | } | 456 | } |
488 | 457 | ||
489 | static void _disable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask) | 458 | static void _disable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask) |
@@ -504,6 +473,7 @@ static void _disable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask) | |||
504 | } | 473 | } |
505 | 474 | ||
506 | __raw_writel(l, reg); | 475 | __raw_writel(l, reg); |
476 | bank->context.irqenable1 = l; | ||
507 | } | 477 | } |
508 | 478 | ||
509 | static inline void _set_gpio_irqenable(struct gpio_bank *bank, int gpio, int enable) | 479 | static inline void _set_gpio_irqenable(struct gpio_bank *bank, int gpio, int enable) |
@@ -567,38 +537,39 @@ static int omap_gpio_request(struct gpio_chip *chip, unsigned offset) | |||
567 | struct gpio_bank *bank = container_of(chip, struct gpio_bank, chip); | 537 | struct gpio_bank *bank = container_of(chip, struct gpio_bank, chip); |
568 | unsigned long flags; | 538 | unsigned long flags; |
569 | 539 | ||
570 | spin_lock_irqsave(&bank->lock, flags); | 540 | /* |
541 | * If this is the first gpio_request for the bank, | ||
542 | * enable the bank module. | ||
543 | */ | ||
544 | if (!bank->mod_usage) | ||
545 | pm_runtime_get_sync(bank->dev); | ||
571 | 546 | ||
547 | spin_lock_irqsave(&bank->lock, flags); | ||
572 | /* Set trigger to none. You need to enable the desired trigger with | 548 | /* Set trigger to none. You need to enable the desired trigger with |
573 | * request_irq() or set_irq_type(). | 549 | * request_irq() or set_irq_type(). |
574 | */ | 550 | */ |
575 | _set_gpio_triggering(bank, offset, IRQ_TYPE_NONE); | 551 | _set_gpio_triggering(bank, offset, IRQ_TYPE_NONE); |
576 | 552 | ||
577 | #ifdef CONFIG_ARCH_OMAP15XX | 553 | if (bank->regs->pinctrl) { |
578 | if (bank->method == METHOD_GPIO_1510) { | 554 | void __iomem *reg = bank->base + bank->regs->pinctrl; |
579 | void __iomem *reg; | ||
580 | 555 | ||
581 | /* Claim the pin for MPU */ | 556 | /* Claim the pin for MPU */ |
582 | reg = bank->base + OMAP1510_GPIO_PIN_CONTROL; | ||
583 | __raw_writel(__raw_readl(reg) | (1 << offset), reg); | 557 | __raw_writel(__raw_readl(reg) | (1 << offset), reg); |
584 | } | 558 | } |
585 | #endif | 559 | |
586 | if (!cpu_class_is_omap1()) { | 560 | if (bank->regs->ctrl && !bank->mod_usage) { |
587 | if (!bank->mod_usage) { | 561 | void __iomem *reg = bank->base + bank->regs->ctrl; |
588 | void __iomem *reg = bank->base; | 562 | u32 ctrl; |
589 | u32 ctrl; | 563 | |
590 | 564 | ctrl = __raw_readl(reg); | |
591 | if (cpu_is_omap24xx() || cpu_is_omap34xx()) | 565 | /* Module is enabled, clocks are not gated */ |
592 | reg += OMAP24XX_GPIO_CTRL; | 566 | ctrl &= ~GPIO_MOD_CTRL_BIT; |
593 | else if (cpu_is_omap44xx()) | 567 | __raw_writel(ctrl, reg); |
594 | reg += OMAP4_GPIO_CTRL; | 568 | bank->context.ctrl = ctrl; |
595 | ctrl = __raw_readl(reg); | ||
596 | /* Module is enabled, clocks are not gated */ | ||
597 | ctrl &= 0xFFFFFFFE; | ||
598 | __raw_writel(ctrl, reg); | ||
599 | } | ||
600 | bank->mod_usage |= 1 << offset; | ||
601 | } | 569 | } |
570 | |||
571 | bank->mod_usage |= 1 << offset; | ||
572 | |||
602 | spin_unlock_irqrestore(&bank->lock, flags); | 573 | spin_unlock_irqrestore(&bank->lock, flags); |
603 | 574 | ||
604 | return 0; | 575 | return 0; |
@@ -607,48 +578,40 @@ static int omap_gpio_request(struct gpio_chip *chip, unsigned offset) | |||
607 | static void omap_gpio_free(struct gpio_chip *chip, unsigned offset) | 578 | static void omap_gpio_free(struct gpio_chip *chip, unsigned offset) |
608 | { | 579 | { |
609 | struct gpio_bank *bank = container_of(chip, struct gpio_bank, chip); | 580 | struct gpio_bank *bank = container_of(chip, struct gpio_bank, chip); |
581 | void __iomem *base = bank->base; | ||
610 | unsigned long flags; | 582 | unsigned long flags; |
611 | 583 | ||
612 | spin_lock_irqsave(&bank->lock, flags); | 584 | spin_lock_irqsave(&bank->lock, flags); |
613 | #ifdef CONFIG_ARCH_OMAP16XX | 585 | |
614 | if (bank->method == METHOD_GPIO_1610) { | 586 | if (bank->regs->wkup_en) { |
615 | /* Disable wake-up during idle for dynamic tick */ | ||
616 | void __iomem *reg = bank->base + OMAP1610_GPIO_CLEAR_WAKEUPENA; | ||
617 | __raw_writel(1 << offset, reg); | ||
618 | } | ||
619 | #endif | ||
620 | #if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) | ||
621 | if (bank->method == METHOD_GPIO_24XX) { | ||
622 | /* Disable wake-up during idle for dynamic tick */ | ||
623 | void __iomem *reg = bank->base + OMAP24XX_GPIO_CLEARWKUENA; | ||
624 | __raw_writel(1 << offset, reg); | ||
625 | } | ||
626 | #endif | ||
627 | #ifdef CONFIG_ARCH_OMAP4 | ||
628 | if (bank->method == METHOD_GPIO_44XX) { | ||
629 | /* Disable wake-up during idle for dynamic tick */ | 587 | /* Disable wake-up during idle for dynamic tick */ |
630 | void __iomem *reg = bank->base + OMAP4_GPIO_IRQWAKEN0; | 588 | _gpio_rmw(base, bank->regs->wkup_en, 1 << offset, 0); |
631 | __raw_writel(1 << offset, reg); | 589 | bank->context.wake_en = |
590 | __raw_readl(bank->base + bank->regs->wkup_en); | ||
632 | } | 591 | } |
633 | #endif | 592 | |
634 | if (!cpu_class_is_omap1()) { | 593 | bank->mod_usage &= ~(1 << offset); |
635 | bank->mod_usage &= ~(1 << offset); | 594 | |
636 | if (!bank->mod_usage) { | 595 | if (bank->regs->ctrl && !bank->mod_usage) { |
637 | void __iomem *reg = bank->base; | 596 | void __iomem *reg = bank->base + bank->regs->ctrl; |
638 | u32 ctrl; | 597 | u32 ctrl; |
639 | 598 | ||
640 | if (cpu_is_omap24xx() || cpu_is_omap34xx()) | 599 | ctrl = __raw_readl(reg); |
641 | reg += OMAP24XX_GPIO_CTRL; | 600 | /* Module is disabled, clocks are gated */ |
642 | else if (cpu_is_omap44xx()) | 601 | ctrl |= GPIO_MOD_CTRL_BIT; |
643 | reg += OMAP4_GPIO_CTRL; | 602 | __raw_writel(ctrl, reg); |
644 | ctrl = __raw_readl(reg); | 603 | bank->context.ctrl = ctrl; |
645 | /* Module is disabled, clocks are gated */ | ||
646 | ctrl |= 1; | ||
647 | __raw_writel(ctrl, reg); | ||
648 | } | ||
649 | } | 604 | } |
605 | |||
650 | _reset_gpio(bank, bank->chip.base + offset); | 606 | _reset_gpio(bank, bank->chip.base + offset); |
651 | spin_unlock_irqrestore(&bank->lock, flags); | 607 | spin_unlock_irqrestore(&bank->lock, flags); |
608 | |||
609 | /* | ||
610 | * If this is the last gpio to be freed in the bank, | ||
611 | * disable the bank module. | ||
612 | */ | ||
613 | if (!bank->mod_usage) | ||
614 | pm_runtime_put(bank->dev); | ||
652 | } | 615 | } |
653 | 616 | ||
654 | /* | 617 | /* |
@@ -674,6 +637,7 @@ static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc) | |||
674 | 637 | ||
675 | bank = irq_get_handler_data(irq); | 638 | bank = irq_get_handler_data(irq); |
676 | isr_reg = bank->base + bank->regs->irqstatus; | 639 | isr_reg = bank->base + bank->regs->irqstatus; |
640 | pm_runtime_get_sync(bank->dev); | ||
677 | 641 | ||
678 | if (WARN_ON(!isr_reg)) | 642 | if (WARN_ON(!isr_reg)) |
679 | goto exit; | 643 | goto exit; |
@@ -685,12 +649,8 @@ static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc) | |||
685 | enabled = _get_gpio_irqbank_mask(bank); | 649 | enabled = _get_gpio_irqbank_mask(bank); |
686 | isr_saved = isr = __raw_readl(isr_reg) & enabled; | 650 | isr_saved = isr = __raw_readl(isr_reg) & enabled; |
687 | 651 | ||
688 | if (cpu_is_omap15xx() && (bank->method == METHOD_MPUIO)) | 652 | if (bank->level_mask) |
689 | isr &= 0x0000ffff; | ||
690 | |||
691 | if (cpu_class_is_omap2()) { | ||
692 | level_mask = bank->level_mask & enabled; | 653 | level_mask = bank->level_mask & enabled; |
693 | } | ||
694 | 654 | ||
695 | /* clear edge sensitive interrupts before handler(s) are | 655 | /* clear edge sensitive interrupts before handler(s) are |
696 | called so that we don't miss any interrupt occurred while | 656 | called so that we don't miss any interrupt occurred while |
@@ -718,7 +678,6 @@ static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc) | |||
718 | if (!(isr & 1)) | 678 | if (!(isr & 1)) |
719 | continue; | 679 | continue; |
720 | 680 | ||
721 | #ifdef CONFIG_ARCH_OMAP1 | ||
722 | /* | 681 | /* |
723 | * Some chips can't respond to both rising and falling | 682 | * Some chips can't respond to both rising and falling |
724 | * at the same time. If this irq was requested with | 683 | * at the same time. If this irq was requested with |
@@ -728,7 +687,6 @@ static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc) | |||
728 | */ | 687 | */ |
729 | if (bank->toggle_mask & (1 << gpio_index)) | 688 | if (bank->toggle_mask & (1 << gpio_index)) |
730 | _toggle_gpio_edge_triggering(bank, gpio_index); | 689 | _toggle_gpio_edge_triggering(bank, gpio_index); |
731 | #endif | ||
732 | 690 | ||
733 | generic_handle_irq(gpio_irq); | 691 | generic_handle_irq(gpio_irq); |
734 | } | 692 | } |
@@ -740,6 +698,7 @@ static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc) | |||
740 | exit: | 698 | exit: |
741 | if (!unmasked) | 699 | if (!unmasked) |
742 | chained_irq_exit(chip, desc); | 700 | chained_irq_exit(chip, desc); |
701 | pm_runtime_put(bank->dev); | ||
743 | } | 702 | } |
744 | 703 | ||
745 | static void gpio_irq_shutdown(struct irq_data *d) | 704 | static void gpio_irq_shutdown(struct irq_data *d) |
@@ -808,14 +767,6 @@ static struct irq_chip gpio_irq_chip = { | |||
808 | 767 | ||
809 | /*---------------------------------------------------------------------*/ | 768 | /*---------------------------------------------------------------------*/ |
810 | 769 | ||
811 | #ifdef CONFIG_ARCH_OMAP1 | ||
812 | |||
813 | #define bank_is_mpuio(bank) ((bank)->method == METHOD_MPUIO) | ||
814 | |||
815 | #ifdef CONFIG_ARCH_OMAP16XX | ||
816 | |||
817 | #include <linux/platform_device.h> | ||
818 | |||
819 | static int omap_mpuio_suspend_noirq(struct device *dev) | 770 | static int omap_mpuio_suspend_noirq(struct device *dev) |
820 | { | 771 | { |
821 | struct platform_device *pdev = to_platform_device(dev); | 772 | struct platform_device *pdev = to_platform_device(dev); |
@@ -869,32 +820,16 @@ static struct platform_device omap_mpuio_device = { | |||
869 | /* could list the /proc/iomem resources */ | 820 | /* could list the /proc/iomem resources */ |
870 | }; | 821 | }; |
871 | 822 | ||
872 | static inline void mpuio_init(void) | 823 | static inline void mpuio_init(struct gpio_bank *bank) |
873 | { | 824 | { |
874 | struct gpio_bank *bank = &gpio_bank[0]; | ||
875 | platform_set_drvdata(&omap_mpuio_device, bank); | 825 | platform_set_drvdata(&omap_mpuio_device, bank); |
876 | 826 | ||
877 | if (platform_driver_register(&omap_mpuio_driver) == 0) | 827 | if (platform_driver_register(&omap_mpuio_driver) == 0) |
878 | (void) platform_device_register(&omap_mpuio_device); | 828 | (void) platform_device_register(&omap_mpuio_device); |
879 | } | 829 | } |
880 | 830 | ||
881 | #else | ||
882 | static inline void mpuio_init(void) {} | ||
883 | #endif /* 16xx */ | ||
884 | |||
885 | #else | ||
886 | |||
887 | #define bank_is_mpuio(bank) 0 | ||
888 | static inline void mpuio_init(void) {} | ||
889 | |||
890 | #endif | ||
891 | |||
892 | /*---------------------------------------------------------------------*/ | 831 | /*---------------------------------------------------------------------*/ |
893 | 832 | ||
894 | /* REVISIT these are stupid implementations! replace by ones that | ||
895 | * don't switch on METHOD_* and which mostly avoid spinlocks | ||
896 | */ | ||
897 | |||
898 | static int gpio_input(struct gpio_chip *chip, unsigned offset) | 833 | static int gpio_input(struct gpio_chip *chip, unsigned offset) |
899 | { | 834 | { |
900 | struct gpio_bank *bank; | 835 | struct gpio_bank *bank; |
@@ -1007,78 +942,32 @@ static void __init omap_gpio_show_rev(struct gpio_bank *bank) | |||
1007 | */ | 942 | */ |
1008 | static struct lock_class_key gpio_lock_class; | 943 | static struct lock_class_key gpio_lock_class; |
1009 | 944 | ||
1010 | static inline int init_gpio_info(struct platform_device *pdev) | 945 | static void omap_gpio_mod_init(struct gpio_bank *bank) |
1011 | { | 946 | { |
1012 | /* TODO: Analyze removing gpio_bank_count usage from driver code */ | 947 | void __iomem *base = bank->base; |
1013 | gpio_bank = kzalloc(gpio_bank_count * sizeof(struct gpio_bank), | 948 | u32 l = 0xffffffff; |
1014 | GFP_KERNEL); | ||
1015 | if (!gpio_bank) { | ||
1016 | dev_err(&pdev->dev, "Memory alloc failed for gpio_bank\n"); | ||
1017 | return -ENOMEM; | ||
1018 | } | ||
1019 | return 0; | ||
1020 | } | ||
1021 | 949 | ||
1022 | /* TODO: Cleanup cpu_is_* checks */ | 950 | if (bank->width == 16) |
1023 | static void omap_gpio_mod_init(struct gpio_bank *bank, int id) | 951 | l = 0xffff; |
1024 | { | ||
1025 | if (cpu_class_is_omap2()) { | ||
1026 | if (cpu_is_omap44xx()) { | ||
1027 | __raw_writel(0xffffffff, bank->base + | ||
1028 | OMAP4_GPIO_IRQSTATUSCLR0); | ||
1029 | __raw_writel(0x00000000, bank->base + | ||
1030 | OMAP4_GPIO_DEBOUNCENABLE); | ||
1031 | /* Initialize interface clk ungated, module enabled */ | ||
1032 | __raw_writel(0, bank->base + OMAP4_GPIO_CTRL); | ||
1033 | } else if (cpu_is_omap34xx()) { | ||
1034 | __raw_writel(0x00000000, bank->base + | ||
1035 | OMAP24XX_GPIO_IRQENABLE1); | ||
1036 | __raw_writel(0xffffffff, bank->base + | ||
1037 | OMAP24XX_GPIO_IRQSTATUS1); | ||
1038 | __raw_writel(0x00000000, bank->base + | ||
1039 | OMAP24XX_GPIO_DEBOUNCE_EN); | ||
1040 | |||
1041 | /* Initialize interface clk ungated, module enabled */ | ||
1042 | __raw_writel(0, bank->base + OMAP24XX_GPIO_CTRL); | ||
1043 | } else if (cpu_is_omap24xx()) { | ||
1044 | static const u32 non_wakeup_gpios[] = { | ||
1045 | 0xe203ffc0, 0x08700040 | ||
1046 | }; | ||
1047 | if (id < ARRAY_SIZE(non_wakeup_gpios)) | ||
1048 | bank->non_wakeup_gpios = non_wakeup_gpios[id]; | ||
1049 | } | ||
1050 | } else if (cpu_class_is_omap1()) { | ||
1051 | if (bank_is_mpuio(bank)) | ||
1052 | __raw_writew(0xffff, bank->base + | ||
1053 | OMAP_MPUIO_GPIO_MASKIT / bank->stride); | ||
1054 | if (cpu_is_omap15xx() && bank->method == METHOD_GPIO_1510) { | ||
1055 | __raw_writew(0xffff, bank->base | ||
1056 | + OMAP1510_GPIO_INT_MASK); | ||
1057 | __raw_writew(0x0000, bank->base | ||
1058 | + OMAP1510_GPIO_INT_STATUS); | ||
1059 | } | ||
1060 | if (cpu_is_omap16xx() && bank->method == METHOD_GPIO_1610) { | ||
1061 | __raw_writew(0x0000, bank->base | ||
1062 | + OMAP1610_GPIO_IRQENABLE1); | ||
1063 | __raw_writew(0xffff, bank->base | ||
1064 | + OMAP1610_GPIO_IRQSTATUS1); | ||
1065 | __raw_writew(0x0014, bank->base | ||
1066 | + OMAP1610_GPIO_SYSCONFIG); | ||
1067 | 952 | ||
1068 | /* | 953 | if (bank->is_mpuio) { |
1069 | * Enable system clock for GPIO module. | 954 | __raw_writel(l, bank->base + bank->regs->irqenable); |
1070 | * The CAM_CLK_CTRL *is* really the right place. | 955 | return; |
1071 | */ | ||
1072 | omap_writel(omap_readl(ULPD_CAM_CLK_CTRL) | 0x04, | ||
1073 | ULPD_CAM_CLK_CTRL); | ||
1074 | } | ||
1075 | if (cpu_is_omap7xx() && bank->method == METHOD_GPIO_7XX) { | ||
1076 | __raw_writel(0xffffffff, bank->base | ||
1077 | + OMAP7XX_GPIO_INT_MASK); | ||
1078 | __raw_writel(0x00000000, bank->base | ||
1079 | + OMAP7XX_GPIO_INT_STATUS); | ||
1080 | } | ||
1081 | } | 956 | } |
957 | |||
958 | _gpio_rmw(base, bank->regs->irqenable, l, bank->regs->irqenable_inv); | ||
959 | _gpio_rmw(base, bank->regs->irqstatus, l, | ||
960 | bank->regs->irqenable_inv == false); | ||
961 | _gpio_rmw(base, bank->regs->irqenable, l, bank->regs->debounce_en != 0); | ||
962 | _gpio_rmw(base, bank->regs->irqenable, l, bank->regs->ctrl != 0); | ||
963 | if (bank->regs->debounce_en) | ||
964 | _gpio_rmw(base, bank->regs->debounce_en, 0, 1); | ||
965 | |||
966 | /* Save OE default value (0xffffffff) in the context */ | ||
967 | bank->context.oe = __raw_readl(bank->base + bank->regs->direction); | ||
968 | /* Initialize interface clk ungated, module enabled */ | ||
969 | if (bank->regs->ctrl) | ||
970 | _gpio_rmw(base, bank->regs->ctrl, 0, 1); | ||
1082 | } | 971 | } |
1083 | 972 | ||
1084 | static __init void | 973 | static __init void |
@@ -1101,8 +990,8 @@ omap_mpuio_alloc_gc(struct gpio_bank *bank, unsigned int irq_start, | |||
1101 | ct->chip.irq_mask = irq_gc_mask_set_bit; | 990 | ct->chip.irq_mask = irq_gc_mask_set_bit; |
1102 | ct->chip.irq_unmask = irq_gc_mask_clr_bit; | 991 | ct->chip.irq_unmask = irq_gc_mask_clr_bit; |
1103 | ct->chip.irq_set_type = gpio_irq_type; | 992 | ct->chip.irq_set_type = gpio_irq_type; |
1104 | /* REVISIT: assuming only 16xx supports MPUIO wake events */ | 993 | |
1105 | if (cpu_is_omap16xx()) | 994 | if (bank->regs->wkup_en) |
1106 | ct->chip.irq_set_wake = gpio_wake_enable, | 995 | ct->chip.irq_set_wake = gpio_wake_enable, |
1107 | 996 | ||
1108 | ct->regs.mask = OMAP_MPUIO_GPIO_INT / bank->stride; | 997 | ct->regs.mask = OMAP_MPUIO_GPIO_INT / bank->stride; |
@@ -1115,7 +1004,6 @@ static void __devinit omap_gpio_chip_init(struct gpio_bank *bank) | |||
1115 | int j; | 1004 | int j; |
1116 | static int gpio; | 1005 | static int gpio; |
1117 | 1006 | ||
1118 | bank->mod_usage = 0; | ||
1119 | /* | 1007 | /* |
1120 | * REVISIT eventually switch from OMAP-specific gpio structs | 1008 | * REVISIT eventually switch from OMAP-specific gpio structs |
1121 | * over to the generic ones | 1009 | * over to the generic ones |
@@ -1128,11 +1016,10 @@ static void __devinit omap_gpio_chip_init(struct gpio_bank *bank) | |||
1128 | bank->chip.set_debounce = gpio_debounce; | 1016 | bank->chip.set_debounce = gpio_debounce; |
1129 | bank->chip.set = gpio_set; | 1017 | bank->chip.set = gpio_set; |
1130 | bank->chip.to_irq = gpio_2irq; | 1018 | bank->chip.to_irq = gpio_2irq; |
1131 | if (bank_is_mpuio(bank)) { | 1019 | if (bank->is_mpuio) { |
1132 | bank->chip.label = "mpuio"; | 1020 | bank->chip.label = "mpuio"; |
1133 | #ifdef CONFIG_ARCH_OMAP16XX | 1021 | if (bank->regs->wkup_en) |
1134 | bank->chip.dev = &omap_mpuio_device.dev; | 1022 | bank->chip.dev = &omap_mpuio_device.dev; |
1135 | #endif | ||
1136 | bank->chip.base = OMAP_MPUIO(0); | 1023 | bank->chip.base = OMAP_MPUIO(0); |
1137 | } else { | 1024 | } else { |
1138 | bank->chip.label = "gpio"; | 1025 | bank->chip.label = "gpio"; |
@@ -1147,7 +1034,7 @@ static void __devinit omap_gpio_chip_init(struct gpio_bank *bank) | |||
1147 | j < bank->virtual_irq_start + bank->width; j++) { | 1034 | j < bank->virtual_irq_start + bank->width; j++) { |
1148 | irq_set_lockdep_class(j, &gpio_lock_class); | 1035 | irq_set_lockdep_class(j, &gpio_lock_class); |
1149 | irq_set_chip_data(j, bank); | 1036 | irq_set_chip_data(j, bank); |
1150 | if (bank_is_mpuio(bank)) { | 1037 | if (bank->is_mpuio) { |
1151 | omap_mpuio_alloc_gc(bank, j, bank->width); | 1038 | omap_mpuio_alloc_gc(bank, j, bank->width); |
1152 | } else { | 1039 | } else { |
1153 | irq_set_chip(j, &gpio_irq_chip); | 1040 | irq_set_chip(j, &gpio_irq_chip); |
@@ -1161,42 +1048,44 @@ static void __devinit omap_gpio_chip_init(struct gpio_bank *bank) | |||
1161 | 1048 | ||
1162 | static int __devinit omap_gpio_probe(struct platform_device *pdev) | 1049 | static int __devinit omap_gpio_probe(struct platform_device *pdev) |
1163 | { | 1050 | { |
1164 | static int gpio_init_done; | ||
1165 | struct omap_gpio_platform_data *pdata; | 1051 | struct omap_gpio_platform_data *pdata; |
1166 | struct resource *res; | 1052 | struct resource *res; |
1167 | int id; | ||
1168 | struct gpio_bank *bank; | 1053 | struct gpio_bank *bank; |
1054 | int ret = 0; | ||
1169 | 1055 | ||
1170 | if (!pdev->dev.platform_data) | 1056 | if (!pdev->dev.platform_data) { |
1171 | return -EINVAL; | 1057 | ret = -EINVAL; |
1172 | 1058 | goto err_exit; | |
1173 | pdata = pdev->dev.platform_data; | ||
1174 | |||
1175 | if (!gpio_init_done) { | ||
1176 | int ret; | ||
1177 | |||
1178 | ret = init_gpio_info(pdev); | ||
1179 | if (ret) | ||
1180 | return ret; | ||
1181 | } | 1059 | } |
1182 | 1060 | ||
1183 | id = pdev->id; | 1061 | bank = kzalloc(sizeof(struct gpio_bank), GFP_KERNEL); |
1184 | bank = &gpio_bank[id]; | 1062 | if (!bank) { |
1063 | dev_err(&pdev->dev, "Memory alloc failed for gpio_bank\n"); | ||
1064 | ret = -ENOMEM; | ||
1065 | goto err_exit; | ||
1066 | } | ||
1185 | 1067 | ||
1186 | res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); | 1068 | res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); |
1187 | if (unlikely(!res)) { | 1069 | if (unlikely(!res)) { |
1188 | dev_err(&pdev->dev, "GPIO Bank %i Invalid IRQ resource\n", id); | 1070 | dev_err(&pdev->dev, "GPIO Bank %i Invalid IRQ resource\n", |
1189 | return -ENODEV; | 1071 | pdev->id); |
1072 | ret = -ENODEV; | ||
1073 | goto err_free; | ||
1190 | } | 1074 | } |
1191 | 1075 | ||
1192 | bank->irq = res->start; | 1076 | bank->irq = res->start; |
1077 | bank->id = pdev->id; | ||
1078 | |||
1079 | pdata = pdev->dev.platform_data; | ||
1193 | bank->virtual_irq_start = pdata->virtual_irq_start; | 1080 | bank->virtual_irq_start = pdata->virtual_irq_start; |
1194 | bank->method = pdata->bank_type; | ||
1195 | bank->dev = &pdev->dev; | 1081 | bank->dev = &pdev->dev; |
1196 | bank->dbck_flag = pdata->dbck_flag; | 1082 | bank->dbck_flag = pdata->dbck_flag; |
1197 | bank->stride = pdata->bank_stride; | 1083 | bank->stride = pdata->bank_stride; |
1198 | bank->width = pdata->bank_width; | 1084 | bank->width = pdata->bank_width; |
1199 | 1085 | bank->is_mpuio = pdata->is_mpuio; | |
1086 | bank->non_wakeup_gpios = pdata->non_wakeup_gpios; | ||
1087 | bank->loses_context = pdata->loses_context; | ||
1088 | bank->get_context_loss_count = pdata->get_context_loss_count; | ||
1200 | bank->regs = pdata->regs; | 1089 | bank->regs = pdata->regs; |
1201 | 1090 | ||
1202 | if (bank->regs->set_dataout && bank->regs->clr_dataout) | 1091 | if (bank->regs->set_dataout && bank->regs->clr_dataout) |
@@ -1209,369 +1098,310 @@ static int __devinit omap_gpio_probe(struct platform_device *pdev) | |||
1209 | /* Static mapping, never released */ | 1098 | /* Static mapping, never released */ |
1210 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 1099 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
1211 | if (unlikely(!res)) { | 1100 | if (unlikely(!res)) { |
1212 | dev_err(&pdev->dev, "GPIO Bank %i Invalid mem resource\n", id); | 1101 | dev_err(&pdev->dev, "GPIO Bank %i Invalid mem resource\n", |
1213 | return -ENODEV; | 1102 | pdev->id); |
1103 | ret = -ENODEV; | ||
1104 | goto err_free; | ||
1214 | } | 1105 | } |
1215 | 1106 | ||
1216 | bank->base = ioremap(res->start, resource_size(res)); | 1107 | bank->base = ioremap(res->start, resource_size(res)); |
1217 | if (!bank->base) { | 1108 | if (!bank->base) { |
1218 | dev_err(&pdev->dev, "Could not ioremap gpio bank%i\n", id); | 1109 | dev_err(&pdev->dev, "Could not ioremap gpio bank%i\n", |
1219 | return -ENOMEM; | 1110 | pdev->id); |
1111 | ret = -ENOMEM; | ||
1112 | goto err_free; | ||
1220 | } | 1113 | } |
1221 | 1114 | ||
1115 | platform_set_drvdata(pdev, bank); | ||
1116 | |||
1222 | pm_runtime_enable(bank->dev); | 1117 | pm_runtime_enable(bank->dev); |
1118 | pm_runtime_irq_safe(bank->dev); | ||
1223 | pm_runtime_get_sync(bank->dev); | 1119 | pm_runtime_get_sync(bank->dev); |
1224 | 1120 | ||
1225 | omap_gpio_mod_init(bank, id); | 1121 | if (bank->is_mpuio) |
1122 | mpuio_init(bank); | ||
1123 | |||
1124 | omap_gpio_mod_init(bank); | ||
1226 | omap_gpio_chip_init(bank); | 1125 | omap_gpio_chip_init(bank); |
1227 | omap_gpio_show_rev(bank); | 1126 | omap_gpio_show_rev(bank); |
1228 | 1127 | ||
1229 | if (!gpio_init_done) | 1128 | pm_runtime_put(bank->dev); |
1230 | gpio_init_done = 1; | ||
1231 | 1129 | ||
1232 | return 0; | 1130 | list_add_tail(&bank->node, &omap_gpio_list); |
1131 | |||
1132 | return ret; | ||
1133 | |||
1134 | err_free: | ||
1135 | kfree(bank); | ||
1136 | err_exit: | ||
1137 | return ret; | ||
1233 | } | 1138 | } |
1234 | 1139 | ||
1235 | #if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2PLUS) | 1140 | #ifdef CONFIG_ARCH_OMAP2PLUS |
1236 | static int omap_gpio_suspend(void) | 1141 | |
1142 | #if defined(CONFIG_PM_SLEEP) | ||
1143 | static int omap_gpio_suspend(struct device *dev) | ||
1237 | { | 1144 | { |
1238 | int i; | 1145 | struct platform_device *pdev = to_platform_device(dev); |
1146 | struct gpio_bank *bank = platform_get_drvdata(pdev); | ||
1147 | void __iomem *base = bank->base; | ||
1148 | void __iomem *wakeup_enable; | ||
1149 | unsigned long flags; | ||
1239 | 1150 | ||
1240 | if (!cpu_class_is_omap2() && !cpu_is_omap16xx()) | 1151 | if (!bank->mod_usage || !bank->loses_context) |
1241 | return 0; | 1152 | return 0; |
1242 | 1153 | ||
1243 | for (i = 0; i < gpio_bank_count; i++) { | 1154 | if (!bank->regs->wkup_en || !bank->suspend_wakeup) |
1244 | struct gpio_bank *bank = &gpio_bank[i]; | 1155 | return 0; |
1245 | void __iomem *wake_status; | ||
1246 | void __iomem *wake_clear; | ||
1247 | void __iomem *wake_set; | ||
1248 | unsigned long flags; | ||
1249 | |||
1250 | switch (bank->method) { | ||
1251 | #ifdef CONFIG_ARCH_OMAP16XX | ||
1252 | case METHOD_GPIO_1610: | ||
1253 | wake_status = bank->base + OMAP1610_GPIO_WAKEUPENABLE; | ||
1254 | wake_clear = bank->base + OMAP1610_GPIO_CLEAR_WAKEUPENA; | ||
1255 | wake_set = bank->base + OMAP1610_GPIO_SET_WAKEUPENA; | ||
1256 | break; | ||
1257 | #endif | ||
1258 | #if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) | ||
1259 | case METHOD_GPIO_24XX: | ||
1260 | wake_status = bank->base + OMAP24XX_GPIO_WAKE_EN; | ||
1261 | wake_clear = bank->base + OMAP24XX_GPIO_CLEARWKUENA; | ||
1262 | wake_set = bank->base + OMAP24XX_GPIO_SETWKUENA; | ||
1263 | break; | ||
1264 | #endif | ||
1265 | #ifdef CONFIG_ARCH_OMAP4 | ||
1266 | case METHOD_GPIO_44XX: | ||
1267 | wake_status = bank->base + OMAP4_GPIO_IRQWAKEN0; | ||
1268 | wake_clear = bank->base + OMAP4_GPIO_IRQWAKEN0; | ||
1269 | wake_set = bank->base + OMAP4_GPIO_IRQWAKEN0; | ||
1270 | break; | ||
1271 | #endif | ||
1272 | default: | ||
1273 | continue; | ||
1274 | } | ||
1275 | 1156 | ||
1276 | spin_lock_irqsave(&bank->lock, flags); | 1157 | wakeup_enable = bank->base + bank->regs->wkup_en; |
1277 | bank->saved_wakeup = __raw_readl(wake_status); | 1158 | |
1278 | __raw_writel(0xffffffff, wake_clear); | 1159 | spin_lock_irqsave(&bank->lock, flags); |
1279 | __raw_writel(bank->suspend_wakeup, wake_set); | 1160 | bank->saved_wakeup = __raw_readl(wakeup_enable); |
1280 | spin_unlock_irqrestore(&bank->lock, flags); | 1161 | _gpio_rmw(base, bank->regs->wkup_en, 0xffffffff, 0); |
1281 | } | 1162 | _gpio_rmw(base, bank->regs->wkup_en, bank->suspend_wakeup, 1); |
1163 | spin_unlock_irqrestore(&bank->lock, flags); | ||
1282 | 1164 | ||
1283 | return 0; | 1165 | return 0; |
1284 | } | 1166 | } |
1285 | 1167 | ||
1286 | static void omap_gpio_resume(void) | 1168 | static int omap_gpio_resume(struct device *dev) |
1287 | { | 1169 | { |
1288 | int i; | 1170 | struct platform_device *pdev = to_platform_device(dev); |
1171 | struct gpio_bank *bank = platform_get_drvdata(pdev); | ||
1172 | void __iomem *base = bank->base; | ||
1173 | unsigned long flags; | ||
1289 | 1174 | ||
1290 | if (!cpu_class_is_omap2() && !cpu_is_omap16xx()) | 1175 | if (!bank->mod_usage || !bank->loses_context) |
1291 | return; | 1176 | return 0; |
1292 | 1177 | ||
1293 | for (i = 0; i < gpio_bank_count; i++) { | 1178 | if (!bank->regs->wkup_en || !bank->saved_wakeup) |
1294 | struct gpio_bank *bank = &gpio_bank[i]; | 1179 | return 0; |
1295 | void __iomem *wake_clear; | ||
1296 | void __iomem *wake_set; | ||
1297 | unsigned long flags; | ||
1298 | |||
1299 | switch (bank->method) { | ||
1300 | #ifdef CONFIG_ARCH_OMAP16XX | ||
1301 | case METHOD_GPIO_1610: | ||
1302 | wake_clear = bank->base + OMAP1610_GPIO_CLEAR_WAKEUPENA; | ||
1303 | wake_set = bank->base + OMAP1610_GPIO_SET_WAKEUPENA; | ||
1304 | break; | ||
1305 | #endif | ||
1306 | #if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) | ||
1307 | case METHOD_GPIO_24XX: | ||
1308 | wake_clear = bank->base + OMAP24XX_GPIO_CLEARWKUENA; | ||
1309 | wake_set = bank->base + OMAP24XX_GPIO_SETWKUENA; | ||
1310 | break; | ||
1311 | #endif | ||
1312 | #ifdef CONFIG_ARCH_OMAP4 | ||
1313 | case METHOD_GPIO_44XX: | ||
1314 | wake_clear = bank->base + OMAP4_GPIO_IRQWAKEN0; | ||
1315 | wake_set = bank->base + OMAP4_GPIO_IRQWAKEN0; | ||
1316 | break; | ||
1317 | #endif | ||
1318 | default: | ||
1319 | continue; | ||
1320 | } | ||
1321 | 1180 | ||
1322 | spin_lock_irqsave(&bank->lock, flags); | 1181 | spin_lock_irqsave(&bank->lock, flags); |
1323 | __raw_writel(0xffffffff, wake_clear); | 1182 | _gpio_rmw(base, bank->regs->wkup_en, 0xffffffff, 0); |
1324 | __raw_writel(bank->saved_wakeup, wake_set); | 1183 | _gpio_rmw(base, bank->regs->wkup_en, bank->saved_wakeup, 1); |
1325 | spin_unlock_irqrestore(&bank->lock, flags); | 1184 | spin_unlock_irqrestore(&bank->lock, flags); |
1326 | } | ||
1327 | } | ||
1328 | 1185 | ||
1329 | static struct syscore_ops omap_gpio_syscore_ops = { | 1186 | return 0; |
1330 | .suspend = omap_gpio_suspend, | 1187 | } |
1331 | .resume = omap_gpio_resume, | 1188 | #endif /* CONFIG_PM_SLEEP */ |
1332 | }; | ||
1333 | 1189 | ||
1334 | #endif | 1190 | #if defined(CONFIG_PM_RUNTIME) |
1191 | static void omap_gpio_restore_context(struct gpio_bank *bank); | ||
1335 | 1192 | ||
1336 | #ifdef CONFIG_ARCH_OMAP2PLUS | 1193 | static int omap_gpio_runtime_suspend(struct device *dev) |
1194 | { | ||
1195 | struct platform_device *pdev = to_platform_device(dev); | ||
1196 | struct gpio_bank *bank = platform_get_drvdata(pdev); | ||
1197 | u32 l1 = 0, l2 = 0; | ||
1198 | unsigned long flags; | ||
1337 | 1199 | ||
1338 | static int workaround_enabled; | 1200 | spin_lock_irqsave(&bank->lock, flags); |
1201 | if (bank->power_mode != OFF_MODE) { | ||
1202 | bank->power_mode = 0; | ||
1203 | goto update_gpio_context_count; | ||
1204 | } | ||
1205 | /* | ||
1206 | * If going to OFF, remove triggering for all | ||
1207 | * non-wakeup GPIOs. Otherwise spurious IRQs will be | ||
1208 | * generated. See OMAP2420 Errata item 1.101. | ||
1209 | */ | ||
1210 | if (!(bank->enabled_non_wakeup_gpios)) | ||
1211 | goto update_gpio_context_count; | ||
1339 | 1212 | ||
1340 | void omap2_gpio_prepare_for_idle(int off_mode) | 1213 | bank->saved_datain = __raw_readl(bank->base + |
1341 | { | 1214 | bank->regs->datain); |
1342 | int i, c = 0; | 1215 | l1 = __raw_readl(bank->base + bank->regs->fallingdetect); |
1343 | int min = 0; | 1216 | l2 = __raw_readl(bank->base + bank->regs->risingdetect); |
1344 | 1217 | ||
1345 | if (cpu_is_omap34xx()) | 1218 | bank->saved_fallingdetect = l1; |
1346 | min = 1; | 1219 | bank->saved_risingdetect = l2; |
1220 | l1 &= ~bank->enabled_non_wakeup_gpios; | ||
1221 | l2 &= ~bank->enabled_non_wakeup_gpios; | ||
1347 | 1222 | ||
1348 | for (i = min; i < gpio_bank_count; i++) { | 1223 | __raw_writel(l1, bank->base + bank->regs->fallingdetect); |
1349 | struct gpio_bank *bank = &gpio_bank[i]; | 1224 | __raw_writel(l2, bank->base + bank->regs->risingdetect); |
1350 | u32 l1 = 0, l2 = 0; | ||
1351 | int j; | ||
1352 | 1225 | ||
1353 | for (j = 0; j < hweight_long(bank->dbck_enable_mask); j++) | 1226 | bank->workaround_enabled = true; |
1354 | clk_disable(bank->dbck); | ||
1355 | 1227 | ||
1356 | if (!off_mode) | 1228 | update_gpio_context_count: |
1357 | continue; | 1229 | if (bank->get_context_loss_count) |
1230 | bank->context_loss_count = | ||
1231 | bank->get_context_loss_count(bank->dev); | ||
1358 | 1232 | ||
1359 | /* If going to OFF, remove triggering for all | 1233 | _gpio_dbck_disable(bank); |
1360 | * non-wakeup GPIOs. Otherwise spurious IRQs will be | 1234 | spin_unlock_irqrestore(&bank->lock, flags); |
1361 | * generated. See OMAP2420 Errata item 1.101. */ | ||
1362 | if (!(bank->enabled_non_wakeup_gpios)) | ||
1363 | continue; | ||
1364 | 1235 | ||
1365 | if (cpu_is_omap24xx() || cpu_is_omap34xx()) { | 1236 | return 0; |
1366 | bank->saved_datain = __raw_readl(bank->base + | 1237 | } |
1367 | OMAP24XX_GPIO_DATAIN); | ||
1368 | l1 = __raw_readl(bank->base + | ||
1369 | OMAP24XX_GPIO_FALLINGDETECT); | ||
1370 | l2 = __raw_readl(bank->base + | ||
1371 | OMAP24XX_GPIO_RISINGDETECT); | ||
1372 | } | ||
1373 | 1238 | ||
1374 | if (cpu_is_omap44xx()) { | 1239 | static int omap_gpio_runtime_resume(struct device *dev) |
1375 | bank->saved_datain = __raw_readl(bank->base + | 1240 | { |
1376 | OMAP4_GPIO_DATAIN); | 1241 | struct platform_device *pdev = to_platform_device(dev); |
1377 | l1 = __raw_readl(bank->base + | 1242 | struct gpio_bank *bank = platform_get_drvdata(pdev); |
1378 | OMAP4_GPIO_FALLINGDETECT); | 1243 | int context_lost_cnt_after; |
1379 | l2 = __raw_readl(bank->base + | 1244 | u32 l = 0, gen, gen0, gen1; |
1380 | OMAP4_GPIO_RISINGDETECT); | 1245 | unsigned long flags; |
1381 | } | ||
1382 | 1246 | ||
1383 | bank->saved_fallingdetect = l1; | 1247 | spin_lock_irqsave(&bank->lock, flags); |
1384 | bank->saved_risingdetect = l2; | 1248 | _gpio_dbck_enable(bank); |
1385 | l1 &= ~bank->enabled_non_wakeup_gpios; | 1249 | if (!bank->enabled_non_wakeup_gpios || !bank->workaround_enabled) { |
1386 | l2 &= ~bank->enabled_non_wakeup_gpios; | 1250 | spin_unlock_irqrestore(&bank->lock, flags); |
1251 | return 0; | ||
1252 | } | ||
1387 | 1253 | ||
1388 | if (cpu_is_omap24xx() || cpu_is_omap34xx()) { | 1254 | if (bank->get_context_loss_count) { |
1389 | __raw_writel(l1, bank->base + | 1255 | context_lost_cnt_after = |
1390 | OMAP24XX_GPIO_FALLINGDETECT); | 1256 | bank->get_context_loss_count(bank->dev); |
1391 | __raw_writel(l2, bank->base + | 1257 | if (context_lost_cnt_after != bank->context_loss_count || |
1392 | OMAP24XX_GPIO_RISINGDETECT); | 1258 | !context_lost_cnt_after) { |
1259 | omap_gpio_restore_context(bank); | ||
1260 | } else { | ||
1261 | spin_unlock_irqrestore(&bank->lock, flags); | ||
1262 | return 0; | ||
1393 | } | 1263 | } |
1264 | } | ||
1394 | 1265 | ||
1395 | if (cpu_is_omap44xx()) { | 1266 | __raw_writel(bank->saved_fallingdetect, |
1396 | __raw_writel(l1, bank->base + OMAP4_GPIO_FALLINGDETECT); | 1267 | bank->base + bank->regs->fallingdetect); |
1397 | __raw_writel(l2, bank->base + OMAP4_GPIO_RISINGDETECT); | 1268 | __raw_writel(bank->saved_risingdetect, |
1398 | } | 1269 | bank->base + bank->regs->risingdetect); |
1270 | l = __raw_readl(bank->base + bank->regs->datain); | ||
1399 | 1271 | ||
1400 | c++; | 1272 | /* |
1401 | } | 1273 | * Check if any of the non-wakeup interrupt GPIOs have changed |
1402 | if (!c) { | 1274 | * state. If so, generate an IRQ by software. This is |
1403 | workaround_enabled = 0; | 1275 | * horribly racy, but it's the best we can do to work around |
1404 | return; | 1276 | * this silicon bug. |
1405 | } | 1277 | */ |
1406 | workaround_enabled = 1; | 1278 | l ^= bank->saved_datain; |
1407 | } | 1279 | l &= bank->enabled_non_wakeup_gpios; |
1408 | 1280 | ||
1409 | void omap2_gpio_resume_after_idle(void) | 1281 | /* |
1410 | { | 1282 | * No need to generate IRQs for the rising edge for gpio IRQs |
1411 | int i; | 1283 | * configured with falling edge only; and vice versa. |
1412 | int min = 0; | 1284 | */ |
1285 | gen0 = l & bank->saved_fallingdetect; | ||
1286 | gen0 &= bank->saved_datain; | ||
1413 | 1287 | ||
1414 | if (cpu_is_omap34xx()) | 1288 | gen1 = l & bank->saved_risingdetect; |
1415 | min = 1; | 1289 | gen1 &= ~(bank->saved_datain); |
1416 | for (i = min; i < gpio_bank_count; i++) { | ||
1417 | struct gpio_bank *bank = &gpio_bank[i]; | ||
1418 | u32 l = 0, gen, gen0, gen1; | ||
1419 | int j; | ||
1420 | 1290 | ||
1421 | for (j = 0; j < hweight_long(bank->dbck_enable_mask); j++) | 1291 | /* FIXME: Consider GPIO IRQs with level detections properly! */ |
1422 | clk_enable(bank->dbck); | 1292 | gen = l & (~(bank->saved_fallingdetect) & ~(bank->saved_risingdetect)); |
1293 | /* Consider all GPIO IRQs needed to be updated */ | ||
1294 | gen |= gen0 | gen1; | ||
1423 | 1295 | ||
1424 | if (!workaround_enabled) | 1296 | if (gen) { |
1425 | continue; | 1297 | u32 old0, old1; |
1426 | 1298 | ||
1427 | if (!(bank->enabled_non_wakeup_gpios)) | 1299 | old0 = __raw_readl(bank->base + bank->regs->leveldetect0); |
1428 | continue; | 1300 | old1 = __raw_readl(bank->base + bank->regs->leveldetect1); |
1429 | 1301 | ||
1430 | if (cpu_is_omap24xx() || cpu_is_omap34xx()) { | 1302 | if (cpu_is_omap24xx() || cpu_is_omap34xx()) { |
1431 | __raw_writel(bank->saved_fallingdetect, | 1303 | __raw_writel(old0 | gen, bank->base + |
1432 | bank->base + OMAP24XX_GPIO_FALLINGDETECT); | 1304 | bank->regs->leveldetect0); |
1433 | __raw_writel(bank->saved_risingdetect, | 1305 | __raw_writel(old1 | gen, bank->base + |
1434 | bank->base + OMAP24XX_GPIO_RISINGDETECT); | 1306 | bank->regs->leveldetect1); |
1435 | l = __raw_readl(bank->base + OMAP24XX_GPIO_DATAIN); | ||
1436 | } | 1307 | } |
1437 | 1308 | ||
1438 | if (cpu_is_omap44xx()) { | 1309 | if (cpu_is_omap44xx()) { |
1439 | __raw_writel(bank->saved_fallingdetect, | 1310 | __raw_writel(old0 | l, bank->base + |
1440 | bank->base + OMAP4_GPIO_FALLINGDETECT); | 1311 | bank->regs->leveldetect0); |
1441 | __raw_writel(bank->saved_risingdetect, | 1312 | __raw_writel(old1 | l, bank->base + |
1442 | bank->base + OMAP4_GPIO_RISINGDETECT); | 1313 | bank->regs->leveldetect1); |
1443 | l = __raw_readl(bank->base + OMAP4_GPIO_DATAIN); | ||
1444 | } | ||
1445 | |||
1446 | /* Check if any of the non-wakeup interrupt GPIOs have changed | ||
1447 | * state. If so, generate an IRQ by software. This is | ||
1448 | * horribly racy, but it's the best we can do to work around | ||
1449 | * this silicon bug. */ | ||
1450 | l ^= bank->saved_datain; | ||
1451 | l &= bank->enabled_non_wakeup_gpios; | ||
1452 | |||
1453 | /* | ||
1454 | * No need to generate IRQs for the rising edge for gpio IRQs | ||
1455 | * configured with falling edge only; and vice versa. | ||
1456 | */ | ||
1457 | gen0 = l & bank->saved_fallingdetect; | ||
1458 | gen0 &= bank->saved_datain; | ||
1459 | |||
1460 | gen1 = l & bank->saved_risingdetect; | ||
1461 | gen1 &= ~(bank->saved_datain); | ||
1462 | |||
1463 | /* FIXME: Consider GPIO IRQs with level detections properly! */ | ||
1464 | gen = l & (~(bank->saved_fallingdetect) & | ||
1465 | ~(bank->saved_risingdetect)); | ||
1466 | /* Consider all GPIO IRQs needed to be updated */ | ||
1467 | gen |= gen0 | gen1; | ||
1468 | |||
1469 | if (gen) { | ||
1470 | u32 old0, old1; | ||
1471 | |||
1472 | if (cpu_is_omap24xx() || cpu_is_omap34xx()) { | ||
1473 | old0 = __raw_readl(bank->base + | ||
1474 | OMAP24XX_GPIO_LEVELDETECT0); | ||
1475 | old1 = __raw_readl(bank->base + | ||
1476 | OMAP24XX_GPIO_LEVELDETECT1); | ||
1477 | __raw_writel(old0 | gen, bank->base + | ||
1478 | OMAP24XX_GPIO_LEVELDETECT0); | ||
1479 | __raw_writel(old1 | gen, bank->base + | ||
1480 | OMAP24XX_GPIO_LEVELDETECT1); | ||
1481 | __raw_writel(old0, bank->base + | ||
1482 | OMAP24XX_GPIO_LEVELDETECT0); | ||
1483 | __raw_writel(old1, bank->base + | ||
1484 | OMAP24XX_GPIO_LEVELDETECT1); | ||
1485 | } | ||
1486 | |||
1487 | if (cpu_is_omap44xx()) { | ||
1488 | old0 = __raw_readl(bank->base + | ||
1489 | OMAP4_GPIO_LEVELDETECT0); | ||
1490 | old1 = __raw_readl(bank->base + | ||
1491 | OMAP4_GPIO_LEVELDETECT1); | ||
1492 | __raw_writel(old0 | l, bank->base + | ||
1493 | OMAP4_GPIO_LEVELDETECT0); | ||
1494 | __raw_writel(old1 | l, bank->base + | ||
1495 | OMAP4_GPIO_LEVELDETECT1); | ||
1496 | __raw_writel(old0, bank->base + | ||
1497 | OMAP4_GPIO_LEVELDETECT0); | ||
1498 | __raw_writel(old1, bank->base + | ||
1499 | OMAP4_GPIO_LEVELDETECT1); | ||
1500 | } | ||
1501 | } | 1314 | } |
1315 | __raw_writel(old0, bank->base + bank->regs->leveldetect0); | ||
1316 | __raw_writel(old1, bank->base + bank->regs->leveldetect1); | ||
1502 | } | 1317 | } |
1503 | 1318 | ||
1319 | bank->workaround_enabled = false; | ||
1320 | spin_unlock_irqrestore(&bank->lock, flags); | ||
1321 | |||
1322 | return 0; | ||
1504 | } | 1323 | } |
1324 | #endif /* CONFIG_PM_RUNTIME */ | ||
1505 | 1325 | ||
1506 | #endif | 1326 | void omap2_gpio_prepare_for_idle(int pwr_mode) |
1327 | { | ||
1328 | struct gpio_bank *bank; | ||
1329 | |||
1330 | list_for_each_entry(bank, &omap_gpio_list, node) { | ||
1331 | if (!bank->mod_usage || !bank->loses_context) | ||
1332 | continue; | ||
1333 | |||
1334 | bank->power_mode = pwr_mode; | ||
1335 | |||
1336 | pm_runtime_put_sync_suspend(bank->dev); | ||
1337 | } | ||
1338 | } | ||
1507 | 1339 | ||
1508 | #ifdef CONFIG_ARCH_OMAP3 | 1340 | void omap2_gpio_resume_after_idle(void) |
1509 | /* save the registers of bank 2-6 */ | ||
1510 | void omap_gpio_save_context(void) | ||
1511 | { | 1341 | { |
1512 | int i; | 1342 | struct gpio_bank *bank; |
1513 | 1343 | ||
1514 | /* saving banks from 2-6 only since GPIO1 is in WKUP */ | 1344 | list_for_each_entry(bank, &omap_gpio_list, node) { |
1515 | for (i = 1; i < gpio_bank_count; i++) { | 1345 | if (!bank->mod_usage || !bank->loses_context) |
1516 | struct gpio_bank *bank = &gpio_bank[i]; | 1346 | continue; |
1517 | gpio_context[i].irqenable1 = | 1347 | |
1518 | __raw_readl(bank->base + OMAP24XX_GPIO_IRQENABLE1); | 1348 | pm_runtime_get_sync(bank->dev); |
1519 | gpio_context[i].irqenable2 = | ||
1520 | __raw_readl(bank->base + OMAP24XX_GPIO_IRQENABLE2); | ||
1521 | gpio_context[i].wake_en = | ||
1522 | __raw_readl(bank->base + OMAP24XX_GPIO_WAKE_EN); | ||
1523 | gpio_context[i].ctrl = | ||
1524 | __raw_readl(bank->base + OMAP24XX_GPIO_CTRL); | ||
1525 | gpio_context[i].oe = | ||
1526 | __raw_readl(bank->base + OMAP24XX_GPIO_OE); | ||
1527 | gpio_context[i].leveldetect0 = | ||
1528 | __raw_readl(bank->base + OMAP24XX_GPIO_LEVELDETECT0); | ||
1529 | gpio_context[i].leveldetect1 = | ||
1530 | __raw_readl(bank->base + OMAP24XX_GPIO_LEVELDETECT1); | ||
1531 | gpio_context[i].risingdetect = | ||
1532 | __raw_readl(bank->base + OMAP24XX_GPIO_RISINGDETECT); | ||
1533 | gpio_context[i].fallingdetect = | ||
1534 | __raw_readl(bank->base + OMAP24XX_GPIO_FALLINGDETECT); | ||
1535 | gpio_context[i].dataout = | ||
1536 | __raw_readl(bank->base + OMAP24XX_GPIO_DATAOUT); | ||
1537 | } | 1349 | } |
1538 | } | 1350 | } |
1539 | 1351 | ||
1540 | /* restore the required registers of bank 2-6 */ | 1352 | #if defined(CONFIG_PM_RUNTIME) |
1541 | void omap_gpio_restore_context(void) | 1353 | static void omap_gpio_restore_context(struct gpio_bank *bank) |
1542 | { | 1354 | { |
1543 | int i; | 1355 | __raw_writel(bank->context.wake_en, |
1544 | 1356 | bank->base + bank->regs->wkup_en); | |
1545 | for (i = 1; i < gpio_bank_count; i++) { | 1357 | __raw_writel(bank->context.ctrl, bank->base + bank->regs->ctrl); |
1546 | struct gpio_bank *bank = &gpio_bank[i]; | 1358 | __raw_writel(bank->context.leveldetect0, |
1547 | __raw_writel(gpio_context[i].irqenable1, | 1359 | bank->base + bank->regs->leveldetect0); |
1548 | bank->base + OMAP24XX_GPIO_IRQENABLE1); | 1360 | __raw_writel(bank->context.leveldetect1, |
1549 | __raw_writel(gpio_context[i].irqenable2, | 1361 | bank->base + bank->regs->leveldetect1); |
1550 | bank->base + OMAP24XX_GPIO_IRQENABLE2); | 1362 | __raw_writel(bank->context.risingdetect, |
1551 | __raw_writel(gpio_context[i].wake_en, | 1363 | bank->base + bank->regs->risingdetect); |
1552 | bank->base + OMAP24XX_GPIO_WAKE_EN); | 1364 | __raw_writel(bank->context.fallingdetect, |
1553 | __raw_writel(gpio_context[i].ctrl, | 1365 | bank->base + bank->regs->fallingdetect); |
1554 | bank->base + OMAP24XX_GPIO_CTRL); | 1366 | if (bank->regs->set_dataout && bank->regs->clr_dataout) |
1555 | __raw_writel(gpio_context[i].oe, | 1367 | __raw_writel(bank->context.dataout, |
1556 | bank->base + OMAP24XX_GPIO_OE); | 1368 | bank->base + bank->regs->set_dataout); |
1557 | __raw_writel(gpio_context[i].leveldetect0, | 1369 | else |
1558 | bank->base + OMAP24XX_GPIO_LEVELDETECT0); | 1370 | __raw_writel(bank->context.dataout, |
1559 | __raw_writel(gpio_context[i].leveldetect1, | 1371 | bank->base + bank->regs->dataout); |
1560 | bank->base + OMAP24XX_GPIO_LEVELDETECT1); | 1372 | __raw_writel(bank->context.oe, bank->base + bank->regs->direction); |
1561 | __raw_writel(gpio_context[i].risingdetect, | 1373 | |
1562 | bank->base + OMAP24XX_GPIO_RISINGDETECT); | 1374 | if (bank->dbck_enable_mask) { |
1563 | __raw_writel(gpio_context[i].fallingdetect, | 1375 | __raw_writel(bank->context.debounce, bank->base + |
1564 | bank->base + OMAP24XX_GPIO_FALLINGDETECT); | 1376 | bank->regs->debounce); |
1565 | __raw_writel(gpio_context[i].dataout, | 1377 | __raw_writel(bank->context.debounce_en, |
1566 | bank->base + OMAP24XX_GPIO_DATAOUT); | 1378 | bank->base + bank->regs->debounce_en); |
1567 | } | 1379 | } |
1380 | |||
1381 | __raw_writel(bank->context.irqenable1, | ||
1382 | bank->base + bank->regs->irqenable); | ||
1383 | __raw_writel(bank->context.irqenable2, | ||
1384 | bank->base + bank->regs->irqenable2); | ||
1568 | } | 1385 | } |
1386 | #endif /* CONFIG_PM_RUNTIME */ | ||
1387 | #else | ||
1388 | #define omap_gpio_suspend NULL | ||
1389 | #define omap_gpio_resume NULL | ||
1390 | #define omap_gpio_runtime_suspend NULL | ||
1391 | #define omap_gpio_runtime_resume NULL | ||
1569 | #endif | 1392 | #endif |
1570 | 1393 | ||
1394 | static const struct dev_pm_ops gpio_pm_ops = { | ||
1395 | SET_SYSTEM_SLEEP_PM_OPS(omap_gpio_suspend, omap_gpio_resume) | ||
1396 | SET_RUNTIME_PM_OPS(omap_gpio_runtime_suspend, omap_gpio_runtime_resume, | ||
1397 | NULL) | ||
1398 | }; | ||
1399 | |||
1571 | static struct platform_driver omap_gpio_driver = { | 1400 | static struct platform_driver omap_gpio_driver = { |
1572 | .probe = omap_gpio_probe, | 1401 | .probe = omap_gpio_probe, |
1573 | .driver = { | 1402 | .driver = { |
1574 | .name = "omap_gpio", | 1403 | .name = "omap_gpio", |
1404 | .pm = &gpio_pm_ops, | ||
1575 | }, | 1405 | }, |
1576 | }; | 1406 | }; |
1577 | 1407 | ||
@@ -1585,17 +1415,3 @@ static int __init omap_gpio_drv_reg(void) | |||
1585 | return platform_driver_register(&omap_gpio_driver); | 1415 | return platform_driver_register(&omap_gpio_driver); |
1586 | } | 1416 | } |
1587 | postcore_initcall(omap_gpio_drv_reg); | 1417 | postcore_initcall(omap_gpio_drv_reg); |
1588 | |||
1589 | static int __init omap_gpio_sysinit(void) | ||
1590 | { | ||
1591 | mpuio_init(); | ||
1592 | |||
1593 | #if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2PLUS) | ||
1594 | if (cpu_is_omap16xx() || cpu_class_is_omap2()) | ||
1595 | register_syscore_ops(&omap_gpio_syscore_ops); | ||
1596 | #endif | ||
1597 | |||
1598 | return 0; | ||
1599 | } | ||
1600 | |||
1601 | arch_initcall(omap_gpio_sysinit); | ||
diff --git a/drivers/gpu/drm/drm_auth.c b/drivers/gpu/drm/drm_auth.c index 3f46772f0cb2..ba23790450e9 100644 --- a/drivers/gpu/drm/drm_auth.c +++ b/drivers/gpu/drm/drm_auth.c | |||
@@ -101,7 +101,7 @@ static int drm_add_magic(struct drm_master *master, struct drm_file *priv, | |||
101 | * Searches and unlinks the entry in drm_device::magiclist with the magic | 101 | * Searches and unlinks the entry in drm_device::magiclist with the magic |
102 | * number hash key, while holding the drm_device::struct_mutex lock. | 102 | * number hash key, while holding the drm_device::struct_mutex lock. |
103 | */ | 103 | */ |
104 | static int drm_remove_magic(struct drm_master *master, drm_magic_t magic) | 104 | int drm_remove_magic(struct drm_master *master, drm_magic_t magic) |
105 | { | 105 | { |
106 | struct drm_magic_entry *pt; | 106 | struct drm_magic_entry *pt; |
107 | struct drm_hash_item *hash; | 107 | struct drm_hash_item *hash; |
@@ -136,6 +136,8 @@ static int drm_remove_magic(struct drm_master *master, drm_magic_t magic) | |||
136 | * If there is a magic number in drm_file::magic then use it, otherwise | 136 | * If there is a magic number in drm_file::magic then use it, otherwise |
137 | * searches an unique non-zero magic number and add it associating it with \p | 137 | * searches an unique non-zero magic number and add it associating it with \p |
138 | * file_priv. | 138 | * file_priv. |
139 | * This ioctl needs protection by the drm_global_mutex, which protects | ||
140 | * struct drm_file::magic and struct drm_magic_entry::priv. | ||
139 | */ | 141 | */ |
140 | int drm_getmagic(struct drm_device *dev, void *data, struct drm_file *file_priv) | 142 | int drm_getmagic(struct drm_device *dev, void *data, struct drm_file *file_priv) |
141 | { | 143 | { |
@@ -173,6 +175,8 @@ int drm_getmagic(struct drm_device *dev, void *data, struct drm_file *file_priv) | |||
173 | * \return zero if authentication successed, or a negative number otherwise. | 175 | * \return zero if authentication successed, or a negative number otherwise. |
174 | * | 176 | * |
175 | * Checks if \p file_priv is associated with the magic number passed in \arg. | 177 | * Checks if \p file_priv is associated with the magic number passed in \arg. |
178 | * This ioctl needs protection by the drm_global_mutex, which protects | ||
179 | * struct drm_file::magic and struct drm_magic_entry::priv. | ||
176 | */ | 180 | */ |
177 | int drm_authmagic(struct drm_device *dev, void *data, | 181 | int drm_authmagic(struct drm_device *dev, void *data, |
178 | struct drm_file *file_priv) | 182 | struct drm_file *file_priv) |
diff --git a/drivers/gpu/drm/drm_fops.c b/drivers/gpu/drm/drm_fops.c index c00cf154cc0b..6263b0147598 100644 --- a/drivers/gpu/drm/drm_fops.c +++ b/drivers/gpu/drm/drm_fops.c | |||
@@ -487,6 +487,11 @@ int drm_release(struct inode *inode, struct file *filp) | |||
487 | (long)old_encode_dev(file_priv->minor->device), | 487 | (long)old_encode_dev(file_priv->minor->device), |
488 | dev->open_count); | 488 | dev->open_count); |
489 | 489 | ||
490 | /* Release any auth tokens that might point to this file_priv, | ||
491 | (do that under the drm_global_mutex) */ | ||
492 | if (file_priv->magic) | ||
493 | (void) drm_remove_magic(file_priv->master, file_priv->magic); | ||
494 | |||
490 | /* if the master has gone away we can't do anything with the lock */ | 495 | /* if the master has gone away we can't do anything with the lock */ |
491 | if (file_priv->minor->master) | 496 | if (file_priv->minor->master) |
492 | drm_master_release(dev, filp); | 497 | drm_master_release(dev, filp); |
diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c index 396e60ce8114..f8625e290728 100644 --- a/drivers/gpu/drm/drm_gem.c +++ b/drivers/gpu/drm/drm_gem.c | |||
@@ -140,7 +140,7 @@ int drm_gem_object_init(struct drm_device *dev, | |||
140 | obj->dev = dev; | 140 | obj->dev = dev; |
141 | obj->filp = shmem_file_setup("drm mm object", size, VM_NORESERVE); | 141 | obj->filp = shmem_file_setup("drm mm object", size, VM_NORESERVE); |
142 | if (IS_ERR(obj->filp)) | 142 | if (IS_ERR(obj->filp)) |
143 | return -ENOMEM; | 143 | return PTR_ERR(obj->filp); |
144 | 144 | ||
145 | kref_init(&obj->refcount); | 145 | kref_init(&obj->refcount); |
146 | atomic_set(&obj->handle_count, 0); | 146 | atomic_set(&obj->handle_count, 0); |
diff --git a/drivers/gpu/drm/exynos/Kconfig b/drivers/gpu/drm/exynos/Kconfig index f9aaa56eae07..b9e5266c341b 100644 --- a/drivers/gpu/drm/exynos/Kconfig +++ b/drivers/gpu/drm/exynos/Kconfig | |||
@@ -13,7 +13,7 @@ config DRM_EXYNOS | |||
13 | 13 | ||
14 | config DRM_EXYNOS_FIMD | 14 | config DRM_EXYNOS_FIMD |
15 | tristate "Exynos DRM FIMD" | 15 | tristate "Exynos DRM FIMD" |
16 | depends on DRM_EXYNOS | 16 | depends on DRM_EXYNOS && !FB_S3C |
17 | default n | 17 | default n |
18 | help | 18 | help |
19 | Choose this option if you want to use Exynos FIMD for DRM. | 19 | Choose this option if you want to use Exynos FIMD for DRM. |
@@ -21,7 +21,7 @@ config DRM_EXYNOS_FIMD | |||
21 | 21 | ||
22 | config DRM_EXYNOS_HDMI | 22 | config DRM_EXYNOS_HDMI |
23 | tristate "Exynos DRM HDMI" | 23 | tristate "Exynos DRM HDMI" |
24 | depends on DRM_EXYNOS | 24 | depends on DRM_EXYNOS && !VIDEO_SAMSUNG_S5P_TV |
25 | help | 25 | help |
26 | Choose this option if you want to use Exynos HDMI for DRM. | 26 | Choose this option if you want to use Exynos HDMI for DRM. |
27 | If M is selected, the module will be called exynos_drm_hdmi | 27 | If M is selected, the module will be called exynos_drm_hdmi |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c index ca83139cd309..b6a737d196ae 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c | |||
@@ -158,7 +158,8 @@ static void fimd_dpms(struct device *subdrv_dev, int mode) | |||
158 | case DRM_MODE_DPMS_STANDBY: | 158 | case DRM_MODE_DPMS_STANDBY: |
159 | case DRM_MODE_DPMS_SUSPEND: | 159 | case DRM_MODE_DPMS_SUSPEND: |
160 | case DRM_MODE_DPMS_OFF: | 160 | case DRM_MODE_DPMS_OFF: |
161 | pm_runtime_put_sync(subdrv_dev); | 161 | if (!ctx->suspended) |
162 | pm_runtime_put_sync(subdrv_dev); | ||
162 | break; | 163 | break; |
163 | default: | 164 | default: |
164 | DRM_DEBUG_KMS("unspecified mode %d\n", mode); | 165 | DRM_DEBUG_KMS("unspecified mode %d\n", mode); |
@@ -734,6 +735,46 @@ static void fimd_clear_win(struct fimd_context *ctx, int win) | |||
734 | writel(val, ctx->regs + SHADOWCON); | 735 | writel(val, ctx->regs + SHADOWCON); |
735 | } | 736 | } |
736 | 737 | ||
738 | static int fimd_power_on(struct fimd_context *ctx, bool enable) | ||
739 | { | ||
740 | struct exynos_drm_subdrv *subdrv = &ctx->subdrv; | ||
741 | struct device *dev = subdrv->manager.dev; | ||
742 | |||
743 | DRM_DEBUG_KMS("%s\n", __FILE__); | ||
744 | |||
745 | if (enable != false && enable != true) | ||
746 | return -EINVAL; | ||
747 | |||
748 | if (enable) { | ||
749 | int ret; | ||
750 | |||
751 | ret = clk_enable(ctx->bus_clk); | ||
752 | if (ret < 0) | ||
753 | return ret; | ||
754 | |||
755 | ret = clk_enable(ctx->lcd_clk); | ||
756 | if (ret < 0) { | ||
757 | clk_disable(ctx->bus_clk); | ||
758 | return ret; | ||
759 | } | ||
760 | |||
761 | ctx->suspended = false; | ||
762 | |||
763 | /* if vblank was enabled status, enable it again. */ | ||
764 | if (test_and_clear_bit(0, &ctx->irq_flags)) | ||
765 | fimd_enable_vblank(dev); | ||
766 | |||
767 | fimd_apply(dev); | ||
768 | } else { | ||
769 | clk_disable(ctx->lcd_clk); | ||
770 | clk_disable(ctx->bus_clk); | ||
771 | |||
772 | ctx->suspended = true; | ||
773 | } | ||
774 | |||
775 | return 0; | ||
776 | } | ||
777 | |||
737 | static int __devinit fimd_probe(struct platform_device *pdev) | 778 | static int __devinit fimd_probe(struct platform_device *pdev) |
738 | { | 779 | { |
739 | struct device *dev = &pdev->dev; | 780 | struct device *dev = &pdev->dev; |
@@ -911,39 +952,30 @@ out: | |||
911 | #ifdef CONFIG_PM_SLEEP | 952 | #ifdef CONFIG_PM_SLEEP |
912 | static int fimd_suspend(struct device *dev) | 953 | static int fimd_suspend(struct device *dev) |
913 | { | 954 | { |
914 | int ret; | 955 | struct fimd_context *ctx = get_fimd_context(dev); |
915 | 956 | ||
916 | if (pm_runtime_suspended(dev)) | 957 | if (pm_runtime_suspended(dev)) |
917 | return 0; | 958 | return 0; |
918 | 959 | ||
919 | ret = pm_runtime_suspend(dev); | 960 | /* |
920 | if (ret < 0) | 961 | * do not use pm_runtime_suspend(). if pm_runtime_suspend() is |
921 | return ret; | 962 | * called here, an error would be returned by that interface |
922 | 963 | * because the usage_count of pm runtime is more than 1. | |
923 | return 0; | 964 | */ |
965 | return fimd_power_on(ctx, false); | ||
924 | } | 966 | } |
925 | 967 | ||
926 | static int fimd_resume(struct device *dev) | 968 | static int fimd_resume(struct device *dev) |
927 | { | 969 | { |
928 | int ret; | 970 | struct fimd_context *ctx = get_fimd_context(dev); |
929 | |||
930 | ret = pm_runtime_resume(dev); | ||
931 | if (ret < 0) { | ||
932 | DRM_ERROR("failed to resume runtime pm.\n"); | ||
933 | return ret; | ||
934 | } | ||
935 | |||
936 | pm_runtime_disable(dev); | ||
937 | |||
938 | ret = pm_runtime_set_active(dev); | ||
939 | if (ret < 0) { | ||
940 | DRM_ERROR("failed to active runtime pm.\n"); | ||
941 | pm_runtime_enable(dev); | ||
942 | pm_runtime_suspend(dev); | ||
943 | return ret; | ||
944 | } | ||
945 | 971 | ||
946 | pm_runtime_enable(dev); | 972 | /* |
973 | * if entered to sleep when lcd panel was on, the usage_count | ||
974 | * of pm runtime would still be 1 so in this case, fimd driver | ||
975 | * should be on directly not drawing on pm runtime interface. | ||
976 | */ | ||
977 | if (!pm_runtime_suspended(dev)) | ||
978 | return fimd_power_on(ctx, true); | ||
947 | 979 | ||
948 | return 0; | 980 | return 0; |
949 | } | 981 | } |
@@ -956,39 +988,16 @@ static int fimd_runtime_suspend(struct device *dev) | |||
956 | 988 | ||
957 | DRM_DEBUG_KMS("%s\n", __FILE__); | 989 | DRM_DEBUG_KMS("%s\n", __FILE__); |
958 | 990 | ||
959 | clk_disable(ctx->lcd_clk); | 991 | return fimd_power_on(ctx, false); |
960 | clk_disable(ctx->bus_clk); | ||
961 | |||
962 | ctx->suspended = true; | ||
963 | return 0; | ||
964 | } | 992 | } |
965 | 993 | ||
966 | static int fimd_runtime_resume(struct device *dev) | 994 | static int fimd_runtime_resume(struct device *dev) |
967 | { | 995 | { |
968 | struct fimd_context *ctx = get_fimd_context(dev); | 996 | struct fimd_context *ctx = get_fimd_context(dev); |
969 | int ret; | ||
970 | 997 | ||
971 | DRM_DEBUG_KMS("%s\n", __FILE__); | 998 | DRM_DEBUG_KMS("%s\n", __FILE__); |
972 | 999 | ||
973 | ret = clk_enable(ctx->bus_clk); | 1000 | return fimd_power_on(ctx, true); |
974 | if (ret < 0) | ||
975 | return ret; | ||
976 | |||
977 | ret = clk_enable(ctx->lcd_clk); | ||
978 | if (ret < 0) { | ||
979 | clk_disable(ctx->bus_clk); | ||
980 | return ret; | ||
981 | } | ||
982 | |||
983 | ctx->suspended = false; | ||
984 | |||
985 | /* if vblank was enabled status, enable it again. */ | ||
986 | if (test_and_clear_bit(0, &ctx->irq_flags)) | ||
987 | fimd_enable_vblank(dev); | ||
988 | |||
989 | fimd_apply(dev); | ||
990 | |||
991 | return 0; | ||
992 | } | 1001 | } |
993 | #endif | 1002 | #endif |
994 | 1003 | ||
diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c b/drivers/gpu/drm/exynos/exynos_hdmi.c index f48f7ce92f5f..3429d3fd93f3 100644 --- a/drivers/gpu/drm/exynos/exynos_hdmi.c +++ b/drivers/gpu/drm/exynos/exynos_hdmi.c | |||
@@ -1116,8 +1116,8 @@ err_ddc: | |||
1116 | err_iomap: | 1116 | err_iomap: |
1117 | iounmap(hdata->regs); | 1117 | iounmap(hdata->regs); |
1118 | err_req_region: | 1118 | err_req_region: |
1119 | release_resource(hdata->regs_res); | 1119 | release_mem_region(hdata->regs_res->start, |
1120 | kfree(hdata->regs_res); | 1120 | resource_size(hdata->regs_res)); |
1121 | err_resource: | 1121 | err_resource: |
1122 | hdmi_resources_cleanup(hdata); | 1122 | hdmi_resources_cleanup(hdata); |
1123 | err_data: | 1123 | err_data: |
@@ -1145,8 +1145,8 @@ static int __devexit hdmi_remove(struct platform_device *pdev) | |||
1145 | 1145 | ||
1146 | iounmap(hdata->regs); | 1146 | iounmap(hdata->regs); |
1147 | 1147 | ||
1148 | release_resource(hdata->regs_res); | 1148 | release_mem_region(hdata->regs_res->start, |
1149 | kfree(hdata->regs_res); | 1149 | resource_size(hdata->regs_res)); |
1150 | 1150 | ||
1151 | /* hdmiphy i2c driver */ | 1151 | /* hdmiphy i2c driver */ |
1152 | i2c_del_driver(&hdmiphy_driver); | 1152 | i2c_del_driver(&hdmiphy_driver); |
diff --git a/drivers/gpu/drm/gma500/framebuffer.c b/drivers/gpu/drm/gma500/framebuffer.c index 791c0ef1a65b..830dfdd6bf15 100644 --- a/drivers/gpu/drm/gma500/framebuffer.c +++ b/drivers/gpu/drm/gma500/framebuffer.c | |||
@@ -113,12 +113,12 @@ static int psbfb_pan(struct fb_var_screeninfo *var, struct fb_info *info) | |||
113 | 113 | ||
114 | void psbfb_suspend(struct drm_device *dev) | 114 | void psbfb_suspend(struct drm_device *dev) |
115 | { | 115 | { |
116 | struct drm_framebuffer *fb = 0; | 116 | struct drm_framebuffer *fb; |
117 | struct psb_framebuffer *psbfb = to_psb_fb(fb); | ||
118 | 117 | ||
119 | console_lock(); | 118 | console_lock(); |
120 | mutex_lock(&dev->mode_config.mutex); | 119 | mutex_lock(&dev->mode_config.mutex); |
121 | list_for_each_entry(fb, &dev->mode_config.fb_list, head) { | 120 | list_for_each_entry(fb, &dev->mode_config.fb_list, head) { |
121 | struct psb_framebuffer *psbfb = to_psb_fb(fb); | ||
122 | struct fb_info *info = psbfb->fbdev; | 122 | struct fb_info *info = psbfb->fbdev; |
123 | fb_set_suspend(info, 1); | 123 | fb_set_suspend(info, 1); |
124 | drm_fb_helper_blank(FB_BLANK_POWERDOWN, info); | 124 | drm_fb_helper_blank(FB_BLANK_POWERDOWN, info); |
@@ -129,12 +129,12 @@ void psbfb_suspend(struct drm_device *dev) | |||
129 | 129 | ||
130 | void psbfb_resume(struct drm_device *dev) | 130 | void psbfb_resume(struct drm_device *dev) |
131 | { | 131 | { |
132 | struct drm_framebuffer *fb = 0; | 132 | struct drm_framebuffer *fb; |
133 | struct psb_framebuffer *psbfb = to_psb_fb(fb); | ||
134 | 133 | ||
135 | console_lock(); | 134 | console_lock(); |
136 | mutex_lock(&dev->mode_config.mutex); | 135 | mutex_lock(&dev->mode_config.mutex); |
137 | list_for_each_entry(fb, &dev->mode_config.fb_list, head) { | 136 | list_for_each_entry(fb, &dev->mode_config.fb_list, head) { |
137 | struct psb_framebuffer *psbfb = to_psb_fb(fb); | ||
138 | struct fb_info *info = psbfb->fbdev; | 138 | struct fb_info *info = psbfb->fbdev; |
139 | fb_set_suspend(info, 0); | 139 | fb_set_suspend(info, 0); |
140 | drm_fb_helper_blank(FB_BLANK_UNBLANK, info); | 140 | drm_fb_helper_blank(FB_BLANK_UNBLANK, info); |
diff --git a/drivers/gpu/drm/gma500/gtt.c b/drivers/gpu/drm/gma500/gtt.c index e770bd190a5c..5d5330f667f1 100644 --- a/drivers/gpu/drm/gma500/gtt.c +++ b/drivers/gpu/drm/gma500/gtt.c | |||
@@ -20,6 +20,7 @@ | |||
20 | */ | 20 | */ |
21 | 21 | ||
22 | #include <drm/drmP.h> | 22 | #include <drm/drmP.h> |
23 | #include <linux/shmem_fs.h> | ||
23 | #include "psb_drv.h" | 24 | #include "psb_drv.h" |
24 | 25 | ||
25 | 26 | ||
@@ -203,9 +204,7 @@ static int psb_gtt_attach_pages(struct gtt_range *gt) | |||
203 | gt->npage = pages; | 204 | gt->npage = pages; |
204 | 205 | ||
205 | for (i = 0; i < pages; i++) { | 206 | for (i = 0; i < pages; i++) { |
206 | /* FIXME: needs updating as per mail from Hugh Dickins */ | 207 | p = shmem_read_mapping_page(mapping, i); |
207 | p = read_cache_page_gfp(mapping, i, | ||
208 | __GFP_COLD | GFP_KERNEL); | ||
209 | if (IS_ERR(p)) | 208 | if (IS_ERR(p)) |
210 | goto err; | 209 | goto err; |
211 | gt->pages[i] = p; | 210 | gt->pages[i] = p; |
diff --git a/drivers/gpu/drm/i810/i810_dma.c b/drivers/gpu/drm/i810/i810_dma.c index f7c17b239833..7f4b4e10246e 100644 --- a/drivers/gpu/drm/i810/i810_dma.c +++ b/drivers/gpu/drm/i810/i810_dma.c | |||
@@ -886,7 +886,7 @@ static int i810_flush_queue(struct drm_device *dev) | |||
886 | } | 886 | } |
887 | 887 | ||
888 | /* Must be called with the lock held */ | 888 | /* Must be called with the lock held */ |
889 | void i810_driver_reclaim_buffers(struct drm_device *dev, | 889 | static void i810_reclaim_buffers(struct drm_device *dev, |
890 | struct drm_file *file_priv) | 890 | struct drm_file *file_priv) |
891 | { | 891 | { |
892 | struct drm_device_dma *dma = dev->dma; | 892 | struct drm_device_dma *dma = dev->dma; |
@@ -1223,17 +1223,12 @@ void i810_driver_preclose(struct drm_device *dev, struct drm_file *file_priv) | |||
1223 | if (dev_priv->page_flipping) | 1223 | if (dev_priv->page_flipping) |
1224 | i810_do_cleanup_pageflip(dev); | 1224 | i810_do_cleanup_pageflip(dev); |
1225 | } | 1225 | } |
1226 | } | ||
1226 | 1227 | ||
1227 | if (file_priv->master && file_priv->master->lock.hw_lock) { | 1228 | void i810_driver_reclaim_buffers_locked(struct drm_device *dev, |
1228 | drm_idlelock_take(&file_priv->master->lock); | 1229 | struct drm_file *file_priv) |
1229 | i810_driver_reclaim_buffers(dev, file_priv); | 1230 | { |
1230 | drm_idlelock_release(&file_priv->master->lock); | 1231 | i810_reclaim_buffers(dev, file_priv); |
1231 | } else { | ||
1232 | /* master disappeared, clean up stuff anyway and hope nothing | ||
1233 | * goes wrong */ | ||
1234 | i810_driver_reclaim_buffers(dev, file_priv); | ||
1235 | } | ||
1236 | |||
1237 | } | 1232 | } |
1238 | 1233 | ||
1239 | int i810_driver_dma_quiescent(struct drm_device *dev) | 1234 | int i810_driver_dma_quiescent(struct drm_device *dev) |
diff --git a/drivers/gpu/drm/i810/i810_drv.c b/drivers/gpu/drm/i810/i810_drv.c index 053f1ee58393..ec12f7dc717a 100644 --- a/drivers/gpu/drm/i810/i810_drv.c +++ b/drivers/gpu/drm/i810/i810_drv.c | |||
@@ -63,6 +63,7 @@ static struct drm_driver driver = { | |||
63 | .lastclose = i810_driver_lastclose, | 63 | .lastclose = i810_driver_lastclose, |
64 | .preclose = i810_driver_preclose, | 64 | .preclose = i810_driver_preclose, |
65 | .device_is_agp = i810_driver_device_is_agp, | 65 | .device_is_agp = i810_driver_device_is_agp, |
66 | .reclaim_buffers_locked = i810_driver_reclaim_buffers_locked, | ||
66 | .dma_quiescent = i810_driver_dma_quiescent, | 67 | .dma_quiescent = i810_driver_dma_quiescent, |
67 | .ioctls = i810_ioctls, | 68 | .ioctls = i810_ioctls, |
68 | .fops = &i810_driver_fops, | 69 | .fops = &i810_driver_fops, |
diff --git a/drivers/gpu/drm/i810/i810_drv.h b/drivers/gpu/drm/i810/i810_drv.h index 6e0acad9e0f5..c9339f481795 100644 --- a/drivers/gpu/drm/i810/i810_drv.h +++ b/drivers/gpu/drm/i810/i810_drv.h | |||
@@ -116,12 +116,14 @@ typedef struct drm_i810_private { | |||
116 | 116 | ||
117 | /* i810_dma.c */ | 117 | /* i810_dma.c */ |
118 | extern int i810_driver_dma_quiescent(struct drm_device *dev); | 118 | extern int i810_driver_dma_quiescent(struct drm_device *dev); |
119 | void i810_driver_reclaim_buffers(struct drm_device *dev, | 119 | extern void i810_driver_reclaim_buffers_locked(struct drm_device *dev, |
120 | struct drm_file *file_priv); | 120 | struct drm_file *file_priv); |
121 | extern int i810_driver_load(struct drm_device *, unsigned long flags); | 121 | extern int i810_driver_load(struct drm_device *, unsigned long flags); |
122 | extern void i810_driver_lastclose(struct drm_device *dev); | 122 | extern void i810_driver_lastclose(struct drm_device *dev); |
123 | extern void i810_driver_preclose(struct drm_device *dev, | 123 | extern void i810_driver_preclose(struct drm_device *dev, |
124 | struct drm_file *file_priv); | 124 | struct drm_file *file_priv); |
125 | extern void i810_driver_reclaim_buffers_locked(struct drm_device *dev, | ||
126 | struct drm_file *file_priv); | ||
125 | extern int i810_driver_device_is_agp(struct drm_device *dev); | 127 | extern int i810_driver_device_is_agp(struct drm_device *dev); |
126 | 128 | ||
127 | extern long i810_ioctl(struct file *file, unsigned int cmd, unsigned long arg); | 129 | extern long i810_ioctl(struct file *file, unsigned int cmd, unsigned long arg); |
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index 11807989f918..deaa657292b4 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c | |||
@@ -121,11 +121,11 @@ static const char *cache_level_str(int type) | |||
121 | static void | 121 | static void |
122 | describe_obj(struct seq_file *m, struct drm_i915_gem_object *obj) | 122 | describe_obj(struct seq_file *m, struct drm_i915_gem_object *obj) |
123 | { | 123 | { |
124 | seq_printf(m, "%p: %s%s %8zd %04x %04x %d %d%s%s%s", | 124 | seq_printf(m, "%p: %s%s %8zdKiB %04x %04x %d %d%s%s%s", |
125 | &obj->base, | 125 | &obj->base, |
126 | get_pin_flag(obj), | 126 | get_pin_flag(obj), |
127 | get_tiling_flag(obj), | 127 | get_tiling_flag(obj), |
128 | obj->base.size, | 128 | obj->base.size / 1024, |
129 | obj->base.read_domains, | 129 | obj->base.read_domains, |
130 | obj->base.write_domain, | 130 | obj->base.write_domain, |
131 | obj->last_rendering_seqno, | 131 | obj->last_rendering_seqno, |
@@ -653,7 +653,7 @@ static int i915_ringbuffer_info(struct seq_file *m, void *data) | |||
653 | seq_printf(m, " Size : %08x\n", ring->size); | 653 | seq_printf(m, " Size : %08x\n", ring->size); |
654 | seq_printf(m, " Active : %08x\n", intel_ring_get_active_head(ring)); | 654 | seq_printf(m, " Active : %08x\n", intel_ring_get_active_head(ring)); |
655 | seq_printf(m, " NOPID : %08x\n", I915_READ_NOPID(ring)); | 655 | seq_printf(m, " NOPID : %08x\n", I915_READ_NOPID(ring)); |
656 | if (IS_GEN6(dev)) { | 656 | if (IS_GEN6(dev) || IS_GEN7(dev)) { |
657 | seq_printf(m, " Sync 0 : %08x\n", I915_READ_SYNC_0(ring)); | 657 | seq_printf(m, " Sync 0 : %08x\n", I915_READ_SYNC_0(ring)); |
658 | seq_printf(m, " Sync 1 : %08x\n", I915_READ_SYNC_1(ring)); | 658 | seq_printf(m, " Sync 1 : %08x\n", I915_READ_SYNC_1(ring)); |
659 | } | 659 | } |
@@ -1075,6 +1075,7 @@ static int gen6_drpc_info(struct seq_file *m) | |||
1075 | struct drm_device *dev = node->minor->dev; | 1075 | struct drm_device *dev = node->minor->dev; |
1076 | struct drm_i915_private *dev_priv = dev->dev_private; | 1076 | struct drm_i915_private *dev_priv = dev->dev_private; |
1077 | u32 rpmodectl1, gt_core_status, rcctl1; | 1077 | u32 rpmodectl1, gt_core_status, rcctl1; |
1078 | unsigned forcewake_count; | ||
1078 | int count=0, ret; | 1079 | int count=0, ret; |
1079 | 1080 | ||
1080 | 1081 | ||
@@ -1082,9 +1083,13 @@ static int gen6_drpc_info(struct seq_file *m) | |||
1082 | if (ret) | 1083 | if (ret) |
1083 | return ret; | 1084 | return ret; |
1084 | 1085 | ||
1085 | if (atomic_read(&dev_priv->forcewake_count)) { | 1086 | spin_lock_irq(&dev_priv->gt_lock); |
1086 | seq_printf(m, "RC information inaccurate because userspace " | 1087 | forcewake_count = dev_priv->forcewake_count; |
1087 | "holds a reference \n"); | 1088 | spin_unlock_irq(&dev_priv->gt_lock); |
1089 | |||
1090 | if (forcewake_count) { | ||
1091 | seq_printf(m, "RC information inaccurate because somebody " | ||
1092 | "holds a forcewake reference \n"); | ||
1088 | } else { | 1093 | } else { |
1089 | /* NB: we cannot use forcewake, else we read the wrong values */ | 1094 | /* NB: we cannot use forcewake, else we read the wrong values */ |
1090 | while (count++ < 50 && (I915_READ_NOTRACE(FORCEWAKE_ACK) & 1)) | 1095 | while (count++ < 50 && (I915_READ_NOTRACE(FORCEWAKE_ACK) & 1)) |
@@ -1106,7 +1111,7 @@ static int gen6_drpc_info(struct seq_file *m) | |||
1106 | seq_printf(m, "SW control enabled: %s\n", | 1111 | seq_printf(m, "SW control enabled: %s\n", |
1107 | yesno((rpmodectl1 & GEN6_RP_MEDIA_MODE_MASK) == | 1112 | yesno((rpmodectl1 & GEN6_RP_MEDIA_MODE_MASK) == |
1108 | GEN6_RP_MEDIA_SW_MODE)); | 1113 | GEN6_RP_MEDIA_SW_MODE)); |
1109 | seq_printf(m, "RC6 Enabled: %s\n", | 1114 | seq_printf(m, "RC1e Enabled: %s\n", |
1110 | yesno(rcctl1 & GEN6_RC_CTL_RC1e_ENABLE)); | 1115 | yesno(rcctl1 & GEN6_RC_CTL_RC1e_ENABLE)); |
1111 | seq_printf(m, "RC6 Enabled: %s\n", | 1116 | seq_printf(m, "RC6 Enabled: %s\n", |
1112 | yesno(rcctl1 & GEN6_RC_CTL_RC6_ENABLE)); | 1117 | yesno(rcctl1 & GEN6_RC_CTL_RC6_ENABLE)); |
@@ -1398,9 +1403,13 @@ static int i915_gen6_forcewake_count_info(struct seq_file *m, void *data) | |||
1398 | struct drm_info_node *node = (struct drm_info_node *) m->private; | 1403 | struct drm_info_node *node = (struct drm_info_node *) m->private; |
1399 | struct drm_device *dev = node->minor->dev; | 1404 | struct drm_device *dev = node->minor->dev; |
1400 | struct drm_i915_private *dev_priv = dev->dev_private; | 1405 | struct drm_i915_private *dev_priv = dev->dev_private; |
1406 | unsigned forcewake_count; | ||
1407 | |||
1408 | spin_lock_irq(&dev_priv->gt_lock); | ||
1409 | forcewake_count = dev_priv->forcewake_count; | ||
1410 | spin_unlock_irq(&dev_priv->gt_lock); | ||
1401 | 1411 | ||
1402 | seq_printf(m, "forcewake count = %d\n", | 1412 | seq_printf(m, "forcewake count = %u\n", forcewake_count); |
1403 | atomic_read(&dev_priv->forcewake_count)); | ||
1404 | 1413 | ||
1405 | return 0; | 1414 | return 0; |
1406 | } | 1415 | } |
@@ -1665,7 +1674,7 @@ static int i915_forcewake_open(struct inode *inode, struct file *file) | |||
1665 | struct drm_i915_private *dev_priv = dev->dev_private; | 1674 | struct drm_i915_private *dev_priv = dev->dev_private; |
1666 | int ret; | 1675 | int ret; |
1667 | 1676 | ||
1668 | if (!IS_GEN6(dev)) | 1677 | if (INTEL_INFO(dev)->gen < 6) |
1669 | return 0; | 1678 | return 0; |
1670 | 1679 | ||
1671 | ret = mutex_lock_interruptible(&dev->struct_mutex); | 1680 | ret = mutex_lock_interruptible(&dev->struct_mutex); |
@@ -1682,7 +1691,7 @@ int i915_forcewake_release(struct inode *inode, struct file *file) | |||
1682 | struct drm_device *dev = inode->i_private; | 1691 | struct drm_device *dev = inode->i_private; |
1683 | struct drm_i915_private *dev_priv = dev->dev_private; | 1692 | struct drm_i915_private *dev_priv = dev->dev_private; |
1684 | 1693 | ||
1685 | if (!IS_GEN6(dev)) | 1694 | if (INTEL_INFO(dev)->gen < 6) |
1686 | return 0; | 1695 | return 0; |
1687 | 1696 | ||
1688 | /* | 1697 | /* |
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index 5f4d5893e983..ddfe3d902b2a 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c | |||
@@ -2045,6 +2045,7 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) | |||
2045 | if (!IS_I945G(dev) && !IS_I945GM(dev)) | 2045 | if (!IS_I945G(dev) && !IS_I945GM(dev)) |
2046 | pci_enable_msi(dev->pdev); | 2046 | pci_enable_msi(dev->pdev); |
2047 | 2047 | ||
2048 | spin_lock_init(&dev_priv->gt_lock); | ||
2048 | spin_lock_init(&dev_priv->irq_lock); | 2049 | spin_lock_init(&dev_priv->irq_lock); |
2049 | spin_lock_init(&dev_priv->error_lock); | 2050 | spin_lock_init(&dev_priv->error_lock); |
2050 | spin_lock_init(&dev_priv->rps_lock); | 2051 | spin_lock_init(&dev_priv->rps_lock); |
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index 8f7187915b0d..308f81913562 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c | |||
@@ -368,11 +368,12 @@ void __gen6_gt_force_wake_mt_get(struct drm_i915_private *dev_priv) | |||
368 | */ | 368 | */ |
369 | void gen6_gt_force_wake_get(struct drm_i915_private *dev_priv) | 369 | void gen6_gt_force_wake_get(struct drm_i915_private *dev_priv) |
370 | { | 370 | { |
371 | WARN_ON(!mutex_is_locked(&dev_priv->dev->struct_mutex)); | 371 | unsigned long irqflags; |
372 | 372 | ||
373 | /* Forcewake is atomic in case we get in here without the lock */ | 373 | spin_lock_irqsave(&dev_priv->gt_lock, irqflags); |
374 | if (atomic_add_return(1, &dev_priv->forcewake_count) == 1) | 374 | if (dev_priv->forcewake_count++ == 0) |
375 | dev_priv->display.force_wake_get(dev_priv); | 375 | dev_priv->display.force_wake_get(dev_priv); |
376 | spin_unlock_irqrestore(&dev_priv->gt_lock, irqflags); | ||
376 | } | 377 | } |
377 | 378 | ||
378 | void __gen6_gt_force_wake_put(struct drm_i915_private *dev_priv) | 379 | void __gen6_gt_force_wake_put(struct drm_i915_private *dev_priv) |
@@ -392,10 +393,12 @@ void __gen6_gt_force_wake_mt_put(struct drm_i915_private *dev_priv) | |||
392 | */ | 393 | */ |
393 | void gen6_gt_force_wake_put(struct drm_i915_private *dev_priv) | 394 | void gen6_gt_force_wake_put(struct drm_i915_private *dev_priv) |
394 | { | 395 | { |
395 | WARN_ON(!mutex_is_locked(&dev_priv->dev->struct_mutex)); | 396 | unsigned long irqflags; |
396 | 397 | ||
397 | if (atomic_dec_and_test(&dev_priv->forcewake_count)) | 398 | spin_lock_irqsave(&dev_priv->gt_lock, irqflags); |
399 | if (--dev_priv->forcewake_count == 0) | ||
398 | dev_priv->display.force_wake_put(dev_priv); | 400 | dev_priv->display.force_wake_put(dev_priv); |
401 | spin_unlock_irqrestore(&dev_priv->gt_lock, irqflags); | ||
399 | } | 402 | } |
400 | 403 | ||
401 | void __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv) | 404 | void __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv) |
@@ -597,9 +600,36 @@ static int ironlake_do_reset(struct drm_device *dev, u8 flags) | |||
597 | static int gen6_do_reset(struct drm_device *dev, u8 flags) | 600 | static int gen6_do_reset(struct drm_device *dev, u8 flags) |
598 | { | 601 | { |
599 | struct drm_i915_private *dev_priv = dev->dev_private; | 602 | struct drm_i915_private *dev_priv = dev->dev_private; |
603 | int ret; | ||
604 | unsigned long irqflags; | ||
600 | 605 | ||
601 | I915_WRITE(GEN6_GDRST, GEN6_GRDOM_FULL); | 606 | /* Hold gt_lock across reset to prevent any register access |
602 | return wait_for((I915_READ(GEN6_GDRST) & GEN6_GRDOM_FULL) == 0, 500); | 607 | * with forcewake not set correctly |
608 | */ | ||
609 | spin_lock_irqsave(&dev_priv->gt_lock, irqflags); | ||
610 | |||
611 | /* Reset the chip */ | ||
612 | |||
613 | /* GEN6_GDRST is not in the gt power well, no need to check | ||
614 | * for fifo space for the write or forcewake the chip for | ||
615 | * the read | ||
616 | */ | ||
617 | I915_WRITE_NOTRACE(GEN6_GDRST, GEN6_GRDOM_FULL); | ||
618 | |||
619 | /* Spin waiting for the device to ack the reset request */ | ||
620 | ret = wait_for((I915_READ_NOTRACE(GEN6_GDRST) & GEN6_GRDOM_FULL) == 0, 500); | ||
621 | |||
622 | /* If reset with a user forcewake, try to restore, otherwise turn it off */ | ||
623 | if (dev_priv->forcewake_count) | ||
624 | dev_priv->display.force_wake_get(dev_priv); | ||
625 | else | ||
626 | dev_priv->display.force_wake_put(dev_priv); | ||
627 | |||
628 | /* Restore fifo count */ | ||
629 | dev_priv->gt_fifo_count = I915_READ_NOTRACE(GT_FIFO_FREE_ENTRIES); | ||
630 | |||
631 | spin_unlock_irqrestore(&dev_priv->gt_lock, irqflags); | ||
632 | return ret; | ||
603 | } | 633 | } |
604 | 634 | ||
605 | /** | 635 | /** |
@@ -643,9 +673,6 @@ int i915_reset(struct drm_device *dev, u8 flags) | |||
643 | case 7: | 673 | case 7: |
644 | case 6: | 674 | case 6: |
645 | ret = gen6_do_reset(dev, flags); | 675 | ret = gen6_do_reset(dev, flags); |
646 | /* If reset with a user forcewake, try to restore */ | ||
647 | if (atomic_read(&dev_priv->forcewake_count)) | ||
648 | __gen6_gt_force_wake_get(dev_priv); | ||
649 | break; | 676 | break; |
650 | case 5: | 677 | case 5: |
651 | ret = ironlake_do_reset(dev, flags); | 678 | ret = ironlake_do_reset(dev, flags); |
@@ -927,9 +954,14 @@ MODULE_LICENSE("GPL and additional rights"); | |||
927 | u##x i915_read##x(struct drm_i915_private *dev_priv, u32 reg) { \ | 954 | u##x i915_read##x(struct drm_i915_private *dev_priv, u32 reg) { \ |
928 | u##x val = 0; \ | 955 | u##x val = 0; \ |
929 | if (NEEDS_FORCE_WAKE((dev_priv), (reg))) { \ | 956 | if (NEEDS_FORCE_WAKE((dev_priv), (reg))) { \ |
930 | gen6_gt_force_wake_get(dev_priv); \ | 957 | unsigned long irqflags; \ |
958 | spin_lock_irqsave(&dev_priv->gt_lock, irqflags); \ | ||
959 | if (dev_priv->forcewake_count == 0) \ | ||
960 | dev_priv->display.force_wake_get(dev_priv); \ | ||
931 | val = read##y(dev_priv->regs + reg); \ | 961 | val = read##y(dev_priv->regs + reg); \ |
932 | gen6_gt_force_wake_put(dev_priv); \ | 962 | if (dev_priv->forcewake_count == 0) \ |
963 | dev_priv->display.force_wake_put(dev_priv); \ | ||
964 | spin_unlock_irqrestore(&dev_priv->gt_lock, irqflags); \ | ||
933 | } else { \ | 965 | } else { \ |
934 | val = read##y(dev_priv->regs + reg); \ | 966 | val = read##y(dev_priv->regs + reg); \ |
935 | } \ | 967 | } \ |
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 602bc80baabb..9689ca38b2b3 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
@@ -288,7 +288,13 @@ typedef struct drm_i915_private { | |||
288 | int relative_constants_mode; | 288 | int relative_constants_mode; |
289 | 289 | ||
290 | void __iomem *regs; | 290 | void __iomem *regs; |
291 | u32 gt_fifo_count; | 291 | /** gt_fifo_count and the subsequent register write are synchronized |
292 | * with dev->struct_mutex. */ | ||
293 | unsigned gt_fifo_count; | ||
294 | /** forcewake_count is protected by gt_lock */ | ||
295 | unsigned forcewake_count; | ||
296 | /** gt_lock is also taken in irq contexts. */ | ||
297 | struct spinlock gt_lock; | ||
292 | 298 | ||
293 | struct intel_gmbus { | 299 | struct intel_gmbus { |
294 | struct i2c_adapter adapter; | 300 | struct i2c_adapter adapter; |
@@ -741,8 +747,6 @@ typedef struct drm_i915_private { | |||
741 | 747 | ||
742 | struct drm_property *broadcast_rgb_property; | 748 | struct drm_property *broadcast_rgb_property; |
743 | struct drm_property *force_audio_property; | 749 | struct drm_property *force_audio_property; |
744 | |||
745 | atomic_t forcewake_count; | ||
746 | } drm_i915_private_t; | 750 | } drm_i915_private_t; |
747 | 751 | ||
748 | enum i915_cache_level { | 752 | enum i915_cache_level { |
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 5d433fc11ace..5bd4361ea84d 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
@@ -1751,7 +1751,8 @@ static void ironlake_irq_preinstall(struct drm_device *dev) | |||
1751 | INIT_WORK(&dev_priv->rps_work, gen6_pm_rps_work); | 1751 | INIT_WORK(&dev_priv->rps_work, gen6_pm_rps_work); |
1752 | 1752 | ||
1753 | I915_WRITE(HWSTAM, 0xeffe); | 1753 | I915_WRITE(HWSTAM, 0xeffe); |
1754 | if (IS_GEN6(dev) || IS_GEN7(dev)) { | 1754 | |
1755 | if (IS_GEN6(dev)) { | ||
1755 | /* Workaround stalls observed on Sandy Bridge GPUs by | 1756 | /* Workaround stalls observed on Sandy Bridge GPUs by |
1756 | * making the blitter command streamer generate a | 1757 | * making the blitter command streamer generate a |
1757 | * write to the Hardware Status Page for | 1758 | * write to the Hardware Status Page for |
diff --git a/drivers/gpu/drm/i915/i915_suspend.c b/drivers/gpu/drm/i915/i915_suspend.c index 7886e4fb60e3..2b5eb229ff2c 100644 --- a/drivers/gpu/drm/i915/i915_suspend.c +++ b/drivers/gpu/drm/i915/i915_suspend.c | |||
@@ -28,14 +28,19 @@ | |||
28 | #include "drm.h" | 28 | #include "drm.h" |
29 | #include "i915_drm.h" | 29 | #include "i915_drm.h" |
30 | #include "intel_drv.h" | 30 | #include "intel_drv.h" |
31 | #include "i915_reg.h" | ||
31 | 32 | ||
32 | static bool i915_pipe_enabled(struct drm_device *dev, enum pipe pipe) | 33 | static bool i915_pipe_enabled(struct drm_device *dev, enum pipe pipe) |
33 | { | 34 | { |
34 | struct drm_i915_private *dev_priv = dev->dev_private; | 35 | struct drm_i915_private *dev_priv = dev->dev_private; |
35 | u32 dpll_reg; | 36 | u32 dpll_reg; |
36 | 37 | ||
38 | /* On IVB, 3rd pipe shares PLL with another one */ | ||
39 | if (pipe > 1) | ||
40 | return false; | ||
41 | |||
37 | if (HAS_PCH_SPLIT(dev)) | 42 | if (HAS_PCH_SPLIT(dev)) |
38 | dpll_reg = (pipe == PIPE_A) ? _PCH_DPLL_A : _PCH_DPLL_B; | 43 | dpll_reg = PCH_DPLL(pipe); |
39 | else | 44 | else |
40 | dpll_reg = (pipe == PIPE_A) ? _DPLL_A : _DPLL_B; | 45 | dpll_reg = (pipe == PIPE_A) ? _DPLL_A : _DPLL_B; |
41 | 46 | ||
@@ -822,7 +827,7 @@ int i915_save_state(struct drm_device *dev) | |||
822 | 827 | ||
823 | if (IS_IRONLAKE_M(dev)) | 828 | if (IS_IRONLAKE_M(dev)) |
824 | ironlake_disable_drps(dev); | 829 | ironlake_disable_drps(dev); |
825 | if (IS_GEN6(dev)) | 830 | if (INTEL_INFO(dev)->gen >= 6) |
826 | gen6_disable_rps(dev); | 831 | gen6_disable_rps(dev); |
827 | 832 | ||
828 | /* Cache mode state */ | 833 | /* Cache mode state */ |
@@ -881,7 +886,7 @@ int i915_restore_state(struct drm_device *dev) | |||
881 | intel_init_emon(dev); | 886 | intel_init_emon(dev); |
882 | } | 887 | } |
883 | 888 | ||
884 | if (IS_GEN6(dev)) { | 889 | if (INTEL_INFO(dev)->gen >= 6) { |
885 | gen6_enable_rps(dev_priv); | 890 | gen6_enable_rps(dev_priv); |
886 | gen6_update_ring_freq(dev_priv); | 891 | gen6_update_ring_freq(dev_priv); |
887 | } | 892 | } |
diff --git a/drivers/gpu/drm/i915/intel_bios.h b/drivers/gpu/drm/i915/intel_bios.h index 8af3735e27c6..dbda6e3bdf07 100644 --- a/drivers/gpu/drm/i915/intel_bios.h +++ b/drivers/gpu/drm/i915/intel_bios.h | |||
@@ -467,8 +467,12 @@ struct edp_link_params { | |||
467 | struct bdb_edp { | 467 | struct bdb_edp { |
468 | struct edp_power_seq power_seqs[16]; | 468 | struct edp_power_seq power_seqs[16]; |
469 | u32 color_depth; | 469 | u32 color_depth; |
470 | u32 sdrrs_msa_timing_delay; | ||
471 | struct edp_link_params link_params[16]; | 470 | struct edp_link_params link_params[16]; |
471 | u32 sdrrs_msa_timing_delay; | ||
472 | |||
473 | /* ith bit indicates enabled/disabled for (i+1)th panel */ | ||
474 | u16 edp_s3d_feature; | ||
475 | u16 edp_t3_optimization; | ||
472 | } __attribute__ ((packed)); | 476 | } __attribute__ ((packed)); |
473 | 477 | ||
474 | void intel_setup_bios(struct drm_device *dev); | 478 | void intel_setup_bios(struct drm_device *dev); |
diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c index fee0ad02c6d0..dd729d46a61f 100644 --- a/drivers/gpu/drm/i915/intel_crt.c +++ b/drivers/gpu/drm/i915/intel_crt.c | |||
@@ -24,6 +24,7 @@ | |||
24 | * Eric Anholt <eric@anholt.net> | 24 | * Eric Anholt <eric@anholt.net> |
25 | */ | 25 | */ |
26 | 26 | ||
27 | #include <linux/dmi.h> | ||
27 | #include <linux/i2c.h> | 28 | #include <linux/i2c.h> |
28 | #include <linux/slab.h> | 29 | #include <linux/slab.h> |
29 | #include "drmP.h" | 30 | #include "drmP.h" |
@@ -540,6 +541,24 @@ static const struct drm_encoder_funcs intel_crt_enc_funcs = { | |||
540 | .destroy = intel_encoder_destroy, | 541 | .destroy = intel_encoder_destroy, |
541 | }; | 542 | }; |
542 | 543 | ||
544 | static int __init intel_no_crt_dmi_callback(const struct dmi_system_id *id) | ||
545 | { | ||
546 | DRM_DEBUG_KMS("Skipping CRT initialization for %s\n", id->ident); | ||
547 | return 1; | ||
548 | } | ||
549 | |||
550 | static const struct dmi_system_id intel_no_crt[] = { | ||
551 | { | ||
552 | .callback = intel_no_crt_dmi_callback, | ||
553 | .ident = "ACER ZGB", | ||
554 | .matches = { | ||
555 | DMI_MATCH(DMI_SYS_VENDOR, "ACER"), | ||
556 | DMI_MATCH(DMI_PRODUCT_NAME, "ZGB"), | ||
557 | }, | ||
558 | }, | ||
559 | { } | ||
560 | }; | ||
561 | |||
543 | void intel_crt_init(struct drm_device *dev) | 562 | void intel_crt_init(struct drm_device *dev) |
544 | { | 563 | { |
545 | struct drm_connector *connector; | 564 | struct drm_connector *connector; |
@@ -547,6 +566,10 @@ void intel_crt_init(struct drm_device *dev) | |||
547 | struct intel_connector *intel_connector; | 566 | struct intel_connector *intel_connector; |
548 | struct drm_i915_private *dev_priv = dev->dev_private; | 567 | struct drm_i915_private *dev_priv = dev->dev_private; |
549 | 568 | ||
569 | /* Skip machines without VGA that falsely report hotplug events */ | ||
570 | if (dmi_check_system(intel_no_crt)) | ||
571 | return; | ||
572 | |||
550 | crt = kzalloc(sizeof(struct intel_crt), GFP_KERNEL); | 573 | crt = kzalloc(sizeof(struct intel_crt), GFP_KERNEL); |
551 | if (!crt) | 574 | if (!crt) |
552 | return; | 575 | return; |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 2a3f707caab8..b3b51c43dad0 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -5808,12 +5808,15 @@ static int ironlake_crtc_mode_set(struct drm_crtc *crtc, | |||
5808 | if (is_lvds) { | 5808 | if (is_lvds) { |
5809 | temp = I915_READ(PCH_LVDS); | 5809 | temp = I915_READ(PCH_LVDS); |
5810 | temp |= LVDS_PORT_EN | LVDS_A0A2_CLKA_POWER_UP; | 5810 | temp |= LVDS_PORT_EN | LVDS_A0A2_CLKA_POWER_UP; |
5811 | if (HAS_PCH_CPT(dev)) | 5811 | if (HAS_PCH_CPT(dev)) { |
5812 | temp &= ~PORT_TRANS_SEL_MASK; | ||
5812 | temp |= PORT_TRANS_SEL_CPT(pipe); | 5813 | temp |= PORT_TRANS_SEL_CPT(pipe); |
5813 | else if (pipe == 1) | 5814 | } else { |
5814 | temp |= LVDS_PIPEB_SELECT; | 5815 | if (pipe == 1) |
5815 | else | 5816 | temp |= LVDS_PIPEB_SELECT; |
5816 | temp &= ~LVDS_PIPEB_SELECT; | 5817 | else |
5818 | temp &= ~LVDS_PIPEB_SELECT; | ||
5819 | } | ||
5817 | 5820 | ||
5818 | /* set the corresponsding LVDS_BORDER bit */ | 5821 | /* set the corresponsding LVDS_BORDER bit */ |
5819 | temp |= dev_priv->lvds_border_bits; | 5822 | temp |= dev_priv->lvds_border_bits; |
@@ -9025,12 +9028,9 @@ void intel_modeset_init(struct drm_device *dev) | |||
9025 | 9028 | ||
9026 | for (i = 0; i < dev_priv->num_pipe; i++) { | 9029 | for (i = 0; i < dev_priv->num_pipe; i++) { |
9027 | intel_crtc_init(dev, i); | 9030 | intel_crtc_init(dev, i); |
9028 | if (HAS_PCH_SPLIT(dev)) { | 9031 | ret = intel_plane_init(dev, i); |
9029 | ret = intel_plane_init(dev, i); | 9032 | if (ret) |
9030 | if (ret) | 9033 | DRM_DEBUG_KMS("plane %d init failed: %d\n", i, ret); |
9031 | DRM_ERROR("plane %d init failed: %d\n", | ||
9032 | i, ret); | ||
9033 | } | ||
9034 | } | 9034 | } |
9035 | 9035 | ||
9036 | /* Just disable it once at startup */ | 9036 | /* Just disable it once at startup */ |
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c index e44191132ac4..798f6e1aa544 100644 --- a/drivers/gpu/drm/i915/intel_lvds.c +++ b/drivers/gpu/drm/i915/intel_lvds.c | |||
@@ -708,6 +708,14 @@ static const struct dmi_system_id intel_no_lvds[] = { | |||
708 | }, | 708 | }, |
709 | }, | 709 | }, |
710 | { | 710 | { |
711 | .callback = intel_no_lvds_dmi_callback, | ||
712 | .ident = "Clientron E830", | ||
713 | .matches = { | ||
714 | DMI_MATCH(DMI_SYS_VENDOR, "Clientron"), | ||
715 | DMI_MATCH(DMI_PRODUCT_NAME, "E830"), | ||
716 | }, | ||
717 | }, | ||
718 | { | ||
711 | .callback = intel_no_lvds_dmi_callback, | 719 | .callback = intel_no_lvds_dmi_callback, |
712 | .ident = "Asus EeeBox PC EB1007", | 720 | .ident = "Asus EeeBox PC EB1007", |
713 | .matches = { | 721 | .matches = { |
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index 77e729d4e4f0..1ab842c6032e 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c | |||
@@ -636,6 +636,19 @@ render_ring_add_request(struct intel_ring_buffer *ring, | |||
636 | } | 636 | } |
637 | 637 | ||
638 | static u32 | 638 | static u32 |
639 | gen6_ring_get_seqno(struct intel_ring_buffer *ring) | ||
640 | { | ||
641 | struct drm_device *dev = ring->dev; | ||
642 | |||
643 | /* Workaround to force correct ordering between irq and seqno writes on | ||
644 | * ivb (and maybe also on snb) by reading from a CS register (like | ||
645 | * ACTHD) before reading the status page. */ | ||
646 | if (IS_GEN7(dev)) | ||
647 | intel_ring_get_active_head(ring); | ||
648 | return intel_read_status_page(ring, I915_GEM_HWS_INDEX); | ||
649 | } | ||
650 | |||
651 | static u32 | ||
639 | ring_get_seqno(struct intel_ring_buffer *ring) | 652 | ring_get_seqno(struct intel_ring_buffer *ring) |
640 | { | 653 | { |
641 | return intel_read_status_page(ring, I915_GEM_HWS_INDEX); | 654 | return intel_read_status_page(ring, I915_GEM_HWS_INDEX); |
@@ -792,17 +805,6 @@ ring_add_request(struct intel_ring_buffer *ring, | |||
792 | } | 805 | } |
793 | 806 | ||
794 | static bool | 807 | static bool |
795 | gen7_blt_ring_get_irq(struct intel_ring_buffer *ring) | ||
796 | { | ||
797 | /* The BLT ring on IVB appears to have broken synchronization | ||
798 | * between the seqno write and the interrupt, so that the | ||
799 | * interrupt appears first. Returning false here makes | ||
800 | * i915_wait_request() do a polling loop, instead. | ||
801 | */ | ||
802 | return false; | ||
803 | } | ||
804 | |||
805 | static bool | ||
806 | gen6_ring_get_irq(struct intel_ring_buffer *ring, u32 gflag, u32 rflag) | 808 | gen6_ring_get_irq(struct intel_ring_buffer *ring, u32 gflag, u32 rflag) |
807 | { | 809 | { |
808 | struct drm_device *dev = ring->dev; | 810 | struct drm_device *dev = ring->dev; |
@@ -811,6 +813,12 @@ gen6_ring_get_irq(struct intel_ring_buffer *ring, u32 gflag, u32 rflag) | |||
811 | if (!dev->irq_enabled) | 813 | if (!dev->irq_enabled) |
812 | return false; | 814 | return false; |
813 | 815 | ||
816 | /* It looks like we need to prevent the gt from suspending while waiting | ||
817 | * for an notifiy irq, otherwise irqs seem to get lost on at least the | ||
818 | * blt/bsd rings on ivb. */ | ||
819 | if (IS_GEN7(dev)) | ||
820 | gen6_gt_force_wake_get(dev_priv); | ||
821 | |||
814 | spin_lock(&ring->irq_lock); | 822 | spin_lock(&ring->irq_lock); |
815 | if (ring->irq_refcount++ == 0) { | 823 | if (ring->irq_refcount++ == 0) { |
816 | ring->irq_mask &= ~rflag; | 824 | ring->irq_mask &= ~rflag; |
@@ -835,6 +843,9 @@ gen6_ring_put_irq(struct intel_ring_buffer *ring, u32 gflag, u32 rflag) | |||
835 | ironlake_disable_irq(dev_priv, gflag); | 843 | ironlake_disable_irq(dev_priv, gflag); |
836 | } | 844 | } |
837 | spin_unlock(&ring->irq_lock); | 845 | spin_unlock(&ring->irq_lock); |
846 | |||
847 | if (IS_GEN7(dev)) | ||
848 | gen6_gt_force_wake_put(dev_priv); | ||
838 | } | 849 | } |
839 | 850 | ||
840 | static bool | 851 | static bool |
@@ -1341,7 +1352,7 @@ static const struct intel_ring_buffer gen6_bsd_ring = { | |||
1341 | .write_tail = gen6_bsd_ring_write_tail, | 1352 | .write_tail = gen6_bsd_ring_write_tail, |
1342 | .flush = gen6_ring_flush, | 1353 | .flush = gen6_ring_flush, |
1343 | .add_request = gen6_add_request, | 1354 | .add_request = gen6_add_request, |
1344 | .get_seqno = ring_get_seqno, | 1355 | .get_seqno = gen6_ring_get_seqno, |
1345 | .irq_get = gen6_bsd_ring_get_irq, | 1356 | .irq_get = gen6_bsd_ring_get_irq, |
1346 | .irq_put = gen6_bsd_ring_put_irq, | 1357 | .irq_put = gen6_bsd_ring_put_irq, |
1347 | .dispatch_execbuffer = gen6_ring_dispatch_execbuffer, | 1358 | .dispatch_execbuffer = gen6_ring_dispatch_execbuffer, |
@@ -1476,7 +1487,7 @@ static const struct intel_ring_buffer gen6_blt_ring = { | |||
1476 | .write_tail = ring_write_tail, | 1487 | .write_tail = ring_write_tail, |
1477 | .flush = blt_ring_flush, | 1488 | .flush = blt_ring_flush, |
1478 | .add_request = gen6_add_request, | 1489 | .add_request = gen6_add_request, |
1479 | .get_seqno = ring_get_seqno, | 1490 | .get_seqno = gen6_ring_get_seqno, |
1480 | .irq_get = blt_ring_get_irq, | 1491 | .irq_get = blt_ring_get_irq, |
1481 | .irq_put = blt_ring_put_irq, | 1492 | .irq_put = blt_ring_put_irq, |
1482 | .dispatch_execbuffer = gen6_ring_dispatch_execbuffer, | 1493 | .dispatch_execbuffer = gen6_ring_dispatch_execbuffer, |
@@ -1499,6 +1510,7 @@ int intel_init_render_ring_buffer(struct drm_device *dev) | |||
1499 | ring->flush = gen6_render_ring_flush; | 1510 | ring->flush = gen6_render_ring_flush; |
1500 | ring->irq_get = gen6_render_ring_get_irq; | 1511 | ring->irq_get = gen6_render_ring_get_irq; |
1501 | ring->irq_put = gen6_render_ring_put_irq; | 1512 | ring->irq_put = gen6_render_ring_put_irq; |
1513 | ring->get_seqno = gen6_ring_get_seqno; | ||
1502 | } else if (IS_GEN5(dev)) { | 1514 | } else if (IS_GEN5(dev)) { |
1503 | ring->add_request = pc_render_add_request; | 1515 | ring->add_request = pc_render_add_request; |
1504 | ring->get_seqno = pc_render_get_seqno; | 1516 | ring->get_seqno = pc_render_get_seqno; |
@@ -1577,8 +1589,5 @@ int intel_init_blt_ring_buffer(struct drm_device *dev) | |||
1577 | 1589 | ||
1578 | *ring = gen6_blt_ring; | 1590 | *ring = gen6_blt_ring; |
1579 | 1591 | ||
1580 | if (IS_GEN7(dev)) | ||
1581 | ring->irq_get = gen7_blt_ring_get_irq; | ||
1582 | |||
1583 | return intel_init_ring_buffer(dev, ring); | 1592 | return intel_init_ring_buffer(dev, ring); |
1584 | } | 1593 | } |
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c index f7b9268df266..e334ec33a47d 100644 --- a/drivers/gpu/drm/i915/intel_sdvo.c +++ b/drivers/gpu/drm/i915/intel_sdvo.c | |||
@@ -1066,15 +1066,13 @@ static void intel_sdvo_mode_set(struct drm_encoder *encoder, | |||
1066 | 1066 | ||
1067 | /* Set the SDVO control regs. */ | 1067 | /* Set the SDVO control regs. */ |
1068 | if (INTEL_INFO(dev)->gen >= 4) { | 1068 | if (INTEL_INFO(dev)->gen >= 4) { |
1069 | sdvox = 0; | 1069 | /* The real mode polarity is set by the SDVO commands, using |
1070 | * struct intel_sdvo_dtd. */ | ||
1071 | sdvox = SDVO_VSYNC_ACTIVE_HIGH | SDVO_HSYNC_ACTIVE_HIGH; | ||
1070 | if (intel_sdvo->is_hdmi) | 1072 | if (intel_sdvo->is_hdmi) |
1071 | sdvox |= intel_sdvo->color_range; | 1073 | sdvox |= intel_sdvo->color_range; |
1072 | if (INTEL_INFO(dev)->gen < 5) | 1074 | if (INTEL_INFO(dev)->gen < 5) |
1073 | sdvox |= SDVO_BORDER_ENABLE; | 1075 | sdvox |= SDVO_BORDER_ENABLE; |
1074 | if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC) | ||
1075 | sdvox |= SDVO_VSYNC_ACTIVE_HIGH; | ||
1076 | if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC) | ||
1077 | sdvox |= SDVO_HSYNC_ACTIVE_HIGH; | ||
1078 | } else { | 1076 | } else { |
1079 | sdvox = I915_READ(intel_sdvo->sdvo_reg); | 1077 | sdvox = I915_READ(intel_sdvo->sdvo_reg); |
1080 | switch (intel_sdvo->sdvo_reg) { | 1078 | switch (intel_sdvo->sdvo_reg) { |
diff --git a/drivers/gpu/drm/i915/intel_sprite.c b/drivers/gpu/drm/i915/intel_sprite.c index d13989fda501..2288abf88cce 100644 --- a/drivers/gpu/drm/i915/intel_sprite.c +++ b/drivers/gpu/drm/i915/intel_sprite.c | |||
@@ -466,10 +466,8 @@ intel_update_plane(struct drm_plane *plane, struct drm_crtc *crtc, | |||
466 | mutex_lock(&dev->struct_mutex); | 466 | mutex_lock(&dev->struct_mutex); |
467 | 467 | ||
468 | ret = intel_pin_and_fence_fb_obj(dev, obj, NULL); | 468 | ret = intel_pin_and_fence_fb_obj(dev, obj, NULL); |
469 | if (ret) { | 469 | if (ret) |
470 | DRM_ERROR("failed to pin object\n"); | ||
471 | goto out_unlock; | 470 | goto out_unlock; |
472 | } | ||
473 | 471 | ||
474 | intel_plane->obj = obj; | 472 | intel_plane->obj = obj; |
475 | 473 | ||
@@ -632,10 +630,8 @@ intel_plane_init(struct drm_device *dev, enum pipe pipe) | |||
632 | unsigned long possible_crtcs; | 630 | unsigned long possible_crtcs; |
633 | int ret; | 631 | int ret; |
634 | 632 | ||
635 | if (!(IS_GEN6(dev) || IS_GEN7(dev))) { | 633 | if (!(IS_GEN6(dev) || IS_GEN7(dev))) |
636 | DRM_ERROR("new plane code only for SNB+\n"); | ||
637 | return -ENODEV; | 634 | return -ENODEV; |
638 | } | ||
639 | 635 | ||
640 | intel_plane = kzalloc(sizeof(struct intel_plane), GFP_KERNEL); | 636 | intel_plane = kzalloc(sizeof(struct intel_plane), GFP_KERNEL); |
641 | if (!intel_plane) | 637 | if (!intel_plane) |
diff --git a/drivers/gpu/drm/i915/intel_tv.c b/drivers/gpu/drm/i915/intel_tv.c index f3c6a9a8b081..1571be37ce3e 100644 --- a/drivers/gpu/drm/i915/intel_tv.c +++ b/drivers/gpu/drm/i915/intel_tv.c | |||
@@ -417,7 +417,7 @@ static const struct tv_mode tv_modes[] = { | |||
417 | { | 417 | { |
418 | .name = "NTSC-M", | 418 | .name = "NTSC-M", |
419 | .clock = 108000, | 419 | .clock = 108000, |
420 | .refresh = 29970, | 420 | .refresh = 59940, |
421 | .oversample = TV_OVERSAMPLE_8X, | 421 | .oversample = TV_OVERSAMPLE_8X, |
422 | .component_only = 0, | 422 | .component_only = 0, |
423 | /* 525 Lines, 60 Fields, 15.734KHz line, Sub-Carrier 3.580MHz */ | 423 | /* 525 Lines, 60 Fields, 15.734KHz line, Sub-Carrier 3.580MHz */ |
@@ -460,7 +460,7 @@ static const struct tv_mode tv_modes[] = { | |||
460 | { | 460 | { |
461 | .name = "NTSC-443", | 461 | .name = "NTSC-443", |
462 | .clock = 108000, | 462 | .clock = 108000, |
463 | .refresh = 29970, | 463 | .refresh = 59940, |
464 | .oversample = TV_OVERSAMPLE_8X, | 464 | .oversample = TV_OVERSAMPLE_8X, |
465 | .component_only = 0, | 465 | .component_only = 0, |
466 | /* 525 Lines, 60 Fields, 15.734KHz line, Sub-Carrier 4.43MHz */ | 466 | /* 525 Lines, 60 Fields, 15.734KHz line, Sub-Carrier 4.43MHz */ |
@@ -502,7 +502,7 @@ static const struct tv_mode tv_modes[] = { | |||
502 | { | 502 | { |
503 | .name = "NTSC-J", | 503 | .name = "NTSC-J", |
504 | .clock = 108000, | 504 | .clock = 108000, |
505 | .refresh = 29970, | 505 | .refresh = 59940, |
506 | .oversample = TV_OVERSAMPLE_8X, | 506 | .oversample = TV_OVERSAMPLE_8X, |
507 | .component_only = 0, | 507 | .component_only = 0, |
508 | 508 | ||
@@ -545,7 +545,7 @@ static const struct tv_mode tv_modes[] = { | |||
545 | { | 545 | { |
546 | .name = "PAL-M", | 546 | .name = "PAL-M", |
547 | .clock = 108000, | 547 | .clock = 108000, |
548 | .refresh = 29970, | 548 | .refresh = 59940, |
549 | .oversample = TV_OVERSAMPLE_8X, | 549 | .oversample = TV_OVERSAMPLE_8X, |
550 | .component_only = 0, | 550 | .component_only = 0, |
551 | 551 | ||
@@ -589,7 +589,7 @@ static const struct tv_mode tv_modes[] = { | |||
589 | /* 625 Lines, 50 Fields, 15.625KHz line, Sub-Carrier 4.434MHz */ | 589 | /* 625 Lines, 50 Fields, 15.625KHz line, Sub-Carrier 4.434MHz */ |
590 | .name = "PAL-N", | 590 | .name = "PAL-N", |
591 | .clock = 108000, | 591 | .clock = 108000, |
592 | .refresh = 25000, | 592 | .refresh = 50000, |
593 | .oversample = TV_OVERSAMPLE_8X, | 593 | .oversample = TV_OVERSAMPLE_8X, |
594 | .component_only = 0, | 594 | .component_only = 0, |
595 | 595 | ||
@@ -634,7 +634,7 @@ static const struct tv_mode tv_modes[] = { | |||
634 | /* 625 Lines, 50 Fields, 15.625KHz line, Sub-Carrier 4.434MHz */ | 634 | /* 625 Lines, 50 Fields, 15.625KHz line, Sub-Carrier 4.434MHz */ |
635 | .name = "PAL", | 635 | .name = "PAL", |
636 | .clock = 108000, | 636 | .clock = 108000, |
637 | .refresh = 25000, | 637 | .refresh = 50000, |
638 | .oversample = TV_OVERSAMPLE_8X, | 638 | .oversample = TV_OVERSAMPLE_8X, |
639 | .component_only = 0, | 639 | .component_only = 0, |
640 | 640 | ||
@@ -674,78 +674,6 @@ static const struct tv_mode tv_modes[] = { | |||
674 | .filter_table = filter_table, | 674 | .filter_table = filter_table, |
675 | }, | 675 | }, |
676 | { | 676 | { |
677 | .name = "480p@59.94Hz", | ||
678 | .clock = 107520, | ||
679 | .refresh = 59940, | ||
680 | .oversample = TV_OVERSAMPLE_4X, | ||
681 | .component_only = 1, | ||
682 | |||
683 | .hsync_end = 64, .hblank_end = 122, | ||
684 | .hblank_start = 842, .htotal = 857, | ||
685 | |||
686 | .progressive = true, .trilevel_sync = false, | ||
687 | |||
688 | .vsync_start_f1 = 12, .vsync_start_f2 = 12, | ||
689 | .vsync_len = 12, | ||
690 | |||
691 | .veq_ena = false, | ||
692 | |||
693 | .vi_end_f1 = 44, .vi_end_f2 = 44, | ||
694 | .nbr_end = 479, | ||
695 | |||
696 | .burst_ena = false, | ||
697 | |||
698 | .filter_table = filter_table, | ||
699 | }, | ||
700 | { | ||
701 | .name = "480p@60Hz", | ||
702 | .clock = 107520, | ||
703 | .refresh = 60000, | ||
704 | .oversample = TV_OVERSAMPLE_4X, | ||
705 | .component_only = 1, | ||
706 | |||
707 | .hsync_end = 64, .hblank_end = 122, | ||
708 | .hblank_start = 842, .htotal = 856, | ||
709 | |||
710 | .progressive = true, .trilevel_sync = false, | ||
711 | |||
712 | .vsync_start_f1 = 12, .vsync_start_f2 = 12, | ||
713 | .vsync_len = 12, | ||
714 | |||
715 | .veq_ena = false, | ||
716 | |||
717 | .vi_end_f1 = 44, .vi_end_f2 = 44, | ||
718 | .nbr_end = 479, | ||
719 | |||
720 | .burst_ena = false, | ||
721 | |||
722 | .filter_table = filter_table, | ||
723 | }, | ||
724 | { | ||
725 | .name = "576p", | ||
726 | .clock = 107520, | ||
727 | .refresh = 50000, | ||
728 | .oversample = TV_OVERSAMPLE_4X, | ||
729 | .component_only = 1, | ||
730 | |||
731 | .hsync_end = 64, .hblank_end = 139, | ||
732 | .hblank_start = 859, .htotal = 863, | ||
733 | |||
734 | .progressive = true, .trilevel_sync = false, | ||
735 | |||
736 | .vsync_start_f1 = 10, .vsync_start_f2 = 10, | ||
737 | .vsync_len = 10, | ||
738 | |||
739 | .veq_ena = false, | ||
740 | |||
741 | .vi_end_f1 = 48, .vi_end_f2 = 48, | ||
742 | .nbr_end = 575, | ||
743 | |||
744 | .burst_ena = false, | ||
745 | |||
746 | .filter_table = filter_table, | ||
747 | }, | ||
748 | { | ||
749 | .name = "720p@60Hz", | 677 | .name = "720p@60Hz", |
750 | .clock = 148800, | 678 | .clock = 148800, |
751 | .refresh = 60000, | 679 | .refresh = 60000, |
@@ -770,30 +698,6 @@ static const struct tv_mode tv_modes[] = { | |||
770 | .filter_table = filter_table, | 698 | .filter_table = filter_table, |
771 | }, | 699 | }, |
772 | { | 700 | { |
773 | .name = "720p@59.94Hz", | ||
774 | .clock = 148800, | ||
775 | .refresh = 59940, | ||
776 | .oversample = TV_OVERSAMPLE_2X, | ||
777 | .component_only = 1, | ||
778 | |||
779 | .hsync_end = 80, .hblank_end = 300, | ||
780 | .hblank_start = 1580, .htotal = 1651, | ||
781 | |||
782 | .progressive = true, .trilevel_sync = true, | ||
783 | |||
784 | .vsync_start_f1 = 10, .vsync_start_f2 = 10, | ||
785 | .vsync_len = 10, | ||
786 | |||
787 | .veq_ena = false, | ||
788 | |||
789 | .vi_end_f1 = 29, .vi_end_f2 = 29, | ||
790 | .nbr_end = 719, | ||
791 | |||
792 | .burst_ena = false, | ||
793 | |||
794 | .filter_table = filter_table, | ||
795 | }, | ||
796 | { | ||
797 | .name = "720p@50Hz", | 701 | .name = "720p@50Hz", |
798 | .clock = 148800, | 702 | .clock = 148800, |
799 | .refresh = 50000, | 703 | .refresh = 50000, |
@@ -821,7 +725,7 @@ static const struct tv_mode tv_modes[] = { | |||
821 | { | 725 | { |
822 | .name = "1080i@50Hz", | 726 | .name = "1080i@50Hz", |
823 | .clock = 148800, | 727 | .clock = 148800, |
824 | .refresh = 25000, | 728 | .refresh = 50000, |
825 | .oversample = TV_OVERSAMPLE_2X, | 729 | .oversample = TV_OVERSAMPLE_2X, |
826 | .component_only = 1, | 730 | .component_only = 1, |
827 | 731 | ||
@@ -847,7 +751,7 @@ static const struct tv_mode tv_modes[] = { | |||
847 | { | 751 | { |
848 | .name = "1080i@60Hz", | 752 | .name = "1080i@60Hz", |
849 | .clock = 148800, | 753 | .clock = 148800, |
850 | .refresh = 30000, | 754 | .refresh = 60000, |
851 | .oversample = TV_OVERSAMPLE_2X, | 755 | .oversample = TV_OVERSAMPLE_2X, |
852 | .component_only = 1, | 756 | .component_only = 1, |
853 | 757 | ||
@@ -870,32 +774,6 @@ static const struct tv_mode tv_modes[] = { | |||
870 | 774 | ||
871 | .filter_table = filter_table, | 775 | .filter_table = filter_table, |
872 | }, | 776 | }, |
873 | { | ||
874 | .name = "1080i@59.94Hz", | ||
875 | .clock = 148800, | ||
876 | .refresh = 29970, | ||
877 | .oversample = TV_OVERSAMPLE_2X, | ||
878 | .component_only = 1, | ||
879 | |||
880 | .hsync_end = 88, .hblank_end = 235, | ||
881 | .hblank_start = 2155, .htotal = 2201, | ||
882 | |||
883 | .progressive = false, .trilevel_sync = true, | ||
884 | |||
885 | .vsync_start_f1 = 4, .vsync_start_f2 = 5, | ||
886 | .vsync_len = 10, | ||
887 | |||
888 | .veq_ena = true, .veq_start_f1 = 4, | ||
889 | .veq_start_f2 = 4, .veq_len = 10, | ||
890 | |||
891 | |||
892 | .vi_end_f1 = 21, .vi_end_f2 = 22, | ||
893 | .nbr_end = 539, | ||
894 | |||
895 | .burst_ena = false, | ||
896 | |||
897 | .filter_table = filter_table, | ||
898 | }, | ||
899 | }; | 777 | }; |
900 | 778 | ||
901 | static struct intel_tv *enc_to_intel_tv(struct drm_encoder *encoder) | 779 | static struct intel_tv *enc_to_intel_tv(struct drm_encoder *encoder) |
diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c index 724b41a2b9e9..ec54364ac828 100644 --- a/drivers/gpu/drm/nouveau/nouveau_bo.c +++ b/drivers/gpu/drm/nouveau/nouveau_bo.c | |||
@@ -812,6 +812,10 @@ nouveau_bo_move_ntfy(struct ttm_buffer_object *bo, struct ttm_mem_reg *new_mem) | |||
812 | struct nouveau_bo *nvbo = nouveau_bo(bo); | 812 | struct nouveau_bo *nvbo = nouveau_bo(bo); |
813 | struct nouveau_vma *vma; | 813 | struct nouveau_vma *vma; |
814 | 814 | ||
815 | /* ttm can now (stupidly) pass the driver bos it didn't create... */ | ||
816 | if (bo->destroy != nouveau_bo_del_ttm) | ||
817 | return; | ||
818 | |||
815 | list_for_each_entry(vma, &nvbo->vma_list, head) { | 819 | list_for_each_entry(vma, &nvbo->vma_list, head) { |
816 | if (new_mem && new_mem->mem_type == TTM_PL_VRAM) { | 820 | if (new_mem && new_mem->mem_type == TTM_PL_VRAM) { |
817 | nouveau_vm_map(vma, new_mem->mm_node); | 821 | nouveau_vm_map(vma, new_mem->mm_node); |
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c index 0fda830ef806..891935271d34 100644 --- a/drivers/gpu/drm/radeon/atombios_crtc.c +++ b/drivers/gpu/drm/radeon/atombios_crtc.c | |||
@@ -355,15 +355,12 @@ static void atombios_crtc_set_timing(struct drm_crtc *crtc, | |||
355 | atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); | 355 | atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); |
356 | } | 356 | } |
357 | 357 | ||
358 | static void atombios_disable_ss(struct drm_crtc *crtc) | 358 | static void atombios_disable_ss(struct radeon_device *rdev, int pll_id) |
359 | { | 359 | { |
360 | struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); | ||
361 | struct drm_device *dev = crtc->dev; | ||
362 | struct radeon_device *rdev = dev->dev_private; | ||
363 | u32 ss_cntl; | 360 | u32 ss_cntl; |
364 | 361 | ||
365 | if (ASIC_IS_DCE4(rdev)) { | 362 | if (ASIC_IS_DCE4(rdev)) { |
366 | switch (radeon_crtc->pll_id) { | 363 | switch (pll_id) { |
367 | case ATOM_PPLL1: | 364 | case ATOM_PPLL1: |
368 | ss_cntl = RREG32(EVERGREEN_P1PLL_SS_CNTL); | 365 | ss_cntl = RREG32(EVERGREEN_P1PLL_SS_CNTL); |
369 | ss_cntl &= ~EVERGREEN_PxPLL_SS_EN; | 366 | ss_cntl &= ~EVERGREEN_PxPLL_SS_EN; |
@@ -379,7 +376,7 @@ static void atombios_disable_ss(struct drm_crtc *crtc) | |||
379 | return; | 376 | return; |
380 | } | 377 | } |
381 | } else if (ASIC_IS_AVIVO(rdev)) { | 378 | } else if (ASIC_IS_AVIVO(rdev)) { |
382 | switch (radeon_crtc->pll_id) { | 379 | switch (pll_id) { |
383 | case ATOM_PPLL1: | 380 | case ATOM_PPLL1: |
384 | ss_cntl = RREG32(AVIVO_P1PLL_INT_SS_CNTL); | 381 | ss_cntl = RREG32(AVIVO_P1PLL_INT_SS_CNTL); |
385 | ss_cntl &= ~1; | 382 | ss_cntl &= ~1; |
@@ -406,13 +403,11 @@ union atom_enable_ss { | |||
406 | ENABLE_SPREAD_SPECTRUM_ON_PPLL_V3 v3; | 403 | ENABLE_SPREAD_SPECTRUM_ON_PPLL_V3 v3; |
407 | }; | 404 | }; |
408 | 405 | ||
409 | static void atombios_crtc_program_ss(struct drm_crtc *crtc, | 406 | static void atombios_crtc_program_ss(struct radeon_device *rdev, |
410 | int enable, | 407 | int enable, |
411 | int pll_id, | 408 | int pll_id, |
412 | struct radeon_atom_ss *ss) | 409 | struct radeon_atom_ss *ss) |
413 | { | 410 | { |
414 | struct drm_device *dev = crtc->dev; | ||
415 | struct radeon_device *rdev = dev->dev_private; | ||
416 | int index = GetIndexIntoMasterTable(COMMAND, EnableSpreadSpectrumOnPPLL); | 411 | int index = GetIndexIntoMasterTable(COMMAND, EnableSpreadSpectrumOnPPLL); |
417 | union atom_enable_ss args; | 412 | union atom_enable_ss args; |
418 | 413 | ||
@@ -479,7 +474,7 @@ static void atombios_crtc_program_ss(struct drm_crtc *crtc, | |||
479 | } else if (ASIC_IS_AVIVO(rdev)) { | 474 | } else if (ASIC_IS_AVIVO(rdev)) { |
480 | if ((enable == ATOM_DISABLE) || (ss->percentage == 0) || | 475 | if ((enable == ATOM_DISABLE) || (ss->percentage == 0) || |
481 | (ss->type & ATOM_EXTERNAL_SS_MASK)) { | 476 | (ss->type & ATOM_EXTERNAL_SS_MASK)) { |
482 | atombios_disable_ss(crtc); | 477 | atombios_disable_ss(rdev, pll_id); |
483 | return; | 478 | return; |
484 | } | 479 | } |
485 | args.lvds_ss_2.usSpreadSpectrumPercentage = cpu_to_le16(ss->percentage); | 480 | args.lvds_ss_2.usSpreadSpectrumPercentage = cpu_to_le16(ss->percentage); |
@@ -491,7 +486,7 @@ static void atombios_crtc_program_ss(struct drm_crtc *crtc, | |||
491 | } else { | 486 | } else { |
492 | if ((enable == ATOM_DISABLE) || (ss->percentage == 0) || | 487 | if ((enable == ATOM_DISABLE) || (ss->percentage == 0) || |
493 | (ss->type & ATOM_EXTERNAL_SS_MASK)) { | 488 | (ss->type & ATOM_EXTERNAL_SS_MASK)) { |
494 | atombios_disable_ss(crtc); | 489 | atombios_disable_ss(rdev, pll_id); |
495 | return; | 490 | return; |
496 | } | 491 | } |
497 | args.lvds_ss.usSpreadSpectrumPercentage = cpu_to_le16(ss->percentage); | 492 | args.lvds_ss.usSpreadSpectrumPercentage = cpu_to_le16(ss->percentage); |
@@ -523,6 +518,7 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc, | |||
523 | int encoder_mode = 0; | 518 | int encoder_mode = 0; |
524 | u32 dp_clock = mode->clock; | 519 | u32 dp_clock = mode->clock; |
525 | int bpc = 8; | 520 | int bpc = 8; |
521 | bool is_duallink = false; | ||
526 | 522 | ||
527 | /* reset the pll flags */ | 523 | /* reset the pll flags */ |
528 | pll->flags = 0; | 524 | pll->flags = 0; |
@@ -557,6 +553,7 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc, | |||
557 | if (connector && connector->display_info.bpc) | 553 | if (connector && connector->display_info.bpc) |
558 | bpc = connector->display_info.bpc; | 554 | bpc = connector->display_info.bpc; |
559 | encoder_mode = atombios_get_encoder_mode(encoder); | 555 | encoder_mode = atombios_get_encoder_mode(encoder); |
556 | is_duallink = radeon_dig_monitor_is_duallink(encoder, mode->clock); | ||
560 | if ((radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT | ATOM_DEVICE_DFP_SUPPORT)) || | 557 | if ((radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT | ATOM_DEVICE_DFP_SUPPORT)) || |
561 | (radeon_encoder_get_dp_bridge_encoder_id(encoder) != ENCODER_OBJECT_ID_NONE)) { | 558 | (radeon_encoder_get_dp_bridge_encoder_id(encoder) != ENCODER_OBJECT_ID_NONE)) { |
562 | if (connector) { | 559 | if (connector) { |
@@ -652,7 +649,7 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc, | |||
652 | if (dig->coherent_mode) | 649 | if (dig->coherent_mode) |
653 | args.v3.sInput.ucDispPllConfig |= | 650 | args.v3.sInput.ucDispPllConfig |= |
654 | DISPPLL_CONFIG_COHERENT_MODE; | 651 | DISPPLL_CONFIG_COHERENT_MODE; |
655 | if (mode->clock > 165000) | 652 | if (is_duallink) |
656 | args.v3.sInput.ucDispPllConfig |= | 653 | args.v3.sInput.ucDispPllConfig |= |
657 | DISPPLL_CONFIG_DUAL_LINK; | 654 | DISPPLL_CONFIG_DUAL_LINK; |
658 | } | 655 | } |
@@ -702,11 +699,9 @@ union set_pixel_clock { | |||
702 | /* on DCE5, make sure the voltage is high enough to support the | 699 | /* on DCE5, make sure the voltage is high enough to support the |
703 | * required disp clk. | 700 | * required disp clk. |
704 | */ | 701 | */ |
705 | static void atombios_crtc_set_dcpll(struct drm_crtc *crtc, | 702 | static void atombios_crtc_set_dcpll(struct radeon_device *rdev, |
706 | u32 dispclk) | 703 | u32 dispclk) |
707 | { | 704 | { |
708 | struct drm_device *dev = crtc->dev; | ||
709 | struct radeon_device *rdev = dev->dev_private; | ||
710 | u8 frev, crev; | 705 | u8 frev, crev; |
711 | int index; | 706 | int index; |
712 | union set_pixel_clock args; | 707 | union set_pixel_clock args; |
@@ -996,7 +991,7 @@ static void atombios_crtc_set_pll(struct drm_crtc *crtc, struct drm_display_mode | |||
996 | radeon_compute_pll_legacy(pll, adjusted_clock, &pll_clock, &fb_div, &frac_fb_div, | 991 | radeon_compute_pll_legacy(pll, adjusted_clock, &pll_clock, &fb_div, &frac_fb_div, |
997 | &ref_div, &post_div); | 992 | &ref_div, &post_div); |
998 | 993 | ||
999 | atombios_crtc_program_ss(crtc, ATOM_DISABLE, radeon_crtc->pll_id, &ss); | 994 | atombios_crtc_program_ss(rdev, ATOM_DISABLE, radeon_crtc->pll_id, &ss); |
1000 | 995 | ||
1001 | atombios_crtc_program_pll(crtc, radeon_crtc->crtc_id, radeon_crtc->pll_id, | 996 | atombios_crtc_program_pll(crtc, radeon_crtc->crtc_id, radeon_crtc->pll_id, |
1002 | encoder_mode, radeon_encoder->encoder_id, mode->clock, | 997 | encoder_mode, radeon_encoder->encoder_id, mode->clock, |
@@ -1019,7 +1014,7 @@ static void atombios_crtc_set_pll(struct drm_crtc *crtc, struct drm_display_mode | |||
1019 | ss.step = step_size; | 1014 | ss.step = step_size; |
1020 | } | 1015 | } |
1021 | 1016 | ||
1022 | atombios_crtc_program_ss(crtc, ATOM_ENABLE, radeon_crtc->pll_id, &ss); | 1017 | atombios_crtc_program_ss(rdev, ATOM_ENABLE, radeon_crtc->pll_id, &ss); |
1023 | } | 1018 | } |
1024 | } | 1019 | } |
1025 | 1020 | ||
@@ -1494,6 +1489,24 @@ static int radeon_atom_pick_pll(struct drm_crtc *crtc) | |||
1494 | 1489 | ||
1495 | } | 1490 | } |
1496 | 1491 | ||
1492 | void radeon_atom_dcpll_init(struct radeon_device *rdev) | ||
1493 | { | ||
1494 | /* always set DCPLL */ | ||
1495 | if (ASIC_IS_DCE4(rdev)) { | ||
1496 | struct radeon_atom_ss ss; | ||
1497 | bool ss_enabled = radeon_atombios_get_asic_ss_info(rdev, &ss, | ||
1498 | ASIC_INTERNAL_SS_ON_DCPLL, | ||
1499 | rdev->clock.default_dispclk); | ||
1500 | if (ss_enabled) | ||
1501 | atombios_crtc_program_ss(rdev, ATOM_DISABLE, ATOM_DCPLL, &ss); | ||
1502 | /* XXX: DCE5, make sure voltage, dispclk is high enough */ | ||
1503 | atombios_crtc_set_dcpll(rdev, rdev->clock.default_dispclk); | ||
1504 | if (ss_enabled) | ||
1505 | atombios_crtc_program_ss(rdev, ATOM_ENABLE, ATOM_DCPLL, &ss); | ||
1506 | } | ||
1507 | |||
1508 | } | ||
1509 | |||
1497 | int atombios_crtc_mode_set(struct drm_crtc *crtc, | 1510 | int atombios_crtc_mode_set(struct drm_crtc *crtc, |
1498 | struct drm_display_mode *mode, | 1511 | struct drm_display_mode *mode, |
1499 | struct drm_display_mode *adjusted_mode, | 1512 | struct drm_display_mode *adjusted_mode, |
@@ -1515,19 +1528,6 @@ int atombios_crtc_mode_set(struct drm_crtc *crtc, | |||
1515 | } | 1528 | } |
1516 | } | 1529 | } |
1517 | 1530 | ||
1518 | /* always set DCPLL */ | ||
1519 | if (ASIC_IS_DCE4(rdev)) { | ||
1520 | struct radeon_atom_ss ss; | ||
1521 | bool ss_enabled = radeon_atombios_get_asic_ss_info(rdev, &ss, | ||
1522 | ASIC_INTERNAL_SS_ON_DCPLL, | ||
1523 | rdev->clock.default_dispclk); | ||
1524 | if (ss_enabled) | ||
1525 | atombios_crtc_program_ss(crtc, ATOM_DISABLE, ATOM_DCPLL, &ss); | ||
1526 | /* XXX: DCE5, make sure voltage, dispclk is high enough */ | ||
1527 | atombios_crtc_set_dcpll(crtc, rdev->clock.default_dispclk); | ||
1528 | if (ss_enabled) | ||
1529 | atombios_crtc_program_ss(crtc, ATOM_ENABLE, ATOM_DCPLL, &ss); | ||
1530 | } | ||
1531 | atombios_crtc_set_pll(crtc, adjusted_mode); | 1531 | atombios_crtc_set_pll(crtc, adjusted_mode); |
1532 | 1532 | ||
1533 | if (ASIC_IS_DCE4(rdev)) | 1533 | if (ASIC_IS_DCE4(rdev)) |
diff --git a/drivers/gpu/drm/radeon/atombios_dp.c b/drivers/gpu/drm/radeon/atombios_dp.c index 6fb335a4fdda..a71557ce01dc 100644 --- a/drivers/gpu/drm/radeon/atombios_dp.c +++ b/drivers/gpu/drm/radeon/atombios_dp.c | |||
@@ -549,8 +549,8 @@ bool radeon_dp_getdpcd(struct radeon_connector *radeon_connector) | |||
549 | return false; | 549 | return false; |
550 | } | 550 | } |
551 | 551 | ||
552 | static void radeon_dp_set_panel_mode(struct drm_encoder *encoder, | 552 | int radeon_dp_get_panel_mode(struct drm_encoder *encoder, |
553 | struct drm_connector *connector) | 553 | struct drm_connector *connector) |
554 | { | 554 | { |
555 | struct drm_device *dev = encoder->dev; | 555 | struct drm_device *dev = encoder->dev; |
556 | struct radeon_device *rdev = dev->dev_private; | 556 | struct radeon_device *rdev = dev->dev_private; |
@@ -558,7 +558,7 @@ static void radeon_dp_set_panel_mode(struct drm_encoder *encoder, | |||
558 | int panel_mode = DP_PANEL_MODE_EXTERNAL_DP_MODE; | 558 | int panel_mode = DP_PANEL_MODE_EXTERNAL_DP_MODE; |
559 | 559 | ||
560 | if (!ASIC_IS_DCE4(rdev)) | 560 | if (!ASIC_IS_DCE4(rdev)) |
561 | return; | 561 | return panel_mode; |
562 | 562 | ||
563 | if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) == | 563 | if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) == |
564 | ENCODER_OBJECT_ID_NUTMEG) | 564 | ENCODER_OBJECT_ID_NUTMEG) |
@@ -572,14 +572,7 @@ static void radeon_dp_set_panel_mode(struct drm_encoder *encoder, | |||
572 | panel_mode = DP_PANEL_MODE_INTERNAL_DP2_MODE; | 572 | panel_mode = DP_PANEL_MODE_INTERNAL_DP2_MODE; |
573 | } | 573 | } |
574 | 574 | ||
575 | atombios_dig_encoder_setup(encoder, | 575 | return panel_mode; |
576 | ATOM_ENCODER_CMD_SETUP_PANEL_MODE, | ||
577 | panel_mode); | ||
578 | |||
579 | if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) && | ||
580 | (panel_mode == DP_PANEL_MODE_INTERNAL_DP2_MODE)) { | ||
581 | radeon_write_dpcd_reg(radeon_connector, DP_EDP_CONFIGURATION_SET, 1); | ||
582 | } | ||
583 | } | 576 | } |
584 | 577 | ||
585 | void radeon_dp_set_link_config(struct drm_connector *connector, | 578 | void radeon_dp_set_link_config(struct drm_connector *connector, |
@@ -717,6 +710,8 @@ static void radeon_dp_set_tp(struct radeon_dp_link_train_info *dp_info, int tp) | |||
717 | 710 | ||
718 | static int radeon_dp_link_train_init(struct radeon_dp_link_train_info *dp_info) | 711 | static int radeon_dp_link_train_init(struct radeon_dp_link_train_info *dp_info) |
719 | { | 712 | { |
713 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(dp_info->encoder); | ||
714 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; | ||
720 | u8 tmp; | 715 | u8 tmp; |
721 | 716 | ||
722 | /* power up the sink */ | 717 | /* power up the sink */ |
@@ -732,7 +727,10 @@ static int radeon_dp_link_train_init(struct radeon_dp_link_train_info *dp_info) | |||
732 | radeon_write_dpcd_reg(dp_info->radeon_connector, | 727 | radeon_write_dpcd_reg(dp_info->radeon_connector, |
733 | DP_DOWNSPREAD_CTRL, 0); | 728 | DP_DOWNSPREAD_CTRL, 0); |
734 | 729 | ||
735 | radeon_dp_set_panel_mode(dp_info->encoder, dp_info->connector); | 730 | if ((dp_info->connector->connector_type == DRM_MODE_CONNECTOR_eDP) && |
731 | (dig->panel_mode == DP_PANEL_MODE_INTERNAL_DP2_MODE)) { | ||
732 | radeon_write_dpcd_reg(dp_info->radeon_connector, DP_EDP_CONFIGURATION_SET, 1); | ||
733 | } | ||
736 | 734 | ||
737 | /* set the lane count on the sink */ | 735 | /* set the lane count on the sink */ |
738 | tmp = dp_info->dp_lane_count; | 736 | tmp = dp_info->dp_lane_count; |
diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c index f1f06ca9f1f5..b88c4608731b 100644 --- a/drivers/gpu/drm/radeon/atombios_encoders.c +++ b/drivers/gpu/drm/radeon/atombios_encoders.c | |||
@@ -57,22 +57,6 @@ static inline bool radeon_encoder_is_digital(struct drm_encoder *encoder) | |||
57 | } | 57 | } |
58 | } | 58 | } |
59 | 59 | ||
60 | static struct drm_connector * | ||
61 | radeon_get_connector_for_encoder_init(struct drm_encoder *encoder) | ||
62 | { | ||
63 | struct drm_device *dev = encoder->dev; | ||
64 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | ||
65 | struct drm_connector *connector; | ||
66 | struct radeon_connector *radeon_connector; | ||
67 | |||
68 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) { | ||
69 | radeon_connector = to_radeon_connector(connector); | ||
70 | if (radeon_encoder->devices & radeon_connector->devices) | ||
71 | return connector; | ||
72 | } | ||
73 | return NULL; | ||
74 | } | ||
75 | |||
76 | static bool radeon_atom_mode_fixup(struct drm_encoder *encoder, | 60 | static bool radeon_atom_mode_fixup(struct drm_encoder *encoder, |
77 | struct drm_display_mode *mode, | 61 | struct drm_display_mode *mode, |
78 | struct drm_display_mode *adjusted_mode) | 62 | struct drm_display_mode *adjusted_mode) |
@@ -253,7 +237,7 @@ atombios_dvo_setup(struct drm_encoder *encoder, int action) | |||
253 | /* R4xx, R5xx */ | 237 | /* R4xx, R5xx */ |
254 | args.ext_tmds.sXTmdsEncoder.ucEnable = action; | 238 | args.ext_tmds.sXTmdsEncoder.ucEnable = action; |
255 | 239 | ||
256 | if (radeon_encoder->pixel_clock > 165000) | 240 | if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) |
257 | args.ext_tmds.sXTmdsEncoder.ucMisc |= PANEL_ENCODER_MISC_DUAL; | 241 | args.ext_tmds.sXTmdsEncoder.ucMisc |= PANEL_ENCODER_MISC_DUAL; |
258 | 242 | ||
259 | args.ext_tmds.sXTmdsEncoder.ucMisc |= ATOM_PANEL_MISC_888RGB; | 243 | args.ext_tmds.sXTmdsEncoder.ucMisc |= ATOM_PANEL_MISC_888RGB; |
@@ -265,7 +249,7 @@ atombios_dvo_setup(struct drm_encoder *encoder, int action) | |||
265 | /* DFP1, CRT1, TV1 depending on the type of port */ | 249 | /* DFP1, CRT1, TV1 depending on the type of port */ |
266 | args.dvo.sDVOEncoder.ucDeviceType = ATOM_DEVICE_DFP1_INDEX; | 250 | args.dvo.sDVOEncoder.ucDeviceType = ATOM_DEVICE_DFP1_INDEX; |
267 | 251 | ||
268 | if (radeon_encoder->pixel_clock > 165000) | 252 | if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) |
269 | args.dvo.sDVOEncoder.usDevAttr.sDigAttrib.ucAttribute |= PANEL_ENCODER_MISC_DUAL; | 253 | args.dvo.sDVOEncoder.usDevAttr.sDigAttrib.ucAttribute |= PANEL_ENCODER_MISC_DUAL; |
270 | break; | 254 | break; |
271 | case 3: | 255 | case 3: |
@@ -349,7 +333,7 @@ atombios_digital_setup(struct drm_encoder *encoder, int action) | |||
349 | } else { | 333 | } else { |
350 | if (dig->linkb) | 334 | if (dig->linkb) |
351 | args.v1.ucMisc |= PANEL_ENCODER_MISC_TMDS_LINKB; | 335 | args.v1.ucMisc |= PANEL_ENCODER_MISC_TMDS_LINKB; |
352 | if (radeon_encoder->pixel_clock > 165000) | 336 | if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) |
353 | args.v1.ucMisc |= PANEL_ENCODER_MISC_DUAL; | 337 | args.v1.ucMisc |= PANEL_ENCODER_MISC_DUAL; |
354 | /*if (pScrn->rgbBits == 8) */ | 338 | /*if (pScrn->rgbBits == 8) */ |
355 | args.v1.ucMisc |= ATOM_PANEL_MISC_888RGB; | 339 | args.v1.ucMisc |= ATOM_PANEL_MISC_888RGB; |
@@ -388,7 +372,7 @@ atombios_digital_setup(struct drm_encoder *encoder, int action) | |||
388 | } else { | 372 | } else { |
389 | if (dig->linkb) | 373 | if (dig->linkb) |
390 | args.v2.ucMisc |= PANEL_ENCODER_MISC_TMDS_LINKB; | 374 | args.v2.ucMisc |= PANEL_ENCODER_MISC_TMDS_LINKB; |
391 | if (radeon_encoder->pixel_clock > 165000) | 375 | if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) |
392 | args.v2.ucMisc |= PANEL_ENCODER_MISC_DUAL; | 376 | args.v2.ucMisc |= PANEL_ENCODER_MISC_DUAL; |
393 | } | 377 | } |
394 | break; | 378 | break; |
@@ -432,7 +416,7 @@ atombios_get_encoder_mode(struct drm_encoder *encoder) | |||
432 | switch (connector->connector_type) { | 416 | switch (connector->connector_type) { |
433 | case DRM_MODE_CONNECTOR_DVII: | 417 | case DRM_MODE_CONNECTOR_DVII: |
434 | case DRM_MODE_CONNECTOR_HDMIB: /* HDMI-B is basically DL-DVI; analog works fine */ | 418 | case DRM_MODE_CONNECTOR_HDMIB: /* HDMI-B is basically DL-DVI; analog works fine */ |
435 | if (drm_detect_monitor_audio(radeon_connector->edid) && | 419 | if (drm_detect_hdmi_monitor(radeon_connector->edid) && |
436 | radeon_audio) | 420 | radeon_audio) |
437 | return ATOM_ENCODER_MODE_HDMI; | 421 | return ATOM_ENCODER_MODE_HDMI; |
438 | else if (radeon_connector->use_digital) | 422 | else if (radeon_connector->use_digital) |
@@ -443,7 +427,7 @@ atombios_get_encoder_mode(struct drm_encoder *encoder) | |||
443 | case DRM_MODE_CONNECTOR_DVID: | 427 | case DRM_MODE_CONNECTOR_DVID: |
444 | case DRM_MODE_CONNECTOR_HDMIA: | 428 | case DRM_MODE_CONNECTOR_HDMIA: |
445 | default: | 429 | default: |
446 | if (drm_detect_monitor_audio(radeon_connector->edid) && | 430 | if (drm_detect_hdmi_monitor(radeon_connector->edid) && |
447 | radeon_audio) | 431 | radeon_audio) |
448 | return ATOM_ENCODER_MODE_HDMI; | 432 | return ATOM_ENCODER_MODE_HDMI; |
449 | else | 433 | else |
@@ -457,7 +441,7 @@ atombios_get_encoder_mode(struct drm_encoder *encoder) | |||
457 | if ((dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) || | 441 | if ((dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) || |
458 | (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) | 442 | (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) |
459 | return ATOM_ENCODER_MODE_DP; | 443 | return ATOM_ENCODER_MODE_DP; |
460 | else if (drm_detect_monitor_audio(radeon_connector->edid) && | 444 | else if (drm_detect_hdmi_monitor(radeon_connector->edid) && |
461 | radeon_audio) | 445 | radeon_audio) |
462 | return ATOM_ENCODER_MODE_HDMI; | 446 | return ATOM_ENCODER_MODE_HDMI; |
463 | else | 447 | else |
@@ -587,7 +571,7 @@ atombios_dig_encoder_setup(struct drm_encoder *encoder, int action, int panel_mo | |||
587 | 571 | ||
588 | if (ENCODER_MODE_IS_DP(args.v1.ucEncoderMode)) | 572 | if (ENCODER_MODE_IS_DP(args.v1.ucEncoderMode)) |
589 | args.v1.ucLaneNum = dp_lane_count; | 573 | args.v1.ucLaneNum = dp_lane_count; |
590 | else if (radeon_encoder->pixel_clock > 165000) | 574 | else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) |
591 | args.v1.ucLaneNum = 8; | 575 | args.v1.ucLaneNum = 8; |
592 | else | 576 | else |
593 | args.v1.ucLaneNum = 4; | 577 | args.v1.ucLaneNum = 4; |
@@ -622,7 +606,7 @@ atombios_dig_encoder_setup(struct drm_encoder *encoder, int action, int panel_mo | |||
622 | 606 | ||
623 | if (ENCODER_MODE_IS_DP(args.v1.ucEncoderMode)) | 607 | if (ENCODER_MODE_IS_DP(args.v1.ucEncoderMode)) |
624 | args.v3.ucLaneNum = dp_lane_count; | 608 | args.v3.ucLaneNum = dp_lane_count; |
625 | else if (radeon_encoder->pixel_clock > 165000) | 609 | else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) |
626 | args.v3.ucLaneNum = 8; | 610 | args.v3.ucLaneNum = 8; |
627 | else | 611 | else |
628 | args.v3.ucLaneNum = 4; | 612 | args.v3.ucLaneNum = 4; |
@@ -662,7 +646,7 @@ atombios_dig_encoder_setup(struct drm_encoder *encoder, int action, int panel_mo | |||
662 | 646 | ||
663 | if (ENCODER_MODE_IS_DP(args.v1.ucEncoderMode)) | 647 | if (ENCODER_MODE_IS_DP(args.v1.ucEncoderMode)) |
664 | args.v4.ucLaneNum = dp_lane_count; | 648 | args.v4.ucLaneNum = dp_lane_count; |
665 | else if (radeon_encoder->pixel_clock > 165000) | 649 | else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) |
666 | args.v4.ucLaneNum = 8; | 650 | args.v4.ucLaneNum = 8; |
667 | else | 651 | else |
668 | args.v4.ucLaneNum = 4; | 652 | args.v4.ucLaneNum = 4; |
@@ -806,7 +790,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t | |||
806 | if (is_dp) | 790 | if (is_dp) |
807 | args.v1.usPixelClock = | 791 | args.v1.usPixelClock = |
808 | cpu_to_le16(dp_clock / 10); | 792 | cpu_to_le16(dp_clock / 10); |
809 | else if (radeon_encoder->pixel_clock > 165000) | 793 | else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) |
810 | args.v1.usPixelClock = cpu_to_le16((radeon_encoder->pixel_clock / 2) / 10); | 794 | args.v1.usPixelClock = cpu_to_le16((radeon_encoder->pixel_clock / 2) / 10); |
811 | else | 795 | else |
812 | args.v1.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10); | 796 | args.v1.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10); |
@@ -821,7 +805,8 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t | |||
821 | 805 | ||
822 | if ((rdev->flags & RADEON_IS_IGP) && | 806 | if ((rdev->flags & RADEON_IS_IGP) && |
823 | (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_UNIPHY)) { | 807 | (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_UNIPHY)) { |
824 | if (is_dp || (radeon_encoder->pixel_clock <= 165000)) { | 808 | if (is_dp || |
809 | !radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) { | ||
825 | if (igp_lane_info & 0x1) | 810 | if (igp_lane_info & 0x1) |
826 | args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LANE_0_3; | 811 | args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LANE_0_3; |
827 | else if (igp_lane_info & 0x2) | 812 | else if (igp_lane_info & 0x2) |
@@ -848,7 +833,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t | |||
848 | else if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) { | 833 | else if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) { |
849 | if (dig->coherent_mode) | 834 | if (dig->coherent_mode) |
850 | args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_COHERENT; | 835 | args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_COHERENT; |
851 | if (radeon_encoder->pixel_clock > 165000) | 836 | if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) |
852 | args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_8LANE_LINK; | 837 | args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_8LANE_LINK; |
853 | } | 838 | } |
854 | break; | 839 | break; |
@@ -863,7 +848,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t | |||
863 | if (is_dp) | 848 | if (is_dp) |
864 | args.v2.usPixelClock = | 849 | args.v2.usPixelClock = |
865 | cpu_to_le16(dp_clock / 10); | 850 | cpu_to_le16(dp_clock / 10); |
866 | else if (radeon_encoder->pixel_clock > 165000) | 851 | else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) |
867 | args.v2.usPixelClock = cpu_to_le16((radeon_encoder->pixel_clock / 2) / 10); | 852 | args.v2.usPixelClock = cpu_to_le16((radeon_encoder->pixel_clock / 2) / 10); |
868 | else | 853 | else |
869 | args.v2.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10); | 854 | args.v2.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10); |
@@ -891,7 +876,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t | |||
891 | } else if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) { | 876 | } else if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) { |
892 | if (dig->coherent_mode) | 877 | if (dig->coherent_mode) |
893 | args.v2.acConfig.fCoherentMode = 1; | 878 | args.v2.acConfig.fCoherentMode = 1; |
894 | if (radeon_encoder->pixel_clock > 165000) | 879 | if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) |
895 | args.v2.acConfig.fDualLinkConnector = 1; | 880 | args.v2.acConfig.fDualLinkConnector = 1; |
896 | } | 881 | } |
897 | break; | 882 | break; |
@@ -906,7 +891,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t | |||
906 | if (is_dp) | 891 | if (is_dp) |
907 | args.v3.usPixelClock = | 892 | args.v3.usPixelClock = |
908 | cpu_to_le16(dp_clock / 10); | 893 | cpu_to_le16(dp_clock / 10); |
909 | else if (radeon_encoder->pixel_clock > 165000) | 894 | else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) |
910 | args.v3.usPixelClock = cpu_to_le16((radeon_encoder->pixel_clock / 2) / 10); | 895 | args.v3.usPixelClock = cpu_to_le16((radeon_encoder->pixel_clock / 2) / 10); |
911 | else | 896 | else |
912 | args.v3.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10); | 897 | args.v3.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10); |
@@ -914,7 +899,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t | |||
914 | 899 | ||
915 | if (is_dp) | 900 | if (is_dp) |
916 | args.v3.ucLaneNum = dp_lane_count; | 901 | args.v3.ucLaneNum = dp_lane_count; |
917 | else if (radeon_encoder->pixel_clock > 165000) | 902 | else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) |
918 | args.v3.ucLaneNum = 8; | 903 | args.v3.ucLaneNum = 8; |
919 | else | 904 | else |
920 | args.v3.ucLaneNum = 4; | 905 | args.v3.ucLaneNum = 4; |
@@ -951,7 +936,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t | |||
951 | else if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) { | 936 | else if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) { |
952 | if (dig->coherent_mode) | 937 | if (dig->coherent_mode) |
953 | args.v3.acConfig.fCoherentMode = 1; | 938 | args.v3.acConfig.fCoherentMode = 1; |
954 | if (radeon_encoder->pixel_clock > 165000) | 939 | if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) |
955 | args.v3.acConfig.fDualLinkConnector = 1; | 940 | args.v3.acConfig.fDualLinkConnector = 1; |
956 | } | 941 | } |
957 | break; | 942 | break; |
@@ -966,7 +951,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t | |||
966 | if (is_dp) | 951 | if (is_dp) |
967 | args.v4.usPixelClock = | 952 | args.v4.usPixelClock = |
968 | cpu_to_le16(dp_clock / 10); | 953 | cpu_to_le16(dp_clock / 10); |
969 | else if (radeon_encoder->pixel_clock > 165000) | 954 | else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) |
970 | args.v4.usPixelClock = cpu_to_le16((radeon_encoder->pixel_clock / 2) / 10); | 955 | args.v4.usPixelClock = cpu_to_le16((radeon_encoder->pixel_clock / 2) / 10); |
971 | else | 956 | else |
972 | args.v4.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10); | 957 | args.v4.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10); |
@@ -974,7 +959,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t | |||
974 | 959 | ||
975 | if (is_dp) | 960 | if (is_dp) |
976 | args.v4.ucLaneNum = dp_lane_count; | 961 | args.v4.ucLaneNum = dp_lane_count; |
977 | else if (radeon_encoder->pixel_clock > 165000) | 962 | else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) |
978 | args.v4.ucLaneNum = 8; | 963 | args.v4.ucLaneNum = 8; |
979 | else | 964 | else |
980 | args.v4.ucLaneNum = 4; | 965 | args.v4.ucLaneNum = 4; |
@@ -1014,7 +999,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t | |||
1014 | else if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) { | 999 | else if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) { |
1015 | if (dig->coherent_mode) | 1000 | if (dig->coherent_mode) |
1016 | args.v4.acConfig.fCoherentMode = 1; | 1001 | args.v4.acConfig.fCoherentMode = 1; |
1017 | if (radeon_encoder->pixel_clock > 165000) | 1002 | if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) |
1018 | args.v4.acConfig.fDualLinkConnector = 1; | 1003 | args.v4.acConfig.fDualLinkConnector = 1; |
1019 | } | 1004 | } |
1020 | break; | 1005 | break; |
@@ -1137,7 +1122,7 @@ atombios_external_encoder_setup(struct drm_encoder *encoder, | |||
1137 | if (dp_clock == 270000) | 1122 | if (dp_clock == 270000) |
1138 | args.v1.sDigEncoder.ucConfig |= ATOM_ENCODER_CONFIG_DPLINKRATE_2_70GHZ; | 1123 | args.v1.sDigEncoder.ucConfig |= ATOM_ENCODER_CONFIG_DPLINKRATE_2_70GHZ; |
1139 | args.v1.sDigEncoder.ucLaneNum = dp_lane_count; | 1124 | args.v1.sDigEncoder.ucLaneNum = dp_lane_count; |
1140 | } else if (radeon_encoder->pixel_clock > 165000) | 1125 | } else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) |
1141 | args.v1.sDigEncoder.ucLaneNum = 8; | 1126 | args.v1.sDigEncoder.ucLaneNum = 8; |
1142 | else | 1127 | else |
1143 | args.v1.sDigEncoder.ucLaneNum = 4; | 1128 | args.v1.sDigEncoder.ucLaneNum = 4; |
@@ -1156,7 +1141,7 @@ atombios_external_encoder_setup(struct drm_encoder *encoder, | |||
1156 | else if (dp_clock == 540000) | 1141 | else if (dp_clock == 540000) |
1157 | args.v3.sExtEncoder.ucConfig |= EXTERNAL_ENCODER_CONFIG_V3_DPLINKRATE_5_40GHZ; | 1142 | args.v3.sExtEncoder.ucConfig |= EXTERNAL_ENCODER_CONFIG_V3_DPLINKRATE_5_40GHZ; |
1158 | args.v3.sExtEncoder.ucLaneNum = dp_lane_count; | 1143 | args.v3.sExtEncoder.ucLaneNum = dp_lane_count; |
1159 | } else if (radeon_encoder->pixel_clock > 165000) | 1144 | } else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) |
1160 | args.v3.sExtEncoder.ucLaneNum = 8; | 1145 | args.v3.sExtEncoder.ucLaneNum = 8; |
1161 | else | 1146 | else |
1162 | args.v3.sExtEncoder.ucLaneNum = 4; | 1147 | args.v3.sExtEncoder.ucLaneNum = 4; |
@@ -1341,7 +1326,8 @@ radeon_atom_encoder_dpms_dig(struct drm_encoder *encoder, int mode) | |||
1341 | switch (mode) { | 1326 | switch (mode) { |
1342 | case DRM_MODE_DPMS_ON: | 1327 | case DRM_MODE_DPMS_ON: |
1343 | /* some early dce3.2 boards have a bug in their transmitter control table */ | 1328 | /* some early dce3.2 boards have a bug in their transmitter control table */ |
1344 | if ((rdev->family == CHIP_RV710) || (rdev->family == CHIP_RV730)) | 1329 | if ((rdev->family == CHIP_RV710) || (rdev->family == CHIP_RV730) || |
1330 | ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) | ||
1345 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0); | 1331 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0); |
1346 | else | 1332 | else |
1347 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT, 0, 0); | 1333 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT, 0, 0); |
@@ -1351,8 +1337,6 @@ radeon_atom_encoder_dpms_dig(struct drm_encoder *encoder, int mode) | |||
1351 | ATOM_TRANSMITTER_ACTION_POWER_ON); | 1337 | ATOM_TRANSMITTER_ACTION_POWER_ON); |
1352 | radeon_dig_connector->edp_on = true; | 1338 | radeon_dig_connector->edp_on = true; |
1353 | } | 1339 | } |
1354 | if (ASIC_IS_DCE4(rdev)) | ||
1355 | atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_VIDEO_OFF, 0); | ||
1356 | radeon_dp_link_train(encoder, connector); | 1340 | radeon_dp_link_train(encoder, connector); |
1357 | if (ASIC_IS_DCE4(rdev)) | 1341 | if (ASIC_IS_DCE4(rdev)) |
1358 | atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_VIDEO_ON, 0); | 1342 | atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_VIDEO_ON, 0); |
@@ -1363,7 +1347,10 @@ radeon_atom_encoder_dpms_dig(struct drm_encoder *encoder, int mode) | |||
1363 | case DRM_MODE_DPMS_STANDBY: | 1347 | case DRM_MODE_DPMS_STANDBY: |
1364 | case DRM_MODE_DPMS_SUSPEND: | 1348 | case DRM_MODE_DPMS_SUSPEND: |
1365 | case DRM_MODE_DPMS_OFF: | 1349 | case DRM_MODE_DPMS_OFF: |
1366 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE_OUTPUT, 0, 0); | 1350 | if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) |
1351 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0); | ||
1352 | else | ||
1353 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE_OUTPUT, 0, 0); | ||
1367 | if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(encoder)) && connector) { | 1354 | if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(encoder)) && connector) { |
1368 | if (ASIC_IS_DCE4(rdev)) | 1355 | if (ASIC_IS_DCE4(rdev)) |
1369 | atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_VIDEO_OFF, 0); | 1356 | atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_VIDEO_OFF, 0); |
@@ -1810,7 +1797,21 @@ radeon_atom_encoder_mode_set(struct drm_encoder *encoder, | |||
1810 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: | 1797 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: |
1811 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: | 1798 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: |
1812 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: | 1799 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: |
1813 | if (ASIC_IS_DCE4(rdev)) { | 1800 | if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) { |
1801 | struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); | ||
1802 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; | ||
1803 | |||
1804 | if (!connector) | ||
1805 | dig->panel_mode = DP_PANEL_MODE_EXTERNAL_DP_MODE; | ||
1806 | else | ||
1807 | dig->panel_mode = radeon_dp_get_panel_mode(encoder, connector); | ||
1808 | |||
1809 | /* setup and enable the encoder */ | ||
1810 | atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_SETUP, 0); | ||
1811 | atombios_dig_encoder_setup(encoder, | ||
1812 | ATOM_ENCODER_CMD_SETUP_PANEL_MODE, | ||
1813 | dig->panel_mode); | ||
1814 | } else if (ASIC_IS_DCE4(rdev)) { | ||
1814 | /* disable the transmitter */ | 1815 | /* disable the transmitter */ |
1815 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0); | 1816 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0); |
1816 | /* setup and enable the encoder */ | 1817 | /* setup and enable the encoder */ |
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index 636660fca8c2..ae09fe82afbc 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c | |||
@@ -1455,6 +1455,7 @@ int evergreen_cp_resume(struct radeon_device *rdev) | |||
1455 | #endif | 1455 | #endif |
1456 | WREG32(CP_RB_CNTL, tmp); | 1456 | WREG32(CP_RB_CNTL, tmp); |
1457 | WREG32(CP_SEM_WAIT_TIMER, 0x0); | 1457 | WREG32(CP_SEM_WAIT_TIMER, 0x0); |
1458 | WREG32(CP_SEM_INCOMPLETE_TIMER_CNTL, 0x0); | ||
1458 | 1459 | ||
1459 | /* Set the write pointer delay */ | 1460 | /* Set the write pointer delay */ |
1460 | WREG32(CP_RB_WPTR_DELAY, 0); | 1461 | WREG32(CP_RB_WPTR_DELAY, 0); |
diff --git a/drivers/gpu/drm/radeon/evergreend.h b/drivers/gpu/drm/radeon/evergreend.h index b502216d42af..74713d42df29 100644 --- a/drivers/gpu/drm/radeon/evergreend.h +++ b/drivers/gpu/drm/radeon/evergreend.h | |||
@@ -108,6 +108,7 @@ | |||
108 | #define CP_RB_WPTR_ADDR_HI 0xC11C | 108 | #define CP_RB_WPTR_ADDR_HI 0xC11C |
109 | #define CP_RB_WPTR_DELAY 0x8704 | 109 | #define CP_RB_WPTR_DELAY 0x8704 |
110 | #define CP_SEM_WAIT_TIMER 0x85BC | 110 | #define CP_SEM_WAIT_TIMER 0x85BC |
111 | #define CP_SEM_INCOMPLETE_TIMER_CNTL 0x85C8 | ||
111 | #define CP_DEBUG 0xC1FC | 112 | #define CP_DEBUG 0xC1FC |
112 | 113 | ||
113 | 114 | ||
diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c index 321137295400..db09065e68fd 100644 --- a/drivers/gpu/drm/radeon/ni.c +++ b/drivers/gpu/drm/radeon/ni.c | |||
@@ -1219,6 +1219,7 @@ int cayman_cp_resume(struct radeon_device *rdev) | |||
1219 | RREG32(GRBM_SOFT_RESET); | 1219 | RREG32(GRBM_SOFT_RESET); |
1220 | 1220 | ||
1221 | WREG32(CP_SEM_WAIT_TIMER, 0x0); | 1221 | WREG32(CP_SEM_WAIT_TIMER, 0x0); |
1222 | WREG32(CP_SEM_INCOMPLETE_TIMER_CNTL, 0x0); | ||
1222 | 1223 | ||
1223 | /* Set the write pointer delay */ | 1224 | /* Set the write pointer delay */ |
1224 | WREG32(CP_RB_WPTR_DELAY, 0); | 1225 | WREG32(CP_RB_WPTR_DELAY, 0); |
diff --git a/drivers/gpu/drm/radeon/nid.h b/drivers/gpu/drm/radeon/nid.h index f9df2a645e79..9a7f3b6e02de 100644 --- a/drivers/gpu/drm/radeon/nid.h +++ b/drivers/gpu/drm/radeon/nid.h | |||
@@ -222,6 +222,7 @@ | |||
222 | #define SCRATCH_UMSK 0x8540 | 222 | #define SCRATCH_UMSK 0x8540 |
223 | #define SCRATCH_ADDR 0x8544 | 223 | #define SCRATCH_ADDR 0x8544 |
224 | #define CP_SEM_WAIT_TIMER 0x85BC | 224 | #define CP_SEM_WAIT_TIMER 0x85BC |
225 | #define CP_SEM_INCOMPLETE_TIMER_CNTL 0x85C8 | ||
225 | #define CP_COHER_CNTL2 0x85E8 | 226 | #define CP_COHER_CNTL2 0x85E8 |
226 | #define CP_ME_CNTL 0x86D8 | 227 | #define CP_ME_CNTL 0x86D8 |
227 | #define CP_ME_HALT (1 << 28) | 228 | #define CP_ME_HALT (1 << 28) |
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index 73e05cb85eca..1668ec1ee770 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
@@ -157,6 +157,47 @@ bool radeon_get_bios(struct radeon_device *rdev); | |||
157 | 157 | ||
158 | 158 | ||
159 | /* | 159 | /* |
160 | * Mutex which allows recursive locking from the same process. | ||
161 | */ | ||
162 | struct radeon_mutex { | ||
163 | struct mutex mutex; | ||
164 | struct task_struct *owner; | ||
165 | int level; | ||
166 | }; | ||
167 | |||
168 | static inline void radeon_mutex_init(struct radeon_mutex *mutex) | ||
169 | { | ||
170 | mutex_init(&mutex->mutex); | ||
171 | mutex->owner = NULL; | ||
172 | mutex->level = 0; | ||
173 | } | ||
174 | |||
175 | static inline void radeon_mutex_lock(struct radeon_mutex *mutex) | ||
176 | { | ||
177 | if (mutex_trylock(&mutex->mutex)) { | ||
178 | /* The mutex was unlocked before, so it's ours now */ | ||
179 | mutex->owner = current; | ||
180 | } else if (mutex->owner != current) { | ||
181 | /* Another process locked the mutex, take it */ | ||
182 | mutex_lock(&mutex->mutex); | ||
183 | mutex->owner = current; | ||
184 | } | ||
185 | /* Otherwise the mutex was already locked by this process */ | ||
186 | |||
187 | mutex->level++; | ||
188 | } | ||
189 | |||
190 | static inline void radeon_mutex_unlock(struct radeon_mutex *mutex) | ||
191 | { | ||
192 | if (--mutex->level > 0) | ||
193 | return; | ||
194 | |||
195 | mutex->owner = NULL; | ||
196 | mutex_unlock(&mutex->mutex); | ||
197 | } | ||
198 | |||
199 | |||
200 | /* | ||
160 | * Dummy page | 201 | * Dummy page |
161 | */ | 202 | */ |
162 | struct radeon_dummy_page { | 203 | struct radeon_dummy_page { |
@@ -598,7 +639,7 @@ struct radeon_ib { | |||
598 | * mutex protects scheduled_ibs, ready, alloc_bm | 639 | * mutex protects scheduled_ibs, ready, alloc_bm |
599 | */ | 640 | */ |
600 | struct radeon_ib_pool { | 641 | struct radeon_ib_pool { |
601 | struct mutex mutex; | 642 | struct radeon_mutex mutex; |
602 | struct radeon_sa_manager sa_manager; | 643 | struct radeon_sa_manager sa_manager; |
603 | struct radeon_ib ibs[RADEON_IB_POOL_SIZE]; | 644 | struct radeon_ib ibs[RADEON_IB_POOL_SIZE]; |
604 | bool ready; | 645 | bool ready; |
@@ -1355,47 +1396,6 @@ struct r600_vram_scratch { | |||
1355 | 1396 | ||
1356 | 1397 | ||
1357 | /* | 1398 | /* |
1358 | * Mutex which allows recursive locking from the same process. | ||
1359 | */ | ||
1360 | struct radeon_mutex { | ||
1361 | struct mutex mutex; | ||
1362 | struct task_struct *owner; | ||
1363 | int level; | ||
1364 | }; | ||
1365 | |||
1366 | static inline void radeon_mutex_init(struct radeon_mutex *mutex) | ||
1367 | { | ||
1368 | mutex_init(&mutex->mutex); | ||
1369 | mutex->owner = NULL; | ||
1370 | mutex->level = 0; | ||
1371 | } | ||
1372 | |||
1373 | static inline void radeon_mutex_lock(struct radeon_mutex *mutex) | ||
1374 | { | ||
1375 | if (mutex_trylock(&mutex->mutex)) { | ||
1376 | /* The mutex was unlocked before, so it's ours now */ | ||
1377 | mutex->owner = current; | ||
1378 | } else if (mutex->owner != current) { | ||
1379 | /* Another process locked the mutex, take it */ | ||
1380 | mutex_lock(&mutex->mutex); | ||
1381 | mutex->owner = current; | ||
1382 | } | ||
1383 | /* Otherwise the mutex was already locked by this process */ | ||
1384 | |||
1385 | mutex->level++; | ||
1386 | } | ||
1387 | |||
1388 | static inline void radeon_mutex_unlock(struct radeon_mutex *mutex) | ||
1389 | { | ||
1390 | if (--mutex->level > 0) | ||
1391 | return; | ||
1392 | |||
1393 | mutex->owner = NULL; | ||
1394 | mutex_unlock(&mutex->mutex); | ||
1395 | } | ||
1396 | |||
1397 | |||
1398 | /* | ||
1399 | * Core structure, functions and helpers. | 1399 | * Core structure, functions and helpers. |
1400 | */ | 1400 | */ |
1401 | typedef uint32_t (*radeon_rreg_t)(struct radeon_device*, uint32_t); | 1401 | typedef uint32_t (*radeon_rreg_t)(struct radeon_device*, uint32_t); |
diff --git a/drivers/gpu/drm/radeon/radeon_atpx_handler.c b/drivers/gpu/drm/radeon/radeon_atpx_handler.c index 9d95792bea3e..13ac63ba6075 100644 --- a/drivers/gpu/drm/radeon/radeon_atpx_handler.c +++ b/drivers/gpu/drm/radeon/radeon_atpx_handler.c | |||
@@ -58,9 +58,9 @@ static int radeon_atrm_call(acpi_handle atrm_handle, uint8_t *bios, | |||
58 | } | 58 | } |
59 | 59 | ||
60 | obj = (union acpi_object *)buffer.pointer; | 60 | obj = (union acpi_object *)buffer.pointer; |
61 | memcpy(bios+offset, obj->buffer.pointer, len); | 61 | memcpy(bios+offset, obj->buffer.pointer, obj->buffer.length); |
62 | kfree(buffer.pointer); | 62 | kfree(buffer.pointer); |
63 | return len; | 63 | return obj->buffer.length; |
64 | } | 64 | } |
65 | 65 | ||
66 | bool radeon_atrm_supported(struct pci_dev *pdev) | 66 | bool radeon_atrm_supported(struct pci_dev *pdev) |
diff --git a/drivers/gpu/drm/radeon/radeon_bios.c b/drivers/gpu/drm/radeon/radeon_bios.c index 229a20f10e2b..501f4881e5aa 100644 --- a/drivers/gpu/drm/radeon/radeon_bios.c +++ b/drivers/gpu/drm/radeon/radeon_bios.c | |||
@@ -120,7 +120,7 @@ static bool radeon_atrm_get_bios(struct radeon_device *rdev) | |||
120 | ret = radeon_atrm_get_bios_chunk(rdev->bios, | 120 | ret = radeon_atrm_get_bios_chunk(rdev->bios, |
121 | (i * ATRM_BIOS_PAGE), | 121 | (i * ATRM_BIOS_PAGE), |
122 | ATRM_BIOS_PAGE); | 122 | ATRM_BIOS_PAGE); |
123 | if (ret <= 0) | 123 | if (ret < ATRM_BIOS_PAGE) |
124 | break; | 124 | break; |
125 | } | 125 | } |
126 | 126 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index 0afb13bd8dca..cec51a5b69dd 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
@@ -720,7 +720,7 @@ int radeon_device_init(struct radeon_device *rdev, | |||
720 | /* mutex initialization are all done here so we | 720 | /* mutex initialization are all done here so we |
721 | * can recall function without having locking issues */ | 721 | * can recall function without having locking issues */ |
722 | radeon_mutex_init(&rdev->cs_mutex); | 722 | radeon_mutex_init(&rdev->cs_mutex); |
723 | mutex_init(&rdev->ib_pool.mutex); | 723 | radeon_mutex_init(&rdev->ib_pool.mutex); |
724 | for (i = 0; i < RADEON_NUM_RINGS; ++i) | 724 | for (i = 0; i < RADEON_NUM_RINGS; ++i) |
725 | mutex_init(&rdev->ring[i].mutex); | 725 | mutex_init(&rdev->ring[i].mutex); |
726 | mutex_init(&rdev->dc_hw_i2c_mutex); | 726 | mutex_init(&rdev->dc_hw_i2c_mutex); |
@@ -959,9 +959,11 @@ int radeon_resume_kms(struct drm_device *dev) | |||
959 | radeon_fbdev_set_suspend(rdev, 0); | 959 | radeon_fbdev_set_suspend(rdev, 0); |
960 | console_unlock(); | 960 | console_unlock(); |
961 | 961 | ||
962 | /* init dig PHYs */ | 962 | /* init dig PHYs, disp eng pll */ |
963 | if (rdev->is_atom_bios) | 963 | if (rdev->is_atom_bios) { |
964 | radeon_atom_encoder_init(rdev); | 964 | radeon_atom_encoder_init(rdev); |
965 | radeon_atom_dcpll_init(rdev); | ||
966 | } | ||
965 | /* reset hpd state */ | 967 | /* reset hpd state */ |
966 | radeon_hpd_init(rdev); | 968 | radeon_hpd_init(rdev); |
967 | /* blat the mode back in */ | 969 | /* blat the mode back in */ |
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c index d3ffc18774a6..8c49fef1ce78 100644 --- a/drivers/gpu/drm/radeon/radeon_display.c +++ b/drivers/gpu/drm/radeon/radeon_display.c | |||
@@ -1305,9 +1305,11 @@ int radeon_modeset_init(struct radeon_device *rdev) | |||
1305 | return ret; | 1305 | return ret; |
1306 | } | 1306 | } |
1307 | 1307 | ||
1308 | /* init dig PHYs */ | 1308 | /* init dig PHYs, disp eng pll */ |
1309 | if (rdev->is_atom_bios) | 1309 | if (rdev->is_atom_bios) { |
1310 | radeon_atom_encoder_init(rdev); | 1310 | radeon_atom_encoder_init(rdev); |
1311 | radeon_atom_dcpll_init(rdev); | ||
1312 | } | ||
1311 | 1313 | ||
1312 | /* initialize hpd */ | 1314 | /* initialize hpd */ |
1313 | radeon_hpd_init(rdev); | 1315 | radeon_hpd_init(rdev); |
diff --git a/drivers/gpu/drm/radeon/radeon_encoders.c b/drivers/gpu/drm/radeon/radeon_encoders.c index 4b27efa4405b..9419c51bcf50 100644 --- a/drivers/gpu/drm/radeon/radeon_encoders.c +++ b/drivers/gpu/drm/radeon/radeon_encoders.c | |||
@@ -202,6 +202,22 @@ radeon_get_connector_for_encoder(struct drm_encoder *encoder) | |||
202 | return NULL; | 202 | return NULL; |
203 | } | 203 | } |
204 | 204 | ||
205 | struct drm_connector * | ||
206 | radeon_get_connector_for_encoder_init(struct drm_encoder *encoder) | ||
207 | { | ||
208 | struct drm_device *dev = encoder->dev; | ||
209 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | ||
210 | struct drm_connector *connector; | ||
211 | struct radeon_connector *radeon_connector; | ||
212 | |||
213 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) { | ||
214 | radeon_connector = to_radeon_connector(connector); | ||
215 | if (radeon_encoder->devices & radeon_connector->devices) | ||
216 | return connector; | ||
217 | } | ||
218 | return NULL; | ||
219 | } | ||
220 | |||
205 | struct drm_encoder *radeon_get_external_encoder(struct drm_encoder *encoder) | 221 | struct drm_encoder *radeon_get_external_encoder(struct drm_encoder *encoder) |
206 | { | 222 | { |
207 | struct drm_device *dev = encoder->dev; | 223 | struct drm_device *dev = encoder->dev; |
@@ -288,3 +304,64 @@ void radeon_panel_mode_fixup(struct drm_encoder *encoder, | |||
288 | 304 | ||
289 | } | 305 | } |
290 | 306 | ||
307 | bool radeon_dig_monitor_is_duallink(struct drm_encoder *encoder, | ||
308 | u32 pixel_clock) | ||
309 | { | ||
310 | struct drm_device *dev = encoder->dev; | ||
311 | struct radeon_device *rdev = dev->dev_private; | ||
312 | struct drm_connector *connector; | ||
313 | struct radeon_connector *radeon_connector; | ||
314 | struct radeon_connector_atom_dig *dig_connector; | ||
315 | |||
316 | connector = radeon_get_connector_for_encoder(encoder); | ||
317 | /* if we don't have an active device yet, just use one of | ||
318 | * the connectors tied to the encoder. | ||
319 | */ | ||
320 | if (!connector) | ||
321 | connector = radeon_get_connector_for_encoder_init(encoder); | ||
322 | radeon_connector = to_radeon_connector(connector); | ||
323 | |||
324 | switch (connector->connector_type) { | ||
325 | case DRM_MODE_CONNECTOR_DVII: | ||
326 | case DRM_MODE_CONNECTOR_HDMIB: | ||
327 | if (radeon_connector->use_digital) { | ||
328 | /* HDMI 1.3 supports up to 340 Mhz over single link */ | ||
329 | if (ASIC_IS_DCE3(rdev) && drm_detect_hdmi_monitor(radeon_connector->edid)) { | ||
330 | if (pixel_clock > 340000) | ||
331 | return true; | ||
332 | else | ||
333 | return false; | ||
334 | } else { | ||
335 | if (pixel_clock > 165000) | ||
336 | return true; | ||
337 | else | ||
338 | return false; | ||
339 | } | ||
340 | } else | ||
341 | return false; | ||
342 | case DRM_MODE_CONNECTOR_DVID: | ||
343 | case DRM_MODE_CONNECTOR_HDMIA: | ||
344 | case DRM_MODE_CONNECTOR_DisplayPort: | ||
345 | dig_connector = radeon_connector->con_priv; | ||
346 | if ((dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) || | ||
347 | (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) | ||
348 | return false; | ||
349 | else { | ||
350 | /* HDMI 1.3 supports up to 340 Mhz over single link */ | ||
351 | if (ASIC_IS_DCE3(rdev) && drm_detect_hdmi_monitor(radeon_connector->edid)) { | ||
352 | if (pixel_clock > 340000) | ||
353 | return true; | ||
354 | else | ||
355 | return false; | ||
356 | } else { | ||
357 | if (pixel_clock > 165000) | ||
358 | return true; | ||
359 | else | ||
360 | return false; | ||
361 | } | ||
362 | } | ||
363 | default: | ||
364 | return false; | ||
365 | } | ||
366 | } | ||
367 | |||
diff --git a/drivers/gpu/drm/radeon/radeon_i2c.c b/drivers/gpu/drm/radeon/radeon_i2c.c index 7bb1b079f480..e2a393ff0c44 100644 --- a/drivers/gpu/drm/radeon/radeon_i2c.c +++ b/drivers/gpu/drm/radeon/radeon_i2c.c | |||
@@ -897,6 +897,7 @@ struct radeon_i2c_chan *radeon_i2c_create(struct drm_device *dev, | |||
897 | i2c->rec = *rec; | 897 | i2c->rec = *rec; |
898 | i2c->adapter.owner = THIS_MODULE; | 898 | i2c->adapter.owner = THIS_MODULE; |
899 | i2c->adapter.class = I2C_CLASS_DDC; | 899 | i2c->adapter.class = I2C_CLASS_DDC; |
900 | i2c->adapter.dev.parent = &dev->pdev->dev; | ||
900 | i2c->dev = dev; | 901 | i2c->dev = dev; |
901 | i2c_set_adapdata(&i2c->adapter, i2c); | 902 | i2c_set_adapdata(&i2c->adapter, i2c); |
902 | if (rec->mm_i2c || | 903 | if (rec->mm_i2c || |
diff --git a/drivers/gpu/drm/radeon/radeon_irq_kms.c b/drivers/gpu/drm/radeon/radeon_irq_kms.c index be38921bf761..66d5fe1c8174 100644 --- a/drivers/gpu/drm/radeon/radeon_irq_kms.c +++ b/drivers/gpu/drm/radeon/radeon_irq_kms.c | |||
@@ -138,6 +138,12 @@ static bool radeon_msi_ok(struct radeon_device *rdev) | |||
138 | /* Dell RS690 only seems to work with MSIs. */ | 138 | /* Dell RS690 only seems to work with MSIs. */ |
139 | if ((rdev->pdev->device == 0x791f) && | 139 | if ((rdev->pdev->device == 0x791f) && |
140 | (rdev->pdev->subsystem_vendor == 0x1028) && | 140 | (rdev->pdev->subsystem_vendor == 0x1028) && |
141 | (rdev->pdev->subsystem_device == 0x01fc)) | ||
142 | return true; | ||
143 | |||
144 | /* Dell RS690 only seems to work with MSIs. */ | ||
145 | if ((rdev->pdev->device == 0x791f) && | ||
146 | (rdev->pdev->subsystem_vendor == 0x1028) && | ||
141 | (rdev->pdev->subsystem_device == 0x01fd)) | 147 | (rdev->pdev->subsystem_device == 0x01fd)) |
142 | return true; | 148 | return true; |
143 | 149 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h index 08ff857c8fd6..4330e3253573 100644 --- a/drivers/gpu/drm/radeon/radeon_mode.h +++ b/drivers/gpu/drm/radeon/radeon_mode.h | |||
@@ -362,6 +362,7 @@ struct radeon_encoder_atom_dig { | |||
362 | struct backlight_device *bl_dev; | 362 | struct backlight_device *bl_dev; |
363 | int dpms_mode; | 363 | int dpms_mode; |
364 | uint8_t backlight_level; | 364 | uint8_t backlight_level; |
365 | int panel_mode; | ||
365 | }; | 366 | }; |
366 | 367 | ||
367 | struct radeon_encoder_atom_dac { | 368 | struct radeon_encoder_atom_dac { |
@@ -466,6 +467,10 @@ radeon_atombios_get_tv_info(struct radeon_device *rdev); | |||
466 | 467 | ||
467 | extern struct drm_connector * | 468 | extern struct drm_connector * |
468 | radeon_get_connector_for_encoder(struct drm_encoder *encoder); | 469 | radeon_get_connector_for_encoder(struct drm_encoder *encoder); |
470 | extern struct drm_connector * | ||
471 | radeon_get_connector_for_encoder_init(struct drm_encoder *encoder); | ||
472 | extern bool radeon_dig_monitor_is_duallink(struct drm_encoder *encoder, | ||
473 | u32 pixel_clock); | ||
469 | 474 | ||
470 | extern u16 radeon_encoder_get_dp_bridge_encoder_id(struct drm_encoder *encoder); | 475 | extern u16 radeon_encoder_get_dp_bridge_encoder_id(struct drm_encoder *encoder); |
471 | extern u16 radeon_connector_encoder_get_dp_bridge_encoder_id(struct drm_connector *connector); | 476 | extern u16 radeon_connector_encoder_get_dp_bridge_encoder_id(struct drm_connector *connector); |
@@ -482,8 +487,11 @@ extern void radeon_dp_link_train(struct drm_encoder *encoder, | |||
482 | extern bool radeon_dp_needs_link_train(struct radeon_connector *radeon_connector); | 487 | extern bool radeon_dp_needs_link_train(struct radeon_connector *radeon_connector); |
483 | extern u8 radeon_dp_getsinktype(struct radeon_connector *radeon_connector); | 488 | extern u8 radeon_dp_getsinktype(struct radeon_connector *radeon_connector); |
484 | extern bool radeon_dp_getdpcd(struct radeon_connector *radeon_connector); | 489 | extern bool radeon_dp_getdpcd(struct radeon_connector *radeon_connector); |
490 | extern int radeon_dp_get_panel_mode(struct drm_encoder *encoder, | ||
491 | struct drm_connector *connector); | ||
485 | extern void atombios_dig_encoder_setup(struct drm_encoder *encoder, int action, int panel_mode); | 492 | extern void atombios_dig_encoder_setup(struct drm_encoder *encoder, int action, int panel_mode); |
486 | extern void radeon_atom_encoder_init(struct radeon_device *rdev); | 493 | extern void radeon_atom_encoder_init(struct radeon_device *rdev); |
494 | extern void radeon_atom_dcpll_init(struct radeon_device *rdev); | ||
487 | extern void atombios_dig_transmitter_setup(struct drm_encoder *encoder, | 495 | extern void atombios_dig_transmitter_setup(struct drm_encoder *encoder, |
488 | int action, uint8_t lane_num, | 496 | int action, uint8_t lane_num, |
489 | uint8_t lane_set); | 497 | uint8_t lane_set); |
diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c index e8bc70933d1b..30a4c5014c8b 100644 --- a/drivers/gpu/drm/radeon/radeon_ring.c +++ b/drivers/gpu/drm/radeon/radeon_ring.c | |||
@@ -109,12 +109,12 @@ int radeon_ib_get(struct radeon_device *rdev, int ring, | |||
109 | return r; | 109 | return r; |
110 | } | 110 | } |
111 | 111 | ||
112 | mutex_lock(&rdev->ib_pool.mutex); | 112 | radeon_mutex_lock(&rdev->ib_pool.mutex); |
113 | idx = rdev->ib_pool.head_id; | 113 | idx = rdev->ib_pool.head_id; |
114 | retry: | 114 | retry: |
115 | if (cretry > 5) { | 115 | if (cretry > 5) { |
116 | dev_err(rdev->dev, "failed to get an ib after 5 retry\n"); | 116 | dev_err(rdev->dev, "failed to get an ib after 5 retry\n"); |
117 | mutex_unlock(&rdev->ib_pool.mutex); | 117 | radeon_mutex_unlock(&rdev->ib_pool.mutex); |
118 | radeon_fence_unref(&fence); | 118 | radeon_fence_unref(&fence); |
119 | return -ENOMEM; | 119 | return -ENOMEM; |
120 | } | 120 | } |
@@ -139,7 +139,7 @@ retry: | |||
139 | */ | 139 | */ |
140 | rdev->ib_pool.head_id = (1 + idx); | 140 | rdev->ib_pool.head_id = (1 + idx); |
141 | rdev->ib_pool.head_id &= (RADEON_IB_POOL_SIZE - 1); | 141 | rdev->ib_pool.head_id &= (RADEON_IB_POOL_SIZE - 1); |
142 | mutex_unlock(&rdev->ib_pool.mutex); | 142 | radeon_mutex_unlock(&rdev->ib_pool.mutex); |
143 | return 0; | 143 | return 0; |
144 | } | 144 | } |
145 | } | 145 | } |
@@ -158,7 +158,7 @@ retry: | |||
158 | } | 158 | } |
159 | idx = (idx + 1) & (RADEON_IB_POOL_SIZE - 1); | 159 | idx = (idx + 1) & (RADEON_IB_POOL_SIZE - 1); |
160 | } | 160 | } |
161 | mutex_unlock(&rdev->ib_pool.mutex); | 161 | radeon_mutex_unlock(&rdev->ib_pool.mutex); |
162 | radeon_fence_unref(&fence); | 162 | radeon_fence_unref(&fence); |
163 | return r; | 163 | return r; |
164 | } | 164 | } |
@@ -171,12 +171,12 @@ void radeon_ib_free(struct radeon_device *rdev, struct radeon_ib **ib) | |||
171 | if (tmp == NULL) { | 171 | if (tmp == NULL) { |
172 | return; | 172 | return; |
173 | } | 173 | } |
174 | mutex_lock(&rdev->ib_pool.mutex); | 174 | radeon_mutex_lock(&rdev->ib_pool.mutex); |
175 | if (tmp->fence && !tmp->fence->emitted) { | 175 | if (tmp->fence && !tmp->fence->emitted) { |
176 | radeon_sa_bo_free(rdev, &tmp->sa_bo); | 176 | radeon_sa_bo_free(rdev, &tmp->sa_bo); |
177 | radeon_fence_unref(&tmp->fence); | 177 | radeon_fence_unref(&tmp->fence); |
178 | } | 178 | } |
179 | mutex_unlock(&rdev->ib_pool.mutex); | 179 | radeon_mutex_unlock(&rdev->ib_pool.mutex); |
180 | } | 180 | } |
181 | 181 | ||
182 | int radeon_ib_schedule(struct radeon_device *rdev, struct radeon_ib *ib) | 182 | int radeon_ib_schedule(struct radeon_device *rdev, struct radeon_ib *ib) |
@@ -204,22 +204,25 @@ int radeon_ib_schedule(struct radeon_device *rdev, struct radeon_ib *ib) | |||
204 | 204 | ||
205 | int radeon_ib_pool_init(struct radeon_device *rdev) | 205 | int radeon_ib_pool_init(struct radeon_device *rdev) |
206 | { | 206 | { |
207 | struct radeon_sa_manager tmp; | ||
207 | int i, r; | 208 | int i, r; |
208 | 209 | ||
209 | mutex_lock(&rdev->ib_pool.mutex); | 210 | r = radeon_sa_bo_manager_init(rdev, &tmp, |
210 | if (rdev->ib_pool.ready) { | ||
211 | mutex_unlock(&rdev->ib_pool.mutex); | ||
212 | return 0; | ||
213 | } | ||
214 | |||
215 | r = radeon_sa_bo_manager_init(rdev, &rdev->ib_pool.sa_manager, | ||
216 | RADEON_IB_POOL_SIZE*64*1024, | 211 | RADEON_IB_POOL_SIZE*64*1024, |
217 | RADEON_GEM_DOMAIN_GTT); | 212 | RADEON_GEM_DOMAIN_GTT); |
218 | if (r) { | 213 | if (r) { |
219 | mutex_unlock(&rdev->ib_pool.mutex); | ||
220 | return r; | 214 | return r; |
221 | } | 215 | } |
222 | 216 | ||
217 | radeon_mutex_lock(&rdev->ib_pool.mutex); | ||
218 | if (rdev->ib_pool.ready) { | ||
219 | radeon_mutex_unlock(&rdev->ib_pool.mutex); | ||
220 | radeon_sa_bo_manager_fini(rdev, &tmp); | ||
221 | return 0; | ||
222 | } | ||
223 | |||
224 | rdev->ib_pool.sa_manager = tmp; | ||
225 | INIT_LIST_HEAD(&rdev->ib_pool.sa_manager.sa_bo); | ||
223 | for (i = 0; i < RADEON_IB_POOL_SIZE; i++) { | 226 | for (i = 0; i < RADEON_IB_POOL_SIZE; i++) { |
224 | rdev->ib_pool.ibs[i].fence = NULL; | 227 | rdev->ib_pool.ibs[i].fence = NULL; |
225 | rdev->ib_pool.ibs[i].idx = i; | 228 | rdev->ib_pool.ibs[i].idx = i; |
@@ -236,7 +239,7 @@ int radeon_ib_pool_init(struct radeon_device *rdev) | |||
236 | if (radeon_debugfs_ring_init(rdev)) { | 239 | if (radeon_debugfs_ring_init(rdev)) { |
237 | DRM_ERROR("Failed to register debugfs file for rings !\n"); | 240 | DRM_ERROR("Failed to register debugfs file for rings !\n"); |
238 | } | 241 | } |
239 | mutex_unlock(&rdev->ib_pool.mutex); | 242 | radeon_mutex_unlock(&rdev->ib_pool.mutex); |
240 | return 0; | 243 | return 0; |
241 | } | 244 | } |
242 | 245 | ||
@@ -244,7 +247,7 @@ void radeon_ib_pool_fini(struct radeon_device *rdev) | |||
244 | { | 247 | { |
245 | unsigned i; | 248 | unsigned i; |
246 | 249 | ||
247 | mutex_lock(&rdev->ib_pool.mutex); | 250 | radeon_mutex_lock(&rdev->ib_pool.mutex); |
248 | if (rdev->ib_pool.ready) { | 251 | if (rdev->ib_pool.ready) { |
249 | for (i = 0; i < RADEON_IB_POOL_SIZE; i++) { | 252 | for (i = 0; i < RADEON_IB_POOL_SIZE; i++) { |
250 | radeon_sa_bo_free(rdev, &rdev->ib_pool.ibs[i].sa_bo); | 253 | radeon_sa_bo_free(rdev, &rdev->ib_pool.ibs[i].sa_bo); |
@@ -253,7 +256,7 @@ void radeon_ib_pool_fini(struct radeon_device *rdev) | |||
253 | radeon_sa_bo_manager_fini(rdev, &rdev->ib_pool.sa_manager); | 256 | radeon_sa_bo_manager_fini(rdev, &rdev->ib_pool.sa_manager); |
254 | rdev->ib_pool.ready = false; | 257 | rdev->ib_pool.ready = false; |
255 | } | 258 | } |
256 | mutex_unlock(&rdev->ib_pool.mutex); | 259 | radeon_mutex_unlock(&rdev->ib_pool.mutex); |
257 | } | 260 | } |
258 | 261 | ||
259 | int radeon_ib_pool_start(struct radeon_device *rdev) | 262 | int radeon_ib_pool_start(struct radeon_device *rdev) |
diff --git a/drivers/gpu/drm/sis/sis_drv.c b/drivers/gpu/drm/sis/sis_drv.c index 06da063ece2e..573220cc5269 100644 --- a/drivers/gpu/drm/sis/sis_drv.c +++ b/drivers/gpu/drm/sis/sis_drv.c | |||
@@ -40,7 +40,6 @@ static struct pci_device_id pciidlist[] = { | |||
40 | static int sis_driver_load(struct drm_device *dev, unsigned long chipset) | 40 | static int sis_driver_load(struct drm_device *dev, unsigned long chipset) |
41 | { | 41 | { |
42 | drm_sis_private_t *dev_priv; | 42 | drm_sis_private_t *dev_priv; |
43 | int ret; | ||
44 | 43 | ||
45 | dev_priv = kzalloc(sizeof(drm_sis_private_t), GFP_KERNEL); | 44 | dev_priv = kzalloc(sizeof(drm_sis_private_t), GFP_KERNEL); |
46 | if (dev_priv == NULL) | 45 | if (dev_priv == NULL) |
@@ -50,7 +49,7 @@ static int sis_driver_load(struct drm_device *dev, unsigned long chipset) | |||
50 | dev_priv->chipset = chipset; | 49 | dev_priv->chipset = chipset; |
51 | idr_init(&dev->object_name_idr); | 50 | idr_init(&dev->object_name_idr); |
52 | 51 | ||
53 | return ret; | 52 | return 0; |
54 | } | 53 | } |
55 | 54 | ||
56 | static int sis_driver_unload(struct drm_device *dev) | 55 | static int sis_driver_unload(struct drm_device *dev) |
diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c index 2f0eab66ece6..7c3a57de8187 100644 --- a/drivers/gpu/drm/ttm/ttm_bo.c +++ b/drivers/gpu/drm/ttm/ttm_bo.c | |||
@@ -404,6 +404,9 @@ static int ttm_bo_handle_move_mem(struct ttm_buffer_object *bo, | |||
404 | } | 404 | } |
405 | } | 405 | } |
406 | 406 | ||
407 | if (bdev->driver->move_notify) | ||
408 | bdev->driver->move_notify(bo, mem); | ||
409 | |||
407 | if (!(old_man->flags & TTM_MEMTYPE_FLAG_FIXED) && | 410 | if (!(old_man->flags & TTM_MEMTYPE_FLAG_FIXED) && |
408 | !(new_man->flags & TTM_MEMTYPE_FLAG_FIXED)) | 411 | !(new_man->flags & TTM_MEMTYPE_FLAG_FIXED)) |
409 | ret = ttm_bo_move_ttm(bo, evict, no_wait_reserve, no_wait_gpu, mem); | 412 | ret = ttm_bo_move_ttm(bo, evict, no_wait_reserve, no_wait_gpu, mem); |
@@ -413,11 +416,17 @@ static int ttm_bo_handle_move_mem(struct ttm_buffer_object *bo, | |||
413 | else | 416 | else |
414 | ret = ttm_bo_move_memcpy(bo, evict, no_wait_reserve, no_wait_gpu, mem); | 417 | ret = ttm_bo_move_memcpy(bo, evict, no_wait_reserve, no_wait_gpu, mem); |
415 | 418 | ||
416 | if (ret) | 419 | if (ret) { |
417 | goto out_err; | 420 | if (bdev->driver->move_notify) { |
421 | struct ttm_mem_reg tmp_mem = *mem; | ||
422 | *mem = bo->mem; | ||
423 | bo->mem = tmp_mem; | ||
424 | bdev->driver->move_notify(bo, mem); | ||
425 | bo->mem = *mem; | ||
426 | } | ||
418 | 427 | ||
419 | if (bdev->driver->move_notify) | 428 | goto out_err; |
420 | bdev->driver->move_notify(bo, mem); | 429 | } |
421 | 430 | ||
422 | moved: | 431 | moved: |
423 | if (bo->evicted) { | 432 | if (bo->evicted) { |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c index 0af6ebdf205d..b66ef0e3cde1 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | |||
@@ -378,7 +378,7 @@ int vmw_framebuffer_create_handle(struct drm_framebuffer *fb, | |||
378 | unsigned int *handle) | 378 | unsigned int *handle) |
379 | { | 379 | { |
380 | if (handle) | 380 | if (handle) |
381 | handle = 0; | 381 | *handle = 0; |
382 | 382 | ||
383 | return 0; | 383 | return 0; |
384 | } | 384 | } |
diff --git a/drivers/hwmon/f71805f.c b/drivers/hwmon/f71805f.c index 92f949767ece..6dbfd3e516e4 100644 --- a/drivers/hwmon/f71805f.c +++ b/drivers/hwmon/f71805f.c | |||
@@ -283,11 +283,11 @@ static inline long temp_from_reg(u8 reg) | |||
283 | 283 | ||
284 | static inline u8 temp_to_reg(long val) | 284 | static inline u8 temp_to_reg(long val) |
285 | { | 285 | { |
286 | if (val < 0) | 286 | if (val <= 0) |
287 | val = 0; | 287 | return 0; |
288 | else if (val > 1000 * 0xff) | 288 | if (val >= 1000 * 0xff) |
289 | val = 0xff; | 289 | return 0xff; |
290 | return ((val + 500) / 1000); | 290 | return (val + 500) / 1000; |
291 | } | 291 | } |
292 | 292 | ||
293 | /* | 293 | /* |
diff --git a/drivers/hwmon/sht15.c b/drivers/hwmon/sht15.c index 6ddeae049058..91fdd1fe18b0 100644 --- a/drivers/hwmon/sht15.c +++ b/drivers/hwmon/sht15.c | |||
@@ -883,7 +883,7 @@ static int sht15_invalidate_voltage(struct notifier_block *nb, | |||
883 | 883 | ||
884 | static int __devinit sht15_probe(struct platform_device *pdev) | 884 | static int __devinit sht15_probe(struct platform_device *pdev) |
885 | { | 885 | { |
886 | int ret = 0; | 886 | int ret; |
887 | struct sht15_data *data = kzalloc(sizeof(*data), GFP_KERNEL); | 887 | struct sht15_data *data = kzalloc(sizeof(*data), GFP_KERNEL); |
888 | u8 status = 0; | 888 | u8 status = 0; |
889 | 889 | ||
@@ -901,6 +901,7 @@ static int __devinit sht15_probe(struct platform_device *pdev) | |||
901 | init_waitqueue_head(&data->wait_queue); | 901 | init_waitqueue_head(&data->wait_queue); |
902 | 902 | ||
903 | if (pdev->dev.platform_data == NULL) { | 903 | if (pdev->dev.platform_data == NULL) { |
904 | ret = -EINVAL; | ||
904 | dev_err(&pdev->dev, "no platform data supplied\n"); | 905 | dev_err(&pdev->dev, "no platform data supplied\n"); |
905 | goto err_free_data; | 906 | goto err_free_data; |
906 | } | 907 | } |
diff --git a/drivers/hwmon/w83627ehf.c b/drivers/hwmon/w83627ehf.c index 0e0af0445222..2dfae7d7cc5b 100644 --- a/drivers/hwmon/w83627ehf.c +++ b/drivers/hwmon/w83627ehf.c | |||
@@ -1319,6 +1319,7 @@ store_pwm_mode(struct device *dev, struct device_attribute *attr, | |||
1319 | { | 1319 | { |
1320 | struct w83627ehf_data *data = dev_get_drvdata(dev); | 1320 | struct w83627ehf_data *data = dev_get_drvdata(dev); |
1321 | struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); | 1321 | struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); |
1322 | struct w83627ehf_sio_data *sio_data = dev->platform_data; | ||
1322 | int nr = sensor_attr->index; | 1323 | int nr = sensor_attr->index; |
1323 | unsigned long val; | 1324 | unsigned long val; |
1324 | int err; | 1325 | int err; |
@@ -1330,6 +1331,11 @@ store_pwm_mode(struct device *dev, struct device_attribute *attr, | |||
1330 | 1331 | ||
1331 | if (val > 1) | 1332 | if (val > 1) |
1332 | return -EINVAL; | 1333 | return -EINVAL; |
1334 | |||
1335 | /* On NCT67766F, DC mode is only supported for pwm1 */ | ||
1336 | if (sio_data->kind == nct6776 && nr && val != 1) | ||
1337 | return -EINVAL; | ||
1338 | |||
1333 | mutex_lock(&data->update_lock); | 1339 | mutex_lock(&data->update_lock); |
1334 | reg = w83627ehf_read_value(data, W83627EHF_REG_PWM_ENABLE[nr]); | 1340 | reg = w83627ehf_read_value(data, W83627EHF_REG_PWM_ENABLE[nr]); |
1335 | data->pwm_mode[nr] = val; | 1341 | data->pwm_mode[nr] = val; |
diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c index 20bce51c2e82..54ab97bae042 100644 --- a/drivers/idle/intel_idle.c +++ b/drivers/idle/intel_idle.c | |||
@@ -527,7 +527,7 @@ int intel_idle_cpu_init(int cpu) | |||
527 | 527 | ||
528 | return 0; | 528 | return 0; |
529 | } | 529 | } |
530 | 530 | EXPORT_SYMBOL_GPL(intel_idle_cpu_init); | |
531 | 531 | ||
532 | static int __init intel_idle_init(void) | 532 | static int __init intel_idle_init(void) |
533 | { | 533 | { |
diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig index c957c344233f..9ca28fced2b9 100644 --- a/drivers/leds/Kconfig +++ b/drivers/leds/Kconfig | |||
@@ -403,6 +403,13 @@ config LEDS_MAX8997 | |||
403 | This option enables support for on-chip LED drivers on | 403 | This option enables support for on-chip LED drivers on |
404 | MAXIM MAX8997 PMIC. | 404 | MAXIM MAX8997 PMIC. |
405 | 405 | ||
406 | config LEDS_OT200 | ||
407 | tristate "LED support for the Bachmann OT200" | ||
408 | depends on LEDS_CLASS && HAS_IOMEM | ||
409 | help | ||
410 | This option enables support for the LEDs on the Bachmann OT200. | ||
411 | Say Y to enable LEDs on the Bachmann OT200. | ||
412 | |||
406 | config LEDS_TRIGGERS | 413 | config LEDS_TRIGGERS |
407 | bool "LED Trigger support" | 414 | bool "LED Trigger support" |
408 | depends on LEDS_CLASS | 415 | depends on LEDS_CLASS |
diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile index b8a9723477f0..1fc6875a8b20 100644 --- a/drivers/leds/Makefile +++ b/drivers/leds/Makefile | |||
@@ -28,6 +28,7 @@ obj-$(CONFIG_LEDS_LP5523) += leds-lp5523.o | |||
28 | obj-$(CONFIG_LEDS_TCA6507) += leds-tca6507.o | 28 | obj-$(CONFIG_LEDS_TCA6507) += leds-tca6507.o |
29 | obj-$(CONFIG_LEDS_CLEVO_MAIL) += leds-clevo-mail.o | 29 | obj-$(CONFIG_LEDS_CLEVO_MAIL) += leds-clevo-mail.o |
30 | obj-$(CONFIG_LEDS_HP6XX) += leds-hp6xx.o | 30 | obj-$(CONFIG_LEDS_HP6XX) += leds-hp6xx.o |
31 | obj-$(CONFIG_LEDS_OT200) += leds-ot200.o | ||
31 | obj-$(CONFIG_LEDS_FSG) += leds-fsg.o | 32 | obj-$(CONFIG_LEDS_FSG) += leds-fsg.o |
32 | obj-$(CONFIG_LEDS_PCA955X) += leds-pca955x.o | 33 | obj-$(CONFIG_LEDS_PCA955X) += leds-pca955x.o |
33 | obj-$(CONFIG_LEDS_DA903X) += leds-da903x.o | 34 | obj-$(CONFIG_LEDS_DA903X) += leds-da903x.o |
diff --git a/drivers/leds/leds-ot200.c b/drivers/leds/leds-ot200.c new file mode 100644 index 000000000000..c4646825a620 --- /dev/null +++ b/drivers/leds/leds-ot200.c | |||
@@ -0,0 +1,171 @@ | |||
1 | /* | ||
2 | * Bachmann ot200 leds driver. | ||
3 | * | ||
4 | * Author: Sebastian Andrzej Siewior <bigeasy@linutronix.de> | ||
5 | * Christian Gmeiner <christian.gmeiner@gmail.com> | ||
6 | * | ||
7 | * License: GPL as published by the FSF. | ||
8 | */ | ||
9 | |||
10 | #include <linux/kernel.h> | ||
11 | #include <linux/init.h> | ||
12 | #include <linux/platform_device.h> | ||
13 | #include <linux/slab.h> | ||
14 | #include <linux/leds.h> | ||
15 | #include <linux/io.h> | ||
16 | #include <linux/module.h> | ||
17 | |||
18 | |||
19 | struct ot200_led { | ||
20 | struct led_classdev cdev; | ||
21 | const char *name; | ||
22 | unsigned long port; | ||
23 | u8 mask; | ||
24 | }; | ||
25 | |||
26 | /* | ||
27 | * The device has three leds on the back panel (led_err, led_init and led_run) | ||
28 | * and can handle up to seven leds on the front panel. | ||
29 | */ | ||
30 | |||
31 | static struct ot200_led leds[] = { | ||
32 | { | ||
33 | .name = "led_run", | ||
34 | .port = 0x5a, | ||
35 | .mask = BIT(0), | ||
36 | }, | ||
37 | { | ||
38 | .name = "led_init", | ||
39 | .port = 0x5a, | ||
40 | .mask = BIT(1), | ||
41 | }, | ||
42 | { | ||
43 | .name = "led_err", | ||
44 | .port = 0x5a, | ||
45 | .mask = BIT(2), | ||
46 | }, | ||
47 | { | ||
48 | .name = "led_1", | ||
49 | .port = 0x49, | ||
50 | .mask = BIT(7), | ||
51 | }, | ||
52 | { | ||
53 | .name = "led_2", | ||
54 | .port = 0x49, | ||
55 | .mask = BIT(6), | ||
56 | }, | ||
57 | { | ||
58 | .name = "led_3", | ||
59 | .port = 0x49, | ||
60 | .mask = BIT(5), | ||
61 | }, | ||
62 | { | ||
63 | .name = "led_4", | ||
64 | .port = 0x49, | ||
65 | .mask = BIT(4), | ||
66 | }, | ||
67 | { | ||
68 | .name = "led_5", | ||
69 | .port = 0x49, | ||
70 | .mask = BIT(3), | ||
71 | }, | ||
72 | { | ||
73 | .name = "led_6", | ||
74 | .port = 0x49, | ||
75 | .mask = BIT(2), | ||
76 | }, | ||
77 | { | ||
78 | .name = "led_7", | ||
79 | .port = 0x49, | ||
80 | .mask = BIT(1), | ||
81 | } | ||
82 | }; | ||
83 | |||
84 | static DEFINE_SPINLOCK(value_lock); | ||
85 | |||
86 | /* | ||
87 | * we need to store the current led states, as it is not | ||
88 | * possible to read the current led state via inb(). | ||
89 | */ | ||
90 | static u8 leds_back; | ||
91 | static u8 leds_front; | ||
92 | |||
93 | static void ot200_led_brightness_set(struct led_classdev *led_cdev, | ||
94 | enum led_brightness value) | ||
95 | { | ||
96 | struct ot200_led *led = container_of(led_cdev, struct ot200_led, cdev); | ||
97 | u8 *val; | ||
98 | unsigned long flags; | ||
99 | |||
100 | spin_lock_irqsave(&value_lock, flags); | ||
101 | |||
102 | if (led->port == 0x49) | ||
103 | val = &leds_front; | ||
104 | else if (led->port == 0x5a) | ||
105 | val = &leds_back; | ||
106 | else | ||
107 | BUG(); | ||
108 | |||
109 | if (value == LED_OFF) | ||
110 | *val &= ~led->mask; | ||
111 | else | ||
112 | *val |= led->mask; | ||
113 | |||
114 | outb(*val, led->port); | ||
115 | spin_unlock_irqrestore(&value_lock, flags); | ||
116 | } | ||
117 | |||
118 | static int __devinit ot200_led_probe(struct platform_device *pdev) | ||
119 | { | ||
120 | int i; | ||
121 | int ret; | ||
122 | |||
123 | for (i = 0; i < ARRAY_SIZE(leds); i++) { | ||
124 | |||
125 | leds[i].cdev.name = leds[i].name; | ||
126 | leds[i].cdev.brightness_set = ot200_led_brightness_set; | ||
127 | |||
128 | ret = led_classdev_register(&pdev->dev, &leds[i].cdev); | ||
129 | if (ret < 0) | ||
130 | goto err; | ||
131 | } | ||
132 | |||
133 | leds_front = 0; /* turn off all front leds */ | ||
134 | leds_back = BIT(1); /* turn on init led */ | ||
135 | outb(leds_front, 0x49); | ||
136 | outb(leds_back, 0x5a); | ||
137 | |||
138 | return 0; | ||
139 | |||
140 | err: | ||
141 | for (i = i - 1; i >= 0; i--) | ||
142 | led_classdev_unregister(&leds[i].cdev); | ||
143 | |||
144 | return ret; | ||
145 | } | ||
146 | |||
147 | static int __devexit ot200_led_remove(struct platform_device *pdev) | ||
148 | { | ||
149 | int i; | ||
150 | |||
151 | for (i = 0; i < ARRAY_SIZE(leds); i++) | ||
152 | led_classdev_unregister(&leds[i].cdev); | ||
153 | |||
154 | return 0; | ||
155 | } | ||
156 | |||
157 | static struct platform_driver ot200_led_driver = { | ||
158 | .probe = ot200_led_probe, | ||
159 | .remove = __devexit_p(ot200_led_remove), | ||
160 | .driver = { | ||
161 | .name = "leds-ot200", | ||
162 | .owner = THIS_MODULE, | ||
163 | }, | ||
164 | }; | ||
165 | |||
166 | module_platform_driver(ot200_led_driver); | ||
167 | |||
168 | MODULE_AUTHOR("Sebastian A. Siewior <bigeasy@linutronix.de>"); | ||
169 | MODULE_DESCRIPTION("ot200 LED driver"); | ||
170 | MODULE_LICENSE("GPL"); | ||
171 | MODULE_ALIAS("platform:leds-ot200"); | ||
diff --git a/drivers/media/dvb/dvb-usb/anysee.c b/drivers/media/dvb/dvb-usb/anysee.c index 1455e2644ab5..cf0c318d6989 100644 --- a/drivers/media/dvb/dvb-usb/anysee.c +++ b/drivers/media/dvb/dvb-usb/anysee.c | |||
@@ -887,8 +887,7 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap) | |||
887 | 887 | ||
888 | /* attach demod */ | 888 | /* attach demod */ |
889 | adap->fe_adap[state->fe_id].fe = dvb_attach(cxd2820r_attach, | 889 | adap->fe_adap[state->fe_id].fe = dvb_attach(cxd2820r_attach, |
890 | &anysee_cxd2820r_config, &adap->dev->i2c_adap, | 890 | &anysee_cxd2820r_config, &adap->dev->i2c_adap); |
891 | NULL); | ||
892 | 891 | ||
893 | state->has_ci = true; | 892 | state->has_ci = true; |
894 | 893 | ||
@@ -1189,6 +1188,14 @@ static int anysee_ci_init(struct dvb_usb_device *d) | |||
1189 | if (ret) | 1188 | if (ret) |
1190 | return ret; | 1189 | return ret; |
1191 | 1190 | ||
1191 | ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 2)|(0 << 1)|(0 << 0), 0x07); | ||
1192 | if (ret) | ||
1193 | return ret; | ||
1194 | |||
1195 | ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 2)|(1 << 1)|(1 << 0), 0x07); | ||
1196 | if (ret) | ||
1197 | return ret; | ||
1198 | |||
1192 | ret = dvb_ca_en50221_init(&d->adapter[0].dvb_adap, &state->ci, 0, 1); | 1199 | ret = dvb_ca_en50221_init(&d->adapter[0].dvb_adap, &state->ci, 0, 1); |
1193 | if (ret) | 1200 | if (ret) |
1194 | return ret; | 1201 | return ret; |
diff --git a/drivers/media/dvb/dvb-usb/cinergyT2-fe.c b/drivers/media/dvb/dvb-usb/cinergyT2-fe.c index 8a57ed8272de..1efc028a76c9 100644 --- a/drivers/media/dvb/dvb-usb/cinergyT2-fe.c +++ b/drivers/media/dvb/dvb-usb/cinergyT2-fe.c | |||
@@ -276,14 +276,15 @@ static int cinergyt2_fe_set_frontend(struct dvb_frontend *fe) | |||
276 | param.flags = 0; | 276 | param.flags = 0; |
277 | 277 | ||
278 | switch (fep->bandwidth_hz) { | 278 | switch (fep->bandwidth_hz) { |
279 | default: | ||
279 | case 8000000: | 280 | case 8000000: |
280 | param.bandwidth = 0; | 281 | param.bandwidth = 8; |
281 | break; | 282 | break; |
282 | case 7000000: | 283 | case 7000000: |
283 | param.bandwidth = 1; | 284 | param.bandwidth = 7; |
284 | break; | 285 | break; |
285 | case 6000000: | 286 | case 6000000: |
286 | param.bandwidth = 2; | 287 | param.bandwidth = 6; |
287 | break; | 288 | break; |
288 | } | 289 | } |
289 | 290 | ||
diff --git a/drivers/media/dvb/frontends/cxd2820r.h b/drivers/media/dvb/frontends/cxd2820r.h index cf0f546aa1d1..5aa306ebb7ef 100644 --- a/drivers/media/dvb/frontends/cxd2820r.h +++ b/drivers/media/dvb/frontends/cxd2820r.h | |||
@@ -77,14 +77,12 @@ struct cxd2820r_config { | |||
77 | (defined(CONFIG_DVB_CXD2820R_MODULE) && defined(MODULE)) | 77 | (defined(CONFIG_DVB_CXD2820R_MODULE) && defined(MODULE)) |
78 | extern struct dvb_frontend *cxd2820r_attach( | 78 | extern struct dvb_frontend *cxd2820r_attach( |
79 | const struct cxd2820r_config *config, | 79 | const struct cxd2820r_config *config, |
80 | struct i2c_adapter *i2c, | 80 | struct i2c_adapter *i2c |
81 | struct dvb_frontend *fe | ||
82 | ); | 81 | ); |
83 | #else | 82 | #else |
84 | static inline struct dvb_frontend *cxd2820r_attach( | 83 | static inline struct dvb_frontend *cxd2820r_attach( |
85 | const struct cxd2820r_config *config, | 84 | const struct cxd2820r_config *config, |
86 | struct i2c_adapter *i2c, | 85 | struct i2c_adapter *i2c |
87 | struct dvb_frontend *fe | ||
88 | ) | 86 | ) |
89 | { | 87 | { |
90 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); | 88 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); |
diff --git a/drivers/media/dvb/frontends/cxd2820r_core.c b/drivers/media/dvb/frontends/cxd2820r_core.c index caae7f79c837..5c7c2aaf9bf5 100644 --- a/drivers/media/dvb/frontends/cxd2820r_core.c +++ b/drivers/media/dvb/frontends/cxd2820r_core.c | |||
@@ -482,10 +482,19 @@ static enum dvbfe_search cxd2820r_search(struct dvb_frontend *fe) | |||
482 | 482 | ||
483 | /* switch between DVB-T and DVB-T2 when tune fails */ | 483 | /* switch between DVB-T and DVB-T2 when tune fails */ |
484 | if (priv->last_tune_failed) { | 484 | if (priv->last_tune_failed) { |
485 | if (priv->delivery_system == SYS_DVBT) | 485 | if (priv->delivery_system == SYS_DVBT) { |
486 | ret = cxd2820r_sleep_t(fe); | ||
487 | if (ret) | ||
488 | goto error; | ||
489 | |||
486 | c->delivery_system = SYS_DVBT2; | 490 | c->delivery_system = SYS_DVBT2; |
487 | else if (priv->delivery_system == SYS_DVBT2) | 491 | } else if (priv->delivery_system == SYS_DVBT2) { |
492 | ret = cxd2820r_sleep_t2(fe); | ||
493 | if (ret) | ||
494 | goto error; | ||
495 | |||
488 | c->delivery_system = SYS_DVBT; | 496 | c->delivery_system = SYS_DVBT; |
497 | } | ||
489 | } | 498 | } |
490 | 499 | ||
491 | /* set frontend */ | 500 | /* set frontend */ |
@@ -562,7 +571,7 @@ static const struct dvb_frontend_ops cxd2820r_ops = { | |||
562 | .delsys = { SYS_DVBT, SYS_DVBT2, SYS_DVBC_ANNEX_A }, | 571 | .delsys = { SYS_DVBT, SYS_DVBT2, SYS_DVBC_ANNEX_A }, |
563 | /* default: DVB-T/T2 */ | 572 | /* default: DVB-T/T2 */ |
564 | .info = { | 573 | .info = { |
565 | .name = "Sony CXD2820R (DVB-T/T2)", | 574 | .name = "Sony CXD2820R", |
566 | 575 | ||
567 | .caps = FE_CAN_FEC_1_2 | | 576 | .caps = FE_CAN_FEC_1_2 | |
568 | FE_CAN_FEC_2_3 | | 577 | FE_CAN_FEC_2_3 | |
@@ -572,7 +581,9 @@ static const struct dvb_frontend_ops cxd2820r_ops = { | |||
572 | FE_CAN_FEC_AUTO | | 581 | FE_CAN_FEC_AUTO | |
573 | FE_CAN_QPSK | | 582 | FE_CAN_QPSK | |
574 | FE_CAN_QAM_16 | | 583 | FE_CAN_QAM_16 | |
584 | FE_CAN_QAM_32 | | ||
575 | FE_CAN_QAM_64 | | 585 | FE_CAN_QAM_64 | |
586 | FE_CAN_QAM_128 | | ||
576 | FE_CAN_QAM_256 | | 587 | FE_CAN_QAM_256 | |
577 | FE_CAN_QAM_AUTO | | 588 | FE_CAN_QAM_AUTO | |
578 | FE_CAN_TRANSMISSION_MODE_AUTO | | 589 | FE_CAN_TRANSMISSION_MODE_AUTO | |
@@ -602,8 +613,7 @@ static const struct dvb_frontend_ops cxd2820r_ops = { | |||
602 | }; | 613 | }; |
603 | 614 | ||
604 | struct dvb_frontend *cxd2820r_attach(const struct cxd2820r_config *cfg, | 615 | struct dvb_frontend *cxd2820r_attach(const struct cxd2820r_config *cfg, |
605 | struct i2c_adapter *i2c, | 616 | struct i2c_adapter *i2c) |
606 | struct dvb_frontend *fe) | ||
607 | { | 617 | { |
608 | struct cxd2820r_priv *priv = NULL; | 618 | struct cxd2820r_priv *priv = NULL; |
609 | int ret; | 619 | int ret; |
diff --git a/drivers/media/video/atmel-isi.c b/drivers/media/video/atmel-isi.c index 9fe4519176a4..ec3f6a06f9c3 100644 --- a/drivers/media/video/atmel-isi.c +++ b/drivers/media/video/atmel-isi.c | |||
@@ -922,7 +922,9 @@ static int __devexit atmel_isi_remove(struct platform_device *pdev) | |||
922 | isi->fb_descriptors_phys); | 922 | isi->fb_descriptors_phys); |
923 | 923 | ||
924 | iounmap(isi->regs); | 924 | iounmap(isi->regs); |
925 | clk_unprepare(isi->mck); | ||
925 | clk_put(isi->mck); | 926 | clk_put(isi->mck); |
927 | clk_unprepare(isi->pclk); | ||
926 | clk_put(isi->pclk); | 928 | clk_put(isi->pclk); |
927 | kfree(isi); | 929 | kfree(isi); |
928 | 930 | ||
@@ -955,6 +957,10 @@ static int __devinit atmel_isi_probe(struct platform_device *pdev) | |||
955 | if (IS_ERR(pclk)) | 957 | if (IS_ERR(pclk)) |
956 | return PTR_ERR(pclk); | 958 | return PTR_ERR(pclk); |
957 | 959 | ||
960 | ret = clk_prepare(pclk); | ||
961 | if (ret) | ||
962 | goto err_clk_prepare_pclk; | ||
963 | |||
958 | isi = kzalloc(sizeof(struct atmel_isi), GFP_KERNEL); | 964 | isi = kzalloc(sizeof(struct atmel_isi), GFP_KERNEL); |
959 | if (!isi) { | 965 | if (!isi) { |
960 | ret = -ENOMEM; | 966 | ret = -ENOMEM; |
@@ -978,6 +984,10 @@ static int __devinit atmel_isi_probe(struct platform_device *pdev) | |||
978 | goto err_clk_get; | 984 | goto err_clk_get; |
979 | } | 985 | } |
980 | 986 | ||
987 | ret = clk_prepare(isi->mck); | ||
988 | if (ret) | ||
989 | goto err_clk_prepare_mck; | ||
990 | |||
981 | /* Set ISI_MCK's frequency, it should be faster than pixel clock */ | 991 | /* Set ISI_MCK's frequency, it should be faster than pixel clock */ |
982 | ret = clk_set_rate(isi->mck, pdata->mck_hz); | 992 | ret = clk_set_rate(isi->mck, pdata->mck_hz); |
983 | if (ret < 0) | 993 | if (ret < 0) |
@@ -1059,10 +1069,14 @@ err_alloc_ctx: | |||
1059 | isi->fb_descriptors_phys); | 1069 | isi->fb_descriptors_phys); |
1060 | err_alloc_descriptors: | 1070 | err_alloc_descriptors: |
1061 | err_set_mck_rate: | 1071 | err_set_mck_rate: |
1072 | clk_unprepare(isi->mck); | ||
1073 | err_clk_prepare_mck: | ||
1062 | clk_put(isi->mck); | 1074 | clk_put(isi->mck); |
1063 | err_clk_get: | 1075 | err_clk_get: |
1064 | kfree(isi); | 1076 | kfree(isi); |
1065 | err_alloc_isi: | 1077 | err_alloc_isi: |
1078 | clk_unprepare(pclk); | ||
1079 | err_clk_prepare_pclk: | ||
1066 | clk_put(pclk); | 1080 | clk_put(pclk); |
1067 | 1081 | ||
1068 | return ret; | 1082 | return ret; |
diff --git a/drivers/media/video/em28xx/em28xx-dvb.c b/drivers/media/video/em28xx/em28xx-dvb.c index 9449423098e0..aabbf4854f66 100644 --- a/drivers/media/video/em28xx/em28xx-dvb.c +++ b/drivers/media/video/em28xx/em28xx-dvb.c | |||
@@ -853,8 +853,7 @@ static int em28xx_dvb_init(struct em28xx *dev) | |||
853 | case EM28174_BOARD_PCTV_290E: | 853 | case EM28174_BOARD_PCTV_290E: |
854 | dvb->fe[0] = dvb_attach(cxd2820r_attach, | 854 | dvb->fe[0] = dvb_attach(cxd2820r_attach, |
855 | &em28xx_cxd2820r_config, | 855 | &em28xx_cxd2820r_config, |
856 | &dev->i2c_adap, | 856 | &dev->i2c_adap); |
857 | NULL); | ||
858 | if (dvb->fe[0]) { | 857 | if (dvb->fe[0]) { |
859 | /* FE 0 attach tuner */ | 858 | /* FE 0 attach tuner */ |
860 | if (!dvb_attach(tda18271_attach, | 859 | if (!dvb_attach(tda18271_attach, |
diff --git a/drivers/mfd/mcp-core.c b/drivers/mfd/mcp-core.c index 63be60bc3455..86cc3f7841cd 100644 --- a/drivers/mfd/mcp-core.c +++ b/drivers/mfd/mcp-core.c | |||
@@ -26,35 +26,9 @@ | |||
26 | #define to_mcp(d) container_of(d, struct mcp, attached_device) | 26 | #define to_mcp(d) container_of(d, struct mcp, attached_device) |
27 | #define to_mcp_driver(d) container_of(d, struct mcp_driver, drv) | 27 | #define to_mcp_driver(d) container_of(d, struct mcp_driver, drv) |
28 | 28 | ||
29 | static const struct mcp_device_id *mcp_match_id(const struct mcp_device_id *id, | ||
30 | const char *codec) | ||
31 | { | ||
32 | while (id->name[0]) { | ||
33 | if (strcmp(codec, id->name) == 0) | ||
34 | return id; | ||
35 | id++; | ||
36 | } | ||
37 | return NULL; | ||
38 | } | ||
39 | |||
40 | const struct mcp_device_id *mcp_get_device_id(const struct mcp *mcp) | ||
41 | { | ||
42 | const struct mcp_driver *driver = | ||
43 | to_mcp_driver(mcp->attached_device.driver); | ||
44 | |||
45 | return mcp_match_id(driver->id_table, mcp->codec); | ||
46 | } | ||
47 | EXPORT_SYMBOL(mcp_get_device_id); | ||
48 | |||
49 | static int mcp_bus_match(struct device *dev, struct device_driver *drv) | 29 | static int mcp_bus_match(struct device *dev, struct device_driver *drv) |
50 | { | 30 | { |
51 | const struct mcp *mcp = to_mcp(dev); | 31 | return 1; |
52 | const struct mcp_driver *driver = to_mcp_driver(drv); | ||
53 | |||
54 | if (driver->id_table) | ||
55 | return !!mcp_match_id(driver->id_table, mcp->codec); | ||
56 | |||
57 | return 0; | ||
58 | } | 32 | } |
59 | 33 | ||
60 | static int mcp_bus_probe(struct device *dev) | 34 | static int mcp_bus_probe(struct device *dev) |
@@ -100,18 +74,9 @@ static int mcp_bus_resume(struct device *dev) | |||
100 | return ret; | 74 | return ret; |
101 | } | 75 | } |
102 | 76 | ||
103 | static int mcp_bus_uevent(struct device *dev, struct kobj_uevent_env *env) | ||
104 | { | ||
105 | struct mcp *mcp = to_mcp(dev); | ||
106 | |||
107 | add_uevent_var(env, "MODALIAS=%s%s", MCP_MODULE_PREFIX, mcp->codec); | ||
108 | return 0; | ||
109 | } | ||
110 | |||
111 | static struct bus_type mcp_bus_type = { | 77 | static struct bus_type mcp_bus_type = { |
112 | .name = "mcp", | 78 | .name = "mcp", |
113 | .match = mcp_bus_match, | 79 | .match = mcp_bus_match, |
114 | .uevent = mcp_bus_uevent, | ||
115 | .probe = mcp_bus_probe, | 80 | .probe = mcp_bus_probe, |
116 | .remove = mcp_bus_remove, | 81 | .remove = mcp_bus_remove, |
117 | .suspend = mcp_bus_suspend, | 82 | .suspend = mcp_bus_suspend, |
@@ -128,9 +93,11 @@ static struct bus_type mcp_bus_type = { | |||
128 | */ | 93 | */ |
129 | void mcp_set_telecom_divisor(struct mcp *mcp, unsigned int div) | 94 | void mcp_set_telecom_divisor(struct mcp *mcp, unsigned int div) |
130 | { | 95 | { |
131 | spin_lock_irq(&mcp->lock); | 96 | unsigned long flags; |
97 | |||
98 | spin_lock_irqsave(&mcp->lock, flags); | ||
132 | mcp->ops->set_telecom_divisor(mcp, div); | 99 | mcp->ops->set_telecom_divisor(mcp, div); |
133 | spin_unlock_irq(&mcp->lock); | 100 | spin_unlock_irqrestore(&mcp->lock, flags); |
134 | } | 101 | } |
135 | EXPORT_SYMBOL(mcp_set_telecom_divisor); | 102 | EXPORT_SYMBOL(mcp_set_telecom_divisor); |
136 | 103 | ||
@@ -143,9 +110,11 @@ EXPORT_SYMBOL(mcp_set_telecom_divisor); | |||
143 | */ | 110 | */ |
144 | void mcp_set_audio_divisor(struct mcp *mcp, unsigned int div) | 111 | void mcp_set_audio_divisor(struct mcp *mcp, unsigned int div) |
145 | { | 112 | { |
146 | spin_lock_irq(&mcp->lock); | 113 | unsigned long flags; |
114 | |||
115 | spin_lock_irqsave(&mcp->lock, flags); | ||
147 | mcp->ops->set_audio_divisor(mcp, div); | 116 | mcp->ops->set_audio_divisor(mcp, div); |
148 | spin_unlock_irq(&mcp->lock); | 117 | spin_unlock_irqrestore(&mcp->lock, flags); |
149 | } | 118 | } |
150 | EXPORT_SYMBOL(mcp_set_audio_divisor); | 119 | EXPORT_SYMBOL(mcp_set_audio_divisor); |
151 | 120 | ||
@@ -198,10 +167,11 @@ EXPORT_SYMBOL(mcp_reg_read); | |||
198 | */ | 167 | */ |
199 | void mcp_enable(struct mcp *mcp) | 168 | void mcp_enable(struct mcp *mcp) |
200 | { | 169 | { |
201 | spin_lock_irq(&mcp->lock); | 170 | unsigned long flags; |
171 | spin_lock_irqsave(&mcp->lock, flags); | ||
202 | if (mcp->use_count++ == 0) | 172 | if (mcp->use_count++ == 0) |
203 | mcp->ops->enable(mcp); | 173 | mcp->ops->enable(mcp); |
204 | spin_unlock_irq(&mcp->lock); | 174 | spin_unlock_irqrestore(&mcp->lock, flags); |
205 | } | 175 | } |
206 | EXPORT_SYMBOL(mcp_enable); | 176 | EXPORT_SYMBOL(mcp_enable); |
207 | 177 | ||
@@ -247,14 +217,9 @@ struct mcp *mcp_host_alloc(struct device *parent, size_t size) | |||
247 | } | 217 | } |
248 | EXPORT_SYMBOL(mcp_host_alloc); | 218 | EXPORT_SYMBOL(mcp_host_alloc); |
249 | 219 | ||
250 | int mcp_host_register(struct mcp *mcp, void *pdata) | 220 | int mcp_host_register(struct mcp *mcp) |
251 | { | 221 | { |
252 | if (!mcp->codec) | ||
253 | return -EINVAL; | ||
254 | |||
255 | mcp->attached_device.platform_data = pdata; | ||
256 | dev_set_name(&mcp->attached_device, "mcp0"); | 222 | dev_set_name(&mcp->attached_device, "mcp0"); |
257 | request_module("%s%s", MCP_MODULE_PREFIX, mcp->codec); | ||
258 | return device_register(&mcp->attached_device); | 223 | return device_register(&mcp->attached_device); |
259 | } | 224 | } |
260 | EXPORT_SYMBOL(mcp_host_register); | 225 | EXPORT_SYMBOL(mcp_host_register); |
diff --git a/drivers/mfd/mcp-sa11x0.c b/drivers/mfd/mcp-sa11x0.c index 9adc2eb69492..02c53a0766c4 100644 --- a/drivers/mfd/mcp-sa11x0.c +++ b/drivers/mfd/mcp-sa11x0.c | |||
@@ -19,7 +19,6 @@ | |||
19 | #include <linux/spinlock.h> | 19 | #include <linux/spinlock.h> |
20 | #include <linux/platform_device.h> | 20 | #include <linux/platform_device.h> |
21 | #include <linux/mfd/mcp.h> | 21 | #include <linux/mfd/mcp.h> |
22 | #include <linux/io.h> | ||
23 | 22 | ||
24 | #include <mach/dma.h> | 23 | #include <mach/dma.h> |
25 | #include <mach/hardware.h> | 24 | #include <mach/hardware.h> |
@@ -27,19 +26,12 @@ | |||
27 | #include <asm/system.h> | 26 | #include <asm/system.h> |
28 | #include <mach/mcp.h> | 27 | #include <mach/mcp.h> |
29 | 28 | ||
30 | /* Register offsets */ | 29 | #include <mach/assabet.h> |
31 | #define MCCR0 0x00 | 30 | |
32 | #define MCDR0 0x08 | ||
33 | #define MCDR1 0x0C | ||
34 | #define MCDR2 0x10 | ||
35 | #define MCSR 0x18 | ||
36 | #define MCCR1 0x00 | ||
37 | 31 | ||
38 | struct mcp_sa11x0 { | 32 | struct mcp_sa11x0 { |
39 | u32 mccr0; | 33 | u32 mccr0; |
40 | u32 mccr1; | 34 | u32 mccr1; |
41 | unsigned char *mccr0_base; | ||
42 | unsigned char *mccr1_base; | ||
43 | }; | 35 | }; |
44 | 36 | ||
45 | #define priv(mcp) ((struct mcp_sa11x0 *)mcp_priv(mcp)) | 37 | #define priv(mcp) ((struct mcp_sa11x0 *)mcp_priv(mcp)) |
@@ -47,25 +39,25 @@ struct mcp_sa11x0 { | |||
47 | static void | 39 | static void |
48 | mcp_sa11x0_set_telecom_divisor(struct mcp *mcp, unsigned int divisor) | 40 | mcp_sa11x0_set_telecom_divisor(struct mcp *mcp, unsigned int divisor) |
49 | { | 41 | { |
50 | struct mcp_sa11x0 *priv = priv(mcp); | 42 | unsigned int mccr0; |
51 | 43 | ||
52 | divisor /= 32; | 44 | divisor /= 32; |
53 | 45 | ||
54 | priv->mccr0 &= ~0x00007f00; | 46 | mccr0 = Ser4MCCR0 & ~0x00007f00; |
55 | priv->mccr0 |= divisor << 8; | 47 | mccr0 |= divisor << 8; |
56 | __raw_writel(priv->mccr0, priv->mccr0_base + MCCR0); | 48 | Ser4MCCR0 = mccr0; |
57 | } | 49 | } |
58 | 50 | ||
59 | static void | 51 | static void |
60 | mcp_sa11x0_set_audio_divisor(struct mcp *mcp, unsigned int divisor) | 52 | mcp_sa11x0_set_audio_divisor(struct mcp *mcp, unsigned int divisor) |
61 | { | 53 | { |
62 | struct mcp_sa11x0 *priv = priv(mcp); | 54 | unsigned int mccr0; |
63 | 55 | ||
64 | divisor /= 32; | 56 | divisor /= 32; |
65 | 57 | ||
66 | priv->mccr0 &= ~0x0000007f; | 58 | mccr0 = Ser4MCCR0 & ~0x0000007f; |
67 | priv->mccr0 |= divisor; | 59 | mccr0 |= divisor; |
68 | __raw_writel(priv->mccr0, priv->mccr0_base + MCCR0); | 60 | Ser4MCCR0 = mccr0; |
69 | } | 61 | } |
70 | 62 | ||
71 | /* | 63 | /* |
@@ -79,16 +71,12 @@ mcp_sa11x0_write(struct mcp *mcp, unsigned int reg, unsigned int val) | |||
79 | { | 71 | { |
80 | int ret = -ETIME; | 72 | int ret = -ETIME; |
81 | int i; | 73 | int i; |
82 | u32 mcpreg; | ||
83 | struct mcp_sa11x0 *priv = priv(mcp); | ||
84 | 74 | ||
85 | mcpreg = reg << 17 | MCDR2_Wr | (val & 0xffff); | 75 | Ser4MCDR2 = reg << 17 | MCDR2_Wr | (val & 0xffff); |
86 | __raw_writel(mcpreg, priv->mccr0_base + MCDR2); | ||
87 | 76 | ||
88 | for (i = 0; i < 2; i++) { | 77 | for (i = 0; i < 2; i++) { |
89 | udelay(mcp->rw_timeout); | 78 | udelay(mcp->rw_timeout); |
90 | mcpreg = __raw_readl(priv->mccr0_base + MCSR); | 79 | if (Ser4MCSR & MCSR_CWC) { |
91 | if (mcpreg & MCSR_CWC) { | ||
92 | ret = 0; | 80 | ret = 0; |
93 | break; | 81 | break; |
94 | } | 82 | } |
@@ -109,18 +97,13 @@ mcp_sa11x0_read(struct mcp *mcp, unsigned int reg) | |||
109 | { | 97 | { |
110 | int ret = -ETIME; | 98 | int ret = -ETIME; |
111 | int i; | 99 | int i; |
112 | u32 mcpreg; | ||
113 | struct mcp_sa11x0 *priv = priv(mcp); | ||
114 | 100 | ||
115 | mcpreg = reg << 17 | MCDR2_Rd; | 101 | Ser4MCDR2 = reg << 17 | MCDR2_Rd; |
116 | __raw_writel(mcpreg, priv->mccr0_base + MCDR2); | ||
117 | 102 | ||
118 | for (i = 0; i < 2; i++) { | 103 | for (i = 0; i < 2; i++) { |
119 | udelay(mcp->rw_timeout); | 104 | udelay(mcp->rw_timeout); |
120 | mcpreg = __raw_readl(priv->mccr0_base + MCSR); | 105 | if (Ser4MCSR & MCSR_CRC) { |
121 | if (mcpreg & MCSR_CRC) { | 106 | ret = Ser4MCDR2 & 0xffff; |
122 | ret = __raw_readl(priv->mccr0_base + MCDR2) | ||
123 | & 0xffff; | ||
124 | break; | 107 | break; |
125 | } | 108 | } |
126 | } | 109 | } |
@@ -133,19 +116,13 @@ mcp_sa11x0_read(struct mcp *mcp, unsigned int reg) | |||
133 | 116 | ||
134 | static void mcp_sa11x0_enable(struct mcp *mcp) | 117 | static void mcp_sa11x0_enable(struct mcp *mcp) |
135 | { | 118 | { |
136 | struct mcp_sa11x0 *priv = priv(mcp); | 119 | Ser4MCSR = -1; |
137 | 120 | Ser4MCCR0 |= MCCR0_MCE; | |
138 | __raw_writel(-1, priv->mccr0_base + MCSR); | ||
139 | priv->mccr0 |= MCCR0_MCE; | ||
140 | __raw_writel(priv->mccr0, priv->mccr0_base + MCCR0); | ||
141 | } | 121 | } |
142 | 122 | ||
143 | static void mcp_sa11x0_disable(struct mcp *mcp) | 123 | static void mcp_sa11x0_disable(struct mcp *mcp) |
144 | { | 124 | { |
145 | struct mcp_sa11x0 *priv = priv(mcp); | 125 | Ser4MCCR0 &= ~MCCR0_MCE; |
146 | |||
147 | priv->mccr0 &= ~MCCR0_MCE; | ||
148 | __raw_writel(priv->mccr0, priv->mccr0_base + MCCR0); | ||
149 | } | 126 | } |
150 | 127 | ||
151 | /* | 128 | /* |
@@ -165,69 +142,50 @@ static int mcp_sa11x0_probe(struct platform_device *pdev) | |||
165 | struct mcp_plat_data *data = pdev->dev.platform_data; | 142 | struct mcp_plat_data *data = pdev->dev.platform_data; |
166 | struct mcp *mcp; | 143 | struct mcp *mcp; |
167 | int ret; | 144 | int ret; |
168 | struct mcp_sa11x0 *priv; | ||
169 | struct resource *res_mem0, *res_mem1; | ||
170 | u32 size0, size1; | ||
171 | 145 | ||
172 | if (!data) | 146 | if (!data) |
173 | return -ENODEV; | 147 | return -ENODEV; |
174 | 148 | ||
175 | if (!data->codec) | 149 | if (!request_mem_region(0x80060000, 0x60, "sa11x0-mcp")) |
176 | return -ENODEV; | ||
177 | |||
178 | res_mem0 = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
179 | if (!res_mem0) | ||
180 | return -ENODEV; | ||
181 | size0 = res_mem0->end - res_mem0->start + 1; | ||
182 | |||
183 | res_mem1 = platform_get_resource(pdev, IORESOURCE_MEM, 1); | ||
184 | if (!res_mem1) | ||
185 | return -ENODEV; | ||
186 | size1 = res_mem1->end - res_mem1->start + 1; | ||
187 | |||
188 | if (!request_mem_region(res_mem0->start, size0, "sa11x0-mcp")) | ||
189 | return -EBUSY; | 150 | return -EBUSY; |
190 | 151 | ||
191 | if (!request_mem_region(res_mem1->start, size1, "sa11x0-mcp")) { | ||
192 | ret = -EBUSY; | ||
193 | goto release; | ||
194 | } | ||
195 | |||
196 | mcp = mcp_host_alloc(&pdev->dev, sizeof(struct mcp_sa11x0)); | 152 | mcp = mcp_host_alloc(&pdev->dev, sizeof(struct mcp_sa11x0)); |
197 | if (!mcp) { | 153 | if (!mcp) { |
198 | ret = -ENOMEM; | 154 | ret = -ENOMEM; |
199 | goto release2; | 155 | goto release; |
200 | } | 156 | } |
201 | 157 | ||
202 | priv = priv(mcp); | ||
203 | |||
204 | mcp->owner = THIS_MODULE; | 158 | mcp->owner = THIS_MODULE; |
205 | mcp->ops = &mcp_sa11x0; | 159 | mcp->ops = &mcp_sa11x0; |
206 | mcp->sclk_rate = data->sclk_rate; | 160 | mcp->sclk_rate = data->sclk_rate; |
207 | mcp->dma_audio_rd = DDAR_DevAdd(res_mem0->start + MCDR0) | 161 | mcp->dma_audio_rd = DMA_Ser4MCP0Rd; |
208 | + DDAR_DevRd + DDAR_Brst4 + DDAR_8BitDev; | 162 | mcp->dma_audio_wr = DMA_Ser4MCP0Wr; |
209 | mcp->dma_audio_wr = DDAR_DevAdd(res_mem0->start + MCDR0) | 163 | mcp->dma_telco_rd = DMA_Ser4MCP1Rd; |
210 | + DDAR_DevWr + DDAR_Brst4 + DDAR_8BitDev; | 164 | mcp->dma_telco_wr = DMA_Ser4MCP1Wr; |
211 | mcp->dma_telco_rd = DDAR_DevAdd(res_mem0->start + MCDR1) | 165 | mcp->gpio_base = data->gpio_base; |
212 | + DDAR_DevRd + DDAR_Brst4 + DDAR_8BitDev; | ||
213 | mcp->dma_telco_wr = DDAR_DevAdd(res_mem0->start + MCDR1) | ||
214 | + DDAR_DevWr + DDAR_Brst4 + DDAR_8BitDev; | ||
215 | mcp->codec = data->codec; | ||
216 | 166 | ||
217 | platform_set_drvdata(pdev, mcp); | 167 | platform_set_drvdata(pdev, mcp); |
218 | 168 | ||
169 | if (machine_is_assabet()) { | ||
170 | ASSABET_BCR_set(ASSABET_BCR_CODEC_RST); | ||
171 | } | ||
172 | |||
173 | /* | ||
174 | * Setup the PPC unit correctly. | ||
175 | */ | ||
176 | PPDR &= ~PPC_RXD4; | ||
177 | PPDR |= PPC_TXD4 | PPC_SCLK | PPC_SFRM; | ||
178 | PSDR |= PPC_RXD4; | ||
179 | PSDR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM); | ||
180 | PPSR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM); | ||
181 | |||
219 | /* | 182 | /* |
220 | * Initialise device. Note that we initially | 183 | * Initialise device. Note that we initially |
221 | * set the sampling rate to minimum. | 184 | * set the sampling rate to minimum. |
222 | */ | 185 | */ |
223 | priv->mccr0_base = ioremap(res_mem0->start, size0); | 186 | Ser4MCSR = -1; |
224 | priv->mccr1_base = ioremap(res_mem1->start, size1); | 187 | Ser4MCCR1 = data->mccr1; |
225 | 188 | Ser4MCCR0 = data->mccr0 | 0x7f7f; | |
226 | __raw_writel(-1, priv->mccr0_base + MCSR); | ||
227 | priv->mccr1 = data->mccr1; | ||
228 | priv->mccr0 = data->mccr0 | 0x7f7f; | ||
229 | __raw_writel(priv->mccr0, priv->mccr0_base + MCCR0); | ||
230 | __raw_writel(priv->mccr1, priv->mccr1_base + MCCR1); | ||
231 | 189 | ||
232 | /* | 190 | /* |
233 | * Calculate the read/write timeout (us) from the bit clock | 191 | * Calculate the read/write timeout (us) from the bit clock |
@@ -237,53 +195,36 @@ static int mcp_sa11x0_probe(struct platform_device *pdev) | |||
237 | mcp->rw_timeout = (64 * 3 * 1000000 + mcp->sclk_rate - 1) / | 195 | mcp->rw_timeout = (64 * 3 * 1000000 + mcp->sclk_rate - 1) / |
238 | mcp->sclk_rate; | 196 | mcp->sclk_rate; |
239 | 197 | ||
240 | ret = mcp_host_register(mcp, data->codec_pdata); | 198 | ret = mcp_host_register(mcp); |
241 | if (ret == 0) | 199 | if (ret == 0) |
242 | goto out; | 200 | goto out; |
243 | 201 | ||
244 | release2: | ||
245 | release_mem_region(res_mem1->start, size1); | ||
246 | release: | 202 | release: |
247 | release_mem_region(res_mem0->start, size0); | 203 | release_mem_region(0x80060000, 0x60); |
248 | platform_set_drvdata(pdev, NULL); | 204 | platform_set_drvdata(pdev, NULL); |
249 | 205 | ||
250 | out: | 206 | out: |
251 | return ret; | 207 | return ret; |
252 | } | 208 | } |
253 | 209 | ||
254 | static int mcp_sa11x0_remove(struct platform_device *pdev) | 210 | static int mcp_sa11x0_remove(struct platform_device *dev) |
255 | { | 211 | { |
256 | struct mcp *mcp = platform_get_drvdata(pdev); | 212 | struct mcp *mcp = platform_get_drvdata(dev); |
257 | struct mcp_sa11x0 *priv = priv(mcp); | ||
258 | struct resource *res_mem; | ||
259 | u32 size; | ||
260 | 213 | ||
261 | platform_set_drvdata(pdev, NULL); | 214 | platform_set_drvdata(dev, NULL); |
262 | mcp_host_unregister(mcp); | 215 | mcp_host_unregister(mcp); |
216 | release_mem_region(0x80060000, 0x60); | ||
263 | 217 | ||
264 | res_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
265 | if (res_mem) { | ||
266 | size = res_mem->end - res_mem->start + 1; | ||
267 | release_mem_region(res_mem->start, size); | ||
268 | } | ||
269 | res_mem = platform_get_resource(pdev, IORESOURCE_MEM, 1); | ||
270 | if (res_mem) { | ||
271 | size = res_mem->end - res_mem->start + 1; | ||
272 | release_mem_region(res_mem->start, size); | ||
273 | } | ||
274 | iounmap(priv->mccr0_base); | ||
275 | iounmap(priv->mccr1_base); | ||
276 | return 0; | 218 | return 0; |
277 | } | 219 | } |
278 | 220 | ||
279 | static int mcp_sa11x0_suspend(struct platform_device *dev, pm_message_t state) | 221 | static int mcp_sa11x0_suspend(struct platform_device *dev, pm_message_t state) |
280 | { | 222 | { |
281 | struct mcp *mcp = platform_get_drvdata(dev); | 223 | struct mcp *mcp = platform_get_drvdata(dev); |
282 | struct mcp_sa11x0 *priv = priv(mcp); | ||
283 | u32 mccr0; | ||
284 | 224 | ||
285 | mccr0 = priv->mccr0 & ~MCCR0_MCE; | 225 | priv(mcp)->mccr0 = Ser4MCCR0; |
286 | __raw_writel(mccr0, priv->mccr0_base + MCCR0); | 226 | priv(mcp)->mccr1 = Ser4MCCR1; |
227 | Ser4MCCR0 &= ~MCCR0_MCE; | ||
287 | 228 | ||
288 | return 0; | 229 | return 0; |
289 | } | 230 | } |
@@ -291,10 +232,9 @@ static int mcp_sa11x0_suspend(struct platform_device *dev, pm_message_t state) | |||
291 | static int mcp_sa11x0_resume(struct platform_device *dev) | 232 | static int mcp_sa11x0_resume(struct platform_device *dev) |
292 | { | 233 | { |
293 | struct mcp *mcp = platform_get_drvdata(dev); | 234 | struct mcp *mcp = platform_get_drvdata(dev); |
294 | struct mcp_sa11x0 *priv = priv(mcp); | ||
295 | 235 | ||
296 | __raw_writel(priv->mccr0, priv->mccr0_base + MCCR0); | 236 | Ser4MCCR1 = priv(mcp)->mccr1; |
297 | __raw_writel(priv->mccr1, priv->mccr1_base + MCCR1); | 237 | Ser4MCCR0 = priv(mcp)->mccr0; |
298 | 238 | ||
299 | return 0; | 239 | return 0; |
300 | } | 240 | } |
@@ -311,7 +251,6 @@ static struct platform_driver mcp_sa11x0_driver = { | |||
311 | .resume = mcp_sa11x0_resume, | 251 | .resume = mcp_sa11x0_resume, |
312 | .driver = { | 252 | .driver = { |
313 | .name = "sa11x0-mcp", | 253 | .name = "sa11x0-mcp", |
314 | .owner = THIS_MODULE, | ||
315 | }, | 254 | }, |
316 | }; | 255 | }; |
317 | 256 | ||
diff --git a/drivers/mfd/ucb1x00-core.c b/drivers/mfd/ucb1x00-core.c index 91c4f25e0e55..febc90cdef7e 100644 --- a/drivers/mfd/ucb1x00-core.c +++ b/drivers/mfd/ucb1x00-core.c | |||
@@ -36,15 +36,6 @@ static DEFINE_MUTEX(ucb1x00_mutex); | |||
36 | static LIST_HEAD(ucb1x00_drivers); | 36 | static LIST_HEAD(ucb1x00_drivers); |
37 | static LIST_HEAD(ucb1x00_devices); | 37 | static LIST_HEAD(ucb1x00_devices); |
38 | 38 | ||
39 | static struct mcp_device_id ucb1x00_id[] = { | ||
40 | { "ucb1x00", 0 }, /* auto-detection */ | ||
41 | { "ucb1200", UCB_ID_1200 }, | ||
42 | { "ucb1300", UCB_ID_1300 }, | ||
43 | { "tc35143", UCB_ID_TC35143 }, | ||
44 | { } | ||
45 | }; | ||
46 | MODULE_DEVICE_TABLE(mcp, ucb1x00_id); | ||
47 | |||
48 | /** | 39 | /** |
49 | * ucb1x00_io_set_dir - set IO direction | 40 | * ucb1x00_io_set_dir - set IO direction |
50 | * @ucb: UCB1x00 structure describing chip | 41 | * @ucb: UCB1x00 structure describing chip |
@@ -157,16 +148,22 @@ static int ucb1x00_gpio_direction_output(struct gpio_chip *chip, unsigned offset | |||
157 | { | 148 | { |
158 | struct ucb1x00 *ucb = container_of(chip, struct ucb1x00, gpio); | 149 | struct ucb1x00 *ucb = container_of(chip, struct ucb1x00, gpio); |
159 | unsigned long flags; | 150 | unsigned long flags; |
151 | unsigned old, mask = 1 << offset; | ||
160 | 152 | ||
161 | spin_lock_irqsave(&ucb->io_lock, flags); | 153 | spin_lock_irqsave(&ucb->io_lock, flags); |
162 | ucb->io_dir |= (1 << offset); | 154 | old = ucb->io_out; |
163 | ucb1x00_reg_write(ucb, UCB_IO_DIR, ucb->io_dir); | ||
164 | |||
165 | if (value) | 155 | if (value) |
166 | ucb->io_out |= 1 << offset; | 156 | ucb->io_out |= mask; |
167 | else | 157 | else |
168 | ucb->io_out &= ~(1 << offset); | 158 | ucb->io_out &= ~mask; |
169 | ucb1x00_reg_write(ucb, UCB_IO_DATA, ucb->io_out); | 159 | |
160 | if (old != ucb->io_out) | ||
161 | ucb1x00_reg_write(ucb, UCB_IO_DATA, ucb->io_out); | ||
162 | |||
163 | if (!(ucb->io_dir & mask)) { | ||
164 | ucb->io_dir |= mask; | ||
165 | ucb1x00_reg_write(ucb, UCB_IO_DIR, ucb->io_dir); | ||
166 | } | ||
170 | spin_unlock_irqrestore(&ucb->io_lock, flags); | 167 | spin_unlock_irqrestore(&ucb->io_lock, flags); |
171 | 168 | ||
172 | return 0; | 169 | return 0; |
@@ -536,33 +533,17 @@ static struct class ucb1x00_class = { | |||
536 | 533 | ||
537 | static int ucb1x00_probe(struct mcp *mcp) | 534 | static int ucb1x00_probe(struct mcp *mcp) |
538 | { | 535 | { |
539 | const struct mcp_device_id *mid; | ||
540 | struct ucb1x00 *ucb; | 536 | struct ucb1x00 *ucb; |
541 | struct ucb1x00_driver *drv; | 537 | struct ucb1x00_driver *drv; |
542 | struct ucb1x00_plat_data *pdata; | ||
543 | unsigned int id; | 538 | unsigned int id; |
544 | int ret = -ENODEV; | 539 | int ret = -ENODEV; |
545 | int temp; | 540 | int temp; |
546 | 541 | ||
547 | mcp_enable(mcp); | 542 | mcp_enable(mcp); |
548 | id = mcp_reg_read(mcp, UCB_ID); | 543 | id = mcp_reg_read(mcp, UCB_ID); |
549 | mid = mcp_get_device_id(mcp); | ||
550 | 544 | ||
551 | if (mid && mid->driver_data) { | 545 | if (id != UCB_ID_1200 && id != UCB_ID_1300 && id != UCB_ID_TC35143) { |
552 | if (id != mid->driver_data) { | 546 | printk(KERN_WARNING "UCB1x00 ID not found: %04x\n", id); |
553 | printk(KERN_WARNING "%s wrong ID %04x found: %04x\n", | ||
554 | mid->name, (unsigned int) mid->driver_data, id); | ||
555 | goto err_disable; | ||
556 | } | ||
557 | } else { | ||
558 | mid = &ucb1x00_id[1]; | ||
559 | while (mid->driver_data) { | ||
560 | if (id == mid->driver_data) | ||
561 | break; | ||
562 | mid++; | ||
563 | } | ||
564 | printk(KERN_WARNING "%s ID not found: %04x\n", | ||
565 | ucb1x00_id[0].name, id); | ||
566 | goto err_disable; | 547 | goto err_disable; |
567 | } | 548 | } |
568 | 549 | ||
@@ -571,28 +552,28 @@ static int ucb1x00_probe(struct mcp *mcp) | |||
571 | if (!ucb) | 552 | if (!ucb) |
572 | goto err_disable; | 553 | goto err_disable; |
573 | 554 | ||
574 | pdata = mcp->attached_device.platform_data; | 555 | |
575 | ucb->dev.class = &ucb1x00_class; | 556 | ucb->dev.class = &ucb1x00_class; |
576 | ucb->dev.parent = &mcp->attached_device; | 557 | ucb->dev.parent = &mcp->attached_device; |
577 | dev_set_name(&ucb->dev, mid->name); | 558 | dev_set_name(&ucb->dev, "ucb1x00"); |
578 | 559 | ||
579 | spin_lock_init(&ucb->lock); | 560 | spin_lock_init(&ucb->lock); |
580 | spin_lock_init(&ucb->io_lock); | 561 | spin_lock_init(&ucb->io_lock); |
581 | sema_init(&ucb->adc_sem, 1); | 562 | sema_init(&ucb->adc_sem, 1); |
582 | 563 | ||
583 | ucb->id = mid; | 564 | ucb->id = id; |
584 | ucb->mcp = mcp; | 565 | ucb->mcp = mcp; |
585 | ucb->irq = ucb1x00_detect_irq(ucb); | 566 | ucb->irq = ucb1x00_detect_irq(ucb); |
586 | if (ucb->irq == NO_IRQ) { | 567 | if (ucb->irq == NO_IRQ) { |
587 | printk(KERN_ERR "%s: IRQ probe failed\n", mid->name); | 568 | printk(KERN_ERR "UCB1x00: IRQ probe failed\n"); |
588 | ret = -ENODEV; | 569 | ret = -ENODEV; |
589 | goto err_free; | 570 | goto err_free; |
590 | } | 571 | } |
591 | 572 | ||
592 | ucb->gpio.base = -1; | 573 | ucb->gpio.base = -1; |
593 | if (pdata && (pdata->gpio_base >= 0)) { | 574 | if (mcp->gpio_base != 0) { |
594 | ucb->gpio.label = dev_name(&ucb->dev); | 575 | ucb->gpio.label = dev_name(&ucb->dev); |
595 | ucb->gpio.base = pdata->gpio_base; | 576 | ucb->gpio.base = mcp->gpio_base; |
596 | ucb->gpio.ngpio = 10; | 577 | ucb->gpio.ngpio = 10; |
597 | ucb->gpio.set = ucb1x00_gpio_set; | 578 | ucb->gpio.set = ucb1x00_gpio_set; |
598 | ucb->gpio.get = ucb1x00_gpio_get; | 579 | ucb->gpio.get = ucb1x00_gpio_get; |
@@ -605,10 +586,10 @@ static int ucb1x00_probe(struct mcp *mcp) | |||
605 | dev_info(&ucb->dev, "gpio_base not set so no gpiolib support"); | 586 | dev_info(&ucb->dev, "gpio_base not set so no gpiolib support"); |
606 | 587 | ||
607 | ret = request_irq(ucb->irq, ucb1x00_irq, IRQF_TRIGGER_RISING, | 588 | ret = request_irq(ucb->irq, ucb1x00_irq, IRQF_TRIGGER_RISING, |
608 | mid->name, ucb); | 589 | "UCB1x00", ucb); |
609 | if (ret) { | 590 | if (ret) { |
610 | printk(KERN_ERR "%s: unable to grab irq%d: %d\n", | 591 | printk(KERN_ERR "ucb1x00: unable to grab irq%d: %d\n", |
611 | mid->name, ucb->irq, ret); | 592 | ucb->irq, ret); |
612 | goto err_gpio; | 593 | goto err_gpio; |
613 | } | 594 | } |
614 | 595 | ||
@@ -712,6 +693,7 @@ static int ucb1x00_resume(struct mcp *mcp) | |||
712 | struct ucb1x00 *ucb = mcp_get_drvdata(mcp); | 693 | struct ucb1x00 *ucb = mcp_get_drvdata(mcp); |
713 | struct ucb1x00_dev *dev; | 694 | struct ucb1x00_dev *dev; |
714 | 695 | ||
696 | ucb1x00_reg_write(ucb, UCB_IO_DATA, ucb->io_out); | ||
715 | ucb1x00_reg_write(ucb, UCB_IO_DIR, ucb->io_dir); | 697 | ucb1x00_reg_write(ucb, UCB_IO_DIR, ucb->io_dir); |
716 | mutex_lock(&ucb1x00_mutex); | 698 | mutex_lock(&ucb1x00_mutex); |
717 | list_for_each_entry(dev, &ucb->devs, dev_node) { | 699 | list_for_each_entry(dev, &ucb->devs, dev_node) { |
@@ -730,7 +712,6 @@ static struct mcp_driver ucb1x00_driver = { | |||
730 | .remove = ucb1x00_remove, | 712 | .remove = ucb1x00_remove, |
731 | .suspend = ucb1x00_suspend, | 713 | .suspend = ucb1x00_suspend, |
732 | .resume = ucb1x00_resume, | 714 | .resume = ucb1x00_resume, |
733 | .id_table = ucb1x00_id, | ||
734 | }; | 715 | }; |
735 | 716 | ||
736 | static int __init ucb1x00_init(void) | 717 | static int __init ucb1x00_init(void) |
diff --git a/drivers/mfd/ucb1x00-ts.c b/drivers/mfd/ucb1x00-ts.c index 40ec3c118868..63a3cbdfa3f3 100644 --- a/drivers/mfd/ucb1x00-ts.c +++ b/drivers/mfd/ucb1x00-ts.c | |||
@@ -47,7 +47,6 @@ struct ucb1x00_ts { | |||
47 | u16 x_res; | 47 | u16 x_res; |
48 | u16 y_res; | 48 | u16 y_res; |
49 | 49 | ||
50 | unsigned int restart:1; | ||
51 | unsigned int adcsync:1; | 50 | unsigned int adcsync:1; |
52 | }; | 51 | }; |
53 | 52 | ||
@@ -207,15 +206,17 @@ static int ucb1x00_thread(void *_ts) | |||
207 | { | 206 | { |
208 | struct ucb1x00_ts *ts = _ts; | 207 | struct ucb1x00_ts *ts = _ts; |
209 | DECLARE_WAITQUEUE(wait, current); | 208 | DECLARE_WAITQUEUE(wait, current); |
209 | bool frozen, ignore = false; | ||
210 | int valid = 0; | 210 | int valid = 0; |
211 | 211 | ||
212 | set_freezable(); | 212 | set_freezable(); |
213 | add_wait_queue(&ts->irq_wait, &wait); | 213 | add_wait_queue(&ts->irq_wait, &wait); |
214 | while (!kthread_should_stop()) { | 214 | while (!kthread_freezable_should_stop(&frozen)) { |
215 | unsigned int x, y, p; | 215 | unsigned int x, y, p; |
216 | signed long timeout; | 216 | signed long timeout; |
217 | 217 | ||
218 | ts->restart = 0; | 218 | if (frozen) |
219 | ignore = true; | ||
219 | 220 | ||
220 | ucb1x00_adc_enable(ts->ucb); | 221 | ucb1x00_adc_enable(ts->ucb); |
221 | 222 | ||
@@ -258,7 +259,7 @@ static int ucb1x00_thread(void *_ts) | |||
258 | * space. We therefore leave it to user space | 259 | * space. We therefore leave it to user space |
259 | * to do any filtering they please. | 260 | * to do any filtering they please. |
260 | */ | 261 | */ |
261 | if (!ts->restart) { | 262 | if (!ignore) { |
262 | ucb1x00_ts_evt_add(ts, p, x, y); | 263 | ucb1x00_ts_evt_add(ts, p, x, y); |
263 | valid = 1; | 264 | valid = 1; |
264 | } | 265 | } |
@@ -267,8 +268,6 @@ static int ucb1x00_thread(void *_ts) | |||
267 | timeout = HZ / 100; | 268 | timeout = HZ / 100; |
268 | } | 269 | } |
269 | 270 | ||
270 | try_to_freeze(); | ||
271 | |||
272 | schedule_timeout(timeout); | 271 | schedule_timeout(timeout); |
273 | } | 272 | } |
274 | 273 | ||
@@ -340,26 +339,6 @@ static void ucb1x00_ts_close(struct input_dev *idev) | |||
340 | ucb1x00_disable(ts->ucb); | 339 | ucb1x00_disable(ts->ucb); |
341 | } | 340 | } |
342 | 341 | ||
343 | #ifdef CONFIG_PM | ||
344 | static int ucb1x00_ts_resume(struct ucb1x00_dev *dev) | ||
345 | { | ||
346 | struct ucb1x00_ts *ts = dev->priv; | ||
347 | |||
348 | if (ts->rtask != NULL) { | ||
349 | /* | ||
350 | * Restart the TS thread to ensure the | ||
351 | * TS interrupt mode is set up again | ||
352 | * after sleep. | ||
353 | */ | ||
354 | ts->restart = 1; | ||
355 | wake_up(&ts->irq_wait); | ||
356 | } | ||
357 | return 0; | ||
358 | } | ||
359 | #else | ||
360 | #define ucb1x00_ts_resume NULL | ||
361 | #endif | ||
362 | |||
363 | 342 | ||
364 | /* | 343 | /* |
365 | * Initialisation. | 344 | * Initialisation. |
@@ -382,7 +361,7 @@ static int ucb1x00_ts_add(struct ucb1x00_dev *dev) | |||
382 | ts->adcsync = adcsync ? UCB_SYNC : UCB_NOSYNC; | 361 | ts->adcsync = adcsync ? UCB_SYNC : UCB_NOSYNC; |
383 | 362 | ||
384 | idev->name = "Touchscreen panel"; | 363 | idev->name = "Touchscreen panel"; |
385 | idev->id.product = ts->ucb->id->driver_data; | 364 | idev->id.product = ts->ucb->id; |
386 | idev->open = ucb1x00_ts_open; | 365 | idev->open = ucb1x00_ts_open; |
387 | idev->close = ucb1x00_ts_close; | 366 | idev->close = ucb1x00_ts_close; |
388 | 367 | ||
@@ -425,7 +404,6 @@ static void ucb1x00_ts_remove(struct ucb1x00_dev *dev) | |||
425 | static struct ucb1x00_driver ucb1x00_ts_driver = { | 404 | static struct ucb1x00_driver ucb1x00_ts_driver = { |
426 | .add = ucb1x00_ts_add, | 405 | .add = ucb1x00_ts_add, |
427 | .remove = ucb1x00_ts_remove, | 406 | .remove = ucb1x00_ts_remove, |
428 | .resume = ucb1x00_ts_resume, | ||
429 | }; | 407 | }; |
430 | 408 | ||
431 | static int __init ucb1x00_ts_init(void) | 409 | static int __init ucb1x00_ts_init(void) |
diff --git a/drivers/net/bonding/bond_alb.c b/drivers/net/bonding/bond_alb.c index 342626f4bc46..f820b26b9db3 100644 --- a/drivers/net/bonding/bond_alb.c +++ b/drivers/net/bonding/bond_alb.c | |||
@@ -909,16 +909,12 @@ static void alb_send_learning_packets(struct slave *slave, u8 mac_addr[]) | |||
909 | } | 909 | } |
910 | } | 910 | } |
911 | 911 | ||
912 | /* hw is a boolean parameter that determines whether we should try and | 912 | static int alb_set_slave_mac_addr(struct slave *slave, u8 addr[]) |
913 | * set the hw address of the device as well as the hw address of the | ||
914 | * net_device | ||
915 | */ | ||
916 | static int alb_set_slave_mac_addr(struct slave *slave, u8 addr[], int hw) | ||
917 | { | 913 | { |
918 | struct net_device *dev = slave->dev; | 914 | struct net_device *dev = slave->dev; |
919 | struct sockaddr s_addr; | 915 | struct sockaddr s_addr; |
920 | 916 | ||
921 | if (!hw) { | 917 | if (slave->bond->params.mode == BOND_MODE_TLB) { |
922 | memcpy(dev->dev_addr, addr, dev->addr_len); | 918 | memcpy(dev->dev_addr, addr, dev->addr_len); |
923 | return 0; | 919 | return 0; |
924 | } | 920 | } |
@@ -948,8 +944,8 @@ static void alb_swap_mac_addr(struct bonding *bond, struct slave *slave1, struct | |||
948 | u8 tmp_mac_addr[ETH_ALEN]; | 944 | u8 tmp_mac_addr[ETH_ALEN]; |
949 | 945 | ||
950 | memcpy(tmp_mac_addr, slave1->dev->dev_addr, ETH_ALEN); | 946 | memcpy(tmp_mac_addr, slave1->dev->dev_addr, ETH_ALEN); |
951 | alb_set_slave_mac_addr(slave1, slave2->dev->dev_addr, bond->alb_info.rlb_enabled); | 947 | alb_set_slave_mac_addr(slave1, slave2->dev->dev_addr); |
952 | alb_set_slave_mac_addr(slave2, tmp_mac_addr, bond->alb_info.rlb_enabled); | 948 | alb_set_slave_mac_addr(slave2, tmp_mac_addr); |
953 | 949 | ||
954 | } | 950 | } |
955 | 951 | ||
@@ -1096,8 +1092,7 @@ static int alb_handle_addr_collision_on_attach(struct bonding *bond, struct slav | |||
1096 | 1092 | ||
1097 | /* Try setting slave mac to bond address and fall-through | 1093 | /* Try setting slave mac to bond address and fall-through |
1098 | to code handling that situation below... */ | 1094 | to code handling that situation below... */ |
1099 | alb_set_slave_mac_addr(slave, bond->dev->dev_addr, | 1095 | alb_set_slave_mac_addr(slave, bond->dev->dev_addr); |
1100 | bond->alb_info.rlb_enabled); | ||
1101 | } | 1096 | } |
1102 | 1097 | ||
1103 | /* The slave's address is equal to the address of the bond. | 1098 | /* The slave's address is equal to the address of the bond. |
@@ -1133,8 +1128,7 @@ static int alb_handle_addr_collision_on_attach(struct bonding *bond, struct slav | |||
1133 | } | 1128 | } |
1134 | 1129 | ||
1135 | if (free_mac_slave) { | 1130 | if (free_mac_slave) { |
1136 | alb_set_slave_mac_addr(slave, free_mac_slave->perm_hwaddr, | 1131 | alb_set_slave_mac_addr(slave, free_mac_slave->perm_hwaddr); |
1137 | bond->alb_info.rlb_enabled); | ||
1138 | 1132 | ||
1139 | pr_warning("%s: Warning: the hw address of slave %s is in use by the bond; giving it the hw address of %s\n", | 1133 | pr_warning("%s: Warning: the hw address of slave %s is in use by the bond; giving it the hw address of %s\n", |
1140 | bond->dev->name, slave->dev->name, | 1134 | bond->dev->name, slave->dev->name, |
@@ -1491,8 +1485,7 @@ int bond_alb_init_slave(struct bonding *bond, struct slave *slave) | |||
1491 | { | 1485 | { |
1492 | int res; | 1486 | int res; |
1493 | 1487 | ||
1494 | res = alb_set_slave_mac_addr(slave, slave->perm_hwaddr, | 1488 | res = alb_set_slave_mac_addr(slave, slave->perm_hwaddr); |
1495 | bond->alb_info.rlb_enabled); | ||
1496 | if (res) { | 1489 | if (res) { |
1497 | return res; | 1490 | return res; |
1498 | } | 1491 | } |
@@ -1643,8 +1636,7 @@ void bond_alb_handle_active_change(struct bonding *bond, struct slave *new_slave | |||
1643 | alb_swap_mac_addr(bond, swap_slave, new_slave); | 1636 | alb_swap_mac_addr(bond, swap_slave, new_slave); |
1644 | } else { | 1637 | } else { |
1645 | /* set the new_slave to the bond mac address */ | 1638 | /* set the new_slave to the bond mac address */ |
1646 | alb_set_slave_mac_addr(new_slave, bond->dev->dev_addr, | 1639 | alb_set_slave_mac_addr(new_slave, bond->dev->dev_addr); |
1647 | bond->alb_info.rlb_enabled); | ||
1648 | } | 1640 | } |
1649 | 1641 | ||
1650 | if (swap_slave) { | 1642 | if (swap_slave) { |
@@ -1704,8 +1696,7 @@ int bond_alb_set_mac_address(struct net_device *bond_dev, void *addr) | |||
1704 | alb_swap_mac_addr(bond, swap_slave, bond->curr_active_slave); | 1696 | alb_swap_mac_addr(bond, swap_slave, bond->curr_active_slave); |
1705 | alb_fasten_mac_swap(bond, swap_slave, bond->curr_active_slave); | 1697 | alb_fasten_mac_swap(bond, swap_slave, bond->curr_active_slave); |
1706 | } else { | 1698 | } else { |
1707 | alb_set_slave_mac_addr(bond->curr_active_slave, bond_dev->dev_addr, | 1699 | alb_set_slave_mac_addr(bond->curr_active_slave, bond_dev->dev_addr); |
1708 | bond->alb_info.rlb_enabled); | ||
1709 | 1700 | ||
1710 | read_lock(&bond->lock); | 1701 | read_lock(&bond->lock); |
1711 | alb_send_learning_packets(bond->curr_active_slave, bond_dev->dev_addr); | 1702 | alb_send_learning_packets(bond->curr_active_slave, bond_dev->dev_addr); |
diff --git a/drivers/net/dsa/mv88e6060.c b/drivers/net/dsa/mv88e6060.c index 7fc4e81d4d43..325391d19bad 100644 --- a/drivers/net/dsa/mv88e6060.c +++ b/drivers/net/dsa/mv88e6060.c | |||
@@ -9,6 +9,7 @@ | |||
9 | */ | 9 | */ |
10 | 10 | ||
11 | #include <linux/list.h> | 11 | #include <linux/list.h> |
12 | #include <linux/module.h> | ||
12 | #include <linux/netdevice.h> | 13 | #include <linux/netdevice.h> |
13 | #include <linux/phy.h> | 14 | #include <linux/phy.h> |
14 | #include <net/dsa.h> | 15 | #include <net/dsa.h> |
diff --git a/drivers/net/dsa/mv88e6123_61_65.c b/drivers/net/dsa/mv88e6123_61_65.c index c0a458fc698f..c17c75b9f531 100644 --- a/drivers/net/dsa/mv88e6123_61_65.c +++ b/drivers/net/dsa/mv88e6123_61_65.c | |||
@@ -9,6 +9,7 @@ | |||
9 | */ | 9 | */ |
10 | 10 | ||
11 | #include <linux/list.h> | 11 | #include <linux/list.h> |
12 | #include <linux/module.h> | ||
12 | #include <linux/netdevice.h> | 13 | #include <linux/netdevice.h> |
13 | #include <linux/phy.h> | 14 | #include <linux/phy.h> |
14 | #include <net/dsa.h> | 15 | #include <net/dsa.h> |
@@ -20,12 +21,25 @@ static char *mv88e6123_61_65_probe(struct mii_bus *bus, int sw_addr) | |||
20 | 21 | ||
21 | ret = __mv88e6xxx_reg_read(bus, sw_addr, REG_PORT(0), 0x03); | 22 | ret = __mv88e6xxx_reg_read(bus, sw_addr, REG_PORT(0), 0x03); |
22 | if (ret >= 0) { | 23 | if (ret >= 0) { |
23 | ret &= 0xfff0; | 24 | if (ret == 0x1212) |
24 | if (ret == 0x1210) | 25 | return "Marvell 88E6123 (A1)"; |
26 | if (ret == 0x1213) | ||
27 | return "Marvell 88E6123 (A2)"; | ||
28 | if ((ret & 0xfff0) == 0x1210) | ||
25 | return "Marvell 88E6123"; | 29 | return "Marvell 88E6123"; |
26 | if (ret == 0x1610) | 30 | |
31 | if (ret == 0x1612) | ||
32 | return "Marvell 88E6161 (A1)"; | ||
33 | if (ret == 0x1613) | ||
34 | return "Marvell 88E6161 (A2)"; | ||
35 | if ((ret & 0xfff0) == 0x1610) | ||
27 | return "Marvell 88E6161"; | 36 | return "Marvell 88E6161"; |
28 | if (ret == 0x1650) | 37 | |
38 | if (ret == 0x1652) | ||
39 | return "Marvell 88E6165 (A1)"; | ||
40 | if (ret == 0x1653) | ||
41 | return "Marvell 88e6165 (A2)"; | ||
42 | if ((ret & 0xfff0) == 0x1650) | ||
29 | return "Marvell 88E6165"; | 43 | return "Marvell 88E6165"; |
30 | } | 44 | } |
31 | 45 | ||
diff --git a/drivers/net/dsa/mv88e6131.c b/drivers/net/dsa/mv88e6131.c index e0eb68243834..55888b06d8b4 100644 --- a/drivers/net/dsa/mv88e6131.c +++ b/drivers/net/dsa/mv88e6131.c | |||
@@ -9,6 +9,7 @@ | |||
9 | */ | 9 | */ |
10 | 10 | ||
11 | #include <linux/list.h> | 11 | #include <linux/list.h> |
12 | #include <linux/module.h> | ||
12 | #include <linux/netdevice.h> | 13 | #include <linux/netdevice.h> |
13 | #include <linux/phy.h> | 14 | #include <linux/phy.h> |
14 | #include <net/dsa.h> | 15 | #include <net/dsa.h> |
diff --git a/drivers/net/dsa/mv88e6xxx.c b/drivers/net/dsa/mv88e6xxx.c index 5467c040824a..a2c62c2f30ee 100644 --- a/drivers/net/dsa/mv88e6xxx.c +++ b/drivers/net/dsa/mv88e6xxx.c | |||
@@ -9,6 +9,7 @@ | |||
9 | */ | 9 | */ |
10 | 10 | ||
11 | #include <linux/list.h> | 11 | #include <linux/list.h> |
12 | #include <linux/module.h> | ||
12 | #include <linux/netdevice.h> | 13 | #include <linux/netdevice.h> |
13 | #include <linux/phy.h> | 14 | #include <linux/phy.h> |
14 | #include <net/dsa.h> | 15 | #include <net/dsa.h> |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c index 2b731b253598..03f3935fd8c2 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | |||
@@ -3117,7 +3117,7 @@ static int bnx2x_alloc_fp_mem_at(struct bnx2x *bp, int index) | |||
3117 | int rx_ring_size = 0; | 3117 | int rx_ring_size = 0; |
3118 | 3118 | ||
3119 | #ifdef BCM_CNIC | 3119 | #ifdef BCM_CNIC |
3120 | if (IS_MF_ISCSI_SD(bp)) { | 3120 | if (!bp->rx_ring_size && IS_MF_ISCSI_SD(bp)) { |
3121 | rx_ring_size = MIN_RX_SIZE_NONTPA; | 3121 | rx_ring_size = MIN_RX_SIZE_NONTPA; |
3122 | bp->rx_ring_size = rx_ring_size; | 3122 | bp->rx_ring_size = rx_ring_size; |
3123 | } else | 3123 | } else |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c index f99c6e312a5d..31a8b38ab15e 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c | |||
@@ -1738,7 +1738,7 @@ static int bnx2x_run_loopback(struct bnx2x *bp, int loopback_mode) | |||
1738 | struct bnx2x_fp_txdata *txdata = &fp_tx->txdata[0]; | 1738 | struct bnx2x_fp_txdata *txdata = &fp_tx->txdata[0]; |
1739 | u16 tx_start_idx, tx_idx; | 1739 | u16 tx_start_idx, tx_idx; |
1740 | u16 rx_start_idx, rx_idx; | 1740 | u16 rx_start_idx, rx_idx; |
1741 | u16 pkt_prod, bd_prod, rx_comp_cons; | 1741 | u16 pkt_prod, bd_prod; |
1742 | struct sw_tx_bd *tx_buf; | 1742 | struct sw_tx_bd *tx_buf; |
1743 | struct eth_tx_start_bd *tx_start_bd; | 1743 | struct eth_tx_start_bd *tx_start_bd; |
1744 | struct eth_tx_parse_bd_e1x *pbd_e1x = NULL; | 1744 | struct eth_tx_parse_bd_e1x *pbd_e1x = NULL; |
@@ -1873,8 +1873,7 @@ static int bnx2x_run_loopback(struct bnx2x *bp, int loopback_mode) | |||
1873 | if (rx_idx != rx_start_idx + num_pkts) | 1873 | if (rx_idx != rx_start_idx + num_pkts) |
1874 | goto test_loopback_exit; | 1874 | goto test_loopback_exit; |
1875 | 1875 | ||
1876 | rx_comp_cons = le16_to_cpu(fp_rx->rx_comp_cons); | 1876 | cqe = &fp_rx->rx_comp_ring[RCQ_BD(fp_rx->rx_comp_cons)]; |
1877 | cqe = &fp_rx->rx_comp_ring[RCQ_BD(rx_comp_cons)]; | ||
1878 | cqe_fp_flags = cqe->fast_path_cqe.type_error_flags; | 1877 | cqe_fp_flags = cqe->fast_path_cqe.type_error_flags; |
1879 | cqe_fp_type = cqe_fp_flags & ETH_FAST_PATH_RX_CQE_TYPE; | 1878 | cqe_fp_type = cqe_fp_flags & ETH_FAST_PATH_RX_CQE_TYPE; |
1880 | if (!CQE_TYPE_FAST(cqe_fp_type) || (cqe_fp_flags & ETH_RX_ERROR_FALGS)) | 1879 | if (!CQE_TYPE_FAST(cqe_fp_type) || (cqe_fp_flags & ETH_RX_ERROR_FALGS)) |
@@ -2121,18 +2120,16 @@ static int bnx2x_get_sset_count(struct net_device *dev, int stringset) | |||
2121 | case ETH_SS_STATS: | 2120 | case ETH_SS_STATS: |
2122 | if (is_multi(bp)) { | 2121 | if (is_multi(bp)) { |
2123 | num_stats = bnx2x_num_stat_queues(bp) * | 2122 | num_stats = bnx2x_num_stat_queues(bp) * |
2124 | BNX2X_NUM_Q_STATS; | 2123 | BNX2X_NUM_Q_STATS; |
2125 | if (!IS_MF_MODE_STAT(bp)) | 2124 | } else |
2126 | num_stats += BNX2X_NUM_STATS; | 2125 | num_stats = 0; |
2127 | } else { | 2126 | if (IS_MF_MODE_STAT(bp)) { |
2128 | if (IS_MF_MODE_STAT(bp)) { | 2127 | for (i = 0; i < BNX2X_NUM_STATS; i++) |
2129 | num_stats = 0; | 2128 | if (IS_FUNC_STAT(i)) |
2130 | for (i = 0; i < BNX2X_NUM_STATS; i++) | 2129 | num_stats++; |
2131 | if (IS_FUNC_STAT(i)) | 2130 | } else |
2132 | num_stats++; | 2131 | num_stats += BNX2X_NUM_STATS; |
2133 | } else | 2132 | |
2134 | num_stats = BNX2X_NUM_STATS; | ||
2135 | } | ||
2136 | return num_stats; | 2133 | return num_stats; |
2137 | 2134 | ||
2138 | case ETH_SS_TEST: | 2135 | case ETH_SS_TEST: |
@@ -2151,8 +2148,8 @@ static void bnx2x_get_strings(struct net_device *dev, u32 stringset, u8 *buf) | |||
2151 | 2148 | ||
2152 | switch (stringset) { | 2149 | switch (stringset) { |
2153 | case ETH_SS_STATS: | 2150 | case ETH_SS_STATS: |
2151 | k = 0; | ||
2154 | if (is_multi(bp)) { | 2152 | if (is_multi(bp)) { |
2155 | k = 0; | ||
2156 | for_each_eth_queue(bp, i) { | 2153 | for_each_eth_queue(bp, i) { |
2157 | memset(queue_name, 0, sizeof(queue_name)); | 2154 | memset(queue_name, 0, sizeof(queue_name)); |
2158 | sprintf(queue_name, "%d", i); | 2155 | sprintf(queue_name, "%d", i); |
@@ -2163,20 +2160,17 @@ static void bnx2x_get_strings(struct net_device *dev, u32 stringset, u8 *buf) | |||
2163 | queue_name); | 2160 | queue_name); |
2164 | k += BNX2X_NUM_Q_STATS; | 2161 | k += BNX2X_NUM_Q_STATS; |
2165 | } | 2162 | } |
2166 | if (IS_MF_MODE_STAT(bp)) | ||
2167 | break; | ||
2168 | for (j = 0; j < BNX2X_NUM_STATS; j++) | ||
2169 | strcpy(buf + (k + j)*ETH_GSTRING_LEN, | ||
2170 | bnx2x_stats_arr[j].string); | ||
2171 | } else { | ||
2172 | for (i = 0, j = 0; i < BNX2X_NUM_STATS; i++) { | ||
2173 | if (IS_MF_MODE_STAT(bp) && IS_PORT_STAT(i)) | ||
2174 | continue; | ||
2175 | strcpy(buf + j*ETH_GSTRING_LEN, | ||
2176 | bnx2x_stats_arr[i].string); | ||
2177 | j++; | ||
2178 | } | ||
2179 | } | 2163 | } |
2164 | |||
2165 | |||
2166 | for (i = 0, j = 0; i < BNX2X_NUM_STATS; i++) { | ||
2167 | if (IS_MF_MODE_STAT(bp) && IS_PORT_STAT(i)) | ||
2168 | continue; | ||
2169 | strcpy(buf + (k + j)*ETH_GSTRING_LEN, | ||
2170 | bnx2x_stats_arr[i].string); | ||
2171 | j++; | ||
2172 | } | ||
2173 | |||
2180 | break; | 2174 | break; |
2181 | 2175 | ||
2182 | case ETH_SS_TEST: | 2176 | case ETH_SS_TEST: |
@@ -2190,10 +2184,9 @@ static void bnx2x_get_ethtool_stats(struct net_device *dev, | |||
2190 | { | 2184 | { |
2191 | struct bnx2x *bp = netdev_priv(dev); | 2185 | struct bnx2x *bp = netdev_priv(dev); |
2192 | u32 *hw_stats, *offset; | 2186 | u32 *hw_stats, *offset; |
2193 | int i, j, k; | 2187 | int i, j, k = 0; |
2194 | 2188 | ||
2195 | if (is_multi(bp)) { | 2189 | if (is_multi(bp)) { |
2196 | k = 0; | ||
2197 | for_each_eth_queue(bp, i) { | 2190 | for_each_eth_queue(bp, i) { |
2198 | hw_stats = (u32 *)&bp->fp[i].eth_q_stats; | 2191 | hw_stats = (u32 *)&bp->fp[i].eth_q_stats; |
2199 | for (j = 0; j < BNX2X_NUM_Q_STATS; j++) { | 2192 | for (j = 0; j < BNX2X_NUM_Q_STATS; j++) { |
@@ -2214,46 +2207,28 @@ static void bnx2x_get_ethtool_stats(struct net_device *dev, | |||
2214 | } | 2207 | } |
2215 | k += BNX2X_NUM_Q_STATS; | 2208 | k += BNX2X_NUM_Q_STATS; |
2216 | } | 2209 | } |
2217 | if (IS_MF_MODE_STAT(bp)) | 2210 | } |
2218 | return; | 2211 | |
2219 | hw_stats = (u32 *)&bp->eth_stats; | 2212 | hw_stats = (u32 *)&bp->eth_stats; |
2220 | for (j = 0; j < BNX2X_NUM_STATS; j++) { | 2213 | for (i = 0, j = 0; i < BNX2X_NUM_STATS; i++) { |
2221 | if (bnx2x_stats_arr[j].size == 0) { | 2214 | if (IS_MF_MODE_STAT(bp) && IS_PORT_STAT(i)) |
2222 | /* skip this counter */ | 2215 | continue; |
2223 | buf[k + j] = 0; | 2216 | if (bnx2x_stats_arr[i].size == 0) { |
2224 | continue; | 2217 | /* skip this counter */ |
2225 | } | 2218 | buf[k + j] = 0; |
2226 | offset = (hw_stats + bnx2x_stats_arr[j].offset); | 2219 | j++; |
2227 | if (bnx2x_stats_arr[j].size == 4) { | 2220 | continue; |
2228 | /* 4-byte counter */ | ||
2229 | buf[k + j] = (u64) *offset; | ||
2230 | continue; | ||
2231 | } | ||
2232 | /* 8-byte counter */ | ||
2233 | buf[k + j] = HILO_U64(*offset, *(offset + 1)); | ||
2234 | } | 2221 | } |
2235 | } else { | 2222 | offset = (hw_stats + bnx2x_stats_arr[i].offset); |
2236 | hw_stats = (u32 *)&bp->eth_stats; | 2223 | if (bnx2x_stats_arr[i].size == 4) { |
2237 | for (i = 0, j = 0; i < BNX2X_NUM_STATS; i++) { | 2224 | /* 4-byte counter */ |
2238 | if (IS_MF_MODE_STAT(bp) && IS_PORT_STAT(i)) | 2225 | buf[k + j] = (u64) *offset; |
2239 | continue; | ||
2240 | if (bnx2x_stats_arr[i].size == 0) { | ||
2241 | /* skip this counter */ | ||
2242 | buf[j] = 0; | ||
2243 | j++; | ||
2244 | continue; | ||
2245 | } | ||
2246 | offset = (hw_stats + bnx2x_stats_arr[i].offset); | ||
2247 | if (bnx2x_stats_arr[i].size == 4) { | ||
2248 | /* 4-byte counter */ | ||
2249 | buf[j] = (u64) *offset; | ||
2250 | j++; | ||
2251 | continue; | ||
2252 | } | ||
2253 | /* 8-byte counter */ | ||
2254 | buf[j] = HILO_U64(*offset, *(offset + 1)); | ||
2255 | j++; | 2226 | j++; |
2227 | continue; | ||
2256 | } | 2228 | } |
2229 | /* 8-byte counter */ | ||
2230 | buf[k + j] = HILO_U64(*offset, *(offset + 1)); | ||
2231 | j++; | ||
2257 | } | 2232 | } |
2258 | } | 2233 | } |
2259 | 2234 | ||
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c index ffeaaa95ed96..1e3f978ee6da 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | |||
@@ -941,7 +941,7 @@ void bnx2x_panic_dump(struct bnx2x *bp) | |||
941 | struct sw_rx_bd *sw_bd = &fp->rx_buf_ring[j]; | 941 | struct sw_rx_bd *sw_bd = &fp->rx_buf_ring[j]; |
942 | 942 | ||
943 | BNX2X_ERR("fp%d: rx_bd[%x]=[%x:%x] sw_bd=[%p]\n", | 943 | BNX2X_ERR("fp%d: rx_bd[%x]=[%x:%x] sw_bd=[%p]\n", |
944 | i, j, rx_bd[1], rx_bd[0], sw_bd->skb); | 944 | i, j, rx_bd[1], rx_bd[0], sw_bd->data); |
945 | } | 945 | } |
946 | 946 | ||
947 | start = RX_SGE(fp->rx_sge_prod); | 947 | start = RX_SGE(fp->rx_sge_prod); |
@@ -10536,6 +10536,9 @@ static int __devinit bnx2x_init_dev(struct pci_dev *pdev, | |||
10536 | { | 10536 | { |
10537 | struct bnx2x *bp; | 10537 | struct bnx2x *bp; |
10538 | int rc; | 10538 | int rc; |
10539 | bool chip_is_e1x = (board_type == BCM57710 || | ||
10540 | board_type == BCM57711 || | ||
10541 | board_type == BCM57711E); | ||
10539 | 10542 | ||
10540 | SET_NETDEV_DEV(dev, &pdev->dev); | 10543 | SET_NETDEV_DEV(dev, &pdev->dev); |
10541 | bp = netdev_priv(dev); | 10544 | bp = netdev_priv(dev); |
@@ -10624,7 +10627,7 @@ static int __devinit bnx2x_init_dev(struct pci_dev *pdev, | |||
10624 | REG_WR(bp, PXP2_REG_PGL_ADDR_90_F0, 0); | 10627 | REG_WR(bp, PXP2_REG_PGL_ADDR_90_F0, 0); |
10625 | REG_WR(bp, PXP2_REG_PGL_ADDR_94_F0, 0); | 10628 | REG_WR(bp, PXP2_REG_PGL_ADDR_94_F0, 0); |
10626 | 10629 | ||
10627 | if (CHIP_IS_E1x(bp)) { | 10630 | if (chip_is_e1x) { |
10628 | REG_WR(bp, PXP2_REG_PGL_ADDR_88_F1, 0); | 10631 | REG_WR(bp, PXP2_REG_PGL_ADDR_88_F1, 0); |
10629 | REG_WR(bp, PXP2_REG_PGL_ADDR_8C_F1, 0); | 10632 | REG_WR(bp, PXP2_REG_PGL_ADDR_8C_F1, 0); |
10630 | REG_WR(bp, PXP2_REG_PGL_ADDR_90_F1, 0); | 10633 | REG_WR(bp, PXP2_REG_PGL_ADDR_90_F1, 0); |
@@ -10635,9 +10638,7 @@ static int __devinit bnx2x_init_dev(struct pci_dev *pdev, | |||
10635 | * Enable internal target-read (in case we are probed after PF FLR). | 10638 | * Enable internal target-read (in case we are probed after PF FLR). |
10636 | * Must be done prior to any BAR read access. Only for 57712 and up | 10639 | * Must be done prior to any BAR read access. Only for 57712 and up |
10637 | */ | 10640 | */ |
10638 | if (board_type != BCM57710 && | 10641 | if (!chip_is_e1x) |
10639 | board_type != BCM57711 && | ||
10640 | board_type != BCM57711E) | ||
10641 | REG_WR(bp, PGLUE_B_REG_INTERNAL_PFID_ENABLE_TARGET_READ, 1); | 10642 | REG_WR(bp, PGLUE_B_REG_INTERNAL_PFID_ENABLE_TARGET_READ, 1); |
10642 | 10643 | ||
10643 | /* Reset the load counter */ | 10644 | /* Reset the load counter */ |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c index 5ac616093f9f..cb6339c35571 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c | |||
@@ -50,6 +50,7 @@ static inline void bnx2x_exe_queue_init(struct bnx2x *bp, | |||
50 | int exe_len, | 50 | int exe_len, |
51 | union bnx2x_qable_obj *owner, | 51 | union bnx2x_qable_obj *owner, |
52 | exe_q_validate validate, | 52 | exe_q_validate validate, |
53 | exe_q_remove remove, | ||
53 | exe_q_optimize optimize, | 54 | exe_q_optimize optimize, |
54 | exe_q_execute exec, | 55 | exe_q_execute exec, |
55 | exe_q_get get) | 56 | exe_q_get get) |
@@ -66,6 +67,7 @@ static inline void bnx2x_exe_queue_init(struct bnx2x *bp, | |||
66 | 67 | ||
67 | /* Owner specific callbacks */ | 68 | /* Owner specific callbacks */ |
68 | o->validate = validate; | 69 | o->validate = validate; |
70 | o->remove = remove; | ||
69 | o->optimize = optimize; | 71 | o->optimize = optimize; |
70 | o->execute = exec; | 72 | o->execute = exec; |
71 | o->get = get; | 73 | o->get = get; |
@@ -1340,6 +1342,35 @@ static int bnx2x_validate_vlan_mac(struct bnx2x *bp, | |||
1340 | } | 1342 | } |
1341 | } | 1343 | } |
1342 | 1344 | ||
1345 | static int bnx2x_remove_vlan_mac(struct bnx2x *bp, | ||
1346 | union bnx2x_qable_obj *qo, | ||
1347 | struct bnx2x_exeq_elem *elem) | ||
1348 | { | ||
1349 | int rc = 0; | ||
1350 | |||
1351 | /* If consumption wasn't required, nothing to do */ | ||
1352 | if (test_bit(BNX2X_DONT_CONSUME_CAM_CREDIT, | ||
1353 | &elem->cmd_data.vlan_mac.vlan_mac_flags)) | ||
1354 | return 0; | ||
1355 | |||
1356 | switch (elem->cmd_data.vlan_mac.cmd) { | ||
1357 | case BNX2X_VLAN_MAC_ADD: | ||
1358 | case BNX2X_VLAN_MAC_MOVE: | ||
1359 | rc = qo->vlan_mac.put_credit(&qo->vlan_mac); | ||
1360 | break; | ||
1361 | case BNX2X_VLAN_MAC_DEL: | ||
1362 | rc = qo->vlan_mac.get_credit(&qo->vlan_mac); | ||
1363 | break; | ||
1364 | default: | ||
1365 | return -EINVAL; | ||
1366 | } | ||
1367 | |||
1368 | if (rc != true) | ||
1369 | return -EINVAL; | ||
1370 | |||
1371 | return 0; | ||
1372 | } | ||
1373 | |||
1343 | /** | 1374 | /** |
1344 | * bnx2x_wait_vlan_mac - passivly wait for 5 seconds until all work completes. | 1375 | * bnx2x_wait_vlan_mac - passivly wait for 5 seconds until all work completes. |
1345 | * | 1376 | * |
@@ -1801,8 +1832,14 @@ static int bnx2x_vlan_mac_del_all(struct bnx2x *bp, | |||
1801 | 1832 | ||
1802 | list_for_each_entry_safe(exeq_pos, exeq_pos_n, &exeq->exe_queue, link) { | 1833 | list_for_each_entry_safe(exeq_pos, exeq_pos_n, &exeq->exe_queue, link) { |
1803 | if (exeq_pos->cmd_data.vlan_mac.vlan_mac_flags == | 1834 | if (exeq_pos->cmd_data.vlan_mac.vlan_mac_flags == |
1804 | *vlan_mac_flags) | 1835 | *vlan_mac_flags) { |
1836 | rc = exeq->remove(bp, exeq->owner, exeq_pos); | ||
1837 | if (rc) { | ||
1838 | BNX2X_ERR("Failed to remove command\n"); | ||
1839 | return rc; | ||
1840 | } | ||
1805 | list_del(&exeq_pos->link); | 1841 | list_del(&exeq_pos->link); |
1842 | } | ||
1806 | } | 1843 | } |
1807 | 1844 | ||
1808 | spin_unlock_bh(&exeq->lock); | 1845 | spin_unlock_bh(&exeq->lock); |
@@ -1908,6 +1945,7 @@ void bnx2x_init_mac_obj(struct bnx2x *bp, | |||
1908 | bnx2x_exe_queue_init(bp, | 1945 | bnx2x_exe_queue_init(bp, |
1909 | &mac_obj->exe_queue, 1, qable_obj, | 1946 | &mac_obj->exe_queue, 1, qable_obj, |
1910 | bnx2x_validate_vlan_mac, | 1947 | bnx2x_validate_vlan_mac, |
1948 | bnx2x_remove_vlan_mac, | ||
1911 | bnx2x_optimize_vlan_mac, | 1949 | bnx2x_optimize_vlan_mac, |
1912 | bnx2x_execute_vlan_mac, | 1950 | bnx2x_execute_vlan_mac, |
1913 | bnx2x_exeq_get_mac); | 1951 | bnx2x_exeq_get_mac); |
@@ -1924,6 +1962,7 @@ void bnx2x_init_mac_obj(struct bnx2x *bp, | |||
1924 | bnx2x_exe_queue_init(bp, | 1962 | bnx2x_exe_queue_init(bp, |
1925 | &mac_obj->exe_queue, CLASSIFY_RULES_COUNT, | 1963 | &mac_obj->exe_queue, CLASSIFY_RULES_COUNT, |
1926 | qable_obj, bnx2x_validate_vlan_mac, | 1964 | qable_obj, bnx2x_validate_vlan_mac, |
1965 | bnx2x_remove_vlan_mac, | ||
1927 | bnx2x_optimize_vlan_mac, | 1966 | bnx2x_optimize_vlan_mac, |
1928 | bnx2x_execute_vlan_mac, | 1967 | bnx2x_execute_vlan_mac, |
1929 | bnx2x_exeq_get_mac); | 1968 | bnx2x_exeq_get_mac); |
@@ -1963,6 +2002,7 @@ void bnx2x_init_vlan_obj(struct bnx2x *bp, | |||
1963 | bnx2x_exe_queue_init(bp, | 2002 | bnx2x_exe_queue_init(bp, |
1964 | &vlan_obj->exe_queue, CLASSIFY_RULES_COUNT, | 2003 | &vlan_obj->exe_queue, CLASSIFY_RULES_COUNT, |
1965 | qable_obj, bnx2x_validate_vlan_mac, | 2004 | qable_obj, bnx2x_validate_vlan_mac, |
2005 | bnx2x_remove_vlan_mac, | ||
1966 | bnx2x_optimize_vlan_mac, | 2006 | bnx2x_optimize_vlan_mac, |
1967 | bnx2x_execute_vlan_mac, | 2007 | bnx2x_execute_vlan_mac, |
1968 | bnx2x_exeq_get_vlan); | 2008 | bnx2x_exeq_get_vlan); |
@@ -2009,6 +2049,7 @@ void bnx2x_init_vlan_mac_obj(struct bnx2x *bp, | |||
2009 | bnx2x_exe_queue_init(bp, | 2049 | bnx2x_exe_queue_init(bp, |
2010 | &vlan_mac_obj->exe_queue, 1, qable_obj, | 2050 | &vlan_mac_obj->exe_queue, 1, qable_obj, |
2011 | bnx2x_validate_vlan_mac, | 2051 | bnx2x_validate_vlan_mac, |
2052 | bnx2x_remove_vlan_mac, | ||
2012 | bnx2x_optimize_vlan_mac, | 2053 | bnx2x_optimize_vlan_mac, |
2013 | bnx2x_execute_vlan_mac, | 2054 | bnx2x_execute_vlan_mac, |
2014 | bnx2x_exeq_get_vlan_mac); | 2055 | bnx2x_exeq_get_vlan_mac); |
@@ -2025,6 +2066,7 @@ void bnx2x_init_vlan_mac_obj(struct bnx2x *bp, | |||
2025 | &vlan_mac_obj->exe_queue, | 2066 | &vlan_mac_obj->exe_queue, |
2026 | CLASSIFY_RULES_COUNT, | 2067 | CLASSIFY_RULES_COUNT, |
2027 | qable_obj, bnx2x_validate_vlan_mac, | 2068 | qable_obj, bnx2x_validate_vlan_mac, |
2069 | bnx2x_remove_vlan_mac, | ||
2028 | bnx2x_optimize_vlan_mac, | 2070 | bnx2x_optimize_vlan_mac, |
2029 | bnx2x_execute_vlan_mac, | 2071 | bnx2x_execute_vlan_mac, |
2030 | bnx2x_exeq_get_vlan_mac); | 2072 | bnx2x_exeq_get_vlan_mac); |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.h index 992308ff82e8..66da39f0c84a 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.h +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.h | |||
@@ -161,6 +161,10 @@ typedef int (*exe_q_validate)(struct bnx2x *bp, | |||
161 | union bnx2x_qable_obj *o, | 161 | union bnx2x_qable_obj *o, |
162 | struct bnx2x_exeq_elem *elem); | 162 | struct bnx2x_exeq_elem *elem); |
163 | 163 | ||
164 | typedef int (*exe_q_remove)(struct bnx2x *bp, | ||
165 | union bnx2x_qable_obj *o, | ||
166 | struct bnx2x_exeq_elem *elem); | ||
167 | |||
164 | /** | 168 | /** |
165 | * @return positive is entry was optimized, 0 - if not, negative | 169 | * @return positive is entry was optimized, 0 - if not, negative |
166 | * in case of an error. | 170 | * in case of an error. |
@@ -203,11 +207,18 @@ struct bnx2x_exe_queue_obj { | |||
203 | */ | 207 | */ |
204 | exe_q_validate validate; | 208 | exe_q_validate validate; |
205 | 209 | ||
210 | /** | ||
211 | * Called before removing pending commands, cleaning allocated | ||
212 | * resources (e.g., credits from validate) | ||
213 | */ | ||
214 | exe_q_remove remove; | ||
206 | 215 | ||
207 | /** | 216 | /** |
208 | * This will try to cancel the current pending commands list | 217 | * This will try to cancel the current pending commands list |
209 | * considering the new command. | 218 | * considering the new command. |
210 | * | 219 | * |
220 | * Returns the number of optimized commands or a negative error code | ||
221 | * | ||
211 | * Must run under exe_queue->lock | 222 | * Must run under exe_queue->lock |
212 | */ | 223 | */ |
213 | exe_q_optimize optimize; | 224 | exe_q_optimize optimize; |
diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c index d529af99157d..a1f2e0fed78b 100644 --- a/drivers/net/ethernet/broadcom/tg3.c +++ b/drivers/net/ethernet/broadcom/tg3.c | |||
@@ -6667,14 +6667,9 @@ static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
6667 | iph = ip_hdr(skb); | 6667 | iph = ip_hdr(skb); |
6668 | tcp_opt_len = tcp_optlen(skb); | 6668 | tcp_opt_len = tcp_optlen(skb); |
6669 | 6669 | ||
6670 | if (skb_is_gso_v6(skb)) { | 6670 | hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb) - ETH_HLEN; |
6671 | hdr_len = skb_headlen(skb) - ETH_HLEN; | ||
6672 | } else { | ||
6673 | u32 ip_tcp_len; | ||
6674 | |||
6675 | ip_tcp_len = ip_hdrlen(skb) + sizeof(struct tcphdr); | ||
6676 | hdr_len = ip_tcp_len + tcp_opt_len; | ||
6677 | 6671 | ||
6672 | if (!skb_is_gso_v6(skb)) { | ||
6678 | iph->check = 0; | 6673 | iph->check = 0; |
6679 | iph->tot_len = htons(mss + hdr_len); | 6674 | iph->tot_len = htons(mss + hdr_len); |
6680 | } | 6675 | } |
diff --git a/drivers/net/ethernet/cisco/enic/enic.h b/drivers/net/ethernet/cisco/enic/enic.h index fe0c29acdbe6..ee93a2087fe6 100644 --- a/drivers/net/ethernet/cisco/enic/enic.h +++ b/drivers/net/ethernet/cisco/enic/enic.h | |||
@@ -32,7 +32,7 @@ | |||
32 | 32 | ||
33 | #define DRV_NAME "enic" | 33 | #define DRV_NAME "enic" |
34 | #define DRV_DESCRIPTION "Cisco VIC Ethernet NIC Driver" | 34 | #define DRV_DESCRIPTION "Cisco VIC Ethernet NIC Driver" |
35 | #define DRV_VERSION "2.1.1.28" | 35 | #define DRV_VERSION "2.1.1.31" |
36 | #define DRV_COPYRIGHT "Copyright 2008-2011 Cisco Systems, Inc" | 36 | #define DRV_COPYRIGHT "Copyright 2008-2011 Cisco Systems, Inc" |
37 | 37 | ||
38 | #define ENIC_BARS_MAX 6 | 38 | #define ENIC_BARS_MAX 6 |
diff --git a/drivers/net/ethernet/cisco/enic/enic_main.c b/drivers/net/ethernet/cisco/enic/enic_main.c index 2fd9db4b1be5..ab3f67f980d8 100644 --- a/drivers/net/ethernet/cisco/enic/enic_main.c +++ b/drivers/net/ethernet/cisco/enic/enic_main.c | |||
@@ -57,11 +57,13 @@ | |||
57 | 57 | ||
58 | #define PCI_DEVICE_ID_CISCO_VIC_ENET 0x0043 /* ethernet vnic */ | 58 | #define PCI_DEVICE_ID_CISCO_VIC_ENET 0x0043 /* ethernet vnic */ |
59 | #define PCI_DEVICE_ID_CISCO_VIC_ENET_DYN 0x0044 /* enet dynamic vnic */ | 59 | #define PCI_DEVICE_ID_CISCO_VIC_ENET_DYN 0x0044 /* enet dynamic vnic */ |
60 | #define PCI_DEVICE_ID_CISCO_VIC_ENET_VF 0x0071 /* enet SRIOV VF */ | ||
60 | 61 | ||
61 | /* Supported devices */ | 62 | /* Supported devices */ |
62 | static DEFINE_PCI_DEVICE_TABLE(enic_id_table) = { | 63 | static DEFINE_PCI_DEVICE_TABLE(enic_id_table) = { |
63 | { PCI_VDEVICE(CISCO, PCI_DEVICE_ID_CISCO_VIC_ENET) }, | 64 | { PCI_VDEVICE(CISCO, PCI_DEVICE_ID_CISCO_VIC_ENET) }, |
64 | { PCI_VDEVICE(CISCO, PCI_DEVICE_ID_CISCO_VIC_ENET_DYN) }, | 65 | { PCI_VDEVICE(CISCO, PCI_DEVICE_ID_CISCO_VIC_ENET_DYN) }, |
66 | { PCI_VDEVICE(CISCO, PCI_DEVICE_ID_CISCO_VIC_ENET_VF) }, | ||
65 | { 0, } /* end of table */ | 67 | { 0, } /* end of table */ |
66 | }; | 68 | }; |
67 | 69 | ||
@@ -132,6 +134,11 @@ int enic_sriov_enabled(struct enic *enic) | |||
132 | return (enic->priv_flags & ENIC_SRIOV_ENABLED) ? 1 : 0; | 134 | return (enic->priv_flags & ENIC_SRIOV_ENABLED) ? 1 : 0; |
133 | } | 135 | } |
134 | 136 | ||
137 | static int enic_is_sriov_vf(struct enic *enic) | ||
138 | { | ||
139 | return enic->pdev->device == PCI_DEVICE_ID_CISCO_VIC_ENET_VF; | ||
140 | } | ||
141 | |||
135 | int enic_is_valid_vf(struct enic *enic, int vf) | 142 | int enic_is_valid_vf(struct enic *enic, int vf) |
136 | { | 143 | { |
137 | #ifdef CONFIG_PCI_IOV | 144 | #ifdef CONFIG_PCI_IOV |
@@ -437,7 +444,7 @@ static void enic_mtu_check(struct enic *enic) | |||
437 | 444 | ||
438 | if (mtu && mtu != enic->port_mtu) { | 445 | if (mtu && mtu != enic->port_mtu) { |
439 | enic->port_mtu = mtu; | 446 | enic->port_mtu = mtu; |
440 | if (enic_is_dynamic(enic)) { | 447 | if (enic_is_dynamic(enic) || enic_is_sriov_vf(enic)) { |
441 | mtu = max_t(int, ENIC_MIN_MTU, | 448 | mtu = max_t(int, ENIC_MIN_MTU, |
442 | min_t(int, ENIC_MAX_MTU, mtu)); | 449 | min_t(int, ENIC_MAX_MTU, mtu)); |
443 | if (mtu != netdev->mtu) | 450 | if (mtu != netdev->mtu) |
@@ -849,7 +856,7 @@ static int enic_set_mac_addr(struct net_device *netdev, char *addr) | |||
849 | { | 856 | { |
850 | struct enic *enic = netdev_priv(netdev); | 857 | struct enic *enic = netdev_priv(netdev); |
851 | 858 | ||
852 | if (enic_is_dynamic(enic)) { | 859 | if (enic_is_dynamic(enic) || enic_is_sriov_vf(enic)) { |
853 | if (!is_valid_ether_addr(addr) && !is_zero_ether_addr(addr)) | 860 | if (!is_valid_ether_addr(addr) && !is_zero_ether_addr(addr)) |
854 | return -EADDRNOTAVAIL; | 861 | return -EADDRNOTAVAIL; |
855 | } else { | 862 | } else { |
@@ -1608,7 +1615,7 @@ static int enic_open(struct net_device *netdev) | |||
1608 | for (i = 0; i < enic->rq_count; i++) | 1615 | for (i = 0; i < enic->rq_count; i++) |
1609 | vnic_rq_enable(&enic->rq[i]); | 1616 | vnic_rq_enable(&enic->rq[i]); |
1610 | 1617 | ||
1611 | if (!enic_is_dynamic(enic)) | 1618 | if (!enic_is_dynamic(enic) && !enic_is_sriov_vf(enic)) |
1612 | enic_dev_add_station_addr(enic); | 1619 | enic_dev_add_station_addr(enic); |
1613 | 1620 | ||
1614 | enic_set_rx_mode(netdev); | 1621 | enic_set_rx_mode(netdev); |
@@ -1659,7 +1666,7 @@ static int enic_stop(struct net_device *netdev) | |||
1659 | netif_carrier_off(netdev); | 1666 | netif_carrier_off(netdev); |
1660 | netif_tx_disable(netdev); | 1667 | netif_tx_disable(netdev); |
1661 | 1668 | ||
1662 | if (!enic_is_dynamic(enic)) | 1669 | if (!enic_is_dynamic(enic) && !enic_is_sriov_vf(enic)) |
1663 | enic_dev_del_station_addr(enic); | 1670 | enic_dev_del_station_addr(enic); |
1664 | 1671 | ||
1665 | for (i = 0; i < enic->wq_count; i++) { | 1672 | for (i = 0; i < enic->wq_count; i++) { |
@@ -1696,7 +1703,7 @@ static int enic_change_mtu(struct net_device *netdev, int new_mtu) | |||
1696 | if (new_mtu < ENIC_MIN_MTU || new_mtu > ENIC_MAX_MTU) | 1703 | if (new_mtu < ENIC_MIN_MTU || new_mtu > ENIC_MAX_MTU) |
1697 | return -EINVAL; | 1704 | return -EINVAL; |
1698 | 1705 | ||
1699 | if (enic_is_dynamic(enic)) | 1706 | if (enic_is_dynamic(enic) || enic_is_sriov_vf(enic)) |
1700 | return -EOPNOTSUPP; | 1707 | return -EOPNOTSUPP; |
1701 | 1708 | ||
1702 | if (running) | 1709 | if (running) |
@@ -2263,10 +2270,10 @@ static int __devinit enic_probe(struct pci_dev *pdev, | |||
2263 | int using_dac = 0; | 2270 | int using_dac = 0; |
2264 | unsigned int i; | 2271 | unsigned int i; |
2265 | int err; | 2272 | int err; |
2266 | int num_pps = 1; | ||
2267 | #ifdef CONFIG_PCI_IOV | 2273 | #ifdef CONFIG_PCI_IOV |
2268 | int pos = 0; | 2274 | int pos = 0; |
2269 | #endif | 2275 | #endif |
2276 | int num_pps = 1; | ||
2270 | 2277 | ||
2271 | /* Allocate net device structure and initialize. Private | 2278 | /* Allocate net device structure and initialize. Private |
2272 | * instance data is initialized to zero. | 2279 | * instance data is initialized to zero. |
@@ -2376,14 +2383,14 @@ static int __devinit enic_probe(struct pci_dev *pdev, | |||
2376 | num_pps = enic->num_vfs; | 2383 | num_pps = enic->num_vfs; |
2377 | } | 2384 | } |
2378 | } | 2385 | } |
2379 | |||
2380 | #endif | 2386 | #endif |
2387 | |||
2381 | /* Allocate structure for port profiles */ | 2388 | /* Allocate structure for port profiles */ |
2382 | enic->pp = kcalloc(num_pps, sizeof(*enic->pp), GFP_KERNEL); | 2389 | enic->pp = kcalloc(num_pps, sizeof(*enic->pp), GFP_KERNEL); |
2383 | if (!enic->pp) { | 2390 | if (!enic->pp) { |
2384 | pr_err("port profile alloc failed, aborting\n"); | 2391 | pr_err("port profile alloc failed, aborting\n"); |
2385 | err = -ENOMEM; | 2392 | err = -ENOMEM; |
2386 | goto err_out_disable_sriov; | 2393 | goto err_out_disable_sriov_pp; |
2387 | } | 2394 | } |
2388 | 2395 | ||
2389 | /* Issue device open to get device in known state | 2396 | /* Issue device open to get device in known state |
@@ -2392,7 +2399,7 @@ static int __devinit enic_probe(struct pci_dev *pdev, | |||
2392 | err = enic_dev_open(enic); | 2399 | err = enic_dev_open(enic); |
2393 | if (err) { | 2400 | if (err) { |
2394 | dev_err(dev, "vNIC dev open failed, aborting\n"); | 2401 | dev_err(dev, "vNIC dev open failed, aborting\n"); |
2395 | goto err_out_free_pp; | 2402 | goto err_out_disable_sriov; |
2396 | } | 2403 | } |
2397 | 2404 | ||
2398 | /* Setup devcmd lock | 2405 | /* Setup devcmd lock |
@@ -2426,7 +2433,7 @@ static int __devinit enic_probe(struct pci_dev *pdev, | |||
2426 | * called later by an upper layer. | 2433 | * called later by an upper layer. |
2427 | */ | 2434 | */ |
2428 | 2435 | ||
2429 | if (!enic_is_dynamic(enic)) { | 2436 | if (!enic_is_dynamic(enic) && !enic_is_sriov_vf(enic)) { |
2430 | err = vnic_dev_init(enic->vdev, 0); | 2437 | err = vnic_dev_init(enic->vdev, 0); |
2431 | if (err) { | 2438 | if (err) { |
2432 | dev_err(dev, "vNIC dev init failed, aborting\n"); | 2439 | dev_err(dev, "vNIC dev init failed, aborting\n"); |
@@ -2460,8 +2467,7 @@ static int __devinit enic_probe(struct pci_dev *pdev, | |||
2460 | (void)enic_change_mtu(netdev, enic->port_mtu); | 2467 | (void)enic_change_mtu(netdev, enic->port_mtu); |
2461 | 2468 | ||
2462 | #ifdef CONFIG_PCI_IOV | 2469 | #ifdef CONFIG_PCI_IOV |
2463 | if (enic_is_dynamic(enic) && pdev->is_virtfn && | 2470 | if (enic_is_sriov_vf(enic) && is_zero_ether_addr(enic->mac_addr)) |
2464 | is_zero_ether_addr(enic->mac_addr)) | ||
2465 | random_ether_addr(enic->mac_addr); | 2471 | random_ether_addr(enic->mac_addr); |
2466 | #endif | 2472 | #endif |
2467 | 2473 | ||
@@ -2474,7 +2480,7 @@ static int __devinit enic_probe(struct pci_dev *pdev, | |||
2474 | enic->tx_coalesce_usecs = enic->config.intr_timer_usec; | 2480 | enic->tx_coalesce_usecs = enic->config.intr_timer_usec; |
2475 | enic->rx_coalesce_usecs = enic->tx_coalesce_usecs; | 2481 | enic->rx_coalesce_usecs = enic->tx_coalesce_usecs; |
2476 | 2482 | ||
2477 | if (enic_is_dynamic(enic)) | 2483 | if (enic_is_dynamic(enic) || enic_is_sriov_vf(enic)) |
2478 | netdev->netdev_ops = &enic_netdev_dynamic_ops; | 2484 | netdev->netdev_ops = &enic_netdev_dynamic_ops; |
2479 | else | 2485 | else |
2480 | netdev->netdev_ops = &enic_netdev_ops; | 2486 | netdev->netdev_ops = &enic_netdev_ops; |
@@ -2516,17 +2522,17 @@ err_out_dev_deinit: | |||
2516 | enic_dev_deinit(enic); | 2522 | enic_dev_deinit(enic); |
2517 | err_out_dev_close: | 2523 | err_out_dev_close: |
2518 | vnic_dev_close(enic->vdev); | 2524 | vnic_dev_close(enic->vdev); |
2519 | err_out_free_pp: | ||
2520 | kfree(enic->pp); | ||
2521 | err_out_disable_sriov: | 2525 | err_out_disable_sriov: |
2526 | kfree(enic->pp); | ||
2527 | err_out_disable_sriov_pp: | ||
2522 | #ifdef CONFIG_PCI_IOV | 2528 | #ifdef CONFIG_PCI_IOV |
2523 | if (enic_sriov_enabled(enic)) { | 2529 | if (enic_sriov_enabled(enic)) { |
2524 | pci_disable_sriov(pdev); | 2530 | pci_disable_sriov(pdev); |
2525 | enic->priv_flags &= ~ENIC_SRIOV_ENABLED; | 2531 | enic->priv_flags &= ~ENIC_SRIOV_ENABLED; |
2526 | } | 2532 | } |
2527 | err_out_vnic_unregister: | 2533 | err_out_vnic_unregister: |
2528 | vnic_dev_unregister(enic->vdev); | ||
2529 | #endif | 2534 | #endif |
2535 | vnic_dev_unregister(enic->vdev); | ||
2530 | err_out_iounmap: | 2536 | err_out_iounmap: |
2531 | enic_iounmap(enic); | 2537 | enic_iounmap(enic); |
2532 | err_out_release_regions: | 2538 | err_out_release_regions: |
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index a6bcdb5cd2be..e703d64434f8 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c | |||
@@ -1786,8 +1786,7 @@ static void be_rx_queues_destroy(struct be_adapter *adapter) | |||
1786 | static u32 be_num_rxqs_want(struct be_adapter *adapter) | 1786 | static u32 be_num_rxqs_want(struct be_adapter *adapter) |
1787 | { | 1787 | { |
1788 | if ((adapter->function_caps & BE_FUNCTION_CAPS_RSS) && | 1788 | if ((adapter->function_caps & BE_FUNCTION_CAPS_RSS) && |
1789 | !sriov_enabled(adapter) && be_physfn(adapter) && | 1789 | !sriov_enabled(adapter) && be_physfn(adapter)) { |
1790 | !be_is_mc(adapter)) { | ||
1791 | return 1 + MAX_RSS_QS; /* one default non-RSS queue */ | 1790 | return 1 + MAX_RSS_QS; /* one default non-RSS queue */ |
1792 | } else { | 1791 | } else { |
1793 | dev_warn(&adapter->pdev->dev, | 1792 | dev_warn(&adapter->pdev->dev, |
diff --git a/drivers/net/ethernet/faraday/ftgmac100.c b/drivers/net/ethernet/faraday/ftgmac100.c index fb5579a3b19d..47f85c337cf7 100644 --- a/drivers/net/ethernet/faraday/ftgmac100.c +++ b/drivers/net/ethernet/faraday/ftgmac100.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <linux/etherdevice.h> | 25 | #include <linux/etherdevice.h> |
26 | #include <linux/ethtool.h> | 26 | #include <linux/ethtool.h> |
27 | #include <linux/init.h> | 27 | #include <linux/init.h> |
28 | #include <linux/interrupt.h> | ||
28 | #include <linux/io.h> | 29 | #include <linux/io.h> |
29 | #include <linux/module.h> | 30 | #include <linux/module.h> |
30 | #include <linux/netdevice.h> | 31 | #include <linux/netdevice.h> |
diff --git a/drivers/net/ethernet/faraday/ftmac100.c b/drivers/net/ethernet/faraday/ftmac100.c index a127cb2476c7..bb336a0959c9 100644 --- a/drivers/net/ethernet/faraday/ftmac100.c +++ b/drivers/net/ethernet/faraday/ftmac100.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <linux/etherdevice.h> | 25 | #include <linux/etherdevice.h> |
26 | #include <linux/ethtool.h> | 26 | #include <linux/ethtool.h> |
27 | #include <linux/init.h> | 27 | #include <linux/init.h> |
28 | #include <linux/interrupt.h> | ||
28 | #include <linux/io.h> | 29 | #include <linux/io.h> |
29 | #include <linux/mii.h> | 30 | #include <linux/mii.h> |
30 | #include <linux/module.h> | 31 | #include <linux/module.h> |
diff --git a/drivers/net/ethernet/intel/igb/Makefile b/drivers/net/ethernet/intel/igb/Makefile index c6e4621b6262..6565c463185c 100644 --- a/drivers/net/ethernet/intel/igb/Makefile +++ b/drivers/net/ethernet/intel/igb/Makefile | |||
@@ -1,7 +1,7 @@ | |||
1 | ################################################################################ | 1 | ################################################################################ |
2 | # | 2 | # |
3 | # Intel 82575 PCI-Express Ethernet Linux driver | 3 | # Intel 82575 PCI-Express Ethernet Linux driver |
4 | # Copyright(c) 1999 - 2011 Intel Corporation. | 4 | # Copyright(c) 1999 - 2012 Intel Corporation. |
5 | # | 5 | # |
6 | # This program is free software; you can redistribute it and/or modify it | 6 | # This program is free software; you can redistribute it and/or modify it |
7 | # under the terms and conditions of the GNU General Public License, | 7 | # under the terms and conditions of the GNU General Public License, |
diff --git a/drivers/net/ethernet/intel/igb/e1000_82575.c b/drivers/net/ethernet/intel/igb/e1000_82575.c index b8e20f037d0a..08bdc33715ee 100644 --- a/drivers/net/ethernet/intel/igb/e1000_82575.c +++ b/drivers/net/ethernet/intel/igb/e1000_82575.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /******************************************************************************* | 1 | /******************************************************************************* |
2 | 2 | ||
3 | Intel(R) Gigabit Ethernet Linux driver | 3 | Intel(R) Gigabit Ethernet Linux driver |
4 | Copyright(c) 2007-2011 Intel Corporation. | 4 | Copyright(c) 2007-2012 Intel Corporation. |
5 | 5 | ||
6 | This program is free software; you can redistribute it and/or modify it | 6 | This program is free software; you can redistribute it and/or modify it |
7 | under the terms and conditions of the GNU General Public License, | 7 | under the terms and conditions of the GNU General Public License, |
diff --git a/drivers/net/ethernet/intel/igb/e1000_82575.h b/drivers/net/ethernet/intel/igb/e1000_82575.h index 08a757eb6608..b927d79ab536 100644 --- a/drivers/net/ethernet/intel/igb/e1000_82575.h +++ b/drivers/net/ethernet/intel/igb/e1000_82575.h | |||
@@ -1,7 +1,7 @@ | |||
1 | /******************************************************************************* | 1 | /******************************************************************************* |
2 | 2 | ||
3 | Intel(R) Gigabit Ethernet Linux driver | 3 | Intel(R) Gigabit Ethernet Linux driver |
4 | Copyright(c) 2007-2011 Intel Corporation. | 4 | Copyright(c) 2007-2012 Intel Corporation. |
5 | 5 | ||
6 | This program is free software; you can redistribute it and/or modify it | 6 | This program is free software; you can redistribute it and/or modify it |
7 | under the terms and conditions of the GNU General Public License, | 7 | under the terms and conditions of the GNU General Public License, |
diff --git a/drivers/net/ethernet/intel/igb/e1000_defines.h b/drivers/net/ethernet/intel/igb/e1000_defines.h index f5fc5725ea94..aed217449f0d 100644 --- a/drivers/net/ethernet/intel/igb/e1000_defines.h +++ b/drivers/net/ethernet/intel/igb/e1000_defines.h | |||
@@ -1,7 +1,7 @@ | |||
1 | /******************************************************************************* | 1 | /******************************************************************************* |
2 | 2 | ||
3 | Intel(R) Gigabit Ethernet Linux driver | 3 | Intel(R) Gigabit Ethernet Linux driver |
4 | Copyright(c) 2007-2011 Intel Corporation. | 4 | Copyright(c) 2007-2012 Intel Corporation. |
5 | 5 | ||
6 | This program is free software; you can redistribute it and/or modify it | 6 | This program is free software; you can redistribute it and/or modify it |
7 | under the terms and conditions of the GNU General Public License, | 7 | under the terms and conditions of the GNU General Public License, |
diff --git a/drivers/net/ethernet/intel/igb/e1000_hw.h b/drivers/net/ethernet/intel/igb/e1000_hw.h index 4519a1367170..f67cbd3fa307 100644 --- a/drivers/net/ethernet/intel/igb/e1000_hw.h +++ b/drivers/net/ethernet/intel/igb/e1000_hw.h | |||
@@ -1,7 +1,7 @@ | |||
1 | /******************************************************************************* | 1 | /******************************************************************************* |
2 | 2 | ||
3 | Intel(R) Gigabit Ethernet Linux driver | 3 | Intel(R) Gigabit Ethernet Linux driver |
4 | Copyright(c) 2007-2011 Intel Corporation. | 4 | Copyright(c) 2007-2012 Intel Corporation. |
5 | 5 | ||
6 | This program is free software; you can redistribute it and/or modify it | 6 | This program is free software; you can redistribute it and/or modify it |
7 | under the terms and conditions of the GNU General Public License, | 7 | under the terms and conditions of the GNU General Public License, |
diff --git a/drivers/net/ethernet/intel/igb/e1000_mac.c b/drivers/net/ethernet/intel/igb/e1000_mac.c index 73aac082c44d..f57338afd71f 100644 --- a/drivers/net/ethernet/intel/igb/e1000_mac.c +++ b/drivers/net/ethernet/intel/igb/e1000_mac.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /******************************************************************************* | 1 | /******************************************************************************* |
2 | 2 | ||
3 | Intel(R) Gigabit Ethernet Linux driver | 3 | Intel(R) Gigabit Ethernet Linux driver |
4 | Copyright(c) 2007-2011 Intel Corporation. | 4 | Copyright(c) 2007-2012 Intel Corporation. |
5 | 5 | ||
6 | This program is free software; you can redistribute it and/or modify it | 6 | This program is free software; you can redistribute it and/or modify it |
7 | under the terms and conditions of the GNU General Public License, | 7 | under the terms and conditions of the GNU General Public License, |
@@ -151,7 +151,7 @@ void igb_clear_vfta_i350(struct e1000_hw *hw) | |||
151 | * Writes value at the given offset in the register array which stores | 151 | * Writes value at the given offset in the register array which stores |
152 | * the VLAN filter table. | 152 | * the VLAN filter table. |
153 | **/ | 153 | **/ |
154 | void igb_write_vfta_i350(struct e1000_hw *hw, u32 offset, u32 value) | 154 | static void igb_write_vfta_i350(struct e1000_hw *hw, u32 offset, u32 value) |
155 | { | 155 | { |
156 | int i; | 156 | int i; |
157 | 157 | ||
diff --git a/drivers/net/ethernet/intel/igb/e1000_mac.h b/drivers/net/ethernet/intel/igb/e1000_mac.h index e45996b4ea34..cbddc4e51e30 100644 --- a/drivers/net/ethernet/intel/igb/e1000_mac.h +++ b/drivers/net/ethernet/intel/igb/e1000_mac.h | |||
@@ -1,7 +1,7 @@ | |||
1 | /******************************************************************************* | 1 | /******************************************************************************* |
2 | 2 | ||
3 | Intel(R) Gigabit Ethernet Linux driver | 3 | Intel(R) Gigabit Ethernet Linux driver |
4 | Copyright(c) 2007-2011 Intel Corporation. | 4 | Copyright(c) 2007-2012 Intel Corporation. |
5 | 5 | ||
6 | This program is free software; you can redistribute it and/or modify it | 6 | This program is free software; you can redistribute it and/or modify it |
7 | under the terms and conditions of the GNU General Public License, | 7 | under the terms and conditions of the GNU General Public License, |
diff --git a/drivers/net/ethernet/intel/igb/e1000_mbx.c b/drivers/net/ethernet/intel/igb/e1000_mbx.c index 469d95eaa154..5988b8958baf 100644 --- a/drivers/net/ethernet/intel/igb/e1000_mbx.c +++ b/drivers/net/ethernet/intel/igb/e1000_mbx.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /******************************************************************************* | 1 | /******************************************************************************* |
2 | 2 | ||
3 | Intel(R) Gigabit Ethernet Linux driver | 3 | Intel(R) Gigabit Ethernet Linux driver |
4 | Copyright(c) 2007-2011 Intel Corporation. | 4 | Copyright(c) 2007-2012 Intel Corporation. |
5 | 5 | ||
6 | This program is free software; you can redistribute it and/or modify it | 6 | This program is free software; you can redistribute it and/or modify it |
7 | under the terms and conditions of the GNU General Public License, | 7 | under the terms and conditions of the GNU General Public License, |
diff --git a/drivers/net/ethernet/intel/igb/e1000_mbx.h b/drivers/net/ethernet/intel/igb/e1000_mbx.h index eddb0f83dcea..dbcfa3d5caec 100644 --- a/drivers/net/ethernet/intel/igb/e1000_mbx.h +++ b/drivers/net/ethernet/intel/igb/e1000_mbx.h | |||
@@ -1,7 +1,7 @@ | |||
1 | /******************************************************************************* | 1 | /******************************************************************************* |
2 | 2 | ||
3 | Intel(R) Gigabit Ethernet Linux driver | 3 | Intel(R) Gigabit Ethernet Linux driver |
4 | Copyright(c) 2007-2011 Intel Corporation. | 4 | Copyright(c) 2007-2012 Intel Corporation. |
5 | 5 | ||
6 | This program is free software; you can redistribute it and/or modify it | 6 | This program is free software; you can redistribute it and/or modify it |
7 | under the terms and conditions of the GNU General Public License, | 7 | under the terms and conditions of the GNU General Public License, |
diff --git a/drivers/net/ethernet/intel/igb/e1000_nvm.c b/drivers/net/ethernet/intel/igb/e1000_nvm.c index 40407124e722..fa2c6ba62139 100644 --- a/drivers/net/ethernet/intel/igb/e1000_nvm.c +++ b/drivers/net/ethernet/intel/igb/e1000_nvm.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /******************************************************************************* | 1 | /******************************************************************************* |
2 | 2 | ||
3 | Intel(R) Gigabit Ethernet Linux driver | 3 | Intel(R) Gigabit Ethernet Linux driver |
4 | Copyright(c) 2007-2011 Intel Corporation. | 4 | Copyright(c) 2007-2012 Intel Corporation. |
5 | 5 | ||
6 | This program is free software; you can redistribute it and/or modify it | 6 | This program is free software; you can redistribute it and/or modify it |
7 | under the terms and conditions of the GNU General Public License, | 7 | under the terms and conditions of the GNU General Public License, |
diff --git a/drivers/net/ethernet/intel/igb/e1000_nvm.h b/drivers/net/ethernet/intel/igb/e1000_nvm.h index a2a7ca9fa733..825b0228cac0 100644 --- a/drivers/net/ethernet/intel/igb/e1000_nvm.h +++ b/drivers/net/ethernet/intel/igb/e1000_nvm.h | |||
@@ -1,7 +1,7 @@ | |||
1 | /******************************************************************************* | 1 | /******************************************************************************* |
2 | 2 | ||
3 | Intel(R) Gigabit Ethernet Linux driver | 3 | Intel(R) Gigabit Ethernet Linux driver |
4 | Copyright(c) 2011 Intel Corporation. | 4 | Copyright(c) 2012 Intel Corporation. |
5 | 5 | ||
6 | This program is free software; you can redistribute it and/or modify it | 6 | This program is free software; you can redistribute it and/or modify it |
7 | under the terms and conditions of the GNU General Public License, | 7 | under the terms and conditions of the GNU General Public License, |
diff --git a/drivers/net/ethernet/intel/igb/e1000_phy.c b/drivers/net/ethernet/intel/igb/e1000_phy.c index b17d7c20f817..789de5b83aad 100644 --- a/drivers/net/ethernet/intel/igb/e1000_phy.c +++ b/drivers/net/ethernet/intel/igb/e1000_phy.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /******************************************************************************* | 1 | /******************************************************************************* |
2 | 2 | ||
3 | Intel(R) Gigabit Ethernet Linux driver | 3 | Intel(R) Gigabit Ethernet Linux driver |
4 | Copyright(c) 2007-2011 Intel Corporation. | 4 | Copyright(c) 2007-2012 Intel Corporation. |
5 | 5 | ||
6 | This program is free software; you can redistribute it and/or modify it | 6 | This program is free software; you can redistribute it and/or modify it |
7 | under the terms and conditions of the GNU General Public License, | 7 | under the terms and conditions of the GNU General Public License, |
diff --git a/drivers/net/ethernet/intel/igb/e1000_phy.h b/drivers/net/ethernet/intel/igb/e1000_phy.h index 8510797b9d81..4c32ac66ff39 100644 --- a/drivers/net/ethernet/intel/igb/e1000_phy.h +++ b/drivers/net/ethernet/intel/igb/e1000_phy.h | |||
@@ -1,7 +1,7 @@ | |||
1 | /******************************************************************************* | 1 | /******************************************************************************* |
2 | 2 | ||
3 | Intel(R) Gigabit Ethernet Linux driver | 3 | Intel(R) Gigabit Ethernet Linux driver |
4 | Copyright(c) 2007-2011 Intel Corporation. | 4 | Copyright(c) 2007-2012 Intel Corporation. |
5 | 5 | ||
6 | This program is free software; you can redistribute it and/or modify it | 6 | This program is free software; you can redistribute it and/or modify it |
7 | under the terms and conditions of the GNU General Public License, | 7 | under the terms and conditions of the GNU General Public License, |
diff --git a/drivers/net/ethernet/intel/igb/e1000_regs.h b/drivers/net/ethernet/intel/igb/e1000_regs.h index 0a860bc1198e..ccdf36d503fd 100644 --- a/drivers/net/ethernet/intel/igb/e1000_regs.h +++ b/drivers/net/ethernet/intel/igb/e1000_regs.h | |||
@@ -1,7 +1,7 @@ | |||
1 | /******************************************************************************* | 1 | /******************************************************************************* |
2 | 2 | ||
3 | Intel(R) Gigabit Ethernet Linux driver | 3 | Intel(R) Gigabit Ethernet Linux driver |
4 | Copyright(c) 2007-2011 Intel Corporation. | 4 | Copyright(c) 2007-2012 Intel Corporation. |
5 | 5 | ||
6 | This program is free software; you can redistribute it and/or modify it | 6 | This program is free software; you can redistribute it and/or modify it |
7 | under the terms and conditions of the GNU General Public License, | 7 | under the terms and conditions of the GNU General Public License, |
diff --git a/drivers/net/ethernet/intel/igb/igb.h b/drivers/net/ethernet/intel/igb/igb.h index 3d12e67eebb4..8e33bdd33eea 100644 --- a/drivers/net/ethernet/intel/igb/igb.h +++ b/drivers/net/ethernet/intel/igb/igb.h | |||
@@ -1,7 +1,7 @@ | |||
1 | /******************************************************************************* | 1 | /******************************************************************************* |
2 | 2 | ||
3 | Intel(R) Gigabit Ethernet Linux driver | 3 | Intel(R) Gigabit Ethernet Linux driver |
4 | Copyright(c) 2007-2011 Intel Corporation. | 4 | Copyright(c) 2007-2012 Intel Corporation. |
5 | 5 | ||
6 | This program is free software; you can redistribute it and/or modify it | 6 | This program is free software; you can redistribute it and/or modify it |
7 | under the terms and conditions of the GNU General Public License, | 7 | under the terms and conditions of the GNU General Public License, |
diff --git a/drivers/net/ethernet/intel/igb/igb_ethtool.c b/drivers/net/ethernet/intel/igb/igb_ethtool.c index 7998bf4d5946..aa399a8a8f0d 100644 --- a/drivers/net/ethernet/intel/igb/igb_ethtool.c +++ b/drivers/net/ethernet/intel/igb/igb_ethtool.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /******************************************************************************* | 1 | /******************************************************************************* |
2 | 2 | ||
3 | Intel(R) Gigabit Ethernet Linux driver | 3 | Intel(R) Gigabit Ethernet Linux driver |
4 | Copyright(c) 2007-2011 Intel Corporation. | 4 | Copyright(c) 2007-2012 Intel Corporation. |
5 | 5 | ||
6 | This program is free software; you can redistribute it and/or modify it | 6 | This program is free software; you can redistribute it and/or modify it |
7 | under the terms and conditions of the GNU General Public License, | 7 | under the terms and conditions of the GNU General Public License, |
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c index 01e5e89ef959..e91d73c8aa4e 100644 --- a/drivers/net/ethernet/intel/igb/igb_main.c +++ b/drivers/net/ethernet/intel/igb/igb_main.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /******************************************************************************* | 1 | /******************************************************************************* |
2 | 2 | ||
3 | Intel(R) Gigabit Ethernet Linux driver | 3 | Intel(R) Gigabit Ethernet Linux driver |
4 | Copyright(c) 2007-2011 Intel Corporation. | 4 | Copyright(c) 2007-2012 Intel Corporation. |
5 | 5 | ||
6 | This program is free software; you can redistribute it and/or modify it | 6 | This program is free software; you can redistribute it and/or modify it |
7 | under the terms and conditions of the GNU General Public License, | 7 | under the terms and conditions of the GNU General Public License, |
@@ -68,7 +68,7 @@ char igb_driver_name[] = "igb"; | |||
68 | char igb_driver_version[] = DRV_VERSION; | 68 | char igb_driver_version[] = DRV_VERSION; |
69 | static const char igb_driver_string[] = | 69 | static const char igb_driver_string[] = |
70 | "Intel(R) Gigabit Ethernet Network Driver"; | 70 | "Intel(R) Gigabit Ethernet Network Driver"; |
71 | static const char igb_copyright[] = "Copyright (c) 2007-2011 Intel Corporation."; | 71 | static const char igb_copyright[] = "Copyright (c) 2007-2012 Intel Corporation."; |
72 | 72 | ||
73 | static const struct e1000_info *igb_info_tbl[] = { | 73 | static const struct e1000_info *igb_info_tbl[] = { |
74 | [board_82575] = &e1000_82575_info, | 74 | [board_82575] = &e1000_82575_info, |
@@ -4003,8 +4003,8 @@ set_itr_now: | |||
4003 | } | 4003 | } |
4004 | } | 4004 | } |
4005 | 4005 | ||
4006 | void igb_tx_ctxtdesc(struct igb_ring *tx_ring, u32 vlan_macip_lens, | 4006 | static void igb_tx_ctxtdesc(struct igb_ring *tx_ring, u32 vlan_macip_lens, |
4007 | u32 type_tucmd, u32 mss_l4len_idx) | 4007 | u32 type_tucmd, u32 mss_l4len_idx) |
4008 | { | 4008 | { |
4009 | struct e1000_adv_tx_context_desc *context_desc; | 4009 | struct e1000_adv_tx_context_desc *context_desc; |
4010 | u16 i = tx_ring->next_to_use; | 4010 | u16 i = tx_ring->next_to_use; |
@@ -5623,7 +5623,7 @@ static irqreturn_t igb_intr(int irq, void *data) | |||
5623 | return IRQ_HANDLED; | 5623 | return IRQ_HANDLED; |
5624 | } | 5624 | } |
5625 | 5625 | ||
5626 | void igb_ring_irq_enable(struct igb_q_vector *q_vector) | 5626 | static void igb_ring_irq_enable(struct igb_q_vector *q_vector) |
5627 | { | 5627 | { |
5628 | struct igb_adapter *adapter = q_vector->adapter; | 5628 | struct igb_adapter *adapter = q_vector->adapter; |
5629 | struct e1000_hw *hw = &adapter->hw; | 5629 | struct e1000_hw *hw = &adapter->hw; |
diff --git a/drivers/net/ethernet/intel/igbvf/ethtool.c b/drivers/net/ethernet/intel/igbvf/ethtool.c index 7b600a1f6366..2dba53446064 100644 --- a/drivers/net/ethernet/intel/igbvf/ethtool.c +++ b/drivers/net/ethernet/intel/igbvf/ethtool.c | |||
@@ -468,6 +468,5 @@ static const struct ethtool_ops igbvf_ethtool_ops = { | |||
468 | 468 | ||
469 | void igbvf_set_ethtool_ops(struct net_device *netdev) | 469 | void igbvf_set_ethtool_ops(struct net_device *netdev) |
470 | { | 470 | { |
471 | /* have to "undeclare" const on this struct to remove warnings */ | 471 | SET_ETHTOOL_OPS(netdev, &igbvf_ethtool_ops); |
472 | SET_ETHTOOL_OPS(netdev, (struct ethtool_ops *)&igbvf_ethtool_ops); | ||
473 | } | 472 | } |
diff --git a/drivers/net/ethernet/intel/igbvf/netdev.c b/drivers/net/ethernet/intel/igbvf/netdev.c index fd3da3076c2f..a4b20c865759 100644 --- a/drivers/net/ethernet/intel/igbvf/netdev.c +++ b/drivers/net/ethernet/intel/igbvf/netdev.c | |||
@@ -1194,11 +1194,6 @@ static int igbvf_vlan_rx_kill_vid(struct net_device *netdev, u16 vid) | |||
1194 | struct igbvf_adapter *adapter = netdev_priv(netdev); | 1194 | struct igbvf_adapter *adapter = netdev_priv(netdev); |
1195 | struct e1000_hw *hw = &adapter->hw; | 1195 | struct e1000_hw *hw = &adapter->hw; |
1196 | 1196 | ||
1197 | igbvf_irq_disable(adapter); | ||
1198 | |||
1199 | if (!test_bit(__IGBVF_DOWN, &adapter->state)) | ||
1200 | igbvf_irq_enable(adapter); | ||
1201 | |||
1202 | if (hw->mac.ops.set_vfta(hw, vid, false)) { | 1197 | if (hw->mac.ops.set_vfta(hw, vid, false)) { |
1203 | dev_err(&adapter->pdev->dev, | 1198 | dev_err(&adapter->pdev->dev, |
1204 | "Failed to remove vlan id %d\n", vid); | 1199 | "Failed to remove vlan id %d\n", vid); |
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h b/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h index 802bfa0f62cc..775602ef90e5 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h | |||
@@ -161,19 +161,19 @@ | |||
161 | 161 | ||
162 | /* Receive DMA Registers */ | 162 | /* Receive DMA Registers */ |
163 | #define IXGBE_RDBAL(_i) (((_i) < 64) ? (0x01000 + ((_i) * 0x40)) : \ | 163 | #define IXGBE_RDBAL(_i) (((_i) < 64) ? (0x01000 + ((_i) * 0x40)) : \ |
164 | (0x0D000 + ((_i - 64) * 0x40))) | 164 | (0x0D000 + (((_i) - 64) * 0x40))) |
165 | #define IXGBE_RDBAH(_i) (((_i) < 64) ? (0x01004 + ((_i) * 0x40)) : \ | 165 | #define IXGBE_RDBAH(_i) (((_i) < 64) ? (0x01004 + ((_i) * 0x40)) : \ |
166 | (0x0D004 + ((_i - 64) * 0x40))) | 166 | (0x0D004 + (((_i) - 64) * 0x40))) |
167 | #define IXGBE_RDLEN(_i) (((_i) < 64) ? (0x01008 + ((_i) * 0x40)) : \ | 167 | #define IXGBE_RDLEN(_i) (((_i) < 64) ? (0x01008 + ((_i) * 0x40)) : \ |
168 | (0x0D008 + ((_i - 64) * 0x40))) | 168 | (0x0D008 + (((_i) - 64) * 0x40))) |
169 | #define IXGBE_RDH(_i) (((_i) < 64) ? (0x01010 + ((_i) * 0x40)) : \ | 169 | #define IXGBE_RDH(_i) (((_i) < 64) ? (0x01010 + ((_i) * 0x40)) : \ |
170 | (0x0D010 + ((_i - 64) * 0x40))) | 170 | (0x0D010 + (((_i) - 64) * 0x40))) |
171 | #define IXGBE_RDT(_i) (((_i) < 64) ? (0x01018 + ((_i) * 0x40)) : \ | 171 | #define IXGBE_RDT(_i) (((_i) < 64) ? (0x01018 + ((_i) * 0x40)) : \ |
172 | (0x0D018 + ((_i - 64) * 0x40))) | 172 | (0x0D018 + (((_i) - 64) * 0x40))) |
173 | #define IXGBE_RXDCTL(_i) (((_i) < 64) ? (0x01028 + ((_i) * 0x40)) : \ | 173 | #define IXGBE_RXDCTL(_i) (((_i) < 64) ? (0x01028 + ((_i) * 0x40)) : \ |
174 | (0x0D028 + ((_i - 64) * 0x40))) | 174 | (0x0D028 + (((_i) - 64) * 0x40))) |
175 | #define IXGBE_RSCCTL(_i) (((_i) < 64) ? (0x0102C + ((_i) * 0x40)) : \ | 175 | #define IXGBE_RSCCTL(_i) (((_i) < 64) ? (0x0102C + ((_i) * 0x40)) : \ |
176 | (0x0D02C + ((_i - 64) * 0x40))) | 176 | (0x0D02C + (((_i) - 64) * 0x40))) |
177 | #define IXGBE_RSCDBU 0x03028 | 177 | #define IXGBE_RSCDBU 0x03028 |
178 | #define IXGBE_RDDCC 0x02F20 | 178 | #define IXGBE_RDDCC 0x02F20 |
179 | #define IXGBE_RXMEMWRAP 0x03190 | 179 | #define IXGBE_RXMEMWRAP 0x03190 |
@@ -186,7 +186,7 @@ | |||
186 | */ | 186 | */ |
187 | #define IXGBE_SRRCTL(_i) (((_i) <= 15) ? (0x02100 + ((_i) * 4)) : \ | 187 | #define IXGBE_SRRCTL(_i) (((_i) <= 15) ? (0x02100 + ((_i) * 4)) : \ |
188 | (((_i) < 64) ? (0x01014 + ((_i) * 0x40)) : \ | 188 | (((_i) < 64) ? (0x01014 + ((_i) * 0x40)) : \ |
189 | (0x0D014 + ((_i - 64) * 0x40)))) | 189 | (0x0D014 + (((_i) - 64) * 0x40)))) |
190 | /* | 190 | /* |
191 | * Rx DCA Control Register: | 191 | * Rx DCA Control Register: |
192 | * 00-15 : 0x02200 + n*4 | 192 | * 00-15 : 0x02200 + n*4 |
@@ -195,7 +195,7 @@ | |||
195 | */ | 195 | */ |
196 | #define IXGBE_DCA_RXCTRL(_i) (((_i) <= 15) ? (0x02200 + ((_i) * 4)) : \ | 196 | #define IXGBE_DCA_RXCTRL(_i) (((_i) <= 15) ? (0x02200 + ((_i) * 4)) : \ |
197 | (((_i) < 64) ? (0x0100C + ((_i) * 0x40)) : \ | 197 | (((_i) < 64) ? (0x0100C + ((_i) * 0x40)) : \ |
198 | (0x0D00C + ((_i - 64) * 0x40)))) | 198 | (0x0D00C + (((_i) - 64) * 0x40)))) |
199 | #define IXGBE_RDRXCTL 0x02F00 | 199 | #define IXGBE_RDRXCTL 0x02F00 |
200 | #define IXGBE_RXPBSIZE(_i) (0x03C00 + ((_i) * 4)) | 200 | #define IXGBE_RXPBSIZE(_i) (0x03C00 + ((_i) * 4)) |
201 | /* 8 of these 0x03C00 - 0x03C1C */ | 201 | /* 8 of these 0x03C00 - 0x03C1C */ |
@@ -344,9 +344,9 @@ | |||
344 | 344 | ||
345 | #define IXGBE_WUPL 0x05900 | 345 | #define IXGBE_WUPL 0x05900 |
346 | #define IXGBE_WUPM 0x05A00 /* wake up pkt memory 0x5A00-0x5A7C */ | 346 | #define IXGBE_WUPM 0x05A00 /* wake up pkt memory 0x5A00-0x5A7C */ |
347 | #define IXGBE_FHFT(_n) (0x09000 + (_n * 0x100)) /* Flex host filter table */ | 347 | #define IXGBE_FHFT(_n) (0x09000 + ((_n) * 0x100)) /* Flex host filter table */ |
348 | #define IXGBE_FHFT_EXT(_n) (0x09800 + (_n * 0x100)) /* Ext Flexible Host | 348 | #define IXGBE_FHFT_EXT(_n) (0x09800 + ((_n) * 0x100)) /* Ext Flexible Host |
349 | * Filter Table */ | 349 | * Filter Table */ |
350 | 350 | ||
351 | #define IXGBE_FLEXIBLE_FILTER_COUNT_MAX 4 | 351 | #define IXGBE_FLEXIBLE_FILTER_COUNT_MAX 4 |
352 | #define IXGBE_EXT_FLEXIBLE_FILTER_COUNT_MAX 2 | 352 | #define IXGBE_EXT_FLEXIBLE_FILTER_COUNT_MAX 2 |
@@ -1485,7 +1485,7 @@ enum { | |||
1485 | #define IXGBE_LED_BLINK_BASE 0x00000080 | 1485 | #define IXGBE_LED_BLINK_BASE 0x00000080 |
1486 | #define IXGBE_LED_MODE_MASK_BASE 0x0000000F | 1486 | #define IXGBE_LED_MODE_MASK_BASE 0x0000000F |
1487 | #define IXGBE_LED_OFFSET(_base, _i) (_base << (8 * (_i))) | 1487 | #define IXGBE_LED_OFFSET(_base, _i) (_base << (8 * (_i))) |
1488 | #define IXGBE_LED_MODE_SHIFT(_i) (8*(_i)) | 1488 | #define IXGBE_LED_MODE_SHIFT(_i) (8 * (_i)) |
1489 | #define IXGBE_LED_IVRT(_i) IXGBE_LED_OFFSET(IXGBE_LED_IVRT_BASE, _i) | 1489 | #define IXGBE_LED_IVRT(_i) IXGBE_LED_OFFSET(IXGBE_LED_IVRT_BASE, _i) |
1490 | #define IXGBE_LED_BLINK(_i) IXGBE_LED_OFFSET(IXGBE_LED_BLINK_BASE, _i) | 1490 | #define IXGBE_LED_BLINK(_i) IXGBE_LED_OFFSET(IXGBE_LED_BLINK_BASE, _i) |
1491 | #define IXGBE_LED_MODE_MASK(_i) IXGBE_LED_OFFSET(IXGBE_LED_MODE_MASK_BASE, _i) | 1491 | #define IXGBE_LED_MODE_MASK(_i) IXGBE_LED_OFFSET(IXGBE_LED_MODE_MASK_BASE, _i) |
@@ -2068,9 +2068,9 @@ enum { | |||
2068 | 2068 | ||
2069 | /* SR-IOV specific macros */ | 2069 | /* SR-IOV specific macros */ |
2070 | #define IXGBE_MBVFICR_INDEX(vf_number) (vf_number >> 4) | 2070 | #define IXGBE_MBVFICR_INDEX(vf_number) (vf_number >> 4) |
2071 | #define IXGBE_MBVFICR(_i) (0x00710 + (_i * 4)) | 2071 | #define IXGBE_MBVFICR(_i) (0x00710 + ((_i) * 4)) |
2072 | #define IXGBE_VFLRE(_i) (((_i & 1) ? 0x001C0 : 0x00600)) | 2072 | #define IXGBE_VFLRE(_i) ((((_i) & 1) ? 0x001C0 : 0x00600)) |
2073 | #define IXGBE_VFLREC(_i) (0x00700 + (_i * 4)) | 2073 | #define IXGBE_VFLREC(_i) (0x00700 + ((_i) * 4)) |
2074 | 2074 | ||
2075 | enum ixgbe_fdir_pballoc_type { | 2075 | enum ixgbe_fdir_pballoc_type { |
2076 | IXGBE_FDIR_PBALLOC_NONE = 0, | 2076 | IXGBE_FDIR_PBALLOC_NONE = 0, |
diff --git a/drivers/net/ethernet/intel/ixgbevf/ethtool.c b/drivers/net/ethernet/intel/ixgbevf/ethtool.c index dc8e6511c640..c85700318147 100644 --- a/drivers/net/ethernet/intel/ixgbevf/ethtool.c +++ b/drivers/net/ethernet/intel/ixgbevf/ethtool.c | |||
@@ -56,7 +56,8 @@ struct ixgbe_stats { | |||
56 | offsetof(struct ixgbevf_adapter, m), \ | 56 | offsetof(struct ixgbevf_adapter, m), \ |
57 | offsetof(struct ixgbevf_adapter, b), \ | 57 | offsetof(struct ixgbevf_adapter, b), \ |
58 | offsetof(struct ixgbevf_adapter, r) | 58 | offsetof(struct ixgbevf_adapter, r) |
59 | static struct ixgbe_stats ixgbe_gstrings_stats[] = { | 59 | |
60 | static const struct ixgbe_stats ixgbe_gstrings_stats[] = { | ||
60 | {"rx_packets", IXGBEVF_STAT(stats.vfgprc, stats.base_vfgprc, | 61 | {"rx_packets", IXGBEVF_STAT(stats.vfgprc, stats.base_vfgprc, |
61 | stats.saved_reset_vfgprc)}, | 62 | stats.saved_reset_vfgprc)}, |
62 | {"tx_packets", IXGBEVF_STAT(stats.vfgptc, stats.base_vfgptc, | 63 | {"tx_packets", IXGBEVF_STAT(stats.vfgptc, stats.base_vfgptc, |
@@ -671,7 +672,7 @@ static int ixgbevf_nway_reset(struct net_device *netdev) | |||
671 | return 0; | 672 | return 0; |
672 | } | 673 | } |
673 | 674 | ||
674 | static struct ethtool_ops ixgbevf_ethtool_ops = { | 675 | static const struct ethtool_ops ixgbevf_ethtool_ops = { |
675 | .get_settings = ixgbevf_get_settings, | 676 | .get_settings = ixgbevf_get_settings, |
676 | .get_drvinfo = ixgbevf_get_drvinfo, | 677 | .get_drvinfo = ixgbevf_get_drvinfo, |
677 | .get_regs_len = ixgbevf_get_regs_len, | 678 | .get_regs_len = ixgbevf_get_regs_len, |
diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h b/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h index e6c9d1a927a9..9075c1d61039 100644 --- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h +++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h | |||
@@ -279,12 +279,12 @@ enum ixgbevf_boards { | |||
279 | board_X540_vf, | 279 | board_X540_vf, |
280 | }; | 280 | }; |
281 | 281 | ||
282 | extern struct ixgbevf_info ixgbevf_82599_vf_info; | 282 | extern const struct ixgbevf_info ixgbevf_82599_vf_info; |
283 | extern struct ixgbevf_info ixgbevf_X540_vf_info; | 283 | extern const struct ixgbevf_info ixgbevf_X540_vf_info; |
284 | extern struct ixgbe_mbx_operations ixgbevf_mbx_ops; | 284 | extern const struct ixgbe_mbx_operations ixgbevf_mbx_ops; |
285 | 285 | ||
286 | /* needed by ethtool.c */ | 286 | /* needed by ethtool.c */ |
287 | extern char ixgbevf_driver_name[]; | 287 | extern const char ixgbevf_driver_name[]; |
288 | extern const char ixgbevf_driver_version[]; | 288 | extern const char ixgbevf_driver_version[]; |
289 | 289 | ||
290 | extern int ixgbevf_up(struct ixgbevf_adapter *adapter); | 290 | extern int ixgbevf_up(struct ixgbevf_adapter *adapter); |
diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c index 891162d1610c..bed411bada21 100644 --- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c +++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | |||
@@ -53,7 +53,7 @@ | |||
53 | 53 | ||
54 | #include "ixgbevf.h" | 54 | #include "ixgbevf.h" |
55 | 55 | ||
56 | char ixgbevf_driver_name[] = "ixgbevf"; | 56 | const char ixgbevf_driver_name[] = "ixgbevf"; |
57 | static const char ixgbevf_driver_string[] = | 57 | static const char ixgbevf_driver_string[] = |
58 | "Intel(R) 10 Gigabit PCI Express Virtual Function Network Driver"; | 58 | "Intel(R) 10 Gigabit PCI Express Virtual Function Network Driver"; |
59 | 59 | ||
@@ -917,31 +917,34 @@ static irqreturn_t ixgbevf_msix_mbx(int irq, void *data) | |||
917 | struct ixgbe_hw *hw = &adapter->hw; | 917 | struct ixgbe_hw *hw = &adapter->hw; |
918 | u32 eicr; | 918 | u32 eicr; |
919 | u32 msg; | 919 | u32 msg; |
920 | bool got_ack = false; | ||
920 | 921 | ||
921 | eicr = IXGBE_READ_REG(hw, IXGBE_VTEICS); | 922 | eicr = IXGBE_READ_REG(hw, IXGBE_VTEICS); |
922 | IXGBE_WRITE_REG(hw, IXGBE_VTEICR, eicr); | 923 | IXGBE_WRITE_REG(hw, IXGBE_VTEICR, eicr); |
923 | 924 | ||
924 | if (!hw->mbx.ops.check_for_ack(hw)) { | 925 | if (!hw->mbx.ops.check_for_ack(hw)) |
925 | /* | 926 | got_ack = true; |
926 | * checking for the ack clears the PFACK bit. Place | ||
927 | * it back in the v2p_mailbox cache so that anyone | ||
928 | * polling for an ack will not miss it. Also | ||
929 | * avoid the read below because the code to read | ||
930 | * the mailbox will also clear the ack bit. This was | ||
931 | * causing lost acks. Just cache the bit and exit | ||
932 | * the IRQ handler. | ||
933 | */ | ||
934 | hw->mbx.v2p_mailbox |= IXGBE_VFMAILBOX_PFACK; | ||
935 | goto out; | ||
936 | } | ||
937 | 927 | ||
938 | /* Not an ack interrupt, go ahead and read the message */ | 928 | if (!hw->mbx.ops.check_for_msg(hw)) { |
939 | hw->mbx.ops.read(hw, &msg, 1); | 929 | hw->mbx.ops.read(hw, &msg, 1); |
940 | 930 | ||
941 | if ((msg & IXGBE_MBVFICR_VFREQ_MASK) == IXGBE_PF_CONTROL_MSG) | 931 | if ((msg & IXGBE_MBVFICR_VFREQ_MASK) == IXGBE_PF_CONTROL_MSG) |
942 | mod_timer(&adapter->watchdog_timer, | 932 | mod_timer(&adapter->watchdog_timer, |
943 | round_jiffies(jiffies + 1)); | 933 | round_jiffies(jiffies + 1)); |
944 | 934 | ||
935 | if (msg & IXGBE_VT_MSGTYPE_NACK) | ||
936 | pr_warn("Last Request of type %2.2x to PF Nacked\n", | ||
937 | msg & 0xFF); | ||
938 | goto out; | ||
939 | } | ||
940 | |||
941 | /* | ||
942 | * checking for the ack clears the PFACK bit. Place | ||
943 | * it back in the v2p_mailbox cache so that anyone | ||
944 | * polling for an ack will not miss it | ||
945 | */ | ||
946 | if (got_ack) | ||
947 | hw->mbx.v2p_mailbox |= IXGBE_VFMAILBOX_PFACK; | ||
945 | out: | 948 | out: |
946 | return IRQ_HANDLED; | 949 | return IRQ_HANDLED; |
947 | } | 950 | } |
diff --git a/drivers/net/ethernet/intel/ixgbevf/mbx.c b/drivers/net/ethernet/intel/ixgbevf/mbx.c index 930fa83f2568..13532d9ba72d 100644 --- a/drivers/net/ethernet/intel/ixgbevf/mbx.c +++ b/drivers/net/ethernet/intel/ixgbevf/mbx.c | |||
@@ -26,6 +26,7 @@ | |||
26 | *******************************************************************************/ | 26 | *******************************************************************************/ |
27 | 27 | ||
28 | #include "mbx.h" | 28 | #include "mbx.h" |
29 | #include "ixgbevf.h" | ||
29 | 30 | ||
30 | /** | 31 | /** |
31 | * ixgbevf_poll_for_msg - Wait for message notification | 32 | * ixgbevf_poll_for_msg - Wait for message notification |
@@ -328,7 +329,7 @@ static s32 ixgbevf_init_mbx_params_vf(struct ixgbe_hw *hw) | |||
328 | return 0; | 329 | return 0; |
329 | } | 330 | } |
330 | 331 | ||
331 | struct ixgbe_mbx_operations ixgbevf_mbx_ops = { | 332 | const struct ixgbe_mbx_operations ixgbevf_mbx_ops = { |
332 | .init_params = ixgbevf_init_mbx_params_vf, | 333 | .init_params = ixgbevf_init_mbx_params_vf, |
333 | .read = ixgbevf_read_mbx_vf, | 334 | .read = ixgbevf_read_mbx_vf, |
334 | .write = ixgbevf_write_mbx_vf, | 335 | .write = ixgbevf_write_mbx_vf, |
diff --git a/drivers/net/ethernet/intel/ixgbevf/vf.c b/drivers/net/ethernet/intel/ixgbevf/vf.c index 21533e300367..d0138d7a31a1 100644 --- a/drivers/net/ethernet/intel/ixgbevf/vf.c +++ b/drivers/net/ethernet/intel/ixgbevf/vf.c | |||
@@ -26,6 +26,7 @@ | |||
26 | *******************************************************************************/ | 26 | *******************************************************************************/ |
27 | 27 | ||
28 | #include "vf.h" | 28 | #include "vf.h" |
29 | #include "ixgbevf.h" | ||
29 | 30 | ||
30 | /** | 31 | /** |
31 | * ixgbevf_start_hw_vf - Prepare hardware for Tx/Rx | 32 | * ixgbevf_start_hw_vf - Prepare hardware for Tx/Rx |
@@ -401,7 +402,7 @@ static s32 ixgbevf_check_mac_link_vf(struct ixgbe_hw *hw, | |||
401 | return 0; | 402 | return 0; |
402 | } | 403 | } |
403 | 404 | ||
404 | static struct ixgbe_mac_operations ixgbevf_mac_ops = { | 405 | static const struct ixgbe_mac_operations ixgbevf_mac_ops = { |
405 | .init_hw = ixgbevf_init_hw_vf, | 406 | .init_hw = ixgbevf_init_hw_vf, |
406 | .reset_hw = ixgbevf_reset_hw_vf, | 407 | .reset_hw = ixgbevf_reset_hw_vf, |
407 | .start_hw = ixgbevf_start_hw_vf, | 408 | .start_hw = ixgbevf_start_hw_vf, |
@@ -415,12 +416,12 @@ static struct ixgbe_mac_operations ixgbevf_mac_ops = { | |||
415 | .set_vfta = ixgbevf_set_vfta_vf, | 416 | .set_vfta = ixgbevf_set_vfta_vf, |
416 | }; | 417 | }; |
417 | 418 | ||
418 | struct ixgbevf_info ixgbevf_82599_vf_info = { | 419 | const struct ixgbevf_info ixgbevf_82599_vf_info = { |
419 | .mac = ixgbe_mac_82599_vf, | 420 | .mac = ixgbe_mac_82599_vf, |
420 | .mac_ops = &ixgbevf_mac_ops, | 421 | .mac_ops = &ixgbevf_mac_ops, |
421 | }; | 422 | }; |
422 | 423 | ||
423 | struct ixgbevf_info ixgbevf_X540_vf_info = { | 424 | const struct ixgbevf_info ixgbevf_X540_vf_info = { |
424 | .mac = ixgbe_mac_X540_vf, | 425 | .mac = ixgbe_mac_X540_vf, |
425 | .mac_ops = &ixgbevf_mac_ops, | 426 | .mac_ops = &ixgbevf_mac_ops, |
426 | }; | 427 | }; |
diff --git a/drivers/net/ethernet/intel/ixgbevf/vf.h b/drivers/net/ethernet/intel/ixgbevf/vf.h index 10306b492ee6..d556619a9212 100644 --- a/drivers/net/ethernet/intel/ixgbevf/vf.h +++ b/drivers/net/ethernet/intel/ixgbevf/vf.h | |||
@@ -167,7 +167,7 @@ struct ixgbevf_hw_stats { | |||
167 | 167 | ||
168 | struct ixgbevf_info { | 168 | struct ixgbevf_info { |
169 | enum ixgbe_mac_type mac; | 169 | enum ixgbe_mac_type mac; |
170 | struct ixgbe_mac_operations *mac_ops; | 170 | const struct ixgbe_mac_operations *mac_ops; |
171 | }; | 171 | }; |
172 | 172 | ||
173 | #endif /* __IXGBE_VF_H__ */ | 173 | #endif /* __IXGBE_VF_H__ */ |
diff --git a/drivers/net/ethernet/marvell/mv643xx_eth.c b/drivers/net/ethernet/marvell/mv643xx_eth.c index 9c049d2cb97d..9edecfa1f0f4 100644 --- a/drivers/net/ethernet/marvell/mv643xx_eth.c +++ b/drivers/net/ethernet/marvell/mv643xx_eth.c | |||
@@ -136,6 +136,8 @@ static char mv643xx_eth_driver_version[] = "1.4"; | |||
136 | #define INT_MASK 0x0068 | 136 | #define INT_MASK 0x0068 |
137 | #define INT_MASK_EXT 0x006c | 137 | #define INT_MASK_EXT 0x006c |
138 | #define TX_FIFO_URGENT_THRESHOLD 0x0074 | 138 | #define TX_FIFO_URGENT_THRESHOLD 0x0074 |
139 | #define RX_DISCARD_FRAME_CNT 0x0084 | ||
140 | #define RX_OVERRUN_FRAME_CNT 0x0088 | ||
139 | #define TXQ_FIX_PRIO_CONF_MOVED 0x00dc | 141 | #define TXQ_FIX_PRIO_CONF_MOVED 0x00dc |
140 | #define TX_BW_RATE_MOVED 0x00e0 | 142 | #define TX_BW_RATE_MOVED 0x00e0 |
141 | #define TX_BW_MTU_MOVED 0x00e8 | 143 | #define TX_BW_MTU_MOVED 0x00e8 |
@@ -334,6 +336,9 @@ struct mib_counters { | |||
334 | u32 bad_crc_event; | 336 | u32 bad_crc_event; |
335 | u32 collision; | 337 | u32 collision; |
336 | u32 late_collision; | 338 | u32 late_collision; |
339 | /* Non MIB hardware counters */ | ||
340 | u32 rx_discard; | ||
341 | u32 rx_overrun; | ||
337 | }; | 342 | }; |
338 | 343 | ||
339 | struct lro_counters { | 344 | struct lro_counters { |
@@ -1225,6 +1230,10 @@ static void mib_counters_clear(struct mv643xx_eth_private *mp) | |||
1225 | 1230 | ||
1226 | for (i = 0; i < 0x80; i += 4) | 1231 | for (i = 0; i < 0x80; i += 4) |
1227 | mib_read(mp, i); | 1232 | mib_read(mp, i); |
1233 | |||
1234 | /* Clear non MIB hw counters also */ | ||
1235 | rdlp(mp, RX_DISCARD_FRAME_CNT); | ||
1236 | rdlp(mp, RX_OVERRUN_FRAME_CNT); | ||
1228 | } | 1237 | } |
1229 | 1238 | ||
1230 | static void mib_counters_update(struct mv643xx_eth_private *mp) | 1239 | static void mib_counters_update(struct mv643xx_eth_private *mp) |
@@ -1262,6 +1271,9 @@ static void mib_counters_update(struct mv643xx_eth_private *mp) | |||
1262 | p->bad_crc_event += mib_read(mp, 0x74); | 1271 | p->bad_crc_event += mib_read(mp, 0x74); |
1263 | p->collision += mib_read(mp, 0x78); | 1272 | p->collision += mib_read(mp, 0x78); |
1264 | p->late_collision += mib_read(mp, 0x7c); | 1273 | p->late_collision += mib_read(mp, 0x7c); |
1274 | /* Non MIB hardware counters */ | ||
1275 | p->rx_discard += rdlp(mp, RX_DISCARD_FRAME_CNT); | ||
1276 | p->rx_overrun += rdlp(mp, RX_OVERRUN_FRAME_CNT); | ||
1265 | spin_unlock_bh(&mp->mib_counters_lock); | 1277 | spin_unlock_bh(&mp->mib_counters_lock); |
1266 | 1278 | ||
1267 | mod_timer(&mp->mib_counters_timer, jiffies + 30 * HZ); | 1279 | mod_timer(&mp->mib_counters_timer, jiffies + 30 * HZ); |
@@ -1413,6 +1425,8 @@ static const struct mv643xx_eth_stats mv643xx_eth_stats[] = { | |||
1413 | MIBSTAT(bad_crc_event), | 1425 | MIBSTAT(bad_crc_event), |
1414 | MIBSTAT(collision), | 1426 | MIBSTAT(collision), |
1415 | MIBSTAT(late_collision), | 1427 | MIBSTAT(late_collision), |
1428 | MIBSTAT(rx_discard), | ||
1429 | MIBSTAT(rx_overrun), | ||
1416 | LROSTAT(lro_aggregated), | 1430 | LROSTAT(lro_aggregated), |
1417 | LROSTAT(lro_flushed), | 1431 | LROSTAT(lro_flushed), |
1418 | LROSTAT(lro_no_desc), | 1432 | LROSTAT(lro_no_desc), |
diff --git a/drivers/net/ethernet/marvell/skge.c b/drivers/net/ethernet/marvell/skge.c index 18a87a57fc0a..edb9bda55d55 100644 --- a/drivers/net/ethernet/marvell/skge.c +++ b/drivers/net/ethernet/marvell/skge.c | |||
@@ -931,17 +931,20 @@ static int skge_ring_alloc(struct skge_ring *ring, void *vaddr, u32 base) | |||
931 | } | 931 | } |
932 | 932 | ||
933 | /* Allocate and setup a new buffer for receiving */ | 933 | /* Allocate and setup a new buffer for receiving */ |
934 | static void skge_rx_setup(struct skge_port *skge, struct skge_element *e, | 934 | static int skge_rx_setup(struct pci_dev *pdev, |
935 | struct sk_buff *skb, unsigned int bufsize) | 935 | struct skge_element *e, |
936 | struct sk_buff *skb, unsigned int bufsize) | ||
936 | { | 937 | { |
937 | struct skge_rx_desc *rd = e->desc; | 938 | struct skge_rx_desc *rd = e->desc; |
938 | u64 map; | 939 | dma_addr_t map; |
939 | 940 | ||
940 | map = pci_map_single(skge->hw->pdev, skb->data, bufsize, | 941 | map = pci_map_single(pdev, skb->data, bufsize, |
941 | PCI_DMA_FROMDEVICE); | 942 | PCI_DMA_FROMDEVICE); |
943 | if (pci_dma_mapping_error(pdev, map)) | ||
944 | goto mapping_error; | ||
942 | 945 | ||
943 | rd->dma_lo = map; | 946 | rd->dma_lo = lower_32_bits(map); |
944 | rd->dma_hi = map >> 32; | 947 | rd->dma_hi = upper_32_bits(map); |
945 | e->skb = skb; | 948 | e->skb = skb; |
946 | rd->csum1_start = ETH_HLEN; | 949 | rd->csum1_start = ETH_HLEN; |
947 | rd->csum2_start = ETH_HLEN; | 950 | rd->csum2_start = ETH_HLEN; |
@@ -953,6 +956,13 @@ static void skge_rx_setup(struct skge_port *skge, struct skge_element *e, | |||
953 | rd->control = BMU_OWN | BMU_STF | BMU_IRQ_EOF | BMU_TCP_CHECK | bufsize; | 956 | rd->control = BMU_OWN | BMU_STF | BMU_IRQ_EOF | BMU_TCP_CHECK | bufsize; |
954 | dma_unmap_addr_set(e, mapaddr, map); | 957 | dma_unmap_addr_set(e, mapaddr, map); |
955 | dma_unmap_len_set(e, maplen, bufsize); | 958 | dma_unmap_len_set(e, maplen, bufsize); |
959 | return 0; | ||
960 | |||
961 | mapping_error: | ||
962 | if (net_ratelimit()) | ||
963 | dev_warn(&pdev->dev, "%s: rx mapping error\n", | ||
964 | skb->dev->name); | ||
965 | return -EIO; | ||
956 | } | 966 | } |
957 | 967 | ||
958 | /* Resume receiving using existing skb, | 968 | /* Resume receiving using existing skb, |
@@ -1014,7 +1024,11 @@ static int skge_rx_fill(struct net_device *dev) | |||
1014 | return -ENOMEM; | 1024 | return -ENOMEM; |
1015 | 1025 | ||
1016 | skb_reserve(skb, NET_IP_ALIGN); | 1026 | skb_reserve(skb, NET_IP_ALIGN); |
1017 | skge_rx_setup(skge, e, skb, skge->rx_buf_size); | 1027 | if (skge_rx_setup(skge->hw->pdev, e, skb, skge->rx_buf_size)) { |
1028 | kfree_skb(skb); | ||
1029 | return -ENOMEM; | ||
1030 | } | ||
1031 | |||
1018 | } while ((e = e->next) != ring->start); | 1032 | } while ((e = e->next) != ring->start); |
1019 | 1033 | ||
1020 | ring->to_clean = ring->start; | 1034 | ring->to_clean = ring->start; |
@@ -2576,6 +2590,7 @@ static int skge_up(struct net_device *dev) | |||
2576 | } | 2590 | } |
2577 | 2591 | ||
2578 | /* Initialize MAC */ | 2592 | /* Initialize MAC */ |
2593 | netif_carrier_off(dev); | ||
2579 | spin_lock_bh(&hw->phy_lock); | 2594 | spin_lock_bh(&hw->phy_lock); |
2580 | if (is_genesis(hw)) | 2595 | if (is_genesis(hw)) |
2581 | genesis_mac_init(hw, port); | 2596 | genesis_mac_init(hw, port); |
@@ -2728,7 +2743,7 @@ static netdev_tx_t skge_xmit_frame(struct sk_buff *skb, | |||
2728 | struct skge_tx_desc *td; | 2743 | struct skge_tx_desc *td; |
2729 | int i; | 2744 | int i; |
2730 | u32 control, len; | 2745 | u32 control, len; |
2731 | u64 map; | 2746 | dma_addr_t map; |
2732 | 2747 | ||
2733 | if (skb_padto(skb, ETH_ZLEN)) | 2748 | if (skb_padto(skb, ETH_ZLEN)) |
2734 | return NETDEV_TX_OK; | 2749 | return NETDEV_TX_OK; |
@@ -2742,11 +2757,14 @@ static netdev_tx_t skge_xmit_frame(struct sk_buff *skb, | |||
2742 | e->skb = skb; | 2757 | e->skb = skb; |
2743 | len = skb_headlen(skb); | 2758 | len = skb_headlen(skb); |
2744 | map = pci_map_single(hw->pdev, skb->data, len, PCI_DMA_TODEVICE); | 2759 | map = pci_map_single(hw->pdev, skb->data, len, PCI_DMA_TODEVICE); |
2760 | if (pci_dma_mapping_error(hw->pdev, map)) | ||
2761 | goto mapping_error; | ||
2762 | |||
2745 | dma_unmap_addr_set(e, mapaddr, map); | 2763 | dma_unmap_addr_set(e, mapaddr, map); |
2746 | dma_unmap_len_set(e, maplen, len); | 2764 | dma_unmap_len_set(e, maplen, len); |
2747 | 2765 | ||
2748 | td->dma_lo = map; | 2766 | td->dma_lo = lower_32_bits(map); |
2749 | td->dma_hi = map >> 32; | 2767 | td->dma_hi = upper_32_bits(map); |
2750 | 2768 | ||
2751 | if (skb->ip_summed == CHECKSUM_PARTIAL) { | 2769 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
2752 | const int offset = skb_checksum_start_offset(skb); | 2770 | const int offset = skb_checksum_start_offset(skb); |
@@ -2777,14 +2795,16 @@ static netdev_tx_t skge_xmit_frame(struct sk_buff *skb, | |||
2777 | 2795 | ||
2778 | map = skb_frag_dma_map(&hw->pdev->dev, frag, 0, | 2796 | map = skb_frag_dma_map(&hw->pdev->dev, frag, 0, |
2779 | skb_frag_size(frag), DMA_TO_DEVICE); | 2797 | skb_frag_size(frag), DMA_TO_DEVICE); |
2798 | if (dma_mapping_error(&hw->pdev->dev, map)) | ||
2799 | goto mapping_unwind; | ||
2780 | 2800 | ||
2781 | e = e->next; | 2801 | e = e->next; |
2782 | e->skb = skb; | 2802 | e->skb = skb; |
2783 | tf = e->desc; | 2803 | tf = e->desc; |
2784 | BUG_ON(tf->control & BMU_OWN); | 2804 | BUG_ON(tf->control & BMU_OWN); |
2785 | 2805 | ||
2786 | tf->dma_lo = map; | 2806 | tf->dma_lo = lower_32_bits(map); |
2787 | tf->dma_hi = (u64) map >> 32; | 2807 | tf->dma_hi = upper_32_bits(map); |
2788 | dma_unmap_addr_set(e, mapaddr, map); | 2808 | dma_unmap_addr_set(e, mapaddr, map); |
2789 | dma_unmap_len_set(e, maplen, skb_frag_size(frag)); | 2809 | dma_unmap_len_set(e, maplen, skb_frag_size(frag)); |
2790 | 2810 | ||
@@ -2797,6 +2817,8 @@ static netdev_tx_t skge_xmit_frame(struct sk_buff *skb, | |||
2797 | td->control = BMU_OWN | BMU_SW | BMU_STF | control | len; | 2817 | td->control = BMU_OWN | BMU_SW | BMU_STF | control | len; |
2798 | wmb(); | 2818 | wmb(); |
2799 | 2819 | ||
2820 | netdev_sent_queue(dev, skb->len); | ||
2821 | |||
2800 | skge_write8(hw, Q_ADDR(txqaddr[skge->port], Q_CSR), CSR_START); | 2822 | skge_write8(hw, Q_ADDR(txqaddr[skge->port], Q_CSR), CSR_START); |
2801 | 2823 | ||
2802 | netif_printk(skge, tx_queued, KERN_DEBUG, skge->netdev, | 2824 | netif_printk(skge, tx_queued, KERN_DEBUG, skge->netdev, |
@@ -2812,15 +2834,35 @@ static netdev_tx_t skge_xmit_frame(struct sk_buff *skb, | |||
2812 | } | 2834 | } |
2813 | 2835 | ||
2814 | return NETDEV_TX_OK; | 2836 | return NETDEV_TX_OK; |
2837 | |||
2838 | mapping_unwind: | ||
2839 | /* unroll any pages that were already mapped. */ | ||
2840 | if (e != skge->tx_ring.to_use) { | ||
2841 | struct skge_element *u; | ||
2842 | |||
2843 | for (u = skge->tx_ring.to_use->next; u != e; u = u->next) | ||
2844 | pci_unmap_page(hw->pdev, dma_unmap_addr(u, mapaddr), | ||
2845 | dma_unmap_len(u, maplen), | ||
2846 | PCI_DMA_TODEVICE); | ||
2847 | e = skge->tx_ring.to_use; | ||
2848 | } | ||
2849 | /* undo the mapping for the skb header */ | ||
2850 | pci_unmap_single(hw->pdev, dma_unmap_addr(e, mapaddr), | ||
2851 | dma_unmap_len(e, maplen), | ||
2852 | PCI_DMA_TODEVICE); | ||
2853 | mapping_error: | ||
2854 | /* mapping error causes error message and packet to be discarded. */ | ||
2855 | if (net_ratelimit()) | ||
2856 | dev_warn(&hw->pdev->dev, "%s: tx mapping error\n", dev->name); | ||
2857 | dev_kfree_skb(skb); | ||
2858 | return NETDEV_TX_OK; | ||
2815 | } | 2859 | } |
2816 | 2860 | ||
2817 | 2861 | ||
2818 | /* Free resources associated with this reing element */ | 2862 | /* Free resources associated with this reing element */ |
2819 | static void skge_tx_free(struct skge_port *skge, struct skge_element *e, | 2863 | static inline void skge_tx_unmap(struct pci_dev *pdev, struct skge_element *e, |
2820 | u32 control) | 2864 | u32 control) |
2821 | { | 2865 | { |
2822 | struct pci_dev *pdev = skge->hw->pdev; | ||
2823 | |||
2824 | /* skb header vs. fragment */ | 2866 | /* skb header vs. fragment */ |
2825 | if (control & BMU_STF) | 2867 | if (control & BMU_STF) |
2826 | pci_unmap_single(pdev, dma_unmap_addr(e, mapaddr), | 2868 | pci_unmap_single(pdev, dma_unmap_addr(e, mapaddr), |
@@ -2830,13 +2872,6 @@ static void skge_tx_free(struct skge_port *skge, struct skge_element *e, | |||
2830 | pci_unmap_page(pdev, dma_unmap_addr(e, mapaddr), | 2872 | pci_unmap_page(pdev, dma_unmap_addr(e, mapaddr), |
2831 | dma_unmap_len(e, maplen), | 2873 | dma_unmap_len(e, maplen), |
2832 | PCI_DMA_TODEVICE); | 2874 | PCI_DMA_TODEVICE); |
2833 | |||
2834 | if (control & BMU_EOF) { | ||
2835 | netif_printk(skge, tx_done, KERN_DEBUG, skge->netdev, | ||
2836 | "tx done slot %td\n", e - skge->tx_ring.start); | ||
2837 | |||
2838 | dev_kfree_skb(e->skb); | ||
2839 | } | ||
2840 | } | 2875 | } |
2841 | 2876 | ||
2842 | /* Free all buffers in transmit ring */ | 2877 | /* Free all buffers in transmit ring */ |
@@ -2847,10 +2882,15 @@ static void skge_tx_clean(struct net_device *dev) | |||
2847 | 2882 | ||
2848 | for (e = skge->tx_ring.to_clean; e != skge->tx_ring.to_use; e = e->next) { | 2883 | for (e = skge->tx_ring.to_clean; e != skge->tx_ring.to_use; e = e->next) { |
2849 | struct skge_tx_desc *td = e->desc; | 2884 | struct skge_tx_desc *td = e->desc; |
2850 | skge_tx_free(skge, e, td->control); | 2885 | |
2886 | skge_tx_unmap(skge->hw->pdev, e, td->control); | ||
2887 | |||
2888 | if (td->control & BMU_EOF) | ||
2889 | dev_kfree_skb(e->skb); | ||
2851 | td->control = 0; | 2890 | td->control = 0; |
2852 | } | 2891 | } |
2853 | 2892 | ||
2893 | netdev_reset_queue(dev); | ||
2854 | skge->tx_ring.to_clean = e; | 2894 | skge->tx_ring.to_clean = e; |
2855 | } | 2895 | } |
2856 | 2896 | ||
@@ -3059,13 +3099,17 @@ static struct sk_buff *skge_rx_get(struct net_device *dev, | |||
3059 | if (!nskb) | 3099 | if (!nskb) |
3060 | goto resubmit; | 3100 | goto resubmit; |
3061 | 3101 | ||
3102 | if (unlikely(skge_rx_setup(skge->hw->pdev, e, nskb, skge->rx_buf_size))) { | ||
3103 | dev_kfree_skb(nskb); | ||
3104 | goto resubmit; | ||
3105 | } | ||
3106 | |||
3062 | pci_unmap_single(skge->hw->pdev, | 3107 | pci_unmap_single(skge->hw->pdev, |
3063 | dma_unmap_addr(e, mapaddr), | 3108 | dma_unmap_addr(e, mapaddr), |
3064 | dma_unmap_len(e, maplen), | 3109 | dma_unmap_len(e, maplen), |
3065 | PCI_DMA_FROMDEVICE); | 3110 | PCI_DMA_FROMDEVICE); |
3066 | skb = e->skb; | 3111 | skb = e->skb; |
3067 | prefetch(skb->data); | 3112 | prefetch(skb->data); |
3068 | skge_rx_setup(skge, e, nskb, skge->rx_buf_size); | ||
3069 | } | 3113 | } |
3070 | 3114 | ||
3071 | skb_put(skb, len); | 3115 | skb_put(skb, len); |
@@ -3111,6 +3155,7 @@ static void skge_tx_done(struct net_device *dev) | |||
3111 | struct skge_port *skge = netdev_priv(dev); | 3155 | struct skge_port *skge = netdev_priv(dev); |
3112 | struct skge_ring *ring = &skge->tx_ring; | 3156 | struct skge_ring *ring = &skge->tx_ring; |
3113 | struct skge_element *e; | 3157 | struct skge_element *e; |
3158 | unsigned int bytes_compl = 0, pkts_compl = 0; | ||
3114 | 3159 | ||
3115 | skge_write8(skge->hw, Q_ADDR(txqaddr[skge->port], Q_CSR), CSR_IRQ_CL_F); | 3160 | skge_write8(skge->hw, Q_ADDR(txqaddr[skge->port], Q_CSR), CSR_IRQ_CL_F); |
3116 | 3161 | ||
@@ -3120,8 +3165,20 @@ static void skge_tx_done(struct net_device *dev) | |||
3120 | if (control & BMU_OWN) | 3165 | if (control & BMU_OWN) |
3121 | break; | 3166 | break; |
3122 | 3167 | ||
3123 | skge_tx_free(skge, e, control); | 3168 | skge_tx_unmap(skge->hw->pdev, e, control); |
3169 | |||
3170 | if (control & BMU_EOF) { | ||
3171 | netif_printk(skge, tx_done, KERN_DEBUG, skge->netdev, | ||
3172 | "tx done slot %td\n", | ||
3173 | e - skge->tx_ring.start); | ||
3174 | |||
3175 | pkts_compl++; | ||
3176 | bytes_compl += e->skb->len; | ||
3177 | |||
3178 | dev_kfree_skb(e->skb); | ||
3179 | } | ||
3124 | } | 3180 | } |
3181 | netdev_completed_queue(dev, pkts_compl, bytes_compl); | ||
3125 | skge->tx_ring.to_clean = e; | 3182 | skge->tx_ring.to_clean = e; |
3126 | 3183 | ||
3127 | /* Can run lockless until we need to synchronize to restart queue. */ | 3184 | /* Can run lockless until we need to synchronize to restart queue. */ |
diff --git a/drivers/net/ethernet/mellanox/mlx4/cmd.c b/drivers/net/ethernet/mellanox/mlx4/cmd.c index 978f593094c0..405e6ac3faf6 100644 --- a/drivers/net/ethernet/mellanox/mlx4/cmd.c +++ b/drivers/net/ethernet/mellanox/mlx4/cmd.c | |||
@@ -1247,6 +1247,7 @@ static void mlx4_master_do_cmd(struct mlx4_dev *dev, int slave, u8 cmd, | |||
1247 | u32 reply; | 1247 | u32 reply; |
1248 | u32 slave_status = 0; | 1248 | u32 slave_status = 0; |
1249 | u8 is_going_down = 0; | 1249 | u8 is_going_down = 0; |
1250 | int i; | ||
1250 | 1251 | ||
1251 | slave_state[slave].comm_toggle ^= 1; | 1252 | slave_state[slave].comm_toggle ^= 1; |
1252 | reply = (u32) slave_state[slave].comm_toggle << 31; | 1253 | reply = (u32) slave_state[slave].comm_toggle << 31; |
@@ -1258,6 +1259,10 @@ static void mlx4_master_do_cmd(struct mlx4_dev *dev, int slave, u8 cmd, | |||
1258 | if (cmd == MLX4_COMM_CMD_RESET) { | 1259 | if (cmd == MLX4_COMM_CMD_RESET) { |
1259 | mlx4_warn(dev, "Received reset from slave:%d\n", slave); | 1260 | mlx4_warn(dev, "Received reset from slave:%d\n", slave); |
1260 | slave_state[slave].active = false; | 1261 | slave_state[slave].active = false; |
1262 | for (i = 0; i < MLX4_EVENT_TYPES_NUM; ++i) { | ||
1263 | slave_state[slave].event_eq[i].eqn = -1; | ||
1264 | slave_state[slave].event_eq[i].token = 0; | ||
1265 | } | ||
1261 | /*check if we are in the middle of FLR process, | 1266 | /*check if we are in the middle of FLR process, |
1262 | if so return "retry" status to the slave*/ | 1267 | if so return "retry" status to the slave*/ |
1263 | if (MLX4_COMM_CMD_FLR == slave_state[slave].last_cmd) { | 1268 | if (MLX4_COMM_CMD_FLR == slave_state[slave].last_cmd) { |
@@ -1452,7 +1457,7 @@ int mlx4_multi_func_init(struct mlx4_dev *dev) | |||
1452 | { | 1457 | { |
1453 | struct mlx4_priv *priv = mlx4_priv(dev); | 1458 | struct mlx4_priv *priv = mlx4_priv(dev); |
1454 | struct mlx4_slave_state *s_state; | 1459 | struct mlx4_slave_state *s_state; |
1455 | int i, err, port; | 1460 | int i, j, err, port; |
1456 | 1461 | ||
1457 | priv->mfunc.vhcr = dma_alloc_coherent(&(dev->pdev->dev), PAGE_SIZE, | 1462 | priv->mfunc.vhcr = dma_alloc_coherent(&(dev->pdev->dev), PAGE_SIZE, |
1458 | &priv->mfunc.vhcr_dma, | 1463 | &priv->mfunc.vhcr_dma, |
@@ -1485,6 +1490,8 @@ int mlx4_multi_func_init(struct mlx4_dev *dev) | |||
1485 | for (i = 0; i < dev->num_slaves; ++i) { | 1490 | for (i = 0; i < dev->num_slaves; ++i) { |
1486 | s_state = &priv->mfunc.master.slave_state[i]; | 1491 | s_state = &priv->mfunc.master.slave_state[i]; |
1487 | s_state->last_cmd = MLX4_COMM_CMD_RESET; | 1492 | s_state->last_cmd = MLX4_COMM_CMD_RESET; |
1493 | for (j = 0; j < MLX4_EVENT_TYPES_NUM; ++j) | ||
1494 | s_state->event_eq[j].eqn = -1; | ||
1488 | __raw_writel((__force u32) 0, | 1495 | __raw_writel((__force u32) 0, |
1489 | &priv->mfunc.comm[i].slave_write); | 1496 | &priv->mfunc.comm[i].slave_write); |
1490 | __raw_writel((__force u32) 0, | 1497 | __raw_writel((__force u32) 0, |
diff --git a/drivers/net/ethernet/mellanox/mlx4/cq.c b/drivers/net/ethernet/mellanox/mlx4/cq.c index 475f9d6af955..7e64033d7de3 100644 --- a/drivers/net/ethernet/mellanox/mlx4/cq.c +++ b/drivers/net/ethernet/mellanox/mlx4/cq.c | |||
@@ -96,7 +96,7 @@ void mlx4_cq_event(struct mlx4_dev *dev, u32 cqn, int event_type) | |||
96 | static int mlx4_SW2HW_CQ(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *mailbox, | 96 | static int mlx4_SW2HW_CQ(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *mailbox, |
97 | int cq_num) | 97 | int cq_num) |
98 | { | 98 | { |
99 | return mlx4_cmd(dev, mailbox->dma | dev->caps.function, cq_num, 0, | 99 | return mlx4_cmd(dev, mailbox->dma, cq_num, 0, |
100 | MLX4_CMD_SW2HW_CQ, MLX4_CMD_TIME_CLASS_A, | 100 | MLX4_CMD_SW2HW_CQ, MLX4_CMD_TIME_CLASS_A, |
101 | MLX4_CMD_WRAPPED); | 101 | MLX4_CMD_WRAPPED); |
102 | } | 102 | } |
@@ -111,7 +111,7 @@ static int mlx4_MODIFY_CQ(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *mailbox | |||
111 | static int mlx4_HW2SW_CQ(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *mailbox, | 111 | static int mlx4_HW2SW_CQ(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *mailbox, |
112 | int cq_num) | 112 | int cq_num) |
113 | { | 113 | { |
114 | return mlx4_cmd_box(dev, dev->caps.function, mailbox ? mailbox->dma : 0, | 114 | return mlx4_cmd_box(dev, 0, mailbox ? mailbox->dma : 0, |
115 | cq_num, mailbox ? 0 : 1, MLX4_CMD_HW2SW_CQ, | 115 | cq_num, mailbox ? 0 : 1, MLX4_CMD_HW2SW_CQ, |
116 | MLX4_CMD_TIME_CLASS_A, MLX4_CMD_WRAPPED); | 116 | MLX4_CMD_TIME_CLASS_A, MLX4_CMD_WRAPPED); |
117 | } | 117 | } |
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c index 7dbc6a230779..70346fd7f9c4 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | |||
@@ -183,10 +183,11 @@ static int mlx4_en_set_wol(struct net_device *netdev, | |||
183 | static int mlx4_en_get_sset_count(struct net_device *dev, int sset) | 183 | static int mlx4_en_get_sset_count(struct net_device *dev, int sset) |
184 | { | 184 | { |
185 | struct mlx4_en_priv *priv = netdev_priv(dev); | 185 | struct mlx4_en_priv *priv = netdev_priv(dev); |
186 | int bit_count = hweight64(priv->stats_bitmap); | ||
186 | 187 | ||
187 | switch (sset) { | 188 | switch (sset) { |
188 | case ETH_SS_STATS: | 189 | case ETH_SS_STATS: |
189 | return NUM_ALL_STATS + | 190 | return (priv->stats_bitmap ? bit_count : NUM_ALL_STATS) + |
190 | (priv->tx_ring_num + priv->rx_ring_num) * 2; | 191 | (priv->tx_ring_num + priv->rx_ring_num) * 2; |
191 | case ETH_SS_TEST: | 192 | case ETH_SS_TEST: |
192 | return MLX4_EN_NUM_SELF_TEST - !(priv->mdev->dev->caps.flags | 193 | return MLX4_EN_NUM_SELF_TEST - !(priv->mdev->dev->caps.flags |
@@ -201,14 +202,34 @@ static void mlx4_en_get_ethtool_stats(struct net_device *dev, | |||
201 | { | 202 | { |
202 | struct mlx4_en_priv *priv = netdev_priv(dev); | 203 | struct mlx4_en_priv *priv = netdev_priv(dev); |
203 | int index = 0; | 204 | int index = 0; |
204 | int i; | 205 | int i, j = 0; |
205 | 206 | ||
206 | spin_lock_bh(&priv->stats_lock); | 207 | spin_lock_bh(&priv->stats_lock); |
207 | 208 | ||
208 | for (i = 0; i < NUM_MAIN_STATS; i++) | 209 | if (!(priv->stats_bitmap)) { |
209 | data[index++] = ((unsigned long *) &priv->stats)[i]; | 210 | for (i = 0; i < NUM_MAIN_STATS; i++) |
210 | for (i = 0; i < NUM_PORT_STATS; i++) | 211 | data[index++] = |
211 | data[index++] = ((unsigned long *) &priv->port_stats)[i]; | 212 | ((unsigned long *) &priv->stats)[i]; |
213 | for (i = 0; i < NUM_PORT_STATS; i++) | ||
214 | data[index++] = | ||
215 | ((unsigned long *) &priv->port_stats)[i]; | ||
216 | for (i = 0; i < NUM_PKT_STATS; i++) | ||
217 | data[index++] = | ||
218 | ((unsigned long *) &priv->pkstats)[i]; | ||
219 | } else { | ||
220 | for (i = 0; i < NUM_MAIN_STATS; i++) { | ||
221 | if ((priv->stats_bitmap >> j) & 1) | ||
222 | data[index++] = | ||
223 | ((unsigned long *) &priv->stats)[i]; | ||
224 | j++; | ||
225 | } | ||
226 | for (i = 0; i < NUM_PORT_STATS; i++) { | ||
227 | if ((priv->stats_bitmap >> j) & 1) | ||
228 | data[index++] = | ||
229 | ((unsigned long *) &priv->port_stats)[i]; | ||
230 | j++; | ||
231 | } | ||
232 | } | ||
212 | for (i = 0; i < priv->tx_ring_num; i++) { | 233 | for (i = 0; i < priv->tx_ring_num; i++) { |
213 | data[index++] = priv->tx_ring[i].packets; | 234 | data[index++] = priv->tx_ring[i].packets; |
214 | data[index++] = priv->tx_ring[i].bytes; | 235 | data[index++] = priv->tx_ring[i].bytes; |
@@ -217,8 +238,6 @@ static void mlx4_en_get_ethtool_stats(struct net_device *dev, | |||
217 | data[index++] = priv->rx_ring[i].packets; | 238 | data[index++] = priv->rx_ring[i].packets; |
218 | data[index++] = priv->rx_ring[i].bytes; | 239 | data[index++] = priv->rx_ring[i].bytes; |
219 | } | 240 | } |
220 | for (i = 0; i < NUM_PKT_STATS; i++) | ||
221 | data[index++] = ((unsigned long *) &priv->pkstats)[i]; | ||
222 | spin_unlock_bh(&priv->stats_lock); | 241 | spin_unlock_bh(&priv->stats_lock); |
223 | 242 | ||
224 | } | 243 | } |
@@ -247,11 +266,29 @@ static void mlx4_en_get_strings(struct net_device *dev, | |||
247 | 266 | ||
248 | case ETH_SS_STATS: | 267 | case ETH_SS_STATS: |
249 | /* Add main counters */ | 268 | /* Add main counters */ |
250 | for (i = 0; i < NUM_MAIN_STATS; i++) | 269 | if (!priv->stats_bitmap) { |
251 | strcpy(data + (index++) * ETH_GSTRING_LEN, main_strings[i]); | 270 | for (i = 0; i < NUM_MAIN_STATS; i++) |
252 | for (i = 0; i< NUM_PORT_STATS; i++) | 271 | strcpy(data + (index++) * ETH_GSTRING_LEN, |
253 | strcpy(data + (index++) * ETH_GSTRING_LEN, | 272 | main_strings[i]); |
254 | main_strings[i + NUM_MAIN_STATS]); | 273 | for (i = 0; i < NUM_PORT_STATS; i++) |
274 | strcpy(data + (index++) * ETH_GSTRING_LEN, | ||
275 | main_strings[i + | ||
276 | NUM_MAIN_STATS]); | ||
277 | for (i = 0; i < NUM_PKT_STATS; i++) | ||
278 | strcpy(data + (index++) * ETH_GSTRING_LEN, | ||
279 | main_strings[i + | ||
280 | NUM_MAIN_STATS + | ||
281 | NUM_PORT_STATS]); | ||
282 | } else | ||
283 | for (i = 0; i < NUM_MAIN_STATS + NUM_PORT_STATS; i++) { | ||
284 | if ((priv->stats_bitmap >> i) & 1) { | ||
285 | strcpy(data + | ||
286 | (index++) * ETH_GSTRING_LEN, | ||
287 | main_strings[i]); | ||
288 | } | ||
289 | if (!(priv->stats_bitmap >> i)) | ||
290 | break; | ||
291 | } | ||
255 | for (i = 0; i < priv->tx_ring_num; i++) { | 292 | for (i = 0; i < priv->tx_ring_num; i++) { |
256 | sprintf(data + (index++) * ETH_GSTRING_LEN, | 293 | sprintf(data + (index++) * ETH_GSTRING_LEN, |
257 | "tx%d_packets", i); | 294 | "tx%d_packets", i); |
@@ -264,9 +301,6 @@ static void mlx4_en_get_strings(struct net_device *dev, | |||
264 | sprintf(data + (index++) * ETH_GSTRING_LEN, | 301 | sprintf(data + (index++) * ETH_GSTRING_LEN, |
265 | "rx%d_bytes", i); | 302 | "rx%d_bytes", i); |
266 | } | 303 | } |
267 | for (i = 0; i< NUM_PKT_STATS; i++) | ||
268 | strcpy(data + (index++) * ETH_GSTRING_LEN, | ||
269 | main_strings[i + NUM_MAIN_STATS + NUM_PORT_STATS]); | ||
270 | break; | 304 | break; |
271 | } | 305 | } |
272 | } | 306 | } |
@@ -479,6 +513,95 @@ static void mlx4_en_get_ringparam(struct net_device *dev, | |||
479 | param->tx_pending = priv->tx_ring[0].size; | 513 | param->tx_pending = priv->tx_ring[0].size; |
480 | } | 514 | } |
481 | 515 | ||
516 | static u32 mlx4_en_get_rxfh_indir_size(struct net_device *dev) | ||
517 | { | ||
518 | struct mlx4_en_priv *priv = netdev_priv(dev); | ||
519 | |||
520 | return priv->rx_ring_num; | ||
521 | } | ||
522 | |||
523 | static int mlx4_en_get_rxfh_indir(struct net_device *dev, u32 *ring_index) | ||
524 | { | ||
525 | struct mlx4_en_priv *priv = netdev_priv(dev); | ||
526 | struct mlx4_en_rss_map *rss_map = &priv->rss_map; | ||
527 | int rss_rings; | ||
528 | size_t n = priv->rx_ring_num; | ||
529 | int err = 0; | ||
530 | |||
531 | rss_rings = priv->prof->rss_rings ?: priv->rx_ring_num; | ||
532 | |||
533 | while (n--) { | ||
534 | ring_index[n] = rss_map->qps[n % rss_rings].qpn - | ||
535 | rss_map->base_qpn; | ||
536 | } | ||
537 | |||
538 | return err; | ||
539 | } | ||
540 | |||
541 | static int mlx4_en_set_rxfh_indir(struct net_device *dev, | ||
542 | const u32 *ring_index) | ||
543 | { | ||
544 | struct mlx4_en_priv *priv = netdev_priv(dev); | ||
545 | struct mlx4_en_dev *mdev = priv->mdev; | ||
546 | int port_up = 0; | ||
547 | int err = 0; | ||
548 | int i; | ||
549 | int rss_rings = 0; | ||
550 | |||
551 | /* Calculate RSS table size and make sure flows are spread evenly | ||
552 | * between rings | ||
553 | */ | ||
554 | for (i = 0; i < priv->rx_ring_num; i++) { | ||
555 | if (i > 0 && !ring_index[i] && !rss_rings) | ||
556 | rss_rings = i; | ||
557 | |||
558 | if (ring_index[i] != (i % (rss_rings ?: priv->rx_ring_num))) | ||
559 | return -EINVAL; | ||
560 | } | ||
561 | |||
562 | if (!rss_rings) | ||
563 | rss_rings = priv->rx_ring_num; | ||
564 | |||
565 | /* RSS table size must be an order of 2 */ | ||
566 | if (!is_power_of_2(rss_rings)) | ||
567 | return -EINVAL; | ||
568 | |||
569 | mutex_lock(&mdev->state_lock); | ||
570 | if (priv->port_up) { | ||
571 | port_up = 1; | ||
572 | mlx4_en_stop_port(dev); | ||
573 | } | ||
574 | |||
575 | priv->prof->rss_rings = rss_rings; | ||
576 | |||
577 | if (port_up) { | ||
578 | err = mlx4_en_start_port(dev); | ||
579 | if (err) | ||
580 | en_err(priv, "Failed starting port\n"); | ||
581 | } | ||
582 | |||
583 | mutex_unlock(&mdev->state_lock); | ||
584 | return err; | ||
585 | } | ||
586 | |||
587 | static int mlx4_en_get_rxnfc(struct net_device *dev, struct ethtool_rxnfc *cmd, | ||
588 | u32 *rule_locs) | ||
589 | { | ||
590 | struct mlx4_en_priv *priv = netdev_priv(dev); | ||
591 | int err = 0; | ||
592 | |||
593 | switch (cmd->cmd) { | ||
594 | case ETHTOOL_GRXRINGS: | ||
595 | cmd->data = priv->rx_ring_num; | ||
596 | break; | ||
597 | default: | ||
598 | err = -EOPNOTSUPP; | ||
599 | break; | ||
600 | } | ||
601 | |||
602 | return err; | ||
603 | } | ||
604 | |||
482 | const struct ethtool_ops mlx4_en_ethtool_ops = { | 605 | const struct ethtool_ops mlx4_en_ethtool_ops = { |
483 | .get_drvinfo = mlx4_en_get_drvinfo, | 606 | .get_drvinfo = mlx4_en_get_drvinfo, |
484 | .get_settings = mlx4_en_get_settings, | 607 | .get_settings = mlx4_en_get_settings, |
@@ -498,6 +621,10 @@ const struct ethtool_ops mlx4_en_ethtool_ops = { | |||
498 | .set_pauseparam = mlx4_en_set_pauseparam, | 621 | .set_pauseparam = mlx4_en_set_pauseparam, |
499 | .get_ringparam = mlx4_en_get_ringparam, | 622 | .get_ringparam = mlx4_en_get_ringparam, |
500 | .set_ringparam = mlx4_en_set_ringparam, | 623 | .set_ringparam = mlx4_en_set_ringparam, |
624 | .get_rxnfc = mlx4_en_get_rxnfc, | ||
625 | .get_rxfh_indir_size = mlx4_en_get_rxfh_indir_size, | ||
626 | .get_rxfh_indir = mlx4_en_get_rxfh_indir, | ||
627 | .set_rxfh_indir = mlx4_en_set_rxfh_indir, | ||
501 | }; | 628 | }; |
502 | 629 | ||
503 | 630 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_main.c b/drivers/net/ethernet/mellanox/mlx4/en_main.c index a06096fcc0b8..2097a7d3c5b8 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_main.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_main.c | |||
@@ -62,10 +62,6 @@ static const char mlx4_en_version[] = | |||
62 | * Device scope module parameters | 62 | * Device scope module parameters |
63 | */ | 63 | */ |
64 | 64 | ||
65 | |||
66 | /* Enable RSS TCP traffic */ | ||
67 | MLX4_EN_PARM_INT(tcp_rss, 1, | ||
68 | "Enable RSS for incomming TCP traffic or disabled (0)"); | ||
69 | /* Enable RSS UDP traffic */ | 65 | /* Enable RSS UDP traffic */ |
70 | MLX4_EN_PARM_INT(udp_rss, 1, | 66 | MLX4_EN_PARM_INT(udp_rss, 1, |
71 | "Enable RSS for incomming UDP traffic or disabled (0)"); | 67 | "Enable RSS for incomming UDP traffic or disabled (0)"); |
@@ -104,7 +100,6 @@ static int mlx4_en_get_profile(struct mlx4_en_dev *mdev) | |||
104 | struct mlx4_en_profile *params = &mdev->profile; | 100 | struct mlx4_en_profile *params = &mdev->profile; |
105 | int i; | 101 | int i; |
106 | 102 | ||
107 | params->tcp_rss = tcp_rss; | ||
108 | params->udp_rss = udp_rss; | 103 | params->udp_rss = udp_rss; |
109 | if (params->udp_rss && !(mdev->dev->caps.flags | 104 | if (params->udp_rss && !(mdev->dev->caps.flags |
110 | & MLX4_DEV_CAP_FLAG_UDP_RSS)) { | 105 | & MLX4_DEV_CAP_FLAG_UDP_RSS)) { |
@@ -120,6 +115,7 @@ static int mlx4_en_get_profile(struct mlx4_en_dev *mdev) | |||
120 | params->prof[i].rx_ring_size = MLX4_EN_DEF_RX_RING_SIZE; | 115 | params->prof[i].rx_ring_size = MLX4_EN_DEF_RX_RING_SIZE; |
121 | params->prof[i].tx_ring_num = MLX4_EN_NUM_TX_RINGS + | 116 | params->prof[i].tx_ring_num = MLX4_EN_NUM_TX_RINGS + |
122 | (!!pfcrx) * MLX4_EN_NUM_PPP_RINGS; | 117 | (!!pfcrx) * MLX4_EN_NUM_PPP_RINGS; |
118 | params->prof[i].rss_rings = 0; | ||
123 | } | 119 | } |
124 | 120 | ||
125 | return 0; | 121 | return 0; |
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c index 72fa807b69ce..467ae5824875 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c | |||
@@ -702,6 +702,8 @@ int mlx4_en_start_port(struct net_device *dev) | |||
702 | /* Schedule multicast task to populate multicast list */ | 702 | /* Schedule multicast task to populate multicast list */ |
703 | queue_work(mdev->workqueue, &priv->mcast_task); | 703 | queue_work(mdev->workqueue, &priv->mcast_task); |
704 | 704 | ||
705 | mlx4_set_stats_bitmap(mdev->dev, &priv->stats_bitmap); | ||
706 | |||
705 | priv->port_up = true; | 707 | priv->port_up = true; |
706 | netif_tx_start_all_queues(dev); | 708 | netif_tx_start_all_queues(dev); |
707 | return 0; | 709 | return 0; |
@@ -807,38 +809,50 @@ static void mlx4_en_restart(struct work_struct *work) | |||
807 | mutex_unlock(&mdev->state_lock); | 809 | mutex_unlock(&mdev->state_lock); |
808 | } | 810 | } |
809 | 811 | ||
810 | 812 | static void mlx4_en_clear_stats(struct net_device *dev) | |
811 | static int mlx4_en_open(struct net_device *dev) | ||
812 | { | 813 | { |
813 | struct mlx4_en_priv *priv = netdev_priv(dev); | 814 | struct mlx4_en_priv *priv = netdev_priv(dev); |
814 | struct mlx4_en_dev *mdev = priv->mdev; | 815 | struct mlx4_en_dev *mdev = priv->mdev; |
815 | int i; | 816 | int i; |
816 | int err = 0; | ||
817 | |||
818 | mutex_lock(&mdev->state_lock); | ||
819 | |||
820 | if (!mdev->device_up) { | ||
821 | en_err(priv, "Cannot open - device down/disabled\n"); | ||
822 | err = -EBUSY; | ||
823 | goto out; | ||
824 | } | ||
825 | 817 | ||
826 | /* Reset HW statistics and performance counters */ | ||
827 | if (mlx4_en_DUMP_ETH_STATS(mdev, priv->port, 1)) | 818 | if (mlx4_en_DUMP_ETH_STATS(mdev, priv->port, 1)) |
828 | en_dbg(HW, priv, "Failed dumping statistics\n"); | 819 | en_dbg(HW, priv, "Failed dumping statistics\n"); |
829 | 820 | ||
830 | memset(&priv->stats, 0, sizeof(priv->stats)); | 821 | memset(&priv->stats, 0, sizeof(priv->stats)); |
831 | memset(&priv->pstats, 0, sizeof(priv->pstats)); | 822 | memset(&priv->pstats, 0, sizeof(priv->pstats)); |
823 | memset(&priv->pkstats, 0, sizeof(priv->pkstats)); | ||
824 | memset(&priv->port_stats, 0, sizeof(priv->port_stats)); | ||
832 | 825 | ||
833 | for (i = 0; i < priv->tx_ring_num; i++) { | 826 | for (i = 0; i < priv->tx_ring_num; i++) { |
834 | priv->tx_ring[i].bytes = 0; | 827 | priv->tx_ring[i].bytes = 0; |
835 | priv->tx_ring[i].packets = 0; | 828 | priv->tx_ring[i].packets = 0; |
829 | priv->tx_ring[i].tx_csum = 0; | ||
836 | } | 830 | } |
837 | for (i = 0; i < priv->rx_ring_num; i++) { | 831 | for (i = 0; i < priv->rx_ring_num; i++) { |
838 | priv->rx_ring[i].bytes = 0; | 832 | priv->rx_ring[i].bytes = 0; |
839 | priv->rx_ring[i].packets = 0; | 833 | priv->rx_ring[i].packets = 0; |
834 | priv->rx_ring[i].csum_ok = 0; | ||
835 | priv->rx_ring[i].csum_none = 0; | ||
836 | } | ||
837 | } | ||
838 | |||
839 | static int mlx4_en_open(struct net_device *dev) | ||
840 | { | ||
841 | struct mlx4_en_priv *priv = netdev_priv(dev); | ||
842 | struct mlx4_en_dev *mdev = priv->mdev; | ||
843 | int err = 0; | ||
844 | |||
845 | mutex_lock(&mdev->state_lock); | ||
846 | |||
847 | if (!mdev->device_up) { | ||
848 | en_err(priv, "Cannot open - device down/disabled\n"); | ||
849 | err = -EBUSY; | ||
850 | goto out; | ||
840 | } | 851 | } |
841 | 852 | ||
853 | /* Reset HW statistics and SW counters */ | ||
854 | mlx4_en_clear_stats(dev); | ||
855 | |||
842 | err = mlx4_en_start_port(dev); | 856 | err = mlx4_en_start_port(dev); |
843 | if (err) | 857 | if (err) |
844 | en_err(priv, "Failed starting port:%d\n", priv->port); | 858 | en_err(priv, "Failed starting port:%d\n", priv->port); |
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_rx.c b/drivers/net/ethernet/mellanox/mlx4/en_rx.c index e8d6ad2dce0a..971d4b6b8dfe 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_rx.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_rx.c | |||
@@ -853,6 +853,7 @@ int mlx4_en_config_rss_steer(struct mlx4_en_priv *priv) | |||
853 | struct mlx4_en_rss_map *rss_map = &priv->rss_map; | 853 | struct mlx4_en_rss_map *rss_map = &priv->rss_map; |
854 | struct mlx4_qp_context context; | 854 | struct mlx4_qp_context context; |
855 | struct mlx4_rss_context *rss_context; | 855 | struct mlx4_rss_context *rss_context; |
856 | int rss_rings; | ||
856 | void *ptr; | 857 | void *ptr; |
857 | u8 rss_mask = (MLX4_RSS_IPV4 | MLX4_RSS_TCP_IPV4 | MLX4_RSS_IPV6 | | 858 | u8 rss_mask = (MLX4_RSS_IPV4 | MLX4_RSS_TCP_IPV4 | MLX4_RSS_IPV6 | |
858 | MLX4_RSS_TCP_IPV6); | 859 | MLX4_RSS_TCP_IPV6); |
@@ -893,10 +894,15 @@ int mlx4_en_config_rss_steer(struct mlx4_en_priv *priv) | |||
893 | mlx4_en_fill_qp_context(priv, 0, 0, 0, 1, priv->base_qpn, | 894 | mlx4_en_fill_qp_context(priv, 0, 0, 0, 1, priv->base_qpn, |
894 | priv->rx_ring[0].cqn, &context); | 895 | priv->rx_ring[0].cqn, &context); |
895 | 896 | ||
897 | if (!priv->prof->rss_rings || priv->prof->rss_rings > priv->rx_ring_num) | ||
898 | rss_rings = priv->rx_ring_num; | ||
899 | else | ||
900 | rss_rings = priv->prof->rss_rings; | ||
901 | |||
896 | ptr = ((void *) &context) + offsetof(struct mlx4_qp_context, pri_path) | 902 | ptr = ((void *) &context) + offsetof(struct mlx4_qp_context, pri_path) |
897 | + MLX4_RSS_OFFSET_IN_QPC_PRI_PATH; | 903 | + MLX4_RSS_OFFSET_IN_QPC_PRI_PATH; |
898 | rss_context = ptr; | 904 | rss_context = ptr; |
899 | rss_context->base_qpn = cpu_to_be32(ilog2(priv->rx_ring_num) << 24 | | 905 | rss_context->base_qpn = cpu_to_be32(ilog2(rss_rings) << 24 | |
900 | (rss_map->base_qpn)); | 906 | (rss_map->base_qpn)); |
901 | rss_context->default_qpn = cpu_to_be32(rss_map->base_qpn); | 907 | rss_context->default_qpn = cpu_to_be32(rss_map->base_qpn); |
902 | if (priv->mdev->profile.udp_rss) { | 908 | if (priv->mdev->profile.udp_rss) { |
diff --git a/drivers/net/ethernet/mellanox/mlx4/eq.c b/drivers/net/ethernet/mellanox/mlx4/eq.c index 1e9b55eb7217..55d7bd4e210a 100644 --- a/drivers/net/ethernet/mellanox/mlx4/eq.c +++ b/drivers/net/ethernet/mellanox/mlx4/eq.c | |||
@@ -513,25 +513,22 @@ int mlx4_MAP_EQ_wrapper(struct mlx4_dev *dev, int slave, | |||
513 | { | 513 | { |
514 | struct mlx4_priv *priv = mlx4_priv(dev); | 514 | struct mlx4_priv *priv = mlx4_priv(dev); |
515 | struct mlx4_slave_event_eq_info *event_eq = | 515 | struct mlx4_slave_event_eq_info *event_eq = |
516 | &priv->mfunc.master.slave_state[slave].event_eq; | 516 | priv->mfunc.master.slave_state[slave].event_eq; |
517 | u32 in_modifier = vhcr->in_modifier; | 517 | u32 in_modifier = vhcr->in_modifier; |
518 | u32 eqn = in_modifier & 0x1FF; | 518 | u32 eqn = in_modifier & 0x1FF; |
519 | u64 in_param = vhcr->in_param; | 519 | u64 in_param = vhcr->in_param; |
520 | int err = 0; | 520 | int err = 0; |
521 | int i; | ||
521 | 522 | ||
522 | if (slave == dev->caps.function) | 523 | if (slave == dev->caps.function) |
523 | err = mlx4_cmd(dev, in_param, (in_modifier & 0x80000000) | eqn, | 524 | err = mlx4_cmd(dev, in_param, (in_modifier & 0x80000000) | eqn, |
524 | 0, MLX4_CMD_MAP_EQ, MLX4_CMD_TIME_CLASS_B, | 525 | 0, MLX4_CMD_MAP_EQ, MLX4_CMD_TIME_CLASS_B, |
525 | MLX4_CMD_NATIVE); | 526 | MLX4_CMD_NATIVE); |
526 | if (!err) { | 527 | if (!err) |
527 | if (in_modifier >> 31) { | 528 | for (i = 0; i < MLX4_EVENT_TYPES_NUM; ++i) |
528 | /* unmap */ | 529 | if (in_param & (1LL << i)) |
529 | event_eq->event_type &= ~in_param; | 530 | event_eq[i].eqn = in_modifier >> 31 ? -1 : eqn; |
530 | } else { | 531 | |
531 | event_eq->eqn = eqn; | ||
532 | event_eq->event_type = in_param; | ||
533 | } | ||
534 | } | ||
535 | return err; | 532 | return err; |
536 | } | 533 | } |
537 | 534 | ||
@@ -546,7 +543,7 @@ static int mlx4_MAP_EQ(struct mlx4_dev *dev, u64 event_mask, int unmap, | |||
546 | static int mlx4_SW2HW_EQ(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *mailbox, | 543 | static int mlx4_SW2HW_EQ(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *mailbox, |
547 | int eq_num) | 544 | int eq_num) |
548 | { | 545 | { |
549 | return mlx4_cmd(dev, mailbox->dma | dev->caps.function, eq_num, 0, | 546 | return mlx4_cmd(dev, mailbox->dma, eq_num, 0, |
550 | MLX4_CMD_SW2HW_EQ, MLX4_CMD_TIME_CLASS_A, | 547 | MLX4_CMD_SW2HW_EQ, MLX4_CMD_TIME_CLASS_A, |
551 | MLX4_CMD_WRAPPED); | 548 | MLX4_CMD_WRAPPED); |
552 | } | 549 | } |
@@ -554,7 +551,7 @@ static int mlx4_SW2HW_EQ(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *mailbox, | |||
554 | static int mlx4_HW2SW_EQ(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *mailbox, | 551 | static int mlx4_HW2SW_EQ(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *mailbox, |
555 | int eq_num) | 552 | int eq_num) |
556 | { | 553 | { |
557 | return mlx4_cmd_box(dev, dev->caps.function, mailbox->dma, eq_num, | 554 | return mlx4_cmd_box(dev, 0, mailbox->dma, eq_num, |
558 | 0, MLX4_CMD_HW2SW_EQ, MLX4_CMD_TIME_CLASS_A, | 555 | 0, MLX4_CMD_HW2SW_EQ, MLX4_CMD_TIME_CLASS_A, |
559 | MLX4_CMD_WRAPPED); | 556 | MLX4_CMD_WRAPPED); |
560 | } | 557 | } |
diff --git a/drivers/net/ethernet/mellanox/mlx4/fw.c b/drivers/net/ethernet/mellanox/mlx4/fw.c index a424a19280cc..8a21e10952ea 100644 --- a/drivers/net/ethernet/mellanox/mlx4/fw.c +++ b/drivers/net/ethernet/mellanox/mlx4/fw.c | |||
@@ -158,7 +158,6 @@ int mlx4_QUERY_FUNC_CAP_wrapper(struct mlx4_dev *dev, int slave, | |||
158 | 158 | ||
159 | #define QUERY_FUNC_CAP_FLAGS_OFFSET 0x0 | 159 | #define QUERY_FUNC_CAP_FLAGS_OFFSET 0x0 |
160 | #define QUERY_FUNC_CAP_NUM_PORTS_OFFSET 0x1 | 160 | #define QUERY_FUNC_CAP_NUM_PORTS_OFFSET 0x1 |
161 | #define QUERY_FUNC_CAP_FUNCTION_OFFSET 0x3 | ||
162 | #define QUERY_FUNC_CAP_PF_BHVR_OFFSET 0x4 | 161 | #define QUERY_FUNC_CAP_PF_BHVR_OFFSET 0x4 |
163 | #define QUERY_FUNC_CAP_QP_QUOTA_OFFSET 0x10 | 162 | #define QUERY_FUNC_CAP_QP_QUOTA_OFFSET 0x10 |
164 | #define QUERY_FUNC_CAP_CQ_QUOTA_OFFSET 0x14 | 163 | #define QUERY_FUNC_CAP_CQ_QUOTA_OFFSET 0x14 |
@@ -182,9 +181,6 @@ int mlx4_QUERY_FUNC_CAP_wrapper(struct mlx4_dev *dev, int slave, | |||
182 | field = 1 << 7; /* enable only ethernet interface */ | 181 | field = 1 << 7; /* enable only ethernet interface */ |
183 | MLX4_PUT(outbox->buf, field, QUERY_FUNC_CAP_FLAGS_OFFSET); | 182 | MLX4_PUT(outbox->buf, field, QUERY_FUNC_CAP_FLAGS_OFFSET); |
184 | 183 | ||
185 | field = slave; | ||
186 | MLX4_PUT(outbox->buf, field, QUERY_FUNC_CAP_FUNCTION_OFFSET); | ||
187 | |||
188 | field = dev->caps.num_ports; | 184 | field = dev->caps.num_ports; |
189 | MLX4_PUT(outbox->buf, field, QUERY_FUNC_CAP_NUM_PORTS_OFFSET); | 185 | MLX4_PUT(outbox->buf, field, QUERY_FUNC_CAP_NUM_PORTS_OFFSET); |
190 | 186 | ||
@@ -249,9 +245,6 @@ int mlx4_QUERY_FUNC_CAP(struct mlx4_dev *dev, struct mlx4_func_cap *func_cap) | |||
249 | goto out; | 245 | goto out; |
250 | } | 246 | } |
251 | 247 | ||
252 | MLX4_GET(field, outbox, QUERY_FUNC_CAP_FUNCTION_OFFSET); | ||
253 | func_cap->function = field; | ||
254 | |||
255 | MLX4_GET(field, outbox, QUERY_FUNC_CAP_NUM_PORTS_OFFSET); | 248 | MLX4_GET(field, outbox, QUERY_FUNC_CAP_NUM_PORTS_OFFSET); |
256 | func_cap->num_ports = field; | 249 | func_cap->num_ports = field; |
257 | 250 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx4/fw.h b/drivers/net/ethernet/mellanox/mlx4/fw.h index 119e0cc9fab3..e1a5fa56bcbc 100644 --- a/drivers/net/ethernet/mellanox/mlx4/fw.h +++ b/drivers/net/ethernet/mellanox/mlx4/fw.h | |||
@@ -119,7 +119,6 @@ struct mlx4_dev_cap { | |||
119 | }; | 119 | }; |
120 | 120 | ||
121 | struct mlx4_func_cap { | 121 | struct mlx4_func_cap { |
122 | u8 function; | ||
123 | u8 num_ports; | 122 | u8 num_ports; |
124 | u8 flags; | 123 | u8 flags; |
125 | u32 pf_context_behaviour; | 124 | u32 pf_context_behaviour; |
diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c index 6bb62c580e2d..678558b502fc 100644 --- a/drivers/net/ethernet/mellanox/mlx4/main.c +++ b/drivers/net/ethernet/mellanox/mlx4/main.c | |||
@@ -108,7 +108,7 @@ static struct mlx4_profile default_profile = { | |||
108 | .num_cq = 1 << 16, | 108 | .num_cq = 1 << 16, |
109 | .num_mcg = 1 << 13, | 109 | .num_mcg = 1 << 13, |
110 | .num_mpt = 1 << 19, | 110 | .num_mpt = 1 << 19, |
111 | .num_mtt = 1 << 20, | 111 | .num_mtt = 1 << 20, /* It is really num mtt segements */ |
112 | }; | 112 | }; |
113 | 113 | ||
114 | static int log_num_mac = 7; | 114 | static int log_num_mac = 7; |
@@ -471,7 +471,6 @@ static int mlx4_slave_cap(struct mlx4_dev *dev) | |||
471 | return -ENOSYS; | 471 | return -ENOSYS; |
472 | } | 472 | } |
473 | 473 | ||
474 | dev->caps.function = func_cap.function; | ||
475 | dev->caps.num_ports = func_cap.num_ports; | 474 | dev->caps.num_ports = func_cap.num_ports; |
476 | dev->caps.num_qps = func_cap.qp_quota; | 475 | dev->caps.num_qps = func_cap.qp_quota; |
477 | dev->caps.num_srqs = func_cap.srq_quota; | 476 | dev->caps.num_srqs = func_cap.srq_quota; |
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4.h b/drivers/net/ethernet/mellanox/mlx4/mlx4.h index a80121a2b519..c92269f8c057 100644 --- a/drivers/net/ethernet/mellanox/mlx4/mlx4.h +++ b/drivers/net/ethernet/mellanox/mlx4/mlx4.h | |||
@@ -388,9 +388,8 @@ struct mlx4_slave_eqe { | |||
388 | }; | 388 | }; |
389 | 389 | ||
390 | struct mlx4_slave_event_eq_info { | 390 | struct mlx4_slave_event_eq_info { |
391 | u32 eqn; | 391 | int eqn; |
392 | u16 token; | 392 | u16 token; |
393 | u64 event_type; | ||
394 | }; | 393 | }; |
395 | 394 | ||
396 | struct mlx4_profile { | 395 | struct mlx4_profile { |
@@ -449,6 +448,8 @@ struct mlx4_steer_index { | |||
449 | struct list_head duplicates; | 448 | struct list_head duplicates; |
450 | }; | 449 | }; |
451 | 450 | ||
451 | #define MLX4_EVENT_TYPES_NUM 64 | ||
452 | |||
452 | struct mlx4_slave_state { | 453 | struct mlx4_slave_state { |
453 | u8 comm_toggle; | 454 | u8 comm_toggle; |
454 | u8 last_cmd; | 455 | u8 last_cmd; |
@@ -461,7 +462,8 @@ struct mlx4_slave_state { | |||
461 | struct mlx4_slave_eqe eq[MLX4_MFUNC_MAX_EQES]; | 462 | struct mlx4_slave_eqe eq[MLX4_MFUNC_MAX_EQES]; |
462 | struct list_head mcast_filters[MLX4_MAX_PORTS + 1]; | 463 | struct list_head mcast_filters[MLX4_MAX_PORTS + 1]; |
463 | struct mlx4_vlan_fltr *vlan_filter[MLX4_MAX_PORTS + 1]; | 464 | struct mlx4_vlan_fltr *vlan_filter[MLX4_MAX_PORTS + 1]; |
464 | struct mlx4_slave_event_eq_info event_eq; | 465 | /* event type to eq number lookup */ |
466 | struct mlx4_slave_event_eq_info event_eq[MLX4_EVENT_TYPES_NUM]; | ||
465 | u16 eq_pi; | 467 | u16 eq_pi; |
466 | u16 eq_ci; | 468 | u16 eq_ci; |
467 | spinlock_t lock; | 469 | spinlock_t lock; |
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h index f2a8e65f5f88..35f08840813c 100644 --- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h +++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | |||
@@ -325,11 +325,11 @@ struct mlx4_en_port_profile { | |||
325 | u8 rx_ppp; | 325 | u8 rx_ppp; |
326 | u8 tx_pause; | 326 | u8 tx_pause; |
327 | u8 tx_ppp; | 327 | u8 tx_ppp; |
328 | int rss_rings; | ||
328 | }; | 329 | }; |
329 | 330 | ||
330 | struct mlx4_en_profile { | 331 | struct mlx4_en_profile { |
331 | int rss_xor; | 332 | int rss_xor; |
332 | int tcp_rss; | ||
333 | int udp_rss; | 333 | int udp_rss; |
334 | u8 rss_mask; | 334 | u8 rss_mask; |
335 | u32 active_ports; | 335 | u32 active_ports; |
@@ -476,6 +476,7 @@ struct mlx4_en_priv { | |||
476 | struct mlx4_en_perf_stats pstats; | 476 | struct mlx4_en_perf_stats pstats; |
477 | struct mlx4_en_pkt_stats pkstats; | 477 | struct mlx4_en_pkt_stats pkstats; |
478 | struct mlx4_en_port_stats port_stats; | 478 | struct mlx4_en_port_stats port_stats; |
479 | u64 stats_bitmap; | ||
479 | char *mc_addrs; | 480 | char *mc_addrs; |
480 | int mc_addrs_cnt; | 481 | int mc_addrs_cnt; |
481 | struct mlx4_en_stat_out_mbox hw_stats; | 482 | struct mlx4_en_stat_out_mbox hw_stats; |
diff --git a/drivers/net/ethernet/mellanox/mlx4/mr.c b/drivers/net/ethernet/mellanox/mlx4/mr.c index 01df5567e16e..8deeef98280c 100644 --- a/drivers/net/ethernet/mellanox/mlx4/mr.c +++ b/drivers/net/ethernet/mellanox/mlx4/mr.c | |||
@@ -291,7 +291,7 @@ static u32 key_to_hw_index(u32 key) | |||
291 | static int mlx4_SW2HW_MPT(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *mailbox, | 291 | static int mlx4_SW2HW_MPT(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *mailbox, |
292 | int mpt_index) | 292 | int mpt_index) |
293 | { | 293 | { |
294 | return mlx4_cmd(dev, mailbox->dma | dev->caps.function , mpt_index, | 294 | return mlx4_cmd(dev, mailbox->dma, mpt_index, |
295 | 0, MLX4_CMD_SW2HW_MPT, MLX4_CMD_TIME_CLASS_B, | 295 | 0, MLX4_CMD_SW2HW_MPT, MLX4_CMD_TIME_CLASS_B, |
296 | MLX4_CMD_WRAPPED); | 296 | MLX4_CMD_WRAPPED); |
297 | } | 297 | } |
diff --git a/drivers/net/ethernet/mellanox/mlx4/pd.c b/drivers/net/ethernet/mellanox/mlx4/pd.c index 5c9a54df17ab..db4746d0dca7 100644 --- a/drivers/net/ethernet/mellanox/mlx4/pd.c +++ b/drivers/net/ethernet/mellanox/mlx4/pd.c | |||
@@ -52,8 +52,7 @@ int mlx4_pd_alloc(struct mlx4_dev *dev, u32 *pdn) | |||
52 | *pdn = mlx4_bitmap_alloc(&priv->pd_bitmap); | 52 | *pdn = mlx4_bitmap_alloc(&priv->pd_bitmap); |
53 | if (*pdn == -1) | 53 | if (*pdn == -1) |
54 | return -ENOMEM; | 54 | return -ENOMEM; |
55 | if (mlx4_is_mfunc(dev)) | 55 | |
56 | *pdn |= (dev->caps.function + 1) << NOT_MASKED_PD_BITS; | ||
57 | return 0; | 56 | return 0; |
58 | } | 57 | } |
59 | EXPORT_SYMBOL_GPL(mlx4_pd_alloc); | 58 | EXPORT_SYMBOL_GPL(mlx4_pd_alloc); |
diff --git a/drivers/net/ethernet/mellanox/mlx4/port.c b/drivers/net/ethernet/mellanox/mlx4/port.c index 88b52e547524..f44ae555bf43 100644 --- a/drivers/net/ethernet/mellanox/mlx4/port.c +++ b/drivers/net/ethernet/mellanox/mlx4/port.c | |||
@@ -44,6 +44,11 @@ | |||
44 | #define MLX4_VLAN_VALID (1u << 31) | 44 | #define MLX4_VLAN_VALID (1u << 31) |
45 | #define MLX4_VLAN_MASK 0xfff | 45 | #define MLX4_VLAN_MASK 0xfff |
46 | 46 | ||
47 | #define MLX4_STATS_TRAFFIC_COUNTERS_MASK 0xfULL | ||
48 | #define MLX4_STATS_TRAFFIC_DROPS_MASK 0xc0ULL | ||
49 | #define MLX4_STATS_ERROR_COUNTERS_MASK 0x1ffc30ULL | ||
50 | #define MLX4_STATS_PORT_COUNTERS_MASK 0x1fe00000ULL | ||
51 | |||
47 | void mlx4_init_mac_table(struct mlx4_dev *dev, struct mlx4_mac_table *table) | 52 | void mlx4_init_mac_table(struct mlx4_dev *dev, struct mlx4_mac_table *table) |
48 | { | 53 | { |
49 | int i; | 54 | int i; |
@@ -898,6 +903,24 @@ int mlx4_DUMP_ETH_STATS_wrapper(struct mlx4_dev *dev, int slave, | |||
898 | struct mlx4_cmd_mailbox *outbox, | 903 | struct mlx4_cmd_mailbox *outbox, |
899 | struct mlx4_cmd_info *cmd) | 904 | struct mlx4_cmd_info *cmd) |
900 | { | 905 | { |
906 | if (slave != dev->caps.function) | ||
907 | return 0; | ||
901 | return mlx4_common_dump_eth_stats(dev, slave, | 908 | return mlx4_common_dump_eth_stats(dev, slave, |
902 | vhcr->in_modifier, outbox); | 909 | vhcr->in_modifier, outbox); |
903 | } | 910 | } |
911 | |||
912 | void mlx4_set_stats_bitmap(struct mlx4_dev *dev, u64 *stats_bitmap) | ||
913 | { | ||
914 | if (!mlx4_is_mfunc(dev)) { | ||
915 | *stats_bitmap = 0; | ||
916 | return; | ||
917 | } | ||
918 | |||
919 | *stats_bitmap = (MLX4_STATS_TRAFFIC_COUNTERS_MASK | | ||
920 | MLX4_STATS_TRAFFIC_DROPS_MASK | | ||
921 | MLX4_STATS_PORT_COUNTERS_MASK); | ||
922 | |||
923 | if (mlx4_is_master(dev)) | ||
924 | *stats_bitmap |= MLX4_STATS_ERROR_COUNTERS_MASK; | ||
925 | } | ||
926 | EXPORT_SYMBOL(mlx4_set_stats_bitmap); | ||
diff --git a/drivers/net/ethernet/mellanox/mlx4/profile.c b/drivers/net/ethernet/mellanox/mlx4/profile.c index 66f91ca7a7c6..1129677daa62 100644 --- a/drivers/net/ethernet/mellanox/mlx4/profile.c +++ b/drivers/net/ethernet/mellanox/mlx4/profile.c | |||
@@ -110,7 +110,7 @@ u64 mlx4_make_profile(struct mlx4_dev *dev, | |||
110 | profile[MLX4_RES_EQ].num = min_t(unsigned, dev_cap->max_eqs, MAX_MSIX); | 110 | profile[MLX4_RES_EQ].num = min_t(unsigned, dev_cap->max_eqs, MAX_MSIX); |
111 | profile[MLX4_RES_DMPT].num = request->num_mpt; | 111 | profile[MLX4_RES_DMPT].num = request->num_mpt; |
112 | profile[MLX4_RES_CMPT].num = MLX4_NUM_CMPTS; | 112 | profile[MLX4_RES_CMPT].num = MLX4_NUM_CMPTS; |
113 | profile[MLX4_RES_MTT].num = request->num_mtt; | 113 | profile[MLX4_RES_MTT].num = request->num_mtt * (1 << log_mtts_per_seg); |
114 | profile[MLX4_RES_MCG].num = request->num_mcg; | 114 | profile[MLX4_RES_MCG].num = request->num_mcg; |
115 | 115 | ||
116 | for (i = 0; i < MLX4_RES_NUM; ++i) { | 116 | for (i = 0; i < MLX4_RES_NUM; ++i) { |
diff --git a/drivers/net/ethernet/mellanox/mlx4/qp.c b/drivers/net/ethernet/mellanox/mlx4/qp.c index 6b03ac8b9002..738f950a1ce5 100644 --- a/drivers/net/ethernet/mellanox/mlx4/qp.c +++ b/drivers/net/ethernet/mellanox/mlx4/qp.c | |||
@@ -162,7 +162,7 @@ static int __mlx4_qp_modify(struct mlx4_dev *dev, struct mlx4_mtt *mtt, | |||
162 | ((struct mlx4_qp_context *) (mailbox->buf + 8))->local_qpn = | 162 | ((struct mlx4_qp_context *) (mailbox->buf + 8))->local_qpn = |
163 | cpu_to_be32(qp->qpn); | 163 | cpu_to_be32(qp->qpn); |
164 | 164 | ||
165 | ret = mlx4_cmd(dev, mailbox->dma | dev->caps.function, | 165 | ret = mlx4_cmd(dev, mailbox->dma, |
166 | qp->qpn | (!!sqd_event << 31), | 166 | qp->qpn | (!!sqd_event << 31), |
167 | new_state == MLX4_QP_STATE_RST ? 2 : 0, | 167 | new_state == MLX4_QP_STATE_RST ? 2 : 0, |
168 | op[cur_state][new_state], MLX4_CMD_TIME_CLASS_C, native); | 168 | op[cur_state][new_state], MLX4_CMD_TIME_CLASS_C, native); |
diff --git a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c index ed20751a057d..dcd819bfb2f0 100644 --- a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c +++ b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c | |||
@@ -1561,11 +1561,6 @@ static int mr_get_mtt_size(struct mlx4_mpt_entry *mpt) | |||
1561 | return be32_to_cpu(mpt->mtt_sz); | 1561 | return be32_to_cpu(mpt->mtt_sz); |
1562 | } | 1562 | } |
1563 | 1563 | ||
1564 | static int mr_get_pdn(struct mlx4_mpt_entry *mpt) | ||
1565 | { | ||
1566 | return be32_to_cpu(mpt->pd_flags) & 0xffffff; | ||
1567 | } | ||
1568 | |||
1569 | static int qp_get_mtt_addr(struct mlx4_qp_context *qpc) | 1564 | static int qp_get_mtt_addr(struct mlx4_qp_context *qpc) |
1570 | { | 1565 | { |
1571 | return be32_to_cpu(qpc->mtt_base_addr_l) & 0xfffffff8; | 1566 | return be32_to_cpu(qpc->mtt_base_addr_l) & 0xfffffff8; |
@@ -1602,16 +1597,6 @@ static int qp_get_mtt_size(struct mlx4_qp_context *qpc) | |||
1602 | return total_pages; | 1597 | return total_pages; |
1603 | } | 1598 | } |
1604 | 1599 | ||
1605 | static int qp_get_pdn(struct mlx4_qp_context *qpc) | ||
1606 | { | ||
1607 | return be32_to_cpu(qpc->pd) & 0xffffff; | ||
1608 | } | ||
1609 | |||
1610 | static int pdn2slave(int pdn) | ||
1611 | { | ||
1612 | return (pdn >> NOT_MASKED_PD_BITS) - 1; | ||
1613 | } | ||
1614 | |||
1615 | static int check_mtt_range(struct mlx4_dev *dev, int slave, int start, | 1600 | static int check_mtt_range(struct mlx4_dev *dev, int slave, int start, |
1616 | int size, struct res_mtt *mtt) | 1601 | int size, struct res_mtt *mtt) |
1617 | { | 1602 | { |
@@ -1656,11 +1641,6 @@ int mlx4_SW2HW_MPT_wrapper(struct mlx4_dev *dev, int slave, | |||
1656 | mpt->mtt = mtt; | 1641 | mpt->mtt = mtt; |
1657 | } | 1642 | } |
1658 | 1643 | ||
1659 | if (pdn2slave(mr_get_pdn(inbox->buf)) != slave) { | ||
1660 | err = -EPERM; | ||
1661 | goto ex_put; | ||
1662 | } | ||
1663 | |||
1664 | err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); | 1644 | err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); |
1665 | if (err) | 1645 | if (err) |
1666 | goto ex_put; | 1646 | goto ex_put; |
@@ -1792,11 +1772,6 @@ int mlx4_RST2INIT_QP_wrapper(struct mlx4_dev *dev, int slave, | |||
1792 | if (err) | 1772 | if (err) |
1793 | goto ex_put_mtt; | 1773 | goto ex_put_mtt; |
1794 | 1774 | ||
1795 | if (pdn2slave(qp_get_pdn(qpc)) != slave) { | ||
1796 | err = -EPERM; | ||
1797 | goto ex_put_mtt; | ||
1798 | } | ||
1799 | |||
1800 | err = get_res(dev, slave, rcqn, RES_CQ, &rcq); | 1775 | err = get_res(dev, slave, rcqn, RES_CQ, &rcq); |
1801 | if (err) | 1776 | if (err) |
1802 | goto ex_put_mtt; | 1777 | goto ex_put_mtt; |
@@ -2048,10 +2023,10 @@ int mlx4_GEN_EQE(struct mlx4_dev *dev, int slave, struct mlx4_eqe *eqe) | |||
2048 | if (!priv->mfunc.master.slave_state) | 2023 | if (!priv->mfunc.master.slave_state) |
2049 | return -EINVAL; | 2024 | return -EINVAL; |
2050 | 2025 | ||
2051 | event_eq = &priv->mfunc.master.slave_state[slave].event_eq; | 2026 | event_eq = &priv->mfunc.master.slave_state[slave].event_eq[eqe->type]; |
2052 | 2027 | ||
2053 | /* Create the event only if the slave is registered */ | 2028 | /* Create the event only if the slave is registered */ |
2054 | if ((event_eq->event_type & (1 << eqe->type)) == 0) | 2029 | if (event_eq->eqn < 0) |
2055 | return 0; | 2030 | return 0; |
2056 | 2031 | ||
2057 | mutex_lock(&priv->mfunc.master.gen_eqe_mutex[slave]); | 2032 | mutex_lock(&priv->mfunc.master.gen_eqe_mutex[slave]); |
@@ -2289,11 +2264,6 @@ ex_put: | |||
2289 | return err; | 2264 | return err; |
2290 | } | 2265 | } |
2291 | 2266 | ||
2292 | static int srq_get_pdn(struct mlx4_srq_context *srqc) | ||
2293 | { | ||
2294 | return be32_to_cpu(srqc->pd) & 0xffffff; | ||
2295 | } | ||
2296 | |||
2297 | static int srq_get_mtt_size(struct mlx4_srq_context *srqc) | 2267 | static int srq_get_mtt_size(struct mlx4_srq_context *srqc) |
2298 | { | 2268 | { |
2299 | int log_srq_size = (be32_to_cpu(srqc->state_logsize_srqn) >> 24) & 0xf; | 2269 | int log_srq_size = (be32_to_cpu(srqc->state_logsize_srqn) >> 24) & 0xf; |
@@ -2333,11 +2303,6 @@ int mlx4_SW2HW_SRQ_wrapper(struct mlx4_dev *dev, int slave, | |||
2333 | if (err) | 2303 | if (err) |
2334 | goto ex_put_mtt; | 2304 | goto ex_put_mtt; |
2335 | 2305 | ||
2336 | if (pdn2slave(srq_get_pdn(srqc)) != slave) { | ||
2337 | err = -EPERM; | ||
2338 | goto ex_put_mtt; | ||
2339 | } | ||
2340 | |||
2341 | err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); | 2306 | err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); |
2342 | if (err) | 2307 | if (err) |
2343 | goto ex_put_mtt; | 2308 | goto ex_put_mtt; |
diff --git a/drivers/net/ethernet/mellanox/mlx4/srq.c b/drivers/net/ethernet/mellanox/mlx4/srq.c index 2823fffc6383..feda6c00829f 100644 --- a/drivers/net/ethernet/mellanox/mlx4/srq.c +++ b/drivers/net/ethernet/mellanox/mlx4/srq.c | |||
@@ -67,7 +67,7 @@ void mlx4_srq_event(struct mlx4_dev *dev, u32 srqn, int event_type) | |||
67 | static int mlx4_SW2HW_SRQ(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *mailbox, | 67 | static int mlx4_SW2HW_SRQ(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *mailbox, |
68 | int srq_num) | 68 | int srq_num) |
69 | { | 69 | { |
70 | return mlx4_cmd(dev, mailbox->dma | dev->caps.function, srq_num, 0, | 70 | return mlx4_cmd(dev, mailbox->dma, srq_num, 0, |
71 | MLX4_CMD_SW2HW_SRQ, MLX4_CMD_TIME_CLASS_A, | 71 | MLX4_CMD_SW2HW_SRQ, MLX4_CMD_TIME_CLASS_A, |
72 | MLX4_CMD_WRAPPED); | 72 | MLX4_CMD_WRAPPED); |
73 | } | 73 | } |
diff --git a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c index 964e9c0948bc..3ead111111e1 100644 --- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c +++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c | |||
@@ -1745,6 +1745,12 @@ int pch_gbe_up(struct pch_gbe_adapter *adapter) | |||
1745 | struct pch_gbe_rx_ring *rx_ring = adapter->rx_ring; | 1745 | struct pch_gbe_rx_ring *rx_ring = adapter->rx_ring; |
1746 | int err; | 1746 | int err; |
1747 | 1747 | ||
1748 | /* Ensure we have a valid MAC */ | ||
1749 | if (!is_valid_ether_addr(adapter->hw.mac.addr)) { | ||
1750 | pr_err("Error: Invalid MAC address\n"); | ||
1751 | return -EINVAL; | ||
1752 | } | ||
1753 | |||
1748 | /* hardware has been reset, we need to reload some things */ | 1754 | /* hardware has been reset, we need to reload some things */ |
1749 | pch_gbe_set_multi(netdev); | 1755 | pch_gbe_set_multi(netdev); |
1750 | 1756 | ||
@@ -2468,9 +2474,14 @@ static int pch_gbe_probe(struct pci_dev *pdev, | |||
2468 | 2474 | ||
2469 | memcpy(netdev->dev_addr, adapter->hw.mac.addr, netdev->addr_len); | 2475 | memcpy(netdev->dev_addr, adapter->hw.mac.addr, netdev->addr_len); |
2470 | if (!is_valid_ether_addr(netdev->dev_addr)) { | 2476 | if (!is_valid_ether_addr(netdev->dev_addr)) { |
2471 | dev_err(&pdev->dev, "Invalid MAC Address\n"); | 2477 | /* |
2472 | ret = -EIO; | 2478 | * If the MAC is invalid (or just missing), display a warning |
2473 | goto err_free_adapter; | 2479 | * but do not abort setting up the device. pch_gbe_up will |
2480 | * prevent the interface from being brought up until a valid MAC | ||
2481 | * is set. | ||
2482 | */ | ||
2483 | dev_err(&pdev->dev, "Invalid MAC address, " | ||
2484 | "interface disabled.\n"); | ||
2474 | } | 2485 | } |
2475 | setup_timer(&adapter->watchdog_timer, pch_gbe_watchdog, | 2486 | setup_timer(&adapter->watchdog_timer, pch_gbe_watchdog, |
2476 | (unsigned long)adapter); | 2487 | (unsigned long)adapter); |
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c index da4a1042523a..73195329aa46 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c | |||
@@ -154,7 +154,7 @@ int stmmac_mdio_register(struct net_device *ndev) | |||
154 | else | 154 | else |
155 | irqlist = priv->mii_irq; | 155 | irqlist = priv->mii_irq; |
156 | 156 | ||
157 | new_bus->name = "STMMAC MII Bus"; | 157 | new_bus->name = "stmmac"; |
158 | new_bus->read = &stmmac_mdio_read; | 158 | new_bus->read = &stmmac_mdio_read; |
159 | new_bus->write = &stmmac_mdio_write; | 159 | new_bus->write = &stmmac_mdio_write; |
160 | new_bus->reset = &stmmac_mdio_reset; | 160 | new_bus->reset = &stmmac_mdio_reset; |
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c index 54a819a36487..c796de9eed72 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c | |||
@@ -170,9 +170,9 @@ static int stmmac_pci_resume(struct pci_dev *pdev) | |||
170 | #define STMMAC_DEVICE_ID 0x1108 | 170 | #define STMMAC_DEVICE_ID 0x1108 |
171 | 171 | ||
172 | static DEFINE_PCI_DEVICE_TABLE(stmmac_id_table) = { | 172 | static DEFINE_PCI_DEVICE_TABLE(stmmac_id_table) = { |
173 | { | 173 | {PCI_DEVICE(STMMAC_VENDOR_ID, STMMAC_DEVICE_ID)}, |
174 | PCI_DEVICE(STMMAC_VENDOR_ID, STMMAC_DEVICE_ID)}, { | 174 | {PCI_DEVICE(PCI_VENDOR_ID_STMICRO, PCI_DEVICE_ID_STMICRO_MAC)}, |
175 | } | 175 | {} |
176 | }; | 176 | }; |
177 | 177 | ||
178 | MODULE_DEVICE_TABLE(pci, stmmac_id_table); | 178 | MODULE_DEVICE_TABLE(pci, stmmac_id_table); |
diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c index 462d05f05e84..1a1ca6cfc74a 100644 --- a/drivers/net/hyperv/netvsc_drv.c +++ b/drivers/net/hyperv/netvsc_drv.c | |||
@@ -68,11 +68,11 @@ static void do_set_multicast(struct work_struct *w) | |||
68 | 68 | ||
69 | nvdev = hv_get_drvdata(ndevctx->device_ctx); | 69 | nvdev = hv_get_drvdata(ndevctx->device_ctx); |
70 | if (nvdev == NULL) | 70 | if (nvdev == NULL) |
71 | return; | 71 | goto out; |
72 | 72 | ||
73 | rdev = nvdev->extension; | 73 | rdev = nvdev->extension; |
74 | if (rdev == NULL) | 74 | if (rdev == NULL) |
75 | return; | 75 | goto out; |
76 | 76 | ||
77 | if (net->flags & IFF_PROMISC) | 77 | if (net->flags & IFF_PROMISC) |
78 | rndis_filter_set_packet_filter(rdev, | 78 | rndis_filter_set_packet_filter(rdev, |
@@ -83,6 +83,7 @@ static void do_set_multicast(struct work_struct *w) | |||
83 | NDIS_PACKET_TYPE_ALL_MULTICAST | | 83 | NDIS_PACKET_TYPE_ALL_MULTICAST | |
84 | NDIS_PACKET_TYPE_DIRECTED); | 84 | NDIS_PACKET_TYPE_DIRECTED); |
85 | 85 | ||
86 | out: | ||
86 | kfree(w); | 87 | kfree(w); |
87 | } | 88 | } |
88 | 89 | ||
diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c index f2f820c4b40a..9ea99217f116 100644 --- a/drivers/net/macvlan.c +++ b/drivers/net/macvlan.c | |||
@@ -173,6 +173,7 @@ static rx_handler_result_t macvlan_handle_frame(struct sk_buff **pskb) | |||
173 | skb = ip_check_defrag(skb, IP_DEFRAG_MACVLAN); | 173 | skb = ip_check_defrag(skb, IP_DEFRAG_MACVLAN); |
174 | if (!skb) | 174 | if (!skb) |
175 | return RX_HANDLER_CONSUMED; | 175 | return RX_HANDLER_CONSUMED; |
176 | eth = eth_hdr(skb); | ||
176 | src = macvlan_hash_lookup(port, eth->h_source); | 177 | src = macvlan_hash_lookup(port, eth->h_source); |
177 | if (!src) | 178 | if (!src) |
178 | /* frame comes from an external address */ | 179 | /* frame comes from an external address */ |
diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c index 88cc5db9affd..8985cc62cf41 100644 --- a/drivers/net/phy/mdio_bus.c +++ b/drivers/net/phy/mdio_bus.c | |||
@@ -38,12 +38,11 @@ | |||
38 | 38 | ||
39 | /** | 39 | /** |
40 | * mdiobus_alloc_size - allocate a mii_bus structure | 40 | * mdiobus_alloc_size - allocate a mii_bus structure |
41 | * @size: extra amount of memory to allocate for private storage. | ||
42 | * If non-zero, then bus->priv is points to that memory. | ||
41 | * | 43 | * |
42 | * Description: called by a bus driver to allocate an mii_bus | 44 | * Description: called by a bus driver to allocate an mii_bus |
43 | * structure to fill in. | 45 | * structure to fill in. |
44 | * | ||
45 | * 'size' is an an extra amount of memory to allocate for private storage. | ||
46 | * If non-zero, then bus->priv is points to that memory. | ||
47 | */ | 46 | */ |
48 | struct mii_bus *mdiobus_alloc_size(size_t size) | 47 | struct mii_bus *mdiobus_alloc_size(size_t size) |
49 | { | 48 | { |
diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c index ed2a862b835d..6b678f38e5ce 100644 --- a/drivers/net/team/team.c +++ b/drivers/net/team/team.c | |||
@@ -92,9 +92,9 @@ struct team_option *__team_find_option(struct team *team, const char *opt_name) | |||
92 | return NULL; | 92 | return NULL; |
93 | } | 93 | } |
94 | 94 | ||
95 | int team_options_register(struct team *team, | 95 | int __team_options_register(struct team *team, |
96 | const struct team_option *option, | 96 | const struct team_option *option, |
97 | size_t option_count) | 97 | size_t option_count) |
98 | { | 98 | { |
99 | int i; | 99 | int i; |
100 | struct team_option **dst_opts; | 100 | struct team_option **dst_opts; |
@@ -116,8 +116,11 @@ int team_options_register(struct team *team, | |||
116 | } | 116 | } |
117 | } | 117 | } |
118 | 118 | ||
119 | for (i = 0; i < option_count; i++) | 119 | for (i = 0; i < option_count; i++) { |
120 | dst_opts[i]->changed = true; | ||
121 | dst_opts[i]->removed = false; | ||
120 | list_add_tail(&dst_opts[i]->list, &team->option_list); | 122 | list_add_tail(&dst_opts[i]->list, &team->option_list); |
123 | } | ||
121 | 124 | ||
122 | kfree(dst_opts); | 125 | kfree(dst_opts); |
123 | return 0; | 126 | return 0; |
@@ -130,10 +133,22 @@ rollback: | |||
130 | return err; | 133 | return err; |
131 | } | 134 | } |
132 | 135 | ||
133 | EXPORT_SYMBOL(team_options_register); | 136 | static void __team_options_mark_removed(struct team *team, |
137 | const struct team_option *option, | ||
138 | size_t option_count) | ||
139 | { | ||
140 | int i; | ||
141 | |||
142 | for (i = 0; i < option_count; i++, option++) { | ||
143 | struct team_option *del_opt; | ||
134 | 144 | ||
135 | static void __team_options_change_check(struct team *team, | 145 | del_opt = __team_find_option(team, option->name); |
136 | struct team_option *changed_option); | 146 | if (del_opt) { |
147 | del_opt->changed = true; | ||
148 | del_opt->removed = true; | ||
149 | } | ||
150 | } | ||
151 | } | ||
137 | 152 | ||
138 | static void __team_options_unregister(struct team *team, | 153 | static void __team_options_unregister(struct team *team, |
139 | const struct team_option *option, | 154 | const struct team_option *option, |
@@ -152,12 +167,29 @@ static void __team_options_unregister(struct team *team, | |||
152 | } | 167 | } |
153 | } | 168 | } |
154 | 169 | ||
170 | static void __team_options_change_check(struct team *team); | ||
171 | |||
172 | int team_options_register(struct team *team, | ||
173 | const struct team_option *option, | ||
174 | size_t option_count) | ||
175 | { | ||
176 | int err; | ||
177 | |||
178 | err = __team_options_register(team, option, option_count); | ||
179 | if (err) | ||
180 | return err; | ||
181 | __team_options_change_check(team); | ||
182 | return 0; | ||
183 | } | ||
184 | EXPORT_SYMBOL(team_options_register); | ||
185 | |||
155 | void team_options_unregister(struct team *team, | 186 | void team_options_unregister(struct team *team, |
156 | const struct team_option *option, | 187 | const struct team_option *option, |
157 | size_t option_count) | 188 | size_t option_count) |
158 | { | 189 | { |
190 | __team_options_mark_removed(team, option, option_count); | ||
191 | __team_options_change_check(team); | ||
159 | __team_options_unregister(team, option, option_count); | 192 | __team_options_unregister(team, option, option_count); |
160 | __team_options_change_check(team, NULL); | ||
161 | } | 193 | } |
162 | EXPORT_SYMBOL(team_options_unregister); | 194 | EXPORT_SYMBOL(team_options_unregister); |
163 | 195 | ||
@@ -176,7 +208,8 @@ static int team_option_set(struct team *team, struct team_option *option, | |||
176 | if (err) | 208 | if (err) |
177 | return err; | 209 | return err; |
178 | 210 | ||
179 | __team_options_change_check(team, option); | 211 | option->changed = true; |
212 | __team_options_change_check(team); | ||
180 | return err; | 213 | return err; |
181 | } | 214 | } |
182 | 215 | ||
@@ -653,6 +686,7 @@ static int team_port_del(struct team *team, struct net_device *port_dev) | |||
653 | return -ENOENT; | 686 | return -ENOENT; |
654 | } | 687 | } |
655 | 688 | ||
689 | port->removed = true; | ||
656 | __team_port_change_check(port, false); | 690 | __team_port_change_check(port, false); |
657 | team_port_list_del_port(team, port); | 691 | team_port_list_del_port(team, port); |
658 | team_adjust_ops(team); | 692 | team_adjust_ops(team); |
@@ -1200,10 +1234,9 @@ err_fill: | |||
1200 | return err; | 1234 | return err; |
1201 | } | 1235 | } |
1202 | 1236 | ||
1203 | static int team_nl_fill_options_get_changed(struct sk_buff *skb, | 1237 | static int team_nl_fill_options_get(struct sk_buff *skb, |
1204 | u32 pid, u32 seq, int flags, | 1238 | u32 pid, u32 seq, int flags, |
1205 | struct team *team, | 1239 | struct team *team, bool fillall) |
1206 | struct team_option *changed_option) | ||
1207 | { | 1240 | { |
1208 | struct nlattr *option_list; | 1241 | struct nlattr *option_list; |
1209 | void *hdr; | 1242 | void *hdr; |
@@ -1223,12 +1256,19 @@ static int team_nl_fill_options_get_changed(struct sk_buff *skb, | |||
1223 | struct nlattr *option_item; | 1256 | struct nlattr *option_item; |
1224 | long arg; | 1257 | long arg; |
1225 | 1258 | ||
1259 | /* Include only changed options if fill all mode is not on */ | ||
1260 | if (!fillall && !option->changed) | ||
1261 | continue; | ||
1226 | option_item = nla_nest_start(skb, TEAM_ATTR_ITEM_OPTION); | 1262 | option_item = nla_nest_start(skb, TEAM_ATTR_ITEM_OPTION); |
1227 | if (!option_item) | 1263 | if (!option_item) |
1228 | goto nla_put_failure; | 1264 | goto nla_put_failure; |
1229 | NLA_PUT_STRING(skb, TEAM_ATTR_OPTION_NAME, option->name); | 1265 | NLA_PUT_STRING(skb, TEAM_ATTR_OPTION_NAME, option->name); |
1230 | if (option == changed_option) | 1266 | if (option->changed) { |
1231 | NLA_PUT_FLAG(skb, TEAM_ATTR_OPTION_CHANGED); | 1267 | NLA_PUT_FLAG(skb, TEAM_ATTR_OPTION_CHANGED); |
1268 | option->changed = false; | ||
1269 | } | ||
1270 | if (option->removed) | ||
1271 | NLA_PUT_FLAG(skb, TEAM_ATTR_OPTION_REMOVED); | ||
1232 | switch (option->type) { | 1272 | switch (option->type) { |
1233 | case TEAM_OPTION_TYPE_U32: | 1273 | case TEAM_OPTION_TYPE_U32: |
1234 | NLA_PUT_U8(skb, TEAM_ATTR_OPTION_TYPE, NLA_U32); | 1274 | NLA_PUT_U8(skb, TEAM_ATTR_OPTION_TYPE, NLA_U32); |
@@ -1255,13 +1295,13 @@ nla_put_failure: | |||
1255 | return -EMSGSIZE; | 1295 | return -EMSGSIZE; |
1256 | } | 1296 | } |
1257 | 1297 | ||
1258 | static int team_nl_fill_options_get(struct sk_buff *skb, | 1298 | static int team_nl_fill_options_get_all(struct sk_buff *skb, |
1259 | struct genl_info *info, int flags, | 1299 | struct genl_info *info, int flags, |
1260 | struct team *team) | 1300 | struct team *team) |
1261 | { | 1301 | { |
1262 | return team_nl_fill_options_get_changed(skb, info->snd_pid, | 1302 | return team_nl_fill_options_get(skb, info->snd_pid, |
1263 | info->snd_seq, NLM_F_ACK, | 1303 | info->snd_seq, NLM_F_ACK, |
1264 | team, NULL); | 1304 | team, true); |
1265 | } | 1305 | } |
1266 | 1306 | ||
1267 | static int team_nl_cmd_options_get(struct sk_buff *skb, struct genl_info *info) | 1307 | static int team_nl_cmd_options_get(struct sk_buff *skb, struct genl_info *info) |
@@ -1273,7 +1313,7 @@ static int team_nl_cmd_options_get(struct sk_buff *skb, struct genl_info *info) | |||
1273 | if (!team) | 1313 | if (!team) |
1274 | return -EINVAL; | 1314 | return -EINVAL; |
1275 | 1315 | ||
1276 | err = team_nl_send_generic(info, team, team_nl_fill_options_get); | 1316 | err = team_nl_send_generic(info, team, team_nl_fill_options_get_all); |
1277 | 1317 | ||
1278 | team_nl_team_put(team); | 1318 | team_nl_team_put(team); |
1279 | 1319 | ||
@@ -1365,10 +1405,10 @@ team_put: | |||
1365 | return err; | 1405 | return err; |
1366 | } | 1406 | } |
1367 | 1407 | ||
1368 | static int team_nl_fill_port_list_get_changed(struct sk_buff *skb, | 1408 | static int team_nl_fill_port_list_get(struct sk_buff *skb, |
1369 | u32 pid, u32 seq, int flags, | 1409 | u32 pid, u32 seq, int flags, |
1370 | struct team *team, | 1410 | struct team *team, |
1371 | struct team_port *changed_port) | 1411 | bool fillall) |
1372 | { | 1412 | { |
1373 | struct nlattr *port_list; | 1413 | struct nlattr *port_list; |
1374 | void *hdr; | 1414 | void *hdr; |
@@ -1387,12 +1427,19 @@ static int team_nl_fill_port_list_get_changed(struct sk_buff *skb, | |||
1387 | list_for_each_entry(port, &team->port_list, list) { | 1427 | list_for_each_entry(port, &team->port_list, list) { |
1388 | struct nlattr *port_item; | 1428 | struct nlattr *port_item; |
1389 | 1429 | ||
1430 | /* Include only changed ports if fill all mode is not on */ | ||
1431 | if (!fillall && !port->changed) | ||
1432 | continue; | ||
1390 | port_item = nla_nest_start(skb, TEAM_ATTR_ITEM_PORT); | 1433 | port_item = nla_nest_start(skb, TEAM_ATTR_ITEM_PORT); |
1391 | if (!port_item) | 1434 | if (!port_item) |
1392 | goto nla_put_failure; | 1435 | goto nla_put_failure; |
1393 | NLA_PUT_U32(skb, TEAM_ATTR_PORT_IFINDEX, port->dev->ifindex); | 1436 | NLA_PUT_U32(skb, TEAM_ATTR_PORT_IFINDEX, port->dev->ifindex); |
1394 | if (port == changed_port) | 1437 | if (port->changed) { |
1395 | NLA_PUT_FLAG(skb, TEAM_ATTR_PORT_CHANGED); | 1438 | NLA_PUT_FLAG(skb, TEAM_ATTR_PORT_CHANGED); |
1439 | port->changed = false; | ||
1440 | } | ||
1441 | if (port->removed) | ||
1442 | NLA_PUT_FLAG(skb, TEAM_ATTR_PORT_REMOVED); | ||
1396 | if (port->linkup) | 1443 | if (port->linkup) |
1397 | NLA_PUT_FLAG(skb, TEAM_ATTR_PORT_LINKUP); | 1444 | NLA_PUT_FLAG(skb, TEAM_ATTR_PORT_LINKUP); |
1398 | NLA_PUT_U32(skb, TEAM_ATTR_PORT_SPEED, port->speed); | 1445 | NLA_PUT_U32(skb, TEAM_ATTR_PORT_SPEED, port->speed); |
@@ -1408,13 +1455,13 @@ nla_put_failure: | |||
1408 | return -EMSGSIZE; | 1455 | return -EMSGSIZE; |
1409 | } | 1456 | } |
1410 | 1457 | ||
1411 | static int team_nl_fill_port_list_get(struct sk_buff *skb, | 1458 | static int team_nl_fill_port_list_get_all(struct sk_buff *skb, |
1412 | struct genl_info *info, int flags, | 1459 | struct genl_info *info, int flags, |
1413 | struct team *team) | 1460 | struct team *team) |
1414 | { | 1461 | { |
1415 | return team_nl_fill_port_list_get_changed(skb, info->snd_pid, | 1462 | return team_nl_fill_port_list_get(skb, info->snd_pid, |
1416 | info->snd_seq, NLM_F_ACK, | 1463 | info->snd_seq, NLM_F_ACK, |
1417 | team, NULL); | 1464 | team, true); |
1418 | } | 1465 | } |
1419 | 1466 | ||
1420 | static int team_nl_cmd_port_list_get(struct sk_buff *skb, | 1467 | static int team_nl_cmd_port_list_get(struct sk_buff *skb, |
@@ -1427,7 +1474,7 @@ static int team_nl_cmd_port_list_get(struct sk_buff *skb, | |||
1427 | if (!team) | 1474 | if (!team) |
1428 | return -EINVAL; | 1475 | return -EINVAL; |
1429 | 1476 | ||
1430 | err = team_nl_send_generic(info, team, team_nl_fill_port_list_get); | 1477 | err = team_nl_send_generic(info, team, team_nl_fill_port_list_get_all); |
1431 | 1478 | ||
1432 | team_nl_team_put(team); | 1479 | team_nl_team_put(team); |
1433 | 1480 | ||
@@ -1464,8 +1511,7 @@ static struct genl_multicast_group team_change_event_mcgrp = { | |||
1464 | .name = TEAM_GENL_CHANGE_EVENT_MC_GRP_NAME, | 1511 | .name = TEAM_GENL_CHANGE_EVENT_MC_GRP_NAME, |
1465 | }; | 1512 | }; |
1466 | 1513 | ||
1467 | static int team_nl_send_event_options_get(struct team *team, | 1514 | static int team_nl_send_event_options_get(struct team *team) |
1468 | struct team_option *changed_option) | ||
1469 | { | 1515 | { |
1470 | struct sk_buff *skb; | 1516 | struct sk_buff *skb; |
1471 | int err; | 1517 | int err; |
@@ -1475,8 +1521,7 @@ static int team_nl_send_event_options_get(struct team *team, | |||
1475 | if (!skb) | 1521 | if (!skb) |
1476 | return -ENOMEM; | 1522 | return -ENOMEM; |
1477 | 1523 | ||
1478 | err = team_nl_fill_options_get_changed(skb, 0, 0, 0, team, | 1524 | err = team_nl_fill_options_get(skb, 0, 0, 0, team, false); |
1479 | changed_option); | ||
1480 | if (err < 0) | 1525 | if (err < 0) |
1481 | goto err_fill; | 1526 | goto err_fill; |
1482 | 1527 | ||
@@ -1489,18 +1534,17 @@ err_fill: | |||
1489 | return err; | 1534 | return err; |
1490 | } | 1535 | } |
1491 | 1536 | ||
1492 | static int team_nl_send_event_port_list_get(struct team_port *port) | 1537 | static int team_nl_send_event_port_list_get(struct team *team) |
1493 | { | 1538 | { |
1494 | struct sk_buff *skb; | 1539 | struct sk_buff *skb; |
1495 | int err; | 1540 | int err; |
1496 | struct net *net = dev_net(port->team->dev); | 1541 | struct net *net = dev_net(team->dev); |
1497 | 1542 | ||
1498 | skb = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL); | 1543 | skb = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL); |
1499 | if (!skb) | 1544 | if (!skb) |
1500 | return -ENOMEM; | 1545 | return -ENOMEM; |
1501 | 1546 | ||
1502 | err = team_nl_fill_port_list_get_changed(skb, 0, 0, 0, | 1547 | err = team_nl_fill_port_list_get(skb, 0, 0, 0, team, false); |
1503 | port->team, port); | ||
1504 | if (err < 0) | 1548 | if (err < 0) |
1505 | goto err_fill; | 1549 | goto err_fill; |
1506 | 1550 | ||
@@ -1544,12 +1588,11 @@ static void team_nl_fini(void) | |||
1544 | * Change checkers | 1588 | * Change checkers |
1545 | ******************/ | 1589 | ******************/ |
1546 | 1590 | ||
1547 | static void __team_options_change_check(struct team *team, | 1591 | static void __team_options_change_check(struct team *team) |
1548 | struct team_option *changed_option) | ||
1549 | { | 1592 | { |
1550 | int err; | 1593 | int err; |
1551 | 1594 | ||
1552 | err = team_nl_send_event_options_get(team, changed_option); | 1595 | err = team_nl_send_event_options_get(team); |
1553 | if (err) | 1596 | if (err) |
1554 | netdev_warn(team->dev, "Failed to send options change via netlink\n"); | 1597 | netdev_warn(team->dev, "Failed to send options change via netlink\n"); |
1555 | } | 1598 | } |
@@ -1559,9 +1602,10 @@ static void __team_port_change_check(struct team_port *port, bool linkup) | |||
1559 | { | 1602 | { |
1560 | int err; | 1603 | int err; |
1561 | 1604 | ||
1562 | if (port->linkup == linkup) | 1605 | if (!port->removed && port->linkup == linkup) |
1563 | return; | 1606 | return; |
1564 | 1607 | ||
1608 | port->changed = true; | ||
1565 | port->linkup = linkup; | 1609 | port->linkup = linkup; |
1566 | if (linkup) { | 1610 | if (linkup) { |
1567 | struct ethtool_cmd ecmd; | 1611 | struct ethtool_cmd ecmd; |
@@ -1577,7 +1621,7 @@ static void __team_port_change_check(struct team_port *port, bool linkup) | |||
1577 | port->duplex = 0; | 1621 | port->duplex = 0; |
1578 | 1622 | ||
1579 | send_event: | 1623 | send_event: |
1580 | err = team_nl_send_event_port_list_get(port); | 1624 | err = team_nl_send_event_port_list_get(port->team); |
1581 | if (err) | 1625 | if (err) |
1582 | netdev_warn(port->team->dev, "Failed to send port change of device %s via netlink\n", | 1626 | netdev_warn(port->team->dev, "Failed to send port change of device %s via netlink\n", |
1583 | port->dev->name); | 1627 | port->dev->name); |
diff --git a/drivers/net/wireless/b43/Kconfig b/drivers/net/wireless/b43/Kconfig index b97a40ed5fff..3876c7ea54f4 100644 --- a/drivers/net/wireless/b43/Kconfig +++ b/drivers/net/wireless/b43/Kconfig | |||
@@ -31,6 +31,12 @@ config B43_BCMA | |||
31 | depends on B43 && BCMA | 31 | depends on B43 && BCMA |
32 | default y | 32 | default y |
33 | 33 | ||
34 | config B43_BCMA_EXTRA | ||
35 | bool "Hardware support that overlaps with the brcmsmac driver" | ||
36 | depends on B43_BCMA | ||
37 | default n if BRCMSMAC || BRCMSMAC_MODULE | ||
38 | default y | ||
39 | |||
34 | config B43_SSB | 40 | config B43_SSB |
35 | bool | 41 | bool |
36 | depends on B43 && SSB | 42 | depends on B43 && SSB |
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c index b91f28ef1032..23ffb1b9a86f 100644 --- a/drivers/net/wireless/b43/main.c +++ b/drivers/net/wireless/b43/main.c | |||
@@ -116,8 +116,10 @@ MODULE_PARM_DESC(pio, "Use PIO accesses by default: 0=DMA, 1=PIO"); | |||
116 | #ifdef CONFIG_B43_BCMA | 116 | #ifdef CONFIG_B43_BCMA |
117 | static const struct bcma_device_id b43_bcma_tbl[] = { | 117 | static const struct bcma_device_id b43_bcma_tbl[] = { |
118 | BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x11, BCMA_ANY_CLASS), | 118 | BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x11, BCMA_ANY_CLASS), |
119 | #ifdef CONFIG_B43_BCMA_EXTRA | ||
119 | BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x17, BCMA_ANY_CLASS), | 120 | BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x17, BCMA_ANY_CLASS), |
120 | BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x18, BCMA_ANY_CLASS), | 121 | BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x18, BCMA_ANY_CLASS), |
122 | #endif | ||
121 | BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x1D, BCMA_ANY_CLASS), | 123 | BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x1D, BCMA_ANY_CLASS), |
122 | BCMA_CORETABLE_END | 124 | BCMA_CORETABLE_END |
123 | }; | 125 | }; |
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/main.c b/drivers/net/wireless/brcm80211/brcmsmac/main.c index f7ed34034f88..f6affc6fd12a 100644 --- a/drivers/net/wireless/brcm80211/brcmsmac/main.c +++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c | |||
@@ -7981,13 +7981,21 @@ int brcms_c_get_curband(struct brcms_c_info *wlc) | |||
7981 | 7981 | ||
7982 | void brcms_c_wait_for_tx_completion(struct brcms_c_info *wlc, bool drop) | 7982 | void brcms_c_wait_for_tx_completion(struct brcms_c_info *wlc, bool drop) |
7983 | { | 7983 | { |
7984 | int timeout = 20; | ||
7985 | |||
7984 | /* flush packet queue when requested */ | 7986 | /* flush packet queue when requested */ |
7985 | if (drop) | 7987 | if (drop) |
7986 | brcmu_pktq_flush(&wlc->pkt_queue->q, false, NULL, NULL); | 7988 | brcmu_pktq_flush(&wlc->pkt_queue->q, false, NULL, NULL); |
7987 | 7989 | ||
7988 | /* wait for queue and DMA fifos to run dry */ | 7990 | /* wait for queue and DMA fifos to run dry */ |
7989 | while (!pktq_empty(&wlc->pkt_queue->q) || brcms_txpktpendtot(wlc) > 0) | 7991 | while (!pktq_empty(&wlc->pkt_queue->q) || brcms_txpktpendtot(wlc) > 0) { |
7990 | brcms_msleep(wlc->wl, 1); | 7992 | brcms_msleep(wlc->wl, 1); |
7993 | |||
7994 | if (--timeout == 0) | ||
7995 | break; | ||
7996 | } | ||
7997 | |||
7998 | WARN_ON_ONCE(timeout == 0); | ||
7991 | } | 7999 | } |
7992 | 8000 | ||
7993 | void brcms_c_set_beacon_listen_interval(struct brcms_c_info *wlc, u8 interval) | 8001 | void brcms_c_set_beacon_listen_interval(struct brcms_c_info *wlc, u8 interval) |
diff --git a/drivers/net/wireless/iwlwifi/iwl-trans-pcie-rx.c b/drivers/net/wireless/iwlwifi/iwl-trans-pcie-rx.c index 752493f00406..65d1f05007be 100644 --- a/drivers/net/wireless/iwlwifi/iwl-trans-pcie-rx.c +++ b/drivers/net/wireless/iwlwifi/iwl-trans-pcie-rx.c | |||
@@ -972,11 +972,11 @@ void iwl_irq_tasklet(struct iwl_trans *trans) | |||
972 | } | 972 | } |
973 | #endif | 973 | #endif |
974 | 974 | ||
975 | spin_unlock_irqrestore(&trans->shrd->lock, flags); | ||
976 | |||
977 | /* saved interrupt in inta variable now we can reset trans_pcie->inta */ | 975 | /* saved interrupt in inta variable now we can reset trans_pcie->inta */ |
978 | trans_pcie->inta = 0; | 976 | trans_pcie->inta = 0; |
979 | 977 | ||
978 | spin_unlock_irqrestore(&trans->shrd->lock, flags); | ||
979 | |||
980 | /* Now service all interrupt bits discovered above. */ | 980 | /* Now service all interrupt bits discovered above. */ |
981 | if (inta & CSR_INT_BIT_HW_ERR) { | 981 | if (inta & CSR_INT_BIT_HW_ERR) { |
982 | IWL_ERR(trans, "Hardware error detected. Restarting.\n"); | 982 | IWL_ERR(trans, "Hardware error detected. Restarting.\n"); |
diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c index fa679057630f..698b905058dd 100644 --- a/drivers/net/xen-netfront.c +++ b/drivers/net/xen-netfront.c | |||
@@ -68,7 +68,7 @@ struct netfront_cb { | |||
68 | 68 | ||
69 | #define NET_TX_RING_SIZE __CONST_RING_SIZE(xen_netif_tx, PAGE_SIZE) | 69 | #define NET_TX_RING_SIZE __CONST_RING_SIZE(xen_netif_tx, PAGE_SIZE) |
70 | #define NET_RX_RING_SIZE __CONST_RING_SIZE(xen_netif_rx, PAGE_SIZE) | 70 | #define NET_RX_RING_SIZE __CONST_RING_SIZE(xen_netif_rx, PAGE_SIZE) |
71 | #define TX_MAX_TARGET min_t(int, NET_RX_RING_SIZE, 256) | 71 | #define TX_MAX_TARGET min_t(int, NET_TX_RING_SIZE, 256) |
72 | 72 | ||
73 | struct netfront_stats { | 73 | struct netfront_stats { |
74 | u64 rx_packets; | 74 | u64 rx_packets; |
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 97fff785e97e..af295bb21d62 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
@@ -2802,7 +2802,7 @@ pci_intx(struct pci_dev *pdev, int enable) | |||
2802 | 2802 | ||
2803 | /** | 2803 | /** |
2804 | * pci_intx_mask_supported - probe for INTx masking support | 2804 | * pci_intx_mask_supported - probe for INTx masking support |
2805 | * @pdev: the PCI device to operate on | 2805 | * @dev: the PCI device to operate on |
2806 | * | 2806 | * |
2807 | * Check if the device dev support INTx masking via the config space | 2807 | * Check if the device dev support INTx masking via the config space |
2808 | * command word. | 2808 | * command word. |
@@ -2884,7 +2884,7 @@ done: | |||
2884 | 2884 | ||
2885 | /** | 2885 | /** |
2886 | * pci_check_and_mask_intx - mask INTx on pending interrupt | 2886 | * pci_check_and_mask_intx - mask INTx on pending interrupt |
2887 | * @pdev: the PCI device to operate on | 2887 | * @dev: the PCI device to operate on |
2888 | * | 2888 | * |
2889 | * Check if the device dev has its INTx line asserted, mask it and | 2889 | * Check if the device dev has its INTx line asserted, mask it and |
2890 | * return true in that case. False is returned if not interrupt was | 2890 | * return true in that case. False is returned if not interrupt was |
@@ -2898,7 +2898,7 @@ EXPORT_SYMBOL_GPL(pci_check_and_mask_intx); | |||
2898 | 2898 | ||
2899 | /** | 2899 | /** |
2900 | * pci_check_and_mask_intx - unmask INTx of no interrupt is pending | 2900 | * pci_check_and_mask_intx - unmask INTx of no interrupt is pending |
2901 | * @pdev: the PCI device to operate on | 2901 | * @dev: the PCI device to operate on |
2902 | * | 2902 | * |
2903 | * Check if the device dev has its INTx line asserted, unmask it if not | 2903 | * Check if the device dev has its INTx line asserted, unmask it if not |
2904 | * and return true. False is returned and the mask remains active if | 2904 | * and return true. False is returned and the mask remains active if |
diff --git a/drivers/pcmcia/sa1111_generic.c b/drivers/pcmcia/sa1111_generic.c index 59866905ea37..27f2fe3b7fb4 100644 --- a/drivers/pcmcia/sa1111_generic.c +++ b/drivers/pcmcia/sa1111_generic.c | |||
@@ -205,7 +205,8 @@ static int __devexit pcmcia_remove(struct sa1111_dev *dev) | |||
205 | 205 | ||
206 | dev_set_drvdata(&dev->dev, NULL); | 206 | dev_set_drvdata(&dev->dev, NULL); |
207 | 207 | ||
208 | for (; next = s->next, s; s = next) { | 208 | for (; s; s = next) { |
209 | next = s->next; | ||
209 | soc_pcmcia_remove_one(&s->soc); | 210 | soc_pcmcia_remove_one(&s->soc); |
210 | kfree(s); | 211 | kfree(s); |
211 | } | 212 | } |
diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c index 569bdb3ef104..8fe15cf15ac8 100644 --- a/drivers/pinctrl/core.c +++ b/drivers/pinctrl/core.c | |||
@@ -510,10 +510,12 @@ static struct dentry *debugfs_root; | |||
510 | 510 | ||
511 | static void pinctrl_init_device_debugfs(struct pinctrl_dev *pctldev) | 511 | static void pinctrl_init_device_debugfs(struct pinctrl_dev *pctldev) |
512 | { | 512 | { |
513 | static struct dentry *device_root; | 513 | struct dentry *device_root; |
514 | 514 | ||
515 | device_root = debugfs_create_dir(dev_name(pctldev->dev), | 515 | device_root = debugfs_create_dir(dev_name(pctldev->dev), |
516 | debugfs_root); | 516 | debugfs_root); |
517 | pctldev->device_root = device_root; | ||
518 | |||
517 | if (IS_ERR(device_root) || !device_root) { | 519 | if (IS_ERR(device_root) || !device_root) { |
518 | pr_warn("failed to create debugfs directory for %s\n", | 520 | pr_warn("failed to create debugfs directory for %s\n", |
519 | dev_name(pctldev->dev)); | 521 | dev_name(pctldev->dev)); |
@@ -529,6 +531,11 @@ static void pinctrl_init_device_debugfs(struct pinctrl_dev *pctldev) | |||
529 | pinconf_init_device_debugfs(device_root, pctldev); | 531 | pinconf_init_device_debugfs(device_root, pctldev); |
530 | } | 532 | } |
531 | 533 | ||
534 | static void pinctrl_remove_device_debugfs(struct pinctrl_dev *pctldev) | ||
535 | { | ||
536 | debugfs_remove_recursive(pctldev->device_root); | ||
537 | } | ||
538 | |||
532 | static void pinctrl_init_debugfs(void) | 539 | static void pinctrl_init_debugfs(void) |
533 | { | 540 | { |
534 | debugfs_root = debugfs_create_dir("pinctrl", NULL); | 541 | debugfs_root = debugfs_create_dir("pinctrl", NULL); |
@@ -553,6 +560,10 @@ static void pinctrl_init_debugfs(void) | |||
553 | { | 560 | { |
554 | } | 561 | } |
555 | 562 | ||
563 | static void pinctrl_remove_device_debugfs(struct pinctrl_dev *pctldev) | ||
564 | { | ||
565 | } | ||
566 | |||
556 | #endif | 567 | #endif |
557 | 568 | ||
558 | /** | 569 | /** |
@@ -572,40 +583,40 @@ struct pinctrl_dev *pinctrl_register(struct pinctrl_desc *pctldesc, | |||
572 | if (pctldesc->name == NULL) | 583 | if (pctldesc->name == NULL) |
573 | return NULL; | 584 | return NULL; |
574 | 585 | ||
586 | pctldev = kzalloc(sizeof(struct pinctrl_dev), GFP_KERNEL); | ||
587 | if (pctldev == NULL) | ||
588 | return NULL; | ||
589 | |||
590 | /* Initialize pin control device struct */ | ||
591 | pctldev->owner = pctldesc->owner; | ||
592 | pctldev->desc = pctldesc; | ||
593 | pctldev->driver_data = driver_data; | ||
594 | INIT_RADIX_TREE(&pctldev->pin_desc_tree, GFP_KERNEL); | ||
595 | spin_lock_init(&pctldev->pin_desc_tree_lock); | ||
596 | INIT_LIST_HEAD(&pctldev->gpio_ranges); | ||
597 | mutex_init(&pctldev->gpio_ranges_lock); | ||
598 | pctldev->dev = dev; | ||
599 | |||
575 | /* If we're implementing pinmuxing, check the ops for sanity */ | 600 | /* If we're implementing pinmuxing, check the ops for sanity */ |
576 | if (pctldesc->pmxops) { | 601 | if (pctldesc->pmxops) { |
577 | ret = pinmux_check_ops(pctldesc->pmxops); | 602 | ret = pinmux_check_ops(pctldev); |
578 | if (ret) { | 603 | if (ret) { |
579 | pr_err("%s pinmux ops lacks necessary functions\n", | 604 | pr_err("%s pinmux ops lacks necessary functions\n", |
580 | pctldesc->name); | 605 | pctldesc->name); |
581 | return NULL; | 606 | goto out_err; |
582 | } | 607 | } |
583 | } | 608 | } |
584 | 609 | ||
585 | /* If we're implementing pinconfig, check the ops for sanity */ | 610 | /* If we're implementing pinconfig, check the ops for sanity */ |
586 | if (pctldesc->confops) { | 611 | if (pctldesc->confops) { |
587 | ret = pinconf_check_ops(pctldesc->confops); | 612 | ret = pinconf_check_ops(pctldev); |
588 | if (ret) { | 613 | if (ret) { |
589 | pr_err("%s pin config ops lacks necessary functions\n", | 614 | pr_err("%s pin config ops lacks necessary functions\n", |
590 | pctldesc->name); | 615 | pctldesc->name); |
591 | return NULL; | 616 | goto out_err; |
592 | } | 617 | } |
593 | } | 618 | } |
594 | 619 | ||
595 | pctldev = kzalloc(sizeof(struct pinctrl_dev), GFP_KERNEL); | ||
596 | if (pctldev == NULL) | ||
597 | return NULL; | ||
598 | |||
599 | /* Initialize pin control device struct */ | ||
600 | pctldev->owner = pctldesc->owner; | ||
601 | pctldev->desc = pctldesc; | ||
602 | pctldev->driver_data = driver_data; | ||
603 | INIT_RADIX_TREE(&pctldev->pin_desc_tree, GFP_KERNEL); | ||
604 | spin_lock_init(&pctldev->pin_desc_tree_lock); | ||
605 | INIT_LIST_HEAD(&pctldev->gpio_ranges); | ||
606 | mutex_init(&pctldev->gpio_ranges_lock); | ||
607 | pctldev->dev = dev; | ||
608 | |||
609 | /* Register all the pins */ | 620 | /* Register all the pins */ |
610 | pr_debug("try to register %d pins on %s...\n", | 621 | pr_debug("try to register %d pins on %s...\n", |
611 | pctldesc->npins, pctldesc->name); | 622 | pctldesc->npins, pctldesc->name); |
@@ -641,6 +652,7 @@ void pinctrl_unregister(struct pinctrl_dev *pctldev) | |||
641 | if (pctldev == NULL) | 652 | if (pctldev == NULL) |
642 | return; | 653 | return; |
643 | 654 | ||
655 | pinctrl_remove_device_debugfs(pctldev); | ||
644 | pinmux_unhog_maps(pctldev); | 656 | pinmux_unhog_maps(pctldev); |
645 | /* TODO: check that no pinmuxes are still active? */ | 657 | /* TODO: check that no pinmuxes are still active? */ |
646 | mutex_lock(&pinctrldev_list_mutex); | 658 | mutex_lock(&pinctrldev_list_mutex); |
diff --git a/drivers/pinctrl/core.h b/drivers/pinctrl/core.h index 177a3310547f..cfa86da6b4b1 100644 --- a/drivers/pinctrl/core.h +++ b/drivers/pinctrl/core.h | |||
@@ -41,6 +41,9 @@ struct pinctrl_dev { | |||
41 | struct device *dev; | 41 | struct device *dev; |
42 | struct module *owner; | 42 | struct module *owner; |
43 | void *driver_data; | 43 | void *driver_data; |
44 | #ifdef CONFIG_DEBUG_FS | ||
45 | struct dentry *device_root; | ||
46 | #endif | ||
44 | #ifdef CONFIG_PINMUX | 47 | #ifdef CONFIG_PINMUX |
45 | struct mutex pinmux_hogs_lock; | 48 | struct mutex pinmux_hogs_lock; |
46 | struct list_head pinmux_hogs; | 49 | struct list_head pinmux_hogs; |
diff --git a/drivers/pinctrl/pinconf.c b/drivers/pinctrl/pinconf.c index 1259872b0a1d..9fb75456824c 100644 --- a/drivers/pinctrl/pinconf.c +++ b/drivers/pinctrl/pinconf.c | |||
@@ -205,8 +205,10 @@ int pin_config_group_set(const char *dev_name, const char *pin_group, | |||
205 | } | 205 | } |
206 | EXPORT_SYMBOL(pin_config_group_set); | 206 | EXPORT_SYMBOL(pin_config_group_set); |
207 | 207 | ||
208 | int pinconf_check_ops(const struct pinconf_ops *ops) | 208 | int pinconf_check_ops(struct pinctrl_dev *pctldev) |
209 | { | 209 | { |
210 | const struct pinconf_ops *ops = pctldev->desc->confops; | ||
211 | |||
210 | /* We must be able to read out pin status */ | 212 | /* We must be able to read out pin status */ |
211 | if (!ops->pin_config_get && !ops->pin_config_group_get) | 213 | if (!ops->pin_config_get && !ops->pin_config_group_get) |
212 | return -EINVAL; | 214 | return -EINVAL; |
@@ -236,7 +238,7 @@ static int pinconf_pins_show(struct seq_file *s, void *what) | |||
236 | seq_puts(s, "Format: pin (name): pinmux setting array\n"); | 238 | seq_puts(s, "Format: pin (name): pinmux setting array\n"); |
237 | 239 | ||
238 | /* The pin number can be retrived from the pin controller descriptor */ | 240 | /* The pin number can be retrived from the pin controller descriptor */ |
239 | for (i = 0; pin < pctldev->desc->npins; i++) { | 241 | for (i = 0; i < pctldev->desc->npins; i++) { |
240 | struct pin_desc *desc; | 242 | struct pin_desc *desc; |
241 | 243 | ||
242 | pin = pctldev->desc->pins[i].number; | 244 | pin = pctldev->desc->pins[i].number; |
diff --git a/drivers/pinctrl/pinconf.h b/drivers/pinctrl/pinconf.h index e7dc6165032a..006b77fa737e 100644 --- a/drivers/pinctrl/pinconf.h +++ b/drivers/pinctrl/pinconf.h | |||
@@ -13,7 +13,7 @@ | |||
13 | 13 | ||
14 | #ifdef CONFIG_PINCONF | 14 | #ifdef CONFIG_PINCONF |
15 | 15 | ||
16 | int pinconf_check_ops(const struct pinconf_ops *ops); | 16 | int pinconf_check_ops(struct pinctrl_dev *pctldev); |
17 | void pinconf_init_device_debugfs(struct dentry *devroot, | 17 | void pinconf_init_device_debugfs(struct dentry *devroot, |
18 | struct pinctrl_dev *pctldev); | 18 | struct pinctrl_dev *pctldev); |
19 | int pin_config_get_for_pin(struct pinctrl_dev *pctldev, unsigned pin, | 19 | int pin_config_get_for_pin(struct pinctrl_dev *pctldev, unsigned pin, |
@@ -23,7 +23,7 @@ int pin_config_set_for_pin(struct pinctrl_dev *pctldev, unsigned pin, | |||
23 | 23 | ||
24 | #else | 24 | #else |
25 | 25 | ||
26 | static inline int pinconf_check_ops(const struct pinconf_ops *ops) | 26 | static inline int pinconf_check_ops(struct pinctrl_dev *pctldev) |
27 | { | 27 | { |
28 | return 0; | 28 | return 0; |
29 | } | 29 | } |
diff --git a/drivers/pinctrl/pinmux.c b/drivers/pinctrl/pinmux.c index a76a348321bb..7c3193f7a044 100644 --- a/drivers/pinctrl/pinmux.c +++ b/drivers/pinctrl/pinmux.c | |||
@@ -53,11 +53,6 @@ struct pinmux_group { | |||
53 | * @dev: the device using this pinmux | 53 | * @dev: the device using this pinmux |
54 | * @usecount: the number of active users of this mux setting, used to keep | 54 | * @usecount: the number of active users of this mux setting, used to keep |
55 | * track of nested use cases | 55 | * track of nested use cases |
56 | * @pins: an array of discrete physical pins used in this mapping, taken | ||
57 | * from the global pin enumeration space (copied from pinmux map) | ||
58 | * @num_pins: the number of pins in this mapping array, i.e. the number of | ||
59 | * elements in .pins so we can iterate over that array (copied from | ||
60 | * pinmux map) | ||
61 | * @pctldev: pin control device handling this pinmux | 56 | * @pctldev: pin control device handling this pinmux |
62 | * @func_selector: the function selector for the pinmux device handling | 57 | * @func_selector: the function selector for the pinmux device handling |
63 | * this pinmux | 58 | * this pinmux |
@@ -152,8 +147,7 @@ static int pin_request(struct pinctrl_dev *pctldev, | |||
152 | status = 0; | 147 | status = 0; |
153 | 148 | ||
154 | if (status) | 149 | if (status) |
155 | dev_err(pctldev->dev, "->request on device %s failed " | 150 | dev_err(pctldev->dev, "->request on device %s failed for pin %d\n", |
156 | "for pin %d\n", | ||
157 | pctldev->desc->name, pin); | 151 | pctldev->desc->name, pin); |
158 | out_free_pin: | 152 | out_free_pin: |
159 | if (status) { | 153 | if (status) { |
@@ -355,21 +349,20 @@ int __init pinmux_register_mappings(struct pinmux_map const *maps, | |||
355 | /* First sanity check the new mapping */ | 349 | /* First sanity check the new mapping */ |
356 | for (i = 0; i < num_maps; i++) { | 350 | for (i = 0; i < num_maps; i++) { |
357 | if (!maps[i].name) { | 351 | if (!maps[i].name) { |
358 | pr_err("failed to register map %d: " | 352 | pr_err("failed to register map %d: no map name given\n", |
359 | "no map name given\n", i); | 353 | i); |
360 | return -EINVAL; | 354 | return -EINVAL; |
361 | } | 355 | } |
362 | 356 | ||
363 | if (!maps[i].ctrl_dev && !maps[i].ctrl_dev_name) { | 357 | if (!maps[i].ctrl_dev && !maps[i].ctrl_dev_name) { |
364 | pr_err("failed to register map %s (%d): " | 358 | pr_err("failed to register map %s (%d): no pin control device given\n", |
365 | "no pin control device given\n", | ||
366 | maps[i].name, i); | 359 | maps[i].name, i); |
367 | return -EINVAL; | 360 | return -EINVAL; |
368 | } | 361 | } |
369 | 362 | ||
370 | if (!maps[i].function) { | 363 | if (!maps[i].function) { |
371 | pr_err("failed to register map %s (%d): " | 364 | pr_err("failed to register map %s (%d): no function ID given\n", |
372 | "no function ID given\n", maps[i].name, i); | 365 | maps[i].name, i); |
373 | return -EINVAL; | 366 | return -EINVAL; |
374 | } | 367 | } |
375 | 368 | ||
@@ -411,7 +404,7 @@ int __init pinmux_register_mappings(struct pinmux_map const *maps, | |||
411 | } | 404 | } |
412 | 405 | ||
413 | /** | 406 | /** |
414 | * acquire_pins() - acquire all the pins for a certain funcion on a pinmux | 407 | * acquire_pins() - acquire all the pins for a certain function on a pinmux |
415 | * @pctldev: the device to take the pins on | 408 | * @pctldev: the device to take the pins on |
416 | * @func_selector: the function selector to acquire the pins for | 409 | * @func_selector: the function selector to acquire the pins for |
417 | * @group_selector: the group selector containing the pins to acquire | 410 | * @group_selector: the group selector containing the pins to acquire |
@@ -442,8 +435,7 @@ static int acquire_pins(struct pinctrl_dev *pctldev, | |||
442 | ret = pin_request(pctldev, pins[i], func, NULL); | 435 | ret = pin_request(pctldev, pins[i], func, NULL); |
443 | if (ret) { | 436 | if (ret) { |
444 | dev_err(pctldev->dev, | 437 | dev_err(pctldev->dev, |
445 | "could not get pin %d for function %s " | 438 | "could not get pin %d for function %s on device %s - conflicting mux mappings?\n", |
446 | "on device %s - conflicting mux mappings?\n", | ||
447 | pins[i], func ? : "(undefined)", | 439 | pins[i], func ? : "(undefined)", |
448 | pinctrl_dev_get_name(pctldev)); | 440 | pinctrl_dev_get_name(pctldev)); |
449 | /* On error release all taken pins */ | 441 | /* On error release all taken pins */ |
@@ -458,7 +450,7 @@ static int acquire_pins(struct pinctrl_dev *pctldev, | |||
458 | 450 | ||
459 | /** | 451 | /** |
460 | * release_pins() - release pins taken by earlier acquirement | 452 | * release_pins() - release pins taken by earlier acquirement |
461 | * @pctldev: the device to free the pinx on | 453 | * @pctldev: the device to free the pins on |
462 | * @group_selector: the group selector containing the pins to free | 454 | * @group_selector: the group selector containing the pins to free |
463 | */ | 455 | */ |
464 | static void release_pins(struct pinctrl_dev *pctldev, | 456 | static void release_pins(struct pinctrl_dev *pctldev, |
@@ -473,8 +465,7 @@ static void release_pins(struct pinctrl_dev *pctldev, | |||
473 | ret = pctlops->get_group_pins(pctldev, group_selector, | 465 | ret = pctlops->get_group_pins(pctldev, group_selector, |
474 | &pins, &num_pins); | 466 | &pins, &num_pins); |
475 | if (ret) { | 467 | if (ret) { |
476 | dev_err(pctldev->dev, "could not get pins to release for " | 468 | dev_err(pctldev->dev, "could not get pins to release for group selector %d\n", |
477 | "group selector %d\n", | ||
478 | group_selector); | 469 | group_selector); |
479 | return; | 470 | return; |
480 | } | 471 | } |
@@ -526,8 +517,7 @@ static int pinmux_check_pin_group(struct pinctrl_dev *pctldev, | |||
526 | ret = pinctrl_get_group_selector(pctldev, groups[0]); | 517 | ret = pinctrl_get_group_selector(pctldev, groups[0]); |
527 | if (ret < 0) { | 518 | if (ret < 0) { |
528 | dev_err(pctldev->dev, | 519 | dev_err(pctldev->dev, |
529 | "function %s wants group %s but the pin " | 520 | "function %s wants group %s but the pin controller does not seem to have that group\n", |
530 | "controller does not seem to have that group\n", | ||
531 | pmxops->get_function_name(pctldev, func_selector), | 521 | pmxops->get_function_name(pctldev, func_selector), |
532 | groups[0]); | 522 | groups[0]); |
533 | return ret; | 523 | return ret; |
@@ -535,8 +525,7 @@ static int pinmux_check_pin_group(struct pinctrl_dev *pctldev, | |||
535 | 525 | ||
536 | if (num_groups > 1) | 526 | if (num_groups > 1) |
537 | dev_dbg(pctldev->dev, | 527 | dev_dbg(pctldev->dev, |
538 | "function %s support more than one group, " | 528 | "function %s support more than one group, default-selecting first group %s (%d)\n", |
539 | "default-selecting first group %s (%d)\n", | ||
540 | pmxops->get_function_name(pctldev, func_selector), | 529 | pmxops->get_function_name(pctldev, func_selector), |
541 | groups[0], | 530 | groups[0], |
542 | ret); | 531 | ret); |
@@ -628,10 +617,8 @@ static int pinmux_enable_muxmap(struct pinctrl_dev *pctldev, | |||
628 | 617 | ||
629 | if (pmx->pctldev && pmx->pctldev != pctldev) { | 618 | if (pmx->pctldev && pmx->pctldev != pctldev) { |
630 | dev_err(pctldev->dev, | 619 | dev_err(pctldev->dev, |
631 | "different pin control devices given for device %s, " | 620 | "different pin control devices given for device %s, function %s\n", |
632 | "function %s\n", | 621 | devname, map->function); |
633 | devname, | ||
634 | map->function); | ||
635 | return -EINVAL; | 622 | return -EINVAL; |
636 | } | 623 | } |
637 | pmx->dev = dev; | 624 | pmx->dev = dev; |
@@ -695,7 +682,6 @@ static void pinmux_free_groups(struct pinmux *pmx) | |||
695 | */ | 682 | */ |
696 | struct pinmux *pinmux_get(struct device *dev, const char *name) | 683 | struct pinmux *pinmux_get(struct device *dev, const char *name) |
697 | { | 684 | { |
698 | |||
699 | struct pinmux_map const *map = NULL; | 685 | struct pinmux_map const *map = NULL; |
700 | struct pinctrl_dev *pctldev = NULL; | 686 | struct pinctrl_dev *pctldev = NULL; |
701 | const char *devname = NULL; | 687 | const char *devname = NULL; |
@@ -745,8 +731,7 @@ struct pinmux *pinmux_get(struct device *dev, const char *name) | |||
745 | else if (map->ctrl_dev_name) | 731 | else if (map->ctrl_dev_name) |
746 | devname = map->ctrl_dev_name; | 732 | devname = map->ctrl_dev_name; |
747 | 733 | ||
748 | pr_warning("could not find a pinctrl device for pinmux " | 734 | pr_warning("could not find a pinctrl device for pinmux function %s, fishy, they shall all have one\n", |
749 | "function %s, fishy, they shall all have one\n", | ||
750 | map->function); | 735 | map->function); |
751 | pr_warning("given pinctrl device name: %s", | 736 | pr_warning("given pinctrl device name: %s", |
752 | devname ? devname : "UNDEFINED"); | 737 | devname ? devname : "UNDEFINED"); |
@@ -904,8 +889,11 @@ void pinmux_disable(struct pinmux *pmx) | |||
904 | } | 889 | } |
905 | EXPORT_SYMBOL_GPL(pinmux_disable); | 890 | EXPORT_SYMBOL_GPL(pinmux_disable); |
906 | 891 | ||
907 | int pinmux_check_ops(const struct pinmux_ops *ops) | 892 | int pinmux_check_ops(struct pinctrl_dev *pctldev) |
908 | { | 893 | { |
894 | const struct pinmux_ops *ops = pctldev->desc->pmxops; | ||
895 | unsigned selector = 0; | ||
896 | |||
909 | /* Check that we implement required operations */ | 897 | /* Check that we implement required operations */ |
910 | if (!ops->list_functions || | 898 | if (!ops->list_functions || |
911 | !ops->get_function_name || | 899 | !ops->get_function_name || |
@@ -914,6 +902,18 @@ int pinmux_check_ops(const struct pinmux_ops *ops) | |||
914 | !ops->disable) | 902 | !ops->disable) |
915 | return -EINVAL; | 903 | return -EINVAL; |
916 | 904 | ||
905 | /* Check that all functions registered have names */ | ||
906 | while (ops->list_functions(pctldev, selector) >= 0) { | ||
907 | const char *fname = ops->get_function_name(pctldev, | ||
908 | selector); | ||
909 | if (!fname) { | ||
910 | pr_err("pinmux ops has no name for function%u\n", | ||
911 | selector); | ||
912 | return -EINVAL; | ||
913 | } | ||
914 | selector++; | ||
915 | } | ||
916 | |||
917 | return 0; | 917 | return 0; |
918 | } | 918 | } |
919 | 919 | ||
@@ -932,8 +932,8 @@ static int pinmux_hog_map(struct pinctrl_dev *pctldev, | |||
932 | * without any problems, so then we can hog pinmuxes for | 932 | * without any problems, so then we can hog pinmuxes for |
933 | * all devices that just want a static pin mux at this point. | 933 | * all devices that just want a static pin mux at this point. |
934 | */ | 934 | */ |
935 | dev_err(pctldev->dev, "map %s wants to hog a non-system " | 935 | dev_err(pctldev->dev, "map %s wants to hog a non-system pinmux, this is not going to work\n", |
936 | "pinmux, this is not going to work\n", map->name); | 936 | map->name); |
937 | return -EINVAL; | 937 | return -EINVAL; |
938 | } | 938 | } |
939 | 939 | ||
@@ -993,9 +993,12 @@ int pinmux_hog_maps(struct pinctrl_dev *pctldev) | |||
993 | for (i = 0; i < pinmux_maps_num; i++) { | 993 | for (i = 0; i < pinmux_maps_num; i++) { |
994 | struct pinmux_map const *map = &pinmux_maps[i]; | 994 | struct pinmux_map const *map = &pinmux_maps[i]; |
995 | 995 | ||
996 | if (((map->ctrl_dev == dev) || | 996 | if (!map->hog_on_boot) |
997 | !strcmp(map->ctrl_dev_name, devname)) && | 997 | continue; |
998 | map->hog_on_boot) { | 998 | |
999 | if ((map->ctrl_dev == dev) || | ||
1000 | (map->ctrl_dev_name && | ||
1001 | !strcmp(map->ctrl_dev_name, devname))) { | ||
999 | /* OK time to hog! */ | 1002 | /* OK time to hog! */ |
1000 | ret = pinmux_hog_map(pctldev, map); | 1003 | ret = pinmux_hog_map(pctldev, map); |
1001 | if (ret) | 1004 | if (ret) |
@@ -1122,13 +1125,15 @@ static int pinmux_show(struct seq_file *s, void *what) | |||
1122 | 1125 | ||
1123 | seq_printf(s, "device: %s function: %s (%u),", | 1126 | seq_printf(s, "device: %s function: %s (%u),", |
1124 | pinctrl_dev_get_name(pmx->pctldev), | 1127 | pinctrl_dev_get_name(pmx->pctldev), |
1125 | pmxops->get_function_name(pctldev, pmx->func_selector), | 1128 | pmxops->get_function_name(pctldev, |
1129 | pmx->func_selector), | ||
1126 | pmx->func_selector); | 1130 | pmx->func_selector); |
1127 | 1131 | ||
1128 | seq_printf(s, " groups: ["); | 1132 | seq_printf(s, " groups: ["); |
1129 | list_for_each_entry(grp, &pmx->groups, node) { | 1133 | list_for_each_entry(grp, &pmx->groups, node) { |
1130 | seq_printf(s, " %s (%u)", | 1134 | seq_printf(s, " %s (%u)", |
1131 | pctlops->get_group_name(pctldev, grp->group_selector), | 1135 | pctlops->get_group_name(pctldev, |
1136 | grp->group_selector), | ||
1132 | grp->group_selector); | 1137 | grp->group_selector); |
1133 | } | 1138 | } |
1134 | seq_printf(s, " ]"); | 1139 | seq_printf(s, " ]"); |
diff --git a/drivers/pinctrl/pinmux.h b/drivers/pinctrl/pinmux.h index 844500b3331b..97f52223fbc2 100644 --- a/drivers/pinctrl/pinmux.h +++ b/drivers/pinctrl/pinmux.h | |||
@@ -12,7 +12,7 @@ | |||
12 | */ | 12 | */ |
13 | #ifdef CONFIG_PINMUX | 13 | #ifdef CONFIG_PINMUX |
14 | 14 | ||
15 | int pinmux_check_ops(const struct pinmux_ops *ops); | 15 | int pinmux_check_ops(struct pinctrl_dev *pctldev); |
16 | void pinmux_init_device_debugfs(struct dentry *devroot, | 16 | void pinmux_init_device_debugfs(struct dentry *devroot, |
17 | struct pinctrl_dev *pctldev); | 17 | struct pinctrl_dev *pctldev); |
18 | void pinmux_init_debugfs(struct dentry *subsys_root); | 18 | void pinmux_init_debugfs(struct dentry *subsys_root); |
@@ -21,7 +21,7 @@ void pinmux_unhog_maps(struct pinctrl_dev *pctldev); | |||
21 | 21 | ||
22 | #else | 22 | #else |
23 | 23 | ||
24 | static inline int pinmux_check_ops(const struct pinmux_ops *ops) | 24 | static inline int pinmux_check_ops(struct pinctrl_dev *pctldev) |
25 | { | 25 | { |
26 | return 0; | 26 | return 0; |
27 | } | 27 | } |
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index ca86f39a0fdc..e9a83f84adaf 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c | |||
@@ -2731,6 +2731,8 @@ static void rdev_init_debugfs(struct regulator_dev *rdev) | |||
2731 | * @dev: struct device for the regulator | 2731 | * @dev: struct device for the regulator |
2732 | * @init_data: platform provided init data, passed through by driver | 2732 | * @init_data: platform provided init data, passed through by driver |
2733 | * @driver_data: private regulator data | 2733 | * @driver_data: private regulator data |
2734 | * @of_node: OpenFirmware node to parse for device tree bindings (may be | ||
2735 | * NULL). | ||
2734 | * | 2736 | * |
2735 | * Called by regulator drivers to register a regulator. | 2737 | * Called by regulator drivers to register a regulator. |
2736 | * Returns 0 on success. | 2738 | * Returns 0 on success. |
diff --git a/drivers/regulator/of_regulator.c b/drivers/regulator/of_regulator.c index f1651eb69648..679734d26a16 100644 --- a/drivers/regulator/of_regulator.c +++ b/drivers/regulator/of_regulator.c | |||
@@ -35,7 +35,7 @@ static void of_get_regulation_constraints(struct device_node *np, | |||
35 | if (constraints->min_uV != constraints->max_uV) | 35 | if (constraints->min_uV != constraints->max_uV) |
36 | constraints->valid_ops_mask |= REGULATOR_CHANGE_VOLTAGE; | 36 | constraints->valid_ops_mask |= REGULATOR_CHANGE_VOLTAGE; |
37 | /* Only one voltage? Then make sure it's set. */ | 37 | /* Only one voltage? Then make sure it's set. */ |
38 | if (constraints->min_uV == constraints->max_uV) | 38 | if (min_uV && max_uV && constraints->min_uV == constraints->max_uV) |
39 | constraints->apply_uV = true; | 39 | constraints->apply_uV = true; |
40 | 40 | ||
41 | uV_offset = of_get_property(np, "regulator-microvolt-offset", NULL); | 41 | uV_offset = of_get_property(np, "regulator-microvolt-offset", NULL); |
diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index e19a4031f45e..3a125b835546 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig | |||
@@ -774,7 +774,7 @@ config RTC_DRV_EP93XX | |||
774 | 774 | ||
775 | config RTC_DRV_SA1100 | 775 | config RTC_DRV_SA1100 |
776 | tristate "SA11x0/PXA2xx" | 776 | tristate "SA11x0/PXA2xx" |
777 | depends on ARCH_SA1100 || ARCH_PXA || ARCH_MMP | 777 | depends on ARCH_SA1100 || ARCH_PXA |
778 | help | 778 | help |
779 | If you say Y here you will get access to the real time clock | 779 | If you say Y here you will get access to the real time clock |
780 | built into your SA11x0 or PXA2xx CPU. | 780 | built into your SA11x0 or PXA2xx CPU. |
diff --git a/drivers/rtc/rtc-sa1100.c b/drivers/rtc/rtc-sa1100.c index 4595d3e645a7..cb9a585312cc 100644 --- a/drivers/rtc/rtc-sa1100.c +++ b/drivers/rtc/rtc-sa1100.c | |||
@@ -27,42 +27,34 @@ | |||
27 | #include <linux/init.h> | 27 | #include <linux/init.h> |
28 | #include <linux/fs.h> | 28 | #include <linux/fs.h> |
29 | #include <linux/interrupt.h> | 29 | #include <linux/interrupt.h> |
30 | #include <linux/string.h> | ||
30 | #include <linux/pm.h> | 31 | #include <linux/pm.h> |
31 | #include <linux/slab.h> | 32 | #include <linux/bitops.h> |
32 | #include <linux/clk.h> | ||
33 | #include <linux/io.h> | ||
34 | 33 | ||
35 | #include <mach/hardware.h> | 34 | #include <mach/hardware.h> |
36 | #include <asm/irq.h> | 35 | #include <asm/irq.h> |
37 | 36 | ||
37 | #ifdef CONFIG_ARCH_PXA | ||
38 | #include <mach/regs-rtc.h> | ||
39 | #endif | ||
40 | |||
38 | #define RTC_DEF_DIVIDER (32768 - 1) | 41 | #define RTC_DEF_DIVIDER (32768 - 1) |
39 | #define RTC_DEF_TRIM 0 | 42 | #define RTC_DEF_TRIM 0 |
40 | #define RTC_FREQ 1024 | 43 | |
41 | 44 | static const unsigned long RTC_FREQ = 1024; | |
42 | #define RCNR 0x00 /* RTC Count Register */ | 45 | static struct rtc_time rtc_alarm; |
43 | #define RTAR 0x04 /* RTC Alarm Register */ | 46 | static DEFINE_SPINLOCK(sa1100_rtc_lock); |
44 | #define RTSR 0x08 /* RTC Status Register */ | 47 | |
45 | #define RTTR 0x0c /* RTC Timer Trim Register */ | 48 | static inline int rtc_periodic_alarm(struct rtc_time *tm) |
46 | 49 | { | |
47 | #define RTSR_HZE (1 << 3) /* HZ interrupt enable */ | 50 | return (tm->tm_year == -1) || |
48 | #define RTSR_ALE (1 << 2) /* RTC alarm interrupt enable */ | 51 | ((unsigned)tm->tm_mon >= 12) || |
49 | #define RTSR_HZ (1 << 1) /* HZ rising-edge detected */ | 52 | ((unsigned)(tm->tm_mday - 1) >= 31) || |
50 | #define RTSR_AL (1 << 0) /* RTC alarm detected */ | 53 | ((unsigned)tm->tm_hour > 23) || |
51 | 54 | ((unsigned)tm->tm_min > 59) || | |
52 | #define rtc_readl(sa1100_rtc, reg) \ | 55 | ((unsigned)tm->tm_sec > 59); |
53 | readl_relaxed((sa1100_rtc)->base + (reg)) | 56 | } |
54 | #define rtc_writel(sa1100_rtc, reg, value) \ | 57 | |
55 | writel_relaxed((value), (sa1100_rtc)->base + (reg)) | ||
56 | |||
57 | struct sa1100_rtc { | ||
58 | struct resource *ress; | ||
59 | void __iomem *base; | ||
60 | struct clk *clk; | ||
61 | int irq_1Hz; | ||
62 | int irq_Alrm; | ||
63 | struct rtc_device *rtc; | ||
64 | spinlock_t lock; /* Protects this structure */ | ||
65 | }; | ||
66 | /* | 58 | /* |
67 | * Calculate the next alarm time given the requested alarm time mask | 59 | * Calculate the next alarm time given the requested alarm time mask |
68 | * and the current time. | 60 | * and the current time. |
@@ -90,26 +82,46 @@ static void rtc_next_alarm_time(struct rtc_time *next, struct rtc_time *now, | |||
90 | } | 82 | } |
91 | } | 83 | } |
92 | 84 | ||
85 | static int rtc_update_alarm(struct rtc_time *alrm) | ||
86 | { | ||
87 | struct rtc_time alarm_tm, now_tm; | ||
88 | unsigned long now, time; | ||
89 | int ret; | ||
90 | |||
91 | do { | ||
92 | now = RCNR; | ||
93 | rtc_time_to_tm(now, &now_tm); | ||
94 | rtc_next_alarm_time(&alarm_tm, &now_tm, alrm); | ||
95 | ret = rtc_tm_to_time(&alarm_tm, &time); | ||
96 | if (ret != 0) | ||
97 | break; | ||
98 | |||
99 | RTSR = RTSR & (RTSR_HZE|RTSR_ALE|RTSR_AL); | ||
100 | RTAR = time; | ||
101 | } while (now != RCNR); | ||
102 | |||
103 | return ret; | ||
104 | } | ||
105 | |||
93 | static irqreturn_t sa1100_rtc_interrupt(int irq, void *dev_id) | 106 | static irqreturn_t sa1100_rtc_interrupt(int irq, void *dev_id) |
94 | { | 107 | { |
95 | struct platform_device *pdev = to_platform_device(dev_id); | 108 | struct platform_device *pdev = to_platform_device(dev_id); |
96 | struct sa1100_rtc *sa1100_rtc = platform_get_drvdata(pdev); | 109 | struct rtc_device *rtc = platform_get_drvdata(pdev); |
97 | unsigned int rtsr; | 110 | unsigned int rtsr; |
98 | unsigned long events = 0; | 111 | unsigned long events = 0; |
99 | 112 | ||
100 | spin_lock(&sa1100_rtc->lock); | 113 | spin_lock(&sa1100_rtc_lock); |
101 | 114 | ||
115 | rtsr = RTSR; | ||
102 | /* clear interrupt sources */ | 116 | /* clear interrupt sources */ |
103 | rtsr = rtc_readl(sa1100_rtc, RTSR); | 117 | RTSR = 0; |
104 | rtc_writel(sa1100_rtc, RTSR, 0); | ||
105 | |||
106 | /* Fix for a nasty initialization problem the in SA11xx RTSR register. | 118 | /* Fix for a nasty initialization problem the in SA11xx RTSR register. |
107 | * See also the comments in sa1100_rtc_probe(). */ | 119 | * See also the comments in sa1100_rtc_probe(). */ |
108 | if (rtsr & (RTSR_ALE | RTSR_HZE)) { | 120 | if (rtsr & (RTSR_ALE | RTSR_HZE)) { |
109 | /* This is the original code, before there was the if test | 121 | /* This is the original code, before there was the if test |
110 | * above. This code does not clear interrupts that were not | 122 | * above. This code does not clear interrupts that were not |
111 | * enabled. */ | 123 | * enabled. */ |
112 | rtc_writel(sa1100_rtc, RTSR, (RTSR_AL | RTSR_HZ) & (rtsr >> 2)); | 124 | RTSR = (RTSR_AL | RTSR_HZ) & (rtsr >> 2); |
113 | } else { | 125 | } else { |
114 | /* For some reason, it is possible to enter this routine | 126 | /* For some reason, it is possible to enter this routine |
115 | * without interruptions enabled, it has been tested with | 127 | * without interruptions enabled, it has been tested with |
@@ -118,13 +130,13 @@ static irqreturn_t sa1100_rtc_interrupt(int irq, void *dev_id) | |||
118 | * This situation leads to an infinite "loop" of interrupt | 130 | * This situation leads to an infinite "loop" of interrupt |
119 | * routine calling and as a result the processor seems to | 131 | * routine calling and as a result the processor seems to |
120 | * lock on its first call to open(). */ | 132 | * lock on its first call to open(). */ |
121 | rtc_writel(sa1100_rtc, RTSR, (RTSR_AL | RTSR_HZ)); | 133 | RTSR = RTSR_AL | RTSR_HZ; |
122 | } | 134 | } |
123 | 135 | ||
124 | /* clear alarm interrupt if it has occurred */ | 136 | /* clear alarm interrupt if it has occurred */ |
125 | if (rtsr & RTSR_AL) | 137 | if (rtsr & RTSR_AL) |
126 | rtsr &= ~RTSR_ALE; | 138 | rtsr &= ~RTSR_ALE; |
127 | rtc_writel(sa1100_rtc, RTSR, rtsr & (RTSR_ALE | RTSR_HZE)); | 139 | RTSR = rtsr & (RTSR_ALE | RTSR_HZE); |
128 | 140 | ||
129 | /* update irq data & counter */ | 141 | /* update irq data & counter */ |
130 | if (rtsr & RTSR_AL) | 142 | if (rtsr & RTSR_AL) |
@@ -132,100 +144,89 @@ static irqreturn_t sa1100_rtc_interrupt(int irq, void *dev_id) | |||
132 | if (rtsr & RTSR_HZ) | 144 | if (rtsr & RTSR_HZ) |
133 | events |= RTC_UF | RTC_IRQF; | 145 | events |= RTC_UF | RTC_IRQF; |
134 | 146 | ||
135 | rtc_update_irq(sa1100_rtc->rtc, 1, events); | 147 | rtc_update_irq(rtc, 1, events); |
136 | 148 | ||
137 | spin_unlock(&sa1100_rtc->lock); | 149 | if (rtsr & RTSR_AL && rtc_periodic_alarm(&rtc_alarm)) |
150 | rtc_update_alarm(&rtc_alarm); | ||
151 | |||
152 | spin_unlock(&sa1100_rtc_lock); | ||
138 | 153 | ||
139 | return IRQ_HANDLED; | 154 | return IRQ_HANDLED; |
140 | } | 155 | } |
141 | 156 | ||
142 | static int sa1100_rtc_open(struct device *dev) | 157 | static int sa1100_rtc_open(struct device *dev) |
143 | { | 158 | { |
144 | struct sa1100_rtc *sa1100_rtc = dev_get_drvdata(dev); | ||
145 | int ret; | 159 | int ret; |
160 | struct platform_device *plat_dev = to_platform_device(dev); | ||
161 | struct rtc_device *rtc = platform_get_drvdata(plat_dev); | ||
146 | 162 | ||
147 | ret = request_irq(sa1100_rtc->irq_1Hz, sa1100_rtc_interrupt, | 163 | ret = request_irq(IRQ_RTC1Hz, sa1100_rtc_interrupt, IRQF_DISABLED, |
148 | IRQF_DISABLED, "rtc 1Hz", dev); | 164 | "rtc 1Hz", dev); |
149 | if (ret) { | 165 | if (ret) { |
150 | dev_err(dev, "IRQ %d already in use.\n", sa1100_rtc->irq_1Hz); | 166 | dev_err(dev, "IRQ %d already in use.\n", IRQ_RTC1Hz); |
151 | goto fail_ui; | 167 | goto fail_ui; |
152 | } | 168 | } |
153 | ret = request_irq(sa1100_rtc->irq_Alrm, sa1100_rtc_interrupt, | 169 | ret = request_irq(IRQ_RTCAlrm, sa1100_rtc_interrupt, IRQF_DISABLED, |
154 | IRQF_DISABLED, "rtc Alrm", dev); | 170 | "rtc Alrm", dev); |
155 | if (ret) { | 171 | if (ret) { |
156 | dev_err(dev, "IRQ %d already in use.\n", sa1100_rtc->irq_Alrm); | 172 | dev_err(dev, "IRQ %d already in use.\n", IRQ_RTCAlrm); |
157 | goto fail_ai; | 173 | goto fail_ai; |
158 | } | 174 | } |
159 | sa1100_rtc->rtc->max_user_freq = RTC_FREQ; | 175 | rtc->max_user_freq = RTC_FREQ; |
160 | rtc_irq_set_freq(sa1100_rtc->rtc, NULL, RTC_FREQ); | 176 | rtc_irq_set_freq(rtc, NULL, RTC_FREQ); |
161 | 177 | ||
162 | return 0; | 178 | return 0; |
163 | 179 | ||
164 | fail_ai: | 180 | fail_ai: |
165 | free_irq(sa1100_rtc->irq_1Hz, dev); | 181 | free_irq(IRQ_RTC1Hz, dev); |
166 | fail_ui: | 182 | fail_ui: |
167 | return ret; | 183 | return ret; |
168 | } | 184 | } |
169 | 185 | ||
170 | static void sa1100_rtc_release(struct device *dev) | 186 | static void sa1100_rtc_release(struct device *dev) |
171 | { | 187 | { |
172 | struct sa1100_rtc *sa1100_rtc = dev_get_drvdata(dev); | 188 | spin_lock_irq(&sa1100_rtc_lock); |
173 | 189 | RTSR = 0; | |
174 | spin_lock_irq(&sa1100_rtc->lock); | 190 | spin_unlock_irq(&sa1100_rtc_lock); |
175 | rtc_writel(sa1100_rtc, RTSR, 0); | ||
176 | spin_unlock_irq(&sa1100_rtc->lock); | ||
177 | 191 | ||
178 | free_irq(sa1100_rtc->irq_Alrm, dev); | 192 | free_irq(IRQ_RTCAlrm, dev); |
179 | free_irq(sa1100_rtc->irq_1Hz, dev); | 193 | free_irq(IRQ_RTC1Hz, dev); |
180 | } | 194 | } |
181 | 195 | ||
182 | static int sa1100_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled) | 196 | static int sa1100_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled) |
183 | { | 197 | { |
184 | struct sa1100_rtc *sa1100_rtc = dev_get_drvdata(dev); | 198 | spin_lock_irq(&sa1100_rtc_lock); |
185 | unsigned int rtsr; | ||
186 | |||
187 | spin_lock_irq(&sa1100_rtc->lock); | ||
188 | |||
189 | rtsr = rtc_readl(sa1100_rtc, RTSR); | ||
190 | if (enabled) | 199 | if (enabled) |
191 | rtsr |= RTSR_ALE; | 200 | RTSR |= RTSR_ALE; |
192 | else | 201 | else |
193 | rtsr &= ~RTSR_ALE; | 202 | RTSR &= ~RTSR_ALE; |
194 | rtc_writel(sa1100_rtc, RTSR, rtsr); | 203 | spin_unlock_irq(&sa1100_rtc_lock); |
195 | |||
196 | spin_unlock_irq(&sa1100_rtc->lock); | ||
197 | return 0; | 204 | return 0; |
198 | } | 205 | } |
199 | 206 | ||
200 | static int sa1100_rtc_read_time(struct device *dev, struct rtc_time *tm) | 207 | static int sa1100_rtc_read_time(struct device *dev, struct rtc_time *tm) |
201 | { | 208 | { |
202 | struct sa1100_rtc *sa1100_rtc = dev_get_drvdata(dev); | 209 | rtc_time_to_tm(RCNR, tm); |
203 | |||
204 | rtc_time_to_tm(rtc_readl(sa1100_rtc, RCNR), tm); | ||
205 | return 0; | 210 | return 0; |
206 | } | 211 | } |
207 | 212 | ||
208 | static int sa1100_rtc_set_time(struct device *dev, struct rtc_time *tm) | 213 | static int sa1100_rtc_set_time(struct device *dev, struct rtc_time *tm) |
209 | { | 214 | { |
210 | struct sa1100_rtc *sa1100_rtc = dev_get_drvdata(dev); | ||
211 | unsigned long time; | 215 | unsigned long time; |
212 | int ret; | 216 | int ret; |
213 | 217 | ||
214 | ret = rtc_tm_to_time(tm, &time); | 218 | ret = rtc_tm_to_time(tm, &time); |
215 | if (ret == 0) | 219 | if (ret == 0) |
216 | rtc_writel(sa1100_rtc, RCNR, time); | 220 | RCNR = time; |
217 | return ret; | 221 | return ret; |
218 | } | 222 | } |
219 | 223 | ||
220 | static int sa1100_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) | 224 | static int sa1100_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) |
221 | { | 225 | { |
222 | struct sa1100_rtc *sa1100_rtc = dev_get_drvdata(dev); | 226 | u32 rtsr; |
223 | unsigned long time; | ||
224 | unsigned int rtsr; | ||
225 | 227 | ||
226 | time = rtc_readl(sa1100_rtc, RCNR); | 228 | memcpy(&alrm->time, &rtc_alarm, sizeof(struct rtc_time)); |
227 | rtc_time_to_tm(time, &alrm->time); | 229 | rtsr = RTSR; |
228 | rtsr = rtc_readl(sa1100_rtc, RTSR); | ||
229 | alrm->enabled = (rtsr & RTSR_ALE) ? 1 : 0; | 230 | alrm->enabled = (rtsr & RTSR_ALE) ? 1 : 0; |
230 | alrm->pending = (rtsr & RTSR_AL) ? 1 : 0; | 231 | alrm->pending = (rtsr & RTSR_AL) ? 1 : 0; |
231 | return 0; | 232 | return 0; |
@@ -233,39 +234,26 @@ static int sa1100_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
233 | 234 | ||
234 | static int sa1100_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) | 235 | static int sa1100_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) |
235 | { | 236 | { |
236 | struct sa1100_rtc *sa1100_rtc = dev_get_drvdata(dev); | 237 | int ret; |
237 | struct rtc_time now_tm, alarm_tm; | ||
238 | unsigned long time, alarm; | ||
239 | unsigned int rtsr; | ||
240 | |||
241 | spin_lock_irq(&sa1100_rtc->lock); | ||
242 | |||
243 | time = rtc_readl(sa1100_rtc, RCNR); | ||
244 | rtc_time_to_tm(time, &now_tm); | ||
245 | rtc_next_alarm_time(&alarm_tm, &now_tm, &alrm->time); | ||
246 | rtc_tm_to_time(&alarm_tm, &alarm); | ||
247 | rtc_writel(sa1100_rtc, RTAR, alarm); | ||
248 | |||
249 | rtsr = rtc_readl(sa1100_rtc, RTSR); | ||
250 | if (alrm->enabled) | ||
251 | rtsr |= RTSR_ALE; | ||
252 | else | ||
253 | rtsr &= ~RTSR_ALE; | ||
254 | rtc_writel(sa1100_rtc, RTSR, rtsr); | ||
255 | 238 | ||
256 | spin_unlock_irq(&sa1100_rtc->lock); | 239 | spin_lock_irq(&sa1100_rtc_lock); |
240 | ret = rtc_update_alarm(&alrm->time); | ||
241 | if (ret == 0) { | ||
242 | if (alrm->enabled) | ||
243 | RTSR |= RTSR_ALE; | ||
244 | else | ||
245 | RTSR &= ~RTSR_ALE; | ||
246 | } | ||
247 | spin_unlock_irq(&sa1100_rtc_lock); | ||
257 | 248 | ||
258 | return 0; | 249 | return ret; |
259 | } | 250 | } |
260 | 251 | ||
261 | static int sa1100_rtc_proc(struct device *dev, struct seq_file *seq) | 252 | static int sa1100_rtc_proc(struct device *dev, struct seq_file *seq) |
262 | { | 253 | { |
263 | struct sa1100_rtc *sa1100_rtc = dev_get_drvdata(dev); | 254 | seq_printf(seq, "trim/divider\t\t: 0x%08x\n", (u32) RTTR); |
255 | seq_printf(seq, "RTSR\t\t\t: 0x%08x\n", (u32)RTSR); | ||
264 | 256 | ||
265 | seq_printf(seq, "trim/divider\t\t: 0x%08x\n", | ||
266 | rtc_readl(sa1100_rtc, RTTR)); | ||
267 | seq_printf(seq, "RTSR\t\t\t: 0x%08x\n", | ||
268 | rtc_readl(sa1100_rtc, RTSR)); | ||
269 | return 0; | 257 | return 0; |
270 | } | 258 | } |
271 | 259 | ||
@@ -282,51 +270,7 @@ static const struct rtc_class_ops sa1100_rtc_ops = { | |||
282 | 270 | ||
283 | static int sa1100_rtc_probe(struct platform_device *pdev) | 271 | static int sa1100_rtc_probe(struct platform_device *pdev) |
284 | { | 272 | { |
285 | struct sa1100_rtc *sa1100_rtc; | 273 | struct rtc_device *rtc; |
286 | unsigned int rttr; | ||
287 | int ret; | ||
288 | |||
289 | sa1100_rtc = kzalloc(sizeof(struct sa1100_rtc), GFP_KERNEL); | ||
290 | if (!sa1100_rtc) | ||
291 | return -ENOMEM; | ||
292 | |||
293 | spin_lock_init(&sa1100_rtc->lock); | ||
294 | platform_set_drvdata(pdev, sa1100_rtc); | ||
295 | |||
296 | ret = -ENXIO; | ||
297 | sa1100_rtc->ress = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
298 | if (!sa1100_rtc->ress) { | ||
299 | dev_err(&pdev->dev, "No I/O memory resource defined\n"); | ||
300 | goto err_ress; | ||
301 | } | ||
302 | |||
303 | sa1100_rtc->irq_1Hz = platform_get_irq(pdev, 0); | ||
304 | if (sa1100_rtc->irq_1Hz < 0) { | ||
305 | dev_err(&pdev->dev, "No 1Hz IRQ resource defined\n"); | ||
306 | goto err_ress; | ||
307 | } | ||
308 | sa1100_rtc->irq_Alrm = platform_get_irq(pdev, 1); | ||
309 | if (sa1100_rtc->irq_Alrm < 0) { | ||
310 | dev_err(&pdev->dev, "No alarm IRQ resource defined\n"); | ||
311 | goto err_ress; | ||
312 | } | ||
313 | |||
314 | ret = -ENOMEM; | ||
315 | sa1100_rtc->base = ioremap(sa1100_rtc->ress->start, | ||
316 | resource_size(sa1100_rtc->ress)); | ||
317 | if (!sa1100_rtc->base) { | ||
318 | dev_err(&pdev->dev, "Unable to map pxa RTC I/O memory\n"); | ||
319 | goto err_map; | ||
320 | } | ||
321 | |||
322 | sa1100_rtc->clk = clk_get(&pdev->dev, NULL); | ||
323 | if (IS_ERR(sa1100_rtc->clk)) { | ||
324 | dev_err(&pdev->dev, "failed to find rtc clock source\n"); | ||
325 | ret = PTR_ERR(sa1100_rtc->clk); | ||
326 | goto err_clk; | ||
327 | } | ||
328 | clk_prepare(sa1100_rtc->clk); | ||
329 | clk_enable(sa1100_rtc->clk); | ||
330 | 274 | ||
331 | /* | 275 | /* |
332 | * According to the manual we should be able to let RTTR be zero | 276 | * According to the manual we should be able to let RTTR be zero |
@@ -335,24 +279,24 @@ static int sa1100_rtc_probe(struct platform_device *pdev) | |||
335 | * If the clock divider is uninitialized then reset it to the | 279 | * If the clock divider is uninitialized then reset it to the |
336 | * default value to get the 1Hz clock. | 280 | * default value to get the 1Hz clock. |
337 | */ | 281 | */ |
338 | if (rtc_readl(sa1100_rtc, RTTR) == 0) { | 282 | if (RTTR == 0) { |
339 | rttr = RTC_DEF_DIVIDER + (RTC_DEF_TRIM << 16); | 283 | RTTR = RTC_DEF_DIVIDER + (RTC_DEF_TRIM << 16); |
340 | rtc_writel(sa1100_rtc, RTTR, rttr); | 284 | dev_warn(&pdev->dev, "warning: " |
341 | dev_warn(&pdev->dev, "warning: initializing default clock" | 285 | "initializing default clock divider/trim value\n"); |
342 | " divider/trim value\n"); | ||
343 | /* The current RTC value probably doesn't make sense either */ | 286 | /* The current RTC value probably doesn't make sense either */ |
344 | rtc_writel(sa1100_rtc, RCNR, 0); | 287 | RCNR = 0; |
345 | } | 288 | } |
346 | 289 | ||
347 | device_init_wakeup(&pdev->dev, 1); | 290 | device_init_wakeup(&pdev->dev, 1); |
348 | 291 | ||
349 | sa1100_rtc->rtc = rtc_device_register(pdev->name, &pdev->dev, | 292 | rtc = rtc_device_register(pdev->name, &pdev->dev, &sa1100_rtc_ops, |
350 | &sa1100_rtc_ops, THIS_MODULE); | 293 | THIS_MODULE); |
351 | if (IS_ERR(sa1100_rtc->rtc)) { | 294 | |
352 | dev_err(&pdev->dev, "Failed to register RTC device -> %d\n", | 295 | if (IS_ERR(rtc)) |
353 | ret); | 296 | return PTR_ERR(rtc); |
354 | goto err_rtc_reg; | 297 | |
355 | } | 298 | platform_set_drvdata(pdev, rtc); |
299 | |||
356 | /* Fix for a nasty initialization problem the in SA11xx RTSR register. | 300 | /* Fix for a nasty initialization problem the in SA11xx RTSR register. |
357 | * See also the comments in sa1100_rtc_interrupt(). | 301 | * See also the comments in sa1100_rtc_interrupt(). |
358 | * | 302 | * |
@@ -375,46 +319,33 @@ static int sa1100_rtc_probe(struct platform_device *pdev) | |||
375 | * | 319 | * |
376 | * Notice that clearing bit 1 and 0 is accomplished by writting ONES to | 320 | * Notice that clearing bit 1 and 0 is accomplished by writting ONES to |
377 | * the corresponding bits in RTSR. */ | 321 | * the corresponding bits in RTSR. */ |
378 | rtc_writel(sa1100_rtc, RTSR, (RTSR_AL | RTSR_HZ)); | 322 | RTSR = RTSR_AL | RTSR_HZ; |
379 | 323 | ||
380 | return 0; | 324 | return 0; |
381 | |||
382 | err_rtc_reg: | ||
383 | err_clk: | ||
384 | iounmap(sa1100_rtc->base); | ||
385 | err_ress: | ||
386 | err_map: | ||
387 | kfree(sa1100_rtc); | ||
388 | return ret; | ||
389 | } | 325 | } |
390 | 326 | ||
391 | static int sa1100_rtc_remove(struct platform_device *pdev) | 327 | static int sa1100_rtc_remove(struct platform_device *pdev) |
392 | { | 328 | { |
393 | struct sa1100_rtc *sa1100_rtc = platform_get_drvdata(pdev); | 329 | struct rtc_device *rtc = platform_get_drvdata(pdev); |
330 | |||
331 | if (rtc) | ||
332 | rtc_device_unregister(rtc); | ||
394 | 333 | ||
395 | rtc_device_unregister(sa1100_rtc->rtc); | ||
396 | clk_disable(sa1100_rtc->clk); | ||
397 | clk_unprepare(sa1100_rtc->clk); | ||
398 | iounmap(sa1100_rtc->base); | ||
399 | return 0; | 334 | return 0; |
400 | } | 335 | } |
401 | 336 | ||
402 | #ifdef CONFIG_PM | 337 | #ifdef CONFIG_PM |
403 | static int sa1100_rtc_suspend(struct device *dev) | 338 | static int sa1100_rtc_suspend(struct device *dev) |
404 | { | 339 | { |
405 | struct sa1100_rtc *sa1100_rtc = dev_get_drvdata(dev); | ||
406 | |||
407 | if (device_may_wakeup(dev)) | 340 | if (device_may_wakeup(dev)) |
408 | enable_irq_wake(sa1100_rtc->irq_Alrm); | 341 | enable_irq_wake(IRQ_RTCAlrm); |
409 | return 0; | 342 | return 0; |
410 | } | 343 | } |
411 | 344 | ||
412 | static int sa1100_rtc_resume(struct device *dev) | 345 | static int sa1100_rtc_resume(struct device *dev) |
413 | { | 346 | { |
414 | struct sa1100_rtc *sa1100_rtc = dev_get_drvdata(dev); | ||
415 | |||
416 | if (device_may_wakeup(dev)) | 347 | if (device_may_wakeup(dev)) |
417 | disable_irq_wake(sa1100_rtc->irq_Alrm); | 348 | disable_irq_wake(IRQ_RTCAlrm); |
418 | return 0; | 349 | return 0; |
419 | } | 350 | } |
420 | 351 | ||
diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c index eef27a197c00..110137e7ec81 100644 --- a/drivers/s390/block/dasd.c +++ b/drivers/s390/block/dasd.c | |||
@@ -3261,6 +3261,12 @@ void dasd_generic_path_event(struct ccw_device *cdev, int *path_event) | |||
3261 | device->path_data.tbvpm |= eventlpm; | 3261 | device->path_data.tbvpm |= eventlpm; |
3262 | dasd_schedule_device_bh(device); | 3262 | dasd_schedule_device_bh(device); |
3263 | } | 3263 | } |
3264 | if (path_event[chp] & PE_PATHGROUP_ESTABLISHED) { | ||
3265 | DBF_DEV_EVENT(DBF_WARNING, device, "%s", | ||
3266 | "Pathgroup re-established\n"); | ||
3267 | if (device->discipline->kick_validate) | ||
3268 | device->discipline->kick_validate(device); | ||
3269 | } | ||
3264 | } | 3270 | } |
3265 | dasd_put_device(device); | 3271 | dasd_put_device(device); |
3266 | } | 3272 | } |
diff --git a/drivers/s390/block/dasd_alias.c b/drivers/s390/block/dasd_alias.c index 553b3c5abb0a..b3beed5434e4 100644 --- a/drivers/s390/block/dasd_alias.c +++ b/drivers/s390/block/dasd_alias.c | |||
@@ -189,14 +189,12 @@ int dasd_alias_make_device_known_to_lcu(struct dasd_device *device) | |||
189 | unsigned long flags; | 189 | unsigned long flags; |
190 | struct alias_server *server, *newserver; | 190 | struct alias_server *server, *newserver; |
191 | struct alias_lcu *lcu, *newlcu; | 191 | struct alias_lcu *lcu, *newlcu; |
192 | int is_lcu_known; | ||
193 | struct dasd_uid uid; | 192 | struct dasd_uid uid; |
194 | 193 | ||
195 | private = (struct dasd_eckd_private *) device->private; | 194 | private = (struct dasd_eckd_private *) device->private; |
196 | 195 | ||
197 | device->discipline->get_uid(device, &uid); | 196 | device->discipline->get_uid(device, &uid); |
198 | spin_lock_irqsave(&aliastree.lock, flags); | 197 | spin_lock_irqsave(&aliastree.lock, flags); |
199 | is_lcu_known = 1; | ||
200 | server = _find_server(&uid); | 198 | server = _find_server(&uid); |
201 | if (!server) { | 199 | if (!server) { |
202 | spin_unlock_irqrestore(&aliastree.lock, flags); | 200 | spin_unlock_irqrestore(&aliastree.lock, flags); |
@@ -208,7 +206,6 @@ int dasd_alias_make_device_known_to_lcu(struct dasd_device *device) | |||
208 | if (!server) { | 206 | if (!server) { |
209 | list_add(&newserver->server, &aliastree.serverlist); | 207 | list_add(&newserver->server, &aliastree.serverlist); |
210 | server = newserver; | 208 | server = newserver; |
211 | is_lcu_known = 0; | ||
212 | } else { | 209 | } else { |
213 | /* someone was faster */ | 210 | /* someone was faster */ |
214 | _free_server(newserver); | 211 | _free_server(newserver); |
@@ -226,12 +223,10 @@ int dasd_alias_make_device_known_to_lcu(struct dasd_device *device) | |||
226 | if (!lcu) { | 223 | if (!lcu) { |
227 | list_add(&newlcu->lcu, &server->lculist); | 224 | list_add(&newlcu->lcu, &server->lculist); |
228 | lcu = newlcu; | 225 | lcu = newlcu; |
229 | is_lcu_known = 0; | ||
230 | } else { | 226 | } else { |
231 | /* someone was faster */ | 227 | /* someone was faster */ |
232 | _free_lcu(newlcu); | 228 | _free_lcu(newlcu); |
233 | } | 229 | } |
234 | is_lcu_known = 0; | ||
235 | } | 230 | } |
236 | spin_lock(&lcu->lock); | 231 | spin_lock(&lcu->lock); |
237 | list_add(&device->alias_list, &lcu->inactive_devices); | 232 | list_add(&device->alias_list, &lcu->inactive_devices); |
@@ -239,64 +234,7 @@ int dasd_alias_make_device_known_to_lcu(struct dasd_device *device) | |||
239 | spin_unlock(&lcu->lock); | 234 | spin_unlock(&lcu->lock); |
240 | spin_unlock_irqrestore(&aliastree.lock, flags); | 235 | spin_unlock_irqrestore(&aliastree.lock, flags); |
241 | 236 | ||
242 | return is_lcu_known; | 237 | return 0; |
243 | } | ||
244 | |||
245 | /* | ||
246 | * The first device to be registered on an LCU will have to do | ||
247 | * some additional setup steps to configure that LCU on the | ||
248 | * storage server. All further devices should wait with their | ||
249 | * initialization until the first device is done. | ||
250 | * To synchronize this work, the first device will call | ||
251 | * dasd_alias_lcu_setup_complete when it is done, and all | ||
252 | * other devices will wait for it with dasd_alias_wait_for_lcu_setup. | ||
253 | */ | ||
254 | void dasd_alias_lcu_setup_complete(struct dasd_device *device) | ||
255 | { | ||
256 | unsigned long flags; | ||
257 | struct alias_server *server; | ||
258 | struct alias_lcu *lcu; | ||
259 | struct dasd_uid uid; | ||
260 | |||
261 | device->discipline->get_uid(device, &uid); | ||
262 | lcu = NULL; | ||
263 | spin_lock_irqsave(&aliastree.lock, flags); | ||
264 | server = _find_server(&uid); | ||
265 | if (server) | ||
266 | lcu = _find_lcu(server, &uid); | ||
267 | spin_unlock_irqrestore(&aliastree.lock, flags); | ||
268 | if (!lcu) { | ||
269 | DBF_EVENT_DEVID(DBF_ERR, device->cdev, | ||
270 | "could not find lcu for %04x %02x", | ||
271 | uid.ssid, uid.real_unit_addr); | ||
272 | WARN_ON(1); | ||
273 | return; | ||
274 | } | ||
275 | complete_all(&lcu->lcu_setup); | ||
276 | } | ||
277 | |||
278 | void dasd_alias_wait_for_lcu_setup(struct dasd_device *device) | ||
279 | { | ||
280 | unsigned long flags; | ||
281 | struct alias_server *server; | ||
282 | struct alias_lcu *lcu; | ||
283 | struct dasd_uid uid; | ||
284 | |||
285 | device->discipline->get_uid(device, &uid); | ||
286 | lcu = NULL; | ||
287 | spin_lock_irqsave(&aliastree.lock, flags); | ||
288 | server = _find_server(&uid); | ||
289 | if (server) | ||
290 | lcu = _find_lcu(server, &uid); | ||
291 | spin_unlock_irqrestore(&aliastree.lock, flags); | ||
292 | if (!lcu) { | ||
293 | DBF_EVENT_DEVID(DBF_ERR, device->cdev, | ||
294 | "could not find lcu for %04x %02x", | ||
295 | uid.ssid, uid.real_unit_addr); | ||
296 | WARN_ON(1); | ||
297 | return; | ||
298 | } | ||
299 | wait_for_completion(&lcu->lcu_setup); | ||
300 | } | 238 | } |
301 | 239 | ||
302 | /* | 240 | /* |
diff --git a/drivers/s390/block/dasd_eckd.c b/drivers/s390/block/dasd_eckd.c index bbcd5e9206ee..70880be26015 100644 --- a/drivers/s390/block/dasd_eckd.c +++ b/drivers/s390/block/dasd_eckd.c | |||
@@ -1534,6 +1534,10 @@ static void dasd_eckd_validate_server(struct dasd_device *device) | |||
1534 | struct dasd_eckd_private *private; | 1534 | struct dasd_eckd_private *private; |
1535 | int enable_pav; | 1535 | int enable_pav; |
1536 | 1536 | ||
1537 | private = (struct dasd_eckd_private *) device->private; | ||
1538 | if (private->uid.type == UA_BASE_PAV_ALIAS || | ||
1539 | private->uid.type == UA_HYPER_PAV_ALIAS) | ||
1540 | return; | ||
1537 | if (dasd_nopav || MACHINE_IS_VM) | 1541 | if (dasd_nopav || MACHINE_IS_VM) |
1538 | enable_pav = 0; | 1542 | enable_pav = 0; |
1539 | else | 1543 | else |
@@ -1542,11 +1546,28 @@ static void dasd_eckd_validate_server(struct dasd_device *device) | |||
1542 | 1546 | ||
1543 | /* may be requested feature is not available on server, | 1547 | /* may be requested feature is not available on server, |
1544 | * therefore just report error and go ahead */ | 1548 | * therefore just report error and go ahead */ |
1545 | private = (struct dasd_eckd_private *) device->private; | ||
1546 | DBF_EVENT_DEVID(DBF_WARNING, device->cdev, "PSF-SSC for SSID %04x " | 1549 | DBF_EVENT_DEVID(DBF_WARNING, device->cdev, "PSF-SSC for SSID %04x " |
1547 | "returned rc=%d", private->uid.ssid, rc); | 1550 | "returned rc=%d", private->uid.ssid, rc); |
1548 | } | 1551 | } |
1549 | 1552 | ||
1553 | /* | ||
1554 | * worker to do a validate server in case of a lost pathgroup | ||
1555 | */ | ||
1556 | static void dasd_eckd_do_validate_server(struct work_struct *work) | ||
1557 | { | ||
1558 | struct dasd_device *device = container_of(work, struct dasd_device, | ||
1559 | kick_validate); | ||
1560 | dasd_eckd_validate_server(device); | ||
1561 | dasd_put_device(device); | ||
1562 | } | ||
1563 | |||
1564 | static void dasd_eckd_kick_validate_server(struct dasd_device *device) | ||
1565 | { | ||
1566 | dasd_get_device(device); | ||
1567 | /* queue call to do_validate_server to the kernel event daemon. */ | ||
1568 | schedule_work(&device->kick_validate); | ||
1569 | } | ||
1570 | |||
1550 | static u32 get_fcx_max_data(struct dasd_device *device) | 1571 | static u32 get_fcx_max_data(struct dasd_device *device) |
1551 | { | 1572 | { |
1552 | #if defined(CONFIG_64BIT) | 1573 | #if defined(CONFIG_64BIT) |
@@ -1588,10 +1609,13 @@ dasd_eckd_check_characteristics(struct dasd_device *device) | |||
1588 | struct dasd_eckd_private *private; | 1609 | struct dasd_eckd_private *private; |
1589 | struct dasd_block *block; | 1610 | struct dasd_block *block; |
1590 | struct dasd_uid temp_uid; | 1611 | struct dasd_uid temp_uid; |
1591 | int is_known, rc, i; | 1612 | int rc, i; |
1592 | int readonly; | 1613 | int readonly; |
1593 | unsigned long value; | 1614 | unsigned long value; |
1594 | 1615 | ||
1616 | /* setup work queue for validate server*/ | ||
1617 | INIT_WORK(&device->kick_validate, dasd_eckd_do_validate_server); | ||
1618 | |||
1595 | if (!ccw_device_is_pathgroup(device->cdev)) { | 1619 | if (!ccw_device_is_pathgroup(device->cdev)) { |
1596 | dev_warn(&device->cdev->dev, | 1620 | dev_warn(&device->cdev->dev, |
1597 | "A channel path group could not be established\n"); | 1621 | "A channel path group could not be established\n"); |
@@ -1651,22 +1675,12 @@ dasd_eckd_check_characteristics(struct dasd_device *device) | |||
1651 | block->base = device; | 1675 | block->base = device; |
1652 | } | 1676 | } |
1653 | 1677 | ||
1654 | /* register lcu with alias handling, enable PAV if this is a new lcu */ | 1678 | /* register lcu with alias handling, enable PAV */ |
1655 | is_known = dasd_alias_make_device_known_to_lcu(device); | 1679 | rc = dasd_alias_make_device_known_to_lcu(device); |
1656 | if (is_known < 0) { | 1680 | if (rc) |
1657 | rc = is_known; | ||
1658 | goto out_err2; | 1681 | goto out_err2; |
1659 | } | 1682 | |
1660 | /* | 1683 | dasd_eckd_validate_server(device); |
1661 | * dasd_eckd_validate_server is done on the first device that | ||
1662 | * is found for an LCU. All later other devices have to wait | ||
1663 | * for it, so they will read the correct feature codes. | ||
1664 | */ | ||
1665 | if (!is_known) { | ||
1666 | dasd_eckd_validate_server(device); | ||
1667 | dasd_alias_lcu_setup_complete(device); | ||
1668 | } else | ||
1669 | dasd_alias_wait_for_lcu_setup(device); | ||
1670 | 1684 | ||
1671 | /* device may report different configuration data after LCU setup */ | 1685 | /* device may report different configuration data after LCU setup */ |
1672 | rc = dasd_eckd_read_conf(device); | 1686 | rc = dasd_eckd_read_conf(device); |
@@ -4098,7 +4112,7 @@ static int dasd_eckd_restore_device(struct dasd_device *device) | |||
4098 | { | 4112 | { |
4099 | struct dasd_eckd_private *private; | 4113 | struct dasd_eckd_private *private; |
4100 | struct dasd_eckd_characteristics temp_rdc_data; | 4114 | struct dasd_eckd_characteristics temp_rdc_data; |
4101 | int is_known, rc; | 4115 | int rc; |
4102 | struct dasd_uid temp_uid; | 4116 | struct dasd_uid temp_uid; |
4103 | unsigned long flags; | 4117 | unsigned long flags; |
4104 | 4118 | ||
@@ -4121,14 +4135,10 @@ static int dasd_eckd_restore_device(struct dasd_device *device) | |||
4121 | goto out_err; | 4135 | goto out_err; |
4122 | 4136 | ||
4123 | /* register lcu with alias handling, enable PAV if this is a new lcu */ | 4137 | /* register lcu with alias handling, enable PAV if this is a new lcu */ |
4124 | is_known = dasd_alias_make_device_known_to_lcu(device); | 4138 | rc = dasd_alias_make_device_known_to_lcu(device); |
4125 | if (is_known < 0) | 4139 | if (rc) |
4126 | return is_known; | 4140 | return rc; |
4127 | if (!is_known) { | 4141 | dasd_eckd_validate_server(device); |
4128 | dasd_eckd_validate_server(device); | ||
4129 | dasd_alias_lcu_setup_complete(device); | ||
4130 | } else | ||
4131 | dasd_alias_wait_for_lcu_setup(device); | ||
4132 | 4142 | ||
4133 | /* RE-Read Configuration Data */ | 4143 | /* RE-Read Configuration Data */ |
4134 | rc = dasd_eckd_read_conf(device); | 4144 | rc = dasd_eckd_read_conf(device); |
@@ -4270,6 +4280,7 @@ static struct dasd_discipline dasd_eckd_discipline = { | |||
4270 | .restore = dasd_eckd_restore_device, | 4280 | .restore = dasd_eckd_restore_device, |
4271 | .reload = dasd_eckd_reload_device, | 4281 | .reload = dasd_eckd_reload_device, |
4272 | .get_uid = dasd_eckd_get_uid, | 4282 | .get_uid = dasd_eckd_get_uid, |
4283 | .kick_validate = dasd_eckd_kick_validate_server, | ||
4273 | }; | 4284 | }; |
4274 | 4285 | ||
4275 | static int __init | 4286 | static int __init |
diff --git a/drivers/s390/block/dasd_int.h b/drivers/s390/block/dasd_int.h index afe8c33422ed..33a6743ddc55 100644 --- a/drivers/s390/block/dasd_int.h +++ b/drivers/s390/block/dasd_int.h | |||
@@ -355,6 +355,7 @@ struct dasd_discipline { | |||
355 | int (*reload) (struct dasd_device *); | 355 | int (*reload) (struct dasd_device *); |
356 | 356 | ||
357 | int (*get_uid) (struct dasd_device *, struct dasd_uid *); | 357 | int (*get_uid) (struct dasd_device *, struct dasd_uid *); |
358 | void (*kick_validate) (struct dasd_device *); | ||
358 | }; | 359 | }; |
359 | 360 | ||
360 | extern struct dasd_discipline *dasd_diag_discipline_pointer; | 361 | extern struct dasd_discipline *dasd_diag_discipline_pointer; |
@@ -455,6 +456,7 @@ struct dasd_device { | |||
455 | struct work_struct kick_work; | 456 | struct work_struct kick_work; |
456 | struct work_struct restore_device; | 457 | struct work_struct restore_device; |
457 | struct work_struct reload_device; | 458 | struct work_struct reload_device; |
459 | struct work_struct kick_validate; | ||
458 | struct timer_list timer; | 460 | struct timer_list timer; |
459 | 461 | ||
460 | debug_info_t *debug_area; | 462 | debug_info_t *debug_area; |
diff --git a/drivers/scsi/mac_esp.c b/drivers/scsi/mac_esp.c index 4ceeace80453..70eb1f79b1ba 100644 --- a/drivers/scsi/mac_esp.c +++ b/drivers/scsi/mac_esp.c | |||
@@ -565,8 +565,7 @@ static int __devinit esp_mac_probe(struct platform_device *dev) | |||
565 | esp_chips[dev->id] = esp; | 565 | esp_chips[dev->id] = esp; |
566 | mb(); | 566 | mb(); |
567 | if (esp_chips[!dev->id] == NULL) { | 567 | if (esp_chips[!dev->id] == NULL) { |
568 | err = request_irq(host->irq, mac_scsi_esp_intr, 0, | 568 | err = request_irq(host->irq, mac_scsi_esp_intr, 0, "ESP", NULL); |
569 | "Mac ESP", NULL); | ||
570 | if (err < 0) { | 569 | if (err < 0) { |
571 | esp_chips[dev->id] = NULL; | 570 | esp_chips[dev->id] = NULL; |
572 | goto fail_free_priv; | 571 | goto fail_free_priv; |
diff --git a/drivers/scsi/mac_scsi.c b/drivers/scsi/mac_scsi.c index ea2bde206f7f..2bccfbe5661e 100644 --- a/drivers/scsi/mac_scsi.c +++ b/drivers/scsi/mac_scsi.c | |||
@@ -339,9 +339,6 @@ static void mac_scsi_reset_boot(struct Scsi_Host *instance) | |||
339 | 339 | ||
340 | printk(KERN_INFO "Macintosh SCSI: resetting the SCSI bus..." ); | 340 | printk(KERN_INFO "Macintosh SCSI: resetting the SCSI bus..." ); |
341 | 341 | ||
342 | /* switch off SCSI IRQ - catch an interrupt without IRQ bit set else */ | ||
343 | disable_irq(IRQ_MAC_SCSI); | ||
344 | |||
345 | /* get in phase */ | 342 | /* get in phase */ |
346 | NCR5380_write( TARGET_COMMAND_REG, | 343 | NCR5380_write( TARGET_COMMAND_REG, |
347 | PHASE_SR_TO_TCR( NCR5380_read(STATUS_REG) )); | 344 | PHASE_SR_TO_TCR( NCR5380_read(STATUS_REG) )); |
@@ -357,9 +354,6 @@ static void mac_scsi_reset_boot(struct Scsi_Host *instance) | |||
357 | for( end = jiffies + AFTER_RESET_DELAY; time_before(jiffies, end); ) | 354 | for( end = jiffies + AFTER_RESET_DELAY; time_before(jiffies, end); ) |
358 | barrier(); | 355 | barrier(); |
359 | 356 | ||
360 | /* switch on SCSI IRQ again */ | ||
361 | enable_irq(IRQ_MAC_SCSI); | ||
362 | |||
363 | printk(KERN_INFO " done\n" ); | 357 | printk(KERN_INFO " done\n" ); |
364 | } | 358 | } |
365 | #endif | 359 | #endif |
diff --git a/drivers/thermal/thermal_sys.c b/drivers/thermal/thermal_sys.c index dd9a5743fa99..220ce7e31cf5 100644 --- a/drivers/thermal/thermal_sys.c +++ b/drivers/thermal/thermal_sys.c | |||
@@ -1304,7 +1304,7 @@ static struct genl_multicast_group thermal_event_mcgrp = { | |||
1304 | .name = THERMAL_GENL_MCAST_GROUP_NAME, | 1304 | .name = THERMAL_GENL_MCAST_GROUP_NAME, |
1305 | }; | 1305 | }; |
1306 | 1306 | ||
1307 | int generate_netlink_event(u32 orig, enum events event) | 1307 | int thermal_generate_netlink_event(u32 orig, enum events event) |
1308 | { | 1308 | { |
1309 | struct sk_buff *skb; | 1309 | struct sk_buff *skb; |
1310 | struct nlattr *attr; | 1310 | struct nlattr *attr; |
@@ -1363,7 +1363,7 @@ int generate_netlink_event(u32 orig, enum events event) | |||
1363 | 1363 | ||
1364 | return result; | 1364 | return result; |
1365 | } | 1365 | } |
1366 | EXPORT_SYMBOL(generate_netlink_event); | 1366 | EXPORT_SYMBOL(thermal_generate_netlink_event); |
1367 | 1367 | ||
1368 | static int genetlink_init(void) | 1368 | static int genetlink_init(void) |
1369 | { | 1369 | { |
diff --git a/drivers/tty/serial/8250.c b/drivers/tty/serial/8250/8250.c index 9f50c4e3c2be..9f50c4e3c2be 100644 --- a/drivers/tty/serial/8250.c +++ b/drivers/tty/serial/8250/8250.c | |||
diff --git a/drivers/tty/serial/8250.h b/drivers/tty/serial/8250/8250.h index ae027be57e25..ae027be57e25 100644 --- a/drivers/tty/serial/8250.h +++ b/drivers/tty/serial/8250/8250.h | |||
diff --git a/drivers/tty/serial/8250_accent.c b/drivers/tty/serial/8250/8250_accent.c index 34b51c651192..34b51c651192 100644 --- a/drivers/tty/serial/8250_accent.c +++ b/drivers/tty/serial/8250/8250_accent.c | |||
diff --git a/drivers/tty/serial/8250_acorn.c b/drivers/tty/serial/8250/8250_acorn.c index b0ce8c56f1a4..b0ce8c56f1a4 100644 --- a/drivers/tty/serial/8250_acorn.c +++ b/drivers/tty/serial/8250/8250_acorn.c | |||
diff --git a/drivers/tty/serial/8250_boca.c b/drivers/tty/serial/8250/8250_boca.c index d125dc107985..d125dc107985 100644 --- a/drivers/tty/serial/8250_boca.c +++ b/drivers/tty/serial/8250/8250_boca.c | |||
diff --git a/drivers/tty/serial/8250_dw.c b/drivers/tty/serial/8250/8250_dw.c index f574eef3075f..f574eef3075f 100644 --- a/drivers/tty/serial/8250_dw.c +++ b/drivers/tty/serial/8250/8250_dw.c | |||
diff --git a/drivers/tty/serial/8250_early.c b/drivers/tty/serial/8250/8250_early.c index eaafb98debed..eaafb98debed 100644 --- a/drivers/tty/serial/8250_early.c +++ b/drivers/tty/serial/8250/8250_early.c | |||
diff --git a/drivers/tty/serial/8250_exar_st16c554.c b/drivers/tty/serial/8250/8250_exar_st16c554.c index bf53aabf9b5e..bf53aabf9b5e 100644 --- a/drivers/tty/serial/8250_exar_st16c554.c +++ b/drivers/tty/serial/8250/8250_exar_st16c554.c | |||
diff --git a/drivers/tty/serial/8250_fourport.c b/drivers/tty/serial/8250/8250_fourport.c index be1582609626..be1582609626 100644 --- a/drivers/tty/serial/8250_fourport.c +++ b/drivers/tty/serial/8250/8250_fourport.c | |||
diff --git a/drivers/tty/serial/8250_fsl.c b/drivers/tty/serial/8250/8250_fsl.c index f4d3c47b88e8..f4d3c47b88e8 100644 --- a/drivers/tty/serial/8250_fsl.c +++ b/drivers/tty/serial/8250/8250_fsl.c | |||
diff --git a/drivers/tty/serial/8250_gsc.c b/drivers/tty/serial/8250/8250_gsc.c index d8c0ffbfa6e3..d8c0ffbfa6e3 100644 --- a/drivers/tty/serial/8250_gsc.c +++ b/drivers/tty/serial/8250/8250_gsc.c | |||
diff --git a/drivers/tty/serial/8250_hp300.c b/drivers/tty/serial/8250/8250_hp300.c index c13438c93012..c13438c93012 100644 --- a/drivers/tty/serial/8250_hp300.c +++ b/drivers/tty/serial/8250/8250_hp300.c | |||
diff --git a/drivers/tty/serial/8250_hub6.c b/drivers/tty/serial/8250/8250_hub6.c index a5c778e83de0..a5c778e83de0 100644 --- a/drivers/tty/serial/8250_hub6.c +++ b/drivers/tty/serial/8250/8250_hub6.c | |||
diff --git a/drivers/tty/serial/8250_mca.c b/drivers/tty/serial/8250/8250_mca.c index d20abf04541e..d20abf04541e 100644 --- a/drivers/tty/serial/8250_mca.c +++ b/drivers/tty/serial/8250/8250_mca.c | |||
diff --git a/drivers/tty/serial/8250_pci.c b/drivers/tty/serial/8250/8250_pci.c index da2b0b0a183f..da2b0b0a183f 100644 --- a/drivers/tty/serial/8250_pci.c +++ b/drivers/tty/serial/8250/8250_pci.c | |||
diff --git a/drivers/tty/serial/8250_pnp.c b/drivers/tty/serial/8250/8250_pnp.c index a2f236510ff1..a2f236510ff1 100644 --- a/drivers/tty/serial/8250_pnp.c +++ b/drivers/tty/serial/8250/8250_pnp.c | |||
diff --git a/drivers/tty/serial/8250/Kconfig b/drivers/tty/serial/8250/Kconfig new file mode 100644 index 000000000000..591f8018e7dd --- /dev/null +++ b/drivers/tty/serial/8250/Kconfig | |||
@@ -0,0 +1,280 @@ | |||
1 | # | ||
2 | # The 8250/16550 serial drivers. You shouldn't be in this list unless | ||
3 | # you somehow have an implicit or explicit dependency on SERIAL_8250. | ||
4 | # | ||
5 | |||
6 | config SERIAL_8250 | ||
7 | tristate "8250/16550 and compatible serial support" | ||
8 | select SERIAL_CORE | ||
9 | ---help--- | ||
10 | This selects whether you want to include the driver for the standard | ||
11 | serial ports. The standard answer is Y. People who might say N | ||
12 | here are those that are setting up dedicated Ethernet WWW/FTP | ||
13 | servers, or users that have one of the various bus mice instead of a | ||
14 | serial mouse and don't intend to use their machine's standard serial | ||
15 | port for anything. (Note that the Cyclades and Stallion multi | ||
16 | serial port drivers do not need this driver built in for them to | ||
17 | work.) | ||
18 | |||
19 | To compile this driver as a module, choose M here: the | ||
20 | module will be called 8250. | ||
21 | [WARNING: Do not compile this driver as a module if you are using | ||
22 | non-standard serial ports, since the configuration information will | ||
23 | be lost when the driver is unloaded. This limitation may be lifted | ||
24 | in the future.] | ||
25 | |||
26 | BTW1: If you have a mouseman serial mouse which is not recognized by | ||
27 | the X window system, try running gpm first. | ||
28 | |||
29 | BTW2: If you intend to use a software modem (also called Winmodem) | ||
30 | under Linux, forget it. These modems are crippled and require | ||
31 | proprietary drivers which are only available under Windows. | ||
32 | |||
33 | Most people will say Y or M here, so that they can use serial mice, | ||
34 | modems and similar devices connecting to the standard serial ports. | ||
35 | |||
36 | config SERIAL_8250_CONSOLE | ||
37 | bool "Console on 8250/16550 and compatible serial port" | ||
38 | depends on SERIAL_8250=y | ||
39 | select SERIAL_CORE_CONSOLE | ||
40 | ---help--- | ||
41 | If you say Y here, it will be possible to use a serial port as the | ||
42 | system console (the system console is the device which receives all | ||
43 | kernel messages and warnings and which allows logins in single user | ||
44 | mode). This could be useful if some terminal or printer is connected | ||
45 | to that serial port. | ||
46 | |||
47 | Even if you say Y here, the currently visible virtual console | ||
48 | (/dev/tty0) will still be used as the system console by default, but | ||
49 | you can alter that using a kernel command line option such as | ||
50 | "console=ttyS1". (Try "man bootparam" or see the documentation of | ||
51 | your boot loader (grub or lilo or loadlin) about how to pass options | ||
52 | to the kernel at boot time.) | ||
53 | |||
54 | If you don't have a VGA card installed and you say Y here, the | ||
55 | kernel will automatically use the first serial line, /dev/ttyS0, as | ||
56 | system console. | ||
57 | |||
58 | You can set that using a kernel command line option such as | ||
59 | "console=uart8250,io,0x3f8,9600n8" | ||
60 | "console=uart8250,mmio,0xff5e0000,115200n8". | ||
61 | and it will switch to normal serial console when the corresponding | ||
62 | port is ready. | ||
63 | "earlycon=uart8250,io,0x3f8,9600n8" | ||
64 | "earlycon=uart8250,mmio,0xff5e0000,115200n8". | ||
65 | it will not only setup early console. | ||
66 | |||
67 | If unsure, say N. | ||
68 | |||
69 | config FIX_EARLYCON_MEM | ||
70 | bool | ||
71 | depends on X86 | ||
72 | default y | ||
73 | |||
74 | config SERIAL_8250_GSC | ||
75 | tristate | ||
76 | depends on SERIAL_8250 && GSC | ||
77 | default SERIAL_8250 | ||
78 | |||
79 | config SERIAL_8250_PCI | ||
80 | tristate "8250/16550 PCI device support" if EXPERT | ||
81 | depends on SERIAL_8250 && PCI | ||
82 | default SERIAL_8250 | ||
83 | help | ||
84 | This builds standard PCI serial support. You may be able to | ||
85 | disable this feature if you only need legacy serial support. | ||
86 | Saves about 9K. | ||
87 | |||
88 | config SERIAL_8250_PNP | ||
89 | tristate "8250/16550 PNP device support" if EXPERT | ||
90 | depends on SERIAL_8250 && PNP | ||
91 | default SERIAL_8250 | ||
92 | help | ||
93 | This builds standard PNP serial support. You may be able to | ||
94 | disable this feature if you only need legacy serial support. | ||
95 | |||
96 | config SERIAL_8250_HP300 | ||
97 | tristate | ||
98 | depends on SERIAL_8250 && HP300 | ||
99 | default SERIAL_8250 | ||
100 | |||
101 | config SERIAL_8250_CS | ||
102 | tristate "8250/16550 PCMCIA device support" | ||
103 | depends on PCMCIA && SERIAL_8250 | ||
104 | ---help--- | ||
105 | Say Y here to enable support for 16-bit PCMCIA serial devices, | ||
106 | including serial port cards, modems, and the modem functions of | ||
107 | multi-function Ethernet/modem cards. (PCMCIA- or PC-cards are | ||
108 | credit-card size devices often used with laptops.) | ||
109 | |||
110 | To compile this driver as a module, choose M here: the | ||
111 | module will be called serial_cs. | ||
112 | |||
113 | If unsure, say N. | ||
114 | |||
115 | config SERIAL_8250_NR_UARTS | ||
116 | int "Maximum number of 8250/16550 serial ports" | ||
117 | depends on SERIAL_8250 | ||
118 | default "4" | ||
119 | help | ||
120 | Set this to the number of serial ports you want the driver | ||
121 | to support. This includes any ports discovered via ACPI or | ||
122 | PCI enumeration and any ports that may be added at run-time | ||
123 | via hot-plug, or any ISA multi-port serial cards. | ||
124 | |||
125 | config SERIAL_8250_RUNTIME_UARTS | ||
126 | int "Number of 8250/16550 serial ports to register at runtime" | ||
127 | depends on SERIAL_8250 | ||
128 | range 0 SERIAL_8250_NR_UARTS | ||
129 | default "4" | ||
130 | help | ||
131 | Set this to the maximum number of serial ports you want | ||
132 | the kernel to register at boot time. This can be overridden | ||
133 | with the module parameter "nr_uarts", or boot-time parameter | ||
134 | 8250.nr_uarts | ||
135 | |||
136 | config SERIAL_8250_EXTENDED | ||
137 | bool "Extended 8250/16550 serial driver options" | ||
138 | depends on SERIAL_8250 | ||
139 | help | ||
140 | If you wish to use any non-standard features of the standard "dumb" | ||
141 | driver, say Y here. This includes HUB6 support, shared serial | ||
142 | interrupts, special multiport support, support for more than the | ||
143 | four COM 1/2/3/4 boards, etc. | ||
144 | |||
145 | Note that the answer to this question won't directly affect the | ||
146 | kernel: saying N will just cause the configurator to skip all | ||
147 | the questions about serial driver options. If unsure, say N. | ||
148 | |||
149 | config SERIAL_8250_MANY_PORTS | ||
150 | bool "Support more than 4 legacy serial ports" | ||
151 | depends on SERIAL_8250_EXTENDED && !IA64 | ||
152 | help | ||
153 | Say Y here if you have dumb serial boards other than the four | ||
154 | standard COM 1/2/3/4 ports. This may happen if you have an AST | ||
155 | FourPort, Accent Async, Boca (read the Boca mini-HOWTO, available | ||
156 | from <http://www.tldp.org/docs.html#howto>), or other custom | ||
157 | serial port hardware which acts similar to standard serial port | ||
158 | hardware. If you only use the standard COM 1/2/3/4 ports, you can | ||
159 | say N here to save some memory. You can also say Y if you have an | ||
160 | "intelligent" multiport card such as Cyclades, Digiboards, etc. | ||
161 | |||
162 | # | ||
163 | # Multi-port serial cards | ||
164 | # | ||
165 | |||
166 | config SERIAL_8250_FOURPORT | ||
167 | tristate "Support Fourport cards" | ||
168 | depends on SERIAL_8250 != n && ISA && SERIAL_8250_MANY_PORTS | ||
169 | help | ||
170 | Say Y here if you have an AST FourPort serial board. | ||
171 | |||
172 | To compile this driver as a module, choose M here: the module | ||
173 | will be called 8250_fourport. | ||
174 | |||
175 | config SERIAL_8250_ACCENT | ||
176 | tristate "Support Accent cards" | ||
177 | depends on SERIAL_8250 != n && ISA && SERIAL_8250_MANY_PORTS | ||
178 | help | ||
179 | Say Y here if you have an Accent Async serial board. | ||
180 | |||
181 | To compile this driver as a module, choose M here: the module | ||
182 | will be called 8250_accent. | ||
183 | |||
184 | config SERIAL_8250_BOCA | ||
185 | tristate "Support Boca cards" | ||
186 | depends on SERIAL_8250 != n && ISA && SERIAL_8250_MANY_PORTS | ||
187 | help | ||
188 | Say Y here if you have a Boca serial board. Please read the Boca | ||
189 | mini-HOWTO, available from <http://www.tldp.org/docs.html#howto> | ||
190 | |||
191 | To compile this driver as a module, choose M here: the module | ||
192 | will be called 8250_boca. | ||
193 | |||
194 | config SERIAL_8250_EXAR_ST16C554 | ||
195 | tristate "Support Exar ST16C554/554D Quad UART" | ||
196 | depends on SERIAL_8250 != n && ISA && SERIAL_8250_MANY_PORTS | ||
197 | help | ||
198 | The Uplogix Envoy TU301 uses this Exar Quad UART. If you are | ||
199 | tinkering with your Envoy TU301, or have a machine with this UART, | ||
200 | say Y here. | ||
201 | |||
202 | To compile this driver as a module, choose M here: the module | ||
203 | will be called 8250_exar_st16c554. | ||
204 | |||
205 | config SERIAL_8250_HUB6 | ||
206 | tristate "Support Hub6 cards" | ||
207 | depends on SERIAL_8250 != n && ISA && SERIAL_8250_MANY_PORTS | ||
208 | help | ||
209 | Say Y here if you have a HUB6 serial board. | ||
210 | |||
211 | To compile this driver as a module, choose M here: the module | ||
212 | will be called 8250_hub6. | ||
213 | |||
214 | # | ||
215 | # Misc. options/drivers. | ||
216 | # | ||
217 | |||
218 | config SERIAL_8250_SHARE_IRQ | ||
219 | bool "Support for sharing serial interrupts" | ||
220 | depends on SERIAL_8250_EXTENDED | ||
221 | help | ||
222 | Some serial boards have hardware support which allows multiple dumb | ||
223 | serial ports on the same board to share a single IRQ. To enable | ||
224 | support for this in the serial driver, say Y here. | ||
225 | |||
226 | config SERIAL_8250_DETECT_IRQ | ||
227 | bool "Autodetect IRQ on standard ports (unsafe)" | ||
228 | depends on SERIAL_8250_EXTENDED | ||
229 | help | ||
230 | Say Y here if you want the kernel to try to guess which IRQ | ||
231 | to use for your serial port. | ||
232 | |||
233 | This is considered unsafe; it is far better to configure the IRQ in | ||
234 | a boot script using the setserial command. | ||
235 | |||
236 | If unsure, say N. | ||
237 | |||
238 | config SERIAL_8250_RSA | ||
239 | bool "Support RSA serial ports" | ||
240 | depends on SERIAL_8250_EXTENDED | ||
241 | help | ||
242 | ::: To be written ::: | ||
243 | |||
244 | config SERIAL_8250_MCA | ||
245 | tristate "Support 8250-type ports on MCA buses" | ||
246 | depends on SERIAL_8250 != n && MCA | ||
247 | help | ||
248 | Say Y here if you have a MCA serial ports. | ||
249 | |||
250 | To compile this driver as a module, choose M here: the module | ||
251 | will be called 8250_mca. | ||
252 | |||
253 | config SERIAL_8250_ACORN | ||
254 | tristate "Acorn expansion card serial port support" | ||
255 | depends on ARCH_ACORN && SERIAL_8250 | ||
256 | help | ||
257 | If you have an Atomwide Serial card or Serial Port card for an Acorn | ||
258 | system, say Y to this option. The driver can handle 1, 2, or 3 port | ||
259 | cards. If unsure, say N. | ||
260 | |||
261 | config SERIAL_8250_RM9K | ||
262 | bool "Support for MIPS RM9xxx integrated serial port" | ||
263 | depends on SERIAL_8250 != n && SERIAL_RM9000 | ||
264 | select SERIAL_8250_SHARE_IRQ | ||
265 | help | ||
266 | Selecting this option will add support for the integrated serial | ||
267 | port hardware found on MIPS RM9122 and similar processors. | ||
268 | If unsure, say N. | ||
269 | |||
270 | config SERIAL_8250_FSL | ||
271 | bool | ||
272 | depends on SERIAL_8250_CONSOLE && PPC_UDBG_16550 | ||
273 | default PPC | ||
274 | |||
275 | config SERIAL_8250_DW | ||
276 | tristate "Support for Synopsys DesignWare 8250 quirks" | ||
277 | depends on SERIAL_8250 && OF | ||
278 | help | ||
279 | Selecting this option will enable handling of the extra features | ||
280 | present in the Synopsys DesignWare APB UART. | ||
diff --git a/drivers/tty/serial/8250/Makefile b/drivers/tty/serial/8250/Makefile new file mode 100644 index 000000000000..867bba738908 --- /dev/null +++ b/drivers/tty/serial/8250/Makefile | |||
@@ -0,0 +1,20 @@ | |||
1 | # | ||
2 | # Makefile for the 8250 serial device drivers. | ||
3 | # | ||
4 | |||
5 | obj-$(CONFIG_SERIAL_8250) += 8250.o | ||
6 | obj-$(CONFIG_SERIAL_8250_PNP) += 8250_pnp.o | ||
7 | obj-$(CONFIG_SERIAL_8250_GSC) += 8250_gsc.o | ||
8 | obj-$(CONFIG_SERIAL_8250_PCI) += 8250_pci.o | ||
9 | obj-$(CONFIG_SERIAL_8250_HP300) += 8250_hp300.o | ||
10 | obj-$(CONFIG_SERIAL_8250_CS) += serial_cs.o | ||
11 | obj-$(CONFIG_SERIAL_8250_ACORN) += 8250_acorn.o | ||
12 | obj-$(CONFIG_SERIAL_8250_CONSOLE) += 8250_early.o | ||
13 | obj-$(CONFIG_SERIAL_8250_FOURPORT) += 8250_fourport.o | ||
14 | obj-$(CONFIG_SERIAL_8250_ACCENT) += 8250_accent.o | ||
15 | obj-$(CONFIG_SERIAL_8250_BOCA) += 8250_boca.o | ||
16 | obj-$(CONFIG_SERIAL_8250_EXAR_ST16C554) += 8250_exar_st16c554.o | ||
17 | obj-$(CONFIG_SERIAL_8250_HUB6) += 8250_hub6.o | ||
18 | obj-$(CONFIG_SERIAL_8250_MCA) += 8250_mca.o | ||
19 | obj-$(CONFIG_SERIAL_8250_FSL) += 8250_fsl.o | ||
20 | obj-$(CONFIG_SERIAL_8250_DW) += 8250_dw.o | ||
diff --git a/drivers/tty/serial/m32r_sio.c b/drivers/tty/serial/8250/m32r_sio.c index 94a6792bf97b..94a6792bf97b 100644 --- a/drivers/tty/serial/m32r_sio.c +++ b/drivers/tty/serial/8250/m32r_sio.c | |||
diff --git a/drivers/tty/serial/m32r_sio.h b/drivers/tty/serial/8250/m32r_sio.h index e9b7e11793b1..e9b7e11793b1 100644 --- a/drivers/tty/serial/m32r_sio.h +++ b/drivers/tty/serial/8250/m32r_sio.h | |||
diff --git a/drivers/tty/serial/m32r_sio_reg.h b/drivers/tty/serial/8250/m32r_sio_reg.h index 4671473793e3..4671473793e3 100644 --- a/drivers/tty/serial/m32r_sio_reg.h +++ b/drivers/tty/serial/8250/m32r_sio_reg.h | |||
diff --git a/drivers/tty/serial/serial_cs.c b/drivers/tty/serial/8250/serial_cs.c index 86090605a84e..86090605a84e 100644 --- a/drivers/tty/serial/serial_cs.c +++ b/drivers/tty/serial/8250/serial_cs.c | |||
diff --git a/drivers/tty/serial/Kconfig b/drivers/tty/serial/Kconfig index aca2386c5ef1..2de99248dfae 100644 --- a/drivers/tty/serial/Kconfig +++ b/drivers/tty/serial/Kconfig | |||
@@ -5,279 +5,7 @@ | |||
5 | menu "Serial drivers" | 5 | menu "Serial drivers" |
6 | depends on HAS_IOMEM | 6 | depends on HAS_IOMEM |
7 | 7 | ||
8 | # | 8 | source "drivers/tty/serial/8250/Kconfig" |
9 | # The new 8250/16550 serial drivers | ||
10 | config SERIAL_8250 | ||
11 | tristate "8250/16550 and compatible serial support" | ||
12 | select SERIAL_CORE | ||
13 | ---help--- | ||
14 | This selects whether you want to include the driver for the standard | ||
15 | serial ports. The standard answer is Y. People who might say N | ||
16 | here are those that are setting up dedicated Ethernet WWW/FTP | ||
17 | servers, or users that have one of the various bus mice instead of a | ||
18 | serial mouse and don't intend to use their machine's standard serial | ||
19 | port for anything. (Note that the Cyclades and Stallion multi | ||
20 | serial port drivers do not need this driver built in for them to | ||
21 | work.) | ||
22 | |||
23 | To compile this driver as a module, choose M here: the | ||
24 | module will be called 8250. | ||
25 | [WARNING: Do not compile this driver as a module if you are using | ||
26 | non-standard serial ports, since the configuration information will | ||
27 | be lost when the driver is unloaded. This limitation may be lifted | ||
28 | in the future.] | ||
29 | |||
30 | BTW1: If you have a mouseman serial mouse which is not recognized by | ||
31 | the X window system, try running gpm first. | ||
32 | |||
33 | BTW2: If you intend to use a software modem (also called Winmodem) | ||
34 | under Linux, forget it. These modems are crippled and require | ||
35 | proprietary drivers which are only available under Windows. | ||
36 | |||
37 | Most people will say Y or M here, so that they can use serial mice, | ||
38 | modems and similar devices connecting to the standard serial ports. | ||
39 | |||
40 | config SERIAL_8250_CONSOLE | ||
41 | bool "Console on 8250/16550 and compatible serial port" | ||
42 | depends on SERIAL_8250=y | ||
43 | select SERIAL_CORE_CONSOLE | ||
44 | ---help--- | ||
45 | If you say Y here, it will be possible to use a serial port as the | ||
46 | system console (the system console is the device which receives all | ||
47 | kernel messages and warnings and which allows logins in single user | ||
48 | mode). This could be useful if some terminal or printer is connected | ||
49 | to that serial port. | ||
50 | |||
51 | Even if you say Y here, the currently visible virtual console | ||
52 | (/dev/tty0) will still be used as the system console by default, but | ||
53 | you can alter that using a kernel command line option such as | ||
54 | "console=ttyS1". (Try "man bootparam" or see the documentation of | ||
55 | your boot loader (grub or lilo or loadlin) about how to pass options | ||
56 | to the kernel at boot time.) | ||
57 | |||
58 | If you don't have a VGA card installed and you say Y here, the | ||
59 | kernel will automatically use the first serial line, /dev/ttyS0, as | ||
60 | system console. | ||
61 | |||
62 | You can set that using a kernel command line option such as | ||
63 | "console=uart8250,io,0x3f8,9600n8" | ||
64 | "console=uart8250,mmio,0xff5e0000,115200n8". | ||
65 | and it will switch to normal serial console when the corresponding | ||
66 | port is ready. | ||
67 | "earlycon=uart8250,io,0x3f8,9600n8" | ||
68 | "earlycon=uart8250,mmio,0xff5e0000,115200n8". | ||
69 | it will not only setup early console. | ||
70 | |||
71 | If unsure, say N. | ||
72 | |||
73 | config FIX_EARLYCON_MEM | ||
74 | bool | ||
75 | depends on X86 | ||
76 | default y | ||
77 | |||
78 | config SERIAL_8250_GSC | ||
79 | tristate | ||
80 | depends on SERIAL_8250 && GSC | ||
81 | default SERIAL_8250 | ||
82 | |||
83 | config SERIAL_8250_PCI | ||
84 | tristate "8250/16550 PCI device support" if EXPERT | ||
85 | depends on SERIAL_8250 && PCI | ||
86 | default SERIAL_8250 | ||
87 | help | ||
88 | This builds standard PCI serial support. You may be able to | ||
89 | disable this feature if you only need legacy serial support. | ||
90 | Saves about 9K. | ||
91 | |||
92 | config SERIAL_8250_PNP | ||
93 | tristate "8250/16550 PNP device support" if EXPERT | ||
94 | depends on SERIAL_8250 && PNP | ||
95 | default SERIAL_8250 | ||
96 | help | ||
97 | This builds standard PNP serial support. You may be able to | ||
98 | disable this feature if you only need legacy serial support. | ||
99 | |||
100 | config SERIAL_8250_FSL | ||
101 | bool | ||
102 | depends on SERIAL_8250_CONSOLE && PPC_UDBG_16550 | ||
103 | default PPC | ||
104 | |||
105 | config SERIAL_8250_HP300 | ||
106 | tristate | ||
107 | depends on SERIAL_8250 && HP300 | ||
108 | default SERIAL_8250 | ||
109 | |||
110 | config SERIAL_8250_CS | ||
111 | tristate "8250/16550 PCMCIA device support" | ||
112 | depends on PCMCIA && SERIAL_8250 | ||
113 | ---help--- | ||
114 | Say Y here to enable support for 16-bit PCMCIA serial devices, | ||
115 | including serial port cards, modems, and the modem functions of | ||
116 | multi-function Ethernet/modem cards. (PCMCIA- or PC-cards are | ||
117 | credit-card size devices often used with laptops.) | ||
118 | |||
119 | To compile this driver as a module, choose M here: the | ||
120 | module will be called serial_cs. | ||
121 | |||
122 | If unsure, say N. | ||
123 | |||
124 | config SERIAL_8250_NR_UARTS | ||
125 | int "Maximum number of 8250/16550 serial ports" | ||
126 | depends on SERIAL_8250 | ||
127 | default "4" | ||
128 | help | ||
129 | Set this to the number of serial ports you want the driver | ||
130 | to support. This includes any ports discovered via ACPI or | ||
131 | PCI enumeration and any ports that may be added at run-time | ||
132 | via hot-plug, or any ISA multi-port serial cards. | ||
133 | |||
134 | config SERIAL_8250_RUNTIME_UARTS | ||
135 | int "Number of 8250/16550 serial ports to register at runtime" | ||
136 | depends on SERIAL_8250 | ||
137 | range 0 SERIAL_8250_NR_UARTS | ||
138 | default "4" | ||
139 | help | ||
140 | Set this to the maximum number of serial ports you want | ||
141 | the kernel to register at boot time. This can be overridden | ||
142 | with the module parameter "nr_uarts", or boot-time parameter | ||
143 | 8250.nr_uarts | ||
144 | |||
145 | config SERIAL_8250_EXTENDED | ||
146 | bool "Extended 8250/16550 serial driver options" | ||
147 | depends on SERIAL_8250 | ||
148 | help | ||
149 | If you wish to use any non-standard features of the standard "dumb" | ||
150 | driver, say Y here. This includes HUB6 support, shared serial | ||
151 | interrupts, special multiport support, support for more than the | ||
152 | four COM 1/2/3/4 boards, etc. | ||
153 | |||
154 | Note that the answer to this question won't directly affect the | ||
155 | kernel: saying N will just cause the configurator to skip all | ||
156 | the questions about serial driver options. If unsure, say N. | ||
157 | |||
158 | config SERIAL_8250_MANY_PORTS | ||
159 | bool "Support more than 4 legacy serial ports" | ||
160 | depends on SERIAL_8250_EXTENDED && !IA64 | ||
161 | help | ||
162 | Say Y here if you have dumb serial boards other than the four | ||
163 | standard COM 1/2/3/4 ports. This may happen if you have an AST | ||
164 | FourPort, Accent Async, Boca (read the Boca mini-HOWTO, available | ||
165 | from <http://www.tldp.org/docs.html#howto>), or other custom | ||
166 | serial port hardware which acts similar to standard serial port | ||
167 | hardware. If you only use the standard COM 1/2/3/4 ports, you can | ||
168 | say N here to save some memory. You can also say Y if you have an | ||
169 | "intelligent" multiport card such as Cyclades, Digiboards, etc. | ||
170 | |||
171 | # | ||
172 | # Multi-port serial cards | ||
173 | # | ||
174 | |||
175 | config SERIAL_8250_FOURPORT | ||
176 | tristate "Support Fourport cards" | ||
177 | depends on SERIAL_8250 != n && ISA && SERIAL_8250_MANY_PORTS | ||
178 | help | ||
179 | Say Y here if you have an AST FourPort serial board. | ||
180 | |||
181 | To compile this driver as a module, choose M here: the module | ||
182 | will be called 8250_fourport. | ||
183 | |||
184 | config SERIAL_8250_ACCENT | ||
185 | tristate "Support Accent cards" | ||
186 | depends on SERIAL_8250 != n && ISA && SERIAL_8250_MANY_PORTS | ||
187 | help | ||
188 | Say Y here if you have an Accent Async serial board. | ||
189 | |||
190 | To compile this driver as a module, choose M here: the module | ||
191 | will be called 8250_accent. | ||
192 | |||
193 | config SERIAL_8250_BOCA | ||
194 | tristate "Support Boca cards" | ||
195 | depends on SERIAL_8250 != n && ISA && SERIAL_8250_MANY_PORTS | ||
196 | help | ||
197 | Say Y here if you have a Boca serial board. Please read the Boca | ||
198 | mini-HOWTO, available from <http://www.tldp.org/docs.html#howto> | ||
199 | |||
200 | To compile this driver as a module, choose M here: the module | ||
201 | will be called 8250_boca. | ||
202 | |||
203 | config SERIAL_8250_EXAR_ST16C554 | ||
204 | tristate "Support Exar ST16C554/554D Quad UART" | ||
205 | depends on SERIAL_8250 != n && ISA && SERIAL_8250_MANY_PORTS | ||
206 | help | ||
207 | The Uplogix Envoy TU301 uses this Exar Quad UART. If you are | ||
208 | tinkering with your Envoy TU301, or have a machine with this UART, | ||
209 | say Y here. | ||
210 | |||
211 | To compile this driver as a module, choose M here: the module | ||
212 | will be called 8250_exar_st16c554. | ||
213 | |||
214 | config SERIAL_8250_HUB6 | ||
215 | tristate "Support Hub6 cards" | ||
216 | depends on SERIAL_8250 != n && ISA && SERIAL_8250_MANY_PORTS | ||
217 | help | ||
218 | Say Y here if you have a HUB6 serial board. | ||
219 | |||
220 | To compile this driver as a module, choose M here: the module | ||
221 | will be called 8250_hub6. | ||
222 | |||
223 | config SERIAL_8250_SHARE_IRQ | ||
224 | bool "Support for sharing serial interrupts" | ||
225 | depends on SERIAL_8250_EXTENDED | ||
226 | help | ||
227 | Some serial boards have hardware support which allows multiple dumb | ||
228 | serial ports on the same board to share a single IRQ. To enable | ||
229 | support for this in the serial driver, say Y here. | ||
230 | |||
231 | config SERIAL_8250_DETECT_IRQ | ||
232 | bool "Autodetect IRQ on standard ports (unsafe)" | ||
233 | depends on SERIAL_8250_EXTENDED | ||
234 | help | ||
235 | Say Y here if you want the kernel to try to guess which IRQ | ||
236 | to use for your serial port. | ||
237 | |||
238 | This is considered unsafe; it is far better to configure the IRQ in | ||
239 | a boot script using the setserial command. | ||
240 | |||
241 | If unsure, say N. | ||
242 | |||
243 | config SERIAL_8250_RSA | ||
244 | bool "Support RSA serial ports" | ||
245 | depends on SERIAL_8250_EXTENDED | ||
246 | help | ||
247 | ::: To be written ::: | ||
248 | |||
249 | config SERIAL_8250_MCA | ||
250 | tristate "Support 8250-type ports on MCA buses" | ||
251 | depends on SERIAL_8250 != n && MCA | ||
252 | help | ||
253 | Say Y here if you have a MCA serial ports. | ||
254 | |||
255 | To compile this driver as a module, choose M here: the module | ||
256 | will be called 8250_mca. | ||
257 | |||
258 | config SERIAL_8250_ACORN | ||
259 | tristate "Acorn expansion card serial port support" | ||
260 | depends on ARCH_ACORN && SERIAL_8250 | ||
261 | help | ||
262 | If you have an Atomwide Serial card or Serial Port card for an Acorn | ||
263 | system, say Y to this option. The driver can handle 1, 2, or 3 port | ||
264 | cards. If unsure, say N. | ||
265 | |||
266 | config SERIAL_8250_RM9K | ||
267 | bool "Support for MIPS RM9xxx integrated serial port" | ||
268 | depends on SERIAL_8250 != n && SERIAL_RM9000 | ||
269 | select SERIAL_8250_SHARE_IRQ | ||
270 | help | ||
271 | Selecting this option will add support for the integrated serial | ||
272 | port hardware found on MIPS RM9122 and similar processors. | ||
273 | If unsure, say N. | ||
274 | |||
275 | config SERIAL_8250_DW | ||
276 | tristate "Support for Synopsys DesignWare 8250 quirks" | ||
277 | depends on SERIAL_8250 && OF | ||
278 | help | ||
279 | Selecting this option will enable handling of the extra features | ||
280 | present in the Synopsys DesignWare APB UART. | ||
281 | 9 | ||
282 | comment "Non-8250 serial port support" | 10 | comment "Non-8250 serial port support" |
283 | 11 | ||
@@ -536,15 +264,6 @@ config SERIAL_MAX3107 | |||
536 | help | 264 | help |
537 | MAX3107 chip support | 265 | MAX3107 chip support |
538 | 266 | ||
539 | config SERIAL_MAX3107_AAVA | ||
540 | tristate "MAX3107 AAVA platform support" | ||
541 | depends on X86_MRST && SERIAL_MAX3107 && GPIOLIB | ||
542 | select SERIAL_CORE | ||
543 | help | ||
544 | Support for the MAX3107 chip configuration found on the AAVA | ||
545 | platform. Includes the extra initialisation and GPIO support | ||
546 | neded for this device. | ||
547 | |||
548 | config SERIAL_DZ | 267 | config SERIAL_DZ |
549 | bool "DECstation DZ serial driver" | 268 | bool "DECstation DZ serial driver" |
550 | depends on MACH_DECSTATION && 32BIT | 269 | depends on MACH_DECSTATION && 32BIT |
diff --git a/drivers/tty/serial/Makefile b/drivers/tty/serial/Makefile index f5b01f2ce525..fef32e10c851 100644 --- a/drivers/tty/serial/Makefile +++ b/drivers/tty/serial/Makefile | |||
@@ -14,22 +14,9 @@ obj-$(CONFIG_SERIAL_SUNZILOG) += sunzilog.o | |||
14 | obj-$(CONFIG_SERIAL_SUNSU) += sunsu.o | 14 | obj-$(CONFIG_SERIAL_SUNSU) += sunsu.o |
15 | obj-$(CONFIG_SERIAL_SUNSAB) += sunsab.o | 15 | obj-$(CONFIG_SERIAL_SUNSAB) += sunsab.o |
16 | 16 | ||
17 | obj-$(CONFIG_SERIAL_8250) += 8250.o | 17 | # Now bring in any enabled 8250/16450/16550 type drivers. |
18 | obj-$(CONFIG_SERIAL_8250_PNP) += 8250_pnp.o | 18 | obj-$(CONFIG_SERIAL_8250) += 8250/ |
19 | obj-$(CONFIG_SERIAL_8250_GSC) += 8250_gsc.o | 19 | |
20 | obj-$(CONFIG_SERIAL_8250_PCI) += 8250_pci.o | ||
21 | obj-$(CONFIG_SERIAL_8250_HP300) += 8250_hp300.o | ||
22 | obj-$(CONFIG_SERIAL_8250_CS) += serial_cs.o | ||
23 | obj-$(CONFIG_SERIAL_8250_ACORN) += 8250_acorn.o | ||
24 | obj-$(CONFIG_SERIAL_8250_CONSOLE) += 8250_early.o | ||
25 | obj-$(CONFIG_SERIAL_8250_FOURPORT) += 8250_fourport.o | ||
26 | obj-$(CONFIG_SERIAL_8250_ACCENT) += 8250_accent.o | ||
27 | obj-$(CONFIG_SERIAL_8250_BOCA) += 8250_boca.o | ||
28 | obj-$(CONFIG_SERIAL_8250_EXAR_ST16C554) += 8250_exar_st16c554.o | ||
29 | obj-$(CONFIG_SERIAL_8250_HUB6) += 8250_hub6.o | ||
30 | obj-$(CONFIG_SERIAL_8250_MCA) += 8250_mca.o | ||
31 | obj-$(CONFIG_SERIAL_8250_FSL) += 8250_fsl.o | ||
32 | obj-$(CONFIG_SERIAL_8250_DW) += 8250_dw.o | ||
33 | obj-$(CONFIG_SERIAL_AMBA_PL010) += amba-pl010.o | 20 | obj-$(CONFIG_SERIAL_AMBA_PL010) += amba-pl010.o |
34 | obj-$(CONFIG_SERIAL_AMBA_PL011) += amba-pl011.o | 21 | obj-$(CONFIG_SERIAL_AMBA_PL011) += amba-pl011.o |
35 | obj-$(CONFIG_SERIAL_CLPS711X) += clps711x.o | 22 | obj-$(CONFIG_SERIAL_CLPS711X) += clps711x.o |
@@ -42,7 +29,6 @@ obj-$(CONFIG_SERIAL_BFIN_SPORT) += bfin_sport_uart.o | |||
42 | obj-$(CONFIG_SERIAL_SAMSUNG) += samsung.o | 29 | obj-$(CONFIG_SERIAL_SAMSUNG) += samsung.o |
43 | obj-$(CONFIG_SERIAL_MAX3100) += max3100.o | 30 | obj-$(CONFIG_SERIAL_MAX3100) += max3100.o |
44 | obj-$(CONFIG_SERIAL_MAX3107) += max3107.o | 31 | obj-$(CONFIG_SERIAL_MAX3107) += max3107.o |
45 | obj-$(CONFIG_SERIAL_MAX3107_AAVA) += max3107-aava.o | ||
46 | obj-$(CONFIG_SERIAL_IP22_ZILOG) += ip22zilog.o | 32 | obj-$(CONFIG_SERIAL_IP22_ZILOG) += ip22zilog.o |
47 | obj-$(CONFIG_SERIAL_MUX) += mux.o | 33 | obj-$(CONFIG_SERIAL_MUX) += mux.o |
48 | obj-$(CONFIG_SERIAL_68328) += 68328serial.o | 34 | obj-$(CONFIG_SERIAL_68328) += 68328serial.o |
diff --git a/drivers/tty/serial/amba-pl011.c b/drivers/tty/serial/amba-pl011.c index 9ae024025ff3..6800f5f26241 100644 --- a/drivers/tty/serial/amba-pl011.c +++ b/drivers/tty/serial/amba-pl011.c | |||
@@ -159,6 +159,7 @@ struct uart_amba_port { | |||
159 | unsigned int fifosize; /* vendor-specific */ | 159 | unsigned int fifosize; /* vendor-specific */ |
160 | unsigned int lcrh_tx; /* vendor-specific */ | 160 | unsigned int lcrh_tx; /* vendor-specific */ |
161 | unsigned int lcrh_rx; /* vendor-specific */ | 161 | unsigned int lcrh_rx; /* vendor-specific */ |
162 | unsigned int old_cr; /* state during shutdown */ | ||
162 | bool autorts; | 163 | bool autorts; |
163 | char type[12]; | 164 | char type[12]; |
164 | bool interrupt_may_hang; /* vendor-specific */ | 165 | bool interrupt_may_hang; /* vendor-specific */ |
@@ -1411,7 +1412,9 @@ static int pl011_startup(struct uart_port *port) | |||
1411 | while (readw(uap->port.membase + UART01x_FR) & UART01x_FR_BUSY) | 1412 | while (readw(uap->port.membase + UART01x_FR) & UART01x_FR_BUSY) |
1412 | barrier(); | 1413 | barrier(); |
1413 | 1414 | ||
1414 | cr = UART01x_CR_UARTEN | UART011_CR_RXE | UART011_CR_TXE; | 1415 | /* restore RTS and DTR */ |
1416 | cr = uap->old_cr & (UART011_CR_RTS | UART011_CR_DTR); | ||
1417 | cr |= UART01x_CR_UARTEN | UART011_CR_RXE | UART011_CR_TXE; | ||
1415 | writew(cr, uap->port.membase + UART011_CR); | 1418 | writew(cr, uap->port.membase + UART011_CR); |
1416 | 1419 | ||
1417 | /* Clear pending error interrupts */ | 1420 | /* Clear pending error interrupts */ |
@@ -1469,6 +1472,7 @@ static void pl011_shutdown_channel(struct uart_amba_port *uap, | |||
1469 | static void pl011_shutdown(struct uart_port *port) | 1472 | static void pl011_shutdown(struct uart_port *port) |
1470 | { | 1473 | { |
1471 | struct uart_amba_port *uap = (struct uart_amba_port *)port; | 1474 | struct uart_amba_port *uap = (struct uart_amba_port *)port; |
1475 | unsigned int cr; | ||
1472 | 1476 | ||
1473 | /* | 1477 | /* |
1474 | * disable all interrupts | 1478 | * disable all interrupts |
@@ -1488,9 +1492,16 @@ static void pl011_shutdown(struct uart_port *port) | |||
1488 | 1492 | ||
1489 | /* | 1493 | /* |
1490 | * disable the port | 1494 | * disable the port |
1495 | * disable the port. It should not disable RTS and DTR. | ||
1496 | * Also RTS and DTR state should be preserved to restore | ||
1497 | * it during startup(). | ||
1491 | */ | 1498 | */ |
1492 | uap->autorts = false; | 1499 | uap->autorts = false; |
1493 | writew(UART01x_CR_UARTEN | UART011_CR_TXE, uap->port.membase + UART011_CR); | 1500 | cr = readw(uap->port.membase + UART011_CR); |
1501 | uap->old_cr = cr; | ||
1502 | cr &= UART011_CR_RTS | UART011_CR_DTR; | ||
1503 | cr |= UART01x_CR_UARTEN | UART011_CR_TXE; | ||
1504 | writew(cr, uap->port.membase + UART011_CR); | ||
1494 | 1505 | ||
1495 | /* | 1506 | /* |
1496 | * disable break condition and fifos | 1507 | * disable break condition and fifos |
@@ -1740,9 +1751,19 @@ pl011_console_write(struct console *co, const char *s, unsigned int count) | |||
1740 | { | 1751 | { |
1741 | struct uart_amba_port *uap = amba_ports[co->index]; | 1752 | struct uart_amba_port *uap = amba_ports[co->index]; |
1742 | unsigned int status, old_cr, new_cr; | 1753 | unsigned int status, old_cr, new_cr; |
1754 | unsigned long flags; | ||
1755 | int locked = 1; | ||
1743 | 1756 | ||
1744 | clk_enable(uap->clk); | 1757 | clk_enable(uap->clk); |
1745 | 1758 | ||
1759 | local_irq_save(flags); | ||
1760 | if (uap->port.sysrq) | ||
1761 | locked = 0; | ||
1762 | else if (oops_in_progress) | ||
1763 | locked = spin_trylock(&uap->port.lock); | ||
1764 | else | ||
1765 | spin_lock(&uap->port.lock); | ||
1766 | |||
1746 | /* | 1767 | /* |
1747 | * First save the CR then disable the interrupts | 1768 | * First save the CR then disable the interrupts |
1748 | */ | 1769 | */ |
@@ -1762,6 +1783,10 @@ pl011_console_write(struct console *co, const char *s, unsigned int count) | |||
1762 | } while (status & UART01x_FR_BUSY); | 1783 | } while (status & UART01x_FR_BUSY); |
1763 | writew(old_cr, uap->port.membase + UART011_CR); | 1784 | writew(old_cr, uap->port.membase + UART011_CR); |
1764 | 1785 | ||
1786 | if (locked) | ||
1787 | spin_unlock(&uap->port.lock); | ||
1788 | local_irq_restore(flags); | ||
1789 | |||
1765 | clk_disable(uap->clk); | 1790 | clk_disable(uap->clk); |
1766 | } | 1791 | } |
1767 | 1792 | ||
@@ -1905,6 +1930,7 @@ static int pl011_probe(struct amba_device *dev, const struct amba_id *id) | |||
1905 | uap->vendor = vendor; | 1930 | uap->vendor = vendor; |
1906 | uap->lcrh_rx = vendor->lcrh_rx; | 1931 | uap->lcrh_rx = vendor->lcrh_rx; |
1907 | uap->lcrh_tx = vendor->lcrh_tx; | 1932 | uap->lcrh_tx = vendor->lcrh_tx; |
1933 | uap->old_cr = 0; | ||
1908 | uap->fifosize = vendor->fifosize; | 1934 | uap->fifosize = vendor->fifosize; |
1909 | uap->interrupt_may_hang = vendor->interrupt_may_hang; | 1935 | uap->interrupt_may_hang = vendor->interrupt_may_hang; |
1910 | uap->port.dev = &dev->dev; | 1936 | uap->port.dev = &dev->dev; |
diff --git a/drivers/tty/serial/jsm/jsm_driver.c b/drivers/tty/serial/jsm/jsm_driver.c index 7c867a046c97..7545fe1b9925 100644 --- a/drivers/tty/serial/jsm/jsm_driver.c +++ b/drivers/tty/serial/jsm/jsm_driver.c | |||
@@ -251,6 +251,7 @@ static void jsm_io_resume(struct pci_dev *pdev) | |||
251 | struct jsm_board *brd = pci_get_drvdata(pdev); | 251 | struct jsm_board *brd = pci_get_drvdata(pdev); |
252 | 252 | ||
253 | pci_restore_state(pdev); | 253 | pci_restore_state(pdev); |
254 | pci_save_state(pdev); | ||
254 | 255 | ||
255 | jsm_uart_port_init(brd); | 256 | jsm_uart_port_init(brd); |
256 | } | 257 | } |
diff --git a/drivers/tty/serial/max3107-aava.c b/drivers/tty/serial/max3107-aava.c deleted file mode 100644 index aae772a71de6..000000000000 --- a/drivers/tty/serial/max3107-aava.c +++ /dev/null | |||
@@ -1,344 +0,0 @@ | |||
1 | /* | ||
2 | * max3107.c - spi uart protocol driver for Maxim 3107 | ||
3 | * Based on max3100.c | ||
4 | * by Christian Pellegrin <chripell@evolware.org> | ||
5 | * and max3110.c | ||
6 | * by Feng Tang <feng.tang@intel.com> | ||
7 | * | ||
8 | * Copyright (C) Aavamobile 2009 | ||
9 | * | ||
10 | * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
11 | * | ||
12 | * This program is free software; you can redistribute it and/or modify | ||
13 | * it under the terms of the GNU General Public License as published by | ||
14 | * the Free Software Foundation; either version 2 of the License, or | ||
15 | * (at your option) any later version. | ||
16 | * | ||
17 | * This program is distributed in the hope that it will be useful, | ||
18 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
19 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
20 | * GNU General Public License for more details. | ||
21 | * | ||
22 | * You should have received a copy of the GNU General Public License | ||
23 | * along with this program; if not, write to the Free Software | ||
24 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
25 | * | ||
26 | * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
27 | * | ||
28 | */ | ||
29 | |||
30 | #include <linux/delay.h> | ||
31 | #include <linux/device.h> | ||
32 | #include <linux/serial_core.h> | ||
33 | #include <linux/serial.h> | ||
34 | #include <linux/spi/spi.h> | ||
35 | #include <linux/freezer.h> | ||
36 | #include <linux/platform_device.h> | ||
37 | #include <linux/gpio.h> | ||
38 | #include <linux/sfi.h> | ||
39 | #include <linux/module.h> | ||
40 | #include <asm/mrst.h> | ||
41 | #include "max3107.h" | ||
42 | |||
43 | /* GPIO direction to input function */ | ||
44 | static int max3107_gpio_direction_in(struct gpio_chip *chip, unsigned offset) | ||
45 | { | ||
46 | struct max3107_port *s = container_of(chip, struct max3107_port, chip); | ||
47 | u16 buf[1]; /* Buffer for SPI transfer */ | ||
48 | |||
49 | if (offset >= MAX3107_GPIO_COUNT) { | ||
50 | dev_err(&s->spi->dev, "Invalid GPIO\n"); | ||
51 | return -EINVAL; | ||
52 | } | ||
53 | |||
54 | /* Read current GPIO configuration register */ | ||
55 | buf[0] = MAX3107_GPIOCFG_REG; | ||
56 | /* Perform SPI transfer */ | ||
57 | if (max3107_rw(s, (u8 *)buf, (u8 *)buf, 2)) { | ||
58 | dev_err(&s->spi->dev, "SPI transfer GPIO read failed\n"); | ||
59 | return -EIO; | ||
60 | } | ||
61 | buf[0] &= MAX3107_SPI_RX_DATA_MASK; | ||
62 | |||
63 | /* Set GPIO to input */ | ||
64 | buf[0] &= ~(0x0001 << offset); | ||
65 | |||
66 | /* Write new GPIO configuration register value */ | ||
67 | buf[0] |= (MAX3107_WRITE_BIT | MAX3107_GPIOCFG_REG); | ||
68 | /* Perform SPI transfer */ | ||
69 | if (max3107_rw(s, (u8 *)buf, NULL, 2)) { | ||
70 | dev_err(&s->spi->dev, "SPI transfer GPIO write failed\n"); | ||
71 | return -EIO; | ||
72 | } | ||
73 | return 0; | ||
74 | } | ||
75 | |||
76 | /* GPIO direction to output function */ | ||
77 | static int max3107_gpio_direction_out(struct gpio_chip *chip, unsigned offset, | ||
78 | int value) | ||
79 | { | ||
80 | struct max3107_port *s = container_of(chip, struct max3107_port, chip); | ||
81 | u16 buf[2]; /* Buffer for SPI transfers */ | ||
82 | |||
83 | if (offset >= MAX3107_GPIO_COUNT) { | ||
84 | dev_err(&s->spi->dev, "Invalid GPIO\n"); | ||
85 | return -EINVAL; | ||
86 | } | ||
87 | |||
88 | /* Read current GPIO configuration and data registers */ | ||
89 | buf[0] = MAX3107_GPIOCFG_REG; | ||
90 | buf[1] = MAX3107_GPIODATA_REG; | ||
91 | /* Perform SPI transfer */ | ||
92 | if (max3107_rw(s, (u8 *)buf, (u8 *)buf, 4)) { | ||
93 | dev_err(&s->spi->dev, "SPI transfer gpio failed\n"); | ||
94 | return -EIO; | ||
95 | } | ||
96 | buf[0] &= MAX3107_SPI_RX_DATA_MASK; | ||
97 | buf[1] &= MAX3107_SPI_RX_DATA_MASK; | ||
98 | |||
99 | /* Set GPIO to output */ | ||
100 | buf[0] |= (0x0001 << offset); | ||
101 | /* Set value */ | ||
102 | if (value) | ||
103 | buf[1] |= (0x0001 << offset); | ||
104 | else | ||
105 | buf[1] &= ~(0x0001 << offset); | ||
106 | |||
107 | /* Write new GPIO configuration and data register values */ | ||
108 | buf[0] |= (MAX3107_WRITE_BIT | MAX3107_GPIOCFG_REG); | ||
109 | buf[1] |= (MAX3107_WRITE_BIT | MAX3107_GPIODATA_REG); | ||
110 | /* Perform SPI transfer */ | ||
111 | if (max3107_rw(s, (u8 *)buf, NULL, 4)) { | ||
112 | dev_err(&s->spi->dev, | ||
113 | "SPI transfer for GPIO conf data w failed\n"); | ||
114 | return -EIO; | ||
115 | } | ||
116 | return 0; | ||
117 | } | ||
118 | |||
119 | /* GPIO value query function */ | ||
120 | static int max3107_gpio_get(struct gpio_chip *chip, unsigned offset) | ||
121 | { | ||
122 | struct max3107_port *s = container_of(chip, struct max3107_port, chip); | ||
123 | u16 buf[1]; /* Buffer for SPI transfer */ | ||
124 | |||
125 | if (offset >= MAX3107_GPIO_COUNT) { | ||
126 | dev_err(&s->spi->dev, "Invalid GPIO\n"); | ||
127 | return -EINVAL; | ||
128 | } | ||
129 | |||
130 | /* Read current GPIO data register */ | ||
131 | buf[0] = MAX3107_GPIODATA_REG; | ||
132 | /* Perform SPI transfer */ | ||
133 | if (max3107_rw(s, (u8 *)buf, (u8 *)buf, 2)) { | ||
134 | dev_err(&s->spi->dev, "SPI transfer GPIO data r failed\n"); | ||
135 | return -EIO; | ||
136 | } | ||
137 | buf[0] &= MAX3107_SPI_RX_DATA_MASK; | ||
138 | |||
139 | /* Return value */ | ||
140 | return buf[0] & (0x0001 << offset); | ||
141 | } | ||
142 | |||
143 | /* GPIO value set function */ | ||
144 | static void max3107_gpio_set(struct gpio_chip *chip, unsigned offset, int value) | ||
145 | { | ||
146 | struct max3107_port *s = container_of(chip, struct max3107_port, chip); | ||
147 | u16 buf[2]; /* Buffer for SPI transfers */ | ||
148 | |||
149 | if (offset >= MAX3107_GPIO_COUNT) { | ||
150 | dev_err(&s->spi->dev, "Invalid GPIO\n"); | ||
151 | return; | ||
152 | } | ||
153 | |||
154 | /* Read current GPIO configuration registers*/ | ||
155 | buf[0] = MAX3107_GPIODATA_REG; | ||
156 | buf[1] = MAX3107_GPIOCFG_REG; | ||
157 | /* Perform SPI transfer */ | ||
158 | if (max3107_rw(s, (u8 *)buf, (u8 *)buf, 4)) { | ||
159 | dev_err(&s->spi->dev, | ||
160 | "SPI transfer for GPIO data and config read failed\n"); | ||
161 | return; | ||
162 | } | ||
163 | buf[0] &= MAX3107_SPI_RX_DATA_MASK; | ||
164 | buf[1] &= MAX3107_SPI_RX_DATA_MASK; | ||
165 | |||
166 | if (!(buf[1] & (0x0001 << offset))) { | ||
167 | /* Configured as input, can't set value */ | ||
168 | dev_warn(&s->spi->dev, | ||
169 | "Trying to set value for input GPIO\n"); | ||
170 | return; | ||
171 | } | ||
172 | |||
173 | /* Set value */ | ||
174 | if (value) | ||
175 | buf[0] |= (0x0001 << offset); | ||
176 | else | ||
177 | buf[0] &= ~(0x0001 << offset); | ||
178 | |||
179 | /* Write new GPIO data register value */ | ||
180 | buf[0] |= (MAX3107_WRITE_BIT | MAX3107_GPIODATA_REG); | ||
181 | /* Perform SPI transfer */ | ||
182 | if (max3107_rw(s, (u8 *)buf, NULL, 2)) | ||
183 | dev_err(&s->spi->dev, "SPI transfer GPIO data w failed\n"); | ||
184 | } | ||
185 | |||
186 | /* GPIO chip data */ | ||
187 | static struct gpio_chip max3107_gpio_chip = { | ||
188 | .owner = THIS_MODULE, | ||
189 | .direction_input = max3107_gpio_direction_in, | ||
190 | .direction_output = max3107_gpio_direction_out, | ||
191 | .get = max3107_gpio_get, | ||
192 | .set = max3107_gpio_set, | ||
193 | .can_sleep = 1, | ||
194 | .base = MAX3107_GPIO_BASE, | ||
195 | .ngpio = MAX3107_GPIO_COUNT, | ||
196 | }; | ||
197 | |||
198 | /** | ||
199 | * max3107_aava_reset - reset on AAVA systems | ||
200 | * @spi: The SPI device we are probing | ||
201 | * | ||
202 | * Reset the device ready for probing. | ||
203 | */ | ||
204 | |||
205 | static int max3107_aava_reset(struct spi_device *spi) | ||
206 | { | ||
207 | /* Reset the chip */ | ||
208 | if (gpio_request(MAX3107_RESET_GPIO, "max3107")) { | ||
209 | pr_err("Requesting RESET GPIO failed\n"); | ||
210 | return -EIO; | ||
211 | } | ||
212 | if (gpio_direction_output(MAX3107_RESET_GPIO, 0)) { | ||
213 | pr_err("Setting RESET GPIO to 0 failed\n"); | ||
214 | gpio_free(MAX3107_RESET_GPIO); | ||
215 | return -EIO; | ||
216 | } | ||
217 | msleep(MAX3107_RESET_DELAY); | ||
218 | if (gpio_direction_output(MAX3107_RESET_GPIO, 1)) { | ||
219 | pr_err("Setting RESET GPIO to 1 failed\n"); | ||
220 | gpio_free(MAX3107_RESET_GPIO); | ||
221 | return -EIO; | ||
222 | } | ||
223 | gpio_free(MAX3107_RESET_GPIO); | ||
224 | msleep(MAX3107_WAKEUP_DELAY); | ||
225 | return 0; | ||
226 | } | ||
227 | |||
228 | static int max3107_aava_configure(struct max3107_port *s) | ||
229 | { | ||
230 | int retval; | ||
231 | |||
232 | /* Initialize GPIO chip data */ | ||
233 | s->chip = max3107_gpio_chip; | ||
234 | s->chip.label = s->spi->modalias; | ||
235 | s->chip.dev = &s->spi->dev; | ||
236 | |||
237 | /* Add GPIO chip */ | ||
238 | retval = gpiochip_add(&s->chip); | ||
239 | if (retval) { | ||
240 | dev_err(&s->spi->dev, "Adding GPIO chip failed\n"); | ||
241 | return retval; | ||
242 | } | ||
243 | |||
244 | /* Temporary fix for EV2 boot problems, set modem reset to 0 */ | ||
245 | max3107_gpio_direction_out(&s->chip, 3, 0); | ||
246 | return 0; | ||
247 | } | ||
248 | |||
249 | #if 0 | ||
250 | /* This will get enabled once we have the board stuff merged for this | ||
251 | specific case */ | ||
252 | |||
253 | static const struct baud_table brg13_ext[] = { | ||
254 | { 300, MAX3107_BRG13_B300 }, | ||
255 | { 600, MAX3107_BRG13_B600 }, | ||
256 | { 1200, MAX3107_BRG13_B1200 }, | ||
257 | { 2400, MAX3107_BRG13_B2400 }, | ||
258 | { 4800, MAX3107_BRG13_B4800 }, | ||
259 | { 9600, MAX3107_BRG13_B9600 }, | ||
260 | { 19200, MAX3107_BRG13_B19200 }, | ||
261 | { 57600, MAX3107_BRG13_B57600 }, | ||
262 | { 115200, MAX3107_BRG13_B115200 }, | ||
263 | { 230400, MAX3107_BRG13_B230400 }, | ||
264 | { 460800, MAX3107_BRG13_B460800 }, | ||
265 | { 921600, MAX3107_BRG13_B921600 }, | ||
266 | { 0, 0 } | ||
267 | }; | ||
268 | |||
269 | static void max3107_aava_init(struct max3107_port *s) | ||
270 | { | ||
271 | /*override for AAVA SC specific*/ | ||
272 | if (mrst_platform_id() == MRST_PLATFORM_AAVA_SC) { | ||
273 | if (get_koski_build_id() <= KOSKI_EV2) | ||
274 | if (s->ext_clk) { | ||
275 | s->brg_cfg = MAX3107_BRG13_B9600; | ||
276 | s->baud_tbl = (struct baud_table *)brg13_ext; | ||
277 | } | ||
278 | } | ||
279 | } | ||
280 | #endif | ||
281 | |||
282 | static int __devexit max3107_aava_remove(struct spi_device *spi) | ||
283 | { | ||
284 | struct max3107_port *s = dev_get_drvdata(&spi->dev); | ||
285 | |||
286 | /* Remove GPIO chip */ | ||
287 | if (gpiochip_remove(&s->chip)) | ||
288 | dev_warn(&spi->dev, "Removing GPIO chip failed\n"); | ||
289 | |||
290 | /* Then do the default remove */ | ||
291 | return max3107_remove(spi); | ||
292 | } | ||
293 | |||
294 | /* Platform data */ | ||
295 | static struct max3107_plat aava_plat_data = { | ||
296 | .loopback = 0, | ||
297 | .ext_clk = 1, | ||
298 | /* .init = max3107_aava_init, */ | ||
299 | .configure = max3107_aava_configure, | ||
300 | .hw_suspend = max3107_hw_susp, | ||
301 | .polled_mode = 0, | ||
302 | .poll_time = 0, | ||
303 | }; | ||
304 | |||
305 | |||
306 | static int __devinit max3107_probe_aava(struct spi_device *spi) | ||
307 | { | ||
308 | int err = max3107_aava_reset(spi); | ||
309 | if (err < 0) | ||
310 | return err; | ||
311 | return max3107_probe(spi, &aava_plat_data); | ||
312 | } | ||
313 | |||
314 | /* Spi driver data */ | ||
315 | static struct spi_driver max3107_driver = { | ||
316 | .driver = { | ||
317 | .name = "aava-max3107", | ||
318 | .owner = THIS_MODULE, | ||
319 | }, | ||
320 | .probe = max3107_probe_aava, | ||
321 | .remove = __devexit_p(max3107_aava_remove), | ||
322 | .suspend = max3107_suspend, | ||
323 | .resume = max3107_resume, | ||
324 | }; | ||
325 | |||
326 | /* Driver init function */ | ||
327 | static int __init max3107_init(void) | ||
328 | { | ||
329 | return spi_register_driver(&max3107_driver); | ||
330 | } | ||
331 | |||
332 | /* Driver exit function */ | ||
333 | static void __exit max3107_exit(void) | ||
334 | { | ||
335 | spi_unregister_driver(&max3107_driver); | ||
336 | } | ||
337 | |||
338 | module_init(max3107_init); | ||
339 | module_exit(max3107_exit); | ||
340 | |||
341 | MODULE_DESCRIPTION("MAX3107 driver"); | ||
342 | MODULE_AUTHOR("Aavamobile"); | ||
343 | MODULE_ALIAS("spi:aava-max3107"); | ||
344 | MODULE_LICENSE("GPL v2"); | ||
diff --git a/drivers/tty/serial/omap-serial.c b/drivers/tty/serial/omap-serial.c index d192dcbb82f5..1c2426931484 100644 --- a/drivers/tty/serial/omap-serial.c +++ b/drivers/tty/serial/omap-serial.c | |||
@@ -1160,7 +1160,7 @@ static struct uart_driver serial_omap_reg = { | |||
1160 | .cons = OMAP_CONSOLE, | 1160 | .cons = OMAP_CONSOLE, |
1161 | }; | 1161 | }; |
1162 | 1162 | ||
1163 | #ifdef CONFIG_SUSPEND | 1163 | #ifdef CONFIG_PM_SLEEP |
1164 | static int serial_omap_suspend(struct device *dev) | 1164 | static int serial_omap_suspend(struct device *dev) |
1165 | { | 1165 | { |
1166 | struct uart_omap_port *up = dev_get_drvdata(dev); | 1166 | struct uart_omap_port *up = dev_get_drvdata(dev); |
@@ -1521,6 +1521,7 @@ static void serial_omap_mdr1_errataset(struct uart_omap_port *up, u8 mdr1) | |||
1521 | } | 1521 | } |
1522 | } | 1522 | } |
1523 | 1523 | ||
1524 | #ifdef CONFIG_PM_RUNTIME | ||
1524 | static void serial_omap_restore_context(struct uart_omap_port *up) | 1525 | static void serial_omap_restore_context(struct uart_omap_port *up) |
1525 | { | 1526 | { |
1526 | if (up->errata & UART_ERRATA_i202_MDR1_ACCESS) | 1527 | if (up->errata & UART_ERRATA_i202_MDR1_ACCESS) |
@@ -1550,7 +1551,6 @@ static void serial_omap_restore_context(struct uart_omap_port *up) | |||
1550 | serial_out(up, UART_OMAP_MDR1, up->mdr1); | 1551 | serial_out(up, UART_OMAP_MDR1, up->mdr1); |
1551 | } | 1552 | } |
1552 | 1553 | ||
1553 | #ifdef CONFIG_PM_RUNTIME | ||
1554 | static int serial_omap_runtime_suspend(struct device *dev) | 1554 | static int serial_omap_runtime_suspend(struct device *dev) |
1555 | { | 1555 | { |
1556 | struct uart_omap_port *up = dev_get_drvdata(dev); | 1556 | struct uart_omap_port *up = dev_get_drvdata(dev); |
diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c index c7bf31a6a7e7..13056180adf5 100644 --- a/drivers/tty/serial/serial_core.c +++ b/drivers/tty/serial/serial_core.c | |||
@@ -2348,11 +2348,11 @@ int uart_add_one_port(struct uart_driver *drv, struct uart_port *uport) | |||
2348 | */ | 2348 | */ |
2349 | tty_dev = tty_register_device(drv->tty_driver, uport->line, uport->dev); | 2349 | tty_dev = tty_register_device(drv->tty_driver, uport->line, uport->dev); |
2350 | if (likely(!IS_ERR(tty_dev))) { | 2350 | if (likely(!IS_ERR(tty_dev))) { |
2351 | device_init_wakeup(tty_dev, 1); | 2351 | device_set_wakeup_capable(tty_dev, 1); |
2352 | device_set_wakeup_enable(tty_dev, 0); | 2352 | } else { |
2353 | } else | ||
2354 | printk(KERN_ERR "Cannot register tty device on line %d\n", | 2353 | printk(KERN_ERR "Cannot register tty device on line %d\n", |
2355 | uport->line); | 2354 | uport->line); |
2355 | } | ||
2356 | 2356 | ||
2357 | /* | 2357 | /* |
2358 | * Ensure UPF_DEAD is not set. | 2358 | * Ensure UPF_DEAD is not set. |
diff --git a/drivers/tty/tty_port.c b/drivers/tty/tty_port.c index ef9dd628ba0b..bf6e238146ae 100644 --- a/drivers/tty/tty_port.c +++ b/drivers/tty/tty_port.c | |||
@@ -227,7 +227,6 @@ int tty_port_block_til_ready(struct tty_port *port, | |||
227 | int do_clocal = 0, retval; | 227 | int do_clocal = 0, retval; |
228 | unsigned long flags; | 228 | unsigned long flags; |
229 | DEFINE_WAIT(wait); | 229 | DEFINE_WAIT(wait); |
230 | int cd; | ||
231 | 230 | ||
232 | /* block if port is in the process of being closed */ | 231 | /* block if port is in the process of being closed */ |
233 | if (tty_hung_up_p(filp) || port->flags & ASYNC_CLOSING) { | 232 | if (tty_hung_up_p(filp) || port->flags & ASYNC_CLOSING) { |
@@ -284,11 +283,14 @@ int tty_port_block_til_ready(struct tty_port *port, | |||
284 | retval = -ERESTARTSYS; | 283 | retval = -ERESTARTSYS; |
285 | break; | 284 | break; |
286 | } | 285 | } |
287 | /* Probe the carrier. For devices with no carrier detect this | 286 | /* |
288 | will always return true */ | 287 | * Probe the carrier. For devices with no carrier detect |
289 | cd = tty_port_carrier_raised(port); | 288 | * tty_port_carrier_raised will always return true. |
289 | * Never ask drivers if CLOCAL is set, this causes troubles | ||
290 | * on some hardware. | ||
291 | */ | ||
290 | if (!(port->flags & ASYNC_CLOSING) && | 292 | if (!(port->flags & ASYNC_CLOSING) && |
291 | (do_clocal || cd)) | 293 | (do_clocal || tty_port_carrier_raised(port))) |
292 | break; | 294 | break; |
293 | if (signal_pending(current)) { | 295 | if (signal_pending(current)) { |
294 | retval = -ERESTARTSYS; | 296 | retval = -ERESTARTSYS; |
diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c index 1c50baff7725..d2b3cffca3f7 100644 --- a/drivers/usb/class/cdc-wdm.c +++ b/drivers/usb/class/cdc-wdm.c | |||
@@ -57,6 +57,8 @@ MODULE_DEVICE_TABLE (usb, wdm_ids); | |||
57 | 57 | ||
58 | #define WDM_MAX 16 | 58 | #define WDM_MAX 16 |
59 | 59 | ||
60 | /* CDC-WMC r1.1 requires wMaxCommand to be "at least 256 decimal (0x100)" */ | ||
61 | #define WDM_DEFAULT_BUFSIZE 256 | ||
60 | 62 | ||
61 | static DEFINE_MUTEX(wdm_mutex); | 63 | static DEFINE_MUTEX(wdm_mutex); |
62 | 64 | ||
@@ -88,7 +90,8 @@ struct wdm_device { | |||
88 | int count; | 90 | int count; |
89 | dma_addr_t shandle; | 91 | dma_addr_t shandle; |
90 | dma_addr_t ihandle; | 92 | dma_addr_t ihandle; |
91 | struct mutex lock; | 93 | struct mutex wlock; |
94 | struct mutex rlock; | ||
92 | wait_queue_head_t wait; | 95 | wait_queue_head_t wait; |
93 | struct work_struct rxwork; | 96 | struct work_struct rxwork; |
94 | int werr; | 97 | int werr; |
@@ -323,7 +326,7 @@ static ssize_t wdm_write | |||
323 | } | 326 | } |
324 | 327 | ||
325 | /* concurrent writes and disconnect */ | 328 | /* concurrent writes and disconnect */ |
326 | r = mutex_lock_interruptible(&desc->lock); | 329 | r = mutex_lock_interruptible(&desc->wlock); |
327 | rv = -ERESTARTSYS; | 330 | rv = -ERESTARTSYS; |
328 | if (r) { | 331 | if (r) { |
329 | kfree(buf); | 332 | kfree(buf); |
@@ -386,7 +389,7 @@ static ssize_t wdm_write | |||
386 | out: | 389 | out: |
387 | usb_autopm_put_interface(desc->intf); | 390 | usb_autopm_put_interface(desc->intf); |
388 | outnp: | 391 | outnp: |
389 | mutex_unlock(&desc->lock); | 392 | mutex_unlock(&desc->wlock); |
390 | outnl: | 393 | outnl: |
391 | return rv < 0 ? rv : count; | 394 | return rv < 0 ? rv : count; |
392 | } | 395 | } |
@@ -399,7 +402,7 @@ static ssize_t wdm_read | |||
399 | struct wdm_device *desc = file->private_data; | 402 | struct wdm_device *desc = file->private_data; |
400 | 403 | ||
401 | 404 | ||
402 | rv = mutex_lock_interruptible(&desc->lock); /*concurrent reads */ | 405 | rv = mutex_lock_interruptible(&desc->rlock); /*concurrent reads */ |
403 | if (rv < 0) | 406 | if (rv < 0) |
404 | return -ERESTARTSYS; | 407 | return -ERESTARTSYS; |
405 | 408 | ||
@@ -467,14 +470,16 @@ retry: | |||
467 | for (i = 0; i < desc->length - cntr; i++) | 470 | for (i = 0; i < desc->length - cntr; i++) |
468 | desc->ubuf[i] = desc->ubuf[i + cntr]; | 471 | desc->ubuf[i] = desc->ubuf[i + cntr]; |
469 | 472 | ||
473 | spin_lock_irq(&desc->iuspin); | ||
470 | desc->length -= cntr; | 474 | desc->length -= cntr; |
475 | spin_unlock_irq(&desc->iuspin); | ||
471 | /* in case we had outstanding data */ | 476 | /* in case we had outstanding data */ |
472 | if (!desc->length) | 477 | if (!desc->length) |
473 | clear_bit(WDM_READ, &desc->flags); | 478 | clear_bit(WDM_READ, &desc->flags); |
474 | rv = cntr; | 479 | rv = cntr; |
475 | 480 | ||
476 | err: | 481 | err: |
477 | mutex_unlock(&desc->lock); | 482 | mutex_unlock(&desc->rlock); |
478 | return rv; | 483 | return rv; |
479 | } | 484 | } |
480 | 485 | ||
@@ -540,7 +545,8 @@ static int wdm_open(struct inode *inode, struct file *file) | |||
540 | } | 545 | } |
541 | intf->needs_remote_wakeup = 1; | 546 | intf->needs_remote_wakeup = 1; |
542 | 547 | ||
543 | mutex_lock(&desc->lock); | 548 | /* using write lock to protect desc->count */ |
549 | mutex_lock(&desc->wlock); | ||
544 | if (!desc->count++) { | 550 | if (!desc->count++) { |
545 | desc->werr = 0; | 551 | desc->werr = 0; |
546 | desc->rerr = 0; | 552 | desc->rerr = 0; |
@@ -553,7 +559,7 @@ static int wdm_open(struct inode *inode, struct file *file) | |||
553 | } else { | 559 | } else { |
554 | rv = 0; | 560 | rv = 0; |
555 | } | 561 | } |
556 | mutex_unlock(&desc->lock); | 562 | mutex_unlock(&desc->wlock); |
557 | usb_autopm_put_interface(desc->intf); | 563 | usb_autopm_put_interface(desc->intf); |
558 | out: | 564 | out: |
559 | mutex_unlock(&wdm_mutex); | 565 | mutex_unlock(&wdm_mutex); |
@@ -565,9 +571,11 @@ static int wdm_release(struct inode *inode, struct file *file) | |||
565 | struct wdm_device *desc = file->private_data; | 571 | struct wdm_device *desc = file->private_data; |
566 | 572 | ||
567 | mutex_lock(&wdm_mutex); | 573 | mutex_lock(&wdm_mutex); |
568 | mutex_lock(&desc->lock); | 574 | |
575 | /* using write lock to protect desc->count */ | ||
576 | mutex_lock(&desc->wlock); | ||
569 | desc->count--; | 577 | desc->count--; |
570 | mutex_unlock(&desc->lock); | 578 | mutex_unlock(&desc->wlock); |
571 | 579 | ||
572 | if (!desc->count) { | 580 | if (!desc->count) { |
573 | dev_dbg(&desc->intf->dev, "wdm_release: cleanup"); | 581 | dev_dbg(&desc->intf->dev, "wdm_release: cleanup"); |
@@ -630,7 +638,7 @@ static int wdm_probe(struct usb_interface *intf, const struct usb_device_id *id) | |||
630 | struct usb_cdc_dmm_desc *dmhd; | 638 | struct usb_cdc_dmm_desc *dmhd; |
631 | u8 *buffer = intf->altsetting->extra; | 639 | u8 *buffer = intf->altsetting->extra; |
632 | int buflen = intf->altsetting->extralen; | 640 | int buflen = intf->altsetting->extralen; |
633 | u16 maxcom = 0; | 641 | u16 maxcom = WDM_DEFAULT_BUFSIZE; |
634 | 642 | ||
635 | if (!buffer) | 643 | if (!buffer) |
636 | goto out; | 644 | goto out; |
@@ -665,7 +673,8 @@ next_desc: | |||
665 | desc = kzalloc(sizeof(struct wdm_device), GFP_KERNEL); | 673 | desc = kzalloc(sizeof(struct wdm_device), GFP_KERNEL); |
666 | if (!desc) | 674 | if (!desc) |
667 | goto out; | 675 | goto out; |
668 | mutex_init(&desc->lock); | 676 | mutex_init(&desc->rlock); |
677 | mutex_init(&desc->wlock); | ||
669 | spin_lock_init(&desc->iuspin); | 678 | spin_lock_init(&desc->iuspin); |
670 | init_waitqueue_head(&desc->wait); | 679 | init_waitqueue_head(&desc->wait); |
671 | desc->wMaxCommand = maxcom; | 680 | desc->wMaxCommand = maxcom; |
@@ -716,7 +725,7 @@ next_desc: | |||
716 | goto err; | 725 | goto err; |
717 | 726 | ||
718 | desc->inbuf = usb_alloc_coherent(interface_to_usbdev(intf), | 727 | desc->inbuf = usb_alloc_coherent(interface_to_usbdev(intf), |
719 | desc->bMaxPacketSize0, | 728 | desc->wMaxCommand, |
720 | GFP_KERNEL, | 729 | GFP_KERNEL, |
721 | &desc->response->transfer_dma); | 730 | &desc->response->transfer_dma); |
722 | if (!desc->inbuf) | 731 | if (!desc->inbuf) |
@@ -779,11 +788,13 @@ static void wdm_disconnect(struct usb_interface *intf) | |||
779 | /* to terminate pending flushes */ | 788 | /* to terminate pending flushes */ |
780 | clear_bit(WDM_IN_USE, &desc->flags); | 789 | clear_bit(WDM_IN_USE, &desc->flags); |
781 | spin_unlock_irqrestore(&desc->iuspin, flags); | 790 | spin_unlock_irqrestore(&desc->iuspin, flags); |
782 | mutex_lock(&desc->lock); | 791 | wake_up_all(&desc->wait); |
792 | mutex_lock(&desc->rlock); | ||
793 | mutex_lock(&desc->wlock); | ||
783 | kill_urbs(desc); | 794 | kill_urbs(desc); |
784 | cancel_work_sync(&desc->rxwork); | 795 | cancel_work_sync(&desc->rxwork); |
785 | mutex_unlock(&desc->lock); | 796 | mutex_unlock(&desc->wlock); |
786 | wake_up_all(&desc->wait); | 797 | mutex_unlock(&desc->rlock); |
787 | if (!desc->count) | 798 | if (!desc->count) |
788 | cleanup(desc); | 799 | cleanup(desc); |
789 | mutex_unlock(&wdm_mutex); | 800 | mutex_unlock(&wdm_mutex); |
@@ -798,8 +809,10 @@ static int wdm_suspend(struct usb_interface *intf, pm_message_t message) | |||
798 | dev_dbg(&desc->intf->dev, "wdm%d_suspend\n", intf->minor); | 809 | dev_dbg(&desc->intf->dev, "wdm%d_suspend\n", intf->minor); |
799 | 810 | ||
800 | /* if this is an autosuspend the caller does the locking */ | 811 | /* if this is an autosuspend the caller does the locking */ |
801 | if (!PMSG_IS_AUTO(message)) | 812 | if (!PMSG_IS_AUTO(message)) { |
802 | mutex_lock(&desc->lock); | 813 | mutex_lock(&desc->rlock); |
814 | mutex_lock(&desc->wlock); | ||
815 | } | ||
803 | spin_lock_irq(&desc->iuspin); | 816 | spin_lock_irq(&desc->iuspin); |
804 | 817 | ||
805 | if (PMSG_IS_AUTO(message) && | 818 | if (PMSG_IS_AUTO(message) && |
@@ -815,8 +828,10 @@ static int wdm_suspend(struct usb_interface *intf, pm_message_t message) | |||
815 | kill_urbs(desc); | 828 | kill_urbs(desc); |
816 | cancel_work_sync(&desc->rxwork); | 829 | cancel_work_sync(&desc->rxwork); |
817 | } | 830 | } |
818 | if (!PMSG_IS_AUTO(message)) | 831 | if (!PMSG_IS_AUTO(message)) { |
819 | mutex_unlock(&desc->lock); | 832 | mutex_unlock(&desc->wlock); |
833 | mutex_unlock(&desc->rlock); | ||
834 | } | ||
820 | 835 | ||
821 | return rv; | 836 | return rv; |
822 | } | 837 | } |
@@ -854,7 +869,8 @@ static int wdm_pre_reset(struct usb_interface *intf) | |||
854 | { | 869 | { |
855 | struct wdm_device *desc = usb_get_intfdata(intf); | 870 | struct wdm_device *desc = usb_get_intfdata(intf); |
856 | 871 | ||
857 | mutex_lock(&desc->lock); | 872 | mutex_lock(&desc->rlock); |
873 | mutex_lock(&desc->wlock); | ||
858 | kill_urbs(desc); | 874 | kill_urbs(desc); |
859 | 875 | ||
860 | /* | 876 | /* |
@@ -876,7 +892,8 @@ static int wdm_post_reset(struct usb_interface *intf) | |||
876 | int rv; | 892 | int rv; |
877 | 893 | ||
878 | rv = recover_from_urb_loss(desc); | 894 | rv = recover_from_urb_loss(desc); |
879 | mutex_unlock(&desc->lock); | 895 | mutex_unlock(&desc->wlock); |
896 | mutex_unlock(&desc->rlock); | ||
880 | return 0; | 897 | return 0; |
881 | } | 898 | } |
882 | 899 | ||
diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c index 2f51de57593a..c8df1dd967ef 100644 --- a/drivers/usb/dwc3/ep0.c +++ b/drivers/usb/dwc3/ep0.c | |||
@@ -126,7 +126,6 @@ static int __dwc3_gadget_ep0_queue(struct dwc3_ep *dep, | |||
126 | struct dwc3_request *req) | 126 | struct dwc3_request *req) |
127 | { | 127 | { |
128 | struct dwc3 *dwc = dep->dwc; | 128 | struct dwc3 *dwc = dep->dwc; |
129 | u32 type; | ||
130 | int ret = 0; | 129 | int ret = 0; |
131 | 130 | ||
132 | req->request.actual = 0; | 131 | req->request.actual = 0; |
@@ -149,20 +148,14 @@ static int __dwc3_gadget_ep0_queue(struct dwc3_ep *dep, | |||
149 | 148 | ||
150 | direction = !!(dep->flags & DWC3_EP0_DIR_IN); | 149 | direction = !!(dep->flags & DWC3_EP0_DIR_IN); |
151 | 150 | ||
152 | if (dwc->ep0state == EP0_STATUS_PHASE) { | 151 | if (dwc->ep0state != EP0_DATA_PHASE) { |
153 | type = dwc->three_stage_setup | 152 | dev_WARN(dwc->dev, "Unexpected pending request\n"); |
154 | ? DWC3_TRBCTL_CONTROL_STATUS3 | ||
155 | : DWC3_TRBCTL_CONTROL_STATUS2; | ||
156 | } else if (dwc->ep0state == EP0_DATA_PHASE) { | ||
157 | type = DWC3_TRBCTL_CONTROL_DATA; | ||
158 | } else { | ||
159 | /* should never happen */ | ||
160 | WARN_ON(1); | ||
161 | return 0; | 153 | return 0; |
162 | } | 154 | } |
163 | 155 | ||
164 | ret = dwc3_ep0_start_trans(dwc, direction, | 156 | ret = dwc3_ep0_start_trans(dwc, direction, |
165 | req->request.dma, req->request.length, type); | 157 | req->request.dma, req->request.length, |
158 | DWC3_TRBCTL_CONTROL_DATA); | ||
166 | dep->flags &= ~(DWC3_EP_PENDING_REQUEST | | 159 | dep->flags &= ~(DWC3_EP_PENDING_REQUEST | |
167 | DWC3_EP0_DIR_IN); | 160 | DWC3_EP0_DIR_IN); |
168 | } else if (dwc->delayed_status) { | 161 | } else if (dwc->delayed_status) { |
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index a696bde53222..064b6e2cd411 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c | |||
@@ -101,7 +101,7 @@ void dwc3_unmap_buffer_from_dma(struct dwc3_request *req) | |||
101 | if (req->request.num_mapped_sgs) { | 101 | if (req->request.num_mapped_sgs) { |
102 | req->request.dma = DMA_ADDR_INVALID; | 102 | req->request.dma = DMA_ADDR_INVALID; |
103 | dma_unmap_sg(dwc->dev, req->request.sg, | 103 | dma_unmap_sg(dwc->dev, req->request.sg, |
104 | req->request.num_sgs, | 104 | req->request.num_mapped_sgs, |
105 | req->direction ? DMA_TO_DEVICE | 105 | req->direction ? DMA_TO_DEVICE |
106 | : DMA_FROM_DEVICE); | 106 | : DMA_FROM_DEVICE); |
107 | 107 | ||
diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c index a95de6a4a134..baaebf2830fc 100644 --- a/drivers/usb/gadget/composite.c +++ b/drivers/usb/gadget/composite.c | |||
@@ -175,13 +175,12 @@ ep_found: | |||
175 | _ep->comp_desc = comp_desc; | 175 | _ep->comp_desc = comp_desc; |
176 | if (g->speed == USB_SPEED_SUPER) { | 176 | if (g->speed == USB_SPEED_SUPER) { |
177 | switch (usb_endpoint_type(_ep->desc)) { | 177 | switch (usb_endpoint_type(_ep->desc)) { |
178 | case USB_ENDPOINT_XFER_BULK: | ||
179 | case USB_ENDPOINT_XFER_INT: | ||
180 | _ep->maxburst = comp_desc->bMaxBurst; | ||
181 | break; | ||
182 | case USB_ENDPOINT_XFER_ISOC: | 178 | case USB_ENDPOINT_XFER_ISOC: |
183 | /* mult: bits 1:0 of bmAttributes */ | 179 | /* mult: bits 1:0 of bmAttributes */ |
184 | _ep->mult = comp_desc->bmAttributes & 0x3; | 180 | _ep->mult = comp_desc->bmAttributes & 0x3; |
181 | case USB_ENDPOINT_XFER_BULK: | ||
182 | case USB_ENDPOINT_XFER_INT: | ||
183 | _ep->maxburst = comp_desc->bMaxBurst; | ||
185 | break; | 184 | break; |
186 | default: | 185 | default: |
187 | /* Do nothing for control endpoints */ | 186 | /* Do nothing for control endpoints */ |
diff --git a/drivers/usb/gadget/epautoconf.c b/drivers/usb/gadget/epautoconf.c index 753aa0683ac1..e0e6375ef5dd 100644 --- a/drivers/usb/gadget/epautoconf.c +++ b/drivers/usb/gadget/epautoconf.c | |||
@@ -126,7 +126,7 @@ ep_matches ( | |||
126 | * descriptor and see if the EP matches it | 126 | * descriptor and see if the EP matches it |
127 | */ | 127 | */ |
128 | if (usb_endpoint_xfer_bulk(desc)) { | 128 | if (usb_endpoint_xfer_bulk(desc)) { |
129 | if (ep_comp) { | 129 | if (ep_comp && gadget->max_speed >= USB_SPEED_SUPER) { |
130 | num_req_streams = ep_comp->bmAttributes & 0x1f; | 130 | num_req_streams = ep_comp->bmAttributes & 0x1f; |
131 | if (num_req_streams > ep->max_streams) | 131 | if (num_req_streams > ep->max_streams) |
132 | return 0; | 132 | return 0; |
diff --git a/drivers/usb/gadget/f_mass_storage.c b/drivers/usb/gadget/f_mass_storage.c index 6353eca1e852..ee8ceec01560 100644 --- a/drivers/usb/gadget/f_mass_storage.c +++ b/drivers/usb/gadget/f_mass_storage.c | |||
@@ -3123,15 +3123,15 @@ fsg_add(struct usb_composite_dev *cdev, struct usb_configuration *c, | |||
3123 | 3123 | ||
3124 | struct fsg_module_parameters { | 3124 | struct fsg_module_parameters { |
3125 | char *file[FSG_MAX_LUNS]; | 3125 | char *file[FSG_MAX_LUNS]; |
3126 | int ro[FSG_MAX_LUNS]; | 3126 | bool ro[FSG_MAX_LUNS]; |
3127 | int removable[FSG_MAX_LUNS]; | 3127 | bool removable[FSG_MAX_LUNS]; |
3128 | int cdrom[FSG_MAX_LUNS]; | 3128 | bool cdrom[FSG_MAX_LUNS]; |
3129 | int nofua[FSG_MAX_LUNS]; | 3129 | bool nofua[FSG_MAX_LUNS]; |
3130 | 3130 | ||
3131 | unsigned int file_count, ro_count, removable_count, cdrom_count; | 3131 | unsigned int file_count, ro_count, removable_count, cdrom_count; |
3132 | unsigned int nofua_count; | 3132 | unsigned int nofua_count; |
3133 | unsigned int luns; /* nluns */ | 3133 | unsigned int luns; /* nluns */ |
3134 | int stall; /* can_stall */ | 3134 | bool stall; /* can_stall */ |
3135 | }; | 3135 | }; |
3136 | 3136 | ||
3137 | #define _FSG_MODULE_PARAM_ARRAY(prefix, params, name, type, desc) \ | 3137 | #define _FSG_MODULE_PARAM_ARRAY(prefix, params, name, type, desc) \ |
diff --git a/drivers/usb/gadget/fsl_udc_core.c b/drivers/usb/gadget/fsl_udc_core.c index d7ea6c076ce9..b04712f19f1e 100644 --- a/drivers/usb/gadget/fsl_udc_core.c +++ b/drivers/usb/gadget/fsl_udc_core.c | |||
@@ -1430,7 +1430,7 @@ static void setup_received_irq(struct fsl_udc *udc, | |||
1430 | int pipe = get_pipe_by_windex(wIndex); | 1430 | int pipe = get_pipe_by_windex(wIndex); |
1431 | struct fsl_ep *ep; | 1431 | struct fsl_ep *ep; |
1432 | 1432 | ||
1433 | if (wValue != 0 || wLength != 0 || pipe > udc->max_ep) | 1433 | if (wValue != 0 || wLength != 0 || pipe >= udc->max_ep) |
1434 | break; | 1434 | break; |
1435 | ep = get_ep_by_pipe(udc, pipe); | 1435 | ep = get_ep_by_pipe(udc, pipe); |
1436 | 1436 | ||
@@ -1673,7 +1673,7 @@ static void dtd_complete_irq(struct fsl_udc *udc) | |||
1673 | if (!bit_pos) | 1673 | if (!bit_pos) |
1674 | return; | 1674 | return; |
1675 | 1675 | ||
1676 | for (i = 0; i < udc->max_ep * 2; i++) { | 1676 | for (i = 0; i < udc->max_ep; i++) { |
1677 | ep_num = i >> 1; | 1677 | ep_num = i >> 1; |
1678 | direction = i % 2; | 1678 | direction = i % 2; |
1679 | 1679 | ||
diff --git a/drivers/usb/gadget/langwell_udc.c b/drivers/usb/gadget/langwell_udc.c index fa0fcc11263f..e2293c1588ee 100644 --- a/drivers/usb/gadget/langwell_udc.c +++ b/drivers/usb/gadget/langwell_udc.c | |||
@@ -11,11 +11,6 @@ | |||
11 | /* #undef DEBUG */ | 11 | /* #undef DEBUG */ |
12 | /* #undef VERBOSE_DEBUG */ | 12 | /* #undef VERBOSE_DEBUG */ |
13 | 13 | ||
14 | #if defined(CONFIG_USB_LANGWELL_OTG) | ||
15 | #define OTG_TRANSCEIVER | ||
16 | #endif | ||
17 | |||
18 | |||
19 | #include <linux/module.h> | 14 | #include <linux/module.h> |
20 | #include <linux/pci.h> | 15 | #include <linux/pci.h> |
21 | #include <linux/dma-mapping.h> | 16 | #include <linux/dma-mapping.h> |
@@ -1522,8 +1517,7 @@ static void langwell_udc_stop(struct langwell_udc *dev) | |||
1522 | 1517 | ||
1523 | 1518 | ||
1524 | /* stop all USB activities */ | 1519 | /* stop all USB activities */ |
1525 | static void stop_activity(struct langwell_udc *dev, | 1520 | static void stop_activity(struct langwell_udc *dev) |
1526 | struct usb_gadget_driver *driver) | ||
1527 | { | 1521 | { |
1528 | struct langwell_ep *ep; | 1522 | struct langwell_ep *ep; |
1529 | dev_dbg(&dev->pdev->dev, "---> %s()\n", __func__); | 1523 | dev_dbg(&dev->pdev->dev, "---> %s()\n", __func__); |
@@ -1535,9 +1529,9 @@ static void stop_activity(struct langwell_udc *dev, | |||
1535 | } | 1529 | } |
1536 | 1530 | ||
1537 | /* report disconnect; the driver is already quiesced */ | 1531 | /* report disconnect; the driver is already quiesced */ |
1538 | if (driver) { | 1532 | if (dev->driver) { |
1539 | spin_unlock(&dev->lock); | 1533 | spin_unlock(&dev->lock); |
1540 | driver->disconnect(&dev->gadget); | 1534 | dev->driver->disconnect(&dev->gadget); |
1541 | spin_lock(&dev->lock); | 1535 | spin_lock(&dev->lock); |
1542 | } | 1536 | } |
1543 | 1537 | ||
@@ -1925,11 +1919,10 @@ static int langwell_stop(struct usb_gadget *g, | |||
1925 | 1919 | ||
1926 | /* stop all usb activities */ | 1920 | /* stop all usb activities */ |
1927 | dev->gadget.speed = USB_SPEED_UNKNOWN; | 1921 | dev->gadget.speed = USB_SPEED_UNKNOWN; |
1928 | stop_activity(dev, driver); | ||
1929 | spin_unlock_irqrestore(&dev->lock, flags); | ||
1930 | |||
1931 | dev->gadget.dev.driver = NULL; | 1922 | dev->gadget.dev.driver = NULL; |
1932 | dev->driver = NULL; | 1923 | dev->driver = NULL; |
1924 | stop_activity(dev); | ||
1925 | spin_unlock_irqrestore(&dev->lock, flags); | ||
1933 | 1926 | ||
1934 | device_remove_file(&dev->pdev->dev, &dev_attr_function); | 1927 | device_remove_file(&dev->pdev->dev, &dev_attr_function); |
1935 | 1928 | ||
@@ -2315,13 +2308,9 @@ static void handle_setup_packet(struct langwell_udc *dev, | |||
2315 | 2308 | ||
2316 | if (!gadget_is_otg(&dev->gadget)) | 2309 | if (!gadget_is_otg(&dev->gadget)) |
2317 | break; | 2310 | break; |
2318 | else if (setup->bRequest == USB_DEVICE_B_HNP_ENABLE) { | 2311 | else if (setup->bRequest == USB_DEVICE_B_HNP_ENABLE) |
2319 | dev->gadget.b_hnp_enable = 1; | 2312 | dev->gadget.b_hnp_enable = 1; |
2320 | #ifdef OTG_TRANSCEIVER | 2313 | else if (setup->bRequest == USB_DEVICE_A_HNP_SUPPORT) |
2321 | if (!dev->lotg->otg.default_a) | ||
2322 | dev->lotg->hsm.b_hnp_enable = 1; | ||
2323 | #endif | ||
2324 | } else if (setup->bRequest == USB_DEVICE_A_HNP_SUPPORT) | ||
2325 | dev->gadget.a_hnp_support = 1; | 2314 | dev->gadget.a_hnp_support = 1; |
2326 | else if (setup->bRequest == | 2315 | else if (setup->bRequest == |
2327 | USB_DEVICE_A_ALT_HNP_SUPPORT) | 2316 | USB_DEVICE_A_ALT_HNP_SUPPORT) |
@@ -2733,7 +2722,7 @@ static void handle_usb_reset(struct langwell_udc *dev) | |||
2733 | dev->bus_reset = 1; | 2722 | dev->bus_reset = 1; |
2734 | 2723 | ||
2735 | /* reset all the queues, stop all USB activities */ | 2724 | /* reset all the queues, stop all USB activities */ |
2736 | stop_activity(dev, dev->driver); | 2725 | stop_activity(dev); |
2737 | dev->usb_state = USB_STATE_DEFAULT; | 2726 | dev->usb_state = USB_STATE_DEFAULT; |
2738 | } else { | 2727 | } else { |
2739 | dev_vdbg(&dev->pdev->dev, "device controller reset\n"); | 2728 | dev_vdbg(&dev->pdev->dev, "device controller reset\n"); |
@@ -2741,7 +2730,7 @@ static void handle_usb_reset(struct langwell_udc *dev) | |||
2741 | langwell_udc_reset(dev); | 2730 | langwell_udc_reset(dev); |
2742 | 2731 | ||
2743 | /* reset all the queues, stop all USB activities */ | 2732 | /* reset all the queues, stop all USB activities */ |
2744 | stop_activity(dev, dev->driver); | 2733 | stop_activity(dev); |
2745 | 2734 | ||
2746 | /* reset ep0 dQH and endptctrl */ | 2735 | /* reset ep0 dQH and endptctrl */ |
2747 | ep0_reset(dev); | 2736 | ep0_reset(dev); |
@@ -2752,12 +2741,6 @@ static void handle_usb_reset(struct langwell_udc *dev) | |||
2752 | dev->usb_state = USB_STATE_ATTACHED; | 2741 | dev->usb_state = USB_STATE_ATTACHED; |
2753 | } | 2742 | } |
2754 | 2743 | ||
2755 | #ifdef OTG_TRANSCEIVER | ||
2756 | /* refer to USB OTG 6.6.2.3 b_hnp_en is cleared */ | ||
2757 | if (!dev->lotg->otg.default_a) | ||
2758 | dev->lotg->hsm.b_hnp_enable = 0; | ||
2759 | #endif | ||
2760 | |||
2761 | dev_vdbg(&dev->pdev->dev, "<--- %s()\n", __func__); | 2744 | dev_vdbg(&dev->pdev->dev, "<--- %s()\n", __func__); |
2762 | } | 2745 | } |
2763 | 2746 | ||
@@ -2770,29 +2753,6 @@ static void handle_bus_suspend(struct langwell_udc *dev) | |||
2770 | dev->resume_state = dev->usb_state; | 2753 | dev->resume_state = dev->usb_state; |
2771 | dev->usb_state = USB_STATE_SUSPENDED; | 2754 | dev->usb_state = USB_STATE_SUSPENDED; |
2772 | 2755 | ||
2773 | #ifdef OTG_TRANSCEIVER | ||
2774 | if (dev->lotg->otg.default_a) { | ||
2775 | if (dev->lotg->hsm.b_bus_suspend_vld == 1) { | ||
2776 | dev->lotg->hsm.b_bus_suspend = 1; | ||
2777 | /* notify transceiver the state changes */ | ||
2778 | if (spin_trylock(&dev->lotg->wq_lock)) { | ||
2779 | langwell_update_transceiver(); | ||
2780 | spin_unlock(&dev->lotg->wq_lock); | ||
2781 | } | ||
2782 | } | ||
2783 | dev->lotg->hsm.b_bus_suspend_vld++; | ||
2784 | } else { | ||
2785 | if (!dev->lotg->hsm.a_bus_suspend) { | ||
2786 | dev->lotg->hsm.a_bus_suspend = 1; | ||
2787 | /* notify transceiver the state changes */ | ||
2788 | if (spin_trylock(&dev->lotg->wq_lock)) { | ||
2789 | langwell_update_transceiver(); | ||
2790 | spin_unlock(&dev->lotg->wq_lock); | ||
2791 | } | ||
2792 | } | ||
2793 | } | ||
2794 | #endif | ||
2795 | |||
2796 | /* report suspend to the driver */ | 2756 | /* report suspend to the driver */ |
2797 | if (dev->driver) { | 2757 | if (dev->driver) { |
2798 | if (dev->driver->suspend) { | 2758 | if (dev->driver->suspend) { |
@@ -2823,11 +2783,6 @@ static void handle_bus_resume(struct langwell_udc *dev) | |||
2823 | if (dev->pdev->device != 0x0829) | 2783 | if (dev->pdev->device != 0x0829) |
2824 | langwell_phy_low_power(dev, 0); | 2784 | langwell_phy_low_power(dev, 0); |
2825 | 2785 | ||
2826 | #ifdef OTG_TRANSCEIVER | ||
2827 | if (dev->lotg->otg.default_a == 0) | ||
2828 | dev->lotg->hsm.a_bus_suspend = 0; | ||
2829 | #endif | ||
2830 | |||
2831 | /* report resume to the driver */ | 2786 | /* report resume to the driver */ |
2832 | if (dev->driver) { | 2787 | if (dev->driver) { |
2833 | if (dev->driver->resume) { | 2788 | if (dev->driver->resume) { |
@@ -3020,7 +2975,6 @@ static void langwell_udc_remove(struct pci_dev *pdev) | |||
3020 | 2975 | ||
3021 | dev->done = &done; | 2976 | dev->done = &done; |
3022 | 2977 | ||
3023 | #ifndef OTG_TRANSCEIVER | ||
3024 | /* free dTD dma_pool and dQH */ | 2978 | /* free dTD dma_pool and dQH */ |
3025 | if (dev->dtd_pool) | 2979 | if (dev->dtd_pool) |
3026 | dma_pool_destroy(dev->dtd_pool); | 2980 | dma_pool_destroy(dev->dtd_pool); |
@@ -3032,7 +2986,6 @@ static void langwell_udc_remove(struct pci_dev *pdev) | |||
3032 | /* release SRAM caching */ | 2986 | /* release SRAM caching */ |
3033 | if (dev->has_sram && dev->got_sram) | 2987 | if (dev->has_sram && dev->got_sram) |
3034 | sram_deinit(dev); | 2988 | sram_deinit(dev); |
3035 | #endif | ||
3036 | 2989 | ||
3037 | if (dev->status_req) { | 2990 | if (dev->status_req) { |
3038 | kfree(dev->status_req->req.buf); | 2991 | kfree(dev->status_req->req.buf); |
@@ -3045,7 +2998,6 @@ static void langwell_udc_remove(struct pci_dev *pdev) | |||
3045 | if (dev->got_irq) | 2998 | if (dev->got_irq) |
3046 | free_irq(pdev->irq, dev); | 2999 | free_irq(pdev->irq, dev); |
3047 | 3000 | ||
3048 | #ifndef OTG_TRANSCEIVER | ||
3049 | if (dev->cap_regs) | 3001 | if (dev->cap_regs) |
3050 | iounmap(dev->cap_regs); | 3002 | iounmap(dev->cap_regs); |
3051 | 3003 | ||
@@ -3055,13 +3007,6 @@ static void langwell_udc_remove(struct pci_dev *pdev) | |||
3055 | 3007 | ||
3056 | if (dev->enabled) | 3008 | if (dev->enabled) |
3057 | pci_disable_device(pdev); | 3009 | pci_disable_device(pdev); |
3058 | #else | ||
3059 | if (dev->transceiver) { | ||
3060 | otg_put_transceiver(dev->transceiver); | ||
3061 | dev->transceiver = NULL; | ||
3062 | dev->lotg = NULL; | ||
3063 | } | ||
3064 | #endif | ||
3065 | 3010 | ||
3066 | dev->cap_regs = NULL; | 3011 | dev->cap_regs = NULL; |
3067 | 3012 | ||
@@ -3072,9 +3017,7 @@ static void langwell_udc_remove(struct pci_dev *pdev) | |||
3072 | device_remove_file(&pdev->dev, &dev_attr_langwell_udc); | 3017 | device_remove_file(&pdev->dev, &dev_attr_langwell_udc); |
3073 | device_remove_file(&pdev->dev, &dev_attr_remote_wakeup); | 3018 | device_remove_file(&pdev->dev, &dev_attr_remote_wakeup); |
3074 | 3019 | ||
3075 | #ifndef OTG_TRANSCEIVER | ||
3076 | pci_set_drvdata(pdev, NULL); | 3020 | pci_set_drvdata(pdev, NULL); |
3077 | #endif | ||
3078 | 3021 | ||
3079 | /* free dev, wait for the release() finished */ | 3022 | /* free dev, wait for the release() finished */ |
3080 | wait_for_completion(&done); | 3023 | wait_for_completion(&done); |
@@ -3089,9 +3032,7 @@ static int langwell_udc_probe(struct pci_dev *pdev, | |||
3089 | const struct pci_device_id *id) | 3032 | const struct pci_device_id *id) |
3090 | { | 3033 | { |
3091 | struct langwell_udc *dev; | 3034 | struct langwell_udc *dev; |
3092 | #ifndef OTG_TRANSCEIVER | ||
3093 | unsigned long resource, len; | 3035 | unsigned long resource, len; |
3094 | #endif | ||
3095 | void __iomem *base = NULL; | 3036 | void __iomem *base = NULL; |
3096 | size_t size; | 3037 | size_t size; |
3097 | int retval; | 3038 | int retval; |
@@ -3109,16 +3050,6 @@ static int langwell_udc_probe(struct pci_dev *pdev, | |||
3109 | dev->pdev = pdev; | 3050 | dev->pdev = pdev; |
3110 | dev_dbg(&dev->pdev->dev, "---> %s()\n", __func__); | 3051 | dev_dbg(&dev->pdev->dev, "---> %s()\n", __func__); |
3111 | 3052 | ||
3112 | #ifdef OTG_TRANSCEIVER | ||
3113 | /* PCI device is already enabled by otg_transceiver driver */ | ||
3114 | dev->enabled = 1; | ||
3115 | |||
3116 | /* mem region and register base */ | ||
3117 | dev->region = 1; | ||
3118 | dev->transceiver = otg_get_transceiver(); | ||
3119 | dev->lotg = otg_to_langwell(dev->transceiver); | ||
3120 | base = dev->lotg->regs; | ||
3121 | #else | ||
3122 | pci_set_drvdata(pdev, dev); | 3053 | pci_set_drvdata(pdev, dev); |
3123 | 3054 | ||
3124 | /* now all the pci goodies ... */ | 3055 | /* now all the pci goodies ... */ |
@@ -3139,7 +3070,6 @@ static int langwell_udc_probe(struct pci_dev *pdev, | |||
3139 | dev->region = 1; | 3070 | dev->region = 1; |
3140 | 3071 | ||
3141 | base = ioremap_nocache(resource, len); | 3072 | base = ioremap_nocache(resource, len); |
3142 | #endif | ||
3143 | if (base == NULL) { | 3073 | if (base == NULL) { |
3144 | dev_err(&dev->pdev->dev, "can't map memory\n"); | 3074 | dev_err(&dev->pdev->dev, "can't map memory\n"); |
3145 | retval = -EFAULT; | 3075 | retval = -EFAULT; |
@@ -3163,7 +3093,6 @@ static int langwell_udc_probe(struct pci_dev *pdev, | |||
3163 | dev->got_sram = 0; | 3093 | dev->got_sram = 0; |
3164 | dev_vdbg(&dev->pdev->dev, "dev->has_sram: %d\n", dev->has_sram); | 3094 | dev_vdbg(&dev->pdev->dev, "dev->has_sram: %d\n", dev->has_sram); |
3165 | 3095 | ||
3166 | #ifndef OTG_TRANSCEIVER | ||
3167 | /* enable SRAM caching if detected */ | 3096 | /* enable SRAM caching if detected */ |
3168 | if (dev->has_sram && !dev->got_sram) | 3097 | if (dev->has_sram && !dev->got_sram) |
3169 | sram_init(dev); | 3098 | sram_init(dev); |
@@ -3182,7 +3111,6 @@ static int langwell_udc_probe(struct pci_dev *pdev, | |||
3182 | goto error; | 3111 | goto error; |
3183 | } | 3112 | } |
3184 | dev->got_irq = 1; | 3113 | dev->got_irq = 1; |
3185 | #endif | ||
3186 | 3114 | ||
3187 | /* set stopped bit */ | 3115 | /* set stopped bit */ |
3188 | dev->stopped = 1; | 3116 | dev->stopped = 1; |
@@ -3257,10 +3185,8 @@ static int langwell_udc_probe(struct pci_dev *pdev, | |||
3257 | dev->remote_wakeup = 0; | 3185 | dev->remote_wakeup = 0; |
3258 | dev->dev_status = 1 << USB_DEVICE_SELF_POWERED; | 3186 | dev->dev_status = 1 << USB_DEVICE_SELF_POWERED; |
3259 | 3187 | ||
3260 | #ifndef OTG_TRANSCEIVER | ||
3261 | /* reset device controller */ | 3188 | /* reset device controller */ |
3262 | langwell_udc_reset(dev); | 3189 | langwell_udc_reset(dev); |
3263 | #endif | ||
3264 | 3190 | ||
3265 | /* initialize gadget structure */ | 3191 | /* initialize gadget structure */ |
3266 | dev->gadget.ops = &langwell_ops; /* usb_gadget_ops */ | 3192 | dev->gadget.ops = &langwell_ops; /* usb_gadget_ops */ |
@@ -3268,9 +3194,6 @@ static int langwell_udc_probe(struct pci_dev *pdev, | |||
3268 | INIT_LIST_HEAD(&dev->gadget.ep_list); /* ep_list */ | 3194 | INIT_LIST_HEAD(&dev->gadget.ep_list); /* ep_list */ |
3269 | dev->gadget.speed = USB_SPEED_UNKNOWN; /* speed */ | 3195 | dev->gadget.speed = USB_SPEED_UNKNOWN; /* speed */ |
3270 | dev->gadget.max_speed = USB_SPEED_HIGH; /* support dual speed */ | 3196 | dev->gadget.max_speed = USB_SPEED_HIGH; /* support dual speed */ |
3271 | #ifdef OTG_TRANSCEIVER | ||
3272 | dev->gadget.is_otg = 1; /* support otg mode */ | ||
3273 | #endif | ||
3274 | 3197 | ||
3275 | /* the "gadget" abstracts/virtualizes the controller */ | 3198 | /* the "gadget" abstracts/virtualizes the controller */ |
3276 | dev_set_name(&dev->gadget.dev, "gadget"); | 3199 | dev_set_name(&dev->gadget.dev, "gadget"); |
@@ -3282,10 +3205,8 @@ static int langwell_udc_probe(struct pci_dev *pdev, | |||
3282 | /* controller endpoints reinit */ | 3205 | /* controller endpoints reinit */ |
3283 | eps_reinit(dev); | 3206 | eps_reinit(dev); |
3284 | 3207 | ||
3285 | #ifndef OTG_TRANSCEIVER | ||
3286 | /* reset ep0 dQH and endptctrl */ | 3208 | /* reset ep0 dQH and endptctrl */ |
3287 | ep0_reset(dev); | 3209 | ep0_reset(dev); |
3288 | #endif | ||
3289 | 3210 | ||
3290 | /* create dTD dma_pool resource */ | 3211 | /* create dTD dma_pool resource */ |
3291 | dev->dtd_pool = dma_pool_create("langwell_dtd", | 3212 | dev->dtd_pool = dma_pool_create("langwell_dtd", |
@@ -3367,7 +3288,7 @@ static int langwell_udc_suspend(struct pci_dev *pdev, pm_message_t state) | |||
3367 | 3288 | ||
3368 | spin_lock_irq(&dev->lock); | 3289 | spin_lock_irq(&dev->lock); |
3369 | /* stop all usb activities */ | 3290 | /* stop all usb activities */ |
3370 | stop_activity(dev, dev->driver); | 3291 | stop_activity(dev); |
3371 | spin_unlock_irq(&dev->lock); | 3292 | spin_unlock_irq(&dev->lock); |
3372 | 3293 | ||
3373 | /* free dTD dma_pool and dQH */ | 3294 | /* free dTD dma_pool and dQH */ |
@@ -3525,22 +3446,14 @@ static struct pci_driver langwell_pci_driver = { | |||
3525 | 3446 | ||
3526 | static int __init init(void) | 3447 | static int __init init(void) |
3527 | { | 3448 | { |
3528 | #ifdef OTG_TRANSCEIVER | ||
3529 | return langwell_register_peripheral(&langwell_pci_driver); | ||
3530 | #else | ||
3531 | return pci_register_driver(&langwell_pci_driver); | 3449 | return pci_register_driver(&langwell_pci_driver); |
3532 | #endif | ||
3533 | } | 3450 | } |
3534 | module_init(init); | 3451 | module_init(init); |
3535 | 3452 | ||
3536 | 3453 | ||
3537 | static void __exit cleanup(void) | 3454 | static void __exit cleanup(void) |
3538 | { | 3455 | { |
3539 | #ifdef OTG_TRANSCEIVER | ||
3540 | return langwell_unregister_peripheral(&langwell_pci_driver); | ||
3541 | #else | ||
3542 | pci_unregister_driver(&langwell_pci_driver); | 3456 | pci_unregister_driver(&langwell_pci_driver); |
3543 | #endif | ||
3544 | } | 3457 | } |
3545 | module_exit(cleanup); | 3458 | module_exit(cleanup); |
3546 | 3459 | ||
diff --git a/drivers/usb/gadget/langwell_udc.h b/drivers/usb/gadget/langwell_udc.h index ef79e242b7b0..d6e78accaffe 100644 --- a/drivers/usb/gadget/langwell_udc.h +++ b/drivers/usb/gadget/langwell_udc.h | |||
@@ -8,7 +8,6 @@ | |||
8 | */ | 8 | */ |
9 | 9 | ||
10 | #include <linux/usb/langwell_udc.h> | 10 | #include <linux/usb/langwell_udc.h> |
11 | #include <linux/usb/langwell_otg.h> | ||
12 | 11 | ||
13 | /*-------------------------------------------------------------------------*/ | 12 | /*-------------------------------------------------------------------------*/ |
14 | 13 | ||
diff --git a/drivers/usb/gadget/storage_common.c b/drivers/usb/gadget/storage_common.c index c7f291a331df..85ea14e2545e 100644 --- a/drivers/usb/gadget/storage_common.c +++ b/drivers/usb/gadget/storage_common.c | |||
@@ -598,16 +598,16 @@ static __maybe_unused struct usb_ss_cap_descriptor fsg_ss_cap_desc = { | |||
598 | | USB_5GBPS_OPERATION), | 598 | | USB_5GBPS_OPERATION), |
599 | .bFunctionalitySupport = USB_LOW_SPEED_OPERATION, | 599 | .bFunctionalitySupport = USB_LOW_SPEED_OPERATION, |
600 | .bU1devExitLat = USB_DEFAULT_U1_DEV_EXIT_LAT, | 600 | .bU1devExitLat = USB_DEFAULT_U1_DEV_EXIT_LAT, |
601 | .bU2DevExitLat = USB_DEFAULT_U2_DEV_EXIT_LAT, | 601 | .bU2DevExitLat = cpu_to_le16(USB_DEFAULT_U2_DEV_EXIT_LAT), |
602 | }; | 602 | }; |
603 | 603 | ||
604 | static __maybe_unused struct usb_bos_descriptor fsg_bos_desc = { | 604 | static __maybe_unused struct usb_bos_descriptor fsg_bos_desc = { |
605 | .bLength = USB_DT_BOS_SIZE, | 605 | .bLength = USB_DT_BOS_SIZE, |
606 | .bDescriptorType = USB_DT_BOS, | 606 | .bDescriptorType = USB_DT_BOS, |
607 | 607 | ||
608 | .wTotalLength = USB_DT_BOS_SIZE | 608 | .wTotalLength = cpu_to_le16(USB_DT_BOS_SIZE |
609 | + USB_DT_USB_EXT_CAP_SIZE | 609 | + USB_DT_USB_EXT_CAP_SIZE |
610 | + USB_DT_USB_SS_CAP_SIZE, | 610 | + USB_DT_USB_SS_CAP_SIZE), |
611 | 611 | ||
612 | .bNumDeviceCaps = 2, | 612 | .bNumDeviceCaps = 2, |
613 | }; | 613 | }; |
diff --git a/drivers/usb/host/ehci-fsl.c b/drivers/usb/host/ehci-fsl.c index e90344a17631..b556a72264d1 100644 --- a/drivers/usb/host/ehci-fsl.c +++ b/drivers/usb/host/ehci-fsl.c | |||
@@ -125,7 +125,7 @@ static int usb_hcd_fsl_probe(const struct hc_driver *driver, | |||
125 | */ | 125 | */ |
126 | if (pdata->init && pdata->init(pdev)) { | 126 | if (pdata->init && pdata->init(pdev)) { |
127 | retval = -ENODEV; | 127 | retval = -ENODEV; |
128 | goto err3; | 128 | goto err4; |
129 | } | 129 | } |
130 | 130 | ||
131 | /* Enable USB controller, 83xx or 8536 */ | 131 | /* Enable USB controller, 83xx or 8536 */ |
diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c index f4b627d343ac..01bb7241d6ef 100644 --- a/drivers/usb/host/ehci-pci.c +++ b/drivers/usb/host/ehci-pci.c | |||
@@ -276,6 +276,9 @@ static int ehci_pci_setup(struct usb_hcd *hcd) | |||
276 | 276 | ||
277 | /* Serial Bus Release Number is at PCI 0x60 offset */ | 277 | /* Serial Bus Release Number is at PCI 0x60 offset */ |
278 | pci_read_config_byte(pdev, 0x60, &ehci->sbrn); | 278 | pci_read_config_byte(pdev, 0x60, &ehci->sbrn); |
279 | if (pdev->vendor == PCI_VENDOR_ID_STMICRO | ||
280 | && pdev->device == PCI_DEVICE_ID_STMICRO_USB_HOST) | ||
281 | ehci->sbrn = 0x20; /* ConneXT has no sbrn register */ | ||
279 | 282 | ||
280 | /* Keep this around for a while just in case some EHCI | 283 | /* Keep this around for a while just in case some EHCI |
281 | * implementation uses legacy PCI PM support. This test | 284 | * implementation uses legacy PCI PM support. This test |
@@ -526,6 +529,9 @@ static const struct pci_device_id pci_ids [] = { { | |||
526 | /* handle any USB 2.0 EHCI controller */ | 529 | /* handle any USB 2.0 EHCI controller */ |
527 | PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_USB_EHCI, ~0), | 530 | PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_USB_EHCI, ~0), |
528 | .driver_data = (unsigned long) &ehci_pci_hc_driver, | 531 | .driver_data = (unsigned long) &ehci_pci_hc_driver, |
532 | }, { | ||
533 | PCI_VDEVICE(STMICRO, PCI_DEVICE_ID_STMICRO_USB_HOST), | ||
534 | .driver_data = (unsigned long) &ehci_pci_hc_driver, | ||
529 | }, | 535 | }, |
530 | { /* end: all zeroes */ } | 536 | { /* end: all zeroes */ } |
531 | }; | 537 | }; |
diff --git a/drivers/usb/host/ohci-at91.c b/drivers/usb/host/ohci-at91.c index 5df0b0e3392b..77afabc77f9b 100644 --- a/drivers/usb/host/ohci-at91.c +++ b/drivers/usb/host/ohci-at91.c | |||
@@ -139,8 +139,23 @@ static int usb_hcd_at91_probe(const struct hc_driver *driver, | |||
139 | } | 139 | } |
140 | 140 | ||
141 | iclk = clk_get(&pdev->dev, "ohci_clk"); | 141 | iclk = clk_get(&pdev->dev, "ohci_clk"); |
142 | if (IS_ERR(iclk)) { | ||
143 | dev_err(&pdev->dev, "failed to get ohci_clk\n"); | ||
144 | retval = PTR_ERR(iclk); | ||
145 | goto err3; | ||
146 | } | ||
142 | fclk = clk_get(&pdev->dev, "uhpck"); | 147 | fclk = clk_get(&pdev->dev, "uhpck"); |
148 | if (IS_ERR(fclk)) { | ||
149 | dev_err(&pdev->dev, "failed to get uhpck\n"); | ||
150 | retval = PTR_ERR(fclk); | ||
151 | goto err4; | ||
152 | } | ||
143 | hclk = clk_get(&pdev->dev, "hclk"); | 153 | hclk = clk_get(&pdev->dev, "hclk"); |
154 | if (IS_ERR(hclk)) { | ||
155 | dev_err(&pdev->dev, "failed to get hclk\n"); | ||
156 | retval = PTR_ERR(hclk); | ||
157 | goto err5; | ||
158 | } | ||
144 | 159 | ||
145 | at91_start_hc(pdev); | 160 | at91_start_hc(pdev); |
146 | ohci_hcd_init(hcd_to_ohci(hcd)); | 161 | ohci_hcd_init(hcd_to_ohci(hcd)); |
@@ -153,9 +168,12 @@ static int usb_hcd_at91_probe(const struct hc_driver *driver, | |||
153 | at91_stop_hc(pdev); | 168 | at91_stop_hc(pdev); |
154 | 169 | ||
155 | clk_put(hclk); | 170 | clk_put(hclk); |
171 | err5: | ||
156 | clk_put(fclk); | 172 | clk_put(fclk); |
173 | err4: | ||
157 | clk_put(iclk); | 174 | clk_put(iclk); |
158 | 175 | ||
176 | err3: | ||
159 | iounmap(hcd->regs); | 177 | iounmap(hcd->regs); |
160 | 178 | ||
161 | err2: | 179 | err2: |
@@ -226,7 +244,8 @@ static void ohci_at91_usb_set_power(struct at91_usbh_data *pdata, int port, int | |||
226 | if (!gpio_is_valid(pdata->vbus_pin[port])) | 244 | if (!gpio_is_valid(pdata->vbus_pin[port])) |
227 | return; | 245 | return; |
228 | 246 | ||
229 | gpio_set_value(pdata->vbus_pin[port], !pdata->vbus_pin_inverted ^ enable); | 247 | gpio_set_value(pdata->vbus_pin[port], |
248 | !pdata->vbus_pin_active_low[port] ^ enable); | ||
230 | } | 249 | } |
231 | 250 | ||
232 | static int ohci_at91_usb_get_power(struct at91_usbh_data *pdata, int port) | 251 | static int ohci_at91_usb_get_power(struct at91_usbh_data *pdata, int port) |
@@ -237,7 +256,8 @@ static int ohci_at91_usb_get_power(struct at91_usbh_data *pdata, int port) | |||
237 | if (!gpio_is_valid(pdata->vbus_pin[port])) | 256 | if (!gpio_is_valid(pdata->vbus_pin[port])) |
238 | return -EINVAL; | 257 | return -EINVAL; |
239 | 258 | ||
240 | return gpio_get_value(pdata->vbus_pin[port]) ^ !pdata->vbus_pin_inverted; | 259 | return gpio_get_value(pdata->vbus_pin[port]) ^ |
260 | !pdata->vbus_pin_active_low[port]; | ||
241 | } | 261 | } |
242 | 262 | ||
243 | /* | 263 | /* |
diff --git a/drivers/usb/host/ohci-dbg.c b/drivers/usb/host/ohci-dbg.c index 5179fcd73d8a..e4bcb62b930a 100644 --- a/drivers/usb/host/ohci-dbg.c +++ b/drivers/usb/host/ohci-dbg.c | |||
@@ -82,6 +82,14 @@ urb_print(struct urb * urb, char * str, int small, int status) | |||
82 | ohci_dbg(ohci,format, ## arg ); \ | 82 | ohci_dbg(ohci,format, ## arg ); \ |
83 | } while (0); | 83 | } while (0); |
84 | 84 | ||
85 | /* Version for use where "next" is the address of a local variable */ | ||
86 | #define ohci_dbg_nosw(ohci, next, size, format, arg...) \ | ||
87 | do { \ | ||
88 | unsigned s_len; \ | ||
89 | s_len = scnprintf(*next, *size, format, ## arg); \ | ||
90 | *size -= s_len; *next += s_len; \ | ||
91 | } while (0); | ||
92 | |||
85 | 93 | ||
86 | static void ohci_dump_intr_mask ( | 94 | static void ohci_dump_intr_mask ( |
87 | struct ohci_hcd *ohci, | 95 | struct ohci_hcd *ohci, |
@@ -653,7 +661,7 @@ static ssize_t fill_registers_buffer(struct debug_buffer *buf) | |||
653 | 661 | ||
654 | /* dump driver info, then registers in spec order */ | 662 | /* dump driver info, then registers in spec order */ |
655 | 663 | ||
656 | ohci_dbg_sw (ohci, &next, &size, | 664 | ohci_dbg_nosw(ohci, &next, &size, |
657 | "bus %s, device %s\n" | 665 | "bus %s, device %s\n" |
658 | "%s\n" | 666 | "%s\n" |
659 | "%s\n", | 667 | "%s\n", |
@@ -672,7 +680,7 @@ static ssize_t fill_registers_buffer(struct debug_buffer *buf) | |||
672 | 680 | ||
673 | /* hcca */ | 681 | /* hcca */ |
674 | if (ohci->hcca) | 682 | if (ohci->hcca) |
675 | ohci_dbg_sw (ohci, &next, &size, | 683 | ohci_dbg_nosw(ohci, &next, &size, |
676 | "hcca frame 0x%04x\n", ohci_frame_no(ohci)); | 684 | "hcca frame 0x%04x\n", ohci_frame_no(ohci)); |
677 | 685 | ||
678 | /* other registers mostly affect frame timings */ | 686 | /* other registers mostly affect frame timings */ |
diff --git a/drivers/usb/host/ohci-pci.c b/drivers/usb/host/ohci-pci.c index 6109810cc2d3..1843bb68ac7c 100644 --- a/drivers/usb/host/ohci-pci.c +++ b/drivers/usb/host/ohci-pci.c | |||
@@ -397,6 +397,10 @@ static const struct pci_device_id pci_ids [] = { { | |||
397 | /* handle any USB OHCI controller */ | 397 | /* handle any USB OHCI controller */ |
398 | PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_USB_OHCI, ~0), | 398 | PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_USB_OHCI, ~0), |
399 | .driver_data = (unsigned long) &ohci_pci_hc_driver, | 399 | .driver_data = (unsigned long) &ohci_pci_hc_driver, |
400 | }, { | ||
401 | /* The device in the ConneXT I/O hub has no class reg */ | ||
402 | PCI_VDEVICE(STMICRO, PCI_DEVICE_ID_STMICRO_USB_OHCI), | ||
403 | .driver_data = (unsigned long) &ohci_pci_hc_driver, | ||
400 | }, { /* end: all zeroes */ } | 404 | }, { /* end: all zeroes */ } |
401 | }; | 405 | }; |
402 | MODULE_DEVICE_TABLE (pci, pci_ids); | 406 | MODULE_DEVICE_TABLE (pci, pci_ids); |
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index b90e1386418b..b62037bff688 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c | |||
@@ -1204,6 +1204,7 @@ static void handle_vendor_event(struct xhci_hcd *xhci, | |||
1204 | * | 1204 | * |
1205 | * Returns a zero-based port number, which is suitable for indexing into each of | 1205 | * Returns a zero-based port number, which is suitable for indexing into each of |
1206 | * the split roothubs' port arrays and bus state arrays. | 1206 | * the split roothubs' port arrays and bus state arrays. |
1207 | * Add one to it in order to call xhci_find_slot_id_by_port. | ||
1207 | */ | 1208 | */ |
1208 | static unsigned int find_faked_portnum_from_hw_portnum(struct usb_hcd *hcd, | 1209 | static unsigned int find_faked_portnum_from_hw_portnum(struct usb_hcd *hcd, |
1209 | struct xhci_hcd *xhci, u32 port_id) | 1210 | struct xhci_hcd *xhci, u32 port_id) |
@@ -1324,7 +1325,7 @@ static void handle_port_status(struct xhci_hcd *xhci, | |||
1324 | xhci_set_link_state(xhci, port_array, faked_port_index, | 1325 | xhci_set_link_state(xhci, port_array, faked_port_index, |
1325 | XDEV_U0); | 1326 | XDEV_U0); |
1326 | slot_id = xhci_find_slot_id_by_port(hcd, xhci, | 1327 | slot_id = xhci_find_slot_id_by_port(hcd, xhci, |
1327 | faked_port_index); | 1328 | faked_port_index + 1); |
1328 | if (!slot_id) { | 1329 | if (!slot_id) { |
1329 | xhci_dbg(xhci, "slot_id is zero\n"); | 1330 | xhci_dbg(xhci, "slot_id is zero\n"); |
1330 | goto cleanup; | 1331 | goto cleanup; |
@@ -3323,7 +3324,8 @@ static int xhci_queue_isoc_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
3323 | /* Check TD length */ | 3324 | /* Check TD length */ |
3324 | if (running_total != td_len) { | 3325 | if (running_total != td_len) { |
3325 | xhci_err(xhci, "ISOC TD length unmatch\n"); | 3326 | xhci_err(xhci, "ISOC TD length unmatch\n"); |
3326 | return -EINVAL; | 3327 | ret = -EINVAL; |
3328 | goto cleanup; | ||
3327 | } | 3329 | } |
3328 | } | 3330 | } |
3329 | 3331 | ||
diff --git a/drivers/usb/misc/emi26.c b/drivers/usb/misc/emi26.c index d9b6a0355443..da97dcec1f32 100644 --- a/drivers/usb/misc/emi26.c +++ b/drivers/usb/misc/emi26.c | |||
@@ -37,9 +37,6 @@ static int emi26_set_reset(struct usb_device *dev, unsigned char reset_bit); | |||
37 | static int emi26_load_firmware (struct usb_device *dev); | 37 | static int emi26_load_firmware (struct usb_device *dev); |
38 | static int emi26_probe(struct usb_interface *intf, const struct usb_device_id *id); | 38 | static int emi26_probe(struct usb_interface *intf, const struct usb_device_id *id); |
39 | static void emi26_disconnect(struct usb_interface *intf); | 39 | static void emi26_disconnect(struct usb_interface *intf); |
40 | static int __init emi26_init (void); | ||
41 | static void __exit emi26_exit (void); | ||
42 | |||
43 | 40 | ||
44 | /* thanks to drivers/usb/serial/keyspan_pda.c code */ | 41 | /* thanks to drivers/usb/serial/keyspan_pda.c code */ |
45 | static int emi26_writememory (struct usb_device *dev, int address, | 42 | static int emi26_writememory (struct usb_device *dev, int address, |
diff --git a/drivers/usb/misc/emi62.c b/drivers/usb/misc/emi62.c index 9f39062ebb08..4e0f167a6c4e 100644 --- a/drivers/usb/misc/emi62.c +++ b/drivers/usb/misc/emi62.c | |||
@@ -46,9 +46,6 @@ static int emi62_set_reset(struct usb_device *dev, unsigned char reset_bit); | |||
46 | static int emi62_load_firmware (struct usb_device *dev); | 46 | static int emi62_load_firmware (struct usb_device *dev); |
47 | static int emi62_probe(struct usb_interface *intf, const struct usb_device_id *id); | 47 | static int emi62_probe(struct usb_interface *intf, const struct usb_device_id *id); |
48 | static void emi62_disconnect(struct usb_interface *intf); | 48 | static void emi62_disconnect(struct usb_interface *intf); |
49 | static int __init emi62_init (void); | ||
50 | static void __exit emi62_exit (void); | ||
51 | |||
52 | 49 | ||
53 | /* thanks to drivers/usb/serial/keyspan_pda.c code */ | 50 | /* thanks to drivers/usb/serial/keyspan_pda.c code */ |
54 | static int emi62_writememory(struct usb_device *dev, int address, | 51 | static int emi62_writememory(struct usb_device *dev, int address, |
diff --git a/drivers/usb/misc/usbsevseg.c b/drivers/usb/misc/usbsevseg.c index 107bf13b1cf1..b2d82b937392 100644 --- a/drivers/usb/misc/usbsevseg.c +++ b/drivers/usb/misc/usbsevseg.c | |||
@@ -24,7 +24,7 @@ | |||
24 | 24 | ||
25 | #define VENDOR_ID 0x0fc5 | 25 | #define VENDOR_ID 0x0fc5 |
26 | #define PRODUCT_ID 0x1227 | 26 | #define PRODUCT_ID 0x1227 |
27 | #define MAXLEN 6 | 27 | #define MAXLEN 8 |
28 | 28 | ||
29 | /* table of devices that work with this driver */ | 29 | /* table of devices that work with this driver */ |
30 | static const struct usb_device_id id_table[] = { | 30 | static const struct usb_device_id id_table[] = { |
diff --git a/drivers/usb/musb/davinci.c b/drivers/usb/musb/davinci.c index f9a3f62a83b5..7c569f51212a 100644 --- a/drivers/usb/musb/davinci.c +++ b/drivers/usb/musb/davinci.c | |||
@@ -33,9 +33,6 @@ | |||
33 | #include <linux/platform_device.h> | 33 | #include <linux/platform_device.h> |
34 | #include <linux/dma-mapping.h> | 34 | #include <linux/dma-mapping.h> |
35 | 35 | ||
36 | #include <mach/hardware.h> | ||
37 | #include <mach/memory.h> | ||
38 | #include <asm/gpio.h> | ||
39 | #include <mach/cputype.h> | 36 | #include <mach/cputype.h> |
40 | 37 | ||
41 | #include <asm/mach-types.h> | 38 | #include <asm/mach-types.h> |
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c index 56cf0243979e..3d11cf64ebd1 100644 --- a/drivers/usb/musb/musb_core.c +++ b/drivers/usb/musb/musb_core.c | |||
@@ -981,6 +981,9 @@ static void musb_shutdown(struct platform_device *pdev) | |||
981 | unsigned long flags; | 981 | unsigned long flags; |
982 | 982 | ||
983 | pm_runtime_get_sync(musb->controller); | 983 | pm_runtime_get_sync(musb->controller); |
984 | |||
985 | musb_gadget_cleanup(musb); | ||
986 | |||
984 | spin_lock_irqsave(&musb->lock, flags); | 987 | spin_lock_irqsave(&musb->lock, flags); |
985 | musb_platform_disable(musb); | 988 | musb_platform_disable(musb); |
986 | musb_generic_disable(musb); | 989 | musb_generic_disable(musb); |
@@ -1827,8 +1830,6 @@ static void musb_free(struct musb *musb) | |||
1827 | sysfs_remove_group(&musb->controller->kobj, &musb_attr_group); | 1830 | sysfs_remove_group(&musb->controller->kobj, &musb_attr_group); |
1828 | #endif | 1831 | #endif |
1829 | 1832 | ||
1830 | musb_gadget_cleanup(musb); | ||
1831 | |||
1832 | if (musb->nIrq >= 0) { | 1833 | if (musb->nIrq >= 0) { |
1833 | if (musb->irq_wake) | 1834 | if (musb->irq_wake) |
1834 | disable_irq_wake(musb->nIrq); | 1835 | disable_irq_wake(musb->nIrq); |
diff --git a/drivers/usb/musb/omap2430.c b/drivers/usb/musb/omap2430.c index c27bbbf32b52..df719eae3b03 100644 --- a/drivers/usb/musb/omap2430.c +++ b/drivers/usb/musb/omap2430.c | |||
@@ -222,7 +222,6 @@ static inline void omap2430_low_level_init(struct musb *musb) | |||
222 | musb_writel(musb->mregs, OTG_FORCESTDBY, l); | 222 | musb_writel(musb->mregs, OTG_FORCESTDBY, l); |
223 | } | 223 | } |
224 | 224 | ||
225 | /* blocking notifier support */ | ||
226 | static int musb_otg_notifications(struct notifier_block *nb, | 225 | static int musb_otg_notifications(struct notifier_block *nb, |
227 | unsigned long event, void *unused) | 226 | unsigned long event, void *unused) |
228 | { | 227 | { |
@@ -231,7 +230,7 @@ static int musb_otg_notifications(struct notifier_block *nb, | |||
231 | musb->xceiv_event = event; | 230 | musb->xceiv_event = event; |
232 | schedule_work(&musb->otg_notifier_work); | 231 | schedule_work(&musb->otg_notifier_work); |
233 | 232 | ||
234 | return 0; | 233 | return NOTIFY_OK; |
235 | } | 234 | } |
236 | 235 | ||
237 | static void musb_otg_notifier_work(struct work_struct *data_notifier_work) | 236 | static void musb_otg_notifier_work(struct work_struct *data_notifier_work) |
@@ -386,6 +385,7 @@ static void omap2430_musb_disable(struct musb *musb) | |||
386 | static int omap2430_musb_exit(struct musb *musb) | 385 | static int omap2430_musb_exit(struct musb *musb) |
387 | { | 386 | { |
388 | del_timer_sync(&musb_idle_timer); | 387 | del_timer_sync(&musb_idle_timer); |
388 | cancel_work_sync(&musb->otg_notifier_work); | ||
389 | 389 | ||
390 | omap2430_low_level_exit(musb); | 390 | omap2430_low_level_exit(musb); |
391 | otg_put_transceiver(musb->xceiv); | 391 | otg_put_transceiver(musb->xceiv); |
diff --git a/drivers/usb/otg/Kconfig b/drivers/usb/otg/Kconfig index 2a25955881fc..76d629345418 100644 --- a/drivers/usb/otg/Kconfig +++ b/drivers/usb/otg/Kconfig | |||
@@ -86,20 +86,6 @@ config NOP_USB_XCEIV | |||
86 | built-in with usb ip or which are autonomous and doesn't require any | 86 | built-in with usb ip or which are autonomous and doesn't require any |
87 | phy programming such as ISP1x04 etc. | 87 | phy programming such as ISP1x04 etc. |
88 | 88 | ||
89 | config USB_LANGWELL_OTG | ||
90 | tristate "Intel Langwell USB OTG dual-role support" | ||
91 | depends on USB && PCI && INTEL_SCU_IPC | ||
92 | select USB_OTG | ||
93 | select USB_OTG_UTILS | ||
94 | help | ||
95 | Say Y here if you want to build Intel Langwell USB OTG | ||
96 | transciever driver in kernel. This driver implements role | ||
97 | switch between EHCI host driver and Langwell USB OTG | ||
98 | client driver. | ||
99 | |||
100 | To compile this driver as a module, choose M here: the | ||
101 | module will be called langwell_otg. | ||
102 | |||
103 | config USB_MSM_OTG | 89 | config USB_MSM_OTG |
104 | tristate "OTG support for Qualcomm on-chip USB controller" | 90 | tristate "OTG support for Qualcomm on-chip USB controller" |
105 | depends on (USB || USB_GADGET) && ARCH_MSM | 91 | depends on (USB || USB_GADGET) && ARCH_MSM |
@@ -124,7 +110,7 @@ config AB8500_USB | |||
124 | 110 | ||
125 | config FSL_USB2_OTG | 111 | config FSL_USB2_OTG |
126 | bool "Freescale USB OTG Transceiver Driver" | 112 | bool "Freescale USB OTG Transceiver Driver" |
127 | depends on USB_EHCI_FSL && USB_GADGET_FSL_USB2 | 113 | depends on USB_EHCI_FSL && USB_GADGET_FSL_USB2 && USB_SUSPEND |
128 | select USB_OTG | 114 | select USB_OTG |
129 | select USB_OTG_UTILS | 115 | select USB_OTG_UTILS |
130 | help | 116 | help |
@@ -132,7 +118,7 @@ config FSL_USB2_OTG | |||
132 | 118 | ||
133 | config USB_MV_OTG | 119 | config USB_MV_OTG |
134 | tristate "Marvell USB OTG support" | 120 | tristate "Marvell USB OTG support" |
135 | depends on USB_MV_UDC | 121 | depends on USB_MV_UDC && USB_SUSPEND |
136 | select USB_OTG | 122 | select USB_OTG |
137 | select USB_OTG_UTILS | 123 | select USB_OTG_UTILS |
138 | help | 124 | help |
diff --git a/drivers/usb/otg/Makefile b/drivers/usb/otg/Makefile index b2c5a9598637..41aa5098b139 100644 --- a/drivers/usb/otg/Makefile +++ b/drivers/usb/otg/Makefile | |||
@@ -13,7 +13,6 @@ obj-$(CONFIG_USB_GPIO_VBUS) += gpio_vbus.o | |||
13 | obj-$(CONFIG_ISP1301_OMAP) += isp1301_omap.o | 13 | obj-$(CONFIG_ISP1301_OMAP) += isp1301_omap.o |
14 | obj-$(CONFIG_TWL4030_USB) += twl4030-usb.o | 14 | obj-$(CONFIG_TWL4030_USB) += twl4030-usb.o |
15 | obj-$(CONFIG_TWL6030_USB) += twl6030-usb.o | 15 | obj-$(CONFIG_TWL6030_USB) += twl6030-usb.o |
16 | obj-$(CONFIG_USB_LANGWELL_OTG) += langwell_otg.o | ||
17 | obj-$(CONFIG_NOP_USB_XCEIV) += nop-usb-xceiv.o | 16 | obj-$(CONFIG_NOP_USB_XCEIV) += nop-usb-xceiv.o |
18 | obj-$(CONFIG_USB_ULPI) += ulpi.o | 17 | obj-$(CONFIG_USB_ULPI) += ulpi.o |
19 | obj-$(CONFIG_USB_ULPI_VIEWPORT) += ulpi_viewport.o | 18 | obj-$(CONFIG_USB_ULPI_VIEWPORT) += ulpi_viewport.o |
diff --git a/drivers/usb/otg/langwell_otg.c b/drivers/usb/otg/langwell_otg.c deleted file mode 100644 index f08f784086f7..000000000000 --- a/drivers/usb/otg/langwell_otg.c +++ /dev/null | |||
@@ -1,2347 +0,0 @@ | |||
1 | /* | ||
2 | * Intel Langwell USB OTG transceiver driver | ||
3 | * Copyright (C) 2008 - 2010, Intel Corporation. | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify it | ||
6 | * under the terms and conditions of the GNU General Public License, | ||
7 | * version 2, as published by the Free Software Foundation. | ||
8 | * | ||
9 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
12 | * more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License along with | ||
15 | * this program; if not, write to the Free Software Foundation, Inc., | ||
16 | * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. | ||
17 | * | ||
18 | */ | ||
19 | /* This driver helps to switch Langwell OTG controller function between host | ||
20 | * and peripheral. It works with EHCI driver and Langwell client controller | ||
21 | * driver together. | ||
22 | */ | ||
23 | #include <linux/module.h> | ||
24 | #include <linux/init.h> | ||
25 | #include <linux/pci.h> | ||
26 | #include <linux/errno.h> | ||
27 | #include <linux/interrupt.h> | ||
28 | #include <linux/kernel.h> | ||
29 | #include <linux/device.h> | ||
30 | #include <linux/moduleparam.h> | ||
31 | #include <linux/usb/ch9.h> | ||
32 | #include <linux/usb/gadget.h> | ||
33 | #include <linux/usb.h> | ||
34 | #include <linux/usb/otg.h> | ||
35 | #include <linux/usb/hcd.h> | ||
36 | #include <linux/notifier.h> | ||
37 | #include <linux/delay.h> | ||
38 | #include <asm/intel_scu_ipc.h> | ||
39 | |||
40 | #include <linux/usb/langwell_otg.h> | ||
41 | |||
42 | #define DRIVER_DESC "Intel Langwell USB OTG transceiver driver" | ||
43 | #define DRIVER_VERSION "July 10, 2010" | ||
44 | |||
45 | MODULE_DESCRIPTION(DRIVER_DESC); | ||
46 | MODULE_AUTHOR("Henry Yuan <hang.yuan@intel.com>, Hao Wu <hao.wu@intel.com>"); | ||
47 | MODULE_VERSION(DRIVER_VERSION); | ||
48 | MODULE_LICENSE("GPL"); | ||
49 | |||
50 | static const char driver_name[] = "langwell_otg"; | ||
51 | |||
52 | static int langwell_otg_probe(struct pci_dev *pdev, | ||
53 | const struct pci_device_id *id); | ||
54 | static void langwell_otg_remove(struct pci_dev *pdev); | ||
55 | static int langwell_otg_suspend(struct pci_dev *pdev, pm_message_t message); | ||
56 | static int langwell_otg_resume(struct pci_dev *pdev); | ||
57 | |||
58 | static int langwell_otg_set_host(struct otg_transceiver *otg, | ||
59 | struct usb_bus *host); | ||
60 | static int langwell_otg_set_peripheral(struct otg_transceiver *otg, | ||
61 | struct usb_gadget *gadget); | ||
62 | static int langwell_otg_start_srp(struct otg_transceiver *otg); | ||
63 | |||
64 | static const struct pci_device_id pci_ids[] = {{ | ||
65 | .class = ((PCI_CLASS_SERIAL_USB << 8) | 0xfe), | ||
66 | .class_mask = ~0, | ||
67 | .vendor = 0x8086, | ||
68 | .device = 0x0811, | ||
69 | .subvendor = PCI_ANY_ID, | ||
70 | .subdevice = PCI_ANY_ID, | ||
71 | }, { /* end: all zeroes */ } | ||
72 | }; | ||
73 | |||
74 | static struct pci_driver otg_pci_driver = { | ||
75 | .name = (char *) driver_name, | ||
76 | .id_table = pci_ids, | ||
77 | |||
78 | .probe = langwell_otg_probe, | ||
79 | .remove = langwell_otg_remove, | ||
80 | |||
81 | .suspend = langwell_otg_suspend, | ||
82 | .resume = langwell_otg_resume, | ||
83 | }; | ||
84 | |||
85 | /* HSM timers */ | ||
86 | static inline struct langwell_otg_timer *otg_timer_initializer | ||
87 | (void (*function)(unsigned long), unsigned long expires, unsigned long data) | ||
88 | { | ||
89 | struct langwell_otg_timer *timer; | ||
90 | timer = kmalloc(sizeof(struct langwell_otg_timer), GFP_KERNEL); | ||
91 | if (timer == NULL) | ||
92 | return timer; | ||
93 | |||
94 | timer->function = function; | ||
95 | timer->expires = expires; | ||
96 | timer->data = data; | ||
97 | return timer; | ||
98 | } | ||
99 | |||
100 | static struct langwell_otg_timer *a_wait_vrise_tmr, *a_aidl_bdis_tmr, | ||
101 | *b_se0_srp_tmr, *b_srp_init_tmr; | ||
102 | |||
103 | static struct list_head active_timers; | ||
104 | |||
105 | static struct langwell_otg *the_transceiver; | ||
106 | |||
107 | /* host/client notify transceiver when event affects HNP state */ | ||
108 | void langwell_update_transceiver(void) | ||
109 | { | ||
110 | struct langwell_otg *lnw = the_transceiver; | ||
111 | |||
112 | dev_dbg(lnw->dev, "transceiver is updated\n"); | ||
113 | |||
114 | if (!lnw->qwork) | ||
115 | return ; | ||
116 | |||
117 | queue_work(lnw->qwork, &lnw->work); | ||
118 | } | ||
119 | EXPORT_SYMBOL(langwell_update_transceiver); | ||
120 | |||
121 | static int langwell_otg_set_host(struct otg_transceiver *otg, | ||
122 | struct usb_bus *host) | ||
123 | { | ||
124 | otg->host = host; | ||
125 | |||
126 | return 0; | ||
127 | } | ||
128 | |||
129 | static int langwell_otg_set_peripheral(struct otg_transceiver *otg, | ||
130 | struct usb_gadget *gadget) | ||
131 | { | ||
132 | otg->gadget = gadget; | ||
133 | |||
134 | return 0; | ||
135 | } | ||
136 | |||
137 | static int langwell_otg_set_power(struct otg_transceiver *otg, | ||
138 | unsigned mA) | ||
139 | { | ||
140 | return 0; | ||
141 | } | ||
142 | |||
143 | /* A-device drives vbus, controlled through IPC commands */ | ||
144 | static int langwell_otg_set_vbus(struct otg_transceiver *otg, bool enabled) | ||
145 | { | ||
146 | struct langwell_otg *lnw = the_transceiver; | ||
147 | u8 sub_id; | ||
148 | |||
149 | dev_dbg(lnw->dev, "%s <--- %s\n", __func__, enabled ? "on" : "off"); | ||
150 | |||
151 | if (enabled) | ||
152 | sub_id = 0x8; /* Turn on the VBus */ | ||
153 | else | ||
154 | sub_id = 0x9; /* Turn off the VBus */ | ||
155 | |||
156 | if (intel_scu_ipc_simple_command(0xef, sub_id)) { | ||
157 | dev_dbg(lnw->dev, "Failed to set Vbus via IPC commands\n"); | ||
158 | return -EBUSY; | ||
159 | } | ||
160 | |||
161 | dev_dbg(lnw->dev, "%s --->\n", __func__); | ||
162 | |||
163 | return 0; | ||
164 | } | ||
165 | |||
166 | /* charge vbus or discharge vbus through a resistor to ground */ | ||
167 | static void langwell_otg_chrg_vbus(int on) | ||
168 | { | ||
169 | struct langwell_otg *lnw = the_transceiver; | ||
170 | u32 val; | ||
171 | |||
172 | val = readl(lnw->iotg.base + CI_OTGSC); | ||
173 | |||
174 | if (on) | ||
175 | writel((val & ~OTGSC_INTSTS_MASK) | OTGSC_VC, | ||
176 | lnw->iotg.base + CI_OTGSC); | ||
177 | else | ||
178 | writel((val & ~OTGSC_INTSTS_MASK) | OTGSC_VD, | ||
179 | lnw->iotg.base + CI_OTGSC); | ||
180 | } | ||
181 | |||
182 | /* Start SRP */ | ||
183 | static int langwell_otg_start_srp(struct otg_transceiver *otg) | ||
184 | { | ||
185 | struct langwell_otg *lnw = the_transceiver; | ||
186 | struct intel_mid_otg_xceiv *iotg = &lnw->iotg; | ||
187 | u32 val; | ||
188 | |||
189 | dev_dbg(lnw->dev, "%s --->\n", __func__); | ||
190 | |||
191 | val = readl(iotg->base + CI_OTGSC); | ||
192 | |||
193 | writel((val & ~OTGSC_INTSTS_MASK) | OTGSC_HADP, | ||
194 | iotg->base + CI_OTGSC); | ||
195 | |||
196 | /* Check if the data plus is finished or not */ | ||
197 | msleep(8); | ||
198 | val = readl(iotg->base + CI_OTGSC); | ||
199 | if (val & (OTGSC_HADP | OTGSC_DP)) | ||
200 | dev_dbg(lnw->dev, "DataLine SRP Error\n"); | ||
201 | |||
202 | /* Disable interrupt - b_sess_vld */ | ||
203 | val = readl(iotg->base + CI_OTGSC); | ||
204 | val &= (~(OTGSC_BSVIE | OTGSC_BSEIE)); | ||
205 | writel(val, iotg->base + CI_OTGSC); | ||
206 | |||
207 | /* Start VBus SRP, drive vbus to generate VBus pulse */ | ||
208 | iotg->otg.set_vbus(&iotg->otg, true); | ||
209 | msleep(15); | ||
210 | iotg->otg.set_vbus(&iotg->otg, false); | ||
211 | |||
212 | /* Enable interrupt - b_sess_vld*/ | ||
213 | val = readl(iotg->base + CI_OTGSC); | ||
214 | dev_dbg(lnw->dev, "after VBUS pulse otgsc = %x\n", val); | ||
215 | |||
216 | val |= (OTGSC_BSVIE | OTGSC_BSEIE); | ||
217 | writel(val, iotg->base + CI_OTGSC); | ||
218 | |||
219 | /* If Vbus is valid, then update the hsm */ | ||
220 | if (val & OTGSC_BSV) { | ||
221 | dev_dbg(lnw->dev, "no b_sess_vld interrupt\n"); | ||
222 | |||
223 | lnw->iotg.hsm.b_sess_vld = 1; | ||
224 | langwell_update_transceiver(); | ||
225 | } | ||
226 | |||
227 | dev_dbg(lnw->dev, "%s <---\n", __func__); | ||
228 | return 0; | ||
229 | } | ||
230 | |||
231 | /* stop SOF via bus_suspend */ | ||
232 | static void langwell_otg_loc_sof(int on) | ||
233 | { | ||
234 | struct langwell_otg *lnw = the_transceiver; | ||
235 | struct usb_hcd *hcd; | ||
236 | int err; | ||
237 | |||
238 | dev_dbg(lnw->dev, "%s ---> %s\n", __func__, on ? "suspend" : "resume"); | ||
239 | |||
240 | hcd = bus_to_hcd(lnw->iotg.otg.host); | ||
241 | if (on) | ||
242 | err = hcd->driver->bus_resume(hcd); | ||
243 | else | ||
244 | err = hcd->driver->bus_suspend(hcd); | ||
245 | |||
246 | if (err) | ||
247 | dev_dbg(lnw->dev, "Fail to resume/suspend USB bus - %d\n", err); | ||
248 | |||
249 | dev_dbg(lnw->dev, "%s <---\n", __func__); | ||
250 | } | ||
251 | |||
252 | static int langwell_otg_check_otgsc(void) | ||
253 | { | ||
254 | struct langwell_otg *lnw = the_transceiver; | ||
255 | u32 otgsc, usbcfg; | ||
256 | |||
257 | dev_dbg(lnw->dev, "check sync OTGSC and USBCFG registers\n"); | ||
258 | |||
259 | otgsc = readl(lnw->iotg.base + CI_OTGSC); | ||
260 | usbcfg = readl(lnw->usbcfg); | ||
261 | |||
262 | dev_dbg(lnw->dev, "OTGSC = %08x, USBCFG = %08x\n", | ||
263 | otgsc, usbcfg); | ||
264 | dev_dbg(lnw->dev, "OTGSC_AVV = %d\n", !!(otgsc & OTGSC_AVV)); | ||
265 | dev_dbg(lnw->dev, "USBCFG.VBUSVAL = %d\n", | ||
266 | !!(usbcfg & USBCFG_VBUSVAL)); | ||
267 | dev_dbg(lnw->dev, "OTGSC_ASV = %d\n", !!(otgsc & OTGSC_ASV)); | ||
268 | dev_dbg(lnw->dev, "USBCFG.AVALID = %d\n", | ||
269 | !!(usbcfg & USBCFG_AVALID)); | ||
270 | dev_dbg(lnw->dev, "OTGSC_BSV = %d\n", !!(otgsc & OTGSC_BSV)); | ||
271 | dev_dbg(lnw->dev, "USBCFG.BVALID = %d\n", | ||
272 | !!(usbcfg & USBCFG_BVALID)); | ||
273 | dev_dbg(lnw->dev, "OTGSC_BSE = %d\n", !!(otgsc & OTGSC_BSE)); | ||
274 | dev_dbg(lnw->dev, "USBCFG.SESEND = %d\n", | ||
275 | !!(usbcfg & USBCFG_SESEND)); | ||
276 | |||
277 | /* Check USBCFG VBusValid/AValid/BValid/SessEnd */ | ||
278 | if (!!(otgsc & OTGSC_AVV) ^ !!(usbcfg & USBCFG_VBUSVAL)) { | ||
279 | dev_dbg(lnw->dev, "OTGSC.AVV != USBCFG.VBUSVAL\n"); | ||
280 | goto err; | ||
281 | } | ||
282 | if (!!(otgsc & OTGSC_ASV) ^ !!(usbcfg & USBCFG_AVALID)) { | ||
283 | dev_dbg(lnw->dev, "OTGSC.ASV != USBCFG.AVALID\n"); | ||
284 | goto err; | ||
285 | } | ||
286 | if (!!(otgsc & OTGSC_BSV) ^ !!(usbcfg & USBCFG_BVALID)) { | ||
287 | dev_dbg(lnw->dev, "OTGSC.BSV != USBCFG.BVALID\n"); | ||
288 | goto err; | ||
289 | } | ||
290 | if (!!(otgsc & OTGSC_BSE) ^ !!(usbcfg & USBCFG_SESEND)) { | ||
291 | dev_dbg(lnw->dev, "OTGSC.BSE != USBCFG.SESSEN\n"); | ||
292 | goto err; | ||
293 | } | ||
294 | |||
295 | dev_dbg(lnw->dev, "OTGSC and USBCFG are synced\n"); | ||
296 | |||
297 | return 0; | ||
298 | |||
299 | err: | ||
300 | dev_warn(lnw->dev, "OTGSC isn't equal to USBCFG\n"); | ||
301 | return -EPIPE; | ||
302 | } | ||
303 | |||
304 | |||
305 | static void langwell_otg_phy_low_power(int on) | ||
306 | { | ||
307 | struct langwell_otg *lnw = the_transceiver; | ||
308 | struct intel_mid_otg_xceiv *iotg = &lnw->iotg; | ||
309 | u8 val, phcd; | ||
310 | int retval; | ||
311 | |||
312 | dev_dbg(lnw->dev, "%s ---> %s mode\n", | ||
313 | __func__, on ? "Low power" : "Normal"); | ||
314 | |||
315 | phcd = 0x40; | ||
316 | |||
317 | val = readb(iotg->base + CI_HOSTPC1 + 2); | ||
318 | |||
319 | if (on) { | ||
320 | /* Due to hardware issue, after set PHCD, sync will failed | ||
321 | * between USBCFG and OTGSC, so before set PHCD, check if | ||
322 | * sync is in process now. If the answer is "yes", then do | ||
323 | * not touch PHCD bit */ | ||
324 | retval = langwell_otg_check_otgsc(); | ||
325 | if (retval) { | ||
326 | dev_dbg(lnw->dev, "Skip PHCD programming..\n"); | ||
327 | return ; | ||
328 | } | ||
329 | |||
330 | writeb(val | phcd, iotg->base + CI_HOSTPC1 + 2); | ||
331 | } else | ||
332 | writeb(val & ~phcd, iotg->base + CI_HOSTPC1 + 2); | ||
333 | |||
334 | dev_dbg(lnw->dev, "%s <--- done\n", __func__); | ||
335 | } | ||
336 | |||
337 | /* After drv vbus, add 5 ms delay to set PHCD */ | ||
338 | static void langwell_otg_phy_low_power_wait(int on) | ||
339 | { | ||
340 | struct langwell_otg *lnw = the_transceiver; | ||
341 | |||
342 | dev_dbg(lnw->dev, "add 5ms delay before programing PHCD\n"); | ||
343 | |||
344 | mdelay(5); | ||
345 | langwell_otg_phy_low_power(on); | ||
346 | } | ||
347 | |||
348 | /* Enable/Disable OTG interrupt */ | ||
349 | static void langwell_otg_intr(int on) | ||
350 | { | ||
351 | struct langwell_otg *lnw = the_transceiver; | ||
352 | struct intel_mid_otg_xceiv *iotg = &lnw->iotg; | ||
353 | u32 val; | ||
354 | |||
355 | dev_dbg(lnw->dev, "%s ---> %s\n", __func__, on ? "on" : "off"); | ||
356 | |||
357 | val = readl(iotg->base + CI_OTGSC); | ||
358 | |||
359 | /* OTGSC_INT_MASK doesn't contains 1msInt */ | ||
360 | if (on) { | ||
361 | val = val | (OTGSC_INT_MASK); | ||
362 | writel(val, iotg->base + CI_OTGSC); | ||
363 | } else { | ||
364 | val = val & ~(OTGSC_INT_MASK); | ||
365 | writel(val, iotg->base + CI_OTGSC); | ||
366 | } | ||
367 | |||
368 | dev_dbg(lnw->dev, "%s <---\n", __func__); | ||
369 | } | ||
370 | |||
371 | /* set HAAR: Hardware Assist Auto-Reset */ | ||
372 | static void langwell_otg_HAAR(int on) | ||
373 | { | ||
374 | struct langwell_otg *lnw = the_transceiver; | ||
375 | struct intel_mid_otg_xceiv *iotg = &lnw->iotg; | ||
376 | u32 val; | ||
377 | |||
378 | dev_dbg(lnw->dev, "%s ---> %s\n", __func__, on ? "on" : "off"); | ||
379 | |||
380 | val = readl(iotg->base + CI_OTGSC); | ||
381 | if (on) | ||
382 | writel((val & ~OTGSC_INTSTS_MASK) | OTGSC_HAAR, | ||
383 | iotg->base + CI_OTGSC); | ||
384 | else | ||
385 | writel((val & ~OTGSC_INTSTS_MASK) & ~OTGSC_HAAR, | ||
386 | iotg->base + CI_OTGSC); | ||
387 | |||
388 | dev_dbg(lnw->dev, "%s <---\n", __func__); | ||
389 | } | ||
390 | |||
391 | /* set HABA: Hardware Assist B-Disconnect to A-Connect */ | ||
392 | static void langwell_otg_HABA(int on) | ||
393 | { | ||
394 | struct langwell_otg *lnw = the_transceiver; | ||
395 | struct intel_mid_otg_xceiv *iotg = &lnw->iotg; | ||
396 | u32 val; | ||
397 | |||
398 | dev_dbg(lnw->dev, "%s ---> %s\n", __func__, on ? "on" : "off"); | ||
399 | |||
400 | val = readl(iotg->base + CI_OTGSC); | ||
401 | if (on) | ||
402 | writel((val & ~OTGSC_INTSTS_MASK) | OTGSC_HABA, | ||
403 | iotg->base + CI_OTGSC); | ||
404 | else | ||
405 | writel((val & ~OTGSC_INTSTS_MASK) & ~OTGSC_HABA, | ||
406 | iotg->base + CI_OTGSC); | ||
407 | |||
408 | dev_dbg(lnw->dev, "%s <---\n", __func__); | ||
409 | } | ||
410 | |||
411 | static int langwell_otg_check_se0_srp(int on) | ||
412 | { | ||
413 | struct langwell_otg *lnw = the_transceiver; | ||
414 | int delay_time = TB_SE0_SRP * 10; | ||
415 | u32 val; | ||
416 | |||
417 | dev_dbg(lnw->dev, "%s --->\n", __func__); | ||
418 | |||
419 | do { | ||
420 | udelay(100); | ||
421 | if (!delay_time--) | ||
422 | break; | ||
423 | val = readl(lnw->iotg.base + CI_PORTSC1); | ||
424 | val &= PORTSC_LS; | ||
425 | } while (!val); | ||
426 | |||
427 | dev_dbg(lnw->dev, "%s <---\n", __func__); | ||
428 | return val; | ||
429 | } | ||
430 | |||
431 | /* The timeout callback function to set time out bit */ | ||
432 | static void set_tmout(unsigned long indicator) | ||
433 | { | ||
434 | *(int *)indicator = 1; | ||
435 | } | ||
436 | |||
437 | void langwell_otg_nsf_msg(unsigned long indicator) | ||
438 | { | ||
439 | struct langwell_otg *lnw = the_transceiver; | ||
440 | |||
441 | switch (indicator) { | ||
442 | case 2: | ||
443 | case 4: | ||
444 | case 6: | ||
445 | case 7: | ||
446 | dev_warn(lnw->dev, | ||
447 | "OTG:NSF-%lu - deivce not responding\n", indicator); | ||
448 | break; | ||
449 | case 3: | ||
450 | dev_warn(lnw->dev, | ||
451 | "OTG:NSF-%lu - deivce not supported\n", indicator); | ||
452 | break; | ||
453 | default: | ||
454 | dev_warn(lnw->dev, "Do not have this kind of NSF\n"); | ||
455 | break; | ||
456 | } | ||
457 | } | ||
458 | |||
459 | /* Initialize timers */ | ||
460 | static int langwell_otg_init_timers(struct otg_hsm *hsm) | ||
461 | { | ||
462 | /* HSM used timers */ | ||
463 | a_wait_vrise_tmr = otg_timer_initializer(&set_tmout, TA_WAIT_VRISE, | ||
464 | (unsigned long)&hsm->a_wait_vrise_tmout); | ||
465 | if (a_wait_vrise_tmr == NULL) | ||
466 | return -ENOMEM; | ||
467 | a_aidl_bdis_tmr = otg_timer_initializer(&set_tmout, TA_AIDL_BDIS, | ||
468 | (unsigned long)&hsm->a_aidl_bdis_tmout); | ||
469 | if (a_aidl_bdis_tmr == NULL) | ||
470 | return -ENOMEM; | ||
471 | b_se0_srp_tmr = otg_timer_initializer(&set_tmout, TB_SE0_SRP, | ||
472 | (unsigned long)&hsm->b_se0_srp); | ||
473 | if (b_se0_srp_tmr == NULL) | ||
474 | return -ENOMEM; | ||
475 | b_srp_init_tmr = otg_timer_initializer(&set_tmout, TB_SRP_INIT, | ||
476 | (unsigned long)&hsm->b_srp_init_tmout); | ||
477 | if (b_srp_init_tmr == NULL) | ||
478 | return -ENOMEM; | ||
479 | |||
480 | return 0; | ||
481 | } | ||
482 | |||
483 | /* Free timers */ | ||
484 | static void langwell_otg_free_timers(void) | ||
485 | { | ||
486 | kfree(a_wait_vrise_tmr); | ||
487 | kfree(a_aidl_bdis_tmr); | ||
488 | kfree(b_se0_srp_tmr); | ||
489 | kfree(b_srp_init_tmr); | ||
490 | } | ||
491 | |||
492 | /* The timeout callback function to set time out bit */ | ||
493 | static void langwell_otg_timer_fn(unsigned long indicator) | ||
494 | { | ||
495 | struct langwell_otg *lnw = the_transceiver; | ||
496 | |||
497 | *(int *)indicator = 1; | ||
498 | |||
499 | dev_dbg(lnw->dev, "kernel timer - timeout\n"); | ||
500 | |||
501 | langwell_update_transceiver(); | ||
502 | } | ||
503 | |||
504 | /* kernel timer used instead of HW based interrupt */ | ||
505 | static void langwell_otg_add_ktimer(enum langwell_otg_timer_type timers) | ||
506 | { | ||
507 | struct langwell_otg *lnw = the_transceiver; | ||
508 | struct intel_mid_otg_xceiv *iotg = &lnw->iotg; | ||
509 | unsigned long j = jiffies; | ||
510 | unsigned long data, time; | ||
511 | |||
512 | switch (timers) { | ||
513 | case TA_WAIT_VRISE_TMR: | ||
514 | iotg->hsm.a_wait_vrise_tmout = 0; | ||
515 | data = (unsigned long)&iotg->hsm.a_wait_vrise_tmout; | ||
516 | time = TA_WAIT_VRISE; | ||
517 | break; | ||
518 | case TA_WAIT_BCON_TMR: | ||
519 | iotg->hsm.a_wait_bcon_tmout = 0; | ||
520 | data = (unsigned long)&iotg->hsm.a_wait_bcon_tmout; | ||
521 | time = TA_WAIT_BCON; | ||
522 | break; | ||
523 | case TA_AIDL_BDIS_TMR: | ||
524 | iotg->hsm.a_aidl_bdis_tmout = 0; | ||
525 | data = (unsigned long)&iotg->hsm.a_aidl_bdis_tmout; | ||
526 | time = TA_AIDL_BDIS; | ||
527 | break; | ||
528 | case TB_ASE0_BRST_TMR: | ||
529 | iotg->hsm.b_ase0_brst_tmout = 0; | ||
530 | data = (unsigned long)&iotg->hsm.b_ase0_brst_tmout; | ||
531 | time = TB_ASE0_BRST; | ||
532 | break; | ||
533 | case TB_SRP_INIT_TMR: | ||
534 | iotg->hsm.b_srp_init_tmout = 0; | ||
535 | data = (unsigned long)&iotg->hsm.b_srp_init_tmout; | ||
536 | time = TB_SRP_INIT; | ||
537 | break; | ||
538 | case TB_SRP_FAIL_TMR: | ||
539 | iotg->hsm.b_srp_fail_tmout = 0; | ||
540 | data = (unsigned long)&iotg->hsm.b_srp_fail_tmout; | ||
541 | time = TB_SRP_FAIL; | ||
542 | break; | ||
543 | case TB_BUS_SUSPEND_TMR: | ||
544 | iotg->hsm.b_bus_suspend_tmout = 0; | ||
545 | data = (unsigned long)&iotg->hsm.b_bus_suspend_tmout; | ||
546 | time = TB_BUS_SUSPEND; | ||
547 | break; | ||
548 | default: | ||
549 | dev_dbg(lnw->dev, "unknown timer, cannot enable it\n"); | ||
550 | return; | ||
551 | } | ||
552 | |||
553 | lnw->hsm_timer.data = data; | ||
554 | lnw->hsm_timer.function = langwell_otg_timer_fn; | ||
555 | lnw->hsm_timer.expires = j + time * HZ / 1000; /* milliseconds */ | ||
556 | |||
557 | add_timer(&lnw->hsm_timer); | ||
558 | |||
559 | dev_dbg(lnw->dev, "add timer successfully\n"); | ||
560 | } | ||
561 | |||
562 | /* Add timer to timer list */ | ||
563 | static void langwell_otg_add_timer(void *gtimer) | ||
564 | { | ||
565 | struct langwell_otg_timer *timer = (struct langwell_otg_timer *)gtimer; | ||
566 | struct langwell_otg_timer *tmp_timer; | ||
567 | struct intel_mid_otg_xceiv *iotg = &the_transceiver->iotg; | ||
568 | u32 val32; | ||
569 | |||
570 | /* Check if the timer is already in the active list, | ||
571 | * if so update timer count | ||
572 | */ | ||
573 | list_for_each_entry(tmp_timer, &active_timers, list) | ||
574 | if (tmp_timer == timer) { | ||
575 | timer->count = timer->expires; | ||
576 | return; | ||
577 | } | ||
578 | timer->count = timer->expires; | ||
579 | |||
580 | if (list_empty(&active_timers)) { | ||
581 | val32 = readl(iotg->base + CI_OTGSC); | ||
582 | writel(val32 | OTGSC_1MSE, iotg->base + CI_OTGSC); | ||
583 | } | ||
584 | |||
585 | list_add_tail(&timer->list, &active_timers); | ||
586 | } | ||
587 | |||
588 | /* Remove timer from the timer list; clear timeout status */ | ||
589 | static void langwell_otg_del_timer(void *gtimer) | ||
590 | { | ||
591 | struct langwell_otg *lnw = the_transceiver; | ||
592 | struct langwell_otg_timer *timer = (struct langwell_otg_timer *)gtimer; | ||
593 | struct langwell_otg_timer *tmp_timer, *del_tmp; | ||
594 | u32 val32; | ||
595 | |||
596 | list_for_each_entry_safe(tmp_timer, del_tmp, &active_timers, list) | ||
597 | if (tmp_timer == timer) | ||
598 | list_del(&timer->list); | ||
599 | |||
600 | if (list_empty(&active_timers)) { | ||
601 | val32 = readl(lnw->iotg.base + CI_OTGSC); | ||
602 | writel(val32 & ~OTGSC_1MSE, lnw->iotg.base + CI_OTGSC); | ||
603 | } | ||
604 | } | ||
605 | |||
606 | /* Reduce timer count by 1, and find timeout conditions.*/ | ||
607 | static int langwell_otg_tick_timer(u32 *int_sts) | ||
608 | { | ||
609 | struct langwell_otg *lnw = the_transceiver; | ||
610 | struct langwell_otg_timer *tmp_timer, *del_tmp; | ||
611 | int expired = 0; | ||
612 | |||
613 | list_for_each_entry_safe(tmp_timer, del_tmp, &active_timers, list) { | ||
614 | tmp_timer->count--; | ||
615 | /* check if timer expires */ | ||
616 | if (!tmp_timer->count) { | ||
617 | list_del(&tmp_timer->list); | ||
618 | tmp_timer->function(tmp_timer->data); | ||
619 | expired = 1; | ||
620 | } | ||
621 | } | ||
622 | |||
623 | if (list_empty(&active_timers)) { | ||
624 | dev_dbg(lnw->dev, "tick timer: disable 1ms int\n"); | ||
625 | *int_sts = *int_sts & ~OTGSC_1MSE; | ||
626 | } | ||
627 | return expired; | ||
628 | } | ||
629 | |||
630 | static void reset_otg(void) | ||
631 | { | ||
632 | struct langwell_otg *lnw = the_transceiver; | ||
633 | int delay_time = 1000; | ||
634 | u32 val; | ||
635 | |||
636 | dev_dbg(lnw->dev, "reseting OTG controller ...\n"); | ||
637 | val = readl(lnw->iotg.base + CI_USBCMD); | ||
638 | writel(val | USBCMD_RST, lnw->iotg.base + CI_USBCMD); | ||
639 | do { | ||
640 | udelay(100); | ||
641 | if (!delay_time--) | ||
642 | dev_dbg(lnw->dev, "reset timeout\n"); | ||
643 | val = readl(lnw->iotg.base + CI_USBCMD); | ||
644 | val &= USBCMD_RST; | ||
645 | } while (val != 0); | ||
646 | dev_dbg(lnw->dev, "reset done.\n"); | ||
647 | } | ||
648 | |||
649 | static void set_host_mode(void) | ||
650 | { | ||
651 | struct langwell_otg *lnw = the_transceiver; | ||
652 | u32 val; | ||
653 | |||
654 | reset_otg(); | ||
655 | val = readl(lnw->iotg.base + CI_USBMODE); | ||
656 | val = (val & (~USBMODE_CM)) | USBMODE_HOST; | ||
657 | writel(val, lnw->iotg.base + CI_USBMODE); | ||
658 | } | ||
659 | |||
660 | static void set_client_mode(void) | ||
661 | { | ||
662 | struct langwell_otg *lnw = the_transceiver; | ||
663 | u32 val; | ||
664 | |||
665 | reset_otg(); | ||
666 | val = readl(lnw->iotg.base + CI_USBMODE); | ||
667 | val = (val & (~USBMODE_CM)) | USBMODE_DEVICE; | ||
668 | writel(val, lnw->iotg.base + CI_USBMODE); | ||
669 | } | ||
670 | |||
671 | static void init_hsm(void) | ||
672 | { | ||
673 | struct langwell_otg *lnw = the_transceiver; | ||
674 | struct intel_mid_otg_xceiv *iotg = &lnw->iotg; | ||
675 | u32 val32; | ||
676 | |||
677 | /* read OTGSC after reset */ | ||
678 | val32 = readl(lnw->iotg.base + CI_OTGSC); | ||
679 | dev_dbg(lnw->dev, "%s: OTGSC init value = 0x%x\n", __func__, val32); | ||
680 | |||
681 | /* set init state */ | ||
682 | if (val32 & OTGSC_ID) { | ||
683 | iotg->hsm.id = 1; | ||
684 | iotg->otg.default_a = 0; | ||
685 | set_client_mode(); | ||
686 | iotg->otg.state = OTG_STATE_B_IDLE; | ||
687 | } else { | ||
688 | iotg->hsm.id = 0; | ||
689 | iotg->otg.default_a = 1; | ||
690 | set_host_mode(); | ||
691 | iotg->otg.state = OTG_STATE_A_IDLE; | ||
692 | } | ||
693 | |||
694 | /* set session indicator */ | ||
695 | if (val32 & OTGSC_BSE) | ||
696 | iotg->hsm.b_sess_end = 1; | ||
697 | if (val32 & OTGSC_BSV) | ||
698 | iotg->hsm.b_sess_vld = 1; | ||
699 | if (val32 & OTGSC_ASV) | ||
700 | iotg->hsm.a_sess_vld = 1; | ||
701 | if (val32 & OTGSC_AVV) | ||
702 | iotg->hsm.a_vbus_vld = 1; | ||
703 | |||
704 | /* defautly power the bus */ | ||
705 | iotg->hsm.a_bus_req = 1; | ||
706 | iotg->hsm.a_bus_drop = 0; | ||
707 | /* defautly don't request bus as B device */ | ||
708 | iotg->hsm.b_bus_req = 0; | ||
709 | /* no system error */ | ||
710 | iotg->hsm.a_clr_err = 0; | ||
711 | |||
712 | langwell_otg_phy_low_power_wait(1); | ||
713 | } | ||
714 | |||
715 | static void update_hsm(void) | ||
716 | { | ||
717 | struct langwell_otg *lnw = the_transceiver; | ||
718 | struct intel_mid_otg_xceiv *iotg = &lnw->iotg; | ||
719 | u32 val32; | ||
720 | |||
721 | /* read OTGSC */ | ||
722 | val32 = readl(lnw->iotg.base + CI_OTGSC); | ||
723 | dev_dbg(lnw->dev, "%s: OTGSC value = 0x%x\n", __func__, val32); | ||
724 | |||
725 | iotg->hsm.id = !!(val32 & OTGSC_ID); | ||
726 | iotg->hsm.b_sess_end = !!(val32 & OTGSC_BSE); | ||
727 | iotg->hsm.b_sess_vld = !!(val32 & OTGSC_BSV); | ||
728 | iotg->hsm.a_sess_vld = !!(val32 & OTGSC_ASV); | ||
729 | iotg->hsm.a_vbus_vld = !!(val32 & OTGSC_AVV); | ||
730 | } | ||
731 | |||
732 | static irqreturn_t otg_dummy_irq(int irq, void *_dev) | ||
733 | { | ||
734 | struct langwell_otg *lnw = the_transceiver; | ||
735 | void __iomem *reg_base = _dev; | ||
736 | u32 val; | ||
737 | u32 int_mask = 0; | ||
738 | |||
739 | val = readl(reg_base + CI_USBMODE); | ||
740 | if ((val & USBMODE_CM) != USBMODE_DEVICE) | ||
741 | return IRQ_NONE; | ||
742 | |||
743 | val = readl(reg_base + CI_USBSTS); | ||
744 | int_mask = val & INTR_DUMMY_MASK; | ||
745 | |||
746 | if (int_mask == 0) | ||
747 | return IRQ_NONE; | ||
748 | |||
749 | /* clear hsm.b_conn here since host driver can't detect it | ||
750 | * otg_dummy_irq called means B-disconnect happened. | ||
751 | */ | ||
752 | if (lnw->iotg.hsm.b_conn) { | ||
753 | lnw->iotg.hsm.b_conn = 0; | ||
754 | if (spin_trylock(&lnw->wq_lock)) { | ||
755 | langwell_update_transceiver(); | ||
756 | spin_unlock(&lnw->wq_lock); | ||
757 | } | ||
758 | } | ||
759 | |||
760 | /* Clear interrupts */ | ||
761 | writel(int_mask, reg_base + CI_USBSTS); | ||
762 | return IRQ_HANDLED; | ||
763 | } | ||
764 | |||
765 | static irqreturn_t otg_irq(int irq, void *_dev) | ||
766 | { | ||
767 | struct langwell_otg *lnw = _dev; | ||
768 | struct intel_mid_otg_xceiv *iotg = &lnw->iotg; | ||
769 | u32 int_sts, int_en; | ||
770 | u32 int_mask = 0; | ||
771 | int flag = 0; | ||
772 | |||
773 | int_sts = readl(lnw->iotg.base + CI_OTGSC); | ||
774 | int_en = (int_sts & OTGSC_INTEN_MASK) >> 8; | ||
775 | int_mask = int_sts & int_en; | ||
776 | if (int_mask == 0) | ||
777 | return IRQ_NONE; | ||
778 | |||
779 | if (int_mask & OTGSC_IDIS) { | ||
780 | dev_dbg(lnw->dev, "%s: id change int\n", __func__); | ||
781 | iotg->hsm.id = (int_sts & OTGSC_ID) ? 1 : 0; | ||
782 | dev_dbg(lnw->dev, "id = %d\n", iotg->hsm.id); | ||
783 | flag = 1; | ||
784 | } | ||
785 | if (int_mask & OTGSC_DPIS) { | ||
786 | dev_dbg(lnw->dev, "%s: data pulse int\n", __func__); | ||
787 | iotg->hsm.a_srp_det = (int_sts & OTGSC_DPS) ? 1 : 0; | ||
788 | dev_dbg(lnw->dev, "data pulse = %d\n", iotg->hsm.a_srp_det); | ||
789 | flag = 1; | ||
790 | } | ||
791 | if (int_mask & OTGSC_BSEIS) { | ||
792 | dev_dbg(lnw->dev, "%s: b session end int\n", __func__); | ||
793 | iotg->hsm.b_sess_end = (int_sts & OTGSC_BSE) ? 1 : 0; | ||
794 | dev_dbg(lnw->dev, "b_sess_end = %d\n", iotg->hsm.b_sess_end); | ||
795 | flag = 1; | ||
796 | } | ||
797 | if (int_mask & OTGSC_BSVIS) { | ||
798 | dev_dbg(lnw->dev, "%s: b session valid int\n", __func__); | ||
799 | iotg->hsm.b_sess_vld = (int_sts & OTGSC_BSV) ? 1 : 0; | ||
800 | dev_dbg(lnw->dev, "b_sess_vld = %d\n", iotg->hsm.b_sess_end); | ||
801 | flag = 1; | ||
802 | } | ||
803 | if (int_mask & OTGSC_ASVIS) { | ||
804 | dev_dbg(lnw->dev, "%s: a session valid int\n", __func__); | ||
805 | iotg->hsm.a_sess_vld = (int_sts & OTGSC_ASV) ? 1 : 0; | ||
806 | dev_dbg(lnw->dev, "a_sess_vld = %d\n", iotg->hsm.a_sess_vld); | ||
807 | flag = 1; | ||
808 | } | ||
809 | if (int_mask & OTGSC_AVVIS) { | ||
810 | dev_dbg(lnw->dev, "%s: a vbus valid int\n", __func__); | ||
811 | iotg->hsm.a_vbus_vld = (int_sts & OTGSC_AVV) ? 1 : 0; | ||
812 | dev_dbg(lnw->dev, "a_vbus_vld = %d\n", iotg->hsm.a_vbus_vld); | ||
813 | flag = 1; | ||
814 | } | ||
815 | |||
816 | if (int_mask & OTGSC_1MSS) { | ||
817 | /* need to schedule otg_work if any timer is expired */ | ||
818 | if (langwell_otg_tick_timer(&int_sts)) | ||
819 | flag = 1; | ||
820 | } | ||
821 | |||
822 | writel((int_sts & ~OTGSC_INTSTS_MASK) | int_mask, | ||
823 | lnw->iotg.base + CI_OTGSC); | ||
824 | if (flag) | ||
825 | langwell_update_transceiver(); | ||
826 | |||
827 | return IRQ_HANDLED; | ||
828 | } | ||
829 | |||
830 | static int langwell_otg_iotg_notify(struct notifier_block *nb, | ||
831 | unsigned long action, void *data) | ||
832 | { | ||
833 | struct langwell_otg *lnw = the_transceiver; | ||
834 | struct intel_mid_otg_xceiv *iotg = data; | ||
835 | int flag = 0; | ||
836 | |||
837 | if (iotg == NULL) | ||
838 | return NOTIFY_BAD; | ||
839 | |||
840 | if (lnw == NULL) | ||
841 | return NOTIFY_BAD; | ||
842 | |||
843 | switch (action) { | ||
844 | case MID_OTG_NOTIFY_CONNECT: | ||
845 | dev_dbg(lnw->dev, "Lnw OTG Notify Connect Event\n"); | ||
846 | if (iotg->otg.default_a == 1) | ||
847 | iotg->hsm.b_conn = 1; | ||
848 | else | ||
849 | iotg->hsm.a_conn = 1; | ||
850 | flag = 1; | ||
851 | break; | ||
852 | case MID_OTG_NOTIFY_DISCONN: | ||
853 | dev_dbg(lnw->dev, "Lnw OTG Notify Disconnect Event\n"); | ||
854 | if (iotg->otg.default_a == 1) | ||
855 | iotg->hsm.b_conn = 0; | ||
856 | else | ||
857 | iotg->hsm.a_conn = 0; | ||
858 | flag = 1; | ||
859 | break; | ||
860 | case MID_OTG_NOTIFY_HSUSPEND: | ||
861 | dev_dbg(lnw->dev, "Lnw OTG Notify Host Bus suspend Event\n"); | ||
862 | if (iotg->otg.default_a == 1) | ||
863 | iotg->hsm.a_suspend_req = 1; | ||
864 | else | ||
865 | iotg->hsm.b_bus_req = 0; | ||
866 | flag = 1; | ||
867 | break; | ||
868 | case MID_OTG_NOTIFY_HRESUME: | ||
869 | dev_dbg(lnw->dev, "Lnw OTG Notify Host Bus resume Event\n"); | ||
870 | if (iotg->otg.default_a == 1) | ||
871 | iotg->hsm.b_bus_resume = 1; | ||
872 | flag = 1; | ||
873 | break; | ||
874 | case MID_OTG_NOTIFY_CSUSPEND: | ||
875 | dev_dbg(lnw->dev, "Lnw OTG Notify Client Bus suspend Event\n"); | ||
876 | if (iotg->otg.default_a == 1) { | ||
877 | if (iotg->hsm.b_bus_suspend_vld == 2) { | ||
878 | iotg->hsm.b_bus_suspend = 1; | ||
879 | iotg->hsm.b_bus_suspend_vld = 0; | ||
880 | flag = 1; | ||
881 | } else { | ||
882 | iotg->hsm.b_bus_suspend_vld++; | ||
883 | flag = 0; | ||
884 | } | ||
885 | } else { | ||
886 | if (iotg->hsm.a_bus_suspend == 0) { | ||
887 | iotg->hsm.a_bus_suspend = 1; | ||
888 | flag = 1; | ||
889 | } | ||
890 | } | ||
891 | break; | ||
892 | case MID_OTG_NOTIFY_CRESUME: | ||
893 | dev_dbg(lnw->dev, "Lnw OTG Notify Client Bus resume Event\n"); | ||
894 | if (iotg->otg.default_a == 0) | ||
895 | iotg->hsm.a_bus_suspend = 0; | ||
896 | flag = 0; | ||
897 | break; | ||
898 | case MID_OTG_NOTIFY_HOSTADD: | ||
899 | dev_dbg(lnw->dev, "Lnw OTG Nofity Host Driver Add\n"); | ||
900 | flag = 1; | ||
901 | break; | ||
902 | case MID_OTG_NOTIFY_HOSTREMOVE: | ||
903 | dev_dbg(lnw->dev, "Lnw OTG Nofity Host Driver remove\n"); | ||
904 | flag = 1; | ||
905 | break; | ||
906 | case MID_OTG_NOTIFY_CLIENTADD: | ||
907 | dev_dbg(lnw->dev, "Lnw OTG Nofity Client Driver Add\n"); | ||
908 | flag = 1; | ||
909 | break; | ||
910 | case MID_OTG_NOTIFY_CLIENTREMOVE: | ||
911 | dev_dbg(lnw->dev, "Lnw OTG Nofity Client Driver remove\n"); | ||
912 | flag = 1; | ||
913 | break; | ||
914 | default: | ||
915 | dev_dbg(lnw->dev, "Lnw OTG Nofity unknown notify message\n"); | ||
916 | return NOTIFY_DONE; | ||
917 | } | ||
918 | |||
919 | if (flag) | ||
920 | langwell_update_transceiver(); | ||
921 | |||
922 | return NOTIFY_OK; | ||
923 | } | ||
924 | |||
925 | static void langwell_otg_work(struct work_struct *work) | ||
926 | { | ||
927 | struct langwell_otg *lnw; | ||
928 | struct intel_mid_otg_xceiv *iotg; | ||
929 | int retval; | ||
930 | struct pci_dev *pdev; | ||
931 | |||
932 | lnw = container_of(work, struct langwell_otg, work); | ||
933 | iotg = &lnw->iotg; | ||
934 | pdev = to_pci_dev(lnw->dev); | ||
935 | |||
936 | dev_dbg(lnw->dev, "%s: old state = %s\n", __func__, | ||
937 | otg_state_string(iotg->otg.state)); | ||
938 | |||
939 | switch (iotg->otg.state) { | ||
940 | case OTG_STATE_UNDEFINED: | ||
941 | case OTG_STATE_B_IDLE: | ||
942 | if (!iotg->hsm.id) { | ||
943 | langwell_otg_del_timer(b_srp_init_tmr); | ||
944 | del_timer_sync(&lnw->hsm_timer); | ||
945 | |||
946 | iotg->otg.default_a = 1; | ||
947 | iotg->hsm.a_srp_det = 0; | ||
948 | |||
949 | langwell_otg_chrg_vbus(0); | ||
950 | set_host_mode(); | ||
951 | langwell_otg_phy_low_power(1); | ||
952 | |||
953 | iotg->otg.state = OTG_STATE_A_IDLE; | ||
954 | langwell_update_transceiver(); | ||
955 | } else if (iotg->hsm.b_sess_vld) { | ||
956 | langwell_otg_del_timer(b_srp_init_tmr); | ||
957 | del_timer_sync(&lnw->hsm_timer); | ||
958 | iotg->hsm.b_sess_end = 0; | ||
959 | iotg->hsm.a_bus_suspend = 0; | ||
960 | langwell_otg_chrg_vbus(0); | ||
961 | |||
962 | if (lnw->iotg.start_peripheral) { | ||
963 | lnw->iotg.start_peripheral(&lnw->iotg); | ||
964 | iotg->otg.state = OTG_STATE_B_PERIPHERAL; | ||
965 | } else | ||
966 | dev_dbg(lnw->dev, "client driver not loaded\n"); | ||
967 | |||
968 | } else if (iotg->hsm.b_srp_init_tmout) { | ||
969 | iotg->hsm.b_srp_init_tmout = 0; | ||
970 | dev_warn(lnw->dev, "SRP init timeout\n"); | ||
971 | } else if (iotg->hsm.b_srp_fail_tmout) { | ||
972 | iotg->hsm.b_srp_fail_tmout = 0; | ||
973 | iotg->hsm.b_bus_req = 0; | ||
974 | |||
975 | /* No silence failure */ | ||
976 | langwell_otg_nsf_msg(6); | ||
977 | } else if (iotg->hsm.b_bus_req && iotg->hsm.b_sess_end) { | ||
978 | del_timer_sync(&lnw->hsm_timer); | ||
979 | /* workaround for b_se0_srp detection */ | ||
980 | retval = langwell_otg_check_se0_srp(0); | ||
981 | if (retval) { | ||
982 | iotg->hsm.b_bus_req = 0; | ||
983 | dev_dbg(lnw->dev, "LS isn't SE0, try later\n"); | ||
984 | } else { | ||
985 | /* clear the PHCD before start srp */ | ||
986 | langwell_otg_phy_low_power(0); | ||
987 | |||
988 | /* Start SRP */ | ||
989 | langwell_otg_add_timer(b_srp_init_tmr); | ||
990 | iotg->otg.start_srp(&iotg->otg); | ||
991 | langwell_otg_del_timer(b_srp_init_tmr); | ||
992 | langwell_otg_add_ktimer(TB_SRP_FAIL_TMR); | ||
993 | |||
994 | /* reset PHY low power mode here */ | ||
995 | langwell_otg_phy_low_power_wait(1); | ||
996 | } | ||
997 | } | ||
998 | break; | ||
999 | case OTG_STATE_B_SRP_INIT: | ||
1000 | if (!iotg->hsm.id) { | ||
1001 | iotg->otg.default_a = 1; | ||
1002 | iotg->hsm.a_srp_det = 0; | ||
1003 | |||
1004 | /* Turn off VBus */ | ||
1005 | iotg->otg.set_vbus(&iotg->otg, false); | ||
1006 | langwell_otg_chrg_vbus(0); | ||
1007 | set_host_mode(); | ||
1008 | langwell_otg_phy_low_power(1); | ||
1009 | iotg->otg.state = OTG_STATE_A_IDLE; | ||
1010 | langwell_update_transceiver(); | ||
1011 | } else if (iotg->hsm.b_sess_vld) { | ||
1012 | langwell_otg_chrg_vbus(0); | ||
1013 | if (lnw->iotg.start_peripheral) { | ||
1014 | lnw->iotg.start_peripheral(&lnw->iotg); | ||
1015 | iotg->otg.state = OTG_STATE_B_PERIPHERAL; | ||
1016 | } else | ||
1017 | dev_dbg(lnw->dev, "client driver not loaded\n"); | ||
1018 | } | ||
1019 | break; | ||
1020 | case OTG_STATE_B_PERIPHERAL: | ||
1021 | if (!iotg->hsm.id) { | ||
1022 | iotg->otg.default_a = 1; | ||
1023 | iotg->hsm.a_srp_det = 0; | ||
1024 | |||
1025 | langwell_otg_chrg_vbus(0); | ||
1026 | |||
1027 | if (lnw->iotg.stop_peripheral) | ||
1028 | lnw->iotg.stop_peripheral(&lnw->iotg); | ||
1029 | else | ||
1030 | dev_dbg(lnw->dev, | ||
1031 | "client driver has been removed.\n"); | ||
1032 | |||
1033 | set_host_mode(); | ||
1034 | langwell_otg_phy_low_power(1); | ||
1035 | iotg->otg.state = OTG_STATE_A_IDLE; | ||
1036 | langwell_update_transceiver(); | ||
1037 | } else if (!iotg->hsm.b_sess_vld) { | ||
1038 | iotg->hsm.b_hnp_enable = 0; | ||
1039 | |||
1040 | if (lnw->iotg.stop_peripheral) | ||
1041 | lnw->iotg.stop_peripheral(&lnw->iotg); | ||
1042 | else | ||
1043 | dev_dbg(lnw->dev, | ||
1044 | "client driver has been removed.\n"); | ||
1045 | |||
1046 | iotg->otg.state = OTG_STATE_B_IDLE; | ||
1047 | } else if (iotg->hsm.b_bus_req && iotg->otg.gadget && | ||
1048 | iotg->otg.gadget->b_hnp_enable && | ||
1049 | iotg->hsm.a_bus_suspend) { | ||
1050 | |||
1051 | if (lnw->iotg.stop_peripheral) | ||
1052 | lnw->iotg.stop_peripheral(&lnw->iotg); | ||
1053 | else | ||
1054 | dev_dbg(lnw->dev, | ||
1055 | "client driver has been removed.\n"); | ||
1056 | |||
1057 | langwell_otg_HAAR(1); | ||
1058 | iotg->hsm.a_conn = 0; | ||
1059 | |||
1060 | if (lnw->iotg.start_host) { | ||
1061 | lnw->iotg.start_host(&lnw->iotg); | ||
1062 | iotg->otg.state = OTG_STATE_B_WAIT_ACON; | ||
1063 | } else | ||
1064 | dev_dbg(lnw->dev, | ||
1065 | "host driver not loaded.\n"); | ||
1066 | |||
1067 | iotg->hsm.a_bus_resume = 0; | ||
1068 | langwell_otg_add_ktimer(TB_ASE0_BRST_TMR); | ||
1069 | } | ||
1070 | break; | ||
1071 | |||
1072 | case OTG_STATE_B_WAIT_ACON: | ||
1073 | if (!iotg->hsm.id) { | ||
1074 | /* delete hsm timer for b_ase0_brst_tmr */ | ||
1075 | del_timer_sync(&lnw->hsm_timer); | ||
1076 | |||
1077 | iotg->otg.default_a = 1; | ||
1078 | iotg->hsm.a_srp_det = 0; | ||
1079 | |||
1080 | langwell_otg_chrg_vbus(0); | ||
1081 | |||
1082 | langwell_otg_HAAR(0); | ||
1083 | if (lnw->iotg.stop_host) | ||
1084 | lnw->iotg.stop_host(&lnw->iotg); | ||
1085 | else | ||
1086 | dev_dbg(lnw->dev, | ||
1087 | "host driver has been removed.\n"); | ||
1088 | |||
1089 | set_host_mode(); | ||
1090 | langwell_otg_phy_low_power(1); | ||
1091 | iotg->otg.state = OTG_STATE_A_IDLE; | ||
1092 | langwell_update_transceiver(); | ||
1093 | } else if (!iotg->hsm.b_sess_vld) { | ||
1094 | /* delete hsm timer for b_ase0_brst_tmr */ | ||
1095 | del_timer_sync(&lnw->hsm_timer); | ||
1096 | |||
1097 | iotg->hsm.b_hnp_enable = 0; | ||
1098 | iotg->hsm.b_bus_req = 0; | ||
1099 | |||
1100 | langwell_otg_chrg_vbus(0); | ||
1101 | langwell_otg_HAAR(0); | ||
1102 | |||
1103 | if (lnw->iotg.stop_host) | ||
1104 | lnw->iotg.stop_host(&lnw->iotg); | ||
1105 | else | ||
1106 | dev_dbg(lnw->dev, | ||
1107 | "host driver has been removed.\n"); | ||
1108 | |||
1109 | set_client_mode(); | ||
1110 | langwell_otg_phy_low_power(1); | ||
1111 | iotg->otg.state = OTG_STATE_B_IDLE; | ||
1112 | } else if (iotg->hsm.a_conn) { | ||
1113 | /* delete hsm timer for b_ase0_brst_tmr */ | ||
1114 | del_timer_sync(&lnw->hsm_timer); | ||
1115 | |||
1116 | langwell_otg_HAAR(0); | ||
1117 | iotg->otg.state = OTG_STATE_B_HOST; | ||
1118 | langwell_update_transceiver(); | ||
1119 | } else if (iotg->hsm.a_bus_resume || | ||
1120 | iotg->hsm.b_ase0_brst_tmout) { | ||
1121 | /* delete hsm timer for b_ase0_brst_tmr */ | ||
1122 | del_timer_sync(&lnw->hsm_timer); | ||
1123 | |||
1124 | langwell_otg_HAAR(0); | ||
1125 | langwell_otg_nsf_msg(7); | ||
1126 | |||
1127 | if (lnw->iotg.stop_host) | ||
1128 | lnw->iotg.stop_host(&lnw->iotg); | ||
1129 | else | ||
1130 | dev_dbg(lnw->dev, | ||
1131 | "host driver has been removed.\n"); | ||
1132 | |||
1133 | iotg->hsm.a_bus_suspend = 0; | ||
1134 | iotg->hsm.b_bus_req = 0; | ||
1135 | |||
1136 | if (lnw->iotg.start_peripheral) | ||
1137 | lnw->iotg.start_peripheral(&lnw->iotg); | ||
1138 | else | ||
1139 | dev_dbg(lnw->dev, | ||
1140 | "client driver not loaded.\n"); | ||
1141 | |||
1142 | iotg->otg.state = OTG_STATE_B_PERIPHERAL; | ||
1143 | } | ||
1144 | break; | ||
1145 | |||
1146 | case OTG_STATE_B_HOST: | ||
1147 | if (!iotg->hsm.id) { | ||
1148 | iotg->otg.default_a = 1; | ||
1149 | iotg->hsm.a_srp_det = 0; | ||
1150 | |||
1151 | langwell_otg_chrg_vbus(0); | ||
1152 | |||
1153 | if (lnw->iotg.stop_host) | ||
1154 | lnw->iotg.stop_host(&lnw->iotg); | ||
1155 | else | ||
1156 | dev_dbg(lnw->dev, | ||
1157 | "host driver has been removed.\n"); | ||
1158 | |||
1159 | set_host_mode(); | ||
1160 | langwell_otg_phy_low_power(1); | ||
1161 | iotg->otg.state = OTG_STATE_A_IDLE; | ||
1162 | langwell_update_transceiver(); | ||
1163 | } else if (!iotg->hsm.b_sess_vld) { | ||
1164 | iotg->hsm.b_hnp_enable = 0; | ||
1165 | iotg->hsm.b_bus_req = 0; | ||
1166 | |||
1167 | langwell_otg_chrg_vbus(0); | ||
1168 | if (lnw->iotg.stop_host) | ||
1169 | lnw->iotg.stop_host(&lnw->iotg); | ||
1170 | else | ||
1171 | dev_dbg(lnw->dev, | ||
1172 | "host driver has been removed.\n"); | ||
1173 | |||
1174 | set_client_mode(); | ||
1175 | langwell_otg_phy_low_power(1); | ||
1176 | iotg->otg.state = OTG_STATE_B_IDLE; | ||
1177 | } else if ((!iotg->hsm.b_bus_req) || | ||
1178 | (!iotg->hsm.a_conn)) { | ||
1179 | iotg->hsm.b_bus_req = 0; | ||
1180 | langwell_otg_loc_sof(0); | ||
1181 | |||
1182 | if (lnw->iotg.stop_host) | ||
1183 | lnw->iotg.stop_host(&lnw->iotg); | ||
1184 | else | ||
1185 | dev_dbg(lnw->dev, | ||
1186 | "host driver has been removed.\n"); | ||
1187 | |||
1188 | iotg->hsm.a_bus_suspend = 0; | ||
1189 | |||
1190 | if (lnw->iotg.start_peripheral) | ||
1191 | lnw->iotg.start_peripheral(&lnw->iotg); | ||
1192 | else | ||
1193 | dev_dbg(lnw->dev, | ||
1194 | "client driver not loaded.\n"); | ||
1195 | |||
1196 | iotg->otg.state = OTG_STATE_B_PERIPHERAL; | ||
1197 | } | ||
1198 | break; | ||
1199 | |||
1200 | case OTG_STATE_A_IDLE: | ||
1201 | iotg->otg.default_a = 1; | ||
1202 | if (iotg->hsm.id) { | ||
1203 | iotg->otg.default_a = 0; | ||
1204 | iotg->hsm.b_bus_req = 0; | ||
1205 | iotg->hsm.vbus_srp_up = 0; | ||
1206 | |||
1207 | langwell_otg_chrg_vbus(0); | ||
1208 | set_client_mode(); | ||
1209 | langwell_otg_phy_low_power(1); | ||
1210 | iotg->otg.state = OTG_STATE_B_IDLE; | ||
1211 | langwell_update_transceiver(); | ||
1212 | } else if (!iotg->hsm.a_bus_drop && | ||
1213 | (iotg->hsm.a_srp_det || iotg->hsm.a_bus_req)) { | ||
1214 | langwell_otg_phy_low_power(0); | ||
1215 | |||
1216 | /* Turn on VBus */ | ||
1217 | iotg->otg.set_vbus(&iotg->otg, true); | ||
1218 | |||
1219 | iotg->hsm.vbus_srp_up = 0; | ||
1220 | iotg->hsm.a_wait_vrise_tmout = 0; | ||
1221 | langwell_otg_add_timer(a_wait_vrise_tmr); | ||
1222 | iotg->otg.state = OTG_STATE_A_WAIT_VRISE; | ||
1223 | langwell_update_transceiver(); | ||
1224 | } else if (!iotg->hsm.a_bus_drop && iotg->hsm.a_sess_vld) { | ||
1225 | iotg->hsm.vbus_srp_up = 1; | ||
1226 | } else if (!iotg->hsm.a_sess_vld && iotg->hsm.vbus_srp_up) { | ||
1227 | msleep(10); | ||
1228 | langwell_otg_phy_low_power(0); | ||
1229 | |||
1230 | /* Turn on VBus */ | ||
1231 | iotg->otg.set_vbus(&iotg->otg, true); | ||
1232 | iotg->hsm.a_srp_det = 1; | ||
1233 | iotg->hsm.vbus_srp_up = 0; | ||
1234 | iotg->hsm.a_wait_vrise_tmout = 0; | ||
1235 | langwell_otg_add_timer(a_wait_vrise_tmr); | ||
1236 | iotg->otg.state = OTG_STATE_A_WAIT_VRISE; | ||
1237 | langwell_update_transceiver(); | ||
1238 | } else if (!iotg->hsm.a_sess_vld && | ||
1239 | !iotg->hsm.vbus_srp_up) { | ||
1240 | langwell_otg_phy_low_power(1); | ||
1241 | } | ||
1242 | break; | ||
1243 | case OTG_STATE_A_WAIT_VRISE: | ||
1244 | if (iotg->hsm.id) { | ||
1245 | langwell_otg_del_timer(a_wait_vrise_tmr); | ||
1246 | iotg->hsm.b_bus_req = 0; | ||
1247 | iotg->otg.default_a = 0; | ||
1248 | |||
1249 | /* Turn off VBus */ | ||
1250 | iotg->otg.set_vbus(&iotg->otg, false); | ||
1251 | set_client_mode(); | ||
1252 | langwell_otg_phy_low_power_wait(1); | ||
1253 | iotg->otg.state = OTG_STATE_B_IDLE; | ||
1254 | } else if (iotg->hsm.a_vbus_vld) { | ||
1255 | langwell_otg_del_timer(a_wait_vrise_tmr); | ||
1256 | iotg->hsm.b_conn = 0; | ||
1257 | if (lnw->iotg.start_host) | ||
1258 | lnw->iotg.start_host(&lnw->iotg); | ||
1259 | else { | ||
1260 | dev_dbg(lnw->dev, "host driver not loaded.\n"); | ||
1261 | break; | ||
1262 | } | ||
1263 | |||
1264 | langwell_otg_add_ktimer(TA_WAIT_BCON_TMR); | ||
1265 | iotg->otg.state = OTG_STATE_A_WAIT_BCON; | ||
1266 | } else if (iotg->hsm.a_wait_vrise_tmout) { | ||
1267 | iotg->hsm.b_conn = 0; | ||
1268 | if (iotg->hsm.a_vbus_vld) { | ||
1269 | if (lnw->iotg.start_host) | ||
1270 | lnw->iotg.start_host(&lnw->iotg); | ||
1271 | else { | ||
1272 | dev_dbg(lnw->dev, | ||
1273 | "host driver not loaded.\n"); | ||
1274 | break; | ||
1275 | } | ||
1276 | langwell_otg_add_ktimer(TA_WAIT_BCON_TMR); | ||
1277 | iotg->otg.state = OTG_STATE_A_WAIT_BCON; | ||
1278 | } else { | ||
1279 | |||
1280 | /* Turn off VBus */ | ||
1281 | iotg->otg.set_vbus(&iotg->otg, false); | ||
1282 | langwell_otg_phy_low_power_wait(1); | ||
1283 | iotg->otg.state = OTG_STATE_A_VBUS_ERR; | ||
1284 | } | ||
1285 | } | ||
1286 | break; | ||
1287 | case OTG_STATE_A_WAIT_BCON: | ||
1288 | if (iotg->hsm.id) { | ||
1289 | /* delete hsm timer for a_wait_bcon_tmr */ | ||
1290 | del_timer_sync(&lnw->hsm_timer); | ||
1291 | |||
1292 | iotg->otg.default_a = 0; | ||
1293 | iotg->hsm.b_bus_req = 0; | ||
1294 | |||
1295 | if (lnw->iotg.stop_host) | ||
1296 | lnw->iotg.stop_host(&lnw->iotg); | ||
1297 | else | ||
1298 | dev_dbg(lnw->dev, | ||
1299 | "host driver has been removed.\n"); | ||
1300 | |||
1301 | /* Turn off VBus */ | ||
1302 | iotg->otg.set_vbus(&iotg->otg, false); | ||
1303 | set_client_mode(); | ||
1304 | langwell_otg_phy_low_power_wait(1); | ||
1305 | iotg->otg.state = OTG_STATE_B_IDLE; | ||
1306 | langwell_update_transceiver(); | ||
1307 | } else if (!iotg->hsm.a_vbus_vld) { | ||
1308 | /* delete hsm timer for a_wait_bcon_tmr */ | ||
1309 | del_timer_sync(&lnw->hsm_timer); | ||
1310 | |||
1311 | if (lnw->iotg.stop_host) | ||
1312 | lnw->iotg.stop_host(&lnw->iotg); | ||
1313 | else | ||
1314 | dev_dbg(lnw->dev, | ||
1315 | "host driver has been removed.\n"); | ||
1316 | |||
1317 | /* Turn off VBus */ | ||
1318 | iotg->otg.set_vbus(&iotg->otg, false); | ||
1319 | langwell_otg_phy_low_power_wait(1); | ||
1320 | iotg->otg.state = OTG_STATE_A_VBUS_ERR; | ||
1321 | } else if (iotg->hsm.a_bus_drop || | ||
1322 | (iotg->hsm.a_wait_bcon_tmout && | ||
1323 | !iotg->hsm.a_bus_req)) { | ||
1324 | /* delete hsm timer for a_wait_bcon_tmr */ | ||
1325 | del_timer_sync(&lnw->hsm_timer); | ||
1326 | |||
1327 | if (lnw->iotg.stop_host) | ||
1328 | lnw->iotg.stop_host(&lnw->iotg); | ||
1329 | else | ||
1330 | dev_dbg(lnw->dev, | ||
1331 | "host driver has been removed.\n"); | ||
1332 | |||
1333 | /* Turn off VBus */ | ||
1334 | iotg->otg.set_vbus(&iotg->otg, false); | ||
1335 | iotg->otg.state = OTG_STATE_A_WAIT_VFALL; | ||
1336 | } else if (iotg->hsm.b_conn) { | ||
1337 | /* delete hsm timer for a_wait_bcon_tmr */ | ||
1338 | del_timer_sync(&lnw->hsm_timer); | ||
1339 | |||
1340 | iotg->hsm.a_suspend_req = 0; | ||
1341 | iotg->otg.state = OTG_STATE_A_HOST; | ||
1342 | if (iotg->hsm.a_srp_det && iotg->otg.host && | ||
1343 | !iotg->otg.host->b_hnp_enable) { | ||
1344 | /* SRP capable peripheral-only device */ | ||
1345 | iotg->hsm.a_bus_req = 1; | ||
1346 | iotg->hsm.a_srp_det = 0; | ||
1347 | } else if (!iotg->hsm.a_bus_req && iotg->otg.host && | ||
1348 | iotg->otg.host->b_hnp_enable) { | ||
1349 | /* It is not safe enough to do a fast | ||
1350 | * transition from A_WAIT_BCON to | ||
1351 | * A_SUSPEND */ | ||
1352 | msleep(10000); | ||
1353 | if (iotg->hsm.a_bus_req) | ||
1354 | break; | ||
1355 | |||
1356 | if (request_irq(pdev->irq, | ||
1357 | otg_dummy_irq, IRQF_SHARED, | ||
1358 | driver_name, iotg->base) != 0) { | ||
1359 | dev_dbg(lnw->dev, | ||
1360 | "request interrupt %d fail\n", | ||
1361 | pdev->irq); | ||
1362 | } | ||
1363 | |||
1364 | langwell_otg_HABA(1); | ||
1365 | iotg->hsm.b_bus_resume = 0; | ||
1366 | iotg->hsm.a_aidl_bdis_tmout = 0; | ||
1367 | |||
1368 | langwell_otg_loc_sof(0); | ||
1369 | /* clear PHCD to enable HW timer */ | ||
1370 | langwell_otg_phy_low_power(0); | ||
1371 | langwell_otg_add_timer(a_aidl_bdis_tmr); | ||
1372 | iotg->otg.state = OTG_STATE_A_SUSPEND; | ||
1373 | } else if (!iotg->hsm.a_bus_req && iotg->otg.host && | ||
1374 | !iotg->otg.host->b_hnp_enable) { | ||
1375 | if (lnw->iotg.stop_host) | ||
1376 | lnw->iotg.stop_host(&lnw->iotg); | ||
1377 | else | ||
1378 | dev_dbg(lnw->dev, | ||
1379 | "host driver removed.\n"); | ||
1380 | |||
1381 | /* Turn off VBus */ | ||
1382 | iotg->otg.set_vbus(&iotg->otg, false); | ||
1383 | iotg->otg.state = OTG_STATE_A_WAIT_VFALL; | ||
1384 | } | ||
1385 | } | ||
1386 | break; | ||
1387 | case OTG_STATE_A_HOST: | ||
1388 | if (iotg->hsm.id) { | ||
1389 | iotg->otg.default_a = 0; | ||
1390 | iotg->hsm.b_bus_req = 0; | ||
1391 | |||
1392 | if (lnw->iotg.stop_host) | ||
1393 | lnw->iotg.stop_host(&lnw->iotg); | ||
1394 | else | ||
1395 | dev_dbg(lnw->dev, | ||
1396 | "host driver has been removed.\n"); | ||
1397 | |||
1398 | /* Turn off VBus */ | ||
1399 | iotg->otg.set_vbus(&iotg->otg, false); | ||
1400 | set_client_mode(); | ||
1401 | langwell_otg_phy_low_power_wait(1); | ||
1402 | iotg->otg.state = OTG_STATE_B_IDLE; | ||
1403 | langwell_update_transceiver(); | ||
1404 | } else if (iotg->hsm.a_bus_drop || | ||
1405 | (iotg->otg.host && | ||
1406 | !iotg->otg.host->b_hnp_enable && | ||
1407 | !iotg->hsm.a_bus_req)) { | ||
1408 | if (lnw->iotg.stop_host) | ||
1409 | lnw->iotg.stop_host(&lnw->iotg); | ||
1410 | else | ||
1411 | dev_dbg(lnw->dev, | ||
1412 | "host driver has been removed.\n"); | ||
1413 | |||
1414 | /* Turn off VBus */ | ||
1415 | iotg->otg.set_vbus(&iotg->otg, false); | ||
1416 | iotg->otg.state = OTG_STATE_A_WAIT_VFALL; | ||
1417 | } else if (!iotg->hsm.a_vbus_vld) { | ||
1418 | if (lnw->iotg.stop_host) | ||
1419 | lnw->iotg.stop_host(&lnw->iotg); | ||
1420 | else | ||
1421 | dev_dbg(lnw->dev, | ||
1422 | "host driver has been removed.\n"); | ||
1423 | |||
1424 | /* Turn off VBus */ | ||
1425 | iotg->otg.set_vbus(&iotg->otg, false); | ||
1426 | langwell_otg_phy_low_power_wait(1); | ||
1427 | iotg->otg.state = OTG_STATE_A_VBUS_ERR; | ||
1428 | } else if (iotg->otg.host && | ||
1429 | iotg->otg.host->b_hnp_enable && | ||
1430 | !iotg->hsm.a_bus_req) { | ||
1431 | /* Set HABA to enable hardware assistance to signal | ||
1432 | * A-connect after receiver B-disconnect. Hardware | ||
1433 | * will then set client mode and enable URE, SLE and | ||
1434 | * PCE after the assistance. otg_dummy_irq is used to | ||
1435 | * clean these ints when client driver is not resumed. | ||
1436 | */ | ||
1437 | if (request_irq(pdev->irq, otg_dummy_irq, IRQF_SHARED, | ||
1438 | driver_name, iotg->base) != 0) { | ||
1439 | dev_dbg(lnw->dev, | ||
1440 | "request interrupt %d failed\n", | ||
1441 | pdev->irq); | ||
1442 | } | ||
1443 | |||
1444 | /* set HABA */ | ||
1445 | langwell_otg_HABA(1); | ||
1446 | iotg->hsm.b_bus_resume = 0; | ||
1447 | iotg->hsm.a_aidl_bdis_tmout = 0; | ||
1448 | langwell_otg_loc_sof(0); | ||
1449 | /* clear PHCD to enable HW timer */ | ||
1450 | langwell_otg_phy_low_power(0); | ||
1451 | langwell_otg_add_timer(a_aidl_bdis_tmr); | ||
1452 | iotg->otg.state = OTG_STATE_A_SUSPEND; | ||
1453 | } else if (!iotg->hsm.b_conn || !iotg->hsm.a_bus_req) { | ||
1454 | langwell_otg_add_ktimer(TA_WAIT_BCON_TMR); | ||
1455 | iotg->otg.state = OTG_STATE_A_WAIT_BCON; | ||
1456 | } | ||
1457 | break; | ||
1458 | case OTG_STATE_A_SUSPEND: | ||
1459 | if (iotg->hsm.id) { | ||
1460 | langwell_otg_del_timer(a_aidl_bdis_tmr); | ||
1461 | langwell_otg_HABA(0); | ||
1462 | free_irq(pdev->irq, iotg->base); | ||
1463 | iotg->otg.default_a = 0; | ||
1464 | iotg->hsm.b_bus_req = 0; | ||
1465 | |||
1466 | if (lnw->iotg.stop_host) | ||
1467 | lnw->iotg.stop_host(&lnw->iotg); | ||
1468 | else | ||
1469 | dev_dbg(lnw->dev, | ||
1470 | "host driver has been removed.\n"); | ||
1471 | |||
1472 | /* Turn off VBus */ | ||
1473 | iotg->otg.set_vbus(&iotg->otg, false); | ||
1474 | set_client_mode(); | ||
1475 | langwell_otg_phy_low_power(1); | ||
1476 | iotg->otg.state = OTG_STATE_B_IDLE; | ||
1477 | langwell_update_transceiver(); | ||
1478 | } else if (iotg->hsm.a_bus_req || | ||
1479 | iotg->hsm.b_bus_resume) { | ||
1480 | langwell_otg_del_timer(a_aidl_bdis_tmr); | ||
1481 | langwell_otg_HABA(0); | ||
1482 | free_irq(pdev->irq, iotg->base); | ||
1483 | iotg->hsm.a_suspend_req = 0; | ||
1484 | langwell_otg_loc_sof(1); | ||
1485 | iotg->otg.state = OTG_STATE_A_HOST; | ||
1486 | } else if (iotg->hsm.a_aidl_bdis_tmout || | ||
1487 | iotg->hsm.a_bus_drop) { | ||
1488 | langwell_otg_del_timer(a_aidl_bdis_tmr); | ||
1489 | langwell_otg_HABA(0); | ||
1490 | free_irq(pdev->irq, iotg->base); | ||
1491 | if (lnw->iotg.stop_host) | ||
1492 | lnw->iotg.stop_host(&lnw->iotg); | ||
1493 | else | ||
1494 | dev_dbg(lnw->dev, | ||
1495 | "host driver has been removed.\n"); | ||
1496 | |||
1497 | /* Turn off VBus */ | ||
1498 | iotg->otg.set_vbus(&iotg->otg, false); | ||
1499 | iotg->otg.state = OTG_STATE_A_WAIT_VFALL; | ||
1500 | } else if (!iotg->hsm.b_conn && iotg->otg.host && | ||
1501 | iotg->otg.host->b_hnp_enable) { | ||
1502 | langwell_otg_del_timer(a_aidl_bdis_tmr); | ||
1503 | langwell_otg_HABA(0); | ||
1504 | free_irq(pdev->irq, iotg->base); | ||
1505 | |||
1506 | if (lnw->iotg.stop_host) | ||
1507 | lnw->iotg.stop_host(&lnw->iotg); | ||
1508 | else | ||
1509 | dev_dbg(lnw->dev, | ||
1510 | "host driver has been removed.\n"); | ||
1511 | |||
1512 | iotg->hsm.b_bus_suspend = 0; | ||
1513 | iotg->hsm.b_bus_suspend_vld = 0; | ||
1514 | |||
1515 | /* msleep(200); */ | ||
1516 | if (lnw->iotg.start_peripheral) | ||
1517 | lnw->iotg.start_peripheral(&lnw->iotg); | ||
1518 | else | ||
1519 | dev_dbg(lnw->dev, | ||
1520 | "client driver not loaded.\n"); | ||
1521 | |||
1522 | langwell_otg_add_ktimer(TB_BUS_SUSPEND_TMR); | ||
1523 | iotg->otg.state = OTG_STATE_A_PERIPHERAL; | ||
1524 | break; | ||
1525 | } else if (!iotg->hsm.a_vbus_vld) { | ||
1526 | langwell_otg_del_timer(a_aidl_bdis_tmr); | ||
1527 | langwell_otg_HABA(0); | ||
1528 | free_irq(pdev->irq, iotg->base); | ||
1529 | if (lnw->iotg.stop_host) | ||
1530 | lnw->iotg.stop_host(&lnw->iotg); | ||
1531 | else | ||
1532 | dev_dbg(lnw->dev, | ||
1533 | "host driver has been removed.\n"); | ||
1534 | |||
1535 | /* Turn off VBus */ | ||
1536 | iotg->otg.set_vbus(&iotg->otg, false); | ||
1537 | langwell_otg_phy_low_power_wait(1); | ||
1538 | iotg->otg.state = OTG_STATE_A_VBUS_ERR; | ||
1539 | } | ||
1540 | break; | ||
1541 | case OTG_STATE_A_PERIPHERAL: | ||
1542 | if (iotg->hsm.id) { | ||
1543 | /* delete hsm timer for b_bus_suspend_tmr */ | ||
1544 | del_timer_sync(&lnw->hsm_timer); | ||
1545 | iotg->otg.default_a = 0; | ||
1546 | iotg->hsm.b_bus_req = 0; | ||
1547 | if (lnw->iotg.stop_peripheral) | ||
1548 | lnw->iotg.stop_peripheral(&lnw->iotg); | ||
1549 | else | ||
1550 | dev_dbg(lnw->dev, | ||
1551 | "client driver has been removed.\n"); | ||
1552 | |||
1553 | /* Turn off VBus */ | ||
1554 | iotg->otg.set_vbus(&iotg->otg, false); | ||
1555 | set_client_mode(); | ||
1556 | langwell_otg_phy_low_power_wait(1); | ||
1557 | iotg->otg.state = OTG_STATE_B_IDLE; | ||
1558 | langwell_update_transceiver(); | ||
1559 | } else if (!iotg->hsm.a_vbus_vld) { | ||
1560 | /* delete hsm timer for b_bus_suspend_tmr */ | ||
1561 | del_timer_sync(&lnw->hsm_timer); | ||
1562 | |||
1563 | if (lnw->iotg.stop_peripheral) | ||
1564 | lnw->iotg.stop_peripheral(&lnw->iotg); | ||
1565 | else | ||
1566 | dev_dbg(lnw->dev, | ||
1567 | "client driver has been removed.\n"); | ||
1568 | |||
1569 | /* Turn off VBus */ | ||
1570 | iotg->otg.set_vbus(&iotg->otg, false); | ||
1571 | langwell_otg_phy_low_power_wait(1); | ||
1572 | iotg->otg.state = OTG_STATE_A_VBUS_ERR; | ||
1573 | } else if (iotg->hsm.a_bus_drop) { | ||
1574 | /* delete hsm timer for b_bus_suspend_tmr */ | ||
1575 | del_timer_sync(&lnw->hsm_timer); | ||
1576 | |||
1577 | if (lnw->iotg.stop_peripheral) | ||
1578 | lnw->iotg.stop_peripheral(&lnw->iotg); | ||
1579 | else | ||
1580 | dev_dbg(lnw->dev, | ||
1581 | "client driver has been removed.\n"); | ||
1582 | |||
1583 | /* Turn off VBus */ | ||
1584 | iotg->otg.set_vbus(&iotg->otg, false); | ||
1585 | iotg->otg.state = OTG_STATE_A_WAIT_VFALL; | ||
1586 | } else if (iotg->hsm.b_bus_suspend) { | ||
1587 | /* delete hsm timer for b_bus_suspend_tmr */ | ||
1588 | del_timer_sync(&lnw->hsm_timer); | ||
1589 | |||
1590 | if (lnw->iotg.stop_peripheral) | ||
1591 | lnw->iotg.stop_peripheral(&lnw->iotg); | ||
1592 | else | ||
1593 | dev_dbg(lnw->dev, | ||
1594 | "client driver has been removed.\n"); | ||
1595 | |||
1596 | if (lnw->iotg.start_host) | ||
1597 | lnw->iotg.start_host(&lnw->iotg); | ||
1598 | else | ||
1599 | dev_dbg(lnw->dev, | ||
1600 | "host driver not loaded.\n"); | ||
1601 | langwell_otg_add_ktimer(TA_WAIT_BCON_TMR); | ||
1602 | iotg->otg.state = OTG_STATE_A_WAIT_BCON; | ||
1603 | } else if (iotg->hsm.b_bus_suspend_tmout) { | ||
1604 | u32 val; | ||
1605 | val = readl(lnw->iotg.base + CI_PORTSC1); | ||
1606 | if (!(val & PORTSC_SUSP)) | ||
1607 | break; | ||
1608 | |||
1609 | if (lnw->iotg.stop_peripheral) | ||
1610 | lnw->iotg.stop_peripheral(&lnw->iotg); | ||
1611 | else | ||
1612 | dev_dbg(lnw->dev, | ||
1613 | "client driver has been removed.\n"); | ||
1614 | |||
1615 | if (lnw->iotg.start_host) | ||
1616 | lnw->iotg.start_host(&lnw->iotg); | ||
1617 | else | ||
1618 | dev_dbg(lnw->dev, | ||
1619 | "host driver not loaded.\n"); | ||
1620 | langwell_otg_add_ktimer(TA_WAIT_BCON_TMR); | ||
1621 | iotg->otg.state = OTG_STATE_A_WAIT_BCON; | ||
1622 | } | ||
1623 | break; | ||
1624 | case OTG_STATE_A_VBUS_ERR: | ||
1625 | if (iotg->hsm.id) { | ||
1626 | iotg->otg.default_a = 0; | ||
1627 | iotg->hsm.a_clr_err = 0; | ||
1628 | iotg->hsm.a_srp_det = 0; | ||
1629 | set_client_mode(); | ||
1630 | langwell_otg_phy_low_power(1); | ||
1631 | iotg->otg.state = OTG_STATE_B_IDLE; | ||
1632 | langwell_update_transceiver(); | ||
1633 | } else if (iotg->hsm.a_clr_err) { | ||
1634 | iotg->hsm.a_clr_err = 0; | ||
1635 | iotg->hsm.a_srp_det = 0; | ||
1636 | reset_otg(); | ||
1637 | init_hsm(); | ||
1638 | if (iotg->otg.state == OTG_STATE_A_IDLE) | ||
1639 | langwell_update_transceiver(); | ||
1640 | } else { | ||
1641 | /* FW will clear PHCD bit when any VBus | ||
1642 | * event detected. Reset PHCD to 1 again */ | ||
1643 | langwell_otg_phy_low_power(1); | ||
1644 | } | ||
1645 | break; | ||
1646 | case OTG_STATE_A_WAIT_VFALL: | ||
1647 | if (iotg->hsm.id) { | ||
1648 | iotg->otg.default_a = 0; | ||
1649 | set_client_mode(); | ||
1650 | langwell_otg_phy_low_power(1); | ||
1651 | iotg->otg.state = OTG_STATE_B_IDLE; | ||
1652 | langwell_update_transceiver(); | ||
1653 | } else if (iotg->hsm.a_bus_req) { | ||
1654 | |||
1655 | /* Turn on VBus */ | ||
1656 | iotg->otg.set_vbus(&iotg->otg, true); | ||
1657 | iotg->hsm.a_wait_vrise_tmout = 0; | ||
1658 | langwell_otg_add_timer(a_wait_vrise_tmr); | ||
1659 | iotg->otg.state = OTG_STATE_A_WAIT_VRISE; | ||
1660 | } else if (!iotg->hsm.a_sess_vld) { | ||
1661 | iotg->hsm.a_srp_det = 0; | ||
1662 | set_host_mode(); | ||
1663 | langwell_otg_phy_low_power(1); | ||
1664 | iotg->otg.state = OTG_STATE_A_IDLE; | ||
1665 | } | ||
1666 | break; | ||
1667 | default: | ||
1668 | ; | ||
1669 | } | ||
1670 | |||
1671 | dev_dbg(lnw->dev, "%s: new state = %s\n", __func__, | ||
1672 | otg_state_string(iotg->otg.state)); | ||
1673 | } | ||
1674 | |||
1675 | static ssize_t | ||
1676 | show_registers(struct device *_dev, struct device_attribute *attr, char *buf) | ||
1677 | { | ||
1678 | struct langwell_otg *lnw = the_transceiver; | ||
1679 | char *next; | ||
1680 | unsigned size, t; | ||
1681 | |||
1682 | next = buf; | ||
1683 | size = PAGE_SIZE; | ||
1684 | |||
1685 | t = scnprintf(next, size, | ||
1686 | "\n" | ||
1687 | "USBCMD = 0x%08x\n" | ||
1688 | "USBSTS = 0x%08x\n" | ||
1689 | "USBINTR = 0x%08x\n" | ||
1690 | "ASYNCLISTADDR = 0x%08x\n" | ||
1691 | "PORTSC1 = 0x%08x\n" | ||
1692 | "HOSTPC1 = 0x%08x\n" | ||
1693 | "OTGSC = 0x%08x\n" | ||
1694 | "USBMODE = 0x%08x\n", | ||
1695 | readl(lnw->iotg.base + 0x30), | ||
1696 | readl(lnw->iotg.base + 0x34), | ||
1697 | readl(lnw->iotg.base + 0x38), | ||
1698 | readl(lnw->iotg.base + 0x48), | ||
1699 | readl(lnw->iotg.base + 0x74), | ||
1700 | readl(lnw->iotg.base + 0xb4), | ||
1701 | readl(lnw->iotg.base + 0xf4), | ||
1702 | readl(lnw->iotg.base + 0xf8) | ||
1703 | ); | ||
1704 | size -= t; | ||
1705 | next += t; | ||
1706 | |||
1707 | return PAGE_SIZE - size; | ||
1708 | } | ||
1709 | static DEVICE_ATTR(registers, S_IRUGO, show_registers, NULL); | ||
1710 | |||
1711 | static ssize_t | ||
1712 | show_hsm(struct device *_dev, struct device_attribute *attr, char *buf) | ||
1713 | { | ||
1714 | struct langwell_otg *lnw = the_transceiver; | ||
1715 | struct intel_mid_otg_xceiv *iotg = &lnw->iotg; | ||
1716 | char *next; | ||
1717 | unsigned size, t; | ||
1718 | |||
1719 | next = buf; | ||
1720 | size = PAGE_SIZE; | ||
1721 | |||
1722 | if (iotg->otg.host) | ||
1723 | iotg->hsm.a_set_b_hnp_en = iotg->otg.host->b_hnp_enable; | ||
1724 | |||
1725 | if (iotg->otg.gadget) | ||
1726 | iotg->hsm.b_hnp_enable = iotg->otg.gadget->b_hnp_enable; | ||
1727 | |||
1728 | t = scnprintf(next, size, | ||
1729 | "\n" | ||
1730 | "current state = %s\n" | ||
1731 | "a_bus_resume = \t%d\n" | ||
1732 | "a_bus_suspend = \t%d\n" | ||
1733 | "a_conn = \t%d\n" | ||
1734 | "a_sess_vld = \t%d\n" | ||
1735 | "a_srp_det = \t%d\n" | ||
1736 | "a_vbus_vld = \t%d\n" | ||
1737 | "b_bus_resume = \t%d\n" | ||
1738 | "b_bus_suspend = \t%d\n" | ||
1739 | "b_conn = \t%d\n" | ||
1740 | "b_se0_srp = \t%d\n" | ||
1741 | "b_sess_end = \t%d\n" | ||
1742 | "b_sess_vld = \t%d\n" | ||
1743 | "id = \t%d\n" | ||
1744 | "a_set_b_hnp_en = \t%d\n" | ||
1745 | "b_srp_done = \t%d\n" | ||
1746 | "b_hnp_enable = \t%d\n" | ||
1747 | "a_wait_vrise_tmout = \t%d\n" | ||
1748 | "a_wait_bcon_tmout = \t%d\n" | ||
1749 | "a_aidl_bdis_tmout = \t%d\n" | ||
1750 | "b_ase0_brst_tmout = \t%d\n" | ||
1751 | "a_bus_drop = \t%d\n" | ||
1752 | "a_bus_req = \t%d\n" | ||
1753 | "a_clr_err = \t%d\n" | ||
1754 | "a_suspend_req = \t%d\n" | ||
1755 | "b_bus_req = \t%d\n" | ||
1756 | "b_bus_suspend_tmout = \t%d\n" | ||
1757 | "b_bus_suspend_vld = \t%d\n", | ||
1758 | otg_state_string(iotg->otg.state), | ||
1759 | iotg->hsm.a_bus_resume, | ||
1760 | iotg->hsm.a_bus_suspend, | ||
1761 | iotg->hsm.a_conn, | ||
1762 | iotg->hsm.a_sess_vld, | ||
1763 | iotg->hsm.a_srp_det, | ||
1764 | iotg->hsm.a_vbus_vld, | ||
1765 | iotg->hsm.b_bus_resume, | ||
1766 | iotg->hsm.b_bus_suspend, | ||
1767 | iotg->hsm.b_conn, | ||
1768 | iotg->hsm.b_se0_srp, | ||
1769 | iotg->hsm.b_sess_end, | ||
1770 | iotg->hsm.b_sess_vld, | ||
1771 | iotg->hsm.id, | ||
1772 | iotg->hsm.a_set_b_hnp_en, | ||
1773 | iotg->hsm.b_srp_done, | ||
1774 | iotg->hsm.b_hnp_enable, | ||
1775 | iotg->hsm.a_wait_vrise_tmout, | ||
1776 | iotg->hsm.a_wait_bcon_tmout, | ||
1777 | iotg->hsm.a_aidl_bdis_tmout, | ||
1778 | iotg->hsm.b_ase0_brst_tmout, | ||
1779 | iotg->hsm.a_bus_drop, | ||
1780 | iotg->hsm.a_bus_req, | ||
1781 | iotg->hsm.a_clr_err, | ||
1782 | iotg->hsm.a_suspend_req, | ||
1783 | iotg->hsm.b_bus_req, | ||
1784 | iotg->hsm.b_bus_suspend_tmout, | ||
1785 | iotg->hsm.b_bus_suspend_vld | ||
1786 | ); | ||
1787 | size -= t; | ||
1788 | next += t; | ||
1789 | |||
1790 | return PAGE_SIZE - size; | ||
1791 | } | ||
1792 | static DEVICE_ATTR(hsm, S_IRUGO, show_hsm, NULL); | ||
1793 | |||
1794 | static ssize_t | ||
1795 | get_a_bus_req(struct device *dev, struct device_attribute *attr, char *buf) | ||
1796 | { | ||
1797 | struct langwell_otg *lnw = the_transceiver; | ||
1798 | char *next; | ||
1799 | unsigned size, t; | ||
1800 | |||
1801 | next = buf; | ||
1802 | size = PAGE_SIZE; | ||
1803 | |||
1804 | t = scnprintf(next, size, "%d", lnw->iotg.hsm.a_bus_req); | ||
1805 | size -= t; | ||
1806 | next += t; | ||
1807 | |||
1808 | return PAGE_SIZE - size; | ||
1809 | } | ||
1810 | |||
1811 | static ssize_t | ||
1812 | set_a_bus_req(struct device *dev, struct device_attribute *attr, | ||
1813 | const char *buf, size_t count) | ||
1814 | { | ||
1815 | struct langwell_otg *lnw = the_transceiver; | ||
1816 | struct intel_mid_otg_xceiv *iotg = &lnw->iotg; | ||
1817 | |||
1818 | if (!iotg->otg.default_a) | ||
1819 | return -1; | ||
1820 | if (count > 2) | ||
1821 | return -1; | ||
1822 | |||
1823 | if (buf[0] == '0') { | ||
1824 | iotg->hsm.a_bus_req = 0; | ||
1825 | dev_dbg(lnw->dev, "User request: a_bus_req = 0\n"); | ||
1826 | } else if (buf[0] == '1') { | ||
1827 | /* If a_bus_drop is TRUE, a_bus_req can't be set */ | ||
1828 | if (iotg->hsm.a_bus_drop) | ||
1829 | return -1; | ||
1830 | iotg->hsm.a_bus_req = 1; | ||
1831 | dev_dbg(lnw->dev, "User request: a_bus_req = 1\n"); | ||
1832 | } | ||
1833 | if (spin_trylock(&lnw->wq_lock)) { | ||
1834 | langwell_update_transceiver(); | ||
1835 | spin_unlock(&lnw->wq_lock); | ||
1836 | } | ||
1837 | return count; | ||
1838 | } | ||
1839 | static DEVICE_ATTR(a_bus_req, S_IRUGO | S_IWUSR, get_a_bus_req, set_a_bus_req); | ||
1840 | |||
1841 | static ssize_t | ||
1842 | get_a_bus_drop(struct device *dev, struct device_attribute *attr, char *buf) | ||
1843 | { | ||
1844 | struct langwell_otg *lnw = the_transceiver; | ||
1845 | char *next; | ||
1846 | unsigned size, t; | ||
1847 | |||
1848 | next = buf; | ||
1849 | size = PAGE_SIZE; | ||
1850 | |||
1851 | t = scnprintf(next, size, "%d", lnw->iotg.hsm.a_bus_drop); | ||
1852 | size -= t; | ||
1853 | next += t; | ||
1854 | |||
1855 | return PAGE_SIZE - size; | ||
1856 | } | ||
1857 | |||
1858 | static ssize_t | ||
1859 | set_a_bus_drop(struct device *dev, struct device_attribute *attr, | ||
1860 | const char *buf, size_t count) | ||
1861 | { | ||
1862 | struct langwell_otg *lnw = the_transceiver; | ||
1863 | struct intel_mid_otg_xceiv *iotg = &lnw->iotg; | ||
1864 | |||
1865 | if (!iotg->otg.default_a) | ||
1866 | return -1; | ||
1867 | if (count > 2) | ||
1868 | return -1; | ||
1869 | |||
1870 | if (buf[0] == '0') { | ||
1871 | iotg->hsm.a_bus_drop = 0; | ||
1872 | dev_dbg(lnw->dev, "User request: a_bus_drop = 0\n"); | ||
1873 | } else if (buf[0] == '1') { | ||
1874 | iotg->hsm.a_bus_drop = 1; | ||
1875 | iotg->hsm.a_bus_req = 0; | ||
1876 | dev_dbg(lnw->dev, "User request: a_bus_drop = 1\n"); | ||
1877 | dev_dbg(lnw->dev, "User request: and a_bus_req = 0\n"); | ||
1878 | } | ||
1879 | if (spin_trylock(&lnw->wq_lock)) { | ||
1880 | langwell_update_transceiver(); | ||
1881 | spin_unlock(&lnw->wq_lock); | ||
1882 | } | ||
1883 | return count; | ||
1884 | } | ||
1885 | static DEVICE_ATTR(a_bus_drop, S_IRUGO | S_IWUSR, get_a_bus_drop, set_a_bus_drop); | ||
1886 | |||
1887 | static ssize_t | ||
1888 | get_b_bus_req(struct device *dev, struct device_attribute *attr, char *buf) | ||
1889 | { | ||
1890 | struct langwell_otg *lnw = the_transceiver; | ||
1891 | char *next; | ||
1892 | unsigned size, t; | ||
1893 | |||
1894 | next = buf; | ||
1895 | size = PAGE_SIZE; | ||
1896 | |||
1897 | t = scnprintf(next, size, "%d", lnw->iotg.hsm.b_bus_req); | ||
1898 | size -= t; | ||
1899 | next += t; | ||
1900 | |||
1901 | return PAGE_SIZE - size; | ||
1902 | } | ||
1903 | |||
1904 | static ssize_t | ||
1905 | set_b_bus_req(struct device *dev, struct device_attribute *attr, | ||
1906 | const char *buf, size_t count) | ||
1907 | { | ||
1908 | struct langwell_otg *lnw = the_transceiver; | ||
1909 | struct intel_mid_otg_xceiv *iotg = &lnw->iotg; | ||
1910 | |||
1911 | if (iotg->otg.default_a) | ||
1912 | return -1; | ||
1913 | |||
1914 | if (count > 2) | ||
1915 | return -1; | ||
1916 | |||
1917 | if (buf[0] == '0') { | ||
1918 | iotg->hsm.b_bus_req = 0; | ||
1919 | dev_dbg(lnw->dev, "User request: b_bus_req = 0\n"); | ||
1920 | } else if (buf[0] == '1') { | ||
1921 | iotg->hsm.b_bus_req = 1; | ||
1922 | dev_dbg(lnw->dev, "User request: b_bus_req = 1\n"); | ||
1923 | } | ||
1924 | if (spin_trylock(&lnw->wq_lock)) { | ||
1925 | langwell_update_transceiver(); | ||
1926 | spin_unlock(&lnw->wq_lock); | ||
1927 | } | ||
1928 | return count; | ||
1929 | } | ||
1930 | static DEVICE_ATTR(b_bus_req, S_IRUGO | S_IWUSR, get_b_bus_req, set_b_bus_req); | ||
1931 | |||
1932 | static ssize_t | ||
1933 | set_a_clr_err(struct device *dev, struct device_attribute *attr, | ||
1934 | const char *buf, size_t count) | ||
1935 | { | ||
1936 | struct langwell_otg *lnw = the_transceiver; | ||
1937 | struct intel_mid_otg_xceiv *iotg = &lnw->iotg; | ||
1938 | |||
1939 | if (!iotg->otg.default_a) | ||
1940 | return -1; | ||
1941 | if (count > 2) | ||
1942 | return -1; | ||
1943 | |||
1944 | if (buf[0] == '1') { | ||
1945 | iotg->hsm.a_clr_err = 1; | ||
1946 | dev_dbg(lnw->dev, "User request: a_clr_err = 1\n"); | ||
1947 | } | ||
1948 | if (spin_trylock(&lnw->wq_lock)) { | ||
1949 | langwell_update_transceiver(); | ||
1950 | spin_unlock(&lnw->wq_lock); | ||
1951 | } | ||
1952 | return count; | ||
1953 | } | ||
1954 | static DEVICE_ATTR(a_clr_err, S_IWUSR, NULL, set_a_clr_err); | ||
1955 | |||
1956 | static struct attribute *inputs_attrs[] = { | ||
1957 | &dev_attr_a_bus_req.attr, | ||
1958 | &dev_attr_a_bus_drop.attr, | ||
1959 | &dev_attr_b_bus_req.attr, | ||
1960 | &dev_attr_a_clr_err.attr, | ||
1961 | NULL, | ||
1962 | }; | ||
1963 | |||
1964 | static struct attribute_group debug_dev_attr_group = { | ||
1965 | .name = "inputs", | ||
1966 | .attrs = inputs_attrs, | ||
1967 | }; | ||
1968 | |||
1969 | static int langwell_otg_probe(struct pci_dev *pdev, | ||
1970 | const struct pci_device_id *id) | ||
1971 | { | ||
1972 | unsigned long resource, len; | ||
1973 | void __iomem *base = NULL; | ||
1974 | int retval; | ||
1975 | u32 val32; | ||
1976 | struct langwell_otg *lnw; | ||
1977 | char qname[] = "langwell_otg_queue"; | ||
1978 | |||
1979 | retval = 0; | ||
1980 | dev_dbg(&pdev->dev, "\notg controller is detected.\n"); | ||
1981 | if (pci_enable_device(pdev) < 0) { | ||
1982 | retval = -ENODEV; | ||
1983 | goto done; | ||
1984 | } | ||
1985 | |||
1986 | lnw = kzalloc(sizeof *lnw, GFP_KERNEL); | ||
1987 | if (lnw == NULL) { | ||
1988 | retval = -ENOMEM; | ||
1989 | goto done; | ||
1990 | } | ||
1991 | the_transceiver = lnw; | ||
1992 | |||
1993 | /* control register: BAR 0 */ | ||
1994 | resource = pci_resource_start(pdev, 0); | ||
1995 | len = pci_resource_len(pdev, 0); | ||
1996 | if (!request_mem_region(resource, len, driver_name)) { | ||
1997 | retval = -EBUSY; | ||
1998 | goto err; | ||
1999 | } | ||
2000 | lnw->region = 1; | ||
2001 | |||
2002 | base = ioremap_nocache(resource, len); | ||
2003 | if (base == NULL) { | ||
2004 | retval = -EFAULT; | ||
2005 | goto err; | ||
2006 | } | ||
2007 | lnw->iotg.base = base; | ||
2008 | |||
2009 | if (!request_mem_region(USBCFG_ADDR, USBCFG_LEN, driver_name)) { | ||
2010 | retval = -EBUSY; | ||
2011 | goto err; | ||
2012 | } | ||
2013 | lnw->cfg_region = 1; | ||
2014 | |||
2015 | /* For the SCCB.USBCFG register */ | ||
2016 | base = ioremap_nocache(USBCFG_ADDR, USBCFG_LEN); | ||
2017 | if (base == NULL) { | ||
2018 | retval = -EFAULT; | ||
2019 | goto err; | ||
2020 | } | ||
2021 | lnw->usbcfg = base; | ||
2022 | |||
2023 | if (!pdev->irq) { | ||
2024 | dev_dbg(&pdev->dev, "No IRQ.\n"); | ||
2025 | retval = -ENODEV; | ||
2026 | goto err; | ||
2027 | } | ||
2028 | |||
2029 | lnw->qwork = create_singlethread_workqueue(qname); | ||
2030 | if (!lnw->qwork) { | ||
2031 | dev_dbg(&pdev->dev, "cannot create workqueue %s\n", qname); | ||
2032 | retval = -ENOMEM; | ||
2033 | goto err; | ||
2034 | } | ||
2035 | INIT_WORK(&lnw->work, langwell_otg_work); | ||
2036 | |||
2037 | /* OTG common part */ | ||
2038 | lnw->dev = &pdev->dev; | ||
2039 | lnw->iotg.otg.dev = lnw->dev; | ||
2040 | lnw->iotg.otg.label = driver_name; | ||
2041 | lnw->iotg.otg.set_host = langwell_otg_set_host; | ||
2042 | lnw->iotg.otg.set_peripheral = langwell_otg_set_peripheral; | ||
2043 | lnw->iotg.otg.set_power = langwell_otg_set_power; | ||
2044 | lnw->iotg.otg.set_vbus = langwell_otg_set_vbus; | ||
2045 | lnw->iotg.otg.start_srp = langwell_otg_start_srp; | ||
2046 | lnw->iotg.otg.state = OTG_STATE_UNDEFINED; | ||
2047 | |||
2048 | if (otg_set_transceiver(&lnw->iotg.otg)) { | ||
2049 | dev_dbg(lnw->dev, "can't set transceiver\n"); | ||
2050 | retval = -EBUSY; | ||
2051 | goto err; | ||
2052 | } | ||
2053 | |||
2054 | reset_otg(); | ||
2055 | init_hsm(); | ||
2056 | |||
2057 | spin_lock_init(&lnw->lock); | ||
2058 | spin_lock_init(&lnw->wq_lock); | ||
2059 | INIT_LIST_HEAD(&active_timers); | ||
2060 | retval = langwell_otg_init_timers(&lnw->iotg.hsm); | ||
2061 | if (retval) { | ||
2062 | dev_dbg(&pdev->dev, "Failed to init timers\n"); | ||
2063 | goto err; | ||
2064 | } | ||
2065 | |||
2066 | init_timer(&lnw->hsm_timer); | ||
2067 | ATOMIC_INIT_NOTIFIER_HEAD(&lnw->iotg.iotg_notifier); | ||
2068 | |||
2069 | lnw->iotg_notifier.notifier_call = langwell_otg_iotg_notify; | ||
2070 | |||
2071 | retval = intel_mid_otg_register_notifier(&lnw->iotg, | ||
2072 | &lnw->iotg_notifier); | ||
2073 | if (retval) { | ||
2074 | dev_dbg(lnw->dev, "Failed to register notifier\n"); | ||
2075 | goto err; | ||
2076 | } | ||
2077 | |||
2078 | if (request_irq(pdev->irq, otg_irq, IRQF_SHARED, | ||
2079 | driver_name, lnw) != 0) { | ||
2080 | dev_dbg(lnw->dev, "request interrupt %d failed\n", pdev->irq); | ||
2081 | retval = -EBUSY; | ||
2082 | goto err; | ||
2083 | } | ||
2084 | |||
2085 | /* enable OTGSC int */ | ||
2086 | val32 = OTGSC_DPIE | OTGSC_BSEIE | OTGSC_BSVIE | | ||
2087 | OTGSC_ASVIE | OTGSC_AVVIE | OTGSC_IDIE | OTGSC_IDPU; | ||
2088 | writel(val32, lnw->iotg.base + CI_OTGSC); | ||
2089 | |||
2090 | retval = device_create_file(&pdev->dev, &dev_attr_registers); | ||
2091 | if (retval < 0) { | ||
2092 | dev_dbg(lnw->dev, | ||
2093 | "Can't register sysfs attribute: %d\n", retval); | ||
2094 | goto err; | ||
2095 | } | ||
2096 | |||
2097 | retval = device_create_file(&pdev->dev, &dev_attr_hsm); | ||
2098 | if (retval < 0) { | ||
2099 | dev_dbg(lnw->dev, "Can't hsm sysfs attribute: %d\n", retval); | ||
2100 | goto err; | ||
2101 | } | ||
2102 | |||
2103 | retval = sysfs_create_group(&pdev->dev.kobj, &debug_dev_attr_group); | ||
2104 | if (retval < 0) { | ||
2105 | dev_dbg(lnw->dev, | ||
2106 | "Can't register sysfs attr group: %d\n", retval); | ||
2107 | goto err; | ||
2108 | } | ||
2109 | |||
2110 | if (lnw->iotg.otg.state == OTG_STATE_A_IDLE) | ||
2111 | langwell_update_transceiver(); | ||
2112 | |||
2113 | return 0; | ||
2114 | |||
2115 | err: | ||
2116 | if (the_transceiver) | ||
2117 | langwell_otg_remove(pdev); | ||
2118 | done: | ||
2119 | return retval; | ||
2120 | } | ||
2121 | |||
2122 | static void langwell_otg_remove(struct pci_dev *pdev) | ||
2123 | { | ||
2124 | struct langwell_otg *lnw = the_transceiver; | ||
2125 | |||
2126 | if (lnw->qwork) { | ||
2127 | flush_workqueue(lnw->qwork); | ||
2128 | destroy_workqueue(lnw->qwork); | ||
2129 | } | ||
2130 | intel_mid_otg_unregister_notifier(&lnw->iotg, &lnw->iotg_notifier); | ||
2131 | langwell_otg_free_timers(); | ||
2132 | |||
2133 | /* disable OTGSC interrupt as OTGSC doesn't change in reset */ | ||
2134 | writel(0, lnw->iotg.base + CI_OTGSC); | ||
2135 | |||
2136 | if (pdev->irq) | ||
2137 | free_irq(pdev->irq, lnw); | ||
2138 | if (lnw->usbcfg) | ||
2139 | iounmap(lnw->usbcfg); | ||
2140 | if (lnw->cfg_region) | ||
2141 | release_mem_region(USBCFG_ADDR, USBCFG_LEN); | ||
2142 | if (lnw->iotg.base) | ||
2143 | iounmap(lnw->iotg.base); | ||
2144 | if (lnw->region) | ||
2145 | release_mem_region(pci_resource_start(pdev, 0), | ||
2146 | pci_resource_len(pdev, 0)); | ||
2147 | |||
2148 | otg_set_transceiver(NULL); | ||
2149 | pci_disable_device(pdev); | ||
2150 | sysfs_remove_group(&pdev->dev.kobj, &debug_dev_attr_group); | ||
2151 | device_remove_file(&pdev->dev, &dev_attr_hsm); | ||
2152 | device_remove_file(&pdev->dev, &dev_attr_registers); | ||
2153 | kfree(lnw); | ||
2154 | lnw = NULL; | ||
2155 | } | ||
2156 | |||
2157 | static void transceiver_suspend(struct pci_dev *pdev) | ||
2158 | { | ||
2159 | pci_save_state(pdev); | ||
2160 | pci_set_power_state(pdev, PCI_D3hot); | ||
2161 | langwell_otg_phy_low_power(1); | ||
2162 | } | ||
2163 | |||
2164 | static int langwell_otg_suspend(struct pci_dev *pdev, pm_message_t message) | ||
2165 | { | ||
2166 | struct langwell_otg *lnw = the_transceiver; | ||
2167 | struct intel_mid_otg_xceiv *iotg = &lnw->iotg; | ||
2168 | int ret = 0; | ||
2169 | |||
2170 | /* Disbale OTG interrupts */ | ||
2171 | langwell_otg_intr(0); | ||
2172 | |||
2173 | if (pdev->irq) | ||
2174 | free_irq(pdev->irq, lnw); | ||
2175 | |||
2176 | /* Prevent more otg_work */ | ||
2177 | flush_workqueue(lnw->qwork); | ||
2178 | destroy_workqueue(lnw->qwork); | ||
2179 | lnw->qwork = NULL; | ||
2180 | |||
2181 | /* start actions */ | ||
2182 | switch (iotg->otg.state) { | ||
2183 | case OTG_STATE_A_WAIT_VFALL: | ||
2184 | iotg->otg.state = OTG_STATE_A_IDLE; | ||
2185 | case OTG_STATE_A_IDLE: | ||
2186 | case OTG_STATE_B_IDLE: | ||
2187 | case OTG_STATE_A_VBUS_ERR: | ||
2188 | transceiver_suspend(pdev); | ||
2189 | break; | ||
2190 | case OTG_STATE_A_WAIT_VRISE: | ||
2191 | langwell_otg_del_timer(a_wait_vrise_tmr); | ||
2192 | iotg->hsm.a_srp_det = 0; | ||
2193 | |||
2194 | /* Turn off VBus */ | ||
2195 | iotg->otg.set_vbus(&iotg->otg, false); | ||
2196 | iotg->otg.state = OTG_STATE_A_IDLE; | ||
2197 | transceiver_suspend(pdev); | ||
2198 | break; | ||
2199 | case OTG_STATE_A_WAIT_BCON: | ||
2200 | del_timer_sync(&lnw->hsm_timer); | ||
2201 | if (lnw->iotg.stop_host) | ||
2202 | lnw->iotg.stop_host(&lnw->iotg); | ||
2203 | else | ||
2204 | dev_dbg(&pdev->dev, "host driver has been removed.\n"); | ||
2205 | |||
2206 | iotg->hsm.a_srp_det = 0; | ||
2207 | |||
2208 | /* Turn off VBus */ | ||
2209 | iotg->otg.set_vbus(&iotg->otg, false); | ||
2210 | iotg->otg.state = OTG_STATE_A_IDLE; | ||
2211 | transceiver_suspend(pdev); | ||
2212 | break; | ||
2213 | case OTG_STATE_A_HOST: | ||
2214 | if (lnw->iotg.stop_host) | ||
2215 | lnw->iotg.stop_host(&lnw->iotg); | ||
2216 | else | ||
2217 | dev_dbg(&pdev->dev, "host driver has been removed.\n"); | ||
2218 | |||
2219 | iotg->hsm.a_srp_det = 0; | ||
2220 | |||
2221 | /* Turn off VBus */ | ||
2222 | iotg->otg.set_vbus(&iotg->otg, false); | ||
2223 | |||
2224 | iotg->otg.state = OTG_STATE_A_IDLE; | ||
2225 | transceiver_suspend(pdev); | ||
2226 | break; | ||
2227 | case OTG_STATE_A_SUSPEND: | ||
2228 | langwell_otg_del_timer(a_aidl_bdis_tmr); | ||
2229 | langwell_otg_HABA(0); | ||
2230 | if (lnw->iotg.stop_host) | ||
2231 | lnw->iotg.stop_host(&lnw->iotg); | ||
2232 | else | ||
2233 | dev_dbg(lnw->dev, "host driver has been removed.\n"); | ||
2234 | iotg->hsm.a_srp_det = 0; | ||
2235 | |||
2236 | /* Turn off VBus */ | ||
2237 | iotg->otg.set_vbus(&iotg->otg, false); | ||
2238 | iotg->otg.state = OTG_STATE_A_IDLE; | ||
2239 | transceiver_suspend(pdev); | ||
2240 | break; | ||
2241 | case OTG_STATE_A_PERIPHERAL: | ||
2242 | del_timer_sync(&lnw->hsm_timer); | ||
2243 | |||
2244 | if (lnw->iotg.stop_peripheral) | ||
2245 | lnw->iotg.stop_peripheral(&lnw->iotg); | ||
2246 | else | ||
2247 | dev_dbg(&pdev->dev, | ||
2248 | "client driver has been removed.\n"); | ||
2249 | iotg->hsm.a_srp_det = 0; | ||
2250 | |||
2251 | /* Turn off VBus */ | ||
2252 | iotg->otg.set_vbus(&iotg->otg, false); | ||
2253 | iotg->otg.state = OTG_STATE_A_IDLE; | ||
2254 | transceiver_suspend(pdev); | ||
2255 | break; | ||
2256 | case OTG_STATE_B_HOST: | ||
2257 | if (lnw->iotg.stop_host) | ||
2258 | lnw->iotg.stop_host(&lnw->iotg); | ||
2259 | else | ||
2260 | dev_dbg(&pdev->dev, "host driver has been removed.\n"); | ||
2261 | iotg->hsm.b_bus_req = 0; | ||
2262 | iotg->otg.state = OTG_STATE_B_IDLE; | ||
2263 | transceiver_suspend(pdev); | ||
2264 | break; | ||
2265 | case OTG_STATE_B_PERIPHERAL: | ||
2266 | if (lnw->iotg.stop_peripheral) | ||
2267 | lnw->iotg.stop_peripheral(&lnw->iotg); | ||
2268 | else | ||
2269 | dev_dbg(&pdev->dev, | ||
2270 | "client driver has been removed.\n"); | ||
2271 | iotg->otg.state = OTG_STATE_B_IDLE; | ||
2272 | transceiver_suspend(pdev); | ||
2273 | break; | ||
2274 | case OTG_STATE_B_WAIT_ACON: | ||
2275 | /* delete hsm timer for b_ase0_brst_tmr */ | ||
2276 | del_timer_sync(&lnw->hsm_timer); | ||
2277 | |||
2278 | langwell_otg_HAAR(0); | ||
2279 | |||
2280 | if (lnw->iotg.stop_host) | ||
2281 | lnw->iotg.stop_host(&lnw->iotg); | ||
2282 | else | ||
2283 | dev_dbg(&pdev->dev, "host driver has been removed.\n"); | ||
2284 | iotg->hsm.b_bus_req = 0; | ||
2285 | iotg->otg.state = OTG_STATE_B_IDLE; | ||
2286 | transceiver_suspend(pdev); | ||
2287 | break; | ||
2288 | default: | ||
2289 | dev_dbg(lnw->dev, "error state before suspend\n"); | ||
2290 | break; | ||
2291 | } | ||
2292 | |||
2293 | return ret; | ||
2294 | } | ||
2295 | |||
2296 | static void transceiver_resume(struct pci_dev *pdev) | ||
2297 | { | ||
2298 | pci_restore_state(pdev); | ||
2299 | pci_set_power_state(pdev, PCI_D0); | ||
2300 | } | ||
2301 | |||
2302 | static int langwell_otg_resume(struct pci_dev *pdev) | ||
2303 | { | ||
2304 | struct langwell_otg *lnw = the_transceiver; | ||
2305 | int ret = 0; | ||
2306 | |||
2307 | transceiver_resume(pdev); | ||
2308 | |||
2309 | lnw->qwork = create_singlethread_workqueue("langwell_otg_queue"); | ||
2310 | if (!lnw->qwork) { | ||
2311 | dev_dbg(&pdev->dev, "cannot create langwell otg workqueuen"); | ||
2312 | ret = -ENOMEM; | ||
2313 | goto error; | ||
2314 | } | ||
2315 | |||
2316 | if (request_irq(pdev->irq, otg_irq, IRQF_SHARED, | ||
2317 | driver_name, lnw) != 0) { | ||
2318 | dev_dbg(&pdev->dev, "request interrupt %d failed\n", pdev->irq); | ||
2319 | ret = -EBUSY; | ||
2320 | goto error; | ||
2321 | } | ||
2322 | |||
2323 | /* enable OTG interrupts */ | ||
2324 | langwell_otg_intr(1); | ||
2325 | |||
2326 | update_hsm(); | ||
2327 | |||
2328 | langwell_update_transceiver(); | ||
2329 | |||
2330 | return ret; | ||
2331 | error: | ||
2332 | langwell_otg_intr(0); | ||
2333 | transceiver_suspend(pdev); | ||
2334 | return ret; | ||
2335 | } | ||
2336 | |||
2337 | static int __init langwell_otg_init(void) | ||
2338 | { | ||
2339 | return pci_register_driver(&otg_pci_driver); | ||
2340 | } | ||
2341 | module_init(langwell_otg_init); | ||
2342 | |||
2343 | static void __exit langwell_otg_cleanup(void) | ||
2344 | { | ||
2345 | pci_unregister_driver(&otg_pci_driver); | ||
2346 | } | ||
2347 | module_exit(langwell_otg_cleanup); | ||
diff --git a/drivers/usb/otg/mv_otg.c b/drivers/usb/otg/mv_otg.c index db0d4fcdc8e2..b5fbe1452ab0 100644 --- a/drivers/usb/otg/mv_otg.c +++ b/drivers/usb/otg/mv_otg.c | |||
@@ -202,6 +202,7 @@ static void mv_otg_init_irq(struct mv_otg *mvotg) | |||
202 | 202 | ||
203 | static void mv_otg_start_host(struct mv_otg *mvotg, int on) | 203 | static void mv_otg_start_host(struct mv_otg *mvotg, int on) |
204 | { | 204 | { |
205 | #ifdef CONFIG_USB | ||
205 | struct otg_transceiver *otg = &mvotg->otg; | 206 | struct otg_transceiver *otg = &mvotg->otg; |
206 | struct usb_hcd *hcd; | 207 | struct usb_hcd *hcd; |
207 | 208 | ||
@@ -216,6 +217,7 @@ static void mv_otg_start_host(struct mv_otg *mvotg, int on) | |||
216 | usb_add_hcd(hcd, hcd->irq, IRQF_SHARED); | 217 | usb_add_hcd(hcd, hcd->irq, IRQF_SHARED); |
217 | else | 218 | else |
218 | usb_remove_hcd(hcd); | 219 | usb_remove_hcd(hcd); |
220 | #endif /* CONFIG_USB */ | ||
219 | } | 221 | } |
220 | 222 | ||
221 | static void mv_otg_start_periphrals(struct mv_otg *mvotg, int on) | 223 | static void mv_otg_start_periphrals(struct mv_otg *mvotg, int on) |
diff --git a/drivers/usb/renesas_usbhs/mod_gadget.c b/drivers/usb/renesas_usbhs/mod_gadget.c index 528691d5f3e2..7542aa94a462 100644 --- a/drivers/usb/renesas_usbhs/mod_gadget.c +++ b/drivers/usb/renesas_usbhs/mod_gadget.c | |||
@@ -425,7 +425,7 @@ static int usbhsg_recip_run_handle(struct usbhs_priv *priv, | |||
425 | struct usbhs_pipe *pipe; | 425 | struct usbhs_pipe *pipe; |
426 | int recip = ctrl->bRequestType & USB_RECIP_MASK; | 426 | int recip = ctrl->bRequestType & USB_RECIP_MASK; |
427 | int nth = le16_to_cpu(ctrl->wIndex) & USB_ENDPOINT_NUMBER_MASK; | 427 | int nth = le16_to_cpu(ctrl->wIndex) & USB_ENDPOINT_NUMBER_MASK; |
428 | int ret; | 428 | int ret = 0; |
429 | int (*func)(struct usbhs_priv *priv, struct usbhsg_uep *uep, | 429 | int (*func)(struct usbhs_priv *priv, struct usbhsg_uep *uep, |
430 | struct usb_ctrlrequest *ctrl); | 430 | struct usb_ctrlrequest *ctrl); |
431 | char *msg; | 431 | char *msg; |
diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c index fba1147ed916..8dbf51a43c45 100644 --- a/drivers/usb/serial/cp210x.c +++ b/drivers/usb/serial/cp210x.c | |||
@@ -39,6 +39,8 @@ static void cp210x_get_termios(struct tty_struct *, | |||
39 | struct usb_serial_port *port); | 39 | struct usb_serial_port *port); |
40 | static void cp210x_get_termios_port(struct usb_serial_port *port, | 40 | static void cp210x_get_termios_port(struct usb_serial_port *port, |
41 | unsigned int *cflagp, unsigned int *baudp); | 41 | unsigned int *cflagp, unsigned int *baudp); |
42 | static void cp210x_change_speed(struct tty_struct *, struct usb_serial_port *, | ||
43 | struct ktermios *); | ||
42 | static void cp210x_set_termios(struct tty_struct *, struct usb_serial_port *, | 44 | static void cp210x_set_termios(struct tty_struct *, struct usb_serial_port *, |
43 | struct ktermios*); | 45 | struct ktermios*); |
44 | static int cp210x_tiocmget(struct tty_struct *); | 46 | static int cp210x_tiocmget(struct tty_struct *); |
@@ -138,6 +140,7 @@ static const struct usb_device_id id_table[] = { | |||
138 | { USB_DEVICE(0x1843, 0x0200) }, /* Vaisala USB Instrument Cable */ | 140 | { USB_DEVICE(0x1843, 0x0200) }, /* Vaisala USB Instrument Cable */ |
139 | { USB_DEVICE(0x18EF, 0xE00F) }, /* ELV USB-I2C-Interface */ | 141 | { USB_DEVICE(0x18EF, 0xE00F) }, /* ELV USB-I2C-Interface */ |
140 | { USB_DEVICE(0x1BE3, 0x07A6) }, /* WAGO 750-923 USB Service Cable */ | 142 | { USB_DEVICE(0x1BE3, 0x07A6) }, /* WAGO 750-923 USB Service Cable */ |
143 | { USB_DEVICE(0x3195, 0xF190) }, /* Link Instruments MSO-19 */ | ||
141 | { USB_DEVICE(0x413C, 0x9500) }, /* DW700 GPS USB interface */ | 144 | { USB_DEVICE(0x413C, 0x9500) }, /* DW700 GPS USB interface */ |
142 | { } /* Terminating Entry */ | 145 | { } /* Terminating Entry */ |
143 | }; | 146 | }; |
@@ -201,6 +204,8 @@ static struct usb_serial_driver cp210x_device = { | |||
201 | #define CP210X_EMBED_EVENTS 0x15 | 204 | #define CP210X_EMBED_EVENTS 0x15 |
202 | #define CP210X_GET_EVENTSTATE 0x16 | 205 | #define CP210X_GET_EVENTSTATE 0x16 |
203 | #define CP210X_SET_CHARS 0x19 | 206 | #define CP210X_SET_CHARS 0x19 |
207 | #define CP210X_GET_BAUDRATE 0x1D | ||
208 | #define CP210X_SET_BAUDRATE 0x1E | ||
204 | 209 | ||
205 | /* CP210X_IFC_ENABLE */ | 210 | /* CP210X_IFC_ENABLE */ |
206 | #define UART_ENABLE 0x0001 | 211 | #define UART_ENABLE 0x0001 |
@@ -360,8 +365,8 @@ static inline int cp210x_set_config_single(struct usb_serial_port *port, | |||
360 | * Quantises the baud rate as per AN205 Table 1 | 365 | * Quantises the baud rate as per AN205 Table 1 |
361 | */ | 366 | */ |
362 | static unsigned int cp210x_quantise_baudrate(unsigned int baud) { | 367 | static unsigned int cp210x_quantise_baudrate(unsigned int baud) { |
363 | if (baud <= 56) baud = 0; | 368 | if (baud <= 300) |
364 | else if (baud <= 300) baud = 300; | 369 | baud = 300; |
365 | else if (baud <= 600) baud = 600; | 370 | else if (baud <= 600) baud = 600; |
366 | else if (baud <= 1200) baud = 1200; | 371 | else if (baud <= 1200) baud = 1200; |
367 | else if (baud <= 1800) baud = 1800; | 372 | else if (baud <= 1800) baud = 1800; |
@@ -389,10 +394,10 @@ static unsigned int cp210x_quantise_baudrate(unsigned int baud) { | |||
389 | else if (baud <= 491520) baud = 460800; | 394 | else if (baud <= 491520) baud = 460800; |
390 | else if (baud <= 567138) baud = 500000; | 395 | else if (baud <= 567138) baud = 500000; |
391 | else if (baud <= 670254) baud = 576000; | 396 | else if (baud <= 670254) baud = 576000; |
392 | else if (baud <= 1053257) baud = 921600; | 397 | else if (baud < 1000000) |
393 | else if (baud <= 1474560) baud = 1228800; | 398 | baud = 921600; |
394 | else if (baud <= 2457600) baud = 1843200; | 399 | else if (baud > 2000000) |
395 | else baud = 3686400; | 400 | baud = 2000000; |
396 | return baud; | 401 | return baud; |
397 | } | 402 | } |
398 | 403 | ||
@@ -409,13 +414,14 @@ static int cp210x_open(struct tty_struct *tty, struct usb_serial_port *port) | |||
409 | return result; | 414 | return result; |
410 | } | 415 | } |
411 | 416 | ||
412 | result = usb_serial_generic_open(tty, port); | ||
413 | if (result) | ||
414 | return result; | ||
415 | |||
416 | /* Configure the termios structure */ | 417 | /* Configure the termios structure */ |
417 | cp210x_get_termios(tty, port); | 418 | cp210x_get_termios(tty, port); |
418 | return 0; | 419 | |
420 | /* The baud rate must be initialised on cp2104 */ | ||
421 | if (tty) | ||
422 | cp210x_change_speed(tty, port, NULL); | ||
423 | |||
424 | return usb_serial_generic_open(tty, port); | ||
419 | } | 425 | } |
420 | 426 | ||
421 | static void cp210x_close(struct usb_serial_port *port) | 427 | static void cp210x_close(struct usb_serial_port *port) |
@@ -467,10 +473,7 @@ static void cp210x_get_termios_port(struct usb_serial_port *port, | |||
467 | 473 | ||
468 | dbg("%s - port %d", __func__, port->number); | 474 | dbg("%s - port %d", __func__, port->number); |
469 | 475 | ||
470 | cp210x_get_config(port, CP210X_GET_BAUDDIV, &baud, 2); | 476 | cp210x_get_config(port, CP210X_GET_BAUDRATE, &baud, 4); |
471 | /* Convert to baudrate */ | ||
472 | if (baud) | ||
473 | baud = cp210x_quantise_baudrate((BAUD_RATE_GEN_FREQ + baud/2)/ baud); | ||
474 | 477 | ||
475 | dbg("%s - baud rate = %d", __func__, baud); | 478 | dbg("%s - baud rate = %d", __func__, baud); |
476 | *baudp = baud; | 479 | *baudp = baud; |
@@ -579,11 +582,64 @@ static void cp210x_get_termios_port(struct usb_serial_port *port, | |||
579 | *cflagp = cflag; | 582 | *cflagp = cflag; |
580 | } | 583 | } |
581 | 584 | ||
585 | /* | ||
586 | * CP2101 supports the following baud rates: | ||
587 | * | ||
588 | * 300, 600, 1200, 1800, 2400, 4800, 7200, 9600, 14400, 19200, 28800, | ||
589 | * 38400, 56000, 57600, 115200, 128000, 230400, 460800, 921600 | ||
590 | * | ||
591 | * CP2102 and CP2103 support the following additional rates: | ||
592 | * | ||
593 | * 4000, 16000, 51200, 64000, 76800, 153600, 250000, 256000, 500000, | ||
594 | * 576000 | ||
595 | * | ||
596 | * The device will map a requested rate to a supported one, but the result | ||
597 | * of requests for rates greater than 1053257 is undefined (see AN205). | ||
598 | * | ||
599 | * CP2104, CP2105 and CP2110 support most rates up to 2M, 921k and 1M baud, | ||
600 | * respectively, with an error less than 1%. The actual rates are determined | ||
601 | * by | ||
602 | * | ||
603 | * div = round(freq / (2 x prescale x request)) | ||
604 | * actual = freq / (2 x prescale x div) | ||
605 | * | ||
606 | * For CP2104 and CP2105 freq is 48Mhz and prescale is 4 for request <= 365bps | ||
607 | * or 1 otherwise. | ||
608 | * For CP2110 freq is 24Mhz and prescale is 4 for request <= 300bps or 1 | ||
609 | * otherwise. | ||
610 | */ | ||
611 | static void cp210x_change_speed(struct tty_struct *tty, | ||
612 | struct usb_serial_port *port, struct ktermios *old_termios) | ||
613 | { | ||
614 | u32 baud; | ||
615 | |||
616 | baud = tty->termios->c_ospeed; | ||
617 | |||
618 | /* This maps the requested rate to a rate valid on cp2102 or cp2103, | ||
619 | * or to an arbitrary rate in [1M,2M]. | ||
620 | * | ||
621 | * NOTE: B0 is not implemented. | ||
622 | */ | ||
623 | baud = cp210x_quantise_baudrate(baud); | ||
624 | |||
625 | dbg("%s - setting baud rate to %u", __func__, baud); | ||
626 | if (cp210x_set_config(port, CP210X_SET_BAUDRATE, &baud, | ||
627 | sizeof(baud))) { | ||
628 | dev_warn(&port->dev, "failed to set baud rate to %u\n", baud); | ||
629 | if (old_termios) | ||
630 | baud = old_termios->c_ospeed; | ||
631 | else | ||
632 | baud = 9600; | ||
633 | } | ||
634 | |||
635 | tty_encode_baud_rate(tty, baud, baud); | ||
636 | } | ||
637 | |||
582 | static void cp210x_set_termios(struct tty_struct *tty, | 638 | static void cp210x_set_termios(struct tty_struct *tty, |
583 | struct usb_serial_port *port, struct ktermios *old_termios) | 639 | struct usb_serial_port *port, struct ktermios *old_termios) |
584 | { | 640 | { |
585 | unsigned int cflag, old_cflag; | 641 | unsigned int cflag, old_cflag; |
586 | unsigned int baud = 0, bits; | 642 | unsigned int bits; |
587 | unsigned int modem_ctl[4]; | 643 | unsigned int modem_ctl[4]; |
588 | 644 | ||
589 | dbg("%s - port %d", __func__, port->number); | 645 | dbg("%s - port %d", __func__, port->number); |
@@ -593,20 +649,9 @@ static void cp210x_set_termios(struct tty_struct *tty, | |||
593 | 649 | ||
594 | cflag = tty->termios->c_cflag; | 650 | cflag = tty->termios->c_cflag; |
595 | old_cflag = old_termios->c_cflag; | 651 | old_cflag = old_termios->c_cflag; |
596 | baud = cp210x_quantise_baudrate(tty_get_baud_rate(tty)); | 652 | |
597 | 653 | if (tty->termios->c_ospeed != old_termios->c_ospeed) | |
598 | /* If the baud rate is to be updated*/ | 654 | cp210x_change_speed(tty, port, old_termios); |
599 | if (baud != tty_termios_baud_rate(old_termios) && baud != 0) { | ||
600 | dbg("%s - Setting baud rate to %d baud", __func__, | ||
601 | baud); | ||
602 | if (cp210x_set_config_single(port, CP210X_SET_BAUDDIV, | ||
603 | ((BAUD_RATE_GEN_FREQ + baud/2) / baud))) { | ||
604 | dbg("Baud rate requested not supported by device"); | ||
605 | baud = tty_termios_baud_rate(old_termios); | ||
606 | } | ||
607 | } | ||
608 | /* Report back the resulting baud rate */ | ||
609 | tty_encode_baud_rate(tty, baud, baud); | ||
610 | 655 | ||
611 | /* If the number of data bits is to be updated */ | 656 | /* If the number of data bits is to be updated */ |
612 | if ((cflag & CSIZE) != (old_cflag & CSIZE)) { | 657 | if ((cflag & CSIZE) != (old_cflag & CSIZE)) { |
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index 01b6404df395..ad654f8208ef 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
@@ -797,6 +797,7 @@ static struct usb_device_id id_table_combined [] = { | |||
797 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | 797 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, |
798 | { USB_DEVICE(ADI_VID, ADI_GNICEPLUS_PID), | 798 | { USB_DEVICE(ADI_VID, ADI_GNICEPLUS_PID), |
799 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | 799 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, |
800 | { USB_DEVICE(HORNBY_VID, HORNBY_ELITE_PID) }, | ||
800 | { USB_DEVICE(JETI_VID, JETI_SPC1201_PID) }, | 801 | { USB_DEVICE(JETI_VID, JETI_SPC1201_PID) }, |
801 | { USB_DEVICE(MARVELL_VID, MARVELL_SHEEVAPLUG_PID), | 802 | { USB_DEVICE(MARVELL_VID, MARVELL_SHEEVAPLUG_PID), |
802 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | 803 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, |
@@ -805,6 +806,8 @@ static struct usb_device_id id_table_combined [] = { | |||
805 | { USB_DEVICE(BAYER_VID, BAYER_CONTOUR_CABLE_PID) }, | 806 | { USB_DEVICE(BAYER_VID, BAYER_CONTOUR_CABLE_PID) }, |
806 | { USB_DEVICE(FTDI_VID, MARVELL_OPENRD_PID), | 807 | { USB_DEVICE(FTDI_VID, MARVELL_OPENRD_PID), |
807 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | 808 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, |
809 | { USB_DEVICE(FTDI_VID, TI_XDS100V2_PID), | ||
810 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | ||
808 | { USB_DEVICE(FTDI_VID, HAMEG_HO820_PID) }, | 811 | { USB_DEVICE(FTDI_VID, HAMEG_HO820_PID) }, |
809 | { USB_DEVICE(FTDI_VID, HAMEG_HO720_PID) }, | 812 | { USB_DEVICE(FTDI_VID, HAMEG_HO720_PID) }, |
810 | { USB_DEVICE(FTDI_VID, HAMEG_HO730_PID) }, | 813 | { USB_DEVICE(FTDI_VID, HAMEG_HO730_PID) }, |
@@ -841,6 +844,7 @@ static struct usb_device_id id_table_combined [] = { | |||
841 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | 844 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, |
842 | { USB_DEVICE(ST_VID, ST_STMCLT1030_PID), | 845 | { USB_DEVICE(ST_VID, ST_STMCLT1030_PID), |
843 | .driver_info = (kernel_ulong_t)&ftdi_stmclite_quirk }, | 846 | .driver_info = (kernel_ulong_t)&ftdi_stmclite_quirk }, |
847 | { USB_DEVICE(FTDI_VID, FTDI_RF_R106) }, | ||
844 | { }, /* Optional parameter entry */ | 848 | { }, /* Optional parameter entry */ |
845 | { } /* Terminating entry */ | 849 | { } /* Terminating entry */ |
846 | }; | 850 | }; |
@@ -1333,8 +1337,7 @@ static int set_serial_info(struct tty_struct *tty, | |||
1333 | goto check_and_exit; | 1337 | goto check_and_exit; |
1334 | } | 1338 | } |
1335 | 1339 | ||
1336 | if ((new_serial.baud_base != priv->baud_base) && | 1340 | if (new_serial.baud_base != priv->baud_base) { |
1337 | (new_serial.baud_base < 9600)) { | ||
1338 | mutex_unlock(&priv->cfg_lock); | 1341 | mutex_unlock(&priv->cfg_lock); |
1339 | return -EINVAL; | 1342 | return -EINVAL; |
1340 | } | 1343 | } |
@@ -1824,6 +1827,7 @@ static int ftdi_sio_port_remove(struct usb_serial_port *port) | |||
1824 | 1827 | ||
1825 | static int ftdi_open(struct tty_struct *tty, struct usb_serial_port *port) | 1828 | static int ftdi_open(struct tty_struct *tty, struct usb_serial_port *port) |
1826 | { | 1829 | { |
1830 | struct ktermios dummy; | ||
1827 | struct usb_device *dev = port->serial->dev; | 1831 | struct usb_device *dev = port->serial->dev; |
1828 | struct ftdi_private *priv = usb_get_serial_port_data(port); | 1832 | struct ftdi_private *priv = usb_get_serial_port_data(port); |
1829 | int result; | 1833 | int result; |
@@ -1842,8 +1846,10 @@ static int ftdi_open(struct tty_struct *tty, struct usb_serial_port *port) | |||
1842 | This is same behaviour as serial.c/rs_open() - Kuba */ | 1846 | This is same behaviour as serial.c/rs_open() - Kuba */ |
1843 | 1847 | ||
1844 | /* ftdi_set_termios will send usb control messages */ | 1848 | /* ftdi_set_termios will send usb control messages */ |
1845 | if (tty) | 1849 | if (tty) { |
1846 | ftdi_set_termios(tty, port, tty->termios); | 1850 | memset(&dummy, 0, sizeof(dummy)); |
1851 | ftdi_set_termios(tty, port, &dummy); | ||
1852 | } | ||
1847 | 1853 | ||
1848 | /* Start reading from the device */ | 1854 | /* Start reading from the device */ |
1849 | result = usb_serial_generic_open(tty, port); | 1855 | result = usb_serial_generic_open(tty, port); |
diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h index df1d7da933ec..f994503df2dd 100644 --- a/drivers/usb/serial/ftdi_sio_ids.h +++ b/drivers/usb/serial/ftdi_sio_ids.h | |||
@@ -39,6 +39,13 @@ | |||
39 | /* www.candapter.com Ewert Energy Systems CANdapter device */ | 39 | /* www.candapter.com Ewert Energy Systems CANdapter device */ |
40 | #define FTDI_CANDAPTER_PID 0x9F80 /* Product Id */ | 40 | #define FTDI_CANDAPTER_PID 0x9F80 /* Product Id */ |
41 | 41 | ||
42 | /* | ||
43 | * Texas Instruments XDS100v2 JTAG / BeagleBone A3 | ||
44 | * http://processors.wiki.ti.com/index.php/XDS100 | ||
45 | * http://beagleboard.org/bone | ||
46 | */ | ||
47 | #define TI_XDS100V2_PID 0xa6d0 | ||
48 | |||
42 | #define FTDI_NXTCAM_PID 0xABB8 /* NXTCam for Mindstorms NXT */ | 49 | #define FTDI_NXTCAM_PID 0xABB8 /* NXTCam for Mindstorms NXT */ |
43 | 50 | ||
44 | /* US Interface Navigator (http://www.usinterface.com/) */ | 51 | /* US Interface Navigator (http://www.usinterface.com/) */ |
@@ -525,6 +532,12 @@ | |||
525 | #define ADI_GNICEPLUS_PID 0xF001 | 532 | #define ADI_GNICEPLUS_PID 0xF001 |
526 | 533 | ||
527 | /* | 534 | /* |
535 | * Hornby Elite | ||
536 | */ | ||
537 | #define HORNBY_VID 0x04D8 | ||
538 | #define HORNBY_ELITE_PID 0x000A | ||
539 | |||
540 | /* | ||
528 | * RATOC REX-USB60F | 541 | * RATOC REX-USB60F |
529 | */ | 542 | */ |
530 | #define RATOC_VENDOR_ID 0x0584 | 543 | #define RATOC_VENDOR_ID 0x0584 |
@@ -1168,3 +1181,9 @@ | |||
1168 | */ | 1181 | */ |
1169 | /* TagTracer MIFARE*/ | 1182 | /* TagTracer MIFARE*/ |
1170 | #define FTDI_ZEITCONTROL_TAGTRACE_MIFARE_PID 0xF7C0 | 1183 | #define FTDI_ZEITCONTROL_TAGTRACE_MIFARE_PID 0xF7C0 |
1184 | |||
1185 | /* | ||
1186 | * Rainforest Automation | ||
1187 | */ | ||
1188 | /* ZigBee controller */ | ||
1189 | #define FTDI_RF_R106 0x8A28 | ||
diff --git a/drivers/usb/serial/io_ti.c b/drivers/usb/serial/io_ti.c index 65bf06aa591a..5818bfc3261e 100644 --- a/drivers/usb/serial/io_ti.c +++ b/drivers/usb/serial/io_ti.c | |||
@@ -2657,15 +2657,7 @@ cleanup: | |||
2657 | 2657 | ||
2658 | static void edge_disconnect(struct usb_serial *serial) | 2658 | static void edge_disconnect(struct usb_serial *serial) |
2659 | { | 2659 | { |
2660 | int i; | ||
2661 | struct edgeport_port *edge_port; | ||
2662 | |||
2663 | dbg("%s", __func__); | 2660 | dbg("%s", __func__); |
2664 | |||
2665 | for (i = 0; i < serial->num_ports; ++i) { | ||
2666 | edge_port = usb_get_serial_port_data(serial->port[i]); | ||
2667 | edge_remove_sysfs_attrs(edge_port->port); | ||
2668 | } | ||
2669 | } | 2661 | } |
2670 | 2662 | ||
2671 | static void edge_release(struct usb_serial *serial) | 2663 | static void edge_release(struct usb_serial *serial) |
@@ -2744,6 +2736,7 @@ static struct usb_serial_driver edgeport_1port_device = { | |||
2744 | .disconnect = edge_disconnect, | 2736 | .disconnect = edge_disconnect, |
2745 | .release = edge_release, | 2737 | .release = edge_release, |
2746 | .port_probe = edge_create_sysfs_attrs, | 2738 | .port_probe = edge_create_sysfs_attrs, |
2739 | .port_remove = edge_remove_sysfs_attrs, | ||
2747 | .ioctl = edge_ioctl, | 2740 | .ioctl = edge_ioctl, |
2748 | .set_termios = edge_set_termios, | 2741 | .set_termios = edge_set_termios, |
2749 | .tiocmget = edge_tiocmget, | 2742 | .tiocmget = edge_tiocmget, |
@@ -2775,6 +2768,7 @@ static struct usb_serial_driver edgeport_2port_device = { | |||
2775 | .disconnect = edge_disconnect, | 2768 | .disconnect = edge_disconnect, |
2776 | .release = edge_release, | 2769 | .release = edge_release, |
2777 | .port_probe = edge_create_sysfs_attrs, | 2770 | .port_probe = edge_create_sysfs_attrs, |
2771 | .port_remove = edge_remove_sysfs_attrs, | ||
2778 | .ioctl = edge_ioctl, | 2772 | .ioctl = edge_ioctl, |
2779 | .set_termios = edge_set_termios, | 2773 | .set_termios = edge_set_termios, |
2780 | .tiocmget = edge_tiocmget, | 2774 | .tiocmget = edge_tiocmget, |
diff --git a/drivers/usb/serial/kobil_sct.c b/drivers/usb/serial/kobil_sct.c index 5d3beeeb5fd9..a92a3efb507b 100644 --- a/drivers/usb/serial/kobil_sct.c +++ b/drivers/usb/serial/kobil_sct.c | |||
@@ -38,7 +38,7 @@ | |||
38 | #include <linux/ioctl.h> | 38 | #include <linux/ioctl.h> |
39 | #include "kobil_sct.h" | 39 | #include "kobil_sct.h" |
40 | 40 | ||
41 | static int debug; | 41 | static bool debug; |
42 | 42 | ||
43 | /* Version Information */ | 43 | /* Version Information */ |
44 | #define DRIVER_VERSION "21/05/2004" | 44 | #define DRIVER_VERSION "21/05/2004" |
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 420d9857394a..ea126a4490cd 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
@@ -480,6 +480,10 @@ static void option_instat_callback(struct urb *urb); | |||
480 | #define ZD_VENDOR_ID 0x0685 | 480 | #define ZD_VENDOR_ID 0x0685 |
481 | #define ZD_PRODUCT_7000 0x7000 | 481 | #define ZD_PRODUCT_7000 0x7000 |
482 | 482 | ||
483 | /* LG products */ | ||
484 | #define LG_VENDOR_ID 0x1004 | ||
485 | #define LG_PRODUCT_L02C 0x618f | ||
486 | |||
483 | /* some devices interfaces need special handling due to a number of reasons */ | 487 | /* some devices interfaces need special handling due to a number of reasons */ |
484 | enum option_blacklist_reason { | 488 | enum option_blacklist_reason { |
485 | OPTION_BLACKLIST_NONE = 0, | 489 | OPTION_BLACKLIST_NONE = 0, |
@@ -1183,6 +1187,7 @@ static const struct usb_device_id option_ids[] = { | |||
1183 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CLU526) }, | 1187 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CLU526) }, |
1184 | { USB_DEVICE_AND_INTERFACE_INFO(VIETTEL_VENDOR_ID, VIETTEL_PRODUCT_VT1000, 0xff, 0xff, 0xff) }, | 1188 | { USB_DEVICE_AND_INTERFACE_INFO(VIETTEL_VENDOR_ID, VIETTEL_PRODUCT_VT1000, 0xff, 0xff, 0xff) }, |
1185 | { USB_DEVICE_AND_INTERFACE_INFO(ZD_VENDOR_ID, ZD_PRODUCT_7000, 0xff, 0xff, 0xff) }, | 1189 | { USB_DEVICE_AND_INTERFACE_INFO(ZD_VENDOR_ID, ZD_PRODUCT_7000, 0xff, 0xff, 0xff) }, |
1190 | { USB_DEVICE(LG_VENDOR_ID, LG_PRODUCT_L02C) }, /* docomo L-02C modem */ | ||
1186 | { } /* Terminating entry */ | 1191 | { } /* Terminating entry */ |
1187 | }; | 1192 | }; |
1188 | MODULE_DEVICE_TABLE(usb, option_ids); | 1193 | MODULE_DEVICE_TABLE(usb, option_ids); |
diff --git a/drivers/usb/serial/qcaux.c b/drivers/usb/serial/qcaux.c index 30b73e68a904..a34819884c1a 100644 --- a/drivers/usb/serial/qcaux.c +++ b/drivers/usb/serial/qcaux.c | |||
@@ -36,6 +36,7 @@ | |||
36 | #define UTSTARCOM_PRODUCT_UM175_V1 0x3712 | 36 | #define UTSTARCOM_PRODUCT_UM175_V1 0x3712 |
37 | #define UTSTARCOM_PRODUCT_UM175_V2 0x3714 | 37 | #define UTSTARCOM_PRODUCT_UM175_V2 0x3714 |
38 | #define UTSTARCOM_PRODUCT_UM175_ALLTEL 0x3715 | 38 | #define UTSTARCOM_PRODUCT_UM175_ALLTEL 0x3715 |
39 | #define PANTECH_PRODUCT_UML190_VZW 0x3716 | ||
39 | #define PANTECH_PRODUCT_UML290_VZW 0x3718 | 40 | #define PANTECH_PRODUCT_UML290_VZW 0x3718 |
40 | 41 | ||
41 | /* CMOTECH devices */ | 42 | /* CMOTECH devices */ |
@@ -67,7 +68,11 @@ static struct usb_device_id id_table[] = { | |||
67 | { USB_DEVICE_AND_INTERFACE_INFO(LG_VENDOR_ID, LG_PRODUCT_VX4400_6000, 0xff, 0xff, 0x00) }, | 68 | { USB_DEVICE_AND_INTERFACE_INFO(LG_VENDOR_ID, LG_PRODUCT_VX4400_6000, 0xff, 0xff, 0x00) }, |
68 | { USB_DEVICE_AND_INTERFACE_INFO(SANYO_VENDOR_ID, SANYO_PRODUCT_KATANA_LX, 0xff, 0xff, 0x00) }, | 69 | { USB_DEVICE_AND_INTERFACE_INFO(SANYO_VENDOR_ID, SANYO_PRODUCT_KATANA_LX, 0xff, 0xff, 0x00) }, |
69 | { USB_DEVICE_AND_INTERFACE_INFO(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_U520, 0xff, 0x00, 0x00) }, | 70 | { USB_DEVICE_AND_INTERFACE_INFO(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_U520, 0xff, 0x00, 0x00) }, |
70 | { USB_DEVICE_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, PANTECH_PRODUCT_UML290_VZW, 0xff, 0xff, 0xff) }, | 71 | { USB_DEVICE_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, PANTECH_PRODUCT_UML190_VZW, 0xff, 0xff, 0xff) }, |
72 | { USB_DEVICE_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, PANTECH_PRODUCT_UML190_VZW, 0xff, 0xfe, 0xff) }, | ||
73 | { USB_DEVICE_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, PANTECH_PRODUCT_UML290_VZW, 0xff, 0xfd, 0xff) }, /* NMEA */ | ||
74 | { USB_DEVICE_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, PANTECH_PRODUCT_UML290_VZW, 0xff, 0xfe, 0xff) }, /* WMC */ | ||
75 | { USB_DEVICE_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, PANTECH_PRODUCT_UML290_VZW, 0xff, 0xff, 0xff) }, /* DIAG */ | ||
71 | { }, | 76 | { }, |
72 | }; | 77 | }; |
73 | MODULE_DEVICE_TABLE(usb, id_table); | 78 | MODULE_DEVICE_TABLE(usb, id_table); |
diff --git a/drivers/usb/storage/realtek_cr.c b/drivers/usb/storage/realtek_cr.c index 1f62723ef1a8..d32f72061c09 100644 --- a/drivers/usb/storage/realtek_cr.c +++ b/drivers/usb/storage/realtek_cr.c | |||
@@ -789,7 +789,7 @@ static void rts51x_suspend_timer_fn(unsigned long data) | |||
789 | rts51x_set_stat(chip, RTS51X_STAT_SS); | 789 | rts51x_set_stat(chip, RTS51X_STAT_SS); |
790 | /* ignore mass storage interface's children */ | 790 | /* ignore mass storage interface's children */ |
791 | pm_suspend_ignore_children(&us->pusb_intf->dev, true); | 791 | pm_suspend_ignore_children(&us->pusb_intf->dev, true); |
792 | usb_autopm_put_interface(us->pusb_intf); | 792 | usb_autopm_put_interface_async(us->pusb_intf); |
793 | US_DEBUGP("%s: RTS51X_STAT_SS 01," | 793 | US_DEBUGP("%s: RTS51X_STAT_SS 01," |
794 | "intf->pm_usage_cnt:%d, power.usage:%d\n", | 794 | "intf->pm_usage_cnt:%d, power.usage:%d\n", |
795 | __func__, | 795 | __func__, |
diff --git a/drivers/usb/usb-skeleton.c b/drivers/usb/usb-skeleton.c index 8efeae24764f..b4a71679c933 100644 --- a/drivers/usb/usb-skeleton.c +++ b/drivers/usb/usb-skeleton.c | |||
@@ -27,8 +27,6 @@ | |||
27 | #define USB_SKEL_VENDOR_ID 0xfff0 | 27 | #define USB_SKEL_VENDOR_ID 0xfff0 |
28 | #define USB_SKEL_PRODUCT_ID 0xfff0 | 28 | #define USB_SKEL_PRODUCT_ID 0xfff0 |
29 | 29 | ||
30 | static DEFINE_MUTEX(skel_mutex); | ||
31 | |||
32 | /* table of devices that work with this driver */ | 30 | /* table of devices that work with this driver */ |
33 | static const struct usb_device_id skel_table[] = { | 31 | static const struct usb_device_id skel_table[] = { |
34 | { USB_DEVICE(USB_SKEL_VENDOR_ID, USB_SKEL_PRODUCT_ID) }, | 32 | { USB_DEVICE(USB_SKEL_VENDOR_ID, USB_SKEL_PRODUCT_ID) }, |
@@ -101,25 +99,18 @@ static int skel_open(struct inode *inode, struct file *file) | |||
101 | goto exit; | 99 | goto exit; |
102 | } | 100 | } |
103 | 101 | ||
104 | mutex_lock(&skel_mutex); | ||
105 | dev = usb_get_intfdata(interface); | 102 | dev = usb_get_intfdata(interface); |
106 | if (!dev) { | 103 | if (!dev) { |
107 | mutex_unlock(&skel_mutex); | ||
108 | retval = -ENODEV; | 104 | retval = -ENODEV; |
109 | goto exit; | 105 | goto exit; |
110 | } | 106 | } |
111 | 107 | ||
112 | /* increment our usage count for the device */ | 108 | /* increment our usage count for the device */ |
113 | kref_get(&dev->kref); | 109 | kref_get(&dev->kref); |
114 | mutex_unlock(&skel_mutex); | ||
115 | 110 | ||
116 | /* lock the device to allow correctly handling errors | 111 | /* lock the device to allow correctly handling errors |
117 | * in resumption */ | 112 | * in resumption */ |
118 | mutex_lock(&dev->io_mutex); | 113 | mutex_lock(&dev->io_mutex); |
119 | if (!dev->interface) { | ||
120 | retval = -ENODEV; | ||
121 | goto out_err; | ||
122 | } | ||
123 | 114 | ||
124 | retval = usb_autopm_get_interface(interface); | 115 | retval = usb_autopm_get_interface(interface); |
125 | if (retval) | 116 | if (retval) |
@@ -127,11 +118,7 @@ static int skel_open(struct inode *inode, struct file *file) | |||
127 | 118 | ||
128 | /* save our object in the file's private structure */ | 119 | /* save our object in the file's private structure */ |
129 | file->private_data = dev; | 120 | file->private_data = dev; |
130 | |||
131 | out_err: | ||
132 | mutex_unlock(&dev->io_mutex); | 121 | mutex_unlock(&dev->io_mutex); |
133 | if (retval) | ||
134 | kref_put(&dev->kref, skel_delete); | ||
135 | 122 | ||
136 | exit: | 123 | exit: |
137 | return retval; | 124 | return retval; |
@@ -611,6 +598,7 @@ static void skel_disconnect(struct usb_interface *interface) | |||
611 | int minor = interface->minor; | 598 | int minor = interface->minor; |
612 | 599 | ||
613 | dev = usb_get_intfdata(interface); | 600 | dev = usb_get_intfdata(interface); |
601 | usb_set_intfdata(interface, NULL); | ||
614 | 602 | ||
615 | /* give back our minor */ | 603 | /* give back our minor */ |
616 | usb_deregister_dev(interface, &skel_class); | 604 | usb_deregister_dev(interface, &skel_class); |
@@ -622,12 +610,8 @@ static void skel_disconnect(struct usb_interface *interface) | |||
622 | 610 | ||
623 | usb_kill_anchored_urbs(&dev->submitted); | 611 | usb_kill_anchored_urbs(&dev->submitted); |
624 | 612 | ||
625 | mutex_lock(&skel_mutex); | ||
626 | usb_set_intfdata(interface, NULL); | ||
627 | |||
628 | /* decrement our usage count */ | 613 | /* decrement our usage count */ |
629 | kref_put(&dev->kref, skel_delete); | 614 | kref_put(&dev->kref, skel_delete); |
630 | mutex_unlock(&skel_mutex); | ||
631 | 615 | ||
632 | dev_info(&interface->dev, "USB Skeleton #%d now disconnected", minor); | 616 | dev_info(&interface->dev, "USB Skeleton #%d now disconnected", minor); |
633 | } | 617 | } |
diff --git a/drivers/usb/wusbcore/Kconfig b/drivers/usb/wusbcore/Kconfig index 0ead8826ec79..f29fdd7f6d75 100644 --- a/drivers/usb/wusbcore/Kconfig +++ b/drivers/usb/wusbcore/Kconfig | |||
@@ -6,7 +6,7 @@ config USB_WUSB | |||
6 | depends on EXPERIMENTAL | 6 | depends on EXPERIMENTAL |
7 | depends on USB | 7 | depends on USB |
8 | depends on PCI | 8 | depends on PCI |
9 | select UWB | 9 | depends on UWB |
10 | select CRYPTO | 10 | select CRYPTO |
11 | select CRYPTO_BLKCIPHER | 11 | select CRYPTO_BLKCIPHER |
12 | select CRYPTO_CBC | 12 | select CRYPTO_CBC |
diff --git a/drivers/video/backlight/adp8860_bl.c b/drivers/video/backlight/adp8860_bl.c index 66bc74d9ce2a..378276c9d3cf 100644 --- a/drivers/video/backlight/adp8860_bl.c +++ b/drivers/video/backlight/adp8860_bl.c | |||
@@ -146,7 +146,7 @@ static int adp8860_set_bits(struct i2c_client *client, int reg, uint8_t bit_mask | |||
146 | 146 | ||
147 | ret = adp8860_read(client, reg, ®_val); | 147 | ret = adp8860_read(client, reg, ®_val); |
148 | 148 | ||
149 | if (!ret && ((reg_val & bit_mask) == 0)) { | 149 | if (!ret && ((reg_val & bit_mask) != bit_mask)) { |
150 | reg_val |= bit_mask; | 150 | reg_val |= bit_mask; |
151 | ret = adp8860_write(client, reg, reg_val); | 151 | ret = adp8860_write(client, reg, reg_val); |
152 | } | 152 | } |
diff --git a/drivers/video/backlight/adp8870_bl.c b/drivers/video/backlight/adp8870_bl.c index 6c68a6899e87..6735059376d6 100644 --- a/drivers/video/backlight/adp8870_bl.c +++ b/drivers/video/backlight/adp8870_bl.c | |||
@@ -160,7 +160,7 @@ static int adp8870_set_bits(struct i2c_client *client, int reg, uint8_t bit_mask | |||
160 | 160 | ||
161 | ret = adp8870_read(client, reg, ®_val); | 161 | ret = adp8870_read(client, reg, ®_val); |
162 | 162 | ||
163 | if (!ret && ((reg_val & bit_mask) == 0)) { | 163 | if (!ret && ((reg_val & bit_mask) != bit_mask)) { |
164 | reg_val |= bit_mask; | 164 | reg_val |= bit_mask; |
165 | ret = adp8870_write(client, reg, reg_val); | 165 | ret = adp8870_write(client, reg, reg_val); |
166 | } | 166 | } |
diff --git a/drivers/video/backlight/l4f00242t03.c b/drivers/video/backlight/l4f00242t03.c index 4f5d1c4cb6ab..27d1d7a29c77 100644 --- a/drivers/video/backlight/l4f00242t03.c +++ b/drivers/video/backlight/l4f00242t03.c | |||
@@ -190,6 +190,7 @@ static int __devinit l4f00242t03_probe(struct spi_device *spi) | |||
190 | 190 | ||
191 | priv->io_reg = regulator_get(&spi->dev, "vdd"); | 191 | priv->io_reg = regulator_get(&spi->dev, "vdd"); |
192 | if (IS_ERR(priv->io_reg)) { | 192 | if (IS_ERR(priv->io_reg)) { |
193 | ret = PTR_ERR(priv->io_reg); | ||
193 | dev_err(&spi->dev, "%s: Unable to get the IO regulator\n", | 194 | dev_err(&spi->dev, "%s: Unable to get the IO regulator\n", |
194 | __func__); | 195 | __func__); |
195 | goto err3; | 196 | goto err3; |
@@ -197,6 +198,7 @@ static int __devinit l4f00242t03_probe(struct spi_device *spi) | |||
197 | 198 | ||
198 | priv->core_reg = regulator_get(&spi->dev, "vcore"); | 199 | priv->core_reg = regulator_get(&spi->dev, "vcore"); |
199 | if (IS_ERR(priv->core_reg)) { | 200 | if (IS_ERR(priv->core_reg)) { |
201 | ret = PTR_ERR(priv->core_reg); | ||
200 | dev_err(&spi->dev, "%s: Unable to get the core regulator\n", | 202 | dev_err(&spi->dev, "%s: Unable to get the core regulator\n", |
201 | __func__); | 203 | __func__); |
202 | goto err4; | 204 | goto err4; |
diff --git a/drivers/video/macfb.c b/drivers/video/macfb.c index 43207cc6cc19..fe01add3700e 100644 --- a/drivers/video/macfb.c +++ b/drivers/video/macfb.c | |||
@@ -592,12 +592,12 @@ static int __init macfb_init(void) | |||
592 | if (!fb_info.screen_base) | 592 | if (!fb_info.screen_base) |
593 | return -ENODEV; | 593 | return -ENODEV; |
594 | 594 | ||
595 | printk("macfb: framebuffer at 0x%08lx, mapped to 0x%p, size %dk\n", | 595 | pr_info("macfb: framebuffer at 0x%08lx, mapped to 0x%p, size %dk\n", |
596 | macfb_fix.smem_start, fb_info.screen_base, | 596 | macfb_fix.smem_start, fb_info.screen_base, |
597 | macfb_fix.smem_len / 1024); | 597 | macfb_fix.smem_len / 1024); |
598 | printk("macfb: mode is %dx%dx%d, linelength=%d\n", | 598 | pr_info("macfb: mode is %dx%dx%d, linelength=%d\n", |
599 | macfb_defined.xres, macfb_defined.yres, | 599 | macfb_defined.xres, macfb_defined.yres, |
600 | macfb_defined.bits_per_pixel, macfb_fix.line_length); | 600 | macfb_defined.bits_per_pixel, macfb_fix.line_length); |
601 | 601 | ||
602 | /* Fill in the available video resolution */ | 602 | /* Fill in the available video resolution */ |
603 | macfb_defined.xres_virtual = macfb_defined.xres; | 603 | macfb_defined.xres_virtual = macfb_defined.xres; |
@@ -613,14 +613,10 @@ static int __init macfb_init(void) | |||
613 | 613 | ||
614 | switch (macfb_defined.bits_per_pixel) { | 614 | switch (macfb_defined.bits_per_pixel) { |
615 | case 1: | 615 | case 1: |
616 | /* | ||
617 | * XXX: I think this will catch any program that tries | ||
618 | * to do FBIO_PUTCMAP when the visual is monochrome. | ||
619 | */ | ||
620 | macfb_defined.red.length = macfb_defined.bits_per_pixel; | 616 | macfb_defined.red.length = macfb_defined.bits_per_pixel; |
621 | macfb_defined.green.length = macfb_defined.bits_per_pixel; | 617 | macfb_defined.green.length = macfb_defined.bits_per_pixel; |
622 | macfb_defined.blue.length = macfb_defined.bits_per_pixel; | 618 | macfb_defined.blue.length = macfb_defined.bits_per_pixel; |
623 | video_cmap_len = 0; | 619 | video_cmap_len = 2; |
624 | macfb_fix.visual = FB_VISUAL_MONO01; | 620 | macfb_fix.visual = FB_VISUAL_MONO01; |
625 | break; | 621 | break; |
626 | case 2: | 622 | case 2: |
@@ -660,11 +656,10 @@ static int __init macfb_init(void) | |||
660 | macfb_fix.visual = FB_VISUAL_TRUECOLOR; | 656 | macfb_fix.visual = FB_VISUAL_TRUECOLOR; |
661 | break; | 657 | break; |
662 | default: | 658 | default: |
663 | video_cmap_len = 0; | 659 | pr_err("macfb: unknown or unsupported bit depth: %d\n", |
664 | macfb_fix.visual = FB_VISUAL_MONO01; | ||
665 | printk("macfb: unknown or unsupported bit depth: %d\n", | ||
666 | macfb_defined.bits_per_pixel); | 660 | macfb_defined.bits_per_pixel); |
667 | break; | 661 | err = -EINVAL; |
662 | goto fail_unmap; | ||
668 | } | 663 | } |
669 | 664 | ||
670 | /* | 665 | /* |
@@ -734,8 +729,8 @@ static int __init macfb_init(void) | |||
734 | case MAC_MODEL_Q950: | 729 | case MAC_MODEL_Q950: |
735 | strcpy(macfb_fix.id, "DAFB"); | 730 | strcpy(macfb_fix.id, "DAFB"); |
736 | macfb_setpalette = dafb_setpalette; | 731 | macfb_setpalette = dafb_setpalette; |
737 | macfb_defined.activate = FB_ACTIVATE_NOW; | ||
738 | dafb_cmap_regs = ioremap(DAFB_BASE, 0x1000); | 732 | dafb_cmap_regs = ioremap(DAFB_BASE, 0x1000); |
733 | macfb_defined.activate = FB_ACTIVATE_NOW; | ||
739 | break; | 734 | break; |
740 | 735 | ||
741 | /* | 736 | /* |
@@ -744,8 +739,8 @@ static int __init macfb_init(void) | |||
744 | case MAC_MODEL_LCII: | 739 | case MAC_MODEL_LCII: |
745 | strcpy(macfb_fix.id, "V8"); | 740 | strcpy(macfb_fix.id, "V8"); |
746 | macfb_setpalette = v8_brazil_setpalette; | 741 | macfb_setpalette = v8_brazil_setpalette; |
747 | macfb_defined.activate = FB_ACTIVATE_NOW; | ||
748 | v8_brazil_cmap_regs = ioremap(DAC_BASE, 0x1000); | 742 | v8_brazil_cmap_regs = ioremap(DAC_BASE, 0x1000); |
743 | macfb_defined.activate = FB_ACTIVATE_NOW; | ||
749 | break; | 744 | break; |
750 | 745 | ||
751 | /* | 746 | /* |
@@ -758,8 +753,8 @@ static int __init macfb_init(void) | |||
758 | case MAC_MODEL_P600: | 753 | case MAC_MODEL_P600: |
759 | strcpy(macfb_fix.id, "Brazil"); | 754 | strcpy(macfb_fix.id, "Brazil"); |
760 | macfb_setpalette = v8_brazil_setpalette; | 755 | macfb_setpalette = v8_brazil_setpalette; |
761 | macfb_defined.activate = FB_ACTIVATE_NOW; | ||
762 | v8_brazil_cmap_regs = ioremap(DAC_BASE, 0x1000); | 756 | v8_brazil_cmap_regs = ioremap(DAC_BASE, 0x1000); |
757 | macfb_defined.activate = FB_ACTIVATE_NOW; | ||
763 | break; | 758 | break; |
764 | 759 | ||
765 | /* | 760 | /* |
@@ -773,10 +768,10 @@ static int __init macfb_init(void) | |||
773 | case MAC_MODEL_P520: | 768 | case MAC_MODEL_P520: |
774 | case MAC_MODEL_P550: | 769 | case MAC_MODEL_P550: |
775 | case MAC_MODEL_P460: | 770 | case MAC_MODEL_P460: |
776 | macfb_setpalette = v8_brazil_setpalette; | ||
777 | macfb_defined.activate = FB_ACTIVATE_NOW; | ||
778 | strcpy(macfb_fix.id, "Sonora"); | 771 | strcpy(macfb_fix.id, "Sonora"); |
772 | macfb_setpalette = v8_brazil_setpalette; | ||
779 | v8_brazil_cmap_regs = ioremap(DAC_BASE, 0x1000); | 773 | v8_brazil_cmap_regs = ioremap(DAC_BASE, 0x1000); |
774 | macfb_defined.activate = FB_ACTIVATE_NOW; | ||
780 | break; | 775 | break; |
781 | 776 | ||
782 | /* | 777 | /* |
@@ -786,10 +781,10 @@ static int __init macfb_init(void) | |||
786 | */ | 781 | */ |
787 | case MAC_MODEL_IICI: | 782 | case MAC_MODEL_IICI: |
788 | case MAC_MODEL_IISI: | 783 | case MAC_MODEL_IISI: |
789 | macfb_setpalette = rbv_setpalette; | ||
790 | macfb_defined.activate = FB_ACTIVATE_NOW; | ||
791 | strcpy(macfb_fix.id, "RBV"); | 784 | strcpy(macfb_fix.id, "RBV"); |
785 | macfb_setpalette = rbv_setpalette; | ||
792 | rbv_cmap_regs = ioremap(DAC_BASE, 0x1000); | 786 | rbv_cmap_regs = ioremap(DAC_BASE, 0x1000); |
787 | macfb_defined.activate = FB_ACTIVATE_NOW; | ||
793 | break; | 788 | break; |
794 | 789 | ||
795 | /* | 790 | /* |
@@ -797,10 +792,10 @@ static int __init macfb_init(void) | |||
797 | */ | 792 | */ |
798 | case MAC_MODEL_Q840: | 793 | case MAC_MODEL_Q840: |
799 | case MAC_MODEL_C660: | 794 | case MAC_MODEL_C660: |
800 | macfb_setpalette = civic_setpalette; | ||
801 | macfb_defined.activate = FB_ACTIVATE_NOW; | ||
802 | strcpy(macfb_fix.id, "Civic"); | 795 | strcpy(macfb_fix.id, "Civic"); |
796 | macfb_setpalette = civic_setpalette; | ||
803 | civic_cmap_regs = ioremap(CIVIC_BASE, 0x1000); | 797 | civic_cmap_regs = ioremap(CIVIC_BASE, 0x1000); |
798 | macfb_defined.activate = FB_ACTIVATE_NOW; | ||
804 | break; | 799 | break; |
805 | 800 | ||
806 | 801 | ||
@@ -809,26 +804,26 @@ static int __init macfb_init(void) | |||
809 | * We think this may be like the LC II | 804 | * We think this may be like the LC II |
810 | */ | 805 | */ |
811 | case MAC_MODEL_LC: | 806 | case MAC_MODEL_LC: |
807 | strcpy(macfb_fix.id, "LC"); | ||
812 | if (vidtest) { | 808 | if (vidtest) { |
813 | macfb_setpalette = v8_brazil_setpalette; | 809 | macfb_setpalette = v8_brazil_setpalette; |
814 | macfb_defined.activate = FB_ACTIVATE_NOW; | ||
815 | v8_brazil_cmap_regs = | 810 | v8_brazil_cmap_regs = |
816 | ioremap(DAC_BASE, 0x1000); | 811 | ioremap(DAC_BASE, 0x1000); |
812 | macfb_defined.activate = FB_ACTIVATE_NOW; | ||
817 | } | 813 | } |
818 | strcpy(macfb_fix.id, "LC"); | ||
819 | break; | 814 | break; |
820 | 815 | ||
821 | /* | 816 | /* |
822 | * We think this may be like the LC II | 817 | * We think this may be like the LC II |
823 | */ | 818 | */ |
824 | case MAC_MODEL_CCL: | 819 | case MAC_MODEL_CCL: |
820 | strcpy(macfb_fix.id, "Color Classic"); | ||
825 | if (vidtest) { | 821 | if (vidtest) { |
826 | macfb_setpalette = v8_brazil_setpalette; | 822 | macfb_setpalette = v8_brazil_setpalette; |
827 | macfb_defined.activate = FB_ACTIVATE_NOW; | ||
828 | v8_brazil_cmap_regs = | 823 | v8_brazil_cmap_regs = |
829 | ioremap(DAC_BASE, 0x1000); | 824 | ioremap(DAC_BASE, 0x1000); |
825 | macfb_defined.activate = FB_ACTIVATE_NOW; | ||
830 | } | 826 | } |
831 | strcpy(macfb_fix.id, "Color Classic"); | ||
832 | break; | 827 | break; |
833 | 828 | ||
834 | /* | 829 | /* |
@@ -893,10 +888,10 @@ static int __init macfb_init(void) | |||
893 | case MAC_MODEL_PB270C: | 888 | case MAC_MODEL_PB270C: |
894 | case MAC_MODEL_PB280: | 889 | case MAC_MODEL_PB280: |
895 | case MAC_MODEL_PB280C: | 890 | case MAC_MODEL_PB280C: |
896 | macfb_setpalette = csc_setpalette; | ||
897 | macfb_defined.activate = FB_ACTIVATE_NOW; | ||
898 | strcpy(macfb_fix.id, "CSC"); | 891 | strcpy(macfb_fix.id, "CSC"); |
892 | macfb_setpalette = csc_setpalette; | ||
899 | csc_cmap_regs = ioremap(CSC_BASE, 0x1000); | 893 | csc_cmap_regs = ioremap(CSC_BASE, 0x1000); |
894 | macfb_defined.activate = FB_ACTIVATE_NOW; | ||
900 | break; | 895 | break; |
901 | 896 | ||
902 | default: | 897 | default: |
@@ -918,8 +913,9 @@ static int __init macfb_init(void) | |||
918 | if (err) | 913 | if (err) |
919 | goto fail_dealloc; | 914 | goto fail_dealloc; |
920 | 915 | ||
921 | printk("fb%d: %s frame buffer device\n", | 916 | pr_info("fb%d: %s frame buffer device\n", |
922 | fb_info.node, fb_info.fix.id); | 917 | fb_info.node, fb_info.fix.id); |
918 | |||
923 | return 0; | 919 | return 0; |
924 | 920 | ||
925 | fail_dealloc: | 921 | fail_dealloc: |
diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c index 79e1b292c030..5aa43c3392a2 100644 --- a/drivers/virtio/virtio_ring.c +++ b/drivers/virtio/virtio_ring.c | |||
@@ -35,7 +35,7 @@ | |||
35 | #define virtio_rmb(vq) \ | 35 | #define virtio_rmb(vq) \ |
36 | do { if ((vq)->weak_barriers) smp_rmb(); else rmb(); } while(0) | 36 | do { if ((vq)->weak_barriers) smp_rmb(); else rmb(); } while(0) |
37 | #define virtio_wmb(vq) \ | 37 | #define virtio_wmb(vq) \ |
38 | do { if ((vq)->weak_barriers) smp_rmb(); else rmb(); } while(0) | 38 | do { if ((vq)->weak_barriers) smp_wmb(); else wmb(); } while(0) |
39 | #else | 39 | #else |
40 | /* We must force memory ordering even if guest is UP since host could be | 40 | /* We must force memory ordering even if guest is UP since host could be |
41 | * running on another CPU, but SMP barriers are defined to barrier() in that | 41 | * running on another CPU, but SMP barriers are defined to barrier() in that |
@@ -308,9 +308,9 @@ bool virtqueue_kick_prepare(struct virtqueue *_vq) | |||
308 | bool needs_kick; | 308 | bool needs_kick; |
309 | 309 | ||
310 | START_USE(vq); | 310 | START_USE(vq); |
311 | /* Descriptors and available array need to be set before we expose the | 311 | /* We need to expose available array entries before checking avail |
312 | * new available array entries. */ | 312 | * event. */ |
313 | virtio_wmb(vq); | 313 | virtio_mb(vq); |
314 | 314 | ||
315 | old = vq->vring.avail->idx - vq->num_added; | 315 | old = vq->vring.avail->idx - vq->num_added; |
316 | new = vq->vring.avail->idx; | 316 | new = vq->vring.avail->idx; |
diff --git a/drivers/watchdog/dw_wdt.c b/drivers/watchdog/dw_wdt.c index 1b0e3dd81c1a..63d7b58f1c7d 100644 --- a/drivers/watchdog/dw_wdt.c +++ b/drivers/watchdog/dw_wdt.c | |||
@@ -300,11 +300,7 @@ static int __devinit dw_wdt_drv_probe(struct platform_device *pdev) | |||
300 | if (!mem) | 300 | if (!mem) |
301 | return -EINVAL; | 301 | return -EINVAL; |
302 | 302 | ||
303 | if (!devm_request_mem_region(&pdev->dev, mem->start, resource_size(mem), | 303 | dw_wdt.regs = devm_request_and_ioremap(&pdev->dev, mem); |
304 | "dw_wdt")) | ||
305 | return -ENOMEM; | ||
306 | |||
307 | dw_wdt.regs = devm_ioremap(&pdev->dev, mem->start, resource_size(mem)); | ||
308 | if (!dw_wdt.regs) | 304 | if (!dw_wdt.regs) |
309 | return -ENOMEM; | 305 | return -ENOMEM; |
310 | 306 | ||
diff --git a/drivers/watchdog/iTCO_wdt.c b/drivers/watchdog/iTCO_wdt.c index 99796c5d913d..bdf401b240b5 100644 --- a/drivers/watchdog/iTCO_wdt.c +++ b/drivers/watchdog/iTCO_wdt.c | |||
@@ -36,6 +36,7 @@ | |||
36 | * document number TBD : Patsburg (PBG) | 36 | * document number TBD : Patsburg (PBG) |
37 | * document number TBD : DH89xxCC | 37 | * document number TBD : DH89xxCC |
38 | * document number TBD : Panther Point | 38 | * document number TBD : Panther Point |
39 | * document number TBD : Lynx Point | ||
39 | */ | 40 | */ |
40 | 41 | ||
41 | /* | 42 | /* |
@@ -126,6 +127,7 @@ enum iTCO_chipsets { | |||
126 | TCO_PBG, /* Patsburg */ | 127 | TCO_PBG, /* Patsburg */ |
127 | TCO_DH89XXCC, /* DH89xxCC */ | 128 | TCO_DH89XXCC, /* DH89xxCC */ |
128 | TCO_PPT, /* Panther Point */ | 129 | TCO_PPT, /* Panther Point */ |
130 | TCO_LPT, /* Lynx Point */ | ||
129 | }; | 131 | }; |
130 | 132 | ||
131 | static struct { | 133 | static struct { |
@@ -189,6 +191,7 @@ static struct { | |||
189 | {"Patsburg", 2}, | 191 | {"Patsburg", 2}, |
190 | {"DH89xxCC", 2}, | 192 | {"DH89xxCC", 2}, |
191 | {"Panther Point", 2}, | 193 | {"Panther Point", 2}, |
194 | {"Lynx Point", 2}, | ||
192 | {NULL, 0} | 195 | {NULL, 0} |
193 | }; | 196 | }; |
194 | 197 | ||
@@ -331,6 +334,38 @@ static DEFINE_PCI_DEVICE_TABLE(iTCO_wdt_pci_tbl) = { | |||
331 | { PCI_VDEVICE(INTEL, 0x1e5d), TCO_PPT}, | 334 | { PCI_VDEVICE(INTEL, 0x1e5d), TCO_PPT}, |
332 | { PCI_VDEVICE(INTEL, 0x1e5e), TCO_PPT}, | 335 | { PCI_VDEVICE(INTEL, 0x1e5e), TCO_PPT}, |
333 | { PCI_VDEVICE(INTEL, 0x1e5f), TCO_PPT}, | 336 | { PCI_VDEVICE(INTEL, 0x1e5f), TCO_PPT}, |
337 | { PCI_VDEVICE(INTEL, 0x8c40), TCO_LPT}, | ||
338 | { PCI_VDEVICE(INTEL, 0x8c41), TCO_LPT}, | ||
339 | { PCI_VDEVICE(INTEL, 0x8c42), TCO_LPT}, | ||
340 | { PCI_VDEVICE(INTEL, 0x8c43), TCO_LPT}, | ||
341 | { PCI_VDEVICE(INTEL, 0x8c44), TCO_LPT}, | ||
342 | { PCI_VDEVICE(INTEL, 0x8c45), TCO_LPT}, | ||
343 | { PCI_VDEVICE(INTEL, 0x8c46), TCO_LPT}, | ||
344 | { PCI_VDEVICE(INTEL, 0x8c47), TCO_LPT}, | ||
345 | { PCI_VDEVICE(INTEL, 0x8c48), TCO_LPT}, | ||
346 | { PCI_VDEVICE(INTEL, 0x8c49), TCO_LPT}, | ||
347 | { PCI_VDEVICE(INTEL, 0x8c4a), TCO_LPT}, | ||
348 | { PCI_VDEVICE(INTEL, 0x8c4b), TCO_LPT}, | ||
349 | { PCI_VDEVICE(INTEL, 0x8c4c), TCO_LPT}, | ||
350 | { PCI_VDEVICE(INTEL, 0x8c4d), TCO_LPT}, | ||
351 | { PCI_VDEVICE(INTEL, 0x8c4e), TCO_LPT}, | ||
352 | { PCI_VDEVICE(INTEL, 0x8c4f), TCO_LPT}, | ||
353 | { PCI_VDEVICE(INTEL, 0x8c50), TCO_LPT}, | ||
354 | { PCI_VDEVICE(INTEL, 0x8c51), TCO_LPT}, | ||
355 | { PCI_VDEVICE(INTEL, 0x8c52), TCO_LPT}, | ||
356 | { PCI_VDEVICE(INTEL, 0x8c53), TCO_LPT}, | ||
357 | { PCI_VDEVICE(INTEL, 0x8c54), TCO_LPT}, | ||
358 | { PCI_VDEVICE(INTEL, 0x8c55), TCO_LPT}, | ||
359 | { PCI_VDEVICE(INTEL, 0x8c56), TCO_LPT}, | ||
360 | { PCI_VDEVICE(INTEL, 0x8c57), TCO_LPT}, | ||
361 | { PCI_VDEVICE(INTEL, 0x8c58), TCO_LPT}, | ||
362 | { PCI_VDEVICE(INTEL, 0x8c59), TCO_LPT}, | ||
363 | { PCI_VDEVICE(INTEL, 0x8c5a), TCO_LPT}, | ||
364 | { PCI_VDEVICE(INTEL, 0x8c5b), TCO_LPT}, | ||
365 | { PCI_VDEVICE(INTEL, 0x8c5c), TCO_LPT}, | ||
366 | { PCI_VDEVICE(INTEL, 0x8c5d), TCO_LPT}, | ||
367 | { PCI_VDEVICE(INTEL, 0x8c5e), TCO_LPT}, | ||
368 | { PCI_VDEVICE(INTEL, 0x8c5f), TCO_LPT}, | ||
334 | { 0, }, /* End of list */ | 369 | { 0, }, /* End of list */ |
335 | }; | 370 | }; |
336 | MODULE_DEVICE_TABLE(pci, iTCO_wdt_pci_tbl); | 371 | MODULE_DEVICE_TABLE(pci, iTCO_wdt_pci_tbl); |
diff --git a/drivers/watchdog/imx2_wdt.c b/drivers/watchdog/imx2_wdt.c index b8ef2c6dca7c..c44c3334003a 100644 --- a/drivers/watchdog/imx2_wdt.c +++ b/drivers/watchdog/imx2_wdt.c | |||
@@ -247,7 +247,6 @@ static struct miscdevice imx2_wdt_miscdev = { | |||
247 | static int __init imx2_wdt_probe(struct platform_device *pdev) | 247 | static int __init imx2_wdt_probe(struct platform_device *pdev) |
248 | { | 248 | { |
249 | int ret; | 249 | int ret; |
250 | int res_size; | ||
251 | struct resource *res; | 250 | struct resource *res; |
252 | 251 | ||
253 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 252 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
@@ -256,15 +255,7 @@ static int __init imx2_wdt_probe(struct platform_device *pdev) | |||
256 | return -ENODEV; | 255 | return -ENODEV; |
257 | } | 256 | } |
258 | 257 | ||
259 | res_size = resource_size(res); | 258 | imx2_wdt.base = devm_request_and_ioremap(&pdev->dev, res); |
260 | if (!devm_request_mem_region(&pdev->dev, res->start, res_size, | ||
261 | res->name)) { | ||
262 | dev_err(&pdev->dev, "can't allocate %d bytes at %d address\n", | ||
263 | res_size, res->start); | ||
264 | return -ENOMEM; | ||
265 | } | ||
266 | |||
267 | imx2_wdt.base = devm_ioremap_nocache(&pdev->dev, res->start, res_size); | ||
268 | if (!imx2_wdt.base) { | 259 | if (!imx2_wdt.base) { |
269 | dev_err(&pdev->dev, "ioremap failed\n"); | 260 | dev_err(&pdev->dev, "ioremap failed\n"); |
270 | return -ENOMEM; | 261 | return -ENOMEM; |
diff --git a/drivers/watchdog/nuc900_wdt.c b/drivers/watchdog/nuc900_wdt.c index 50359bad9177..529085b8b8fb 100644 --- a/drivers/watchdog/nuc900_wdt.c +++ b/drivers/watchdog/nuc900_wdt.c | |||
@@ -72,7 +72,7 @@ struct nuc900_wdt { | |||
72 | }; | 72 | }; |
73 | 73 | ||
74 | static unsigned long nuc900wdt_busy; | 74 | static unsigned long nuc900wdt_busy; |
75 | struct nuc900_wdt *nuc900_wdt; | 75 | static struct nuc900_wdt *nuc900_wdt; |
76 | 76 | ||
77 | static inline void nuc900_wdt_keepalive(void) | 77 | static inline void nuc900_wdt_keepalive(void) |
78 | { | 78 | { |
@@ -287,7 +287,8 @@ static int __devinit nuc900wdt_probe(struct platform_device *pdev) | |||
287 | 287 | ||
288 | setup_timer(&nuc900_wdt->timer, nuc900_wdt_timer_ping, 0); | 288 | setup_timer(&nuc900_wdt->timer, nuc900_wdt_timer_ping, 0); |
289 | 289 | ||
290 | if (misc_register(&nuc900wdt_miscdev)) { | 290 | ret = misc_register(&nuc900wdt_miscdev); |
291 | if (ret) { | ||
291 | dev_err(&pdev->dev, "err register miscdev on minor=%d (%d)\n", | 292 | dev_err(&pdev->dev, "err register miscdev on minor=%d (%d)\n", |
292 | WATCHDOG_MINOR, ret); | 293 | WATCHDOG_MINOR, ret); |
293 | goto err_clk; | 294 | goto err_clk; |
diff --git a/drivers/watchdog/omap_wdt.c b/drivers/watchdog/omap_wdt.c index 4b33e3fd726b..d19ff5145e82 100644 --- a/drivers/watchdog/omap_wdt.c +++ b/drivers/watchdog/omap_wdt.c | |||
@@ -339,6 +339,7 @@ static int __devinit omap_wdt_probe(struct platform_device *pdev) | |||
339 | return 0; | 339 | return 0; |
340 | 340 | ||
341 | err_misc: | 341 | err_misc: |
342 | pm_runtime_disable(wdev->dev); | ||
342 | platform_set_drvdata(pdev, NULL); | 343 | platform_set_drvdata(pdev, NULL); |
343 | iounmap(wdev->base); | 344 | iounmap(wdev->base); |
344 | 345 | ||
@@ -371,6 +372,7 @@ static int __devexit omap_wdt_remove(struct platform_device *pdev) | |||
371 | struct omap_wdt_dev *wdev = platform_get_drvdata(pdev); | 372 | struct omap_wdt_dev *wdev = platform_get_drvdata(pdev); |
372 | struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 373 | struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
373 | 374 | ||
375 | pm_runtime_disable(wdev->dev); | ||
374 | if (!res) | 376 | if (!res) |
375 | return -ENOENT; | 377 | return -ENOENT; |
376 | 378 | ||
diff --git a/drivers/watchdog/pnx4008_wdt.c b/drivers/watchdog/pnx4008_wdt.c index bd143c9dd3e6..8e210aafdfd0 100644 --- a/drivers/watchdog/pnx4008_wdt.c +++ b/drivers/watchdog/pnx4008_wdt.c | |||
@@ -226,7 +226,7 @@ static long pnx4008_wdt_ioctl(struct file *file, unsigned int cmd, | |||
226 | static int pnx4008_wdt_release(struct inode *inode, struct file *file) | 226 | static int pnx4008_wdt_release(struct inode *inode, struct file *file) |
227 | { | 227 | { |
228 | if (!test_bit(WDT_OK_TO_CLOSE, &wdt_status)) | 228 | if (!test_bit(WDT_OK_TO_CLOSE, &wdt_status)) |
229 | printk(KERN_WARNING "WATCHDOG: Device closed unexpectdly\n"); | 229 | printk(KERN_WARNING "WATCHDOG: Device closed unexpectedly\n"); |
230 | 230 | ||
231 | wdt_disable(); | 231 | wdt_disable(); |
232 | clk_disable(wdt_clk); | 232 | clk_disable(wdt_clk); |
diff --git a/drivers/watchdog/stmp3xxx_wdt.c b/drivers/watchdog/stmp3xxx_wdt.c index 4c2a4e8698f9..e37d81178b9e 100644 --- a/drivers/watchdog/stmp3xxx_wdt.c +++ b/drivers/watchdog/stmp3xxx_wdt.c | |||
@@ -174,7 +174,7 @@ static int stmp3xxx_wdt_release(struct inode *inode, struct file *file) | |||
174 | if (!nowayout) { | 174 | if (!nowayout) { |
175 | if (!test_bit(WDT_OK_TO_CLOSE, &wdt_status)) { | 175 | if (!test_bit(WDT_OK_TO_CLOSE, &wdt_status)) { |
176 | wdt_ping(); | 176 | wdt_ping(); |
177 | pr_debug("%s: Device closed unexpectdly\n", __func__); | 177 | pr_debug("%s: Device closed unexpectedly\n", __func__); |
178 | ret = -EINVAL; | 178 | ret = -EINVAL; |
179 | } else { | 179 | } else { |
180 | wdt_disable(); | 180 | wdt_disable(); |
diff --git a/drivers/watchdog/via_wdt.c b/drivers/watchdog/via_wdt.c index 026b4bbfa0aa..8f07dd4bd94a 100644 --- a/drivers/watchdog/via_wdt.c +++ b/drivers/watchdog/via_wdt.c | |||
@@ -124,8 +124,6 @@ static int wdt_stop(struct watchdog_device *wdd) | |||
124 | static int wdt_set_timeout(struct watchdog_device *wdd, | 124 | static int wdt_set_timeout(struct watchdog_device *wdd, |
125 | unsigned int new_timeout) | 125 | unsigned int new_timeout) |
126 | { | 126 | { |
127 | if (new_timeout < 1 || new_timeout > WDT_TIMEOUT_MAX) | ||
128 | return -EINVAL; | ||
129 | writel(new_timeout, wdt_mem + VIA_WDT_COUNT); | 127 | writel(new_timeout, wdt_mem + VIA_WDT_COUNT); |
130 | timeout = new_timeout; | 128 | timeout = new_timeout; |
131 | return 0; | 129 | return 0; |
@@ -150,6 +148,8 @@ static const struct watchdog_ops wdt_ops = { | |||
150 | static struct watchdog_device wdt_dev = { | 148 | static struct watchdog_device wdt_dev = { |
151 | .info = &wdt_info, | 149 | .info = &wdt_info, |
152 | .ops = &wdt_ops, | 150 | .ops = &wdt_ops, |
151 | .min_timeout = 1, | ||
152 | .max_timeout = WDT_TIMEOUT_MAX, | ||
153 | }; | 153 | }; |
154 | 154 | ||
155 | static int __devinit wdt_probe(struct pci_dev *pdev, | 155 | static int __devinit wdt_probe(struct pci_dev *pdev, |
@@ -233,7 +233,7 @@ static void __devexit wdt_remove(struct pci_dev *pdev) | |||
233 | pci_disable_device(pdev); | 233 | pci_disable_device(pdev); |
234 | } | 234 | } |
235 | 235 | ||
236 | DEFINE_PCI_DEVICE_TABLE(wdt_pci_table) = { | 236 | static DEFINE_PCI_DEVICE_TABLE(wdt_pci_table) = { |
237 | { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_CX700) }, | 237 | { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_CX700) }, |
238 | { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VX800) }, | 238 | { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VX800) }, |
239 | { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VX855) }, | 239 | { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VX855) }, |
diff --git a/drivers/watchdog/wafer5823wdt.c b/drivers/watchdog/wafer5823wdt.c index 42e940c23891..c3c3188c34d7 100644 --- a/drivers/watchdog/wafer5823wdt.c +++ b/drivers/watchdog/wafer5823wdt.c | |||
@@ -152,12 +152,12 @@ static long wafwdt_ioctl(struct file *file, unsigned int cmd, | |||
152 | return -EFAULT; | 152 | return -EFAULT; |
153 | 153 | ||
154 | if (options & WDIOS_DISABLECARD) { | 154 | if (options & WDIOS_DISABLECARD) { |
155 | wafwdt_start(); | 155 | wafwdt_stop(); |
156 | retval = 0; | 156 | retval = 0; |
157 | } | 157 | } |
158 | 158 | ||
159 | if (options & WDIOS_ENABLECARD) { | 159 | if (options & WDIOS_ENABLECARD) { |
160 | wafwdt_stop(); | 160 | wafwdt_start(); |
161 | retval = 0; | 161 | retval = 0; |
162 | } | 162 | } |
163 | 163 | ||
diff --git a/drivers/watchdog/wm8350_wdt.c b/drivers/watchdog/wm8350_wdt.c index 909c78650d3e..5d7113c7e501 100644 --- a/drivers/watchdog/wm8350_wdt.c +++ b/drivers/watchdog/wm8350_wdt.c | |||
@@ -212,10 +212,10 @@ static long wm8350_wdt_ioctl(struct file *file, unsigned int cmd, | |||
212 | 212 | ||
213 | /* Setting both simultaneously means at least one must fail */ | 213 | /* Setting both simultaneously means at least one must fail */ |
214 | if (options == WDIOS_DISABLECARD) | 214 | if (options == WDIOS_DISABLECARD) |
215 | ret = wm8350_wdt_start(wm8350); | 215 | ret = wm8350_wdt_stop(wm8350); |
216 | 216 | ||
217 | if (options == WDIOS_ENABLECARD) | 217 | if (options == WDIOS_ENABLECARD) |
218 | ret = wm8350_wdt_stop(wm8350); | 218 | ret = wm8350_wdt_start(wm8350); |
219 | break; | 219 | break; |
220 | } | 220 | } |
221 | 221 | ||
diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c index 1cd94daa71db..b4d4eac761db 100644 --- a/drivers/xen/grant-table.c +++ b/drivers/xen/grant-table.c | |||
@@ -948,9 +948,12 @@ static void gnttab_request_version(void) | |||
948 | int rc; | 948 | int rc; |
949 | struct gnttab_set_version gsv; | 949 | struct gnttab_set_version gsv; |
950 | 950 | ||
951 | gsv.version = 2; | 951 | if (xen_hvm_domain()) |
952 | gsv.version = 1; | ||
953 | else | ||
954 | gsv.version = 2; | ||
952 | rc = HYPERVISOR_grant_table_op(GNTTABOP_set_version, &gsv, 1); | 955 | rc = HYPERVISOR_grant_table_op(GNTTABOP_set_version, &gsv, 1); |
953 | if (rc == 0) { | 956 | if (rc == 0 && gsv.version == 2) { |
954 | grant_table_version = 2; | 957 | grant_table_version = 2; |
955 | gnttab_interface = &gnttab_v2_ops; | 958 | gnttab_interface = &gnttab_v2_ops; |
956 | } else if (grant_table_version == 2) { | 959 | } else if (grant_table_version == 2) { |
diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c index b9a843226de8..633c701a287d 100644 --- a/fs/btrfs/backref.c +++ b/fs/btrfs/backref.c | |||
@@ -297,7 +297,7 @@ static int __add_delayed_refs(struct btrfs_delayed_ref_head *head, u64 seq, | |||
297 | struct btrfs_delayed_extent_op *extent_op = head->extent_op; | 297 | struct btrfs_delayed_extent_op *extent_op = head->extent_op; |
298 | struct rb_node *n = &head->node.rb_node; | 298 | struct rb_node *n = &head->node.rb_node; |
299 | int sgn; | 299 | int sgn; |
300 | int ret; | 300 | int ret = 0; |
301 | 301 | ||
302 | if (extent_op && extent_op->update_key) | 302 | if (extent_op && extent_op->update_key) |
303 | btrfs_disk_key_to_cpu(info_key, &extent_op->key); | 303 | btrfs_disk_key_to_cpu(info_key, &extent_op->key); |
@@ -392,7 +392,7 @@ static int __add_inline_refs(struct btrfs_fs_info *fs_info, | |||
392 | struct btrfs_key *info_key, int *info_level, | 392 | struct btrfs_key *info_key, int *info_level, |
393 | struct list_head *prefs) | 393 | struct list_head *prefs) |
394 | { | 394 | { |
395 | int ret; | 395 | int ret = 0; |
396 | int slot; | 396 | int slot; |
397 | struct extent_buffer *leaf; | 397 | struct extent_buffer *leaf; |
398 | struct btrfs_key key; | 398 | struct btrfs_key key; |
diff --git a/fs/btrfs/check-integrity.c b/fs/btrfs/check-integrity.c index ad0b3ba735b7..b669a7d8e499 100644 --- a/fs/btrfs/check-integrity.c +++ b/fs/btrfs/check-integrity.c | |||
@@ -1662,7 +1662,7 @@ static void btrfsic_process_written_block(struct btrfsic_dev_state *dev_state, | |||
1662 | block = btrfsic_block_hashtable_lookup(bdev, dev_bytenr, | 1662 | block = btrfsic_block_hashtable_lookup(bdev, dev_bytenr, |
1663 | &state->block_hashtable); | 1663 | &state->block_hashtable); |
1664 | if (NULL != block) { | 1664 | if (NULL != block) { |
1665 | u64 bytenr; | 1665 | u64 bytenr = 0; |
1666 | struct list_head *elem_ref_to; | 1666 | struct list_head *elem_ref_to; |
1667 | struct list_head *tmp_ref_to; | 1667 | struct list_head *tmp_ref_to; |
1668 | 1668 | ||
@@ -2777,9 +2777,10 @@ int btrfsic_submit_bh(int rw, struct buffer_head *bh) | |||
2777 | printk(KERN_INFO | 2777 | printk(KERN_INFO |
2778 | "submit_bh(rw=0x%x, blocknr=%lu (bytenr %llu)," | 2778 | "submit_bh(rw=0x%x, blocknr=%lu (bytenr %llu)," |
2779 | " size=%lu, data=%p, bdev=%p)\n", | 2779 | " size=%lu, data=%p, bdev=%p)\n", |
2780 | rw, bh->b_blocknr, | 2780 | rw, (unsigned long)bh->b_blocknr, |
2781 | (unsigned long long)dev_bytenr, bh->b_size, | 2781 | (unsigned long long)dev_bytenr, |
2782 | bh->b_data, bh->b_bdev); | 2782 | (unsigned long)bh->b_size, bh->b_data, |
2783 | bh->b_bdev); | ||
2783 | btrfsic_process_written_block(dev_state, dev_bytenr, | 2784 | btrfsic_process_written_block(dev_state, dev_bytenr, |
2784 | bh->b_data, bh->b_size, NULL, | 2785 | bh->b_data, bh->b_size, NULL, |
2785 | NULL, bh, rw); | 2786 | NULL, bh, rw); |
@@ -2844,7 +2845,7 @@ void btrfsic_submit_bio(int rw, struct bio *bio) | |||
2844 | printk(KERN_INFO | 2845 | printk(KERN_INFO |
2845 | "submit_bio(rw=0x%x, bi_vcnt=%u," | 2846 | "submit_bio(rw=0x%x, bi_vcnt=%u," |
2846 | " bi_sector=%lu (bytenr %llu), bi_bdev=%p)\n", | 2847 | " bi_sector=%lu (bytenr %llu), bi_bdev=%p)\n", |
2847 | rw, bio->bi_vcnt, bio->bi_sector, | 2848 | rw, bio->bi_vcnt, (unsigned long)bio->bi_sector, |
2848 | (unsigned long long)dev_bytenr, | 2849 | (unsigned long long)dev_bytenr, |
2849 | bio->bi_bdev); | 2850 | bio->bi_bdev); |
2850 | 2851 | ||
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 7aa9cd36bf1b..811d9f918b1c 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
@@ -962,6 +962,13 @@ static int btree_releasepage(struct page *page, gfp_t gfp_flags) | |||
962 | tree = &BTRFS_I(page->mapping->host)->io_tree; | 962 | tree = &BTRFS_I(page->mapping->host)->io_tree; |
963 | map = &BTRFS_I(page->mapping->host)->extent_tree; | 963 | map = &BTRFS_I(page->mapping->host)->extent_tree; |
964 | 964 | ||
965 | /* | ||
966 | * We need to mask out eg. __GFP_HIGHMEM and __GFP_DMA32 as we're doing | ||
967 | * slab allocation from alloc_extent_state down the callchain where | ||
968 | * it'd hit a BUG_ON as those flags are not allowed. | ||
969 | */ | ||
970 | gfp_flags &= ~GFP_SLAB_BUG_MASK; | ||
971 | |||
965 | ret = try_release_extent_state(map, tree, page, gfp_flags); | 972 | ret = try_release_extent_state(map, tree, page, gfp_flags); |
966 | if (!ret) | 973 | if (!ret) |
967 | return 0; | 974 | return 0; |
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 700879ed64cf..283af7a676a3 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
@@ -34,23 +34,24 @@ | |||
34 | #include "locking.h" | 34 | #include "locking.h" |
35 | #include "free-space-cache.h" | 35 | #include "free-space-cache.h" |
36 | 36 | ||
37 | /* control flags for do_chunk_alloc's force field | 37 | /* |
38 | * control flags for do_chunk_alloc's force field | ||
38 | * CHUNK_ALLOC_NO_FORCE means to only allocate a chunk | 39 | * CHUNK_ALLOC_NO_FORCE means to only allocate a chunk |
39 | * if we really need one. | 40 | * if we really need one. |
40 | * | 41 | * |
41 | * CHUNK_ALLOC_FORCE means it must try to allocate one | ||
42 | * | ||
43 | * CHUNK_ALLOC_LIMITED means to only try and allocate one | 42 | * CHUNK_ALLOC_LIMITED means to only try and allocate one |
44 | * if we have very few chunks already allocated. This is | 43 | * if we have very few chunks already allocated. This is |
45 | * used as part of the clustering code to help make sure | 44 | * used as part of the clustering code to help make sure |
46 | * we have a good pool of storage to cluster in, without | 45 | * we have a good pool of storage to cluster in, without |
47 | * filling the FS with empty chunks | 46 | * filling the FS with empty chunks |
48 | * | 47 | * |
48 | * CHUNK_ALLOC_FORCE means it must try to allocate one | ||
49 | * | ||
49 | */ | 50 | */ |
50 | enum { | 51 | enum { |
51 | CHUNK_ALLOC_NO_FORCE = 0, | 52 | CHUNK_ALLOC_NO_FORCE = 0, |
52 | CHUNK_ALLOC_FORCE = 1, | 53 | CHUNK_ALLOC_LIMITED = 1, |
53 | CHUNK_ALLOC_LIMITED = 2, | 54 | CHUNK_ALLOC_FORCE = 2, |
54 | }; | 55 | }; |
55 | 56 | ||
56 | /* | 57 | /* |
@@ -3414,7 +3415,7 @@ static int do_chunk_alloc(struct btrfs_trans_handle *trans, | |||
3414 | 3415 | ||
3415 | again: | 3416 | again: |
3416 | spin_lock(&space_info->lock); | 3417 | spin_lock(&space_info->lock); |
3417 | if (space_info->force_alloc) | 3418 | if (force < space_info->force_alloc) |
3418 | force = space_info->force_alloc; | 3419 | force = space_info->force_alloc; |
3419 | if (space_info->full) { | 3420 | if (space_info->full) { |
3420 | spin_unlock(&space_info->lock); | 3421 | spin_unlock(&space_info->lock); |
@@ -5794,6 +5795,7 @@ int btrfs_reserve_extent(struct btrfs_trans_handle *trans, | |||
5794 | u64 search_end, struct btrfs_key *ins, | 5795 | u64 search_end, struct btrfs_key *ins, |
5795 | u64 data) | 5796 | u64 data) |
5796 | { | 5797 | { |
5798 | bool final_tried = false; | ||
5797 | int ret; | 5799 | int ret; |
5798 | u64 search_start = 0; | 5800 | u64 search_start = 0; |
5799 | 5801 | ||
@@ -5813,22 +5815,25 @@ again: | |||
5813 | search_start, search_end, hint_byte, | 5815 | search_start, search_end, hint_byte, |
5814 | ins, data); | 5816 | ins, data); |
5815 | 5817 | ||
5816 | if (ret == -ENOSPC && num_bytes > min_alloc_size) { | 5818 | if (ret == -ENOSPC) { |
5817 | num_bytes = num_bytes >> 1; | 5819 | if (!final_tried) { |
5818 | num_bytes = num_bytes & ~(root->sectorsize - 1); | 5820 | num_bytes = num_bytes >> 1; |
5819 | num_bytes = max(num_bytes, min_alloc_size); | 5821 | num_bytes = num_bytes & ~(root->sectorsize - 1); |
5820 | do_chunk_alloc(trans, root->fs_info->extent_root, | 5822 | num_bytes = max(num_bytes, min_alloc_size); |
5821 | num_bytes, data, CHUNK_ALLOC_FORCE); | 5823 | do_chunk_alloc(trans, root->fs_info->extent_root, |
5822 | goto again; | 5824 | num_bytes, data, CHUNK_ALLOC_FORCE); |
5823 | } | 5825 | if (num_bytes == min_alloc_size) |
5824 | if (ret == -ENOSPC && btrfs_test_opt(root, ENOSPC_DEBUG)) { | 5826 | final_tried = true; |
5825 | struct btrfs_space_info *sinfo; | 5827 | goto again; |
5826 | 5828 | } else if (btrfs_test_opt(root, ENOSPC_DEBUG)) { | |
5827 | sinfo = __find_space_info(root->fs_info, data); | 5829 | struct btrfs_space_info *sinfo; |
5828 | printk(KERN_ERR "btrfs allocation failed flags %llu, " | 5830 | |
5829 | "wanted %llu\n", (unsigned long long)data, | 5831 | sinfo = __find_space_info(root->fs_info, data); |
5830 | (unsigned long long)num_bytes); | 5832 | printk(KERN_ERR "btrfs allocation failed flags %llu, " |
5831 | dump_space_info(sinfo, num_bytes, 1); | 5833 | "wanted %llu\n", (unsigned long long)data, |
5834 | (unsigned long long)num_bytes); | ||
5835 | dump_space_info(sinfo, num_bytes, 1); | ||
5836 | } | ||
5832 | } | 5837 | } |
5833 | 5838 | ||
5834 | trace_btrfs_reserved_extent_alloc(root, ins->objectid, ins->offset); | 5839 | trace_btrfs_reserved_extent_alloc(root, ins->objectid, ins->offset); |
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 9d09a4f81875..fcf77e1ded40 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c | |||
@@ -3909,6 +3909,8 @@ int extent_range_uptodate(struct extent_io_tree *tree, | |||
3909 | while (start <= end) { | 3909 | while (start <= end) { |
3910 | index = start >> PAGE_CACHE_SHIFT; | 3910 | index = start >> PAGE_CACHE_SHIFT; |
3911 | page = find_get_page(tree->mapping, index); | 3911 | page = find_get_page(tree->mapping, index); |
3912 | if (!page) | ||
3913 | return 1; | ||
3912 | uptodate = PageUptodate(page); | 3914 | uptodate = PageUptodate(page); |
3913 | page_cache_release(page); | 3915 | page_cache_release(page); |
3914 | if (!uptodate) { | 3916 | if (!uptodate) { |
diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c index d20ff87ca603..c2f20594c9f7 100644 --- a/fs/btrfs/free-space-cache.c +++ b/fs/btrfs/free-space-cache.c | |||
@@ -2242,7 +2242,7 @@ u64 btrfs_alloc_from_cluster(struct btrfs_block_group_cache *block_group, | |||
2242 | if (entry->bitmap) { | 2242 | if (entry->bitmap) { |
2243 | ret = btrfs_alloc_from_bitmap(block_group, | 2243 | ret = btrfs_alloc_from_bitmap(block_group, |
2244 | cluster, entry, bytes, | 2244 | cluster, entry, bytes, |
2245 | min_start); | 2245 | cluster->window_start); |
2246 | if (ret == 0) { | 2246 | if (ret == 0) { |
2247 | node = rb_next(&entry->offset_index); | 2247 | node = rb_next(&entry->offset_index); |
2248 | if (!node) | 2248 | if (!node) |
@@ -2251,6 +2251,7 @@ u64 btrfs_alloc_from_cluster(struct btrfs_block_group_cache *block_group, | |||
2251 | offset_index); | 2251 | offset_index); |
2252 | continue; | 2252 | continue; |
2253 | } | 2253 | } |
2254 | cluster->window_start += bytes; | ||
2254 | } else { | 2255 | } else { |
2255 | ret = entry->offset; | 2256 | ret = entry->offset; |
2256 | 2257 | ||
@@ -2475,7 +2476,7 @@ setup_cluster_bitmap(struct btrfs_block_group_cache *block_group, | |||
2475 | } | 2476 | } |
2476 | 2477 | ||
2477 | list_for_each_entry(entry, bitmaps, list) { | 2478 | list_for_each_entry(entry, bitmaps, list) { |
2478 | if (entry->bytes < min_bytes) | 2479 | if (entry->bytes < bytes) |
2479 | continue; | 2480 | continue; |
2480 | ret = btrfs_bitmap_cluster(block_group, entry, cluster, offset, | 2481 | ret = btrfs_bitmap_cluster(block_group, entry, cluster, offset, |
2481 | bytes, cont1_bytes, min_bytes); | 2482 | bytes, cont1_bytes, min_bytes); |
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 0da19a0ea00d..32214fe0f7e3 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -6401,18 +6401,23 @@ int btrfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
6401 | unsigned long zero_start; | 6401 | unsigned long zero_start; |
6402 | loff_t size; | 6402 | loff_t size; |
6403 | int ret; | 6403 | int ret; |
6404 | int reserved = 0; | ||
6404 | u64 page_start; | 6405 | u64 page_start; |
6405 | u64 page_end; | 6406 | u64 page_end; |
6406 | 6407 | ||
6407 | ret = btrfs_delalloc_reserve_space(inode, PAGE_CACHE_SIZE); | 6408 | ret = btrfs_delalloc_reserve_space(inode, PAGE_CACHE_SIZE); |
6408 | if (!ret) | 6409 | if (!ret) { |
6409 | ret = btrfs_update_time(vma->vm_file); | 6410 | ret = btrfs_update_time(vma->vm_file); |
6411 | reserved = 1; | ||
6412 | } | ||
6410 | if (ret) { | 6413 | if (ret) { |
6411 | if (ret == -ENOMEM) | 6414 | if (ret == -ENOMEM) |
6412 | ret = VM_FAULT_OOM; | 6415 | ret = VM_FAULT_OOM; |
6413 | else /* -ENOSPC, -EIO, etc */ | 6416 | else /* -ENOSPC, -EIO, etc */ |
6414 | ret = VM_FAULT_SIGBUS; | 6417 | ret = VM_FAULT_SIGBUS; |
6415 | goto out; | 6418 | if (reserved) |
6419 | goto out; | ||
6420 | goto out_noreserve; | ||
6416 | } | 6421 | } |
6417 | 6422 | ||
6418 | ret = VM_FAULT_NOPAGE; /* make the VM retry the fault */ | 6423 | ret = VM_FAULT_NOPAGE; /* make the VM retry the fault */ |
@@ -6495,6 +6500,7 @@ out_unlock: | |||
6495 | unlock_page(page); | 6500 | unlock_page(page); |
6496 | out: | 6501 | out: |
6497 | btrfs_delalloc_release_space(inode, PAGE_CACHE_SIZE); | 6502 | btrfs_delalloc_release_space(inode, PAGE_CACHE_SIZE); |
6503 | out_noreserve: | ||
6498 | return ret; | 6504 | return ret; |
6499 | } | 6505 | } |
6500 | 6506 | ||
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index ab620014bcc3..03bb62a9ee24 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c | |||
@@ -1065,7 +1065,7 @@ int btrfs_defrag_file(struct inode *inode, struct file *file, | |||
1065 | i = range->start >> PAGE_CACHE_SHIFT; | 1065 | i = range->start >> PAGE_CACHE_SHIFT; |
1066 | } | 1066 | } |
1067 | if (!max_to_defrag) | 1067 | if (!max_to_defrag) |
1068 | max_to_defrag = last_index; | 1068 | max_to_defrag = last_index + 1; |
1069 | 1069 | ||
1070 | /* | 1070 | /* |
1071 | * make writeback starts from i, so the defrag range can be | 1071 | * make writeback starts from i, so the defrag range can be |
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index cb877e0886a7..966cc74f5d6c 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c | |||
@@ -1957,7 +1957,8 @@ static int wait_log_commit(struct btrfs_trans_handle *trans, | |||
1957 | 1957 | ||
1958 | finish_wait(&root->log_commit_wait[index], &wait); | 1958 | finish_wait(&root->log_commit_wait[index], &wait); |
1959 | mutex_lock(&root->log_mutex); | 1959 | mutex_lock(&root->log_mutex); |
1960 | } while (root->log_transid < transid + 2 && | 1960 | } while (root->fs_info->last_trans_log_full_commit != |
1961 | trans->transid && root->log_transid < transid + 2 && | ||
1961 | atomic_read(&root->log_commit[index])); | 1962 | atomic_read(&root->log_commit[index])); |
1962 | return 0; | 1963 | return 0; |
1963 | } | 1964 | } |
@@ -1966,7 +1967,8 @@ static int wait_for_writer(struct btrfs_trans_handle *trans, | |||
1966 | struct btrfs_root *root) | 1967 | struct btrfs_root *root) |
1967 | { | 1968 | { |
1968 | DEFINE_WAIT(wait); | 1969 | DEFINE_WAIT(wait); |
1969 | while (atomic_read(&root->log_writers)) { | 1970 | while (root->fs_info->last_trans_log_full_commit != |
1971 | trans->transid && atomic_read(&root->log_writers)) { | ||
1970 | prepare_to_wait(&root->log_writer_wait, | 1972 | prepare_to_wait(&root->log_writer_wait, |
1971 | &wait, TASK_UNINTERRUPTIBLE); | 1973 | &wait, TASK_UNINTERRUPTIBLE); |
1972 | mutex_unlock(&root->log_mutex); | 1974 | mutex_unlock(&root->log_mutex); |
diff --git a/fs/cifs/Kconfig b/fs/cifs/Kconfig index f66cc1625150..0554b00a7b33 100644 --- a/fs/cifs/Kconfig +++ b/fs/cifs/Kconfig | |||
@@ -140,7 +140,6 @@ config CIFS_DFS_UPCALL | |||
140 | 140 | ||
141 | config CIFS_FSCACHE | 141 | config CIFS_FSCACHE |
142 | bool "Provide CIFS client caching support (EXPERIMENTAL)" | 142 | bool "Provide CIFS client caching support (EXPERIMENTAL)" |
143 | depends on EXPERIMENTAL | ||
144 | depends on CIFS=m && FSCACHE || CIFS=y && FSCACHE=y | 143 | depends on CIFS=m && FSCACHE || CIFS=y && FSCACHE=y |
145 | help | 144 | help |
146 | Makes CIFS FS-Cache capable. Say Y here if you want your CIFS data | 145 | Makes CIFS FS-Cache capable. Say Y here if you want your CIFS data |
@@ -149,7 +148,7 @@ config CIFS_FSCACHE | |||
149 | 148 | ||
150 | config CIFS_ACL | 149 | config CIFS_ACL |
151 | bool "Provide CIFS ACL support (EXPERIMENTAL)" | 150 | bool "Provide CIFS ACL support (EXPERIMENTAL)" |
152 | depends on EXPERIMENTAL && CIFS_XATTR && KEYS | 151 | depends on CIFS_XATTR && KEYS |
153 | help | 152 | help |
154 | Allows to fetch CIFS/NTFS ACL from the server. The DACL blob | 153 | Allows to fetch CIFS/NTFS ACL from the server. The DACL blob |
155 | is handed over to the application/caller. | 154 | is handed over to the application/caller. |
diff --git a/fs/cifs/cifs_debug.c b/fs/cifs/cifs_debug.c index 84e8c0724704..24b3dfc05282 100644 --- a/fs/cifs/cifs_debug.c +++ b/fs/cifs/cifs_debug.c | |||
@@ -676,14 +676,23 @@ static ssize_t cifs_multiuser_mount_proc_write(struct file *file, | |||
676 | { | 676 | { |
677 | char c; | 677 | char c; |
678 | int rc; | 678 | int rc; |
679 | static bool warned; | ||
679 | 680 | ||
680 | rc = get_user(c, buffer); | 681 | rc = get_user(c, buffer); |
681 | if (rc) | 682 | if (rc) |
682 | return rc; | 683 | return rc; |
683 | if (c == '0' || c == 'n' || c == 'N') | 684 | if (c == '0' || c == 'n' || c == 'N') |
684 | multiuser_mount = 0; | 685 | multiuser_mount = 0; |
685 | else if (c == '1' || c == 'y' || c == 'Y') | 686 | else if (c == '1' || c == 'y' || c == 'Y') { |
686 | multiuser_mount = 1; | 687 | multiuser_mount = 1; |
688 | if (!warned) { | ||
689 | warned = true; | ||
690 | printk(KERN_WARNING "CIFS VFS: The legacy multiuser " | ||
691 | "mount code is scheduled to be deprecated in " | ||
692 | "3.5. Please switch to using the multiuser " | ||
693 | "mount option."); | ||
694 | } | ||
695 | } | ||
687 | 696 | ||
688 | return count; | 697 | return count; |
689 | } | 698 | } |
diff --git a/fs/cifs/cifs_spnego.c b/fs/cifs/cifs_spnego.c index 2272fd5fe5b7..e622863b292f 100644 --- a/fs/cifs/cifs_spnego.c +++ b/fs/cifs/cifs_spnego.c | |||
@@ -113,9 +113,11 @@ cifs_get_spnego_key(struct cifs_ses *sesInfo) | |||
113 | MAX_MECH_STR_LEN + | 113 | MAX_MECH_STR_LEN + |
114 | UID_KEY_LEN + (sizeof(uid_t) * 2) + | 114 | UID_KEY_LEN + (sizeof(uid_t) * 2) + |
115 | CREDUID_KEY_LEN + (sizeof(uid_t) * 2) + | 115 | CREDUID_KEY_LEN + (sizeof(uid_t) * 2) + |
116 | USER_KEY_LEN + strlen(sesInfo->user_name) + | ||
117 | PID_KEY_LEN + (sizeof(pid_t) * 2) + 1; | 116 | PID_KEY_LEN + (sizeof(pid_t) * 2) + 1; |
118 | 117 | ||
118 | if (sesInfo->user_name) | ||
119 | desc_len += USER_KEY_LEN + strlen(sesInfo->user_name); | ||
120 | |||
119 | spnego_key = ERR_PTR(-ENOMEM); | 121 | spnego_key = ERR_PTR(-ENOMEM); |
120 | description = kzalloc(desc_len, GFP_KERNEL); | 122 | description = kzalloc(desc_len, GFP_KERNEL); |
121 | if (description == NULL) | 123 | if (description == NULL) |
@@ -152,8 +154,10 @@ cifs_get_spnego_key(struct cifs_ses *sesInfo) | |||
152 | dp = description + strlen(description); | 154 | dp = description + strlen(description); |
153 | sprintf(dp, ";creduid=0x%x", sesInfo->cred_uid); | 155 | sprintf(dp, ";creduid=0x%x", sesInfo->cred_uid); |
154 | 156 | ||
155 | dp = description + strlen(description); | 157 | if (sesInfo->user_name) { |
156 | sprintf(dp, ";user=%s", sesInfo->user_name); | 158 | dp = description + strlen(description); |
159 | sprintf(dp, ";user=%s", sesInfo->user_name); | ||
160 | } | ||
157 | 161 | ||
158 | dp = description + strlen(description); | 162 | dp = description + strlen(description); |
159 | sprintf(dp, ";pid=0x%x", current->pid); | 163 | sprintf(dp, ";pid=0x%x", current->pid); |
diff --git a/fs/cifs/cifs_unicode.c b/fs/cifs/cifs_unicode.c index 1b2e180b018d..fbb9da951843 100644 --- a/fs/cifs/cifs_unicode.c +++ b/fs/cifs/cifs_unicode.c | |||
@@ -27,17 +27,17 @@ | |||
27 | #include "cifs_debug.h" | 27 | #include "cifs_debug.h" |
28 | 28 | ||
29 | /* | 29 | /* |
30 | * cifs_ucs2_bytes - how long will a string be after conversion? | 30 | * cifs_utf16_bytes - how long will a string be after conversion? |
31 | * @ucs - pointer to input string | 31 | * @utf16 - pointer to input string |
32 | * @maxbytes - don't go past this many bytes of input string | 32 | * @maxbytes - don't go past this many bytes of input string |
33 | * @codepage - destination codepage | 33 | * @codepage - destination codepage |
34 | * | 34 | * |
35 | * Walk a ucs2le string and return the number of bytes that the string will | 35 | * Walk a utf16le string and return the number of bytes that the string will |
36 | * be after being converted to the given charset, not including any null | 36 | * be after being converted to the given charset, not including any null |
37 | * termination required. Don't walk past maxbytes in the source buffer. | 37 | * termination required. Don't walk past maxbytes in the source buffer. |
38 | */ | 38 | */ |
39 | int | 39 | int |
40 | cifs_ucs2_bytes(const __le16 *from, int maxbytes, | 40 | cifs_utf16_bytes(const __le16 *from, int maxbytes, |
41 | const struct nls_table *codepage) | 41 | const struct nls_table *codepage) |
42 | { | 42 | { |
43 | int i; | 43 | int i; |
@@ -122,7 +122,7 @@ cp_convert: | |||
122 | } | 122 | } |
123 | 123 | ||
124 | /* | 124 | /* |
125 | * cifs_from_ucs2 - convert utf16le string to local charset | 125 | * cifs_from_utf16 - convert utf16le string to local charset |
126 | * @to - destination buffer | 126 | * @to - destination buffer |
127 | * @from - source buffer | 127 | * @from - source buffer |
128 | * @tolen - destination buffer size (in bytes) | 128 | * @tolen - destination buffer size (in bytes) |
@@ -130,7 +130,7 @@ cp_convert: | |||
130 | * @codepage - codepage to which characters should be converted | 130 | * @codepage - codepage to which characters should be converted |
131 | * @mapchar - should characters be remapped according to the mapchars option? | 131 | * @mapchar - should characters be remapped according to the mapchars option? |
132 | * | 132 | * |
133 | * Convert a little-endian ucs2le string (as sent by the server) to a string | 133 | * Convert a little-endian utf16le string (as sent by the server) to a string |
134 | * in the provided codepage. The tolen and fromlen parameters are to ensure | 134 | * in the provided codepage. The tolen and fromlen parameters are to ensure |
135 | * that the code doesn't walk off of the end of the buffer (which is always | 135 | * that the code doesn't walk off of the end of the buffer (which is always |
136 | * a danger if the alignment of the source buffer is off). The destination | 136 | * a danger if the alignment of the source buffer is off). The destination |
@@ -139,12 +139,12 @@ cp_convert: | |||
139 | * null terminator). | 139 | * null terminator). |
140 | * | 140 | * |
141 | * Note that some windows versions actually send multiword UTF-16 characters | 141 | * Note that some windows versions actually send multiword UTF-16 characters |
142 | * instead of straight UCS-2. The linux nls routines however aren't able to | 142 | * instead of straight UTF16-2. The linux nls routines however aren't able to |
143 | * deal with those characters properly. In the event that we get some of | 143 | * deal with those characters properly. In the event that we get some of |
144 | * those characters, they won't be translated properly. | 144 | * those characters, they won't be translated properly. |
145 | */ | 145 | */ |
146 | int | 146 | int |
147 | cifs_from_ucs2(char *to, const __le16 *from, int tolen, int fromlen, | 147 | cifs_from_utf16(char *to, const __le16 *from, int tolen, int fromlen, |
148 | const struct nls_table *codepage, bool mapchar) | 148 | const struct nls_table *codepage, bool mapchar) |
149 | { | 149 | { |
150 | int i, charlen, safelen; | 150 | int i, charlen, safelen; |
@@ -190,13 +190,13 @@ cifs_from_ucs2(char *to, const __le16 *from, int tolen, int fromlen, | |||
190 | } | 190 | } |
191 | 191 | ||
192 | /* | 192 | /* |
193 | * NAME: cifs_strtoUCS() | 193 | * NAME: cifs_strtoUTF16() |
194 | * | 194 | * |
195 | * FUNCTION: Convert character string to unicode string | 195 | * FUNCTION: Convert character string to unicode string |
196 | * | 196 | * |
197 | */ | 197 | */ |
198 | int | 198 | int |
199 | cifs_strtoUCS(__le16 *to, const char *from, int len, | 199 | cifs_strtoUTF16(__le16 *to, const char *from, int len, |
200 | const struct nls_table *codepage) | 200 | const struct nls_table *codepage) |
201 | { | 201 | { |
202 | int charlen; | 202 | int charlen; |
@@ -206,7 +206,7 @@ cifs_strtoUCS(__le16 *to, const char *from, int len, | |||
206 | for (i = 0; len && *from; i++, from += charlen, len -= charlen) { | 206 | for (i = 0; len && *from; i++, from += charlen, len -= charlen) { |
207 | charlen = codepage->char2uni(from, len, &wchar_to); | 207 | charlen = codepage->char2uni(from, len, &wchar_to); |
208 | if (charlen < 1) { | 208 | if (charlen < 1) { |
209 | cERROR(1, "strtoUCS: char2uni of 0x%x returned %d", | 209 | cERROR(1, "strtoUTF16: char2uni of 0x%x returned %d", |
210 | *from, charlen); | 210 | *from, charlen); |
211 | /* A question mark */ | 211 | /* A question mark */ |
212 | wchar_to = 0x003f; | 212 | wchar_to = 0x003f; |
@@ -220,7 +220,8 @@ cifs_strtoUCS(__le16 *to, const char *from, int len, | |||
220 | } | 220 | } |
221 | 221 | ||
222 | /* | 222 | /* |
223 | * cifs_strndup_from_ucs - copy a string from wire format to the local codepage | 223 | * cifs_strndup_from_utf16 - copy a string from wire format to the local |
224 | * codepage | ||
224 | * @src - source string | 225 | * @src - source string |
225 | * @maxlen - don't walk past this many bytes in the source string | 226 | * @maxlen - don't walk past this many bytes in the source string |
226 | * @is_unicode - is this a unicode string? | 227 | * @is_unicode - is this a unicode string? |
@@ -231,19 +232,19 @@ cifs_strtoUCS(__le16 *to, const char *from, int len, | |||
231 | * error. | 232 | * error. |
232 | */ | 233 | */ |
233 | char * | 234 | char * |
234 | cifs_strndup_from_ucs(const char *src, const int maxlen, const bool is_unicode, | 235 | cifs_strndup_from_utf16(const char *src, const int maxlen, |
235 | const struct nls_table *codepage) | 236 | const bool is_unicode, const struct nls_table *codepage) |
236 | { | 237 | { |
237 | int len; | 238 | int len; |
238 | char *dst; | 239 | char *dst; |
239 | 240 | ||
240 | if (is_unicode) { | 241 | if (is_unicode) { |
241 | len = cifs_ucs2_bytes((__le16 *) src, maxlen, codepage); | 242 | len = cifs_utf16_bytes((__le16 *) src, maxlen, codepage); |
242 | len += nls_nullsize(codepage); | 243 | len += nls_nullsize(codepage); |
243 | dst = kmalloc(len, GFP_KERNEL); | 244 | dst = kmalloc(len, GFP_KERNEL); |
244 | if (!dst) | 245 | if (!dst) |
245 | return NULL; | 246 | return NULL; |
246 | cifs_from_ucs2(dst, (__le16 *) src, len, maxlen, codepage, | 247 | cifs_from_utf16(dst, (__le16 *) src, len, maxlen, codepage, |
247 | false); | 248 | false); |
248 | } else { | 249 | } else { |
249 | len = strnlen(src, maxlen); | 250 | len = strnlen(src, maxlen); |
@@ -264,7 +265,7 @@ cifs_strndup_from_ucs(const char *src, const int maxlen, const bool is_unicode, | |||
264 | * names are little endian 16 bit Unicode on the wire | 265 | * names are little endian 16 bit Unicode on the wire |
265 | */ | 266 | */ |
266 | int | 267 | int |
267 | cifsConvertToUCS(__le16 *target, const char *source, int srclen, | 268 | cifsConvertToUTF16(__le16 *target, const char *source, int srclen, |
268 | const struct nls_table *cp, int mapChars) | 269 | const struct nls_table *cp, int mapChars) |
269 | { | 270 | { |
270 | int i, j, charlen; | 271 | int i, j, charlen; |
@@ -273,7 +274,7 @@ cifsConvertToUCS(__le16 *target, const char *source, int srclen, | |||
273 | wchar_t tmp; | 274 | wchar_t tmp; |
274 | 275 | ||
275 | if (!mapChars) | 276 | if (!mapChars) |
276 | return cifs_strtoUCS(target, source, PATH_MAX, cp); | 277 | return cifs_strtoUTF16(target, source, PATH_MAX, cp); |
277 | 278 | ||
278 | for (i = 0, j = 0; i < srclen; j++) { | 279 | for (i = 0, j = 0; i < srclen; j++) { |
279 | src_char = source[i]; | 280 | src_char = source[i]; |
@@ -281,7 +282,7 @@ cifsConvertToUCS(__le16 *target, const char *source, int srclen, | |||
281 | switch (src_char) { | 282 | switch (src_char) { |
282 | case 0: | 283 | case 0: |
283 | put_unaligned(0, &target[j]); | 284 | put_unaligned(0, &target[j]); |
284 | goto ctoUCS_out; | 285 | goto ctoUTF16_out; |
285 | case ':': | 286 | case ':': |
286 | dst_char = cpu_to_le16(UNI_COLON); | 287 | dst_char = cpu_to_le16(UNI_COLON); |
287 | break; | 288 | break; |
@@ -326,7 +327,7 @@ cifsConvertToUCS(__le16 *target, const char *source, int srclen, | |||
326 | put_unaligned(dst_char, &target[j]); | 327 | put_unaligned(dst_char, &target[j]); |
327 | } | 328 | } |
328 | 329 | ||
329 | ctoUCS_out: | 330 | ctoUTF16_out: |
330 | return i; | 331 | return i; |
331 | } | 332 | } |
332 | 333 | ||
diff --git a/fs/cifs/cifs_unicode.h b/fs/cifs/cifs_unicode.h index 6d02fd560566..a513a546700b 100644 --- a/fs/cifs/cifs_unicode.h +++ b/fs/cifs/cifs_unicode.h | |||
@@ -74,16 +74,16 @@ extern const struct UniCaseRange CifsUniLowerRange[]; | |||
74 | #endif /* UNIUPR_NOLOWER */ | 74 | #endif /* UNIUPR_NOLOWER */ |
75 | 75 | ||
76 | #ifdef __KERNEL__ | 76 | #ifdef __KERNEL__ |
77 | int cifs_from_ucs2(char *to, const __le16 *from, int tolen, int fromlen, | 77 | int cifs_from_utf16(char *to, const __le16 *from, int tolen, int fromlen, |
78 | const struct nls_table *codepage, bool mapchar); | 78 | const struct nls_table *codepage, bool mapchar); |
79 | int cifs_ucs2_bytes(const __le16 *from, int maxbytes, | 79 | int cifs_utf16_bytes(const __le16 *from, int maxbytes, |
80 | const struct nls_table *codepage); | 80 | const struct nls_table *codepage); |
81 | int cifs_strtoUCS(__le16 *, const char *, int, const struct nls_table *); | 81 | int cifs_strtoUTF16(__le16 *, const char *, int, const struct nls_table *); |
82 | char *cifs_strndup_from_ucs(const char *src, const int maxlen, | 82 | char *cifs_strndup_from_utf16(const char *src, const int maxlen, |
83 | const bool is_unicode, | 83 | const bool is_unicode, |
84 | const struct nls_table *codepage); | 84 | const struct nls_table *codepage); |
85 | extern int cifsConvertToUCS(__le16 *target, const char *source, int maxlen, | 85 | extern int cifsConvertToUTF16(__le16 *target, const char *source, int maxlen, |
86 | const struct nls_table *cp, int mapChars); | 86 | const struct nls_table *cp, int mapChars); |
87 | 87 | ||
88 | #endif | 88 | #endif |
89 | 89 | ||
diff --git a/fs/cifs/cifsacl.c b/fs/cifs/cifsacl.c index 72ddf23ef6f7..c1b254487388 100644 --- a/fs/cifs/cifsacl.c +++ b/fs/cifs/cifsacl.c | |||
@@ -909,6 +909,8 @@ static void parse_dacl(struct cifs_acl *pdacl, char *end_of_acl, | |||
909 | umode_t group_mask = S_IRWXG; | 909 | umode_t group_mask = S_IRWXG; |
910 | umode_t other_mask = S_IRWXU | S_IRWXG | S_IRWXO; | 910 | umode_t other_mask = S_IRWXU | S_IRWXG | S_IRWXO; |
911 | 911 | ||
912 | if (num_aces > ULONG_MAX / sizeof(struct cifs_ace *)) | ||
913 | return; | ||
912 | ppace = kmalloc(num_aces * sizeof(struct cifs_ace *), | 914 | ppace = kmalloc(num_aces * sizeof(struct cifs_ace *), |
913 | GFP_KERNEL); | 915 | GFP_KERNEL); |
914 | if (!ppace) { | 916 | if (!ppace) { |
diff --git a/fs/cifs/cifsencrypt.c b/fs/cifs/cifsencrypt.c index 5d9b9acc5fce..63c460e503b6 100644 --- a/fs/cifs/cifsencrypt.c +++ b/fs/cifs/cifsencrypt.c | |||
@@ -327,7 +327,7 @@ build_avpair_blob(struct cifs_ses *ses, const struct nls_table *nls_cp) | |||
327 | attrptr->type = cpu_to_le16(NTLMSSP_AV_NB_DOMAIN_NAME); | 327 | attrptr->type = cpu_to_le16(NTLMSSP_AV_NB_DOMAIN_NAME); |
328 | attrptr->length = cpu_to_le16(2 * dlen); | 328 | attrptr->length = cpu_to_le16(2 * dlen); |
329 | blobptr = (unsigned char *)attrptr + sizeof(struct ntlmssp2_name); | 329 | blobptr = (unsigned char *)attrptr + sizeof(struct ntlmssp2_name); |
330 | cifs_strtoUCS((__le16 *)blobptr, ses->domainName, dlen, nls_cp); | 330 | cifs_strtoUTF16((__le16 *)blobptr, ses->domainName, dlen, nls_cp); |
331 | 331 | ||
332 | return 0; | 332 | return 0; |
333 | } | 333 | } |
@@ -376,7 +376,7 @@ find_domain_name(struct cifs_ses *ses, const struct nls_table *nls_cp) | |||
376 | kmalloc(attrsize + 1, GFP_KERNEL); | 376 | kmalloc(attrsize + 1, GFP_KERNEL); |
377 | if (!ses->domainName) | 377 | if (!ses->domainName) |
378 | return -ENOMEM; | 378 | return -ENOMEM; |
379 | cifs_from_ucs2(ses->domainName, | 379 | cifs_from_utf16(ses->domainName, |
380 | (__le16 *)blobptr, attrsize, attrsize, | 380 | (__le16 *)blobptr, attrsize, attrsize, |
381 | nls_cp, false); | 381 | nls_cp, false); |
382 | break; | 382 | break; |
@@ -420,15 +420,20 @@ static int calc_ntlmv2_hash(struct cifs_ses *ses, char *ntlmv2_hash, | |||
420 | } | 420 | } |
421 | 421 | ||
422 | /* convert ses->user_name to unicode and uppercase */ | 422 | /* convert ses->user_name to unicode and uppercase */ |
423 | len = strlen(ses->user_name); | 423 | len = ses->user_name ? strlen(ses->user_name) : 0; |
424 | user = kmalloc(2 + (len * 2), GFP_KERNEL); | 424 | user = kmalloc(2 + (len * 2), GFP_KERNEL); |
425 | if (user == NULL) { | 425 | if (user == NULL) { |
426 | cERROR(1, "calc_ntlmv2_hash: user mem alloc failure\n"); | 426 | cERROR(1, "calc_ntlmv2_hash: user mem alloc failure\n"); |
427 | rc = -ENOMEM; | 427 | rc = -ENOMEM; |
428 | return rc; | 428 | return rc; |
429 | } | 429 | } |
430 | len = cifs_strtoUCS((__le16 *)user, ses->user_name, len, nls_cp); | 430 | |
431 | UniStrupr(user); | 431 | if (len) { |
432 | len = cifs_strtoUTF16((__le16 *)user, ses->user_name, len, nls_cp); | ||
433 | UniStrupr(user); | ||
434 | } else { | ||
435 | memset(user, '\0', 2); | ||
436 | } | ||
432 | 437 | ||
433 | rc = crypto_shash_update(&ses->server->secmech.sdeschmacmd5->shash, | 438 | rc = crypto_shash_update(&ses->server->secmech.sdeschmacmd5->shash, |
434 | (char *)user, 2 * len); | 439 | (char *)user, 2 * len); |
@@ -448,8 +453,8 @@ static int calc_ntlmv2_hash(struct cifs_ses *ses, char *ntlmv2_hash, | |||
448 | rc = -ENOMEM; | 453 | rc = -ENOMEM; |
449 | return rc; | 454 | return rc; |
450 | } | 455 | } |
451 | len = cifs_strtoUCS((__le16 *)domain, ses->domainName, len, | 456 | len = cifs_strtoUTF16((__le16 *)domain, ses->domainName, len, |
452 | nls_cp); | 457 | nls_cp); |
453 | rc = | 458 | rc = |
454 | crypto_shash_update(&ses->server->secmech.sdeschmacmd5->shash, | 459 | crypto_shash_update(&ses->server->secmech.sdeschmacmd5->shash, |
455 | (char *)domain, 2 * len); | 460 | (char *)domain, 2 * len); |
@@ -468,7 +473,7 @@ static int calc_ntlmv2_hash(struct cifs_ses *ses, char *ntlmv2_hash, | |||
468 | rc = -ENOMEM; | 473 | rc = -ENOMEM; |
469 | return rc; | 474 | return rc; |
470 | } | 475 | } |
471 | len = cifs_strtoUCS((__le16 *)server, ses->serverName, len, | 476 | len = cifs_strtoUTF16((__le16 *)server, ses->serverName, len, |
472 | nls_cp); | 477 | nls_cp); |
473 | rc = | 478 | rc = |
474 | crypto_shash_update(&ses->server->secmech.sdeschmacmd5->shash, | 479 | crypto_shash_update(&ses->server->secmech.sdeschmacmd5->shash, |
diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h index ba53c1c6c6cc..76e7d8b6da17 100644 --- a/fs/cifs/cifsglob.h +++ b/fs/cifs/cifsglob.h | |||
@@ -879,6 +879,8 @@ require use of the stronger protocol */ | |||
879 | #define CIFSSEC_MASK 0xB70B7 /* current flags supported if weak */ | 879 | #define CIFSSEC_MASK 0xB70B7 /* current flags supported if weak */ |
880 | #endif /* UPCALL */ | 880 | #endif /* UPCALL */ |
881 | #else /* do not allow weak pw hash */ | 881 | #else /* do not allow weak pw hash */ |
882 | #define CIFSSEC_MUST_LANMAN 0 | ||
883 | #define CIFSSEC_MUST_PLNTXT 0 | ||
882 | #ifdef CONFIG_CIFS_UPCALL | 884 | #ifdef CONFIG_CIFS_UPCALL |
883 | #define CIFSSEC_MASK 0x8F08F /* flags supported if no weak allowed */ | 885 | #define CIFSSEC_MASK 0x8F08F /* flags supported if no weak allowed */ |
884 | #else | 886 | #else |
diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c index 6600aa2d2ef3..8b7794c31591 100644 --- a/fs/cifs/cifssmb.c +++ b/fs/cifs/cifssmb.c | |||
@@ -821,8 +821,8 @@ PsxDelete: | |||
821 | 821 | ||
822 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 822 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
823 | name_len = | 823 | name_len = |
824 | cifsConvertToUCS((__le16 *) pSMB->FileName, fileName, | 824 | cifsConvertToUTF16((__le16 *) pSMB->FileName, fileName, |
825 | PATH_MAX, nls_codepage, remap); | 825 | PATH_MAX, nls_codepage, remap); |
826 | name_len++; /* trailing null */ | 826 | name_len++; /* trailing null */ |
827 | name_len *= 2; | 827 | name_len *= 2; |
828 | } else { /* BB add path length overrun check */ | 828 | } else { /* BB add path length overrun check */ |
@@ -893,8 +893,8 @@ DelFileRetry: | |||
893 | 893 | ||
894 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 894 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
895 | name_len = | 895 | name_len = |
896 | cifsConvertToUCS((__le16 *) pSMB->fileName, fileName, | 896 | cifsConvertToUTF16((__le16 *) pSMB->fileName, fileName, |
897 | PATH_MAX, nls_codepage, remap); | 897 | PATH_MAX, nls_codepage, remap); |
898 | name_len++; /* trailing null */ | 898 | name_len++; /* trailing null */ |
899 | name_len *= 2; | 899 | name_len *= 2; |
900 | } else { /* BB improve check for buffer overruns BB */ | 900 | } else { /* BB improve check for buffer overruns BB */ |
@@ -938,8 +938,8 @@ RmDirRetry: | |||
938 | return rc; | 938 | return rc; |
939 | 939 | ||
940 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 940 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
941 | name_len = cifsConvertToUCS((__le16 *) pSMB->DirName, dirName, | 941 | name_len = cifsConvertToUTF16((__le16 *) pSMB->DirName, dirName, |
942 | PATH_MAX, nls_codepage, remap); | 942 | PATH_MAX, nls_codepage, remap); |
943 | name_len++; /* trailing null */ | 943 | name_len++; /* trailing null */ |
944 | name_len *= 2; | 944 | name_len *= 2; |
945 | } else { /* BB improve check for buffer overruns BB */ | 945 | } else { /* BB improve check for buffer overruns BB */ |
@@ -981,8 +981,8 @@ MkDirRetry: | |||
981 | return rc; | 981 | return rc; |
982 | 982 | ||
983 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 983 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
984 | name_len = cifsConvertToUCS((__le16 *) pSMB->DirName, name, | 984 | name_len = cifsConvertToUTF16((__le16 *) pSMB->DirName, name, |
985 | PATH_MAX, nls_codepage, remap); | 985 | PATH_MAX, nls_codepage, remap); |
986 | name_len++; /* trailing null */ | 986 | name_len++; /* trailing null */ |
987 | name_len *= 2; | 987 | name_len *= 2; |
988 | } else { /* BB improve check for buffer overruns BB */ | 988 | } else { /* BB improve check for buffer overruns BB */ |
@@ -1030,8 +1030,8 @@ PsxCreat: | |||
1030 | 1030 | ||
1031 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 1031 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
1032 | name_len = | 1032 | name_len = |
1033 | cifsConvertToUCS((__le16 *) pSMB->FileName, name, | 1033 | cifsConvertToUTF16((__le16 *) pSMB->FileName, name, |
1034 | PATH_MAX, nls_codepage, remap); | 1034 | PATH_MAX, nls_codepage, remap); |
1035 | name_len++; /* trailing null */ | 1035 | name_len++; /* trailing null */ |
1036 | name_len *= 2; | 1036 | name_len *= 2; |
1037 | } else { /* BB improve the check for buffer overruns BB */ | 1037 | } else { /* BB improve the check for buffer overruns BB */ |
@@ -1197,8 +1197,8 @@ OldOpenRetry: | |||
1197 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 1197 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
1198 | count = 1; /* account for one byte pad to word boundary */ | 1198 | count = 1; /* account for one byte pad to word boundary */ |
1199 | name_len = | 1199 | name_len = |
1200 | cifsConvertToUCS((__le16 *) (pSMB->fileName + 1), | 1200 | cifsConvertToUTF16((__le16 *) (pSMB->fileName + 1), |
1201 | fileName, PATH_MAX, nls_codepage, remap); | 1201 | fileName, PATH_MAX, nls_codepage, remap); |
1202 | name_len++; /* trailing null */ | 1202 | name_len++; /* trailing null */ |
1203 | name_len *= 2; | 1203 | name_len *= 2; |
1204 | } else { /* BB improve check for buffer overruns BB */ | 1204 | } else { /* BB improve check for buffer overruns BB */ |
@@ -1304,8 +1304,8 @@ openRetry: | |||
1304 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 1304 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
1305 | count = 1; /* account for one byte pad to word boundary */ | 1305 | count = 1; /* account for one byte pad to word boundary */ |
1306 | name_len = | 1306 | name_len = |
1307 | cifsConvertToUCS((__le16 *) (pSMB->fileName + 1), | 1307 | cifsConvertToUTF16((__le16 *) (pSMB->fileName + 1), |
1308 | fileName, PATH_MAX, nls_codepage, remap); | 1308 | fileName, PATH_MAX, nls_codepage, remap); |
1309 | name_len++; /* trailing null */ | 1309 | name_len++; /* trailing null */ |
1310 | name_len *= 2; | 1310 | name_len *= 2; |
1311 | pSMB->NameLength = cpu_to_le16(name_len); | 1311 | pSMB->NameLength = cpu_to_le16(name_len); |
@@ -2649,16 +2649,16 @@ renameRetry: | |||
2649 | 2649 | ||
2650 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 2650 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
2651 | name_len = | 2651 | name_len = |
2652 | cifsConvertToUCS((__le16 *) pSMB->OldFileName, fromName, | 2652 | cifsConvertToUTF16((__le16 *) pSMB->OldFileName, fromName, |
2653 | PATH_MAX, nls_codepage, remap); | 2653 | PATH_MAX, nls_codepage, remap); |
2654 | name_len++; /* trailing null */ | 2654 | name_len++; /* trailing null */ |
2655 | name_len *= 2; | 2655 | name_len *= 2; |
2656 | pSMB->OldFileName[name_len] = 0x04; /* pad */ | 2656 | pSMB->OldFileName[name_len] = 0x04; /* pad */ |
2657 | /* protocol requires ASCII signature byte on Unicode string */ | 2657 | /* protocol requires ASCII signature byte on Unicode string */ |
2658 | pSMB->OldFileName[name_len + 1] = 0x00; | 2658 | pSMB->OldFileName[name_len + 1] = 0x00; |
2659 | name_len2 = | 2659 | name_len2 = |
2660 | cifsConvertToUCS((__le16 *)&pSMB->OldFileName[name_len + 2], | 2660 | cifsConvertToUTF16((__le16 *)&pSMB->OldFileName[name_len+2], |
2661 | toName, PATH_MAX, nls_codepage, remap); | 2661 | toName, PATH_MAX, nls_codepage, remap); |
2662 | name_len2 += 1 /* trailing null */ + 1 /* Signature word */ ; | 2662 | name_len2 += 1 /* trailing null */ + 1 /* Signature word */ ; |
2663 | name_len2 *= 2; /* convert to bytes */ | 2663 | name_len2 *= 2; /* convert to bytes */ |
2664 | } else { /* BB improve the check for buffer overruns BB */ | 2664 | } else { /* BB improve the check for buffer overruns BB */ |
@@ -2738,10 +2738,12 @@ int CIFSSMBRenameOpenFile(const int xid, struct cifs_tcon *pTcon, | |||
2738 | /* unicode only call */ | 2738 | /* unicode only call */ |
2739 | if (target_name == NULL) { | 2739 | if (target_name == NULL) { |
2740 | sprintf(dummy_string, "cifs%x", pSMB->hdr.Mid); | 2740 | sprintf(dummy_string, "cifs%x", pSMB->hdr.Mid); |
2741 | len_of_str = cifsConvertToUCS((__le16 *)rename_info->target_name, | 2741 | len_of_str = |
2742 | cifsConvertToUTF16((__le16 *)rename_info->target_name, | ||
2742 | dummy_string, 24, nls_codepage, remap); | 2743 | dummy_string, 24, nls_codepage, remap); |
2743 | } else { | 2744 | } else { |
2744 | len_of_str = cifsConvertToUCS((__le16 *)rename_info->target_name, | 2745 | len_of_str = |
2746 | cifsConvertToUTF16((__le16 *)rename_info->target_name, | ||
2745 | target_name, PATH_MAX, nls_codepage, | 2747 | target_name, PATH_MAX, nls_codepage, |
2746 | remap); | 2748 | remap); |
2747 | } | 2749 | } |
@@ -2795,17 +2797,17 @@ copyRetry: | |||
2795 | pSMB->Flags = cpu_to_le16(flags & COPY_TREE); | 2797 | pSMB->Flags = cpu_to_le16(flags & COPY_TREE); |
2796 | 2798 | ||
2797 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 2799 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
2798 | name_len = cifsConvertToUCS((__le16 *) pSMB->OldFileName, | 2800 | name_len = cifsConvertToUTF16((__le16 *) pSMB->OldFileName, |
2799 | fromName, PATH_MAX, nls_codepage, | 2801 | fromName, PATH_MAX, nls_codepage, |
2800 | remap); | 2802 | remap); |
2801 | name_len++; /* trailing null */ | 2803 | name_len++; /* trailing null */ |
2802 | name_len *= 2; | 2804 | name_len *= 2; |
2803 | pSMB->OldFileName[name_len] = 0x04; /* pad */ | 2805 | pSMB->OldFileName[name_len] = 0x04; /* pad */ |
2804 | /* protocol requires ASCII signature byte on Unicode string */ | 2806 | /* protocol requires ASCII signature byte on Unicode string */ |
2805 | pSMB->OldFileName[name_len + 1] = 0x00; | 2807 | pSMB->OldFileName[name_len + 1] = 0x00; |
2806 | name_len2 = | 2808 | name_len2 = |
2807 | cifsConvertToUCS((__le16 *)&pSMB->OldFileName[name_len + 2], | 2809 | cifsConvertToUTF16((__le16 *)&pSMB->OldFileName[name_len+2], |
2808 | toName, PATH_MAX, nls_codepage, remap); | 2810 | toName, PATH_MAX, nls_codepage, remap); |
2809 | name_len2 += 1 /* trailing null */ + 1 /* Signature word */ ; | 2811 | name_len2 += 1 /* trailing null */ + 1 /* Signature word */ ; |
2810 | name_len2 *= 2; /* convert to bytes */ | 2812 | name_len2 *= 2; /* convert to bytes */ |
2811 | } else { /* BB improve the check for buffer overruns BB */ | 2813 | } else { /* BB improve the check for buffer overruns BB */ |
@@ -2861,9 +2863,9 @@ createSymLinkRetry: | |||
2861 | 2863 | ||
2862 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 2864 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
2863 | name_len = | 2865 | name_len = |
2864 | cifs_strtoUCS((__le16 *) pSMB->FileName, fromName, PATH_MAX | 2866 | cifs_strtoUTF16((__le16 *) pSMB->FileName, fromName, |
2865 | /* find define for this maxpathcomponent */ | 2867 | /* find define for this maxpathcomponent */ |
2866 | , nls_codepage); | 2868 | PATH_MAX, nls_codepage); |
2867 | name_len++; /* trailing null */ | 2869 | name_len++; /* trailing null */ |
2868 | name_len *= 2; | 2870 | name_len *= 2; |
2869 | 2871 | ||
@@ -2885,9 +2887,9 @@ createSymLinkRetry: | |||
2885 | data_offset = (char *) (&pSMB->hdr.Protocol) + offset; | 2887 | data_offset = (char *) (&pSMB->hdr.Protocol) + offset; |
2886 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 2888 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
2887 | name_len_target = | 2889 | name_len_target = |
2888 | cifs_strtoUCS((__le16 *) data_offset, toName, PATH_MAX | 2890 | cifs_strtoUTF16((__le16 *) data_offset, toName, PATH_MAX |
2889 | /* find define for this maxpathcomponent */ | 2891 | /* find define for this maxpathcomponent */ |
2890 | , nls_codepage); | 2892 | , nls_codepage); |
2891 | name_len_target++; /* trailing null */ | 2893 | name_len_target++; /* trailing null */ |
2892 | name_len_target *= 2; | 2894 | name_len_target *= 2; |
2893 | } else { /* BB improve the check for buffer overruns BB */ | 2895 | } else { /* BB improve the check for buffer overruns BB */ |
@@ -2949,8 +2951,8 @@ createHardLinkRetry: | |||
2949 | return rc; | 2951 | return rc; |
2950 | 2952 | ||
2951 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 2953 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
2952 | name_len = cifsConvertToUCS((__le16 *) pSMB->FileName, toName, | 2954 | name_len = cifsConvertToUTF16((__le16 *) pSMB->FileName, toName, |
2953 | PATH_MAX, nls_codepage, remap); | 2955 | PATH_MAX, nls_codepage, remap); |
2954 | name_len++; /* trailing null */ | 2956 | name_len++; /* trailing null */ |
2955 | name_len *= 2; | 2957 | name_len *= 2; |
2956 | 2958 | ||
@@ -2972,8 +2974,8 @@ createHardLinkRetry: | |||
2972 | data_offset = (char *) (&pSMB->hdr.Protocol) + offset; | 2974 | data_offset = (char *) (&pSMB->hdr.Protocol) + offset; |
2973 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 2975 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
2974 | name_len_target = | 2976 | name_len_target = |
2975 | cifsConvertToUCS((__le16 *) data_offset, fromName, PATH_MAX, | 2977 | cifsConvertToUTF16((__le16 *) data_offset, fromName, |
2976 | nls_codepage, remap); | 2978 | PATH_MAX, nls_codepage, remap); |
2977 | name_len_target++; /* trailing null */ | 2979 | name_len_target++; /* trailing null */ |
2978 | name_len_target *= 2; | 2980 | name_len_target *= 2; |
2979 | } else { /* BB improve the check for buffer overruns BB */ | 2981 | } else { /* BB improve the check for buffer overruns BB */ |
@@ -3042,8 +3044,8 @@ winCreateHardLinkRetry: | |||
3042 | 3044 | ||
3043 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 3045 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
3044 | name_len = | 3046 | name_len = |
3045 | cifsConvertToUCS((__le16 *) pSMB->OldFileName, fromName, | 3047 | cifsConvertToUTF16((__le16 *) pSMB->OldFileName, fromName, |
3046 | PATH_MAX, nls_codepage, remap); | 3048 | PATH_MAX, nls_codepage, remap); |
3047 | name_len++; /* trailing null */ | 3049 | name_len++; /* trailing null */ |
3048 | name_len *= 2; | 3050 | name_len *= 2; |
3049 | 3051 | ||
@@ -3051,8 +3053,8 @@ winCreateHardLinkRetry: | |||
3051 | pSMB->OldFileName[name_len] = 0x04; | 3053 | pSMB->OldFileName[name_len] = 0x04; |
3052 | pSMB->OldFileName[name_len + 1] = 0x00; /* pad */ | 3054 | pSMB->OldFileName[name_len + 1] = 0x00; /* pad */ |
3053 | name_len2 = | 3055 | name_len2 = |
3054 | cifsConvertToUCS((__le16 *)&pSMB->OldFileName[name_len + 2], | 3056 | cifsConvertToUTF16((__le16 *)&pSMB->OldFileName[name_len+2], |
3055 | toName, PATH_MAX, nls_codepage, remap); | 3057 | toName, PATH_MAX, nls_codepage, remap); |
3056 | name_len2 += 1 /* trailing null */ + 1 /* Signature word */ ; | 3058 | name_len2 += 1 /* trailing null */ + 1 /* Signature word */ ; |
3057 | name_len2 *= 2; /* convert to bytes */ | 3059 | name_len2 *= 2; /* convert to bytes */ |
3058 | } else { /* BB improve the check for buffer overruns BB */ | 3060 | } else { /* BB improve the check for buffer overruns BB */ |
@@ -3108,8 +3110,8 @@ querySymLinkRetry: | |||
3108 | 3110 | ||
3109 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 3111 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
3110 | name_len = | 3112 | name_len = |
3111 | cifs_strtoUCS((__le16 *) pSMB->FileName, searchName, | 3113 | cifs_strtoUTF16((__le16 *) pSMB->FileName, searchName, |
3112 | PATH_MAX, nls_codepage); | 3114 | PATH_MAX, nls_codepage); |
3113 | name_len++; /* trailing null */ | 3115 | name_len++; /* trailing null */ |
3114 | name_len *= 2; | 3116 | name_len *= 2; |
3115 | } else { /* BB improve the check for buffer overruns BB */ | 3117 | } else { /* BB improve the check for buffer overruns BB */ |
@@ -3166,8 +3168,8 @@ querySymLinkRetry: | |||
3166 | is_unicode = false; | 3168 | is_unicode = false; |
3167 | 3169 | ||
3168 | /* BB FIXME investigate remapping reserved chars here */ | 3170 | /* BB FIXME investigate remapping reserved chars here */ |
3169 | *symlinkinfo = cifs_strndup_from_ucs(data_start, count, | 3171 | *symlinkinfo = cifs_strndup_from_utf16(data_start, |
3170 | is_unicode, nls_codepage); | 3172 | count, is_unicode, nls_codepage); |
3171 | if (!*symlinkinfo) | 3173 | if (!*symlinkinfo) |
3172 | rc = -ENOMEM; | 3174 | rc = -ENOMEM; |
3173 | } | 3175 | } |
@@ -3450,8 +3452,9 @@ queryAclRetry: | |||
3450 | 3452 | ||
3451 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 3453 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
3452 | name_len = | 3454 | name_len = |
3453 | cifsConvertToUCS((__le16 *) pSMB->FileName, searchName, | 3455 | cifsConvertToUTF16((__le16 *) pSMB->FileName, |
3454 | PATH_MAX, nls_codepage, remap); | 3456 | searchName, PATH_MAX, nls_codepage, |
3457 | remap); | ||
3455 | name_len++; /* trailing null */ | 3458 | name_len++; /* trailing null */ |
3456 | name_len *= 2; | 3459 | name_len *= 2; |
3457 | pSMB->FileName[name_len] = 0; | 3460 | pSMB->FileName[name_len] = 0; |
@@ -3537,8 +3540,8 @@ setAclRetry: | |||
3537 | return rc; | 3540 | return rc; |
3538 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 3541 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
3539 | name_len = | 3542 | name_len = |
3540 | cifsConvertToUCS((__le16 *) pSMB->FileName, fileName, | 3543 | cifsConvertToUTF16((__le16 *) pSMB->FileName, fileName, |
3541 | PATH_MAX, nls_codepage, remap); | 3544 | PATH_MAX, nls_codepage, remap); |
3542 | name_len++; /* trailing null */ | 3545 | name_len++; /* trailing null */ |
3543 | name_len *= 2; | 3546 | name_len *= 2; |
3544 | } else { /* BB improve the check for buffer overruns BB */ | 3547 | } else { /* BB improve the check for buffer overruns BB */ |
@@ -3948,8 +3951,9 @@ QInfRetry: | |||
3948 | 3951 | ||
3949 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 3952 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
3950 | name_len = | 3953 | name_len = |
3951 | cifsConvertToUCS((__le16 *) pSMB->FileName, searchName, | 3954 | cifsConvertToUTF16((__le16 *) pSMB->FileName, |
3952 | PATH_MAX, nls_codepage, remap); | 3955 | searchName, PATH_MAX, nls_codepage, |
3956 | remap); | ||
3953 | name_len++; /* trailing null */ | 3957 | name_len++; /* trailing null */ |
3954 | name_len *= 2; | 3958 | name_len *= 2; |
3955 | } else { | 3959 | } else { |
@@ -4086,8 +4090,8 @@ QPathInfoRetry: | |||
4086 | 4090 | ||
4087 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 4091 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
4088 | name_len = | 4092 | name_len = |
4089 | cifsConvertToUCS((__le16 *) pSMB->FileName, searchName, | 4093 | cifsConvertToUTF16((__le16 *) pSMB->FileName, searchName, |
4090 | PATH_MAX, nls_codepage, remap); | 4094 | PATH_MAX, nls_codepage, remap); |
4091 | name_len++; /* trailing null */ | 4095 | name_len++; /* trailing null */ |
4092 | name_len *= 2; | 4096 | name_len *= 2; |
4093 | } else { /* BB improve the check for buffer overruns BB */ | 4097 | } else { /* BB improve the check for buffer overruns BB */ |
@@ -4255,8 +4259,8 @@ UnixQPathInfoRetry: | |||
4255 | 4259 | ||
4256 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 4260 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
4257 | name_len = | 4261 | name_len = |
4258 | cifsConvertToUCS((__le16 *) pSMB->FileName, searchName, | 4262 | cifsConvertToUTF16((__le16 *) pSMB->FileName, searchName, |
4259 | PATH_MAX, nls_codepage, remap); | 4263 | PATH_MAX, nls_codepage, remap); |
4260 | name_len++; /* trailing null */ | 4264 | name_len++; /* trailing null */ |
4261 | name_len *= 2; | 4265 | name_len *= 2; |
4262 | } else { /* BB improve the check for buffer overruns BB */ | 4266 | } else { /* BB improve the check for buffer overruns BB */ |
@@ -4344,8 +4348,8 @@ findFirstRetry: | |||
4344 | 4348 | ||
4345 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 4349 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
4346 | name_len = | 4350 | name_len = |
4347 | cifsConvertToUCS((__le16 *) pSMB->FileName, searchName, | 4351 | cifsConvertToUTF16((__le16 *) pSMB->FileName, searchName, |
4348 | PATH_MAX, nls_codepage, remap); | 4352 | PATH_MAX, nls_codepage, remap); |
4349 | /* We can not add the asterik earlier in case | 4353 | /* We can not add the asterik earlier in case |
4350 | it got remapped to 0xF03A as if it were part of the | 4354 | it got remapped to 0xF03A as if it were part of the |
4351 | directory name instead of a wildcard */ | 4355 | directory name instead of a wildcard */ |
@@ -4656,8 +4660,9 @@ GetInodeNumberRetry: | |||
4656 | 4660 | ||
4657 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 4661 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
4658 | name_len = | 4662 | name_len = |
4659 | cifsConvertToUCS((__le16 *) pSMB->FileName, searchName, | 4663 | cifsConvertToUTF16((__le16 *) pSMB->FileName, |
4660 | PATH_MAX, nls_codepage, remap); | 4664 | searchName, PATH_MAX, nls_codepage, |
4665 | remap); | ||
4661 | name_len++; /* trailing null */ | 4666 | name_len++; /* trailing null */ |
4662 | name_len *= 2; | 4667 | name_len *= 2; |
4663 | } else { /* BB improve the check for buffer overruns BB */ | 4668 | } else { /* BB improve the check for buffer overruns BB */ |
@@ -4794,9 +4799,9 @@ parse_DFS_referrals(TRANSACTION2_GET_DFS_REFER_RSP *pSMBr, | |||
4794 | rc = -ENOMEM; | 4799 | rc = -ENOMEM; |
4795 | goto parse_DFS_referrals_exit; | 4800 | goto parse_DFS_referrals_exit; |
4796 | } | 4801 | } |
4797 | cifsConvertToUCS((__le16 *) tmp, searchName, | 4802 | cifsConvertToUTF16((__le16 *) tmp, searchName, |
4798 | PATH_MAX, nls_codepage, remap); | 4803 | PATH_MAX, nls_codepage, remap); |
4799 | node->path_consumed = cifs_ucs2_bytes(tmp, | 4804 | node->path_consumed = cifs_utf16_bytes(tmp, |
4800 | le16_to_cpu(pSMBr->PathConsumed), | 4805 | le16_to_cpu(pSMBr->PathConsumed), |
4801 | nls_codepage); | 4806 | nls_codepage); |
4802 | kfree(tmp); | 4807 | kfree(tmp); |
@@ -4809,8 +4814,8 @@ parse_DFS_referrals(TRANSACTION2_GET_DFS_REFER_RSP *pSMBr, | |||
4809 | /* copy DfsPath */ | 4814 | /* copy DfsPath */ |
4810 | temp = (char *)ref + le16_to_cpu(ref->DfsPathOffset); | 4815 | temp = (char *)ref + le16_to_cpu(ref->DfsPathOffset); |
4811 | max_len = data_end - temp; | 4816 | max_len = data_end - temp; |
4812 | node->path_name = cifs_strndup_from_ucs(temp, max_len, | 4817 | node->path_name = cifs_strndup_from_utf16(temp, max_len, |
4813 | is_unicode, nls_codepage); | 4818 | is_unicode, nls_codepage); |
4814 | if (!node->path_name) { | 4819 | if (!node->path_name) { |
4815 | rc = -ENOMEM; | 4820 | rc = -ENOMEM; |
4816 | goto parse_DFS_referrals_exit; | 4821 | goto parse_DFS_referrals_exit; |
@@ -4819,8 +4824,8 @@ parse_DFS_referrals(TRANSACTION2_GET_DFS_REFER_RSP *pSMBr, | |||
4819 | /* copy link target UNC */ | 4824 | /* copy link target UNC */ |
4820 | temp = (char *)ref + le16_to_cpu(ref->NetworkAddressOffset); | 4825 | temp = (char *)ref + le16_to_cpu(ref->NetworkAddressOffset); |
4821 | max_len = data_end - temp; | 4826 | max_len = data_end - temp; |
4822 | node->node_name = cifs_strndup_from_ucs(temp, max_len, | 4827 | node->node_name = cifs_strndup_from_utf16(temp, max_len, |
4823 | is_unicode, nls_codepage); | 4828 | is_unicode, nls_codepage); |
4824 | if (!node->node_name) | 4829 | if (!node->node_name) |
4825 | rc = -ENOMEM; | 4830 | rc = -ENOMEM; |
4826 | } | 4831 | } |
@@ -4873,8 +4878,9 @@ getDFSRetry: | |||
4873 | if (ses->capabilities & CAP_UNICODE) { | 4878 | if (ses->capabilities & CAP_UNICODE) { |
4874 | pSMB->hdr.Flags2 |= SMBFLG2_UNICODE; | 4879 | pSMB->hdr.Flags2 |= SMBFLG2_UNICODE; |
4875 | name_len = | 4880 | name_len = |
4876 | cifsConvertToUCS((__le16 *) pSMB->RequestFileName, | 4881 | cifsConvertToUTF16((__le16 *) pSMB->RequestFileName, |
4877 | searchName, PATH_MAX, nls_codepage, remap); | 4882 | searchName, PATH_MAX, nls_codepage, |
4883 | remap); | ||
4878 | name_len++; /* trailing null */ | 4884 | name_len++; /* trailing null */ |
4879 | name_len *= 2; | 4885 | name_len *= 2; |
4880 | } else { /* BB improve the check for buffer overruns BB */ | 4886 | } else { /* BB improve the check for buffer overruns BB */ |
@@ -5506,8 +5512,8 @@ SetEOFRetry: | |||
5506 | 5512 | ||
5507 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 5513 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
5508 | name_len = | 5514 | name_len = |
5509 | cifsConvertToUCS((__le16 *) pSMB->FileName, fileName, | 5515 | cifsConvertToUTF16((__le16 *) pSMB->FileName, fileName, |
5510 | PATH_MAX, nls_codepage, remap); | 5516 | PATH_MAX, nls_codepage, remap); |
5511 | name_len++; /* trailing null */ | 5517 | name_len++; /* trailing null */ |
5512 | name_len *= 2; | 5518 | name_len *= 2; |
5513 | } else { /* BB improve the check for buffer overruns BB */ | 5519 | } else { /* BB improve the check for buffer overruns BB */ |
@@ -5796,8 +5802,8 @@ SetTimesRetry: | |||
5796 | 5802 | ||
5797 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 5803 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
5798 | name_len = | 5804 | name_len = |
5799 | cifsConvertToUCS((__le16 *) pSMB->FileName, fileName, | 5805 | cifsConvertToUTF16((__le16 *) pSMB->FileName, fileName, |
5800 | PATH_MAX, nls_codepage, remap); | 5806 | PATH_MAX, nls_codepage, remap); |
5801 | name_len++; /* trailing null */ | 5807 | name_len++; /* trailing null */ |
5802 | name_len *= 2; | 5808 | name_len *= 2; |
5803 | } else { /* BB improve the check for buffer overruns BB */ | 5809 | } else { /* BB improve the check for buffer overruns BB */ |
@@ -5877,8 +5883,8 @@ SetAttrLgcyRetry: | |||
5877 | 5883 | ||
5878 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 5884 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
5879 | name_len = | 5885 | name_len = |
5880 | ConvertToUCS((__le16 *) pSMB->fileName, fileName, | 5886 | ConvertToUTF16((__le16 *) pSMB->fileName, fileName, |
5881 | PATH_MAX, nls_codepage); | 5887 | PATH_MAX, nls_codepage); |
5882 | name_len++; /* trailing null */ | 5888 | name_len++; /* trailing null */ |
5883 | name_len *= 2; | 5889 | name_len *= 2; |
5884 | } else { /* BB improve the check for buffer overruns BB */ | 5890 | } else { /* BB improve the check for buffer overruns BB */ |
@@ -6030,8 +6036,8 @@ setPermsRetry: | |||
6030 | 6036 | ||
6031 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 6037 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
6032 | name_len = | 6038 | name_len = |
6033 | cifsConvertToUCS((__le16 *) pSMB->FileName, fileName, | 6039 | cifsConvertToUTF16((__le16 *) pSMB->FileName, fileName, |
6034 | PATH_MAX, nls_codepage, remap); | 6040 | PATH_MAX, nls_codepage, remap); |
6035 | name_len++; /* trailing null */ | 6041 | name_len++; /* trailing null */ |
6036 | name_len *= 2; | 6042 | name_len *= 2; |
6037 | } else { /* BB improve the check for buffer overruns BB */ | 6043 | } else { /* BB improve the check for buffer overruns BB */ |
@@ -6123,8 +6129,8 @@ QAllEAsRetry: | |||
6123 | 6129 | ||
6124 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 6130 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
6125 | list_len = | 6131 | list_len = |
6126 | cifsConvertToUCS((__le16 *) pSMB->FileName, searchName, | 6132 | cifsConvertToUTF16((__le16 *) pSMB->FileName, searchName, |
6127 | PATH_MAX, nls_codepage, remap); | 6133 | PATH_MAX, nls_codepage, remap); |
6128 | list_len++; /* trailing null */ | 6134 | list_len++; /* trailing null */ |
6129 | list_len *= 2; | 6135 | list_len *= 2; |
6130 | } else { /* BB improve the check for buffer overruns BB */ | 6136 | } else { /* BB improve the check for buffer overruns BB */ |
@@ -6301,8 +6307,8 @@ SetEARetry: | |||
6301 | 6307 | ||
6302 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 6308 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
6303 | name_len = | 6309 | name_len = |
6304 | cifsConvertToUCS((__le16 *) pSMB->FileName, fileName, | 6310 | cifsConvertToUTF16((__le16 *) pSMB->FileName, fileName, |
6305 | PATH_MAX, nls_codepage, remap); | 6311 | PATH_MAX, nls_codepage, remap); |
6306 | name_len++; /* trailing null */ | 6312 | name_len++; /* trailing null */ |
6307 | name_len *= 2; | 6313 | name_len *= 2; |
6308 | } else { /* BB improve the check for buffer overruns BB */ | 6314 | } else { /* BB improve the check for buffer overruns BB */ |
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index 4666780f315d..986709a8d903 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c | |||
@@ -38,6 +38,7 @@ | |||
38 | #include <asm/processor.h> | 38 | #include <asm/processor.h> |
39 | #include <linux/inet.h> | 39 | #include <linux/inet.h> |
40 | #include <linux/module.h> | 40 | #include <linux/module.h> |
41 | #include <keys/user-type.h> | ||
41 | #include <net/ipv6.h> | 42 | #include <net/ipv6.h> |
42 | #include "cifspdu.h" | 43 | #include "cifspdu.h" |
43 | #include "cifsglob.h" | 44 | #include "cifsglob.h" |
@@ -225,74 +226,90 @@ static int check2ndT2(struct smb_hdr *pSMB) | |||
225 | 226 | ||
226 | static int coalesce_t2(struct smb_hdr *psecond, struct smb_hdr *pTargetSMB) | 227 | static int coalesce_t2(struct smb_hdr *psecond, struct smb_hdr *pTargetSMB) |
227 | { | 228 | { |
228 | struct smb_t2_rsp *pSMB2 = (struct smb_t2_rsp *)psecond; | 229 | struct smb_t2_rsp *pSMBs = (struct smb_t2_rsp *)psecond; |
229 | struct smb_t2_rsp *pSMBt = (struct smb_t2_rsp *)pTargetSMB; | 230 | struct smb_t2_rsp *pSMBt = (struct smb_t2_rsp *)pTargetSMB; |
230 | char *data_area_of_target; | 231 | char *data_area_of_tgt; |
231 | char *data_area_of_buf2; | 232 | char *data_area_of_src; |
232 | int remaining; | 233 | int remaining; |
233 | unsigned int byte_count, total_in_buf; | 234 | unsigned int byte_count, total_in_tgt; |
234 | __u16 total_data_size, total_in_buf2; | 235 | __u16 tgt_total_cnt, src_total_cnt, total_in_src; |
235 | 236 | ||
236 | total_data_size = get_unaligned_le16(&pSMBt->t2_rsp.TotalDataCount); | 237 | src_total_cnt = get_unaligned_le16(&pSMBs->t2_rsp.TotalDataCount); |
238 | tgt_total_cnt = get_unaligned_le16(&pSMBt->t2_rsp.TotalDataCount); | ||
237 | 239 | ||
238 | if (total_data_size != | 240 | if (tgt_total_cnt != src_total_cnt) |
239 | get_unaligned_le16(&pSMB2->t2_rsp.TotalDataCount)) | 241 | cFYI(1, "total data count of primary and secondary t2 differ " |
240 | cFYI(1, "total data size of primary and secondary t2 differ"); | 242 | "source=%hu target=%hu", src_total_cnt, tgt_total_cnt); |
241 | 243 | ||
242 | total_in_buf = get_unaligned_le16(&pSMBt->t2_rsp.DataCount); | 244 | total_in_tgt = get_unaligned_le16(&pSMBt->t2_rsp.DataCount); |
243 | 245 | ||
244 | remaining = total_data_size - total_in_buf; | 246 | remaining = tgt_total_cnt - total_in_tgt; |
245 | 247 | ||
246 | if (remaining < 0) | 248 | if (remaining < 0) { |
249 | cFYI(1, "Server sent too much data. tgt_total_cnt=%hu " | ||
250 | "total_in_tgt=%hu", tgt_total_cnt, total_in_tgt); | ||
247 | return -EPROTO; | 251 | return -EPROTO; |
252 | } | ||
248 | 253 | ||
249 | if (remaining == 0) /* nothing to do, ignore */ | 254 | if (remaining == 0) { |
255 | /* nothing to do, ignore */ | ||
256 | cFYI(1, "no more data remains"); | ||
250 | return 0; | 257 | return 0; |
258 | } | ||
251 | 259 | ||
252 | total_in_buf2 = get_unaligned_le16(&pSMB2->t2_rsp.DataCount); | 260 | total_in_src = get_unaligned_le16(&pSMBs->t2_rsp.DataCount); |
253 | if (remaining < total_in_buf2) { | 261 | if (remaining < total_in_src) |
254 | cFYI(1, "transact2 2nd response contains too much data"); | 262 | cFYI(1, "transact2 2nd response contains too much data"); |
255 | } | ||
256 | 263 | ||
257 | /* find end of first SMB data area */ | 264 | /* find end of first SMB data area */ |
258 | data_area_of_target = (char *)&pSMBt->hdr.Protocol + | 265 | data_area_of_tgt = (char *)&pSMBt->hdr.Protocol + |
259 | get_unaligned_le16(&pSMBt->t2_rsp.DataOffset); | 266 | get_unaligned_le16(&pSMBt->t2_rsp.DataOffset); |
260 | /* validate target area */ | ||
261 | 267 | ||
262 | data_area_of_buf2 = (char *)&pSMB2->hdr.Protocol + | 268 | /* validate target area */ |
263 | get_unaligned_le16(&pSMB2->t2_rsp.DataOffset); | 269 | data_area_of_src = (char *)&pSMBs->hdr.Protocol + |
270 | get_unaligned_le16(&pSMBs->t2_rsp.DataOffset); | ||
264 | 271 | ||
265 | data_area_of_target += total_in_buf; | 272 | data_area_of_tgt += total_in_tgt; |
266 | 273 | ||
267 | /* copy second buffer into end of first buffer */ | 274 | total_in_tgt += total_in_src; |
268 | total_in_buf += total_in_buf2; | ||
269 | /* is the result too big for the field? */ | 275 | /* is the result too big for the field? */ |
270 | if (total_in_buf > USHRT_MAX) | 276 | if (total_in_tgt > USHRT_MAX) { |
277 | cFYI(1, "coalesced DataCount too large (%u)", total_in_tgt); | ||
271 | return -EPROTO; | 278 | return -EPROTO; |
272 | put_unaligned_le16(total_in_buf, &pSMBt->t2_rsp.DataCount); | 279 | } |
280 | put_unaligned_le16(total_in_tgt, &pSMBt->t2_rsp.DataCount); | ||
273 | 281 | ||
274 | /* fix up the BCC */ | 282 | /* fix up the BCC */ |
275 | byte_count = get_bcc(pTargetSMB); | 283 | byte_count = get_bcc(pTargetSMB); |
276 | byte_count += total_in_buf2; | 284 | byte_count += total_in_src; |
277 | /* is the result too big for the field? */ | 285 | /* is the result too big for the field? */ |
278 | if (byte_count > USHRT_MAX) | 286 | if (byte_count > USHRT_MAX) { |
287 | cFYI(1, "coalesced BCC too large (%u)", byte_count); | ||
279 | return -EPROTO; | 288 | return -EPROTO; |
289 | } | ||
280 | put_bcc(byte_count, pTargetSMB); | 290 | put_bcc(byte_count, pTargetSMB); |
281 | 291 | ||
282 | byte_count = be32_to_cpu(pTargetSMB->smb_buf_length); | 292 | byte_count = be32_to_cpu(pTargetSMB->smb_buf_length); |
283 | byte_count += total_in_buf2; | 293 | byte_count += total_in_src; |
284 | /* don't allow buffer to overflow */ | 294 | /* don't allow buffer to overflow */ |
285 | if (byte_count > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4) | 295 | if (byte_count > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4) { |
296 | cFYI(1, "coalesced BCC exceeds buffer size (%u)", byte_count); | ||
286 | return -ENOBUFS; | 297 | return -ENOBUFS; |
298 | } | ||
287 | pTargetSMB->smb_buf_length = cpu_to_be32(byte_count); | 299 | pTargetSMB->smb_buf_length = cpu_to_be32(byte_count); |
288 | 300 | ||
289 | memcpy(data_area_of_target, data_area_of_buf2, total_in_buf2); | 301 | /* copy second buffer into end of first buffer */ |
302 | memcpy(data_area_of_tgt, data_area_of_src, total_in_src); | ||
290 | 303 | ||
291 | if (remaining == total_in_buf2) { | 304 | if (remaining != total_in_src) { |
292 | cFYI(1, "found the last secondary response"); | 305 | /* more responses to go */ |
293 | return 0; /* we are done */ | 306 | cFYI(1, "waiting for more secondary responses"); |
294 | } else /* more responses to go */ | ||
295 | return 1; | 307 | return 1; |
308 | } | ||
309 | |||
310 | /* we are done */ | ||
311 | cFYI(1, "found the last secondary response"); | ||
312 | return 0; | ||
296 | } | 313 | } |
297 | 314 | ||
298 | static void | 315 | static void |
@@ -1578,11 +1595,14 @@ cifs_parse_mount_options(const char *mountdata, const char *devname, | |||
1578 | } | 1595 | } |
1579 | } | 1596 | } |
1580 | 1597 | ||
1581 | if (vol->multiuser && !(vol->secFlg & CIFSSEC_MAY_KRB5)) { | 1598 | #ifndef CONFIG_KEYS |
1582 | cERROR(1, "Multiuser mounts currently require krb5 " | 1599 | /* Muliuser mounts require CONFIG_KEYS support */ |
1583 | "authentication!"); | 1600 | if (vol->multiuser) { |
1601 | cERROR(1, "Multiuser mounts require kernels with " | ||
1602 | "CONFIG_KEYS enabled."); | ||
1584 | goto cifs_parse_mount_err; | 1603 | goto cifs_parse_mount_err; |
1585 | } | 1604 | } |
1605 | #endif | ||
1586 | 1606 | ||
1587 | if (vol->UNCip == NULL) | 1607 | if (vol->UNCip == NULL) |
1588 | vol->UNCip = &vol->UNC[2]; | 1608 | vol->UNCip = &vol->UNC[2]; |
@@ -1981,10 +2001,16 @@ static int match_session(struct cifs_ses *ses, struct smb_vol *vol) | |||
1981 | return 0; | 2001 | return 0; |
1982 | break; | 2002 | break; |
1983 | default: | 2003 | default: |
2004 | /* NULL username means anonymous session */ | ||
2005 | if (ses->user_name == NULL) { | ||
2006 | if (!vol->nullauth) | ||
2007 | return 0; | ||
2008 | break; | ||
2009 | } | ||
2010 | |||
1984 | /* anything else takes username/password */ | 2011 | /* anything else takes username/password */ |
1985 | if (ses->user_name == NULL) | 2012 | if (strncmp(ses->user_name, |
1986 | return 0; | 2013 | vol->username ? vol->username : "", |
1987 | if (strncmp(ses->user_name, vol->username, | ||
1988 | MAX_USERNAME_SIZE)) | 2014 | MAX_USERNAME_SIZE)) |
1989 | return 0; | 2015 | return 0; |
1990 | if (strlen(vol->username) != 0 && | 2016 | if (strlen(vol->username) != 0 && |
@@ -2039,6 +2065,132 @@ cifs_put_smb_ses(struct cifs_ses *ses) | |||
2039 | cifs_put_tcp_session(server); | 2065 | cifs_put_tcp_session(server); |
2040 | } | 2066 | } |
2041 | 2067 | ||
2068 | #ifdef CONFIG_KEYS | ||
2069 | |||
2070 | /* strlen("cifs:a:") + INET6_ADDRSTRLEN + 1 */ | ||
2071 | #define CIFSCREDS_DESC_SIZE (7 + INET6_ADDRSTRLEN + 1) | ||
2072 | |||
2073 | /* Populate username and pw fields from keyring if possible */ | ||
2074 | static int | ||
2075 | cifs_set_cifscreds(struct smb_vol *vol, struct cifs_ses *ses) | ||
2076 | { | ||
2077 | int rc = 0; | ||
2078 | char *desc, *delim, *payload; | ||
2079 | ssize_t len; | ||
2080 | struct key *key; | ||
2081 | struct TCP_Server_Info *server = ses->server; | ||
2082 | struct sockaddr_in *sa; | ||
2083 | struct sockaddr_in6 *sa6; | ||
2084 | struct user_key_payload *upayload; | ||
2085 | |||
2086 | desc = kmalloc(CIFSCREDS_DESC_SIZE, GFP_KERNEL); | ||
2087 | if (!desc) | ||
2088 | return -ENOMEM; | ||
2089 | |||
2090 | /* try to find an address key first */ | ||
2091 | switch (server->dstaddr.ss_family) { | ||
2092 | case AF_INET: | ||
2093 | sa = (struct sockaddr_in *)&server->dstaddr; | ||
2094 | sprintf(desc, "cifs:a:%pI4", &sa->sin_addr.s_addr); | ||
2095 | break; | ||
2096 | case AF_INET6: | ||
2097 | sa6 = (struct sockaddr_in6 *)&server->dstaddr; | ||
2098 | sprintf(desc, "cifs:a:%pI6c", &sa6->sin6_addr.s6_addr); | ||
2099 | break; | ||
2100 | default: | ||
2101 | cFYI(1, "Bad ss_family (%hu)", server->dstaddr.ss_family); | ||
2102 | rc = -EINVAL; | ||
2103 | goto out_err; | ||
2104 | } | ||
2105 | |||
2106 | cFYI(1, "%s: desc=%s", __func__, desc); | ||
2107 | key = request_key(&key_type_logon, desc, ""); | ||
2108 | if (IS_ERR(key)) { | ||
2109 | if (!ses->domainName) { | ||
2110 | cFYI(1, "domainName is NULL"); | ||
2111 | rc = PTR_ERR(key); | ||
2112 | goto out_err; | ||
2113 | } | ||
2114 | |||
2115 | /* didn't work, try to find a domain key */ | ||
2116 | sprintf(desc, "cifs:d:%s", ses->domainName); | ||
2117 | cFYI(1, "%s: desc=%s", __func__, desc); | ||
2118 | key = request_key(&key_type_logon, desc, ""); | ||
2119 | if (IS_ERR(key)) { | ||
2120 | rc = PTR_ERR(key); | ||
2121 | goto out_err; | ||
2122 | } | ||
2123 | } | ||
2124 | |||
2125 | down_read(&key->sem); | ||
2126 | upayload = key->payload.data; | ||
2127 | if (IS_ERR_OR_NULL(upayload)) { | ||
2128 | rc = PTR_ERR(key); | ||
2129 | goto out_key_put; | ||
2130 | } | ||
2131 | |||
2132 | /* find first : in payload */ | ||
2133 | payload = (char *)upayload->data; | ||
2134 | delim = strnchr(payload, upayload->datalen, ':'); | ||
2135 | cFYI(1, "payload=%s", payload); | ||
2136 | if (!delim) { | ||
2137 | cFYI(1, "Unable to find ':' in payload (datalen=%d)", | ||
2138 | upayload->datalen); | ||
2139 | rc = -EINVAL; | ||
2140 | goto out_key_put; | ||
2141 | } | ||
2142 | |||
2143 | len = delim - payload; | ||
2144 | if (len > MAX_USERNAME_SIZE || len <= 0) { | ||
2145 | cFYI(1, "Bad value from username search (len=%ld)", len); | ||
2146 | rc = -EINVAL; | ||
2147 | goto out_key_put; | ||
2148 | } | ||
2149 | |||
2150 | vol->username = kstrndup(payload, len, GFP_KERNEL); | ||
2151 | if (!vol->username) { | ||
2152 | cFYI(1, "Unable to allocate %ld bytes for username", len); | ||
2153 | rc = -ENOMEM; | ||
2154 | goto out_key_put; | ||
2155 | } | ||
2156 | cFYI(1, "%s: username=%s", __func__, vol->username); | ||
2157 | |||
2158 | len = key->datalen - (len + 1); | ||
2159 | if (len > MAX_PASSWORD_SIZE || len <= 0) { | ||
2160 | cFYI(1, "Bad len for password search (len=%ld)", len); | ||
2161 | rc = -EINVAL; | ||
2162 | kfree(vol->username); | ||
2163 | vol->username = NULL; | ||
2164 | goto out_key_put; | ||
2165 | } | ||
2166 | |||
2167 | ++delim; | ||
2168 | vol->password = kstrndup(delim, len, GFP_KERNEL); | ||
2169 | if (!vol->password) { | ||
2170 | cFYI(1, "Unable to allocate %ld bytes for password", len); | ||
2171 | rc = -ENOMEM; | ||
2172 | kfree(vol->username); | ||
2173 | vol->username = NULL; | ||
2174 | goto out_key_put; | ||
2175 | } | ||
2176 | |||
2177 | out_key_put: | ||
2178 | up_read(&key->sem); | ||
2179 | key_put(key); | ||
2180 | out_err: | ||
2181 | kfree(desc); | ||
2182 | cFYI(1, "%s: returning %d", __func__, rc); | ||
2183 | return rc; | ||
2184 | } | ||
2185 | #else /* ! CONFIG_KEYS */ | ||
2186 | static inline int | ||
2187 | cifs_set_cifscreds(struct smb_vol *vol __attribute__((unused)), | ||
2188 | struct cifs_ses *ses __attribute__((unused))) | ||
2189 | { | ||
2190 | return -ENOSYS; | ||
2191 | } | ||
2192 | #endif /* CONFIG_KEYS */ | ||
2193 | |||
2042 | static bool warned_on_ntlm; /* globals init to false automatically */ | 2194 | static bool warned_on_ntlm; /* globals init to false automatically */ |
2043 | 2195 | ||
2044 | static struct cifs_ses * | 2196 | static struct cifs_ses * |
@@ -2914,18 +3066,33 @@ void cifs_setup_cifs_sb(struct smb_vol *pvolume_info, | |||
2914 | #define CIFS_DEFAULT_IOSIZE (1024 * 1024) | 3066 | #define CIFS_DEFAULT_IOSIZE (1024 * 1024) |
2915 | 3067 | ||
2916 | /* | 3068 | /* |
2917 | * Windows only supports a max of 60k reads. Default to that when posix | 3069 | * Windows only supports a max of 60kb reads and 65535 byte writes. Default to |
2918 | * extensions aren't in force. | 3070 | * those values when posix extensions aren't in force. In actuality here, we |
3071 | * use 65536 to allow for a write that is a multiple of 4k. Most servers seem | ||
3072 | * to be ok with the extra byte even though Windows doesn't send writes that | ||
3073 | * are that large. | ||
3074 | * | ||
3075 | * Citation: | ||
3076 | * | ||
3077 | * http://blogs.msdn.com/b/openspecification/archive/2009/04/10/smb-maximum-transmit-buffer-size-and-performance-tuning.aspx | ||
2919 | */ | 3078 | */ |
2920 | #define CIFS_DEFAULT_NON_POSIX_RSIZE (60 * 1024) | 3079 | #define CIFS_DEFAULT_NON_POSIX_RSIZE (60 * 1024) |
3080 | #define CIFS_DEFAULT_NON_POSIX_WSIZE (65536) | ||
2921 | 3081 | ||
2922 | static unsigned int | 3082 | static unsigned int |
2923 | cifs_negotiate_wsize(struct cifs_tcon *tcon, struct smb_vol *pvolume_info) | 3083 | cifs_negotiate_wsize(struct cifs_tcon *tcon, struct smb_vol *pvolume_info) |
2924 | { | 3084 | { |
2925 | __u64 unix_cap = le64_to_cpu(tcon->fsUnixInfo.Capability); | 3085 | __u64 unix_cap = le64_to_cpu(tcon->fsUnixInfo.Capability); |
2926 | struct TCP_Server_Info *server = tcon->ses->server; | 3086 | struct TCP_Server_Info *server = tcon->ses->server; |
2927 | unsigned int wsize = pvolume_info->wsize ? pvolume_info->wsize : | 3087 | unsigned int wsize; |
2928 | CIFS_DEFAULT_IOSIZE; | 3088 | |
3089 | /* start with specified wsize, or default */ | ||
3090 | if (pvolume_info->wsize) | ||
3091 | wsize = pvolume_info->wsize; | ||
3092 | else if (tcon->unix_ext && (unix_cap & CIFS_UNIX_LARGE_WRITE_CAP)) | ||
3093 | wsize = CIFS_DEFAULT_IOSIZE; | ||
3094 | else | ||
3095 | wsize = CIFS_DEFAULT_NON_POSIX_WSIZE; | ||
2929 | 3096 | ||
2930 | /* can server support 24-bit write sizes? (via UNIX extensions) */ | 3097 | /* can server support 24-bit write sizes? (via UNIX extensions) */ |
2931 | if (!tcon->unix_ext || !(unix_cap & CIFS_UNIX_LARGE_WRITE_CAP)) | 3098 | if (!tcon->unix_ext || !(unix_cap & CIFS_UNIX_LARGE_WRITE_CAP)) |
@@ -3136,10 +3303,9 @@ cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data, | |||
3136 | return -EINVAL; | 3303 | return -EINVAL; |
3137 | 3304 | ||
3138 | if (volume_info->nullauth) { | 3305 | if (volume_info->nullauth) { |
3139 | cFYI(1, "null user"); | 3306 | cFYI(1, "Anonymous login"); |
3140 | volume_info->username = kzalloc(1, GFP_KERNEL); | 3307 | kfree(volume_info->username); |
3141 | if (volume_info->username == NULL) | 3308 | volume_info->username = NULL; |
3142 | return -ENOMEM; | ||
3143 | } else if (volume_info->username) { | 3309 | } else if (volume_info->username) { |
3144 | /* BB fixme parse for domain name here */ | 3310 | /* BB fixme parse for domain name here */ |
3145 | cFYI(1, "Username: %s", volume_info->username); | 3311 | cFYI(1, "Username: %s", volume_info->username); |
@@ -3478,7 +3644,7 @@ CIFSTCon(unsigned int xid, struct cifs_ses *ses, | |||
3478 | if (ses->capabilities & CAP_UNICODE) { | 3644 | if (ses->capabilities & CAP_UNICODE) { |
3479 | smb_buffer->Flags2 |= SMBFLG2_UNICODE; | 3645 | smb_buffer->Flags2 |= SMBFLG2_UNICODE; |
3480 | length = | 3646 | length = |
3481 | cifs_strtoUCS((__le16 *) bcc_ptr, tree, | 3647 | cifs_strtoUTF16((__le16 *) bcc_ptr, tree, |
3482 | 6 /* max utf8 char length in bytes */ * | 3648 | 6 /* max utf8 char length in bytes */ * |
3483 | (/* server len*/ + 256 /* share len */), nls_codepage); | 3649 | (/* server len*/ + 256 /* share len */), nls_codepage); |
3484 | bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */ | 3650 | bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */ |
@@ -3533,7 +3699,7 @@ CIFSTCon(unsigned int xid, struct cifs_ses *ses, | |||
3533 | 3699 | ||
3534 | /* mostly informational -- no need to fail on error here */ | 3700 | /* mostly informational -- no need to fail on error here */ |
3535 | kfree(tcon->nativeFileSystem); | 3701 | kfree(tcon->nativeFileSystem); |
3536 | tcon->nativeFileSystem = cifs_strndup_from_ucs(bcc_ptr, | 3702 | tcon->nativeFileSystem = cifs_strndup_from_utf16(bcc_ptr, |
3537 | bytes_left, is_unicode, | 3703 | bytes_left, is_unicode, |
3538 | nls_codepage); | 3704 | nls_codepage); |
3539 | 3705 | ||
@@ -3657,16 +3823,38 @@ int cifs_setup_session(unsigned int xid, struct cifs_ses *ses, | |||
3657 | return rc; | 3823 | return rc; |
3658 | } | 3824 | } |
3659 | 3825 | ||
3826 | static int | ||
3827 | cifs_set_vol_auth(struct smb_vol *vol, struct cifs_ses *ses) | ||
3828 | { | ||
3829 | switch (ses->server->secType) { | ||
3830 | case Kerberos: | ||
3831 | vol->secFlg = CIFSSEC_MUST_KRB5; | ||
3832 | return 0; | ||
3833 | case NTLMv2: | ||
3834 | vol->secFlg = CIFSSEC_MUST_NTLMV2; | ||
3835 | break; | ||
3836 | case NTLM: | ||
3837 | vol->secFlg = CIFSSEC_MUST_NTLM; | ||
3838 | break; | ||
3839 | case RawNTLMSSP: | ||
3840 | vol->secFlg = CIFSSEC_MUST_NTLMSSP; | ||
3841 | break; | ||
3842 | case LANMAN: | ||
3843 | vol->secFlg = CIFSSEC_MUST_LANMAN; | ||
3844 | break; | ||
3845 | } | ||
3846 | |||
3847 | return cifs_set_cifscreds(vol, ses); | ||
3848 | } | ||
3849 | |||
3660 | static struct cifs_tcon * | 3850 | static struct cifs_tcon * |
3661 | cifs_construct_tcon(struct cifs_sb_info *cifs_sb, uid_t fsuid) | 3851 | cifs_construct_tcon(struct cifs_sb_info *cifs_sb, uid_t fsuid) |
3662 | { | 3852 | { |
3853 | int rc; | ||
3663 | struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb); | 3854 | struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb); |
3664 | struct cifs_ses *ses; | 3855 | struct cifs_ses *ses; |
3665 | struct cifs_tcon *tcon = NULL; | 3856 | struct cifs_tcon *tcon = NULL; |
3666 | struct smb_vol *vol_info; | 3857 | struct smb_vol *vol_info; |
3667 | char username[28]; /* big enough for "krb50x" + hex of ULONG_MAX 6+16 */ | ||
3668 | /* We used to have this as MAX_USERNAME which is */ | ||
3669 | /* way too big now (256 instead of 32) */ | ||
3670 | 3858 | ||
3671 | vol_info = kzalloc(sizeof(*vol_info), GFP_KERNEL); | 3859 | vol_info = kzalloc(sizeof(*vol_info), GFP_KERNEL); |
3672 | if (vol_info == NULL) { | 3860 | if (vol_info == NULL) { |
@@ -3674,8 +3862,6 @@ cifs_construct_tcon(struct cifs_sb_info *cifs_sb, uid_t fsuid) | |||
3674 | goto out; | 3862 | goto out; |
3675 | } | 3863 | } |
3676 | 3864 | ||
3677 | snprintf(username, sizeof(username), "krb50x%x", fsuid); | ||
3678 | vol_info->username = username; | ||
3679 | vol_info->local_nls = cifs_sb->local_nls; | 3865 | vol_info->local_nls = cifs_sb->local_nls; |
3680 | vol_info->linux_uid = fsuid; | 3866 | vol_info->linux_uid = fsuid; |
3681 | vol_info->cred_uid = fsuid; | 3867 | vol_info->cred_uid = fsuid; |
@@ -3685,8 +3871,11 @@ cifs_construct_tcon(struct cifs_sb_info *cifs_sb, uid_t fsuid) | |||
3685 | vol_info->local_lease = master_tcon->local_lease; | 3871 | vol_info->local_lease = master_tcon->local_lease; |
3686 | vol_info->no_linux_ext = !master_tcon->unix_ext; | 3872 | vol_info->no_linux_ext = !master_tcon->unix_ext; |
3687 | 3873 | ||
3688 | /* FIXME: allow for other secFlg settings */ | 3874 | rc = cifs_set_vol_auth(vol_info, master_tcon->ses); |
3689 | vol_info->secFlg = CIFSSEC_MUST_KRB5; | 3875 | if (rc) { |
3876 | tcon = ERR_PTR(rc); | ||
3877 | goto out; | ||
3878 | } | ||
3690 | 3879 | ||
3691 | /* get a reference for the same TCP session */ | 3880 | /* get a reference for the same TCP session */ |
3692 | spin_lock(&cifs_tcp_ses_lock); | 3881 | spin_lock(&cifs_tcp_ses_lock); |
@@ -3709,6 +3898,8 @@ cifs_construct_tcon(struct cifs_sb_info *cifs_sb, uid_t fsuid) | |||
3709 | if (ses->capabilities & CAP_UNIX) | 3898 | if (ses->capabilities & CAP_UNIX) |
3710 | reset_cifs_unix_caps(0, tcon, NULL, vol_info); | 3899 | reset_cifs_unix_caps(0, tcon, NULL, vol_info); |
3711 | out: | 3900 | out: |
3901 | kfree(vol_info->username); | ||
3902 | kfree(vol_info->password); | ||
3712 | kfree(vol_info); | 3903 | kfree(vol_info); |
3713 | 3904 | ||
3714 | return tcon; | 3905 | return tcon; |
diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c index a090bbe6ee29..e2bbc683e018 100644 --- a/fs/cifs/readdir.c +++ b/fs/cifs/readdir.c | |||
@@ -647,10 +647,11 @@ static int cifs_filldir(char *find_entry, struct file *file, filldir_t filldir, | |||
647 | 647 | ||
648 | name.name = scratch_buf; | 648 | name.name = scratch_buf; |
649 | name.len = | 649 | name.len = |
650 | cifs_from_ucs2((char *)name.name, (__le16 *)de.name, | 650 | cifs_from_utf16((char *)name.name, (__le16 *)de.name, |
651 | UNICODE_NAME_MAX, | 651 | UNICODE_NAME_MAX, |
652 | min(de.namelen, (size_t)max_len), nlt, | 652 | min_t(size_t, de.namelen, |
653 | cifs_sb->mnt_cifs_flags & | 653 | (size_t)max_len), nlt, |
654 | cifs_sb->mnt_cifs_flags & | ||
654 | CIFS_MOUNT_MAP_SPECIAL_CHR); | 655 | CIFS_MOUNT_MAP_SPECIAL_CHR); |
655 | name.len -= nls_nullsize(nlt); | 656 | name.len -= nls_nullsize(nlt); |
656 | } else { | 657 | } else { |
diff --git a/fs/cifs/sess.c b/fs/cifs/sess.c index 4ec3ee9d72cc..d85efad5765f 100644 --- a/fs/cifs/sess.c +++ b/fs/cifs/sess.c | |||
@@ -167,16 +167,16 @@ unicode_oslm_strings(char **pbcc_area, const struct nls_table *nls_cp) | |||
167 | int bytes_ret = 0; | 167 | int bytes_ret = 0; |
168 | 168 | ||
169 | /* Copy OS version */ | 169 | /* Copy OS version */ |
170 | bytes_ret = cifs_strtoUCS((__le16 *)bcc_ptr, "Linux version ", 32, | 170 | bytes_ret = cifs_strtoUTF16((__le16 *)bcc_ptr, "Linux version ", 32, |
171 | nls_cp); | 171 | nls_cp); |
172 | bcc_ptr += 2 * bytes_ret; | 172 | bcc_ptr += 2 * bytes_ret; |
173 | bytes_ret = cifs_strtoUCS((__le16 *) bcc_ptr, init_utsname()->release, | 173 | bytes_ret = cifs_strtoUTF16((__le16 *) bcc_ptr, init_utsname()->release, |
174 | 32, nls_cp); | 174 | 32, nls_cp); |
175 | bcc_ptr += 2 * bytes_ret; | 175 | bcc_ptr += 2 * bytes_ret; |
176 | bcc_ptr += 2; /* trailing null */ | 176 | bcc_ptr += 2; /* trailing null */ |
177 | 177 | ||
178 | bytes_ret = cifs_strtoUCS((__le16 *) bcc_ptr, CIFS_NETWORK_OPSYS, | 178 | bytes_ret = cifs_strtoUTF16((__le16 *) bcc_ptr, CIFS_NETWORK_OPSYS, |
179 | 32, nls_cp); | 179 | 32, nls_cp); |
180 | bcc_ptr += 2 * bytes_ret; | 180 | bcc_ptr += 2 * bytes_ret; |
181 | bcc_ptr += 2; /* trailing null */ | 181 | bcc_ptr += 2; /* trailing null */ |
182 | 182 | ||
@@ -197,8 +197,8 @@ static void unicode_domain_string(char **pbcc_area, struct cifs_ses *ses, | |||
197 | *(bcc_ptr+1) = 0; | 197 | *(bcc_ptr+1) = 0; |
198 | bytes_ret = 0; | 198 | bytes_ret = 0; |
199 | } else | 199 | } else |
200 | bytes_ret = cifs_strtoUCS((__le16 *) bcc_ptr, ses->domainName, | 200 | bytes_ret = cifs_strtoUTF16((__le16 *) bcc_ptr, ses->domainName, |
201 | 256, nls_cp); | 201 | 256, nls_cp); |
202 | bcc_ptr += 2 * bytes_ret; | 202 | bcc_ptr += 2 * bytes_ret; |
203 | bcc_ptr += 2; /* account for null terminator */ | 203 | bcc_ptr += 2; /* account for null terminator */ |
204 | 204 | ||
@@ -226,8 +226,8 @@ static void unicode_ssetup_strings(char **pbcc_area, struct cifs_ses *ses, | |||
226 | *bcc_ptr = 0; | 226 | *bcc_ptr = 0; |
227 | *(bcc_ptr+1) = 0; | 227 | *(bcc_ptr+1) = 0; |
228 | } else { | 228 | } else { |
229 | bytes_ret = cifs_strtoUCS((__le16 *) bcc_ptr, ses->user_name, | 229 | bytes_ret = cifs_strtoUTF16((__le16 *) bcc_ptr, ses->user_name, |
230 | MAX_USERNAME_SIZE, nls_cp); | 230 | MAX_USERNAME_SIZE, nls_cp); |
231 | } | 231 | } |
232 | bcc_ptr += 2 * bytes_ret; | 232 | bcc_ptr += 2 * bytes_ret; |
233 | bcc_ptr += 2; /* account for null termination */ | 233 | bcc_ptr += 2; /* account for null termination */ |
@@ -287,7 +287,7 @@ decode_unicode_ssetup(char **pbcc_area, int bleft, struct cifs_ses *ses, | |||
287 | cFYI(1, "bleft %d", bleft); | 287 | cFYI(1, "bleft %d", bleft); |
288 | 288 | ||
289 | kfree(ses->serverOS); | 289 | kfree(ses->serverOS); |
290 | ses->serverOS = cifs_strndup_from_ucs(data, bleft, true, nls_cp); | 290 | ses->serverOS = cifs_strndup_from_utf16(data, bleft, true, nls_cp); |
291 | cFYI(1, "serverOS=%s", ses->serverOS); | 291 | cFYI(1, "serverOS=%s", ses->serverOS); |
292 | len = (UniStrnlen((wchar_t *) data, bleft / 2) * 2) + 2; | 292 | len = (UniStrnlen((wchar_t *) data, bleft / 2) * 2) + 2; |
293 | data += len; | 293 | data += len; |
@@ -296,7 +296,7 @@ decode_unicode_ssetup(char **pbcc_area, int bleft, struct cifs_ses *ses, | |||
296 | return; | 296 | return; |
297 | 297 | ||
298 | kfree(ses->serverNOS); | 298 | kfree(ses->serverNOS); |
299 | ses->serverNOS = cifs_strndup_from_ucs(data, bleft, true, nls_cp); | 299 | ses->serverNOS = cifs_strndup_from_utf16(data, bleft, true, nls_cp); |
300 | cFYI(1, "serverNOS=%s", ses->serverNOS); | 300 | cFYI(1, "serverNOS=%s", ses->serverNOS); |
301 | len = (UniStrnlen((wchar_t *) data, bleft / 2) * 2) + 2; | 301 | len = (UniStrnlen((wchar_t *) data, bleft / 2) * 2) + 2; |
302 | data += len; | 302 | data += len; |
@@ -305,7 +305,7 @@ decode_unicode_ssetup(char **pbcc_area, int bleft, struct cifs_ses *ses, | |||
305 | return; | 305 | return; |
306 | 306 | ||
307 | kfree(ses->serverDomain); | 307 | kfree(ses->serverDomain); |
308 | ses->serverDomain = cifs_strndup_from_ucs(data, bleft, true, nls_cp); | 308 | ses->serverDomain = cifs_strndup_from_utf16(data, bleft, true, nls_cp); |
309 | cFYI(1, "serverDomain=%s", ses->serverDomain); | 309 | cFYI(1, "serverDomain=%s", ses->serverDomain); |
310 | 310 | ||
311 | return; | 311 | return; |
@@ -502,8 +502,8 @@ static int build_ntlmssp_auth_blob(unsigned char *pbuffer, | |||
502 | tmp += 2; | 502 | tmp += 2; |
503 | } else { | 503 | } else { |
504 | int len; | 504 | int len; |
505 | len = cifs_strtoUCS((__le16 *)tmp, ses->domainName, | 505 | len = cifs_strtoUTF16((__le16 *)tmp, ses->domainName, |
506 | MAX_USERNAME_SIZE, nls_cp); | 506 | MAX_USERNAME_SIZE, nls_cp); |
507 | len *= 2; /* unicode is 2 bytes each */ | 507 | len *= 2; /* unicode is 2 bytes each */ |
508 | sec_blob->DomainName.BufferOffset = cpu_to_le32(tmp - pbuffer); | 508 | sec_blob->DomainName.BufferOffset = cpu_to_le32(tmp - pbuffer); |
509 | sec_blob->DomainName.Length = cpu_to_le16(len); | 509 | sec_blob->DomainName.Length = cpu_to_le16(len); |
@@ -518,8 +518,8 @@ static int build_ntlmssp_auth_blob(unsigned char *pbuffer, | |||
518 | tmp += 2; | 518 | tmp += 2; |
519 | } else { | 519 | } else { |
520 | int len; | 520 | int len; |
521 | len = cifs_strtoUCS((__le16 *)tmp, ses->user_name, | 521 | len = cifs_strtoUTF16((__le16 *)tmp, ses->user_name, |
522 | MAX_USERNAME_SIZE, nls_cp); | 522 | MAX_USERNAME_SIZE, nls_cp); |
523 | len *= 2; /* unicode is 2 bytes each */ | 523 | len *= 2; /* unicode is 2 bytes each */ |
524 | sec_blob->UserName.BufferOffset = cpu_to_le32(tmp - pbuffer); | 524 | sec_blob->UserName.BufferOffset = cpu_to_le32(tmp - pbuffer); |
525 | sec_blob->UserName.Length = cpu_to_le16(len); | 525 | sec_blob->UserName.Length = cpu_to_le16(len); |
diff --git a/fs/cifs/smbencrypt.c b/fs/cifs/smbencrypt.c index 80d850881938..d5cd9aa7eacc 100644 --- a/fs/cifs/smbencrypt.c +++ b/fs/cifs/smbencrypt.c | |||
@@ -213,7 +213,7 @@ E_md4hash(const unsigned char *passwd, unsigned char *p16, | |||
213 | 213 | ||
214 | /* Password cannot be longer than 128 characters */ | 214 | /* Password cannot be longer than 128 characters */ |
215 | if (passwd) /* Password must be converted to NT unicode */ | 215 | if (passwd) /* Password must be converted to NT unicode */ |
216 | len = cifs_strtoUCS(wpwd, passwd, 128, codepage); | 216 | len = cifs_strtoUTF16(wpwd, passwd, 128, codepage); |
217 | else { | 217 | else { |
218 | len = 0; | 218 | len = 0; |
219 | *wpwd = 0; /* Ensure string is null terminated */ | 219 | *wpwd = 0; /* Ensure string is null terminated */ |
diff --git a/fs/debugfs/file.c b/fs/debugfs/file.c index f65d4455c5e5..ef023eef0464 100644 --- a/fs/debugfs/file.c +++ b/fs/debugfs/file.c | |||
@@ -540,7 +540,7 @@ EXPORT_SYMBOL_GPL(debugfs_create_blob); | |||
540 | * debugfs_print_regs32 - use seq_print to describe a set of registers | 540 | * debugfs_print_regs32 - use seq_print to describe a set of registers |
541 | * @s: the seq_file structure being used to generate output | 541 | * @s: the seq_file structure being used to generate output |
542 | * @regs: an array if struct debugfs_reg32 structures | 542 | * @regs: an array if struct debugfs_reg32 structures |
543 | * @mregs: the length of the above array | 543 | * @nregs: the length of the above array |
544 | * @base: the base address to be used in reading the registers | 544 | * @base: the base address to be used in reading the registers |
545 | * @prefix: a string to be prefixed to every output line | 545 | * @prefix: a string to be prefixed to every output line |
546 | * | 546 | * |
diff --git a/fs/ecryptfs/crypto.c b/fs/ecryptfs/crypto.c index 2a834255c75d..63ab24510649 100644 --- a/fs/ecryptfs/crypto.c +++ b/fs/ecryptfs/crypto.c | |||
@@ -417,17 +417,6 @@ static int ecryptfs_encrypt_extent(struct page *enc_extent_page, | |||
417 | (unsigned long long)(extent_base + extent_offset), rc); | 417 | (unsigned long long)(extent_base + extent_offset), rc); |
418 | goto out; | 418 | goto out; |
419 | } | 419 | } |
420 | if (unlikely(ecryptfs_verbosity > 0)) { | ||
421 | ecryptfs_printk(KERN_DEBUG, "Encrypting extent " | ||
422 | "with iv:\n"); | ||
423 | ecryptfs_dump_hex(extent_iv, crypt_stat->iv_bytes); | ||
424 | ecryptfs_printk(KERN_DEBUG, "First 8 bytes before " | ||
425 | "encryption:\n"); | ||
426 | ecryptfs_dump_hex((char *) | ||
427 | (page_address(page) | ||
428 | + (extent_offset * crypt_stat->extent_size)), | ||
429 | 8); | ||
430 | } | ||
431 | rc = ecryptfs_encrypt_page_offset(crypt_stat, enc_extent_page, 0, | 420 | rc = ecryptfs_encrypt_page_offset(crypt_stat, enc_extent_page, 0, |
432 | page, (extent_offset | 421 | page, (extent_offset |
433 | * crypt_stat->extent_size), | 422 | * crypt_stat->extent_size), |
@@ -440,14 +429,6 @@ static int ecryptfs_encrypt_extent(struct page *enc_extent_page, | |||
440 | goto out; | 429 | goto out; |
441 | } | 430 | } |
442 | rc = 0; | 431 | rc = 0; |
443 | if (unlikely(ecryptfs_verbosity > 0)) { | ||
444 | ecryptfs_printk(KERN_DEBUG, "Encrypt extent [0x%.16llx]; " | ||
445 | "rc = [%d]\n", | ||
446 | (unsigned long long)(extent_base + extent_offset), rc); | ||
447 | ecryptfs_printk(KERN_DEBUG, "First 8 bytes after " | ||
448 | "encryption:\n"); | ||
449 | ecryptfs_dump_hex((char *)(page_address(enc_extent_page)), 8); | ||
450 | } | ||
451 | out: | 432 | out: |
452 | return rc; | 433 | return rc; |
453 | } | 434 | } |
@@ -543,17 +524,6 @@ static int ecryptfs_decrypt_extent(struct page *page, | |||
543 | (unsigned long long)(extent_base + extent_offset), rc); | 524 | (unsigned long long)(extent_base + extent_offset), rc); |
544 | goto out; | 525 | goto out; |
545 | } | 526 | } |
546 | if (unlikely(ecryptfs_verbosity > 0)) { | ||
547 | ecryptfs_printk(KERN_DEBUG, "Decrypting extent " | ||
548 | "with iv:\n"); | ||
549 | ecryptfs_dump_hex(extent_iv, crypt_stat->iv_bytes); | ||
550 | ecryptfs_printk(KERN_DEBUG, "First 8 bytes before " | ||
551 | "decryption:\n"); | ||
552 | ecryptfs_dump_hex((char *) | ||
553 | (page_address(enc_extent_page) | ||
554 | + (extent_offset * crypt_stat->extent_size)), | ||
555 | 8); | ||
556 | } | ||
557 | rc = ecryptfs_decrypt_page_offset(crypt_stat, page, | 527 | rc = ecryptfs_decrypt_page_offset(crypt_stat, page, |
558 | (extent_offset | 528 | (extent_offset |
559 | * crypt_stat->extent_size), | 529 | * crypt_stat->extent_size), |
@@ -567,16 +537,6 @@ static int ecryptfs_decrypt_extent(struct page *page, | |||
567 | goto out; | 537 | goto out; |
568 | } | 538 | } |
569 | rc = 0; | 539 | rc = 0; |
570 | if (unlikely(ecryptfs_verbosity > 0)) { | ||
571 | ecryptfs_printk(KERN_DEBUG, "Decrypt extent [0x%.16llx]; " | ||
572 | "rc = [%d]\n", | ||
573 | (unsigned long long)(extent_base + extent_offset), rc); | ||
574 | ecryptfs_printk(KERN_DEBUG, "First 8 bytes after " | ||
575 | "decryption:\n"); | ||
576 | ecryptfs_dump_hex((char *)(page_address(page) | ||
577 | + (extent_offset | ||
578 | * crypt_stat->extent_size)), 8); | ||
579 | } | ||
580 | out: | 540 | out: |
581 | return rc; | 541 | return rc; |
582 | } | 542 | } |
@@ -1590,8 +1550,8 @@ int ecryptfs_read_and_validate_xattr_region(struct dentry *dentry, | |||
1590 | */ | 1550 | */ |
1591 | int ecryptfs_read_metadata(struct dentry *ecryptfs_dentry) | 1551 | int ecryptfs_read_metadata(struct dentry *ecryptfs_dentry) |
1592 | { | 1552 | { |
1593 | int rc = 0; | 1553 | int rc; |
1594 | char *page_virt = NULL; | 1554 | char *page_virt; |
1595 | struct inode *ecryptfs_inode = ecryptfs_dentry->d_inode; | 1555 | struct inode *ecryptfs_inode = ecryptfs_dentry->d_inode; |
1596 | struct ecryptfs_crypt_stat *crypt_stat = | 1556 | struct ecryptfs_crypt_stat *crypt_stat = |
1597 | &ecryptfs_inode_to_private(ecryptfs_inode)->crypt_stat; | 1557 | &ecryptfs_inode_to_private(ecryptfs_inode)->crypt_stat; |
@@ -1616,11 +1576,13 @@ int ecryptfs_read_metadata(struct dentry *ecryptfs_dentry) | |||
1616 | ecryptfs_dentry, | 1576 | ecryptfs_dentry, |
1617 | ECRYPTFS_VALIDATE_HEADER_SIZE); | 1577 | ECRYPTFS_VALIDATE_HEADER_SIZE); |
1618 | if (rc) { | 1578 | if (rc) { |
1579 | /* metadata is not in the file header, so try xattrs */ | ||
1619 | memset(page_virt, 0, PAGE_CACHE_SIZE); | 1580 | memset(page_virt, 0, PAGE_CACHE_SIZE); |
1620 | rc = ecryptfs_read_xattr_region(page_virt, ecryptfs_inode); | 1581 | rc = ecryptfs_read_xattr_region(page_virt, ecryptfs_inode); |
1621 | if (rc) { | 1582 | if (rc) { |
1622 | printk(KERN_DEBUG "Valid eCryptfs headers not found in " | 1583 | printk(KERN_DEBUG "Valid eCryptfs headers not found in " |
1623 | "file header region or xattr region\n"); | 1584 | "file header region or xattr region, inode %lu\n", |
1585 | ecryptfs_inode->i_ino); | ||
1624 | rc = -EINVAL; | 1586 | rc = -EINVAL; |
1625 | goto out; | 1587 | goto out; |
1626 | } | 1588 | } |
@@ -1629,7 +1591,8 @@ int ecryptfs_read_metadata(struct dentry *ecryptfs_dentry) | |||
1629 | ECRYPTFS_DONT_VALIDATE_HEADER_SIZE); | 1591 | ECRYPTFS_DONT_VALIDATE_HEADER_SIZE); |
1630 | if (rc) { | 1592 | if (rc) { |
1631 | printk(KERN_DEBUG "Valid eCryptfs headers not found in " | 1593 | printk(KERN_DEBUG "Valid eCryptfs headers not found in " |
1632 | "file xattr region either\n"); | 1594 | "file xattr region either, inode %lu\n", |
1595 | ecryptfs_inode->i_ino); | ||
1633 | rc = -EINVAL; | 1596 | rc = -EINVAL; |
1634 | } | 1597 | } |
1635 | if (crypt_stat->mount_crypt_stat->flags | 1598 | if (crypt_stat->mount_crypt_stat->flags |
@@ -1640,7 +1603,8 @@ int ecryptfs_read_metadata(struct dentry *ecryptfs_dentry) | |||
1640 | "crypto metadata only in the extended attribute " | 1603 | "crypto metadata only in the extended attribute " |
1641 | "region, but eCryptfs was mounted without " | 1604 | "region, but eCryptfs was mounted without " |
1642 | "xattr support enabled. eCryptfs will not treat " | 1605 | "xattr support enabled. eCryptfs will not treat " |
1643 | "this like an encrypted file.\n"); | 1606 | "this like an encrypted file, inode %lu\n", |
1607 | ecryptfs_inode->i_ino); | ||
1644 | rc = -EINVAL; | 1608 | rc = -EINVAL; |
1645 | } | 1609 | } |
1646 | } | 1610 | } |
diff --git a/fs/ecryptfs/ecryptfs_kernel.h b/fs/ecryptfs/ecryptfs_kernel.h index a9f29b12fbf2..a2362df58ae8 100644 --- a/fs/ecryptfs/ecryptfs_kernel.h +++ b/fs/ecryptfs/ecryptfs_kernel.h | |||
@@ -151,6 +151,11 @@ ecryptfs_get_key_payload_data(struct key *key) | |||
151 | * dentry name */ | 151 | * dentry name */ |
152 | #define ECRYPTFS_TAG_73_PACKET_TYPE 0x49 /* FEK-encrypted filename as | 152 | #define ECRYPTFS_TAG_73_PACKET_TYPE 0x49 /* FEK-encrypted filename as |
153 | * metadata */ | 153 | * metadata */ |
154 | #define ECRYPTFS_MIN_PKT_LEN_SIZE 1 /* Min size to specify packet length */ | ||
155 | #define ECRYPTFS_MAX_PKT_LEN_SIZE 2 /* Pass at least this many bytes to | ||
156 | * ecryptfs_parse_packet_length() and | ||
157 | * ecryptfs_write_packet_length() | ||
158 | */ | ||
154 | /* Constraint: ECRYPTFS_FILENAME_MIN_RANDOM_PREPEND_BYTES >= | 159 | /* Constraint: ECRYPTFS_FILENAME_MIN_RANDOM_PREPEND_BYTES >= |
155 | * ECRYPTFS_MAX_IV_BYTES */ | 160 | * ECRYPTFS_MAX_IV_BYTES */ |
156 | #define ECRYPTFS_FILENAME_MIN_RANDOM_PREPEND_BYTES 16 | 161 | #define ECRYPTFS_FILENAME_MIN_RANDOM_PREPEND_BYTES 16 |
diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c index 19a8ca4ab1dd..19892d7d2ed1 100644 --- a/fs/ecryptfs/inode.c +++ b/fs/ecryptfs/inode.c | |||
@@ -822,18 +822,6 @@ static int truncate_upper(struct dentry *dentry, struct iattr *ia, | |||
822 | size_t num_zeros = (PAGE_CACHE_SIZE | 822 | size_t num_zeros = (PAGE_CACHE_SIZE |
823 | - (ia->ia_size & ~PAGE_CACHE_MASK)); | 823 | - (ia->ia_size & ~PAGE_CACHE_MASK)); |
824 | 824 | ||
825 | |||
826 | /* | ||
827 | * XXX(truncate) this should really happen at the begginning | ||
828 | * of ->setattr. But the code is too messy to that as part | ||
829 | * of a larger patch. ecryptfs is also totally missing out | ||
830 | * on the inode_change_ok check at the beginning of | ||
831 | * ->setattr while would include this. | ||
832 | */ | ||
833 | rc = inode_newsize_ok(inode, ia->ia_size); | ||
834 | if (rc) | ||
835 | goto out; | ||
836 | |||
837 | if (!(crypt_stat->flags & ECRYPTFS_ENCRYPTED)) { | 825 | if (!(crypt_stat->flags & ECRYPTFS_ENCRYPTED)) { |
838 | truncate_setsize(inode, ia->ia_size); | 826 | truncate_setsize(inode, ia->ia_size); |
839 | lower_ia->ia_size = ia->ia_size; | 827 | lower_ia->ia_size = ia->ia_size; |
@@ -883,6 +871,28 @@ out: | |||
883 | return rc; | 871 | return rc; |
884 | } | 872 | } |
885 | 873 | ||
874 | static int ecryptfs_inode_newsize_ok(struct inode *inode, loff_t offset) | ||
875 | { | ||
876 | struct ecryptfs_crypt_stat *crypt_stat; | ||
877 | loff_t lower_oldsize, lower_newsize; | ||
878 | |||
879 | crypt_stat = &ecryptfs_inode_to_private(inode)->crypt_stat; | ||
880 | lower_oldsize = upper_size_to_lower_size(crypt_stat, | ||
881 | i_size_read(inode)); | ||
882 | lower_newsize = upper_size_to_lower_size(crypt_stat, offset); | ||
883 | if (lower_newsize > lower_oldsize) { | ||
884 | /* | ||
885 | * The eCryptfs inode and the new *lower* size are mixed here | ||
886 | * because we may not have the lower i_mutex held and/or it may | ||
887 | * not be appropriate to call inode_newsize_ok() with inodes | ||
888 | * from other filesystems. | ||
889 | */ | ||
890 | return inode_newsize_ok(inode, lower_newsize); | ||
891 | } | ||
892 | |||
893 | return 0; | ||
894 | } | ||
895 | |||
886 | /** | 896 | /** |
887 | * ecryptfs_truncate | 897 | * ecryptfs_truncate |
888 | * @dentry: The ecryptfs layer dentry | 898 | * @dentry: The ecryptfs layer dentry |
@@ -899,6 +909,10 @@ int ecryptfs_truncate(struct dentry *dentry, loff_t new_length) | |||
899 | struct iattr lower_ia = { .ia_valid = 0 }; | 909 | struct iattr lower_ia = { .ia_valid = 0 }; |
900 | int rc; | 910 | int rc; |
901 | 911 | ||
912 | rc = ecryptfs_inode_newsize_ok(dentry->d_inode, new_length); | ||
913 | if (rc) | ||
914 | return rc; | ||
915 | |||
902 | rc = truncate_upper(dentry, &ia, &lower_ia); | 916 | rc = truncate_upper(dentry, &ia, &lower_ia); |
903 | if (!rc && lower_ia.ia_valid & ATTR_SIZE) { | 917 | if (!rc && lower_ia.ia_valid & ATTR_SIZE) { |
904 | struct dentry *lower_dentry = ecryptfs_dentry_to_lower(dentry); | 918 | struct dentry *lower_dentry = ecryptfs_dentry_to_lower(dentry); |
@@ -978,6 +992,16 @@ static int ecryptfs_setattr(struct dentry *dentry, struct iattr *ia) | |||
978 | } | 992 | } |
979 | } | 993 | } |
980 | mutex_unlock(&crypt_stat->cs_mutex); | 994 | mutex_unlock(&crypt_stat->cs_mutex); |
995 | |||
996 | rc = inode_change_ok(inode, ia); | ||
997 | if (rc) | ||
998 | goto out; | ||
999 | if (ia->ia_valid & ATTR_SIZE) { | ||
1000 | rc = ecryptfs_inode_newsize_ok(inode, ia->ia_size); | ||
1001 | if (rc) | ||
1002 | goto out; | ||
1003 | } | ||
1004 | |||
981 | if (S_ISREG(inode->i_mode)) { | 1005 | if (S_ISREG(inode->i_mode)) { |
982 | rc = filemap_write_and_wait(inode->i_mapping); | 1006 | rc = filemap_write_and_wait(inode->i_mapping); |
983 | if (rc) | 1007 | if (rc) |
diff --git a/fs/ecryptfs/keystore.c b/fs/ecryptfs/keystore.c index ac1ad48c2376..8e3b943e330f 100644 --- a/fs/ecryptfs/keystore.c +++ b/fs/ecryptfs/keystore.c | |||
@@ -109,7 +109,7 @@ int ecryptfs_parse_packet_length(unsigned char *data, size_t *size, | |||
109 | (*size) += ((unsigned char)(data[1]) + 192); | 109 | (*size) += ((unsigned char)(data[1]) + 192); |
110 | (*length_size) = 2; | 110 | (*length_size) = 2; |
111 | } else if (data[0] == 255) { | 111 | } else if (data[0] == 255) { |
112 | /* Five-byte length; we're not supposed to see this */ | 112 | /* If support is added, adjust ECRYPTFS_MAX_PKT_LEN_SIZE */ |
113 | ecryptfs_printk(KERN_ERR, "Five-byte packet length not " | 113 | ecryptfs_printk(KERN_ERR, "Five-byte packet length not " |
114 | "supported\n"); | 114 | "supported\n"); |
115 | rc = -EINVAL; | 115 | rc = -EINVAL; |
@@ -126,7 +126,7 @@ out: | |||
126 | /** | 126 | /** |
127 | * ecryptfs_write_packet_length | 127 | * ecryptfs_write_packet_length |
128 | * @dest: The byte array target into which to write the length. Must | 128 | * @dest: The byte array target into which to write the length. Must |
129 | * have at least 5 bytes allocated. | 129 | * have at least ECRYPTFS_MAX_PKT_LEN_SIZE bytes allocated. |
130 | * @size: The length to write. | 130 | * @size: The length to write. |
131 | * @packet_size_length: The number of bytes used to encode the packet | 131 | * @packet_size_length: The number of bytes used to encode the packet |
132 | * length is written to this address. | 132 | * length is written to this address. |
@@ -146,6 +146,7 @@ int ecryptfs_write_packet_length(char *dest, size_t size, | |||
146 | dest[1] = ((size - 192) % 256); | 146 | dest[1] = ((size - 192) % 256); |
147 | (*packet_size_length) = 2; | 147 | (*packet_size_length) = 2; |
148 | } else { | 148 | } else { |
149 | /* If support is added, adjust ECRYPTFS_MAX_PKT_LEN_SIZE */ | ||
149 | rc = -EINVAL; | 150 | rc = -EINVAL; |
150 | ecryptfs_printk(KERN_WARNING, | 151 | ecryptfs_printk(KERN_WARNING, |
151 | "Unsupported packet size: [%zd]\n", size); | 152 | "Unsupported packet size: [%zd]\n", size); |
diff --git a/fs/ecryptfs/miscdev.c b/fs/ecryptfs/miscdev.c index 940a82e63dc3..349209dc6a91 100644 --- a/fs/ecryptfs/miscdev.c +++ b/fs/ecryptfs/miscdev.c | |||
@@ -218,6 +218,29 @@ out_unlock: | |||
218 | return rc; | 218 | return rc; |
219 | } | 219 | } |
220 | 220 | ||
221 | /* | ||
222 | * miscdevfs packet format: | ||
223 | * Octet 0: Type | ||
224 | * Octets 1-4: network byte order msg_ctx->counter | ||
225 | * Octets 5-N0: Size of struct ecryptfs_message to follow | ||
226 | * Octets N0-N1: struct ecryptfs_message (including data) | ||
227 | * | ||
228 | * Octets 5-N1 not written if the packet type does not include a message | ||
229 | */ | ||
230 | #define PKT_TYPE_SIZE 1 | ||
231 | #define PKT_CTR_SIZE 4 | ||
232 | #define MIN_NON_MSG_PKT_SIZE (PKT_TYPE_SIZE + PKT_CTR_SIZE) | ||
233 | #define MIN_MSG_PKT_SIZE (PKT_TYPE_SIZE + PKT_CTR_SIZE \ | ||
234 | + ECRYPTFS_MIN_PKT_LEN_SIZE) | ||
235 | /* 4 + ECRYPTFS_MAX_ENCRYPTED_KEY_BYTES comes from tag 65 packet format */ | ||
236 | #define MAX_MSG_PKT_SIZE (PKT_TYPE_SIZE + PKT_CTR_SIZE \ | ||
237 | + ECRYPTFS_MAX_PKT_LEN_SIZE \ | ||
238 | + sizeof(struct ecryptfs_message) \ | ||
239 | + 4 + ECRYPTFS_MAX_ENCRYPTED_KEY_BYTES) | ||
240 | #define PKT_TYPE_OFFSET 0 | ||
241 | #define PKT_CTR_OFFSET PKT_TYPE_SIZE | ||
242 | #define PKT_LEN_OFFSET (PKT_TYPE_SIZE + PKT_CTR_SIZE) | ||
243 | |||
221 | /** | 244 | /** |
222 | * ecryptfs_miscdev_read - format and send message from queue | 245 | * ecryptfs_miscdev_read - format and send message from queue |
223 | * @file: fs/ecryptfs/euid miscdevfs handle (ignored) | 246 | * @file: fs/ecryptfs/euid miscdevfs handle (ignored) |
@@ -237,7 +260,7 @@ ecryptfs_miscdev_read(struct file *file, char __user *buf, size_t count, | |||
237 | struct ecryptfs_daemon *daemon; | 260 | struct ecryptfs_daemon *daemon; |
238 | struct ecryptfs_msg_ctx *msg_ctx; | 261 | struct ecryptfs_msg_ctx *msg_ctx; |
239 | size_t packet_length_size; | 262 | size_t packet_length_size; |
240 | char packet_length[3]; | 263 | char packet_length[ECRYPTFS_MAX_PKT_LEN_SIZE]; |
241 | size_t i; | 264 | size_t i; |
242 | size_t total_length; | 265 | size_t total_length; |
243 | uid_t euid = current_euid(); | 266 | uid_t euid = current_euid(); |
@@ -305,15 +328,8 @@ check_list: | |||
305 | packet_length_size = 0; | 328 | packet_length_size = 0; |
306 | msg_ctx->msg_size = 0; | 329 | msg_ctx->msg_size = 0; |
307 | } | 330 | } |
308 | /* miscdevfs packet format: | 331 | total_length = (PKT_TYPE_SIZE + PKT_CTR_SIZE + packet_length_size |
309 | * Octet 0: Type | 332 | + msg_ctx->msg_size); |
310 | * Octets 1-4: network byte order msg_ctx->counter | ||
311 | * Octets 5-N0: Size of struct ecryptfs_message to follow | ||
312 | * Octets N0-N1: struct ecryptfs_message (including data) | ||
313 | * | ||
314 | * Octets 5-N1 not written if the packet type does not | ||
315 | * include a message */ | ||
316 | total_length = (1 + 4 + packet_length_size + msg_ctx->msg_size); | ||
317 | if (count < total_length) { | 333 | if (count < total_length) { |
318 | rc = 0; | 334 | rc = 0; |
319 | printk(KERN_WARNING "%s: Only given user buffer of " | 335 | printk(KERN_WARNING "%s: Only given user buffer of " |
@@ -324,9 +340,10 @@ check_list: | |||
324 | rc = -EFAULT; | 340 | rc = -EFAULT; |
325 | if (put_user(msg_ctx->type, buf)) | 341 | if (put_user(msg_ctx->type, buf)) |
326 | goto out_unlock_msg_ctx; | 342 | goto out_unlock_msg_ctx; |
327 | if (put_user(cpu_to_be32(msg_ctx->counter), (__be32 __user *)(buf + 1))) | 343 | if (put_user(cpu_to_be32(msg_ctx->counter), |
344 | (__be32 __user *)(&buf[PKT_CTR_OFFSET]))) | ||
328 | goto out_unlock_msg_ctx; | 345 | goto out_unlock_msg_ctx; |
329 | i = 5; | 346 | i = PKT_TYPE_SIZE + PKT_CTR_SIZE; |
330 | if (msg_ctx->msg) { | 347 | if (msg_ctx->msg) { |
331 | if (copy_to_user(&buf[i], packet_length, packet_length_size)) | 348 | if (copy_to_user(&buf[i], packet_length, packet_length_size)) |
332 | goto out_unlock_msg_ctx; | 349 | goto out_unlock_msg_ctx; |
@@ -391,12 +408,6 @@ out: | |||
391 | * @count: Amount of data in @buf | 408 | * @count: Amount of data in @buf |
392 | * @ppos: Pointer to offset in file (ignored) | 409 | * @ppos: Pointer to offset in file (ignored) |
393 | * | 410 | * |
394 | * miscdevfs packet format: | ||
395 | * Octet 0: Type | ||
396 | * Octets 1-4: network byte order msg_ctx->counter (0's for non-response) | ||
397 | * Octets 5-N0: Size of struct ecryptfs_message to follow | ||
398 | * Octets N0-N1: struct ecryptfs_message (including data) | ||
399 | * | ||
400 | * Returns the number of bytes read from @buf | 411 | * Returns the number of bytes read from @buf |
401 | */ | 412 | */ |
402 | static ssize_t | 413 | static ssize_t |
@@ -405,60 +416,78 @@ ecryptfs_miscdev_write(struct file *file, const char __user *buf, | |||
405 | { | 416 | { |
406 | __be32 counter_nbo; | 417 | __be32 counter_nbo; |
407 | u32 seq; | 418 | u32 seq; |
408 | size_t packet_size, packet_size_length, i; | 419 | size_t packet_size, packet_size_length; |
409 | ssize_t sz = 0; | ||
410 | char *data; | 420 | char *data; |
411 | uid_t euid = current_euid(); | 421 | uid_t euid = current_euid(); |
412 | int rc; | 422 | unsigned char packet_size_peek[ECRYPTFS_MAX_PKT_LEN_SIZE]; |
423 | ssize_t rc; | ||
413 | 424 | ||
414 | if (count == 0) | 425 | if (count == 0) { |
415 | goto out; | 426 | return 0; |
427 | } else if (count == MIN_NON_MSG_PKT_SIZE) { | ||
428 | /* Likely a harmless MSG_HELO or MSG_QUIT - no packet length */ | ||
429 | goto memdup; | ||
430 | } else if (count < MIN_MSG_PKT_SIZE || count > MAX_MSG_PKT_SIZE) { | ||
431 | printk(KERN_WARNING "%s: Acceptable packet size range is " | ||
432 | "[%d-%lu], but amount of data written is [%zu].", | ||
433 | __func__, MIN_MSG_PKT_SIZE, MAX_MSG_PKT_SIZE, count); | ||
434 | return -EINVAL; | ||
435 | } | ||
436 | |||
437 | if (copy_from_user(packet_size_peek, &buf[PKT_LEN_OFFSET], | ||
438 | sizeof(packet_size_peek))) { | ||
439 | printk(KERN_WARNING "%s: Error while inspecting packet size\n", | ||
440 | __func__); | ||
441 | return -EFAULT; | ||
442 | } | ||
416 | 443 | ||
444 | rc = ecryptfs_parse_packet_length(packet_size_peek, &packet_size, | ||
445 | &packet_size_length); | ||
446 | if (rc) { | ||
447 | printk(KERN_WARNING "%s: Error parsing packet length; " | ||
448 | "rc = [%zd]\n", __func__, rc); | ||
449 | return rc; | ||
450 | } | ||
451 | |||
452 | if ((PKT_TYPE_SIZE + PKT_CTR_SIZE + packet_size_length + packet_size) | ||
453 | != count) { | ||
454 | printk(KERN_WARNING "%s: Invalid packet size [%zu]\n", __func__, | ||
455 | packet_size); | ||
456 | return -EINVAL; | ||
457 | } | ||
458 | |||
459 | memdup: | ||
417 | data = memdup_user(buf, count); | 460 | data = memdup_user(buf, count); |
418 | if (IS_ERR(data)) { | 461 | if (IS_ERR(data)) { |
419 | printk(KERN_ERR "%s: memdup_user returned error [%ld]\n", | 462 | printk(KERN_ERR "%s: memdup_user returned error [%ld]\n", |
420 | __func__, PTR_ERR(data)); | 463 | __func__, PTR_ERR(data)); |
421 | goto out; | 464 | return PTR_ERR(data); |
422 | } | 465 | } |
423 | sz = count; | 466 | switch (data[PKT_TYPE_OFFSET]) { |
424 | i = 0; | ||
425 | switch (data[i++]) { | ||
426 | case ECRYPTFS_MSG_RESPONSE: | 467 | case ECRYPTFS_MSG_RESPONSE: |
427 | if (count < (1 + 4 + 1 + sizeof(struct ecryptfs_message))) { | 468 | if (count < (MIN_MSG_PKT_SIZE |
469 | + sizeof(struct ecryptfs_message))) { | ||
428 | printk(KERN_WARNING "%s: Minimum acceptable packet " | 470 | printk(KERN_WARNING "%s: Minimum acceptable packet " |
429 | "size is [%zd], but amount of data written is " | 471 | "size is [%zd], but amount of data written is " |
430 | "only [%zd]. Discarding response packet.\n", | 472 | "only [%zd]. Discarding response packet.\n", |
431 | __func__, | 473 | __func__, |
432 | (1 + 4 + 1 + sizeof(struct ecryptfs_message)), | 474 | (MIN_MSG_PKT_SIZE |
433 | count); | 475 | + sizeof(struct ecryptfs_message)), count); |
476 | rc = -EINVAL; | ||
434 | goto out_free; | 477 | goto out_free; |
435 | } | 478 | } |
436 | memcpy(&counter_nbo, &data[i], 4); | 479 | memcpy(&counter_nbo, &data[PKT_CTR_OFFSET], PKT_CTR_SIZE); |
437 | seq = be32_to_cpu(counter_nbo); | 480 | seq = be32_to_cpu(counter_nbo); |
438 | i += 4; | 481 | rc = ecryptfs_miscdev_response( |
439 | rc = ecryptfs_parse_packet_length(&data[i], &packet_size, | 482 | &data[PKT_LEN_OFFSET + packet_size_length], |
440 | &packet_size_length); | 483 | packet_size, euid, current_user_ns(), |
484 | task_pid(current), seq); | ||
441 | if (rc) { | 485 | if (rc) { |
442 | printk(KERN_WARNING "%s: Error parsing packet length; " | ||
443 | "rc = [%d]\n", __func__, rc); | ||
444 | goto out_free; | ||
445 | } | ||
446 | i += packet_size_length; | ||
447 | if ((1 + 4 + packet_size_length + packet_size) != count) { | ||
448 | printk(KERN_WARNING "%s: (1 + packet_size_length([%zd])" | ||
449 | " + packet_size([%zd]))([%zd]) != " | ||
450 | "count([%zd]). Invalid packet format.\n", | ||
451 | __func__, packet_size_length, packet_size, | ||
452 | (1 + packet_size_length + packet_size), count); | ||
453 | goto out_free; | ||
454 | } | ||
455 | rc = ecryptfs_miscdev_response(&data[i], packet_size, | ||
456 | euid, current_user_ns(), | ||
457 | task_pid(current), seq); | ||
458 | if (rc) | ||
459 | printk(KERN_WARNING "%s: Failed to deliver miscdev " | 486 | printk(KERN_WARNING "%s: Failed to deliver miscdev " |
460 | "response to requesting operation; rc = [%d]\n", | 487 | "response to requesting operation; rc = [%zd]\n", |
461 | __func__, rc); | 488 | __func__, rc); |
489 | goto out_free; | ||
490 | } | ||
462 | break; | 491 | break; |
463 | case ECRYPTFS_MSG_HELO: | 492 | case ECRYPTFS_MSG_HELO: |
464 | case ECRYPTFS_MSG_QUIT: | 493 | case ECRYPTFS_MSG_QUIT: |
@@ -467,12 +496,13 @@ ecryptfs_miscdev_write(struct file *file, const char __user *buf, | |||
467 | ecryptfs_printk(KERN_WARNING, "Dropping miscdev " | 496 | ecryptfs_printk(KERN_WARNING, "Dropping miscdev " |
468 | "message of unrecognized type [%d]\n", | 497 | "message of unrecognized type [%d]\n", |
469 | data[0]); | 498 | data[0]); |
470 | break; | 499 | rc = -EINVAL; |
500 | goto out_free; | ||
471 | } | 501 | } |
502 | rc = count; | ||
472 | out_free: | 503 | out_free: |
473 | kfree(data); | 504 | kfree(data); |
474 | out: | 505 | return rc; |
475 | return sz; | ||
476 | } | 506 | } |
477 | 507 | ||
478 | 508 | ||
diff --git a/fs/ecryptfs/mmap.c b/fs/ecryptfs/mmap.c index 6a44148c5fb9..10ec695ccd68 100644 --- a/fs/ecryptfs/mmap.c +++ b/fs/ecryptfs/mmap.c | |||
@@ -57,6 +57,10 @@ struct page *ecryptfs_get_locked_page(struct inode *inode, loff_t index) | |||
57 | * @page: Page that is locked before this call is made | 57 | * @page: Page that is locked before this call is made |
58 | * | 58 | * |
59 | * Returns zero on success; non-zero otherwise | 59 | * Returns zero on success; non-zero otherwise |
60 | * | ||
61 | * This is where we encrypt the data and pass the encrypted data to | ||
62 | * the lower filesystem. In OpenPGP-compatible mode, we operate on | ||
63 | * entire underlying packets. | ||
60 | */ | 64 | */ |
61 | static int ecryptfs_writepage(struct page *page, struct writeback_control *wbc) | 65 | static int ecryptfs_writepage(struct page *page, struct writeback_control *wbc) |
62 | { | 66 | { |
@@ -481,10 +485,6 @@ int ecryptfs_write_inode_size_to_metadata(struct inode *ecryptfs_inode) | |||
481 | * @copied: The amount of data copied | 485 | * @copied: The amount of data copied |
482 | * @page: The eCryptfs page | 486 | * @page: The eCryptfs page |
483 | * @fsdata: The fsdata (unused) | 487 | * @fsdata: The fsdata (unused) |
484 | * | ||
485 | * This is where we encrypt the data and pass the encrypted data to | ||
486 | * the lower filesystem. In OpenPGP-compatible mode, we operate on | ||
487 | * entire underlying packets. | ||
488 | */ | 488 | */ |
489 | static int ecryptfs_write_end(struct file *file, | 489 | static int ecryptfs_write_end(struct file *file, |
490 | struct address_space *mapping, | 490 | struct address_space *mapping, |
diff --git a/fs/ecryptfs/read_write.c b/fs/ecryptfs/read_write.c index 3745f7c2b9c2..5c0106f75775 100644 --- a/fs/ecryptfs/read_write.c +++ b/fs/ecryptfs/read_write.c | |||
@@ -130,13 +130,18 @@ int ecryptfs_write(struct inode *ecryptfs_inode, char *data, loff_t offset, | |||
130 | pgoff_t ecryptfs_page_idx = (pos >> PAGE_CACHE_SHIFT); | 130 | pgoff_t ecryptfs_page_idx = (pos >> PAGE_CACHE_SHIFT); |
131 | size_t start_offset_in_page = (pos & ~PAGE_CACHE_MASK); | 131 | size_t start_offset_in_page = (pos & ~PAGE_CACHE_MASK); |
132 | size_t num_bytes = (PAGE_CACHE_SIZE - start_offset_in_page); | 132 | size_t num_bytes = (PAGE_CACHE_SIZE - start_offset_in_page); |
133 | size_t total_remaining_bytes = ((offset + size) - pos); | 133 | loff_t total_remaining_bytes = ((offset + size) - pos); |
134 | |||
135 | if (fatal_signal_pending(current)) { | ||
136 | rc = -EINTR; | ||
137 | break; | ||
138 | } | ||
134 | 139 | ||
135 | if (num_bytes > total_remaining_bytes) | 140 | if (num_bytes > total_remaining_bytes) |
136 | num_bytes = total_remaining_bytes; | 141 | num_bytes = total_remaining_bytes; |
137 | if (pos < offset) { | 142 | if (pos < offset) { |
138 | /* remaining zeros to write, up to destination offset */ | 143 | /* remaining zeros to write, up to destination offset */ |
139 | size_t total_remaining_zeros = (offset - pos); | 144 | loff_t total_remaining_zeros = (offset - pos); |
140 | 145 | ||
141 | if (num_bytes > total_remaining_zeros) | 146 | if (num_bytes > total_remaining_zeros) |
142 | num_bytes = total_remaining_zeros; | 147 | num_bytes = total_remaining_zeros; |
@@ -193,15 +198,19 @@ int ecryptfs_write(struct inode *ecryptfs_inode, char *data, loff_t offset, | |||
193 | } | 198 | } |
194 | pos += num_bytes; | 199 | pos += num_bytes; |
195 | } | 200 | } |
196 | if ((offset + size) > ecryptfs_file_size) { | 201 | if (pos > ecryptfs_file_size) { |
197 | i_size_write(ecryptfs_inode, (offset + size)); | 202 | i_size_write(ecryptfs_inode, pos); |
198 | if (crypt_stat->flags & ECRYPTFS_ENCRYPTED) { | 203 | if (crypt_stat->flags & ECRYPTFS_ENCRYPTED) { |
199 | rc = ecryptfs_write_inode_size_to_metadata( | 204 | int rc2; |
205 | |||
206 | rc2 = ecryptfs_write_inode_size_to_metadata( | ||
200 | ecryptfs_inode); | 207 | ecryptfs_inode); |
201 | if (rc) { | 208 | if (rc2) { |
202 | printk(KERN_ERR "Problem with " | 209 | printk(KERN_ERR "Problem with " |
203 | "ecryptfs_write_inode_size_to_metadata; " | 210 | "ecryptfs_write_inode_size_to_metadata; " |
204 | "rc = [%d]\n", rc); | 211 | "rc = [%d]\n", rc2); |
212 | if (!rc) | ||
213 | rc = rc2; | ||
205 | goto out; | 214 | goto out; |
206 | } | 215 | } |
207 | } | 216 | } |
@@ -273,76 +282,3 @@ int ecryptfs_read_lower_page_segment(struct page *page_for_ecryptfs, | |||
273 | flush_dcache_page(page_for_ecryptfs); | 282 | flush_dcache_page(page_for_ecryptfs); |
274 | return rc; | 283 | return rc; |
275 | } | 284 | } |
276 | |||
277 | #if 0 | ||
278 | /** | ||
279 | * ecryptfs_read | ||
280 | * @data: The virtual address into which to write the data read (and | ||
281 | * possibly decrypted) from the lower file | ||
282 | * @offset: The offset in the decrypted view of the file from which to | ||
283 | * read into @data | ||
284 | * @size: The number of bytes to read into @data | ||
285 | * @ecryptfs_file: The eCryptfs file from which to read | ||
286 | * | ||
287 | * Read an arbitrary amount of data from an arbitrary location in the | ||
288 | * eCryptfs page cache. This is done on an extent-by-extent basis; | ||
289 | * individual extents are decrypted and read from the lower page | ||
290 | * cache (via VFS reads). This function takes care of all the | ||
291 | * address translation to locations in the lower filesystem. | ||
292 | * | ||
293 | * Returns zero on success; non-zero otherwise | ||
294 | */ | ||
295 | int ecryptfs_read(char *data, loff_t offset, size_t size, | ||
296 | struct file *ecryptfs_file) | ||
297 | { | ||
298 | struct inode *ecryptfs_inode = ecryptfs_file->f_dentry->d_inode; | ||
299 | struct page *ecryptfs_page; | ||
300 | char *ecryptfs_page_virt; | ||
301 | loff_t ecryptfs_file_size = i_size_read(ecryptfs_inode); | ||
302 | loff_t data_offset = 0; | ||
303 | loff_t pos; | ||
304 | int rc = 0; | ||
305 | |||
306 | if ((offset + size) > ecryptfs_file_size) { | ||
307 | rc = -EINVAL; | ||
308 | printk(KERN_ERR "%s: Attempt to read data past the end of the " | ||
309 | "file; offset = [%lld]; size = [%td]; " | ||
310 | "ecryptfs_file_size = [%lld]\n", | ||
311 | __func__, offset, size, ecryptfs_file_size); | ||
312 | goto out; | ||
313 | } | ||
314 | pos = offset; | ||
315 | while (pos < (offset + size)) { | ||
316 | pgoff_t ecryptfs_page_idx = (pos >> PAGE_CACHE_SHIFT); | ||
317 | size_t start_offset_in_page = (pos & ~PAGE_CACHE_MASK); | ||
318 | size_t num_bytes = (PAGE_CACHE_SIZE - start_offset_in_page); | ||
319 | size_t total_remaining_bytes = ((offset + size) - pos); | ||
320 | |||
321 | if (num_bytes > total_remaining_bytes) | ||
322 | num_bytes = total_remaining_bytes; | ||
323 | ecryptfs_page = ecryptfs_get_locked_page(ecryptfs_inode, | ||
324 | ecryptfs_page_idx); | ||
325 | if (IS_ERR(ecryptfs_page)) { | ||
326 | rc = PTR_ERR(ecryptfs_page); | ||
327 | printk(KERN_ERR "%s: Error getting page at " | ||
328 | "index [%ld] from eCryptfs inode " | ||
329 | "mapping; rc = [%d]\n", __func__, | ||
330 | ecryptfs_page_idx, rc); | ||
331 | goto out; | ||
332 | } | ||
333 | ecryptfs_page_virt = kmap_atomic(ecryptfs_page, KM_USER0); | ||
334 | memcpy((data + data_offset), | ||
335 | ((char *)ecryptfs_page_virt + start_offset_in_page), | ||
336 | num_bytes); | ||
337 | kunmap_atomic(ecryptfs_page_virt, KM_USER0); | ||
338 | flush_dcache_page(ecryptfs_page); | ||
339 | SetPageUptodate(ecryptfs_page); | ||
340 | unlock_page(ecryptfs_page); | ||
341 | page_cache_release(ecryptfs_page); | ||
342 | pos += num_bytes; | ||
343 | data_offset += num_bytes; | ||
344 | } | ||
345 | out: | ||
346 | return rc; | ||
347 | } | ||
348 | #endif /* 0 */ | ||
diff --git a/fs/ext2/ioctl.c b/fs/ext2/ioctl.c index 1089f760c847..2de655f5d625 100644 --- a/fs/ext2/ioctl.c +++ b/fs/ext2/ioctl.c | |||
@@ -77,10 +77,11 @@ long ext2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | |||
77 | flags = flags & EXT2_FL_USER_MODIFIABLE; | 77 | flags = flags & EXT2_FL_USER_MODIFIABLE; |
78 | flags |= oldflags & ~EXT2_FL_USER_MODIFIABLE; | 78 | flags |= oldflags & ~EXT2_FL_USER_MODIFIABLE; |
79 | ei->i_flags = flags; | 79 | ei->i_flags = flags; |
80 | mutex_unlock(&inode->i_mutex); | ||
81 | 80 | ||
82 | ext2_set_inode_flags(inode); | 81 | ext2_set_inode_flags(inode); |
83 | inode->i_ctime = CURRENT_TIME_SEC; | 82 | inode->i_ctime = CURRENT_TIME_SEC; |
83 | mutex_unlock(&inode->i_mutex); | ||
84 | |||
84 | mark_inode_dirty(inode); | 85 | mark_inode_dirty(inode); |
85 | setflags_out: | 86 | setflags_out: |
86 | mnt_drop_write_file(filp); | 87 | mnt_drop_write_file(filp); |
@@ -88,20 +89,29 @@ setflags_out: | |||
88 | } | 89 | } |
89 | case EXT2_IOC_GETVERSION: | 90 | case EXT2_IOC_GETVERSION: |
90 | return put_user(inode->i_generation, (int __user *) arg); | 91 | return put_user(inode->i_generation, (int __user *) arg); |
91 | case EXT2_IOC_SETVERSION: | 92 | case EXT2_IOC_SETVERSION: { |
93 | __u32 generation; | ||
94 | |||
92 | if (!inode_owner_or_capable(inode)) | 95 | if (!inode_owner_or_capable(inode)) |
93 | return -EPERM; | 96 | return -EPERM; |
94 | ret = mnt_want_write_file(filp); | 97 | ret = mnt_want_write_file(filp); |
95 | if (ret) | 98 | if (ret) |
96 | return ret; | 99 | return ret; |
97 | if (get_user(inode->i_generation, (int __user *) arg)) { | 100 | if (get_user(generation, (int __user *) arg)) { |
98 | ret = -EFAULT; | 101 | ret = -EFAULT; |
99 | } else { | 102 | goto setversion_out; |
100 | inode->i_ctime = CURRENT_TIME_SEC; | ||
101 | mark_inode_dirty(inode); | ||
102 | } | 103 | } |
104 | |||
105 | mutex_lock(&inode->i_mutex); | ||
106 | inode->i_ctime = CURRENT_TIME_SEC; | ||
107 | inode->i_generation = generation; | ||
108 | mutex_unlock(&inode->i_mutex); | ||
109 | |||
110 | mark_inode_dirty(inode); | ||
111 | setversion_out: | ||
103 | mnt_drop_write_file(filp); | 112 | mnt_drop_write_file(filp); |
104 | return ret; | 113 | return ret; |
114 | } | ||
105 | case EXT2_IOC_GETRSVSZ: | 115 | case EXT2_IOC_GETRSVSZ: |
106 | if (test_opt(inode->i_sb, RESERVATION) | 116 | if (test_opt(inode->i_sb, RESERVATION) |
107 | && S_ISREG(inode->i_mode) | 117 | && S_ISREG(inode->i_mode) |
diff --git a/fs/jbd/checkpoint.c b/fs/jbd/checkpoint.c index 5d1a00a5041b..05f0754f2b46 100644 --- a/fs/jbd/checkpoint.c +++ b/fs/jbd/checkpoint.c | |||
@@ -453,8 +453,6 @@ out: | |||
453 | * | 453 | * |
454 | * Return <0 on error, 0 on success, 1 if there was nothing to clean up. | 454 | * Return <0 on error, 0 on success, 1 if there was nothing to clean up. |
455 | * | 455 | * |
456 | * Called with the journal lock held. | ||
457 | * | ||
458 | * This is the only part of the journaling code which really needs to be | 456 | * This is the only part of the journaling code which really needs to be |
459 | * aware of transaction aborts. Checkpointing involves writing to the | 457 | * aware of transaction aborts. Checkpointing involves writing to the |
460 | * main filesystem area rather than to the journal, so it can proceed | 458 | * main filesystem area rather than to the journal, so it can proceed |
@@ -472,13 +470,14 @@ int cleanup_journal_tail(journal_t *journal) | |||
472 | if (is_journal_aborted(journal)) | 470 | if (is_journal_aborted(journal)) |
473 | return 1; | 471 | return 1; |
474 | 472 | ||
475 | /* OK, work out the oldest transaction remaining in the log, and | 473 | /* |
474 | * OK, work out the oldest transaction remaining in the log, and | ||
476 | * the log block it starts at. | 475 | * the log block it starts at. |
477 | * | 476 | * |
478 | * If the log is now empty, we need to work out which is the | 477 | * If the log is now empty, we need to work out which is the |
479 | * next transaction ID we will write, and where it will | 478 | * next transaction ID we will write, and where it will |
480 | * start. */ | 479 | * start. |
481 | 480 | */ | |
482 | spin_lock(&journal->j_state_lock); | 481 | spin_lock(&journal->j_state_lock); |
483 | spin_lock(&journal->j_list_lock); | 482 | spin_lock(&journal->j_list_lock); |
484 | transaction = journal->j_checkpoint_transactions; | 483 | transaction = journal->j_checkpoint_transactions; |
@@ -504,7 +503,25 @@ int cleanup_journal_tail(journal_t *journal) | |||
504 | spin_unlock(&journal->j_state_lock); | 503 | spin_unlock(&journal->j_state_lock); |
505 | return 1; | 504 | return 1; |
506 | } | 505 | } |
506 | spin_unlock(&journal->j_state_lock); | ||
507 | |||
508 | /* | ||
509 | * We need to make sure that any blocks that were recently written out | ||
510 | * --- perhaps by log_do_checkpoint() --- are flushed out before we | ||
511 | * drop the transactions from the journal. It's unlikely this will be | ||
512 | * necessary, especially with an appropriately sized journal, but we | ||
513 | * need this to guarantee correctness. Fortunately | ||
514 | * cleanup_journal_tail() doesn't get called all that often. | ||
515 | */ | ||
516 | if (journal->j_flags & JFS_BARRIER) | ||
517 | blkdev_issue_flush(journal->j_fs_dev, GFP_KERNEL, NULL); | ||
507 | 518 | ||
519 | spin_lock(&journal->j_state_lock); | ||
520 | if (!tid_gt(first_tid, journal->j_tail_sequence)) { | ||
521 | spin_unlock(&journal->j_state_lock); | ||
522 | /* Someone else cleaned up journal so return 0 */ | ||
523 | return 0; | ||
524 | } | ||
508 | /* OK, update the superblock to recover the freed space. | 525 | /* OK, update the superblock to recover the freed space. |
509 | * Physical blocks come first: have we wrapped beyond the end of | 526 | * Physical blocks come first: have we wrapped beyond the end of |
510 | * the log? */ | 527 | * the log? */ |
diff --git a/fs/jbd/recovery.c b/fs/jbd/recovery.c index 5b43e96788e6..008bf062fd26 100644 --- a/fs/jbd/recovery.c +++ b/fs/jbd/recovery.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/fs.h> | 20 | #include <linux/fs.h> |
21 | #include <linux/jbd.h> | 21 | #include <linux/jbd.h> |
22 | #include <linux/errno.h> | 22 | #include <linux/errno.h> |
23 | #include <linux/blkdev.h> | ||
23 | #endif | 24 | #endif |
24 | 25 | ||
25 | /* | 26 | /* |
@@ -263,6 +264,9 @@ int journal_recover(journal_t *journal) | |||
263 | err2 = sync_blockdev(journal->j_fs_dev); | 264 | err2 = sync_blockdev(journal->j_fs_dev); |
264 | if (!err) | 265 | if (!err) |
265 | err = err2; | 266 | err = err2; |
267 | /* Flush disk caches to get replayed data on the permanent storage */ | ||
268 | if (journal->j_flags & JFS_BARRIER) | ||
269 | blkdev_issue_flush(journal->j_fs_dev, GFP_KERNEL, NULL); | ||
266 | 270 | ||
267 | return err; | 271 | return err; |
268 | } | 272 | } |
diff --git a/fs/logfs/dir.c b/fs/logfs/dir.c index 501043e8966c..3de7a32cadbe 100644 --- a/fs/logfs/dir.c +++ b/fs/logfs/dir.c | |||
@@ -71,7 +71,7 @@ static int write_dir(struct inode *dir, struct logfs_disk_dentry *dd, | |||
71 | 71 | ||
72 | static int write_inode(struct inode *inode) | 72 | static int write_inode(struct inode *inode) |
73 | { | 73 | { |
74 | return __logfs_write_inode(inode, WF_LOCK); | 74 | return __logfs_write_inode(inode, NULL, WF_LOCK); |
75 | } | 75 | } |
76 | 76 | ||
77 | static s64 dir_seek_data(struct inode *inode, s64 pos) | 77 | static s64 dir_seek_data(struct inode *inode, s64 pos) |
diff --git a/fs/logfs/file.c b/fs/logfs/file.c index b548c87a86f1..3886cded283c 100644 --- a/fs/logfs/file.c +++ b/fs/logfs/file.c | |||
@@ -230,7 +230,9 @@ int logfs_fsync(struct file *file, loff_t start, loff_t end, int datasync) | |||
230 | return ret; | 230 | return ret; |
231 | 231 | ||
232 | mutex_lock(&inode->i_mutex); | 232 | mutex_lock(&inode->i_mutex); |
233 | logfs_get_wblocks(sb, NULL, WF_LOCK); | ||
233 | logfs_write_anchor(sb); | 234 | logfs_write_anchor(sb); |
235 | logfs_put_wblocks(sb, NULL, WF_LOCK); | ||
234 | mutex_unlock(&inode->i_mutex); | 236 | mutex_unlock(&inode->i_mutex); |
235 | 237 | ||
236 | return 0; | 238 | return 0; |
diff --git a/fs/logfs/gc.c b/fs/logfs/gc.c index caa4419285dc..d4efb061bdc5 100644 --- a/fs/logfs/gc.c +++ b/fs/logfs/gc.c | |||
@@ -367,7 +367,7 @@ static struct gc_candidate *get_candidate(struct super_block *sb) | |||
367 | int i, max_dist; | 367 | int i, max_dist; |
368 | struct gc_candidate *cand = NULL, *this; | 368 | struct gc_candidate *cand = NULL, *this; |
369 | 369 | ||
370 | max_dist = min(no_free_segments(sb), LOGFS_NO_AREAS); | 370 | max_dist = min(no_free_segments(sb), LOGFS_NO_AREAS - 1); |
371 | 371 | ||
372 | for (i = max_dist; i >= 0; i--) { | 372 | for (i = max_dist; i >= 0; i--) { |
373 | this = first_in_list(&super->s_low_list[i]); | 373 | this = first_in_list(&super->s_low_list[i]); |
diff --git a/fs/logfs/inode.c b/fs/logfs/inode.c index 388df1aa35e5..a422f42238b2 100644 --- a/fs/logfs/inode.c +++ b/fs/logfs/inode.c | |||
@@ -286,7 +286,7 @@ static int logfs_write_inode(struct inode *inode, struct writeback_control *wbc) | |||
286 | if (logfs_inode(inode)->li_flags & LOGFS_IF_STILLBORN) | 286 | if (logfs_inode(inode)->li_flags & LOGFS_IF_STILLBORN) |
287 | return 0; | 287 | return 0; |
288 | 288 | ||
289 | ret = __logfs_write_inode(inode, flags); | 289 | ret = __logfs_write_inode(inode, NULL, flags); |
290 | LOGFS_BUG_ON(ret, inode->i_sb); | 290 | LOGFS_BUG_ON(ret, inode->i_sb); |
291 | return ret; | 291 | return ret; |
292 | } | 292 | } |
@@ -363,7 +363,9 @@ static void logfs_init_once(void *_li) | |||
363 | 363 | ||
364 | static int logfs_sync_fs(struct super_block *sb, int wait) | 364 | static int logfs_sync_fs(struct super_block *sb, int wait) |
365 | { | 365 | { |
366 | logfs_get_wblocks(sb, NULL, WF_LOCK); | ||
366 | logfs_write_anchor(sb); | 367 | logfs_write_anchor(sb); |
368 | logfs_put_wblocks(sb, NULL, WF_LOCK); | ||
367 | return 0; | 369 | return 0; |
368 | } | 370 | } |
369 | 371 | ||
diff --git a/fs/logfs/journal.c b/fs/logfs/journal.c index 9da29706f91c..1e1c369df22b 100644 --- a/fs/logfs/journal.c +++ b/fs/logfs/journal.c | |||
@@ -612,7 +612,6 @@ static size_t __logfs_write_je(struct super_block *sb, void *buf, u16 type, | |||
612 | if (len == 0) | 612 | if (len == 0) |
613 | return logfs_write_header(super, header, 0, type); | 613 | return logfs_write_header(super, header, 0, type); |
614 | 614 | ||
615 | BUG_ON(len > sb->s_blocksize); | ||
616 | compr_len = logfs_compress(buf, data, len, sb->s_blocksize); | 615 | compr_len = logfs_compress(buf, data, len, sb->s_blocksize); |
617 | if (compr_len < 0 || type == JE_ANCHOR) { | 616 | if (compr_len < 0 || type == JE_ANCHOR) { |
618 | memcpy(data, buf, len); | 617 | memcpy(data, buf, len); |
diff --git a/fs/logfs/logfs.h b/fs/logfs/logfs.h index 926373866a55..5f0937609465 100644 --- a/fs/logfs/logfs.h +++ b/fs/logfs/logfs.h | |||
@@ -528,7 +528,7 @@ void logfs_destroy_inode_cache(void); | |||
528 | void logfs_set_blocks(struct inode *inode, u64 no); | 528 | void logfs_set_blocks(struct inode *inode, u64 no); |
529 | /* these logically belong into inode.c but actually reside in readwrite.c */ | 529 | /* these logically belong into inode.c but actually reside in readwrite.c */ |
530 | int logfs_read_inode(struct inode *inode); | 530 | int logfs_read_inode(struct inode *inode); |
531 | int __logfs_write_inode(struct inode *inode, long flags); | 531 | int __logfs_write_inode(struct inode *inode, struct page *, long flags); |
532 | void logfs_evict_inode(struct inode *inode); | 532 | void logfs_evict_inode(struct inode *inode); |
533 | 533 | ||
534 | /* journal.c */ | 534 | /* journal.c */ |
@@ -577,6 +577,8 @@ void initialize_block_counters(struct page *page, struct logfs_block *block, | |||
577 | __be64 *array, int page_is_empty); | 577 | __be64 *array, int page_is_empty); |
578 | int logfs_exist_block(struct inode *inode, u64 bix); | 578 | int logfs_exist_block(struct inode *inode, u64 bix); |
579 | int get_page_reserve(struct inode *inode, struct page *page); | 579 | int get_page_reserve(struct inode *inode, struct page *page); |
580 | void logfs_get_wblocks(struct super_block *sb, struct page *page, int lock); | ||
581 | void logfs_put_wblocks(struct super_block *sb, struct page *page, int lock); | ||
580 | extern struct logfs_block_ops indirect_block_ops; | 582 | extern struct logfs_block_ops indirect_block_ops; |
581 | 583 | ||
582 | /* segment.c */ | 584 | /* segment.c */ |
@@ -594,6 +596,7 @@ int logfs_init_mapping(struct super_block *sb); | |||
594 | void logfs_sync_area(struct logfs_area *area); | 596 | void logfs_sync_area(struct logfs_area *area); |
595 | void logfs_sync_segments(struct super_block *sb); | 597 | void logfs_sync_segments(struct super_block *sb); |
596 | void freeseg(struct super_block *sb, u32 segno); | 598 | void freeseg(struct super_block *sb, u32 segno); |
599 | void free_areas(struct super_block *sb); | ||
597 | 600 | ||
598 | /* area handling */ | 601 | /* area handling */ |
599 | int logfs_init_areas(struct super_block *sb); | 602 | int logfs_init_areas(struct super_block *sb); |
diff --git a/fs/logfs/readwrite.c b/fs/logfs/readwrite.c index 2ac4217b7901..4153e65b0148 100644 --- a/fs/logfs/readwrite.c +++ b/fs/logfs/readwrite.c | |||
@@ -244,8 +244,7 @@ static void preunlock_page(struct super_block *sb, struct page *page, int lock) | |||
244 | * is waiting for s_write_mutex. We annotate this fact by setting PG_pre_locked | 244 | * is waiting for s_write_mutex. We annotate this fact by setting PG_pre_locked |
245 | * in addition to PG_locked. | 245 | * in addition to PG_locked. |
246 | */ | 246 | */ |
247 | static void logfs_get_wblocks(struct super_block *sb, struct page *page, | 247 | void logfs_get_wblocks(struct super_block *sb, struct page *page, int lock) |
248 | int lock) | ||
249 | { | 248 | { |
250 | struct logfs_super *super = logfs_super(sb); | 249 | struct logfs_super *super = logfs_super(sb); |
251 | 250 | ||
@@ -260,8 +259,7 @@ static void logfs_get_wblocks(struct super_block *sb, struct page *page, | |||
260 | } | 259 | } |
261 | } | 260 | } |
262 | 261 | ||
263 | static void logfs_put_wblocks(struct super_block *sb, struct page *page, | 262 | void logfs_put_wblocks(struct super_block *sb, struct page *page, int lock) |
264 | int lock) | ||
265 | { | 263 | { |
266 | struct logfs_super *super = logfs_super(sb); | 264 | struct logfs_super *super = logfs_super(sb); |
267 | 265 | ||
@@ -424,7 +422,7 @@ static void inode_write_block(struct logfs_block *block) | |||
424 | if (inode->i_ino == LOGFS_INO_MASTER) | 422 | if (inode->i_ino == LOGFS_INO_MASTER) |
425 | logfs_write_anchor(inode->i_sb); | 423 | logfs_write_anchor(inode->i_sb); |
426 | else { | 424 | else { |
427 | ret = __logfs_write_inode(inode, 0); | 425 | ret = __logfs_write_inode(inode, NULL, 0); |
428 | /* see indirect_write_block comment */ | 426 | /* see indirect_write_block comment */ |
429 | BUG_ON(ret); | 427 | BUG_ON(ret); |
430 | } | 428 | } |
@@ -560,8 +558,13 @@ static void inode_free_block(struct super_block *sb, struct logfs_block *block) | |||
560 | static void indirect_free_block(struct super_block *sb, | 558 | static void indirect_free_block(struct super_block *sb, |
561 | struct logfs_block *block) | 559 | struct logfs_block *block) |
562 | { | 560 | { |
563 | ClearPagePrivate(block->page); | 561 | struct page *page = block->page; |
564 | block->page->private = 0; | 562 | |
563 | if (PagePrivate(page)) { | ||
564 | ClearPagePrivate(page); | ||
565 | page_cache_release(page); | ||
566 | set_page_private(page, 0); | ||
567 | } | ||
565 | __free_block(sb, block); | 568 | __free_block(sb, block); |
566 | } | 569 | } |
567 | 570 | ||
@@ -650,8 +653,11 @@ static void alloc_data_block(struct inode *inode, struct page *page) | |||
650 | logfs_unpack_index(page->index, &bix, &level); | 653 | logfs_unpack_index(page->index, &bix, &level); |
651 | block = __alloc_block(inode->i_sb, inode->i_ino, bix, level); | 654 | block = __alloc_block(inode->i_sb, inode->i_ino, bix, level); |
652 | block->page = page; | 655 | block->page = page; |
656 | |||
653 | SetPagePrivate(page); | 657 | SetPagePrivate(page); |
654 | page->private = (unsigned long)block; | 658 | page_cache_get(page); |
659 | set_page_private(page, (unsigned long) block); | ||
660 | |||
655 | block->ops = &indirect_block_ops; | 661 | block->ops = &indirect_block_ops; |
656 | } | 662 | } |
657 | 663 | ||
@@ -1570,11 +1576,15 @@ int logfs_write_buf(struct inode *inode, struct page *page, long flags) | |||
1570 | static int __logfs_delete(struct inode *inode, struct page *page) | 1576 | static int __logfs_delete(struct inode *inode, struct page *page) |
1571 | { | 1577 | { |
1572 | long flags = WF_DELETE; | 1578 | long flags = WF_DELETE; |
1579 | int err; | ||
1573 | 1580 | ||
1574 | inode->i_ctime = inode->i_mtime = CURRENT_TIME; | 1581 | inode->i_ctime = inode->i_mtime = CURRENT_TIME; |
1575 | 1582 | ||
1576 | if (page->index < I0_BLOCKS) | 1583 | if (page->index < I0_BLOCKS) |
1577 | return logfs_write_direct(inode, page, flags); | 1584 | return logfs_write_direct(inode, page, flags); |
1585 | err = grow_inode(inode, page->index, 0); | ||
1586 | if (err) | ||
1587 | return err; | ||
1578 | return logfs_write_rec(inode, page, page->index, 0, flags); | 1588 | return logfs_write_rec(inode, page, page->index, 0, flags); |
1579 | } | 1589 | } |
1580 | 1590 | ||
@@ -1623,7 +1633,7 @@ int logfs_rewrite_block(struct inode *inode, u64 bix, u64 ofs, | |||
1623 | if (inode->i_ino == LOGFS_INO_MASTER) | 1633 | if (inode->i_ino == LOGFS_INO_MASTER) |
1624 | logfs_write_anchor(inode->i_sb); | 1634 | logfs_write_anchor(inode->i_sb); |
1625 | else { | 1635 | else { |
1626 | err = __logfs_write_inode(inode, flags); | 1636 | err = __logfs_write_inode(inode, page, flags); |
1627 | } | 1637 | } |
1628 | } | 1638 | } |
1629 | } | 1639 | } |
@@ -1873,7 +1883,7 @@ int logfs_truncate(struct inode *inode, u64 target) | |||
1873 | logfs_get_wblocks(sb, NULL, 1); | 1883 | logfs_get_wblocks(sb, NULL, 1); |
1874 | err = __logfs_truncate(inode, size); | 1884 | err = __logfs_truncate(inode, size); |
1875 | if (!err) | 1885 | if (!err) |
1876 | err = __logfs_write_inode(inode, 0); | 1886 | err = __logfs_write_inode(inode, NULL, 0); |
1877 | logfs_put_wblocks(sb, NULL, 1); | 1887 | logfs_put_wblocks(sb, NULL, 1); |
1878 | } | 1888 | } |
1879 | 1889 | ||
@@ -1901,8 +1911,11 @@ static void move_page_to_inode(struct inode *inode, struct page *page) | |||
1901 | li->li_block = block; | 1911 | li->li_block = block; |
1902 | 1912 | ||
1903 | block->page = NULL; | 1913 | block->page = NULL; |
1904 | page->private = 0; | 1914 | if (PagePrivate(page)) { |
1905 | ClearPagePrivate(page); | 1915 | ClearPagePrivate(page); |
1916 | page_cache_release(page); | ||
1917 | set_page_private(page, 0); | ||
1918 | } | ||
1906 | } | 1919 | } |
1907 | 1920 | ||
1908 | static void move_inode_to_page(struct page *page, struct inode *inode) | 1921 | static void move_inode_to_page(struct page *page, struct inode *inode) |
@@ -1918,8 +1931,12 @@ static void move_inode_to_page(struct page *page, struct inode *inode) | |||
1918 | BUG_ON(PagePrivate(page)); | 1931 | BUG_ON(PagePrivate(page)); |
1919 | block->ops = &indirect_block_ops; | 1932 | block->ops = &indirect_block_ops; |
1920 | block->page = page; | 1933 | block->page = page; |
1921 | page->private = (unsigned long)block; | 1934 | |
1922 | SetPagePrivate(page); | 1935 | if (!PagePrivate(page)) { |
1936 | SetPagePrivate(page); | ||
1937 | page_cache_get(page); | ||
1938 | set_page_private(page, (unsigned long) block); | ||
1939 | } | ||
1923 | 1940 | ||
1924 | block->inode = NULL; | 1941 | block->inode = NULL; |
1925 | li->li_block = NULL; | 1942 | li->li_block = NULL; |
@@ -2106,14 +2123,14 @@ void logfs_set_segment_unreserved(struct super_block *sb, u32 segno, u32 ec) | |||
2106 | ec_level); | 2123 | ec_level); |
2107 | } | 2124 | } |
2108 | 2125 | ||
2109 | int __logfs_write_inode(struct inode *inode, long flags) | 2126 | int __logfs_write_inode(struct inode *inode, struct page *page, long flags) |
2110 | { | 2127 | { |
2111 | struct super_block *sb = inode->i_sb; | 2128 | struct super_block *sb = inode->i_sb; |
2112 | int ret; | 2129 | int ret; |
2113 | 2130 | ||
2114 | logfs_get_wblocks(sb, NULL, flags & WF_LOCK); | 2131 | logfs_get_wblocks(sb, page, flags & WF_LOCK); |
2115 | ret = do_write_inode(inode); | 2132 | ret = do_write_inode(inode); |
2116 | logfs_put_wblocks(sb, NULL, flags & WF_LOCK); | 2133 | logfs_put_wblocks(sb, page, flags & WF_LOCK); |
2117 | return ret; | 2134 | return ret; |
2118 | } | 2135 | } |
2119 | 2136 | ||
diff --git a/fs/logfs/segment.c b/fs/logfs/segment.c index 9d5187353255..ab798ed1cc88 100644 --- a/fs/logfs/segment.c +++ b/fs/logfs/segment.c | |||
@@ -86,7 +86,11 @@ int __logfs_buf_write(struct logfs_area *area, u64 ofs, void *buf, size_t len, | |||
86 | BUG_ON(!page); /* FIXME: reserve a pool */ | 86 | BUG_ON(!page); /* FIXME: reserve a pool */ |
87 | SetPageUptodate(page); | 87 | SetPageUptodate(page); |
88 | memcpy(page_address(page) + offset, buf, copylen); | 88 | memcpy(page_address(page) + offset, buf, copylen); |
89 | SetPagePrivate(page); | 89 | |
90 | if (!PagePrivate(page)) { | ||
91 | SetPagePrivate(page); | ||
92 | page_cache_get(page); | ||
93 | } | ||
90 | page_cache_release(page); | 94 | page_cache_release(page); |
91 | 95 | ||
92 | buf += copylen; | 96 | buf += copylen; |
@@ -110,7 +114,10 @@ static void pad_partial_page(struct logfs_area *area) | |||
110 | page = get_mapping_page(sb, index, 0); | 114 | page = get_mapping_page(sb, index, 0); |
111 | BUG_ON(!page); /* FIXME: reserve a pool */ | 115 | BUG_ON(!page); /* FIXME: reserve a pool */ |
112 | memset(page_address(page) + offset, 0xff, len); | 116 | memset(page_address(page) + offset, 0xff, len); |
113 | SetPagePrivate(page); | 117 | if (!PagePrivate(page)) { |
118 | SetPagePrivate(page); | ||
119 | page_cache_get(page); | ||
120 | } | ||
114 | page_cache_release(page); | 121 | page_cache_release(page); |
115 | } | 122 | } |
116 | } | 123 | } |
@@ -130,7 +137,10 @@ static void pad_full_pages(struct logfs_area *area) | |||
130 | BUG_ON(!page); /* FIXME: reserve a pool */ | 137 | BUG_ON(!page); /* FIXME: reserve a pool */ |
131 | SetPageUptodate(page); | 138 | SetPageUptodate(page); |
132 | memset(page_address(page), 0xff, PAGE_CACHE_SIZE); | 139 | memset(page_address(page), 0xff, PAGE_CACHE_SIZE); |
133 | SetPagePrivate(page); | 140 | if (!PagePrivate(page)) { |
141 | SetPagePrivate(page); | ||
142 | page_cache_get(page); | ||
143 | } | ||
134 | page_cache_release(page); | 144 | page_cache_release(page); |
135 | index++; | 145 | index++; |
136 | no_indizes--; | 146 | no_indizes--; |
@@ -485,8 +495,12 @@ static void move_btree_to_page(struct inode *inode, struct page *page, | |||
485 | mempool_free(item, super->s_alias_pool); | 495 | mempool_free(item, super->s_alias_pool); |
486 | } | 496 | } |
487 | block->page = page; | 497 | block->page = page; |
488 | SetPagePrivate(page); | 498 | |
489 | page->private = (unsigned long)block; | 499 | if (!PagePrivate(page)) { |
500 | SetPagePrivate(page); | ||
501 | page_cache_get(page); | ||
502 | set_page_private(page, (unsigned long) block); | ||
503 | } | ||
490 | block->ops = &indirect_block_ops; | 504 | block->ops = &indirect_block_ops; |
491 | initialize_block_counters(page, block, data, 0); | 505 | initialize_block_counters(page, block, data, 0); |
492 | } | 506 | } |
@@ -536,8 +550,12 @@ void move_page_to_btree(struct page *page) | |||
536 | list_add(&item->list, &block->item_list); | 550 | list_add(&item->list, &block->item_list); |
537 | } | 551 | } |
538 | block->page = NULL; | 552 | block->page = NULL; |
539 | ClearPagePrivate(page); | 553 | |
540 | page->private = 0; | 554 | if (PagePrivate(page)) { |
555 | ClearPagePrivate(page); | ||
556 | page_cache_release(page); | ||
557 | set_page_private(page, 0); | ||
558 | } | ||
541 | block->ops = &btree_block_ops; | 559 | block->ops = &btree_block_ops; |
542 | err = alias_tree_insert(block->sb, block->ino, block->bix, block->level, | 560 | err = alias_tree_insert(block->sb, block->ino, block->bix, block->level, |
543 | block); | 561 | block); |
@@ -702,7 +720,10 @@ void freeseg(struct super_block *sb, u32 segno) | |||
702 | page = find_get_page(mapping, ofs >> PAGE_SHIFT); | 720 | page = find_get_page(mapping, ofs >> PAGE_SHIFT); |
703 | if (!page) | 721 | if (!page) |
704 | continue; | 722 | continue; |
705 | ClearPagePrivate(page); | 723 | if (PagePrivate(page)) { |
724 | ClearPagePrivate(page); | ||
725 | page_cache_release(page); | ||
726 | } | ||
706 | page_cache_release(page); | 727 | page_cache_release(page); |
707 | } | 728 | } |
708 | } | 729 | } |
@@ -841,6 +862,16 @@ static void free_area(struct logfs_area *area) | |||
841 | kfree(area); | 862 | kfree(area); |
842 | } | 863 | } |
843 | 864 | ||
865 | void free_areas(struct super_block *sb) | ||
866 | { | ||
867 | struct logfs_super *super = logfs_super(sb); | ||
868 | int i; | ||
869 | |||
870 | for_each_area(i) | ||
871 | free_area(super->s_area[i]); | ||
872 | free_area(super->s_journal_area); | ||
873 | } | ||
874 | |||
844 | static struct logfs_area *alloc_area(struct super_block *sb) | 875 | static struct logfs_area *alloc_area(struct super_block *sb) |
845 | { | 876 | { |
846 | struct logfs_area *area; | 877 | struct logfs_area *area; |
@@ -923,10 +954,6 @@ err: | |||
923 | void logfs_cleanup_areas(struct super_block *sb) | 954 | void logfs_cleanup_areas(struct super_block *sb) |
924 | { | 955 | { |
925 | struct logfs_super *super = logfs_super(sb); | 956 | struct logfs_super *super = logfs_super(sb); |
926 | int i; | ||
927 | 957 | ||
928 | btree_grim_visitor128(&super->s_object_alias_tree, 0, kill_alias); | 958 | btree_grim_visitor128(&super->s_object_alias_tree, 0, kill_alias); |
929 | for_each_area(i) | ||
930 | free_area(super->s_area[i]); | ||
931 | free_area(super->s_journal_area); | ||
932 | } | 959 | } |
diff --git a/fs/logfs/super.c b/fs/logfs/super.c index e795c234ea33..c9ee7f5d1caf 100644 --- a/fs/logfs/super.c +++ b/fs/logfs/super.c | |||
@@ -486,14 +486,15 @@ static void logfs_kill_sb(struct super_block *sb) | |||
486 | /* Alias entries slow down mount, so evict as many as possible */ | 486 | /* Alias entries slow down mount, so evict as many as possible */ |
487 | sync_filesystem(sb); | 487 | sync_filesystem(sb); |
488 | logfs_write_anchor(sb); | 488 | logfs_write_anchor(sb); |
489 | free_areas(sb); | ||
489 | 490 | ||
490 | /* | 491 | /* |
491 | * From this point on alias entries are simply dropped - and any | 492 | * From this point on alias entries are simply dropped - and any |
492 | * writes to the object store are considered bugs. | 493 | * writes to the object store are considered bugs. |
493 | */ | 494 | */ |
494 | super->s_flags |= LOGFS_SB_FLAG_SHUTDOWN; | ||
495 | log_super("LogFS: Now in shutdown\n"); | 495 | log_super("LogFS: Now in shutdown\n"); |
496 | generic_shutdown_super(sb); | 496 | generic_shutdown_super(sb); |
497 | super->s_flags |= LOGFS_SB_FLAG_SHUTDOWN; | ||
497 | 498 | ||
498 | BUG_ON(super->s_dirty_used_bytes || super->s_dirty_free_bytes); | 499 | BUG_ON(super->s_dirty_used_bytes || super->s_dirty_free_bytes); |
499 | 500 | ||
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index e418c5abdb0e..7dcd2a250495 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c | |||
@@ -518,6 +518,9 @@ static int clear_refs_pte_range(pmd_t *pmd, unsigned long addr, | |||
518 | if (!page) | 518 | if (!page) |
519 | continue; | 519 | continue; |
520 | 520 | ||
521 | if (PageReserved(page)) | ||
522 | continue; | ||
523 | |||
521 | /* Clear accessed and referenced bits. */ | 524 | /* Clear accessed and referenced bits. */ |
522 | ptep_test_and_clear_young(vma, addr, pte); | 525 | ptep_test_and_clear_young(vma, addr, pte); |
523 | ClearPageReferenced(page); | 526 | ClearPageReferenced(page); |
diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index 5ec59b20cf76..46741970371b 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c | |||
@@ -2125,6 +2125,8 @@ static int vfs_load_quota_inode(struct inode *inode, int type, int format_id, | |||
2125 | mutex_unlock(&dqopt->dqio_mutex); | 2125 | mutex_unlock(&dqopt->dqio_mutex); |
2126 | goto out_file_init; | 2126 | goto out_file_init; |
2127 | } | 2127 | } |
2128 | if (dqopt->flags & DQUOT_QUOTA_SYS_FILE) | ||
2129 | dqopt->info[type].dqi_flags |= DQF_SYS_FILE; | ||
2128 | mutex_unlock(&dqopt->dqio_mutex); | 2130 | mutex_unlock(&dqopt->dqio_mutex); |
2129 | spin_lock(&dq_state_lock); | 2131 | spin_lock(&dq_state_lock); |
2130 | dqopt->flags |= dquot_state_flag(flags, type); | 2132 | dqopt->flags |= dquot_state_flag(flags, type); |
@@ -2464,7 +2466,7 @@ int dquot_get_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii) | |||
2464 | spin_lock(&dq_data_lock); | 2466 | spin_lock(&dq_data_lock); |
2465 | ii->dqi_bgrace = mi->dqi_bgrace; | 2467 | ii->dqi_bgrace = mi->dqi_bgrace; |
2466 | ii->dqi_igrace = mi->dqi_igrace; | 2468 | ii->dqi_igrace = mi->dqi_igrace; |
2467 | ii->dqi_flags = mi->dqi_flags & DQF_MASK; | 2469 | ii->dqi_flags = mi->dqi_flags & DQF_GETINFO_MASK; |
2468 | ii->dqi_valid = IIF_ALL; | 2470 | ii->dqi_valid = IIF_ALL; |
2469 | spin_unlock(&dq_data_lock); | 2471 | spin_unlock(&dq_data_lock); |
2470 | mutex_unlock(&sb_dqopt(sb)->dqonoff_mutex); | 2472 | mutex_unlock(&sb_dqopt(sb)->dqonoff_mutex); |
@@ -2490,8 +2492,8 @@ int dquot_set_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii) | |||
2490 | if (ii->dqi_valid & IIF_IGRACE) | 2492 | if (ii->dqi_valid & IIF_IGRACE) |
2491 | mi->dqi_igrace = ii->dqi_igrace; | 2493 | mi->dqi_igrace = ii->dqi_igrace; |
2492 | if (ii->dqi_valid & IIF_FLAGS) | 2494 | if (ii->dqi_valid & IIF_FLAGS) |
2493 | mi->dqi_flags = (mi->dqi_flags & ~DQF_MASK) | | 2495 | mi->dqi_flags = (mi->dqi_flags & ~DQF_SETINFO_MASK) | |
2494 | (ii->dqi_flags & DQF_MASK); | 2496 | (ii->dqi_flags & DQF_SETINFO_MASK); |
2495 | spin_unlock(&dq_data_lock); | 2497 | spin_unlock(&dq_data_lock); |
2496 | mark_info_dirty(sb, type); | 2498 | mark_info_dirty(sb, type); |
2497 | /* Force write to disk */ | 2499 | /* Force write to disk */ |
diff --git a/fs/sysfs/file.c b/fs/sysfs/file.c index 62f4fb37789e..00012e31829d 100644 --- a/fs/sysfs/file.c +++ b/fs/sysfs/file.c | |||
@@ -493,6 +493,12 @@ int sysfs_attr_ns(struct kobject *kobj, const struct attribute *attr, | |||
493 | const void *ns = NULL; | 493 | const void *ns = NULL; |
494 | int err; | 494 | int err; |
495 | 495 | ||
496 | if (!dir_sd) { | ||
497 | WARN(1, KERN_ERR "sysfs: kobject %s without dirent\n", | ||
498 | kobject_name(kobj)); | ||
499 | return -ENOENT; | ||
500 | } | ||
501 | |||
496 | err = 0; | 502 | err = 0; |
497 | if (!sysfs_ns_type(dir_sd)) | 503 | if (!sysfs_ns_type(dir_sd)) |
498 | goto out; | 504 | goto out; |
diff --git a/fs/sysfs/inode.c b/fs/sysfs/inode.c index 4a802b4a9056..85eb81683a29 100644 --- a/fs/sysfs/inode.c +++ b/fs/sysfs/inode.c | |||
@@ -318,8 +318,11 @@ int sysfs_hash_and_remove(struct sysfs_dirent *dir_sd, const void *ns, const cha | |||
318 | struct sysfs_addrm_cxt acxt; | 318 | struct sysfs_addrm_cxt acxt; |
319 | struct sysfs_dirent *sd; | 319 | struct sysfs_dirent *sd; |
320 | 320 | ||
321 | if (!dir_sd) | 321 | if (!dir_sd) { |
322 | WARN(1, KERN_WARNING "sysfs: can not remove '%s', no directory\n", | ||
323 | name); | ||
322 | return -ENOENT; | 324 | return -ENOENT; |
325 | } | ||
323 | 326 | ||
324 | sysfs_addrm_start(&acxt, dir_sd); | 327 | sysfs_addrm_start(&acxt, dir_sd); |
325 | 328 | ||
diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index 0cf52da9d246..ebdb88840a47 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c | |||
@@ -131,7 +131,8 @@ xfs_readlink( | |||
131 | __func__, (unsigned long long) ip->i_ino, | 131 | __func__, (unsigned long long) ip->i_ino, |
132 | (long long) pathlen); | 132 | (long long) pathlen); |
133 | ASSERT(0); | 133 | ASSERT(0); |
134 | return XFS_ERROR(EFSCORRUPTED); | 134 | error = XFS_ERROR(EFSCORRUPTED); |
135 | goto out; | ||
135 | } | 136 | } |
136 | 137 | ||
137 | 138 | ||
diff --git a/include/acpi/acpiosxf.h b/include/acpi/acpiosxf.h index 2fe8639b3ae7..7c9aebe8a7aa 100644 --- a/include/acpi/acpiosxf.h +++ b/include/acpi/acpiosxf.h | |||
@@ -218,9 +218,13 @@ acpi_status acpi_os_write_port(acpi_io_address address, u32 value, u32 width); | |||
218 | */ | 218 | */ |
219 | acpi_status | 219 | acpi_status |
220 | acpi_os_read_memory(acpi_physical_address address, u32 * value, u32 width); | 220 | acpi_os_read_memory(acpi_physical_address address, u32 * value, u32 width); |
221 | acpi_status | ||
222 | acpi_os_read_memory64(acpi_physical_address address, u64 *value, u32 width); | ||
221 | 223 | ||
222 | acpi_status | 224 | acpi_status |
223 | acpi_os_write_memory(acpi_physical_address address, u32 value, u32 width); | 225 | acpi_os_write_memory(acpi_physical_address address, u32 value, u32 width); |
226 | acpi_status | ||
227 | acpi_os_write_memory64(acpi_physical_address address, u64 value, u32 width); | ||
224 | 228 | ||
225 | /* | 229 | /* |
226 | * Platform and hardware-independent PCI configuration space access | 230 | * Platform and hardware-independent PCI configuration space access |
diff --git a/include/acpi/atomicio.h b/include/acpi/atomicio.h deleted file mode 100644 index 8b9fb4b0b9ce..000000000000 --- a/include/acpi/atomicio.h +++ /dev/null | |||
@@ -1,10 +0,0 @@ | |||
1 | #ifndef ACPI_ATOMIC_IO_H | ||
2 | #define ACPI_ATOMIC_IO_H | ||
3 | |||
4 | int acpi_pre_map_gar(struct acpi_generic_address *reg); | ||
5 | int acpi_post_unmap_gar(struct acpi_generic_address *reg); | ||
6 | |||
7 | int acpi_atomic_read(u64 *val, struct acpi_generic_address *reg); | ||
8 | int acpi_atomic_write(u64 val, struct acpi_generic_address *reg); | ||
9 | |||
10 | #endif | ||
diff --git a/include/acpi/processor.h b/include/acpi/processor.h index 610f6fb1bbc2..8cf7e98a2c7b 100644 --- a/include/acpi/processor.h +++ b/include/acpi/processor.h | |||
@@ -195,6 +195,7 @@ struct acpi_processor_flags { | |||
195 | u8 has_cst:1; | 195 | u8 has_cst:1; |
196 | u8 power_setup_done:1; | 196 | u8 power_setup_done:1; |
197 | u8 bm_rld_set:1; | 197 | u8 bm_rld_set:1; |
198 | u8 need_hotplug_init:1; | ||
198 | }; | 199 | }; |
199 | 200 | ||
200 | struct acpi_processor { | 201 | struct acpi_processor { |
diff --git a/include/drm/drmP.h b/include/drm/drmP.h index 76caa67c22e2..92f0981b5fb8 100644 --- a/include/drm/drmP.h +++ b/include/drm/drmP.h | |||
@@ -1328,6 +1328,7 @@ extern int drm_getmagic(struct drm_device *dev, void *data, | |||
1328 | struct drm_file *file_priv); | 1328 | struct drm_file *file_priv); |
1329 | extern int drm_authmagic(struct drm_device *dev, void *data, | 1329 | extern int drm_authmagic(struct drm_device *dev, void *data, |
1330 | struct drm_file *file_priv); | 1330 | struct drm_file *file_priv); |
1331 | extern int drm_remove_magic(struct drm_master *master, drm_magic_t magic); | ||
1331 | 1332 | ||
1332 | /* Cache management (drm_cache.c) */ | 1333 | /* Cache management (drm_cache.c) */ |
1333 | void drm_clflush_pages(struct page *pages[], unsigned long num_pages); | 1334 | void drm_clflush_pages(struct page *pages[], unsigned long num_pages); |
diff --git a/include/keys/user-type.h b/include/keys/user-type.h index c37c34275a44..bc9ec1d7698c 100644 --- a/include/keys/user-type.h +++ b/include/keys/user-type.h | |||
@@ -17,7 +17,7 @@ | |||
17 | 17 | ||
18 | /*****************************************************************************/ | 18 | /*****************************************************************************/ |
19 | /* | 19 | /* |
20 | * the payload for a key of type "user" | 20 | * the payload for a key of type "user" or "logon" |
21 | * - once filled in and attached to a key: | 21 | * - once filled in and attached to a key: |
22 | * - the payload struct is invariant may not be changed, only replaced | 22 | * - the payload struct is invariant may not be changed, only replaced |
23 | * - the payload must be read with RCU procedures or with the key semaphore | 23 | * - the payload must be read with RCU procedures or with the key semaphore |
@@ -33,6 +33,7 @@ struct user_key_payload { | |||
33 | }; | 33 | }; |
34 | 34 | ||
35 | extern struct key_type key_type_user; | 35 | extern struct key_type key_type_user; |
36 | extern struct key_type key_type_logon; | ||
36 | 37 | ||
37 | extern int user_instantiate(struct key *key, const void *data, size_t datalen); | 38 | extern int user_instantiate(struct key *key, const void *data, size_t datalen); |
38 | extern int user_update(struct key *key, const void *data, size_t datalen); | 39 | extern int user_update(struct key *key, const void *data, size_t datalen); |
diff --git a/include/linux/device.h b/include/linux/device.h index 5b3adb8f9588..b63fb393aa58 100644 --- a/include/linux/device.h +++ b/include/linux/device.h | |||
@@ -279,11 +279,11 @@ struct device *driver_find_device(struct device_driver *drv, | |||
279 | 279 | ||
280 | /** | 280 | /** |
281 | * struct subsys_interface - interfaces to device functions | 281 | * struct subsys_interface - interfaces to device functions |
282 | * @name name of the device function | 282 | * @name: name of the device function |
283 | * @subsystem subsytem of the devices to attach to | 283 | * @subsys: subsytem of the devices to attach to |
284 | * @node the list of functions registered at the subsystem | 284 | * @node: the list of functions registered at the subsystem |
285 | * @add device hookup to device function handler | 285 | * @add_dev: device hookup to device function handler |
286 | * @remove device hookup to device function handler | 286 | * @remove_dev: device hookup to device function handler |
287 | * | 287 | * |
288 | * Simple interfaces attached to a subsystem. Multiple interfaces can | 288 | * Simple interfaces attached to a subsystem. Multiple interfaces can |
289 | * attach to a subsystem and its devices. Unlike drivers, they do not | 289 | * attach to a subsystem and its devices. Unlike drivers, they do not |
@@ -612,6 +612,7 @@ struct device_dma_parameters { | |||
612 | * @archdata: For arch-specific additions. | 612 | * @archdata: For arch-specific additions. |
613 | * @of_node: Associated device tree node. | 613 | * @of_node: Associated device tree node. |
614 | * @devt: For creating the sysfs "dev". | 614 | * @devt: For creating the sysfs "dev". |
615 | * @id: device instance | ||
615 | * @devres_lock: Spinlock to protect the resource of the device. | 616 | * @devres_lock: Spinlock to protect the resource of the device. |
616 | * @devres_head: The resources list of the device. | 617 | * @devres_head: The resources list of the device. |
617 | * @knode_class: The node used to add the device to the class list. | 618 | * @knode_class: The node used to add the device to the class list. |
@@ -1003,6 +1004,10 @@ extern long sysfs_deprecated; | |||
1003 | * Each module may only use this macro once, and calling it replaces | 1004 | * Each module may only use this macro once, and calling it replaces |
1004 | * module_init() and module_exit(). | 1005 | * module_init() and module_exit(). |
1005 | * | 1006 | * |
1007 | * @__driver: driver name | ||
1008 | * @__register: register function for this driver type | ||
1009 | * @__unregister: unregister function for this driver type | ||
1010 | * | ||
1006 | * Use this macro to construct bus specific macros for registering | 1011 | * Use this macro to construct bus specific macros for registering |
1007 | * drivers, and do not use it on its own. | 1012 | * drivers, and do not use it on its own. |
1008 | */ | 1013 | */ |
diff --git a/include/linux/freezer.h b/include/linux/freezer.h index 0ab54e16a91f..d09af4b67cf1 100644 --- a/include/linux/freezer.h +++ b/include/linux/freezer.h | |||
@@ -39,6 +39,7 @@ extern bool __refrigerator(bool check_kthr_stop); | |||
39 | extern int freeze_processes(void); | 39 | extern int freeze_processes(void); |
40 | extern int freeze_kernel_threads(void); | 40 | extern int freeze_kernel_threads(void); |
41 | extern void thaw_processes(void); | 41 | extern void thaw_processes(void); |
42 | extern void thaw_kernel_threads(void); | ||
42 | 43 | ||
43 | static inline bool try_to_freeze(void) | 44 | static inline bool try_to_freeze(void) |
44 | { | 45 | { |
@@ -174,6 +175,7 @@ static inline bool __refrigerator(bool check_kthr_stop) { return false; } | |||
174 | static inline int freeze_processes(void) { return -ENOSYS; } | 175 | static inline int freeze_processes(void) { return -ENOSYS; } |
175 | static inline int freeze_kernel_threads(void) { return -ENOSYS; } | 176 | static inline int freeze_kernel_threads(void) { return -ENOSYS; } |
176 | static inline void thaw_processes(void) {} | 177 | static inline void thaw_processes(void) {} |
178 | static inline void thaw_kernel_threads(void) {} | ||
177 | 179 | ||
178 | static inline bool try_to_freeze(void) { return false; } | 180 | static inline bool try_to_freeze(void) { return false; } |
179 | 181 | ||
diff --git a/include/linux/fs.h b/include/linux/fs.h index 0244082d42c5..386da09f229d 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
@@ -396,6 +396,7 @@ struct inodes_stat_t { | |||
396 | #include <linux/rculist_bl.h> | 396 | #include <linux/rculist_bl.h> |
397 | #include <linux/atomic.h> | 397 | #include <linux/atomic.h> |
398 | #include <linux/shrinker.h> | 398 | #include <linux/shrinker.h> |
399 | #include <linux/migrate_mode.h> | ||
399 | 400 | ||
400 | #include <asm/byteorder.h> | 401 | #include <asm/byteorder.h> |
401 | 402 | ||
@@ -526,7 +527,6 @@ enum positive_aop_returns { | |||
526 | struct page; | 527 | struct page; |
527 | struct address_space; | 528 | struct address_space; |
528 | struct writeback_control; | 529 | struct writeback_control; |
529 | enum migrate_mode; | ||
530 | 530 | ||
531 | struct iov_iter { | 531 | struct iov_iter { |
532 | const struct iovec *iov; | 532 | const struct iovec *iov; |
diff --git a/include/linux/if_team.h b/include/linux/if_team.h index 828181fbad5d..58404b0c5010 100644 --- a/include/linux/if_team.h +++ b/include/linux/if_team.h | |||
@@ -46,6 +46,10 @@ struct team_port { | |||
46 | u32 speed; | 46 | u32 speed; |
47 | u8 duplex; | 47 | u8 duplex; |
48 | 48 | ||
49 | /* Custom gennetlink interface related flags */ | ||
50 | bool changed; | ||
51 | bool removed; | ||
52 | |||
49 | struct rcu_head rcu; | 53 | struct rcu_head rcu; |
50 | }; | 54 | }; |
51 | 55 | ||
@@ -72,6 +76,10 @@ struct team_option { | |||
72 | enum team_option_type type; | 76 | enum team_option_type type; |
73 | int (*getter)(struct team *team, void *arg); | 77 | int (*getter)(struct team *team, void *arg); |
74 | int (*setter)(struct team *team, void *arg); | 78 | int (*setter)(struct team *team, void *arg); |
79 | |||
80 | /* Custom gennetlink interface related flags */ | ||
81 | bool changed; | ||
82 | bool removed; | ||
75 | }; | 83 | }; |
76 | 84 | ||
77 | struct team_mode { | 85 | struct team_mode { |
@@ -207,6 +215,7 @@ enum { | |||
207 | TEAM_ATTR_OPTION_CHANGED, /* flag */ | 215 | TEAM_ATTR_OPTION_CHANGED, /* flag */ |
208 | TEAM_ATTR_OPTION_TYPE, /* u8 */ | 216 | TEAM_ATTR_OPTION_TYPE, /* u8 */ |
209 | TEAM_ATTR_OPTION_DATA, /* dynamic */ | 217 | TEAM_ATTR_OPTION_DATA, /* dynamic */ |
218 | TEAM_ATTR_OPTION_REMOVED, /* flag */ | ||
210 | 219 | ||
211 | __TEAM_ATTR_OPTION_MAX, | 220 | __TEAM_ATTR_OPTION_MAX, |
212 | TEAM_ATTR_OPTION_MAX = __TEAM_ATTR_OPTION_MAX - 1, | 221 | TEAM_ATTR_OPTION_MAX = __TEAM_ATTR_OPTION_MAX - 1, |
@@ -227,6 +236,7 @@ enum { | |||
227 | TEAM_ATTR_PORT_LINKUP, /* flag */ | 236 | TEAM_ATTR_PORT_LINKUP, /* flag */ |
228 | TEAM_ATTR_PORT_SPEED, /* u32 */ | 237 | TEAM_ATTR_PORT_SPEED, /* u32 */ |
229 | TEAM_ATTR_PORT_DUPLEX, /* u8 */ | 238 | TEAM_ATTR_PORT_DUPLEX, /* u8 */ |
239 | TEAM_ATTR_PORT_REMOVED, /* flag */ | ||
230 | 240 | ||
231 | __TEAM_ATTR_PORT_MAX, | 241 | __TEAM_ATTR_PORT_MAX, |
232 | TEAM_ATTR_PORT_MAX = __TEAM_ATTR_PORT_MAX - 1, | 242 | TEAM_ATTR_PORT_MAX = __TEAM_ATTR_PORT_MAX - 1, |
diff --git a/include/linux/kexec.h b/include/linux/kexec.h index 2fa0901219d4..0d7d6a1b172f 100644 --- a/include/linux/kexec.h +++ b/include/linux/kexec.h | |||
@@ -50,9 +50,11 @@ | |||
50 | * note header. For kdump, the code in vmcore.c runs in the context | 50 | * note header. For kdump, the code in vmcore.c runs in the context |
51 | * of the second kernel to combine them into one note. | 51 | * of the second kernel to combine them into one note. |
52 | */ | 52 | */ |
53 | #ifndef KEXEC_NOTE_BYTES | ||
53 | #define KEXEC_NOTE_BYTES ( (KEXEC_NOTE_HEAD_BYTES * 2) + \ | 54 | #define KEXEC_NOTE_BYTES ( (KEXEC_NOTE_HEAD_BYTES * 2) + \ |
54 | KEXEC_CORE_NOTE_NAME_BYTES + \ | 55 | KEXEC_CORE_NOTE_NAME_BYTES + \ |
55 | KEXEC_CORE_NOTE_DESC_BYTES ) | 56 | KEXEC_CORE_NOTE_DESC_BYTES ) |
57 | #endif | ||
56 | 58 | ||
57 | /* | 59 | /* |
58 | * This structure is used to hold the arguments that are used when loading | 60 | * This structure is used to hold the arguments that are used when loading |
diff --git a/include/linux/mfd/mcp.h b/include/linux/mfd/mcp.h index 1515e64e3663..f88c1cc0cb0f 100644 --- a/include/linux/mfd/mcp.h +++ b/include/linux/mfd/mcp.h | |||
@@ -10,7 +10,6 @@ | |||
10 | #ifndef MCP_H | 10 | #ifndef MCP_H |
11 | #define MCP_H | 11 | #define MCP_H |
12 | 12 | ||
13 | #include <linux/mod_devicetable.h> | ||
14 | #include <mach/dma.h> | 13 | #include <mach/dma.h> |
15 | 14 | ||
16 | struct mcp_ops; | 15 | struct mcp_ops; |
@@ -27,7 +26,7 @@ struct mcp { | |||
27 | dma_device_t dma_telco_rd; | 26 | dma_device_t dma_telco_rd; |
28 | dma_device_t dma_telco_wr; | 27 | dma_device_t dma_telco_wr; |
29 | struct device attached_device; | 28 | struct device attached_device; |
30 | const char *codec; | 29 | int gpio_base; |
31 | }; | 30 | }; |
32 | 31 | ||
33 | struct mcp_ops { | 32 | struct mcp_ops { |
@@ -45,11 +44,10 @@ void mcp_reg_write(struct mcp *, unsigned int, unsigned int); | |||
45 | unsigned int mcp_reg_read(struct mcp *, unsigned int); | 44 | unsigned int mcp_reg_read(struct mcp *, unsigned int); |
46 | void mcp_enable(struct mcp *); | 45 | void mcp_enable(struct mcp *); |
47 | void mcp_disable(struct mcp *); | 46 | void mcp_disable(struct mcp *); |
48 | const struct mcp_device_id *mcp_get_device_id(const struct mcp *mcp); | ||
49 | #define mcp_get_sclk_rate(mcp) ((mcp)->sclk_rate) | 47 | #define mcp_get_sclk_rate(mcp) ((mcp)->sclk_rate) |
50 | 48 | ||
51 | struct mcp *mcp_host_alloc(struct device *, size_t); | 49 | struct mcp *mcp_host_alloc(struct device *, size_t); |
52 | int mcp_host_register(struct mcp *, void *); | 50 | int mcp_host_register(struct mcp *); |
53 | void mcp_host_unregister(struct mcp *); | 51 | void mcp_host_unregister(struct mcp *); |
54 | 52 | ||
55 | struct mcp_driver { | 53 | struct mcp_driver { |
@@ -58,7 +56,6 @@ struct mcp_driver { | |||
58 | void (*remove)(struct mcp *); | 56 | void (*remove)(struct mcp *); |
59 | int (*suspend)(struct mcp *, pm_message_t); | 57 | int (*suspend)(struct mcp *, pm_message_t); |
60 | int (*resume)(struct mcp *); | 58 | int (*resume)(struct mcp *); |
61 | const struct mcp_device_id *id_table; | ||
62 | }; | 59 | }; |
63 | 60 | ||
64 | int mcp_driver_register(struct mcp_driver *); | 61 | int mcp_driver_register(struct mcp_driver *); |
@@ -67,6 +64,9 @@ void mcp_driver_unregister(struct mcp_driver *); | |||
67 | #define mcp_get_drvdata(mcp) dev_get_drvdata(&(mcp)->attached_device) | 64 | #define mcp_get_drvdata(mcp) dev_get_drvdata(&(mcp)->attached_device) |
68 | #define mcp_set_drvdata(mcp,d) dev_set_drvdata(&(mcp)->attached_device, d) | 65 | #define mcp_set_drvdata(mcp,d) dev_set_drvdata(&(mcp)->attached_device, d) |
69 | 66 | ||
70 | #define mcp_priv(mcp) ((void *)((mcp)+1)) | 67 | static inline void *mcp_priv(struct mcp *mcp) |
68 | { | ||
69 | return mcp + 1; | ||
70 | } | ||
71 | 71 | ||
72 | #endif | 72 | #endif |
diff --git a/include/linux/mfd/ucb1x00.h b/include/linux/mfd/ucb1x00.h index bc19e5fb7ea8..4321f044d1e4 100644 --- a/include/linux/mfd/ucb1x00.h +++ b/include/linux/mfd/ucb1x00.h | |||
@@ -104,9 +104,6 @@ | |||
104 | #define UCB_MODE_DYN_VFLAG_ENA (1 << 12) | 104 | #define UCB_MODE_DYN_VFLAG_ENA (1 << 12) |
105 | #define UCB_MODE_AUD_OFF_CAN (1 << 13) | 105 | #define UCB_MODE_AUD_OFF_CAN (1 << 13) |
106 | 106 | ||
107 | struct ucb1x00_plat_data { | ||
108 | int gpio_base; | ||
109 | }; | ||
110 | 107 | ||
111 | struct ucb1x00_irq { | 108 | struct ucb1x00_irq { |
112 | void *devid; | 109 | void *devid; |
@@ -119,7 +116,7 @@ struct ucb1x00 { | |||
119 | unsigned int irq; | 116 | unsigned int irq; |
120 | struct semaphore adc_sem; | 117 | struct semaphore adc_sem; |
121 | spinlock_t io_lock; | 118 | spinlock_t io_lock; |
122 | const struct mcp_device_id *id; | 119 | u16 id; |
123 | u16 io_dir; | 120 | u16 io_dir; |
124 | u16 io_out; | 121 | u16 io_out; |
125 | u16 adc_cr; | 122 | u16 adc_cr; |
diff --git a/include/linux/migrate.h b/include/linux/migrate.h index eaf867412f7a..05ed2828a553 100644 --- a/include/linux/migrate.h +++ b/include/linux/migrate.h | |||
@@ -3,22 +3,10 @@ | |||
3 | 3 | ||
4 | #include <linux/mm.h> | 4 | #include <linux/mm.h> |
5 | #include <linux/mempolicy.h> | 5 | #include <linux/mempolicy.h> |
6 | #include <linux/migrate_mode.h> | ||
6 | 7 | ||
7 | typedef struct page *new_page_t(struct page *, unsigned long private, int **); | 8 | typedef struct page *new_page_t(struct page *, unsigned long private, int **); |
8 | 9 | ||
9 | /* | ||
10 | * MIGRATE_ASYNC means never block | ||
11 | * MIGRATE_SYNC_LIGHT in the current implementation means to allow blocking | ||
12 | * on most operations but not ->writepage as the potential stall time | ||
13 | * is too significant | ||
14 | * MIGRATE_SYNC will block when migrating pages | ||
15 | */ | ||
16 | enum migrate_mode { | ||
17 | MIGRATE_ASYNC, | ||
18 | MIGRATE_SYNC_LIGHT, | ||
19 | MIGRATE_SYNC, | ||
20 | }; | ||
21 | |||
22 | #ifdef CONFIG_MIGRATION | 10 | #ifdef CONFIG_MIGRATION |
23 | #define PAGE_MIGRATION 1 | 11 | #define PAGE_MIGRATION 1 |
24 | 12 | ||
diff --git a/include/linux/migrate_mode.h b/include/linux/migrate_mode.h new file mode 100644 index 000000000000..ebf3d89a3919 --- /dev/null +++ b/include/linux/migrate_mode.h | |||
@@ -0,0 +1,16 @@ | |||
1 | #ifndef MIGRATE_MODE_H_INCLUDED | ||
2 | #define MIGRATE_MODE_H_INCLUDED | ||
3 | /* | ||
4 | * MIGRATE_ASYNC means never block | ||
5 | * MIGRATE_SYNC_LIGHT in the current implementation means to allow blocking | ||
6 | * on most operations but not ->writepage as the potential stall time | ||
7 | * is too significant | ||
8 | * MIGRATE_SYNC will block when migrating pages | ||
9 | */ | ||
10 | enum migrate_mode { | ||
11 | MIGRATE_ASYNC, | ||
12 | MIGRATE_SYNC_LIGHT, | ||
13 | MIGRATE_SYNC, | ||
14 | }; | ||
15 | |||
16 | #endif /* MIGRATE_MODE_H_INCLUDED */ | ||
diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h index 5c4fe8e5bfe5..aea61905499b 100644 --- a/include/linux/mlx4/device.h +++ b/include/linux/mlx4/device.h | |||
@@ -621,6 +621,7 @@ void mlx4_unregister_mac(struct mlx4_dev *dev, u8 port, u64 mac); | |||
621 | int mlx4_replace_mac(struct mlx4_dev *dev, u8 port, int qpn, u64 new_mac); | 621 | int mlx4_replace_mac(struct mlx4_dev *dev, u8 port, int qpn, u64 new_mac); |
622 | int mlx4_get_eth_qp(struct mlx4_dev *dev, u8 port, u64 mac, int *qpn); | 622 | int mlx4_get_eth_qp(struct mlx4_dev *dev, u8 port, u64 mac, int *qpn); |
623 | void mlx4_put_eth_qp(struct mlx4_dev *dev, u8 port, u64 mac, int qpn); | 623 | void mlx4_put_eth_qp(struct mlx4_dev *dev, u8 port, u64 mac, int qpn); |
624 | void mlx4_set_stats_bitmap(struct mlx4_dev *dev, u64 *stats_bitmap); | ||
624 | 625 | ||
625 | int mlx4_find_cached_vlan(struct mlx4_dev *dev, u8 port, u16 vid, int *idx); | 626 | int mlx4_find_cached_vlan(struct mlx4_dev *dev, u8 port, u16 vid, int *idx); |
626 | int mlx4_register_vlan(struct mlx4_dev *dev, u8 port, u16 vlan, int *index); | 627 | int mlx4_register_vlan(struct mlx4_dev *dev, u8 port, u16 vlan, int *index); |
diff --git a/include/linux/mod_devicetable.h b/include/linux/mod_devicetable.h index b29e7f6f8fa5..83ac0713ed0a 100644 --- a/include/linux/mod_devicetable.h +++ b/include/linux/mod_devicetable.h | |||
@@ -436,17 +436,6 @@ struct spi_device_id { | |||
436 | __attribute__((aligned(sizeof(kernel_ulong_t)))); | 436 | __attribute__((aligned(sizeof(kernel_ulong_t)))); |
437 | }; | 437 | }; |
438 | 438 | ||
439 | /* mcp */ | ||
440 | |||
441 | #define MCP_NAME_SIZE 20 | ||
442 | #define MCP_MODULE_PREFIX "mcp:" | ||
443 | |||
444 | struct mcp_device_id { | ||
445 | char name[MCP_NAME_SIZE]; | ||
446 | kernel_ulong_t driver_data /* Data private to the driver */ | ||
447 | __attribute__((aligned(sizeof(kernel_ulong_t)))); | ||
448 | }; | ||
449 | |||
450 | /* dmi */ | 439 | /* dmi */ |
451 | enum dmi_field { | 440 | enum dmi_field { |
452 | DMI_NONE, | 441 | DMI_NONE, |
diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h index 1a81fde8f333..221295208fd0 100644 --- a/include/linux/mtd/mtd.h +++ b/include/linux/mtd/mtd.h | |||
@@ -441,7 +441,7 @@ static inline void mtd_resume(struct mtd_info *mtd) | |||
441 | static inline int mtd_block_isbad(struct mtd_info *mtd, loff_t ofs) | 441 | static inline int mtd_block_isbad(struct mtd_info *mtd, loff_t ofs) |
442 | { | 442 | { |
443 | if (!mtd->block_isbad) | 443 | if (!mtd->block_isbad) |
444 | return -EOPNOTSUPP; | 444 | return 0; |
445 | return mtd->block_isbad(mtd, ofs); | 445 | return mtd->block_isbad(mtd, ofs); |
446 | } | 446 | } |
447 | 447 | ||
@@ -489,7 +489,7 @@ static inline int mtd_has_oob(const struct mtd_info *mtd) | |||
489 | 489 | ||
490 | static inline int mtd_can_have_bb(const struct mtd_info *mtd) | 490 | static inline int mtd_can_have_bb(const struct mtd_info *mtd) |
491 | { | 491 | { |
492 | return !!mtd->block_isbad; | 492 | return 0; |
493 | } | 493 | } |
494 | 494 | ||
495 | /* Kernel-side ioctl definitions */ | 495 | /* Kernel-side ioctl definitions */ |
diff --git a/include/linux/quota.h b/include/linux/quota.h index cb7855699037..c09fa042b5ea 100644 --- a/include/linux/quota.h +++ b/include/linux/quota.h | |||
@@ -230,7 +230,11 @@ struct mem_dqinfo { | |||
230 | struct super_block; | 230 | struct super_block; |
231 | 231 | ||
232 | #define DQF_MASK 0xffff /* Mask for format specific flags */ | 232 | #define DQF_MASK 0xffff /* Mask for format specific flags */ |
233 | #define DQF_INFO_DIRTY_B 16 | 233 | #define DQF_GETINFO_MASK 0x1ffff /* Mask for flags passed to userspace */ |
234 | #define DQF_SETINFO_MASK 0xffff /* Mask for flags modifiable from userspace */ | ||
235 | #define DQF_SYS_FILE_B 16 | ||
236 | #define DQF_SYS_FILE (1 << DQF_SYS_FILE_B) /* Quota file stored as system file */ | ||
237 | #define DQF_INFO_DIRTY_B 31 | ||
234 | #define DQF_INFO_DIRTY (1 << DQF_INFO_DIRTY_B) /* Is info dirty? */ | 238 | #define DQF_INFO_DIRTY (1 << DQF_INFO_DIRTY_B) /* Is info dirty? */ |
235 | 239 | ||
236 | extern void mark_info_dirty(struct super_block *sb, int type); | 240 | extern void mark_info_dirty(struct super_block *sb, int type); |
diff --git a/include/linux/res_counter.h b/include/linux/res_counter.h index c9d625ca659e..da81af086eaf 100644 --- a/include/linux/res_counter.h +++ b/include/linux/res_counter.h | |||
@@ -109,12 +109,18 @@ void res_counter_init(struct res_counter *counter, struct res_counter *parent); | |||
109 | * | 109 | * |
110 | * returns 0 on success and <0 if the counter->usage will exceed the | 110 | * returns 0 on success and <0 if the counter->usage will exceed the |
111 | * counter->limit _locked call expects the counter->lock to be taken | 111 | * counter->limit _locked call expects the counter->lock to be taken |
112 | * | ||
113 | * charge_nofail works the same, except that it charges the resource | ||
114 | * counter unconditionally, and returns < 0 if the after the current | ||
115 | * charge we are over limit. | ||
112 | */ | 116 | */ |
113 | 117 | ||
114 | int __must_check res_counter_charge_locked(struct res_counter *counter, | 118 | int __must_check res_counter_charge_locked(struct res_counter *counter, |
115 | unsigned long val); | 119 | unsigned long val); |
116 | int __must_check res_counter_charge(struct res_counter *counter, | 120 | int __must_check res_counter_charge(struct res_counter *counter, |
117 | unsigned long val, struct res_counter **limit_fail_at); | 121 | unsigned long val, struct res_counter **limit_fail_at); |
122 | int __must_check res_counter_charge_nofail(struct res_counter *counter, | ||
123 | unsigned long val, struct res_counter **limit_fail_at); | ||
118 | 124 | ||
119 | /* | 125 | /* |
120 | * uncharge - tell that some portion of the resource is released | 126 | * uncharge - tell that some portion of the resource is released |
@@ -142,7 +148,10 @@ static inline unsigned long long res_counter_margin(struct res_counter *cnt) | |||
142 | unsigned long flags; | 148 | unsigned long flags; |
143 | 149 | ||
144 | spin_lock_irqsave(&cnt->lock, flags); | 150 | spin_lock_irqsave(&cnt->lock, flags); |
145 | margin = cnt->limit - cnt->usage; | 151 | if (cnt->limit > cnt->usage) |
152 | margin = cnt->limit - cnt->usage; | ||
153 | else | ||
154 | margin = 0; | ||
146 | spin_unlock_irqrestore(&cnt->lock, flags); | 155 | spin_unlock_irqrestore(&cnt->lock, flags); |
147 | return margin; | 156 | return margin; |
148 | } | 157 | } |
diff --git a/include/linux/sched.h b/include/linux/sched.h index 4032ec1cf836..2234985a5e65 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
@@ -2088,9 +2088,9 @@ extern int sched_setscheduler_nocheck(struct task_struct *, int, | |||
2088 | extern struct task_struct *idle_task(int cpu); | 2088 | extern struct task_struct *idle_task(int cpu); |
2089 | /** | 2089 | /** |
2090 | * is_idle_task - is the specified task an idle task? | 2090 | * is_idle_task - is the specified task an idle task? |
2091 | * @tsk: the task in question. | 2091 | * @p: the task in question. |
2092 | */ | 2092 | */ |
2093 | static inline bool is_idle_task(struct task_struct *p) | 2093 | static inline bool is_idle_task(const struct task_struct *p) |
2094 | { | 2094 | { |
2095 | return p->pid == 0; | 2095 | return p->pid == 0; |
2096 | } | 2096 | } |
diff --git a/include/linux/shmem_fs.h b/include/linux/shmem_fs.h index e4c711c6f321..79ab2555b3b0 100644 --- a/include/linux/shmem_fs.h +++ b/include/linux/shmem_fs.h | |||
@@ -48,6 +48,7 @@ extern struct file *shmem_file_setup(const char *name, | |||
48 | loff_t size, unsigned long flags); | 48 | loff_t size, unsigned long flags); |
49 | extern int shmem_zero_setup(struct vm_area_struct *); | 49 | extern int shmem_zero_setup(struct vm_area_struct *); |
50 | extern int shmem_lock(struct file *file, int lock, struct user_struct *user); | 50 | extern int shmem_lock(struct file *file, int lock, struct user_struct *user); |
51 | extern void shmem_unlock_mapping(struct address_space *mapping); | ||
51 | extern struct page *shmem_read_mapping_page_gfp(struct address_space *mapping, | 52 | extern struct page *shmem_read_mapping_page_gfp(struct address_space *mapping, |
52 | pgoff_t index, gfp_t gfp_mask); | 53 | pgoff_t index, gfp_t gfp_mask); |
53 | extern void shmem_truncate_range(struct inode *inode, loff_t start, loff_t end); | 54 | extern void shmem_truncate_range(struct inode *inode, loff_t start, loff_t end); |
diff --git a/include/linux/snmp.h b/include/linux/snmp.h index e16557a357e5..c1241c428179 100644 --- a/include/linux/snmp.h +++ b/include/linux/snmp.h | |||
@@ -192,7 +192,6 @@ enum | |||
192 | LINUX_MIB_TCPPARTIALUNDO, /* TCPPartialUndo */ | 192 | LINUX_MIB_TCPPARTIALUNDO, /* TCPPartialUndo */ |
193 | LINUX_MIB_TCPDSACKUNDO, /* TCPDSACKUndo */ | 193 | LINUX_MIB_TCPDSACKUNDO, /* TCPDSACKUndo */ |
194 | LINUX_MIB_TCPLOSSUNDO, /* TCPLossUndo */ | 194 | LINUX_MIB_TCPLOSSUNDO, /* TCPLossUndo */ |
195 | LINUX_MIB_TCPLOSS, /* TCPLoss */ | ||
196 | LINUX_MIB_TCPLOSTRETRANSMIT, /* TCPLostRetransmit */ | 195 | LINUX_MIB_TCPLOSTRETRANSMIT, /* TCPLostRetransmit */ |
197 | LINUX_MIB_TCPRENOFAILURES, /* TCPRenoFailures */ | 196 | LINUX_MIB_TCPRENOFAILURES, /* TCPRenoFailures */ |
198 | LINUX_MIB_TCPSACKFAILURES, /* TCPSackFailures */ | 197 | LINUX_MIB_TCPSACKFAILURES, /* TCPSackFailures */ |
diff --git a/include/linux/suspend.h b/include/linux/suspend.h index 95040cc33107..91784a4f8608 100644 --- a/include/linux/suspend.h +++ b/include/linux/suspend.h | |||
@@ -357,14 +357,29 @@ extern bool pm_save_wakeup_count(unsigned int count); | |||
357 | 357 | ||
358 | static inline void lock_system_sleep(void) | 358 | static inline void lock_system_sleep(void) |
359 | { | 359 | { |
360 | freezer_do_not_count(); | 360 | current->flags |= PF_FREEZER_SKIP; |
361 | mutex_lock(&pm_mutex); | 361 | mutex_lock(&pm_mutex); |
362 | } | 362 | } |
363 | 363 | ||
364 | static inline void unlock_system_sleep(void) | 364 | static inline void unlock_system_sleep(void) |
365 | { | 365 | { |
366 | /* | ||
367 | * Don't use freezer_count() because we don't want the call to | ||
368 | * try_to_freeze() here. | ||
369 | * | ||
370 | * Reason: | ||
371 | * Fundamentally, we just don't need it, because freezing condition | ||
372 | * doesn't come into effect until we release the pm_mutex lock, | ||
373 | * since the freezer always works with pm_mutex held. | ||
374 | * | ||
375 | * More importantly, in the case of hibernation, | ||
376 | * unlock_system_sleep() gets called in snapshot_read() and | ||
377 | * snapshot_write() when the freezing condition is still in effect. | ||
378 | * Which means, if we use try_to_freeze() here, it would make them | ||
379 | * enter the refrigerator, thus causing hibernation to lockup. | ||
380 | */ | ||
381 | current->flags &= ~PF_FREEZER_SKIP; | ||
366 | mutex_unlock(&pm_mutex); | 382 | mutex_unlock(&pm_mutex); |
367 | freezer_count(); | ||
368 | } | 383 | } |
369 | 384 | ||
370 | #else /* !CONFIG_PM_SLEEP */ | 385 | #else /* !CONFIG_PM_SLEEP */ |
diff --git a/include/linux/swap.h b/include/linux/swap.h index 06061a7f8e69..3e60228e7299 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h | |||
@@ -273,7 +273,7 @@ static inline int zone_reclaim(struct zone *z, gfp_t mask, unsigned int order) | |||
273 | #endif | 273 | #endif |
274 | 274 | ||
275 | extern int page_evictable(struct page *page, struct vm_area_struct *vma); | 275 | extern int page_evictable(struct page *page, struct vm_area_struct *vma); |
276 | extern void scan_mapping_unevictable_pages(struct address_space *); | 276 | extern void check_move_unevictable_pages(struct page **, int nr_pages); |
277 | 277 | ||
278 | extern unsigned long scan_unevictable_pages; | 278 | extern unsigned long scan_unevictable_pages; |
279 | extern int scan_unevictable_handler(struct ctl_table *, int, | 279 | extern int scan_unevictable_handler(struct ctl_table *, int, |
diff --git a/include/linux/sysdev.h b/include/linux/sysdev.h deleted file mode 100644 index 20f63d3e6144..000000000000 --- a/include/linux/sysdev.h +++ /dev/null | |||
@@ -1,164 +0,0 @@ | |||
1 | /** | ||
2 | * System devices follow a slightly different driver model. | ||
3 | * They don't need to do dynammic driver binding, can't be probed, | ||
4 | * and don't reside on any type of peripheral bus. | ||
5 | * So, we represent and treat them a little differently. | ||
6 | * | ||
7 | * We still have a notion of a driver for a system device, because we still | ||
8 | * want to perform basic operations on these devices. | ||
9 | * | ||
10 | * We also support auxiliary drivers binding to devices of a certain class. | ||
11 | * | ||
12 | * This allows configurable drivers to register themselves for devices of | ||
13 | * a certain type. And, it allows class definitions to reside in generic | ||
14 | * code while arch-specific code can register specific drivers. | ||
15 | * | ||
16 | * Auxiliary drivers registered with a NULL cls are registered as drivers | ||
17 | * for all system devices, and get notification calls for each device. | ||
18 | */ | ||
19 | |||
20 | |||
21 | #ifndef _SYSDEV_H_ | ||
22 | #define _SYSDEV_H_ | ||
23 | |||
24 | #include <linux/kobject.h> | ||
25 | #include <linux/pm.h> | ||
26 | |||
27 | |||
28 | struct sys_device; | ||
29 | struct sysdev_class_attribute; | ||
30 | |||
31 | struct sysdev_class { | ||
32 | const char *name; | ||
33 | struct list_head drivers; | ||
34 | struct sysdev_class_attribute **attrs; | ||
35 | struct kset kset; | ||
36 | }; | ||
37 | |||
38 | struct sysdev_class_attribute { | ||
39 | struct attribute attr; | ||
40 | ssize_t (*show)(struct sysdev_class *, struct sysdev_class_attribute *, | ||
41 | char *); | ||
42 | ssize_t (*store)(struct sysdev_class *, struct sysdev_class_attribute *, | ||
43 | const char *, size_t); | ||
44 | }; | ||
45 | |||
46 | #define _SYSDEV_CLASS_ATTR(_name,_mode,_show,_store) \ | ||
47 | { \ | ||
48 | .attr = {.name = __stringify(_name), .mode = _mode }, \ | ||
49 | .show = _show, \ | ||
50 | .store = _store, \ | ||
51 | } | ||
52 | |||
53 | #define SYSDEV_CLASS_ATTR(_name,_mode,_show,_store) \ | ||
54 | struct sysdev_class_attribute attr_##_name = \ | ||
55 | _SYSDEV_CLASS_ATTR(_name,_mode,_show,_store) | ||
56 | |||
57 | |||
58 | extern int sysdev_class_register(struct sysdev_class *); | ||
59 | extern void sysdev_class_unregister(struct sysdev_class *); | ||
60 | |||
61 | extern int sysdev_class_create_file(struct sysdev_class *, | ||
62 | struct sysdev_class_attribute *); | ||
63 | extern void sysdev_class_remove_file(struct sysdev_class *, | ||
64 | struct sysdev_class_attribute *); | ||
65 | /** | ||
66 | * Auxiliary system device drivers. | ||
67 | */ | ||
68 | |||
69 | struct sysdev_driver { | ||
70 | struct list_head entry; | ||
71 | int (*add)(struct sys_device *); | ||
72 | int (*remove)(struct sys_device *); | ||
73 | }; | ||
74 | |||
75 | |||
76 | extern int sysdev_driver_register(struct sysdev_class *, struct sysdev_driver *); | ||
77 | extern void sysdev_driver_unregister(struct sysdev_class *, struct sysdev_driver *); | ||
78 | |||
79 | |||
80 | /** | ||
81 | * sys_devices can be simplified a lot from regular devices, because they're | ||
82 | * simply not as versatile. | ||
83 | */ | ||
84 | |||
85 | struct sys_device { | ||
86 | u32 id; | ||
87 | struct sysdev_class * cls; | ||
88 | struct kobject kobj; | ||
89 | }; | ||
90 | |||
91 | extern int sysdev_register(struct sys_device *); | ||
92 | extern void sysdev_unregister(struct sys_device *); | ||
93 | |||
94 | |||
95 | struct sysdev_attribute { | ||
96 | struct attribute attr; | ||
97 | ssize_t (*show)(struct sys_device *, struct sysdev_attribute *, char *); | ||
98 | ssize_t (*store)(struct sys_device *, struct sysdev_attribute *, | ||
99 | const char *, size_t); | ||
100 | }; | ||
101 | |||
102 | |||
103 | #define _SYSDEV_ATTR(_name, _mode, _show, _store) \ | ||
104 | { \ | ||
105 | .attr = { .name = __stringify(_name), .mode = _mode }, \ | ||
106 | .show = _show, \ | ||
107 | .store = _store, \ | ||
108 | } | ||
109 | |||
110 | #define SYSDEV_ATTR(_name, _mode, _show, _store) \ | ||
111 | struct sysdev_attribute attr_##_name = \ | ||
112 | _SYSDEV_ATTR(_name, _mode, _show, _store); | ||
113 | |||
114 | extern int sysdev_create_file(struct sys_device *, struct sysdev_attribute *); | ||
115 | extern void sysdev_remove_file(struct sys_device *, struct sysdev_attribute *); | ||
116 | |||
117 | /* Create/remove NULL terminated attribute list */ | ||
118 | static inline int | ||
119 | sysdev_create_files(struct sys_device *d, struct sysdev_attribute **a) | ||
120 | { | ||
121 | return sysfs_create_files(&d->kobj, (const struct attribute **)a); | ||
122 | } | ||
123 | |||
124 | static inline void | ||
125 | sysdev_remove_files(struct sys_device *d, struct sysdev_attribute **a) | ||
126 | { | ||
127 | return sysfs_remove_files(&d->kobj, (const struct attribute **)a); | ||
128 | } | ||
129 | |||
130 | struct sysdev_ext_attribute { | ||
131 | struct sysdev_attribute attr; | ||
132 | void *var; | ||
133 | }; | ||
134 | |||
135 | /* | ||
136 | * Support for simple variable sysdev attributes. | ||
137 | * The pointer to the variable is stored in a sysdev_ext_attribute | ||
138 | */ | ||
139 | |||
140 | /* Add more types as needed */ | ||
141 | |||
142 | extern ssize_t sysdev_show_ulong(struct sys_device *, struct sysdev_attribute *, | ||
143 | char *); | ||
144 | extern ssize_t sysdev_store_ulong(struct sys_device *, | ||
145 | struct sysdev_attribute *, const char *, size_t); | ||
146 | extern ssize_t sysdev_show_int(struct sys_device *, struct sysdev_attribute *, | ||
147 | char *); | ||
148 | extern ssize_t sysdev_store_int(struct sys_device *, | ||
149 | struct sysdev_attribute *, const char *, size_t); | ||
150 | |||
151 | #define _SYSDEV_ULONG_ATTR(_name, _mode, _var) \ | ||
152 | { _SYSDEV_ATTR(_name, _mode, sysdev_show_ulong, sysdev_store_ulong), \ | ||
153 | &(_var) } | ||
154 | #define SYSDEV_ULONG_ATTR(_name, _mode, _var) \ | ||
155 | struct sysdev_ext_attribute attr_##_name = \ | ||
156 | _SYSDEV_ULONG_ATTR(_name, _mode, _var); | ||
157 | #define _SYSDEV_INT_ATTR(_name, _mode, _var) \ | ||
158 | { _SYSDEV_ATTR(_name, _mode, sysdev_show_int, sysdev_store_int), \ | ||
159 | &(_var) } | ||
160 | #define SYSDEV_INT_ATTR(_name, _mode, _var) \ | ||
161 | struct sysdev_ext_attribute attr_##_name = \ | ||
162 | _SYSDEV_INT_ATTR(_name, _mode, _var); | ||
163 | |||
164 | #endif /* _SYSDEV_H_ */ | ||
diff --git a/include/linux/thermal.h b/include/linux/thermal.h index 47b4a27e6e97..796f1ff0388c 100644 --- a/include/linux/thermal.h +++ b/include/linux/thermal.h | |||
@@ -152,9 +152,9 @@ struct thermal_cooling_device *thermal_cooling_device_register(char *, void *, | |||
152 | void thermal_cooling_device_unregister(struct thermal_cooling_device *); | 152 | void thermal_cooling_device_unregister(struct thermal_cooling_device *); |
153 | 153 | ||
154 | #ifdef CONFIG_NET | 154 | #ifdef CONFIG_NET |
155 | extern int generate_netlink_event(u32 orig, enum events event); | 155 | extern int thermal_generate_netlink_event(u32 orig, enum events event); |
156 | #else | 156 | #else |
157 | static inline int generate_netlink_event(u32 orig, enum events event) | 157 | static inline int thermal_generate_netlink_event(u32 orig, enum events event) |
158 | { | 158 | { |
159 | return 0; | 159 | return 0; |
160 | } | 160 | } |
diff --git a/include/linux/usb.h b/include/linux/usb.h index 27a4e16d2bf1..69d845739bc2 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h | |||
@@ -1073,6 +1073,7 @@ typedef void (*usb_complete_t)(struct urb *); | |||
1073 | * which the host controller driver should use in preference to the | 1073 | * which the host controller driver should use in preference to the |
1074 | * transfer_buffer. | 1074 | * transfer_buffer. |
1075 | * @sg: scatter gather buffer list | 1075 | * @sg: scatter gather buffer list |
1076 | * @num_mapped_sgs: (internal) number of mapped sg entries | ||
1076 | * @num_sgs: number of entries in the sg list | 1077 | * @num_sgs: number of entries in the sg list |
1077 | * @transfer_buffer_length: How big is transfer_buffer. The transfer may | 1078 | * @transfer_buffer_length: How big is transfer_buffer. The transfer may |
1078 | * be broken up into chunks according to the current maximum packet | 1079 | * be broken up into chunks according to the current maximum packet |
diff --git a/include/linux/usb/langwell_otg.h b/include/linux/usb/langwell_otg.h deleted file mode 100644 index 51f17b16d312..000000000000 --- a/include/linux/usb/langwell_otg.h +++ /dev/null | |||
@@ -1,139 +0,0 @@ | |||
1 | /* | ||
2 | * Intel Langwell USB OTG transceiver driver | ||
3 | * Copyright (C) 2008 - 2010, Intel Corporation. | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify it | ||
6 | * under the terms and conditions of the GNU General Public License, | ||
7 | * version 2, as published by the Free Software Foundation. | ||
8 | * | ||
9 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
12 | * more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License along with | ||
15 | * this program; if not, write to the Free Software Foundation, Inc., | ||
16 | * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. | ||
17 | * | ||
18 | */ | ||
19 | |||
20 | #ifndef __LANGWELL_OTG_H | ||
21 | #define __LANGWELL_OTG_H | ||
22 | |||
23 | #include <linux/usb/intel_mid_otg.h> | ||
24 | |||
25 | #define CI_USBCMD 0x30 | ||
26 | # define USBCMD_RST BIT(1) | ||
27 | # define USBCMD_RS BIT(0) | ||
28 | #define CI_USBSTS 0x34 | ||
29 | # define USBSTS_SLI BIT(8) | ||
30 | # define USBSTS_URI BIT(6) | ||
31 | # define USBSTS_PCI BIT(2) | ||
32 | #define CI_PORTSC1 0x74 | ||
33 | # define PORTSC_PP BIT(12) | ||
34 | # define PORTSC_LS (BIT(11) | BIT(10)) | ||
35 | # define PORTSC_SUSP BIT(7) | ||
36 | # define PORTSC_CCS BIT(0) | ||
37 | #define CI_HOSTPC1 0xb4 | ||
38 | # define HOSTPC1_PHCD BIT(22) | ||
39 | #define CI_OTGSC 0xf4 | ||
40 | # define OTGSC_DPIE BIT(30) | ||
41 | # define OTGSC_1MSE BIT(29) | ||
42 | # define OTGSC_BSEIE BIT(28) | ||
43 | # define OTGSC_BSVIE BIT(27) | ||
44 | # define OTGSC_ASVIE BIT(26) | ||
45 | # define OTGSC_AVVIE BIT(25) | ||
46 | # define OTGSC_IDIE BIT(24) | ||
47 | # define OTGSC_DPIS BIT(22) | ||
48 | # define OTGSC_1MSS BIT(21) | ||
49 | # define OTGSC_BSEIS BIT(20) | ||
50 | # define OTGSC_BSVIS BIT(19) | ||
51 | # define OTGSC_ASVIS BIT(18) | ||
52 | # define OTGSC_AVVIS BIT(17) | ||
53 | # define OTGSC_IDIS BIT(16) | ||
54 | # define OTGSC_DPS BIT(14) | ||
55 | # define OTGSC_1MST BIT(13) | ||
56 | # define OTGSC_BSE BIT(12) | ||
57 | # define OTGSC_BSV BIT(11) | ||
58 | # define OTGSC_ASV BIT(10) | ||
59 | # define OTGSC_AVV BIT(9) | ||
60 | # define OTGSC_ID BIT(8) | ||
61 | # define OTGSC_HABA BIT(7) | ||
62 | # define OTGSC_HADP BIT(6) | ||
63 | # define OTGSC_IDPU BIT(5) | ||
64 | # define OTGSC_DP BIT(4) | ||
65 | # define OTGSC_OT BIT(3) | ||
66 | # define OTGSC_HAAR BIT(2) | ||
67 | # define OTGSC_VC BIT(1) | ||
68 | # define OTGSC_VD BIT(0) | ||
69 | # define OTGSC_INTEN_MASK (0x7f << 24) | ||
70 | # define OTGSC_INT_MASK (0x5f << 24) | ||
71 | # define OTGSC_INTSTS_MASK (0x7f << 16) | ||
72 | #define CI_USBMODE 0xf8 | ||
73 | # define USBMODE_CM (BIT(1) | BIT(0)) | ||
74 | # define USBMODE_IDLE 0 | ||
75 | # define USBMODE_DEVICE 0x2 | ||
76 | # define USBMODE_HOST 0x3 | ||
77 | #define USBCFG_ADDR 0xff10801c | ||
78 | #define USBCFG_LEN 4 | ||
79 | # define USBCFG_VBUSVAL BIT(14) | ||
80 | # define USBCFG_AVALID BIT(13) | ||
81 | # define USBCFG_BVALID BIT(12) | ||
82 | # define USBCFG_SESEND BIT(11) | ||
83 | |||
84 | #define INTR_DUMMY_MASK (USBSTS_SLI | USBSTS_URI | USBSTS_PCI) | ||
85 | |||
86 | enum langwell_otg_timer_type { | ||
87 | TA_WAIT_VRISE_TMR, | ||
88 | TA_WAIT_BCON_TMR, | ||
89 | TA_AIDL_BDIS_TMR, | ||
90 | TB_ASE0_BRST_TMR, | ||
91 | TB_SE0_SRP_TMR, | ||
92 | TB_SRP_INIT_TMR, | ||
93 | TB_SRP_FAIL_TMR, | ||
94 | TB_BUS_SUSPEND_TMR | ||
95 | }; | ||
96 | |||
97 | #define TA_WAIT_VRISE 100 | ||
98 | #define TA_WAIT_BCON 30000 | ||
99 | #define TA_AIDL_BDIS 15000 | ||
100 | #define TB_ASE0_BRST 5000 | ||
101 | #define TB_SE0_SRP 2 | ||
102 | #define TB_SRP_INIT 100 | ||
103 | #define TB_SRP_FAIL 5500 | ||
104 | #define TB_BUS_SUSPEND 500 | ||
105 | |||
106 | struct langwell_otg_timer { | ||
107 | unsigned long expires; /* Number of count increase to timeout */ | ||
108 | unsigned long count; /* Tick counter */ | ||
109 | void (*function)(unsigned long); /* Timeout function */ | ||
110 | unsigned long data; /* Data passed to function */ | ||
111 | struct list_head list; | ||
112 | }; | ||
113 | |||
114 | struct langwell_otg { | ||
115 | struct intel_mid_otg_xceiv iotg; | ||
116 | struct device *dev; | ||
117 | |||
118 | void __iomem *usbcfg; /* SCCBUSB config Reg */ | ||
119 | |||
120 | unsigned region; | ||
121 | unsigned cfg_region; | ||
122 | |||
123 | struct work_struct work; | ||
124 | struct workqueue_struct *qwork; | ||
125 | struct timer_list hsm_timer; | ||
126 | |||
127 | spinlock_t lock; | ||
128 | spinlock_t wq_lock; | ||
129 | |||
130 | struct notifier_block iotg_notifier; | ||
131 | }; | ||
132 | |||
133 | static inline | ||
134 | struct langwell_otg *mid_xceiv_to_lnw(struct intel_mid_otg_xceiv *iotg) | ||
135 | { | ||
136 | return container_of(iotg, struct langwell_otg, iotg); | ||
137 | } | ||
138 | |||
139 | #endif /* __LANGWELL_OTG_H__ */ | ||
diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h index 5b2fed5eebf2..00596e816b4d 100644 --- a/include/net/bluetooth/hci.h +++ b/include/net/bluetooth/hci.h | |||
@@ -1388,6 +1388,6 @@ struct hci_inquiry_req { | |||
1388 | }; | 1388 | }; |
1389 | #define IREQ_CACHE_FLUSH 0x0001 | 1389 | #define IREQ_CACHE_FLUSH 0x0001 |
1390 | 1390 | ||
1391 | extern int enable_hs; | 1391 | extern bool enable_hs; |
1392 | 1392 | ||
1393 | #endif /* __HCI_H */ | 1393 | #endif /* __HCI_H */ |
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index 15f4be7d768e..a067d30ce73e 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h | |||
@@ -1140,6 +1140,7 @@ struct cfg80211_disassoc_request { | |||
1140 | * @bssid: Fixed BSSID requested, maybe be %NULL, if set do not | 1140 | * @bssid: Fixed BSSID requested, maybe be %NULL, if set do not |
1141 | * search for IBSSs with a different BSSID. | 1141 | * search for IBSSs with a different BSSID. |
1142 | * @channel: The channel to use if no IBSS can be found to join. | 1142 | * @channel: The channel to use if no IBSS can be found to join. |
1143 | * @channel_type: channel type (HT mode) | ||
1143 | * @channel_fixed: The channel should be fixed -- do not search for | 1144 | * @channel_fixed: The channel should be fixed -- do not search for |
1144 | * IBSSs to join on other channels. | 1145 | * IBSSs to join on other channels. |
1145 | * @ie: information element(s) to include in the beacon | 1146 | * @ie: information element(s) to include in the beacon |
@@ -1978,6 +1979,11 @@ struct wiphy_wowlan_support { | |||
1978 | * configured as RX antennas. Antenna configuration commands will be | 1979 | * configured as RX antennas. Antenna configuration commands will be |
1979 | * rejected unless this or @available_antennas_tx is set. | 1980 | * rejected unless this or @available_antennas_tx is set. |
1980 | * | 1981 | * |
1982 | * @probe_resp_offload: | ||
1983 | * Bitmap of supported protocols for probe response offloading. | ||
1984 | * See &enum nl80211_probe_resp_offload_support_attr. Only valid | ||
1985 | * when the wiphy flag @WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD is set. | ||
1986 | * | ||
1981 | * @max_remain_on_channel_duration: Maximum time a remain-on-channel operation | 1987 | * @max_remain_on_channel_duration: Maximum time a remain-on-channel operation |
1982 | * may request, if implemented. | 1988 | * may request, if implemented. |
1983 | * | 1989 | * |
diff --git a/include/net/netns/generic.h b/include/net/netns/generic.h index 3419bf5cd154..d55f43443335 100644 --- a/include/net/netns/generic.h +++ b/include/net/netns/generic.h | |||
@@ -41,6 +41,7 @@ static inline void *net_generic(const struct net *net, int id) | |||
41 | ptr = ng->ptr[id - 1]; | 41 | ptr = ng->ptr[id - 1]; |
42 | rcu_read_unlock(); | 42 | rcu_read_unlock(); |
43 | 43 | ||
44 | BUG_ON(!ptr); | ||
44 | return ptr; | 45 | return ptr; |
45 | } | 46 | } |
46 | #endif | 47 | #endif |
diff --git a/include/net/netprio_cgroup.h b/include/net/netprio_cgroup.h index e503b87c4c1b..7b2d43139c8e 100644 --- a/include/net/netprio_cgroup.h +++ b/include/net/netprio_cgroup.h | |||
@@ -13,7 +13,6 @@ | |||
13 | 13 | ||
14 | #ifndef _NETPRIO_CGROUP_H | 14 | #ifndef _NETPRIO_CGROUP_H |
15 | #define _NETPRIO_CGROUP_H | 15 | #define _NETPRIO_CGROUP_H |
16 | #include <linux/module.h> | ||
17 | #include <linux/cgroup.h> | 16 | #include <linux/cgroup.h> |
18 | #include <linux/hardirq.h> | 17 | #include <linux/hardirq.h> |
19 | #include <linux/rcupdate.h> | 18 | #include <linux/rcupdate.h> |
diff --git a/include/net/sock.h b/include/net/sock.h index bb972d254dff..91c1c8baf020 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
@@ -55,6 +55,7 @@ | |||
55 | #include <linux/uaccess.h> | 55 | #include <linux/uaccess.h> |
56 | #include <linux/memcontrol.h> | 56 | #include <linux/memcontrol.h> |
57 | #include <linux/res_counter.h> | 57 | #include <linux/res_counter.h> |
58 | #include <linux/jump_label.h> | ||
58 | 59 | ||
59 | #include <linux/filter.h> | 60 | #include <linux/filter.h> |
60 | #include <linux/rculist_nulls.h> | 61 | #include <linux/rculist_nulls.h> |
@@ -226,6 +227,7 @@ struct cg_proto; | |||
226 | * @sk_ack_backlog: current listen backlog | 227 | * @sk_ack_backlog: current listen backlog |
227 | * @sk_max_ack_backlog: listen backlog set in listen() | 228 | * @sk_max_ack_backlog: listen backlog set in listen() |
228 | * @sk_priority: %SO_PRIORITY setting | 229 | * @sk_priority: %SO_PRIORITY setting |
230 | * @sk_cgrp_prioidx: socket group's priority map index | ||
229 | * @sk_type: socket type (%SOCK_STREAM, etc) | 231 | * @sk_type: socket type (%SOCK_STREAM, etc) |
230 | * @sk_protocol: which protocol this socket belongs in this network family | 232 | * @sk_protocol: which protocol this socket belongs in this network family |
231 | * @sk_peer_pid: &struct pid for this socket's peer | 233 | * @sk_peer_pid: &struct pid for this socket's peer |
@@ -921,7 +923,7 @@ inline void sk_refcnt_debug_release(const struct sock *sk) | |||
921 | #define sk_refcnt_debug_release(sk) do { } while (0) | 923 | #define sk_refcnt_debug_release(sk) do { } while (0) |
922 | #endif /* SOCK_REFCNT_DEBUG */ | 924 | #endif /* SOCK_REFCNT_DEBUG */ |
923 | 925 | ||
924 | #ifdef CONFIG_CGROUP_MEM_RES_CTLR_KMEM | 926 | #if defined(CONFIG_CGROUP_MEM_RES_CTLR_KMEM) && defined(CONFIG_NET) |
925 | extern struct jump_label_key memcg_socket_limit_enabled; | 927 | extern struct jump_label_key memcg_socket_limit_enabled; |
926 | static inline struct cg_proto *parent_cg_proto(struct proto *proto, | 928 | static inline struct cg_proto *parent_cg_proto(struct proto *proto, |
927 | struct cg_proto *cg_proto) | 929 | struct cg_proto *cg_proto) |
@@ -1007,9 +1009,8 @@ static inline void memcg_memory_allocated_add(struct cg_proto *prot, | |||
1007 | struct res_counter *fail; | 1009 | struct res_counter *fail; |
1008 | int ret; | 1010 | int ret; |
1009 | 1011 | ||
1010 | ret = res_counter_charge(prot->memory_allocated, | 1012 | ret = res_counter_charge_nofail(prot->memory_allocated, |
1011 | amt << PAGE_SHIFT, &fail); | 1013 | amt << PAGE_SHIFT, &fail); |
1012 | |||
1013 | if (ret < 0) | 1014 | if (ret < 0) |
1014 | *parent_status = OVER_LIMIT; | 1015 | *parent_status = OVER_LIMIT; |
1015 | } | 1016 | } |
@@ -1053,12 +1054,11 @@ sk_memory_allocated_add(struct sock *sk, int amt, int *parent_status) | |||
1053 | } | 1054 | } |
1054 | 1055 | ||
1055 | static inline void | 1056 | static inline void |
1056 | sk_memory_allocated_sub(struct sock *sk, int amt, int parent_status) | 1057 | sk_memory_allocated_sub(struct sock *sk, int amt) |
1057 | { | 1058 | { |
1058 | struct proto *prot = sk->sk_prot; | 1059 | struct proto *prot = sk->sk_prot; |
1059 | 1060 | ||
1060 | if (mem_cgroup_sockets_enabled && sk->sk_cgrp && | 1061 | if (mem_cgroup_sockets_enabled && sk->sk_cgrp) |
1061 | parent_status != OVER_LIMIT) /* Otherwise was uncharged already */ | ||
1062 | memcg_memory_allocated_sub(sk->sk_cgrp, amt); | 1062 | memcg_memory_allocated_sub(sk->sk_cgrp, amt); |
1063 | 1063 | ||
1064 | atomic_long_sub(amt, prot->memory_allocated); | 1064 | atomic_long_sub(amt, prot->memory_allocated); |
diff --git a/include/net/tcp.h b/include/net/tcp.h index 0118ea999f67..d49db0113a06 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h | |||
@@ -311,6 +311,8 @@ extern struct proto tcp_prot; | |||
311 | #define TCP_ADD_STATS_USER(net, field, val) SNMP_ADD_STATS_USER((net)->mib.tcp_statistics, field, val) | 311 | #define TCP_ADD_STATS_USER(net, field, val) SNMP_ADD_STATS_USER((net)->mib.tcp_statistics, field, val) |
312 | #define TCP_ADD_STATS(net, field, val) SNMP_ADD_STATS((net)->mib.tcp_statistics, field, val) | 312 | #define TCP_ADD_STATS(net, field, val) SNMP_ADD_STATS((net)->mib.tcp_statistics, field, val) |
313 | 313 | ||
314 | extern void tcp_init_mem(struct net *net); | ||
315 | |||
314 | extern void tcp_v4_err(struct sk_buff *skb, u32); | 316 | extern void tcp_v4_err(struct sk_buff *skb, u32); |
315 | 317 | ||
316 | extern void tcp_shutdown (struct sock *sk, int how); | 318 | extern void tcp_shutdown (struct sock *sk, int how); |
diff --git a/ipc/mqueue.c b/ipc/mqueue.c index 9b7c8ab7d75c..86ee272de210 100644 --- a/ipc/mqueue.c +++ b/ipc/mqueue.c | |||
@@ -128,7 +128,6 @@ static struct inode *mqueue_get_inode(struct super_block *sb, | |||
128 | 128 | ||
129 | if (S_ISREG(mode)) { | 129 | if (S_ISREG(mode)) { |
130 | struct mqueue_inode_info *info; | 130 | struct mqueue_inode_info *info; |
131 | struct task_struct *p = current; | ||
132 | unsigned long mq_bytes, mq_msg_tblsz; | 131 | unsigned long mq_bytes, mq_msg_tblsz; |
133 | 132 | ||
134 | inode->i_fop = &mqueue_file_operations; | 133 | inode->i_fop = &mqueue_file_operations; |
@@ -159,7 +158,7 @@ static struct inode *mqueue_get_inode(struct super_block *sb, | |||
159 | 158 | ||
160 | spin_lock(&mq_lock); | 159 | spin_lock(&mq_lock); |
161 | if (u->mq_bytes + mq_bytes < u->mq_bytes || | 160 | if (u->mq_bytes + mq_bytes < u->mq_bytes || |
162 | u->mq_bytes + mq_bytes > task_rlimit(p, RLIMIT_MSGQUEUE)) { | 161 | u->mq_bytes + mq_bytes > rlimit(RLIMIT_MSGQUEUE)) { |
163 | spin_unlock(&mq_lock); | 162 | spin_unlock(&mq_lock); |
164 | /* mqueue_evict_inode() releases info->messages */ | 163 | /* mqueue_evict_inode() releases info->messages */ |
165 | ret = -EMFILE; | 164 | ret = -EMFILE; |
@@ -870,9 +870,7 @@ SYSCALL_DEFINE3(shmctl, int, shmid, int, cmd, struct shmid_ds __user *, buf) | |||
870 | case SHM_LOCK: | 870 | case SHM_LOCK: |
871 | case SHM_UNLOCK: | 871 | case SHM_UNLOCK: |
872 | { | 872 | { |
873 | struct file *uninitialized_var(shm_file); | 873 | struct file *shm_file; |
874 | |||
875 | lru_add_drain_all(); /* drain pagevecs to lru lists */ | ||
876 | 874 | ||
877 | shp = shm_lock_check(ns, shmid); | 875 | shp = shm_lock_check(ns, shmid); |
878 | if (IS_ERR(shp)) { | 876 | if (IS_ERR(shp)) { |
@@ -895,22 +893,31 @@ SYSCALL_DEFINE3(shmctl, int, shmid, int, cmd, struct shmid_ds __user *, buf) | |||
895 | err = security_shm_shmctl(shp, cmd); | 893 | err = security_shm_shmctl(shp, cmd); |
896 | if (err) | 894 | if (err) |
897 | goto out_unlock; | 895 | goto out_unlock; |
898 | 896 | ||
899 | if(cmd==SHM_LOCK) { | 897 | shm_file = shp->shm_file; |
898 | if (is_file_hugepages(shm_file)) | ||
899 | goto out_unlock; | ||
900 | |||
901 | if (cmd == SHM_LOCK) { | ||
900 | struct user_struct *user = current_user(); | 902 | struct user_struct *user = current_user(); |
901 | if (!is_file_hugepages(shp->shm_file)) { | 903 | err = shmem_lock(shm_file, 1, user); |
902 | err = shmem_lock(shp->shm_file, 1, user); | 904 | if (!err && !(shp->shm_perm.mode & SHM_LOCKED)) { |
903 | if (!err && !(shp->shm_perm.mode & SHM_LOCKED)){ | 905 | shp->shm_perm.mode |= SHM_LOCKED; |
904 | shp->shm_perm.mode |= SHM_LOCKED; | 906 | shp->mlock_user = user; |
905 | shp->mlock_user = user; | ||
906 | } | ||
907 | } | 907 | } |
908 | } else if (!is_file_hugepages(shp->shm_file)) { | 908 | goto out_unlock; |
909 | shmem_lock(shp->shm_file, 0, shp->mlock_user); | ||
910 | shp->shm_perm.mode &= ~SHM_LOCKED; | ||
911 | shp->mlock_user = NULL; | ||
912 | } | 909 | } |
910 | |||
911 | /* SHM_UNLOCK */ | ||
912 | if (!(shp->shm_perm.mode & SHM_LOCKED)) | ||
913 | goto out_unlock; | ||
914 | shmem_lock(shm_file, 0, shp->mlock_user); | ||
915 | shp->shm_perm.mode &= ~SHM_LOCKED; | ||
916 | shp->mlock_user = NULL; | ||
917 | get_file(shm_file); | ||
913 | shm_unlock(shp); | 918 | shm_unlock(shp); |
919 | shmem_unlock_mapping(shm_file->f_mapping); | ||
920 | fput(shm_file); | ||
914 | goto out; | 921 | goto out; |
915 | } | 922 | } |
916 | case IPC_RMID: | 923 | case IPC_RMID: |
diff --git a/kernel/auditsc.c b/kernel/auditsc.c index caaea6e944f8..af1de0f34eae 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c | |||
@@ -1863,11 +1863,12 @@ void __audit_syscall_entry(int arch, int major, | |||
1863 | 1863 | ||
1864 | /** | 1864 | /** |
1865 | * audit_syscall_exit - deallocate audit context after a system call | 1865 | * audit_syscall_exit - deallocate audit context after a system call |
1866 | * @pt_regs: syscall registers | 1866 | * @success: success value of the syscall |
1867 | * @return_code: return value of the syscall | ||
1867 | * | 1868 | * |
1868 | * Tear down after system call. If the audit context has been marked as | 1869 | * Tear down after system call. If the audit context has been marked as |
1869 | * auditable (either because of the AUDIT_RECORD_CONTEXT state from | 1870 | * auditable (either because of the AUDIT_RECORD_CONTEXT state from |
1870 | * filtering, or because some other part of the kernel write an audit | 1871 | * filtering, or because some other part of the kernel wrote an audit |
1871 | * message), then write out the syscall information. In call cases, | 1872 | * message), then write out the syscall information. In call cases, |
1872 | * free the names stored from getname(). | 1873 | * free the names stored from getname(). |
1873 | */ | 1874 | */ |
diff --git a/kernel/events/callchain.c b/kernel/events/callchain.c index 057e24b665cf..6581a040f399 100644 --- a/kernel/events/callchain.c +++ b/kernel/events/callchain.c | |||
@@ -115,8 +115,6 @@ int get_callchain_buffers(void) | |||
115 | } | 115 | } |
116 | 116 | ||
117 | err = alloc_callchain_buffers(); | 117 | err = alloc_callchain_buffers(); |
118 | if (err) | ||
119 | release_callchain_buffers(); | ||
120 | exit: | 118 | exit: |
121 | mutex_unlock(&callchain_mutex); | 119 | mutex_unlock(&callchain_mutex); |
122 | 120 | ||
diff --git a/kernel/events/core.c b/kernel/events/core.c index a8f4ac001a00..32b48c889711 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c | |||
@@ -815,7 +815,7 @@ static void update_event_times(struct perf_event *event) | |||
815 | * here. | 815 | * here. |
816 | */ | 816 | */ |
817 | if (is_cgroup_event(event)) | 817 | if (is_cgroup_event(event)) |
818 | run_end = perf_event_time(event); | 818 | run_end = perf_cgroup_event_time(event); |
819 | else if (ctx->is_active) | 819 | else if (ctx->is_active) |
820 | run_end = ctx->time; | 820 | run_end = ctx->time; |
821 | else | 821 | else |
diff --git a/kernel/kprobes.c b/kernel/kprobes.c index 95dd7212e610..29f5b65bee29 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c | |||
@@ -1077,6 +1077,7 @@ void __kprobes kprobe_flush_task(struct task_struct *tk) | |||
1077 | /* Early boot. kretprobe_table_locks not yet initialized. */ | 1077 | /* Early boot. kretprobe_table_locks not yet initialized. */ |
1078 | return; | 1078 | return; |
1079 | 1079 | ||
1080 | INIT_HLIST_HEAD(&empty_rp); | ||
1080 | hash = hash_ptr(tk, KPROBE_HASH_BITS); | 1081 | hash = hash_ptr(tk, KPROBE_HASH_BITS); |
1081 | head = &kretprobe_inst_table[hash]; | 1082 | head = &kretprobe_inst_table[hash]; |
1082 | kretprobe_table_lock(hash, &flags); | 1083 | kretprobe_table_lock(hash, &flags); |
@@ -1085,7 +1086,6 @@ void __kprobes kprobe_flush_task(struct task_struct *tk) | |||
1085 | recycle_rp_inst(ri, &empty_rp); | 1086 | recycle_rp_inst(ri, &empty_rp); |
1086 | } | 1087 | } |
1087 | kretprobe_table_unlock(hash, &flags); | 1088 | kretprobe_table_unlock(hash, &flags); |
1088 | INIT_HLIST_HEAD(&empty_rp); | ||
1089 | hlist_for_each_entry_safe(ri, node, tmp, &empty_rp, hlist) { | 1089 | hlist_for_each_entry_safe(ri, node, tmp, &empty_rp, hlist) { |
1090 | hlist_del(&ri->hlist); | 1090 | hlist_del(&ri->hlist); |
1091 | kfree(ri); | 1091 | kfree(ri); |
diff --git a/kernel/power/process.c b/kernel/power/process.c index 77274c9ba2f1..eeca00311f39 100644 --- a/kernel/power/process.c +++ b/kernel/power/process.c | |||
@@ -188,3 +188,22 @@ void thaw_processes(void) | |||
188 | printk("done.\n"); | 188 | printk("done.\n"); |
189 | } | 189 | } |
190 | 190 | ||
191 | void thaw_kernel_threads(void) | ||
192 | { | ||
193 | struct task_struct *g, *p; | ||
194 | |||
195 | pm_nosig_freezing = false; | ||
196 | printk("Restarting kernel threads ... "); | ||
197 | |||
198 | thaw_workqueues(); | ||
199 | |||
200 | read_lock(&tasklist_lock); | ||
201 | do_each_thread(g, p) { | ||
202 | if (p->flags & (PF_KTHREAD | PF_WQ_WORKER)) | ||
203 | __thaw_task(p); | ||
204 | } while_each_thread(g, p); | ||
205 | read_unlock(&tasklist_lock); | ||
206 | |||
207 | schedule(); | ||
208 | printk("done.\n"); | ||
209 | } | ||
diff --git a/kernel/power/snapshot.c b/kernel/power/snapshot.c index 1cf88900ec4f..6a768e537001 100644 --- a/kernel/power/snapshot.c +++ b/kernel/power/snapshot.c | |||
@@ -812,7 +812,8 @@ unsigned int snapshot_additional_pages(struct zone *zone) | |||
812 | unsigned int res; | 812 | unsigned int res; |
813 | 813 | ||
814 | res = DIV_ROUND_UP(zone->spanned_pages, BM_BITS_PER_BLOCK); | 814 | res = DIV_ROUND_UP(zone->spanned_pages, BM_BITS_PER_BLOCK); |
815 | res += DIV_ROUND_UP(res * sizeof(struct bm_block), PAGE_SIZE); | 815 | res += DIV_ROUND_UP(res * sizeof(struct bm_block), |
816 | LINKED_PAGE_DATA_SIZE); | ||
816 | return 2 * res; | 817 | return 2 * res; |
817 | } | 818 | } |
818 | 819 | ||
diff --git a/kernel/power/user.c b/kernel/power/user.c index 6b1ab7a88522..e5a21a857302 100644 --- a/kernel/power/user.c +++ b/kernel/power/user.c | |||
@@ -274,6 +274,15 @@ static long snapshot_ioctl(struct file *filp, unsigned int cmd, | |||
274 | swsusp_free(); | 274 | swsusp_free(); |
275 | memset(&data->handle, 0, sizeof(struct snapshot_handle)); | 275 | memset(&data->handle, 0, sizeof(struct snapshot_handle)); |
276 | data->ready = 0; | 276 | data->ready = 0; |
277 | /* | ||
278 | * It is necessary to thaw kernel threads here, because | ||
279 | * SNAPSHOT_CREATE_IMAGE may be invoked directly after | ||
280 | * SNAPSHOT_FREE. In that case, if kernel threads were not | ||
281 | * thawed, the preallocation of memory carried out by | ||
282 | * hibernation_snapshot() might run into problems (i.e. it | ||
283 | * might fail or even deadlock). | ||
284 | */ | ||
285 | thaw_kernel_threads(); | ||
277 | break; | 286 | break; |
278 | 287 | ||
279 | case SNAPSHOT_PREF_IMAGE_SIZE: | 288 | case SNAPSHOT_PREF_IMAGE_SIZE: |
diff --git a/kernel/rcutorture.c b/kernel/rcutorture.c index 88f17b8a3b1d..a58ac285fc69 100644 --- a/kernel/rcutorture.c +++ b/kernel/rcutorture.c | |||
@@ -56,8 +56,8 @@ static int nreaders = -1; /* # reader threads, defaults to 2*ncpus */ | |||
56 | static int nfakewriters = 4; /* # fake writer threads */ | 56 | static int nfakewriters = 4; /* # fake writer threads */ |
57 | static int stat_interval; /* Interval between stats, in seconds. */ | 57 | static int stat_interval; /* Interval between stats, in seconds. */ |
58 | /* Defaults to "only at end of test". */ | 58 | /* Defaults to "only at end of test". */ |
59 | static int verbose; /* Print more debug info. */ | 59 | static bool verbose; /* Print more debug info. */ |
60 | static int test_no_idle_hz; /* Test RCU's support for tickless idle CPUs. */ | 60 | static bool test_no_idle_hz; /* Test RCU's support for tickless idle CPUs. */ |
61 | static int shuffle_interval = 3; /* Interval between shuffles (in sec)*/ | 61 | static int shuffle_interval = 3; /* Interval between shuffles (in sec)*/ |
62 | static int stutter = 5; /* Start/stop testing interval (in sec) */ | 62 | static int stutter = 5; /* Start/stop testing interval (in sec) */ |
63 | static int irqreader = 1; /* RCU readers from irq (timers). */ | 63 | static int irqreader = 1; /* RCU readers from irq (timers). */ |
@@ -1399,7 +1399,7 @@ rcu_torture_shutdown(void *arg) | |||
1399 | * Execute random CPU-hotplug operations at the interval specified | 1399 | * Execute random CPU-hotplug operations at the interval specified |
1400 | * by the onoff_interval. | 1400 | * by the onoff_interval. |
1401 | */ | 1401 | */ |
1402 | static int | 1402 | static int __cpuinit |
1403 | rcu_torture_onoff(void *arg) | 1403 | rcu_torture_onoff(void *arg) |
1404 | { | 1404 | { |
1405 | int cpu; | 1405 | int cpu; |
@@ -1447,7 +1447,7 @@ rcu_torture_onoff(void *arg) | |||
1447 | return 0; | 1447 | return 0; |
1448 | } | 1448 | } |
1449 | 1449 | ||
1450 | static int | 1450 | static int __cpuinit |
1451 | rcu_torture_onoff_init(void) | 1451 | rcu_torture_onoff_init(void) |
1452 | { | 1452 | { |
1453 | if (onoff_interval <= 0) | 1453 | if (onoff_interval <= 0) |
diff --git a/kernel/res_counter.c b/kernel/res_counter.c index 6d269cce7aa1..d508363858b3 100644 --- a/kernel/res_counter.c +++ b/kernel/res_counter.c | |||
@@ -66,6 +66,31 @@ done: | |||
66 | return ret; | 66 | return ret; |
67 | } | 67 | } |
68 | 68 | ||
69 | int res_counter_charge_nofail(struct res_counter *counter, unsigned long val, | ||
70 | struct res_counter **limit_fail_at) | ||
71 | { | ||
72 | int ret, r; | ||
73 | unsigned long flags; | ||
74 | struct res_counter *c; | ||
75 | |||
76 | r = ret = 0; | ||
77 | *limit_fail_at = NULL; | ||
78 | local_irq_save(flags); | ||
79 | for (c = counter; c != NULL; c = c->parent) { | ||
80 | spin_lock(&c->lock); | ||
81 | r = res_counter_charge_locked(c, val); | ||
82 | if (r) | ||
83 | c->usage += val; | ||
84 | spin_unlock(&c->lock); | ||
85 | if (r < 0 && ret == 0) { | ||
86 | *limit_fail_at = c; | ||
87 | ret = r; | ||
88 | } | ||
89 | } | ||
90 | local_irq_restore(flags); | ||
91 | |||
92 | return ret; | ||
93 | } | ||
69 | void res_counter_uncharge_locked(struct res_counter *counter, unsigned long val) | 94 | void res_counter_uncharge_locked(struct res_counter *counter, unsigned long val) |
70 | { | 95 | { |
71 | if (WARN_ON(counter->usage < val)) | 96 | if (WARN_ON(counter->usage < val)) |
diff --git a/kernel/sched/cpupri.c b/kernel/sched/cpupri.c index b0d798eaf130..d72586fdf660 100644 --- a/kernel/sched/cpupri.c +++ b/kernel/sched/cpupri.c | |||
@@ -129,7 +129,7 @@ int cpupri_find(struct cpupri *cp, struct task_struct *p, | |||
129 | * cpupri_set - update the cpu priority setting | 129 | * cpupri_set - update the cpu priority setting |
130 | * @cp: The cpupri context | 130 | * @cp: The cpupri context |
131 | * @cpu: The target cpu | 131 | * @cpu: The target cpu |
132 | * @pri: The priority (INVALID-RT99) to assign to this CPU | 132 | * @newpri: The priority (INVALID-RT99) to assign to this CPU |
133 | * | 133 | * |
134 | * Note: Assumes cpu_rq(cpu)->lock is locked | 134 | * Note: Assumes cpu_rq(cpu)->lock is locked |
135 | * | 135 | * |
@@ -200,7 +200,6 @@ void cpupri_set(struct cpupri *cp, int cpu, int newpri) | |||
200 | /** | 200 | /** |
201 | * cpupri_init - initialize the cpupri structure | 201 | * cpupri_init - initialize the cpupri structure |
202 | * @cp: The cpupri context | 202 | * @cp: The cpupri context |
203 | * @bootmem: true if allocations need to use bootmem | ||
204 | * | 203 | * |
205 | * Returns: -ENOMEM if memory fails. | 204 | * Returns: -ENOMEM if memory fails. |
206 | */ | 205 | */ |
diff --git a/mm/hugetlb.c b/mm/hugetlb.c index ea8c3a4cd2ae..5f34bd8dda34 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c | |||
@@ -2508,6 +2508,7 @@ static int hugetlb_no_page(struct mm_struct *mm, struct vm_area_struct *vma, | |||
2508 | { | 2508 | { |
2509 | struct hstate *h = hstate_vma(vma); | 2509 | struct hstate *h = hstate_vma(vma); |
2510 | int ret = VM_FAULT_SIGBUS; | 2510 | int ret = VM_FAULT_SIGBUS; |
2511 | int anon_rmap = 0; | ||
2511 | pgoff_t idx; | 2512 | pgoff_t idx; |
2512 | unsigned long size; | 2513 | unsigned long size; |
2513 | struct page *page; | 2514 | struct page *page; |
@@ -2562,14 +2563,13 @@ retry: | |||
2562 | spin_lock(&inode->i_lock); | 2563 | spin_lock(&inode->i_lock); |
2563 | inode->i_blocks += blocks_per_huge_page(h); | 2564 | inode->i_blocks += blocks_per_huge_page(h); |
2564 | spin_unlock(&inode->i_lock); | 2565 | spin_unlock(&inode->i_lock); |
2565 | page_dup_rmap(page); | ||
2566 | } else { | 2566 | } else { |
2567 | lock_page(page); | 2567 | lock_page(page); |
2568 | if (unlikely(anon_vma_prepare(vma))) { | 2568 | if (unlikely(anon_vma_prepare(vma))) { |
2569 | ret = VM_FAULT_OOM; | 2569 | ret = VM_FAULT_OOM; |
2570 | goto backout_unlocked; | 2570 | goto backout_unlocked; |
2571 | } | 2571 | } |
2572 | hugepage_add_new_anon_rmap(page, vma, address); | 2572 | anon_rmap = 1; |
2573 | } | 2573 | } |
2574 | } else { | 2574 | } else { |
2575 | /* | 2575 | /* |
@@ -2582,7 +2582,6 @@ retry: | |||
2582 | VM_FAULT_SET_HINDEX(h - hstates); | 2582 | VM_FAULT_SET_HINDEX(h - hstates); |
2583 | goto backout_unlocked; | 2583 | goto backout_unlocked; |
2584 | } | 2584 | } |
2585 | page_dup_rmap(page); | ||
2586 | } | 2585 | } |
2587 | 2586 | ||
2588 | /* | 2587 | /* |
@@ -2606,6 +2605,10 @@ retry: | |||
2606 | if (!huge_pte_none(huge_ptep_get(ptep))) | 2605 | if (!huge_pte_none(huge_ptep_get(ptep))) |
2607 | goto backout; | 2606 | goto backout; |
2608 | 2607 | ||
2608 | if (anon_rmap) | ||
2609 | hugepage_add_new_anon_rmap(page, vma, address); | ||
2610 | else | ||
2611 | page_dup_rmap(page); | ||
2609 | new_pte = make_huge_pte(vma, page, ((vma->vm_flags & VM_WRITE) | 2612 | new_pte = make_huge_pte(vma, page, ((vma->vm_flags & VM_WRITE) |
2610 | && (vma->vm_flags & VM_SHARED))); | 2613 | && (vma->vm_flags & VM_SHARED))); |
2611 | set_huge_pte_at(mm, address, ptep, new_pte); | 2614 | set_huge_pte_at(mm, address, ptep, new_pte); |
diff --git a/mm/memblock.c b/mm/memblock.c index 2f55f19b7c86..77b5f227e1d8 100644 --- a/mm/memblock.c +++ b/mm/memblock.c | |||
@@ -106,14 +106,17 @@ phys_addr_t __init_memblock memblock_find_in_range_node(phys_addr_t start, | |||
106 | if (end == MEMBLOCK_ALLOC_ACCESSIBLE) | 106 | if (end == MEMBLOCK_ALLOC_ACCESSIBLE) |
107 | end = memblock.current_limit; | 107 | end = memblock.current_limit; |
108 | 108 | ||
109 | /* adjust @start to avoid underflow and allocating the first page */ | 109 | /* avoid allocating the first page */ |
110 | start = max3(start, size, (phys_addr_t)PAGE_SIZE); | 110 | start = max_t(phys_addr_t, start, PAGE_SIZE); |
111 | end = max(start, end); | 111 | end = max(start, end); |
112 | 112 | ||
113 | for_each_free_mem_range_reverse(i, nid, &this_start, &this_end, NULL) { | 113 | for_each_free_mem_range_reverse(i, nid, &this_start, &this_end, NULL) { |
114 | this_start = clamp(this_start, start, end); | 114 | this_start = clamp(this_start, start, end); |
115 | this_end = clamp(this_end, start, end); | 115 | this_end = clamp(this_end, start, end); |
116 | 116 | ||
117 | if (this_end < size) | ||
118 | continue; | ||
119 | |||
117 | cand = round_down(this_end - size, align); | 120 | cand = round_down(this_end - size, align); |
118 | if (cand >= this_start) | 121 | if (cand >= this_start) |
119 | return cand; | 122 | return cand; |
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 3dbff4dcde35..556859fec4ef 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -379,7 +379,7 @@ static void mem_cgroup_put(struct mem_cgroup *memcg); | |||
379 | static bool mem_cgroup_is_root(struct mem_cgroup *memcg); | 379 | static bool mem_cgroup_is_root(struct mem_cgroup *memcg); |
380 | void sock_update_memcg(struct sock *sk) | 380 | void sock_update_memcg(struct sock *sk) |
381 | { | 381 | { |
382 | if (static_branch(&memcg_socket_limit_enabled)) { | 382 | if (mem_cgroup_sockets_enabled) { |
383 | struct mem_cgroup *memcg; | 383 | struct mem_cgroup *memcg; |
384 | 384 | ||
385 | BUG_ON(!sk->sk_prot->proto_cgroup); | 385 | BUG_ON(!sk->sk_prot->proto_cgroup); |
@@ -411,7 +411,7 @@ EXPORT_SYMBOL(sock_update_memcg); | |||
411 | 411 | ||
412 | void sock_release_memcg(struct sock *sk) | 412 | void sock_release_memcg(struct sock *sk) |
413 | { | 413 | { |
414 | if (static_branch(&memcg_socket_limit_enabled) && sk->sk_cgrp) { | 414 | if (mem_cgroup_sockets_enabled && sk->sk_cgrp) { |
415 | struct mem_cgroup *memcg; | 415 | struct mem_cgroup *memcg; |
416 | WARN_ON(!sk->sk_cgrp->memcg); | 416 | WARN_ON(!sk->sk_cgrp->memcg); |
417 | memcg = sk->sk_cgrp->memcg; | 417 | memcg = sk->sk_cgrp->memcg; |
@@ -3247,7 +3247,7 @@ int mem_cgroup_prepare_migration(struct page *page, | |||
3247 | ctype = MEM_CGROUP_CHARGE_TYPE_CACHE; | 3247 | ctype = MEM_CGROUP_CHARGE_TYPE_CACHE; |
3248 | else | 3248 | else |
3249 | ctype = MEM_CGROUP_CHARGE_TYPE_SHMEM; | 3249 | ctype = MEM_CGROUP_CHARGE_TYPE_SHMEM; |
3250 | __mem_cgroup_commit_charge(memcg, page, 1, pc, ctype); | 3250 | __mem_cgroup_commit_charge(memcg, newpage, 1, pc, ctype); |
3251 | return ret; | 3251 | return ret; |
3252 | } | 3252 | } |
3253 | 3253 | ||
diff --git a/mm/memory.c b/mm/memory.c index 5e30583c2605..fa2f04e0337c 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
@@ -878,15 +878,24 @@ copy_one_pte(struct mm_struct *dst_mm, struct mm_struct *src_mm, | |||
878 | } | 878 | } |
879 | if (likely(!non_swap_entry(entry))) | 879 | if (likely(!non_swap_entry(entry))) |
880 | rss[MM_SWAPENTS]++; | 880 | rss[MM_SWAPENTS]++; |
881 | else if (is_write_migration_entry(entry) && | 881 | else if (is_migration_entry(entry)) { |
882 | is_cow_mapping(vm_flags)) { | 882 | page = migration_entry_to_page(entry); |
883 | /* | 883 | |
884 | * COW mappings require pages in both parent | 884 | if (PageAnon(page)) |
885 | * and child to be set to read. | 885 | rss[MM_ANONPAGES]++; |
886 | */ | 886 | else |
887 | make_migration_entry_read(&entry); | 887 | rss[MM_FILEPAGES]++; |
888 | pte = swp_entry_to_pte(entry); | 888 | |
889 | set_pte_at(src_mm, addr, src_pte, pte); | 889 | if (is_write_migration_entry(entry) && |
890 | is_cow_mapping(vm_flags)) { | ||
891 | /* | ||
892 | * COW mappings require pages in both | ||
893 | * parent and child to be set to read. | ||
894 | */ | ||
895 | make_migration_entry_read(&entry); | ||
896 | pte = swp_entry_to_pte(entry); | ||
897 | set_pte_at(src_mm, addr, src_pte, pte); | ||
898 | } | ||
890 | } | 899 | } |
891 | } | 900 | } |
892 | goto out_set_pte; | 901 | goto out_set_pte; |
@@ -1191,6 +1200,16 @@ again: | |||
1191 | 1200 | ||
1192 | if (!non_swap_entry(entry)) | 1201 | if (!non_swap_entry(entry)) |
1193 | rss[MM_SWAPENTS]--; | 1202 | rss[MM_SWAPENTS]--; |
1203 | else if (is_migration_entry(entry)) { | ||
1204 | struct page *page; | ||
1205 | |||
1206 | page = migration_entry_to_page(entry); | ||
1207 | |||
1208 | if (PageAnon(page)) | ||
1209 | rss[MM_ANONPAGES]--; | ||
1210 | else | ||
1211 | rss[MM_FILEPAGES]--; | ||
1212 | } | ||
1194 | if (unlikely(!free_swap_and_cache(entry))) | 1213 | if (unlikely(!free_swap_and_cache(entry))) |
1195 | print_bad_pte(vma, addr, ptent, NULL); | 1214 | print_bad_pte(vma, addr, ptent, NULL); |
1196 | } | 1215 | } |
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 0027d8f4a1bb..d2186ecb36f7 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -5413,7 +5413,25 @@ __count_immobile_pages(struct zone *zone, struct page *page, int count) | |||
5413 | 5413 | ||
5414 | bool is_pageblock_removable_nolock(struct page *page) | 5414 | bool is_pageblock_removable_nolock(struct page *page) |
5415 | { | 5415 | { |
5416 | struct zone *zone = page_zone(page); | 5416 | struct zone *zone; |
5417 | unsigned long pfn; | ||
5418 | |||
5419 | /* | ||
5420 | * We have to be careful here because we are iterating over memory | ||
5421 | * sections which are not zone aware so we might end up outside of | ||
5422 | * the zone but still within the section. | ||
5423 | * We have to take care about the node as well. If the node is offline | ||
5424 | * its NODE_DATA will be NULL - see page_zone. | ||
5425 | */ | ||
5426 | if (!node_online(page_to_nid(page))) | ||
5427 | return false; | ||
5428 | |||
5429 | zone = page_zone(page); | ||
5430 | pfn = page_to_pfn(page); | ||
5431 | if (zone->zone_start_pfn > pfn || | ||
5432 | zone->zone_start_pfn + zone->spanned_pages <= pfn) | ||
5433 | return false; | ||
5434 | |||
5417 | return __count_immobile_pages(zone, page, 0); | 5435 | return __count_immobile_pages(zone, page, 0); |
5418 | } | 5436 | } |
5419 | 5437 | ||
diff --git a/mm/shmem.c b/mm/shmem.c index feead1943d92..269d049294ab 100644 --- a/mm/shmem.c +++ b/mm/shmem.c | |||
@@ -379,7 +379,7 @@ static int shmem_free_swap(struct address_space *mapping, | |||
379 | /* | 379 | /* |
380 | * Pagevec may contain swap entries, so shuffle up pages before releasing. | 380 | * Pagevec may contain swap entries, so shuffle up pages before releasing. |
381 | */ | 381 | */ |
382 | static void shmem_pagevec_release(struct pagevec *pvec) | 382 | static void shmem_deswap_pagevec(struct pagevec *pvec) |
383 | { | 383 | { |
384 | int i, j; | 384 | int i, j; |
385 | 385 | ||
@@ -389,7 +389,36 @@ static void shmem_pagevec_release(struct pagevec *pvec) | |||
389 | pvec->pages[j++] = page; | 389 | pvec->pages[j++] = page; |
390 | } | 390 | } |
391 | pvec->nr = j; | 391 | pvec->nr = j; |
392 | pagevec_release(pvec); | 392 | } |
393 | |||
394 | /* | ||
395 | * SysV IPC SHM_UNLOCK restore Unevictable pages to their evictable lists. | ||
396 | */ | ||
397 | void shmem_unlock_mapping(struct address_space *mapping) | ||
398 | { | ||
399 | struct pagevec pvec; | ||
400 | pgoff_t indices[PAGEVEC_SIZE]; | ||
401 | pgoff_t index = 0; | ||
402 | |||
403 | pagevec_init(&pvec, 0); | ||
404 | /* | ||
405 | * Minor point, but we might as well stop if someone else SHM_LOCKs it. | ||
406 | */ | ||
407 | while (!mapping_unevictable(mapping)) { | ||
408 | /* | ||
409 | * Avoid pagevec_lookup(): find_get_pages() returns 0 as if it | ||
410 | * has finished, if it hits a row of PAGEVEC_SIZE swap entries. | ||
411 | */ | ||
412 | pvec.nr = shmem_find_get_pages_and_swap(mapping, index, | ||
413 | PAGEVEC_SIZE, pvec.pages, indices); | ||
414 | if (!pvec.nr) | ||
415 | break; | ||
416 | index = indices[pvec.nr - 1] + 1; | ||
417 | shmem_deswap_pagevec(&pvec); | ||
418 | check_move_unevictable_pages(pvec.pages, pvec.nr); | ||
419 | pagevec_release(&pvec); | ||
420 | cond_resched(); | ||
421 | } | ||
393 | } | 422 | } |
394 | 423 | ||
395 | /* | 424 | /* |
@@ -440,7 +469,8 @@ void shmem_truncate_range(struct inode *inode, loff_t lstart, loff_t lend) | |||
440 | } | 469 | } |
441 | unlock_page(page); | 470 | unlock_page(page); |
442 | } | 471 | } |
443 | shmem_pagevec_release(&pvec); | 472 | shmem_deswap_pagevec(&pvec); |
473 | pagevec_release(&pvec); | ||
444 | mem_cgroup_uncharge_end(); | 474 | mem_cgroup_uncharge_end(); |
445 | cond_resched(); | 475 | cond_resched(); |
446 | index++; | 476 | index++; |
@@ -470,7 +500,8 @@ void shmem_truncate_range(struct inode *inode, loff_t lstart, loff_t lend) | |||
470 | continue; | 500 | continue; |
471 | } | 501 | } |
472 | if (index == start && indices[0] > end) { | 502 | if (index == start && indices[0] > end) { |
473 | shmem_pagevec_release(&pvec); | 503 | shmem_deswap_pagevec(&pvec); |
504 | pagevec_release(&pvec); | ||
474 | break; | 505 | break; |
475 | } | 506 | } |
476 | mem_cgroup_uncharge_start(); | 507 | mem_cgroup_uncharge_start(); |
@@ -494,7 +525,8 @@ void shmem_truncate_range(struct inode *inode, loff_t lstart, loff_t lend) | |||
494 | } | 525 | } |
495 | unlock_page(page); | 526 | unlock_page(page); |
496 | } | 527 | } |
497 | shmem_pagevec_release(&pvec); | 528 | shmem_deswap_pagevec(&pvec); |
529 | pagevec_release(&pvec); | ||
498 | mem_cgroup_uncharge_end(); | 530 | mem_cgroup_uncharge_end(); |
499 | index++; | 531 | index++; |
500 | } | 532 | } |
@@ -1068,13 +1100,6 @@ int shmem_lock(struct file *file, int lock, struct user_struct *user) | |||
1068 | user_shm_unlock(inode->i_size, user); | 1100 | user_shm_unlock(inode->i_size, user); |
1069 | info->flags &= ~VM_LOCKED; | 1101 | info->flags &= ~VM_LOCKED; |
1070 | mapping_clear_unevictable(file->f_mapping); | 1102 | mapping_clear_unevictable(file->f_mapping); |
1071 | /* | ||
1072 | * Ensure that a racing putback_lru_page() can see | ||
1073 | * the pages of this mapping are evictable when we | ||
1074 | * skip them due to !PageLRU during the scan. | ||
1075 | */ | ||
1076 | smp_mb__after_clear_bit(); | ||
1077 | scan_mapping_unevictable_pages(file->f_mapping); | ||
1078 | } | 1103 | } |
1079 | retval = 0; | 1104 | retval = 0; |
1080 | 1105 | ||
@@ -2445,6 +2470,10 @@ int shmem_lock(struct file *file, int lock, struct user_struct *user) | |||
2445 | return 0; | 2470 | return 0; |
2446 | } | 2471 | } |
2447 | 2472 | ||
2473 | void shmem_unlock_mapping(struct address_space *mapping) | ||
2474 | { | ||
2475 | } | ||
2476 | |||
2448 | void shmem_truncate_range(struct inode *inode, loff_t lstart, loff_t lend) | 2477 | void shmem_truncate_range(struct inode *inode, loff_t lstart, loff_t lend) |
2449 | { | 2478 | { |
2450 | truncate_inode_pages_range(inode->i_mapping, lstart, lend); | 2479 | truncate_inode_pages_range(inode->i_mapping, lstart, lend); |
diff --git a/mm/vmscan.c b/mm/vmscan.c index 2880396f7953..c52b23552659 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
@@ -26,7 +26,6 @@ | |||
26 | #include <linux/buffer_head.h> /* for try_to_release_page(), | 26 | #include <linux/buffer_head.h> /* for try_to_release_page(), |
27 | buffer_heads_over_limit */ | 27 | buffer_heads_over_limit */ |
28 | #include <linux/mm_inline.h> | 28 | #include <linux/mm_inline.h> |
29 | #include <linux/pagevec.h> | ||
30 | #include <linux/backing-dev.h> | 29 | #include <linux/backing-dev.h> |
31 | #include <linux/rmap.h> | 30 | #include <linux/rmap.h> |
32 | #include <linux/topology.h> | 31 | #include <linux/topology.h> |
@@ -661,7 +660,7 @@ redo: | |||
661 | * When racing with an mlock or AS_UNEVICTABLE clearing | 660 | * When racing with an mlock or AS_UNEVICTABLE clearing |
662 | * (page is unlocked) make sure that if the other thread | 661 | * (page is unlocked) make sure that if the other thread |
663 | * does not observe our setting of PG_lru and fails | 662 | * does not observe our setting of PG_lru and fails |
664 | * isolation/check_move_unevictable_page, | 663 | * isolation/check_move_unevictable_pages, |
665 | * we see PG_mlocked/AS_UNEVICTABLE cleared below and move | 664 | * we see PG_mlocked/AS_UNEVICTABLE cleared below and move |
666 | * the page back to the evictable list. | 665 | * the page back to the evictable list. |
667 | * | 666 | * |
@@ -3499,100 +3498,61 @@ int page_evictable(struct page *page, struct vm_area_struct *vma) | |||
3499 | return 1; | 3498 | return 1; |
3500 | } | 3499 | } |
3501 | 3500 | ||
3501 | #ifdef CONFIG_SHMEM | ||
3502 | /** | 3502 | /** |
3503 | * check_move_unevictable_page - check page for evictability and move to appropriate zone lru list | 3503 | * check_move_unevictable_pages - check pages for evictability and move to appropriate zone lru list |
3504 | * @page: page to check evictability and move to appropriate lru list | 3504 | * @pages: array of pages to check |
3505 | * @zone: zone page is in | 3505 | * @nr_pages: number of pages to check |
3506 | * | 3506 | * |
3507 | * Checks a page for evictability and moves the page to the appropriate | 3507 | * Checks pages for evictability and moves them to the appropriate lru list. |
3508 | * zone lru list. | ||
3509 | * | 3508 | * |
3510 | * Restrictions: zone->lru_lock must be held, page must be on LRU and must | 3509 | * This function is only used for SysV IPC SHM_UNLOCK. |
3511 | * have PageUnevictable set. | ||
3512 | */ | 3510 | */ |
3513 | static void check_move_unevictable_page(struct page *page, struct zone *zone) | 3511 | void check_move_unevictable_pages(struct page **pages, int nr_pages) |
3514 | { | 3512 | { |
3515 | struct lruvec *lruvec; | 3513 | struct lruvec *lruvec; |
3514 | struct zone *zone = NULL; | ||
3515 | int pgscanned = 0; | ||
3516 | int pgrescued = 0; | ||
3517 | int i; | ||
3516 | 3518 | ||
3517 | VM_BUG_ON(PageActive(page)); | 3519 | for (i = 0; i < nr_pages; i++) { |
3518 | retry: | 3520 | struct page *page = pages[i]; |
3519 | ClearPageUnevictable(page); | 3521 | struct zone *pagezone; |
3520 | if (page_evictable(page, NULL)) { | ||
3521 | enum lru_list l = page_lru_base_type(page); | ||
3522 | |||
3523 | __dec_zone_state(zone, NR_UNEVICTABLE); | ||
3524 | lruvec = mem_cgroup_lru_move_lists(zone, page, | ||
3525 | LRU_UNEVICTABLE, l); | ||
3526 | list_move(&page->lru, &lruvec->lists[l]); | ||
3527 | __inc_zone_state(zone, NR_INACTIVE_ANON + l); | ||
3528 | __count_vm_event(UNEVICTABLE_PGRESCUED); | ||
3529 | } else { | ||
3530 | /* | ||
3531 | * rotate unevictable list | ||
3532 | */ | ||
3533 | SetPageUnevictable(page); | ||
3534 | lruvec = mem_cgroup_lru_move_lists(zone, page, LRU_UNEVICTABLE, | ||
3535 | LRU_UNEVICTABLE); | ||
3536 | list_move(&page->lru, &lruvec->lists[LRU_UNEVICTABLE]); | ||
3537 | if (page_evictable(page, NULL)) | ||
3538 | goto retry; | ||
3539 | } | ||
3540 | } | ||
3541 | |||
3542 | /** | ||
3543 | * scan_mapping_unevictable_pages - scan an address space for evictable pages | ||
3544 | * @mapping: struct address_space to scan for evictable pages | ||
3545 | * | ||
3546 | * Scan all pages in mapping. Check unevictable pages for | ||
3547 | * evictability and move them to the appropriate zone lru list. | ||
3548 | */ | ||
3549 | void scan_mapping_unevictable_pages(struct address_space *mapping) | ||
3550 | { | ||
3551 | pgoff_t next = 0; | ||
3552 | pgoff_t end = (i_size_read(mapping->host) + PAGE_CACHE_SIZE - 1) >> | ||
3553 | PAGE_CACHE_SHIFT; | ||
3554 | struct zone *zone; | ||
3555 | struct pagevec pvec; | ||
3556 | |||
3557 | if (mapping->nrpages == 0) | ||
3558 | return; | ||
3559 | |||
3560 | pagevec_init(&pvec, 0); | ||
3561 | while (next < end && | ||
3562 | pagevec_lookup(&pvec, mapping, next, PAGEVEC_SIZE)) { | ||
3563 | int i; | ||
3564 | int pg_scanned = 0; | ||
3565 | |||
3566 | zone = NULL; | ||
3567 | |||
3568 | for (i = 0; i < pagevec_count(&pvec); i++) { | ||
3569 | struct page *page = pvec.pages[i]; | ||
3570 | pgoff_t page_index = page->index; | ||
3571 | struct zone *pagezone = page_zone(page); | ||
3572 | 3522 | ||
3573 | pg_scanned++; | 3523 | pgscanned++; |
3574 | if (page_index > next) | 3524 | pagezone = page_zone(page); |
3575 | next = page_index; | 3525 | if (pagezone != zone) { |
3576 | next++; | 3526 | if (zone) |
3527 | spin_unlock_irq(&zone->lru_lock); | ||
3528 | zone = pagezone; | ||
3529 | spin_lock_irq(&zone->lru_lock); | ||
3530 | } | ||
3577 | 3531 | ||
3578 | if (pagezone != zone) { | 3532 | if (!PageLRU(page) || !PageUnevictable(page)) |
3579 | if (zone) | 3533 | continue; |
3580 | spin_unlock_irq(&zone->lru_lock); | ||
3581 | zone = pagezone; | ||
3582 | spin_lock_irq(&zone->lru_lock); | ||
3583 | } | ||
3584 | 3534 | ||
3585 | if (PageLRU(page) && PageUnevictable(page)) | 3535 | if (page_evictable(page, NULL)) { |
3586 | check_move_unevictable_page(page, zone); | 3536 | enum lru_list lru = page_lru_base_type(page); |
3537 | |||
3538 | VM_BUG_ON(PageActive(page)); | ||
3539 | ClearPageUnevictable(page); | ||
3540 | __dec_zone_state(zone, NR_UNEVICTABLE); | ||
3541 | lruvec = mem_cgroup_lru_move_lists(zone, page, | ||
3542 | LRU_UNEVICTABLE, lru); | ||
3543 | list_move(&page->lru, &lruvec->lists[lru]); | ||
3544 | __inc_zone_state(zone, NR_INACTIVE_ANON + lru); | ||
3545 | pgrescued++; | ||
3587 | } | 3546 | } |
3588 | if (zone) | ||
3589 | spin_unlock_irq(&zone->lru_lock); | ||
3590 | pagevec_release(&pvec); | ||
3591 | |||
3592 | count_vm_events(UNEVICTABLE_PGSCANNED, pg_scanned); | ||
3593 | } | 3547 | } |
3594 | 3548 | ||
3549 | if (zone) { | ||
3550 | __count_vm_events(UNEVICTABLE_PGRESCUED, pgrescued); | ||
3551 | __count_vm_events(UNEVICTABLE_PGSCANNED, pgscanned); | ||
3552 | spin_unlock_irq(&zone->lru_lock); | ||
3553 | } | ||
3595 | } | 3554 | } |
3555 | #endif /* CONFIG_SHMEM */ | ||
3596 | 3556 | ||
3597 | static void warn_scan_unevictable_pages(void) | 3557 | static void warn_scan_unevictable_pages(void) |
3598 | { | 3558 | { |
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index 845da3ee56a0..9de93714213a 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c | |||
@@ -55,7 +55,7 @@ | |||
55 | 55 | ||
56 | #define AUTO_OFF_TIMEOUT 2000 | 56 | #define AUTO_OFF_TIMEOUT 2000 |
57 | 57 | ||
58 | int enable_hs; | 58 | bool enable_hs; |
59 | 59 | ||
60 | static void hci_rx_work(struct work_struct *work); | 60 | static void hci_rx_work(struct work_struct *work); |
61 | static void hci_cmd_work(struct work_struct *work); | 61 | static void hci_cmd_work(struct work_struct *work); |
diff --git a/net/caif/caif_dev.c b/net/caif/caif_dev.c index 673728add60b..82c57069415f 100644 --- a/net/caif/caif_dev.c +++ b/net/caif/caif_dev.c | |||
@@ -59,8 +59,6 @@ struct cfcnfg *get_cfcnfg(struct net *net) | |||
59 | { | 59 | { |
60 | struct caif_net *caifn; | 60 | struct caif_net *caifn; |
61 | caifn = net_generic(net, caif_net_id); | 61 | caifn = net_generic(net, caif_net_id); |
62 | if (!caifn) | ||
63 | return NULL; | ||
64 | return caifn->cfg; | 62 | return caifn->cfg; |
65 | } | 63 | } |
66 | EXPORT_SYMBOL(get_cfcnfg); | 64 | EXPORT_SYMBOL(get_cfcnfg); |
@@ -69,8 +67,6 @@ static struct caif_device_entry_list *caif_device_list(struct net *net) | |||
69 | { | 67 | { |
70 | struct caif_net *caifn; | 68 | struct caif_net *caifn; |
71 | caifn = net_generic(net, caif_net_id); | 69 | caifn = net_generic(net, caif_net_id); |
72 | if (!caifn) | ||
73 | return NULL; | ||
74 | return &caifn->caifdevs; | 70 | return &caifn->caifdevs; |
75 | } | 71 | } |
76 | 72 | ||
@@ -99,8 +95,6 @@ static struct caif_device_entry *caif_device_alloc(struct net_device *dev) | |||
99 | struct caif_device_entry *caifd; | 95 | struct caif_device_entry *caifd; |
100 | 96 | ||
101 | caifdevs = caif_device_list(dev_net(dev)); | 97 | caifdevs = caif_device_list(dev_net(dev)); |
102 | if (!caifdevs) | ||
103 | return NULL; | ||
104 | 98 | ||
105 | caifd = kzalloc(sizeof(*caifd), GFP_KERNEL); | 99 | caifd = kzalloc(sizeof(*caifd), GFP_KERNEL); |
106 | if (!caifd) | 100 | if (!caifd) |
@@ -120,8 +114,6 @@ static struct caif_device_entry *caif_get(struct net_device *dev) | |||
120 | struct caif_device_entry_list *caifdevs = | 114 | struct caif_device_entry_list *caifdevs = |
121 | caif_device_list(dev_net(dev)); | 115 | caif_device_list(dev_net(dev)); |
122 | struct caif_device_entry *caifd; | 116 | struct caif_device_entry *caifd; |
123 | if (!caifdevs) | ||
124 | return NULL; | ||
125 | 117 | ||
126 | list_for_each_entry_rcu(caifd, &caifdevs->list, list) { | 118 | list_for_each_entry_rcu(caifd, &caifdevs->list, list) { |
127 | if (caifd->netdev == dev) | 119 | if (caifd->netdev == dev) |
@@ -321,8 +313,6 @@ void caif_enroll_dev(struct net_device *dev, struct caif_dev_common *caifdev, | |||
321 | struct caif_device_entry_list *caifdevs; | 313 | struct caif_device_entry_list *caifdevs; |
322 | 314 | ||
323 | caifdevs = caif_device_list(dev_net(dev)); | 315 | caifdevs = caif_device_list(dev_net(dev)); |
324 | if (!cfg || !caifdevs) | ||
325 | return; | ||
326 | caifd = caif_device_alloc(dev); | 316 | caifd = caif_device_alloc(dev); |
327 | if (!caifd) | 317 | if (!caifd) |
328 | return; | 318 | return; |
@@ -374,8 +364,6 @@ static int caif_device_notify(struct notifier_block *me, unsigned long what, | |||
374 | 364 | ||
375 | cfg = get_cfcnfg(dev_net(dev)); | 365 | cfg = get_cfcnfg(dev_net(dev)); |
376 | caifdevs = caif_device_list(dev_net(dev)); | 366 | caifdevs = caif_device_list(dev_net(dev)); |
377 | if (!cfg || !caifdevs) | ||
378 | return 0; | ||
379 | 367 | ||
380 | caifd = caif_get(dev); | 368 | caifd = caif_get(dev); |
381 | if (caifd == NULL && dev->type != ARPHRD_CAIF) | 369 | if (caifd == NULL && dev->type != ARPHRD_CAIF) |
@@ -507,9 +495,6 @@ static struct notifier_block caif_device_notifier = { | |||
507 | static int caif_init_net(struct net *net) | 495 | static int caif_init_net(struct net *net) |
508 | { | 496 | { |
509 | struct caif_net *caifn = net_generic(net, caif_net_id); | 497 | struct caif_net *caifn = net_generic(net, caif_net_id); |
510 | if (WARN_ON(!caifn)) | ||
511 | return -EINVAL; | ||
512 | |||
513 | INIT_LIST_HEAD(&caifn->caifdevs.list); | 498 | INIT_LIST_HEAD(&caifn->caifdevs.list); |
514 | mutex_init(&caifn->caifdevs.lock); | 499 | mutex_init(&caifn->caifdevs.lock); |
515 | 500 | ||
@@ -527,9 +512,6 @@ static void caif_exit_net(struct net *net) | |||
527 | caif_device_list(net); | 512 | caif_device_list(net); |
528 | struct cfcnfg *cfg = get_cfcnfg(net); | 513 | struct cfcnfg *cfg = get_cfcnfg(net); |
529 | 514 | ||
530 | if (!cfg || !caifdevs) | ||
531 | return; | ||
532 | |||
533 | rtnl_lock(); | 515 | rtnl_lock(); |
534 | mutex_lock(&caifdevs->lock); | 516 | mutex_lock(&caifdevs->lock); |
535 | 517 | ||
@@ -569,7 +551,7 @@ static int __init caif_device_init(void) | |||
569 | { | 551 | { |
570 | int result; | 552 | int result; |
571 | 553 | ||
572 | result = register_pernet_device(&caif_net_ops); | 554 | result = register_pernet_subsys(&caif_net_ops); |
573 | 555 | ||
574 | if (result) | 556 | if (result) |
575 | return result; | 557 | return result; |
@@ -582,7 +564,7 @@ static int __init caif_device_init(void) | |||
582 | 564 | ||
583 | static void __exit caif_device_exit(void) | 565 | static void __exit caif_device_exit(void) |
584 | { | 566 | { |
585 | unregister_pernet_device(&caif_net_ops); | 567 | unregister_pernet_subsys(&caif_net_ops); |
586 | unregister_netdevice_notifier(&caif_device_notifier); | 568 | unregister_netdevice_notifier(&caif_device_notifier); |
587 | dev_remove_pack(&caif_packet_type); | 569 | dev_remove_pack(&caif_packet_type); |
588 | } | 570 | } |
diff --git a/net/caif/cfcnfg.c b/net/caif/cfcnfg.c index 598aafb4cb51..ba9cfd47778a 100644 --- a/net/caif/cfcnfg.c +++ b/net/caif/cfcnfg.c | |||
@@ -309,7 +309,6 @@ int caif_connect_client(struct net *net, struct caif_connect_request *conn_req, | |||
309 | int err; | 309 | int err; |
310 | struct cfctrl_link_param param; | 310 | struct cfctrl_link_param param; |
311 | struct cfcnfg *cfg = get_cfcnfg(net); | 311 | struct cfcnfg *cfg = get_cfcnfg(net); |
312 | caif_assert(cfg != NULL); | ||
313 | 312 | ||
314 | rcu_read_lock(); | 313 | rcu_read_lock(); |
315 | err = caif_connect_req_to_link_param(cfg, conn_req, ¶m); | 314 | err = caif_connect_req_to_link_param(cfg, conn_req, ¶m); |
diff --git a/net/core/ethtool.c b/net/core/ethtool.c index 921aa2b4b415..369b41894527 100644 --- a/net/core/ethtool.c +++ b/net/core/ethtool.c | |||
@@ -1311,6 +1311,7 @@ int dev_ethtool(struct net *net, struct ifreq *ifr) | |||
1311 | case ETHTOOL_GRXCSUM: | 1311 | case ETHTOOL_GRXCSUM: |
1312 | case ETHTOOL_GTXCSUM: | 1312 | case ETHTOOL_GTXCSUM: |
1313 | case ETHTOOL_GSG: | 1313 | case ETHTOOL_GSG: |
1314 | case ETHTOOL_GSSET_INFO: | ||
1314 | case ETHTOOL_GSTRINGS: | 1315 | case ETHTOOL_GSTRINGS: |
1315 | case ETHTOOL_GTSO: | 1316 | case ETHTOOL_GTSO: |
1316 | case ETHTOOL_GPERMADDR: | 1317 | case ETHTOOL_GPERMADDR: |
diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c index 0985b9b14b80..a225089df5b6 100644 --- a/net/core/flow_dissector.c +++ b/net/core/flow_dissector.c | |||
@@ -1,4 +1,5 @@ | |||
1 | #include <linux/skbuff.h> | 1 | #include <linux/skbuff.h> |
2 | #include <linux/export.h> | ||
2 | #include <linux/ip.h> | 3 | #include <linux/ip.h> |
3 | #include <linux/ipv6.h> | 4 | #include <linux/ipv6.h> |
4 | #include <linux/if_vlan.h> | 5 | #include <linux/if_vlan.h> |
diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c index aefcd7acbffa..0e950fda9a0a 100644 --- a/net/core/net_namespace.c +++ b/net/core/net_namespace.c | |||
@@ -30,6 +30,20 @@ EXPORT_SYMBOL(init_net); | |||
30 | 30 | ||
31 | #define INITIAL_NET_GEN_PTRS 13 /* +1 for len +2 for rcu_head */ | 31 | #define INITIAL_NET_GEN_PTRS 13 /* +1 for len +2 for rcu_head */ |
32 | 32 | ||
33 | static unsigned int max_gen_ptrs = INITIAL_NET_GEN_PTRS; | ||
34 | |||
35 | static struct net_generic *net_alloc_generic(void) | ||
36 | { | ||
37 | struct net_generic *ng; | ||
38 | size_t generic_size = offsetof(struct net_generic, ptr[max_gen_ptrs]); | ||
39 | |||
40 | ng = kzalloc(generic_size, GFP_KERNEL); | ||
41 | if (ng) | ||
42 | ng->len = max_gen_ptrs; | ||
43 | |||
44 | return ng; | ||
45 | } | ||
46 | |||
33 | static int net_assign_generic(struct net *net, int id, void *data) | 47 | static int net_assign_generic(struct net *net, int id, void *data) |
34 | { | 48 | { |
35 | struct net_generic *ng, *old_ng; | 49 | struct net_generic *ng, *old_ng; |
@@ -43,8 +57,7 @@ static int net_assign_generic(struct net *net, int id, void *data) | |||
43 | if (old_ng->len >= id) | 57 | if (old_ng->len >= id) |
44 | goto assign; | 58 | goto assign; |
45 | 59 | ||
46 | ng = kzalloc(sizeof(struct net_generic) + | 60 | ng = net_alloc_generic(); |
47 | id * sizeof(void *), GFP_KERNEL); | ||
48 | if (ng == NULL) | 61 | if (ng == NULL) |
49 | return -ENOMEM; | 62 | return -ENOMEM; |
50 | 63 | ||
@@ -59,7 +72,6 @@ static int net_assign_generic(struct net *net, int id, void *data) | |||
59 | * the old copy for kfree after a grace period. | 72 | * the old copy for kfree after a grace period. |
60 | */ | 73 | */ |
61 | 74 | ||
62 | ng->len = id; | ||
63 | memcpy(&ng->ptr, &old_ng->ptr, old_ng->len * sizeof(void*)); | 75 | memcpy(&ng->ptr, &old_ng->ptr, old_ng->len * sizeof(void*)); |
64 | 76 | ||
65 | rcu_assign_pointer(net->gen, ng); | 77 | rcu_assign_pointer(net->gen, ng); |
@@ -161,18 +173,6 @@ out_undo: | |||
161 | goto out; | 173 | goto out; |
162 | } | 174 | } |
163 | 175 | ||
164 | static struct net_generic *net_alloc_generic(void) | ||
165 | { | ||
166 | struct net_generic *ng; | ||
167 | size_t generic_size = sizeof(struct net_generic) + | ||
168 | INITIAL_NET_GEN_PTRS * sizeof(void *); | ||
169 | |||
170 | ng = kzalloc(generic_size, GFP_KERNEL); | ||
171 | if (ng) | ||
172 | ng->len = INITIAL_NET_GEN_PTRS; | ||
173 | |||
174 | return ng; | ||
175 | } | ||
176 | 176 | ||
177 | #ifdef CONFIG_NET_NS | 177 | #ifdef CONFIG_NET_NS |
178 | static struct kmem_cache *net_cachep; | 178 | static struct kmem_cache *net_cachep; |
@@ -483,6 +483,7 @@ again: | |||
483 | } | 483 | } |
484 | return error; | 484 | return error; |
485 | } | 485 | } |
486 | max_gen_ptrs = max_t(unsigned int, max_gen_ptrs, *ops->id); | ||
486 | } | 487 | } |
487 | error = __register_pernet_operations(list, ops); | 488 | error = __register_pernet_operations(list, ops); |
488 | if (error) { | 489 | if (error) { |
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 65f80c7b1656..4d8ce93cd503 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c | |||
@@ -767,8 +767,8 @@ done: | |||
767 | return i; | 767 | return i; |
768 | } | 768 | } |
769 | 769 | ||
770 | static unsigned long num_arg(const char __user * user_buffer, | 770 | static long num_arg(const char __user *user_buffer, unsigned long maxlen, |
771 | unsigned long maxlen, unsigned long *num) | 771 | unsigned long *num) |
772 | { | 772 | { |
773 | int i; | 773 | int i; |
774 | *num = 0; | 774 | *num = 0; |
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index f16444bc6cbb..65aebd450027 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
@@ -1509,6 +1509,9 @@ errout: | |||
1509 | 1509 | ||
1510 | if (send_addr_notify) | 1510 | if (send_addr_notify) |
1511 | call_netdevice_notifiers(NETDEV_CHANGEADDR, dev); | 1511 | call_netdevice_notifiers(NETDEV_CHANGEADDR, dev); |
1512 | min_ifinfo_dump_size = max_t(u16, if_nlmsg_size(dev), | ||
1513 | min_ifinfo_dump_size); | ||
1514 | |||
1512 | return err; | 1515 | return err; |
1513 | } | 1516 | } |
1514 | 1517 | ||
diff --git a/net/core/sock.c b/net/core/sock.c index 5c5af9988f94..3e81fd2e3c75 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
@@ -1827,7 +1827,7 @@ suppress_allocation: | |||
1827 | /* Alas. Undo changes. */ | 1827 | /* Alas. Undo changes. */ |
1828 | sk->sk_forward_alloc -= amt * SK_MEM_QUANTUM; | 1828 | sk->sk_forward_alloc -= amt * SK_MEM_QUANTUM; |
1829 | 1829 | ||
1830 | sk_memory_allocated_sub(sk, amt, parent_status); | 1830 | sk_memory_allocated_sub(sk, amt); |
1831 | 1831 | ||
1832 | return 0; | 1832 | return 0; |
1833 | } | 1833 | } |
@@ -1840,7 +1840,7 @@ EXPORT_SYMBOL(__sk_mem_schedule); | |||
1840 | void __sk_mem_reclaim(struct sock *sk) | 1840 | void __sk_mem_reclaim(struct sock *sk) |
1841 | { | 1841 | { |
1842 | sk_memory_allocated_sub(sk, | 1842 | sk_memory_allocated_sub(sk, |
1843 | sk->sk_forward_alloc >> SK_MEM_QUANTUM_SHIFT, 0); | 1843 | sk->sk_forward_alloc >> SK_MEM_QUANTUM_SHIFT); |
1844 | sk->sk_forward_alloc &= SK_MEM_QUANTUM - 1; | 1844 | sk->sk_forward_alloc &= SK_MEM_QUANTUM - 1; |
1845 | 1845 | ||
1846 | if (sk_under_memory_pressure(sk) && | 1846 | if (sk_under_memory_pressure(sk) && |
diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c index 2e4e24476c4c..19d66cefd7d3 100644 --- a/net/ipv4/inet_connection_sock.c +++ b/net/ipv4/inet_connection_sock.c | |||
@@ -123,11 +123,14 @@ again: | |||
123 | smallest_size = tb->num_owners; | 123 | smallest_size = tb->num_owners; |
124 | smallest_rover = rover; | 124 | smallest_rover = rover; |
125 | if (atomic_read(&hashinfo->bsockets) > (high - low) + 1) { | 125 | if (atomic_read(&hashinfo->bsockets) > (high - low) + 1) { |
126 | spin_unlock(&head->lock); | ||
127 | snum = smallest_rover; | 126 | snum = smallest_rover; |
128 | goto have_snum; | 127 | goto tb_found; |
129 | } | 128 | } |
130 | } | 129 | } |
130 | if (!inet_csk(sk)->icsk_af_ops->bind_conflict(sk, tb)) { | ||
131 | snum = rover; | ||
132 | goto tb_found; | ||
133 | } | ||
131 | goto next; | 134 | goto next; |
132 | } | 135 | } |
133 | break; | 136 | break; |
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c index 2b53a1f7abf6..6b3ca5ba4450 100644 --- a/net/ipv4/ip_gre.c +++ b/net/ipv4/ip_gre.c | |||
@@ -422,6 +422,10 @@ static struct ip_tunnel *ipgre_tunnel_locate(struct net *net, | |||
422 | if (register_netdevice(dev) < 0) | 422 | if (register_netdevice(dev) < 0) |
423 | goto failed_free; | 423 | goto failed_free; |
424 | 424 | ||
425 | /* Can use a lockless transmit, unless we generate output sequences */ | ||
426 | if (!(nt->parms.o_flags & GRE_SEQ)) | ||
427 | dev->features |= NETIF_F_LLTX; | ||
428 | |||
425 | dev_hold(dev); | 429 | dev_hold(dev); |
426 | ipgre_tunnel_link(ign, nt); | 430 | ipgre_tunnel_link(ign, nt); |
427 | return nt; | 431 | return nt; |
diff --git a/net/ipv4/proc.c b/net/ipv4/proc.c index 3569d8ecaeac..6afc807ee2ad 100644 --- a/net/ipv4/proc.c +++ b/net/ipv4/proc.c | |||
@@ -216,7 +216,6 @@ static const struct snmp_mib snmp4_net_list[] = { | |||
216 | SNMP_MIB_ITEM("TCPPartialUndo", LINUX_MIB_TCPPARTIALUNDO), | 216 | SNMP_MIB_ITEM("TCPPartialUndo", LINUX_MIB_TCPPARTIALUNDO), |
217 | SNMP_MIB_ITEM("TCPDSACKUndo", LINUX_MIB_TCPDSACKUNDO), | 217 | SNMP_MIB_ITEM("TCPDSACKUndo", LINUX_MIB_TCPDSACKUNDO), |
218 | SNMP_MIB_ITEM("TCPLossUndo", LINUX_MIB_TCPLOSSUNDO), | 218 | SNMP_MIB_ITEM("TCPLossUndo", LINUX_MIB_TCPLOSSUNDO), |
219 | SNMP_MIB_ITEM("TCPLoss", LINUX_MIB_TCPLOSS), | ||
220 | SNMP_MIB_ITEM("TCPLostRetransmit", LINUX_MIB_TCPLOSTRETRANSMIT), | 219 | SNMP_MIB_ITEM("TCPLostRetransmit", LINUX_MIB_TCPLOSTRETRANSMIT), |
221 | SNMP_MIB_ITEM("TCPRenoFailures", LINUX_MIB_TCPRENOFAILURES), | 220 | SNMP_MIB_ITEM("TCPRenoFailures", LINUX_MIB_TCPRENOFAILURES), |
222 | SNMP_MIB_ITEM("TCPSackFailures", LINUX_MIB_TCPSACKFAILURES), | 221 | SNMP_MIB_ITEM("TCPSackFailures", LINUX_MIB_TCPSACKFAILURES), |
diff --git a/net/ipv4/sysctl_net_ipv4.c b/net/ipv4/sysctl_net_ipv4.c index 4aa7e9dc0cbb..4cb9cd2f2c39 100644 --- a/net/ipv4/sysctl_net_ipv4.c +++ b/net/ipv4/sysctl_net_ipv4.c | |||
@@ -814,6 +814,7 @@ static __net_init int ipv4_sysctl_init_net(struct net *net) | |||
814 | 814 | ||
815 | net->ipv4.sysctl_rt_cache_rebuild_count = 4; | 815 | net->ipv4.sysctl_rt_cache_rebuild_count = 4; |
816 | 816 | ||
817 | tcp_init_mem(net); | ||
817 | limit = nr_free_buffer_pages() / 8; | 818 | limit = nr_free_buffer_pages() / 8; |
818 | limit = max(limit, 128UL); | 819 | limit = max(limit, 128UL); |
819 | net->ipv4.sysctl_tcp_mem[0] = limit / 4 * 3; | 820 | net->ipv4.sysctl_tcp_mem[0] = limit / 4 * 3; |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 9bcdec3ad772..06373b4a449a 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
@@ -3216,6 +3216,16 @@ static int __init set_thash_entries(char *str) | |||
3216 | } | 3216 | } |
3217 | __setup("thash_entries=", set_thash_entries); | 3217 | __setup("thash_entries=", set_thash_entries); |
3218 | 3218 | ||
3219 | void tcp_init_mem(struct net *net) | ||
3220 | { | ||
3221 | /* Set per-socket limits to no more than 1/128 the pressure threshold */ | ||
3222 | unsigned long limit = nr_free_buffer_pages() / 8; | ||
3223 | limit = max(limit, 128UL); | ||
3224 | net->ipv4.sysctl_tcp_mem[0] = limit / 4 * 3; | ||
3225 | net->ipv4.sysctl_tcp_mem[1] = limit; | ||
3226 | net->ipv4.sysctl_tcp_mem[2] = net->ipv4.sysctl_tcp_mem[0] * 2; | ||
3227 | } | ||
3228 | |||
3219 | void __init tcp_init(void) | 3229 | void __init tcp_init(void) |
3220 | { | 3230 | { |
3221 | struct sk_buff *skb = NULL; | 3231 | struct sk_buff *skb = NULL; |
@@ -3276,9 +3286,9 @@ void __init tcp_init(void) | |||
3276 | sysctl_tcp_max_orphans = cnt / 2; | 3286 | sysctl_tcp_max_orphans = cnt / 2; |
3277 | sysctl_max_syn_backlog = max(128, cnt / 256); | 3287 | sysctl_max_syn_backlog = max(128, cnt / 256); |
3278 | 3288 | ||
3279 | /* Set per-socket limits to no more than 1/128 the pressure threshold */ | 3289 | tcp_init_mem(&init_net); |
3280 | limit = ((unsigned long)init_net.ipv4.sysctl_tcp_mem[1]) | 3290 | limit = nr_free_buffer_pages() / 8; |
3281 | << (PAGE_SHIFT - 7); | 3291 | limit = max(limit, 128UL); |
3282 | max_share = min(4UL*1024*1024, limit); | 3292 | max_share = min(4UL*1024*1024, limit); |
3283 | 3293 | ||
3284 | sysctl_tcp_wmem[0] = SK_MEM_QUANTUM; | 3294 | sysctl_tcp_wmem[0] = SK_MEM_QUANTUM; |
diff --git a/net/ipv4/tcp_bic.c b/net/ipv4/tcp_bic.c index 6187eb4d1dcf..f45e1c242440 100644 --- a/net/ipv4/tcp_bic.c +++ b/net/ipv4/tcp_bic.c | |||
@@ -63,7 +63,6 @@ static inline void bictcp_reset(struct bictcp *ca) | |||
63 | { | 63 | { |
64 | ca->cnt = 0; | 64 | ca->cnt = 0; |
65 | ca->last_max_cwnd = 0; | 65 | ca->last_max_cwnd = 0; |
66 | ca->loss_cwnd = 0; | ||
67 | ca->last_cwnd = 0; | 66 | ca->last_cwnd = 0; |
68 | ca->last_time = 0; | 67 | ca->last_time = 0; |
69 | ca->epoch_start = 0; | 68 | ca->epoch_start = 0; |
@@ -72,7 +71,11 @@ static inline void bictcp_reset(struct bictcp *ca) | |||
72 | 71 | ||
73 | static void bictcp_init(struct sock *sk) | 72 | static void bictcp_init(struct sock *sk) |
74 | { | 73 | { |
75 | bictcp_reset(inet_csk_ca(sk)); | 74 | struct bictcp *ca = inet_csk_ca(sk); |
75 | |||
76 | bictcp_reset(ca); | ||
77 | ca->loss_cwnd = 0; | ||
78 | |||
76 | if (initial_ssthresh) | 79 | if (initial_ssthresh) |
77 | tcp_sk(sk)->snd_ssthresh = initial_ssthresh; | 80 | tcp_sk(sk)->snd_ssthresh = initial_ssthresh; |
78 | } | 81 | } |
@@ -127,7 +130,7 @@ static inline void bictcp_update(struct bictcp *ca, u32 cwnd) | |||
127 | } | 130 | } |
128 | 131 | ||
129 | /* if in slow start or link utilization is very low */ | 132 | /* if in slow start or link utilization is very low */ |
130 | if (ca->loss_cwnd == 0) { | 133 | if (ca->last_max_cwnd == 0) { |
131 | if (ca->cnt > 20) /* increase cwnd 5% per RTT */ | 134 | if (ca->cnt > 20) /* increase cwnd 5% per RTT */ |
132 | ca->cnt = 20; | 135 | ca->cnt = 20; |
133 | } | 136 | } |
@@ -185,7 +188,7 @@ static u32 bictcp_undo_cwnd(struct sock *sk) | |||
185 | { | 188 | { |
186 | const struct tcp_sock *tp = tcp_sk(sk); | 189 | const struct tcp_sock *tp = tcp_sk(sk); |
187 | const struct bictcp *ca = inet_csk_ca(sk); | 190 | const struct bictcp *ca = inet_csk_ca(sk); |
188 | return max(tp->snd_cwnd, ca->last_max_cwnd); | 191 | return max(tp->snd_cwnd, ca->loss_cwnd); |
189 | } | 192 | } |
190 | 193 | ||
191 | static void bictcp_state(struct sock *sk, u8 new_state) | 194 | static void bictcp_state(struct sock *sk, u8 new_state) |
diff --git a/net/ipv4/tcp_cubic.c b/net/ipv4/tcp_cubic.c index f376b05cca81..a9077f441cb2 100644 --- a/net/ipv4/tcp_cubic.c +++ b/net/ipv4/tcp_cubic.c | |||
@@ -107,7 +107,6 @@ static inline void bictcp_reset(struct bictcp *ca) | |||
107 | { | 107 | { |
108 | ca->cnt = 0; | 108 | ca->cnt = 0; |
109 | ca->last_max_cwnd = 0; | 109 | ca->last_max_cwnd = 0; |
110 | ca->loss_cwnd = 0; | ||
111 | ca->last_cwnd = 0; | 110 | ca->last_cwnd = 0; |
112 | ca->last_time = 0; | 111 | ca->last_time = 0; |
113 | ca->bic_origin_point = 0; | 112 | ca->bic_origin_point = 0; |
@@ -142,7 +141,10 @@ static inline void bictcp_hystart_reset(struct sock *sk) | |||
142 | 141 | ||
143 | static void bictcp_init(struct sock *sk) | 142 | static void bictcp_init(struct sock *sk) |
144 | { | 143 | { |
145 | bictcp_reset(inet_csk_ca(sk)); | 144 | struct bictcp *ca = inet_csk_ca(sk); |
145 | |||
146 | bictcp_reset(ca); | ||
147 | ca->loss_cwnd = 0; | ||
146 | 148 | ||
147 | if (hystart) | 149 | if (hystart) |
148 | bictcp_hystart_reset(sk); | 150 | bictcp_hystart_reset(sk); |
@@ -275,7 +277,7 @@ static inline void bictcp_update(struct bictcp *ca, u32 cwnd) | |||
275 | * The initial growth of cubic function may be too conservative | 277 | * The initial growth of cubic function may be too conservative |
276 | * when the available bandwidth is still unknown. | 278 | * when the available bandwidth is still unknown. |
277 | */ | 279 | */ |
278 | if (ca->loss_cwnd == 0 && ca->cnt > 20) | 280 | if (ca->last_max_cwnd == 0 && ca->cnt > 20) |
279 | ca->cnt = 20; /* increase cwnd 5% per RTT */ | 281 | ca->cnt = 20; /* increase cwnd 5% per RTT */ |
280 | 282 | ||
281 | /* TCP Friendly */ | 283 | /* TCP Friendly */ |
@@ -342,7 +344,7 @@ static u32 bictcp_undo_cwnd(struct sock *sk) | |||
342 | { | 344 | { |
343 | struct bictcp *ca = inet_csk_ca(sk); | 345 | struct bictcp *ca = inet_csk_ca(sk); |
344 | 346 | ||
345 | return max(tcp_sk(sk)->snd_cwnd, ca->last_max_cwnd); | 347 | return max(tcp_sk(sk)->snd_cwnd, ca->loss_cwnd); |
346 | } | 348 | } |
347 | 349 | ||
348 | static void bictcp_state(struct sock *sk, u8 new_state) | 350 | static void bictcp_state(struct sock *sk, u8 new_state) |
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 2877c3e09587..976034f82320 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -105,7 +105,6 @@ int sysctl_tcp_abc __read_mostly; | |||
105 | #define FLAG_SYN_ACKED 0x10 /* This ACK acknowledged SYN. */ | 105 | #define FLAG_SYN_ACKED 0x10 /* This ACK acknowledged SYN. */ |
106 | #define FLAG_DATA_SACKED 0x20 /* New SACK. */ | 106 | #define FLAG_DATA_SACKED 0x20 /* New SACK. */ |
107 | #define FLAG_ECE 0x40 /* ECE in this ACK */ | 107 | #define FLAG_ECE 0x40 /* ECE in this ACK */ |
108 | #define FLAG_DATA_LOST 0x80 /* SACK detected data lossage. */ | ||
109 | #define FLAG_SLOWPATH 0x100 /* Do not skip RFC checks for window update.*/ | 108 | #define FLAG_SLOWPATH 0x100 /* Do not skip RFC checks for window update.*/ |
110 | #define FLAG_ONLY_ORIG_SACKED 0x200 /* SACKs only non-rexmit sent before RTO */ | 109 | #define FLAG_ONLY_ORIG_SACKED 0x200 /* SACKs only non-rexmit sent before RTO */ |
111 | #define FLAG_SND_UNA_ADVANCED 0x400 /* Snd_una was changed (!= FLAG_DATA_ACKED) */ | 110 | #define FLAG_SND_UNA_ADVANCED 0x400 /* Snd_una was changed (!= FLAG_DATA_ACKED) */ |
@@ -1040,13 +1039,11 @@ static void tcp_skb_mark_lost_uncond_verify(struct tcp_sock *tp, | |||
1040 | * These 6 states form finite state machine, controlled by the following events: | 1039 | * These 6 states form finite state machine, controlled by the following events: |
1041 | * 1. New ACK (+SACK) arrives. (tcp_sacktag_write_queue()) | 1040 | * 1. New ACK (+SACK) arrives. (tcp_sacktag_write_queue()) |
1042 | * 2. Retransmission. (tcp_retransmit_skb(), tcp_xmit_retransmit_queue()) | 1041 | * 2. Retransmission. (tcp_retransmit_skb(), tcp_xmit_retransmit_queue()) |
1043 | * 3. Loss detection event of one of three flavors: | 1042 | * 3. Loss detection event of two flavors: |
1044 | * A. Scoreboard estimator decided the packet is lost. | 1043 | * A. Scoreboard estimator decided the packet is lost. |
1045 | * A'. Reno "three dupacks" marks head of queue lost. | 1044 | * A'. Reno "three dupacks" marks head of queue lost. |
1046 | * A''. Its FACK modfication, head until snd.fack is lost. | 1045 | * A''. Its FACK modification, head until snd.fack is lost. |
1047 | * B. SACK arrives sacking data transmitted after never retransmitted | 1046 | * B. SACK arrives sacking SND.NXT at the moment, when the |
1048 | * hole was sent out. | ||
1049 | * C. SACK arrives sacking SND.NXT at the moment, when the | ||
1050 | * segment was retransmitted. | 1047 | * segment was retransmitted. |
1051 | * 4. D-SACK added new rule: D-SACK changes any tag to S. | 1048 | * 4. D-SACK added new rule: D-SACK changes any tag to S. |
1052 | * | 1049 | * |
@@ -1153,7 +1150,7 @@ static int tcp_is_sackblock_valid(struct tcp_sock *tp, int is_dsack, | |||
1153 | } | 1150 | } |
1154 | 1151 | ||
1155 | /* Check for lost retransmit. This superb idea is borrowed from "ratehalving". | 1152 | /* Check for lost retransmit. This superb idea is borrowed from "ratehalving". |
1156 | * Event "C". Later note: FACK people cheated me again 8), we have to account | 1153 | * Event "B". Later note: FACK people cheated me again 8), we have to account |
1157 | * for reordering! Ugly, but should help. | 1154 | * for reordering! Ugly, but should help. |
1158 | * | 1155 | * |
1159 | * Search retransmitted skbs from write_queue that were sent when snd_nxt was | 1156 | * Search retransmitted skbs from write_queue that were sent when snd_nxt was |
@@ -1844,10 +1841,6 @@ tcp_sacktag_write_queue(struct sock *sk, const struct sk_buff *ack_skb, | |||
1844 | if (found_dup_sack && ((i + 1) == first_sack_index)) | 1841 | if (found_dup_sack && ((i + 1) == first_sack_index)) |
1845 | next_dup = &sp[i + 1]; | 1842 | next_dup = &sp[i + 1]; |
1846 | 1843 | ||
1847 | /* Event "B" in the comment above. */ | ||
1848 | if (after(end_seq, tp->high_seq)) | ||
1849 | state.flag |= FLAG_DATA_LOST; | ||
1850 | |||
1851 | /* Skip too early cached blocks */ | 1844 | /* Skip too early cached blocks */ |
1852 | while (tcp_sack_cache_ok(tp, cache) && | 1845 | while (tcp_sack_cache_ok(tp, cache) && |
1853 | !before(start_seq, cache->end_seq)) | 1846 | !before(start_seq, cache->end_seq)) |
@@ -2515,8 +2508,11 @@ static void tcp_timeout_skbs(struct sock *sk) | |||
2515 | tcp_verify_left_out(tp); | 2508 | tcp_verify_left_out(tp); |
2516 | } | 2509 | } |
2517 | 2510 | ||
2518 | /* Mark head of queue up as lost. With RFC3517 SACK, the packets is | 2511 | /* Detect loss in event "A" above by marking head of queue up as lost. |
2519 | * is against sacked "cnt", otherwise it's against facked "cnt" | 2512 | * For FACK or non-SACK(Reno) senders, the first "packets" number of segments |
2513 | * are considered lost. For RFC3517 SACK, a segment is considered lost if it | ||
2514 | * has at least tp->reordering SACKed seqments above it; "packets" refers to | ||
2515 | * the maximum SACKed segments to pass before reaching this limit. | ||
2520 | */ | 2516 | */ |
2521 | static void tcp_mark_head_lost(struct sock *sk, int packets, int mark_head) | 2517 | static void tcp_mark_head_lost(struct sock *sk, int packets, int mark_head) |
2522 | { | 2518 | { |
@@ -2525,6 +2521,8 @@ static void tcp_mark_head_lost(struct sock *sk, int packets, int mark_head) | |||
2525 | int cnt, oldcnt; | 2521 | int cnt, oldcnt; |
2526 | int err; | 2522 | int err; |
2527 | unsigned int mss; | 2523 | unsigned int mss; |
2524 | /* Use SACK to deduce losses of new sequences sent during recovery */ | ||
2525 | const u32 loss_high = tcp_is_sack(tp) ? tp->snd_nxt : tp->high_seq; | ||
2528 | 2526 | ||
2529 | WARN_ON(packets > tp->packets_out); | 2527 | WARN_ON(packets > tp->packets_out); |
2530 | if (tp->lost_skb_hint) { | 2528 | if (tp->lost_skb_hint) { |
@@ -2546,7 +2544,7 @@ static void tcp_mark_head_lost(struct sock *sk, int packets, int mark_head) | |||
2546 | tp->lost_skb_hint = skb; | 2544 | tp->lost_skb_hint = skb; |
2547 | tp->lost_cnt_hint = cnt; | 2545 | tp->lost_cnt_hint = cnt; |
2548 | 2546 | ||
2549 | if (after(TCP_SKB_CB(skb)->end_seq, tp->high_seq)) | 2547 | if (after(TCP_SKB_CB(skb)->end_seq, loss_high)) |
2550 | break; | 2548 | break; |
2551 | 2549 | ||
2552 | oldcnt = cnt; | 2550 | oldcnt = cnt; |
@@ -3033,19 +3031,10 @@ static void tcp_fastretrans_alert(struct sock *sk, int pkts_acked, | |||
3033 | if (tcp_check_sack_reneging(sk, flag)) | 3031 | if (tcp_check_sack_reneging(sk, flag)) |
3034 | return; | 3032 | return; |
3035 | 3033 | ||
3036 | /* C. Process data loss notification, provided it is valid. */ | 3034 | /* C. Check consistency of the current state. */ |
3037 | if (tcp_is_fack(tp) && (flag & FLAG_DATA_LOST) && | ||
3038 | before(tp->snd_una, tp->high_seq) && | ||
3039 | icsk->icsk_ca_state != TCP_CA_Open && | ||
3040 | tp->fackets_out > tp->reordering) { | ||
3041 | tcp_mark_head_lost(sk, tp->fackets_out - tp->reordering, 0); | ||
3042 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPLOSS); | ||
3043 | } | ||
3044 | |||
3045 | /* D. Check consistency of the current state. */ | ||
3046 | tcp_verify_left_out(tp); | 3035 | tcp_verify_left_out(tp); |
3047 | 3036 | ||
3048 | /* E. Check state exit conditions. State can be terminated | 3037 | /* D. Check state exit conditions. State can be terminated |
3049 | * when high_seq is ACKed. */ | 3038 | * when high_seq is ACKed. */ |
3050 | if (icsk->icsk_ca_state == TCP_CA_Open) { | 3039 | if (icsk->icsk_ca_state == TCP_CA_Open) { |
3051 | WARN_ON(tp->retrans_out != 0); | 3040 | WARN_ON(tp->retrans_out != 0); |
@@ -3077,7 +3066,7 @@ static void tcp_fastretrans_alert(struct sock *sk, int pkts_acked, | |||
3077 | } | 3066 | } |
3078 | } | 3067 | } |
3079 | 3068 | ||
3080 | /* F. Process state. */ | 3069 | /* E. Process state. */ |
3081 | switch (icsk->icsk_ca_state) { | 3070 | switch (icsk->icsk_ca_state) { |
3082 | case TCP_CA_Recovery: | 3071 | case TCP_CA_Recovery: |
3083 | if (!(flag & FLAG_SND_UNA_ADVANCED)) { | 3072 | if (!(flag & FLAG_SND_UNA_ADVANCED)) { |
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 1eb4ad57670e..337ba4cca052 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
@@ -631,7 +631,7 @@ static void tcp_v4_send_reset(struct sock *sk, struct sk_buff *skb) | |||
631 | arg.iov[0].iov_len = sizeof(rep.th); | 631 | arg.iov[0].iov_len = sizeof(rep.th); |
632 | 632 | ||
633 | #ifdef CONFIG_TCP_MD5SIG | 633 | #ifdef CONFIG_TCP_MD5SIG |
634 | key = sk ? tcp_v4_md5_do_lookup(sk, ip_hdr(skb)->daddr) : NULL; | 634 | key = sk ? tcp_v4_md5_do_lookup(sk, ip_hdr(skb)->saddr) : NULL; |
635 | if (key) { | 635 | if (key) { |
636 | rep.opt[0] = htonl((TCPOPT_NOP << 24) | | 636 | rep.opt[0] = htonl((TCPOPT_NOP << 24) | |
637 | (TCPOPT_NOP << 16) | | 637 | (TCPOPT_NOP << 16) | |
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index 8c8de2780c7a..4ff3b6dc74fc 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
@@ -1141,11 +1141,9 @@ int tcp_trim_head(struct sock *sk, struct sk_buff *skb, u32 len) | |||
1141 | sk_mem_uncharge(sk, len); | 1141 | sk_mem_uncharge(sk, len); |
1142 | sock_set_flag(sk, SOCK_QUEUE_SHRUNK); | 1142 | sock_set_flag(sk, SOCK_QUEUE_SHRUNK); |
1143 | 1143 | ||
1144 | /* Any change of skb->len requires recalculation of tso | 1144 | /* Any change of skb->len requires recalculation of tso factor. */ |
1145 | * factor and mss. | ||
1146 | */ | ||
1147 | if (tcp_skb_pcount(skb) > 1) | 1145 | if (tcp_skb_pcount(skb) > 1) |
1148 | tcp_set_skb_tso_segs(sk, skb, tcp_current_mss(sk)); | 1146 | tcp_set_skb_tso_segs(sk, skb, tcp_skb_mss(skb)); |
1149 | 1147 | ||
1150 | return 0; | 1148 | return 0; |
1151 | } | 1149 | } |
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index a225d5ee3c2f..c02280a4d126 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -502,29 +502,31 @@ static void addrconf_forward_change(struct net *net, __s32 newf) | |||
502 | rcu_read_unlock(); | 502 | rcu_read_unlock(); |
503 | } | 503 | } |
504 | 504 | ||
505 | static int addrconf_fixup_forwarding(struct ctl_table *table, int *p, int old) | 505 | static int addrconf_fixup_forwarding(struct ctl_table *table, int *p, int newf) |
506 | { | 506 | { |
507 | struct net *net; | 507 | struct net *net; |
508 | int old; | ||
509 | |||
510 | if (!rtnl_trylock()) | ||
511 | return restart_syscall(); | ||
508 | 512 | ||
509 | net = (struct net *)table->extra2; | 513 | net = (struct net *)table->extra2; |
510 | if (p == &net->ipv6.devconf_dflt->forwarding) | 514 | old = *p; |
511 | return 0; | 515 | *p = newf; |
512 | 516 | ||
513 | if (!rtnl_trylock()) { | 517 | if (p == &net->ipv6.devconf_dflt->forwarding) { |
514 | /* Restore the original values before restarting */ | 518 | rtnl_unlock(); |
515 | *p = old; | 519 | return 0; |
516 | return restart_syscall(); | ||
517 | } | 520 | } |
518 | 521 | ||
519 | if (p == &net->ipv6.devconf_all->forwarding) { | 522 | if (p == &net->ipv6.devconf_all->forwarding) { |
520 | __s32 newf = net->ipv6.devconf_all->forwarding; | ||
521 | net->ipv6.devconf_dflt->forwarding = newf; | 523 | net->ipv6.devconf_dflt->forwarding = newf; |
522 | addrconf_forward_change(net, newf); | 524 | addrconf_forward_change(net, newf); |
523 | } else if ((!*p) ^ (!old)) | 525 | } else if ((!newf) ^ (!old)) |
524 | dev_forward_change((struct inet6_dev *)table->extra1); | 526 | dev_forward_change((struct inet6_dev *)table->extra1); |
525 | rtnl_unlock(); | 527 | rtnl_unlock(); |
526 | 528 | ||
527 | if (*p) | 529 | if (newf) |
528 | rt6_purge_dflt_routers(net); | 530 | rt6_purge_dflt_routers(net); |
529 | return 1; | 531 | return 1; |
530 | } | 532 | } |
@@ -4260,9 +4262,17 @@ int addrconf_sysctl_forward(ctl_table *ctl, int write, | |||
4260 | int *valp = ctl->data; | 4262 | int *valp = ctl->data; |
4261 | int val = *valp; | 4263 | int val = *valp; |
4262 | loff_t pos = *ppos; | 4264 | loff_t pos = *ppos; |
4265 | ctl_table lctl; | ||
4263 | int ret; | 4266 | int ret; |
4264 | 4267 | ||
4265 | ret = proc_dointvec(ctl, write, buffer, lenp, ppos); | 4268 | /* |
4269 | * ctl->data points to idev->cnf.forwarding, we should | ||
4270 | * not modify it until we get the rtnl lock. | ||
4271 | */ | ||
4272 | lctl = *ctl; | ||
4273 | lctl.data = &val; | ||
4274 | |||
4275 | ret = proc_dointvec(&lctl, write, buffer, lenp, ppos); | ||
4266 | 4276 | ||
4267 | if (write) | 4277 | if (write) |
4268 | ret = addrconf_fixup_forwarding(ctl, valp, val); | 4278 | ret = addrconf_fixup_forwarding(ctl, valp, val); |
@@ -4300,26 +4310,27 @@ static void addrconf_disable_change(struct net *net, __s32 newf) | |||
4300 | rcu_read_unlock(); | 4310 | rcu_read_unlock(); |
4301 | } | 4311 | } |
4302 | 4312 | ||
4303 | static int addrconf_disable_ipv6(struct ctl_table *table, int *p, int old) | 4313 | static int addrconf_disable_ipv6(struct ctl_table *table, int *p, int newf) |
4304 | { | 4314 | { |
4305 | struct net *net; | 4315 | struct net *net; |
4316 | int old; | ||
4317 | |||
4318 | if (!rtnl_trylock()) | ||
4319 | return restart_syscall(); | ||
4306 | 4320 | ||
4307 | net = (struct net *)table->extra2; | 4321 | net = (struct net *)table->extra2; |
4322 | old = *p; | ||
4323 | *p = newf; | ||
4308 | 4324 | ||
4309 | if (p == &net->ipv6.devconf_dflt->disable_ipv6) | 4325 | if (p == &net->ipv6.devconf_dflt->disable_ipv6) { |
4326 | rtnl_unlock(); | ||
4310 | return 0; | 4327 | return 0; |
4311 | |||
4312 | if (!rtnl_trylock()) { | ||
4313 | /* Restore the original values before restarting */ | ||
4314 | *p = old; | ||
4315 | return restart_syscall(); | ||
4316 | } | 4328 | } |
4317 | 4329 | ||
4318 | if (p == &net->ipv6.devconf_all->disable_ipv6) { | 4330 | if (p == &net->ipv6.devconf_all->disable_ipv6) { |
4319 | __s32 newf = net->ipv6.devconf_all->disable_ipv6; | ||
4320 | net->ipv6.devconf_dflt->disable_ipv6 = newf; | 4331 | net->ipv6.devconf_dflt->disable_ipv6 = newf; |
4321 | addrconf_disable_change(net, newf); | 4332 | addrconf_disable_change(net, newf); |
4322 | } else if ((!*p) ^ (!old)) | 4333 | } else if ((!newf) ^ (!old)) |
4323 | dev_disable_change((struct inet6_dev *)table->extra1); | 4334 | dev_disable_change((struct inet6_dev *)table->extra1); |
4324 | 4335 | ||
4325 | rtnl_unlock(); | 4336 | rtnl_unlock(); |
@@ -4333,9 +4344,17 @@ int addrconf_sysctl_disable(ctl_table *ctl, int write, | |||
4333 | int *valp = ctl->data; | 4344 | int *valp = ctl->data; |
4334 | int val = *valp; | 4345 | int val = *valp; |
4335 | loff_t pos = *ppos; | 4346 | loff_t pos = *ppos; |
4347 | ctl_table lctl; | ||
4336 | int ret; | 4348 | int ret; |
4337 | 4349 | ||
4338 | ret = proc_dointvec(ctl, write, buffer, lenp, ppos); | 4350 | /* |
4351 | * ctl->data points to idev->cnf.disable_ipv6, we should | ||
4352 | * not modify it until we get the rtnl lock. | ||
4353 | */ | ||
4354 | lctl = *ctl; | ||
4355 | lctl.data = &val; | ||
4356 | |||
4357 | ret = proc_dointvec(&lctl, write, buffer, lenp, ppos); | ||
4339 | 4358 | ||
4340 | if (write) | 4359 | if (write) |
4341 | ret = addrconf_disable_ipv6(ctl, valp, val); | 4360 | ret = addrconf_disable_ipv6(ctl, valp, val); |
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index 906c7ca43542..3edd05ae4388 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
@@ -1083,7 +1083,7 @@ static void tcp_v6_send_reset(struct sock *sk, struct sk_buff *skb) | |||
1083 | 1083 | ||
1084 | #ifdef CONFIG_TCP_MD5SIG | 1084 | #ifdef CONFIG_TCP_MD5SIG |
1085 | if (sk) | 1085 | if (sk) |
1086 | key = tcp_v6_md5_do_lookup(sk, &ipv6_hdr(skb)->daddr); | 1086 | key = tcp_v6_md5_do_lookup(sk, &ipv6_hdr(skb)->saddr); |
1087 | #endif | 1087 | #endif |
1088 | 1088 | ||
1089 | if (th->ack) | 1089 | if (th->ack) |
diff --git a/net/l2tp/l2tp_ip.c b/net/l2tp/l2tp_ip.c index d21e7ebd91ca..55670ec3cd0f 100644 --- a/net/l2tp/l2tp_ip.c +++ b/net/l2tp/l2tp_ip.c | |||
@@ -393,11 +393,6 @@ static int l2tp_ip_backlog_recv(struct sock *sk, struct sk_buff *skb) | |||
393 | { | 393 | { |
394 | int rc; | 394 | int rc; |
395 | 395 | ||
396 | if (!xfrm4_policy_check(sk, XFRM_POLICY_IN, skb)) | ||
397 | goto drop; | ||
398 | |||
399 | nf_reset(skb); | ||
400 | |||
401 | /* Charge it to the socket, dropping if the queue is full. */ | 396 | /* Charge it to the socket, dropping if the queue is full. */ |
402 | rc = sock_queue_rcv_skb(sk, skb); | 397 | rc = sock_queue_rcv_skb(sk, skb); |
403 | if (rc < 0) | 398 | if (rc < 0) |
diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c index a18e6c3d36e3..b9bef2c75026 100644 --- a/net/llc/af_llc.c +++ b/net/llc/af_llc.c | |||
@@ -713,6 +713,7 @@ static int llc_ui_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
713 | struct sk_buff *skb = NULL; | 713 | struct sk_buff *skb = NULL; |
714 | struct sock *sk = sock->sk; | 714 | struct sock *sk = sock->sk; |
715 | struct llc_sock *llc = llc_sk(sk); | 715 | struct llc_sock *llc = llc_sk(sk); |
716 | unsigned long cpu_flags; | ||
716 | size_t copied = 0; | 717 | size_t copied = 0; |
717 | u32 peek_seq = 0; | 718 | u32 peek_seq = 0; |
718 | u32 *seq; | 719 | u32 *seq; |
@@ -838,7 +839,9 @@ static int llc_ui_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
838 | goto copy_uaddr; | 839 | goto copy_uaddr; |
839 | 840 | ||
840 | if (!(flags & MSG_PEEK)) { | 841 | if (!(flags & MSG_PEEK)) { |
842 | spin_lock_irqsave(&sk->sk_receive_queue.lock, cpu_flags); | ||
841 | sk_eat_skb(sk, skb, 0); | 843 | sk_eat_skb(sk, skb, 0); |
844 | spin_unlock_irqrestore(&sk->sk_receive_queue.lock, cpu_flags); | ||
842 | *seq = 0; | 845 | *seq = 0; |
843 | } | 846 | } |
844 | 847 | ||
@@ -859,7 +862,9 @@ copy_uaddr: | |||
859 | llc_cmsg_rcv(msg, skb); | 862 | llc_cmsg_rcv(msg, skb); |
860 | 863 | ||
861 | if (!(flags & MSG_PEEK)) { | 864 | if (!(flags & MSG_PEEK)) { |
865 | spin_lock_irqsave(&sk->sk_receive_queue.lock, cpu_flags); | ||
862 | sk_eat_skb(sk, skb, 0); | 866 | sk_eat_skb(sk, skb, 0); |
867 | spin_unlock_irqrestore(&sk->sk_receive_queue.lock, cpu_flags); | ||
863 | *seq = 0; | 868 | *seq = 0; |
864 | } | 869 | } |
865 | 870 | ||
diff --git a/net/mac80211/debugfs_key.c b/net/mac80211/debugfs_key.c index 38e6101190d9..59edcd95a58d 100644 --- a/net/mac80211/debugfs_key.c +++ b/net/mac80211/debugfs_key.c | |||
@@ -225,9 +225,9 @@ KEY_OPS(key); | |||
225 | key, &key_##name##_ops); | 225 | key, &key_##name##_ops); |
226 | 226 | ||
227 | void ieee80211_debugfs_key_add(struct ieee80211_key *key) | 227 | void ieee80211_debugfs_key_add(struct ieee80211_key *key) |
228 | { | 228 | { |
229 | static int keycount; | 229 | static int keycount; |
230 | char buf[50]; | 230 | char buf[100]; |
231 | struct sta_info *sta; | 231 | struct sta_info *sta; |
232 | 232 | ||
233 | if (!key->local->debugfs.keys) | 233 | if (!key->local->debugfs.keys) |
@@ -244,7 +244,8 @@ void ieee80211_debugfs_key_add(struct ieee80211_key *key) | |||
244 | 244 | ||
245 | sta = key->sta; | 245 | sta = key->sta; |
246 | if (sta) { | 246 | if (sta) { |
247 | sprintf(buf, "../../stations/%pM", sta->sta.addr); | 247 | sprintf(buf, "../../netdev:%s/stations/%pM", |
248 | sta->sdata->name, sta->sta.addr); | ||
248 | key->debugfs.stalink = | 249 | key->debugfs.stalink = |
249 | debugfs_create_symlink("station", key->debugfs.dir, buf); | 250 | debugfs_create_symlink("station", key->debugfs.dir, buf); |
250 | } | 251 | } |
diff --git a/net/mac80211/ibss.c b/net/mac80211/ibss.c index b3d76b756cd5..a4643969a13b 100644 --- a/net/mac80211/ibss.c +++ b/net/mac80211/ibss.c | |||
@@ -106,6 +106,7 @@ static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata, | |||
106 | 106 | ||
107 | sdata->drop_unencrypted = capability & WLAN_CAPABILITY_PRIVACY ? 1 : 0; | 107 | sdata->drop_unencrypted = capability & WLAN_CAPABILITY_PRIVACY ? 1 : 0; |
108 | 108 | ||
109 | local->oper_channel = chan; | ||
109 | channel_type = ifibss->channel_type; | 110 | channel_type = ifibss->channel_type; |
110 | if (channel_type > NL80211_CHAN_HT20 && | 111 | if (channel_type > NL80211_CHAN_HT20 && |
111 | !cfg80211_can_beacon_sec_chan(local->hw.wiphy, chan, channel_type)) | 112 | !cfg80211_can_beacon_sec_chan(local->hw.wiphy, chan, channel_type)) |
diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c index e47768cb8cb3..01a21c2f6ab3 100644 --- a/net/mac80211/iface.c +++ b/net/mac80211/iface.c | |||
@@ -1314,6 +1314,7 @@ u32 __ieee80211_recalc_idle(struct ieee80211_local *local) | |||
1314 | continue; | 1314 | continue; |
1315 | } | 1315 | } |
1316 | /* count everything else */ | 1316 | /* count everything else */ |
1317 | sdata->vif.bss_conf.idle = false; | ||
1317 | count++; | 1318 | count++; |
1318 | } | 1319 | } |
1319 | 1320 | ||
diff --git a/net/mac80211/mesh_hwmp.c b/net/mac80211/mesh_hwmp.c index 73abb7524b2c..54df1b2bafd2 100644 --- a/net/mac80211/mesh_hwmp.c +++ b/net/mac80211/mesh_hwmp.c | |||
@@ -119,12 +119,12 @@ static int mesh_path_sel_frame_tx(enum mpath_frame_type action, u8 flags, | |||
119 | int hdr_len = offsetof(struct ieee80211_mgmt, u.action.u.mesh_action) + | 119 | int hdr_len = offsetof(struct ieee80211_mgmt, u.action.u.mesh_action) + |
120 | sizeof(mgmt->u.action.u.mesh_action); | 120 | sizeof(mgmt->u.action.u.mesh_action); |
121 | 121 | ||
122 | skb = dev_alloc_skb(local->hw.extra_tx_headroom + | 122 | skb = dev_alloc_skb(local->tx_headroom + |
123 | hdr_len + | 123 | hdr_len + |
124 | 2 + 37); /* max HWMP IE */ | 124 | 2 + 37); /* max HWMP IE */ |
125 | if (!skb) | 125 | if (!skb) |
126 | return -1; | 126 | return -1; |
127 | skb_reserve(skb, local->hw.extra_tx_headroom); | 127 | skb_reserve(skb, local->tx_headroom); |
128 | mgmt = (struct ieee80211_mgmt *) skb_put(skb, hdr_len); | 128 | mgmt = (struct ieee80211_mgmt *) skb_put(skb, hdr_len); |
129 | memset(mgmt, 0, hdr_len); | 129 | memset(mgmt, 0, hdr_len); |
130 | mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | | 130 | mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | |
@@ -250,12 +250,12 @@ int mesh_path_error_tx(u8 ttl, u8 *target, __le32 target_sn, | |||
250 | if (time_before(jiffies, ifmsh->next_perr)) | 250 | if (time_before(jiffies, ifmsh->next_perr)) |
251 | return -EAGAIN; | 251 | return -EAGAIN; |
252 | 252 | ||
253 | skb = dev_alloc_skb(local->hw.extra_tx_headroom + | 253 | skb = dev_alloc_skb(local->tx_headroom + |
254 | hdr_len + | 254 | hdr_len + |
255 | 2 + 15 /* PERR IE */); | 255 | 2 + 15 /* PERR IE */); |
256 | if (!skb) | 256 | if (!skb) |
257 | return -1; | 257 | return -1; |
258 | skb_reserve(skb, local->tx_headroom + local->hw.extra_tx_headroom); | 258 | skb_reserve(skb, local->tx_headroom); |
259 | mgmt = (struct ieee80211_mgmt *) skb_put(skb, hdr_len); | 259 | mgmt = (struct ieee80211_mgmt *) skb_put(skb, hdr_len); |
260 | memset(mgmt, 0, hdr_len); | 260 | memset(mgmt, 0, hdr_len); |
261 | mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | | 261 | mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | |
diff --git a/net/mac80211/mesh_plink.c b/net/mac80211/mesh_plink.c index 41ef1b476442..a17251730b9e 100644 --- a/net/mac80211/mesh_plink.c +++ b/net/mac80211/mesh_plink.c | |||
@@ -172,7 +172,7 @@ static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata, | |||
172 | int hdr_len = offsetof(struct ieee80211_mgmt, u.action.u.self_prot) + | 172 | int hdr_len = offsetof(struct ieee80211_mgmt, u.action.u.self_prot) + |
173 | sizeof(mgmt->u.action.u.self_prot); | 173 | sizeof(mgmt->u.action.u.self_prot); |
174 | 174 | ||
175 | skb = dev_alloc_skb(local->hw.extra_tx_headroom + | 175 | skb = dev_alloc_skb(local->tx_headroom + |
176 | hdr_len + | 176 | hdr_len + |
177 | 2 + /* capability info */ | 177 | 2 + /* capability info */ |
178 | 2 + /* AID */ | 178 | 2 + /* AID */ |
@@ -186,7 +186,7 @@ static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata, | |||
186 | sdata->u.mesh.ie_len); | 186 | sdata->u.mesh.ie_len); |
187 | if (!skb) | 187 | if (!skb) |
188 | return -1; | 188 | return -1; |
189 | skb_reserve(skb, local->hw.extra_tx_headroom); | 189 | skb_reserve(skb, local->tx_headroom); |
190 | mgmt = (struct ieee80211_mgmt *) skb_put(skb, hdr_len); | 190 | mgmt = (struct ieee80211_mgmt *) skb_put(skb, hdr_len); |
191 | memset(mgmt, 0, hdr_len); | 191 | memset(mgmt, 0, hdr_len); |
192 | mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | | 192 | mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | |
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index ecb4c84c1bb3..295be92f7c77 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
@@ -2750,7 +2750,6 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata, | |||
2750 | { | 2750 | { |
2751 | struct ieee80211_local *local = sdata->local; | 2751 | struct ieee80211_local *local = sdata->local; |
2752 | struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; | 2752 | struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; |
2753 | struct ieee80211_work *wk; | ||
2754 | u8 bssid[ETH_ALEN]; | 2753 | u8 bssid[ETH_ALEN]; |
2755 | bool assoc_bss = false; | 2754 | bool assoc_bss = false; |
2756 | 2755 | ||
@@ -2763,30 +2762,47 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata, | |||
2763 | assoc_bss = true; | 2762 | assoc_bss = true; |
2764 | } else { | 2763 | } else { |
2765 | bool not_auth_yet = false; | 2764 | bool not_auth_yet = false; |
2765 | struct ieee80211_work *tmp, *wk = NULL; | ||
2766 | 2766 | ||
2767 | mutex_unlock(&ifmgd->mtx); | 2767 | mutex_unlock(&ifmgd->mtx); |
2768 | 2768 | ||
2769 | mutex_lock(&local->mtx); | 2769 | mutex_lock(&local->mtx); |
2770 | list_for_each_entry(wk, &local->work_list, list) { | 2770 | list_for_each_entry(tmp, &local->work_list, list) { |
2771 | if (wk->sdata != sdata) | 2771 | if (tmp->sdata != sdata) |
2772 | continue; | 2772 | continue; |
2773 | 2773 | ||
2774 | if (wk->type != IEEE80211_WORK_DIRECT_PROBE && | 2774 | if (tmp->type != IEEE80211_WORK_DIRECT_PROBE && |
2775 | wk->type != IEEE80211_WORK_AUTH && | 2775 | tmp->type != IEEE80211_WORK_AUTH && |
2776 | wk->type != IEEE80211_WORK_ASSOC && | 2776 | tmp->type != IEEE80211_WORK_ASSOC && |
2777 | wk->type != IEEE80211_WORK_ASSOC_BEACON_WAIT) | 2777 | tmp->type != IEEE80211_WORK_ASSOC_BEACON_WAIT) |
2778 | continue; | 2778 | continue; |
2779 | 2779 | ||
2780 | if (memcmp(req->bss->bssid, wk->filter_ta, ETH_ALEN)) | 2780 | if (memcmp(req->bss->bssid, tmp->filter_ta, ETH_ALEN)) |
2781 | continue; | 2781 | continue; |
2782 | 2782 | ||
2783 | not_auth_yet = wk->type == IEEE80211_WORK_DIRECT_PROBE; | 2783 | not_auth_yet = tmp->type == IEEE80211_WORK_DIRECT_PROBE; |
2784 | list_del_rcu(&wk->list); | 2784 | list_del_rcu(&tmp->list); |
2785 | free_work(wk); | 2785 | synchronize_rcu(); |
2786 | wk = tmp; | ||
2786 | break; | 2787 | break; |
2787 | } | 2788 | } |
2788 | mutex_unlock(&local->mtx); | 2789 | mutex_unlock(&local->mtx); |
2789 | 2790 | ||
2791 | if (wk && wk->type == IEEE80211_WORK_ASSOC) { | ||
2792 | /* clean up dummy sta & TX sync */ | ||
2793 | sta_info_destroy_addr(wk->sdata, wk->filter_ta); | ||
2794 | if (wk->assoc.synced) | ||
2795 | drv_finish_tx_sync(local, wk->sdata, | ||
2796 | wk->filter_ta, | ||
2797 | IEEE80211_TX_SYNC_ASSOC); | ||
2798 | } else if (wk && wk->type == IEEE80211_WORK_AUTH) { | ||
2799 | if (wk->probe_auth.synced) | ||
2800 | drv_finish_tx_sync(local, wk->sdata, | ||
2801 | wk->filter_ta, | ||
2802 | IEEE80211_TX_SYNC_AUTH); | ||
2803 | } | ||
2804 | kfree(wk); | ||
2805 | |||
2790 | /* | 2806 | /* |
2791 | * If somebody requests authentication and we haven't | 2807 | * If somebody requests authentication and we haven't |
2792 | * sent out an auth frame yet there's no need to send | 2808 | * sent out an auth frame yet there's no need to send |
diff --git a/net/rds/af_rds.c b/net/rds/af_rds.c index bb6ad81b671d..424ff622ab5f 100644 --- a/net/rds/af_rds.c +++ b/net/rds/af_rds.c | |||
@@ -68,7 +68,6 @@ static int rds_release(struct socket *sock) | |||
68 | { | 68 | { |
69 | struct sock *sk = sock->sk; | 69 | struct sock *sk = sock->sk; |
70 | struct rds_sock *rs; | 70 | struct rds_sock *rs; |
71 | unsigned long flags; | ||
72 | 71 | ||
73 | if (!sk) | 72 | if (!sk) |
74 | goto out; | 73 | goto out; |
@@ -94,10 +93,10 @@ static int rds_release(struct socket *sock) | |||
94 | rds_rdma_drop_keys(rs); | 93 | rds_rdma_drop_keys(rs); |
95 | rds_notify_queue_get(rs, NULL); | 94 | rds_notify_queue_get(rs, NULL); |
96 | 95 | ||
97 | spin_lock_irqsave(&rds_sock_lock, flags); | 96 | spin_lock_bh(&rds_sock_lock); |
98 | list_del_init(&rs->rs_item); | 97 | list_del_init(&rs->rs_item); |
99 | rds_sock_count--; | 98 | rds_sock_count--; |
100 | spin_unlock_irqrestore(&rds_sock_lock, flags); | 99 | spin_unlock_bh(&rds_sock_lock); |
101 | 100 | ||
102 | rds_trans_put(rs->rs_transport); | 101 | rds_trans_put(rs->rs_transport); |
103 | 102 | ||
@@ -409,7 +408,6 @@ static const struct proto_ops rds_proto_ops = { | |||
409 | 408 | ||
410 | static int __rds_create(struct socket *sock, struct sock *sk, int protocol) | 409 | static int __rds_create(struct socket *sock, struct sock *sk, int protocol) |
411 | { | 410 | { |
412 | unsigned long flags; | ||
413 | struct rds_sock *rs; | 411 | struct rds_sock *rs; |
414 | 412 | ||
415 | sock_init_data(sock, sk); | 413 | sock_init_data(sock, sk); |
@@ -426,10 +424,10 @@ static int __rds_create(struct socket *sock, struct sock *sk, int protocol) | |||
426 | spin_lock_init(&rs->rs_rdma_lock); | 424 | spin_lock_init(&rs->rs_rdma_lock); |
427 | rs->rs_rdma_keys = RB_ROOT; | 425 | rs->rs_rdma_keys = RB_ROOT; |
428 | 426 | ||
429 | spin_lock_irqsave(&rds_sock_lock, flags); | 427 | spin_lock_bh(&rds_sock_lock); |
430 | list_add_tail(&rs->rs_item, &rds_sock_list); | 428 | list_add_tail(&rs->rs_item, &rds_sock_list); |
431 | rds_sock_count++; | 429 | rds_sock_count++; |
432 | spin_unlock_irqrestore(&rds_sock_lock, flags); | 430 | spin_unlock_bh(&rds_sock_lock); |
433 | 431 | ||
434 | return 0; | 432 | return 0; |
435 | } | 433 | } |
@@ -471,12 +469,11 @@ static void rds_sock_inc_info(struct socket *sock, unsigned int len, | |||
471 | { | 469 | { |
472 | struct rds_sock *rs; | 470 | struct rds_sock *rs; |
473 | struct rds_incoming *inc; | 471 | struct rds_incoming *inc; |
474 | unsigned long flags; | ||
475 | unsigned int total = 0; | 472 | unsigned int total = 0; |
476 | 473 | ||
477 | len /= sizeof(struct rds_info_message); | 474 | len /= sizeof(struct rds_info_message); |
478 | 475 | ||
479 | spin_lock_irqsave(&rds_sock_lock, flags); | 476 | spin_lock_bh(&rds_sock_lock); |
480 | 477 | ||
481 | list_for_each_entry(rs, &rds_sock_list, rs_item) { | 478 | list_for_each_entry(rs, &rds_sock_list, rs_item) { |
482 | read_lock(&rs->rs_recv_lock); | 479 | read_lock(&rs->rs_recv_lock); |
@@ -492,7 +489,7 @@ static void rds_sock_inc_info(struct socket *sock, unsigned int len, | |||
492 | read_unlock(&rs->rs_recv_lock); | 489 | read_unlock(&rs->rs_recv_lock); |
493 | } | 490 | } |
494 | 491 | ||
495 | spin_unlock_irqrestore(&rds_sock_lock, flags); | 492 | spin_unlock_bh(&rds_sock_lock); |
496 | 493 | ||
497 | lens->nr = total; | 494 | lens->nr = total; |
498 | lens->each = sizeof(struct rds_info_message); | 495 | lens->each = sizeof(struct rds_info_message); |
@@ -504,11 +501,10 @@ static void rds_sock_info(struct socket *sock, unsigned int len, | |||
504 | { | 501 | { |
505 | struct rds_info_socket sinfo; | 502 | struct rds_info_socket sinfo; |
506 | struct rds_sock *rs; | 503 | struct rds_sock *rs; |
507 | unsigned long flags; | ||
508 | 504 | ||
509 | len /= sizeof(struct rds_info_socket); | 505 | len /= sizeof(struct rds_info_socket); |
510 | 506 | ||
511 | spin_lock_irqsave(&rds_sock_lock, flags); | 507 | spin_lock_bh(&rds_sock_lock); |
512 | 508 | ||
513 | if (len < rds_sock_count) | 509 | if (len < rds_sock_count) |
514 | goto out; | 510 | goto out; |
@@ -529,7 +525,7 @@ out: | |||
529 | lens->nr = rds_sock_count; | 525 | lens->nr = rds_sock_count; |
530 | lens->each = sizeof(struct rds_info_socket); | 526 | lens->each = sizeof(struct rds_info_socket); |
531 | 527 | ||
532 | spin_unlock_irqrestore(&rds_sock_lock, flags); | 528 | spin_unlock_bh(&rds_sock_lock); |
533 | } | 529 | } |
534 | 530 | ||
535 | static void rds_exit(void) | 531 | static void rds_exit(void) |
diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c index e7e1d0b57b3d..2776012132ea 100644 --- a/net/sched/sch_netem.c +++ b/net/sched/sch_netem.c | |||
@@ -419,7 +419,7 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch) | |||
419 | 419 | ||
420 | cb = netem_skb_cb(skb); | 420 | cb = netem_skb_cb(skb); |
421 | if (q->gap == 0 || /* not doing reordering */ | 421 | if (q->gap == 0 || /* not doing reordering */ |
422 | q->counter < q->gap || /* inside last reordering gap */ | 422 | q->counter < q->gap - 1 || /* inside last reordering gap */ |
423 | q->reorder < get_crandom(&q->reorder_cor)) { | 423 | q->reorder < get_crandom(&q->reorder_cor)) { |
424 | psched_time_t now; | 424 | psched_time_t now; |
425 | psched_tdiff_t delay; | 425 | psched_tdiff_t delay; |
diff --git a/net/sunrpc/auth_generic.c b/net/sunrpc/auth_generic.c index 1426ec3d0a53..75762f346975 100644 --- a/net/sunrpc/auth_generic.c +++ b/net/sunrpc/auth_generic.c | |||
@@ -92,6 +92,7 @@ generic_create_cred(struct rpc_auth *auth, struct auth_cred *acred, int flags) | |||
92 | if (gcred->acred.group_info != NULL) | 92 | if (gcred->acred.group_info != NULL) |
93 | get_group_info(gcred->acred.group_info); | 93 | get_group_info(gcred->acred.group_info); |
94 | gcred->acred.machine_cred = acred->machine_cred; | 94 | gcred->acred.machine_cred = acred->machine_cred; |
95 | gcred->acred.principal = acred->principal; | ||
95 | 96 | ||
96 | dprintk("RPC: allocated %s cred %p for uid %d gid %d\n", | 97 | dprintk("RPC: allocated %s cred %p for uid %d gid %d\n", |
97 | gcred->acred.machine_cred ? "machine" : "generic", | 98 | gcred->acred.machine_cred ? "machine" : "generic", |
@@ -123,6 +124,17 @@ generic_destroy_cred(struct rpc_cred *cred) | |||
123 | call_rcu(&cred->cr_rcu, generic_free_cred_callback); | 124 | call_rcu(&cred->cr_rcu, generic_free_cred_callback); |
124 | } | 125 | } |
125 | 126 | ||
127 | static int | ||
128 | machine_cred_match(struct auth_cred *acred, struct generic_cred *gcred, int flags) | ||
129 | { | ||
130 | if (!gcred->acred.machine_cred || | ||
131 | gcred->acred.principal != acred->principal || | ||
132 | gcred->acred.uid != acred->uid || | ||
133 | gcred->acred.gid != acred->gid) | ||
134 | return 0; | ||
135 | return 1; | ||
136 | } | ||
137 | |||
126 | /* | 138 | /* |
127 | * Match credentials against current process creds. | 139 | * Match credentials against current process creds. |
128 | */ | 140 | */ |
@@ -132,9 +144,12 @@ generic_match(struct auth_cred *acred, struct rpc_cred *cred, int flags) | |||
132 | struct generic_cred *gcred = container_of(cred, struct generic_cred, gc_base); | 144 | struct generic_cred *gcred = container_of(cred, struct generic_cred, gc_base); |
133 | int i; | 145 | int i; |
134 | 146 | ||
147 | if (acred->machine_cred) | ||
148 | return machine_cred_match(acred, gcred, flags); | ||
149 | |||
135 | if (gcred->acred.uid != acred->uid || | 150 | if (gcred->acred.uid != acred->uid || |
136 | gcred->acred.gid != acred->gid || | 151 | gcred->acred.gid != acred->gid || |
137 | gcred->acred.machine_cred != acred->machine_cred) | 152 | gcred->acred.machine_cred != 0) |
138 | goto out_nomatch; | 153 | goto out_nomatch; |
139 | 154 | ||
140 | /* Optimisation in the case where pointers are identical... */ | 155 | /* Optimisation in the case where pointers are identical... */ |
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index aad8fb699989..85d3bb7490aa 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c | |||
@@ -1918,7 +1918,7 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
1918 | struct sk_buff *skb; | 1918 | struct sk_buff *skb; |
1919 | 1919 | ||
1920 | unix_state_lock(sk); | 1920 | unix_state_lock(sk); |
1921 | skb = skb_dequeue(&sk->sk_receive_queue); | 1921 | skb = skb_peek(&sk->sk_receive_queue); |
1922 | if (skb == NULL) { | 1922 | if (skb == NULL) { |
1923 | unix_sk(sk)->recursion_level = 0; | 1923 | unix_sk(sk)->recursion_level = 0; |
1924 | if (copied >= target) | 1924 | if (copied >= target) |
@@ -1958,11 +1958,8 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
1958 | if (check_creds) { | 1958 | if (check_creds) { |
1959 | /* Never glue messages from different writers */ | 1959 | /* Never glue messages from different writers */ |
1960 | if ((UNIXCB(skb).pid != siocb->scm->pid) || | 1960 | if ((UNIXCB(skb).pid != siocb->scm->pid) || |
1961 | (UNIXCB(skb).cred != siocb->scm->cred)) { | 1961 | (UNIXCB(skb).cred != siocb->scm->cred)) |
1962 | skb_queue_head(&sk->sk_receive_queue, skb); | ||
1963 | sk->sk_data_ready(sk, skb->len); | ||
1964 | break; | 1962 | break; |
1965 | } | ||
1966 | } else { | 1963 | } else { |
1967 | /* Copy credentials */ | 1964 | /* Copy credentials */ |
1968 | scm_set_cred(siocb->scm, UNIXCB(skb).pid, UNIXCB(skb).cred); | 1965 | scm_set_cred(siocb->scm, UNIXCB(skb).pid, UNIXCB(skb).cred); |
@@ -1977,8 +1974,6 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
1977 | 1974 | ||
1978 | chunk = min_t(unsigned int, skb->len, size); | 1975 | chunk = min_t(unsigned int, skb->len, size); |
1979 | if (memcpy_toiovec(msg->msg_iov, skb->data, chunk)) { | 1976 | if (memcpy_toiovec(msg->msg_iov, skb->data, chunk)) { |
1980 | skb_queue_head(&sk->sk_receive_queue, skb); | ||
1981 | sk->sk_data_ready(sk, skb->len); | ||
1982 | if (copied == 0) | 1977 | if (copied == 0) |
1983 | copied = -EFAULT; | 1978 | copied = -EFAULT; |
1984 | break; | 1979 | break; |
@@ -1993,13 +1988,10 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
1993 | if (UNIXCB(skb).fp) | 1988 | if (UNIXCB(skb).fp) |
1994 | unix_detach_fds(siocb->scm, skb); | 1989 | unix_detach_fds(siocb->scm, skb); |
1995 | 1990 | ||
1996 | /* put the skb back if we didn't use it up.. */ | 1991 | if (skb->len) |
1997 | if (skb->len) { | ||
1998 | skb_queue_head(&sk->sk_receive_queue, skb); | ||
1999 | sk->sk_data_ready(sk, skb->len); | ||
2000 | break; | 1992 | break; |
2001 | } | ||
2002 | 1993 | ||
1994 | skb_unlink(skb, &sk->sk_receive_queue); | ||
2003 | consume_skb(skb); | 1995 | consume_skb(skb); |
2004 | 1996 | ||
2005 | if (siocb->scm->fp) | 1997 | if (siocb->scm->fp) |
@@ -2010,9 +2002,6 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
2010 | if (UNIXCB(skb).fp) | 2002 | if (UNIXCB(skb).fp) |
2011 | siocb->scm->fp = scm_fp_dup(UNIXCB(skb).fp); | 2003 | siocb->scm->fp = scm_fp_dup(UNIXCB(skb).fp); |
2012 | 2004 | ||
2013 | /* put message back and return */ | ||
2014 | skb_queue_head(&sk->sk_receive_queue, skb); | ||
2015 | sk->sk_data_ready(sk, skb->len); | ||
2016 | break; | 2005 | break; |
2017 | } | 2006 | } |
2018 | } while (size); | 2007 | } while (size); |
diff --git a/scripts/kernel-doc b/scripts/kernel-doc index d793001929cf..9b0c0b8b4ab4 100755 --- a/scripts/kernel-doc +++ b/scripts/kernel-doc | |||
@@ -5,7 +5,7 @@ use strict; | |||
5 | ## Copyright (c) 1998 Michael Zucchi, All Rights Reserved ## | 5 | ## Copyright (c) 1998 Michael Zucchi, All Rights Reserved ## |
6 | ## Copyright (C) 2000, 1 Tim Waugh <twaugh@redhat.com> ## | 6 | ## Copyright (C) 2000, 1 Tim Waugh <twaugh@redhat.com> ## |
7 | ## Copyright (C) 2001 Simon Huggins ## | 7 | ## Copyright (C) 2001 Simon Huggins ## |
8 | ## Copyright (C) 2005-2010 Randy Dunlap ## | 8 | ## Copyright (C) 2005-2012 Randy Dunlap ## |
9 | ## ## | 9 | ## ## |
10 | ## #define enhancements by Armin Kuster <akuster@mvista.com> ## | 10 | ## #define enhancements by Armin Kuster <akuster@mvista.com> ## |
11 | ## Copyright (c) 2000 MontaVista Software, Inc. ## | 11 | ## Copyright (c) 2000 MontaVista Software, Inc. ## |
@@ -1785,6 +1785,7 @@ sub dump_function($$) { | |||
1785 | $prototype =~ s/__devinit +//; | 1785 | $prototype =~ s/__devinit +//; |
1786 | $prototype =~ s/__init +//; | 1786 | $prototype =~ s/__init +//; |
1787 | $prototype =~ s/__init_or_module +//; | 1787 | $prototype =~ s/__init_or_module +//; |
1788 | $prototype =~ s/__must_check +//; | ||
1788 | $prototype =~ s/^#\s*define\s+//; #ak added | 1789 | $prototype =~ s/^#\s*define\s+//; #ak added |
1789 | $prototype =~ s/__attribute__\s*\(\([a-z,]*\)\)//; | 1790 | $prototype =~ s/__attribute__\s*\(\([a-z,]*\)\)//; |
1790 | 1791 | ||
diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c index c0e14b3f2306..e8c969577768 100644 --- a/scripts/mod/file2alias.c +++ b/scripts/mod/file2alias.c | |||
@@ -823,16 +823,6 @@ static int do_spi_entry(const char *filename, struct spi_device_id *id, | |||
823 | } | 823 | } |
824 | ADD_TO_DEVTABLE("spi", struct spi_device_id, do_spi_entry); | 824 | ADD_TO_DEVTABLE("spi", struct spi_device_id, do_spi_entry); |
825 | 825 | ||
826 | /* Looks like: mcp:S */ | ||
827 | static int do_mcp_entry(const char *filename, struct mcp_device_id *id, | ||
828 | char *alias) | ||
829 | { | ||
830 | sprintf(alias, MCP_MODULE_PREFIX "%s", id->name); | ||
831 | |||
832 | return 1; | ||
833 | } | ||
834 | ADD_TO_DEVTABLE("mcp", struct mcp_device_id, do_mcp_entry); | ||
835 | |||
836 | static const struct dmifield { | 826 | static const struct dmifield { |
837 | const char *prefix; | 827 | const char *prefix; |
838 | int field; | 828 | int field; |
diff --git a/security/keys/internal.h b/security/keys/internal.h index c7a7caec4830..65647f825584 100644 --- a/security/keys/internal.h +++ b/security/keys/internal.h | |||
@@ -33,6 +33,7 @@ | |||
33 | 33 | ||
34 | extern struct key_type key_type_dead; | 34 | extern struct key_type key_type_dead; |
35 | extern struct key_type key_type_user; | 35 | extern struct key_type key_type_user; |
36 | extern struct key_type key_type_logon; | ||
36 | 37 | ||
37 | /*****************************************************************************/ | 38 | /*****************************************************************************/ |
38 | /* | 39 | /* |
diff --git a/security/keys/key.c b/security/keys/key.c index 4f64c7267afb..7ada8019be1f 100644 --- a/security/keys/key.c +++ b/security/keys/key.c | |||
@@ -999,6 +999,7 @@ void __init key_init(void) | |||
999 | list_add_tail(&key_type_keyring.link, &key_types_list); | 999 | list_add_tail(&key_type_keyring.link, &key_types_list); |
1000 | list_add_tail(&key_type_dead.link, &key_types_list); | 1000 | list_add_tail(&key_type_dead.link, &key_types_list); |
1001 | list_add_tail(&key_type_user.link, &key_types_list); | 1001 | list_add_tail(&key_type_user.link, &key_types_list); |
1002 | list_add_tail(&key_type_logon.link, &key_types_list); | ||
1002 | 1003 | ||
1003 | /* record the root user tracking */ | 1004 | /* record the root user tracking */ |
1004 | rb_link_node(&root_key_user.node, | 1005 | rb_link_node(&root_key_user.node, |
diff --git a/security/keys/user_defined.c b/security/keys/user_defined.c index 2aee3c5a3b99..c7660a25a3e4 100644 --- a/security/keys/user_defined.c +++ b/security/keys/user_defined.c | |||
@@ -18,6 +18,8 @@ | |||
18 | #include <asm/uaccess.h> | 18 | #include <asm/uaccess.h> |
19 | #include "internal.h" | 19 | #include "internal.h" |
20 | 20 | ||
21 | static int logon_vet_description(const char *desc); | ||
22 | |||
21 | /* | 23 | /* |
22 | * user defined keys take an arbitrary string as the description and an | 24 | * user defined keys take an arbitrary string as the description and an |
23 | * arbitrary blob of data as the payload | 25 | * arbitrary blob of data as the payload |
@@ -36,6 +38,24 @@ struct key_type key_type_user = { | |||
36 | EXPORT_SYMBOL_GPL(key_type_user); | 38 | EXPORT_SYMBOL_GPL(key_type_user); |
37 | 39 | ||
38 | /* | 40 | /* |
41 | * This key type is essentially the same as key_type_user, but it does | ||
42 | * not define a .read op. This is suitable for storing username and | ||
43 | * password pairs in the keyring that you do not want to be readable | ||
44 | * from userspace. | ||
45 | */ | ||
46 | struct key_type key_type_logon = { | ||
47 | .name = "logon", | ||
48 | .instantiate = user_instantiate, | ||
49 | .update = user_update, | ||
50 | .match = user_match, | ||
51 | .revoke = user_revoke, | ||
52 | .destroy = user_destroy, | ||
53 | .describe = user_describe, | ||
54 | .vet_description = logon_vet_description, | ||
55 | }; | ||
56 | EXPORT_SYMBOL_GPL(key_type_logon); | ||
57 | |||
58 | /* | ||
39 | * instantiate a user defined key | 59 | * instantiate a user defined key |
40 | */ | 60 | */ |
41 | int user_instantiate(struct key *key, const void *data, size_t datalen) | 61 | int user_instantiate(struct key *key, const void *data, size_t datalen) |
@@ -189,3 +209,20 @@ long user_read(const struct key *key, char __user *buffer, size_t buflen) | |||
189 | } | 209 | } |
190 | 210 | ||
191 | EXPORT_SYMBOL_GPL(user_read); | 211 | EXPORT_SYMBOL_GPL(user_read); |
212 | |||
213 | /* Vet the description for a "logon" key */ | ||
214 | static int logon_vet_description(const char *desc) | ||
215 | { | ||
216 | char *p; | ||
217 | |||
218 | /* require a "qualified" description string */ | ||
219 | p = strchr(desc, ':'); | ||
220 | if (!p) | ||
221 | return -EINVAL; | ||
222 | |||
223 | /* also reject description with ':' as first char */ | ||
224 | if (p == desc) | ||
225 | return -EINVAL; | ||
226 | |||
227 | return 0; | ||
228 | } | ||
diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c index dac3633507c9..a68aed7fce02 100644 --- a/sound/core/compress_offload.c +++ b/sound/core/compress_offload.c | |||
@@ -441,19 +441,22 @@ snd_compr_set_params(struct snd_compr_stream *stream, unsigned long arg) | |||
441 | params = kmalloc(sizeof(*params), GFP_KERNEL); | 441 | params = kmalloc(sizeof(*params), GFP_KERNEL); |
442 | if (!params) | 442 | if (!params) |
443 | return -ENOMEM; | 443 | return -ENOMEM; |
444 | if (copy_from_user(params, (void __user *)arg, sizeof(*params))) | 444 | if (copy_from_user(params, (void __user *)arg, sizeof(*params))) { |
445 | return -EFAULT; | 445 | retval = -EFAULT; |
446 | goto out; | ||
447 | } | ||
446 | retval = snd_compr_allocate_buffer(stream, params); | 448 | retval = snd_compr_allocate_buffer(stream, params); |
447 | if (retval) { | 449 | if (retval) { |
448 | kfree(params); | 450 | retval = -ENOMEM; |
449 | return -ENOMEM; | 451 | goto out; |
450 | } | 452 | } |
451 | retval = stream->ops->set_params(stream, params); | 453 | retval = stream->ops->set_params(stream, params); |
452 | if (retval) | 454 | if (retval) |
453 | goto out; | 455 | goto out; |
454 | stream->runtime->state = SNDRV_PCM_STATE_SETUP; | 456 | stream->runtime->state = SNDRV_PCM_STATE_SETUP; |
455 | } else | 457 | } else { |
456 | return -EPERM; | 458 | return -EPERM; |
459 | } | ||
457 | out: | 460 | out: |
458 | kfree(params); | 461 | kfree(params); |
459 | return retval; | 462 | return retval; |
diff --git a/sound/pci/hda/alc880_quirks.c b/sound/pci/hda/alc880_quirks.c index 5b68435d195b..501501ef36a9 100644 --- a/sound/pci/hda/alc880_quirks.c +++ b/sound/pci/hda/alc880_quirks.c | |||
@@ -762,16 +762,22 @@ static void alc880_uniwill_unsol_event(struct hda_codec *codec, | |||
762 | /* Looks like the unsol event is incompatible with the standard | 762 | /* Looks like the unsol event is incompatible with the standard |
763 | * definition. 4bit tag is placed at 28 bit! | 763 | * definition. 4bit tag is placed at 28 bit! |
764 | */ | 764 | */ |
765 | switch (res >> 28) { | 765 | res >>= 28; |
766 | switch (res) { | ||
766 | case ALC_MIC_EVENT: | 767 | case ALC_MIC_EVENT: |
767 | alc88x_simple_mic_automute(codec); | 768 | alc88x_simple_mic_automute(codec); |
768 | break; | 769 | break; |
769 | default: | 770 | default: |
770 | alc_sku_unsol_event(codec, res); | 771 | alc_exec_unsol_event(codec, res); |
771 | break; | 772 | break; |
772 | } | 773 | } |
773 | } | 774 | } |
774 | 775 | ||
776 | static void alc880_unsol_event(struct hda_codec *codec, unsigned int res) | ||
777 | { | ||
778 | alc_exec_unsol_event(codec, res >> 28); | ||
779 | } | ||
780 | |||
775 | static void alc880_uniwill_p53_setup(struct hda_codec *codec) | 781 | static void alc880_uniwill_p53_setup(struct hda_codec *codec) |
776 | { | 782 | { |
777 | struct alc_spec *spec = codec->spec; | 783 | struct alc_spec *spec = codec->spec; |
@@ -800,10 +806,11 @@ static void alc880_uniwill_p53_unsol_event(struct hda_codec *codec, | |||
800 | /* Looks like the unsol event is incompatible with the standard | 806 | /* Looks like the unsol event is incompatible with the standard |
801 | * definition. 4bit tag is placed at 28 bit! | 807 | * definition. 4bit tag is placed at 28 bit! |
802 | */ | 808 | */ |
803 | if ((res >> 28) == ALC_DCVOL_EVENT) | 809 | res >>= 28; |
810 | if (res == ALC_DCVOL_EVENT) | ||
804 | alc880_uniwill_p53_dcvol_automute(codec); | 811 | alc880_uniwill_p53_dcvol_automute(codec); |
805 | else | 812 | else |
806 | alc_sku_unsol_event(codec, res); | 813 | alc_exec_unsol_event(codec, res); |
807 | } | 814 | } |
808 | 815 | ||
809 | /* | 816 | /* |
@@ -1677,7 +1684,7 @@ static const struct alc_config_preset alc880_presets[] = { | |||
1677 | .channel_mode = alc880_lg_ch_modes, | 1684 | .channel_mode = alc880_lg_ch_modes, |
1678 | .need_dac_fix = 1, | 1685 | .need_dac_fix = 1, |
1679 | .input_mux = &alc880_lg_capture_source, | 1686 | .input_mux = &alc880_lg_capture_source, |
1680 | .unsol_event = alc_sku_unsol_event, | 1687 | .unsol_event = alc880_unsol_event, |
1681 | .setup = alc880_lg_setup, | 1688 | .setup = alc880_lg_setup, |
1682 | .init_hook = alc_hp_automute, | 1689 | .init_hook = alc_hp_automute, |
1683 | #ifdef CONFIG_SND_HDA_POWER_SAVE | 1690 | #ifdef CONFIG_SND_HDA_POWER_SAVE |
diff --git a/sound/pci/hda/alc882_quirks.c b/sound/pci/hda/alc882_quirks.c index bdf0ed4ab3e2..bb364a53f546 100644 --- a/sound/pci/hda/alc882_quirks.c +++ b/sound/pci/hda/alc882_quirks.c | |||
@@ -730,6 +730,11 @@ static void alc889A_mb31_unsol_event(struct hda_codec *codec, unsigned int res) | |||
730 | alc889A_mb31_automute(codec); | 730 | alc889A_mb31_automute(codec); |
731 | } | 731 | } |
732 | 732 | ||
733 | static void alc882_unsol_event(struct hda_codec *codec, unsigned int res) | ||
734 | { | ||
735 | alc_exec_unsol_event(codec, res >> 26); | ||
736 | } | ||
737 | |||
733 | /* | 738 | /* |
734 | * configuration and preset | 739 | * configuration and preset |
735 | */ | 740 | */ |
@@ -775,7 +780,7 @@ static const struct alc_config_preset alc882_presets[] = { | |||
775 | .channel_mode = alc885_mba21_ch_modes, | 780 | .channel_mode = alc885_mba21_ch_modes, |
776 | .num_channel_mode = ARRAY_SIZE(alc885_mba21_ch_modes), | 781 | .num_channel_mode = ARRAY_SIZE(alc885_mba21_ch_modes), |
777 | .input_mux = &alc882_capture_source, | 782 | .input_mux = &alc882_capture_source, |
778 | .unsol_event = alc_sku_unsol_event, | 783 | .unsol_event = alc882_unsol_event, |
779 | .setup = alc885_mba21_setup, | 784 | .setup = alc885_mba21_setup, |
780 | .init_hook = alc_hp_automute, | 785 | .init_hook = alc_hp_automute, |
781 | }, | 786 | }, |
@@ -791,7 +796,7 @@ static const struct alc_config_preset alc882_presets[] = { | |||
791 | .input_mux = &alc882_capture_source, | 796 | .input_mux = &alc882_capture_source, |
792 | .dig_out_nid = ALC882_DIGOUT_NID, | 797 | .dig_out_nid = ALC882_DIGOUT_NID, |
793 | .dig_in_nid = ALC882_DIGIN_NID, | 798 | .dig_in_nid = ALC882_DIGIN_NID, |
794 | .unsol_event = alc_sku_unsol_event, | 799 | .unsol_event = alc882_unsol_event, |
795 | .setup = alc885_mbp3_setup, | 800 | .setup = alc885_mbp3_setup, |
796 | .init_hook = alc_hp_automute, | 801 | .init_hook = alc_hp_automute, |
797 | }, | 802 | }, |
@@ -806,7 +811,7 @@ static const struct alc_config_preset alc882_presets[] = { | |||
806 | .input_mux = &mb5_capture_source, | 811 | .input_mux = &mb5_capture_source, |
807 | .dig_out_nid = ALC882_DIGOUT_NID, | 812 | .dig_out_nid = ALC882_DIGOUT_NID, |
808 | .dig_in_nid = ALC882_DIGIN_NID, | 813 | .dig_in_nid = ALC882_DIGIN_NID, |
809 | .unsol_event = alc_sku_unsol_event, | 814 | .unsol_event = alc882_unsol_event, |
810 | .setup = alc885_mb5_setup, | 815 | .setup = alc885_mb5_setup, |
811 | .init_hook = alc_hp_automute, | 816 | .init_hook = alc_hp_automute, |
812 | }, | 817 | }, |
@@ -821,7 +826,7 @@ static const struct alc_config_preset alc882_presets[] = { | |||
821 | .input_mux = &macmini3_capture_source, | 826 | .input_mux = &macmini3_capture_source, |
822 | .dig_out_nid = ALC882_DIGOUT_NID, | 827 | .dig_out_nid = ALC882_DIGOUT_NID, |
823 | .dig_in_nid = ALC882_DIGIN_NID, | 828 | .dig_in_nid = ALC882_DIGIN_NID, |
824 | .unsol_event = alc_sku_unsol_event, | 829 | .unsol_event = alc882_unsol_event, |
825 | .setup = alc885_macmini3_setup, | 830 | .setup = alc885_macmini3_setup, |
826 | .init_hook = alc_hp_automute, | 831 | .init_hook = alc_hp_automute, |
827 | }, | 832 | }, |
@@ -836,7 +841,7 @@ static const struct alc_config_preset alc882_presets[] = { | |||
836 | .input_mux = &alc889A_imac91_capture_source, | 841 | .input_mux = &alc889A_imac91_capture_source, |
837 | .dig_out_nid = ALC882_DIGOUT_NID, | 842 | .dig_out_nid = ALC882_DIGOUT_NID, |
838 | .dig_in_nid = ALC882_DIGIN_NID, | 843 | .dig_in_nid = ALC882_DIGIN_NID, |
839 | .unsol_event = alc_sku_unsol_event, | 844 | .unsol_event = alc882_unsol_event, |
840 | .setup = alc885_imac91_setup, | 845 | .setup = alc885_imac91_setup, |
841 | .init_hook = alc_hp_automute, | 846 | .init_hook = alc_hp_automute, |
842 | }, | 847 | }, |
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index fb35474c1203..95dfb6874941 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
@@ -469,6 +469,7 @@ struct azx { | |||
469 | unsigned int irq_pending_warned :1; | 469 | unsigned int irq_pending_warned :1; |
470 | unsigned int probing :1; /* codec probing phase */ | 470 | unsigned int probing :1; /* codec probing phase */ |
471 | unsigned int snoop:1; | 471 | unsigned int snoop:1; |
472 | unsigned int align_buffer_size:1; | ||
472 | 473 | ||
473 | /* for debugging */ | 474 | /* for debugging */ |
474 | unsigned int last_cmd[AZX_MAX_CODECS]; | 475 | unsigned int last_cmd[AZX_MAX_CODECS]; |
@@ -1690,7 +1691,7 @@ static int azx_pcm_open(struct snd_pcm_substream *substream) | |||
1690 | runtime->hw.rates = hinfo->rates; | 1691 | runtime->hw.rates = hinfo->rates; |
1691 | snd_pcm_limit_hw_rates(runtime); | 1692 | snd_pcm_limit_hw_rates(runtime); |
1692 | snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS); | 1693 | snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS); |
1693 | if (align_buffer_size) | 1694 | if (chip->align_buffer_size) |
1694 | /* constrain buffer sizes to be multiple of 128 | 1695 | /* constrain buffer sizes to be multiple of 128 |
1695 | bytes. This is more efficient in terms of memory | 1696 | bytes. This is more efficient in terms of memory |
1696 | access but isn't required by the HDA spec and | 1697 | access but isn't required by the HDA spec and |
@@ -2773,8 +2774,9 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci, | |||
2773 | } | 2774 | } |
2774 | 2775 | ||
2775 | /* disable buffer size rounding to 128-byte multiples if supported */ | 2776 | /* disable buffer size rounding to 128-byte multiples if supported */ |
2777 | chip->align_buffer_size = align_buffer_size; | ||
2776 | if (chip->driver_caps & AZX_DCAPS_BUFSIZE) | 2778 | if (chip->driver_caps & AZX_DCAPS_BUFSIZE) |
2777 | align_buffer_size = 0; | 2779 | chip->align_buffer_size = 0; |
2778 | 2780 | ||
2779 | /* allow 64bit DMA address if supported by H/W */ | 2781 | /* allow 64bit DMA address if supported by H/W */ |
2780 | if ((gcap & ICH6_GCAP_64OK) && !pci_set_dma_mask(pci, DMA_BIT_MASK(64))) | 2782 | if ((gcap & ICH6_GCAP_64OK) && !pci_set_dma_mask(pci, DMA_BIT_MASK(64))) |
diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index 8a32a69c83c3..a7a5733aa4d2 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c | |||
@@ -3027,7 +3027,7 @@ static const struct snd_pci_quirk cxt5066_cfg_tbl[] = { | |||
3027 | SND_PCI_QUIRK(0x17aa, 0x20f2, "Lenovo T400s", CXT5066_THINKPAD), | 3027 | SND_PCI_QUIRK(0x17aa, 0x20f2, "Lenovo T400s", CXT5066_THINKPAD), |
3028 | SND_PCI_QUIRK(0x17aa, 0x21c5, "Thinkpad Edge 13", CXT5066_THINKPAD), | 3028 | SND_PCI_QUIRK(0x17aa, 0x21c5, "Thinkpad Edge 13", CXT5066_THINKPAD), |
3029 | SND_PCI_QUIRK(0x17aa, 0x21c6, "Thinkpad Edge 13", CXT5066_ASUS), | 3029 | SND_PCI_QUIRK(0x17aa, 0x21c6, "Thinkpad Edge 13", CXT5066_ASUS), |
3030 | SND_PCI_QUIRK(0x17aa, 0x215e, "Lenovo Thinkpad", CXT5066_THINKPAD), | 3030 | SND_PCI_QUIRK(0x17aa, 0x215e, "Lenovo T510", CXT5066_AUTO), |
3031 | SND_PCI_QUIRK(0x17aa, 0x21cf, "Lenovo T520 & W520", CXT5066_AUTO), | 3031 | SND_PCI_QUIRK(0x17aa, 0x21cf, "Lenovo T520 & W520", CXT5066_AUTO), |
3032 | SND_PCI_QUIRK(0x17aa, 0x21da, "Lenovo X220", CXT5066_THINKPAD), | 3032 | SND_PCI_QUIRK(0x17aa, 0x21da, "Lenovo X220", CXT5066_THINKPAD), |
3033 | SND_PCI_QUIRK(0x17aa, 0x21db, "Lenovo X220-tablet", CXT5066_THINKPAD), | 3033 | SND_PCI_QUIRK(0x17aa, 0x21db, "Lenovo X220-tablet", CXT5066_THINKPAD), |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 5e82acf77c5a..0db1dc49382b 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -185,7 +185,6 @@ struct alc_spec { | |||
185 | unsigned int vol_in_capsrc:1; /* use capsrc volume (ADC has no vol) */ | 185 | unsigned int vol_in_capsrc:1; /* use capsrc volume (ADC has no vol) */ |
186 | unsigned int parse_flags; /* passed to snd_hda_parse_pin_defcfg() */ | 186 | unsigned int parse_flags; /* passed to snd_hda_parse_pin_defcfg() */ |
187 | unsigned int shared_mic_hp:1; /* HP/Mic-in sharing */ | 187 | unsigned int shared_mic_hp:1; /* HP/Mic-in sharing */ |
188 | unsigned int use_jack_tbl:1; /* 1 for model=auto */ | ||
189 | 188 | ||
190 | /* auto-mute control */ | 189 | /* auto-mute control */ |
191 | int automute_mode; | 190 | int automute_mode; |
@@ -621,17 +620,10 @@ static void alc_mic_automute(struct hda_codec *codec) | |||
621 | alc_mux_select(codec, 0, spec->int_mic_idx, false); | 620 | alc_mux_select(codec, 0, spec->int_mic_idx, false); |
622 | } | 621 | } |
623 | 622 | ||
624 | /* unsolicited event for HP jack sensing */ | 623 | /* handle the specified unsol action (ALC_XXX_EVENT) */ |
625 | static void alc_sku_unsol_event(struct hda_codec *codec, unsigned int res) | 624 | static void alc_exec_unsol_event(struct hda_codec *codec, int action) |
626 | { | 625 | { |
627 | struct alc_spec *spec = codec->spec; | 626 | switch (action) { |
628 | if (codec->vendor_id == 0x10ec0880) | ||
629 | res >>= 28; | ||
630 | else | ||
631 | res >>= 26; | ||
632 | if (spec->use_jack_tbl) | ||
633 | res = snd_hda_jack_get_action(codec, res); | ||
634 | switch (res) { | ||
635 | case ALC_HP_EVENT: | 627 | case ALC_HP_EVENT: |
636 | alc_hp_automute(codec); | 628 | alc_hp_automute(codec); |
637 | break; | 629 | break; |
@@ -645,6 +637,17 @@ static void alc_sku_unsol_event(struct hda_codec *codec, unsigned int res) | |||
645 | snd_hda_jack_report_sync(codec); | 637 | snd_hda_jack_report_sync(codec); |
646 | } | 638 | } |
647 | 639 | ||
640 | /* unsolicited event for HP jack sensing */ | ||
641 | static void alc_sku_unsol_event(struct hda_codec *codec, unsigned int res) | ||
642 | { | ||
643 | if (codec->vendor_id == 0x10ec0880) | ||
644 | res >>= 28; | ||
645 | else | ||
646 | res >>= 26; | ||
647 | res = snd_hda_jack_get_action(codec, res); | ||
648 | alc_exec_unsol_event(codec, res); | ||
649 | } | ||
650 | |||
648 | /* call init functions of standard auto-mute helpers */ | 651 | /* call init functions of standard auto-mute helpers */ |
649 | static void alc_inithook(struct hda_codec *codec) | 652 | static void alc_inithook(struct hda_codec *codec) |
650 | { | 653 | { |
@@ -1883,7 +1886,7 @@ static const struct snd_kcontrol_new alc_beep_mixer[] = { | |||
1883 | }; | 1886 | }; |
1884 | #endif | 1887 | #endif |
1885 | 1888 | ||
1886 | static int alc_build_controls(struct hda_codec *codec) | 1889 | static int __alc_build_controls(struct hda_codec *codec) |
1887 | { | 1890 | { |
1888 | struct alc_spec *spec = codec->spec; | 1891 | struct alc_spec *spec = codec->spec; |
1889 | struct snd_kcontrol *kctl = NULL; | 1892 | struct snd_kcontrol *kctl = NULL; |
@@ -2029,11 +2032,16 @@ static int alc_build_controls(struct hda_codec *codec) | |||
2029 | 2032 | ||
2030 | alc_free_kctls(codec); /* no longer needed */ | 2033 | alc_free_kctls(codec); /* no longer needed */ |
2031 | 2034 | ||
2032 | err = snd_hda_jack_add_kctls(codec, &spec->autocfg); | 2035 | return 0; |
2036 | } | ||
2037 | |||
2038 | static int alc_build_controls(struct hda_codec *codec) | ||
2039 | { | ||
2040 | struct alc_spec *spec = codec->spec; | ||
2041 | int err = __alc_build_controls(codec); | ||
2033 | if (err < 0) | 2042 | if (err < 0) |
2034 | return err; | 2043 | return err; |
2035 | 2044 | return snd_hda_jack_add_kctls(codec, &spec->autocfg); | |
2036 | return 0; | ||
2037 | } | 2045 | } |
2038 | 2046 | ||
2039 | 2047 | ||
@@ -3233,7 +3241,7 @@ static int alc_auto_create_multi_out_ctls(struct hda_codec *codec, | |||
3233 | int i, err, noutputs; | 3241 | int i, err, noutputs; |
3234 | 3242 | ||
3235 | noutputs = cfg->line_outs; | 3243 | noutputs = cfg->line_outs; |
3236 | if (spec->multi_ios > 0) | 3244 | if (spec->multi_ios > 0 && cfg->line_outs < 3) |
3237 | noutputs += spec->multi_ios; | 3245 | noutputs += spec->multi_ios; |
3238 | 3246 | ||
3239 | for (i = 0; i < noutputs; i++) { | 3247 | for (i = 0; i < noutputs; i++) { |
@@ -3904,7 +3912,6 @@ static void set_capture_mixer(struct hda_codec *codec) | |||
3904 | static void alc_auto_init_std(struct hda_codec *codec) | 3912 | static void alc_auto_init_std(struct hda_codec *codec) |
3905 | { | 3913 | { |
3906 | struct alc_spec *spec = codec->spec; | 3914 | struct alc_spec *spec = codec->spec; |
3907 | spec->use_jack_tbl = 1; | ||
3908 | alc_auto_init_multi_out(codec); | 3915 | alc_auto_init_multi_out(codec); |
3909 | alc_auto_init_extra_out(codec); | 3916 | alc_auto_init_extra_out(codec); |
3910 | alc_auto_init_analog_input(codec); | 3917 | alc_auto_init_analog_input(codec); |
@@ -4168,6 +4175,8 @@ static int patch_alc880(struct hda_codec *codec) | |||
4168 | codec->patch_ops = alc_patch_ops; | 4175 | codec->patch_ops = alc_patch_ops; |
4169 | if (board_config == ALC_MODEL_AUTO) | 4176 | if (board_config == ALC_MODEL_AUTO) |
4170 | spec->init_hook = alc_auto_init_std; | 4177 | spec->init_hook = alc_auto_init_std; |
4178 | else | ||
4179 | codec->patch_ops.build_controls = __alc_build_controls; | ||
4171 | #ifdef CONFIG_SND_HDA_POWER_SAVE | 4180 | #ifdef CONFIG_SND_HDA_POWER_SAVE |
4172 | if (!spec->loopback.amplist) | 4181 | if (!spec->loopback.amplist) |
4173 | spec->loopback.amplist = alc880_loopbacks; | 4182 | spec->loopback.amplist = alc880_loopbacks; |
@@ -4297,6 +4306,8 @@ static int patch_alc260(struct hda_codec *codec) | |||
4297 | codec->patch_ops = alc_patch_ops; | 4306 | codec->patch_ops = alc_patch_ops; |
4298 | if (board_config == ALC_MODEL_AUTO) | 4307 | if (board_config == ALC_MODEL_AUTO) |
4299 | spec->init_hook = alc_auto_init_std; | 4308 | spec->init_hook = alc_auto_init_std; |
4309 | else | ||
4310 | codec->patch_ops.build_controls = __alc_build_controls; | ||
4300 | spec->shutup = alc_eapd_shutup; | 4311 | spec->shutup = alc_eapd_shutup; |
4301 | #ifdef CONFIG_SND_HDA_POWER_SAVE | 4312 | #ifdef CONFIG_SND_HDA_POWER_SAVE |
4302 | if (!spec->loopback.amplist) | 4313 | if (!spec->loopback.amplist) |
@@ -4691,6 +4702,8 @@ static int patch_alc882(struct hda_codec *codec) | |||
4691 | codec->patch_ops = alc_patch_ops; | 4702 | codec->patch_ops = alc_patch_ops; |
4692 | if (board_config == ALC_MODEL_AUTO) | 4703 | if (board_config == ALC_MODEL_AUTO) |
4693 | spec->init_hook = alc_auto_init_std; | 4704 | spec->init_hook = alc_auto_init_std; |
4705 | else | ||
4706 | codec->patch_ops.build_controls = __alc_build_controls; | ||
4694 | 4707 | ||
4695 | #ifdef CONFIG_SND_HDA_POWER_SAVE | 4708 | #ifdef CONFIG_SND_HDA_POWER_SAVE |
4696 | if (!spec->loopback.amplist) | 4709 | if (!spec->loopback.amplist) |
@@ -5573,6 +5586,7 @@ static const struct hda_amp_list alc861_loopbacks[] = { | |||
5573 | /* Pin config fixes */ | 5586 | /* Pin config fixes */ |
5574 | enum { | 5587 | enum { |
5575 | PINFIX_FSC_AMILO_PI1505, | 5588 | PINFIX_FSC_AMILO_PI1505, |
5589 | PINFIX_ASUS_A6RP, | ||
5576 | }; | 5590 | }; |
5577 | 5591 | ||
5578 | static const struct alc_fixup alc861_fixups[] = { | 5592 | static const struct alc_fixup alc861_fixups[] = { |
@@ -5584,9 +5598,19 @@ static const struct alc_fixup alc861_fixups[] = { | |||
5584 | { } | 5598 | { } |
5585 | } | 5599 | } |
5586 | }, | 5600 | }, |
5601 | [PINFIX_ASUS_A6RP] = { | ||
5602 | .type = ALC_FIXUP_VERBS, | ||
5603 | .v.verbs = (const struct hda_verb[]) { | ||
5604 | /* node 0x0f VREF seems controlling the master output */ | ||
5605 | { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50 }, | ||
5606 | { } | ||
5607 | }, | ||
5608 | }, | ||
5587 | }; | 5609 | }; |
5588 | 5610 | ||
5589 | static const struct snd_pci_quirk alc861_fixup_tbl[] = { | 5611 | static const struct snd_pci_quirk alc861_fixup_tbl[] = { |
5612 | SND_PCI_QUIRK(0x1043, 0x1393, "ASUS A6Rp", PINFIX_ASUS_A6RP), | ||
5613 | SND_PCI_QUIRK(0x1584, 0x2b01, "Haier W18", PINFIX_ASUS_A6RP), | ||
5590 | SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", PINFIX_FSC_AMILO_PI1505), | 5614 | SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", PINFIX_FSC_AMILO_PI1505), |
5591 | {} | 5615 | {} |
5592 | }; | 5616 | }; |
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 3556408d6ece..948f0be2f4f3 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
@@ -1608,7 +1608,7 @@ static const struct snd_pci_quirk stac92hd73xx_codec_id_cfg_tbl[] = { | |||
1608 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x043a, | 1608 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x043a, |
1609 | "Alienware M17x", STAC_ALIENWARE_M17X), | 1609 | "Alienware M17x", STAC_ALIENWARE_M17X), |
1610 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0490, | 1610 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0490, |
1611 | "Alienware M17x", STAC_ALIENWARE_M17X), | 1611 | "Alienware M17x R3", STAC_DELL_EQ), |
1612 | {} /* terminator */ | 1612 | {} /* terminator */ |
1613 | }; | 1613 | }; |
1614 | 1614 | ||
@@ -4163,13 +4163,15 @@ static int enable_pin_detect(struct hda_codec *codec, hda_nid_t nid, | |||
4163 | return 1; | 4163 | return 1; |
4164 | } | 4164 | } |
4165 | 4165 | ||
4166 | static int is_nid_hp_pin(struct auto_pin_cfg *cfg, hda_nid_t nid) | 4166 | static int is_nid_out_jack_pin(struct auto_pin_cfg *cfg, hda_nid_t nid) |
4167 | { | 4167 | { |
4168 | int i; | 4168 | int i; |
4169 | for (i = 0; i < cfg->hp_outs; i++) | 4169 | for (i = 0; i < cfg->hp_outs; i++) |
4170 | if (cfg->hp_pins[i] == nid) | 4170 | if (cfg->hp_pins[i] == nid) |
4171 | return 1; /* nid is a HP-Out */ | 4171 | return 1; /* nid is a HP-Out */ |
4172 | 4172 | for (i = 0; i < cfg->line_outs; i++) | |
4173 | if (cfg->line_out_pins[i] == nid) | ||
4174 | return 1; /* nid is a line-Out */ | ||
4173 | return 0; /* nid is not a HP-Out */ | 4175 | return 0; /* nid is not a HP-Out */ |
4174 | }; | 4176 | }; |
4175 | 4177 | ||
@@ -4375,7 +4377,7 @@ static int stac92xx_init(struct hda_codec *codec) | |||
4375 | continue; | 4377 | continue; |
4376 | } | 4378 | } |
4377 | 4379 | ||
4378 | if (is_nid_hp_pin(cfg, nid)) | 4380 | if (is_nid_out_jack_pin(cfg, nid)) |
4379 | continue; /* already has an unsol event */ | 4381 | continue; /* already has an unsol event */ |
4380 | 4382 | ||
4381 | pinctl = snd_hda_codec_read(codec, nid, 0, | 4383 | pinctl = snd_hda_codec_read(codec, nid, 0, |
@@ -4868,7 +4870,14 @@ static int find_mute_led_cfg(struct hda_codec *codec, int default_polarity) | |||
4868 | /* BIOS bug: unfilled OEM string */ | 4870 | /* BIOS bug: unfilled OEM string */ |
4869 | if (strstr(dev->name, "HP_Mute_LED_P_G")) { | 4871 | if (strstr(dev->name, "HP_Mute_LED_P_G")) { |
4870 | set_hp_led_gpio(codec); | 4872 | set_hp_led_gpio(codec); |
4871 | spec->gpio_led_polarity = 1; | 4873 | switch (codec->subsystem_id) { |
4874 | case 0x103c148a: | ||
4875 | spec->gpio_led_polarity = 0; | ||
4876 | break; | ||
4877 | default: | ||
4878 | spec->gpio_led_polarity = 1; | ||
4879 | break; | ||
4880 | } | ||
4872 | return 1; | 4881 | return 1; |
4873 | } | 4882 | } |
4874 | } | 4883 | } |
diff --git a/sound/pci/ymfpci/ymfpci.c b/sound/pci/ymfpci/ymfpci.c index e57b89e8aa89..94ab728f5ca8 100644 --- a/sound/pci/ymfpci/ymfpci.c +++ b/sound/pci/ymfpci/ymfpci.c | |||
@@ -286,17 +286,22 @@ static int __devinit snd_card_ymfpci_probe(struct pci_dev *pci, | |||
286 | snd_card_free(card); | 286 | snd_card_free(card); |
287 | return err; | 287 | return err; |
288 | } | 288 | } |
289 | if ((err = snd_ymfpci_pcm_4ch(chip, 2, NULL)) < 0) { | 289 | err = snd_ymfpci_mixer(chip, rear_switch[dev]); |
290 | if (err < 0) { | ||
290 | snd_card_free(card); | 291 | snd_card_free(card); |
291 | return err; | 292 | return err; |
292 | } | 293 | } |
293 | if ((err = snd_ymfpci_pcm2(chip, 3, NULL)) < 0) { | 294 | if (chip->ac97->ext_id & AC97_EI_SDAC) { |
294 | snd_card_free(card); | 295 | err = snd_ymfpci_pcm_4ch(chip, 2, NULL); |
295 | return err; | 296 | if (err < 0) { |
296 | } | 297 | snd_card_free(card); |
297 | if ((err = snd_ymfpci_mixer(chip, rear_switch[dev])) < 0) { | 298 | return err; |
298 | snd_card_free(card); | 299 | } |
299 | return err; | 300 | err = snd_ymfpci_pcm2(chip, 3, NULL); |
301 | if (err < 0) { | ||
302 | snd_card_free(card); | ||
303 | return err; | ||
304 | } | ||
300 | } | 305 | } |
301 | if ((err = snd_ymfpci_timer(chip, 0)) < 0) { | 306 | if ((err = snd_ymfpci_timer(chip, 0)) < 0) { |
302 | snd_card_free(card); | 307 | snd_card_free(card); |
diff --git a/sound/pci/ymfpci/ymfpci_main.c b/sound/pci/ymfpci/ymfpci_main.c index 03ee4e365311..12a9a2b03387 100644 --- a/sound/pci/ymfpci/ymfpci_main.c +++ b/sound/pci/ymfpci/ymfpci_main.c | |||
@@ -1614,6 +1614,14 @@ static int snd_ymfpci_put_dup4ch(struct snd_kcontrol *kcontrol, struct snd_ctl_e | |||
1614 | return change; | 1614 | return change; |
1615 | } | 1615 | } |
1616 | 1616 | ||
1617 | static struct snd_kcontrol_new snd_ymfpci_dup4ch __devinitdata = { | ||
1618 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | ||
1619 | .name = "4ch Duplication", | ||
1620 | .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, | ||
1621 | .info = snd_ymfpci_info_dup4ch, | ||
1622 | .get = snd_ymfpci_get_dup4ch, | ||
1623 | .put = snd_ymfpci_put_dup4ch, | ||
1624 | }; | ||
1617 | 1625 | ||
1618 | static struct snd_kcontrol_new snd_ymfpci_controls[] __devinitdata = { | 1626 | static struct snd_kcontrol_new snd_ymfpci_controls[] __devinitdata = { |
1619 | { | 1627 | { |
@@ -1642,13 +1650,6 @@ YMFPCI_DOUBLE(SNDRV_CTL_NAME_IEC958("",CAPTURE,VOLUME), 1, YDSXGR_SPDIFLOOPVOL), | |||
1642 | YMFPCI_SINGLE(SNDRV_CTL_NAME_IEC958("",PLAYBACK,SWITCH), 0, YDSXGR_SPDIFOUTCTRL, 0), | 1650 | YMFPCI_SINGLE(SNDRV_CTL_NAME_IEC958("",PLAYBACK,SWITCH), 0, YDSXGR_SPDIFOUTCTRL, 0), |
1643 | YMFPCI_SINGLE(SNDRV_CTL_NAME_IEC958("",CAPTURE,SWITCH), 0, YDSXGR_SPDIFINCTRL, 0), | 1651 | YMFPCI_SINGLE(SNDRV_CTL_NAME_IEC958("",CAPTURE,SWITCH), 0, YDSXGR_SPDIFINCTRL, 0), |
1644 | YMFPCI_SINGLE(SNDRV_CTL_NAME_IEC958("Loop",NONE,NONE), 0, YDSXGR_SPDIFINCTRL, 4), | 1652 | YMFPCI_SINGLE(SNDRV_CTL_NAME_IEC958("Loop",NONE,NONE), 0, YDSXGR_SPDIFINCTRL, 4), |
1645 | { | ||
1646 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | ||
1647 | .name = "4ch Duplication", | ||
1648 | .info = snd_ymfpci_info_dup4ch, | ||
1649 | .get = snd_ymfpci_get_dup4ch, | ||
1650 | .put = snd_ymfpci_put_dup4ch, | ||
1651 | }, | ||
1652 | }; | 1653 | }; |
1653 | 1654 | ||
1654 | 1655 | ||
@@ -1838,6 +1839,12 @@ int __devinit snd_ymfpci_mixer(struct snd_ymfpci *chip, int rear_switch) | |||
1838 | if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_ymfpci_controls[idx], chip))) < 0) | 1839 | if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_ymfpci_controls[idx], chip))) < 0) |
1839 | return err; | 1840 | return err; |
1840 | } | 1841 | } |
1842 | if (chip->ac97->ext_id & AC97_EI_SDAC) { | ||
1843 | kctl = snd_ctl_new1(&snd_ymfpci_dup4ch, chip); | ||
1844 | err = snd_ctl_add(chip->card, kctl); | ||
1845 | if (err < 0) | ||
1846 | return err; | ||
1847 | } | ||
1841 | 1848 | ||
1842 | /* add S/PDIF control */ | 1849 | /* add S/PDIF control */ |
1843 | if (snd_BUG_ON(!chip->pcm_spdif)) | 1850 | if (snd_BUG_ON(!chip->pcm_spdif)) |
diff --git a/sound/soc/codecs/sgtl5000.c b/sound/soc/codecs/sgtl5000.c index f8863ebb4304..7f4ba819a9f6 100644 --- a/sound/soc/codecs/sgtl5000.c +++ b/sound/soc/codecs/sgtl5000.c | |||
@@ -987,12 +987,12 @@ static int sgtl5000_restore_regs(struct snd_soc_codec *codec) | |||
987 | /* restore regular registers */ | 987 | /* restore regular registers */ |
988 | for (reg = 0; reg <= SGTL5000_CHIP_SHORT_CTRL; reg += 2) { | 988 | for (reg = 0; reg <= SGTL5000_CHIP_SHORT_CTRL; reg += 2) { |
989 | 989 | ||
990 | /* this regs depends on the others */ | 990 | /* These regs should restore in particular order */ |
991 | if (reg == SGTL5000_CHIP_ANA_POWER || | 991 | if (reg == SGTL5000_CHIP_ANA_POWER || |
992 | reg == SGTL5000_CHIP_CLK_CTRL || | 992 | reg == SGTL5000_CHIP_CLK_CTRL || |
993 | reg == SGTL5000_CHIP_LINREG_CTRL || | 993 | reg == SGTL5000_CHIP_LINREG_CTRL || |
994 | reg == SGTL5000_CHIP_LINE_OUT_CTRL || | 994 | reg == SGTL5000_CHIP_LINE_OUT_CTRL || |
995 | reg == SGTL5000_CHIP_CLK_CTRL) | 995 | reg == SGTL5000_CHIP_REF_CTRL) |
996 | continue; | 996 | continue; |
997 | 997 | ||
998 | snd_soc_write(codec, reg, cache[reg]); | 998 | snd_soc_write(codec, reg, cache[reg]); |
@@ -1003,8 +1003,17 @@ static int sgtl5000_restore_regs(struct snd_soc_codec *codec) | |||
1003 | snd_soc_write(codec, reg, cache[reg]); | 1003 | snd_soc_write(codec, reg, cache[reg]); |
1004 | 1004 | ||
1005 | /* | 1005 | /* |
1006 | * restore power and other regs according | 1006 | * restore these regs according to the power setting sequence in |
1007 | * to set_power() and set_clock() | 1007 | * sgtl5000_set_power_regs() and clock setting sequence in |
1008 | * sgtl5000_set_clock(). | ||
1009 | * | ||
1010 | * The order of restore is: | ||
1011 | * 1. SGTL5000_CHIP_CLK_CTRL MCLK_FREQ bits (1:0) should be restore after | ||
1012 | * SGTL5000_CHIP_ANA_POWER PLL bits set | ||
1013 | * 2. SGTL5000_CHIP_LINREG_CTRL should be set before | ||
1014 | * SGTL5000_CHIP_ANA_POWER LINREG_D restored | ||
1015 | * 3. SGTL5000_CHIP_REF_CTRL controls Analog Ground Voltage, | ||
1016 | * prefer to resotre it after SGTL5000_CHIP_ANA_POWER restored | ||
1008 | */ | 1017 | */ |
1009 | snd_soc_write(codec, SGTL5000_CHIP_LINREG_CTRL, | 1018 | snd_soc_write(codec, SGTL5000_CHIP_LINREG_CTRL, |
1010 | cache[SGTL5000_CHIP_LINREG_CTRL]); | 1019 | cache[SGTL5000_CHIP_LINREG_CTRL]); |
diff --git a/sound/soc/codecs/tlv320aic32x4.c b/sound/soc/codecs/tlv320aic32x4.c index eb401ef021fb..372b0b83bd9f 100644 --- a/sound/soc/codecs/tlv320aic32x4.c +++ b/sound/soc/codecs/tlv320aic32x4.c | |||
@@ -60,7 +60,6 @@ struct aic32x4_rate_divs { | |||
60 | 60 | ||
61 | struct aic32x4_priv { | 61 | struct aic32x4_priv { |
62 | u32 sysclk; | 62 | u32 sysclk; |
63 | s32 master; | ||
64 | u8 page_no; | 63 | u8 page_no; |
65 | void *control_data; | 64 | void *control_data; |
66 | u32 power_cfg; | 65 | u32 power_cfg; |
@@ -369,7 +368,6 @@ static int aic32x4_set_dai_sysclk(struct snd_soc_dai *codec_dai, | |||
369 | static int aic32x4_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) | 368 | static int aic32x4_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) |
370 | { | 369 | { |
371 | struct snd_soc_codec *codec = codec_dai->codec; | 370 | struct snd_soc_codec *codec = codec_dai->codec; |
372 | struct aic32x4_priv *aic32x4 = snd_soc_codec_get_drvdata(codec); | ||
373 | u8 iface_reg_1; | 371 | u8 iface_reg_1; |
374 | u8 iface_reg_2; | 372 | u8 iface_reg_2; |
375 | u8 iface_reg_3; | 373 | u8 iface_reg_3; |
@@ -384,11 +382,9 @@ static int aic32x4_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) | |||
384 | /* set master/slave audio interface */ | 382 | /* set master/slave audio interface */ |
385 | switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { | 383 | switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { |
386 | case SND_SOC_DAIFMT_CBM_CFM: | 384 | case SND_SOC_DAIFMT_CBM_CFM: |
387 | aic32x4->master = 1; | ||
388 | iface_reg_1 |= AIC32X4_BCLKMASTER | AIC32X4_WCLKMASTER; | 385 | iface_reg_1 |= AIC32X4_BCLKMASTER | AIC32X4_WCLKMASTER; |
389 | break; | 386 | break; |
390 | case SND_SOC_DAIFMT_CBS_CFS: | 387 | case SND_SOC_DAIFMT_CBS_CFS: |
391 | aic32x4->master = 0; | ||
392 | break; | 388 | break; |
393 | default: | 389 | default: |
394 | printk(KERN_ERR "aic32x4: invalid DAI master/slave interface\n"); | 390 | printk(KERN_ERR "aic32x4: invalid DAI master/slave interface\n"); |
@@ -526,64 +522,58 @@ static int aic32x4_mute(struct snd_soc_dai *dai, int mute) | |||
526 | static int aic32x4_set_bias_level(struct snd_soc_codec *codec, | 522 | static int aic32x4_set_bias_level(struct snd_soc_codec *codec, |
527 | enum snd_soc_bias_level level) | 523 | enum snd_soc_bias_level level) |
528 | { | 524 | { |
529 | struct aic32x4_priv *aic32x4 = snd_soc_codec_get_drvdata(codec); | ||
530 | |||
531 | switch (level) { | 525 | switch (level) { |
532 | case SND_SOC_BIAS_ON: | 526 | case SND_SOC_BIAS_ON: |
533 | if (aic32x4->master) { | 527 | /* Switch on PLL */ |
534 | /* Switch on PLL */ | 528 | snd_soc_update_bits(codec, AIC32X4_PLLPR, |
535 | snd_soc_update_bits(codec, AIC32X4_PLLPR, | 529 | AIC32X4_PLLEN, AIC32X4_PLLEN); |
536 | AIC32X4_PLLEN, AIC32X4_PLLEN); | 530 | |
537 | 531 | /* Switch on NDAC Divider */ | |
538 | /* Switch on NDAC Divider */ | 532 | snd_soc_update_bits(codec, AIC32X4_NDAC, |
539 | snd_soc_update_bits(codec, AIC32X4_NDAC, | 533 | AIC32X4_NDACEN, AIC32X4_NDACEN); |
540 | AIC32X4_NDACEN, AIC32X4_NDACEN); | 534 | |
541 | 535 | /* Switch on MDAC Divider */ | |
542 | /* Switch on MDAC Divider */ | 536 | snd_soc_update_bits(codec, AIC32X4_MDAC, |
543 | snd_soc_update_bits(codec, AIC32X4_MDAC, | 537 | AIC32X4_MDACEN, AIC32X4_MDACEN); |
544 | AIC32X4_MDACEN, AIC32X4_MDACEN); | 538 | |
545 | 539 | /* Switch on NADC Divider */ | |
546 | /* Switch on NADC Divider */ | 540 | snd_soc_update_bits(codec, AIC32X4_NADC, |
547 | snd_soc_update_bits(codec, AIC32X4_NADC, | 541 | AIC32X4_NADCEN, AIC32X4_NADCEN); |
548 | AIC32X4_NADCEN, AIC32X4_NADCEN); | 542 | |
549 | 543 | /* Switch on MADC Divider */ | |
550 | /* Switch on MADC Divider */ | 544 | snd_soc_update_bits(codec, AIC32X4_MADC, |
551 | snd_soc_update_bits(codec, AIC32X4_MADC, | 545 | AIC32X4_MADCEN, AIC32X4_MADCEN); |
552 | AIC32X4_MADCEN, AIC32X4_MADCEN); | 546 | |
553 | 547 | /* Switch on BCLK_N Divider */ | |
554 | /* Switch on BCLK_N Divider */ | 548 | snd_soc_update_bits(codec, AIC32X4_BCLKN, |
555 | snd_soc_update_bits(codec, AIC32X4_BCLKN, | 549 | AIC32X4_BCLKEN, AIC32X4_BCLKEN); |
556 | AIC32X4_BCLKEN, AIC32X4_BCLKEN); | ||
557 | } | ||
558 | break; | 550 | break; |
559 | case SND_SOC_BIAS_PREPARE: | 551 | case SND_SOC_BIAS_PREPARE: |
560 | break; | 552 | break; |
561 | case SND_SOC_BIAS_STANDBY: | 553 | case SND_SOC_BIAS_STANDBY: |
562 | if (aic32x4->master) { | 554 | /* Switch off PLL */ |
563 | /* Switch off PLL */ | 555 | snd_soc_update_bits(codec, AIC32X4_PLLPR, |
564 | snd_soc_update_bits(codec, AIC32X4_PLLPR, | 556 | AIC32X4_PLLEN, 0); |
565 | AIC32X4_PLLEN, 0); | 557 | |
566 | 558 | /* Switch off NDAC Divider */ | |
567 | /* Switch off NDAC Divider */ | 559 | snd_soc_update_bits(codec, AIC32X4_NDAC, |
568 | snd_soc_update_bits(codec, AIC32X4_NDAC, | 560 | AIC32X4_NDACEN, 0); |
569 | AIC32X4_NDACEN, 0); | 561 | |
570 | 562 | /* Switch off MDAC Divider */ | |
571 | /* Switch off MDAC Divider */ | 563 | snd_soc_update_bits(codec, AIC32X4_MDAC, |
572 | snd_soc_update_bits(codec, AIC32X4_MDAC, | 564 | AIC32X4_MDACEN, 0); |
573 | AIC32X4_MDACEN, 0); | 565 | |
574 | 566 | /* Switch off NADC Divider */ | |
575 | /* Switch off NADC Divider */ | 567 | snd_soc_update_bits(codec, AIC32X4_NADC, |
576 | snd_soc_update_bits(codec, AIC32X4_NADC, | 568 | AIC32X4_NADCEN, 0); |
577 | AIC32X4_NADCEN, 0); | 569 | |
578 | 570 | /* Switch off MADC Divider */ | |
579 | /* Switch off MADC Divider */ | 571 | snd_soc_update_bits(codec, AIC32X4_MADC, |
580 | snd_soc_update_bits(codec, AIC32X4_MADC, | 572 | AIC32X4_MADCEN, 0); |
581 | AIC32X4_MADCEN, 0); | 573 | |
582 | 574 | /* Switch off BCLK_N Divider */ | |
583 | /* Switch off BCLK_N Divider */ | 575 | snd_soc_update_bits(codec, AIC32X4_BCLKN, |
584 | snd_soc_update_bits(codec, AIC32X4_BCLKN, | 576 | AIC32X4_BCLKEN, 0); |
585 | AIC32X4_BCLKEN, 0); | ||
586 | } | ||
587 | break; | 577 | break; |
588 | case SND_SOC_BIAS_OFF: | 578 | case SND_SOC_BIAS_OFF: |
589 | break; | 579 | break; |
@@ -651,9 +641,11 @@ static int aic32x4_probe(struct snd_soc_codec *codec) | |||
651 | if (aic32x4->power_cfg & AIC32X4_PWR_AVDD_DVDD_WEAK_DISABLE) { | 641 | if (aic32x4->power_cfg & AIC32X4_PWR_AVDD_DVDD_WEAK_DISABLE) { |
652 | snd_soc_write(codec, AIC32X4_PWRCFG, AIC32X4_AVDDWEAKDISABLE); | 642 | snd_soc_write(codec, AIC32X4_PWRCFG, AIC32X4_AVDDWEAKDISABLE); |
653 | } | 643 | } |
654 | if (aic32x4->power_cfg & AIC32X4_PWR_AIC32X4_LDO_ENABLE) { | 644 | |
655 | snd_soc_write(codec, AIC32X4_LDOCTL, AIC32X4_LDOCTLEN); | 645 | tmp_reg = (aic32x4->power_cfg & AIC32X4_PWR_AIC32X4_LDO_ENABLE) ? |
656 | } | 646 | AIC32X4_LDOCTLEN : 0; |
647 | snd_soc_write(codec, AIC32X4_LDOCTL, tmp_reg); | ||
648 | |||
657 | tmp_reg = snd_soc_read(codec, AIC32X4_CMMODE); | 649 | tmp_reg = snd_soc_read(codec, AIC32X4_CMMODE); |
658 | if (aic32x4->power_cfg & AIC32X4_PWR_CMMODE_LDOIN_RANGE_18_36) { | 650 | if (aic32x4->power_cfg & AIC32X4_PWR_CMMODE_LDOIN_RANGE_18_36) { |
659 | tmp_reg |= AIC32X4_LDOIN_18_36; | 651 | tmp_reg |= AIC32X4_LDOIN_18_36; |
diff --git a/sound/soc/codecs/wm2000.c b/sound/soc/codecs/wm2000.c index c2880907fced..a75c3766aede 100644 --- a/sound/soc/codecs/wm2000.c +++ b/sound/soc/codecs/wm2000.c | |||
@@ -733,8 +733,9 @@ static int __devinit wm2000_i2c_probe(struct i2c_client *i2c, | |||
733 | struct wm2000_priv *wm2000; | 733 | struct wm2000_priv *wm2000; |
734 | struct wm2000_platform_data *pdata; | 734 | struct wm2000_platform_data *pdata; |
735 | const char *filename; | 735 | const char *filename; |
736 | const struct firmware *fw; | 736 | const struct firmware *fw = NULL; |
737 | int reg, ret; | 737 | int ret; |
738 | int reg; | ||
738 | u16 id; | 739 | u16 id; |
739 | 740 | ||
740 | wm2000 = devm_kzalloc(&i2c->dev, sizeof(struct wm2000_priv), | 741 | wm2000 = devm_kzalloc(&i2c->dev, sizeof(struct wm2000_priv), |
@@ -751,7 +752,7 @@ static int __devinit wm2000_i2c_probe(struct i2c_client *i2c, | |||
751 | ret = PTR_ERR(wm2000->regmap); | 752 | ret = PTR_ERR(wm2000->regmap); |
752 | dev_err(&i2c->dev, "Failed to allocate register map: %d\n", | 753 | dev_err(&i2c->dev, "Failed to allocate register map: %d\n", |
753 | ret); | 754 | ret); |
754 | goto err; | 755 | goto out; |
755 | } | 756 | } |
756 | 757 | ||
757 | /* Verify that this is a WM2000 */ | 758 | /* Verify that this is a WM2000 */ |
@@ -763,7 +764,7 @@ static int __devinit wm2000_i2c_probe(struct i2c_client *i2c, | |||
763 | if (id != 0x2000) { | 764 | if (id != 0x2000) { |
764 | dev_err(&i2c->dev, "Device is not a WM2000 - ID %x\n", id); | 765 | dev_err(&i2c->dev, "Device is not a WM2000 - ID %x\n", id); |
765 | ret = -ENODEV; | 766 | ret = -ENODEV; |
766 | goto err_regmap; | 767 | goto out_regmap_exit; |
767 | } | 768 | } |
768 | 769 | ||
769 | reg = wm2000_read(i2c, WM2000_REG_REVISON); | 770 | reg = wm2000_read(i2c, WM2000_REG_REVISON); |
@@ -782,7 +783,7 @@ static int __devinit wm2000_i2c_probe(struct i2c_client *i2c, | |||
782 | ret = request_firmware(&fw, filename, &i2c->dev); | 783 | ret = request_firmware(&fw, filename, &i2c->dev); |
783 | if (ret != 0) { | 784 | if (ret != 0) { |
784 | dev_err(&i2c->dev, "Failed to acquire ANC data: %d\n", ret); | 785 | dev_err(&i2c->dev, "Failed to acquire ANC data: %d\n", ret); |
785 | goto err_regmap; | 786 | goto out_regmap_exit; |
786 | } | 787 | } |
787 | 788 | ||
788 | /* Pre-cook the concatenation of the register address onto the image */ | 789 | /* Pre-cook the concatenation of the register address onto the image */ |
@@ -793,15 +794,13 @@ static int __devinit wm2000_i2c_probe(struct i2c_client *i2c, | |||
793 | if (wm2000->anc_download == NULL) { | 794 | if (wm2000->anc_download == NULL) { |
794 | dev_err(&i2c->dev, "Out of memory\n"); | 795 | dev_err(&i2c->dev, "Out of memory\n"); |
795 | ret = -ENOMEM; | 796 | ret = -ENOMEM; |
796 | goto err_fw; | 797 | goto out_regmap_exit; |
797 | } | 798 | } |
798 | 799 | ||
799 | wm2000->anc_download[0] = 0x80; | 800 | wm2000->anc_download[0] = 0x80; |
800 | wm2000->anc_download[1] = 0x00; | 801 | wm2000->anc_download[1] = 0x00; |
801 | memcpy(wm2000->anc_download + 2, fw->data, fw->size); | 802 | memcpy(wm2000->anc_download + 2, fw->data, fw->size); |
802 | 803 | ||
803 | release_firmware(fw); | ||
804 | |||
805 | wm2000->anc_eng_ena = 1; | 804 | wm2000->anc_eng_ena = 1; |
806 | wm2000->anc_active = 1; | 805 | wm2000->anc_active = 1; |
807 | wm2000->spk_ena = 1; | 806 | wm2000->spk_ena = 1; |
@@ -809,18 +808,14 @@ static int __devinit wm2000_i2c_probe(struct i2c_client *i2c, | |||
809 | 808 | ||
810 | wm2000_reset(wm2000); | 809 | wm2000_reset(wm2000); |
811 | 810 | ||
812 | ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_wm2000, | 811 | ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_wm2000, NULL, 0); |
813 | NULL, 0); | 812 | if (!ret) |
814 | if (ret != 0) | 813 | goto out; |
815 | goto err_fw; | ||
816 | 814 | ||
817 | return 0; | 815 | out_regmap_exit: |
818 | |||
819 | err_fw: | ||
820 | release_firmware(fw); | ||
821 | err_regmap: | ||
822 | regmap_exit(wm2000->regmap); | 816 | regmap_exit(wm2000->regmap); |
823 | err: | 817 | out: |
818 | release_firmware(fw); | ||
824 | return ret; | 819 | return ret; |
825 | } | 820 | } |
826 | 821 | ||
diff --git a/sound/soc/codecs/wm5100.c b/sound/soc/codecs/wm5100.c index 8b24323d6b2c..66f0611e68b6 100644 --- a/sound/soc/codecs/wm5100.c +++ b/sound/soc/codecs/wm5100.c | |||
@@ -1377,6 +1377,7 @@ static int wm5100_set_bias_level(struct snd_soc_codec *codec, | |||
1377 | 1377 | ||
1378 | switch (wm5100->rev) { | 1378 | switch (wm5100->rev) { |
1379 | case 0: | 1379 | case 0: |
1380 | regcache_cache_bypass(wm5100->regmap, true); | ||
1380 | snd_soc_write(codec, 0x11, 0x3); | 1381 | snd_soc_write(codec, 0x11, 0x3); |
1381 | snd_soc_write(codec, 0x203, 0xc); | 1382 | snd_soc_write(codec, 0x203, 0xc); |
1382 | snd_soc_write(codec, 0x206, 0); | 1383 | snd_soc_write(codec, 0x206, 0); |
@@ -1392,6 +1393,7 @@ static int wm5100_set_bias_level(struct snd_soc_codec *codec, | |||
1392 | snd_soc_write(codec, | 1393 | snd_soc_write(codec, |
1393 | wm5100_reva_patches[i].reg, | 1394 | wm5100_reva_patches[i].reg, |
1394 | wm5100_reva_patches[i].val); | 1395 | wm5100_reva_patches[i].val); |
1396 | regcache_cache_bypass(wm5100->regmap, false); | ||
1395 | break; | 1397 | break; |
1396 | default: | 1398 | default: |
1397 | break; | 1399 | break; |
@@ -1402,6 +1404,7 @@ static int wm5100_set_bias_level(struct snd_soc_codec *codec, | |||
1402 | break; | 1404 | break; |
1403 | 1405 | ||
1404 | case SND_SOC_BIAS_OFF: | 1406 | case SND_SOC_BIAS_OFF: |
1407 | regcache_cache_only(wm5100->regmap, true); | ||
1405 | if (wm5100->pdata.ldo_ena) | 1408 | if (wm5100->pdata.ldo_ena) |
1406 | gpio_set_value_cansleep(wm5100->pdata.ldo_ena, 0); | 1409 | gpio_set_value_cansleep(wm5100->pdata.ldo_ena, 0); |
1407 | regulator_bulk_disable(ARRAY_SIZE(wm5100->core_supplies), | 1410 | regulator_bulk_disable(ARRAY_SIZE(wm5100->core_supplies), |
diff --git a/sound/soc/codecs/wm8958-dsp2.c b/sound/soc/codecs/wm8958-dsp2.c index 8d4ea43d40a3..40ac888faf3d 100644 --- a/sound/soc/codecs/wm8958-dsp2.c +++ b/sound/soc/codecs/wm8958-dsp2.c | |||
@@ -55,7 +55,7 @@ static int wm8958_dsp2_fw(struct snd_soc_codec *codec, const char *name, | |||
55 | return 0; | 55 | return 0; |
56 | 56 | ||
57 | if (fw->size < 32) { | 57 | if (fw->size < 32) { |
58 | dev_err(codec->dev, "%s: firmware too short (%d bytes)\n", | 58 | dev_err(codec->dev, "%s: firmware too short (%zd bytes)\n", |
59 | name, fw->size); | 59 | name, fw->size); |
60 | goto err; | 60 | goto err; |
61 | } | 61 | } |
diff --git a/sound/soc/codecs/wm8996.c b/sound/soc/codecs/wm8996.c index d8da10fe5b52..13aa2bdaa7d7 100644 --- a/sound/soc/codecs/wm8996.c +++ b/sound/soc/codecs/wm8996.c | |||
@@ -1120,7 +1120,8 @@ SND_SOC_DAPM_SUPPLY_S("SYSCLK", 1, WM8996_AIF_CLOCKING_1, 0, 0, NULL, 0), | |||
1120 | SND_SOC_DAPM_SUPPLY_S("SYSDSPCLK", 2, WM8996_CLOCKING_1, 1, 0, NULL, 0), | 1120 | SND_SOC_DAPM_SUPPLY_S("SYSDSPCLK", 2, WM8996_CLOCKING_1, 1, 0, NULL, 0), |
1121 | SND_SOC_DAPM_SUPPLY_S("AIFCLK", 2, WM8996_CLOCKING_1, 2, 0, NULL, 0), | 1121 | SND_SOC_DAPM_SUPPLY_S("AIFCLK", 2, WM8996_CLOCKING_1, 2, 0, NULL, 0), |
1122 | SND_SOC_DAPM_SUPPLY_S("Charge Pump", 2, WM8996_CHARGE_PUMP_1, 15, 0, cp_event, | 1122 | SND_SOC_DAPM_SUPPLY_S("Charge Pump", 2, WM8996_CHARGE_PUMP_1, 15, 0, cp_event, |
1123 | SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), | 1123 | SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | |
1124 | SND_SOC_DAPM_POST_PMD), | ||
1124 | SND_SOC_DAPM_SUPPLY("Bandgap", SND_SOC_NOPM, 0, 0, bg_event, | 1125 | SND_SOC_DAPM_SUPPLY("Bandgap", SND_SOC_NOPM, 0, 0, bg_event, |
1125 | SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), | 1126 | SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), |
1126 | SND_SOC_DAPM_SUPPLY("LDO2", WM8996_POWER_MANAGEMENT_2, 1, 0, NULL, 0), | 1127 | SND_SOC_DAPM_SUPPLY("LDO2", WM8996_POWER_MANAGEMENT_2, 1, 0, NULL, 0), |
@@ -2007,6 +2008,7 @@ static int wm8996_set_sysclk(struct snd_soc_dai *dai, | |||
2007 | struct wm8996_priv *wm8996 = snd_soc_codec_get_drvdata(codec); | 2008 | struct wm8996_priv *wm8996 = snd_soc_codec_get_drvdata(codec); |
2008 | int lfclk = 0; | 2009 | int lfclk = 0; |
2009 | int ratediv = 0; | 2010 | int ratediv = 0; |
2011 | int sync = WM8996_REG_SYNC; | ||
2010 | int src; | 2012 | int src; |
2011 | int old; | 2013 | int old; |
2012 | 2014 | ||
@@ -2051,6 +2053,7 @@ static int wm8996_set_sysclk(struct snd_soc_dai *dai, | |||
2051 | case 32000: | 2053 | case 32000: |
2052 | case 32768: | 2054 | case 32768: |
2053 | lfclk = WM8996_LFCLK_ENA; | 2055 | lfclk = WM8996_LFCLK_ENA; |
2056 | sync = 0; | ||
2054 | break; | 2057 | break; |
2055 | default: | 2058 | default: |
2056 | dev_warn(codec->dev, "Unsupported clock rate %dHz\n", | 2059 | dev_warn(codec->dev, "Unsupported clock rate %dHz\n", |
@@ -2064,6 +2067,8 @@ static int wm8996_set_sysclk(struct snd_soc_dai *dai, | |||
2064 | WM8996_SYSCLK_SRC_MASK | WM8996_SYSCLK_DIV_MASK, | 2067 | WM8996_SYSCLK_SRC_MASK | WM8996_SYSCLK_DIV_MASK, |
2065 | src << WM8996_SYSCLK_SRC_SHIFT | ratediv); | 2068 | src << WM8996_SYSCLK_SRC_SHIFT | ratediv); |
2066 | snd_soc_update_bits(codec, WM8996_CLOCKING_1, WM8996_LFCLK_ENA, lfclk); | 2069 | snd_soc_update_bits(codec, WM8996_CLOCKING_1, WM8996_LFCLK_ENA, lfclk); |
2070 | snd_soc_update_bits(codec, WM8996_CONTROL_INTERFACE_1, | ||
2071 | WM8996_REG_SYNC, sync); | ||
2067 | snd_soc_update_bits(codec, WM8996_AIF_CLOCKING_1, | 2072 | snd_soc_update_bits(codec, WM8996_AIF_CLOCKING_1, |
2068 | WM8996_SYSCLK_ENA, old); | 2073 | WM8996_SYSCLK_ENA, old); |
2069 | 2074 | ||
diff --git a/sound/soc/codecs/wm8996.h b/sound/soc/codecs/wm8996.h index 0fde643194ce..de9ac3e44aec 100644 --- a/sound/soc/codecs/wm8996.h +++ b/sound/soc/codecs/wm8996.h | |||
@@ -1567,6 +1567,10 @@ int wm8996_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack, | |||
1567 | /* | 1567 | /* |
1568 | * R257 (0x101) - Control Interface (1) | 1568 | * R257 (0x101) - Control Interface (1) |
1569 | */ | 1569 | */ |
1570 | #define WM8996_REG_SYNC 0x8000 /* REG_SYNC */ | ||
1571 | #define WM8996_REG_SYNC_MASK 0x8000 /* REG_SYNC */ | ||
1572 | #define WM8996_REG_SYNC_SHIFT 15 /* REG_SYNC */ | ||
1573 | #define WM8996_REG_SYNC_WIDTH 1 /* REG_SYNC */ | ||
1570 | #define WM8996_AUTO_INC 0x0004 /* AUTO_INC */ | 1574 | #define WM8996_AUTO_INC 0x0004 /* AUTO_INC */ |
1571 | #define WM8996_AUTO_INC_MASK 0x0004 /* AUTO_INC */ | 1575 | #define WM8996_AUTO_INC_MASK 0x0004 /* AUTO_INC */ |
1572 | #define WM8996_AUTO_INC_SHIFT 2 /* AUTO_INC */ | 1576 | #define WM8996_AUTO_INC_SHIFT 2 /* AUTO_INC */ |
diff --git a/sound/soc/mxs/mxs-saif.c b/sound/soc/mxs/mxs-saif.c index dccfb37a9626..f204dbac11d4 100644 --- a/sound/soc/mxs/mxs-saif.c +++ b/sound/soc/mxs/mxs-saif.c | |||
@@ -124,6 +124,8 @@ static int mxs_saif_set_clk(struct mxs_saif *saif, | |||
124 | * | 124 | * |
125 | * If MCLK is not used, we just set saif clk to 512*fs. | 125 | * If MCLK is not used, we just set saif clk to 512*fs. |
126 | */ | 126 | */ |
127 | clk_prepare_enable(master_saif->clk); | ||
128 | |||
127 | if (master_saif->mclk_in_use) { | 129 | if (master_saif->mclk_in_use) { |
128 | if (mclk % 32 == 0) { | 130 | if (mclk % 32 == 0) { |
129 | scr &= ~BM_SAIF_CTRL_BITCLK_BASE_RATE; | 131 | scr &= ~BM_SAIF_CTRL_BITCLK_BASE_RATE; |
@@ -133,6 +135,7 @@ static int mxs_saif_set_clk(struct mxs_saif *saif, | |||
133 | ret = clk_set_rate(master_saif->clk, 384 * rate); | 135 | ret = clk_set_rate(master_saif->clk, 384 * rate); |
134 | } else { | 136 | } else { |
135 | /* SAIF MCLK should be either 32x or 48x */ | 137 | /* SAIF MCLK should be either 32x or 48x */ |
138 | clk_disable_unprepare(master_saif->clk); | ||
136 | return -EINVAL; | 139 | return -EINVAL; |
137 | } | 140 | } |
138 | } else { | 141 | } else { |
@@ -140,6 +143,8 @@ static int mxs_saif_set_clk(struct mxs_saif *saif, | |||
140 | scr &= ~BM_SAIF_CTRL_BITCLK_BASE_RATE; | 143 | scr &= ~BM_SAIF_CTRL_BITCLK_BASE_RATE; |
141 | } | 144 | } |
142 | 145 | ||
146 | clk_disable_unprepare(master_saif->clk); | ||
147 | |||
143 | if (ret) | 148 | if (ret) |
144 | return ret; | 149 | return ret; |
145 | 150 | ||