diff options
author | Dave Airlie <airlied@redhat.com> | 2015-01-26 18:48:08 -0500 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2015-01-26 18:48:08 -0500 |
commit | 22cbbceff65cb03ee37495b52f360809fa439293 (patch) | |
tree | 59ee71a72328743242a2357b0a0af8697d1640e4 | |
parent | 104b61590dcd5f71ff518e2b820e1cdf9d0350f2 (diff) | |
parent | 26bc420b59a38e4e6685a73345a0def461136dce (diff) |
Merge tag 'v3.19-rc6' into drm-fixes
Linux 3.19-rc6
pull in rc6 as the amdkfd fixes are based on it, and I'd rather
be doing the merges separately
143 files changed, 1428 insertions, 1583 deletions
diff --git a/Documentation/ABI/testing/sysfs-platform-dell-laptop b/Documentation/ABI/testing/sysfs-platform-dell-laptop deleted file mode 100644 index 7969443ef0ef..000000000000 --- a/Documentation/ABI/testing/sysfs-platform-dell-laptop +++ /dev/null | |||
@@ -1,60 +0,0 @@ | |||
1 | What: /sys/class/leds/dell::kbd_backlight/als_setting | ||
2 | Date: December 2014 | ||
3 | KernelVersion: 3.19 | ||
4 | Contact: Gabriele Mazzotta <gabriele.mzt@gmail.com>, | ||
5 | Pali Rohár <pali.rohar@gmail.com> | ||
6 | Description: | ||
7 | This file allows to control the automatic keyboard | ||
8 | illumination mode on some systems that have an ambient | ||
9 | light sensor. Write 1 to this file to enable the auto | ||
10 | mode, 0 to disable it. | ||
11 | |||
12 | What: /sys/class/leds/dell::kbd_backlight/start_triggers | ||
13 | Date: December 2014 | ||
14 | KernelVersion: 3.19 | ||
15 | Contact: Gabriele Mazzotta <gabriele.mzt@gmail.com>, | ||
16 | Pali Rohár <pali.rohar@gmail.com> | ||
17 | Description: | ||
18 | This file allows to control the input triggers that | ||
19 | turn on the keyboard backlight illumination that is | ||
20 | disabled because of inactivity. | ||
21 | Read the file to see the triggers available. The ones | ||
22 | enabled are preceded by '+', those disabled by '-'. | ||
23 | |||
24 | To enable a trigger, write its name preceded by '+' to | ||
25 | this file. To disable a trigger, write its name preceded | ||
26 | by '-' instead. | ||
27 | |||
28 | For example, to enable the keyboard as trigger run: | ||
29 | echo +keyboard > /sys/class/leds/dell::kbd_backlight/start_triggers | ||
30 | To disable it: | ||
31 | echo -keyboard > /sys/class/leds/dell::kbd_backlight/start_triggers | ||
32 | |||
33 | Note that not all the available triggers can be configured. | ||
34 | |||
35 | What: /sys/class/leds/dell::kbd_backlight/stop_timeout | ||
36 | Date: December 2014 | ||
37 | KernelVersion: 3.19 | ||
38 | Contact: Gabriele Mazzotta <gabriele.mzt@gmail.com>, | ||
39 | Pali Rohár <pali.rohar@gmail.com> | ||
40 | Description: | ||
41 | This file allows to specify the interval after which the | ||
42 | keyboard illumination is disabled because of inactivity. | ||
43 | The timeouts are expressed in seconds, minutes, hours and | ||
44 | days, for which the symbols are 's', 'm', 'h' and 'd' | ||
45 | respectively. | ||
46 | |||
47 | To configure the timeout, write to this file a value along | ||
48 | with any the above units. If no unit is specified, the value | ||
49 | is assumed to be expressed in seconds. | ||
50 | |||
51 | For example, to set the timeout to 10 minutes run: | ||
52 | echo 10m > /sys/class/leds/dell::kbd_backlight/stop_timeout | ||
53 | |||
54 | Note that when this file is read, the returned value might be | ||
55 | expressed in a different unit than the one used when the timeout | ||
56 | was set. | ||
57 | |||
58 | Also note that only some timeouts are supported and that | ||
59 | some systems might fall back to a specific timeout in case | ||
60 | an invalid timeout is written to this file. | ||
diff --git a/Documentation/devicetree/bindings/arm/arm-boards b/Documentation/devicetree/bindings/arm/arm-boards index 556c8665fdbf..b78564b2b201 100644 --- a/Documentation/devicetree/bindings/arm/arm-boards +++ b/Documentation/devicetree/bindings/arm/arm-boards | |||
@@ -23,7 +23,7 @@ Required nodes: | |||
23 | range of 0x200 bytes. | 23 | range of 0x200 bytes. |
24 | 24 | ||
25 | - syscon: the root node of the Integrator platforms must have a | 25 | - syscon: the root node of the Integrator platforms must have a |
26 | system controller node pointong to the control registers, | 26 | system controller node pointing to the control registers, |
27 | with the compatible string | 27 | with the compatible string |
28 | "arm,integrator-ap-syscon" | 28 | "arm,integrator-ap-syscon" |
29 | "arm,integrator-cp-syscon" | 29 | "arm,integrator-cp-syscon" |
diff --git a/Documentation/devicetree/bindings/arm/fw-cfg.txt b/Documentation/devicetree/bindings/arm/fw-cfg.txt new file mode 100644 index 000000000000..953fb640d9c4 --- /dev/null +++ b/Documentation/devicetree/bindings/arm/fw-cfg.txt | |||
@@ -0,0 +1,72 @@ | |||
1 | * QEMU Firmware Configuration bindings for ARM | ||
2 | |||
3 | QEMU's arm-softmmu and aarch64-softmmu emulation / virtualization targets | ||
4 | provide the following Firmware Configuration interface on the "virt" machine | ||
5 | type: | ||
6 | |||
7 | - A write-only, 16-bit wide selector (or control) register, | ||
8 | - a read-write, 64-bit wide data register. | ||
9 | |||
10 | QEMU exposes the control and data register to ARM guests as memory mapped | ||
11 | registers; their location is communicated to the guest's UEFI firmware in the | ||
12 | DTB that QEMU places at the bottom of the guest's DRAM. | ||
13 | |||
14 | The guest writes a selector value (a key) to the selector register, and then | ||
15 | can read the corresponding data (produced by QEMU) via the data register. If | ||
16 | the selected entry is writable, the guest can rewrite it through the data | ||
17 | register. | ||
18 | |||
19 | The selector register takes keys in big endian byte order. | ||
20 | |||
21 | The data register allows accesses with 8, 16, 32 and 64-bit width (only at | ||
22 | offset 0 of the register). Accesses larger than a byte are interpreted as | ||
23 | arrays, bundled together only for better performance. The bytes constituting | ||
24 | such a word, in increasing address order, correspond to the bytes that would | ||
25 | have been transferred by byte-wide accesses in chronological order. | ||
26 | |||
27 | The interface allows guest firmware to download various parameters and blobs | ||
28 | that affect how the firmware works and what tables it installs for the guest | ||
29 | OS. For example, boot order of devices, ACPI tables, SMBIOS tables, kernel and | ||
30 | initrd images for direct kernel booting, virtual machine UUID, SMP information, | ||
31 | virtual NUMA topology, and so on. | ||
32 | |||
33 | The authoritative registry of the valid selector values and their meanings is | ||
34 | the QEMU source code; the structure of the data blobs corresponding to the | ||
35 | individual key values is also defined in the QEMU source code. | ||
36 | |||
37 | The presence of the registers can be verified by selecting the "signature" blob | ||
38 | with key 0x0000, and reading four bytes from the data register. The returned | ||
39 | signature is "QEMU". | ||
40 | |||
41 | The outermost protocol (involving the write / read sequences of the control and | ||
42 | data registers) is expected to be versioned, and/or described by feature bits. | ||
43 | The interface revision / feature bitmap can be retrieved with key 0x0001. The | ||
44 | blob to be read from the data register has size 4, and it is to be interpreted | ||
45 | as a uint32_t value in little endian byte order. The current value | ||
46 | (corresponding to the above outer protocol) is zero. | ||
47 | |||
48 | The guest kernel is not expected to use these registers (although it is | ||
49 | certainly allowed to); the device tree bindings are documented here because | ||
50 | this is where device tree bindings reside in general. | ||
51 | |||
52 | Required properties: | ||
53 | |||
54 | - compatible: "qemu,fw-cfg-mmio". | ||
55 | |||
56 | - reg: the MMIO region used by the device. | ||
57 | * Bytes 0x0 to 0x7 cover the data register. | ||
58 | * Bytes 0x8 to 0x9 cover the selector register. | ||
59 | * Further registers may be appended to the region in case of future interface | ||
60 | revisions / feature bits. | ||
61 | |||
62 | Example: | ||
63 | |||
64 | / { | ||
65 | #size-cells = <0x2>; | ||
66 | #address-cells = <0x2>; | ||
67 | |||
68 | fw-cfg@9020000 { | ||
69 | compatible = "qemu,fw-cfg-mmio"; | ||
70 | reg = <0x0 0x9020000 0x0 0xa>; | ||
71 | }; | ||
72 | }; | ||
diff --git a/Documentation/devicetree/bindings/graph.txt b/Documentation/devicetree/bindings/graph.txt index 1a69c078adf2..fcb1c6a4787b 100644 --- a/Documentation/devicetree/bindings/graph.txt +++ b/Documentation/devicetree/bindings/graph.txt | |||
@@ -19,7 +19,7 @@ type of the connections, they just map their existence. Specific properties | |||
19 | may be described by specialized bindings depending on the type of connection. | 19 | may be described by specialized bindings depending on the type of connection. |
20 | 20 | ||
21 | To see how this binding applies to video pipelines, for example, see | 21 | To see how this binding applies to video pipelines, for example, see |
22 | Documentation/device-tree/bindings/media/video-interfaces.txt. | 22 | Documentation/devicetree/bindings/media/video-interfaces.txt. |
23 | Here the ports describe data interfaces, and the links between them are | 23 | Here the ports describe data interfaces, and the links between them are |
24 | the connecting data buses. A single port with multiple connections can | 24 | the connecting data buses. A single port with multiple connections can |
25 | correspond to multiple devices being connected to the same physical bus. | 25 | correspond to multiple devices being connected to the same physical bus. |
diff --git a/Documentation/devicetree/bindings/vendor-prefixes.txt b/Documentation/devicetree/bindings/vendor-prefixes.txt index b1df0ad1306c..d443279c95dc 100644 --- a/Documentation/devicetree/bindings/vendor-prefixes.txt +++ b/Documentation/devicetree/bindings/vendor-prefixes.txt | |||
@@ -9,7 +9,6 @@ ad Avionic Design GmbH | |||
9 | adapteva Adapteva, Inc. | 9 | adapteva Adapteva, Inc. |
10 | adi Analog Devices, Inc. | 10 | adi Analog Devices, Inc. |
11 | aeroflexgaisler Aeroflex Gaisler AB | 11 | aeroflexgaisler Aeroflex Gaisler AB |
12 | ak Asahi Kasei Corp. | ||
13 | allwinner Allwinner Technology Co., Ltd. | 12 | allwinner Allwinner Technology Co., Ltd. |
14 | altr Altera Corp. | 13 | altr Altera Corp. |
15 | amcc Applied Micro Circuits Corporation (APM, formally AMCC) | 14 | amcc Applied Micro Circuits Corporation (APM, formally AMCC) |
@@ -20,6 +19,7 @@ amstaos AMS-Taos Inc. | |||
20 | apm Applied Micro Circuits Corporation (APM) | 19 | apm Applied Micro Circuits Corporation (APM) |
21 | arm ARM Ltd. | 20 | arm ARM Ltd. |
22 | armadeus ARMadeus Systems SARL | 21 | armadeus ARMadeus Systems SARL |
22 | asahi-kasei Asahi Kasei Corp. | ||
23 | atmel Atmel Corporation | 23 | atmel Atmel Corporation |
24 | auo AU Optronics Corporation | 24 | auo AU Optronics Corporation |
25 | avago Avago Technologies | 25 | avago Avago Technologies |
@@ -127,6 +127,7 @@ pixcir PIXCIR MICROELECTRONICS Co., Ltd | |||
127 | powervr PowerVR (deprecated, use img) | 127 | powervr PowerVR (deprecated, use img) |
128 | qca Qualcomm Atheros, Inc. | 128 | qca Qualcomm Atheros, Inc. |
129 | qcom Qualcomm Technologies, Inc | 129 | qcom Qualcomm Technologies, Inc |
130 | qemu QEMU, a generic and open source machine emulator and virtualizer | ||
130 | qnap QNAP Systems, Inc. | 131 | qnap QNAP Systems, Inc. |
131 | radxa Radxa | 132 | radxa Radxa |
132 | raidsonic RaidSonic Technology GmbH | 133 | raidsonic RaidSonic Technology GmbH |
@@ -168,6 +169,7 @@ usi Universal Scientific Industrial Co., Ltd. | |||
168 | v3 V3 Semiconductor | 169 | v3 V3 Semiconductor |
169 | variscite Variscite Ltd. | 170 | variscite Variscite Ltd. |
170 | via VIA Technologies, Inc. | 171 | via VIA Technologies, Inc. |
172 | virtio Virtual I/O Device Specification, developed by the OASIS consortium | ||
171 | voipac Voipac Technologies s.r.o. | 173 | voipac Voipac Technologies s.r.o. |
172 | winbond Winbond Electronics corp. | 174 | winbond Winbond Electronics corp. |
173 | wlf Wolfson Microelectronics | 175 | wlf Wolfson Microelectronics |
diff --git a/MAINTAINERS b/MAINTAINERS index 93409ade65a5..2ebb056cbe0a 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -696,7 +696,7 @@ L: alsa-devel@alsa-project.org (moderated for non-subscribers) | |||
696 | W: http://blackfin.uclinux.org/ | 696 | W: http://blackfin.uclinux.org/ |
697 | S: Supported | 697 | S: Supported |
698 | F: sound/soc/blackfin/* | 698 | F: sound/soc/blackfin/* |
699 | 699 | ||
700 | ANALOG DEVICES INC IIO DRIVERS | 700 | ANALOG DEVICES INC IIO DRIVERS |
701 | M: Lars-Peter Clausen <lars@metafoo.de> | 701 | M: Lars-Peter Clausen <lars@metafoo.de> |
702 | M: Michael Hennerich <Michael.Hennerich@analog.com> | 702 | M: Michael Hennerich <Michael.Hennerich@analog.com> |
@@ -4750,14 +4750,14 @@ S: Supported | |||
4750 | F: drivers/net/ethernet/ibm/ibmveth.* | 4750 | F: drivers/net/ethernet/ibm/ibmveth.* |
4751 | 4751 | ||
4752 | IBM Power Virtual SCSI Device Drivers | 4752 | IBM Power Virtual SCSI Device Drivers |
4753 | M: Nathan Fontenot <nfont@linux.vnet.ibm.com> | 4753 | M: Tyrel Datwyler <tyreld@linux.vnet.ibm.com> |
4754 | L: linux-scsi@vger.kernel.org | 4754 | L: linux-scsi@vger.kernel.org |
4755 | S: Supported | 4755 | S: Supported |
4756 | F: drivers/scsi/ibmvscsi/ibmvscsi* | 4756 | F: drivers/scsi/ibmvscsi/ibmvscsi* |
4757 | F: drivers/scsi/ibmvscsi/viosrp.h | 4757 | F: drivers/scsi/ibmvscsi/viosrp.h |
4758 | 4758 | ||
4759 | IBM Power Virtual FC Device Drivers | 4759 | IBM Power Virtual FC Device Drivers |
4760 | M: Brian King <brking@linux.vnet.ibm.com> | 4760 | M: Tyrel Datwyler <tyreld@linux.vnet.ibm.com> |
4761 | L: linux-scsi@vger.kernel.org | 4761 | L: linux-scsi@vger.kernel.org |
4762 | S: Supported | 4762 | S: Supported |
4763 | F: drivers/scsi/ibmvscsi/ibmvfc* | 4763 | F: drivers/scsi/ibmvscsi/ibmvfc* |
@@ -4946,7 +4946,6 @@ K: \b(ABS|SYN)_MT_ | |||
4946 | INTEL C600 SERIES SAS CONTROLLER DRIVER | 4946 | INTEL C600 SERIES SAS CONTROLLER DRIVER |
4947 | M: Intel SCU Linux support <intel-linux-scu@intel.com> | 4947 | M: Intel SCU Linux support <intel-linux-scu@intel.com> |
4948 | M: Artur Paszkiewicz <artur.paszkiewicz@intel.com> | 4948 | M: Artur Paszkiewicz <artur.paszkiewicz@intel.com> |
4949 | M: Dave Jiang <dave.jiang@intel.com> | ||
4950 | L: linux-scsi@vger.kernel.org | 4949 | L: linux-scsi@vger.kernel.org |
4951 | T: git git://git.code.sf.net/p/intel-sas/isci | 4950 | T: git git://git.code.sf.net/p/intel-sas/isci |
4952 | S: Supported | 4951 | S: Supported |
@@ -7024,14 +7023,12 @@ OPEN FIRMWARE AND FLATTENED DEVICE TREE | |||
7024 | M: Grant Likely <grant.likely@linaro.org> | 7023 | M: Grant Likely <grant.likely@linaro.org> |
7025 | M: Rob Herring <robh+dt@kernel.org> | 7024 | M: Rob Herring <robh+dt@kernel.org> |
7026 | L: devicetree@vger.kernel.org | 7025 | L: devicetree@vger.kernel.org |
7027 | W: http://fdt.secretlab.ca | 7026 | W: http://www.devicetree.org/ |
7028 | T: git git://git.secretlab.ca/git/linux-2.6.git | 7027 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/glikely/linux.git |
7029 | S: Maintained | 7028 | S: Maintained |
7030 | F: drivers/of/ | 7029 | F: drivers/of/ |
7031 | F: include/linux/of*.h | 7030 | F: include/linux/of*.h |
7032 | F: scripts/dtc/ | 7031 | F: scripts/dtc/ |
7033 | K: of_get_property | ||
7034 | K: of_match_table | ||
7035 | 7032 | ||
7036 | OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS | 7033 | OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS |
7037 | M: Rob Herring <robh+dt@kernel.org> | 7034 | M: Rob Herring <robh+dt@kernel.org> |
@@ -7276,7 +7273,7 @@ S: Maintained | |||
7276 | F: drivers/pci/host/*layerscape* | 7273 | F: drivers/pci/host/*layerscape* |
7277 | 7274 | ||
7278 | PCI DRIVER FOR IMX6 | 7275 | PCI DRIVER FOR IMX6 |
7279 | M: Richard Zhu <r65037@freescale.com> | 7276 | M: Richard Zhu <Richard.Zhu@freescale.com> |
7280 | M: Lucas Stach <l.stach@pengutronix.de> | 7277 | M: Lucas Stach <l.stach@pengutronix.de> |
7281 | L: linux-pci@vger.kernel.org | 7278 | L: linux-pci@vger.kernel.org |
7282 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 7279 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
@@ -1,7 +1,7 @@ | |||
1 | VERSION = 3 | 1 | VERSION = 3 |
2 | PATCHLEVEL = 19 | 2 | PATCHLEVEL = 19 |
3 | SUBLEVEL = 0 | 3 | SUBLEVEL = 0 |
4 | EXTRAVERSION = -rc5 | 4 | EXTRAVERSION = -rc6 |
5 | NAME = Diseased Newt | 5 | NAME = Diseased Newt |
6 | 6 | ||
7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
diff --git a/arch/alpha/kernel/pci.c b/arch/alpha/kernel/pci.c index 076c35cd6cde..98a1525fa164 100644 --- a/arch/alpha/kernel/pci.c +++ b/arch/alpha/kernel/pci.c | |||
@@ -285,8 +285,12 @@ pcibios_claim_one_bus(struct pci_bus *b) | |||
285 | if (r->parent || !r->start || !r->flags) | 285 | if (r->parent || !r->start || !r->flags) |
286 | continue; | 286 | continue; |
287 | if (pci_has_flag(PCI_PROBE_ONLY) || | 287 | if (pci_has_flag(PCI_PROBE_ONLY) || |
288 | (r->flags & IORESOURCE_PCI_FIXED)) | 288 | (r->flags & IORESOURCE_PCI_FIXED)) { |
289 | pci_claim_resource(dev, i); | 289 | if (pci_claim_resource(dev, i) == 0) |
290 | continue; | ||
291 | |||
292 | pci_claim_bridge_resource(dev, i); | ||
293 | } | ||
290 | } | 294 | } |
291 | } | 295 | } |
292 | 296 | ||
diff --git a/arch/arm/boot/dts/dra7.dtsi b/arch/arm/boot/dts/dra7.dtsi index 22771bc1643a..63f8b007bdc5 100644 --- a/arch/arm/boot/dts/dra7.dtsi +++ b/arch/arm/boot/dts/dra7.dtsi | |||
@@ -1257,6 +1257,8 @@ | |||
1257 | tx-fifo-resize; | 1257 | tx-fifo-resize; |
1258 | maximum-speed = "super-speed"; | 1258 | maximum-speed = "super-speed"; |
1259 | dr_mode = "otg"; | 1259 | dr_mode = "otg"; |
1260 | snps,dis_u3_susphy_quirk; | ||
1261 | snps,dis_u2_susphy_quirk; | ||
1260 | }; | 1262 | }; |
1261 | }; | 1263 | }; |
1262 | 1264 | ||
@@ -1278,6 +1280,8 @@ | |||
1278 | tx-fifo-resize; | 1280 | tx-fifo-resize; |
1279 | maximum-speed = "high-speed"; | 1281 | maximum-speed = "high-speed"; |
1280 | dr_mode = "otg"; | 1282 | dr_mode = "otg"; |
1283 | snps,dis_u3_susphy_quirk; | ||
1284 | snps,dis_u2_susphy_quirk; | ||
1281 | }; | 1285 | }; |
1282 | }; | 1286 | }; |
1283 | 1287 | ||
@@ -1299,6 +1303,8 @@ | |||
1299 | tx-fifo-resize; | 1303 | tx-fifo-resize; |
1300 | maximum-speed = "high-speed"; | 1304 | maximum-speed = "high-speed"; |
1301 | dr_mode = "otg"; | 1305 | dr_mode = "otg"; |
1306 | snps,dis_u3_susphy_quirk; | ||
1307 | snps,dis_u2_susphy_quirk; | ||
1302 | }; | 1308 | }; |
1303 | }; | 1309 | }; |
1304 | 1310 | ||
diff --git a/arch/arm/boot/dts/imx25.dtsi b/arch/arm/boot/dts/imx25.dtsi index d238676a9107..e4d3aecc4ed2 100644 --- a/arch/arm/boot/dts/imx25.dtsi +++ b/arch/arm/boot/dts/imx25.dtsi | |||
@@ -369,7 +369,7 @@ | |||
369 | compatible = "fsl,imx25-pwm", "fsl,imx27-pwm"; | 369 | compatible = "fsl,imx25-pwm", "fsl,imx27-pwm"; |
370 | #pwm-cells = <2>; | 370 | #pwm-cells = <2>; |
371 | reg = <0x53fa0000 0x4000>; | 371 | reg = <0x53fa0000 0x4000>; |
372 | clocks = <&clks 106>, <&clks 36>; | 372 | clocks = <&clks 106>, <&clks 52>; |
373 | clock-names = "ipg", "per"; | 373 | clock-names = "ipg", "per"; |
374 | interrupts = <36>; | 374 | interrupts = <36>; |
375 | }; | 375 | }; |
@@ -388,7 +388,7 @@ | |||
388 | compatible = "fsl,imx25-pwm", "fsl,imx27-pwm"; | 388 | compatible = "fsl,imx25-pwm", "fsl,imx27-pwm"; |
389 | #pwm-cells = <2>; | 389 | #pwm-cells = <2>; |
390 | reg = <0x53fa8000 0x4000>; | 390 | reg = <0x53fa8000 0x4000>; |
391 | clocks = <&clks 107>, <&clks 36>; | 391 | clocks = <&clks 107>, <&clks 52>; |
392 | clock-names = "ipg", "per"; | 392 | clock-names = "ipg", "per"; |
393 | interrupts = <41>; | 393 | interrupts = <41>; |
394 | }; | 394 | }; |
@@ -429,7 +429,7 @@ | |||
429 | pwm4: pwm@53fc8000 { | 429 | pwm4: pwm@53fc8000 { |
430 | compatible = "fsl,imx25-pwm", "fsl,imx27-pwm"; | 430 | compatible = "fsl,imx25-pwm", "fsl,imx27-pwm"; |
431 | reg = <0x53fc8000 0x4000>; | 431 | reg = <0x53fc8000 0x4000>; |
432 | clocks = <&clks 108>, <&clks 36>; | 432 | clocks = <&clks 108>, <&clks 52>; |
433 | clock-names = "ipg", "per"; | 433 | clock-names = "ipg", "per"; |
434 | interrupts = <42>; | 434 | interrupts = <42>; |
435 | }; | 435 | }; |
@@ -476,7 +476,7 @@ | |||
476 | compatible = "fsl,imx25-pwm", "fsl,imx27-pwm"; | 476 | compatible = "fsl,imx25-pwm", "fsl,imx27-pwm"; |
477 | #pwm-cells = <2>; | 477 | #pwm-cells = <2>; |
478 | reg = <0x53fe0000 0x4000>; | 478 | reg = <0x53fe0000 0x4000>; |
479 | clocks = <&clks 105>, <&clks 36>; | 479 | clocks = <&clks 105>, <&clks 52>; |
480 | clock-names = "ipg", "per"; | 480 | clock-names = "ipg", "per"; |
481 | interrupts = <26>; | 481 | interrupts = <26>; |
482 | }; | 482 | }; |
diff --git a/arch/arm/boot/dts/tegra20-seaboard.dts b/arch/arm/boot/dts/tegra20-seaboard.dts index ea282c7c0ca5..e2fed2712249 100644 --- a/arch/arm/boot/dts/tegra20-seaboard.dts +++ b/arch/arm/boot/dts/tegra20-seaboard.dts | |||
@@ -406,7 +406,7 @@ | |||
406 | clock-frequency = <400000>; | 406 | clock-frequency = <400000>; |
407 | 407 | ||
408 | magnetometer@c { | 408 | magnetometer@c { |
409 | compatible = "ak,ak8975"; | 409 | compatible = "asahi-kasei,ak8975"; |
410 | reg = <0xc>; | 410 | reg = <0xc>; |
411 | interrupt-parent = <&gpio>; | 411 | interrupt-parent = <&gpio>; |
412 | interrupts = <TEGRA_GPIO(N, 5) IRQ_TYPE_LEVEL_HIGH>; | 412 | interrupts = <TEGRA_GPIO(N, 5) IRQ_TYPE_LEVEL_HIGH>; |
diff --git a/arch/arm/kernel/entry-header.S b/arch/arm/kernel/entry-header.S index 4176df721bf0..1a0045abead7 100644 --- a/arch/arm/kernel/entry-header.S +++ b/arch/arm/kernel/entry-header.S | |||
@@ -253,21 +253,22 @@ | |||
253 | .endm | 253 | .endm |
254 | 254 | ||
255 | .macro restore_user_regs, fast = 0, offset = 0 | 255 | .macro restore_user_regs, fast = 0, offset = 0 |
256 | ldr r1, [sp, #\offset + S_PSR] @ get calling cpsr | 256 | mov r2, sp |
257 | ldr lr, [sp, #\offset + S_PC]! @ get pc | 257 | ldr r1, [r2, #\offset + S_PSR] @ get calling cpsr |
258 | ldr lr, [r2, #\offset + S_PC]! @ get pc | ||
258 | msr spsr_cxsf, r1 @ save in spsr_svc | 259 | msr spsr_cxsf, r1 @ save in spsr_svc |
259 | #if defined(CONFIG_CPU_V6) || defined(CONFIG_CPU_32v6K) | 260 | #if defined(CONFIG_CPU_V6) || defined(CONFIG_CPU_32v6K) |
260 | @ We must avoid clrex due to Cortex-A15 erratum #830321 | 261 | @ We must avoid clrex due to Cortex-A15 erratum #830321 |
261 | strex r1, r2, [sp] @ clear the exclusive monitor | 262 | strex r1, r2, [r2] @ clear the exclusive monitor |
262 | #endif | 263 | #endif |
263 | .if \fast | 264 | .if \fast |
264 | ldmdb sp, {r1 - lr}^ @ get calling r1 - lr | 265 | ldmdb r2, {r1 - lr}^ @ get calling r1 - lr |
265 | .else | 266 | .else |
266 | ldmdb sp, {r0 - lr}^ @ get calling r0 - lr | 267 | ldmdb r2, {r0 - lr}^ @ get calling r0 - lr |
267 | .endif | 268 | .endif |
268 | mov r0, r0 @ ARMv5T and earlier require a nop | 269 | mov r0, r0 @ ARMv5T and earlier require a nop |
269 | @ after ldm {}^ | 270 | @ after ldm {}^ |
270 | add sp, sp, #S_FRAME_SIZE - S_PC | 271 | add sp, sp, #\offset + S_FRAME_SIZE |
271 | movs pc, lr @ return & move spsr_svc into cpsr | 272 | movs pc, lr @ return & move spsr_svc into cpsr |
272 | .endm | 273 | .endm |
273 | 274 | ||
diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c index f7c65adaa428..557e128e4df0 100644 --- a/arch/arm/kernel/perf_event.c +++ b/arch/arm/kernel/perf_event.c | |||
@@ -116,8 +116,14 @@ int armpmu_event_set_period(struct perf_event *event) | |||
116 | ret = 1; | 116 | ret = 1; |
117 | } | 117 | } |
118 | 118 | ||
119 | if (left > (s64)armpmu->max_period) | 119 | /* |
120 | left = armpmu->max_period; | 120 | * Limit the maximum period to prevent the counter value |
121 | * from overtaking the one we are about to program. In | ||
122 | * effect we are reducing max_period to account for | ||
123 | * interrupt latency (and we are being very conservative). | ||
124 | */ | ||
125 | if (left > (armpmu->max_period >> 1)) | ||
126 | left = armpmu->max_period >> 1; | ||
121 | 127 | ||
122 | local64_set(&hwc->prev_count, (u64)-left); | 128 | local64_set(&hwc->prev_count, (u64)-left); |
123 | 129 | ||
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index 715ae19bc7c8..e55408e96559 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c | |||
@@ -657,10 +657,13 @@ int __init arm_add_memory(u64 start, u64 size) | |||
657 | 657 | ||
658 | /* | 658 | /* |
659 | * Ensure that start/size are aligned to a page boundary. | 659 | * Ensure that start/size are aligned to a page boundary. |
660 | * Size is appropriately rounded down, start is rounded up. | 660 | * Size is rounded down, start is rounded up. |
661 | */ | 661 | */ |
662 | size -= start & ~PAGE_MASK; | ||
663 | aligned_start = PAGE_ALIGN(start); | 662 | aligned_start = PAGE_ALIGN(start); |
663 | if (aligned_start > start + size) | ||
664 | size = 0; | ||
665 | else | ||
666 | size -= aligned_start - start; | ||
664 | 667 | ||
665 | #ifndef CONFIG_ARCH_PHYS_ADDR_T_64BIT | 668 | #ifndef CONFIG_ARCH_PHYS_ADDR_T_64BIT |
666 | if (aligned_start > ULONG_MAX) { | 669 | if (aligned_start > ULONG_MAX) { |
diff --git a/arch/arm/mach-mvebu/coherency.c b/arch/arm/mach-mvebu/coherency.c index 3585cb394e9b..caa21e9b8cd9 100644 --- a/arch/arm/mach-mvebu/coherency.c +++ b/arch/arm/mach-mvebu/coherency.c | |||
@@ -246,9 +246,14 @@ static int coherency_type(void) | |||
246 | return type; | 246 | return type; |
247 | } | 247 | } |
248 | 248 | ||
249 | /* | ||
250 | * As a precaution, we currently completely disable hardware I/O | ||
251 | * coherency, until enough testing is done with automatic I/O | ||
252 | * synchronization barriers to validate that it is a proper solution. | ||
253 | */ | ||
249 | int coherency_available(void) | 254 | int coherency_available(void) |
250 | { | 255 | { |
251 | return coherency_type() != COHERENCY_FABRIC_TYPE_NONE; | 256 | return false; |
252 | } | 257 | } |
253 | 258 | ||
254 | int __init coherency_init(void) | 259 | int __init coherency_init(void) |
diff --git a/arch/arm/mach-omap2/common.h b/arch/arm/mach-omap2/common.h index db57741c9c8a..64e44d6d07c0 100644 --- a/arch/arm/mach-omap2/common.h +++ b/arch/arm/mach-omap2/common.h | |||
@@ -211,6 +211,7 @@ extern struct device *omap2_get_iva_device(void); | |||
211 | extern struct device *omap2_get_l3_device(void); | 211 | extern struct device *omap2_get_l3_device(void); |
212 | extern struct device *omap4_get_dsp_device(void); | 212 | extern struct device *omap4_get_dsp_device(void); |
213 | 213 | ||
214 | unsigned int omap4_xlate_irq(unsigned int hwirq); | ||
214 | void omap_gic_of_init(void); | 215 | void omap_gic_of_init(void); |
215 | 216 | ||
216 | #ifdef CONFIG_CACHE_L2X0 | 217 | #ifdef CONFIG_CACHE_L2X0 |
diff --git a/arch/arm/mach-omap2/omap4-common.c b/arch/arm/mach-omap2/omap4-common.c index b7cb44abe49b..cc30e49a4cc2 100644 --- a/arch/arm/mach-omap2/omap4-common.c +++ b/arch/arm/mach-omap2/omap4-common.c | |||
@@ -256,6 +256,38 @@ static int __init omap4_sar_ram_init(void) | |||
256 | } | 256 | } |
257 | omap_early_initcall(omap4_sar_ram_init); | 257 | omap_early_initcall(omap4_sar_ram_init); |
258 | 258 | ||
259 | static struct of_device_id gic_match[] = { | ||
260 | { .compatible = "arm,cortex-a9-gic", }, | ||
261 | { .compatible = "arm,cortex-a15-gic", }, | ||
262 | { }, | ||
263 | }; | ||
264 | |||
265 | static struct device_node *gic_node; | ||
266 | |||
267 | unsigned int omap4_xlate_irq(unsigned int hwirq) | ||
268 | { | ||
269 | struct of_phandle_args irq_data; | ||
270 | unsigned int irq; | ||
271 | |||
272 | if (!gic_node) | ||
273 | gic_node = of_find_matching_node(NULL, gic_match); | ||
274 | |||
275 | if (WARN_ON(!gic_node)) | ||
276 | return hwirq; | ||
277 | |||
278 | irq_data.np = gic_node; | ||
279 | irq_data.args_count = 3; | ||
280 | irq_data.args[0] = 0; | ||
281 | irq_data.args[1] = hwirq - OMAP44XX_IRQ_GIC_START; | ||
282 | irq_data.args[2] = IRQ_TYPE_LEVEL_HIGH; | ||
283 | |||
284 | irq = irq_create_of_mapping(&irq_data); | ||
285 | if (WARN_ON(!irq)) | ||
286 | irq = hwirq; | ||
287 | |||
288 | return irq; | ||
289 | } | ||
290 | |||
259 | void __init omap_gic_of_init(void) | 291 | void __init omap_gic_of_init(void) |
260 | { | 292 | { |
261 | struct device_node *np; | 293 | struct device_node *np; |
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index cbb908dc5cf0..9025ffffd2dc 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c | |||
@@ -3534,9 +3534,15 @@ int omap_hwmod_fill_resources(struct omap_hwmod *oh, struct resource *res) | |||
3534 | 3534 | ||
3535 | mpu_irqs_cnt = _count_mpu_irqs(oh); | 3535 | mpu_irqs_cnt = _count_mpu_irqs(oh); |
3536 | for (i = 0; i < mpu_irqs_cnt; i++) { | 3536 | for (i = 0; i < mpu_irqs_cnt; i++) { |
3537 | unsigned int irq; | ||
3538 | |||
3539 | if (oh->xlate_irq) | ||
3540 | irq = oh->xlate_irq((oh->mpu_irqs + i)->irq); | ||
3541 | else | ||
3542 | irq = (oh->mpu_irqs + i)->irq; | ||
3537 | (res + r)->name = (oh->mpu_irqs + i)->name; | 3543 | (res + r)->name = (oh->mpu_irqs + i)->name; |
3538 | (res + r)->start = (oh->mpu_irqs + i)->irq; | 3544 | (res + r)->start = irq; |
3539 | (res + r)->end = (oh->mpu_irqs + i)->irq; | 3545 | (res + r)->end = irq; |
3540 | (res + r)->flags = IORESOURCE_IRQ; | 3546 | (res + r)->flags = IORESOURCE_IRQ; |
3541 | r++; | 3547 | r++; |
3542 | } | 3548 | } |
diff --git a/arch/arm/mach-omap2/omap_hwmod.h b/arch/arm/mach-omap2/omap_hwmod.h index 35ca6efbec31..5b42fafcaf55 100644 --- a/arch/arm/mach-omap2/omap_hwmod.h +++ b/arch/arm/mach-omap2/omap_hwmod.h | |||
@@ -676,6 +676,7 @@ struct omap_hwmod { | |||
676 | spinlock_t _lock; | 676 | spinlock_t _lock; |
677 | struct list_head node; | 677 | struct list_head node; |
678 | struct omap_hwmod_ocp_if *_mpu_port; | 678 | struct omap_hwmod_ocp_if *_mpu_port; |
679 | unsigned int (*xlate_irq)(unsigned int); | ||
679 | u16 flags; | 680 | u16 flags; |
680 | u8 mpu_rt_idx; | 681 | u8 mpu_rt_idx; |
681 | u8 response_lat; | 682 | u8 response_lat; |
diff --git a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c index c314b3c31117..f5e68a782025 100644 --- a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c | |||
@@ -479,6 +479,7 @@ static struct omap_hwmod omap44xx_dma_system_hwmod = { | |||
479 | .class = &omap44xx_dma_hwmod_class, | 479 | .class = &omap44xx_dma_hwmod_class, |
480 | .clkdm_name = "l3_dma_clkdm", | 480 | .clkdm_name = "l3_dma_clkdm", |
481 | .mpu_irqs = omap44xx_dma_system_irqs, | 481 | .mpu_irqs = omap44xx_dma_system_irqs, |
482 | .xlate_irq = omap4_xlate_irq, | ||
482 | .main_clk = "l3_div_ck", | 483 | .main_clk = "l3_div_ck", |
483 | .prcm = { | 484 | .prcm = { |
484 | .omap4 = { | 485 | .omap4 = { |
@@ -640,6 +641,7 @@ static struct omap_hwmod omap44xx_dss_dispc_hwmod = { | |||
640 | .class = &omap44xx_dispc_hwmod_class, | 641 | .class = &omap44xx_dispc_hwmod_class, |
641 | .clkdm_name = "l3_dss_clkdm", | 642 | .clkdm_name = "l3_dss_clkdm", |
642 | .mpu_irqs = omap44xx_dss_dispc_irqs, | 643 | .mpu_irqs = omap44xx_dss_dispc_irqs, |
644 | .xlate_irq = omap4_xlate_irq, | ||
643 | .sdma_reqs = omap44xx_dss_dispc_sdma_reqs, | 645 | .sdma_reqs = omap44xx_dss_dispc_sdma_reqs, |
644 | .main_clk = "dss_dss_clk", | 646 | .main_clk = "dss_dss_clk", |
645 | .prcm = { | 647 | .prcm = { |
@@ -693,6 +695,7 @@ static struct omap_hwmod omap44xx_dss_dsi1_hwmod = { | |||
693 | .class = &omap44xx_dsi_hwmod_class, | 695 | .class = &omap44xx_dsi_hwmod_class, |
694 | .clkdm_name = "l3_dss_clkdm", | 696 | .clkdm_name = "l3_dss_clkdm", |
695 | .mpu_irqs = omap44xx_dss_dsi1_irqs, | 697 | .mpu_irqs = omap44xx_dss_dsi1_irqs, |
698 | .xlate_irq = omap4_xlate_irq, | ||
696 | .sdma_reqs = omap44xx_dss_dsi1_sdma_reqs, | 699 | .sdma_reqs = omap44xx_dss_dsi1_sdma_reqs, |
697 | .main_clk = "dss_dss_clk", | 700 | .main_clk = "dss_dss_clk", |
698 | .prcm = { | 701 | .prcm = { |
@@ -726,6 +729,7 @@ static struct omap_hwmod omap44xx_dss_dsi2_hwmod = { | |||
726 | .class = &omap44xx_dsi_hwmod_class, | 729 | .class = &omap44xx_dsi_hwmod_class, |
727 | .clkdm_name = "l3_dss_clkdm", | 730 | .clkdm_name = "l3_dss_clkdm", |
728 | .mpu_irqs = omap44xx_dss_dsi2_irqs, | 731 | .mpu_irqs = omap44xx_dss_dsi2_irqs, |
732 | .xlate_irq = omap4_xlate_irq, | ||
729 | .sdma_reqs = omap44xx_dss_dsi2_sdma_reqs, | 733 | .sdma_reqs = omap44xx_dss_dsi2_sdma_reqs, |
730 | .main_clk = "dss_dss_clk", | 734 | .main_clk = "dss_dss_clk", |
731 | .prcm = { | 735 | .prcm = { |
@@ -784,6 +788,7 @@ static struct omap_hwmod omap44xx_dss_hdmi_hwmod = { | |||
784 | */ | 788 | */ |
785 | .flags = HWMOD_SWSUP_SIDLE, | 789 | .flags = HWMOD_SWSUP_SIDLE, |
786 | .mpu_irqs = omap44xx_dss_hdmi_irqs, | 790 | .mpu_irqs = omap44xx_dss_hdmi_irqs, |
791 | .xlate_irq = omap4_xlate_irq, | ||
787 | .sdma_reqs = omap44xx_dss_hdmi_sdma_reqs, | 792 | .sdma_reqs = omap44xx_dss_hdmi_sdma_reqs, |
788 | .main_clk = "dss_48mhz_clk", | 793 | .main_clk = "dss_48mhz_clk", |
789 | .prcm = { | 794 | .prcm = { |
diff --git a/arch/arm/mach-omap2/omap_hwmod_54xx_data.c b/arch/arm/mach-omap2/omap_hwmod_54xx_data.c index 3e9523084b2a..7c3fac035e93 100644 --- a/arch/arm/mach-omap2/omap_hwmod_54xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_54xx_data.c | |||
@@ -288,6 +288,7 @@ static struct omap_hwmod omap54xx_dma_system_hwmod = { | |||
288 | .class = &omap54xx_dma_hwmod_class, | 288 | .class = &omap54xx_dma_hwmod_class, |
289 | .clkdm_name = "dma_clkdm", | 289 | .clkdm_name = "dma_clkdm", |
290 | .mpu_irqs = omap54xx_dma_system_irqs, | 290 | .mpu_irqs = omap54xx_dma_system_irqs, |
291 | .xlate_irq = omap4_xlate_irq, | ||
291 | .main_clk = "l3_iclk_div", | 292 | .main_clk = "l3_iclk_div", |
292 | .prcm = { | 293 | .prcm = { |
293 | .omap4 = { | 294 | .omap4 = { |
diff --git a/arch/arm/mach-omap2/prcm-common.h b/arch/arm/mach-omap2/prcm-common.h index a8e4b582c527..6163d66102a3 100644 --- a/arch/arm/mach-omap2/prcm-common.h +++ b/arch/arm/mach-omap2/prcm-common.h | |||
@@ -498,6 +498,7 @@ struct omap_prcm_irq_setup { | |||
498 | u8 nr_irqs; | 498 | u8 nr_irqs; |
499 | const struct omap_prcm_irq *irqs; | 499 | const struct omap_prcm_irq *irqs; |
500 | int irq; | 500 | int irq; |
501 | unsigned int (*xlate_irq)(unsigned int); | ||
501 | void (*read_pending_irqs)(unsigned long *events); | 502 | void (*read_pending_irqs)(unsigned long *events); |
502 | void (*ocp_barrier)(void); | 503 | void (*ocp_barrier)(void); |
503 | void (*save_and_clear_irqen)(u32 *saved_mask); | 504 | void (*save_and_clear_irqen)(u32 *saved_mask); |
diff --git a/arch/arm/mach-omap2/prm44xx.c b/arch/arm/mach-omap2/prm44xx.c index cc170fb81ff7..408c64efb807 100644 --- a/arch/arm/mach-omap2/prm44xx.c +++ b/arch/arm/mach-omap2/prm44xx.c | |||
@@ -49,6 +49,7 @@ static struct omap_prcm_irq_setup omap4_prcm_irq_setup = { | |||
49 | .irqs = omap4_prcm_irqs, | 49 | .irqs = omap4_prcm_irqs, |
50 | .nr_irqs = ARRAY_SIZE(omap4_prcm_irqs), | 50 | .nr_irqs = ARRAY_SIZE(omap4_prcm_irqs), |
51 | .irq = 11 + OMAP44XX_IRQ_GIC_START, | 51 | .irq = 11 + OMAP44XX_IRQ_GIC_START, |
52 | .xlate_irq = omap4_xlate_irq, | ||
52 | .read_pending_irqs = &omap44xx_prm_read_pending_irqs, | 53 | .read_pending_irqs = &omap44xx_prm_read_pending_irqs, |
53 | .ocp_barrier = &omap44xx_prm_ocp_barrier, | 54 | .ocp_barrier = &omap44xx_prm_ocp_barrier, |
54 | .save_and_clear_irqen = &omap44xx_prm_save_and_clear_irqen, | 55 | .save_and_clear_irqen = &omap44xx_prm_save_and_clear_irqen, |
@@ -751,8 +752,10 @@ static int omap44xx_prm_late_init(void) | |||
751 | } | 752 | } |
752 | 753 | ||
753 | /* Once OMAP4 DT is filled as well */ | 754 | /* Once OMAP4 DT is filled as well */ |
754 | if (irq_num >= 0) | 755 | if (irq_num >= 0) { |
755 | omap4_prcm_irq_setup.irq = irq_num; | 756 | omap4_prcm_irq_setup.irq = irq_num; |
757 | omap4_prcm_irq_setup.xlate_irq = NULL; | ||
758 | } | ||
756 | } | 759 | } |
757 | 760 | ||
758 | omap44xx_prm_enable_io_wakeup(); | 761 | omap44xx_prm_enable_io_wakeup(); |
diff --git a/arch/arm/mach-omap2/prm_common.c b/arch/arm/mach-omap2/prm_common.c index 779940cb6e56..dea2833ca627 100644 --- a/arch/arm/mach-omap2/prm_common.c +++ b/arch/arm/mach-omap2/prm_common.c | |||
@@ -187,6 +187,7 @@ int omap_prcm_event_to_irq(const char *name) | |||
187 | */ | 187 | */ |
188 | void omap_prcm_irq_cleanup(void) | 188 | void omap_prcm_irq_cleanup(void) |
189 | { | 189 | { |
190 | unsigned int irq; | ||
190 | int i; | 191 | int i; |
191 | 192 | ||
192 | if (!prcm_irq_setup) { | 193 | if (!prcm_irq_setup) { |
@@ -211,7 +212,11 @@ void omap_prcm_irq_cleanup(void) | |||
211 | kfree(prcm_irq_setup->priority_mask); | 212 | kfree(prcm_irq_setup->priority_mask); |
212 | prcm_irq_setup->priority_mask = NULL; | 213 | prcm_irq_setup->priority_mask = NULL; |
213 | 214 | ||
214 | irq_set_chained_handler(prcm_irq_setup->irq, NULL); | 215 | if (prcm_irq_setup->xlate_irq) |
216 | irq = prcm_irq_setup->xlate_irq(prcm_irq_setup->irq); | ||
217 | else | ||
218 | irq = prcm_irq_setup->irq; | ||
219 | irq_set_chained_handler(irq, NULL); | ||
215 | 220 | ||
216 | if (prcm_irq_setup->base_irq > 0) | 221 | if (prcm_irq_setup->base_irq > 0) |
217 | irq_free_descs(prcm_irq_setup->base_irq, | 222 | irq_free_descs(prcm_irq_setup->base_irq, |
@@ -259,6 +264,7 @@ int omap_prcm_register_chain_handler(struct omap_prcm_irq_setup *irq_setup) | |||
259 | int offset, i; | 264 | int offset, i; |
260 | struct irq_chip_generic *gc; | 265 | struct irq_chip_generic *gc; |
261 | struct irq_chip_type *ct; | 266 | struct irq_chip_type *ct; |
267 | unsigned int irq; | ||
262 | 268 | ||
263 | if (!irq_setup) | 269 | if (!irq_setup) |
264 | return -EINVAL; | 270 | return -EINVAL; |
@@ -298,7 +304,11 @@ int omap_prcm_register_chain_handler(struct omap_prcm_irq_setup *irq_setup) | |||
298 | 1 << (offset & 0x1f); | 304 | 1 << (offset & 0x1f); |
299 | } | 305 | } |
300 | 306 | ||
301 | irq_set_chained_handler(irq_setup->irq, omap_prcm_irq_handler); | 307 | if (irq_setup->xlate_irq) |
308 | irq = irq_setup->xlate_irq(irq_setup->irq); | ||
309 | else | ||
310 | irq = irq_setup->irq; | ||
311 | irq_set_chained_handler(irq, omap_prcm_irq_handler); | ||
302 | 312 | ||
303 | irq_setup->base_irq = irq_alloc_descs(-1, 0, irq_setup->nr_regs * 32, | 313 | irq_setup->base_irq = irq_alloc_descs(-1, 0, irq_setup->nr_regs * 32, |
304 | 0); | 314 | 0); |
diff --git a/arch/arm/mach-omap2/twl-common.c b/arch/arm/mach-omap2/twl-common.c index 4457e731f7a4..292eca0e78ed 100644 --- a/arch/arm/mach-omap2/twl-common.c +++ b/arch/arm/mach-omap2/twl-common.c | |||
@@ -66,19 +66,24 @@ void __init omap_pmic_init(int bus, u32 clkrate, | |||
66 | omap_register_i2c_bus(bus, clkrate, &pmic_i2c_board_info, 1); | 66 | omap_register_i2c_bus(bus, clkrate, &pmic_i2c_board_info, 1); |
67 | } | 67 | } |
68 | 68 | ||
69 | #ifdef CONFIG_ARCH_OMAP4 | ||
69 | void __init omap4_pmic_init(const char *pmic_type, | 70 | void __init omap4_pmic_init(const char *pmic_type, |
70 | struct twl4030_platform_data *pmic_data, | 71 | struct twl4030_platform_data *pmic_data, |
71 | struct i2c_board_info *devices, int nr_devices) | 72 | struct i2c_board_info *devices, int nr_devices) |
72 | { | 73 | { |
73 | /* PMIC part*/ | 74 | /* PMIC part*/ |
75 | unsigned int irq; | ||
76 | |||
74 | omap_mux_init_signal("sys_nirq1", OMAP_PIN_INPUT_PULLUP | OMAP_PIN_OFF_WAKEUPENABLE); | 77 | omap_mux_init_signal("sys_nirq1", OMAP_PIN_INPUT_PULLUP | OMAP_PIN_OFF_WAKEUPENABLE); |
75 | omap_mux_init_signal("fref_clk0_out.sys_drm_msecure", OMAP_PIN_OUTPUT); | 78 | omap_mux_init_signal("fref_clk0_out.sys_drm_msecure", OMAP_PIN_OUTPUT); |
76 | omap_pmic_init(1, 400, pmic_type, 7 + OMAP44XX_IRQ_GIC_START, pmic_data); | 79 | irq = omap4_xlate_irq(7 + OMAP44XX_IRQ_GIC_START); |
80 | omap_pmic_init(1, 400, pmic_type, irq, pmic_data); | ||
77 | 81 | ||
78 | /* Register additional devices on i2c1 bus if needed */ | 82 | /* Register additional devices on i2c1 bus if needed */ |
79 | if (devices) | 83 | if (devices) |
80 | i2c_register_board_info(1, devices, nr_devices); | 84 | i2c_register_board_info(1, devices, nr_devices); |
81 | } | 85 | } |
86 | #endif | ||
82 | 87 | ||
83 | void __init omap_pmic_late_init(void) | 88 | void __init omap_pmic_late_init(void) |
84 | { | 89 | { |
diff --git a/arch/arm/mach-shmobile/setup-r8a7778.c b/arch/arm/mach-shmobile/setup-r8a7778.c index 170bd146ba17..cef8895a9b82 100644 --- a/arch/arm/mach-shmobile/setup-r8a7778.c +++ b/arch/arm/mach-shmobile/setup-r8a7778.c | |||
@@ -576,11 +576,18 @@ void __init r8a7778_init_irq_extpin(int irlm) | |||
576 | void __init r8a7778_init_irq_dt(void) | 576 | void __init r8a7778_init_irq_dt(void) |
577 | { | 577 | { |
578 | void __iomem *base = ioremap_nocache(0xfe700000, 0x00100000); | 578 | void __iomem *base = ioremap_nocache(0xfe700000, 0x00100000); |
579 | #ifdef CONFIG_ARCH_SHMOBILE_LEGACY | ||
580 | void __iomem *gic_dist_base = ioremap_nocache(0xfe438000, 0x1000); | ||
581 | void __iomem *gic_cpu_base = ioremap_nocache(0xfe430000, 0x1000); | ||
582 | #endif | ||
579 | 583 | ||
580 | BUG_ON(!base); | 584 | BUG_ON(!base); |
581 | 585 | ||
586 | #ifdef CONFIG_ARCH_SHMOBILE_LEGACY | ||
587 | gic_init(0, 29, gic_dist_base, gic_cpu_base); | ||
588 | #else | ||
582 | irqchip_init(); | 589 | irqchip_init(); |
583 | 590 | #endif | |
584 | /* route all interrupts to ARM */ | 591 | /* route all interrupts to ARM */ |
585 | __raw_writel(0x73ffffff, base + INT2NTSR0); | 592 | __raw_writel(0x73ffffff, base + INT2NTSR0); |
586 | __raw_writel(0xffffffff, base + INT2NTSR1); | 593 | __raw_writel(0xffffffff, base + INT2NTSR1); |
diff --git a/arch/arm/mach-shmobile/setup-r8a7779.c b/arch/arm/mach-shmobile/setup-r8a7779.c index 6156d172cf31..27dceaf9e688 100644 --- a/arch/arm/mach-shmobile/setup-r8a7779.c +++ b/arch/arm/mach-shmobile/setup-r8a7779.c | |||
@@ -720,10 +720,17 @@ static int r8a7779_set_wake(struct irq_data *data, unsigned int on) | |||
720 | 720 | ||
721 | void __init r8a7779_init_irq_dt(void) | 721 | void __init r8a7779_init_irq_dt(void) |
722 | { | 722 | { |
723 | #ifdef CONFIG_ARCH_SHMOBILE_LEGACY | ||
724 | void __iomem *gic_dist_base = ioremap_nocache(0xf0001000, 0x1000); | ||
725 | void __iomem *gic_cpu_base = ioremap_nocache(0xf0000100, 0x1000); | ||
726 | #endif | ||
723 | gic_arch_extn.irq_set_wake = r8a7779_set_wake; | 727 | gic_arch_extn.irq_set_wake = r8a7779_set_wake; |
724 | 728 | ||
729 | #ifdef CONFIG_ARCH_SHMOBILE_LEGACY | ||
730 | gic_init(0, 29, gic_dist_base, gic_cpu_base); | ||
731 | #else | ||
725 | irqchip_init(); | 732 | irqchip_init(); |
726 | 733 | #endif | |
727 | /* route all interrupts to ARM */ | 734 | /* route all interrupts to ARM */ |
728 | __raw_writel(0xffffffff, INT2NTSR0); | 735 | __raw_writel(0xffffffff, INT2NTSR0); |
729 | __raw_writel(0x3fffffff, INT2NTSR1); | 736 | __raw_writel(0x3fffffff, INT2NTSR1); |
diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile index 1c43cec971b5..066688863920 100644 --- a/arch/arm64/Makefile +++ b/arch/arm64/Makefile | |||
@@ -85,6 +85,7 @@ vdso_install: | |||
85 | # We use MRPROPER_FILES and CLEAN_FILES now | 85 | # We use MRPROPER_FILES and CLEAN_FILES now |
86 | archclean: | 86 | archclean: |
87 | $(Q)$(MAKE) $(clean)=$(boot) | 87 | $(Q)$(MAKE) $(clean)=$(boot) |
88 | $(Q)$(MAKE) $(clean)=$(boot)/dts | ||
88 | 89 | ||
89 | define archhelp | 90 | define archhelp |
90 | echo '* Image.gz - Compressed kernel image (arch/$(ARCH)/boot/Image.gz)' | 91 | echo '* Image.gz - Compressed kernel image (arch/$(ARCH)/boot/Image.gz)' |
diff --git a/arch/arm64/boot/dts/Makefile b/arch/arm64/boot/dts/Makefile index 3b8d427c3985..c62b0f4d9ef6 100644 --- a/arch/arm64/boot/dts/Makefile +++ b/arch/arm64/boot/dts/Makefile | |||
@@ -3,6 +3,4 @@ dts-dirs += apm | |||
3 | dts-dirs += arm | 3 | dts-dirs += arm |
4 | dts-dirs += cavium | 4 | dts-dirs += cavium |
5 | 5 | ||
6 | always := $(dtb-y) | ||
7 | subdir-y := $(dts-dirs) | 6 | subdir-y := $(dts-dirs) |
8 | clean-files := *.dtb | ||
diff --git a/arch/arm64/boot/dts/arm/juno.dts b/arch/arm64/boot/dts/arm/juno.dts index cb3073e4e7a8..d429129ecb3d 100644 --- a/arch/arm64/boot/dts/arm/juno.dts +++ b/arch/arm64/boot/dts/arm/juno.dts | |||
@@ -22,7 +22,7 @@ | |||
22 | }; | 22 | }; |
23 | 23 | ||
24 | chosen { | 24 | chosen { |
25 | stdout-path = &soc_uart0; | 25 | stdout-path = "serial0:115200n8"; |
26 | }; | 26 | }; |
27 | 27 | ||
28 | psci { | 28 | psci { |
diff --git a/arch/arm64/mm/dump.c b/arch/arm64/mm/dump.c index cf33f33333cc..d54dc9ac4b70 100644 --- a/arch/arm64/mm/dump.c +++ b/arch/arm64/mm/dump.c | |||
@@ -15,6 +15,7 @@ | |||
15 | */ | 15 | */ |
16 | #include <linux/debugfs.h> | 16 | #include <linux/debugfs.h> |
17 | #include <linux/fs.h> | 17 | #include <linux/fs.h> |
18 | #include <linux/io.h> | ||
18 | #include <linux/mm.h> | 19 | #include <linux/mm.h> |
19 | #include <linux/sched.h> | 20 | #include <linux/sched.h> |
20 | #include <linux/seq_file.h> | 21 | #include <linux/seq_file.h> |
diff --git a/arch/avr32/kernel/module.c b/arch/avr32/kernel/module.c index 2c9412908024..164efa009e5b 100644 --- a/arch/avr32/kernel/module.c +++ b/arch/avr32/kernel/module.c | |||
@@ -19,12 +19,10 @@ | |||
19 | #include <linux/moduleloader.h> | 19 | #include <linux/moduleloader.h> |
20 | #include <linux/vmalloc.h> | 20 | #include <linux/vmalloc.h> |
21 | 21 | ||
22 | void module_free(struct module *mod, void *module_region) | 22 | void module_arch_freeing_init(struct module *mod) |
23 | { | 23 | { |
24 | vfree(mod->arch.syminfo); | 24 | vfree(mod->arch.syminfo); |
25 | mod->arch.syminfo = NULL; | 25 | mod->arch.syminfo = NULL; |
26 | |||
27 | vfree(module_region); | ||
28 | } | 26 | } |
29 | 27 | ||
30 | static inline int check_rela(Elf32_Rela *rela, struct module *module, | 28 | static inline int check_rela(Elf32_Rela *rela, struct module *module, |
@@ -291,12 +289,3 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab, | |||
291 | 289 | ||
292 | return ret; | 290 | return ret; |
293 | } | 291 | } |
294 | |||
295 | int module_finalize(const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs, | ||
296 | struct module *module) | ||
297 | { | ||
298 | vfree(module->arch.syminfo); | ||
299 | module->arch.syminfo = NULL; | ||
300 | |||
301 | return 0; | ||
302 | } | ||
diff --git a/arch/cris/arch-v32/drivers/sync_serial.c b/arch/cris/arch-v32/drivers/sync_serial.c index 08a313fc2241..f772068d9e79 100644 --- a/arch/cris/arch-v32/drivers/sync_serial.c +++ b/arch/cris/arch-v32/drivers/sync_serial.c | |||
@@ -604,7 +604,7 @@ static ssize_t __sync_serial_read(struct file *file, | |||
604 | struct timespec *ts) | 604 | struct timespec *ts) |
605 | { | 605 | { |
606 | unsigned long flags; | 606 | unsigned long flags; |
607 | int dev = MINOR(file->f_dentry->d_inode->i_rdev); | 607 | int dev = MINOR(file_inode(file)->i_rdev); |
608 | int avail; | 608 | int avail; |
609 | struct sync_port *port; | 609 | struct sync_port *port; |
610 | unsigned char *start; | 610 | unsigned char *start; |
diff --git a/arch/cris/kernel/module.c b/arch/cris/kernel/module.c index 51123f985eb5..af04cb6b6dc9 100644 --- a/arch/cris/kernel/module.c +++ b/arch/cris/kernel/module.c | |||
@@ -36,7 +36,7 @@ void *module_alloc(unsigned long size) | |||
36 | } | 36 | } |
37 | 37 | ||
38 | /* Free memory returned from module_alloc */ | 38 | /* Free memory returned from module_alloc */ |
39 | void module_free(struct module *mod, void *module_region) | 39 | void module_memfree(void *module_region) |
40 | { | 40 | { |
41 | kfree(module_region); | 41 | kfree(module_region); |
42 | } | 42 | } |
diff --git a/arch/frv/mb93090-mb00/pci-frv.c b/arch/frv/mb93090-mb00/pci-frv.c index 67b1d1685759..0635bd6c2af3 100644 --- a/arch/frv/mb93090-mb00/pci-frv.c +++ b/arch/frv/mb93090-mb00/pci-frv.c | |||
@@ -94,7 +94,7 @@ static void __init pcibios_allocate_bus_resources(struct list_head *bus_list) | |||
94 | r = &dev->resource[idx]; | 94 | r = &dev->resource[idx]; |
95 | if (!r->start) | 95 | if (!r->start) |
96 | continue; | 96 | continue; |
97 | pci_claim_resource(dev, idx); | 97 | pci_claim_bridge_resource(dev, idx); |
98 | } | 98 | } |
99 | } | 99 | } |
100 | pcibios_allocate_bus_resources(&bus->children); | 100 | pcibios_allocate_bus_resources(&bus->children); |
diff --git a/arch/ia64/kernel/module.c b/arch/ia64/kernel/module.c index 24603be24c14..29754aae5177 100644 --- a/arch/ia64/kernel/module.c +++ b/arch/ia64/kernel/module.c | |||
@@ -305,14 +305,12 @@ plt_target (struct plt_entry *plt) | |||
305 | #endif /* !USE_BRL */ | 305 | #endif /* !USE_BRL */ |
306 | 306 | ||
307 | void | 307 | void |
308 | module_free (struct module *mod, void *module_region) | 308 | module_arch_freeing_init (struct module *mod) |
309 | { | 309 | { |
310 | if (mod && mod->arch.init_unw_table && | 310 | if (mod->arch.init_unw_table) { |
311 | module_region == mod->module_init) { | ||
312 | unw_remove_unwind_table(mod->arch.init_unw_table); | 311 | unw_remove_unwind_table(mod->arch.init_unw_table); |
313 | mod->arch.init_unw_table = NULL; | 312 | mod->arch.init_unw_table = NULL; |
314 | } | 313 | } |
315 | vfree(module_region); | ||
316 | } | 314 | } |
317 | 315 | ||
318 | /* Have we already seen one of these relocations? */ | 316 | /* Have we already seen one of these relocations? */ |
diff --git a/arch/ia64/pci/pci.c b/arch/ia64/pci/pci.c index 291a582777cf..900cc93e5409 100644 --- a/arch/ia64/pci/pci.c +++ b/arch/ia64/pci/pci.c | |||
@@ -487,45 +487,39 @@ int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge) | |||
487 | return 0; | 487 | return 0; |
488 | } | 488 | } |
489 | 489 | ||
490 | static int is_valid_resource(struct pci_dev *dev, int idx) | 490 | void pcibios_fixup_device_resources(struct pci_dev *dev) |
491 | { | 491 | { |
492 | unsigned int i, type_mask = IORESOURCE_IO | IORESOURCE_MEM; | 492 | int idx; |
493 | struct resource *devr = &dev->resource[idx], *busr; | ||
494 | 493 | ||
495 | if (!dev->bus) | 494 | if (!dev->bus) |
496 | return 0; | 495 | return; |
497 | |||
498 | pci_bus_for_each_resource(dev->bus, busr, i) { | ||
499 | if (!busr || ((busr->flags ^ devr->flags) & type_mask)) | ||
500 | continue; | ||
501 | if ((devr->start) && (devr->start >= busr->start) && | ||
502 | (devr->end <= busr->end)) | ||
503 | return 1; | ||
504 | } | ||
505 | return 0; | ||
506 | } | ||
507 | 496 | ||
508 | static void pcibios_fixup_resources(struct pci_dev *dev, int start, int limit) | 497 | for (idx = 0; idx < PCI_BRIDGE_RESOURCES; idx++) { |
509 | { | 498 | struct resource *r = &dev->resource[idx]; |
510 | int i; | ||
511 | 499 | ||
512 | for (i = start; i < limit; i++) { | 500 | if (!r->flags || r->parent || !r->start) |
513 | if (!dev->resource[i].flags) | ||
514 | continue; | 501 | continue; |
515 | if ((is_valid_resource(dev, i))) | ||
516 | pci_claim_resource(dev, i); | ||
517 | } | ||
518 | } | ||
519 | 502 | ||
520 | void pcibios_fixup_device_resources(struct pci_dev *dev) | 503 | pci_claim_resource(dev, idx); |
521 | { | 504 | } |
522 | pcibios_fixup_resources(dev, 0, PCI_BRIDGE_RESOURCES); | ||
523 | } | 505 | } |
524 | EXPORT_SYMBOL_GPL(pcibios_fixup_device_resources); | 506 | EXPORT_SYMBOL_GPL(pcibios_fixup_device_resources); |
525 | 507 | ||
526 | static void pcibios_fixup_bridge_resources(struct pci_dev *dev) | 508 | static void pcibios_fixup_bridge_resources(struct pci_dev *dev) |
527 | { | 509 | { |
528 | pcibios_fixup_resources(dev, PCI_BRIDGE_RESOURCES, PCI_NUM_RESOURCES); | 510 | int idx; |
511 | |||
512 | if (!dev->bus) | ||
513 | return; | ||
514 | |||
515 | for (idx = PCI_BRIDGE_RESOURCES; idx < PCI_NUM_RESOURCES; idx++) { | ||
516 | struct resource *r = &dev->resource[idx]; | ||
517 | |||
518 | if (!r->flags || r->parent || !r->start) | ||
519 | continue; | ||
520 | |||
521 | pci_claim_bridge_resource(dev, idx); | ||
522 | } | ||
529 | } | 523 | } |
530 | 524 | ||
531 | /* | 525 | /* |
diff --git a/arch/microblaze/pci/pci-common.c b/arch/microblaze/pci/pci-common.c index b30e41c0c033..48528fb81eff 100644 --- a/arch/microblaze/pci/pci-common.c +++ b/arch/microblaze/pci/pci-common.c | |||
@@ -1026,6 +1026,8 @@ static void pcibios_allocate_bus_resources(struct pci_bus *bus) | |||
1026 | pr, (pr && pr->name) ? pr->name : "nil"); | 1026 | pr, (pr && pr->name) ? pr->name : "nil"); |
1027 | 1027 | ||
1028 | if (pr && !(pr->flags & IORESOURCE_UNSET)) { | 1028 | if (pr && !(pr->flags & IORESOURCE_UNSET)) { |
1029 | struct pci_dev *dev = bus->self; | ||
1030 | |||
1029 | if (request_resource(pr, res) == 0) | 1031 | if (request_resource(pr, res) == 0) |
1030 | continue; | 1032 | continue; |
1031 | /* | 1033 | /* |
@@ -1035,6 +1037,12 @@ static void pcibios_allocate_bus_resources(struct pci_bus *bus) | |||
1035 | */ | 1037 | */ |
1036 | if (reparent_resources(pr, res) == 0) | 1038 | if (reparent_resources(pr, res) == 0) |
1037 | continue; | 1039 | continue; |
1040 | |||
1041 | if (dev && i < PCI_BRIDGE_RESOURCE_NUM && | ||
1042 | pci_claim_bridge_resource(dev, | ||
1043 | i + PCI_BRIDGE_RESOURCES) == 0) | ||
1044 | continue; | ||
1045 | |||
1038 | } | 1046 | } |
1039 | pr_warn("PCI: Cannot allocate resource region "); | 1047 | pr_warn("PCI: Cannot allocate resource region "); |
1040 | pr_cont("%d of PCI bridge %d, will remap\n", i, bus->number); | 1048 | pr_cont("%d of PCI bridge %d, will remap\n", i, bus->number); |
@@ -1227,7 +1235,10 @@ void pcibios_claim_one_bus(struct pci_bus *bus) | |||
1227 | (unsigned long long)r->end, | 1235 | (unsigned long long)r->end, |
1228 | (unsigned int)r->flags); | 1236 | (unsigned int)r->flags); |
1229 | 1237 | ||
1230 | pci_claim_resource(dev, i); | 1238 | if (pci_claim_resource(dev, i) == 0) |
1239 | continue; | ||
1240 | |||
1241 | pci_claim_bridge_resource(dev, i); | ||
1231 | } | 1242 | } |
1232 | } | 1243 | } |
1233 | 1244 | ||
diff --git a/arch/mips/net/bpf_jit.c b/arch/mips/net/bpf_jit.c index 9fd6834a2172..5d6139390bf8 100644 --- a/arch/mips/net/bpf_jit.c +++ b/arch/mips/net/bpf_jit.c | |||
@@ -1388,7 +1388,7 @@ out: | |||
1388 | void bpf_jit_free(struct bpf_prog *fp) | 1388 | void bpf_jit_free(struct bpf_prog *fp) |
1389 | { | 1389 | { |
1390 | if (fp->jited) | 1390 | if (fp->jited) |
1391 | module_free(NULL, fp->bpf_func); | 1391 | module_memfree(fp->bpf_func); |
1392 | 1392 | ||
1393 | bpf_prog_unlock_free(fp); | 1393 | bpf_prog_unlock_free(fp); |
1394 | } | 1394 | } |
diff --git a/arch/mn10300/unit-asb2305/pci-asb2305.c b/arch/mn10300/unit-asb2305/pci-asb2305.c index febb9cd83177..b5b036f64275 100644 --- a/arch/mn10300/unit-asb2305/pci-asb2305.c +++ b/arch/mn10300/unit-asb2305/pci-asb2305.c | |||
@@ -106,7 +106,7 @@ static void __init pcibios_allocate_bus_resources(struct list_head *bus_list) | |||
106 | if (!r->flags) | 106 | if (!r->flags) |
107 | continue; | 107 | continue; |
108 | if (!r->start || | 108 | if (!r->start || |
109 | pci_claim_resource(dev, idx) < 0) { | 109 | pci_claim_bridge_resource(dev, idx) < 0) { |
110 | printk(KERN_ERR "PCI:" | 110 | printk(KERN_ERR "PCI:" |
111 | " Cannot allocate resource" | 111 | " Cannot allocate resource" |
112 | " region %d of bridge %s\n", | 112 | " region %d of bridge %s\n", |
diff --git a/arch/mn10300/unit-asb2305/pci.c b/arch/mn10300/unit-asb2305/pci.c index 6b4339f8c9c2..471ff398090c 100644 --- a/arch/mn10300/unit-asb2305/pci.c +++ b/arch/mn10300/unit-asb2305/pci.c | |||
@@ -281,42 +281,37 @@ static int __init pci_check_direct(void) | |||
281 | return -ENODEV; | 281 | return -ENODEV; |
282 | } | 282 | } |
283 | 283 | ||
284 | static int is_valid_resource(struct pci_dev *dev, int idx) | 284 | static void pcibios_fixup_device_resources(struct pci_dev *dev) |
285 | { | 285 | { |
286 | unsigned int i, type_mask = IORESOURCE_IO | IORESOURCE_MEM; | 286 | int idx; |
287 | struct resource *devr = &dev->resource[idx], *busr; | ||
288 | |||
289 | if (dev->bus) { | ||
290 | pci_bus_for_each_resource(dev->bus, busr, i) { | ||
291 | if (!busr || (busr->flags ^ devr->flags) & type_mask) | ||
292 | continue; | ||
293 | |||
294 | if (devr->start && | ||
295 | devr->start >= busr->start && | ||
296 | devr->end <= busr->end) | ||
297 | return 1; | ||
298 | } | ||
299 | } | ||
300 | 287 | ||
301 | return 0; | 288 | if (!dev->bus) |
289 | return; | ||
290 | |||
291 | for (idx = 0; idx < PCI_BRIDGE_RESOURCES; idx++) { | ||
292 | struct resource *r = &dev->resource[idx]; | ||
293 | |||
294 | if (!r->flags || r->parent || !r->start) | ||
295 | continue; | ||
296 | |||
297 | pci_claim_resource(dev, idx); | ||
298 | } | ||
302 | } | 299 | } |
303 | 300 | ||
304 | static void pcibios_fixup_device_resources(struct pci_dev *dev) | 301 | static void pcibios_fixup_bridge_resources(struct pci_dev *dev) |
305 | { | 302 | { |
306 | int limit, i; | 303 | int idx; |
307 | 304 | ||
308 | if (dev->bus->number != 0) | 305 | if (!dev->bus) |
309 | return; | 306 | return; |
310 | 307 | ||
311 | limit = (dev->hdr_type == PCI_HEADER_TYPE_NORMAL) ? | 308 | for (idx = PCI_BRIDGE_RESOURCES; idx < PCI_NUM_RESOURCES; idx++) { |
312 | PCI_BRIDGE_RESOURCES : PCI_NUM_RESOURCES; | 309 | struct resource *r = &dev->resource[idx]; |
313 | 310 | ||
314 | for (i = 0; i < limit; i++) { | 311 | if (!r->flags || r->parent || !r->start) |
315 | if (!dev->resource[i].flags) | ||
316 | continue; | 312 | continue; |
317 | 313 | ||
318 | if (is_valid_resource(dev, i)) | 314 | pci_claim_bridge_resource(dev, idx); |
319 | pci_claim_resource(dev, i); | ||
320 | } | 315 | } |
321 | } | 316 | } |
322 | 317 | ||
@@ -330,7 +325,7 @@ void pcibios_fixup_bus(struct pci_bus *bus) | |||
330 | 325 | ||
331 | if (bus->self) { | 326 | if (bus->self) { |
332 | pci_read_bridge_bases(bus); | 327 | pci_read_bridge_bases(bus); |
333 | pcibios_fixup_device_resources(bus->self); | 328 | pcibios_fixup_bridge_resources(bus->self); |
334 | } | 329 | } |
335 | 330 | ||
336 | list_for_each_entry(dev, &bus->devices, bus_list) | 331 | list_for_each_entry(dev, &bus->devices, bus_list) |
diff --git a/arch/nios2/kernel/module.c b/arch/nios2/kernel/module.c index cc924a38f22a..e2e3f13f98d5 100644 --- a/arch/nios2/kernel/module.c +++ b/arch/nios2/kernel/module.c | |||
@@ -36,7 +36,7 @@ void *module_alloc(unsigned long size) | |||
36 | } | 36 | } |
37 | 37 | ||
38 | /* Free memory returned from module_alloc */ | 38 | /* Free memory returned from module_alloc */ |
39 | void module_free(struct module *mod, void *module_region) | 39 | void module_memfree(void *module_region) |
40 | { | 40 | { |
41 | kfree(module_region); | 41 | kfree(module_region); |
42 | } | 42 | } |
diff --git a/arch/nios2/kernel/signal.c b/arch/nios2/kernel/signal.c index f9d27883a714..2d0ea25be171 100644 --- a/arch/nios2/kernel/signal.c +++ b/arch/nios2/kernel/signal.c | |||
@@ -200,7 +200,7 @@ static int setup_rt_frame(struct ksignal *ksig, sigset_t *set, | |||
200 | 200 | ||
201 | /* Set up to return from userspace; jump to fixed address sigreturn | 201 | /* Set up to return from userspace; jump to fixed address sigreturn |
202 | trampoline on kuser page. */ | 202 | trampoline on kuser page. */ |
203 | regs->ra = (unsigned long) (0x1040); | 203 | regs->ra = (unsigned long) (0x1044); |
204 | 204 | ||
205 | /* Set up registers for signal handler */ | 205 | /* Set up registers for signal handler */ |
206 | regs->sp = (unsigned long) frame; | 206 | regs->sp = (unsigned long) frame; |
diff --git a/arch/parisc/kernel/module.c b/arch/parisc/kernel/module.c index 50dfafc3f2c1..5822e8e200e6 100644 --- a/arch/parisc/kernel/module.c +++ b/arch/parisc/kernel/module.c | |||
@@ -298,14 +298,10 @@ static inline unsigned long count_stubs(const Elf_Rela *rela, unsigned long n) | |||
298 | } | 298 | } |
299 | #endif | 299 | #endif |
300 | 300 | ||
301 | 301 | void module_arch_freeing_init(struct module *mod) | |
302 | /* Free memory returned from module_alloc */ | ||
303 | void module_free(struct module *mod, void *module_region) | ||
304 | { | 302 | { |
305 | kfree(mod->arch.section); | 303 | kfree(mod->arch.section); |
306 | mod->arch.section = NULL; | 304 | mod->arch.section = NULL; |
307 | |||
308 | vfree(module_region); | ||
309 | } | 305 | } |
310 | 306 | ||
311 | /* Additional bytes needed in front of individual sections */ | 307 | /* Additional bytes needed in front of individual sections */ |
diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c index 37d512d35943..2a525c938158 100644 --- a/arch/powerpc/kernel/pci-common.c +++ b/arch/powerpc/kernel/pci-common.c | |||
@@ -1184,6 +1184,8 @@ static void pcibios_allocate_bus_resources(struct pci_bus *bus) | |||
1184 | pr, (pr && pr->name) ? pr->name : "nil"); | 1184 | pr, (pr && pr->name) ? pr->name : "nil"); |
1185 | 1185 | ||
1186 | if (pr && !(pr->flags & IORESOURCE_UNSET)) { | 1186 | if (pr && !(pr->flags & IORESOURCE_UNSET)) { |
1187 | struct pci_dev *dev = bus->self; | ||
1188 | |||
1187 | if (request_resource(pr, res) == 0) | 1189 | if (request_resource(pr, res) == 0) |
1188 | continue; | 1190 | continue; |
1189 | /* | 1191 | /* |
@@ -1193,6 +1195,11 @@ static void pcibios_allocate_bus_resources(struct pci_bus *bus) | |||
1193 | */ | 1195 | */ |
1194 | if (reparent_resources(pr, res) == 0) | 1196 | if (reparent_resources(pr, res) == 0) |
1195 | continue; | 1197 | continue; |
1198 | |||
1199 | if (dev && i < PCI_BRIDGE_RESOURCE_NUM && | ||
1200 | pci_claim_bridge_resource(dev, | ||
1201 | i + PCI_BRIDGE_RESOURCES) == 0) | ||
1202 | continue; | ||
1196 | } | 1203 | } |
1197 | pr_warning("PCI: Cannot allocate resource region " | 1204 | pr_warning("PCI: Cannot allocate resource region " |
1198 | "%d of PCI bridge %d, will remap\n", i, bus->number); | 1205 | "%d of PCI bridge %d, will remap\n", i, bus->number); |
@@ -1401,7 +1408,10 @@ void pcibios_claim_one_bus(struct pci_bus *bus) | |||
1401 | (unsigned long long)r->end, | 1408 | (unsigned long long)r->end, |
1402 | (unsigned int)r->flags); | 1409 | (unsigned int)r->flags); |
1403 | 1410 | ||
1404 | pci_claim_resource(dev, i); | 1411 | if (pci_claim_resource(dev, i) == 0) |
1412 | continue; | ||
1413 | |||
1414 | pci_claim_bridge_resource(dev, i); | ||
1405 | } | 1415 | } |
1406 | } | 1416 | } |
1407 | 1417 | ||
diff --git a/arch/powerpc/net/bpf_jit_comp.c b/arch/powerpc/net/bpf_jit_comp.c index 1ca125b9c226..d1916b577f2c 100644 --- a/arch/powerpc/net/bpf_jit_comp.c +++ b/arch/powerpc/net/bpf_jit_comp.c | |||
@@ -699,7 +699,7 @@ out: | |||
699 | void bpf_jit_free(struct bpf_prog *fp) | 699 | void bpf_jit_free(struct bpf_prog *fp) |
700 | { | 700 | { |
701 | if (fp->jited) | 701 | if (fp->jited) |
702 | module_free(NULL, fp->bpf_func); | 702 | module_memfree(fp->bpf_func); |
703 | 703 | ||
704 | bpf_prog_unlock_free(fp); | 704 | bpf_prog_unlock_free(fp); |
705 | } | 705 | } |
diff --git a/arch/s390/kernel/module.c b/arch/s390/kernel/module.c index b89b59158b95..409d152585be 100644 --- a/arch/s390/kernel/module.c +++ b/arch/s390/kernel/module.c | |||
@@ -55,14 +55,10 @@ void *module_alloc(unsigned long size) | |||
55 | } | 55 | } |
56 | #endif | 56 | #endif |
57 | 57 | ||
58 | /* Free memory returned from module_alloc */ | 58 | void module_arch_freeing_init(struct module *mod) |
59 | void module_free(struct module *mod, void *module_region) | ||
60 | { | 59 | { |
61 | if (mod) { | 60 | vfree(mod->arch.syminfo); |
62 | vfree(mod->arch.syminfo); | 61 | mod->arch.syminfo = NULL; |
63 | mod->arch.syminfo = NULL; | ||
64 | } | ||
65 | vfree(module_region); | ||
66 | } | 62 | } |
67 | 63 | ||
68 | static void check_rela(Elf_Rela *rela, struct module *me) | 64 | static void check_rela(Elf_Rela *rela, struct module *me) |
diff --git a/arch/s390/net/bpf_jit.S b/arch/s390/net/bpf_jit.S index 7e45d13816c1..ba44c9f55346 100644 --- a/arch/s390/net/bpf_jit.S +++ b/arch/s390/net/bpf_jit.S | |||
@@ -22,8 +22,8 @@ | |||
22 | * skb_copy_bits takes 4 parameters: | 22 | * skb_copy_bits takes 4 parameters: |
23 | * %r2 = skb pointer | 23 | * %r2 = skb pointer |
24 | * %r3 = offset into skb data | 24 | * %r3 = offset into skb data |
25 | * %r4 = length to copy | 25 | * %r4 = pointer to temp buffer |
26 | * %r5 = pointer to temp buffer | 26 | * %r5 = length to copy |
27 | */ | 27 | */ |
28 | #define SKBDATA %r8 | 28 | #define SKBDATA %r8 |
29 | 29 | ||
@@ -44,8 +44,9 @@ ENTRY(sk_load_word) | |||
44 | 44 | ||
45 | sk_load_word_slow: | 45 | sk_load_word_slow: |
46 | lgr %r9,%r2 # save %r2 | 46 | lgr %r9,%r2 # save %r2 |
47 | lhi %r4,4 # 4 bytes | 47 | lgr %r3,%r1 # offset |
48 | la %r5,160(%r15) # pointer to temp buffer | 48 | la %r4,160(%r15) # pointer to temp buffer |
49 | lghi %r5,4 # 4 bytes | ||
49 | brasl %r14,skb_copy_bits # get data from skb | 50 | brasl %r14,skb_copy_bits # get data from skb |
50 | l %r5,160(%r15) # load result from temp buffer | 51 | l %r5,160(%r15) # load result from temp buffer |
51 | ltgr %r2,%r2 # set cc to (%r2 != 0) | 52 | ltgr %r2,%r2 # set cc to (%r2 != 0) |
@@ -69,8 +70,9 @@ ENTRY(sk_load_half) | |||
69 | 70 | ||
70 | sk_load_half_slow: | 71 | sk_load_half_slow: |
71 | lgr %r9,%r2 # save %r2 | 72 | lgr %r9,%r2 # save %r2 |
72 | lhi %r4,2 # 2 bytes | 73 | lgr %r3,%r1 # offset |
73 | la %r5,162(%r15) # pointer to temp buffer | 74 | la %r4,162(%r15) # pointer to temp buffer |
75 | lghi %r5,2 # 2 bytes | ||
74 | brasl %r14,skb_copy_bits # get data from skb | 76 | brasl %r14,skb_copy_bits # get data from skb |
75 | xc 160(2,%r15),160(%r15) | 77 | xc 160(2,%r15),160(%r15) |
76 | l %r5,160(%r15) # load result from temp buffer | 78 | l %r5,160(%r15) # load result from temp buffer |
@@ -95,8 +97,9 @@ ENTRY(sk_load_byte) | |||
95 | 97 | ||
96 | sk_load_byte_slow: | 98 | sk_load_byte_slow: |
97 | lgr %r9,%r2 # save %r2 | 99 | lgr %r9,%r2 # save %r2 |
98 | lhi %r4,1 # 1 bytes | 100 | lgr %r3,%r1 # offset |
99 | la %r5,163(%r15) # pointer to temp buffer | 101 | la %r4,163(%r15) # pointer to temp buffer |
102 | lghi %r5,1 # 1 byte | ||
100 | brasl %r14,skb_copy_bits # get data from skb | 103 | brasl %r14,skb_copy_bits # get data from skb |
101 | xc 160(3,%r15),160(%r15) | 104 | xc 160(3,%r15),160(%r15) |
102 | l %r5,160(%r15) # load result from temp buffer | 105 | l %r5,160(%r15) # load result from temp buffer |
@@ -104,11 +107,11 @@ sk_load_byte_slow: | |||
104 | lgr %r2,%r9 # restore %r2 | 107 | lgr %r2,%r9 # restore %r2 |
105 | br %r8 | 108 | br %r8 |
106 | 109 | ||
107 | /* A = (*(u8 *)(skb->data+K) & 0xf) << 2 */ | 110 | /* X = (*(u8 *)(skb->data+K) & 0xf) << 2 */ |
108 | ENTRY(sk_load_byte_msh) | 111 | ENTRY(sk_load_byte_msh) |
109 | llgfr %r1,%r3 # extend offset | 112 | llgfr %r1,%r3 # extend offset |
110 | clr %r11,%r3 # hlen < offset ? | 113 | clr %r11,%r3 # hlen < offset ? |
111 | jle sk_load_byte_slow | 114 | jle sk_load_byte_msh_slow |
112 | lhi %r12,0 | 115 | lhi %r12,0 |
113 | ic %r12,0(%r1,%r10) # get byte from skb | 116 | ic %r12,0(%r1,%r10) # get byte from skb |
114 | nill %r12,0x0f | 117 | nill %r12,0x0f |
@@ -118,8 +121,9 @@ ENTRY(sk_load_byte_msh) | |||
118 | 121 | ||
119 | sk_load_byte_msh_slow: | 122 | sk_load_byte_msh_slow: |
120 | lgr %r9,%r2 # save %r2 | 123 | lgr %r9,%r2 # save %r2 |
121 | lhi %r4,2 # 2 bytes | 124 | lgr %r3,%r1 # offset |
122 | la %r5,162(%r15) # pointer to temp buffer | 125 | la %r4,163(%r15) # pointer to temp buffer |
126 | lghi %r5,1 # 1 byte | ||
123 | brasl %r14,skb_copy_bits # get data from skb | 127 | brasl %r14,skb_copy_bits # get data from skb |
124 | xc 160(3,%r15),160(%r15) | 128 | xc 160(3,%r15),160(%r15) |
125 | l %r12,160(%r15) # load result from temp buffer | 129 | l %r12,160(%r15) # load result from temp buffer |
diff --git a/arch/s390/net/bpf_jit_comp.c b/arch/s390/net/bpf_jit_comp.c index 524496d47ef5..bbd1981cc150 100644 --- a/arch/s390/net/bpf_jit_comp.c +++ b/arch/s390/net/bpf_jit_comp.c | |||
@@ -448,15 +448,12 @@ static int bpf_jit_insn(struct bpf_jit *jit, struct sock_filter *filter, | |||
448 | mask = 0x800000; /* je */ | 448 | mask = 0x800000; /* je */ |
449 | kbranch: /* Emit compare if the branch targets are different */ | 449 | kbranch: /* Emit compare if the branch targets are different */ |
450 | if (filter->jt != filter->jf) { | 450 | if (filter->jt != filter->jf) { |
451 | if (K <= 16383) | 451 | if (test_facility(21)) |
452 | /* chi %r5,<K> */ | ||
453 | EMIT4_IMM(0xa75e0000, K); | ||
454 | else if (test_facility(21)) | ||
455 | /* clfi %r5,<K> */ | 452 | /* clfi %r5,<K> */ |
456 | EMIT6_IMM(0xc25f0000, K); | 453 | EMIT6_IMM(0xc25f0000, K); |
457 | else | 454 | else |
458 | /* c %r5,<d(K)>(%r13) */ | 455 | /* cl %r5,<d(K)>(%r13) */ |
459 | EMIT4_DISP(0x5950d000, EMIT_CONST(K)); | 456 | EMIT4_DISP(0x5550d000, EMIT_CONST(K)); |
460 | } | 457 | } |
461 | branch: if (filter->jt == filter->jf) { | 458 | branch: if (filter->jt == filter->jf) { |
462 | if (filter->jt == 0) | 459 | if (filter->jt == 0) |
diff --git a/arch/sparc/kernel/pci.c b/arch/sparc/kernel/pci.c index b36365f49478..9ce5afe167ff 100644 --- a/arch/sparc/kernel/pci.c +++ b/arch/sparc/kernel/pci.c | |||
@@ -639,7 +639,10 @@ static void pci_claim_bus_resources(struct pci_bus *bus) | |||
639 | (unsigned long long)r->end, | 639 | (unsigned long long)r->end, |
640 | (unsigned int)r->flags); | 640 | (unsigned int)r->flags); |
641 | 641 | ||
642 | pci_claim_resource(dev, i); | 642 | if (pci_claim_resource(dev, i) == 0) |
643 | continue; | ||
644 | |||
645 | pci_claim_bridge_resource(dev, i); | ||
643 | } | 646 | } |
644 | } | 647 | } |
645 | 648 | ||
diff --git a/arch/sparc/net/bpf_jit_comp.c b/arch/sparc/net/bpf_jit_comp.c index f33e7c7a3bf7..7931eeeb649a 100644 --- a/arch/sparc/net/bpf_jit_comp.c +++ b/arch/sparc/net/bpf_jit_comp.c | |||
@@ -776,7 +776,7 @@ cond_branch: f_offset = addrs[i + filter[i].jf]; | |||
776 | if (unlikely(proglen + ilen > oldproglen)) { | 776 | if (unlikely(proglen + ilen > oldproglen)) { |
777 | pr_err("bpb_jit_compile fatal error\n"); | 777 | pr_err("bpb_jit_compile fatal error\n"); |
778 | kfree(addrs); | 778 | kfree(addrs); |
779 | module_free(NULL, image); | 779 | module_memfree(image); |
780 | return; | 780 | return; |
781 | } | 781 | } |
782 | memcpy(image + proglen, temp, ilen); | 782 | memcpy(image + proglen, temp, ilen); |
@@ -822,7 +822,7 @@ out: | |||
822 | void bpf_jit_free(struct bpf_prog *fp) | 822 | void bpf_jit_free(struct bpf_prog *fp) |
823 | { | 823 | { |
824 | if (fp->jited) | 824 | if (fp->jited) |
825 | module_free(NULL, fp->bpf_func); | 825 | module_memfree(fp->bpf_func); |
826 | 826 | ||
827 | bpf_prog_unlock_free(fp); | 827 | bpf_prog_unlock_free(fp); |
828 | } | 828 | } |
diff --git a/arch/tile/kernel/module.c b/arch/tile/kernel/module.c index 96447c9160a0..2305084c9b93 100644 --- a/arch/tile/kernel/module.c +++ b/arch/tile/kernel/module.c | |||
@@ -74,7 +74,7 @@ error: | |||
74 | 74 | ||
75 | 75 | ||
76 | /* Free memory returned from module_alloc */ | 76 | /* Free memory returned from module_alloc */ |
77 | void module_free(struct module *mod, void *module_region) | 77 | void module_memfree(void *module_region) |
78 | { | 78 | { |
79 | vfree(module_region); | 79 | vfree(module_region); |
80 | 80 | ||
@@ -83,7 +83,7 @@ void module_free(struct module *mod, void *module_region) | |||
83 | 0, 0, 0, NULL, NULL, 0); | 83 | 0, 0, 0, NULL, NULL, 0); |
84 | 84 | ||
85 | /* | 85 | /* |
86 | * FIXME: If module_region == mod->module_init, trim exception | 86 | * FIXME: Add module_arch_freeing_init to trim exception |
87 | * table entries. | 87 | * table entries. |
88 | */ | 88 | */ |
89 | } | 89 | } |
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index ba397bde7948..0dc9d0144a27 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
@@ -857,7 +857,7 @@ source "kernel/Kconfig.preempt" | |||
857 | 857 | ||
858 | config X86_UP_APIC | 858 | config X86_UP_APIC |
859 | bool "Local APIC support on uniprocessors" | 859 | bool "Local APIC support on uniprocessors" |
860 | depends on X86_32 && !SMP && !X86_32_NON_STANDARD && !PCI_MSI | 860 | depends on X86_32 && !SMP && !X86_32_NON_STANDARD |
861 | ---help--- | 861 | ---help--- |
862 | A local APIC (Advanced Programmable Interrupt Controller) is an | 862 | A local APIC (Advanced Programmable Interrupt Controller) is an |
863 | integrated interrupt controller in the CPU. If you have a single-CPU | 863 | integrated interrupt controller in the CPU. If you have a single-CPU |
@@ -868,6 +868,10 @@ config X86_UP_APIC | |||
868 | performance counters), and the NMI watchdog which detects hard | 868 | performance counters), and the NMI watchdog which detects hard |
869 | lockups. | 869 | lockups. |
870 | 870 | ||
871 | config X86_UP_APIC_MSI | ||
872 | def_bool y | ||
873 | select X86_UP_APIC if X86_32 && !SMP && !X86_32_NON_STANDARD && PCI_MSI | ||
874 | |||
871 | config X86_UP_IOAPIC | 875 | config X86_UP_IOAPIC |
872 | bool "IO-APIC support on uniprocessors" | 876 | bool "IO-APIC support on uniprocessors" |
873 | depends on X86_UP_APIC | 877 | depends on X86_UP_APIC |
diff --git a/arch/x86/boot/compressed/misc.c b/arch/x86/boot/compressed/misc.c index dcc1c536cc21..a950864a64da 100644 --- a/arch/x86/boot/compressed/misc.c +++ b/arch/x86/boot/compressed/misc.c | |||
@@ -373,6 +373,8 @@ asmlinkage __visible void *decompress_kernel(void *rmode, memptr heap, | |||
373 | unsigned long output_len, | 373 | unsigned long output_len, |
374 | unsigned long run_size) | 374 | unsigned long run_size) |
375 | { | 375 | { |
376 | unsigned char *output_orig = output; | ||
377 | |||
376 | real_mode = rmode; | 378 | real_mode = rmode; |
377 | 379 | ||
378 | sanitize_boot_params(real_mode); | 380 | sanitize_boot_params(real_mode); |
@@ -421,7 +423,12 @@ asmlinkage __visible void *decompress_kernel(void *rmode, memptr heap, | |||
421 | debug_putstr("\nDecompressing Linux... "); | 423 | debug_putstr("\nDecompressing Linux... "); |
422 | decompress(input_data, input_len, NULL, NULL, output, NULL, error); | 424 | decompress(input_data, input_len, NULL, NULL, output, NULL, error); |
423 | parse_elf(output); | 425 | parse_elf(output); |
424 | handle_relocations(output, output_len); | 426 | /* |
427 | * 32-bit always performs relocations. 64-bit relocations are only | ||
428 | * needed if kASLR has chosen a different load address. | ||
429 | */ | ||
430 | if (!IS_ENABLED(CONFIG_X86_64) || output != output_orig) | ||
431 | handle_relocations(output, output_len); | ||
425 | debug_putstr("done.\nBooting the kernel.\n"); | 432 | debug_putstr("done.\nBooting the kernel.\n"); |
426 | return output; | 433 | return output; |
427 | } | 434 | } |
diff --git a/arch/x86/include/asm/acpi.h b/arch/x86/include/asm/acpi.h index 0ab4f9fd2687..3a45668f6dc3 100644 --- a/arch/x86/include/asm/acpi.h +++ b/arch/x86/include/asm/acpi.h | |||
@@ -50,6 +50,7 @@ void acpi_pic_sci_set_trigger(unsigned int, u16); | |||
50 | 50 | ||
51 | extern int (*__acpi_register_gsi)(struct device *dev, u32 gsi, | 51 | extern int (*__acpi_register_gsi)(struct device *dev, u32 gsi, |
52 | int trigger, int polarity); | 52 | int trigger, int polarity); |
53 | extern void (*__acpi_unregister_gsi)(u32 gsi); | ||
53 | 54 | ||
54 | static inline void disable_acpi(void) | 55 | static inline void disable_acpi(void) |
55 | { | 56 | { |
diff --git a/arch/x86/include/asm/desc.h b/arch/x86/include/asm/desc.h index 50d033a8947d..a94b82e8f156 100644 --- a/arch/x86/include/asm/desc.h +++ b/arch/x86/include/asm/desc.h | |||
@@ -251,7 +251,8 @@ static inline void native_load_tls(struct thread_struct *t, unsigned int cpu) | |||
251 | gdt[GDT_ENTRY_TLS_MIN + i] = t->tls_array[i]; | 251 | gdt[GDT_ENTRY_TLS_MIN + i] = t->tls_array[i]; |
252 | } | 252 | } |
253 | 253 | ||
254 | #define _LDT_empty(info) \ | 254 | /* This intentionally ignores lm, since 32-bit apps don't have that field. */ |
255 | #define LDT_empty(info) \ | ||
255 | ((info)->base_addr == 0 && \ | 256 | ((info)->base_addr == 0 && \ |
256 | (info)->limit == 0 && \ | 257 | (info)->limit == 0 && \ |
257 | (info)->contents == 0 && \ | 258 | (info)->contents == 0 && \ |
@@ -261,11 +262,18 @@ static inline void native_load_tls(struct thread_struct *t, unsigned int cpu) | |||
261 | (info)->seg_not_present == 1 && \ | 262 | (info)->seg_not_present == 1 && \ |
262 | (info)->useable == 0) | 263 | (info)->useable == 0) |
263 | 264 | ||
264 | #ifdef CONFIG_X86_64 | 265 | /* Lots of programs expect an all-zero user_desc to mean "no segment at all". */ |
265 | #define LDT_empty(info) (_LDT_empty(info) && ((info)->lm == 0)) | 266 | static inline bool LDT_zero(const struct user_desc *info) |
266 | #else | 267 | { |
267 | #define LDT_empty(info) (_LDT_empty(info)) | 268 | return (info->base_addr == 0 && |
268 | #endif | 269 | info->limit == 0 && |
270 | info->contents == 0 && | ||
271 | info->read_exec_only == 0 && | ||
272 | info->seg_32bit == 0 && | ||
273 | info->limit_in_pages == 0 && | ||
274 | info->seg_not_present == 0 && | ||
275 | info->useable == 0); | ||
276 | } | ||
269 | 277 | ||
270 | static inline void clear_LDT(void) | 278 | static inline void clear_LDT(void) |
271 | { | 279 | { |
diff --git a/arch/x86/include/asm/mmu_context.h b/arch/x86/include/asm/mmu_context.h index 40269a2bf6f9..4b75d591eb5e 100644 --- a/arch/x86/include/asm/mmu_context.h +++ b/arch/x86/include/asm/mmu_context.h | |||
@@ -130,7 +130,25 @@ static inline void arch_bprm_mm_init(struct mm_struct *mm, | |||
130 | static inline void arch_unmap(struct mm_struct *mm, struct vm_area_struct *vma, | 130 | static inline void arch_unmap(struct mm_struct *mm, struct vm_area_struct *vma, |
131 | unsigned long start, unsigned long end) | 131 | unsigned long start, unsigned long end) |
132 | { | 132 | { |
133 | mpx_notify_unmap(mm, vma, start, end); | 133 | /* |
134 | * mpx_notify_unmap() goes and reads a rarely-hot | ||
135 | * cacheline in the mm_struct. That can be expensive | ||
136 | * enough to be seen in profiles. | ||
137 | * | ||
138 | * The mpx_notify_unmap() call and its contents have been | ||
139 | * observed to affect munmap() performance on hardware | ||
140 | * where MPX is not present. | ||
141 | * | ||
142 | * The unlikely() optimizes for the fast case: no MPX | ||
143 | * in the CPU, or no MPX use in the process. Even if | ||
144 | * we get this wrong (in the unlikely event that MPX | ||
145 | * is widely enabled on some system) the overhead of | ||
146 | * MPX itself (reading bounds tables) is expected to | ||
147 | * overwhelm the overhead of getting this unlikely() | ||
148 | * consistently wrong. | ||
149 | */ | ||
150 | if (unlikely(cpu_feature_enabled(X86_FEATURE_MPX))) | ||
151 | mpx_notify_unmap(mm, vma, start, end); | ||
134 | } | 152 | } |
135 | 153 | ||
136 | #endif /* _ASM_X86_MMU_CONTEXT_H */ | 154 | #endif /* _ASM_X86_MMU_CONTEXT_H */ |
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index d1626364a28a..b9e30daa0881 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c | |||
@@ -611,20 +611,20 @@ void __init acpi_pic_sci_set_trigger(unsigned int irq, u16 trigger) | |||
611 | 611 | ||
612 | int acpi_gsi_to_irq(u32 gsi, unsigned int *irqp) | 612 | int acpi_gsi_to_irq(u32 gsi, unsigned int *irqp) |
613 | { | 613 | { |
614 | int irq; | 614 | int rc, irq, trigger, polarity; |
615 | 615 | ||
616 | if (acpi_irq_model == ACPI_IRQ_MODEL_PIC) { | 616 | rc = acpi_get_override_irq(gsi, &trigger, &polarity); |
617 | *irqp = gsi; | 617 | if (rc == 0) { |
618 | } else { | 618 | trigger = trigger ? ACPI_LEVEL_SENSITIVE : ACPI_EDGE_SENSITIVE; |
619 | mutex_lock(&acpi_ioapic_lock); | 619 | polarity = polarity ? ACPI_ACTIVE_LOW : ACPI_ACTIVE_HIGH; |
620 | irq = mp_map_gsi_to_irq(gsi, | 620 | irq = acpi_register_gsi(NULL, gsi, trigger, polarity); |
621 | IOAPIC_MAP_ALLOC | IOAPIC_MAP_CHECK); | 621 | if (irq >= 0) { |
622 | mutex_unlock(&acpi_ioapic_lock); | 622 | *irqp = irq; |
623 | if (irq < 0) | 623 | return 0; |
624 | return -1; | 624 | } |
625 | *irqp = irq; | ||
626 | } | 625 | } |
627 | return 0; | 626 | |
627 | return -1; | ||
628 | } | 628 | } |
629 | EXPORT_SYMBOL_GPL(acpi_gsi_to_irq); | 629 | EXPORT_SYMBOL_GPL(acpi_gsi_to_irq); |
630 | 630 | ||
diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c index a450373e8e91..939155ffdece 100644 --- a/arch/x86/kernel/cpu/mshyperv.c +++ b/arch/x86/kernel/cpu/mshyperv.c | |||
@@ -107,6 +107,7 @@ static struct clocksource hyperv_cs = { | |||
107 | .rating = 400, /* use this when running on Hyperv*/ | 107 | .rating = 400, /* use this when running on Hyperv*/ |
108 | .read = read_hv_clock, | 108 | .read = read_hv_clock, |
109 | .mask = CLOCKSOURCE_MASK(64), | 109 | .mask = CLOCKSOURCE_MASK(64), |
110 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, | ||
110 | }; | 111 | }; |
111 | 112 | ||
112 | static void __init ms_hyperv_init_platform(void) | 113 | static void __init ms_hyperv_init_platform(void) |
diff --git a/arch/x86/kernel/ftrace.c b/arch/x86/kernel/ftrace.c index 2142376dc8c6..8b7b0a51e742 100644 --- a/arch/x86/kernel/ftrace.c +++ b/arch/x86/kernel/ftrace.c | |||
@@ -674,7 +674,7 @@ static inline void *alloc_tramp(unsigned long size) | |||
674 | } | 674 | } |
675 | static inline void tramp_free(void *tramp) | 675 | static inline void tramp_free(void *tramp) |
676 | { | 676 | { |
677 | module_free(NULL, tramp); | 677 | module_memfree(tramp); |
678 | } | 678 | } |
679 | #else | 679 | #else |
680 | /* Trampolines can only be created if modules are supported */ | 680 | /* Trampolines can only be created if modules are supported */ |
diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c index 6307a0f0cf17..705ef8d48e2d 100644 --- a/arch/x86/kernel/irq.c +++ b/arch/x86/kernel/irq.c | |||
@@ -127,7 +127,7 @@ int arch_show_interrupts(struct seq_file *p, int prec) | |||
127 | seq_puts(p, " Machine check polls\n"); | 127 | seq_puts(p, " Machine check polls\n"); |
128 | #endif | 128 | #endif |
129 | #if IS_ENABLED(CONFIG_HYPERV) || defined(CONFIG_XEN) | 129 | #if IS_ENABLED(CONFIG_HYPERV) || defined(CONFIG_XEN) |
130 | seq_printf(p, "%*s: ", prec, "THR"); | 130 | seq_printf(p, "%*s: ", prec, "HYP"); |
131 | for_each_online_cpu(j) | 131 | for_each_online_cpu(j) |
132 | seq_printf(p, "%10u ", irq_stats(j)->irq_hv_callback_count); | 132 | seq_printf(p, "%10u ", irq_stats(j)->irq_hv_callback_count); |
133 | seq_puts(p, " Hypervisor callback interrupts\n"); | 133 | seq_puts(p, " Hypervisor callback interrupts\n"); |
diff --git a/arch/x86/kernel/tls.c b/arch/x86/kernel/tls.c index 4e942f31b1a7..7fc5e843f247 100644 --- a/arch/x86/kernel/tls.c +++ b/arch/x86/kernel/tls.c | |||
@@ -29,7 +29,28 @@ static int get_free_idx(void) | |||
29 | 29 | ||
30 | static bool tls_desc_okay(const struct user_desc *info) | 30 | static bool tls_desc_okay(const struct user_desc *info) |
31 | { | 31 | { |
32 | if (LDT_empty(info)) | 32 | /* |
33 | * For historical reasons (i.e. no one ever documented how any | ||
34 | * of the segmentation APIs work), user programs can and do | ||
35 | * assume that a struct user_desc that's all zeros except for | ||
36 | * entry_number means "no segment at all". This never actually | ||
37 | * worked. In fact, up to Linux 3.19, a struct user_desc like | ||
38 | * this would create a 16-bit read-write segment with base and | ||
39 | * limit both equal to zero. | ||
40 | * | ||
41 | * That was close enough to "no segment at all" until we | ||
42 | * hardened this function to disallow 16-bit TLS segments. Fix | ||
43 | * it up by interpreting these zeroed segments the way that they | ||
44 | * were almost certainly intended to be interpreted. | ||
45 | * | ||
46 | * The correct way to ask for "no segment at all" is to specify | ||
47 | * a user_desc that satisfies LDT_empty. To keep everything | ||
48 | * working, we accept both. | ||
49 | * | ||
50 | * Note that there's a similar kludge in modify_ldt -- look at | ||
51 | * the distinction between modes 1 and 0x11. | ||
52 | */ | ||
53 | if (LDT_empty(info) || LDT_zero(info)) | ||
33 | return true; | 54 | return true; |
34 | 55 | ||
35 | /* | 56 | /* |
@@ -71,7 +92,7 @@ static void set_tls_desc(struct task_struct *p, int idx, | |||
71 | cpu = get_cpu(); | 92 | cpu = get_cpu(); |
72 | 93 | ||
73 | while (n-- > 0) { | 94 | while (n-- > 0) { |
74 | if (LDT_empty(info)) | 95 | if (LDT_empty(info) || LDT_zero(info)) |
75 | desc->a = desc->b = 0; | 96 | desc->a = desc->b = 0; |
76 | else | 97 | else |
77 | fill_ldt(desc, info); | 98 | fill_ldt(desc, info); |
diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index b7e50bba3bbb..505449700e0c 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c | |||
@@ -617,7 +617,7 @@ static unsigned long quick_pit_calibrate(void) | |||
617 | goto success; | 617 | goto success; |
618 | } | 618 | } |
619 | } | 619 | } |
620 | pr_err("Fast TSC calibration failed\n"); | 620 | pr_info("Fast TSC calibration failed\n"); |
621 | return 0; | 621 | return 0; |
622 | 622 | ||
623 | success: | 623 | success: |
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index 169b09d76ddd..de12c1d379f1 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c | |||
@@ -2348,7 +2348,7 @@ static int em_sysenter(struct x86_emulate_ctxt *ctxt) | |||
2348 | * Not recognized on AMD in compat mode (but is recognized in legacy | 2348 | * Not recognized on AMD in compat mode (but is recognized in legacy |
2349 | * mode). | 2349 | * mode). |
2350 | */ | 2350 | */ |
2351 | if ((ctxt->mode == X86EMUL_MODE_PROT32) && (efer & EFER_LMA) | 2351 | if ((ctxt->mode != X86EMUL_MODE_PROT64) && (efer & EFER_LMA) |
2352 | && !vendor_intel(ctxt)) | 2352 | && !vendor_intel(ctxt)) |
2353 | return emulate_ud(ctxt); | 2353 | return emulate_ud(ctxt); |
2354 | 2354 | ||
@@ -2359,25 +2359,13 @@ static int em_sysenter(struct x86_emulate_ctxt *ctxt) | |||
2359 | setup_syscalls_segments(ctxt, &cs, &ss); | 2359 | setup_syscalls_segments(ctxt, &cs, &ss); |
2360 | 2360 | ||
2361 | ops->get_msr(ctxt, MSR_IA32_SYSENTER_CS, &msr_data); | 2361 | ops->get_msr(ctxt, MSR_IA32_SYSENTER_CS, &msr_data); |
2362 | switch (ctxt->mode) { | 2362 | if ((msr_data & 0xfffc) == 0x0) |
2363 | case X86EMUL_MODE_PROT32: | 2363 | return emulate_gp(ctxt, 0); |
2364 | if ((msr_data & 0xfffc) == 0x0) | ||
2365 | return emulate_gp(ctxt, 0); | ||
2366 | break; | ||
2367 | case X86EMUL_MODE_PROT64: | ||
2368 | if (msr_data == 0x0) | ||
2369 | return emulate_gp(ctxt, 0); | ||
2370 | break; | ||
2371 | default: | ||
2372 | break; | ||
2373 | } | ||
2374 | 2364 | ||
2375 | ctxt->eflags &= ~(EFLG_VM | EFLG_IF); | 2365 | ctxt->eflags &= ~(EFLG_VM | EFLG_IF); |
2376 | cs_sel = (u16)msr_data; | 2366 | cs_sel = (u16)msr_data & ~SELECTOR_RPL_MASK; |
2377 | cs_sel &= ~SELECTOR_RPL_MASK; | ||
2378 | ss_sel = cs_sel + 8; | 2367 | ss_sel = cs_sel + 8; |
2379 | ss_sel &= ~SELECTOR_RPL_MASK; | 2368 | if (efer & EFER_LMA) { |
2380 | if (ctxt->mode == X86EMUL_MODE_PROT64 || (efer & EFER_LMA)) { | ||
2381 | cs.d = 0; | 2369 | cs.d = 0; |
2382 | cs.l = 1; | 2370 | cs.l = 1; |
2383 | } | 2371 | } |
@@ -2386,10 +2374,11 @@ static int em_sysenter(struct x86_emulate_ctxt *ctxt) | |||
2386 | ops->set_segment(ctxt, ss_sel, &ss, 0, VCPU_SREG_SS); | 2374 | ops->set_segment(ctxt, ss_sel, &ss, 0, VCPU_SREG_SS); |
2387 | 2375 | ||
2388 | ops->get_msr(ctxt, MSR_IA32_SYSENTER_EIP, &msr_data); | 2376 | ops->get_msr(ctxt, MSR_IA32_SYSENTER_EIP, &msr_data); |
2389 | ctxt->_eip = msr_data; | 2377 | ctxt->_eip = (efer & EFER_LMA) ? msr_data : (u32)msr_data; |
2390 | 2378 | ||
2391 | ops->get_msr(ctxt, MSR_IA32_SYSENTER_ESP, &msr_data); | 2379 | ops->get_msr(ctxt, MSR_IA32_SYSENTER_ESP, &msr_data); |
2392 | *reg_write(ctxt, VCPU_REGS_RSP) = msr_data; | 2380 | *reg_write(ctxt, VCPU_REGS_RSP) = (efer & EFER_LMA) ? msr_data : |
2381 | (u32)msr_data; | ||
2393 | 2382 | ||
2394 | return X86EMUL_CONTINUE; | 2383 | return X86EMUL_CONTINUE; |
2395 | } | 2384 | } |
@@ -3791,8 +3780,8 @@ static const struct opcode group5[] = { | |||
3791 | }; | 3780 | }; |
3792 | 3781 | ||
3793 | static const struct opcode group6[] = { | 3782 | static const struct opcode group6[] = { |
3794 | DI(Prot, sldt), | 3783 | DI(Prot | DstMem, sldt), |
3795 | DI(Prot, str), | 3784 | DI(Prot | DstMem, str), |
3796 | II(Prot | Priv | SrcMem16, em_lldt, lldt), | 3785 | II(Prot | Priv | SrcMem16, em_lldt, lldt), |
3797 | II(Prot | Priv | SrcMem16, em_ltr, ltr), | 3786 | II(Prot | Priv | SrcMem16, em_ltr, ltr), |
3798 | N, N, N, N, | 3787 | N, N, N, N, |
diff --git a/arch/x86/mm/init.c b/arch/x86/mm/init.c index 08a7d313538a..079c3b6a3ff1 100644 --- a/arch/x86/mm/init.c +++ b/arch/x86/mm/init.c | |||
@@ -43,7 +43,7 @@ uint16_t __cachemode2pte_tbl[_PAGE_CACHE_MODE_NUM] = { | |||
43 | [_PAGE_CACHE_MODE_WT] = _PAGE_PCD, | 43 | [_PAGE_CACHE_MODE_WT] = _PAGE_PCD, |
44 | [_PAGE_CACHE_MODE_WP] = _PAGE_PCD, | 44 | [_PAGE_CACHE_MODE_WP] = _PAGE_PCD, |
45 | }; | 45 | }; |
46 | EXPORT_SYMBOL_GPL(__cachemode2pte_tbl); | 46 | EXPORT_SYMBOL(__cachemode2pte_tbl); |
47 | uint8_t __pte2cachemode_tbl[8] = { | 47 | uint8_t __pte2cachemode_tbl[8] = { |
48 | [__pte2cm_idx(0)] = _PAGE_CACHE_MODE_WB, | 48 | [__pte2cm_idx(0)] = _PAGE_CACHE_MODE_WB, |
49 | [__pte2cm_idx(_PAGE_PWT)] = _PAGE_CACHE_MODE_WC, | 49 | [__pte2cm_idx(_PAGE_PWT)] = _PAGE_CACHE_MODE_WC, |
@@ -54,7 +54,7 @@ uint8_t __pte2cachemode_tbl[8] = { | |||
54 | [__pte2cm_idx(_PAGE_PCD | _PAGE_PAT)] = _PAGE_CACHE_MODE_UC_MINUS, | 54 | [__pte2cm_idx(_PAGE_PCD | _PAGE_PAT)] = _PAGE_CACHE_MODE_UC_MINUS, |
55 | [__pte2cm_idx(_PAGE_PWT | _PAGE_PCD | _PAGE_PAT)] = _PAGE_CACHE_MODE_UC, | 55 | [__pte2cm_idx(_PAGE_PWT | _PAGE_PCD | _PAGE_PAT)] = _PAGE_CACHE_MODE_UC, |
56 | }; | 56 | }; |
57 | EXPORT_SYMBOL_GPL(__pte2cachemode_tbl); | 57 | EXPORT_SYMBOL(__pte2cachemode_tbl); |
58 | 58 | ||
59 | static unsigned long __initdata pgt_buf_start; | 59 | static unsigned long __initdata pgt_buf_start; |
60 | static unsigned long __initdata pgt_buf_end; | 60 | static unsigned long __initdata pgt_buf_end; |
diff --git a/arch/x86/mm/mpx.c b/arch/x86/mm/mpx.c index 67ebf5751222..c439ec478216 100644 --- a/arch/x86/mm/mpx.c +++ b/arch/x86/mm/mpx.c | |||
@@ -349,6 +349,12 @@ static __user void *task_get_bounds_dir(struct task_struct *tsk) | |||
349 | return MPX_INVALID_BOUNDS_DIR; | 349 | return MPX_INVALID_BOUNDS_DIR; |
350 | 350 | ||
351 | /* | 351 | /* |
352 | * 32-bit binaries on 64-bit kernels are currently | ||
353 | * unsupported. | ||
354 | */ | ||
355 | if (IS_ENABLED(CONFIG_X86_64) && test_thread_flag(TIF_IA32)) | ||
356 | return MPX_INVALID_BOUNDS_DIR; | ||
357 | /* | ||
352 | * The bounds directory pointer is stored in a register | 358 | * The bounds directory pointer is stored in a register |
353 | * only accessible if we first do an xsave. | 359 | * only accessible if we first do an xsave. |
354 | */ | 360 | */ |
diff --git a/arch/x86/mm/pat.c b/arch/x86/mm/pat.c index edf299c8ff6c..7ac68698406c 100644 --- a/arch/x86/mm/pat.c +++ b/arch/x86/mm/pat.c | |||
@@ -234,8 +234,13 @@ void pat_init(void) | |||
234 | PAT(4, WB) | PAT(5, WC) | PAT(6, UC_MINUS) | PAT(7, UC); | 234 | PAT(4, WB) | PAT(5, WC) | PAT(6, UC_MINUS) | PAT(7, UC); |
235 | 235 | ||
236 | /* Boot CPU check */ | 236 | /* Boot CPU check */ |
237 | if (!boot_pat_state) | 237 | if (!boot_pat_state) { |
238 | rdmsrl(MSR_IA32_CR_PAT, boot_pat_state); | 238 | rdmsrl(MSR_IA32_CR_PAT, boot_pat_state); |
239 | if (!boot_pat_state) { | ||
240 | pat_disable("PAT read returns always zero, disabled."); | ||
241 | return; | ||
242 | } | ||
243 | } | ||
239 | 244 | ||
240 | wrmsrl(MSR_IA32_CR_PAT, pat); | 245 | wrmsrl(MSR_IA32_CR_PAT, pat); |
241 | 246 | ||
diff --git a/arch/x86/pci/i386.c b/arch/x86/pci/i386.c index 9b18ef315a55..349c0d32cc0b 100644 --- a/arch/x86/pci/i386.c +++ b/arch/x86/pci/i386.c | |||
@@ -216,7 +216,7 @@ static void pcibios_allocate_bridge_resources(struct pci_dev *dev) | |||
216 | continue; | 216 | continue; |
217 | if (r->parent) /* Already allocated */ | 217 | if (r->parent) /* Already allocated */ |
218 | continue; | 218 | continue; |
219 | if (!r->start || pci_claim_resource(dev, idx) < 0) { | 219 | if (!r->start || pci_claim_bridge_resource(dev, idx) < 0) { |
220 | /* | 220 | /* |
221 | * Something is wrong with the region. | 221 | * Something is wrong with the region. |
222 | * Invalidate the resource to prevent | 222 | * Invalidate the resource to prevent |
diff --git a/arch/x86/pci/xen.c b/arch/x86/pci/xen.c index c489ef2c1a39..9098d880c476 100644 --- a/arch/x86/pci/xen.c +++ b/arch/x86/pci/xen.c | |||
@@ -458,6 +458,7 @@ int __init pci_xen_hvm_init(void) | |||
458 | * just how GSIs get registered. | 458 | * just how GSIs get registered. |
459 | */ | 459 | */ |
460 | __acpi_register_gsi = acpi_register_gsi_xen_hvm; | 460 | __acpi_register_gsi = acpi_register_gsi_xen_hvm; |
461 | __acpi_unregister_gsi = NULL; | ||
461 | #endif | 462 | #endif |
462 | 463 | ||
463 | #ifdef CONFIG_PCI_MSI | 464 | #ifdef CONFIG_PCI_MSI |
@@ -471,52 +472,6 @@ int __init pci_xen_hvm_init(void) | |||
471 | } | 472 | } |
472 | 473 | ||
473 | #ifdef CONFIG_XEN_DOM0 | 474 | #ifdef CONFIG_XEN_DOM0 |
474 | static __init void xen_setup_acpi_sci(void) | ||
475 | { | ||
476 | int rc; | ||
477 | int trigger, polarity; | ||
478 | int gsi = acpi_sci_override_gsi; | ||
479 | int irq = -1; | ||
480 | int gsi_override = -1; | ||
481 | |||
482 | if (!gsi) | ||
483 | return; | ||
484 | |||
485 | rc = acpi_get_override_irq(gsi, &trigger, &polarity); | ||
486 | if (rc) { | ||
487 | printk(KERN_WARNING "xen: acpi_get_override_irq failed for acpi" | ||
488 | " sci, rc=%d\n", rc); | ||
489 | return; | ||
490 | } | ||
491 | trigger = trigger ? ACPI_LEVEL_SENSITIVE : ACPI_EDGE_SENSITIVE; | ||
492 | polarity = polarity ? ACPI_ACTIVE_LOW : ACPI_ACTIVE_HIGH; | ||
493 | |||
494 | printk(KERN_INFO "xen: sci override: global_irq=%d trigger=%d " | ||
495 | "polarity=%d\n", gsi, trigger, polarity); | ||
496 | |||
497 | /* Before we bind the GSI to a Linux IRQ, check whether | ||
498 | * we need to override it with bus_irq (IRQ) value. Usually for | ||
499 | * IRQs below IRQ_LEGACY_IRQ this holds IRQ == GSI, as so: | ||
500 | * ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 low level) | ||
501 | * but there are oddballs where the IRQ != GSI: | ||
502 | * ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 20 low level) | ||
503 | * which ends up being: gsi_to_irq[9] == 20 | ||
504 | * (which is what acpi_gsi_to_irq ends up calling when starting the | ||
505 | * the ACPI interpreter and keels over since IRQ 9 has not been | ||
506 | * setup as we had setup IRQ 20 for it). | ||
507 | */ | ||
508 | if (acpi_gsi_to_irq(gsi, &irq) == 0) { | ||
509 | /* Use the provided value if it's valid. */ | ||
510 | if (irq >= 0) | ||
511 | gsi_override = irq; | ||
512 | } | ||
513 | |||
514 | gsi = xen_register_gsi(gsi, gsi_override, trigger, polarity); | ||
515 | printk(KERN_INFO "xen: acpi sci %d\n", gsi); | ||
516 | |||
517 | return; | ||
518 | } | ||
519 | |||
520 | int __init pci_xen_initial_domain(void) | 475 | int __init pci_xen_initial_domain(void) |
521 | { | 476 | { |
522 | int irq; | 477 | int irq; |
@@ -527,8 +482,8 @@ int __init pci_xen_initial_domain(void) | |||
527 | x86_msi.restore_msi_irqs = xen_initdom_restore_msi_irqs; | 482 | x86_msi.restore_msi_irqs = xen_initdom_restore_msi_irqs; |
528 | pci_msi_ignore_mask = 1; | 483 | pci_msi_ignore_mask = 1; |
529 | #endif | 484 | #endif |
530 | xen_setup_acpi_sci(); | ||
531 | __acpi_register_gsi = acpi_register_gsi_xen; | 485 | __acpi_register_gsi = acpi_register_gsi_xen; |
486 | __acpi_unregister_gsi = NULL; | ||
532 | /* Pre-allocate legacy irqs */ | 487 | /* Pre-allocate legacy irqs */ |
533 | for (irq = 0; irq < nr_legacy_irqs(); irq++) { | 488 | for (irq = 0; irq < nr_legacy_irqs(); irq++) { |
534 | int trigger, polarity; | 489 | int trigger, polarity; |
diff --git a/block/blk-mq-sysfs.c b/block/blk-mq-sysfs.c index 1630a20d5dcf..6774a0e69867 100644 --- a/block/blk-mq-sysfs.c +++ b/block/blk-mq-sysfs.c | |||
@@ -15,6 +15,26 @@ | |||
15 | 15 | ||
16 | static void blk_mq_sysfs_release(struct kobject *kobj) | 16 | static void blk_mq_sysfs_release(struct kobject *kobj) |
17 | { | 17 | { |
18 | struct request_queue *q; | ||
19 | |||
20 | q = container_of(kobj, struct request_queue, mq_kobj); | ||
21 | free_percpu(q->queue_ctx); | ||
22 | } | ||
23 | |||
24 | static void blk_mq_ctx_release(struct kobject *kobj) | ||
25 | { | ||
26 | struct blk_mq_ctx *ctx; | ||
27 | |||
28 | ctx = container_of(kobj, struct blk_mq_ctx, kobj); | ||
29 | kobject_put(&ctx->queue->mq_kobj); | ||
30 | } | ||
31 | |||
32 | static void blk_mq_hctx_release(struct kobject *kobj) | ||
33 | { | ||
34 | struct blk_mq_hw_ctx *hctx; | ||
35 | |||
36 | hctx = container_of(kobj, struct blk_mq_hw_ctx, kobj); | ||
37 | kfree(hctx); | ||
18 | } | 38 | } |
19 | 39 | ||
20 | struct blk_mq_ctx_sysfs_entry { | 40 | struct blk_mq_ctx_sysfs_entry { |
@@ -318,13 +338,13 @@ static struct kobj_type blk_mq_ktype = { | |||
318 | static struct kobj_type blk_mq_ctx_ktype = { | 338 | static struct kobj_type blk_mq_ctx_ktype = { |
319 | .sysfs_ops = &blk_mq_sysfs_ops, | 339 | .sysfs_ops = &blk_mq_sysfs_ops, |
320 | .default_attrs = default_ctx_attrs, | 340 | .default_attrs = default_ctx_attrs, |
321 | .release = blk_mq_sysfs_release, | 341 | .release = blk_mq_ctx_release, |
322 | }; | 342 | }; |
323 | 343 | ||
324 | static struct kobj_type blk_mq_hw_ktype = { | 344 | static struct kobj_type blk_mq_hw_ktype = { |
325 | .sysfs_ops = &blk_mq_hw_sysfs_ops, | 345 | .sysfs_ops = &blk_mq_hw_sysfs_ops, |
326 | .default_attrs = default_hw_ctx_attrs, | 346 | .default_attrs = default_hw_ctx_attrs, |
327 | .release = blk_mq_sysfs_release, | 347 | .release = blk_mq_hctx_release, |
328 | }; | 348 | }; |
329 | 349 | ||
330 | static void blk_mq_unregister_hctx(struct blk_mq_hw_ctx *hctx) | 350 | static void blk_mq_unregister_hctx(struct blk_mq_hw_ctx *hctx) |
@@ -355,6 +375,7 @@ static int blk_mq_register_hctx(struct blk_mq_hw_ctx *hctx) | |||
355 | return ret; | 375 | return ret; |
356 | 376 | ||
357 | hctx_for_each_ctx(hctx, ctx, i) { | 377 | hctx_for_each_ctx(hctx, ctx, i) { |
378 | kobject_get(&q->mq_kobj); | ||
358 | ret = kobject_add(&ctx->kobj, &hctx->kobj, "cpu%u", ctx->cpu); | 379 | ret = kobject_add(&ctx->kobj, &hctx->kobj, "cpu%u", ctx->cpu); |
359 | if (ret) | 380 | if (ret) |
360 | break; | 381 | break; |
diff --git a/block/blk-mq.c b/block/blk-mq.c index 2f95747c287e..9ee3b87c4498 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c | |||
@@ -1641,10 +1641,8 @@ static void blk_mq_free_hw_queues(struct request_queue *q, | |||
1641 | struct blk_mq_hw_ctx *hctx; | 1641 | struct blk_mq_hw_ctx *hctx; |
1642 | unsigned int i; | 1642 | unsigned int i; |
1643 | 1643 | ||
1644 | queue_for_each_hw_ctx(q, hctx, i) { | 1644 | queue_for_each_hw_ctx(q, hctx, i) |
1645 | free_cpumask_var(hctx->cpumask); | 1645 | free_cpumask_var(hctx->cpumask); |
1646 | kfree(hctx); | ||
1647 | } | ||
1648 | } | 1646 | } |
1649 | 1647 | ||
1650 | static int blk_mq_init_hctx(struct request_queue *q, | 1648 | static int blk_mq_init_hctx(struct request_queue *q, |
@@ -2002,11 +2000,9 @@ void blk_mq_free_queue(struct request_queue *q) | |||
2002 | 2000 | ||
2003 | percpu_ref_exit(&q->mq_usage_counter); | 2001 | percpu_ref_exit(&q->mq_usage_counter); |
2004 | 2002 | ||
2005 | free_percpu(q->queue_ctx); | ||
2006 | kfree(q->queue_hw_ctx); | 2003 | kfree(q->queue_hw_ctx); |
2007 | kfree(q->mq_map); | 2004 | kfree(q->mq_map); |
2008 | 2005 | ||
2009 | q->queue_ctx = NULL; | ||
2010 | q->queue_hw_ctx = NULL; | 2006 | q->queue_hw_ctx = NULL; |
2011 | q->mq_map = NULL; | 2007 | q->mq_map = NULL; |
2012 | 2008 | ||
diff --git a/drivers/acpi/pci_irq.c b/drivers/acpi/pci_irq.c index 5277a0ee5704..b1def411c0b8 100644 --- a/drivers/acpi/pci_irq.c +++ b/drivers/acpi/pci_irq.c | |||
@@ -512,7 +512,6 @@ void acpi_pci_irq_disable(struct pci_dev *dev) | |||
512 | dev_dbg(&dev->dev, "PCI INT %c disabled\n", pin_name(pin)); | 512 | dev_dbg(&dev->dev, "PCI INT %c disabled\n", pin_name(pin)); |
513 | if (gsi >= 0) { | 513 | if (gsi >= 0) { |
514 | acpi_unregister_gsi(gsi); | 514 | acpi_unregister_gsi(gsi); |
515 | dev->irq = 0; | ||
516 | dev->irq_managed = 0; | 515 | dev->irq_managed = 0; |
517 | } | 516 | } |
518 | } | 517 | } |
diff --git a/drivers/block/nvme-core.c b/drivers/block/nvme-core.c index cb529e9a82dd..d826bf3e62c8 100644 --- a/drivers/block/nvme-core.c +++ b/drivers/block/nvme-core.c | |||
@@ -106,7 +106,7 @@ struct nvme_queue { | |||
106 | dma_addr_t cq_dma_addr; | 106 | dma_addr_t cq_dma_addr; |
107 | u32 __iomem *q_db; | 107 | u32 __iomem *q_db; |
108 | u16 q_depth; | 108 | u16 q_depth; |
109 | u16 cq_vector; | 109 | s16 cq_vector; |
110 | u16 sq_head; | 110 | u16 sq_head; |
111 | u16 sq_tail; | 111 | u16 sq_tail; |
112 | u16 cq_head; | 112 | u16 cq_head; |
diff --git a/drivers/bus/mvebu-mbus.c b/drivers/bus/mvebu-mbus.c index eb7682dc123b..81bf297f1034 100644 --- a/drivers/bus/mvebu-mbus.c +++ b/drivers/bus/mvebu-mbus.c | |||
@@ -210,12 +210,25 @@ static void mvebu_mbus_disable_window(struct mvebu_mbus_state *mbus, | |||
210 | } | 210 | } |
211 | 211 | ||
212 | /* Checks whether the given window number is available */ | 212 | /* Checks whether the given window number is available */ |
213 | |||
214 | /* On Armada XP, 375 and 38x the MBus window 13 has the remap | ||
215 | * capability, like windows 0 to 7. However, the mvebu-mbus driver | ||
216 | * isn't currently taking into account this special case, which means | ||
217 | * that when window 13 is actually used, the remap registers are left | ||
218 | * to 0, making the device using this MBus window unavailable. The | ||
219 | * quick fix for stable is to not use window 13. A follow up patch | ||
220 | * will correctly handle this window. | ||
221 | */ | ||
213 | static int mvebu_mbus_window_is_free(struct mvebu_mbus_state *mbus, | 222 | static int mvebu_mbus_window_is_free(struct mvebu_mbus_state *mbus, |
214 | const int win) | 223 | const int win) |
215 | { | 224 | { |
216 | void __iomem *addr = mbus->mbuswins_base + | 225 | void __iomem *addr = mbus->mbuswins_base + |
217 | mbus->soc->win_cfg_offset(win); | 226 | mbus->soc->win_cfg_offset(win); |
218 | u32 ctrl = readl(addr + WIN_CTRL_OFF); | 227 | u32 ctrl = readl(addr + WIN_CTRL_OFF); |
228 | |||
229 | if (win == 13) | ||
230 | return false; | ||
231 | |||
219 | return !(ctrl & WIN_CTRL_ENABLE); | 232 | return !(ctrl & WIN_CTRL_ENABLE); |
220 | } | 233 | } |
221 | 234 | ||
diff --git a/drivers/clocksource/bcm_kona_timer.c b/drivers/clocksource/bcm_kona_timer.c index 0595dc6c453e..f1e33d08dd83 100644 --- a/drivers/clocksource/bcm_kona_timer.c +++ b/drivers/clocksource/bcm_kona_timer.c | |||
@@ -68,9 +68,8 @@ static void kona_timer_disable_and_clear(void __iomem *base) | |||
68 | } | 68 | } |
69 | 69 | ||
70 | static void | 70 | static void |
71 | kona_timer_get_counter(void *timer_base, uint32_t *msw, uint32_t *lsw) | 71 | kona_timer_get_counter(void __iomem *timer_base, uint32_t *msw, uint32_t *lsw) |
72 | { | 72 | { |
73 | void __iomem *base = IOMEM(timer_base); | ||
74 | int loop_limit = 4; | 73 | int loop_limit = 4; |
75 | 74 | ||
76 | /* | 75 | /* |
@@ -86,9 +85,9 @@ kona_timer_get_counter(void *timer_base, uint32_t *msw, uint32_t *lsw) | |||
86 | */ | 85 | */ |
87 | 86 | ||
88 | while (--loop_limit) { | 87 | while (--loop_limit) { |
89 | *msw = readl(base + KONA_GPTIMER_STCHI_OFFSET); | 88 | *msw = readl(timer_base + KONA_GPTIMER_STCHI_OFFSET); |
90 | *lsw = readl(base + KONA_GPTIMER_STCLO_OFFSET); | 89 | *lsw = readl(timer_base + KONA_GPTIMER_STCLO_OFFSET); |
91 | if (*msw == readl(base + KONA_GPTIMER_STCHI_OFFSET)) | 90 | if (*msw == readl(timer_base + KONA_GPTIMER_STCHI_OFFSET)) |
92 | break; | 91 | break; |
93 | } | 92 | } |
94 | if (!loop_limit) { | 93 | if (!loop_limit) { |
diff --git a/drivers/clocksource/exynos_mct.c b/drivers/clocksource/exynos_mct.c index 9403061a2acc..83564c9cfdbe 100644 --- a/drivers/clocksource/exynos_mct.c +++ b/drivers/clocksource/exynos_mct.c | |||
@@ -97,8 +97,8 @@ static void exynos4_mct_write(unsigned int value, unsigned long offset) | |||
97 | writel_relaxed(value, reg_base + offset); | 97 | writel_relaxed(value, reg_base + offset); |
98 | 98 | ||
99 | if (likely(offset >= EXYNOS4_MCT_L_BASE(0))) { | 99 | if (likely(offset >= EXYNOS4_MCT_L_BASE(0))) { |
100 | stat_addr = (offset & ~EXYNOS4_MCT_L_MASK) + MCT_L_WSTAT_OFFSET; | 100 | stat_addr = (offset & EXYNOS4_MCT_L_MASK) + MCT_L_WSTAT_OFFSET; |
101 | switch (offset & EXYNOS4_MCT_L_MASK) { | 101 | switch (offset & ~EXYNOS4_MCT_L_MASK) { |
102 | case MCT_L_TCON_OFFSET: | 102 | case MCT_L_TCON_OFFSET: |
103 | mask = 1 << 3; /* L_TCON write status */ | 103 | mask = 1 << 3; /* L_TCON write status */ |
104 | break; | 104 | break; |
diff --git a/drivers/clocksource/sh_tmu.c b/drivers/clocksource/sh_tmu.c index 0f665b8f2461..f150ca82bfaf 100644 --- a/drivers/clocksource/sh_tmu.c +++ b/drivers/clocksource/sh_tmu.c | |||
@@ -428,7 +428,7 @@ static void sh_tmu_register_clockevent(struct sh_tmu_channel *ch, | |||
428 | ced->features = CLOCK_EVT_FEAT_PERIODIC; | 428 | ced->features = CLOCK_EVT_FEAT_PERIODIC; |
429 | ced->features |= CLOCK_EVT_FEAT_ONESHOT; | 429 | ced->features |= CLOCK_EVT_FEAT_ONESHOT; |
430 | ced->rating = 200; | 430 | ced->rating = 200; |
431 | ced->cpumask = cpumask_of(0); | 431 | ced->cpumask = cpu_possible_mask; |
432 | ced->set_next_event = sh_tmu_clock_event_next; | 432 | ced->set_next_event = sh_tmu_clock_event_next; |
433 | ced->set_mode = sh_tmu_clock_event_mode; | 433 | ced->set_mode = sh_tmu_clock_event_mode; |
434 | ced->suspend = sh_tmu_clock_event_suspend; | 434 | ced->suspend = sh_tmu_clock_event_suspend; |
diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig index 6529c09c46f0..a7de26d1ac80 100644 --- a/drivers/hwmon/Kconfig +++ b/drivers/hwmon/Kconfig | |||
@@ -574,6 +574,16 @@ config SENSORS_IIO_HWMON | |||
574 | for those channels specified in the map. This map can be provided | 574 | for those channels specified in the map. This map can be provided |
575 | either via platform data or the device tree bindings. | 575 | either via platform data or the device tree bindings. |
576 | 576 | ||
577 | config SENSORS_I5500 | ||
578 | tristate "Intel 5500/5520/X58 temperature sensor" | ||
579 | depends on X86 && PCI | ||
580 | help | ||
581 | If you say yes here you get support for the temperature | ||
582 | sensor inside the Intel 5500, 5520 and X58 chipsets. | ||
583 | |||
584 | This driver can also be built as a module. If so, the module | ||
585 | will be called i5500_temp. | ||
586 | |||
577 | config SENSORS_CORETEMP | 587 | config SENSORS_CORETEMP |
578 | tristate "Intel Core/Core2/Atom temperature sensor" | 588 | tristate "Intel Core/Core2/Atom temperature sensor" |
579 | depends on X86 | 589 | depends on X86 |
diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile index 67280643bcf0..6c941472e707 100644 --- a/drivers/hwmon/Makefile +++ b/drivers/hwmon/Makefile | |||
@@ -68,6 +68,7 @@ obj-$(CONFIG_SENSORS_GPIO_FAN) += gpio-fan.o | |||
68 | obj-$(CONFIG_SENSORS_HIH6130) += hih6130.o | 68 | obj-$(CONFIG_SENSORS_HIH6130) += hih6130.o |
69 | obj-$(CONFIG_SENSORS_HTU21) += htu21.o | 69 | obj-$(CONFIG_SENSORS_HTU21) += htu21.o |
70 | obj-$(CONFIG_SENSORS_ULTRA45) += ultra45_env.o | 70 | obj-$(CONFIG_SENSORS_ULTRA45) += ultra45_env.o |
71 | obj-$(CONFIG_SENSORS_I5500) += i5500_temp.o | ||
71 | obj-$(CONFIG_SENSORS_I5K_AMB) += i5k_amb.o | 72 | obj-$(CONFIG_SENSORS_I5K_AMB) += i5k_amb.o |
72 | obj-$(CONFIG_SENSORS_IBMAEM) += ibmaem.o | 73 | obj-$(CONFIG_SENSORS_IBMAEM) += ibmaem.o |
73 | obj-$(CONFIG_SENSORS_IBMPEX) += ibmpex.o | 74 | obj-$(CONFIG_SENSORS_IBMPEX) += ibmpex.o |
diff --git a/drivers/hwmon/i5500_temp.c b/drivers/hwmon/i5500_temp.c new file mode 100644 index 000000000000..3e3ccbf18b4e --- /dev/null +++ b/drivers/hwmon/i5500_temp.c | |||
@@ -0,0 +1,149 @@ | |||
1 | /* | ||
2 | * i5500_temp - Driver for Intel 5500/5520/X58 chipset thermal sensor | ||
3 | * | ||
4 | * Copyright (C) 2012, 2014 Jean Delvare <jdelvare@suse.de> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | */ | ||
16 | |||
17 | #include <linux/module.h> | ||
18 | #include <linux/init.h> | ||
19 | #include <linux/slab.h> | ||
20 | #include <linux/jiffies.h> | ||
21 | #include <linux/device.h> | ||
22 | #include <linux/pci.h> | ||
23 | #include <linux/hwmon.h> | ||
24 | #include <linux/hwmon-sysfs.h> | ||
25 | #include <linux/err.h> | ||
26 | #include <linux/mutex.h> | ||
27 | |||
28 | /* Register definitions from datasheet */ | ||
29 | #define REG_TSTHRCATA 0xE2 | ||
30 | #define REG_TSCTRL 0xE8 | ||
31 | #define REG_TSTHRRPEX 0xEB | ||
32 | #define REG_TSTHRLO 0xEC | ||
33 | #define REG_TSTHRHI 0xEE | ||
34 | #define REG_CTHINT 0xF0 | ||
35 | #define REG_TSFSC 0xF3 | ||
36 | #define REG_CTSTS 0xF4 | ||
37 | #define REG_TSTHRRQPI 0xF5 | ||
38 | #define REG_CTCTRL 0xF7 | ||
39 | #define REG_TSTIMER 0xF8 | ||
40 | |||
41 | /* | ||
42 | * Sysfs stuff | ||
43 | */ | ||
44 | |||
45 | /* Sensor resolution : 0.5 degree C */ | ||
46 | static ssize_t show_temp(struct device *dev, | ||
47 | struct device_attribute *devattr, char *buf) | ||
48 | { | ||
49 | struct pci_dev *pdev = to_pci_dev(dev->parent); | ||
50 | long temp; | ||
51 | u16 tsthrhi; | ||
52 | s8 tsfsc; | ||
53 | |||
54 | pci_read_config_word(pdev, REG_TSTHRHI, &tsthrhi); | ||
55 | pci_read_config_byte(pdev, REG_TSFSC, &tsfsc); | ||
56 | temp = ((long)tsthrhi - tsfsc) * 500; | ||
57 | |||
58 | return sprintf(buf, "%ld\n", temp); | ||
59 | } | ||
60 | |||
61 | static ssize_t show_thresh(struct device *dev, | ||
62 | struct device_attribute *devattr, char *buf) | ||
63 | { | ||
64 | struct pci_dev *pdev = to_pci_dev(dev->parent); | ||
65 | int reg = to_sensor_dev_attr(devattr)->index; | ||
66 | long temp; | ||
67 | u16 tsthr; | ||
68 | |||
69 | pci_read_config_word(pdev, reg, &tsthr); | ||
70 | temp = tsthr * 500; | ||
71 | |||
72 | return sprintf(buf, "%ld\n", temp); | ||
73 | } | ||
74 | |||
75 | static ssize_t show_alarm(struct device *dev, | ||
76 | struct device_attribute *devattr, char *buf) | ||
77 | { | ||
78 | struct pci_dev *pdev = to_pci_dev(dev->parent); | ||
79 | int nr = to_sensor_dev_attr(devattr)->index; | ||
80 | u8 ctsts; | ||
81 | |||
82 | pci_read_config_byte(pdev, REG_CTSTS, &ctsts); | ||
83 | return sprintf(buf, "%u\n", (unsigned int)ctsts & (1 << nr)); | ||
84 | } | ||
85 | |||
86 | static DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL); | ||
87 | static SENSOR_DEVICE_ATTR(temp1_crit, S_IRUGO, show_thresh, NULL, 0xE2); | ||
88 | static SENSOR_DEVICE_ATTR(temp1_max_hyst, S_IRUGO, show_thresh, NULL, 0xEC); | ||
89 | static SENSOR_DEVICE_ATTR(temp1_max, S_IRUGO, show_thresh, NULL, 0xEE); | ||
90 | static SENSOR_DEVICE_ATTR(temp1_crit_alarm, S_IRUGO, show_alarm, NULL, 0); | ||
91 | static SENSOR_DEVICE_ATTR(temp1_max_alarm, S_IRUGO, show_alarm, NULL, 1); | ||
92 | |||
93 | static struct attribute *i5500_temp_attrs[] = { | ||
94 | &dev_attr_temp1_input.attr, | ||
95 | &sensor_dev_attr_temp1_crit.dev_attr.attr, | ||
96 | &sensor_dev_attr_temp1_max_hyst.dev_attr.attr, | ||
97 | &sensor_dev_attr_temp1_max.dev_attr.attr, | ||
98 | &sensor_dev_attr_temp1_crit_alarm.dev_attr.attr, | ||
99 | &sensor_dev_attr_temp1_max_alarm.dev_attr.attr, | ||
100 | NULL | ||
101 | }; | ||
102 | |||
103 | ATTRIBUTE_GROUPS(i5500_temp); | ||
104 | |||
105 | static const struct pci_device_id i5500_temp_ids[] = { | ||
106 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x3438) }, | ||
107 | { 0 }, | ||
108 | }; | ||
109 | |||
110 | MODULE_DEVICE_TABLE(pci, i5500_temp_ids); | ||
111 | |||
112 | static int i5500_temp_probe(struct pci_dev *pdev, | ||
113 | const struct pci_device_id *id) | ||
114 | { | ||
115 | int err; | ||
116 | struct device *hwmon_dev; | ||
117 | u32 tstimer; | ||
118 | s8 tsfsc; | ||
119 | |||
120 | err = pci_enable_device(pdev); | ||
121 | if (err) { | ||
122 | dev_err(&pdev->dev, "Failed to enable device\n"); | ||
123 | return err; | ||
124 | } | ||
125 | |||
126 | pci_read_config_byte(pdev, REG_TSFSC, &tsfsc); | ||
127 | pci_read_config_dword(pdev, REG_TSTIMER, &tstimer); | ||
128 | if (tsfsc == 0x7F && tstimer == 0x07D30D40) { | ||
129 | dev_notice(&pdev->dev, "Sensor seems to be disabled\n"); | ||
130 | return -ENODEV; | ||
131 | } | ||
132 | |||
133 | hwmon_dev = devm_hwmon_device_register_with_groups(&pdev->dev, | ||
134 | "intel5500", NULL, | ||
135 | i5500_temp_groups); | ||
136 | return PTR_ERR_OR_ZERO(hwmon_dev); | ||
137 | } | ||
138 | |||
139 | static struct pci_driver i5500_temp_driver = { | ||
140 | .name = "i5500_temp", | ||
141 | .id_table = i5500_temp_ids, | ||
142 | .probe = i5500_temp_probe, | ||
143 | }; | ||
144 | |||
145 | module_pci_driver(i5500_temp_driver); | ||
146 | |||
147 | MODULE_AUTHOR("Jean Delvare <jdelvare@suse.de>"); | ||
148 | MODULE_DESCRIPTION("Intel 5500/5520/X58 chipset thermal sensor driver"); | ||
149 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/irqchip/irq-atmel-aic-common.c b/drivers/irqchip/irq-atmel-aic-common.c index d111ac779c40..63cd031b2c28 100644 --- a/drivers/irqchip/irq-atmel-aic-common.c +++ b/drivers/irqchip/irq-atmel-aic-common.c | |||
@@ -28,7 +28,7 @@ | |||
28 | #define AT91_AIC_IRQ_MIN_PRIORITY 0 | 28 | #define AT91_AIC_IRQ_MIN_PRIORITY 0 |
29 | #define AT91_AIC_IRQ_MAX_PRIORITY 7 | 29 | #define AT91_AIC_IRQ_MAX_PRIORITY 7 |
30 | 30 | ||
31 | #define AT91_AIC_SRCTYPE GENMASK(7, 6) | 31 | #define AT91_AIC_SRCTYPE GENMASK(6, 5) |
32 | #define AT91_AIC_SRCTYPE_LOW (0 << 5) | 32 | #define AT91_AIC_SRCTYPE_LOW (0 << 5) |
33 | #define AT91_AIC_SRCTYPE_FALLING (1 << 5) | 33 | #define AT91_AIC_SRCTYPE_FALLING (1 << 5) |
34 | #define AT91_AIC_SRCTYPE_HIGH (2 << 5) | 34 | #define AT91_AIC_SRCTYPE_HIGH (2 << 5) |
@@ -74,7 +74,7 @@ int aic_common_set_type(struct irq_data *d, unsigned type, unsigned *val) | |||
74 | return -EINVAL; | 74 | return -EINVAL; |
75 | } | 75 | } |
76 | 76 | ||
77 | *val &= AT91_AIC_SRCTYPE; | 77 | *val &= ~AT91_AIC_SRCTYPE; |
78 | *val |= aic_type; | 78 | *val |= aic_type; |
79 | 79 | ||
80 | return 0; | 80 | return 0; |
diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c index 86e4684adeb1..d8996bdf0f61 100644 --- a/drivers/irqchip/irq-gic-v3-its.c +++ b/drivers/irqchip/irq-gic-v3-its.c | |||
@@ -1053,7 +1053,7 @@ static struct its_device *its_create_device(struct its_node *its, u32 dev_id, | |||
1053 | * of two entries. No, the architecture doesn't let you | 1053 | * of two entries. No, the architecture doesn't let you |
1054 | * express an ITT with a single entry. | 1054 | * express an ITT with a single entry. |
1055 | */ | 1055 | */ |
1056 | nr_ites = max(2, roundup_pow_of_two(nvecs)); | 1056 | nr_ites = max(2UL, roundup_pow_of_two(nvecs)); |
1057 | sz = nr_ites * its->ite_size; | 1057 | sz = nr_ites * its->ite_size; |
1058 | sz = max(sz, ITS_ITT_ALIGN) + ITS_ITT_ALIGN - 1; | 1058 | sz = max(sz, ITS_ITT_ALIGN) + ITS_ITT_ALIGN - 1; |
1059 | itt = kmalloc(sz, GFP_KERNEL); | 1059 | itt = kmalloc(sz, GFP_KERNEL); |
diff --git a/drivers/irqchip/irq-hip04.c b/drivers/irqchip/irq-hip04.c index 29b8f21b74d0..6bc2deb73d53 100644 --- a/drivers/irqchip/irq-hip04.c +++ b/drivers/irqchip/irq-hip04.c | |||
@@ -381,7 +381,7 @@ hip04_of_init(struct device_node *node, struct device_node *parent) | |||
381 | * It will be refined as each CPU probes its ID. | 381 | * It will be refined as each CPU probes its ID. |
382 | */ | 382 | */ |
383 | for (i = 0; i < NR_HIP04_CPU_IF; i++) | 383 | for (i = 0; i < NR_HIP04_CPU_IF; i++) |
384 | hip04_cpu_map[i] = 0xff; | 384 | hip04_cpu_map[i] = 0xffff; |
385 | 385 | ||
386 | /* | 386 | /* |
387 | * Find out how many interrupts are supported. | 387 | * Find out how many interrupts are supported. |
diff --git a/drivers/irqchip/irq-mtk-sysirq.c b/drivers/irqchip/irq-mtk-sysirq.c index 7e342df6a62f..0b0d2c00a2df 100644 --- a/drivers/irqchip/irq-mtk-sysirq.c +++ b/drivers/irqchip/irq-mtk-sysirq.c | |||
@@ -137,9 +137,9 @@ static int __init mtk_sysirq_of_init(struct device_node *node, | |||
137 | return -ENOMEM; | 137 | return -ENOMEM; |
138 | 138 | ||
139 | chip_data->intpol_base = of_io_request_and_map(node, 0, "intpol"); | 139 | chip_data->intpol_base = of_io_request_and_map(node, 0, "intpol"); |
140 | if (!chip_data->intpol_base) { | 140 | if (IS_ERR(chip_data->intpol_base)) { |
141 | pr_err("mtk_sysirq: unable to map sysirq register\n"); | 141 | pr_err("mtk_sysirq: unable to map sysirq register\n"); |
142 | ret = -ENOMEM; | 142 | ret = PTR_ERR(chip_data->intpol_base); |
143 | goto out_free; | 143 | goto out_free; |
144 | } | 144 | } |
145 | 145 | ||
diff --git a/drivers/irqchip/irq-omap-intc.c b/drivers/irqchip/irq-omap-intc.c index 28718d3e8281..c03f140acbae 100644 --- a/drivers/irqchip/irq-omap-intc.c +++ b/drivers/irqchip/irq-omap-intc.c | |||
@@ -263,7 +263,7 @@ static int __init omap_init_irq_of(struct device_node *node) | |||
263 | return ret; | 263 | return ret; |
264 | } | 264 | } |
265 | 265 | ||
266 | static int __init omap_init_irq_legacy(u32 base) | 266 | static int __init omap_init_irq_legacy(u32 base, struct device_node *node) |
267 | { | 267 | { |
268 | int j, irq_base; | 268 | int j, irq_base; |
269 | 269 | ||
@@ -277,7 +277,7 @@ static int __init omap_init_irq_legacy(u32 base) | |||
277 | irq_base = 0; | 277 | irq_base = 0; |
278 | } | 278 | } |
279 | 279 | ||
280 | domain = irq_domain_add_legacy(NULL, omap_nr_irqs, irq_base, 0, | 280 | domain = irq_domain_add_legacy(node, omap_nr_irqs, irq_base, 0, |
281 | &irq_domain_simple_ops, NULL); | 281 | &irq_domain_simple_ops, NULL); |
282 | 282 | ||
283 | omap_irq_soft_reset(); | 283 | omap_irq_soft_reset(); |
@@ -301,10 +301,26 @@ static int __init omap_init_irq(u32 base, struct device_node *node) | |||
301 | { | 301 | { |
302 | int ret; | 302 | int ret; |
303 | 303 | ||
304 | if (node) | 304 | /* |
305 | * FIXME legacy OMAP DMA driver sitting under arch/arm/plat-omap/dma.c | ||
306 | * depends is still not ready for linear IRQ domains; because of that | ||
307 | * we need to temporarily "blacklist" OMAP2 and OMAP3 devices from using | ||
308 | * linear IRQ Domain until that driver is finally fixed. | ||
309 | */ | ||
310 | if (of_device_is_compatible(node, "ti,omap2-intc") || | ||
311 | of_device_is_compatible(node, "ti,omap3-intc")) { | ||
312 | struct resource res; | ||
313 | |||
314 | if (of_address_to_resource(node, 0, &res)) | ||
315 | return -ENOMEM; | ||
316 | |||
317 | base = res.start; | ||
318 | ret = omap_init_irq_legacy(base, node); | ||
319 | } else if (node) { | ||
305 | ret = omap_init_irq_of(node); | 320 | ret = omap_init_irq_of(node); |
306 | else | 321 | } else { |
307 | ret = omap_init_irq_legacy(base); | 322 | ret = omap_init_irq_legacy(base, NULL); |
323 | } | ||
308 | 324 | ||
309 | if (ret == 0) | 325 | if (ret == 0) |
310 | omap_irq_enable_protection(); | 326 | omap_irq_enable_protection(); |
diff --git a/drivers/md/dm-cache-metadata.c b/drivers/md/dm-cache-metadata.c index 9fc616c2755e..21b156242e42 100644 --- a/drivers/md/dm-cache-metadata.c +++ b/drivers/md/dm-cache-metadata.c | |||
@@ -94,6 +94,9 @@ struct cache_disk_superblock { | |||
94 | } __packed; | 94 | } __packed; |
95 | 95 | ||
96 | struct dm_cache_metadata { | 96 | struct dm_cache_metadata { |
97 | atomic_t ref_count; | ||
98 | struct list_head list; | ||
99 | |||
97 | struct block_device *bdev; | 100 | struct block_device *bdev; |
98 | struct dm_block_manager *bm; | 101 | struct dm_block_manager *bm; |
99 | struct dm_space_map *metadata_sm; | 102 | struct dm_space_map *metadata_sm; |
@@ -669,10 +672,10 @@ static void unpack_value(__le64 value_le, dm_oblock_t *block, unsigned *flags) | |||
669 | 672 | ||
670 | /*----------------------------------------------------------------*/ | 673 | /*----------------------------------------------------------------*/ |
671 | 674 | ||
672 | struct dm_cache_metadata *dm_cache_metadata_open(struct block_device *bdev, | 675 | static struct dm_cache_metadata *metadata_open(struct block_device *bdev, |
673 | sector_t data_block_size, | 676 | sector_t data_block_size, |
674 | bool may_format_device, | 677 | bool may_format_device, |
675 | size_t policy_hint_size) | 678 | size_t policy_hint_size) |
676 | { | 679 | { |
677 | int r; | 680 | int r; |
678 | struct dm_cache_metadata *cmd; | 681 | struct dm_cache_metadata *cmd; |
@@ -683,6 +686,7 @@ struct dm_cache_metadata *dm_cache_metadata_open(struct block_device *bdev, | |||
683 | return NULL; | 686 | return NULL; |
684 | } | 687 | } |
685 | 688 | ||
689 | atomic_set(&cmd->ref_count, 1); | ||
686 | init_rwsem(&cmd->root_lock); | 690 | init_rwsem(&cmd->root_lock); |
687 | cmd->bdev = bdev; | 691 | cmd->bdev = bdev; |
688 | cmd->data_block_size = data_block_size; | 692 | cmd->data_block_size = data_block_size; |
@@ -705,10 +709,95 @@ struct dm_cache_metadata *dm_cache_metadata_open(struct block_device *bdev, | |||
705 | return cmd; | 709 | return cmd; |
706 | } | 710 | } |
707 | 711 | ||
712 | /* | ||
713 | * We keep a little list of ref counted metadata objects to prevent two | ||
714 | * different target instances creating separate bufio instances. This is | ||
715 | * an issue if a table is reloaded before the suspend. | ||
716 | */ | ||
717 | static DEFINE_MUTEX(table_lock); | ||
718 | static LIST_HEAD(table); | ||
719 | |||
720 | static struct dm_cache_metadata *lookup(struct block_device *bdev) | ||
721 | { | ||
722 | struct dm_cache_metadata *cmd; | ||
723 | |||
724 | list_for_each_entry(cmd, &table, list) | ||
725 | if (cmd->bdev == bdev) { | ||
726 | atomic_inc(&cmd->ref_count); | ||
727 | return cmd; | ||
728 | } | ||
729 | |||
730 | return NULL; | ||
731 | } | ||
732 | |||
733 | static struct dm_cache_metadata *lookup_or_open(struct block_device *bdev, | ||
734 | sector_t data_block_size, | ||
735 | bool may_format_device, | ||
736 | size_t policy_hint_size) | ||
737 | { | ||
738 | struct dm_cache_metadata *cmd, *cmd2; | ||
739 | |||
740 | mutex_lock(&table_lock); | ||
741 | cmd = lookup(bdev); | ||
742 | mutex_unlock(&table_lock); | ||
743 | |||
744 | if (cmd) | ||
745 | return cmd; | ||
746 | |||
747 | cmd = metadata_open(bdev, data_block_size, may_format_device, policy_hint_size); | ||
748 | if (cmd) { | ||
749 | mutex_lock(&table_lock); | ||
750 | cmd2 = lookup(bdev); | ||
751 | if (cmd2) { | ||
752 | mutex_unlock(&table_lock); | ||
753 | __destroy_persistent_data_objects(cmd); | ||
754 | kfree(cmd); | ||
755 | return cmd2; | ||
756 | } | ||
757 | list_add(&cmd->list, &table); | ||
758 | mutex_unlock(&table_lock); | ||
759 | } | ||
760 | |||
761 | return cmd; | ||
762 | } | ||
763 | |||
764 | static bool same_params(struct dm_cache_metadata *cmd, sector_t data_block_size) | ||
765 | { | ||
766 | if (cmd->data_block_size != data_block_size) { | ||
767 | DMERR("data_block_size (%llu) different from that in metadata (%llu)\n", | ||
768 | (unsigned long long) data_block_size, | ||
769 | (unsigned long long) cmd->data_block_size); | ||
770 | return false; | ||
771 | } | ||
772 | |||
773 | return true; | ||
774 | } | ||
775 | |||
776 | struct dm_cache_metadata *dm_cache_metadata_open(struct block_device *bdev, | ||
777 | sector_t data_block_size, | ||
778 | bool may_format_device, | ||
779 | size_t policy_hint_size) | ||
780 | { | ||
781 | struct dm_cache_metadata *cmd = lookup_or_open(bdev, data_block_size, | ||
782 | may_format_device, policy_hint_size); | ||
783 | if (cmd && !same_params(cmd, data_block_size)) { | ||
784 | dm_cache_metadata_close(cmd); | ||
785 | return NULL; | ||
786 | } | ||
787 | |||
788 | return cmd; | ||
789 | } | ||
790 | |||
708 | void dm_cache_metadata_close(struct dm_cache_metadata *cmd) | 791 | void dm_cache_metadata_close(struct dm_cache_metadata *cmd) |
709 | { | 792 | { |
710 | __destroy_persistent_data_objects(cmd); | 793 | if (atomic_dec_and_test(&cmd->ref_count)) { |
711 | kfree(cmd); | 794 | mutex_lock(&table_lock); |
795 | list_del(&cmd->list); | ||
796 | mutex_unlock(&table_lock); | ||
797 | |||
798 | __destroy_persistent_data_objects(cmd); | ||
799 | kfree(cmd); | ||
800 | } | ||
712 | } | 801 | } |
713 | 802 | ||
714 | /* | 803 | /* |
diff --git a/drivers/md/dm-cache-target.c b/drivers/md/dm-cache-target.c index 1e96d7889f51..e1650539cc2f 100644 --- a/drivers/md/dm-cache-target.c +++ b/drivers/md/dm-cache-target.c | |||
@@ -221,7 +221,13 @@ struct cache { | |||
221 | struct list_head need_commit_migrations; | 221 | struct list_head need_commit_migrations; |
222 | sector_t migration_threshold; | 222 | sector_t migration_threshold; |
223 | wait_queue_head_t migration_wait; | 223 | wait_queue_head_t migration_wait; |
224 | atomic_t nr_migrations; | 224 | atomic_t nr_allocated_migrations; |
225 | |||
226 | /* | ||
227 | * The number of in flight migrations that are performing | ||
228 | * background io. eg, promotion, writeback. | ||
229 | */ | ||
230 | atomic_t nr_io_migrations; | ||
225 | 231 | ||
226 | wait_queue_head_t quiescing_wait; | 232 | wait_queue_head_t quiescing_wait; |
227 | atomic_t quiescing; | 233 | atomic_t quiescing; |
@@ -258,7 +264,6 @@ struct cache { | |||
258 | struct dm_deferred_set *all_io_ds; | 264 | struct dm_deferred_set *all_io_ds; |
259 | 265 | ||
260 | mempool_t *migration_pool; | 266 | mempool_t *migration_pool; |
261 | struct dm_cache_migration *next_migration; | ||
262 | 267 | ||
263 | struct dm_cache_policy *policy; | 268 | struct dm_cache_policy *policy; |
264 | unsigned policy_nr_args; | 269 | unsigned policy_nr_args; |
@@ -350,10 +355,31 @@ static void free_prison_cell(struct cache *cache, struct dm_bio_prison_cell *cel | |||
350 | dm_bio_prison_free_cell(cache->prison, cell); | 355 | dm_bio_prison_free_cell(cache->prison, cell); |
351 | } | 356 | } |
352 | 357 | ||
358 | static struct dm_cache_migration *alloc_migration(struct cache *cache) | ||
359 | { | ||
360 | struct dm_cache_migration *mg; | ||
361 | |||
362 | mg = mempool_alloc(cache->migration_pool, GFP_NOWAIT); | ||
363 | if (mg) { | ||
364 | mg->cache = cache; | ||
365 | atomic_inc(&mg->cache->nr_allocated_migrations); | ||
366 | } | ||
367 | |||
368 | return mg; | ||
369 | } | ||
370 | |||
371 | static void free_migration(struct dm_cache_migration *mg) | ||
372 | { | ||
373 | if (atomic_dec_and_test(&mg->cache->nr_allocated_migrations)) | ||
374 | wake_up(&mg->cache->migration_wait); | ||
375 | |||
376 | mempool_free(mg, mg->cache->migration_pool); | ||
377 | } | ||
378 | |||
353 | static int prealloc_data_structs(struct cache *cache, struct prealloc *p) | 379 | static int prealloc_data_structs(struct cache *cache, struct prealloc *p) |
354 | { | 380 | { |
355 | if (!p->mg) { | 381 | if (!p->mg) { |
356 | p->mg = mempool_alloc(cache->migration_pool, GFP_NOWAIT); | 382 | p->mg = alloc_migration(cache); |
357 | if (!p->mg) | 383 | if (!p->mg) |
358 | return -ENOMEM; | 384 | return -ENOMEM; |
359 | } | 385 | } |
@@ -382,7 +408,7 @@ static void prealloc_free_structs(struct cache *cache, struct prealloc *p) | |||
382 | free_prison_cell(cache, p->cell1); | 408 | free_prison_cell(cache, p->cell1); |
383 | 409 | ||
384 | if (p->mg) | 410 | if (p->mg) |
385 | mempool_free(p->mg, cache->migration_pool); | 411 | free_migration(p->mg); |
386 | } | 412 | } |
387 | 413 | ||
388 | static struct dm_cache_migration *prealloc_get_migration(struct prealloc *p) | 414 | static struct dm_cache_migration *prealloc_get_migration(struct prealloc *p) |
@@ -854,24 +880,14 @@ static void remap_to_origin_then_cache(struct cache *cache, struct bio *bio, | |||
854 | * Migration covers moving data from the origin device to the cache, or | 880 | * Migration covers moving data from the origin device to the cache, or |
855 | * vice versa. | 881 | * vice versa. |
856 | *--------------------------------------------------------------*/ | 882 | *--------------------------------------------------------------*/ |
857 | static void free_migration(struct dm_cache_migration *mg) | 883 | static void inc_io_migrations(struct cache *cache) |
858 | { | ||
859 | mempool_free(mg, mg->cache->migration_pool); | ||
860 | } | ||
861 | |||
862 | static void inc_nr_migrations(struct cache *cache) | ||
863 | { | 884 | { |
864 | atomic_inc(&cache->nr_migrations); | 885 | atomic_inc(&cache->nr_io_migrations); |
865 | } | 886 | } |
866 | 887 | ||
867 | static void dec_nr_migrations(struct cache *cache) | 888 | static void dec_io_migrations(struct cache *cache) |
868 | { | 889 | { |
869 | atomic_dec(&cache->nr_migrations); | 890 | atomic_dec(&cache->nr_io_migrations); |
870 | |||
871 | /* | ||
872 | * Wake the worker in case we're suspending the target. | ||
873 | */ | ||
874 | wake_up(&cache->migration_wait); | ||
875 | } | 891 | } |
876 | 892 | ||
877 | static void __cell_defer(struct cache *cache, struct dm_bio_prison_cell *cell, | 893 | static void __cell_defer(struct cache *cache, struct dm_bio_prison_cell *cell, |
@@ -894,11 +910,10 @@ static void cell_defer(struct cache *cache, struct dm_bio_prison_cell *cell, | |||
894 | wake_worker(cache); | 910 | wake_worker(cache); |
895 | } | 911 | } |
896 | 912 | ||
897 | static void cleanup_migration(struct dm_cache_migration *mg) | 913 | static void free_io_migration(struct dm_cache_migration *mg) |
898 | { | 914 | { |
899 | struct cache *cache = mg->cache; | 915 | dec_io_migrations(mg->cache); |
900 | free_migration(mg); | 916 | free_migration(mg); |
901 | dec_nr_migrations(cache); | ||
902 | } | 917 | } |
903 | 918 | ||
904 | static void migration_failure(struct dm_cache_migration *mg) | 919 | static void migration_failure(struct dm_cache_migration *mg) |
@@ -923,7 +938,7 @@ static void migration_failure(struct dm_cache_migration *mg) | |||
923 | cell_defer(cache, mg->new_ocell, true); | 938 | cell_defer(cache, mg->new_ocell, true); |
924 | } | 939 | } |
925 | 940 | ||
926 | cleanup_migration(mg); | 941 | free_io_migration(mg); |
927 | } | 942 | } |
928 | 943 | ||
929 | static void migration_success_pre_commit(struct dm_cache_migration *mg) | 944 | static void migration_success_pre_commit(struct dm_cache_migration *mg) |
@@ -934,7 +949,7 @@ static void migration_success_pre_commit(struct dm_cache_migration *mg) | |||
934 | if (mg->writeback) { | 949 | if (mg->writeback) { |
935 | clear_dirty(cache, mg->old_oblock, mg->cblock); | 950 | clear_dirty(cache, mg->old_oblock, mg->cblock); |
936 | cell_defer(cache, mg->old_ocell, false); | 951 | cell_defer(cache, mg->old_ocell, false); |
937 | cleanup_migration(mg); | 952 | free_io_migration(mg); |
938 | return; | 953 | return; |
939 | 954 | ||
940 | } else if (mg->demote) { | 955 | } else if (mg->demote) { |
@@ -944,14 +959,14 @@ static void migration_success_pre_commit(struct dm_cache_migration *mg) | |||
944 | mg->old_oblock); | 959 | mg->old_oblock); |
945 | if (mg->promote) | 960 | if (mg->promote) |
946 | cell_defer(cache, mg->new_ocell, true); | 961 | cell_defer(cache, mg->new_ocell, true); |
947 | cleanup_migration(mg); | 962 | free_io_migration(mg); |
948 | return; | 963 | return; |
949 | } | 964 | } |
950 | } else { | 965 | } else { |
951 | if (dm_cache_insert_mapping(cache->cmd, mg->cblock, mg->new_oblock)) { | 966 | if (dm_cache_insert_mapping(cache->cmd, mg->cblock, mg->new_oblock)) { |
952 | DMWARN_LIMIT("promotion failed; couldn't update on disk metadata"); | 967 | DMWARN_LIMIT("promotion failed; couldn't update on disk metadata"); |
953 | policy_remove_mapping(cache->policy, mg->new_oblock); | 968 | policy_remove_mapping(cache->policy, mg->new_oblock); |
954 | cleanup_migration(mg); | 969 | free_io_migration(mg); |
955 | return; | 970 | return; |
956 | } | 971 | } |
957 | } | 972 | } |
@@ -984,7 +999,7 @@ static void migration_success_post_commit(struct dm_cache_migration *mg) | |||
984 | } else { | 999 | } else { |
985 | if (mg->invalidate) | 1000 | if (mg->invalidate) |
986 | policy_remove_mapping(cache->policy, mg->old_oblock); | 1001 | policy_remove_mapping(cache->policy, mg->old_oblock); |
987 | cleanup_migration(mg); | 1002 | free_io_migration(mg); |
988 | } | 1003 | } |
989 | 1004 | ||
990 | } else { | 1005 | } else { |
@@ -999,7 +1014,7 @@ static void migration_success_post_commit(struct dm_cache_migration *mg) | |||
999 | bio_endio(mg->new_ocell->holder, 0); | 1014 | bio_endio(mg->new_ocell->holder, 0); |
1000 | cell_defer(cache, mg->new_ocell, false); | 1015 | cell_defer(cache, mg->new_ocell, false); |
1001 | } | 1016 | } |
1002 | cleanup_migration(mg); | 1017 | free_io_migration(mg); |
1003 | } | 1018 | } |
1004 | } | 1019 | } |
1005 | 1020 | ||
@@ -1251,7 +1266,7 @@ static void promote(struct cache *cache, struct prealloc *structs, | |||
1251 | mg->new_ocell = cell; | 1266 | mg->new_ocell = cell; |
1252 | mg->start_jiffies = jiffies; | 1267 | mg->start_jiffies = jiffies; |
1253 | 1268 | ||
1254 | inc_nr_migrations(cache); | 1269 | inc_io_migrations(cache); |
1255 | quiesce_migration(mg); | 1270 | quiesce_migration(mg); |
1256 | } | 1271 | } |
1257 | 1272 | ||
@@ -1275,7 +1290,7 @@ static void writeback(struct cache *cache, struct prealloc *structs, | |||
1275 | mg->new_ocell = NULL; | 1290 | mg->new_ocell = NULL; |
1276 | mg->start_jiffies = jiffies; | 1291 | mg->start_jiffies = jiffies; |
1277 | 1292 | ||
1278 | inc_nr_migrations(cache); | 1293 | inc_io_migrations(cache); |
1279 | quiesce_migration(mg); | 1294 | quiesce_migration(mg); |
1280 | } | 1295 | } |
1281 | 1296 | ||
@@ -1302,7 +1317,7 @@ static void demote_then_promote(struct cache *cache, struct prealloc *structs, | |||
1302 | mg->new_ocell = new_ocell; | 1317 | mg->new_ocell = new_ocell; |
1303 | mg->start_jiffies = jiffies; | 1318 | mg->start_jiffies = jiffies; |
1304 | 1319 | ||
1305 | inc_nr_migrations(cache); | 1320 | inc_io_migrations(cache); |
1306 | quiesce_migration(mg); | 1321 | quiesce_migration(mg); |
1307 | } | 1322 | } |
1308 | 1323 | ||
@@ -1330,7 +1345,7 @@ static void invalidate(struct cache *cache, struct prealloc *structs, | |||
1330 | mg->new_ocell = NULL; | 1345 | mg->new_ocell = NULL; |
1331 | mg->start_jiffies = jiffies; | 1346 | mg->start_jiffies = jiffies; |
1332 | 1347 | ||
1333 | inc_nr_migrations(cache); | 1348 | inc_io_migrations(cache); |
1334 | quiesce_migration(mg); | 1349 | quiesce_migration(mg); |
1335 | } | 1350 | } |
1336 | 1351 | ||
@@ -1412,7 +1427,7 @@ static void process_discard_bio(struct cache *cache, struct prealloc *structs, | |||
1412 | 1427 | ||
1413 | static bool spare_migration_bandwidth(struct cache *cache) | 1428 | static bool spare_migration_bandwidth(struct cache *cache) |
1414 | { | 1429 | { |
1415 | sector_t current_volume = (atomic_read(&cache->nr_migrations) + 1) * | 1430 | sector_t current_volume = (atomic_read(&cache->nr_io_migrations) + 1) * |
1416 | cache->sectors_per_block; | 1431 | cache->sectors_per_block; |
1417 | return current_volume < cache->migration_threshold; | 1432 | return current_volume < cache->migration_threshold; |
1418 | } | 1433 | } |
@@ -1764,7 +1779,7 @@ static void stop_quiescing(struct cache *cache) | |||
1764 | 1779 | ||
1765 | static void wait_for_migrations(struct cache *cache) | 1780 | static void wait_for_migrations(struct cache *cache) |
1766 | { | 1781 | { |
1767 | wait_event(cache->migration_wait, !atomic_read(&cache->nr_migrations)); | 1782 | wait_event(cache->migration_wait, !atomic_read(&cache->nr_allocated_migrations)); |
1768 | } | 1783 | } |
1769 | 1784 | ||
1770 | static void stop_worker(struct cache *cache) | 1785 | static void stop_worker(struct cache *cache) |
@@ -1876,9 +1891,6 @@ static void destroy(struct cache *cache) | |||
1876 | { | 1891 | { |
1877 | unsigned i; | 1892 | unsigned i; |
1878 | 1893 | ||
1879 | if (cache->next_migration) | ||
1880 | mempool_free(cache->next_migration, cache->migration_pool); | ||
1881 | |||
1882 | if (cache->migration_pool) | 1894 | if (cache->migration_pool) |
1883 | mempool_destroy(cache->migration_pool); | 1895 | mempool_destroy(cache->migration_pool); |
1884 | 1896 | ||
@@ -2424,7 +2436,8 @@ static int cache_create(struct cache_args *ca, struct cache **result) | |||
2424 | INIT_LIST_HEAD(&cache->quiesced_migrations); | 2436 | INIT_LIST_HEAD(&cache->quiesced_migrations); |
2425 | INIT_LIST_HEAD(&cache->completed_migrations); | 2437 | INIT_LIST_HEAD(&cache->completed_migrations); |
2426 | INIT_LIST_HEAD(&cache->need_commit_migrations); | 2438 | INIT_LIST_HEAD(&cache->need_commit_migrations); |
2427 | atomic_set(&cache->nr_migrations, 0); | 2439 | atomic_set(&cache->nr_allocated_migrations, 0); |
2440 | atomic_set(&cache->nr_io_migrations, 0); | ||
2428 | init_waitqueue_head(&cache->migration_wait); | 2441 | init_waitqueue_head(&cache->migration_wait); |
2429 | 2442 | ||
2430 | init_waitqueue_head(&cache->quiescing_wait); | 2443 | init_waitqueue_head(&cache->quiescing_wait); |
@@ -2487,8 +2500,6 @@ static int cache_create(struct cache_args *ca, struct cache **result) | |||
2487 | goto bad; | 2500 | goto bad; |
2488 | } | 2501 | } |
2489 | 2502 | ||
2490 | cache->next_migration = NULL; | ||
2491 | |||
2492 | cache->need_tick_bio = true; | 2503 | cache->need_tick_bio = true; |
2493 | cache->sized = false; | 2504 | cache->sized = false; |
2494 | cache->invalidate = false; | 2505 | cache->invalidate = false; |
diff --git a/drivers/md/dm.c b/drivers/md/dm.c index b98cd9d84435..2caf5b374649 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c | |||
@@ -206,6 +206,9 @@ struct mapped_device { | |||
206 | /* zero-length flush that will be cloned and submitted to targets */ | 206 | /* zero-length flush that will be cloned and submitted to targets */ |
207 | struct bio flush_bio; | 207 | struct bio flush_bio; |
208 | 208 | ||
209 | /* the number of internal suspends */ | ||
210 | unsigned internal_suspend_count; | ||
211 | |||
209 | struct dm_stats stats; | 212 | struct dm_stats stats; |
210 | }; | 213 | }; |
211 | 214 | ||
@@ -2928,7 +2931,7 @@ static void __dm_internal_suspend(struct mapped_device *md, unsigned suspend_fla | |||
2928 | { | 2931 | { |
2929 | struct dm_table *map = NULL; | 2932 | struct dm_table *map = NULL; |
2930 | 2933 | ||
2931 | if (dm_suspended_internally_md(md)) | 2934 | if (md->internal_suspend_count++) |
2932 | return; /* nested internal suspend */ | 2935 | return; /* nested internal suspend */ |
2933 | 2936 | ||
2934 | if (dm_suspended_md(md)) { | 2937 | if (dm_suspended_md(md)) { |
@@ -2953,7 +2956,9 @@ static void __dm_internal_suspend(struct mapped_device *md, unsigned suspend_fla | |||
2953 | 2956 | ||
2954 | static void __dm_internal_resume(struct mapped_device *md) | 2957 | static void __dm_internal_resume(struct mapped_device *md) |
2955 | { | 2958 | { |
2956 | if (!dm_suspended_internally_md(md)) | 2959 | BUG_ON(!md->internal_suspend_count); |
2960 | |||
2961 | if (--md->internal_suspend_count) | ||
2957 | return; /* resume from nested internal suspend */ | 2962 | return; /* resume from nested internal suspend */ |
2958 | 2963 | ||
2959 | if (dm_suspended_md(md)) | 2964 | if (dm_suspended_md(md)) |
diff --git a/drivers/media/pci/cx23885/cx23885-cards.c b/drivers/media/pci/cx23885/cx23885-cards.c index db99ca2613ba..06931f6fa26c 100644 --- a/drivers/media/pci/cx23885/cx23885-cards.c +++ b/drivers/media/pci/cx23885/cx23885-cards.c | |||
@@ -614,7 +614,7 @@ struct cx23885_board cx23885_boards[] = { | |||
614 | .portb = CX23885_MPEG_DVB, | 614 | .portb = CX23885_MPEG_DVB, |
615 | }, | 615 | }, |
616 | [CX23885_BOARD_HAUPPAUGE_HVR4400] = { | 616 | [CX23885_BOARD_HAUPPAUGE_HVR4400] = { |
617 | .name = "Hauppauge WinTV-HVR4400", | 617 | .name = "Hauppauge WinTV-HVR4400/HVR5500", |
618 | .porta = CX23885_ANALOG_VIDEO, | 618 | .porta = CX23885_ANALOG_VIDEO, |
619 | .portb = CX23885_MPEG_DVB, | 619 | .portb = CX23885_MPEG_DVB, |
620 | .portc = CX23885_MPEG_DVB, | 620 | .portc = CX23885_MPEG_DVB, |
@@ -622,6 +622,10 @@ struct cx23885_board cx23885_boards[] = { | |||
622 | .tuner_addr = 0x60, /* 0xc0 >> 1 */ | 622 | .tuner_addr = 0x60, /* 0xc0 >> 1 */ |
623 | .tuner_bus = 1, | 623 | .tuner_bus = 1, |
624 | }, | 624 | }, |
625 | [CX23885_BOARD_HAUPPAUGE_STARBURST] = { | ||
626 | .name = "Hauppauge WinTV Starburst", | ||
627 | .portb = CX23885_MPEG_DVB, | ||
628 | }, | ||
625 | [CX23885_BOARD_AVERMEDIA_HC81R] = { | 629 | [CX23885_BOARD_AVERMEDIA_HC81R] = { |
626 | .name = "AVerTV Hybrid Express Slim HC81R", | 630 | .name = "AVerTV Hybrid Express Slim HC81R", |
627 | .tuner_type = TUNER_XC2028, | 631 | .tuner_type = TUNER_XC2028, |
@@ -936,19 +940,19 @@ struct cx23885_subid cx23885_subids[] = { | |||
936 | }, { | 940 | }, { |
937 | .subvendor = 0x0070, | 941 | .subvendor = 0x0070, |
938 | .subdevice = 0xc108, | 942 | .subdevice = 0xc108, |
939 | .card = CX23885_BOARD_HAUPPAUGE_HVR4400, | 943 | .card = CX23885_BOARD_HAUPPAUGE_HVR4400, /* Hauppauge WinTV HVR-4400 (Model 121xxx, Hybrid DVB-T/S2, IR) */ |
940 | }, { | 944 | }, { |
941 | .subvendor = 0x0070, | 945 | .subvendor = 0x0070, |
942 | .subdevice = 0xc138, | 946 | .subdevice = 0xc138, |
943 | .card = CX23885_BOARD_HAUPPAUGE_HVR4400, | 947 | .card = CX23885_BOARD_HAUPPAUGE_HVR4400, /* Hauppauge WinTV HVR-5500 (Model 121xxx, Hybrid DVB-T/C/S2, IR) */ |
944 | }, { | 948 | }, { |
945 | .subvendor = 0x0070, | 949 | .subvendor = 0x0070, |
946 | .subdevice = 0xc12a, | 950 | .subdevice = 0xc12a, |
947 | .card = CX23885_BOARD_HAUPPAUGE_HVR4400, | 951 | .card = CX23885_BOARD_HAUPPAUGE_STARBURST, /* Hauppauge WinTV Starburst (Model 121x00, DVB-S2, IR) */ |
948 | }, { | 952 | }, { |
949 | .subvendor = 0x0070, | 953 | .subvendor = 0x0070, |
950 | .subdevice = 0xc1f8, | 954 | .subdevice = 0xc1f8, |
951 | .card = CX23885_BOARD_HAUPPAUGE_HVR4400, | 955 | .card = CX23885_BOARD_HAUPPAUGE_HVR4400, /* Hauppauge WinTV HVR-5500 (Model 121xxx, Hybrid DVB-T/C/S2, IR) */ |
952 | }, { | 956 | }, { |
953 | .subvendor = 0x1461, | 957 | .subvendor = 0x1461, |
954 | .subdevice = 0xd939, | 958 | .subdevice = 0xd939, |
@@ -1545,8 +1549,9 @@ void cx23885_gpio_setup(struct cx23885_dev *dev) | |||
1545 | cx_write(GPIO_ISM, 0x00000000);/* INTERRUPTS active low*/ | 1549 | cx_write(GPIO_ISM, 0x00000000);/* INTERRUPTS active low*/ |
1546 | break; | 1550 | break; |
1547 | case CX23885_BOARD_HAUPPAUGE_HVR4400: | 1551 | case CX23885_BOARD_HAUPPAUGE_HVR4400: |
1552 | case CX23885_BOARD_HAUPPAUGE_STARBURST: | ||
1548 | /* GPIO-8 tda10071 demod reset */ | 1553 | /* GPIO-8 tda10071 demod reset */ |
1549 | /* GPIO-9 si2165 demod reset */ | 1554 | /* GPIO-9 si2165 demod reset (only HVR4400/HVR5500)*/ |
1550 | 1555 | ||
1551 | /* Put the parts into reset and back */ | 1556 | /* Put the parts into reset and back */ |
1552 | cx23885_gpio_enable(dev, GPIO_8 | GPIO_9, 1); | 1557 | cx23885_gpio_enable(dev, GPIO_8 | GPIO_9, 1); |
@@ -1872,6 +1877,7 @@ void cx23885_card_setup(struct cx23885_dev *dev) | |||
1872 | case CX23885_BOARD_HAUPPAUGE_HVR1850: | 1877 | case CX23885_BOARD_HAUPPAUGE_HVR1850: |
1873 | case CX23885_BOARD_HAUPPAUGE_HVR1290: | 1878 | case CX23885_BOARD_HAUPPAUGE_HVR1290: |
1874 | case CX23885_BOARD_HAUPPAUGE_HVR4400: | 1879 | case CX23885_BOARD_HAUPPAUGE_HVR4400: |
1880 | case CX23885_BOARD_HAUPPAUGE_STARBURST: | ||
1875 | case CX23885_BOARD_HAUPPAUGE_IMPACTVCBE: | 1881 | case CX23885_BOARD_HAUPPAUGE_IMPACTVCBE: |
1876 | if (dev->i2c_bus[0].i2c_rc == 0) | 1882 | if (dev->i2c_bus[0].i2c_rc == 0) |
1877 | hauppauge_eeprom(dev, eeprom+0xc0); | 1883 | hauppauge_eeprom(dev, eeprom+0xc0); |
@@ -1980,6 +1986,11 @@ void cx23885_card_setup(struct cx23885_dev *dev) | |||
1980 | ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */ | 1986 | ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */ |
1981 | ts2->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO; | 1987 | ts2->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO; |
1982 | break; | 1988 | break; |
1989 | case CX23885_BOARD_HAUPPAUGE_STARBURST: | ||
1990 | ts1->gen_ctrl_val = 0xc; /* Serial bus + punctured clock */ | ||
1991 | ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */ | ||
1992 | ts1->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO; | ||
1993 | break; | ||
1983 | case CX23885_BOARD_DVBSKY_T9580: | 1994 | case CX23885_BOARD_DVBSKY_T9580: |
1984 | case CX23885_BOARD_DVBSKY_T982: | 1995 | case CX23885_BOARD_DVBSKY_T982: |
1985 | ts1->gen_ctrl_val = 0x5; /* Parallel */ | 1996 | ts1->gen_ctrl_val = 0x5; /* Parallel */ |
diff --git a/drivers/media/pci/cx23885/cx23885-core.c b/drivers/media/pci/cx23885/cx23885-core.c index 1d9d0f86ca8c..1ad49946d7fa 100644 --- a/drivers/media/pci/cx23885/cx23885-core.c +++ b/drivers/media/pci/cx23885/cx23885-core.c | |||
@@ -2049,11 +2049,11 @@ static void cx23885_finidev(struct pci_dev *pci_dev) | |||
2049 | 2049 | ||
2050 | cx23885_shutdown(dev); | 2050 | cx23885_shutdown(dev); |
2051 | 2051 | ||
2052 | pci_disable_device(pci_dev); | ||
2053 | |||
2054 | /* unregister stuff */ | 2052 | /* unregister stuff */ |
2055 | free_irq(pci_dev->irq, dev); | 2053 | free_irq(pci_dev->irq, dev); |
2056 | 2054 | ||
2055 | pci_disable_device(pci_dev); | ||
2056 | |||
2057 | cx23885_dev_unregister(dev); | 2057 | cx23885_dev_unregister(dev); |
2058 | vb2_dma_sg_cleanup_ctx(dev->alloc_ctx); | 2058 | vb2_dma_sg_cleanup_ctx(dev->alloc_ctx); |
2059 | v4l2_ctrl_handler_free(&dev->ctrl_handler); | 2059 | v4l2_ctrl_handler_free(&dev->ctrl_handler); |
diff --git a/drivers/media/pci/cx23885/cx23885-dvb.c b/drivers/media/pci/cx23885/cx23885-dvb.c index c47d18270cfc..a9c450d4b54e 100644 --- a/drivers/media/pci/cx23885/cx23885-dvb.c +++ b/drivers/media/pci/cx23885/cx23885-dvb.c | |||
@@ -1710,6 +1710,17 @@ static int dvb_register(struct cx23885_tsport *port) | |||
1710 | break; | 1710 | break; |
1711 | } | 1711 | } |
1712 | break; | 1712 | break; |
1713 | case CX23885_BOARD_HAUPPAUGE_STARBURST: | ||
1714 | i2c_bus = &dev->i2c_bus[0]; | ||
1715 | fe0->dvb.frontend = dvb_attach(tda10071_attach, | ||
1716 | &hauppauge_tda10071_config, | ||
1717 | &i2c_bus->i2c_adap); | ||
1718 | if (fe0->dvb.frontend != NULL) { | ||
1719 | dvb_attach(a8293_attach, fe0->dvb.frontend, | ||
1720 | &i2c_bus->i2c_adap, | ||
1721 | &hauppauge_a8293_config); | ||
1722 | } | ||
1723 | break; | ||
1713 | case CX23885_BOARD_DVBSKY_T9580: | 1724 | case CX23885_BOARD_DVBSKY_T9580: |
1714 | case CX23885_BOARD_DVBSKY_S950: | 1725 | case CX23885_BOARD_DVBSKY_S950: |
1715 | i2c_bus = &dev->i2c_bus[0]; | 1726 | i2c_bus = &dev->i2c_bus[0]; |
diff --git a/drivers/media/pci/cx23885/cx23885.h b/drivers/media/pci/cx23885/cx23885.h index f55cd12da0fd..36f2f96c40e4 100644 --- a/drivers/media/pci/cx23885/cx23885.h +++ b/drivers/media/pci/cx23885/cx23885.h | |||
@@ -99,6 +99,7 @@ | |||
99 | #define CX23885_BOARD_DVBSKY_S950 49 | 99 | #define CX23885_BOARD_DVBSKY_S950 49 |
100 | #define CX23885_BOARD_DVBSKY_S952 50 | 100 | #define CX23885_BOARD_DVBSKY_S952 50 |
101 | #define CX23885_BOARD_DVBSKY_T982 51 | 101 | #define CX23885_BOARD_DVBSKY_T982 51 |
102 | #define CX23885_BOARD_HAUPPAUGE_STARBURST 52 | ||
102 | 103 | ||
103 | #define GPIO_0 0x00000001 | 104 | #define GPIO_0 0x00000001 |
104 | #define GPIO_1 0x00000002 | 105 | #define GPIO_1 0x00000002 |
diff --git a/drivers/media/platform/omap3isp/ispvideo.c b/drivers/media/platform/omap3isp/ispvideo.c index b463fe172d16..3fe9047ef466 100644 --- a/drivers/media/platform/omap3isp/ispvideo.c +++ b/drivers/media/platform/omap3isp/ispvideo.c | |||
@@ -602,10 +602,13 @@ isp_video_querycap(struct file *file, void *fh, struct v4l2_capability *cap) | |||
602 | strlcpy(cap->card, video->video.name, sizeof(cap->card)); | 602 | strlcpy(cap->card, video->video.name, sizeof(cap->card)); |
603 | strlcpy(cap->bus_info, "media", sizeof(cap->bus_info)); | 603 | strlcpy(cap->bus_info, "media", sizeof(cap->bus_info)); |
604 | 604 | ||
605 | cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_VIDEO_OUTPUT | ||
606 | | V4L2_CAP_STREAMING | V4L2_CAP_DEVICE_CAPS; | ||
607 | |||
605 | if (video->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) | 608 | if (video->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) |
606 | cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; | 609 | cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; |
607 | else | 610 | else |
608 | cap->capabilities = V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_STREAMING; | 611 | cap->device_caps = V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_STREAMING; |
609 | 612 | ||
610 | return 0; | 613 | return 0; |
611 | } | 614 | } |
diff --git a/drivers/media/platform/soc_camera/atmel-isi.c b/drivers/media/platform/soc_camera/atmel-isi.c index 8efe40337608..6d885239b16a 100644 --- a/drivers/media/platform/soc_camera/atmel-isi.c +++ b/drivers/media/platform/soc_camera/atmel-isi.c | |||
@@ -760,8 +760,9 @@ static int isi_camera_querycap(struct soc_camera_host *ici, | |||
760 | { | 760 | { |
761 | strcpy(cap->driver, "atmel-isi"); | 761 | strcpy(cap->driver, "atmel-isi"); |
762 | strcpy(cap->card, "Atmel Image Sensor Interface"); | 762 | strcpy(cap->card, "Atmel Image Sensor Interface"); |
763 | cap->capabilities = (V4L2_CAP_VIDEO_CAPTURE | | 763 | cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; |
764 | V4L2_CAP_STREAMING); | 764 | cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS; |
765 | |||
765 | return 0; | 766 | return 0; |
766 | } | 767 | } |
767 | 768 | ||
diff --git a/drivers/media/platform/soc_camera/mx2_camera.c b/drivers/media/platform/soc_camera/mx2_camera.c index ce72bd26a6ac..192377f55840 100644 --- a/drivers/media/platform/soc_camera/mx2_camera.c +++ b/drivers/media/platform/soc_camera/mx2_camera.c | |||
@@ -1256,7 +1256,8 @@ static int mx2_camera_querycap(struct soc_camera_host *ici, | |||
1256 | { | 1256 | { |
1257 | /* cap->name is set by the friendly caller:-> */ | 1257 | /* cap->name is set by the friendly caller:-> */ |
1258 | strlcpy(cap->card, MX2_CAM_DRIVER_DESCRIPTION, sizeof(cap->card)); | 1258 | strlcpy(cap->card, MX2_CAM_DRIVER_DESCRIPTION, sizeof(cap->card)); |
1259 | cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; | 1259 | cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; |
1260 | cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS; | ||
1260 | 1261 | ||
1261 | return 0; | 1262 | return 0; |
1262 | } | 1263 | } |
diff --git a/drivers/media/platform/soc_camera/mx3_camera.c b/drivers/media/platform/soc_camera/mx3_camera.c index a60c3bb0e4cc..0b3299dee05d 100644 --- a/drivers/media/platform/soc_camera/mx3_camera.c +++ b/drivers/media/platform/soc_camera/mx3_camera.c | |||
@@ -967,7 +967,8 @@ static int mx3_camera_querycap(struct soc_camera_host *ici, | |||
967 | { | 967 | { |
968 | /* cap->name is set by the firendly caller:-> */ | 968 | /* cap->name is set by the firendly caller:-> */ |
969 | strlcpy(cap->card, "i.MX3x Camera", sizeof(cap->card)); | 969 | strlcpy(cap->card, "i.MX3x Camera", sizeof(cap->card)); |
970 | cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; | 970 | cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; |
971 | cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS; | ||
971 | 972 | ||
972 | return 0; | 973 | return 0; |
973 | } | 974 | } |
diff --git a/drivers/media/platform/soc_camera/omap1_camera.c b/drivers/media/platform/soc_camera/omap1_camera.c index e6b93281f246..16f65ecb70a3 100644 --- a/drivers/media/platform/soc_camera/omap1_camera.c +++ b/drivers/media/platform/soc_camera/omap1_camera.c | |||
@@ -1427,7 +1427,8 @@ static int omap1_cam_querycap(struct soc_camera_host *ici, | |||
1427 | { | 1427 | { |
1428 | /* cap->name is set by the friendly caller:-> */ | 1428 | /* cap->name is set by the friendly caller:-> */ |
1429 | strlcpy(cap->card, "OMAP1 Camera", sizeof(cap->card)); | 1429 | strlcpy(cap->card, "OMAP1 Camera", sizeof(cap->card)); |
1430 | cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; | 1430 | cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; |
1431 | cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS; | ||
1431 | 1432 | ||
1432 | return 0; | 1433 | return 0; |
1433 | } | 1434 | } |
diff --git a/drivers/media/platform/soc_camera/pxa_camera.c b/drivers/media/platform/soc_camera/pxa_camera.c index 951226af0eba..8d6e343fec0f 100644 --- a/drivers/media/platform/soc_camera/pxa_camera.c +++ b/drivers/media/platform/soc_camera/pxa_camera.c | |||
@@ -1576,7 +1576,8 @@ static int pxa_camera_querycap(struct soc_camera_host *ici, | |||
1576 | { | 1576 | { |
1577 | /* cap->name is set by the firendly caller:-> */ | 1577 | /* cap->name is set by the firendly caller:-> */ |
1578 | strlcpy(cap->card, pxa_cam_driver_description, sizeof(cap->card)); | 1578 | strlcpy(cap->card, pxa_cam_driver_description, sizeof(cap->card)); |
1579 | cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; | 1579 | cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; |
1580 | cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS; | ||
1580 | 1581 | ||
1581 | return 0; | 1582 | return 0; |
1582 | } | 1583 | } |
diff --git a/drivers/media/platform/soc_camera/rcar_vin.c b/drivers/media/platform/soc_camera/rcar_vin.c index 0c1f55648106..9f1473c0a0cf 100644 --- a/drivers/media/platform/soc_camera/rcar_vin.c +++ b/drivers/media/platform/soc_camera/rcar_vin.c | |||
@@ -1799,7 +1799,9 @@ static int rcar_vin_querycap(struct soc_camera_host *ici, | |||
1799 | struct v4l2_capability *cap) | 1799 | struct v4l2_capability *cap) |
1800 | { | 1800 | { |
1801 | strlcpy(cap->card, "R_Car_VIN", sizeof(cap->card)); | 1801 | strlcpy(cap->card, "R_Car_VIN", sizeof(cap->card)); |
1802 | cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; | 1802 | cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; |
1803 | cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS; | ||
1804 | |||
1803 | return 0; | 1805 | return 0; |
1804 | } | 1806 | } |
1805 | 1807 | ||
diff --git a/drivers/media/platform/soc_camera/sh_mobile_ceu_camera.c b/drivers/media/platform/soc_camera/sh_mobile_ceu_camera.c index 8b27b3eb2b25..71787702d4a2 100644 --- a/drivers/media/platform/soc_camera/sh_mobile_ceu_camera.c +++ b/drivers/media/platform/soc_camera/sh_mobile_ceu_camera.c | |||
@@ -1652,7 +1652,9 @@ static int sh_mobile_ceu_querycap(struct soc_camera_host *ici, | |||
1652 | struct v4l2_capability *cap) | 1652 | struct v4l2_capability *cap) |
1653 | { | 1653 | { |
1654 | strlcpy(cap->card, "SuperH_Mobile_CEU", sizeof(cap->card)); | 1654 | strlcpy(cap->card, "SuperH_Mobile_CEU", sizeof(cap->card)); |
1655 | cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; | 1655 | cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; |
1656 | cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS; | ||
1657 | |||
1656 | return 0; | 1658 | return 0; |
1657 | } | 1659 | } |
1658 | 1660 | ||
diff --git a/drivers/media/usb/dvb-usb/cxusb.c b/drivers/media/usb/dvb-usb/cxusb.c index 0f345b1f9014..f327c49d7e09 100644 --- a/drivers/media/usb/dvb-usb/cxusb.c +++ b/drivers/media/usb/dvb-usb/cxusb.c | |||
@@ -2232,7 +2232,7 @@ static struct dvb_usb_device_properties cxusb_mygica_t230_properties = { | |||
2232 | { | 2232 | { |
2233 | "Mygica T230 DVB-T/T2/C", | 2233 | "Mygica T230 DVB-T/T2/C", |
2234 | { NULL }, | 2234 | { NULL }, |
2235 | { &cxusb_table[22], NULL }, | 2235 | { &cxusb_table[20], NULL }, |
2236 | }, | 2236 | }, |
2237 | } | 2237 | } |
2238 | }; | 2238 | }; |
diff --git a/drivers/media/usb/pvrusb2/pvrusb2-v4l2.c b/drivers/media/usb/pvrusb2/pvrusb2-v4l2.c index 1b158f1167ed..536210b39428 100644 --- a/drivers/media/usb/pvrusb2/pvrusb2-v4l2.c +++ b/drivers/media/usb/pvrusb2/pvrusb2-v4l2.c | |||
@@ -89,16 +89,6 @@ static int vbi_nr[PVR_NUM] = {[0 ... PVR_NUM-1] = -1}; | |||
89 | module_param_array(vbi_nr, int, NULL, 0444); | 89 | module_param_array(vbi_nr, int, NULL, 0444); |
90 | MODULE_PARM_DESC(vbi_nr, "Offset for device's vbi dev minor"); | 90 | MODULE_PARM_DESC(vbi_nr, "Offset for device's vbi dev minor"); |
91 | 91 | ||
92 | static struct v4l2_capability pvr_capability ={ | ||
93 | .driver = "pvrusb2", | ||
94 | .card = "Hauppauge WinTV pvr-usb2", | ||
95 | .bus_info = "usb", | ||
96 | .version = LINUX_VERSION_CODE, | ||
97 | .capabilities = (V4L2_CAP_VIDEO_CAPTURE | | ||
98 | V4L2_CAP_TUNER | V4L2_CAP_AUDIO | V4L2_CAP_RADIO | | ||
99 | V4L2_CAP_READWRITE), | ||
100 | }; | ||
101 | |||
102 | static struct v4l2_fmtdesc pvr_fmtdesc [] = { | 92 | static struct v4l2_fmtdesc pvr_fmtdesc [] = { |
103 | { | 93 | { |
104 | .index = 0, | 94 | .index = 0, |
@@ -160,10 +150,22 @@ static int pvr2_querycap(struct file *file, void *priv, struct v4l2_capability * | |||
160 | struct pvr2_v4l2_fh *fh = file->private_data; | 150 | struct pvr2_v4l2_fh *fh = file->private_data; |
161 | struct pvr2_hdw *hdw = fh->channel.mc_head->hdw; | 151 | struct pvr2_hdw *hdw = fh->channel.mc_head->hdw; |
162 | 152 | ||
163 | memcpy(cap, &pvr_capability, sizeof(struct v4l2_capability)); | 153 | strlcpy(cap->driver, "pvrusb2", sizeof(cap->driver)); |
164 | strlcpy(cap->bus_info, pvr2_hdw_get_bus_info(hdw), | 154 | strlcpy(cap->bus_info, pvr2_hdw_get_bus_info(hdw), |
165 | sizeof(cap->bus_info)); | 155 | sizeof(cap->bus_info)); |
166 | strlcpy(cap->card, pvr2_hdw_get_desc(hdw), sizeof(cap->card)); | 156 | strlcpy(cap->card, pvr2_hdw_get_desc(hdw), sizeof(cap->card)); |
157 | cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_TUNER | | ||
158 | V4L2_CAP_AUDIO | V4L2_CAP_RADIO | | ||
159 | V4L2_CAP_READWRITE | V4L2_CAP_DEVICE_CAPS; | ||
160 | switch (fh->pdi->devbase.vfl_type) { | ||
161 | case VFL_TYPE_GRABBER: | ||
162 | cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_AUDIO; | ||
163 | break; | ||
164 | case VFL_TYPE_RADIO: | ||
165 | cap->device_caps = V4L2_CAP_RADIO; | ||
166 | break; | ||
167 | } | ||
168 | cap->device_caps |= V4L2_CAP_TUNER | V4L2_CAP_READWRITE; | ||
167 | return 0; | 169 | return 0; |
168 | } | 170 | } |
169 | 171 | ||
diff --git a/drivers/media/v4l2-core/videobuf2-core.c b/drivers/media/v4l2-core/videobuf2-core.c index d09a8916e940..bc08a829bc13 100644 --- a/drivers/media/v4l2-core/videobuf2-core.c +++ b/drivers/media/v4l2-core/videobuf2-core.c | |||
@@ -3146,27 +3146,26 @@ static int vb2_thread(void *data) | |||
3146 | prequeue--; | 3146 | prequeue--; |
3147 | } else { | 3147 | } else { |
3148 | call_void_qop(q, wait_finish, q); | 3148 | call_void_qop(q, wait_finish, q); |
3149 | ret = vb2_internal_dqbuf(q, &fileio->b, 0); | 3149 | if (!threadio->stop) |
3150 | ret = vb2_internal_dqbuf(q, &fileio->b, 0); | ||
3150 | call_void_qop(q, wait_prepare, q); | 3151 | call_void_qop(q, wait_prepare, q); |
3151 | dprintk(5, "file io: vb2_dqbuf result: %d\n", ret); | 3152 | dprintk(5, "file io: vb2_dqbuf result: %d\n", ret); |
3152 | } | 3153 | } |
3153 | if (threadio->stop) | 3154 | if (ret || threadio->stop) |
3154 | break; | ||
3155 | if (ret) | ||
3156 | break; | 3155 | break; |
3157 | try_to_freeze(); | 3156 | try_to_freeze(); |
3158 | 3157 | ||
3159 | vb = q->bufs[fileio->b.index]; | 3158 | vb = q->bufs[fileio->b.index]; |
3160 | if (!(fileio->b.flags & V4L2_BUF_FLAG_ERROR)) | 3159 | if (!(fileio->b.flags & V4L2_BUF_FLAG_ERROR)) |
3161 | ret = threadio->fnc(vb, threadio->priv); | 3160 | if (threadio->fnc(vb, threadio->priv)) |
3162 | if (ret) | 3161 | break; |
3163 | break; | ||
3164 | call_void_qop(q, wait_finish, q); | 3162 | call_void_qop(q, wait_finish, q); |
3165 | if (set_timestamp) | 3163 | if (set_timestamp) |
3166 | v4l2_get_timestamp(&fileio->b.timestamp); | 3164 | v4l2_get_timestamp(&fileio->b.timestamp); |
3167 | ret = vb2_internal_qbuf(q, &fileio->b); | 3165 | if (!threadio->stop) |
3166 | ret = vb2_internal_qbuf(q, &fileio->b); | ||
3168 | call_void_qop(q, wait_prepare, q); | 3167 | call_void_qop(q, wait_prepare, q); |
3169 | if (ret) | 3168 | if (ret || threadio->stop) |
3170 | break; | 3169 | break; |
3171 | } | 3170 | } |
3172 | 3171 | ||
@@ -3235,11 +3234,11 @@ int vb2_thread_stop(struct vb2_queue *q) | |||
3235 | threadio->stop = true; | 3234 | threadio->stop = true; |
3236 | vb2_internal_streamoff(q, q->type); | 3235 | vb2_internal_streamoff(q, q->type); |
3237 | call_void_qop(q, wait_prepare, q); | 3236 | call_void_qop(q, wait_prepare, q); |
3237 | err = kthread_stop(threadio->thread); | ||
3238 | q->fileio = NULL; | 3238 | q->fileio = NULL; |
3239 | fileio->req.count = 0; | 3239 | fileio->req.count = 0; |
3240 | vb2_reqbufs(q, &fileio->req); | 3240 | vb2_reqbufs(q, &fileio->req); |
3241 | kfree(fileio); | 3241 | kfree(fileio); |
3242 | err = kthread_stop(threadio->thread); | ||
3243 | threadio->thread = NULL; | 3242 | threadio->thread = NULL; |
3244 | kfree(threadio); | 3243 | kfree(threadio); |
3245 | q->fileio = NULL; | 3244 | q->fileio = NULL; |
diff --git a/drivers/of/overlay.c b/drivers/of/overlay.c index ea63fbd228ed..352b4f28f82c 100644 --- a/drivers/of/overlay.c +++ b/drivers/of/overlay.c | |||
@@ -114,17 +114,6 @@ static int of_overlay_apply_single_device_node(struct of_overlay *ov, | |||
114 | ret = of_overlay_apply_one(ov, tchild, child); | 114 | ret = of_overlay_apply_one(ov, tchild, child); |
115 | if (ret) | 115 | if (ret) |
116 | return ret; | 116 | return ret; |
117 | |||
118 | /* The properties are already copied, now do the child nodes */ | ||
119 | for_each_child_of_node(child, grandchild) { | ||
120 | ret = of_overlay_apply_single_device_node(ov, tchild, grandchild); | ||
121 | if (ret) { | ||
122 | pr_err("%s: Failed to apply single node @%s/%s\n", | ||
123 | __func__, tchild->full_name, | ||
124 | grandchild->name); | ||
125 | return ret; | ||
126 | } | ||
127 | } | ||
128 | } | 117 | } |
129 | 118 | ||
130 | return ret; | 119 | return ret; |
diff --git a/drivers/of/platform.c b/drivers/of/platform.c index 5b33c6a21807..b0d50d70a8a1 100644 --- a/drivers/of/platform.c +++ b/drivers/of/platform.c | |||
@@ -188,7 +188,7 @@ static void of_dma_configure(struct device *dev) | |||
188 | size = dev->coherent_dma_mask; | 188 | size = dev->coherent_dma_mask; |
189 | } else { | 189 | } else { |
190 | offset = PFN_DOWN(paddr - dma_addr); | 190 | offset = PFN_DOWN(paddr - dma_addr); |
191 | dev_dbg(dev, "dma_pfn_offset(%#08lx)\n", dev->dma_pfn_offset); | 191 | dev_dbg(dev, "dma_pfn_offset(%#08lx)\n", offset); |
192 | } | 192 | } |
193 | dev->dma_pfn_offset = offset; | 193 | dev->dma_pfn_offset = offset; |
194 | 194 | ||
@@ -566,6 +566,10 @@ static int of_platform_notify(struct notifier_block *nb, | |||
566 | if (!of_node_check_flag(rd->dn->parent, OF_POPULATED_BUS)) | 566 | if (!of_node_check_flag(rd->dn->parent, OF_POPULATED_BUS)) |
567 | return NOTIFY_OK; /* not for us */ | 567 | return NOTIFY_OK; /* not for us */ |
568 | 568 | ||
569 | /* already populated? (driver using of_populate manually) */ | ||
570 | if (of_node_check_flag(rd->dn, OF_POPULATED)) | ||
571 | return NOTIFY_OK; | ||
572 | |||
569 | /* pdev_parent may be NULL when no bus platform device */ | 573 | /* pdev_parent may be NULL when no bus platform device */ |
570 | pdev_parent = of_find_device_by_node(rd->dn->parent); | 574 | pdev_parent = of_find_device_by_node(rd->dn->parent); |
571 | pdev = of_platform_device_create(rd->dn, NULL, | 575 | pdev = of_platform_device_create(rd->dn, NULL, |
@@ -581,6 +585,11 @@ static int of_platform_notify(struct notifier_block *nb, | |||
581 | break; | 585 | break; |
582 | 586 | ||
583 | case OF_RECONFIG_CHANGE_REMOVE: | 587 | case OF_RECONFIG_CHANGE_REMOVE: |
588 | |||
589 | /* already depopulated? */ | ||
590 | if (!of_node_check_flag(rd->dn, OF_POPULATED)) | ||
591 | return NOTIFY_OK; | ||
592 | |||
584 | /* find our device by node */ | 593 | /* find our device by node */ |
585 | pdev = of_find_device_by_node(rd->dn); | 594 | pdev = of_find_device_by_node(rd->dn); |
586 | if (pdev == NULL) | 595 | if (pdev == NULL) |
diff --git a/drivers/of/unittest-data/tests-overlay.dtsi b/drivers/of/unittest-data/tests-overlay.dtsi index 75976da22b2e..a2b687d5f324 100644 --- a/drivers/of/unittest-data/tests-overlay.dtsi +++ b/drivers/of/unittest-data/tests-overlay.dtsi | |||
@@ -176,5 +176,60 @@ | |||
176 | }; | 176 | }; |
177 | }; | 177 | }; |
178 | 178 | ||
179 | overlay10 { | ||
180 | fragment@0 { | ||
181 | target-path = "/testcase-data/overlay-node/test-bus"; | ||
182 | __overlay__ { | ||
183 | |||
184 | /* suppress DTC warning */ | ||
185 | #address-cells = <1>; | ||
186 | #size-cells = <0>; | ||
187 | |||
188 | test-selftest10 { | ||
189 | compatible = "selftest"; | ||
190 | status = "okay"; | ||
191 | reg = <10>; | ||
192 | |||
193 | #address-cells = <1>; | ||
194 | #size-cells = <0>; | ||
195 | |||
196 | test-selftest101 { | ||
197 | compatible = "selftest"; | ||
198 | status = "okay"; | ||
199 | reg = <1>; | ||
200 | }; | ||
201 | |||
202 | }; | ||
203 | }; | ||
204 | }; | ||
205 | }; | ||
206 | |||
207 | overlay11 { | ||
208 | fragment@0 { | ||
209 | target-path = "/testcase-data/overlay-node/test-bus"; | ||
210 | __overlay__ { | ||
211 | |||
212 | /* suppress DTC warning */ | ||
213 | #address-cells = <1>; | ||
214 | #size-cells = <0>; | ||
215 | |||
216 | test-selftest11 { | ||
217 | compatible = "selftest"; | ||
218 | status = "okay"; | ||
219 | reg = <11>; | ||
220 | |||
221 | #address-cells = <1>; | ||
222 | #size-cells = <0>; | ||
223 | |||
224 | test-selftest111 { | ||
225 | compatible = "selftest"; | ||
226 | status = "okay"; | ||
227 | reg = <1>; | ||
228 | }; | ||
229 | |||
230 | }; | ||
231 | }; | ||
232 | }; | ||
233 | }; | ||
179 | }; | 234 | }; |
180 | }; | 235 | }; |
diff --git a/drivers/of/unittest.c b/drivers/of/unittest.c index 844838e11ef1..41a4a138f53b 100644 --- a/drivers/of/unittest.c +++ b/drivers/of/unittest.c | |||
@@ -978,6 +978,9 @@ static int selftest_probe(struct platform_device *pdev) | |||
978 | } | 978 | } |
979 | 979 | ||
980 | dev_dbg(dev, "%s for node @%s\n", __func__, np->full_name); | 980 | dev_dbg(dev, "%s for node @%s\n", __func__, np->full_name); |
981 | |||
982 | of_platform_populate(np, NULL, NULL, &pdev->dev); | ||
983 | |||
981 | return 0; | 984 | return 0; |
982 | } | 985 | } |
983 | 986 | ||
@@ -1385,6 +1388,39 @@ static void of_selftest_overlay_8(void) | |||
1385 | selftest(1, "overlay test %d passed\n", 8); | 1388 | selftest(1, "overlay test %d passed\n", 8); |
1386 | } | 1389 | } |
1387 | 1390 | ||
1391 | /* test insertion of a bus with parent devices */ | ||
1392 | static void of_selftest_overlay_10(void) | ||
1393 | { | ||
1394 | int ret; | ||
1395 | char *child_path; | ||
1396 | |||
1397 | /* device should disable */ | ||
1398 | ret = of_selftest_apply_overlay_check(10, 10, 0, 1); | ||
1399 | if (selftest(ret == 0, "overlay test %d failed; overlay application\n", 10)) | ||
1400 | return; | ||
1401 | |||
1402 | child_path = kasprintf(GFP_KERNEL, "%s/test-selftest101", | ||
1403 | selftest_path(10)); | ||
1404 | if (selftest(child_path, "overlay test %d failed; kasprintf\n", 10)) | ||
1405 | return; | ||
1406 | |||
1407 | ret = of_path_platform_device_exists(child_path); | ||
1408 | kfree(child_path); | ||
1409 | if (selftest(ret, "overlay test %d failed; no child device\n", 10)) | ||
1410 | return; | ||
1411 | } | ||
1412 | |||
1413 | /* test insertion of a bus with parent devices (and revert) */ | ||
1414 | static void of_selftest_overlay_11(void) | ||
1415 | { | ||
1416 | int ret; | ||
1417 | |||
1418 | /* device should disable */ | ||
1419 | ret = of_selftest_apply_revert_overlay_check(11, 11, 0, 1); | ||
1420 | if (selftest(ret == 0, "overlay test %d failed; overlay application\n", 11)) | ||
1421 | return; | ||
1422 | } | ||
1423 | |||
1388 | static void __init of_selftest_overlay(void) | 1424 | static void __init of_selftest_overlay(void) |
1389 | { | 1425 | { |
1390 | struct device_node *bus_np = NULL; | 1426 | struct device_node *bus_np = NULL; |
@@ -1433,6 +1469,9 @@ static void __init of_selftest_overlay(void) | |||
1433 | of_selftest_overlay_6(); | 1469 | of_selftest_overlay_6(); |
1434 | of_selftest_overlay_8(); | 1470 | of_selftest_overlay_8(); |
1435 | 1471 | ||
1472 | of_selftest_overlay_10(); | ||
1473 | of_selftest_overlay_11(); | ||
1474 | |||
1436 | out: | 1475 | out: |
1437 | of_node_put(bus_np); | 1476 | of_node_put(bus_np); |
1438 | } | 1477 | } |
diff --git a/drivers/parisc/lba_pci.c b/drivers/parisc/lba_pci.c index 37e71ff6408d..dceb9ddfd99a 100644 --- a/drivers/parisc/lba_pci.c +++ b/drivers/parisc/lba_pci.c | |||
@@ -694,9 +694,8 @@ lba_fixup_bus(struct pci_bus *bus) | |||
694 | int i; | 694 | int i; |
695 | /* PCI-PCI Bridge */ | 695 | /* PCI-PCI Bridge */ |
696 | pci_read_bridge_bases(bus); | 696 | pci_read_bridge_bases(bus); |
697 | for (i = PCI_BRIDGE_RESOURCES; i < PCI_NUM_RESOURCES; i++) { | 697 | for (i = PCI_BRIDGE_RESOURCES; i < PCI_NUM_RESOURCES; i++) |
698 | pci_claim_resource(bus->self, i); | 698 | pci_claim_bridge_resource(bus->self, i); |
699 | } | ||
700 | } else { | 699 | } else { |
701 | /* Host-PCI Bridge */ | 700 | /* Host-PCI Bridge */ |
702 | int err; | 701 | int err; |
diff --git a/drivers/pci/bus.c b/drivers/pci/bus.c index 73aef51a28f0..8fb16188cd82 100644 --- a/drivers/pci/bus.c +++ b/drivers/pci/bus.c | |||
@@ -228,6 +228,49 @@ int pci_bus_alloc_resource(struct pci_bus *bus, struct resource *res, | |||
228 | } | 228 | } |
229 | EXPORT_SYMBOL(pci_bus_alloc_resource); | 229 | EXPORT_SYMBOL(pci_bus_alloc_resource); |
230 | 230 | ||
231 | /* | ||
232 | * The @idx resource of @dev should be a PCI-PCI bridge window. If this | ||
233 | * resource fits inside a window of an upstream bridge, do nothing. If it | ||
234 | * overlaps an upstream window but extends outside it, clip the resource so | ||
235 | * it fits completely inside. | ||
236 | */ | ||
237 | bool pci_bus_clip_resource(struct pci_dev *dev, int idx) | ||
238 | { | ||
239 | struct pci_bus *bus = dev->bus; | ||
240 | struct resource *res = &dev->resource[idx]; | ||
241 | struct resource orig_res = *res; | ||
242 | struct resource *r; | ||
243 | int i; | ||
244 | |||
245 | pci_bus_for_each_resource(bus, r, i) { | ||
246 | resource_size_t start, end; | ||
247 | |||
248 | if (!r) | ||
249 | continue; | ||
250 | |||
251 | if (resource_type(res) != resource_type(r)) | ||
252 | continue; | ||
253 | |||
254 | start = max(r->start, res->start); | ||
255 | end = min(r->end, res->end); | ||
256 | |||
257 | if (start > end) | ||
258 | continue; /* no overlap */ | ||
259 | |||
260 | if (res->start == start && res->end == end) | ||
261 | return false; /* no change */ | ||
262 | |||
263 | res->start = start; | ||
264 | res->end = end; | ||
265 | dev_printk(KERN_DEBUG, &dev->dev, "%pR clipped to %pR\n", | ||
266 | &orig_res, res); | ||
267 | |||
268 | return true; | ||
269 | } | ||
270 | |||
271 | return false; | ||
272 | } | ||
273 | |||
231 | void __weak pcibios_resource_survey_bus(struct pci_bus *bus) { } | 274 | void __weak pcibios_resource_survey_bus(struct pci_bus *bus) { } |
232 | 275 | ||
233 | /** | 276 | /** |
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index cab05f31223f..e9d4fd861ba1 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
@@ -3271,7 +3271,8 @@ static int pci_parent_bus_reset(struct pci_dev *dev, int probe) | |||
3271 | { | 3271 | { |
3272 | struct pci_dev *pdev; | 3272 | struct pci_dev *pdev; |
3273 | 3273 | ||
3274 | if (pci_is_root_bus(dev->bus) || dev->subordinate || !dev->bus->self) | 3274 | if (pci_is_root_bus(dev->bus) || dev->subordinate || |
3275 | !dev->bus->self || dev->dev_flags & PCI_DEV_FLAGS_NO_BUS_RESET) | ||
3275 | return -ENOTTY; | 3276 | return -ENOTTY; |
3276 | 3277 | ||
3277 | list_for_each_entry(pdev, &dev->bus->devices, bus_list) | 3278 | list_for_each_entry(pdev, &dev->bus->devices, bus_list) |
@@ -3305,7 +3306,8 @@ static int pci_dev_reset_slot_function(struct pci_dev *dev, int probe) | |||
3305 | { | 3306 | { |
3306 | struct pci_dev *pdev; | 3307 | struct pci_dev *pdev; |
3307 | 3308 | ||
3308 | if (dev->subordinate || !dev->slot) | 3309 | if (dev->subordinate || !dev->slot || |
3310 | dev->dev_flags & PCI_DEV_FLAGS_NO_BUS_RESET) | ||
3309 | return -ENOTTY; | 3311 | return -ENOTTY; |
3310 | 3312 | ||
3311 | list_for_each_entry(pdev, &dev->bus->devices, bus_list) | 3313 | list_for_each_entry(pdev, &dev->bus->devices, bus_list) |
@@ -3557,6 +3559,20 @@ int pci_try_reset_function(struct pci_dev *dev) | |||
3557 | } | 3559 | } |
3558 | EXPORT_SYMBOL_GPL(pci_try_reset_function); | 3560 | EXPORT_SYMBOL_GPL(pci_try_reset_function); |
3559 | 3561 | ||
3562 | /* Do any devices on or below this bus prevent a bus reset? */ | ||
3563 | static bool pci_bus_resetable(struct pci_bus *bus) | ||
3564 | { | ||
3565 | struct pci_dev *dev; | ||
3566 | |||
3567 | list_for_each_entry(dev, &bus->devices, bus_list) { | ||
3568 | if (dev->dev_flags & PCI_DEV_FLAGS_NO_BUS_RESET || | ||
3569 | (dev->subordinate && !pci_bus_resetable(dev->subordinate))) | ||
3570 | return false; | ||
3571 | } | ||
3572 | |||
3573 | return true; | ||
3574 | } | ||
3575 | |||
3560 | /* Lock devices from the top of the tree down */ | 3576 | /* Lock devices from the top of the tree down */ |
3561 | static void pci_bus_lock(struct pci_bus *bus) | 3577 | static void pci_bus_lock(struct pci_bus *bus) |
3562 | { | 3578 | { |
@@ -3607,6 +3623,22 @@ unlock: | |||
3607 | return 0; | 3623 | return 0; |
3608 | } | 3624 | } |
3609 | 3625 | ||
3626 | /* Do any devices on or below this slot prevent a bus reset? */ | ||
3627 | static bool pci_slot_resetable(struct pci_slot *slot) | ||
3628 | { | ||
3629 | struct pci_dev *dev; | ||
3630 | |||
3631 | list_for_each_entry(dev, &slot->bus->devices, bus_list) { | ||
3632 | if (!dev->slot || dev->slot != slot) | ||
3633 | continue; | ||
3634 | if (dev->dev_flags & PCI_DEV_FLAGS_NO_BUS_RESET || | ||
3635 | (dev->subordinate && !pci_bus_resetable(dev->subordinate))) | ||
3636 | return false; | ||
3637 | } | ||
3638 | |||
3639 | return true; | ||
3640 | } | ||
3641 | |||
3610 | /* Lock devices from the top of the tree down */ | 3642 | /* Lock devices from the top of the tree down */ |
3611 | static void pci_slot_lock(struct pci_slot *slot) | 3643 | static void pci_slot_lock(struct pci_slot *slot) |
3612 | { | 3644 | { |
@@ -3728,7 +3760,7 @@ static int pci_slot_reset(struct pci_slot *slot, int probe) | |||
3728 | { | 3760 | { |
3729 | int rc; | 3761 | int rc; |
3730 | 3762 | ||
3731 | if (!slot) | 3763 | if (!slot || !pci_slot_resetable(slot)) |
3732 | return -ENOTTY; | 3764 | return -ENOTTY; |
3733 | 3765 | ||
3734 | if (!probe) | 3766 | if (!probe) |
@@ -3820,7 +3852,7 @@ EXPORT_SYMBOL_GPL(pci_try_reset_slot); | |||
3820 | 3852 | ||
3821 | static int pci_bus_reset(struct pci_bus *bus, int probe) | 3853 | static int pci_bus_reset(struct pci_bus *bus, int probe) |
3822 | { | 3854 | { |
3823 | if (!bus->self) | 3855 | if (!bus->self || !pci_bus_resetable(bus)) |
3824 | return -ENOTTY; | 3856 | return -ENOTTY; |
3825 | 3857 | ||
3826 | if (probe) | 3858 | if (probe) |
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index 8aff29a804ff..d54632a1db43 100644 --- a/drivers/pci/pci.h +++ b/drivers/pci/pci.h | |||
@@ -208,6 +208,7 @@ void __pci_bus_size_bridges(struct pci_bus *bus, | |||
208 | void __pci_bus_assign_resources(const struct pci_bus *bus, | 208 | void __pci_bus_assign_resources(const struct pci_bus *bus, |
209 | struct list_head *realloc_head, | 209 | struct list_head *realloc_head, |
210 | struct list_head *fail_head); | 210 | struct list_head *fail_head); |
211 | bool pci_bus_clip_resource(struct pci_dev *dev, int idx); | ||
211 | 212 | ||
212 | /** | 213 | /** |
213 | * pci_ari_enabled - query ARI forwarding status | 214 | * pci_ari_enabled - query ARI forwarding status |
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index ed6f89b6efe5..e52356aa09b8 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
@@ -3028,6 +3028,20 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_REALTEK, 0x8169, | |||
3028 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MELLANOX, PCI_ANY_ID, | 3028 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MELLANOX, PCI_ANY_ID, |
3029 | quirk_broken_intx_masking); | 3029 | quirk_broken_intx_masking); |
3030 | 3030 | ||
3031 | static void quirk_no_bus_reset(struct pci_dev *dev) | ||
3032 | { | ||
3033 | dev->dev_flags |= PCI_DEV_FLAGS_NO_BUS_RESET; | ||
3034 | } | ||
3035 | |||
3036 | /* | ||
3037 | * Atheros AR93xx chips do not behave after a bus reset. The device will | ||
3038 | * throw a Link Down error on AER-capable systems and regardless of AER, | ||
3039 | * config space of the device is never accessible again and typically | ||
3040 | * causes the system to hang or reset when access is attempted. | ||
3041 | * http://www.spinics.net/lists/linux-pci/msg34797.html | ||
3042 | */ | ||
3043 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x0030, quirk_no_bus_reset); | ||
3044 | |||
3031 | #ifdef CONFIG_ACPI | 3045 | #ifdef CONFIG_ACPI |
3032 | /* | 3046 | /* |
3033 | * Apple: Shutdown Cactus Ridge Thunderbolt controller. | 3047 | * Apple: Shutdown Cactus Ridge Thunderbolt controller. |
diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c index 0482235eee92..e3e17f3c0f0f 100644 --- a/drivers/pci/setup-bus.c +++ b/drivers/pci/setup-bus.c | |||
@@ -530,9 +530,8 @@ EXPORT_SYMBOL(pci_setup_cardbus); | |||
530 | config space writes, so it's quite possible that an I/O window of | 530 | config space writes, so it's quite possible that an I/O window of |
531 | the bridge will have some undesirable address (e.g. 0) after the | 531 | the bridge will have some undesirable address (e.g. 0) after the |
532 | first write. Ditto 64-bit prefetchable MMIO. */ | 532 | first write. Ditto 64-bit prefetchable MMIO. */ |
533 | static void pci_setup_bridge_io(struct pci_bus *bus) | 533 | static void pci_setup_bridge_io(struct pci_dev *bridge) |
534 | { | 534 | { |
535 | struct pci_dev *bridge = bus->self; | ||
536 | struct resource *res; | 535 | struct resource *res; |
537 | struct pci_bus_region region; | 536 | struct pci_bus_region region; |
538 | unsigned long io_mask; | 537 | unsigned long io_mask; |
@@ -545,7 +544,7 @@ static void pci_setup_bridge_io(struct pci_bus *bus) | |||
545 | io_mask = PCI_IO_1K_RANGE_MASK; | 544 | io_mask = PCI_IO_1K_RANGE_MASK; |
546 | 545 | ||
547 | /* Set up the top and bottom of the PCI I/O segment for this bus. */ | 546 | /* Set up the top and bottom of the PCI I/O segment for this bus. */ |
548 | res = bus->resource[0]; | 547 | res = &bridge->resource[PCI_BRIDGE_RESOURCES + 0]; |
549 | pcibios_resource_to_bus(bridge->bus, ®ion, res); | 548 | pcibios_resource_to_bus(bridge->bus, ®ion, res); |
550 | if (res->flags & IORESOURCE_IO) { | 549 | if (res->flags & IORESOURCE_IO) { |
551 | pci_read_config_word(bridge, PCI_IO_BASE, &l); | 550 | pci_read_config_word(bridge, PCI_IO_BASE, &l); |
@@ -568,15 +567,14 @@ static void pci_setup_bridge_io(struct pci_bus *bus) | |||
568 | pci_write_config_dword(bridge, PCI_IO_BASE_UPPER16, io_upper16); | 567 | pci_write_config_dword(bridge, PCI_IO_BASE_UPPER16, io_upper16); |
569 | } | 568 | } |
570 | 569 | ||
571 | static void pci_setup_bridge_mmio(struct pci_bus *bus) | 570 | static void pci_setup_bridge_mmio(struct pci_dev *bridge) |
572 | { | 571 | { |
573 | struct pci_dev *bridge = bus->self; | ||
574 | struct resource *res; | 572 | struct resource *res; |
575 | struct pci_bus_region region; | 573 | struct pci_bus_region region; |
576 | u32 l; | 574 | u32 l; |
577 | 575 | ||
578 | /* Set up the top and bottom of the PCI Memory segment for this bus. */ | 576 | /* Set up the top and bottom of the PCI Memory segment for this bus. */ |
579 | res = bus->resource[1]; | 577 | res = &bridge->resource[PCI_BRIDGE_RESOURCES + 1]; |
580 | pcibios_resource_to_bus(bridge->bus, ®ion, res); | 578 | pcibios_resource_to_bus(bridge->bus, ®ion, res); |
581 | if (res->flags & IORESOURCE_MEM) { | 579 | if (res->flags & IORESOURCE_MEM) { |
582 | l = (region.start >> 16) & 0xfff0; | 580 | l = (region.start >> 16) & 0xfff0; |
@@ -588,9 +586,8 @@ static void pci_setup_bridge_mmio(struct pci_bus *bus) | |||
588 | pci_write_config_dword(bridge, PCI_MEMORY_BASE, l); | 586 | pci_write_config_dword(bridge, PCI_MEMORY_BASE, l); |
589 | } | 587 | } |
590 | 588 | ||
591 | static void pci_setup_bridge_mmio_pref(struct pci_bus *bus) | 589 | static void pci_setup_bridge_mmio_pref(struct pci_dev *bridge) |
592 | { | 590 | { |
593 | struct pci_dev *bridge = bus->self; | ||
594 | struct resource *res; | 591 | struct resource *res; |
595 | struct pci_bus_region region; | 592 | struct pci_bus_region region; |
596 | u32 l, bu, lu; | 593 | u32 l, bu, lu; |
@@ -602,7 +599,7 @@ static void pci_setup_bridge_mmio_pref(struct pci_bus *bus) | |||
602 | 599 | ||
603 | /* Set up PREF base/limit. */ | 600 | /* Set up PREF base/limit. */ |
604 | bu = lu = 0; | 601 | bu = lu = 0; |
605 | res = bus->resource[2]; | 602 | res = &bridge->resource[PCI_BRIDGE_RESOURCES + 2]; |
606 | pcibios_resource_to_bus(bridge->bus, ®ion, res); | 603 | pcibios_resource_to_bus(bridge->bus, ®ion, res); |
607 | if (res->flags & IORESOURCE_PREFETCH) { | 604 | if (res->flags & IORESOURCE_PREFETCH) { |
608 | l = (region.start >> 16) & 0xfff0; | 605 | l = (region.start >> 16) & 0xfff0; |
@@ -630,13 +627,13 @@ static void __pci_setup_bridge(struct pci_bus *bus, unsigned long type) | |||
630 | &bus->busn_res); | 627 | &bus->busn_res); |
631 | 628 | ||
632 | if (type & IORESOURCE_IO) | 629 | if (type & IORESOURCE_IO) |
633 | pci_setup_bridge_io(bus); | 630 | pci_setup_bridge_io(bridge); |
634 | 631 | ||
635 | if (type & IORESOURCE_MEM) | 632 | if (type & IORESOURCE_MEM) |
636 | pci_setup_bridge_mmio(bus); | 633 | pci_setup_bridge_mmio(bridge); |
637 | 634 | ||
638 | if (type & IORESOURCE_PREFETCH) | 635 | if (type & IORESOURCE_PREFETCH) |
639 | pci_setup_bridge_mmio_pref(bus); | 636 | pci_setup_bridge_mmio_pref(bridge); |
640 | 637 | ||
641 | pci_write_config_word(bridge, PCI_BRIDGE_CONTROL, bus->bridge_ctl); | 638 | pci_write_config_word(bridge, PCI_BRIDGE_CONTROL, bus->bridge_ctl); |
642 | } | 639 | } |
@@ -649,6 +646,41 @@ void pci_setup_bridge(struct pci_bus *bus) | |||
649 | __pci_setup_bridge(bus, type); | 646 | __pci_setup_bridge(bus, type); |
650 | } | 647 | } |
651 | 648 | ||
649 | |||
650 | int pci_claim_bridge_resource(struct pci_dev *bridge, int i) | ||
651 | { | ||
652 | if (i < PCI_BRIDGE_RESOURCES || i > PCI_BRIDGE_RESOURCE_END) | ||
653 | return 0; | ||
654 | |||
655 | if (pci_claim_resource(bridge, i) == 0) | ||
656 | return 0; /* claimed the window */ | ||
657 | |||
658 | if ((bridge->class >> 8) != PCI_CLASS_BRIDGE_PCI) | ||
659 | return 0; | ||
660 | |||
661 | if (!pci_bus_clip_resource(bridge, i)) | ||
662 | return -EINVAL; /* clipping didn't change anything */ | ||
663 | |||
664 | switch (i - PCI_BRIDGE_RESOURCES) { | ||
665 | case 0: | ||
666 | pci_setup_bridge_io(bridge); | ||
667 | break; | ||
668 | case 1: | ||
669 | pci_setup_bridge_mmio(bridge); | ||
670 | break; | ||
671 | case 2: | ||
672 | pci_setup_bridge_mmio_pref(bridge); | ||
673 | break; | ||
674 | default: | ||
675 | return -EINVAL; | ||
676 | } | ||
677 | |||
678 | if (pci_claim_resource(bridge, i) == 0) | ||
679 | return 0; /* claimed a smaller window */ | ||
680 | |||
681 | return -EINVAL; | ||
682 | } | ||
683 | |||
652 | /* Check whether the bridge supports optional I/O and | 684 | /* Check whether the bridge supports optional I/O and |
653 | prefetchable memory ranges. If not, the respective | 685 | prefetchable memory ranges. If not, the respective |
654 | base/limit registers must be read-only and read as 0. */ | 686 | base/limit registers must be read-only and read as 0. */ |
diff --git a/drivers/platform/x86/dell-laptop.c b/drivers/platform/x86/dell-laptop.c index 9411eae39a4e..3d21efe11d7b 100644 --- a/drivers/platform/x86/dell-laptop.c +++ b/drivers/platform/x86/dell-laptop.c | |||
@@ -2,11 +2,9 @@ | |||
2 | * Driver for Dell laptop extras | 2 | * Driver for Dell laptop extras |
3 | * | 3 | * |
4 | * Copyright (c) Red Hat <mjg@redhat.com> | 4 | * Copyright (c) Red Hat <mjg@redhat.com> |
5 | * Copyright (c) 2014 Gabriele Mazzotta <gabriele.mzt@gmail.com> | ||
6 | * Copyright (c) 2014 Pali Rohár <pali.rohar@gmail.com> | ||
7 | * | 5 | * |
8 | * Based on documentation in the libsmbios package: | 6 | * Based on documentation in the libsmbios package, Copyright (C) 2005 Dell |
9 | * Copyright (C) 2005-2014 Dell Inc. | 7 | * Inc. |
10 | * | 8 | * |
11 | * This program is free software; you can redistribute it and/or modify | 9 | * This program is free software; you can redistribute it and/or modify |
12 | * it under the terms of the GNU General Public License version 2 as | 10 | * it under the terms of the GNU General Public License version 2 as |
@@ -34,13 +32,6 @@ | |||
34 | #include "../../firmware/dcdbas.h" | 32 | #include "../../firmware/dcdbas.h" |
35 | 33 | ||
36 | #define BRIGHTNESS_TOKEN 0x7d | 34 | #define BRIGHTNESS_TOKEN 0x7d |
37 | #define KBD_LED_OFF_TOKEN 0x01E1 | ||
38 | #define KBD_LED_ON_TOKEN 0x01E2 | ||
39 | #define KBD_LED_AUTO_TOKEN 0x01E3 | ||
40 | #define KBD_LED_AUTO_25_TOKEN 0x02EA | ||
41 | #define KBD_LED_AUTO_50_TOKEN 0x02EB | ||
42 | #define KBD_LED_AUTO_75_TOKEN 0x02EC | ||
43 | #define KBD_LED_AUTO_100_TOKEN 0x02F6 | ||
44 | 35 | ||
45 | /* This structure will be modified by the firmware when we enter | 36 | /* This structure will be modified by the firmware when we enter |
46 | * system management mode, hence the volatiles */ | 37 | * system management mode, hence the volatiles */ |
@@ -71,13 +62,6 @@ struct calling_interface_structure { | |||
71 | 62 | ||
72 | struct quirk_entry { | 63 | struct quirk_entry { |
73 | u8 touchpad_led; | 64 | u8 touchpad_led; |
74 | |||
75 | int needs_kbd_timeouts; | ||
76 | /* | ||
77 | * Ordered list of timeouts expressed in seconds. | ||
78 | * The list must end with -1 | ||
79 | */ | ||
80 | int kbd_timeouts[]; | ||
81 | }; | 65 | }; |
82 | 66 | ||
83 | static struct quirk_entry *quirks; | 67 | static struct quirk_entry *quirks; |
@@ -92,15 +76,6 @@ static int __init dmi_matched(const struct dmi_system_id *dmi) | |||
92 | return 1; | 76 | return 1; |
93 | } | 77 | } |
94 | 78 | ||
95 | /* | ||
96 | * These values come from Windows utility provided by Dell. If any other value | ||
97 | * is used then BIOS silently set timeout to 0 without any error message. | ||
98 | */ | ||
99 | static struct quirk_entry quirk_dell_xps13_9333 = { | ||
100 | .needs_kbd_timeouts = 1, | ||
101 | .kbd_timeouts = { 0, 5, 15, 60, 5 * 60, 15 * 60, -1 }, | ||
102 | }; | ||
103 | |||
104 | static int da_command_address; | 79 | static int da_command_address; |
105 | static int da_command_code; | 80 | static int da_command_code; |
106 | static int da_num_tokens; | 81 | static int da_num_tokens; |
@@ -292,15 +267,6 @@ static const struct dmi_system_id dell_quirks[] __initconst = { | |||
292 | }, | 267 | }, |
293 | .driver_data = &quirk_dell_vostro_v130, | 268 | .driver_data = &quirk_dell_vostro_v130, |
294 | }, | 269 | }, |
295 | { | ||
296 | .callback = dmi_matched, | ||
297 | .ident = "Dell XPS13 9333", | ||
298 | .matches = { | ||
299 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
300 | DMI_MATCH(DMI_PRODUCT_NAME, "XPS13 9333"), | ||
301 | }, | ||
302 | .driver_data = &quirk_dell_xps13_9333, | ||
303 | }, | ||
304 | { } | 270 | { } |
305 | }; | 271 | }; |
306 | 272 | ||
@@ -365,29 +331,17 @@ static void __init find_tokens(const struct dmi_header *dm, void *dummy) | |||
365 | } | 331 | } |
366 | } | 332 | } |
367 | 333 | ||
368 | static int find_token_id(int tokenid) | 334 | static int find_token_location(int tokenid) |
369 | { | 335 | { |
370 | int i; | 336 | int i; |
371 | |||
372 | for (i = 0; i < da_num_tokens; i++) { | 337 | for (i = 0; i < da_num_tokens; i++) { |
373 | if (da_tokens[i].tokenID == tokenid) | 338 | if (da_tokens[i].tokenID == tokenid) |
374 | return i; | 339 | return da_tokens[i].location; |
375 | } | 340 | } |
376 | 341 | ||
377 | return -1; | 342 | return -1; |
378 | } | 343 | } |
379 | 344 | ||
380 | static int find_token_location(int tokenid) | ||
381 | { | ||
382 | int id; | ||
383 | |||
384 | id = find_token_id(tokenid); | ||
385 | if (id == -1) | ||
386 | return -1; | ||
387 | |||
388 | return da_tokens[id].location; | ||
389 | } | ||
390 | |||
391 | static struct calling_interface_buffer * | 345 | static struct calling_interface_buffer * |
392 | dell_send_request(struct calling_interface_buffer *buffer, int class, | 346 | dell_send_request(struct calling_interface_buffer *buffer, int class, |
393 | int select) | 347 | int select) |
@@ -408,20 +362,6 @@ dell_send_request(struct calling_interface_buffer *buffer, int class, | |||
408 | return buffer; | 362 | return buffer; |
409 | } | 363 | } |
410 | 364 | ||
411 | static inline int dell_smi_error(int value) | ||
412 | { | ||
413 | switch (value) { | ||
414 | case 0: /* Completed successfully */ | ||
415 | return 0; | ||
416 | case -1: /* Completed with error */ | ||
417 | return -EIO; | ||
418 | case -2: /* Function not supported */ | ||
419 | return -ENXIO; | ||
420 | default: /* Unknown error */ | ||
421 | return -EINVAL; | ||
422 | } | ||
423 | } | ||
424 | |||
425 | /* Derived from information in DellWirelessCtl.cpp: | 365 | /* Derived from information in DellWirelessCtl.cpp: |
426 | Class 17, select 11 is radio control. It returns an array of 32-bit values. | 366 | Class 17, select 11 is radio control. It returns an array of 32-bit values. |
427 | 367 | ||
@@ -776,7 +716,7 @@ static int dell_send_intensity(struct backlight_device *bd) | |||
776 | else | 716 | else |
777 | dell_send_request(buffer, 1, 1); | 717 | dell_send_request(buffer, 1, 1); |
778 | 718 | ||
779 | out: | 719 | out: |
780 | release_buffer(); | 720 | release_buffer(); |
781 | return ret; | 721 | return ret; |
782 | } | 722 | } |
@@ -800,7 +740,7 @@ static int dell_get_intensity(struct backlight_device *bd) | |||
800 | 740 | ||
801 | ret = buffer->output[1]; | 741 | ret = buffer->output[1]; |
802 | 742 | ||
803 | out: | 743 | out: |
804 | release_buffer(); | 744 | release_buffer(); |
805 | return ret; | 745 | return ret; |
806 | } | 746 | } |
@@ -849,984 +789,6 @@ static void touchpad_led_exit(void) | |||
849 | led_classdev_unregister(&touchpad_led); | 789 | led_classdev_unregister(&touchpad_led); |
850 | } | 790 | } |
851 | 791 | ||
852 | /* | ||
853 | * Derived from information in smbios-keyboard-ctl: | ||
854 | * | ||
855 | * cbClass 4 | ||
856 | * cbSelect 11 | ||
857 | * Keyboard illumination | ||
858 | * cbArg1 determines the function to be performed | ||
859 | * | ||
860 | * cbArg1 0x0 = Get Feature Information | ||
861 | * cbRES1 Standard return codes (0, -1, -2) | ||
862 | * cbRES2, word0 Bitmap of user-selectable modes | ||
863 | * bit 0 Always off (All systems) | ||
864 | * bit 1 Always on (Travis ATG, Siberia) | ||
865 | * bit 2 Auto: ALS-based On; ALS-based Off (Travis ATG) | ||
866 | * bit 3 Auto: ALS- and input-activity-based On; input-activity based Off | ||
867 | * bit 4 Auto: Input-activity-based On; input-activity based Off | ||
868 | * bit 5 Auto: Input-activity-based On (illumination level 25%); input-activity based Off | ||
869 | * bit 6 Auto: Input-activity-based On (illumination level 50%); input-activity based Off | ||
870 | * bit 7 Auto: Input-activity-based On (illumination level 75%); input-activity based Off | ||
871 | * bit 8 Auto: Input-activity-based On (illumination level 100%); input-activity based Off | ||
872 | * bits 9-15 Reserved for future use | ||
873 | * cbRES2, byte2 Reserved for future use | ||
874 | * cbRES2, byte3 Keyboard illumination type | ||
875 | * 0 Reserved | ||
876 | * 1 Tasklight | ||
877 | * 2 Backlight | ||
878 | * 3-255 Reserved for future use | ||
879 | * cbRES3, byte0 Supported auto keyboard illumination trigger bitmap. | ||
880 | * bit 0 Any keystroke | ||
881 | * bit 1 Touchpad activity | ||
882 | * bit 2 Pointing stick | ||
883 | * bit 3 Any mouse | ||
884 | * bits 4-7 Reserved for future use | ||
885 | * cbRES3, byte1 Supported timeout unit bitmap | ||
886 | * bit 0 Seconds | ||
887 | * bit 1 Minutes | ||
888 | * bit 2 Hours | ||
889 | * bit 3 Days | ||
890 | * bits 4-7 Reserved for future use | ||
891 | * cbRES3, byte2 Number of keyboard light brightness levels | ||
892 | * cbRES4, byte0 Maximum acceptable seconds value (0 if seconds not supported). | ||
893 | * cbRES4, byte1 Maximum acceptable minutes value (0 if minutes not supported). | ||
894 | * cbRES4, byte2 Maximum acceptable hours value (0 if hours not supported). | ||
895 | * cbRES4, byte3 Maximum acceptable days value (0 if days not supported) | ||
896 | * | ||
897 | * cbArg1 0x1 = Get Current State | ||
898 | * cbRES1 Standard return codes (0, -1, -2) | ||
899 | * cbRES2, word0 Bitmap of current mode state | ||
900 | * bit 0 Always off (All systems) | ||
901 | * bit 1 Always on (Travis ATG, Siberia) | ||
902 | * bit 2 Auto: ALS-based On; ALS-based Off (Travis ATG) | ||
903 | * bit 3 Auto: ALS- and input-activity-based On; input-activity based Off | ||
904 | * bit 4 Auto: Input-activity-based On; input-activity based Off | ||
905 | * bit 5 Auto: Input-activity-based On (illumination level 25%); input-activity based Off | ||
906 | * bit 6 Auto: Input-activity-based On (illumination level 50%); input-activity based Off | ||
907 | * bit 7 Auto: Input-activity-based On (illumination level 75%); input-activity based Off | ||
908 | * bit 8 Auto: Input-activity-based On (illumination level 100%); input-activity based Off | ||
909 | * bits 9-15 Reserved for future use | ||
910 | * Note: Only One bit can be set | ||
911 | * cbRES2, byte2 Currently active auto keyboard illumination triggers. | ||
912 | * bit 0 Any keystroke | ||
913 | * bit 1 Touchpad activity | ||
914 | * bit 2 Pointing stick | ||
915 | * bit 3 Any mouse | ||
916 | * bits 4-7 Reserved for future use | ||
917 | * cbRES2, byte3 Current Timeout | ||
918 | * bits 7:6 Timeout units indicator: | ||
919 | * 00b Seconds | ||
920 | * 01b Minutes | ||
921 | * 10b Hours | ||
922 | * 11b Days | ||
923 | * bits 5:0 Timeout value (0-63) in sec/min/hr/day | ||
924 | * NOTE: A value of 0 means always on (no timeout) if any bits of RES3 byte | ||
925 | * are set upon return from the [Get feature information] call. | ||
926 | * cbRES3, byte0 Current setting of ALS value that turns the light on or off. | ||
927 | * cbRES3, byte1 Current ALS reading | ||
928 | * cbRES3, byte2 Current keyboard light level. | ||
929 | * | ||
930 | * cbArg1 0x2 = Set New State | ||
931 | * cbRES1 Standard return codes (0, -1, -2) | ||
932 | * cbArg2, word0 Bitmap of current mode state | ||
933 | * bit 0 Always off (All systems) | ||
934 | * bit 1 Always on (Travis ATG, Siberia) | ||
935 | * bit 2 Auto: ALS-based On; ALS-based Off (Travis ATG) | ||
936 | * bit 3 Auto: ALS- and input-activity-based On; input-activity based Off | ||
937 | * bit 4 Auto: Input-activity-based On; input-activity based Off | ||
938 | * bit 5 Auto: Input-activity-based On (illumination level 25%); input-activity based Off | ||
939 | * bit 6 Auto: Input-activity-based On (illumination level 50%); input-activity based Off | ||
940 | * bit 7 Auto: Input-activity-based On (illumination level 75%); input-activity based Off | ||
941 | * bit 8 Auto: Input-activity-based On (illumination level 100%); input-activity based Off | ||
942 | * bits 9-15 Reserved for future use | ||
943 | * Note: Only One bit can be set | ||
944 | * cbArg2, byte2 Desired auto keyboard illumination triggers. Must remain inactive to allow | ||
945 | * keyboard to turn off automatically. | ||
946 | * bit 0 Any keystroke | ||
947 | * bit 1 Touchpad activity | ||
948 | * bit 2 Pointing stick | ||
949 | * bit 3 Any mouse | ||
950 | * bits 4-7 Reserved for future use | ||
951 | * cbArg2, byte3 Desired Timeout | ||
952 | * bits 7:6 Timeout units indicator: | ||
953 | * 00b Seconds | ||
954 | * 01b Minutes | ||
955 | * 10b Hours | ||
956 | * 11b Days | ||
957 | * bits 5:0 Timeout value (0-63) in sec/min/hr/day | ||
958 | * cbArg3, byte0 Desired setting of ALS value that turns the light on or off. | ||
959 | * cbArg3, byte2 Desired keyboard light level. | ||
960 | */ | ||
961 | |||
962 | |||
963 | enum kbd_timeout_unit { | ||
964 | KBD_TIMEOUT_SECONDS = 0, | ||
965 | KBD_TIMEOUT_MINUTES, | ||
966 | KBD_TIMEOUT_HOURS, | ||
967 | KBD_TIMEOUT_DAYS, | ||
968 | }; | ||
969 | |||
970 | enum kbd_mode_bit { | ||
971 | KBD_MODE_BIT_OFF = 0, | ||
972 | KBD_MODE_BIT_ON, | ||
973 | KBD_MODE_BIT_ALS, | ||
974 | KBD_MODE_BIT_TRIGGER_ALS, | ||
975 | KBD_MODE_BIT_TRIGGER, | ||
976 | KBD_MODE_BIT_TRIGGER_25, | ||
977 | KBD_MODE_BIT_TRIGGER_50, | ||
978 | KBD_MODE_BIT_TRIGGER_75, | ||
979 | KBD_MODE_BIT_TRIGGER_100, | ||
980 | }; | ||
981 | |||
982 | #define kbd_is_als_mode_bit(bit) \ | ||
983 | ((bit) == KBD_MODE_BIT_ALS || (bit) == KBD_MODE_BIT_TRIGGER_ALS) | ||
984 | #define kbd_is_trigger_mode_bit(bit) \ | ||
985 | ((bit) >= KBD_MODE_BIT_TRIGGER_ALS && (bit) <= KBD_MODE_BIT_TRIGGER_100) | ||
986 | #define kbd_is_level_mode_bit(bit) \ | ||
987 | ((bit) >= KBD_MODE_BIT_TRIGGER_25 && (bit) <= KBD_MODE_BIT_TRIGGER_100) | ||
988 | |||
989 | struct kbd_info { | ||
990 | u16 modes; | ||
991 | u8 type; | ||
992 | u8 triggers; | ||
993 | u8 levels; | ||
994 | u8 seconds; | ||
995 | u8 minutes; | ||
996 | u8 hours; | ||
997 | u8 days; | ||
998 | }; | ||
999 | |||
1000 | struct kbd_state { | ||
1001 | u8 mode_bit; | ||
1002 | u8 triggers; | ||
1003 | u8 timeout_value; | ||
1004 | u8 timeout_unit; | ||
1005 | u8 als_setting; | ||
1006 | u8 als_value; | ||
1007 | u8 level; | ||
1008 | }; | ||
1009 | |||
1010 | static const int kbd_tokens[] = { | ||
1011 | KBD_LED_OFF_TOKEN, | ||
1012 | KBD_LED_AUTO_25_TOKEN, | ||
1013 | KBD_LED_AUTO_50_TOKEN, | ||
1014 | KBD_LED_AUTO_75_TOKEN, | ||
1015 | KBD_LED_AUTO_100_TOKEN, | ||
1016 | KBD_LED_ON_TOKEN, | ||
1017 | }; | ||
1018 | |||
1019 | static u16 kbd_token_bits; | ||
1020 | |||
1021 | static struct kbd_info kbd_info; | ||
1022 | static bool kbd_als_supported; | ||
1023 | static bool kbd_triggers_supported; | ||
1024 | |||
1025 | static u8 kbd_mode_levels[16]; | ||
1026 | static int kbd_mode_levels_count; | ||
1027 | |||
1028 | static u8 kbd_previous_level; | ||
1029 | static u8 kbd_previous_mode_bit; | ||
1030 | |||
1031 | static bool kbd_led_present; | ||
1032 | |||
1033 | /* | ||
1034 | * NOTE: there are three ways to set the keyboard backlight level. | ||
1035 | * First, via kbd_state.mode_bit (assigning KBD_MODE_BIT_TRIGGER_* value). | ||
1036 | * Second, via kbd_state.level (assigning numerical value <= kbd_info.levels). | ||
1037 | * Third, via SMBIOS tokens (KBD_LED_* in kbd_tokens) | ||
1038 | * | ||
1039 | * There are laptops which support only one of these methods. If we want to | ||
1040 | * support as many machines as possible we need to implement all three methods. | ||
1041 | * The first two methods use the kbd_state structure. The third uses SMBIOS | ||
1042 | * tokens. If kbd_info.levels == 0, the machine does not support setting the | ||
1043 | * keyboard backlight level via kbd_state.level. | ||
1044 | */ | ||
1045 | |||
1046 | static int kbd_get_info(struct kbd_info *info) | ||
1047 | { | ||
1048 | u8 units; | ||
1049 | int ret; | ||
1050 | |||
1051 | get_buffer(); | ||
1052 | |||
1053 | buffer->input[0] = 0x0; | ||
1054 | dell_send_request(buffer, 4, 11); | ||
1055 | ret = buffer->output[0]; | ||
1056 | |||
1057 | if (ret) { | ||
1058 | ret = dell_smi_error(ret); | ||
1059 | goto out; | ||
1060 | } | ||
1061 | |||
1062 | info->modes = buffer->output[1] & 0xFFFF; | ||
1063 | info->type = (buffer->output[1] >> 24) & 0xFF; | ||
1064 | info->triggers = buffer->output[2] & 0xFF; | ||
1065 | units = (buffer->output[2] >> 8) & 0xFF; | ||
1066 | info->levels = (buffer->output[2] >> 16) & 0xFF; | ||
1067 | |||
1068 | if (units & BIT(0)) | ||
1069 | info->seconds = (buffer->output[3] >> 0) & 0xFF; | ||
1070 | if (units & BIT(1)) | ||
1071 | info->minutes = (buffer->output[3] >> 8) & 0xFF; | ||
1072 | if (units & BIT(2)) | ||
1073 | info->hours = (buffer->output[3] >> 16) & 0xFF; | ||
1074 | if (units & BIT(3)) | ||
1075 | info->days = (buffer->output[3] >> 24) & 0xFF; | ||
1076 | |||
1077 | out: | ||
1078 | release_buffer(); | ||
1079 | return ret; | ||
1080 | } | ||
1081 | |||
1082 | static unsigned int kbd_get_max_level(void) | ||
1083 | { | ||
1084 | if (kbd_info.levels != 0) | ||
1085 | return kbd_info.levels; | ||
1086 | if (kbd_mode_levels_count > 0) | ||
1087 | return kbd_mode_levels_count - 1; | ||
1088 | return 0; | ||
1089 | } | ||
1090 | |||
1091 | static int kbd_get_level(struct kbd_state *state) | ||
1092 | { | ||
1093 | int i; | ||
1094 | |||
1095 | if (kbd_info.levels != 0) | ||
1096 | return state->level; | ||
1097 | |||
1098 | if (kbd_mode_levels_count > 0) { | ||
1099 | for (i = 0; i < kbd_mode_levels_count; ++i) | ||
1100 | if (kbd_mode_levels[i] == state->mode_bit) | ||
1101 | return i; | ||
1102 | return 0; | ||
1103 | } | ||
1104 | |||
1105 | return -EINVAL; | ||
1106 | } | ||
1107 | |||
1108 | static int kbd_set_level(struct kbd_state *state, u8 level) | ||
1109 | { | ||
1110 | if (kbd_info.levels != 0) { | ||
1111 | if (level != 0) | ||
1112 | kbd_previous_level = level; | ||
1113 | if (state->level == level) | ||
1114 | return 0; | ||
1115 | state->level = level; | ||
1116 | if (level != 0 && state->mode_bit == KBD_MODE_BIT_OFF) | ||
1117 | state->mode_bit = kbd_previous_mode_bit; | ||
1118 | else if (level == 0 && state->mode_bit != KBD_MODE_BIT_OFF) { | ||
1119 | kbd_previous_mode_bit = state->mode_bit; | ||
1120 | state->mode_bit = KBD_MODE_BIT_OFF; | ||
1121 | } | ||
1122 | return 0; | ||
1123 | } | ||
1124 | |||
1125 | if (kbd_mode_levels_count > 0 && level < kbd_mode_levels_count) { | ||
1126 | if (level != 0) | ||
1127 | kbd_previous_level = level; | ||
1128 | state->mode_bit = kbd_mode_levels[level]; | ||
1129 | return 0; | ||
1130 | } | ||
1131 | |||
1132 | return -EINVAL; | ||
1133 | } | ||
1134 | |||
1135 | static int kbd_get_state(struct kbd_state *state) | ||
1136 | { | ||
1137 | int ret; | ||
1138 | |||
1139 | get_buffer(); | ||
1140 | |||
1141 | buffer->input[0] = 0x1; | ||
1142 | dell_send_request(buffer, 4, 11); | ||
1143 | ret = buffer->output[0]; | ||
1144 | |||
1145 | if (ret) { | ||
1146 | ret = dell_smi_error(ret); | ||
1147 | goto out; | ||
1148 | } | ||
1149 | |||
1150 | state->mode_bit = ffs(buffer->output[1] & 0xFFFF); | ||
1151 | if (state->mode_bit != 0) | ||
1152 | state->mode_bit--; | ||
1153 | |||
1154 | state->triggers = (buffer->output[1] >> 16) & 0xFF; | ||
1155 | state->timeout_value = (buffer->output[1] >> 24) & 0x3F; | ||
1156 | state->timeout_unit = (buffer->output[1] >> 30) & 0x3; | ||
1157 | state->als_setting = buffer->output[2] & 0xFF; | ||
1158 | state->als_value = (buffer->output[2] >> 8) & 0xFF; | ||
1159 | state->level = (buffer->output[2] >> 16) & 0xFF; | ||
1160 | |||
1161 | out: | ||
1162 | release_buffer(); | ||
1163 | return ret; | ||
1164 | } | ||
1165 | |||
1166 | static int kbd_set_state(struct kbd_state *state) | ||
1167 | { | ||
1168 | int ret; | ||
1169 | |||
1170 | get_buffer(); | ||
1171 | buffer->input[0] = 0x2; | ||
1172 | buffer->input[1] = BIT(state->mode_bit) & 0xFFFF; | ||
1173 | buffer->input[1] |= (state->triggers & 0xFF) << 16; | ||
1174 | buffer->input[1] |= (state->timeout_value & 0x3F) << 24; | ||
1175 | buffer->input[1] |= (state->timeout_unit & 0x3) << 30; | ||
1176 | buffer->input[2] = state->als_setting & 0xFF; | ||
1177 | buffer->input[2] |= (state->level & 0xFF) << 16; | ||
1178 | dell_send_request(buffer, 4, 11); | ||
1179 | ret = buffer->output[0]; | ||
1180 | release_buffer(); | ||
1181 | |||
1182 | return dell_smi_error(ret); | ||
1183 | } | ||
1184 | |||
1185 | static int kbd_set_state_safe(struct kbd_state *state, struct kbd_state *old) | ||
1186 | { | ||
1187 | int ret; | ||
1188 | |||
1189 | ret = kbd_set_state(state); | ||
1190 | if (ret == 0) | ||
1191 | return 0; | ||
1192 | |||
1193 | /* | ||
1194 | * When setting the new state fails,try to restore the previous one. | ||
1195 | * This is needed on some machines where BIOS sets a default state when | ||
1196 | * setting a new state fails. This default state could be all off. | ||
1197 | */ | ||
1198 | |||
1199 | if (kbd_set_state(old)) | ||
1200 | pr_err("Setting old previous keyboard state failed\n"); | ||
1201 | |||
1202 | return ret; | ||
1203 | } | ||
1204 | |||
1205 | static int kbd_set_token_bit(u8 bit) | ||
1206 | { | ||
1207 | int id; | ||
1208 | int ret; | ||
1209 | |||
1210 | if (bit >= ARRAY_SIZE(kbd_tokens)) | ||
1211 | return -EINVAL; | ||
1212 | |||
1213 | id = find_token_id(kbd_tokens[bit]); | ||
1214 | if (id == -1) | ||
1215 | return -EINVAL; | ||
1216 | |||
1217 | get_buffer(); | ||
1218 | buffer->input[0] = da_tokens[id].location; | ||
1219 | buffer->input[1] = da_tokens[id].value; | ||
1220 | dell_send_request(buffer, 1, 0); | ||
1221 | ret = buffer->output[0]; | ||
1222 | release_buffer(); | ||
1223 | |||
1224 | return dell_smi_error(ret); | ||
1225 | } | ||
1226 | |||
1227 | static int kbd_get_token_bit(u8 bit) | ||
1228 | { | ||
1229 | int id; | ||
1230 | int ret; | ||
1231 | int val; | ||
1232 | |||
1233 | if (bit >= ARRAY_SIZE(kbd_tokens)) | ||
1234 | return -EINVAL; | ||
1235 | |||
1236 | id = find_token_id(kbd_tokens[bit]); | ||
1237 | if (id == -1) | ||
1238 | return -EINVAL; | ||
1239 | |||
1240 | get_buffer(); | ||
1241 | buffer->input[0] = da_tokens[id].location; | ||
1242 | dell_send_request(buffer, 0, 0); | ||
1243 | ret = buffer->output[0]; | ||
1244 | val = buffer->output[1]; | ||
1245 | release_buffer(); | ||
1246 | |||
1247 | if (ret) | ||
1248 | return dell_smi_error(ret); | ||
1249 | |||
1250 | return (val == da_tokens[id].value); | ||
1251 | } | ||
1252 | |||
1253 | static int kbd_get_first_active_token_bit(void) | ||
1254 | { | ||
1255 | int i; | ||
1256 | int ret; | ||
1257 | |||
1258 | for (i = 0; i < ARRAY_SIZE(kbd_tokens); ++i) { | ||
1259 | ret = kbd_get_token_bit(i); | ||
1260 | if (ret == 1) | ||
1261 | return i; | ||
1262 | } | ||
1263 | |||
1264 | return ret; | ||
1265 | } | ||
1266 | |||
1267 | static int kbd_get_valid_token_counts(void) | ||
1268 | { | ||
1269 | return hweight16(kbd_token_bits); | ||
1270 | } | ||
1271 | |||
1272 | static inline int kbd_init_info(void) | ||
1273 | { | ||
1274 | struct kbd_state state; | ||
1275 | int ret; | ||
1276 | int i; | ||
1277 | |||
1278 | ret = kbd_get_info(&kbd_info); | ||
1279 | if (ret) | ||
1280 | return ret; | ||
1281 | |||
1282 | kbd_get_state(&state); | ||
1283 | |||
1284 | /* NOTE: timeout value is stored in 6 bits so max value is 63 */ | ||
1285 | if (kbd_info.seconds > 63) | ||
1286 | kbd_info.seconds = 63; | ||
1287 | if (kbd_info.minutes > 63) | ||
1288 | kbd_info.minutes = 63; | ||
1289 | if (kbd_info.hours > 63) | ||
1290 | kbd_info.hours = 63; | ||
1291 | if (kbd_info.days > 63) | ||
1292 | kbd_info.days = 63; | ||
1293 | |||
1294 | /* NOTE: On tested machines ON mode did not work and caused | ||
1295 | * problems (turned backlight off) so do not use it | ||
1296 | */ | ||
1297 | kbd_info.modes &= ~BIT(KBD_MODE_BIT_ON); | ||
1298 | |||
1299 | kbd_previous_level = kbd_get_level(&state); | ||
1300 | kbd_previous_mode_bit = state.mode_bit; | ||
1301 | |||
1302 | if (kbd_previous_level == 0 && kbd_get_max_level() != 0) | ||
1303 | kbd_previous_level = 1; | ||
1304 | |||
1305 | if (kbd_previous_mode_bit == KBD_MODE_BIT_OFF) { | ||
1306 | kbd_previous_mode_bit = | ||
1307 | ffs(kbd_info.modes & ~BIT(KBD_MODE_BIT_OFF)); | ||
1308 | if (kbd_previous_mode_bit != 0) | ||
1309 | kbd_previous_mode_bit--; | ||
1310 | } | ||
1311 | |||
1312 | if (kbd_info.modes & (BIT(KBD_MODE_BIT_ALS) | | ||
1313 | BIT(KBD_MODE_BIT_TRIGGER_ALS))) | ||
1314 | kbd_als_supported = true; | ||
1315 | |||
1316 | if (kbd_info.modes & ( | ||
1317 | BIT(KBD_MODE_BIT_TRIGGER_ALS) | BIT(KBD_MODE_BIT_TRIGGER) | | ||
1318 | BIT(KBD_MODE_BIT_TRIGGER_25) | BIT(KBD_MODE_BIT_TRIGGER_50) | | ||
1319 | BIT(KBD_MODE_BIT_TRIGGER_75) | BIT(KBD_MODE_BIT_TRIGGER_100) | ||
1320 | )) | ||
1321 | kbd_triggers_supported = true; | ||
1322 | |||
1323 | /* kbd_mode_levels[0] is reserved, see below */ | ||
1324 | for (i = 0; i < 16; ++i) | ||
1325 | if (kbd_is_level_mode_bit(i) && (BIT(i) & kbd_info.modes)) | ||
1326 | kbd_mode_levels[1 + kbd_mode_levels_count++] = i; | ||
1327 | |||
1328 | /* | ||
1329 | * Find the first supported mode and assign to kbd_mode_levels[0]. | ||
1330 | * This should be 0 (off), but we cannot depend on the BIOS to | ||
1331 | * support 0. | ||
1332 | */ | ||
1333 | if (kbd_mode_levels_count > 0) { | ||
1334 | for (i = 0; i < 16; ++i) { | ||
1335 | if (BIT(i) & kbd_info.modes) { | ||
1336 | kbd_mode_levels[0] = i; | ||
1337 | break; | ||
1338 | } | ||
1339 | } | ||
1340 | kbd_mode_levels_count++; | ||
1341 | } | ||
1342 | |||
1343 | return 0; | ||
1344 | |||
1345 | } | ||
1346 | |||
1347 | static inline void kbd_init_tokens(void) | ||
1348 | { | ||
1349 | int i; | ||
1350 | |||
1351 | for (i = 0; i < ARRAY_SIZE(kbd_tokens); ++i) | ||
1352 | if (find_token_id(kbd_tokens[i]) != -1) | ||
1353 | kbd_token_bits |= BIT(i); | ||
1354 | } | ||
1355 | |||
1356 | static void kbd_init(void) | ||
1357 | { | ||
1358 | int ret; | ||
1359 | |||
1360 | ret = kbd_init_info(); | ||
1361 | kbd_init_tokens(); | ||
1362 | |||
1363 | if (kbd_token_bits != 0 || ret == 0) | ||
1364 | kbd_led_present = true; | ||
1365 | } | ||
1366 | |||
1367 | static ssize_t kbd_led_timeout_store(struct device *dev, | ||
1368 | struct device_attribute *attr, | ||
1369 | const char *buf, size_t count) | ||
1370 | { | ||
1371 | struct kbd_state new_state; | ||
1372 | struct kbd_state state; | ||
1373 | bool convert; | ||
1374 | int value; | ||
1375 | int ret; | ||
1376 | char ch; | ||
1377 | u8 unit; | ||
1378 | int i; | ||
1379 | |||
1380 | ret = sscanf(buf, "%d %c", &value, &ch); | ||
1381 | if (ret < 1) | ||
1382 | return -EINVAL; | ||
1383 | else if (ret == 1) | ||
1384 | ch = 's'; | ||
1385 | |||
1386 | if (value < 0) | ||
1387 | return -EINVAL; | ||
1388 | |||
1389 | convert = false; | ||
1390 | |||
1391 | switch (ch) { | ||
1392 | case 's': | ||
1393 | if (value > kbd_info.seconds) | ||
1394 | convert = true; | ||
1395 | unit = KBD_TIMEOUT_SECONDS; | ||
1396 | break; | ||
1397 | case 'm': | ||
1398 | if (value > kbd_info.minutes) | ||
1399 | convert = true; | ||
1400 | unit = KBD_TIMEOUT_MINUTES; | ||
1401 | break; | ||
1402 | case 'h': | ||
1403 | if (value > kbd_info.hours) | ||
1404 | convert = true; | ||
1405 | unit = KBD_TIMEOUT_HOURS; | ||
1406 | break; | ||
1407 | case 'd': | ||
1408 | if (value > kbd_info.days) | ||
1409 | convert = true; | ||
1410 | unit = KBD_TIMEOUT_DAYS; | ||
1411 | break; | ||
1412 | default: | ||
1413 | return -EINVAL; | ||
1414 | } | ||
1415 | |||
1416 | if (quirks && quirks->needs_kbd_timeouts) | ||
1417 | convert = true; | ||
1418 | |||
1419 | if (convert) { | ||
1420 | /* Convert value from current units to seconds */ | ||
1421 | switch (unit) { | ||
1422 | case KBD_TIMEOUT_DAYS: | ||
1423 | value *= 24; | ||
1424 | case KBD_TIMEOUT_HOURS: | ||
1425 | value *= 60; | ||
1426 | case KBD_TIMEOUT_MINUTES: | ||
1427 | value *= 60; | ||
1428 | unit = KBD_TIMEOUT_SECONDS; | ||
1429 | } | ||
1430 | |||
1431 | if (quirks && quirks->needs_kbd_timeouts) { | ||
1432 | for (i = 0; quirks->kbd_timeouts[i] != -1; i++) { | ||
1433 | if (value <= quirks->kbd_timeouts[i]) { | ||
1434 | value = quirks->kbd_timeouts[i]; | ||
1435 | break; | ||
1436 | } | ||
1437 | } | ||
1438 | } | ||
1439 | |||
1440 | if (value <= kbd_info.seconds && kbd_info.seconds) { | ||
1441 | unit = KBD_TIMEOUT_SECONDS; | ||
1442 | } else if (value / 60 <= kbd_info.minutes && kbd_info.minutes) { | ||
1443 | value /= 60; | ||
1444 | unit = KBD_TIMEOUT_MINUTES; | ||
1445 | } else if (value / (60 * 60) <= kbd_info.hours && kbd_info.hours) { | ||
1446 | value /= (60 * 60); | ||
1447 | unit = KBD_TIMEOUT_HOURS; | ||
1448 | } else if (value / (60 * 60 * 24) <= kbd_info.days && kbd_info.days) { | ||
1449 | value /= (60 * 60 * 24); | ||
1450 | unit = KBD_TIMEOUT_DAYS; | ||
1451 | } else { | ||
1452 | return -EINVAL; | ||
1453 | } | ||
1454 | } | ||
1455 | |||
1456 | ret = kbd_get_state(&state); | ||
1457 | if (ret) | ||
1458 | return ret; | ||
1459 | |||
1460 | new_state = state; | ||
1461 | new_state.timeout_value = value; | ||
1462 | new_state.timeout_unit = unit; | ||
1463 | |||
1464 | ret = kbd_set_state_safe(&new_state, &state); | ||
1465 | if (ret) | ||
1466 | return ret; | ||
1467 | |||
1468 | return count; | ||
1469 | } | ||
1470 | |||
1471 | static ssize_t kbd_led_timeout_show(struct device *dev, | ||
1472 | struct device_attribute *attr, char *buf) | ||
1473 | { | ||
1474 | struct kbd_state state; | ||
1475 | int ret; | ||
1476 | int len; | ||
1477 | |||
1478 | ret = kbd_get_state(&state); | ||
1479 | if (ret) | ||
1480 | return ret; | ||
1481 | |||
1482 | len = sprintf(buf, "%d", state.timeout_value); | ||
1483 | |||
1484 | switch (state.timeout_unit) { | ||
1485 | case KBD_TIMEOUT_SECONDS: | ||
1486 | return len + sprintf(buf+len, "s\n"); | ||
1487 | case KBD_TIMEOUT_MINUTES: | ||
1488 | return len + sprintf(buf+len, "m\n"); | ||
1489 | case KBD_TIMEOUT_HOURS: | ||
1490 | return len + sprintf(buf+len, "h\n"); | ||
1491 | case KBD_TIMEOUT_DAYS: | ||
1492 | return len + sprintf(buf+len, "d\n"); | ||
1493 | default: | ||
1494 | return -EINVAL; | ||
1495 | } | ||
1496 | |||
1497 | return len; | ||
1498 | } | ||
1499 | |||
1500 | static DEVICE_ATTR(stop_timeout, S_IRUGO | S_IWUSR, | ||
1501 | kbd_led_timeout_show, kbd_led_timeout_store); | ||
1502 | |||
1503 | static const char * const kbd_led_triggers[] = { | ||
1504 | "keyboard", | ||
1505 | "touchpad", | ||
1506 | /*"trackstick"*/ NULL, /* NOTE: trackstick is just alias for touchpad */ | ||
1507 | "mouse", | ||
1508 | }; | ||
1509 | |||
1510 | static ssize_t kbd_led_triggers_store(struct device *dev, | ||
1511 | struct device_attribute *attr, | ||
1512 | const char *buf, size_t count) | ||
1513 | { | ||
1514 | struct kbd_state new_state; | ||
1515 | struct kbd_state state; | ||
1516 | bool triggers_enabled = false; | ||
1517 | bool als_enabled = false; | ||
1518 | bool disable_als = false; | ||
1519 | bool enable_als = false; | ||
1520 | int trigger_bit = -1; | ||
1521 | char trigger[21]; | ||
1522 | int i, ret; | ||
1523 | |||
1524 | ret = sscanf(buf, "%20s", trigger); | ||
1525 | if (ret != 1) | ||
1526 | return -EINVAL; | ||
1527 | |||
1528 | if (trigger[0] != '+' && trigger[0] != '-') | ||
1529 | return -EINVAL; | ||
1530 | |||
1531 | ret = kbd_get_state(&state); | ||
1532 | if (ret) | ||
1533 | return ret; | ||
1534 | |||
1535 | if (kbd_als_supported) | ||
1536 | als_enabled = kbd_is_als_mode_bit(state.mode_bit); | ||
1537 | |||
1538 | if (kbd_triggers_supported) | ||
1539 | triggers_enabled = kbd_is_trigger_mode_bit(state.mode_bit); | ||
1540 | |||
1541 | if (kbd_als_supported) { | ||
1542 | if (strcmp(trigger, "+als") == 0) { | ||
1543 | if (als_enabled) | ||
1544 | return count; | ||
1545 | enable_als = true; | ||
1546 | } else if (strcmp(trigger, "-als") == 0) { | ||
1547 | if (!als_enabled) | ||
1548 | return count; | ||
1549 | disable_als = true; | ||
1550 | } | ||
1551 | } | ||
1552 | |||
1553 | if (enable_als || disable_als) { | ||
1554 | new_state = state; | ||
1555 | if (enable_als) { | ||
1556 | if (triggers_enabled) | ||
1557 | new_state.mode_bit = KBD_MODE_BIT_TRIGGER_ALS; | ||
1558 | else | ||
1559 | new_state.mode_bit = KBD_MODE_BIT_ALS; | ||
1560 | } else { | ||
1561 | if (triggers_enabled) { | ||
1562 | new_state.mode_bit = KBD_MODE_BIT_TRIGGER; | ||
1563 | kbd_set_level(&new_state, kbd_previous_level); | ||
1564 | } else { | ||
1565 | new_state.mode_bit = KBD_MODE_BIT_ON; | ||
1566 | } | ||
1567 | } | ||
1568 | if (!(kbd_info.modes & BIT(new_state.mode_bit))) | ||
1569 | return -EINVAL; | ||
1570 | ret = kbd_set_state_safe(&new_state, &state); | ||
1571 | if (ret) | ||
1572 | return ret; | ||
1573 | kbd_previous_mode_bit = new_state.mode_bit; | ||
1574 | return count; | ||
1575 | } | ||
1576 | |||
1577 | if (kbd_triggers_supported) { | ||
1578 | for (i = 0; i < ARRAY_SIZE(kbd_led_triggers); ++i) { | ||
1579 | if (!(kbd_info.triggers & BIT(i))) | ||
1580 | continue; | ||
1581 | if (!kbd_led_triggers[i]) | ||
1582 | continue; | ||
1583 | if (strcmp(trigger+1, kbd_led_triggers[i]) != 0) | ||
1584 | continue; | ||
1585 | if (trigger[0] == '+' && | ||
1586 | triggers_enabled && (state.triggers & BIT(i))) | ||
1587 | return count; | ||
1588 | if (trigger[0] == '-' && | ||
1589 | (!triggers_enabled || !(state.triggers & BIT(i)))) | ||
1590 | return count; | ||
1591 | trigger_bit = i; | ||
1592 | break; | ||
1593 | } | ||
1594 | } | ||
1595 | |||
1596 | if (trigger_bit != -1) { | ||
1597 | new_state = state; | ||
1598 | if (trigger[0] == '+') | ||
1599 | new_state.triggers |= BIT(trigger_bit); | ||
1600 | else { | ||
1601 | new_state.triggers &= ~BIT(trigger_bit); | ||
1602 | /* NOTE: trackstick bit (2) must be disabled when | ||
1603 | * disabling touchpad bit (1), otherwise touchpad | ||
1604 | * bit (1) will not be disabled */ | ||
1605 | if (trigger_bit == 1) | ||
1606 | new_state.triggers &= ~BIT(2); | ||
1607 | } | ||
1608 | if ((kbd_info.triggers & new_state.triggers) != | ||
1609 | new_state.triggers) | ||
1610 | return -EINVAL; | ||
1611 | if (new_state.triggers && !triggers_enabled) { | ||
1612 | if (als_enabled) | ||
1613 | new_state.mode_bit = KBD_MODE_BIT_TRIGGER_ALS; | ||
1614 | else { | ||
1615 | new_state.mode_bit = KBD_MODE_BIT_TRIGGER; | ||
1616 | kbd_set_level(&new_state, kbd_previous_level); | ||
1617 | } | ||
1618 | } else if (new_state.triggers == 0) { | ||
1619 | if (als_enabled) | ||
1620 | new_state.mode_bit = KBD_MODE_BIT_ALS; | ||
1621 | else | ||
1622 | kbd_set_level(&new_state, 0); | ||
1623 | } | ||
1624 | if (!(kbd_info.modes & BIT(new_state.mode_bit))) | ||
1625 | return -EINVAL; | ||
1626 | ret = kbd_set_state_safe(&new_state, &state); | ||
1627 | if (ret) | ||
1628 | return ret; | ||
1629 | if (new_state.mode_bit != KBD_MODE_BIT_OFF) | ||
1630 | kbd_previous_mode_bit = new_state.mode_bit; | ||
1631 | return count; | ||
1632 | } | ||
1633 | |||
1634 | return -EINVAL; | ||
1635 | } | ||
1636 | |||
1637 | static ssize_t kbd_led_triggers_show(struct device *dev, | ||
1638 | struct device_attribute *attr, char *buf) | ||
1639 | { | ||
1640 | struct kbd_state state; | ||
1641 | bool triggers_enabled; | ||
1642 | int level, i, ret; | ||
1643 | int len = 0; | ||
1644 | |||
1645 | ret = kbd_get_state(&state); | ||
1646 | if (ret) | ||
1647 | return ret; | ||
1648 | |||
1649 | len = 0; | ||
1650 | |||
1651 | if (kbd_triggers_supported) { | ||
1652 | triggers_enabled = kbd_is_trigger_mode_bit(state.mode_bit); | ||
1653 | level = kbd_get_level(&state); | ||
1654 | for (i = 0; i < ARRAY_SIZE(kbd_led_triggers); ++i) { | ||
1655 | if (!(kbd_info.triggers & BIT(i))) | ||
1656 | continue; | ||
1657 | if (!kbd_led_triggers[i]) | ||
1658 | continue; | ||
1659 | if ((triggers_enabled || level <= 0) && | ||
1660 | (state.triggers & BIT(i))) | ||
1661 | buf[len++] = '+'; | ||
1662 | else | ||
1663 | buf[len++] = '-'; | ||
1664 | len += sprintf(buf+len, "%s ", kbd_led_triggers[i]); | ||
1665 | } | ||
1666 | } | ||
1667 | |||
1668 | if (kbd_als_supported) { | ||
1669 | if (kbd_is_als_mode_bit(state.mode_bit)) | ||
1670 | len += sprintf(buf+len, "+als "); | ||
1671 | else | ||
1672 | len += sprintf(buf+len, "-als "); | ||
1673 | } | ||
1674 | |||
1675 | if (len) | ||
1676 | buf[len - 1] = '\n'; | ||
1677 | |||
1678 | return len; | ||
1679 | } | ||
1680 | |||
1681 | static DEVICE_ATTR(start_triggers, S_IRUGO | S_IWUSR, | ||
1682 | kbd_led_triggers_show, kbd_led_triggers_store); | ||
1683 | |||
1684 | static ssize_t kbd_led_als_store(struct device *dev, | ||
1685 | struct device_attribute *attr, | ||
1686 | const char *buf, size_t count) | ||
1687 | { | ||
1688 | struct kbd_state state; | ||
1689 | struct kbd_state new_state; | ||
1690 | u8 setting; | ||
1691 | int ret; | ||
1692 | |||
1693 | ret = kstrtou8(buf, 10, &setting); | ||
1694 | if (ret) | ||
1695 | return ret; | ||
1696 | |||
1697 | ret = kbd_get_state(&state); | ||
1698 | if (ret) | ||
1699 | return ret; | ||
1700 | |||
1701 | new_state = state; | ||
1702 | new_state.als_setting = setting; | ||
1703 | |||
1704 | ret = kbd_set_state_safe(&new_state, &state); | ||
1705 | if (ret) | ||
1706 | return ret; | ||
1707 | |||
1708 | return count; | ||
1709 | } | ||
1710 | |||
1711 | static ssize_t kbd_led_als_show(struct device *dev, | ||
1712 | struct device_attribute *attr, char *buf) | ||
1713 | { | ||
1714 | struct kbd_state state; | ||
1715 | int ret; | ||
1716 | |||
1717 | ret = kbd_get_state(&state); | ||
1718 | if (ret) | ||
1719 | return ret; | ||
1720 | |||
1721 | return sprintf(buf, "%d\n", state.als_setting); | ||
1722 | } | ||
1723 | |||
1724 | static DEVICE_ATTR(als_setting, S_IRUGO | S_IWUSR, | ||
1725 | kbd_led_als_show, kbd_led_als_store); | ||
1726 | |||
1727 | static struct attribute *kbd_led_attrs[] = { | ||
1728 | &dev_attr_stop_timeout.attr, | ||
1729 | &dev_attr_start_triggers.attr, | ||
1730 | &dev_attr_als_setting.attr, | ||
1731 | NULL, | ||
1732 | }; | ||
1733 | ATTRIBUTE_GROUPS(kbd_led); | ||
1734 | |||
1735 | static enum led_brightness kbd_led_level_get(struct led_classdev *led_cdev) | ||
1736 | { | ||
1737 | int ret; | ||
1738 | u16 num; | ||
1739 | struct kbd_state state; | ||
1740 | |||
1741 | if (kbd_get_max_level()) { | ||
1742 | ret = kbd_get_state(&state); | ||
1743 | if (ret) | ||
1744 | return 0; | ||
1745 | ret = kbd_get_level(&state); | ||
1746 | if (ret < 0) | ||
1747 | return 0; | ||
1748 | return ret; | ||
1749 | } | ||
1750 | |||
1751 | if (kbd_get_valid_token_counts()) { | ||
1752 | ret = kbd_get_first_active_token_bit(); | ||
1753 | if (ret < 0) | ||
1754 | return 0; | ||
1755 | for (num = kbd_token_bits; num != 0 && ret > 0; --ret) | ||
1756 | num &= num - 1; /* clear the first bit set */ | ||
1757 | if (num == 0) | ||
1758 | return 0; | ||
1759 | return ffs(num) - 1; | ||
1760 | } | ||
1761 | |||
1762 | pr_warn("Keyboard brightness level control not supported\n"); | ||
1763 | return 0; | ||
1764 | } | ||
1765 | |||
1766 | static void kbd_led_level_set(struct led_classdev *led_cdev, | ||
1767 | enum led_brightness value) | ||
1768 | { | ||
1769 | struct kbd_state state; | ||
1770 | struct kbd_state new_state; | ||
1771 | u16 num; | ||
1772 | |||
1773 | if (kbd_get_max_level()) { | ||
1774 | if (kbd_get_state(&state)) | ||
1775 | return; | ||
1776 | new_state = state; | ||
1777 | if (kbd_set_level(&new_state, value)) | ||
1778 | return; | ||
1779 | kbd_set_state_safe(&new_state, &state); | ||
1780 | return; | ||
1781 | } | ||
1782 | |||
1783 | if (kbd_get_valid_token_counts()) { | ||
1784 | for (num = kbd_token_bits; num != 0 && value > 0; --value) | ||
1785 | num &= num - 1; /* clear the first bit set */ | ||
1786 | if (num == 0) | ||
1787 | return; | ||
1788 | kbd_set_token_bit(ffs(num) - 1); | ||
1789 | return; | ||
1790 | } | ||
1791 | |||
1792 | pr_warn("Keyboard brightness level control not supported\n"); | ||
1793 | } | ||
1794 | |||
1795 | static struct led_classdev kbd_led = { | ||
1796 | .name = "dell::kbd_backlight", | ||
1797 | .brightness_set = kbd_led_level_set, | ||
1798 | .brightness_get = kbd_led_level_get, | ||
1799 | .groups = kbd_led_groups, | ||
1800 | }; | ||
1801 | |||
1802 | static int __init kbd_led_init(struct device *dev) | ||
1803 | { | ||
1804 | kbd_init(); | ||
1805 | if (!kbd_led_present) | ||
1806 | return -ENODEV; | ||
1807 | kbd_led.max_brightness = kbd_get_max_level(); | ||
1808 | if (!kbd_led.max_brightness) { | ||
1809 | kbd_led.max_brightness = kbd_get_valid_token_counts(); | ||
1810 | if (kbd_led.max_brightness) | ||
1811 | kbd_led.max_brightness--; | ||
1812 | } | ||
1813 | return led_classdev_register(dev, &kbd_led); | ||
1814 | } | ||
1815 | |||
1816 | static void brightness_set_exit(struct led_classdev *led_cdev, | ||
1817 | enum led_brightness value) | ||
1818 | { | ||
1819 | /* Don't change backlight level on exit */ | ||
1820 | }; | ||
1821 | |||
1822 | static void kbd_led_exit(void) | ||
1823 | { | ||
1824 | if (!kbd_led_present) | ||
1825 | return; | ||
1826 | kbd_led.brightness_set = brightness_set_exit; | ||
1827 | led_classdev_unregister(&kbd_led); | ||
1828 | } | ||
1829 | |||
1830 | static int __init dell_init(void) | 792 | static int __init dell_init(void) |
1831 | { | 793 | { |
1832 | int max_intensity = 0; | 794 | int max_intensity = 0; |
@@ -1879,8 +841,6 @@ static int __init dell_init(void) | |||
1879 | if (quirks && quirks->touchpad_led) | 841 | if (quirks && quirks->touchpad_led) |
1880 | touchpad_led_init(&platform_device->dev); | 842 | touchpad_led_init(&platform_device->dev); |
1881 | 843 | ||
1882 | kbd_led_init(&platform_device->dev); | ||
1883 | |||
1884 | dell_laptop_dir = debugfs_create_dir("dell_laptop", NULL); | 844 | dell_laptop_dir = debugfs_create_dir("dell_laptop", NULL); |
1885 | if (dell_laptop_dir != NULL) | 845 | if (dell_laptop_dir != NULL) |
1886 | debugfs_create_file("rfkill", 0444, dell_laptop_dir, NULL, | 846 | debugfs_create_file("rfkill", 0444, dell_laptop_dir, NULL, |
@@ -1948,7 +908,6 @@ static void __exit dell_exit(void) | |||
1948 | debugfs_remove_recursive(dell_laptop_dir); | 908 | debugfs_remove_recursive(dell_laptop_dir); |
1949 | if (quirks && quirks->touchpad_led) | 909 | if (quirks && quirks->touchpad_led) |
1950 | touchpad_led_exit(); | 910 | touchpad_led_exit(); |
1951 | kbd_led_exit(); | ||
1952 | i8042_remove_filter(dell_laptop_i8042_filter); | 911 | i8042_remove_filter(dell_laptop_i8042_filter); |
1953 | cancel_delayed_work_sync(&dell_rfkill_work); | 912 | cancel_delayed_work_sync(&dell_rfkill_work); |
1954 | backlight_device_unregister(dell_backlight_device); | 913 | backlight_device_unregister(dell_backlight_device); |
@@ -1965,7 +924,5 @@ module_init(dell_init); | |||
1965 | module_exit(dell_exit); | 924 | module_exit(dell_exit); |
1966 | 925 | ||
1967 | MODULE_AUTHOR("Matthew Garrett <mjg@redhat.com>"); | 926 | MODULE_AUTHOR("Matthew Garrett <mjg@redhat.com>"); |
1968 | MODULE_AUTHOR("Gabriele Mazzotta <gabriele.mzt@gmail.com>"); | ||
1969 | MODULE_AUTHOR("Pali Rohár <pali.rohar@gmail.com>"); | ||
1970 | MODULE_DESCRIPTION("Dell laptop driver"); | 927 | MODULE_DESCRIPTION("Dell laptop driver"); |
1971 | MODULE_LICENSE("GPL"); | 928 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c index df4e27cd996a..9219953ee949 100644 --- a/drivers/scsi/ipr.c +++ b/drivers/scsi/ipr.c | |||
@@ -683,6 +683,7 @@ static void ipr_init_ipr_cmnd(struct ipr_cmnd *ipr_cmd, | |||
683 | ipr_reinit_ipr_cmnd(ipr_cmd); | 683 | ipr_reinit_ipr_cmnd(ipr_cmd); |
684 | ipr_cmd->u.scratch = 0; | 684 | ipr_cmd->u.scratch = 0; |
685 | ipr_cmd->sibling = NULL; | 685 | ipr_cmd->sibling = NULL; |
686 | ipr_cmd->eh_comp = NULL; | ||
686 | ipr_cmd->fast_done = fast_done; | 687 | ipr_cmd->fast_done = fast_done; |
687 | init_timer(&ipr_cmd->timer); | 688 | init_timer(&ipr_cmd->timer); |
688 | } | 689 | } |
@@ -848,6 +849,8 @@ static void ipr_scsi_eh_done(struct ipr_cmnd *ipr_cmd) | |||
848 | 849 | ||
849 | scsi_dma_unmap(ipr_cmd->scsi_cmd); | 850 | scsi_dma_unmap(ipr_cmd->scsi_cmd); |
850 | scsi_cmd->scsi_done(scsi_cmd); | 851 | scsi_cmd->scsi_done(scsi_cmd); |
852 | if (ipr_cmd->eh_comp) | ||
853 | complete(ipr_cmd->eh_comp); | ||
851 | list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q); | 854 | list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q); |
852 | } | 855 | } |
853 | 856 | ||
@@ -4811,6 +4814,84 @@ static int ipr_slave_alloc(struct scsi_device *sdev) | |||
4811 | return rc; | 4814 | return rc; |
4812 | } | 4815 | } |
4813 | 4816 | ||
4817 | /** | ||
4818 | * ipr_match_lun - Match function for specified LUN | ||
4819 | * @ipr_cmd: ipr command struct | ||
4820 | * @device: device to match (sdev) | ||
4821 | * | ||
4822 | * Returns: | ||
4823 | * 1 if command matches sdev / 0 if command does not match sdev | ||
4824 | **/ | ||
4825 | static int ipr_match_lun(struct ipr_cmnd *ipr_cmd, void *device) | ||
4826 | { | ||
4827 | if (ipr_cmd->scsi_cmd && ipr_cmd->scsi_cmd->device == device) | ||
4828 | return 1; | ||
4829 | return 0; | ||
4830 | } | ||
4831 | |||
4832 | /** | ||
4833 | * ipr_wait_for_ops - Wait for matching commands to complete | ||
4834 | * @ipr_cmd: ipr command struct | ||
4835 | * @device: device to match (sdev) | ||
4836 | * @match: match function to use | ||
4837 | * | ||
4838 | * Returns: | ||
4839 | * SUCCESS / FAILED | ||
4840 | **/ | ||
4841 | static int ipr_wait_for_ops(struct ipr_ioa_cfg *ioa_cfg, void *device, | ||
4842 | int (*match)(struct ipr_cmnd *, void *)) | ||
4843 | { | ||
4844 | struct ipr_cmnd *ipr_cmd; | ||
4845 | int wait; | ||
4846 | unsigned long flags; | ||
4847 | struct ipr_hrr_queue *hrrq; | ||
4848 | signed long timeout = IPR_ABORT_TASK_TIMEOUT; | ||
4849 | DECLARE_COMPLETION_ONSTACK(comp); | ||
4850 | |||
4851 | ENTER; | ||
4852 | do { | ||
4853 | wait = 0; | ||
4854 | |||
4855 | for_each_hrrq(hrrq, ioa_cfg) { | ||
4856 | spin_lock_irqsave(hrrq->lock, flags); | ||
4857 | list_for_each_entry(ipr_cmd, &hrrq->hrrq_pending_q, queue) { | ||
4858 | if (match(ipr_cmd, device)) { | ||
4859 | ipr_cmd->eh_comp = ∁ | ||
4860 | wait++; | ||
4861 | } | ||
4862 | } | ||
4863 | spin_unlock_irqrestore(hrrq->lock, flags); | ||
4864 | } | ||
4865 | |||
4866 | if (wait) { | ||
4867 | timeout = wait_for_completion_timeout(&comp, timeout); | ||
4868 | |||
4869 | if (!timeout) { | ||
4870 | wait = 0; | ||
4871 | |||
4872 | for_each_hrrq(hrrq, ioa_cfg) { | ||
4873 | spin_lock_irqsave(hrrq->lock, flags); | ||
4874 | list_for_each_entry(ipr_cmd, &hrrq->hrrq_pending_q, queue) { | ||
4875 | if (match(ipr_cmd, device)) { | ||
4876 | ipr_cmd->eh_comp = NULL; | ||
4877 | wait++; | ||
4878 | } | ||
4879 | } | ||
4880 | spin_unlock_irqrestore(hrrq->lock, flags); | ||
4881 | } | ||
4882 | |||
4883 | if (wait) | ||
4884 | dev_err(&ioa_cfg->pdev->dev, "Timed out waiting for aborted commands\n"); | ||
4885 | LEAVE; | ||
4886 | return wait ? FAILED : SUCCESS; | ||
4887 | } | ||
4888 | } | ||
4889 | } while (wait); | ||
4890 | |||
4891 | LEAVE; | ||
4892 | return SUCCESS; | ||
4893 | } | ||
4894 | |||
4814 | static int ipr_eh_host_reset(struct scsi_cmnd *cmd) | 4895 | static int ipr_eh_host_reset(struct scsi_cmnd *cmd) |
4815 | { | 4896 | { |
4816 | struct ipr_ioa_cfg *ioa_cfg; | 4897 | struct ipr_ioa_cfg *ioa_cfg; |
@@ -5030,11 +5111,17 @@ static int __ipr_eh_dev_reset(struct scsi_cmnd *scsi_cmd) | |||
5030 | static int ipr_eh_dev_reset(struct scsi_cmnd *cmd) | 5111 | static int ipr_eh_dev_reset(struct scsi_cmnd *cmd) |
5031 | { | 5112 | { |
5032 | int rc; | 5113 | int rc; |
5114 | struct ipr_ioa_cfg *ioa_cfg; | ||
5115 | |||
5116 | ioa_cfg = (struct ipr_ioa_cfg *) cmd->device->host->hostdata; | ||
5033 | 5117 | ||
5034 | spin_lock_irq(cmd->device->host->host_lock); | 5118 | spin_lock_irq(cmd->device->host->host_lock); |
5035 | rc = __ipr_eh_dev_reset(cmd); | 5119 | rc = __ipr_eh_dev_reset(cmd); |
5036 | spin_unlock_irq(cmd->device->host->host_lock); | 5120 | spin_unlock_irq(cmd->device->host->host_lock); |
5037 | 5121 | ||
5122 | if (rc == SUCCESS) | ||
5123 | rc = ipr_wait_for_ops(ioa_cfg, cmd->device, ipr_match_lun); | ||
5124 | |||
5038 | return rc; | 5125 | return rc; |
5039 | } | 5126 | } |
5040 | 5127 | ||
@@ -5234,13 +5321,18 @@ static int ipr_eh_abort(struct scsi_cmnd *scsi_cmd) | |||
5234 | { | 5321 | { |
5235 | unsigned long flags; | 5322 | unsigned long flags; |
5236 | int rc; | 5323 | int rc; |
5324 | struct ipr_ioa_cfg *ioa_cfg; | ||
5237 | 5325 | ||
5238 | ENTER; | 5326 | ENTER; |
5239 | 5327 | ||
5328 | ioa_cfg = (struct ipr_ioa_cfg *) scsi_cmd->device->host->hostdata; | ||
5329 | |||
5240 | spin_lock_irqsave(scsi_cmd->device->host->host_lock, flags); | 5330 | spin_lock_irqsave(scsi_cmd->device->host->host_lock, flags); |
5241 | rc = ipr_cancel_op(scsi_cmd); | 5331 | rc = ipr_cancel_op(scsi_cmd); |
5242 | spin_unlock_irqrestore(scsi_cmd->device->host->host_lock, flags); | 5332 | spin_unlock_irqrestore(scsi_cmd->device->host->host_lock, flags); |
5243 | 5333 | ||
5334 | if (rc == SUCCESS) | ||
5335 | rc = ipr_wait_for_ops(ioa_cfg, scsi_cmd->device, ipr_match_lun); | ||
5244 | LEAVE; | 5336 | LEAVE; |
5245 | return rc; | 5337 | return rc; |
5246 | } | 5338 | } |
diff --git a/drivers/scsi/ipr.h b/drivers/scsi/ipr.h index b4f3eec51bc9..ec03b42fa2b9 100644 --- a/drivers/scsi/ipr.h +++ b/drivers/scsi/ipr.h | |||
@@ -1606,6 +1606,7 @@ struct ipr_cmnd { | |||
1606 | struct scsi_device *sdev; | 1606 | struct scsi_device *sdev; |
1607 | } u; | 1607 | } u; |
1608 | 1608 | ||
1609 | struct completion *eh_comp; | ||
1609 | struct ipr_hrr_queue *hrrq; | 1610 | struct ipr_hrr_queue *hrrq; |
1610 | struct ipr_ioa_cfg *ioa_cfg; | 1611 | struct ipr_ioa_cfg *ioa_cfg; |
1611 | }; | 1612 | }; |
diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c index 7b8b51bc29b4..4aca1b0378c2 100644 --- a/drivers/scsi/scsi_debug.c +++ b/drivers/scsi/scsi_debug.c | |||
@@ -1623,7 +1623,7 @@ resp_rsup_opcodes(struct scsi_cmnd *scp, struct sdebug_dev_info *devip) | |||
1623 | req_opcode = cmd[3]; | 1623 | req_opcode = cmd[3]; |
1624 | req_sa = get_unaligned_be16(cmd + 4); | 1624 | req_sa = get_unaligned_be16(cmd + 4); |
1625 | alloc_len = get_unaligned_be32(cmd + 6); | 1625 | alloc_len = get_unaligned_be32(cmd + 6); |
1626 | if (alloc_len < 4 && alloc_len > 0xffff) { | 1626 | if (alloc_len < 4 || alloc_len > 0xffff) { |
1627 | mk_sense_invalid_fld(scp, SDEB_IN_CDB, 6, -1); | 1627 | mk_sense_invalid_fld(scp, SDEB_IN_CDB, 6, -1); |
1628 | return check_condition_result; | 1628 | return check_condition_result; |
1629 | } | 1629 | } |
@@ -1631,7 +1631,7 @@ resp_rsup_opcodes(struct scsi_cmnd *scp, struct sdebug_dev_info *devip) | |||
1631 | a_len = 8192; | 1631 | a_len = 8192; |
1632 | else | 1632 | else |
1633 | a_len = alloc_len; | 1633 | a_len = alloc_len; |
1634 | arr = kzalloc((a_len < 256) ? 320 : a_len + 64, GFP_KERNEL); | 1634 | arr = kzalloc((a_len < 256) ? 320 : a_len + 64, GFP_ATOMIC); |
1635 | if (NULL == arr) { | 1635 | if (NULL == arr) { |
1636 | mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC, | 1636 | mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC, |
1637 | INSUFF_RES_ASCQ); | 1637 | INSUFF_RES_ASCQ); |
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 6d5c0b8cb0bb..17bb541f7cc2 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c | |||
@@ -1143,7 +1143,17 @@ int scsi_init_io(struct scsi_cmnd *cmd) | |||
1143 | struct scsi_data_buffer *prot_sdb = cmd->prot_sdb; | 1143 | struct scsi_data_buffer *prot_sdb = cmd->prot_sdb; |
1144 | int ivecs, count; | 1144 | int ivecs, count; |
1145 | 1145 | ||
1146 | BUG_ON(prot_sdb == NULL); | 1146 | if (prot_sdb == NULL) { |
1147 | /* | ||
1148 | * This can happen if someone (e.g. multipath) | ||
1149 | * queues a command to a device on an adapter | ||
1150 | * that does not support DIX. | ||
1151 | */ | ||
1152 | WARN_ON_ONCE(1); | ||
1153 | error = BLKPREP_KILL; | ||
1154 | goto err_exit; | ||
1155 | } | ||
1156 | |||
1147 | ivecs = blk_rq_count_integrity_sg(rq->q, rq->bio); | 1157 | ivecs = blk_rq_count_integrity_sg(rq->q, rq->bio); |
1148 | 1158 | ||
1149 | if (scsi_alloc_sgtable(prot_sdb, ivecs, is_mq)) { | 1159 | if (scsi_alloc_sgtable(prot_sdb, ivecs, is_mq)) { |
diff --git a/drivers/staging/media/tlg2300/Kconfig b/drivers/staging/media/tlg2300/Kconfig index 81784c6f7b88..77d8753f6ba4 100644 --- a/drivers/staging/media/tlg2300/Kconfig +++ b/drivers/staging/media/tlg2300/Kconfig | |||
@@ -1,6 +1,7 @@ | |||
1 | config VIDEO_TLG2300 | 1 | config VIDEO_TLG2300 |
2 | tristate "Telegent TLG2300 USB video capture support (Deprecated)" | 2 | tristate "Telegent TLG2300 USB video capture support (Deprecated)" |
3 | depends on VIDEO_DEV && I2C && SND && DVB_CORE | 3 | depends on VIDEO_DEV && I2C && SND && DVB_CORE |
4 | depends on MEDIA_USB_SUPPORT | ||
4 | select VIDEO_TUNER | 5 | select VIDEO_TUNER |
5 | select VIDEO_TVEEPROM | 6 | select VIDEO_TVEEPROM |
6 | depends on RC_CORE | 7 | depends on RC_CORE |
diff --git a/drivers/watchdog/cadence_wdt.c b/drivers/watchdog/cadence_wdt.c index 5927c0a98a74..bcfd2a22208f 100644 --- a/drivers/watchdog/cadence_wdt.c +++ b/drivers/watchdog/cadence_wdt.c | |||
@@ -503,7 +503,6 @@ static struct platform_driver cdns_wdt_driver = { | |||
503 | .shutdown = cdns_wdt_shutdown, | 503 | .shutdown = cdns_wdt_shutdown, |
504 | .driver = { | 504 | .driver = { |
505 | .name = "cdns-wdt", | 505 | .name = "cdns-wdt", |
506 | .owner = THIS_MODULE, | ||
507 | .of_match_table = cdns_wdt_of_match, | 506 | .of_match_table = cdns_wdt_of_match, |
508 | .pm = &cdns_wdt_pm_ops, | 507 | .pm = &cdns_wdt_pm_ops, |
509 | }, | 508 | }, |
diff --git a/drivers/watchdog/imx2_wdt.c b/drivers/watchdog/imx2_wdt.c index d6add516a7a7..5142bbabe027 100644 --- a/drivers/watchdog/imx2_wdt.c +++ b/drivers/watchdog/imx2_wdt.c | |||
@@ -52,6 +52,8 @@ | |||
52 | #define IMX2_WDT_WRSR 0x04 /* Reset Status Register */ | 52 | #define IMX2_WDT_WRSR 0x04 /* Reset Status Register */ |
53 | #define IMX2_WDT_WRSR_TOUT (1 << 1) /* -> Reset due to Timeout */ | 53 | #define IMX2_WDT_WRSR_TOUT (1 << 1) /* -> Reset due to Timeout */ |
54 | 54 | ||
55 | #define IMX2_WDT_WMCR 0x08 /* Misc Register */ | ||
56 | |||
55 | #define IMX2_WDT_MAX_TIME 128 | 57 | #define IMX2_WDT_MAX_TIME 128 |
56 | #define IMX2_WDT_DEFAULT_TIME 60 /* in seconds */ | 58 | #define IMX2_WDT_DEFAULT_TIME 60 /* in seconds */ |
57 | 59 | ||
@@ -274,6 +276,13 @@ static int __init imx2_wdt_probe(struct platform_device *pdev) | |||
274 | 276 | ||
275 | imx2_wdt_ping_if_active(wdog); | 277 | imx2_wdt_ping_if_active(wdog); |
276 | 278 | ||
279 | /* | ||
280 | * Disable the watchdog power down counter at boot. Otherwise the power | ||
281 | * down counter will pull down the #WDOG interrupt line for one clock | ||
282 | * cycle. | ||
283 | */ | ||
284 | regmap_write(wdev->regmap, IMX2_WDT_WMCR, 0); | ||
285 | |||
277 | ret = watchdog_register_device(wdog); | 286 | ret = watchdog_register_device(wdog); |
278 | if (ret) { | 287 | if (ret) { |
279 | dev_err(&pdev->dev, "cannot register watchdog device\n"); | 288 | dev_err(&pdev->dev, "cannot register watchdog device\n"); |
@@ -327,18 +336,21 @@ static void imx2_wdt_shutdown(struct platform_device *pdev) | |||
327 | } | 336 | } |
328 | 337 | ||
329 | #ifdef CONFIG_PM_SLEEP | 338 | #ifdef CONFIG_PM_SLEEP |
330 | /* Disable watchdog if it is active during suspend */ | 339 | /* Disable watchdog if it is active or non-active but still running */ |
331 | static int imx2_wdt_suspend(struct device *dev) | 340 | static int imx2_wdt_suspend(struct device *dev) |
332 | { | 341 | { |
333 | struct watchdog_device *wdog = dev_get_drvdata(dev); | 342 | struct watchdog_device *wdog = dev_get_drvdata(dev); |
334 | struct imx2_wdt_device *wdev = watchdog_get_drvdata(wdog); | 343 | struct imx2_wdt_device *wdev = watchdog_get_drvdata(wdog); |
335 | 344 | ||
336 | imx2_wdt_set_timeout(wdog, IMX2_WDT_MAX_TIME); | 345 | /* The watchdog IP block is running */ |
337 | imx2_wdt_ping(wdog); | 346 | if (imx2_wdt_is_running(wdev)) { |
347 | imx2_wdt_set_timeout(wdog, IMX2_WDT_MAX_TIME); | ||
348 | imx2_wdt_ping(wdog); | ||
338 | 349 | ||
339 | /* Watchdog has been stopped but IP block is still running */ | 350 | /* The watchdog is not active */ |
340 | if (!watchdog_active(wdog) && imx2_wdt_is_running(wdev)) | 351 | if (!watchdog_active(wdog)) |
341 | del_timer_sync(&wdev->timer); | 352 | del_timer_sync(&wdev->timer); |
353 | } | ||
342 | 354 | ||
343 | clk_disable_unprepare(wdev->clk); | 355 | clk_disable_unprepare(wdev->clk); |
344 | 356 | ||
@@ -354,15 +366,25 @@ static int imx2_wdt_resume(struct device *dev) | |||
354 | clk_prepare_enable(wdev->clk); | 366 | clk_prepare_enable(wdev->clk); |
355 | 367 | ||
356 | if (watchdog_active(wdog) && !imx2_wdt_is_running(wdev)) { | 368 | if (watchdog_active(wdog) && !imx2_wdt_is_running(wdev)) { |
357 | /* Resumes from deep sleep we need restart | 369 | /* |
358 | * the watchdog again. | 370 | * If the watchdog is still active and resumes |
371 | * from deep sleep state, need to restart the | ||
372 | * watchdog again. | ||
359 | */ | 373 | */ |
360 | imx2_wdt_setup(wdog); | 374 | imx2_wdt_setup(wdog); |
361 | imx2_wdt_set_timeout(wdog, wdog->timeout); | 375 | imx2_wdt_set_timeout(wdog, wdog->timeout); |
362 | imx2_wdt_ping(wdog); | 376 | imx2_wdt_ping(wdog); |
363 | } else if (imx2_wdt_is_running(wdev)) { | 377 | } else if (imx2_wdt_is_running(wdev)) { |
378 | /* Resuming from non-deep sleep state. */ | ||
379 | imx2_wdt_set_timeout(wdog, wdog->timeout); | ||
364 | imx2_wdt_ping(wdog); | 380 | imx2_wdt_ping(wdog); |
365 | mod_timer(&wdev->timer, jiffies + wdog->timeout * HZ / 2); | 381 | /* |
382 | * But the watchdog is not active, then start | ||
383 | * the timer again. | ||
384 | */ | ||
385 | if (!watchdog_active(wdog)) | ||
386 | mod_timer(&wdev->timer, | ||
387 | jiffies + wdog->timeout * HZ / 2); | ||
366 | } | 388 | } |
367 | 389 | ||
368 | return 0; | 390 | return 0; |
diff --git a/drivers/watchdog/meson_wdt.c b/drivers/watchdog/meson_wdt.c index ef6a298e8c45..1f4155ee3404 100644 --- a/drivers/watchdog/meson_wdt.c +++ b/drivers/watchdog/meson_wdt.c | |||
@@ -215,7 +215,6 @@ static struct platform_driver meson_wdt_driver = { | |||
215 | .remove = meson_wdt_remove, | 215 | .remove = meson_wdt_remove, |
216 | .shutdown = meson_wdt_shutdown, | 216 | .shutdown = meson_wdt_shutdown, |
217 | .driver = { | 217 | .driver = { |
218 | .owner = THIS_MODULE, | ||
219 | .name = DRV_NAME, | 218 | .name = DRV_NAME, |
220 | .of_match_table = meson_wdt_dt_ids, | 219 | .of_match_table = meson_wdt_dt_ids, |
221 | }, | 220 | }, |
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index 7e607416755a..0b180708bf79 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h | |||
@@ -1171,6 +1171,7 @@ struct btrfs_space_info { | |||
1171 | struct percpu_counter total_bytes_pinned; | 1171 | struct percpu_counter total_bytes_pinned; |
1172 | 1172 | ||
1173 | struct list_head list; | 1173 | struct list_head list; |
1174 | /* Protected by the spinlock 'lock'. */ | ||
1174 | struct list_head ro_bgs; | 1175 | struct list_head ro_bgs; |
1175 | 1176 | ||
1176 | struct rw_semaphore groups_sem; | 1177 | struct rw_semaphore groups_sem; |
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 15116585e714..a684086c3c81 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
@@ -9422,7 +9422,6 @@ int btrfs_remove_block_group(struct btrfs_trans_handle *trans, | |||
9422 | * are still on the list after taking the semaphore | 9422 | * are still on the list after taking the semaphore |
9423 | */ | 9423 | */ |
9424 | list_del_init(&block_group->list); | 9424 | list_del_init(&block_group->list); |
9425 | list_del_init(&block_group->ro_list); | ||
9426 | if (list_empty(&block_group->space_info->block_groups[index])) { | 9425 | if (list_empty(&block_group->space_info->block_groups[index])) { |
9427 | kobj = block_group->space_info->block_group_kobjs[index]; | 9426 | kobj = block_group->space_info->block_group_kobjs[index]; |
9428 | block_group->space_info->block_group_kobjs[index] = NULL; | 9427 | block_group->space_info->block_group_kobjs[index] = NULL; |
@@ -9464,6 +9463,7 @@ int btrfs_remove_block_group(struct btrfs_trans_handle *trans, | |||
9464 | btrfs_remove_free_space_cache(block_group); | 9463 | btrfs_remove_free_space_cache(block_group); |
9465 | 9464 | ||
9466 | spin_lock(&block_group->space_info->lock); | 9465 | spin_lock(&block_group->space_info->lock); |
9466 | list_del_init(&block_group->ro_list); | ||
9467 | block_group->space_info->total_bytes -= block_group->key.offset; | 9467 | block_group->space_info->total_bytes -= block_group->key.offset; |
9468 | block_group->space_info->bytes_readonly -= block_group->key.offset; | 9468 | block_group->space_info->bytes_readonly -= block_group->key.offset; |
9469 | block_group->space_info->disk_total -= block_group->key.offset * factor; | 9469 | block_group->space_info->disk_total -= block_group->key.offset * factor; |
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 4ebabd237153..790dbae3343c 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c | |||
@@ -2190,7 +2190,7 @@ void btrfs_free_io_failure_record(struct inode *inode, u64 start, u64 end) | |||
2190 | 2190 | ||
2191 | next = next_state(state); | 2191 | next = next_state(state); |
2192 | 2192 | ||
2193 | failrec = (struct io_failure_record *)state->private; | 2193 | failrec = (struct io_failure_record *)(unsigned long)state->private; |
2194 | free_extent_state(state); | 2194 | free_extent_state(state); |
2195 | kfree(failrec); | 2195 | kfree(failrec); |
2196 | 2196 | ||
diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index 9e1569ffbf6e..2f0fbc374e87 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c | |||
@@ -3053,7 +3053,7 @@ static noinline_for_stack int scrub_stripe(struct scrub_ctx *sctx, | |||
3053 | 3053 | ||
3054 | ppath = btrfs_alloc_path(); | 3054 | ppath = btrfs_alloc_path(); |
3055 | if (!ppath) { | 3055 | if (!ppath) { |
3056 | btrfs_free_path(ppath); | 3056 | btrfs_free_path(path); |
3057 | return -ENOMEM; | 3057 | return -ENOMEM; |
3058 | } | 3058 | } |
3059 | 3059 | ||
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 60f7cbe815e9..6f49b2872a64 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c | |||
@@ -1000,10 +1000,20 @@ int btrfs_sync_fs(struct super_block *sb, int wait) | |||
1000 | */ | 1000 | */ |
1001 | if (fs_info->pending_changes == 0) | 1001 | if (fs_info->pending_changes == 0) |
1002 | return 0; | 1002 | return 0; |
1003 | /* | ||
1004 | * A non-blocking test if the fs is frozen. We must not | ||
1005 | * start a new transaction here otherwise a deadlock | ||
1006 | * happens. The pending operations are delayed to the | ||
1007 | * next commit after thawing. | ||
1008 | */ | ||
1009 | if (__sb_start_write(sb, SB_FREEZE_WRITE, false)) | ||
1010 | __sb_end_write(sb, SB_FREEZE_WRITE); | ||
1011 | else | ||
1012 | return 0; | ||
1003 | trans = btrfs_start_transaction(root, 0); | 1013 | trans = btrfs_start_transaction(root, 0); |
1004 | } else { | ||
1005 | return PTR_ERR(trans); | ||
1006 | } | 1014 | } |
1015 | if (IS_ERR(trans)) | ||
1016 | return PTR_ERR(trans); | ||
1007 | } | 1017 | } |
1008 | return btrfs_commit_transaction(trans, root); | 1018 | return btrfs_commit_transaction(trans, root); |
1009 | } | 1019 | } |
diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index a605d4e2f2bc..e88b59d13439 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c | |||
@@ -2118,7 +2118,7 @@ void btrfs_apply_pending_changes(struct btrfs_fs_info *fs_info) | |||
2118 | unsigned long prev; | 2118 | unsigned long prev; |
2119 | unsigned long bit; | 2119 | unsigned long bit; |
2120 | 2120 | ||
2121 | prev = cmpxchg(&fs_info->pending_changes, 0, 0); | 2121 | prev = xchg(&fs_info->pending_changes, 0); |
2122 | if (!prev) | 2122 | if (!prev) |
2123 | return; | 2123 | return; |
2124 | 2124 | ||
diff --git a/fs/cifs/ioctl.c b/fs/cifs/ioctl.c index 45cb59bcc791..8b7898b7670f 100644 --- a/fs/cifs/ioctl.c +++ b/fs/cifs/ioctl.c | |||
@@ -86,21 +86,16 @@ static long cifs_ioctl_clone(unsigned int xid, struct file *dst_file, | |||
86 | } | 86 | } |
87 | 87 | ||
88 | src_inode = file_inode(src_file.file); | 88 | src_inode = file_inode(src_file.file); |
89 | rc = -EINVAL; | ||
90 | if (S_ISDIR(src_inode->i_mode)) | ||
91 | goto out_fput; | ||
89 | 92 | ||
90 | /* | 93 | /* |
91 | * Note: cifs case is easier than btrfs since server responsible for | 94 | * Note: cifs case is easier than btrfs since server responsible for |
92 | * checks for proper open modes and file type and if it wants | 95 | * checks for proper open modes and file type and if it wants |
93 | * server could even support copy of range where source = target | 96 | * server could even support copy of range where source = target |
94 | */ | 97 | */ |
95 | 98 | lock_two_nondirectories(target_inode, src_inode); | |
96 | /* so we do not deadlock racing two ioctls on same files */ | ||
97 | if (target_inode < src_inode) { | ||
98 | mutex_lock_nested(&target_inode->i_mutex, I_MUTEX_PARENT); | ||
99 | mutex_lock_nested(&src_inode->i_mutex, I_MUTEX_CHILD); | ||
100 | } else { | ||
101 | mutex_lock_nested(&src_inode->i_mutex, I_MUTEX_PARENT); | ||
102 | mutex_lock_nested(&target_inode->i_mutex, I_MUTEX_CHILD); | ||
103 | } | ||
104 | 99 | ||
105 | /* determine range to clone */ | 100 | /* determine range to clone */ |
106 | rc = -EINVAL; | 101 | rc = -EINVAL; |
@@ -124,13 +119,7 @@ static long cifs_ioctl_clone(unsigned int xid, struct file *dst_file, | |||
124 | out_unlock: | 119 | out_unlock: |
125 | /* although unlocking in the reverse order from locking is not | 120 | /* although unlocking in the reverse order from locking is not |
126 | strictly necessary here it is a little cleaner to be consistent */ | 121 | strictly necessary here it is a little cleaner to be consistent */ |
127 | if (target_inode < src_inode) { | 122 | unlock_two_nondirectories(src_inode, target_inode); |
128 | mutex_unlock(&src_inode->i_mutex); | ||
129 | mutex_unlock(&target_inode->i_mutex); | ||
130 | } else { | ||
131 | mutex_unlock(&target_inode->i_mutex); | ||
132 | mutex_unlock(&src_inode->i_mutex); | ||
133 | } | ||
134 | out_fput: | 123 | out_fput: |
135 | fdput(src_file); | 124 | fdput(src_file); |
136 | out_drop_write: | 125 | out_drop_write: |
diff --git a/include/dt-bindings/interrupt-controller/arm-gic.h b/include/dt-bindings/interrupt-controller/arm-gic.h index 1ea1b702fec2..d4110d5caa3e 100644 --- a/include/dt-bindings/interrupt-controller/arm-gic.h +++ b/include/dt-bindings/interrupt-controller/arm-gic.h | |||
@@ -7,14 +7,14 @@ | |||
7 | 7 | ||
8 | #include <dt-bindings/interrupt-controller/irq.h> | 8 | #include <dt-bindings/interrupt-controller/irq.h> |
9 | 9 | ||
10 | /* interrupt specific cell 0 */ | 10 | /* interrupt specifier cell 0 */ |
11 | 11 | ||
12 | #define GIC_SPI 0 | 12 | #define GIC_SPI 0 |
13 | #define GIC_PPI 1 | 13 | #define GIC_PPI 1 |
14 | 14 | ||
15 | /* | 15 | /* |
16 | * Interrupt specifier cell 2. | 16 | * Interrupt specifier cell 2. |
17 | * The flaggs in irq.h are valid, plus those below. | 17 | * The flags in irq.h are valid, plus those below. |
18 | */ | 18 | */ |
19 | #define GIC_CPU_MASK_RAW(x) ((x) << 8) | 19 | #define GIC_CPU_MASK_RAW(x) ((x) << 8) |
20 | #define GIC_CPU_MASK_SIMPLE(num) GIC_CPU_MASK_RAW((1 << (num)) - 1) | 20 | #define GIC_CPU_MASK_SIMPLE(num) GIC_CPU_MASK_RAW((1 << (num)) - 1) |
diff --git a/include/linux/module.h b/include/linux/module.h index ebfb0e153c6a..b653d7c0a05a 100644 --- a/include/linux/module.h +++ b/include/linux/module.h | |||
@@ -444,7 +444,7 @@ extern void __module_put_and_exit(struct module *mod, long code) | |||
444 | #define module_put_and_exit(code) __module_put_and_exit(THIS_MODULE, code) | 444 | #define module_put_and_exit(code) __module_put_and_exit(THIS_MODULE, code) |
445 | 445 | ||
446 | #ifdef CONFIG_MODULE_UNLOAD | 446 | #ifdef CONFIG_MODULE_UNLOAD |
447 | unsigned long module_refcount(struct module *mod); | 447 | int module_refcount(struct module *mod); |
448 | void __symbol_put(const char *symbol); | 448 | void __symbol_put(const char *symbol); |
449 | #define symbol_put(x) __symbol_put(VMLINUX_SYMBOL_STR(x)) | 449 | #define symbol_put(x) __symbol_put(VMLINUX_SYMBOL_STR(x)) |
450 | void symbol_put_addr(void *addr); | 450 | void symbol_put_addr(void *addr); |
diff --git a/include/linux/moduleloader.h b/include/linux/moduleloader.h index 7eeb9bbfb816..f7556261fe3c 100644 --- a/include/linux/moduleloader.h +++ b/include/linux/moduleloader.h | |||
@@ -26,7 +26,7 @@ unsigned int arch_mod_section_prepend(struct module *mod, unsigned int section); | |||
26 | void *module_alloc(unsigned long size); | 26 | void *module_alloc(unsigned long size); |
27 | 27 | ||
28 | /* Free memory returned from module_alloc. */ | 28 | /* Free memory returned from module_alloc. */ |
29 | void module_free(struct module *mod, void *module_region); | 29 | void module_memfree(void *module_region); |
30 | 30 | ||
31 | /* | 31 | /* |
32 | * Apply the given relocation to the (simplified) ELF. Return -error | 32 | * Apply the given relocation to the (simplified) ELF. Return -error |
@@ -82,4 +82,6 @@ int module_finalize(const Elf_Ehdr *hdr, | |||
82 | /* Any cleanup needed when module leaves. */ | 82 | /* Any cleanup needed when module leaves. */ |
83 | void module_arch_cleanup(struct module *mod); | 83 | void module_arch_cleanup(struct module *mod); |
84 | 84 | ||
85 | /* Any cleanup before freeing mod->module_init */ | ||
86 | void module_arch_freeing_init(struct module *mod); | ||
85 | #endif | 87 | #endif |
diff --git a/include/linux/pci.h b/include/linux/pci.h index 360a966a97a5..9603094ed59b 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h | |||
@@ -175,6 +175,8 @@ enum pci_dev_flags { | |||
175 | PCI_DEV_FLAGS_DMA_ALIAS_DEVFN = (__force pci_dev_flags_t) (1 << 4), | 175 | PCI_DEV_FLAGS_DMA_ALIAS_DEVFN = (__force pci_dev_flags_t) (1 << 4), |
176 | /* Use a PCIe-to-PCI bridge alias even if !pci_is_pcie */ | 176 | /* Use a PCIe-to-PCI bridge alias even if !pci_is_pcie */ |
177 | PCI_DEV_FLAG_PCIE_BRIDGE_ALIAS = (__force pci_dev_flags_t) (1 << 5), | 177 | PCI_DEV_FLAG_PCIE_BRIDGE_ALIAS = (__force pci_dev_flags_t) (1 << 5), |
178 | /* Do not use bus resets for device */ | ||
179 | PCI_DEV_FLAGS_NO_BUS_RESET = (__force pci_dev_flags_t) (1 << 6), | ||
178 | }; | 180 | }; |
179 | 181 | ||
180 | enum pci_irq_reroute_variant { | 182 | enum pci_irq_reroute_variant { |
@@ -1065,6 +1067,7 @@ resource_size_t pcibios_retrieve_fw_addr(struct pci_dev *dev, int idx); | |||
1065 | void pci_bus_assign_resources(const struct pci_bus *bus); | 1067 | void pci_bus_assign_resources(const struct pci_bus *bus); |
1066 | void pci_bus_size_bridges(struct pci_bus *bus); | 1068 | void pci_bus_size_bridges(struct pci_bus *bus); |
1067 | int pci_claim_resource(struct pci_dev *, int); | 1069 | int pci_claim_resource(struct pci_dev *, int); |
1070 | int pci_claim_bridge_resource(struct pci_dev *bridge, int i); | ||
1068 | void pci_assign_unassigned_resources(void); | 1071 | void pci_assign_unassigned_resources(void); |
1069 | void pci_assign_unassigned_bridge_resources(struct pci_dev *bridge); | 1072 | void pci_assign_unassigned_bridge_resources(struct pci_dev *bridge); |
1070 | void pci_assign_unassigned_bus_resources(struct pci_bus *bus); | 1073 | void pci_assign_unassigned_bus_resources(struct pci_bus *bus); |
diff --git a/include/linux/time.h b/include/linux/time.h index 203c2ad40d71..beebe3a02d43 100644 --- a/include/linux/time.h +++ b/include/linux/time.h | |||
@@ -110,6 +110,19 @@ static inline bool timespec_valid_strict(const struct timespec *ts) | |||
110 | return true; | 110 | return true; |
111 | } | 111 | } |
112 | 112 | ||
113 | static inline bool timeval_valid(const struct timeval *tv) | ||
114 | { | ||
115 | /* Dates before 1970 are bogus */ | ||
116 | if (tv->tv_sec < 0) | ||
117 | return false; | ||
118 | |||
119 | /* Can't have more microseconds then a second */ | ||
120 | if (tv->tv_usec < 0 || tv->tv_usec >= USEC_PER_SEC) | ||
121 | return false; | ||
122 | |||
123 | return true; | ||
124 | } | ||
125 | |||
113 | extern struct timespec timespec_trunc(struct timespec t, unsigned gran); | 126 | extern struct timespec timespec_trunc(struct timespec t, unsigned gran); |
114 | 127 | ||
115 | #define CURRENT_TIME (current_kernel_time()) | 128 | #define CURRENT_TIME (current_kernel_time()) |
diff --git a/include/trace/events/kvm.h b/include/trace/events/kvm.h index 6edf1f2028cd..86b399c66c3d 100644 --- a/include/trace/events/kvm.h +++ b/include/trace/events/kvm.h | |||
@@ -146,6 +146,14 @@ TRACE_EVENT(kvm_msi_set_irq, | |||
146 | 146 | ||
147 | #if defined(CONFIG_HAVE_KVM_IRQFD) | 147 | #if defined(CONFIG_HAVE_KVM_IRQFD) |
148 | 148 | ||
149 | #ifdef kvm_irqchips | ||
150 | #define kvm_ack_irq_string "irqchip %s pin %u" | ||
151 | #define kvm_ack_irq_parm __print_symbolic(__entry->irqchip, kvm_irqchips), __entry->pin | ||
152 | #else | ||
153 | #define kvm_ack_irq_string "irqchip %d pin %u" | ||
154 | #define kvm_ack_irq_parm __entry->irqchip, __entry->pin | ||
155 | #endif | ||
156 | |||
149 | TRACE_EVENT(kvm_ack_irq, | 157 | TRACE_EVENT(kvm_ack_irq, |
150 | TP_PROTO(unsigned int irqchip, unsigned int pin), | 158 | TP_PROTO(unsigned int irqchip, unsigned int pin), |
151 | TP_ARGS(irqchip, pin), | 159 | TP_ARGS(irqchip, pin), |
@@ -160,13 +168,7 @@ TRACE_EVENT(kvm_ack_irq, | |||
160 | __entry->pin = pin; | 168 | __entry->pin = pin; |
161 | ), | 169 | ), |
162 | 170 | ||
163 | #ifdef kvm_irqchips | 171 | TP_printk(kvm_ack_irq_string, kvm_ack_irq_parm) |
164 | TP_printk("irqchip %s pin %u", | ||
165 | __print_symbolic(__entry->irqchip, kvm_irqchips), | ||
166 | __entry->pin) | ||
167 | #else | ||
168 | TP_printk("irqchip %d pin %u", __entry->irqchip, __entry->pin) | ||
169 | #endif | ||
170 | ); | 172 | ); |
171 | 173 | ||
172 | #endif /* defined(CONFIG_HAVE_KVM_IRQFD) */ | 174 | #endif /* defined(CONFIG_HAVE_KVM_IRQFD) */ |
diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c index d6594e457a25..a64e7a207d2b 100644 --- a/kernel/bpf/core.c +++ b/kernel/bpf/core.c | |||
@@ -163,7 +163,7 @@ bpf_jit_binary_alloc(unsigned int proglen, u8 **image_ptr, | |||
163 | 163 | ||
164 | void bpf_jit_binary_free(struct bpf_binary_header *hdr) | 164 | void bpf_jit_binary_free(struct bpf_binary_header *hdr) |
165 | { | 165 | { |
166 | module_free(NULL, hdr); | 166 | module_memfree(hdr); |
167 | } | 167 | } |
168 | #endif /* CONFIG_BPF_JIT */ | 168 | #endif /* CONFIG_BPF_JIT */ |
169 | 169 | ||
diff --git a/kernel/debug/kdb/kdb_main.c b/kernel/debug/kdb/kdb_main.c index f191bddf64b8..7b40c5f07dce 100644 --- a/kernel/debug/kdb/kdb_main.c +++ b/kernel/debug/kdb/kdb_main.c | |||
@@ -2023,7 +2023,7 @@ static int kdb_lsmod(int argc, const char **argv) | |||
2023 | kdb_printf("%-20s%8u 0x%p ", mod->name, | 2023 | kdb_printf("%-20s%8u 0x%p ", mod->name, |
2024 | mod->core_size, (void *)mod); | 2024 | mod->core_size, (void *)mod); |
2025 | #ifdef CONFIG_MODULE_UNLOAD | 2025 | #ifdef CONFIG_MODULE_UNLOAD |
2026 | kdb_printf("%4ld ", module_refcount(mod)); | 2026 | kdb_printf("%4d ", module_refcount(mod)); |
2027 | #endif | 2027 | #endif |
2028 | if (mod->state == MODULE_STATE_GOING) | 2028 | if (mod->state == MODULE_STATE_GOING) |
2029 | kdb_printf(" (Unloading)"); | 2029 | kdb_printf(" (Unloading)"); |
diff --git a/kernel/kprobes.c b/kernel/kprobes.c index 06f58309fed2..ee619929cf90 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c | |||
@@ -127,7 +127,7 @@ static void *alloc_insn_page(void) | |||
127 | 127 | ||
128 | static void free_insn_page(void *page) | 128 | static void free_insn_page(void *page) |
129 | { | 129 | { |
130 | module_free(NULL, page); | 130 | module_memfree(page); |
131 | } | 131 | } |
132 | 132 | ||
133 | struct kprobe_insn_cache kprobe_insn_slots = { | 133 | struct kprobe_insn_cache kprobe_insn_slots = { |
diff --git a/kernel/module.c b/kernel/module.c index 3965511ae133..d856e96a3cce 100644 --- a/kernel/module.c +++ b/kernel/module.c | |||
@@ -772,9 +772,18 @@ static int try_stop_module(struct module *mod, int flags, int *forced) | |||
772 | return 0; | 772 | return 0; |
773 | } | 773 | } |
774 | 774 | ||
775 | unsigned long module_refcount(struct module *mod) | 775 | /** |
776 | * module_refcount - return the refcount or -1 if unloading | ||
777 | * | ||
778 | * @mod: the module we're checking | ||
779 | * | ||
780 | * Returns: | ||
781 | * -1 if the module is in the process of unloading | ||
782 | * otherwise the number of references in the kernel to the module | ||
783 | */ | ||
784 | int module_refcount(struct module *mod) | ||
776 | { | 785 | { |
777 | return (unsigned long)atomic_read(&mod->refcnt) - MODULE_REF_BASE; | 786 | return atomic_read(&mod->refcnt) - MODULE_REF_BASE; |
778 | } | 787 | } |
779 | EXPORT_SYMBOL(module_refcount); | 788 | EXPORT_SYMBOL(module_refcount); |
780 | 789 | ||
@@ -856,7 +865,7 @@ static inline void print_unload_info(struct seq_file *m, struct module *mod) | |||
856 | struct module_use *use; | 865 | struct module_use *use; |
857 | int printed_something = 0; | 866 | int printed_something = 0; |
858 | 867 | ||
859 | seq_printf(m, " %lu ", module_refcount(mod)); | 868 | seq_printf(m, " %i ", module_refcount(mod)); |
860 | 869 | ||
861 | /* | 870 | /* |
862 | * Always include a trailing , so userspace can differentiate | 871 | * Always include a trailing , so userspace can differentiate |
@@ -908,7 +917,7 @@ EXPORT_SYMBOL_GPL(symbol_put_addr); | |||
908 | static ssize_t show_refcnt(struct module_attribute *mattr, | 917 | static ssize_t show_refcnt(struct module_attribute *mattr, |
909 | struct module_kobject *mk, char *buffer) | 918 | struct module_kobject *mk, char *buffer) |
910 | { | 919 | { |
911 | return sprintf(buffer, "%lu\n", module_refcount(mk->mod)); | 920 | return sprintf(buffer, "%i\n", module_refcount(mk->mod)); |
912 | } | 921 | } |
913 | 922 | ||
914 | static struct module_attribute modinfo_refcnt = | 923 | static struct module_attribute modinfo_refcnt = |
@@ -1795,7 +1804,7 @@ static void unset_module_core_ro_nx(struct module *mod) { } | |||
1795 | static void unset_module_init_ro_nx(struct module *mod) { } | 1804 | static void unset_module_init_ro_nx(struct module *mod) { } |
1796 | #endif | 1805 | #endif |
1797 | 1806 | ||
1798 | void __weak module_free(struct module *mod, void *module_region) | 1807 | void __weak module_memfree(void *module_region) |
1799 | { | 1808 | { |
1800 | vfree(module_region); | 1809 | vfree(module_region); |
1801 | } | 1810 | } |
@@ -1804,6 +1813,10 @@ void __weak module_arch_cleanup(struct module *mod) | |||
1804 | { | 1813 | { |
1805 | } | 1814 | } |
1806 | 1815 | ||
1816 | void __weak module_arch_freeing_init(struct module *mod) | ||
1817 | { | ||
1818 | } | ||
1819 | |||
1807 | /* Free a module, remove from lists, etc. */ | 1820 | /* Free a module, remove from lists, etc. */ |
1808 | static void free_module(struct module *mod) | 1821 | static void free_module(struct module *mod) |
1809 | { | 1822 | { |
@@ -1841,7 +1854,8 @@ static void free_module(struct module *mod) | |||
1841 | 1854 | ||
1842 | /* This may be NULL, but that's OK */ | 1855 | /* This may be NULL, but that's OK */ |
1843 | unset_module_init_ro_nx(mod); | 1856 | unset_module_init_ro_nx(mod); |
1844 | module_free(mod, mod->module_init); | 1857 | module_arch_freeing_init(mod); |
1858 | module_memfree(mod->module_init); | ||
1845 | kfree(mod->args); | 1859 | kfree(mod->args); |
1846 | percpu_modfree(mod); | 1860 | percpu_modfree(mod); |
1847 | 1861 | ||
@@ -1850,7 +1864,7 @@ static void free_module(struct module *mod) | |||
1850 | 1864 | ||
1851 | /* Finally, free the core (containing the module structure) */ | 1865 | /* Finally, free the core (containing the module structure) */ |
1852 | unset_module_core_ro_nx(mod); | 1866 | unset_module_core_ro_nx(mod); |
1853 | module_free(mod, mod->module_core); | 1867 | module_memfree(mod->module_core); |
1854 | 1868 | ||
1855 | #ifdef CONFIG_MPU | 1869 | #ifdef CONFIG_MPU |
1856 | update_protections(current->mm); | 1870 | update_protections(current->mm); |
@@ -2785,7 +2799,7 @@ static int move_module(struct module *mod, struct load_info *info) | |||
2785 | */ | 2799 | */ |
2786 | kmemleak_ignore(ptr); | 2800 | kmemleak_ignore(ptr); |
2787 | if (!ptr) { | 2801 | if (!ptr) { |
2788 | module_free(mod, mod->module_core); | 2802 | module_memfree(mod->module_core); |
2789 | return -ENOMEM; | 2803 | return -ENOMEM; |
2790 | } | 2804 | } |
2791 | memset(ptr, 0, mod->init_size); | 2805 | memset(ptr, 0, mod->init_size); |
@@ -2930,8 +2944,9 @@ static struct module *layout_and_allocate(struct load_info *info, int flags) | |||
2930 | static void module_deallocate(struct module *mod, struct load_info *info) | 2944 | static void module_deallocate(struct module *mod, struct load_info *info) |
2931 | { | 2945 | { |
2932 | percpu_modfree(mod); | 2946 | percpu_modfree(mod); |
2933 | module_free(mod, mod->module_init); | 2947 | module_arch_freeing_init(mod); |
2934 | module_free(mod, mod->module_core); | 2948 | module_memfree(mod->module_init); |
2949 | module_memfree(mod->module_core); | ||
2935 | } | 2950 | } |
2936 | 2951 | ||
2937 | int __weak module_finalize(const Elf_Ehdr *hdr, | 2952 | int __weak module_finalize(const Elf_Ehdr *hdr, |
@@ -2983,10 +2998,31 @@ static void do_mod_ctors(struct module *mod) | |||
2983 | #endif | 2998 | #endif |
2984 | } | 2999 | } |
2985 | 3000 | ||
3001 | /* For freeing module_init on success, in case kallsyms traversing */ | ||
3002 | struct mod_initfree { | ||
3003 | struct rcu_head rcu; | ||
3004 | void *module_init; | ||
3005 | }; | ||
3006 | |||
3007 | static void do_free_init(struct rcu_head *head) | ||
3008 | { | ||
3009 | struct mod_initfree *m = container_of(head, struct mod_initfree, rcu); | ||
3010 | module_memfree(m->module_init); | ||
3011 | kfree(m); | ||
3012 | } | ||
3013 | |||
2986 | /* This is where the real work happens */ | 3014 | /* This is where the real work happens */ |
2987 | static int do_init_module(struct module *mod) | 3015 | static int do_init_module(struct module *mod) |
2988 | { | 3016 | { |
2989 | int ret = 0; | 3017 | int ret = 0; |
3018 | struct mod_initfree *freeinit; | ||
3019 | |||
3020 | freeinit = kmalloc(sizeof(*freeinit), GFP_KERNEL); | ||
3021 | if (!freeinit) { | ||
3022 | ret = -ENOMEM; | ||
3023 | goto fail; | ||
3024 | } | ||
3025 | freeinit->module_init = mod->module_init; | ||
2990 | 3026 | ||
2991 | /* | 3027 | /* |
2992 | * We want to find out whether @mod uses async during init. Clear | 3028 | * We want to find out whether @mod uses async during init. Clear |
@@ -2999,18 +3035,7 @@ static int do_init_module(struct module *mod) | |||
2999 | if (mod->init != NULL) | 3035 | if (mod->init != NULL) |
3000 | ret = do_one_initcall(mod->init); | 3036 | ret = do_one_initcall(mod->init); |
3001 | if (ret < 0) { | 3037 | if (ret < 0) { |
3002 | /* | 3038 | goto fail_free_freeinit; |
3003 | * Init routine failed: abort. Try to protect us from | ||
3004 | * buggy refcounters. | ||
3005 | */ | ||
3006 | mod->state = MODULE_STATE_GOING; | ||
3007 | synchronize_sched(); | ||
3008 | module_put(mod); | ||
3009 | blocking_notifier_call_chain(&module_notify_list, | ||
3010 | MODULE_STATE_GOING, mod); | ||
3011 | free_module(mod); | ||
3012 | wake_up_all(&module_wq); | ||
3013 | return ret; | ||
3014 | } | 3039 | } |
3015 | if (ret > 0) { | 3040 | if (ret > 0) { |
3016 | pr_warn("%s: '%s'->init suspiciously returned %d, it should " | 3041 | pr_warn("%s: '%s'->init suspiciously returned %d, it should " |
@@ -3055,15 +3080,35 @@ static int do_init_module(struct module *mod) | |||
3055 | mod->strtab = mod->core_strtab; | 3080 | mod->strtab = mod->core_strtab; |
3056 | #endif | 3081 | #endif |
3057 | unset_module_init_ro_nx(mod); | 3082 | unset_module_init_ro_nx(mod); |
3058 | module_free(mod, mod->module_init); | 3083 | module_arch_freeing_init(mod); |
3059 | mod->module_init = NULL; | 3084 | mod->module_init = NULL; |
3060 | mod->init_size = 0; | 3085 | mod->init_size = 0; |
3061 | mod->init_ro_size = 0; | 3086 | mod->init_ro_size = 0; |
3062 | mod->init_text_size = 0; | 3087 | mod->init_text_size = 0; |
3088 | /* | ||
3089 | * We want to free module_init, but be aware that kallsyms may be | ||
3090 | * walking this with preempt disabled. In all the failure paths, | ||
3091 | * we call synchronize_rcu/synchronize_sched, but we don't want | ||
3092 | * to slow down the success path, so use actual RCU here. | ||
3093 | */ | ||
3094 | call_rcu(&freeinit->rcu, do_free_init); | ||
3063 | mutex_unlock(&module_mutex); | 3095 | mutex_unlock(&module_mutex); |
3064 | wake_up_all(&module_wq); | 3096 | wake_up_all(&module_wq); |
3065 | 3097 | ||
3066 | return 0; | 3098 | return 0; |
3099 | |||
3100 | fail_free_freeinit: | ||
3101 | kfree(freeinit); | ||
3102 | fail: | ||
3103 | /* Try to protect us from buggy refcounters. */ | ||
3104 | mod->state = MODULE_STATE_GOING; | ||
3105 | synchronize_sched(); | ||
3106 | module_put(mod); | ||
3107 | blocking_notifier_call_chain(&module_notify_list, | ||
3108 | MODULE_STATE_GOING, mod); | ||
3109 | free_module(mod); | ||
3110 | wake_up_all(&module_wq); | ||
3111 | return ret; | ||
3067 | } | 3112 | } |
3068 | 3113 | ||
3069 | static int may_init_module(void) | 3114 | static int may_init_module(void) |
diff --git a/kernel/params.c b/kernel/params.c index 0af9b2c4e56c..728e05b167de 100644 --- a/kernel/params.c +++ b/kernel/params.c | |||
@@ -642,12 +642,15 @@ static __modinit int add_sysfs_param(struct module_kobject *mk, | |||
642 | mk->mp->grp.attrs = new_attrs; | 642 | mk->mp->grp.attrs = new_attrs; |
643 | 643 | ||
644 | /* Tack new one on the end. */ | 644 | /* Tack new one on the end. */ |
645 | memset(&mk->mp->attrs[mk->mp->num], 0, sizeof(mk->mp->attrs[0])); | ||
645 | sysfs_attr_init(&mk->mp->attrs[mk->mp->num].mattr.attr); | 646 | sysfs_attr_init(&mk->mp->attrs[mk->mp->num].mattr.attr); |
646 | mk->mp->attrs[mk->mp->num].param = kp; | 647 | mk->mp->attrs[mk->mp->num].param = kp; |
647 | mk->mp->attrs[mk->mp->num].mattr.show = param_attr_show; | 648 | mk->mp->attrs[mk->mp->num].mattr.show = param_attr_show; |
648 | /* Do not allow runtime DAC changes to make param writable. */ | 649 | /* Do not allow runtime DAC changes to make param writable. */ |
649 | if ((kp->perm & (S_IWUSR | S_IWGRP | S_IWOTH)) != 0) | 650 | if ((kp->perm & (S_IWUSR | S_IWGRP | S_IWOTH)) != 0) |
650 | mk->mp->attrs[mk->mp->num].mattr.store = param_attr_store; | 651 | mk->mp->attrs[mk->mp->num].mattr.store = param_attr_store; |
652 | else | ||
653 | mk->mp->attrs[mk->mp->num].mattr.store = NULL; | ||
651 | mk->mp->attrs[mk->mp->num].mattr.attr.name = (char *)name; | 654 | mk->mp->attrs[mk->mp->num].mattr.attr.name = (char *)name; |
652 | mk->mp->attrs[mk->mp->num].mattr.attr.mode = kp->perm; | 655 | mk->mp->attrs[mk->mp->num].mattr.attr.mode = kp->perm; |
653 | mk->mp->num++; | 656 | mk->mp->num++; |
diff --git a/kernel/sys.c b/kernel/sys.c index a8c9f5a7dda6..ea9c88109894 100644 --- a/kernel/sys.c +++ b/kernel/sys.c | |||
@@ -2210,9 +2210,13 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3, | |||
2210 | up_write(&me->mm->mmap_sem); | 2210 | up_write(&me->mm->mmap_sem); |
2211 | break; | 2211 | break; |
2212 | case PR_MPX_ENABLE_MANAGEMENT: | 2212 | case PR_MPX_ENABLE_MANAGEMENT: |
2213 | if (arg2 || arg3 || arg4 || arg5) | ||
2214 | return -EINVAL; | ||
2213 | error = MPX_ENABLE_MANAGEMENT(me); | 2215 | error = MPX_ENABLE_MANAGEMENT(me); |
2214 | break; | 2216 | break; |
2215 | case PR_MPX_DISABLE_MANAGEMENT: | 2217 | case PR_MPX_DISABLE_MANAGEMENT: |
2218 | if (arg2 || arg3 || arg4 || arg5) | ||
2219 | return -EINVAL; | ||
2216 | error = MPX_DISABLE_MANAGEMENT(me); | 2220 | error = MPX_DISABLE_MANAGEMENT(me); |
2217 | break; | 2221 | break; |
2218 | default: | 2222 | default: |
diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c index 87a346fd6d61..28bf91c60a0b 100644 --- a/kernel/time/ntp.c +++ b/kernel/time/ntp.c | |||
@@ -633,6 +633,13 @@ int ntp_validate_timex(struct timex *txc) | |||
633 | if ((txc->modes & ADJ_SETOFFSET) && (!capable(CAP_SYS_TIME))) | 633 | if ((txc->modes & ADJ_SETOFFSET) && (!capable(CAP_SYS_TIME))) |
634 | return -EPERM; | 634 | return -EPERM; |
635 | 635 | ||
636 | if (txc->modes & ADJ_FREQUENCY) { | ||
637 | if (LONG_MIN / PPM_SCALE > txc->freq) | ||
638 | return -EINVAL; | ||
639 | if (LONG_MAX / PPM_SCALE < txc->freq) | ||
640 | return -EINVAL; | ||
641 | } | ||
642 | |||
636 | return 0; | 643 | return 0; |
637 | } | 644 | } |
638 | 645 | ||
diff --git a/kernel/time/time.c b/kernel/time/time.c index 6390517e77d4..2c85b7724af4 100644 --- a/kernel/time/time.c +++ b/kernel/time/time.c | |||
@@ -196,6 +196,10 @@ SYSCALL_DEFINE2(settimeofday, struct timeval __user *, tv, | |||
196 | if (tv) { | 196 | if (tv) { |
197 | if (copy_from_user(&user_tv, tv, sizeof(*tv))) | 197 | if (copy_from_user(&user_tv, tv, sizeof(*tv))) |
198 | return -EFAULT; | 198 | return -EFAULT; |
199 | |||
200 | if (!timeval_valid(&user_tv)) | ||
201 | return -EINVAL; | ||
202 | |||
199 | new_ts.tv_sec = user_tv.tv_sec; | 203 | new_ts.tv_sec = user_tv.tv_sec; |
200 | new_ts.tv_nsec = user_tv.tv_usec * NSEC_PER_USEC; | 204 | new_ts.tv_nsec = user_tv.tv_usec * NSEC_PER_USEC; |
201 | } | 205 | } |