diff options
author | Arnd Bergmann <arnd@arndb.de> | 2012-02-13 00:50:07 -0500 |
---|---|---|
committer | Arnd Bergmann <arnd@arndb.de> | 2012-02-13 00:50:26 -0500 |
commit | ffafe770a4160862476405a442d28ee48d2249ef (patch) | |
tree | 5bb7d5913427c245c61dd5eb384321dff386f841 | |
parent | 0dcd627896fb87b2e78a1ed78e469591208cffcd (diff) | |
parent | da911782be4c82dc1222aa0cb5bef28605d1e117 (diff) |
Merge branch 'v3.3-samsung-fixes-3' of git://git.kernel.org/pub/scm/linux/kernel/git/kgene/linux-samsung into fixes
* 'v3.3-samsung-fixes-3' of git://git.kernel.org/pub/scm/linux/kernel/git/kgene/linux-samsung: (2 commits)
ARM: EXYNOS: Add cpu-offset property in gic device tree node
ARM: EXYNOS: Bring exynos4-dt up to date
Linux 3.3-rc3
This includes an update to the v3.3-rc3 release from v3.3-rc2
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
378 files changed, 2974 insertions, 5492 deletions
diff --git a/Documentation/DocBook/device-drivers.tmpl b/Documentation/DocBook/device-drivers.tmpl index 2f7fd4360848..9c27e5125dd2 100644 --- a/Documentation/DocBook/device-drivers.tmpl +++ b/Documentation/DocBook/device-drivers.tmpl | |||
@@ -102,9 +102,12 @@ X!Iinclude/linux/kobject.h | |||
102 | !Iinclude/linux/device.h | 102 | !Iinclude/linux/device.h |
103 | </sect1> | 103 | </sect1> |
104 | <sect1><title>Device Drivers Base</title> | 104 | <sect1><title>Device Drivers Base</title> |
105 | !Idrivers/base/init.c | ||
105 | !Edrivers/base/driver.c | 106 | !Edrivers/base/driver.c |
106 | !Edrivers/base/core.c | 107 | !Edrivers/base/core.c |
108 | !Edrivers/base/syscore.c | ||
107 | !Edrivers/base/class.c | 109 | !Edrivers/base/class.c |
110 | !Idrivers/base/node.c | ||
108 | !Edrivers/base/firmware_class.c | 111 | !Edrivers/base/firmware_class.c |
109 | !Edrivers/base/transport_class.c | 112 | !Edrivers/base/transport_class.c |
110 | <!-- Cannot be included, because | 113 | <!-- Cannot be included, because |
@@ -113,7 +116,7 @@ X!Iinclude/linux/kobject.h | |||
113 | exceed allowed 44 characters maximum | 116 | exceed allowed 44 characters maximum |
114 | X!Edrivers/base/attribute_container.c | 117 | X!Edrivers/base/attribute_container.c |
115 | --> | 118 | --> |
116 | !Edrivers/base/sys.c | 119 | !Edrivers/base/dd.c |
117 | <!-- | 120 | <!-- |
118 | X!Edrivers/base/interface.c | 121 | X!Edrivers/base/interface.c |
119 | --> | 122 | --> |
@@ -121,6 +124,11 @@ X!Edrivers/base/interface.c | |||
121 | !Edrivers/base/platform.c | 124 | !Edrivers/base/platform.c |
122 | !Edrivers/base/bus.c | 125 | !Edrivers/base/bus.c |
123 | </sect1> | 126 | </sect1> |
127 | <sect1><title>Device Drivers DMA Management</title> | ||
128 | !Edrivers/base/dma-buf.c | ||
129 | !Edrivers/base/dma-coherent.c | ||
130 | !Edrivers/base/dma-mapping.c | ||
131 | </sect1> | ||
124 | <sect1><title>Device Drivers Power Management</title> | 132 | <sect1><title>Device Drivers Power Management</title> |
125 | !Edrivers/base/power/main.c | 133 | !Edrivers/base/power/main.c |
126 | </sect1> | 134 | </sect1> |
@@ -219,7 +227,7 @@ X!Isound/sound_firmware.c | |||
219 | <chapter id="uart16x50"> | 227 | <chapter id="uart16x50"> |
220 | <title>16x50 UART Driver</title> | 228 | <title>16x50 UART Driver</title> |
221 | !Edrivers/tty/serial/serial_core.c | 229 | !Edrivers/tty/serial/serial_core.c |
222 | !Edrivers/tty/serial/8250.c | 230 | !Edrivers/tty/serial/8250/8250.c |
223 | </chapter> | 231 | </chapter> |
224 | 232 | ||
225 | <chapter id="fbdev"> | 233 | <chapter id="fbdev"> |
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/input/event-codes.txt b/Documentation/input/event-codes.txt index 23fcb05175be..53305bd08182 100644 --- a/Documentation/input/event-codes.txt +++ b/Documentation/input/event-codes.txt | |||
@@ -17,11 +17,11 @@ reports supported by a device are also provided by sysfs in | |||
17 | class/input/event*/device/capabilities/, and the properties of a device are | 17 | class/input/event*/device/capabilities/, and the properties of a device are |
18 | provided in class/input/event*/device/properties. | 18 | provided in class/input/event*/device/properties. |
19 | 19 | ||
20 | Types: | 20 | Event types: |
21 | ========== | 21 | =========== |
22 | Types are groupings of codes under a logical input construct. Each type has a | 22 | Event types are groupings of codes under a logical input construct. Each |
23 | set of applicable codes to be used in generating events. See the Codes section | 23 | type has a set of applicable codes to be used in generating events. See the |
24 | for details on valid codes for each type. | 24 | Codes section for details on valid codes for each type. |
25 | 25 | ||
26 | * EV_SYN: | 26 | * EV_SYN: |
27 | - Used as markers to separate events. Events may be separated in time or in | 27 | - Used as markers to separate events. Events may be separated in time or in |
@@ -63,9 +63,9 @@ for details on valid codes for each type. | |||
63 | * EV_FF_STATUS: | 63 | * EV_FF_STATUS: |
64 | - Used to receive force feedback device status. | 64 | - Used to receive force feedback device status. |
65 | 65 | ||
66 | Codes: | 66 | Event codes: |
67 | ========== | 67 | =========== |
68 | Codes define the precise type of event. | 68 | Event codes define the precise type of event. |
69 | 69 | ||
70 | EV_SYN: | 70 | EV_SYN: |
71 | ---------- | 71 | ---------- |
@@ -220,6 +220,56 @@ EV_PWR: | |||
220 | EV_PWR events are a special type of event used specifically for power | 220 | EV_PWR events are a special type of event used specifically for power |
221 | mangement. Its usage is not well defined. To be addressed later. | 221 | mangement. Its usage is not well defined. To be addressed later. |
222 | 222 | ||
223 | Device properties: | ||
224 | ================= | ||
225 | Normally, userspace sets up an input device based on the data it emits, | ||
226 | i.e., the event types. In the case of two devices emitting the same event | ||
227 | types, additional information can be provided in the form of device | ||
228 | properties. | ||
229 | |||
230 | INPUT_PROP_DIRECT + INPUT_PROP_POINTER: | ||
231 | -------------------------------------- | ||
232 | The INPUT_PROP_DIRECT property indicates that device coordinates should be | ||
233 | directly mapped to screen coordinates (not taking into account trivial | ||
234 | transformations, such as scaling, flipping and rotating). Non-direct input | ||
235 | devices require non-trivial transformation, such as absolute to relative | ||
236 | transformation for touchpads. Typical direct input devices: touchscreens, | ||
237 | drawing tablets; non-direct devices: touchpads, mice. | ||
238 | |||
239 | The INPUT_PROP_POINTER property indicates that the device is not transposed | ||
240 | on the screen and thus requires use of an on-screen pointer to trace user's | ||
241 | movements. Typical pointer devices: touchpads, tablets, mice; non-pointer | ||
242 | device: touchscreen. | ||
243 | |||
244 | If neither INPUT_PROP_DIRECT or INPUT_PROP_POINTER are set, the property is | ||
245 | considered undefined and the device type should be deduced in the | ||
246 | traditional way, using emitted event types. | ||
247 | |||
248 | INPUT_PROP_BUTTONPAD: | ||
249 | -------------------- | ||
250 | For touchpads where the button is placed beneath the surface, such that | ||
251 | pressing down on the pad causes a button click, this property should be | ||
252 | set. Common in clickpad notebooks and macbooks from 2009 and onwards. | ||
253 | |||
254 | Originally, the buttonpad property was coded into the bcm5974 driver | ||
255 | version field under the name integrated button. For backwards | ||
256 | compatibility, both methods need to be checked in userspace. | ||
257 | |||
258 | INPUT_PROP_SEMI_MT: | ||
259 | ------------------ | ||
260 | Some touchpads, most common between 2008 and 2011, can detect the presence | ||
261 | of multiple contacts without resolving the individual positions; only the | ||
262 | number of contacts and a rectangular shape is known. For such | ||
263 | touchpads, the semi-mt property should be set. | ||
264 | |||
265 | Depending on the device, the rectangle may enclose all touches, like a | ||
266 | bounding box, or just some of them, for instance the two most recent | ||
267 | touches. The diversity makes the rectangle of limited use, but some | ||
268 | gestures can normally be extracted from it. | ||
269 | |||
270 | If INPUT_PROP_SEMI_MT is not set, the device is assumed to be a true MT | ||
271 | device. | ||
272 | |||
223 | Guidelines: | 273 | Guidelines: |
224 | ========== | 274 | ========== |
225 | The guidelines below ensure proper single-touch and multi-finger functionality. | 275 | The guidelines below ensure proper single-touch and multi-finger functionality. |
@@ -240,6 +290,8 @@ used to report when a touch is active on the screen. | |||
240 | BTN_{MOUSE,LEFT,MIDDLE,RIGHT} must not be reported as the result of touch | 290 | BTN_{MOUSE,LEFT,MIDDLE,RIGHT} must not be reported as the result of touch |
241 | contact. BTN_TOOL_<name> events should be reported where possible. | 291 | contact. BTN_TOOL_<name> events should be reported where possible. |
242 | 292 | ||
293 | For new hardware, INPUT_PROP_DIRECT should be set. | ||
294 | |||
243 | Trackpads: | 295 | Trackpads: |
244 | ---------- | 296 | ---------- |
245 | Legacy trackpads that only provide relative position information must report | 297 | Legacy trackpads that only provide relative position information must report |
@@ -250,6 +302,8 @@ location of the touch. BTN_TOUCH should be used to report when a touch is active | |||
250 | on the trackpad. Where multi-finger support is available, BTN_TOOL_<name> should | 302 | on the trackpad. Where multi-finger support is available, BTN_TOOL_<name> should |
251 | be used to report the number of touches active on the trackpad. | 303 | be used to report the number of touches active on the trackpad. |
252 | 304 | ||
305 | For new hardware, INPUT_PROP_POINTER should be set. | ||
306 | |||
253 | Tablets: | 307 | Tablets: |
254 | ---------- | 308 | ---------- |
255 | BTN_TOOL_<name> events must be reported when a stylus or other tool is active on | 309 | BTN_TOOL_<name> events must be reported when a stylus or other tool is active on |
@@ -260,3 +314,5 @@ button may be used for buttons on the tablet except BTN_{MOUSE,LEFT}. | |||
260 | BTN_{0,1,2,etc} are good generic codes for unlabeled buttons. Do not use | 314 | BTN_{0,1,2,etc} are good generic codes for unlabeled buttons. Do not use |
261 | meaningful buttons, like BTN_FORWARD, unless the button is labeled for that | 315 | meaningful buttons, like BTN_FORWARD, unless the button is labeled for that |
262 | purpose on the device. | 316 | purpose on the device. |
317 | |||
318 | For new hardware, both INPUT_PROP_DIRECT and INPUT_PROP_POINTER should be set. | ||
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/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/sysctl/kernel.txt b/Documentation/sysctl/kernel.txt index 8c20fbd8b42d..6d78841fd416 100644 --- a/Documentation/sysctl/kernel.txt +++ b/Documentation/sysctl/kernel.txt | |||
@@ -601,6 +601,8 @@ can be ORed together: | |||
601 | instead of using the one provided by the hardware. | 601 | instead of using the one provided by the hardware. |
602 | 512 - A kernel warning has occurred. | 602 | 512 - A kernel warning has occurred. |
603 | 1024 - A module from drivers/staging was loaded. | 603 | 1024 - A module from drivers/staging was loaded. |
604 | 2048 - The system is working around a severe firmware bug. | ||
605 | 4096 - An out-of-tree module has been loaded. | ||
604 | 606 | ||
605 | ============================================================== | 607 | ============================================================== |
606 | 608 | ||
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 1b6e83550c76..55ca0bea142c 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -159,7 +159,7 @@ S: Maintained | |||
159 | F: drivers/net/ethernet/realtek/r8169.c | 159 | F: drivers/net/ethernet/realtek/r8169.c |
160 | 160 | ||
161 | 8250/16?50 (AND CLONE UARTS) SERIAL DRIVER | 161 | 8250/16?50 (AND CLONE UARTS) SERIAL DRIVER |
162 | M: Greg Kroah-Hartman <gregkh@suse.de> | 162 | M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
163 | L: linux-serial@vger.kernel.org | 163 | L: linux-serial@vger.kernel.org |
164 | W: http://serial.sourceforge.net | 164 | W: http://serial.sourceforge.net |
165 | S: Maintained | 165 | S: Maintained |
@@ -789,12 +789,6 @@ F: arch/arm/mach-mx*/ | |||
789 | F: arch/arm/mach-imx/ | 789 | F: arch/arm/mach-imx/ |
790 | F: arch/arm/plat-mxc/ | 790 | F: arch/arm/plat-mxc/ |
791 | 791 | ||
792 | ARM/FREESCALE IMX51 | ||
793 | M: Amit Kucheria <amit.kucheria@canonical.com> | ||
794 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | ||
795 | S: Maintained | ||
796 | F: arch/arm/mach-mx5/ | ||
797 | |||
798 | ARM/FREESCALE IMX6 | 792 | ARM/FREESCALE IMX6 |
799 | M: Shawn Guo <shawn.guo@linaro.org> | 793 | M: Shawn Guo <shawn.guo@linaro.org> |
800 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 794 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
@@ -1783,9 +1777,9 @@ X: net/wireless/wext* | |||
1783 | 1777 | ||
1784 | CHAR and MISC DRIVERS | 1778 | CHAR and MISC DRIVERS |
1785 | M: Arnd Bergmann <arnd@arndb.de> | 1779 | M: Arnd Bergmann <arnd@arndb.de> |
1786 | M: Greg Kroah-Hartman <greg@kroah.com> | 1780 | M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
1787 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git | 1781 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git |
1788 | S: Maintained | 1782 | S: Supported |
1789 | F: drivers/char/* | 1783 | F: drivers/char/* |
1790 | F: drivers/misc/* | 1784 | F: drivers/misc/* |
1791 | 1785 | ||
@@ -2287,7 +2281,7 @@ F: drivers/acpi/dock.c | |||
2287 | DOCUMENTATION | 2281 | DOCUMENTATION |
2288 | M: Randy Dunlap <rdunlap@xenotime.net> | 2282 | M: Randy Dunlap <rdunlap@xenotime.net> |
2289 | L: linux-doc@vger.kernel.org | 2283 | L: linux-doc@vger.kernel.org |
2290 | T: quilt http://userweb.kernel.org/~rdunlap/kernel-doc-patches/current/ | 2284 | T: quilt http://xenotime.net/kernel-doc-patches/current/ |
2291 | S: Maintained | 2285 | S: Maintained |
2292 | F: Documentation/ | 2286 | F: Documentation/ |
2293 | 2287 | ||
@@ -2320,7 +2314,7 @@ F: lib/lru_cache.c | |||
2320 | F: Documentation/blockdev/drbd/ | 2314 | F: Documentation/blockdev/drbd/ |
2321 | 2315 | ||
2322 | DRIVER CORE, KOBJECTS, DEBUGFS AND SYSFS | 2316 | DRIVER CORE, KOBJECTS, DEBUGFS AND SYSFS |
2323 | M: Greg Kroah-Hartman <gregkh@suse.de> | 2317 | M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
2324 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core-2.6.git | 2318 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core-2.6.git |
2325 | S: Supported | 2319 | S: Supported |
2326 | F: Documentation/kobject.txt | 2320 | F: Documentation/kobject.txt |
@@ -3992,11 +3986,11 @@ M: Rusty Russell <rusty@rustcorp.com.au> | |||
3992 | L: lguest@lists.ozlabs.org | 3986 | L: lguest@lists.ozlabs.org |
3993 | W: http://lguest.ozlabs.org/ | 3987 | W: http://lguest.ozlabs.org/ |
3994 | S: Odd Fixes | 3988 | S: Odd Fixes |
3995 | F: Documentation/virtual/lguest/ | 3989 | F: arch/x86/include/asm/lguest*.h |
3996 | F: arch/x86/lguest/ | 3990 | F: arch/x86/lguest/ |
3997 | F: drivers/lguest/ | 3991 | F: drivers/lguest/ |
3998 | F: include/linux/lguest*.h | 3992 | F: include/linux/lguest*.h |
3999 | F: arch/x86/include/asm/lguest*.h | 3993 | F: tools/lguest/ |
4000 | 3994 | ||
4001 | LINUX FOR IBM pSERIES (RS/6000) | 3995 | LINUX FOR IBM pSERIES (RS/6000) |
4002 | M: Paul Mackerras <paulus@au.ibm.com> | 3996 | M: Paul Mackerras <paulus@au.ibm.com> |
@@ -4136,10 +4130,11 @@ L: linux-ntfs-dev@lists.sourceforge.net | |||
4136 | W: http://www.linux-ntfs.org/content/view/19/37/ | 4130 | W: http://www.linux-ntfs.org/content/view/19/37/ |
4137 | S: Maintained | 4131 | S: Maintained |
4138 | F: Documentation/ldm.txt | 4132 | F: Documentation/ldm.txt |
4139 | F: fs/partitions/ldm.* | 4133 | F: block/partitions/ldm.* |
4140 | 4134 | ||
4141 | LogFS | 4135 | LogFS |
4142 | M: Joern Engel <joern@logfs.org> | 4136 | M: Joern Engel <joern@logfs.org> |
4137 | M: Prasad Joshi <prasadjoshi.linux@gmail.com> | ||
4143 | L: logfs@logfs.org | 4138 | L: logfs@logfs.org |
4144 | W: logfs.org | 4139 | W: logfs.org |
4145 | S: Maintained | 4140 | S: Maintained |
@@ -4281,13 +4276,6 @@ S: Orphan | |||
4281 | F: drivers/video/matrox/matroxfb_* | 4276 | F: drivers/video/matrox/matroxfb_* |
4282 | F: include/linux/matroxfb.h | 4277 | F: include/linux/matroxfb.h |
4283 | 4278 | ||
4284 | MAX1668 TEMPERATURE SENSOR DRIVER | ||
4285 | M: "David George" <david.george@ska.ac.za> | ||
4286 | L: lm-sensors@lm-sensors.org | ||
4287 | S: Maintained | ||
4288 | F: Documentation/hwmon/max1668 | ||
4289 | F: drivers/hwmon/max1668.c | ||
4290 | |||
4291 | MAX6650 HARDWARE MONITOR AND FAN CONTROLLER DRIVER | 4279 | MAX6650 HARDWARE MONITOR AND FAN CONTROLLER DRIVER |
4292 | M: "Hans J. Koch" <hjk@hansjkoch.de> | 4280 | M: "Hans J. Koch" <hjk@hansjkoch.de> |
4293 | L: lm-sensors@lm-sensors.org | 4281 | L: lm-sensors@lm-sensors.org |
@@ -5639,7 +5627,7 @@ W: http://www.ibm.com/developerworks/linux/linux390/ | |||
5639 | S: Supported | 5627 | S: Supported |
5640 | F: arch/s390/ | 5628 | F: arch/s390/ |
5641 | F: drivers/s390/ | 5629 | F: drivers/s390/ |
5642 | F: fs/partitions/ibm.c | 5630 | F: block/partitions/ibm.c |
5643 | F: Documentation/s390/ | 5631 | F: Documentation/s390/ |
5644 | F: Documentation/DocBook/s390* | 5632 | F: Documentation/DocBook/s390* |
5645 | 5633 | ||
@@ -6282,15 +6270,15 @@ S: Maintained | |||
6282 | F: arch/alpha/kernel/srm_env.c | 6270 | F: arch/alpha/kernel/srm_env.c |
6283 | 6271 | ||
6284 | STABLE BRANCH | 6272 | STABLE BRANCH |
6285 | M: Greg Kroah-Hartman <greg@kroah.com> | 6273 | M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
6286 | L: stable@vger.kernel.org | 6274 | L: stable@vger.kernel.org |
6287 | S: Maintained | 6275 | S: Supported |
6288 | 6276 | ||
6289 | STAGING SUBSYSTEM | 6277 | STAGING SUBSYSTEM |
6290 | M: Greg Kroah-Hartman <gregkh@suse.de> | 6278 | M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
6291 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git | 6279 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git |
6292 | L: devel@driverdev.osuosl.org | 6280 | L: devel@driverdev.osuosl.org |
6293 | S: Maintained | 6281 | S: Supported |
6294 | F: drivers/staging/ | 6282 | F: drivers/staging/ |
6295 | 6283 | ||
6296 | STAGING - AGERE HERMES II and II.5 WIRELESS DRIVERS | 6284 | STAGING - AGERE HERMES II and II.5 WIRELESS DRIVERS |
@@ -6402,11 +6390,6 @@ M: Omar Ramirez Luna <omar.ramirez@ti.com> | |||
6402 | S: Odd Fixes | 6390 | S: Odd Fixes |
6403 | F: drivers/staging/tidspbridge/ | 6391 | F: drivers/staging/tidspbridge/ |
6404 | 6392 | ||
6405 | STAGING - TRIDENT TVMASTER TMxxxx USB VIDEO CAPTURE DRIVERS | ||
6406 | L: linux-media@vger.kernel.org | ||
6407 | S: Odd Fixes | ||
6408 | F: drivers/staging/tm6000/ | ||
6409 | |||
6410 | STAGING - USB ENE SM/MS CARD READER DRIVER | 6393 | STAGING - USB ENE SM/MS CARD READER DRIVER |
6411 | M: Al Cho <acho@novell.com> | 6394 | M: Al Cho <acho@novell.com> |
6412 | S: Odd Fixes | 6395 | S: Odd Fixes |
@@ -6675,10 +6658,10 @@ S: Maintained | |||
6675 | K: ^Subject:.*(?i)trivial | 6658 | K: ^Subject:.*(?i)trivial |
6676 | 6659 | ||
6677 | TTY LAYER | 6660 | TTY LAYER |
6678 | M: Greg Kroah-Hartman <gregkh@suse.de> | 6661 | M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
6679 | S: Maintained | 6662 | S: Supported |
6680 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty-2.6.git | 6663 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty-2.6.git |
6681 | F: drivers/tty/* | 6664 | F: drivers/tty/ |
6682 | F: drivers/tty/serial/serial_core.c | 6665 | F: drivers/tty/serial/serial_core.c |
6683 | F: include/linux/serial_core.h | 6666 | F: include/linux/serial_core.h |
6684 | F: include/linux/serial.h | 6667 | F: include/linux/serial.h |
@@ -6964,7 +6947,7 @@ S: Maintained | |||
6964 | F: drivers/usb/serial/digi_acceleport.c | 6947 | F: drivers/usb/serial/digi_acceleport.c |
6965 | 6948 | ||
6966 | USB SERIAL DRIVER | 6949 | USB SERIAL DRIVER |
6967 | M: Greg Kroah-Hartman <gregkh@suse.de> | 6950 | M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
6968 | L: linux-usb@vger.kernel.org | 6951 | L: linux-usb@vger.kernel.org |
6969 | S: Supported | 6952 | S: Supported |
6970 | F: Documentation/usb/usb-serial.txt | 6953 | F: Documentation/usb/usb-serial.txt |
@@ -6979,9 +6962,8 @@ S: Maintained | |||
6979 | F: drivers/usb/serial/empeg.c | 6962 | F: drivers/usb/serial/empeg.c |
6980 | 6963 | ||
6981 | USB SERIAL KEYSPAN DRIVER | 6964 | USB SERIAL KEYSPAN DRIVER |
6982 | M: Greg Kroah-Hartman <greg@kroah.com> | 6965 | M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
6983 | L: linux-usb@vger.kernel.org | 6966 | L: linux-usb@vger.kernel.org |
6984 | W: http://www.kroah.com/linux/ | ||
6985 | S: Maintained | 6967 | S: Maintained |
6986 | F: drivers/usb/serial/*keyspan* | 6968 | F: drivers/usb/serial/*keyspan* |
6987 | 6969 | ||
@@ -7009,7 +6991,7 @@ F: Documentation/video4linux/sn9c102.txt | |||
7009 | F: drivers/media/video/sn9c102/ | 6991 | F: drivers/media/video/sn9c102/ |
7010 | 6992 | ||
7011 | USB SUBSYSTEM | 6993 | USB SUBSYSTEM |
7012 | M: Greg Kroah-Hartman <gregkh@suse.de> | 6994 | M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
7013 | L: linux-usb@vger.kernel.org | 6995 | L: linux-usb@vger.kernel.org |
7014 | W: http://www.linux-usb.org | 6996 | W: http://www.linux-usb.org |
7015 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6.git | 6997 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6.git |
@@ -7096,7 +7078,7 @@ F: fs/hppfs/ | |||
7096 | 7078 | ||
7097 | USERSPACE I/O (UIO) | 7079 | USERSPACE I/O (UIO) |
7098 | M: "Hans J. Koch" <hjk@hansjkoch.de> | 7080 | M: "Hans J. Koch" <hjk@hansjkoch.de> |
7099 | M: Greg Kroah-Hartman <gregkh@suse.de> | 7081 | M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
7100 | S: Maintained | 7082 | S: Maintained |
7101 | F: Documentation/DocBook/uio-howto.tmpl | 7083 | F: Documentation/DocBook/uio-howto.tmpl |
7102 | F: drivers/uio/ | 7084 | F: drivers/uio/ |
@@ -7371,6 +7353,7 @@ S: Supported | |||
7371 | F: Documentation/hwmon/wm83?? | 7353 | F: Documentation/hwmon/wm83?? |
7372 | F: arch/arm/mach-s3c64xx/mach-crag6410* | 7354 | F: arch/arm/mach-s3c64xx/mach-crag6410* |
7373 | F: drivers/leds/leds-wm83*.c | 7355 | F: drivers/leds/leds-wm83*.c |
7356 | F: drivers/hwmon/wm83??-hwmon.c | ||
7374 | F: drivers/input/misc/wm831x-on.c | 7357 | F: drivers/input/misc/wm831x-on.c |
7375 | F: drivers/input/touchscreen/wm831x-ts.c | 7358 | F: drivers/input/touchscreen/wm831x-ts.c |
7376 | F: drivers/input/touchscreen/wm97*.c | 7359 | 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 = -rc3 |
5 | NAME = Saber-toothed Squirrel | 5 | NAME = Saber-toothed Squirrel |
6 | 6 | ||
7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
diff --git a/arch/arm/boot/dts/exynos4210.dtsi b/arch/arm/boot/dts/exynos4210.dtsi index 63d7578856c1..a1dd2ee83753 100644 --- a/arch/arm/boot/dts/exynos4210.dtsi +++ b/arch/arm/boot/dts/exynos4210.dtsi | |||
@@ -29,6 +29,7 @@ | |||
29 | compatible = "arm,cortex-a9-gic"; | 29 | compatible = "arm,cortex-a9-gic"; |
30 | #interrupt-cells = <3>; | 30 | #interrupt-cells = <3>; |
31 | interrupt-controller; | 31 | interrupt-controller; |
32 | cpu-offset = <0x8000>; | ||
32 | reg = <0x10490000 0x1000>, <0x10480000 0x100>; | 33 | reg = <0x10490000 0x1000>, <0x10480000 0x100>; |
33 | }; | 34 | }; |
34 | 35 | ||
diff --git a/arch/arm/include/asm/tlb.h b/arch/arm/include/asm/tlb.h index 5d3ed7e38561..314d4664eae7 100644 --- a/arch/arm/include/asm/tlb.h +++ b/arch/arm/include/asm/tlb.h | |||
@@ -198,7 +198,15 @@ static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte, | |||
198 | unsigned long addr) | 198 | unsigned long addr) |
199 | { | 199 | { |
200 | pgtable_page_dtor(pte); | 200 | pgtable_page_dtor(pte); |
201 | tlb_add_flush(tlb, addr); | 201 | |
202 | /* | ||
203 | * With the classic ARM MMU, a pte page has two corresponding pmd | ||
204 | * entries, each covering 1MB. | ||
205 | */ | ||
206 | addr &= PMD_MASK; | ||
207 | tlb_add_flush(tlb, addr + SZ_1M - PAGE_SIZE); | ||
208 | tlb_add_flush(tlb, addr + SZ_1M); | ||
209 | |||
202 | tlb_remove_page(tlb, pte); | 210 | tlb_remove_page(tlb, pte); |
203 | } | 211 | } |
204 | 212 | ||
diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S index 3a456c6c7005..be16a48007b4 100644 --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S | |||
@@ -790,7 +790,7 @@ __kuser_cmpxchg64: @ 0xffff0f60 | |||
790 | smp_dmb arm | 790 | smp_dmb arm |
791 | rsbs r0, r3, #0 @ set returned val and C flag | 791 | rsbs r0, r3, #0 @ set returned val and C flag |
792 | ldmfd sp!, {r4, r5, r6, r7} | 792 | ldmfd sp!, {r4, r5, r6, r7} |
793 | bx lr | 793 | usr_ret lr |
794 | 794 | ||
795 | #elif !defined(CONFIG_SMP) | 795 | #elif !defined(CONFIG_SMP) |
796 | 796 | ||
diff --git a/arch/arm/kernel/perf_event_v7.c b/arch/arm/kernel/perf_event_v7.c index 460bbbb6b885..6933244c68f9 100644 --- a/arch/arm/kernel/perf_event_v7.c +++ b/arch/arm/kernel/perf_event_v7.c | |||
@@ -469,6 +469,20 @@ static const unsigned armv7_a5_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
469 | [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, | 469 | [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, |
470 | }, | 470 | }, |
471 | }, | 471 | }, |
472 | [C(NODE)] = { | ||
473 | [C(OP_READ)] = { | ||
474 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | ||
475 | [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, | ||
476 | }, | ||
477 | [C(OP_WRITE)] = { | ||
478 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | ||
479 | [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, | ||
480 | }, | ||
481 | [C(OP_PREFETCH)] = { | ||
482 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | ||
483 | [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, | ||
484 | }, | ||
485 | }, | ||
472 | }; | 486 | }; |
473 | 487 | ||
474 | /* | 488 | /* |
@@ -579,6 +593,20 @@ static const unsigned armv7_a15_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
579 | [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, | 593 | [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, |
580 | }, | 594 | }, |
581 | }, | 595 | }, |
596 | [C(NODE)] = { | ||
597 | [C(OP_READ)] = { | ||
598 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | ||
599 | [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, | ||
600 | }, | ||
601 | [C(OP_WRITE)] = { | ||
602 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | ||
603 | [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, | ||
604 | }, | ||
605 | [C(OP_PREFETCH)] = { | ||
606 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | ||
607 | [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, | ||
608 | }, | ||
609 | }, | ||
582 | }; | 610 | }; |
583 | 611 | ||
584 | /* | 612 | /* |
diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c index e1d5e1929fbd..e33870ff0ac0 100644 --- a/arch/arm/kernel/ptrace.c +++ b/arch/arm/kernel/ptrace.c | |||
@@ -699,10 +699,13 @@ static int vfp_set(struct task_struct *target, | |||
699 | { | 699 | { |
700 | int ret; | 700 | int ret; |
701 | struct thread_info *thread = task_thread_info(target); | 701 | struct thread_info *thread = task_thread_info(target); |
702 | struct vfp_hard_struct new_vfp = thread->vfpstate.hard; | 702 | struct vfp_hard_struct new_vfp; |
703 | const size_t user_fpregs_offset = offsetof(struct user_vfp, fpregs); | 703 | const size_t user_fpregs_offset = offsetof(struct user_vfp, fpregs); |
704 | const size_t user_fpscr_offset = offsetof(struct user_vfp, fpscr); | 704 | const size_t user_fpscr_offset = offsetof(struct user_vfp, fpscr); |
705 | 705 | ||
706 | vfp_sync_hwstate(thread); | ||
707 | new_vfp = thread->vfpstate.hard; | ||
708 | |||
706 | ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, | 709 | ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, |
707 | &new_vfp.fpregs, | 710 | &new_vfp.fpregs, |
708 | user_fpregs_offset, | 711 | user_fpregs_offset, |
@@ -723,9 +726,8 @@ static int vfp_set(struct task_struct *target, | |||
723 | if (ret) | 726 | if (ret) |
724 | return ret; | 727 | return ret; |
725 | 728 | ||
726 | vfp_sync_hwstate(thread); | ||
727 | thread->vfpstate.hard = new_vfp; | ||
728 | vfp_flush_hwstate(thread); | 729 | vfp_flush_hwstate(thread); |
730 | thread->vfpstate.hard = new_vfp; | ||
729 | 731 | ||
730 | return 0; | 732 | return 0; |
731 | } | 733 | } |
diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c index 0340224cf73c..9e617bd4a146 100644 --- a/arch/arm/kernel/signal.c +++ b/arch/arm/kernel/signal.c | |||
@@ -227,6 +227,8 @@ static int restore_vfp_context(struct vfp_sigframe __user *frame) | |||
227 | if (magic != VFP_MAGIC || size != VFP_STORAGE_SIZE) | 227 | if (magic != VFP_MAGIC || size != VFP_STORAGE_SIZE) |
228 | return -EINVAL; | 228 | return -EINVAL; |
229 | 229 | ||
230 | vfp_flush_hwstate(thread); | ||
231 | |||
230 | /* | 232 | /* |
231 | * Copy the floating point registers. There can be unused | 233 | * Copy the floating point registers. There can be unused |
232 | * registers see asm/hwcap.h for details. | 234 | * registers see asm/hwcap.h for details. |
@@ -251,9 +253,6 @@ static int restore_vfp_context(struct vfp_sigframe __user *frame) | |||
251 | __get_user_error(h->fpinst, &frame->ufp_exc.fpinst, err); | 253 | __get_user_error(h->fpinst, &frame->ufp_exc.fpinst, err); |
252 | __get_user_error(h->fpinst2, &frame->ufp_exc.fpinst2, err); | 254 | __get_user_error(h->fpinst2, &frame->ufp_exc.fpinst2, err); |
253 | 255 | ||
254 | if (!err) | ||
255 | vfp_flush_hwstate(thread); | ||
256 | |||
257 | return err ? -EFAULT : 0; | 256 | return err ? -EFAULT : 0; |
258 | } | 257 | } |
259 | 258 | ||
diff --git a/arch/arm/mach-exynos/mach-exynos4-dt.c b/arch/arm/mach-exynos/mach-exynos4-dt.c index 85fa02767d67..e6b02fdf1b09 100644 --- a/arch/arm/mach-exynos/mach-exynos4-dt.c +++ b/arch/arm/mach-exynos/mach-exynos4-dt.c | |||
@@ -15,11 +15,13 @@ | |||
15 | #include <linux/serial_core.h> | 15 | #include <linux/serial_core.h> |
16 | 16 | ||
17 | #include <asm/mach/arch.h> | 17 | #include <asm/mach/arch.h> |
18 | #include <asm/hardware/gic.h> | ||
18 | #include <mach/map.h> | 19 | #include <mach/map.h> |
19 | 20 | ||
20 | #include <plat/cpu.h> | 21 | #include <plat/cpu.h> |
21 | #include <plat/regs-serial.h> | 22 | #include <plat/regs-serial.h> |
22 | #include <plat/exynos4.h> | 23 | |
24 | #include "common.h" | ||
23 | 25 | ||
24 | /* | 26 | /* |
25 | * The following lookup table is used to override device names when devices | 27 | * The following lookup table is used to override device names when devices |
@@ -60,7 +62,7 @@ static const struct of_dev_auxdata exynos4210_auxdata_lookup[] __initconst = { | |||
60 | 62 | ||
61 | static void __init exynos4210_dt_map_io(void) | 63 | static void __init exynos4210_dt_map_io(void) |
62 | { | 64 | { |
63 | s5p_init_io(NULL, 0, S5P_VA_CHIPID); | 65 | exynos_init_io(NULL, 0); |
64 | s3c24xx_init_clocks(24000000); | 66 | s3c24xx_init_clocks(24000000); |
65 | } | 67 | } |
66 | 68 | ||
@@ -79,7 +81,9 @@ DT_MACHINE_START(EXYNOS4210_DT, "Samsung Exynos4 (Flattened Device Tree)") | |||
79 | /* Maintainer: Thomas Abraham <thomas.abraham@linaro.org> */ | 81 | /* Maintainer: Thomas Abraham <thomas.abraham@linaro.org> */ |
80 | .init_irq = exynos4_init_irq, | 82 | .init_irq = exynos4_init_irq, |
81 | .map_io = exynos4210_dt_map_io, | 83 | .map_io = exynos4210_dt_map_io, |
84 | .handle_irq = gic_handle_irq, | ||
82 | .init_machine = exynos4210_dt_machine_init, | 85 | .init_machine = exynos4210_dt_machine_init, |
83 | .timer = &exynos4_timer, | 86 | .timer = &exynos4_timer, |
84 | .dt_compat = exynos4210_dt_compat, | 87 | .dt_compat = exynos4210_dt_compat, |
88 | .restart = exynos4_restart, | ||
85 | MACHINE_END | 89 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c index 39fba9df17fb..21fc87648660 100644 --- a/arch/arm/mach-omap2/board-4430sdp.c +++ b/arch/arm/mach-omap2/board-4430sdp.c | |||
@@ -52,8 +52,9 @@ | |||
52 | #define ETH_KS8851_QUART 138 | 52 | #define ETH_KS8851_QUART 138 |
53 | #define OMAP4_SFH7741_SENSOR_OUTPUT_GPIO 184 | 53 | #define OMAP4_SFH7741_SENSOR_OUTPUT_GPIO 184 |
54 | #define OMAP4_SFH7741_ENABLE_GPIO 188 | 54 | #define OMAP4_SFH7741_ENABLE_GPIO 188 |
55 | #define HDMI_GPIO_HPD 60 /* Hot plug pin for HDMI */ | 55 | #define HDMI_GPIO_CT_CP_HPD 60 /* HPD mode enable/disable */ |
56 | #define HDMI_GPIO_LS_OE 41 /* Level shifter for HDMI */ | 56 | #define HDMI_GPIO_LS_OE 41 /* Level shifter for HDMI */ |
57 | #define HDMI_GPIO_HPD 63 /* Hotplug detect */ | ||
57 | #define DISPLAY_SEL_GPIO 59 /* LCD2/PicoDLP switch */ | 58 | #define DISPLAY_SEL_GPIO 59 /* LCD2/PicoDLP switch */ |
58 | #define DLP_POWER_ON_GPIO 40 | 59 | #define DLP_POWER_ON_GPIO 40 |
59 | 60 | ||
@@ -603,8 +604,9 @@ static void __init omap_sfh7741prox_init(void) | |||
603 | } | 604 | } |
604 | 605 | ||
605 | static struct gpio sdp4430_hdmi_gpios[] = { | 606 | static struct gpio sdp4430_hdmi_gpios[] = { |
606 | { HDMI_GPIO_HPD, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_hpd" }, | 607 | { HDMI_GPIO_CT_CP_HPD, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_ct_cp_hpd" }, |
607 | { HDMI_GPIO_LS_OE, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_ls_oe" }, | 608 | { HDMI_GPIO_LS_OE, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_ls_oe" }, |
609 | { HDMI_GPIO_HPD, GPIOF_DIR_IN, "hdmi_gpio_hpd" }, | ||
608 | }; | 610 | }; |
609 | 611 | ||
610 | static int sdp4430_panel_enable_hdmi(struct omap_dss_device *dssdev) | 612 | static int sdp4430_panel_enable_hdmi(struct omap_dss_device *dssdev) |
@@ -621,8 +623,7 @@ static int sdp4430_panel_enable_hdmi(struct omap_dss_device *dssdev) | |||
621 | 623 | ||
622 | static void sdp4430_panel_disable_hdmi(struct omap_dss_device *dssdev) | 624 | static void sdp4430_panel_disable_hdmi(struct omap_dss_device *dssdev) |
623 | { | 625 | { |
624 | gpio_free(HDMI_GPIO_LS_OE); | 626 | gpio_free_array(sdp4430_hdmi_gpios, ARRAY_SIZE(sdp4430_hdmi_gpios)); |
625 | gpio_free(HDMI_GPIO_HPD); | ||
626 | } | 627 | } |
627 | 628 | ||
628 | static struct nokia_dsi_panel_data dsi1_panel = { | 629 | static struct nokia_dsi_panel_data dsi1_panel = { |
@@ -738,6 +739,10 @@ static void sdp4430_lcd_init(void) | |||
738 | pr_err("%s: Could not get lcd2_reset_gpio\n", __func__); | 739 | pr_err("%s: Could not get lcd2_reset_gpio\n", __func__); |
739 | } | 740 | } |
740 | 741 | ||
742 | static struct omap_dss_hdmi_data sdp4430_hdmi_data = { | ||
743 | .hpd_gpio = HDMI_GPIO_HPD, | ||
744 | }; | ||
745 | |||
741 | static struct omap_dss_device sdp4430_hdmi_device = { | 746 | static struct omap_dss_device sdp4430_hdmi_device = { |
742 | .name = "hdmi", | 747 | .name = "hdmi", |
743 | .driver_name = "hdmi_panel", | 748 | .driver_name = "hdmi_panel", |
@@ -745,6 +750,7 @@ static struct omap_dss_device sdp4430_hdmi_device = { | |||
745 | .platform_enable = sdp4430_panel_enable_hdmi, | 750 | .platform_enable = sdp4430_panel_enable_hdmi, |
746 | .platform_disable = sdp4430_panel_disable_hdmi, | 751 | .platform_disable = sdp4430_panel_disable_hdmi, |
747 | .channel = OMAP_DSS_CHANNEL_DIGIT, | 752 | .channel = OMAP_DSS_CHANNEL_DIGIT, |
753 | .data = &sdp4430_hdmi_data, | ||
748 | }; | 754 | }; |
749 | 755 | ||
750 | static struct picodlp_panel_data sdp4430_picodlp_pdata = { | 756 | static struct picodlp_panel_data sdp4430_picodlp_pdata = { |
@@ -829,6 +835,10 @@ static void omap_4430sdp_display_init(void) | |||
829 | omap_hdmi_init(OMAP_HDMI_SDA_SCL_EXTERNAL_PULLUP); | 835 | omap_hdmi_init(OMAP_HDMI_SDA_SCL_EXTERNAL_PULLUP); |
830 | else | 836 | else |
831 | omap_hdmi_init(0); | 837 | omap_hdmi_init(0); |
838 | |||
839 | omap_mux_init_gpio(HDMI_GPIO_LS_OE, OMAP_PIN_OUTPUT); | ||
840 | omap_mux_init_gpio(HDMI_GPIO_CT_CP_HPD, OMAP_PIN_OUTPUT); | ||
841 | omap_mux_init_gpio(HDMI_GPIO_HPD, OMAP_PIN_INPUT_PULLDOWN); | ||
832 | } | 842 | } |
833 | 843 | ||
834 | #ifdef CONFIG_OMAP_MUX | 844 | #ifdef CONFIG_OMAP_MUX |
diff --git a/arch/arm/mach-omap2/board-omap4panda.c b/arch/arm/mach-omap2/board-omap4panda.c index 30ad40db2cf3..b7779c206a90 100644 --- a/arch/arm/mach-omap2/board-omap4panda.c +++ b/arch/arm/mach-omap2/board-omap4panda.c | |||
@@ -51,8 +51,9 @@ | |||
51 | #define GPIO_HUB_NRESET 62 | 51 | #define GPIO_HUB_NRESET 62 |
52 | #define GPIO_WIFI_PMENA 43 | 52 | #define GPIO_WIFI_PMENA 43 |
53 | #define GPIO_WIFI_IRQ 53 | 53 | #define GPIO_WIFI_IRQ 53 |
54 | #define HDMI_GPIO_HPD 60 /* Hot plug pin for HDMI */ | 54 | #define HDMI_GPIO_CT_CP_HPD 60 /* HPD mode enable/disable */ |
55 | #define HDMI_GPIO_LS_OE 41 /* Level shifter for HDMI */ | 55 | #define HDMI_GPIO_LS_OE 41 /* Level shifter for HDMI */ |
56 | #define HDMI_GPIO_HPD 63 /* Hotplug detect */ | ||
56 | 57 | ||
57 | /* wl127x BT, FM, GPS connectivity chip */ | 58 | /* wl127x BT, FM, GPS connectivity chip */ |
58 | static int wl1271_gpios[] = {46, -1, -1}; | 59 | static int wl1271_gpios[] = {46, -1, -1}; |
@@ -413,8 +414,9 @@ int __init omap4_panda_dvi_init(void) | |||
413 | } | 414 | } |
414 | 415 | ||
415 | static struct gpio panda_hdmi_gpios[] = { | 416 | static struct gpio panda_hdmi_gpios[] = { |
416 | { HDMI_GPIO_HPD, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_hpd" }, | 417 | { HDMI_GPIO_CT_CP_HPD, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_ct_cp_hpd" }, |
417 | { HDMI_GPIO_LS_OE, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_ls_oe" }, | 418 | { HDMI_GPIO_LS_OE, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_ls_oe" }, |
419 | { HDMI_GPIO_HPD, GPIOF_DIR_IN, "hdmi_gpio_hpd" }, | ||
418 | }; | 420 | }; |
419 | 421 | ||
420 | static int omap4_panda_panel_enable_hdmi(struct omap_dss_device *dssdev) | 422 | static int omap4_panda_panel_enable_hdmi(struct omap_dss_device *dssdev) |
@@ -431,10 +433,13 @@ static int omap4_panda_panel_enable_hdmi(struct omap_dss_device *dssdev) | |||
431 | 433 | ||
432 | static void omap4_panda_panel_disable_hdmi(struct omap_dss_device *dssdev) | 434 | static void omap4_panda_panel_disable_hdmi(struct omap_dss_device *dssdev) |
433 | { | 435 | { |
434 | gpio_free(HDMI_GPIO_LS_OE); | 436 | gpio_free_array(panda_hdmi_gpios, ARRAY_SIZE(panda_hdmi_gpios)); |
435 | gpio_free(HDMI_GPIO_HPD); | ||
436 | } | 437 | } |
437 | 438 | ||
439 | static struct omap_dss_hdmi_data omap4_panda_hdmi_data = { | ||
440 | .hpd_gpio = HDMI_GPIO_HPD, | ||
441 | }; | ||
442 | |||
438 | static struct omap_dss_device omap4_panda_hdmi_device = { | 443 | static struct omap_dss_device omap4_panda_hdmi_device = { |
439 | .name = "hdmi", | 444 | .name = "hdmi", |
440 | .driver_name = "hdmi_panel", | 445 | .driver_name = "hdmi_panel", |
@@ -442,6 +447,7 @@ static struct omap_dss_device omap4_panda_hdmi_device = { | |||
442 | .platform_enable = omap4_panda_panel_enable_hdmi, | 447 | .platform_enable = omap4_panda_panel_enable_hdmi, |
443 | .platform_disable = omap4_panda_panel_disable_hdmi, | 448 | .platform_disable = omap4_panda_panel_disable_hdmi, |
444 | .channel = OMAP_DSS_CHANNEL_DIGIT, | 449 | .channel = OMAP_DSS_CHANNEL_DIGIT, |
450 | .data = &omap4_panda_hdmi_data, | ||
445 | }; | 451 | }; |
446 | 452 | ||
447 | static struct omap_dss_device *omap4_panda_dss_devices[] = { | 453 | static struct omap_dss_device *omap4_panda_dss_devices[] = { |
@@ -473,6 +479,10 @@ void omap4_panda_display_init(void) | |||
473 | omap_hdmi_init(OMAP_HDMI_SDA_SCL_EXTERNAL_PULLUP); | 479 | omap_hdmi_init(OMAP_HDMI_SDA_SCL_EXTERNAL_PULLUP); |
474 | else | 480 | else |
475 | omap_hdmi_init(0); | 481 | omap_hdmi_init(0); |
482 | |||
483 | omap_mux_init_gpio(HDMI_GPIO_LS_OE, OMAP_PIN_OUTPUT); | ||
484 | omap_mux_init_gpio(HDMI_GPIO_CT_CP_HPD, OMAP_PIN_OUTPUT); | ||
485 | omap_mux_init_gpio(HDMI_GPIO_HPD, OMAP_PIN_INPUT_PULLDOWN); | ||
476 | } | 486 | } |
477 | 487 | ||
478 | static void __init omap4_panda_init(void) | 488 | static void __init omap4_panda_init(void) |
diff --git a/arch/arm/mach-omap2/display.c b/arch/arm/mach-omap2/display.c index 3c446d1a1781..3677b1f58b85 100644 --- a/arch/arm/mach-omap2/display.c +++ b/arch/arm/mach-omap2/display.c | |||
@@ -103,12 +103,8 @@ static void omap4_hdmi_mux_pads(enum omap_hdmi_flags flags) | |||
103 | u32 reg; | 103 | u32 reg; |
104 | u16 control_i2c_1; | 104 | u16 control_i2c_1; |
105 | 105 | ||
106 | /* PAD0_HDMI_HPD_PAD1_HDMI_CEC */ | ||
107 | omap_mux_init_signal("hdmi_hpd", | ||
108 | OMAP_PIN_INPUT_PULLUP); | ||
109 | omap_mux_init_signal("hdmi_cec", | 106 | omap_mux_init_signal("hdmi_cec", |
110 | OMAP_PIN_INPUT_PULLUP); | 107 | OMAP_PIN_INPUT_PULLUP); |
111 | /* PAD0_HDMI_DDC_SCL_PAD1_HDMI_DDC_SDA */ | ||
112 | omap_mux_init_signal("hdmi_ddc_scl", | 108 | omap_mux_init_signal("hdmi_ddc_scl", |
113 | OMAP_PIN_INPUT_PULLUP); | 109 | OMAP_PIN_INPUT_PULLUP); |
114 | omap_mux_init_signal("hdmi_ddc_sda", | 110 | omap_mux_init_signal("hdmi_ddc_sda", |
diff --git a/arch/arm/mach-shmobile/setup-sh7372.c b/arch/arm/mach-shmobile/setup-sh7372.c index 6fcf304d3cdf..a83cf51fc099 100644 --- a/arch/arm/mach-shmobile/setup-sh7372.c +++ b/arch/arm/mach-shmobile/setup-sh7372.c | |||
@@ -662,6 +662,7 @@ static struct sh_dmae_pdata usb_dma0_platform_data = { | |||
662 | .dmaor_is_32bit = 1, | 662 | .dmaor_is_32bit = 1, |
663 | .needs_tend_set = 1, | 663 | .needs_tend_set = 1, |
664 | .no_dmars = 1, | 664 | .no_dmars = 1, |
665 | .slave_only = 1, | ||
665 | }; | 666 | }; |
666 | 667 | ||
667 | static struct resource sh7372_usb_dmae0_resources[] = { | 668 | static struct resource sh7372_usb_dmae0_resources[] = { |
@@ -723,6 +724,7 @@ static struct sh_dmae_pdata usb_dma1_platform_data = { | |||
723 | .dmaor_is_32bit = 1, | 724 | .dmaor_is_32bit = 1, |
724 | .needs_tend_set = 1, | 725 | .needs_tend_set = 1, |
725 | .no_dmars = 1, | 726 | .no_dmars = 1, |
727 | .slave_only = 1, | ||
726 | }; | 728 | }; |
727 | 729 | ||
728 | static struct resource sh7372_usb_dmae1_resources[] = { | 730 | static struct resource sh7372_usb_dmae1_resources[] = { |
diff --git a/arch/arm/mm/ioremap.c b/arch/arm/mm/ioremap.c index ba159370fa5f..80632e8d7538 100644 --- a/arch/arm/mm/ioremap.c +++ b/arch/arm/mm/ioremap.c | |||
@@ -225,8 +225,7 @@ 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) + offset + size-1 > | 228 | __pfn_to_phys(pfn) + size-1 > area->phys_addr + area->size-1) |
229 | area->phys_addr + area->size-1) | ||
230 | continue; | 229 | continue; |
231 | /* we can drop the lock here as we know *area is static */ | 230 | /* we can drop the lock here as we know *area is static */ |
232 | read_unlock(&vmlist_lock); | 231 | read_unlock(&vmlist_lock); |
diff --git a/arch/avr32/Kconfig b/arch/avr32/Kconfig index 197e96f70405..3dea7231f637 100644 --- a/arch/avr32/Kconfig +++ b/arch/avr32/Kconfig | |||
@@ -8,6 +8,7 @@ config AVR32 | |||
8 | select HAVE_KPROBES | 8 | select HAVE_KPROBES |
9 | select HAVE_GENERIC_HARDIRQS | 9 | select HAVE_GENERIC_HARDIRQS |
10 | select GENERIC_IRQ_PROBE | 10 | select GENERIC_IRQ_PROBE |
11 | select GENERIC_ATOMIC64 | ||
11 | select HARDIRQS_SW_RESEND | 12 | select HARDIRQS_SW_RESEND |
12 | select GENERIC_IRQ_SHOW | 13 | select GENERIC_IRQ_SHOW |
13 | select ARCH_HAVE_NMI_SAFE_CMPXCHG | 14 | select ARCH_HAVE_NMI_SAFE_CMPXCHG |
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/microblaze/kernel/setup.c b/arch/microblaze/kernel/setup.c index d4fc1a971779..604cd9dd1333 100644 --- a/arch/microblaze/kernel/setup.c +++ b/arch/microblaze/kernel/setup.c | |||
@@ -26,7 +26,6 @@ | |||
26 | #include <linux/cache.h> | 26 | #include <linux/cache.h> |
27 | #include <linux/of_platform.h> | 27 | #include <linux/of_platform.h> |
28 | #include <linux/dma-mapping.h> | 28 | #include <linux/dma-mapping.h> |
29 | #include <linux/cpu.h> | ||
30 | #include <asm/cacheflush.h> | 29 | #include <asm/cacheflush.h> |
31 | #include <asm/entry.h> | 30 | #include <asm/entry.h> |
32 | #include <asm/cpuinfo.h> | 31 | #include <asm/cpuinfo.h> |
@@ -227,23 +226,5 @@ static int __init setup_bus_notifier(void) | |||
227 | 226 | ||
228 | return 0; | 227 | return 0; |
229 | } | 228 | } |
230 | arch_initcall(setup_bus_notifier); | ||
231 | |||
232 | static DEFINE_PER_CPU(struct cpu, cpu_devices); | ||
233 | |||
234 | static int __init topology_init(void) | ||
235 | { | ||
236 | int i, ret; | ||
237 | |||
238 | for_each_present_cpu(i) { | ||
239 | struct cpu *c = &per_cpu(cpu_devices, i); | ||
240 | 229 | ||
241 | ret = register_cpu(c, i); | 230 | arch_initcall(setup_bus_notifier); |
242 | if (ret) | ||
243 | printk(KERN_WARNING "topology_init: register_cpu %d " | ||
244 | "failed (%d)\n", i, ret); | ||
245 | } | ||
246 | |||
247 | return 0; | ||
248 | } | ||
249 | subsys_initcall(topology_init); | ||
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index c4c1312473fb..5ab6e89603c5 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
@@ -2356,6 +2356,7 @@ config PCI | |||
2356 | depends on HW_HAS_PCI | 2356 | depends on HW_HAS_PCI |
2357 | select PCI_DOMAINS | 2357 | select PCI_DOMAINS |
2358 | select GENERIC_PCI_IOMAP | 2358 | select GENERIC_PCI_IOMAP |
2359 | select NO_GENERIC_PCI_IOPORT_MAP | ||
2359 | help | 2360 | help |
2360 | Find out whether you have a PCI motherboard. PCI is the name of a | 2361 | Find out whether you have a PCI motherboard. PCI is the name of a |
2361 | bus system, i.e. the way the CPU talks to the other stuff inside | 2362 | bus system, i.e. the way the CPU talks to the other stuff inside |
diff --git a/arch/mips/lib/iomap-pci.c b/arch/mips/lib/iomap-pci.c index 2635b1a96333..fd35daa45314 100644 --- a/arch/mips/lib/iomap-pci.c +++ b/arch/mips/lib/iomap-pci.c | |||
@@ -10,8 +10,8 @@ | |||
10 | #include <linux/module.h> | 10 | #include <linux/module.h> |
11 | #include <asm/io.h> | 11 | #include <asm/io.h> |
12 | 12 | ||
13 | static void __iomem *ioport_map_pci(struct pci_dev *dev, | 13 | void __iomem *__pci_ioport_map(struct pci_dev *dev, |
14 | unsigned long port, unsigned int nr) | 14 | unsigned long port, unsigned int nr) |
15 | { | 15 | { |
16 | struct pci_controller *ctrl = dev->bus->sysdata; | 16 | struct pci_controller *ctrl = dev->bus->sysdata; |
17 | unsigned long base = ctrl->io_map_base; | 17 | unsigned long base = ctrl->io_map_base; |
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/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/sh/Kconfig b/arch/sh/Kconfig index 3c8db65c89e5..713fb58ca507 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig | |||
@@ -859,6 +859,7 @@ config PCI | |||
859 | depends on SYS_SUPPORTS_PCI | 859 | depends on SYS_SUPPORTS_PCI |
860 | select PCI_DOMAINS | 860 | select PCI_DOMAINS |
861 | select GENERIC_PCI_IOMAP | 861 | select GENERIC_PCI_IOMAP |
862 | select NO_GENERIC_PCI_IOPORT_MAP | ||
862 | help | 863 | help |
863 | Find out whether you have a PCI motherboard. PCI is the name of a | 864 | Find out whether you have a PCI motherboard. PCI is the name of a |
864 | bus system, i.e. the way the CPU talks to the other stuff inside | 865 | bus system, i.e. the way the CPU talks to the other stuff inside |
diff --git a/arch/sh/drivers/pci/pci.c b/arch/sh/drivers/pci/pci.c index 8f18dd090a66..1e7b0e2e764d 100644 --- a/arch/sh/drivers/pci/pci.c +++ b/arch/sh/drivers/pci/pci.c | |||
@@ -356,8 +356,8 @@ int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, | |||
356 | 356 | ||
357 | #ifndef CONFIG_GENERIC_IOMAP | 357 | #ifndef CONFIG_GENERIC_IOMAP |
358 | 358 | ||
359 | static void __iomem *ioport_map_pci(struct pci_dev *dev, | 359 | void __iomem *__pci_ioport_map(struct pci_dev *dev, |
360 | unsigned long port, unsigned int nr) | 360 | unsigned long port, unsigned int nr) |
361 | { | 361 | { |
362 | struct pci_channel *chan = dev->sysdata; | 362 | struct pci_channel *chan = dev->sysdata; |
363 | 363 | ||
diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig index 96657992a72e..ca5580e4d813 100644 --- a/arch/sparc/Kconfig +++ b/arch/sparc/Kconfig | |||
@@ -33,6 +33,7 @@ config SPARC | |||
33 | config SPARC32 | 33 | config SPARC32 |
34 | def_bool !64BIT | 34 | def_bool !64BIT |
35 | select GENERIC_ATOMIC64 | 35 | select GENERIC_ATOMIC64 |
36 | select CLZ_TAB | ||
36 | 37 | ||
37 | config SPARC64 | 38 | config SPARC64 |
38 | def_bool 64BIT | 39 | def_bool 64BIT |
diff --git a/arch/sparc/lib/divdi3.S b/arch/sparc/lib/divdi3.S index 681b3683da9e..d74bc0925f2d 100644 --- a/arch/sparc/lib/divdi3.S +++ b/arch/sparc/lib/divdi3.S | |||
@@ -17,23 +17,9 @@ along with GNU CC; see the file COPYING. If not, write to | |||
17 | the Free Software Foundation, 59 Temple Place - Suite 330, | 17 | the Free Software Foundation, 59 Temple Place - Suite 330, |
18 | Boston, MA 02111-1307, USA. */ | 18 | Boston, MA 02111-1307, USA. */ |
19 | 19 | ||
20 | .data | ||
21 | .align 8 | ||
22 | .globl __clz_tab | ||
23 | __clz_tab: | ||
24 | .byte 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5 | ||
25 | .byte 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6 | ||
26 | .byte 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 | ||
27 | .byte 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 | ||
28 | .byte 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 | ||
29 | .byte 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 | ||
30 | .byte 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 | ||
31 | .byte 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 | ||
32 | .size __clz_tab,256 | ||
33 | .global .udiv | ||
34 | |||
35 | .text | 20 | .text |
36 | .align 4 | 21 | .align 4 |
22 | .global .udiv | ||
37 | .globl __divdi3 | 23 | .globl __divdi3 |
38 | __divdi3: | 24 | __divdi3: |
39 | save %sp,-104,%sp | 25 | save %sp,-104,%sp |
diff --git a/arch/x86/include/asm/cmpxchg.h b/arch/x86/include/asm/cmpxchg.h index 0c9fa2745f13..b3b733262909 100644 --- a/arch/x86/include/asm/cmpxchg.h +++ b/arch/x86/include/asm/cmpxchg.h | |||
@@ -145,13 +145,13 @@ extern void __add_wrong_size(void) | |||
145 | 145 | ||
146 | #ifdef __HAVE_ARCH_CMPXCHG | 146 | #ifdef __HAVE_ARCH_CMPXCHG |
147 | #define cmpxchg(ptr, old, new) \ | 147 | #define cmpxchg(ptr, old, new) \ |
148 | __cmpxchg((ptr), (old), (new), sizeof(*ptr)) | 148 | __cmpxchg(ptr, old, new, sizeof(*(ptr))) |
149 | 149 | ||
150 | #define sync_cmpxchg(ptr, old, new) \ | 150 | #define sync_cmpxchg(ptr, old, new) \ |
151 | __sync_cmpxchg((ptr), (old), (new), sizeof(*ptr)) | 151 | __sync_cmpxchg(ptr, old, new, sizeof(*(ptr))) |
152 | 152 | ||
153 | #define cmpxchg_local(ptr, old, new) \ | 153 | #define cmpxchg_local(ptr, old, new) \ |
154 | __cmpxchg_local((ptr), (old), (new), sizeof(*ptr)) | 154 | __cmpxchg_local(ptr, old, new, sizeof(*(ptr))) |
155 | #endif | 155 | #endif |
156 | 156 | ||
157 | /* | 157 | /* |
diff --git a/arch/x86/include/asm/kvm_emulate.h b/arch/x86/include/asm/kvm_emulate.h index ab4092e3214e..7b9cfc4878af 100644 --- a/arch/x86/include/asm/kvm_emulate.h +++ b/arch/x86/include/asm/kvm_emulate.h | |||
@@ -190,6 +190,9 @@ struct x86_emulate_ops { | |||
190 | int (*intercept)(struct x86_emulate_ctxt *ctxt, | 190 | int (*intercept)(struct x86_emulate_ctxt *ctxt, |
191 | struct x86_instruction_info *info, | 191 | struct x86_instruction_info *info, |
192 | enum x86_intercept_stage stage); | 192 | enum x86_intercept_stage stage); |
193 | |||
194 | bool (*get_cpuid)(struct x86_emulate_ctxt *ctxt, | ||
195 | u32 *eax, u32 *ebx, u32 *ecx, u32 *edx); | ||
193 | }; | 196 | }; |
194 | 197 | ||
195 | typedef u32 __attribute__((vector_size(16))) sse128_t; | 198 | typedef u32 __attribute__((vector_size(16))) sse128_t; |
@@ -298,6 +301,19 @@ struct x86_emulate_ctxt { | |||
298 | #define X86EMUL_MODE_PROT (X86EMUL_MODE_PROT16|X86EMUL_MODE_PROT32| \ | 301 | #define X86EMUL_MODE_PROT (X86EMUL_MODE_PROT16|X86EMUL_MODE_PROT32| \ |
299 | X86EMUL_MODE_PROT64) | 302 | X86EMUL_MODE_PROT64) |
300 | 303 | ||
304 | /* CPUID vendors */ | ||
305 | #define X86EMUL_CPUID_VENDOR_AuthenticAMD_ebx 0x68747541 | ||
306 | #define X86EMUL_CPUID_VENDOR_AuthenticAMD_ecx 0x444d4163 | ||
307 | #define X86EMUL_CPUID_VENDOR_AuthenticAMD_edx 0x69746e65 | ||
308 | |||
309 | #define X86EMUL_CPUID_VENDOR_AMDisbetterI_ebx 0x69444d41 | ||
310 | #define X86EMUL_CPUID_VENDOR_AMDisbetterI_ecx 0x21726574 | ||
311 | #define X86EMUL_CPUID_VENDOR_AMDisbetterI_edx 0x74656273 | ||
312 | |||
313 | #define X86EMUL_CPUID_VENDOR_GenuineIntel_ebx 0x756e6547 | ||
314 | #define X86EMUL_CPUID_VENDOR_GenuineIntel_ecx 0x6c65746e | ||
315 | #define X86EMUL_CPUID_VENDOR_GenuineIntel_edx 0x49656e69 | ||
316 | |||
301 | enum x86_intercept_stage { | 317 | enum x86_intercept_stage { |
302 | X86_ICTP_NONE = 0, /* Allow zero-init to not match anything */ | 318 | X86_ICTP_NONE = 0, /* Allow zero-init to not match anything */ |
303 | X86_ICPT_PRE_EXCEPT, | 319 | X86_ICPT_PRE_EXCEPT, |
diff --git a/arch/x86/kernel/dumpstack.c b/arch/x86/kernel/dumpstack.c index 1aae78f775fc..4025fe4f928f 100644 --- a/arch/x86/kernel/dumpstack.c +++ b/arch/x86/kernel/dumpstack.c | |||
@@ -252,7 +252,8 @@ int __kprobes __die(const char *str, struct pt_regs *regs, long err) | |||
252 | unsigned short ss; | 252 | unsigned short ss; |
253 | unsigned long sp; | 253 | unsigned long sp; |
254 | #endif | 254 | #endif |
255 | printk(KERN_EMERG "%s: %04lx [#%d] ", str, err & 0xffff, ++die_counter); | 255 | printk(KERN_DEFAULT |
256 | "%s: %04lx [#%d] ", str, err & 0xffff, ++die_counter); | ||
256 | #ifdef CONFIG_PREEMPT | 257 | #ifdef CONFIG_PREEMPT |
257 | printk("PREEMPT "); | 258 | printk("PREEMPT "); |
258 | #endif | 259 | #endif |
diff --git a/arch/x86/kernel/dumpstack_64.c b/arch/x86/kernel/dumpstack_64.c index 6d728d9284bd..17107bd6e1f0 100644 --- a/arch/x86/kernel/dumpstack_64.c +++ b/arch/x86/kernel/dumpstack_64.c | |||
@@ -129,7 +129,7 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs, | |||
129 | if (!stack) { | 129 | if (!stack) { |
130 | if (regs) | 130 | if (regs) |
131 | stack = (unsigned long *)regs->sp; | 131 | stack = (unsigned long *)regs->sp; |
132 | else if (task && task != current) | 132 | else if (task != current) |
133 | stack = (unsigned long *)task->thread.sp; | 133 | stack = (unsigned long *)task->thread.sp; |
134 | else | 134 | else |
135 | stack = &dummy; | 135 | stack = &dummy; |
@@ -269,11 +269,11 @@ void show_registers(struct pt_regs *regs) | |||
269 | unsigned char c; | 269 | unsigned char c; |
270 | u8 *ip; | 270 | u8 *ip; |
271 | 271 | ||
272 | printk(KERN_EMERG "Stack:\n"); | 272 | printk(KERN_DEFAULT "Stack:\n"); |
273 | show_stack_log_lvl(NULL, regs, (unsigned long *)sp, | 273 | show_stack_log_lvl(NULL, regs, (unsigned long *)sp, |
274 | 0, KERN_EMERG); | 274 | 0, KERN_DEFAULT); |
275 | 275 | ||
276 | printk(KERN_EMERG "Code: "); | 276 | printk(KERN_DEFAULT "Code: "); |
277 | 277 | ||
278 | ip = (u8 *)regs->ip - code_prologue; | 278 | ip = (u8 *)regs->ip - code_prologue; |
279 | if (ip < (u8 *)PAGE_OFFSET || probe_kernel_address(ip, c)) { | 279 | if (ip < (u8 *)PAGE_OFFSET || probe_kernel_address(ip, c)) { |
diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c index 37a458b521a6..d840e69a853c 100644 --- a/arch/x86/kernel/reboot.c +++ b/arch/x86/kernel/reboot.c | |||
@@ -39,6 +39,14 @@ static int reboot_mode; | |||
39 | enum reboot_type reboot_type = BOOT_ACPI; | 39 | enum reboot_type reboot_type = BOOT_ACPI; |
40 | int reboot_force; | 40 | int reboot_force; |
41 | 41 | ||
42 | /* This variable is used privately to keep track of whether or not | ||
43 | * reboot_type is still set to its default value (i.e., reboot= hasn't | ||
44 | * been set on the command line). This is needed so that we can | ||
45 | * suppress DMI scanning for reboot quirks. Without it, it's | ||
46 | * impossible to override a faulty reboot quirk without recompiling. | ||
47 | */ | ||
48 | static int reboot_default = 1; | ||
49 | |||
42 | #if defined(CONFIG_X86_32) && defined(CONFIG_SMP) | 50 | #if defined(CONFIG_X86_32) && defined(CONFIG_SMP) |
43 | static int reboot_cpu = -1; | 51 | static int reboot_cpu = -1; |
44 | #endif | 52 | #endif |
@@ -67,6 +75,12 @@ bool port_cf9_safe = false; | |||
67 | static int __init reboot_setup(char *str) | 75 | static int __init reboot_setup(char *str) |
68 | { | 76 | { |
69 | for (;;) { | 77 | for (;;) { |
78 | /* Having anything passed on the command line via | ||
79 | * reboot= will cause us to disable DMI checking | ||
80 | * below. | ||
81 | */ | ||
82 | reboot_default = 0; | ||
83 | |||
70 | switch (*str) { | 84 | switch (*str) { |
71 | case 'w': | 85 | case 'w': |
72 | reboot_mode = 0x1234; | 86 | reboot_mode = 0x1234; |
@@ -295,14 +309,6 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = { | |||
295 | DMI_MATCH(DMI_BOARD_NAME, "P4S800"), | 309 | DMI_MATCH(DMI_BOARD_NAME, "P4S800"), |
296 | }, | 310 | }, |
297 | }, | 311 | }, |
298 | { /* Handle problems with rebooting on VersaLogic Menlow boards */ | ||
299 | .callback = set_bios_reboot, | ||
300 | .ident = "VersaLogic Menlow based board", | ||
301 | .matches = { | ||
302 | DMI_MATCH(DMI_BOARD_VENDOR, "VersaLogic Corporation"), | ||
303 | DMI_MATCH(DMI_BOARD_NAME, "VersaLogic Menlow board"), | ||
304 | }, | ||
305 | }, | ||
306 | { /* Handle reboot issue on Acer Aspire one */ | 312 | { /* Handle reboot issue on Acer Aspire one */ |
307 | .callback = set_kbd_reboot, | 313 | .callback = set_kbd_reboot, |
308 | .ident = "Acer Aspire One A110", | 314 | .ident = "Acer Aspire One A110", |
@@ -316,7 +322,12 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = { | |||
316 | 322 | ||
317 | static int __init reboot_init(void) | 323 | static int __init reboot_init(void) |
318 | { | 324 | { |
319 | dmi_check_system(reboot_dmi_table); | 325 | /* Only do the DMI check if reboot_type hasn't been overridden |
326 | * on the command line | ||
327 | */ | ||
328 | if (reboot_default) { | ||
329 | dmi_check_system(reboot_dmi_table); | ||
330 | } | ||
320 | return 0; | 331 | return 0; |
321 | } | 332 | } |
322 | core_initcall(reboot_init); | 333 | core_initcall(reboot_init); |
@@ -465,7 +476,12 @@ static struct dmi_system_id __initdata pci_reboot_dmi_table[] = { | |||
465 | 476 | ||
466 | static int __init pci_reboot_init(void) | 477 | static int __init pci_reboot_init(void) |
467 | { | 478 | { |
468 | dmi_check_system(pci_reboot_dmi_table); | 479 | /* Only do the DMI check if reboot_type hasn't been overridden |
480 | * on the command line | ||
481 | */ | ||
482 | if (reboot_default) { | ||
483 | dmi_check_system(pci_reboot_dmi_table); | ||
484 | } | ||
469 | return 0; | 485 | return 0; |
470 | } | 486 | } |
471 | core_initcall(pci_reboot_init); | 487 | core_initcall(pci_reboot_init); |
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index 05a562b85025..0982507b962a 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c | |||
@@ -1891,6 +1891,51 @@ setup_syscalls_segments(struct x86_emulate_ctxt *ctxt, | |||
1891 | ss->p = 1; | 1891 | ss->p = 1; |
1892 | } | 1892 | } |
1893 | 1893 | ||
1894 | static bool em_syscall_is_enabled(struct x86_emulate_ctxt *ctxt) | ||
1895 | { | ||
1896 | struct x86_emulate_ops *ops = ctxt->ops; | ||
1897 | u32 eax, ebx, ecx, edx; | ||
1898 | |||
1899 | /* | ||
1900 | * syscall should always be enabled in longmode - so only become | ||
1901 | * vendor specific (cpuid) if other modes are active... | ||
1902 | */ | ||
1903 | if (ctxt->mode == X86EMUL_MODE_PROT64) | ||
1904 | return true; | ||
1905 | |||
1906 | eax = 0x00000000; | ||
1907 | ecx = 0x00000000; | ||
1908 | if (ops->get_cpuid(ctxt, &eax, &ebx, &ecx, &edx)) { | ||
1909 | /* | ||
1910 | * Intel ("GenuineIntel") | ||
1911 | * remark: Intel CPUs only support "syscall" in 64bit | ||
1912 | * longmode. Also an 64bit guest with a | ||
1913 | * 32bit compat-app running will #UD !! While this | ||
1914 | * behaviour can be fixed (by emulating) into AMD | ||
1915 | * response - CPUs of AMD can't behave like Intel. | ||
1916 | */ | ||
1917 | if (ebx == X86EMUL_CPUID_VENDOR_GenuineIntel_ebx && | ||
1918 | ecx == X86EMUL_CPUID_VENDOR_GenuineIntel_ecx && | ||
1919 | edx == X86EMUL_CPUID_VENDOR_GenuineIntel_edx) | ||
1920 | return false; | ||
1921 | |||
1922 | /* AMD ("AuthenticAMD") */ | ||
1923 | if (ebx == X86EMUL_CPUID_VENDOR_AuthenticAMD_ebx && | ||
1924 | ecx == X86EMUL_CPUID_VENDOR_AuthenticAMD_ecx && | ||
1925 | edx == X86EMUL_CPUID_VENDOR_AuthenticAMD_edx) | ||
1926 | return true; | ||
1927 | |||
1928 | /* AMD ("AMDisbetter!") */ | ||
1929 | if (ebx == X86EMUL_CPUID_VENDOR_AMDisbetterI_ebx && | ||
1930 | ecx == X86EMUL_CPUID_VENDOR_AMDisbetterI_ecx && | ||
1931 | edx == X86EMUL_CPUID_VENDOR_AMDisbetterI_edx) | ||
1932 | return true; | ||
1933 | } | ||
1934 | |||
1935 | /* default: (not Intel, not AMD), apply Intel's stricter rules... */ | ||
1936 | return false; | ||
1937 | } | ||
1938 | |||
1894 | static int em_syscall(struct x86_emulate_ctxt *ctxt) | 1939 | static int em_syscall(struct x86_emulate_ctxt *ctxt) |
1895 | { | 1940 | { |
1896 | struct x86_emulate_ops *ops = ctxt->ops; | 1941 | struct x86_emulate_ops *ops = ctxt->ops; |
@@ -1904,9 +1949,15 @@ static int em_syscall(struct x86_emulate_ctxt *ctxt) | |||
1904 | ctxt->mode == X86EMUL_MODE_VM86) | 1949 | ctxt->mode == X86EMUL_MODE_VM86) |
1905 | return emulate_ud(ctxt); | 1950 | return emulate_ud(ctxt); |
1906 | 1951 | ||
1952 | if (!(em_syscall_is_enabled(ctxt))) | ||
1953 | return emulate_ud(ctxt); | ||
1954 | |||
1907 | ops->get_msr(ctxt, MSR_EFER, &efer); | 1955 | ops->get_msr(ctxt, MSR_EFER, &efer); |
1908 | setup_syscalls_segments(ctxt, &cs, &ss); | 1956 | setup_syscalls_segments(ctxt, &cs, &ss); |
1909 | 1957 | ||
1958 | if (!(efer & EFER_SCE)) | ||
1959 | return emulate_ud(ctxt); | ||
1960 | |||
1910 | ops->get_msr(ctxt, MSR_STAR, &msr_data); | 1961 | ops->get_msr(ctxt, MSR_STAR, &msr_data); |
1911 | msr_data >>= 32; | 1962 | msr_data >>= 32; |
1912 | cs_sel = (u16)(msr_data & 0xfffc); | 1963 | cs_sel = (u16)(msr_data & 0xfffc); |
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 14d6cadc4ba6..9cbfc0698118 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
@@ -1495,6 +1495,8 @@ static void record_steal_time(struct kvm_vcpu *vcpu) | |||
1495 | 1495 | ||
1496 | int kvm_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data) | 1496 | int kvm_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data) |
1497 | { | 1497 | { |
1498 | bool pr = false; | ||
1499 | |||
1498 | switch (msr) { | 1500 | switch (msr) { |
1499 | case MSR_EFER: | 1501 | case MSR_EFER: |
1500 | return set_efer(vcpu, data); | 1502 | return set_efer(vcpu, data); |
@@ -1635,6 +1637,18 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data) | |||
1635 | pr_unimpl(vcpu, "unimplemented perfctr wrmsr: " | 1637 | pr_unimpl(vcpu, "unimplemented perfctr wrmsr: " |
1636 | "0x%x data 0x%llx\n", msr, data); | 1638 | "0x%x data 0x%llx\n", msr, data); |
1637 | break; | 1639 | break; |
1640 | case MSR_P6_PERFCTR0: | ||
1641 | case MSR_P6_PERFCTR1: | ||
1642 | pr = true; | ||
1643 | case MSR_P6_EVNTSEL0: | ||
1644 | case MSR_P6_EVNTSEL1: | ||
1645 | if (kvm_pmu_msr(vcpu, msr)) | ||
1646 | return kvm_pmu_set_msr(vcpu, msr, data); | ||
1647 | |||
1648 | if (pr || data != 0) | ||
1649 | pr_unimpl(vcpu, "disabled perfctr wrmsr: " | ||
1650 | "0x%x data 0x%llx\n", msr, data); | ||
1651 | break; | ||
1638 | case MSR_K7_CLK_CTL: | 1652 | case MSR_K7_CLK_CTL: |
1639 | /* | 1653 | /* |
1640 | * Ignore all writes to this no longer documented MSR. | 1654 | * Ignore all writes to this no longer documented MSR. |
@@ -1835,6 +1849,14 @@ int kvm_get_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata) | |||
1835 | case MSR_FAM10H_MMIO_CONF_BASE: | 1849 | case MSR_FAM10H_MMIO_CONF_BASE: |
1836 | data = 0; | 1850 | data = 0; |
1837 | break; | 1851 | break; |
1852 | case MSR_P6_PERFCTR0: | ||
1853 | case MSR_P6_PERFCTR1: | ||
1854 | case MSR_P6_EVNTSEL0: | ||
1855 | case MSR_P6_EVNTSEL1: | ||
1856 | if (kvm_pmu_msr(vcpu, msr)) | ||
1857 | return kvm_pmu_get_msr(vcpu, msr, pdata); | ||
1858 | data = 0; | ||
1859 | break; | ||
1838 | case MSR_IA32_UCODE_REV: | 1860 | case MSR_IA32_UCODE_REV: |
1839 | data = 0x100000000ULL; | 1861 | data = 0x100000000ULL; |
1840 | break; | 1862 | break; |
@@ -4180,6 +4202,28 @@ static int emulator_intercept(struct x86_emulate_ctxt *ctxt, | |||
4180 | return kvm_x86_ops->check_intercept(emul_to_vcpu(ctxt), info, stage); | 4202 | return kvm_x86_ops->check_intercept(emul_to_vcpu(ctxt), info, stage); |
4181 | } | 4203 | } |
4182 | 4204 | ||
4205 | static bool emulator_get_cpuid(struct x86_emulate_ctxt *ctxt, | ||
4206 | u32 *eax, u32 *ebx, u32 *ecx, u32 *edx) | ||
4207 | { | ||
4208 | struct kvm_cpuid_entry2 *cpuid = NULL; | ||
4209 | |||
4210 | if (eax && ecx) | ||
4211 | cpuid = kvm_find_cpuid_entry(emul_to_vcpu(ctxt), | ||
4212 | *eax, *ecx); | ||
4213 | |||
4214 | if (cpuid) { | ||
4215 | *eax = cpuid->eax; | ||
4216 | *ecx = cpuid->ecx; | ||
4217 | if (ebx) | ||
4218 | *ebx = cpuid->ebx; | ||
4219 | if (edx) | ||
4220 | *edx = cpuid->edx; | ||
4221 | return true; | ||
4222 | } | ||
4223 | |||
4224 | return false; | ||
4225 | } | ||
4226 | |||
4183 | static struct x86_emulate_ops emulate_ops = { | 4227 | static struct x86_emulate_ops emulate_ops = { |
4184 | .read_std = kvm_read_guest_virt_system, | 4228 | .read_std = kvm_read_guest_virt_system, |
4185 | .write_std = kvm_write_guest_virt_system, | 4229 | .write_std = kvm_write_guest_virt_system, |
@@ -4211,6 +4255,7 @@ static struct x86_emulate_ops emulate_ops = { | |||
4211 | .get_fpu = emulator_get_fpu, | 4255 | .get_fpu = emulator_get_fpu, |
4212 | .put_fpu = emulator_put_fpu, | 4256 | .put_fpu = emulator_put_fpu, |
4213 | .intercept = emulator_intercept, | 4257 | .intercept = emulator_intercept, |
4258 | .get_cpuid = emulator_get_cpuid, | ||
4214 | }; | 4259 | }; |
4215 | 4260 | ||
4216 | static void cache_all_regs(struct kvm_vcpu *vcpu) | 4261 | static void cache_all_regs(struct kvm_vcpu *vcpu) |
diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c index 9d74824a708d..f0b4caf85c1a 100644 --- a/arch/x86/mm/fault.c +++ b/arch/x86/mm/fault.c | |||
@@ -673,7 +673,7 @@ no_context(struct pt_regs *regs, unsigned long error_code, | |||
673 | 673 | ||
674 | stackend = end_of_stack(tsk); | 674 | stackend = end_of_stack(tsk); |
675 | if (tsk != &init_task && *stackend != STACK_END_MAGIC) | 675 | if (tsk != &init_task && *stackend != STACK_END_MAGIC) |
676 | printk(KERN_ALERT "Thread overran stack, or stack corrupted\n"); | 676 | printk(KERN_EMERG "Thread overran stack, or stack corrupted\n"); |
677 | 677 | ||
678 | tsk->thread.cr2 = address; | 678 | tsk->thread.cr2 = address; |
679 | tsk->thread.trap_no = 14; | 679 | tsk->thread.trap_no = 14; |
@@ -684,7 +684,7 @@ no_context(struct pt_regs *regs, unsigned long error_code, | |||
684 | sig = 0; | 684 | sig = 0; |
685 | 685 | ||
686 | /* Executive summary in case the body of the oops scrolled away */ | 686 | /* Executive summary in case the body of the oops scrolled away */ |
687 | printk(KERN_EMERG "CR2: %016lx\n", address); | 687 | printk(KERN_DEFAULT "CR2: %016lx\n", address); |
688 | 688 | ||
689 | oops_end(flags, regs, sig); | 689 | oops_end(flags, regs, sig); |
690 | } | 690 | } |
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/arch/xtensa/include/asm/string.h b/arch/xtensa/include/asm/string.h index 5fb8c27cbef5..405a8c49ff2c 100644 --- a/arch/xtensa/include/asm/string.h +++ b/arch/xtensa/include/asm/string.h | |||
@@ -118,7 +118,4 @@ extern void *memmove(void *__dest, __const__ void *__src, size_t __n); | |||
118 | /* Don't build bcopy at all ... */ | 118 | /* Don't build bcopy at all ... */ |
119 | #define __HAVE_ARCH_BCOPY | 119 | #define __HAVE_ARCH_BCOPY |
120 | 120 | ||
121 | #define __HAVE_ARCH_MEMSCAN | ||
122 | #define memscan memchr | ||
123 | |||
124 | #endif /* _XTENSA_STRING_H */ | 121 | #endif /* _XTENSA_STRING_H */ |
diff --git a/drivers/acpi/processor_driver.c b/drivers/acpi/processor_driver.c index 2b805d7ef317..8ae05ce18500 100644 --- a/drivers/acpi/processor_driver.c +++ b/drivers/acpi/processor_driver.c | |||
@@ -586,13 +586,6 @@ static int __cpuinit acpi_processor_add(struct acpi_device *device) | |||
586 | if (pr->flags.need_hotplug_init) | 586 | if (pr->flags.need_hotplug_init) |
587 | return 0; | 587 | return 0; |
588 | 588 | ||
589 | /* | ||
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; | ||
595 | |||
596 | result = acpi_processor_start(pr); | 589 | result = acpi_processor_start(pr); |
597 | if (result) | 590 | if (result) |
598 | goto err_remove_sysfs; | 591 | goto err_remove_sysfs; |
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/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/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/block/rbd.c b/drivers/block/rbd.c index 3fd31dec8c9c..a6278e7e61a0 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c | |||
@@ -380,6 +380,7 @@ static int rbd_get_client(struct rbd_device *rbd_dev, const char *mon_addr, | |||
380 | rbdc = __rbd_client_find(opt); | 380 | rbdc = __rbd_client_find(opt); |
381 | if (rbdc) { | 381 | if (rbdc) { |
382 | ceph_destroy_options(opt); | 382 | ceph_destroy_options(opt); |
383 | kfree(rbd_opts); | ||
383 | 384 | ||
384 | /* using an existing client */ | 385 | /* using an existing client */ |
385 | kref_get(&rbdc->kref); | 386 | kref_get(&rbdc->kref); |
@@ -406,15 +407,15 @@ done_err: | |||
406 | 407 | ||
407 | /* | 408 | /* |
408 | * Destroy ceph client | 409 | * Destroy ceph client |
410 | * | ||
411 | * Caller must hold node_lock. | ||
409 | */ | 412 | */ |
410 | static void rbd_client_release(struct kref *kref) | 413 | static void rbd_client_release(struct kref *kref) |
411 | { | 414 | { |
412 | struct rbd_client *rbdc = container_of(kref, struct rbd_client, kref); | 415 | struct rbd_client *rbdc = container_of(kref, struct rbd_client, kref); |
413 | 416 | ||
414 | dout("rbd_release_client %p\n", rbdc); | 417 | dout("rbd_release_client %p\n", rbdc); |
415 | spin_lock(&node_lock); | ||
416 | list_del(&rbdc->node); | 418 | list_del(&rbdc->node); |
417 | spin_unlock(&node_lock); | ||
418 | 419 | ||
419 | ceph_destroy_client(rbdc->client); | 420 | ceph_destroy_client(rbdc->client); |
420 | kfree(rbdc->rbd_opts); | 421 | kfree(rbdc->rbd_opts); |
@@ -427,7 +428,9 @@ static void rbd_client_release(struct kref *kref) | |||
427 | */ | 428 | */ |
428 | static void rbd_put_client(struct rbd_device *rbd_dev) | 429 | static void rbd_put_client(struct rbd_device *rbd_dev) |
429 | { | 430 | { |
431 | spin_lock(&node_lock); | ||
430 | kref_put(&rbd_dev->rbd_client->kref, rbd_client_release); | 432 | kref_put(&rbd_dev->rbd_client->kref, rbd_client_release); |
433 | spin_unlock(&node_lock); | ||
431 | rbd_dev->rbd_client = NULL; | 434 | rbd_dev->rbd_client = NULL; |
432 | rbd_dev->client = NULL; | 435 | rbd_dev->client = NULL; |
433 | } | 436 | } |
diff --git a/drivers/dma/at_hdmac.c b/drivers/dma/at_hdmac.c index 97f87b29b9f3..f4aed5fc2cb6 100644 --- a/drivers/dma/at_hdmac.c +++ b/drivers/dma/at_hdmac.c | |||
@@ -1343,7 +1343,7 @@ static int __init at_dma_probe(struct platform_device *pdev) | |||
1343 | 1343 | ||
1344 | tasklet_init(&atchan->tasklet, atc_tasklet, | 1344 | tasklet_init(&atchan->tasklet, atc_tasklet, |
1345 | (unsigned long)atchan); | 1345 | (unsigned long)atchan); |
1346 | atc_enable_irq(atchan); | 1346 | atc_enable_chan_irq(atdma, i); |
1347 | } | 1347 | } |
1348 | 1348 | ||
1349 | /* set base routines */ | 1349 | /* set base routines */ |
@@ -1410,7 +1410,7 @@ static int __exit at_dma_remove(struct platform_device *pdev) | |||
1410 | struct at_dma_chan *atchan = to_at_dma_chan(chan); | 1410 | struct at_dma_chan *atchan = to_at_dma_chan(chan); |
1411 | 1411 | ||
1412 | /* Disable interrupts */ | 1412 | /* Disable interrupts */ |
1413 | atc_disable_irq(atchan); | 1413 | atc_disable_chan_irq(atdma, chan->chan_id); |
1414 | tasklet_disable(&atchan->tasklet); | 1414 | tasklet_disable(&atchan->tasklet); |
1415 | 1415 | ||
1416 | tasklet_kill(&atchan->tasklet); | 1416 | tasklet_kill(&atchan->tasklet); |
diff --git a/drivers/dma/at_hdmac_regs.h b/drivers/dma/at_hdmac_regs.h index dcaedfc181cf..a8d3277d60b5 100644 --- a/drivers/dma/at_hdmac_regs.h +++ b/drivers/dma/at_hdmac_regs.h | |||
@@ -327,28 +327,27 @@ static void atc_dump_lli(struct at_dma_chan *atchan, struct at_lli *lli) | |||
327 | } | 327 | } |
328 | 328 | ||
329 | 329 | ||
330 | static void atc_setup_irq(struct at_dma_chan *atchan, int on) | 330 | static void atc_setup_irq(struct at_dma *atdma, int chan_id, int on) |
331 | { | 331 | { |
332 | struct at_dma *atdma = to_at_dma(atchan->chan_common.device); | 332 | u32 ebci; |
333 | u32 ebci; | ||
334 | 333 | ||
335 | /* enable interrupts on buffer transfer completion & error */ | 334 | /* enable interrupts on buffer transfer completion & error */ |
336 | ebci = AT_DMA_BTC(atchan->chan_common.chan_id) | 335 | ebci = AT_DMA_BTC(chan_id) |
337 | | AT_DMA_ERR(atchan->chan_common.chan_id); | 336 | | AT_DMA_ERR(chan_id); |
338 | if (on) | 337 | if (on) |
339 | dma_writel(atdma, EBCIER, ebci); | 338 | dma_writel(atdma, EBCIER, ebci); |
340 | else | 339 | else |
341 | dma_writel(atdma, EBCIDR, ebci); | 340 | dma_writel(atdma, EBCIDR, ebci); |
342 | } | 341 | } |
343 | 342 | ||
344 | static inline void atc_enable_irq(struct at_dma_chan *atchan) | 343 | static void atc_enable_chan_irq(struct at_dma *atdma, int chan_id) |
345 | { | 344 | { |
346 | atc_setup_irq(atchan, 1); | 345 | atc_setup_irq(atdma, chan_id, 1); |
347 | } | 346 | } |
348 | 347 | ||
349 | static inline void atc_disable_irq(struct at_dma_chan *atchan) | 348 | static void atc_disable_chan_irq(struct at_dma *atdma, int chan_id) |
350 | { | 349 | { |
351 | atc_setup_irq(atchan, 0); | 350 | atc_setup_irq(atdma, chan_id, 0); |
352 | } | 351 | } |
353 | 352 | ||
354 | 353 | ||
diff --git a/drivers/dma/dmatest.c b/drivers/dma/dmatest.c index 2b8661b54eaf..24225f0fdcd8 100644 --- a/drivers/dma/dmatest.c +++ b/drivers/dma/dmatest.c | |||
@@ -599,7 +599,7 @@ static int dmatest_add_channel(struct dma_chan *chan) | |||
599 | } | 599 | } |
600 | if (dma_has_cap(DMA_PQ, dma_dev->cap_mask)) { | 600 | if (dma_has_cap(DMA_PQ, dma_dev->cap_mask)) { |
601 | cnt = dmatest_add_threads(dtc, DMA_PQ); | 601 | cnt = dmatest_add_threads(dtc, DMA_PQ); |
602 | thread_count += cnt > 0 ?: 0; | 602 | thread_count += cnt > 0 ? cnt : 0; |
603 | } | 603 | } |
604 | 604 | ||
605 | pr_info("dmatest: Started %u threads using %s\n", | 605 | pr_info("dmatest: Started %u threads using %s\n", |
diff --git a/drivers/dma/imx-sdma.c b/drivers/dma/imx-sdma.c index a8af379680c1..8bc5acf36ee5 100644 --- a/drivers/dma/imx-sdma.c +++ b/drivers/dma/imx-sdma.c | |||
@@ -1102,11 +1102,13 @@ static int sdma_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd, | |||
1102 | case DMA_SLAVE_CONFIG: | 1102 | case DMA_SLAVE_CONFIG: |
1103 | if (dmaengine_cfg->direction == DMA_DEV_TO_MEM) { | 1103 | if (dmaengine_cfg->direction == DMA_DEV_TO_MEM) { |
1104 | sdmac->per_address = dmaengine_cfg->src_addr; | 1104 | sdmac->per_address = dmaengine_cfg->src_addr; |
1105 | sdmac->watermark_level = dmaengine_cfg->src_maxburst; | 1105 | sdmac->watermark_level = dmaengine_cfg->src_maxburst * |
1106 | dmaengine_cfg->src_addr_width; | ||
1106 | sdmac->word_size = dmaengine_cfg->src_addr_width; | 1107 | sdmac->word_size = dmaengine_cfg->src_addr_width; |
1107 | } else { | 1108 | } else { |
1108 | sdmac->per_address = dmaengine_cfg->dst_addr; | 1109 | sdmac->per_address = dmaengine_cfg->dst_addr; |
1109 | sdmac->watermark_level = dmaengine_cfg->dst_maxburst; | 1110 | sdmac->watermark_level = dmaengine_cfg->dst_maxburst * |
1111 | dmaengine_cfg->dst_addr_width; | ||
1110 | sdmac->word_size = dmaengine_cfg->dst_addr_width; | 1112 | sdmac->word_size = dmaengine_cfg->dst_addr_width; |
1111 | } | 1113 | } |
1112 | sdmac->direction = dmaengine_cfg->direction; | 1114 | sdmac->direction = dmaengine_cfg->direction; |
diff --git a/drivers/dma/shdma.c b/drivers/dma/shdma.c index 54043cd831c8..812fd76e9c18 100644 --- a/drivers/dma/shdma.c +++ b/drivers/dma/shdma.c | |||
@@ -1262,7 +1262,8 @@ static int __init sh_dmae_probe(struct platform_device *pdev) | |||
1262 | 1262 | ||
1263 | INIT_LIST_HEAD(&shdev->common.channels); | 1263 | INIT_LIST_HEAD(&shdev->common.channels); |
1264 | 1264 | ||
1265 | dma_cap_set(DMA_MEMCPY, shdev->common.cap_mask); | 1265 | if (!pdata->slave_only) |
1266 | dma_cap_set(DMA_MEMCPY, shdev->common.cap_mask); | ||
1266 | if (pdata->slave && pdata->slave_num) | 1267 | if (pdata->slave && pdata->slave_num) |
1267 | dma_cap_set(DMA_SLAVE, shdev->common.cap_mask); | 1268 | dma_cap_set(DMA_SLAVE, shdev->common.cap_mask); |
1268 | 1269 | ||
diff --git a/drivers/firewire/ohci.c b/drivers/firewire/ohci.c index 6628feaa7622..7f5f0da726da 100644 --- a/drivers/firewire/ohci.c +++ b/drivers/firewire/ohci.c | |||
@@ -263,6 +263,7 @@ static inline struct fw_ohci *fw_ohci(struct fw_card *card) | |||
263 | static char ohci_driver_name[] = KBUILD_MODNAME; | 263 | static char ohci_driver_name[] = KBUILD_MODNAME; |
264 | 264 | ||
265 | #define PCI_DEVICE_ID_AGERE_FW643 0x5901 | 265 | #define PCI_DEVICE_ID_AGERE_FW643 0x5901 |
266 | #define PCI_DEVICE_ID_CREATIVE_SB1394 0x4001 | ||
266 | #define PCI_DEVICE_ID_JMICRON_JMB38X_FW 0x2380 | 267 | #define PCI_DEVICE_ID_JMICRON_JMB38X_FW 0x2380 |
267 | #define PCI_DEVICE_ID_TI_TSB12LV22 0x8009 | 268 | #define PCI_DEVICE_ID_TI_TSB12LV22 0x8009 |
268 | #define PCI_DEVICE_ID_TI_TSB12LV26 0x8020 | 269 | #define PCI_DEVICE_ID_TI_TSB12LV26 0x8020 |
@@ -289,6 +290,9 @@ static const struct { | |||
289 | {PCI_VENDOR_ID_ATT, PCI_DEVICE_ID_AGERE_FW643, 6, | 290 | {PCI_VENDOR_ID_ATT, PCI_DEVICE_ID_AGERE_FW643, 6, |
290 | QUIRK_NO_MSI}, | 291 | QUIRK_NO_MSI}, |
291 | 292 | ||
293 | {PCI_VENDOR_ID_CREATIVE, PCI_DEVICE_ID_CREATIVE_SB1394, PCI_ANY_ID, | ||
294 | QUIRK_RESET_PACKET}, | ||
295 | |||
292 | {PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB38X_FW, PCI_ANY_ID, | 296 | {PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB38X_FW, PCI_ANY_ID, |
293 | QUIRK_NO_MSI}, | 297 | QUIRK_NO_MSI}, |
294 | 298 | ||
@@ -299,7 +303,7 @@ static const struct { | |||
299 | QUIRK_NO_MSI}, | 303 | QUIRK_NO_MSI}, |
300 | 304 | ||
301 | {PCI_VENDOR_ID_RICOH, PCI_ANY_ID, PCI_ANY_ID, | 305 | {PCI_VENDOR_ID_RICOH, PCI_ANY_ID, PCI_ANY_ID, |
302 | QUIRK_CYCLE_TIMER}, | 306 | QUIRK_CYCLE_TIMER | QUIRK_NO_MSI}, |
303 | 307 | ||
304 | {PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_TSB12LV22, PCI_ANY_ID, | 308 | {PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_TSB12LV22, PCI_ANY_ID, |
305 | QUIRK_CYCLE_TIMER | QUIRK_RESET_PACKET | QUIRK_NO_1394A}, | 309 | QUIRK_CYCLE_TIMER | QUIRK_RESET_PACKET | QUIRK_NO_1394A}, |
diff --git a/drivers/gpio/gpio-lpc32xx.c b/drivers/gpio/gpio-lpc32xx.c index 5b6948081f8f..ddfacc5ce56d 100644 --- a/drivers/gpio/gpio-lpc32xx.c +++ b/drivers/gpio/gpio-lpc32xx.c | |||
@@ -96,7 +96,7 @@ static const char *gpio_p2_names[LPC32XX_GPIO_P2_MAX] = { | |||
96 | }; | 96 | }; |
97 | 97 | ||
98 | static const char *gpio_p3_names[LPC32XX_GPIO_P3_MAX] = { | 98 | static const char *gpio_p3_names[LPC32XX_GPIO_P3_MAX] = { |
99 | "gpi000", "gpio01", "gpio02", "gpio03", | 99 | "gpio00", "gpio01", "gpio02", "gpio03", |
100 | "gpio04", "gpio05" | 100 | "gpio04", "gpio05" |
101 | }; | 101 | }; |
102 | 102 | ||
diff --git a/drivers/gpio/gpio-ml-ioh.c b/drivers/gpio/gpio-ml-ioh.c index 03d6dd5dcb77..f0febe5b8221 100644 --- a/drivers/gpio/gpio-ml-ioh.c +++ b/drivers/gpio/gpio-ml-ioh.c | |||
@@ -448,6 +448,7 @@ static int __devinit ioh_gpio_probe(struct pci_dev *pdev, | |||
448 | chip->reg = chip->base; | 448 | chip->reg = chip->base; |
449 | chip->ch = i; | 449 | chip->ch = i; |
450 | mutex_init(&chip->lock); | 450 | mutex_init(&chip->lock); |
451 | spin_lock_init(&chip->spinlock); | ||
451 | ioh_gpio_setup(chip, num_ports[i]); | 452 | ioh_gpio_setup(chip, num_ports[i]); |
452 | ret = gpiochip_add(&chip->gpio); | 453 | ret = gpiochip_add(&chip->gpio); |
453 | if (ret) { | 454 | if (ret) { |
diff --git a/drivers/gpio/gpio-pch.c b/drivers/gpio/gpio-pch.c index 68fa55e86eb1..e8729cc2ba2b 100644 --- a/drivers/gpio/gpio-pch.c +++ b/drivers/gpio/gpio-pch.c | |||
@@ -392,6 +392,7 @@ static int __devinit pch_gpio_probe(struct pci_dev *pdev, | |||
392 | chip->reg = chip->base; | 392 | chip->reg = chip->base; |
393 | pci_set_drvdata(pdev, chip); | 393 | pci_set_drvdata(pdev, chip); |
394 | mutex_init(&chip->lock); | 394 | mutex_init(&chip->lock); |
395 | spin_lock_init(&chip->spinlock); | ||
395 | pch_gpio_setup(chip); | 396 | pch_gpio_setup(chip); |
396 | ret = gpiochip_add(&chip->gpio); | 397 | ret = gpiochip_add(&chip->gpio); |
397 | if (ret) { | 398 | if (ret) { |
diff --git a/drivers/gpio/gpio-samsung.c b/drivers/gpio/gpio-samsung.c index a7661773c052..0a79a1167a25 100644 --- a/drivers/gpio/gpio-samsung.c +++ b/drivers/gpio/gpio-samsung.c | |||
@@ -2387,27 +2387,30 @@ static struct samsung_gpio_chip exynos4_gpios_3[] = { | |||
2387 | }; | 2387 | }; |
2388 | 2388 | ||
2389 | #if defined(CONFIG_ARCH_EXYNOS4) && defined(CONFIG_OF) | 2389 | #if defined(CONFIG_ARCH_EXYNOS4) && defined(CONFIG_OF) |
2390 | static int exynos4_gpio_xlate(struct gpio_chip *gc, struct device_node *np, | 2390 | static int exynos4_gpio_xlate(struct gpio_chip *gc, |
2391 | const void *gpio_spec, u32 *flags) | 2391 | const struct of_phandle_args *gpiospec, u32 *flags) |
2392 | { | 2392 | { |
2393 | const __be32 *gpio = gpio_spec; | 2393 | unsigned int pin; |
2394 | const u32 n = be32_to_cpup(gpio); | ||
2395 | unsigned int pin = gc->base + be32_to_cpu(gpio[0]); | ||
2396 | 2394 | ||
2397 | if (WARN_ON(gc->of_gpio_n_cells < 4)) | 2395 | if (WARN_ON(gc->of_gpio_n_cells < 4)) |
2398 | return -EINVAL; | 2396 | return -EINVAL; |
2399 | 2397 | ||
2400 | if (n > gc->ngpio) | 2398 | if (WARN_ON(gpiospec->args_count < gc->of_gpio_n_cells)) |
2401 | return -EINVAL; | 2399 | return -EINVAL; |
2402 | 2400 | ||
2403 | if (s3c_gpio_cfgpin(pin, S3C_GPIO_SFN(be32_to_cpu(gpio[1])))) | 2401 | if (gpiospec->args[0] > gc->ngpio) |
2402 | return -EINVAL; | ||
2403 | |||
2404 | pin = gc->base + gpiospec->args[0]; | ||
2405 | |||
2406 | if (s3c_gpio_cfgpin(pin, S3C_GPIO_SFN(gpiospec->args[1]))) | ||
2404 | pr_warn("gpio_xlate: failed to set pin function\n"); | 2407 | pr_warn("gpio_xlate: failed to set pin function\n"); |
2405 | if (s3c_gpio_setpull(pin, be32_to_cpu(gpio[2]))) | 2408 | if (s3c_gpio_setpull(pin, gpiospec->args[2])) |
2406 | pr_warn("gpio_xlate: failed to set pin pull up/down\n"); | 2409 | pr_warn("gpio_xlate: failed to set pin pull up/down\n"); |
2407 | if (s5p_gpio_set_drvstr(pin, be32_to_cpu(gpio[3]))) | 2410 | if (s5p_gpio_set_drvstr(pin, gpiospec->args[3])) |
2408 | pr_warn("gpio_xlate: failed to set pin drive strength\n"); | 2411 | pr_warn("gpio_xlate: failed to set pin drive strength\n"); |
2409 | 2412 | ||
2410 | return n; | 2413 | return gpiospec->args[0]; |
2411 | } | 2414 | } |
2412 | 2415 | ||
2413 | static const struct of_device_id exynos4_gpio_dt_match[] __initdata = { | 2416 | static const struct of_device_id exynos4_gpio_dt_match[] __initdata = { |
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/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/nouveau/nouveau_bios.h b/drivers/gpu/drm/nouveau/nouveau_bios.h index 1e382ad5a2b8..a37c31e358aa 100644 --- a/drivers/gpu/drm/nouveau/nouveau_bios.h +++ b/drivers/gpu/drm/nouveau/nouveau_bios.h | |||
@@ -54,9 +54,10 @@ struct bit_entry { | |||
54 | int bit_table(struct drm_device *, u8 id, struct bit_entry *); | 54 | int bit_table(struct drm_device *, u8 id, struct bit_entry *); |
55 | 55 | ||
56 | enum dcb_gpio_tag { | 56 | enum dcb_gpio_tag { |
57 | DCB_GPIO_TVDAC0 = 0xc, | 57 | DCB_GPIO_PANEL_POWER = 0x01, |
58 | DCB_GPIO_TVDAC0 = 0x0c, | ||
58 | DCB_GPIO_TVDAC1 = 0x2d, | 59 | DCB_GPIO_TVDAC1 = 0x2d, |
59 | DCB_GPIO_PWM_FAN = 0x9, | 60 | DCB_GPIO_PWM_FAN = 0x09, |
60 | DCB_GPIO_FAN_SENSE = 0x3d, | 61 | DCB_GPIO_FAN_SENSE = 0x3d, |
61 | DCB_GPIO_UNUSED = 0xff | 62 | DCB_GPIO_UNUSED = 0xff |
62 | }; | 63 | }; |
diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c b/drivers/gpu/drm/nouveau/nouveau_display.c index 3cb52bc52b21..795a9e3c990a 100644 --- a/drivers/gpu/drm/nouveau/nouveau_display.c +++ b/drivers/gpu/drm/nouveau/nouveau_display.c | |||
@@ -219,6 +219,16 @@ nouveau_display_init(struct drm_device *dev) | |||
219 | if (ret) | 219 | if (ret) |
220 | return ret; | 220 | return ret; |
221 | 221 | ||
222 | /* power on internal panel if it's not already. the init tables of | ||
223 | * some vbios default this to off for some reason, causing the | ||
224 | * panel to not work after resume | ||
225 | */ | ||
226 | if (nouveau_gpio_func_get(dev, DCB_GPIO_PANEL_POWER) == 0) { | ||
227 | nouveau_gpio_func_set(dev, DCB_GPIO_PANEL_POWER, true); | ||
228 | msleep(300); | ||
229 | } | ||
230 | |||
231 | /* enable polling for external displays */ | ||
222 | drm_kms_helper_poll_enable(dev); | 232 | drm_kms_helper_poll_enable(dev); |
223 | 233 | ||
224 | /* enable hotplug interrupts */ | 234 | /* enable hotplug interrupts */ |
diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.c b/drivers/gpu/drm/nouveau/nouveau_drv.c index e4a7cfe7898d..81d7962e7252 100644 --- a/drivers/gpu/drm/nouveau/nouveau_drv.c +++ b/drivers/gpu/drm/nouveau/nouveau_drv.c | |||
@@ -124,7 +124,7 @@ MODULE_PARM_DESC(ctxfw, "Use external HUB/GPC ucode (fermi)\n"); | |||
124 | int nouveau_ctxfw; | 124 | int nouveau_ctxfw; |
125 | module_param_named(ctxfw, nouveau_ctxfw, int, 0400); | 125 | module_param_named(ctxfw, nouveau_ctxfw, int, 0400); |
126 | 126 | ||
127 | MODULE_PARM_DESC(ctxfw, "Santise DCB table according to MXM-SIS\n"); | 127 | MODULE_PARM_DESC(mxmdcb, "Santise DCB table according to MXM-SIS\n"); |
128 | int nouveau_mxmdcb = 1; | 128 | int nouveau_mxmdcb = 1; |
129 | module_param_named(mxmdcb, nouveau_mxmdcb, int, 0400); | 129 | module_param_named(mxmdcb, nouveau_mxmdcb, int, 0400); |
130 | 130 | ||
diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c b/drivers/gpu/drm/nouveau/nouveau_gem.c index 5f0bc57fdaab..7ce3fde40743 100644 --- a/drivers/gpu/drm/nouveau/nouveau_gem.c +++ b/drivers/gpu/drm/nouveau/nouveau_gem.c | |||
@@ -380,6 +380,25 @@ retry: | |||
380 | } | 380 | } |
381 | 381 | ||
382 | static int | 382 | static int |
383 | validate_sync(struct nouveau_channel *chan, struct nouveau_bo *nvbo) | ||
384 | { | ||
385 | struct nouveau_fence *fence = NULL; | ||
386 | int ret = 0; | ||
387 | |||
388 | spin_lock(&nvbo->bo.bdev->fence_lock); | ||
389 | if (nvbo->bo.sync_obj) | ||
390 | fence = nouveau_fence_ref(nvbo->bo.sync_obj); | ||
391 | spin_unlock(&nvbo->bo.bdev->fence_lock); | ||
392 | |||
393 | if (fence) { | ||
394 | ret = nouveau_fence_sync(fence, chan); | ||
395 | nouveau_fence_unref(&fence); | ||
396 | } | ||
397 | |||
398 | return ret; | ||
399 | } | ||
400 | |||
401 | static int | ||
383 | validate_list(struct nouveau_channel *chan, struct list_head *list, | 402 | validate_list(struct nouveau_channel *chan, struct list_head *list, |
384 | struct drm_nouveau_gem_pushbuf_bo *pbbo, uint64_t user_pbbo_ptr) | 403 | struct drm_nouveau_gem_pushbuf_bo *pbbo, uint64_t user_pbbo_ptr) |
385 | { | 404 | { |
@@ -393,7 +412,7 @@ validate_list(struct nouveau_channel *chan, struct list_head *list, | |||
393 | list_for_each_entry(nvbo, list, entry) { | 412 | list_for_each_entry(nvbo, list, entry) { |
394 | struct drm_nouveau_gem_pushbuf_bo *b = &pbbo[nvbo->pbbo_index]; | 413 | struct drm_nouveau_gem_pushbuf_bo *b = &pbbo[nvbo->pbbo_index]; |
395 | 414 | ||
396 | ret = nouveau_fence_sync(nvbo->bo.sync_obj, chan); | 415 | ret = validate_sync(chan, nvbo); |
397 | if (unlikely(ret)) { | 416 | if (unlikely(ret)) { |
398 | NV_ERROR(dev, "fail pre-validate sync\n"); | 417 | NV_ERROR(dev, "fail pre-validate sync\n"); |
399 | return ret; | 418 | return ret; |
@@ -416,7 +435,7 @@ validate_list(struct nouveau_channel *chan, struct list_head *list, | |||
416 | return ret; | 435 | return ret; |
417 | } | 436 | } |
418 | 437 | ||
419 | ret = nouveau_fence_sync(nvbo->bo.sync_obj, chan); | 438 | ret = validate_sync(chan, nvbo); |
420 | if (unlikely(ret)) { | 439 | if (unlikely(ret)) { |
421 | NV_ERROR(dev, "fail post-validate sync\n"); | 440 | NV_ERROR(dev, "fail post-validate sync\n"); |
422 | return ret; | 441 | return ret; |
diff --git a/drivers/gpu/drm/nouveau/nouveau_mxm.c b/drivers/gpu/drm/nouveau/nouveau_mxm.c index 8bccddf4eff0..e5a64f0f4cb7 100644 --- a/drivers/gpu/drm/nouveau/nouveau_mxm.c +++ b/drivers/gpu/drm/nouveau/nouveau_mxm.c | |||
@@ -656,7 +656,16 @@ nouveau_mxm_init(struct drm_device *dev) | |||
656 | 656 | ||
657 | if (mxm_shadow(dev, mxm[0])) { | 657 | if (mxm_shadow(dev, mxm[0])) { |
658 | MXM_MSG(dev, "failed to locate valid SIS\n"); | 658 | MXM_MSG(dev, "failed to locate valid SIS\n"); |
659 | #if 0 | ||
660 | /* we should, perhaps, fall back to some kind of limited | ||
661 | * mode here if the x86 vbios hasn't already done the | ||
662 | * work for us (so we prevent loading with completely | ||
663 | * whacked vbios tables). | ||
664 | */ | ||
659 | return -EINVAL; | 665 | return -EINVAL; |
666 | #else | ||
667 | return 0; | ||
668 | #endif | ||
660 | } | 669 | } |
661 | 670 | ||
662 | MXM_MSG(dev, "MXMS Version %d.%d\n", | 671 | MXM_MSG(dev, "MXMS Version %d.%d\n", |
diff --git a/drivers/gpu/drm/nouveau/nv50_pm.c b/drivers/gpu/drm/nouveau/nv50_pm.c index 03937212e9d8..ec5481dfcd82 100644 --- a/drivers/gpu/drm/nouveau/nv50_pm.c +++ b/drivers/gpu/drm/nouveau/nv50_pm.c | |||
@@ -495,9 +495,9 @@ nv50_pm_clocks_pre(struct drm_device *dev, struct nouveau_pm_level *perflvl) | |||
495 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 495 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
496 | struct nv50_pm_state *info; | 496 | struct nv50_pm_state *info; |
497 | struct pll_lims pll; | 497 | struct pll_lims pll; |
498 | int ret = -EINVAL; | 498 | int clk, ret = -EINVAL; |
499 | int N, M, P1, P2; | 499 | int N, M, P1, P2; |
500 | u32 clk, out; | 500 | u32 out; |
501 | 501 | ||
502 | if (dev_priv->chipset == 0xaa || | 502 | if (dev_priv->chipset == 0xaa || |
503 | dev_priv->chipset == 0xac) | 503 | dev_priv->chipset == 0xac) |
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c index 891935271d34..742f17f009a9 100644 --- a/drivers/gpu/drm/radeon/atombios_crtc.c +++ b/drivers/gpu/drm/radeon/atombios_crtc.c | |||
@@ -1184,7 +1184,7 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc, | |||
1184 | WREG32(EVERGREEN_GRPH_ENABLE + radeon_crtc->crtc_offset, 1); | 1184 | WREG32(EVERGREEN_GRPH_ENABLE + radeon_crtc->crtc_offset, 1); |
1185 | 1185 | ||
1186 | WREG32(EVERGREEN_DESKTOP_HEIGHT + radeon_crtc->crtc_offset, | 1186 | WREG32(EVERGREEN_DESKTOP_HEIGHT + radeon_crtc->crtc_offset, |
1187 | crtc->mode.vdisplay); | 1187 | target_fb->height); |
1188 | x &= ~3; | 1188 | x &= ~3; |
1189 | y &= ~1; | 1189 | y &= ~1; |
1190 | WREG32(EVERGREEN_VIEWPORT_START + radeon_crtc->crtc_offset, | 1190 | WREG32(EVERGREEN_VIEWPORT_START + radeon_crtc->crtc_offset, |
@@ -1353,7 +1353,7 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc, | |||
1353 | WREG32(AVIVO_D1GRPH_ENABLE + radeon_crtc->crtc_offset, 1); | 1353 | WREG32(AVIVO_D1GRPH_ENABLE + radeon_crtc->crtc_offset, 1); |
1354 | 1354 | ||
1355 | WREG32(AVIVO_D1MODE_DESKTOP_HEIGHT + radeon_crtc->crtc_offset, | 1355 | WREG32(AVIVO_D1MODE_DESKTOP_HEIGHT + radeon_crtc->crtc_offset, |
1356 | crtc->mode.vdisplay); | 1356 | target_fb->height); |
1357 | x &= ~3; | 1357 | x &= ~3; |
1358 | y &= ~1; | 1358 | y &= ~1; |
1359 | WREG32(AVIVO_D1MODE_VIEWPORT_START + radeon_crtc->crtc_offset, | 1359 | WREG32(AVIVO_D1MODE_VIEWPORT_START + radeon_crtc->crtc_offset, |
diff --git a/drivers/gpu/drm/radeon/atombios_dp.c b/drivers/gpu/drm/radeon/atombios_dp.c index a71557ce01dc..552b436451fd 100644 --- a/drivers/gpu/drm/radeon/atombios_dp.c +++ b/drivers/gpu/drm/radeon/atombios_dp.c | |||
@@ -564,9 +564,21 @@ int radeon_dp_get_panel_mode(struct drm_encoder *encoder, | |||
564 | ENCODER_OBJECT_ID_NUTMEG) | 564 | ENCODER_OBJECT_ID_NUTMEG) |
565 | panel_mode = DP_PANEL_MODE_INTERNAL_DP1_MODE; | 565 | panel_mode = DP_PANEL_MODE_INTERNAL_DP1_MODE; |
566 | else if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) == | 566 | else if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) == |
567 | ENCODER_OBJECT_ID_TRAVIS) | 567 | ENCODER_OBJECT_ID_TRAVIS) { |
568 | panel_mode = DP_PANEL_MODE_INTERNAL_DP2_MODE; | 568 | u8 id[6]; |
569 | else if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) { | 569 | int i; |
570 | for (i = 0; i < 6; i++) | ||
571 | id[i] = radeon_read_dpcd_reg(radeon_connector, 0x503 + i); | ||
572 | if (id[0] == 0x73 && | ||
573 | id[1] == 0x69 && | ||
574 | id[2] == 0x76 && | ||
575 | id[3] == 0x61 && | ||
576 | id[4] == 0x72 && | ||
577 | id[5] == 0x54) | ||
578 | panel_mode = DP_PANEL_MODE_INTERNAL_DP1_MODE; | ||
579 | else | ||
580 | panel_mode = DP_PANEL_MODE_INTERNAL_DP2_MODE; | ||
581 | } else if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) { | ||
570 | u8 tmp = radeon_read_dpcd_reg(radeon_connector, DP_EDP_CONFIGURATION_CAP); | 582 | u8 tmp = radeon_read_dpcd_reg(radeon_connector, DP_EDP_CONFIGURATION_CAP); |
571 | if (tmp & 1) | 583 | if (tmp & 1) |
572 | panel_mode = DP_PANEL_MODE_INTERNAL_DP2_MODE; | 584 | panel_mode = DP_PANEL_MODE_INTERNAL_DP2_MODE; |
diff --git a/drivers/gpu/drm/radeon/r600_blit_kms.c b/drivers/gpu/drm/radeon/r600_blit_kms.c index d996f4381130..accc032c103f 100644 --- a/drivers/gpu/drm/radeon/r600_blit_kms.c +++ b/drivers/gpu/drm/radeon/r600_blit_kms.c | |||
@@ -468,27 +468,42 @@ set_default_state(struct radeon_device *rdev) | |||
468 | radeon_ring_write(ring, sq_stack_resource_mgmt_2); | 468 | radeon_ring_write(ring, sq_stack_resource_mgmt_2); |
469 | } | 469 | } |
470 | 470 | ||
471 | #define I2F_MAX_BITS 15 | ||
472 | #define I2F_MAX_INPUT ((1 << I2F_MAX_BITS) - 1) | ||
473 | #define I2F_SHIFT (24 - I2F_MAX_BITS) | ||
474 | |||
475 | /* | ||
476 | * Converts unsigned integer into 32-bit IEEE floating point representation. | ||
477 | * Conversion is not universal and only works for the range from 0 | ||
478 | * to 2^I2F_MAX_BITS-1. Currently we only use it with inputs between | ||
479 | * 0 and 16384 (inclusive), so I2F_MAX_BITS=15 is enough. If necessary, | ||
480 | * I2F_MAX_BITS can be increased, but that will add to the loop iterations | ||
481 | * and slow us down. Conversion is done by shifting the input and counting | ||
482 | * down until the first 1 reaches bit position 23. The resulting counter | ||
483 | * and the shifted input are, respectively, the exponent and the fraction. | ||
484 | * The sign is always zero. | ||
485 | */ | ||
471 | static uint32_t i2f(uint32_t input) | 486 | static uint32_t i2f(uint32_t input) |
472 | { | 487 | { |
473 | u32 result, i, exponent, fraction; | 488 | u32 result, i, exponent, fraction; |
474 | 489 | ||
475 | if ((input & 0x3fff) == 0) | 490 | WARN_ON_ONCE(input > I2F_MAX_INPUT); |
476 | result = 0; /* 0 is a special case */ | 491 | |
492 | if ((input & I2F_MAX_INPUT) == 0) | ||
493 | result = 0; | ||
477 | else { | 494 | else { |
478 | exponent = 140; /* exponent biased by 127; */ | 495 | exponent = 126 + I2F_MAX_BITS; |
479 | fraction = (input & 0x3fff) << 10; /* cheat and only | 496 | fraction = (input & I2F_MAX_INPUT) << I2F_SHIFT; |
480 | handle numbers below 2^^15 */ | 497 | |
481 | for (i = 0; i < 14; i++) { | 498 | for (i = 0; i < I2F_MAX_BITS; i++) { |
482 | if (fraction & 0x800000) | 499 | if (fraction & 0x800000) |
483 | break; | 500 | break; |
484 | else { | 501 | else { |
485 | fraction = fraction << 1; /* keep | 502 | fraction = fraction << 1; |
486 | shifting left until top bit = 1 */ | ||
487 | exponent = exponent - 1; | 503 | exponent = exponent - 1; |
488 | } | 504 | } |
489 | } | 505 | } |
490 | result = exponent << 23 | (fraction & 0x7fffff); /* mask | 506 | result = exponent << 23 | (fraction & 0x7fffff); |
491 | off top bit; assumed 1 */ | ||
492 | } | 507 | } |
493 | return result; | 508 | return result; |
494 | } | 509 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_atpx_handler.c b/drivers/gpu/drm/radeon/radeon_atpx_handler.c index 13ac63ba6075..98724fcb0088 100644 --- a/drivers/gpu/drm/radeon/radeon_atpx_handler.c +++ b/drivers/gpu/drm/radeon/radeon_atpx_handler.c | |||
@@ -59,8 +59,9 @@ static int radeon_atrm_call(acpi_handle atrm_handle, uint8_t *bios, | |||
59 | 59 | ||
60 | obj = (union acpi_object *)buffer.pointer; | 60 | obj = (union acpi_object *)buffer.pointer; |
61 | memcpy(bios+offset, obj->buffer.pointer, obj->buffer.length); | 61 | memcpy(bios+offset, obj->buffer.pointer, obj->buffer.length); |
62 | len = obj->buffer.length; | ||
62 | kfree(buffer.pointer); | 63 | kfree(buffer.pointer); |
63 | return obj->buffer.length; | 64 | return len; |
64 | } | 65 | } |
65 | 66 | ||
66 | bool radeon_atrm_supported(struct pci_dev *pdev) | 67 | bool radeon_atrm_supported(struct pci_dev *pdev) |
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index cec51a5b69dd..49f7cb7e226b 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
@@ -883,6 +883,8 @@ int radeon_suspend_kms(struct drm_device *dev, pm_message_t state) | |||
883 | if (dev->switch_power_state == DRM_SWITCH_POWER_OFF) | 883 | if (dev->switch_power_state == DRM_SWITCH_POWER_OFF) |
884 | return 0; | 884 | return 0; |
885 | 885 | ||
886 | drm_kms_helper_poll_disable(dev); | ||
887 | |||
886 | /* turn off display hw */ | 888 | /* turn off display hw */ |
887 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) { | 889 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) { |
888 | drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF); | 890 | drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF); |
@@ -972,6 +974,8 @@ int radeon_resume_kms(struct drm_device *dev) | |||
972 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) { | 974 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) { |
973 | drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON); | 975 | drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON); |
974 | } | 976 | } |
977 | |||
978 | drm_kms_helper_poll_enable(dev); | ||
975 | return 0; | 979 | return 0; |
976 | } | 980 | } |
977 | 981 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_i2c.c b/drivers/gpu/drm/radeon/radeon_i2c.c index 7bb1b079f480..98a8ad680109 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 || |
@@ -957,6 +958,7 @@ struct radeon_i2c_chan *radeon_i2c_create_dp(struct drm_device *dev, | |||
957 | i2c->rec = *rec; | 958 | i2c->rec = *rec; |
958 | i2c->adapter.owner = THIS_MODULE; | 959 | i2c->adapter.owner = THIS_MODULE; |
959 | i2c->adapter.class = I2C_CLASS_DDC; | 960 | i2c->adapter.class = I2C_CLASS_DDC; |
961 | i2c->adapter.dev.parent = &dev->pdev->dev; | ||
960 | i2c->dev = dev; | 962 | i2c->dev = dev; |
961 | snprintf(i2c->adapter.name, sizeof(i2c->adapter.name), | 963 | snprintf(i2c->adapter.name, sizeof(i2c->adapter.name), |
962 | "Radeon aux bus %s", name); | 964 | "Radeon aux bus %s", name); |
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/hid/hid-hyperv.c b/drivers/hid/hid-hyperv.c index 0c33ae9cf0f0..406632472c1b 100644 --- a/drivers/hid/hid-hyperv.c +++ b/drivers/hid/hid-hyperv.c | |||
@@ -548,6 +548,7 @@ static int mousevsc_remove(struct hv_device *dev) | |||
548 | struct mousevsc_dev *input_dev = hv_get_drvdata(dev); | 548 | struct mousevsc_dev *input_dev = hv_get_drvdata(dev); |
549 | 549 | ||
550 | vmbus_close(dev->channel); | 550 | vmbus_close(dev->channel); |
551 | hid_hw_stop(input_dev->hid_device); | ||
551 | hid_destroy_device(input_dev->hid_device); | 552 | hid_destroy_device(input_dev->hid_device); |
552 | mousevsc_free_device(input_dev); | 553 | mousevsc_free_device(input_dev); |
553 | 554 | ||
diff --git a/drivers/hid/hid-wacom.c b/drivers/hid/hid-wacom.c index b47e58b52d9f..acab74cde727 100644 --- a/drivers/hid/hid-wacom.c +++ b/drivers/hid/hid-wacom.c | |||
@@ -531,7 +531,6 @@ static int wacom_probe(struct hid_device *hdev, | |||
531 | wdata->battery.type = POWER_SUPPLY_TYPE_BATTERY; | 531 | wdata->battery.type = POWER_SUPPLY_TYPE_BATTERY; |
532 | wdata->battery.use_for_apm = 0; | 532 | wdata->battery.use_for_apm = 0; |
533 | 533 | ||
534 | power_supply_powers(&wdata->battery, &hdev->dev); | ||
535 | 534 | ||
536 | ret = power_supply_register(&hdev->dev, &wdata->battery); | 535 | ret = power_supply_register(&hdev->dev, &wdata->battery); |
537 | if (ret) { | 536 | if (ret) { |
@@ -540,6 +539,8 @@ static int wacom_probe(struct hid_device *hdev, | |||
540 | goto err_battery; | 539 | goto err_battery; |
541 | } | 540 | } |
542 | 541 | ||
542 | power_supply_powers(&wdata->battery, &hdev->dev); | ||
543 | |||
543 | wdata->ac.properties = wacom_ac_props; | 544 | wdata->ac.properties = wacom_ac_props; |
544 | wdata->ac.num_properties = ARRAY_SIZE(wacom_ac_props); | 545 | wdata->ac.num_properties = ARRAY_SIZE(wacom_ac_props); |
545 | wdata->ac.get_property = wacom_ac_get_property; | 546 | wdata->ac.get_property = wacom_ac_get_property; |
@@ -547,14 +548,14 @@ static int wacom_probe(struct hid_device *hdev, | |||
547 | wdata->ac.type = POWER_SUPPLY_TYPE_MAINS; | 548 | wdata->ac.type = POWER_SUPPLY_TYPE_MAINS; |
548 | wdata->ac.use_for_apm = 0; | 549 | wdata->ac.use_for_apm = 0; |
549 | 550 | ||
550 | power_supply_powers(&wdata->battery, &hdev->dev); | ||
551 | |||
552 | ret = power_supply_register(&hdev->dev, &wdata->ac); | 551 | ret = power_supply_register(&hdev->dev, &wdata->ac); |
553 | if (ret) { | 552 | if (ret) { |
554 | hid_warn(hdev, | 553 | hid_warn(hdev, |
555 | "can't create ac battery attribute, err: %d\n", ret); | 554 | "can't create ac battery attribute, err: %d\n", ret); |
556 | goto err_ac; | 555 | goto err_ac; |
557 | } | 556 | } |
557 | |||
558 | power_supply_powers(&wdata->ac, &hdev->dev); | ||
558 | #endif | 559 | #endif |
559 | return 0; | 560 | return 0; |
560 | 561 | ||
diff --git a/drivers/hid/hid-wiimote-core.c b/drivers/hid/hid-wiimote-core.c index fc253b472f9d..cac3589b1ed5 100644 --- a/drivers/hid/hid-wiimote-core.c +++ b/drivers/hid/hid-wiimote-core.c | |||
@@ -1226,14 +1226,14 @@ static int wiimote_hid_probe(struct hid_device *hdev, | |||
1226 | wdata->battery.type = POWER_SUPPLY_TYPE_BATTERY; | 1226 | wdata->battery.type = POWER_SUPPLY_TYPE_BATTERY; |
1227 | wdata->battery.use_for_apm = 0; | 1227 | wdata->battery.use_for_apm = 0; |
1228 | 1228 | ||
1229 | power_supply_powers(&wdata->battery, &hdev->dev); | ||
1230 | |||
1231 | ret = power_supply_register(&wdata->hdev->dev, &wdata->battery); | 1229 | ret = power_supply_register(&wdata->hdev->dev, &wdata->battery); |
1232 | if (ret) { | 1230 | if (ret) { |
1233 | hid_err(hdev, "Cannot register battery device\n"); | 1231 | hid_err(hdev, "Cannot register battery device\n"); |
1234 | goto err_battery; | 1232 | goto err_battery; |
1235 | } | 1233 | } |
1236 | 1234 | ||
1235 | power_supply_powers(&wdata->battery, &hdev->dev); | ||
1236 | |||
1237 | ret = wiimote_leds_create(wdata); | 1237 | ret = wiimote_leds_create(wdata); |
1238 | if (ret) | 1238 | if (ret) |
1239 | goto err_free; | 1239 | goto err_free; |
diff --git a/drivers/hid/usbhid/hiddev.c b/drivers/hid/usbhid/hiddev.c index 7c297d305d5d..b1ec0e2aeb57 100644 --- a/drivers/hid/usbhid/hiddev.c +++ b/drivers/hid/usbhid/hiddev.c | |||
@@ -922,11 +922,11 @@ void hiddev_disconnect(struct hid_device *hid) | |||
922 | struct hiddev *hiddev = hid->hiddev; | 922 | struct hiddev *hiddev = hid->hiddev; |
923 | struct usbhid_device *usbhid = hid->driver_data; | 923 | struct usbhid_device *usbhid = hid->driver_data; |
924 | 924 | ||
925 | usb_deregister_dev(usbhid->intf, &hiddev_class); | ||
926 | |||
925 | mutex_lock(&hiddev->existancelock); | 927 | mutex_lock(&hiddev->existancelock); |
926 | hiddev->exist = 0; | 928 | hiddev->exist = 0; |
927 | 929 | ||
928 | usb_deregister_dev(usbhid->intf, &hiddev_class); | ||
929 | |||
930 | if (hiddev->open) { | 930 | if (hiddev->open) { |
931 | mutex_unlock(&hiddev->existancelock); | 931 | mutex_unlock(&hiddev->existancelock); |
932 | usbhid_close(hiddev->hid); | 932 | usbhid_close(hiddev->hid); |
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..4d383e7e051d 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; |
@@ -1914,9 +1920,26 @@ w83627ehf_check_fan_inputs(const struct w83627ehf_sio_data *sio_data, | |||
1914 | fan4min = 0; | 1920 | fan4min = 0; |
1915 | fan5pin = 0; | 1921 | fan5pin = 0; |
1916 | } else if (sio_data->kind == nct6776) { | 1922 | } else if (sio_data->kind == nct6776) { |
1917 | fan3pin = !(superio_inb(sio_data->sioreg, 0x24) & 0x40); | 1923 | bool gpok = superio_inb(sio_data->sioreg, 0x27) & 0x80; |
1918 | fan4pin = !!(superio_inb(sio_data->sioreg, 0x1C) & 0x01); | 1924 | |
1919 | fan5pin = !!(superio_inb(sio_data->sioreg, 0x1C) & 0x02); | 1925 | superio_select(sio_data->sioreg, W83627EHF_LD_HWM); |
1926 | regval = superio_inb(sio_data->sioreg, SIO_REG_ENABLE); | ||
1927 | |||
1928 | if (regval & 0x80) | ||
1929 | fan3pin = gpok; | ||
1930 | else | ||
1931 | fan3pin = !(superio_inb(sio_data->sioreg, 0x24) & 0x40); | ||
1932 | |||
1933 | if (regval & 0x40) | ||
1934 | fan4pin = gpok; | ||
1935 | else | ||
1936 | fan4pin = !!(superio_inb(sio_data->sioreg, 0x1C) & 0x01); | ||
1937 | |||
1938 | if (regval & 0x20) | ||
1939 | fan5pin = gpok; | ||
1940 | else | ||
1941 | fan5pin = !!(superio_inb(sio_data->sioreg, 0x1C) & 0x02); | ||
1942 | |||
1920 | fan4min = fan4pin; | 1943 | fan4min = fan4pin; |
1921 | } else if (sio_data->kind == w83667hg || sio_data->kind == w83667hg_b) { | 1944 | } else if (sio_data->kind == w83667hg || sio_data->kind == w83667hg_b) { |
1922 | fan3pin = 1; | 1945 | fan3pin = 1; |
diff --git a/drivers/infiniband/core/ucma.c b/drivers/infiniband/core/ucma.c index b37b0c02a7b9..5034a87cc72d 100644 --- a/drivers/infiniband/core/ucma.c +++ b/drivers/infiniband/core/ucma.c | |||
@@ -808,9 +808,12 @@ static ssize_t ucma_accept(struct ucma_file *file, const char __user *inbuf, | |||
808 | return PTR_ERR(ctx); | 808 | return PTR_ERR(ctx); |
809 | 809 | ||
810 | if (cmd.conn_param.valid) { | 810 | if (cmd.conn_param.valid) { |
811 | ctx->uid = cmd.uid; | ||
812 | ucma_copy_conn_param(&conn_param, &cmd.conn_param); | 811 | ucma_copy_conn_param(&conn_param, &cmd.conn_param); |
812 | mutex_lock(&file->mut); | ||
813 | ret = rdma_accept(ctx->cm_id, &conn_param); | 813 | ret = rdma_accept(ctx->cm_id, &conn_param); |
814 | if (!ret) | ||
815 | ctx->uid = cmd.uid; | ||
816 | mutex_unlock(&file->mut); | ||
814 | } else | 817 | } else |
815 | ret = rdma_accept(ctx->cm_id, NULL); | 818 | ret = rdma_accept(ctx->cm_id, NULL); |
816 | 819 | ||
diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c index b930da4c0c63..4d27e4c3fe34 100644 --- a/drivers/infiniband/core/uverbs_cmd.c +++ b/drivers/infiniband/core/uverbs_cmd.c | |||
@@ -1485,6 +1485,7 @@ ssize_t ib_uverbs_create_qp(struct ib_uverbs_file *file, | |||
1485 | qp->event_handler = attr.event_handler; | 1485 | qp->event_handler = attr.event_handler; |
1486 | qp->qp_context = attr.qp_context; | 1486 | qp->qp_context = attr.qp_context; |
1487 | qp->qp_type = attr.qp_type; | 1487 | qp->qp_type = attr.qp_type; |
1488 | atomic_set(&qp->usecnt, 0); | ||
1488 | atomic_inc(&pd->usecnt); | 1489 | atomic_inc(&pd->usecnt); |
1489 | atomic_inc(&attr.send_cq->usecnt); | 1490 | atomic_inc(&attr.send_cq->usecnt); |
1490 | if (attr.recv_cq) | 1491 | if (attr.recv_cq) |
diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c index 602b1bd723a9..575b78045aaf 100644 --- a/drivers/infiniband/core/verbs.c +++ b/drivers/infiniband/core/verbs.c | |||
@@ -421,6 +421,7 @@ struct ib_qp *ib_create_qp(struct ib_pd *pd, | |||
421 | qp->uobject = NULL; | 421 | qp->uobject = NULL; |
422 | qp->qp_type = qp_init_attr->qp_type; | 422 | qp->qp_type = qp_init_attr->qp_type; |
423 | 423 | ||
424 | atomic_set(&qp->usecnt, 0); | ||
424 | if (qp_init_attr->qp_type == IB_QPT_XRC_TGT) { | 425 | if (qp_init_attr->qp_type == IB_QPT_XRC_TGT) { |
425 | qp->event_handler = __ib_shared_qp_event_handler; | 426 | qp->event_handler = __ib_shared_qp_event_handler; |
426 | qp->qp_context = qp; | 427 | qp->qp_context = qp; |
@@ -430,7 +431,6 @@ struct ib_qp *ib_create_qp(struct ib_pd *pd, | |||
430 | qp->xrcd = qp_init_attr->xrcd; | 431 | qp->xrcd = qp_init_attr->xrcd; |
431 | atomic_inc(&qp_init_attr->xrcd->usecnt); | 432 | atomic_inc(&qp_init_attr->xrcd->usecnt); |
432 | INIT_LIST_HEAD(&qp->open_list); | 433 | INIT_LIST_HEAD(&qp->open_list); |
433 | atomic_set(&qp->usecnt, 0); | ||
434 | 434 | ||
435 | real_qp = qp; | 435 | real_qp = qp; |
436 | qp = __ib_open_qp(real_qp, qp_init_attr->event_handler, | 436 | qp = __ib_open_qp(real_qp, qp_init_attr->event_handler, |
diff --git a/drivers/infiniband/hw/ipath/ipath_fs.c b/drivers/infiniband/hw/ipath/ipath_fs.c index b7d4216db3c3..a4de9d58e9b4 100644 --- a/drivers/infiniband/hw/ipath/ipath_fs.c +++ b/drivers/infiniband/hw/ipath/ipath_fs.c | |||
@@ -89,7 +89,7 @@ static int create_file(const char *name, umode_t mode, | |||
89 | error = ipathfs_mknod(parent->d_inode, *dentry, | 89 | error = ipathfs_mknod(parent->d_inode, *dentry, |
90 | mode, fops, data); | 90 | mode, fops, data); |
91 | else | 91 | else |
92 | error = PTR_ERR(dentry); | 92 | error = PTR_ERR(*dentry); |
93 | mutex_unlock(&parent->d_inode->i_mutex); | 93 | mutex_unlock(&parent->d_inode->i_mutex); |
94 | 94 | ||
95 | return error; | 95 | return error; |
diff --git a/drivers/infiniband/hw/mlx4/mad.c b/drivers/infiniband/hw/mlx4/mad.c index 95c94d8f0254..259b0670b51c 100644 --- a/drivers/infiniband/hw/mlx4/mad.c +++ b/drivers/infiniband/hw/mlx4/mad.c | |||
@@ -257,12 +257,9 @@ static int ib_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num, | |||
257 | return IB_MAD_RESULT_SUCCESS; | 257 | return IB_MAD_RESULT_SUCCESS; |
258 | 258 | ||
259 | /* | 259 | /* |
260 | * Don't process SMInfo queries or vendor-specific | 260 | * Don't process SMInfo queries -- the SMA can't handle them. |
261 | * MADs -- the SMA can't handle them. | ||
262 | */ | 261 | */ |
263 | if (in_mad->mad_hdr.attr_id == IB_SMP_ATTR_SM_INFO || | 262 | if (in_mad->mad_hdr.attr_id == IB_SMP_ATTR_SM_INFO) |
264 | ((in_mad->mad_hdr.attr_id & IB_SMP_ATTR_VENDOR_MASK) == | ||
265 | IB_SMP_ATTR_VENDOR_MASK)) | ||
266 | return IB_MAD_RESULT_SUCCESS; | 263 | return IB_MAD_RESULT_SUCCESS; |
267 | } else if (in_mad->mad_hdr.mgmt_class == IB_MGMT_CLASS_PERF_MGMT || | 264 | } else if (in_mad->mad_hdr.mgmt_class == IB_MGMT_CLASS_PERF_MGMT || |
268 | in_mad->mad_hdr.mgmt_class == MLX4_IB_VENDOR_CLASS1 || | 265 | in_mad->mad_hdr.mgmt_class == MLX4_IB_VENDOR_CLASS1 || |
diff --git a/drivers/infiniband/hw/nes/nes.c b/drivers/infiniband/hw/nes/nes.c index 7013da5e9eda..7140199f562e 100644 --- a/drivers/infiniband/hw/nes/nes.c +++ b/drivers/infiniband/hw/nes/nes.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved. | 2 | * Copyright (c) 2006 - 2011 Intel Corporation. All rights reserved. |
3 | * Copyright (c) 2005 Open Grid Computing, Inc. All rights reserved. | 3 | * Copyright (c) 2005 Open Grid Computing, Inc. All rights reserved. |
4 | * | 4 | * |
5 | * This software is available to you under a choice of one of two | 5 | * This software is available to you under a choice of one of two |
diff --git a/drivers/infiniband/hw/nes/nes.h b/drivers/infiniband/hw/nes/nes.h index 568b4f11380a..c438e4691b3c 100644 --- a/drivers/infiniband/hw/nes/nes.h +++ b/drivers/infiniband/hw/nes/nes.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved. | 2 | * Copyright (c) 2006 - 2011 Intel Corporation. All rights reserved. |
3 | * Copyright (c) 2005 Open Grid Computing, Inc. All rights reserved. | 3 | * Copyright (c) 2005 Open Grid Computing, Inc. All rights reserved. |
4 | * | 4 | * |
5 | * This software is available to you under a choice of one of two | 5 | * This software is available to you under a choice of one of two |
diff --git a/drivers/infiniband/hw/nes/nes_cm.c b/drivers/infiniband/hw/nes/nes_cm.c index 425065b36b8c..a4972abedef1 100644 --- a/drivers/infiniband/hw/nes/nes_cm.c +++ b/drivers/infiniband/hw/nes/nes_cm.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved. | 2 | * Copyright (c) 2006 - 2011 Intel Corporation. All rights reserved. |
3 | * | 3 | * |
4 | * This software is available to you under a choice of one of two | 4 | * This software is available to you under a choice of one of two |
5 | * licenses. You may choose to be licensed under the terms of the GNU | 5 | * licenses. You may choose to be licensed under the terms of the GNU |
@@ -233,6 +233,7 @@ static int send_mpa_reject(struct nes_cm_node *cm_node) | |||
233 | u8 *start_ptr = &start_addr; | 233 | u8 *start_ptr = &start_addr; |
234 | u8 **start_buff = &start_ptr; | 234 | u8 **start_buff = &start_ptr; |
235 | u16 buff_len = 0; | 235 | u16 buff_len = 0; |
236 | struct ietf_mpa_v1 *mpa_frame; | ||
236 | 237 | ||
237 | skb = dev_alloc_skb(MAX_CM_BUFFER); | 238 | skb = dev_alloc_skb(MAX_CM_BUFFER); |
238 | if (!skb) { | 239 | if (!skb) { |
@@ -242,6 +243,8 @@ static int send_mpa_reject(struct nes_cm_node *cm_node) | |||
242 | 243 | ||
243 | /* send an MPA reject frame */ | 244 | /* send an MPA reject frame */ |
244 | cm_build_mpa_frame(cm_node, start_buff, &buff_len, NULL, MPA_KEY_REPLY); | 245 | cm_build_mpa_frame(cm_node, start_buff, &buff_len, NULL, MPA_KEY_REPLY); |
246 | mpa_frame = (struct ietf_mpa_v1 *)*start_buff; | ||
247 | mpa_frame->flags |= IETF_MPA_FLAGS_REJECT; | ||
245 | form_cm_frame(skb, cm_node, NULL, 0, *start_buff, buff_len, SET_ACK | SET_FIN); | 248 | form_cm_frame(skb, cm_node, NULL, 0, *start_buff, buff_len, SET_ACK | SET_FIN); |
246 | 249 | ||
247 | cm_node->state = NES_CM_STATE_FIN_WAIT1; | 250 | cm_node->state = NES_CM_STATE_FIN_WAIT1; |
@@ -1360,8 +1363,7 @@ static int nes_addr_resolve_neigh(struct nes_vnic *nesvnic, u32 dst_ip, int arpi | |||
1360 | if (!memcmp(nesadapter->arp_table[arpindex].mac_addr, | 1363 | if (!memcmp(nesadapter->arp_table[arpindex].mac_addr, |
1361 | neigh->ha, ETH_ALEN)) { | 1364 | neigh->ha, ETH_ALEN)) { |
1362 | /* Mac address same as in nes_arp_table */ | 1365 | /* Mac address same as in nes_arp_table */ |
1363 | ip_rt_put(rt); | 1366 | goto out; |
1364 | return rc; | ||
1365 | } | 1367 | } |
1366 | 1368 | ||
1367 | nes_manage_arp_cache(nesvnic->netdev, | 1369 | nes_manage_arp_cache(nesvnic->netdev, |
@@ -1377,6 +1379,8 @@ static int nes_addr_resolve_neigh(struct nes_vnic *nesvnic, u32 dst_ip, int arpi | |||
1377 | neigh_event_send(neigh, NULL); | 1379 | neigh_event_send(neigh, NULL); |
1378 | } | 1380 | } |
1379 | } | 1381 | } |
1382 | |||
1383 | out: | ||
1380 | rcu_read_unlock(); | 1384 | rcu_read_unlock(); |
1381 | ip_rt_put(rt); | 1385 | ip_rt_put(rt); |
1382 | return rc; | 1386 | return rc; |
diff --git a/drivers/infiniband/hw/nes/nes_cm.h b/drivers/infiniband/hw/nes/nes_cm.h index bdfa1fbb35fc..4646e6666087 100644 --- a/drivers/infiniband/hw/nes/nes_cm.h +++ b/drivers/infiniband/hw/nes/nes_cm.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved. | 2 | * Copyright (c) 2006 - 2011 Intel Corporation. All rights reserved. |
3 | * | 3 | * |
4 | * This software is available to you under a choice of one of two | 4 | * This software is available to you under a choice of one of two |
5 | * licenses. You may choose to be licensed under the terms of the GNU | 5 | * licenses. You may choose to be licensed under the terms of the GNU |
diff --git a/drivers/infiniband/hw/nes/nes_context.h b/drivers/infiniband/hw/nes/nes_context.h index b4393a16099d..a69eef16d72d 100644 --- a/drivers/infiniband/hw/nes/nes_context.h +++ b/drivers/infiniband/hw/nes/nes_context.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved. | 2 | * Copyright (c) 2006 - 2011 Intel Corporation. All rights reserved. |
3 | * | 3 | * |
4 | * This software is available to you under a choice of one of two | 4 | * This software is available to you under a choice of one of two |
5 | * licenses. You may choose to be licensed under the terms of the GNU | 5 | * licenses. You may choose to be licensed under the terms of the GNU |
diff --git a/drivers/infiniband/hw/nes/nes_hw.c b/drivers/infiniband/hw/nes/nes_hw.c index 055f4b545df0..d42c9f435b1b 100644 --- a/drivers/infiniband/hw/nes/nes_hw.c +++ b/drivers/infiniband/hw/nes/nes_hw.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved. | 2 | * Copyright (c) 2006 - 2011 Intel Corporation. All rights reserved. |
3 | * | 3 | * |
4 | * This software is available to you under a choice of one of two | 4 | * This software is available to you under a choice of one of two |
5 | * licenses. You may choose to be licensed under the terms of the GNU | 5 | * licenses. You may choose to be licensed under the terms of the GNU |
diff --git a/drivers/infiniband/hw/nes/nes_hw.h b/drivers/infiniband/hw/nes/nes_hw.h index 0b590e152c6a..d748e4b31b8d 100644 --- a/drivers/infiniband/hw/nes/nes_hw.h +++ b/drivers/infiniband/hw/nes/nes_hw.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved. | 2 | * Copyright (c) 2006 - 2011 Intel Corporation. All rights reserved. |
3 | * | 3 | * |
4 | * This software is available to you under a choice of one of two | 4 | * This software is available to you under a choice of one of two |
5 | * licenses. You may choose to be licensed under the terms of the GNU | 5 | * licenses. You may choose to be licensed under the terms of the GNU |
diff --git a/drivers/infiniband/hw/nes/nes_mgt.c b/drivers/infiniband/hw/nes/nes_mgt.c index b3b2a240c6e9..3ba7be369452 100644 --- a/drivers/infiniband/hw/nes/nes_mgt.c +++ b/drivers/infiniband/hw/nes/nes_mgt.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) 2006 - 2009 Intel-NE, Inc. All rights reserved. | 2 | * Copyright (c) 2006 - 2011 Intel-NE, Inc. All rights reserved. |
3 | * | 3 | * |
4 | * This software is available to you under a choice of one of two | 4 | * This software is available to you under a choice of one of two |
5 | * licenses. You may choose to be licensed under the terms of the GNU | 5 | * licenses. You may choose to be licensed under the terms of the GNU |
diff --git a/drivers/infiniband/hw/nes/nes_mgt.h b/drivers/infiniband/hw/nes/nes_mgt.h index 8c8af254555a..4f7f701c4a81 100644 --- a/drivers/infiniband/hw/nes/nes_mgt.h +++ b/drivers/infiniband/hw/nes/nes_mgt.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) 2010 Intel-NE, Inc. All rights reserved. | 2 | * Copyright (c) 2006 - 2011 Intel-NE, Inc. All rights reserved. |
3 | * | 3 | * |
4 | * This software is available to you under a choice of one of two | 4 | * This software is available to you under a choice of one of two |
5 | * licenses. You may choose to be licensed under the terms of the GNU | 5 | * licenses. You may choose to be licensed under the terms of the GNU |
diff --git a/drivers/infiniband/hw/nes/nes_nic.c b/drivers/infiniband/hw/nes/nes_nic.c index 4b3fa711a247..f3a3ecf8d09e 100644 --- a/drivers/infiniband/hw/nes/nes_nic.c +++ b/drivers/infiniband/hw/nes/nes_nic.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved. | 2 | * Copyright (c) 2006 - 2011 Intel Corporation. All rights reserved. |
3 | * | 3 | * |
4 | * This software is available to you under a choice of one of two | 4 | * This software is available to you under a choice of one of two |
5 | * licenses. You may choose to be licensed under the terms of the GNU | 5 | * licenses. You may choose to be licensed under the terms of the GNU |
diff --git a/drivers/infiniband/hw/nes/nes_user.h b/drivers/infiniband/hw/nes/nes_user.h index 71e133ab209b..4926de744488 100644 --- a/drivers/infiniband/hw/nes/nes_user.h +++ b/drivers/infiniband/hw/nes/nes_user.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved. | 2 | * Copyright (c) 2006 - 2011 Intel Corporation. All rights reserved. |
3 | * Copyright (c) 2005 Topspin Communications. All rights reserved. | 3 | * Copyright (c) 2005 Topspin Communications. All rights reserved. |
4 | * Copyright (c) 2005 Cisco Systems. All rights reserved. | 4 | * Copyright (c) 2005 Cisco Systems. All rights reserved. |
5 | * Copyright (c) 2005 Open Grid Computing, Inc. All rights reserved. | 5 | * Copyright (c) 2005 Open Grid Computing, Inc. All rights reserved. |
diff --git a/drivers/infiniband/hw/nes/nes_utils.c b/drivers/infiniband/hw/nes/nes_utils.c index 8b4c2ff54888..e98f4fc0b768 100644 --- a/drivers/infiniband/hw/nes/nes_utils.c +++ b/drivers/infiniband/hw/nes/nes_utils.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved. | 2 | * Copyright (c) 2006 - 2011 Intel Corporation. All rights reserved. |
3 | * | 3 | * |
4 | * This software is available to you under a choice of one of two | 4 | * This software is available to you under a choice of one of two |
5 | * licenses. You may choose to be licensed under the terms of the GNU | 5 | * licenses. You may choose to be licensed under the terms of the GNU |
diff --git a/drivers/infiniband/hw/nes/nes_verbs.c b/drivers/infiniband/hw/nes/nes_verbs.c index 5095bc41c6cc..0927b5cc65d3 100644 --- a/drivers/infiniband/hw/nes/nes_verbs.c +++ b/drivers/infiniband/hw/nes/nes_verbs.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved. | 2 | * Copyright (c) 2006 - 2011 Intel Corporation. All rights reserved. |
3 | * | 3 | * |
4 | * This software is available to you under a choice of one of two | 4 | * This software is available to you under a choice of one of two |
5 | * licenses. You may choose to be licensed under the terms of the GNU | 5 | * licenses. You may choose to be licensed under the terms of the GNU |
@@ -3428,6 +3428,8 @@ static int nes_post_send(struct ib_qp *ibqp, struct ib_send_wr *ib_wr, | |||
3428 | NES_IWARP_SQ_FMR_WQE_LENGTH_LOW_IDX, | 3428 | NES_IWARP_SQ_FMR_WQE_LENGTH_LOW_IDX, |
3429 | ib_wr->wr.fast_reg.length); | 3429 | ib_wr->wr.fast_reg.length); |
3430 | set_wqe_32bit_value(wqe->wqe_words, | 3430 | set_wqe_32bit_value(wqe->wqe_words, |
3431 | NES_IWARP_SQ_FMR_WQE_LENGTH_HIGH_IDX, 0); | ||
3432 | set_wqe_32bit_value(wqe->wqe_words, | ||
3431 | NES_IWARP_SQ_FMR_WQE_MR_STAG_IDX, | 3433 | NES_IWARP_SQ_FMR_WQE_MR_STAG_IDX, |
3432 | ib_wr->wr.fast_reg.rkey); | 3434 | ib_wr->wr.fast_reg.rkey); |
3433 | /* Set page size: */ | 3435 | /* Set page size: */ |
@@ -3724,7 +3726,7 @@ static int nes_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *entry) | |||
3724 | entry->opcode = IB_WC_SEND; | 3726 | entry->opcode = IB_WC_SEND; |
3725 | break; | 3727 | break; |
3726 | case NES_IWARP_SQ_OP_LOCINV: | 3728 | case NES_IWARP_SQ_OP_LOCINV: |
3727 | entry->opcode = IB_WR_LOCAL_INV; | 3729 | entry->opcode = IB_WC_LOCAL_INV; |
3728 | break; | 3730 | break; |
3729 | case NES_IWARP_SQ_OP_FAST_REG: | 3731 | case NES_IWARP_SQ_OP_FAST_REG: |
3730 | entry->opcode = IB_WC_FAST_REG_MR; | 3732 | entry->opcode = IB_WC_FAST_REG_MR; |
diff --git a/drivers/infiniband/hw/nes/nes_verbs.h b/drivers/infiniband/hw/nes/nes_verbs.h index fe6b6e92fa90..0eff7c44d76b 100644 --- a/drivers/infiniband/hw/nes/nes_verbs.h +++ b/drivers/infiniband/hw/nes/nes_verbs.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved. | 2 | * Copyright (c) 2006 - 2011 Intel Corporation. All rights reserved. |
3 | * Copyright (c) 2005 Open Grid Computing, Inc. All rights reserved. | 3 | * Copyright (c) 2005 Open Grid Computing, Inc. All rights reserved. |
4 | * | 4 | * |
5 | * This software is available to you under a choice of one of two | 5 | * This software is available to you under a choice of one of two |
diff --git a/drivers/infiniband/hw/qib/qib_iba6120.c b/drivers/infiniband/hw/qib/qib_iba6120.c index 4f18e2d332df..d0c64d514813 100644 --- a/drivers/infiniband/hw/qib/qib_iba6120.c +++ b/drivers/infiniband/hw/qib/qib_iba6120.c | |||
@@ -2105,7 +2105,7 @@ static void alloc_dummy_hdrq(struct qib_devdata *dd) | |||
2105 | dd->cspec->dummy_hdrq = dma_alloc_coherent(&dd->pcidev->dev, | 2105 | dd->cspec->dummy_hdrq = dma_alloc_coherent(&dd->pcidev->dev, |
2106 | dd->rcd[0]->rcvhdrq_size, | 2106 | dd->rcd[0]->rcvhdrq_size, |
2107 | &dd->cspec->dummy_hdrq_phys, | 2107 | &dd->cspec->dummy_hdrq_phys, |
2108 | GFP_KERNEL | __GFP_COMP); | 2108 | GFP_ATOMIC | __GFP_COMP); |
2109 | if (!dd->cspec->dummy_hdrq) { | 2109 | if (!dd->cspec->dummy_hdrq) { |
2110 | qib_devinfo(dd->pcidev, "Couldn't allocate dummy hdrq\n"); | 2110 | qib_devinfo(dd->pcidev, "Couldn't allocate dummy hdrq\n"); |
2111 | /* fallback to just 0'ing */ | 2111 | /* fallback to just 0'ing */ |
diff --git a/drivers/infiniband/hw/qib/qib_pcie.c b/drivers/infiniband/hw/qib/qib_pcie.c index f695061d688e..0fde788e1100 100644 --- a/drivers/infiniband/hw/qib/qib_pcie.c +++ b/drivers/infiniband/hw/qib/qib_pcie.c | |||
@@ -560,7 +560,7 @@ static int qib_tune_pcie_coalesce(struct qib_devdata *dd) | |||
560 | * BIOS may not set PCIe bus-utilization parameters for best performance. | 560 | * BIOS may not set PCIe bus-utilization parameters for best performance. |
561 | * Check and optionally adjust them to maximize our throughput. | 561 | * Check and optionally adjust them to maximize our throughput. |
562 | */ | 562 | */ |
563 | static int qib_pcie_caps = 0x51; | 563 | static int qib_pcie_caps; |
564 | module_param_named(pcie_caps, qib_pcie_caps, int, S_IRUGO); | 564 | module_param_named(pcie_caps, qib_pcie_caps, int, S_IRUGO); |
565 | MODULE_PARM_DESC(pcie_caps, "Max PCIe tuning: Payload (0..3), ReadReq (4..7)"); | 565 | MODULE_PARM_DESC(pcie_caps, "Max PCIe tuning: Payload (0..3), ReadReq (4..7)"); |
566 | 566 | ||
diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.c b/drivers/infiniband/ulp/srpt/ib_srpt.c index cd5d05e22a77..2b73d43cd691 100644 --- a/drivers/infiniband/ulp/srpt/ib_srpt.c +++ b/drivers/infiniband/ulp/srpt/ib_srpt.c | |||
@@ -69,8 +69,8 @@ MODULE_LICENSE("Dual BSD/GPL"); | |||
69 | */ | 69 | */ |
70 | 70 | ||
71 | static u64 srpt_service_guid; | 71 | static u64 srpt_service_guid; |
72 | static spinlock_t srpt_dev_lock; /* Protects srpt_dev_list. */ | 72 | static DEFINE_SPINLOCK(srpt_dev_lock); /* Protects srpt_dev_list. */ |
73 | static struct list_head srpt_dev_list; /* List of srpt_device structures. */ | 73 | static LIST_HEAD(srpt_dev_list); /* List of srpt_device structures. */ |
74 | 74 | ||
75 | static unsigned srp_max_req_size = DEFAULT_MAX_REQ_SIZE; | 75 | static unsigned srp_max_req_size = DEFAULT_MAX_REQ_SIZE; |
76 | module_param(srp_max_req_size, int, 0444); | 76 | module_param(srp_max_req_size, int, 0444); |
@@ -687,6 +687,7 @@ err: | |||
687 | while (--i >= 0) | 687 | while (--i >= 0) |
688 | srpt_free_ioctx(sdev, ring[i], dma_size, dir); | 688 | srpt_free_ioctx(sdev, ring[i], dma_size, dir); |
689 | kfree(ring); | 689 | kfree(ring); |
690 | ring = NULL; | ||
690 | out: | 691 | out: |
691 | return ring; | 692 | return ring; |
692 | } | 693 | } |
@@ -2595,7 +2596,7 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id, | |||
2595 | } | 2596 | } |
2596 | 2597 | ||
2597 | ch->sess = transport_init_session(); | 2598 | ch->sess = transport_init_session(); |
2598 | if (!ch->sess) { | 2599 | if (IS_ERR(ch->sess)) { |
2599 | rej->reason = __constant_cpu_to_be32( | 2600 | rej->reason = __constant_cpu_to_be32( |
2600 | SRP_LOGIN_REJ_INSUFFICIENT_RESOURCES); | 2601 | SRP_LOGIN_REJ_INSUFFICIENT_RESOURCES); |
2601 | pr_debug("Failed to create session\n"); | 2602 | pr_debug("Failed to create session\n"); |
@@ -3264,8 +3265,7 @@ static void srpt_add_one(struct ib_device *device) | |||
3264 | for (i = 0; i < sdev->srq_size; ++i) | 3265 | for (i = 0; i < sdev->srq_size; ++i) |
3265 | srpt_post_recv(sdev, sdev->ioctx_ring[i]); | 3266 | srpt_post_recv(sdev, sdev->ioctx_ring[i]); |
3266 | 3267 | ||
3267 | WARN_ON(sdev->device->phys_port_cnt | 3268 | WARN_ON(sdev->device->phys_port_cnt > ARRAY_SIZE(sdev->port)); |
3268 | > sizeof(sdev->port)/sizeof(sdev->port[0])); | ||
3269 | 3269 | ||
3270 | for (i = 1; i <= sdev->device->phys_port_cnt; i++) { | 3270 | for (i = 1; i <= sdev->device->phys_port_cnt; i++) { |
3271 | sport = &sdev->port[i - 1]; | 3271 | sport = &sdev->port[i - 1]; |
@@ -4010,13 +4010,10 @@ static int __init srpt_init_module(void) | |||
4010 | goto out; | 4010 | goto out; |
4011 | } | 4011 | } |
4012 | 4012 | ||
4013 | spin_lock_init(&srpt_dev_lock); | ||
4014 | INIT_LIST_HEAD(&srpt_dev_list); | ||
4015 | |||
4016 | ret = -ENODEV; | ||
4017 | srpt_target = target_fabric_configfs_init(THIS_MODULE, "srpt"); | 4013 | srpt_target = target_fabric_configfs_init(THIS_MODULE, "srpt"); |
4018 | if (!srpt_target) { | 4014 | if (IS_ERR(srpt_target)) { |
4019 | printk(KERN_ERR "couldn't register\n"); | 4015 | printk(KERN_ERR "couldn't register\n"); |
4016 | ret = PTR_ERR(srpt_target); | ||
4020 | goto out; | 4017 | goto out; |
4021 | } | 4018 | } |
4022 | 4019 | ||
diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.h b/drivers/infiniband/ulp/srpt/ib_srpt.h index b4b4bbcd7f16..61e52b830816 100644 --- a/drivers/infiniband/ulp/srpt/ib_srpt.h +++ b/drivers/infiniband/ulp/srpt/ib_srpt.h | |||
@@ -35,7 +35,6 @@ | |||
35 | #ifndef IB_SRPT_H | 35 | #ifndef IB_SRPT_H |
36 | #define IB_SRPT_H | 36 | #define IB_SRPT_H |
37 | 37 | ||
38 | #include <linux/version.h> | ||
39 | #include <linux/types.h> | 38 | #include <linux/types.h> |
40 | #include <linux/list.h> | 39 | #include <linux/list.h> |
41 | #include <linux/wait.h> | 40 | #include <linux/wait.h> |
diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c index 76457d50bc34..afc166fcc3d9 100644 --- a/drivers/input/evdev.c +++ b/drivers/input/evdev.c | |||
@@ -386,7 +386,7 @@ static ssize_t evdev_read(struct file *file, char __user *buffer, | |||
386 | struct evdev_client *client = file->private_data; | 386 | struct evdev_client *client = file->private_data; |
387 | struct evdev *evdev = client->evdev; | 387 | struct evdev *evdev = client->evdev; |
388 | struct input_event event; | 388 | struct input_event event; |
389 | int retval; | 389 | int retval = 0; |
390 | 390 | ||
391 | if (count < input_event_size()) | 391 | if (count < input_event_size()) |
392 | return -EINVAL; | 392 | return -EINVAL; |
diff --git a/drivers/input/keyboard/twl4030_keypad.c b/drivers/input/keyboard/twl4030_keypad.c index a588578037eb..67bec14e8b96 100644 --- a/drivers/input/keyboard/twl4030_keypad.c +++ b/drivers/input/keyboard/twl4030_keypad.c | |||
@@ -34,7 +34,6 @@ | |||
34 | #include <linux/i2c/twl.h> | 34 | #include <linux/i2c/twl.h> |
35 | #include <linux/slab.h> | 35 | #include <linux/slab.h> |
36 | 36 | ||
37 | |||
38 | /* | 37 | /* |
39 | * The TWL4030 family chips include a keypad controller that supports | 38 | * The TWL4030 family chips include a keypad controller that supports |
40 | * up to an 8x8 switch matrix. The controller can issue system wakeup | 39 | * up to an 8x8 switch matrix. The controller can issue system wakeup |
@@ -302,7 +301,7 @@ static int __devinit twl4030_kp_program(struct twl4030_keypad *kp) | |||
302 | if (twl4030_kpwrite_u8(kp, i, KEYP_DEB) < 0) | 301 | if (twl4030_kpwrite_u8(kp, i, KEYP_DEB) < 0) |
303 | return -EIO; | 302 | return -EIO; |
304 | 303 | ||
305 | /* Set timeout period to 100 ms */ | 304 | /* Set timeout period to 200 ms */ |
306 | i = KEYP_PERIOD_US(200000, PTV_PRESCALER); | 305 | i = KEYP_PERIOD_US(200000, PTV_PRESCALER); |
307 | if (twl4030_kpwrite_u8(kp, (i & 0xFF), KEYP_TIMEOUT_L) < 0) | 306 | if (twl4030_kpwrite_u8(kp, (i & 0xFF), KEYP_TIMEOUT_L) < 0) |
308 | return -EIO; | 307 | return -EIO; |
@@ -466,4 +465,3 @@ MODULE_AUTHOR("Texas Instruments"); | |||
466 | MODULE_DESCRIPTION("TWL4030 Keypad Driver"); | 465 | MODULE_DESCRIPTION("TWL4030 Keypad Driver"); |
467 | MODULE_LICENSE("GPL"); | 466 | MODULE_LICENSE("GPL"); |
468 | MODULE_ALIAS("platform:twl4030_keypad"); | 467 | MODULE_ALIAS("platform:twl4030_keypad"); |
469 | |||
diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h index b4cfc6c8be89..5ec774d6c82b 100644 --- a/drivers/input/serio/i8042-x86ia64io.h +++ b/drivers/input/serio/i8042-x86ia64io.h | |||
@@ -512,6 +512,13 @@ static const struct dmi_system_id __initconst i8042_dmi_reset_table[] = { | |||
512 | DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1720"), | 512 | DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1720"), |
513 | }, | 513 | }, |
514 | }, | 514 | }, |
515 | { | ||
516 | /* Lenovo Ideapad U455 */ | ||
517 | .matches = { | ||
518 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
519 | DMI_MATCH(DMI_PRODUCT_NAME, "20046"), | ||
520 | }, | ||
521 | }, | ||
515 | { } | 522 | { } |
516 | }; | 523 | }; |
517 | 524 | ||
diff --git a/drivers/input/serio/serio_raw.c b/drivers/input/serio/serio_raw.c index 8250299fd64f..4494233d331a 100644 --- a/drivers/input/serio/serio_raw.c +++ b/drivers/input/serio/serio_raw.c | |||
@@ -164,7 +164,8 @@ static ssize_t serio_raw_read(struct file *file, char __user *buffer, | |||
164 | struct serio_raw_client *client = file->private_data; | 164 | struct serio_raw_client *client = file->private_data; |
165 | struct serio_raw *serio_raw = client->serio_raw; | 165 | struct serio_raw *serio_raw = client->serio_raw; |
166 | char uninitialized_var(c); | 166 | char uninitialized_var(c); |
167 | ssize_t retval = 0; | 167 | ssize_t read = 0; |
168 | int retval; | ||
168 | 169 | ||
169 | if (serio_raw->dead) | 170 | if (serio_raw->dead) |
170 | return -ENODEV; | 171 | return -ENODEV; |
@@ -180,13 +181,15 @@ static ssize_t serio_raw_read(struct file *file, char __user *buffer, | |||
180 | if (serio_raw->dead) | 181 | if (serio_raw->dead) |
181 | return -ENODEV; | 182 | return -ENODEV; |
182 | 183 | ||
183 | while (retval < count && serio_raw_fetch_byte(serio_raw, &c)) { | 184 | while (read < count && serio_raw_fetch_byte(serio_raw, &c)) { |
184 | if (put_user(c, buffer++)) | 185 | if (put_user(c, buffer++)) { |
185 | return -EFAULT; | 186 | retval = -EFAULT; |
186 | retval++; | 187 | break; |
188 | } | ||
189 | read++; | ||
187 | } | 190 | } |
188 | 191 | ||
189 | return retval; | 192 | return read ?: retval; |
190 | } | 193 | } |
191 | 194 | ||
192 | static ssize_t serio_raw_write(struct file *file, const char __user *buffer, | 195 | static ssize_t serio_raw_write(struct file *file, const char __user *buffer, |
diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c index cce1f03b8895..f75e0608be5b 100644 --- a/drivers/iommu/amd_iommu.c +++ b/drivers/iommu/amd_iommu.c | |||
@@ -2863,6 +2863,9 @@ static unsigned device_dma_ops_init(void) | |||
2863 | 2863 | ||
2864 | for_each_pci_dev(pdev) { | 2864 | for_each_pci_dev(pdev) { |
2865 | if (!check_device(&pdev->dev)) { | 2865 | if (!check_device(&pdev->dev)) { |
2866 | |||
2867 | iommu_ignore_device(&pdev->dev); | ||
2868 | |||
2866 | unhandled += 1; | 2869 | unhandled += 1; |
2867 | continue; | 2870 | continue; |
2868 | } | 2871 | } |
diff --git a/drivers/iommu/msm_iommu.c b/drivers/iommu/msm_iommu.c index 08a90b88e40d..cee307e86606 100644 --- a/drivers/iommu/msm_iommu.c +++ b/drivers/iommu/msm_iommu.c | |||
@@ -482,23 +482,19 @@ static size_t msm_iommu_unmap(struct iommu_domain *domain, unsigned long va, | |||
482 | 482 | ||
483 | priv = domain->priv; | 483 | priv = domain->priv; |
484 | 484 | ||
485 | if (!priv) { | 485 | if (!priv) |
486 | ret = -ENODEV; | ||
487 | goto fail; | 486 | goto fail; |
488 | } | ||
489 | 487 | ||
490 | fl_table = priv->pgtable; | 488 | fl_table = priv->pgtable; |
491 | 489 | ||
492 | if (len != SZ_16M && len != SZ_1M && | 490 | if (len != SZ_16M && len != SZ_1M && |
493 | len != SZ_64K && len != SZ_4K) { | 491 | len != SZ_64K && len != SZ_4K) { |
494 | pr_debug("Bad length: %d\n", len); | 492 | pr_debug("Bad length: %d\n", len); |
495 | ret = -EINVAL; | ||
496 | goto fail; | 493 | goto fail; |
497 | } | 494 | } |
498 | 495 | ||
499 | if (!fl_table) { | 496 | if (!fl_table) { |
500 | pr_debug("Null page table\n"); | 497 | pr_debug("Null page table\n"); |
501 | ret = -EINVAL; | ||
502 | goto fail; | 498 | goto fail; |
503 | } | 499 | } |
504 | 500 | ||
@@ -507,7 +503,6 @@ static size_t msm_iommu_unmap(struct iommu_domain *domain, unsigned long va, | |||
507 | 503 | ||
508 | if (*fl_pte == 0) { | 504 | if (*fl_pte == 0) { |
509 | pr_debug("First level PTE is 0\n"); | 505 | pr_debug("First level PTE is 0\n"); |
510 | ret = -ENODEV; | ||
511 | goto fail; | 506 | goto fail; |
512 | } | 507 | } |
513 | 508 | ||
diff --git a/drivers/leds/leds-lm3530.c b/drivers/leds/leds-lm3530.c index 45e6878d7374..e59c166a0ce2 100644 --- a/drivers/leds/leds-lm3530.c +++ b/drivers/leds/leds-lm3530.c | |||
@@ -164,8 +164,8 @@ static int lm3530_init_registers(struct lm3530_data *drvdata) | |||
164 | 164 | ||
165 | if (drvdata->mode == LM3530_BL_MODE_ALS) { | 165 | if (drvdata->mode == LM3530_BL_MODE_ALS) { |
166 | if (pltfm->als_vmax == 0) { | 166 | if (pltfm->als_vmax == 0) { |
167 | pltfm->als_vmin = als_vmin = 0; | 167 | pltfm->als_vmin = 0; |
168 | pltfm->als_vmin = als_vmax = LM3530_ALS_WINDOW_mV; | 168 | pltfm->als_vmax = LM3530_ALS_WINDOW_mV; |
169 | } | 169 | } |
170 | 170 | ||
171 | als_vmin = pltfm->als_vmin; | 171 | als_vmin = pltfm->als_vmin; |
diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c index c2907d836e4e..86cb7e5d83d5 100644 --- a/drivers/md/dm-raid.c +++ b/drivers/md/dm-raid.c | |||
@@ -56,7 +56,8 @@ struct raid_dev { | |||
56 | struct raid_set { | 56 | struct raid_set { |
57 | struct dm_target *ti; | 57 | struct dm_target *ti; |
58 | 58 | ||
59 | uint64_t print_flags; | 59 | uint32_t bitmap_loaded; |
60 | uint32_t print_flags; | ||
60 | 61 | ||
61 | struct mddev md; | 62 | struct mddev md; |
62 | struct raid_type *raid_type; | 63 | struct raid_type *raid_type; |
@@ -1085,7 +1086,7 @@ static int raid_status(struct dm_target *ti, status_type_t type, | |||
1085 | raid_param_cnt += 2; | 1086 | raid_param_cnt += 2; |
1086 | } | 1087 | } |
1087 | 1088 | ||
1088 | raid_param_cnt += (hweight64(rs->print_flags & ~DMPF_REBUILD) * 2); | 1089 | raid_param_cnt += (hweight32(rs->print_flags & ~DMPF_REBUILD) * 2); |
1089 | if (rs->print_flags & (DMPF_SYNC | DMPF_NOSYNC)) | 1090 | if (rs->print_flags & (DMPF_SYNC | DMPF_NOSYNC)) |
1090 | raid_param_cnt--; | 1091 | raid_param_cnt--; |
1091 | 1092 | ||
@@ -1197,7 +1198,12 @@ static void raid_resume(struct dm_target *ti) | |||
1197 | { | 1198 | { |
1198 | struct raid_set *rs = ti->private; | 1199 | struct raid_set *rs = ti->private; |
1199 | 1200 | ||
1200 | bitmap_load(&rs->md); | 1201 | if (!rs->bitmap_loaded) { |
1202 | bitmap_load(&rs->md); | ||
1203 | rs->bitmap_loaded = 1; | ||
1204 | } else | ||
1205 | md_wakeup_thread(rs->md.thread); | ||
1206 | |||
1201 | mddev_resume(&rs->md); | 1207 | mddev_resume(&rs->md); |
1202 | } | 1208 | } |
1203 | 1209 | ||
diff --git a/drivers/md/md.c b/drivers/md/md.c index 9417ae2fa0bb..ce88755baf4a 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
@@ -7333,7 +7333,8 @@ void md_do_sync(struct mddev *mddev) | |||
7333 | printk(KERN_INFO | 7333 | printk(KERN_INFO |
7334 | "md: checkpointing %s of %s.\n", | 7334 | "md: checkpointing %s of %s.\n", |
7335 | desc, mdname(mddev)); | 7335 | desc, mdname(mddev)); |
7336 | mddev->recovery_cp = mddev->curr_resync; | 7336 | mddev->recovery_cp = |
7337 | mddev->curr_resync_completed; | ||
7337 | } | 7338 | } |
7338 | } else | 7339 | } else |
7339 | mddev->recovery_cp = MaxSector; | 7340 | mddev->recovery_cp = MaxSector; |
@@ -7351,9 +7352,9 @@ void md_do_sync(struct mddev *mddev) | |||
7351 | rcu_read_unlock(); | 7352 | rcu_read_unlock(); |
7352 | } | 7353 | } |
7353 | } | 7354 | } |
7355 | skip: | ||
7354 | set_bit(MD_CHANGE_DEVS, &mddev->flags); | 7356 | set_bit(MD_CHANGE_DEVS, &mddev->flags); |
7355 | 7357 | ||
7356 | skip: | ||
7357 | if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery)) { | 7358 | if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery)) { |
7358 | /* We completed so min/max setting can be forgotten if used. */ | 7359 | /* We completed so min/max setting can be forgotten if used. */ |
7359 | if (test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) | 7360 | if (test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) |
diff --git a/drivers/mfd/twl6040-core.c b/drivers/mfd/twl6040-core.c index dda86293dc9f..b2d8e512d3cb 100644 --- a/drivers/mfd/twl6040-core.c +++ b/drivers/mfd/twl6040-core.c | |||
@@ -282,6 +282,7 @@ int twl6040_power(struct twl6040 *twl6040, int on) | |||
282 | /* Default PLL configuration after power up */ | 282 | /* Default PLL configuration after power up */ |
283 | twl6040->pll = TWL6040_SYSCLK_SEL_LPPLL; | 283 | twl6040->pll = TWL6040_SYSCLK_SEL_LPPLL; |
284 | twl6040->sysclk = 19200000; | 284 | twl6040->sysclk = 19200000; |
285 | twl6040->mclk = 32768; | ||
285 | } else { | 286 | } else { |
286 | /* already powered-down */ | 287 | /* already powered-down */ |
287 | if (!twl6040->power_count) { | 288 | if (!twl6040->power_count) { |
@@ -305,6 +306,7 @@ int twl6040_power(struct twl6040 *twl6040, int on) | |||
305 | twl6040_power_down(twl6040); | 306 | twl6040_power_down(twl6040); |
306 | } | 307 | } |
307 | twl6040->sysclk = 0; | 308 | twl6040->sysclk = 0; |
309 | twl6040->mclk = 0; | ||
308 | } | 310 | } |
309 | 311 | ||
310 | out: | 312 | out: |
@@ -324,23 +326,38 @@ int twl6040_set_pll(struct twl6040 *twl6040, int pll_id, | |||
324 | hppllctl = twl6040_reg_read(twl6040, TWL6040_REG_HPPLLCTL); | 326 | hppllctl = twl6040_reg_read(twl6040, TWL6040_REG_HPPLLCTL); |
325 | lppllctl = twl6040_reg_read(twl6040, TWL6040_REG_LPPLLCTL); | 327 | lppllctl = twl6040_reg_read(twl6040, TWL6040_REG_LPPLLCTL); |
326 | 328 | ||
329 | /* Force full reconfiguration when switching between PLL */ | ||
330 | if (pll_id != twl6040->pll) { | ||
331 | twl6040->sysclk = 0; | ||
332 | twl6040->mclk = 0; | ||
333 | } | ||
334 | |||
327 | switch (pll_id) { | 335 | switch (pll_id) { |
328 | case TWL6040_SYSCLK_SEL_LPPLL: | 336 | case TWL6040_SYSCLK_SEL_LPPLL: |
329 | /* low-power PLL divider */ | 337 | /* low-power PLL divider */ |
330 | switch (freq_out) { | 338 | /* Change the sysclk configuration only if it has been canged */ |
331 | case 17640000: | 339 | if (twl6040->sysclk != freq_out) { |
332 | lppllctl |= TWL6040_LPLLFIN; | 340 | switch (freq_out) { |
333 | break; | 341 | case 17640000: |
334 | case 19200000: | 342 | lppllctl |= TWL6040_LPLLFIN; |
335 | lppllctl &= ~TWL6040_LPLLFIN; | 343 | break; |
336 | break; | 344 | case 19200000: |
337 | default: | 345 | lppllctl &= ~TWL6040_LPLLFIN; |
338 | dev_err(twl6040->dev, | 346 | break; |
339 | "freq_out %d not supported\n", freq_out); | 347 | default: |
340 | ret = -EINVAL; | 348 | dev_err(twl6040->dev, |
341 | goto pll_out; | 349 | "freq_out %d not supported\n", |
350 | freq_out); | ||
351 | ret = -EINVAL; | ||
352 | goto pll_out; | ||
353 | } | ||
354 | twl6040_reg_write(twl6040, TWL6040_REG_LPPLLCTL, | ||
355 | lppllctl); | ||
342 | } | 356 | } |
343 | twl6040_reg_write(twl6040, TWL6040_REG_LPPLLCTL, lppllctl); | 357 | |
358 | /* The PLL in use has not been change, we can exit */ | ||
359 | if (twl6040->pll == pll_id) | ||
360 | break; | ||
344 | 361 | ||
345 | switch (freq_in) { | 362 | switch (freq_in) { |
346 | case 32768: | 363 | case 32768: |
@@ -371,48 +388,56 @@ int twl6040_set_pll(struct twl6040 *twl6040, int pll_id, | |||
371 | goto pll_out; | 388 | goto pll_out; |
372 | } | 389 | } |
373 | 390 | ||
374 | hppllctl &= ~TWL6040_MCLK_MSK; | 391 | if (twl6040->mclk != freq_in) { |
392 | hppllctl &= ~TWL6040_MCLK_MSK; | ||
393 | |||
394 | switch (freq_in) { | ||
395 | case 12000000: | ||
396 | /* PLL enabled, active mode */ | ||
397 | hppllctl |= TWL6040_MCLK_12000KHZ | | ||
398 | TWL6040_HPLLENA; | ||
399 | break; | ||
400 | case 19200000: | ||
401 | /* | ||
402 | * PLL disabled | ||
403 | * (enable PLL if MCLK jitter quality | ||
404 | * doesn't meet specification) | ||
405 | */ | ||
406 | hppllctl |= TWL6040_MCLK_19200KHZ; | ||
407 | break; | ||
408 | case 26000000: | ||
409 | /* PLL enabled, active mode */ | ||
410 | hppllctl |= TWL6040_MCLK_26000KHZ | | ||
411 | TWL6040_HPLLENA; | ||
412 | break; | ||
413 | case 38400000: | ||
414 | /* PLL enabled, active mode */ | ||
415 | hppllctl |= TWL6040_MCLK_38400KHZ | | ||
416 | TWL6040_HPLLENA; | ||
417 | break; | ||
418 | default: | ||
419 | dev_err(twl6040->dev, | ||
420 | "freq_in %d not supported\n", freq_in); | ||
421 | ret = -EINVAL; | ||
422 | goto pll_out; | ||
423 | } | ||
375 | 424 | ||
376 | switch (freq_in) { | ||
377 | case 12000000: | ||
378 | /* PLL enabled, active mode */ | ||
379 | hppllctl |= TWL6040_MCLK_12000KHZ | | ||
380 | TWL6040_HPLLENA; | ||
381 | break; | ||
382 | case 19200000: | ||
383 | /* | 425 | /* |
384 | * PLL disabled | 426 | * enable clock slicer to ensure input waveform is |
385 | * (enable PLL if MCLK jitter quality | 427 | * square |
386 | * doesn't meet specification) | ||
387 | */ | 428 | */ |
388 | hppllctl |= TWL6040_MCLK_19200KHZ; | 429 | hppllctl |= TWL6040_HPLLSQRENA; |
389 | break; | ||
390 | case 26000000: | ||
391 | /* PLL enabled, active mode */ | ||
392 | hppllctl |= TWL6040_MCLK_26000KHZ | | ||
393 | TWL6040_HPLLENA; | ||
394 | break; | ||
395 | case 38400000: | ||
396 | /* PLL enabled, active mode */ | ||
397 | hppllctl |= TWL6040_MCLK_38400KHZ | | ||
398 | TWL6040_HPLLENA; | ||
399 | break; | ||
400 | default: | ||
401 | dev_err(twl6040->dev, | ||
402 | "freq_in %d not supported\n", freq_in); | ||
403 | ret = -EINVAL; | ||
404 | goto pll_out; | ||
405 | } | ||
406 | 430 | ||
407 | /* enable clock slicer to ensure input waveform is square */ | 431 | twl6040_reg_write(twl6040, TWL6040_REG_HPPLLCTL, |
408 | hppllctl |= TWL6040_HPLLSQRENA; | 432 | hppllctl); |
409 | 433 | usleep_range(500, 700); | |
410 | twl6040_reg_write(twl6040, TWL6040_REG_HPPLLCTL, hppllctl); | 434 | lppllctl |= TWL6040_HPLLSEL; |
411 | usleep_range(500, 700); | 435 | twl6040_reg_write(twl6040, TWL6040_REG_LPPLLCTL, |
412 | lppllctl |= TWL6040_HPLLSEL; | 436 | lppllctl); |
413 | twl6040_reg_write(twl6040, TWL6040_REG_LPPLLCTL, lppllctl); | 437 | lppllctl &= ~TWL6040_LPLLENA; |
414 | lppllctl &= ~TWL6040_LPLLENA; | 438 | twl6040_reg_write(twl6040, TWL6040_REG_LPPLLCTL, |
415 | twl6040_reg_write(twl6040, TWL6040_REG_LPPLLCTL, lppllctl); | 439 | lppllctl); |
440 | } | ||
416 | break; | 441 | break; |
417 | default: | 442 | default: |
418 | dev_err(twl6040->dev, "unknown pll id %d\n", pll_id); | 443 | dev_err(twl6040->dev, "unknown pll id %d\n", pll_id); |
@@ -421,6 +446,7 @@ int twl6040_set_pll(struct twl6040 *twl6040, int pll_id, | |||
421 | } | 446 | } |
422 | 447 | ||
423 | twl6040->sysclk = freq_out; | 448 | twl6040->sysclk = freq_out; |
449 | twl6040->mclk = freq_in; | ||
424 | twl6040->pll = pll_id; | 450 | twl6040->pll = pll_id; |
425 | 451 | ||
426 | pll_out: | 452 | pll_out: |
diff --git a/drivers/misc/lkdtm.c b/drivers/misc/lkdtm.c index 150cd7061b80..28adefe70f96 100644 --- a/drivers/misc/lkdtm.c +++ b/drivers/misc/lkdtm.c | |||
@@ -354,6 +354,7 @@ static void lkdtm_do_action(enum ctype which) | |||
354 | static void lkdtm_handler(void) | 354 | static void lkdtm_handler(void) |
355 | { | 355 | { |
356 | unsigned long flags; | 356 | unsigned long flags; |
357 | bool do_it = false; | ||
357 | 358 | ||
358 | spin_lock_irqsave(&count_lock, flags); | 359 | spin_lock_irqsave(&count_lock, flags); |
359 | count--; | 360 | count--; |
@@ -361,10 +362,13 @@ static void lkdtm_handler(void) | |||
361 | cp_name_to_str(cpoint), cp_type_to_str(cptype), count); | 362 | cp_name_to_str(cpoint), cp_type_to_str(cptype), count); |
362 | 363 | ||
363 | if (count == 0) { | 364 | if (count == 0) { |
364 | lkdtm_do_action(cptype); | 365 | do_it = true; |
365 | count = cpoint_count; | 366 | count = cpoint_count; |
366 | } | 367 | } |
367 | spin_unlock_irqrestore(&count_lock, flags); | 368 | spin_unlock_irqrestore(&count_lock, flags); |
369 | |||
370 | if (do_it) | ||
371 | lkdtm_do_action(cptype); | ||
368 | } | 372 | } |
369 | 373 | ||
370 | static int lkdtm_register_cpoint(enum cname which) | 374 | static int lkdtm_register_cpoint(enum cname which) |
diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c index 6ae9ca01388b..9a9ce71a71fc 100644 --- a/drivers/mtd/mtdcore.c +++ b/drivers/mtd/mtdcore.c | |||
@@ -119,7 +119,7 @@ static int mtd_cls_suspend(struct device *dev, pm_message_t state) | |||
119 | { | 119 | { |
120 | struct mtd_info *mtd = dev_get_drvdata(dev); | 120 | struct mtd_info *mtd = dev_get_drvdata(dev); |
121 | 121 | ||
122 | return mtd_suspend(mtd); | 122 | return mtd ? mtd_suspend(mtd) : 0; |
123 | } | 123 | } |
124 | 124 | ||
125 | static int mtd_cls_resume(struct device *dev) | 125 | static int mtd_cls_resume(struct device *dev) |
diff --git a/drivers/mtd/nand/atmel_nand.c b/drivers/mtd/nand/atmel_nand.c index 4dd056e2e16a..35b4fb55dbd6 100644 --- a/drivers/mtd/nand/atmel_nand.c +++ b/drivers/mtd/nand/atmel_nand.c | |||
@@ -161,6 +161,37 @@ static int atmel_nand_device_ready(struct mtd_info *mtd) | |||
161 | !!host->board->rdy_pin_active_low; | 161 | !!host->board->rdy_pin_active_low; |
162 | } | 162 | } |
163 | 163 | ||
164 | /* | ||
165 | * Minimal-overhead PIO for data access. | ||
166 | */ | ||
167 | static void atmel_read_buf8(struct mtd_info *mtd, u8 *buf, int len) | ||
168 | { | ||
169 | struct nand_chip *nand_chip = mtd->priv; | ||
170 | |||
171 | __raw_readsb(nand_chip->IO_ADDR_R, buf, len); | ||
172 | } | ||
173 | |||
174 | static void atmel_read_buf16(struct mtd_info *mtd, u8 *buf, int len) | ||
175 | { | ||
176 | struct nand_chip *nand_chip = mtd->priv; | ||
177 | |||
178 | __raw_readsw(nand_chip->IO_ADDR_R, buf, len / 2); | ||
179 | } | ||
180 | |||
181 | static void atmel_write_buf8(struct mtd_info *mtd, const u8 *buf, int len) | ||
182 | { | ||
183 | struct nand_chip *nand_chip = mtd->priv; | ||
184 | |||
185 | __raw_writesb(nand_chip->IO_ADDR_W, buf, len); | ||
186 | } | ||
187 | |||
188 | static void atmel_write_buf16(struct mtd_info *mtd, const u8 *buf, int len) | ||
189 | { | ||
190 | struct nand_chip *nand_chip = mtd->priv; | ||
191 | |||
192 | __raw_writesw(nand_chip->IO_ADDR_W, buf, len / 2); | ||
193 | } | ||
194 | |||
164 | static void dma_complete_func(void *completion) | 195 | static void dma_complete_func(void *completion) |
165 | { | 196 | { |
166 | complete(completion); | 197 | complete(completion); |
@@ -235,27 +266,33 @@ err_buf: | |||
235 | static void atmel_read_buf(struct mtd_info *mtd, u8 *buf, int len) | 266 | static void atmel_read_buf(struct mtd_info *mtd, u8 *buf, int len) |
236 | { | 267 | { |
237 | struct nand_chip *chip = mtd->priv; | 268 | struct nand_chip *chip = mtd->priv; |
269 | struct atmel_nand_host *host = chip->priv; | ||
238 | 270 | ||
239 | if (use_dma && len > mtd->oobsize) | 271 | if (use_dma && len > mtd->oobsize) |
240 | /* only use DMA for bigger than oob size: better performances */ | 272 | /* only use DMA for bigger than oob size: better performances */ |
241 | if (atmel_nand_dma_op(mtd, buf, len, 1) == 0) | 273 | if (atmel_nand_dma_op(mtd, buf, len, 1) == 0) |
242 | return; | 274 | return; |
243 | 275 | ||
244 | /* if no DMA operation possible, use PIO */ | 276 | if (host->board->bus_width_16) |
245 | memcpy_fromio(buf, chip->IO_ADDR_R, len); | 277 | atmel_read_buf16(mtd, buf, len); |
278 | else | ||
279 | atmel_read_buf8(mtd, buf, len); | ||
246 | } | 280 | } |
247 | 281 | ||
248 | static void atmel_write_buf(struct mtd_info *mtd, const u8 *buf, int len) | 282 | static void atmel_write_buf(struct mtd_info *mtd, const u8 *buf, int len) |
249 | { | 283 | { |
250 | struct nand_chip *chip = mtd->priv; | 284 | struct nand_chip *chip = mtd->priv; |
285 | struct atmel_nand_host *host = chip->priv; | ||
251 | 286 | ||
252 | if (use_dma && len > mtd->oobsize) | 287 | if (use_dma && len > mtd->oobsize) |
253 | /* only use DMA for bigger than oob size: better performances */ | 288 | /* only use DMA for bigger than oob size: better performances */ |
254 | if (atmel_nand_dma_op(mtd, (void *)buf, len, 0) == 0) | 289 | if (atmel_nand_dma_op(mtd, (void *)buf, len, 0) == 0) |
255 | return; | 290 | return; |
256 | 291 | ||
257 | /* if no DMA operation possible, use PIO */ | 292 | if (host->board->bus_width_16) |
258 | memcpy_toio(chip->IO_ADDR_W, buf, len); | 293 | atmel_write_buf16(mtd, buf, len); |
294 | else | ||
295 | atmel_write_buf8(mtd, buf, len); | ||
259 | } | 296 | } |
260 | 297 | ||
261 | /* | 298 | /* |
diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-lib.c b/drivers/mtd/nand/gpmi-nand/gpmi-lib.c index 7f680420bfab..7db6555ed3ba 100644 --- a/drivers/mtd/nand/gpmi-nand/gpmi-lib.c +++ b/drivers/mtd/nand/gpmi-nand/gpmi-lib.c | |||
@@ -69,17 +69,19 @@ static int clear_poll_bit(void __iomem *addr, u32 mask) | |||
69 | * [1] enable the module. | 69 | * [1] enable the module. |
70 | * [2] reset the module. | 70 | * [2] reset the module. |
71 | * | 71 | * |
72 | * In most of the cases, it's ok. But there is a hardware bug in the BCH block. | 72 | * In most of the cases, it's ok. |
73 | * But in MX23, there is a hardware bug in the BCH block (see erratum #2847). | ||
73 | * If you try to soft reset the BCH block, it becomes unusable until | 74 | * If you try to soft reset the BCH block, it becomes unusable until |
74 | * the next hard reset. This case occurs in the NAND boot mode. When the board | 75 | * the next hard reset. This case occurs in the NAND boot mode. When the board |
75 | * boots by NAND, the ROM of the chip will initialize the BCH blocks itself. | 76 | * boots by NAND, the ROM of the chip will initialize the BCH blocks itself. |
76 | * So If the driver tries to reset the BCH again, the BCH will not work anymore. | 77 | * So If the driver tries to reset the BCH again, the BCH will not work anymore. |
77 | * You will see a DMA timeout in this case. | 78 | * You will see a DMA timeout in this case. The bug has been fixed |
79 | * in the following chips, such as MX28. | ||
78 | * | 80 | * |
79 | * To avoid this bug, just add a new parameter `just_enable` for | 81 | * To avoid this bug, just add a new parameter `just_enable` for |
80 | * the mxs_reset_block(), and rewrite it here. | 82 | * the mxs_reset_block(), and rewrite it here. |
81 | */ | 83 | */ |
82 | int gpmi_reset_block(void __iomem *reset_addr, bool just_enable) | 84 | static int gpmi_reset_block(void __iomem *reset_addr, bool just_enable) |
83 | { | 85 | { |
84 | int ret; | 86 | int ret; |
85 | int timeout = 0x400; | 87 | int timeout = 0x400; |
@@ -206,7 +208,15 @@ int bch_set_geometry(struct gpmi_nand_data *this) | |||
206 | if (ret) | 208 | if (ret) |
207 | goto err_out; | 209 | goto err_out; |
208 | 210 | ||
209 | ret = gpmi_reset_block(r->bch_regs, true); | 211 | /* |
212 | * Due to erratum #2847 of the MX23, the BCH cannot be soft reset on this | ||
213 | * chip, otherwise it will lock up. So we skip resetting BCH on the MX23. | ||
214 | * On the other hand, the MX28 needs the reset, because one case has been | ||
215 | * seen where the BCH produced ECC errors constantly after 10000 | ||
216 | * consecutive reboots. The latter case has not been seen on the MX23 yet, | ||
217 | * still we don't know if it could happen there as well. | ||
218 | */ | ||
219 | ret = gpmi_reset_block(r->bch_regs, GPMI_IS_MX23(this)); | ||
210 | if (ret) | 220 | if (ret) |
211 | goto err_out; | 221 | goto err_out; |
212 | 222 | ||
diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c index 35b4565050f1..8a393f9e6027 100644 --- a/drivers/mtd/nand/nand_base.c +++ b/drivers/mtd/nand/nand_base.c | |||
@@ -2588,7 +2588,7 @@ int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr, | |||
2588 | instr->state = MTD_ERASING; | 2588 | instr->state = MTD_ERASING; |
2589 | 2589 | ||
2590 | while (len) { | 2590 | while (len) { |
2591 | /* Heck if we have a bad block, we do not erase bad blocks! */ | 2591 | /* Check if we have a bad block, we do not erase bad blocks! */ |
2592 | if (nand_block_checkbad(mtd, ((loff_t) page) << | 2592 | if (nand_block_checkbad(mtd, ((loff_t) page) << |
2593 | chip->page_shift, 0, allowbbt)) { | 2593 | chip->page_shift, 0, allowbbt)) { |
2594 | pr_warn("%s: attempt to erase a bad block at page 0x%08x\n", | 2594 | pr_warn("%s: attempt to erase a bad block at page 0x%08x\n", |
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/pcmcia/ds.c b/drivers/pcmcia/ds.c index 749c2a16012c..1932029de48d 100644 --- a/drivers/pcmcia/ds.c +++ b/drivers/pcmcia/ds.c | |||
@@ -1269,10 +1269,8 @@ static int pcmcia_bus_add(struct pcmcia_socket *skt) | |||
1269 | 1269 | ||
1270 | static int pcmcia_bus_early_resume(struct pcmcia_socket *skt) | 1270 | static int pcmcia_bus_early_resume(struct pcmcia_socket *skt) |
1271 | { | 1271 | { |
1272 | if (!verify_cis_cache(skt)) { | 1272 | if (!verify_cis_cache(skt)) |
1273 | pcmcia_put_socket(skt); | ||
1274 | return 0; | 1273 | return 0; |
1275 | } | ||
1276 | 1274 | ||
1277 | dev_dbg(&skt->dev, "cis mismatch - different card\n"); | 1275 | dev_dbg(&skt->dev, "cis mismatch - different card\n"); |
1278 | 1276 | ||
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/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/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/spi/Kconfig b/drivers/spi/Kconfig index 3f9a47ec67dc..8293658e7cf9 100644 --- a/drivers/spi/Kconfig +++ b/drivers/spi/Kconfig | |||
@@ -299,7 +299,7 @@ config SPI_S3C24XX_FIQ | |||
299 | 299 | ||
300 | config SPI_S3C64XX | 300 | config SPI_S3C64XX |
301 | tristate "Samsung S3C64XX series type SPI" | 301 | tristate "Samsung S3C64XX series type SPI" |
302 | depends on (ARCH_S3C64XX || ARCH_S5P64X0) | 302 | depends on (ARCH_S3C64XX || ARCH_S5P64X0 || ARCH_EXYNOS) |
303 | select S3C64XX_DMA if ARCH_S3C64XX | 303 | select S3C64XX_DMA if ARCH_S3C64XX |
304 | help | 304 | help |
305 | SPI driver for Samsung S3C64XX and newer SoCs. | 305 | SPI driver for Samsung S3C64XX and newer SoCs. |
diff --git a/drivers/spi/spi-topcliff-pch.c b/drivers/spi/spi-topcliff-pch.c index 2a6429d8c363..10182eb50068 100644 --- a/drivers/spi/spi-topcliff-pch.c +++ b/drivers/spi/spi-topcliff-pch.c | |||
@@ -1720,7 +1720,7 @@ static int pch_spi_resume(struct pci_dev *pdev) | |||
1720 | 1720 | ||
1721 | #endif | 1721 | #endif |
1722 | 1722 | ||
1723 | static struct pci_driver pch_spi_pcidev = { | 1723 | static struct pci_driver pch_spi_pcidev_driver = { |
1724 | .name = "pch_spi", | 1724 | .name = "pch_spi", |
1725 | .id_table = pch_spi_pcidev_id, | 1725 | .id_table = pch_spi_pcidev_id, |
1726 | .probe = pch_spi_probe, | 1726 | .probe = pch_spi_probe, |
@@ -1736,7 +1736,7 @@ static int __init pch_spi_init(void) | |||
1736 | if (ret) | 1736 | if (ret) |
1737 | return ret; | 1737 | return ret; |
1738 | 1738 | ||
1739 | ret = pci_register_driver(&pch_spi_pcidev); | 1739 | ret = pci_register_driver(&pch_spi_pcidev_driver); |
1740 | if (ret) | 1740 | if (ret) |
1741 | return ret; | 1741 | return ret; |
1742 | 1742 | ||
@@ -1746,7 +1746,7 @@ module_init(pch_spi_init); | |||
1746 | 1746 | ||
1747 | static void __exit pch_spi_exit(void) | 1747 | static void __exit pch_spi_exit(void) |
1748 | { | 1748 | { |
1749 | pci_unregister_driver(&pch_spi_pcidev); | 1749 | pci_unregister_driver(&pch_spi_pcidev_driver); |
1750 | platform_driver_unregister(&pch_spi_pd_driver); | 1750 | platform_driver_unregister(&pch_spi_pd_driver); |
1751 | } | 1751 | } |
1752 | module_exit(pch_spi_exit); | 1752 | module_exit(pch_spi_exit); |
diff --git a/drivers/staging/media/go7007/go7007-usb.c b/drivers/staging/media/go7007/go7007-usb.c index 70e006b50f29..5443e25086e9 100644 --- a/drivers/staging/media/go7007/go7007-usb.c +++ b/drivers/staging/media/go7007/go7007-usb.c | |||
@@ -1279,3 +1279,4 @@ static struct usb_driver go7007_usb_driver = { | |||
1279 | }; | 1279 | }; |
1280 | 1280 | ||
1281 | module_usb_driver(go7007_usb_driver); | 1281 | module_usb_driver(go7007_usb_driver); |
1282 | MODULE_LICENSE("GPL v2"); | ||
diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c index ac44af165b27..44262908def5 100644 --- a/drivers/target/iscsi/iscsi_target.c +++ b/drivers/target/iscsi/iscsi_target.c | |||
@@ -1061,7 +1061,7 @@ attach_cmd: | |||
1061 | if (ret < 0) | 1061 | if (ret < 0) |
1062 | return iscsit_add_reject_from_cmd( | 1062 | return iscsit_add_reject_from_cmd( |
1063 | ISCSI_REASON_BOOKMARK_NO_RESOURCES, | 1063 | ISCSI_REASON_BOOKMARK_NO_RESOURCES, |
1064 | 1, 1, buf, cmd); | 1064 | 1, 0, buf, cmd); |
1065 | /* | 1065 | /* |
1066 | * Check the CmdSN against ExpCmdSN/MaxCmdSN here if | 1066 | * Check the CmdSN against ExpCmdSN/MaxCmdSN here if |
1067 | * the Immediate Bit is not set, and no Immediate | 1067 | * the Immediate Bit is not set, and no Immediate |
@@ -3164,6 +3164,30 @@ static int iscsit_send_task_mgt_rsp( | |||
3164 | return 0; | 3164 | return 0; |
3165 | } | 3165 | } |
3166 | 3166 | ||
3167 | static bool iscsit_check_inaddr_any(struct iscsi_np *np) | ||
3168 | { | ||
3169 | bool ret = false; | ||
3170 | |||
3171 | if (np->np_sockaddr.ss_family == AF_INET6) { | ||
3172 | const struct sockaddr_in6 sin6 = { | ||
3173 | .sin6_addr = IN6ADDR_ANY_INIT }; | ||
3174 | struct sockaddr_in6 *sock_in6 = | ||
3175 | (struct sockaddr_in6 *)&np->np_sockaddr; | ||
3176 | |||
3177 | if (!memcmp(sock_in6->sin6_addr.s6_addr, | ||
3178 | sin6.sin6_addr.s6_addr, 16)) | ||
3179 | ret = true; | ||
3180 | } else { | ||
3181 | struct sockaddr_in * sock_in = | ||
3182 | (struct sockaddr_in *)&np->np_sockaddr; | ||
3183 | |||
3184 | if (sock_in->sin_addr.s_addr == INADDR_ANY) | ||
3185 | ret = true; | ||
3186 | } | ||
3187 | |||
3188 | return ret; | ||
3189 | } | ||
3190 | |||
3167 | static int iscsit_build_sendtargets_response(struct iscsi_cmd *cmd) | 3191 | static int iscsit_build_sendtargets_response(struct iscsi_cmd *cmd) |
3168 | { | 3192 | { |
3169 | char *payload = NULL; | 3193 | char *payload = NULL; |
@@ -3213,12 +3237,17 @@ static int iscsit_build_sendtargets_response(struct iscsi_cmd *cmd) | |||
3213 | spin_lock(&tpg->tpg_np_lock); | 3237 | spin_lock(&tpg->tpg_np_lock); |
3214 | list_for_each_entry(tpg_np, &tpg->tpg_gnp_list, | 3238 | list_for_each_entry(tpg_np, &tpg->tpg_gnp_list, |
3215 | tpg_np_list) { | 3239 | tpg_np_list) { |
3240 | struct iscsi_np *np = tpg_np->tpg_np; | ||
3241 | bool inaddr_any = iscsit_check_inaddr_any(np); | ||
3242 | |||
3216 | len = sprintf(buf, "TargetAddress=" | 3243 | len = sprintf(buf, "TargetAddress=" |
3217 | "%s%s%s:%hu,%hu", | 3244 | "%s%s%s:%hu,%hu", |
3218 | (tpg_np->tpg_np->np_sockaddr.ss_family == AF_INET6) ? | 3245 | (np->np_sockaddr.ss_family == AF_INET6) ? |
3219 | "[" : "", tpg_np->tpg_np->np_ip, | 3246 | "[" : "", (inaddr_any == false) ? |
3220 | (tpg_np->tpg_np->np_sockaddr.ss_family == AF_INET6) ? | 3247 | np->np_ip : conn->local_ip, |
3221 | "]" : "", tpg_np->tpg_np->np_port, | 3248 | (np->np_sockaddr.ss_family == AF_INET6) ? |
3249 | "]" : "", (inaddr_any == false) ? | ||
3250 | np->np_port : conn->local_port, | ||
3222 | tpg->tpgt); | 3251 | tpg->tpgt); |
3223 | len += 1; | 3252 | len += 1; |
3224 | 3253 | ||
diff --git a/drivers/target/iscsi/iscsi_target_configfs.c b/drivers/target/iscsi/iscsi_target_configfs.c index 3468caab47a2..6b35b37988ed 100644 --- a/drivers/target/iscsi/iscsi_target_configfs.c +++ b/drivers/target/iscsi/iscsi_target_configfs.c | |||
@@ -21,6 +21,7 @@ | |||
21 | 21 | ||
22 | #include <linux/configfs.h> | 22 | #include <linux/configfs.h> |
23 | #include <linux/export.h> | 23 | #include <linux/export.h> |
24 | #include <linux/inet.h> | ||
24 | #include <target/target_core_base.h> | 25 | #include <target/target_core_base.h> |
25 | #include <target/target_core_fabric.h> | 26 | #include <target/target_core_fabric.h> |
26 | #include <target/target_core_fabric_configfs.h> | 27 | #include <target/target_core_fabric_configfs.h> |
diff --git a/drivers/target/iscsi/iscsi_target_core.h b/drivers/target/iscsi/iscsi_target_core.h index f1a02dad05a0..0ec3b77a0c27 100644 --- a/drivers/target/iscsi/iscsi_target_core.h +++ b/drivers/target/iscsi/iscsi_target_core.h | |||
@@ -508,6 +508,7 @@ struct iscsi_conn { | |||
508 | u16 cid; | 508 | u16 cid; |
509 | /* Remote TCP Port */ | 509 | /* Remote TCP Port */ |
510 | u16 login_port; | 510 | u16 login_port; |
511 | u16 local_port; | ||
511 | int net_size; | 512 | int net_size; |
512 | u32 auth_id; | 513 | u32 auth_id; |
513 | #define CONNFLAG_SCTP_STRUCT_FILE 0x01 | 514 | #define CONNFLAG_SCTP_STRUCT_FILE 0x01 |
@@ -527,6 +528,7 @@ struct iscsi_conn { | |||
527 | unsigned char bad_hdr[ISCSI_HDR_LEN]; | 528 | unsigned char bad_hdr[ISCSI_HDR_LEN]; |
528 | #define IPV6_ADDRESS_SPACE 48 | 529 | #define IPV6_ADDRESS_SPACE 48 |
529 | unsigned char login_ip[IPV6_ADDRESS_SPACE]; | 530 | unsigned char login_ip[IPV6_ADDRESS_SPACE]; |
531 | unsigned char local_ip[IPV6_ADDRESS_SPACE]; | ||
530 | int conn_usage_count; | 532 | int conn_usage_count; |
531 | int conn_waiting_on_uc; | 533 | int conn_waiting_on_uc; |
532 | atomic_t check_immediate_queue; | 534 | atomic_t check_immediate_queue; |
@@ -561,8 +563,8 @@ struct iscsi_conn { | |||
561 | struct hash_desc conn_tx_hash; | 563 | struct hash_desc conn_tx_hash; |
562 | /* Used for scheduling TX and RX connection kthreads */ | 564 | /* Used for scheduling TX and RX connection kthreads */ |
563 | cpumask_var_t conn_cpumask; | 565 | cpumask_var_t conn_cpumask; |
564 | int conn_rx_reset_cpumask:1; | 566 | unsigned int conn_rx_reset_cpumask:1; |
565 | int conn_tx_reset_cpumask:1; | 567 | unsigned int conn_tx_reset_cpumask:1; |
566 | /* list_head of struct iscsi_cmd for this connection */ | 568 | /* list_head of struct iscsi_cmd for this connection */ |
567 | struct list_head conn_cmd_list; | 569 | struct list_head conn_cmd_list; |
568 | struct list_head immed_queue_list; | 570 | struct list_head immed_queue_list; |
diff --git a/drivers/target/iscsi/iscsi_target_erl1.c b/drivers/target/iscsi/iscsi_target_erl1.c index 255c0d67e898..27901e37c125 100644 --- a/drivers/target/iscsi/iscsi_target_erl1.c +++ b/drivers/target/iscsi/iscsi_target_erl1.c | |||
@@ -1238,7 +1238,7 @@ void iscsit_mod_dataout_timer(struct iscsi_cmd *cmd) | |||
1238 | { | 1238 | { |
1239 | struct iscsi_conn *conn = cmd->conn; | 1239 | struct iscsi_conn *conn = cmd->conn; |
1240 | struct iscsi_session *sess = conn->sess; | 1240 | struct iscsi_session *sess = conn->sess; |
1241 | struct iscsi_node_attrib *na = na = iscsit_tpg_get_node_attrib(sess); | 1241 | struct iscsi_node_attrib *na = iscsit_tpg_get_node_attrib(sess); |
1242 | 1242 | ||
1243 | spin_lock_bh(&cmd->dataout_timeout_lock); | 1243 | spin_lock_bh(&cmd->dataout_timeout_lock); |
1244 | if (!(cmd->dataout_timer_flags & ISCSI_TF_RUNNING)) { | 1244 | if (!(cmd->dataout_timer_flags & ISCSI_TF_RUNNING)) { |
@@ -1261,7 +1261,7 @@ void iscsit_start_dataout_timer( | |||
1261 | struct iscsi_conn *conn) | 1261 | struct iscsi_conn *conn) |
1262 | { | 1262 | { |
1263 | struct iscsi_session *sess = conn->sess; | 1263 | struct iscsi_session *sess = conn->sess; |
1264 | struct iscsi_node_attrib *na = na = iscsit_tpg_get_node_attrib(sess); | 1264 | struct iscsi_node_attrib *na = iscsit_tpg_get_node_attrib(sess); |
1265 | 1265 | ||
1266 | if (cmd->dataout_timer_flags & ISCSI_TF_RUNNING) | 1266 | if (cmd->dataout_timer_flags & ISCSI_TF_RUNNING) |
1267 | return; | 1267 | return; |
diff --git a/drivers/target/iscsi/iscsi_target_login.c b/drivers/target/iscsi/iscsi_target_login.c index 373b0cc6abd8..38cb7ce8469e 100644 --- a/drivers/target/iscsi/iscsi_target_login.c +++ b/drivers/target/iscsi/iscsi_target_login.c | |||
@@ -615,8 +615,8 @@ static int iscsi_post_login_handler( | |||
615 | } | 615 | } |
616 | 616 | ||
617 | pr_debug("iSCSI Login successful on CID: %hu from %s to" | 617 | pr_debug("iSCSI Login successful on CID: %hu from %s to" |
618 | " %s:%hu,%hu\n", conn->cid, conn->login_ip, np->np_ip, | 618 | " %s:%hu,%hu\n", conn->cid, conn->login_ip, |
619 | np->np_port, tpg->tpgt); | 619 | conn->local_ip, conn->local_port, tpg->tpgt); |
620 | 620 | ||
621 | list_add_tail(&conn->conn_list, &sess->sess_conn_list); | 621 | list_add_tail(&conn->conn_list, &sess->sess_conn_list); |
622 | atomic_inc(&sess->nconn); | 622 | atomic_inc(&sess->nconn); |
@@ -658,7 +658,8 @@ static int iscsi_post_login_handler( | |||
658 | sess->session_state = TARG_SESS_STATE_LOGGED_IN; | 658 | sess->session_state = TARG_SESS_STATE_LOGGED_IN; |
659 | 659 | ||
660 | pr_debug("iSCSI Login successful on CID: %hu from %s to %s:%hu,%hu\n", | 660 | pr_debug("iSCSI Login successful on CID: %hu from %s to %s:%hu,%hu\n", |
661 | conn->cid, conn->login_ip, np->np_ip, np->np_port, tpg->tpgt); | 661 | conn->cid, conn->login_ip, conn->local_ip, conn->local_port, |
662 | tpg->tpgt); | ||
662 | 663 | ||
663 | spin_lock_bh(&sess->conn_lock); | 664 | spin_lock_bh(&sess->conn_lock); |
664 | list_add_tail(&conn->conn_list, &sess->sess_conn_list); | 665 | list_add_tail(&conn->conn_list, &sess->sess_conn_list); |
@@ -841,6 +842,14 @@ int iscsi_target_setup_login_socket( | |||
841 | goto fail; | 842 | goto fail; |
842 | } | 843 | } |
843 | 844 | ||
845 | ret = kernel_setsockopt(sock, IPPROTO_IP, IP_FREEBIND, | ||
846 | (char *)&opt, sizeof(opt)); | ||
847 | if (ret < 0) { | ||
848 | pr_err("kernel_setsockopt() for IP_FREEBIND" | ||
849 | " failed\n"); | ||
850 | goto fail; | ||
851 | } | ||
852 | |||
844 | ret = kernel_bind(sock, (struct sockaddr *)&np->np_sockaddr, len); | 853 | ret = kernel_bind(sock, (struct sockaddr *)&np->np_sockaddr, len); |
845 | if (ret < 0) { | 854 | if (ret < 0) { |
846 | pr_err("kernel_bind() failed: %d\n", ret); | 855 | pr_err("kernel_bind() failed: %d\n", ret); |
@@ -1020,6 +1029,18 @@ static int __iscsi_target_login_thread(struct iscsi_np *np) | |||
1020 | snprintf(conn->login_ip, sizeof(conn->login_ip), "%pI6c", | 1029 | snprintf(conn->login_ip, sizeof(conn->login_ip), "%pI6c", |
1021 | &sock_in6.sin6_addr.in6_u); | 1030 | &sock_in6.sin6_addr.in6_u); |
1022 | conn->login_port = ntohs(sock_in6.sin6_port); | 1031 | conn->login_port = ntohs(sock_in6.sin6_port); |
1032 | |||
1033 | if (conn->sock->ops->getname(conn->sock, | ||
1034 | (struct sockaddr *)&sock_in6, &err, 0) < 0) { | ||
1035 | pr_err("sock_ops->getname() failed.\n"); | ||
1036 | iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR, | ||
1037 | ISCSI_LOGIN_STATUS_TARGET_ERROR); | ||
1038 | goto new_sess_out; | ||
1039 | } | ||
1040 | snprintf(conn->local_ip, sizeof(conn->local_ip), "%pI6c", | ||
1041 | &sock_in6.sin6_addr.in6_u); | ||
1042 | conn->local_port = ntohs(sock_in6.sin6_port); | ||
1043 | |||
1023 | } else { | 1044 | } else { |
1024 | memset(&sock_in, 0, sizeof(struct sockaddr_in)); | 1045 | memset(&sock_in, 0, sizeof(struct sockaddr_in)); |
1025 | 1046 | ||
@@ -1032,6 +1053,16 @@ static int __iscsi_target_login_thread(struct iscsi_np *np) | |||
1032 | } | 1053 | } |
1033 | sprintf(conn->login_ip, "%pI4", &sock_in.sin_addr.s_addr); | 1054 | sprintf(conn->login_ip, "%pI4", &sock_in.sin_addr.s_addr); |
1034 | conn->login_port = ntohs(sock_in.sin_port); | 1055 | conn->login_port = ntohs(sock_in.sin_port); |
1056 | |||
1057 | if (conn->sock->ops->getname(conn->sock, | ||
1058 | (struct sockaddr *)&sock_in, &err, 0) < 0) { | ||
1059 | pr_err("sock_ops->getname() failed.\n"); | ||
1060 | iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR, | ||
1061 | ISCSI_LOGIN_STATUS_TARGET_ERROR); | ||
1062 | goto new_sess_out; | ||
1063 | } | ||
1064 | sprintf(conn->local_ip, "%pI4", &sock_in.sin_addr.s_addr); | ||
1065 | conn->local_port = ntohs(sock_in.sin_port); | ||
1035 | } | 1066 | } |
1036 | 1067 | ||
1037 | conn->network_transport = np->np_network_transport; | 1068 | conn->network_transport = np->np_network_transport; |
@@ -1039,7 +1070,7 @@ static int __iscsi_target_login_thread(struct iscsi_np *np) | |||
1039 | pr_debug("Received iSCSI login request from %s on %s Network" | 1070 | pr_debug("Received iSCSI login request from %s on %s Network" |
1040 | " Portal %s:%hu\n", conn->login_ip, | 1071 | " Portal %s:%hu\n", conn->login_ip, |
1041 | (conn->network_transport == ISCSI_TCP) ? "TCP" : "SCTP", | 1072 | (conn->network_transport == ISCSI_TCP) ? "TCP" : "SCTP", |
1042 | np->np_ip, np->np_port); | 1073 | conn->local_ip, conn->local_port); |
1043 | 1074 | ||
1044 | pr_debug("Moving to TARG_CONN_STATE_IN_LOGIN.\n"); | 1075 | pr_debug("Moving to TARG_CONN_STATE_IN_LOGIN.\n"); |
1045 | conn->conn_state = TARG_CONN_STATE_IN_LOGIN; | 1076 | conn->conn_state = TARG_CONN_STATE_IN_LOGIN; |
diff --git a/drivers/target/iscsi/iscsi_target_util.c b/drivers/target/iscsi/iscsi_target_util.c index a05ca1c4f01c..11287e1ece13 100644 --- a/drivers/target/iscsi/iscsi_target_util.c +++ b/drivers/target/iscsi/iscsi_target_util.c | |||
@@ -849,6 +849,17 @@ void iscsit_free_cmd(struct iscsi_cmd *cmd) | |||
849 | case ISCSI_OP_SCSI_TMFUNC: | 849 | case ISCSI_OP_SCSI_TMFUNC: |
850 | transport_generic_free_cmd(&cmd->se_cmd, 1); | 850 | transport_generic_free_cmd(&cmd->se_cmd, 1); |
851 | break; | 851 | break; |
852 | case ISCSI_OP_REJECT: | ||
853 | /* | ||
854 | * Handle special case for REJECT when iscsi_add_reject*() has | ||
855 | * overwritten the original iscsi_opcode assignment, and the | ||
856 | * associated cmd->se_cmd needs to be released. | ||
857 | */ | ||
858 | if (cmd->se_cmd.se_tfo != NULL) { | ||
859 | transport_generic_free_cmd(&cmd->se_cmd, 1); | ||
860 | break; | ||
861 | } | ||
862 | /* Fall-through */ | ||
852 | default: | 863 | default: |
853 | iscsit_release_cmd(cmd); | 864 | iscsit_release_cmd(cmd); |
854 | break; | 865 | break; |
diff --git a/drivers/target/target_core_alua.c b/drivers/target/target_core_alua.c index 1b1edd14f4bf..01a2691dfb47 100644 --- a/drivers/target/target_core_alua.c +++ b/drivers/target/target_core_alua.c | |||
@@ -78,7 +78,7 @@ int target_emulate_report_target_port_groups(struct se_task *task) | |||
78 | return -EINVAL; | 78 | return -EINVAL; |
79 | } | 79 | } |
80 | 80 | ||
81 | buf = transport_kmap_first_data_page(cmd); | 81 | buf = transport_kmap_data_sg(cmd); |
82 | 82 | ||
83 | spin_lock(&su_dev->t10_alua.tg_pt_gps_lock); | 83 | spin_lock(&su_dev->t10_alua.tg_pt_gps_lock); |
84 | list_for_each_entry(tg_pt_gp, &su_dev->t10_alua.tg_pt_gps_list, | 84 | list_for_each_entry(tg_pt_gp, &su_dev->t10_alua.tg_pt_gps_list, |
@@ -163,7 +163,7 @@ int target_emulate_report_target_port_groups(struct se_task *task) | |||
163 | buf[2] = ((rd_len >> 8) & 0xff); | 163 | buf[2] = ((rd_len >> 8) & 0xff); |
164 | buf[3] = (rd_len & 0xff); | 164 | buf[3] = (rd_len & 0xff); |
165 | 165 | ||
166 | transport_kunmap_first_data_page(cmd); | 166 | transport_kunmap_data_sg(cmd); |
167 | 167 | ||
168 | task->task_scsi_status = GOOD; | 168 | task->task_scsi_status = GOOD; |
169 | transport_complete_task(task, 1); | 169 | transport_complete_task(task, 1); |
@@ -194,7 +194,7 @@ int target_emulate_set_target_port_groups(struct se_task *task) | |||
194 | cmd->scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; | 194 | cmd->scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; |
195 | return -EINVAL; | 195 | return -EINVAL; |
196 | } | 196 | } |
197 | buf = transport_kmap_first_data_page(cmd); | 197 | buf = transport_kmap_data_sg(cmd); |
198 | 198 | ||
199 | /* | 199 | /* |
200 | * Determine if explict ALUA via SET_TARGET_PORT_GROUPS is allowed | 200 | * Determine if explict ALUA via SET_TARGET_PORT_GROUPS is allowed |
@@ -351,7 +351,7 @@ int target_emulate_set_target_port_groups(struct se_task *task) | |||
351 | } | 351 | } |
352 | 352 | ||
353 | out: | 353 | out: |
354 | transport_kunmap_first_data_page(cmd); | 354 | transport_kunmap_data_sg(cmd); |
355 | task->task_scsi_status = GOOD; | 355 | task->task_scsi_status = GOOD; |
356 | transport_complete_task(task, 1); | 356 | transport_complete_task(task, 1); |
357 | return 0; | 357 | return 0; |
diff --git a/drivers/target/target_core_cdb.c b/drivers/target/target_core_cdb.c index 2f2235edefff..f3d71fa88a28 100644 --- a/drivers/target/target_core_cdb.c +++ b/drivers/target/target_core_cdb.c | |||
@@ -83,7 +83,7 @@ target_emulate_inquiry_std(struct se_cmd *cmd) | |||
83 | return -EINVAL; | 83 | return -EINVAL; |
84 | } | 84 | } |
85 | 85 | ||
86 | buf = transport_kmap_first_data_page(cmd); | 86 | buf = transport_kmap_data_sg(cmd); |
87 | 87 | ||
88 | if (dev == tpg->tpg_virt_lun0.lun_se_dev) { | 88 | if (dev == tpg->tpg_virt_lun0.lun_se_dev) { |
89 | buf[0] = 0x3f; /* Not connected */ | 89 | buf[0] = 0x3f; /* Not connected */ |
@@ -134,7 +134,7 @@ target_emulate_inquiry_std(struct se_cmd *cmd) | |||
134 | buf[4] = 31; /* Set additional length to 31 */ | 134 | buf[4] = 31; /* Set additional length to 31 */ |
135 | 135 | ||
136 | out: | 136 | out: |
137 | transport_kunmap_first_data_page(cmd); | 137 | transport_kunmap_data_sg(cmd); |
138 | return 0; | 138 | return 0; |
139 | } | 139 | } |
140 | 140 | ||
@@ -698,6 +698,13 @@ int target_emulate_inquiry(struct se_task *task) | |||
698 | int p, ret; | 698 | int p, ret; |
699 | 699 | ||
700 | if (!(cdb[1] & 0x1)) { | 700 | if (!(cdb[1] & 0x1)) { |
701 | if (cdb[2]) { | ||
702 | pr_err("INQUIRY with EVPD==0 but PAGE CODE=%02x\n", | ||
703 | cdb[2]); | ||
704 | cmd->scsi_sense_reason = TCM_INVALID_CDB_FIELD; | ||
705 | return -EINVAL; | ||
706 | } | ||
707 | |||
701 | ret = target_emulate_inquiry_std(cmd); | 708 | ret = target_emulate_inquiry_std(cmd); |
702 | goto out; | 709 | goto out; |
703 | } | 710 | } |
@@ -716,7 +723,7 @@ int target_emulate_inquiry(struct se_task *task) | |||
716 | return -EINVAL; | 723 | return -EINVAL; |
717 | } | 724 | } |
718 | 725 | ||
719 | buf = transport_kmap_first_data_page(cmd); | 726 | buf = transport_kmap_data_sg(cmd); |
720 | 727 | ||
721 | buf[0] = dev->transport->get_device_type(dev); | 728 | buf[0] = dev->transport->get_device_type(dev); |
722 | 729 | ||
@@ -729,11 +736,11 @@ int target_emulate_inquiry(struct se_task *task) | |||
729 | } | 736 | } |
730 | 737 | ||
731 | pr_err("Unknown VPD Code: 0x%02x\n", cdb[2]); | 738 | pr_err("Unknown VPD Code: 0x%02x\n", cdb[2]); |
732 | cmd->scsi_sense_reason = TCM_UNSUPPORTED_SCSI_OPCODE; | 739 | cmd->scsi_sense_reason = TCM_INVALID_CDB_FIELD; |
733 | ret = -EINVAL; | 740 | ret = -EINVAL; |
734 | 741 | ||
735 | out_unmap: | 742 | out_unmap: |
736 | transport_kunmap_first_data_page(cmd); | 743 | transport_kunmap_data_sg(cmd); |
737 | out: | 744 | out: |
738 | if (!ret) { | 745 | if (!ret) { |
739 | task->task_scsi_status = GOOD; | 746 | task->task_scsi_status = GOOD; |
@@ -755,7 +762,7 @@ int target_emulate_readcapacity(struct se_task *task) | |||
755 | else | 762 | else |
756 | blocks = (u32)blocks_long; | 763 | blocks = (u32)blocks_long; |
757 | 764 | ||
758 | buf = transport_kmap_first_data_page(cmd); | 765 | buf = transport_kmap_data_sg(cmd); |
759 | 766 | ||
760 | buf[0] = (blocks >> 24) & 0xff; | 767 | buf[0] = (blocks >> 24) & 0xff; |
761 | buf[1] = (blocks >> 16) & 0xff; | 768 | buf[1] = (blocks >> 16) & 0xff; |
@@ -771,7 +778,7 @@ int target_emulate_readcapacity(struct se_task *task) | |||
771 | if (dev->se_sub_dev->se_dev_attrib.emulate_tpu || dev->se_sub_dev->se_dev_attrib.emulate_tpws) | 778 | if (dev->se_sub_dev->se_dev_attrib.emulate_tpu || dev->se_sub_dev->se_dev_attrib.emulate_tpws) |
772 | put_unaligned_be32(0xFFFFFFFF, &buf[0]); | 779 | put_unaligned_be32(0xFFFFFFFF, &buf[0]); |
773 | 780 | ||
774 | transport_kunmap_first_data_page(cmd); | 781 | transport_kunmap_data_sg(cmd); |
775 | 782 | ||
776 | task->task_scsi_status = GOOD; | 783 | task->task_scsi_status = GOOD; |
777 | transport_complete_task(task, 1); | 784 | transport_complete_task(task, 1); |
@@ -785,7 +792,7 @@ int target_emulate_readcapacity_16(struct se_task *task) | |||
785 | unsigned char *buf; | 792 | unsigned char *buf; |
786 | unsigned long long blocks = dev->transport->get_blocks(dev); | 793 | unsigned long long blocks = dev->transport->get_blocks(dev); |
787 | 794 | ||
788 | buf = transport_kmap_first_data_page(cmd); | 795 | buf = transport_kmap_data_sg(cmd); |
789 | 796 | ||
790 | buf[0] = (blocks >> 56) & 0xff; | 797 | buf[0] = (blocks >> 56) & 0xff; |
791 | buf[1] = (blocks >> 48) & 0xff; | 798 | buf[1] = (blocks >> 48) & 0xff; |
@@ -806,7 +813,7 @@ int target_emulate_readcapacity_16(struct se_task *task) | |||
806 | if (dev->se_sub_dev->se_dev_attrib.emulate_tpu || dev->se_sub_dev->se_dev_attrib.emulate_tpws) | 813 | if (dev->se_sub_dev->se_dev_attrib.emulate_tpu || dev->se_sub_dev->se_dev_attrib.emulate_tpws) |
807 | buf[14] = 0x80; | 814 | buf[14] = 0x80; |
808 | 815 | ||
809 | transport_kunmap_first_data_page(cmd); | 816 | transport_kunmap_data_sg(cmd); |
810 | 817 | ||
811 | task->task_scsi_status = GOOD; | 818 | task->task_scsi_status = GOOD; |
812 | transport_complete_task(task, 1); | 819 | transport_complete_task(task, 1); |
@@ -1019,9 +1026,9 @@ int target_emulate_modesense(struct se_task *task) | |||
1019 | offset = cmd->data_length; | 1026 | offset = cmd->data_length; |
1020 | } | 1027 | } |
1021 | 1028 | ||
1022 | rbuf = transport_kmap_first_data_page(cmd); | 1029 | rbuf = transport_kmap_data_sg(cmd); |
1023 | memcpy(rbuf, buf, offset); | 1030 | memcpy(rbuf, buf, offset); |
1024 | transport_kunmap_first_data_page(cmd); | 1031 | transport_kunmap_data_sg(cmd); |
1025 | 1032 | ||
1026 | task->task_scsi_status = GOOD; | 1033 | task->task_scsi_status = GOOD; |
1027 | transport_complete_task(task, 1); | 1034 | transport_complete_task(task, 1); |
@@ -1043,7 +1050,7 @@ int target_emulate_request_sense(struct se_task *task) | |||
1043 | return -ENOSYS; | 1050 | return -ENOSYS; |
1044 | } | 1051 | } |
1045 | 1052 | ||
1046 | buf = transport_kmap_first_data_page(cmd); | 1053 | buf = transport_kmap_data_sg(cmd); |
1047 | 1054 | ||
1048 | if (!core_scsi3_ua_clear_for_request_sense(cmd, &ua_asc, &ua_ascq)) { | 1055 | if (!core_scsi3_ua_clear_for_request_sense(cmd, &ua_asc, &ua_ascq)) { |
1049 | /* | 1056 | /* |
@@ -1051,11 +1058,8 @@ int target_emulate_request_sense(struct se_task *task) | |||
1051 | */ | 1058 | */ |
1052 | buf[0] = 0x70; | 1059 | buf[0] = 0x70; |
1053 | buf[SPC_SENSE_KEY_OFFSET] = UNIT_ATTENTION; | 1060 | buf[SPC_SENSE_KEY_OFFSET] = UNIT_ATTENTION; |
1054 | /* | 1061 | |
1055 | * Make sure request data length is enough for additional | 1062 | if (cmd->data_length < 18) { |
1056 | * sense data. | ||
1057 | */ | ||
1058 | if (cmd->data_length <= 18) { | ||
1059 | buf[7] = 0x00; | 1063 | buf[7] = 0x00; |
1060 | err = -EINVAL; | 1064 | err = -EINVAL; |
1061 | goto end; | 1065 | goto end; |
@@ -1072,11 +1076,8 @@ int target_emulate_request_sense(struct se_task *task) | |||
1072 | */ | 1076 | */ |
1073 | buf[0] = 0x70; | 1077 | buf[0] = 0x70; |
1074 | buf[SPC_SENSE_KEY_OFFSET] = NO_SENSE; | 1078 | buf[SPC_SENSE_KEY_OFFSET] = NO_SENSE; |
1075 | /* | 1079 | |
1076 | * Make sure request data length is enough for additional | 1080 | if (cmd->data_length < 18) { |
1077 | * sense data. | ||
1078 | */ | ||
1079 | if (cmd->data_length <= 18) { | ||
1080 | buf[7] = 0x00; | 1081 | buf[7] = 0x00; |
1081 | err = -EINVAL; | 1082 | err = -EINVAL; |
1082 | goto end; | 1083 | goto end; |
@@ -1089,7 +1090,7 @@ int target_emulate_request_sense(struct se_task *task) | |||
1089 | } | 1090 | } |
1090 | 1091 | ||
1091 | end: | 1092 | end: |
1092 | transport_kunmap_first_data_page(cmd); | 1093 | transport_kunmap_data_sg(cmd); |
1093 | task->task_scsi_status = GOOD; | 1094 | task->task_scsi_status = GOOD; |
1094 | transport_complete_task(task, 1); | 1095 | transport_complete_task(task, 1); |
1095 | return 0; | 1096 | return 0; |
@@ -1123,7 +1124,7 @@ int target_emulate_unmap(struct se_task *task) | |||
1123 | dl = get_unaligned_be16(&cdb[0]); | 1124 | dl = get_unaligned_be16(&cdb[0]); |
1124 | bd_dl = get_unaligned_be16(&cdb[2]); | 1125 | bd_dl = get_unaligned_be16(&cdb[2]); |
1125 | 1126 | ||
1126 | buf = transport_kmap_first_data_page(cmd); | 1127 | buf = transport_kmap_data_sg(cmd); |
1127 | 1128 | ||
1128 | ptr = &buf[offset]; | 1129 | ptr = &buf[offset]; |
1129 | pr_debug("UNMAP: Sub: %s Using dl: %hu bd_dl: %hu size: %hu" | 1130 | pr_debug("UNMAP: Sub: %s Using dl: %hu bd_dl: %hu size: %hu" |
@@ -1147,7 +1148,7 @@ int target_emulate_unmap(struct se_task *task) | |||
1147 | } | 1148 | } |
1148 | 1149 | ||
1149 | err: | 1150 | err: |
1150 | transport_kunmap_first_data_page(cmd); | 1151 | transport_kunmap_data_sg(cmd); |
1151 | if (!ret) { | 1152 | if (!ret) { |
1152 | task->task_scsi_status = GOOD; | 1153 | task->task_scsi_status = GOOD; |
1153 | transport_complete_task(task, 1); | 1154 | transport_complete_task(task, 1); |
diff --git a/drivers/target/target_core_configfs.c b/drivers/target/target_core_configfs.c index 0955bb8979fb..6e043eeb1db9 100644 --- a/drivers/target/target_core_configfs.c +++ b/drivers/target/target_core_configfs.c | |||
@@ -1704,13 +1704,15 @@ static ssize_t target_core_store_dev_alias( | |||
1704 | return -EINVAL; | 1704 | return -EINVAL; |
1705 | } | 1705 | } |
1706 | 1706 | ||
1707 | se_dev->su_dev_flags |= SDF_USING_ALIAS; | ||
1708 | read_bytes = snprintf(&se_dev->se_dev_alias[0], SE_DEV_ALIAS_LEN, | 1707 | read_bytes = snprintf(&se_dev->se_dev_alias[0], SE_DEV_ALIAS_LEN, |
1709 | "%s", page); | 1708 | "%s", page); |
1710 | 1709 | if (!read_bytes) | |
1710 | return -EINVAL; | ||
1711 | if (se_dev->se_dev_alias[read_bytes - 1] == '\n') | 1711 | if (se_dev->se_dev_alias[read_bytes - 1] == '\n') |
1712 | se_dev->se_dev_alias[read_bytes - 1] = '\0'; | 1712 | se_dev->se_dev_alias[read_bytes - 1] = '\0'; |
1713 | 1713 | ||
1714 | se_dev->su_dev_flags |= SDF_USING_ALIAS; | ||
1715 | |||
1714 | pr_debug("Target_Core_ConfigFS: %s/%s set alias: %s\n", | 1716 | pr_debug("Target_Core_ConfigFS: %s/%s set alias: %s\n", |
1715 | config_item_name(&hba->hba_group.cg_item), | 1717 | config_item_name(&hba->hba_group.cg_item), |
1716 | config_item_name(&se_dev->se_dev_group.cg_item), | 1718 | config_item_name(&se_dev->se_dev_group.cg_item), |
@@ -1753,13 +1755,15 @@ static ssize_t target_core_store_dev_udev_path( | |||
1753 | return -EINVAL; | 1755 | return -EINVAL; |
1754 | } | 1756 | } |
1755 | 1757 | ||
1756 | se_dev->su_dev_flags |= SDF_USING_UDEV_PATH; | ||
1757 | read_bytes = snprintf(&se_dev->se_dev_udev_path[0], SE_UDEV_PATH_LEN, | 1758 | read_bytes = snprintf(&se_dev->se_dev_udev_path[0], SE_UDEV_PATH_LEN, |
1758 | "%s", page); | 1759 | "%s", page); |
1759 | 1760 | if (!read_bytes) | |
1761 | return -EINVAL; | ||
1760 | if (se_dev->se_dev_udev_path[read_bytes - 1] == '\n') | 1762 | if (se_dev->se_dev_udev_path[read_bytes - 1] == '\n') |
1761 | se_dev->se_dev_udev_path[read_bytes - 1] = '\0'; | 1763 | se_dev->se_dev_udev_path[read_bytes - 1] = '\0'; |
1762 | 1764 | ||
1765 | se_dev->su_dev_flags |= SDF_USING_UDEV_PATH; | ||
1766 | |||
1763 | pr_debug("Target_Core_ConfigFS: %s/%s set udev_path: %s\n", | 1767 | pr_debug("Target_Core_ConfigFS: %s/%s set udev_path: %s\n", |
1764 | config_item_name(&hba->hba_group.cg_item), | 1768 | config_item_name(&hba->hba_group.cg_item), |
1765 | config_item_name(&se_dev->se_dev_group.cg_item), | 1769 | config_item_name(&se_dev->se_dev_group.cg_item), |
diff --git a/drivers/target/target_core_device.c b/drivers/target/target_core_device.c index 0c5992f0d946..edbcabbf85f7 100644 --- a/drivers/target/target_core_device.c +++ b/drivers/target/target_core_device.c | |||
@@ -320,11 +320,12 @@ int core_free_device_list_for_node( | |||
320 | void core_dec_lacl_count(struct se_node_acl *se_nacl, struct se_cmd *se_cmd) | 320 | void core_dec_lacl_count(struct se_node_acl *se_nacl, struct se_cmd *se_cmd) |
321 | { | 321 | { |
322 | struct se_dev_entry *deve; | 322 | struct se_dev_entry *deve; |
323 | unsigned long flags; | ||
323 | 324 | ||
324 | spin_lock_irq(&se_nacl->device_list_lock); | 325 | spin_lock_irqsave(&se_nacl->device_list_lock, flags); |
325 | deve = &se_nacl->device_list[se_cmd->orig_fe_lun]; | 326 | deve = &se_nacl->device_list[se_cmd->orig_fe_lun]; |
326 | deve->deve_cmds--; | 327 | deve->deve_cmds--; |
327 | spin_unlock_irq(&se_nacl->device_list_lock); | 328 | spin_unlock_irqrestore(&se_nacl->device_list_lock, flags); |
328 | } | 329 | } |
329 | 330 | ||
330 | void core_update_device_list_access( | 331 | void core_update_device_list_access( |
@@ -656,7 +657,7 @@ int target_report_luns(struct se_task *se_task) | |||
656 | unsigned char *buf; | 657 | unsigned char *buf; |
657 | u32 cdb_offset = 0, lun_count = 0, offset = 8, i; | 658 | u32 cdb_offset = 0, lun_count = 0, offset = 8, i; |
658 | 659 | ||
659 | buf = transport_kmap_first_data_page(se_cmd); | 660 | buf = (unsigned char *) transport_kmap_data_sg(se_cmd); |
660 | 661 | ||
661 | /* | 662 | /* |
662 | * If no struct se_session pointer is present, this struct se_cmd is | 663 | * If no struct se_session pointer is present, this struct se_cmd is |
@@ -694,7 +695,7 @@ int target_report_luns(struct se_task *se_task) | |||
694 | * See SPC3 r07, page 159. | 695 | * See SPC3 r07, page 159. |
695 | */ | 696 | */ |
696 | done: | 697 | done: |
697 | transport_kunmap_first_data_page(se_cmd); | 698 | transport_kunmap_data_sg(se_cmd); |
698 | lun_count *= 8; | 699 | lun_count *= 8; |
699 | buf[0] = ((lun_count >> 24) & 0xff); | 700 | buf[0] = ((lun_count >> 24) & 0xff); |
700 | buf[1] = ((lun_count >> 16) & 0xff); | 701 | buf[1] = ((lun_count >> 16) & 0xff); |
@@ -1294,24 +1295,26 @@ struct se_lun *core_dev_add_lun( | |||
1294 | { | 1295 | { |
1295 | struct se_lun *lun_p; | 1296 | struct se_lun *lun_p; |
1296 | u32 lun_access = 0; | 1297 | u32 lun_access = 0; |
1298 | int rc; | ||
1297 | 1299 | ||
1298 | if (atomic_read(&dev->dev_access_obj.obj_access_count) != 0) { | 1300 | if (atomic_read(&dev->dev_access_obj.obj_access_count) != 0) { |
1299 | pr_err("Unable to export struct se_device while dev_access_obj: %d\n", | 1301 | pr_err("Unable to export struct se_device while dev_access_obj: %d\n", |
1300 | atomic_read(&dev->dev_access_obj.obj_access_count)); | 1302 | atomic_read(&dev->dev_access_obj.obj_access_count)); |
1301 | return NULL; | 1303 | return ERR_PTR(-EACCES); |
1302 | } | 1304 | } |
1303 | 1305 | ||
1304 | lun_p = core_tpg_pre_addlun(tpg, lun); | 1306 | lun_p = core_tpg_pre_addlun(tpg, lun); |
1305 | if ((IS_ERR(lun_p)) || !lun_p) | 1307 | if (IS_ERR(lun_p)) |
1306 | return NULL; | 1308 | return lun_p; |
1307 | 1309 | ||
1308 | if (dev->dev_flags & DF_READ_ONLY) | 1310 | if (dev->dev_flags & DF_READ_ONLY) |
1309 | lun_access = TRANSPORT_LUNFLAGS_READ_ONLY; | 1311 | lun_access = TRANSPORT_LUNFLAGS_READ_ONLY; |
1310 | else | 1312 | else |
1311 | lun_access = TRANSPORT_LUNFLAGS_READ_WRITE; | 1313 | lun_access = TRANSPORT_LUNFLAGS_READ_WRITE; |
1312 | 1314 | ||
1313 | if (core_tpg_post_addlun(tpg, lun_p, lun_access, dev) < 0) | 1315 | rc = core_tpg_post_addlun(tpg, lun_p, lun_access, dev); |
1314 | return NULL; | 1316 | if (rc < 0) |
1317 | return ERR_PTR(rc); | ||
1315 | 1318 | ||
1316 | pr_debug("%s_TPG[%u]_LUN[%u] - Activated %s Logical Unit from" | 1319 | pr_debug("%s_TPG[%u]_LUN[%u] - Activated %s Logical Unit from" |
1317 | " CORE HBA: %u\n", tpg->se_tpg_tfo->get_fabric_name(), | 1320 | " CORE HBA: %u\n", tpg->se_tpg_tfo->get_fabric_name(), |
@@ -1348,11 +1351,10 @@ int core_dev_del_lun( | |||
1348 | u32 unpacked_lun) | 1351 | u32 unpacked_lun) |
1349 | { | 1352 | { |
1350 | struct se_lun *lun; | 1353 | struct se_lun *lun; |
1351 | int ret = 0; | ||
1352 | 1354 | ||
1353 | lun = core_tpg_pre_dellun(tpg, unpacked_lun, &ret); | 1355 | lun = core_tpg_pre_dellun(tpg, unpacked_lun); |
1354 | if (!lun) | 1356 | if (IS_ERR(lun)) |
1355 | return ret; | 1357 | return PTR_ERR(lun); |
1356 | 1358 | ||
1357 | core_tpg_post_dellun(tpg, lun); | 1359 | core_tpg_post_dellun(tpg, lun); |
1358 | 1360 | ||
diff --git a/drivers/target/target_core_fabric_configfs.c b/drivers/target/target_core_fabric_configfs.c index 4f77cce22646..9a2ce11e1a6e 100644 --- a/drivers/target/target_core_fabric_configfs.c +++ b/drivers/target/target_core_fabric_configfs.c | |||
@@ -766,9 +766,9 @@ static int target_fabric_port_link( | |||
766 | 766 | ||
767 | lun_p = core_dev_add_lun(se_tpg, dev->se_hba, dev, | 767 | lun_p = core_dev_add_lun(se_tpg, dev->se_hba, dev, |
768 | lun->unpacked_lun); | 768 | lun->unpacked_lun); |
769 | if (IS_ERR(lun_p) || !lun_p) { | 769 | if (IS_ERR(lun_p)) { |
770 | pr_err("core_dev_add_lun() failed\n"); | 770 | pr_err("core_dev_add_lun() failed\n"); |
771 | ret = -EINVAL; | 771 | ret = PTR_ERR(lun_p); |
772 | goto out; | 772 | goto out; |
773 | } | 773 | } |
774 | 774 | ||
diff --git a/drivers/target/target_core_iblock.c b/drivers/target/target_core_iblock.c index cc8e6b58ef20..8572eae62da7 100644 --- a/drivers/target/target_core_iblock.c +++ b/drivers/target/target_core_iblock.c | |||
@@ -129,7 +129,7 @@ static struct se_device *iblock_create_virtdevice( | |||
129 | /* | 129 | /* |
130 | * These settings need to be made tunable.. | 130 | * These settings need to be made tunable.. |
131 | */ | 131 | */ |
132 | ib_dev->ibd_bio_set = bioset_create(32, 64); | 132 | ib_dev->ibd_bio_set = bioset_create(32, 0); |
133 | if (!ib_dev->ibd_bio_set) { | 133 | if (!ib_dev->ibd_bio_set) { |
134 | pr_err("IBLOCK: Unable to create bioset()\n"); | 134 | pr_err("IBLOCK: Unable to create bioset()\n"); |
135 | return ERR_PTR(-ENOMEM); | 135 | return ERR_PTR(-ENOMEM); |
@@ -181,7 +181,7 @@ static struct se_device *iblock_create_virtdevice( | |||
181 | */ | 181 | */ |
182 | dev->se_sub_dev->se_dev_attrib.max_unmap_block_desc_count = 1; | 182 | dev->se_sub_dev->se_dev_attrib.max_unmap_block_desc_count = 1; |
183 | dev->se_sub_dev->se_dev_attrib.unmap_granularity = | 183 | dev->se_sub_dev->se_dev_attrib.unmap_granularity = |
184 | q->limits.discard_granularity; | 184 | q->limits.discard_granularity >> 9; |
185 | dev->se_sub_dev->se_dev_attrib.unmap_granularity_alignment = | 185 | dev->se_sub_dev->se_dev_attrib.unmap_granularity_alignment = |
186 | q->limits.discard_alignment; | 186 | q->limits.discard_alignment; |
187 | 187 | ||
@@ -488,6 +488,13 @@ iblock_get_bio(struct se_task *task, sector_t lba, u32 sg_num) | |||
488 | struct iblock_req *ib_req = IBLOCK_REQ(task); | 488 | struct iblock_req *ib_req = IBLOCK_REQ(task); |
489 | struct bio *bio; | 489 | struct bio *bio; |
490 | 490 | ||
491 | /* | ||
492 | * Only allocate as many vector entries as the bio code allows us to, | ||
493 | * we'll loop later on until we have handled the whole request. | ||
494 | */ | ||
495 | if (sg_num > BIO_MAX_PAGES) | ||
496 | sg_num = BIO_MAX_PAGES; | ||
497 | |||
491 | bio = bio_alloc_bioset(GFP_NOIO, sg_num, ib_dev->ibd_bio_set); | 498 | bio = bio_alloc_bioset(GFP_NOIO, sg_num, ib_dev->ibd_bio_set); |
492 | if (!bio) { | 499 | if (!bio) { |
493 | pr_err("Unable to allocate memory for bio\n"); | 500 | pr_err("Unable to allocate memory for bio\n"); |
diff --git a/drivers/target/target_core_internal.h b/drivers/target/target_core_internal.h index 26f135e94f6e..45001364788a 100644 --- a/drivers/target/target_core_internal.h +++ b/drivers/target/target_core_internal.h | |||
@@ -90,7 +90,7 @@ void core_tpg_wait_for_nacl_pr_ref(struct se_node_acl *); | |||
90 | struct se_lun *core_tpg_pre_addlun(struct se_portal_group *, u32); | 90 | struct se_lun *core_tpg_pre_addlun(struct se_portal_group *, u32); |
91 | int core_tpg_post_addlun(struct se_portal_group *, struct se_lun *, | 91 | int core_tpg_post_addlun(struct se_portal_group *, struct se_lun *, |
92 | u32, void *); | 92 | u32, void *); |
93 | struct se_lun *core_tpg_pre_dellun(struct se_portal_group *, u32, int *); | 93 | struct se_lun *core_tpg_pre_dellun(struct se_portal_group *, u32 unpacked_lun); |
94 | int core_tpg_post_dellun(struct se_portal_group *, struct se_lun *); | 94 | int core_tpg_post_dellun(struct se_portal_group *, struct se_lun *); |
95 | 95 | ||
96 | /* target_core_transport.c */ | 96 | /* target_core_transport.c */ |
diff --git a/drivers/target/target_core_pr.c b/drivers/target/target_core_pr.c index 429ad7291664..b7c779389eea 100644 --- a/drivers/target/target_core_pr.c +++ b/drivers/target/target_core_pr.c | |||
@@ -478,6 +478,7 @@ static int core_scsi3_pr_seq_non_holder( | |||
478 | case READ_MEDIA_SERIAL_NUMBER: | 478 | case READ_MEDIA_SERIAL_NUMBER: |
479 | case REPORT_LUNS: | 479 | case REPORT_LUNS: |
480 | case REQUEST_SENSE: | 480 | case REQUEST_SENSE: |
481 | case PERSISTENT_RESERVE_IN: | ||
481 | ret = 0; /*/ Allowed CDBs */ | 482 | ret = 0; /*/ Allowed CDBs */ |
482 | break; | 483 | break; |
483 | default: | 484 | default: |
@@ -1534,7 +1535,7 @@ static int core_scsi3_decode_spec_i_port( | |||
1534 | tidh_new->dest_local_nexus = 1; | 1535 | tidh_new->dest_local_nexus = 1; |
1535 | list_add_tail(&tidh_new->dest_list, &tid_dest_list); | 1536 | list_add_tail(&tidh_new->dest_list, &tid_dest_list); |
1536 | 1537 | ||
1537 | buf = transport_kmap_first_data_page(cmd); | 1538 | buf = transport_kmap_data_sg(cmd); |
1538 | /* | 1539 | /* |
1539 | * For a PERSISTENT RESERVE OUT specify initiator ports payload, | 1540 | * For a PERSISTENT RESERVE OUT specify initiator ports payload, |
1540 | * first extract TransportID Parameter Data Length, and make sure | 1541 | * first extract TransportID Parameter Data Length, and make sure |
@@ -1785,7 +1786,7 @@ static int core_scsi3_decode_spec_i_port( | |||
1785 | 1786 | ||
1786 | } | 1787 | } |
1787 | 1788 | ||
1788 | transport_kunmap_first_data_page(cmd); | 1789 | transport_kunmap_data_sg(cmd); |
1789 | 1790 | ||
1790 | /* | 1791 | /* |
1791 | * Go ahead and create a registrations from tid_dest_list for the | 1792 | * Go ahead and create a registrations from tid_dest_list for the |
@@ -1833,7 +1834,7 @@ static int core_scsi3_decode_spec_i_port( | |||
1833 | 1834 | ||
1834 | return 0; | 1835 | return 0; |
1835 | out: | 1836 | out: |
1836 | transport_kunmap_first_data_page(cmd); | 1837 | transport_kunmap_data_sg(cmd); |
1837 | /* | 1838 | /* |
1838 | * For the failure case, release everything from tid_dest_list | 1839 | * For the failure case, release everything from tid_dest_list |
1839 | * including *dest_pr_reg and the configfs dependances.. | 1840 | * including *dest_pr_reg and the configfs dependances.. |
@@ -3120,7 +3121,7 @@ static int core_scsi3_pro_preempt( | |||
3120 | if (!calling_it_nexus) | 3121 | if (!calling_it_nexus) |
3121 | core_scsi3_ua_allocate(pr_reg_nacl, | 3122 | core_scsi3_ua_allocate(pr_reg_nacl, |
3122 | pr_res_mapped_lun, 0x2A, | 3123 | pr_res_mapped_lun, 0x2A, |
3123 | ASCQ_2AH_RESERVATIONS_PREEMPTED); | 3124 | ASCQ_2AH_REGISTRATIONS_PREEMPTED); |
3124 | } | 3125 | } |
3125 | spin_unlock(&pr_tmpl->registration_lock); | 3126 | spin_unlock(&pr_tmpl->registration_lock); |
3126 | /* | 3127 | /* |
@@ -3233,7 +3234,7 @@ static int core_scsi3_pro_preempt( | |||
3233 | * additional sense code set to REGISTRATIONS PREEMPTED; | 3234 | * additional sense code set to REGISTRATIONS PREEMPTED; |
3234 | */ | 3235 | */ |
3235 | core_scsi3_ua_allocate(pr_reg_nacl, pr_res_mapped_lun, 0x2A, | 3236 | core_scsi3_ua_allocate(pr_reg_nacl, pr_res_mapped_lun, 0x2A, |
3236 | ASCQ_2AH_RESERVATIONS_PREEMPTED); | 3237 | ASCQ_2AH_REGISTRATIONS_PREEMPTED); |
3237 | } | 3238 | } |
3238 | spin_unlock(&pr_tmpl->registration_lock); | 3239 | spin_unlock(&pr_tmpl->registration_lock); |
3239 | /* | 3240 | /* |
@@ -3410,14 +3411,14 @@ static int core_scsi3_emulate_pro_register_and_move( | |||
3410 | * will be moved to for the TransportID containing SCSI initiator WWN | 3411 | * will be moved to for the TransportID containing SCSI initiator WWN |
3411 | * information. | 3412 | * information. |
3412 | */ | 3413 | */ |
3413 | buf = transport_kmap_first_data_page(cmd); | 3414 | buf = transport_kmap_data_sg(cmd); |
3414 | rtpi = (buf[18] & 0xff) << 8; | 3415 | rtpi = (buf[18] & 0xff) << 8; |
3415 | rtpi |= buf[19] & 0xff; | 3416 | rtpi |= buf[19] & 0xff; |
3416 | tid_len = (buf[20] & 0xff) << 24; | 3417 | tid_len = (buf[20] & 0xff) << 24; |
3417 | tid_len |= (buf[21] & 0xff) << 16; | 3418 | tid_len |= (buf[21] & 0xff) << 16; |
3418 | tid_len |= (buf[22] & 0xff) << 8; | 3419 | tid_len |= (buf[22] & 0xff) << 8; |
3419 | tid_len |= buf[23] & 0xff; | 3420 | tid_len |= buf[23] & 0xff; |
3420 | transport_kunmap_first_data_page(cmd); | 3421 | transport_kunmap_data_sg(cmd); |
3421 | buf = NULL; | 3422 | buf = NULL; |
3422 | 3423 | ||
3423 | if ((tid_len + 24) != cmd->data_length) { | 3424 | if ((tid_len + 24) != cmd->data_length) { |
@@ -3469,7 +3470,7 @@ static int core_scsi3_emulate_pro_register_and_move( | |||
3469 | return -EINVAL; | 3470 | return -EINVAL; |
3470 | } | 3471 | } |
3471 | 3472 | ||
3472 | buf = transport_kmap_first_data_page(cmd); | 3473 | buf = transport_kmap_data_sg(cmd); |
3473 | proto_ident = (buf[24] & 0x0f); | 3474 | proto_ident = (buf[24] & 0x0f); |
3474 | #if 0 | 3475 | #if 0 |
3475 | pr_debug("SPC-3 PR REGISTER_AND_MOVE: Extracted Protocol Identifier:" | 3476 | pr_debug("SPC-3 PR REGISTER_AND_MOVE: Extracted Protocol Identifier:" |
@@ -3503,7 +3504,7 @@ static int core_scsi3_emulate_pro_register_and_move( | |||
3503 | goto out; | 3504 | goto out; |
3504 | } | 3505 | } |
3505 | 3506 | ||
3506 | transport_kunmap_first_data_page(cmd); | 3507 | transport_kunmap_data_sg(cmd); |
3507 | buf = NULL; | 3508 | buf = NULL; |
3508 | 3509 | ||
3509 | pr_debug("SPC-3 PR [%s] Extracted initiator %s identifier: %s" | 3510 | pr_debug("SPC-3 PR [%s] Extracted initiator %s identifier: %s" |
@@ -3768,13 +3769,13 @@ after_iport_check: | |||
3768 | " REGISTER_AND_MOVE\n"); | 3769 | " REGISTER_AND_MOVE\n"); |
3769 | } | 3770 | } |
3770 | 3771 | ||
3771 | transport_kunmap_first_data_page(cmd); | 3772 | transport_kunmap_data_sg(cmd); |
3772 | 3773 | ||
3773 | core_scsi3_put_pr_reg(dest_pr_reg); | 3774 | core_scsi3_put_pr_reg(dest_pr_reg); |
3774 | return 0; | 3775 | return 0; |
3775 | out: | 3776 | out: |
3776 | if (buf) | 3777 | if (buf) |
3777 | transport_kunmap_first_data_page(cmd); | 3778 | transport_kunmap_data_sg(cmd); |
3778 | if (dest_se_deve) | 3779 | if (dest_se_deve) |
3779 | core_scsi3_lunacl_undepend_item(dest_se_deve); | 3780 | core_scsi3_lunacl_undepend_item(dest_se_deve); |
3780 | if (dest_node_acl) | 3781 | if (dest_node_acl) |
@@ -3848,7 +3849,7 @@ int target_scsi3_emulate_pr_out(struct se_task *task) | |||
3848 | scope = (cdb[2] & 0xf0); | 3849 | scope = (cdb[2] & 0xf0); |
3849 | type = (cdb[2] & 0x0f); | 3850 | type = (cdb[2] & 0x0f); |
3850 | 3851 | ||
3851 | buf = transport_kmap_first_data_page(cmd); | 3852 | buf = transport_kmap_data_sg(cmd); |
3852 | /* | 3853 | /* |
3853 | * From PERSISTENT_RESERVE_OUT parameter list (payload) | 3854 | * From PERSISTENT_RESERVE_OUT parameter list (payload) |
3854 | */ | 3855 | */ |
@@ -3866,7 +3867,7 @@ int target_scsi3_emulate_pr_out(struct se_task *task) | |||
3866 | aptpl = (buf[17] & 0x01); | 3867 | aptpl = (buf[17] & 0x01); |
3867 | unreg = (buf[17] & 0x02); | 3868 | unreg = (buf[17] & 0x02); |
3868 | } | 3869 | } |
3869 | transport_kunmap_first_data_page(cmd); | 3870 | transport_kunmap_data_sg(cmd); |
3870 | buf = NULL; | 3871 | buf = NULL; |
3871 | 3872 | ||
3872 | /* | 3873 | /* |
@@ -3966,7 +3967,7 @@ static int core_scsi3_pri_read_keys(struct se_cmd *cmd) | |||
3966 | return -EINVAL; | 3967 | return -EINVAL; |
3967 | } | 3968 | } |
3968 | 3969 | ||
3969 | buf = transport_kmap_first_data_page(cmd); | 3970 | buf = transport_kmap_data_sg(cmd); |
3970 | buf[0] = ((su_dev->t10_pr.pr_generation >> 24) & 0xff); | 3971 | buf[0] = ((su_dev->t10_pr.pr_generation >> 24) & 0xff); |
3971 | buf[1] = ((su_dev->t10_pr.pr_generation >> 16) & 0xff); | 3972 | buf[1] = ((su_dev->t10_pr.pr_generation >> 16) & 0xff); |
3972 | buf[2] = ((su_dev->t10_pr.pr_generation >> 8) & 0xff); | 3973 | buf[2] = ((su_dev->t10_pr.pr_generation >> 8) & 0xff); |
@@ -4000,7 +4001,7 @@ static int core_scsi3_pri_read_keys(struct se_cmd *cmd) | |||
4000 | buf[6] = ((add_len >> 8) & 0xff); | 4001 | buf[6] = ((add_len >> 8) & 0xff); |
4001 | buf[7] = (add_len & 0xff); | 4002 | buf[7] = (add_len & 0xff); |
4002 | 4003 | ||
4003 | transport_kunmap_first_data_page(cmd); | 4004 | transport_kunmap_data_sg(cmd); |
4004 | 4005 | ||
4005 | return 0; | 4006 | return 0; |
4006 | } | 4007 | } |
@@ -4026,7 +4027,7 @@ static int core_scsi3_pri_read_reservation(struct se_cmd *cmd) | |||
4026 | return -EINVAL; | 4027 | return -EINVAL; |
4027 | } | 4028 | } |
4028 | 4029 | ||
4029 | buf = transport_kmap_first_data_page(cmd); | 4030 | buf = transport_kmap_data_sg(cmd); |
4030 | buf[0] = ((su_dev->t10_pr.pr_generation >> 24) & 0xff); | 4031 | buf[0] = ((su_dev->t10_pr.pr_generation >> 24) & 0xff); |
4031 | buf[1] = ((su_dev->t10_pr.pr_generation >> 16) & 0xff); | 4032 | buf[1] = ((su_dev->t10_pr.pr_generation >> 16) & 0xff); |
4032 | buf[2] = ((su_dev->t10_pr.pr_generation >> 8) & 0xff); | 4033 | buf[2] = ((su_dev->t10_pr.pr_generation >> 8) & 0xff); |
@@ -4085,7 +4086,7 @@ static int core_scsi3_pri_read_reservation(struct se_cmd *cmd) | |||
4085 | 4086 | ||
4086 | err: | 4087 | err: |
4087 | spin_unlock(&se_dev->dev_reservation_lock); | 4088 | spin_unlock(&se_dev->dev_reservation_lock); |
4088 | transport_kunmap_first_data_page(cmd); | 4089 | transport_kunmap_data_sg(cmd); |
4089 | 4090 | ||
4090 | return 0; | 4091 | return 0; |
4091 | } | 4092 | } |
@@ -4109,7 +4110,7 @@ static int core_scsi3_pri_report_capabilities(struct se_cmd *cmd) | |||
4109 | return -EINVAL; | 4110 | return -EINVAL; |
4110 | } | 4111 | } |
4111 | 4112 | ||
4112 | buf = transport_kmap_first_data_page(cmd); | 4113 | buf = transport_kmap_data_sg(cmd); |
4113 | 4114 | ||
4114 | buf[0] = ((add_len << 8) & 0xff); | 4115 | buf[0] = ((add_len << 8) & 0xff); |
4115 | buf[1] = (add_len & 0xff); | 4116 | buf[1] = (add_len & 0xff); |
@@ -4141,7 +4142,7 @@ static int core_scsi3_pri_report_capabilities(struct se_cmd *cmd) | |||
4141 | buf[4] |= 0x02; /* PR_TYPE_WRITE_EXCLUSIVE */ | 4142 | buf[4] |= 0x02; /* PR_TYPE_WRITE_EXCLUSIVE */ |
4142 | buf[5] |= 0x01; /* PR_TYPE_EXCLUSIVE_ACCESS_ALLREG */ | 4143 | buf[5] |= 0x01; /* PR_TYPE_EXCLUSIVE_ACCESS_ALLREG */ |
4143 | 4144 | ||
4144 | transport_kunmap_first_data_page(cmd); | 4145 | transport_kunmap_data_sg(cmd); |
4145 | 4146 | ||
4146 | return 0; | 4147 | return 0; |
4147 | } | 4148 | } |
@@ -4171,7 +4172,7 @@ static int core_scsi3_pri_read_full_status(struct se_cmd *cmd) | |||
4171 | return -EINVAL; | 4172 | return -EINVAL; |
4172 | } | 4173 | } |
4173 | 4174 | ||
4174 | buf = transport_kmap_first_data_page(cmd); | 4175 | buf = transport_kmap_data_sg(cmd); |
4175 | 4176 | ||
4176 | buf[0] = ((su_dev->t10_pr.pr_generation >> 24) & 0xff); | 4177 | buf[0] = ((su_dev->t10_pr.pr_generation >> 24) & 0xff); |
4177 | buf[1] = ((su_dev->t10_pr.pr_generation >> 16) & 0xff); | 4178 | buf[1] = ((su_dev->t10_pr.pr_generation >> 16) & 0xff); |
@@ -4292,7 +4293,7 @@ static int core_scsi3_pri_read_full_status(struct se_cmd *cmd) | |||
4292 | buf[6] = ((add_len >> 8) & 0xff); | 4293 | buf[6] = ((add_len >> 8) & 0xff); |
4293 | buf[7] = (add_len & 0xff); | 4294 | buf[7] = (add_len & 0xff); |
4294 | 4295 | ||
4295 | transport_kunmap_first_data_page(cmd); | 4296 | transport_kunmap_data_sg(cmd); |
4296 | 4297 | ||
4297 | return 0; | 4298 | return 0; |
4298 | } | 4299 | } |
diff --git a/drivers/target/target_core_pscsi.c b/drivers/target/target_core_pscsi.c index d35467d42e12..8d4def30e9e8 100644 --- a/drivers/target/target_core_pscsi.c +++ b/drivers/target/target_core_pscsi.c | |||
@@ -693,7 +693,7 @@ static int pscsi_transport_complete(struct se_task *task) | |||
693 | 693 | ||
694 | if (task->task_se_cmd->se_deve->lun_flags & | 694 | if (task->task_se_cmd->se_deve->lun_flags & |
695 | TRANSPORT_LUNFLAGS_READ_ONLY) { | 695 | TRANSPORT_LUNFLAGS_READ_ONLY) { |
696 | unsigned char *buf = transport_kmap_first_data_page(task->task_se_cmd); | 696 | unsigned char *buf = transport_kmap_data_sg(task->task_se_cmd); |
697 | 697 | ||
698 | if (cdb[0] == MODE_SENSE_10) { | 698 | if (cdb[0] == MODE_SENSE_10) { |
699 | if (!(buf[3] & 0x80)) | 699 | if (!(buf[3] & 0x80)) |
@@ -703,7 +703,7 @@ static int pscsi_transport_complete(struct se_task *task) | |||
703 | buf[2] |= 0x80; | 703 | buf[2] |= 0x80; |
704 | } | 704 | } |
705 | 705 | ||
706 | transport_kunmap_first_data_page(task->task_se_cmd); | 706 | transport_kunmap_data_sg(task->task_se_cmd); |
707 | } | 707 | } |
708 | } | 708 | } |
709 | after_mode_sense: | 709 | after_mode_sense: |
diff --git a/drivers/target/target_core_tpg.c b/drivers/target/target_core_tpg.c index b7668029bb31..06336ecd872d 100644 --- a/drivers/target/target_core_tpg.c +++ b/drivers/target/target_core_tpg.c | |||
@@ -807,8 +807,7 @@ static void core_tpg_shutdown_lun( | |||
807 | 807 | ||
808 | struct se_lun *core_tpg_pre_dellun( | 808 | struct se_lun *core_tpg_pre_dellun( |
809 | struct se_portal_group *tpg, | 809 | struct se_portal_group *tpg, |
810 | u32 unpacked_lun, | 810 | u32 unpacked_lun) |
811 | int *ret) | ||
812 | { | 811 | { |
813 | struct se_lun *lun; | 812 | struct se_lun *lun; |
814 | 813 | ||
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c index d3ddd1361949..58cea07b12fb 100644 --- a/drivers/target/target_core_transport.c +++ b/drivers/target/target_core_transport.c | |||
@@ -1255,32 +1255,34 @@ static void core_setup_task_attr_emulation(struct se_device *dev) | |||
1255 | static void scsi_dump_inquiry(struct se_device *dev) | 1255 | static void scsi_dump_inquiry(struct se_device *dev) |
1256 | { | 1256 | { |
1257 | struct t10_wwn *wwn = &dev->se_sub_dev->t10_wwn; | 1257 | struct t10_wwn *wwn = &dev->se_sub_dev->t10_wwn; |
1258 | char buf[17]; | ||
1258 | int i, device_type; | 1259 | int i, device_type; |
1259 | /* | 1260 | /* |
1260 | * Print Linux/SCSI style INQUIRY formatting to the kernel ring buffer | 1261 | * Print Linux/SCSI style INQUIRY formatting to the kernel ring buffer |
1261 | */ | 1262 | */ |
1262 | pr_debug(" Vendor: "); | ||
1263 | for (i = 0; i < 8; i++) | 1263 | for (i = 0; i < 8; i++) |
1264 | if (wwn->vendor[i] >= 0x20) | 1264 | if (wwn->vendor[i] >= 0x20) |
1265 | pr_debug("%c", wwn->vendor[i]); | 1265 | buf[i] = wwn->vendor[i]; |
1266 | else | 1266 | else |
1267 | pr_debug(" "); | 1267 | buf[i] = ' '; |
1268 | buf[i] = '\0'; | ||
1269 | pr_debug(" Vendor: %s\n", buf); | ||
1268 | 1270 | ||
1269 | pr_debug(" Model: "); | ||
1270 | for (i = 0; i < 16; i++) | 1271 | for (i = 0; i < 16; i++) |
1271 | if (wwn->model[i] >= 0x20) | 1272 | if (wwn->model[i] >= 0x20) |
1272 | pr_debug("%c", wwn->model[i]); | 1273 | buf[i] = wwn->model[i]; |
1273 | else | 1274 | else |
1274 | pr_debug(" "); | 1275 | buf[i] = ' '; |
1276 | buf[i] = '\0'; | ||
1277 | pr_debug(" Model: %s\n", buf); | ||
1275 | 1278 | ||
1276 | pr_debug(" Revision: "); | ||
1277 | for (i = 0; i < 4; i++) | 1279 | for (i = 0; i < 4; i++) |
1278 | if (wwn->revision[i] >= 0x20) | 1280 | if (wwn->revision[i] >= 0x20) |
1279 | pr_debug("%c", wwn->revision[i]); | 1281 | buf[i] = wwn->revision[i]; |
1280 | else | 1282 | else |
1281 | pr_debug(" "); | 1283 | buf[i] = ' '; |
1282 | 1284 | buf[i] = '\0'; | |
1283 | pr_debug("\n"); | 1285 | pr_debug(" Revision: %s\n", buf); |
1284 | 1286 | ||
1285 | device_type = dev->transport->get_device_type(dev); | 1287 | device_type = dev->transport->get_device_type(dev); |
1286 | pr_debug(" Type: %s ", scsi_device_type(device_type)); | 1288 | pr_debug(" Type: %s ", scsi_device_type(device_type)); |
@@ -1655,7 +1657,7 @@ EXPORT_SYMBOL(transport_handle_cdb_direct); | |||
1655 | * This may only be called from process context, and also currently | 1657 | * This may only be called from process context, and also currently |
1656 | * assumes internal allocation of fabric payload buffer by target-core. | 1658 | * assumes internal allocation of fabric payload buffer by target-core. |
1657 | **/ | 1659 | **/ |
1658 | int target_submit_cmd(struct se_cmd *se_cmd, struct se_session *se_sess, | 1660 | void target_submit_cmd(struct se_cmd *se_cmd, struct se_session *se_sess, |
1659 | unsigned char *cdb, unsigned char *sense, u32 unpacked_lun, | 1661 | unsigned char *cdb, unsigned char *sense, u32 unpacked_lun, |
1660 | u32 data_length, int task_attr, int data_dir, int flags) | 1662 | u32 data_length, int task_attr, int data_dir, int flags) |
1661 | { | 1663 | { |
@@ -1688,15 +1690,21 @@ int target_submit_cmd(struct se_cmd *se_cmd, struct se_session *se_sess, | |||
1688 | /* | 1690 | /* |
1689 | * Locate se_lun pointer and attach it to struct se_cmd | 1691 | * Locate se_lun pointer and attach it to struct se_cmd |
1690 | */ | 1692 | */ |
1691 | if (transport_lookup_cmd_lun(se_cmd, unpacked_lun) < 0) | 1693 | if (transport_lookup_cmd_lun(se_cmd, unpacked_lun) < 0) { |
1692 | goto out_check_cond; | 1694 | transport_send_check_condition_and_sense(se_cmd, |
1695 | se_cmd->scsi_sense_reason, 0); | ||
1696 | target_put_sess_cmd(se_sess, se_cmd); | ||
1697 | return; | ||
1698 | } | ||
1693 | /* | 1699 | /* |
1694 | * Sanitize CDBs via transport_generic_cmd_sequencer() and | 1700 | * Sanitize CDBs via transport_generic_cmd_sequencer() and |
1695 | * allocate the necessary tasks to complete the received CDB+data | 1701 | * allocate the necessary tasks to complete the received CDB+data |
1696 | */ | 1702 | */ |
1697 | rc = transport_generic_allocate_tasks(se_cmd, cdb); | 1703 | rc = transport_generic_allocate_tasks(se_cmd, cdb); |
1698 | if (rc != 0) | 1704 | if (rc != 0) { |
1699 | goto out_check_cond; | 1705 | transport_generic_request_failure(se_cmd); |
1706 | return; | ||
1707 | } | ||
1700 | /* | 1708 | /* |
1701 | * Dispatch se_cmd descriptor to se_lun->lun_se_dev backend | 1709 | * Dispatch se_cmd descriptor to se_lun->lun_se_dev backend |
1702 | * for immediate execution of READs, otherwise wait for | 1710 | * for immediate execution of READs, otherwise wait for |
@@ -1704,12 +1712,7 @@ int target_submit_cmd(struct se_cmd *se_cmd, struct se_session *se_sess, | |||
1704 | * when fabric has filled the incoming buffer. | 1712 | * when fabric has filled the incoming buffer. |
1705 | */ | 1713 | */ |
1706 | transport_handle_cdb_direct(se_cmd); | 1714 | transport_handle_cdb_direct(se_cmd); |
1707 | return 0; | 1715 | return; |
1708 | |||
1709 | out_check_cond: | ||
1710 | transport_send_check_condition_and_sense(se_cmd, | ||
1711 | se_cmd->scsi_sense_reason, 0); | ||
1712 | return 0; | ||
1713 | } | 1716 | } |
1714 | EXPORT_SYMBOL(target_submit_cmd); | 1717 | EXPORT_SYMBOL(target_submit_cmd); |
1715 | 1718 | ||
@@ -2694,7 +2697,7 @@ static int transport_generic_cmd_sequencer( | |||
2694 | cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB; | 2697 | cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB; |
2695 | 2698 | ||
2696 | if (target_check_write_same_discard(&cdb[10], dev) < 0) | 2699 | if (target_check_write_same_discard(&cdb[10], dev) < 0) |
2697 | goto out_invalid_cdb_field; | 2700 | goto out_unsupported_cdb; |
2698 | if (!passthrough) | 2701 | if (!passthrough) |
2699 | cmd->execute_task = target_emulate_write_same; | 2702 | cmd->execute_task = target_emulate_write_same; |
2700 | break; | 2703 | break; |
@@ -2977,7 +2980,7 @@ static int transport_generic_cmd_sequencer( | |||
2977 | cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB; | 2980 | cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB; |
2978 | 2981 | ||
2979 | if (target_check_write_same_discard(&cdb[1], dev) < 0) | 2982 | if (target_check_write_same_discard(&cdb[1], dev) < 0) |
2980 | goto out_invalid_cdb_field; | 2983 | goto out_unsupported_cdb; |
2981 | if (!passthrough) | 2984 | if (!passthrough) |
2982 | cmd->execute_task = target_emulate_write_same; | 2985 | cmd->execute_task = target_emulate_write_same; |
2983 | break; | 2986 | break; |
@@ -3000,7 +3003,7 @@ static int transport_generic_cmd_sequencer( | |||
3000 | * of byte 1 bit 3 UNMAP instead of original reserved field | 3003 | * of byte 1 bit 3 UNMAP instead of original reserved field |
3001 | */ | 3004 | */ |
3002 | if (target_check_write_same_discard(&cdb[1], dev) < 0) | 3005 | if (target_check_write_same_discard(&cdb[1], dev) < 0) |
3003 | goto out_invalid_cdb_field; | 3006 | goto out_unsupported_cdb; |
3004 | if (!passthrough) | 3007 | if (!passthrough) |
3005 | cmd->execute_task = target_emulate_write_same; | 3008 | cmd->execute_task = target_emulate_write_same; |
3006 | break; | 3009 | break; |
@@ -3082,11 +3085,6 @@ static int transport_generic_cmd_sequencer( | |||
3082 | (cmd->se_cmd_flags & SCF_SCSI_DATA_SG_IO_CDB))) | 3085 | (cmd->se_cmd_flags & SCF_SCSI_DATA_SG_IO_CDB))) |
3083 | goto out_unsupported_cdb; | 3086 | goto out_unsupported_cdb; |
3084 | 3087 | ||
3085 | /* Let's limit control cdbs to a page, for simplicity's sake. */ | ||
3086 | if ((cmd->se_cmd_flags & SCF_SCSI_CONTROL_SG_IO_CDB) && | ||
3087 | size > PAGE_SIZE) | ||
3088 | goto out_invalid_cdb_field; | ||
3089 | |||
3090 | transport_set_supported_SAM_opcode(cmd); | 3088 | transport_set_supported_SAM_opcode(cmd); |
3091 | return ret; | 3089 | return ret; |
3092 | 3090 | ||
@@ -3490,9 +3488,11 @@ int transport_generic_map_mem_to_cmd( | |||
3490 | } | 3488 | } |
3491 | EXPORT_SYMBOL(transport_generic_map_mem_to_cmd); | 3489 | EXPORT_SYMBOL(transport_generic_map_mem_to_cmd); |
3492 | 3490 | ||
3493 | void *transport_kmap_first_data_page(struct se_cmd *cmd) | 3491 | void *transport_kmap_data_sg(struct se_cmd *cmd) |
3494 | { | 3492 | { |
3495 | struct scatterlist *sg = cmd->t_data_sg; | 3493 | struct scatterlist *sg = cmd->t_data_sg; |
3494 | struct page **pages; | ||
3495 | int i; | ||
3496 | 3496 | ||
3497 | BUG_ON(!sg); | 3497 | BUG_ON(!sg); |
3498 | /* | 3498 | /* |
@@ -3500,15 +3500,41 @@ void *transport_kmap_first_data_page(struct se_cmd *cmd) | |||
3500 | * tcm_loop who may be using a contig buffer from the SCSI midlayer for | 3500 | * tcm_loop who may be using a contig buffer from the SCSI midlayer for |
3501 | * control CDBs passed as SGLs via transport_generic_map_mem_to_cmd() | 3501 | * control CDBs passed as SGLs via transport_generic_map_mem_to_cmd() |
3502 | */ | 3502 | */ |
3503 | return kmap(sg_page(sg)) + sg->offset; | 3503 | if (!cmd->t_data_nents) |
3504 | return NULL; | ||
3505 | else if (cmd->t_data_nents == 1) | ||
3506 | return kmap(sg_page(sg)) + sg->offset; | ||
3507 | |||
3508 | /* >1 page. use vmap */ | ||
3509 | pages = kmalloc(sizeof(*pages) * cmd->t_data_nents, GFP_KERNEL); | ||
3510 | if (!pages) | ||
3511 | return NULL; | ||
3512 | |||
3513 | /* convert sg[] to pages[] */ | ||
3514 | for_each_sg(cmd->t_data_sg, sg, cmd->t_data_nents, i) { | ||
3515 | pages[i] = sg_page(sg); | ||
3516 | } | ||
3517 | |||
3518 | cmd->t_data_vmap = vmap(pages, cmd->t_data_nents, VM_MAP, PAGE_KERNEL); | ||
3519 | kfree(pages); | ||
3520 | if (!cmd->t_data_vmap) | ||
3521 | return NULL; | ||
3522 | |||
3523 | return cmd->t_data_vmap + cmd->t_data_sg[0].offset; | ||
3504 | } | 3524 | } |
3505 | EXPORT_SYMBOL(transport_kmap_first_data_page); | 3525 | EXPORT_SYMBOL(transport_kmap_data_sg); |
3506 | 3526 | ||
3507 | void transport_kunmap_first_data_page(struct se_cmd *cmd) | 3527 | void transport_kunmap_data_sg(struct se_cmd *cmd) |
3508 | { | 3528 | { |
3509 | kunmap(sg_page(cmd->t_data_sg)); | 3529 | if (!cmd->t_data_nents) |
3530 | return; | ||
3531 | else if (cmd->t_data_nents == 1) | ||
3532 | kunmap(sg_page(cmd->t_data_sg)); | ||
3533 | |||
3534 | vunmap(cmd->t_data_vmap); | ||
3535 | cmd->t_data_vmap = NULL; | ||
3510 | } | 3536 | } |
3511 | EXPORT_SYMBOL(transport_kunmap_first_data_page); | 3537 | EXPORT_SYMBOL(transport_kunmap_data_sg); |
3512 | 3538 | ||
3513 | static int | 3539 | static int |
3514 | transport_generic_get_mem(struct se_cmd *cmd) | 3540 | transport_generic_get_mem(struct se_cmd *cmd) |
@@ -3516,6 +3542,7 @@ transport_generic_get_mem(struct se_cmd *cmd) | |||
3516 | u32 length = cmd->data_length; | 3542 | u32 length = cmd->data_length; |
3517 | unsigned int nents; | 3543 | unsigned int nents; |
3518 | struct page *page; | 3544 | struct page *page; |
3545 | gfp_t zero_flag; | ||
3519 | int i = 0; | 3546 | int i = 0; |
3520 | 3547 | ||
3521 | nents = DIV_ROUND_UP(length, PAGE_SIZE); | 3548 | nents = DIV_ROUND_UP(length, PAGE_SIZE); |
@@ -3526,9 +3553,11 @@ transport_generic_get_mem(struct se_cmd *cmd) | |||
3526 | cmd->t_data_nents = nents; | 3553 | cmd->t_data_nents = nents; |
3527 | sg_init_table(cmd->t_data_sg, nents); | 3554 | sg_init_table(cmd->t_data_sg, nents); |
3528 | 3555 | ||
3556 | zero_flag = cmd->se_cmd_flags & SCF_SCSI_DATA_SG_IO_CDB ? 0 : __GFP_ZERO; | ||
3557 | |||
3529 | while (length) { | 3558 | while (length) { |
3530 | u32 page_len = min_t(u32, length, PAGE_SIZE); | 3559 | u32 page_len = min_t(u32, length, PAGE_SIZE); |
3531 | page = alloc_page(GFP_KERNEL | __GFP_ZERO); | 3560 | page = alloc_page(GFP_KERNEL | zero_flag); |
3532 | if (!page) | 3561 | if (!page) |
3533 | goto out; | 3562 | goto out; |
3534 | 3563 | ||
@@ -3756,6 +3785,11 @@ transport_allocate_control_task(struct se_cmd *cmd) | |||
3756 | struct se_task *task; | 3785 | struct se_task *task; |
3757 | unsigned long flags; | 3786 | unsigned long flags; |
3758 | 3787 | ||
3788 | /* Workaround for handling zero-length control CDBs */ | ||
3789 | if ((cmd->se_cmd_flags & SCF_SCSI_CONTROL_SG_IO_CDB) && | ||
3790 | !cmd->data_length) | ||
3791 | return 0; | ||
3792 | |||
3759 | task = transport_generic_get_task(cmd, cmd->data_direction); | 3793 | task = transport_generic_get_task(cmd, cmd->data_direction); |
3760 | if (!task) | 3794 | if (!task) |
3761 | return -ENOMEM; | 3795 | return -ENOMEM; |
@@ -3827,6 +3861,14 @@ int transport_generic_new_cmd(struct se_cmd *cmd) | |||
3827 | else if (!task_cdbs && (cmd->se_cmd_flags & SCF_SCSI_DATA_SG_IO_CDB)) { | 3861 | else if (!task_cdbs && (cmd->se_cmd_flags & SCF_SCSI_DATA_SG_IO_CDB)) { |
3828 | cmd->t_state = TRANSPORT_COMPLETE; | 3862 | cmd->t_state = TRANSPORT_COMPLETE; |
3829 | atomic_set(&cmd->t_transport_active, 1); | 3863 | atomic_set(&cmd->t_transport_active, 1); |
3864 | |||
3865 | if (cmd->t_task_cdb[0] == REQUEST_SENSE) { | ||
3866 | u8 ua_asc = 0, ua_ascq = 0; | ||
3867 | |||
3868 | core_scsi3_ua_clear_for_request_sense(cmd, | ||
3869 | &ua_asc, &ua_ascq); | ||
3870 | } | ||
3871 | |||
3830 | INIT_WORK(&cmd->work, target_complete_ok_work); | 3872 | INIT_WORK(&cmd->work, target_complete_ok_work); |
3831 | queue_work(target_completion_wq, &cmd->work); | 3873 | queue_work(target_completion_wq, &cmd->work); |
3832 | return 0; | 3874 | return 0; |
@@ -4448,8 +4490,8 @@ int transport_send_check_condition_and_sense( | |||
4448 | /* CURRENT ERROR */ | 4490 | /* CURRENT ERROR */ |
4449 | buffer[offset] = 0x70; | 4491 | buffer[offset] = 0x70; |
4450 | buffer[offset+SPC_ADD_SENSE_LEN_OFFSET] = 10; | 4492 | buffer[offset+SPC_ADD_SENSE_LEN_OFFSET] = 10; |
4451 | /* ABORTED COMMAND */ | 4493 | /* ILLEGAL REQUEST */ |
4452 | buffer[offset+SPC_SENSE_KEY_OFFSET] = ABORTED_COMMAND; | 4494 | buffer[offset+SPC_SENSE_KEY_OFFSET] = ILLEGAL_REQUEST; |
4453 | /* INVALID FIELD IN CDB */ | 4495 | /* INVALID FIELD IN CDB */ |
4454 | buffer[offset+SPC_ASC_KEY_OFFSET] = 0x24; | 4496 | buffer[offset+SPC_ASC_KEY_OFFSET] = 0x24; |
4455 | break; | 4497 | break; |
@@ -4457,8 +4499,8 @@ int transport_send_check_condition_and_sense( | |||
4457 | /* CURRENT ERROR */ | 4499 | /* CURRENT ERROR */ |
4458 | buffer[offset] = 0x70; | 4500 | buffer[offset] = 0x70; |
4459 | buffer[offset+SPC_ADD_SENSE_LEN_OFFSET] = 10; | 4501 | buffer[offset+SPC_ADD_SENSE_LEN_OFFSET] = 10; |
4460 | /* ABORTED COMMAND */ | 4502 | /* ILLEGAL REQUEST */ |
4461 | buffer[offset+SPC_SENSE_KEY_OFFSET] = ABORTED_COMMAND; | 4503 | buffer[offset+SPC_SENSE_KEY_OFFSET] = ILLEGAL_REQUEST; |
4462 | /* INVALID FIELD IN PARAMETER LIST */ | 4504 | /* INVALID FIELD IN PARAMETER LIST */ |
4463 | buffer[offset+SPC_ASC_KEY_OFFSET] = 0x26; | 4505 | buffer[offset+SPC_ASC_KEY_OFFSET] = 0x26; |
4464 | break; | 4506 | break; |
diff --git a/drivers/target/tcm_fc/tfc_cmd.c b/drivers/target/tcm_fc/tfc_cmd.c index addc18f727ea..9e7e26c74c79 100644 --- a/drivers/target/tcm_fc/tfc_cmd.c +++ b/drivers/target/tcm_fc/tfc_cmd.c | |||
@@ -540,7 +540,6 @@ static void ft_send_work(struct work_struct *work) | |||
540 | int data_dir = 0; | 540 | int data_dir = 0; |
541 | u32 data_len; | 541 | u32 data_len; |
542 | int task_attr; | 542 | int task_attr; |
543 | int ret; | ||
544 | 543 | ||
545 | fcp = fc_frame_payload_get(cmd->req_frame, sizeof(*fcp)); | 544 | fcp = fc_frame_payload_get(cmd->req_frame, sizeof(*fcp)); |
546 | if (!fcp) | 545 | if (!fcp) |
@@ -603,14 +602,10 @@ static void ft_send_work(struct work_struct *work) | |||
603 | * Use a single se_cmd->cmd_kref as we expect to release se_cmd | 602 | * Use a single se_cmd->cmd_kref as we expect to release se_cmd |
604 | * directly from ft_check_stop_free callback in response path. | 603 | * directly from ft_check_stop_free callback in response path. |
605 | */ | 604 | */ |
606 | ret = target_submit_cmd(&cmd->se_cmd, cmd->sess->se_sess, cmd->cdb, | 605 | target_submit_cmd(&cmd->se_cmd, cmd->sess->se_sess, cmd->cdb, |
607 | &cmd->ft_sense_buffer[0], cmd->lun, data_len, | 606 | &cmd->ft_sense_buffer[0], cmd->lun, data_len, |
608 | task_attr, data_dir, 0); | 607 | task_attr, data_dir, 0); |
609 | pr_debug("r_ctl %x alloc target_submit_cmd %d\n", fh->fh_r_ctl, ret); | 608 | pr_debug("r_ctl %x alloc target_submit_cmd\n", fh->fh_r_ctl); |
610 | if (ret < 0) { | ||
611 | ft_dump_cmd(cmd, __func__); | ||
612 | return; | ||
613 | } | ||
614 | return; | 609 | return; |
615 | 610 | ||
616 | err: | 611 | err: |
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/tty/vt/vt_ioctl.c b/drivers/tty/vt/vt_ioctl.c index 5e096f43bcea..65447c5f91d7 100644 --- a/drivers/tty/vt/vt_ioctl.c +++ b/drivers/tty/vt/vt_ioctl.c | |||
@@ -1463,7 +1463,6 @@ compat_kdfontop_ioctl(struct compat_console_font_op __user *fontop, | |||
1463 | if (!perm && op->op != KD_FONT_OP_GET) | 1463 | if (!perm && op->op != KD_FONT_OP_GET) |
1464 | return -EPERM; | 1464 | return -EPERM; |
1465 | op->data = compat_ptr(((struct compat_console_font_op *)op)->data); | 1465 | op->data = compat_ptr(((struct compat_console_font_op *)op)->data); |
1466 | op->flags |= KD_FONT_FLAG_OLD; | ||
1467 | i = con_font_op(vc, op); | 1466 | i = con_font_op(vc, op); |
1468 | if (i) | 1467 | if (i) |
1469 | return i; | 1468 | return i; |
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-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/atmel_lcdfb.c b/drivers/video/atmel_lcdfb.c index 0d7b20d4285d..e40c00f2c2ba 100644 --- a/drivers/video/atmel_lcdfb.c +++ b/drivers/video/atmel_lcdfb.c | |||
@@ -1108,7 +1108,7 @@ static int atmel_lcdfb_suspend(struct platform_device *pdev, pm_message_t mesg) | |||
1108 | */ | 1108 | */ |
1109 | lcdc_writel(sinfo, ATMEL_LCDC_IDR, ~0UL); | 1109 | lcdc_writel(sinfo, ATMEL_LCDC_IDR, ~0UL); |
1110 | 1110 | ||
1111 | sinfo->saved_lcdcon = lcdc_readl(sinfo, ATMEL_LCDC_CONTRAST_VAL); | 1111 | sinfo->saved_lcdcon = lcdc_readl(sinfo, ATMEL_LCDC_CONTRAST_CTR); |
1112 | lcdc_writel(sinfo, ATMEL_LCDC_CONTRAST_CTR, 0); | 1112 | lcdc_writel(sinfo, ATMEL_LCDC_CONTRAST_CTR, 0); |
1113 | if (sinfo->atmel_lcdfb_power_control) | 1113 | if (sinfo->atmel_lcdfb_power_control) |
1114 | sinfo->atmel_lcdfb_power_control(0); | 1114 | sinfo->atmel_lcdfb_power_control(0); |
diff --git a/drivers/video/fsl-diu-fb.c b/drivers/video/fsl-diu-fb.c index acf292bfba02..6af3f16754f0 100644 --- a/drivers/video/fsl-diu-fb.c +++ b/drivers/video/fsl-diu-fb.c | |||
@@ -1432,7 +1432,7 @@ static int fsl_diu_suspend(struct platform_device *ofdev, pm_message_t state) | |||
1432 | struct fsl_diu_data *data; | 1432 | struct fsl_diu_data *data; |
1433 | 1433 | ||
1434 | data = dev_get_drvdata(&ofdev->dev); | 1434 | data = dev_get_drvdata(&ofdev->dev); |
1435 | disable_lcdc(data->fsl_diu_info[0]); | 1435 | disable_lcdc(data->fsl_diu_info); |
1436 | 1436 | ||
1437 | return 0; | 1437 | return 0; |
1438 | } | 1438 | } |
@@ -1442,7 +1442,7 @@ static int fsl_diu_resume(struct platform_device *ofdev) | |||
1442 | struct fsl_diu_data *data; | 1442 | struct fsl_diu_data *data; |
1443 | 1443 | ||
1444 | data = dev_get_drvdata(&ofdev->dev); | 1444 | data = dev_get_drvdata(&ofdev->dev); |
1445 | enable_lcdc(data->fsl_diu_info[0]); | 1445 | enable_lcdc(data->fsl_diu_info); |
1446 | 1446 | ||
1447 | return 0; | 1447 | return 0; |
1448 | } | 1448 | } |
diff --git a/drivers/video/intelfb/intelfbdrv.c b/drivers/video/intelfb/intelfbdrv.c index c6afa33a4532..02fd2263610c 100644 --- a/drivers/video/intelfb/intelfbdrv.c +++ b/drivers/video/intelfb/intelfbdrv.c | |||
@@ -529,7 +529,6 @@ static int __devinit intelfb_pci_register(struct pci_dev *pdev, | |||
529 | if (fb_alloc_cmap(&info->cmap, 256, 1) < 0) { | 529 | if (fb_alloc_cmap(&info->cmap, 256, 1) < 0) { |
530 | ERR_MSG("Could not allocate cmap for intelfb_info.\n"); | 530 | ERR_MSG("Could not allocate cmap for intelfb_info.\n"); |
531 | goto err_out_cmap; | 531 | goto err_out_cmap; |
532 | return -ENODEV; | ||
533 | } | 532 | } |
534 | 533 | ||
535 | dinfo = info->par; | 534 | dinfo = info->par; |
diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c index a5ec7f37c185..e1626a1d5c45 100644 --- a/drivers/video/omap2/dss/dispc.c +++ b/drivers/video/omap2/dss/dispc.c | |||
@@ -401,7 +401,7 @@ void dispc_runtime_put(void) | |||
401 | 401 | ||
402 | DSSDBG("dispc_runtime_put\n"); | 402 | DSSDBG("dispc_runtime_put\n"); |
403 | 403 | ||
404 | r = pm_runtime_put(&dispc.pdev->dev); | 404 | r = pm_runtime_put_sync(&dispc.pdev->dev); |
405 | WARN_ON(r < 0); | 405 | WARN_ON(r < 0); |
406 | } | 406 | } |
407 | 407 | ||
diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c index d4d676c82c12..52f36ec1c8bb 100644 --- a/drivers/video/omap2/dss/dsi.c +++ b/drivers/video/omap2/dss/dsi.c | |||
@@ -1079,7 +1079,7 @@ void dsi_runtime_put(struct platform_device *dsidev) | |||
1079 | 1079 | ||
1080 | DSSDBG("dsi_runtime_put\n"); | 1080 | DSSDBG("dsi_runtime_put\n"); |
1081 | 1081 | ||
1082 | r = pm_runtime_put(&dsi->pdev->dev); | 1082 | r = pm_runtime_put_sync(&dsi->pdev->dev); |
1083 | WARN_ON(r < 0); | 1083 | WARN_ON(r < 0); |
1084 | } | 1084 | } |
1085 | 1085 | ||
diff --git a/drivers/video/omap2/dss/dss.c b/drivers/video/omap2/dss/dss.c index 17033457ee89..77c2b5a32b5d 100644 --- a/drivers/video/omap2/dss/dss.c +++ b/drivers/video/omap2/dss/dss.c | |||
@@ -720,7 +720,7 @@ void dss_runtime_put(void) | |||
720 | 720 | ||
721 | DSSDBG("dss_runtime_put\n"); | 721 | DSSDBG("dss_runtime_put\n"); |
722 | 722 | ||
723 | r = pm_runtime_put(&dss.pdev->dev); | 723 | r = pm_runtime_put_sync(&dss.pdev->dev); |
724 | WARN_ON(r < 0); | 724 | WARN_ON(r < 0); |
725 | } | 725 | } |
726 | 726 | ||
diff --git a/drivers/video/omap2/dss/hdmi.c b/drivers/video/omap2/dss/hdmi.c index b4c270edb915..d7aa3b056529 100644 --- a/drivers/video/omap2/dss/hdmi.c +++ b/drivers/video/omap2/dss/hdmi.c | |||
@@ -176,7 +176,7 @@ static void hdmi_runtime_put(void) | |||
176 | 176 | ||
177 | DSSDBG("hdmi_runtime_put\n"); | 177 | DSSDBG("hdmi_runtime_put\n"); |
178 | 178 | ||
179 | r = pm_runtime_put(&hdmi.pdev->dev); | 179 | r = pm_runtime_put_sync(&hdmi.pdev->dev); |
180 | WARN_ON(r < 0); | 180 | WARN_ON(r < 0); |
181 | } | 181 | } |
182 | 182 | ||
@@ -497,6 +497,7 @@ bool omapdss_hdmi_detect(void) | |||
497 | 497 | ||
498 | int omapdss_hdmi_display_enable(struct omap_dss_device *dssdev) | 498 | int omapdss_hdmi_display_enable(struct omap_dss_device *dssdev) |
499 | { | 499 | { |
500 | struct omap_dss_hdmi_data *priv = dssdev->data; | ||
500 | int r = 0; | 501 | int r = 0; |
501 | 502 | ||
502 | DSSDBG("ENTER hdmi_display_enable\n"); | 503 | DSSDBG("ENTER hdmi_display_enable\n"); |
@@ -509,6 +510,8 @@ int omapdss_hdmi_display_enable(struct omap_dss_device *dssdev) | |||
509 | goto err0; | 510 | goto err0; |
510 | } | 511 | } |
511 | 512 | ||
513 | hdmi.ip_data.hpd_gpio = priv->hpd_gpio; | ||
514 | |||
512 | r = omap_dss_start_device(dssdev); | 515 | r = omap_dss_start_device(dssdev); |
513 | if (r) { | 516 | if (r) { |
514 | DSSERR("failed to start device\n"); | 517 | DSSERR("failed to start device\n"); |
diff --git a/drivers/video/omap2/dss/rfbi.c b/drivers/video/omap2/dss/rfbi.c index 814bb9500dca..55f398014f33 100644 --- a/drivers/video/omap2/dss/rfbi.c +++ b/drivers/video/omap2/dss/rfbi.c | |||
@@ -140,7 +140,7 @@ static void rfbi_runtime_put(void) | |||
140 | 140 | ||
141 | DSSDBG("rfbi_runtime_put\n"); | 141 | DSSDBG("rfbi_runtime_put\n"); |
142 | 142 | ||
143 | r = pm_runtime_put(&rfbi.pdev->dev); | 143 | r = pm_runtime_put_sync(&rfbi.pdev->dev); |
144 | WARN_ON(r < 0); | 144 | WARN_ON(r < 0); |
145 | } | 145 | } |
146 | 146 | ||
diff --git a/drivers/video/omap2/dss/ti_hdmi.h b/drivers/video/omap2/dss/ti_hdmi.h index 7503f7f619a7..50dadba5070a 100644 --- a/drivers/video/omap2/dss/ti_hdmi.h +++ b/drivers/video/omap2/dss/ti_hdmi.h | |||
@@ -126,6 +126,10 @@ struct hdmi_ip_data { | |||
126 | const struct ti_hdmi_ip_ops *ops; | 126 | const struct ti_hdmi_ip_ops *ops; |
127 | struct hdmi_config cfg; | 127 | struct hdmi_config cfg; |
128 | struct hdmi_pll_info pll_data; | 128 | struct hdmi_pll_info pll_data; |
129 | |||
130 | /* ti_hdmi_4xxx_ip private data. These should be in a separate struct */ | ||
131 | int hpd_gpio; | ||
132 | bool phy_tx_enabled; | ||
129 | }; | 133 | }; |
130 | int ti_hdmi_4xxx_phy_enable(struct hdmi_ip_data *ip_data); | 134 | int ti_hdmi_4xxx_phy_enable(struct hdmi_ip_data *ip_data); |
131 | void ti_hdmi_4xxx_phy_disable(struct hdmi_ip_data *ip_data); | 135 | void ti_hdmi_4xxx_phy_disable(struct hdmi_ip_data *ip_data); |
diff --git a/drivers/video/omap2/dss/ti_hdmi_4xxx_ip.c b/drivers/video/omap2/dss/ti_hdmi_4xxx_ip.c index 9af81f18f163..2d72334ca3da 100644 --- a/drivers/video/omap2/dss/ti_hdmi_4xxx_ip.c +++ b/drivers/video/omap2/dss/ti_hdmi_4xxx_ip.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <linux/delay.h> | 28 | #include <linux/delay.h> |
29 | #include <linux/string.h> | 29 | #include <linux/string.h> |
30 | #include <linux/seq_file.h> | 30 | #include <linux/seq_file.h> |
31 | #include <linux/gpio.h> | ||
31 | 32 | ||
32 | #include "ti_hdmi_4xxx_ip.h" | 33 | #include "ti_hdmi_4xxx_ip.h" |
33 | #include "dss.h" | 34 | #include "dss.h" |
@@ -223,6 +224,49 @@ void ti_hdmi_4xxx_pll_disable(struct hdmi_ip_data *ip_data) | |||
223 | hdmi_set_pll_pwr(ip_data, HDMI_PLLPWRCMD_ALLOFF); | 224 | hdmi_set_pll_pwr(ip_data, HDMI_PLLPWRCMD_ALLOFF); |
224 | } | 225 | } |
225 | 226 | ||
227 | static int hdmi_check_hpd_state(struct hdmi_ip_data *ip_data) | ||
228 | { | ||
229 | unsigned long flags; | ||
230 | bool hpd; | ||
231 | int r; | ||
232 | /* this should be in ti_hdmi_4xxx_ip private data */ | ||
233 | static DEFINE_SPINLOCK(phy_tx_lock); | ||
234 | |||
235 | spin_lock_irqsave(&phy_tx_lock, flags); | ||
236 | |||
237 | hpd = gpio_get_value(ip_data->hpd_gpio); | ||
238 | |||
239 | if (hpd == ip_data->phy_tx_enabled) { | ||
240 | spin_unlock_irqrestore(&phy_tx_lock, flags); | ||
241 | return 0; | ||
242 | } | ||
243 | |||
244 | if (hpd) | ||
245 | r = hdmi_set_phy_pwr(ip_data, HDMI_PHYPWRCMD_TXON); | ||
246 | else | ||
247 | r = hdmi_set_phy_pwr(ip_data, HDMI_PHYPWRCMD_LDOON); | ||
248 | |||
249 | if (r) { | ||
250 | DSSERR("Failed to %s PHY TX power\n", | ||
251 | hpd ? "enable" : "disable"); | ||
252 | goto err; | ||
253 | } | ||
254 | |||
255 | ip_data->phy_tx_enabled = hpd; | ||
256 | err: | ||
257 | spin_unlock_irqrestore(&phy_tx_lock, flags); | ||
258 | return r; | ||
259 | } | ||
260 | |||
261 | static irqreturn_t hpd_irq_handler(int irq, void *data) | ||
262 | { | ||
263 | struct hdmi_ip_data *ip_data = data; | ||
264 | |||
265 | hdmi_check_hpd_state(ip_data); | ||
266 | |||
267 | return IRQ_HANDLED; | ||
268 | } | ||
269 | |||
226 | int ti_hdmi_4xxx_phy_enable(struct hdmi_ip_data *ip_data) | 270 | int ti_hdmi_4xxx_phy_enable(struct hdmi_ip_data *ip_data) |
227 | { | 271 | { |
228 | u16 r = 0; | 272 | u16 r = 0; |
@@ -232,10 +276,6 @@ int ti_hdmi_4xxx_phy_enable(struct hdmi_ip_data *ip_data) | |||
232 | if (r) | 276 | if (r) |
233 | return r; | 277 | return r; |
234 | 278 | ||
235 | r = hdmi_set_phy_pwr(ip_data, HDMI_PHYPWRCMD_TXON); | ||
236 | if (r) | ||
237 | return r; | ||
238 | |||
239 | /* | 279 | /* |
240 | * Read address 0 in order to get the SCP reset done completed | 280 | * Read address 0 in order to get the SCP reset done completed |
241 | * Dummy access performed to make sure reset is done | 281 | * Dummy access performed to make sure reset is done |
@@ -257,12 +297,32 @@ int ti_hdmi_4xxx_phy_enable(struct hdmi_ip_data *ip_data) | |||
257 | /* Write to phy address 3 to change the polarity control */ | 297 | /* Write to phy address 3 to change the polarity control */ |
258 | REG_FLD_MOD(phy_base, HDMI_TXPHY_PAD_CFG_CTRL, 0x1, 27, 27); | 298 | REG_FLD_MOD(phy_base, HDMI_TXPHY_PAD_CFG_CTRL, 0x1, 27, 27); |
259 | 299 | ||
300 | r = request_threaded_irq(gpio_to_irq(ip_data->hpd_gpio), | ||
301 | NULL, hpd_irq_handler, | ||
302 | IRQF_DISABLED | IRQF_TRIGGER_RISING | | ||
303 | IRQF_TRIGGER_FALLING, "hpd", ip_data); | ||
304 | if (r) { | ||
305 | DSSERR("HPD IRQ request failed\n"); | ||
306 | hdmi_set_phy_pwr(ip_data, HDMI_PHYPWRCMD_OFF); | ||
307 | return r; | ||
308 | } | ||
309 | |||
310 | r = hdmi_check_hpd_state(ip_data); | ||
311 | if (r) { | ||
312 | free_irq(gpio_to_irq(ip_data->hpd_gpio), ip_data); | ||
313 | hdmi_set_phy_pwr(ip_data, HDMI_PHYPWRCMD_OFF); | ||
314 | return r; | ||
315 | } | ||
316 | |||
260 | return 0; | 317 | return 0; |
261 | } | 318 | } |
262 | 319 | ||
263 | void ti_hdmi_4xxx_phy_disable(struct hdmi_ip_data *ip_data) | 320 | void ti_hdmi_4xxx_phy_disable(struct hdmi_ip_data *ip_data) |
264 | { | 321 | { |
322 | free_irq(gpio_to_irq(ip_data->hpd_gpio), ip_data); | ||
323 | |||
265 | hdmi_set_phy_pwr(ip_data, HDMI_PHYPWRCMD_OFF); | 324 | hdmi_set_phy_pwr(ip_data, HDMI_PHYPWRCMD_OFF); |
325 | ip_data->phy_tx_enabled = false; | ||
266 | } | 326 | } |
267 | 327 | ||
268 | static int hdmi_core_ddc_init(struct hdmi_ip_data *ip_data) | 328 | static int hdmi_core_ddc_init(struct hdmi_ip_data *ip_data) |
diff --git a/drivers/video/omap2/dss/venc.c b/drivers/video/omap2/dss/venc.c index b3e9f9091581..5c3d0f901510 100644 --- a/drivers/video/omap2/dss/venc.c +++ b/drivers/video/omap2/dss/venc.c | |||
@@ -401,7 +401,7 @@ static void venc_runtime_put(void) | |||
401 | 401 | ||
402 | DSSDBG("venc_runtime_put\n"); | 402 | DSSDBG("venc_runtime_put\n"); |
403 | 403 | ||
404 | r = pm_runtime_put(&venc.pdev->dev); | 404 | r = pm_runtime_put_sync(&venc.pdev->dev); |
405 | WARN_ON(r < 0); | 405 | WARN_ON(r < 0); |
406 | } | 406 | } |
407 | 407 | ||
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/ceph/caps.c b/fs/ceph/caps.c index b60fc8bfb3e9..620daad201db 100644 --- a/fs/ceph/caps.c +++ b/fs/ceph/caps.c | |||
@@ -641,10 +641,10 @@ static int __cap_is_valid(struct ceph_cap *cap) | |||
641 | unsigned long ttl; | 641 | unsigned long ttl; |
642 | u32 gen; | 642 | u32 gen; |
643 | 643 | ||
644 | spin_lock(&cap->session->s_cap_lock); | 644 | spin_lock(&cap->session->s_gen_ttl_lock); |
645 | gen = cap->session->s_cap_gen; | 645 | gen = cap->session->s_cap_gen; |
646 | ttl = cap->session->s_cap_ttl; | 646 | ttl = cap->session->s_cap_ttl; |
647 | spin_unlock(&cap->session->s_cap_lock); | 647 | spin_unlock(&cap->session->s_gen_ttl_lock); |
648 | 648 | ||
649 | if (cap->cap_gen < gen || time_after_eq(jiffies, ttl)) { | 649 | if (cap->cap_gen < gen || time_after_eq(jiffies, ttl)) { |
650 | dout("__cap_is_valid %p cap %p issued %s " | 650 | dout("__cap_is_valid %p cap %p issued %s " |
diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c index 618246bc2196..3e8094be4604 100644 --- a/fs/ceph/dir.c +++ b/fs/ceph/dir.c | |||
@@ -975,10 +975,10 @@ static int dentry_lease_is_valid(struct dentry *dentry) | |||
975 | di = ceph_dentry(dentry); | 975 | di = ceph_dentry(dentry); |
976 | if (di->lease_session) { | 976 | if (di->lease_session) { |
977 | s = di->lease_session; | 977 | s = di->lease_session; |
978 | spin_lock(&s->s_cap_lock); | 978 | spin_lock(&s->s_gen_ttl_lock); |
979 | gen = s->s_cap_gen; | 979 | gen = s->s_cap_gen; |
980 | ttl = s->s_cap_ttl; | 980 | ttl = s->s_cap_ttl; |
981 | spin_unlock(&s->s_cap_lock); | 981 | spin_unlock(&s->s_gen_ttl_lock); |
982 | 982 | ||
983 | if (di->lease_gen == gen && | 983 | if (di->lease_gen == gen && |
984 | time_before(jiffies, dentry->d_time) && | 984 | time_before(jiffies, dentry->d_time) && |
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c index 23ab6a3f1825..866e8d7ca37d 100644 --- a/fs/ceph/mds_client.c +++ b/fs/ceph/mds_client.c | |||
@@ -262,6 +262,7 @@ static int parse_reply_info(struct ceph_msg *msg, | |||
262 | /* trace */ | 262 | /* trace */ |
263 | ceph_decode_32_safe(&p, end, len, bad); | 263 | ceph_decode_32_safe(&p, end, len, bad); |
264 | if (len > 0) { | 264 | if (len > 0) { |
265 | ceph_decode_need(&p, end, len, bad); | ||
265 | err = parse_reply_info_trace(&p, p+len, info, features); | 266 | err = parse_reply_info_trace(&p, p+len, info, features); |
266 | if (err < 0) | 267 | if (err < 0) |
267 | goto out_bad; | 268 | goto out_bad; |
@@ -270,6 +271,7 @@ static int parse_reply_info(struct ceph_msg *msg, | |||
270 | /* extra */ | 271 | /* extra */ |
271 | ceph_decode_32_safe(&p, end, len, bad); | 272 | ceph_decode_32_safe(&p, end, len, bad); |
272 | if (len > 0) { | 273 | if (len > 0) { |
274 | ceph_decode_need(&p, end, len, bad); | ||
273 | err = parse_reply_info_extra(&p, p+len, info, features); | 275 | err = parse_reply_info_extra(&p, p+len, info, features); |
274 | if (err < 0) | 276 | if (err < 0) |
275 | goto out_bad; | 277 | goto out_bad; |
@@ -398,9 +400,11 @@ static struct ceph_mds_session *register_session(struct ceph_mds_client *mdsc, | |||
398 | s->s_con.peer_name.type = CEPH_ENTITY_TYPE_MDS; | 400 | s->s_con.peer_name.type = CEPH_ENTITY_TYPE_MDS; |
399 | s->s_con.peer_name.num = cpu_to_le64(mds); | 401 | s->s_con.peer_name.num = cpu_to_le64(mds); |
400 | 402 | ||
401 | spin_lock_init(&s->s_cap_lock); | 403 | spin_lock_init(&s->s_gen_ttl_lock); |
402 | s->s_cap_gen = 0; | 404 | s->s_cap_gen = 0; |
403 | s->s_cap_ttl = 0; | 405 | s->s_cap_ttl = 0; |
406 | |||
407 | spin_lock_init(&s->s_cap_lock); | ||
404 | s->s_renew_requested = 0; | 408 | s->s_renew_requested = 0; |
405 | s->s_renew_seq = 0; | 409 | s->s_renew_seq = 0; |
406 | INIT_LIST_HEAD(&s->s_caps); | 410 | INIT_LIST_HEAD(&s->s_caps); |
@@ -2326,10 +2330,10 @@ static void handle_session(struct ceph_mds_session *session, | |||
2326 | case CEPH_SESSION_STALE: | 2330 | case CEPH_SESSION_STALE: |
2327 | pr_info("mds%d caps went stale, renewing\n", | 2331 | pr_info("mds%d caps went stale, renewing\n", |
2328 | session->s_mds); | 2332 | session->s_mds); |
2329 | spin_lock(&session->s_cap_lock); | 2333 | spin_lock(&session->s_gen_ttl_lock); |
2330 | session->s_cap_gen++; | 2334 | session->s_cap_gen++; |
2331 | session->s_cap_ttl = 0; | 2335 | session->s_cap_ttl = 0; |
2332 | spin_unlock(&session->s_cap_lock); | 2336 | spin_unlock(&session->s_gen_ttl_lock); |
2333 | send_renew_caps(mdsc, session); | 2337 | send_renew_caps(mdsc, session); |
2334 | break; | 2338 | break; |
2335 | 2339 | ||
diff --git a/fs/ceph/mds_client.h b/fs/ceph/mds_client.h index a50ca0e39475..8c7c04ebb595 100644 --- a/fs/ceph/mds_client.h +++ b/fs/ceph/mds_client.h | |||
@@ -117,10 +117,13 @@ struct ceph_mds_session { | |||
117 | void *s_authorizer_buf, *s_authorizer_reply_buf; | 117 | void *s_authorizer_buf, *s_authorizer_reply_buf; |
118 | size_t s_authorizer_buf_len, s_authorizer_reply_buf_len; | 118 | size_t s_authorizer_buf_len, s_authorizer_reply_buf_len; |
119 | 119 | ||
120 | /* protected by s_cap_lock */ | 120 | /* protected by s_gen_ttl_lock */ |
121 | spinlock_t s_cap_lock; | 121 | spinlock_t s_gen_ttl_lock; |
122 | u32 s_cap_gen; /* inc each time we get mds stale msg */ | 122 | u32 s_cap_gen; /* inc each time we get mds stale msg */ |
123 | unsigned long s_cap_ttl; /* when session caps expire */ | 123 | unsigned long s_cap_ttl; /* when session caps expire */ |
124 | |||
125 | /* protected by s_cap_lock */ | ||
126 | spinlock_t s_cap_lock; | ||
124 | struct list_head s_caps; /* all caps issued by this session */ | 127 | struct list_head s_caps; /* all caps issued by this session */ |
125 | int s_nr_caps, s_trim_caps; | 128 | int s_nr_caps, s_trim_caps; |
126 | int s_num_cap_releases; | 129 | int s_num_cap_releases; |
diff --git a/fs/ceph/xattr.c b/fs/ceph/xattr.c index 857214ae8c08..a76f697303d9 100644 --- a/fs/ceph/xattr.c +++ b/fs/ceph/xattr.c | |||
@@ -111,8 +111,10 @@ static size_t ceph_vxattrcb_layout(struct ceph_inode_info *ci, char *val, | |||
111 | } | 111 | } |
112 | 112 | ||
113 | static struct ceph_vxattr_cb ceph_file_vxattrs[] = { | 113 | static struct ceph_vxattr_cb ceph_file_vxattrs[] = { |
114 | { true, "ceph.file.layout", ceph_vxattrcb_layout}, | ||
115 | /* The following extended attribute name is deprecated */ | ||
114 | { true, "ceph.layout", ceph_vxattrcb_layout}, | 116 | { true, "ceph.layout", ceph_vxattrcb_layout}, |
115 | { NULL, NULL } | 117 | { true, NULL, NULL } |
116 | }; | 118 | }; |
117 | 119 | ||
118 | static struct ceph_vxattr_cb *ceph_inode_vxattrs(struct inode *inode) | 120 | static struct ceph_vxattr_cb *ceph_inode_vxattrs(struct inode *inode) |
diff --git a/fs/cifs/Kconfig b/fs/cifs/Kconfig index 0554b00a7b33..2b243af70aa3 100644 --- a/fs/cifs/Kconfig +++ b/fs/cifs/Kconfig | |||
@@ -139,7 +139,7 @@ config CIFS_DFS_UPCALL | |||
139 | points. If unsure, say N. | 139 | points. If unsure, say N. |
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" |
143 | depends on CIFS=m && FSCACHE || CIFS=y && FSCACHE=y | 143 | depends on CIFS=m && FSCACHE || CIFS=y && FSCACHE=y |
144 | help | 144 | help |
145 | 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 |
@@ -147,7 +147,7 @@ config CIFS_FSCACHE | |||
147 | manager. If unsure, say N. | 147 | manager. If unsure, say N. |
148 | 148 | ||
149 | config CIFS_ACL | 149 | config CIFS_ACL |
150 | bool "Provide CIFS ACL support (EXPERIMENTAL)" | 150 | bool "Provide CIFS ACL support" |
151 | depends on CIFS_XATTR && KEYS | 151 | depends on CIFS_XATTR && KEYS |
152 | help | 152 | help |
153 | 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 |
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index 986709a8d903..9c288653e6d6 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c | |||
@@ -2142,14 +2142,14 @@ cifs_set_cifscreds(struct smb_vol *vol, struct cifs_ses *ses) | |||
2142 | 2142 | ||
2143 | len = delim - payload; | 2143 | len = delim - payload; |
2144 | if (len > MAX_USERNAME_SIZE || len <= 0) { | 2144 | if (len > MAX_USERNAME_SIZE || len <= 0) { |
2145 | cFYI(1, "Bad value from username search (len=%ld)", len); | 2145 | cFYI(1, "Bad value from username search (len=%zd)", len); |
2146 | rc = -EINVAL; | 2146 | rc = -EINVAL; |
2147 | goto out_key_put; | 2147 | goto out_key_put; |
2148 | } | 2148 | } |
2149 | 2149 | ||
2150 | vol->username = kstrndup(payload, len, GFP_KERNEL); | 2150 | vol->username = kstrndup(payload, len, GFP_KERNEL); |
2151 | if (!vol->username) { | 2151 | if (!vol->username) { |
2152 | cFYI(1, "Unable to allocate %ld bytes for username", len); | 2152 | cFYI(1, "Unable to allocate %zd bytes for username", len); |
2153 | rc = -ENOMEM; | 2153 | rc = -ENOMEM; |
2154 | goto out_key_put; | 2154 | goto out_key_put; |
2155 | } | 2155 | } |
@@ -2157,7 +2157,7 @@ cifs_set_cifscreds(struct smb_vol *vol, struct cifs_ses *ses) | |||
2157 | 2157 | ||
2158 | len = key->datalen - (len + 1); | 2158 | len = key->datalen - (len + 1); |
2159 | if (len > MAX_PASSWORD_SIZE || len <= 0) { | 2159 | if (len > MAX_PASSWORD_SIZE || len <= 0) { |
2160 | cFYI(1, "Bad len for password search (len=%ld)", len); | 2160 | cFYI(1, "Bad len for password search (len=%zd)", len); |
2161 | rc = -EINVAL; | 2161 | rc = -EINVAL; |
2162 | kfree(vol->username); | 2162 | kfree(vol->username); |
2163 | vol->username = NULL; | 2163 | vol->username = NULL; |
@@ -2167,7 +2167,7 @@ cifs_set_cifscreds(struct smb_vol *vol, struct cifs_ses *ses) | |||
2167 | ++delim; | 2167 | ++delim; |
2168 | vol->password = kstrndup(delim, len, GFP_KERNEL); | 2168 | vol->password = kstrndup(delim, len, GFP_KERNEL); |
2169 | if (!vol->password) { | 2169 | if (!vol->password) { |
2170 | cFYI(1, "Unable to allocate %ld bytes for password", len); | 2170 | cFYI(1, "Unable to allocate %zd bytes for password", len); |
2171 | rc = -ENOMEM; | 2171 | rc = -ENOMEM; |
2172 | kfree(vol->username); | 2172 | kfree(vol->username); |
2173 | vol->username = NULL; | 2173 | vol->username = NULL; |
@@ -3857,10 +3857,8 @@ cifs_construct_tcon(struct cifs_sb_info *cifs_sb, uid_t fsuid) | |||
3857 | struct smb_vol *vol_info; | 3857 | struct smb_vol *vol_info; |
3858 | 3858 | ||
3859 | vol_info = kzalloc(sizeof(*vol_info), GFP_KERNEL); | 3859 | vol_info = kzalloc(sizeof(*vol_info), GFP_KERNEL); |
3860 | if (vol_info == NULL) { | 3860 | if (vol_info == NULL) |
3861 | tcon = ERR_PTR(-ENOMEM); | 3861 | return ERR_PTR(-ENOMEM); |
3862 | goto out; | ||
3863 | } | ||
3864 | 3862 | ||
3865 | vol_info->local_nls = cifs_sb->local_nls; | 3863 | vol_info->local_nls = cifs_sb->local_nls; |
3866 | vol_info->linux_uid = fsuid; | 3864 | vol_info->linux_uid = fsuid; |
diff --git a/fs/cifs/sess.c b/fs/cifs/sess.c index d85efad5765f..551d0c2b9736 100644 --- a/fs/cifs/sess.c +++ b/fs/cifs/sess.c | |||
@@ -246,16 +246,15 @@ static void ascii_ssetup_strings(char **pbcc_area, struct cifs_ses *ses, | |||
246 | /* copy user */ | 246 | /* copy user */ |
247 | /* BB what about null user mounts - check that we do this BB */ | 247 | /* BB what about null user mounts - check that we do this BB */ |
248 | /* copy user */ | 248 | /* copy user */ |
249 | if (ses->user_name != NULL) | 249 | if (ses->user_name != NULL) { |
250 | strncpy(bcc_ptr, ses->user_name, MAX_USERNAME_SIZE); | 250 | strncpy(bcc_ptr, ses->user_name, MAX_USERNAME_SIZE); |
251 | bcc_ptr += strnlen(ses->user_name, MAX_USERNAME_SIZE); | ||
252 | } | ||
251 | /* else null user mount */ | 253 | /* else null user mount */ |
252 | |||
253 | bcc_ptr += strnlen(ses->user_name, MAX_USERNAME_SIZE); | ||
254 | *bcc_ptr = 0; | 254 | *bcc_ptr = 0; |
255 | bcc_ptr++; /* account for null termination */ | 255 | bcc_ptr++; /* account for null termination */ |
256 | 256 | ||
257 | /* copy domain */ | 257 | /* copy domain */ |
258 | |||
259 | if (ses->domainName != NULL) { | 258 | if (ses->domainName != NULL) { |
260 | strncpy(bcc_ptr, ses->domainName, 256); | 259 | strncpy(bcc_ptr, ses->domainName, 256); |
261 | bcc_ptr += strnlen(ses->domainName, 256); | 260 | bcc_ptr += strnlen(ses->domainName, 256); |
@@ -395,6 +394,10 @@ static int decode_ntlmssp_challenge(char *bcc_ptr, int blob_len, | |||
395 | ses->ntlmssp->server_flags = le32_to_cpu(pblob->NegotiateFlags); | 394 | ses->ntlmssp->server_flags = le32_to_cpu(pblob->NegotiateFlags); |
396 | tioffset = le32_to_cpu(pblob->TargetInfoArray.BufferOffset); | 395 | tioffset = le32_to_cpu(pblob->TargetInfoArray.BufferOffset); |
397 | tilen = le16_to_cpu(pblob->TargetInfoArray.Length); | 396 | tilen = le16_to_cpu(pblob->TargetInfoArray.Length); |
397 | if (tioffset > blob_len || tioffset + tilen > blob_len) { | ||
398 | cERROR(1, "tioffset + tilen too high %u + %u", tioffset, tilen); | ||
399 | return -EINVAL; | ||
400 | } | ||
398 | if (tilen) { | 401 | if (tilen) { |
399 | ses->auth_key.response = kmalloc(tilen, GFP_KERNEL); | 402 | ses->auth_key.response = kmalloc(tilen, GFP_KERNEL); |
400 | if (!ses->auth_key.response) { | 403 | if (!ses->auth_key.response) { |
@@ -1071,6 +1071,21 @@ void set_task_comm(struct task_struct *tsk, char *buf) | |||
1071 | perf_event_comm(tsk); | 1071 | perf_event_comm(tsk); |
1072 | } | 1072 | } |
1073 | 1073 | ||
1074 | static void filename_to_taskname(char *tcomm, const char *fn, unsigned int len) | ||
1075 | { | ||
1076 | int i, ch; | ||
1077 | |||
1078 | /* Copies the binary name from after last slash */ | ||
1079 | for (i = 0; (ch = *(fn++)) != '\0';) { | ||
1080 | if (ch == '/') | ||
1081 | i = 0; /* overwrite what we wrote */ | ||
1082 | else | ||
1083 | if (i < len - 1) | ||
1084 | tcomm[i++] = ch; | ||
1085 | } | ||
1086 | tcomm[i] = '\0'; | ||
1087 | } | ||
1088 | |||
1074 | int flush_old_exec(struct linux_binprm * bprm) | 1089 | int flush_old_exec(struct linux_binprm * bprm) |
1075 | { | 1090 | { |
1076 | int retval; | 1091 | int retval; |
@@ -1085,6 +1100,7 @@ int flush_old_exec(struct linux_binprm * bprm) | |||
1085 | 1100 | ||
1086 | set_mm_exe_file(bprm->mm, bprm->file); | 1101 | set_mm_exe_file(bprm->mm, bprm->file); |
1087 | 1102 | ||
1103 | filename_to_taskname(bprm->tcomm, bprm->filename, sizeof(bprm->tcomm)); | ||
1088 | /* | 1104 | /* |
1089 | * Release all of the old mmap stuff | 1105 | * Release all of the old mmap stuff |
1090 | */ | 1106 | */ |
@@ -1116,10 +1132,6 @@ EXPORT_SYMBOL(would_dump); | |||
1116 | 1132 | ||
1117 | void setup_new_exec(struct linux_binprm * bprm) | 1133 | void setup_new_exec(struct linux_binprm * bprm) |
1118 | { | 1134 | { |
1119 | int i, ch; | ||
1120 | const char *name; | ||
1121 | char tcomm[sizeof(current->comm)]; | ||
1122 | |||
1123 | arch_pick_mmap_layout(current->mm); | 1135 | arch_pick_mmap_layout(current->mm); |
1124 | 1136 | ||
1125 | /* This is the point of no return */ | 1137 | /* This is the point of no return */ |
@@ -1130,18 +1142,7 @@ void setup_new_exec(struct linux_binprm * bprm) | |||
1130 | else | 1142 | else |
1131 | set_dumpable(current->mm, suid_dumpable); | 1143 | set_dumpable(current->mm, suid_dumpable); |
1132 | 1144 | ||
1133 | name = bprm->filename; | 1145 | set_task_comm(current, bprm->tcomm); |
1134 | |||
1135 | /* Copies the binary name from after last slash */ | ||
1136 | for (i=0; (ch = *(name++)) != '\0';) { | ||
1137 | if (ch == '/') | ||
1138 | i = 0; /* overwrite what we wrote */ | ||
1139 | else | ||
1140 | if (i < (sizeof(tcomm) - 1)) | ||
1141 | tcomm[i++] = ch; | ||
1142 | } | ||
1143 | tcomm[i] = '\0'; | ||
1144 | set_task_comm(current, tcomm); | ||
1145 | 1146 | ||
1146 | /* Set the new mm task size. We have to do that late because it may | 1147 | /* Set the new mm task size. We have to do that late because it may |
1147 | * depend on TIF_32BIT which is only updated in flush_thread() on | 1148 | * depend on TIF_32BIT which is only updated in flush_thread() on |
diff --git a/fs/jffs2/erase.c b/fs/jffs2/erase.c index a01cdad6aad1..eafb8d37a6fb 100644 --- a/fs/jffs2/erase.c +++ b/fs/jffs2/erase.c | |||
@@ -335,7 +335,7 @@ static int jffs2_block_check_erase(struct jffs2_sb_info *c, struct jffs2_erasebl | |||
335 | void *ebuf; | 335 | void *ebuf; |
336 | uint32_t ofs; | 336 | uint32_t ofs; |
337 | size_t retlen; | 337 | size_t retlen; |
338 | int ret = -EIO; | 338 | int ret; |
339 | unsigned long *wordebuf; | 339 | unsigned long *wordebuf; |
340 | 340 | ||
341 | ret = mtd_point(c->mtd, jeb->offset, c->sector_size, &retlen, | 341 | ret = mtd_point(c->mtd, jeb->offset, c->sector_size, &retlen, |
diff --git a/fs/logfs/dev_mtd.c b/fs/logfs/dev_mtd.c index e97404d611e0..9c501449450d 100644 --- a/fs/logfs/dev_mtd.c +++ b/fs/logfs/dev_mtd.c | |||
@@ -152,9 +152,6 @@ static struct page *logfs_mtd_find_first_sb(struct super_block *sb, u64 *ofs) | |||
152 | filler_t *filler = logfs_mtd_readpage; | 152 | filler_t *filler = logfs_mtd_readpage; |
153 | struct mtd_info *mtd = super->s_mtd; | 153 | struct mtd_info *mtd = super->s_mtd; |
154 | 154 | ||
155 | if (!mtd_can_have_bb(mtd)) | ||
156 | return NULL; | ||
157 | |||
158 | *ofs = 0; | 155 | *ofs = 0; |
159 | while (mtd_block_isbad(mtd, *ofs)) { | 156 | while (mtd_block_isbad(mtd, *ofs)) { |
160 | *ofs += mtd->erasesize; | 157 | *ofs += mtd->erasesize; |
@@ -172,9 +169,6 @@ static struct page *logfs_mtd_find_last_sb(struct super_block *sb, u64 *ofs) | |||
172 | filler_t *filler = logfs_mtd_readpage; | 169 | filler_t *filler = logfs_mtd_readpage; |
173 | struct mtd_info *mtd = super->s_mtd; | 170 | struct mtd_info *mtd = super->s_mtd; |
174 | 171 | ||
175 | if (!mtd_can_have_bb(mtd)) | ||
176 | return NULL; | ||
177 | |||
178 | *ofs = mtd->size - mtd->erasesize; | 172 | *ofs = mtd->size - mtd->erasesize; |
179 | while (mtd_block_isbad(mtd, *ofs)) { | 173 | while (mtd_block_isbad(mtd, *ofs)) { |
180 | *ofs -= mtd->erasesize; | 174 | *ofs -= mtd->erasesize; |
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/nilfs2/ioctl.c b/fs/nilfs2/ioctl.c index 886649627c3d..2a70fce70c65 100644 --- a/fs/nilfs2/ioctl.c +++ b/fs/nilfs2/ioctl.c | |||
@@ -603,6 +603,8 @@ static int nilfs_ioctl_clean_segments(struct inode *inode, struct file *filp, | |||
603 | nsegs = argv[4].v_nmembs; | 603 | nsegs = argv[4].v_nmembs; |
604 | if (argv[4].v_size != argsz[4]) | 604 | if (argv[4].v_size != argsz[4]) |
605 | goto out; | 605 | goto out; |
606 | if (nsegs > UINT_MAX / sizeof(__u64)) | ||
607 | goto out; | ||
606 | 608 | ||
607 | /* | 609 | /* |
608 | * argv[4] points to segment numbers this ioctl cleans. We | 610 | * argv[4] points to segment numbers this ioctl cleans. We |
diff --git a/fs/proc/base.c b/fs/proc/base.c index 9cde9edf9c4d..d4548dd49b02 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
@@ -198,26 +198,6 @@ static int proc_root_link(struct dentry *dentry, struct path *path) | |||
198 | return result; | 198 | return result; |
199 | } | 199 | } |
200 | 200 | ||
201 | static struct mm_struct *mm_access(struct task_struct *task, unsigned int mode) | ||
202 | { | ||
203 | struct mm_struct *mm; | ||
204 | int err; | ||
205 | |||
206 | err = mutex_lock_killable(&task->signal->cred_guard_mutex); | ||
207 | if (err) | ||
208 | return ERR_PTR(err); | ||
209 | |||
210 | mm = get_task_mm(task); | ||
211 | if (mm && mm != current->mm && | ||
212 | !ptrace_may_access(task, mode)) { | ||
213 | mmput(mm); | ||
214 | mm = ERR_PTR(-EACCES); | ||
215 | } | ||
216 | mutex_unlock(&task->signal->cred_guard_mutex); | ||
217 | |||
218 | return mm; | ||
219 | } | ||
220 | |||
221 | struct mm_struct *mm_for_maps(struct task_struct *task) | 201 | struct mm_struct *mm_for_maps(struct task_struct *task) |
222 | { | 202 | { |
223 | return mm_access(task, PTRACE_MODE_READ); | 203 | return mm_access(task, PTRACE_MODE_READ); |
@@ -711,6 +691,13 @@ static int mem_open(struct inode* inode, struct file* file) | |||
711 | if (IS_ERR(mm)) | 691 | if (IS_ERR(mm)) |
712 | return PTR_ERR(mm); | 692 | return PTR_ERR(mm); |
713 | 693 | ||
694 | if (mm) { | ||
695 | /* ensure this mm_struct can't be freed */ | ||
696 | atomic_inc(&mm->mm_count); | ||
697 | /* but do not pin its memory */ | ||
698 | mmput(mm); | ||
699 | } | ||
700 | |||
714 | /* OK to pass negative loff_t, we can catch out-of-range */ | 701 | /* OK to pass negative loff_t, we can catch out-of-range */ |
715 | file->f_mode |= FMODE_UNSIGNED_OFFSET; | 702 | file->f_mode |= FMODE_UNSIGNED_OFFSET; |
716 | file->private_data = mm; | 703 | file->private_data = mm; |
@@ -718,57 +705,13 @@ static int mem_open(struct inode* inode, struct file* file) | |||
718 | return 0; | 705 | return 0; |
719 | } | 706 | } |
720 | 707 | ||
721 | static ssize_t mem_read(struct file * file, char __user * buf, | 708 | static ssize_t mem_rw(struct file *file, char __user *buf, |
722 | size_t count, loff_t *ppos) | 709 | size_t count, loff_t *ppos, int write) |
723 | { | 710 | { |
724 | int ret; | ||
725 | char *page; | ||
726 | unsigned long src = *ppos; | ||
727 | struct mm_struct *mm = file->private_data; | 711 | struct mm_struct *mm = file->private_data; |
728 | 712 | unsigned long addr = *ppos; | |
729 | if (!mm) | 713 | ssize_t copied; |
730 | return 0; | ||
731 | |||
732 | page = (char *)__get_free_page(GFP_TEMPORARY); | ||
733 | if (!page) | ||
734 | return -ENOMEM; | ||
735 | |||
736 | ret = 0; | ||
737 | |||
738 | while (count > 0) { | ||
739 | int this_len, retval; | ||
740 | |||
741 | this_len = (count > PAGE_SIZE) ? PAGE_SIZE : count; | ||
742 | retval = access_remote_vm(mm, src, page, this_len, 0); | ||
743 | if (!retval) { | ||
744 | if (!ret) | ||
745 | ret = -EIO; | ||
746 | break; | ||
747 | } | ||
748 | |||
749 | if (copy_to_user(buf, page, retval)) { | ||
750 | ret = -EFAULT; | ||
751 | break; | ||
752 | } | ||
753 | |||
754 | ret += retval; | ||
755 | src += retval; | ||
756 | buf += retval; | ||
757 | count -= retval; | ||
758 | } | ||
759 | *ppos = src; | ||
760 | |||
761 | free_page((unsigned long) page); | ||
762 | return ret; | ||
763 | } | ||
764 | |||
765 | static ssize_t mem_write(struct file * file, const char __user *buf, | ||
766 | size_t count, loff_t *ppos) | ||
767 | { | ||
768 | int copied; | ||
769 | char *page; | 714 | char *page; |
770 | unsigned long dst = *ppos; | ||
771 | struct mm_struct *mm = file->private_data; | ||
772 | 715 | ||
773 | if (!mm) | 716 | if (!mm) |
774 | return 0; | 717 | return 0; |
@@ -778,31 +721,54 @@ static ssize_t mem_write(struct file * file, const char __user *buf, | |||
778 | return -ENOMEM; | 721 | return -ENOMEM; |
779 | 722 | ||
780 | copied = 0; | 723 | copied = 0; |
724 | if (!atomic_inc_not_zero(&mm->mm_users)) | ||
725 | goto free; | ||
726 | |||
781 | while (count > 0) { | 727 | while (count > 0) { |
782 | int this_len, retval; | 728 | int this_len = min_t(int, count, PAGE_SIZE); |
783 | 729 | ||
784 | this_len = (count > PAGE_SIZE) ? PAGE_SIZE : count; | 730 | if (write && copy_from_user(page, buf, this_len)) { |
785 | if (copy_from_user(page, buf, this_len)) { | ||
786 | copied = -EFAULT; | 731 | copied = -EFAULT; |
787 | break; | 732 | break; |
788 | } | 733 | } |
789 | retval = access_remote_vm(mm, dst, page, this_len, 1); | 734 | |
790 | if (!retval) { | 735 | this_len = access_remote_vm(mm, addr, page, this_len, write); |
736 | if (!this_len) { | ||
791 | if (!copied) | 737 | if (!copied) |
792 | copied = -EIO; | 738 | copied = -EIO; |
793 | break; | 739 | break; |
794 | } | 740 | } |
795 | copied += retval; | 741 | |
796 | buf += retval; | 742 | if (!write && copy_to_user(buf, page, this_len)) { |
797 | dst += retval; | 743 | copied = -EFAULT; |
798 | count -= retval; | 744 | break; |
745 | } | ||
746 | |||
747 | buf += this_len; | ||
748 | addr += this_len; | ||
749 | copied += this_len; | ||
750 | count -= this_len; | ||
799 | } | 751 | } |
800 | *ppos = dst; | 752 | *ppos = addr; |
801 | 753 | ||
754 | mmput(mm); | ||
755 | free: | ||
802 | free_page((unsigned long) page); | 756 | free_page((unsigned long) page); |
803 | return copied; | 757 | return copied; |
804 | } | 758 | } |
805 | 759 | ||
760 | static ssize_t mem_read(struct file *file, char __user *buf, | ||
761 | size_t count, loff_t *ppos) | ||
762 | { | ||
763 | return mem_rw(file, buf, count, ppos, 0); | ||
764 | } | ||
765 | |||
766 | static ssize_t mem_write(struct file *file, const char __user *buf, | ||
767 | size_t count, loff_t *ppos) | ||
768 | { | ||
769 | return mem_rw(file, (char __user*)buf, count, ppos, 1); | ||
770 | } | ||
771 | |||
806 | loff_t mem_lseek(struct file *file, loff_t offset, int orig) | 772 | loff_t mem_lseek(struct file *file, loff_t offset, int orig) |
807 | { | 773 | { |
808 | switch (orig) { | 774 | switch (orig) { |
@@ -822,8 +788,8 @@ loff_t mem_lseek(struct file *file, loff_t offset, int orig) | |||
822 | static int mem_release(struct inode *inode, struct file *file) | 788 | static int mem_release(struct inode *inode, struct file *file) |
823 | { | 789 | { |
824 | struct mm_struct *mm = file->private_data; | 790 | struct mm_struct *mm = file->private_data; |
825 | 791 | if (mm) | |
826 | mmput(mm); | 792 | mmdrop(mm); |
827 | return 0; | 793 | return 0; |
828 | } | 794 | } |
829 | 795 | ||
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/include/asm-generic/pci_iomap.h b/include/asm-generic/pci_iomap.h index 8de4b73e19e2..e58fcf891370 100644 --- a/include/asm-generic/pci_iomap.h +++ b/include/asm-generic/pci_iomap.h | |||
@@ -15,6 +15,16 @@ struct pci_dev; | |||
15 | #ifdef CONFIG_PCI | 15 | #ifdef CONFIG_PCI |
16 | /* Create a virtual mapping cookie for a PCI BAR (memory or IO) */ | 16 | /* Create a virtual mapping cookie for a PCI BAR (memory or IO) */ |
17 | extern void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long max); | 17 | extern void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long max); |
18 | /* Create a virtual mapping cookie for a port on a given PCI device. | ||
19 | * Do not call this directly, it exists to make it easier for architectures | ||
20 | * to override */ | ||
21 | #ifdef CONFIG_NO_GENERIC_PCI_IOPORT_MAP | ||
22 | extern void __iomem *__pci_ioport_map(struct pci_dev *dev, unsigned long port, | ||
23 | unsigned int nr); | ||
24 | #else | ||
25 | #define __pci_ioport_map(dev, port, nr) ioport_map((port), (nr)) | ||
26 | #endif | ||
27 | |||
18 | #else | 28 | #else |
19 | static inline void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long max) | 29 | static inline void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long max) |
20 | { | 30 | { |
diff --git a/include/linux/binfmts.h b/include/linux/binfmts.h index fd88a3945aa1..0092102db2de 100644 --- a/include/linux/binfmts.h +++ b/include/linux/binfmts.h | |||
@@ -18,7 +18,7 @@ struct pt_regs; | |||
18 | #define BINPRM_BUF_SIZE 128 | 18 | #define BINPRM_BUF_SIZE 128 |
19 | 19 | ||
20 | #ifdef __KERNEL__ | 20 | #ifdef __KERNEL__ |
21 | #include <linux/list.h> | 21 | #include <linux/sched.h> |
22 | 22 | ||
23 | #define CORENAME_MAX_SIZE 128 | 23 | #define CORENAME_MAX_SIZE 128 |
24 | 24 | ||
@@ -58,6 +58,7 @@ struct linux_binprm { | |||
58 | unsigned interp_flags; | 58 | unsigned interp_flags; |
59 | unsigned interp_data; | 59 | unsigned interp_data; |
60 | unsigned long loader, exec; | 60 | unsigned long loader, exec; |
61 | char tcomm[TASK_COMM_LEN]; | ||
61 | }; | 62 | }; |
62 | 63 | ||
63 | #define BINPRM_FLAGS_ENFORCE_NONDUMP_BIT 0 | 64 | #define BINPRM_FLAGS_ENFORCE_NONDUMP_BIT 0 |
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/gpio_keys.h b/include/linux/gpio_keys.h index b5ca4b2c08ec..004ff33ab38e 100644 --- a/include/linux/gpio_keys.h +++ b/include/linux/gpio_keys.h | |||
@@ -1,6 +1,8 @@ | |||
1 | #ifndef _GPIO_KEYS_H | 1 | #ifndef _GPIO_KEYS_H |
2 | #define _GPIO_KEYS_H | 2 | #define _GPIO_KEYS_H |
3 | 3 | ||
4 | struct device; | ||
5 | |||
4 | struct gpio_keys_button { | 6 | struct gpio_keys_button { |
5 | /* Configuration parameters */ | 7 | /* Configuration parameters */ |
6 | unsigned int code; /* input event code (KEY_*, SW_*) */ | 8 | unsigned int code; /* input event code (KEY_*, SW_*) */ |
diff --git a/include/linux/lp8727.h b/include/linux/lp8727.h index d21fa2865bf4..d21fa2865bf4 100755..100644 --- a/include/linux/lp8727.h +++ b/include/linux/lp8727.h | |||
diff --git a/include/linux/mfd/twl6040.h b/include/linux/mfd/twl6040.h index 2463c2619596..9bc9ac651dad 100644 --- a/include/linux/mfd/twl6040.h +++ b/include/linux/mfd/twl6040.h | |||
@@ -187,8 +187,10 @@ struct twl6040 { | |||
187 | int rev; | 187 | int rev; |
188 | u8 vibra_ctrl_cache[2]; | 188 | u8 vibra_ctrl_cache[2]; |
189 | 189 | ||
190 | /* PLL configuration */ | ||
190 | int pll; | 191 | int pll; |
191 | unsigned int sysclk; | 192 | unsigned int sysclk; |
193 | unsigned int mclk; | ||
192 | 194 | ||
193 | unsigned int irq; | 195 | unsigned int irq; |
194 | unsigned int irq_base; | 196 | unsigned int irq_base; |
diff --git a/include/linux/mpi.h b/include/linux/mpi.h index 06f88994ccaa..d02cca6cc8ce 100644 --- a/include/linux/mpi.h +++ b/include/linux/mpi.h | |||
@@ -57,8 +57,6 @@ struct gcry_mpi { | |||
57 | 57 | ||
58 | typedef struct gcry_mpi *MPI; | 58 | typedef struct gcry_mpi *MPI; |
59 | 59 | ||
60 | #define MPI_NULL NULL | ||
61 | |||
62 | #define mpi_get_nlimbs(a) ((a)->nlimbs) | 60 | #define mpi_get_nlimbs(a) ((a)->nlimbs) |
63 | #define mpi_is_neg(a) ((a)->sign) | 61 | #define mpi_is_neg(a) ((a)->sign) |
64 | 62 | ||
diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h index 1a81fde8f333..d43dc25af82e 100644 --- a/include/linux/mtd/mtd.h +++ b/include/linux/mtd/mtd.h | |||
@@ -427,9 +427,7 @@ static inline int mtd_is_locked(struct mtd_info *mtd, loff_t ofs, uint64_t len) | |||
427 | 427 | ||
428 | static inline int mtd_suspend(struct mtd_info *mtd) | 428 | static inline int mtd_suspend(struct mtd_info *mtd) |
429 | { | 429 | { |
430 | if (!mtd->suspend) | 430 | return mtd->suspend ? mtd->suspend(mtd) : 0; |
431 | return -EOPNOTSUPP; | ||
432 | return mtd->suspend(mtd); | ||
433 | } | 431 | } |
434 | 432 | ||
435 | static inline void mtd_resume(struct mtd_info *mtd) | 433 | static inline void mtd_resume(struct mtd_info *mtd) |
@@ -441,7 +439,7 @@ static inline void mtd_resume(struct mtd_info *mtd) | |||
441 | static inline int mtd_block_isbad(struct mtd_info *mtd, loff_t ofs) | 439 | static inline int mtd_block_isbad(struct mtd_info *mtd, loff_t ofs) |
442 | { | 440 | { |
443 | if (!mtd->block_isbad) | 441 | if (!mtd->block_isbad) |
444 | return -EOPNOTSUPP; | 442 | return 0; |
445 | return mtd->block_isbad(mtd, ofs); | 443 | return mtd->block_isbad(mtd, ofs); |
446 | } | 444 | } |
447 | 445 | ||
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 08855613ceb3..abb2776be1ba 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h | |||
@@ -587,6 +587,7 @@ struct hw_perf_event { | |||
587 | u64 sample_period; | 587 | u64 sample_period; |
588 | u64 last_period; | 588 | u64 last_period; |
589 | local64_t period_left; | 589 | local64_t period_left; |
590 | u64 interrupts_seq; | ||
590 | u64 interrupts; | 591 | u64 interrupts; |
591 | 592 | ||
592 | u64 freq_time_stamp; | 593 | u64 freq_time_stamp; |
diff --git a/include/linux/pm_qos.h b/include/linux/pm_qos.h index e5bbcbaa6f57..4d99e4e6ef83 100644 --- a/include/linux/pm_qos.h +++ b/include/linux/pm_qos.h | |||
@@ -110,7 +110,19 @@ static inline void pm_qos_remove_request(struct pm_qos_request *req) | |||
110 | { return; } | 110 | { return; } |
111 | 111 | ||
112 | static inline int pm_qos_request(int pm_qos_class) | 112 | static inline int pm_qos_request(int pm_qos_class) |
113 | { return 0; } | 113 | { |
114 | switch (pm_qos_class) { | ||
115 | case PM_QOS_CPU_DMA_LATENCY: | ||
116 | return PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE; | ||
117 | case PM_QOS_NETWORK_LATENCY: | ||
118 | return PM_QOS_NETWORK_LAT_DEFAULT_VALUE; | ||
119 | case PM_QOS_NETWORK_THROUGHPUT: | ||
120 | return PM_QOS_NETWORK_THROUGHPUT_DEFAULT_VALUE; | ||
121 | default: | ||
122 | return PM_QOS_DEFAULT_VALUE; | ||
123 | } | ||
124 | } | ||
125 | |||
114 | static inline int pm_qos_add_notifier(int pm_qos_class, | 126 | static inline int pm_qos_add_notifier(int pm_qos_class, |
115 | struct notifier_block *notifier) | 127 | struct notifier_block *notifier) |
116 | { return 0; } | 128 | { return 0; } |
diff --git a/include/linux/sched.h b/include/linux/sched.h index 2234985a5e65..7d379a6bfd88 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
@@ -2259,6 +2259,12 @@ static inline void mmdrop(struct mm_struct * mm) | |||
2259 | extern void mmput(struct mm_struct *); | 2259 | extern void mmput(struct mm_struct *); |
2260 | /* Grab a reference to a task's mm, if it is not already going away */ | 2260 | /* Grab a reference to a task's mm, if it is not already going away */ |
2261 | extern struct mm_struct *get_task_mm(struct task_struct *task); | 2261 | extern struct mm_struct *get_task_mm(struct task_struct *task); |
2262 | /* | ||
2263 | * Grab a reference to a task's mm, if it is not already going away | ||
2264 | * and ptrace_may_access with the mode parameter passed to it | ||
2265 | * succeeds. | ||
2266 | */ | ||
2267 | extern struct mm_struct *mm_access(struct task_struct *task, unsigned int mode); | ||
2262 | /* Remove the current tasks stale references to the old mm_struct */ | 2268 | /* Remove the current tasks stale references to the old mm_struct */ |
2263 | extern void mm_release(struct task_struct *, struct mm_struct *); | 2269 | extern void mm_release(struct task_struct *, struct mm_struct *); |
2264 | /* Allocate a new mm structure and copy contents from tsk->mm */ | 2270 | /* Allocate a new mm structure and copy contents from tsk->mm */ |
diff --git a/include/linux/sh_dma.h b/include/linux/sh_dma.h index 8cd7fe59cf1a..425450b980b8 100644 --- a/include/linux/sh_dma.h +++ b/include/linux/sh_dma.h | |||
@@ -70,6 +70,7 @@ struct sh_dmae_pdata { | |||
70 | unsigned int needs_tend_set:1; | 70 | unsigned int needs_tend_set:1; |
71 | unsigned int no_dmars:1; | 71 | unsigned int no_dmars:1; |
72 | unsigned int chclr_present:1; | 72 | unsigned int chclr_present:1; |
73 | unsigned int slave_only:1; | ||
73 | }; | 74 | }; |
74 | 75 | ||
75 | /* DMA register */ | 76 | /* DMA register */ |
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/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/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/sock.h b/include/net/sock.h index 4c69ac165e6b..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> |
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/include/sound/core.h b/include/sound/core.h index 5ab255f196cc..cea1b5426dfa 100644 --- a/include/sound/core.h +++ b/include/sound/core.h | |||
@@ -417,6 +417,7 @@ static inline int __snd_bug_on(int cond) | |||
417 | #define gameport_get_port_data(gp) (gp)->port_data | 417 | #define gameport_get_port_data(gp) (gp)->port_data |
418 | #endif | 418 | #endif |
419 | 419 | ||
420 | #ifdef CONFIG_PCI | ||
420 | /* PCI quirk list helper */ | 421 | /* PCI quirk list helper */ |
421 | struct snd_pci_quirk { | 422 | struct snd_pci_quirk { |
422 | unsigned short subvendor; /* PCI subvendor ID */ | 423 | unsigned short subvendor; /* PCI subvendor ID */ |
@@ -456,5 +457,6 @@ snd_pci_quirk_lookup(struct pci_dev *pci, const struct snd_pci_quirk *list); | |||
456 | const struct snd_pci_quirk * | 457 | const struct snd_pci_quirk * |
457 | snd_pci_quirk_lookup_id(u16 vendor, u16 device, | 458 | snd_pci_quirk_lookup_id(u16 vendor, u16 device, |
458 | const struct snd_pci_quirk *list); | 459 | const struct snd_pci_quirk *list); |
460 | #endif | ||
459 | 461 | ||
460 | #endif /* __SOUND_CORE_H */ | 462 | #endif /* __SOUND_CORE_H */ |
diff --git a/include/target/target_core_backend.h b/include/target/target_core_backend.h index 4866499bdeeb..e5e6ff98f0fa 100644 --- a/include/target/target_core_backend.h +++ b/include/target/target_core_backend.h | |||
@@ -59,7 +59,7 @@ int transport_set_vpd_ident_type(struct t10_vpd *, unsigned char *); | |||
59 | int transport_set_vpd_ident(struct t10_vpd *, unsigned char *); | 59 | int transport_set_vpd_ident(struct t10_vpd *, unsigned char *); |
60 | 60 | ||
61 | /* core helpers also used by command snooping in pscsi */ | 61 | /* core helpers also used by command snooping in pscsi */ |
62 | void *transport_kmap_first_data_page(struct se_cmd *); | 62 | void *transport_kmap_data_sg(struct se_cmd *); |
63 | void transport_kunmap_first_data_page(struct se_cmd *); | 63 | void transport_kunmap_data_sg(struct se_cmd *); |
64 | 64 | ||
65 | #endif /* TARGET_CORE_BACKEND_H */ | 65 | #endif /* TARGET_CORE_BACKEND_H */ |
diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h index daf532bc721a..dc4e345a0163 100644 --- a/include/target/target_core_base.h +++ b/include/target/target_core_base.h | |||
@@ -582,6 +582,7 @@ struct se_cmd { | |||
582 | 582 | ||
583 | struct scatterlist *t_data_sg; | 583 | struct scatterlist *t_data_sg; |
584 | unsigned int t_data_nents; | 584 | unsigned int t_data_nents; |
585 | void *t_data_vmap; | ||
585 | struct scatterlist *t_bidi_data_sg; | 586 | struct scatterlist *t_bidi_data_sg; |
586 | unsigned int t_bidi_data_nents; | 587 | unsigned int t_bidi_data_nents; |
587 | 588 | ||
diff --git a/include/target/target_core_fabric.h b/include/target/target_core_fabric.h index 523e8bc104d4..d36fad317e78 100644 --- a/include/target/target_core_fabric.h +++ b/include/target/target_core_fabric.h | |||
@@ -114,7 +114,7 @@ void transport_init_se_cmd(struct se_cmd *, struct target_core_fabric_ops *, | |||
114 | struct se_session *, u32, int, int, unsigned char *); | 114 | struct se_session *, u32, int, int, unsigned char *); |
115 | int transport_lookup_cmd_lun(struct se_cmd *, u32); | 115 | int transport_lookup_cmd_lun(struct se_cmd *, u32); |
116 | int transport_generic_allocate_tasks(struct se_cmd *, unsigned char *); | 116 | int transport_generic_allocate_tasks(struct se_cmd *, unsigned char *); |
117 | int target_submit_cmd(struct se_cmd *, struct se_session *, unsigned char *, | 117 | void target_submit_cmd(struct se_cmd *, struct se_session *, unsigned char *, |
118 | unsigned char *, u32, u32, int, int, int); | 118 | unsigned char *, u32, u32, int, int, int); |
119 | int transport_handle_cdb_direct(struct se_cmd *); | 119 | int transport_handle_cdb_direct(struct se_cmd *); |
120 | int transport_generic_handle_cdb_map(struct se_cmd *); | 120 | int transport_generic_handle_cdb_map(struct se_cmd *); |
diff --git a/include/video/omapdss.h b/include/video/omapdss.h index 062b3b24ff10..483f67caa7ad 100644 --- a/include/video/omapdss.h +++ b/include/video/omapdss.h | |||
@@ -590,6 +590,11 @@ struct omap_dss_device { | |||
590 | int (*get_backlight)(struct omap_dss_device *dssdev); | 590 | int (*get_backlight)(struct omap_dss_device *dssdev); |
591 | }; | 591 | }; |
592 | 592 | ||
593 | struct omap_dss_hdmi_data | ||
594 | { | ||
595 | int hpd_gpio; | ||
596 | }; | ||
597 | |||
593 | struct omap_dss_driver { | 598 | struct omap_dss_driver { |
594 | struct device_driver driver; | 599 | struct device_driver driver; |
595 | 600 | ||
diff --git a/kernel/events/core.c b/kernel/events/core.c index 32b48c889711..ba36013cfb21 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c | |||
@@ -2300,6 +2300,9 @@ do { \ | |||
2300 | return div64_u64(dividend, divisor); | 2300 | return div64_u64(dividend, divisor); |
2301 | } | 2301 | } |
2302 | 2302 | ||
2303 | static DEFINE_PER_CPU(int, perf_throttled_count); | ||
2304 | static DEFINE_PER_CPU(u64, perf_throttled_seq); | ||
2305 | |||
2303 | static void perf_adjust_period(struct perf_event *event, u64 nsec, u64 count) | 2306 | static void perf_adjust_period(struct perf_event *event, u64 nsec, u64 count) |
2304 | { | 2307 | { |
2305 | struct hw_perf_event *hwc = &event->hw; | 2308 | struct hw_perf_event *hwc = &event->hw; |
@@ -2325,16 +2328,29 @@ static void perf_adjust_period(struct perf_event *event, u64 nsec, u64 count) | |||
2325 | } | 2328 | } |
2326 | } | 2329 | } |
2327 | 2330 | ||
2328 | static void perf_ctx_adjust_freq(struct perf_event_context *ctx, u64 period) | 2331 | /* |
2332 | * combine freq adjustment with unthrottling to avoid two passes over the | ||
2333 | * events. At the same time, make sure, having freq events does not change | ||
2334 | * the rate of unthrottling as that would introduce bias. | ||
2335 | */ | ||
2336 | static void perf_adjust_freq_unthr_context(struct perf_event_context *ctx, | ||
2337 | int needs_unthr) | ||
2329 | { | 2338 | { |
2330 | struct perf_event *event; | 2339 | struct perf_event *event; |
2331 | struct hw_perf_event *hwc; | 2340 | struct hw_perf_event *hwc; |
2332 | u64 interrupts, now; | 2341 | u64 now, period = TICK_NSEC; |
2333 | s64 delta; | 2342 | s64 delta; |
2334 | 2343 | ||
2335 | if (!ctx->nr_freq) | 2344 | /* |
2345 | * only need to iterate over all events iff: | ||
2346 | * - context have events in frequency mode (needs freq adjust) | ||
2347 | * - there are events to unthrottle on this cpu | ||
2348 | */ | ||
2349 | if (!(ctx->nr_freq || needs_unthr)) | ||
2336 | return; | 2350 | return; |
2337 | 2351 | ||
2352 | raw_spin_lock(&ctx->lock); | ||
2353 | |||
2338 | list_for_each_entry_rcu(event, &ctx->event_list, event_entry) { | 2354 | list_for_each_entry_rcu(event, &ctx->event_list, event_entry) { |
2339 | if (event->state != PERF_EVENT_STATE_ACTIVE) | 2355 | if (event->state != PERF_EVENT_STATE_ACTIVE) |
2340 | continue; | 2356 | continue; |
@@ -2344,13 +2360,8 @@ static void perf_ctx_adjust_freq(struct perf_event_context *ctx, u64 period) | |||
2344 | 2360 | ||
2345 | hwc = &event->hw; | 2361 | hwc = &event->hw; |
2346 | 2362 | ||
2347 | interrupts = hwc->interrupts; | 2363 | if (needs_unthr && hwc->interrupts == MAX_INTERRUPTS) { |
2348 | hwc->interrupts = 0; | 2364 | hwc->interrupts = 0; |
2349 | |||
2350 | /* | ||
2351 | * unthrottle events on the tick | ||
2352 | */ | ||
2353 | if (interrupts == MAX_INTERRUPTS) { | ||
2354 | perf_log_throttle(event, 1); | 2365 | perf_log_throttle(event, 1); |
2355 | event->pmu->start(event, 0); | 2366 | event->pmu->start(event, 0); |
2356 | } | 2367 | } |
@@ -2358,14 +2369,26 @@ static void perf_ctx_adjust_freq(struct perf_event_context *ctx, u64 period) | |||
2358 | if (!event->attr.freq || !event->attr.sample_freq) | 2369 | if (!event->attr.freq || !event->attr.sample_freq) |
2359 | continue; | 2370 | continue; |
2360 | 2371 | ||
2361 | event->pmu->read(event); | 2372 | /* |
2373 | * stop the event and update event->count | ||
2374 | */ | ||
2375 | event->pmu->stop(event, PERF_EF_UPDATE); | ||
2376 | |||
2362 | now = local64_read(&event->count); | 2377 | now = local64_read(&event->count); |
2363 | delta = now - hwc->freq_count_stamp; | 2378 | delta = now - hwc->freq_count_stamp; |
2364 | hwc->freq_count_stamp = now; | 2379 | hwc->freq_count_stamp = now; |
2365 | 2380 | ||
2381 | /* | ||
2382 | * restart the event | ||
2383 | * reload only if value has changed | ||
2384 | */ | ||
2366 | if (delta > 0) | 2385 | if (delta > 0) |
2367 | perf_adjust_period(event, period, delta); | 2386 | perf_adjust_period(event, period, delta); |
2387 | |||
2388 | event->pmu->start(event, delta > 0 ? PERF_EF_RELOAD : 0); | ||
2368 | } | 2389 | } |
2390 | |||
2391 | raw_spin_unlock(&ctx->lock); | ||
2369 | } | 2392 | } |
2370 | 2393 | ||
2371 | /* | 2394 | /* |
@@ -2388,16 +2411,13 @@ static void rotate_ctx(struct perf_event_context *ctx) | |||
2388 | */ | 2411 | */ |
2389 | static void perf_rotate_context(struct perf_cpu_context *cpuctx) | 2412 | static void perf_rotate_context(struct perf_cpu_context *cpuctx) |
2390 | { | 2413 | { |
2391 | u64 interval = (u64)cpuctx->jiffies_interval * TICK_NSEC; | ||
2392 | struct perf_event_context *ctx = NULL; | 2414 | struct perf_event_context *ctx = NULL; |
2393 | int rotate = 0, remove = 1, freq = 0; | 2415 | int rotate = 0, remove = 1; |
2394 | 2416 | ||
2395 | if (cpuctx->ctx.nr_events) { | 2417 | if (cpuctx->ctx.nr_events) { |
2396 | remove = 0; | 2418 | remove = 0; |
2397 | if (cpuctx->ctx.nr_events != cpuctx->ctx.nr_active) | 2419 | if (cpuctx->ctx.nr_events != cpuctx->ctx.nr_active) |
2398 | rotate = 1; | 2420 | rotate = 1; |
2399 | if (cpuctx->ctx.nr_freq) | ||
2400 | freq = 1; | ||
2401 | } | 2421 | } |
2402 | 2422 | ||
2403 | ctx = cpuctx->task_ctx; | 2423 | ctx = cpuctx->task_ctx; |
@@ -2405,37 +2425,26 @@ static void perf_rotate_context(struct perf_cpu_context *cpuctx) | |||
2405 | remove = 0; | 2425 | remove = 0; |
2406 | if (ctx->nr_events != ctx->nr_active) | 2426 | if (ctx->nr_events != ctx->nr_active) |
2407 | rotate = 1; | 2427 | rotate = 1; |
2408 | if (ctx->nr_freq) | ||
2409 | freq = 1; | ||
2410 | } | 2428 | } |
2411 | 2429 | ||
2412 | if (!rotate && !freq) | 2430 | if (!rotate) |
2413 | goto done; | 2431 | goto done; |
2414 | 2432 | ||
2415 | perf_ctx_lock(cpuctx, cpuctx->task_ctx); | 2433 | perf_ctx_lock(cpuctx, cpuctx->task_ctx); |
2416 | perf_pmu_disable(cpuctx->ctx.pmu); | 2434 | perf_pmu_disable(cpuctx->ctx.pmu); |
2417 | 2435 | ||
2418 | if (freq) { | 2436 | cpu_ctx_sched_out(cpuctx, EVENT_FLEXIBLE); |
2419 | perf_ctx_adjust_freq(&cpuctx->ctx, interval); | 2437 | if (ctx) |
2420 | if (ctx) | 2438 | ctx_sched_out(ctx, cpuctx, EVENT_FLEXIBLE); |
2421 | perf_ctx_adjust_freq(ctx, interval); | ||
2422 | } | ||
2423 | |||
2424 | if (rotate) { | ||
2425 | cpu_ctx_sched_out(cpuctx, EVENT_FLEXIBLE); | ||
2426 | if (ctx) | ||
2427 | ctx_sched_out(ctx, cpuctx, EVENT_FLEXIBLE); | ||
2428 | 2439 | ||
2429 | rotate_ctx(&cpuctx->ctx); | 2440 | rotate_ctx(&cpuctx->ctx); |
2430 | if (ctx) | 2441 | if (ctx) |
2431 | rotate_ctx(ctx); | 2442 | rotate_ctx(ctx); |
2432 | 2443 | ||
2433 | perf_event_sched_in(cpuctx, ctx, current); | 2444 | perf_event_sched_in(cpuctx, ctx, current); |
2434 | } | ||
2435 | 2445 | ||
2436 | perf_pmu_enable(cpuctx->ctx.pmu); | 2446 | perf_pmu_enable(cpuctx->ctx.pmu); |
2437 | perf_ctx_unlock(cpuctx, cpuctx->task_ctx); | 2447 | perf_ctx_unlock(cpuctx, cpuctx->task_ctx); |
2438 | |||
2439 | done: | 2448 | done: |
2440 | if (remove) | 2449 | if (remove) |
2441 | list_del_init(&cpuctx->rotation_list); | 2450 | list_del_init(&cpuctx->rotation_list); |
@@ -2445,10 +2454,22 @@ void perf_event_task_tick(void) | |||
2445 | { | 2454 | { |
2446 | struct list_head *head = &__get_cpu_var(rotation_list); | 2455 | struct list_head *head = &__get_cpu_var(rotation_list); |
2447 | struct perf_cpu_context *cpuctx, *tmp; | 2456 | struct perf_cpu_context *cpuctx, *tmp; |
2457 | struct perf_event_context *ctx; | ||
2458 | int throttled; | ||
2448 | 2459 | ||
2449 | WARN_ON(!irqs_disabled()); | 2460 | WARN_ON(!irqs_disabled()); |
2450 | 2461 | ||
2462 | __this_cpu_inc(perf_throttled_seq); | ||
2463 | throttled = __this_cpu_xchg(perf_throttled_count, 0); | ||
2464 | |||
2451 | list_for_each_entry_safe(cpuctx, tmp, head, rotation_list) { | 2465 | list_for_each_entry_safe(cpuctx, tmp, head, rotation_list) { |
2466 | ctx = &cpuctx->ctx; | ||
2467 | perf_adjust_freq_unthr_context(ctx, throttled); | ||
2468 | |||
2469 | ctx = cpuctx->task_ctx; | ||
2470 | if (ctx) | ||
2471 | perf_adjust_freq_unthr_context(ctx, throttled); | ||
2472 | |||
2452 | if (cpuctx->jiffies_interval == 1 || | 2473 | if (cpuctx->jiffies_interval == 1 || |
2453 | !(jiffies % cpuctx->jiffies_interval)) | 2474 | !(jiffies % cpuctx->jiffies_interval)) |
2454 | perf_rotate_context(cpuctx); | 2475 | perf_rotate_context(cpuctx); |
@@ -4509,6 +4530,7 @@ static int __perf_event_overflow(struct perf_event *event, | |||
4509 | { | 4530 | { |
4510 | int events = atomic_read(&event->event_limit); | 4531 | int events = atomic_read(&event->event_limit); |
4511 | struct hw_perf_event *hwc = &event->hw; | 4532 | struct hw_perf_event *hwc = &event->hw; |
4533 | u64 seq; | ||
4512 | int ret = 0; | 4534 | int ret = 0; |
4513 | 4535 | ||
4514 | /* | 4536 | /* |
@@ -4518,14 +4540,20 @@ static int __perf_event_overflow(struct perf_event *event, | |||
4518 | if (unlikely(!is_sampling_event(event))) | 4540 | if (unlikely(!is_sampling_event(event))) |
4519 | return 0; | 4541 | return 0; |
4520 | 4542 | ||
4521 | if (unlikely(hwc->interrupts >= max_samples_per_tick)) { | 4543 | seq = __this_cpu_read(perf_throttled_seq); |
4522 | if (throttle) { | 4544 | if (seq != hwc->interrupts_seq) { |
4545 | hwc->interrupts_seq = seq; | ||
4546 | hwc->interrupts = 1; | ||
4547 | } else { | ||
4548 | hwc->interrupts++; | ||
4549 | if (unlikely(throttle | ||
4550 | && hwc->interrupts >= max_samples_per_tick)) { | ||
4551 | __this_cpu_inc(perf_throttled_count); | ||
4523 | hwc->interrupts = MAX_INTERRUPTS; | 4552 | hwc->interrupts = MAX_INTERRUPTS; |
4524 | perf_log_throttle(event, 0); | 4553 | perf_log_throttle(event, 0); |
4525 | ret = 1; | 4554 | ret = 1; |
4526 | } | 4555 | } |
4527 | } else | 4556 | } |
4528 | hwc->interrupts++; | ||
4529 | 4557 | ||
4530 | if (event->attr.freq) { | 4558 | if (event->attr.freq) { |
4531 | u64 now = perf_clock(); | 4559 | u64 now = perf_clock(); |
diff --git a/kernel/exit.c b/kernel/exit.c index 294b1709170d..4b4042f9bc6a 100644 --- a/kernel/exit.c +++ b/kernel/exit.c | |||
@@ -1038,6 +1038,22 @@ void do_exit(long code) | |||
1038 | if (tsk->nr_dirtied) | 1038 | if (tsk->nr_dirtied) |
1039 | __this_cpu_add(dirty_throttle_leaks, tsk->nr_dirtied); | 1039 | __this_cpu_add(dirty_throttle_leaks, tsk->nr_dirtied); |
1040 | exit_rcu(); | 1040 | exit_rcu(); |
1041 | |||
1042 | /* | ||
1043 | * The setting of TASK_RUNNING by try_to_wake_up() may be delayed | ||
1044 | * when the following two conditions become true. | ||
1045 | * - There is race condition of mmap_sem (It is acquired by | ||
1046 | * exit_mm()), and | ||
1047 | * - SMI occurs before setting TASK_RUNINNG. | ||
1048 | * (or hypervisor of virtual machine switches to other guest) | ||
1049 | * As a result, we may become TASK_RUNNING after becoming TASK_DEAD | ||
1050 | * | ||
1051 | * To avoid it, we have to wait for releasing tsk->pi_lock which | ||
1052 | * is held by try_to_wake_up() | ||
1053 | */ | ||
1054 | smp_mb(); | ||
1055 | raw_spin_unlock_wait(&tsk->pi_lock); | ||
1056 | |||
1041 | /* causes final put_task_struct in finish_task_switch(). */ | 1057 | /* causes final put_task_struct in finish_task_switch(). */ |
1042 | tsk->state = TASK_DEAD; | 1058 | tsk->state = TASK_DEAD; |
1043 | tsk->flags |= PF_NOFREEZE; /* tell freezer to ignore us */ | 1059 | tsk->flags |= PF_NOFREEZE; /* tell freezer to ignore us */ |
diff --git a/kernel/fork.c b/kernel/fork.c index 051f090d40c1..1b2ef3c23ae4 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
@@ -647,6 +647,26 @@ struct mm_struct *get_task_mm(struct task_struct *task) | |||
647 | } | 647 | } |
648 | EXPORT_SYMBOL_GPL(get_task_mm); | 648 | EXPORT_SYMBOL_GPL(get_task_mm); |
649 | 649 | ||
650 | struct mm_struct *mm_access(struct task_struct *task, unsigned int mode) | ||
651 | { | ||
652 | struct mm_struct *mm; | ||
653 | int err; | ||
654 | |||
655 | err = mutex_lock_killable(&task->signal->cred_guard_mutex); | ||
656 | if (err) | ||
657 | return ERR_PTR(err); | ||
658 | |||
659 | mm = get_task_mm(task); | ||
660 | if (mm && mm != current->mm && | ||
661 | !ptrace_may_access(task, mode)) { | ||
662 | mmput(mm); | ||
663 | mm = ERR_PTR(-EACCES); | ||
664 | } | ||
665 | mutex_unlock(&task->signal->cred_guard_mutex); | ||
666 | |||
667 | return mm; | ||
668 | } | ||
669 | |||
650 | /* Please note the differences between mmput and mm_release. | 670 | /* Please note the differences between mmput and mm_release. |
651 | * mmput is called whenever we stop holding onto a mm_struct, | 671 | * mmput is called whenever we stop holding onto a mm_struct, |
652 | * error success whatever. | 672 | * error success whatever. |
diff --git a/kernel/kprobes.c b/kernel/kprobes.c index 29f5b65bee29..9788c0ec6f43 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c | |||
@@ -1673,8 +1673,12 @@ static int __kprobes pre_handler_kretprobe(struct kprobe *p, | |||
1673 | ri->rp = rp; | 1673 | ri->rp = rp; |
1674 | ri->task = current; | 1674 | ri->task = current; |
1675 | 1675 | ||
1676 | if (rp->entry_handler && rp->entry_handler(ri, regs)) | 1676 | if (rp->entry_handler && rp->entry_handler(ri, regs)) { |
1677 | raw_spin_lock_irqsave(&rp->lock, flags); | ||
1678 | hlist_add_head(&ri->hlist, &rp->free_instances); | ||
1679 | raw_spin_unlock_irqrestore(&rp->lock, flags); | ||
1677 | return 0; | 1680 | return 0; |
1681 | } | ||
1678 | 1682 | ||
1679 | arch_prepare_kretprobe(ri, regs); | 1683 | arch_prepare_kretprobe(ri, regs); |
1680 | 1684 | ||
diff --git a/kernel/power/power.h b/kernel/power/power.h index 0c4defe6d3b8..21724eee5206 100644 --- a/kernel/power/power.h +++ b/kernel/power/power.h | |||
@@ -231,8 +231,28 @@ extern int pm_test_level; | |||
231 | #ifdef CONFIG_SUSPEND_FREEZER | 231 | #ifdef CONFIG_SUSPEND_FREEZER |
232 | static inline int suspend_freeze_processes(void) | 232 | static inline int suspend_freeze_processes(void) |
233 | { | 233 | { |
234 | int error = freeze_processes(); | 234 | int error; |
235 | return error ? : freeze_kernel_threads(); | 235 | |
236 | error = freeze_processes(); | ||
237 | |||
238 | /* | ||
239 | * freeze_processes() automatically thaws every task if freezing | ||
240 | * fails. So we need not do anything extra upon error. | ||
241 | */ | ||
242 | if (error) | ||
243 | goto Finish; | ||
244 | |||
245 | error = freeze_kernel_threads(); | ||
246 | |||
247 | /* | ||
248 | * freeze_kernel_threads() thaws only kernel threads upon freezing | ||
249 | * failure. So we have to thaw the userspace tasks ourselves. | ||
250 | */ | ||
251 | if (error) | ||
252 | thaw_processes(); | ||
253 | |||
254 | Finish: | ||
255 | return error; | ||
236 | } | 256 | } |
237 | 257 | ||
238 | static inline void suspend_thaw_processes(void) | 258 | static inline void suspend_thaw_processes(void) |
diff --git a/kernel/power/process.c b/kernel/power/process.c index 77274c9ba2f1..7e426459e60a 100644 --- a/kernel/power/process.c +++ b/kernel/power/process.c | |||
@@ -143,7 +143,10 @@ int freeze_processes(void) | |||
143 | /** | 143 | /** |
144 | * freeze_kernel_threads - Make freezable kernel threads go to the refrigerator. | 144 | * freeze_kernel_threads - Make freezable kernel threads go to the refrigerator. |
145 | * | 145 | * |
146 | * On success, returns 0. On failure, -errno and system is fully thawed. | 146 | * On success, returns 0. On failure, -errno and only the kernel threads are |
147 | * thawed, so as to give a chance to the caller to do additional cleanups | ||
148 | * (if any) before thawing the userspace tasks. So, it is the responsibility | ||
149 | * of the caller to thaw the userspace tasks, when the time is right. | ||
147 | */ | 150 | */ |
148 | int freeze_kernel_threads(void) | 151 | int freeze_kernel_threads(void) |
149 | { | 152 | { |
@@ -159,7 +162,7 @@ int freeze_kernel_threads(void) | |||
159 | BUG_ON(in_atomic()); | 162 | BUG_ON(in_atomic()); |
160 | 163 | ||
161 | if (error) | 164 | if (error) |
162 | thaw_processes(); | 165 | thaw_kernel_threads(); |
163 | return error; | 166 | return error; |
164 | } | 167 | } |
165 | 168 | ||
@@ -188,3 +191,22 @@ void thaw_processes(void) | |||
188 | printk("done.\n"); | 191 | printk("done.\n"); |
189 | } | 192 | } |
190 | 193 | ||
194 | void thaw_kernel_threads(void) | ||
195 | { | ||
196 | struct task_struct *g, *p; | ||
197 | |||
198 | pm_nosig_freezing = false; | ||
199 | printk("Restarting kernel threads ... "); | ||
200 | |||
201 | thaw_workqueues(); | ||
202 | |||
203 | read_lock(&tasklist_lock); | ||
204 | do_each_thread(g, p) { | ||
205 | if (p->flags & (PF_KTHREAD | PF_WQ_WORKER)) | ||
206 | __thaw_task(p); | ||
207 | } while_each_thread(g, p); | ||
208 | read_unlock(&tasklist_lock); | ||
209 | |||
210 | schedule(); | ||
211 | printk("done.\n"); | ||
212 | } | ||
diff --git a/kernel/power/user.c b/kernel/power/user.c index 6b1ab7a88522..3e100075b13c 100644 --- a/kernel/power/user.c +++ b/kernel/power/user.c | |||
@@ -249,13 +249,15 @@ static long snapshot_ioctl(struct file *filp, unsigned int cmd, | |||
249 | } | 249 | } |
250 | pm_restore_gfp_mask(); | 250 | pm_restore_gfp_mask(); |
251 | error = hibernation_snapshot(data->platform_support); | 251 | error = hibernation_snapshot(data->platform_support); |
252 | if (!error) { | 252 | if (error) { |
253 | thaw_kernel_threads(); | ||
254 | } else { | ||
253 | error = put_user(in_suspend, (int __user *)arg); | 255 | error = put_user(in_suspend, (int __user *)arg); |
254 | if (!error && !freezer_test_done) | 256 | if (!error && !freezer_test_done) |
255 | data->ready = 1; | 257 | data->ready = 1; |
256 | if (freezer_test_done) { | 258 | if (freezer_test_done) { |
257 | freezer_test_done = false; | 259 | freezer_test_done = false; |
258 | thaw_processes(); | 260 | thaw_kernel_threads(); |
259 | } | 261 | } |
260 | } | 262 | } |
261 | break; | 263 | break; |
@@ -274,6 +276,15 @@ static long snapshot_ioctl(struct file *filp, unsigned int cmd, | |||
274 | swsusp_free(); | 276 | swsusp_free(); |
275 | memset(&data->handle, 0, sizeof(struct snapshot_handle)); | 277 | memset(&data->handle, 0, sizeof(struct snapshot_handle)); |
276 | data->ready = 0; | 278 | data->ready = 0; |
279 | /* | ||
280 | * It is necessary to thaw kernel threads here, because | ||
281 | * SNAPSHOT_CREATE_IMAGE may be invoked directly after | ||
282 | * SNAPSHOT_FREE. In that case, if kernel threads were not | ||
283 | * thawed, the preallocation of memory carried out by | ||
284 | * hibernation_snapshot() might run into problems (i.e. it | ||
285 | * might fail or even deadlock). | ||
286 | */ | ||
287 | thaw_kernel_threads(); | ||
277 | break; | 288 | break; |
278 | 289 | ||
279 | case SNAPSHOT_PREF_IMAGE_SIZE: | 290 | case SNAPSHOT_PREF_IMAGE_SIZE: |
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index df00cb09263e..5255c9d2e053 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c | |||
@@ -74,6 +74,7 @@ | |||
74 | 74 | ||
75 | #include <asm/tlb.h> | 75 | #include <asm/tlb.h> |
76 | #include <asm/irq_regs.h> | 76 | #include <asm/irq_regs.h> |
77 | #include <asm/mutex.h> | ||
77 | #ifdef CONFIG_PARAVIRT | 78 | #ifdef CONFIG_PARAVIRT |
78 | #include <asm/paravirt.h> | 79 | #include <asm/paravirt.h> |
79 | #endif | 80 | #endif |
@@ -723,9 +724,6 @@ static void dequeue_task(struct rq *rq, struct task_struct *p, int flags) | |||
723 | p->sched_class->dequeue_task(rq, p, flags); | 724 | p->sched_class->dequeue_task(rq, p, flags); |
724 | } | 725 | } |
725 | 726 | ||
726 | /* | ||
727 | * activate_task - move a task to the runqueue. | ||
728 | */ | ||
729 | void activate_task(struct rq *rq, struct task_struct *p, int flags) | 727 | void activate_task(struct rq *rq, struct task_struct *p, int flags) |
730 | { | 728 | { |
731 | if (task_contributes_to_load(p)) | 729 | if (task_contributes_to_load(p)) |
@@ -734,9 +732,6 @@ void activate_task(struct rq *rq, struct task_struct *p, int flags) | |||
734 | enqueue_task(rq, p, flags); | 732 | enqueue_task(rq, p, flags); |
735 | } | 733 | } |
736 | 734 | ||
737 | /* | ||
738 | * deactivate_task - remove a task from the runqueue. | ||
739 | */ | ||
740 | void deactivate_task(struct rq *rq, struct task_struct *p, int flags) | 735 | void deactivate_task(struct rq *rq, struct task_struct *p, int flags) |
741 | { | 736 | { |
742 | if (task_contributes_to_load(p)) | 737 | if (task_contributes_to_load(p)) |
@@ -4134,7 +4129,7 @@ recheck: | |||
4134 | on_rq = p->on_rq; | 4129 | on_rq = p->on_rq; |
4135 | running = task_current(rq, p); | 4130 | running = task_current(rq, p); |
4136 | if (on_rq) | 4131 | if (on_rq) |
4137 | deactivate_task(rq, p, 0); | 4132 | dequeue_task(rq, p, 0); |
4138 | if (running) | 4133 | if (running) |
4139 | p->sched_class->put_prev_task(rq, p); | 4134 | p->sched_class->put_prev_task(rq, p); |
4140 | 4135 | ||
@@ -4147,7 +4142,7 @@ recheck: | |||
4147 | if (running) | 4142 | if (running) |
4148 | p->sched_class->set_curr_task(rq); | 4143 | p->sched_class->set_curr_task(rq); |
4149 | if (on_rq) | 4144 | if (on_rq) |
4150 | activate_task(rq, p, 0); | 4145 | enqueue_task(rq, p, 0); |
4151 | 4146 | ||
4152 | check_class_changed(rq, p, prev_class, oldprio); | 4147 | check_class_changed(rq, p, prev_class, oldprio); |
4153 | task_rq_unlock(rq, p, &flags); | 4148 | task_rq_unlock(rq, p, &flags); |
@@ -4998,9 +4993,9 @@ static int __migrate_task(struct task_struct *p, int src_cpu, int dest_cpu) | |||
4998 | * placed properly. | 4993 | * placed properly. |
4999 | */ | 4994 | */ |
5000 | if (p->on_rq) { | 4995 | if (p->on_rq) { |
5001 | deactivate_task(rq_src, p, 0); | 4996 | dequeue_task(rq_src, p, 0); |
5002 | set_task_cpu(p, dest_cpu); | 4997 | set_task_cpu(p, dest_cpu); |
5003 | activate_task(rq_dest, p, 0); | 4998 | enqueue_task(rq_dest, p, 0); |
5004 | check_preempt_curr(rq_dest, p, 0); | 4999 | check_preempt_curr(rq_dest, p, 0); |
5005 | } | 5000 | } |
5006 | done: | 5001 | done: |
@@ -7032,10 +7027,10 @@ static void normalize_task(struct rq *rq, struct task_struct *p) | |||
7032 | 7027 | ||
7033 | on_rq = p->on_rq; | 7028 | on_rq = p->on_rq; |
7034 | if (on_rq) | 7029 | if (on_rq) |
7035 | deactivate_task(rq, p, 0); | 7030 | dequeue_task(rq, p, 0); |
7036 | __setscheduler(rq, p, SCHED_NORMAL, 0); | 7031 | __setscheduler(rq, p, SCHED_NORMAL, 0); |
7037 | if (on_rq) { | 7032 | if (on_rq) { |
7038 | activate_task(rq, p, 0); | 7033 | enqueue_task(rq, p, 0); |
7039 | resched_task(rq->curr); | 7034 | resched_task(rq->curr); |
7040 | } | 7035 | } |
7041 | 7036 | ||
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 84adb2d66cbd..7c6414fc669d 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c | |||
@@ -4866,6 +4866,15 @@ static void nohz_balancer_kick(int cpu) | |||
4866 | return; | 4866 | return; |
4867 | } | 4867 | } |
4868 | 4868 | ||
4869 | static inline void clear_nohz_tick_stopped(int cpu) | ||
4870 | { | ||
4871 | if (unlikely(test_bit(NOHZ_TICK_STOPPED, nohz_flags(cpu)))) { | ||
4872 | cpumask_clear_cpu(cpu, nohz.idle_cpus_mask); | ||
4873 | atomic_dec(&nohz.nr_cpus); | ||
4874 | clear_bit(NOHZ_TICK_STOPPED, nohz_flags(cpu)); | ||
4875 | } | ||
4876 | } | ||
4877 | |||
4869 | static inline void set_cpu_sd_state_busy(void) | 4878 | static inline void set_cpu_sd_state_busy(void) |
4870 | { | 4879 | { |
4871 | struct sched_domain *sd; | 4880 | struct sched_domain *sd; |
@@ -4904,6 +4913,12 @@ void select_nohz_load_balancer(int stop_tick) | |||
4904 | { | 4913 | { |
4905 | int cpu = smp_processor_id(); | 4914 | int cpu = smp_processor_id(); |
4906 | 4915 | ||
4916 | /* | ||
4917 | * If this cpu is going down, then nothing needs to be done. | ||
4918 | */ | ||
4919 | if (!cpu_active(cpu)) | ||
4920 | return; | ||
4921 | |||
4907 | if (stop_tick) { | 4922 | if (stop_tick) { |
4908 | if (test_bit(NOHZ_TICK_STOPPED, nohz_flags(cpu))) | 4923 | if (test_bit(NOHZ_TICK_STOPPED, nohz_flags(cpu))) |
4909 | return; | 4924 | return; |
@@ -4914,6 +4929,18 @@ void select_nohz_load_balancer(int stop_tick) | |||
4914 | } | 4929 | } |
4915 | return; | 4930 | return; |
4916 | } | 4931 | } |
4932 | |||
4933 | static int __cpuinit sched_ilb_notifier(struct notifier_block *nfb, | ||
4934 | unsigned long action, void *hcpu) | ||
4935 | { | ||
4936 | switch (action & ~CPU_TASKS_FROZEN) { | ||
4937 | case CPU_DYING: | ||
4938 | clear_nohz_tick_stopped(smp_processor_id()); | ||
4939 | return NOTIFY_OK; | ||
4940 | default: | ||
4941 | return NOTIFY_DONE; | ||
4942 | } | ||
4943 | } | ||
4917 | #endif | 4944 | #endif |
4918 | 4945 | ||
4919 | static DEFINE_SPINLOCK(balancing); | 4946 | static DEFINE_SPINLOCK(balancing); |
@@ -5070,11 +5097,7 @@ static inline int nohz_kick_needed(struct rq *rq, int cpu) | |||
5070 | * busy tick after returning from idle, we will update the busy stats. | 5097 | * busy tick after returning from idle, we will update the busy stats. |
5071 | */ | 5098 | */ |
5072 | set_cpu_sd_state_busy(); | 5099 | set_cpu_sd_state_busy(); |
5073 | if (unlikely(test_bit(NOHZ_TICK_STOPPED, nohz_flags(cpu)))) { | 5100 | clear_nohz_tick_stopped(cpu); |
5074 | clear_bit(NOHZ_TICK_STOPPED, nohz_flags(cpu)); | ||
5075 | cpumask_clear_cpu(cpu, nohz.idle_cpus_mask); | ||
5076 | atomic_dec(&nohz.nr_cpus); | ||
5077 | } | ||
5078 | 5101 | ||
5079 | /* | 5102 | /* |
5080 | * None are in tickless mode and hence no need for NOHZ idle load | 5103 | * None are in tickless mode and hence no need for NOHZ idle load |
@@ -5590,6 +5613,7 @@ __init void init_sched_fair_class(void) | |||
5590 | 5613 | ||
5591 | #ifdef CONFIG_NO_HZ | 5614 | #ifdef CONFIG_NO_HZ |
5592 | zalloc_cpumask_var(&nohz.idle_cpus_mask, GFP_NOWAIT); | 5615 | zalloc_cpumask_var(&nohz.idle_cpus_mask, GFP_NOWAIT); |
5616 | cpu_notifier(sched_ilb_notifier, 0); | ||
5593 | #endif | 5617 | #endif |
5594 | #endif /* SMP */ | 5618 | #endif /* SMP */ |
5595 | 5619 | ||
diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c index 3640ebbb466b..f42ae7fb5ec5 100644 --- a/kernel/sched/rt.c +++ b/kernel/sched/rt.c | |||
@@ -1587,6 +1587,11 @@ static int push_rt_task(struct rq *rq) | |||
1587 | if (!next_task) | 1587 | if (!next_task) |
1588 | return 0; | 1588 | return 0; |
1589 | 1589 | ||
1590 | #ifdef __ARCH_WANT_INTERRUPTS_ON_CTXSW | ||
1591 | if (unlikely(task_running(rq, next_task))) | ||
1592 | return 0; | ||
1593 | #endif | ||
1594 | |||
1590 | retry: | 1595 | retry: |
1591 | if (unlikely(next_task == rq->curr)) { | 1596 | if (unlikely(next_task == rq->curr)) { |
1592 | WARN_ON(1); | 1597 | WARN_ON(1); |
diff --git a/kernel/watchdog.c b/kernel/watchdog.c index 1d7bca7f4f52..d117262deba3 100644 --- a/kernel/watchdog.c +++ b/kernel/watchdog.c | |||
@@ -296,7 +296,7 @@ static enum hrtimer_restart watchdog_timer_fn(struct hrtimer *hrtimer) | |||
296 | if (__this_cpu_read(soft_watchdog_warn) == true) | 296 | if (__this_cpu_read(soft_watchdog_warn) == true) |
297 | return HRTIMER_RESTART; | 297 | return HRTIMER_RESTART; |
298 | 298 | ||
299 | printk(KERN_ERR "BUG: soft lockup - CPU#%d stuck for %us! [%s:%d]\n", | 299 | printk(KERN_EMERG "BUG: soft lockup - CPU#%d stuck for %us! [%s:%d]\n", |
300 | smp_processor_id(), duration, | 300 | smp_processor_id(), duration, |
301 | current->comm, task_pid_nr(current)); | 301 | current->comm, task_pid_nr(current)); |
302 | print_modules(); | 302 | print_modules(); |
diff --git a/lib/Kconfig b/lib/Kconfig index 169eb7c598e5..028aba9e72af 100644 --- a/lib/Kconfig +++ b/lib/Kconfig | |||
@@ -19,6 +19,9 @@ config RATIONAL | |||
19 | config GENERIC_FIND_FIRST_BIT | 19 | config GENERIC_FIND_FIRST_BIT |
20 | bool | 20 | bool |
21 | 21 | ||
22 | config NO_GENERIC_PCI_IOPORT_MAP | ||
23 | bool | ||
24 | |||
22 | config GENERIC_PCI_IOMAP | 25 | config GENERIC_PCI_IOMAP |
23 | bool | 26 | bool |
24 | 27 | ||
@@ -279,6 +282,9 @@ config AVERAGE | |||
279 | 282 | ||
280 | If unsure, say N. | 283 | If unsure, say N. |
281 | 284 | ||
285 | config CLZ_TAB | ||
286 | bool | ||
287 | |||
282 | config CORDIC | 288 | config CORDIC |
283 | tristate "CORDIC algorithm" | 289 | tristate "CORDIC algorithm" |
284 | help | 290 | help |
@@ -287,6 +293,7 @@ config CORDIC | |||
287 | 293 | ||
288 | config MPILIB | 294 | config MPILIB |
289 | tristate | 295 | tristate |
296 | select CLZ_TAB | ||
290 | help | 297 | help |
291 | Multiprecision maths library from GnuPG. | 298 | Multiprecision maths library from GnuPG. |
292 | It is used to implement RSA digital signature verification, | 299 | It is used to implement RSA digital signature verification, |
diff --git a/lib/Makefile b/lib/Makefile index d71aae1b01b3..18515f0267c4 100644 --- a/lib/Makefile +++ b/lib/Makefile | |||
@@ -121,6 +121,8 @@ obj-$(CONFIG_DQL) += dynamic_queue_limits.o | |||
121 | obj-$(CONFIG_MPILIB) += mpi/ | 121 | obj-$(CONFIG_MPILIB) += mpi/ |
122 | obj-$(CONFIG_SIGNATURE) += digsig.o | 122 | obj-$(CONFIG_SIGNATURE) += digsig.o |
123 | 123 | ||
124 | obj-$(CONFIG_CLZ_TAB) += clz_tab.o | ||
125 | |||
124 | hostprogs-y := gen_crc32table | 126 | hostprogs-y := gen_crc32table |
125 | clean-files := crc32table.h | 127 | clean-files := crc32table.h |
126 | 128 | ||
@@ -169,7 +169,7 @@ enum bug_trap_type report_bug(unsigned long bugaddr, struct pt_regs *regs) | |||
169 | return BUG_TRAP_TYPE_WARN; | 169 | return BUG_TRAP_TYPE_WARN; |
170 | } | 170 | } |
171 | 171 | ||
172 | printk(KERN_EMERG "------------[ cut here ]------------\n"); | 172 | printk(KERN_DEFAULT "------------[ cut here ]------------\n"); |
173 | 173 | ||
174 | if (file) | 174 | if (file) |
175 | printk(KERN_CRIT "kernel BUG at %s:%u!\n", | 175 | printk(KERN_CRIT "kernel BUG at %s:%u!\n", |
diff --git a/lib/clz_tab.c b/lib/clz_tab.c new file mode 100644 index 000000000000..7287b4a991a7 --- /dev/null +++ b/lib/clz_tab.c | |||
@@ -0,0 +1,18 @@ | |||
1 | const unsigned char __clz_tab[] = { | ||
2 | 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, | ||
3 | 5, 5, 5, 5, 5, 5, 5, 5, | ||
4 | 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | ||
5 | 6, 6, 6, 6, 6, 6, 6, 6, | ||
6 | 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, | ||
7 | 7, 7, 7, 7, 7, 7, 7, 7, | ||
8 | 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, | ||
9 | 7, 7, 7, 7, 7, 7, 7, 7, | ||
10 | 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, | ||
11 | 8, 8, 8, 8, 8, 8, 8, 8, | ||
12 | 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, | ||
13 | 8, 8, 8, 8, 8, 8, 8, 8, | ||
14 | 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, | ||
15 | 8, 8, 8, 8, 8, 8, 8, 8, | ||
16 | 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, | ||
17 | 8, 8, 8, 8, 8, 8, 8, 8, | ||
18 | }; | ||
diff --git a/lib/digsig.c b/lib/digsig.c index fd2402f67f89..286d558033e2 100644 --- a/lib/digsig.c +++ b/lib/digsig.c | |||
@@ -34,14 +34,9 @@ static int pkcs_1_v1_5_decode_emsa(const unsigned char *msg, | |||
34 | unsigned long msglen, | 34 | unsigned long msglen, |
35 | unsigned long modulus_bitlen, | 35 | unsigned long modulus_bitlen, |
36 | unsigned char *out, | 36 | unsigned char *out, |
37 | unsigned long *outlen, | 37 | unsigned long *outlen) |
38 | int *is_valid) | ||
39 | { | 38 | { |
40 | unsigned long modulus_len, ps_len, i; | 39 | unsigned long modulus_len, ps_len, i; |
41 | int result; | ||
42 | |||
43 | /* default to invalid packet */ | ||
44 | *is_valid = 0; | ||
45 | 40 | ||
46 | modulus_len = (modulus_bitlen >> 3) + (modulus_bitlen & 7 ? 1 : 0); | 41 | modulus_len = (modulus_bitlen >> 3) + (modulus_bitlen & 7 ? 1 : 0); |
47 | 42 | ||
@@ -50,39 +45,30 @@ static int pkcs_1_v1_5_decode_emsa(const unsigned char *msg, | |||
50 | return -EINVAL; | 45 | return -EINVAL; |
51 | 46 | ||
52 | /* separate encoded message */ | 47 | /* separate encoded message */ |
53 | if ((msg[0] != 0x00) || (msg[1] != (unsigned char)1)) { | 48 | if ((msg[0] != 0x00) || (msg[1] != (unsigned char)1)) |
54 | result = -EINVAL; | 49 | return -EINVAL; |
55 | goto bail; | ||
56 | } | ||
57 | 50 | ||
58 | for (i = 2; i < modulus_len - 1; i++) | 51 | for (i = 2; i < modulus_len - 1; i++) |
59 | if (msg[i] != 0xFF) | 52 | if (msg[i] != 0xFF) |
60 | break; | 53 | break; |
61 | 54 | ||
62 | /* separator check */ | 55 | /* separator check */ |
63 | if (msg[i] != 0) { | 56 | if (msg[i] != 0) |
64 | /* There was no octet with hexadecimal value 0x00 | 57 | /* There was no octet with hexadecimal value 0x00 |
65 | to separate ps from m. */ | 58 | to separate ps from m. */ |
66 | result = -EINVAL; | 59 | return -EINVAL; |
67 | goto bail; | ||
68 | } | ||
69 | 60 | ||
70 | ps_len = i - 2; | 61 | ps_len = i - 2; |
71 | 62 | ||
72 | if (*outlen < (msglen - (2 + ps_len + 1))) { | 63 | if (*outlen < (msglen - (2 + ps_len + 1))) { |
73 | *outlen = msglen - (2 + ps_len + 1); | 64 | *outlen = msglen - (2 + ps_len + 1); |
74 | result = -EOVERFLOW; | 65 | return -EOVERFLOW; |
75 | goto bail; | ||
76 | } | 66 | } |
77 | 67 | ||
78 | *outlen = (msglen - (2 + ps_len + 1)); | 68 | *outlen = (msglen - (2 + ps_len + 1)); |
79 | memcpy(out, &msg[2 + ps_len + 1], *outlen); | 69 | memcpy(out, &msg[2 + ps_len + 1], *outlen); |
80 | 70 | ||
81 | /* valid packet */ | 71 | return 0; |
82 | *is_valid = 1; | ||
83 | result = 0; | ||
84 | bail: | ||
85 | return result; | ||
86 | } | 72 | } |
87 | 73 | ||
88 | /* | 74 | /* |
@@ -96,7 +82,7 @@ static int digsig_verify_rsa(struct key *key, | |||
96 | unsigned long len; | 82 | unsigned long len; |
97 | unsigned long mlen, mblen; | 83 | unsigned long mlen, mblen; |
98 | unsigned nret, l; | 84 | unsigned nret, l; |
99 | int valid, head, i; | 85 | int head, i; |
100 | unsigned char *out1 = NULL, *out2 = NULL; | 86 | unsigned char *out1 = NULL, *out2 = NULL; |
101 | MPI in = NULL, res = NULL, pkey[2]; | 87 | MPI in = NULL, res = NULL, pkey[2]; |
102 | uint8_t *p, *datap, *endp; | 88 | uint8_t *p, *datap, *endp; |
@@ -105,6 +91,10 @@ static int digsig_verify_rsa(struct key *key, | |||
105 | 91 | ||
106 | down_read(&key->sem); | 92 | down_read(&key->sem); |
107 | ukp = key->payload.data; | 93 | ukp = key->payload.data; |
94 | |||
95 | if (ukp->datalen < sizeof(*pkh)) | ||
96 | goto err1; | ||
97 | |||
108 | pkh = (struct pubkey_hdr *)ukp->data; | 98 | pkh = (struct pubkey_hdr *)ukp->data; |
109 | 99 | ||
110 | if (pkh->version != 1) | 100 | if (pkh->version != 1) |
@@ -117,18 +107,23 @@ static int digsig_verify_rsa(struct key *key, | |||
117 | goto err1; | 107 | goto err1; |
118 | 108 | ||
119 | datap = pkh->mpi; | 109 | datap = pkh->mpi; |
120 | endp = datap + ukp->datalen; | 110 | endp = ukp->data + ukp->datalen; |
111 | |||
112 | err = -ENOMEM; | ||
121 | 113 | ||
122 | for (i = 0; i < pkh->nmpi; i++) { | 114 | for (i = 0; i < pkh->nmpi; i++) { |
123 | unsigned int remaining = endp - datap; | 115 | unsigned int remaining = endp - datap; |
124 | pkey[i] = mpi_read_from_buffer(datap, &remaining); | 116 | pkey[i] = mpi_read_from_buffer(datap, &remaining); |
117 | if (!pkey[i]) | ||
118 | goto err; | ||
125 | datap += remaining; | 119 | datap += remaining; |
126 | } | 120 | } |
127 | 121 | ||
128 | mblen = mpi_get_nbits(pkey[0]); | 122 | mblen = mpi_get_nbits(pkey[0]); |
129 | mlen = (mblen + 7)/8; | 123 | mlen = (mblen + 7)/8; |
130 | 124 | ||
131 | err = -ENOMEM; | 125 | if (mlen == 0) |
126 | goto err; | ||
132 | 127 | ||
133 | out1 = kzalloc(mlen, GFP_KERNEL); | 128 | out1 = kzalloc(mlen, GFP_KERNEL); |
134 | if (!out1) | 129 | if (!out1) |
@@ -167,10 +162,9 @@ static int digsig_verify_rsa(struct key *key, | |||
167 | memset(out1, 0, head); | 162 | memset(out1, 0, head); |
168 | memcpy(out1 + head, p, l); | 163 | memcpy(out1 + head, p, l); |
169 | 164 | ||
170 | err = -EINVAL; | 165 | err = pkcs_1_v1_5_decode_emsa(out1, len, mblen, out2, &len); |
171 | pkcs_1_v1_5_decode_emsa(out1, len, mblen, out2, &len, &valid); | ||
172 | 166 | ||
173 | if (valid && len == hlen) | 167 | if (!err && len == hlen) |
174 | err = memcmp(out2, h, hlen); | 168 | err = memcmp(out2, h, hlen); |
175 | 169 | ||
176 | err: | 170 | err: |
@@ -178,8 +172,8 @@ err: | |||
178 | mpi_free(res); | 172 | mpi_free(res); |
179 | kfree(out1); | 173 | kfree(out1); |
180 | kfree(out2); | 174 | kfree(out2); |
181 | mpi_free(pkey[0]); | 175 | while (--i >= 0) |
182 | mpi_free(pkey[1]); | 176 | mpi_free(pkey[i]); |
183 | err1: | 177 | err1: |
184 | up_read(&key->sem); | 178 | up_read(&key->sem); |
185 | 179 | ||
diff --git a/lib/mpi/longlong.h b/lib/mpi/longlong.h index b87487b40a8b..29f98624ef93 100644 --- a/lib/mpi/longlong.h +++ b/lib/mpi/longlong.h | |||
@@ -1200,18 +1200,40 @@ do { \ | |||
1200 | "r" ((USItype)(v)) \ | 1200 | "r" ((USItype)(v)) \ |
1201 | : "%g1", "%g2" __AND_CLOBBER_CC) | 1201 | : "%g1", "%g2" __AND_CLOBBER_CC) |
1202 | #define UMUL_TIME 39 /* 39 instructions */ | 1202 | #define UMUL_TIME 39 /* 39 instructions */ |
1203 | #endif | 1203 | /* It's quite necessary to add this much assembler for the sparc. |
1204 | #ifndef udiv_qrnnd | 1204 | The default udiv_qrnnd (in C) is more than 10 times slower! */ |
1205 | #ifndef LONGLONG_STANDALONE | ||
1206 | #define udiv_qrnnd(q, r, n1, n0, d) \ | 1205 | #define udiv_qrnnd(q, r, n1, n0, d) \ |
1207 | do { USItype __r; \ | 1206 | __asm__ ("! Inlined udiv_qrnnd\n\t" \ |
1208 | (q) = __udiv_qrnnd(&__r, (n1), (n0), (d)); \ | 1207 | "mov 32,%%g1\n\t" \ |
1209 | (r) = __r; \ | 1208 | "subcc %1,%2,%%g0\n\t" \ |
1210 | } while (0) | 1209 | "1: bcs 5f\n\t" \ |
1211 | extern USItype __udiv_qrnnd(); | 1210 | "addxcc %0,%0,%0 ! shift n1n0 and a q-bit in lsb\n\t" \ |
1212 | #define UDIV_TIME 140 | 1211 | "sub %1,%2,%1 ! this kills msb of n\n\t" \ |
1213 | #endif /* LONGLONG_STANDALONE */ | 1212 | "addx %1,%1,%1 ! so this can't give carry\n\t" \ |
1214 | #endif /* udiv_qrnnd */ | 1213 | "subcc %%g1,1,%%g1\n\t" \ |
1214 | "2: bne 1b\n\t" \ | ||
1215 | "subcc %1,%2,%%g0\n\t" \ | ||
1216 | "bcs 3f\n\t" \ | ||
1217 | "addxcc %0,%0,%0 ! shift n1n0 and a q-bit in lsb\n\t" \ | ||
1218 | "b 3f\n\t" \ | ||
1219 | "sub %1,%2,%1 ! this kills msb of n\n\t" \ | ||
1220 | "4: sub %1,%2,%1\n\t" \ | ||
1221 | "5: addxcc %1,%1,%1\n\t" \ | ||
1222 | "bcc 2b\n\t" \ | ||
1223 | "subcc %%g1,1,%%g1\n\t" \ | ||
1224 | "! Got carry from n. Subtract next step to cancel this carry.\n\t" \ | ||
1225 | "bne 4b\n\t" \ | ||
1226 | "addcc %0,%0,%0 ! shift n1n0 and a 0-bit in lsb\n\t" \ | ||
1227 | "sub %1,%2,%1\n\t" \ | ||
1228 | "3: xnor %0,0,%0\n\t" \ | ||
1229 | "! End of inline udiv_qrnnd\n" \ | ||
1230 | : "=&r" ((USItype)(q)), \ | ||
1231 | "=&r" ((USItype)(r)) \ | ||
1232 | : "r" ((USItype)(d)), \ | ||
1233 | "1" ((USItype)(n1)), \ | ||
1234 | "0" ((USItype)(n0)) : "%g1", "cc") | ||
1235 | #define UDIV_TIME (3+7*32) /* 7 instructions/iteration. 32 iterations. */ | ||
1236 | #endif | ||
1215 | #endif /* __sparc__ */ | 1237 | #endif /* __sparc__ */ |
1216 | 1238 | ||
1217 | /*************************************** | 1239 | /*************************************** |
diff --git a/lib/mpi/mpi-bit.c b/lib/mpi/mpi-bit.c index 854c9c6da025..2f526627e4f5 100644 --- a/lib/mpi/mpi-bit.c +++ b/lib/mpi/mpi-bit.c | |||
@@ -21,25 +21,6 @@ | |||
21 | #include "mpi-internal.h" | 21 | #include "mpi-internal.h" |
22 | #include "longlong.h" | 22 | #include "longlong.h" |
23 | 23 | ||
24 | const unsigned char __clz_tab[] = { | ||
25 | 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, | ||
26 | 5, 5, 5, 5, 5, 5, 5, 5, | ||
27 | 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | ||
28 | 6, 6, 6, 6, 6, 6, 6, 6, | ||
29 | 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, | ||
30 | 7, 7, 7, 7, 7, 7, 7, 7, | ||
31 | 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, | ||
32 | 7, 7, 7, 7, 7, 7, 7, 7, | ||
33 | 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, | ||
34 | 8, 8, 8, 8, 8, 8, 8, 8, | ||
35 | 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, | ||
36 | 8, 8, 8, 8, 8, 8, 8, 8, | ||
37 | 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, | ||
38 | 8, 8, 8, 8, 8, 8, 8, 8, | ||
39 | 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, | ||
40 | 8, 8, 8, 8, 8, 8, 8, 8, | ||
41 | }; | ||
42 | |||
43 | #define A_LIMB_1 ((mpi_limb_t) 1) | 24 | #define A_LIMB_1 ((mpi_limb_t) 1) |
44 | 25 | ||
45 | /**************** | 26 | /**************** |
diff --git a/lib/mpi/mpi-div.c b/lib/mpi/mpi-div.c index c3087d1390ce..f68cbbb4d4a4 100644 --- a/lib/mpi/mpi-div.c +++ b/lib/mpi/mpi-div.c | |||
@@ -149,6 +149,9 @@ int mpi_tdiv_qr(MPI quot, MPI rem, MPI num, MPI den) | |||
149 | mpi_ptr_t marker[5]; | 149 | mpi_ptr_t marker[5]; |
150 | int markidx = 0; | 150 | int markidx = 0; |
151 | 151 | ||
152 | if (!dsize) | ||
153 | return -EINVAL; | ||
154 | |||
152 | memset(marker, 0, sizeof(marker)); | 155 | memset(marker, 0, sizeof(marker)); |
153 | 156 | ||
154 | /* Ensure space is enough for quotient and remainder. | 157 | /* Ensure space is enough for quotient and remainder. |
@@ -207,6 +210,8 @@ int mpi_tdiv_qr(MPI quot, MPI rem, MPI num, MPI den) | |||
207 | * numerator would be gradually overwritten by the quotient limbs. */ | 210 | * numerator would be gradually overwritten by the quotient limbs. */ |
208 | if (qp == np) { /* Copy NP object to temporary space. */ | 211 | if (qp == np) { /* Copy NP object to temporary space. */ |
209 | np = marker[markidx++] = mpi_alloc_limb_space(nsize); | 212 | np = marker[markidx++] = mpi_alloc_limb_space(nsize); |
213 | if (!np) | ||
214 | goto nomem; | ||
210 | MPN_COPY(np, qp, nsize); | 215 | MPN_COPY(np, qp, nsize); |
211 | } | 216 | } |
212 | } else /* Put quotient at top of remainder. */ | 217 | } else /* Put quotient at top of remainder. */ |
diff --git a/lib/mpi/mpi-pow.c b/lib/mpi/mpi-pow.c index b04a3cf80080..67f3e79af914 100644 --- a/lib/mpi/mpi-pow.c +++ b/lib/mpi/mpi-pow.c | |||
@@ -59,7 +59,7 @@ int mpi_powm(MPI res, MPI base, MPI exp, MPI mod) | |||
59 | ep = exp->d; | 59 | ep = exp->d; |
60 | 60 | ||
61 | if (!msize) | 61 | if (!msize) |
62 | msize = 1 / msize; /* provoke a signal */ | 62 | return -EINVAL; |
63 | 63 | ||
64 | if (!esize) { | 64 | if (!esize) { |
65 | /* Exponent is zero, result is 1 mod MOD, i.e., 1 or 0 | 65 | /* Exponent is zero, result is 1 mod MOD, i.e., 1 or 0 |
diff --git a/lib/mpi/mpicoder.c b/lib/mpi/mpicoder.c index 716802b774ea..f26b41fcb48c 100644 --- a/lib/mpi/mpicoder.c +++ b/lib/mpi/mpicoder.c | |||
@@ -20,78 +20,15 @@ | |||
20 | 20 | ||
21 | #include "mpi-internal.h" | 21 | #include "mpi-internal.h" |
22 | 22 | ||
23 | #define DIM(v) (sizeof(v)/sizeof((v)[0])) | ||
24 | #define MAX_EXTERN_MPI_BITS 16384 | 23 | #define MAX_EXTERN_MPI_BITS 16384 |
25 | 24 | ||
26 | static uint8_t asn[15] = /* Object ID is 1.3.14.3.2.26 */ | ||
27 | { 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, | ||
28 | 0x02, 0x1a, 0x05, 0x00, 0x04, 0x14 | ||
29 | }; | ||
30 | |||
31 | MPI do_encode_md(const void *sha_buffer, unsigned nbits) | ||
32 | { | ||
33 | int nframe = (nbits + 7) / 8; | ||
34 | uint8_t *frame, *fr_pt; | ||
35 | int i = 0, n; | ||
36 | size_t asnlen = DIM(asn); | ||
37 | MPI a = MPI_NULL; | ||
38 | |||
39 | if (SHA1_DIGEST_LENGTH + asnlen + 4 > nframe) | ||
40 | pr_info("MPI: can't encode a %d bit MD into a %d bits frame\n", | ||
41 | (int)(SHA1_DIGEST_LENGTH * 8), (int)nbits); | ||
42 | |||
43 | /* We encode the MD in this way: | ||
44 | * | ||
45 | * 0 A PAD(n bytes) 0 ASN(asnlen bytes) MD(len bytes) | ||
46 | * | ||
47 | * PAD consists of FF bytes. | ||
48 | */ | ||
49 | frame = kmalloc(nframe, GFP_KERNEL); | ||
50 | if (!frame) | ||
51 | return MPI_NULL; | ||
52 | n = 0; | ||
53 | frame[n++] = 0; | ||
54 | frame[n++] = 1; /* block type */ | ||
55 | i = nframe - SHA1_DIGEST_LENGTH - asnlen - 3; | ||
56 | |||
57 | if (i <= 1) { | ||
58 | pr_info("MPI: message digest encoding failed\n"); | ||
59 | kfree(frame); | ||
60 | return a; | ||
61 | } | ||
62 | |||
63 | memset(frame + n, 0xff, i); | ||
64 | n += i; | ||
65 | frame[n++] = 0; | ||
66 | memcpy(frame + n, &asn, asnlen); | ||
67 | n += asnlen; | ||
68 | memcpy(frame + n, sha_buffer, SHA1_DIGEST_LENGTH); | ||
69 | n += SHA1_DIGEST_LENGTH; | ||
70 | |||
71 | i = nframe; | ||
72 | fr_pt = frame; | ||
73 | |||
74 | if (n != nframe) { | ||
75 | printk | ||
76 | ("MPI: message digest encoding failed, frame length is wrong\n"); | ||
77 | kfree(frame); | ||
78 | return a; | ||
79 | } | ||
80 | |||
81 | a = mpi_alloc((nframe + BYTES_PER_MPI_LIMB - 1) / BYTES_PER_MPI_LIMB); | ||
82 | mpi_set_buffer(a, frame, nframe, 0); | ||
83 | kfree(frame); | ||
84 | |||
85 | return a; | ||
86 | } | ||
87 | |||
88 | MPI mpi_read_from_buffer(const void *xbuffer, unsigned *ret_nread) | 25 | MPI mpi_read_from_buffer(const void *xbuffer, unsigned *ret_nread) |
89 | { | 26 | { |
90 | const uint8_t *buffer = xbuffer; | 27 | const uint8_t *buffer = xbuffer; |
91 | int i, j; | 28 | int i, j; |
92 | unsigned nbits, nbytes, nlimbs, nread = 0; | 29 | unsigned nbits, nbytes, nlimbs, nread = 0; |
93 | mpi_limb_t a; | 30 | mpi_limb_t a; |
94 | MPI val = MPI_NULL; | 31 | MPI val = NULL; |
95 | 32 | ||
96 | if (*ret_nread < 2) | 33 | if (*ret_nread < 2) |
97 | goto leave; | 34 | goto leave; |
@@ -108,7 +45,7 @@ MPI mpi_read_from_buffer(const void *xbuffer, unsigned *ret_nread) | |||
108 | nlimbs = (nbytes + BYTES_PER_MPI_LIMB - 1) / BYTES_PER_MPI_LIMB; | 45 | nlimbs = (nbytes + BYTES_PER_MPI_LIMB - 1) / BYTES_PER_MPI_LIMB; |
109 | val = mpi_alloc(nlimbs); | 46 | val = mpi_alloc(nlimbs); |
110 | if (!val) | 47 | if (!val) |
111 | return MPI_NULL; | 48 | return NULL; |
112 | i = BYTES_PER_MPI_LIMB - nbytes % BYTES_PER_MPI_LIMB; | 49 | i = BYTES_PER_MPI_LIMB - nbytes % BYTES_PER_MPI_LIMB; |
113 | i %= BYTES_PER_MPI_LIMB; | 50 | i %= BYTES_PER_MPI_LIMB; |
114 | val->nbits = nbits; | 51 | val->nbits = nbits; |
@@ -212,30 +149,6 @@ int mpi_fromstr(MPI val, const char *str) | |||
212 | EXPORT_SYMBOL_GPL(mpi_fromstr); | 149 | EXPORT_SYMBOL_GPL(mpi_fromstr); |
213 | 150 | ||
214 | /**************** | 151 | /**************** |
215 | * Special function to get the low 8 bytes from an mpi. | ||
216 | * This can be used as a keyid; KEYID is an 2 element array. | ||
217 | * Return the low 4 bytes. | ||
218 | */ | ||
219 | u32 mpi_get_keyid(const MPI a, u32 *keyid) | ||
220 | { | ||
221 | #if BYTES_PER_MPI_LIMB == 4 | ||
222 | if (keyid) { | ||
223 | keyid[0] = a->nlimbs >= 2 ? a->d[1] : 0; | ||
224 | keyid[1] = a->nlimbs >= 1 ? a->d[0] : 0; | ||
225 | } | ||
226 | return a->nlimbs >= 1 ? a->d[0] : 0; | ||
227 | #elif BYTES_PER_MPI_LIMB == 8 | ||
228 | if (keyid) { | ||
229 | keyid[0] = a->nlimbs ? (u32) (a->d[0] >> 32) : 0; | ||
230 | keyid[1] = a->nlimbs ? (u32) (a->d[0] & 0xffffffff) : 0; | ||
231 | } | ||
232 | return a->nlimbs ? (u32) (a->d[0] & 0xffffffff) : 0; | ||
233 | #else | ||
234 | #error Make this function work with other LIMB sizes | ||
235 | #endif | ||
236 | } | ||
237 | |||
238 | /**************** | ||
239 | * Return an allocated buffer with the MPI (msb first). | 152 | * Return an allocated buffer with the MPI (msb first). |
240 | * NBYTES receives the length of this buffer. Caller must free the | 153 | * NBYTES receives the length of this buffer. Caller must free the |
241 | * return string (This function does return a 0 byte buffer with NBYTES | 154 | * return string (This function does return a 0 byte buffer with NBYTES |
diff --git a/lib/mpi/mpih-div.c b/lib/mpi/mpih-div.c index 87ede162dfab..cde1aaec18da 100644 --- a/lib/mpi/mpih-div.c +++ b/lib/mpi/mpih-div.c | |||
@@ -217,6 +217,10 @@ mpihelp_divrem(mpi_ptr_t qp, mpi_size_t qextra_limbs, | |||
217 | case 0: | 217 | case 0: |
218 | /* We are asked to divide by zero, so go ahead and do it! (To make | 218 | /* We are asked to divide by zero, so go ahead and do it! (To make |
219 | the compiler not remove this statement, return the value.) */ | 219 | the compiler not remove this statement, return the value.) */ |
220 | /* | ||
221 | * existing clients of this function have been modified | ||
222 | * not to call it with dsize == 0, so this should not happen | ||
223 | */ | ||
220 | return 1 / dsize; | 224 | return 1 / dsize; |
221 | 225 | ||
222 | case 1: | 226 | case 1: |
diff --git a/lib/mpi/mpiutil.c b/lib/mpi/mpiutil.c index eefc55d6b7f5..26e4ed31e256 100644 --- a/lib/mpi/mpiutil.c +++ b/lib/mpi/mpiutil.c | |||
@@ -58,6 +58,9 @@ mpi_ptr_t mpi_alloc_limb_space(unsigned nlimbs) | |||
58 | { | 58 | { |
59 | size_t len = nlimbs * sizeof(mpi_limb_t); | 59 | size_t len = nlimbs * sizeof(mpi_limb_t); |
60 | 60 | ||
61 | if (!len) | ||
62 | return NULL; | ||
63 | |||
61 | return kmalloc(len, GFP_KERNEL); | 64 | return kmalloc(len, GFP_KERNEL); |
62 | } | 65 | } |
63 | 66 | ||
@@ -135,7 +138,7 @@ int mpi_copy(MPI *copied, const MPI a) | |||
135 | size_t i; | 138 | size_t i; |
136 | MPI b; | 139 | MPI b; |
137 | 140 | ||
138 | *copied = MPI_NULL; | 141 | *copied = NULL; |
139 | 142 | ||
140 | if (a) { | 143 | if (a) { |
141 | b = mpi_alloc(a->nlimbs); | 144 | b = mpi_alloc(a->nlimbs); |
diff --git a/lib/pci_iomap.c b/lib/pci_iomap.c index 4b0fdc22e688..0d83ea8a9605 100644 --- a/lib/pci_iomap.c +++ b/lib/pci_iomap.c | |||
@@ -34,7 +34,7 @@ void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen) | |||
34 | if (maxlen && len > maxlen) | 34 | if (maxlen && len > maxlen) |
35 | len = maxlen; | 35 | len = maxlen; |
36 | if (flags & IORESOURCE_IO) | 36 | if (flags & IORESOURCE_IO) |
37 | return ioport_map(start, len); | 37 | return __pci_ioport_map(dev, start, len); |
38 | if (flags & IORESOURCE_MEM) { | 38 | if (flags & IORESOURCE_MEM) { |
39 | if (flags & IORESOURCE_CACHEABLE) | 39 | if (flags & IORESOURCE_CACHEABLE) |
40 | return ioremap(start, len); | 40 | return ioremap(start, len); |
diff --git a/mm/compaction.c b/mm/compaction.c index 71a58f67f481..d9ebebe1a2aa 100644 --- a/mm/compaction.c +++ b/mm/compaction.c | |||
@@ -313,12 +313,34 @@ static isolate_migrate_t isolate_migratepages(struct zone *zone, | |||
313 | } else if (!locked) | 313 | } else if (!locked) |
314 | spin_lock_irq(&zone->lru_lock); | 314 | spin_lock_irq(&zone->lru_lock); |
315 | 315 | ||
316 | /* | ||
317 | * migrate_pfn does not necessarily start aligned to a | ||
318 | * pageblock. Ensure that pfn_valid is called when moving | ||
319 | * into a new MAX_ORDER_NR_PAGES range in case of large | ||
320 | * memory holes within the zone | ||
321 | */ | ||
322 | if ((low_pfn & (MAX_ORDER_NR_PAGES - 1)) == 0) { | ||
323 | if (!pfn_valid(low_pfn)) { | ||
324 | low_pfn += MAX_ORDER_NR_PAGES - 1; | ||
325 | continue; | ||
326 | } | ||
327 | } | ||
328 | |||
316 | if (!pfn_valid_within(low_pfn)) | 329 | if (!pfn_valid_within(low_pfn)) |
317 | continue; | 330 | continue; |
318 | nr_scanned++; | 331 | nr_scanned++; |
319 | 332 | ||
320 | /* Get the page and skip if free */ | 333 | /* |
334 | * Get the page and ensure the page is within the same zone. | ||
335 | * See the comment in isolate_freepages about overlapping | ||
336 | * nodes. It is deliberate that the new zone lock is not taken | ||
337 | * as memory compaction should not move pages between nodes. | ||
338 | */ | ||
321 | page = pfn_to_page(low_pfn); | 339 | page = pfn_to_page(low_pfn); |
340 | if (page_zone(page) != zone) | ||
341 | continue; | ||
342 | |||
343 | /* Skip if free */ | ||
322 | if (PageBuddy(page)) | 344 | if (PageBuddy(page)) |
323 | continue; | 345 | continue; |
324 | 346 | ||
diff --git a/mm/filemap.c b/mm/filemap.c index 97f49ed35bd2..b66275757c28 100644 --- a/mm/filemap.c +++ b/mm/filemap.c | |||
@@ -1400,15 +1400,12 @@ generic_file_aio_read(struct kiocb *iocb, const struct iovec *iov, | |||
1400 | unsigned long seg = 0; | 1400 | unsigned long seg = 0; |
1401 | size_t count; | 1401 | size_t count; |
1402 | loff_t *ppos = &iocb->ki_pos; | 1402 | loff_t *ppos = &iocb->ki_pos; |
1403 | struct blk_plug plug; | ||
1404 | 1403 | ||
1405 | count = 0; | 1404 | count = 0; |
1406 | retval = generic_segment_checks(iov, &nr_segs, &count, VERIFY_WRITE); | 1405 | retval = generic_segment_checks(iov, &nr_segs, &count, VERIFY_WRITE); |
1407 | if (retval) | 1406 | if (retval) |
1408 | return retval; | 1407 | return retval; |
1409 | 1408 | ||
1410 | blk_start_plug(&plug); | ||
1411 | |||
1412 | /* coalesce the iovecs and go direct-to-BIO for O_DIRECT */ | 1409 | /* coalesce the iovecs and go direct-to-BIO for O_DIRECT */ |
1413 | if (filp->f_flags & O_DIRECT) { | 1410 | if (filp->f_flags & O_DIRECT) { |
1414 | loff_t size; | 1411 | loff_t size; |
@@ -1424,8 +1421,12 @@ generic_file_aio_read(struct kiocb *iocb, const struct iovec *iov, | |||
1424 | retval = filemap_write_and_wait_range(mapping, pos, | 1421 | retval = filemap_write_and_wait_range(mapping, pos, |
1425 | pos + iov_length(iov, nr_segs) - 1); | 1422 | pos + iov_length(iov, nr_segs) - 1); |
1426 | if (!retval) { | 1423 | if (!retval) { |
1424 | struct blk_plug plug; | ||
1425 | |||
1426 | blk_start_plug(&plug); | ||
1427 | retval = mapping->a_ops->direct_IO(READ, iocb, | 1427 | retval = mapping->a_ops->direct_IO(READ, iocb, |
1428 | iov, pos, nr_segs); | 1428 | iov, pos, nr_segs); |
1429 | blk_finish_plug(&plug); | ||
1429 | } | 1430 | } |
1430 | if (retval > 0) { | 1431 | if (retval > 0) { |
1431 | *ppos = pos + retval; | 1432 | *ppos = pos + retval; |
@@ -1481,7 +1482,6 @@ generic_file_aio_read(struct kiocb *iocb, const struct iovec *iov, | |||
1481 | break; | 1482 | break; |
1482 | } | 1483 | } |
1483 | out: | 1484 | out: |
1484 | blk_finish_plug(&plug); | ||
1485 | return retval; | 1485 | return retval; |
1486 | } | 1486 | } |
1487 | EXPORT_SYMBOL(generic_file_aio_read); | 1487 | EXPORT_SYMBOL(generic_file_aio_read); |
diff --git a/mm/filemap_xip.c b/mm/filemap_xip.c index f91b2f687343..a4eb31132229 100644 --- a/mm/filemap_xip.c +++ b/mm/filemap_xip.c | |||
@@ -263,7 +263,12 @@ found: | |||
263 | xip_pfn); | 263 | xip_pfn); |
264 | if (err == -ENOMEM) | 264 | if (err == -ENOMEM) |
265 | return VM_FAULT_OOM; | 265 | return VM_FAULT_OOM; |
266 | BUG_ON(err); | 266 | /* |
267 | * err == -EBUSY is fine, we've raced against another thread | ||
268 | * that faulted-in the same page | ||
269 | */ | ||
270 | if (err != -EBUSY) | ||
271 | BUG_ON(err); | ||
267 | return VM_FAULT_NOPAGE; | 272 | return VM_FAULT_NOPAGE; |
268 | } else { | 273 | } else { |
269 | int err, ret = VM_FAULT_OOM; | 274 | int err, ret = VM_FAULT_OOM; |
diff --git a/mm/huge_memory.c b/mm/huge_memory.c index b3ffc21ce801..91d3efb25d15 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c | |||
@@ -2083,7 +2083,7 @@ static void collect_mm_slot(struct mm_slot *mm_slot) | |||
2083 | { | 2083 | { |
2084 | struct mm_struct *mm = mm_slot->mm; | 2084 | struct mm_struct *mm = mm_slot->mm; |
2085 | 2085 | ||
2086 | VM_BUG_ON(!spin_is_locked(&khugepaged_mm_lock)); | 2086 | VM_BUG_ON(NR_CPUS != 1 && !spin_is_locked(&khugepaged_mm_lock)); |
2087 | 2087 | ||
2088 | if (khugepaged_test_exit(mm)) { | 2088 | if (khugepaged_test_exit(mm)) { |
2089 | /* free mm_slot */ | 2089 | /* free mm_slot */ |
@@ -2113,7 +2113,7 @@ static unsigned int khugepaged_scan_mm_slot(unsigned int pages, | |||
2113 | int progress = 0; | 2113 | int progress = 0; |
2114 | 2114 | ||
2115 | VM_BUG_ON(!pages); | 2115 | VM_BUG_ON(!pages); |
2116 | VM_BUG_ON(!spin_is_locked(&khugepaged_mm_lock)); | 2116 | VM_BUG_ON(NR_CPUS != 1 && !spin_is_locked(&khugepaged_mm_lock)); |
2117 | 2117 | ||
2118 | if (khugepaged_scan.mm_slot) | 2118 | if (khugepaged_scan.mm_slot) |
2119 | mm_slot = khugepaged_scan.mm_slot; | 2119 | mm_slot = khugepaged_scan.mm_slot; |
diff --git a/mm/kmemleak.c b/mm/kmemleak.c index c833addd94d7..45eb6217bf38 100644 --- a/mm/kmemleak.c +++ b/mm/kmemleak.c | |||
@@ -1036,7 +1036,7 @@ void __ref kmemleak_scan_area(const void *ptr, size_t size, gfp_t gfp) | |||
1036 | { | 1036 | { |
1037 | pr_debug("%s(0x%p)\n", __func__, ptr); | 1037 | pr_debug("%s(0x%p)\n", __func__, ptr); |
1038 | 1038 | ||
1039 | if (atomic_read(&kmemleak_enabled) && ptr && !IS_ERR(ptr)) | 1039 | if (atomic_read(&kmemleak_enabled) && ptr && size && !IS_ERR(ptr)) |
1040 | add_scan_area((unsigned long)ptr, size, gfp); | 1040 | add_scan_area((unsigned long)ptr, size, gfp); |
1041 | else if (atomic_read(&kmemleak_early_log)) | 1041 | else if (atomic_read(&kmemleak_early_log)) |
1042 | log_early(KMEMLEAK_SCAN_AREA, ptr, size, 0); | 1042 | log_early(KMEMLEAK_SCAN_AREA, ptr, size, 0); |
@@ -1757,6 +1757,7 @@ void __init kmemleak_init(void) | |||
1757 | 1757 | ||
1758 | #ifdef CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF | 1758 | #ifdef CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF |
1759 | if (!kmemleak_skip_disable) { | 1759 | if (!kmemleak_skip_disable) { |
1760 | atomic_set(&kmemleak_early_log, 0); | ||
1760 | kmemleak_disable(); | 1761 | kmemleak_disable(); |
1761 | return; | 1762 | return; |
1762 | } | 1763 | } |
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 556859fec4ef..6728a7ae6f2d 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -776,7 +776,8 @@ static void memcg_check_events(struct mem_cgroup *memcg, struct page *page) | |||
776 | /* threshold event is triggered in finer grain than soft limit */ | 776 | /* threshold event is triggered in finer grain than soft limit */ |
777 | if (unlikely(mem_cgroup_event_ratelimit(memcg, | 777 | if (unlikely(mem_cgroup_event_ratelimit(memcg, |
778 | MEM_CGROUP_TARGET_THRESH))) { | 778 | MEM_CGROUP_TARGET_THRESH))) { |
779 | bool do_softlimit, do_numainfo; | 779 | bool do_softlimit; |
780 | bool do_numainfo __maybe_unused; | ||
780 | 781 | ||
781 | do_softlimit = mem_cgroup_event_ratelimit(memcg, | 782 | do_softlimit = mem_cgroup_event_ratelimit(memcg, |
782 | MEM_CGROUP_TARGET_SOFTLIMIT); | 783 | MEM_CGROUP_TARGET_SOFTLIMIT); |
diff --git a/mm/migrate.c b/mm/migrate.c index 9871a56d82c3..df141f60289e 100644 --- a/mm/migrate.c +++ b/mm/migrate.c | |||
@@ -445,7 +445,6 @@ void migrate_page_copy(struct page *newpage, struct page *page) | |||
445 | ClearPageSwapCache(page); | 445 | ClearPageSwapCache(page); |
446 | ClearPagePrivate(page); | 446 | ClearPagePrivate(page); |
447 | set_page_private(page, 0); | 447 | set_page_private(page, 0); |
448 | page->mapping = NULL; | ||
449 | 448 | ||
450 | /* | 449 | /* |
451 | * If any waiters have accumulated on the new page then | 450 | * If any waiters have accumulated on the new page then |
@@ -667,6 +666,7 @@ static int move_to_new_page(struct page *newpage, struct page *page, | |||
667 | } else { | 666 | } else { |
668 | if (remap_swapcache) | 667 | if (remap_swapcache) |
669 | remove_migration_ptes(page, newpage); | 668 | remove_migration_ptes(page, newpage); |
669 | page->mapping = NULL; | ||
670 | } | 670 | } |
671 | 671 | ||
672 | unlock_page(newpage); | 672 | unlock_page(newpage); |
diff --git a/mm/process_vm_access.c b/mm/process_vm_access.c index e920aa3ce104..c20ff48994c2 100644 --- a/mm/process_vm_access.c +++ b/mm/process_vm_access.c | |||
@@ -298,23 +298,18 @@ static ssize_t process_vm_rw_core(pid_t pid, const struct iovec *lvec, | |||
298 | goto free_proc_pages; | 298 | goto free_proc_pages; |
299 | } | 299 | } |
300 | 300 | ||
301 | task_lock(task); | 301 | mm = mm_access(task, PTRACE_MODE_ATTACH); |
302 | if (__ptrace_may_access(task, PTRACE_MODE_ATTACH)) { | 302 | if (!mm || IS_ERR(mm)) { |
303 | task_unlock(task); | 303 | rc = IS_ERR(mm) ? PTR_ERR(mm) : -ESRCH; |
304 | rc = -EPERM; | 304 | /* |
305 | goto put_task_struct; | 305 | * Explicitly map EACCES to EPERM as EPERM is a more a |
306 | } | 306 | * appropriate error code for process_vw_readv/writev |
307 | mm = task->mm; | 307 | */ |
308 | 308 | if (rc == -EACCES) | |
309 | if (!mm || (task->flags & PF_KTHREAD)) { | 309 | rc = -EPERM; |
310 | task_unlock(task); | ||
311 | rc = -EINVAL; | ||
312 | goto put_task_struct; | 310 | goto put_task_struct; |
313 | } | 311 | } |
314 | 312 | ||
315 | atomic_inc(&mm->mm_users); | ||
316 | task_unlock(task); | ||
317 | |||
318 | for (i = 0; i < riovcnt && iov_l_curr_idx < liovcnt; i++) { | 313 | for (i = 0; i < riovcnt && iov_l_curr_idx < liovcnt; i++) { |
319 | rc = process_vm_rw_single_vec( | 314 | rc = process_vm_rw_single_vec( |
320 | (unsigned long)rvec[i].iov_base, rvec[i].iov_len, | 315 | (unsigned long)rvec[i].iov_base, rvec[i].iov_len, |
@@ -659,7 +659,7 @@ void lru_add_page_tail(struct zone* zone, | |||
659 | VM_BUG_ON(!PageHead(page)); | 659 | VM_BUG_ON(!PageHead(page)); |
660 | VM_BUG_ON(PageCompound(page_tail)); | 660 | VM_BUG_ON(PageCompound(page_tail)); |
661 | VM_BUG_ON(PageLRU(page_tail)); | 661 | VM_BUG_ON(PageLRU(page_tail)); |
662 | VM_BUG_ON(!spin_is_locked(&zone->lru_lock)); | 662 | VM_BUG_ON(NR_CPUS != 1 && !spin_is_locked(&zone->lru_lock)); |
663 | 663 | ||
664 | SetPageLRU(page_tail); | 664 | SetPageLRU(page_tail); |
665 | 665 | ||
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/ceph/ceph_common.c b/net/ceph/ceph_common.c index 97f70e50ad3b..761ad9d6cc3b 100644 --- a/net/ceph/ceph_common.c +++ b/net/ceph/ceph_common.c | |||
@@ -85,8 +85,6 @@ int ceph_check_fsid(struct ceph_client *client, struct ceph_fsid *fsid) | |||
85 | } else { | 85 | } else { |
86 | pr_info("client%lld fsid %pU\n", ceph_client_id(client), fsid); | 86 | pr_info("client%lld fsid %pU\n", ceph_client_id(client), fsid); |
87 | memcpy(&client->fsid, fsid, sizeof(*fsid)); | 87 | memcpy(&client->fsid, fsid, sizeof(*fsid)); |
88 | ceph_debugfs_client_init(client); | ||
89 | client->have_fsid = true; | ||
90 | } | 88 | } |
91 | return 0; | 89 | return 0; |
92 | } | 90 | } |
diff --git a/net/ceph/mon_client.c b/net/ceph/mon_client.c index 0b62deae42bd..1845cde26227 100644 --- a/net/ceph/mon_client.c +++ b/net/ceph/mon_client.c | |||
@@ -8,8 +8,8 @@ | |||
8 | 8 | ||
9 | #include <linux/ceph/mon_client.h> | 9 | #include <linux/ceph/mon_client.h> |
10 | #include <linux/ceph/libceph.h> | 10 | #include <linux/ceph/libceph.h> |
11 | #include <linux/ceph/debugfs.h> | ||
11 | #include <linux/ceph/decode.h> | 12 | #include <linux/ceph/decode.h> |
12 | |||
13 | #include <linux/ceph/auth.h> | 13 | #include <linux/ceph/auth.h> |
14 | 14 | ||
15 | /* | 15 | /* |
@@ -340,8 +340,19 @@ static void ceph_monc_handle_map(struct ceph_mon_client *monc, | |||
340 | client->monc.monmap = monmap; | 340 | client->monc.monmap = monmap; |
341 | kfree(old); | 341 | kfree(old); |
342 | 342 | ||
343 | if (!client->have_fsid) { | ||
344 | client->have_fsid = true; | ||
345 | mutex_unlock(&monc->mutex); | ||
346 | /* | ||
347 | * do debugfs initialization without mutex to avoid | ||
348 | * creating a locking dependency | ||
349 | */ | ||
350 | ceph_debugfs_client_init(client); | ||
351 | goto out_unlocked; | ||
352 | } | ||
343 | out: | 353 | out: |
344 | mutex_unlock(&monc->mutex); | 354 | mutex_unlock(&monc->mutex); |
355 | out_unlocked: | ||
345 | wake_up_all(&client->auth_wq); | 356 | wake_up_all(&client->auth_wq); |
346 | } | 357 | } |
347 | 358 | ||
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/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/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/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_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/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/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/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/checkpatch.pl b/scripts/checkpatch.pl index e3bfcbe8a520..a3b9782441f9 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl | |||
@@ -1924,6 +1924,12 @@ sub process { | |||
1924 | my $pre_ctx = "$1$2"; | 1924 | my $pre_ctx = "$1$2"; |
1925 | 1925 | ||
1926 | my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0); | 1926 | my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0); |
1927 | |||
1928 | if ($line =~ /^\+\t{6,}/) { | ||
1929 | WARN("DEEP_INDENTATION", | ||
1930 | "Too many leading tabs - consider code refactoring\n" . $herecurr); | ||
1931 | } | ||
1932 | |||
1927 | my $ctx_cnt = $realcnt - $#ctx - 1; | 1933 | my $ctx_cnt = $realcnt - $#ctx - 1; |
1928 | my $ctx = join("\n", @ctx); | 1934 | my $ctx = join("\n", @ctx); |
1929 | 1935 | ||
diff --git a/sound/isa/sb/emu8000_patch.c b/sound/isa/sb/emu8000_patch.c index e09f144177f5..c99c6078be33 100644 --- a/sound/isa/sb/emu8000_patch.c +++ b/sound/isa/sb/emu8000_patch.c | |||
@@ -22,7 +22,6 @@ | |||
22 | #include "emu8000_local.h" | 22 | #include "emu8000_local.h" |
23 | #include <asm/uaccess.h> | 23 | #include <asm/uaccess.h> |
24 | #include <linux/moduleparam.h> | 24 | #include <linux/moduleparam.h> |
25 | #include <linux/moduleparam.h> | ||
26 | 25 | ||
27 | static int emu8000_reset_addr; | 26 | static int emu8000_reset_addr; |
28 | module_param(emu8000_reset_addr, int, 0444); | 27 | module_param(emu8000_reset_addr, int, 0444); |
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index 4df72c0e8c37..c2c65f63bf06 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c | |||
@@ -1447,7 +1447,7 @@ void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid, | |||
1447 | for (i = 0; i < c->cvt_setups.used; i++) { | 1447 | for (i = 0; i < c->cvt_setups.used; i++) { |
1448 | p = snd_array_elem(&c->cvt_setups, i); | 1448 | p = snd_array_elem(&c->cvt_setups, i); |
1449 | if (!p->active && p->stream_tag == stream_tag && | 1449 | if (!p->active && p->stream_tag == stream_tag && |
1450 | get_wcaps_type(get_wcaps(codec, p->nid)) == type) | 1450 | get_wcaps_type(get_wcaps(c, p->nid)) == type) |
1451 | p->dirty = 1; | 1451 | p->dirty = 1; |
1452 | } | 1452 | } |
1453 | } | 1453 | } |
diff --git a/sound/pci/hda/hda_jack.c b/sound/pci/hda/hda_jack.c index d8a35da0803f..9d819c4b4923 100644 --- a/sound/pci/hda/hda_jack.c +++ b/sound/pci/hda/hda_jack.c | |||
@@ -282,7 +282,8 @@ int snd_hda_jack_add_kctl(struct hda_codec *codec, hda_nid_t nid, | |||
282 | EXPORT_SYMBOL_HDA(snd_hda_jack_add_kctl); | 282 | EXPORT_SYMBOL_HDA(snd_hda_jack_add_kctl); |
283 | 283 | ||
284 | static int add_jack_kctl(struct hda_codec *codec, hda_nid_t nid, | 284 | static int add_jack_kctl(struct hda_codec *codec, hda_nid_t nid, |
285 | const struct auto_pin_cfg *cfg) | 285 | const struct auto_pin_cfg *cfg, |
286 | char *lastname, int *lastidx) | ||
286 | { | 287 | { |
287 | unsigned int def_conf, conn; | 288 | unsigned int def_conf, conn; |
288 | char name[44]; | 289 | char name[44]; |
@@ -298,6 +299,10 @@ static int add_jack_kctl(struct hda_codec *codec, hda_nid_t nid, | |||
298 | return 0; | 299 | return 0; |
299 | 300 | ||
300 | snd_hda_get_pin_label(codec, nid, cfg, name, sizeof(name), &idx); | 301 | snd_hda_get_pin_label(codec, nid, cfg, name, sizeof(name), &idx); |
302 | if (!strcmp(name, lastname) && idx == *lastidx) | ||
303 | idx++; | ||
304 | strncpy(lastname, name, 44); | ||
305 | *lastidx = idx; | ||
301 | err = snd_hda_jack_add_kctl(codec, nid, name, idx); | 306 | err = snd_hda_jack_add_kctl(codec, nid, name, idx); |
302 | if (err < 0) | 307 | if (err < 0) |
303 | return err; | 308 | return err; |
@@ -311,41 +316,42 @@ int snd_hda_jack_add_kctls(struct hda_codec *codec, | |||
311 | const struct auto_pin_cfg *cfg) | 316 | const struct auto_pin_cfg *cfg) |
312 | { | 317 | { |
313 | const hda_nid_t *p; | 318 | const hda_nid_t *p; |
314 | int i, err; | 319 | int i, err, lastidx = 0; |
320 | char lastname[44] = ""; | ||
315 | 321 | ||
316 | for (i = 0, p = cfg->line_out_pins; i < cfg->line_outs; i++, p++) { | 322 | for (i = 0, p = cfg->line_out_pins; i < cfg->line_outs; i++, p++) { |
317 | err = add_jack_kctl(codec, *p, cfg); | 323 | err = add_jack_kctl(codec, *p, cfg, lastname, &lastidx); |
318 | if (err < 0) | 324 | if (err < 0) |
319 | return err; | 325 | return err; |
320 | } | 326 | } |
321 | for (i = 0, p = cfg->hp_pins; i < cfg->hp_outs; i++, p++) { | 327 | for (i = 0, p = cfg->hp_pins; i < cfg->hp_outs; i++, p++) { |
322 | if (*p == *cfg->line_out_pins) /* might be duplicated */ | 328 | if (*p == *cfg->line_out_pins) /* might be duplicated */ |
323 | break; | 329 | break; |
324 | err = add_jack_kctl(codec, *p, cfg); | 330 | err = add_jack_kctl(codec, *p, cfg, lastname, &lastidx); |
325 | if (err < 0) | 331 | if (err < 0) |
326 | return err; | 332 | return err; |
327 | } | 333 | } |
328 | for (i = 0, p = cfg->speaker_pins; i < cfg->speaker_outs; i++, p++) { | 334 | for (i = 0, p = cfg->speaker_pins; i < cfg->speaker_outs; i++, p++) { |
329 | if (*p == *cfg->line_out_pins) /* might be duplicated */ | 335 | if (*p == *cfg->line_out_pins) /* might be duplicated */ |
330 | break; | 336 | break; |
331 | err = add_jack_kctl(codec, *p, cfg); | 337 | err = add_jack_kctl(codec, *p, cfg, lastname, &lastidx); |
332 | if (err < 0) | 338 | if (err < 0) |
333 | return err; | 339 | return err; |
334 | } | 340 | } |
335 | for (i = 0; i < cfg->num_inputs; i++) { | 341 | for (i = 0; i < cfg->num_inputs; i++) { |
336 | err = add_jack_kctl(codec, cfg->inputs[i].pin, cfg); | 342 | err = add_jack_kctl(codec, cfg->inputs[i].pin, cfg, lastname, &lastidx); |
337 | if (err < 0) | 343 | if (err < 0) |
338 | return err; | 344 | return err; |
339 | } | 345 | } |
340 | for (i = 0, p = cfg->dig_out_pins; i < cfg->dig_outs; i++, p++) { | 346 | for (i = 0, p = cfg->dig_out_pins; i < cfg->dig_outs; i++, p++) { |
341 | err = add_jack_kctl(codec, *p, cfg); | 347 | err = add_jack_kctl(codec, *p, cfg, lastname, &lastidx); |
342 | if (err < 0) | 348 | if (err < 0) |
343 | return err; | 349 | return err; |
344 | } | 350 | } |
345 | err = add_jack_kctl(codec, cfg->dig_in_pin, cfg); | 351 | err = add_jack_kctl(codec, cfg->dig_in_pin, cfg, lastname, &lastidx); |
346 | if (err < 0) | 352 | if (err < 0) |
347 | return err; | 353 | return err; |
348 | err = add_jack_kctl(codec, cfg->mono_out_pin, cfg); | 354 | err = add_jack_kctl(codec, cfg->mono_out_pin, cfg, lastname, &lastidx); |
349 | if (err < 0) | 355 | if (err < 0) |
350 | return err; | 356 | return err; |
351 | return 0; | 357 | return 0; |
diff --git a/sound/pci/hda/patch_ca0132.c b/sound/pci/hda/patch_ca0132.c index 35abe3c62908..21d91d580da8 100644 --- a/sound/pci/hda/patch_ca0132.c +++ b/sound/pci/hda/patch_ca0132.c | |||
@@ -728,18 +728,19 @@ static int ca0132_hp_switch_put(struct snd_kcontrol *kcontrol, | |||
728 | 728 | ||
729 | err = chipio_read(codec, REG_CODEC_MUTE, &data); | 729 | err = chipio_read(codec, REG_CODEC_MUTE, &data); |
730 | if (err < 0) | 730 | if (err < 0) |
731 | return err; | 731 | goto exit; |
732 | 732 | ||
733 | /* *valp 0 is mute, 1 is unmute */ | 733 | /* *valp 0 is mute, 1 is unmute */ |
734 | data = (data & 0x7f) | (*valp ? 0 : 0x80); | 734 | data = (data & 0x7f) | (*valp ? 0 : 0x80); |
735 | chipio_write(codec, REG_CODEC_MUTE, data); | 735 | err = chipio_write(codec, REG_CODEC_MUTE, data); |
736 | if (err < 0) | 736 | if (err < 0) |
737 | return err; | 737 | goto exit; |
738 | 738 | ||
739 | spec->curr_hp_switch = *valp; | 739 | spec->curr_hp_switch = *valp; |
740 | 740 | ||
741 | exit: | ||
741 | snd_hda_power_down(codec); | 742 | snd_hda_power_down(codec); |
742 | return 1; | 743 | return err < 0 ? err : 1; |
743 | } | 744 | } |
744 | 745 | ||
745 | static int ca0132_speaker_switch_get(struct snd_kcontrol *kcontrol, | 746 | static int ca0132_speaker_switch_get(struct snd_kcontrol *kcontrol, |
@@ -770,18 +771,19 @@ static int ca0132_speaker_switch_put(struct snd_kcontrol *kcontrol, | |||
770 | 771 | ||
771 | err = chipio_read(codec, REG_CODEC_MUTE, &data); | 772 | err = chipio_read(codec, REG_CODEC_MUTE, &data); |
772 | if (err < 0) | 773 | if (err < 0) |
773 | return err; | 774 | goto exit; |
774 | 775 | ||
775 | /* *valp 0 is mute, 1 is unmute */ | 776 | /* *valp 0 is mute, 1 is unmute */ |
776 | data = (data & 0xef) | (*valp ? 0 : 0x10); | 777 | data = (data & 0xef) | (*valp ? 0 : 0x10); |
777 | chipio_write(codec, REG_CODEC_MUTE, data); | 778 | err = chipio_write(codec, REG_CODEC_MUTE, data); |
778 | if (err < 0) | 779 | if (err < 0) |
779 | return err; | 780 | goto exit; |
780 | 781 | ||
781 | spec->curr_speaker_switch = *valp; | 782 | spec->curr_speaker_switch = *valp; |
782 | 783 | ||
784 | exit: | ||
783 | snd_hda_power_down(codec); | 785 | snd_hda_power_down(codec); |
784 | return 1; | 786 | return err < 0 ? err : 1; |
785 | } | 787 | } |
786 | 788 | ||
787 | static int ca0132_hp_volume_get(struct snd_kcontrol *kcontrol, | 789 | static int ca0132_hp_volume_get(struct snd_kcontrol *kcontrol, |
@@ -819,25 +821,26 @@ static int ca0132_hp_volume_put(struct snd_kcontrol *kcontrol, | |||
819 | 821 | ||
820 | err = chipio_read(codec, REG_CODEC_HP_VOL_L, &data); | 822 | err = chipio_read(codec, REG_CODEC_HP_VOL_L, &data); |
821 | if (err < 0) | 823 | if (err < 0) |
822 | return err; | 824 | goto exit; |
823 | 825 | ||
824 | val = 31 - left_vol; | 826 | val = 31 - left_vol; |
825 | data = (data & 0xe0) | val; | 827 | data = (data & 0xe0) | val; |
826 | chipio_write(codec, REG_CODEC_HP_VOL_L, data); | 828 | err = chipio_write(codec, REG_CODEC_HP_VOL_L, data); |
827 | if (err < 0) | 829 | if (err < 0) |
828 | return err; | 830 | goto exit; |
829 | 831 | ||
830 | val = 31 - right_vol; | 832 | val = 31 - right_vol; |
831 | data = (data & 0xe0) | val; | 833 | data = (data & 0xe0) | val; |
832 | chipio_write(codec, REG_CODEC_HP_VOL_R, data); | 834 | err = chipio_write(codec, REG_CODEC_HP_VOL_R, data); |
833 | if (err < 0) | 835 | if (err < 0) |
834 | return err; | 836 | goto exit; |
835 | 837 | ||
836 | spec->curr_hp_volume[0] = left_vol; | 838 | spec->curr_hp_volume[0] = left_vol; |
837 | spec->curr_hp_volume[1] = right_vol; | 839 | spec->curr_hp_volume[1] = right_vol; |
838 | 840 | ||
841 | exit: | ||
839 | snd_hda_power_down(codec); | 842 | snd_hda_power_down(codec); |
840 | return 1; | 843 | return err < 0 ? err : 1; |
841 | } | 844 | } |
842 | 845 | ||
843 | static int add_hp_switch(struct hda_codec *codec, hda_nid_t nid) | 846 | static int add_hp_switch(struct hda_codec *codec, hda_nid_t nid) |
@@ -936,6 +939,8 @@ static int ca0132_build_controls(struct hda_codec *codec) | |||
936 | if (err < 0) | 939 | if (err < 0) |
937 | return err; | 940 | return err; |
938 | err = add_in_volume(codec, spec->dig_in, "IEC958"); | 941 | err = add_in_volume(codec, spec->dig_in, "IEC958"); |
942 | if (err < 0) | ||
943 | return err; | ||
939 | } | 944 | } |
940 | return 0; | 945 | return 0; |
941 | } | 946 | } |
diff --git a/sound/pci/hda/patch_cirrus.c b/sound/pci/hda/patch_cirrus.c index 0e99357e822c..bc5a993d1146 100644 --- a/sound/pci/hda/patch_cirrus.c +++ b/sound/pci/hda/patch_cirrus.c | |||
@@ -988,8 +988,10 @@ static void cs_automic(struct hda_codec *codec) | |||
988 | change_cur_input(codec, !spec->automic_idx, 0); | 988 | change_cur_input(codec, !spec->automic_idx, 0); |
989 | } else { | 989 | } else { |
990 | if (present) { | 990 | if (present) { |
991 | spec->last_input = spec->cur_input; | 991 | if (spec->cur_input != spec->automic_idx) { |
992 | spec->cur_input = spec->automic_idx; | 992 | spec->last_input = spec->cur_input; |
993 | spec->cur_input = spec->automic_idx; | ||
994 | } | ||
993 | } else { | 995 | } else { |
994 | spec->cur_input = spec->last_input; | 996 | spec->cur_input = spec->last_input; |
995 | } | 997 | } |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 0db1dc49382b..9350f3c3bdf8 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -177,6 +177,7 @@ struct alc_spec { | |||
177 | unsigned int detect_lo:1; /* Line-out detection enabled */ | 177 | unsigned int detect_lo:1; /* Line-out detection enabled */ |
178 | unsigned int automute_speaker_possible:1; /* there are speakers and either LO or HP */ | 178 | unsigned int automute_speaker_possible:1; /* there are speakers and either LO or HP */ |
179 | unsigned int automute_lo_possible:1; /* there are line outs and HP */ | 179 | unsigned int automute_lo_possible:1; /* there are line outs and HP */ |
180 | unsigned int keep_vref_in_automute:1; /* Don't clear VREF in automute */ | ||
180 | 181 | ||
181 | /* other flags */ | 182 | /* other flags */ |
182 | unsigned int no_analog :1; /* digital I/O only */ | 183 | unsigned int no_analog :1; /* digital I/O only */ |
@@ -495,13 +496,24 @@ static void do_automute(struct hda_codec *codec, int num_pins, hda_nid_t *pins, | |||
495 | 496 | ||
496 | for (i = 0; i < num_pins; i++) { | 497 | for (i = 0; i < num_pins; i++) { |
497 | hda_nid_t nid = pins[i]; | 498 | hda_nid_t nid = pins[i]; |
499 | unsigned int val; | ||
498 | if (!nid) | 500 | if (!nid) |
499 | break; | 501 | break; |
500 | switch (spec->automute_mode) { | 502 | switch (spec->automute_mode) { |
501 | case ALC_AUTOMUTE_PIN: | 503 | case ALC_AUTOMUTE_PIN: |
504 | /* don't reset VREF value in case it's controlling | ||
505 | * the amp (see alc861_fixup_asus_amp_vref_0f()) | ||
506 | */ | ||
507 | if (spec->keep_vref_in_automute) { | ||
508 | val = snd_hda_codec_read(codec, nid, 0, | ||
509 | AC_VERB_GET_PIN_WIDGET_CONTROL, 0); | ||
510 | val &= ~PIN_HP; | ||
511 | } else | ||
512 | val = 0; | ||
513 | val |= pin_bits; | ||
502 | snd_hda_codec_write(codec, nid, 0, | 514 | snd_hda_codec_write(codec, nid, 0, |
503 | AC_VERB_SET_PIN_WIDGET_CONTROL, | 515 | AC_VERB_SET_PIN_WIDGET_CONTROL, |
504 | pin_bits); | 516 | val); |
505 | break; | 517 | break; |
506 | case ALC_AUTOMUTE_AMP: | 518 | case ALC_AUTOMUTE_AMP: |
507 | snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0, | 519 | snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0, |
@@ -1843,6 +1855,8 @@ static const char * const alc_slave_vols[] = { | |||
1843 | "Speaker Playback Volume", | 1855 | "Speaker Playback Volume", |
1844 | "Mono Playback Volume", | 1856 | "Mono Playback Volume", |
1845 | "Line-Out Playback Volume", | 1857 | "Line-Out Playback Volume", |
1858 | "CLFE Playback Volume", | ||
1859 | "Bass Speaker Playback Volume", | ||
1846 | "PCM Playback Volume", | 1860 | "PCM Playback Volume", |
1847 | NULL, | 1861 | NULL, |
1848 | }; | 1862 | }; |
@@ -1858,6 +1872,8 @@ static const char * const alc_slave_sws[] = { | |||
1858 | "Mono Playback Switch", | 1872 | "Mono Playback Switch", |
1859 | "IEC958 Playback Switch", | 1873 | "IEC958 Playback Switch", |
1860 | "Line-Out Playback Switch", | 1874 | "Line-Out Playback Switch", |
1875 | "CLFE Playback Switch", | ||
1876 | "Bass Speaker Playback Switch", | ||
1861 | "PCM Playback Switch", | 1877 | "PCM Playback Switch", |
1862 | NULL, | 1878 | NULL, |
1863 | }; | 1879 | }; |
@@ -2306,7 +2322,7 @@ static int alc_build_pcms(struct hda_codec *codec) | |||
2306 | "%s Analog", codec->chip_name); | 2322 | "%s Analog", codec->chip_name); |
2307 | info->name = spec->stream_name_analog; | 2323 | info->name = spec->stream_name_analog; |
2308 | 2324 | ||
2309 | if (spec->multiout.dac_nids > 0) { | 2325 | if (spec->multiout.num_dacs > 0) { |
2310 | p = spec->stream_analog_playback; | 2326 | p = spec->stream_analog_playback; |
2311 | if (!p) | 2327 | if (!p) |
2312 | p = &alc_pcm_analog_playback; | 2328 | p = &alc_pcm_analog_playback; |
@@ -4735,7 +4751,6 @@ enum { | |||
4735 | ALC262_FIXUP_FSC_H270, | 4751 | ALC262_FIXUP_FSC_H270, |
4736 | ALC262_FIXUP_HP_Z200, | 4752 | ALC262_FIXUP_HP_Z200, |
4737 | ALC262_FIXUP_TYAN, | 4753 | ALC262_FIXUP_TYAN, |
4738 | ALC262_FIXUP_TOSHIBA_RX1, | ||
4739 | ALC262_FIXUP_LENOVO_3000, | 4754 | ALC262_FIXUP_LENOVO_3000, |
4740 | ALC262_FIXUP_BENQ, | 4755 | ALC262_FIXUP_BENQ, |
4741 | ALC262_FIXUP_BENQ_T31, | 4756 | ALC262_FIXUP_BENQ_T31, |
@@ -4765,16 +4780,6 @@ static const struct alc_fixup alc262_fixups[] = { | |||
4765 | { } | 4780 | { } |
4766 | } | 4781 | } |
4767 | }, | 4782 | }, |
4768 | [ALC262_FIXUP_TOSHIBA_RX1] = { | ||
4769 | .type = ALC_FIXUP_PINS, | ||
4770 | .v.pins = (const struct alc_pincfg[]) { | ||
4771 | { 0x14, 0x90170110 }, /* speaker */ | ||
4772 | { 0x15, 0x0421101f }, /* HP */ | ||
4773 | { 0x1a, 0x40f000f0 }, /* N/A */ | ||
4774 | { 0x1b, 0x40f000f0 }, /* N/A */ | ||
4775 | { 0x1e, 0x40f000f0 }, /* N/A */ | ||
4776 | } | ||
4777 | }, | ||
4778 | [ALC262_FIXUP_LENOVO_3000] = { | 4783 | [ALC262_FIXUP_LENOVO_3000] = { |
4779 | .type = ALC_FIXUP_VERBS, | 4784 | .type = ALC_FIXUP_VERBS, |
4780 | .v.verbs = (const struct hda_verb[]) { | 4785 | .v.verbs = (const struct hda_verb[]) { |
@@ -4807,8 +4812,6 @@ static const struct snd_pci_quirk alc262_fixup_tbl[] = { | |||
4807 | SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu", ALC262_FIXUP_BENQ), | 4812 | SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu", ALC262_FIXUP_BENQ), |
4808 | SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FIXUP_BENQ), | 4813 | SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FIXUP_BENQ), |
4809 | SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_FIXUP_TYAN), | 4814 | SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_FIXUP_TYAN), |
4810 | SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba dynabook SS RX1", | ||
4811 | ALC262_FIXUP_TOSHIBA_RX1), | ||
4812 | SND_PCI_QUIRK(0x1734, 0x1147, "FSC Celsius H270", ALC262_FIXUP_FSC_H270), | 4815 | SND_PCI_QUIRK(0x1734, 0x1147, "FSC Celsius H270", ALC262_FIXUP_FSC_H270), |
4813 | SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000", ALC262_FIXUP_LENOVO_3000), | 4816 | SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000", ALC262_FIXUP_LENOVO_3000), |
4814 | SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_FIXUP_BENQ), | 4817 | SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_FIXUP_BENQ), |
@@ -5377,7 +5380,6 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | |||
5377 | SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A", | 5380 | SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A", |
5378 | ALC269_FIXUP_AMIC), | 5381 | ALC269_FIXUP_AMIC), |
5379 | SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269_FIXUP_AMIC), | 5382 | SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269_FIXUP_AMIC), |
5380 | SND_PCI_QUIRK(0x1043, 0x1113, "ASUS N63Jn", ALC269_FIXUP_AMIC), | ||
5381 | SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269_FIXUP_AMIC), | 5383 | SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269_FIXUP_AMIC), |
5382 | SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_FIXUP_AMIC), | 5384 | SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_FIXUP_AMIC), |
5383 | SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269_FIXUP_AMIC), | 5385 | SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269_FIXUP_AMIC), |
@@ -5589,6 +5591,25 @@ enum { | |||
5589 | PINFIX_ASUS_A6RP, | 5591 | PINFIX_ASUS_A6RP, |
5590 | }; | 5592 | }; |
5591 | 5593 | ||
5594 | /* On some laptops, VREF of pin 0x0f is abused for controlling the main amp */ | ||
5595 | static void alc861_fixup_asus_amp_vref_0f(struct hda_codec *codec, | ||
5596 | const struct alc_fixup *fix, int action) | ||
5597 | { | ||
5598 | struct alc_spec *spec = codec->spec; | ||
5599 | unsigned int val; | ||
5600 | |||
5601 | if (action != ALC_FIXUP_ACT_INIT) | ||
5602 | return; | ||
5603 | val = snd_hda_codec_read(codec, 0x0f, 0, | ||
5604 | AC_VERB_GET_PIN_WIDGET_CONTROL, 0); | ||
5605 | if (!(val & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN))) | ||
5606 | val |= AC_PINCTL_IN_EN; | ||
5607 | val |= AC_PINCTL_VREF_50; | ||
5608 | snd_hda_codec_write(codec, 0x0f, 0, | ||
5609 | AC_VERB_SET_PIN_WIDGET_CONTROL, val); | ||
5610 | spec->keep_vref_in_automute = 1; | ||
5611 | } | ||
5612 | |||
5592 | static const struct alc_fixup alc861_fixups[] = { | 5613 | static const struct alc_fixup alc861_fixups[] = { |
5593 | [PINFIX_FSC_AMILO_PI1505] = { | 5614 | [PINFIX_FSC_AMILO_PI1505] = { |
5594 | .type = ALC_FIXUP_PINS, | 5615 | .type = ALC_FIXUP_PINS, |
@@ -5599,17 +5620,14 @@ static const struct alc_fixup alc861_fixups[] = { | |||
5599 | } | 5620 | } |
5600 | }, | 5621 | }, |
5601 | [PINFIX_ASUS_A6RP] = { | 5622 | [PINFIX_ASUS_A6RP] = { |
5602 | .type = ALC_FIXUP_VERBS, | 5623 | .type = ALC_FIXUP_FUNC, |
5603 | .v.verbs = (const struct hda_verb[]) { | 5624 | .v.func = alc861_fixup_asus_amp_vref_0f, |
5604 | /* node 0x0f VREF seems controlling the master output */ | ||
5605 | { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50 }, | ||
5606 | { } | ||
5607 | }, | ||
5608 | }, | 5625 | }, |
5609 | }; | 5626 | }; |
5610 | 5627 | ||
5611 | static const struct snd_pci_quirk alc861_fixup_tbl[] = { | 5628 | static const struct snd_pci_quirk alc861_fixup_tbl[] = { |
5612 | SND_PCI_QUIRK(0x1043, 0x1393, "ASUS A6Rp", PINFIX_ASUS_A6RP), | 5629 | SND_PCI_QUIRK_VENDOR(0x1043, "ASUS laptop", PINFIX_ASUS_A6RP), |
5630 | SND_PCI_QUIRK(0x1584, 0x0000, "Uniwill ECS M31EI", PINFIX_ASUS_A6RP), | ||
5613 | SND_PCI_QUIRK(0x1584, 0x2b01, "Haier W18", PINFIX_ASUS_A6RP), | 5631 | SND_PCI_QUIRK(0x1584, 0x2b01, "Haier W18", PINFIX_ASUS_A6RP), |
5614 | SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", PINFIX_FSC_AMILO_PI1505), | 5632 | SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", PINFIX_FSC_AMILO_PI1505), |
5615 | {} | 5633 | {} |
diff --git a/sound/pci/hda/patch_via.c b/sound/pci/hda/patch_via.c index 03e63fed9caf..284e311040fe 100644 --- a/sound/pci/hda/patch_via.c +++ b/sound/pci/hda/patch_via.c | |||
@@ -199,6 +199,9 @@ struct via_spec { | |||
199 | unsigned int no_pin_power_ctl; | 199 | unsigned int no_pin_power_ctl; |
200 | enum VIA_HDA_CODEC codec_type; | 200 | enum VIA_HDA_CODEC codec_type; |
201 | 201 | ||
202 | /* analog low-power control */ | ||
203 | bool alc_mode; | ||
204 | |||
202 | /* smart51 setup */ | 205 | /* smart51 setup */ |
203 | unsigned int smart51_nums; | 206 | unsigned int smart51_nums; |
204 | hda_nid_t smart51_pins[2]; | 207 | hda_nid_t smart51_pins[2]; |
@@ -687,6 +690,15 @@ static void via_auto_init_analog_input(struct hda_codec *codec) | |||
687 | } | 690 | } |
688 | } | 691 | } |
689 | 692 | ||
693 | static void update_power_state(struct hda_codec *codec, hda_nid_t nid, | ||
694 | unsigned int parm) | ||
695 | { | ||
696 | if (snd_hda_codec_read(codec, nid, 0, | ||
697 | AC_VERB_GET_POWER_STATE, 0) == parm) | ||
698 | return; | ||
699 | snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_POWER_STATE, parm); | ||
700 | } | ||
701 | |||
690 | static void set_pin_power_state(struct hda_codec *codec, hda_nid_t nid, | 702 | static void set_pin_power_state(struct hda_codec *codec, hda_nid_t nid, |
691 | unsigned int *affected_parm) | 703 | unsigned int *affected_parm) |
692 | { | 704 | { |
@@ -709,7 +721,7 @@ static void set_pin_power_state(struct hda_codec *codec, hda_nid_t nid, | |||
709 | } else | 721 | } else |
710 | parm = AC_PWRST_D3; | 722 | parm = AC_PWRST_D3; |
711 | 723 | ||
712 | snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_POWER_STATE, parm); | 724 | update_power_state(codec, nid, parm); |
713 | } | 725 | } |
714 | 726 | ||
715 | static int via_pin_power_ctl_info(struct snd_kcontrol *kcontrol, | 727 | static int via_pin_power_ctl_info(struct snd_kcontrol *kcontrol, |
@@ -749,6 +761,7 @@ static int via_pin_power_ctl_put(struct snd_kcontrol *kcontrol, | |||
749 | return 0; | 761 | return 0; |
750 | spec->no_pin_power_ctl = val; | 762 | spec->no_pin_power_ctl = val; |
751 | set_widgets_power_state(codec); | 763 | set_widgets_power_state(codec); |
764 | analog_low_current_mode(codec); | ||
752 | return 1; | 765 | return 1; |
753 | } | 766 | } |
754 | 767 | ||
@@ -1036,13 +1049,19 @@ static bool is_aa_path_mute(struct hda_codec *codec) | |||
1036 | } | 1049 | } |
1037 | 1050 | ||
1038 | /* enter/exit analog low-current mode */ | 1051 | /* enter/exit analog low-current mode */ |
1039 | static void analog_low_current_mode(struct hda_codec *codec) | 1052 | static void __analog_low_current_mode(struct hda_codec *codec, bool force) |
1040 | { | 1053 | { |
1041 | struct via_spec *spec = codec->spec; | 1054 | struct via_spec *spec = codec->spec; |
1042 | bool enable; | 1055 | bool enable; |
1043 | unsigned int verb, parm; | 1056 | unsigned int verb, parm; |
1044 | 1057 | ||
1045 | enable = is_aa_path_mute(codec) && (spec->opened_streams != 0); | 1058 | if (spec->no_pin_power_ctl) |
1059 | enable = false; | ||
1060 | else | ||
1061 | enable = is_aa_path_mute(codec) && !spec->opened_streams; | ||
1062 | if (enable == spec->alc_mode && !force) | ||
1063 | return; | ||
1064 | spec->alc_mode = enable; | ||
1046 | 1065 | ||
1047 | /* decide low current mode's verb & parameter */ | 1066 | /* decide low current mode's verb & parameter */ |
1048 | switch (spec->codec_type) { | 1067 | switch (spec->codec_type) { |
@@ -1074,6 +1093,11 @@ static void analog_low_current_mode(struct hda_codec *codec) | |||
1074 | snd_hda_codec_write(codec, codec->afg, 0, verb, parm); | 1093 | snd_hda_codec_write(codec, codec->afg, 0, verb, parm); |
1075 | } | 1094 | } |
1076 | 1095 | ||
1096 | static void analog_low_current_mode(struct hda_codec *codec) | ||
1097 | { | ||
1098 | return __analog_low_current_mode(codec, false); | ||
1099 | } | ||
1100 | |||
1077 | /* | 1101 | /* |
1078 | * generic initialization of ADC, input mixers and output mixers | 1102 | * generic initialization of ADC, input mixers and output mixers |
1079 | */ | 1103 | */ |
@@ -1446,6 +1470,7 @@ static int via_build_controls(struct hda_codec *codec) | |||
1446 | struct snd_kcontrol *kctl; | 1470 | struct snd_kcontrol *kctl; |
1447 | int err, i; | 1471 | int err, i; |
1448 | 1472 | ||
1473 | spec->no_pin_power_ctl = 1; | ||
1449 | if (spec->set_widgets_power_state) | 1474 | if (spec->set_widgets_power_state) |
1450 | if (!via_clone_control(spec, &via_pin_power_ctl_enum)) | 1475 | if (!via_clone_control(spec, &via_pin_power_ctl_enum)) |
1451 | return -ENOMEM; | 1476 | return -ENOMEM; |
@@ -1499,10 +1524,6 @@ static int via_build_controls(struct hda_codec *codec) | |||
1499 | return err; | 1524 | return err; |
1500 | } | 1525 | } |
1501 | 1526 | ||
1502 | /* init power states */ | ||
1503 | set_widgets_power_state(codec); | ||
1504 | analog_low_current_mode(codec); | ||
1505 | |||
1506 | via_free_kctls(codec); /* no longer needed */ | 1527 | via_free_kctls(codec); /* no longer needed */ |
1507 | 1528 | ||
1508 | err = snd_hda_jack_add_kctls(codec, &spec->autocfg); | 1529 | err = snd_hda_jack_add_kctls(codec, &spec->autocfg); |
@@ -2295,10 +2316,7 @@ static int via_mux_enum_put(struct snd_kcontrol *kcontrol, | |||
2295 | 2316 | ||
2296 | if (mux) { | 2317 | if (mux) { |
2297 | /* switch to D0 beofre change index */ | 2318 | /* switch to D0 beofre change index */ |
2298 | if (snd_hda_codec_read(codec, mux, 0, | 2319 | update_power_state(codec, mux, AC_PWRST_D0); |
2299 | AC_VERB_GET_POWER_STATE, 0x00) != AC_PWRST_D0) | ||
2300 | snd_hda_codec_write(codec, mux, 0, | ||
2301 | AC_VERB_SET_POWER_STATE, AC_PWRST_D0); | ||
2302 | snd_hda_codec_write(codec, mux, 0, | 2320 | snd_hda_codec_write(codec, mux, 0, |
2303 | AC_VERB_SET_CONNECT_SEL, | 2321 | AC_VERB_SET_CONNECT_SEL, |
2304 | spec->inputs[cur].mux_idx); | 2322 | spec->inputs[cur].mux_idx); |
@@ -2776,6 +2794,10 @@ static int via_init(struct hda_codec *codec) | |||
2776 | for (i = 0; i < spec->num_iverbs; i++) | 2794 | for (i = 0; i < spec->num_iverbs; i++) |
2777 | snd_hda_sequence_write(codec, spec->init_verbs[i]); | 2795 | snd_hda_sequence_write(codec, spec->init_verbs[i]); |
2778 | 2796 | ||
2797 | /* init power states */ | ||
2798 | set_widgets_power_state(codec); | ||
2799 | __analog_low_current_mode(codec, true); | ||
2800 | |||
2779 | via_auto_init_multi_out(codec); | 2801 | via_auto_init_multi_out(codec); |
2780 | via_auto_init_hp_out(codec); | 2802 | via_auto_init_hp_out(codec); |
2781 | via_auto_init_speaker_out(codec); | 2803 | via_auto_init_speaker_out(codec); |
@@ -2922,9 +2944,9 @@ static void set_widgets_power_state_vt1708B(struct hda_codec *codec) | |||
2922 | if (imux_is_smixer) | 2944 | if (imux_is_smixer) |
2923 | parm = AC_PWRST_D0; | 2945 | parm = AC_PWRST_D0; |
2924 | /* SW0 (17h), AIW 0/1 (13h/14h) */ | 2946 | /* SW0 (17h), AIW 0/1 (13h/14h) */ |
2925 | snd_hda_codec_write(codec, 0x17, 0, AC_VERB_SET_POWER_STATE, parm); | 2947 | update_power_state(codec, 0x17, parm); |
2926 | snd_hda_codec_write(codec, 0x13, 0, AC_VERB_SET_POWER_STATE, parm); | 2948 | update_power_state(codec, 0x13, parm); |
2927 | snd_hda_codec_write(codec, 0x14, 0, AC_VERB_SET_POWER_STATE, parm); | 2949 | update_power_state(codec, 0x14, parm); |
2928 | 2950 | ||
2929 | /* outputs */ | 2951 | /* outputs */ |
2930 | /* PW0 (19h), SW1 (18h), AOW1 (11h) */ | 2952 | /* PW0 (19h), SW1 (18h), AOW1 (11h) */ |
@@ -2932,8 +2954,8 @@ static void set_widgets_power_state_vt1708B(struct hda_codec *codec) | |||
2932 | set_pin_power_state(codec, 0x19, &parm); | 2954 | set_pin_power_state(codec, 0x19, &parm); |
2933 | if (spec->smart51_enabled) | 2955 | if (spec->smart51_enabled) |
2934 | set_pin_power_state(codec, 0x1b, &parm); | 2956 | set_pin_power_state(codec, 0x1b, &parm); |
2935 | snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_POWER_STATE, parm); | 2957 | update_power_state(codec, 0x18, parm); |
2936 | snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_POWER_STATE, parm); | 2958 | update_power_state(codec, 0x11, parm); |
2937 | 2959 | ||
2938 | /* PW6 (22h), SW2 (26h), AOW2 (24h) */ | 2960 | /* PW6 (22h), SW2 (26h), AOW2 (24h) */ |
2939 | if (is_8ch) { | 2961 | if (is_8ch) { |
@@ -2941,20 +2963,16 @@ static void set_widgets_power_state_vt1708B(struct hda_codec *codec) | |||
2941 | set_pin_power_state(codec, 0x22, &parm); | 2963 | set_pin_power_state(codec, 0x22, &parm); |
2942 | if (spec->smart51_enabled) | 2964 | if (spec->smart51_enabled) |
2943 | set_pin_power_state(codec, 0x1a, &parm); | 2965 | set_pin_power_state(codec, 0x1a, &parm); |
2944 | snd_hda_codec_write(codec, 0x26, 0, | 2966 | update_power_state(codec, 0x26, parm); |
2945 | AC_VERB_SET_POWER_STATE, parm); | 2967 | update_power_state(codec, 0x24, parm); |
2946 | snd_hda_codec_write(codec, 0x24, 0, | ||
2947 | AC_VERB_SET_POWER_STATE, parm); | ||
2948 | } else if (codec->vendor_id == 0x11064397) { | 2968 | } else if (codec->vendor_id == 0x11064397) { |
2949 | /* PW7(23h), SW2(27h), AOW2(25h) */ | 2969 | /* PW7(23h), SW2(27h), AOW2(25h) */ |
2950 | parm = AC_PWRST_D3; | 2970 | parm = AC_PWRST_D3; |
2951 | set_pin_power_state(codec, 0x23, &parm); | 2971 | set_pin_power_state(codec, 0x23, &parm); |
2952 | if (spec->smart51_enabled) | 2972 | if (spec->smart51_enabled) |
2953 | set_pin_power_state(codec, 0x1a, &parm); | 2973 | set_pin_power_state(codec, 0x1a, &parm); |
2954 | snd_hda_codec_write(codec, 0x27, 0, | 2974 | update_power_state(codec, 0x27, parm); |
2955 | AC_VERB_SET_POWER_STATE, parm); | 2975 | update_power_state(codec, 0x25, parm); |
2956 | snd_hda_codec_write(codec, 0x25, 0, | ||
2957 | AC_VERB_SET_POWER_STATE, parm); | ||
2958 | } | 2976 | } |
2959 | 2977 | ||
2960 | /* PW 3/4/7 (1ch/1dh/23h) */ | 2978 | /* PW 3/4/7 (1ch/1dh/23h) */ |
@@ -2966,17 +2984,13 @@ static void set_widgets_power_state_vt1708B(struct hda_codec *codec) | |||
2966 | set_pin_power_state(codec, 0x23, &parm); | 2984 | set_pin_power_state(codec, 0x23, &parm); |
2967 | 2985 | ||
2968 | /* MW0 (16h), Sw3 (27h), AOW 0/3 (10h/25h) */ | 2986 | /* MW0 (16h), Sw3 (27h), AOW 0/3 (10h/25h) */ |
2969 | snd_hda_codec_write(codec, 0x16, 0, AC_VERB_SET_POWER_STATE, | 2987 | update_power_state(codec, 0x16, imux_is_smixer ? AC_PWRST_D0 : parm); |
2970 | imux_is_smixer ? AC_PWRST_D0 : parm); | 2988 | update_power_state(codec, 0x10, parm); |
2971 | snd_hda_codec_write(codec, 0x10, 0, AC_VERB_SET_POWER_STATE, parm); | ||
2972 | if (is_8ch) { | 2989 | if (is_8ch) { |
2973 | snd_hda_codec_write(codec, 0x25, 0, | 2990 | update_power_state(codec, 0x25, parm); |
2974 | AC_VERB_SET_POWER_STATE, parm); | 2991 | update_power_state(codec, 0x27, parm); |
2975 | snd_hda_codec_write(codec, 0x27, 0, | ||
2976 | AC_VERB_SET_POWER_STATE, parm); | ||
2977 | } else if (codec->vendor_id == 0x11064397 && spec->hp_independent_mode) | 2992 | } else if (codec->vendor_id == 0x11064397 && spec->hp_independent_mode) |
2978 | snd_hda_codec_write(codec, 0x25, 0, | 2993 | update_power_state(codec, 0x25, parm); |
2979 | AC_VERB_SET_POWER_STATE, parm); | ||
2980 | } | 2994 | } |
2981 | 2995 | ||
2982 | static int patch_vt1708S(struct hda_codec *codec); | 2996 | static int patch_vt1708S(struct hda_codec *codec); |
@@ -3149,10 +3163,10 @@ static void set_widgets_power_state_vt1702(struct hda_codec *codec) | |||
3149 | if (imux_is_smixer) | 3163 | if (imux_is_smixer) |
3150 | parm = AC_PWRST_D0; /* SW0 (13h) = stereo mixer (idx 3) */ | 3164 | parm = AC_PWRST_D0; /* SW0 (13h) = stereo mixer (idx 3) */ |
3151 | /* SW0 (13h), AIW 0/1/2 (12h/1fh/20h) */ | 3165 | /* SW0 (13h), AIW 0/1/2 (12h/1fh/20h) */ |
3152 | snd_hda_codec_write(codec, 0x13, 0, AC_VERB_SET_POWER_STATE, parm); | 3166 | update_power_state(codec, 0x13, parm); |
3153 | snd_hda_codec_write(codec, 0x12, 0, AC_VERB_SET_POWER_STATE, parm); | 3167 | update_power_state(codec, 0x12, parm); |
3154 | snd_hda_codec_write(codec, 0x1f, 0, AC_VERB_SET_POWER_STATE, parm); | 3168 | update_power_state(codec, 0x1f, parm); |
3155 | snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_POWER_STATE, parm); | 3169 | update_power_state(codec, 0x20, parm); |
3156 | 3170 | ||
3157 | /* outputs */ | 3171 | /* outputs */ |
3158 | /* PW 3/4 (16h/17h) */ | 3172 | /* PW 3/4 (16h/17h) */ |
@@ -3160,10 +3174,9 @@ static void set_widgets_power_state_vt1702(struct hda_codec *codec) | |||
3160 | set_pin_power_state(codec, 0x17, &parm); | 3174 | set_pin_power_state(codec, 0x17, &parm); |
3161 | set_pin_power_state(codec, 0x16, &parm); | 3175 | set_pin_power_state(codec, 0x16, &parm); |
3162 | /* MW0 (1ah), AOW 0/1 (10h/1dh) */ | 3176 | /* MW0 (1ah), AOW 0/1 (10h/1dh) */ |
3163 | snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_POWER_STATE, | 3177 | update_power_state(codec, 0x1a, imux_is_smixer ? AC_PWRST_D0 : parm); |
3164 | imux_is_smixer ? AC_PWRST_D0 : parm); | 3178 | update_power_state(codec, 0x10, parm); |
3165 | snd_hda_codec_write(codec, 0x10, 0, AC_VERB_SET_POWER_STATE, parm); | 3179 | update_power_state(codec, 0x1d, parm); |
3166 | snd_hda_codec_write(codec, 0x1d, 0, AC_VERB_SET_POWER_STATE, parm); | ||
3167 | } | 3180 | } |
3168 | 3181 | ||
3169 | static int patch_vt1702(struct hda_codec *codec) | 3182 | static int patch_vt1702(struct hda_codec *codec) |
@@ -3228,52 +3241,48 @@ static void set_widgets_power_state_vt1718S(struct hda_codec *codec) | |||
3228 | if (imux_is_smixer) | 3241 | if (imux_is_smixer) |
3229 | parm = AC_PWRST_D0; | 3242 | parm = AC_PWRST_D0; |
3230 | /* MUX6/7 (1eh/1fh), AIW 0/1 (10h/11h) */ | 3243 | /* MUX6/7 (1eh/1fh), AIW 0/1 (10h/11h) */ |
3231 | snd_hda_codec_write(codec, 0x1e, 0, AC_VERB_SET_POWER_STATE, parm); | 3244 | update_power_state(codec, 0x1e, parm); |
3232 | snd_hda_codec_write(codec, 0x1f, 0, AC_VERB_SET_POWER_STATE, parm); | 3245 | update_power_state(codec, 0x1f, parm); |
3233 | snd_hda_codec_write(codec, 0x10, 0, AC_VERB_SET_POWER_STATE, parm); | 3246 | update_power_state(codec, 0x10, parm); |
3234 | snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_POWER_STATE, parm); | 3247 | update_power_state(codec, 0x11, parm); |
3235 | 3248 | ||
3236 | /* outputs */ | 3249 | /* outputs */ |
3237 | /* PW3 (27h), MW2 (1ah), AOW3 (bh) */ | 3250 | /* PW3 (27h), MW2 (1ah), AOW3 (bh) */ |
3238 | parm = AC_PWRST_D3; | 3251 | parm = AC_PWRST_D3; |
3239 | set_pin_power_state(codec, 0x27, &parm); | 3252 | set_pin_power_state(codec, 0x27, &parm); |
3240 | snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_POWER_STATE, parm); | 3253 | update_power_state(codec, 0x1a, parm); |
3241 | snd_hda_codec_write(codec, 0xb, 0, AC_VERB_SET_POWER_STATE, parm); | 3254 | update_power_state(codec, 0xb, parm); |
3242 | 3255 | ||
3243 | /* PW2 (26h), AOW2 (ah) */ | 3256 | /* PW2 (26h), AOW2 (ah) */ |
3244 | parm = AC_PWRST_D3; | 3257 | parm = AC_PWRST_D3; |
3245 | set_pin_power_state(codec, 0x26, &parm); | 3258 | set_pin_power_state(codec, 0x26, &parm); |
3246 | if (spec->smart51_enabled) | 3259 | if (spec->smart51_enabled) |
3247 | set_pin_power_state(codec, 0x2b, &parm); | 3260 | set_pin_power_state(codec, 0x2b, &parm); |
3248 | snd_hda_codec_write(codec, 0xa, 0, AC_VERB_SET_POWER_STATE, parm); | 3261 | update_power_state(codec, 0xa, parm); |
3249 | 3262 | ||
3250 | /* PW0 (24h), AOW0 (8h) */ | 3263 | /* PW0 (24h), AOW0 (8h) */ |
3251 | parm = AC_PWRST_D3; | 3264 | parm = AC_PWRST_D3; |
3252 | set_pin_power_state(codec, 0x24, &parm); | 3265 | set_pin_power_state(codec, 0x24, &parm); |
3253 | if (!spec->hp_independent_mode) /* check for redirected HP */ | 3266 | if (!spec->hp_independent_mode) /* check for redirected HP */ |
3254 | set_pin_power_state(codec, 0x28, &parm); | 3267 | set_pin_power_state(codec, 0x28, &parm); |
3255 | snd_hda_codec_write(codec, 0x8, 0, AC_VERB_SET_POWER_STATE, parm); | 3268 | update_power_state(codec, 0x8, parm); |
3256 | /* MW9 (21h), Mw2 (1ah), AOW0 (8h) */ | 3269 | /* MW9 (21h), Mw2 (1ah), AOW0 (8h) */ |
3257 | snd_hda_codec_write(codec, 0x21, 0, AC_VERB_SET_POWER_STATE, | 3270 | update_power_state(codec, 0x21, imux_is_smixer ? AC_PWRST_D0 : parm); |
3258 | imux_is_smixer ? AC_PWRST_D0 : parm); | ||
3259 | 3271 | ||
3260 | /* PW1 (25h), AOW1 (9h) */ | 3272 | /* PW1 (25h), AOW1 (9h) */ |
3261 | parm = AC_PWRST_D3; | 3273 | parm = AC_PWRST_D3; |
3262 | set_pin_power_state(codec, 0x25, &parm); | 3274 | set_pin_power_state(codec, 0x25, &parm); |
3263 | if (spec->smart51_enabled) | 3275 | if (spec->smart51_enabled) |
3264 | set_pin_power_state(codec, 0x2a, &parm); | 3276 | set_pin_power_state(codec, 0x2a, &parm); |
3265 | snd_hda_codec_write(codec, 0x9, 0, AC_VERB_SET_POWER_STATE, parm); | 3277 | update_power_state(codec, 0x9, parm); |
3266 | 3278 | ||
3267 | if (spec->hp_independent_mode) { | 3279 | if (spec->hp_independent_mode) { |
3268 | /* PW4 (28h), MW3 (1bh), MUX1(34h), AOW4 (ch) */ | 3280 | /* PW4 (28h), MW3 (1bh), MUX1(34h), AOW4 (ch) */ |
3269 | parm = AC_PWRST_D3; | 3281 | parm = AC_PWRST_D3; |
3270 | set_pin_power_state(codec, 0x28, &parm); | 3282 | set_pin_power_state(codec, 0x28, &parm); |
3271 | snd_hda_codec_write(codec, 0x1b, 0, | 3283 | update_power_state(codec, 0x1b, parm); |
3272 | AC_VERB_SET_POWER_STATE, parm); | 3284 | update_power_state(codec, 0x34, parm); |
3273 | snd_hda_codec_write(codec, 0x34, 0, | 3285 | update_power_state(codec, 0xc, parm); |
3274 | AC_VERB_SET_POWER_STATE, parm); | ||
3275 | snd_hda_codec_write(codec, 0xc, 0, | ||
3276 | AC_VERB_SET_POWER_STATE, parm); | ||
3277 | } | 3286 | } |
3278 | } | 3287 | } |
3279 | 3288 | ||
@@ -3433,8 +3442,8 @@ static void set_widgets_power_state_vt1716S(struct hda_codec *codec) | |||
3433 | if (imux_is_smixer) | 3442 | if (imux_is_smixer) |
3434 | parm = AC_PWRST_D0; | 3443 | parm = AC_PWRST_D0; |
3435 | /* SW0 (17h), AIW0(13h) */ | 3444 | /* SW0 (17h), AIW0(13h) */ |
3436 | snd_hda_codec_write(codec, 0x17, 0, AC_VERB_SET_POWER_STATE, parm); | 3445 | update_power_state(codec, 0x17, parm); |
3437 | snd_hda_codec_write(codec, 0x13, 0, AC_VERB_SET_POWER_STATE, parm); | 3446 | update_power_state(codec, 0x13, parm); |
3438 | 3447 | ||
3439 | parm = AC_PWRST_D3; | 3448 | parm = AC_PWRST_D3; |
3440 | set_pin_power_state(codec, 0x1e, &parm); | 3449 | set_pin_power_state(codec, 0x1e, &parm); |
@@ -3442,12 +3451,11 @@ static void set_widgets_power_state_vt1716S(struct hda_codec *codec) | |||
3442 | if (spec->dmic_enabled) | 3451 | if (spec->dmic_enabled) |
3443 | set_pin_power_state(codec, 0x22, &parm); | 3452 | set_pin_power_state(codec, 0x22, &parm); |
3444 | else | 3453 | else |
3445 | snd_hda_codec_write(codec, 0x22, 0, | 3454 | update_power_state(codec, 0x22, AC_PWRST_D3); |
3446 | AC_VERB_SET_POWER_STATE, AC_PWRST_D3); | ||
3447 | 3455 | ||
3448 | /* SW2(26h), AIW1(14h) */ | 3456 | /* SW2(26h), AIW1(14h) */ |
3449 | snd_hda_codec_write(codec, 0x26, 0, AC_VERB_SET_POWER_STATE, parm); | 3457 | update_power_state(codec, 0x26, parm); |
3450 | snd_hda_codec_write(codec, 0x14, 0, AC_VERB_SET_POWER_STATE, parm); | 3458 | update_power_state(codec, 0x14, parm); |
3451 | 3459 | ||
3452 | /* outputs */ | 3460 | /* outputs */ |
3453 | /* PW0 (19h), SW1 (18h), AOW1 (11h) */ | 3461 | /* PW0 (19h), SW1 (18h), AOW1 (11h) */ |
@@ -3456,8 +3464,8 @@ static void set_widgets_power_state_vt1716S(struct hda_codec *codec) | |||
3456 | /* Smart 5.1 PW2(1bh) */ | 3464 | /* Smart 5.1 PW2(1bh) */ |
3457 | if (spec->smart51_enabled) | 3465 | if (spec->smart51_enabled) |
3458 | set_pin_power_state(codec, 0x1b, &parm); | 3466 | set_pin_power_state(codec, 0x1b, &parm); |
3459 | snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_POWER_STATE, parm); | 3467 | update_power_state(codec, 0x18, parm); |
3460 | snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_POWER_STATE, parm); | 3468 | update_power_state(codec, 0x11, parm); |
3461 | 3469 | ||
3462 | /* PW7 (23h), SW3 (27h), AOW3 (25h) */ | 3470 | /* PW7 (23h), SW3 (27h), AOW3 (25h) */ |
3463 | parm = AC_PWRST_D3; | 3471 | parm = AC_PWRST_D3; |
@@ -3465,12 +3473,12 @@ static void set_widgets_power_state_vt1716S(struct hda_codec *codec) | |||
3465 | /* Smart 5.1 PW1(1ah) */ | 3473 | /* Smart 5.1 PW1(1ah) */ |
3466 | if (spec->smart51_enabled) | 3474 | if (spec->smart51_enabled) |
3467 | set_pin_power_state(codec, 0x1a, &parm); | 3475 | set_pin_power_state(codec, 0x1a, &parm); |
3468 | snd_hda_codec_write(codec, 0x27, 0, AC_VERB_SET_POWER_STATE, parm); | 3476 | update_power_state(codec, 0x27, parm); |
3469 | 3477 | ||
3470 | /* Smart 5.1 PW5(1eh) */ | 3478 | /* Smart 5.1 PW5(1eh) */ |
3471 | if (spec->smart51_enabled) | 3479 | if (spec->smart51_enabled) |
3472 | set_pin_power_state(codec, 0x1e, &parm); | 3480 | set_pin_power_state(codec, 0x1e, &parm); |
3473 | snd_hda_codec_write(codec, 0x25, 0, AC_VERB_SET_POWER_STATE, parm); | 3481 | update_power_state(codec, 0x25, parm); |
3474 | 3482 | ||
3475 | /* Mono out */ | 3483 | /* Mono out */ |
3476 | /* SW4(28h)->MW1(29h)-> PW12 (2ah)*/ | 3484 | /* SW4(28h)->MW1(29h)-> PW12 (2ah)*/ |
@@ -3486,9 +3494,9 @@ static void set_widgets_power_state_vt1716S(struct hda_codec *codec) | |||
3486 | mono_out = 1; | 3494 | mono_out = 1; |
3487 | } | 3495 | } |
3488 | parm = mono_out ? AC_PWRST_D0 : AC_PWRST_D3; | 3496 | parm = mono_out ? AC_PWRST_D0 : AC_PWRST_D3; |
3489 | snd_hda_codec_write(codec, 0x28, 0, AC_VERB_SET_POWER_STATE, parm); | 3497 | update_power_state(codec, 0x28, parm); |
3490 | snd_hda_codec_write(codec, 0x29, 0, AC_VERB_SET_POWER_STATE, parm); | 3498 | update_power_state(codec, 0x29, parm); |
3491 | snd_hda_codec_write(codec, 0x2a, 0, AC_VERB_SET_POWER_STATE, parm); | 3499 | update_power_state(codec, 0x2a, parm); |
3492 | 3500 | ||
3493 | /* PW 3/4 (1ch/1dh) */ | 3501 | /* PW 3/4 (1ch/1dh) */ |
3494 | parm = AC_PWRST_D3; | 3502 | parm = AC_PWRST_D3; |
@@ -3496,15 +3504,12 @@ static void set_widgets_power_state_vt1716S(struct hda_codec *codec) | |||
3496 | set_pin_power_state(codec, 0x1d, &parm); | 3504 | set_pin_power_state(codec, 0x1d, &parm); |
3497 | /* HP Independent Mode, power on AOW3 */ | 3505 | /* HP Independent Mode, power on AOW3 */ |
3498 | if (spec->hp_independent_mode) | 3506 | if (spec->hp_independent_mode) |
3499 | snd_hda_codec_write(codec, 0x25, 0, | 3507 | update_power_state(codec, 0x25, parm); |
3500 | AC_VERB_SET_POWER_STATE, parm); | ||
3501 | 3508 | ||
3502 | /* force to D0 for internal Speaker */ | 3509 | /* force to D0 for internal Speaker */ |
3503 | /* MW0 (16h), AOW0 (10h) */ | 3510 | /* MW0 (16h), AOW0 (10h) */ |
3504 | snd_hda_codec_write(codec, 0x16, 0, AC_VERB_SET_POWER_STATE, | 3511 | update_power_state(codec, 0x16, imux_is_smixer ? AC_PWRST_D0 : parm); |
3505 | imux_is_smixer ? AC_PWRST_D0 : parm); | 3512 | update_power_state(codec, 0x10, mono_out ? AC_PWRST_D0 : parm); |
3506 | snd_hda_codec_write(codec, 0x10, 0, AC_VERB_SET_POWER_STATE, | ||
3507 | mono_out ? AC_PWRST_D0 : parm); | ||
3508 | } | 3513 | } |
3509 | 3514 | ||
3510 | static int patch_vt1716S(struct hda_codec *codec) | 3515 | static int patch_vt1716S(struct hda_codec *codec) |
@@ -3580,54 +3585,45 @@ static void set_widgets_power_state_vt2002P(struct hda_codec *codec) | |||
3580 | set_pin_power_state(codec, 0x2b, &parm); | 3585 | set_pin_power_state(codec, 0x2b, &parm); |
3581 | parm = AC_PWRST_D0; | 3586 | parm = AC_PWRST_D0; |
3582 | /* MUX9/10 (1eh/1fh), AIW 0/1 (10h/11h) */ | 3587 | /* MUX9/10 (1eh/1fh), AIW 0/1 (10h/11h) */ |
3583 | snd_hda_codec_write(codec, 0x1e, 0, AC_VERB_SET_POWER_STATE, parm); | 3588 | update_power_state(codec, 0x1e, parm); |
3584 | snd_hda_codec_write(codec, 0x1f, 0, AC_VERB_SET_POWER_STATE, parm); | 3589 | update_power_state(codec, 0x1f, parm); |
3585 | snd_hda_codec_write(codec, 0x10, 0, AC_VERB_SET_POWER_STATE, parm); | 3590 | update_power_state(codec, 0x10, parm); |
3586 | snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_POWER_STATE, parm); | 3591 | update_power_state(codec, 0x11, parm); |
3587 | 3592 | ||
3588 | /* outputs */ | 3593 | /* outputs */ |
3589 | /* AOW0 (8h)*/ | 3594 | /* AOW0 (8h)*/ |
3590 | snd_hda_codec_write(codec, 0x8, 0, AC_VERB_SET_POWER_STATE, parm); | 3595 | update_power_state(codec, 0x8, parm); |
3591 | 3596 | ||
3592 | if (spec->codec_type == VT1802) { | 3597 | if (spec->codec_type == VT1802) { |
3593 | /* PW4 (28h), MW4 (18h), MUX4(38h) */ | 3598 | /* PW4 (28h), MW4 (18h), MUX4(38h) */ |
3594 | parm = AC_PWRST_D3; | 3599 | parm = AC_PWRST_D3; |
3595 | set_pin_power_state(codec, 0x28, &parm); | 3600 | set_pin_power_state(codec, 0x28, &parm); |
3596 | snd_hda_codec_write(codec, 0x18, 0, | 3601 | update_power_state(codec, 0x18, parm); |
3597 | AC_VERB_SET_POWER_STATE, parm); | 3602 | update_power_state(codec, 0x38, parm); |
3598 | snd_hda_codec_write(codec, 0x38, 0, | ||
3599 | AC_VERB_SET_POWER_STATE, parm); | ||
3600 | } else { | 3603 | } else { |
3601 | /* PW4 (26h), MW4 (1ch), MUX4(37h) */ | 3604 | /* PW4 (26h), MW4 (1ch), MUX4(37h) */ |
3602 | parm = AC_PWRST_D3; | 3605 | parm = AC_PWRST_D3; |
3603 | set_pin_power_state(codec, 0x26, &parm); | 3606 | set_pin_power_state(codec, 0x26, &parm); |
3604 | snd_hda_codec_write(codec, 0x1c, 0, | 3607 | update_power_state(codec, 0x1c, parm); |
3605 | AC_VERB_SET_POWER_STATE, parm); | 3608 | update_power_state(codec, 0x37, parm); |
3606 | snd_hda_codec_write(codec, 0x37, 0, | ||
3607 | AC_VERB_SET_POWER_STATE, parm); | ||
3608 | } | 3609 | } |
3609 | 3610 | ||
3610 | if (spec->codec_type == VT1802) { | 3611 | if (spec->codec_type == VT1802) { |
3611 | /* PW1 (25h), MW1 (15h), MUX1(35h), AOW1 (9h) */ | 3612 | /* PW1 (25h), MW1 (15h), MUX1(35h), AOW1 (9h) */ |
3612 | parm = AC_PWRST_D3; | 3613 | parm = AC_PWRST_D3; |
3613 | set_pin_power_state(codec, 0x25, &parm); | 3614 | set_pin_power_state(codec, 0x25, &parm); |
3614 | snd_hda_codec_write(codec, 0x15, 0, | 3615 | update_power_state(codec, 0x15, parm); |
3615 | AC_VERB_SET_POWER_STATE, parm); | 3616 | update_power_state(codec, 0x35, parm); |
3616 | snd_hda_codec_write(codec, 0x35, 0, | ||
3617 | AC_VERB_SET_POWER_STATE, parm); | ||
3618 | } else { | 3617 | } else { |
3619 | /* PW1 (25h), MW1 (19h), MUX1(35h), AOW1 (9h) */ | 3618 | /* PW1 (25h), MW1 (19h), MUX1(35h), AOW1 (9h) */ |
3620 | parm = AC_PWRST_D3; | 3619 | parm = AC_PWRST_D3; |
3621 | set_pin_power_state(codec, 0x25, &parm); | 3620 | set_pin_power_state(codec, 0x25, &parm); |
3622 | snd_hda_codec_write(codec, 0x19, 0, | 3621 | update_power_state(codec, 0x19, parm); |
3623 | AC_VERB_SET_POWER_STATE, parm); | 3622 | update_power_state(codec, 0x35, parm); |
3624 | snd_hda_codec_write(codec, 0x35, 0, | ||
3625 | AC_VERB_SET_POWER_STATE, parm); | ||
3626 | } | 3623 | } |
3627 | 3624 | ||
3628 | if (spec->hp_independent_mode) | 3625 | if (spec->hp_independent_mode) |
3629 | snd_hda_codec_write(codec, 0x9, 0, | 3626 | update_power_state(codec, 0x9, AC_PWRST_D0); |
3630 | AC_VERB_SET_POWER_STATE, AC_PWRST_D0); | ||
3631 | 3627 | ||
3632 | /* Class-D */ | 3628 | /* Class-D */ |
3633 | /* PW0 (24h), MW0(18h/14h), MUX0(34h) */ | 3629 | /* PW0 (24h), MW0(18h/14h), MUX0(34h) */ |
@@ -3637,12 +3633,10 @@ static void set_widgets_power_state_vt2002P(struct hda_codec *codec) | |||
3637 | set_pin_power_state(codec, 0x24, &parm); | 3633 | set_pin_power_state(codec, 0x24, &parm); |
3638 | parm = present ? AC_PWRST_D3 : AC_PWRST_D0; | 3634 | parm = present ? AC_PWRST_D3 : AC_PWRST_D0; |
3639 | if (spec->codec_type == VT1802) | 3635 | if (spec->codec_type == VT1802) |
3640 | snd_hda_codec_write(codec, 0x14, 0, | 3636 | update_power_state(codec, 0x14, parm); |
3641 | AC_VERB_SET_POWER_STATE, parm); | ||
3642 | else | 3637 | else |
3643 | snd_hda_codec_write(codec, 0x18, 0, | 3638 | update_power_state(codec, 0x18, parm); |
3644 | AC_VERB_SET_POWER_STATE, parm); | 3639 | update_power_state(codec, 0x34, parm); |
3645 | snd_hda_codec_write(codec, 0x34, 0, AC_VERB_SET_POWER_STATE, parm); | ||
3646 | 3640 | ||
3647 | /* Mono Out */ | 3641 | /* Mono Out */ |
3648 | present = snd_hda_jack_detect(codec, 0x26); | 3642 | present = snd_hda_jack_detect(codec, 0x26); |
@@ -3650,28 +3644,20 @@ static void set_widgets_power_state_vt2002P(struct hda_codec *codec) | |||
3650 | parm = present ? AC_PWRST_D3 : AC_PWRST_D0; | 3644 | parm = present ? AC_PWRST_D3 : AC_PWRST_D0; |
3651 | if (spec->codec_type == VT1802) { | 3645 | if (spec->codec_type == VT1802) { |
3652 | /* PW15 (33h), MW8(1ch), MUX8(3ch) */ | 3646 | /* PW15 (33h), MW8(1ch), MUX8(3ch) */ |
3653 | snd_hda_codec_write(codec, 0x33, 0, | 3647 | update_power_state(codec, 0x33, parm); |
3654 | AC_VERB_SET_POWER_STATE, parm); | 3648 | update_power_state(codec, 0x1c, parm); |
3655 | snd_hda_codec_write(codec, 0x1c, 0, | 3649 | update_power_state(codec, 0x3c, parm); |
3656 | AC_VERB_SET_POWER_STATE, parm); | ||
3657 | snd_hda_codec_write(codec, 0x3c, 0, | ||
3658 | AC_VERB_SET_POWER_STATE, parm); | ||
3659 | } else { | 3650 | } else { |
3660 | /* PW15 (31h), MW8(17h), MUX8(3bh) */ | 3651 | /* PW15 (31h), MW8(17h), MUX8(3bh) */ |
3661 | snd_hda_codec_write(codec, 0x31, 0, | 3652 | update_power_state(codec, 0x31, parm); |
3662 | AC_VERB_SET_POWER_STATE, parm); | 3653 | update_power_state(codec, 0x17, parm); |
3663 | snd_hda_codec_write(codec, 0x17, 0, | 3654 | update_power_state(codec, 0x3b, parm); |
3664 | AC_VERB_SET_POWER_STATE, parm); | ||
3665 | snd_hda_codec_write(codec, 0x3b, 0, | ||
3666 | AC_VERB_SET_POWER_STATE, parm); | ||
3667 | } | 3655 | } |
3668 | /* MW9 (21h) */ | 3656 | /* MW9 (21h) */ |
3669 | if (imux_is_smixer || !is_aa_path_mute(codec)) | 3657 | if (imux_is_smixer || !is_aa_path_mute(codec)) |
3670 | snd_hda_codec_write(codec, 0x21, 0, | 3658 | update_power_state(codec, 0x21, AC_PWRST_D0); |
3671 | AC_VERB_SET_POWER_STATE, AC_PWRST_D0); | ||
3672 | else | 3659 | else |
3673 | snd_hda_codec_write(codec, 0x21, 0, | 3660 | update_power_state(codec, 0x21, AC_PWRST_D3); |
3674 | AC_VERB_SET_POWER_STATE, AC_PWRST_D3); | ||
3675 | } | 3661 | } |
3676 | 3662 | ||
3677 | /* patch for vt2002P */ | 3663 | /* patch for vt2002P */ |
@@ -3731,30 +3717,28 @@ static void set_widgets_power_state_vt1812(struct hda_codec *codec) | |||
3731 | set_pin_power_state(codec, 0x2b, &parm); | 3717 | set_pin_power_state(codec, 0x2b, &parm); |
3732 | parm = AC_PWRST_D0; | 3718 | parm = AC_PWRST_D0; |
3733 | /* MUX10/11 (1eh/1fh), AIW 0/1 (10h/11h) */ | 3719 | /* MUX10/11 (1eh/1fh), AIW 0/1 (10h/11h) */ |
3734 | snd_hda_codec_write(codec, 0x1e, 0, AC_VERB_SET_POWER_STATE, parm); | 3720 | update_power_state(codec, 0x1e, parm); |
3735 | snd_hda_codec_write(codec, 0x1f, 0, AC_VERB_SET_POWER_STATE, parm); | 3721 | update_power_state(codec, 0x1f, parm); |
3736 | snd_hda_codec_write(codec, 0x10, 0, AC_VERB_SET_POWER_STATE, parm); | 3722 | update_power_state(codec, 0x10, parm); |
3737 | snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_POWER_STATE, parm); | 3723 | update_power_state(codec, 0x11, parm); |
3738 | 3724 | ||
3739 | /* outputs */ | 3725 | /* outputs */ |
3740 | /* AOW0 (8h)*/ | 3726 | /* AOW0 (8h)*/ |
3741 | snd_hda_codec_write(codec, 0x8, 0, | 3727 | update_power_state(codec, 0x8, AC_PWRST_D0); |
3742 | AC_VERB_SET_POWER_STATE, AC_PWRST_D0); | ||
3743 | 3728 | ||
3744 | /* PW4 (28h), MW4 (18h), MUX4(38h) */ | 3729 | /* PW4 (28h), MW4 (18h), MUX4(38h) */ |
3745 | parm = AC_PWRST_D3; | 3730 | parm = AC_PWRST_D3; |
3746 | set_pin_power_state(codec, 0x28, &parm); | 3731 | set_pin_power_state(codec, 0x28, &parm); |
3747 | snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_POWER_STATE, parm); | 3732 | update_power_state(codec, 0x18, parm); |
3748 | snd_hda_codec_write(codec, 0x38, 0, AC_VERB_SET_POWER_STATE, parm); | 3733 | update_power_state(codec, 0x38, parm); |
3749 | 3734 | ||
3750 | /* PW1 (25h), MW1 (15h), MUX1(35h), AOW1 (9h) */ | 3735 | /* PW1 (25h), MW1 (15h), MUX1(35h), AOW1 (9h) */ |
3751 | parm = AC_PWRST_D3; | 3736 | parm = AC_PWRST_D3; |
3752 | set_pin_power_state(codec, 0x25, &parm); | 3737 | set_pin_power_state(codec, 0x25, &parm); |
3753 | snd_hda_codec_write(codec, 0x15, 0, AC_VERB_SET_POWER_STATE, parm); | 3738 | update_power_state(codec, 0x15, parm); |
3754 | snd_hda_codec_write(codec, 0x35, 0, AC_VERB_SET_POWER_STATE, parm); | 3739 | update_power_state(codec, 0x35, parm); |
3755 | if (spec->hp_independent_mode) | 3740 | if (spec->hp_independent_mode) |
3756 | snd_hda_codec_write(codec, 0x9, 0, | 3741 | update_power_state(codec, 0x9, AC_PWRST_D0); |
3757 | AC_VERB_SET_POWER_STATE, AC_PWRST_D0); | ||
3758 | 3742 | ||
3759 | /* Internal Speaker */ | 3743 | /* Internal Speaker */ |
3760 | /* PW0 (24h), MW0(14h), MUX0(34h) */ | 3744 | /* PW0 (24h), MW0(14h), MUX0(34h) */ |
@@ -3763,15 +3747,11 @@ static void set_widgets_power_state_vt1812(struct hda_codec *codec) | |||
3763 | parm = AC_PWRST_D3; | 3747 | parm = AC_PWRST_D3; |
3764 | set_pin_power_state(codec, 0x24, &parm); | 3748 | set_pin_power_state(codec, 0x24, &parm); |
3765 | if (present) { | 3749 | if (present) { |
3766 | snd_hda_codec_write(codec, 0x14, 0, | 3750 | update_power_state(codec, 0x14, AC_PWRST_D3); |
3767 | AC_VERB_SET_POWER_STATE, AC_PWRST_D3); | 3751 | update_power_state(codec, 0x34, AC_PWRST_D3); |
3768 | snd_hda_codec_write(codec, 0x34, 0, | ||
3769 | AC_VERB_SET_POWER_STATE, AC_PWRST_D3); | ||
3770 | } else { | 3752 | } else { |
3771 | snd_hda_codec_write(codec, 0x14, 0, | 3753 | update_power_state(codec, 0x14, AC_PWRST_D0); |
3772 | AC_VERB_SET_POWER_STATE, AC_PWRST_D0); | 3754 | update_power_state(codec, 0x34, AC_PWRST_D0); |
3773 | snd_hda_codec_write(codec, 0x34, 0, | ||
3774 | AC_VERB_SET_POWER_STATE, AC_PWRST_D0); | ||
3775 | } | 3755 | } |
3776 | 3756 | ||
3777 | 3757 | ||
@@ -3782,26 +3762,20 @@ static void set_widgets_power_state_vt1812(struct hda_codec *codec) | |||
3782 | parm = AC_PWRST_D3; | 3762 | parm = AC_PWRST_D3; |
3783 | set_pin_power_state(codec, 0x31, &parm); | 3763 | set_pin_power_state(codec, 0x31, &parm); |
3784 | if (present) { | 3764 | if (present) { |
3785 | snd_hda_codec_write(codec, 0x1c, 0, | 3765 | update_power_state(codec, 0x1c, AC_PWRST_D3); |
3786 | AC_VERB_SET_POWER_STATE, AC_PWRST_D3); | 3766 | update_power_state(codec, 0x3c, AC_PWRST_D3); |
3787 | snd_hda_codec_write(codec, 0x3c, 0, | 3767 | update_power_state(codec, 0x3e, AC_PWRST_D3); |
3788 | AC_VERB_SET_POWER_STATE, AC_PWRST_D3); | ||
3789 | snd_hda_codec_write(codec, 0x3e, 0, | ||
3790 | AC_VERB_SET_POWER_STATE, AC_PWRST_D3); | ||
3791 | } else { | 3768 | } else { |
3792 | snd_hda_codec_write(codec, 0x1c, 0, | 3769 | update_power_state(codec, 0x1c, AC_PWRST_D0); |
3793 | AC_VERB_SET_POWER_STATE, AC_PWRST_D0); | 3770 | update_power_state(codec, 0x3c, AC_PWRST_D0); |
3794 | snd_hda_codec_write(codec, 0x3c, 0, | 3771 | update_power_state(codec, 0x3e, AC_PWRST_D0); |
3795 | AC_VERB_SET_POWER_STATE, AC_PWRST_D0); | ||
3796 | snd_hda_codec_write(codec, 0x3e, 0, | ||
3797 | AC_VERB_SET_POWER_STATE, AC_PWRST_D0); | ||
3798 | } | 3772 | } |
3799 | 3773 | ||
3800 | /* PW15 (33h), MW15 (1dh), MUX15(3dh) */ | 3774 | /* PW15 (33h), MW15 (1dh), MUX15(3dh) */ |
3801 | parm = AC_PWRST_D3; | 3775 | parm = AC_PWRST_D3; |
3802 | set_pin_power_state(codec, 0x33, &parm); | 3776 | set_pin_power_state(codec, 0x33, &parm); |
3803 | snd_hda_codec_write(codec, 0x1d, 0, AC_VERB_SET_POWER_STATE, parm); | 3777 | update_power_state(codec, 0x1d, parm); |
3804 | snd_hda_codec_write(codec, 0x3d, 0, AC_VERB_SET_POWER_STATE, parm); | 3778 | update_power_state(codec, 0x3d, parm); |
3805 | 3779 | ||
3806 | } | 3780 | } |
3807 | 3781 | ||
diff --git a/sound/pci/oxygen/oxygen_mixer.c b/sound/pci/oxygen/oxygen_mixer.c index 26c7e8bcb229..c0dbb52d45be 100644 --- a/sound/pci/oxygen/oxygen_mixer.c +++ b/sound/pci/oxygen/oxygen_mixer.c | |||
@@ -618,9 +618,12 @@ static int ac97_volume_get(struct snd_kcontrol *ctl, | |||
618 | mutex_lock(&chip->mutex); | 618 | mutex_lock(&chip->mutex); |
619 | reg = oxygen_read_ac97(chip, codec, index); | 619 | reg = oxygen_read_ac97(chip, codec, index); |
620 | mutex_unlock(&chip->mutex); | 620 | mutex_unlock(&chip->mutex); |
621 | value->value.integer.value[0] = 31 - (reg & 0x1f); | 621 | if (!stereo) { |
622 | if (stereo) | 622 | value->value.integer.value[0] = 31 - (reg & 0x1f); |
623 | value->value.integer.value[1] = 31 - ((reg >> 8) & 0x1f); | 623 | } else { |
624 | value->value.integer.value[0] = 31 - ((reg >> 8) & 0x1f); | ||
625 | value->value.integer.value[1] = 31 - (reg & 0x1f); | ||
626 | } | ||
624 | return 0; | 627 | return 0; |
625 | } | 628 | } |
626 | 629 | ||
@@ -636,14 +639,14 @@ static int ac97_volume_put(struct snd_kcontrol *ctl, | |||
636 | 639 | ||
637 | mutex_lock(&chip->mutex); | 640 | mutex_lock(&chip->mutex); |
638 | oldreg = oxygen_read_ac97(chip, codec, index); | 641 | oldreg = oxygen_read_ac97(chip, codec, index); |
639 | newreg = oldreg; | 642 | if (!stereo) { |
640 | newreg = (newreg & ~0x1f) | | 643 | newreg = oldreg & ~0x1f; |
641 | (31 - (value->value.integer.value[0] & 0x1f)); | 644 | newreg |= 31 - (value->value.integer.value[0] & 0x1f); |
642 | if (stereo) | 645 | } else { |
643 | newreg = (newreg & ~0x1f00) | | 646 | newreg = oldreg & ~0x1f1f; |
644 | ((31 - (value->value.integer.value[1] & 0x1f)) << 8); | 647 | newreg |= (31 - (value->value.integer.value[0] & 0x1f)) << 8; |
645 | else | 648 | newreg |= 31 - (value->value.integer.value[1] & 0x1f); |
646 | newreg = (newreg & ~0x1f00) | ((newreg & 0x1f) << 8); | 649 | } |
647 | change = newreg != oldreg; | 650 | change = newreg != oldreg; |
648 | if (change) | 651 | if (change) |
649 | oxygen_write_ac97(chip, codec, index, newreg); | 652 | oxygen_write_ac97(chip, codec, index, newreg); |
diff --git a/sound/soc/codecs/cs42l73.c b/sound/soc/codecs/cs42l73.c index 9d38db8f1919..78979b3e0e95 100644 --- a/sound/soc/codecs/cs42l73.c +++ b/sound/soc/codecs/cs42l73.c | |||
@@ -1113,7 +1113,7 @@ static int cs42l73_pcm_hw_params(struct snd_pcm_substream *substream, | |||
1113 | priv->config[id].mmcc &= 0xC0; | 1113 | priv->config[id].mmcc &= 0xC0; |
1114 | priv->config[id].mmcc |= cs42l73_mclk_coeffs[mclk_coeff].mmcc; | 1114 | priv->config[id].mmcc |= cs42l73_mclk_coeffs[mclk_coeff].mmcc; |
1115 | priv->config[id].spc &= 0xFC; | 1115 | priv->config[id].spc &= 0xFC; |
1116 | priv->config[id].spc &= MCK_SCLK_64FS; | 1116 | priv->config[id].spc |= MCK_SCLK_MCLK; |
1117 | } else { | 1117 | } else { |
1118 | /* CS42L73 Slave */ | 1118 | /* CS42L73 Slave */ |
1119 | priv->config[id].spc &= 0xFC; | 1119 | priv->config[id].spc &= 0xFC; |
diff --git a/sound/soc/codecs/wm5100.c b/sound/soc/codecs/wm5100.c index 66f0611e68b6..89f2af77b1c3 100644 --- a/sound/soc/codecs/wm5100.c +++ b/sound/soc/codecs/wm5100.c | |||
@@ -1405,6 +1405,7 @@ static int wm5100_set_bias_level(struct snd_soc_codec *codec, | |||
1405 | 1405 | ||
1406 | case SND_SOC_BIAS_OFF: | 1406 | case SND_SOC_BIAS_OFF: |
1407 | regcache_cache_only(wm5100->regmap, true); | 1407 | regcache_cache_only(wm5100->regmap, true); |
1408 | regcache_mark_dirty(wm5100->regmap); | ||
1408 | if (wm5100->pdata.ldo_ena) | 1409 | if (wm5100->pdata.ldo_ena) |
1409 | gpio_set_value_cansleep(wm5100->pdata.ldo_ena, 0); | 1410 | gpio_set_value_cansleep(wm5100->pdata.ldo_ena, 0); |
1410 | regulator_bulk_disable(ARRAY_SIZE(wm5100->core_supplies), | 1411 | regulator_bulk_disable(ARRAY_SIZE(wm5100->core_supplies), |
@@ -2183,6 +2184,7 @@ static void wm5100_micd_irq(struct snd_soc_codec *codec) | |||
2183 | if (wm5100->jack_detecting) { | 2184 | if (wm5100->jack_detecting) { |
2184 | dev_dbg(codec->dev, "Microphone detected\n"); | 2185 | dev_dbg(codec->dev, "Microphone detected\n"); |
2185 | wm5100->jack_mic = true; | 2186 | wm5100->jack_mic = true; |
2187 | wm5100->jack_detecting = false; | ||
2186 | snd_soc_jack_report(wm5100->jack, | 2188 | snd_soc_jack_report(wm5100->jack, |
2187 | SND_JACK_HEADSET, | 2189 | SND_JACK_HEADSET, |
2188 | SND_JACK_HEADSET | SND_JACK_BTN_0); | 2190 | SND_JACK_HEADSET | SND_JACK_BTN_0); |
@@ -2221,6 +2223,7 @@ static void wm5100_micd_irq(struct snd_soc_codec *codec) | |||
2221 | SND_JACK_BTN_0); | 2223 | SND_JACK_BTN_0); |
2222 | } else if (wm5100->jack_detecting) { | 2224 | } else if (wm5100->jack_detecting) { |
2223 | dev_dbg(codec->dev, "Headphone detected\n"); | 2225 | dev_dbg(codec->dev, "Headphone detected\n"); |
2226 | wm5100->jack_detecting = false; | ||
2224 | snd_soc_jack_report(wm5100->jack, SND_JACK_HEADPHONE, | 2227 | snd_soc_jack_report(wm5100->jack, SND_JACK_HEADPHONE, |
2225 | SND_JACK_HEADPHONE); | 2228 | SND_JACK_HEADPHONE); |
2226 | 2229 | ||
@@ -2610,6 +2613,13 @@ static const struct regmap_config wm5100_regmap = { | |||
2610 | .cache_type = REGCACHE_RBTREE, | 2613 | .cache_type = REGCACHE_RBTREE, |
2611 | }; | 2614 | }; |
2612 | 2615 | ||
2616 | static const unsigned int wm5100_mic_ctrl_reg[] = { | ||
2617 | WM5100_IN1L_CONTROL, | ||
2618 | WM5100_IN2L_CONTROL, | ||
2619 | WM5100_IN3L_CONTROL, | ||
2620 | WM5100_IN4L_CONTROL, | ||
2621 | }; | ||
2622 | |||
2613 | static __devinit int wm5100_i2c_probe(struct i2c_client *i2c, | 2623 | static __devinit int wm5100_i2c_probe(struct i2c_client *i2c, |
2614 | const struct i2c_device_id *id) | 2624 | const struct i2c_device_id *id) |
2615 | { | 2625 | { |
@@ -2742,7 +2752,7 @@ static __devinit int wm5100_i2c_probe(struct i2c_client *i2c, | |||
2742 | } | 2752 | } |
2743 | 2753 | ||
2744 | for (i = 0; i < ARRAY_SIZE(wm5100->pdata.in_mode); i++) { | 2754 | for (i = 0; i < ARRAY_SIZE(wm5100->pdata.in_mode); i++) { |
2745 | regmap_update_bits(wm5100->regmap, WM5100_IN1L_CONTROL, | 2755 | regmap_update_bits(wm5100->regmap, wm5100_mic_ctrl_reg[i], |
2746 | WM5100_IN1_MODE_MASK | | 2756 | WM5100_IN1_MODE_MASK | |
2747 | WM5100_IN1_DMIC_SUP_MASK, | 2757 | WM5100_IN1_DMIC_SUP_MASK, |
2748 | (wm5100->pdata.in_mode[i] << | 2758 | (wm5100->pdata.in_mode[i] << |
diff --git a/sound/soc/codecs/wm8962.c b/sound/soc/codecs/wm8962.c index 296de4e30d26..29c4b02c4790 100644 --- a/sound/soc/codecs/wm8962.c +++ b/sound/soc/codecs/wm8962.c | |||
@@ -96,7 +96,7 @@ static int wm8962_regulator_event_##n(struct notifier_block *nb, \ | |||
96 | struct wm8962_priv *wm8962 = container_of(nb, struct wm8962_priv, \ | 96 | struct wm8962_priv *wm8962 = container_of(nb, struct wm8962_priv, \ |
97 | disable_nb[n]); \ | 97 | disable_nb[n]); \ |
98 | if (event & REGULATOR_EVENT_DISABLE) { \ | 98 | if (event & REGULATOR_EVENT_DISABLE) { \ |
99 | regcache_cache_only(wm8962->regmap, true); \ | 99 | regcache_mark_dirty(wm8962->regmap); \ |
100 | } \ | 100 | } \ |
101 | return 0; \ | 101 | return 0; \ |
102 | } | 102 | } |
@@ -3159,13 +3159,13 @@ static int wm8962_hw_params(struct snd_pcm_substream *substream, | |||
3159 | case SNDRV_PCM_FORMAT_S16_LE: | 3159 | case SNDRV_PCM_FORMAT_S16_LE: |
3160 | break; | 3160 | break; |
3161 | case SNDRV_PCM_FORMAT_S20_3LE: | 3161 | case SNDRV_PCM_FORMAT_S20_3LE: |
3162 | aif0 |= 0x40; | 3162 | aif0 |= 0x4; |
3163 | break; | 3163 | break; |
3164 | case SNDRV_PCM_FORMAT_S24_LE: | 3164 | case SNDRV_PCM_FORMAT_S24_LE: |
3165 | aif0 |= 0x80; | 3165 | aif0 |= 0x8; |
3166 | break; | 3166 | break; |
3167 | case SNDRV_PCM_FORMAT_S32_LE: | 3167 | case SNDRV_PCM_FORMAT_S32_LE: |
3168 | aif0 |= 0xc0; | 3168 | aif0 |= 0xc; |
3169 | break; | 3169 | break; |
3170 | default: | 3170 | default: |
3171 | return -EINVAL; | 3171 | return -EINVAL; |
diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c index 93d27b660257..ec69a6c152fe 100644 --- a/sound/soc/codecs/wm8994.c +++ b/sound/soc/codecs/wm8994.c | |||
@@ -770,6 +770,8 @@ static void vmid_reference(struct snd_soc_codec *codec) | |||
770 | { | 770 | { |
771 | struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); | 771 | struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); |
772 | 772 | ||
773 | pm_runtime_get_sync(codec->dev); | ||
774 | |||
773 | wm8994->vmid_refcount++; | 775 | wm8994->vmid_refcount++; |
774 | 776 | ||
775 | dev_dbg(codec->dev, "Referencing VMID, refcount is now %d\n", | 777 | dev_dbg(codec->dev, "Referencing VMID, refcount is now %d\n", |
@@ -783,7 +785,12 @@ static void vmid_reference(struct snd_soc_codec *codec) | |||
783 | WM8994_VMID_RAMP_MASK, | 785 | WM8994_VMID_RAMP_MASK, |
784 | WM8994_STARTUP_BIAS_ENA | | 786 | WM8994_STARTUP_BIAS_ENA | |
785 | WM8994_VMID_BUF_ENA | | 787 | WM8994_VMID_BUF_ENA | |
786 | (0x11 << WM8994_VMID_RAMP_SHIFT)); | 788 | (0x3 << WM8994_VMID_RAMP_SHIFT)); |
789 | |||
790 | /* Remove discharge for line out */ | ||
791 | snd_soc_update_bits(codec, WM8994_ANTIPOP_1, | ||
792 | WM8994_LINEOUT1_DISCH | | ||
793 | WM8994_LINEOUT2_DISCH, 0); | ||
787 | 794 | ||
788 | /* Main bias enable, VMID=2x40k */ | 795 | /* Main bias enable, VMID=2x40k */ |
789 | snd_soc_update_bits(codec, WM8994_POWER_MANAGEMENT_1, | 796 | snd_soc_update_bits(codec, WM8994_POWER_MANAGEMENT_1, |
@@ -837,6 +844,8 @@ static void vmid_dereference(struct snd_soc_codec *codec) | |||
837 | WM8994_VMID_BUF_ENA | | 844 | WM8994_VMID_BUF_ENA | |
838 | WM8994_VMID_RAMP_MASK, 0); | 845 | WM8994_VMID_RAMP_MASK, 0); |
839 | } | 846 | } |
847 | |||
848 | pm_runtime_put(codec->dev); | ||
840 | } | 849 | } |
841 | 850 | ||
842 | static int vmid_event(struct snd_soc_dapm_widget *w, | 851 | static int vmid_event(struct snd_soc_dapm_widget *w, |
@@ -2753,11 +2762,6 @@ static int wm8994_resume(struct snd_soc_codec *codec) | |||
2753 | codec->cache_only = 0; | 2762 | codec->cache_only = 0; |
2754 | } | 2763 | } |
2755 | 2764 | ||
2756 | /* Restore the registers */ | ||
2757 | ret = snd_soc_cache_sync(codec); | ||
2758 | if (ret != 0) | ||
2759 | dev_err(codec->dev, "Failed to sync cache: %d\n", ret); | ||
2760 | |||
2761 | wm8994_set_bias_level(codec, SND_SOC_BIAS_STANDBY); | 2765 | wm8994_set_bias_level(codec, SND_SOC_BIAS_STANDBY); |
2762 | 2766 | ||
2763 | for (i = 0; i < ARRAY_SIZE(wm8994->fll); i++) { | 2767 | for (i = 0; i < ARRAY_SIZE(wm8994->fll); i++) { |
diff --git a/sound/soc/codecs/wm8996.c b/sound/soc/codecs/wm8996.c index 13aa2bdaa7d7..61f7daa4d0e6 100644 --- a/sound/soc/codecs/wm8996.c +++ b/sound/soc/codecs/wm8996.c | |||
@@ -108,7 +108,7 @@ static int wm8996_regulator_event_##n(struct notifier_block *nb, \ | |||
108 | struct wm8996_priv *wm8996 = container_of(nb, struct wm8996_priv, \ | 108 | struct wm8996_priv *wm8996 = container_of(nb, struct wm8996_priv, \ |
109 | disable_nb[n]); \ | 109 | disable_nb[n]); \ |
110 | if (event & REGULATOR_EVENT_DISABLE) { \ | 110 | if (event & REGULATOR_EVENT_DISABLE) { \ |
111 | regcache_cache_only(wm8996->regmap, true); \ | 111 | regcache_mark_dirty(wm8996->regmap); \ |
112 | } \ | 112 | } \ |
113 | return 0; \ | 113 | return 0; \ |
114 | } | 114 | } |
diff --git a/sound/soc/codecs/wm_hubs.c b/sound/soc/codecs/wm_hubs.c index 2a61094075f8..8a68cea4a3ee 100644 --- a/sound/soc/codecs/wm_hubs.c +++ b/sound/soc/codecs/wm_hubs.c | |||
@@ -586,14 +586,14 @@ SOC_DAPM_SINGLE("Left Output Switch", WM8993_LINE_MIXER1, 0, 1, 0), | |||
586 | }; | 586 | }; |
587 | 587 | ||
588 | static const struct snd_kcontrol_new line2_mix[] = { | 588 | static const struct snd_kcontrol_new line2_mix[] = { |
589 | SOC_DAPM_SINGLE("IN2R Switch", WM8993_LINE_MIXER2, 2, 1, 0), | 589 | SOC_DAPM_SINGLE("IN1L Switch", WM8993_LINE_MIXER2, 2, 1, 0), |
590 | SOC_DAPM_SINGLE("IN2L Switch", WM8993_LINE_MIXER2, 1, 1, 0), | 590 | SOC_DAPM_SINGLE("IN1R Switch", WM8993_LINE_MIXER2, 1, 1, 0), |
591 | SOC_DAPM_SINGLE("Output Switch", WM8993_LINE_MIXER2, 0, 1, 0), | 591 | SOC_DAPM_SINGLE("Output Switch", WM8993_LINE_MIXER2, 0, 1, 0), |
592 | }; | 592 | }; |
593 | 593 | ||
594 | static const struct snd_kcontrol_new line2n_mix[] = { | 594 | static const struct snd_kcontrol_new line2n_mix[] = { |
595 | SOC_DAPM_SINGLE("Left Output Switch", WM8993_LINE_MIXER2, 6, 1, 0), | 595 | SOC_DAPM_SINGLE("Left Output Switch", WM8993_LINE_MIXER2, 5, 1, 0), |
596 | SOC_DAPM_SINGLE("Right Output Switch", WM8993_LINE_MIXER2, 5, 1, 0), | 596 | SOC_DAPM_SINGLE("Right Output Switch", WM8993_LINE_MIXER2, 6, 1, 0), |
597 | }; | 597 | }; |
598 | 598 | ||
599 | static const struct snd_kcontrol_new line2p_mix[] = { | 599 | static const struct snd_kcontrol_new line2p_mix[] = { |
@@ -613,6 +613,8 @@ SND_SOC_DAPM_INPUT("IN2RP:VXRP"), | |||
613 | SND_SOC_DAPM_SUPPLY("MICBIAS2", WM8993_POWER_MANAGEMENT_1, 5, 0, NULL, 0), | 613 | SND_SOC_DAPM_SUPPLY("MICBIAS2", WM8993_POWER_MANAGEMENT_1, 5, 0, NULL, 0), |
614 | SND_SOC_DAPM_SUPPLY("MICBIAS1", WM8993_POWER_MANAGEMENT_1, 4, 0, NULL, 0), | 614 | SND_SOC_DAPM_SUPPLY("MICBIAS1", WM8993_POWER_MANAGEMENT_1, 4, 0, NULL, 0), |
615 | 615 | ||
616 | SND_SOC_DAPM_SUPPLY("LINEOUT_VMID_BUF", WM8993_ANTIPOP1, 7, 0, NULL, 0), | ||
617 | |||
616 | SND_SOC_DAPM_MIXER("IN1L PGA", WM8993_POWER_MANAGEMENT_2, 6, 0, | 618 | SND_SOC_DAPM_MIXER("IN1L PGA", WM8993_POWER_MANAGEMENT_2, 6, 0, |
617 | in1l_pga, ARRAY_SIZE(in1l_pga)), | 619 | in1l_pga, ARRAY_SIZE(in1l_pga)), |
618 | SND_SOC_DAPM_MIXER("IN1R PGA", WM8993_POWER_MANAGEMENT_2, 4, 0, | 620 | SND_SOC_DAPM_MIXER("IN1R PGA", WM8993_POWER_MANAGEMENT_2, 4, 0, |
@@ -834,9 +836,11 @@ static const struct snd_soc_dapm_route lineout1_diff_routes[] = { | |||
834 | }; | 836 | }; |
835 | 837 | ||
836 | static const struct snd_soc_dapm_route lineout1_se_routes[] = { | 838 | static const struct snd_soc_dapm_route lineout1_se_routes[] = { |
839 | { "LINEOUT1N Mixer", NULL, "LINEOUT_VMID_BUF" }, | ||
837 | { "LINEOUT1N Mixer", "Left Output Switch", "Left Output PGA" }, | 840 | { "LINEOUT1N Mixer", "Left Output Switch", "Left Output PGA" }, |
838 | { "LINEOUT1N Mixer", "Right Output Switch", "Right Output PGA" }, | 841 | { "LINEOUT1N Mixer", "Right Output Switch", "Right Output PGA" }, |
839 | 842 | ||
843 | { "LINEOUT1P Mixer", NULL, "LINEOUT_VMID_BUF" }, | ||
840 | { "LINEOUT1P Mixer", "Left Output Switch", "Left Output PGA" }, | 844 | { "LINEOUT1P Mixer", "Left Output Switch", "Left Output PGA" }, |
841 | 845 | ||
842 | { "LINEOUT1N Driver", NULL, "LINEOUT1N Mixer" }, | 846 | { "LINEOUT1N Driver", NULL, "LINEOUT1N Mixer" }, |
@@ -844,8 +848,8 @@ static const struct snd_soc_dapm_route lineout1_se_routes[] = { | |||
844 | }; | 848 | }; |
845 | 849 | ||
846 | static const struct snd_soc_dapm_route lineout2_diff_routes[] = { | 850 | static const struct snd_soc_dapm_route lineout2_diff_routes[] = { |
847 | { "LINEOUT2 Mixer", "IN2L Switch", "IN2L PGA" }, | 851 | { "LINEOUT2 Mixer", "IN1L Switch", "IN1L PGA" }, |
848 | { "LINEOUT2 Mixer", "IN2R Switch", "IN2R PGA" }, | 852 | { "LINEOUT2 Mixer", "IN1R Switch", "IN1R PGA" }, |
849 | { "LINEOUT2 Mixer", "Output Switch", "Right Output PGA" }, | 853 | { "LINEOUT2 Mixer", "Output Switch", "Right Output PGA" }, |
850 | 854 | ||
851 | { "LINEOUT2N Driver", NULL, "LINEOUT2 Mixer" }, | 855 | { "LINEOUT2N Driver", NULL, "LINEOUT2 Mixer" }, |
@@ -853,9 +857,11 @@ static const struct snd_soc_dapm_route lineout2_diff_routes[] = { | |||
853 | }; | 857 | }; |
854 | 858 | ||
855 | static const struct snd_soc_dapm_route lineout2_se_routes[] = { | 859 | static const struct snd_soc_dapm_route lineout2_se_routes[] = { |
860 | { "LINEOUT2N Mixer", NULL, "LINEOUT_VMID_BUF" }, | ||
856 | { "LINEOUT2N Mixer", "Left Output Switch", "Left Output PGA" }, | 861 | { "LINEOUT2N Mixer", "Left Output Switch", "Left Output PGA" }, |
857 | { "LINEOUT2N Mixer", "Right Output Switch", "Right Output PGA" }, | 862 | { "LINEOUT2N Mixer", "Right Output Switch", "Right Output PGA" }, |
858 | 863 | ||
864 | { "LINEOUT2P Mixer", NULL, "LINEOUT_VMID_BUF" }, | ||
859 | { "LINEOUT2P Mixer", "Right Output Switch", "Right Output PGA" }, | 865 | { "LINEOUT2P Mixer", "Right Output Switch", "Right Output PGA" }, |
860 | 866 | ||
861 | { "LINEOUT2N Driver", NULL, "LINEOUT2N Mixer" }, | 867 | { "LINEOUT2N Driver", NULL, "LINEOUT2N Mixer" }, |
diff --git a/sound/soc/samsung/neo1973_wm8753.c b/sound/soc/samsung/neo1973_wm8753.c index 7ac0ba2025c3..c6012ff5bd3e 100644 --- a/sound/soc/samsung/neo1973_wm8753.c +++ b/sound/soc/samsung/neo1973_wm8753.c | |||
@@ -230,8 +230,6 @@ static const struct snd_kcontrol_new neo1973_wm8753_controls[] = { | |||
230 | 230 | ||
231 | /* GTA02 specific routes and controls */ | 231 | /* GTA02 specific routes and controls */ |
232 | 232 | ||
233 | #ifdef CONFIG_MACH_NEO1973_GTA02 | ||
234 | |||
235 | static int gta02_speaker_enabled; | 233 | static int gta02_speaker_enabled; |
236 | 234 | ||
237 | static int lm4853_set_spk(struct snd_kcontrol *kcontrol, | 235 | static int lm4853_set_spk(struct snd_kcontrol *kcontrol, |
@@ -311,10 +309,6 @@ static int neo1973_gta02_wm8753_init(struct snd_soc_codec *codec) | |||
311 | return 0; | 309 | return 0; |
312 | } | 310 | } |
313 | 311 | ||
314 | #else | ||
315 | static int neo1973_gta02_wm8753_init(struct snd_soc_code *codec) { return 0; } | ||
316 | #endif | ||
317 | |||
318 | static int neo1973_wm8753_init(struct snd_soc_pcm_runtime *rtd) | 312 | static int neo1973_wm8753_init(struct snd_soc_pcm_runtime *rtd) |
319 | { | 313 | { |
320 | struct snd_soc_codec *codec = rtd->codec; | 314 | struct snd_soc_codec *codec = rtd->codec; |
@@ -322,10 +316,6 @@ static int neo1973_wm8753_init(struct snd_soc_pcm_runtime *rtd) | |||
322 | int ret; | 316 | int ret; |
323 | 317 | ||
324 | /* set up NC codec pins */ | 318 | /* set up NC codec pins */ |
325 | if (machine_is_neo1973_gta01()) { | ||
326 | snd_soc_dapm_nc_pin(dapm, "LOUT2"); | ||
327 | snd_soc_dapm_nc_pin(dapm, "ROUT2"); | ||
328 | } | ||
329 | snd_soc_dapm_nc_pin(dapm, "OUT3"); | 319 | snd_soc_dapm_nc_pin(dapm, "OUT3"); |
330 | snd_soc_dapm_nc_pin(dapm, "OUT4"); | 320 | snd_soc_dapm_nc_pin(dapm, "OUT4"); |
331 | snd_soc_dapm_nc_pin(dapm, "LINE1"); | 321 | snd_soc_dapm_nc_pin(dapm, "LINE1"); |
@@ -370,50 +360,6 @@ static int neo1973_wm8753_init(struct snd_soc_pcm_runtime *rtd) | |||
370 | return 0; | 360 | return 0; |
371 | } | 361 | } |
372 | 362 | ||
373 | /* GTA01 specific controls */ | ||
374 | |||
375 | #ifdef CONFIG_MACH_NEO1973_GTA01 | ||
376 | |||
377 | static const struct snd_soc_dapm_route neo1973_lm4857_routes[] = { | ||
378 | {"Amp IN", NULL, "ROUT1"}, | ||
379 | {"Amp IN", NULL, "LOUT1"}, | ||
380 | |||
381 | {"Handset Spk", NULL, "Amp EP"}, | ||
382 | {"Stereo Out", NULL, "Amp LS"}, | ||
383 | {"Headphone", NULL, "Amp HP"}, | ||
384 | }; | ||
385 | |||
386 | static const struct snd_soc_dapm_widget neo1973_lm4857_dapm_widgets[] = { | ||
387 | SND_SOC_DAPM_SPK("Handset Spk", NULL), | ||
388 | SND_SOC_DAPM_SPK("Stereo Out", NULL), | ||
389 | SND_SOC_DAPM_HP("Headphone", NULL), | ||
390 | }; | ||
391 | |||
392 | static int neo1973_lm4857_init(struct snd_soc_dapm_context *dapm) | ||
393 | { | ||
394 | int ret; | ||
395 | |||
396 | ret = snd_soc_dapm_new_controls(dapm, neo1973_lm4857_dapm_widgets, | ||
397 | ARRAY_SIZE(neo1973_lm4857_dapm_widgets)); | ||
398 | if (ret) | ||
399 | return ret; | ||
400 | |||
401 | ret = snd_soc_dapm_add_routes(dapm, neo1973_lm4857_routes, | ||
402 | ARRAY_SIZE(neo1973_lm4857_routes)); | ||
403 | if (ret) | ||
404 | return ret; | ||
405 | |||
406 | snd_soc_dapm_ignore_suspend(dapm, "Stereo Out"); | ||
407 | snd_soc_dapm_ignore_suspend(dapm, "Handset Spk"); | ||
408 | snd_soc_dapm_ignore_suspend(dapm, "Headphone"); | ||
409 | |||
410 | return 0; | ||
411 | } | ||
412 | |||
413 | #else | ||
414 | static int neo1973_lm4857_init(struct snd_soc_dapm_context *dapm) { return 0; }; | ||
415 | #endif | ||
416 | |||
417 | static struct snd_soc_dai_link neo1973_dai[] = { | 363 | static struct snd_soc_dai_link neo1973_dai[] = { |
418 | { /* Hifi Playback - for similatious use with voice below */ | 364 | { /* Hifi Playback - for similatious use with voice below */ |
419 | .name = "WM8753", | 365 | .name = "WM8753", |
@@ -440,11 +386,6 @@ static struct snd_soc_aux_dev neo1973_aux_devs[] = { | |||
440 | .name = "dfbmcs320", | 386 | .name = "dfbmcs320", |
441 | .codec_name = "dfbmcs320.0", | 387 | .codec_name = "dfbmcs320.0", |
442 | }, | 388 | }, |
443 | { | ||
444 | .name = "lm4857", | ||
445 | .codec_name = "lm4857.0-007c", | ||
446 | .init = neo1973_lm4857_init, | ||
447 | }, | ||
448 | }; | 389 | }; |
449 | 390 | ||
450 | static struct snd_soc_codec_conf neo1973_codec_conf[] = { | 391 | static struct snd_soc_codec_conf neo1973_codec_conf[] = { |
@@ -454,14 +395,10 @@ static struct snd_soc_codec_conf neo1973_codec_conf[] = { | |||
454 | }, | 395 | }, |
455 | }; | 396 | }; |
456 | 397 | ||
457 | #ifdef CONFIG_MACH_NEO1973_GTA02 | ||
458 | static const struct gpio neo1973_gta02_gpios[] = { | 398 | static const struct gpio neo1973_gta02_gpios[] = { |
459 | { GTA02_GPIO_HP_IN, GPIOF_OUT_INIT_HIGH, "GTA02_HP_IN" }, | 399 | { GTA02_GPIO_HP_IN, GPIOF_OUT_INIT_HIGH, "GTA02_HP_IN" }, |
460 | { GTA02_GPIO_AMP_SHUT, GPIOF_OUT_INIT_HIGH, "GTA02_AMP_SHUT" }, | 400 | { GTA02_GPIO_AMP_SHUT, GPIOF_OUT_INIT_HIGH, "GTA02_AMP_SHUT" }, |
461 | }; | 401 | }; |
462 | #else | ||
463 | static const struct gpio neo1973_gta02_gpios[] = {}; | ||
464 | #endif | ||
465 | 402 | ||
466 | static struct snd_soc_card neo1973 = { | 403 | static struct snd_soc_card neo1973 = { |
467 | .name = "neo1973", | 404 | .name = "neo1973", |
@@ -480,7 +417,7 @@ static int __init neo1973_init(void) | |||
480 | { | 417 | { |
481 | int ret; | 418 | int ret; |
482 | 419 | ||
483 | if (!machine_is_neo1973_gta01() && !machine_is_neo1973_gta02()) | 420 | if (!machine_is_neo1973_gta02()) |
484 | return -ENODEV; | 421 | return -ENODEV; |
485 | 422 | ||
486 | if (machine_is_neo1973_gta02()) { | 423 | if (machine_is_neo1973_gta02()) { |
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index b5ecf6d23214..92cee24ed2dc 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c | |||
@@ -567,6 +567,17 @@ int snd_soc_suspend(struct device *dev) | |||
567 | if (!codec->suspended && codec->driver->suspend) { | 567 | if (!codec->suspended && codec->driver->suspend) { |
568 | switch (codec->dapm.bias_level) { | 568 | switch (codec->dapm.bias_level) { |
569 | case SND_SOC_BIAS_STANDBY: | 569 | case SND_SOC_BIAS_STANDBY: |
570 | /* | ||
571 | * If the CODEC is capable of idle | ||
572 | * bias off then being in STANDBY | ||
573 | * means it's doing something, | ||
574 | * otherwise fall through. | ||
575 | */ | ||
576 | if (codec->dapm.idle_bias_off) { | ||
577 | dev_dbg(codec->dev, | ||
578 | "idle_bias_off CODEC on over suspend\n"); | ||
579 | break; | ||
580 | } | ||
570 | case SND_SOC_BIAS_OFF: | 581 | case SND_SOC_BIAS_OFF: |
571 | codec->driver->suspend(codec); | 582 | codec->driver->suspend(codec); |
572 | codec->suspended = 1; | 583 | codec->suspended = 1; |
diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h index 8edc5035fc8f..d89ab4c7d44b 100644 --- a/sound/usb/quirks-table.h +++ b/sound/usb/quirks-table.h | |||
@@ -1618,6 +1618,14 @@ YAMAHA_DEVICE(0x7010, "UB99"), | |||
1618 | } | 1618 | } |
1619 | }, | 1619 | }, |
1620 | { | 1620 | { |
1621 | /* Edirol UM-3G */ | ||
1622 | USB_DEVICE_VENDOR_SPEC(0x0582, 0x0108), | ||
1623 | .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { | ||
1624 | .ifnum = 0, | ||
1625 | .type = QUIRK_MIDI_STANDARD_INTERFACE | ||
1626 | } | ||
1627 | }, | ||
1628 | { | ||
1621 | /* Boss JS-8 Jam Station */ | 1629 | /* Boss JS-8 Jam Station */ |
1622 | USB_DEVICE(0x0582, 0x0109), | 1630 | USB_DEVICE(0x0582, 0x0109), |
1623 | .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { | 1631 | .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { |
diff --git a/tools/perf/Makefile b/tools/perf/Makefile index ac86d67b636e..7c12650165ae 100644 --- a/tools/perf/Makefile +++ b/tools/perf/Makefile | |||
@@ -104,7 +104,7 @@ endif | |||
104 | 104 | ||
105 | CFLAGS = -fno-omit-frame-pointer -ggdb3 -Wall -Wextra -std=gnu99 $(CFLAGS_WERROR) $(CFLAGS_OPTIMIZE) -D_FORTIFY_SOURCE=2 $(EXTRA_WARNINGS) $(EXTRA_CFLAGS) | 105 | CFLAGS = -fno-omit-frame-pointer -ggdb3 -Wall -Wextra -std=gnu99 $(CFLAGS_WERROR) $(CFLAGS_OPTIMIZE) -D_FORTIFY_SOURCE=2 $(EXTRA_WARNINGS) $(EXTRA_CFLAGS) |
106 | EXTLIBS = -lpthread -lrt -lelf -lm | 106 | EXTLIBS = -lpthread -lrt -lelf -lm |
107 | ALL_CFLAGS = $(CFLAGS) -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 | 107 | ALL_CFLAGS = $(CFLAGS) -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE |
108 | ALL_LDFLAGS = $(LDFLAGS) | 108 | ALL_LDFLAGS = $(LDFLAGS) |
109 | STRIP ?= strip | 109 | STRIP ?= strip |
110 | 110 | ||
@@ -168,10 +168,7 @@ endif | |||
168 | 168 | ||
169 | ### --- END CONFIGURATION SECTION --- | 169 | ### --- END CONFIGURATION SECTION --- |
170 | 170 | ||
171 | # Those must not be GNU-specific; they are shared with perl/ which may | 171 | BASIC_CFLAGS = -Iutil/include -Iarch/$(ARCH)/include -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE |
172 | # be built by a different compiler. (Note that this is an artifact now | ||
173 | # but it still might be nice to keep that distinction.) | ||
174 | BASIC_CFLAGS = -Iutil/include -Iarch/$(ARCH)/include | ||
175 | BASIC_LDFLAGS = | 172 | BASIC_LDFLAGS = |
176 | 173 | ||
177 | # Guard against environment variables | 174 | # Guard against environment variables |
diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c index 59d43abfbfec..fb8566181f27 100644 --- a/tools/perf/builtin-probe.c +++ b/tools/perf/builtin-probe.c | |||
@@ -20,7 +20,6 @@ | |||
20 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | 20 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
21 | * | 21 | * |
22 | */ | 22 | */ |
23 | #define _GNU_SOURCE | ||
24 | #include <sys/utsname.h> | 23 | #include <sys/utsname.h> |
25 | #include <sys/types.h> | 24 | #include <sys/types.h> |
26 | #include <sys/stat.h> | 25 | #include <sys/stat.h> |
@@ -31,7 +30,6 @@ | |||
31 | #include <stdlib.h> | 30 | #include <stdlib.h> |
32 | #include <string.h> | 31 | #include <string.h> |
33 | 32 | ||
34 | #undef _GNU_SOURCE | ||
35 | #include "perf.h" | 33 | #include "perf.h" |
36 | #include "builtin.h" | 34 | #include "builtin.h" |
37 | #include "util/util.h" | 35 | #include "util/util.h" |
diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c index 8f80df896038..dd162aa24baa 100644 --- a/tools/perf/builtin-top.c +++ b/tools/perf/builtin-top.c | |||
@@ -89,8 +89,6 @@ void get_term_dimensions(struct winsize *ws) | |||
89 | 89 | ||
90 | static void perf_top__update_print_entries(struct perf_top *top) | 90 | static void perf_top__update_print_entries(struct perf_top *top) |
91 | { | 91 | { |
92 | top->print_entries = top->winsize.ws_row; | ||
93 | |||
94 | if (top->print_entries > 9) | 92 | if (top->print_entries > 9) |
95 | top->print_entries -= 9; | 93 | top->print_entries -= 9; |
96 | } | 94 | } |
@@ -100,6 +98,13 @@ static void perf_top__sig_winch(int sig __used, siginfo_t *info __used, void *ar | |||
100 | struct perf_top *top = arg; | 98 | struct perf_top *top = arg; |
101 | 99 | ||
102 | get_term_dimensions(&top->winsize); | 100 | get_term_dimensions(&top->winsize); |
101 | if (!top->print_entries | ||
102 | || (top->print_entries+4) > top->winsize.ws_row) { | ||
103 | top->print_entries = top->winsize.ws_row; | ||
104 | } else { | ||
105 | top->print_entries += 4; | ||
106 | top->winsize.ws_row = top->print_entries; | ||
107 | } | ||
103 | perf_top__update_print_entries(top); | 108 | perf_top__update_print_entries(top); |
104 | } | 109 | } |
105 | 110 | ||
@@ -453,8 +458,10 @@ static void perf_top__handle_keypress(struct perf_top *top, int c) | |||
453 | }; | 458 | }; |
454 | perf_top__sig_winch(SIGWINCH, NULL, top); | 459 | perf_top__sig_winch(SIGWINCH, NULL, top); |
455 | sigaction(SIGWINCH, &act, NULL); | 460 | sigaction(SIGWINCH, &act, NULL); |
456 | } else | 461 | } else { |
462 | perf_top__sig_winch(SIGWINCH, NULL, top); | ||
457 | signal(SIGWINCH, SIG_DFL); | 463 | signal(SIGWINCH, SIG_DFL); |
464 | } | ||
458 | break; | 465 | break; |
459 | case 'E': | 466 | case 'E': |
460 | if (top->evlist->nr_entries > 1) { | 467 | if (top->evlist->nr_entries > 1) { |
diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index 3e7e0b09c12c..ecd7f4dd7eea 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c | |||
@@ -2105,7 +2105,7 @@ int perf_event__synthesize_event_type(struct perf_tool *tool, | |||
2105 | strncpy(ev.event_type.event_type.name, name, MAX_EVENT_NAME - 1); | 2105 | strncpy(ev.event_type.event_type.name, name, MAX_EVENT_NAME - 1); |
2106 | 2106 | ||
2107 | ev.event_type.header.type = PERF_RECORD_HEADER_EVENT_TYPE; | 2107 | ev.event_type.header.type = PERF_RECORD_HEADER_EVENT_TYPE; |
2108 | size = strlen(name); | 2108 | size = strlen(ev.event_type.event_type.name); |
2109 | size = ALIGN(size, sizeof(u64)); | 2109 | size = ALIGN(size, sizeof(u64)); |
2110 | ev.event_type.header.size = sizeof(ev.event_type) - | 2110 | ev.event_type.header.size = sizeof(ev.event_type) - |
2111 | (sizeof(ev.event_type.event_type.name) - size); | 2111 | (sizeof(ev.event_type.event_type.name) - size); |
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c index eb25900e2211..29cb65459811 100644 --- a/tools/perf/util/probe-event.c +++ b/tools/perf/util/probe-event.c | |||
@@ -19,7 +19,6 @@ | |||
19 | * | 19 | * |
20 | */ | 20 | */ |
21 | 21 | ||
22 | #define _GNU_SOURCE | ||
23 | #include <sys/utsname.h> | 22 | #include <sys/utsname.h> |
24 | #include <sys/types.h> | 23 | #include <sys/types.h> |
25 | #include <sys/stat.h> | 24 | #include <sys/stat.h> |
@@ -33,7 +32,6 @@ | |||
33 | #include <limits.h> | 32 | #include <limits.h> |
34 | #include <elf.h> | 33 | #include <elf.h> |
35 | 34 | ||
36 | #undef _GNU_SOURCE | ||
37 | #include "util.h" | 35 | #include "util.h" |
38 | #include "event.h" | 36 | #include "event.h" |
39 | #include "string.h" | 37 | #include "string.h" |
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c index 215d50f2042e..0975438c3e72 100644 --- a/tools/perf/util/symbol.c +++ b/tools/perf/util/symbol.c | |||
@@ -1,4 +1,3 @@ | |||
1 | #define _GNU_SOURCE | ||
2 | #include <ctype.h> | 1 | #include <ctype.h> |
3 | #include <dirent.h> | 2 | #include <dirent.h> |
4 | #include <errno.h> | 3 | #include <errno.h> |
diff --git a/tools/perf/util/trace-event-parse.c b/tools/perf/util/trace-event-parse.c index 6c164dc9ee95..1a8d4dc4f386 100644 --- a/tools/perf/util/trace-event-parse.c +++ b/tools/perf/util/trace-event-parse.c | |||
@@ -21,14 +21,13 @@ | |||
21 | * The parts for function graph printing was taken and modified from the | 21 | * The parts for function graph printing was taken and modified from the |
22 | * Linux Kernel that were written by Frederic Weisbecker. | 22 | * Linux Kernel that were written by Frederic Weisbecker. |
23 | */ | 23 | */ |
24 | #define _GNU_SOURCE | 24 | |
25 | #include <stdio.h> | 25 | #include <stdio.h> |
26 | #include <stdlib.h> | 26 | #include <stdlib.h> |
27 | #include <string.h> | 27 | #include <string.h> |
28 | #include <ctype.h> | 28 | #include <ctype.h> |
29 | #include <errno.h> | 29 | #include <errno.h> |
30 | 30 | ||
31 | #undef _GNU_SOURCE | ||
32 | #include "../perf.h" | 31 | #include "../perf.h" |
33 | #include "util.h" | 32 | #include "util.h" |
34 | #include "trace-event.h" | 33 | #include "trace-event.h" |
diff --git a/tools/perf/util/ui/browsers/hists.c b/tools/perf/util/ui/browsers/hists.c index 1212a386a033..e81aef1f2569 100644 --- a/tools/perf/util/ui/browsers/hists.c +++ b/tools/perf/util/ui/browsers/hists.c | |||
@@ -1,6 +1,4 @@ | |||
1 | #define _GNU_SOURCE | ||
2 | #include <stdio.h> | 1 | #include <stdio.h> |
3 | #undef _GNU_SOURCE | ||
4 | #include "../libslang.h" | 2 | #include "../libslang.h" |
5 | #include <stdlib.h> | 3 | #include <stdlib.h> |
6 | #include <string.h> | 4 | #include <string.h> |
diff --git a/tools/perf/util/ui/helpline.c b/tools/perf/util/ui/helpline.c index 6ef3c5691762..4f48f5901b30 100644 --- a/tools/perf/util/ui/helpline.c +++ b/tools/perf/util/ui/helpline.c | |||
@@ -1,4 +1,3 @@ | |||
1 | #define _GNU_SOURCE | ||
2 | #include <stdio.h> | 1 | #include <stdio.h> |
3 | #include <stdlib.h> | 2 | #include <stdlib.h> |
4 | #include <string.h> | 3 | #include <string.h> |
diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h index b9c530cce79a..ecf9898169c8 100644 --- a/tools/perf/util/util.h +++ b/tools/perf/util/util.h | |||
@@ -40,7 +40,6 @@ | |||
40 | #define decimal_length(x) ((int)(sizeof(x) * 2.56 + 0.5) + 1) | 40 | #define decimal_length(x) ((int)(sizeof(x) * 2.56 + 0.5) + 1) |
41 | 41 | ||
42 | #define _ALL_SOURCE 1 | 42 | #define _ALL_SOURCE 1 |
43 | #define _GNU_SOURCE 1 | ||
44 | #define _BSD_SOURCE 1 | 43 | #define _BSD_SOURCE 1 |
45 | #define HAS_BOOL | 44 | #define HAS_BOOL |
46 | 45 | ||
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 7287bf5d1c9e..a91f980077d8 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c | |||
@@ -1543,7 +1543,7 @@ void mark_page_dirty_in_slot(struct kvm *kvm, struct kvm_memory_slot *memslot, | |||
1543 | if (memslot && memslot->dirty_bitmap) { | 1543 | if (memslot && memslot->dirty_bitmap) { |
1544 | unsigned long rel_gfn = gfn - memslot->base_gfn; | 1544 | unsigned long rel_gfn = gfn - memslot->base_gfn; |
1545 | 1545 | ||
1546 | if (!__test_and_set_bit_le(rel_gfn, memslot->dirty_bitmap)) | 1546 | if (!test_and_set_bit_le(rel_gfn, memslot->dirty_bitmap)) |
1547 | memslot->nr_dirty_pages++; | 1547 | memslot->nr_dirty_pages++; |
1548 | } | 1548 | } |
1549 | } | 1549 | } |