diff options
385 files changed, 3732 insertions, 2266 deletions
diff --git a/Documentation/ABI/testing/sysfs-tty b/Documentation/ABI/testing/sysfs-tty index a2ccec35ffce..ad22fb0ee765 100644 --- a/Documentation/ABI/testing/sysfs-tty +++ b/Documentation/ABI/testing/sysfs-tty | |||
| @@ -3,8 +3,7 @@ Date: Nov 2010 | |||
| 3 | Contact: Kay Sievers <kay.sievers@vrfy.org> | 3 | Contact: Kay Sievers <kay.sievers@vrfy.org> |
| 4 | Description: | 4 | Description: |
| 5 | Shows the list of currently configured | 5 | Shows the list of currently configured |
| 6 | tty devices used for the console, | 6 | console devices, like 'tty1 ttyS0'. |
| 7 | like 'tty1 ttyS0'. | ||
| 8 | The last entry in the file is the active | 7 | The last entry in the file is the active |
| 9 | device connected to /dev/console. | 8 | device connected to /dev/console. |
| 10 | The file supports poll() to detect virtual | 9 | The file supports poll() to detect virtual |
diff --git a/Documentation/PCI/MSI-HOWTO.txt b/Documentation/PCI/MSI-HOWTO.txt index a8d01005f480..10a93696e55a 100644 --- a/Documentation/PCI/MSI-HOWTO.txt +++ b/Documentation/PCI/MSI-HOWTO.txt | |||
| @@ -82,7 +82,19 @@ Most of the hard work is done for the driver in the PCI layer. It simply | |||
| 82 | has to request that the PCI layer set up the MSI capability for this | 82 | has to request that the PCI layer set up the MSI capability for this |
| 83 | device. | 83 | device. |
| 84 | 84 | ||
| 85 | 4.2.1 pci_enable_msi_range | 85 | 4.2.1 pci_enable_msi |
| 86 | |||
| 87 | int pci_enable_msi(struct pci_dev *dev) | ||
| 88 | |||
| 89 | A successful call allocates ONE interrupt to the device, regardless | ||
| 90 | of how many MSIs the device supports. The device is switched from | ||
| 91 | pin-based interrupt mode to MSI mode. The dev->irq number is changed | ||
| 92 | to a new number which represents the message signaled interrupt; | ||
| 93 | consequently, this function should be called before the driver calls | ||
| 94 | request_irq(), because an MSI is delivered via a vector that is | ||
| 95 | different from the vector of a pin-based interrupt. | ||
| 96 | |||
| 97 | 4.2.2 pci_enable_msi_range | ||
| 86 | 98 | ||
| 87 | int pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec) | 99 | int pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec) |
| 88 | 100 | ||
| @@ -147,6 +159,11 @@ static int foo_driver_enable_msi(struct pci_dev *pdev, int nvec) | |||
| 147 | return pci_enable_msi_range(pdev, nvec, nvec); | 159 | return pci_enable_msi_range(pdev, nvec, nvec); |
| 148 | } | 160 | } |
| 149 | 161 | ||
| 162 | Note, unlike pci_enable_msi_exact() function, which could be also used to | ||
| 163 | enable a particular number of MSI-X interrupts, pci_enable_msi_range() | ||
| 164 | returns either a negative errno or 'nvec' (not negative errno or 0 - as | ||
| 165 | pci_enable_msi_exact() does). | ||
| 166 | |||
| 150 | 4.2.1.3 Single MSI mode | 167 | 4.2.1.3 Single MSI mode |
| 151 | 168 | ||
| 152 | The most notorious example of the request type described above is | 169 | The most notorious example of the request type described above is |
| @@ -158,7 +175,27 @@ static int foo_driver_enable_single_msi(struct pci_dev *pdev) | |||
| 158 | return pci_enable_msi_range(pdev, 1, 1); | 175 | return pci_enable_msi_range(pdev, 1, 1); |
| 159 | } | 176 | } |
| 160 | 177 | ||
| 161 | 4.2.2 pci_disable_msi | 178 | Note, unlike pci_enable_msi() function, which could be also used to |
| 179 | enable the single MSI mode, pci_enable_msi_range() returns either a | ||
| 180 | negative errno or 1 (not negative errno or 0 - as pci_enable_msi() | ||
| 181 | does). | ||
| 182 | |||
| 183 | 4.2.3 pci_enable_msi_exact | ||
| 184 | |||
| 185 | int pci_enable_msi_exact(struct pci_dev *dev, int nvec) | ||
| 186 | |||
| 187 | This variation on pci_enable_msi_range() call allows a device driver to | ||
| 188 | request exactly 'nvec' MSIs. | ||
| 189 | |||
| 190 | If this function returns a negative number, it indicates an error and | ||
| 191 | the driver should not attempt to request any more MSI interrupts for | ||
| 192 | this device. | ||
| 193 | |||
| 194 | By contrast with pci_enable_msi_range() function, pci_enable_msi_exact() | ||
| 195 | returns zero in case of success, which indicates MSI interrupts have been | ||
| 196 | successfully allocated. | ||
| 197 | |||
| 198 | 4.2.4 pci_disable_msi | ||
| 162 | 199 | ||
| 163 | void pci_disable_msi(struct pci_dev *dev) | 200 | void pci_disable_msi(struct pci_dev *dev) |
| 164 | 201 | ||
| @@ -172,7 +209,7 @@ on any interrupt for which it previously called request_irq(). | |||
| 172 | Failure to do so results in a BUG_ON(), leaving the device with | 209 | Failure to do so results in a BUG_ON(), leaving the device with |
| 173 | MSI enabled and thus leaking its vector. | 210 | MSI enabled and thus leaking its vector. |
| 174 | 211 | ||
| 175 | 4.2.3 pci_msi_vec_count | 212 | 4.2.4 pci_msi_vec_count |
| 176 | 213 | ||
| 177 | int pci_msi_vec_count(struct pci_dev *dev) | 214 | int pci_msi_vec_count(struct pci_dev *dev) |
| 178 | 215 | ||
| @@ -257,8 +294,8 @@ possible, likely up to the limit returned by pci_msix_vec_count() function: | |||
| 257 | 294 | ||
| 258 | static int foo_driver_enable_msix(struct foo_adapter *adapter, int nvec) | 295 | static int foo_driver_enable_msix(struct foo_adapter *adapter, int nvec) |
| 259 | { | 296 | { |
| 260 | return pci_enable_msi_range(adapter->pdev, adapter->msix_entries, | 297 | return pci_enable_msix_range(adapter->pdev, adapter->msix_entries, |
| 261 | 1, nvec); | 298 | 1, nvec); |
| 262 | } | 299 | } |
| 263 | 300 | ||
| 264 | Note the value of 'minvec' parameter is 1. As 'minvec' is inclusive, | 301 | Note the value of 'minvec' parameter is 1. As 'minvec' is inclusive, |
| @@ -269,8 +306,8 @@ In this case the function could look like this: | |||
| 269 | 306 | ||
| 270 | static int foo_driver_enable_msix(struct foo_adapter *adapter, int nvec) | 307 | static int foo_driver_enable_msix(struct foo_adapter *adapter, int nvec) |
| 271 | { | 308 | { |
| 272 | return pci_enable_msi_range(adapter->pdev, adapter->msix_entries, | 309 | return pci_enable_msix_range(adapter->pdev, adapter->msix_entries, |
| 273 | FOO_DRIVER_MINIMUM_NVEC, nvec); | 310 | FOO_DRIVER_MINIMUM_NVEC, nvec); |
| 274 | } | 311 | } |
| 275 | 312 | ||
| 276 | 4.3.1.2 Exact number of MSI-X interrupts | 313 | 4.3.1.2 Exact number of MSI-X interrupts |
| @@ -282,10 +319,15 @@ parameters: | |||
| 282 | 319 | ||
| 283 | static int foo_driver_enable_msix(struct foo_adapter *adapter, int nvec) | 320 | static int foo_driver_enable_msix(struct foo_adapter *adapter, int nvec) |
| 284 | { | 321 | { |
| 285 | return pci_enable_msi_range(adapter->pdev, adapter->msix_entries, | 322 | return pci_enable_msix_range(adapter->pdev, adapter->msix_entries, |
| 286 | nvec, nvec); | 323 | nvec, nvec); |
| 287 | } | 324 | } |
| 288 | 325 | ||
| 326 | Note, unlike pci_enable_msix_exact() function, which could be also used to | ||
| 327 | enable a particular number of MSI-X interrupts, pci_enable_msix_range() | ||
| 328 | returns either a negative errno or 'nvec' (not negative errno or 0 - as | ||
| 329 | pci_enable_msix_exact() does). | ||
| 330 | |||
| 289 | 4.3.1.3 Specific requirements to the number of MSI-X interrupts | 331 | 4.3.1.3 Specific requirements to the number of MSI-X interrupts |
| 290 | 332 | ||
| 291 | As noted above, there could be devices that can not operate with just any | 333 | As noted above, there could be devices that can not operate with just any |
| @@ -332,7 +374,64 @@ Note how pci_enable_msix_range() return value is analized for a fallback - | |||
| 332 | any error code other than -ENOSPC indicates a fatal error and should not | 374 | any error code other than -ENOSPC indicates a fatal error and should not |
| 333 | be retried. | 375 | be retried. |
| 334 | 376 | ||
| 335 | 4.3.2 pci_disable_msix | 377 | 4.3.2 pci_enable_msix_exact |
| 378 | |||
| 379 | int pci_enable_msix_exact(struct pci_dev *dev, | ||
| 380 | struct msix_entry *entries, int nvec) | ||
| 381 | |||
| 382 | This variation on pci_enable_msix_range() call allows a device driver to | ||
| 383 | request exactly 'nvec' MSI-Xs. | ||
| 384 | |||
| 385 | If this function returns a negative number, it indicates an error and | ||
| 386 | the driver should not attempt to allocate any more MSI-X interrupts for | ||
| 387 | this device. | ||
| 388 | |||
| 389 | By contrast with pci_enable_msix_range() function, pci_enable_msix_exact() | ||
| 390 | returns zero in case of success, which indicates MSI-X interrupts have been | ||
| 391 | successfully allocated. | ||
| 392 | |||
| 393 | Another version of a routine that enables MSI-X mode for a device with | ||
| 394 | specific requirements described in chapter 4.3.1.3 might look like this: | ||
| 395 | |||
| 396 | /* | ||
| 397 | * Assume 'minvec' and 'maxvec' are non-zero | ||
| 398 | */ | ||
| 399 | static int foo_driver_enable_msix(struct foo_adapter *adapter, | ||
| 400 | int minvec, int maxvec) | ||
| 401 | { | ||
| 402 | int rc; | ||
| 403 | |||
| 404 | minvec = roundup_pow_of_two(minvec); | ||
| 405 | maxvec = rounddown_pow_of_two(maxvec); | ||
| 406 | |||
| 407 | if (minvec > maxvec) | ||
| 408 | return -ERANGE; | ||
| 409 | |||
| 410 | retry: | ||
| 411 | rc = pci_enable_msix_exact(adapter->pdev, | ||
| 412 | adapter->msix_entries, maxvec); | ||
| 413 | |||
| 414 | /* | ||
| 415 | * -ENOSPC is the only error code allowed to be analyzed | ||
| 416 | */ | ||
| 417 | if (rc == -ENOSPC) { | ||
| 418 | if (maxvec == 1) | ||
| 419 | return -ENOSPC; | ||
| 420 | |||
| 421 | maxvec /= 2; | ||
| 422 | |||
| 423 | if (minvec > maxvec) | ||
| 424 | return -ENOSPC; | ||
| 425 | |||
| 426 | goto retry; | ||
| 427 | } else if (rc < 0) { | ||
| 428 | return rc; | ||
| 429 | } | ||
| 430 | |||
| 431 | return maxvec; | ||
| 432 | } | ||
| 433 | |||
| 434 | 4.3.3 pci_disable_msix | ||
| 336 | 435 | ||
| 337 | void pci_disable_msix(struct pci_dev *dev) | 436 | void pci_disable_msix(struct pci_dev *dev) |
| 338 | 437 | ||
diff --git a/Documentation/devicetree/bindings/arm/omap/omap.txt b/Documentation/devicetree/bindings/arm/omap/omap.txt index 34dc40cffdfd..af9b4a0d902b 100644 --- a/Documentation/devicetree/bindings/arm/omap/omap.txt +++ b/Documentation/devicetree/bindings/arm/omap/omap.txt | |||
| @@ -91,7 +91,7 @@ Boards: | |||
| 91 | compatible = "ti,omap3-beagle", "ti,omap3" | 91 | compatible = "ti,omap3-beagle", "ti,omap3" |
| 92 | 92 | ||
| 93 | - OMAP3 Tobi with Overo : Commercial expansion board with daughter board | 93 | - OMAP3 Tobi with Overo : Commercial expansion board with daughter board |
| 94 | compatible = "ti,omap3-tobi", "ti,omap3-overo", "ti,omap3" | 94 | compatible = "gumstix,omap3-overo-tobi", "gumstix,omap3-overo", "ti,omap3" |
| 95 | 95 | ||
| 96 | - OMAP4 SDP : Software Development Board | 96 | - OMAP4 SDP : Software Development Board |
| 97 | compatible = "ti,omap4-sdp", "ti,omap4430" | 97 | compatible = "ti,omap4-sdp", "ti,omap4430" |
diff --git a/Documentation/devicetree/bindings/clock/renesas,cpg-mstp-clocks.txt b/Documentation/devicetree/bindings/clock/renesas,cpg-mstp-clocks.txt index a6a352c2771e..5992dceec7af 100644 --- a/Documentation/devicetree/bindings/clock/renesas,cpg-mstp-clocks.txt +++ b/Documentation/devicetree/bindings/clock/renesas,cpg-mstp-clocks.txt | |||
| @@ -21,9 +21,9 @@ Required Properties: | |||
| 21 | must appear in the same order as the output clocks. | 21 | must appear in the same order as the output clocks. |
| 22 | - #clock-cells: Must be 1 | 22 | - #clock-cells: Must be 1 |
| 23 | - clock-output-names: The name of the clocks as free-form strings | 23 | - clock-output-names: The name of the clocks as free-form strings |
| 24 | - renesas,indices: Indices of the gate clocks into the group (0 to 31) | 24 | - renesas,clock-indices: Indices of the gate clocks into the group (0 to 31) |
| 25 | 25 | ||
| 26 | The clocks, clock-output-names and renesas,indices properties contain one | 26 | The clocks, clock-output-names and renesas,clock-indices properties contain one |
| 27 | entry per gate clock. The MSTP groups are sparsely populated. Unimplemented | 27 | entry per gate clock. The MSTP groups are sparsely populated. Unimplemented |
| 28 | gate clocks must not be declared. | 28 | gate clocks must not be declared. |
| 29 | 29 | ||
diff --git a/Documentation/devicetree/bindings/dma/fsl-imx-sdma.txt b/Documentation/devicetree/bindings/dma/fsl-imx-sdma.txt index 68b83ecc3850..ee9be9961524 100644 --- a/Documentation/devicetree/bindings/dma/fsl-imx-sdma.txt +++ b/Documentation/devicetree/bindings/dma/fsl-imx-sdma.txt | |||
| @@ -1,12 +1,16 @@ | |||
| 1 | * Freescale Smart Direct Memory Access (SDMA) Controller for i.MX | 1 | * Freescale Smart Direct Memory Access (SDMA) Controller for i.MX |
| 2 | 2 | ||
| 3 | Required properties: | 3 | Required properties: |
| 4 | - compatible : Should be "fsl,imx31-sdma", "fsl,imx31-to1-sdma", | 4 | - compatible : Should be one of |
| 5 | "fsl,imx31-to2-sdma", "fsl,imx35-sdma", "fsl,imx35-to1-sdma", | 5 | "fsl,imx25-sdma" |
| 6 | "fsl,imx35-to2-sdma", "fsl,imx51-sdma", "fsl,imx53-sdma" or | 6 | "fsl,imx31-sdma", "fsl,imx31-to1-sdma", "fsl,imx31-to2-sdma" |
| 7 | "fsl,imx6q-sdma". The -to variants should be preferred since they | 7 | "fsl,imx35-sdma", "fsl,imx35-to1-sdma", "fsl,imx35-to2-sdma" |
| 8 | allow to determnine the correct ROM script addresses needed for | 8 | "fsl,imx51-sdma" |
| 9 | the driver to work without additional firmware. | 9 | "fsl,imx53-sdma" |
| 10 | "fsl,imx6q-sdma" | ||
| 11 | The -to variants should be preferred since they allow to determnine the | ||
| 12 | correct ROM script addresses needed for the driver to work without additional | ||
| 13 | firmware. | ||
| 10 | - reg : Should contain SDMA registers location and length | 14 | - reg : Should contain SDMA registers location and length |
| 11 | - interrupts : Should contain SDMA interrupt | 15 | - interrupts : Should contain SDMA interrupt |
| 12 | - #dma-cells : Must be <3>. | 16 | - #dma-cells : Must be <3>. |
diff --git a/MAINTAINERS b/MAINTAINERS index fec577df3eb0..e1297ff255e1 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -73,7 +73,8 @@ Descriptions of section entries: | |||
| 73 | L: Mailing list that is relevant to this area | 73 | L: Mailing list that is relevant to this area |
| 74 | W: Web-page with status/info | 74 | W: Web-page with status/info |
| 75 | Q: Patchwork web based patch tracking system site | 75 | Q: Patchwork web based patch tracking system site |
| 76 | T: SCM tree type and location. Type is one of: git, hg, quilt, stgit, topgit. | 76 | T: SCM tree type and location. |
| 77 | Type is one of: git, hg, quilt, stgit, topgit | ||
| 77 | S: Status, one of the following: | 78 | S: Status, one of the following: |
| 78 | Supported: Someone is actually paid to look after this. | 79 | Supported: Someone is actually paid to look after this. |
| 79 | Maintained: Someone actually looks after it. | 80 | Maintained: Someone actually looks after it. |
| @@ -538,7 +539,7 @@ F: arch/alpha/ | |||
| 538 | ALTERA UART/JTAG UART SERIAL DRIVERS | 539 | ALTERA UART/JTAG UART SERIAL DRIVERS |
| 539 | M: Tobias Klauser <tklauser@distanz.ch> | 540 | M: Tobias Klauser <tklauser@distanz.ch> |
| 540 | L: linux-serial@vger.kernel.org | 541 | L: linux-serial@vger.kernel.org |
| 541 | L: nios2-dev@sopc.et.ntust.edu.tw (moderated for non-subscribers) | 542 | L: nios2-dev@lists.rocketboards.org (moderated for non-subscribers) |
| 542 | S: Maintained | 543 | S: Maintained |
| 543 | F: drivers/tty/serial/altera_uart.c | 544 | F: drivers/tty/serial/altera_uart.c |
| 544 | F: drivers/tty/serial/altera_jtaguart.c | 545 | F: drivers/tty/serial/altera_jtaguart.c |
| @@ -1612,11 +1613,11 @@ S: Maintained | |||
| 1612 | F: drivers/net/wireless/atmel* | 1613 | F: drivers/net/wireless/atmel* |
| 1613 | 1614 | ||
| 1614 | ATTO EXPRESSSAS SAS/SATA RAID SCSI DRIVER | 1615 | ATTO EXPRESSSAS SAS/SATA RAID SCSI DRIVER |
| 1615 | M: Bradley Grove <linuxdrivers@attotech.com> | 1616 | M: Bradley Grove <linuxdrivers@attotech.com> |
| 1616 | L: linux-scsi@vger.kernel.org | 1617 | L: linux-scsi@vger.kernel.org |
| 1617 | W: http://www.attotech.com | 1618 | W: http://www.attotech.com |
| 1618 | S: Supported | 1619 | S: Supported |
| 1619 | F: drivers/scsi/esas2r | 1620 | F: drivers/scsi/esas2r |
| 1620 | 1621 | ||
| 1621 | AUDIT SUBSYSTEM | 1622 | AUDIT SUBSYSTEM |
| 1622 | M: Eric Paris <eparis@redhat.com> | 1623 | M: Eric Paris <eparis@redhat.com> |
| @@ -1860,6 +1861,7 @@ F: drivers/net/ethernet/broadcom/bnx2x/ | |||
| 1860 | 1861 | ||
| 1861 | BROADCOM BCM281XX/BCM11XXX ARM ARCHITECTURE | 1862 | BROADCOM BCM281XX/BCM11XXX ARM ARCHITECTURE |
| 1862 | M: Christian Daudt <bcm@fixthebug.org> | 1863 | M: Christian Daudt <bcm@fixthebug.org> |
| 1864 | M: Matt Porter <mporter@linaro.org> | ||
| 1863 | L: bcm-kernel-feedback-list@broadcom.com | 1865 | L: bcm-kernel-feedback-list@broadcom.com |
| 1864 | T: git git://git.github.com/broadcom/bcm11351 | 1866 | T: git git://git.github.com/broadcom/bcm11351 |
| 1865 | S: Maintained | 1867 | S: Maintained |
| @@ -2158,7 +2160,7 @@ F: Documentation/zh_CN/ | |||
| 2158 | 2160 | ||
| 2159 | CHIPIDEA USB HIGH SPEED DUAL ROLE CONTROLLER | 2161 | CHIPIDEA USB HIGH SPEED DUAL ROLE CONTROLLER |
| 2160 | M: Peter Chen <Peter.Chen@freescale.com> | 2162 | M: Peter Chen <Peter.Chen@freescale.com> |
| 2161 | T: git://github.com/hzpeterchen/linux-usb.git | 2163 | T: git git://github.com/hzpeterchen/linux-usb.git |
| 2162 | L: linux-usb@vger.kernel.org | 2164 | L: linux-usb@vger.kernel.org |
| 2163 | S: Maintained | 2165 | S: Maintained |
| 2164 | F: drivers/usb/chipidea/ | 2166 | F: drivers/usb/chipidea/ |
| @@ -2178,9 +2180,9 @@ S: Supported | |||
| 2178 | F: drivers/net/ethernet/cisco/enic/ | 2180 | F: drivers/net/ethernet/cisco/enic/ |
| 2179 | 2181 | ||
| 2180 | CISCO VIC LOW LATENCY NIC DRIVER | 2182 | CISCO VIC LOW LATENCY NIC DRIVER |
| 2181 | M: Upinder Malhi <umalhi@cisco.com> | 2183 | M: Upinder Malhi <umalhi@cisco.com> |
| 2182 | S: Supported | 2184 | S: Supported |
| 2183 | F: drivers/infiniband/hw/usnic | 2185 | F: drivers/infiniband/hw/usnic |
| 2184 | 2186 | ||
| 2185 | CIRRUS LOGIC EP93XX ETHERNET DRIVER | 2187 | CIRRUS LOGIC EP93XX ETHERNET DRIVER |
| 2186 | M: Hartley Sweeten <hsweeten@visionengravers.com> | 2188 | M: Hartley Sweeten <hsweeten@visionengravers.com> |
| @@ -2377,20 +2379,20 @@ F: drivers/cpufreq/arm_big_little.c | |||
| 2377 | F: drivers/cpufreq/arm_big_little_dt.c | 2379 | F: drivers/cpufreq/arm_big_little_dt.c |
| 2378 | 2380 | ||
| 2379 | CPUIDLE DRIVER - ARM BIG LITTLE | 2381 | CPUIDLE DRIVER - ARM BIG LITTLE |
| 2380 | M: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> | 2382 | M: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> |
| 2381 | M: Daniel Lezcano <daniel.lezcano@linaro.org> | 2383 | M: Daniel Lezcano <daniel.lezcano@linaro.org> |
| 2382 | L: linux-pm@vger.kernel.org | 2384 | L: linux-pm@vger.kernel.org |
| 2383 | L: linux-arm-kernel@lists.infradead.org | 2385 | L: linux-arm-kernel@lists.infradead.org |
| 2384 | T: git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git | 2386 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git |
| 2385 | S: Maintained | 2387 | S: Maintained |
| 2386 | F: drivers/cpuidle/cpuidle-big_little.c | 2388 | F: drivers/cpuidle/cpuidle-big_little.c |
| 2387 | 2389 | ||
| 2388 | CPUIDLE DRIVERS | 2390 | CPUIDLE DRIVERS |
| 2389 | M: Rafael J. Wysocki <rjw@rjwysocki.net> | 2391 | M: Rafael J. Wysocki <rjw@rjwysocki.net> |
| 2390 | M: Daniel Lezcano <daniel.lezcano@linaro.org> | 2392 | M: Daniel Lezcano <daniel.lezcano@linaro.org> |
| 2391 | L: linux-pm@vger.kernel.org | 2393 | L: linux-pm@vger.kernel.org |
| 2392 | S: Maintained | 2394 | S: Maintained |
| 2393 | T: git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git | 2395 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git |
| 2394 | F: drivers/cpuidle/* | 2396 | F: drivers/cpuidle/* |
| 2395 | F: include/linux/cpuidle.h | 2397 | F: include/linux/cpuidle.h |
| 2396 | 2398 | ||
| @@ -2408,8 +2410,10 @@ F: tools/power/cpupower/ | |||
| 2408 | 2410 | ||
| 2409 | CPUSETS | 2411 | CPUSETS |
| 2410 | M: Li Zefan <lizefan@huawei.com> | 2412 | M: Li Zefan <lizefan@huawei.com> |
| 2413 | L: cgroups@vger.kernel.org | ||
| 2411 | W: http://www.bullopensource.org/cpuset/ | 2414 | W: http://www.bullopensource.org/cpuset/ |
| 2412 | W: http://oss.sgi.com/projects/cpusets/ | 2415 | W: http://oss.sgi.com/projects/cpusets/ |
| 2416 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup.git | ||
| 2413 | S: Maintained | 2417 | S: Maintained |
| 2414 | F: Documentation/cgroups/cpusets.txt | 2418 | F: Documentation/cgroups/cpusets.txt |
| 2415 | F: include/linux/cpuset.h | 2419 | F: include/linux/cpuset.h |
| @@ -2455,9 +2459,9 @@ S: Maintained | |||
| 2455 | F: sound/pci/cs5535audio/ | 2459 | F: sound/pci/cs5535audio/ |
| 2456 | 2460 | ||
| 2457 | CW1200 WLAN driver | 2461 | CW1200 WLAN driver |
| 2458 | M: Solomon Peachy <pizza@shaftnet.org> | 2462 | M: Solomon Peachy <pizza@shaftnet.org> |
| 2459 | S: Maintained | 2463 | S: Maintained |
| 2460 | F: drivers/net/wireless/cw1200/ | 2464 | F: drivers/net/wireless/cw1200/ |
| 2461 | 2465 | ||
| 2462 | CX18 VIDEO4LINUX DRIVER | 2466 | CX18 VIDEO4LINUX DRIVER |
| 2463 | M: Andy Walls <awalls@md.metrocast.net> | 2467 | M: Andy Walls <awalls@md.metrocast.net> |
| @@ -2608,9 +2612,9 @@ DC395x SCSI driver | |||
| 2608 | M: Oliver Neukum <oliver@neukum.org> | 2612 | M: Oliver Neukum <oliver@neukum.org> |
| 2609 | M: Ali Akcaagac <aliakc@web.de> | 2613 | M: Ali Akcaagac <aliakc@web.de> |
| 2610 | M: Jamie Lenehan <lenehan@twibble.org> | 2614 | M: Jamie Lenehan <lenehan@twibble.org> |
| 2611 | W: http://twibble.org/dist/dc395x/ | ||
| 2612 | L: dc395x@twibble.org | 2615 | L: dc395x@twibble.org |
| 2613 | L: http://lists.twibble.org/mailman/listinfo/dc395x/ | 2616 | W: http://twibble.org/dist/dc395x/ |
| 2617 | W: http://lists.twibble.org/mailman/listinfo/dc395x/ | ||
| 2614 | S: Maintained | 2618 | S: Maintained |
| 2615 | F: Documentation/scsi/dc395x.txt | 2619 | F: Documentation/scsi/dc395x.txt |
| 2616 | F: drivers/scsi/dc395x.* | 2620 | F: drivers/scsi/dc395x.* |
| @@ -2845,12 +2849,22 @@ F: lib/kobj* | |||
| 2845 | DRM DRIVERS | 2849 | DRM DRIVERS |
| 2846 | M: David Airlie <airlied@linux.ie> | 2850 | M: David Airlie <airlied@linux.ie> |
| 2847 | L: dri-devel@lists.freedesktop.org | 2851 | L: dri-devel@lists.freedesktop.org |
| 2848 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6.git | 2852 | T: git git://people.freedesktop.org/~airlied/linux |
| 2849 | S: Maintained | 2853 | S: Maintained |
| 2850 | F: drivers/gpu/drm/ | 2854 | F: drivers/gpu/drm/ |
| 2851 | F: include/drm/ | 2855 | F: include/drm/ |
| 2852 | F: include/uapi/drm/ | 2856 | F: include/uapi/drm/ |
| 2853 | 2857 | ||
| 2858 | RADEON DRM DRIVERS | ||
| 2859 | M: Alex Deucher <alexander.deucher@amd.com> | ||
| 2860 | M: Christian König <christian.koenig@amd.com> | ||
| 2861 | L: dri-devel@lists.freedesktop.org | ||
| 2862 | T: git git://people.freedesktop.org/~agd5f/linux | ||
| 2863 | S: Supported | ||
| 2864 | F: drivers/gpu/drm/radeon/ | ||
| 2865 | F: include/drm/radeon* | ||
| 2866 | F: include/uapi/drm/radeon* | ||
| 2867 | |||
| 2854 | INTEL DRM DRIVERS (excluding Poulsbo, Moorestown and derivative chipsets) | 2868 | INTEL DRM DRIVERS (excluding Poulsbo, Moorestown and derivative chipsets) |
| 2855 | M: Daniel Vetter <daniel.vetter@ffwll.ch> | 2869 | M: Daniel Vetter <daniel.vetter@ffwll.ch> |
| 2856 | M: Jani Nikula <jani.nikula@linux.intel.com> | 2870 | M: Jani Nikula <jani.nikula@linux.intel.com> |
| @@ -3082,6 +3096,8 @@ F: fs/ecryptfs/ | |||
| 3082 | 3096 | ||
| 3083 | EDAC-CORE | 3097 | EDAC-CORE |
| 3084 | M: Doug Thompson <dougthompson@xmission.com> | 3098 | M: Doug Thompson <dougthompson@xmission.com> |
| 3099 | M: Borislav Petkov <bp@alien8.de> | ||
| 3100 | M: Mauro Carvalho Chehab <m.chehab@samsung.com> | ||
| 3085 | L: linux-edac@vger.kernel.org | 3101 | L: linux-edac@vger.kernel.org |
| 3086 | W: bluesmoke.sourceforge.net | 3102 | W: bluesmoke.sourceforge.net |
| 3087 | S: Supported | 3103 | S: Supported |
| @@ -4902,7 +4918,7 @@ F: drivers/staging/ktap/ | |||
| 4902 | KCONFIG | 4918 | KCONFIG |
| 4903 | M: "Yann E. MORIN" <yann.morin.1998@free.fr> | 4919 | M: "Yann E. MORIN" <yann.morin.1998@free.fr> |
| 4904 | L: linux-kbuild@vger.kernel.org | 4920 | L: linux-kbuild@vger.kernel.org |
| 4905 | T: git://gitorious.org/linux-kconfig/linux-kconfig | 4921 | T: git git://gitorious.org/linux-kconfig/linux-kconfig |
| 4906 | S: Maintained | 4922 | S: Maintained |
| 4907 | F: Documentation/kbuild/kconfig-language.txt | 4923 | F: Documentation/kbuild/kconfig-language.txt |
| 4908 | F: scripts/kconfig/ | 4924 | F: scripts/kconfig/ |
| @@ -5459,11 +5475,11 @@ S: Maintained | |||
| 5459 | F: drivers/media/tuners/m88ts2022* | 5475 | F: drivers/media/tuners/m88ts2022* |
| 5460 | 5476 | ||
| 5461 | MA901 MASTERKIT USB FM RADIO DRIVER | 5477 | MA901 MASTERKIT USB FM RADIO DRIVER |
| 5462 | M: Alexey Klimov <klimov.linux@gmail.com> | 5478 | M: Alexey Klimov <klimov.linux@gmail.com> |
| 5463 | L: linux-media@vger.kernel.org | 5479 | L: linux-media@vger.kernel.org |
| 5464 | T: git git://linuxtv.org/media_tree.git | 5480 | T: git git://linuxtv.org/media_tree.git |
| 5465 | S: Maintained | 5481 | S: Maintained |
| 5466 | F: drivers/media/radio/radio-ma901.c | 5482 | F: drivers/media/radio/radio-ma901.c |
| 5467 | 5483 | ||
| 5468 | MAC80211 | 5484 | MAC80211 |
| 5469 | M: Johannes Berg <johannes@sipsolutions.net> | 5485 | M: Johannes Berg <johannes@sipsolutions.net> |
| @@ -5499,6 +5515,11 @@ W: http://www.kernel.org/doc/man-pages | |||
| 5499 | L: linux-man@vger.kernel.org | 5515 | L: linux-man@vger.kernel.org |
| 5500 | S: Maintained | 5516 | S: Maintained |
| 5501 | 5517 | ||
| 5518 | MARVELL ARMADA DRM SUPPORT | ||
| 5519 | M: Russell King <rmk+kernel@arm.linux.org.uk> | ||
| 5520 | S: Maintained | ||
| 5521 | F: drivers/gpu/drm/armada/ | ||
| 5522 | |||
| 5502 | MARVELL GIGABIT ETHERNET DRIVERS (skge/sky2) | 5523 | MARVELL GIGABIT ETHERNET DRIVERS (skge/sky2) |
| 5503 | M: Mirko Lindner <mlindner@marvell.com> | 5524 | M: Mirko Lindner <mlindner@marvell.com> |
| 5504 | M: Stephen Hemminger <stephen@networkplumber.org> | 5525 | M: Stephen Hemminger <stephen@networkplumber.org> |
| @@ -5619,7 +5640,7 @@ F: drivers/scsi/megaraid/ | |||
| 5619 | 5640 | ||
| 5620 | MELLANOX ETHERNET DRIVER (mlx4_en) | 5641 | MELLANOX ETHERNET DRIVER (mlx4_en) |
| 5621 | M: Amir Vadai <amirv@mellanox.com> | 5642 | M: Amir Vadai <amirv@mellanox.com> |
| 5622 | L: netdev@vger.kernel.org | 5643 | L: netdev@vger.kernel.org |
| 5623 | S: Supported | 5644 | S: Supported |
| 5624 | W: http://www.mellanox.com | 5645 | W: http://www.mellanox.com |
| 5625 | Q: http://patchwork.ozlabs.org/project/netdev/list/ | 5646 | Q: http://patchwork.ozlabs.org/project/netdev/list/ |
| @@ -5660,7 +5681,7 @@ F: include/linux/mtd/ | |||
| 5660 | F: include/uapi/mtd/ | 5681 | F: include/uapi/mtd/ |
| 5661 | 5682 | ||
| 5662 | MEN A21 WATCHDOG DRIVER | 5683 | MEN A21 WATCHDOG DRIVER |
| 5663 | M: Johannes Thumshirn <johannes.thumshirn@men.de> | 5684 | M: Johannes Thumshirn <johannes.thumshirn@men.de> |
| 5664 | L: linux-watchdog@vger.kernel.org | 5685 | L: linux-watchdog@vger.kernel.org |
| 5665 | S: Supported | 5686 | S: Supported |
| 5666 | F: drivers/watchdog/mena21_wdt.c | 5687 | F: drivers/watchdog/mena21_wdt.c |
| @@ -5716,20 +5737,20 @@ L: linux-rdma@vger.kernel.org | |||
| 5716 | W: http://www.mellanox.com | 5737 | W: http://www.mellanox.com |
| 5717 | Q: http://patchwork.ozlabs.org/project/netdev/list/ | 5738 | Q: http://patchwork.ozlabs.org/project/netdev/list/ |
| 5718 | Q: http://patchwork.kernel.org/project/linux-rdma/list/ | 5739 | Q: http://patchwork.kernel.org/project/linux-rdma/list/ |
| 5719 | T: git://openfabrics.org/~eli/connect-ib.git | 5740 | T: git git://openfabrics.org/~eli/connect-ib.git |
| 5720 | S: Supported | 5741 | S: Supported |
| 5721 | F: drivers/net/ethernet/mellanox/mlx5/core/ | 5742 | F: drivers/net/ethernet/mellanox/mlx5/core/ |
| 5722 | F: include/linux/mlx5/ | 5743 | F: include/linux/mlx5/ |
| 5723 | 5744 | ||
| 5724 | Mellanox MLX5 IB driver | 5745 | Mellanox MLX5 IB driver |
| 5725 | M: Eli Cohen <eli@mellanox.com> | 5746 | M: Eli Cohen <eli@mellanox.com> |
| 5726 | L: linux-rdma@vger.kernel.org | 5747 | L: linux-rdma@vger.kernel.org |
| 5727 | W: http://www.mellanox.com | 5748 | W: http://www.mellanox.com |
| 5728 | Q: http://patchwork.kernel.org/project/linux-rdma/list/ | 5749 | Q: http://patchwork.kernel.org/project/linux-rdma/list/ |
| 5729 | T: git://openfabrics.org/~eli/connect-ib.git | 5750 | T: git git://openfabrics.org/~eli/connect-ib.git |
| 5730 | S: Supported | 5751 | S: Supported |
| 5731 | F: include/linux/mlx5/ | 5752 | F: include/linux/mlx5/ |
| 5732 | F: drivers/infiniband/hw/mlx5/ | 5753 | F: drivers/infiniband/hw/mlx5/ |
| 5733 | 5754 | ||
| 5734 | MODULE SUPPORT | 5755 | MODULE SUPPORT |
| 5735 | M: Rusty Russell <rusty@rustcorp.com.au> | 5756 | M: Rusty Russell <rusty@rustcorp.com.au> |
| @@ -8441,8 +8462,8 @@ TARGET SUBSYSTEM | |||
| 8441 | M: Nicholas A. Bellinger <nab@linux-iscsi.org> | 8462 | M: Nicholas A. Bellinger <nab@linux-iscsi.org> |
| 8442 | L: linux-scsi@vger.kernel.org | 8463 | L: linux-scsi@vger.kernel.org |
| 8443 | L: target-devel@vger.kernel.org | 8464 | L: target-devel@vger.kernel.org |
| 8444 | L: http://groups.google.com/group/linux-iscsi-target-dev | ||
| 8445 | W: http://www.linux-iscsi.org | 8465 | W: http://www.linux-iscsi.org |
| 8466 | W: http://groups.google.com/group/linux-iscsi-target-dev | ||
| 8446 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending.git master | 8467 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending.git master |
| 8447 | S: Supported | 8468 | S: Supported |
| 8448 | F: drivers/target/ | 8469 | F: drivers/target/ |
| @@ -8683,17 +8704,17 @@ S: Maintained | |||
| 8683 | F: drivers/media/radio/radio-raremono.c | 8704 | F: drivers/media/radio/radio-raremono.c |
| 8684 | 8705 | ||
| 8685 | THERMAL | 8706 | THERMAL |
| 8686 | M: Zhang Rui <rui.zhang@intel.com> | 8707 | M: Zhang Rui <rui.zhang@intel.com> |
| 8687 | M: Eduardo Valentin <eduardo.valentin@ti.com> | 8708 | M: Eduardo Valentin <eduardo.valentin@ti.com> |
| 8688 | L: linux-pm@vger.kernel.org | 8709 | L: linux-pm@vger.kernel.org |
| 8689 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/rzhang/linux.git | 8710 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/rzhang/linux.git |
| 8690 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/evalenti/linux-soc-thermal.git | 8711 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/evalenti/linux-soc-thermal.git |
| 8691 | Q: https://patchwork.kernel.org/project/linux-pm/list/ | 8712 | Q: https://patchwork.kernel.org/project/linux-pm/list/ |
| 8692 | S: Supported | 8713 | S: Supported |
| 8693 | F: drivers/thermal/ | 8714 | F: drivers/thermal/ |
| 8694 | F: include/linux/thermal.h | 8715 | F: include/linux/thermal.h |
| 8695 | F: include/linux/cpu_cooling.h | 8716 | F: include/linux/cpu_cooling.h |
| 8696 | F: Documentation/devicetree/bindings/thermal/ | 8717 | F: Documentation/devicetree/bindings/thermal/ |
| 8697 | 8718 | ||
| 8698 | THINGM BLINK(1) USB RGB LED DRIVER | 8719 | THINGM BLINK(1) USB RGB LED DRIVER |
| 8699 | M: Vivien Didelot <vivien.didelot@savoirfairelinux.com> | 8720 | M: Vivien Didelot <vivien.didelot@savoirfairelinux.com> |
| @@ -9727,7 +9748,6 @@ F: drivers/xen/*swiotlb* | |||
| 9727 | XFS FILESYSTEM | 9748 | XFS FILESYSTEM |
| 9728 | P: Silicon Graphics Inc | 9749 | P: Silicon Graphics Inc |
| 9729 | M: Dave Chinner <david@fromorbit.com> | 9750 | M: Dave Chinner <david@fromorbit.com> |
| 9730 | M: Ben Myers <bpm@sgi.com> | ||
| 9731 | M: xfs@oss.sgi.com | 9751 | M: xfs@oss.sgi.com |
| 9732 | L: xfs@oss.sgi.com | 9752 | L: xfs@oss.sgi.com |
| 9733 | W: http://oss.sgi.com/projects/xfs | 9753 | W: http://oss.sgi.com/projects/xfs |
| @@ -9796,7 +9816,7 @@ ZR36067 VIDEO FOR LINUX DRIVER | |||
| 9796 | L: mjpeg-users@lists.sourceforge.net | 9816 | L: mjpeg-users@lists.sourceforge.net |
| 9797 | L: linux-media@vger.kernel.org | 9817 | L: linux-media@vger.kernel.org |
| 9798 | W: http://mjpeg.sourceforge.net/driver-zoran/ | 9818 | W: http://mjpeg.sourceforge.net/driver-zoran/ |
| 9799 | T: Mercurial http://linuxtv.org/hg/v4l-dvb | 9819 | T: hg http://linuxtv.org/hg/v4l-dvb |
| 9800 | S: Odd Fixes | 9820 | S: Odd Fixes |
| 9801 | F: drivers/media/pci/zoran/ | 9821 | F: drivers/media/pci/zoran/ |
| 9802 | 9822 | ||
| @@ -1,7 +1,7 @@ | |||
| 1 | VERSION = 3 | 1 | VERSION = 3 |
| 2 | PATCHLEVEL = 14 | 2 | PATCHLEVEL = 14 |
| 3 | SUBLEVEL = 0 | 3 | SUBLEVEL = 0 |
| 4 | EXTRAVERSION = -rc3 | 4 | EXTRAVERSION = -rc5 |
| 5 | NAME = Shuffling Zombie Juror | 5 | NAME = Shuffling Zombie Juror |
| 6 | 6 | ||
| 7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
| @@ -605,10 +605,11 @@ endif | |||
| 605 | ifdef CONFIG_CC_STACKPROTECTOR_REGULAR | 605 | ifdef CONFIG_CC_STACKPROTECTOR_REGULAR |
| 606 | stackp-flag := -fstack-protector | 606 | stackp-flag := -fstack-protector |
| 607 | ifeq ($(call cc-option, $(stackp-flag)),) | 607 | ifeq ($(call cc-option, $(stackp-flag)),) |
| 608 | $(warning Cannot use CONFIG_CC_STACKPROTECTOR: \ | 608 | $(warning Cannot use CONFIG_CC_STACKPROTECTOR_REGULAR: \ |
| 609 | -fstack-protector not supported by compiler)) | 609 | -fstack-protector not supported by compiler) |
| 610 | endif | 610 | endif |
| 611 | else ifdef CONFIG_CC_STACKPROTECTOR_STRONG | 611 | else |
| 612 | ifdef CONFIG_CC_STACKPROTECTOR_STRONG | ||
| 612 | stackp-flag := -fstack-protector-strong | 613 | stackp-flag := -fstack-protector-strong |
| 613 | ifeq ($(call cc-option, $(stackp-flag)),) | 614 | ifeq ($(call cc-option, $(stackp-flag)),) |
| 614 | $(warning Cannot use CONFIG_CC_STACKPROTECTOR_STRONG: \ | 615 | $(warning Cannot use CONFIG_CC_STACKPROTECTOR_STRONG: \ |
| @@ -618,6 +619,7 @@ else | |||
| 618 | # Force off for distro compilers that enable stack protector by default. | 619 | # Force off for distro compilers that enable stack protector by default. |
| 619 | stackp-flag := $(call cc-option, -fno-stack-protector) | 620 | stackp-flag := $(call cc-option, -fno-stack-protector) |
| 620 | endif | 621 | endif |
| 622 | endif | ||
| 621 | KBUILD_CFLAGS += $(stackp-flag) | 623 | KBUILD_CFLAGS += $(stackp-flag) |
| 622 | 624 | ||
| 623 | # This warning generated too much noise in a regular build. | 625 | # This warning generated too much noise in a regular build. |
diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile index 6d1e43d46187..032030361bef 100644 --- a/arch/arm/boot/dts/Makefile +++ b/arch/arm/boot/dts/Makefile | |||
| @@ -209,7 +209,8 @@ dtb-$(CONFIG_ARCH_OMAP2PLUS) += omap2420-h4.dtb \ | |||
| 209 | omap3-n900.dtb \ | 209 | omap3-n900.dtb \ |
| 210 | omap3-n9.dtb \ | 210 | omap3-n9.dtb \ |
| 211 | omap3-n950.dtb \ | 211 | omap3-n950.dtb \ |
| 212 | omap3-tobi.dtb \ | 212 | omap3-overo-tobi.dtb \ |
| 213 | omap3-overo-storm-tobi.dtb \ | ||
| 213 | omap3-gta04.dtb \ | 214 | omap3-gta04.dtb \ |
| 214 | omap3-igep0020.dtb \ | 215 | omap3-igep0020.dtb \ |
| 215 | omap3-igep0030.dtb \ | 216 | omap3-igep0030.dtb \ |
diff --git a/arch/arm/boot/dts/am335x-evmsk.dts b/arch/arm/boot/dts/am335x-evmsk.dts index 4718ec4a4dbf..486880b74831 100644 --- a/arch/arm/boot/dts/am335x-evmsk.dts +++ b/arch/arm/boot/dts/am335x-evmsk.dts | |||
| @@ -121,7 +121,7 @@ | |||
| 121 | ti,model = "AM335x-EVMSK"; | 121 | ti,model = "AM335x-EVMSK"; |
| 122 | ti,audio-codec = <&tlv320aic3106>; | 122 | ti,audio-codec = <&tlv320aic3106>; |
| 123 | ti,mcasp-controller = <&mcasp1>; | 123 | ti,mcasp-controller = <&mcasp1>; |
| 124 | ti,codec-clock-rate = <24576000>; | 124 | ti,codec-clock-rate = <24000000>; |
| 125 | ti,audio-routing = | 125 | ti,audio-routing = |
| 126 | "Headphone Jack", "HPLOUT", | 126 | "Headphone Jack", "HPLOUT", |
| 127 | "Headphone Jack", "HPROUT"; | 127 | "Headphone Jack", "HPROUT"; |
| @@ -256,6 +256,12 @@ | |||
| 256 | >; | 256 | >; |
| 257 | }; | 257 | }; |
| 258 | 258 | ||
| 259 | mmc1_pins: pinmux_mmc1_pins { | ||
| 260 | pinctrl-single,pins = < | ||
| 261 | 0x160 (PIN_INPUT | MUX_MODE7) /* spi0_cs1.gpio0_6 */ | ||
| 262 | >; | ||
| 263 | }; | ||
| 264 | |||
| 259 | mcasp1_pins: mcasp1_pins { | 265 | mcasp1_pins: mcasp1_pins { |
| 260 | pinctrl-single,pins = < | 266 | pinctrl-single,pins = < |
| 261 | 0x10c (PIN_INPUT_PULLDOWN | MUX_MODE4) /* mii1_crs.mcasp1_aclkx */ | 267 | 0x10c (PIN_INPUT_PULLDOWN | MUX_MODE4) /* mii1_crs.mcasp1_aclkx */ |
| @@ -456,6 +462,9 @@ | |||
| 456 | status = "okay"; | 462 | status = "okay"; |
| 457 | vmmc-supply = <&vmmc_reg>; | 463 | vmmc-supply = <&vmmc_reg>; |
| 458 | bus-width = <4>; | 464 | bus-width = <4>; |
| 465 | pinctrl-names = "default"; | ||
| 466 | pinctrl-0 = <&mmc1_pins>; | ||
| 467 | cd-gpios = <&gpio0 6 GPIO_ACTIVE_HIGH>; | ||
| 459 | }; | 468 | }; |
| 460 | 469 | ||
| 461 | &sham { | 470 | &sham { |
diff --git a/arch/arm/boot/dts/armada-xp-mv78260.dtsi b/arch/arm/boot/dts/armada-xp-mv78260.dtsi index 66609684d41b..9480cf891f8c 100644 --- a/arch/arm/boot/dts/armada-xp-mv78260.dtsi +++ b/arch/arm/boot/dts/armada-xp-mv78260.dtsi | |||
| @@ -23,6 +23,7 @@ | |||
| 23 | gpio0 = &gpio0; | 23 | gpio0 = &gpio0; |
| 24 | gpio1 = &gpio1; | 24 | gpio1 = &gpio1; |
| 25 | gpio2 = &gpio2; | 25 | gpio2 = &gpio2; |
| 26 | eth3 = ð3; | ||
| 26 | }; | 27 | }; |
| 27 | 28 | ||
| 28 | cpus { | 29 | cpus { |
| @@ -291,7 +292,7 @@ | |||
| 291 | interrupts = <91>; | 292 | interrupts = <91>; |
| 292 | }; | 293 | }; |
| 293 | 294 | ||
| 294 | ethernet@34000 { | 295 | eth3: ethernet@34000 { |
| 295 | compatible = "marvell,armada-370-neta"; | 296 | compatible = "marvell,armada-370-neta"; |
| 296 | reg = <0x34000 0x4000>; | 297 | reg = <0x34000 0x4000>; |
| 297 | interrupts = <14>; | 298 | interrupts = <14>; |
diff --git a/arch/arm/boot/dts/dove.dtsi b/arch/arm/boot/dts/dove.dtsi index 2b76524f4aa7..187fd46b7b5e 100644 --- a/arch/arm/boot/dts/dove.dtsi +++ b/arch/arm/boot/dts/dove.dtsi | |||
| @@ -379,15 +379,6 @@ | |||
| 379 | #clock-cells = <1>; | 379 | #clock-cells = <1>; |
| 380 | }; | 380 | }; |
| 381 | 381 | ||
| 382 | pmu_intc: pmu-interrupt-ctrl@d0050 { | ||
| 383 | compatible = "marvell,dove-pmu-intc"; | ||
| 384 | interrupt-controller; | ||
| 385 | #interrupt-cells = <1>; | ||
| 386 | reg = <0xd0050 0x8>; | ||
| 387 | interrupts = <33>; | ||
| 388 | marvell,#interrupts = <7>; | ||
| 389 | }; | ||
| 390 | |||
| 391 | pinctrl: pin-ctrl@d0200 { | 382 | pinctrl: pin-ctrl@d0200 { |
| 392 | compatible = "marvell,dove-pinctrl"; | 383 | compatible = "marvell,dove-pinctrl"; |
| 393 | reg = <0xd0200 0x10>; | 384 | reg = <0xd0200 0x10>; |
| @@ -610,8 +601,6 @@ | |||
| 610 | rtc: real-time-clock@d8500 { | 601 | rtc: real-time-clock@d8500 { |
| 611 | compatible = "marvell,orion-rtc"; | 602 | compatible = "marvell,orion-rtc"; |
| 612 | reg = <0xd8500 0x20>; | 603 | reg = <0xd8500 0x20>; |
| 613 | interrupt-parent = <&pmu_intc>; | ||
| 614 | interrupts = <5>; | ||
| 615 | }; | 604 | }; |
| 616 | 605 | ||
| 617 | gpio2: gpio-ctrl@e8400 { | 606 | gpio2: gpio-ctrl@e8400 { |
diff --git a/arch/arm/boot/dts/keystone-clocks.dtsi b/arch/arm/boot/dts/keystone-clocks.dtsi index 2363593e1050..ef58d1c24313 100644 --- a/arch/arm/boot/dts/keystone-clocks.dtsi +++ b/arch/arm/boot/dts/keystone-clocks.dtsi | |||
| @@ -612,7 +612,7 @@ clocks { | |||
| 612 | compatible = "ti,keystone,psc-clock"; | 612 | compatible = "ti,keystone,psc-clock"; |
| 613 | clocks = <&chipclk13>; | 613 | clocks = <&chipclk13>; |
| 614 | clock-output-names = "vcp-3"; | 614 | clock-output-names = "vcp-3"; |
| 615 | reg = <0x0235000a8 0xb00>, <0x02350060 0x400>; | 615 | reg = <0x023500a8 0xb00>, <0x02350060 0x400>; |
| 616 | reg-names = "control", "domain"; | 616 | reg-names = "control", "domain"; |
| 617 | domain-id = <24>; | 617 | domain-id = <24>; |
| 618 | }; | 618 | }; |
diff --git a/arch/arm/boot/dts/omap3-gta04.dts b/arch/arm/boot/dts/omap3-gta04.dts index b9b55c95a566..c551e4af4d83 100644 --- a/arch/arm/boot/dts/omap3-gta04.dts +++ b/arch/arm/boot/dts/omap3-gta04.dts | |||
| @@ -32,7 +32,7 @@ | |||
| 32 | aux-button { | 32 | aux-button { |
| 33 | label = "aux"; | 33 | label = "aux"; |
| 34 | linux,code = <169>; | 34 | linux,code = <169>; |
| 35 | gpios = <&gpio1 7 GPIO_ACTIVE_LOW>; | 35 | gpios = <&gpio1 7 GPIO_ACTIVE_HIGH>; |
| 36 | gpio-key,wakeup; | 36 | gpio-key,wakeup; |
| 37 | }; | 37 | }; |
| 38 | }; | 38 | }; |
| @@ -92,6 +92,8 @@ | |||
| 92 | bmp085@77 { | 92 | bmp085@77 { |
| 93 | compatible = "bosch,bmp085"; | 93 | compatible = "bosch,bmp085"; |
| 94 | reg = <0x77>; | 94 | reg = <0x77>; |
| 95 | interrupt-parent = <&gpio4>; | ||
| 96 | interrupts = <17 IRQ_TYPE_EDGE_RISING>; | ||
| 95 | }; | 97 | }; |
| 96 | 98 | ||
| 97 | /* leds */ | 99 | /* leds */ |
| @@ -141,8 +143,8 @@ | |||
| 141 | pinctrl-names = "default"; | 143 | pinctrl-names = "default"; |
| 142 | pinctrl-0 = <&mmc1_pins>; | 144 | pinctrl-0 = <&mmc1_pins>; |
| 143 | vmmc-supply = <&vmmc1>; | 145 | vmmc-supply = <&vmmc1>; |
| 144 | vmmc_aux-supply = <&vsim>; | ||
| 145 | bus-width = <4>; | 146 | bus-width = <4>; |
| 147 | ti,non-removable; | ||
| 146 | }; | 148 | }; |
| 147 | 149 | ||
| 148 | &mmc2 { | 150 | &mmc2 { |
diff --git a/arch/arm/boot/dts/omap3-n9.dts b/arch/arm/boot/dts/omap3-n9.dts index 39828ce464ee..9938b5dc1909 100644 --- a/arch/arm/boot/dts/omap3-n9.dts +++ b/arch/arm/boot/dts/omap3-n9.dts | |||
| @@ -14,5 +14,5 @@ | |||
| 14 | 14 | ||
| 15 | / { | 15 | / { |
| 16 | model = "Nokia N9"; | 16 | model = "Nokia N9"; |
| 17 | compatible = "nokia,omap3-n9", "ti,omap3"; | 17 | compatible = "nokia,omap3-n9", "ti,omap36xx", "ti,omap3"; |
| 18 | }; | 18 | }; |
diff --git a/arch/arm/boot/dts/omap3-n900.dts b/arch/arm/boot/dts/omap3-n900.dts index 6fc85f963530..0bf40c90faba 100644 --- a/arch/arm/boot/dts/omap3-n900.dts +++ b/arch/arm/boot/dts/omap3-n900.dts | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (C) 2013 Pavel Machek <pavel@ucw.cz> | 2 | * Copyright (C) 2013 Pavel Machek <pavel@ucw.cz> |
| 3 | * Copyright 2013 Aaro Koskinen <aaro.koskinen@iki.fi> | 3 | * Copyright (C) 2013-2014 Aaro Koskinen <aaro.koskinen@iki.fi> |
| 4 | * | 4 | * |
| 5 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
| 6 | * it under the terms of the GNU General Public License version 2 (or later) as | 6 | * it under the terms of the GNU General Public License version 2 (or later) as |
| @@ -13,7 +13,7 @@ | |||
| 13 | 13 | ||
| 14 | / { | 14 | / { |
| 15 | model = "Nokia N900"; | 15 | model = "Nokia N900"; |
| 16 | compatible = "nokia,omap3-n900", "ti,omap3"; | 16 | compatible = "nokia,omap3-n900", "ti,omap3430", "ti,omap3"; |
| 17 | 17 | ||
| 18 | cpus { | 18 | cpus { |
| 19 | cpu@0 { | 19 | cpu@0 { |
diff --git a/arch/arm/boot/dts/omap3-n950.dts b/arch/arm/boot/dts/omap3-n950.dts index b076a526b999..261c5589bfa3 100644 --- a/arch/arm/boot/dts/omap3-n950.dts +++ b/arch/arm/boot/dts/omap3-n950.dts | |||
| @@ -14,5 +14,5 @@ | |||
| 14 | 14 | ||
| 15 | / { | 15 | / { |
| 16 | model = "Nokia N950"; | 16 | model = "Nokia N950"; |
| 17 | compatible = "nokia,omap3-n950", "ti,omap3"; | 17 | compatible = "nokia,omap3-n950", "ti,omap36xx", "ti,omap3"; |
| 18 | }; | 18 | }; |
diff --git a/arch/arm/boot/dts/omap3-overo-storm-tobi.dts b/arch/arm/boot/dts/omap3-overo-storm-tobi.dts new file mode 100644 index 000000000000..966b5c9cd96a --- /dev/null +++ b/arch/arm/boot/dts/omap3-overo-storm-tobi.dts | |||
| @@ -0,0 +1,22 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2012 Florian Vaussard, EPFL Mobots group | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify | ||
| 5 | * it under the terms of the GNU General Public License version 2 as | ||
| 6 | * published by the Free Software Foundation. | ||
| 7 | */ | ||
| 8 | |||
| 9 | /* | ||
| 10 | * Tobi expansion board is manufactured by Gumstix Inc. | ||
| 11 | */ | ||
| 12 | |||
| 13 | /dts-v1/; | ||
| 14 | |||
| 15 | #include "omap36xx.dtsi" | ||
| 16 | #include "omap3-overo-tobi-common.dtsi" | ||
| 17 | |||
| 18 | / { | ||
| 19 | model = "OMAP36xx/AM37xx/DM37xx Gumstix Overo on Tobi"; | ||
| 20 | compatible = "gumstix,omap3-overo-tobi", "gumstix,omap3-overo", "ti,omap36xx", "ti,omap3"; | ||
| 21 | }; | ||
| 22 | |||
diff --git a/arch/arm/boot/dts/omap3-tobi.dts b/arch/arm/boot/dts/omap3-overo-tobi-common.dtsi index 7e4ad2aec37a..4edc013a91c1 100644 --- a/arch/arm/boot/dts/omap3-tobi.dts +++ b/arch/arm/boot/dts/omap3-overo-tobi-common.dtsi | |||
| @@ -13,9 +13,6 @@ | |||
| 13 | #include "omap3-overo.dtsi" | 13 | #include "omap3-overo.dtsi" |
| 14 | 14 | ||
| 15 | / { | 15 | / { |
| 16 | model = "TI OMAP3 Gumstix Overo on Tobi"; | ||
| 17 | compatible = "ti,omap3-tobi", "ti,omap3-overo", "ti,omap3"; | ||
| 18 | |||
| 19 | leds { | 16 | leds { |
| 20 | compatible = "gpio-leds"; | 17 | compatible = "gpio-leds"; |
| 21 | heartbeat { | 18 | heartbeat { |
diff --git a/arch/arm/boot/dts/omap3-overo-tobi.dts b/arch/arm/boot/dts/omap3-overo-tobi.dts new file mode 100644 index 000000000000..de5653e1b5ca --- /dev/null +++ b/arch/arm/boot/dts/omap3-overo-tobi.dts | |||
| @@ -0,0 +1,22 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2012 Florian Vaussard, EPFL Mobots group | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify | ||
| 5 | * it under the terms of the GNU General Public License version 2 as | ||
| 6 | * published by the Free Software Foundation. | ||
| 7 | */ | ||
| 8 | |||
| 9 | /* | ||
| 10 | * Tobi expansion board is manufactured by Gumstix Inc. | ||
| 11 | */ | ||
| 12 | |||
| 13 | /dts-v1/; | ||
| 14 | |||
| 15 | #include "omap34xx.dtsi" | ||
| 16 | #include "omap3-overo-tobi-common.dtsi" | ||
| 17 | |||
| 18 | / { | ||
| 19 | model = "OMAP35xx Gumstix Overo on Tobi"; | ||
| 20 | compatible = "gumstix,omap3-overo-tobi", "gumstix,omap3-overo", "ti,omap3430", "ti,omap3"; | ||
| 21 | }; | ||
| 22 | |||
diff --git a/arch/arm/boot/dts/omap3-overo.dtsi b/arch/arm/boot/dts/omap3-overo.dtsi index a461d2fd1fb0..597099907f8e 100644 --- a/arch/arm/boot/dts/omap3-overo.dtsi +++ b/arch/arm/boot/dts/omap3-overo.dtsi | |||
| @@ -9,9 +9,6 @@ | |||
| 9 | /* | 9 | /* |
| 10 | * The Gumstix Overo must be combined with an expansion board. | 10 | * The Gumstix Overo must be combined with an expansion board. |
| 11 | */ | 11 | */ |
| 12 | /dts-v1/; | ||
| 13 | |||
| 14 | #include "omap34xx.dtsi" | ||
| 15 | 12 | ||
| 16 | / { | 13 | / { |
| 17 | pwmleds { | 14 | pwmleds { |
diff --git a/arch/arm/boot/dts/tegra114.dtsi b/arch/arm/boot/dts/tegra114.dtsi index 389e987ec281..44ec401ec366 100644 --- a/arch/arm/boot/dts/tegra114.dtsi +++ b/arch/arm/boot/dts/tegra114.dtsi | |||
| @@ -57,6 +57,8 @@ | |||
| 57 | resets = <&tegra_car 27>; | 57 | resets = <&tegra_car 27>; |
| 58 | reset-names = "dc"; | 58 | reset-names = "dc"; |
| 59 | 59 | ||
| 60 | nvidia,head = <0>; | ||
| 61 | |||
| 60 | rgb { | 62 | rgb { |
| 61 | status = "disabled"; | 63 | status = "disabled"; |
| 62 | }; | 64 | }; |
| @@ -72,6 +74,8 @@ | |||
| 72 | resets = <&tegra_car 26>; | 74 | resets = <&tegra_car 26>; |
| 73 | reset-names = "dc"; | 75 | reset-names = "dc"; |
| 74 | 76 | ||
| 77 | nvidia,head = <1>; | ||
| 78 | |||
| 75 | rgb { | 79 | rgb { |
| 76 | status = "disabled"; | 80 | status = "disabled"; |
| 77 | }; | 81 | }; |
diff --git a/arch/arm/boot/dts/tegra20.dtsi b/arch/arm/boot/dts/tegra20.dtsi index 480ecda3416b..48d2a7f4d0c0 100644 --- a/arch/arm/boot/dts/tegra20.dtsi +++ b/arch/arm/boot/dts/tegra20.dtsi | |||
| @@ -94,6 +94,8 @@ | |||
| 94 | resets = <&tegra_car 27>; | 94 | resets = <&tegra_car 27>; |
| 95 | reset-names = "dc"; | 95 | reset-names = "dc"; |
| 96 | 96 | ||
| 97 | nvidia,head = <0>; | ||
| 98 | |||
| 97 | rgb { | 99 | rgb { |
| 98 | status = "disabled"; | 100 | status = "disabled"; |
| 99 | }; | 101 | }; |
| @@ -109,6 +111,8 @@ | |||
| 109 | resets = <&tegra_car 26>; | 111 | resets = <&tegra_car 26>; |
| 110 | reset-names = "dc"; | 112 | reset-names = "dc"; |
| 111 | 113 | ||
| 114 | nvidia,head = <1>; | ||
| 115 | |||
| 112 | rgb { | 116 | rgb { |
| 113 | status = "disabled"; | 117 | status = "disabled"; |
| 114 | }; | 118 | }; |
diff --git a/arch/arm/boot/dts/tegra30-cardhu.dtsi b/arch/arm/boot/dts/tegra30-cardhu.dtsi index 9104224124ee..1e156d9d0506 100644 --- a/arch/arm/boot/dts/tegra30-cardhu.dtsi +++ b/arch/arm/boot/dts/tegra30-cardhu.dtsi | |||
| @@ -28,7 +28,7 @@ | |||
| 28 | compatible = "nvidia,cardhu", "nvidia,tegra30"; | 28 | compatible = "nvidia,cardhu", "nvidia,tegra30"; |
| 29 | 29 | ||
| 30 | aliases { | 30 | aliases { |
| 31 | rtc0 = "/i2c@7000d000/tps6586x@34"; | 31 | rtc0 = "/i2c@7000d000/tps65911@2d"; |
| 32 | rtc1 = "/rtc@7000e000"; | 32 | rtc1 = "/rtc@7000e000"; |
| 33 | }; | 33 | }; |
| 34 | 34 | ||
diff --git a/arch/arm/boot/dts/tegra30.dtsi b/arch/arm/boot/dts/tegra30.dtsi index ed8e7700b46d..19a84e933f4e 100644 --- a/arch/arm/boot/dts/tegra30.dtsi +++ b/arch/arm/boot/dts/tegra30.dtsi | |||
| @@ -170,6 +170,8 @@ | |||
| 170 | resets = <&tegra_car 27>; | 170 | resets = <&tegra_car 27>; |
| 171 | reset-names = "dc"; | 171 | reset-names = "dc"; |
| 172 | 172 | ||
| 173 | nvidia,head = <0>; | ||
| 174 | |||
| 173 | rgb { | 175 | rgb { |
| 174 | status = "disabled"; | 176 | status = "disabled"; |
| 175 | }; | 177 | }; |
| @@ -185,6 +187,8 @@ | |||
| 185 | resets = <&tegra_car 26>; | 187 | resets = <&tegra_car 26>; |
| 186 | reset-names = "dc"; | 188 | reset-names = "dc"; |
| 187 | 189 | ||
| 190 | nvidia,head = <1>; | ||
| 191 | |||
| 188 | rgb { | 192 | rgb { |
| 189 | status = "disabled"; | 193 | status = "disabled"; |
| 190 | }; | 194 | }; |
diff --git a/arch/arm/boot/dts/testcases/tests.dtsi b/arch/arm/boot/dts/testcases/tests.dtsi deleted file mode 100644 index 3f123ecc9dd7..000000000000 --- a/arch/arm/boot/dts/testcases/tests.dtsi +++ /dev/null | |||
| @@ -1,2 +0,0 @@ | |||
| 1 | /include/ "tests-phandle.dtsi" | ||
| 2 | /include/ "tests-interrupts.dtsi" | ||
diff --git a/arch/arm/boot/dts/versatile-pb.dts b/arch/arm/boot/dts/versatile-pb.dts index f43907c40c93..65f657711323 100644 --- a/arch/arm/boot/dts/versatile-pb.dts +++ b/arch/arm/boot/dts/versatile-pb.dts | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /include/ "versatile-ab.dts" | 1 | #include <versatile-ab.dts> |
| 2 | 2 | ||
| 3 | / { | 3 | / { |
| 4 | model = "ARM Versatile PB"; | 4 | model = "ARM Versatile PB"; |
| @@ -47,4 +47,4 @@ | |||
| 47 | }; | 47 | }; |
| 48 | }; | 48 | }; |
| 49 | 49 | ||
| 50 | /include/ "testcases/tests.dtsi" | 50 | #include <testcases.dtsi> |
diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c index 1d8248ea5669..bd18bb8b2770 100644 --- a/arch/arm/kvm/arm.c +++ b/arch/arm/kvm/arm.c | |||
| @@ -878,7 +878,8 @@ static int hyp_init_cpu_pm_notifier(struct notifier_block *self, | |||
| 878 | unsigned long cmd, | 878 | unsigned long cmd, |
| 879 | void *v) | 879 | void *v) |
| 880 | { | 880 | { |
| 881 | if (cmd == CPU_PM_EXIT) { | 881 | if (cmd == CPU_PM_EXIT && |
| 882 | __hyp_get_vectors() == hyp_default_vectors) { | ||
| 882 | cpu_init_hyp_mode(NULL); | 883 | cpu_init_hyp_mode(NULL); |
| 883 | return NOTIFY_OK; | 884 | return NOTIFY_OK; |
| 884 | } | 885 | } |
diff --git a/arch/arm/kvm/interrupts.S b/arch/arm/kvm/interrupts.S index ddc15539bad2..0d68d4073068 100644 --- a/arch/arm/kvm/interrupts.S +++ b/arch/arm/kvm/interrupts.S | |||
| @@ -220,6 +220,10 @@ after_vfp_restore: | |||
| 220 | * in Hyp mode (see init_hyp_mode in arch/arm/kvm/arm.c). Return values are | 220 | * in Hyp mode (see init_hyp_mode in arch/arm/kvm/arm.c). Return values are |
| 221 | * passed in r0 and r1. | 221 | * passed in r0 and r1. |
| 222 | * | 222 | * |
| 223 | * A function pointer with a value of 0xffffffff has a special meaning, | ||
| 224 | * and is used to implement __hyp_get_vectors in the same way as in | ||
| 225 | * arch/arm/kernel/hyp_stub.S. | ||
| 226 | * | ||
| 223 | * The calling convention follows the standard AAPCS: | 227 | * The calling convention follows the standard AAPCS: |
| 224 | * r0 - r3: caller save | 228 | * r0 - r3: caller save |
| 225 | * r12: caller save | 229 | * r12: caller save |
| @@ -363,6 +367,11 @@ hyp_hvc: | |||
| 363 | host_switch_to_hyp: | 367 | host_switch_to_hyp: |
| 364 | pop {r0, r1, r2} | 368 | pop {r0, r1, r2} |
| 365 | 369 | ||
| 370 | /* Check for __hyp_get_vectors */ | ||
| 371 | cmp r0, #-1 | ||
| 372 | mrceq p15, 4, r0, c12, c0, 0 @ get HVBAR | ||
| 373 | beq 1f | ||
| 374 | |||
| 366 | push {lr} | 375 | push {lr} |
| 367 | mrs lr, SPSR | 376 | mrs lr, SPSR |
| 368 | push {lr} | 377 | push {lr} |
| @@ -378,7 +387,7 @@ THUMB( orr lr, #1) | |||
| 378 | pop {lr} | 387 | pop {lr} |
| 379 | msr SPSR_csxf, lr | 388 | msr SPSR_csxf, lr |
| 380 | pop {lr} | 389 | pop {lr} |
| 381 | eret | 390 | 1: eret |
| 382 | 391 | ||
| 383 | guest_trap: | 392 | guest_trap: |
| 384 | load_vcpu @ Load VCPU pointer to r0 | 393 | load_vcpu @ Load VCPU pointer to r0 |
diff --git a/arch/arm/mach-imx/Makefile b/arch/arm/mach-imx/Makefile index befcaf5d0574..ec419649320f 100644 --- a/arch/arm/mach-imx/Makefile +++ b/arch/arm/mach-imx/Makefile | |||
| @@ -101,11 +101,9 @@ obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o | |||
| 101 | obj-$(CONFIG_SOC_IMX6Q) += clk-imx6q.o mach-imx6q.o | 101 | obj-$(CONFIG_SOC_IMX6Q) += clk-imx6q.o mach-imx6q.o |
| 102 | obj-$(CONFIG_SOC_IMX6SL) += clk-imx6sl.o mach-imx6sl.o | 102 | obj-$(CONFIG_SOC_IMX6SL) += clk-imx6sl.o mach-imx6sl.o |
| 103 | 103 | ||
| 104 | ifeq ($(CONFIG_PM),y) | ||
| 105 | obj-$(CONFIG_SOC_IMX6Q) += pm-imx6q.o headsmp.o | 104 | obj-$(CONFIG_SOC_IMX6Q) += pm-imx6q.o headsmp.o |
| 106 | # i.MX6SL reuses i.MX6Q code | 105 | # i.MX6SL reuses i.MX6Q code |
| 107 | obj-$(CONFIG_SOC_IMX6SL) += pm-imx6q.o headsmp.o | 106 | obj-$(CONFIG_SOC_IMX6SL) += pm-imx6q.o headsmp.o |
| 108 | endif | ||
| 109 | 107 | ||
| 110 | # i.MX5 based machines | 108 | # i.MX5 based machines |
| 111 | obj-$(CONFIG_MACH_MX51_BABBAGE) += mach-mx51_babbage.o | 109 | obj-$(CONFIG_MACH_MX51_BABBAGE) += mach-mx51_babbage.o |
diff --git a/arch/arm/mach-imx/common.h b/arch/arm/mach-imx/common.h index 59c3b9b26bb4..baf439dc22d8 100644 --- a/arch/arm/mach-imx/common.h +++ b/arch/arm/mach-imx/common.h | |||
| @@ -144,13 +144,11 @@ void imx6q_set_chicken_bit(void); | |||
| 144 | void imx_cpu_die(unsigned int cpu); | 144 | void imx_cpu_die(unsigned int cpu); |
| 145 | int imx_cpu_kill(unsigned int cpu); | 145 | int imx_cpu_kill(unsigned int cpu); |
| 146 | 146 | ||
| 147 | #ifdef CONFIG_PM | ||
| 148 | void imx6q_pm_init(void); | 147 | void imx6q_pm_init(void); |
| 149 | void imx6q_pm_set_ccm_base(void __iomem *base); | 148 | void imx6q_pm_set_ccm_base(void __iomem *base); |
| 149 | #ifdef CONFIG_PM | ||
| 150 | void imx5_pm_init(void); | 150 | void imx5_pm_init(void); |
| 151 | #else | 151 | #else |
| 152 | static inline void imx6q_pm_init(void) {} | ||
| 153 | static inline void imx6q_pm_set_ccm_base(void __iomem *base) {} | ||
| 154 | static inline void imx5_pm_init(void) {} | 152 | static inline void imx5_pm_init(void) {} |
| 155 | #endif | 153 | #endif |
| 156 | 154 | ||
diff --git a/arch/arm/mach-omap1/board-nokia770.c b/arch/arm/mach-omap1/board-nokia770.c index 91449c5cb70f..85089d821982 100644 --- a/arch/arm/mach-omap1/board-nokia770.c +++ b/arch/arm/mach-omap1/board-nokia770.c | |||
| @@ -156,6 +156,7 @@ static struct omap_usb_config nokia770_usb_config __initdata = { | |||
| 156 | .register_dev = 1, | 156 | .register_dev = 1, |
| 157 | .hmc_mode = 16, | 157 | .hmc_mode = 16, |
| 158 | .pins[0] = 6, | 158 | .pins[0] = 6, |
| 159 | .extcon = "tahvo-usb", | ||
| 159 | }; | 160 | }; |
| 160 | 161 | ||
| 161 | #if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE) | 162 | #if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE) |
diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig index e2ce4f8366a7..0af7ca02314d 100644 --- a/arch/arm/mach-omap2/Kconfig +++ b/arch/arm/mach-omap2/Kconfig | |||
| @@ -50,6 +50,7 @@ config SOC_OMAP5 | |||
| 50 | bool "TI OMAP5" | 50 | bool "TI OMAP5" |
| 51 | depends on ARCH_MULTI_V7 | 51 | depends on ARCH_MULTI_V7 |
| 52 | select ARCH_OMAP2PLUS | 52 | select ARCH_OMAP2PLUS |
| 53 | select ARCH_HAS_OPP | ||
| 53 | select ARM_CPU_SUSPEND if PM | 54 | select ARM_CPU_SUSPEND if PM |
| 54 | select ARM_GIC | 55 | select ARM_GIC |
| 55 | select CPU_V7 | 56 | select CPU_V7 |
| @@ -63,6 +64,7 @@ config SOC_AM33XX | |||
| 63 | bool "TI AM33XX" | 64 | bool "TI AM33XX" |
| 64 | depends on ARCH_MULTI_V7 | 65 | depends on ARCH_MULTI_V7 |
| 65 | select ARCH_OMAP2PLUS | 66 | select ARCH_OMAP2PLUS |
| 67 | select ARCH_HAS_OPP | ||
| 66 | select ARM_CPU_SUSPEND if PM | 68 | select ARM_CPU_SUSPEND if PM |
| 67 | select CPU_V7 | 69 | select CPU_V7 |
| 68 | select MULTI_IRQ_HANDLER | 70 | select MULTI_IRQ_HANDLER |
| @@ -72,6 +74,7 @@ config SOC_AM43XX | |||
| 72 | depends on ARCH_MULTI_V7 | 74 | depends on ARCH_MULTI_V7 |
| 73 | select CPU_V7 | 75 | select CPU_V7 |
| 74 | select ARCH_OMAP2PLUS | 76 | select ARCH_OMAP2PLUS |
| 77 | select ARCH_HAS_OPP | ||
| 75 | select MULTI_IRQ_HANDLER | 78 | select MULTI_IRQ_HANDLER |
| 76 | select ARM_GIC | 79 | select ARM_GIC |
| 77 | select MACH_OMAP_GENERIC | 80 | select MACH_OMAP_GENERIC |
| @@ -80,6 +83,7 @@ config SOC_DRA7XX | |||
| 80 | bool "TI DRA7XX" | 83 | bool "TI DRA7XX" |
| 81 | depends on ARCH_MULTI_V7 | 84 | depends on ARCH_MULTI_V7 |
| 82 | select ARCH_OMAP2PLUS | 85 | select ARCH_OMAP2PLUS |
| 86 | select ARCH_HAS_OPP | ||
| 83 | select ARM_CPU_SUSPEND if PM | 87 | select ARM_CPU_SUSPEND if PM |
| 84 | select ARM_GIC | 88 | select ARM_GIC |
| 85 | select CPU_V7 | 89 | select CPU_V7 |
| @@ -268,9 +272,6 @@ config MACH_OMAP_3430SDP | |||
| 268 | default y | 272 | default y |
| 269 | select OMAP_PACKAGE_CBB | 273 | select OMAP_PACKAGE_CBB |
| 270 | 274 | ||
| 271 | config MACH_NOKIA_N800 | ||
| 272 | bool | ||
| 273 | |||
| 274 | config MACH_NOKIA_N810 | 275 | config MACH_NOKIA_N810 |
| 275 | bool | 276 | bool |
| 276 | 277 | ||
| @@ -281,7 +282,6 @@ config MACH_NOKIA_N8X0 | |||
| 281 | bool "Nokia N800/N810" | 282 | bool "Nokia N800/N810" |
| 282 | depends on SOC_OMAP2420 | 283 | depends on SOC_OMAP2420 |
| 283 | default y | 284 | default y |
| 284 | select MACH_NOKIA_N800 | ||
| 285 | select MACH_NOKIA_N810 | 285 | select MACH_NOKIA_N810 |
| 286 | select MACH_NOKIA_N810_WIMAX | 286 | select MACH_NOKIA_N810_WIMAX |
| 287 | select OMAP_PACKAGE_ZAC | 287 | select OMAP_PACKAGE_ZAC |
diff --git a/arch/arm/mach-omap2/gpmc.c b/arch/arm/mach-omap2/gpmc.c index d24926e6340f..ab43755364f5 100644 --- a/arch/arm/mach-omap2/gpmc.c +++ b/arch/arm/mach-omap2/gpmc.c | |||
| @@ -1339,7 +1339,7 @@ static void __maybe_unused gpmc_read_timings_dt(struct device_node *np, | |||
| 1339 | of_property_read_bool(np, "gpmc,time-para-granularity"); | 1339 | of_property_read_bool(np, "gpmc,time-para-granularity"); |
| 1340 | } | 1340 | } |
| 1341 | 1341 | ||
| 1342 | #ifdef CONFIG_MTD_NAND | 1342 | #if IS_ENABLED(CONFIG_MTD_NAND) |
| 1343 | 1343 | ||
| 1344 | static const char * const nand_xfer_types[] = { | 1344 | static const char * const nand_xfer_types[] = { |
| 1345 | [NAND_OMAP_PREFETCH_POLLED] = "prefetch-polled", | 1345 | [NAND_OMAP_PREFETCH_POLLED] = "prefetch-polled", |
| @@ -1429,7 +1429,7 @@ static int gpmc_probe_nand_child(struct platform_device *pdev, | |||
| 1429 | } | 1429 | } |
| 1430 | #endif | 1430 | #endif |
| 1431 | 1431 | ||
| 1432 | #ifdef CONFIG_MTD_ONENAND | 1432 | #if IS_ENABLED(CONFIG_MTD_ONENAND) |
| 1433 | static int gpmc_probe_onenand_child(struct platform_device *pdev, | 1433 | static int gpmc_probe_onenand_child(struct platform_device *pdev, |
| 1434 | struct device_node *child) | 1434 | struct device_node *child) |
| 1435 | { | 1435 | { |
diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c index d408b15b4fbf..af432b191255 100644 --- a/arch/arm/mach-omap2/io.c +++ b/arch/arm/mach-omap2/io.c | |||
| @@ -179,15 +179,6 @@ static struct map_desc omap34xx_io_desc[] __initdata = { | |||
| 179 | .length = L4_EMU_34XX_SIZE, | 179 | .length = L4_EMU_34XX_SIZE, |
| 180 | .type = MT_DEVICE | 180 | .type = MT_DEVICE |
| 181 | }, | 181 | }, |
| 182 | #if defined(CONFIG_DEBUG_LL) && \ | ||
| 183 | (defined(CONFIG_MACH_OMAP_ZOOM2) || defined(CONFIG_MACH_OMAP_ZOOM3)) | ||
| 184 | { | ||
| 185 | .virtual = ZOOM_UART_VIRT, | ||
| 186 | .pfn = __phys_to_pfn(ZOOM_UART_BASE), | ||
| 187 | .length = SZ_1M, | ||
| 188 | .type = MT_DEVICE | ||
| 189 | }, | ||
| 190 | #endif | ||
| 191 | }; | 182 | }; |
| 192 | #endif | 183 | #endif |
| 193 | 184 | ||
diff --git a/arch/arm/mach-pxa/mioa701.c b/arch/arm/mach-pxa/mioa701.c index f70583fee59f..29997bde277d 100644 --- a/arch/arm/mach-pxa/mioa701.c +++ b/arch/arm/mach-pxa/mioa701.c | |||
| @@ -38,6 +38,7 @@ | |||
| 38 | #include <linux/mtd/physmap.h> | 38 | #include <linux/mtd/physmap.h> |
| 39 | #include <linux/usb/gpio_vbus.h> | 39 | #include <linux/usb/gpio_vbus.h> |
| 40 | #include <linux/reboot.h> | 40 | #include <linux/reboot.h> |
| 41 | #include <linux/regulator/fixed.h> | ||
| 41 | #include <linux/regulator/max1586.h> | 42 | #include <linux/regulator/max1586.h> |
| 42 | #include <linux/slab.h> | 43 | #include <linux/slab.h> |
| 43 | #include <linux/i2c/pxa-i2c.h> | 44 | #include <linux/i2c/pxa-i2c.h> |
| @@ -714,6 +715,10 @@ static struct gpio global_gpios[] = { | |||
| 714 | { GPIO56_MT9M111_nOE, GPIOF_OUT_INIT_LOW, "Camera nOE" }, | 715 | { GPIO56_MT9M111_nOE, GPIOF_OUT_INIT_LOW, "Camera nOE" }, |
| 715 | }; | 716 | }; |
| 716 | 717 | ||
| 718 | static struct regulator_consumer_supply fixed_5v0_consumers[] = { | ||
| 719 | REGULATOR_SUPPLY("power", "pwm-backlight"), | ||
| 720 | }; | ||
| 721 | |||
| 717 | static void __init mioa701_machine_init(void) | 722 | static void __init mioa701_machine_init(void) |
| 718 | { | 723 | { |
| 719 | int rc; | 724 | int rc; |
| @@ -753,6 +758,10 @@ static void __init mioa701_machine_init(void) | |||
| 753 | pxa_set_i2c_info(&i2c_pdata); | 758 | pxa_set_i2c_info(&i2c_pdata); |
| 754 | pxa27x_set_i2c_power_info(NULL); | 759 | pxa27x_set_i2c_power_info(NULL); |
| 755 | pxa_set_camera_info(&mioa701_pxacamera_platform_data); | 760 | pxa_set_camera_info(&mioa701_pxacamera_platform_data); |
| 761 | |||
| 762 | regulator_register_always_on(0, "fixed-5.0V", fixed_5v0_consumers, | ||
| 763 | ARRAY_SIZE(fixed_5v0_consumers), | ||
| 764 | 5000000); | ||
| 756 | } | 765 | } |
| 757 | 766 | ||
| 758 | static void mioa701_machine_exit(void) | 767 | static void mioa701_machine_exit(void) |
diff --git a/arch/arm/mach-tegra/pm.c b/arch/arm/mach-tegra/pm.c index 4ae0286b468d..f55b05a29b55 100644 --- a/arch/arm/mach-tegra/pm.c +++ b/arch/arm/mach-tegra/pm.c | |||
| @@ -24,6 +24,7 @@ | |||
| 24 | #include <linux/cpu_pm.h> | 24 | #include <linux/cpu_pm.h> |
| 25 | #include <linux/suspend.h> | 25 | #include <linux/suspend.h> |
| 26 | #include <linux/err.h> | 26 | #include <linux/err.h> |
| 27 | #include <linux/slab.h> | ||
| 27 | #include <linux/clk/tegra.h> | 28 | #include <linux/clk/tegra.h> |
| 28 | 29 | ||
| 29 | #include <asm/smp_plat.h> | 30 | #include <asm/smp_plat.h> |
diff --git a/arch/arm/mach-tegra/tegra.c b/arch/arm/mach-tegra/tegra.c index 303a285d80fd..6191603379e1 100644 --- a/arch/arm/mach-tegra/tegra.c +++ b/arch/arm/mach-tegra/tegra.c | |||
| @@ -73,10 +73,20 @@ u32 tegra_uart_config[3] = { | |||
| 73 | static void __init tegra_init_cache(void) | 73 | static void __init tegra_init_cache(void) |
| 74 | { | 74 | { |
| 75 | #ifdef CONFIG_CACHE_L2X0 | 75 | #ifdef CONFIG_CACHE_L2X0 |
| 76 | static const struct of_device_id pl310_ids[] __initconst = { | ||
| 77 | { .compatible = "arm,pl310-cache", }, | ||
| 78 | {} | ||
| 79 | }; | ||
| 80 | |||
| 81 | struct device_node *np; | ||
| 76 | int ret; | 82 | int ret; |
| 77 | void __iomem *p = IO_ADDRESS(TEGRA_ARM_PERIF_BASE) + 0x3000; | 83 | void __iomem *p = IO_ADDRESS(TEGRA_ARM_PERIF_BASE) + 0x3000; |
| 78 | u32 aux_ctrl, cache_type; | 84 | u32 aux_ctrl, cache_type; |
| 79 | 85 | ||
| 86 | np = of_find_matching_node(NULL, pl310_ids); | ||
| 87 | if (!np) | ||
| 88 | return; | ||
| 89 | |||
| 80 | cache_type = readl(p + L2X0_CACHE_TYPE); | 90 | cache_type = readl(p + L2X0_CACHE_TYPE); |
| 81 | aux_ctrl = (cache_type & 0x700) << (17-8); | 91 | aux_ctrl = (cache_type & 0x700) << (17-8); |
| 82 | aux_ctrl |= 0x7C400001; | 92 | aux_ctrl |= 0x7C400001; |
diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index 1a77450e728a..11b3914660d2 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c | |||
| @@ -1358,7 +1358,7 @@ static void *arm_iommu_alloc_attrs(struct device *dev, size_t size, | |||
| 1358 | *handle = DMA_ERROR_CODE; | 1358 | *handle = DMA_ERROR_CODE; |
| 1359 | size = PAGE_ALIGN(size); | 1359 | size = PAGE_ALIGN(size); |
| 1360 | 1360 | ||
| 1361 | if (gfp & GFP_ATOMIC) | 1361 | if (!(gfp & __GFP_WAIT)) |
| 1362 | return __iommu_alloc_atomic(dev, size, handle); | 1362 | return __iommu_alloc_atomic(dev, size, handle); |
| 1363 | 1363 | ||
| 1364 | /* | 1364 | /* |
diff --git a/arch/arm64/include/asm/percpu.h b/arch/arm64/include/asm/percpu.h index 13fb0b3efc5f..453a179469a3 100644 --- a/arch/arm64/include/asm/percpu.h +++ b/arch/arm64/include/asm/percpu.h | |||
| @@ -16,6 +16,8 @@ | |||
| 16 | #ifndef __ASM_PERCPU_H | 16 | #ifndef __ASM_PERCPU_H |
| 17 | #define __ASM_PERCPU_H | 17 | #define __ASM_PERCPU_H |
| 18 | 18 | ||
| 19 | #ifdef CONFIG_SMP | ||
| 20 | |||
| 19 | static inline void set_my_cpu_offset(unsigned long off) | 21 | static inline void set_my_cpu_offset(unsigned long off) |
| 20 | { | 22 | { |
| 21 | asm volatile("msr tpidr_el1, %0" :: "r" (off) : "memory"); | 23 | asm volatile("msr tpidr_el1, %0" :: "r" (off) : "memory"); |
| @@ -36,6 +38,12 @@ static inline unsigned long __my_cpu_offset(void) | |||
| 36 | } | 38 | } |
| 37 | #define __my_cpu_offset __my_cpu_offset() | 39 | #define __my_cpu_offset __my_cpu_offset() |
| 38 | 40 | ||
| 41 | #else /* !CONFIG_SMP */ | ||
| 42 | |||
| 43 | #define set_my_cpu_offset(x) do { } while (0) | ||
| 44 | |||
| 45 | #endif /* CONFIG_SMP */ | ||
| 46 | |||
| 39 | #include <asm-generic/percpu.h> | 47 | #include <asm-generic/percpu.h> |
| 40 | 48 | ||
| 41 | #endif /* __ASM_PERCPU_H */ | 49 | #endif /* __ASM_PERCPU_H */ |
diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h index b524dcd17243..aa3917c8b623 100644 --- a/arch/arm64/include/asm/pgtable.h +++ b/arch/arm64/include/asm/pgtable.h | |||
| @@ -136,11 +136,11 @@ extern struct page *empty_zero_page; | |||
| 136 | /* | 136 | /* |
| 137 | * The following only work if pte_present(). Undefined behaviour otherwise. | 137 | * The following only work if pte_present(). Undefined behaviour otherwise. |
| 138 | */ | 138 | */ |
| 139 | #define pte_present(pte) (pte_val(pte) & (PTE_VALID | PTE_PROT_NONE)) | 139 | #define pte_present(pte) (!!(pte_val(pte) & (PTE_VALID | PTE_PROT_NONE))) |
| 140 | #define pte_dirty(pte) (pte_val(pte) & PTE_DIRTY) | 140 | #define pte_dirty(pte) (!!(pte_val(pte) & PTE_DIRTY)) |
| 141 | #define pte_young(pte) (pte_val(pte) & PTE_AF) | 141 | #define pte_young(pte) (!!(pte_val(pte) & PTE_AF)) |
| 142 | #define pte_special(pte) (pte_val(pte) & PTE_SPECIAL) | 142 | #define pte_special(pte) (!!(pte_val(pte) & PTE_SPECIAL)) |
| 143 | #define pte_write(pte) (pte_val(pte) & PTE_WRITE) | 143 | #define pte_write(pte) (!!(pte_val(pte) & PTE_WRITE)) |
| 144 | #define pte_exec(pte) (!(pte_val(pte) & PTE_UXN)) | 144 | #define pte_exec(pte) (!(pte_val(pte) & PTE_UXN)) |
| 145 | 145 | ||
| 146 | #define pte_valid_user(pte) \ | 146 | #define pte_valid_user(pte) \ |
diff --git a/arch/arm64/kernel/stacktrace.c b/arch/arm64/kernel/stacktrace.c index c3b6c63ea5fb..38f0558f0c0a 100644 --- a/arch/arm64/kernel/stacktrace.c +++ b/arch/arm64/kernel/stacktrace.c | |||
| @@ -48,7 +48,11 @@ int unwind_frame(struct stackframe *frame) | |||
| 48 | 48 | ||
| 49 | frame->sp = fp + 0x10; | 49 | frame->sp = fp + 0x10; |
| 50 | frame->fp = *(unsigned long *)(fp); | 50 | frame->fp = *(unsigned long *)(fp); |
| 51 | frame->pc = *(unsigned long *)(fp + 8); | 51 | /* |
| 52 | * -4 here because we care about the PC at time of bl, | ||
| 53 | * not where the return will go. | ||
| 54 | */ | ||
| 55 | frame->pc = *(unsigned long *)(fp + 8) - 4; | ||
| 52 | 56 | ||
| 53 | return 0; | 57 | return 0; |
| 54 | } | 58 | } |
diff --git a/arch/arm64/kvm/hyp.S b/arch/arm64/kvm/hyp.S index 3b47c36e10ff..2c56012cb2d2 100644 --- a/arch/arm64/kvm/hyp.S +++ b/arch/arm64/kvm/hyp.S | |||
| @@ -694,6 +694,24 @@ __hyp_panic_str: | |||
| 694 | 694 | ||
| 695 | .align 2 | 695 | .align 2 |
| 696 | 696 | ||
| 697 | /* | ||
| 698 | * u64 kvm_call_hyp(void *hypfn, ...); | ||
| 699 | * | ||
| 700 | * This is not really a variadic function in the classic C-way and care must | ||
| 701 | * be taken when calling this to ensure parameters are passed in registers | ||
| 702 | * only, since the stack will change between the caller and the callee. | ||
| 703 | * | ||
| 704 | * Call the function with the first argument containing a pointer to the | ||
| 705 | * function you wish to call in Hyp mode, and subsequent arguments will be | ||
| 706 | * passed as x0, x1, and x2 (a maximum of 3 arguments in addition to the | ||
| 707 | * function pointer can be passed). The function being called must be mapped | ||
| 708 | * in Hyp mode (see init_hyp_mode in arch/arm/kvm/arm.c). Return values are | ||
| 709 | * passed in r0 and r1. | ||
| 710 | * | ||
| 711 | * A function pointer with a value of 0 has a special meaning, and is | ||
| 712 | * used to implement __hyp_get_vectors in the same way as in | ||
| 713 | * arch/arm64/kernel/hyp_stub.S. | ||
| 714 | */ | ||
| 697 | ENTRY(kvm_call_hyp) | 715 | ENTRY(kvm_call_hyp) |
| 698 | hvc #0 | 716 | hvc #0 |
| 699 | ret | 717 | ret |
| @@ -737,7 +755,12 @@ el1_sync: // Guest trapped into EL2 | |||
| 737 | pop x2, x3 | 755 | pop x2, x3 |
| 738 | pop x0, x1 | 756 | pop x0, x1 |
| 739 | 757 | ||
| 740 | push lr, xzr | 758 | /* Check for __hyp_get_vectors */ |
| 759 | cbnz x0, 1f | ||
| 760 | mrs x0, vbar_el2 | ||
| 761 | b 2f | ||
| 762 | |||
| 763 | 1: push lr, xzr | ||
| 741 | 764 | ||
| 742 | /* | 765 | /* |
| 743 | * Compute the function address in EL2, and shuffle the parameters. | 766 | * Compute the function address in EL2, and shuffle the parameters. |
| @@ -750,7 +773,7 @@ el1_sync: // Guest trapped into EL2 | |||
| 750 | blr lr | 773 | blr lr |
| 751 | 774 | ||
| 752 | pop lr, xzr | 775 | pop lr, xzr |
| 753 | eret | 776 | 2: eret |
| 754 | 777 | ||
| 755 | el1_trap: | 778 | el1_trap: |
| 756 | /* | 779 | /* |
diff --git a/arch/m68k/include/asm/Kbuild b/arch/m68k/include/asm/Kbuild index 7cc8c364924d..6fb9e813a910 100644 --- a/arch/m68k/include/asm/Kbuild +++ b/arch/m68k/include/asm/Kbuild | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | 1 | generic-y += barrier.h | |
| 2 | generic-y += bitsperlong.h | 2 | generic-y += bitsperlong.h |
| 3 | generic-y += clkdev.h | 3 | generic-y += clkdev.h |
| 4 | generic-y += cputime.h | 4 | generic-y += cputime.h |
| @@ -6,6 +6,7 @@ generic-y += device.h | |||
| 6 | generic-y += emergency-restart.h | 6 | generic-y += emergency-restart.h |
| 7 | generic-y += errno.h | 7 | generic-y += errno.h |
| 8 | generic-y += exec.h | 8 | generic-y += exec.h |
| 9 | generic-y += hash.h | ||
| 9 | generic-y += hw_irq.h | 10 | generic-y += hw_irq.h |
| 10 | generic-y += ioctl.h | 11 | generic-y += ioctl.h |
| 11 | generic-y += ipcbuf.h | 12 | generic-y += ipcbuf.h |
| @@ -18,6 +19,7 @@ generic-y += local.h | |||
| 18 | generic-y += mman.h | 19 | generic-y += mman.h |
| 19 | generic-y += mutex.h | 20 | generic-y += mutex.h |
| 20 | generic-y += percpu.h | 21 | generic-y += percpu.h |
| 22 | generic-y += preempt.h | ||
| 21 | generic-y += resource.h | 23 | generic-y += resource.h |
| 22 | generic-y += scatterlist.h | 24 | generic-y += scatterlist.h |
| 23 | generic-y += sections.h | 25 | generic-y += sections.h |
| @@ -31,5 +33,3 @@ generic-y += trace_clock.h | |||
| 31 | generic-y += types.h | 33 | generic-y += types.h |
| 32 | generic-y += word-at-a-time.h | 34 | generic-y += word-at-a-time.h |
| 33 | generic-y += xor.h | 35 | generic-y += xor.h |
| 34 | generic-y += preempt.h | ||
| 35 | generic-y += hash.h | ||
diff --git a/arch/m68k/include/asm/barrier.h b/arch/m68k/include/asm/barrier.h deleted file mode 100644 index 15c5f77c1614..000000000000 --- a/arch/m68k/include/asm/barrier.h +++ /dev/null | |||
| @@ -1,8 +0,0 @@ | |||
| 1 | #ifndef _M68K_BARRIER_H | ||
| 2 | #define _M68K_BARRIER_H | ||
| 3 | |||
| 4 | #define nop() do { asm volatile ("nop"); barrier(); } while (0) | ||
| 5 | |||
| 6 | #include <asm-generic/barrier.h> | ||
| 7 | |||
| 8 | #endif /* _M68K_BARRIER_H */ | ||
diff --git a/arch/m68k/include/asm/unistd.h b/arch/m68k/include/asm/unistd.h index 014f288fc813..9d38b73989eb 100644 --- a/arch/m68k/include/asm/unistd.h +++ b/arch/m68k/include/asm/unistd.h | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | #include <uapi/asm/unistd.h> | 4 | #include <uapi/asm/unistd.h> |
| 5 | 5 | ||
| 6 | 6 | ||
| 7 | #define NR_syscalls 349 | 7 | #define NR_syscalls 351 |
| 8 | 8 | ||
| 9 | #define __ARCH_WANT_OLD_READDIR | 9 | #define __ARCH_WANT_OLD_READDIR |
| 10 | #define __ARCH_WANT_OLD_STAT | 10 | #define __ARCH_WANT_OLD_STAT |
diff --git a/arch/m68k/include/uapi/asm/unistd.h b/arch/m68k/include/uapi/asm/unistd.h index 625f321001dc..b932dd470041 100644 --- a/arch/m68k/include/uapi/asm/unistd.h +++ b/arch/m68k/include/uapi/asm/unistd.h | |||
| @@ -354,5 +354,7 @@ | |||
| 354 | #define __NR_process_vm_writev 346 | 354 | #define __NR_process_vm_writev 346 |
| 355 | #define __NR_kcmp 347 | 355 | #define __NR_kcmp 347 |
| 356 | #define __NR_finit_module 348 | 356 | #define __NR_finit_module 348 |
| 357 | #define __NR_sched_setattr 349 | ||
| 358 | #define __NR_sched_getattr 350 | ||
| 357 | 359 | ||
| 358 | #endif /* _UAPI_ASM_M68K_UNISTD_H_ */ | 360 | #endif /* _UAPI_ASM_M68K_UNISTD_H_ */ |
diff --git a/arch/m68k/kernel/syscalltable.S b/arch/m68k/kernel/syscalltable.S index 3f04ea0ab802..b6223dc41d82 100644 --- a/arch/m68k/kernel/syscalltable.S +++ b/arch/m68k/kernel/syscalltable.S | |||
| @@ -369,4 +369,6 @@ ENTRY(sys_call_table) | |||
| 369 | .long sys_process_vm_writev | 369 | .long sys_process_vm_writev |
| 370 | .long sys_kcmp | 370 | .long sys_kcmp |
| 371 | .long sys_finit_module | 371 | .long sys_finit_module |
| 372 | .long sys_sched_setattr | ||
| 373 | .long sys_sched_getattr /* 350 */ | ||
| 372 | 374 | ||
diff --git a/arch/powerpc/include/asm/compat.h b/arch/powerpc/include/asm/compat.h index 84fdf6857c31..a613d2c82fd9 100644 --- a/arch/powerpc/include/asm/compat.h +++ b/arch/powerpc/include/asm/compat.h | |||
| @@ -200,10 +200,11 @@ static inline void __user *arch_compat_alloc_user_space(long len) | |||
| 200 | 200 | ||
| 201 | /* | 201 | /* |
| 202 | * We can't access below the stack pointer in the 32bit ABI and | 202 | * We can't access below the stack pointer in the 32bit ABI and |
| 203 | * can access 288 bytes in the 64bit ABI | 203 | * can access 288 bytes in the 64bit big-endian ABI, |
| 204 | * or 512 bytes with the new ELFv2 little-endian ABI. | ||
| 204 | */ | 205 | */ |
| 205 | if (!is_32bit_task()) | 206 | if (!is_32bit_task()) |
| 206 | usp -= 288; | 207 | usp -= USER_REDZONE_SIZE; |
| 207 | 208 | ||
| 208 | return (void __user *) (usp - len); | 209 | return (void __user *) (usp - len); |
| 209 | } | 210 | } |
diff --git a/arch/powerpc/include/asm/opal.h b/arch/powerpc/include/asm/opal.h index 40157e2ca691..ed82142a3251 100644 --- a/arch/powerpc/include/asm/opal.h +++ b/arch/powerpc/include/asm/opal.h | |||
| @@ -816,8 +816,8 @@ int64_t opal_pci_next_error(uint64_t phb_id, uint64_t *first_frozen_pe, | |||
| 816 | int64_t opal_pci_poll(uint64_t phb_id); | 816 | int64_t opal_pci_poll(uint64_t phb_id); |
| 817 | int64_t opal_return_cpu(void); | 817 | int64_t opal_return_cpu(void); |
| 818 | 818 | ||
| 819 | int64_t opal_xscom_read(uint32_t gcid, uint32_t pcb_addr, __be64 *val); | 819 | int64_t opal_xscom_read(uint32_t gcid, uint64_t pcb_addr, __be64 *val); |
| 820 | int64_t opal_xscom_write(uint32_t gcid, uint32_t pcb_addr, uint64_t val); | 820 | int64_t opal_xscom_write(uint32_t gcid, uint64_t pcb_addr, uint64_t val); |
| 821 | 821 | ||
| 822 | int64_t opal_lpc_write(uint32_t chip_id, enum OpalLPCAddressType addr_type, | 822 | int64_t opal_lpc_write(uint32_t chip_id, enum OpalLPCAddressType addr_type, |
| 823 | uint32_t addr, uint32_t data, uint32_t sz); | 823 | uint32_t addr, uint32_t data, uint32_t sz); |
diff --git a/arch/powerpc/include/asm/ptrace.h b/arch/powerpc/include/asm/ptrace.h index becc08e6a65c..279b80f3bb29 100644 --- a/arch/powerpc/include/asm/ptrace.h +++ b/arch/powerpc/include/asm/ptrace.h | |||
| @@ -28,11 +28,23 @@ | |||
| 28 | 28 | ||
| 29 | #ifdef __powerpc64__ | 29 | #ifdef __powerpc64__ |
| 30 | 30 | ||
| 31 | /* | ||
| 32 | * Size of redzone that userspace is allowed to use below the stack | ||
| 33 | * pointer. This is 288 in the 64-bit big-endian ELF ABI, and 512 in | ||
| 34 | * the new ELFv2 little-endian ABI, so we allow the larger amount. | ||
| 35 | * | ||
| 36 | * For kernel code we allow a 288-byte redzone, in order to conserve | ||
| 37 | * kernel stack space; gcc currently only uses 288 bytes, and will | ||
| 38 | * hopefully allow explicit control of the redzone size in future. | ||
| 39 | */ | ||
| 40 | #define USER_REDZONE_SIZE 512 | ||
| 41 | #define KERNEL_REDZONE_SIZE 288 | ||
| 42 | |||
| 31 | #define STACK_FRAME_OVERHEAD 112 /* size of minimum stack frame */ | 43 | #define STACK_FRAME_OVERHEAD 112 /* size of minimum stack frame */ |
| 32 | #define STACK_FRAME_LR_SAVE 2 /* Location of LR in stack frame */ | 44 | #define STACK_FRAME_LR_SAVE 2 /* Location of LR in stack frame */ |
| 33 | #define STACK_FRAME_REGS_MARKER ASM_CONST(0x7265677368657265) | 45 | #define STACK_FRAME_REGS_MARKER ASM_CONST(0x7265677368657265) |
| 34 | #define STACK_INT_FRAME_SIZE (sizeof(struct pt_regs) + \ | 46 | #define STACK_INT_FRAME_SIZE (sizeof(struct pt_regs) + \ |
| 35 | STACK_FRAME_OVERHEAD + 288) | 47 | STACK_FRAME_OVERHEAD + KERNEL_REDZONE_SIZE) |
| 36 | #define STACK_FRAME_MARKER 12 | 48 | #define STACK_FRAME_MARKER 12 |
| 37 | 49 | ||
| 38 | /* Size of dummy stack frame allocated when calling signal handler. */ | 50 | /* Size of dummy stack frame allocated when calling signal handler. */ |
| @@ -41,6 +53,8 @@ | |||
| 41 | 53 | ||
| 42 | #else /* __powerpc64__ */ | 54 | #else /* __powerpc64__ */ |
| 43 | 55 | ||
| 56 | #define USER_REDZONE_SIZE 0 | ||
| 57 | #define KERNEL_REDZONE_SIZE 0 | ||
| 44 | #define STACK_FRAME_OVERHEAD 16 /* size of minimum stack frame */ | 58 | #define STACK_FRAME_OVERHEAD 16 /* size of minimum stack frame */ |
| 45 | #define STACK_FRAME_LR_SAVE 1 /* Location of LR in stack frame */ | 59 | #define STACK_FRAME_LR_SAVE 1 /* Location of LR in stack frame */ |
| 46 | #define STACK_FRAME_REGS_MARKER ASM_CONST(0x72656773) | 60 | #define STACK_FRAME_REGS_MARKER ASM_CONST(0x72656773) |
diff --git a/arch/powerpc/kernel/crash_dump.c b/arch/powerpc/kernel/crash_dump.c index 11c1d069d920..7a13f378ca2c 100644 --- a/arch/powerpc/kernel/crash_dump.c +++ b/arch/powerpc/kernel/crash_dump.c | |||
| @@ -98,17 +98,19 @@ ssize_t copy_oldmem_page(unsigned long pfn, char *buf, | |||
| 98 | size_t csize, unsigned long offset, int userbuf) | 98 | size_t csize, unsigned long offset, int userbuf) |
| 99 | { | 99 | { |
| 100 | void *vaddr; | 100 | void *vaddr; |
| 101 | phys_addr_t paddr; | ||
| 101 | 102 | ||
| 102 | if (!csize) | 103 | if (!csize) |
| 103 | return 0; | 104 | return 0; |
| 104 | 105 | ||
| 105 | csize = min_t(size_t, csize, PAGE_SIZE); | 106 | csize = min_t(size_t, csize, PAGE_SIZE); |
| 107 | paddr = pfn << PAGE_SHIFT; | ||
| 106 | 108 | ||
| 107 | if ((min_low_pfn < pfn) && (pfn < max_pfn)) { | 109 | if (memblock_is_region_memory(paddr, csize)) { |
| 108 | vaddr = __va(pfn << PAGE_SHIFT); | 110 | vaddr = __va(paddr); |
| 109 | csize = copy_oldmem_vaddr(vaddr, buf, csize, offset, userbuf); | 111 | csize = copy_oldmem_vaddr(vaddr, buf, csize, offset, userbuf); |
| 110 | } else { | 112 | } else { |
| 111 | vaddr = __ioremap(pfn << PAGE_SHIFT, PAGE_SIZE, 0); | 113 | vaddr = __ioremap(paddr, PAGE_SIZE, 0); |
| 112 | csize = copy_oldmem_vaddr(vaddr, buf, csize, offset, userbuf); | 114 | csize = copy_oldmem_vaddr(vaddr, buf, csize, offset, userbuf); |
| 113 | iounmap(vaddr); | 115 | iounmap(vaddr); |
| 114 | } | 116 | } |
diff --git a/arch/powerpc/kernel/ftrace.c b/arch/powerpc/kernel/ftrace.c index 9b27b293a922..b0ded97ee4e1 100644 --- a/arch/powerpc/kernel/ftrace.c +++ b/arch/powerpc/kernel/ftrace.c | |||
| @@ -74,6 +74,7 @@ ftrace_modify_code(unsigned long ip, unsigned int old, unsigned int new) | |||
| 74 | */ | 74 | */ |
| 75 | static int test_24bit_addr(unsigned long ip, unsigned long addr) | 75 | static int test_24bit_addr(unsigned long ip, unsigned long addr) |
| 76 | { | 76 | { |
| 77 | addr = ppc_function_entry((void *)addr); | ||
| 77 | 78 | ||
| 78 | /* use the create_branch to verify that this offset can be branched */ | 79 | /* use the create_branch to verify that this offset can be branched */ |
| 79 | return create_branch((unsigned int *)ip, addr, 0); | 80 | return create_branch((unsigned int *)ip, addr, 0); |
diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c index e35bf773df7a..8d253c29649b 100644 --- a/arch/powerpc/kernel/signal_64.c +++ b/arch/powerpc/kernel/signal_64.c | |||
| @@ -65,8 +65,8 @@ struct rt_sigframe { | |||
| 65 | struct siginfo __user *pinfo; | 65 | struct siginfo __user *pinfo; |
| 66 | void __user *puc; | 66 | void __user *puc; |
| 67 | struct siginfo info; | 67 | struct siginfo info; |
| 68 | /* 64 bit ABI allows for 288 bytes below sp before decrementing it. */ | 68 | /* New 64 bit little-endian ABI allows redzone of 512 bytes below sp */ |
| 69 | char abigap[288]; | 69 | char abigap[USER_REDZONE_SIZE]; |
| 70 | } __attribute__ ((aligned (16))); | 70 | } __attribute__ ((aligned (16))); |
| 71 | 71 | ||
| 72 | static const char fmt32[] = KERN_INFO \ | 72 | static const char fmt32[] = KERN_INFO \ |
diff --git a/arch/powerpc/platforms/powernv/eeh-ioda.c b/arch/powerpc/platforms/powernv/eeh-ioda.c index f51474336460..253fefe3d1a0 100644 --- a/arch/powerpc/platforms/powernv/eeh-ioda.c +++ b/arch/powerpc/platforms/powernv/eeh-ioda.c | |||
| @@ -114,6 +114,7 @@ DEFINE_SIMPLE_ATTRIBUTE(ioda_eeh_inbB_dbgfs_ops, ioda_eeh_inbB_dbgfs_get, | |||
| 114 | ioda_eeh_inbB_dbgfs_set, "0x%llx\n"); | 114 | ioda_eeh_inbB_dbgfs_set, "0x%llx\n"); |
| 115 | #endif /* CONFIG_DEBUG_FS */ | 115 | #endif /* CONFIG_DEBUG_FS */ |
| 116 | 116 | ||
| 117 | |||
| 117 | /** | 118 | /** |
| 118 | * ioda_eeh_post_init - Chip dependent post initialization | 119 | * ioda_eeh_post_init - Chip dependent post initialization |
| 119 | * @hose: PCI controller | 120 | * @hose: PCI controller |
| @@ -221,6 +222,22 @@ static int ioda_eeh_set_option(struct eeh_pe *pe, int option) | |||
| 221 | return ret; | 222 | return ret; |
| 222 | } | 223 | } |
| 223 | 224 | ||
| 225 | static void ioda_eeh_phb_diag(struct pci_controller *hose) | ||
| 226 | { | ||
| 227 | struct pnv_phb *phb = hose->private_data; | ||
| 228 | long rc; | ||
| 229 | |||
| 230 | rc = opal_pci_get_phb_diag_data2(phb->opal_id, phb->diag.blob, | ||
| 231 | PNV_PCI_DIAG_BUF_SIZE); | ||
| 232 | if (rc != OPAL_SUCCESS) { | ||
| 233 | pr_warning("%s: Failed to get diag-data for PHB#%x (%ld)\n", | ||
| 234 | __func__, hose->global_number, rc); | ||
| 235 | return; | ||
| 236 | } | ||
| 237 | |||
| 238 | pnv_pci_dump_phb_diag_data(hose, phb->diag.blob); | ||
| 239 | } | ||
| 240 | |||
| 224 | /** | 241 | /** |
| 225 | * ioda_eeh_get_state - Retrieve the state of PE | 242 | * ioda_eeh_get_state - Retrieve the state of PE |
| 226 | * @pe: EEH PE | 243 | * @pe: EEH PE |
| @@ -272,6 +289,9 @@ static int ioda_eeh_get_state(struct eeh_pe *pe) | |||
| 272 | result |= EEH_STATE_DMA_ACTIVE; | 289 | result |= EEH_STATE_DMA_ACTIVE; |
| 273 | result |= EEH_STATE_MMIO_ENABLED; | 290 | result |= EEH_STATE_MMIO_ENABLED; |
| 274 | result |= EEH_STATE_DMA_ENABLED; | 291 | result |= EEH_STATE_DMA_ENABLED; |
| 292 | } else if (!(pe->state & EEH_PE_ISOLATED)) { | ||
| 293 | eeh_pe_state_mark(pe, EEH_PE_ISOLATED); | ||
| 294 | ioda_eeh_phb_diag(hose); | ||
| 275 | } | 295 | } |
| 276 | 296 | ||
| 277 | return result; | 297 | return result; |
| @@ -315,6 +335,15 @@ static int ioda_eeh_get_state(struct eeh_pe *pe) | |||
| 315 | __func__, fstate, hose->global_number, pe_no); | 335 | __func__, fstate, hose->global_number, pe_no); |
| 316 | } | 336 | } |
| 317 | 337 | ||
| 338 | /* Dump PHB diag-data for frozen PE */ | ||
| 339 | if (result != EEH_STATE_NOT_SUPPORT && | ||
| 340 | (result & (EEH_STATE_MMIO_ACTIVE | EEH_STATE_DMA_ACTIVE)) != | ||
| 341 | (EEH_STATE_MMIO_ACTIVE | EEH_STATE_DMA_ACTIVE) && | ||
| 342 | !(pe->state & EEH_PE_ISOLATED)) { | ||
| 343 | eeh_pe_state_mark(pe, EEH_PE_ISOLATED); | ||
| 344 | ioda_eeh_phb_diag(hose); | ||
| 345 | } | ||
| 346 | |||
| 318 | return result; | 347 | return result; |
| 319 | } | 348 | } |
| 320 | 349 | ||
| @@ -530,42 +559,6 @@ static int ioda_eeh_reset(struct eeh_pe *pe, int option) | |||
| 530 | } | 559 | } |
| 531 | 560 | ||
| 532 | /** | 561 | /** |
| 533 | * ioda_eeh_get_log - Retrieve error log | ||
| 534 | * @pe: EEH PE | ||
| 535 | * @severity: Severity level of the log | ||
| 536 | * @drv_log: buffer to store the log | ||
| 537 | * @len: space of the log buffer | ||
| 538 | * | ||
| 539 | * The function is used to retrieve error log from P7IOC. | ||
| 540 | */ | ||
| 541 | static int ioda_eeh_get_log(struct eeh_pe *pe, int severity, | ||
| 542 | char *drv_log, unsigned long len) | ||
| 543 | { | ||
| 544 | s64 ret; | ||
| 545 | unsigned long flags; | ||
| 546 | struct pci_controller *hose = pe->phb; | ||
| 547 | struct pnv_phb *phb = hose->private_data; | ||
| 548 | |||
| 549 | spin_lock_irqsave(&phb->lock, flags); | ||
| 550 | |||
| 551 | ret = opal_pci_get_phb_diag_data2(phb->opal_id, | ||
| 552 | phb->diag.blob, PNV_PCI_DIAG_BUF_SIZE); | ||
| 553 | if (ret) { | ||
| 554 | spin_unlock_irqrestore(&phb->lock, flags); | ||
| 555 | pr_warning("%s: Can't get log for PHB#%x-PE#%x (%lld)\n", | ||
| 556 | __func__, hose->global_number, pe->addr, ret); | ||
| 557 | return -EIO; | ||
| 558 | } | ||
| 559 | |||
| 560 | /* The PHB diag-data is always indicative */ | ||
| 561 | pnv_pci_dump_phb_diag_data(hose, phb->diag.blob); | ||
| 562 | |||
| 563 | spin_unlock_irqrestore(&phb->lock, flags); | ||
| 564 | |||
| 565 | return 0; | ||
| 566 | } | ||
| 567 | |||
| 568 | /** | ||
| 569 | * ioda_eeh_configure_bridge - Configure the PCI bridges for the indicated PE | 562 | * ioda_eeh_configure_bridge - Configure the PCI bridges for the indicated PE |
| 570 | * @pe: EEH PE | 563 | * @pe: EEH PE |
| 571 | * | 564 | * |
| @@ -646,22 +639,6 @@ static void ioda_eeh_hub_diag(struct pci_controller *hose) | |||
| 646 | } | 639 | } |
| 647 | } | 640 | } |
| 648 | 641 | ||
| 649 | static void ioda_eeh_phb_diag(struct pci_controller *hose) | ||
| 650 | { | ||
| 651 | struct pnv_phb *phb = hose->private_data; | ||
| 652 | long rc; | ||
| 653 | |||
| 654 | rc = opal_pci_get_phb_diag_data2(phb->opal_id, phb->diag.blob, | ||
| 655 | PNV_PCI_DIAG_BUF_SIZE); | ||
| 656 | if (rc != OPAL_SUCCESS) { | ||
| 657 | pr_warning("%s: Failed to get diag-data for PHB#%x (%ld)\n", | ||
| 658 | __func__, hose->global_number, rc); | ||
| 659 | return; | ||
| 660 | } | ||
| 661 | |||
| 662 | pnv_pci_dump_phb_diag_data(hose, phb->diag.blob); | ||
| 663 | } | ||
| 664 | |||
| 665 | static int ioda_eeh_get_phb_pe(struct pci_controller *hose, | 642 | static int ioda_eeh_get_phb_pe(struct pci_controller *hose, |
| 666 | struct eeh_pe **pe) | 643 | struct eeh_pe **pe) |
| 667 | { | 644 | { |
| @@ -835,6 +812,20 @@ static int ioda_eeh_next_error(struct eeh_pe **pe) | |||
| 835 | } | 812 | } |
| 836 | 813 | ||
| 837 | /* | 814 | /* |
| 815 | * EEH core will try recover from fenced PHB or | ||
| 816 | * frozen PE. In the time for frozen PE, EEH core | ||
| 817 | * enable IO path for that before collecting logs, | ||
| 818 | * but it ruins the site. So we have to dump the | ||
| 819 | * log in advance here. | ||
| 820 | */ | ||
| 821 | if ((ret == EEH_NEXT_ERR_FROZEN_PE || | ||
| 822 | ret == EEH_NEXT_ERR_FENCED_PHB) && | ||
| 823 | !((*pe)->state & EEH_PE_ISOLATED)) { | ||
| 824 | eeh_pe_state_mark(*pe, EEH_PE_ISOLATED); | ||
| 825 | ioda_eeh_phb_diag(hose); | ||
| 826 | } | ||
| 827 | |||
| 828 | /* | ||
| 838 | * If we have no errors on the specific PHB or only | 829 | * If we have no errors on the specific PHB or only |
| 839 | * informative error there, we continue poking it. | 830 | * informative error there, we continue poking it. |
| 840 | * Otherwise, we need actions to be taken by upper | 831 | * Otherwise, we need actions to be taken by upper |
| @@ -852,7 +843,6 @@ struct pnv_eeh_ops ioda_eeh_ops = { | |||
| 852 | .set_option = ioda_eeh_set_option, | 843 | .set_option = ioda_eeh_set_option, |
| 853 | .get_state = ioda_eeh_get_state, | 844 | .get_state = ioda_eeh_get_state, |
| 854 | .reset = ioda_eeh_reset, | 845 | .reset = ioda_eeh_reset, |
| 855 | .get_log = ioda_eeh_get_log, | ||
| 856 | .configure_bridge = ioda_eeh_configure_bridge, | 846 | .configure_bridge = ioda_eeh_configure_bridge, |
| 857 | .next_error = ioda_eeh_next_error | 847 | .next_error = ioda_eeh_next_error |
| 858 | }; | 848 | }; |
diff --git a/arch/powerpc/platforms/powernv/opal-xscom.c b/arch/powerpc/platforms/powernv/opal-xscom.c index 4fbf276ac99e..4cd2ea6c0dbe 100644 --- a/arch/powerpc/platforms/powernv/opal-xscom.c +++ b/arch/powerpc/platforms/powernv/opal-xscom.c | |||
| @@ -71,11 +71,11 @@ static int opal_xscom_err_xlate(int64_t rc) | |||
| 71 | } | 71 | } |
| 72 | } | 72 | } |
| 73 | 73 | ||
| 74 | static u64 opal_scom_unmangle(u64 reg) | 74 | static u64 opal_scom_unmangle(u64 addr) |
| 75 | { | 75 | { |
| 76 | /* | 76 | /* |
| 77 | * XSCOM indirect addresses have the top bit set. Additionally | 77 | * XSCOM indirect addresses have the top bit set. Additionally |
| 78 | * the reset of the top 3 nibbles is always 0. | 78 | * the rest of the top 3 nibbles is always 0. |
| 79 | * | 79 | * |
| 80 | * Because the debugfs interface uses signed offsets and shifts | 80 | * Because the debugfs interface uses signed offsets and shifts |
| 81 | * the address left by 3, we basically cannot use the top 4 bits | 81 | * the address left by 3, we basically cannot use the top 4 bits |
| @@ -86,10 +86,13 @@ static u64 opal_scom_unmangle(u64 reg) | |||
| 86 | * conversion here. To leave room for further xscom address | 86 | * conversion here. To leave room for further xscom address |
| 87 | * expansion, we only clear out the top byte | 87 | * expansion, we only clear out the top byte |
| 88 | * | 88 | * |
| 89 | * For in-kernel use, we also support the real indirect bit, so | ||
| 90 | * we test for any of the top 5 bits | ||
| 91 | * | ||
| 89 | */ | 92 | */ |
| 90 | if (reg & (1ull << 59)) | 93 | if (addr & (0x1full << 59)) |
| 91 | reg = (reg & ~(0xffull << 56)) | (1ull << 63); | 94 | addr = (addr & ~(0xffull << 56)) | (1ull << 63); |
| 92 | return reg; | 95 | return addr; |
| 93 | } | 96 | } |
| 94 | 97 | ||
| 95 | static int opal_scom_read(scom_map_t map, u64 reg, u64 *value) | 98 | static int opal_scom_read(scom_map_t map, u64 reg, u64 *value) |
| @@ -98,8 +101,8 @@ static int opal_scom_read(scom_map_t map, u64 reg, u64 *value) | |||
| 98 | int64_t rc; | 101 | int64_t rc; |
| 99 | __be64 v; | 102 | __be64 v; |
| 100 | 103 | ||
| 101 | reg = opal_scom_unmangle(reg); | 104 | reg = opal_scom_unmangle(m->addr + reg); |
| 102 | rc = opal_xscom_read(m->chip, m->addr + reg, (__be64 *)__pa(&v)); | 105 | rc = opal_xscom_read(m->chip, reg, (__be64 *)__pa(&v)); |
| 103 | *value = be64_to_cpu(v); | 106 | *value = be64_to_cpu(v); |
| 104 | return opal_xscom_err_xlate(rc); | 107 | return opal_xscom_err_xlate(rc); |
| 105 | } | 108 | } |
| @@ -109,8 +112,8 @@ static int opal_scom_write(scom_map_t map, u64 reg, u64 value) | |||
| 109 | struct opal_scom_map *m = map; | 112 | struct opal_scom_map *m = map; |
| 110 | int64_t rc; | 113 | int64_t rc; |
| 111 | 114 | ||
| 112 | reg = opal_scom_unmangle(reg); | 115 | reg = opal_scom_unmangle(m->addr + reg); |
| 113 | rc = opal_xscom_write(m->chip, m->addr + reg, value); | 116 | rc = opal_xscom_write(m->chip, reg, value); |
| 114 | return opal_xscom_err_xlate(rc); | 117 | return opal_xscom_err_xlate(rc); |
| 115 | } | 118 | } |
| 116 | 119 | ||
diff --git a/arch/powerpc/platforms/powernv/pci.c b/arch/powerpc/platforms/powernv/pci.c index 95633d79ef5d..8518817dcdfd 100644 --- a/arch/powerpc/platforms/powernv/pci.c +++ b/arch/powerpc/platforms/powernv/pci.c | |||
| @@ -134,57 +134,72 @@ static void pnv_pci_dump_p7ioc_diag_data(struct pci_controller *hose, | |||
| 134 | pr_info("P7IOC PHB#%d Diag-data (Version: %d)\n\n", | 134 | pr_info("P7IOC PHB#%d Diag-data (Version: %d)\n\n", |
| 135 | hose->global_number, common->version); | 135 | hose->global_number, common->version); |
| 136 | 136 | ||
| 137 | pr_info(" brdgCtl: %08x\n", data->brdgCtl); | 137 | if (data->brdgCtl) |
| 138 | 138 | pr_info(" brdgCtl: %08x\n", | |
| 139 | pr_info(" portStatusReg: %08x\n", data->portStatusReg); | 139 | data->brdgCtl); |
| 140 | pr_info(" rootCmplxStatus: %08x\n", data->rootCmplxStatus); | 140 | if (data->portStatusReg || data->rootCmplxStatus || |
| 141 | pr_info(" busAgentStatus: %08x\n", data->busAgentStatus); | 141 | data->busAgentStatus) |
| 142 | 142 | pr_info(" UtlSts: %08x %08x %08x\n", | |
| 143 | pr_info(" deviceStatus: %08x\n", data->deviceStatus); | 143 | data->portStatusReg, data->rootCmplxStatus, |
| 144 | pr_info(" slotStatus: %08x\n", data->slotStatus); | 144 | data->busAgentStatus); |
| 145 | pr_info(" linkStatus: %08x\n", data->linkStatus); | 145 | if (data->deviceStatus || data->slotStatus || |
| 146 | pr_info(" devCmdStatus: %08x\n", data->devCmdStatus); | 146 | data->linkStatus || data->devCmdStatus || |
| 147 | pr_info(" devSecStatus: %08x\n", data->devSecStatus); | 147 | data->devSecStatus) |
| 148 | 148 | pr_info(" RootSts: %08x %08x %08x %08x %08x\n", | |
| 149 | pr_info(" rootErrorStatus: %08x\n", data->rootErrorStatus); | 149 | data->deviceStatus, data->slotStatus, |
| 150 | pr_info(" uncorrErrorStatus: %08x\n", data->uncorrErrorStatus); | 150 | data->linkStatus, data->devCmdStatus, |
| 151 | pr_info(" corrErrorStatus: %08x\n", data->corrErrorStatus); | 151 | data->devSecStatus); |
| 152 | pr_info(" tlpHdr1: %08x\n", data->tlpHdr1); | 152 | if (data->rootErrorStatus || data->uncorrErrorStatus || |
| 153 | pr_info(" tlpHdr2: %08x\n", data->tlpHdr2); | 153 | data->corrErrorStatus) |
| 154 | pr_info(" tlpHdr3: %08x\n", data->tlpHdr3); | 154 | pr_info(" RootErrSts: %08x %08x %08x\n", |
| 155 | pr_info(" tlpHdr4: %08x\n", data->tlpHdr4); | 155 | data->rootErrorStatus, data->uncorrErrorStatus, |
| 156 | pr_info(" sourceId: %08x\n", data->sourceId); | 156 | data->corrErrorStatus); |
| 157 | pr_info(" errorClass: %016llx\n", data->errorClass); | 157 | if (data->tlpHdr1 || data->tlpHdr2 || |
| 158 | pr_info(" correlator: %016llx\n", data->correlator); | 158 | data->tlpHdr3 || data->tlpHdr4) |
| 159 | pr_info(" p7iocPlssr: %016llx\n", data->p7iocPlssr); | 159 | pr_info(" RootErrLog: %08x %08x %08x %08x\n", |
| 160 | pr_info(" p7iocCsr: %016llx\n", data->p7iocCsr); | 160 | data->tlpHdr1, data->tlpHdr2, |
| 161 | pr_info(" lemFir: %016llx\n", data->lemFir); | 161 | data->tlpHdr3, data->tlpHdr4); |
| 162 | pr_info(" lemErrorMask: %016llx\n", data->lemErrorMask); | 162 | if (data->sourceId || data->errorClass || |
| 163 | pr_info(" lemWOF: %016llx\n", data->lemWOF); | 163 | data->correlator) |
| 164 | pr_info(" phbErrorStatus: %016llx\n", data->phbErrorStatus); | 164 | pr_info(" RootErrLog1: %08x %016llx %016llx\n", |
| 165 | pr_info(" phbFirstErrorStatus: %016llx\n", data->phbFirstErrorStatus); | 165 | data->sourceId, data->errorClass, |
| 166 | pr_info(" phbErrorLog0: %016llx\n", data->phbErrorLog0); | 166 | data->correlator); |
| 167 | pr_info(" phbErrorLog1: %016llx\n", data->phbErrorLog1); | 167 | if (data->p7iocPlssr || data->p7iocCsr) |
| 168 | pr_info(" mmioErrorStatus: %016llx\n", data->mmioErrorStatus); | 168 | pr_info(" PhbSts: %016llx %016llx\n", |
| 169 | pr_info(" mmioFirstErrorStatus: %016llx\n", data->mmioFirstErrorStatus); | 169 | data->p7iocPlssr, data->p7iocCsr); |
| 170 | pr_info(" mmioErrorLog0: %016llx\n", data->mmioErrorLog0); | 170 | if (data->lemFir || data->lemErrorMask || |
| 171 | pr_info(" mmioErrorLog1: %016llx\n", data->mmioErrorLog1); | 171 | data->lemWOF) |
| 172 | pr_info(" dma0ErrorStatus: %016llx\n", data->dma0ErrorStatus); | 172 | pr_info(" Lem: %016llx %016llx %016llx\n", |
| 173 | pr_info(" dma0FirstErrorStatus: %016llx\n", data->dma0FirstErrorStatus); | 173 | data->lemFir, data->lemErrorMask, |
| 174 | pr_info(" dma0ErrorLog0: %016llx\n", data->dma0ErrorLog0); | 174 | data->lemWOF); |
| 175 | pr_info(" dma0ErrorLog1: %016llx\n", data->dma0ErrorLog1); | 175 | if (data->phbErrorStatus || data->phbFirstErrorStatus || |
| 176 | pr_info(" dma1ErrorStatus: %016llx\n", data->dma1ErrorStatus); | 176 | data->phbErrorLog0 || data->phbErrorLog1) |
| 177 | pr_info(" dma1FirstErrorStatus: %016llx\n", data->dma1FirstErrorStatus); | 177 | pr_info(" PhbErr: %016llx %016llx %016llx %016llx\n", |
| 178 | pr_info(" dma1ErrorLog0: %016llx\n", data->dma1ErrorLog0); | 178 | data->phbErrorStatus, data->phbFirstErrorStatus, |
| 179 | pr_info(" dma1ErrorLog1: %016llx\n", data->dma1ErrorLog1); | 179 | data->phbErrorLog0, data->phbErrorLog1); |
| 180 | if (data->mmioErrorStatus || data->mmioFirstErrorStatus || | ||
| 181 | data->mmioErrorLog0 || data->mmioErrorLog1) | ||
| 182 | pr_info(" OutErr: %016llx %016llx %016llx %016llx\n", | ||
| 183 | data->mmioErrorStatus, data->mmioFirstErrorStatus, | ||
| 184 | data->mmioErrorLog0, data->mmioErrorLog1); | ||
| 185 | if (data->dma0ErrorStatus || data->dma0FirstErrorStatus || | ||
| 186 | data->dma0ErrorLog0 || data->dma0ErrorLog1) | ||
| 187 | pr_info(" InAErr: %016llx %016llx %016llx %016llx\n", | ||
| 188 | data->dma0ErrorStatus, data->dma0FirstErrorStatus, | ||
| 189 | data->dma0ErrorLog0, data->dma0ErrorLog1); | ||
| 190 | if (data->dma1ErrorStatus || data->dma1FirstErrorStatus || | ||
| 191 | data->dma1ErrorLog0 || data->dma1ErrorLog1) | ||
| 192 | pr_info(" InBErr: %016llx %016llx %016llx %016llx\n", | ||
| 193 | data->dma1ErrorStatus, data->dma1FirstErrorStatus, | ||
| 194 | data->dma1ErrorLog0, data->dma1ErrorLog1); | ||
| 180 | 195 | ||
| 181 | for (i = 0; i < OPAL_P7IOC_NUM_PEST_REGS; i++) { | 196 | for (i = 0; i < OPAL_P7IOC_NUM_PEST_REGS; i++) { |
| 182 | if ((data->pestA[i] >> 63) == 0 && | 197 | if ((data->pestA[i] >> 63) == 0 && |
| 183 | (data->pestB[i] >> 63) == 0) | 198 | (data->pestB[i] >> 63) == 0) |
| 184 | continue; | 199 | continue; |
| 185 | 200 | ||
| 186 | pr_info(" PE[%3d] PESTA: %016llx\n", i, data->pestA[i]); | 201 | pr_info(" PE[%3d] A/B: %016llx %016llx\n", |
| 187 | pr_info(" PESTB: %016llx\n", data->pestB[i]); | 202 | i, data->pestA[i], data->pestB[i]); |
| 188 | } | 203 | } |
| 189 | } | 204 | } |
| 190 | 205 | ||
| @@ -197,62 +212,77 @@ static void pnv_pci_dump_phb3_diag_data(struct pci_controller *hose, | |||
| 197 | data = (struct OpalIoPhb3ErrorData*)common; | 212 | data = (struct OpalIoPhb3ErrorData*)common; |
| 198 | pr_info("PHB3 PHB#%d Diag-data (Version: %d)\n\n", | 213 | pr_info("PHB3 PHB#%d Diag-data (Version: %d)\n\n", |
| 199 | hose->global_number, common->version); | 214 | hose->global_number, common->version); |
| 200 | 215 | if (data->brdgCtl) | |
| 201 | pr_info(" brdgCtl: %08x\n", data->brdgCtl); | 216 | pr_info(" brdgCtl: %08x\n", |
| 202 | 217 | data->brdgCtl); | |
| 203 | pr_info(" portStatusReg: %08x\n", data->portStatusReg); | 218 | if (data->portStatusReg || data->rootCmplxStatus || |
| 204 | pr_info(" rootCmplxStatus: %08x\n", data->rootCmplxStatus); | 219 | data->busAgentStatus) |
| 205 | pr_info(" busAgentStatus: %08x\n", data->busAgentStatus); | 220 | pr_info(" UtlSts: %08x %08x %08x\n", |
| 206 | 221 | data->portStatusReg, data->rootCmplxStatus, | |
| 207 | pr_info(" deviceStatus: %08x\n", data->deviceStatus); | 222 | data->busAgentStatus); |
| 208 | pr_info(" slotStatus: %08x\n", data->slotStatus); | 223 | if (data->deviceStatus || data->slotStatus || |
| 209 | pr_info(" linkStatus: %08x\n", data->linkStatus); | 224 | data->linkStatus || data->devCmdStatus || |
| 210 | pr_info(" devCmdStatus: %08x\n", data->devCmdStatus); | 225 | data->devSecStatus) |
| 211 | pr_info(" devSecStatus: %08x\n", data->devSecStatus); | 226 | pr_info(" RootSts: %08x %08x %08x %08x %08x\n", |
| 212 | 227 | data->deviceStatus, data->slotStatus, | |
| 213 | pr_info(" rootErrorStatus: %08x\n", data->rootErrorStatus); | 228 | data->linkStatus, data->devCmdStatus, |
| 214 | pr_info(" uncorrErrorStatus: %08x\n", data->uncorrErrorStatus); | 229 | data->devSecStatus); |
| 215 | pr_info(" corrErrorStatus: %08x\n", data->corrErrorStatus); | 230 | if (data->rootErrorStatus || data->uncorrErrorStatus || |
| 216 | pr_info(" tlpHdr1: %08x\n", data->tlpHdr1); | 231 | data->corrErrorStatus) |
| 217 | pr_info(" tlpHdr2: %08x\n", data->tlpHdr2); | 232 | pr_info(" RootErrSts: %08x %08x %08x\n", |
| 218 | pr_info(" tlpHdr3: %08x\n", data->tlpHdr3); | 233 | data->rootErrorStatus, data->uncorrErrorStatus, |
| 219 | pr_info(" tlpHdr4: %08x\n", data->tlpHdr4); | 234 | data->corrErrorStatus); |
| 220 | pr_info(" sourceId: %08x\n", data->sourceId); | 235 | if (data->tlpHdr1 || data->tlpHdr2 || |
| 221 | pr_info(" errorClass: %016llx\n", data->errorClass); | 236 | data->tlpHdr3 || data->tlpHdr4) |
| 222 | pr_info(" correlator: %016llx\n", data->correlator); | 237 | pr_info(" RootErrLog: %08x %08x %08x %08x\n", |
| 223 | 238 | data->tlpHdr1, data->tlpHdr2, | |
| 224 | pr_info(" nFir: %016llx\n", data->nFir); | 239 | data->tlpHdr3, data->tlpHdr4); |
| 225 | pr_info(" nFirMask: %016llx\n", data->nFirMask); | 240 | if (data->sourceId || data->errorClass || |
| 226 | pr_info(" nFirWOF: %016llx\n", data->nFirWOF); | 241 | data->correlator) |
| 227 | pr_info(" PhbPlssr: %016llx\n", data->phbPlssr); | 242 | pr_info(" RootErrLog1: %08x %016llx %016llx\n", |
| 228 | pr_info(" PhbCsr: %016llx\n", data->phbCsr); | 243 | data->sourceId, data->errorClass, |
| 229 | pr_info(" lemFir: %016llx\n", data->lemFir); | 244 | data->correlator); |
| 230 | pr_info(" lemErrorMask: %016llx\n", data->lemErrorMask); | 245 | if (data->nFir || data->nFirMask || |
| 231 | pr_info(" lemWOF: %016llx\n", data->lemWOF); | 246 | data->nFirWOF) |
| 232 | pr_info(" phbErrorStatus: %016llx\n", data->phbErrorStatus); | 247 | pr_info(" nFir: %016llx %016llx %016llx\n", |
| 233 | pr_info(" phbFirstErrorStatus: %016llx\n", data->phbFirstErrorStatus); | 248 | data->nFir, data->nFirMask, |
| 234 | pr_info(" phbErrorLog0: %016llx\n", data->phbErrorLog0); | 249 | data->nFirWOF); |
| 235 | pr_info(" phbErrorLog1: %016llx\n", data->phbErrorLog1); | 250 | if (data->phbPlssr || data->phbCsr) |
| 236 | pr_info(" mmioErrorStatus: %016llx\n", data->mmioErrorStatus); | 251 | pr_info(" PhbSts: %016llx %016llx\n", |
| 237 | pr_info(" mmioFirstErrorStatus: %016llx\n", data->mmioFirstErrorStatus); | 252 | data->phbPlssr, data->phbCsr); |
| 238 | pr_info(" mmioErrorLog0: %016llx\n", data->mmioErrorLog0); | 253 | if (data->lemFir || data->lemErrorMask || |
| 239 | pr_info(" mmioErrorLog1: %016llx\n", data->mmioErrorLog1); | 254 | data->lemWOF) |
| 240 | pr_info(" dma0ErrorStatus: %016llx\n", data->dma0ErrorStatus); | 255 | pr_info(" Lem: %016llx %016llx %016llx\n", |
| 241 | pr_info(" dma0FirstErrorStatus: %016llx\n", data->dma0FirstErrorStatus); | 256 | data->lemFir, data->lemErrorMask, |
| 242 | pr_info(" dma0ErrorLog0: %016llx\n", data->dma0ErrorLog0); | 257 | data->lemWOF); |
| 243 | pr_info(" dma0ErrorLog1: %016llx\n", data->dma0ErrorLog1); | 258 | if (data->phbErrorStatus || data->phbFirstErrorStatus || |
| 244 | pr_info(" dma1ErrorStatus: %016llx\n", data->dma1ErrorStatus); | 259 | data->phbErrorLog0 || data->phbErrorLog1) |
| 245 | pr_info(" dma1FirstErrorStatus: %016llx\n", data->dma1FirstErrorStatus); | 260 | pr_info(" PhbErr: %016llx %016llx %016llx %016llx\n", |
| 246 | pr_info(" dma1ErrorLog0: %016llx\n", data->dma1ErrorLog0); | 261 | data->phbErrorStatus, data->phbFirstErrorStatus, |
| 247 | pr_info(" dma1ErrorLog1: %016llx\n", data->dma1ErrorLog1); | 262 | data->phbErrorLog0, data->phbErrorLog1); |
| 263 | if (data->mmioErrorStatus || data->mmioFirstErrorStatus || | ||
| 264 | data->mmioErrorLog0 || data->mmioErrorLog1) | ||
| 265 | pr_info(" OutErr: %016llx %016llx %016llx %016llx\n", | ||
| 266 | data->mmioErrorStatus, data->mmioFirstErrorStatus, | ||
| 267 | data->mmioErrorLog0, data->mmioErrorLog1); | ||
| 268 | if (data->dma0ErrorStatus || data->dma0FirstErrorStatus || | ||
| 269 | data->dma0ErrorLog0 || data->dma0ErrorLog1) | ||
| 270 | pr_info(" InAErr: %016llx %016llx %016llx %016llx\n", | ||
| 271 | data->dma0ErrorStatus, data->dma0FirstErrorStatus, | ||
| 272 | data->dma0ErrorLog0, data->dma0ErrorLog1); | ||
| 273 | if (data->dma1ErrorStatus || data->dma1FirstErrorStatus || | ||
| 274 | data->dma1ErrorLog0 || data->dma1ErrorLog1) | ||
| 275 | pr_info(" InBErr: %016llx %016llx %016llx %016llx\n", | ||
| 276 | data->dma1ErrorStatus, data->dma1FirstErrorStatus, | ||
| 277 | data->dma1ErrorLog0, data->dma1ErrorLog1); | ||
| 248 | 278 | ||
| 249 | for (i = 0; i < OPAL_PHB3_NUM_PEST_REGS; i++) { | 279 | for (i = 0; i < OPAL_PHB3_NUM_PEST_REGS; i++) { |
| 250 | if ((data->pestA[i] >> 63) == 0 && | 280 | if ((data->pestA[i] >> 63) == 0 && |
| 251 | (data->pestB[i] >> 63) == 0) | 281 | (data->pestB[i] >> 63) == 0) |
| 252 | continue; | 282 | continue; |
| 253 | 283 | ||
| 254 | pr_info(" PE[%3d] PESTA: %016llx\n", i, data->pestA[i]); | 284 | pr_info(" PE[%3d] A/B: %016llx %016llx\n", |
| 255 | pr_info(" PESTB: %016llx\n", data->pestB[i]); | 285 | i, data->pestA[i], data->pestB[i]); |
| 256 | } | 286 | } |
| 257 | } | 287 | } |
| 258 | 288 | ||
diff --git a/arch/powerpc/platforms/pseries/hotplug-cpu.c b/arch/powerpc/platforms/pseries/hotplug-cpu.c index 82789e79e539..0ea99e3d4815 100644 --- a/arch/powerpc/platforms/pseries/hotplug-cpu.c +++ b/arch/powerpc/platforms/pseries/hotplug-cpu.c | |||
| @@ -35,12 +35,7 @@ | |||
| 35 | #include "offline_states.h" | 35 | #include "offline_states.h" |
| 36 | 36 | ||
| 37 | /* This version can't take the spinlock, because it never returns */ | 37 | /* This version can't take the spinlock, because it never returns */ |
| 38 | static struct rtas_args rtas_stop_self_args = { | 38 | static int rtas_stop_self_token = RTAS_UNKNOWN_SERVICE; |
| 39 | .token = RTAS_UNKNOWN_SERVICE, | ||
| 40 | .nargs = 0, | ||
| 41 | .nret = 1, | ||
| 42 | .rets = &rtas_stop_self_args.args[0], | ||
| 43 | }; | ||
| 44 | 39 | ||
| 45 | static DEFINE_PER_CPU(enum cpu_state_vals, preferred_offline_state) = | 40 | static DEFINE_PER_CPU(enum cpu_state_vals, preferred_offline_state) = |
| 46 | CPU_STATE_OFFLINE; | 41 | CPU_STATE_OFFLINE; |
| @@ -93,15 +88,20 @@ void set_default_offline_state(int cpu) | |||
| 93 | 88 | ||
| 94 | static void rtas_stop_self(void) | 89 | static void rtas_stop_self(void) |
| 95 | { | 90 | { |
| 96 | struct rtas_args *args = &rtas_stop_self_args; | 91 | struct rtas_args args = { |
| 92 | .token = cpu_to_be32(rtas_stop_self_token), | ||
| 93 | .nargs = 0, | ||
| 94 | .nret = 1, | ||
| 95 | .rets = &args.args[0], | ||
| 96 | }; | ||
| 97 | 97 | ||
| 98 | local_irq_disable(); | 98 | local_irq_disable(); |
| 99 | 99 | ||
| 100 | BUG_ON(args->token == RTAS_UNKNOWN_SERVICE); | 100 | BUG_ON(rtas_stop_self_token == RTAS_UNKNOWN_SERVICE); |
| 101 | 101 | ||
| 102 | printk("cpu %u (hwid %u) Ready to die...\n", | 102 | printk("cpu %u (hwid %u) Ready to die...\n", |
| 103 | smp_processor_id(), hard_smp_processor_id()); | 103 | smp_processor_id(), hard_smp_processor_id()); |
| 104 | enter_rtas(__pa(args)); | 104 | enter_rtas(__pa(&args)); |
| 105 | 105 | ||
| 106 | panic("Alas, I survived.\n"); | 106 | panic("Alas, I survived.\n"); |
| 107 | } | 107 | } |
| @@ -392,10 +392,10 @@ static int __init pseries_cpu_hotplug_init(void) | |||
| 392 | } | 392 | } |
| 393 | } | 393 | } |
| 394 | 394 | ||
| 395 | rtas_stop_self_args.token = rtas_token("stop-self"); | 395 | rtas_stop_self_token = rtas_token("stop-self"); |
| 396 | qcss_tok = rtas_token("query-cpu-stopped-state"); | 396 | qcss_tok = rtas_token("query-cpu-stopped-state"); |
| 397 | 397 | ||
| 398 | if (rtas_stop_self_args.token == RTAS_UNKNOWN_SERVICE || | 398 | if (rtas_stop_self_token == RTAS_UNKNOWN_SERVICE || |
| 399 | qcss_tok == RTAS_UNKNOWN_SERVICE) { | 399 | qcss_tok == RTAS_UNKNOWN_SERVICE) { |
| 400 | printk(KERN_INFO "CPU Hotplug not supported by firmware " | 400 | printk(KERN_INFO "CPU Hotplug not supported by firmware " |
| 401 | "- disabling.\n"); | 401 | "- disabling.\n"); |
diff --git a/arch/s390/kernel/compat_wrapper.S b/arch/s390/kernel/compat_wrapper.S index 59c8efce1b99..0248949a756d 100644 --- a/arch/s390/kernel/compat_wrapper.S +++ b/arch/s390/kernel/compat_wrapper.S | |||
| @@ -1421,5 +1421,5 @@ ENTRY(sys_sched_setattr_wrapper) | |||
| 1421 | ENTRY(sys_sched_getattr_wrapper) | 1421 | ENTRY(sys_sched_getattr_wrapper) |
| 1422 | lgfr %r2,%r2 # pid_t | 1422 | lgfr %r2,%r2 # pid_t |
| 1423 | llgtr %r3,%r3 # const char __user * | 1423 | llgtr %r3,%r3 # const char __user * |
| 1424 | llgfr %r3,%r3 # unsigned int | 1424 | llgfr %r4,%r4 # unsigned int |
| 1425 | jg sys_sched_getattr | 1425 | jg sys_sched_getattr |
diff --git a/arch/s390/pci/pci_dma.c b/arch/s390/pci/pci_dma.c index 60c11a629d96..f91c03119804 100644 --- a/arch/s390/pci/pci_dma.c +++ b/arch/s390/pci/pci_dma.c | |||
| @@ -206,11 +206,13 @@ static void dma_cleanup_tables(struct zpci_dev *zdev) | |||
| 206 | zdev->dma_table = NULL; | 206 | zdev->dma_table = NULL; |
| 207 | } | 207 | } |
| 208 | 208 | ||
| 209 | static unsigned long __dma_alloc_iommu(struct zpci_dev *zdev, unsigned long start, | 209 | static unsigned long __dma_alloc_iommu(struct zpci_dev *zdev, |
| 210 | int size) | 210 | unsigned long start, int size) |
| 211 | { | 211 | { |
| 212 | unsigned long boundary_size = 0x1000000; | 212 | unsigned long boundary_size; |
| 213 | 213 | ||
| 214 | boundary_size = ALIGN(dma_get_seg_boundary(&zdev->pdev->dev) + 1, | ||
| 215 | PAGE_SIZE) >> PAGE_SHIFT; | ||
| 214 | return iommu_area_alloc(zdev->iommu_bitmap, zdev->iommu_pages, | 216 | return iommu_area_alloc(zdev->iommu_bitmap, zdev->iommu_pages, |
| 215 | start, size, 0, boundary_size, 0); | 217 | start, size, 0, boundary_size, 0); |
| 216 | } | 218 | } |
diff --git a/arch/sh/include/cpu-sh2/cpu/cache.h b/arch/sh/include/cpu-sh2/cpu/cache.h index 673515bc4135..aa1b2b9088a7 100644 --- a/arch/sh/include/cpu-sh2/cpu/cache.h +++ b/arch/sh/include/cpu-sh2/cpu/cache.h | |||
| @@ -18,7 +18,7 @@ | |||
| 18 | #define SH_CACHE_ASSOC 8 | 18 | #define SH_CACHE_ASSOC 8 |
| 19 | 19 | ||
| 20 | #if defined(CONFIG_CPU_SUBTYPE_SH7619) | 20 | #if defined(CONFIG_CPU_SUBTYPE_SH7619) |
| 21 | #define CCR 0xffffffec | 21 | #define SH_CCR 0xffffffec |
| 22 | 22 | ||
| 23 | #define CCR_CACHE_CE 0x01 /* Cache enable */ | 23 | #define CCR_CACHE_CE 0x01 /* Cache enable */ |
| 24 | #define CCR_CACHE_WT 0x02 /* CCR[bit1=1,bit2=1] */ | 24 | #define CCR_CACHE_WT 0x02 /* CCR[bit1=1,bit2=1] */ |
diff --git a/arch/sh/include/cpu-sh2a/cpu/cache.h b/arch/sh/include/cpu-sh2a/cpu/cache.h index defb0baa5a06..b27ce92cb600 100644 --- a/arch/sh/include/cpu-sh2a/cpu/cache.h +++ b/arch/sh/include/cpu-sh2a/cpu/cache.h | |||
| @@ -17,8 +17,8 @@ | |||
| 17 | #define SH_CACHE_COMBINED 4 | 17 | #define SH_CACHE_COMBINED 4 |
| 18 | #define SH_CACHE_ASSOC 8 | 18 | #define SH_CACHE_ASSOC 8 |
| 19 | 19 | ||
| 20 | #define CCR 0xfffc1000 /* CCR1 */ | 20 | #define SH_CCR 0xfffc1000 /* CCR1 */ |
| 21 | #define CCR2 0xfffc1004 | 21 | #define SH_CCR2 0xfffc1004 |
| 22 | 22 | ||
| 23 | /* | 23 | /* |
| 24 | * Most of the SH-2A CCR1 definitions resemble the SH-4 ones. All others not | 24 | * Most of the SH-2A CCR1 definitions resemble the SH-4 ones. All others not |
diff --git a/arch/sh/include/cpu-sh3/cpu/cache.h b/arch/sh/include/cpu-sh3/cpu/cache.h index bee2d81c56bf..29700fd88c75 100644 --- a/arch/sh/include/cpu-sh3/cpu/cache.h +++ b/arch/sh/include/cpu-sh3/cpu/cache.h | |||
| @@ -17,7 +17,7 @@ | |||
| 17 | #define SH_CACHE_COMBINED 4 | 17 | #define SH_CACHE_COMBINED 4 |
| 18 | #define SH_CACHE_ASSOC 8 | 18 | #define SH_CACHE_ASSOC 8 |
| 19 | 19 | ||
| 20 | #define CCR 0xffffffec /* Address of Cache Control Register */ | 20 | #define SH_CCR 0xffffffec /* Address of Cache Control Register */ |
| 21 | 21 | ||
| 22 | #define CCR_CACHE_CE 0x01 /* Cache Enable */ | 22 | #define CCR_CACHE_CE 0x01 /* Cache Enable */ |
| 23 | #define CCR_CACHE_WT 0x02 /* Write-Through (for P0,U0,P3) (else writeback) */ | 23 | #define CCR_CACHE_WT 0x02 /* Write-Through (for P0,U0,P3) (else writeback) */ |
diff --git a/arch/sh/include/cpu-sh4/cpu/cache.h b/arch/sh/include/cpu-sh4/cpu/cache.h index 7bfb9e8b069c..92c4cd119b66 100644 --- a/arch/sh/include/cpu-sh4/cpu/cache.h +++ b/arch/sh/include/cpu-sh4/cpu/cache.h | |||
| @@ -17,7 +17,7 @@ | |||
| 17 | #define SH_CACHE_COMBINED 4 | 17 | #define SH_CACHE_COMBINED 4 |
| 18 | #define SH_CACHE_ASSOC 8 | 18 | #define SH_CACHE_ASSOC 8 |
| 19 | 19 | ||
| 20 | #define CCR 0xff00001c /* Address of Cache Control Register */ | 20 | #define SH_CCR 0xff00001c /* Address of Cache Control Register */ |
| 21 | #define CCR_CACHE_OCE 0x0001 /* Operand Cache Enable */ | 21 | #define CCR_CACHE_OCE 0x0001 /* Operand Cache Enable */ |
| 22 | #define CCR_CACHE_WT 0x0002 /* Write-Through (for P0,U0,P3) (else writeback)*/ | 22 | #define CCR_CACHE_WT 0x0002 /* Write-Through (for P0,U0,P3) (else writeback)*/ |
| 23 | #define CCR_CACHE_CB 0x0004 /* Copy-Back (for P1) (else writethrough) */ | 23 | #define CCR_CACHE_CB 0x0004 /* Copy-Back (for P1) (else writethrough) */ |
diff --git a/arch/sh/kernel/cpu/init.c b/arch/sh/kernel/cpu/init.c index ecf83cd158dc..0d7360d549c1 100644 --- a/arch/sh/kernel/cpu/init.c +++ b/arch/sh/kernel/cpu/init.c | |||
| @@ -112,7 +112,7 @@ static void cache_init(void) | |||
| 112 | unsigned long ccr, flags; | 112 | unsigned long ccr, flags; |
| 113 | 113 | ||
| 114 | jump_to_uncached(); | 114 | jump_to_uncached(); |
| 115 | ccr = __raw_readl(CCR); | 115 | ccr = __raw_readl(SH_CCR); |
| 116 | 116 | ||
| 117 | /* | 117 | /* |
| 118 | * At this point we don't know whether the cache is enabled or not - a | 118 | * At this point we don't know whether the cache is enabled or not - a |
| @@ -189,7 +189,7 @@ static void cache_init(void) | |||
| 189 | 189 | ||
| 190 | l2_cache_init(); | 190 | l2_cache_init(); |
| 191 | 191 | ||
| 192 | __raw_writel(flags, CCR); | 192 | __raw_writel(flags, SH_CCR); |
| 193 | back_to_cached(); | 193 | back_to_cached(); |
| 194 | } | 194 | } |
| 195 | #else | 195 | #else |
diff --git a/arch/sh/mm/cache-debugfs.c b/arch/sh/mm/cache-debugfs.c index 115725198038..777e50f33c00 100644 --- a/arch/sh/mm/cache-debugfs.c +++ b/arch/sh/mm/cache-debugfs.c | |||
| @@ -36,7 +36,7 @@ static int cache_seq_show(struct seq_file *file, void *iter) | |||
| 36 | */ | 36 | */ |
| 37 | jump_to_uncached(); | 37 | jump_to_uncached(); |
| 38 | 38 | ||
| 39 | ccr = __raw_readl(CCR); | 39 | ccr = __raw_readl(SH_CCR); |
| 40 | if ((ccr & CCR_CACHE_ENABLE) == 0) { | 40 | if ((ccr & CCR_CACHE_ENABLE) == 0) { |
| 41 | back_to_cached(); | 41 | back_to_cached(); |
| 42 | 42 | ||
diff --git a/arch/sh/mm/cache-sh2.c b/arch/sh/mm/cache-sh2.c index defcf719f2e8..a74259f2f981 100644 --- a/arch/sh/mm/cache-sh2.c +++ b/arch/sh/mm/cache-sh2.c | |||
| @@ -63,9 +63,9 @@ static void sh2__flush_invalidate_region(void *start, int size) | |||
| 63 | local_irq_save(flags); | 63 | local_irq_save(flags); |
| 64 | jump_to_uncached(); | 64 | jump_to_uncached(); |
| 65 | 65 | ||
| 66 | ccr = __raw_readl(CCR); | 66 | ccr = __raw_readl(SH_CCR); |
| 67 | ccr |= CCR_CACHE_INVALIDATE; | 67 | ccr |= CCR_CACHE_INVALIDATE; |
| 68 | __raw_writel(ccr, CCR); | 68 | __raw_writel(ccr, SH_CCR); |
| 69 | 69 | ||
| 70 | back_to_cached(); | 70 | back_to_cached(); |
| 71 | local_irq_restore(flags); | 71 | local_irq_restore(flags); |
diff --git a/arch/sh/mm/cache-sh2a.c b/arch/sh/mm/cache-sh2a.c index 949e2d3138a0..ee87d081259b 100644 --- a/arch/sh/mm/cache-sh2a.c +++ b/arch/sh/mm/cache-sh2a.c | |||
| @@ -134,7 +134,8 @@ static void sh2a__flush_invalidate_region(void *start, int size) | |||
| 134 | 134 | ||
| 135 | /* If there are too many pages then just blow the cache */ | 135 | /* If there are too many pages then just blow the cache */ |
| 136 | if (((end - begin) >> PAGE_SHIFT) >= MAX_OCACHE_PAGES) { | 136 | if (((end - begin) >> PAGE_SHIFT) >= MAX_OCACHE_PAGES) { |
| 137 | __raw_writel(__raw_readl(CCR) | CCR_OCACHE_INVALIDATE, CCR); | 137 | __raw_writel(__raw_readl(SH_CCR) | CCR_OCACHE_INVALIDATE, |
| 138 | SH_CCR); | ||
| 138 | } else { | 139 | } else { |
| 139 | for (v = begin; v < end; v += L1_CACHE_BYTES) | 140 | for (v = begin; v < end; v += L1_CACHE_BYTES) |
| 140 | sh2a_invalidate_line(CACHE_OC_ADDRESS_ARRAY, v); | 141 | sh2a_invalidate_line(CACHE_OC_ADDRESS_ARRAY, v); |
| @@ -167,7 +168,8 @@ static void sh2a_flush_icache_range(void *args) | |||
| 167 | /* I-Cache invalidate */ | 168 | /* I-Cache invalidate */ |
| 168 | /* If there are too many pages then just blow the cache */ | 169 | /* If there are too many pages then just blow the cache */ |
| 169 | if (((end - start) >> PAGE_SHIFT) >= MAX_ICACHE_PAGES) { | 170 | if (((end - start) >> PAGE_SHIFT) >= MAX_ICACHE_PAGES) { |
| 170 | __raw_writel(__raw_readl(CCR) | CCR_ICACHE_INVALIDATE, CCR); | 171 | __raw_writel(__raw_readl(SH_CCR) | CCR_ICACHE_INVALIDATE, |
| 172 | SH_CCR); | ||
| 171 | } else { | 173 | } else { |
| 172 | for (v = start; v < end; v += L1_CACHE_BYTES) | 174 | for (v = start; v < end; v += L1_CACHE_BYTES) |
| 173 | sh2a_invalidate_line(CACHE_IC_ADDRESS_ARRAY, v); | 175 | sh2a_invalidate_line(CACHE_IC_ADDRESS_ARRAY, v); |
diff --git a/arch/sh/mm/cache-sh4.c b/arch/sh/mm/cache-sh4.c index 0e529285b28d..51d8f7f31d1d 100644 --- a/arch/sh/mm/cache-sh4.c +++ b/arch/sh/mm/cache-sh4.c | |||
| @@ -133,9 +133,9 @@ static void flush_icache_all(void) | |||
| 133 | jump_to_uncached(); | 133 | jump_to_uncached(); |
| 134 | 134 | ||
| 135 | /* Flush I-cache */ | 135 | /* Flush I-cache */ |
| 136 | ccr = __raw_readl(CCR); | 136 | ccr = __raw_readl(SH_CCR); |
| 137 | ccr |= CCR_CACHE_ICI; | 137 | ccr |= CCR_CACHE_ICI; |
| 138 | __raw_writel(ccr, CCR); | 138 | __raw_writel(ccr, SH_CCR); |
| 139 | 139 | ||
| 140 | /* | 140 | /* |
| 141 | * back_to_cached() will take care of the barrier for us, don't add | 141 | * back_to_cached() will take care of the barrier for us, don't add |
diff --git a/arch/sh/mm/cache-shx3.c b/arch/sh/mm/cache-shx3.c index c0adbee97b5f..24c58b7dc022 100644 --- a/arch/sh/mm/cache-shx3.c +++ b/arch/sh/mm/cache-shx3.c | |||
| @@ -19,7 +19,7 @@ void __init shx3_cache_init(void) | |||
| 19 | { | 19 | { |
| 20 | unsigned int ccr; | 20 | unsigned int ccr; |
| 21 | 21 | ||
| 22 | ccr = __raw_readl(CCR); | 22 | ccr = __raw_readl(SH_CCR); |
| 23 | 23 | ||
| 24 | /* | 24 | /* |
| 25 | * If we've got cache aliases, resolve them in hardware. | 25 | * If we've got cache aliases, resolve them in hardware. |
| @@ -40,5 +40,5 @@ void __init shx3_cache_init(void) | |||
| 40 | ccr |= CCR_CACHE_IBE; | 40 | ccr |= CCR_CACHE_IBE; |
| 41 | #endif | 41 | #endif |
| 42 | 42 | ||
| 43 | writel_uncached(ccr, CCR); | 43 | writel_uncached(ccr, SH_CCR); |
| 44 | } | 44 | } |
diff --git a/arch/sh/mm/cache.c b/arch/sh/mm/cache.c index 616966a96cba..097c2cdd117f 100644 --- a/arch/sh/mm/cache.c +++ b/arch/sh/mm/cache.c | |||
| @@ -285,8 +285,8 @@ void __init cpu_cache_init(void) | |||
| 285 | { | 285 | { |
| 286 | unsigned int cache_disabled = 0; | 286 | unsigned int cache_disabled = 0; |
| 287 | 287 | ||
| 288 | #ifdef CCR | 288 | #ifdef SH_CCR |
| 289 | cache_disabled = !(__raw_readl(CCR) & CCR_CACHE_ENABLE); | 289 | cache_disabled = !(__raw_readl(SH_CCR) & CCR_CACHE_ENABLE); |
| 290 | #endif | 290 | #endif |
| 291 | 291 | ||
| 292 | compute_alias(&boot_cpu_data.icache); | 292 | compute_alias(&boot_cpu_data.icache); |
diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig index c51efdcd07a2..7d8b7e94b93b 100644 --- a/arch/sparc/Kconfig +++ b/arch/sparc/Kconfig | |||
| @@ -27,7 +27,7 @@ config SPARC | |||
| 27 | select RTC_DRV_M48T59 | 27 | select RTC_DRV_M48T59 |
| 28 | select HAVE_DMA_ATTRS | 28 | select HAVE_DMA_ATTRS |
| 29 | select HAVE_DMA_API_DEBUG | 29 | select HAVE_DMA_API_DEBUG |
| 30 | select HAVE_ARCH_JUMP_LABEL | 30 | select HAVE_ARCH_JUMP_LABEL if SPARC64 |
| 31 | select GENERIC_IRQ_SHOW | 31 | select GENERIC_IRQ_SHOW |
| 32 | select ARCH_WANT_IPC_PARSE_VERSION | 32 | select ARCH_WANT_IPC_PARSE_VERSION |
| 33 | select GENERIC_PCI_IOMAP | 33 | select GENERIC_PCI_IOMAP |
diff --git a/arch/sparc/mm/srmmu.c b/arch/sparc/mm/srmmu.c index 869023abe5a4..cfbe53c17b0d 100644 --- a/arch/sparc/mm/srmmu.c +++ b/arch/sparc/mm/srmmu.c | |||
| @@ -14,6 +14,7 @@ | |||
| 14 | #include <linux/pagemap.h> | 14 | #include <linux/pagemap.h> |
| 15 | #include <linux/vmalloc.h> | 15 | #include <linux/vmalloc.h> |
| 16 | #include <linux/kdebug.h> | 16 | #include <linux/kdebug.h> |
| 17 | #include <linux/export.h> | ||
| 17 | #include <linux/kernel.h> | 18 | #include <linux/kernel.h> |
| 18 | #include <linux/init.h> | 19 | #include <linux/init.h> |
| 19 | #include <linux/log2.h> | 20 | #include <linux/log2.h> |
| @@ -62,6 +63,7 @@ extern unsigned long last_valid_pfn; | |||
| 62 | static pgd_t *srmmu_swapper_pg_dir; | 63 | static pgd_t *srmmu_swapper_pg_dir; |
| 63 | 64 | ||
| 64 | const struct sparc32_cachetlb_ops *sparc32_cachetlb_ops; | 65 | const struct sparc32_cachetlb_ops *sparc32_cachetlb_ops; |
| 66 | EXPORT_SYMBOL(sparc32_cachetlb_ops); | ||
| 65 | 67 | ||
| 66 | #ifdef CONFIG_SMP | 68 | #ifdef CONFIG_SMP |
| 67 | const struct sparc32_cachetlb_ops *local_ops; | 69 | const struct sparc32_cachetlb_ops *local_ops; |
diff --git a/arch/x86/boot/compressed/aslr.c b/arch/x86/boot/compressed/aslr.c index 90a21f430117..4dbf967da50d 100644 --- a/arch/x86/boot/compressed/aslr.c +++ b/arch/x86/boot/compressed/aslr.c | |||
| @@ -111,7 +111,7 @@ struct mem_vector { | |||
| 111 | }; | 111 | }; |
| 112 | 112 | ||
| 113 | #define MEM_AVOID_MAX 5 | 113 | #define MEM_AVOID_MAX 5 |
| 114 | struct mem_vector mem_avoid[MEM_AVOID_MAX]; | 114 | static struct mem_vector mem_avoid[MEM_AVOID_MAX]; |
| 115 | 115 | ||
| 116 | static bool mem_contains(struct mem_vector *region, struct mem_vector *item) | 116 | static bool mem_contains(struct mem_vector *region, struct mem_vector *item) |
| 117 | { | 117 | { |
| @@ -180,7 +180,7 @@ static void mem_avoid_init(unsigned long input, unsigned long input_size, | |||
| 180 | } | 180 | } |
| 181 | 181 | ||
| 182 | /* Does this memory vector overlap a known avoided area? */ | 182 | /* Does this memory vector overlap a known avoided area? */ |
| 183 | bool mem_avoid_overlap(struct mem_vector *img) | 183 | static bool mem_avoid_overlap(struct mem_vector *img) |
| 184 | { | 184 | { |
| 185 | int i; | 185 | int i; |
| 186 | 186 | ||
| @@ -192,8 +192,9 @@ bool mem_avoid_overlap(struct mem_vector *img) | |||
| 192 | return false; | 192 | return false; |
| 193 | } | 193 | } |
| 194 | 194 | ||
| 195 | unsigned long slots[CONFIG_RANDOMIZE_BASE_MAX_OFFSET / CONFIG_PHYSICAL_ALIGN]; | 195 | static unsigned long slots[CONFIG_RANDOMIZE_BASE_MAX_OFFSET / |
| 196 | unsigned long slot_max = 0; | 196 | CONFIG_PHYSICAL_ALIGN]; |
| 197 | static unsigned long slot_max; | ||
| 197 | 198 | ||
| 198 | static void slots_append(unsigned long addr) | 199 | static void slots_append(unsigned long addr) |
| 199 | { | 200 | { |
diff --git a/arch/x86/include/asm/tsc.h b/arch/x86/include/asm/tsc.h index 57ae63cd6ee2..94605c0e9cee 100644 --- a/arch/x86/include/asm/tsc.h +++ b/arch/x86/include/asm/tsc.h | |||
| @@ -66,6 +66,6 @@ extern void tsc_save_sched_clock_state(void); | |||
| 66 | extern void tsc_restore_sched_clock_state(void); | 66 | extern void tsc_restore_sched_clock_state(void); |
| 67 | 67 | ||
| 68 | /* MSR based TSC calibration for Intel Atom SoC platforms */ | 68 | /* MSR based TSC calibration for Intel Atom SoC platforms */ |
| 69 | int try_msr_calibrate_tsc(unsigned long *fast_calibrate); | 69 | unsigned long try_msr_calibrate_tsc(void); |
| 70 | 70 | ||
| 71 | #endif /* _ASM_X86_TSC_H */ | 71 | #endif /* _ASM_X86_TSC_H */ |
diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c index b88645191fe5..79f9f848bee4 100644 --- a/arch/x86/kernel/cpu/perf_event.c +++ b/arch/x86/kernel/cpu/perf_event.c | |||
| @@ -1192,6 +1192,9 @@ static void x86_pmu_del(struct perf_event *event, int flags) | |||
| 1192 | for (i = 0; i < cpuc->n_events; i++) { | 1192 | for (i = 0; i < cpuc->n_events; i++) { |
| 1193 | if (event == cpuc->event_list[i]) { | 1193 | if (event == cpuc->event_list[i]) { |
| 1194 | 1194 | ||
| 1195 | if (i >= cpuc->n_events - cpuc->n_added) | ||
| 1196 | --cpuc->n_added; | ||
| 1197 | |||
| 1195 | if (x86_pmu.put_event_constraints) | 1198 | if (x86_pmu.put_event_constraints) |
| 1196 | x86_pmu.put_event_constraints(cpuc, event); | 1199 | x86_pmu.put_event_constraints(cpuc, event); |
| 1197 | 1200 | ||
| @@ -1521,6 +1524,8 @@ static int __init init_hw_perf_events(void) | |||
| 1521 | 1524 | ||
| 1522 | pr_cont("%s PMU driver.\n", x86_pmu.name); | 1525 | pr_cont("%s PMU driver.\n", x86_pmu.name); |
| 1523 | 1526 | ||
| 1527 | x86_pmu.attr_rdpmc = 1; /* enable userspace RDPMC usage by default */ | ||
| 1528 | |||
| 1524 | for (quirk = x86_pmu.quirks; quirk; quirk = quirk->next) | 1529 | for (quirk = x86_pmu.quirks; quirk; quirk = quirk->next) |
| 1525 | quirk->func(); | 1530 | quirk->func(); |
| 1526 | 1531 | ||
| @@ -1534,7 +1539,6 @@ static int __init init_hw_perf_events(void) | |||
| 1534 | __EVENT_CONSTRAINT(0, (1ULL << x86_pmu.num_counters) - 1, | 1539 | __EVENT_CONSTRAINT(0, (1ULL << x86_pmu.num_counters) - 1, |
| 1535 | 0, x86_pmu.num_counters, 0, 0); | 1540 | 0, x86_pmu.num_counters, 0, 0); |
| 1536 | 1541 | ||
| 1537 | x86_pmu.attr_rdpmc = 1; /* enable userspace RDPMC usage by default */ | ||
| 1538 | x86_pmu_format_group.attrs = x86_pmu.format_attrs; | 1542 | x86_pmu_format_group.attrs = x86_pmu.format_attrs; |
| 1539 | 1543 | ||
| 1540 | if (x86_pmu.event_attrs) | 1544 | if (x86_pmu.event_attrs) |
| @@ -1820,9 +1824,12 @@ static ssize_t set_attr_rdpmc(struct device *cdev, | |||
| 1820 | if (ret) | 1824 | if (ret) |
| 1821 | return ret; | 1825 | return ret; |
| 1822 | 1826 | ||
| 1827 | if (x86_pmu.attr_rdpmc_broken) | ||
| 1828 | return -ENOTSUPP; | ||
| 1829 | |||
| 1823 | if (!!val != !!x86_pmu.attr_rdpmc) { | 1830 | if (!!val != !!x86_pmu.attr_rdpmc) { |
| 1824 | x86_pmu.attr_rdpmc = !!val; | 1831 | x86_pmu.attr_rdpmc = !!val; |
| 1825 | smp_call_function(change_rdpmc, (void *)val, 1); | 1832 | on_each_cpu(change_rdpmc, (void *)val, 1); |
| 1826 | } | 1833 | } |
| 1827 | 1834 | ||
| 1828 | return count; | 1835 | return count; |
diff --git a/arch/x86/kernel/cpu/perf_event.h b/arch/x86/kernel/cpu/perf_event.h index c1a861829d81..4972c244d0bc 100644 --- a/arch/x86/kernel/cpu/perf_event.h +++ b/arch/x86/kernel/cpu/perf_event.h | |||
| @@ -409,6 +409,7 @@ struct x86_pmu { | |||
| 409 | /* | 409 | /* |
| 410 | * sysfs attrs | 410 | * sysfs attrs |
| 411 | */ | 411 | */ |
| 412 | int attr_rdpmc_broken; | ||
| 412 | int attr_rdpmc; | 413 | int attr_rdpmc; |
| 413 | struct attribute **format_attrs; | 414 | struct attribute **format_attrs; |
| 414 | struct attribute **event_attrs; | 415 | struct attribute **event_attrs; |
diff --git a/arch/x86/kernel/cpu/perf_event_intel.c b/arch/x86/kernel/cpu/perf_event_intel.c index 0fa4f242f050..aa333d966886 100644 --- a/arch/x86/kernel/cpu/perf_event_intel.c +++ b/arch/x86/kernel/cpu/perf_event_intel.c | |||
| @@ -1361,10 +1361,8 @@ static int intel_pmu_handle_irq(struct pt_regs *regs) | |||
| 1361 | intel_pmu_disable_all(); | 1361 | intel_pmu_disable_all(); |
| 1362 | handled = intel_pmu_drain_bts_buffer(); | 1362 | handled = intel_pmu_drain_bts_buffer(); |
| 1363 | status = intel_pmu_get_status(); | 1363 | status = intel_pmu_get_status(); |
| 1364 | if (!status) { | 1364 | if (!status) |
| 1365 | intel_pmu_enable_all(0); | 1365 | goto done; |
| 1366 | return handled; | ||
| 1367 | } | ||
| 1368 | 1366 | ||
| 1369 | loops = 0; | 1367 | loops = 0; |
| 1370 | again: | 1368 | again: |
| @@ -2310,10 +2308,7 @@ __init int intel_pmu_init(void) | |||
| 2310 | if (version > 1) | 2308 | if (version > 1) |
| 2311 | x86_pmu.num_counters_fixed = max((int)edx.split.num_counters_fixed, 3); | 2309 | x86_pmu.num_counters_fixed = max((int)edx.split.num_counters_fixed, 3); |
| 2312 | 2310 | ||
| 2313 | /* | 2311 | if (boot_cpu_has(X86_FEATURE_PDCM)) { |
| 2314 | * v2 and above have a perf capabilities MSR | ||
| 2315 | */ | ||
| 2316 | if (version > 1) { | ||
| 2317 | u64 capabilities; | 2312 | u64 capabilities; |
| 2318 | 2313 | ||
| 2319 | rdmsrl(MSR_IA32_PERF_CAPABILITIES, capabilities); | 2314 | rdmsrl(MSR_IA32_PERF_CAPABILITIES, capabilities); |
diff --git a/arch/x86/kernel/cpu/perf_event_intel_uncore.c b/arch/x86/kernel/cpu/perf_event_intel_uncore.c index 29c248799ced..c88f7f4b03ee 100644 --- a/arch/x86/kernel/cpu/perf_event_intel_uncore.c +++ b/arch/x86/kernel/cpu/perf_event_intel_uncore.c | |||
| @@ -501,8 +501,11 @@ static struct extra_reg snbep_uncore_cbox_extra_regs[] = { | |||
| 501 | SNBEP_CBO_EVENT_EXTRA_REG(SNBEP_CBO_PMON_CTL_TID_EN, | 501 | SNBEP_CBO_EVENT_EXTRA_REG(SNBEP_CBO_PMON_CTL_TID_EN, |
| 502 | SNBEP_CBO_PMON_CTL_TID_EN, 0x1), | 502 | SNBEP_CBO_PMON_CTL_TID_EN, 0x1), |
| 503 | SNBEP_CBO_EVENT_EXTRA_REG(0x0334, 0xffff, 0x4), | 503 | SNBEP_CBO_EVENT_EXTRA_REG(0x0334, 0xffff, 0x4), |
| 504 | SNBEP_CBO_EVENT_EXTRA_REG(0x4334, 0xffff, 0x6), | ||
| 504 | SNBEP_CBO_EVENT_EXTRA_REG(0x0534, 0xffff, 0x4), | 505 | SNBEP_CBO_EVENT_EXTRA_REG(0x0534, 0xffff, 0x4), |
| 506 | SNBEP_CBO_EVENT_EXTRA_REG(0x4534, 0xffff, 0x6), | ||
| 505 | SNBEP_CBO_EVENT_EXTRA_REG(0x0934, 0xffff, 0x4), | 507 | SNBEP_CBO_EVENT_EXTRA_REG(0x0934, 0xffff, 0x4), |
| 508 | SNBEP_CBO_EVENT_EXTRA_REG(0x4934, 0xffff, 0x6), | ||
| 506 | SNBEP_CBO_EVENT_EXTRA_REG(0x4134, 0xffff, 0x6), | 509 | SNBEP_CBO_EVENT_EXTRA_REG(0x4134, 0xffff, 0x6), |
| 507 | SNBEP_CBO_EVENT_EXTRA_REG(0x0135, 0xffff, 0x8), | 510 | SNBEP_CBO_EVENT_EXTRA_REG(0x0135, 0xffff, 0x8), |
| 508 | SNBEP_CBO_EVENT_EXTRA_REG(0x0335, 0xffff, 0x8), | 511 | SNBEP_CBO_EVENT_EXTRA_REG(0x0335, 0xffff, 0x8), |
| @@ -1178,10 +1181,15 @@ static struct extra_reg ivt_uncore_cbox_extra_regs[] = { | |||
| 1178 | SNBEP_CBO_EVENT_EXTRA_REG(SNBEP_CBO_PMON_CTL_TID_EN, | 1181 | SNBEP_CBO_EVENT_EXTRA_REG(SNBEP_CBO_PMON_CTL_TID_EN, |
| 1179 | SNBEP_CBO_PMON_CTL_TID_EN, 0x1), | 1182 | SNBEP_CBO_PMON_CTL_TID_EN, 0x1), |
| 1180 | SNBEP_CBO_EVENT_EXTRA_REG(0x1031, 0x10ff, 0x2), | 1183 | SNBEP_CBO_EVENT_EXTRA_REG(0x1031, 0x10ff, 0x2), |
| 1184 | SNBEP_CBO_EVENT_EXTRA_REG(0x1134, 0xffff, 0x4), | ||
| 1185 | SNBEP_CBO_EVENT_EXTRA_REG(0x4134, 0xffff, 0xc), | ||
| 1186 | SNBEP_CBO_EVENT_EXTRA_REG(0x5134, 0xffff, 0xc), | ||
| 1181 | SNBEP_CBO_EVENT_EXTRA_REG(0x0334, 0xffff, 0x4), | 1187 | SNBEP_CBO_EVENT_EXTRA_REG(0x0334, 0xffff, 0x4), |
| 1188 | SNBEP_CBO_EVENT_EXTRA_REG(0x4334, 0xffff, 0xc), | ||
| 1182 | SNBEP_CBO_EVENT_EXTRA_REG(0x0534, 0xffff, 0x4), | 1189 | SNBEP_CBO_EVENT_EXTRA_REG(0x0534, 0xffff, 0x4), |
| 1190 | SNBEP_CBO_EVENT_EXTRA_REG(0x4534, 0xffff, 0xc), | ||
| 1183 | SNBEP_CBO_EVENT_EXTRA_REG(0x0934, 0xffff, 0x4), | 1191 | SNBEP_CBO_EVENT_EXTRA_REG(0x0934, 0xffff, 0x4), |
| 1184 | SNBEP_CBO_EVENT_EXTRA_REG(0x4134, 0xffff, 0xc), | 1192 | SNBEP_CBO_EVENT_EXTRA_REG(0x4934, 0xffff, 0xc), |
| 1185 | SNBEP_CBO_EVENT_EXTRA_REG(0x0135, 0xffff, 0x10), | 1193 | SNBEP_CBO_EVENT_EXTRA_REG(0x0135, 0xffff, 0x10), |
| 1186 | SNBEP_CBO_EVENT_EXTRA_REG(0x0335, 0xffff, 0x10), | 1194 | SNBEP_CBO_EVENT_EXTRA_REG(0x0335, 0xffff, 0x10), |
| 1187 | SNBEP_CBO_EVENT_EXTRA_REG(0x2135, 0xffff, 0x10), | 1195 | SNBEP_CBO_EVENT_EXTRA_REG(0x2135, 0xffff, 0x10), |
diff --git a/arch/x86/kernel/cpu/perf_event_p6.c b/arch/x86/kernel/cpu/perf_event_p6.c index b1e2fe115323..7c1a0c07b607 100644 --- a/arch/x86/kernel/cpu/perf_event_p6.c +++ b/arch/x86/kernel/cpu/perf_event_p6.c | |||
| @@ -231,31 +231,49 @@ static __initconst const struct x86_pmu p6_pmu = { | |||
| 231 | 231 | ||
| 232 | }; | 232 | }; |
| 233 | 233 | ||
| 234 | static __init void p6_pmu_rdpmc_quirk(void) | ||
| 235 | { | ||
| 236 | if (boot_cpu_data.x86_mask < 9) { | ||
| 237 | /* | ||
| 238 | * PPro erratum 26; fixed in stepping 9 and above. | ||
| 239 | */ | ||
| 240 | pr_warn("Userspace RDPMC support disabled due to a CPU erratum\n"); | ||
| 241 | x86_pmu.attr_rdpmc_broken = 1; | ||
| 242 | x86_pmu.attr_rdpmc = 0; | ||
| 243 | } | ||
| 244 | } | ||
| 245 | |||
| 234 | __init int p6_pmu_init(void) | 246 | __init int p6_pmu_init(void) |
| 235 | { | 247 | { |
| 248 | x86_pmu = p6_pmu; | ||
| 249 | |||
| 236 | switch (boot_cpu_data.x86_model) { | 250 | switch (boot_cpu_data.x86_model) { |
| 237 | case 1: | 251 | case 1: /* Pentium Pro */ |
| 238 | case 3: /* Pentium Pro */ | 252 | x86_add_quirk(p6_pmu_rdpmc_quirk); |
| 239 | case 5: | 253 | break; |
| 240 | case 6: /* Pentium II */ | 254 | |
| 241 | case 7: | 255 | case 3: /* Pentium II - Klamath */ |
| 242 | case 8: | 256 | case 5: /* Pentium II - Deschutes */ |
| 243 | case 11: /* Pentium III */ | 257 | case 6: /* Pentium II - Mendocino */ |
| 244 | case 9: | ||
| 245 | case 13: | ||
| 246 | /* Pentium M */ | ||
| 247 | break; | 258 | break; |
| 259 | |||
| 260 | case 7: /* Pentium III - Katmai */ | ||
| 261 | case 8: /* Pentium III - Coppermine */ | ||
| 262 | case 10: /* Pentium III Xeon */ | ||
| 263 | case 11: /* Pentium III - Tualatin */ | ||
| 264 | break; | ||
| 265 | |||
| 266 | case 9: /* Pentium M - Banias */ | ||
| 267 | case 13: /* Pentium M - Dothan */ | ||
| 268 | break; | ||
| 269 | |||
| 248 | default: | 270 | default: |
| 249 | pr_cont("unsupported p6 CPU model %d ", | 271 | pr_cont("unsupported p6 CPU model %d ", boot_cpu_data.x86_model); |
| 250 | boot_cpu_data.x86_model); | ||
| 251 | return -ENODEV; | 272 | return -ENODEV; |
| 252 | } | 273 | } |
| 253 | 274 | ||
| 254 | x86_pmu = p6_pmu; | ||
| 255 | |||
| 256 | memcpy(hw_cache_event_ids, p6_hw_cache_event_ids, | 275 | memcpy(hw_cache_event_ids, p6_hw_cache_event_ids, |
| 257 | sizeof(hw_cache_event_ids)); | 276 | sizeof(hw_cache_event_ids)); |
| 258 | 277 | ||
| 259 | |||
| 260 | return 0; | 278 | return 0; |
| 261 | } | 279 | } |
diff --git a/arch/x86/kernel/machine_kexec_64.c b/arch/x86/kernel/machine_kexec_64.c index 4eabc160696f..679cef0791cd 100644 --- a/arch/x86/kernel/machine_kexec_64.c +++ b/arch/x86/kernel/machine_kexec_64.c | |||
| @@ -279,5 +279,7 @@ void arch_crash_save_vmcoreinfo(void) | |||
| 279 | VMCOREINFO_SYMBOL(node_data); | 279 | VMCOREINFO_SYMBOL(node_data); |
| 280 | VMCOREINFO_LENGTH(node_data, MAX_NUMNODES); | 280 | VMCOREINFO_LENGTH(node_data, MAX_NUMNODES); |
| 281 | #endif | 281 | #endif |
| 282 | vmcoreinfo_append_str("KERNELOFFSET=%lx\n", | ||
| 283 | (unsigned long)&_text - __START_KERNEL); | ||
| 282 | } | 284 | } |
| 283 | 285 | ||
diff --git a/arch/x86/kernel/pci-dma.c b/arch/x86/kernel/pci-dma.c index 872079a67e4d..f7d0672481fd 100644 --- a/arch/x86/kernel/pci-dma.c +++ b/arch/x86/kernel/pci-dma.c | |||
| @@ -100,8 +100,10 @@ void *dma_generic_alloc_coherent(struct device *dev, size_t size, | |||
| 100 | flag |= __GFP_ZERO; | 100 | flag |= __GFP_ZERO; |
| 101 | again: | 101 | again: |
| 102 | page = NULL; | 102 | page = NULL; |
| 103 | if (!(flag & GFP_ATOMIC)) | 103 | /* CMA can be used only in the context which permits sleeping */ |
| 104 | if (flag & __GFP_WAIT) | ||
| 104 | page = dma_alloc_from_contiguous(dev, count, get_order(size)); | 105 | page = dma_alloc_from_contiguous(dev, count, get_order(size)); |
| 106 | /* fallback */ | ||
| 105 | if (!page) | 107 | if (!page) |
| 106 | page = alloc_pages_node(dev_to_node(dev), flag, get_order(size)); | 108 | page = alloc_pages_node(dev_to_node(dev), flag, get_order(size)); |
| 107 | if (!page) | 109 | if (!page) |
diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index acb3b606613e..cfbe99f88830 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c | |||
| @@ -653,13 +653,10 @@ unsigned long native_calibrate_tsc(void) | |||
| 653 | 653 | ||
| 654 | /* Calibrate TSC using MSR for Intel Atom SoCs */ | 654 | /* Calibrate TSC using MSR for Intel Atom SoCs */ |
| 655 | local_irq_save(flags); | 655 | local_irq_save(flags); |
| 656 | i = try_msr_calibrate_tsc(&fast_calibrate); | 656 | fast_calibrate = try_msr_calibrate_tsc(); |
| 657 | local_irq_restore(flags); | 657 | local_irq_restore(flags); |
| 658 | if (i >= 0) { | 658 | if (fast_calibrate) |
| 659 | if (i == 0) | ||
| 660 | pr_warn("Fast TSC calibration using MSR failed\n"); | ||
| 661 | return fast_calibrate; | 659 | return fast_calibrate; |
| 662 | } | ||
| 663 | 660 | ||
| 664 | local_irq_save(flags); | 661 | local_irq_save(flags); |
| 665 | fast_calibrate = quick_pit_calibrate(); | 662 | fast_calibrate = quick_pit_calibrate(); |
diff --git a/arch/x86/kernel/tsc_msr.c b/arch/x86/kernel/tsc_msr.c index 8b5434f4389f..92ae6acac8a7 100644 --- a/arch/x86/kernel/tsc_msr.c +++ b/arch/x86/kernel/tsc_msr.c | |||
| @@ -53,7 +53,7 @@ static struct freq_desc freq_desc_tables[] = { | |||
| 53 | /* TNG */ | 53 | /* TNG */ |
| 54 | { 6, 0x4a, 1, { 0, FREQ_100, FREQ_133, 0, 0, 0, 0, 0 } }, | 54 | { 6, 0x4a, 1, { 0, FREQ_100, FREQ_133, 0, 0, 0, 0, 0 } }, |
| 55 | /* VLV2 */ | 55 | /* VLV2 */ |
| 56 | { 6, 0x37, 1, { 0, FREQ_100, FREQ_133, FREQ_166, 0, 0, 0, 0 } }, | 56 | { 6, 0x37, 1, { FREQ_83, FREQ_100, FREQ_133, FREQ_166, 0, 0, 0, 0 } }, |
| 57 | /* ANN */ | 57 | /* ANN */ |
| 58 | { 6, 0x5a, 1, { FREQ_83, FREQ_100, FREQ_133, FREQ_100, 0, 0, 0, 0 } }, | 58 | { 6, 0x5a, 1, { FREQ_83, FREQ_100, FREQ_133, FREQ_100, 0, 0, 0, 0 } }, |
| 59 | }; | 59 | }; |
| @@ -77,21 +77,18 @@ static int match_cpu(u8 family, u8 model) | |||
| 77 | 77 | ||
| 78 | /* | 78 | /* |
| 79 | * Do MSR calibration only for known/supported CPUs. | 79 | * Do MSR calibration only for known/supported CPUs. |
| 80 | * Return values: | 80 | * |
| 81 | * -1: CPU is unknown/unsupported for MSR based calibration | 81 | * Returns the calibration value or 0 if MSR calibration failed. |
| 82 | * 0: CPU is known/supported, but calibration failed | ||
| 83 | * 1: CPU is known/supported, and calibration succeeded | ||
| 84 | */ | 82 | */ |
| 85 | int try_msr_calibrate_tsc(unsigned long *fast_calibrate) | 83 | unsigned long try_msr_calibrate_tsc(void) |
| 86 | { | 84 | { |
| 87 | int cpu_index; | ||
| 88 | u32 lo, hi, ratio, freq_id, freq; | 85 | u32 lo, hi, ratio, freq_id, freq; |
| 86 | unsigned long res; | ||
| 87 | int cpu_index; | ||
| 89 | 88 | ||
| 90 | cpu_index = match_cpu(boot_cpu_data.x86, boot_cpu_data.x86_model); | 89 | cpu_index = match_cpu(boot_cpu_data.x86, boot_cpu_data.x86_model); |
| 91 | if (cpu_index < 0) | 90 | if (cpu_index < 0) |
| 92 | return -1; | 91 | return 0; |
| 93 | |||
| 94 | *fast_calibrate = 0; | ||
| 95 | 92 | ||
| 96 | if (freq_desc_tables[cpu_index].msr_plat) { | 93 | if (freq_desc_tables[cpu_index].msr_plat) { |
| 97 | rdmsr(MSR_PLATFORM_INFO, lo, hi); | 94 | rdmsr(MSR_PLATFORM_INFO, lo, hi); |
| @@ -103,7 +100,7 @@ int try_msr_calibrate_tsc(unsigned long *fast_calibrate) | |||
| 103 | pr_info("Maximum core-clock to bus-clock ratio: 0x%x\n", ratio); | 100 | pr_info("Maximum core-clock to bus-clock ratio: 0x%x\n", ratio); |
| 104 | 101 | ||
| 105 | if (!ratio) | 102 | if (!ratio) |
| 106 | return 0; | 103 | goto fail; |
| 107 | 104 | ||
| 108 | /* Get FSB FREQ ID */ | 105 | /* Get FSB FREQ ID */ |
| 109 | rdmsr(MSR_FSB_FREQ, lo, hi); | 106 | rdmsr(MSR_FSB_FREQ, lo, hi); |
| @@ -112,16 +109,19 @@ int try_msr_calibrate_tsc(unsigned long *fast_calibrate) | |||
| 112 | pr_info("Resolved frequency ID: %u, frequency: %u KHz\n", | 109 | pr_info("Resolved frequency ID: %u, frequency: %u KHz\n", |
| 113 | freq_id, freq); | 110 | freq_id, freq); |
| 114 | if (!freq) | 111 | if (!freq) |
| 115 | return 0; | 112 | goto fail; |
| 116 | 113 | ||
| 117 | /* TSC frequency = maximum resolved freq * maximum resolved bus ratio */ | 114 | /* TSC frequency = maximum resolved freq * maximum resolved bus ratio */ |
| 118 | *fast_calibrate = freq * ratio; | 115 | res = freq * ratio; |
| 119 | pr_info("TSC runs at %lu KHz\n", *fast_calibrate); | 116 | pr_info("TSC runs at %lu KHz\n", res); |
| 120 | 117 | ||
| 121 | #ifdef CONFIG_X86_LOCAL_APIC | 118 | #ifdef CONFIG_X86_LOCAL_APIC |
| 122 | lapic_timer_frequency = (freq * 1000) / HZ; | 119 | lapic_timer_frequency = (freq * 1000) / HZ; |
| 123 | pr_info("lapic_timer_frequency = %d\n", lapic_timer_frequency); | 120 | pr_info("lapic_timer_frequency = %d\n", lapic_timer_frequency); |
| 124 | #endif | 121 | #endif |
| 122 | return res; | ||
| 125 | 123 | ||
| 126 | return 1; | 124 | fail: |
| 125 | pr_warn("Fast TSC calibration using MSR failed\n"); | ||
| 126 | return 0; | ||
| 127 | } | 127 | } |
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index e50425d0f5f7..9b531351a587 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c | |||
| @@ -2672,6 +2672,7 @@ static int __direct_map(struct kvm_vcpu *vcpu, gpa_t v, int write, | |||
| 2672 | break; | 2672 | break; |
| 2673 | } | 2673 | } |
| 2674 | 2674 | ||
| 2675 | drop_large_spte(vcpu, iterator.sptep); | ||
| 2675 | if (!is_shadow_present_pte(*iterator.sptep)) { | 2676 | if (!is_shadow_present_pte(*iterator.sptep)) { |
| 2676 | u64 base_addr = iterator.addr; | 2677 | u64 base_addr = iterator.addr; |
| 2677 | 2678 | ||
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index a06f101ef64b..392752834751 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c | |||
| @@ -6688,7 +6688,7 @@ static bool nested_vmx_exit_handled(struct kvm_vcpu *vcpu) | |||
| 6688 | else if (is_page_fault(intr_info)) | 6688 | else if (is_page_fault(intr_info)) |
| 6689 | return enable_ept; | 6689 | return enable_ept; |
| 6690 | else if (is_no_device(intr_info) && | 6690 | else if (is_no_device(intr_info) && |
| 6691 | !(nested_read_cr0(vmcs12) & X86_CR0_TS)) | 6691 | !(vmcs12->guest_cr0 & X86_CR0_TS)) |
| 6692 | return 0; | 6692 | return 0; |
| 6693 | return vmcs12->exception_bitmap & | 6693 | return vmcs12->exception_bitmap & |
| 6694 | (1u << (intr_info & INTR_INFO_VECTOR_MASK)); | 6694 | (1u << (intr_info & INTR_INFO_VECTOR_MASK)); |
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 39c28f09dfd5..2b8578432d5b 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
| @@ -6186,7 +6186,7 @@ static int complete_emulated_mmio(struct kvm_vcpu *vcpu) | |||
| 6186 | frag->len -= len; | 6186 | frag->len -= len; |
| 6187 | } | 6187 | } |
| 6188 | 6188 | ||
| 6189 | if (vcpu->mmio_cur_fragment == vcpu->mmio_nr_fragments) { | 6189 | if (vcpu->mmio_cur_fragment >= vcpu->mmio_nr_fragments) { |
| 6190 | vcpu->mmio_needed = 0; | 6190 | vcpu->mmio_needed = 0; |
| 6191 | 6191 | ||
| 6192 | /* FIXME: return into emulator if single-stepping. */ | 6192 | /* FIXME: return into emulator if single-stepping. */ |
diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig index ba56e11cbf77..c87ae7c6e5f9 100644 --- a/arch/xtensa/Kconfig +++ b/arch/xtensa/Kconfig | |||
| @@ -20,6 +20,7 @@ config XTENSA | |||
| 20 | select HAVE_FUNCTION_TRACER | 20 | select HAVE_FUNCTION_TRACER |
| 21 | select HAVE_IRQ_TIME_ACCOUNTING | 21 | select HAVE_IRQ_TIME_ACCOUNTING |
| 22 | select HAVE_PERF_EVENTS | 22 | select HAVE_PERF_EVENTS |
| 23 | select COMMON_CLK | ||
| 23 | help | 24 | help |
| 24 | Xtensa processors are 32-bit RISC machines designed by Tensilica | 25 | Xtensa processors are 32-bit RISC machines designed by Tensilica |
| 25 | primarily for embedded systems. These processors are both | 26 | primarily for embedded systems. These processors are both |
| @@ -80,7 +81,6 @@ choice | |||
| 80 | config XTENSA_VARIANT_FSF | 81 | config XTENSA_VARIANT_FSF |
| 81 | bool "fsf - default (not generic) configuration" | 82 | bool "fsf - default (not generic) configuration" |
| 82 | select MMU | 83 | select MMU |
| 83 | select HAVE_XTENSA_GPIO32 | ||
| 84 | 84 | ||
| 85 | config XTENSA_VARIANT_DC232B | 85 | config XTENSA_VARIANT_DC232B |
| 86 | bool "dc232b - Diamond 232L Standard Core Rev.B (LE)" | 86 | bool "dc232b - Diamond 232L Standard Core Rev.B (LE)" |
| @@ -135,7 +135,6 @@ config HAVE_SMP | |||
| 135 | config SMP | 135 | config SMP |
| 136 | bool "Enable Symmetric multi-processing support" | 136 | bool "Enable Symmetric multi-processing support" |
| 137 | depends on HAVE_SMP | 137 | depends on HAVE_SMP |
| 138 | select USE_GENERIC_SMP_HELPERS | ||
| 139 | select GENERIC_SMP_IDLE_THREAD | 138 | select GENERIC_SMP_IDLE_THREAD |
| 140 | help | 139 | help |
| 141 | Enabled SMP Software; allows more than one CPU/CORE | 140 | Enabled SMP Software; allows more than one CPU/CORE |
diff --git a/arch/xtensa/boot/dts/xtfpga.dtsi b/arch/xtensa/boot/dts/xtfpga.dtsi index 46b4f5eab421..e7370b11348e 100644 --- a/arch/xtensa/boot/dts/xtfpga.dtsi +++ b/arch/xtensa/boot/dts/xtfpga.dtsi | |||
| @@ -35,6 +35,13 @@ | |||
| 35 | interrupt-controller; | 35 | interrupt-controller; |
| 36 | }; | 36 | }; |
| 37 | 37 | ||
| 38 | clocks { | ||
| 39 | osc: main-oscillator { | ||
| 40 | #clock-cells = <0>; | ||
| 41 | compatible = "fixed-clock"; | ||
| 42 | }; | ||
| 43 | }; | ||
| 44 | |||
| 38 | serial0: serial@fd050020 { | 45 | serial0: serial@fd050020 { |
| 39 | device_type = "serial"; | 46 | device_type = "serial"; |
| 40 | compatible = "ns16550a"; | 47 | compatible = "ns16550a"; |
| @@ -42,9 +49,7 @@ | |||
| 42 | reg = <0xfd050020 0x20>; | 49 | reg = <0xfd050020 0x20>; |
| 43 | reg-shift = <2>; | 50 | reg-shift = <2>; |
| 44 | interrupts = <0 1>; /* external irq 0 */ | 51 | interrupts = <0 1>; /* external irq 0 */ |
| 45 | /* Filled in by platform_setup from FPGA register | 52 | clocks = <&osc>; |
| 46 | * clock-frequency = <100000000>; | ||
| 47 | */ | ||
| 48 | }; | 53 | }; |
| 49 | 54 | ||
| 50 | enet0: ethoc@fd030000 { | 55 | enet0: ethoc@fd030000 { |
| @@ -52,5 +57,6 @@ | |||
| 52 | reg = <0xfd030000 0x4000 0xfd800000 0x4000>; | 57 | reg = <0xfd030000 0x4000 0xfd800000 0x4000>; |
| 53 | interrupts = <1 1>; /* external irq 1 */ | 58 | interrupts = <1 1>; /* external irq 1 */ |
| 54 | local-mac-address = [00 50 c2 13 6f 00]; | 59 | local-mac-address = [00 50 c2 13 6f 00]; |
| 60 | clocks = <&osc>; | ||
| 55 | }; | 61 | }; |
| 56 | }; | 62 | }; |
diff --git a/arch/xtensa/include/asm/io.h b/arch/xtensa/include/asm/io.h index 2a042d430c25..74944207167e 100644 --- a/arch/xtensa/include/asm/io.h +++ b/arch/xtensa/include/asm/io.h | |||
| @@ -25,7 +25,7 @@ | |||
| 25 | 25 | ||
| 26 | #ifdef CONFIG_MMU | 26 | #ifdef CONFIG_MMU |
| 27 | 27 | ||
| 28 | #if XCHAL_HAVE_PTP_MMU && XCHAL_HAVE_SPANNING_WAY && CONFIG_OF | 28 | #if XCHAL_HAVE_PTP_MMU && XCHAL_HAVE_SPANNING_WAY && defined(CONFIG_OF) |
| 29 | extern unsigned long xtensa_kio_paddr; | 29 | extern unsigned long xtensa_kio_paddr; |
| 30 | 30 | ||
| 31 | static inline unsigned long xtensa_get_kio_paddr(void) | 31 | static inline unsigned long xtensa_get_kio_paddr(void) |
diff --git a/arch/xtensa/include/asm/traps.h b/arch/xtensa/include/asm/traps.h index 8c194f6af45e..677bfcf4ee5d 100644 --- a/arch/xtensa/include/asm/traps.h +++ b/arch/xtensa/include/asm/traps.h | |||
| @@ -23,25 +23,37 @@ void secondary_trap_init(void); | |||
| 23 | 23 | ||
| 24 | static inline void spill_registers(void) | 24 | static inline void spill_registers(void) |
| 25 | { | 25 | { |
| 26 | 26 | #if XCHAL_NUM_AREGS > 16 | |
| 27 | __asm__ __volatile__ ( | 27 | __asm__ __volatile__ ( |
| 28 | "movi a14, "__stringify((1 << PS_EXCM_BIT) | LOCKLEVEL)"\n\t" | 28 | " call12 1f\n" |
| 29 | "mov a12, a0\n\t" | 29 | " _j 2f\n" |
| 30 | "rsr a13, sar\n\t" | 30 | " retw\n" |
| 31 | "xsr a14, ps\n\t" | 31 | " .align 4\n" |
| 32 | "movi a0, _spill_registers\n\t" | 32 | "1:\n" |
| 33 | "rsync\n\t" | 33 | " _entry a1, 48\n" |
| 34 | "callx0 a0\n\t" | 34 | " addi a12, a0, 3\n" |
| 35 | "mov a0, a12\n\t" | 35 | #if XCHAL_NUM_AREGS > 32 |
| 36 | "wsr a13, sar\n\t" | 36 | " .rept (" __stringify(XCHAL_NUM_AREGS) " - 32) / 12\n" |
| 37 | "wsr a14, ps\n\t" | 37 | " _entry a1, 48\n" |
| 38 | : : | 38 | " mov a12, a0\n" |
| 39 | #if defined(CONFIG_FRAME_POINTER) | 39 | " .endr\n" |
| 40 | : "a2", "a3", "a4", "a11", "a12", "a13", "a14", "a15", | 40 | #endif |
| 41 | " _entry a1, 48\n" | ||
| 42 | #if XCHAL_NUM_AREGS % 12 == 0 | ||
| 43 | " mov a8, a8\n" | ||
| 44 | #elif XCHAL_NUM_AREGS % 12 == 4 | ||
| 45 | " mov a12, a12\n" | ||
| 46 | #elif XCHAL_NUM_AREGS % 12 == 8 | ||
| 47 | " mov a4, a4\n" | ||
| 48 | #endif | ||
| 49 | " retw\n" | ||
| 50 | "2:\n" | ||
| 51 | : : : "a12", "a13", "memory"); | ||
| 41 | #else | 52 | #else |
| 42 | : "a2", "a3", "a4", "a7", "a11", "a12", "a13", "a14", "a15", | 53 | __asm__ __volatile__ ( |
| 54 | " mov a12, a12\n" | ||
| 55 | : : : "memory"); | ||
| 43 | #endif | 56 | #endif |
| 44 | "memory"); | ||
| 45 | } | 57 | } |
| 46 | 58 | ||
| 47 | #endif /* _XTENSA_TRAPS_H */ | 59 | #endif /* _XTENSA_TRAPS_H */ |
diff --git a/arch/xtensa/include/asm/vectors.h b/arch/xtensa/include/asm/vectors.h index 5791b45d5a5d..f74ddfbb92ef 100644 --- a/arch/xtensa/include/asm/vectors.h +++ b/arch/xtensa/include/asm/vectors.h | |||
| @@ -25,7 +25,7 @@ | |||
| 25 | #define XCHAL_KIO_DEFAULT_PADDR 0xf0000000 | 25 | #define XCHAL_KIO_DEFAULT_PADDR 0xf0000000 |
| 26 | #define XCHAL_KIO_SIZE 0x10000000 | 26 | #define XCHAL_KIO_SIZE 0x10000000 |
| 27 | 27 | ||
| 28 | #if XCHAL_HAVE_PTP_MMU && XCHAL_HAVE_SPANNING_WAY && CONFIG_OF | 28 | #if XCHAL_HAVE_PTP_MMU && XCHAL_HAVE_SPANNING_WAY && defined(CONFIG_OF) |
| 29 | #define XCHAL_KIO_PADDR xtensa_get_kio_paddr() | 29 | #define XCHAL_KIO_PADDR xtensa_get_kio_paddr() |
| 30 | #else | 30 | #else |
| 31 | #define XCHAL_KIO_PADDR XCHAL_KIO_DEFAULT_PADDR | 31 | #define XCHAL_KIO_PADDR XCHAL_KIO_DEFAULT_PADDR |
diff --git a/arch/xtensa/include/uapi/asm/unistd.h b/arch/xtensa/include/uapi/asm/unistd.h index 51940fec6990..b9395529f02d 100644 --- a/arch/xtensa/include/uapi/asm/unistd.h +++ b/arch/xtensa/include/uapi/asm/unistd.h | |||
| @@ -734,7 +734,12 @@ __SYSCALL(332, sys_finit_module, 3) | |||
| 734 | #define __NR_accept4 333 | 734 | #define __NR_accept4 333 |
| 735 | __SYSCALL(333, sys_accept4, 4) | 735 | __SYSCALL(333, sys_accept4, 4) |
| 736 | 736 | ||
| 737 | #define __NR_syscall_count 334 | 737 | #define __NR_sched_setattr 334 |
| 738 | __SYSCALL(334, sys_sched_setattr, 2) | ||
| 739 | #define __NR_sched_getattr 335 | ||
| 740 | __SYSCALL(335, sys_sched_getattr, 3) | ||
| 741 | |||
| 742 | #define __NR_syscall_count 336 | ||
| 738 | 743 | ||
| 739 | /* | 744 | /* |
| 740 | * sysxtensa syscall handler | 745 | * sysxtensa syscall handler |
diff --git a/arch/xtensa/kernel/entry.S b/arch/xtensa/kernel/entry.S index 21dbe6bdb8ed..ef7f4990722b 100644 --- a/arch/xtensa/kernel/entry.S +++ b/arch/xtensa/kernel/entry.S | |||
| @@ -1081,196 +1081,53 @@ ENTRY(fast_syscall_spill_registers) | |||
| 1081 | 1081 | ||
| 1082 | rsr a0, sar | 1082 | rsr a0, sar |
| 1083 | s32i a3, a2, PT_AREG3 | 1083 | s32i a3, a2, PT_AREG3 |
| 1084 | s32i a4, a2, PT_AREG4 | 1084 | s32i a0, a2, PT_SAR |
| 1085 | s32i a0, a2, PT_AREG5 # store SAR to PT_AREG5 | ||
| 1086 | 1085 | ||
| 1087 | /* The spill routine might clobber a7, a11, and a15. */ | 1086 | /* The spill routine might clobber a4, a7, a8, a11, a12, and a15. */ |
| 1088 | 1087 | ||
| 1088 | s32i a4, a2, PT_AREG4 | ||
| 1089 | s32i a7, a2, PT_AREG7 | 1089 | s32i a7, a2, PT_AREG7 |
| 1090 | s32i a8, a2, PT_AREG8 | ||
| 1090 | s32i a11, a2, PT_AREG11 | 1091 | s32i a11, a2, PT_AREG11 |
| 1092 | s32i a12, a2, PT_AREG12 | ||
| 1091 | s32i a15, a2, PT_AREG15 | 1093 | s32i a15, a2, PT_AREG15 |
| 1092 | 1094 | ||
| 1093 | call0 _spill_registers # destroys a3, a4, and SAR | ||
| 1094 | |||
| 1095 | /* Advance PC, restore registers and SAR, and return from exception. */ | ||
| 1096 | |||
| 1097 | l32i a3, a2, PT_AREG5 | ||
| 1098 | l32i a4, a2, PT_AREG4 | ||
| 1099 | l32i a0, a2, PT_AREG0 | ||
| 1100 | wsr a3, sar | ||
| 1101 | l32i a3, a2, PT_AREG3 | ||
| 1102 | |||
| 1103 | /* Restore clobbered registers. */ | ||
| 1104 | |||
| 1105 | l32i a7, a2, PT_AREG7 | ||
| 1106 | l32i a11, a2, PT_AREG11 | ||
| 1107 | l32i a15, a2, PT_AREG15 | ||
| 1108 | |||
| 1109 | movi a2, 0 | ||
| 1110 | rfe | ||
| 1111 | |||
| 1112 | ENDPROC(fast_syscall_spill_registers) | ||
| 1113 | |||
| 1114 | /* Fixup handler. | ||
| 1115 | * | ||
| 1116 | * We get here if the spill routine causes an exception, e.g. tlb miss. | ||
| 1117 | * We basically restore WINDOWBASE and WINDOWSTART to the condition when | ||
| 1118 | * we entered the spill routine and jump to the user exception handler. | ||
| 1119 | * | ||
| 1120 | * a0: value of depc, original value in depc | ||
| 1121 | * a2: trashed, original value in EXC_TABLE_DOUBLE_SAVE | ||
| 1122 | * a3: exctable, original value in excsave1 | ||
| 1123 | */ | ||
| 1124 | |||
| 1125 | ENTRY(fast_syscall_spill_registers_fixup) | ||
| 1126 | |||
| 1127 | rsr a2, windowbase # get current windowbase (a2 is saved) | ||
| 1128 | xsr a0, depc # restore depc and a0 | ||
| 1129 | ssl a2 # set shift (32 - WB) | ||
| 1130 | |||
| 1131 | /* We need to make sure the current registers (a0-a3) are preserved. | ||
| 1132 | * To do this, we simply set the bit for the current window frame | ||
| 1133 | * in WS, so that the exception handlers save them to the task stack. | ||
| 1134 | */ | ||
| 1135 | |||
| 1136 | xsr a3, excsave1 # get spill-mask | ||
| 1137 | slli a3, a3, 1 # shift left by one | ||
| 1138 | |||
| 1139 | slli a2, a3, 32-WSBITS | ||
| 1140 | src a2, a3, a2 # a2 = xxwww1yyxxxwww1yy...... | ||
| 1141 | wsr a2, windowstart # set corrected windowstart | ||
| 1142 | |||
| 1143 | srli a3, a3, 1 | ||
| 1144 | rsr a2, excsave1 | ||
| 1145 | l32i a2, a2, EXC_TABLE_DOUBLE_SAVE # restore a2 | ||
| 1146 | xsr a2, excsave1 | ||
| 1147 | s32i a3, a2, EXC_TABLE_DOUBLE_SAVE # save a3 | ||
| 1148 | l32i a3, a2, EXC_TABLE_PARAM # original WB (in user task) | ||
| 1149 | xsr a2, excsave1 | ||
| 1150 | |||
| 1151 | /* Return to the original (user task) WINDOWBASE. | ||
| 1152 | * We leave the following frame behind: | ||
| 1153 | * a0, a1, a2 same | ||
| 1154 | * a3: trashed (saved in EXC_TABLE_DOUBLE_SAVE) | ||
| 1155 | * depc: depc (we have to return to that address) | ||
| 1156 | * excsave_1: exctable | ||
| 1157 | */ | ||
| 1158 | |||
| 1159 | wsr a3, windowbase | ||
| 1160 | rsync | ||
| 1161 | |||
| 1162 | /* We are now in the original frame when we entered _spill_registers: | ||
| 1163 | * a0: return address | ||
| 1164 | * a1: used, stack pointer | ||
| 1165 | * a2: kernel stack pointer | ||
| 1166 | * a3: available | ||
| 1167 | * depc: exception address | ||
| 1168 | * excsave: exctable | ||
| 1169 | * Note: This frame might be the same as above. | ||
| 1170 | */ | ||
| 1171 | |||
| 1172 | /* Setup stack pointer. */ | ||
| 1173 | |||
| 1174 | addi a2, a2, -PT_USER_SIZE | ||
| 1175 | s32i a0, a2, PT_AREG0 | ||
| 1176 | |||
| 1177 | /* Make sure we return to this fixup handler. */ | ||
| 1178 | |||
| 1179 | movi a3, fast_syscall_spill_registers_fixup_return | ||
| 1180 | s32i a3, a2, PT_DEPC # setup depc | ||
| 1181 | |||
| 1182 | /* Jump to the exception handler. */ | ||
| 1183 | |||
| 1184 | rsr a3, excsave1 | ||
| 1185 | rsr a0, exccause | ||
| 1186 | addx4 a0, a0, a3 # find entry in table | ||
| 1187 | l32i a0, a0, EXC_TABLE_FAST_USER # load handler | ||
| 1188 | l32i a3, a3, EXC_TABLE_DOUBLE_SAVE | ||
| 1189 | jx a0 | ||
| 1190 | |||
| 1191 | ENDPROC(fast_syscall_spill_registers_fixup) | ||
| 1192 | |||
| 1193 | ENTRY(fast_syscall_spill_registers_fixup_return) | ||
| 1194 | |||
| 1195 | /* When we return here, all registers have been restored (a2: DEPC) */ | ||
| 1196 | |||
| 1197 | wsr a2, depc # exception address | ||
| 1198 | |||
| 1199 | /* Restore fixup handler. */ | ||
| 1200 | |||
| 1201 | rsr a2, excsave1 | ||
| 1202 | s32i a3, a2, EXC_TABLE_DOUBLE_SAVE | ||
| 1203 | movi a3, fast_syscall_spill_registers_fixup | ||
| 1204 | s32i a3, a2, EXC_TABLE_FIXUP | ||
| 1205 | rsr a3, windowbase | ||
| 1206 | s32i a3, a2, EXC_TABLE_PARAM | ||
| 1207 | l32i a2, a2, EXC_TABLE_KSTK | ||
| 1208 | |||
| 1209 | /* Load WB at the time the exception occurred. */ | ||
| 1210 | |||
| 1211 | rsr a3, sar # WB is still in SAR | ||
| 1212 | neg a3, a3 | ||
| 1213 | wsr a3, windowbase | ||
| 1214 | rsync | ||
| 1215 | |||
| 1216 | rsr a3, excsave1 | ||
| 1217 | l32i a3, a3, EXC_TABLE_DOUBLE_SAVE | ||
| 1218 | |||
| 1219 | rfde | ||
| 1220 | |||
| 1221 | ENDPROC(fast_syscall_spill_registers_fixup_return) | ||
| 1222 | |||
| 1223 | /* | ||
| 1224 | * spill all registers. | ||
| 1225 | * | ||
| 1226 | * This is not a real function. The following conditions must be met: | ||
| 1227 | * | ||
| 1228 | * - must be called with call0. | ||
| 1229 | * - uses a3, a4 and SAR. | ||
| 1230 | * - the last 'valid' register of each frame are clobbered. | ||
| 1231 | * - the caller must have registered a fixup handler | ||
| 1232 | * (or be inside a critical section) | ||
| 1233 | * - PS_EXCM must be set (PS_WOE cleared?) | ||
| 1234 | */ | ||
| 1235 | |||
| 1236 | ENTRY(_spill_registers) | ||
| 1237 | |||
| 1238 | /* | 1095 | /* |
| 1239 | * Rotate ws so that the current windowbase is at bit 0. | 1096 | * Rotate ws so that the current windowbase is at bit 0. |
| 1240 | * Assume ws = xxxwww1yy (www1 current window frame). | 1097 | * Assume ws = xxxwww1yy (www1 current window frame). |
| 1241 | * Rotate ws right so that a4 = yyxxxwww1. | 1098 | * Rotate ws right so that a4 = yyxxxwww1. |
| 1242 | */ | 1099 | */ |
| 1243 | 1100 | ||
| 1244 | rsr a4, windowbase | 1101 | rsr a0, windowbase |
| 1245 | rsr a3, windowstart # a3 = xxxwww1yy | 1102 | rsr a3, windowstart # a3 = xxxwww1yy |
| 1246 | ssr a4 # holds WB | 1103 | ssr a0 # holds WB |
| 1247 | slli a4, a3, WSBITS | 1104 | slli a0, a3, WSBITS |
| 1248 | or a3, a3, a4 # a3 = xxxwww1yyxxxwww1yy | 1105 | or a3, a3, a0 # a3 = xxxwww1yyxxxwww1yy |
| 1249 | srl a3, a3 # a3 = 00xxxwww1yyxxxwww1 | 1106 | srl a3, a3 # a3 = 00xxxwww1yyxxxwww1 |
| 1250 | 1107 | ||
| 1251 | /* We are done if there are no more than the current register frame. */ | 1108 | /* We are done if there are no more than the current register frame. */ |
| 1252 | 1109 | ||
| 1253 | extui a3, a3, 1, WSBITS-1 # a3 = 0yyxxxwww | 1110 | extui a3, a3, 1, WSBITS-1 # a3 = 0yyxxxwww |
| 1254 | movi a4, (1 << (WSBITS-1)) | 1111 | movi a0, (1 << (WSBITS-1)) |
| 1255 | _beqz a3, .Lnospill # only one active frame? jump | 1112 | _beqz a3, .Lnospill # only one active frame? jump |
| 1256 | 1113 | ||
| 1257 | /* We want 1 at the top, so that we return to the current windowbase */ | 1114 | /* We want 1 at the top, so that we return to the current windowbase */ |
| 1258 | 1115 | ||
| 1259 | or a3, a3, a4 # 1yyxxxwww | 1116 | or a3, a3, a0 # 1yyxxxwww |
| 1260 | 1117 | ||
| 1261 | /* Skip empty frames - get 'oldest' WINDOWSTART-bit. */ | 1118 | /* Skip empty frames - get 'oldest' WINDOWSTART-bit. */ |
| 1262 | 1119 | ||
| 1263 | wsr a3, windowstart # save shifted windowstart | 1120 | wsr a3, windowstart # save shifted windowstart |
| 1264 | neg a4, a3 | 1121 | neg a0, a3 |
| 1265 | and a3, a4, a3 # first bit set from right: 000010000 | 1122 | and a3, a0, a3 # first bit set from right: 000010000 |
| 1266 | 1123 | ||
| 1267 | ffs_ws a4, a3 # a4: shifts to skip empty frames | 1124 | ffs_ws a0, a3 # a0: shifts to skip empty frames |
| 1268 | movi a3, WSBITS | 1125 | movi a3, WSBITS |
| 1269 | sub a4, a3, a4 # WSBITS-a4:number of 0-bits from right | 1126 | sub a0, a3, a0 # WSBITS-a0:number of 0-bits from right |
| 1270 | ssr a4 # save in SAR for later. | 1127 | ssr a0 # save in SAR for later. |
| 1271 | 1128 | ||
| 1272 | rsr a3, windowbase | 1129 | rsr a3, windowbase |
| 1273 | add a3, a3, a4 | 1130 | add a3, a3, a0 |
| 1274 | wsr a3, windowbase | 1131 | wsr a3, windowbase |
| 1275 | rsync | 1132 | rsync |
| 1276 | 1133 | ||
| @@ -1285,22 +1142,6 @@ ENTRY(_spill_registers) | |||
| 1285 | * we have to save 4,8. or 12 registers. | 1142 | * we have to save 4,8. or 12 registers. |
| 1286 | */ | 1143 | */ |
| 1287 | 1144 | ||
| 1288 | _bbsi.l a3, 1, .Lc4 | ||
| 1289 | _bbsi.l a3, 2, .Lc8 | ||
| 1290 | |||
| 1291 | /* Special case: we have a call12-frame starting at a4. */ | ||
| 1292 | |||
| 1293 | _bbci.l a3, 3, .Lc12 # bit 3 shouldn't be zero! (Jump to Lc12 first) | ||
| 1294 | |||
| 1295 | s32e a4, a1, -16 # a1 is valid with an empty spill area | ||
| 1296 | l32e a4, a5, -12 | ||
| 1297 | s32e a8, a4, -48 | ||
| 1298 | mov a8, a4 | ||
| 1299 | l32e a4, a1, -16 | ||
| 1300 | j .Lc12c | ||
| 1301 | |||
| 1302 | .Lnospill: | ||
| 1303 | ret | ||
| 1304 | 1145 | ||
| 1305 | .Lloop: _bbsi.l a3, 1, .Lc4 | 1146 | .Lloop: _bbsi.l a3, 1, .Lc4 |
| 1306 | _bbci.l a3, 2, .Lc12 | 1147 | _bbci.l a3, 2, .Lc12 |
| @@ -1314,20 +1155,10 @@ ENTRY(_spill_registers) | |||
| 1314 | s32e a9, a4, -28 | 1155 | s32e a9, a4, -28 |
| 1315 | s32e a10, a4, -24 | 1156 | s32e a10, a4, -24 |
| 1316 | s32e a11, a4, -20 | 1157 | s32e a11, a4, -20 |
| 1317 | |||
| 1318 | srli a11, a3, 2 # shift windowbase by 2 | 1158 | srli a11, a3, 2 # shift windowbase by 2 |
| 1319 | rotw 2 | 1159 | rotw 2 |
| 1320 | _bnei a3, 1, .Lloop | 1160 | _bnei a3, 1, .Lloop |
| 1321 | 1161 | j .Lexit | |
| 1322 | .Lexit: /* Done. Do the final rotation, set WS, and return. */ | ||
| 1323 | |||
| 1324 | rotw 1 | ||
| 1325 | rsr a3, windowbase | ||
| 1326 | ssl a3 | ||
| 1327 | movi a3, 1 | ||
| 1328 | sll a3, a3 | ||
| 1329 | wsr a3, windowstart | ||
| 1330 | ret | ||
| 1331 | 1162 | ||
| 1332 | .Lc4: s32e a4, a9, -16 | 1163 | .Lc4: s32e a4, a9, -16 |
| 1333 | s32e a5, a9, -12 | 1164 | s32e a5, a9, -12 |
| @@ -1343,11 +1174,11 @@ ENTRY(_spill_registers) | |||
| 1343 | 1174 | ||
| 1344 | /* 12-register frame (call12) */ | 1175 | /* 12-register frame (call12) */ |
| 1345 | 1176 | ||
| 1346 | l32e a2, a5, -12 | 1177 | l32e a0, a5, -12 |
| 1347 | s32e a8, a2, -48 | 1178 | s32e a8, a0, -48 |
| 1348 | mov a8, a2 | 1179 | mov a8, a0 |
| 1349 | 1180 | ||
| 1350 | .Lc12c: s32e a9, a8, -44 | 1181 | s32e a9, a8, -44 |
| 1351 | s32e a10, a8, -40 | 1182 | s32e a10, a8, -40 |
| 1352 | s32e a11, a8, -36 | 1183 | s32e a11, a8, -36 |
| 1353 | s32e a12, a8, -32 | 1184 | s32e a12, a8, -32 |
| @@ -1367,30 +1198,54 @@ ENTRY(_spill_registers) | |||
| 1367 | */ | 1198 | */ |
| 1368 | 1199 | ||
| 1369 | rotw 1 | 1200 | rotw 1 |
| 1370 | mov a5, a13 | 1201 | mov a4, a13 |
| 1371 | rotw -1 | 1202 | rotw -1 |
| 1372 | 1203 | ||
| 1373 | s32e a4, a9, -16 | 1204 | s32e a4, a8, -16 |
| 1374 | s32e a5, a9, -12 | 1205 | s32e a5, a8, -12 |
| 1375 | s32e a6, a9, -8 | 1206 | s32e a6, a8, -8 |
| 1376 | s32e a7, a9, -4 | 1207 | s32e a7, a8, -4 |
| 1377 | 1208 | ||
| 1378 | rotw 3 | 1209 | rotw 3 |
| 1379 | 1210 | ||
| 1380 | _beqi a3, 1, .Lexit | 1211 | _beqi a3, 1, .Lexit |
| 1381 | j .Lloop | 1212 | j .Lloop |
| 1382 | 1213 | ||
| 1383 | .Linvalid_mask: | 1214 | .Lexit: |
| 1384 | 1215 | ||
| 1385 | /* We get here because of an unrecoverable error in the window | 1216 | /* Done. Do the final rotation and set WS */ |
| 1386 | * registers. If we are in user space, we kill the application, | 1217 | |
| 1387 | * however, this condition is unrecoverable in kernel space. | 1218 | rotw 1 |
| 1388 | */ | 1219 | rsr a3, windowbase |
| 1220 | ssl a3 | ||
| 1221 | movi a3, 1 | ||
| 1222 | sll a3, a3 | ||
| 1223 | wsr a3, windowstart | ||
| 1224 | .Lnospill: | ||
| 1225 | |||
| 1226 | /* Advance PC, restore registers and SAR, and return from exception. */ | ||
| 1227 | |||
| 1228 | l32i a3, a2, PT_SAR | ||
| 1229 | l32i a0, a2, PT_AREG0 | ||
| 1230 | wsr a3, sar | ||
| 1231 | l32i a3, a2, PT_AREG3 | ||
| 1389 | 1232 | ||
| 1390 | rsr a0, ps | 1233 | /* Restore clobbered registers. */ |
| 1391 | _bbci.l a0, PS_UM_BIT, 1f | ||
| 1392 | 1234 | ||
| 1393 | /* User space: Setup a dummy frame and kill application. | 1235 | l32i a4, a2, PT_AREG4 |
| 1236 | l32i a7, a2, PT_AREG7 | ||
| 1237 | l32i a8, a2, PT_AREG8 | ||
| 1238 | l32i a11, a2, PT_AREG11 | ||
| 1239 | l32i a12, a2, PT_AREG12 | ||
| 1240 | l32i a15, a2, PT_AREG15 | ||
| 1241 | |||
| 1242 | movi a2, 0 | ||
| 1243 | rfe | ||
| 1244 | |||
| 1245 | .Linvalid_mask: | ||
| 1246 | |||
| 1247 | /* We get here because of an unrecoverable error in the window | ||
| 1248 | * registers, so set up a dummy frame and kill the user application. | ||
| 1394 | * Note: We assume EXC_TABLE_KSTK contains a valid stack pointer. | 1249 | * Note: We assume EXC_TABLE_KSTK contains a valid stack pointer. |
| 1395 | */ | 1250 | */ |
| 1396 | 1251 | ||
| @@ -1414,14 +1269,136 @@ ENTRY(_spill_registers) | |||
| 1414 | movi a4, do_exit | 1269 | movi a4, do_exit |
| 1415 | callx4 a4 | 1270 | callx4 a4 |
| 1416 | 1271 | ||
| 1417 | 1: /* Kernel space: PANIC! */ | 1272 | /* shouldn't return, so panic */ |
| 1418 | 1273 | ||
| 1419 | wsr a0, excsave1 | 1274 | wsr a0, excsave1 |
| 1420 | movi a0, unrecoverable_exception | 1275 | movi a0, unrecoverable_exception |
| 1421 | callx0 a0 # should not return | 1276 | callx0 a0 # should not return |
| 1422 | 1: j 1b | 1277 | 1: j 1b |
| 1423 | 1278 | ||
| 1424 | ENDPROC(_spill_registers) | 1279 | |
| 1280 | ENDPROC(fast_syscall_spill_registers) | ||
| 1281 | |||
| 1282 | /* Fixup handler. | ||
| 1283 | * | ||
| 1284 | * We get here if the spill routine causes an exception, e.g. tlb miss. | ||
| 1285 | * We basically restore WINDOWBASE and WINDOWSTART to the condition when | ||
| 1286 | * we entered the spill routine and jump to the user exception handler. | ||
| 1287 | * | ||
| 1288 | * Note that we only need to restore the bits in windowstart that have not | ||
| 1289 | * been spilled yet by the _spill_register routine. Luckily, a3 contains a | ||
| 1290 | * rotated windowstart with only those bits set for frames that haven't been | ||
| 1291 | * spilled yet. Because a3 is rotated such that bit 0 represents the register | ||
| 1292 | * frame for the current windowbase - 1, we need to rotate a3 left by the | ||
| 1293 | * value of the current windowbase + 1 and move it to windowstart. | ||
| 1294 | * | ||
| 1295 | * a0: value of depc, original value in depc | ||
| 1296 | * a2: trashed, original value in EXC_TABLE_DOUBLE_SAVE | ||
| 1297 | * a3: exctable, original value in excsave1 | ||
| 1298 | */ | ||
| 1299 | |||
| 1300 | ENTRY(fast_syscall_spill_registers_fixup) | ||
| 1301 | |||
| 1302 | rsr a2, windowbase # get current windowbase (a2 is saved) | ||
| 1303 | xsr a0, depc # restore depc and a0 | ||
| 1304 | ssl a2 # set shift (32 - WB) | ||
| 1305 | |||
| 1306 | /* We need to make sure the current registers (a0-a3) are preserved. | ||
| 1307 | * To do this, we simply set the bit for the current window frame | ||
| 1308 | * in WS, so that the exception handlers save them to the task stack. | ||
| 1309 | * | ||
| 1310 | * Note: we use a3 to set the windowbase, so we take a special care | ||
| 1311 | * of it, saving it in the original _spill_registers frame across | ||
| 1312 | * the exception handler call. | ||
| 1313 | */ | ||
| 1314 | |||
| 1315 | xsr a3, excsave1 # get spill-mask | ||
| 1316 | slli a3, a3, 1 # shift left by one | ||
| 1317 | addi a3, a3, 1 # set the bit for the current window frame | ||
| 1318 | |||
| 1319 | slli a2, a3, 32-WSBITS | ||
| 1320 | src a2, a3, a2 # a2 = xxwww1yyxxxwww1yy...... | ||
| 1321 | wsr a2, windowstart # set corrected windowstart | ||
| 1322 | |||
| 1323 | srli a3, a3, 1 | ||
| 1324 | rsr a2, excsave1 | ||
| 1325 | l32i a2, a2, EXC_TABLE_DOUBLE_SAVE # restore a2 | ||
| 1326 | xsr a2, excsave1 | ||
| 1327 | s32i a3, a2, EXC_TABLE_DOUBLE_SAVE # save a3 | ||
| 1328 | l32i a3, a2, EXC_TABLE_PARAM # original WB (in user task) | ||
| 1329 | xsr a2, excsave1 | ||
| 1330 | |||
| 1331 | /* Return to the original (user task) WINDOWBASE. | ||
| 1332 | * We leave the following frame behind: | ||
| 1333 | * a0, a1, a2 same | ||
| 1334 | * a3: trashed (saved in EXC_TABLE_DOUBLE_SAVE) | ||
| 1335 | * depc: depc (we have to return to that address) | ||
| 1336 | * excsave_1: exctable | ||
| 1337 | */ | ||
| 1338 | |||
| 1339 | wsr a3, windowbase | ||
| 1340 | rsync | ||
| 1341 | |||
| 1342 | /* We are now in the original frame when we entered _spill_registers: | ||
| 1343 | * a0: return address | ||
| 1344 | * a1: used, stack pointer | ||
| 1345 | * a2: kernel stack pointer | ||
| 1346 | * a3: available | ||
| 1347 | * depc: exception address | ||
| 1348 | * excsave: exctable | ||
| 1349 | * Note: This frame might be the same as above. | ||
| 1350 | */ | ||
| 1351 | |||
| 1352 | /* Setup stack pointer. */ | ||
| 1353 | |||
| 1354 | addi a2, a2, -PT_USER_SIZE | ||
| 1355 | s32i a0, a2, PT_AREG0 | ||
| 1356 | |||
| 1357 | /* Make sure we return to this fixup handler. */ | ||
| 1358 | |||
| 1359 | movi a3, fast_syscall_spill_registers_fixup_return | ||
| 1360 | s32i a3, a2, PT_DEPC # setup depc | ||
| 1361 | |||
| 1362 | /* Jump to the exception handler. */ | ||
| 1363 | |||
| 1364 | rsr a3, excsave1 | ||
| 1365 | rsr a0, exccause | ||
| 1366 | addx4 a0, a0, a3 # find entry in table | ||
| 1367 | l32i a0, a0, EXC_TABLE_FAST_USER # load handler | ||
| 1368 | l32i a3, a3, EXC_TABLE_DOUBLE_SAVE | ||
| 1369 | jx a0 | ||
| 1370 | |||
| 1371 | ENDPROC(fast_syscall_spill_registers_fixup) | ||
| 1372 | |||
| 1373 | ENTRY(fast_syscall_spill_registers_fixup_return) | ||
| 1374 | |||
| 1375 | /* When we return here, all registers have been restored (a2: DEPC) */ | ||
| 1376 | |||
| 1377 | wsr a2, depc # exception address | ||
| 1378 | |||
| 1379 | /* Restore fixup handler. */ | ||
| 1380 | |||
| 1381 | rsr a2, excsave1 | ||
| 1382 | s32i a3, a2, EXC_TABLE_DOUBLE_SAVE | ||
| 1383 | movi a3, fast_syscall_spill_registers_fixup | ||
| 1384 | s32i a3, a2, EXC_TABLE_FIXUP | ||
| 1385 | rsr a3, windowbase | ||
| 1386 | s32i a3, a2, EXC_TABLE_PARAM | ||
| 1387 | l32i a2, a2, EXC_TABLE_KSTK | ||
| 1388 | |||
| 1389 | /* Load WB at the time the exception occurred. */ | ||
| 1390 | |||
| 1391 | rsr a3, sar # WB is still in SAR | ||
| 1392 | neg a3, a3 | ||
| 1393 | wsr a3, windowbase | ||
| 1394 | rsync | ||
| 1395 | |||
| 1396 | rsr a3, excsave1 | ||
| 1397 | l32i a3, a3, EXC_TABLE_DOUBLE_SAVE | ||
| 1398 | |||
| 1399 | rfde | ||
| 1400 | |||
| 1401 | ENDPROC(fast_syscall_spill_registers_fixup_return) | ||
| 1425 | 1402 | ||
| 1426 | #ifdef CONFIG_MMU | 1403 | #ifdef CONFIG_MMU |
| 1427 | /* | 1404 | /* |
| @@ -1794,6 +1771,43 @@ ENTRY(system_call) | |||
| 1794 | 1771 | ||
| 1795 | ENDPROC(system_call) | 1772 | ENDPROC(system_call) |
| 1796 | 1773 | ||
| 1774 | /* | ||
| 1775 | * Spill live registers on the kernel stack macro. | ||
| 1776 | * | ||
| 1777 | * Entry condition: ps.woe is set, ps.excm is cleared | ||
| 1778 | * Exit condition: windowstart has single bit set | ||
| 1779 | * May clobber: a12, a13 | ||
| 1780 | */ | ||
| 1781 | .macro spill_registers_kernel | ||
| 1782 | |||
| 1783 | #if XCHAL_NUM_AREGS > 16 | ||
| 1784 | call12 1f | ||
| 1785 | _j 2f | ||
| 1786 | retw | ||
| 1787 | .align 4 | ||
| 1788 | 1: | ||
| 1789 | _entry a1, 48 | ||
| 1790 | addi a12, a0, 3 | ||
| 1791 | #if XCHAL_NUM_AREGS > 32 | ||
| 1792 | .rept (XCHAL_NUM_AREGS - 32) / 12 | ||
| 1793 | _entry a1, 48 | ||
| 1794 | mov a12, a0 | ||
| 1795 | .endr | ||
| 1796 | #endif | ||
| 1797 | _entry a1, 48 | ||
| 1798 | #if XCHAL_NUM_AREGS % 12 == 0 | ||
| 1799 | mov a8, a8 | ||
| 1800 | #elif XCHAL_NUM_AREGS % 12 == 4 | ||
| 1801 | mov a12, a12 | ||
| 1802 | #elif XCHAL_NUM_AREGS % 12 == 8 | ||
| 1803 | mov a4, a4 | ||
| 1804 | #endif | ||
| 1805 | retw | ||
| 1806 | 2: | ||
| 1807 | #else | ||
| 1808 | mov a12, a12 | ||
| 1809 | #endif | ||
| 1810 | .endm | ||
| 1797 | 1811 | ||
| 1798 | /* | 1812 | /* |
| 1799 | * Task switch. | 1813 | * Task switch. |
| @@ -1806,21 +1820,20 @@ ENTRY(_switch_to) | |||
| 1806 | 1820 | ||
| 1807 | entry a1, 16 | 1821 | entry a1, 16 |
| 1808 | 1822 | ||
| 1809 | mov a12, a2 # preserve 'prev' (a2) | 1823 | mov a10, a2 # preserve 'prev' (a2) |
| 1810 | mov a13, a3 # and 'next' (a3) | 1824 | mov a11, a3 # and 'next' (a3) |
| 1811 | 1825 | ||
| 1812 | l32i a4, a2, TASK_THREAD_INFO | 1826 | l32i a4, a2, TASK_THREAD_INFO |
| 1813 | l32i a5, a3, TASK_THREAD_INFO | 1827 | l32i a5, a3, TASK_THREAD_INFO |
| 1814 | 1828 | ||
| 1815 | save_xtregs_user a4 a6 a8 a9 a10 a11 THREAD_XTREGS_USER | 1829 | save_xtregs_user a4 a6 a8 a9 a12 a13 THREAD_XTREGS_USER |
| 1816 | 1830 | ||
| 1817 | s32i a0, a12, THREAD_RA # save return address | 1831 | s32i a0, a10, THREAD_RA # save return address |
| 1818 | s32i a1, a12, THREAD_SP # save stack pointer | 1832 | s32i a1, a10, THREAD_SP # save stack pointer |
| 1819 | 1833 | ||
| 1820 | /* Disable ints while we manipulate the stack pointer. */ | 1834 | /* Disable ints while we manipulate the stack pointer. */ |
| 1821 | 1835 | ||
| 1822 | movi a14, (1 << PS_EXCM_BIT) | LOCKLEVEL | 1836 | rsil a14, LOCKLEVEL |
| 1823 | xsr a14, ps | ||
| 1824 | rsr a3, excsave1 | 1837 | rsr a3, excsave1 |
| 1825 | rsync | 1838 | rsync |
| 1826 | s32i a3, a3, EXC_TABLE_FIXUP /* enter critical section */ | 1839 | s32i a3, a3, EXC_TABLE_FIXUP /* enter critical section */ |
| @@ -1835,7 +1848,7 @@ ENTRY(_switch_to) | |||
| 1835 | 1848 | ||
| 1836 | /* Flush register file. */ | 1849 | /* Flush register file. */ |
| 1837 | 1850 | ||
| 1838 | call0 _spill_registers # destroys a3, a4, and SAR | 1851 | spill_registers_kernel |
| 1839 | 1852 | ||
| 1840 | /* Set kernel stack (and leave critical section) | 1853 | /* Set kernel stack (and leave critical section) |
| 1841 | * Note: It's save to set it here. The stack will not be overwritten | 1854 | * Note: It's save to set it here. The stack will not be overwritten |
| @@ -1851,13 +1864,13 @@ ENTRY(_switch_to) | |||
| 1851 | 1864 | ||
| 1852 | /* restore context of the task 'next' */ | 1865 | /* restore context of the task 'next' */ |
| 1853 | 1866 | ||
| 1854 | l32i a0, a13, THREAD_RA # restore return address | 1867 | l32i a0, a11, THREAD_RA # restore return address |
| 1855 | l32i a1, a13, THREAD_SP # restore stack pointer | 1868 | l32i a1, a11, THREAD_SP # restore stack pointer |
| 1856 | 1869 | ||
| 1857 | load_xtregs_user a5 a6 a8 a9 a10 a11 THREAD_XTREGS_USER | 1870 | load_xtregs_user a5 a6 a8 a9 a12 a13 THREAD_XTREGS_USER |
| 1858 | 1871 | ||
| 1859 | wsr a14, ps | 1872 | wsr a14, ps |
| 1860 | mov a2, a12 # return 'prev' | 1873 | mov a2, a10 # return 'prev' |
| 1861 | rsync | 1874 | rsync |
| 1862 | 1875 | ||
| 1863 | retw | 1876 | retw |
diff --git a/arch/xtensa/kernel/setup.c b/arch/xtensa/kernel/setup.c index 7d12af1317f1..84fe931bb60e 100644 --- a/arch/xtensa/kernel/setup.c +++ b/arch/xtensa/kernel/setup.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <linux/bootmem.h> | 22 | #include <linux/bootmem.h> |
| 23 | #include <linux/kernel.h> | 23 | #include <linux/kernel.h> |
| 24 | #include <linux/percpu.h> | 24 | #include <linux/percpu.h> |
| 25 | #include <linux/clk-provider.h> | ||
| 25 | #include <linux/cpu.h> | 26 | #include <linux/cpu.h> |
| 26 | #include <linux/of_fdt.h> | 27 | #include <linux/of_fdt.h> |
| 27 | #include <linux/of_platform.h> | 28 | #include <linux/of_platform.h> |
| @@ -276,6 +277,7 @@ void __init early_init_devtree(void *params) | |||
| 276 | 277 | ||
| 277 | static int __init xtensa_device_probe(void) | 278 | static int __init xtensa_device_probe(void) |
| 278 | { | 279 | { |
| 280 | of_clk_init(NULL); | ||
| 279 | of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); | 281 | of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); |
| 280 | return 0; | 282 | return 0; |
| 281 | } | 283 | } |
diff --git a/arch/xtensa/kernel/time.c b/arch/xtensa/kernel/time.c index 08b769d3b3a1..2a1823de69cc 100644 --- a/arch/xtensa/kernel/time.c +++ b/arch/xtensa/kernel/time.c | |||
| @@ -30,6 +30,7 @@ | |||
| 30 | #include <asm/platform.h> | 30 | #include <asm/platform.h> |
| 31 | 31 | ||
| 32 | unsigned long ccount_freq; /* ccount Hz */ | 32 | unsigned long ccount_freq; /* ccount Hz */ |
| 33 | EXPORT_SYMBOL(ccount_freq); | ||
| 33 | 34 | ||
| 34 | static cycle_t ccount_read(struct clocksource *cs) | 35 | static cycle_t ccount_read(struct clocksource *cs) |
| 35 | { | 36 | { |
diff --git a/arch/xtensa/kernel/vectors.S b/arch/xtensa/kernel/vectors.S index cb8fd44caabc..f9e1ec346e35 100644 --- a/arch/xtensa/kernel/vectors.S +++ b/arch/xtensa/kernel/vectors.S | |||
| @@ -235,7 +235,7 @@ ENTRY(_DoubleExceptionVector) | |||
| 235 | 235 | ||
| 236 | /* Check for overflow/underflow exception, jump if overflow. */ | 236 | /* Check for overflow/underflow exception, jump if overflow. */ |
| 237 | 237 | ||
| 238 | _bbci.l a0, 6, _DoubleExceptionVector_WindowOverflow | 238 | bbci.l a0, 6, _DoubleExceptionVector_WindowOverflow |
| 239 | 239 | ||
| 240 | /* | 240 | /* |
| 241 | * Restart window underflow exception. | 241 | * Restart window underflow exception. |
diff --git a/arch/xtensa/kernel/xtensa_ksyms.c b/arch/xtensa/kernel/xtensa_ksyms.c index 74a60c7e085e..80b33ed51f31 100644 --- a/arch/xtensa/kernel/xtensa_ksyms.c +++ b/arch/xtensa/kernel/xtensa_ksyms.c | |||
| @@ -122,9 +122,7 @@ EXPORT_SYMBOL(insw); | |||
| 122 | EXPORT_SYMBOL(insl); | 122 | EXPORT_SYMBOL(insl); |
| 123 | 123 | ||
| 124 | extern long common_exception_return; | 124 | extern long common_exception_return; |
| 125 | extern long _spill_registers; | ||
| 126 | EXPORT_SYMBOL(common_exception_return); | 125 | EXPORT_SYMBOL(common_exception_return); |
| 127 | EXPORT_SYMBOL(_spill_registers); | ||
| 128 | 126 | ||
| 129 | #ifdef CONFIG_FUNCTION_TRACER | 127 | #ifdef CONFIG_FUNCTION_TRACER |
| 130 | EXPORT_SYMBOL(_mcount); | 128 | EXPORT_SYMBOL(_mcount); |
diff --git a/arch/xtensa/mm/init.c b/arch/xtensa/mm/init.c index 479d7537a32a..aff108df92d3 100644 --- a/arch/xtensa/mm/init.c +++ b/arch/xtensa/mm/init.c | |||
| @@ -90,7 +90,7 @@ int __init mem_reserve(unsigned long start, unsigned long end, int must_exist) | |||
| 90 | 90 | ||
| 91 | 91 | ||
| 92 | /* | 92 | /* |
| 93 | * Initialize the bootmem system and give it all the memory we have available. | 93 | * Initialize the bootmem system and give it all low memory we have available. |
| 94 | */ | 94 | */ |
| 95 | 95 | ||
| 96 | void __init bootmem_init(void) | 96 | void __init bootmem_init(void) |
| @@ -142,9 +142,14 @@ void __init bootmem_init(void) | |||
| 142 | 142 | ||
| 143 | /* Add all remaining memory pieces into the bootmem map */ | 143 | /* Add all remaining memory pieces into the bootmem map */ |
| 144 | 144 | ||
| 145 | for (i=0; i<sysmem.nr_banks; i++) | 145 | for (i = 0; i < sysmem.nr_banks; i++) { |
| 146 | free_bootmem(sysmem.bank[i].start, | 146 | if (sysmem.bank[i].start >> PAGE_SHIFT < max_low_pfn) { |
| 147 | sysmem.bank[i].end - sysmem.bank[i].start); | 147 | unsigned long end = min(max_low_pfn << PAGE_SHIFT, |
| 148 | sysmem.bank[i].end); | ||
| 149 | free_bootmem(sysmem.bank[i].start, | ||
| 150 | end - sysmem.bank[i].start); | ||
| 151 | } | ||
| 152 | } | ||
| 148 | 153 | ||
| 149 | } | 154 | } |
| 150 | 155 | ||
diff --git a/arch/xtensa/mm/mmu.c b/arch/xtensa/mm/mmu.c index 36ec171698b8..861203e958da 100644 --- a/arch/xtensa/mm/mmu.c +++ b/arch/xtensa/mm/mmu.c | |||
| @@ -39,7 +39,7 @@ void init_mmu(void) | |||
| 39 | set_itlbcfg_register(0); | 39 | set_itlbcfg_register(0); |
| 40 | set_dtlbcfg_register(0); | 40 | set_dtlbcfg_register(0); |
| 41 | #endif | 41 | #endif |
| 42 | #if XCHAL_HAVE_PTP_MMU && XCHAL_HAVE_SPANNING_WAY && CONFIG_OF | 42 | #if XCHAL_HAVE_PTP_MMU && XCHAL_HAVE_SPANNING_WAY && defined(CONFIG_OF) |
| 43 | /* | 43 | /* |
| 44 | * Update the IO area mapping in case xtensa_kio_paddr has changed | 44 | * Update the IO area mapping in case xtensa_kio_paddr has changed |
| 45 | */ | 45 | */ |
diff --git a/arch/xtensa/platforms/xtfpga/setup.c b/arch/xtensa/platforms/xtfpga/setup.c index 800227862fe8..57fd08b36f51 100644 --- a/arch/xtensa/platforms/xtfpga/setup.c +++ b/arch/xtensa/platforms/xtfpga/setup.c | |||
| @@ -135,11 +135,11 @@ static void __init update_local_mac(struct device_node *node) | |||
| 135 | 135 | ||
| 136 | static int __init machine_setup(void) | 136 | static int __init machine_setup(void) |
| 137 | { | 137 | { |
| 138 | struct device_node *serial; | 138 | struct device_node *clock; |
| 139 | struct device_node *eth = NULL; | 139 | struct device_node *eth = NULL; |
| 140 | 140 | ||
| 141 | for_each_compatible_node(serial, NULL, "ns16550a") | 141 | for_each_node_by_name(clock, "main-oscillator") |
| 142 | update_clock_frequency(serial); | 142 | update_clock_frequency(clock); |
| 143 | 143 | ||
| 144 | if ((eth = of_find_compatible_node(eth, NULL, "opencores,ethoc"))) | 144 | if ((eth = of_find_compatible_node(eth, NULL, "opencores,ethoc"))) |
| 145 | update_local_mac(eth); | 145 | update_local_mac(eth); |
| @@ -290,6 +290,7 @@ static int __init xtavnet_init(void) | |||
| 290 | * knows whether they set it correctly on the DIP switches. | 290 | * knows whether they set it correctly on the DIP switches. |
| 291 | */ | 291 | */ |
| 292 | pr_info("XTFPGA: Ethernet MAC %pM\n", ethoc_pdata.hwaddr); | 292 | pr_info("XTFPGA: Ethernet MAC %pM\n", ethoc_pdata.hwaddr); |
| 293 | ethoc_pdata.eth_clkfreq = *(long *)XTFPGA_CLKFRQ_VADDR; | ||
| 293 | 294 | ||
| 294 | return 0; | 295 | return 0; |
| 295 | } | 296 | } |
diff --git a/arch/xtensa/variants/fsf/include/variant/tie.h b/arch/xtensa/variants/fsf/include/variant/tie.h index bf4020116df5..244cdea4dee5 100644 --- a/arch/xtensa/variants/fsf/include/variant/tie.h +++ b/arch/xtensa/variants/fsf/include/variant/tie.h | |||
| @@ -18,13 +18,6 @@ | |||
| 18 | #define XCHAL_CP_MASK 0x00 /* bitmask of all CPs by ID */ | 18 | #define XCHAL_CP_MASK 0x00 /* bitmask of all CPs by ID */ |
| 19 | #define XCHAL_CP_PORT_MASK 0x00 /* bitmask of only port CPs */ | 19 | #define XCHAL_CP_PORT_MASK 0x00 /* bitmask of only port CPs */ |
| 20 | 20 | ||
| 21 | /* Basic parameters of each coprocessor: */ | ||
| 22 | #define XCHAL_CP7_NAME "XTIOP" | ||
| 23 | #define XCHAL_CP7_IDENT XTIOP | ||
| 24 | #define XCHAL_CP7_SA_SIZE 0 /* size of state save area */ | ||
| 25 | #define XCHAL_CP7_SA_ALIGN 1 /* min alignment of save area */ | ||
| 26 | #define XCHAL_CP_ID_XTIOP 7 /* coprocessor ID (0..7) */ | ||
| 27 | |||
| 28 | /* Filler info for unassigned coprocessors, to simplify arrays etc: */ | 21 | /* Filler info for unassigned coprocessors, to simplify arrays etc: */ |
| 29 | #define XCHAL_NCP_SA_SIZE 0 | 22 | #define XCHAL_NCP_SA_SIZE 0 |
| 30 | #define XCHAL_NCP_SA_ALIGN 1 | 23 | #define XCHAL_NCP_SA_ALIGN 1 |
| @@ -42,6 +35,8 @@ | |||
| 42 | #define XCHAL_CP5_SA_ALIGN 1 | 35 | #define XCHAL_CP5_SA_ALIGN 1 |
| 43 | #define XCHAL_CP6_SA_SIZE 0 | 36 | #define XCHAL_CP6_SA_SIZE 0 |
| 44 | #define XCHAL_CP6_SA_ALIGN 1 | 37 | #define XCHAL_CP6_SA_ALIGN 1 |
| 38 | #define XCHAL_CP7_SA_SIZE 0 | ||
| 39 | #define XCHAL_CP7_SA_ALIGN 1 | ||
| 45 | 40 | ||
| 46 | /* Save area for non-coprocessor optional and custom (TIE) state: */ | 41 | /* Save area for non-coprocessor optional and custom (TIE) state: */ |
| 47 | #define XCHAL_NCP_SA_SIZE 0 | 42 | #define XCHAL_NCP_SA_SIZE 0 |
diff --git a/drivers/acpi/ac.c b/drivers/acpi/ac.c index e7515aa43d6b..6f190bc2b8b7 100644 --- a/drivers/acpi/ac.c +++ b/drivers/acpi/ac.c | |||
| @@ -243,6 +243,8 @@ static int acpi_ac_resume(struct device *dev) | |||
| 243 | kobject_uevent(&ac->charger.dev->kobj, KOBJ_CHANGE); | 243 | kobject_uevent(&ac->charger.dev->kobj, KOBJ_CHANGE); |
| 244 | return 0; | 244 | return 0; |
| 245 | } | 245 | } |
| 246 | #else | ||
| 247 | #define acpi_ac_resume NULL | ||
| 246 | #endif | 248 | #endif |
| 247 | static SIMPLE_DEV_PM_OPS(acpi_ac_pm_ops, NULL, acpi_ac_resume); | 249 | static SIMPLE_DEV_PM_OPS(acpi_ac_pm_ops, NULL, acpi_ac_resume); |
| 248 | 250 | ||
diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c index 018a42883706..797a6938d051 100644 --- a/drivers/acpi/battery.c +++ b/drivers/acpi/battery.c | |||
| @@ -841,6 +841,8 @@ static int acpi_battery_resume(struct device *dev) | |||
| 841 | acpi_battery_update(battery); | 841 | acpi_battery_update(battery); |
| 842 | return 0; | 842 | return 0; |
| 843 | } | 843 | } |
| 844 | #else | ||
| 845 | #define acpi_battery_resume NULL | ||
| 844 | #endif | 846 | #endif |
| 845 | 847 | ||
| 846 | static SIMPLE_DEV_PM_OPS(acpi_battery_pm, NULL, acpi_battery_resume); | 848 | static SIMPLE_DEV_PM_OPS(acpi_battery_pm, NULL, acpi_battery_resume); |
diff --git a/drivers/acpi/blacklist.c b/drivers/acpi/blacklist.c index 10e4964d051a..afec4526c48a 100644 --- a/drivers/acpi/blacklist.c +++ b/drivers/acpi/blacklist.c | |||
| @@ -260,14 +260,6 @@ static struct dmi_system_id acpi_osi_dmi_table[] __initdata = { | |||
| 260 | }, | 260 | }, |
| 261 | { | 261 | { |
| 262 | .callback = dmi_disable_osi_win8, | 262 | .callback = dmi_disable_osi_win8, |
| 263 | .ident = "Dell Inspiron 15R SE", | ||
| 264 | .matches = { | ||
| 265 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
| 266 | DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 7520"), | ||
| 267 | }, | ||
| 268 | }, | ||
| 269 | { | ||
| 270 | .callback = dmi_disable_osi_win8, | ||
| 271 | .ident = "ThinkPad Edge E530", | 263 | .ident = "ThinkPad Edge E530", |
| 272 | .matches = { | 264 | .matches = { |
| 273 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | 265 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
| @@ -322,56 +314,6 @@ static struct dmi_system_id acpi_osi_dmi_table[] __initdata = { | |||
| 322 | DMI_MATCH(DMI_PRODUCT_VERSION, "2349D15"), | 314 | DMI_MATCH(DMI_PRODUCT_VERSION, "2349D15"), |
| 323 | }, | 315 | }, |
| 324 | }, | 316 | }, |
| 325 | { | ||
| 326 | .callback = dmi_disable_osi_win8, | ||
| 327 | .ident = "HP ProBook 2013 models", | ||
| 328 | .matches = { | ||
| 329 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
| 330 | DMI_MATCH(DMI_PRODUCT_NAME, "HP ProBook "), | ||
| 331 | DMI_MATCH(DMI_PRODUCT_NAME, " G1"), | ||
| 332 | }, | ||
| 333 | }, | ||
| 334 | { | ||
| 335 | .callback = dmi_disable_osi_win8, | ||
| 336 | .ident = "HP EliteBook 2013 models", | ||
| 337 | .matches = { | ||
| 338 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
| 339 | DMI_MATCH(DMI_PRODUCT_NAME, "HP EliteBook "), | ||
| 340 | DMI_MATCH(DMI_PRODUCT_NAME, " G1"), | ||
| 341 | }, | ||
| 342 | }, | ||
| 343 | { | ||
| 344 | .callback = dmi_disable_osi_win8, | ||
| 345 | .ident = "HP ZBook 14", | ||
| 346 | .matches = { | ||
| 347 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
| 348 | DMI_MATCH(DMI_PRODUCT_NAME, "HP ZBook 14"), | ||
| 349 | }, | ||
| 350 | }, | ||
| 351 | { | ||
| 352 | .callback = dmi_disable_osi_win8, | ||
| 353 | .ident = "HP ZBook 15", | ||
| 354 | .matches = { | ||
| 355 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
| 356 | DMI_MATCH(DMI_PRODUCT_NAME, "HP ZBook 15"), | ||
| 357 | }, | ||
| 358 | }, | ||
| 359 | { | ||
| 360 | .callback = dmi_disable_osi_win8, | ||
| 361 | .ident = "HP ZBook 17", | ||
| 362 | .matches = { | ||
| 363 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
| 364 | DMI_MATCH(DMI_PRODUCT_NAME, "HP ZBook 17"), | ||
| 365 | }, | ||
| 366 | }, | ||
| 367 | { | ||
| 368 | .callback = dmi_disable_osi_win8, | ||
| 369 | .ident = "HP EliteBook 8780w", | ||
| 370 | .matches = { | ||
| 371 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
| 372 | DMI_MATCH(DMI_PRODUCT_NAME, "HP EliteBook 8780w"), | ||
| 373 | }, | ||
| 374 | }, | ||
| 375 | 317 | ||
| 376 | /* | 318 | /* |
| 377 | * BIOS invocation of _OSI(Linux) is almost always a BIOS bug. | 319 | * BIOS invocation of _OSI(Linux) is almost always a BIOS bug. |
diff --git a/drivers/acpi/button.c b/drivers/acpi/button.c index 11c11f6b8fa1..714e957a871a 100644 --- a/drivers/acpi/button.c +++ b/drivers/acpi/button.c | |||
| @@ -80,6 +80,8 @@ static void acpi_button_notify(struct acpi_device *device, u32 event); | |||
| 80 | 80 | ||
| 81 | #ifdef CONFIG_PM_SLEEP | 81 | #ifdef CONFIG_PM_SLEEP |
| 82 | static int acpi_button_resume(struct device *dev); | 82 | static int acpi_button_resume(struct device *dev); |
| 83 | #else | ||
| 84 | #define acpi_button_resume NULL | ||
| 83 | #endif | 85 | #endif |
| 84 | static SIMPLE_DEV_PM_OPS(acpi_button_pm, NULL, acpi_button_resume); | 86 | static SIMPLE_DEV_PM_OPS(acpi_button_pm, NULL, acpi_button_resume); |
| 85 | 87 | ||
diff --git a/drivers/acpi/dock.c b/drivers/acpi/dock.c index e9b3081c4fe9..5bfd769fc91f 100644 --- a/drivers/acpi/dock.c +++ b/drivers/acpi/dock.c | |||
| @@ -713,13 +713,11 @@ static acpi_status __init find_dock_devices(acpi_handle handle, u32 lvl, | |||
| 713 | static ssize_t show_docked(struct device *dev, | 713 | static ssize_t show_docked(struct device *dev, |
| 714 | struct device_attribute *attr, char *buf) | 714 | struct device_attribute *attr, char *buf) |
| 715 | { | 715 | { |
| 716 | struct acpi_device *tmp; | ||
| 717 | |||
| 718 | struct dock_station *dock_station = dev->platform_data; | 716 | struct dock_station *dock_station = dev->platform_data; |
| 717 | struct acpi_device *adev = NULL; | ||
| 719 | 718 | ||
| 720 | if (!acpi_bus_get_device(dock_station->handle, &tmp)) | 719 | acpi_bus_get_device(dock_station->handle, &adev); |
| 721 | return snprintf(buf, PAGE_SIZE, "1\n"); | 720 | return snprintf(buf, PAGE_SIZE, "%u\n", acpi_device_enumerated(adev)); |
| 722 | return snprintf(buf, PAGE_SIZE, "0\n"); | ||
| 723 | } | 721 | } |
| 724 | static DEVICE_ATTR(docked, S_IRUGO, show_docked, NULL); | 722 | static DEVICE_ATTR(docked, S_IRUGO, show_docked, NULL); |
| 725 | 723 | ||
diff --git a/drivers/acpi/fan.c b/drivers/acpi/fan.c index 1fb62900f32a..09e423f3d8ad 100644 --- a/drivers/acpi/fan.c +++ b/drivers/acpi/fan.c | |||
| @@ -55,6 +55,9 @@ MODULE_DEVICE_TABLE(acpi, fan_device_ids); | |||
| 55 | #ifdef CONFIG_PM_SLEEP | 55 | #ifdef CONFIG_PM_SLEEP |
| 56 | static int acpi_fan_suspend(struct device *dev); | 56 | static int acpi_fan_suspend(struct device *dev); |
| 57 | static int acpi_fan_resume(struct device *dev); | 57 | static int acpi_fan_resume(struct device *dev); |
| 58 | #else | ||
| 59 | #define acpi_fan_suspend NULL | ||
| 60 | #define acpi_fan_resume NULL | ||
| 58 | #endif | 61 | #endif |
| 59 | static SIMPLE_DEV_PM_OPS(acpi_fan_pm, acpi_fan_suspend, acpi_fan_resume); | 62 | static SIMPLE_DEV_PM_OPS(acpi_fan_pm, acpi_fan_suspend, acpi_fan_resume); |
| 60 | 63 | ||
diff --git a/drivers/acpi/pci_irq.c b/drivers/acpi/pci_irq.c index 52d45ea2bc4f..361b40c10c3f 100644 --- a/drivers/acpi/pci_irq.c +++ b/drivers/acpi/pci_irq.c | |||
| @@ -430,6 +430,7 @@ int acpi_pci_irq_enable(struct pci_dev *dev) | |||
| 430 | pin_name(pin)); | 430 | pin_name(pin)); |
| 431 | } | 431 | } |
| 432 | 432 | ||
| 433 | kfree(entry); | ||
| 433 | return 0; | 434 | return 0; |
| 434 | } | 435 | } |
| 435 | 436 | ||
diff --git a/drivers/acpi/processor_throttling.c b/drivers/acpi/processor_throttling.c index 28baa05b8018..84243c32e29c 100644 --- a/drivers/acpi/processor_throttling.c +++ b/drivers/acpi/processor_throttling.c | |||
| @@ -56,6 +56,12 @@ struct throttling_tstate { | |||
| 56 | int target_state; /* target T-state */ | 56 | int target_state; /* target T-state */ |
| 57 | }; | 57 | }; |
| 58 | 58 | ||
| 59 | struct acpi_processor_throttling_arg { | ||
| 60 | struct acpi_processor *pr; | ||
| 61 | int target_state; | ||
| 62 | bool force; | ||
| 63 | }; | ||
| 64 | |||
| 59 | #define THROTTLING_PRECHANGE (1) | 65 | #define THROTTLING_PRECHANGE (1) |
| 60 | #define THROTTLING_POSTCHANGE (2) | 66 | #define THROTTLING_POSTCHANGE (2) |
| 61 | 67 | ||
| @@ -1060,16 +1066,24 @@ static int acpi_processor_set_throttling_ptc(struct acpi_processor *pr, | |||
| 1060 | return 0; | 1066 | return 0; |
| 1061 | } | 1067 | } |
| 1062 | 1068 | ||
| 1069 | static long acpi_processor_throttling_fn(void *data) | ||
| 1070 | { | ||
| 1071 | struct acpi_processor_throttling_arg *arg = data; | ||
| 1072 | struct acpi_processor *pr = arg->pr; | ||
| 1073 | |||
| 1074 | return pr->throttling.acpi_processor_set_throttling(pr, | ||
| 1075 | arg->target_state, arg->force); | ||
| 1076 | } | ||
| 1077 | |||
| 1063 | int acpi_processor_set_throttling(struct acpi_processor *pr, | 1078 | int acpi_processor_set_throttling(struct acpi_processor *pr, |
| 1064 | int state, bool force) | 1079 | int state, bool force) |
| 1065 | { | 1080 | { |
| 1066 | cpumask_var_t saved_mask; | ||
| 1067 | int ret = 0; | 1081 | int ret = 0; |
| 1068 | unsigned int i; | 1082 | unsigned int i; |
| 1069 | struct acpi_processor *match_pr; | 1083 | struct acpi_processor *match_pr; |
| 1070 | struct acpi_processor_throttling *p_throttling; | 1084 | struct acpi_processor_throttling *p_throttling; |
| 1085 | struct acpi_processor_throttling_arg arg; | ||
| 1071 | struct throttling_tstate t_state; | 1086 | struct throttling_tstate t_state; |
| 1072 | cpumask_var_t online_throttling_cpus; | ||
| 1073 | 1087 | ||
| 1074 | if (!pr) | 1088 | if (!pr) |
| 1075 | return -EINVAL; | 1089 | return -EINVAL; |
| @@ -1080,14 +1094,6 @@ int acpi_processor_set_throttling(struct acpi_processor *pr, | |||
| 1080 | if ((state < 0) || (state > (pr->throttling.state_count - 1))) | 1094 | if ((state < 0) || (state > (pr->throttling.state_count - 1))) |
| 1081 | return -EINVAL; | 1095 | return -EINVAL; |
| 1082 | 1096 | ||
| 1083 | if (!alloc_cpumask_var(&saved_mask, GFP_KERNEL)) | ||
| 1084 | return -ENOMEM; | ||
| 1085 | |||
| 1086 | if (!alloc_cpumask_var(&online_throttling_cpus, GFP_KERNEL)) { | ||
| 1087 | free_cpumask_var(saved_mask); | ||
| 1088 | return -ENOMEM; | ||
| 1089 | } | ||
| 1090 | |||
| 1091 | if (cpu_is_offline(pr->id)) { | 1097 | if (cpu_is_offline(pr->id)) { |
| 1092 | /* | 1098 | /* |
| 1093 | * the cpu pointed by pr->id is offline. Unnecessary to change | 1099 | * the cpu pointed by pr->id is offline. Unnecessary to change |
| @@ -1096,17 +1102,15 @@ int acpi_processor_set_throttling(struct acpi_processor *pr, | |||
| 1096 | return -ENODEV; | 1102 | return -ENODEV; |
| 1097 | } | 1103 | } |
| 1098 | 1104 | ||
| 1099 | cpumask_copy(saved_mask, ¤t->cpus_allowed); | ||
| 1100 | t_state.target_state = state; | 1105 | t_state.target_state = state; |
| 1101 | p_throttling = &(pr->throttling); | 1106 | p_throttling = &(pr->throttling); |
| 1102 | cpumask_and(online_throttling_cpus, cpu_online_mask, | 1107 | |
| 1103 | p_throttling->shared_cpu_map); | ||
| 1104 | /* | 1108 | /* |
| 1105 | * The throttling notifier will be called for every | 1109 | * The throttling notifier will be called for every |
| 1106 | * affected cpu in order to get one proper T-state. | 1110 | * affected cpu in order to get one proper T-state. |
| 1107 | * The notifier event is THROTTLING_PRECHANGE. | 1111 | * The notifier event is THROTTLING_PRECHANGE. |
| 1108 | */ | 1112 | */ |
| 1109 | for_each_cpu(i, online_throttling_cpus) { | 1113 | for_each_cpu_and(i, cpu_online_mask, p_throttling->shared_cpu_map) { |
| 1110 | t_state.cpu = i; | 1114 | t_state.cpu = i; |
| 1111 | acpi_processor_throttling_notifier(THROTTLING_PRECHANGE, | 1115 | acpi_processor_throttling_notifier(THROTTLING_PRECHANGE, |
| 1112 | &t_state); | 1116 | &t_state); |
| @@ -1118,21 +1122,18 @@ int acpi_processor_set_throttling(struct acpi_processor *pr, | |||
| 1118 | * it can be called only for the cpu pointed by pr. | 1122 | * it can be called only for the cpu pointed by pr. |
| 1119 | */ | 1123 | */ |
| 1120 | if (p_throttling->shared_type == DOMAIN_COORD_TYPE_SW_ANY) { | 1124 | if (p_throttling->shared_type == DOMAIN_COORD_TYPE_SW_ANY) { |
| 1121 | /* FIXME: use work_on_cpu() */ | 1125 | arg.pr = pr; |
| 1122 | if (set_cpus_allowed_ptr(current, cpumask_of(pr->id))) { | 1126 | arg.target_state = state; |
| 1123 | /* Can't migrate to the pr->id CPU. Exit */ | 1127 | arg.force = force; |
| 1124 | ret = -ENODEV; | 1128 | ret = work_on_cpu(pr->id, acpi_processor_throttling_fn, &arg); |
| 1125 | goto exit; | ||
| 1126 | } | ||
| 1127 | ret = p_throttling->acpi_processor_set_throttling(pr, | ||
| 1128 | t_state.target_state, force); | ||
| 1129 | } else { | 1129 | } else { |
| 1130 | /* | 1130 | /* |
| 1131 | * When the T-state coordination is SW_ALL or HW_ALL, | 1131 | * When the T-state coordination is SW_ALL or HW_ALL, |
| 1132 | * it is necessary to set T-state for every affected | 1132 | * it is necessary to set T-state for every affected |
| 1133 | * cpus. | 1133 | * cpus. |
| 1134 | */ | 1134 | */ |
| 1135 | for_each_cpu(i, online_throttling_cpus) { | 1135 | for_each_cpu_and(i, cpu_online_mask, |
| 1136 | p_throttling->shared_cpu_map) { | ||
| 1136 | match_pr = per_cpu(processors, i); | 1137 | match_pr = per_cpu(processors, i); |
| 1137 | /* | 1138 | /* |
| 1138 | * If the pointer is invalid, we will report the | 1139 | * If the pointer is invalid, we will report the |
| @@ -1153,13 +1154,12 @@ int acpi_processor_set_throttling(struct acpi_processor *pr, | |||
| 1153 | "on CPU %d\n", i)); | 1154 | "on CPU %d\n", i)); |
| 1154 | continue; | 1155 | continue; |
| 1155 | } | 1156 | } |
| 1156 | t_state.cpu = i; | 1157 | |
| 1157 | /* FIXME: use work_on_cpu() */ | 1158 | arg.pr = match_pr; |
| 1158 | if (set_cpus_allowed_ptr(current, cpumask_of(i))) | 1159 | arg.target_state = state; |
| 1159 | continue; | 1160 | arg.force = force; |
| 1160 | ret = match_pr->throttling. | 1161 | ret = work_on_cpu(pr->id, acpi_processor_throttling_fn, |
| 1161 | acpi_processor_set_throttling( | 1162 | &arg); |
| 1162 | match_pr, t_state.target_state, force); | ||
| 1163 | } | 1163 | } |
| 1164 | } | 1164 | } |
| 1165 | /* | 1165 | /* |
| @@ -1168,17 +1168,12 @@ int acpi_processor_set_throttling(struct acpi_processor *pr, | |||
| 1168 | * affected cpu to update the T-states. | 1168 | * affected cpu to update the T-states. |
| 1169 | * The notifier event is THROTTLING_POSTCHANGE | 1169 | * The notifier event is THROTTLING_POSTCHANGE |
| 1170 | */ | 1170 | */ |
| 1171 | for_each_cpu(i, online_throttling_cpus) { | 1171 | for_each_cpu_and(i, cpu_online_mask, p_throttling->shared_cpu_map) { |
| 1172 | t_state.cpu = i; | 1172 | t_state.cpu = i; |
| 1173 | acpi_processor_throttling_notifier(THROTTLING_POSTCHANGE, | 1173 | acpi_processor_throttling_notifier(THROTTLING_POSTCHANGE, |
| 1174 | &t_state); | 1174 | &t_state); |
| 1175 | } | 1175 | } |
| 1176 | /* restore the previous state */ | 1176 | |
| 1177 | /* FIXME: use work_on_cpu() */ | ||
| 1178 | set_cpus_allowed_ptr(current, saved_mask); | ||
| 1179 | exit: | ||
| 1180 | free_cpumask_var(online_throttling_cpus); | ||
| 1181 | free_cpumask_var(saved_mask); | ||
| 1182 | return ret; | 1177 | return ret; |
| 1183 | } | 1178 | } |
| 1184 | 1179 | ||
diff --git a/drivers/acpi/sbs.c b/drivers/acpi/sbs.c index d465ae6cdd00..dbd48498b938 100644 --- a/drivers/acpi/sbs.c +++ b/drivers/acpi/sbs.c | |||
| @@ -450,7 +450,7 @@ static ssize_t acpi_battery_alarm_store(struct device *dev, | |||
| 450 | { | 450 | { |
| 451 | unsigned long x; | 451 | unsigned long x; |
| 452 | struct acpi_battery *battery = to_acpi_battery(dev_get_drvdata(dev)); | 452 | struct acpi_battery *battery = to_acpi_battery(dev_get_drvdata(dev)); |
| 453 | if (sscanf(buf, "%ld\n", &x) == 1) | 453 | if (sscanf(buf, "%lu\n", &x) == 1) |
| 454 | battery->alarm_capacity = x / | 454 | battery->alarm_capacity = x / |
| 455 | (1000 * acpi_battery_scale(battery)); | 455 | (1000 * acpi_battery_scale(battery)); |
| 456 | if (battery->present) | 456 | if (battery->present) |
| @@ -668,6 +668,8 @@ static int acpi_sbs_resume(struct device *dev) | |||
| 668 | acpi_sbs_callback(sbs); | 668 | acpi_sbs_callback(sbs); |
| 669 | return 0; | 669 | return 0; |
| 670 | } | 670 | } |
| 671 | #else | ||
| 672 | #define acpi_sbs_resume NULL | ||
| 671 | #endif | 673 | #endif |
| 672 | 674 | ||
| 673 | static SIMPLE_DEV_PM_OPS(acpi_sbs_pm, NULL, acpi_sbs_resume); | 675 | static SIMPLE_DEV_PM_OPS(acpi_sbs_pm, NULL, acpi_sbs_resume); |
diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c index 8349a555b92b..08626c851be7 100644 --- a/drivers/acpi/thermal.c +++ b/drivers/acpi/thermal.c | |||
| @@ -102,6 +102,8 @@ MODULE_DEVICE_TABLE(acpi, thermal_device_ids); | |||
| 102 | 102 | ||
| 103 | #ifdef CONFIG_PM_SLEEP | 103 | #ifdef CONFIG_PM_SLEEP |
| 104 | static int acpi_thermal_resume(struct device *dev); | 104 | static int acpi_thermal_resume(struct device *dev); |
| 105 | #else | ||
| 106 | #define acpi_thermal_resume NULL | ||
| 105 | #endif | 107 | #endif |
| 106 | static SIMPLE_DEV_PM_OPS(acpi_thermal_pm, NULL, acpi_thermal_resume); | 108 | static SIMPLE_DEV_PM_OPS(acpi_thermal_pm, NULL, acpi_thermal_resume); |
| 107 | 109 | ||
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c index b727d105046d..b6ba88ed31ae 100644 --- a/drivers/acpi/video.c +++ b/drivers/acpi/video.c | |||
| @@ -81,11 +81,12 @@ static bool allow_duplicates; | |||
| 81 | module_param(allow_duplicates, bool, 0644); | 81 | module_param(allow_duplicates, bool, 0644); |
| 82 | 82 | ||
| 83 | /* | 83 | /* |
| 84 | * For Windows 8 systems: if set ture and the GPU driver has | 84 | * For Windows 8 systems: used to decide if video module |
| 85 | * registered a backlight interface, skip registering ACPI video's. | 85 | * should skip registering backlight interface of its own. |
| 86 | */ | 86 | */ |
| 87 | static bool use_native_backlight = false; | 87 | static int use_native_backlight_param = -1; |
| 88 | module_param(use_native_backlight, bool, 0644); | 88 | module_param_named(use_native_backlight, use_native_backlight_param, int, 0444); |
| 89 | static bool use_native_backlight_dmi = false; | ||
| 89 | 90 | ||
| 90 | static int register_count; | 91 | static int register_count; |
| 91 | static struct mutex video_list_lock; | 92 | static struct mutex video_list_lock; |
| @@ -231,9 +232,17 @@ static int acpi_video_get_next_level(struct acpi_video_device *device, | |||
| 231 | static int acpi_video_switch_brightness(struct acpi_video_device *device, | 232 | static int acpi_video_switch_brightness(struct acpi_video_device *device, |
| 232 | int event); | 233 | int event); |
| 233 | 234 | ||
| 235 | static bool acpi_video_use_native_backlight(void) | ||
| 236 | { | ||
| 237 | if (use_native_backlight_param != -1) | ||
| 238 | return use_native_backlight_param; | ||
| 239 | else | ||
| 240 | return use_native_backlight_dmi; | ||
| 241 | } | ||
| 242 | |||
| 234 | static bool acpi_video_verify_backlight_support(void) | 243 | static bool acpi_video_verify_backlight_support(void) |
| 235 | { | 244 | { |
| 236 | if (acpi_osi_is_win8() && use_native_backlight && | 245 | if (acpi_osi_is_win8() && acpi_video_use_native_backlight() && |
| 237 | backlight_device_registered(BACKLIGHT_RAW)) | 246 | backlight_device_registered(BACKLIGHT_RAW)) |
| 238 | return false; | 247 | return false; |
| 239 | return acpi_video_backlight_support(); | 248 | return acpi_video_backlight_support(); |
| @@ -398,6 +407,12 @@ static int __init video_set_bqc_offset(const struct dmi_system_id *d) | |||
| 398 | return 0; | 407 | return 0; |
| 399 | } | 408 | } |
| 400 | 409 | ||
| 410 | static int __init video_set_use_native_backlight(const struct dmi_system_id *d) | ||
| 411 | { | ||
| 412 | use_native_backlight_dmi = true; | ||
| 413 | return 0; | ||
| 414 | } | ||
| 415 | |||
| 401 | static struct dmi_system_id video_dmi_table[] __initdata = { | 416 | static struct dmi_system_id video_dmi_table[] __initdata = { |
| 402 | /* | 417 | /* |
| 403 | * Broken _BQC workaround http://bugzilla.kernel.org/show_bug.cgi?id=13121 | 418 | * Broken _BQC workaround http://bugzilla.kernel.org/show_bug.cgi?id=13121 |
| @@ -442,6 +457,120 @@ static struct dmi_system_id video_dmi_table[] __initdata = { | |||
| 442 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 7720"), | 457 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 7720"), |
| 443 | }, | 458 | }, |
| 444 | }, | 459 | }, |
| 460 | { | ||
| 461 | .callback = video_set_use_native_backlight, | ||
| 462 | .ident = "ThinkPad T430s", | ||
| 463 | .matches = { | ||
| 464 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
| 465 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T430s"), | ||
| 466 | }, | ||
| 467 | }, | ||
| 468 | { | ||
| 469 | .callback = video_set_use_native_backlight, | ||
| 470 | .ident = "ThinkPad X230", | ||
| 471 | .matches = { | ||
| 472 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
| 473 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X230"), | ||
| 474 | }, | ||
| 475 | }, | ||
| 476 | { | ||
| 477 | .callback = video_set_use_native_backlight, | ||
| 478 | .ident = "ThinkPad X1 Carbon", | ||
| 479 | .matches = { | ||
| 480 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
| 481 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X1 Carbon"), | ||
| 482 | }, | ||
| 483 | }, | ||
| 484 | { | ||
| 485 | .callback = video_set_use_native_backlight, | ||
| 486 | .ident = "Lenovo Yoga 13", | ||
| 487 | .matches = { | ||
| 488 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
| 489 | DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo IdeaPad Yoga 13"), | ||
| 490 | }, | ||
| 491 | }, | ||
| 492 | { | ||
| 493 | .callback = video_set_use_native_backlight, | ||
| 494 | .ident = "Dell Inspiron 7520", | ||
| 495 | .matches = { | ||
| 496 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
| 497 | DMI_MATCH(DMI_PRODUCT_VERSION, "Inspiron 7520"), | ||
| 498 | }, | ||
| 499 | }, | ||
| 500 | { | ||
| 501 | .callback = video_set_use_native_backlight, | ||
| 502 | .ident = "Acer Aspire 5733Z", | ||
| 503 | .matches = { | ||
| 504 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
| 505 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5733Z"), | ||
| 506 | }, | ||
| 507 | }, | ||
| 508 | { | ||
| 509 | .callback = video_set_use_native_backlight, | ||
| 510 | .ident = "Acer Aspire V5-431", | ||
| 511 | .matches = { | ||
| 512 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
| 513 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire V5-431"), | ||
| 514 | }, | ||
| 515 | }, | ||
| 516 | { | ||
| 517 | .callback = video_set_use_native_backlight, | ||
| 518 | .ident = "HP ProBook 4340s", | ||
| 519 | .matches = { | ||
| 520 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
| 521 | DMI_MATCH(DMI_PRODUCT_VERSION, "HP ProBook 4340s"), | ||
| 522 | }, | ||
| 523 | }, | ||
| 524 | { | ||
| 525 | .callback = video_set_use_native_backlight, | ||
| 526 | .ident = "HP ProBook 2013 models", | ||
| 527 | .matches = { | ||
| 528 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
| 529 | DMI_MATCH(DMI_PRODUCT_NAME, "HP ProBook "), | ||
| 530 | DMI_MATCH(DMI_PRODUCT_NAME, " G1"), | ||
| 531 | }, | ||
| 532 | }, | ||
| 533 | { | ||
| 534 | .callback = video_set_use_native_backlight, | ||
| 535 | .ident = "HP EliteBook 2013 models", | ||
| 536 | .matches = { | ||
| 537 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
| 538 | DMI_MATCH(DMI_PRODUCT_NAME, "HP EliteBook "), | ||
| 539 | DMI_MATCH(DMI_PRODUCT_NAME, " G1"), | ||
| 540 | }, | ||
| 541 | }, | ||
| 542 | { | ||
| 543 | .callback = video_set_use_native_backlight, | ||
| 544 | .ident = "HP ZBook 14", | ||
| 545 | .matches = { | ||
| 546 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
| 547 | DMI_MATCH(DMI_PRODUCT_NAME, "HP ZBook 14"), | ||
| 548 | }, | ||
| 549 | }, | ||
| 550 | { | ||
| 551 | .callback = video_set_use_native_backlight, | ||
| 552 | .ident = "HP ZBook 15", | ||
| 553 | .matches = { | ||
| 554 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
| 555 | DMI_MATCH(DMI_PRODUCT_NAME, "HP ZBook 15"), | ||
| 556 | }, | ||
| 557 | }, | ||
| 558 | { | ||
| 559 | .callback = video_set_use_native_backlight, | ||
| 560 | .ident = "HP ZBook 17", | ||
| 561 | .matches = { | ||
| 562 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
| 563 | DMI_MATCH(DMI_PRODUCT_NAME, "HP ZBook 17"), | ||
| 564 | }, | ||
| 565 | }, | ||
| 566 | { | ||
| 567 | .callback = video_set_use_native_backlight, | ||
| 568 | .ident = "HP EliteBook 8780w", | ||
| 569 | .matches = { | ||
| 570 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
| 571 | DMI_MATCH(DMI_PRODUCT_NAME, "HP EliteBook 8780w"), | ||
| 572 | }, | ||
| 573 | }, | ||
| 445 | {} | 574 | {} |
| 446 | }; | 575 | }; |
| 447 | 576 | ||
| @@ -685,6 +814,7 @@ acpi_video_init_brightness(struct acpi_video_device *device) | |||
| 685 | union acpi_object *o; | 814 | union acpi_object *o; |
| 686 | struct acpi_video_device_brightness *br = NULL; | 815 | struct acpi_video_device_brightness *br = NULL; |
| 687 | int result = -EINVAL; | 816 | int result = -EINVAL; |
| 817 | u32 value; | ||
| 688 | 818 | ||
| 689 | if (!ACPI_SUCCESS(acpi_video_device_lcd_query_levels(device, &obj))) { | 819 | if (!ACPI_SUCCESS(acpi_video_device_lcd_query_levels(device, &obj))) { |
| 690 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Could not query available " | 820 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Could not query available " |
| @@ -715,7 +845,12 @@ acpi_video_init_brightness(struct acpi_video_device *device) | |||
| 715 | printk(KERN_ERR PREFIX "Invalid data\n"); | 845 | printk(KERN_ERR PREFIX "Invalid data\n"); |
| 716 | continue; | 846 | continue; |
| 717 | } | 847 | } |
| 718 | br->levels[count] = (u32) o->integer.value; | 848 | value = (u32) o->integer.value; |
| 849 | /* Skip duplicate entries */ | ||
| 850 | if (count > 2 && br->levels[count - 1] == value) | ||
| 851 | continue; | ||
| 852 | |||
| 853 | br->levels[count] = value; | ||
| 719 | 854 | ||
| 720 | if (br->levels[count] > max_level) | 855 | if (br->levels[count] > max_level) |
| 721 | max_level = br->levels[count]; | 856 | max_level = br->levels[count]; |
diff --git a/drivers/acpi/video_detect.c b/drivers/acpi/video_detect.c index a697b77b8865..19080c8e2f2a 100644 --- a/drivers/acpi/video_detect.c +++ b/drivers/acpi/video_detect.c | |||
| @@ -168,22 +168,6 @@ static struct dmi_system_id video_detect_dmi_table[] = { | |||
| 168 | DMI_MATCH(DMI_PRODUCT_NAME, "UL30A"), | 168 | DMI_MATCH(DMI_PRODUCT_NAME, "UL30A"), |
| 169 | }, | 169 | }, |
| 170 | }, | 170 | }, |
| 171 | { | ||
| 172 | .callback = video_detect_force_vendor, | ||
| 173 | .ident = "HP EliteBook Revolve 810", | ||
| 174 | .matches = { | ||
| 175 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
| 176 | DMI_MATCH(DMI_PRODUCT_NAME, "HP EliteBook Revolve 810 G1"), | ||
| 177 | }, | ||
| 178 | }, | ||
| 179 | { | ||
| 180 | .callback = video_detect_force_vendor, | ||
| 181 | .ident = "Lenovo Yoga 13", | ||
| 182 | .matches = { | ||
| 183 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
| 184 | DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo IdeaPad Yoga 13"), | ||
| 185 | }, | ||
| 186 | }, | ||
| 187 | { }, | 171 | { }, |
| 188 | }; | 172 | }; |
| 189 | 173 | ||
diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig index 4e737728aee2..868429a47be4 100644 --- a/drivers/ata/Kconfig +++ b/drivers/ata/Kconfig | |||
| @@ -247,6 +247,7 @@ config SATA_HIGHBANK | |||
| 247 | 247 | ||
| 248 | config SATA_MV | 248 | config SATA_MV |
| 249 | tristate "Marvell SATA support" | 249 | tristate "Marvell SATA support" |
| 250 | select GENERIC_PHY | ||
| 250 | help | 251 | help |
| 251 | This option enables support for the Marvell Serial ATA family. | 252 | This option enables support for the Marvell Serial ATA family. |
| 252 | Currently supports 88SX[56]0[48][01] PCI(-X) chips, | 253 | Currently supports 88SX[56]0[48][01] PCI(-X) chips, |
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index dc2756fb6f33..c81d809c111b 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
| @@ -61,6 +61,7 @@ enum board_ids { | |||
| 61 | /* board IDs by feature in alphabetical order */ | 61 | /* board IDs by feature in alphabetical order */ |
| 62 | board_ahci, | 62 | board_ahci, |
| 63 | board_ahci_ign_iferr, | 63 | board_ahci_ign_iferr, |
| 64 | board_ahci_noncq, | ||
| 64 | board_ahci_nosntf, | 65 | board_ahci_nosntf, |
| 65 | board_ahci_yes_fbs, | 66 | board_ahci_yes_fbs, |
| 66 | 67 | ||
| @@ -121,6 +122,13 @@ static const struct ata_port_info ahci_port_info[] = { | |||
| 121 | .udma_mask = ATA_UDMA6, | 122 | .udma_mask = ATA_UDMA6, |
| 122 | .port_ops = &ahci_ops, | 123 | .port_ops = &ahci_ops, |
| 123 | }, | 124 | }, |
| 125 | [board_ahci_noncq] = { | ||
| 126 | AHCI_HFLAGS (AHCI_HFLAG_NO_NCQ), | ||
| 127 | .flags = AHCI_FLAG_COMMON, | ||
| 128 | .pio_mask = ATA_PIO4, | ||
| 129 | .udma_mask = ATA_UDMA6, | ||
| 130 | .port_ops = &ahci_ops, | ||
| 131 | }, | ||
| 124 | [board_ahci_nosntf] = { | 132 | [board_ahci_nosntf] = { |
| 125 | AHCI_HFLAGS (AHCI_HFLAG_NO_SNTF), | 133 | AHCI_HFLAGS (AHCI_HFLAG_NO_SNTF), |
| 126 | .flags = AHCI_FLAG_COMMON, | 134 | .flags = AHCI_FLAG_COMMON, |
| @@ -452,6 +460,12 @@ static const struct pci_device_id ahci_pci_tbl[] = { | |||
| 452 | { PCI_VDEVICE(ASMEDIA, 0x0611), board_ahci }, /* ASM1061 */ | 460 | { PCI_VDEVICE(ASMEDIA, 0x0611), board_ahci }, /* ASM1061 */ |
| 453 | { PCI_VDEVICE(ASMEDIA, 0x0612), board_ahci }, /* ASM1062 */ | 461 | { PCI_VDEVICE(ASMEDIA, 0x0612), board_ahci }, /* ASM1062 */ |
| 454 | 462 | ||
| 463 | /* | ||
| 464 | * Samsung SSDs found on some macbooks. NCQ times out. | ||
| 465 | * https://bugzilla.kernel.org/show_bug.cgi?id=60731 | ||
| 466 | */ | ||
| 467 | { PCI_VDEVICE(SAMSUNG, 0x1600), board_ahci_noncq }, | ||
| 468 | |||
| 455 | /* Enmotus */ | 469 | /* Enmotus */ |
| 456 | { PCI_DEVICE(0x1c44, 0x8000), board_ahci }, | 470 | { PCI_DEVICE(0x1c44, 0x8000), board_ahci }, |
| 457 | 471 | ||
| @@ -1170,8 +1184,10 @@ static int ahci_init_interrupts(struct pci_dev *pdev, unsigned int n_ports, | |||
| 1170 | 1184 | ||
| 1171 | nvec = rc; | 1185 | nvec = rc; |
| 1172 | rc = pci_enable_msi_block(pdev, nvec); | 1186 | rc = pci_enable_msi_block(pdev, nvec); |
| 1173 | if (rc) | 1187 | if (rc < 0) |
| 1174 | goto intx; | 1188 | goto intx; |
| 1189 | else if (rc > 0) | ||
| 1190 | goto single_msi; | ||
| 1175 | 1191 | ||
| 1176 | return nvec; | 1192 | return nvec; |
| 1177 | 1193 | ||
diff --git a/drivers/ata/libata-pmp.c b/drivers/ata/libata-pmp.c index 20fd337a5731..7ccc084bf1df 100644 --- a/drivers/ata/libata-pmp.c +++ b/drivers/ata/libata-pmp.c | |||
| @@ -447,8 +447,11 @@ static void sata_pmp_quirks(struct ata_port *ap) | |||
| 447 | * otherwise. Don't try hard to recover it. | 447 | * otherwise. Don't try hard to recover it. |
| 448 | */ | 448 | */ |
| 449 | ap->pmp_link[ap->nr_pmp_links - 1].flags |= ATA_LFLAG_NO_RETRY; | 449 | ap->pmp_link[ap->nr_pmp_links - 1].flags |= ATA_LFLAG_NO_RETRY; |
| 450 | } else if (vendor == 0x197b && devid == 0x2352) { | 450 | } else if (vendor == 0x197b && (devid == 0x2352 || devid == 0x0325)) { |
| 451 | /* chip found in Thermaltake BlackX Duet, jmicron JMB350? */ | 451 | /* |
| 452 | * 0x2352: found in Thermaltake BlackX Duet, jmicron JMB350? | ||
| 453 | * 0x0325: jmicron JMB394. | ||
| 454 | */ | ||
| 452 | ata_for_each_link(link, ap, EDGE) { | 455 | ata_for_each_link(link, ap, EDGE) { |
| 453 | /* SRST breaks detection and disks get misclassified | 456 | /* SRST breaks detection and disks get misclassified |
| 454 | * LPM disabled to avoid potential problems | 457 | * LPM disabled to avoid potential problems |
diff --git a/drivers/ata/pata_imx.c b/drivers/ata/pata_imx.c index 26386f0b89a8..b0b18ec5465f 100644 --- a/drivers/ata/pata_imx.c +++ b/drivers/ata/pata_imx.c | |||
| @@ -119,7 +119,9 @@ static int pata_imx_probe(struct platform_device *pdev) | |||
| 119 | return PTR_ERR(priv->clk); | 119 | return PTR_ERR(priv->clk); |
| 120 | } | 120 | } |
| 121 | 121 | ||
| 122 | clk_prepare_enable(priv->clk); | 122 | ret = clk_prepare_enable(priv->clk); |
| 123 | if (ret) | ||
| 124 | return ret; | ||
| 123 | 125 | ||
| 124 | host = ata_host_alloc(&pdev->dev, 1); | 126 | host = ata_host_alloc(&pdev->dev, 1); |
| 125 | if (!host) { | 127 | if (!host) { |
| @@ -212,7 +214,9 @@ static int pata_imx_resume(struct device *dev) | |||
| 212 | struct ata_host *host = dev_get_drvdata(dev); | 214 | struct ata_host *host = dev_get_drvdata(dev); |
| 213 | struct pata_imx_priv *priv = host->private_data; | 215 | struct pata_imx_priv *priv = host->private_data; |
| 214 | 216 | ||
| 215 | clk_prepare_enable(priv->clk); | 217 | int ret = clk_prepare_enable(priv->clk); |
| 218 | if (ret) | ||
| 219 | return ret; | ||
| 216 | 220 | ||
| 217 | __raw_writel(priv->ata_ctl, priv->host_regs + PATA_IMX_ATA_CONTROL); | 221 | __raw_writel(priv->ata_ctl, priv->host_regs + PATA_IMX_ATA_CONTROL); |
| 218 | 222 | ||
diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c index 52b8181ddafd..05c8a44adf8e 100644 --- a/drivers/ata/sata_mv.c +++ b/drivers/ata/sata_mv.c | |||
| @@ -4104,7 +4104,6 @@ static int mv_platform_probe(struct platform_device *pdev) | |||
| 4104 | if (!hpriv->port_phys) | 4104 | if (!hpriv->port_phys) |
| 4105 | return -ENOMEM; | 4105 | return -ENOMEM; |
| 4106 | host->private_data = hpriv; | 4106 | host->private_data = hpriv; |
| 4107 | hpriv->n_ports = n_ports; | ||
| 4108 | hpriv->board_idx = chip_soc; | 4107 | hpriv->board_idx = chip_soc; |
| 4109 | 4108 | ||
| 4110 | host->iomap = NULL; | 4109 | host->iomap = NULL; |
| @@ -4132,13 +4131,18 @@ static int mv_platform_probe(struct platform_device *pdev) | |||
| 4132 | rc = PTR_ERR(hpriv->port_phys[port]); | 4131 | rc = PTR_ERR(hpriv->port_phys[port]); |
| 4133 | hpriv->port_phys[port] = NULL; | 4132 | hpriv->port_phys[port] = NULL; |
| 4134 | if (rc != -EPROBE_DEFER) | 4133 | if (rc != -EPROBE_DEFER) |
| 4135 | dev_warn(&pdev->dev, "error getting phy %d", | 4134 | dev_warn(&pdev->dev, "error getting phy %d", rc); |
| 4136 | rc); | 4135 | |
| 4136 | /* Cleanup only the initialized ports */ | ||
| 4137 | hpriv->n_ports = port; | ||
| 4137 | goto err; | 4138 | goto err; |
| 4138 | } else | 4139 | } else |
| 4139 | phy_power_on(hpriv->port_phys[port]); | 4140 | phy_power_on(hpriv->port_phys[port]); |
| 4140 | } | 4141 | } |
| 4141 | 4142 | ||
| 4143 | /* All the ports have been initialized */ | ||
| 4144 | hpriv->n_ports = n_ports; | ||
| 4145 | |||
| 4142 | /* | 4146 | /* |
| 4143 | * (Re-)program MBUS remapping windows if we are asked to. | 4147 | * (Re-)program MBUS remapping windows if we are asked to. |
| 4144 | */ | 4148 | */ |
| @@ -4176,7 +4180,7 @@ err: | |||
| 4176 | clk_disable_unprepare(hpriv->clk); | 4180 | clk_disable_unprepare(hpriv->clk); |
| 4177 | clk_put(hpriv->clk); | 4181 | clk_put(hpriv->clk); |
| 4178 | } | 4182 | } |
| 4179 | for (port = 0; port < n_ports; port++) { | 4183 | for (port = 0; port < hpriv->n_ports; port++) { |
| 4180 | if (!IS_ERR(hpriv->port_clks[port])) { | 4184 | if (!IS_ERR(hpriv->port_clks[port])) { |
| 4181 | clk_disable_unprepare(hpriv->port_clks[port]); | 4185 | clk_disable_unprepare(hpriv->port_clks[port]); |
| 4182 | clk_put(hpriv->port_clks[port]); | 4186 | clk_put(hpriv->port_clks[port]); |
diff --git a/drivers/ata/sata_sil.c b/drivers/ata/sata_sil.c index d67fc351343c..b7695e804635 100644 --- a/drivers/ata/sata_sil.c +++ b/drivers/ata/sata_sil.c | |||
| @@ -157,6 +157,7 @@ static const struct sil_drivelist { | |||
| 157 | { "ST380011ASL", SIL_QUIRK_MOD15WRITE }, | 157 | { "ST380011ASL", SIL_QUIRK_MOD15WRITE }, |
| 158 | { "ST3120022ASL", SIL_QUIRK_MOD15WRITE }, | 158 | { "ST3120022ASL", SIL_QUIRK_MOD15WRITE }, |
| 159 | { "ST3160021ASL", SIL_QUIRK_MOD15WRITE }, | 159 | { "ST3160021ASL", SIL_QUIRK_MOD15WRITE }, |
| 160 | { "TOSHIBA MK2561GSYN", SIL_QUIRK_MOD15WRITE }, | ||
| 160 | { "Maxtor 4D060H3", SIL_QUIRK_UDMA5MAX }, | 161 | { "Maxtor 4D060H3", SIL_QUIRK_UDMA5MAX }, |
| 161 | { } | 162 | { } |
| 162 | }; | 163 | }; |
diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c index 8a97ddfa6122..c30df50e4440 100644 --- a/drivers/base/firmware_class.c +++ b/drivers/base/firmware_class.c | |||
| @@ -1580,6 +1580,7 @@ static int fw_pm_notify(struct notifier_block *notify_block, | |||
| 1580 | switch (mode) { | 1580 | switch (mode) { |
| 1581 | case PM_HIBERNATION_PREPARE: | 1581 | case PM_HIBERNATION_PREPARE: |
| 1582 | case PM_SUSPEND_PREPARE: | 1582 | case PM_SUSPEND_PREPARE: |
| 1583 | case PM_RESTORE_PREPARE: | ||
| 1583 | kill_requests_without_uevent(); | 1584 | kill_requests_without_uevent(); |
| 1584 | device_cache_fw_images(); | 1585 | device_cache_fw_images(); |
| 1585 | break; | 1586 | break; |
diff --git a/drivers/block/aoe/aoecmd.c b/drivers/block/aoe/aoecmd.c index 8184451b57c0..422b7d84f686 100644 --- a/drivers/block/aoe/aoecmd.c +++ b/drivers/block/aoe/aoecmd.c | |||
| @@ -874,7 +874,7 @@ bio_pageinc(struct bio *bio) | |||
| 874 | /* Non-zero page count for non-head members of | 874 | /* Non-zero page count for non-head members of |
| 875 | * compound pages is no longer allowed by the kernel. | 875 | * compound pages is no longer allowed by the kernel. |
| 876 | */ | 876 | */ |
| 877 | page = compound_trans_head(bv.bv_page); | 877 | page = compound_head(bv.bv_page); |
| 878 | atomic_inc(&page->_count); | 878 | atomic_inc(&page->_count); |
| 879 | } | 879 | } |
| 880 | } | 880 | } |
| @@ -887,7 +887,7 @@ bio_pagedec(struct bio *bio) | |||
| 887 | struct bvec_iter iter; | 887 | struct bvec_iter iter; |
| 888 | 888 | ||
| 889 | bio_for_each_segment(bv, bio, iter) { | 889 | bio_for_each_segment(bv, bio, iter) { |
| 890 | page = compound_trans_head(bv.bv_page); | 890 | page = compound_head(bv.bv_page); |
| 891 | atomic_dec(&page->_count); | 891 | atomic_dec(&page->_count); |
| 892 | } | 892 | } |
| 893 | } | 893 | } |
diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 011e55d820b1..51c557cfd92b 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c | |||
| @@ -612,6 +612,8 @@ static ssize_t disksize_store(struct device *dev, | |||
| 612 | 612 | ||
| 613 | disksize = PAGE_ALIGN(disksize); | 613 | disksize = PAGE_ALIGN(disksize); |
| 614 | meta = zram_meta_alloc(disksize); | 614 | meta = zram_meta_alloc(disksize); |
| 615 | if (!meta) | ||
| 616 | return -ENOMEM; | ||
| 615 | down_write(&zram->init_lock); | 617 | down_write(&zram->init_lock); |
| 616 | if (zram->init_done) { | 618 | if (zram->init_done) { |
| 617 | up_write(&zram->init_lock); | 619 | up_write(&zram->init_lock); |
diff --git a/drivers/clk/at91/clk-master.c b/drivers/clk/at91/clk-master.c index bd313f7816a8..c1af80bcdf20 100644 --- a/drivers/clk/at91/clk-master.c +++ b/drivers/clk/at91/clk-master.c | |||
| @@ -242,7 +242,7 @@ of_at91_clk_master_setup(struct device_node *np, struct at91_pmc *pmc, | |||
| 242 | 242 | ||
| 243 | irq = irq_of_parse_and_map(np, 0); | 243 | irq = irq_of_parse_and_map(np, 0); |
| 244 | if (!irq) | 244 | if (!irq) |
| 245 | return; | 245 | goto out_free_characteristics; |
| 246 | 246 | ||
| 247 | clk = at91_clk_register_master(pmc, irq, name, num_parents, | 247 | clk = at91_clk_register_master(pmc, irq, name, num_parents, |
| 248 | parent_names, layout, | 248 | parent_names, layout, |
diff --git a/drivers/clk/clk-nomadik.c b/drivers/clk/clk-nomadik.c index 6a934a5296bd..05e04ce0f148 100644 --- a/drivers/clk/clk-nomadik.c +++ b/drivers/clk/clk-nomadik.c | |||
| @@ -494,6 +494,9 @@ static const struct file_operations nomadik_src_clk_debugfs_ops = { | |||
| 494 | 494 | ||
| 495 | static int __init nomadik_src_clk_init_debugfs(void) | 495 | static int __init nomadik_src_clk_init_debugfs(void) |
| 496 | { | 496 | { |
| 497 | /* Vital for multiplatform */ | ||
| 498 | if (!src_base) | ||
| 499 | return -ENODEV; | ||
| 497 | src_pcksr0_boot = readl(src_base + SRC_PCKSR0); | 500 | src_pcksr0_boot = readl(src_base + SRC_PCKSR0); |
| 498 | src_pcksr1_boot = readl(src_base + SRC_PCKSR1); | 501 | src_pcksr1_boot = readl(src_base + SRC_PCKSR1); |
| 499 | debugfs_create_file("nomadik-src-clk", S_IFREG | S_IRUGO, | 502 | debugfs_create_file("nomadik-src-clk", S_IFREG | S_IRUGO, |
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index 5517944495d8..c42e608af6bb 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c | |||
| @@ -2226,24 +2226,25 @@ EXPORT_SYMBOL_GPL(devm_clk_unregister); | |||
| 2226 | */ | 2226 | */ |
| 2227 | int __clk_get(struct clk *clk) | 2227 | int __clk_get(struct clk *clk) |
| 2228 | { | 2228 | { |
| 2229 | if (clk && !try_module_get(clk->owner)) | 2229 | if (clk) { |
| 2230 | return 0; | 2230 | if (!try_module_get(clk->owner)) |
| 2231 | return 0; | ||
| 2231 | 2232 | ||
| 2232 | kref_get(&clk->ref); | 2233 | kref_get(&clk->ref); |
| 2234 | } | ||
| 2233 | return 1; | 2235 | return 1; |
| 2234 | } | 2236 | } |
| 2235 | 2237 | ||
| 2236 | void __clk_put(struct clk *clk) | 2238 | void __clk_put(struct clk *clk) |
| 2237 | { | 2239 | { |
| 2238 | if (WARN_ON_ONCE(IS_ERR(clk))) | 2240 | if (!clk || WARN_ON_ONCE(IS_ERR(clk))) |
| 2239 | return; | 2241 | return; |
| 2240 | 2242 | ||
| 2241 | clk_prepare_lock(); | 2243 | clk_prepare_lock(); |
| 2242 | kref_put(&clk->ref, __clk_release); | 2244 | kref_put(&clk->ref, __clk_release); |
| 2243 | clk_prepare_unlock(); | 2245 | clk_prepare_unlock(); |
| 2244 | 2246 | ||
| 2245 | if (clk) | 2247 | module_put(clk->owner); |
| 2246 | module_put(clk->owner); | ||
| 2247 | } | 2248 | } |
| 2248 | 2249 | ||
| 2249 | /*** clk rate change notifiers ***/ | 2250 | /*** clk rate change notifiers ***/ |
diff --git a/drivers/clk/keystone/gate.c b/drivers/clk/keystone/gate.c index 17a598398a53..86f1e362eafb 100644 --- a/drivers/clk/keystone/gate.c +++ b/drivers/clk/keystone/gate.c | |||
| @@ -179,6 +179,7 @@ static struct clk *clk_register_psc(struct device *dev, | |||
| 179 | 179 | ||
| 180 | init.name = name; | 180 | init.name = name; |
| 181 | init.ops = &clk_psc_ops; | 181 | init.ops = &clk_psc_ops; |
| 182 | init.flags = 0; | ||
| 182 | init.parent_names = (parent_name ? &parent_name : NULL); | 183 | init.parent_names = (parent_name ? &parent_name : NULL); |
| 183 | init.num_parents = (parent_name ? 1 : 0); | 184 | init.num_parents = (parent_name ? 1 : 0); |
| 184 | 185 | ||
diff --git a/drivers/clk/mvebu/armada-370.c b/drivers/clk/mvebu/armada-370.c index 81a202d12a7a..bef198a83863 100644 --- a/drivers/clk/mvebu/armada-370.c +++ b/drivers/clk/mvebu/armada-370.c | |||
| @@ -141,13 +141,6 @@ static const struct coreclk_soc_desc a370_coreclks = { | |||
| 141 | .num_ratios = ARRAY_SIZE(a370_coreclk_ratios), | 141 | .num_ratios = ARRAY_SIZE(a370_coreclk_ratios), |
| 142 | }; | 142 | }; |
| 143 | 143 | ||
| 144 | static void __init a370_coreclk_init(struct device_node *np) | ||
| 145 | { | ||
| 146 | mvebu_coreclk_setup(np, &a370_coreclks); | ||
| 147 | } | ||
| 148 | CLK_OF_DECLARE(a370_core_clk, "marvell,armada-370-core-clock", | ||
| 149 | a370_coreclk_init); | ||
| 150 | |||
| 151 | /* | 144 | /* |
| 152 | * Clock Gating Control | 145 | * Clock Gating Control |
| 153 | */ | 146 | */ |
| @@ -168,9 +161,15 @@ static const struct clk_gating_soc_desc a370_gating_desc[] __initconst = { | |||
| 168 | { } | 161 | { } |
| 169 | }; | 162 | }; |
| 170 | 163 | ||
| 171 | static void __init a370_clk_gating_init(struct device_node *np) | 164 | static void __init a370_clk_init(struct device_node *np) |
| 172 | { | 165 | { |
| 173 | mvebu_clk_gating_setup(np, a370_gating_desc); | 166 | struct device_node *cgnp = |
| 167 | of_find_compatible_node(NULL, NULL, "marvell,armada-370-gating-clock"); | ||
| 168 | |||
| 169 | mvebu_coreclk_setup(np, &a370_coreclks); | ||
| 170 | |||
| 171 | if (cgnp) | ||
| 172 | mvebu_clk_gating_setup(cgnp, a370_gating_desc); | ||
| 174 | } | 173 | } |
| 175 | CLK_OF_DECLARE(a370_clk_gating, "marvell,armada-370-gating-clock", | 174 | CLK_OF_DECLARE(a370_clk, "marvell,armada-370-core-clock", a370_clk_init); |
| 176 | a370_clk_gating_init); | 175 | |
diff --git a/drivers/clk/mvebu/armada-xp.c b/drivers/clk/mvebu/armada-xp.c index 9922c4475aa8..b3094315a3c0 100644 --- a/drivers/clk/mvebu/armada-xp.c +++ b/drivers/clk/mvebu/armada-xp.c | |||
| @@ -158,13 +158,6 @@ static const struct coreclk_soc_desc axp_coreclks = { | |||
| 158 | .num_ratios = ARRAY_SIZE(axp_coreclk_ratios), | 158 | .num_ratios = ARRAY_SIZE(axp_coreclk_ratios), |
| 159 | }; | 159 | }; |
| 160 | 160 | ||
| 161 | static void __init axp_coreclk_init(struct device_node *np) | ||
| 162 | { | ||
| 163 | mvebu_coreclk_setup(np, &axp_coreclks); | ||
| 164 | } | ||
| 165 | CLK_OF_DECLARE(axp_core_clk, "marvell,armada-xp-core-clock", | ||
| 166 | axp_coreclk_init); | ||
| 167 | |||
| 168 | /* | 161 | /* |
| 169 | * Clock Gating Control | 162 | * Clock Gating Control |
| 170 | */ | 163 | */ |
| @@ -202,9 +195,14 @@ static const struct clk_gating_soc_desc axp_gating_desc[] __initconst = { | |||
| 202 | { } | 195 | { } |
| 203 | }; | 196 | }; |
| 204 | 197 | ||
| 205 | static void __init axp_clk_gating_init(struct device_node *np) | 198 | static void __init axp_clk_init(struct device_node *np) |
| 206 | { | 199 | { |
| 207 | mvebu_clk_gating_setup(np, axp_gating_desc); | 200 | struct device_node *cgnp = |
| 201 | of_find_compatible_node(NULL, NULL, "marvell,armada-xp-gating-clock"); | ||
| 202 | |||
| 203 | mvebu_coreclk_setup(np, &axp_coreclks); | ||
| 204 | |||
| 205 | if (cgnp) | ||
| 206 | mvebu_clk_gating_setup(cgnp, axp_gating_desc); | ||
| 208 | } | 207 | } |
| 209 | CLK_OF_DECLARE(axp_clk_gating, "marvell,armada-xp-gating-clock", | 208 | CLK_OF_DECLARE(axp_clk, "marvell,armada-xp-core-clock", axp_clk_init); |
| 210 | axp_clk_gating_init); | ||
diff --git a/drivers/clk/mvebu/dove.c b/drivers/clk/mvebu/dove.c index 38aee1e3f242..b8c2424ac926 100644 --- a/drivers/clk/mvebu/dove.c +++ b/drivers/clk/mvebu/dove.c | |||
| @@ -154,12 +154,6 @@ static const struct coreclk_soc_desc dove_coreclks = { | |||
| 154 | .num_ratios = ARRAY_SIZE(dove_coreclk_ratios), | 154 | .num_ratios = ARRAY_SIZE(dove_coreclk_ratios), |
| 155 | }; | 155 | }; |
| 156 | 156 | ||
| 157 | static void __init dove_coreclk_init(struct device_node *np) | ||
| 158 | { | ||
| 159 | mvebu_coreclk_setup(np, &dove_coreclks); | ||
| 160 | } | ||
| 161 | CLK_OF_DECLARE(dove_core_clk, "marvell,dove-core-clock", dove_coreclk_init); | ||
| 162 | |||
| 163 | /* | 157 | /* |
| 164 | * Clock Gating Control | 158 | * Clock Gating Control |
| 165 | */ | 159 | */ |
| @@ -186,9 +180,14 @@ static const struct clk_gating_soc_desc dove_gating_desc[] __initconst = { | |||
| 186 | { } | 180 | { } |
| 187 | }; | 181 | }; |
| 188 | 182 | ||
| 189 | static void __init dove_clk_gating_init(struct device_node *np) | 183 | static void __init dove_clk_init(struct device_node *np) |
| 190 | { | 184 | { |
| 191 | mvebu_clk_gating_setup(np, dove_gating_desc); | 185 | struct device_node *cgnp = |
| 186 | of_find_compatible_node(NULL, NULL, "marvell,dove-gating-clock"); | ||
| 187 | |||
| 188 | mvebu_coreclk_setup(np, &dove_coreclks); | ||
| 189 | |||
| 190 | if (cgnp) | ||
| 191 | mvebu_clk_gating_setup(cgnp, dove_gating_desc); | ||
| 192 | } | 192 | } |
| 193 | CLK_OF_DECLARE(dove_clk_gating, "marvell,dove-gating-clock", | 193 | CLK_OF_DECLARE(dove_clk, "marvell,dove-core-clock", dove_clk_init); |
| 194 | dove_clk_gating_init); | ||
diff --git a/drivers/clk/mvebu/kirkwood.c b/drivers/clk/mvebu/kirkwood.c index 2636a55f29f9..ddb666a86500 100644 --- a/drivers/clk/mvebu/kirkwood.c +++ b/drivers/clk/mvebu/kirkwood.c | |||
| @@ -193,13 +193,6 @@ static const struct coreclk_soc_desc kirkwood_coreclks = { | |||
| 193 | .num_ratios = ARRAY_SIZE(kirkwood_coreclk_ratios), | 193 | .num_ratios = ARRAY_SIZE(kirkwood_coreclk_ratios), |
| 194 | }; | 194 | }; |
| 195 | 195 | ||
| 196 | static void __init kirkwood_coreclk_init(struct device_node *np) | ||
| 197 | { | ||
| 198 | mvebu_coreclk_setup(np, &kirkwood_coreclks); | ||
| 199 | } | ||
| 200 | CLK_OF_DECLARE(kirkwood_core_clk, "marvell,kirkwood-core-clock", | ||
| 201 | kirkwood_coreclk_init); | ||
| 202 | |||
| 203 | static const struct coreclk_soc_desc mv88f6180_coreclks = { | 196 | static const struct coreclk_soc_desc mv88f6180_coreclks = { |
| 204 | .get_tclk_freq = kirkwood_get_tclk_freq, | 197 | .get_tclk_freq = kirkwood_get_tclk_freq, |
| 205 | .get_cpu_freq = mv88f6180_get_cpu_freq, | 198 | .get_cpu_freq = mv88f6180_get_cpu_freq, |
| @@ -208,13 +201,6 @@ static const struct coreclk_soc_desc mv88f6180_coreclks = { | |||
| 208 | .num_ratios = ARRAY_SIZE(kirkwood_coreclk_ratios), | 201 | .num_ratios = ARRAY_SIZE(kirkwood_coreclk_ratios), |
| 209 | }; | 202 | }; |
| 210 | 203 | ||
| 211 | static void __init mv88f6180_coreclk_init(struct device_node *np) | ||
| 212 | { | ||
| 213 | mvebu_coreclk_setup(np, &mv88f6180_coreclks); | ||
| 214 | } | ||
| 215 | CLK_OF_DECLARE(mv88f6180_core_clk, "marvell,mv88f6180-core-clock", | ||
| 216 | mv88f6180_coreclk_init); | ||
| 217 | |||
| 218 | /* | 204 | /* |
| 219 | * Clock Gating Control | 205 | * Clock Gating Control |
| 220 | */ | 206 | */ |
| @@ -239,9 +225,21 @@ static const struct clk_gating_soc_desc kirkwood_gating_desc[] __initconst = { | |||
| 239 | { } | 225 | { } |
| 240 | }; | 226 | }; |
| 241 | 227 | ||
| 242 | static void __init kirkwood_clk_gating_init(struct device_node *np) | 228 | static void __init kirkwood_clk_init(struct device_node *np) |
| 243 | { | 229 | { |
| 244 | mvebu_clk_gating_setup(np, kirkwood_gating_desc); | 230 | struct device_node *cgnp = |
| 231 | of_find_compatible_node(NULL, NULL, "marvell,kirkwood-gating-clock"); | ||
| 232 | |||
| 233 | |||
| 234 | if (of_device_is_compatible(np, "marvell,mv88f6180-core-clock")) | ||
| 235 | mvebu_coreclk_setup(np, &mv88f6180_coreclks); | ||
| 236 | else | ||
| 237 | mvebu_coreclk_setup(np, &kirkwood_coreclks); | ||
| 238 | |||
| 239 | if (cgnp) | ||
| 240 | mvebu_clk_gating_setup(cgnp, kirkwood_gating_desc); | ||
| 245 | } | 241 | } |
| 246 | CLK_OF_DECLARE(kirkwood_clk_gating, "marvell,kirkwood-gating-clock", | 242 | CLK_OF_DECLARE(kirkwood_clk, "marvell,kirkwood-core-clock", |
| 247 | kirkwood_clk_gating_init); | 243 | kirkwood_clk_init); |
| 244 | CLK_OF_DECLARE(mv88f6180_clk, "marvell,mv88f6180-core-clock", | ||
| 245 | kirkwood_clk_init); | ||
diff --git a/drivers/clk/shmobile/clk-rcar-gen2.c b/drivers/clk/shmobile/clk-rcar-gen2.c index a59ec217a124..dd272a0d1446 100644 --- a/drivers/clk/shmobile/clk-rcar-gen2.c +++ b/drivers/clk/shmobile/clk-rcar-gen2.c | |||
| @@ -186,7 +186,7 @@ rcar_gen2_cpg_register_clock(struct device_node *np, struct rcar_gen2_cpg *cpg, | |||
| 186 | const char *name) | 186 | const char *name) |
| 187 | { | 187 | { |
| 188 | const struct clk_div_table *table = NULL; | 188 | const struct clk_div_table *table = NULL; |
| 189 | const char *parent_name = "main"; | 189 | const char *parent_name; |
| 190 | unsigned int shift; | 190 | unsigned int shift; |
| 191 | unsigned int mult = 1; | 191 | unsigned int mult = 1; |
| 192 | unsigned int div = 1; | 192 | unsigned int div = 1; |
| @@ -201,23 +201,31 @@ rcar_gen2_cpg_register_clock(struct device_node *np, struct rcar_gen2_cpg *cpg, | |||
| 201 | * the multiplier value. | 201 | * the multiplier value. |
| 202 | */ | 202 | */ |
| 203 | u32 value = clk_readl(cpg->reg + CPG_PLL0CR); | 203 | u32 value = clk_readl(cpg->reg + CPG_PLL0CR); |
| 204 | parent_name = "main"; | ||
| 204 | mult = ((value >> 24) & ((1 << 7) - 1)) + 1; | 205 | mult = ((value >> 24) & ((1 << 7) - 1)) + 1; |
| 205 | } else if (!strcmp(name, "pll1")) { | 206 | } else if (!strcmp(name, "pll1")) { |
| 207 | parent_name = "main"; | ||
| 206 | mult = config->pll1_mult / 2; | 208 | mult = config->pll1_mult / 2; |
| 207 | } else if (!strcmp(name, "pll3")) { | 209 | } else if (!strcmp(name, "pll3")) { |
| 210 | parent_name = "main"; | ||
| 208 | mult = config->pll3_mult; | 211 | mult = config->pll3_mult; |
| 209 | } else if (!strcmp(name, "lb")) { | 212 | } else if (!strcmp(name, "lb")) { |
| 213 | parent_name = "pll1_div2"; | ||
| 210 | div = cpg_mode & BIT(18) ? 36 : 24; | 214 | div = cpg_mode & BIT(18) ? 36 : 24; |
| 211 | } else if (!strcmp(name, "qspi")) { | 215 | } else if (!strcmp(name, "qspi")) { |
| 216 | parent_name = "pll1_div2"; | ||
| 212 | div = (cpg_mode & (BIT(3) | BIT(2) | BIT(1))) == BIT(2) | 217 | div = (cpg_mode & (BIT(3) | BIT(2) | BIT(1))) == BIT(2) |
| 213 | ? 16 : 20; | 218 | ? 8 : 10; |
| 214 | } else if (!strcmp(name, "sdh")) { | 219 | } else if (!strcmp(name, "sdh")) { |
| 220 | parent_name = "pll1_div2"; | ||
| 215 | table = cpg_sdh_div_table; | 221 | table = cpg_sdh_div_table; |
| 216 | shift = 8; | 222 | shift = 8; |
| 217 | } else if (!strcmp(name, "sd0")) { | 223 | } else if (!strcmp(name, "sd0")) { |
| 224 | parent_name = "pll1_div2"; | ||
| 218 | table = cpg_sd01_div_table; | 225 | table = cpg_sd01_div_table; |
| 219 | shift = 4; | 226 | shift = 4; |
| 220 | } else if (!strcmp(name, "sd1")) { | 227 | } else if (!strcmp(name, "sd1")) { |
| 228 | parent_name = "pll1_div2"; | ||
| 221 | table = cpg_sd01_div_table; | 229 | table = cpg_sd01_div_table; |
| 222 | shift = 0; | 230 | shift = 0; |
| 223 | } else if (!strcmp(name, "z")) { | 231 | } else if (!strcmp(name, "z")) { |
diff --git a/drivers/clk/tegra/clk-divider.c b/drivers/clk/tegra/clk-divider.c index 4d75b1f37e3a..290f9c1a3749 100644 --- a/drivers/clk/tegra/clk-divider.c +++ b/drivers/clk/tegra/clk-divider.c | |||
| @@ -59,7 +59,7 @@ static int get_div(struct tegra_clk_frac_div *divider, unsigned long rate, | |||
| 59 | return 0; | 59 | return 0; |
| 60 | 60 | ||
| 61 | if (divider_ux1 > get_max_div(divider)) | 61 | if (divider_ux1 > get_max_div(divider)) |
| 62 | return -EINVAL; | 62 | return get_max_div(divider); |
| 63 | 63 | ||
| 64 | return divider_ux1; | 64 | return divider_ux1; |
| 65 | } | 65 | } |
diff --git a/drivers/clk/tegra/clk-id.h b/drivers/clk/tegra/clk-id.h index cf0c323f2c36..c39613c519af 100644 --- a/drivers/clk/tegra/clk-id.h +++ b/drivers/clk/tegra/clk-id.h | |||
| @@ -180,9 +180,13 @@ enum clk_id { | |||
| 180 | tegra_clk_sbc6_8, | 180 | tegra_clk_sbc6_8, |
| 181 | tegra_clk_sclk, | 181 | tegra_clk_sclk, |
| 182 | tegra_clk_sdmmc1, | 182 | tegra_clk_sdmmc1, |
| 183 | tegra_clk_sdmmc1_8, | ||
| 183 | tegra_clk_sdmmc2, | 184 | tegra_clk_sdmmc2, |
| 185 | tegra_clk_sdmmc2_8, | ||
| 184 | tegra_clk_sdmmc3, | 186 | tegra_clk_sdmmc3, |
| 187 | tegra_clk_sdmmc3_8, | ||
| 185 | tegra_clk_sdmmc4, | 188 | tegra_clk_sdmmc4, |
| 189 | tegra_clk_sdmmc4_8, | ||
| 186 | tegra_clk_se, | 190 | tegra_clk_se, |
| 187 | tegra_clk_soc_therm, | 191 | tegra_clk_soc_therm, |
| 188 | tegra_clk_sor0, | 192 | tegra_clk_sor0, |
diff --git a/drivers/clk/tegra/clk-tegra-periph.c b/drivers/clk/tegra/clk-tegra-periph.c index 5c35885f4a7c..1fa5c3f33b20 100644 --- a/drivers/clk/tegra/clk-tegra-periph.c +++ b/drivers/clk/tegra/clk-tegra-periph.c | |||
| @@ -371,9 +371,7 @@ static const char *mux_pllp3_pllc_clkm[] = { | |||
| 371 | static const char *mux_pllm_pllc_pllp_plla_pllc2_c3_clkm[] = { | 371 | static const char *mux_pllm_pllc_pllp_plla_pllc2_c3_clkm[] = { |
| 372 | "pll_m", "pll_c", "pll_p", "pll_a", "pll_c2", "pll_c3", "clk_m" | 372 | "pll_m", "pll_c", "pll_p", "pll_a", "pll_c2", "pll_c3", "clk_m" |
| 373 | }; | 373 | }; |
| 374 | static u32 mux_pllm_pllc_pllp_plla_pllc2_c3_clkm_idx[] = { | 374 | #define mux_pllm_pllc_pllp_plla_pllc2_c3_clkm_idx NULL |
| 375 | [0] = 0, [1] = 1, [2] = 2, [3] = 3, [4] = 4, [5] = 6, | ||
| 376 | }; | ||
| 377 | 375 | ||
| 378 | static const char *mux_pllm_pllc2_c_c3_pllp_plla_pllc4[] = { | 376 | static const char *mux_pllm_pllc2_c_c3_pllp_plla_pllc4[] = { |
| 379 | "pll_m", "pll_c2", "pll_c", "pll_c3", "pll_p", "pll_a_out0", "pll_c4", | 377 | "pll_m", "pll_c2", "pll_c", "pll_c3", "pll_p", "pll_a_out0", "pll_c4", |
| @@ -465,6 +463,10 @@ static struct tegra_periph_init_data periph_clks[] = { | |||
| 465 | MUX("adx1", mux_plla_pllc_pllp_clkm, CLK_SOURCE_ADX1, 180, TEGRA_PERIPH_ON_APB, tegra_clk_adx1), | 463 | MUX("adx1", mux_plla_pllc_pllp_clkm, CLK_SOURCE_ADX1, 180, TEGRA_PERIPH_ON_APB, tegra_clk_adx1), |
| 466 | MUX("amx1", mux_plla_pllc_pllp_clkm, CLK_SOURCE_AMX1, 185, TEGRA_PERIPH_ON_APB, tegra_clk_amx1), | 464 | MUX("amx1", mux_plla_pllc_pllp_clkm, CLK_SOURCE_AMX1, 185, TEGRA_PERIPH_ON_APB, tegra_clk_amx1), |
| 467 | MUX("vi_sensor2", mux_pllm_pllc2_c_c3_pllp_plla, CLK_SOURCE_VI_SENSOR2, 20, TEGRA_PERIPH_NO_RESET, tegra_clk_vi_sensor2), | 465 | MUX("vi_sensor2", mux_pllm_pllc2_c_c3_pllp_plla, CLK_SOURCE_VI_SENSOR2, 20, TEGRA_PERIPH_NO_RESET, tegra_clk_vi_sensor2), |
| 466 | MUX8("sdmmc1", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_SDMMC1, 14, 0, tegra_clk_sdmmc1_8), | ||
| 467 | MUX8("sdmmc2", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_SDMMC2, 9, 0, tegra_clk_sdmmc2_8), | ||
| 468 | MUX8("sdmmc3", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_SDMMC3, 69, 0, tegra_clk_sdmmc3_8), | ||
| 469 | MUX8("sdmmc4", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_SDMMC4, 15, 0, tegra_clk_sdmmc4_8), | ||
| 468 | MUX8("sbc1", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_SBC1, 41, TEGRA_PERIPH_ON_APB, tegra_clk_sbc1_8), | 470 | MUX8("sbc1", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_SBC1, 41, TEGRA_PERIPH_ON_APB, tegra_clk_sbc1_8), |
| 469 | MUX8("sbc2", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_SBC2, 44, TEGRA_PERIPH_ON_APB, tegra_clk_sbc2_8), | 471 | MUX8("sbc2", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_SBC2, 44, TEGRA_PERIPH_ON_APB, tegra_clk_sbc2_8), |
| 470 | MUX8("sbc3", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_SBC3, 46, TEGRA_PERIPH_ON_APB, tegra_clk_sbc3_8), | 472 | MUX8("sbc3", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_SBC3, 46, TEGRA_PERIPH_ON_APB, tegra_clk_sbc3_8), |
| @@ -492,7 +494,7 @@ static struct tegra_periph_init_data periph_clks[] = { | |||
| 492 | UART("uartb", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_UARTB, 7, tegra_clk_uartb), | 494 | UART("uartb", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_UARTB, 7, tegra_clk_uartb), |
| 493 | UART("uartc", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_UARTC, 55, tegra_clk_uartc), | 495 | UART("uartc", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_UARTC, 55, tegra_clk_uartc), |
| 494 | UART("uartd", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_UARTD, 65, tegra_clk_uartd), | 496 | UART("uartd", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_UARTD, 65, tegra_clk_uartd), |
| 495 | UART("uarte", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_UARTE, 65, tegra_clk_uarte), | 497 | UART("uarte", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_UARTE, 66, tegra_clk_uarte), |
| 496 | XUSB("xusb_host_src", mux_clkm_pllp_pllc_pllre, CLK_SOURCE_XUSB_HOST_SRC, 143, TEGRA_PERIPH_ON_APB | TEGRA_PERIPH_NO_RESET, tegra_clk_xusb_host_src), | 498 | XUSB("xusb_host_src", mux_clkm_pllp_pllc_pllre, CLK_SOURCE_XUSB_HOST_SRC, 143, TEGRA_PERIPH_ON_APB | TEGRA_PERIPH_NO_RESET, tegra_clk_xusb_host_src), |
| 497 | XUSB("xusb_falcon_src", mux_clkm_pllp_pllc_pllre, CLK_SOURCE_XUSB_FALCON_SRC, 143, TEGRA_PERIPH_NO_RESET, tegra_clk_xusb_falcon_src), | 499 | XUSB("xusb_falcon_src", mux_clkm_pllp_pllc_pllre, CLK_SOURCE_XUSB_FALCON_SRC, 143, TEGRA_PERIPH_NO_RESET, tegra_clk_xusb_falcon_src), |
| 498 | XUSB("xusb_fs_src", mux_clkm_48M_pllp_480M, CLK_SOURCE_XUSB_FS_SRC, 143, TEGRA_PERIPH_NO_RESET, tegra_clk_xusb_fs_src), | 500 | XUSB("xusb_fs_src", mux_clkm_48M_pllp_480M, CLK_SOURCE_XUSB_FS_SRC, 143, TEGRA_PERIPH_NO_RESET, tegra_clk_xusb_fs_src), |
diff --git a/drivers/clk/tegra/clk-tegra-super-gen4.c b/drivers/clk/tegra/clk-tegra-super-gen4.c index 05dce4aa2c11..feb3201c85ce 100644 --- a/drivers/clk/tegra/clk-tegra-super-gen4.c +++ b/drivers/clk/tegra/clk-tegra-super-gen4.c | |||
| @@ -120,7 +120,7 @@ void __init tegra_super_clk_gen4_init(void __iomem *clk_base, | |||
| 120 | ARRAY_SIZE(cclk_lp_parents), | 120 | ARRAY_SIZE(cclk_lp_parents), |
| 121 | CLK_SET_RATE_PARENT, | 121 | CLK_SET_RATE_PARENT, |
| 122 | clk_base + CCLKLP_BURST_POLICY, | 122 | clk_base + CCLKLP_BURST_POLICY, |
| 123 | 0, 4, 8, 9, NULL); | 123 | TEGRA_DIVIDER_2, 4, 8, 9, NULL); |
| 124 | *dt_clk = clk; | 124 | *dt_clk = clk; |
| 125 | } | 125 | } |
| 126 | 126 | ||
diff --git a/drivers/clk/tegra/clk-tegra114.c b/drivers/clk/tegra/clk-tegra114.c index 90d9d25f2228..80431f0fb268 100644 --- a/drivers/clk/tegra/clk-tegra114.c +++ b/drivers/clk/tegra/clk-tegra114.c | |||
| @@ -682,12 +682,12 @@ static struct tegra_clk tegra114_clks[tegra_clk_max] __initdata = { | |||
| 682 | [tegra_clk_timer] = { .dt_id = TEGRA114_CLK_TIMER, .present = true }, | 682 | [tegra_clk_timer] = { .dt_id = TEGRA114_CLK_TIMER, .present = true }, |
| 683 | [tegra_clk_uarta] = { .dt_id = TEGRA114_CLK_UARTA, .present = true }, | 683 | [tegra_clk_uarta] = { .dt_id = TEGRA114_CLK_UARTA, .present = true }, |
| 684 | [tegra_clk_uartd] = { .dt_id = TEGRA114_CLK_UARTD, .present = true }, | 684 | [tegra_clk_uartd] = { .dt_id = TEGRA114_CLK_UARTD, .present = true }, |
| 685 | [tegra_clk_sdmmc2] = { .dt_id = TEGRA114_CLK_SDMMC2, .present = true }, | 685 | [tegra_clk_sdmmc2_8] = { .dt_id = TEGRA114_CLK_SDMMC2, .present = true }, |
| 686 | [tegra_clk_i2s1] = { .dt_id = TEGRA114_CLK_I2S1, .present = true }, | 686 | [tegra_clk_i2s1] = { .dt_id = TEGRA114_CLK_I2S1, .present = true }, |
| 687 | [tegra_clk_i2c1] = { .dt_id = TEGRA114_CLK_I2C1, .present = true }, | 687 | [tegra_clk_i2c1] = { .dt_id = TEGRA114_CLK_I2C1, .present = true }, |
| 688 | [tegra_clk_ndflash] = { .dt_id = TEGRA114_CLK_NDFLASH, .present = true }, | 688 | [tegra_clk_ndflash] = { .dt_id = TEGRA114_CLK_NDFLASH, .present = true }, |
| 689 | [tegra_clk_sdmmc1] = { .dt_id = TEGRA114_CLK_SDMMC1, .present = true }, | 689 | [tegra_clk_sdmmc1_8] = { .dt_id = TEGRA114_CLK_SDMMC1, .present = true }, |
| 690 | [tegra_clk_sdmmc4] = { .dt_id = TEGRA114_CLK_SDMMC4, .present = true }, | 690 | [tegra_clk_sdmmc4_8] = { .dt_id = TEGRA114_CLK_SDMMC4, .present = true }, |
| 691 | [tegra_clk_pwm] = { .dt_id = TEGRA114_CLK_PWM, .present = true }, | 691 | [tegra_clk_pwm] = { .dt_id = TEGRA114_CLK_PWM, .present = true }, |
| 692 | [tegra_clk_i2s0] = { .dt_id = TEGRA114_CLK_I2S0, .present = true }, | 692 | [tegra_clk_i2s0] = { .dt_id = TEGRA114_CLK_I2S0, .present = true }, |
| 693 | [tegra_clk_i2s2] = { .dt_id = TEGRA114_CLK_I2S2, .present = true }, | 693 | [tegra_clk_i2s2] = { .dt_id = TEGRA114_CLK_I2S2, .present = true }, |
| @@ -723,7 +723,7 @@ static struct tegra_clk tegra114_clks[tegra_clk_max] __initdata = { | |||
| 723 | [tegra_clk_bsev] = { .dt_id = TEGRA114_CLK_BSEV, .present = true }, | 723 | [tegra_clk_bsev] = { .dt_id = TEGRA114_CLK_BSEV, .present = true }, |
| 724 | [tegra_clk_i2c3] = { .dt_id = TEGRA114_CLK_I2C3, .present = true }, | 724 | [tegra_clk_i2c3] = { .dt_id = TEGRA114_CLK_I2C3, .present = true }, |
| 725 | [tegra_clk_sbc4_8] = { .dt_id = TEGRA114_CLK_SBC4, .present = true }, | 725 | [tegra_clk_sbc4_8] = { .dt_id = TEGRA114_CLK_SBC4, .present = true }, |
| 726 | [tegra_clk_sdmmc3] = { .dt_id = TEGRA114_CLK_SDMMC3, .present = true }, | 726 | [tegra_clk_sdmmc3_8] = { .dt_id = TEGRA114_CLK_SDMMC3, .present = true }, |
| 727 | [tegra_clk_owr] = { .dt_id = TEGRA114_CLK_OWR, .present = true }, | 727 | [tegra_clk_owr] = { .dt_id = TEGRA114_CLK_OWR, .present = true }, |
| 728 | [tegra_clk_csite] = { .dt_id = TEGRA114_CLK_CSITE, .present = true }, | 728 | [tegra_clk_csite] = { .dt_id = TEGRA114_CLK_CSITE, .present = true }, |
| 729 | [tegra_clk_la] = { .dt_id = TEGRA114_CLK_LA, .present = true }, | 729 | [tegra_clk_la] = { .dt_id = TEGRA114_CLK_LA, .present = true }, |
diff --git a/drivers/clk/tegra/clk-tegra124.c b/drivers/clk/tegra/clk-tegra124.c index aff86b5bc745..166e02f16c8a 100644 --- a/drivers/clk/tegra/clk-tegra124.c +++ b/drivers/clk/tegra/clk-tegra124.c | |||
| @@ -516,11 +516,11 @@ static struct div_nmp pllp_nmp = { | |||
| 516 | }; | 516 | }; |
| 517 | 517 | ||
| 518 | static struct tegra_clk_pll_freq_table pll_p_freq_table[] = { | 518 | static struct tegra_clk_pll_freq_table pll_p_freq_table[] = { |
| 519 | {12000000, 216000000, 432, 12, 1, 8}, | 519 | {12000000, 408000000, 408, 12, 0, 8}, |
| 520 | {13000000, 216000000, 432, 13, 1, 8}, | 520 | {13000000, 408000000, 408, 13, 0, 8}, |
| 521 | {16800000, 216000000, 360, 14, 1, 8}, | 521 | {16800000, 408000000, 340, 14, 0, 8}, |
| 522 | {19200000, 216000000, 360, 16, 1, 8}, | 522 | {19200000, 408000000, 340, 16, 0, 8}, |
| 523 | {26000000, 216000000, 432, 26, 1, 8}, | 523 | {26000000, 408000000, 408, 26, 0, 8}, |
| 524 | {0, 0, 0, 0, 0, 0}, | 524 | {0, 0, 0, 0, 0, 0}, |
| 525 | }; | 525 | }; |
| 526 | 526 | ||
| @@ -570,6 +570,15 @@ static struct tegra_clk_pll_params pll_a_params = { | |||
| 570 | .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_USE_LOCK, | 570 | .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_USE_LOCK, |
| 571 | }; | 571 | }; |
| 572 | 572 | ||
| 573 | static struct div_nmp plld_nmp = { | ||
| 574 | .divm_shift = 0, | ||
| 575 | .divm_width = 5, | ||
| 576 | .divn_shift = 8, | ||
| 577 | .divn_width = 11, | ||
| 578 | .divp_shift = 20, | ||
| 579 | .divp_width = 3, | ||
| 580 | }; | ||
| 581 | |||
| 573 | static struct tegra_clk_pll_freq_table pll_d_freq_table[] = { | 582 | static struct tegra_clk_pll_freq_table pll_d_freq_table[] = { |
| 574 | {12000000, 216000000, 864, 12, 4, 12}, | 583 | {12000000, 216000000, 864, 12, 4, 12}, |
| 575 | {13000000, 216000000, 864, 13, 4, 12}, | 584 | {13000000, 216000000, 864, 13, 4, 12}, |
| @@ -603,19 +612,18 @@ static struct tegra_clk_pll_params pll_d_params = { | |||
| 603 | .lock_mask = PLL_BASE_LOCK, | 612 | .lock_mask = PLL_BASE_LOCK, |
| 604 | .lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE, | 613 | .lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE, |
| 605 | .lock_delay = 1000, | 614 | .lock_delay = 1000, |
| 606 | .div_nmp = &pllp_nmp, | 615 | .div_nmp = &plld_nmp, |
| 607 | .freq_table = pll_d_freq_table, | 616 | .freq_table = pll_d_freq_table, |
| 608 | .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON | | 617 | .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON | |
| 609 | TEGRA_PLL_USE_LOCK, | 618 | TEGRA_PLL_USE_LOCK, |
| 610 | }; | 619 | }; |
| 611 | 620 | ||
| 612 | static struct tegra_clk_pll_freq_table tegra124_pll_d2_freq_table[] = { | 621 | static struct tegra_clk_pll_freq_table tegra124_pll_d2_freq_table[] = { |
| 613 | { 12000000, 148500000, 99, 1, 8}, | 622 | { 12000000, 594000000, 99, 1, 2}, |
| 614 | { 12000000, 594000000, 99, 1, 1}, | 623 | { 13000000, 594000000, 91, 1, 2}, /* actual: 591.5 MHz */ |
| 615 | { 13000000, 594000000, 91, 1, 1}, /* actual: 591.5 MHz */ | 624 | { 16800000, 594000000, 71, 1, 2}, /* actual: 596.4 MHz */ |
| 616 | { 16800000, 594000000, 71, 1, 1}, /* actual: 596.4 MHz */ | 625 | { 19200000, 594000000, 62, 1, 2}, /* actual: 595.2 MHz */ |
| 617 | { 19200000, 594000000, 62, 1, 1}, /* actual: 595.2 MHz */ | 626 | { 26000000, 594000000, 91, 2, 2}, /* actual: 591.5 MHz */ |
| 618 | { 26000000, 594000000, 91, 2, 1}, /* actual: 591.5 MHz */ | ||
| 619 | { 0, 0, 0, 0, 0, 0 }, | 627 | { 0, 0, 0, 0, 0, 0 }, |
| 620 | }; | 628 | }; |
| 621 | 629 | ||
| @@ -753,21 +761,19 @@ static struct tegra_clk tegra124_clks[tegra_clk_max] __initdata = { | |||
| 753 | [tegra_clk_rtc] = { .dt_id = TEGRA124_CLK_RTC, .present = true }, | 761 | [tegra_clk_rtc] = { .dt_id = TEGRA124_CLK_RTC, .present = true }, |
| 754 | [tegra_clk_timer] = { .dt_id = TEGRA124_CLK_TIMER, .present = true }, | 762 | [tegra_clk_timer] = { .dt_id = TEGRA124_CLK_TIMER, .present = true }, |
| 755 | [tegra_clk_uarta] = { .dt_id = TEGRA124_CLK_UARTA, .present = true }, | 763 | [tegra_clk_uarta] = { .dt_id = TEGRA124_CLK_UARTA, .present = true }, |
| 756 | [tegra_clk_sdmmc2] = { .dt_id = TEGRA124_CLK_SDMMC2, .present = true }, | 764 | [tegra_clk_sdmmc2_8] = { .dt_id = TEGRA124_CLK_SDMMC2, .present = true }, |
| 757 | [tegra_clk_i2s1] = { .dt_id = TEGRA124_CLK_I2S1, .present = true }, | 765 | [tegra_clk_i2s1] = { .dt_id = TEGRA124_CLK_I2S1, .present = true }, |
| 758 | [tegra_clk_i2c1] = { .dt_id = TEGRA124_CLK_I2C1, .present = true }, | 766 | [tegra_clk_i2c1] = { .dt_id = TEGRA124_CLK_I2C1, .present = true }, |
| 759 | [tegra_clk_ndflash] = { .dt_id = TEGRA124_CLK_NDFLASH, .present = true }, | 767 | [tegra_clk_ndflash] = { .dt_id = TEGRA124_CLK_NDFLASH, .present = true }, |
| 760 | [tegra_clk_sdmmc1] = { .dt_id = TEGRA124_CLK_SDMMC1, .present = true }, | 768 | [tegra_clk_sdmmc1_8] = { .dt_id = TEGRA124_CLK_SDMMC1, .present = true }, |
| 761 | [tegra_clk_sdmmc4] = { .dt_id = TEGRA124_CLK_SDMMC4, .present = true }, | 769 | [tegra_clk_sdmmc4_8] = { .dt_id = TEGRA124_CLK_SDMMC4, .present = true }, |
| 762 | [tegra_clk_pwm] = { .dt_id = TEGRA124_CLK_PWM, .present = true }, | 770 | [tegra_clk_pwm] = { .dt_id = TEGRA124_CLK_PWM, .present = true }, |
| 763 | [tegra_clk_i2s2] = { .dt_id = TEGRA124_CLK_I2S2, .present = true }, | 771 | [tegra_clk_i2s2] = { .dt_id = TEGRA124_CLK_I2S2, .present = true }, |
| 764 | [tegra_clk_gr2d] = { .dt_id = TEGRA124_CLK_GR_2D, .present = true }, | ||
| 765 | [tegra_clk_usbd] = { .dt_id = TEGRA124_CLK_USBD, .present = true }, | 772 | [tegra_clk_usbd] = { .dt_id = TEGRA124_CLK_USBD, .present = true }, |
| 766 | [tegra_clk_isp_8] = { .dt_id = TEGRA124_CLK_ISP, .present = true }, | 773 | [tegra_clk_isp_8] = { .dt_id = TEGRA124_CLK_ISP, .present = true }, |
| 767 | [tegra_clk_gr3d] = { .dt_id = TEGRA124_CLK_GR_3D, .present = true }, | ||
| 768 | [tegra_clk_disp2] = { .dt_id = TEGRA124_CLK_DISP2, .present = true }, | 774 | [tegra_clk_disp2] = { .dt_id = TEGRA124_CLK_DISP2, .present = true }, |
| 769 | [tegra_clk_disp1] = { .dt_id = TEGRA124_CLK_DISP1, .present = true }, | 775 | [tegra_clk_disp1] = { .dt_id = TEGRA124_CLK_DISP1, .present = true }, |
| 770 | [tegra_clk_host1x] = { .dt_id = TEGRA124_CLK_HOST1X, .present = true }, | 776 | [tegra_clk_host1x_8] = { .dt_id = TEGRA124_CLK_HOST1X, .present = true }, |
| 771 | [tegra_clk_vcp] = { .dt_id = TEGRA124_CLK_VCP, .present = true }, | 777 | [tegra_clk_vcp] = { .dt_id = TEGRA124_CLK_VCP, .present = true }, |
| 772 | [tegra_clk_i2s0] = { .dt_id = TEGRA124_CLK_I2S0, .present = true }, | 778 | [tegra_clk_i2s0] = { .dt_id = TEGRA124_CLK_I2S0, .present = true }, |
| 773 | [tegra_clk_apbdma] = { .dt_id = TEGRA124_CLK_APBDMA, .present = true }, | 779 | [tegra_clk_apbdma] = { .dt_id = TEGRA124_CLK_APBDMA, .present = true }, |
| @@ -794,7 +800,7 @@ static struct tegra_clk tegra124_clks[tegra_clk_max] __initdata = { | |||
| 794 | [tegra_clk_uartd] = { .dt_id = TEGRA124_CLK_UARTD, .present = true }, | 800 | [tegra_clk_uartd] = { .dt_id = TEGRA124_CLK_UARTD, .present = true }, |
| 795 | [tegra_clk_i2c3] = { .dt_id = TEGRA124_CLK_I2C3, .present = true }, | 801 | [tegra_clk_i2c3] = { .dt_id = TEGRA124_CLK_I2C3, .present = true }, |
| 796 | [tegra_clk_sbc4] = { .dt_id = TEGRA124_CLK_SBC4, .present = true }, | 802 | [tegra_clk_sbc4] = { .dt_id = TEGRA124_CLK_SBC4, .present = true }, |
| 797 | [tegra_clk_sdmmc3] = { .dt_id = TEGRA124_CLK_SDMMC3, .present = true }, | 803 | [tegra_clk_sdmmc3_8] = { .dt_id = TEGRA124_CLK_SDMMC3, .present = true }, |
| 798 | [tegra_clk_pcie] = { .dt_id = TEGRA124_CLK_PCIE, .present = true }, | 804 | [tegra_clk_pcie] = { .dt_id = TEGRA124_CLK_PCIE, .present = true }, |
| 799 | [tegra_clk_owr] = { .dt_id = TEGRA124_CLK_OWR, .present = true }, | 805 | [tegra_clk_owr] = { .dt_id = TEGRA124_CLK_OWR, .present = true }, |
| 800 | [tegra_clk_afi] = { .dt_id = TEGRA124_CLK_AFI, .present = true }, | 806 | [tegra_clk_afi] = { .dt_id = TEGRA124_CLK_AFI, .present = true }, |
| @@ -1286,9 +1292,9 @@ static void __init tegra124_pll_init(void __iomem *clk_base, | |||
| 1286 | clk_register_clkdev(clk, "pll_d2", NULL); | 1292 | clk_register_clkdev(clk, "pll_d2", NULL); |
| 1287 | clks[TEGRA124_CLK_PLL_D2] = clk; | 1293 | clks[TEGRA124_CLK_PLL_D2] = clk; |
| 1288 | 1294 | ||
| 1289 | /* PLLD2_OUT0 ?? */ | 1295 | /* PLLD2_OUT0 */ |
| 1290 | clk = clk_register_fixed_factor(NULL, "pll_d2_out0", "pll_d2", | 1296 | clk = clk_register_fixed_factor(NULL, "pll_d2_out0", "pll_d2", |
| 1291 | CLK_SET_RATE_PARENT, 1, 2); | 1297 | CLK_SET_RATE_PARENT, 1, 1); |
| 1292 | clk_register_clkdev(clk, "pll_d2_out0", NULL); | 1298 | clk_register_clkdev(clk, "pll_d2_out0", NULL); |
| 1293 | clks[TEGRA124_CLK_PLL_D2_OUT0] = clk; | 1299 | clks[TEGRA124_CLK_PLL_D2_OUT0] = clk; |
| 1294 | 1300 | ||
diff --git a/drivers/clk/tegra/clk-tegra20.c b/drivers/clk/tegra/clk-tegra20.c index dbace152b2fa..dace2b1b5ae6 100644 --- a/drivers/clk/tegra/clk-tegra20.c +++ b/drivers/clk/tegra/clk-tegra20.c | |||
| @@ -574,6 +574,8 @@ static struct tegra_clk tegra20_clks[tegra_clk_max] __initdata = { | |||
| 574 | [tegra_clk_tvdac] = { .dt_id = TEGRA20_CLK_TVDAC, .present = true }, | 574 | [tegra_clk_tvdac] = { .dt_id = TEGRA20_CLK_TVDAC, .present = true }, |
| 575 | [tegra_clk_vi_sensor] = { .dt_id = TEGRA20_CLK_VI_SENSOR, .present = true }, | 575 | [tegra_clk_vi_sensor] = { .dt_id = TEGRA20_CLK_VI_SENSOR, .present = true }, |
| 576 | [tegra_clk_afi] = { .dt_id = TEGRA20_CLK_AFI, .present = true }, | 576 | [tegra_clk_afi] = { .dt_id = TEGRA20_CLK_AFI, .present = true }, |
| 577 | [tegra_clk_fuse] = { .dt_id = TEGRA20_CLK_FUSE, .present = true }, | ||
| 578 | [tegra_clk_kfuse] = { .dt_id = TEGRA20_CLK_KFUSE, .present = true }, | ||
| 577 | }; | 579 | }; |
| 578 | 580 | ||
| 579 | static unsigned long tegra20_clk_measure_input_freq(void) | 581 | static unsigned long tegra20_clk_measure_input_freq(void) |
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index 08ca8c9f41cd..cb003a6b72c8 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c | |||
| @@ -1323,8 +1323,7 @@ static int __cpufreq_remove_dev_prepare(struct device *dev, | |||
| 1323 | up_read(&policy->rwsem); | 1323 | up_read(&policy->rwsem); |
| 1324 | 1324 | ||
| 1325 | if (cpu != policy->cpu) { | 1325 | if (cpu != policy->cpu) { |
| 1326 | if (!frozen) | 1326 | sysfs_remove_link(&dev->kobj, "cpufreq"); |
| 1327 | sysfs_remove_link(&dev->kobj, "cpufreq"); | ||
| 1328 | } else if (cpus > 1) { | 1327 | } else if (cpus > 1) { |
| 1329 | new_cpu = cpufreq_nominate_new_policy_cpu(policy, cpu); | 1328 | new_cpu = cpufreq_nominate_new_policy_cpu(policy, cpu); |
| 1330 | if (new_cpu >= 0) { | 1329 | if (new_cpu >= 0) { |
diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c index c788abf1c457..2cd36b9297f3 100644 --- a/drivers/cpufreq/intel_pstate.c +++ b/drivers/cpufreq/intel_pstate.c | |||
| @@ -34,12 +34,15 @@ | |||
| 34 | 34 | ||
| 35 | #define SAMPLE_COUNT 3 | 35 | #define SAMPLE_COUNT 3 |
| 36 | 36 | ||
| 37 | #define BYT_RATIOS 0x66a | 37 | #define BYT_RATIOS 0x66a |
| 38 | #define BYT_VIDS 0x66b | 38 | #define BYT_VIDS 0x66b |
| 39 | #define BYT_TURBO_RATIOS 0x66c | ||
| 39 | 40 | ||
| 40 | #define FRAC_BITS 8 | 41 | |
| 42 | #define FRAC_BITS 6 | ||
| 41 | #define int_tofp(X) ((int64_t)(X) << FRAC_BITS) | 43 | #define int_tofp(X) ((int64_t)(X) << FRAC_BITS) |
| 42 | #define fp_toint(X) ((X) >> FRAC_BITS) | 44 | #define fp_toint(X) ((X) >> FRAC_BITS) |
| 45 | #define FP_ROUNDUP(X) ((X) += 1 << FRAC_BITS) | ||
| 43 | 46 | ||
| 44 | static inline int32_t mul_fp(int32_t x, int32_t y) | 47 | static inline int32_t mul_fp(int32_t x, int32_t y) |
| 45 | { | 48 | { |
| @@ -357,7 +360,7 @@ static int byt_get_min_pstate(void) | |||
| 357 | { | 360 | { |
| 358 | u64 value; | 361 | u64 value; |
| 359 | rdmsrl(BYT_RATIOS, value); | 362 | rdmsrl(BYT_RATIOS, value); |
| 360 | return value & 0xFF; | 363 | return (value >> 8) & 0xFF; |
| 361 | } | 364 | } |
| 362 | 365 | ||
| 363 | static int byt_get_max_pstate(void) | 366 | static int byt_get_max_pstate(void) |
| @@ -367,6 +370,13 @@ static int byt_get_max_pstate(void) | |||
| 367 | return (value >> 16) & 0xFF; | 370 | return (value >> 16) & 0xFF; |
| 368 | } | 371 | } |
| 369 | 372 | ||
| 373 | static int byt_get_turbo_pstate(void) | ||
| 374 | { | ||
| 375 | u64 value; | ||
| 376 | rdmsrl(BYT_TURBO_RATIOS, value); | ||
| 377 | return value & 0x3F; | ||
| 378 | } | ||
| 379 | |||
| 370 | static void byt_set_pstate(struct cpudata *cpudata, int pstate) | 380 | static void byt_set_pstate(struct cpudata *cpudata, int pstate) |
| 371 | { | 381 | { |
| 372 | u64 val; | 382 | u64 val; |
| @@ -469,7 +479,7 @@ static struct cpu_defaults byt_params = { | |||
| 469 | .funcs = { | 479 | .funcs = { |
| 470 | .get_max = byt_get_max_pstate, | 480 | .get_max = byt_get_max_pstate, |
| 471 | .get_min = byt_get_min_pstate, | 481 | .get_min = byt_get_min_pstate, |
| 472 | .get_turbo = byt_get_max_pstate, | 482 | .get_turbo = byt_get_turbo_pstate, |
| 473 | .set = byt_set_pstate, | 483 | .set = byt_set_pstate, |
| 474 | .get_vid = byt_get_vid, | 484 | .get_vid = byt_get_vid, |
| 475 | }, | 485 | }, |
| @@ -547,18 +557,20 @@ static void intel_pstate_get_cpu_pstates(struct cpudata *cpu) | |||
| 547 | static inline void intel_pstate_calc_busy(struct cpudata *cpu, | 557 | static inline void intel_pstate_calc_busy(struct cpudata *cpu, |
| 548 | struct sample *sample) | 558 | struct sample *sample) |
| 549 | { | 559 | { |
| 550 | u64 core_pct; | 560 | int32_t core_pct; |
| 551 | u64 c0_pct; | 561 | int32_t c0_pct; |
| 552 | 562 | ||
| 553 | core_pct = div64_u64(sample->aperf * 100, sample->mperf); | 563 | core_pct = div_fp(int_tofp((sample->aperf)), |
| 564 | int_tofp((sample->mperf))); | ||
| 565 | core_pct = mul_fp(core_pct, int_tofp(100)); | ||
| 566 | FP_ROUNDUP(core_pct); | ||
| 567 | |||
| 568 | c0_pct = div_fp(int_tofp(sample->mperf), int_tofp(sample->tsc)); | ||
| 554 | 569 | ||
| 555 | c0_pct = div64_u64(sample->mperf * 100, sample->tsc); | ||
| 556 | sample->freq = fp_toint( | 570 | sample->freq = fp_toint( |
| 557 | mul_fp(int_tofp(cpu->pstate.max_pstate), | 571 | mul_fp(int_tofp(cpu->pstate.max_pstate * 1000), core_pct)); |
| 558 | int_tofp(core_pct * 1000))); | ||
| 559 | 572 | ||
| 560 | sample->core_pct_busy = mul_fp(int_tofp(core_pct), | 573 | sample->core_pct_busy = mul_fp(core_pct, c0_pct); |
| 561 | div_fp(int_tofp(c0_pct + 1), int_tofp(100))); | ||
| 562 | } | 574 | } |
| 563 | 575 | ||
| 564 | static inline void intel_pstate_sample(struct cpudata *cpu) | 576 | static inline void intel_pstate_sample(struct cpudata *cpu) |
| @@ -570,6 +582,10 @@ static inline void intel_pstate_sample(struct cpudata *cpu) | |||
| 570 | rdmsrl(MSR_IA32_MPERF, mperf); | 582 | rdmsrl(MSR_IA32_MPERF, mperf); |
| 571 | tsc = native_read_tsc(); | 583 | tsc = native_read_tsc(); |
| 572 | 584 | ||
| 585 | aperf = aperf >> FRAC_BITS; | ||
| 586 | mperf = mperf >> FRAC_BITS; | ||
| 587 | tsc = tsc >> FRAC_BITS; | ||
| 588 | |||
| 573 | cpu->sample_ptr = (cpu->sample_ptr + 1) % SAMPLE_COUNT; | 589 | cpu->sample_ptr = (cpu->sample_ptr + 1) % SAMPLE_COUNT; |
| 574 | cpu->samples[cpu->sample_ptr].aperf = aperf; | 590 | cpu->samples[cpu->sample_ptr].aperf = aperf; |
| 575 | cpu->samples[cpu->sample_ptr].mperf = mperf; | 591 | cpu->samples[cpu->sample_ptr].mperf = mperf; |
| @@ -601,7 +617,8 @@ static inline int32_t intel_pstate_get_scaled_busy(struct cpudata *cpu) | |||
| 601 | core_busy = cpu->samples[cpu->sample_ptr].core_pct_busy; | 617 | core_busy = cpu->samples[cpu->sample_ptr].core_pct_busy; |
| 602 | max_pstate = int_tofp(cpu->pstate.max_pstate); | 618 | max_pstate = int_tofp(cpu->pstate.max_pstate); |
| 603 | current_pstate = int_tofp(cpu->pstate.current_pstate); | 619 | current_pstate = int_tofp(cpu->pstate.current_pstate); |
| 604 | return mul_fp(core_busy, div_fp(max_pstate, current_pstate)); | 620 | core_busy = mul_fp(core_busy, div_fp(max_pstate, current_pstate)); |
| 621 | return FP_ROUNDUP(core_busy); | ||
| 605 | } | 622 | } |
| 606 | 623 | ||
| 607 | static inline void intel_pstate_adjust_busy_pstate(struct cpudata *cpu) | 624 | static inline void intel_pstate_adjust_busy_pstate(struct cpudata *cpu) |
diff --git a/drivers/cpufreq/powernow-k8.c b/drivers/cpufreq/powernow-k8.c index e10b646634d7..6684e0342792 100644 --- a/drivers/cpufreq/powernow-k8.c +++ b/drivers/cpufreq/powernow-k8.c | |||
| @@ -1076,7 +1076,7 @@ static int powernowk8_cpu_init(struct cpufreq_policy *pol) | |||
| 1076 | { | 1076 | { |
| 1077 | struct powernow_k8_data *data; | 1077 | struct powernow_k8_data *data; |
| 1078 | struct init_on_cpu init_on_cpu; | 1078 | struct init_on_cpu init_on_cpu; |
| 1079 | int rc; | 1079 | int rc, cpu; |
| 1080 | 1080 | ||
| 1081 | smp_call_function_single(pol->cpu, check_supported_cpu, &rc, 1); | 1081 | smp_call_function_single(pol->cpu, check_supported_cpu, &rc, 1); |
| 1082 | if (rc) | 1082 | if (rc) |
| @@ -1140,7 +1140,9 @@ static int powernowk8_cpu_init(struct cpufreq_policy *pol) | |||
| 1140 | pr_debug("cpu_init done, current fid 0x%x, vid 0x%x\n", | 1140 | pr_debug("cpu_init done, current fid 0x%x, vid 0x%x\n", |
| 1141 | data->currfid, data->currvid); | 1141 | data->currfid, data->currvid); |
| 1142 | 1142 | ||
| 1143 | per_cpu(powernow_data, pol->cpu) = data; | 1143 | /* Point all the CPUs in this policy to the same data */ |
| 1144 | for_each_cpu(cpu, pol->cpus) | ||
| 1145 | per_cpu(powernow_data, cpu) = data; | ||
| 1144 | 1146 | ||
| 1145 | return 0; | 1147 | return 0; |
| 1146 | 1148 | ||
| @@ -1155,6 +1157,7 @@ err_out: | |||
| 1155 | static int powernowk8_cpu_exit(struct cpufreq_policy *pol) | 1157 | static int powernowk8_cpu_exit(struct cpufreq_policy *pol) |
| 1156 | { | 1158 | { |
| 1157 | struct powernow_k8_data *data = per_cpu(powernow_data, pol->cpu); | 1159 | struct powernow_k8_data *data = per_cpu(powernow_data, pol->cpu); |
| 1160 | int cpu; | ||
| 1158 | 1161 | ||
| 1159 | if (!data) | 1162 | if (!data) |
| 1160 | return -EINVAL; | 1163 | return -EINVAL; |
| @@ -1165,7 +1168,8 @@ static int powernowk8_cpu_exit(struct cpufreq_policy *pol) | |||
| 1165 | 1168 | ||
| 1166 | kfree(data->powernow_table); | 1169 | kfree(data->powernow_table); |
| 1167 | kfree(data); | 1170 | kfree(data); |
| 1168 | per_cpu(powernow_data, pol->cpu) = NULL; | 1171 | for_each_cpu(cpu, pol->cpus) |
| 1172 | per_cpu(powernow_data, cpu) = NULL; | ||
| 1169 | 1173 | ||
| 1170 | return 0; | 1174 | return 0; |
| 1171 | } | 1175 | } |
diff --git a/drivers/dma/imx-sdma.c b/drivers/dma/imx-sdma.c index 4e7918339b12..19041cefabb1 100644 --- a/drivers/dma/imx-sdma.c +++ b/drivers/dma/imx-sdma.c | |||
| @@ -449,6 +449,7 @@ static const struct of_device_id sdma_dt_ids[] = { | |||
| 449 | { .compatible = "fsl,imx51-sdma", .data = &sdma_imx51, }, | 449 | { .compatible = "fsl,imx51-sdma", .data = &sdma_imx51, }, |
| 450 | { .compatible = "fsl,imx35-sdma", .data = &sdma_imx35, }, | 450 | { .compatible = "fsl,imx35-sdma", .data = &sdma_imx35, }, |
| 451 | { .compatible = "fsl,imx31-sdma", .data = &sdma_imx31, }, | 451 | { .compatible = "fsl,imx31-sdma", .data = &sdma_imx31, }, |
| 452 | { .compatible = "fsl,imx25-sdma", .data = &sdma_imx25, }, | ||
| 452 | { /* sentinel */ } | 453 | { /* sentinel */ } |
| 453 | }; | 454 | }; |
| 454 | MODULE_DEVICE_TABLE(of, sdma_dt_ids); | 455 | MODULE_DEVICE_TABLE(of, sdma_dt_ids); |
diff --git a/drivers/dma/ioat/dma.c b/drivers/dma/ioat/dma.c index 87529181efcc..4e3549a16132 100644 --- a/drivers/dma/ioat/dma.c +++ b/drivers/dma/ioat/dma.c | |||
| @@ -77,7 +77,8 @@ static irqreturn_t ioat_dma_do_interrupt(int irq, void *data) | |||
| 77 | attnstatus = readl(instance->reg_base + IOAT_ATTNSTATUS_OFFSET); | 77 | attnstatus = readl(instance->reg_base + IOAT_ATTNSTATUS_OFFSET); |
| 78 | for_each_set_bit(bit, &attnstatus, BITS_PER_LONG) { | 78 | for_each_set_bit(bit, &attnstatus, BITS_PER_LONG) { |
| 79 | chan = ioat_chan_by_index(instance, bit); | 79 | chan = ioat_chan_by_index(instance, bit); |
| 80 | tasklet_schedule(&chan->cleanup_task); | 80 | if (test_bit(IOAT_RUN, &chan->state)) |
| 81 | tasklet_schedule(&chan->cleanup_task); | ||
| 81 | } | 82 | } |
| 82 | 83 | ||
| 83 | writeb(intrctrl, instance->reg_base + IOAT_INTRCTRL_OFFSET); | 84 | writeb(intrctrl, instance->reg_base + IOAT_INTRCTRL_OFFSET); |
| @@ -93,7 +94,8 @@ static irqreturn_t ioat_dma_do_interrupt_msix(int irq, void *data) | |||
| 93 | { | 94 | { |
| 94 | struct ioat_chan_common *chan = data; | 95 | struct ioat_chan_common *chan = data; |
| 95 | 96 | ||
| 96 | tasklet_schedule(&chan->cleanup_task); | 97 | if (test_bit(IOAT_RUN, &chan->state)) |
| 98 | tasklet_schedule(&chan->cleanup_task); | ||
| 97 | 99 | ||
| 98 | return IRQ_HANDLED; | 100 | return IRQ_HANDLED; |
| 99 | } | 101 | } |
| @@ -116,7 +118,6 @@ void ioat_init_channel(struct ioatdma_device *device, struct ioat_chan_common *c | |||
| 116 | chan->timer.function = device->timer_fn; | 118 | chan->timer.function = device->timer_fn; |
| 117 | chan->timer.data = data; | 119 | chan->timer.data = data; |
| 118 | tasklet_init(&chan->cleanup_task, device->cleanup_fn, data); | 120 | tasklet_init(&chan->cleanup_task, device->cleanup_fn, data); |
| 119 | tasklet_disable(&chan->cleanup_task); | ||
| 120 | } | 121 | } |
| 121 | 122 | ||
| 122 | /** | 123 | /** |
| @@ -354,13 +355,49 @@ static int ioat1_dma_alloc_chan_resources(struct dma_chan *c) | |||
| 354 | writel(((u64) chan->completion_dma) >> 32, | 355 | writel(((u64) chan->completion_dma) >> 32, |
| 355 | chan->reg_base + IOAT_CHANCMP_OFFSET_HIGH); | 356 | chan->reg_base + IOAT_CHANCMP_OFFSET_HIGH); |
| 356 | 357 | ||
| 357 | tasklet_enable(&chan->cleanup_task); | 358 | set_bit(IOAT_RUN, &chan->state); |
| 358 | ioat1_dma_start_null_desc(ioat); /* give chain to dma device */ | 359 | ioat1_dma_start_null_desc(ioat); /* give chain to dma device */ |
| 359 | dev_dbg(to_dev(chan), "%s: allocated %d descriptors\n", | 360 | dev_dbg(to_dev(chan), "%s: allocated %d descriptors\n", |
| 360 | __func__, ioat->desccount); | 361 | __func__, ioat->desccount); |
| 361 | return ioat->desccount; | 362 | return ioat->desccount; |
| 362 | } | 363 | } |
| 363 | 364 | ||
| 365 | void ioat_stop(struct ioat_chan_common *chan) | ||
| 366 | { | ||
| 367 | struct ioatdma_device *device = chan->device; | ||
| 368 | struct pci_dev *pdev = device->pdev; | ||
| 369 | int chan_id = chan_num(chan); | ||
| 370 | struct msix_entry *msix; | ||
| 371 | |||
| 372 | /* 1/ stop irq from firing tasklets | ||
| 373 | * 2/ stop the tasklet from re-arming irqs | ||
| 374 | */ | ||
| 375 | clear_bit(IOAT_RUN, &chan->state); | ||
| 376 | |||
| 377 | /* flush inflight interrupts */ | ||
| 378 | switch (device->irq_mode) { | ||
| 379 | case IOAT_MSIX: | ||
| 380 | msix = &device->msix_entries[chan_id]; | ||
| 381 | synchronize_irq(msix->vector); | ||
| 382 | break; | ||
| 383 | case IOAT_MSI: | ||
| 384 | case IOAT_INTX: | ||
| 385 | synchronize_irq(pdev->irq); | ||
| 386 | break; | ||
| 387 | default: | ||
| 388 | break; | ||
| 389 | } | ||
| 390 | |||
| 391 | /* flush inflight timers */ | ||
| 392 | del_timer_sync(&chan->timer); | ||
| 393 | |||
| 394 | /* flush inflight tasklet runs */ | ||
| 395 | tasklet_kill(&chan->cleanup_task); | ||
| 396 | |||
| 397 | /* final cleanup now that everything is quiesced and can't re-arm */ | ||
| 398 | device->cleanup_fn((unsigned long) &chan->common); | ||
| 399 | } | ||
| 400 | |||
| 364 | /** | 401 | /** |
| 365 | * ioat1_dma_free_chan_resources - release all the descriptors | 402 | * ioat1_dma_free_chan_resources - release all the descriptors |
| 366 | * @chan: the channel to be cleaned | 403 | * @chan: the channel to be cleaned |
| @@ -379,9 +416,7 @@ static void ioat1_dma_free_chan_resources(struct dma_chan *c) | |||
| 379 | if (ioat->desccount == 0) | 416 | if (ioat->desccount == 0) |
| 380 | return; | 417 | return; |
| 381 | 418 | ||
| 382 | tasklet_disable(&chan->cleanup_task); | 419 | ioat_stop(chan); |
| 383 | del_timer_sync(&chan->timer); | ||
| 384 | ioat1_cleanup(ioat); | ||
| 385 | 420 | ||
| 386 | /* Delay 100ms after reset to allow internal DMA logic to quiesce | 421 | /* Delay 100ms after reset to allow internal DMA logic to quiesce |
| 387 | * before removing DMA descriptor resources. | 422 | * before removing DMA descriptor resources. |
| @@ -526,8 +561,11 @@ ioat1_dma_prep_memcpy(struct dma_chan *c, dma_addr_t dma_dest, | |||
| 526 | static void ioat1_cleanup_event(unsigned long data) | 561 | static void ioat1_cleanup_event(unsigned long data) |
| 527 | { | 562 | { |
| 528 | struct ioat_dma_chan *ioat = to_ioat_chan((void *) data); | 563 | struct ioat_dma_chan *ioat = to_ioat_chan((void *) data); |
| 564 | struct ioat_chan_common *chan = &ioat->base; | ||
| 529 | 565 | ||
| 530 | ioat1_cleanup(ioat); | 566 | ioat1_cleanup(ioat); |
| 567 | if (!test_bit(IOAT_RUN, &chan->state)) | ||
| 568 | return; | ||
| 531 | writew(IOAT_CHANCTRL_RUN, ioat->base.reg_base + IOAT_CHANCTRL_OFFSET); | 569 | writew(IOAT_CHANCTRL_RUN, ioat->base.reg_base + IOAT_CHANCTRL_OFFSET); |
| 532 | } | 570 | } |
| 533 | 571 | ||
diff --git a/drivers/dma/ioat/dma.h b/drivers/dma/ioat/dma.h index 11fb877ddca9..e982f00a9843 100644 --- a/drivers/dma/ioat/dma.h +++ b/drivers/dma/ioat/dma.h | |||
| @@ -356,6 +356,7 @@ bool ioat_cleanup_preamble(struct ioat_chan_common *chan, | |||
| 356 | void ioat_kobject_add(struct ioatdma_device *device, struct kobj_type *type); | 356 | void ioat_kobject_add(struct ioatdma_device *device, struct kobj_type *type); |
| 357 | void ioat_kobject_del(struct ioatdma_device *device); | 357 | void ioat_kobject_del(struct ioatdma_device *device); |
| 358 | int ioat_dma_setup_interrupts(struct ioatdma_device *device); | 358 | int ioat_dma_setup_interrupts(struct ioatdma_device *device); |
| 359 | void ioat_stop(struct ioat_chan_common *chan); | ||
| 359 | extern const struct sysfs_ops ioat_sysfs_ops; | 360 | extern const struct sysfs_ops ioat_sysfs_ops; |
| 360 | extern struct ioat_sysfs_entry ioat_version_attr; | 361 | extern struct ioat_sysfs_entry ioat_version_attr; |
| 361 | extern struct ioat_sysfs_entry ioat_cap_attr; | 362 | extern struct ioat_sysfs_entry ioat_cap_attr; |
diff --git a/drivers/dma/ioat/dma_v2.c b/drivers/dma/ioat/dma_v2.c index 5d3affe7e976..8d1058085eeb 100644 --- a/drivers/dma/ioat/dma_v2.c +++ b/drivers/dma/ioat/dma_v2.c | |||
| @@ -190,8 +190,11 @@ static void ioat2_cleanup(struct ioat2_dma_chan *ioat) | |||
| 190 | void ioat2_cleanup_event(unsigned long data) | 190 | void ioat2_cleanup_event(unsigned long data) |
| 191 | { | 191 | { |
| 192 | struct ioat2_dma_chan *ioat = to_ioat2_chan((void *) data); | 192 | struct ioat2_dma_chan *ioat = to_ioat2_chan((void *) data); |
| 193 | struct ioat_chan_common *chan = &ioat->base; | ||
| 193 | 194 | ||
| 194 | ioat2_cleanup(ioat); | 195 | ioat2_cleanup(ioat); |
| 196 | if (!test_bit(IOAT_RUN, &chan->state)) | ||
| 197 | return; | ||
| 195 | writew(IOAT_CHANCTRL_RUN, ioat->base.reg_base + IOAT_CHANCTRL_OFFSET); | 198 | writew(IOAT_CHANCTRL_RUN, ioat->base.reg_base + IOAT_CHANCTRL_OFFSET); |
| 196 | } | 199 | } |
| 197 | 200 | ||
| @@ -553,10 +556,10 @@ int ioat2_alloc_chan_resources(struct dma_chan *c) | |||
| 553 | ioat->issued = 0; | 556 | ioat->issued = 0; |
| 554 | ioat->tail = 0; | 557 | ioat->tail = 0; |
| 555 | ioat->alloc_order = order; | 558 | ioat->alloc_order = order; |
| 559 | set_bit(IOAT_RUN, &chan->state); | ||
| 556 | spin_unlock_bh(&ioat->prep_lock); | 560 | spin_unlock_bh(&ioat->prep_lock); |
| 557 | spin_unlock_bh(&chan->cleanup_lock); | 561 | spin_unlock_bh(&chan->cleanup_lock); |
| 558 | 562 | ||
| 559 | tasklet_enable(&chan->cleanup_task); | ||
| 560 | ioat2_start_null_desc(ioat); | 563 | ioat2_start_null_desc(ioat); |
| 561 | 564 | ||
| 562 | /* check that we got off the ground */ | 565 | /* check that we got off the ground */ |
| @@ -566,7 +569,6 @@ int ioat2_alloc_chan_resources(struct dma_chan *c) | |||
| 566 | } while (i++ < 20 && !is_ioat_active(status) && !is_ioat_idle(status)); | 569 | } while (i++ < 20 && !is_ioat_active(status) && !is_ioat_idle(status)); |
| 567 | 570 | ||
| 568 | if (is_ioat_active(status) || is_ioat_idle(status)) { | 571 | if (is_ioat_active(status) || is_ioat_idle(status)) { |
| 569 | set_bit(IOAT_RUN, &chan->state); | ||
| 570 | return 1 << ioat->alloc_order; | 572 | return 1 << ioat->alloc_order; |
| 571 | } else { | 573 | } else { |
| 572 | u32 chanerr = readl(chan->reg_base + IOAT_CHANERR_OFFSET); | 574 | u32 chanerr = readl(chan->reg_base + IOAT_CHANERR_OFFSET); |
| @@ -809,11 +811,8 @@ void ioat2_free_chan_resources(struct dma_chan *c) | |||
| 809 | if (!ioat->ring) | 811 | if (!ioat->ring) |
| 810 | return; | 812 | return; |
| 811 | 813 | ||
| 812 | tasklet_disable(&chan->cleanup_task); | 814 | ioat_stop(chan); |
| 813 | del_timer_sync(&chan->timer); | ||
| 814 | device->cleanup_fn((unsigned long) c); | ||
| 815 | device->reset_hw(chan); | 815 | device->reset_hw(chan); |
| 816 | clear_bit(IOAT_RUN, &chan->state); | ||
| 817 | 816 | ||
| 818 | spin_lock_bh(&chan->cleanup_lock); | 817 | spin_lock_bh(&chan->cleanup_lock); |
| 819 | spin_lock_bh(&ioat->prep_lock); | 818 | spin_lock_bh(&ioat->prep_lock); |
diff --git a/drivers/dma/ioat/dma_v3.c b/drivers/dma/ioat/dma_v3.c index 820817e97e62..b9b38a1cf92f 100644 --- a/drivers/dma/ioat/dma_v3.c +++ b/drivers/dma/ioat/dma_v3.c | |||
| @@ -464,8 +464,11 @@ static void ioat3_cleanup(struct ioat2_dma_chan *ioat) | |||
| 464 | static void ioat3_cleanup_event(unsigned long data) | 464 | static void ioat3_cleanup_event(unsigned long data) |
| 465 | { | 465 | { |
| 466 | struct ioat2_dma_chan *ioat = to_ioat2_chan((void *) data); | 466 | struct ioat2_dma_chan *ioat = to_ioat2_chan((void *) data); |
| 467 | struct ioat_chan_common *chan = &ioat->base; | ||
| 467 | 468 | ||
| 468 | ioat3_cleanup(ioat); | 469 | ioat3_cleanup(ioat); |
| 470 | if (!test_bit(IOAT_RUN, &chan->state)) | ||
| 471 | return; | ||
| 469 | writew(IOAT_CHANCTRL_RUN, ioat->base.reg_base + IOAT_CHANCTRL_OFFSET); | 472 | writew(IOAT_CHANCTRL_RUN, ioat->base.reg_base + IOAT_CHANCTRL_OFFSET); |
| 470 | } | 473 | } |
| 471 | 474 | ||
diff --git a/drivers/dma/ste_dma40.c b/drivers/dma/ste_dma40.c index 00a2de957b23..bf18c786ed40 100644 --- a/drivers/dma/ste_dma40.c +++ b/drivers/dma/ste_dma40.c | |||
| @@ -1641,6 +1641,7 @@ static void dma_tasklet(unsigned long data) | |||
| 1641 | struct d40_chan *d40c = (struct d40_chan *) data; | 1641 | struct d40_chan *d40c = (struct d40_chan *) data; |
| 1642 | struct d40_desc *d40d; | 1642 | struct d40_desc *d40d; |
| 1643 | unsigned long flags; | 1643 | unsigned long flags; |
| 1644 | bool callback_active; | ||
| 1644 | dma_async_tx_callback callback; | 1645 | dma_async_tx_callback callback; |
| 1645 | void *callback_param; | 1646 | void *callback_param; |
| 1646 | 1647 | ||
| @@ -1668,6 +1669,7 @@ static void dma_tasklet(unsigned long data) | |||
| 1668 | } | 1669 | } |
| 1669 | 1670 | ||
| 1670 | /* Callback to client */ | 1671 | /* Callback to client */ |
| 1672 | callback_active = !!(d40d->txd.flags & DMA_PREP_INTERRUPT); | ||
| 1671 | callback = d40d->txd.callback; | 1673 | callback = d40d->txd.callback; |
| 1672 | callback_param = d40d->txd.callback_param; | 1674 | callback_param = d40d->txd.callback_param; |
| 1673 | 1675 | ||
| @@ -1690,7 +1692,7 @@ static void dma_tasklet(unsigned long data) | |||
| 1690 | 1692 | ||
| 1691 | spin_unlock_irqrestore(&d40c->lock, flags); | 1693 | spin_unlock_irqrestore(&d40c->lock, flags); |
| 1692 | 1694 | ||
| 1693 | if (callback && (d40d->txd.flags & DMA_PREP_INTERRUPT)) | 1695 | if (callback_active && callback) |
| 1694 | callback(callback_param); | 1696 | callback(callback_param); |
| 1695 | 1697 | ||
| 1696 | return; | 1698 | return; |
diff --git a/drivers/edac/i7300_edac.c b/drivers/edac/i7300_edac.c index d63f4798f7d0..57e96a3350f0 100644 --- a/drivers/edac/i7300_edac.c +++ b/drivers/edac/i7300_edac.c | |||
| @@ -943,33 +943,35 @@ static int i7300_get_devices(struct mem_ctl_info *mci) | |||
| 943 | 943 | ||
| 944 | /* Attempt to 'get' the MCH register we want */ | 944 | /* Attempt to 'get' the MCH register we want */ |
| 945 | pdev = NULL; | 945 | pdev = NULL; |
| 946 | while (!pvt->pci_dev_16_1_fsb_addr_map || | 946 | while ((pdev = pci_get_device(PCI_VENDOR_ID_INTEL, |
| 947 | !pvt->pci_dev_16_2_fsb_err_regs) { | 947 | PCI_DEVICE_ID_INTEL_I7300_MCH_ERR, |
| 948 | pdev = pci_get_device(PCI_VENDOR_ID_INTEL, | 948 | pdev))) { |
| 949 | PCI_DEVICE_ID_INTEL_I7300_MCH_ERR, pdev); | ||
| 950 | if (!pdev) { | ||
| 951 | /* End of list, leave */ | ||
| 952 | i7300_printk(KERN_ERR, | ||
| 953 | "'system address,Process Bus' " | ||
| 954 | "device not found:" | ||
| 955 | "vendor 0x%x device 0x%x ERR funcs " | ||
| 956 | "(broken BIOS?)\n", | ||
| 957 | PCI_VENDOR_ID_INTEL, | ||
| 958 | PCI_DEVICE_ID_INTEL_I7300_MCH_ERR); | ||
| 959 | goto error; | ||
| 960 | } | ||
| 961 | |||
| 962 | /* Store device 16 funcs 1 and 2 */ | 949 | /* Store device 16 funcs 1 and 2 */ |
| 963 | switch (PCI_FUNC(pdev->devfn)) { | 950 | switch (PCI_FUNC(pdev->devfn)) { |
| 964 | case 1: | 951 | case 1: |
| 965 | pvt->pci_dev_16_1_fsb_addr_map = pdev; | 952 | if (!pvt->pci_dev_16_1_fsb_addr_map) |
| 953 | pvt->pci_dev_16_1_fsb_addr_map = | ||
| 954 | pci_dev_get(pdev); | ||
| 966 | break; | 955 | break; |
| 967 | case 2: | 956 | case 2: |
| 968 | pvt->pci_dev_16_2_fsb_err_regs = pdev; | 957 | if (!pvt->pci_dev_16_2_fsb_err_regs) |
| 958 | pvt->pci_dev_16_2_fsb_err_regs = | ||
| 959 | pci_dev_get(pdev); | ||
| 969 | break; | 960 | break; |
| 970 | } | 961 | } |
| 971 | } | 962 | } |
| 972 | 963 | ||
| 964 | if (!pvt->pci_dev_16_1_fsb_addr_map || | ||
| 965 | !pvt->pci_dev_16_2_fsb_err_regs) { | ||
| 966 | /* At least one device was not found */ | ||
| 967 | i7300_printk(KERN_ERR, | ||
| 968 | "'system address,Process Bus' device not found:" | ||
| 969 | "vendor 0x%x device 0x%x ERR funcs (broken BIOS?)\n", | ||
| 970 | PCI_VENDOR_ID_INTEL, | ||
| 971 | PCI_DEVICE_ID_INTEL_I7300_MCH_ERR); | ||
| 972 | goto error; | ||
| 973 | } | ||
| 974 | |||
| 973 | edac_dbg(1, "System Address, processor bus- PCI Bus ID: %s %x:%x\n", | 975 | edac_dbg(1, "System Address, processor bus- PCI Bus ID: %s %x:%x\n", |
| 974 | pci_name(pvt->pci_dev_16_0_fsb_ctlr), | 976 | pci_name(pvt->pci_dev_16_0_fsb_ctlr), |
| 975 | pvt->pci_dev_16_0_fsb_ctlr->vendor, | 977 | pvt->pci_dev_16_0_fsb_ctlr->vendor, |
diff --git a/drivers/edac/i7core_edac.c b/drivers/edac/i7core_edac.c index 87533ca7752e..d871275196f6 100644 --- a/drivers/edac/i7core_edac.c +++ b/drivers/edac/i7core_edac.c | |||
| @@ -1334,14 +1334,19 @@ static int i7core_get_onedevice(struct pci_dev **prev, | |||
| 1334 | * is at addr 8086:2c40, instead of 8086:2c41. So, we need | 1334 | * is at addr 8086:2c40, instead of 8086:2c41. So, we need |
| 1335 | * to probe for the alternate address in case of failure | 1335 | * to probe for the alternate address in case of failure |
| 1336 | */ | 1336 | */ |
| 1337 | if (dev_descr->dev_id == PCI_DEVICE_ID_INTEL_I7_NONCORE && !pdev) | 1337 | if (dev_descr->dev_id == PCI_DEVICE_ID_INTEL_I7_NONCORE && !pdev) { |
| 1338 | pci_dev_get(*prev); /* pci_get_device will put it */ | ||
| 1338 | pdev = pci_get_device(PCI_VENDOR_ID_INTEL, | 1339 | pdev = pci_get_device(PCI_VENDOR_ID_INTEL, |
| 1339 | PCI_DEVICE_ID_INTEL_I7_NONCORE_ALT, *prev); | 1340 | PCI_DEVICE_ID_INTEL_I7_NONCORE_ALT, *prev); |
| 1341 | } | ||
| 1340 | 1342 | ||
| 1341 | if (dev_descr->dev_id == PCI_DEVICE_ID_INTEL_LYNNFIELD_NONCORE && !pdev) | 1343 | if (dev_descr->dev_id == PCI_DEVICE_ID_INTEL_LYNNFIELD_NONCORE && |
| 1344 | !pdev) { | ||
| 1345 | pci_dev_get(*prev); /* pci_get_device will put it */ | ||
| 1342 | pdev = pci_get_device(PCI_VENDOR_ID_INTEL, | 1346 | pdev = pci_get_device(PCI_VENDOR_ID_INTEL, |
| 1343 | PCI_DEVICE_ID_INTEL_LYNNFIELD_NONCORE_ALT, | 1347 | PCI_DEVICE_ID_INTEL_LYNNFIELD_NONCORE_ALT, |
| 1344 | *prev); | 1348 | *prev); |
| 1349 | } | ||
| 1345 | 1350 | ||
| 1346 | if (!pdev) { | 1351 | if (!pdev) { |
| 1347 | if (*prev) { | 1352 | if (*prev) { |
diff --git a/drivers/extcon/extcon-arizona.c b/drivers/extcon/extcon-arizona.c index c20602f601ee..98a14f6143a7 100644 --- a/drivers/extcon/extcon-arizona.c +++ b/drivers/extcon/extcon-arizona.c | |||
| @@ -222,27 +222,19 @@ static void arizona_extcon_pulse_micbias(struct arizona_extcon_info *info) | |||
| 222 | struct snd_soc_dapm_context *dapm = arizona->dapm; | 222 | struct snd_soc_dapm_context *dapm = arizona->dapm; |
| 223 | int ret; | 223 | int ret; |
| 224 | 224 | ||
| 225 | mutex_lock(&dapm->card->dapm_mutex); | ||
| 226 | |||
| 227 | ret = snd_soc_dapm_force_enable_pin(dapm, widget); | 225 | ret = snd_soc_dapm_force_enable_pin(dapm, widget); |
| 228 | if (ret != 0) | 226 | if (ret != 0) |
| 229 | dev_warn(arizona->dev, "Failed to enable %s: %d\n", | 227 | dev_warn(arizona->dev, "Failed to enable %s: %d\n", |
| 230 | widget, ret); | 228 | widget, ret); |
| 231 | 229 | ||
| 232 | mutex_unlock(&dapm->card->dapm_mutex); | ||
| 233 | |||
| 234 | snd_soc_dapm_sync(dapm); | 230 | snd_soc_dapm_sync(dapm); |
| 235 | 231 | ||
| 236 | if (!arizona->pdata.micd_force_micbias) { | 232 | if (!arizona->pdata.micd_force_micbias) { |
| 237 | mutex_lock(&dapm->card->dapm_mutex); | ||
| 238 | |||
| 239 | ret = snd_soc_dapm_disable_pin(arizona->dapm, widget); | 233 | ret = snd_soc_dapm_disable_pin(arizona->dapm, widget); |
| 240 | if (ret != 0) | 234 | if (ret != 0) |
| 241 | dev_warn(arizona->dev, "Failed to disable %s: %d\n", | 235 | dev_warn(arizona->dev, "Failed to disable %s: %d\n", |
| 242 | widget, ret); | 236 | widget, ret); |
| 243 | 237 | ||
| 244 | mutex_unlock(&dapm->card->dapm_mutex); | ||
| 245 | |||
| 246 | snd_soc_dapm_sync(dapm); | 238 | snd_soc_dapm_sync(dapm); |
| 247 | } | 239 | } |
| 248 | } | 240 | } |
| @@ -304,16 +296,12 @@ static void arizona_stop_mic(struct arizona_extcon_info *info) | |||
| 304 | ARIZONA_MICD_ENA, 0, | 296 | ARIZONA_MICD_ENA, 0, |
| 305 | &change); | 297 | &change); |
| 306 | 298 | ||
| 307 | mutex_lock(&dapm->card->dapm_mutex); | ||
| 308 | |||
| 309 | ret = snd_soc_dapm_disable_pin(dapm, widget); | 299 | ret = snd_soc_dapm_disable_pin(dapm, widget); |
| 310 | if (ret != 0) | 300 | if (ret != 0) |
| 311 | dev_warn(arizona->dev, | 301 | dev_warn(arizona->dev, |
| 312 | "Failed to disable %s: %d\n", | 302 | "Failed to disable %s: %d\n", |
| 313 | widget, ret); | 303 | widget, ret); |
| 314 | 304 | ||
| 315 | mutex_unlock(&dapm->card->dapm_mutex); | ||
| 316 | |||
| 317 | snd_soc_dapm_sync(dapm); | 305 | snd_soc_dapm_sync(dapm); |
| 318 | 306 | ||
| 319 | if (info->micd_reva) { | 307 | if (info->micd_reva) { |
diff --git a/drivers/fmc/fmc-write-eeprom.c b/drivers/fmc/fmc-write-eeprom.c index ee5b47904130..9bb2cbd5c9f2 100644 --- a/drivers/fmc/fmc-write-eeprom.c +++ b/drivers/fmc/fmc-write-eeprom.c | |||
| @@ -27,7 +27,7 @@ FMC_PARAM_BUSID(fwe_drv); | |||
| 27 | /* The "file=" is like the generic "gateware=" used elsewhere */ | 27 | /* The "file=" is like the generic "gateware=" used elsewhere */ |
| 28 | static char *fwe_file[FMC_MAX_CARDS]; | 28 | static char *fwe_file[FMC_MAX_CARDS]; |
| 29 | static int fwe_file_n; | 29 | static int fwe_file_n; |
| 30 | module_param_array_named(file, fwe_file, charp, &fwe_file_n, 444); | 30 | module_param_array_named(file, fwe_file, charp, &fwe_file_n, 0444); |
| 31 | 31 | ||
| 32 | static int fwe_run_tlv(struct fmc_device *fmc, const struct firmware *fw, | 32 | static int fwe_run_tlv(struct fmc_device *fmc, const struct firmware *fw, |
| 33 | int write) | 33 | int write) |
diff --git a/drivers/gpu/drm/nouveau/nouveau_acpi.c b/drivers/gpu/drm/nouveau/nouveau_acpi.c index 4ef83df2b246..83face3f608f 100644 --- a/drivers/gpu/drm/nouveau/nouveau_acpi.c +++ b/drivers/gpu/drm/nouveau/nouveau_acpi.c | |||
| @@ -106,6 +106,29 @@ static int nouveau_optimus_dsm(acpi_handle handle, int func, int arg, uint32_t * | |||
| 106 | return 0; | 106 | return 0; |
| 107 | } | 107 | } |
| 108 | 108 | ||
| 109 | /* | ||
| 110 | * On some platforms, _DSM(nouveau_op_dsm_muid, func0) has special | ||
| 111 | * requirements on the fourth parameter, so a private implementation | ||
| 112 | * instead of using acpi_check_dsm(). | ||
| 113 | */ | ||
| 114 | static int nouveau_check_optimus_dsm(acpi_handle handle) | ||
| 115 | { | ||
| 116 | int result; | ||
| 117 | |||
| 118 | /* | ||
| 119 | * Function 0 returns a Buffer containing available functions. | ||
| 120 | * The args parameter is ignored for function 0, so just put 0 in it | ||
| 121 | */ | ||
| 122 | if (nouveau_optimus_dsm(handle, 0, 0, &result)) | ||
| 123 | return 0; | ||
| 124 | |||
| 125 | /* | ||
| 126 | * ACPI Spec v4 9.14.1: if bit 0 is zero, no function is supported. | ||
| 127 | * If the n-th bit is enabled, function n is supported | ||
| 128 | */ | ||
| 129 | return result & 1 && result & (1 << NOUVEAU_DSM_OPTIMUS_CAPS); | ||
| 130 | } | ||
| 131 | |||
| 109 | static int nouveau_dsm(acpi_handle handle, int func, int arg) | 132 | static int nouveau_dsm(acpi_handle handle, int func, int arg) |
| 110 | { | 133 | { |
| 111 | int ret = 0; | 134 | int ret = 0; |
| @@ -207,8 +230,7 @@ static int nouveau_dsm_pci_probe(struct pci_dev *pdev) | |||
| 207 | 1 << NOUVEAU_DSM_POWER)) | 230 | 1 << NOUVEAU_DSM_POWER)) |
| 208 | retval |= NOUVEAU_DSM_HAS_MUX; | 231 | retval |= NOUVEAU_DSM_HAS_MUX; |
| 209 | 232 | ||
| 210 | if (acpi_check_dsm(dhandle, nouveau_op_dsm_muid, 0x00000100, | 233 | if (nouveau_check_optimus_dsm(dhandle)) |
| 211 | 1 << NOUVEAU_DSM_OPTIMUS_CAPS)) | ||
| 212 | retval |= NOUVEAU_DSM_HAS_OPT; | 234 | retval |= NOUVEAU_DSM_HAS_OPT; |
| 213 | 235 | ||
| 214 | if (retval & NOUVEAU_DSM_HAS_OPT) { | 236 | if (retval & NOUVEAU_DSM_HAS_OPT) { |
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c index 0d19f4f94d5a..daa4dd375ab1 100644 --- a/drivers/gpu/drm/radeon/atombios_crtc.c +++ b/drivers/gpu/drm/radeon/atombios_crtc.c | |||
| @@ -1774,6 +1774,20 @@ static int radeon_atom_pick_pll(struct drm_crtc *crtc) | |||
| 1774 | return ATOM_PPLL1; | 1774 | return ATOM_PPLL1; |
| 1775 | DRM_ERROR("unable to allocate a PPLL\n"); | 1775 | DRM_ERROR("unable to allocate a PPLL\n"); |
| 1776 | return ATOM_PPLL_INVALID; | 1776 | return ATOM_PPLL_INVALID; |
| 1777 | } else if (ASIC_IS_DCE41(rdev)) { | ||
| 1778 | /* Don't share PLLs on DCE4.1 chips */ | ||
| 1779 | if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(radeon_crtc->encoder))) { | ||
| 1780 | if (rdev->clock.dp_extclk) | ||
| 1781 | /* skip PPLL programming if using ext clock */ | ||
| 1782 | return ATOM_PPLL_INVALID; | ||
| 1783 | } | ||
| 1784 | pll_in_use = radeon_get_pll_use_mask(crtc); | ||
| 1785 | if (!(pll_in_use & (1 << ATOM_PPLL1))) | ||
| 1786 | return ATOM_PPLL1; | ||
| 1787 | if (!(pll_in_use & (1 << ATOM_PPLL2))) | ||
| 1788 | return ATOM_PPLL2; | ||
| 1789 | DRM_ERROR("unable to allocate a PPLL\n"); | ||
| 1790 | return ATOM_PPLL_INVALID; | ||
| 1777 | } else if (ASIC_IS_DCE4(rdev)) { | 1791 | } else if (ASIC_IS_DCE4(rdev)) { |
| 1778 | /* in DP mode, the DP ref clock can come from PPLL, DCPLL, or ext clock, | 1792 | /* in DP mode, the DP ref clock can come from PPLL, DCPLL, or ext clock, |
| 1779 | * depending on the asic: | 1793 | * depending on the asic: |
| @@ -1801,7 +1815,7 @@ static int radeon_atom_pick_pll(struct drm_crtc *crtc) | |||
| 1801 | if (pll != ATOM_PPLL_INVALID) | 1815 | if (pll != ATOM_PPLL_INVALID) |
| 1802 | return pll; | 1816 | return pll; |
| 1803 | } | 1817 | } |
| 1804 | } else if (!ASIC_IS_DCE41(rdev)) { /* Don't share PLLs on DCE4.1 chips */ | 1818 | } else { |
| 1805 | /* use the same PPLL for all monitors with the same clock */ | 1819 | /* use the same PPLL for all monitors with the same clock */ |
| 1806 | pll = radeon_get_shared_nondp_ppll(crtc); | 1820 | pll = radeon_get_shared_nondp_ppll(crtc); |
| 1807 | if (pll != ATOM_PPLL_INVALID) | 1821 | if (pll != ATOM_PPLL_INVALID) |
diff --git a/drivers/gpu/drm/radeon/dce6_afmt.c b/drivers/gpu/drm/radeon/dce6_afmt.c index 713a5d359901..94e858751994 100644 --- a/drivers/gpu/drm/radeon/dce6_afmt.c +++ b/drivers/gpu/drm/radeon/dce6_afmt.c | |||
| @@ -278,13 +278,15 @@ static int dce6_audio_chipset_supported(struct radeon_device *rdev) | |||
| 278 | return !ASIC_IS_NODCE(rdev); | 278 | return !ASIC_IS_NODCE(rdev); |
| 279 | } | 279 | } |
| 280 | 280 | ||
| 281 | static void dce6_audio_enable(struct radeon_device *rdev, | 281 | void dce6_audio_enable(struct radeon_device *rdev, |
| 282 | struct r600_audio_pin *pin, | 282 | struct r600_audio_pin *pin, |
| 283 | bool enable) | 283 | bool enable) |
| 284 | { | 284 | { |
| 285 | if (!pin) | ||
| 286 | return; | ||
| 287 | |||
| 285 | WREG32_ENDPOINT(pin->offset, AZ_F0_CODEC_PIN_CONTROL_HOTPLUG_CONTROL, | 288 | WREG32_ENDPOINT(pin->offset, AZ_F0_CODEC_PIN_CONTROL_HOTPLUG_CONTROL, |
| 286 | AUDIO_ENABLED); | 289 | enable ? AUDIO_ENABLED : 0); |
| 287 | DRM_INFO("%s audio %d support\n", enable ? "Enabling" : "Disabling", pin->id); | ||
| 288 | } | 290 | } |
| 289 | 291 | ||
| 290 | static const u32 pin_offsets[7] = | 292 | static const u32 pin_offsets[7] = |
| @@ -323,7 +325,8 @@ int dce6_audio_init(struct radeon_device *rdev) | |||
| 323 | rdev->audio.pin[i].connected = false; | 325 | rdev->audio.pin[i].connected = false; |
| 324 | rdev->audio.pin[i].offset = pin_offsets[i]; | 326 | rdev->audio.pin[i].offset = pin_offsets[i]; |
| 325 | rdev->audio.pin[i].id = i; | 327 | rdev->audio.pin[i].id = i; |
| 326 | dce6_audio_enable(rdev, &rdev->audio.pin[i], true); | 328 | /* disable audio. it will be set up later */ |
| 329 | dce6_audio_enable(rdev, &rdev->audio.pin[i], false); | ||
| 327 | } | 330 | } |
| 328 | 331 | ||
| 329 | return 0; | 332 | return 0; |
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index 5623e7542d99..8a2c010b7dc5 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c | |||
| @@ -5475,9 +5475,9 @@ void evergreen_fini(struct radeon_device *rdev) | |||
| 5475 | radeon_wb_fini(rdev); | 5475 | radeon_wb_fini(rdev); |
| 5476 | radeon_ib_pool_fini(rdev); | 5476 | radeon_ib_pool_fini(rdev); |
| 5477 | radeon_irq_kms_fini(rdev); | 5477 | radeon_irq_kms_fini(rdev); |
| 5478 | evergreen_pcie_gart_fini(rdev); | ||
| 5479 | uvd_v1_0_fini(rdev); | 5478 | uvd_v1_0_fini(rdev); |
| 5480 | radeon_uvd_fini(rdev); | 5479 | radeon_uvd_fini(rdev); |
| 5480 | evergreen_pcie_gart_fini(rdev); | ||
| 5481 | r600_vram_scratch_fini(rdev); | 5481 | r600_vram_scratch_fini(rdev); |
| 5482 | radeon_gem_fini(rdev); | 5482 | radeon_gem_fini(rdev); |
| 5483 | radeon_fence_driver_fini(rdev); | 5483 | radeon_fence_driver_fini(rdev); |
diff --git a/drivers/gpu/drm/radeon/evergreen_hdmi.c b/drivers/gpu/drm/radeon/evergreen_hdmi.c index 0c6d5cef4cf1..05b0c95813fd 100644 --- a/drivers/gpu/drm/radeon/evergreen_hdmi.c +++ b/drivers/gpu/drm/radeon/evergreen_hdmi.c | |||
| @@ -306,6 +306,15 @@ void evergreen_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode | |||
| 306 | return; | 306 | return; |
| 307 | offset = dig->afmt->offset; | 307 | offset = dig->afmt->offset; |
| 308 | 308 | ||
| 309 | /* disable audio prior to setting up hw */ | ||
| 310 | if (ASIC_IS_DCE6(rdev)) { | ||
| 311 | dig->afmt->pin = dce6_audio_get_pin(rdev); | ||
| 312 | dce6_audio_enable(rdev, dig->afmt->pin, false); | ||
| 313 | } else { | ||
| 314 | dig->afmt->pin = r600_audio_get_pin(rdev); | ||
| 315 | r600_audio_enable(rdev, dig->afmt->pin, false); | ||
| 316 | } | ||
| 317 | |||
| 309 | evergreen_audio_set_dto(encoder, mode->clock); | 318 | evergreen_audio_set_dto(encoder, mode->clock); |
| 310 | 319 | ||
| 311 | WREG32(HDMI_VBI_PACKET_CONTROL + offset, | 320 | WREG32(HDMI_VBI_PACKET_CONTROL + offset, |
| @@ -409,12 +418,16 @@ void evergreen_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode | |||
| 409 | WREG32(AFMT_RAMP_CONTROL1 + offset, 0x007FFFFF); | 418 | WREG32(AFMT_RAMP_CONTROL1 + offset, 0x007FFFFF); |
| 410 | WREG32(AFMT_RAMP_CONTROL2 + offset, 0x00000001); | 419 | WREG32(AFMT_RAMP_CONTROL2 + offset, 0x00000001); |
| 411 | WREG32(AFMT_RAMP_CONTROL3 + offset, 0x00000001); | 420 | WREG32(AFMT_RAMP_CONTROL3 + offset, 0x00000001); |
| 421 | |||
| 422 | /* enable audio after to setting up hw */ | ||
| 423 | if (ASIC_IS_DCE6(rdev)) | ||
| 424 | dce6_audio_enable(rdev, dig->afmt->pin, true); | ||
| 425 | else | ||
| 426 | r600_audio_enable(rdev, dig->afmt->pin, true); | ||
| 412 | } | 427 | } |
| 413 | 428 | ||
| 414 | void evergreen_hdmi_enable(struct drm_encoder *encoder, bool enable) | 429 | void evergreen_hdmi_enable(struct drm_encoder *encoder, bool enable) |
| 415 | { | 430 | { |
| 416 | struct drm_device *dev = encoder->dev; | ||
| 417 | struct radeon_device *rdev = dev->dev_private; | ||
| 418 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 431 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
| 419 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; | 432 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
| 420 | 433 | ||
| @@ -427,15 +440,6 @@ void evergreen_hdmi_enable(struct drm_encoder *encoder, bool enable) | |||
| 427 | if (!enable && !dig->afmt->enabled) | 440 | if (!enable && !dig->afmt->enabled) |
| 428 | return; | 441 | return; |
| 429 | 442 | ||
| 430 | if (enable) { | ||
| 431 | if (ASIC_IS_DCE6(rdev)) | ||
| 432 | dig->afmt->pin = dce6_audio_get_pin(rdev); | ||
| 433 | else | ||
| 434 | dig->afmt->pin = r600_audio_get_pin(rdev); | ||
| 435 | } else { | ||
| 436 | dig->afmt->pin = NULL; | ||
| 437 | } | ||
| 438 | |||
| 439 | dig->afmt->enabled = enable; | 443 | dig->afmt->enabled = enable; |
| 440 | 444 | ||
| 441 | DRM_DEBUG("%sabling HDMI interface @ 0x%04X for encoder 0x%x\n", | 445 | DRM_DEBUG("%sabling HDMI interface @ 0x%04X for encoder 0x%x\n", |
diff --git a/drivers/gpu/drm/radeon/r600_audio.c b/drivers/gpu/drm/radeon/r600_audio.c index 47fc2b886979..bffac10c4296 100644 --- a/drivers/gpu/drm/radeon/r600_audio.c +++ b/drivers/gpu/drm/radeon/r600_audio.c | |||
| @@ -142,12 +142,15 @@ void r600_audio_update_hdmi(struct work_struct *work) | |||
| 142 | } | 142 | } |
| 143 | 143 | ||
| 144 | /* enable the audio stream */ | 144 | /* enable the audio stream */ |
| 145 | static void r600_audio_enable(struct radeon_device *rdev, | 145 | void r600_audio_enable(struct radeon_device *rdev, |
| 146 | struct r600_audio_pin *pin, | 146 | struct r600_audio_pin *pin, |
| 147 | bool enable) | 147 | bool enable) |
| 148 | { | 148 | { |
| 149 | u32 value = 0; | 149 | u32 value = 0; |
| 150 | 150 | ||
| 151 | if (!pin) | ||
| 152 | return; | ||
| 153 | |||
| 151 | if (ASIC_IS_DCE4(rdev)) { | 154 | if (ASIC_IS_DCE4(rdev)) { |
| 152 | if (enable) { | 155 | if (enable) { |
| 153 | value |= 0x81000000; /* Required to enable audio */ | 156 | value |= 0x81000000; /* Required to enable audio */ |
| @@ -158,7 +161,6 @@ static void r600_audio_enable(struct radeon_device *rdev, | |||
| 158 | WREG32_P(R600_AUDIO_ENABLE, | 161 | WREG32_P(R600_AUDIO_ENABLE, |
| 159 | enable ? 0x81000000 : 0x0, ~0x81000000); | 162 | enable ? 0x81000000 : 0x0, ~0x81000000); |
| 160 | } | 163 | } |
| 161 | DRM_INFO("%s audio %d support\n", enable ? "Enabling" : "Disabling", pin->id); | ||
| 162 | } | 164 | } |
| 163 | 165 | ||
| 164 | /* | 166 | /* |
| @@ -178,8 +180,8 @@ int r600_audio_init(struct radeon_device *rdev) | |||
| 178 | rdev->audio.pin[0].status_bits = 0; | 180 | rdev->audio.pin[0].status_bits = 0; |
| 179 | rdev->audio.pin[0].category_code = 0; | 181 | rdev->audio.pin[0].category_code = 0; |
| 180 | rdev->audio.pin[0].id = 0; | 182 | rdev->audio.pin[0].id = 0; |
| 181 | 183 | /* disable audio. it will be set up later */ | |
| 182 | r600_audio_enable(rdev, &rdev->audio.pin[0], true); | 184 | r600_audio_enable(rdev, &rdev->audio.pin[0], false); |
| 183 | 185 | ||
| 184 | return 0; | 186 | return 0; |
| 185 | } | 187 | } |
diff --git a/drivers/gpu/drm/radeon/r600_hdmi.c b/drivers/gpu/drm/radeon/r600_hdmi.c index 3016fc14f502..85a2bb28aed2 100644 --- a/drivers/gpu/drm/radeon/r600_hdmi.c +++ b/drivers/gpu/drm/radeon/r600_hdmi.c | |||
| @@ -329,9 +329,6 @@ static void dce3_2_afmt_write_speaker_allocation(struct drm_encoder *encoder) | |||
| 329 | u8 *sadb; | 329 | u8 *sadb; |
| 330 | int sad_count; | 330 | int sad_count; |
| 331 | 331 | ||
| 332 | /* XXX: setting this register causes hangs on some asics */ | ||
| 333 | return; | ||
| 334 | |||
| 335 | list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) { | 332 | list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) { |
| 336 | if (connector->encoder == encoder) { | 333 | if (connector->encoder == encoder) { |
| 337 | radeon_connector = to_radeon_connector(connector); | 334 | radeon_connector = to_radeon_connector(connector); |
| @@ -460,6 +457,10 @@ void r600_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *mod | |||
| 460 | return; | 457 | return; |
| 461 | offset = dig->afmt->offset; | 458 | offset = dig->afmt->offset; |
| 462 | 459 | ||
| 460 | /* disable audio prior to setting up hw */ | ||
| 461 | dig->afmt->pin = r600_audio_get_pin(rdev); | ||
| 462 | r600_audio_enable(rdev, dig->afmt->pin, false); | ||
| 463 | |||
| 463 | r600_audio_set_dto(encoder, mode->clock); | 464 | r600_audio_set_dto(encoder, mode->clock); |
| 464 | 465 | ||
| 465 | WREG32(HDMI0_VBI_PACKET_CONTROL + offset, | 466 | WREG32(HDMI0_VBI_PACKET_CONTROL + offset, |
| @@ -531,6 +532,9 @@ void r600_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *mod | |||
| 531 | WREG32(HDMI0_RAMP_CONTROL3 + offset, 0x00000001); | 532 | WREG32(HDMI0_RAMP_CONTROL3 + offset, 0x00000001); |
| 532 | 533 | ||
| 533 | r600_hdmi_audio_workaround(encoder); | 534 | r600_hdmi_audio_workaround(encoder); |
| 535 | |||
| 536 | /* enable audio after to setting up hw */ | ||
| 537 | r600_audio_enable(rdev, dig->afmt->pin, true); | ||
| 534 | } | 538 | } |
| 535 | 539 | ||
| 536 | /* | 540 | /* |
| @@ -651,11 +655,6 @@ void r600_hdmi_enable(struct drm_encoder *encoder, bool enable) | |||
| 651 | if (!enable && !dig->afmt->enabled) | 655 | if (!enable && !dig->afmt->enabled) |
| 652 | return; | 656 | return; |
| 653 | 657 | ||
| 654 | if (enable) | ||
| 655 | dig->afmt->pin = r600_audio_get_pin(rdev); | ||
| 656 | else | ||
| 657 | dig->afmt->pin = NULL; | ||
| 658 | |||
| 659 | /* Older chipsets require setting HDMI and routing manually */ | 658 | /* Older chipsets require setting HDMI and routing manually */ |
| 660 | if (!ASIC_IS_DCE3(rdev)) { | 659 | if (!ASIC_IS_DCE3(rdev)) { |
| 661 | if (enable) | 660 | if (enable) |
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index 024db37b1832..e887d027b6d0 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
| @@ -2747,6 +2747,12 @@ int radeon_vm_bo_rmv(struct radeon_device *rdev, | |||
| 2747 | void r600_audio_update_hdmi(struct work_struct *work); | 2747 | void r600_audio_update_hdmi(struct work_struct *work); |
| 2748 | struct r600_audio_pin *r600_audio_get_pin(struct radeon_device *rdev); | 2748 | struct r600_audio_pin *r600_audio_get_pin(struct radeon_device *rdev); |
| 2749 | struct r600_audio_pin *dce6_audio_get_pin(struct radeon_device *rdev); | 2749 | struct r600_audio_pin *dce6_audio_get_pin(struct radeon_device *rdev); |
| 2750 | void r600_audio_enable(struct radeon_device *rdev, | ||
| 2751 | struct r600_audio_pin *pin, | ||
| 2752 | bool enable); | ||
| 2753 | void dce6_audio_enable(struct radeon_device *rdev, | ||
| 2754 | struct r600_audio_pin *pin, | ||
| 2755 | bool enable); | ||
| 2750 | 2756 | ||
| 2751 | /* | 2757 | /* |
| 2752 | * R600 vram scratch functions | 2758 | * R600 vram scratch functions |
diff --git a/drivers/gpu/drm/radeon/radeon_atpx_handler.c b/drivers/gpu/drm/radeon/radeon_atpx_handler.c index 485848f889f5..fa9a9c02751e 100644 --- a/drivers/gpu/drm/radeon/radeon_atpx_handler.c +++ b/drivers/gpu/drm/radeon/radeon_atpx_handler.c | |||
| @@ -219,7 +219,8 @@ static int radeon_atpx_verify_interface(struct radeon_atpx *atpx) | |||
| 219 | memcpy(&output, info->buffer.pointer, size); | 219 | memcpy(&output, info->buffer.pointer, size); |
| 220 | 220 | ||
| 221 | /* TODO: check version? */ | 221 | /* TODO: check version? */ |
| 222 | printk("ATPX version %u\n", output.version); | 222 | printk("ATPX version %u, functions 0x%08x\n", |
| 223 | output.version, output.function_bits); | ||
| 223 | 224 | ||
| 224 | radeon_atpx_parse_functions(&atpx->functions, output.function_bits); | 225 | radeon_atpx_parse_functions(&atpx->functions, output.function_bits); |
| 225 | 226 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c index 114d1672d616..2aecd6dc2610 100644 --- a/drivers/gpu/drm/radeon/radeon_kms.c +++ b/drivers/gpu/drm/radeon/radeon_kms.c | |||
| @@ -537,6 +537,10 @@ int radeon_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv) | |||
| 537 | 537 | ||
| 538 | radeon_vm_init(rdev, &fpriv->vm); | 538 | radeon_vm_init(rdev, &fpriv->vm); |
| 539 | 539 | ||
| 540 | r = radeon_bo_reserve(rdev->ring_tmp_bo.bo, false); | ||
| 541 | if (r) | ||
| 542 | return r; | ||
| 543 | |||
| 540 | /* map the ib pool buffer read only into | 544 | /* map the ib pool buffer read only into |
| 541 | * virtual address space */ | 545 | * virtual address space */ |
| 542 | bo_va = radeon_vm_bo_add(rdev, &fpriv->vm, | 546 | bo_va = radeon_vm_bo_add(rdev, &fpriv->vm, |
| @@ -544,6 +548,8 @@ int radeon_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv) | |||
| 544 | r = radeon_vm_bo_set_addr(rdev, bo_va, RADEON_VA_IB_OFFSET, | 548 | r = radeon_vm_bo_set_addr(rdev, bo_va, RADEON_VA_IB_OFFSET, |
| 545 | RADEON_VM_PAGE_READABLE | | 549 | RADEON_VM_PAGE_READABLE | |
| 546 | RADEON_VM_PAGE_SNOOPED); | 550 | RADEON_VM_PAGE_SNOOPED); |
| 551 | |||
| 552 | radeon_bo_unreserve(rdev->ring_tmp_bo.bo); | ||
| 547 | if (r) { | 553 | if (r) { |
| 548 | radeon_vm_fini(rdev, &fpriv->vm); | 554 | radeon_vm_fini(rdev, &fpriv->vm); |
| 549 | kfree(fpriv); | 555 | kfree(fpriv); |
diff --git a/drivers/gpu/drm/radeon/radeon_uvd.c b/drivers/gpu/drm/radeon/radeon_uvd.c index 6781fee1eaad..3e6804b2b2ef 100644 --- a/drivers/gpu/drm/radeon/radeon_uvd.c +++ b/drivers/gpu/drm/radeon/radeon_uvd.c | |||
| @@ -171,6 +171,8 @@ void radeon_uvd_fini(struct radeon_device *rdev) | |||
| 171 | 171 | ||
| 172 | radeon_bo_unref(&rdev->uvd.vcpu_bo); | 172 | radeon_bo_unref(&rdev->uvd.vcpu_bo); |
| 173 | 173 | ||
| 174 | radeon_ring_fini(rdev, &rdev->ring[R600_RING_TYPE_UVD_INDEX]); | ||
| 175 | |||
| 174 | release_firmware(rdev->uvd_fw); | 176 | release_firmware(rdev->uvd_fw); |
| 175 | } | 177 | } |
| 176 | 178 | ||
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c index 6c772e58c784..4e37a42305d8 100644 --- a/drivers/gpu/drm/radeon/rv770.c +++ b/drivers/gpu/drm/radeon/rv770.c | |||
| @@ -1955,9 +1955,9 @@ void rv770_fini(struct radeon_device *rdev) | |||
| 1955 | radeon_wb_fini(rdev); | 1955 | radeon_wb_fini(rdev); |
| 1956 | radeon_ib_pool_fini(rdev); | 1956 | radeon_ib_pool_fini(rdev); |
| 1957 | radeon_irq_kms_fini(rdev); | 1957 | radeon_irq_kms_fini(rdev); |
| 1958 | rv770_pcie_gart_fini(rdev); | ||
| 1959 | uvd_v1_0_fini(rdev); | 1958 | uvd_v1_0_fini(rdev); |
| 1960 | radeon_uvd_fini(rdev); | 1959 | radeon_uvd_fini(rdev); |
| 1960 | rv770_pcie_gart_fini(rdev); | ||
| 1961 | r600_vram_scratch_fini(rdev); | 1961 | r600_vram_scratch_fini(rdev); |
| 1962 | radeon_gem_fini(rdev); | 1962 | radeon_gem_fini(rdev); |
| 1963 | radeon_fence_driver_fini(rdev); | 1963 | radeon_fence_driver_fini(rdev); |
diff --git a/drivers/gpu/drm/tegra/drm.c b/drivers/gpu/drm/tegra/drm.c index 88a529008ce0..c71594754f46 100644 --- a/drivers/gpu/drm/tegra/drm.c +++ b/drivers/gpu/drm/tegra/drm.c | |||
| @@ -104,7 +104,7 @@ static void tegra_drm_context_free(struct tegra_drm_context *context) | |||
| 104 | 104 | ||
| 105 | static void tegra_drm_lastclose(struct drm_device *drm) | 105 | static void tegra_drm_lastclose(struct drm_device *drm) |
| 106 | { | 106 | { |
| 107 | #ifdef CONFIG_TEGRA_DRM_FBDEV | 107 | #ifdef CONFIG_DRM_TEGRA_FBDEV |
| 108 | struct tegra_drm *tegra = drm->dev_private; | 108 | struct tegra_drm *tegra = drm->dev_private; |
| 109 | 109 | ||
| 110 | tegra_fbdev_restore_mode(tegra->fbdev); | 110 | tegra_fbdev_restore_mode(tegra->fbdev); |
diff --git a/drivers/gpu/drm/tegra/rgb.c b/drivers/gpu/drm/tegra/rgb.c index 338f7f6561d7..0266fb40479e 100644 --- a/drivers/gpu/drm/tegra/rgb.c +++ b/drivers/gpu/drm/tegra/rgb.c | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | struct tegra_rgb { | 15 | struct tegra_rgb { |
| 16 | struct tegra_output output; | 16 | struct tegra_output output; |
| 17 | struct tegra_dc *dc; | 17 | struct tegra_dc *dc; |
| 18 | bool enabled; | ||
| 18 | 19 | ||
| 19 | struct clk *clk_parent; | 20 | struct clk *clk_parent; |
| 20 | struct clk *clk; | 21 | struct clk *clk; |
| @@ -89,6 +90,9 @@ static int tegra_output_rgb_enable(struct tegra_output *output) | |||
| 89 | struct tegra_rgb *rgb = to_rgb(output); | 90 | struct tegra_rgb *rgb = to_rgb(output); |
| 90 | unsigned long value; | 91 | unsigned long value; |
| 91 | 92 | ||
| 93 | if (rgb->enabled) | ||
| 94 | return 0; | ||
| 95 | |||
| 92 | tegra_dc_write_regs(rgb->dc, rgb_enable, ARRAY_SIZE(rgb_enable)); | 96 | tegra_dc_write_regs(rgb->dc, rgb_enable, ARRAY_SIZE(rgb_enable)); |
| 93 | 97 | ||
| 94 | value = DE_SELECT_ACTIVE | DE_CONTROL_NORMAL; | 98 | value = DE_SELECT_ACTIVE | DE_CONTROL_NORMAL; |
| @@ -122,6 +126,8 @@ static int tegra_output_rgb_enable(struct tegra_output *output) | |||
| 122 | tegra_dc_writel(rgb->dc, GENERAL_ACT_REQ << 8, DC_CMD_STATE_CONTROL); | 126 | tegra_dc_writel(rgb->dc, GENERAL_ACT_REQ << 8, DC_CMD_STATE_CONTROL); |
| 123 | tegra_dc_writel(rgb->dc, GENERAL_ACT_REQ, DC_CMD_STATE_CONTROL); | 127 | tegra_dc_writel(rgb->dc, GENERAL_ACT_REQ, DC_CMD_STATE_CONTROL); |
| 124 | 128 | ||
| 129 | rgb->enabled = true; | ||
| 130 | |||
| 125 | return 0; | 131 | return 0; |
| 126 | } | 132 | } |
| 127 | 133 | ||
| @@ -130,6 +136,9 @@ static int tegra_output_rgb_disable(struct tegra_output *output) | |||
| 130 | struct tegra_rgb *rgb = to_rgb(output); | 136 | struct tegra_rgb *rgb = to_rgb(output); |
| 131 | unsigned long value; | 137 | unsigned long value; |
| 132 | 138 | ||
| 139 | if (!rgb->enabled) | ||
| 140 | return 0; | ||
| 141 | |||
| 133 | value = tegra_dc_readl(rgb->dc, DC_CMD_DISPLAY_POWER_CONTROL); | 142 | value = tegra_dc_readl(rgb->dc, DC_CMD_DISPLAY_POWER_CONTROL); |
| 134 | value &= ~(PW0_ENABLE | PW1_ENABLE | PW2_ENABLE | PW3_ENABLE | | 143 | value &= ~(PW0_ENABLE | PW1_ENABLE | PW2_ENABLE | PW3_ENABLE | |
| 135 | PW4_ENABLE | PM0_ENABLE | PM1_ENABLE); | 144 | PW4_ENABLE | PM0_ENABLE | PM1_ENABLE); |
| @@ -144,6 +153,8 @@ static int tegra_output_rgb_disable(struct tegra_output *output) | |||
| 144 | 153 | ||
| 145 | tegra_dc_write_regs(rgb->dc, rgb_disable, ARRAY_SIZE(rgb_disable)); | 154 | tegra_dc_write_regs(rgb->dc, rgb_disable, ARRAY_SIZE(rgb_disable)); |
| 146 | 155 | ||
| 156 | rgb->enabled = false; | ||
| 157 | |||
| 147 | return 0; | 158 | return 0; |
| 148 | } | 159 | } |
| 149 | 160 | ||
diff --git a/drivers/gpu/drm/vmwgfx/svga3d_reg.h b/drivers/gpu/drm/vmwgfx/svga3d_reg.h index bb594c11605e..f58dc7dd15c5 100644 --- a/drivers/gpu/drm/vmwgfx/svga3d_reg.h +++ b/drivers/gpu/drm/vmwgfx/svga3d_reg.h | |||
| @@ -261,12 +261,7 @@ typedef enum SVGA3dSurfaceFormat { | |||
| 261 | /* Planar video formats. */ | 261 | /* Planar video formats. */ |
| 262 | SVGA3D_YV12 = 121, | 262 | SVGA3D_YV12 = 121, |
| 263 | 263 | ||
| 264 | /* Shader constant formats. */ | 264 | SVGA3D_FORMAT_MAX = 122, |
| 265 | SVGA3D_SURFACE_SHADERCONST_FLOAT = 122, | ||
| 266 | SVGA3D_SURFACE_SHADERCONST_INT = 123, | ||
| 267 | SVGA3D_SURFACE_SHADERCONST_BOOL = 124, | ||
| 268 | |||
| 269 | SVGA3D_FORMAT_MAX = 125, | ||
| 270 | } SVGA3dSurfaceFormat; | 265 | } SVGA3dSurfaceFormat; |
| 271 | 266 | ||
| 272 | typedef uint32 SVGA3dColor; /* a, r, g, b */ | 267 | typedef uint32 SVGA3dColor; /* a, r, g, b */ |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h index 9e4be1725985..07831554dad7 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | |||
| @@ -40,7 +40,7 @@ | |||
| 40 | #include <drm/ttm/ttm_module.h> | 40 | #include <drm/ttm/ttm_module.h> |
| 41 | #include "vmwgfx_fence.h" | 41 | #include "vmwgfx_fence.h" |
| 42 | 42 | ||
| 43 | #define VMWGFX_DRIVER_DATE "20121114" | 43 | #define VMWGFX_DRIVER_DATE "20140228" |
| 44 | #define VMWGFX_DRIVER_MAJOR 2 | 44 | #define VMWGFX_DRIVER_MAJOR 2 |
| 45 | #define VMWGFX_DRIVER_MINOR 5 | 45 | #define VMWGFX_DRIVER_MINOR 5 |
| 46 | #define VMWGFX_DRIVER_PATCHLEVEL 0 | 46 | #define VMWGFX_DRIVER_PATCHLEVEL 0 |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_mob.c b/drivers/gpu/drm/vmwgfx/vmwgfx_mob.c index d4a5a19cb8c3..04a64b8cd3cd 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_mob.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_mob.c | |||
| @@ -188,18 +188,20 @@ static void vmw_takedown_otable_base(struct vmw_private *dev_priv, | |||
| 188 | 188 | ||
| 189 | bo = otable->page_table->pt_bo; | 189 | bo = otable->page_table->pt_bo; |
| 190 | cmd = vmw_fifo_reserve(dev_priv, sizeof(*cmd)); | 190 | cmd = vmw_fifo_reserve(dev_priv, sizeof(*cmd)); |
| 191 | if (unlikely(cmd == NULL)) | 191 | if (unlikely(cmd == NULL)) { |
| 192 | DRM_ERROR("Failed reserving FIFO space for OTable setup.\n"); | 192 | DRM_ERROR("Failed reserving FIFO space for OTable " |
| 193 | 193 | "takedown.\n"); | |
| 194 | memset(cmd, 0, sizeof(*cmd)); | 194 | } else { |
| 195 | cmd->header.id = SVGA_3D_CMD_SET_OTABLE_BASE; | 195 | memset(cmd, 0, sizeof(*cmd)); |
| 196 | cmd->header.size = sizeof(cmd->body); | 196 | cmd->header.id = SVGA_3D_CMD_SET_OTABLE_BASE; |
| 197 | cmd->body.type = type; | 197 | cmd->header.size = sizeof(cmd->body); |
| 198 | cmd->body.baseAddress = 0; | 198 | cmd->body.type = type; |
| 199 | cmd->body.sizeInBytes = 0; | 199 | cmd->body.baseAddress = 0; |
| 200 | cmd->body.validSizeInBytes = 0; | 200 | cmd->body.sizeInBytes = 0; |
| 201 | cmd->body.ptDepth = SVGA3D_MOBFMT_INVALID; | 201 | cmd->body.validSizeInBytes = 0; |
| 202 | vmw_fifo_commit(dev_priv, sizeof(*cmd)); | 202 | cmd->body.ptDepth = SVGA3D_MOBFMT_INVALID; |
| 203 | vmw_fifo_commit(dev_priv, sizeof(*cmd)); | ||
| 204 | } | ||
| 203 | 205 | ||
| 204 | if (bo) { | 206 | if (bo) { |
| 205 | int ret; | 207 | int ret; |
| @@ -562,11 +564,12 @@ void vmw_mob_unbind(struct vmw_private *dev_priv, | |||
| 562 | if (unlikely(cmd == NULL)) { | 564 | if (unlikely(cmd == NULL)) { |
| 563 | DRM_ERROR("Failed reserving FIFO space for Memory " | 565 | DRM_ERROR("Failed reserving FIFO space for Memory " |
| 564 | "Object unbinding.\n"); | 566 | "Object unbinding.\n"); |
| 567 | } else { | ||
| 568 | cmd->header.id = SVGA_3D_CMD_DESTROY_GB_MOB; | ||
| 569 | cmd->header.size = sizeof(cmd->body); | ||
| 570 | cmd->body.mobid = mob->id; | ||
| 571 | vmw_fifo_commit(dev_priv, sizeof(*cmd)); | ||
| 565 | } | 572 | } |
| 566 | cmd->header.id = SVGA_3D_CMD_DESTROY_GB_MOB; | ||
| 567 | cmd->header.size = sizeof(cmd->body); | ||
| 568 | cmd->body.mobid = mob->id; | ||
| 569 | vmw_fifo_commit(dev_priv, sizeof(*cmd)); | ||
| 570 | if (bo) { | 573 | if (bo) { |
| 571 | vmw_fence_single_bo(bo, NULL); | 574 | vmw_fence_single_bo(bo, NULL); |
| 572 | ttm_bo_unreserve(bo); | 575 | ttm_bo_unreserve(bo); |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c index 2aa4bc6a4d60..9757b57f8388 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c | |||
| @@ -427,8 +427,7 @@ int vmw_dmabuf_init(struct vmw_private *dev_priv, | |||
| 427 | INIT_LIST_HEAD(&vmw_bo->res_list); | 427 | INIT_LIST_HEAD(&vmw_bo->res_list); |
| 428 | 428 | ||
| 429 | ret = ttm_bo_init(bdev, &vmw_bo->base, size, | 429 | ret = ttm_bo_init(bdev, &vmw_bo->base, size, |
| 430 | (user) ? ttm_bo_type_device : | 430 | ttm_bo_type_device, placement, |
| 431 | ttm_bo_type_kernel, placement, | ||
| 432 | 0, interruptible, | 431 | 0, interruptible, |
| 433 | NULL, acc_size, NULL, bo_free); | 432 | NULL, acc_size, NULL, bo_free); |
| 434 | return ret; | 433 | return ret; |
diff --git a/drivers/gpu/host1x/job.c b/drivers/gpu/host1x/job.c index 1146e3bba6e1..112f27e51bc7 100644 --- a/drivers/gpu/host1x/job.c +++ b/drivers/gpu/host1x/job.c | |||
| @@ -538,7 +538,7 @@ int host1x_job_pin(struct host1x_job *job, struct device *dev) | |||
| 538 | 538 | ||
| 539 | g->base = job->gather_addr_phys[i]; | 539 | g->base = job->gather_addr_phys[i]; |
| 540 | 540 | ||
| 541 | for (j = 0; j < job->num_gathers; j++) | 541 | for (j = i + 1; j < job->num_gathers; j++) |
| 542 | if (job->gathers[j].bo == g->bo) | 542 | if (job->gathers[j].bo == g->bo) |
| 543 | job->gathers[j].handled = true; | 543 | job->gathers[j].handled = true; |
| 544 | 544 | ||
diff --git a/drivers/hwmon/max1668.c b/drivers/hwmon/max1668.c index a7626358c95d..029b65e6c589 100644 --- a/drivers/hwmon/max1668.c +++ b/drivers/hwmon/max1668.c | |||
| @@ -243,7 +243,7 @@ static ssize_t set_temp_min(struct device *dev, | |||
| 243 | data->temp_min[index] = clamp_val(temp/1000, -128, 127); | 243 | data->temp_min[index] = clamp_val(temp/1000, -128, 127); |
| 244 | if (i2c_smbus_write_byte_data(client, | 244 | if (i2c_smbus_write_byte_data(client, |
| 245 | MAX1668_REG_LIML_WR(index), | 245 | MAX1668_REG_LIML_WR(index), |
| 246 | data->temp_max[index])) | 246 | data->temp_min[index])) |
| 247 | count = -EIO; | 247 | count = -EIO; |
| 248 | mutex_unlock(&data->update_lock); | 248 | mutex_unlock(&data->update_lock); |
| 249 | 249 | ||
diff --git a/drivers/iio/gyro/Kconfig b/drivers/iio/gyro/Kconfig index 41c64a43bcab..ac2d69e34c8c 100644 --- a/drivers/iio/gyro/Kconfig +++ b/drivers/iio/gyro/Kconfig | |||
| @@ -70,7 +70,7 @@ config IIO_ST_GYRO_3AXIS | |||
| 70 | select IIO_TRIGGERED_BUFFER if (IIO_BUFFER) | 70 | select IIO_TRIGGERED_BUFFER if (IIO_BUFFER) |
| 71 | help | 71 | help |
| 72 | Say yes here to build support for STMicroelectronics gyroscopes: | 72 | Say yes here to build support for STMicroelectronics gyroscopes: |
| 73 | L3G4200D, LSM330DL, L3GD20, L3GD20H, LSM330DLC, L3G4IS, LSM330. | 73 | L3G4200D, LSM330DL, L3GD20, LSM330DLC, L3G4IS, LSM330. |
| 74 | 74 | ||
| 75 | This driver can also be built as a module. If so, these modules | 75 | This driver can also be built as a module. If so, these modules |
| 76 | will be created: | 76 | will be created: |
diff --git a/drivers/iio/gyro/st_gyro.h b/drivers/iio/gyro/st_gyro.h index f8f2bf84a5a2..c197360c450b 100644 --- a/drivers/iio/gyro/st_gyro.h +++ b/drivers/iio/gyro/st_gyro.h | |||
| @@ -19,7 +19,6 @@ | |||
| 19 | #define LSM330DL_GYRO_DEV_NAME "lsm330dl_gyro" | 19 | #define LSM330DL_GYRO_DEV_NAME "lsm330dl_gyro" |
| 20 | #define LSM330DLC_GYRO_DEV_NAME "lsm330dlc_gyro" | 20 | #define LSM330DLC_GYRO_DEV_NAME "lsm330dlc_gyro" |
| 21 | #define L3GD20_GYRO_DEV_NAME "l3gd20" | 21 | #define L3GD20_GYRO_DEV_NAME "l3gd20" |
| 22 | #define L3GD20H_GYRO_DEV_NAME "l3gd20h" | ||
| 23 | #define L3G4IS_GYRO_DEV_NAME "l3g4is_ui" | 22 | #define L3G4IS_GYRO_DEV_NAME "l3g4is_ui" |
| 24 | #define LSM330_GYRO_DEV_NAME "lsm330_gyro" | 23 | #define LSM330_GYRO_DEV_NAME "lsm330_gyro" |
| 25 | 24 | ||
diff --git a/drivers/iio/gyro/st_gyro_core.c b/drivers/iio/gyro/st_gyro_core.c index d53d91adfb55..a8e174a47bc4 100644 --- a/drivers/iio/gyro/st_gyro_core.c +++ b/drivers/iio/gyro/st_gyro_core.c | |||
| @@ -167,11 +167,10 @@ static const struct st_sensors st_gyro_sensors[] = { | |||
| 167 | .wai = ST_GYRO_2_WAI_EXP, | 167 | .wai = ST_GYRO_2_WAI_EXP, |
| 168 | .sensors_supported = { | 168 | .sensors_supported = { |
| 169 | [0] = L3GD20_GYRO_DEV_NAME, | 169 | [0] = L3GD20_GYRO_DEV_NAME, |
| 170 | [1] = L3GD20H_GYRO_DEV_NAME, | 170 | [1] = LSM330D_GYRO_DEV_NAME, |
| 171 | [2] = LSM330D_GYRO_DEV_NAME, | 171 | [2] = LSM330DLC_GYRO_DEV_NAME, |
| 172 | [3] = LSM330DLC_GYRO_DEV_NAME, | 172 | [3] = L3G4IS_GYRO_DEV_NAME, |
| 173 | [4] = L3G4IS_GYRO_DEV_NAME, | 173 | [4] = LSM330_GYRO_DEV_NAME, |
| 174 | [5] = LSM330_GYRO_DEV_NAME, | ||
| 175 | }, | 174 | }, |
| 176 | .ch = (struct iio_chan_spec *)st_gyro_16bit_channels, | 175 | .ch = (struct iio_chan_spec *)st_gyro_16bit_channels, |
| 177 | .odr = { | 176 | .odr = { |
diff --git a/drivers/iio/gyro/st_gyro_i2c.c b/drivers/iio/gyro/st_gyro_i2c.c index 16b8b8d70bf1..23c12f361b05 100644 --- a/drivers/iio/gyro/st_gyro_i2c.c +++ b/drivers/iio/gyro/st_gyro_i2c.c | |||
| @@ -55,7 +55,6 @@ static const struct i2c_device_id st_gyro_id_table[] = { | |||
| 55 | { LSM330DL_GYRO_DEV_NAME }, | 55 | { LSM330DL_GYRO_DEV_NAME }, |
| 56 | { LSM330DLC_GYRO_DEV_NAME }, | 56 | { LSM330DLC_GYRO_DEV_NAME }, |
| 57 | { L3GD20_GYRO_DEV_NAME }, | 57 | { L3GD20_GYRO_DEV_NAME }, |
| 58 | { L3GD20H_GYRO_DEV_NAME }, | ||
| 59 | { L3G4IS_GYRO_DEV_NAME }, | 58 | { L3G4IS_GYRO_DEV_NAME }, |
| 60 | { LSM330_GYRO_DEV_NAME }, | 59 | { LSM330_GYRO_DEV_NAME }, |
| 61 | {}, | 60 | {}, |
diff --git a/drivers/iio/gyro/st_gyro_spi.c b/drivers/iio/gyro/st_gyro_spi.c index 94763e25caf9..b4ad3be26687 100644 --- a/drivers/iio/gyro/st_gyro_spi.c +++ b/drivers/iio/gyro/st_gyro_spi.c | |||
| @@ -54,7 +54,6 @@ static const struct spi_device_id st_gyro_id_table[] = { | |||
| 54 | { LSM330DL_GYRO_DEV_NAME }, | 54 | { LSM330DL_GYRO_DEV_NAME }, |
| 55 | { LSM330DLC_GYRO_DEV_NAME }, | 55 | { LSM330DLC_GYRO_DEV_NAME }, |
| 56 | { L3GD20_GYRO_DEV_NAME }, | 56 | { L3GD20_GYRO_DEV_NAME }, |
| 57 | { L3GD20H_GYRO_DEV_NAME }, | ||
| 58 | { L3G4IS_GYRO_DEV_NAME }, | 57 | { L3G4IS_GYRO_DEV_NAME }, |
| 59 | { LSM330_GYRO_DEV_NAME }, | 58 | { LSM330_GYRO_DEV_NAME }, |
| 60 | {}, | 59 | {}, |
diff --git a/drivers/iio/light/cm32181.c b/drivers/iio/light/cm32181.c index f17b4e6183c6..47a6dbac2d0c 100644 --- a/drivers/iio/light/cm32181.c +++ b/drivers/iio/light/cm32181.c | |||
| @@ -103,13 +103,13 @@ static int cm32181_reg_init(struct cm32181_chip *cm32181) | |||
| 103 | /** | 103 | /** |
| 104 | * cm32181_read_als_it() - Get sensor integration time (ms) | 104 | * cm32181_read_als_it() - Get sensor integration time (ms) |
| 105 | * @cm32181: pointer of struct cm32181 | 105 | * @cm32181: pointer of struct cm32181 |
| 106 | * @val: pointer of int to load the als_it value. | 106 | * @val2: pointer of int to load the als_it value. |
| 107 | * | 107 | * |
| 108 | * Report the current integartion time by millisecond. | 108 | * Report the current integartion time by millisecond. |
| 109 | * | 109 | * |
| 110 | * Return: IIO_VAL_INT for success, otherwise -EINVAL. | 110 | * Return: IIO_VAL_INT_PLUS_MICRO for success, otherwise -EINVAL. |
| 111 | */ | 111 | */ |
| 112 | static int cm32181_read_als_it(struct cm32181_chip *cm32181, int *val) | 112 | static int cm32181_read_als_it(struct cm32181_chip *cm32181, int *val2) |
| 113 | { | 113 | { |
| 114 | u16 als_it; | 114 | u16 als_it; |
| 115 | int i; | 115 | int i; |
| @@ -119,8 +119,8 @@ static int cm32181_read_als_it(struct cm32181_chip *cm32181, int *val) | |||
| 119 | als_it >>= CM32181_CMD_ALS_IT_SHIFT; | 119 | als_it >>= CM32181_CMD_ALS_IT_SHIFT; |
| 120 | for (i = 0; i < ARRAY_SIZE(als_it_bits); i++) { | 120 | for (i = 0; i < ARRAY_SIZE(als_it_bits); i++) { |
| 121 | if (als_it == als_it_bits[i]) { | 121 | if (als_it == als_it_bits[i]) { |
| 122 | *val = als_it_value[i]; | 122 | *val2 = als_it_value[i]; |
| 123 | return IIO_VAL_INT; | 123 | return IIO_VAL_INT_PLUS_MICRO; |
| 124 | } | 124 | } |
| 125 | } | 125 | } |
| 126 | 126 | ||
| @@ -221,7 +221,7 @@ static int cm32181_read_raw(struct iio_dev *indio_dev, | |||
| 221 | *val = cm32181->calibscale; | 221 | *val = cm32181->calibscale; |
| 222 | return IIO_VAL_INT; | 222 | return IIO_VAL_INT; |
| 223 | case IIO_CHAN_INFO_INT_TIME: | 223 | case IIO_CHAN_INFO_INT_TIME: |
| 224 | ret = cm32181_read_als_it(cm32181, val); | 224 | ret = cm32181_read_als_it(cm32181, val2); |
| 225 | return ret; | 225 | return ret; |
| 226 | } | 226 | } |
| 227 | 227 | ||
| @@ -240,7 +240,7 @@ static int cm32181_write_raw(struct iio_dev *indio_dev, | |||
| 240 | cm32181->calibscale = val; | 240 | cm32181->calibscale = val; |
| 241 | return val; | 241 | return val; |
| 242 | case IIO_CHAN_INFO_INT_TIME: | 242 | case IIO_CHAN_INFO_INT_TIME: |
| 243 | ret = cm32181_write_als_it(cm32181, val); | 243 | ret = cm32181_write_als_it(cm32181, val2); |
| 244 | return ret; | 244 | return ret; |
| 245 | } | 245 | } |
| 246 | 246 | ||
| @@ -264,7 +264,7 @@ static ssize_t cm32181_get_it_available(struct device *dev, | |||
| 264 | 264 | ||
| 265 | n = ARRAY_SIZE(als_it_value); | 265 | n = ARRAY_SIZE(als_it_value); |
| 266 | for (i = 0, len = 0; i < n; i++) | 266 | for (i = 0, len = 0; i < n; i++) |
| 267 | len += sprintf(buf + len, "%d ", als_it_value[i]); | 267 | len += sprintf(buf + len, "0.%06u ", als_it_value[i]); |
| 268 | return len + sprintf(buf + len, "\n"); | 268 | return len + sprintf(buf + len, "\n"); |
| 269 | } | 269 | } |
| 270 | 270 | ||
diff --git a/drivers/iio/light/cm36651.c b/drivers/iio/light/cm36651.c index 0a142af83e25..a45e07492db3 100644 --- a/drivers/iio/light/cm36651.c +++ b/drivers/iio/light/cm36651.c | |||
| @@ -50,10 +50,10 @@ | |||
| 50 | #define CM36651_CS_CONF2_DEFAULT_BIT 0x08 | 50 | #define CM36651_CS_CONF2_DEFAULT_BIT 0x08 |
| 51 | 51 | ||
| 52 | /* CS_CONF3 channel integration time */ | 52 | /* CS_CONF3 channel integration time */ |
| 53 | #define CM36651_CS_IT1 0x00 /* Integration time 80000 usec */ | 53 | #define CM36651_CS_IT1 0x00 /* Integration time 80 msec */ |
| 54 | #define CM36651_CS_IT2 0x40 /* Integration time 160000 usec */ | 54 | #define CM36651_CS_IT2 0x40 /* Integration time 160 msec */ |
| 55 | #define CM36651_CS_IT3 0x80 /* Integration time 320000 usec */ | 55 | #define CM36651_CS_IT3 0x80 /* Integration time 320 msec */ |
| 56 | #define CM36651_CS_IT4 0xC0 /* Integration time 640000 usec */ | 56 | #define CM36651_CS_IT4 0xC0 /* Integration time 640 msec */ |
| 57 | 57 | ||
| 58 | /* PS_CONF1 command code */ | 58 | /* PS_CONF1 command code */ |
| 59 | #define CM36651_PS_ENABLE 0x00 | 59 | #define CM36651_PS_ENABLE 0x00 |
| @@ -64,10 +64,10 @@ | |||
| 64 | #define CM36651_PS_PERS4 0x0C | 64 | #define CM36651_PS_PERS4 0x0C |
| 65 | 65 | ||
| 66 | /* PS_CONF1 command code: integration time */ | 66 | /* PS_CONF1 command code: integration time */ |
| 67 | #define CM36651_PS_IT1 0x00 /* Integration time 320 usec */ | 67 | #define CM36651_PS_IT1 0x00 /* Integration time 0.32 msec */ |
| 68 | #define CM36651_PS_IT2 0x10 /* Integration time 420 usec */ | 68 | #define CM36651_PS_IT2 0x10 /* Integration time 0.42 msec */ |
| 69 | #define CM36651_PS_IT3 0x20 /* Integration time 520 usec */ | 69 | #define CM36651_PS_IT3 0x20 /* Integration time 0.52 msec */ |
| 70 | #define CM36651_PS_IT4 0x30 /* Integration time 640 usec */ | 70 | #define CM36651_PS_IT4 0x30 /* Integration time 0.64 msec */ |
| 71 | 71 | ||
| 72 | /* PS_CONF1 command code: duty ratio */ | 72 | /* PS_CONF1 command code: duty ratio */ |
| 73 | #define CM36651_PS_DR1 0x00 /* Duty ratio 1/80 */ | 73 | #define CM36651_PS_DR1 0x00 /* Duty ratio 1/80 */ |
| @@ -93,8 +93,8 @@ | |||
| 93 | #define CM36651_CLOSE_PROXIMITY 0x32 | 93 | #define CM36651_CLOSE_PROXIMITY 0x32 |
| 94 | #define CM36651_FAR_PROXIMITY 0x33 | 94 | #define CM36651_FAR_PROXIMITY 0x33 |
| 95 | 95 | ||
| 96 | #define CM36651_CS_INT_TIME_AVAIL "80000 160000 320000 640000" | 96 | #define CM36651_CS_INT_TIME_AVAIL "0.08 0.16 0.32 0.64" |
| 97 | #define CM36651_PS_INT_TIME_AVAIL "320 420 520 640" | 97 | #define CM36651_PS_INT_TIME_AVAIL "0.000320 0.000420 0.000520 0.000640" |
| 98 | 98 | ||
| 99 | enum cm36651_operation_mode { | 99 | enum cm36651_operation_mode { |
| 100 | CM36651_LIGHT_EN, | 100 | CM36651_LIGHT_EN, |
| @@ -356,30 +356,30 @@ static int cm36651_read_channel(struct cm36651_data *cm36651, | |||
| 356 | } | 356 | } |
| 357 | 357 | ||
| 358 | static int cm36651_read_int_time(struct cm36651_data *cm36651, | 358 | static int cm36651_read_int_time(struct cm36651_data *cm36651, |
| 359 | struct iio_chan_spec const *chan, int *val) | 359 | struct iio_chan_spec const *chan, int *val2) |
| 360 | { | 360 | { |
| 361 | switch (chan->type) { | 361 | switch (chan->type) { |
| 362 | case IIO_LIGHT: | 362 | case IIO_LIGHT: |
| 363 | if (cm36651->cs_int_time[chan->address] == CM36651_CS_IT1) | 363 | if (cm36651->cs_int_time[chan->address] == CM36651_CS_IT1) |
| 364 | *val = 80000; | 364 | *val2 = 80000; |
| 365 | else if (cm36651->cs_int_time[chan->address] == CM36651_CS_IT2) | 365 | else if (cm36651->cs_int_time[chan->address] == CM36651_CS_IT2) |
| 366 | *val = 160000; | 366 | *val2 = 160000; |
| 367 | else if (cm36651->cs_int_time[chan->address] == CM36651_CS_IT3) | 367 | else if (cm36651->cs_int_time[chan->address] == CM36651_CS_IT3) |
| 368 | *val = 320000; | 368 | *val2 = 320000; |
| 369 | else if (cm36651->cs_int_time[chan->address] == CM36651_CS_IT4) | 369 | else if (cm36651->cs_int_time[chan->address] == CM36651_CS_IT4) |
| 370 | *val = 640000; | 370 | *val2 = 640000; |
| 371 | else | 371 | else |
| 372 | return -EINVAL; | 372 | return -EINVAL; |
| 373 | break; | 373 | break; |
| 374 | case IIO_PROXIMITY: | 374 | case IIO_PROXIMITY: |
| 375 | if (cm36651->ps_int_time == CM36651_PS_IT1) | 375 | if (cm36651->ps_int_time == CM36651_PS_IT1) |
| 376 | *val = 320; | 376 | *val2 = 320; |
| 377 | else if (cm36651->ps_int_time == CM36651_PS_IT2) | 377 | else if (cm36651->ps_int_time == CM36651_PS_IT2) |
| 378 | *val = 420; | 378 | *val2 = 420; |
| 379 | else if (cm36651->ps_int_time == CM36651_PS_IT3) | 379 | else if (cm36651->ps_int_time == CM36651_PS_IT3) |
| 380 | *val = 520; | 380 | *val2 = 520; |
| 381 | else if (cm36651->ps_int_time == CM36651_PS_IT4) | 381 | else if (cm36651->ps_int_time == CM36651_PS_IT4) |
| 382 | *val = 640; | 382 | *val2 = 640; |
| 383 | else | 383 | else |
| 384 | return -EINVAL; | 384 | return -EINVAL; |
| 385 | break; | 385 | break; |
| @@ -387,7 +387,7 @@ static int cm36651_read_int_time(struct cm36651_data *cm36651, | |||
| 387 | return -EINVAL; | 387 | return -EINVAL; |
| 388 | } | 388 | } |
| 389 | 389 | ||
| 390 | return IIO_VAL_INT; | 390 | return IIO_VAL_INT_PLUS_MICRO; |
| 391 | } | 391 | } |
| 392 | 392 | ||
| 393 | static int cm36651_write_int_time(struct cm36651_data *cm36651, | 393 | static int cm36651_write_int_time(struct cm36651_data *cm36651, |
| @@ -459,7 +459,8 @@ static int cm36651_read_raw(struct iio_dev *indio_dev, | |||
| 459 | ret = cm36651_read_channel(cm36651, chan, val); | 459 | ret = cm36651_read_channel(cm36651, chan, val); |
| 460 | break; | 460 | break; |
| 461 | case IIO_CHAN_INFO_INT_TIME: | 461 | case IIO_CHAN_INFO_INT_TIME: |
| 462 | ret = cm36651_read_int_time(cm36651, chan, val); | 462 | *val = 0; |
| 463 | ret = cm36651_read_int_time(cm36651, chan, val2); | ||
| 463 | break; | 464 | break; |
| 464 | default: | 465 | default: |
| 465 | ret = -EINVAL; | 466 | ret = -EINVAL; |
| @@ -479,7 +480,7 @@ static int cm36651_write_raw(struct iio_dev *indio_dev, | |||
| 479 | int ret = -EINVAL; | 480 | int ret = -EINVAL; |
| 480 | 481 | ||
| 481 | if (mask == IIO_CHAN_INFO_INT_TIME) { | 482 | if (mask == IIO_CHAN_INFO_INT_TIME) { |
| 482 | ret = cm36651_write_int_time(cm36651, chan, val); | 483 | ret = cm36651_write_int_time(cm36651, chan, val2); |
| 483 | if (ret < 0) | 484 | if (ret < 0) |
| 484 | dev_err(&client->dev, "Integration time write failed\n"); | 485 | dev_err(&client->dev, "Integration time write failed\n"); |
| 485 | } | 486 | } |
diff --git a/drivers/input/misc/arizona-haptics.c b/drivers/input/misc/arizona-haptics.c index 7a04f54ef961..ef2e281b0a43 100644 --- a/drivers/input/misc/arizona-haptics.c +++ b/drivers/input/misc/arizona-haptics.c | |||
| @@ -37,7 +37,6 @@ static void arizona_haptics_work(struct work_struct *work) | |||
| 37 | struct arizona_haptics, | 37 | struct arizona_haptics, |
| 38 | work); | 38 | work); |
| 39 | struct arizona *arizona = haptics->arizona; | 39 | struct arizona *arizona = haptics->arizona; |
| 40 | struct mutex *dapm_mutex = &arizona->dapm->card->dapm_mutex; | ||
| 41 | int ret; | 40 | int ret; |
| 42 | 41 | ||
| 43 | if (!haptics->arizona->dapm) { | 42 | if (!haptics->arizona->dapm) { |
| @@ -67,13 +66,10 @@ static void arizona_haptics_work(struct work_struct *work) | |||
| 67 | return; | 66 | return; |
| 68 | } | 67 | } |
| 69 | 68 | ||
| 70 | mutex_lock_nested(dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME); | ||
| 71 | |||
| 72 | ret = snd_soc_dapm_enable_pin(arizona->dapm, "HAPTICS"); | 69 | ret = snd_soc_dapm_enable_pin(arizona->dapm, "HAPTICS"); |
| 73 | if (ret != 0) { | 70 | if (ret != 0) { |
| 74 | dev_err(arizona->dev, "Failed to start HAPTICS: %d\n", | 71 | dev_err(arizona->dev, "Failed to start HAPTICS: %d\n", |
| 75 | ret); | 72 | ret); |
| 76 | mutex_unlock(dapm_mutex); | ||
| 77 | return; | 73 | return; |
| 78 | } | 74 | } |
| 79 | 75 | ||
| @@ -81,21 +77,14 @@ static void arizona_haptics_work(struct work_struct *work) | |||
| 81 | if (ret != 0) { | 77 | if (ret != 0) { |
| 82 | dev_err(arizona->dev, "Failed to sync DAPM: %d\n", | 78 | dev_err(arizona->dev, "Failed to sync DAPM: %d\n", |
| 83 | ret); | 79 | ret); |
| 84 | mutex_unlock(dapm_mutex); | ||
| 85 | return; | 80 | return; |
| 86 | } | 81 | } |
| 87 | |||
| 88 | mutex_unlock(dapm_mutex); | ||
| 89 | |||
| 90 | } else { | 82 | } else { |
| 91 | /* This disable sequence will be a noop if already enabled */ | 83 | /* This disable sequence will be a noop if already enabled */ |
| 92 | mutex_lock_nested(dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME); | ||
| 93 | |||
| 94 | ret = snd_soc_dapm_disable_pin(arizona->dapm, "HAPTICS"); | 84 | ret = snd_soc_dapm_disable_pin(arizona->dapm, "HAPTICS"); |
| 95 | if (ret != 0) { | 85 | if (ret != 0) { |
| 96 | dev_err(arizona->dev, "Failed to disable HAPTICS: %d\n", | 86 | dev_err(arizona->dev, "Failed to disable HAPTICS: %d\n", |
| 97 | ret); | 87 | ret); |
| 98 | mutex_unlock(dapm_mutex); | ||
| 99 | return; | 88 | return; |
| 100 | } | 89 | } |
| 101 | 90 | ||
| @@ -103,12 +92,9 @@ static void arizona_haptics_work(struct work_struct *work) | |||
| 103 | if (ret != 0) { | 92 | if (ret != 0) { |
| 104 | dev_err(arizona->dev, "Failed to sync DAPM: %d\n", | 93 | dev_err(arizona->dev, "Failed to sync DAPM: %d\n", |
| 105 | ret); | 94 | ret); |
| 106 | mutex_unlock(dapm_mutex); | ||
| 107 | return; | 95 | return; |
| 108 | } | 96 | } |
| 109 | 97 | ||
| 110 | mutex_unlock(dapm_mutex); | ||
| 111 | |||
| 112 | ret = regmap_update_bits(arizona->regmap, | 98 | ret = regmap_update_bits(arizona->regmap, |
| 113 | ARIZONA_HAPTICS_CONTROL_1, | 99 | ARIZONA_HAPTICS_CONTROL_1, |
| 114 | ARIZONA_HAP_CTRL_MASK, | 100 | ARIZONA_HAP_CTRL_MASK, |
| @@ -155,16 +141,11 @@ static int arizona_haptics_play(struct input_dev *input, void *data, | |||
| 155 | static void arizona_haptics_close(struct input_dev *input) | 141 | static void arizona_haptics_close(struct input_dev *input) |
| 156 | { | 142 | { |
| 157 | struct arizona_haptics *haptics = input_get_drvdata(input); | 143 | struct arizona_haptics *haptics = input_get_drvdata(input); |
| 158 | struct mutex *dapm_mutex = &haptics->arizona->dapm->card->dapm_mutex; | ||
| 159 | 144 | ||
| 160 | cancel_work_sync(&haptics->work); | 145 | cancel_work_sync(&haptics->work); |
| 161 | 146 | ||
| 162 | mutex_lock_nested(dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME); | ||
| 163 | |||
| 164 | if (haptics->arizona->dapm) | 147 | if (haptics->arizona->dapm) |
| 165 | snd_soc_dapm_disable_pin(haptics->arizona->dapm, "HAPTICS"); | 148 | snd_soc_dapm_disable_pin(haptics->arizona->dapm, "HAPTICS"); |
| 166 | |||
| 167 | mutex_unlock(dapm_mutex); | ||
| 168 | } | 149 | } |
| 169 | 150 | ||
| 170 | static int arizona_haptics_probe(struct platform_device *pdev) | 151 | static int arizona_haptics_probe(struct platform_device *pdev) |
diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c index 8911850c9444..1d9ab39af29f 100644 --- a/drivers/iommu/arm-smmu.c +++ b/drivers/iommu/arm-smmu.c | |||
| @@ -79,7 +79,6 @@ | |||
| 79 | 79 | ||
| 80 | #define ARM_SMMU_PTE_CONT_SIZE (PAGE_SIZE * ARM_SMMU_PTE_CONT_ENTRIES) | 80 | #define ARM_SMMU_PTE_CONT_SIZE (PAGE_SIZE * ARM_SMMU_PTE_CONT_ENTRIES) |
| 81 | #define ARM_SMMU_PTE_CONT_MASK (~(ARM_SMMU_PTE_CONT_SIZE - 1)) | 81 | #define ARM_SMMU_PTE_CONT_MASK (~(ARM_SMMU_PTE_CONT_SIZE - 1)) |
| 82 | #define ARM_SMMU_PTE_HWTABLE_SIZE (PTRS_PER_PTE * sizeof(pte_t)) | ||
| 83 | 82 | ||
| 84 | /* Stage-1 PTE */ | 83 | /* Stage-1 PTE */ |
| 85 | #define ARM_SMMU_PTE_AP_UNPRIV (((pteval_t)1) << 6) | 84 | #define ARM_SMMU_PTE_AP_UNPRIV (((pteval_t)1) << 6) |
| @@ -191,6 +190,9 @@ | |||
| 191 | #define ARM_SMMU_GR1_CBAR(n) (0x0 + ((n) << 2)) | 190 | #define ARM_SMMU_GR1_CBAR(n) (0x0 + ((n) << 2)) |
| 192 | #define CBAR_VMID_SHIFT 0 | 191 | #define CBAR_VMID_SHIFT 0 |
| 193 | #define CBAR_VMID_MASK 0xff | 192 | #define CBAR_VMID_MASK 0xff |
| 193 | #define CBAR_S1_BPSHCFG_SHIFT 8 | ||
| 194 | #define CBAR_S1_BPSHCFG_MASK 3 | ||
| 195 | #define CBAR_S1_BPSHCFG_NSH 3 | ||
| 194 | #define CBAR_S1_MEMATTR_SHIFT 12 | 196 | #define CBAR_S1_MEMATTR_SHIFT 12 |
| 195 | #define CBAR_S1_MEMATTR_MASK 0xf | 197 | #define CBAR_S1_MEMATTR_MASK 0xf |
| 196 | #define CBAR_S1_MEMATTR_WB 0xf | 198 | #define CBAR_S1_MEMATTR_WB 0xf |
| @@ -393,7 +395,7 @@ struct arm_smmu_domain { | |||
| 393 | struct arm_smmu_cfg root_cfg; | 395 | struct arm_smmu_cfg root_cfg; |
| 394 | phys_addr_t output_mask; | 396 | phys_addr_t output_mask; |
| 395 | 397 | ||
| 396 | struct mutex lock; | 398 | spinlock_t lock; |
| 397 | }; | 399 | }; |
| 398 | 400 | ||
| 399 | static DEFINE_SPINLOCK(arm_smmu_devices_lock); | 401 | static DEFINE_SPINLOCK(arm_smmu_devices_lock); |
| @@ -632,6 +634,28 @@ static irqreturn_t arm_smmu_global_fault(int irq, void *dev) | |||
| 632 | return IRQ_HANDLED; | 634 | return IRQ_HANDLED; |
| 633 | } | 635 | } |
| 634 | 636 | ||
| 637 | static void arm_smmu_flush_pgtable(struct arm_smmu_device *smmu, void *addr, | ||
| 638 | size_t size) | ||
| 639 | { | ||
| 640 | unsigned long offset = (unsigned long)addr & ~PAGE_MASK; | ||
| 641 | |||
| 642 | |||
| 643 | /* Ensure new page tables are visible to the hardware walker */ | ||
| 644 | if (smmu->features & ARM_SMMU_FEAT_COHERENT_WALK) { | ||
| 645 | dsb(); | ||
| 646 | } else { | ||
| 647 | /* | ||
| 648 | * If the SMMU can't walk tables in the CPU caches, treat them | ||
| 649 | * like non-coherent DMA since we need to flush the new entries | ||
| 650 | * all the way out to memory. There's no possibility of | ||
| 651 | * recursion here as the SMMU table walker will not be wired | ||
| 652 | * through another SMMU. | ||
| 653 | */ | ||
| 654 | dma_map_page(smmu->dev, virt_to_page(addr), offset, size, | ||
| 655 | DMA_TO_DEVICE); | ||
| 656 | } | ||
| 657 | } | ||
| 658 | |||
| 635 | static void arm_smmu_init_context_bank(struct arm_smmu_domain *smmu_domain) | 659 | static void arm_smmu_init_context_bank(struct arm_smmu_domain *smmu_domain) |
| 636 | { | 660 | { |
| 637 | u32 reg; | 661 | u32 reg; |
| @@ -650,11 +674,16 @@ static void arm_smmu_init_context_bank(struct arm_smmu_domain *smmu_domain) | |||
| 650 | if (smmu->version == 1) | 674 | if (smmu->version == 1) |
| 651 | reg |= root_cfg->irptndx << CBAR_IRPTNDX_SHIFT; | 675 | reg |= root_cfg->irptndx << CBAR_IRPTNDX_SHIFT; |
| 652 | 676 | ||
| 653 | /* Use the weakest memory type, so it is overridden by the pte */ | 677 | /* |
| 654 | if (stage1) | 678 | * Use the weakest shareability/memory types, so they are |
| 655 | reg |= (CBAR_S1_MEMATTR_WB << CBAR_S1_MEMATTR_SHIFT); | 679 | * overridden by the ttbcr/pte. |
| 656 | else | 680 | */ |
| 681 | if (stage1) { | ||
| 682 | reg |= (CBAR_S1_BPSHCFG_NSH << CBAR_S1_BPSHCFG_SHIFT) | | ||
| 683 | (CBAR_S1_MEMATTR_WB << CBAR_S1_MEMATTR_SHIFT); | ||
| 684 | } else { | ||
| 657 | reg |= ARM_SMMU_CB_VMID(root_cfg) << CBAR_VMID_SHIFT; | 685 | reg |= ARM_SMMU_CB_VMID(root_cfg) << CBAR_VMID_SHIFT; |
| 686 | } | ||
| 658 | writel_relaxed(reg, gr1_base + ARM_SMMU_GR1_CBAR(root_cfg->cbndx)); | 687 | writel_relaxed(reg, gr1_base + ARM_SMMU_GR1_CBAR(root_cfg->cbndx)); |
| 659 | 688 | ||
| 660 | if (smmu->version > 1) { | 689 | if (smmu->version > 1) { |
| @@ -715,6 +744,8 @@ static void arm_smmu_init_context_bank(struct arm_smmu_domain *smmu_domain) | |||
| 715 | } | 744 | } |
| 716 | 745 | ||
| 717 | /* TTBR0 */ | 746 | /* TTBR0 */ |
| 747 | arm_smmu_flush_pgtable(smmu, root_cfg->pgd, | ||
| 748 | PTRS_PER_PGD * sizeof(pgd_t)); | ||
| 718 | reg = __pa(root_cfg->pgd); | 749 | reg = __pa(root_cfg->pgd); |
| 719 | writel_relaxed(reg, cb_base + ARM_SMMU_CB_TTBR0_LO); | 750 | writel_relaxed(reg, cb_base + ARM_SMMU_CB_TTBR0_LO); |
| 720 | reg = (phys_addr_t)__pa(root_cfg->pgd) >> 32; | 751 | reg = (phys_addr_t)__pa(root_cfg->pgd) >> 32; |
| @@ -901,7 +932,7 @@ static int arm_smmu_domain_init(struct iommu_domain *domain) | |||
| 901 | goto out_free_domain; | 932 | goto out_free_domain; |
| 902 | smmu_domain->root_cfg.pgd = pgd; | 933 | smmu_domain->root_cfg.pgd = pgd; |
| 903 | 934 | ||
| 904 | mutex_init(&smmu_domain->lock); | 935 | spin_lock_init(&smmu_domain->lock); |
| 905 | domain->priv = smmu_domain; | 936 | domain->priv = smmu_domain; |
| 906 | return 0; | 937 | return 0; |
| 907 | 938 | ||
| @@ -1128,6 +1159,7 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev) | |||
| 1128 | struct arm_smmu_domain *smmu_domain = domain->priv; | 1159 | struct arm_smmu_domain *smmu_domain = domain->priv; |
| 1129 | struct arm_smmu_device *device_smmu = dev->archdata.iommu; | 1160 | struct arm_smmu_device *device_smmu = dev->archdata.iommu; |
| 1130 | struct arm_smmu_master *master; | 1161 | struct arm_smmu_master *master; |
| 1162 | unsigned long flags; | ||
| 1131 | 1163 | ||
| 1132 | if (!device_smmu) { | 1164 | if (!device_smmu) { |
| 1133 | dev_err(dev, "cannot attach to SMMU, is it on the same bus?\n"); | 1165 | dev_err(dev, "cannot attach to SMMU, is it on the same bus?\n"); |
| @@ -1138,7 +1170,7 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev) | |||
| 1138 | * Sanity check the domain. We don't currently support domains | 1170 | * Sanity check the domain. We don't currently support domains |
| 1139 | * that cross between different SMMU chains. | 1171 | * that cross between different SMMU chains. |
| 1140 | */ | 1172 | */ |
| 1141 | mutex_lock(&smmu_domain->lock); | 1173 | spin_lock_irqsave(&smmu_domain->lock, flags); |
| 1142 | if (!smmu_domain->leaf_smmu) { | 1174 | if (!smmu_domain->leaf_smmu) { |
| 1143 | /* Now that we have a master, we can finalise the domain */ | 1175 | /* Now that we have a master, we can finalise the domain */ |
| 1144 | ret = arm_smmu_init_domain_context(domain, dev); | 1176 | ret = arm_smmu_init_domain_context(domain, dev); |
| @@ -1153,7 +1185,7 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev) | |||
| 1153 | dev_name(device_smmu->dev)); | 1185 | dev_name(device_smmu->dev)); |
| 1154 | goto err_unlock; | 1186 | goto err_unlock; |
| 1155 | } | 1187 | } |
| 1156 | mutex_unlock(&smmu_domain->lock); | 1188 | spin_unlock_irqrestore(&smmu_domain->lock, flags); |
| 1157 | 1189 | ||
| 1158 | /* Looks ok, so add the device to the domain */ | 1190 | /* Looks ok, so add the device to the domain */ |
| 1159 | master = find_smmu_master(smmu_domain->leaf_smmu, dev->of_node); | 1191 | master = find_smmu_master(smmu_domain->leaf_smmu, dev->of_node); |
| @@ -1163,7 +1195,7 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev) | |||
| 1163 | return arm_smmu_domain_add_master(smmu_domain, master); | 1195 | return arm_smmu_domain_add_master(smmu_domain, master); |
| 1164 | 1196 | ||
| 1165 | err_unlock: | 1197 | err_unlock: |
| 1166 | mutex_unlock(&smmu_domain->lock); | 1198 | spin_unlock_irqrestore(&smmu_domain->lock, flags); |
| 1167 | return ret; | 1199 | return ret; |
| 1168 | } | 1200 | } |
| 1169 | 1201 | ||
| @@ -1177,23 +1209,6 @@ static void arm_smmu_detach_dev(struct iommu_domain *domain, struct device *dev) | |||
| 1177 | arm_smmu_domain_remove_master(smmu_domain, master); | 1209 | arm_smmu_domain_remove_master(smmu_domain, master); |
| 1178 | } | 1210 | } |
| 1179 | 1211 | ||
| 1180 | static void arm_smmu_flush_pgtable(struct arm_smmu_device *smmu, void *addr, | ||
| 1181 | size_t size) | ||
| 1182 | { | ||
| 1183 | unsigned long offset = (unsigned long)addr & ~PAGE_MASK; | ||
| 1184 | |||
| 1185 | /* | ||
| 1186 | * If the SMMU can't walk tables in the CPU caches, treat them | ||
| 1187 | * like non-coherent DMA since we need to flush the new entries | ||
| 1188 | * all the way out to memory. There's no possibility of recursion | ||
| 1189 | * here as the SMMU table walker will not be wired through another | ||
| 1190 | * SMMU. | ||
| 1191 | */ | ||
| 1192 | if (!(smmu->features & ARM_SMMU_FEAT_COHERENT_WALK)) | ||
| 1193 | dma_map_page(smmu->dev, virt_to_page(addr), offset, size, | ||
| 1194 | DMA_TO_DEVICE); | ||
| 1195 | } | ||
| 1196 | |||
| 1197 | static bool arm_smmu_pte_is_contiguous_range(unsigned long addr, | 1212 | static bool arm_smmu_pte_is_contiguous_range(unsigned long addr, |
| 1198 | unsigned long end) | 1213 | unsigned long end) |
| 1199 | { | 1214 | { |
| @@ -1210,12 +1225,11 @@ static int arm_smmu_alloc_init_pte(struct arm_smmu_device *smmu, pmd_t *pmd, | |||
| 1210 | 1225 | ||
| 1211 | if (pmd_none(*pmd)) { | 1226 | if (pmd_none(*pmd)) { |
| 1212 | /* Allocate a new set of tables */ | 1227 | /* Allocate a new set of tables */ |
| 1213 | pgtable_t table = alloc_page(PGALLOC_GFP); | 1228 | pgtable_t table = alloc_page(GFP_ATOMIC|__GFP_ZERO); |
| 1214 | if (!table) | 1229 | if (!table) |
| 1215 | return -ENOMEM; | 1230 | return -ENOMEM; |
| 1216 | 1231 | ||
| 1217 | arm_smmu_flush_pgtable(smmu, page_address(table), | 1232 | arm_smmu_flush_pgtable(smmu, page_address(table), PAGE_SIZE); |
| 1218 | ARM_SMMU_PTE_HWTABLE_SIZE); | ||
| 1219 | if (!pgtable_page_ctor(table)) { | 1233 | if (!pgtable_page_ctor(table)) { |
| 1220 | __free_page(table); | 1234 | __free_page(table); |
| 1221 | return -ENOMEM; | 1235 | return -ENOMEM; |
| @@ -1317,9 +1331,15 @@ static int arm_smmu_alloc_init_pmd(struct arm_smmu_device *smmu, pud_t *pud, | |||
| 1317 | 1331 | ||
| 1318 | #ifndef __PAGETABLE_PMD_FOLDED | 1332 | #ifndef __PAGETABLE_PMD_FOLDED |
| 1319 | if (pud_none(*pud)) { | 1333 | if (pud_none(*pud)) { |
| 1320 | pmd = pmd_alloc_one(NULL, addr); | 1334 | pmd = (pmd_t *)get_zeroed_page(GFP_ATOMIC); |
| 1321 | if (!pmd) | 1335 | if (!pmd) |
| 1322 | return -ENOMEM; | 1336 | return -ENOMEM; |
| 1337 | |||
| 1338 | arm_smmu_flush_pgtable(smmu, pmd, PAGE_SIZE); | ||
| 1339 | pud_populate(NULL, pud, pmd); | ||
| 1340 | arm_smmu_flush_pgtable(smmu, pud, sizeof(*pud)); | ||
| 1341 | |||
| 1342 | pmd += pmd_index(addr); | ||
| 1323 | } else | 1343 | } else |
| 1324 | #endif | 1344 | #endif |
| 1325 | pmd = pmd_offset(pud, addr); | 1345 | pmd = pmd_offset(pud, addr); |
| @@ -1328,8 +1348,6 @@ static int arm_smmu_alloc_init_pmd(struct arm_smmu_device *smmu, pud_t *pud, | |||
| 1328 | next = pmd_addr_end(addr, end); | 1348 | next = pmd_addr_end(addr, end); |
| 1329 | ret = arm_smmu_alloc_init_pte(smmu, pmd, addr, end, pfn, | 1349 | ret = arm_smmu_alloc_init_pte(smmu, pmd, addr, end, pfn, |
| 1330 | flags, stage); | 1350 | flags, stage); |
| 1331 | pud_populate(NULL, pud, pmd); | ||
| 1332 | arm_smmu_flush_pgtable(smmu, pud, sizeof(*pud)); | ||
| 1333 | phys += next - addr; | 1351 | phys += next - addr; |
| 1334 | } while (pmd++, addr = next, addr < end); | 1352 | } while (pmd++, addr = next, addr < end); |
| 1335 | 1353 | ||
| @@ -1346,9 +1364,15 @@ static int arm_smmu_alloc_init_pud(struct arm_smmu_device *smmu, pgd_t *pgd, | |||
| 1346 | 1364 | ||
| 1347 | #ifndef __PAGETABLE_PUD_FOLDED | 1365 | #ifndef __PAGETABLE_PUD_FOLDED |
| 1348 | if (pgd_none(*pgd)) { | 1366 | if (pgd_none(*pgd)) { |
| 1349 | pud = pud_alloc_one(NULL, addr); | 1367 | pud = (pud_t *)get_zeroed_page(GFP_ATOMIC); |
| 1350 | if (!pud) | 1368 | if (!pud) |
| 1351 | return -ENOMEM; | 1369 | return -ENOMEM; |
| 1370 | |||
| 1371 | arm_smmu_flush_pgtable(smmu, pud, PAGE_SIZE); | ||
| 1372 | pgd_populate(NULL, pgd, pud); | ||
| 1373 | arm_smmu_flush_pgtable(smmu, pgd, sizeof(*pgd)); | ||
| 1374 | |||
| 1375 | pud += pud_index(addr); | ||
| 1352 | } else | 1376 | } else |
| 1353 | #endif | 1377 | #endif |
| 1354 | pud = pud_offset(pgd, addr); | 1378 | pud = pud_offset(pgd, addr); |
| @@ -1357,8 +1381,6 @@ static int arm_smmu_alloc_init_pud(struct arm_smmu_device *smmu, pgd_t *pgd, | |||
| 1357 | next = pud_addr_end(addr, end); | 1381 | next = pud_addr_end(addr, end); |
| 1358 | ret = arm_smmu_alloc_init_pmd(smmu, pud, addr, next, phys, | 1382 | ret = arm_smmu_alloc_init_pmd(smmu, pud, addr, next, phys, |
| 1359 | flags, stage); | 1383 | flags, stage); |
| 1360 | pgd_populate(NULL, pud, pgd); | ||
| 1361 | arm_smmu_flush_pgtable(smmu, pgd, sizeof(*pgd)); | ||
| 1362 | phys += next - addr; | 1384 | phys += next - addr; |
| 1363 | } while (pud++, addr = next, addr < end); | 1385 | } while (pud++, addr = next, addr < end); |
| 1364 | 1386 | ||
| @@ -1375,6 +1397,7 @@ static int arm_smmu_handle_mapping(struct arm_smmu_domain *smmu_domain, | |||
| 1375 | struct arm_smmu_cfg *root_cfg = &smmu_domain->root_cfg; | 1397 | struct arm_smmu_cfg *root_cfg = &smmu_domain->root_cfg; |
| 1376 | pgd_t *pgd = root_cfg->pgd; | 1398 | pgd_t *pgd = root_cfg->pgd; |
| 1377 | struct arm_smmu_device *smmu = root_cfg->smmu; | 1399 | struct arm_smmu_device *smmu = root_cfg->smmu; |
| 1400 | unsigned long irqflags; | ||
| 1378 | 1401 | ||
| 1379 | if (root_cfg->cbar == CBAR_TYPE_S2_TRANS) { | 1402 | if (root_cfg->cbar == CBAR_TYPE_S2_TRANS) { |
| 1380 | stage = 2; | 1403 | stage = 2; |
| @@ -1397,7 +1420,7 @@ static int arm_smmu_handle_mapping(struct arm_smmu_domain *smmu_domain, | |||
| 1397 | if (paddr & ~output_mask) | 1420 | if (paddr & ~output_mask) |
| 1398 | return -ERANGE; | 1421 | return -ERANGE; |
| 1399 | 1422 | ||
| 1400 | mutex_lock(&smmu_domain->lock); | 1423 | spin_lock_irqsave(&smmu_domain->lock, irqflags); |
| 1401 | pgd += pgd_index(iova); | 1424 | pgd += pgd_index(iova); |
| 1402 | end = iova + size; | 1425 | end = iova + size; |
| 1403 | do { | 1426 | do { |
| @@ -1413,11 +1436,7 @@ static int arm_smmu_handle_mapping(struct arm_smmu_domain *smmu_domain, | |||
| 1413 | } while (pgd++, iova != end); | 1436 | } while (pgd++, iova != end); |
| 1414 | 1437 | ||
| 1415 | out_unlock: | 1438 | out_unlock: |
| 1416 | mutex_unlock(&smmu_domain->lock); | 1439 | spin_unlock_irqrestore(&smmu_domain->lock, irqflags); |
| 1417 | |||
| 1418 | /* Ensure new page tables are visible to the hardware walker */ | ||
| 1419 | if (smmu->features & ARM_SMMU_FEAT_COHERENT_WALK) | ||
| 1420 | dsb(); | ||
| 1421 | 1440 | ||
| 1422 | return ret; | 1441 | return ret; |
| 1423 | } | 1442 | } |
| @@ -1987,8 +2006,10 @@ static int __init arm_smmu_init(void) | |||
| 1987 | if (!iommu_present(&platform_bus_type)) | 2006 | if (!iommu_present(&platform_bus_type)) |
| 1988 | bus_set_iommu(&platform_bus_type, &arm_smmu_ops); | 2007 | bus_set_iommu(&platform_bus_type, &arm_smmu_ops); |
| 1989 | 2008 | ||
| 2009 | #ifdef CONFIG_ARM_AMBA | ||
| 1990 | if (!iommu_present(&amba_bustype)) | 2010 | if (!iommu_present(&amba_bustype)) |
| 1991 | bus_set_iommu(&amba_bustype, &arm_smmu_ops); | 2011 | bus_set_iommu(&amba_bustype, &arm_smmu_ops); |
| 2012 | #endif | ||
| 1992 | 2013 | ||
| 1993 | return 0; | 2014 | return 0; |
| 1994 | } | 2015 | } |
diff --git a/drivers/iommu/omap-iommu-debug.c b/drivers/iommu/omap-iommu-debug.c index d97fbe4fb9b1..80fffba7f12d 100644 --- a/drivers/iommu/omap-iommu-debug.c +++ b/drivers/iommu/omap-iommu-debug.c | |||
| @@ -354,8 +354,8 @@ DEBUG_FOPS(mem); | |||
| 354 | return -ENOMEM; \ | 354 | return -ENOMEM; \ |
| 355 | } | 355 | } |
| 356 | 356 | ||
| 357 | #define DEBUG_ADD_FILE(name) __DEBUG_ADD_FILE(name, 600) | 357 | #define DEBUG_ADD_FILE(name) __DEBUG_ADD_FILE(name, 0600) |
| 358 | #define DEBUG_ADD_FILE_RO(name) __DEBUG_ADD_FILE(name, 400) | 358 | #define DEBUG_ADD_FILE_RO(name) __DEBUG_ADD_FILE(name, 0400) |
| 359 | 359 | ||
| 360 | static int iommu_debug_register(struct device *dev, void *data) | 360 | static int iommu_debug_register(struct device *dev, void *data) |
| 361 | { | 361 | { |
diff --git a/drivers/irqchip/irq-metag-ext.c b/drivers/irqchip/irq-metag-ext.c index 92c41ab4dbfd..2cb474ad8809 100644 --- a/drivers/irqchip/irq-metag-ext.c +++ b/drivers/irqchip/irq-metag-ext.c | |||
| @@ -515,7 +515,7 @@ static int meta_intc_set_affinity(struct irq_data *data, | |||
| 515 | * one cpu (the interrupt code doesn't support it), so we just | 515 | * one cpu (the interrupt code doesn't support it), so we just |
| 516 | * pick the first cpu we find in 'cpumask'. | 516 | * pick the first cpu we find in 'cpumask'. |
| 517 | */ | 517 | */ |
| 518 | cpu = cpumask_any(cpumask); | 518 | cpu = cpumask_any_and(cpumask, cpu_online_mask); |
| 519 | thread = cpu_2_hwthread_id[cpu]; | 519 | thread = cpu_2_hwthread_id[cpu]; |
| 520 | 520 | ||
| 521 | metag_out32(TBI_TRIG_VEC(TBID_SIGNUM_TR2(thread)), vec_addr); | 521 | metag_out32(TBI_TRIG_VEC(TBID_SIGNUM_TR2(thread)), vec_addr); |
diff --git a/drivers/irqchip/irq-metag.c b/drivers/irqchip/irq-metag.c index 8e94d7a3b20d..c16c186d97d3 100644 --- a/drivers/irqchip/irq-metag.c +++ b/drivers/irqchip/irq-metag.c | |||
| @@ -201,7 +201,7 @@ static int metag_internal_irq_set_affinity(struct irq_data *data, | |||
| 201 | * one cpu (the interrupt code doesn't support it), so we just | 201 | * one cpu (the interrupt code doesn't support it), so we just |
| 202 | * pick the first cpu we find in 'cpumask'. | 202 | * pick the first cpu we find in 'cpumask'. |
| 203 | */ | 203 | */ |
| 204 | cpu = cpumask_any(cpumask); | 204 | cpu = cpumask_any_and(cpumask, cpu_online_mask); |
| 205 | thread = cpu_2_hwthread_id[cpu]; | 205 | thread = cpu_2_hwthread_id[cpu]; |
| 206 | 206 | ||
| 207 | metag_out32(TBI_TRIG_VEC(TBID_SIGNUM_TR1(thread)), | 207 | metag_out32(TBI_TRIG_VEC(TBID_SIGNUM_TR1(thread)), |
diff --git a/drivers/irqchip/irq-orion.c b/drivers/irqchip/irq-orion.c index e51d40031884..8e41be62812e 100644 --- a/drivers/irqchip/irq-orion.c +++ b/drivers/irqchip/irq-orion.c | |||
| @@ -111,7 +111,8 @@ IRQCHIP_DECLARE(orion_intc, "marvell,orion-intc", orion_irq_init); | |||
| 111 | static void orion_bridge_irq_handler(unsigned int irq, struct irq_desc *desc) | 111 | static void orion_bridge_irq_handler(unsigned int irq, struct irq_desc *desc) |
| 112 | { | 112 | { |
| 113 | struct irq_domain *d = irq_get_handler_data(irq); | 113 | struct irq_domain *d = irq_get_handler_data(irq); |
| 114 | struct irq_chip_generic *gc = irq_get_domain_generic_chip(d, irq); | 114 | |
| 115 | struct irq_chip_generic *gc = irq_get_domain_generic_chip(d, 0); | ||
| 115 | u32 stat = readl_relaxed(gc->reg_base + ORION_BRIDGE_IRQ_CAUSE) & | 116 | u32 stat = readl_relaxed(gc->reg_base + ORION_BRIDGE_IRQ_CAUSE) & |
| 116 | gc->mask_cache; | 117 | gc->mask_cache; |
| 117 | 118 | ||
| @@ -123,6 +124,19 @@ static void orion_bridge_irq_handler(unsigned int irq, struct irq_desc *desc) | |||
| 123 | } | 124 | } |
| 124 | } | 125 | } |
| 125 | 126 | ||
| 127 | /* | ||
| 128 | * Bridge IRQ_CAUSE is asserted regardless of IRQ_MASK register. | ||
| 129 | * To avoid interrupt events on stale irqs, we clear them before unmask. | ||
| 130 | */ | ||
| 131 | static unsigned int orion_bridge_irq_startup(struct irq_data *d) | ||
| 132 | { | ||
| 133 | struct irq_chip_type *ct = irq_data_get_chip_type(d); | ||
| 134 | |||
| 135 | ct->chip.irq_ack(d); | ||
| 136 | ct->chip.irq_unmask(d); | ||
| 137 | return 0; | ||
| 138 | } | ||
| 139 | |||
| 126 | static int __init orion_bridge_irq_init(struct device_node *np, | 140 | static int __init orion_bridge_irq_init(struct device_node *np, |
| 127 | struct device_node *parent) | 141 | struct device_node *parent) |
| 128 | { | 142 | { |
| @@ -143,7 +157,7 @@ static int __init orion_bridge_irq_init(struct device_node *np, | |||
| 143 | } | 157 | } |
| 144 | 158 | ||
| 145 | ret = irq_alloc_domain_generic_chips(domain, nrirqs, 1, np->name, | 159 | ret = irq_alloc_domain_generic_chips(domain, nrirqs, 1, np->name, |
| 146 | handle_level_irq, clr, 0, IRQ_GC_INIT_MASK_CACHE); | 160 | handle_edge_irq, clr, 0, IRQ_GC_INIT_MASK_CACHE); |
| 147 | if (ret) { | 161 | if (ret) { |
| 148 | pr_err("%s: unable to alloc irq domain gc\n", np->name); | 162 | pr_err("%s: unable to alloc irq domain gc\n", np->name); |
| 149 | return ret; | 163 | return ret; |
| @@ -176,12 +190,14 @@ static int __init orion_bridge_irq_init(struct device_node *np, | |||
| 176 | 190 | ||
| 177 | gc->chip_types[0].regs.ack = ORION_BRIDGE_IRQ_CAUSE; | 191 | gc->chip_types[0].regs.ack = ORION_BRIDGE_IRQ_CAUSE; |
| 178 | gc->chip_types[0].regs.mask = ORION_BRIDGE_IRQ_MASK; | 192 | gc->chip_types[0].regs.mask = ORION_BRIDGE_IRQ_MASK; |
| 193 | gc->chip_types[0].chip.irq_startup = orion_bridge_irq_startup; | ||
| 179 | gc->chip_types[0].chip.irq_ack = irq_gc_ack_clr_bit; | 194 | gc->chip_types[0].chip.irq_ack = irq_gc_ack_clr_bit; |
| 180 | gc->chip_types[0].chip.irq_mask = irq_gc_mask_clr_bit; | 195 | gc->chip_types[0].chip.irq_mask = irq_gc_mask_clr_bit; |
| 181 | gc->chip_types[0].chip.irq_unmask = irq_gc_mask_set_bit; | 196 | gc->chip_types[0].chip.irq_unmask = irq_gc_mask_set_bit; |
| 182 | 197 | ||
| 183 | /* mask all interrupts */ | 198 | /* mask and clear all interrupts */ |
| 184 | writel(0, gc->reg_base + ORION_BRIDGE_IRQ_MASK); | 199 | writel(0, gc->reg_base + ORION_BRIDGE_IRQ_MASK); |
| 200 | writel(0, gc->reg_base + ORION_BRIDGE_IRQ_CAUSE); | ||
| 185 | 201 | ||
| 186 | irq_set_handler_data(irq, domain); | 202 | irq_set_handler_data(irq, domain); |
| 187 | irq_set_chained_handler(irq, orion_bridge_irq_handler); | 203 | irq_set_chained_handler(irq, orion_bridge_irq_handler); |
diff --git a/drivers/md/dm-cache-target.c b/drivers/md/dm-cache-target.c index ffd472e015ca..1af70145fab9 100644 --- a/drivers/md/dm-cache-target.c +++ b/drivers/md/dm-cache-target.c | |||
| @@ -289,6 +289,7 @@ struct per_bio_data { | |||
| 289 | bool tick:1; | 289 | bool tick:1; |
| 290 | unsigned req_nr:2; | 290 | unsigned req_nr:2; |
| 291 | struct dm_deferred_entry *all_io_entry; | 291 | struct dm_deferred_entry *all_io_entry; |
| 292 | struct dm_hook_info hook_info; | ||
| 292 | 293 | ||
| 293 | /* | 294 | /* |
| 294 | * writethrough fields. These MUST remain at the end of this | 295 | * writethrough fields. These MUST remain at the end of this |
| @@ -297,7 +298,6 @@ struct per_bio_data { | |||
| 297 | */ | 298 | */ |
| 298 | struct cache *cache; | 299 | struct cache *cache; |
| 299 | dm_cblock_t cblock; | 300 | dm_cblock_t cblock; |
| 300 | struct dm_hook_info hook_info; | ||
| 301 | struct dm_bio_details bio_details; | 301 | struct dm_bio_details bio_details; |
| 302 | }; | 302 | }; |
| 303 | 303 | ||
| @@ -671,15 +671,16 @@ static void remap_to_cache(struct cache *cache, struct bio *bio, | |||
| 671 | dm_cblock_t cblock) | 671 | dm_cblock_t cblock) |
| 672 | { | 672 | { |
| 673 | sector_t bi_sector = bio->bi_iter.bi_sector; | 673 | sector_t bi_sector = bio->bi_iter.bi_sector; |
| 674 | sector_t block = from_cblock(cblock); | ||
| 674 | 675 | ||
| 675 | bio->bi_bdev = cache->cache_dev->bdev; | 676 | bio->bi_bdev = cache->cache_dev->bdev; |
| 676 | if (!block_size_is_power_of_two(cache)) | 677 | if (!block_size_is_power_of_two(cache)) |
| 677 | bio->bi_iter.bi_sector = | 678 | bio->bi_iter.bi_sector = |
| 678 | (from_cblock(cblock) * cache->sectors_per_block) + | 679 | (block * cache->sectors_per_block) + |
| 679 | sector_div(bi_sector, cache->sectors_per_block); | 680 | sector_div(bi_sector, cache->sectors_per_block); |
| 680 | else | 681 | else |
| 681 | bio->bi_iter.bi_sector = | 682 | bio->bi_iter.bi_sector = |
| 682 | (from_cblock(cblock) << cache->sectors_per_block_shift) | | 683 | (block << cache->sectors_per_block_shift) | |
| 683 | (bi_sector & (cache->sectors_per_block - 1)); | 684 | (bi_sector & (cache->sectors_per_block - 1)); |
| 684 | } | 685 | } |
| 685 | 686 | ||
| @@ -1010,13 +1011,15 @@ static void overwrite_endio(struct bio *bio, int err) | |||
| 1010 | struct per_bio_data *pb = get_per_bio_data(bio, pb_data_size); | 1011 | struct per_bio_data *pb = get_per_bio_data(bio, pb_data_size); |
| 1011 | unsigned long flags; | 1012 | unsigned long flags; |
| 1012 | 1013 | ||
| 1014 | dm_unhook_bio(&pb->hook_info, bio); | ||
| 1015 | |||
| 1013 | if (err) | 1016 | if (err) |
| 1014 | mg->err = true; | 1017 | mg->err = true; |
| 1015 | 1018 | ||
| 1019 | mg->requeue_holder = false; | ||
| 1020 | |||
| 1016 | spin_lock_irqsave(&cache->lock, flags); | 1021 | spin_lock_irqsave(&cache->lock, flags); |
| 1017 | list_add_tail(&mg->list, &cache->completed_migrations); | 1022 | list_add_tail(&mg->list, &cache->completed_migrations); |
| 1018 | dm_unhook_bio(&pb->hook_info, bio); | ||
| 1019 | mg->requeue_holder = false; | ||
| 1020 | spin_unlock_irqrestore(&cache->lock, flags); | 1023 | spin_unlock_irqrestore(&cache->lock, flags); |
| 1021 | 1024 | ||
| 1022 | wake_worker(cache); | 1025 | wake_worker(cache); |
diff --git a/drivers/md/dm-io.c b/drivers/md/dm-io.c index b2b8a10e8427..3842ac738f98 100644 --- a/drivers/md/dm-io.c +++ b/drivers/md/dm-io.c | |||
| @@ -201,29 +201,28 @@ static void list_dp_init(struct dpages *dp, struct page_list *pl, unsigned offse | |||
| 201 | /* | 201 | /* |
| 202 | * Functions for getting the pages from a bvec. | 202 | * Functions for getting the pages from a bvec. |
| 203 | */ | 203 | */ |
| 204 | static void bio_get_page(struct dpages *dp, | 204 | static void bio_get_page(struct dpages *dp, struct page **p, |
| 205 | struct page **p, unsigned long *len, unsigned *offset) | 205 | unsigned long *len, unsigned *offset) |
| 206 | { | 206 | { |
| 207 | struct bio *bio = dp->context_ptr; | 207 | struct bio_vec *bvec = dp->context_ptr; |
| 208 | struct bio_vec bvec = bio_iovec(bio); | 208 | *p = bvec->bv_page; |
| 209 | *p = bvec.bv_page; | 209 | *len = bvec->bv_len - dp->context_u; |
| 210 | *len = bvec.bv_len; | 210 | *offset = bvec->bv_offset + dp->context_u; |
| 211 | *offset = bvec.bv_offset; | ||
| 212 | } | 211 | } |
| 213 | 212 | ||
| 214 | static void bio_next_page(struct dpages *dp) | 213 | static void bio_next_page(struct dpages *dp) |
| 215 | { | 214 | { |
| 216 | struct bio *bio = dp->context_ptr; | 215 | struct bio_vec *bvec = dp->context_ptr; |
| 217 | struct bio_vec bvec = bio_iovec(bio); | 216 | dp->context_ptr = bvec + 1; |
| 218 | 217 | dp->context_u = 0; | |
| 219 | bio_advance(bio, bvec.bv_len); | ||
| 220 | } | 218 | } |
| 221 | 219 | ||
| 222 | static void bio_dp_init(struct dpages *dp, struct bio *bio) | 220 | static void bio_dp_init(struct dpages *dp, struct bio *bio) |
| 223 | { | 221 | { |
| 224 | dp->get_page = bio_get_page; | 222 | dp->get_page = bio_get_page; |
| 225 | dp->next_page = bio_next_page; | 223 | dp->next_page = bio_next_page; |
| 226 | dp->context_ptr = bio; | 224 | dp->context_ptr = __bvec_iter_bvec(bio->bi_io_vec, bio->bi_iter); |
| 225 | dp->context_u = bio->bi_iter.bi_bvec_done; | ||
| 227 | } | 226 | } |
| 228 | 227 | ||
| 229 | /* | 228 | /* |
diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c index 6eb9dc9ef8f3..422a9fdeb53e 100644 --- a/drivers/md/dm-mpath.c +++ b/drivers/md/dm-mpath.c | |||
| @@ -1626,8 +1626,11 @@ static int multipath_ioctl(struct dm_target *ti, unsigned int cmd, | |||
| 1626 | /* | 1626 | /* |
| 1627 | * Only pass ioctls through if the device sizes match exactly. | 1627 | * Only pass ioctls through if the device sizes match exactly. |
| 1628 | */ | 1628 | */ |
| 1629 | if (!r && ti->len != i_size_read(bdev->bd_inode) >> SECTOR_SHIFT) | 1629 | if (!bdev || ti->len != i_size_read(bdev->bd_inode) >> SECTOR_SHIFT) { |
| 1630 | r = scsi_verify_blk_ioctl(NULL, cmd); | 1630 | int err = scsi_verify_blk_ioctl(NULL, cmd); |
| 1631 | if (err) | ||
| 1632 | r = err; | ||
| 1633 | } | ||
| 1631 | 1634 | ||
| 1632 | if (r == -ENOTCONN && !fatal_signal_pending(current)) | 1635 | if (r == -ENOTCONN && !fatal_signal_pending(current)) |
| 1633 | queue_work(kmultipathd, &m->process_queued_ios); | 1636 | queue_work(kmultipathd, &m->process_queued_ios); |
diff --git a/drivers/md/dm-raid1.c b/drivers/md/dm-raid1.c index f284e0bfb25f..7dfdb5c746d6 100644 --- a/drivers/md/dm-raid1.c +++ b/drivers/md/dm-raid1.c | |||
| @@ -1244,6 +1244,9 @@ static int mirror_end_io(struct dm_target *ti, struct bio *bio, int error) | |||
| 1244 | 1244 | ||
| 1245 | dm_bio_restore(bd, bio); | 1245 | dm_bio_restore(bd, bio); |
| 1246 | bio_record->details.bi_bdev = NULL; | 1246 | bio_record->details.bi_bdev = NULL; |
| 1247 | |||
| 1248 | atomic_inc(&bio->bi_remaining); | ||
| 1249 | |||
| 1247 | queue_bio(ms, bio, rw); | 1250 | queue_bio(ms, bio, rw); |
| 1248 | return DM_ENDIO_INCOMPLETE; | 1251 | return DM_ENDIO_INCOMPLETE; |
| 1249 | } | 1252 | } |
diff --git a/drivers/md/dm-thin-metadata.c b/drivers/md/dm-thin-metadata.c index 7da347665552..baa87ff12816 100644 --- a/drivers/md/dm-thin-metadata.c +++ b/drivers/md/dm-thin-metadata.c | |||
| @@ -483,7 +483,7 @@ static int __write_initial_superblock(struct dm_pool_metadata *pmd) | |||
| 483 | 483 | ||
| 484 | disk_super->data_mapping_root = cpu_to_le64(pmd->root); | 484 | disk_super->data_mapping_root = cpu_to_le64(pmd->root); |
| 485 | disk_super->device_details_root = cpu_to_le64(pmd->details_root); | 485 | disk_super->device_details_root = cpu_to_le64(pmd->details_root); |
| 486 | disk_super->metadata_block_size = cpu_to_le32(THIN_METADATA_BLOCK_SIZE >> SECTOR_SHIFT); | 486 | disk_super->metadata_block_size = cpu_to_le32(THIN_METADATA_BLOCK_SIZE); |
| 487 | disk_super->metadata_nr_blocks = cpu_to_le64(bdev_size >> SECTOR_TO_BLOCK_SHIFT); | 487 | disk_super->metadata_nr_blocks = cpu_to_le64(bdev_size >> SECTOR_TO_BLOCK_SHIFT); |
| 488 | disk_super->data_block_size = cpu_to_le32(pmd->data_block_size); | 488 | disk_super->data_block_size = cpu_to_le32(pmd->data_block_size); |
| 489 | 489 | ||
| @@ -651,7 +651,7 @@ static int __create_persistent_data_objects(struct dm_pool_metadata *pmd, bool f | |||
| 651 | { | 651 | { |
| 652 | int r; | 652 | int r; |
| 653 | 653 | ||
| 654 | pmd->bm = dm_block_manager_create(pmd->bdev, THIN_METADATA_BLOCK_SIZE, | 654 | pmd->bm = dm_block_manager_create(pmd->bdev, THIN_METADATA_BLOCK_SIZE << SECTOR_SHIFT, |
| 655 | THIN_METADATA_CACHE_SIZE, | 655 | THIN_METADATA_CACHE_SIZE, |
| 656 | THIN_MAX_CONCURRENT_LOCKS); | 656 | THIN_MAX_CONCURRENT_LOCKS); |
| 657 | if (IS_ERR(pmd->bm)) { | 657 | if (IS_ERR(pmd->bm)) { |
| @@ -1489,6 +1489,23 @@ bool dm_thin_changed_this_transaction(struct dm_thin_device *td) | |||
| 1489 | return r; | 1489 | return r; |
| 1490 | } | 1490 | } |
| 1491 | 1491 | ||
| 1492 | bool dm_pool_changed_this_transaction(struct dm_pool_metadata *pmd) | ||
| 1493 | { | ||
| 1494 | bool r = false; | ||
| 1495 | struct dm_thin_device *td, *tmp; | ||
| 1496 | |||
| 1497 | down_read(&pmd->root_lock); | ||
| 1498 | list_for_each_entry_safe(td, tmp, &pmd->thin_devices, list) { | ||
| 1499 | if (td->changed) { | ||
| 1500 | r = td->changed; | ||
| 1501 | break; | ||
| 1502 | } | ||
| 1503 | } | ||
| 1504 | up_read(&pmd->root_lock); | ||
| 1505 | |||
| 1506 | return r; | ||
| 1507 | } | ||
| 1508 | |||
| 1492 | bool dm_thin_aborted_changes(struct dm_thin_device *td) | 1509 | bool dm_thin_aborted_changes(struct dm_thin_device *td) |
| 1493 | { | 1510 | { |
| 1494 | bool r; | 1511 | bool r; |
diff --git a/drivers/md/dm-thin-metadata.h b/drivers/md/dm-thin-metadata.h index 9a368567632f..82ea384d36ff 100644 --- a/drivers/md/dm-thin-metadata.h +++ b/drivers/md/dm-thin-metadata.h | |||
| @@ -9,16 +9,14 @@ | |||
| 9 | 9 | ||
| 10 | #include "persistent-data/dm-block-manager.h" | 10 | #include "persistent-data/dm-block-manager.h" |
| 11 | #include "persistent-data/dm-space-map.h" | 11 | #include "persistent-data/dm-space-map.h" |
| 12 | #include "persistent-data/dm-space-map-metadata.h" | ||
| 12 | 13 | ||
| 13 | #define THIN_METADATA_BLOCK_SIZE 4096 | 14 | #define THIN_METADATA_BLOCK_SIZE DM_SM_METADATA_BLOCK_SIZE |
| 14 | 15 | ||
| 15 | /* | 16 | /* |
| 16 | * The metadata device is currently limited in size. | 17 | * The metadata device is currently limited in size. |
| 17 | * | ||
| 18 | * We have one block of index, which can hold 255 index entries. Each | ||
| 19 | * index entry contains allocation info about 16k metadata blocks. | ||
| 20 | */ | 18 | */ |
| 21 | #define THIN_METADATA_MAX_SECTORS (255 * (1 << 14) * (THIN_METADATA_BLOCK_SIZE / (1 << SECTOR_SHIFT))) | 19 | #define THIN_METADATA_MAX_SECTORS DM_SM_METADATA_MAX_SECTORS |
| 22 | 20 | ||
| 23 | /* | 21 | /* |
| 24 | * A metadata device larger than 16GB triggers a warning. | 22 | * A metadata device larger than 16GB triggers a warning. |
| @@ -161,6 +159,8 @@ int dm_thin_remove_block(struct dm_thin_device *td, dm_block_t block); | |||
| 161 | */ | 159 | */ |
| 162 | bool dm_thin_changed_this_transaction(struct dm_thin_device *td); | 160 | bool dm_thin_changed_this_transaction(struct dm_thin_device *td); |
| 163 | 161 | ||
| 162 | bool dm_pool_changed_this_transaction(struct dm_pool_metadata *pmd); | ||
| 163 | |||
| 164 | bool dm_thin_aborted_changes(struct dm_thin_device *td); | 164 | bool dm_thin_aborted_changes(struct dm_thin_device *td); |
| 165 | 165 | ||
| 166 | int dm_thin_get_highest_mapped_block(struct dm_thin_device *td, | 166 | int dm_thin_get_highest_mapped_block(struct dm_thin_device *td, |
diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c index faaf944597ab..7e84baccf0ad 100644 --- a/drivers/md/dm-thin.c +++ b/drivers/md/dm-thin.c | |||
| @@ -1357,7 +1357,8 @@ static void process_deferred_bios(struct pool *pool) | |||
| 1357 | bio_list_init(&pool->deferred_flush_bios); | 1357 | bio_list_init(&pool->deferred_flush_bios); |
| 1358 | spin_unlock_irqrestore(&pool->lock, flags); | 1358 | spin_unlock_irqrestore(&pool->lock, flags); |
| 1359 | 1359 | ||
| 1360 | if (bio_list_empty(&bios) && !need_commit_due_to_time(pool)) | 1360 | if (bio_list_empty(&bios) && |
| 1361 | !(dm_pool_changed_this_transaction(pool->pmd) && need_commit_due_to_time(pool))) | ||
| 1361 | return; | 1362 | return; |
| 1362 | 1363 | ||
| 1363 | if (commit(pool)) { | 1364 | if (commit(pool)) { |
| @@ -1999,16 +2000,27 @@ static void metadata_low_callback(void *context) | |||
| 1999 | dm_table_event(pool->ti->table); | 2000 | dm_table_event(pool->ti->table); |
| 2000 | } | 2001 | } |
| 2001 | 2002 | ||
| 2002 | static sector_t get_metadata_dev_size(struct block_device *bdev) | 2003 | static sector_t get_dev_size(struct block_device *bdev) |
| 2004 | { | ||
| 2005 | return i_size_read(bdev->bd_inode) >> SECTOR_SHIFT; | ||
| 2006 | } | ||
| 2007 | |||
| 2008 | static void warn_if_metadata_device_too_big(struct block_device *bdev) | ||
| 2003 | { | 2009 | { |
| 2004 | sector_t metadata_dev_size = i_size_read(bdev->bd_inode) >> SECTOR_SHIFT; | 2010 | sector_t metadata_dev_size = get_dev_size(bdev); |
| 2005 | char buffer[BDEVNAME_SIZE]; | 2011 | char buffer[BDEVNAME_SIZE]; |
| 2006 | 2012 | ||
| 2007 | if (metadata_dev_size > THIN_METADATA_MAX_SECTORS_WARNING) { | 2013 | if (metadata_dev_size > THIN_METADATA_MAX_SECTORS_WARNING) |
| 2008 | DMWARN("Metadata device %s is larger than %u sectors: excess space will not be used.", | 2014 | DMWARN("Metadata device %s is larger than %u sectors: excess space will not be used.", |
| 2009 | bdevname(bdev, buffer), THIN_METADATA_MAX_SECTORS); | 2015 | bdevname(bdev, buffer), THIN_METADATA_MAX_SECTORS); |
| 2010 | metadata_dev_size = THIN_METADATA_MAX_SECTORS_WARNING; | 2016 | } |
| 2011 | } | 2017 | |
| 2018 | static sector_t get_metadata_dev_size(struct block_device *bdev) | ||
| 2019 | { | ||
| 2020 | sector_t metadata_dev_size = get_dev_size(bdev); | ||
| 2021 | |||
| 2022 | if (metadata_dev_size > THIN_METADATA_MAX_SECTORS) | ||
| 2023 | metadata_dev_size = THIN_METADATA_MAX_SECTORS; | ||
| 2012 | 2024 | ||
| 2013 | return metadata_dev_size; | 2025 | return metadata_dev_size; |
| 2014 | } | 2026 | } |
| @@ -2017,7 +2029,7 @@ static dm_block_t get_metadata_dev_size_in_blocks(struct block_device *bdev) | |||
| 2017 | { | 2029 | { |
| 2018 | sector_t metadata_dev_size = get_metadata_dev_size(bdev); | 2030 | sector_t metadata_dev_size = get_metadata_dev_size(bdev); |
| 2019 | 2031 | ||
| 2020 | sector_div(metadata_dev_size, THIN_METADATA_BLOCK_SIZE >> SECTOR_SHIFT); | 2032 | sector_div(metadata_dev_size, THIN_METADATA_BLOCK_SIZE); |
| 2021 | 2033 | ||
| 2022 | return metadata_dev_size; | 2034 | return metadata_dev_size; |
| 2023 | } | 2035 | } |
| @@ -2095,12 +2107,7 @@ static int pool_ctr(struct dm_target *ti, unsigned argc, char **argv) | |||
| 2095 | ti->error = "Error opening metadata block device"; | 2107 | ti->error = "Error opening metadata block device"; |
| 2096 | goto out_unlock; | 2108 | goto out_unlock; |
| 2097 | } | 2109 | } |
| 2098 | 2110 | warn_if_metadata_device_too_big(metadata_dev->bdev); | |
| 2099 | /* | ||
| 2100 | * Run for the side-effect of possibly issuing a warning if the | ||
| 2101 | * device is too big. | ||
| 2102 | */ | ||
| 2103 | (void) get_metadata_dev_size(metadata_dev->bdev); | ||
| 2104 | 2111 | ||
| 2105 | r = dm_get_device(ti, argv[1], FMODE_READ | FMODE_WRITE, &data_dev); | 2112 | r = dm_get_device(ti, argv[1], FMODE_READ | FMODE_WRITE, &data_dev); |
| 2106 | if (r) { | 2113 | if (r) { |
| @@ -2287,6 +2294,7 @@ static int maybe_resize_metadata_dev(struct dm_target *ti, bool *need_commit) | |||
| 2287 | return -EINVAL; | 2294 | return -EINVAL; |
| 2288 | 2295 | ||
| 2289 | } else if (metadata_dev_size > sb_metadata_dev_size) { | 2296 | } else if (metadata_dev_size > sb_metadata_dev_size) { |
| 2297 | warn_if_metadata_device_too_big(pool->md_dev); | ||
| 2290 | DMINFO("%s: growing the metadata device from %llu to %llu blocks", | 2298 | DMINFO("%s: growing the metadata device from %llu to %llu blocks", |
| 2291 | dm_device_name(pool->pool_md), | 2299 | dm_device_name(pool->pool_md), |
| 2292 | sb_metadata_dev_size, metadata_dev_size); | 2300 | sb_metadata_dev_size, metadata_dev_size); |
| @@ -2894,6 +2902,7 @@ static int thin_ctr(struct dm_target *ti, unsigned argc, char **argv) | |||
| 2894 | 2902 | ||
| 2895 | if (get_pool_mode(tc->pool) == PM_FAIL) { | 2903 | if (get_pool_mode(tc->pool) == PM_FAIL) { |
| 2896 | ti->error = "Couldn't open thin device, Pool is in fail mode"; | 2904 | ti->error = "Couldn't open thin device, Pool is in fail mode"; |
| 2905 | r = -EINVAL; | ||
| 2897 | goto bad_thin_open; | 2906 | goto bad_thin_open; |
| 2898 | } | 2907 | } |
| 2899 | 2908 | ||
| @@ -2905,7 +2914,7 @@ static int thin_ctr(struct dm_target *ti, unsigned argc, char **argv) | |||
| 2905 | 2914 | ||
| 2906 | r = dm_set_target_max_io_len(ti, tc->pool->sectors_per_block); | 2915 | r = dm_set_target_max_io_len(ti, tc->pool->sectors_per_block); |
| 2907 | if (r) | 2916 | if (r) |
| 2908 | goto bad_thin_open; | 2917 | goto bad_target_max_io_len; |
| 2909 | 2918 | ||
| 2910 | ti->num_flush_bios = 1; | 2919 | ti->num_flush_bios = 1; |
| 2911 | ti->flush_supported = true; | 2920 | ti->flush_supported = true; |
| @@ -2926,6 +2935,8 @@ static int thin_ctr(struct dm_target *ti, unsigned argc, char **argv) | |||
| 2926 | 2935 | ||
| 2927 | return 0; | 2936 | return 0; |
| 2928 | 2937 | ||
| 2938 | bad_target_max_io_len: | ||
| 2939 | dm_pool_close_thin_device(tc->td); | ||
| 2929 | bad_thin_open: | 2940 | bad_thin_open: |
| 2930 | __pool_dec(tc->pool); | 2941 | __pool_dec(tc->pool); |
| 2931 | bad_pool_lookup: | 2942 | bad_pool_lookup: |
diff --git a/drivers/md/persistent-data/dm-space-map-metadata.c b/drivers/md/persistent-data/dm-space-map-metadata.c index 536782e3bcb7..e9bdd462f4f5 100644 --- a/drivers/md/persistent-data/dm-space-map-metadata.c +++ b/drivers/md/persistent-data/dm-space-map-metadata.c | |||
| @@ -680,6 +680,8 @@ int dm_sm_metadata_create(struct dm_space_map *sm, | |||
| 680 | if (r) | 680 | if (r) |
| 681 | return r; | 681 | return r; |
| 682 | 682 | ||
| 683 | if (nr_blocks > DM_SM_METADATA_MAX_BLOCKS) | ||
| 684 | nr_blocks = DM_SM_METADATA_MAX_BLOCKS; | ||
| 683 | r = sm_ll_extend(&smm->ll, nr_blocks); | 685 | r = sm_ll_extend(&smm->ll, nr_blocks); |
| 684 | if (r) | 686 | if (r) |
| 685 | return r; | 687 | return r; |
diff --git a/drivers/md/persistent-data/dm-space-map-metadata.h b/drivers/md/persistent-data/dm-space-map-metadata.h index 39bba0801cf2..64df923974d8 100644 --- a/drivers/md/persistent-data/dm-space-map-metadata.h +++ b/drivers/md/persistent-data/dm-space-map-metadata.h | |||
| @@ -9,6 +9,17 @@ | |||
| 9 | 9 | ||
| 10 | #include "dm-transaction-manager.h" | 10 | #include "dm-transaction-manager.h" |
| 11 | 11 | ||
| 12 | #define DM_SM_METADATA_BLOCK_SIZE (4096 >> SECTOR_SHIFT) | ||
| 13 | |||
| 14 | /* | ||
| 15 | * The metadata device is currently limited in size. | ||
| 16 | * | ||
| 17 | * We have one block of index, which can hold 255 index entries. Each | ||
| 18 | * index entry contains allocation info about ~16k metadata blocks. | ||
| 19 | */ | ||
| 20 | #define DM_SM_METADATA_MAX_BLOCKS (255 * ((1 << 14) - 64)) | ||
| 21 | #define DM_SM_METADATA_MAX_SECTORS (DM_SM_METADATA_MAX_BLOCKS * DM_SM_METADATA_BLOCK_SIZE) | ||
| 22 | |||
| 12 | /* | 23 | /* |
| 13 | * Unfortunately we have to use two-phase construction due to the cycle | 24 | * Unfortunately we have to use two-phase construction due to the cycle |
| 14 | * between the tm and sm. | 25 | * between the tm and sm. |
diff --git a/drivers/mfd/da9055-i2c.c b/drivers/mfd/da9055-i2c.c index 13af7e50021e..8103e4362132 100644 --- a/drivers/mfd/da9055-i2c.c +++ b/drivers/mfd/da9055-i2c.c | |||
| @@ -53,17 +53,25 @@ static int da9055_i2c_remove(struct i2c_client *i2c) | |||
| 53 | return 0; | 53 | return 0; |
| 54 | } | 54 | } |
| 55 | 55 | ||
| 56 | /* | ||
| 57 | * DO NOT change the device Ids. The naming is intentionally specific as both | ||
| 58 | * the PMIC and CODEC parts of this chip are instantiated separately as I2C | ||
| 59 | * devices (both have configurable I2C addresses, and are to all intents and | ||
| 60 | * purposes separate). As a result there are specific DA9055 ids for PMIC | ||
| 61 | * and CODEC, which must be different to operate together. | ||
| 62 | */ | ||
| 56 | static struct i2c_device_id da9055_i2c_id[] = { | 63 | static struct i2c_device_id da9055_i2c_id[] = { |
| 57 | {"da9055", 0}, | 64 | {"da9055-pmic", 0}, |
| 58 | { } | 65 | { } |
| 59 | }; | 66 | }; |
| 67 | MODULE_DEVICE_TABLE(i2c, da9055_i2c_id); | ||
| 60 | 68 | ||
| 61 | static struct i2c_driver da9055_i2c_driver = { | 69 | static struct i2c_driver da9055_i2c_driver = { |
| 62 | .probe = da9055_i2c_probe, | 70 | .probe = da9055_i2c_probe, |
| 63 | .remove = da9055_i2c_remove, | 71 | .remove = da9055_i2c_remove, |
| 64 | .id_table = da9055_i2c_id, | 72 | .id_table = da9055_i2c_id, |
| 65 | .driver = { | 73 | .driver = { |
| 66 | .name = "da9055", | 74 | .name = "da9055-pmic", |
| 67 | .owner = THIS_MODULE, | 75 | .owner = THIS_MODULE, |
| 68 | }, | 76 | }, |
| 69 | }; | 77 | }; |
diff --git a/drivers/mfd/max14577.c b/drivers/mfd/max14577.c index ac514fb2b877..71aa14a6bfbb 100644 --- a/drivers/mfd/max14577.c +++ b/drivers/mfd/max14577.c | |||
| @@ -173,6 +173,7 @@ static const struct i2c_device_id max14577_i2c_id[] = { | |||
| 173 | }; | 173 | }; |
| 174 | MODULE_DEVICE_TABLE(i2c, max14577_i2c_id); | 174 | MODULE_DEVICE_TABLE(i2c, max14577_i2c_id); |
| 175 | 175 | ||
| 176 | #ifdef CONFIG_PM_SLEEP | ||
| 176 | static int max14577_suspend(struct device *dev) | 177 | static int max14577_suspend(struct device *dev) |
| 177 | { | 178 | { |
| 178 | struct i2c_client *i2c = container_of(dev, struct i2c_client, dev); | 179 | struct i2c_client *i2c = container_of(dev, struct i2c_client, dev); |
| @@ -208,6 +209,7 @@ static int max14577_resume(struct device *dev) | |||
| 208 | 209 | ||
| 209 | return 0; | 210 | return 0; |
| 210 | } | 211 | } |
| 212 | #endif /* CONFIG_PM_SLEEP */ | ||
| 211 | 213 | ||
| 212 | static struct of_device_id max14577_dt_match[] = { | 214 | static struct of_device_id max14577_dt_match[] = { |
| 213 | { .compatible = "maxim,max14577", }, | 215 | { .compatible = "maxim,max14577", }, |
diff --git a/drivers/mfd/max8997.c b/drivers/mfd/max8997.c index be88a3bf7b85..5adede0fb04c 100644 --- a/drivers/mfd/max8997.c +++ b/drivers/mfd/max8997.c | |||
| @@ -164,15 +164,15 @@ static struct max8997_platform_data *max8997_i2c_parse_dt_pdata( | |||
| 164 | return pd; | 164 | return pd; |
| 165 | } | 165 | } |
| 166 | 166 | ||
| 167 | static inline int max8997_i2c_get_driver_data(struct i2c_client *i2c, | 167 | static inline unsigned long max8997_i2c_get_driver_data(struct i2c_client *i2c, |
| 168 | const struct i2c_device_id *id) | 168 | const struct i2c_device_id *id) |
| 169 | { | 169 | { |
| 170 | if (IS_ENABLED(CONFIG_OF) && i2c->dev.of_node) { | 170 | if (IS_ENABLED(CONFIG_OF) && i2c->dev.of_node) { |
| 171 | const struct of_device_id *match; | 171 | const struct of_device_id *match; |
| 172 | match = of_match_node(max8997_pmic_dt_match, i2c->dev.of_node); | 172 | match = of_match_node(max8997_pmic_dt_match, i2c->dev.of_node); |
| 173 | return (int)match->data; | 173 | return (unsigned long)match->data; |
| 174 | } | 174 | } |
| 175 | return (int)id->driver_data; | 175 | return id->driver_data; |
| 176 | } | 176 | } |
| 177 | 177 | ||
| 178 | static int max8997_i2c_probe(struct i2c_client *i2c, | 178 | static int max8997_i2c_probe(struct i2c_client *i2c, |
diff --git a/drivers/mfd/max8998.c b/drivers/mfd/max8998.c index 612ca404e150..5d5e186b5d8b 100644 --- a/drivers/mfd/max8998.c +++ b/drivers/mfd/max8998.c | |||
| @@ -169,16 +169,16 @@ static struct max8998_platform_data *max8998_i2c_parse_dt_pdata( | |||
| 169 | return pd; | 169 | return pd; |
| 170 | } | 170 | } |
| 171 | 171 | ||
| 172 | static inline int max8998_i2c_get_driver_data(struct i2c_client *i2c, | 172 | static inline unsigned long max8998_i2c_get_driver_data(struct i2c_client *i2c, |
| 173 | const struct i2c_device_id *id) | 173 | const struct i2c_device_id *id) |
| 174 | { | 174 | { |
| 175 | if (IS_ENABLED(CONFIG_OF) && i2c->dev.of_node) { | 175 | if (IS_ENABLED(CONFIG_OF) && i2c->dev.of_node) { |
| 176 | const struct of_device_id *match; | 176 | const struct of_device_id *match; |
| 177 | match = of_match_node(max8998_dt_match, i2c->dev.of_node); | 177 | match = of_match_node(max8998_dt_match, i2c->dev.of_node); |
| 178 | return (int)(long)match->data; | 178 | return (unsigned long)match->data; |
| 179 | } | 179 | } |
| 180 | 180 | ||
| 181 | return (int)id->driver_data; | 181 | return id->driver_data; |
| 182 | } | 182 | } |
| 183 | 183 | ||
| 184 | static int max8998_i2c_probe(struct i2c_client *i2c, | 184 | static int max8998_i2c_probe(struct i2c_client *i2c, |
diff --git a/drivers/mfd/sec-core.c b/drivers/mfd/sec-core.c index a139798b8065..714e2135210e 100644 --- a/drivers/mfd/sec-core.c +++ b/drivers/mfd/sec-core.c | |||
| @@ -315,6 +315,7 @@ static int sec_pmic_remove(struct i2c_client *i2c) | |||
| 315 | return 0; | 315 | return 0; |
| 316 | } | 316 | } |
| 317 | 317 | ||
| 318 | #ifdef CONFIG_PM_SLEEP | ||
| 318 | static int sec_pmic_suspend(struct device *dev) | 319 | static int sec_pmic_suspend(struct device *dev) |
| 319 | { | 320 | { |
| 320 | struct i2c_client *i2c = container_of(dev, struct i2c_client, dev); | 321 | struct i2c_client *i2c = container_of(dev, struct i2c_client, dev); |
| @@ -349,6 +350,7 @@ static int sec_pmic_resume(struct device *dev) | |||
| 349 | 350 | ||
| 350 | return 0; | 351 | return 0; |
| 351 | } | 352 | } |
| 353 | #endif /* CONFIG_PM_SLEEP */ | ||
| 352 | 354 | ||
| 353 | static SIMPLE_DEV_PM_OPS(sec_pmic_pm_ops, sec_pmic_suspend, sec_pmic_resume); | 355 | static SIMPLE_DEV_PM_OPS(sec_pmic_pm_ops, sec_pmic_suspend, sec_pmic_resume); |
| 354 | 356 | ||
diff --git a/drivers/mfd/tps65217.c b/drivers/mfd/tps65217.c index 966cf65c5c36..3cc4c7084b92 100644 --- a/drivers/mfd/tps65217.c +++ b/drivers/mfd/tps65217.c | |||
| @@ -158,7 +158,7 @@ static int tps65217_probe(struct i2c_client *client, | |||
| 158 | { | 158 | { |
| 159 | struct tps65217 *tps; | 159 | struct tps65217 *tps; |
| 160 | unsigned int version; | 160 | unsigned int version; |
| 161 | unsigned int chip_id = ids->driver_data; | 161 | unsigned long chip_id = ids->driver_data; |
| 162 | const struct of_device_id *match; | 162 | const struct of_device_id *match; |
| 163 | bool status_off = false; | 163 | bool status_off = false; |
| 164 | int ret; | 164 | int ret; |
| @@ -170,7 +170,7 @@ static int tps65217_probe(struct i2c_client *client, | |||
| 170 | "Failed to find matching dt id\n"); | 170 | "Failed to find matching dt id\n"); |
| 171 | return -EINVAL; | 171 | return -EINVAL; |
| 172 | } | 172 | } |
| 173 | chip_id = (unsigned int)(unsigned long)match->data; | 173 | chip_id = (unsigned long)match->data; |
| 174 | status_off = of_property_read_bool(client->dev.of_node, | 174 | status_off = of_property_read_bool(client->dev.of_node, |
| 175 | "ti,pmic-shutdown-controller"); | 175 | "ti,pmic-shutdown-controller"); |
| 176 | } | 176 | } |
diff --git a/drivers/mfd/wm8994-core.c b/drivers/mfd/wm8994-core.c index ba04f1bc70eb..e6fab94e2c8a 100644 --- a/drivers/mfd/wm8994-core.c +++ b/drivers/mfd/wm8994-core.c | |||
| @@ -636,7 +636,7 @@ static int wm8994_i2c_probe(struct i2c_client *i2c, | |||
| 636 | if (i2c->dev.of_node) { | 636 | if (i2c->dev.of_node) { |
| 637 | of_id = of_match_device(wm8994_of_match, &i2c->dev); | 637 | of_id = of_match_device(wm8994_of_match, &i2c->dev); |
| 638 | if (of_id) | 638 | if (of_id) |
| 639 | wm8994->type = (int)of_id->data; | 639 | wm8994->type = (enum wm8994_type)of_id->data; |
| 640 | } else { | 640 | } else { |
| 641 | wm8994->type = id->driver_data; | 641 | wm8994->type = id->driver_data; |
| 642 | } | 642 | } |
diff --git a/drivers/misc/mei/client.c b/drivers/misc/mei/client.c index 9b809cfc2899..89a557972d1b 100644 --- a/drivers/misc/mei/client.c +++ b/drivers/misc/mei/client.c | |||
| @@ -666,7 +666,6 @@ int mei_cl_read_start(struct mei_cl *cl, size_t length) | |||
| 666 | goto err; | 666 | goto err; |
| 667 | 667 | ||
| 668 | cb->fop_type = MEI_FOP_READ; | 668 | cb->fop_type = MEI_FOP_READ; |
| 669 | cl->read_cb = cb; | ||
| 670 | if (dev->hbuf_is_ready) { | 669 | if (dev->hbuf_is_ready) { |
| 671 | dev->hbuf_is_ready = false; | 670 | dev->hbuf_is_ready = false; |
| 672 | if (mei_hbm_cl_flow_control_req(dev, cl)) { | 671 | if (mei_hbm_cl_flow_control_req(dev, cl)) { |
| @@ -678,6 +677,9 @@ int mei_cl_read_start(struct mei_cl *cl, size_t length) | |||
| 678 | } else { | 677 | } else { |
| 679 | list_add_tail(&cb->list, &dev->ctrl_wr_list.list); | 678 | list_add_tail(&cb->list, &dev->ctrl_wr_list.list); |
| 680 | } | 679 | } |
| 680 | |||
| 681 | cl->read_cb = cb; | ||
| 682 | |||
| 681 | return rets; | 683 | return rets; |
| 682 | err: | 684 | err: |
| 683 | mei_io_cb_free(cb); | 685 | mei_io_cb_free(cb); |
diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c index 59eba5d2c685..9715a7ba164a 100644 --- a/drivers/mtd/nand/nand_base.c +++ b/drivers/mtd/nand/nand_base.c | |||
| @@ -1584,7 +1584,7 @@ read_retry: | |||
| 1584 | } | 1584 | } |
| 1585 | 1585 | ||
| 1586 | if (mtd->ecc_stats.failed - ecc_failures) { | 1586 | if (mtd->ecc_stats.failed - ecc_failures) { |
| 1587 | if (retry_mode + 1 <= chip->read_retries) { | 1587 | if (retry_mode + 1 < chip->read_retries) { |
| 1588 | retry_mode++; | 1588 | retry_mode++; |
| 1589 | ret = nand_setup_read_retry(mtd, | 1589 | ret = nand_setup_read_retry(mtd, |
| 1590 | retry_mode); | 1590 | retry_mode); |
diff --git a/drivers/mtd/nand/omap2.c b/drivers/mtd/nand/omap2.c index ef4190a02b7b..bf642ceef681 100644 --- a/drivers/mtd/nand/omap2.c +++ b/drivers/mtd/nand/omap2.c | |||
| @@ -1633,6 +1633,7 @@ static int omap_nand_probe(struct platform_device *pdev) | |||
| 1633 | int i; | 1633 | int i; |
| 1634 | dma_cap_mask_t mask; | 1634 | dma_cap_mask_t mask; |
| 1635 | unsigned sig; | 1635 | unsigned sig; |
| 1636 | unsigned oob_index; | ||
| 1636 | struct resource *res; | 1637 | struct resource *res; |
| 1637 | struct mtd_part_parser_data ppdata = {}; | 1638 | struct mtd_part_parser_data ppdata = {}; |
| 1638 | 1639 | ||
| @@ -1826,11 +1827,14 @@ static int omap_nand_probe(struct platform_device *pdev) | |||
| 1826 | (mtd->writesize / | 1827 | (mtd->writesize / |
| 1827 | nand_chip->ecc.size); | 1828 | nand_chip->ecc.size); |
| 1828 | if (nand_chip->options & NAND_BUSWIDTH_16) | 1829 | if (nand_chip->options & NAND_BUSWIDTH_16) |
| 1829 | ecclayout->eccpos[0] = BADBLOCK_MARKER_LENGTH; | 1830 | oob_index = BADBLOCK_MARKER_LENGTH; |
| 1830 | else | 1831 | else |
| 1831 | ecclayout->eccpos[0] = 1; | 1832 | oob_index = 1; |
| 1832 | ecclayout->oobfree->offset = ecclayout->eccpos[0] + | 1833 | for (i = 0; i < ecclayout->eccbytes; i++, oob_index++) |
| 1833 | ecclayout->eccbytes; | 1834 | ecclayout->eccpos[i] = oob_index; |
| 1835 | /* no reserved-marker in ecclayout for this ecc-scheme */ | ||
| 1836 | ecclayout->oobfree->offset = | ||
| 1837 | ecclayout->eccpos[ecclayout->eccbytes - 1] + 1; | ||
| 1834 | break; | 1838 | break; |
| 1835 | 1839 | ||
| 1836 | case OMAP_ECC_BCH4_CODE_HW_DETECTION_SW: | 1840 | case OMAP_ECC_BCH4_CODE_HW_DETECTION_SW: |
| @@ -1847,9 +1851,15 @@ static int omap_nand_probe(struct platform_device *pdev) | |||
| 1847 | ecclayout->eccbytes = nand_chip->ecc.bytes * | 1851 | ecclayout->eccbytes = nand_chip->ecc.bytes * |
| 1848 | (mtd->writesize / | 1852 | (mtd->writesize / |
| 1849 | nand_chip->ecc.size); | 1853 | nand_chip->ecc.size); |
| 1850 | ecclayout->eccpos[0] = BADBLOCK_MARKER_LENGTH; | 1854 | oob_index = BADBLOCK_MARKER_LENGTH; |
| 1851 | ecclayout->oobfree->offset = ecclayout->eccpos[0] + | 1855 | for (i = 0; i < ecclayout->eccbytes; i++, oob_index++) { |
| 1852 | ecclayout->eccbytes; | 1856 | ecclayout->eccpos[i] = oob_index; |
| 1857 | if (((i + 1) % nand_chip->ecc.bytes) == 0) | ||
| 1858 | oob_index++; | ||
| 1859 | } | ||
| 1860 | /* include reserved-marker in ecclayout->oobfree calculation */ | ||
| 1861 | ecclayout->oobfree->offset = 1 + | ||
| 1862 | ecclayout->eccpos[ecclayout->eccbytes - 1] + 1; | ||
| 1853 | /* software bch library is used for locating errors */ | 1863 | /* software bch library is used for locating errors */ |
| 1854 | nand_chip->ecc.priv = nand_bch_init(mtd, | 1864 | nand_chip->ecc.priv = nand_bch_init(mtd, |
| 1855 | nand_chip->ecc.size, | 1865 | nand_chip->ecc.size, |
| @@ -1883,9 +1893,12 @@ static int omap_nand_probe(struct platform_device *pdev) | |||
| 1883 | ecclayout->eccbytes = nand_chip->ecc.bytes * | 1893 | ecclayout->eccbytes = nand_chip->ecc.bytes * |
| 1884 | (mtd->writesize / | 1894 | (mtd->writesize / |
| 1885 | nand_chip->ecc.size); | 1895 | nand_chip->ecc.size); |
| 1886 | ecclayout->eccpos[0] = BADBLOCK_MARKER_LENGTH; | 1896 | oob_index = BADBLOCK_MARKER_LENGTH; |
| 1887 | ecclayout->oobfree->offset = ecclayout->eccpos[0] + | 1897 | for (i = 0; i < ecclayout->eccbytes; i++, oob_index++) |
| 1888 | ecclayout->eccbytes; | 1898 | ecclayout->eccpos[i] = oob_index; |
| 1899 | /* reserved marker already included in ecclayout->eccbytes */ | ||
| 1900 | ecclayout->oobfree->offset = | ||
| 1901 | ecclayout->eccpos[ecclayout->eccbytes - 1] + 1; | ||
| 1889 | /* This ECC scheme requires ELM H/W block */ | 1902 | /* This ECC scheme requires ELM H/W block */ |
| 1890 | if (is_elm_present(info, pdata->elm_of_node, BCH4_ECC) < 0) { | 1903 | if (is_elm_present(info, pdata->elm_of_node, BCH4_ECC) < 0) { |
| 1891 | pr_err("nand: error: could not initialize ELM\n"); | 1904 | pr_err("nand: error: could not initialize ELM\n"); |
| @@ -1913,9 +1926,15 @@ static int omap_nand_probe(struct platform_device *pdev) | |||
| 1913 | ecclayout->eccbytes = nand_chip->ecc.bytes * | 1926 | ecclayout->eccbytes = nand_chip->ecc.bytes * |
| 1914 | (mtd->writesize / | 1927 | (mtd->writesize / |
| 1915 | nand_chip->ecc.size); | 1928 | nand_chip->ecc.size); |
| 1916 | ecclayout->eccpos[0] = BADBLOCK_MARKER_LENGTH; | 1929 | oob_index = BADBLOCK_MARKER_LENGTH; |
| 1917 | ecclayout->oobfree->offset = ecclayout->eccpos[0] + | 1930 | for (i = 0; i < ecclayout->eccbytes; i++, oob_index++) { |
| 1918 | ecclayout->eccbytes; | 1931 | ecclayout->eccpos[i] = oob_index; |
| 1932 | if (((i + 1) % nand_chip->ecc.bytes) == 0) | ||
| 1933 | oob_index++; | ||
| 1934 | } | ||
| 1935 | /* include reserved-marker in ecclayout->oobfree calculation */ | ||
| 1936 | ecclayout->oobfree->offset = 1 + | ||
| 1937 | ecclayout->eccpos[ecclayout->eccbytes - 1] + 1; | ||
| 1919 | /* software bch library is used for locating errors */ | 1938 | /* software bch library is used for locating errors */ |
| 1920 | nand_chip->ecc.priv = nand_bch_init(mtd, | 1939 | nand_chip->ecc.priv = nand_bch_init(mtd, |
| 1921 | nand_chip->ecc.size, | 1940 | nand_chip->ecc.size, |
| @@ -1956,9 +1975,12 @@ static int omap_nand_probe(struct platform_device *pdev) | |||
| 1956 | ecclayout->eccbytes = nand_chip->ecc.bytes * | 1975 | ecclayout->eccbytes = nand_chip->ecc.bytes * |
| 1957 | (mtd->writesize / | 1976 | (mtd->writesize / |
| 1958 | nand_chip->ecc.size); | 1977 | nand_chip->ecc.size); |
| 1959 | ecclayout->eccpos[0] = BADBLOCK_MARKER_LENGTH; | 1978 | oob_index = BADBLOCK_MARKER_LENGTH; |
| 1960 | ecclayout->oobfree->offset = ecclayout->eccpos[0] + | 1979 | for (i = 0; i < ecclayout->eccbytes; i++, oob_index++) |
| 1961 | ecclayout->eccbytes; | 1980 | ecclayout->eccpos[i] = oob_index; |
| 1981 | /* reserved marker already included in ecclayout->eccbytes */ | ||
| 1982 | ecclayout->oobfree->offset = | ||
| 1983 | ecclayout->eccpos[ecclayout->eccbytes - 1] + 1; | ||
| 1962 | break; | 1984 | break; |
| 1963 | #else | 1985 | #else |
| 1964 | pr_err("nand: error: CONFIG_MTD_NAND_OMAP_BCH not enabled\n"); | 1986 | pr_err("nand: error: CONFIG_MTD_NAND_OMAP_BCH not enabled\n"); |
| @@ -1972,11 +1994,8 @@ static int omap_nand_probe(struct platform_device *pdev) | |||
| 1972 | goto return_error; | 1994 | goto return_error; |
| 1973 | } | 1995 | } |
| 1974 | 1996 | ||
| 1975 | /* populate remaining ECC layout data */ | 1997 | /* all OOB bytes from oobfree->offset till end off OOB are free */ |
| 1976 | ecclayout->oobfree->length = mtd->oobsize - (BADBLOCK_MARKER_LENGTH + | 1998 | ecclayout->oobfree->length = mtd->oobsize - ecclayout->oobfree->offset; |
| 1977 | ecclayout->eccbytes); | ||
| 1978 | for (i = 1; i < ecclayout->eccbytes; i++) | ||
| 1979 | ecclayout->eccpos[i] = ecclayout->eccpos[0] + i; | ||
| 1980 | /* check if NAND device's OOB is enough to store ECC signatures */ | 1999 | /* check if NAND device's OOB is enough to store ECC signatures */ |
| 1981 | if (mtd->oobsize < (ecclayout->eccbytes + BADBLOCK_MARKER_LENGTH)) { | 2000 | if (mtd->oobsize < (ecclayout->eccbytes + BADBLOCK_MARKER_LENGTH)) { |
| 1982 | pr_err("not enough OOB bytes required = %d, available=%d\n", | 2001 | pr_err("not enough OOB bytes required = %d, available=%d\n", |
diff --git a/drivers/mtd/ubi/fastmap.c b/drivers/mtd/ubi/fastmap.c index ead861307b3c..c5dad652614d 100644 --- a/drivers/mtd/ubi/fastmap.c +++ b/drivers/mtd/ubi/fastmap.c | |||
| @@ -463,8 +463,8 @@ static int scan_pool(struct ubi_device *ubi, struct ubi_attach_info *ai, | |||
| 463 | } | 463 | } |
| 464 | } | 464 | } |
| 465 | if (found_orphan) { | 465 | if (found_orphan) { |
| 466 | kmem_cache_free(ai->aeb_slab_cache, tmp_aeb); | ||
| 467 | list_del(&tmp_aeb->u.list); | 466 | list_del(&tmp_aeb->u.list); |
| 467 | kmem_cache_free(ai->aeb_slab_cache, tmp_aeb); | ||
| 468 | } | 468 | } |
| 469 | 469 | ||
| 470 | new_aeb = kmem_cache_alloc(ai->aeb_slab_cache, | 470 | new_aeb = kmem_cache_alloc(ai->aeb_slab_cache, |
| @@ -846,16 +846,16 @@ fail_bad: | |||
| 846 | ret = UBI_BAD_FASTMAP; | 846 | ret = UBI_BAD_FASTMAP; |
| 847 | fail: | 847 | fail: |
| 848 | list_for_each_entry_safe(tmp_aeb, _tmp_aeb, &used, u.list) { | 848 | list_for_each_entry_safe(tmp_aeb, _tmp_aeb, &used, u.list) { |
| 849 | kmem_cache_free(ai->aeb_slab_cache, tmp_aeb); | ||
| 850 | list_del(&tmp_aeb->u.list); | 849 | list_del(&tmp_aeb->u.list); |
| 850 | kmem_cache_free(ai->aeb_slab_cache, tmp_aeb); | ||
| 851 | } | 851 | } |
| 852 | list_for_each_entry_safe(tmp_aeb, _tmp_aeb, &eba_orphans, u.list) { | 852 | list_for_each_entry_safe(tmp_aeb, _tmp_aeb, &eba_orphans, u.list) { |
| 853 | kmem_cache_free(ai->aeb_slab_cache, tmp_aeb); | ||
| 854 | list_del(&tmp_aeb->u.list); | 853 | list_del(&tmp_aeb->u.list); |
| 854 | kmem_cache_free(ai->aeb_slab_cache, tmp_aeb); | ||
| 855 | } | 855 | } |
| 856 | list_for_each_entry_safe(tmp_aeb, _tmp_aeb, &free, u.list) { | 856 | list_for_each_entry_safe(tmp_aeb, _tmp_aeb, &free, u.list) { |
| 857 | kmem_cache_free(ai->aeb_slab_cache, tmp_aeb); | ||
| 858 | list_del(&tmp_aeb->u.list); | 857 | list_del(&tmp_aeb->u.list); |
| 858 | kmem_cache_free(ai->aeb_slab_cache, tmp_aeb); | ||
| 859 | } | 859 | } |
| 860 | 860 | ||
| 861 | return ret; | 861 | return ret; |
diff --git a/drivers/of/base.c b/drivers/of/base.c index 10b51106c854..89e888a78899 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c | |||
| @@ -342,27 +342,72 @@ struct device_node *of_get_cpu_node(int cpu, unsigned int *thread) | |||
| 342 | } | 342 | } |
| 343 | EXPORT_SYMBOL(of_get_cpu_node); | 343 | EXPORT_SYMBOL(of_get_cpu_node); |
| 344 | 344 | ||
| 345 | /** Checks if the given "compat" string matches one of the strings in | 345 | /** |
| 346 | * the device's "compatible" property | 346 | * __of_device_is_compatible() - Check if the node matches given constraints |
| 347 | * @device: pointer to node | ||
| 348 | * @compat: required compatible string, NULL or "" for any match | ||
| 349 | * @type: required device_type value, NULL or "" for any match | ||
| 350 | * @name: required node name, NULL or "" for any match | ||
| 351 | * | ||
| 352 | * Checks if the given @compat, @type and @name strings match the | ||
| 353 | * properties of the given @device. A constraints can be skipped by | ||
| 354 | * passing NULL or an empty string as the constraint. | ||
| 355 | * | ||
| 356 | * Returns 0 for no match, and a positive integer on match. The return | ||
| 357 | * value is a relative score with larger values indicating better | ||
| 358 | * matches. The score is weighted for the most specific compatible value | ||
| 359 | * to get the highest score. Matching type is next, followed by matching | ||
| 360 | * name. Practically speaking, this results in the following priority | ||
| 361 | * order for matches: | ||
| 362 | * | ||
| 363 | * 1. specific compatible && type && name | ||
| 364 | * 2. specific compatible && type | ||
| 365 | * 3. specific compatible && name | ||
| 366 | * 4. specific compatible | ||
| 367 | * 5. general compatible && type && name | ||
| 368 | * 6. general compatible && type | ||
| 369 | * 7. general compatible && name | ||
| 370 | * 8. general compatible | ||
| 371 | * 9. type && name | ||
| 372 | * 10. type | ||
| 373 | * 11. name | ||
| 347 | */ | 374 | */ |
| 348 | static int __of_device_is_compatible(const struct device_node *device, | 375 | static int __of_device_is_compatible(const struct device_node *device, |
| 349 | const char *compat) | 376 | const char *compat, const char *type, const char *name) |
| 350 | { | 377 | { |
| 351 | const char* cp; | 378 | struct property *prop; |
| 352 | int cplen, l; | 379 | const char *cp; |
| 380 | int index = 0, score = 0; | ||
| 381 | |||
| 382 | /* Compatible match has highest priority */ | ||
| 383 | if (compat && compat[0]) { | ||
| 384 | prop = __of_find_property(device, "compatible", NULL); | ||
| 385 | for (cp = of_prop_next_string(prop, NULL); cp; | ||
| 386 | cp = of_prop_next_string(prop, cp), index++) { | ||
| 387 | if (of_compat_cmp(cp, compat, strlen(compat)) == 0) { | ||
| 388 | score = INT_MAX/2 - (index << 2); | ||
| 389 | break; | ||
| 390 | } | ||
| 391 | } | ||
| 392 | if (!score) | ||
| 393 | return 0; | ||
| 394 | } | ||
| 353 | 395 | ||
| 354 | cp = __of_get_property(device, "compatible", &cplen); | 396 | /* Matching type is better than matching name */ |
| 355 | if (cp == NULL) | 397 | if (type && type[0]) { |
| 356 | return 0; | 398 | if (!device->type || of_node_cmp(type, device->type)) |
| 357 | while (cplen > 0) { | 399 | return 0; |
| 358 | if (of_compat_cmp(cp, compat, strlen(compat)) == 0) | 400 | score += 2; |
| 359 | return 1; | ||
| 360 | l = strlen(cp) + 1; | ||
| 361 | cp += l; | ||
| 362 | cplen -= l; | ||
| 363 | } | 401 | } |
| 364 | 402 | ||
| 365 | return 0; | 403 | /* Matching name is a bit better than not */ |
| 404 | if (name && name[0]) { | ||
| 405 | if (!device->name || of_node_cmp(name, device->name)) | ||
| 406 | return 0; | ||
| 407 | score++; | ||
| 408 | } | ||
| 409 | |||
| 410 | return score; | ||
| 366 | } | 411 | } |
| 367 | 412 | ||
| 368 | /** Checks if the given "compat" string matches one of the strings in | 413 | /** Checks if the given "compat" string matches one of the strings in |
| @@ -375,7 +420,7 @@ int of_device_is_compatible(const struct device_node *device, | |||
| 375 | int res; | 420 | int res; |
| 376 | 421 | ||
| 377 | raw_spin_lock_irqsave(&devtree_lock, flags); | 422 | raw_spin_lock_irqsave(&devtree_lock, flags); |
| 378 | res = __of_device_is_compatible(device, compat); | 423 | res = __of_device_is_compatible(device, compat, NULL, NULL); |
| 379 | raw_spin_unlock_irqrestore(&devtree_lock, flags); | 424 | raw_spin_unlock_irqrestore(&devtree_lock, flags); |
| 380 | return res; | 425 | return res; |
| 381 | } | 426 | } |
| @@ -681,10 +726,7 @@ struct device_node *of_find_compatible_node(struct device_node *from, | |||
| 681 | raw_spin_lock_irqsave(&devtree_lock, flags); | 726 | raw_spin_lock_irqsave(&devtree_lock, flags); |
| 682 | np = from ? from->allnext : of_allnodes; | 727 | np = from ? from->allnext : of_allnodes; |
| 683 | for (; np; np = np->allnext) { | 728 | for (; np; np = np->allnext) { |
| 684 | if (type | 729 | if (__of_device_is_compatible(np, compatible, type, NULL) && |
| 685 | && !(np->type && (of_node_cmp(np->type, type) == 0))) | ||
| 686 | continue; | ||
| 687 | if (__of_device_is_compatible(np, compatible) && | ||
| 688 | of_node_get(np)) | 730 | of_node_get(np)) |
| 689 | break; | 731 | break; |
| 690 | } | 732 | } |
| @@ -730,65 +772,26 @@ out: | |||
| 730 | } | 772 | } |
| 731 | EXPORT_SYMBOL(of_find_node_with_property); | 773 | EXPORT_SYMBOL(of_find_node_with_property); |
| 732 | 774 | ||
| 733 | static const struct of_device_id * | ||
| 734 | of_match_compatible(const struct of_device_id *matches, | ||
| 735 | const struct device_node *node) | ||
| 736 | { | ||
| 737 | const char *cp; | ||
| 738 | int cplen, l; | ||
| 739 | const struct of_device_id *m; | ||
| 740 | |||
| 741 | cp = __of_get_property(node, "compatible", &cplen); | ||
| 742 | while (cp && (cplen > 0)) { | ||
| 743 | m = matches; | ||
| 744 | while (m->name[0] || m->type[0] || m->compatible[0]) { | ||
| 745 | /* Only match for the entries without type and name */ | ||
| 746 | if (m->name[0] || m->type[0] || | ||
| 747 | of_compat_cmp(m->compatible, cp, | ||
| 748 | strlen(m->compatible))) | ||
| 749 | m++; | ||
| 750 | else | ||
| 751 | return m; | ||
| 752 | } | ||
| 753 | |||
| 754 | /* Get node's next compatible string */ | ||
| 755 | l = strlen(cp) + 1; | ||
| 756 | cp += l; | ||
| 757 | cplen -= l; | ||
| 758 | } | ||
| 759 | |||
| 760 | return NULL; | ||
| 761 | } | ||
| 762 | |||
| 763 | static | 775 | static |
| 764 | const struct of_device_id *__of_match_node(const struct of_device_id *matches, | 776 | const struct of_device_id *__of_match_node(const struct of_device_id *matches, |
| 765 | const struct device_node *node) | 777 | const struct device_node *node) |
| 766 | { | 778 | { |
| 767 | const struct of_device_id *m; | 779 | const struct of_device_id *best_match = NULL; |
| 780 | int score, best_score = 0; | ||
| 768 | 781 | ||
| 769 | if (!matches) | 782 | if (!matches) |
| 770 | return NULL; | 783 | return NULL; |
| 771 | 784 | ||
| 772 | m = of_match_compatible(matches, node); | 785 | for (; matches->name[0] || matches->type[0] || matches->compatible[0]; matches++) { |
| 773 | if (m) | 786 | score = __of_device_is_compatible(node, matches->compatible, |
| 774 | return m; | 787 | matches->type, matches->name); |
| 775 | 788 | if (score > best_score) { | |
| 776 | while (matches->name[0] || matches->type[0] || matches->compatible[0]) { | 789 | best_match = matches; |
| 777 | int match = 1; | 790 | best_score = score; |
| 778 | if (matches->name[0]) | 791 | } |
| 779 | match &= node->name | ||
| 780 | && !strcmp(matches->name, node->name); | ||
| 781 | if (matches->type[0]) | ||
| 782 | match &= node->type | ||
| 783 | && !strcmp(matches->type, node->type); | ||
| 784 | if (matches->compatible[0]) | ||
| 785 | match &= __of_device_is_compatible(node, | ||
| 786 | matches->compatible); | ||
| 787 | if (match) | ||
| 788 | return matches; | ||
| 789 | matches++; | ||
| 790 | } | 792 | } |
| 791 | return NULL; | 793 | |
| 794 | return best_match; | ||
| 792 | } | 795 | } |
| 793 | 796 | ||
| 794 | /** | 797 | /** |
| @@ -796,12 +799,7 @@ const struct of_device_id *__of_match_node(const struct of_device_id *matches, | |||
| 796 | * @matches: array of of device match structures to search in | 799 | * @matches: array of of device match structures to search in |
| 797 | * @node: the of device structure to match against | 800 | * @node: the of device structure to match against |
| 798 | * | 801 | * |
| 799 | * Low level utility function used by device matching. We have two ways | 802 | * Low level utility function used by device matching. |
| 800 | * of matching: | ||
| 801 | * - Try to find the best compatible match by comparing each compatible | ||
| 802 | * string of device node with all the given matches respectively. | ||
| 803 | * - If the above method failed, then try to match the compatible by using | ||
| 804 | * __of_device_is_compatible() besides the match in type and name. | ||
| 805 | */ | 803 | */ |
| 806 | const struct of_device_id *of_match_node(const struct of_device_id *matches, | 804 | const struct of_device_id *of_match_node(const struct of_device_id *matches, |
| 807 | const struct device_node *node) | 805 | const struct device_node *node) |
diff --git a/drivers/of/selftest.c b/drivers/of/selftest.c index e21012bde639..6643d1920985 100644 --- a/drivers/of/selftest.c +++ b/drivers/of/selftest.c | |||
| @@ -300,6 +300,72 @@ static void __init of_selftest_parse_interrupts_extended(void) | |||
| 300 | of_node_put(np); | 300 | of_node_put(np); |
| 301 | } | 301 | } |
| 302 | 302 | ||
| 303 | static struct of_device_id match_node_table[] = { | ||
| 304 | { .data = "A", .name = "name0", }, /* Name alone is lowest priority */ | ||
| 305 | { .data = "B", .type = "type1", }, /* followed by type alone */ | ||
| 306 | |||
| 307 | { .data = "Ca", .name = "name2", .type = "type1", }, /* followed by both together */ | ||
| 308 | { .data = "Cb", .name = "name2", }, /* Only match when type doesn't match */ | ||
| 309 | { .data = "Cc", .name = "name2", .type = "type2", }, | ||
| 310 | |||
| 311 | { .data = "E", .compatible = "compat3" }, | ||
| 312 | { .data = "G", .compatible = "compat2", }, | ||
| 313 | { .data = "H", .compatible = "compat2", .name = "name5", }, | ||
| 314 | { .data = "I", .compatible = "compat2", .type = "type1", }, | ||
| 315 | { .data = "J", .compatible = "compat2", .type = "type1", .name = "name8", }, | ||
| 316 | { .data = "K", .compatible = "compat2", .name = "name9", }, | ||
| 317 | {} | ||
| 318 | }; | ||
| 319 | |||
| 320 | static struct { | ||
| 321 | const char *path; | ||
| 322 | const char *data; | ||
| 323 | } match_node_tests[] = { | ||
| 324 | { .path = "/testcase-data/match-node/name0", .data = "A", }, | ||
| 325 | { .path = "/testcase-data/match-node/name1", .data = "B", }, | ||
| 326 | { .path = "/testcase-data/match-node/a/name2", .data = "Ca", }, | ||
| 327 | { .path = "/testcase-data/match-node/b/name2", .data = "Cb", }, | ||
| 328 | { .path = "/testcase-data/match-node/c/name2", .data = "Cc", }, | ||
| 329 | { .path = "/testcase-data/match-node/name3", .data = "E", }, | ||
| 330 | { .path = "/testcase-data/match-node/name4", .data = "G", }, | ||
| 331 | { .path = "/testcase-data/match-node/name5", .data = "H", }, | ||
| 332 | { .path = "/testcase-data/match-node/name6", .data = "G", }, | ||
| 333 | { .path = "/testcase-data/match-node/name7", .data = "I", }, | ||
| 334 | { .path = "/testcase-data/match-node/name8", .data = "J", }, | ||
| 335 | { .path = "/testcase-data/match-node/name9", .data = "K", }, | ||
| 336 | }; | ||
| 337 | |||
| 338 | static void __init of_selftest_match_node(void) | ||
| 339 | { | ||
| 340 | struct device_node *np; | ||
| 341 | const struct of_device_id *match; | ||
| 342 | int i; | ||
| 343 | |||
| 344 | for (i = 0; i < ARRAY_SIZE(match_node_tests); i++) { | ||
| 345 | np = of_find_node_by_path(match_node_tests[i].path); | ||
| 346 | if (!np) { | ||
| 347 | selftest(0, "missing testcase node %s\n", | ||
| 348 | match_node_tests[i].path); | ||
| 349 | continue; | ||
| 350 | } | ||
| 351 | |||
| 352 | match = of_match_node(match_node_table, np); | ||
| 353 | if (!match) { | ||
| 354 | selftest(0, "%s didn't match anything\n", | ||
| 355 | match_node_tests[i].path); | ||
| 356 | continue; | ||
| 357 | } | ||
| 358 | |||
| 359 | if (strcmp(match->data, match_node_tests[i].data) != 0) { | ||
| 360 | selftest(0, "%s got wrong match. expected %s, got %s\n", | ||
| 361 | match_node_tests[i].path, match_node_tests[i].data, | ||
| 362 | (const char *)match->data); | ||
| 363 | continue; | ||
| 364 | } | ||
| 365 | selftest(1, "passed"); | ||
| 366 | } | ||
| 367 | } | ||
| 368 | |||
| 303 | static int __init of_selftest(void) | 369 | static int __init of_selftest(void) |
| 304 | { | 370 | { |
| 305 | struct device_node *np; | 371 | struct device_node *np; |
| @@ -316,6 +382,7 @@ static int __init of_selftest(void) | |||
| 316 | of_selftest_property_match_string(); | 382 | of_selftest_property_match_string(); |
| 317 | of_selftest_parse_interrupts(); | 383 | of_selftest_parse_interrupts(); |
| 318 | of_selftest_parse_interrupts_extended(); | 384 | of_selftest_parse_interrupts_extended(); |
| 385 | of_selftest_match_node(); | ||
| 319 | pr_info("end of selftest - %i passed, %i failed\n", | 386 | pr_info("end of selftest - %i passed, %i failed\n", |
| 320 | selftest_results.passed, selftest_results.failed); | 387 | selftest_results.passed, selftest_results.failed); |
| 321 | return 0; | 388 | return 0; |
diff --git a/drivers/of/testcase-data/testcases.dtsi b/drivers/of/testcase-data/testcases.dtsi new file mode 100644 index 000000000000..3a5b75a8e4d7 --- /dev/null +++ b/drivers/of/testcase-data/testcases.dtsi | |||
| @@ -0,0 +1,3 @@ | |||
| 1 | #include "tests-phandle.dtsi" | ||
| 2 | #include "tests-interrupts.dtsi" | ||
| 3 | #include "tests-match.dtsi" | ||
diff --git a/arch/arm/boot/dts/testcases/tests-interrupts.dtsi b/drivers/of/testcase-data/tests-interrupts.dtsi index c843720bd3e5..c843720bd3e5 100644 --- a/arch/arm/boot/dts/testcases/tests-interrupts.dtsi +++ b/drivers/of/testcase-data/tests-interrupts.dtsi | |||
diff --git a/drivers/of/testcase-data/tests-match.dtsi b/drivers/of/testcase-data/tests-match.dtsi new file mode 100644 index 000000000000..c9e541129534 --- /dev/null +++ b/drivers/of/testcase-data/tests-match.dtsi | |||
| @@ -0,0 +1,19 @@ | |||
| 1 | |||
| 2 | / { | ||
| 3 | testcase-data { | ||
| 4 | match-node { | ||
| 5 | name0 { }; | ||
| 6 | name1 { device_type = "type1"; }; | ||
| 7 | a { name2 { device_type = "type1"; }; }; | ||
| 8 | b { name2 { }; }; | ||
| 9 | c { name2 { device_type = "type2"; }; }; | ||
| 10 | name3 { compatible = "compat3"; }; | ||
| 11 | name4 { compatible = "compat2", "compat3"; }; | ||
| 12 | name5 { compatible = "compat2", "compat3"; }; | ||
| 13 | name6 { compatible = "compat1", "compat2", "compat3"; }; | ||
| 14 | name7 { compatible = "compat2"; device_type = "type1"; }; | ||
| 15 | name8 { compatible = "compat2"; device_type = "type1"; }; | ||
| 16 | name9 { compatible = "compat2"; }; | ||
| 17 | }; | ||
| 18 | }; | ||
| 19 | }; | ||
diff --git a/arch/arm/boot/dts/testcases/tests-phandle.dtsi b/drivers/of/testcase-data/tests-phandle.dtsi index 0007d3cd7dc2..0007d3cd7dc2 100644 --- a/arch/arm/boot/dts/testcases/tests-phandle.dtsi +++ b/drivers/of/testcase-data/tests-phandle.dtsi | |||
diff --git a/drivers/pci/host/pci-mvebu.c b/drivers/pci/host/pci-mvebu.c index 13478ecd4113..0e79665afd44 100644 --- a/drivers/pci/host/pci-mvebu.c +++ b/drivers/pci/host/pci-mvebu.c | |||
| @@ -60,14 +60,6 @@ | |||
| 60 | #define PCIE_DEBUG_CTRL 0x1a60 | 60 | #define PCIE_DEBUG_CTRL 0x1a60 |
| 61 | #define PCIE_DEBUG_SOFT_RESET BIT(20) | 61 | #define PCIE_DEBUG_SOFT_RESET BIT(20) |
| 62 | 62 | ||
| 63 | /* | ||
| 64 | * This product ID is registered by Marvell, and used when the Marvell | ||
| 65 | * SoC is not the root complex, but an endpoint on the PCIe bus. It is | ||
| 66 | * therefore safe to re-use this PCI ID for our emulated PCI-to-PCI | ||
| 67 | * bridge. | ||
| 68 | */ | ||
| 69 | #define MARVELL_EMULATED_PCI_PCI_BRIDGE_ID 0x7846 | ||
| 70 | |||
| 71 | /* PCI configuration space of a PCI-to-PCI bridge */ | 63 | /* PCI configuration space of a PCI-to-PCI bridge */ |
| 72 | struct mvebu_sw_pci_bridge { | 64 | struct mvebu_sw_pci_bridge { |
| 73 | u16 vendor; | 65 | u16 vendor; |
| @@ -388,7 +380,8 @@ static void mvebu_sw_pci_bridge_init(struct mvebu_pcie_port *port) | |||
| 388 | 380 | ||
| 389 | bridge->class = PCI_CLASS_BRIDGE_PCI; | 381 | bridge->class = PCI_CLASS_BRIDGE_PCI; |
| 390 | bridge->vendor = PCI_VENDOR_ID_MARVELL; | 382 | bridge->vendor = PCI_VENDOR_ID_MARVELL; |
| 391 | bridge->device = MARVELL_EMULATED_PCI_PCI_BRIDGE_ID; | 383 | bridge->device = mvebu_readl(port, PCIE_DEV_ID_OFF) >> 16; |
| 384 | bridge->revision = mvebu_readl(port, PCIE_DEV_REV_OFF) & 0xff; | ||
| 392 | bridge->header_type = PCI_HEADER_TYPE_BRIDGE; | 385 | bridge->header_type = PCI_HEADER_TYPE_BRIDGE; |
| 393 | bridge->cache_line_size = 0x10; | 386 | bridge->cache_line_size = 0x10; |
| 394 | 387 | ||
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c index 7a0fec6ce571..955ab7990c5b 100644 --- a/drivers/pci/msi.c +++ b/drivers/pci/msi.c | |||
| @@ -545,9 +545,15 @@ static int populate_msi_sysfs(struct pci_dev *pdev) | |||
| 545 | return -ENOMEM; | 545 | return -ENOMEM; |
| 546 | list_for_each_entry(entry, &pdev->msi_list, list) { | 546 | list_for_each_entry(entry, &pdev->msi_list, list) { |
| 547 | char *name = kmalloc(20, GFP_KERNEL); | 547 | char *name = kmalloc(20, GFP_KERNEL); |
| 548 | if (!name) | ||
| 549 | goto error_attrs; | ||
| 550 | |||
| 548 | msi_dev_attr = kzalloc(sizeof(*msi_dev_attr), GFP_KERNEL); | 551 | msi_dev_attr = kzalloc(sizeof(*msi_dev_attr), GFP_KERNEL); |
| 549 | if (!msi_dev_attr) | 552 | if (!msi_dev_attr) { |
| 553 | kfree(name); | ||
| 550 | goto error_attrs; | 554 | goto error_attrs; |
| 555 | } | ||
| 556 | |||
| 551 | sprintf(name, "%d", entry->irq); | 557 | sprintf(name, "%d", entry->irq); |
| 552 | sysfs_attr_init(&msi_dev_attr->attr); | 558 | sysfs_attr_init(&msi_dev_attr->attr); |
| 553 | msi_dev_attr->attr.name = name; | 559 | msi_dev_attr->attr.name = name; |
| @@ -589,6 +595,7 @@ error_attrs: | |||
| 589 | ++count; | 595 | ++count; |
| 590 | msi_attr = msi_attrs[count]; | 596 | msi_attr = msi_attrs[count]; |
| 591 | } | 597 | } |
| 598 | kfree(msi_attrs); | ||
| 592 | return ret; | 599 | return ret; |
| 593 | } | 600 | } |
| 594 | 601 | ||
| @@ -959,7 +966,6 @@ EXPORT_SYMBOL(pci_disable_msi); | |||
| 959 | /** | 966 | /** |
| 960 | * pci_msix_vec_count - return the number of device's MSI-X table entries | 967 | * pci_msix_vec_count - return the number of device's MSI-X table entries |
| 961 | * @dev: pointer to the pci_dev data structure of MSI-X device function | 968 | * @dev: pointer to the pci_dev data structure of MSI-X device function |
| 962 | |||
| 963 | * This function returns the number of device's MSI-X table entries and | 969 | * This function returns the number of device's MSI-X table entries and |
| 964 | * therefore the number of MSI-X vectors device is capable of sending. | 970 | * therefore the number of MSI-X vectors device is capable of sending. |
| 965 | * It returns a negative errno if the device is not capable of sending MSI-X | 971 | * It returns a negative errno if the device is not capable of sending MSI-X |
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 1febe90831b4..6b05f6134b68 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
| @@ -1181,6 +1181,8 @@ EXPORT_SYMBOL_GPL(pci_load_and_free_saved_state); | |||
| 1181 | static int do_pci_enable_device(struct pci_dev *dev, int bars) | 1181 | static int do_pci_enable_device(struct pci_dev *dev, int bars) |
| 1182 | { | 1182 | { |
| 1183 | int err; | 1183 | int err; |
| 1184 | u16 cmd; | ||
| 1185 | u8 pin; | ||
| 1184 | 1186 | ||
| 1185 | err = pci_set_power_state(dev, PCI_D0); | 1187 | err = pci_set_power_state(dev, PCI_D0); |
| 1186 | if (err < 0 && err != -EIO) | 1188 | if (err < 0 && err != -EIO) |
| @@ -1190,6 +1192,14 @@ static int do_pci_enable_device(struct pci_dev *dev, int bars) | |||
| 1190 | return err; | 1192 | return err; |
| 1191 | pci_fixup_device(pci_fixup_enable, dev); | 1193 | pci_fixup_device(pci_fixup_enable, dev); |
| 1192 | 1194 | ||
| 1195 | pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin); | ||
| 1196 | if (pin) { | ||
| 1197 | pci_read_config_word(dev, PCI_COMMAND, &cmd); | ||
| 1198 | if (cmd & PCI_COMMAND_INTX_DISABLE) | ||
| 1199 | pci_write_config_word(dev, PCI_COMMAND, | ||
| 1200 | cmd & ~PCI_COMMAND_INTX_DISABLE); | ||
| 1201 | } | ||
| 1202 | |||
| 1193 | return 0; | 1203 | return 0; |
| 1194 | } | 1204 | } |
| 1195 | 1205 | ||
diff --git a/drivers/phy/Kconfig b/drivers/phy/Kconfig index afa2354f6600..c7a551c2d5f1 100644 --- a/drivers/phy/Kconfig +++ b/drivers/phy/Kconfig | |||
| @@ -5,7 +5,7 @@ | |||
| 5 | menu "PHY Subsystem" | 5 | menu "PHY Subsystem" |
| 6 | 6 | ||
| 7 | config GENERIC_PHY | 7 | config GENERIC_PHY |
| 8 | tristate "PHY Core" | 8 | bool "PHY Core" |
| 9 | help | 9 | help |
| 10 | Generic PHY support. | 10 | Generic PHY support. |
| 11 | 11 | ||
| @@ -61,6 +61,7 @@ config PHY_EXYNOS_DP_VIDEO | |||
| 61 | config BCM_KONA_USB2_PHY | 61 | config BCM_KONA_USB2_PHY |
| 62 | tristate "Broadcom Kona USB2 PHY Driver" | 62 | tristate "Broadcom Kona USB2 PHY Driver" |
| 63 | depends on GENERIC_PHY | 63 | depends on GENERIC_PHY |
| 64 | depends on HAS_IOMEM | ||
| 64 | help | 65 | help |
| 65 | Enable this to support the Broadcom Kona USB 2.0 PHY. | 66 | Enable this to support the Broadcom Kona USB 2.0 PHY. |
| 66 | 67 | ||
diff --git a/drivers/phy/phy-core.c b/drivers/phy/phy-core.c index 5f5b0f4be5be..6c738376daff 100644 --- a/drivers/phy/phy-core.c +++ b/drivers/phy/phy-core.c | |||
| @@ -176,6 +176,8 @@ int phy_init(struct phy *phy) | |||
| 176 | dev_err(&phy->dev, "phy init failed --> %d\n", ret); | 176 | dev_err(&phy->dev, "phy init failed --> %d\n", ret); |
| 177 | goto out; | 177 | goto out; |
| 178 | } | 178 | } |
| 179 | } else { | ||
| 180 | ret = 0; /* Override possible ret == -ENOTSUPP */ | ||
| 179 | } | 181 | } |
| 180 | ++phy->init_count; | 182 | ++phy->init_count; |
| 181 | 183 | ||
| @@ -232,6 +234,8 @@ int phy_power_on(struct phy *phy) | |||
| 232 | dev_err(&phy->dev, "phy poweron failed --> %d\n", ret); | 234 | dev_err(&phy->dev, "phy poweron failed --> %d\n", ret); |
| 233 | goto out; | 235 | goto out; |
| 234 | } | 236 | } |
| 237 | } else { | ||
| 238 | ret = 0; /* Override possible ret == -ENOTSUPP */ | ||
| 235 | } | 239 | } |
| 236 | ++phy->power_count; | 240 | ++phy->power_count; |
| 237 | mutex_unlock(&phy->mutex); | 241 | mutex_unlock(&phy->mutex); |
| @@ -404,17 +408,11 @@ struct phy *phy_get(struct device *dev, const char *string) | |||
| 404 | index = of_property_match_string(dev->of_node, "phy-names", | 408 | index = of_property_match_string(dev->of_node, "phy-names", |
| 405 | string); | 409 | string); |
| 406 | phy = of_phy_get(dev, index); | 410 | phy = of_phy_get(dev, index); |
| 407 | if (IS_ERR(phy)) { | ||
| 408 | dev_err(dev, "unable to find phy\n"); | ||
| 409 | return phy; | ||
| 410 | } | ||
| 411 | } else { | 411 | } else { |
| 412 | phy = phy_lookup(dev, string); | 412 | phy = phy_lookup(dev, string); |
| 413 | if (IS_ERR(phy)) { | ||
| 414 | dev_err(dev, "unable to find phy\n"); | ||
| 415 | return phy; | ||
| 416 | } | ||
| 417 | } | 413 | } |
| 414 | if (IS_ERR(phy)) | ||
| 415 | return phy; | ||
| 418 | 416 | ||
| 419 | if (!try_module_get(phy->ops->owner)) | 417 | if (!try_module_get(phy->ops->owner)) |
| 420 | return ERR_PTR(-EPROBE_DEFER); | 418 | return ERR_PTR(-EPROBE_DEFER); |
diff --git a/drivers/phy/phy-exynos-dp-video.c b/drivers/phy/phy-exynos-dp-video.c index 1dbe6ce7b2ce..0786fef842e7 100644 --- a/drivers/phy/phy-exynos-dp-video.c +++ b/drivers/phy/phy-exynos-dp-video.c | |||
| @@ -76,10 +76,6 @@ static int exynos_dp_video_phy_probe(struct platform_device *pdev) | |||
| 76 | if (IS_ERR(state->regs)) | 76 | if (IS_ERR(state->regs)) |
| 77 | return PTR_ERR(state->regs); | 77 | return PTR_ERR(state->regs); |
| 78 | 78 | ||
| 79 | phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); | ||
| 80 | if (IS_ERR(phy_provider)) | ||
| 81 | return PTR_ERR(phy_provider); | ||
| 82 | |||
| 83 | phy = devm_phy_create(dev, &exynos_dp_video_phy_ops, NULL); | 79 | phy = devm_phy_create(dev, &exynos_dp_video_phy_ops, NULL); |
| 84 | if (IS_ERR(phy)) { | 80 | if (IS_ERR(phy)) { |
| 85 | dev_err(dev, "failed to create Display Port PHY\n"); | 81 | dev_err(dev, "failed to create Display Port PHY\n"); |
| @@ -87,6 +83,10 @@ static int exynos_dp_video_phy_probe(struct platform_device *pdev) | |||
| 87 | } | 83 | } |
| 88 | phy_set_drvdata(phy, state); | 84 | phy_set_drvdata(phy, state); |
| 89 | 85 | ||
| 86 | phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); | ||
| 87 | if (IS_ERR(phy_provider)) | ||
| 88 | return PTR_ERR(phy_provider); | ||
| 89 | |||
| 90 | return 0; | 90 | return 0; |
| 91 | } | 91 | } |
| 92 | 92 | ||
diff --git a/drivers/phy/phy-exynos-mipi-video.c b/drivers/phy/phy-exynos-mipi-video.c index 0c5efab11af1..7f139326a642 100644 --- a/drivers/phy/phy-exynos-mipi-video.c +++ b/drivers/phy/phy-exynos-mipi-video.c | |||
| @@ -134,11 +134,6 @@ static int exynos_mipi_video_phy_probe(struct platform_device *pdev) | |||
| 134 | dev_set_drvdata(dev, state); | 134 | dev_set_drvdata(dev, state); |
| 135 | spin_lock_init(&state->slock); | 135 | spin_lock_init(&state->slock); |
| 136 | 136 | ||
| 137 | phy_provider = devm_of_phy_provider_register(dev, | ||
| 138 | exynos_mipi_video_phy_xlate); | ||
| 139 | if (IS_ERR(phy_provider)) | ||
| 140 | return PTR_ERR(phy_provider); | ||
| 141 | |||
| 142 | for (i = 0; i < EXYNOS_MIPI_PHYS_NUM; i++) { | 137 | for (i = 0; i < EXYNOS_MIPI_PHYS_NUM; i++) { |
| 143 | struct phy *phy = devm_phy_create(dev, | 138 | struct phy *phy = devm_phy_create(dev, |
| 144 | &exynos_mipi_video_phy_ops, NULL); | 139 | &exynos_mipi_video_phy_ops, NULL); |
| @@ -152,6 +147,11 @@ static int exynos_mipi_video_phy_probe(struct platform_device *pdev) | |||
| 152 | phy_set_drvdata(phy, &state->phys[i]); | 147 | phy_set_drvdata(phy, &state->phys[i]); |
| 153 | } | 148 | } |
| 154 | 149 | ||
| 150 | phy_provider = devm_of_phy_provider_register(dev, | ||
| 151 | exynos_mipi_video_phy_xlate); | ||
| 152 | if (IS_ERR(phy_provider)) | ||
| 153 | return PTR_ERR(phy_provider); | ||
| 154 | |||
| 155 | return 0; | 155 | return 0; |
| 156 | } | 156 | } |
| 157 | 157 | ||
diff --git a/drivers/phy/phy-mvebu-sata.c b/drivers/phy/phy-mvebu-sata.c index d43786f62437..d70ecd6a1b3f 100644 --- a/drivers/phy/phy-mvebu-sata.c +++ b/drivers/phy/phy-mvebu-sata.c | |||
| @@ -99,17 +99,17 @@ static int phy_mvebu_sata_probe(struct platform_device *pdev) | |||
| 99 | if (IS_ERR(priv->clk)) | 99 | if (IS_ERR(priv->clk)) |
| 100 | return PTR_ERR(priv->clk); | 100 | return PTR_ERR(priv->clk); |
| 101 | 101 | ||
| 102 | phy_provider = devm_of_phy_provider_register(&pdev->dev, | ||
| 103 | of_phy_simple_xlate); | ||
| 104 | if (IS_ERR(phy_provider)) | ||
| 105 | return PTR_ERR(phy_provider); | ||
| 106 | |||
| 107 | phy = devm_phy_create(&pdev->dev, &phy_mvebu_sata_ops, NULL); | 102 | phy = devm_phy_create(&pdev->dev, &phy_mvebu_sata_ops, NULL); |
| 108 | if (IS_ERR(phy)) | 103 | if (IS_ERR(phy)) |
| 109 | return PTR_ERR(phy); | 104 | return PTR_ERR(phy); |
| 110 | 105 | ||
| 111 | phy_set_drvdata(phy, priv); | 106 | phy_set_drvdata(phy, priv); |
| 112 | 107 | ||
| 108 | phy_provider = devm_of_phy_provider_register(&pdev->dev, | ||
| 109 | of_phy_simple_xlate); | ||
| 110 | if (IS_ERR(phy_provider)) | ||
| 111 | return PTR_ERR(phy_provider); | ||
| 112 | |||
| 113 | /* The boot loader may of left it on. Turn it off. */ | 113 | /* The boot loader may of left it on. Turn it off. */ |
| 114 | phy_mvebu_sata_power_off(phy); | 114 | phy_mvebu_sata_power_off(phy); |
| 115 | 115 | ||
diff --git a/drivers/phy/phy-omap-usb2.c b/drivers/phy/phy-omap-usb2.c index bfc5c337f99a..7699752fba11 100644 --- a/drivers/phy/phy-omap-usb2.c +++ b/drivers/phy/phy-omap-usb2.c | |||
| @@ -177,11 +177,6 @@ static int omap_usb2_probe(struct platform_device *pdev) | |||
| 177 | phy->phy.otg = otg; | 177 | phy->phy.otg = otg; |
| 178 | phy->phy.type = USB_PHY_TYPE_USB2; | 178 | phy->phy.type = USB_PHY_TYPE_USB2; |
| 179 | 179 | ||
| 180 | phy_provider = devm_of_phy_provider_register(phy->dev, | ||
| 181 | of_phy_simple_xlate); | ||
| 182 | if (IS_ERR(phy_provider)) | ||
| 183 | return PTR_ERR(phy_provider); | ||
| 184 | |||
| 185 | control_node = of_parse_phandle(node, "ctrl-module", 0); | 180 | control_node = of_parse_phandle(node, "ctrl-module", 0); |
| 186 | if (!control_node) { | 181 | if (!control_node) { |
| 187 | dev_err(&pdev->dev, "Failed to get control device phandle\n"); | 182 | dev_err(&pdev->dev, "Failed to get control device phandle\n"); |
| @@ -214,6 +209,11 @@ static int omap_usb2_probe(struct platform_device *pdev) | |||
| 214 | 209 | ||
| 215 | phy_set_drvdata(generic_phy, phy); | 210 | phy_set_drvdata(generic_phy, phy); |
| 216 | 211 | ||
| 212 | phy_provider = devm_of_phy_provider_register(phy->dev, | ||
| 213 | of_phy_simple_xlate); | ||
| 214 | if (IS_ERR(phy_provider)) | ||
| 215 | return PTR_ERR(phy_provider); | ||
| 216 | |||
| 217 | phy->wkupclk = devm_clk_get(phy->dev, "usb_phy_cm_clk32k"); | 217 | phy->wkupclk = devm_clk_get(phy->dev, "usb_phy_cm_clk32k"); |
| 218 | if (IS_ERR(phy->wkupclk)) { | 218 | if (IS_ERR(phy->wkupclk)) { |
| 219 | dev_err(&pdev->dev, "unable to get usb_phy_cm_clk32k\n"); | 219 | dev_err(&pdev->dev, "unable to get usb_phy_cm_clk32k\n"); |
diff --git a/drivers/phy/phy-twl4030-usb.c b/drivers/phy/phy-twl4030-usb.c index daf65e68aaab..c3ace1db8136 100644 --- a/drivers/phy/phy-twl4030-usb.c +++ b/drivers/phy/phy-twl4030-usb.c | |||
| @@ -695,11 +695,6 @@ static int twl4030_usb_probe(struct platform_device *pdev) | |||
| 695 | otg->set_host = twl4030_set_host; | 695 | otg->set_host = twl4030_set_host; |
| 696 | otg->set_peripheral = twl4030_set_peripheral; | 696 | otg->set_peripheral = twl4030_set_peripheral; |
| 697 | 697 | ||
| 698 | phy_provider = devm_of_phy_provider_register(twl->dev, | ||
| 699 | of_phy_simple_xlate); | ||
| 700 | if (IS_ERR(phy_provider)) | ||
| 701 | return PTR_ERR(phy_provider); | ||
| 702 | |||
| 703 | phy = devm_phy_create(twl->dev, &ops, init_data); | 698 | phy = devm_phy_create(twl->dev, &ops, init_data); |
| 704 | if (IS_ERR(phy)) { | 699 | if (IS_ERR(phy)) { |
| 705 | dev_dbg(&pdev->dev, "Failed to create PHY\n"); | 700 | dev_dbg(&pdev->dev, "Failed to create PHY\n"); |
| @@ -708,6 +703,11 @@ static int twl4030_usb_probe(struct platform_device *pdev) | |||
| 708 | 703 | ||
| 709 | phy_set_drvdata(phy, twl); | 704 | phy_set_drvdata(phy, twl); |
| 710 | 705 | ||
| 706 | phy_provider = devm_of_phy_provider_register(twl->dev, | ||
| 707 | of_phy_simple_xlate); | ||
| 708 | if (IS_ERR(phy_provider)) | ||
| 709 | return PTR_ERR(phy_provider); | ||
| 710 | |||
| 711 | /* init spinlock for workqueue */ | 711 | /* init spinlock for workqueue */ |
| 712 | spin_lock_init(&twl->lock); | 712 | spin_lock_init(&twl->lock); |
| 713 | 713 | ||
diff --git a/drivers/pwm/pwm-lp3943.c b/drivers/pwm/pwm-lp3943.c index 8a843a04c224..a40b9c34e9ff 100644 --- a/drivers/pwm/pwm-lp3943.c +++ b/drivers/pwm/pwm-lp3943.c | |||
| @@ -52,8 +52,10 @@ lp3943_pwm_request_map(struct lp3943_pwm *lp3943_pwm, int hwpwm) | |||
| 52 | offset = pwm_map->output[i]; | 52 | offset = pwm_map->output[i]; |
| 53 | 53 | ||
| 54 | /* Return an error if the pin is already assigned */ | 54 | /* Return an error if the pin is already assigned */ |
| 55 | if (test_and_set_bit(offset, &lp3943->pin_used)) | 55 | if (test_and_set_bit(offset, &lp3943->pin_used)) { |
| 56 | kfree(pwm_map); | ||
| 56 | return ERR_PTR(-EBUSY); | 57 | return ERR_PTR(-EBUSY); |
| 58 | } | ||
| 57 | } | 59 | } |
| 58 | 60 | ||
| 59 | return pwm_map; | 61 | return pwm_map; |
diff --git a/drivers/rapidio/devices/tsi721.h b/drivers/rapidio/devices/tsi721.h index b4b0d83f9ef6..7061ac0ad428 100644 --- a/drivers/rapidio/devices/tsi721.h +++ b/drivers/rapidio/devices/tsi721.h | |||
| @@ -678,6 +678,7 @@ struct tsi721_bdma_chan { | |||
| 678 | struct list_head free_list; | 678 | struct list_head free_list; |
| 679 | dma_cookie_t completed_cookie; | 679 | dma_cookie_t completed_cookie; |
| 680 | struct tasklet_struct tasklet; | 680 | struct tasklet_struct tasklet; |
| 681 | bool active; | ||
| 681 | }; | 682 | }; |
| 682 | 683 | ||
| 683 | #endif /* CONFIG_RAPIDIO_DMA_ENGINE */ | 684 | #endif /* CONFIG_RAPIDIO_DMA_ENGINE */ |
diff --git a/drivers/rapidio/devices/tsi721_dma.c b/drivers/rapidio/devices/tsi721_dma.c index 502663f5f7c6..91245f5dbe81 100644 --- a/drivers/rapidio/devices/tsi721_dma.c +++ b/drivers/rapidio/devices/tsi721_dma.c | |||
| @@ -206,8 +206,8 @@ void tsi721_bdma_handler(struct tsi721_bdma_chan *bdma_chan) | |||
| 206 | { | 206 | { |
| 207 | /* Disable BDMA channel interrupts */ | 207 | /* Disable BDMA channel interrupts */ |
| 208 | iowrite32(0, bdma_chan->regs + TSI721_DMAC_INTE); | 208 | iowrite32(0, bdma_chan->regs + TSI721_DMAC_INTE); |
| 209 | 209 | if (bdma_chan->active) | |
| 210 | tasklet_schedule(&bdma_chan->tasklet); | 210 | tasklet_schedule(&bdma_chan->tasklet); |
| 211 | } | 211 | } |
| 212 | 212 | ||
| 213 | #ifdef CONFIG_PCI_MSI | 213 | #ifdef CONFIG_PCI_MSI |
| @@ -562,7 +562,7 @@ static int tsi721_alloc_chan_resources(struct dma_chan *dchan) | |||
| 562 | } | 562 | } |
| 563 | #endif /* CONFIG_PCI_MSI */ | 563 | #endif /* CONFIG_PCI_MSI */ |
| 564 | 564 | ||
| 565 | tasklet_enable(&bdma_chan->tasklet); | 565 | bdma_chan->active = true; |
| 566 | tsi721_bdma_interrupt_enable(bdma_chan, 1); | 566 | tsi721_bdma_interrupt_enable(bdma_chan, 1); |
| 567 | 567 | ||
| 568 | return bdma_chan->bd_num - 1; | 568 | return bdma_chan->bd_num - 1; |
| @@ -576,9 +576,7 @@ err_out: | |||
| 576 | static void tsi721_free_chan_resources(struct dma_chan *dchan) | 576 | static void tsi721_free_chan_resources(struct dma_chan *dchan) |
| 577 | { | 577 | { |
| 578 | struct tsi721_bdma_chan *bdma_chan = to_tsi721_chan(dchan); | 578 | struct tsi721_bdma_chan *bdma_chan = to_tsi721_chan(dchan); |
| 579 | #ifdef CONFIG_PCI_MSI | ||
| 580 | struct tsi721_device *priv = to_tsi721(dchan->device); | 579 | struct tsi721_device *priv = to_tsi721(dchan->device); |
| 581 | #endif | ||
| 582 | LIST_HEAD(list); | 580 | LIST_HEAD(list); |
| 583 | 581 | ||
| 584 | dev_dbg(dchan->device->dev, "%s: Entry\n", __func__); | 582 | dev_dbg(dchan->device->dev, "%s: Entry\n", __func__); |
| @@ -589,14 +587,25 @@ static void tsi721_free_chan_resources(struct dma_chan *dchan) | |||
| 589 | BUG_ON(!list_empty(&bdma_chan->active_list)); | 587 | BUG_ON(!list_empty(&bdma_chan->active_list)); |
| 590 | BUG_ON(!list_empty(&bdma_chan->queue)); | 588 | BUG_ON(!list_empty(&bdma_chan->queue)); |
| 591 | 589 | ||
| 592 | tasklet_disable(&bdma_chan->tasklet); | 590 | tsi721_bdma_interrupt_enable(bdma_chan, 0); |
| 591 | bdma_chan->active = false; | ||
| 592 | |||
| 593 | #ifdef CONFIG_PCI_MSI | ||
| 594 | if (priv->flags & TSI721_USING_MSIX) { | ||
| 595 | synchronize_irq(priv->msix[TSI721_VECT_DMA0_DONE + | ||
| 596 | bdma_chan->id].vector); | ||
| 597 | synchronize_irq(priv->msix[TSI721_VECT_DMA0_INT + | ||
| 598 | bdma_chan->id].vector); | ||
| 599 | } else | ||
| 600 | #endif | ||
| 601 | synchronize_irq(priv->pdev->irq); | ||
| 602 | |||
| 603 | tasklet_kill(&bdma_chan->tasklet); | ||
| 593 | 604 | ||
| 594 | spin_lock_bh(&bdma_chan->lock); | 605 | spin_lock_bh(&bdma_chan->lock); |
| 595 | list_splice_init(&bdma_chan->free_list, &list); | 606 | list_splice_init(&bdma_chan->free_list, &list); |
| 596 | spin_unlock_bh(&bdma_chan->lock); | 607 | spin_unlock_bh(&bdma_chan->lock); |
| 597 | 608 | ||
| 598 | tsi721_bdma_interrupt_enable(bdma_chan, 0); | ||
| 599 | |||
| 600 | #ifdef CONFIG_PCI_MSI | 609 | #ifdef CONFIG_PCI_MSI |
| 601 | if (priv->flags & TSI721_USING_MSIX) { | 610 | if (priv->flags & TSI721_USING_MSIX) { |
| 602 | free_irq(priv->msix[TSI721_VECT_DMA0_DONE + | 611 | free_irq(priv->msix[TSI721_VECT_DMA0_DONE + |
| @@ -790,6 +799,7 @@ int tsi721_register_dma(struct tsi721_device *priv) | |||
| 790 | bdma_chan->dchan.cookie = 1; | 799 | bdma_chan->dchan.cookie = 1; |
| 791 | bdma_chan->dchan.chan_id = i; | 800 | bdma_chan->dchan.chan_id = i; |
| 792 | bdma_chan->id = i; | 801 | bdma_chan->id = i; |
| 802 | bdma_chan->active = false; | ||
| 793 | 803 | ||
| 794 | spin_lock_init(&bdma_chan->lock); | 804 | spin_lock_init(&bdma_chan->lock); |
| 795 | 805 | ||
| @@ -799,7 +809,6 @@ int tsi721_register_dma(struct tsi721_device *priv) | |||
| 799 | 809 | ||
| 800 | tasklet_init(&bdma_chan->tasklet, tsi721_dma_tasklet, | 810 | tasklet_init(&bdma_chan->tasklet, tsi721_dma_tasklet, |
| 801 | (unsigned long)bdma_chan); | 811 | (unsigned long)bdma_chan); |
| 802 | tasklet_disable(&bdma_chan->tasklet); | ||
| 803 | list_add_tail(&bdma_chan->dchan.device_node, | 812 | list_add_tail(&bdma_chan->dchan.device_node, |
| 804 | &mport->dma.channels); | 813 | &mport->dma.channels); |
| 805 | } | 814 | } |
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index 16a309e5c024..afca1bc24f26 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c | |||
| @@ -953,6 +953,8 @@ static int machine_constraints_current(struct regulator_dev *rdev, | |||
| 953 | return 0; | 953 | return 0; |
| 954 | } | 954 | } |
| 955 | 955 | ||
| 956 | static int _regulator_do_enable(struct regulator_dev *rdev); | ||
| 957 | |||
| 956 | /** | 958 | /** |
| 957 | * set_machine_constraints - sets regulator constraints | 959 | * set_machine_constraints - sets regulator constraints |
| 958 | * @rdev: regulator source | 960 | * @rdev: regulator source |
| @@ -1013,10 +1015,9 @@ static int set_machine_constraints(struct regulator_dev *rdev, | |||
| 1013 | /* If the constraints say the regulator should be on at this point | 1015 | /* If the constraints say the regulator should be on at this point |
| 1014 | * and we have control then make sure it is enabled. | 1016 | * and we have control then make sure it is enabled. |
| 1015 | */ | 1017 | */ |
| 1016 | if ((rdev->constraints->always_on || rdev->constraints->boot_on) && | 1018 | if (rdev->constraints->always_on || rdev->constraints->boot_on) { |
| 1017 | ops->enable) { | 1019 | ret = _regulator_do_enable(rdev); |
| 1018 | ret = ops->enable(rdev); | 1020 | if (ret < 0 && ret != -EINVAL) { |
| 1019 | if (ret < 0) { | ||
| 1020 | rdev_err(rdev, "failed to enable\n"); | 1021 | rdev_err(rdev, "failed to enable\n"); |
| 1021 | goto out; | 1022 | goto out; |
| 1022 | } | 1023 | } |
| @@ -1359,7 +1360,7 @@ static struct regulator *_regulator_get(struct device *dev, const char *id, | |||
| 1359 | goto found; | 1360 | goto found; |
| 1360 | /* Don't log an error when called from regulator_get_optional() */ | 1361 | /* Don't log an error when called from regulator_get_optional() */ |
| 1361 | } else if (!have_full_constraints() || exclusive) { | 1362 | } else if (!have_full_constraints() || exclusive) { |
| 1362 | dev_err(dev, "dummy supplies not allowed\n"); | 1363 | dev_warn(dev, "dummy supplies not allowed\n"); |
| 1363 | } | 1364 | } |
| 1364 | 1365 | ||
| 1365 | mutex_unlock(®ulator_list_mutex); | 1366 | mutex_unlock(®ulator_list_mutex); |
| @@ -1907,8 +1908,6 @@ static int _regulator_do_disable(struct regulator_dev *rdev) | |||
| 1907 | 1908 | ||
| 1908 | trace_regulator_disable_complete(rdev_get_name(rdev)); | 1909 | trace_regulator_disable_complete(rdev_get_name(rdev)); |
| 1909 | 1910 | ||
| 1910 | _notifier_call_chain(rdev, REGULATOR_EVENT_DISABLE, | ||
| 1911 | NULL); | ||
| 1912 | return 0; | 1911 | return 0; |
| 1913 | } | 1912 | } |
| 1914 | 1913 | ||
| @@ -1932,6 +1931,8 @@ static int _regulator_disable(struct regulator_dev *rdev) | |||
| 1932 | rdev_err(rdev, "failed to disable\n"); | 1931 | rdev_err(rdev, "failed to disable\n"); |
| 1933 | return ret; | 1932 | return ret; |
| 1934 | } | 1933 | } |
| 1934 | _notifier_call_chain(rdev, REGULATOR_EVENT_DISABLE, | ||
| 1935 | NULL); | ||
| 1935 | } | 1936 | } |
| 1936 | 1937 | ||
| 1937 | rdev->use_count = 0; | 1938 | rdev->use_count = 0; |
| @@ -1984,20 +1985,16 @@ static int _regulator_force_disable(struct regulator_dev *rdev) | |||
| 1984 | { | 1985 | { |
| 1985 | int ret = 0; | 1986 | int ret = 0; |
| 1986 | 1987 | ||
| 1987 | /* force disable */ | 1988 | ret = _regulator_do_disable(rdev); |
| 1988 | if (rdev->desc->ops->disable) { | 1989 | if (ret < 0) { |
| 1989 | /* ah well, who wants to live forever... */ | 1990 | rdev_err(rdev, "failed to force disable\n"); |
| 1990 | ret = rdev->desc->ops->disable(rdev); | 1991 | return ret; |
| 1991 | if (ret < 0) { | ||
| 1992 | rdev_err(rdev, "failed to force disable\n"); | ||
| 1993 | return ret; | ||
| 1994 | } | ||
| 1995 | /* notify other consumers that power has been forced off */ | ||
| 1996 | _notifier_call_chain(rdev, REGULATOR_EVENT_FORCE_DISABLE | | ||
| 1997 | REGULATOR_EVENT_DISABLE, NULL); | ||
| 1998 | } | 1992 | } |
| 1999 | 1993 | ||
| 2000 | return ret; | 1994 | _notifier_call_chain(rdev, REGULATOR_EVENT_FORCE_DISABLE | |
| 1995 | REGULATOR_EVENT_DISABLE, NULL); | ||
| 1996 | |||
| 1997 | return 0; | ||
| 2001 | } | 1998 | } |
| 2002 | 1999 | ||
| 2003 | /** | 2000 | /** |
| @@ -3630,23 +3627,18 @@ int regulator_suspend_finish(void) | |||
| 3630 | 3627 | ||
| 3631 | mutex_lock(®ulator_list_mutex); | 3628 | mutex_lock(®ulator_list_mutex); |
| 3632 | list_for_each_entry(rdev, ®ulator_list, list) { | 3629 | list_for_each_entry(rdev, ®ulator_list, list) { |
| 3633 | struct regulator_ops *ops = rdev->desc->ops; | ||
| 3634 | |||
| 3635 | mutex_lock(&rdev->mutex); | 3630 | mutex_lock(&rdev->mutex); |
| 3636 | if ((rdev->use_count > 0 || rdev->constraints->always_on) && | 3631 | if (rdev->use_count > 0 || rdev->constraints->always_on) { |
| 3637 | ops->enable) { | 3632 | error = _regulator_do_enable(rdev); |
| 3638 | error = ops->enable(rdev); | ||
| 3639 | if (error) | 3633 | if (error) |
| 3640 | ret = error; | 3634 | ret = error; |
| 3641 | } else { | 3635 | } else { |
| 3642 | if (!have_full_constraints()) | 3636 | if (!have_full_constraints()) |
| 3643 | goto unlock; | 3637 | goto unlock; |
| 3644 | if (!ops->disable) | ||
| 3645 | goto unlock; | ||
| 3646 | if (!_regulator_is_enabled(rdev)) | 3638 | if (!_regulator_is_enabled(rdev)) |
| 3647 | goto unlock; | 3639 | goto unlock; |
| 3648 | 3640 | ||
| 3649 | error = ops->disable(rdev); | 3641 | error = _regulator_do_disable(rdev); |
| 3650 | if (error) | 3642 | if (error) |
| 3651 | ret = error; | 3643 | ret = error; |
| 3652 | } | 3644 | } |
| @@ -3820,7 +3812,7 @@ static int __init regulator_init_complete(void) | |||
| 3820 | ops = rdev->desc->ops; | 3812 | ops = rdev->desc->ops; |
| 3821 | c = rdev->constraints; | 3813 | c = rdev->constraints; |
| 3822 | 3814 | ||
| 3823 | if (!ops->disable || (c && c->always_on)) | 3815 | if (c && c->always_on) |
| 3824 | continue; | 3816 | continue; |
| 3825 | 3817 | ||
| 3826 | mutex_lock(&rdev->mutex); | 3818 | mutex_lock(&rdev->mutex); |
| @@ -3841,7 +3833,7 @@ static int __init regulator_init_complete(void) | |||
| 3841 | /* We log since this may kill the system if it | 3833 | /* We log since this may kill the system if it |
| 3842 | * goes wrong. */ | 3834 | * goes wrong. */ |
| 3843 | rdev_info(rdev, "disabling\n"); | 3835 | rdev_info(rdev, "disabling\n"); |
| 3844 | ret = ops->disable(rdev); | 3836 | ret = _regulator_do_disable(rdev); |
| 3845 | if (ret != 0) | 3837 | if (ret != 0) |
| 3846 | rdev_err(rdev, "couldn't disable: %d\n", ret); | 3838 | rdev_err(rdev, "couldn't disable: %d\n", ret); |
| 3847 | } else { | 3839 | } else { |
diff --git a/drivers/regulator/da9063-regulator.c b/drivers/regulator/da9063-regulator.c index 56727eb745df..91e99a2c8dc1 100644 --- a/drivers/regulator/da9063-regulator.c +++ b/drivers/regulator/da9063-regulator.c | |||
| @@ -1,3 +1,4 @@ | |||
| 1 | |||
| 1 | /* | 2 | /* |
| 2 | * Regulator driver for DA9063 PMIC series | 3 | * Regulator driver for DA9063 PMIC series |
| 3 | * | 4 | * |
| @@ -60,7 +61,8 @@ struct da9063_regulator_info { | |||
| 60 | .desc.ops = &da9063_ldo_ops, \ | 61 | .desc.ops = &da9063_ldo_ops, \ |
| 61 | .desc.min_uV = (min_mV) * 1000, \ | 62 | .desc.min_uV = (min_mV) * 1000, \ |
| 62 | .desc.uV_step = (step_mV) * 1000, \ | 63 | .desc.uV_step = (step_mV) * 1000, \ |
| 63 | .desc.n_voltages = (((max_mV) - (min_mV))/(step_mV) + 1), \ | 64 | .desc.n_voltages = (((max_mV) - (min_mV))/(step_mV) + 1 \ |
| 65 | + (DA9063_V##regl_name##_BIAS)), \ | ||
| 64 | .desc.enable_reg = DA9063_REG_##regl_name##_CONT, \ | 66 | .desc.enable_reg = DA9063_REG_##regl_name##_CONT, \ |
| 65 | .desc.enable_mask = DA9063_LDO_EN, \ | 67 | .desc.enable_mask = DA9063_LDO_EN, \ |
| 66 | .desc.vsel_reg = DA9063_REG_V##regl_name##_A, \ | 68 | .desc.vsel_reg = DA9063_REG_V##regl_name##_A, \ |
diff --git a/drivers/regulator/max14577.c b/drivers/regulator/max14577.c index 186df8785a91..e0619526708c 100644 --- a/drivers/regulator/max14577.c +++ b/drivers/regulator/max14577.c | |||
| @@ -166,9 +166,10 @@ static int max14577_regulator_dt_parse_pdata(struct platform_device *pdev) | |||
| 166 | 166 | ||
| 167 | ret = of_regulator_match(&pdev->dev, np, max14577_regulator_matches, | 167 | ret = of_regulator_match(&pdev->dev, np, max14577_regulator_matches, |
| 168 | MAX14577_REG_MAX); | 168 | MAX14577_REG_MAX); |
| 169 | if (ret < 0) { | 169 | if (ret < 0) |
| 170 | dev_err(&pdev->dev, "Error parsing regulator init data: %d\n", ret); | 170 | dev_err(&pdev->dev, "Error parsing regulator init data: %d\n", ret); |
| 171 | } | 171 | else |
| 172 | ret = 0; | ||
| 172 | 173 | ||
| 173 | of_node_put(np); | 174 | of_node_put(np); |
| 174 | 175 | ||
diff --git a/drivers/regulator/s5m8767.c b/drivers/regulator/s5m8767.c index d7164bb75d3e..d958dfa05125 100644 --- a/drivers/regulator/s5m8767.c +++ b/drivers/regulator/s5m8767.c | |||
| @@ -535,7 +535,7 @@ static int s5m8767_pmic_dt_parse_pdata(struct platform_device *pdev, | |||
| 535 | return -ENODEV; | 535 | return -ENODEV; |
| 536 | } | 536 | } |
| 537 | 537 | ||
| 538 | regulators_np = of_find_node_by_name(pmic_np, "regulators"); | 538 | regulators_np = of_get_child_by_name(pmic_np, "regulators"); |
| 539 | if (!regulators_np) { | 539 | if (!regulators_np) { |
| 540 | dev_err(iodev->dev, "could not find regulators sub-node\n"); | 540 | dev_err(iodev->dev, "could not find regulators sub-node\n"); |
| 541 | return -EINVAL; | 541 | return -EINVAL; |
| @@ -591,6 +591,8 @@ static int s5m8767_pmic_dt_parse_pdata(struct platform_device *pdev, | |||
| 591 | rmode++; | 591 | rmode++; |
| 592 | } | 592 | } |
| 593 | 593 | ||
| 594 | of_node_put(regulators_np); | ||
| 595 | |||
| 594 | if (of_get_property(pmic_np, "s5m8767,pmic-buck2-uses-gpio-dvs", NULL)) { | 596 | if (of_get_property(pmic_np, "s5m8767,pmic-buck2-uses-gpio-dvs", NULL)) { |
| 595 | pdata->buck2_gpiodvs = true; | 597 | pdata->buck2_gpiodvs = true; |
| 596 | 598 | ||
diff --git a/drivers/rtc/rtc-s3c.c b/drivers/rtc/rtc-s3c.c index 7afd373b9595..c4cde9c08f1f 100644 --- a/drivers/rtc/rtc-s3c.c +++ b/drivers/rtc/rtc-s3c.c | |||
| @@ -580,10 +580,12 @@ static int s3c_rtc_suspend(struct device *dev) | |||
| 580 | 580 | ||
| 581 | clk_enable(rtc_clk); | 581 | clk_enable(rtc_clk); |
| 582 | /* save TICNT for anyone using periodic interrupts */ | 582 | /* save TICNT for anyone using periodic interrupts */ |
| 583 | ticnt_save = readb(s3c_rtc_base + S3C2410_TICNT); | ||
| 584 | if (s3c_rtc_cpu_type == TYPE_S3C64XX) { | 583 | if (s3c_rtc_cpu_type == TYPE_S3C64XX) { |
| 585 | ticnt_en_save = readw(s3c_rtc_base + S3C2410_RTCCON); | 584 | ticnt_en_save = readw(s3c_rtc_base + S3C2410_RTCCON); |
| 586 | ticnt_en_save &= S3C64XX_RTCCON_TICEN; | 585 | ticnt_en_save &= S3C64XX_RTCCON_TICEN; |
| 586 | ticnt_save = readl(s3c_rtc_base + S3C2410_TICNT); | ||
| 587 | } else { | ||
| 588 | ticnt_save = readb(s3c_rtc_base + S3C2410_TICNT); | ||
| 587 | } | 589 | } |
| 588 | s3c_rtc_enable(pdev, 0); | 590 | s3c_rtc_enable(pdev, 0); |
| 589 | 591 | ||
| @@ -605,10 +607,15 @@ static int s3c_rtc_resume(struct device *dev) | |||
| 605 | 607 | ||
| 606 | clk_enable(rtc_clk); | 608 | clk_enable(rtc_clk); |
| 607 | s3c_rtc_enable(pdev, 1); | 609 | s3c_rtc_enable(pdev, 1); |
| 608 | writeb(ticnt_save, s3c_rtc_base + S3C2410_TICNT); | 610 | if (s3c_rtc_cpu_type == TYPE_S3C64XX) { |
| 609 | if (s3c_rtc_cpu_type == TYPE_S3C64XX && ticnt_en_save) { | 611 | writel(ticnt_save, s3c_rtc_base + S3C2410_TICNT); |
| 610 | tmp = readw(s3c_rtc_base + S3C2410_RTCCON); | 612 | if (ticnt_en_save) { |
| 611 | writew(tmp | ticnt_en_save, s3c_rtc_base + S3C2410_RTCCON); | 613 | tmp = readw(s3c_rtc_base + S3C2410_RTCCON); |
| 614 | writew(tmp | ticnt_en_save, | ||
| 615 | s3c_rtc_base + S3C2410_RTCCON); | ||
| 616 | } | ||
| 617 | } else { | ||
| 618 | writeb(ticnt_save, s3c_rtc_base + S3C2410_TICNT); | ||
| 612 | } | 619 | } |
| 613 | 620 | ||
| 614 | if (device_may_wakeup(dev) && wake_en) { | 621 | if (device_may_wakeup(dev) && wake_en) { |
diff --git a/drivers/s390/cio/chsc.c b/drivers/s390/cio/chsc.c index f6b9188c5af5..9f0ea6cb6922 100644 --- a/drivers/s390/cio/chsc.c +++ b/drivers/s390/cio/chsc.c | |||
| @@ -610,6 +610,7 @@ void chsc_chp_online(struct chp_id chpid) | |||
| 610 | css_wait_for_slow_path(); | 610 | css_wait_for_slow_path(); |
| 611 | for_each_subchannel_staged(__s390_process_res_acc, NULL, | 611 | for_each_subchannel_staged(__s390_process_res_acc, NULL, |
| 612 | &link); | 612 | &link); |
| 613 | css_schedule_reprobe(); | ||
| 613 | } | 614 | } |
| 614 | } | 615 | } |
| 615 | 616 | ||
diff --git a/drivers/s390/crypto/zcrypt_msgtype6.c b/drivers/s390/crypto/zcrypt_msgtype6.c index dc542e0a3055..0bc91e46395a 100644 --- a/drivers/s390/crypto/zcrypt_msgtype6.c +++ b/drivers/s390/crypto/zcrypt_msgtype6.c | |||
| @@ -311,7 +311,7 @@ static int XCRB_msg_to_type6CPRB_msgX(struct zcrypt_device *zdev, | |||
| 311 | } __packed * msg = ap_msg->message; | 311 | } __packed * msg = ap_msg->message; |
| 312 | 312 | ||
| 313 | int rcblen = CEIL4(xcRB->request_control_blk_length); | 313 | int rcblen = CEIL4(xcRB->request_control_blk_length); |
| 314 | int replylen; | 314 | int replylen, req_sumlen, resp_sumlen; |
| 315 | char *req_data = ap_msg->message + sizeof(struct type6_hdr) + rcblen; | 315 | char *req_data = ap_msg->message + sizeof(struct type6_hdr) + rcblen; |
| 316 | char *function_code; | 316 | char *function_code; |
| 317 | 317 | ||
| @@ -321,12 +321,34 @@ static int XCRB_msg_to_type6CPRB_msgX(struct zcrypt_device *zdev, | |||
| 321 | xcRB->request_data_length; | 321 | xcRB->request_data_length; |
| 322 | if (ap_msg->length > MSGTYPE06_MAX_MSG_SIZE) | 322 | if (ap_msg->length > MSGTYPE06_MAX_MSG_SIZE) |
| 323 | return -EINVAL; | 323 | return -EINVAL; |
| 324 | |||
| 325 | /* Overflow check | ||
| 326 | sum must be greater (or equal) than the largest operand */ | ||
| 327 | req_sumlen = CEIL4(xcRB->request_control_blk_length) + | ||
| 328 | xcRB->request_data_length; | ||
| 329 | if ((CEIL4(xcRB->request_control_blk_length) <= | ||
| 330 | xcRB->request_data_length) ? | ||
| 331 | (req_sumlen < xcRB->request_data_length) : | ||
| 332 | (req_sumlen < CEIL4(xcRB->request_control_blk_length))) { | ||
| 333 | return -EINVAL; | ||
| 334 | } | ||
| 335 | |||
| 324 | replylen = sizeof(struct type86_fmt2_msg) + | 336 | replylen = sizeof(struct type86_fmt2_msg) + |
| 325 | CEIL4(xcRB->reply_control_blk_length) + | 337 | CEIL4(xcRB->reply_control_blk_length) + |
| 326 | xcRB->reply_data_length; | 338 | xcRB->reply_data_length; |
| 327 | if (replylen > MSGTYPE06_MAX_MSG_SIZE) | 339 | if (replylen > MSGTYPE06_MAX_MSG_SIZE) |
| 328 | return -EINVAL; | 340 | return -EINVAL; |
| 329 | 341 | ||
| 342 | /* Overflow check | ||
| 343 | sum must be greater (or equal) than the largest operand */ | ||
| 344 | resp_sumlen = CEIL4(xcRB->reply_control_blk_length) + | ||
| 345 | xcRB->reply_data_length; | ||
| 346 | if ((CEIL4(xcRB->reply_control_blk_length) <= xcRB->reply_data_length) ? | ||
| 347 | (resp_sumlen < xcRB->reply_data_length) : | ||
| 348 | (resp_sumlen < CEIL4(xcRB->reply_control_blk_length))) { | ||
| 349 | return -EINVAL; | ||
| 350 | } | ||
| 351 | |||
| 330 | /* prepare type6 header */ | 352 | /* prepare type6 header */ |
| 331 | msg->hdr = static_type6_hdrX; | 353 | msg->hdr = static_type6_hdrX; |
| 332 | memcpy(msg->hdr.agent_id , &(xcRB->agent_ID), sizeof(xcRB->agent_ID)); | 354 | memcpy(msg->hdr.agent_id , &(xcRB->agent_ID), sizeof(xcRB->agent_ID)); |
diff --git a/drivers/sbus/char/jsflash.c b/drivers/sbus/char/jsflash.c index 6b4678a7900a..4ccb5d869389 100644 --- a/drivers/sbus/char/jsflash.c +++ b/drivers/sbus/char/jsflash.c | |||
| @@ -507,7 +507,6 @@ static int jsflash_init(void) | |||
| 507 | } | 507 | } |
| 508 | 508 | ||
| 509 | /* Let us be really paranoid for modifications to probing code. */ | 509 | /* Let us be really paranoid for modifications to probing code. */ |
| 510 | /* extern enum sparc_cpu sparc_cpu_model; */ /* in <asm/system.h> */ | ||
| 511 | if (sparc_cpu_model != sun4m) { | 510 | if (sparc_cpu_model != sun4m) { |
| 512 | /* We must be on sun4m because we use MMU Bypass ASI. */ | 511 | /* We must be on sun4m because we use MMU Bypass ASI. */ |
| 513 | return -ENXIO; | 512 | return -ENXIO; |
diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c index 2eb97d7e8d12..0cb73074c199 100644 --- a/drivers/scsi/qla2xxx/qla_target.c +++ b/drivers/scsi/qla2xxx/qla_target.c | |||
| @@ -790,17 +790,32 @@ static inline int test_tgt_sess_count(struct qla_tgt *tgt) | |||
| 790 | } | 790 | } |
| 791 | 791 | ||
| 792 | /* Called by tcm_qla2xxx configfs code */ | 792 | /* Called by tcm_qla2xxx configfs code */ |
| 793 | void qlt_stop_phase1(struct qla_tgt *tgt) | 793 | int qlt_stop_phase1(struct qla_tgt *tgt) |
| 794 | { | 794 | { |
| 795 | struct scsi_qla_host *vha = tgt->vha; | 795 | struct scsi_qla_host *vha = tgt->vha; |
| 796 | struct qla_hw_data *ha = tgt->ha; | 796 | struct qla_hw_data *ha = tgt->ha; |
| 797 | unsigned long flags; | 797 | unsigned long flags; |
| 798 | 798 | ||
| 799 | mutex_lock(&qla_tgt_mutex); | ||
| 800 | if (!vha->fc_vport) { | ||
| 801 | struct Scsi_Host *sh = vha->host; | ||
| 802 | struct fc_host_attrs *fc_host = shost_to_fc_host(sh); | ||
| 803 | bool npiv_vports; | ||
| 804 | |||
| 805 | spin_lock_irqsave(sh->host_lock, flags); | ||
| 806 | npiv_vports = (fc_host->npiv_vports_inuse); | ||
| 807 | spin_unlock_irqrestore(sh->host_lock, flags); | ||
| 808 | |||
| 809 | if (npiv_vports) { | ||
| 810 | mutex_unlock(&qla_tgt_mutex); | ||
| 811 | return -EPERM; | ||
| 812 | } | ||
| 813 | } | ||
| 799 | if (tgt->tgt_stop || tgt->tgt_stopped) { | 814 | if (tgt->tgt_stop || tgt->tgt_stopped) { |
| 800 | ql_dbg(ql_dbg_tgt_mgt, vha, 0xf04e, | 815 | ql_dbg(ql_dbg_tgt_mgt, vha, 0xf04e, |
| 801 | "Already in tgt->tgt_stop or tgt_stopped state\n"); | 816 | "Already in tgt->tgt_stop or tgt_stopped state\n"); |
| 802 | dump_stack(); | 817 | mutex_unlock(&qla_tgt_mutex); |
| 803 | return; | 818 | return -EPERM; |
| 804 | } | 819 | } |
| 805 | 820 | ||
| 806 | ql_dbg(ql_dbg_tgt, vha, 0xe003, "Stopping target for host %ld(%p)\n", | 821 | ql_dbg(ql_dbg_tgt, vha, 0xe003, "Stopping target for host %ld(%p)\n", |
| @@ -815,6 +830,7 @@ void qlt_stop_phase1(struct qla_tgt *tgt) | |||
| 815 | qlt_clear_tgt_db(tgt, true); | 830 | qlt_clear_tgt_db(tgt, true); |
| 816 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | 831 | spin_unlock_irqrestore(&ha->hardware_lock, flags); |
| 817 | mutex_unlock(&vha->vha_tgt.tgt_mutex); | 832 | mutex_unlock(&vha->vha_tgt.tgt_mutex); |
| 833 | mutex_unlock(&qla_tgt_mutex); | ||
| 818 | 834 | ||
| 819 | flush_delayed_work(&tgt->sess_del_work); | 835 | flush_delayed_work(&tgt->sess_del_work); |
| 820 | 836 | ||
| @@ -841,6 +857,7 @@ void qlt_stop_phase1(struct qla_tgt *tgt) | |||
| 841 | 857 | ||
| 842 | /* Wait for sessions to clear out (just in case) */ | 858 | /* Wait for sessions to clear out (just in case) */ |
| 843 | wait_event(tgt->waitQ, test_tgt_sess_count(tgt)); | 859 | wait_event(tgt->waitQ, test_tgt_sess_count(tgt)); |
| 860 | return 0; | ||
| 844 | } | 861 | } |
| 845 | EXPORT_SYMBOL(qlt_stop_phase1); | 862 | EXPORT_SYMBOL(qlt_stop_phase1); |
| 846 | 863 | ||
| @@ -3185,7 +3202,8 @@ restart: | |||
| 3185 | ql_dbg(ql_dbg_tgt_mgt, vha, 0xf02c, | 3202 | ql_dbg(ql_dbg_tgt_mgt, vha, 0xf02c, |
| 3186 | "SRR cmd %p (se_cmd %p, tag %d, op %x), " | 3203 | "SRR cmd %p (se_cmd %p, tag %d, op %x), " |
| 3187 | "sg_cnt=%d, offset=%d", cmd, &cmd->se_cmd, cmd->tag, | 3204 | "sg_cnt=%d, offset=%d", cmd, &cmd->se_cmd, cmd->tag, |
| 3188 | se_cmd->t_task_cdb[0], cmd->sg_cnt, cmd->offset); | 3205 | se_cmd->t_task_cdb ? se_cmd->t_task_cdb[0] : 0, |
| 3206 | cmd->sg_cnt, cmd->offset); | ||
| 3189 | 3207 | ||
| 3190 | qlt_handle_srr(vha, sctio, imm); | 3208 | qlt_handle_srr(vha, sctio, imm); |
| 3191 | 3209 | ||
| @@ -4181,6 +4199,9 @@ int qlt_add_target(struct qla_hw_data *ha, struct scsi_qla_host *base_vha) | |||
| 4181 | tgt->datasegs_per_cmd = QLA_TGT_DATASEGS_PER_CMD_24XX; | 4199 | tgt->datasegs_per_cmd = QLA_TGT_DATASEGS_PER_CMD_24XX; |
| 4182 | tgt->datasegs_per_cont = QLA_TGT_DATASEGS_PER_CONT_24XX; | 4200 | tgt->datasegs_per_cont = QLA_TGT_DATASEGS_PER_CONT_24XX; |
| 4183 | 4201 | ||
| 4202 | if (base_vha->fc_vport) | ||
| 4203 | return 0; | ||
| 4204 | |||
| 4184 | mutex_lock(&qla_tgt_mutex); | 4205 | mutex_lock(&qla_tgt_mutex); |
| 4185 | list_add_tail(&tgt->tgt_list_entry, &qla_tgt_glist); | 4206 | list_add_tail(&tgt->tgt_list_entry, &qla_tgt_glist); |
| 4186 | mutex_unlock(&qla_tgt_mutex); | 4207 | mutex_unlock(&qla_tgt_mutex); |
| @@ -4194,6 +4215,10 @@ int qlt_remove_target(struct qla_hw_data *ha, struct scsi_qla_host *vha) | |||
| 4194 | if (!vha->vha_tgt.qla_tgt) | 4215 | if (!vha->vha_tgt.qla_tgt) |
| 4195 | return 0; | 4216 | return 0; |
| 4196 | 4217 | ||
| 4218 | if (vha->fc_vport) { | ||
| 4219 | qlt_release(vha->vha_tgt.qla_tgt); | ||
| 4220 | return 0; | ||
| 4221 | } | ||
| 4197 | mutex_lock(&qla_tgt_mutex); | 4222 | mutex_lock(&qla_tgt_mutex); |
| 4198 | list_del(&vha->vha_tgt.qla_tgt->tgt_list_entry); | 4223 | list_del(&vha->vha_tgt.qla_tgt->tgt_list_entry); |
| 4199 | mutex_unlock(&qla_tgt_mutex); | 4224 | mutex_unlock(&qla_tgt_mutex); |
| @@ -4265,6 +4290,12 @@ int qlt_lport_register(void *target_lport_ptr, u64 phys_wwpn, | |||
| 4265 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | 4290 | spin_unlock_irqrestore(&ha->hardware_lock, flags); |
| 4266 | continue; | 4291 | continue; |
| 4267 | } | 4292 | } |
| 4293 | if (tgt->tgt_stop) { | ||
| 4294 | pr_debug("MODE_TARGET in shutdown on qla2xxx(%d)\n", | ||
| 4295 | host->host_no); | ||
| 4296 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | ||
| 4297 | continue; | ||
| 4298 | } | ||
| 4268 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | 4299 | spin_unlock_irqrestore(&ha->hardware_lock, flags); |
| 4269 | 4300 | ||
| 4270 | if (!scsi_host_get(host)) { | 4301 | if (!scsi_host_get(host)) { |
| @@ -4279,12 +4310,11 @@ int qlt_lport_register(void *target_lport_ptr, u64 phys_wwpn, | |||
| 4279 | scsi_host_put(host); | 4310 | scsi_host_put(host); |
| 4280 | continue; | 4311 | continue; |
| 4281 | } | 4312 | } |
| 4282 | mutex_unlock(&qla_tgt_mutex); | ||
| 4283 | |||
| 4284 | rc = (*callback)(vha, target_lport_ptr, npiv_wwpn, npiv_wwnn); | 4313 | rc = (*callback)(vha, target_lport_ptr, npiv_wwpn, npiv_wwnn); |
| 4285 | if (rc != 0) | 4314 | if (rc != 0) |
| 4286 | scsi_host_put(host); | 4315 | scsi_host_put(host); |
| 4287 | 4316 | ||
| 4317 | mutex_unlock(&qla_tgt_mutex); | ||
| 4288 | return rc; | 4318 | return rc; |
| 4289 | } | 4319 | } |
| 4290 | mutex_unlock(&qla_tgt_mutex); | 4320 | mutex_unlock(&qla_tgt_mutex); |
diff --git a/drivers/scsi/qla2xxx/qla_target.h b/drivers/scsi/qla2xxx/qla_target.h index 66e755cdde57..ce33d8c26406 100644 --- a/drivers/scsi/qla2xxx/qla_target.h +++ b/drivers/scsi/qla2xxx/qla_target.h | |||
| @@ -1001,7 +1001,7 @@ extern void qlt_modify_vp_config(struct scsi_qla_host *, | |||
| 1001 | extern void qlt_probe_one_stage1(struct scsi_qla_host *, struct qla_hw_data *); | 1001 | extern void qlt_probe_one_stage1(struct scsi_qla_host *, struct qla_hw_data *); |
| 1002 | extern int qlt_mem_alloc(struct qla_hw_data *); | 1002 | extern int qlt_mem_alloc(struct qla_hw_data *); |
| 1003 | extern void qlt_mem_free(struct qla_hw_data *); | 1003 | extern void qlt_mem_free(struct qla_hw_data *); |
| 1004 | extern void qlt_stop_phase1(struct qla_tgt *); | 1004 | extern int qlt_stop_phase1(struct qla_tgt *); |
| 1005 | extern void qlt_stop_phase2(struct qla_tgt *); | 1005 | extern void qlt_stop_phase2(struct qla_tgt *); |
| 1006 | extern irqreturn_t qla83xx_msix_atio_q(int, void *); | 1006 | extern irqreturn_t qla83xx_msix_atio_q(int, void *); |
| 1007 | extern void qlt_83xx_iospace_config(struct qla_hw_data *); | 1007 | extern void qlt_83xx_iospace_config(struct qla_hw_data *); |
diff --git a/drivers/scsi/qla2xxx/tcm_qla2xxx.c b/drivers/scsi/qla2xxx/tcm_qla2xxx.c index 75a141bbe74d..788c4fe2b0c9 100644 --- a/drivers/scsi/qla2xxx/tcm_qla2xxx.c +++ b/drivers/scsi/qla2xxx/tcm_qla2xxx.c | |||
| @@ -182,20 +182,6 @@ static int tcm_qla2xxx_npiv_parse_wwn( | |||
| 182 | return 0; | 182 | return 0; |
| 183 | } | 183 | } |
| 184 | 184 | ||
| 185 | static ssize_t tcm_qla2xxx_npiv_format_wwn(char *buf, size_t len, | ||
| 186 | u64 wwpn, u64 wwnn) | ||
| 187 | { | ||
| 188 | u8 b[8], b2[8]; | ||
| 189 | |||
| 190 | put_unaligned_be64(wwpn, b); | ||
| 191 | put_unaligned_be64(wwnn, b2); | ||
| 192 | return snprintf(buf, len, | ||
| 193 | "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x," | ||
| 194 | "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x", | ||
| 195 | b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7], | ||
| 196 | b2[0], b2[1], b2[2], b2[3], b2[4], b2[5], b2[6], b2[7]); | ||
| 197 | } | ||
| 198 | |||
| 199 | static char *tcm_qla2xxx_npiv_get_fabric_name(void) | 185 | static char *tcm_qla2xxx_npiv_get_fabric_name(void) |
| 200 | { | 186 | { |
| 201 | return "qla2xxx_npiv"; | 187 | return "qla2xxx_npiv"; |
| @@ -227,15 +213,6 @@ static char *tcm_qla2xxx_get_fabric_wwn(struct se_portal_group *se_tpg) | |||
| 227 | return lport->lport_naa_name; | 213 | return lport->lport_naa_name; |
| 228 | } | 214 | } |
| 229 | 215 | ||
| 230 | static char *tcm_qla2xxx_npiv_get_fabric_wwn(struct se_portal_group *se_tpg) | ||
| 231 | { | ||
| 232 | struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg, | ||
| 233 | struct tcm_qla2xxx_tpg, se_tpg); | ||
| 234 | struct tcm_qla2xxx_lport *lport = tpg->lport; | ||
| 235 | |||
| 236 | return &lport->lport_npiv_name[0]; | ||
| 237 | } | ||
| 238 | |||
| 239 | static u16 tcm_qla2xxx_get_tag(struct se_portal_group *se_tpg) | 216 | static u16 tcm_qla2xxx_get_tag(struct se_portal_group *se_tpg) |
| 240 | { | 217 | { |
| 241 | struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg, | 218 | struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg, |
| @@ -941,15 +918,41 @@ static ssize_t tcm_qla2xxx_tpg_show_enable( | |||
| 941 | atomic_read(&tpg->lport_tpg_enabled)); | 918 | atomic_read(&tpg->lport_tpg_enabled)); |
| 942 | } | 919 | } |
| 943 | 920 | ||
| 921 | static void tcm_qla2xxx_depend_tpg(struct work_struct *work) | ||
| 922 | { | ||
| 923 | struct tcm_qla2xxx_tpg *base_tpg = container_of(work, | ||
| 924 | struct tcm_qla2xxx_tpg, tpg_base_work); | ||
| 925 | struct se_portal_group *se_tpg = &base_tpg->se_tpg; | ||
| 926 | struct scsi_qla_host *base_vha = base_tpg->lport->qla_vha; | ||
| 927 | |||
| 928 | if (!configfs_depend_item(se_tpg->se_tpg_tfo->tf_subsys, | ||
| 929 | &se_tpg->tpg_group.cg_item)) { | ||
| 930 | atomic_set(&base_tpg->lport_tpg_enabled, 1); | ||
| 931 | qlt_enable_vha(base_vha); | ||
| 932 | } | ||
| 933 | complete(&base_tpg->tpg_base_comp); | ||
| 934 | } | ||
| 935 | |||
| 936 | static void tcm_qla2xxx_undepend_tpg(struct work_struct *work) | ||
| 937 | { | ||
| 938 | struct tcm_qla2xxx_tpg *base_tpg = container_of(work, | ||
| 939 | struct tcm_qla2xxx_tpg, tpg_base_work); | ||
| 940 | struct se_portal_group *se_tpg = &base_tpg->se_tpg; | ||
| 941 | struct scsi_qla_host *base_vha = base_tpg->lport->qla_vha; | ||
| 942 | |||
| 943 | if (!qlt_stop_phase1(base_vha->vha_tgt.qla_tgt)) { | ||
| 944 | atomic_set(&base_tpg->lport_tpg_enabled, 0); | ||
| 945 | configfs_undepend_item(se_tpg->se_tpg_tfo->tf_subsys, | ||
| 946 | &se_tpg->tpg_group.cg_item); | ||
| 947 | } | ||
| 948 | complete(&base_tpg->tpg_base_comp); | ||
| 949 | } | ||
| 950 | |||
| 944 | static ssize_t tcm_qla2xxx_tpg_store_enable( | 951 | static ssize_t tcm_qla2xxx_tpg_store_enable( |
| 945 | struct se_portal_group *se_tpg, | 952 | struct se_portal_group *se_tpg, |
| 946 | const char *page, | 953 | const char *page, |
| 947 | size_t count) | 954 | size_t count) |
| 948 | { | 955 | { |
| 949 | struct se_wwn *se_wwn = se_tpg->se_tpg_wwn; | ||
| 950 | struct tcm_qla2xxx_lport *lport = container_of(se_wwn, | ||
| 951 | struct tcm_qla2xxx_lport, lport_wwn); | ||
| 952 | struct scsi_qla_host *vha = lport->qla_vha; | ||
| 953 | struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg, | 956 | struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg, |
| 954 | struct tcm_qla2xxx_tpg, se_tpg); | 957 | struct tcm_qla2xxx_tpg, se_tpg); |
| 955 | unsigned long op; | 958 | unsigned long op; |
| @@ -964,19 +967,28 @@ static ssize_t tcm_qla2xxx_tpg_store_enable( | |||
| 964 | pr_err("Illegal value for tpg_enable: %lu\n", op); | 967 | pr_err("Illegal value for tpg_enable: %lu\n", op); |
| 965 | return -EINVAL; | 968 | return -EINVAL; |
| 966 | } | 969 | } |
| 967 | |||
| 968 | if (op) { | 970 | if (op) { |
| 969 | atomic_set(&tpg->lport_tpg_enabled, 1); | 971 | if (atomic_read(&tpg->lport_tpg_enabled)) |
| 970 | qlt_enable_vha(vha); | 972 | return -EEXIST; |
| 973 | |||
| 974 | INIT_WORK(&tpg->tpg_base_work, tcm_qla2xxx_depend_tpg); | ||
| 971 | } else { | 975 | } else { |
| 972 | if (!vha->vha_tgt.qla_tgt) { | 976 | if (!atomic_read(&tpg->lport_tpg_enabled)) |
| 973 | pr_err("struct qla_hw_data *vha->vha_tgt.qla_tgt is NULL\n"); | 977 | return count; |
| 974 | return -ENODEV; | 978 | |
| 975 | } | 979 | INIT_WORK(&tpg->tpg_base_work, tcm_qla2xxx_undepend_tpg); |
| 976 | atomic_set(&tpg->lport_tpg_enabled, 0); | ||
| 977 | qlt_stop_phase1(vha->vha_tgt.qla_tgt); | ||
| 978 | } | 980 | } |
| 981 | init_completion(&tpg->tpg_base_comp); | ||
| 982 | schedule_work(&tpg->tpg_base_work); | ||
| 983 | wait_for_completion(&tpg->tpg_base_comp); | ||
| 979 | 984 | ||
| 985 | if (op) { | ||
| 986 | if (!atomic_read(&tpg->lport_tpg_enabled)) | ||
| 987 | return -ENODEV; | ||
| 988 | } else { | ||
| 989 | if (atomic_read(&tpg->lport_tpg_enabled)) | ||
| 990 | return -EPERM; | ||
| 991 | } | ||
| 980 | return count; | 992 | return count; |
| 981 | } | 993 | } |
| 982 | 994 | ||
| @@ -1053,11 +1065,64 @@ static void tcm_qla2xxx_drop_tpg(struct se_portal_group *se_tpg) | |||
| 1053 | /* | 1065 | /* |
| 1054 | * Clear local TPG=1 pointer for non NPIV mode. | 1066 | * Clear local TPG=1 pointer for non NPIV mode. |
| 1055 | */ | 1067 | */ |
| 1056 | lport->tpg_1 = NULL; | 1068 | lport->tpg_1 = NULL; |
| 1057 | |||
| 1058 | kfree(tpg); | 1069 | kfree(tpg); |
| 1059 | } | 1070 | } |
| 1060 | 1071 | ||
| 1072 | static ssize_t tcm_qla2xxx_npiv_tpg_show_enable( | ||
| 1073 | struct se_portal_group *se_tpg, | ||
| 1074 | char *page) | ||
| 1075 | { | ||
| 1076 | return tcm_qla2xxx_tpg_show_enable(se_tpg, page); | ||
| 1077 | } | ||
| 1078 | |||
| 1079 | static ssize_t tcm_qla2xxx_npiv_tpg_store_enable( | ||
| 1080 | struct se_portal_group *se_tpg, | ||
| 1081 | const char *page, | ||
| 1082 | size_t count) | ||
| 1083 | { | ||
| 1084 | struct se_wwn *se_wwn = se_tpg->se_tpg_wwn; | ||
| 1085 | struct tcm_qla2xxx_lport *lport = container_of(se_wwn, | ||
| 1086 | struct tcm_qla2xxx_lport, lport_wwn); | ||
| 1087 | struct scsi_qla_host *vha = lport->qla_vha; | ||
| 1088 | struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg, | ||
| 1089 | struct tcm_qla2xxx_tpg, se_tpg); | ||
| 1090 | unsigned long op; | ||
| 1091 | int rc; | ||
| 1092 | |||
| 1093 | rc = kstrtoul(page, 0, &op); | ||
| 1094 | if (rc < 0) { | ||
| 1095 | pr_err("kstrtoul() returned %d\n", rc); | ||
| 1096 | return -EINVAL; | ||
| 1097 | } | ||
| 1098 | if ((op != 1) && (op != 0)) { | ||
| 1099 | pr_err("Illegal value for tpg_enable: %lu\n", op); | ||
| 1100 | return -EINVAL; | ||
| 1101 | } | ||
| 1102 | if (op) { | ||
| 1103 | if (atomic_read(&tpg->lport_tpg_enabled)) | ||
| 1104 | return -EEXIST; | ||
| 1105 | |||
| 1106 | atomic_set(&tpg->lport_tpg_enabled, 1); | ||
| 1107 | qlt_enable_vha(vha); | ||
| 1108 | } else { | ||
| 1109 | if (!atomic_read(&tpg->lport_tpg_enabled)) | ||
| 1110 | return count; | ||
| 1111 | |||
| 1112 | atomic_set(&tpg->lport_tpg_enabled, 0); | ||
| 1113 | qlt_stop_phase1(vha->vha_tgt.qla_tgt); | ||
| 1114 | } | ||
| 1115 | |||
| 1116 | return count; | ||
| 1117 | } | ||
| 1118 | |||
| 1119 | TF_TPG_BASE_ATTR(tcm_qla2xxx_npiv, enable, S_IRUGO | S_IWUSR); | ||
| 1120 | |||
| 1121 | static struct configfs_attribute *tcm_qla2xxx_npiv_tpg_attrs[] = { | ||
| 1122 | &tcm_qla2xxx_npiv_tpg_enable.attr, | ||
| 1123 | NULL, | ||
| 1124 | }; | ||
| 1125 | |||
| 1061 | static struct se_portal_group *tcm_qla2xxx_npiv_make_tpg( | 1126 | static struct se_portal_group *tcm_qla2xxx_npiv_make_tpg( |
| 1062 | struct se_wwn *wwn, | 1127 | struct se_wwn *wwn, |
| 1063 | struct config_group *group, | 1128 | struct config_group *group, |
| @@ -1650,6 +1715,9 @@ static int tcm_qla2xxx_lport_register_npiv_cb(struct scsi_qla_host *base_vha, | |||
| 1650 | struct scsi_qla_host *npiv_vha; | 1715 | struct scsi_qla_host *npiv_vha; |
| 1651 | struct tcm_qla2xxx_lport *lport = | 1716 | struct tcm_qla2xxx_lport *lport = |
| 1652 | (struct tcm_qla2xxx_lport *)target_lport_ptr; | 1717 | (struct tcm_qla2xxx_lport *)target_lport_ptr; |
| 1718 | struct tcm_qla2xxx_lport *base_lport = | ||
| 1719 | (struct tcm_qla2xxx_lport *)base_vha->vha_tgt.target_lport_ptr; | ||
| 1720 | struct tcm_qla2xxx_tpg *base_tpg; | ||
| 1653 | struct fc_vport_identifiers vport_id; | 1721 | struct fc_vport_identifiers vport_id; |
| 1654 | 1722 | ||
| 1655 | if (!qla_tgt_mode_enabled(base_vha)) { | 1723 | if (!qla_tgt_mode_enabled(base_vha)) { |
| @@ -1657,6 +1725,13 @@ static int tcm_qla2xxx_lport_register_npiv_cb(struct scsi_qla_host *base_vha, | |||
| 1657 | return -EPERM; | 1725 | return -EPERM; |
| 1658 | } | 1726 | } |
| 1659 | 1727 | ||
| 1728 | if (!base_lport || !base_lport->tpg_1 || | ||
| 1729 | !atomic_read(&base_lport->tpg_1->lport_tpg_enabled)) { | ||
| 1730 | pr_err("qla2xxx base_lport or tpg_1 not available\n"); | ||
| 1731 | return -EPERM; | ||
| 1732 | } | ||
| 1733 | base_tpg = base_lport->tpg_1; | ||
| 1734 | |||
| 1660 | memset(&vport_id, 0, sizeof(vport_id)); | 1735 | memset(&vport_id, 0, sizeof(vport_id)); |
| 1661 | vport_id.port_name = npiv_wwpn; | 1736 | vport_id.port_name = npiv_wwpn; |
| 1662 | vport_id.node_name = npiv_wwnn; | 1737 | vport_id.node_name = npiv_wwnn; |
| @@ -1675,7 +1750,6 @@ static int tcm_qla2xxx_lport_register_npiv_cb(struct scsi_qla_host *base_vha, | |||
| 1675 | npiv_vha = (struct scsi_qla_host *)vport->dd_data; | 1750 | npiv_vha = (struct scsi_qla_host *)vport->dd_data; |
| 1676 | npiv_vha->vha_tgt.target_lport_ptr = target_lport_ptr; | 1751 | npiv_vha->vha_tgt.target_lport_ptr = target_lport_ptr; |
| 1677 | lport->qla_vha = npiv_vha; | 1752 | lport->qla_vha = npiv_vha; |
| 1678 | |||
| 1679 | scsi_host_get(npiv_vha->host); | 1753 | scsi_host_get(npiv_vha->host); |
| 1680 | return 0; | 1754 | return 0; |
| 1681 | } | 1755 | } |
| @@ -1714,8 +1788,6 @@ static struct se_wwn *tcm_qla2xxx_npiv_make_lport( | |||
| 1714 | } | 1788 | } |
| 1715 | lport->lport_npiv_wwpn = npiv_wwpn; | 1789 | lport->lport_npiv_wwpn = npiv_wwpn; |
| 1716 | lport->lport_npiv_wwnn = npiv_wwnn; | 1790 | lport->lport_npiv_wwnn = npiv_wwnn; |
| 1717 | tcm_qla2xxx_npiv_format_wwn(&lport->lport_npiv_name[0], | ||
| 1718 | TCM_QLA2XXX_NAMELEN, npiv_wwpn, npiv_wwnn); | ||
| 1719 | sprintf(lport->lport_naa_name, "naa.%016llx", (unsigned long long) npiv_wwpn); | 1791 | sprintf(lport->lport_naa_name, "naa.%016llx", (unsigned long long) npiv_wwpn); |
| 1720 | 1792 | ||
| 1721 | ret = tcm_qla2xxx_init_lport(lport); | 1793 | ret = tcm_qla2xxx_init_lport(lport); |
| @@ -1824,7 +1896,7 @@ static struct target_core_fabric_ops tcm_qla2xxx_ops = { | |||
| 1824 | static struct target_core_fabric_ops tcm_qla2xxx_npiv_ops = { | 1896 | static struct target_core_fabric_ops tcm_qla2xxx_npiv_ops = { |
| 1825 | .get_fabric_name = tcm_qla2xxx_npiv_get_fabric_name, | 1897 | .get_fabric_name = tcm_qla2xxx_npiv_get_fabric_name, |
| 1826 | .get_fabric_proto_ident = tcm_qla2xxx_get_fabric_proto_ident, | 1898 | .get_fabric_proto_ident = tcm_qla2xxx_get_fabric_proto_ident, |
| 1827 | .tpg_get_wwn = tcm_qla2xxx_npiv_get_fabric_wwn, | 1899 | .tpg_get_wwn = tcm_qla2xxx_get_fabric_wwn, |
| 1828 | .tpg_get_tag = tcm_qla2xxx_get_tag, | 1900 | .tpg_get_tag = tcm_qla2xxx_get_tag, |
| 1829 | .tpg_get_default_depth = tcm_qla2xxx_get_default_depth, | 1901 | .tpg_get_default_depth = tcm_qla2xxx_get_default_depth, |
| 1830 | .tpg_get_pr_transport_id = tcm_qla2xxx_get_pr_transport_id, | 1902 | .tpg_get_pr_transport_id = tcm_qla2xxx_get_pr_transport_id, |
| @@ -1935,7 +2007,7 @@ static int tcm_qla2xxx_register_configfs(void) | |||
| 1935 | */ | 2007 | */ |
| 1936 | npiv_fabric->tf_cit_tmpl.tfc_wwn_cit.ct_attrs = tcm_qla2xxx_wwn_attrs; | 2008 | npiv_fabric->tf_cit_tmpl.tfc_wwn_cit.ct_attrs = tcm_qla2xxx_wwn_attrs; |
| 1937 | npiv_fabric->tf_cit_tmpl.tfc_tpg_base_cit.ct_attrs = | 2009 | npiv_fabric->tf_cit_tmpl.tfc_tpg_base_cit.ct_attrs = |
| 1938 | tcm_qla2xxx_tpg_attrs; | 2010 | tcm_qla2xxx_npiv_tpg_attrs; |
| 1939 | npiv_fabric->tf_cit_tmpl.tfc_tpg_attrib_cit.ct_attrs = NULL; | 2011 | npiv_fabric->tf_cit_tmpl.tfc_tpg_attrib_cit.ct_attrs = NULL; |
| 1940 | npiv_fabric->tf_cit_tmpl.tfc_tpg_param_cit.ct_attrs = NULL; | 2012 | npiv_fabric->tf_cit_tmpl.tfc_tpg_param_cit.ct_attrs = NULL; |
| 1941 | npiv_fabric->tf_cit_tmpl.tfc_tpg_np_base_cit.ct_attrs = NULL; | 2013 | npiv_fabric->tf_cit_tmpl.tfc_tpg_np_base_cit.ct_attrs = NULL; |
diff --git a/drivers/scsi/qla2xxx/tcm_qla2xxx.h b/drivers/scsi/qla2xxx/tcm_qla2xxx.h index 275d8b9a7a34..33aaac8c7d59 100644 --- a/drivers/scsi/qla2xxx/tcm_qla2xxx.h +++ b/drivers/scsi/qla2xxx/tcm_qla2xxx.h | |||
| @@ -4,8 +4,6 @@ | |||
| 4 | #define TCM_QLA2XXX_VERSION "v0.1" | 4 | #define TCM_QLA2XXX_VERSION "v0.1" |
| 5 | /* length of ASCII WWPNs including pad */ | 5 | /* length of ASCII WWPNs including pad */ |
| 6 | #define TCM_QLA2XXX_NAMELEN 32 | 6 | #define TCM_QLA2XXX_NAMELEN 32 |
| 7 | /* lenth of ASCII NPIV 'WWPN+WWNN' including pad */ | ||
| 8 | #define TCM_QLA2XXX_NPIV_NAMELEN 66 | ||
| 9 | 7 | ||
| 10 | #include "qla_target.h" | 8 | #include "qla_target.h" |
| 11 | 9 | ||
| @@ -43,6 +41,9 @@ struct tcm_qla2xxx_tpg { | |||
| 43 | struct tcm_qla2xxx_tpg_attrib tpg_attrib; | 41 | struct tcm_qla2xxx_tpg_attrib tpg_attrib; |
| 44 | /* Returned by tcm_qla2xxx_make_tpg() */ | 42 | /* Returned by tcm_qla2xxx_make_tpg() */ |
| 45 | struct se_portal_group se_tpg; | 43 | struct se_portal_group se_tpg; |
| 44 | /* Items for dealing with configfs_depend_item */ | ||
| 45 | struct completion tpg_base_comp; | ||
| 46 | struct work_struct tpg_base_work; | ||
| 46 | }; | 47 | }; |
| 47 | 48 | ||
| 48 | struct tcm_qla2xxx_fc_loopid { | 49 | struct tcm_qla2xxx_fc_loopid { |
| @@ -62,8 +63,6 @@ struct tcm_qla2xxx_lport { | |||
| 62 | char lport_name[TCM_QLA2XXX_NAMELEN]; | 63 | char lport_name[TCM_QLA2XXX_NAMELEN]; |
| 63 | /* ASCII formatted naa WWPN for VPD page 83 etc */ | 64 | /* ASCII formatted naa WWPN for VPD page 83 etc */ |
| 64 | char lport_naa_name[TCM_QLA2XXX_NAMELEN]; | 65 | char lport_naa_name[TCM_QLA2XXX_NAMELEN]; |
| 65 | /* ASCII formatted WWPN+WWNN for NPIV FC Target Lport */ | ||
| 66 | char lport_npiv_name[TCM_QLA2XXX_NPIV_NAMELEN]; | ||
| 67 | /* map for fc_port pointers in 24-bit FC Port ID space */ | 66 | /* map for fc_port pointers in 24-bit FC Port ID space */ |
| 68 | struct btree_head32 lport_fcport_map; | 67 | struct btree_head32 lport_fcport_map; |
| 69 | /* vmalloc-ed memory for fc_port pointers for 16-bit FC loop ID */ | 68 | /* vmalloc-ed memory for fc_port pointers for 16-bit FC loop ID */ |
diff --git a/drivers/staging/android/binder.c b/drivers/staging/android/binder.c index eaec1dab7fe4..1432d956769c 100644 --- a/drivers/staging/android/binder.c +++ b/drivers/staging/android/binder.c | |||
| @@ -2904,7 +2904,7 @@ static int binder_node_release(struct binder_node *node, int refs) | |||
| 2904 | refs++; | 2904 | refs++; |
| 2905 | 2905 | ||
| 2906 | if (!ref->death) | 2906 | if (!ref->death) |
| 2907 | goto out; | 2907 | continue; |
| 2908 | 2908 | ||
| 2909 | death++; | 2909 | death++; |
| 2910 | 2910 | ||
| @@ -2917,7 +2917,6 @@ static int binder_node_release(struct binder_node *node, int refs) | |||
| 2917 | BUG(); | 2917 | BUG(); |
| 2918 | } | 2918 | } |
| 2919 | 2919 | ||
| 2920 | out: | ||
| 2921 | binder_debug(BINDER_DEBUG_DEAD_BINDER, | 2920 | binder_debug(BINDER_DEBUG_DEAD_BINDER, |
| 2922 | "node %d now dead, refs %d, death %d\n", | 2921 | "node %d now dead, refs %d, death %d\n", |
| 2923 | node->debug_id, refs, death); | 2922 | node->debug_id, refs, death); |
diff --git a/drivers/staging/iio/adc/mxs-lradc.c b/drivers/staging/iio/adc/mxs-lradc.c index 7fc66a6a6e36..514844efac75 100644 --- a/drivers/staging/iio/adc/mxs-lradc.c +++ b/drivers/staging/iio/adc/mxs-lradc.c | |||
| @@ -757,6 +757,7 @@ static void mxs_lradc_finish_touch_event(struct mxs_lradc *lradc, bool valid) | |||
| 757 | } | 757 | } |
| 758 | 758 | ||
| 759 | /* if it is released, wait for the next touch via IRQ */ | 759 | /* if it is released, wait for the next touch via IRQ */ |
| 760 | lradc->cur_plate = LRADC_TOUCH; | ||
| 760 | mxs_lradc_reg_clear(lradc, LRADC_CTRL1_TOUCH_DETECT_IRQ, LRADC_CTRL1); | 761 | mxs_lradc_reg_clear(lradc, LRADC_CTRL1_TOUCH_DETECT_IRQ, LRADC_CTRL1); |
| 761 | mxs_lradc_reg_set(lradc, LRADC_CTRL1_TOUCH_DETECT_IRQ_EN, LRADC_CTRL1); | 762 | mxs_lradc_reg_set(lradc, LRADC_CTRL1_TOUCH_DETECT_IRQ_EN, LRADC_CTRL1); |
| 762 | } | 763 | } |
diff --git a/drivers/staging/rtl8188eu/os_dep/usb_intf.c b/drivers/staging/rtl8188eu/os_dep/usb_intf.c index a70dcef1419e..2f40ff5901d6 100644 --- a/drivers/staging/rtl8188eu/os_dep/usb_intf.c +++ b/drivers/staging/rtl8188eu/os_dep/usb_intf.c | |||
| @@ -55,6 +55,7 @@ static struct usb_device_id rtw_usb_id_tbl[] = { | |||
| 55 | /****** 8188EUS ********/ | 55 | /****** 8188EUS ********/ |
| 56 | {USB_DEVICE(0x07b8, 0x8179)}, /* Abocom - Abocom */ | 56 | {USB_DEVICE(0x07b8, 0x8179)}, /* Abocom - Abocom */ |
| 57 | {USB_DEVICE(0x2001, 0x330F)}, /* DLink DWA-125 REV D1 */ | 57 | {USB_DEVICE(0x2001, 0x330F)}, /* DLink DWA-125 REV D1 */ |
| 58 | {USB_DEVICE(0x2001, 0x3310)}, /* Dlink DWA-123 REV D1 */ | ||
| 58 | {} /* Terminating entry */ | 59 | {} /* Terminating entry */ |
| 59 | }; | 60 | }; |
| 60 | 61 | ||
diff --git a/drivers/target/target_core_sbc.c b/drivers/target/target_core_sbc.c index a4489444ffbc..42f18fc1067b 100644 --- a/drivers/target/target_core_sbc.c +++ b/drivers/target/target_core_sbc.c | |||
| @@ -1074,7 +1074,7 @@ sbc_dif_copy_prot(struct se_cmd *cmd, unsigned int sectors, bool read, | |||
| 1074 | struct scatterlist *psg; | 1074 | struct scatterlist *psg; |
| 1075 | void *paddr, *addr; | 1075 | void *paddr, *addr; |
| 1076 | unsigned int i, len, left; | 1076 | unsigned int i, len, left; |
| 1077 | unsigned int offset = 0; | 1077 | unsigned int offset = sg_off; |
| 1078 | 1078 | ||
| 1079 | left = sectors * dev->prot_length; | 1079 | left = sectors * dev->prot_length; |
| 1080 | 1080 | ||
| @@ -1084,11 +1084,10 @@ sbc_dif_copy_prot(struct se_cmd *cmd, unsigned int sectors, bool read, | |||
| 1084 | if (offset >= sg->length) { | 1084 | if (offset >= sg->length) { |
| 1085 | sg = sg_next(sg); | 1085 | sg = sg_next(sg); |
| 1086 | offset = 0; | 1086 | offset = 0; |
| 1087 | sg_off = sg->offset; | ||
| 1088 | } | 1087 | } |
| 1089 | 1088 | ||
| 1090 | paddr = kmap_atomic(sg_page(psg)) + psg->offset; | 1089 | paddr = kmap_atomic(sg_page(psg)) + psg->offset; |
| 1091 | addr = kmap_atomic(sg_page(sg)) + sg_off; | 1090 | addr = kmap_atomic(sg_page(sg)) + sg->offset + offset; |
| 1092 | 1091 | ||
| 1093 | if (read) | 1092 | if (read) |
| 1094 | memcpy(paddr, addr, len); | 1093 | memcpy(paddr, addr, len); |
| @@ -1163,7 +1162,7 @@ sbc_dif_verify_read(struct se_cmd *cmd, sector_t start, unsigned int sectors, | |||
| 1163 | { | 1162 | { |
| 1164 | struct se_device *dev = cmd->se_dev; | 1163 | struct se_device *dev = cmd->se_dev; |
| 1165 | struct se_dif_v1_tuple *sdt; | 1164 | struct se_dif_v1_tuple *sdt; |
| 1166 | struct scatterlist *dsg; | 1165 | struct scatterlist *dsg, *psg = sg; |
| 1167 | sector_t sector = start; | 1166 | sector_t sector = start; |
| 1168 | void *daddr, *paddr; | 1167 | void *daddr, *paddr; |
| 1169 | int i, j, offset = sg_off; | 1168 | int i, j, offset = sg_off; |
| @@ -1171,14 +1170,14 @@ sbc_dif_verify_read(struct se_cmd *cmd, sector_t start, unsigned int sectors, | |||
| 1171 | 1170 | ||
| 1172 | for_each_sg(cmd->t_data_sg, dsg, cmd->t_data_nents, i) { | 1171 | for_each_sg(cmd->t_data_sg, dsg, cmd->t_data_nents, i) { |
| 1173 | daddr = kmap_atomic(sg_page(dsg)) + dsg->offset; | 1172 | daddr = kmap_atomic(sg_page(dsg)) + dsg->offset; |
| 1174 | paddr = kmap_atomic(sg_page(sg)) + sg->offset; | 1173 | paddr = kmap_atomic(sg_page(psg)) + sg->offset; |
| 1175 | 1174 | ||
| 1176 | for (j = 0; j < dsg->length; j += dev->dev_attrib.block_size) { | 1175 | for (j = 0; j < dsg->length; j += dev->dev_attrib.block_size) { |
| 1177 | 1176 | ||
| 1178 | if (offset >= sg->length) { | 1177 | if (offset >= psg->length) { |
| 1179 | kunmap_atomic(paddr); | 1178 | kunmap_atomic(paddr); |
| 1180 | sg = sg_next(sg); | 1179 | psg = sg_next(psg); |
| 1181 | paddr = kmap_atomic(sg_page(sg)) + sg->offset; | 1180 | paddr = kmap_atomic(sg_page(psg)) + psg->offset; |
| 1182 | offset = 0; | 1181 | offset = 0; |
| 1183 | } | 1182 | } |
| 1184 | 1183 | ||
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c index 24b4f65d8777..2956250b7225 100644 --- a/drivers/target/target_core_transport.c +++ b/drivers/target/target_core_transport.c | |||
| @@ -1601,6 +1601,9 @@ void transport_generic_request_failure(struct se_cmd *cmd, | |||
| 1601 | case TCM_CHECK_CONDITION_ABORT_CMD: | 1601 | case TCM_CHECK_CONDITION_ABORT_CMD: |
| 1602 | case TCM_CHECK_CONDITION_UNIT_ATTENTION: | 1602 | case TCM_CHECK_CONDITION_UNIT_ATTENTION: |
| 1603 | case TCM_CHECK_CONDITION_NOT_READY: | 1603 | case TCM_CHECK_CONDITION_NOT_READY: |
| 1604 | case TCM_LOGICAL_BLOCK_GUARD_CHECK_FAILED: | ||
| 1605 | case TCM_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED: | ||
| 1606 | case TCM_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED: | ||
| 1604 | break; | 1607 | break; |
| 1605 | case TCM_OUT_OF_RESOURCES: | 1608 | case TCM_OUT_OF_RESOURCES: |
| 1606 | sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; | 1609 | sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; |
diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c index bd2715a9d8e5..c74a00ad7add 100644 --- a/drivers/tty/tty_io.c +++ b/drivers/tty/tty_io.c | |||
| @@ -1267,17 +1267,16 @@ static void pty_line_name(struct tty_driver *driver, int index, char *p) | |||
| 1267 | * @p: output buffer of at least 7 bytes | 1267 | * @p: output buffer of at least 7 bytes |
| 1268 | * | 1268 | * |
| 1269 | * Generate a name from a driver reference and write it to the output | 1269 | * Generate a name from a driver reference and write it to the output |
| 1270 | * buffer. Return the number of bytes written. | 1270 | * buffer. |
| 1271 | * | 1271 | * |
| 1272 | * Locking: None | 1272 | * Locking: None |
| 1273 | */ | 1273 | */ |
| 1274 | static ssize_t tty_line_name(struct tty_driver *driver, int index, char *p) | 1274 | static void tty_line_name(struct tty_driver *driver, int index, char *p) |
| 1275 | { | 1275 | { |
| 1276 | if (driver->flags & TTY_DRIVER_UNNUMBERED_NODE) | 1276 | if (driver->flags & TTY_DRIVER_UNNUMBERED_NODE) |
| 1277 | return sprintf(p, "%s", driver->name); | 1277 | strcpy(p, driver->name); |
| 1278 | else | 1278 | else |
| 1279 | return sprintf(p, "%s%d", driver->name, | 1279 | sprintf(p, "%s%d", driver->name, index + driver->name_base); |
| 1280 | index + driver->name_base); | ||
| 1281 | } | 1280 | } |
| 1282 | 1281 | ||
| 1283 | /** | 1282 | /** |
| @@ -3546,19 +3545,9 @@ static ssize_t show_cons_active(struct device *dev, | |||
| 3546 | if (i >= ARRAY_SIZE(cs)) | 3545 | if (i >= ARRAY_SIZE(cs)) |
| 3547 | break; | 3546 | break; |
| 3548 | } | 3547 | } |
| 3549 | while (i--) { | 3548 | while (i--) |
| 3550 | struct tty_driver *driver; | 3549 | count += sprintf(buf + count, "%s%d%c", |
| 3551 | const char *name = cs[i]->name; | 3550 | cs[i]->name, cs[i]->index, i ? ' ':'\n'); |
| 3552 | int index = cs[i]->index; | ||
| 3553 | |||
| 3554 | driver = cs[i]->device(cs[i], &index); | ||
| 3555 | if (driver) { | ||
| 3556 | count += tty_line_name(driver, index, buf + count); | ||
| 3557 | count += sprintf(buf + count, "%c", i ? ' ':'\n'); | ||
| 3558 | } else | ||
| 3559 | count += sprintf(buf + count, "%s%d%c", | ||
| 3560 | name, index, i ? ' ':'\n'); | ||
| 3561 | } | ||
| 3562 | console_unlock(); | 3551 | console_unlock(); |
| 3563 | 3552 | ||
| 3564 | return count; | 3553 | return count; |
diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c index 80de2f88ed2c..4ab2cb62dfce 100644 --- a/drivers/usb/chipidea/udc.c +++ b/drivers/usb/chipidea/udc.c | |||
| @@ -105,7 +105,7 @@ static int hw_ep_flush(struct ci_hdrc *ci, int num, int dir) | |||
| 105 | 105 | ||
| 106 | do { | 106 | do { |
| 107 | /* flush any pending transfer */ | 107 | /* flush any pending transfer */ |
| 108 | hw_write(ci, OP_ENDPTFLUSH, BIT(n), BIT(n)); | 108 | hw_write(ci, OP_ENDPTFLUSH, ~0, BIT(n)); |
| 109 | while (hw_read(ci, OP_ENDPTFLUSH, BIT(n))) | 109 | while (hw_read(ci, OP_ENDPTFLUSH, BIT(n))) |
| 110 | cpu_relax(); | 110 | cpu_relax(); |
| 111 | } while (hw_read(ci, OP_ENDPTSTAT, BIT(n))); | 111 | } while (hw_read(ci, OP_ENDPTSTAT, BIT(n))); |
| @@ -205,7 +205,7 @@ static int hw_ep_prime(struct ci_hdrc *ci, int num, int dir, int is_ctrl) | |||
| 205 | if (is_ctrl && dir == RX && hw_read(ci, OP_ENDPTSETUPSTAT, BIT(num))) | 205 | if (is_ctrl && dir == RX && hw_read(ci, OP_ENDPTSETUPSTAT, BIT(num))) |
| 206 | return -EAGAIN; | 206 | return -EAGAIN; |
| 207 | 207 | ||
| 208 | hw_write(ci, OP_ENDPTPRIME, BIT(n), BIT(n)); | 208 | hw_write(ci, OP_ENDPTPRIME, ~0, BIT(n)); |
| 209 | 209 | ||
| 210 | while (hw_read(ci, OP_ENDPTPRIME, BIT(n))) | 210 | while (hw_read(ci, OP_ENDPTPRIME, BIT(n))) |
| 211 | cpu_relax(); | 211 | cpu_relax(); |
diff --git a/drivers/usb/gadget/bcm63xx_udc.c b/drivers/usb/gadget/bcm63xx_udc.c index 888fbb43b338..e969eb809a85 100644 --- a/drivers/usb/gadget/bcm63xx_udc.c +++ b/drivers/usb/gadget/bcm63xx_udc.c | |||
| @@ -360,24 +360,30 @@ static inline void usb_dma_writel(struct bcm63xx_udc *udc, u32 val, u32 off) | |||
| 360 | bcm_writel(val, udc->iudma_regs + off); | 360 | bcm_writel(val, udc->iudma_regs + off); |
| 361 | } | 361 | } |
| 362 | 362 | ||
| 363 | static inline u32 usb_dmac_readl(struct bcm63xx_udc *udc, u32 off) | 363 | static inline u32 usb_dmac_readl(struct bcm63xx_udc *udc, u32 off, int chan) |
| 364 | { | 364 | { |
| 365 | return bcm_readl(udc->iudma_regs + IUDMA_DMAC_OFFSET + off); | 365 | return bcm_readl(udc->iudma_regs + IUDMA_DMAC_OFFSET + off + |
| 366 | (ENETDMA_CHAN_WIDTH * chan)); | ||
| 366 | } | 367 | } |
| 367 | 368 | ||
| 368 | static inline void usb_dmac_writel(struct bcm63xx_udc *udc, u32 val, u32 off) | 369 | static inline void usb_dmac_writel(struct bcm63xx_udc *udc, u32 val, u32 off, |
| 370 | int chan) | ||
| 369 | { | 371 | { |
| 370 | bcm_writel(val, udc->iudma_regs + IUDMA_DMAC_OFFSET + off); | 372 | bcm_writel(val, udc->iudma_regs + IUDMA_DMAC_OFFSET + off + |
| 373 | (ENETDMA_CHAN_WIDTH * chan)); | ||
| 371 | } | 374 | } |
| 372 | 375 | ||
| 373 | static inline u32 usb_dmas_readl(struct bcm63xx_udc *udc, u32 off) | 376 | static inline u32 usb_dmas_readl(struct bcm63xx_udc *udc, u32 off, int chan) |
| 374 | { | 377 | { |
| 375 | return bcm_readl(udc->iudma_regs + IUDMA_DMAS_OFFSET + off); | 378 | return bcm_readl(udc->iudma_regs + IUDMA_DMAS_OFFSET + off + |
| 379 | (ENETDMA_CHAN_WIDTH * chan)); | ||
| 376 | } | 380 | } |
| 377 | 381 | ||
| 378 | static inline void usb_dmas_writel(struct bcm63xx_udc *udc, u32 val, u32 off) | 382 | static inline void usb_dmas_writel(struct bcm63xx_udc *udc, u32 val, u32 off, |
| 383 | int chan) | ||
| 379 | { | 384 | { |
| 380 | bcm_writel(val, udc->iudma_regs + IUDMA_DMAS_OFFSET + off); | 385 | bcm_writel(val, udc->iudma_regs + IUDMA_DMAS_OFFSET + off + |
| 386 | (ENETDMA_CHAN_WIDTH * chan)); | ||
| 381 | } | 387 | } |
| 382 | 388 | ||
| 383 | static inline void set_clocks(struct bcm63xx_udc *udc, bool is_enabled) | 389 | static inline void set_clocks(struct bcm63xx_udc *udc, bool is_enabled) |
| @@ -638,7 +644,7 @@ static void iudma_write(struct bcm63xx_udc *udc, struct iudma_ch *iudma, | |||
| 638 | } while (!last_bd); | 644 | } while (!last_bd); |
| 639 | 645 | ||
| 640 | usb_dmac_writel(udc, ENETDMAC_CHANCFG_EN_MASK, | 646 | usb_dmac_writel(udc, ENETDMAC_CHANCFG_EN_MASK, |
| 641 | ENETDMAC_CHANCFG_REG(iudma->ch_idx)); | 647 | ENETDMAC_CHANCFG_REG, iudma->ch_idx); |
| 642 | } | 648 | } |
| 643 | 649 | ||
| 644 | /** | 650 | /** |
| @@ -694,9 +700,9 @@ static void iudma_reset_channel(struct bcm63xx_udc *udc, struct iudma_ch *iudma) | |||
| 694 | bcm63xx_fifo_reset_ep(udc, max(0, iudma->ep_num)); | 700 | bcm63xx_fifo_reset_ep(udc, max(0, iudma->ep_num)); |
| 695 | 701 | ||
| 696 | /* stop DMA, then wait for the hardware to wrap up */ | 702 | /* stop DMA, then wait for the hardware to wrap up */ |
| 697 | usb_dmac_writel(udc, 0, ENETDMAC_CHANCFG_REG(ch_idx)); | 703 | usb_dmac_writel(udc, 0, ENETDMAC_CHANCFG_REG, ch_idx); |
| 698 | 704 | ||
| 699 | while (usb_dmac_readl(udc, ENETDMAC_CHANCFG_REG(ch_idx)) & | 705 | while (usb_dmac_readl(udc, ENETDMAC_CHANCFG_REG, ch_idx) & |
| 700 | ENETDMAC_CHANCFG_EN_MASK) { | 706 | ENETDMAC_CHANCFG_EN_MASK) { |
| 701 | udelay(1); | 707 | udelay(1); |
| 702 | 708 | ||
| @@ -713,10 +719,10 @@ static void iudma_reset_channel(struct bcm63xx_udc *udc, struct iudma_ch *iudma) | |||
| 713 | dev_warn(udc->dev, "forcibly halting IUDMA channel %d\n", | 719 | dev_warn(udc->dev, "forcibly halting IUDMA channel %d\n", |
| 714 | ch_idx); | 720 | ch_idx); |
| 715 | usb_dmac_writel(udc, ENETDMAC_CHANCFG_BUFHALT_MASK, | 721 | usb_dmac_writel(udc, ENETDMAC_CHANCFG_BUFHALT_MASK, |
| 716 | ENETDMAC_CHANCFG_REG(ch_idx)); | 722 | ENETDMAC_CHANCFG_REG, ch_idx); |
| 717 | } | 723 | } |
| 718 | } | 724 | } |
| 719 | usb_dmac_writel(udc, ~0, ENETDMAC_IR_REG(ch_idx)); | 725 | usb_dmac_writel(udc, ~0, ENETDMAC_IR_REG, ch_idx); |
| 720 | 726 | ||
| 721 | /* don't leave "live" HW-owned entries for the next guy to step on */ | 727 | /* don't leave "live" HW-owned entries for the next guy to step on */ |
| 722 | for (d = iudma->bd_ring; d <= iudma->end_bd; d++) | 728 | for (d = iudma->bd_ring; d <= iudma->end_bd; d++) |
| @@ -728,11 +734,11 @@ static void iudma_reset_channel(struct bcm63xx_udc *udc, struct iudma_ch *iudma) | |||
| 728 | 734 | ||
| 729 | /* set up IRQs, UBUS burst size, and BD base for this channel */ | 735 | /* set up IRQs, UBUS burst size, and BD base for this channel */ |
| 730 | usb_dmac_writel(udc, ENETDMAC_IR_BUFDONE_MASK, | 736 | usb_dmac_writel(udc, ENETDMAC_IR_BUFDONE_MASK, |
| 731 | ENETDMAC_IRMASK_REG(ch_idx)); | 737 | ENETDMAC_IRMASK_REG, ch_idx); |
| 732 | usb_dmac_writel(udc, 8, ENETDMAC_MAXBURST_REG(ch_idx)); | 738 | usb_dmac_writel(udc, 8, ENETDMAC_MAXBURST_REG, ch_idx); |
| 733 | 739 | ||
| 734 | usb_dmas_writel(udc, iudma->bd_ring_dma, ENETDMAS_RSTART_REG(ch_idx)); | 740 | usb_dmas_writel(udc, iudma->bd_ring_dma, ENETDMAS_RSTART_REG, ch_idx); |
| 735 | usb_dmas_writel(udc, 0, ENETDMAS_SRAM2_REG(ch_idx)); | 741 | usb_dmas_writel(udc, 0, ENETDMAS_SRAM2_REG, ch_idx); |
| 736 | } | 742 | } |
| 737 | 743 | ||
| 738 | /** | 744 | /** |
| @@ -2035,7 +2041,7 @@ static irqreturn_t bcm63xx_udc_data_isr(int irq, void *dev_id) | |||
| 2035 | spin_lock(&udc->lock); | 2041 | spin_lock(&udc->lock); |
| 2036 | 2042 | ||
| 2037 | usb_dmac_writel(udc, ENETDMAC_IR_BUFDONE_MASK, | 2043 | usb_dmac_writel(udc, ENETDMAC_IR_BUFDONE_MASK, |
| 2038 | ENETDMAC_IR_REG(iudma->ch_idx)); | 2044 | ENETDMAC_IR_REG, iudma->ch_idx); |
| 2039 | bep = iudma->bep; | 2045 | bep = iudma->bep; |
| 2040 | rc = iudma_read(udc, iudma); | 2046 | rc = iudma_read(udc, iudma); |
| 2041 | 2047 | ||
| @@ -2175,18 +2181,18 @@ static int bcm63xx_iudma_dbg_show(struct seq_file *s, void *p) | |||
| 2175 | seq_printf(s, " [ep%d]:\n", | 2181 | seq_printf(s, " [ep%d]:\n", |
| 2176 | max_t(int, iudma_defaults[ch_idx].ep_num, 0)); | 2182 | max_t(int, iudma_defaults[ch_idx].ep_num, 0)); |
| 2177 | seq_printf(s, " cfg: %08x; irqstat: %08x; irqmask: %08x; maxburst: %08x\n", | 2183 | seq_printf(s, " cfg: %08x; irqstat: %08x; irqmask: %08x; maxburst: %08x\n", |
| 2178 | usb_dmac_readl(udc, ENETDMAC_CHANCFG_REG(ch_idx)), | 2184 | usb_dmac_readl(udc, ENETDMAC_CHANCFG_REG, ch_idx), |
| 2179 | usb_dmac_readl(udc, ENETDMAC_IR_REG(ch_idx)), | 2185 | usb_dmac_readl(udc, ENETDMAC_IR_REG, ch_idx), |
| 2180 | usb_dmac_readl(udc, ENETDMAC_IRMASK_REG(ch_idx)), | 2186 | usb_dmac_readl(udc, ENETDMAC_IRMASK_REG, ch_idx), |
| 2181 | usb_dmac_readl(udc, ENETDMAC_MAXBURST_REG(ch_idx))); | 2187 | usb_dmac_readl(udc, ENETDMAC_MAXBURST_REG, ch_idx)); |
| 2182 | 2188 | ||
| 2183 | sram2 = usb_dmas_readl(udc, ENETDMAS_SRAM2_REG(ch_idx)); | 2189 | sram2 = usb_dmas_readl(udc, ENETDMAS_SRAM2_REG, ch_idx); |
| 2184 | sram3 = usb_dmas_readl(udc, ENETDMAS_SRAM3_REG(ch_idx)); | 2190 | sram3 = usb_dmas_readl(udc, ENETDMAS_SRAM3_REG, ch_idx); |
| 2185 | seq_printf(s, " base: %08x; index: %04x_%04x; desc: %04x_%04x %08x\n", | 2191 | seq_printf(s, " base: %08x; index: %04x_%04x; desc: %04x_%04x %08x\n", |
| 2186 | usb_dmas_readl(udc, ENETDMAS_RSTART_REG(ch_idx)), | 2192 | usb_dmas_readl(udc, ENETDMAS_RSTART_REG, ch_idx), |
| 2187 | sram2 >> 16, sram2 & 0xffff, | 2193 | sram2 >> 16, sram2 & 0xffff, |
| 2188 | sram3 >> 16, sram3 & 0xffff, | 2194 | sram3 >> 16, sram3 & 0xffff, |
| 2189 | usb_dmas_readl(udc, ENETDMAS_SRAM4_REG(ch_idx))); | 2195 | usb_dmas_readl(udc, ENETDMAS_SRAM4_REG, ch_idx)); |
| 2190 | seq_printf(s, " desc: %d/%d used", iudma->n_bds_used, | 2196 | seq_printf(s, " desc: %d/%d used", iudma->n_bds_used, |
| 2191 | iudma->n_bds); | 2197 | iudma->n_bds); |
| 2192 | 2198 | ||
diff --git a/drivers/usb/gadget/f_fs.c b/drivers/usb/gadget/f_fs.c index 306a2b52125c..2b4334394076 100644 --- a/drivers/usb/gadget/f_fs.c +++ b/drivers/usb/gadget/f_fs.c | |||
| @@ -585,7 +585,6 @@ static ssize_t ffs_epfile_io(struct file *file, | |||
| 585 | char __user *buf, size_t len, int read) | 585 | char __user *buf, size_t len, int read) |
| 586 | { | 586 | { |
| 587 | struct ffs_epfile *epfile = file->private_data; | 587 | struct ffs_epfile *epfile = file->private_data; |
| 588 | struct usb_gadget *gadget = epfile->ffs->gadget; | ||
| 589 | struct ffs_ep *ep; | 588 | struct ffs_ep *ep; |
| 590 | char *data = NULL; | 589 | char *data = NULL; |
| 591 | ssize_t ret, data_len; | 590 | ssize_t ret, data_len; |
| @@ -622,6 +621,12 @@ static ssize_t ffs_epfile_io(struct file *file, | |||
| 622 | /* Allocate & copy */ | 621 | /* Allocate & copy */ |
| 623 | if (!halt) { | 622 | if (!halt) { |
| 624 | /* | 623 | /* |
| 624 | * if we _do_ wait above, the epfile->ffs->gadget might be NULL | ||
| 625 | * before the waiting completes, so do not assign to 'gadget' earlier | ||
| 626 | */ | ||
| 627 | struct usb_gadget *gadget = epfile->ffs->gadget; | ||
| 628 | |||
| 629 | /* | ||
| 625 | * Controller may require buffer size to be aligned to | 630 | * Controller may require buffer size to be aligned to |
| 626 | * maxpacketsize of an out endpoint. | 631 | * maxpacketsize of an out endpoint. |
| 627 | */ | 632 | */ |
diff --git a/drivers/usb/gadget/printer.c b/drivers/usb/gadget/printer.c index bf7a56b6d48a..69b76efd11e9 100644 --- a/drivers/usb/gadget/printer.c +++ b/drivers/usb/gadget/printer.c | |||
| @@ -1157,7 +1157,7 @@ static int __init printer_bind_config(struct usb_configuration *c) | |||
| 1157 | 1157 | ||
| 1158 | usb_gadget_set_selfpowered(gadget); | 1158 | usb_gadget_set_selfpowered(gadget); |
| 1159 | 1159 | ||
| 1160 | if (gadget->is_otg) { | 1160 | if (gadget_is_otg(gadget)) { |
| 1161 | otg_descriptor.bmAttributes |= USB_OTG_HNP; | 1161 | otg_descriptor.bmAttributes |= USB_OTG_HNP; |
| 1162 | printer_cfg_driver.descriptors = otg_desc; | 1162 | printer_cfg_driver.descriptors = otg_desc; |
| 1163 | printer_cfg_driver.bmAttributes |= USB_CONFIG_ATT_WAKEUP; | 1163 | printer_cfg_driver.bmAttributes |= USB_CONFIG_ATT_WAKEUP; |
diff --git a/drivers/usb/gadget/s3c2410_udc.c b/drivers/usb/gadget/s3c2410_udc.c index f04b2c3154de..dd9678f85c58 100644 --- a/drivers/usb/gadget/s3c2410_udc.c +++ b/drivers/usb/gadget/s3c2410_udc.c | |||
| @@ -1629,7 +1629,7 @@ static void s3c2410_udc_reinit(struct s3c2410_udc *dev) | |||
| 1629 | ep->ep.desc = NULL; | 1629 | ep->ep.desc = NULL; |
| 1630 | ep->halted = 0; | 1630 | ep->halted = 0; |
| 1631 | INIT_LIST_HEAD(&ep->queue); | 1631 | INIT_LIST_HEAD(&ep->queue); |
| 1632 | usb_ep_set_maxpacket_limit(&ep->ep, &ep->ep.maxpacket); | 1632 | usb_ep_set_maxpacket_limit(&ep->ep, ep->ep.maxpacket); |
| 1633 | } | 1633 | } |
| 1634 | } | 1634 | } |
| 1635 | 1635 | ||
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index 471142725ffe..81cda09b47e3 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c | |||
| @@ -685,8 +685,15 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd) | |||
| 685 | struct ehci_hcd *ehci = hcd_to_ehci (hcd); | 685 | struct ehci_hcd *ehci = hcd_to_ehci (hcd); |
| 686 | u32 status, masked_status, pcd_status = 0, cmd; | 686 | u32 status, masked_status, pcd_status = 0, cmd; |
| 687 | int bh; | 687 | int bh; |
| 688 | unsigned long flags; | ||
| 688 | 689 | ||
| 689 | spin_lock (&ehci->lock); | 690 | /* |
| 691 | * For threadirqs option we use spin_lock_irqsave() variant to prevent | ||
| 692 | * deadlock with ehci hrtimer callback, because hrtimer callbacks run | ||
| 693 | * in interrupt context even when threadirqs is specified. We can go | ||
| 694 | * back to spin_lock() variant when hrtimer callbacks become threaded. | ||
| 695 | */ | ||
| 696 | spin_lock_irqsave(&ehci->lock, flags); | ||
| 690 | 697 | ||
| 691 | status = ehci_readl(ehci, &ehci->regs->status); | 698 | status = ehci_readl(ehci, &ehci->regs->status); |
| 692 | 699 | ||
| @@ -704,7 +711,7 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd) | |||
| 704 | 711 | ||
| 705 | /* Shared IRQ? */ | 712 | /* Shared IRQ? */ |
| 706 | if (!masked_status || unlikely(ehci->rh_state == EHCI_RH_HALTED)) { | 713 | if (!masked_status || unlikely(ehci->rh_state == EHCI_RH_HALTED)) { |
| 707 | spin_unlock(&ehci->lock); | 714 | spin_unlock_irqrestore(&ehci->lock, flags); |
| 708 | return IRQ_NONE; | 715 | return IRQ_NONE; |
| 709 | } | 716 | } |
| 710 | 717 | ||
| @@ -815,7 +822,7 @@ dead: | |||
| 815 | 822 | ||
| 816 | if (bh) | 823 | if (bh) |
| 817 | ehci_work (ehci); | 824 | ehci_work (ehci); |
| 818 | spin_unlock (&ehci->lock); | 825 | spin_unlock_irqrestore(&ehci->lock, flags); |
| 819 | if (pcd_status) | 826 | if (pcd_status) |
| 820 | usb_hcd_poll_rh_status(hcd); | 827 | usb_hcd_poll_rh_status(hcd); |
| 821 | return IRQ_HANDLED; | 828 | return IRQ_HANDLED; |
diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c index 47b858fc50b2..7ae0c4d51741 100644 --- a/drivers/usb/host/ehci-hub.c +++ b/drivers/usb/host/ehci-hub.c | |||
| @@ -238,6 +238,7 @@ static int ehci_bus_suspend (struct usb_hcd *hcd) | |||
| 238 | int port; | 238 | int port; |
| 239 | int mask; | 239 | int mask; |
| 240 | int changed; | 240 | int changed; |
| 241 | bool fs_idle_delay; | ||
| 241 | 242 | ||
| 242 | ehci_dbg(ehci, "suspend root hub\n"); | 243 | ehci_dbg(ehci, "suspend root hub\n"); |
| 243 | 244 | ||
| @@ -272,6 +273,7 @@ static int ehci_bus_suspend (struct usb_hcd *hcd) | |||
| 272 | ehci->bus_suspended = 0; | 273 | ehci->bus_suspended = 0; |
| 273 | ehci->owned_ports = 0; | 274 | ehci->owned_ports = 0; |
| 274 | changed = 0; | 275 | changed = 0; |
| 276 | fs_idle_delay = false; | ||
| 275 | port = HCS_N_PORTS(ehci->hcs_params); | 277 | port = HCS_N_PORTS(ehci->hcs_params); |
| 276 | while (port--) { | 278 | while (port--) { |
| 277 | u32 __iomem *reg = &ehci->regs->port_status [port]; | 279 | u32 __iomem *reg = &ehci->regs->port_status [port]; |
| @@ -300,16 +302,32 @@ static int ehci_bus_suspend (struct usb_hcd *hcd) | |||
| 300 | } | 302 | } |
| 301 | 303 | ||
| 302 | if (t1 != t2) { | 304 | if (t1 != t2) { |
| 305 | /* | ||
| 306 | * On some controllers, Wake-On-Disconnect will | ||
| 307 | * generate false wakeup signals until the bus | ||
| 308 | * switches over to full-speed idle. For their | ||
| 309 | * sake, add a delay if we need one. | ||
| 310 | */ | ||
| 311 | if ((t2 & PORT_WKDISC_E) && | ||
| 312 | ehci_port_speed(ehci, t2) == | ||
| 313 | USB_PORT_STAT_HIGH_SPEED) | ||
| 314 | fs_idle_delay = true; | ||
| 303 | ehci_writel(ehci, t2, reg); | 315 | ehci_writel(ehci, t2, reg); |
| 304 | changed = 1; | 316 | changed = 1; |
| 305 | } | 317 | } |
| 306 | } | 318 | } |
| 319 | spin_unlock_irq(&ehci->lock); | ||
| 320 | |||
| 321 | if ((changed && ehci->has_tdi_phy_lpm) || fs_idle_delay) { | ||
| 322 | /* | ||
| 323 | * Wait for HCD to enter low-power mode or for the bus | ||
| 324 | * to switch to full-speed idle. | ||
| 325 | */ | ||
| 326 | usleep_range(5000, 5500); | ||
| 327 | } | ||
| 307 | 328 | ||
| 308 | if (changed && ehci->has_tdi_phy_lpm) { | 329 | if (changed && ehci->has_tdi_phy_lpm) { |
| 309 | spin_unlock_irq(&ehci->lock); | ||
| 310 | msleep(5); /* 5 ms for HCD to enter low-power mode */ | ||
| 311 | spin_lock_irq(&ehci->lock); | 330 | spin_lock_irq(&ehci->lock); |
| 312 | |||
| 313 | port = HCS_N_PORTS(ehci->hcs_params); | 331 | port = HCS_N_PORTS(ehci->hcs_params); |
| 314 | while (port--) { | 332 | while (port--) { |
| 315 | u32 __iomem *hostpc_reg = &ehci->regs->hostpc[port]; | 333 | u32 __iomem *hostpc_reg = &ehci->regs->hostpc[port]; |
| @@ -322,8 +340,8 @@ static int ehci_bus_suspend (struct usb_hcd *hcd) | |||
| 322 | port, (t3 & HOSTPC_PHCD) ? | 340 | port, (t3 & HOSTPC_PHCD) ? |
| 323 | "succeeded" : "failed"); | 341 | "succeeded" : "failed"); |
| 324 | } | 342 | } |
| 343 | spin_unlock_irq(&ehci->lock); | ||
| 325 | } | 344 | } |
| 326 | spin_unlock_irq(&ehci->lock); | ||
| 327 | 345 | ||
| 328 | /* Apparently some devices need a >= 1-uframe delay here */ | 346 | /* Apparently some devices need a >= 1-uframe delay here */ |
| 329 | if (ehci->bus_suspended) | 347 | if (ehci->bus_suspended) |
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c index fc192ad9cc6a..239ad0b1ceb6 100644 --- a/drivers/usb/musb/musb_core.c +++ b/drivers/usb/musb/musb_core.c | |||
| @@ -477,8 +477,11 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, | |||
| 477 | musb->port1_status |= | 477 | musb->port1_status |= |
| 478 | (USB_PORT_STAT_C_SUSPEND << 16) | 478 | (USB_PORT_STAT_C_SUSPEND << 16) |
| 479 | | MUSB_PORT_STAT_RESUME; | 479 | | MUSB_PORT_STAT_RESUME; |
| 480 | musb->rh_timer = jiffies | ||
| 481 | + msecs_to_jiffies(20); | ||
| 480 | schedule_delayed_work( | 482 | schedule_delayed_work( |
| 481 | &musb->finish_resume_work, 20); | 483 | &musb->finish_resume_work, |
| 484 | msecs_to_jiffies(20)); | ||
| 482 | 485 | ||
| 483 | musb->xceiv->state = OTG_STATE_A_HOST; | 486 | musb->xceiv->state = OTG_STATE_A_HOST; |
| 484 | musb->is_active = 1; | 487 | musb->is_active = 1; |
| @@ -2157,11 +2160,19 @@ static void musb_restore_context(struct musb *musb) | |||
| 2157 | void __iomem *musb_base = musb->mregs; | 2160 | void __iomem *musb_base = musb->mregs; |
| 2158 | void __iomem *ep_target_regs; | 2161 | void __iomem *ep_target_regs; |
| 2159 | void __iomem *epio; | 2162 | void __iomem *epio; |
| 2163 | u8 power; | ||
| 2160 | 2164 | ||
| 2161 | musb_writew(musb_base, MUSB_FRAME, musb->context.frame); | 2165 | musb_writew(musb_base, MUSB_FRAME, musb->context.frame); |
| 2162 | musb_writeb(musb_base, MUSB_TESTMODE, musb->context.testmode); | 2166 | musb_writeb(musb_base, MUSB_TESTMODE, musb->context.testmode); |
| 2163 | musb_write_ulpi_buscontrol(musb->mregs, musb->context.busctl); | 2167 | musb_write_ulpi_buscontrol(musb->mregs, musb->context.busctl); |
| 2164 | musb_writeb(musb_base, MUSB_POWER, musb->context.power); | 2168 | |
| 2169 | /* Don't affect SUSPENDM/RESUME bits in POWER reg */ | ||
| 2170 | power = musb_readb(musb_base, MUSB_POWER); | ||
| 2171 | power &= MUSB_POWER_SUSPENDM | MUSB_POWER_RESUME; | ||
| 2172 | musb->context.power &= ~(MUSB_POWER_SUSPENDM | MUSB_POWER_RESUME); | ||
| 2173 | power |= musb->context.power; | ||
| 2174 | musb_writeb(musb_base, MUSB_POWER, power); | ||
| 2175 | |||
| 2165 | musb_writew(musb_base, MUSB_INTRTXE, musb->intrtxe); | 2176 | musb_writew(musb_base, MUSB_INTRTXE, musb->intrtxe); |
| 2166 | musb_writew(musb_base, MUSB_INTRRXE, musb->intrrxe); | 2177 | musb_writew(musb_base, MUSB_INTRRXE, musb->intrrxe); |
| 2167 | musb_writeb(musb_base, MUSB_INTRUSBE, musb->context.intrusbe); | 2178 | musb_writeb(musb_base, MUSB_INTRUSBE, musb->context.intrusbe); |
diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c index ed455724017b..abb38c3833ef 100644 --- a/drivers/usb/musb/musb_host.c +++ b/drivers/usb/musb/musb_host.c | |||
| @@ -1183,6 +1183,9 @@ irqreturn_t musb_h_ep0_irq(struct musb *musb) | |||
| 1183 | csr = MUSB_CSR0_H_STATUSPKT | 1183 | csr = MUSB_CSR0_H_STATUSPKT |
| 1184 | | MUSB_CSR0_TXPKTRDY; | 1184 | | MUSB_CSR0_TXPKTRDY; |
| 1185 | 1185 | ||
| 1186 | /* disable ping token in status phase */ | ||
| 1187 | csr |= MUSB_CSR0_H_DIS_PING; | ||
| 1188 | |||
| 1186 | /* flag status stage */ | 1189 | /* flag status stage */ |
| 1187 | musb->ep0_stage = MUSB_EP0_STATUS; | 1190 | musb->ep0_stage = MUSB_EP0_STATUS; |
| 1188 | 1191 | ||
diff --git a/drivers/usb/musb/musb_virthub.c b/drivers/usb/musb/musb_virthub.c index eb634433ef09..e2d2d8c9891b 100644 --- a/drivers/usb/musb/musb_virthub.c +++ b/drivers/usb/musb/musb_virthub.c | |||
| @@ -135,7 +135,8 @@ void musb_port_suspend(struct musb *musb, bool do_suspend) | |||
| 135 | 135 | ||
| 136 | /* later, GetPortStatus will stop RESUME signaling */ | 136 | /* later, GetPortStatus will stop RESUME signaling */ |
| 137 | musb->port1_status |= MUSB_PORT_STAT_RESUME; | 137 | musb->port1_status |= MUSB_PORT_STAT_RESUME; |
| 138 | schedule_delayed_work(&musb->finish_resume_work, 20); | 138 | schedule_delayed_work(&musb->finish_resume_work, |
| 139 | msecs_to_jiffies(20)); | ||
| 139 | } | 140 | } |
| 140 | } | 141 | } |
| 141 | 142 | ||
| @@ -158,7 +159,6 @@ void musb_port_reset(struct musb *musb, bool do_reset) | |||
| 158 | */ | 159 | */ |
| 159 | power = musb_readb(mbase, MUSB_POWER); | 160 | power = musb_readb(mbase, MUSB_POWER); |
| 160 | if (do_reset) { | 161 | if (do_reset) { |
| 161 | |||
| 162 | /* | 162 | /* |
| 163 | * If RESUME is set, we must make sure it stays minimum 20 ms. | 163 | * If RESUME is set, we must make sure it stays minimum 20 ms. |
| 164 | * Then we must clear RESUME and wait a bit to let musb start | 164 | * Then we must clear RESUME and wait a bit to let musb start |
| @@ -167,11 +167,22 @@ void musb_port_reset(struct musb *musb, bool do_reset) | |||
| 167 | * detected". | 167 | * detected". |
| 168 | */ | 168 | */ |
| 169 | if (power & MUSB_POWER_RESUME) { | 169 | if (power & MUSB_POWER_RESUME) { |
| 170 | while (time_before(jiffies, musb->rh_timer)) | 170 | long remain = (unsigned long) musb->rh_timer - jiffies; |
| 171 | msleep(1); | 171 | |
| 172 | if (musb->rh_timer > 0 && remain > 0) { | ||
| 173 | /* take into account the minimum delay after resume */ | ||
| 174 | schedule_delayed_work( | ||
| 175 | &musb->deassert_reset_work, remain); | ||
| 176 | return; | ||
| 177 | } | ||
| 178 | |||
| 172 | musb_writeb(mbase, MUSB_POWER, | 179 | musb_writeb(mbase, MUSB_POWER, |
| 173 | power & ~MUSB_POWER_RESUME); | 180 | power & ~MUSB_POWER_RESUME); |
| 174 | msleep(1); | 181 | |
| 182 | /* Give the core 1 ms to clear MUSB_POWER_RESUME */ | ||
| 183 | schedule_delayed_work(&musb->deassert_reset_work, | ||
| 184 | msecs_to_jiffies(1)); | ||
| 185 | return; | ||
| 175 | } | 186 | } |
| 176 | 187 | ||
| 177 | power &= 0xf0; | 188 | power &= 0xf0; |
| @@ -180,7 +191,8 @@ void musb_port_reset(struct musb *musb, bool do_reset) | |||
| 180 | 191 | ||
| 181 | musb->port1_status |= USB_PORT_STAT_RESET; | 192 | musb->port1_status |= USB_PORT_STAT_RESET; |
| 182 | musb->port1_status &= ~USB_PORT_STAT_ENABLE; | 193 | musb->port1_status &= ~USB_PORT_STAT_ENABLE; |
| 183 | schedule_delayed_work(&musb->deassert_reset_work, 50); | 194 | schedule_delayed_work(&musb->deassert_reset_work, |
| 195 | msecs_to_jiffies(50)); | ||
| 184 | } else { | 196 | } else { |
| 185 | dev_dbg(musb->controller, "root port reset stopped\n"); | 197 | dev_dbg(musb->controller, "root port reset stopped\n"); |
| 186 | musb_writeb(mbase, MUSB_POWER, | 198 | musb_writeb(mbase, MUSB_POWER, |
diff --git a/drivers/usb/musb/omap2430.c b/drivers/usb/musb/omap2430.c index 2a408cdaf7b2..8aa59a2c5eb2 100644 --- a/drivers/usb/musb/omap2430.c +++ b/drivers/usb/musb/omap2430.c | |||
| @@ -659,7 +659,6 @@ static int omap2430_runtime_suspend(struct device *dev) | |||
| 659 | OTG_INTERFSEL); | 659 | OTG_INTERFSEL); |
| 660 | 660 | ||
| 661 | omap2430_low_level_exit(musb); | 661 | omap2430_low_level_exit(musb); |
| 662 | phy_power_off(musb->phy); | ||
| 663 | } | 662 | } |
| 664 | 663 | ||
| 665 | return 0; | 664 | return 0; |
| @@ -674,7 +673,6 @@ static int omap2430_runtime_resume(struct device *dev) | |||
| 674 | omap2430_low_level_init(musb); | 673 | omap2430_low_level_init(musb); |
| 675 | musb_writel(musb->mregs, OTG_INTERFSEL, | 674 | musb_writel(musb->mregs, OTG_INTERFSEL, |
| 676 | musb->context.otg_interfsel); | 675 | musb->context.otg_interfsel); |
| 677 | phy_power_on(musb->phy); | ||
| 678 | } | 676 | } |
| 679 | 677 | ||
| 680 | return 0; | 678 | return 0; |
diff --git a/drivers/usb/phy/phy-msm-usb.c b/drivers/usb/phy/phy-msm-usb.c index 8546c8dccd51..d204f745ed05 100644 --- a/drivers/usb/phy/phy-msm-usb.c +++ b/drivers/usb/phy/phy-msm-usb.c | |||
| @@ -159,32 +159,6 @@ put_3p3: | |||
| 159 | return rc; | 159 | return rc; |
| 160 | } | 160 | } |
| 161 | 161 | ||
| 162 | #ifdef CONFIG_PM_SLEEP | ||
| 163 | #define USB_PHY_SUSP_DIG_VOL 500000 | ||
| 164 | static int msm_hsusb_config_vddcx(int high) | ||
| 165 | { | ||
| 166 | int max_vol = USB_PHY_VDD_DIG_VOL_MAX; | ||
| 167 | int min_vol; | ||
| 168 | int ret; | ||
| 169 | |||
| 170 | if (high) | ||
| 171 | min_vol = USB_PHY_VDD_DIG_VOL_MIN; | ||
| 172 | else | ||
| 173 | min_vol = USB_PHY_SUSP_DIG_VOL; | ||
| 174 | |||
| 175 | ret = regulator_set_voltage(hsusb_vddcx, min_vol, max_vol); | ||
| 176 | if (ret) { | ||
| 177 | pr_err("%s: unable to set the voltage for regulator " | ||
| 178 | "HSUSB_VDDCX\n", __func__); | ||
| 179 | return ret; | ||
| 180 | } | ||
| 181 | |||
| 182 | pr_debug("%s: min_vol:%d max_vol:%d\n", __func__, min_vol, max_vol); | ||
| 183 | |||
| 184 | return ret; | ||
| 185 | } | ||
| 186 | #endif | ||
| 187 | |||
| 188 | static int msm_hsusb_ldo_set_mode(int on) | 162 | static int msm_hsusb_ldo_set_mode(int on) |
| 189 | { | 163 | { |
| 190 | int ret = 0; | 164 | int ret = 0; |
| @@ -440,7 +414,32 @@ static int msm_otg_reset(struct usb_phy *phy) | |||
| 440 | #define PHY_SUSPEND_TIMEOUT_USEC (500 * 1000) | 414 | #define PHY_SUSPEND_TIMEOUT_USEC (500 * 1000) |
| 441 | #define PHY_RESUME_TIMEOUT_USEC (100 * 1000) | 415 | #define PHY_RESUME_TIMEOUT_USEC (100 * 1000) |
| 442 | 416 | ||
| 443 | #ifdef CONFIG_PM_SLEEP | 417 | #ifdef CONFIG_PM |
| 418 | |||
| 419 | #define USB_PHY_SUSP_DIG_VOL 500000 | ||
| 420 | static int msm_hsusb_config_vddcx(int high) | ||
| 421 | { | ||
| 422 | int max_vol = USB_PHY_VDD_DIG_VOL_MAX; | ||
| 423 | int min_vol; | ||
| 424 | int ret; | ||
| 425 | |||
| 426 | if (high) | ||
| 427 | min_vol = USB_PHY_VDD_DIG_VOL_MIN; | ||
| 428 | else | ||
| 429 | min_vol = USB_PHY_SUSP_DIG_VOL; | ||
| 430 | |||
| 431 | ret = regulator_set_voltage(hsusb_vddcx, min_vol, max_vol); | ||
| 432 | if (ret) { | ||
| 433 | pr_err("%s: unable to set the voltage for regulator " | ||
| 434 | "HSUSB_VDDCX\n", __func__); | ||
| 435 | return ret; | ||
| 436 | } | ||
| 437 | |||
| 438 | pr_debug("%s: min_vol:%d max_vol:%d\n", __func__, min_vol, max_vol); | ||
| 439 | |||
| 440 | return ret; | ||
| 441 | } | ||
| 442 | |||
| 444 | static int msm_otg_suspend(struct msm_otg *motg) | 443 | static int msm_otg_suspend(struct msm_otg *motg) |
| 445 | { | 444 | { |
| 446 | struct usb_phy *phy = &motg->phy; | 445 | struct usb_phy *phy = &motg->phy; |
| @@ -1733,22 +1732,18 @@ static int msm_otg_pm_resume(struct device *dev) | |||
| 1733 | } | 1732 | } |
| 1734 | #endif | 1733 | #endif |
| 1735 | 1734 | ||
| 1736 | #ifdef CONFIG_PM | ||
| 1737 | static const struct dev_pm_ops msm_otg_dev_pm_ops = { | 1735 | static const struct dev_pm_ops msm_otg_dev_pm_ops = { |
| 1738 | SET_SYSTEM_SLEEP_PM_OPS(msm_otg_pm_suspend, msm_otg_pm_resume) | 1736 | SET_SYSTEM_SLEEP_PM_OPS(msm_otg_pm_suspend, msm_otg_pm_resume) |
| 1739 | SET_RUNTIME_PM_OPS(msm_otg_runtime_suspend, msm_otg_runtime_resume, | 1737 | SET_RUNTIME_PM_OPS(msm_otg_runtime_suspend, msm_otg_runtime_resume, |
| 1740 | msm_otg_runtime_idle) | 1738 | msm_otg_runtime_idle) |
| 1741 | }; | 1739 | }; |
| 1742 | #endif | ||
| 1743 | 1740 | ||
| 1744 | static struct platform_driver msm_otg_driver = { | 1741 | static struct platform_driver msm_otg_driver = { |
| 1745 | .remove = msm_otg_remove, | 1742 | .remove = msm_otg_remove, |
| 1746 | .driver = { | 1743 | .driver = { |
| 1747 | .name = DRIVER_NAME, | 1744 | .name = DRIVER_NAME, |
| 1748 | .owner = THIS_MODULE, | 1745 | .owner = THIS_MODULE, |
| 1749 | #ifdef CONFIG_PM | ||
| 1750 | .pm = &msm_otg_dev_pm_ops, | 1746 | .pm = &msm_otg_dev_pm_ops, |
| 1751 | #endif | ||
| 1752 | }, | 1747 | }, |
| 1753 | }; | 1748 | }; |
| 1754 | 1749 | ||
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index ee1f00f03c43..44ab12986805 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
| @@ -907,6 +907,8 @@ static const struct usb_device_id id_table_combined[] = { | |||
| 907 | /* Crucible Devices */ | 907 | /* Crucible Devices */ |
| 908 | { USB_DEVICE(FTDI_VID, FTDI_CT_COMET_PID) }, | 908 | { USB_DEVICE(FTDI_VID, FTDI_CT_COMET_PID) }, |
| 909 | { USB_DEVICE(FTDI_VID, FTDI_Z3X_PID) }, | 909 | { USB_DEVICE(FTDI_VID, FTDI_Z3X_PID) }, |
| 910 | /* Cressi Devices */ | ||
| 911 | { USB_DEVICE(FTDI_VID, FTDI_CRESSI_PID) }, | ||
| 910 | { } /* Terminating entry */ | 912 | { } /* Terminating entry */ |
| 911 | }; | 913 | }; |
| 912 | 914 | ||
diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h index 1e2d369df86e..e599fbfcde5f 100644 --- a/drivers/usb/serial/ftdi_sio_ids.h +++ b/drivers/usb/serial/ftdi_sio_ids.h | |||
| @@ -1320,3 +1320,9 @@ | |||
| 1320 | * Manufacturer: Smart GSM Team | 1320 | * Manufacturer: Smart GSM Team |
| 1321 | */ | 1321 | */ |
| 1322 | #define FTDI_Z3X_PID 0x0011 | 1322 | #define FTDI_Z3X_PID 0x0011 |
| 1323 | |||
| 1324 | /* | ||
| 1325 | * Product: Cressi PC Interface | ||
| 1326 | * Manufacturer: Cressi | ||
| 1327 | */ | ||
| 1328 | #define FTDI_CRESSI_PID 0x87d0 | ||
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 216d20affba8..68fc9fe65936 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
| @@ -1526,7 +1526,8 @@ static const struct usb_device_id option_ids[] = { | |||
| 1526 | /* Cinterion */ | 1526 | /* Cinterion */ |
| 1527 | { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_EU3_E) }, | 1527 | { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_EU3_E) }, |
| 1528 | { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_EU3_P) }, | 1528 | { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_EU3_P) }, |
| 1529 | { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_PH8) }, | 1529 | { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_PH8), |
| 1530 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | ||
| 1530 | { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_AHXX) }, | 1531 | { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_AHXX) }, |
| 1531 | { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_PLXX), | 1532 | { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_PLXX), |
| 1532 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | 1533 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c index 4fb7a8f83c8a..54af4e933695 100644 --- a/drivers/vfio/vfio_iommu_type1.c +++ b/drivers/vfio/vfio_iommu_type1.c | |||
| @@ -186,12 +186,12 @@ static bool is_invalid_reserved_pfn(unsigned long pfn) | |||
| 186 | if (pfn_valid(pfn)) { | 186 | if (pfn_valid(pfn)) { |
| 187 | bool reserved; | 187 | bool reserved; |
| 188 | struct page *tail = pfn_to_page(pfn); | 188 | struct page *tail = pfn_to_page(pfn); |
| 189 | struct page *head = compound_trans_head(tail); | 189 | struct page *head = compound_head(tail); |
| 190 | reserved = !!(PageReserved(head)); | 190 | reserved = !!(PageReserved(head)); |
| 191 | if (head != tail) { | 191 | if (head != tail) { |
| 192 | /* | 192 | /* |
| 193 | * "head" is not a dangling pointer | 193 | * "head" is not a dangling pointer |
| 194 | * (compound_trans_head takes care of that) | 194 | * (compound_head takes care of that) |
| 195 | * but the hugepage may have been split | 195 | * but the hugepage may have been split |
| 196 | * from under us (and we may not hold a | 196 | * from under us (and we may not hold a |
| 197 | * reference count on the head page so it can | 197 | * reference count on the head page so it can |
diff --git a/drivers/vhost/scsi.c b/drivers/vhost/scsi.c index 0a025b8e2a12..e48d4a672580 100644 --- a/drivers/vhost/scsi.c +++ b/drivers/vhost/scsi.c | |||
| @@ -1001,6 +1001,12 @@ vhost_scsi_handle_vq(struct vhost_scsi *vs, struct vhost_virtqueue *vq) | |||
| 1001 | break; | 1001 | break; |
| 1002 | } | 1002 | } |
| 1003 | 1003 | ||
| 1004 | /* virtio-scsi spec requires byte 0 of the lun to be 1 */ | ||
| 1005 | if (unlikely(v_req.lun[0] != 1)) { | ||
| 1006 | vhost_scsi_send_bad_target(vs, vq, head, out); | ||
| 1007 | continue; | ||
| 1008 | } | ||
| 1009 | |||
| 1004 | /* Extract the tpgt */ | 1010 | /* Extract the tpgt */ |
| 1005 | target = v_req.lun[1]; | 1011 | target = v_req.lun[1]; |
| 1006 | tpg = ACCESS_ONCE(vs_tpg[target]); | 1012 | tpg = ACCESS_ONCE(vs_tpg[target]); |
diff --git a/drivers/watchdog/w83697hf_wdt.c b/drivers/watchdog/w83697hf_wdt.c index aaf2995d37f4..68b45fc9ba6a 100644 --- a/drivers/watchdog/w83697hf_wdt.c +++ b/drivers/watchdog/w83697hf_wdt.c | |||
| @@ -402,7 +402,7 @@ static int __init wdt_init(void) | |||
| 402 | 402 | ||
| 403 | if (!found) { | 403 | if (!found) { |
| 404 | pr_err("No W83697HF/HG could be found\n"); | 404 | pr_err("No W83697HF/HG could be found\n"); |
| 405 | ret = -EIO; | 405 | ret = -ENODEV; |
| 406 | goto out; | 406 | goto out; |
| 407 | } | 407 | } |
| 408 | 408 | ||
diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index e0259a163f98..d754e3cf99a8 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c | |||
| @@ -40,18 +40,13 @@ | |||
| 40 | struct wb_writeback_work { | 40 | struct wb_writeback_work { |
| 41 | long nr_pages; | 41 | long nr_pages; |
| 42 | struct super_block *sb; | 42 | struct super_block *sb; |
| 43 | /* | 43 | unsigned long *older_than_this; |
| 44 | * Write only inodes dirtied before this time. Don't forget to set | ||
| 45 | * older_than_this_is_set when you set this. | ||
| 46 | */ | ||
| 47 | unsigned long older_than_this; | ||
| 48 | enum writeback_sync_modes sync_mode; | 44 | enum writeback_sync_modes sync_mode; |
| 49 | unsigned int tagged_writepages:1; | 45 | unsigned int tagged_writepages:1; |
| 50 | unsigned int for_kupdate:1; | 46 | unsigned int for_kupdate:1; |
| 51 | unsigned int range_cyclic:1; | 47 | unsigned int range_cyclic:1; |
| 52 | unsigned int for_background:1; | 48 | unsigned int for_background:1; |
| 53 | unsigned int for_sync:1; /* sync(2) WB_SYNC_ALL writeback */ | 49 | unsigned int for_sync:1; /* sync(2) WB_SYNC_ALL writeback */ |
| 54 | unsigned int older_than_this_is_set:1; | ||
| 55 | enum wb_reason reason; /* why was writeback initiated? */ | 50 | enum wb_reason reason; /* why was writeback initiated? */ |
| 56 | 51 | ||
| 57 | struct list_head list; /* pending work list */ | 52 | struct list_head list; /* pending work list */ |
| @@ -252,10 +247,10 @@ static int move_expired_inodes(struct list_head *delaying_queue, | |||
| 252 | int do_sb_sort = 0; | 247 | int do_sb_sort = 0; |
| 253 | int moved = 0; | 248 | int moved = 0; |
| 254 | 249 | ||
| 255 | WARN_ON_ONCE(!work->older_than_this_is_set); | ||
| 256 | while (!list_empty(delaying_queue)) { | 250 | while (!list_empty(delaying_queue)) { |
| 257 | inode = wb_inode(delaying_queue->prev); | 251 | inode = wb_inode(delaying_queue->prev); |
| 258 | if (inode_dirtied_after(inode, work->older_than_this)) | 252 | if (work->older_than_this && |
| 253 | inode_dirtied_after(inode, *work->older_than_this)) | ||
| 259 | break; | 254 | break; |
| 260 | list_move(&inode->i_wb_list, &tmp); | 255 | list_move(&inode->i_wb_list, &tmp); |
| 261 | moved++; | 256 | moved++; |
| @@ -742,8 +737,6 @@ static long writeback_inodes_wb(struct bdi_writeback *wb, long nr_pages, | |||
| 742 | .sync_mode = WB_SYNC_NONE, | 737 | .sync_mode = WB_SYNC_NONE, |
| 743 | .range_cyclic = 1, | 738 | .range_cyclic = 1, |
| 744 | .reason = reason, | 739 | .reason = reason, |
| 745 | .older_than_this = jiffies, | ||
| 746 | .older_than_this_is_set = 1, | ||
| 747 | }; | 740 | }; |
| 748 | 741 | ||
| 749 | spin_lock(&wb->list_lock); | 742 | spin_lock(&wb->list_lock); |
| @@ -802,13 +795,12 @@ static long wb_writeback(struct bdi_writeback *wb, | |||
| 802 | { | 795 | { |
| 803 | unsigned long wb_start = jiffies; | 796 | unsigned long wb_start = jiffies; |
| 804 | long nr_pages = work->nr_pages; | 797 | long nr_pages = work->nr_pages; |
| 798 | unsigned long oldest_jif; | ||
| 805 | struct inode *inode; | 799 | struct inode *inode; |
| 806 | long progress; | 800 | long progress; |
| 807 | 801 | ||
| 808 | if (!work->older_than_this_is_set) { | 802 | oldest_jif = jiffies; |
| 809 | work->older_than_this = jiffies; | 803 | work->older_than_this = &oldest_jif; |
| 810 | work->older_than_this_is_set = 1; | ||
| 811 | } | ||
| 812 | 804 | ||
| 813 | spin_lock(&wb->list_lock); | 805 | spin_lock(&wb->list_lock); |
| 814 | for (;;) { | 806 | for (;;) { |
| @@ -842,10 +834,10 @@ static long wb_writeback(struct bdi_writeback *wb, | |||
| 842 | * safe. | 834 | * safe. |
| 843 | */ | 835 | */ |
| 844 | if (work->for_kupdate) { | 836 | if (work->for_kupdate) { |
| 845 | work->older_than_this = jiffies - | 837 | oldest_jif = jiffies - |
| 846 | msecs_to_jiffies(dirty_expire_interval * 10); | 838 | msecs_to_jiffies(dirty_expire_interval * 10); |
| 847 | } else if (work->for_background) | 839 | } else if (work->for_background) |
| 848 | work->older_than_this = jiffies; | 840 | oldest_jif = jiffies; |
| 849 | 841 | ||
| 850 | trace_writeback_start(wb->bdi, work); | 842 | trace_writeback_start(wb->bdi, work); |
| 851 | if (list_empty(&wb->b_io)) | 843 | if (list_empty(&wb->b_io)) |
| @@ -1357,21 +1349,18 @@ EXPORT_SYMBOL(try_to_writeback_inodes_sb); | |||
| 1357 | 1349 | ||
| 1358 | /** | 1350 | /** |
| 1359 | * sync_inodes_sb - sync sb inode pages | 1351 | * sync_inodes_sb - sync sb inode pages |
| 1360 | * @sb: the superblock | 1352 | * @sb: the superblock |
| 1361 | * @older_than_this: timestamp | ||
| 1362 | * | 1353 | * |
| 1363 | * This function writes and waits on any dirty inode belonging to this | 1354 | * This function writes and waits on any dirty inode belonging to this |
| 1364 | * superblock that has been dirtied before given timestamp. | 1355 | * super_block. |
| 1365 | */ | 1356 | */ |
| 1366 | void sync_inodes_sb(struct super_block *sb, unsigned long older_than_this) | 1357 | void sync_inodes_sb(struct super_block *sb) |
| 1367 | { | 1358 | { |
| 1368 | DECLARE_COMPLETION_ONSTACK(done); | 1359 | DECLARE_COMPLETION_ONSTACK(done); |
| 1369 | struct wb_writeback_work work = { | 1360 | struct wb_writeback_work work = { |
| 1370 | .sb = sb, | 1361 | .sb = sb, |
| 1371 | .sync_mode = WB_SYNC_ALL, | 1362 | .sync_mode = WB_SYNC_ALL, |
| 1372 | .nr_pages = LONG_MAX, | 1363 | .nr_pages = LONG_MAX, |
| 1373 | .older_than_this = older_than_this, | ||
| 1374 | .older_than_this_is_set = 1, | ||
| 1375 | .range_cyclic = 0, | 1364 | .range_cyclic = 0, |
| 1376 | .done = &done, | 1365 | .done = &done, |
| 1377 | .reason = WB_REASON_SYNC, | 1366 | .reason = WB_REASON_SYNC, |
diff --git a/fs/hfsplus/options.c b/fs/hfsplus/options.c index 968eab5bc1f5..68537e8b7a09 100644 --- a/fs/hfsplus/options.c +++ b/fs/hfsplus/options.c | |||
| @@ -75,7 +75,7 @@ int hfsplus_parse_options_remount(char *input, int *force) | |||
| 75 | int token; | 75 | int token; |
| 76 | 76 | ||
| 77 | if (!input) | 77 | if (!input) |
| 78 | return 0; | 78 | return 1; |
| 79 | 79 | ||
| 80 | while ((p = strsep(&input, ",")) != NULL) { | 80 | while ((p = strsep(&input, ",")) != NULL) { |
| 81 | if (!*p) | 81 | if (!*p) |
diff --git a/fs/kernfs/mount.c b/fs/kernfs/mount.c index 0d6ce895a9ee..0f4152defe7b 100644 --- a/fs/kernfs/mount.c +++ b/fs/kernfs/mount.c | |||
| @@ -94,6 +94,7 @@ const void *kernfs_super_ns(struct super_block *sb) | |||
| 94 | * @fs_type: file_system_type of the fs being mounted | 94 | * @fs_type: file_system_type of the fs being mounted |
| 95 | * @flags: mount flags specified for the mount | 95 | * @flags: mount flags specified for the mount |
| 96 | * @root: kernfs_root of the hierarchy being mounted | 96 | * @root: kernfs_root of the hierarchy being mounted |
| 97 | * @new_sb_created: tell the caller if we allocated a new superblock | ||
| 97 | * @ns: optional namespace tag of the mount | 98 | * @ns: optional namespace tag of the mount |
| 98 | * | 99 | * |
| 99 | * This is to be called from each kernfs user's file_system_type->mount() | 100 | * This is to be called from each kernfs user's file_system_type->mount() |
| @@ -104,7 +105,8 @@ const void *kernfs_super_ns(struct super_block *sb) | |||
| 104 | * The return value can be passed to the vfs layer verbatim. | 105 | * The return value can be passed to the vfs layer verbatim. |
| 105 | */ | 106 | */ |
| 106 | struct dentry *kernfs_mount_ns(struct file_system_type *fs_type, int flags, | 107 | struct dentry *kernfs_mount_ns(struct file_system_type *fs_type, int flags, |
| 107 | struct kernfs_root *root, const void *ns) | 108 | struct kernfs_root *root, bool *new_sb_created, |
| 109 | const void *ns) | ||
| 108 | { | 110 | { |
| 109 | struct super_block *sb; | 111 | struct super_block *sb; |
| 110 | struct kernfs_super_info *info; | 112 | struct kernfs_super_info *info; |
| @@ -122,6 +124,10 @@ struct dentry *kernfs_mount_ns(struct file_system_type *fs_type, int flags, | |||
| 122 | kfree(info); | 124 | kfree(info); |
| 123 | if (IS_ERR(sb)) | 125 | if (IS_ERR(sb)) |
| 124 | return ERR_CAST(sb); | 126 | return ERR_CAST(sb); |
| 127 | |||
| 128 | if (new_sb_created) | ||
| 129 | *new_sb_created = !sb->s_root; | ||
| 130 | |||
| 125 | if (!sb->s_root) { | 131 | if (!sb->s_root) { |
| 126 | error = kernfs_fill_super(sb); | 132 | error = kernfs_fill_super(sb); |
| 127 | if (error) { | 133 | if (error) { |
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index 28a0a3cbd3b7..360114ae8b82 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c | |||
| @@ -164,17 +164,16 @@ static void nfs_zap_caches_locked(struct inode *inode) | |||
| 164 | if (S_ISREG(mode) || S_ISDIR(mode) || S_ISLNK(mode)) { | 164 | if (S_ISREG(mode) || S_ISDIR(mode) || S_ISLNK(mode)) { |
| 165 | nfs_fscache_invalidate(inode); | 165 | nfs_fscache_invalidate(inode); |
| 166 | nfsi->cache_validity |= NFS_INO_INVALID_ATTR | 166 | nfsi->cache_validity |= NFS_INO_INVALID_ATTR |
| 167 | | NFS_INO_INVALID_LABEL | ||
| 168 | | NFS_INO_INVALID_DATA | 167 | | NFS_INO_INVALID_DATA |
| 169 | | NFS_INO_INVALID_ACCESS | 168 | | NFS_INO_INVALID_ACCESS |
| 170 | | NFS_INO_INVALID_ACL | 169 | | NFS_INO_INVALID_ACL |
| 171 | | NFS_INO_REVAL_PAGECACHE; | 170 | | NFS_INO_REVAL_PAGECACHE; |
| 172 | } else | 171 | } else |
| 173 | nfsi->cache_validity |= NFS_INO_INVALID_ATTR | 172 | nfsi->cache_validity |= NFS_INO_INVALID_ATTR |
| 174 | | NFS_INO_INVALID_LABEL | ||
| 175 | | NFS_INO_INVALID_ACCESS | 173 | | NFS_INO_INVALID_ACCESS |
| 176 | | NFS_INO_INVALID_ACL | 174 | | NFS_INO_INVALID_ACL |
| 177 | | NFS_INO_REVAL_PAGECACHE; | 175 | | NFS_INO_REVAL_PAGECACHE; |
| 176 | nfs_zap_label_cache_locked(nfsi); | ||
| 178 | } | 177 | } |
| 179 | 178 | ||
| 180 | void nfs_zap_caches(struct inode *inode) | 179 | void nfs_zap_caches(struct inode *inode) |
| @@ -266,6 +265,13 @@ nfs_init_locked(struct inode *inode, void *opaque) | |||
| 266 | } | 265 | } |
| 267 | 266 | ||
| 268 | #ifdef CONFIG_NFS_V4_SECURITY_LABEL | 267 | #ifdef CONFIG_NFS_V4_SECURITY_LABEL |
| 268 | static void nfs_clear_label_invalid(struct inode *inode) | ||
| 269 | { | ||
| 270 | spin_lock(&inode->i_lock); | ||
| 271 | NFS_I(inode)->cache_validity &= ~NFS_INO_INVALID_LABEL; | ||
| 272 | spin_unlock(&inode->i_lock); | ||
| 273 | } | ||
| 274 | |||
| 269 | void nfs_setsecurity(struct inode *inode, struct nfs_fattr *fattr, | 275 | void nfs_setsecurity(struct inode *inode, struct nfs_fattr *fattr, |
| 270 | struct nfs4_label *label) | 276 | struct nfs4_label *label) |
| 271 | { | 277 | { |
| @@ -283,6 +289,7 @@ void nfs_setsecurity(struct inode *inode, struct nfs_fattr *fattr, | |||
| 283 | __func__, | 289 | __func__, |
| 284 | (char *)label->label, | 290 | (char *)label->label, |
| 285 | label->len, error); | 291 | label->len, error); |
| 292 | nfs_clear_label_invalid(inode); | ||
| 286 | } | 293 | } |
| 287 | } | 294 | } |
| 288 | 295 | ||
| @@ -1648,7 +1655,7 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr) | |||
| 1648 | inode->i_blocks = fattr->du.nfs2.blocks; | 1655 | inode->i_blocks = fattr->du.nfs2.blocks; |
| 1649 | 1656 | ||
| 1650 | /* Update attrtimeo value if we're out of the unstable period */ | 1657 | /* Update attrtimeo value if we're out of the unstable period */ |
| 1651 | if (invalid & (NFS_INO_INVALID_ATTR|NFS_INO_INVALID_LABEL)) { | 1658 | if (invalid & NFS_INO_INVALID_ATTR) { |
| 1652 | nfs_inc_stats(inode, NFSIOS_ATTRINVALIDATE); | 1659 | nfs_inc_stats(inode, NFSIOS_ATTRINVALIDATE); |
| 1653 | nfsi->attrtimeo = NFS_MINATTRTIMEO(inode); | 1660 | nfsi->attrtimeo = NFS_MINATTRTIMEO(inode); |
| 1654 | nfsi->attrtimeo_timestamp = now; | 1661 | nfsi->attrtimeo_timestamp = now; |
| @@ -1661,7 +1668,6 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr) | |||
| 1661 | } | 1668 | } |
| 1662 | } | 1669 | } |
| 1663 | invalid &= ~NFS_INO_INVALID_ATTR; | 1670 | invalid &= ~NFS_INO_INVALID_ATTR; |
| 1664 | invalid &= ~NFS_INO_INVALID_LABEL; | ||
| 1665 | /* Don't invalidate the data if we were to blame */ | 1671 | /* Don't invalidate the data if we were to blame */ |
| 1666 | if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) | 1672 | if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) |
| 1667 | || S_ISLNK(inode->i_mode))) | 1673 | || S_ISLNK(inode->i_mode))) |
diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h index 8b5cc04a8611..b46cf5a67329 100644 --- a/fs/nfs/internal.h +++ b/fs/nfs/internal.h | |||
| @@ -176,7 +176,8 @@ extern struct nfs_server *nfs4_create_server( | |||
| 176 | extern struct nfs_server *nfs4_create_referral_server(struct nfs_clone_mount *, | 176 | extern struct nfs_server *nfs4_create_referral_server(struct nfs_clone_mount *, |
| 177 | struct nfs_fh *); | 177 | struct nfs_fh *); |
| 178 | extern int nfs4_update_server(struct nfs_server *server, const char *hostname, | 178 | extern int nfs4_update_server(struct nfs_server *server, const char *hostname, |
| 179 | struct sockaddr *sap, size_t salen); | 179 | struct sockaddr *sap, size_t salen, |
| 180 | struct net *net); | ||
| 180 | extern void nfs_free_server(struct nfs_server *server); | 181 | extern void nfs_free_server(struct nfs_server *server); |
| 181 | extern struct nfs_server *nfs_clone_server(struct nfs_server *, | 182 | extern struct nfs_server *nfs_clone_server(struct nfs_server *, |
| 182 | struct nfs_fh *, | 183 | struct nfs_fh *, |
| @@ -279,9 +280,18 @@ static inline void nfs4_label_free(struct nfs4_label *label) | |||
| 279 | } | 280 | } |
| 280 | return; | 281 | return; |
| 281 | } | 282 | } |
| 283 | |||
| 284 | static inline void nfs_zap_label_cache_locked(struct nfs_inode *nfsi) | ||
| 285 | { | ||
| 286 | if (nfs_server_capable(&nfsi->vfs_inode, NFS_CAP_SECURITY_LABEL)) | ||
| 287 | nfsi->cache_validity |= NFS_INO_INVALID_LABEL; | ||
| 288 | } | ||
| 282 | #else | 289 | #else |
| 283 | static inline struct nfs4_label *nfs4_label_alloc(struct nfs_server *server, gfp_t flags) { return NULL; } | 290 | static inline struct nfs4_label *nfs4_label_alloc(struct nfs_server *server, gfp_t flags) { return NULL; } |
| 284 | static inline void nfs4_label_free(void *label) {} | 291 | static inline void nfs4_label_free(void *label) {} |
| 292 | static inline void nfs_zap_label_cache_locked(struct nfs_inode *nfsi) | ||
| 293 | { | ||
| 294 | } | ||
| 285 | #endif /* CONFIG_NFS_V4_SECURITY_LABEL */ | 295 | #endif /* CONFIG_NFS_V4_SECURITY_LABEL */ |
| 286 | 296 | ||
| 287 | /* proc.c */ | 297 | /* proc.c */ |
diff --git a/fs/nfs/nfs3proc.c b/fs/nfs/nfs3proc.c index aa9bc973f36a..a462ef0fb5d6 100644 --- a/fs/nfs/nfs3proc.c +++ b/fs/nfs/nfs3proc.c | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | #include <linux/lockd/bind.h> | 18 | #include <linux/lockd/bind.h> |
| 19 | #include <linux/nfs_mount.h> | 19 | #include <linux/nfs_mount.h> |
| 20 | #include <linux/freezer.h> | 20 | #include <linux/freezer.h> |
| 21 | #include <linux/xattr.h> | ||
| 21 | 22 | ||
| 22 | #include "iostat.h" | 23 | #include "iostat.h" |
| 23 | #include "internal.h" | 24 | #include "internal.h" |
diff --git a/fs/nfs/nfs4client.c b/fs/nfs/nfs4client.c index 860ad26a5590..0e46d3d1b6cc 100644 --- a/fs/nfs/nfs4client.c +++ b/fs/nfs/nfs4client.c | |||
| @@ -1135,6 +1135,7 @@ static int nfs_probe_destination(struct nfs_server *server) | |||
| 1135 | * @hostname: new end-point's hostname | 1135 | * @hostname: new end-point's hostname |
| 1136 | * @sap: new end-point's socket address | 1136 | * @sap: new end-point's socket address |
| 1137 | * @salen: size of "sap" | 1137 | * @salen: size of "sap" |
| 1138 | * @net: net namespace | ||
| 1138 | * | 1139 | * |
| 1139 | * The nfs_server must be quiescent before this function is invoked. | 1140 | * The nfs_server must be quiescent before this function is invoked. |
| 1140 | * Either its session is drained (NFSv4.1+), or its transport is | 1141 | * Either its session is drained (NFSv4.1+), or its transport is |
| @@ -1143,13 +1144,13 @@ static int nfs_probe_destination(struct nfs_server *server) | |||
| 1143 | * Returns zero on success, or a negative errno value. | 1144 | * Returns zero on success, or a negative errno value. |
| 1144 | */ | 1145 | */ |
| 1145 | int nfs4_update_server(struct nfs_server *server, const char *hostname, | 1146 | int nfs4_update_server(struct nfs_server *server, const char *hostname, |
| 1146 | struct sockaddr *sap, size_t salen) | 1147 | struct sockaddr *sap, size_t salen, struct net *net) |
| 1147 | { | 1148 | { |
| 1148 | struct nfs_client *clp = server->nfs_client; | 1149 | struct nfs_client *clp = server->nfs_client; |
| 1149 | struct rpc_clnt *clnt = server->client; | 1150 | struct rpc_clnt *clnt = server->client; |
| 1150 | struct xprt_create xargs = { | 1151 | struct xprt_create xargs = { |
| 1151 | .ident = clp->cl_proto, | 1152 | .ident = clp->cl_proto, |
| 1152 | .net = &init_net, | 1153 | .net = net, |
| 1153 | .dstaddr = sap, | 1154 | .dstaddr = sap, |
| 1154 | .addrlen = salen, | 1155 | .addrlen = salen, |
| 1155 | .servername = hostname, | 1156 | .servername = hostname, |
| @@ -1189,7 +1190,7 @@ int nfs4_update_server(struct nfs_server *server, const char *hostname, | |||
| 1189 | error = nfs4_set_client(server, hostname, sap, salen, buf, | 1190 | error = nfs4_set_client(server, hostname, sap, salen, buf, |
| 1190 | clp->cl_rpcclient->cl_auth->au_flavor, | 1191 | clp->cl_rpcclient->cl_auth->au_flavor, |
| 1191 | clp->cl_proto, clnt->cl_timeout, | 1192 | clp->cl_proto, clnt->cl_timeout, |
| 1192 | clp->cl_minorversion, clp->cl_net); | 1193 | clp->cl_minorversion, net); |
| 1193 | nfs_put_client(clp); | 1194 | nfs_put_client(clp); |
| 1194 | if (error != 0) { | 1195 | if (error != 0) { |
| 1195 | nfs_server_insert_lists(server); | 1196 | nfs_server_insert_lists(server); |
diff --git a/fs/nfs/nfs4namespace.c b/fs/nfs/nfs4namespace.c index 4e7f05d3e9db..3d5dbf80d46a 100644 --- a/fs/nfs/nfs4namespace.c +++ b/fs/nfs/nfs4namespace.c | |||
| @@ -121,9 +121,8 @@ static int nfs4_validate_fspath(struct dentry *dentry, | |||
| 121 | } | 121 | } |
| 122 | 122 | ||
| 123 | static size_t nfs_parse_server_name(char *string, size_t len, | 123 | static size_t nfs_parse_server_name(char *string, size_t len, |
| 124 | struct sockaddr *sa, size_t salen, struct nfs_server *server) | 124 | struct sockaddr *sa, size_t salen, struct net *net) |
| 125 | { | 125 | { |
| 126 | struct net *net = rpc_net_ns(server->client); | ||
| 127 | ssize_t ret; | 126 | ssize_t ret; |
| 128 | 127 | ||
| 129 | ret = rpc_pton(net, string, len, sa, salen); | 128 | ret = rpc_pton(net, string, len, sa, salen); |
| @@ -223,6 +222,7 @@ static struct vfsmount *try_location(struct nfs_clone_mount *mountdata, | |||
| 223 | const struct nfs4_fs_location *location) | 222 | const struct nfs4_fs_location *location) |
| 224 | { | 223 | { |
| 225 | const size_t addr_bufsize = sizeof(struct sockaddr_storage); | 224 | const size_t addr_bufsize = sizeof(struct sockaddr_storage); |
| 225 | struct net *net = rpc_net_ns(NFS_SB(mountdata->sb)->client); | ||
| 226 | struct vfsmount *mnt = ERR_PTR(-ENOENT); | 226 | struct vfsmount *mnt = ERR_PTR(-ENOENT); |
| 227 | char *mnt_path; | 227 | char *mnt_path; |
| 228 | unsigned int maxbuflen; | 228 | unsigned int maxbuflen; |
| @@ -248,8 +248,7 @@ static struct vfsmount *try_location(struct nfs_clone_mount *mountdata, | |||
| 248 | continue; | 248 | continue; |
| 249 | 249 | ||
| 250 | mountdata->addrlen = nfs_parse_server_name(buf->data, buf->len, | 250 | mountdata->addrlen = nfs_parse_server_name(buf->data, buf->len, |
| 251 | mountdata->addr, addr_bufsize, | 251 | mountdata->addr, addr_bufsize, net); |
| 252 | NFS_SB(mountdata->sb)); | ||
| 253 | if (mountdata->addrlen == 0) | 252 | if (mountdata->addrlen == 0) |
| 254 | continue; | 253 | continue; |
| 255 | 254 | ||
| @@ -419,6 +418,7 @@ static int nfs4_try_replacing_one_location(struct nfs_server *server, | |||
| 419 | const struct nfs4_fs_location *location) | 418 | const struct nfs4_fs_location *location) |
| 420 | { | 419 | { |
| 421 | const size_t addr_bufsize = sizeof(struct sockaddr_storage); | 420 | const size_t addr_bufsize = sizeof(struct sockaddr_storage); |
| 421 | struct net *net = rpc_net_ns(server->client); | ||
| 422 | struct sockaddr *sap; | 422 | struct sockaddr *sap; |
| 423 | unsigned int s; | 423 | unsigned int s; |
| 424 | size_t salen; | 424 | size_t salen; |
| @@ -440,7 +440,7 @@ static int nfs4_try_replacing_one_location(struct nfs_server *server, | |||
| 440 | continue; | 440 | continue; |
| 441 | 441 | ||
| 442 | salen = nfs_parse_server_name(buf->data, buf->len, | 442 | salen = nfs_parse_server_name(buf->data, buf->len, |
| 443 | sap, addr_bufsize, server); | 443 | sap, addr_bufsize, net); |
| 444 | if (salen == 0) | 444 | if (salen == 0) |
| 445 | continue; | 445 | continue; |
| 446 | rpc_set_port(sap, NFS_PORT); | 446 | rpc_set_port(sap, NFS_PORT); |
| @@ -450,7 +450,7 @@ static int nfs4_try_replacing_one_location(struct nfs_server *server, | |||
| 450 | if (hostname == NULL) | 450 | if (hostname == NULL) |
| 451 | break; | 451 | break; |
| 452 | 452 | ||
| 453 | error = nfs4_update_server(server, hostname, sap, salen); | 453 | error = nfs4_update_server(server, hostname, sap, salen, net); |
| 454 | kfree(hostname); | 454 | kfree(hostname); |
| 455 | if (error == 0) | 455 | if (error == 0) |
| 456 | break; | 456 | break; |
diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c index e5be72518bd7..e1a47217c05e 100644 --- a/fs/nfs/nfs4state.c +++ b/fs/nfs/nfs4state.c | |||
| @@ -1015,8 +1015,11 @@ int nfs4_select_rw_stateid(nfs4_stateid *dst, struct nfs4_state *state, | |||
| 1015 | if (ret == -EIO) | 1015 | if (ret == -EIO) |
| 1016 | /* A lost lock - don't even consider delegations */ | 1016 | /* A lost lock - don't even consider delegations */ |
| 1017 | goto out; | 1017 | goto out; |
| 1018 | if (nfs4_copy_delegation_stateid(dst, state->inode, fmode)) | 1018 | /* returns true if delegation stateid found and copied */ |
| 1019 | if (nfs4_copy_delegation_stateid(dst, state->inode, fmode)) { | ||
| 1020 | ret = 0; | ||
| 1019 | goto out; | 1021 | goto out; |
| 1022 | } | ||
| 1020 | if (ret != -ENOENT) | 1023 | if (ret != -ENOENT) |
| 1021 | /* nfs4_copy_delegation_stateid() didn't over-write | 1024 | /* nfs4_copy_delegation_stateid() didn't over-write |
| 1022 | * dst, so it still has the lock stateid which we now | 1025 | * dst, so it still has the lock stateid which we now |
diff --git a/fs/notify/dnotify/dnotify.c b/fs/notify/dnotify/dnotify.c index 0b9ff4395e6a..abc8cbcfe90e 100644 --- a/fs/notify/dnotify/dnotify.c +++ b/fs/notify/dnotify/dnotify.c | |||
| @@ -86,7 +86,7 @@ static int dnotify_handle_event(struct fsnotify_group *group, | |||
| 86 | struct fsnotify_mark *inode_mark, | 86 | struct fsnotify_mark *inode_mark, |
| 87 | struct fsnotify_mark *vfsmount_mark, | 87 | struct fsnotify_mark *vfsmount_mark, |
| 88 | u32 mask, void *data, int data_type, | 88 | u32 mask, void *data, int data_type, |
| 89 | const unsigned char *file_name) | 89 | const unsigned char *file_name, u32 cookie) |
| 90 | { | 90 | { |
| 91 | struct dnotify_mark *dn_mark; | 91 | struct dnotify_mark *dn_mark; |
| 92 | struct dnotify_struct *dn; | 92 | struct dnotify_struct *dn; |
diff --git a/fs/notify/fanotify/fanotify.c b/fs/notify/fanotify/fanotify.c index 0e792f5e3147..dc638f786d5c 100644 --- a/fs/notify/fanotify/fanotify.c +++ b/fs/notify/fanotify/fanotify.c | |||
| @@ -147,7 +147,7 @@ static int fanotify_handle_event(struct fsnotify_group *group, | |||
| 147 | struct fsnotify_mark *inode_mark, | 147 | struct fsnotify_mark *inode_mark, |
| 148 | struct fsnotify_mark *fanotify_mark, | 148 | struct fsnotify_mark *fanotify_mark, |
| 149 | u32 mask, void *data, int data_type, | 149 | u32 mask, void *data, int data_type, |
| 150 | const unsigned char *file_name) | 150 | const unsigned char *file_name, u32 cookie) |
| 151 | { | 151 | { |
| 152 | int ret = 0; | 152 | int ret = 0; |
| 153 | struct fanotify_event_info *event; | 153 | struct fanotify_event_info *event; |
| @@ -192,10 +192,12 @@ static int fanotify_handle_event(struct fsnotify_group *group, | |||
| 192 | 192 | ||
| 193 | ret = fsnotify_add_notify_event(group, fsn_event, fanotify_merge); | 193 | ret = fsnotify_add_notify_event(group, fsn_event, fanotify_merge); |
| 194 | if (ret) { | 194 | if (ret) { |
| 195 | BUG_ON(mask & FAN_ALL_PERM_EVENTS); | 195 | /* Permission events shouldn't be merged */ |
| 196 | BUG_ON(ret == 1 && mask & FAN_ALL_PERM_EVENTS); | ||
| 196 | /* Our event wasn't used in the end. Free it. */ | 197 | /* Our event wasn't used in the end. Free it. */ |
| 197 | fsnotify_destroy_event(group, fsn_event); | 198 | fsnotify_destroy_event(group, fsn_event); |
| 198 | ret = 0; | 199 | |
| 200 | return 0; | ||
| 199 | } | 201 | } |
| 200 | 202 | ||
| 201 | #ifdef CONFIG_FANOTIFY_ACCESS_PERMISSIONS | 203 | #ifdef CONFIG_FANOTIFY_ACCESS_PERMISSIONS |
diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c index b6175fa11bf8..287a22c04149 100644 --- a/fs/notify/fanotify/fanotify_user.c +++ b/fs/notify/fanotify/fanotify_user.c | |||
| @@ -698,6 +698,7 @@ SYSCALL_DEFINE2(fanotify_init, unsigned int, flags, unsigned int, event_f_flags) | |||
| 698 | struct fsnotify_group *group; | 698 | struct fsnotify_group *group; |
| 699 | int f_flags, fd; | 699 | int f_flags, fd; |
| 700 | struct user_struct *user; | 700 | struct user_struct *user; |
| 701 | struct fanotify_event_info *oevent; | ||
| 701 | 702 | ||
| 702 | pr_debug("%s: flags=%d event_f_flags=%d\n", | 703 | pr_debug("%s: flags=%d event_f_flags=%d\n", |
| 703 | __func__, flags, event_f_flags); | 704 | __func__, flags, event_f_flags); |
| @@ -730,8 +731,20 @@ SYSCALL_DEFINE2(fanotify_init, unsigned int, flags, unsigned int, event_f_flags) | |||
| 730 | group->fanotify_data.user = user; | 731 | group->fanotify_data.user = user; |
| 731 | atomic_inc(&user->fanotify_listeners); | 732 | atomic_inc(&user->fanotify_listeners); |
| 732 | 733 | ||
| 734 | oevent = kmem_cache_alloc(fanotify_event_cachep, GFP_KERNEL); | ||
| 735 | if (unlikely(!oevent)) { | ||
| 736 | fd = -ENOMEM; | ||
| 737 | goto out_destroy_group; | ||
| 738 | } | ||
| 739 | group->overflow_event = &oevent->fse; | ||
| 740 | fsnotify_init_event(group->overflow_event, NULL, FS_Q_OVERFLOW); | ||
| 741 | oevent->tgid = get_pid(task_tgid(current)); | ||
| 742 | oevent->path.mnt = NULL; | ||
| 743 | oevent->path.dentry = NULL; | ||
| 744 | |||
| 733 | group->fanotify_data.f_flags = event_f_flags; | 745 | group->fanotify_data.f_flags = event_f_flags; |
| 734 | #ifdef CONFIG_FANOTIFY_ACCESS_PERMISSIONS | 746 | #ifdef CONFIG_FANOTIFY_ACCESS_PERMISSIONS |
| 747 | oevent->response = 0; | ||
| 735 | mutex_init(&group->fanotify_data.access_mutex); | 748 | mutex_init(&group->fanotify_data.access_mutex); |
| 736 | init_waitqueue_head(&group->fanotify_data.access_waitq); | 749 | init_waitqueue_head(&group->fanotify_data.access_waitq); |
| 737 | INIT_LIST_HEAD(&group->fanotify_data.access_list); | 750 | INIT_LIST_HEAD(&group->fanotify_data.access_list); |
diff --git a/fs/notify/fsnotify.c b/fs/notify/fsnotify.c index 1d4e1ea2f37c..9d3e9c50066a 100644 --- a/fs/notify/fsnotify.c +++ b/fs/notify/fsnotify.c | |||
| @@ -179,7 +179,7 @@ static int send_to_group(struct inode *to_tell, | |||
| 179 | 179 | ||
| 180 | return group->ops->handle_event(group, to_tell, inode_mark, | 180 | return group->ops->handle_event(group, to_tell, inode_mark, |
| 181 | vfsmount_mark, mask, data, data_is, | 181 | vfsmount_mark, mask, data, data_is, |
| 182 | file_name); | 182 | file_name, cookie); |
| 183 | } | 183 | } |
| 184 | 184 | ||
| 185 | /* | 185 | /* |
diff --git a/fs/notify/group.c b/fs/notify/group.c index ee674fe2cec7..ad1995980456 100644 --- a/fs/notify/group.c +++ b/fs/notify/group.c | |||
| @@ -55,6 +55,13 @@ void fsnotify_destroy_group(struct fsnotify_group *group) | |||
| 55 | /* clear the notification queue of all events */ | 55 | /* clear the notification queue of all events */ |
| 56 | fsnotify_flush_notify(group); | 56 | fsnotify_flush_notify(group); |
| 57 | 57 | ||
| 58 | /* | ||
| 59 | * Destroy overflow event (we cannot use fsnotify_destroy_event() as | ||
| 60 | * that deliberately ignores overflow events. | ||
| 61 | */ | ||
| 62 | if (group->overflow_event) | ||
| 63 | group->ops->free_event(group->overflow_event); | ||
| 64 | |||
| 58 | fsnotify_put_group(group); | 65 | fsnotify_put_group(group); |
| 59 | } | 66 | } |
| 60 | 67 | ||
| @@ -99,7 +106,6 @@ struct fsnotify_group *fsnotify_alloc_group(const struct fsnotify_ops *ops) | |||
| 99 | INIT_LIST_HEAD(&group->marks_list); | 106 | INIT_LIST_HEAD(&group->marks_list); |
| 100 | 107 | ||
| 101 | group->ops = ops; | 108 | group->ops = ops; |
| 102 | fsnotify_init_event(&group->overflow_event, NULL, FS_Q_OVERFLOW); | ||
| 103 | 109 | ||
| 104 | return group; | 110 | return group; |
| 105 | } | 111 | } |
diff --git a/fs/notify/inotify/inotify.h b/fs/notify/inotify/inotify.h index 485eef3f4407..ed855ef6f077 100644 --- a/fs/notify/inotify/inotify.h +++ b/fs/notify/inotify/inotify.h | |||
| @@ -27,6 +27,6 @@ extern int inotify_handle_event(struct fsnotify_group *group, | |||
| 27 | struct fsnotify_mark *inode_mark, | 27 | struct fsnotify_mark *inode_mark, |
| 28 | struct fsnotify_mark *vfsmount_mark, | 28 | struct fsnotify_mark *vfsmount_mark, |
| 29 | u32 mask, void *data, int data_type, | 29 | u32 mask, void *data, int data_type, |
| 30 | const unsigned char *file_name); | 30 | const unsigned char *file_name, u32 cookie); |
| 31 | 31 | ||
| 32 | extern const struct fsnotify_ops inotify_fsnotify_ops; | 32 | extern const struct fsnotify_ops inotify_fsnotify_ops; |
diff --git a/fs/notify/inotify/inotify_fsnotify.c b/fs/notify/inotify/inotify_fsnotify.c index d5ee56348bb8..43ab1e1a07a2 100644 --- a/fs/notify/inotify/inotify_fsnotify.c +++ b/fs/notify/inotify/inotify_fsnotify.c | |||
| @@ -67,7 +67,7 @@ int inotify_handle_event(struct fsnotify_group *group, | |||
| 67 | struct fsnotify_mark *inode_mark, | 67 | struct fsnotify_mark *inode_mark, |
| 68 | struct fsnotify_mark *vfsmount_mark, | 68 | struct fsnotify_mark *vfsmount_mark, |
| 69 | u32 mask, void *data, int data_type, | 69 | u32 mask, void *data, int data_type, |
| 70 | const unsigned char *file_name) | 70 | const unsigned char *file_name, u32 cookie) |
| 71 | { | 71 | { |
| 72 | struct inotify_inode_mark *i_mark; | 72 | struct inotify_inode_mark *i_mark; |
| 73 | struct inotify_event_info *event; | 73 | struct inotify_event_info *event; |
| @@ -103,6 +103,7 @@ int inotify_handle_event(struct fsnotify_group *group, | |||
| 103 | fsn_event = &event->fse; | 103 | fsn_event = &event->fse; |
| 104 | fsnotify_init_event(fsn_event, inode, mask); | 104 | fsnotify_init_event(fsn_event, inode, mask); |
| 105 | event->wd = i_mark->wd; | 105 | event->wd = i_mark->wd; |
| 106 | event->sync_cookie = cookie; | ||
| 106 | event->name_len = len; | 107 | event->name_len = len; |
| 107 | if (len) | 108 | if (len) |
| 108 | strcpy(event->name, file_name); | 109 | strcpy(event->name, file_name); |
diff --git a/fs/notify/inotify/inotify_user.c b/fs/notify/inotify/inotify_user.c index 497395c8274b..78a2ca3966c3 100644 --- a/fs/notify/inotify/inotify_user.c +++ b/fs/notify/inotify/inotify_user.c | |||
| @@ -495,7 +495,7 @@ void inotify_ignored_and_remove_idr(struct fsnotify_mark *fsn_mark, | |||
| 495 | 495 | ||
| 496 | /* Queue ignore event for the watch */ | 496 | /* Queue ignore event for the watch */ |
| 497 | inotify_handle_event(group, NULL, fsn_mark, NULL, FS_IN_IGNORED, | 497 | inotify_handle_event(group, NULL, fsn_mark, NULL, FS_IN_IGNORED, |
| 498 | NULL, FSNOTIFY_EVENT_NONE, NULL); | 498 | NULL, FSNOTIFY_EVENT_NONE, NULL, 0); |
| 499 | 499 | ||
| 500 | i_mark = container_of(fsn_mark, struct inotify_inode_mark, fsn_mark); | 500 | i_mark = container_of(fsn_mark, struct inotify_inode_mark, fsn_mark); |
| 501 | /* remove this mark from the idr */ | 501 | /* remove this mark from the idr */ |
| @@ -633,11 +633,23 @@ static int inotify_update_watch(struct fsnotify_group *group, struct inode *inod | |||
| 633 | static struct fsnotify_group *inotify_new_group(unsigned int max_events) | 633 | static struct fsnotify_group *inotify_new_group(unsigned int max_events) |
| 634 | { | 634 | { |
| 635 | struct fsnotify_group *group; | 635 | struct fsnotify_group *group; |
| 636 | struct inotify_event_info *oevent; | ||
| 636 | 637 | ||
| 637 | group = fsnotify_alloc_group(&inotify_fsnotify_ops); | 638 | group = fsnotify_alloc_group(&inotify_fsnotify_ops); |
| 638 | if (IS_ERR(group)) | 639 | if (IS_ERR(group)) |
| 639 | return group; | 640 | return group; |
| 640 | 641 | ||
| 642 | oevent = kmalloc(sizeof(struct inotify_event_info), GFP_KERNEL); | ||
| 643 | if (unlikely(!oevent)) { | ||
| 644 | fsnotify_destroy_group(group); | ||
| 645 | return ERR_PTR(-ENOMEM); | ||
| 646 | } | ||
| 647 | group->overflow_event = &oevent->fse; | ||
| 648 | fsnotify_init_event(group->overflow_event, NULL, FS_Q_OVERFLOW); | ||
| 649 | oevent->wd = -1; | ||
| 650 | oevent->sync_cookie = 0; | ||
| 651 | oevent->name_len = 0; | ||
| 652 | |||
| 641 | group->max_events = max_events; | 653 | group->max_events = max_events; |
| 642 | 654 | ||
| 643 | spin_lock_init(&group->inotify_data.idr_lock); | 655 | spin_lock_init(&group->inotify_data.idr_lock); |
diff --git a/fs/notify/notification.c b/fs/notify/notification.c index 18b3c4427dca..1e58402171a5 100644 --- a/fs/notify/notification.c +++ b/fs/notify/notification.c | |||
| @@ -80,7 +80,8 @@ void fsnotify_destroy_event(struct fsnotify_group *group, | |||
| 80 | /* | 80 | /* |
| 81 | * Add an event to the group notification queue. The group can later pull this | 81 | * Add an event to the group notification queue. The group can later pull this |
| 82 | * event off the queue to deal with. The function returns 0 if the event was | 82 | * event off the queue to deal with. The function returns 0 if the event was |
| 83 | * added to the queue, 1 if the event was merged with some other queued event. | 83 | * added to the queue, 1 if the event was merged with some other queued event, |
| 84 | * 2 if the queue of events has overflown. | ||
| 84 | */ | 85 | */ |
| 85 | int fsnotify_add_notify_event(struct fsnotify_group *group, | 86 | int fsnotify_add_notify_event(struct fsnotify_group *group, |
| 86 | struct fsnotify_event *event, | 87 | struct fsnotify_event *event, |
| @@ -95,10 +96,14 @@ int fsnotify_add_notify_event(struct fsnotify_group *group, | |||
| 95 | mutex_lock(&group->notification_mutex); | 96 | mutex_lock(&group->notification_mutex); |
| 96 | 97 | ||
| 97 | if (group->q_len >= group->max_events) { | 98 | if (group->q_len >= group->max_events) { |
| 99 | ret = 2; | ||
| 98 | /* Queue overflow event only if it isn't already queued */ | 100 | /* Queue overflow event only if it isn't already queued */ |
| 99 | if (list_empty(&group->overflow_event.list)) | 101 | if (!list_empty(&group->overflow_event->list)) { |
| 100 | event = &group->overflow_event; | 102 | mutex_unlock(&group->notification_mutex); |
| 101 | ret = 1; | 103 | return ret; |
| 104 | } | ||
| 105 | event = group->overflow_event; | ||
| 106 | goto queue; | ||
| 102 | } | 107 | } |
| 103 | 108 | ||
| 104 | if (!list_empty(list) && merge) { | 109 | if (!list_empty(list) && merge) { |
| @@ -109,6 +114,7 @@ int fsnotify_add_notify_event(struct fsnotify_group *group, | |||
| 109 | } | 114 | } |
| 110 | } | 115 | } |
| 111 | 116 | ||
| 117 | queue: | ||
| 112 | group->q_len++; | 118 | group->q_len++; |
| 113 | list_add_tail(&event->list, list); | 119 | list_add_tail(&event->list, list); |
| 114 | mutex_unlock(&group->notification_mutex); | 120 | mutex_unlock(&group->notification_mutex); |
| @@ -132,7 +138,11 @@ struct fsnotify_event *fsnotify_remove_notify_event(struct fsnotify_group *group | |||
| 132 | 138 | ||
| 133 | event = list_first_entry(&group->notification_list, | 139 | event = list_first_entry(&group->notification_list, |
| 134 | struct fsnotify_event, list); | 140 | struct fsnotify_event, list); |
| 135 | list_del(&event->list); | 141 | /* |
| 142 | * We need to init list head for the case of overflow event so that | ||
| 143 | * check in fsnotify_add_notify_events() works | ||
| 144 | */ | ||
| 145 | list_del_init(&event->list); | ||
| 136 | group->q_len--; | 146 | group->q_len--; |
| 137 | 147 | ||
| 138 | return event; | 148 | return event; |
diff --git a/fs/ocfs2/quota_global.c b/fs/ocfs2/quota_global.c index aaa50611ec66..d7b5108789e2 100644 --- a/fs/ocfs2/quota_global.c +++ b/fs/ocfs2/quota_global.c | |||
| @@ -717,6 +717,12 @@ static int ocfs2_release_dquot(struct dquot *dquot) | |||
| 717 | */ | 717 | */ |
| 718 | if (status < 0) | 718 | if (status < 0) |
| 719 | mlog_errno(status); | 719 | mlog_errno(status); |
| 720 | /* | ||
| 721 | * Clear dq_off so that we search for the structure in quota file next | ||
| 722 | * time we acquire it. The structure might be deleted and reallocated | ||
| 723 | * elsewhere by another node while our dquot structure is on freelist. | ||
| 724 | */ | ||
| 725 | dquot->dq_off = 0; | ||
| 720 | clear_bit(DQ_ACTIVE_B, &dquot->dq_flags); | 726 | clear_bit(DQ_ACTIVE_B, &dquot->dq_flags); |
| 721 | out_trans: | 727 | out_trans: |
| 722 | ocfs2_commit_trans(osb, handle); | 728 | ocfs2_commit_trans(osb, handle); |
| @@ -756,16 +762,17 @@ static int ocfs2_acquire_dquot(struct dquot *dquot) | |||
| 756 | status = ocfs2_lock_global_qf(info, 1); | 762 | status = ocfs2_lock_global_qf(info, 1); |
| 757 | if (status < 0) | 763 | if (status < 0) |
| 758 | goto out; | 764 | goto out; |
| 759 | if (!test_bit(DQ_READ_B, &dquot->dq_flags)) { | 765 | status = ocfs2_qinfo_lock(info, 0); |
| 760 | status = ocfs2_qinfo_lock(info, 0); | 766 | if (status < 0) |
| 761 | if (status < 0) | 767 | goto out_dq; |
| 762 | goto out_dq; | 768 | /* |
| 763 | status = qtree_read_dquot(&info->dqi_gi, dquot); | 769 | * We always want to read dquot structure from disk because we don't |
| 764 | ocfs2_qinfo_unlock(info, 0); | 770 | * know what happened with it while it was on freelist. |
| 765 | if (status < 0) | 771 | */ |
| 766 | goto out_dq; | 772 | status = qtree_read_dquot(&info->dqi_gi, dquot); |
| 767 | } | 773 | ocfs2_qinfo_unlock(info, 0); |
| 768 | set_bit(DQ_READ_B, &dquot->dq_flags); | 774 | if (status < 0) |
| 775 | goto out_dq; | ||
| 769 | 776 | ||
| 770 | OCFS2_DQUOT(dquot)->dq_use_count++; | 777 | OCFS2_DQUOT(dquot)->dq_use_count++; |
| 771 | OCFS2_DQUOT(dquot)->dq_origspace = dquot->dq_dqb.dqb_curspace; | 778 | OCFS2_DQUOT(dquot)->dq_origspace = dquot->dq_dqb.dqb_curspace; |
diff --git a/fs/ocfs2/quota_local.c b/fs/ocfs2/quota_local.c index 2e4344be3b96..2001862bf2b1 100644 --- a/fs/ocfs2/quota_local.c +++ b/fs/ocfs2/quota_local.c | |||
| @@ -1303,10 +1303,6 @@ int ocfs2_local_release_dquot(handle_t *handle, struct dquot *dquot) | |||
| 1303 | ocfs2_journal_dirty(handle, od->dq_chunk->qc_headerbh); | 1303 | ocfs2_journal_dirty(handle, od->dq_chunk->qc_headerbh); |
| 1304 | 1304 | ||
| 1305 | out: | 1305 | out: |
| 1306 | /* Clear the read bit so that next time someone uses this | ||
| 1307 | * dquot he reads fresh info from disk and allocates local | ||
| 1308 | * dquot structure */ | ||
| 1309 | clear_bit(DQ_READ_B, &dquot->dq_flags); | ||
| 1310 | return status; | 1306 | return status; |
| 1311 | } | 1307 | } |
| 1312 | 1308 | ||
diff --git a/fs/proc/page.c b/fs/proc/page.c index 02174a610315..e647c55275d9 100644 --- a/fs/proc/page.c +++ b/fs/proc/page.c | |||
| @@ -121,9 +121,8 @@ u64 stable_page_flags(struct page *page) | |||
| 121 | * just checks PG_head/PG_tail, so we need to check PageLRU/PageAnon | 121 | * just checks PG_head/PG_tail, so we need to check PageLRU/PageAnon |
| 122 | * to make sure a given page is a thp, not a non-huge compound page. | 122 | * to make sure a given page is a thp, not a non-huge compound page. |
| 123 | */ | 123 | */ |
| 124 | else if (PageTransCompound(page) && | 124 | else if (PageTransCompound(page) && (PageLRU(compound_head(page)) || |
| 125 | (PageLRU(compound_trans_head(page)) || | 125 | PageAnon(compound_head(page)))) |
| 126 | PageAnon(compound_trans_head(page)))) | ||
| 127 | u |= 1 << KPF_THP; | 126 | u |= 1 << KPF_THP; |
| 128 | 127 | ||
| 129 | /* | 128 | /* |
diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index 831d49a4111f..cfc8dcc16043 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c | |||
| @@ -581,9 +581,17 @@ int dquot_scan_active(struct super_block *sb, | |||
| 581 | dqstats_inc(DQST_LOOKUPS); | 581 | dqstats_inc(DQST_LOOKUPS); |
| 582 | dqput(old_dquot); | 582 | dqput(old_dquot); |
| 583 | old_dquot = dquot; | 583 | old_dquot = dquot; |
| 584 | ret = fn(dquot, priv); | 584 | /* |
| 585 | if (ret < 0) | 585 | * ->release_dquot() can be racing with us. Our reference |
| 586 | goto out; | 586 | * protects us from new calls to it so just wait for any |
| 587 | * outstanding call and recheck the DQ_ACTIVE_B after that. | ||
| 588 | */ | ||
| 589 | wait_on_dquot(dquot); | ||
| 590 | if (test_bit(DQ_ACTIVE_B, &dquot->dq_flags)) { | ||
| 591 | ret = fn(dquot, priv); | ||
| 592 | if (ret < 0) | ||
| 593 | goto out; | ||
| 594 | } | ||
| 587 | spin_lock(&dq_list_lock); | 595 | spin_lock(&dq_list_lock); |
| 588 | /* We are safe to continue now because our dquot could not | 596 | /* We are safe to continue now because our dquot could not |
| 589 | * be moved out of the inuse list while we hold the reference */ | 597 | * be moved out of the inuse list while we hold the reference */ |
| @@ -27,11 +27,10 @@ | |||
| 27 | * wait == 1 case since in that case write_inode() functions do | 27 | * wait == 1 case since in that case write_inode() functions do |
| 28 | * sync_dirty_buffer() and thus effectively write one block at a time. | 28 | * sync_dirty_buffer() and thus effectively write one block at a time. |
| 29 | */ | 29 | */ |
| 30 | static int __sync_filesystem(struct super_block *sb, int wait, | 30 | static int __sync_filesystem(struct super_block *sb, int wait) |
| 31 | unsigned long start) | ||
| 32 | { | 31 | { |
| 33 | if (wait) | 32 | if (wait) |
| 34 | sync_inodes_sb(sb, start); | 33 | sync_inodes_sb(sb); |
| 35 | else | 34 | else |
| 36 | writeback_inodes_sb(sb, WB_REASON_SYNC); | 35 | writeback_inodes_sb(sb, WB_REASON_SYNC); |
| 37 | 36 | ||
| @@ -48,7 +47,6 @@ static int __sync_filesystem(struct super_block *sb, int wait, | |||
| 48 | int sync_filesystem(struct super_block *sb) | 47 | int sync_filesystem(struct super_block *sb) |
| 49 | { | 48 | { |
| 50 | int ret; | 49 | int ret; |
| 51 | unsigned long start = jiffies; | ||
| 52 | 50 | ||
| 53 | /* | 51 | /* |
| 54 | * We need to be protected against the filesystem going from | 52 | * We need to be protected against the filesystem going from |
| @@ -62,17 +60,17 @@ int sync_filesystem(struct super_block *sb) | |||
| 62 | if (sb->s_flags & MS_RDONLY) | 60 | if (sb->s_flags & MS_RDONLY) |
| 63 | return 0; | 61 | return 0; |
| 64 | 62 | ||
| 65 | ret = __sync_filesystem(sb, 0, start); | 63 | ret = __sync_filesystem(sb, 0); |
| 66 | if (ret < 0) | 64 | if (ret < 0) |
| 67 | return ret; | 65 | return ret; |
| 68 | return __sync_filesystem(sb, 1, start); | 66 | return __sync_filesystem(sb, 1); |
| 69 | } | 67 | } |
| 70 | EXPORT_SYMBOL_GPL(sync_filesystem); | 68 | EXPORT_SYMBOL_GPL(sync_filesystem); |
| 71 | 69 | ||
| 72 | static void sync_inodes_one_sb(struct super_block *sb, void *arg) | 70 | static void sync_inodes_one_sb(struct super_block *sb, void *arg) |
| 73 | { | 71 | { |
| 74 | if (!(sb->s_flags & MS_RDONLY)) | 72 | if (!(sb->s_flags & MS_RDONLY)) |
| 75 | sync_inodes_sb(sb, *((unsigned long *)arg)); | 73 | sync_inodes_sb(sb); |
| 76 | } | 74 | } |
| 77 | 75 | ||
| 78 | static void sync_fs_one_sb(struct super_block *sb, void *arg) | 76 | static void sync_fs_one_sb(struct super_block *sb, void *arg) |
| @@ -104,10 +102,9 @@ static void fdatawait_one_bdev(struct block_device *bdev, void *arg) | |||
| 104 | SYSCALL_DEFINE0(sync) | 102 | SYSCALL_DEFINE0(sync) |
| 105 | { | 103 | { |
| 106 | int nowait = 0, wait = 1; | 104 | int nowait = 0, wait = 1; |
| 107 | unsigned long start = jiffies; | ||
| 108 | 105 | ||
| 109 | wakeup_flusher_threads(0, WB_REASON_SYNC); | 106 | wakeup_flusher_threads(0, WB_REASON_SYNC); |
| 110 | iterate_supers(sync_inodes_one_sb, &start); | 107 | iterate_supers(sync_inodes_one_sb, NULL); |
| 111 | iterate_supers(sync_fs_one_sb, &nowait); | 108 | iterate_supers(sync_fs_one_sb, &nowait); |
| 112 | iterate_supers(sync_fs_one_sb, &wait); | 109 | iterate_supers(sync_fs_one_sb, &wait); |
| 113 | iterate_bdevs(fdatawrite_one_bdev, NULL); | 110 | iterate_bdevs(fdatawrite_one_bdev, NULL); |
diff --git a/fs/sysfs/mount.c b/fs/sysfs/mount.c index 6211230814fd..3eaf5c6622eb 100644 --- a/fs/sysfs/mount.c +++ b/fs/sysfs/mount.c | |||
| @@ -27,6 +27,7 @@ static struct dentry *sysfs_mount(struct file_system_type *fs_type, | |||
| 27 | { | 27 | { |
| 28 | struct dentry *root; | 28 | struct dentry *root; |
| 29 | void *ns; | 29 | void *ns; |
| 30 | bool new_sb; | ||
| 30 | 31 | ||
| 31 | if (!(flags & MS_KERNMOUNT)) { | 32 | if (!(flags & MS_KERNMOUNT)) { |
| 32 | if (!capable(CAP_SYS_ADMIN) && !fs_fully_visible(fs_type)) | 33 | if (!capable(CAP_SYS_ADMIN) && !fs_fully_visible(fs_type)) |
| @@ -37,8 +38,8 @@ static struct dentry *sysfs_mount(struct file_system_type *fs_type, | |||
| 37 | } | 38 | } |
| 38 | 39 | ||
| 39 | ns = kobj_ns_grab_current(KOBJ_NS_TYPE_NET); | 40 | ns = kobj_ns_grab_current(KOBJ_NS_TYPE_NET); |
| 40 | root = kernfs_mount_ns(fs_type, flags, sysfs_root, ns); | 41 | root = kernfs_mount_ns(fs_type, flags, sysfs_root, &new_sb, ns); |
| 41 | if (IS_ERR(root)) | 42 | if (IS_ERR(root) || !new_sb) |
| 42 | kobj_ns_drop(KOBJ_NS_TYPE_NET, ns); | 43 | kobj_ns_drop(KOBJ_NS_TYPE_NET, ns); |
| 43 | return root; | 44 | return root; |
| 44 | } | 45 | } |
diff --git a/fs/udf/file.c b/fs/udf/file.c index c02a27a19c6d..1037637957c7 100644 --- a/fs/udf/file.c +++ b/fs/udf/file.c | |||
| @@ -144,6 +144,7 @@ static ssize_t udf_file_aio_write(struct kiocb *iocb, const struct iovec *iov, | |||
| 144 | size_t count = iocb->ki_nbytes; | 144 | size_t count = iocb->ki_nbytes; |
| 145 | struct udf_inode_info *iinfo = UDF_I(inode); | 145 | struct udf_inode_info *iinfo = UDF_I(inode); |
| 146 | 146 | ||
| 147 | mutex_lock(&inode->i_mutex); | ||
| 147 | down_write(&iinfo->i_data_sem); | 148 | down_write(&iinfo->i_data_sem); |
| 148 | if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) { | 149 | if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) { |
| 149 | if (file->f_flags & O_APPEND) | 150 | if (file->f_flags & O_APPEND) |
| @@ -156,6 +157,7 @@ static ssize_t udf_file_aio_write(struct kiocb *iocb, const struct iovec *iov, | |||
| 156 | pos + count)) { | 157 | pos + count)) { |
| 157 | err = udf_expand_file_adinicb(inode); | 158 | err = udf_expand_file_adinicb(inode); |
| 158 | if (err) { | 159 | if (err) { |
| 160 | mutex_unlock(&inode->i_mutex); | ||
| 159 | udf_debug("udf_expand_adinicb: err=%d\n", err); | 161 | udf_debug("udf_expand_adinicb: err=%d\n", err); |
| 160 | return err; | 162 | return err; |
| 161 | } | 163 | } |
| @@ -169,9 +171,17 @@ static ssize_t udf_file_aio_write(struct kiocb *iocb, const struct iovec *iov, | |||
| 169 | } else | 171 | } else |
| 170 | up_write(&iinfo->i_data_sem); | 172 | up_write(&iinfo->i_data_sem); |
| 171 | 173 | ||
| 172 | retval = generic_file_aio_write(iocb, iov, nr_segs, ppos); | 174 | retval = __generic_file_aio_write(iocb, iov, nr_segs, &iocb->ki_pos); |
| 173 | if (retval > 0) | 175 | mutex_unlock(&inode->i_mutex); |
| 176 | |||
| 177 | if (retval > 0) { | ||
| 178 | ssize_t err; | ||
| 179 | |||
| 174 | mark_inode_dirty(inode); | 180 | mark_inode_dirty(inode); |
| 181 | err = generic_write_sync(file, iocb->ki_pos - retval, retval); | ||
| 182 | if (err < 0) | ||
| 183 | retval = err; | ||
| 184 | } | ||
| 175 | 185 | ||
| 176 | return retval; | 186 | return retval; |
| 177 | } | 187 | } |
diff --git a/fs/udf/inode.c b/fs/udf/inode.c index 062b7925bca0..982ce05c87ed 100644 --- a/fs/udf/inode.c +++ b/fs/udf/inode.c | |||
| @@ -265,6 +265,7 @@ int udf_expand_file_adinicb(struct inode *inode) | |||
| 265 | .nr_to_write = 1, | 265 | .nr_to_write = 1, |
| 266 | }; | 266 | }; |
| 267 | 267 | ||
| 268 | WARN_ON_ONCE(!mutex_is_locked(&inode->i_mutex)); | ||
| 268 | if (!iinfo->i_lenAlloc) { | 269 | if (!iinfo->i_lenAlloc) { |
| 269 | if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_SHORT_AD)) | 270 | if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_SHORT_AD)) |
| 270 | iinfo->i_alloc_type = ICBTAG_FLAG_AD_SHORT; | 271 | iinfo->i_alloc_type = ICBTAG_FLAG_AD_SHORT; |
diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index f35d5c953ff9..9ddfb8190ca1 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c | |||
| @@ -705,7 +705,6 @@ xfs_setattr_size( | |||
| 705 | { | 705 | { |
| 706 | struct xfs_mount *mp = ip->i_mount; | 706 | struct xfs_mount *mp = ip->i_mount; |
| 707 | struct inode *inode = VFS_I(ip); | 707 | struct inode *inode = VFS_I(ip); |
| 708 | int mask = iattr->ia_valid; | ||
| 709 | xfs_off_t oldsize, newsize; | 708 | xfs_off_t oldsize, newsize; |
| 710 | struct xfs_trans *tp; | 709 | struct xfs_trans *tp; |
| 711 | int error; | 710 | int error; |
| @@ -726,8 +725,8 @@ xfs_setattr_size( | |||
| 726 | 725 | ||
| 727 | ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); | 726 | ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); |
| 728 | ASSERT(S_ISREG(ip->i_d.di_mode)); | 727 | ASSERT(S_ISREG(ip->i_d.di_mode)); |
| 729 | ASSERT((mask & (ATTR_UID|ATTR_GID|ATTR_ATIME|ATTR_ATIME_SET| | 728 | ASSERT((iattr->ia_valid & (ATTR_UID|ATTR_GID|ATTR_ATIME|ATTR_ATIME_SET| |
| 730 | ATTR_MTIME_SET|ATTR_KILL_PRIV|ATTR_TIMES_SET)) == 0); | 729 | ATTR_MTIME_SET|ATTR_KILL_PRIV|ATTR_TIMES_SET)) == 0); |
| 731 | 730 | ||
| 732 | oldsize = inode->i_size; | 731 | oldsize = inode->i_size; |
| 733 | newsize = iattr->ia_size; | 732 | newsize = iattr->ia_size; |
| @@ -736,7 +735,7 @@ xfs_setattr_size( | |||
| 736 | * Short circuit the truncate case for zero length files. | 735 | * Short circuit the truncate case for zero length files. |
| 737 | */ | 736 | */ |
| 738 | if (newsize == 0 && oldsize == 0 && ip->i_d.di_nextents == 0) { | 737 | if (newsize == 0 && oldsize == 0 && ip->i_d.di_nextents == 0) { |
| 739 | if (!(mask & (ATTR_CTIME|ATTR_MTIME))) | 738 | if (!(iattr->ia_valid & (ATTR_CTIME|ATTR_MTIME))) |
| 740 | return 0; | 739 | return 0; |
| 741 | 740 | ||
| 742 | /* | 741 | /* |
| @@ -824,10 +823,11 @@ xfs_setattr_size( | |||
| 824 | * these flags set. For all other operations the VFS set these flags | 823 | * these flags set. For all other operations the VFS set these flags |
| 825 | * explicitly if it wants a timestamp update. | 824 | * explicitly if it wants a timestamp update. |
| 826 | */ | 825 | */ |
| 827 | if (newsize != oldsize && (!(mask & (ATTR_CTIME | ATTR_MTIME)))) { | 826 | if (newsize != oldsize && |
| 827 | !(iattr->ia_valid & (ATTR_CTIME | ATTR_MTIME))) { | ||
| 828 | iattr->ia_ctime = iattr->ia_mtime = | 828 | iattr->ia_ctime = iattr->ia_mtime = |
| 829 | current_fs_time(inode->i_sb); | 829 | current_fs_time(inode->i_sb); |
| 830 | mask |= ATTR_CTIME | ATTR_MTIME; | 830 | iattr->ia_valid |= ATTR_CTIME | ATTR_MTIME; |
| 831 | } | 831 | } |
| 832 | 832 | ||
| 833 | /* | 833 | /* |
| @@ -863,9 +863,9 @@ xfs_setattr_size( | |||
| 863 | xfs_inode_clear_eofblocks_tag(ip); | 863 | xfs_inode_clear_eofblocks_tag(ip); |
| 864 | } | 864 | } |
| 865 | 865 | ||
| 866 | if (mask & ATTR_MODE) | 866 | if (iattr->ia_valid & ATTR_MODE) |
| 867 | xfs_setattr_mode(ip, iattr); | 867 | xfs_setattr_mode(ip, iattr); |
| 868 | if (mask & (ATTR_ATIME|ATTR_CTIME|ATTR_MTIME)) | 868 | if (iattr->ia_valid & (ATTR_ATIME|ATTR_CTIME|ATTR_MTIME)) |
| 869 | xfs_setattr_time(ip, iattr); | 869 | xfs_setattr_time(ip, iattr); |
| 870 | 870 | ||
| 871 | xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); | 871 | xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); |
diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c index cdebd832c3db..4ef6fdbced78 100644 --- a/fs/xfs/xfs_log_cil.c +++ b/fs/xfs/xfs_log_cil.c | |||
| @@ -205,16 +205,25 @@ xlog_cil_insert_format_items( | |||
| 205 | /* | 205 | /* |
| 206 | * We 64-bit align the length of each iovec so that the start | 206 | * We 64-bit align the length of each iovec so that the start |
| 207 | * of the next one is naturally aligned. We'll need to | 207 | * of the next one is naturally aligned. We'll need to |
| 208 | * account for that slack space here. | 208 | * account for that slack space here. Then round nbytes up |
| 209 | * to 64-bit alignment so that the initial buffer alignment is | ||
| 210 | * easy to calculate and verify. | ||
| 209 | */ | 211 | */ |
| 210 | nbytes += niovecs * sizeof(uint64_t); | 212 | nbytes += niovecs * sizeof(uint64_t); |
| 213 | nbytes = round_up(nbytes, sizeof(uint64_t)); | ||
| 211 | 214 | ||
| 212 | /* grab the old item if it exists for reservation accounting */ | 215 | /* grab the old item if it exists for reservation accounting */ |
| 213 | old_lv = lip->li_lv; | 216 | old_lv = lip->li_lv; |
| 214 | 217 | ||
| 215 | /* calc buffer size */ | 218 | /* |
| 216 | buf_size = sizeof(struct xfs_log_vec) + nbytes + | 219 | * The data buffer needs to start 64-bit aligned, so round up |
| 217 | niovecs * sizeof(struct xfs_log_iovec); | 220 | * that space to ensure we can align it appropriately and not |
| 221 | * overrun the buffer. | ||
| 222 | */ | ||
| 223 | buf_size = nbytes + | ||
| 224 | round_up((sizeof(struct xfs_log_vec) + | ||
| 225 | niovecs * sizeof(struct xfs_log_iovec)), | ||
| 226 | sizeof(uint64_t)); | ||
| 218 | 227 | ||
| 219 | /* compare to existing item size */ | 228 | /* compare to existing item size */ |
| 220 | if (lip->li_lv && buf_size <= lip->li_lv->lv_size) { | 229 | if (lip->li_lv && buf_size <= lip->li_lv->lv_size) { |
| @@ -251,6 +260,8 @@ xlog_cil_insert_format_items( | |||
| 251 | /* The allocated data region lies beyond the iovec region */ | 260 | /* The allocated data region lies beyond the iovec region */ |
| 252 | lv->lv_buf_len = 0; | 261 | lv->lv_buf_len = 0; |
| 253 | lv->lv_buf = (char *)lv + buf_size - nbytes; | 262 | lv->lv_buf = (char *)lv + buf_size - nbytes; |
| 263 | ASSERT(IS_ALIGNED((unsigned long)lv->lv_buf, sizeof(uint64_t))); | ||
| 264 | |||
| 254 | lip->li_ops->iop_format(lip, lv); | 265 | lip->li_ops->iop_format(lip, lv); |
| 255 | insert: | 266 | insert: |
| 256 | ASSERT(lv->lv_buf_len <= nbytes); | 267 | ASSERT(lv->lv_buf_len <= nbytes); |
diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 02df7b408a26..f96c05669a9e 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c | |||
| @@ -282,22 +282,29 @@ xfs_readsb( | |||
| 282 | struct xfs_sb *sbp = &mp->m_sb; | 282 | struct xfs_sb *sbp = &mp->m_sb; |
| 283 | int error; | 283 | int error; |
| 284 | int loud = !(flags & XFS_MFSI_QUIET); | 284 | int loud = !(flags & XFS_MFSI_QUIET); |
| 285 | const struct xfs_buf_ops *buf_ops; | ||
| 285 | 286 | ||
| 286 | ASSERT(mp->m_sb_bp == NULL); | 287 | ASSERT(mp->m_sb_bp == NULL); |
| 287 | ASSERT(mp->m_ddev_targp != NULL); | 288 | ASSERT(mp->m_ddev_targp != NULL); |
| 288 | 289 | ||
| 289 | /* | 290 | /* |
| 291 | * For the initial read, we must guess at the sector | ||
| 292 | * size based on the block device. It's enough to | ||
| 293 | * get the sb_sectsize out of the superblock and | ||
| 294 | * then reread with the proper length. | ||
| 295 | * We don't verify it yet, because it may not be complete. | ||
| 296 | */ | ||
| 297 | sector_size = xfs_getsize_buftarg(mp->m_ddev_targp); | ||
| 298 | buf_ops = NULL; | ||
| 299 | |||
| 300 | /* | ||
| 290 | * Allocate a (locked) buffer to hold the superblock. | 301 | * Allocate a (locked) buffer to hold the superblock. |
| 291 | * This will be kept around at all times to optimize | 302 | * This will be kept around at all times to optimize |
| 292 | * access to the superblock. | 303 | * access to the superblock. |
| 293 | */ | 304 | */ |
| 294 | sector_size = xfs_getsize_buftarg(mp->m_ddev_targp); | ||
| 295 | |||
| 296 | reread: | 305 | reread: |
| 297 | bp = xfs_buf_read_uncached(mp->m_ddev_targp, XFS_SB_DADDR, | 306 | bp = xfs_buf_read_uncached(mp->m_ddev_targp, XFS_SB_DADDR, |
| 298 | BTOBB(sector_size), 0, | 307 | BTOBB(sector_size), 0, buf_ops); |
| 299 | loud ? &xfs_sb_buf_ops | ||
| 300 | : &xfs_sb_quiet_buf_ops); | ||
| 301 | if (!bp) { | 308 | if (!bp) { |
| 302 | if (loud) | 309 | if (loud) |
| 303 | xfs_warn(mp, "SB buffer read failed"); | 310 | xfs_warn(mp, "SB buffer read failed"); |
| @@ -328,12 +335,13 @@ reread: | |||
| 328 | } | 335 | } |
| 329 | 336 | ||
| 330 | /* | 337 | /* |
| 331 | * If device sector size is smaller than the superblock size, | 338 | * Re-read the superblock so the buffer is correctly sized, |
| 332 | * re-read the superblock so the buffer is correctly sized. | 339 | * and properly verified. |
| 333 | */ | 340 | */ |
| 334 | if (sector_size < sbp->sb_sectsize) { | 341 | if (buf_ops == NULL) { |
| 335 | xfs_buf_relse(bp); | 342 | xfs_buf_relse(bp); |
| 336 | sector_size = sbp->sb_sectsize; | 343 | sector_size = sbp->sb_sectsize; |
| 344 | buf_ops = loud ? &xfs_sb_buf_ops : &xfs_sb_quiet_buf_ops; | ||
| 337 | goto reread; | 345 | goto reread; |
| 338 | } | 346 | } |
| 339 | 347 | ||
diff --git a/fs/xfs/xfs_sb.c b/fs/xfs/xfs_sb.c index b7c9aea77f8f..1e116794bb66 100644 --- a/fs/xfs/xfs_sb.c +++ b/fs/xfs/xfs_sb.c | |||
| @@ -295,8 +295,7 @@ xfs_mount_validate_sb( | |||
| 295 | sbp->sb_dblocks == 0 || | 295 | sbp->sb_dblocks == 0 || |
| 296 | sbp->sb_dblocks > XFS_MAX_DBLOCKS(sbp) || | 296 | sbp->sb_dblocks > XFS_MAX_DBLOCKS(sbp) || |
| 297 | sbp->sb_dblocks < XFS_MIN_DBLOCKS(sbp))) { | 297 | sbp->sb_dblocks < XFS_MIN_DBLOCKS(sbp))) { |
| 298 | XFS_CORRUPTION_ERROR("SB sanity check failed", | 298 | xfs_notice(mp, "SB sanity check failed"); |
| 299 | XFS_ERRLEVEL_LOW, mp, sbp); | ||
| 300 | return XFS_ERROR(EFSCORRUPTED); | 299 | return XFS_ERROR(EFSCORRUPTED); |
| 301 | } | 300 | } |
| 302 | 301 | ||
| @@ -611,10 +610,10 @@ xfs_sb_read_verify( | |||
| 611 | XFS_SB_VERSION_5) || | 610 | XFS_SB_VERSION_5) || |
| 612 | dsb->sb_crc != 0)) { | 611 | dsb->sb_crc != 0)) { |
| 613 | 612 | ||
| 614 | if (!xfs_verify_cksum(bp->b_addr, be16_to_cpu(dsb->sb_sectsize), | 613 | if (!xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), |
| 615 | offsetof(struct xfs_sb, sb_crc))) { | 614 | offsetof(struct xfs_sb, sb_crc))) { |
| 616 | /* Only fail bad secondaries on a known V5 filesystem */ | 615 | /* Only fail bad secondaries on a known V5 filesystem */ |
| 617 | if (bp->b_bn != XFS_SB_DADDR && | 616 | if (bp->b_bn == XFS_SB_DADDR || |
| 618 | xfs_sb_version_hascrc(&mp->m_sb)) { | 617 | xfs_sb_version_hascrc(&mp->m_sb)) { |
| 619 | error = EFSCORRUPTED; | 618 | error = EFSCORRUPTED; |
| 620 | goto out_error; | 619 | goto out_error; |
| @@ -625,7 +624,7 @@ xfs_sb_read_verify( | |||
| 625 | 624 | ||
| 626 | out_error: | 625 | out_error: |
| 627 | if (error) { | 626 | if (error) { |
| 628 | if (error != EWRONGFS) | 627 | if (error == EFSCORRUPTED) |
| 629 | XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, | 628 | XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, |
| 630 | mp, bp->b_addr); | 629 | mp, bp->b_addr); |
| 631 | xfs_buf_ioerror(bp, error); | 630 | xfs_buf_ioerror(bp, error); |
| @@ -644,7 +643,6 @@ xfs_sb_quiet_read_verify( | |||
| 644 | { | 643 | { |
| 645 | struct xfs_dsb *dsb = XFS_BUF_TO_SBP(bp); | 644 | struct xfs_dsb *dsb = XFS_BUF_TO_SBP(bp); |
| 646 | 645 | ||
| 647 | |||
| 648 | if (dsb->sb_magicnum == cpu_to_be32(XFS_SB_MAGIC)) { | 646 | if (dsb->sb_magicnum == cpu_to_be32(XFS_SB_MAGIC)) { |
| 649 | /* XFS filesystem, verify noisily! */ | 647 | /* XFS filesystem, verify noisily! */ |
| 650 | xfs_sb_read_verify(bp); | 648 | xfs_sb_read_verify(bp); |
diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index f317488263dd..d971f4932b5d 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c | |||
| @@ -913,7 +913,7 @@ xfs_flush_inodes( | |||
| 913 | struct super_block *sb = mp->m_super; | 913 | struct super_block *sb = mp->m_super; |
| 914 | 914 | ||
| 915 | if (down_read_trylock(&sb->s_umount)) { | 915 | if (down_read_trylock(&sb->s_umount)) { |
| 916 | sync_inodes_sb(sb, jiffies); | 916 | sync_inodes_sb(sb); |
| 917 | up_read(&sb->s_umount); | 917 | up_read(&sb->s_umount); |
| 918 | } | 918 | } |
| 919 | } | 919 | } |
diff --git a/include/dt-bindings/clock/tegra124-car.h b/include/dt-bindings/clock/tegra124-car.h index a1116a3b54ef..8c1603b10665 100644 --- a/include/dt-bindings/clock/tegra124-car.h +++ b/include/dt-bindings/clock/tegra124-car.h | |||
| @@ -36,10 +36,10 @@ | |||
| 36 | #define TEGRA124_CLK_PWM 17 | 36 | #define TEGRA124_CLK_PWM 17 |
| 37 | #define TEGRA124_CLK_I2S2 18 | 37 | #define TEGRA124_CLK_I2S2 18 |
| 38 | /* 20 (register bit affects vi and vi_sensor) */ | 38 | /* 20 (register bit affects vi and vi_sensor) */ |
| 39 | #define TEGRA124_CLK_GR_2D 21 | 39 | /* 21 */ |
| 40 | #define TEGRA124_CLK_USBD 22 | 40 | #define TEGRA124_CLK_USBD 22 |
| 41 | #define TEGRA124_CLK_ISP 23 | 41 | #define TEGRA124_CLK_ISP 23 |
| 42 | #define TEGRA124_CLK_GR_3D 24 | 42 | /* 26 */ |
| 43 | /* 25 */ | 43 | /* 25 */ |
| 44 | #define TEGRA124_CLK_DISP2 26 | 44 | #define TEGRA124_CLK_DISP2 26 |
| 45 | #define TEGRA124_CLK_DISP1 27 | 45 | #define TEGRA124_CLK_DISP1 27 |
diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h index 5c097596104b..9450f025fe0c 100644 --- a/include/linux/cgroup.h +++ b/include/linux/cgroup.h | |||
| @@ -166,6 +166,8 @@ struct cgroup { | |||
| 166 | * | 166 | * |
| 167 | * The ID of the root cgroup is always 0, and a new cgroup | 167 | * The ID of the root cgroup is always 0, and a new cgroup |
| 168 | * will be assigned with a smallest available ID. | 168 | * will be assigned with a smallest available ID. |
| 169 | * | ||
| 170 | * Allocating/Removing ID must be protected by cgroup_mutex. | ||
| 169 | */ | 171 | */ |
| 170 | int id; | 172 | int id; |
| 171 | 173 | ||
diff --git a/include/linux/fsnotify_backend.h b/include/linux/fsnotify_backend.h index 3d286ff49ab0..64cf3ef50696 100644 --- a/include/linux/fsnotify_backend.h +++ b/include/linux/fsnotify_backend.h | |||
| @@ -99,7 +99,7 @@ struct fsnotify_ops { | |||
| 99 | struct fsnotify_mark *inode_mark, | 99 | struct fsnotify_mark *inode_mark, |
| 100 | struct fsnotify_mark *vfsmount_mark, | 100 | struct fsnotify_mark *vfsmount_mark, |
| 101 | u32 mask, void *data, int data_type, | 101 | u32 mask, void *data, int data_type, |
| 102 | const unsigned char *file_name); | 102 | const unsigned char *file_name, u32 cookie); |
| 103 | void (*free_group_priv)(struct fsnotify_group *group); | 103 | void (*free_group_priv)(struct fsnotify_group *group); |
| 104 | void (*freeing_mark)(struct fsnotify_mark *mark, struct fsnotify_group *group); | 104 | void (*freeing_mark)(struct fsnotify_mark *mark, struct fsnotify_group *group); |
| 105 | void (*free_event)(struct fsnotify_event *event); | 105 | void (*free_event)(struct fsnotify_event *event); |
| @@ -160,7 +160,7 @@ struct fsnotify_group { | |||
| 160 | 160 | ||
| 161 | struct fasync_struct *fsn_fa; /* async notification */ | 161 | struct fasync_struct *fsn_fa; /* async notification */ |
| 162 | 162 | ||
| 163 | struct fsnotify_event overflow_event; /* Event we queue when the | 163 | struct fsnotify_event *overflow_event; /* Event we queue when the |
| 164 | * notification list is too | 164 | * notification list is too |
| 165 | * full */ | 165 | * full */ |
| 166 | 166 | ||
diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h index db512014e061..b826239bdce0 100644 --- a/include/linux/huge_mm.h +++ b/include/linux/huge_mm.h | |||
| @@ -157,46 +157,6 @@ static inline int hpage_nr_pages(struct page *page) | |||
| 157 | return HPAGE_PMD_NR; | 157 | return HPAGE_PMD_NR; |
| 158 | return 1; | 158 | return 1; |
| 159 | } | 159 | } |
| 160 | /* | ||
| 161 | * compound_trans_head() should be used instead of compound_head(), | ||
| 162 | * whenever the "page" passed as parameter could be the tail of a | ||
| 163 | * transparent hugepage that could be undergoing a | ||
| 164 | * __split_huge_page_refcount(). The page structure layout often | ||
| 165 | * changes across releases and it makes extensive use of unions. So if | ||
| 166 | * the page structure layout will change in a way that | ||
| 167 | * page->first_page gets clobbered by __split_huge_page_refcount, the | ||
| 168 | * implementation making use of smp_rmb() will be required. | ||
| 169 | * | ||
| 170 | * Currently we define compound_trans_head as compound_head, because | ||
| 171 | * page->private is in the same union with page->first_page, and | ||
| 172 | * page->private isn't clobbered. However this also means we're | ||
| 173 | * currently leaving dirt into the page->private field of anonymous | ||
| 174 | * pages resulting from a THP split, instead of setting page->private | ||
| 175 | * to zero like for every other page that has PG_private not set. But | ||
| 176 | * anonymous pages don't use page->private so this is not a problem. | ||
| 177 | */ | ||
| 178 | #if 0 | ||
| 179 | /* This will be needed if page->private will be clobbered in split_huge_page */ | ||
| 180 | static inline struct page *compound_trans_head(struct page *page) | ||
| 181 | { | ||
| 182 | if (PageTail(page)) { | ||
| 183 | struct page *head; | ||
| 184 | head = page->first_page; | ||
| 185 | smp_rmb(); | ||
| 186 | /* | ||
| 187 | * head may be a dangling pointer. | ||
| 188 | * __split_huge_page_refcount clears PageTail before | ||
| 189 | * overwriting first_page, so if PageTail is still | ||
| 190 | * there it means the head pointer isn't dangling. | ||
| 191 | */ | ||
| 192 | if (PageTail(page)) | ||
| 193 | return head; | ||
| 194 | } | ||
| 195 | return page; | ||
| 196 | } | ||
| 197 | #else | ||
| 198 | #define compound_trans_head(page) compound_head(page) | ||
| 199 | #endif | ||
| 200 | 160 | ||
| 201 | extern int do_huge_pmd_numa_page(struct mm_struct *mm, struct vm_area_struct *vma, | 161 | extern int do_huge_pmd_numa_page(struct mm_struct *mm, struct vm_area_struct *vma, |
| 202 | unsigned long addr, pmd_t pmd, pmd_t *pmdp); | 162 | unsigned long addr, pmd_t pmd, pmd_t *pmdp); |
| @@ -226,7 +186,6 @@ static inline int split_huge_page(struct page *page) | |||
| 226 | do { } while (0) | 186 | do { } while (0) |
| 227 | #define split_huge_page_pmd_mm(__mm, __address, __pmd) \ | 187 | #define split_huge_page_pmd_mm(__mm, __address, __pmd) \ |
| 228 | do { } while (0) | 188 | do { } while (0) |
| 229 | #define compound_trans_head(page) compound_head(page) | ||
| 230 | static inline int hugepage_madvise(struct vm_area_struct *vma, | 189 | static inline int hugepage_madvise(struct vm_area_struct *vma, |
| 231 | unsigned long *vm_flags, int advice) | 190 | unsigned long *vm_flags, int advice) |
| 232 | { | 191 | { |
diff --git a/include/linux/ipc_namespace.h b/include/linux/ipc_namespace.h index e7831d203737..35e7eca4e33b 100644 --- a/include/linux/ipc_namespace.h +++ b/include/linux/ipc_namespace.h | |||
| @@ -118,9 +118,7 @@ extern int mq_init_ns(struct ipc_namespace *ns); | |||
| 118 | * the new maximum will handle anyone else. I may have to revisit this | 118 | * the new maximum will handle anyone else. I may have to revisit this |
| 119 | * in the future. | 119 | * in the future. |
| 120 | */ | 120 | */ |
| 121 | #define MIN_QUEUESMAX 1 | ||
| 122 | #define DFLT_QUEUESMAX 256 | 121 | #define DFLT_QUEUESMAX 256 |
| 123 | #define HARD_QUEUESMAX 1024 | ||
| 124 | #define MIN_MSGMAX 1 | 122 | #define MIN_MSGMAX 1 |
| 125 | #define DFLT_MSG 10U | 123 | #define DFLT_MSG 10U |
| 126 | #define DFLT_MSGMAX 10 | 124 | #define DFLT_MSGMAX 10 |
diff --git a/include/linux/kernfs.h b/include/linux/kernfs.h index 5be9f0228a3b..d267623c28cf 100644 --- a/include/linux/kernfs.h +++ b/include/linux/kernfs.h | |||
| @@ -249,7 +249,8 @@ void kernfs_notify(struct kernfs_node *kn); | |||
| 249 | 249 | ||
| 250 | const void *kernfs_super_ns(struct super_block *sb); | 250 | const void *kernfs_super_ns(struct super_block *sb); |
| 251 | struct dentry *kernfs_mount_ns(struct file_system_type *fs_type, int flags, | 251 | struct dentry *kernfs_mount_ns(struct file_system_type *fs_type, int flags, |
| 252 | struct kernfs_root *root, const void *ns); | 252 | struct kernfs_root *root, bool *new_sb_created, |
| 253 | const void *ns); | ||
| 253 | void kernfs_kill_sb(struct super_block *sb); | 254 | void kernfs_kill_sb(struct super_block *sb); |
| 254 | 255 | ||
| 255 | void kernfs_init(void); | 256 | void kernfs_init(void); |
| @@ -317,7 +318,7 @@ static inline const void *kernfs_super_ns(struct super_block *sb) | |||
| 317 | 318 | ||
| 318 | static inline struct dentry * | 319 | static inline struct dentry * |
| 319 | kernfs_mount_ns(struct file_system_type *fs_type, int flags, | 320 | kernfs_mount_ns(struct file_system_type *fs_type, int flags, |
| 320 | struct kernfs_root *root, const void *ns) | 321 | struct kernfs_root *root, bool *new_sb_created, const void *ns) |
| 321 | { return ERR_PTR(-ENOSYS); } | 322 | { return ERR_PTR(-ENOSYS); } |
| 322 | 323 | ||
| 323 | static inline void kernfs_kill_sb(struct super_block *sb) { } | 324 | static inline void kernfs_kill_sb(struct super_block *sb) { } |
| @@ -368,9 +369,9 @@ static inline int kernfs_remove_by_name(struct kernfs_node *parent, | |||
| 368 | 369 | ||
| 369 | static inline struct dentry * | 370 | static inline struct dentry * |
| 370 | kernfs_mount(struct file_system_type *fs_type, int flags, | 371 | kernfs_mount(struct file_system_type *fs_type, int flags, |
| 371 | struct kernfs_root *root) | 372 | struct kernfs_root *root, bool *new_sb_created) |
| 372 | { | 373 | { |
| 373 | return kernfs_mount_ns(fs_type, flags, root, NULL); | 374 | return kernfs_mount_ns(fs_type, flags, root, new_sb_created, NULL); |
| 374 | } | 375 | } |
| 375 | 376 | ||
| 376 | #endif /* __LINUX_KERNFS_H */ | 377 | #endif /* __LINUX_KERNFS_H */ |
diff --git a/include/linux/mfd/max8997-private.h b/include/linux/mfd/max8997-private.h index ad1ae7f345ad..78c76cd4d37b 100644 --- a/include/linux/mfd/max8997-private.h +++ b/include/linux/mfd/max8997-private.h | |||
| @@ -387,7 +387,7 @@ struct max8997_dev { | |||
| 387 | struct i2c_client *muic; /* slave addr 0x4a */ | 387 | struct i2c_client *muic; /* slave addr 0x4a */ |
| 388 | struct mutex iolock; | 388 | struct mutex iolock; |
| 389 | 389 | ||
| 390 | int type; | 390 | unsigned long type; |
| 391 | struct platform_device *battery; /* battery control (not fuel gauge) */ | 391 | struct platform_device *battery; /* battery control (not fuel gauge) */ |
| 392 | 392 | ||
| 393 | int irq; | 393 | int irq; |
diff --git a/include/linux/mfd/max8998-private.h b/include/linux/mfd/max8998-private.h index 4ecb24b4b863..d68ada502ff3 100644 --- a/include/linux/mfd/max8998-private.h +++ b/include/linux/mfd/max8998-private.h | |||
| @@ -163,7 +163,7 @@ struct max8998_dev { | |||
| 163 | int ono; | 163 | int ono; |
| 164 | u8 irq_masks_cur[MAX8998_NUM_IRQ_REGS]; | 164 | u8 irq_masks_cur[MAX8998_NUM_IRQ_REGS]; |
| 165 | u8 irq_masks_cache[MAX8998_NUM_IRQ_REGS]; | 165 | u8 irq_masks_cache[MAX8998_NUM_IRQ_REGS]; |
| 166 | int type; | 166 | unsigned long type; |
| 167 | bool wakeup; | 167 | bool wakeup; |
| 168 | }; | 168 | }; |
| 169 | 169 | ||
diff --git a/include/linux/mfd/tps65217.h b/include/linux/mfd/tps65217.h index a5a7f0130e96..54b5458ec084 100644 --- a/include/linux/mfd/tps65217.h +++ b/include/linux/mfd/tps65217.h | |||
| @@ -252,7 +252,7 @@ struct tps65217_board { | |||
| 252 | struct tps65217 { | 252 | struct tps65217 { |
| 253 | struct device *dev; | 253 | struct device *dev; |
| 254 | struct tps65217_board *pdata; | 254 | struct tps65217_board *pdata; |
| 255 | unsigned int id; | 255 | unsigned long id; |
| 256 | struct regulator_desc desc[TPS65217_NUM_REGULATOR]; | 256 | struct regulator_desc desc[TPS65217_NUM_REGULATOR]; |
| 257 | struct regulator_dev *rdev[TPS65217_NUM_REGULATOR]; | 257 | struct regulator_dev *rdev[TPS65217_NUM_REGULATOR]; |
| 258 | struct regmap *regmap; | 258 | struct regmap *regmap; |
| @@ -263,7 +263,7 @@ static inline struct tps65217 *dev_to_tps65217(struct device *dev) | |||
| 263 | return dev_get_drvdata(dev); | 263 | return dev_get_drvdata(dev); |
| 264 | } | 264 | } |
| 265 | 265 | ||
| 266 | static inline int tps65217_chip_id(struct tps65217 *tps65217) | 266 | static inline unsigned long tps65217_chip_id(struct tps65217 *tps65217) |
| 267 | { | 267 | { |
| 268 | return tps65217->id; | 268 | return tps65217->id; |
| 269 | } | 269 | } |
diff --git a/include/linux/mm.h b/include/linux/mm.h index f28f46eade6a..c1b7414c7bef 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
| @@ -175,7 +175,7 @@ extern unsigned int kobjsize(const void *objp); | |||
| 175 | * Special vmas that are non-mergable, non-mlock()able. | 175 | * Special vmas that are non-mergable, non-mlock()able. |
| 176 | * Note: mm/huge_memory.c VM_NO_THP depends on this definition. | 176 | * Note: mm/huge_memory.c VM_NO_THP depends on this definition. |
| 177 | */ | 177 | */ |
| 178 | #define VM_SPECIAL (VM_IO | VM_DONTEXPAND | VM_PFNMAP) | 178 | #define VM_SPECIAL (VM_IO | VM_DONTEXPAND | VM_PFNMAP | VM_MIXEDMAP) |
| 179 | 179 | ||
| 180 | /* | 180 | /* |
| 181 | * mapping from the currently active vm_flags protection bits (the | 181 | * mapping from the currently active vm_flags protection bits (the |
| @@ -399,8 +399,18 @@ static inline void compound_unlock_irqrestore(struct page *page, | |||
| 399 | 399 | ||
| 400 | static inline struct page *compound_head(struct page *page) | 400 | static inline struct page *compound_head(struct page *page) |
| 401 | { | 401 | { |
| 402 | if (unlikely(PageTail(page))) | 402 | if (unlikely(PageTail(page))) { |
| 403 | return page->first_page; | 403 | struct page *head = page->first_page; |
| 404 | |||
| 405 | /* | ||
| 406 | * page->first_page may be a dangling pointer to an old | ||
| 407 | * compound page, so recheck that it is still a tail | ||
| 408 | * page before returning. | ||
| 409 | */ | ||
| 410 | smp_rmb(); | ||
| 411 | if (likely(PageTail(page))) | ||
| 412 | return head; | ||
| 413 | } | ||
| 404 | return page; | 414 | return page; |
| 405 | } | 415 | } |
| 406 | 416 | ||
| @@ -757,7 +767,7 @@ static inline bool __cpupid_match_pid(pid_t task_pid, int cpupid) | |||
| 757 | #ifdef LAST_CPUPID_NOT_IN_PAGE_FLAGS | 767 | #ifdef LAST_CPUPID_NOT_IN_PAGE_FLAGS |
| 758 | static inline int page_cpupid_xchg_last(struct page *page, int cpupid) | 768 | static inline int page_cpupid_xchg_last(struct page *page, int cpupid) |
| 759 | { | 769 | { |
| 760 | return xchg(&page->_last_cpupid, cpupid); | 770 | return xchg(&page->_last_cpupid, cpupid & LAST_CPUPID_MASK); |
| 761 | } | 771 | } |
| 762 | 772 | ||
| 763 | static inline int page_cpupid_last(struct page *page) | 773 | static inline int page_cpupid_last(struct page *page) |
| @@ -766,7 +776,7 @@ static inline int page_cpupid_last(struct page *page) | |||
| 766 | } | 776 | } |
| 767 | static inline void page_cpupid_reset_last(struct page *page) | 777 | static inline void page_cpupid_reset_last(struct page *page) |
| 768 | { | 778 | { |
| 769 | page->_last_cpupid = -1; | 779 | page->_last_cpupid = -1 & LAST_CPUPID_MASK; |
| 770 | } | 780 | } |
| 771 | #else | 781 | #else |
| 772 | static inline int page_cpupid_last(struct page *page) | 782 | static inline int page_cpupid_last(struct page *page) |
diff --git a/include/linux/pci.h b/include/linux/pci.h index fb57c892b214..33aa2caf0f0c 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h | |||
| @@ -1169,8 +1169,23 @@ void msi_remove_pci_irq_vectors(struct pci_dev *dev); | |||
| 1169 | void pci_restore_msi_state(struct pci_dev *dev); | 1169 | void pci_restore_msi_state(struct pci_dev *dev); |
| 1170 | int pci_msi_enabled(void); | 1170 | int pci_msi_enabled(void); |
| 1171 | int pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec); | 1171 | int pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec); |
| 1172 | static inline int pci_enable_msi_exact(struct pci_dev *dev, int nvec) | ||
| 1173 | { | ||
| 1174 | int rc = pci_enable_msi_range(dev, nvec, nvec); | ||
| 1175 | if (rc < 0) | ||
| 1176 | return rc; | ||
| 1177 | return 0; | ||
| 1178 | } | ||
| 1172 | int pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries, | 1179 | int pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries, |
| 1173 | int minvec, int maxvec); | 1180 | int minvec, int maxvec); |
| 1181 | static inline int pci_enable_msix_exact(struct pci_dev *dev, | ||
| 1182 | struct msix_entry *entries, int nvec) | ||
| 1183 | { | ||
| 1184 | int rc = pci_enable_msix_range(dev, entries, nvec, nvec); | ||
| 1185 | if (rc < 0) | ||
| 1186 | return rc; | ||
| 1187 | return 0; | ||
| 1188 | } | ||
| 1174 | #else | 1189 | #else |
| 1175 | static inline int pci_msi_vec_count(struct pci_dev *dev) { return -ENOSYS; } | 1190 | static inline int pci_msi_vec_count(struct pci_dev *dev) { return -ENOSYS; } |
| 1176 | static inline int pci_enable_msi_block(struct pci_dev *dev, int nvec) | 1191 | static inline int pci_enable_msi_block(struct pci_dev *dev, int nvec) |
| @@ -1189,9 +1204,14 @@ static inline int pci_msi_enabled(void) { return 0; } | |||
| 1189 | static inline int pci_enable_msi_range(struct pci_dev *dev, int minvec, | 1204 | static inline int pci_enable_msi_range(struct pci_dev *dev, int minvec, |
| 1190 | int maxvec) | 1205 | int maxvec) |
| 1191 | { return -ENOSYS; } | 1206 | { return -ENOSYS; } |
| 1207 | static inline int pci_enable_msi_exact(struct pci_dev *dev, int nvec) | ||
| 1208 | { return -ENOSYS; } | ||
| 1192 | static inline int pci_enable_msix_range(struct pci_dev *dev, | 1209 | static inline int pci_enable_msix_range(struct pci_dev *dev, |
| 1193 | struct msix_entry *entries, int minvec, int maxvec) | 1210 | struct msix_entry *entries, int minvec, int maxvec) |
| 1194 | { return -ENOSYS; } | 1211 | { return -ENOSYS; } |
| 1212 | static inline int pci_enable_msix_exact(struct pci_dev *dev, | ||
| 1213 | struct msix_entry *entries, int nvec) | ||
| 1214 | { return -ENOSYS; } | ||
| 1195 | #endif | 1215 | #endif |
| 1196 | 1216 | ||
| 1197 | #ifdef CONFIG_PCIEPORTBUS | 1217 | #ifdef CONFIG_PCIEPORTBUS |
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index 40ed9e9a77e5..a747a77ea584 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h | |||
| @@ -281,13 +281,15 @@ asmlinkage long sys_sched_setscheduler(pid_t pid, int policy, | |||
| 281 | asmlinkage long sys_sched_setparam(pid_t pid, | 281 | asmlinkage long sys_sched_setparam(pid_t pid, |
| 282 | struct sched_param __user *param); | 282 | struct sched_param __user *param); |
| 283 | asmlinkage long sys_sched_setattr(pid_t pid, | 283 | asmlinkage long sys_sched_setattr(pid_t pid, |
| 284 | struct sched_attr __user *attr); | 284 | struct sched_attr __user *attr, |
| 285 | unsigned int flags); | ||
| 285 | asmlinkage long sys_sched_getscheduler(pid_t pid); | 286 | asmlinkage long sys_sched_getscheduler(pid_t pid); |
| 286 | asmlinkage long sys_sched_getparam(pid_t pid, | 287 | asmlinkage long sys_sched_getparam(pid_t pid, |
| 287 | struct sched_param __user *param); | 288 | struct sched_param __user *param); |
| 288 | asmlinkage long sys_sched_getattr(pid_t pid, | 289 | asmlinkage long sys_sched_getattr(pid_t pid, |
| 289 | struct sched_attr __user *attr, | 290 | struct sched_attr __user *attr, |
| 290 | unsigned int size); | 291 | unsigned int size, |
| 292 | unsigned int flags); | ||
| 291 | asmlinkage long sys_sched_setaffinity(pid_t pid, unsigned int len, | 293 | asmlinkage long sys_sched_setaffinity(pid_t pid, unsigned int len, |
| 292 | unsigned long __user *user_mask_ptr); | 294 | unsigned long __user *user_mask_ptr); |
| 293 | asmlinkage long sys_sched_getaffinity(pid_t pid, unsigned int len, | 295 | asmlinkage long sys_sched_getaffinity(pid_t pid, unsigned int len, |
diff --git a/include/linux/workqueue.h b/include/linux/workqueue.h index 594521ba0d43..704f4f652d0a 100644 --- a/include/linux/workqueue.h +++ b/include/linux/workqueue.h | |||
| @@ -419,10 +419,7 @@ __alloc_workqueue_key(const char *fmt, unsigned int flags, int max_active, | |||
| 419 | static struct lock_class_key __key; \ | 419 | static struct lock_class_key __key; \ |
| 420 | const char *__lock_name; \ | 420 | const char *__lock_name; \ |
| 421 | \ | 421 | \ |
| 422 | if (__builtin_constant_p(fmt)) \ | 422 | __lock_name = #fmt#args; \ |
| 423 | __lock_name = (fmt); \ | ||
| 424 | else \ | ||
| 425 | __lock_name = #fmt; \ | ||
| 426 | \ | 423 | \ |
| 427 | __alloc_workqueue_key((fmt), (flags), (max_active), \ | 424 | __alloc_workqueue_key((fmt), (flags), (max_active), \ |
| 428 | &__key, __lock_name, ##args); \ | 425 | &__key, __lock_name, ##args); \ |
diff --git a/include/linux/writeback.h b/include/linux/writeback.h index fc0e4320aa6d..021b8a319b9e 100644 --- a/include/linux/writeback.h +++ b/include/linux/writeback.h | |||
| @@ -97,7 +97,7 @@ void writeback_inodes_sb_nr(struct super_block *, unsigned long nr, | |||
| 97 | int try_to_writeback_inodes_sb(struct super_block *, enum wb_reason reason); | 97 | int try_to_writeback_inodes_sb(struct super_block *, enum wb_reason reason); |
| 98 | int try_to_writeback_inodes_sb_nr(struct super_block *, unsigned long nr, | 98 | int try_to_writeback_inodes_sb_nr(struct super_block *, unsigned long nr, |
| 99 | enum wb_reason reason); | 99 | enum wb_reason reason); |
| 100 | void sync_inodes_sb(struct super_block *sb, unsigned long older_than_this); | 100 | void sync_inodes_sb(struct super_block *); |
| 101 | void wakeup_flusher_threads(long nr_pages, enum wb_reason reason); | 101 | void wakeup_flusher_threads(long nr_pages, enum wb_reason reason); |
| 102 | void inode_wait_for_writeback(struct inode *inode); | 102 | void inode_wait_for_writeback(struct inode *inode); |
| 103 | 103 | ||
diff --git a/include/sound/soc-dapm.h b/include/sound/soc-dapm.h index 68d92e36facd..6e89ef6c11c1 100644 --- a/include/sound/soc-dapm.h +++ b/include/sound/soc-dapm.h | |||
| @@ -449,14 +449,22 @@ void snd_soc_dapm_debugfs_init(struct snd_soc_dapm_context *dapm, | |||
| 449 | /* dapm audio pin control and status */ | 449 | /* dapm audio pin control and status */ |
| 450 | int snd_soc_dapm_enable_pin(struct snd_soc_dapm_context *dapm, | 450 | int snd_soc_dapm_enable_pin(struct snd_soc_dapm_context *dapm, |
| 451 | const char *pin); | 451 | const char *pin); |
| 452 | int snd_soc_dapm_enable_pin_unlocked(struct snd_soc_dapm_context *dapm, | ||
| 453 | const char *pin); | ||
| 452 | int snd_soc_dapm_disable_pin(struct snd_soc_dapm_context *dapm, | 454 | int snd_soc_dapm_disable_pin(struct snd_soc_dapm_context *dapm, |
| 453 | const char *pin); | 455 | const char *pin); |
| 456 | int snd_soc_dapm_disable_pin_unlocked(struct snd_soc_dapm_context *dapm, | ||
| 457 | const char *pin); | ||
| 454 | int snd_soc_dapm_nc_pin(struct snd_soc_dapm_context *dapm, const char *pin); | 458 | int snd_soc_dapm_nc_pin(struct snd_soc_dapm_context *dapm, const char *pin); |
| 459 | int snd_soc_dapm_nc_pin_unlocked(struct snd_soc_dapm_context *dapm, | ||
| 460 | const char *pin); | ||
| 455 | int snd_soc_dapm_get_pin_status(struct snd_soc_dapm_context *dapm, | 461 | int snd_soc_dapm_get_pin_status(struct snd_soc_dapm_context *dapm, |
| 456 | const char *pin); | 462 | const char *pin); |
| 457 | int snd_soc_dapm_sync(struct snd_soc_dapm_context *dapm); | 463 | int snd_soc_dapm_sync(struct snd_soc_dapm_context *dapm); |
| 458 | int snd_soc_dapm_force_enable_pin(struct snd_soc_dapm_context *dapm, | 464 | int snd_soc_dapm_force_enable_pin(struct snd_soc_dapm_context *dapm, |
| 459 | const char *pin); | 465 | const char *pin); |
| 466 | int snd_soc_dapm_force_enable_pin_unlocked(struct snd_soc_dapm_context *dapm, | ||
| 467 | const char *pin); | ||
| 460 | int snd_soc_dapm_ignore_suspend(struct snd_soc_dapm_context *dapm, | 468 | int snd_soc_dapm_ignore_suspend(struct snd_soc_dapm_context *dapm, |
| 461 | const char *pin); | 469 | const char *pin); |
| 462 | void snd_soc_dapm_auto_nc_codec_pins(struct snd_soc_codec *codec); | 470 | void snd_soc_dapm_auto_nc_codec_pins(struct snd_soc_codec *codec); |
diff --git a/include/trace/events/writeback.h b/include/trace/events/writeback.h index c7bbbe794e65..464ea82e10db 100644 --- a/include/trace/events/writeback.h +++ b/include/trace/events/writeback.h | |||
| @@ -287,11 +287,11 @@ TRACE_EVENT(writeback_queue_io, | |||
| 287 | __field(int, reason) | 287 | __field(int, reason) |
| 288 | ), | 288 | ), |
| 289 | TP_fast_assign( | 289 | TP_fast_assign( |
| 290 | unsigned long older_than_this = work->older_than_this; | 290 | unsigned long *older_than_this = work->older_than_this; |
| 291 | strncpy(__entry->name, dev_name(wb->bdi->dev), 32); | 291 | strncpy(__entry->name, dev_name(wb->bdi->dev), 32); |
| 292 | __entry->older = older_than_this; | 292 | __entry->older = older_than_this ? *older_than_this : 0; |
| 293 | __entry->age = older_than_this ? | 293 | __entry->age = older_than_this ? |
| 294 | (jiffies - older_than_this) * 1000 / HZ : -1; | 294 | (jiffies - *older_than_this) * 1000 / HZ : -1; |
| 295 | __entry->moved = moved; | 295 | __entry->moved = moved; |
| 296 | __entry->reason = work->reason; | 296 | __entry->reason = work->reason; |
| 297 | ), | 297 | ), |
diff --git a/include/uapi/asm-generic/unistd.h b/include/uapi/asm-generic/unistd.h index a20a9b4d3871..dde8041f40d2 100644 --- a/include/uapi/asm-generic/unistd.h +++ b/include/uapi/asm-generic/unistd.h | |||
| @@ -692,9 +692,13 @@ __SC_COMP(__NR_process_vm_writev, sys_process_vm_writev, \ | |||
| 692 | __SYSCALL(__NR_kcmp, sys_kcmp) | 692 | __SYSCALL(__NR_kcmp, sys_kcmp) |
| 693 | #define __NR_finit_module 273 | 693 | #define __NR_finit_module 273 |
| 694 | __SYSCALL(__NR_finit_module, sys_finit_module) | 694 | __SYSCALL(__NR_finit_module, sys_finit_module) |
| 695 | #define __NR_sched_setattr 274 | ||
| 696 | __SYSCALL(__NR_sched_setattr, sys_sched_setattr) | ||
| 697 | #define __NR_sched_getattr 275 | ||
| 698 | __SYSCALL(__NR_sched_getattr, sys_sched_getattr) | ||
| 695 | 699 | ||
| 696 | #undef __NR_syscalls | 700 | #undef __NR_syscalls |
| 697 | #define __NR_syscalls 274 | 701 | #define __NR_syscalls 276 |
| 698 | 702 | ||
| 699 | /* | 703 | /* |
| 700 | * All syscalls below here should go away really, | 704 | * All syscalls below here should go away really, |
diff --git a/ipc/mq_sysctl.c b/ipc/mq_sysctl.c index 383d638340b8..5bb8bfe67149 100644 --- a/ipc/mq_sysctl.c +++ b/ipc/mq_sysctl.c | |||
| @@ -22,6 +22,16 @@ static void *get_mq(ctl_table *table) | |||
| 22 | return which; | 22 | return which; |
| 23 | } | 23 | } |
| 24 | 24 | ||
| 25 | static int proc_mq_dointvec(ctl_table *table, int write, | ||
| 26 | void __user *buffer, size_t *lenp, loff_t *ppos) | ||
| 27 | { | ||
| 28 | struct ctl_table mq_table; | ||
| 29 | memcpy(&mq_table, table, sizeof(mq_table)); | ||
| 30 | mq_table.data = get_mq(table); | ||
| 31 | |||
| 32 | return proc_dointvec(&mq_table, write, buffer, lenp, ppos); | ||
| 33 | } | ||
| 34 | |||
| 25 | static int proc_mq_dointvec_minmax(ctl_table *table, int write, | 35 | static int proc_mq_dointvec_minmax(ctl_table *table, int write, |
| 26 | void __user *buffer, size_t *lenp, loff_t *ppos) | 36 | void __user *buffer, size_t *lenp, loff_t *ppos) |
| 27 | { | 37 | { |
| @@ -33,12 +43,10 @@ static int proc_mq_dointvec_minmax(ctl_table *table, int write, | |||
| 33 | lenp, ppos); | 43 | lenp, ppos); |
| 34 | } | 44 | } |
| 35 | #else | 45 | #else |
| 46 | #define proc_mq_dointvec NULL | ||
| 36 | #define proc_mq_dointvec_minmax NULL | 47 | #define proc_mq_dointvec_minmax NULL |
| 37 | #endif | 48 | #endif |
| 38 | 49 | ||
| 39 | static int msg_queues_limit_min = MIN_QUEUESMAX; | ||
| 40 | static int msg_queues_limit_max = HARD_QUEUESMAX; | ||
| 41 | |||
| 42 | static int msg_max_limit_min = MIN_MSGMAX; | 50 | static int msg_max_limit_min = MIN_MSGMAX; |
| 43 | static int msg_max_limit_max = HARD_MSGMAX; | 51 | static int msg_max_limit_max = HARD_MSGMAX; |
| 44 | 52 | ||
| @@ -51,9 +59,7 @@ static ctl_table mq_sysctls[] = { | |||
| 51 | .data = &init_ipc_ns.mq_queues_max, | 59 | .data = &init_ipc_ns.mq_queues_max, |
| 52 | .maxlen = sizeof(int), | 60 | .maxlen = sizeof(int), |
| 53 | .mode = 0644, | 61 | .mode = 0644, |
| 54 | .proc_handler = proc_mq_dointvec_minmax, | 62 | .proc_handler = proc_mq_dointvec, |
| 55 | .extra1 = &msg_queues_limit_min, | ||
| 56 | .extra2 = &msg_queues_limit_max, | ||
| 57 | }, | 63 | }, |
| 58 | { | 64 | { |
| 59 | .procname = "msg_max", | 65 | .procname = "msg_max", |
diff --git a/ipc/mqueue.c b/ipc/mqueue.c index ccf1f9fd263a..c3b31179122c 100644 --- a/ipc/mqueue.c +++ b/ipc/mqueue.c | |||
| @@ -433,9 +433,9 @@ static int mqueue_create(struct inode *dir, struct dentry *dentry, | |||
| 433 | error = -EACCES; | 433 | error = -EACCES; |
| 434 | goto out_unlock; | 434 | goto out_unlock; |
| 435 | } | 435 | } |
| 436 | if (ipc_ns->mq_queues_count >= HARD_QUEUESMAX || | 436 | |
| 437 | (ipc_ns->mq_queues_count >= ipc_ns->mq_queues_max && | 437 | if (ipc_ns->mq_queues_count >= ipc_ns->mq_queues_max && |
| 438 | !capable(CAP_SYS_RESOURCE))) { | 438 | !capable(CAP_SYS_RESOURCE)) { |
| 439 | error = -ENOSPC; | 439 | error = -ENOSPC; |
| 440 | goto out_unlock; | 440 | goto out_unlock; |
| 441 | } | 441 | } |
diff --git a/kernel/audit_tree.c b/kernel/audit_tree.c index 67ccf0e7cca9..135944a7b28a 100644 --- a/kernel/audit_tree.c +++ b/kernel/audit_tree.c | |||
| @@ -916,7 +916,7 @@ static int audit_tree_handle_event(struct fsnotify_group *group, | |||
| 916 | struct fsnotify_mark *inode_mark, | 916 | struct fsnotify_mark *inode_mark, |
| 917 | struct fsnotify_mark *vfsmount_mark, | 917 | struct fsnotify_mark *vfsmount_mark, |
| 918 | u32 mask, void *data, int data_type, | 918 | u32 mask, void *data, int data_type, |
| 919 | const unsigned char *file_name) | 919 | const unsigned char *file_name, u32 cookie) |
| 920 | { | 920 | { |
| 921 | return 0; | 921 | return 0; |
| 922 | } | 922 | } |
diff --git a/kernel/audit_watch.c b/kernel/audit_watch.c index 2596fac5dcb4..70b4554d2fbe 100644 --- a/kernel/audit_watch.c +++ b/kernel/audit_watch.c | |||
| @@ -471,7 +471,7 @@ static int audit_watch_handle_event(struct fsnotify_group *group, | |||
| 471 | struct fsnotify_mark *inode_mark, | 471 | struct fsnotify_mark *inode_mark, |
| 472 | struct fsnotify_mark *vfsmount_mark, | 472 | struct fsnotify_mark *vfsmount_mark, |
| 473 | u32 mask, void *data, int data_type, | 473 | u32 mask, void *data, int data_type, |
| 474 | const unsigned char *dname) | 474 | const unsigned char *dname, u32 cookie) |
| 475 | { | 475 | { |
| 476 | struct inode *inode; | 476 | struct inode *inode; |
| 477 | struct audit_parent *parent; | 477 | struct audit_parent *parent; |
diff --git a/kernel/cgroup.c b/kernel/cgroup.c index e2f46ba37f72..105f273b6f86 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c | |||
| @@ -886,7 +886,9 @@ static void cgroup_diput(struct dentry *dentry, struct inode *inode) | |||
| 886 | * per-subsystem and moved to css->id so that lookups are | 886 | * per-subsystem and moved to css->id so that lookups are |
| 887 | * successful until the target css is released. | 887 | * successful until the target css is released. |
| 888 | */ | 888 | */ |
| 889 | mutex_lock(&cgroup_mutex); | ||
| 889 | idr_remove(&cgrp->root->cgroup_idr, cgrp->id); | 890 | idr_remove(&cgrp->root->cgroup_idr, cgrp->id); |
| 891 | mutex_unlock(&cgroup_mutex); | ||
| 890 | cgrp->id = -1; | 892 | cgrp->id = -1; |
| 891 | 893 | ||
| 892 | call_rcu(&cgrp->rcu_head, cgroup_free_rcu); | 894 | call_rcu(&cgrp->rcu_head, cgroup_free_rcu); |
| @@ -1566,10 +1568,10 @@ static struct dentry *cgroup_mount(struct file_system_type *fs_type, | |||
| 1566 | mutex_lock(&cgroup_mutex); | 1568 | mutex_lock(&cgroup_mutex); |
| 1567 | mutex_lock(&cgroup_root_mutex); | 1569 | mutex_lock(&cgroup_root_mutex); |
| 1568 | 1570 | ||
| 1569 | root_cgrp->id = idr_alloc(&root->cgroup_idr, root_cgrp, | 1571 | ret = idr_alloc(&root->cgroup_idr, root_cgrp, 0, 1, GFP_KERNEL); |
| 1570 | 0, 1, GFP_KERNEL); | 1572 | if (ret < 0) |
| 1571 | if (root_cgrp->id < 0) | ||
| 1572 | goto unlock_drop; | 1573 | goto unlock_drop; |
| 1574 | root_cgrp->id = ret; | ||
| 1573 | 1575 | ||
| 1574 | /* Check for name clashes with existing mounts */ | 1576 | /* Check for name clashes with existing mounts */ |
| 1575 | ret = -EBUSY; | 1577 | ret = -EBUSY; |
| @@ -2763,10 +2765,7 @@ static int cgroup_cfts_commit(struct cftype *cfts, bool is_add) | |||
| 2763 | */ | 2765 | */ |
| 2764 | update_before = cgroup_serial_nr_next; | 2766 | update_before = cgroup_serial_nr_next; |
| 2765 | 2767 | ||
| 2766 | mutex_unlock(&cgroup_mutex); | ||
| 2767 | |||
| 2768 | /* add/rm files for all cgroups created before */ | 2768 | /* add/rm files for all cgroups created before */ |
| 2769 | rcu_read_lock(); | ||
| 2770 | css_for_each_descendant_pre(css, cgroup_css(root, ss)) { | 2769 | css_for_each_descendant_pre(css, cgroup_css(root, ss)) { |
| 2771 | struct cgroup *cgrp = css->cgroup; | 2770 | struct cgroup *cgrp = css->cgroup; |
| 2772 | 2771 | ||
| @@ -2775,23 +2774,19 @@ static int cgroup_cfts_commit(struct cftype *cfts, bool is_add) | |||
| 2775 | 2774 | ||
| 2776 | inode = cgrp->dentry->d_inode; | 2775 | inode = cgrp->dentry->d_inode; |
| 2777 | dget(cgrp->dentry); | 2776 | dget(cgrp->dentry); |
| 2778 | rcu_read_unlock(); | ||
| 2779 | |||
| 2780 | dput(prev); | 2777 | dput(prev); |
| 2781 | prev = cgrp->dentry; | 2778 | prev = cgrp->dentry; |
| 2782 | 2779 | ||
| 2780 | mutex_unlock(&cgroup_mutex); | ||
| 2783 | mutex_lock(&inode->i_mutex); | 2781 | mutex_lock(&inode->i_mutex); |
| 2784 | mutex_lock(&cgroup_mutex); | 2782 | mutex_lock(&cgroup_mutex); |
| 2785 | if (cgrp->serial_nr < update_before && !cgroup_is_dead(cgrp)) | 2783 | if (cgrp->serial_nr < update_before && !cgroup_is_dead(cgrp)) |
| 2786 | ret = cgroup_addrm_files(cgrp, cfts, is_add); | 2784 | ret = cgroup_addrm_files(cgrp, cfts, is_add); |
| 2787 | mutex_unlock(&cgroup_mutex); | ||
| 2788 | mutex_unlock(&inode->i_mutex); | 2785 | mutex_unlock(&inode->i_mutex); |
| 2789 | |||
| 2790 | rcu_read_lock(); | ||
| 2791 | if (ret) | 2786 | if (ret) |
| 2792 | break; | 2787 | break; |
| 2793 | } | 2788 | } |
| 2794 | rcu_read_unlock(); | 2789 | mutex_unlock(&cgroup_mutex); |
| 2795 | dput(prev); | 2790 | dput(prev); |
| 2796 | deactivate_super(sb); | 2791 | deactivate_super(sb); |
| 2797 | return ret; | 2792 | return ret; |
| @@ -2910,9 +2905,14 @@ static void cgroup_enable_task_cg_lists(void) | |||
| 2910 | * We should check if the process is exiting, otherwise | 2905 | * We should check if the process is exiting, otherwise |
| 2911 | * it will race with cgroup_exit() in that the list | 2906 | * it will race with cgroup_exit() in that the list |
| 2912 | * entry won't be deleted though the process has exited. | 2907 | * entry won't be deleted though the process has exited. |
| 2908 | * Do it while holding siglock so that we don't end up | ||
| 2909 | * racing against cgroup_exit(). | ||
| 2913 | */ | 2910 | */ |
| 2911 | spin_lock_irq(&p->sighand->siglock); | ||
| 2914 | if (!(p->flags & PF_EXITING) && list_empty(&p->cg_list)) | 2912 | if (!(p->flags & PF_EXITING) && list_empty(&p->cg_list)) |
| 2915 | list_add(&p->cg_list, &task_css_set(p)->tasks); | 2913 | list_add(&p->cg_list, &task_css_set(p)->tasks); |
| 2914 | spin_unlock_irq(&p->sighand->siglock); | ||
| 2915 | |||
| 2916 | task_unlock(p); | 2916 | task_unlock(p); |
| 2917 | } while_each_thread(g, p); | 2917 | } while_each_thread(g, p); |
| 2918 | read_unlock(&tasklist_lock); | 2918 | read_unlock(&tasklist_lock); |
| @@ -4158,7 +4158,7 @@ static long cgroup_create(struct cgroup *parent, struct dentry *dentry, | |||
| 4158 | struct cgroup *cgrp; | 4158 | struct cgroup *cgrp; |
| 4159 | struct cgroup_name *name; | 4159 | struct cgroup_name *name; |
| 4160 | struct cgroupfs_root *root = parent->root; | 4160 | struct cgroupfs_root *root = parent->root; |
| 4161 | int ssid, err = 0; | 4161 | int ssid, err; |
| 4162 | struct cgroup_subsys *ss; | 4162 | struct cgroup_subsys *ss; |
| 4163 | struct super_block *sb = root->sb; | 4163 | struct super_block *sb = root->sb; |
| 4164 | 4164 | ||
| @@ -4168,19 +4168,13 @@ static long cgroup_create(struct cgroup *parent, struct dentry *dentry, | |||
| 4168 | return -ENOMEM; | 4168 | return -ENOMEM; |
| 4169 | 4169 | ||
| 4170 | name = cgroup_alloc_name(dentry); | 4170 | name = cgroup_alloc_name(dentry); |
| 4171 | if (!name) | 4171 | if (!name) { |
| 4172 | err = -ENOMEM; | ||
| 4172 | goto err_free_cgrp; | 4173 | goto err_free_cgrp; |
| 4174 | } | ||
| 4173 | rcu_assign_pointer(cgrp->name, name); | 4175 | rcu_assign_pointer(cgrp->name, name); |
| 4174 | 4176 | ||
| 4175 | /* | 4177 | /* |
| 4176 | * Temporarily set the pointer to NULL, so idr_find() won't return | ||
| 4177 | * a half-baked cgroup. | ||
| 4178 | */ | ||
| 4179 | cgrp->id = idr_alloc(&root->cgroup_idr, NULL, 1, 0, GFP_KERNEL); | ||
| 4180 | if (cgrp->id < 0) | ||
| 4181 | goto err_free_name; | ||
| 4182 | |||
| 4183 | /* | ||
| 4184 | * Only live parents can have children. Note that the liveliness | 4178 | * Only live parents can have children. Note that the liveliness |
| 4185 | * check isn't strictly necessary because cgroup_mkdir() and | 4179 | * check isn't strictly necessary because cgroup_mkdir() and |
| 4186 | * cgroup_rmdir() are fully synchronized by i_mutex; however, do it | 4180 | * cgroup_rmdir() are fully synchronized by i_mutex; however, do it |
| @@ -4189,7 +4183,17 @@ static long cgroup_create(struct cgroup *parent, struct dentry *dentry, | |||
| 4189 | */ | 4183 | */ |
| 4190 | if (!cgroup_lock_live_group(parent)) { | 4184 | if (!cgroup_lock_live_group(parent)) { |
| 4191 | err = -ENODEV; | 4185 | err = -ENODEV; |
| 4192 | goto err_free_id; | 4186 | goto err_free_name; |
| 4187 | } | ||
| 4188 | |||
| 4189 | /* | ||
| 4190 | * Temporarily set the pointer to NULL, so idr_find() won't return | ||
| 4191 | * a half-baked cgroup. | ||
| 4192 | */ | ||
| 4193 | cgrp->id = idr_alloc(&root->cgroup_idr, NULL, 1, 0, GFP_KERNEL); | ||
| 4194 | if (cgrp->id < 0) { | ||
| 4195 | err = -ENOMEM; | ||
| 4196 | goto err_unlock; | ||
| 4193 | } | 4197 | } |
| 4194 | 4198 | ||
| 4195 | /* Grab a reference on the superblock so the hierarchy doesn't | 4199 | /* Grab a reference on the superblock so the hierarchy doesn't |
| @@ -4221,7 +4225,7 @@ static long cgroup_create(struct cgroup *parent, struct dentry *dentry, | |||
| 4221 | */ | 4225 | */ |
| 4222 | err = cgroup_create_file(dentry, S_IFDIR | mode, sb); | 4226 | err = cgroup_create_file(dentry, S_IFDIR | mode, sb); |
| 4223 | if (err < 0) | 4227 | if (err < 0) |
| 4224 | goto err_unlock; | 4228 | goto err_free_id; |
| 4225 | lockdep_assert_held(&dentry->d_inode->i_mutex); | 4229 | lockdep_assert_held(&dentry->d_inode->i_mutex); |
| 4226 | 4230 | ||
| 4227 | cgrp->serial_nr = cgroup_serial_nr_next++; | 4231 | cgrp->serial_nr = cgroup_serial_nr_next++; |
| @@ -4257,12 +4261,12 @@ static long cgroup_create(struct cgroup *parent, struct dentry *dentry, | |||
| 4257 | 4261 | ||
| 4258 | return 0; | 4262 | return 0; |
| 4259 | 4263 | ||
| 4260 | err_unlock: | ||
| 4261 | mutex_unlock(&cgroup_mutex); | ||
| 4262 | /* Release the reference count that we took on the superblock */ | ||
| 4263 | deactivate_super(sb); | ||
| 4264 | err_free_id: | 4264 | err_free_id: |
| 4265 | idr_remove(&root->cgroup_idr, cgrp->id); | 4265 | idr_remove(&root->cgroup_idr, cgrp->id); |
| 4266 | /* Release the reference count that we took on the superblock */ | ||
| 4267 | deactivate_super(sb); | ||
| 4268 | err_unlock: | ||
| 4269 | mutex_unlock(&cgroup_mutex); | ||
| 4266 | err_free_name: | 4270 | err_free_name: |
| 4267 | kfree(rcu_dereference_raw(cgrp->name)); | 4271 | kfree(rcu_dereference_raw(cgrp->name)); |
| 4268 | err_free_cgrp: | 4272 | err_free_cgrp: |
diff --git a/kernel/events/core.c b/kernel/events/core.c index 56003c6edfd3..fa0b2d4ad83c 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c | |||
| @@ -7856,14 +7856,14 @@ static void perf_pmu_rotate_stop(struct pmu *pmu) | |||
| 7856 | static void __perf_event_exit_context(void *__info) | 7856 | static void __perf_event_exit_context(void *__info) |
| 7857 | { | 7857 | { |
| 7858 | struct perf_event_context *ctx = __info; | 7858 | struct perf_event_context *ctx = __info; |
| 7859 | struct perf_event *event, *tmp; | 7859 | struct perf_event *event; |
| 7860 | 7860 | ||
| 7861 | perf_pmu_rotate_stop(ctx->pmu); | 7861 | perf_pmu_rotate_stop(ctx->pmu); |
| 7862 | 7862 | ||
| 7863 | list_for_each_entry_safe(event, tmp, &ctx->pinned_groups, group_entry) | 7863 | rcu_read_lock(); |
| 7864 | __perf_remove_from_context(event); | 7864 | list_for_each_entry_rcu(event, &ctx->event_list, event_entry) |
| 7865 | list_for_each_entry_safe(event, tmp, &ctx->flexible_groups, group_entry) | ||
| 7866 | __perf_remove_from_context(event); | 7865 | __perf_remove_from_context(event); |
| 7866 | rcu_read_unlock(); | ||
| 7867 | } | 7867 | } |
| 7868 | 7868 | ||
| 7869 | static void perf_event_exit_cpu_context(int cpu) | 7869 | static void perf_event_exit_cpu_context(int cpu) |
| @@ -7887,11 +7887,11 @@ static void perf_event_exit_cpu(int cpu) | |||
| 7887 | { | 7887 | { |
| 7888 | struct swevent_htable *swhash = &per_cpu(swevent_htable, cpu); | 7888 | struct swevent_htable *swhash = &per_cpu(swevent_htable, cpu); |
| 7889 | 7889 | ||
| 7890 | perf_event_exit_cpu_context(cpu); | ||
| 7891 | |||
| 7890 | mutex_lock(&swhash->hlist_mutex); | 7892 | mutex_lock(&swhash->hlist_mutex); |
| 7891 | swevent_hlist_release(swhash); | 7893 | swevent_hlist_release(swhash); |
| 7892 | mutex_unlock(&swhash->hlist_mutex); | 7894 | mutex_unlock(&swhash->hlist_mutex); |
| 7893 | |||
| 7894 | perf_event_exit_cpu_context(cpu); | ||
| 7895 | } | 7895 | } |
| 7896 | #else | 7896 | #else |
| 7897 | static inline void perf_event_exit_cpu(int cpu) { } | 7897 | static inline void perf_event_exit_cpu(int cpu) { } |
diff --git a/kernel/power/console.c b/kernel/power/console.c index eacb8bd8cab4..aba9c545a0e3 100644 --- a/kernel/power/console.c +++ b/kernel/power/console.c | |||
| @@ -9,6 +9,7 @@ | |||
| 9 | #include <linux/kbd_kern.h> | 9 | #include <linux/kbd_kern.h> |
| 10 | #include <linux/vt.h> | 10 | #include <linux/vt.h> |
| 11 | #include <linux/module.h> | 11 | #include <linux/module.h> |
| 12 | #include <linux/slab.h> | ||
| 12 | #include "power.h" | 13 | #include "power.h" |
| 13 | 14 | ||
| 14 | #define SUSPEND_CONSOLE (MAX_NR_CONSOLES-1) | 15 | #define SUSPEND_CONSOLE (MAX_NR_CONSOLES-1) |
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index b46131ef6aab..6edbef296ece 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c | |||
| @@ -1952,7 +1952,7 @@ static int dl_overflow(struct task_struct *p, int policy, | |||
| 1952 | { | 1952 | { |
| 1953 | 1953 | ||
| 1954 | struct dl_bw *dl_b = dl_bw_of(task_cpu(p)); | 1954 | struct dl_bw *dl_b = dl_bw_of(task_cpu(p)); |
| 1955 | u64 period = attr->sched_period; | 1955 | u64 period = attr->sched_period ?: attr->sched_deadline; |
| 1956 | u64 runtime = attr->sched_runtime; | 1956 | u64 runtime = attr->sched_runtime; |
| 1957 | u64 new_bw = dl_policy(policy) ? to_ratio(period, runtime) : 0; | 1957 | u64 new_bw = dl_policy(policy) ? to_ratio(period, runtime) : 0; |
| 1958 | int cpus, err = -1; | 1958 | int cpus, err = -1; |
| @@ -3661,13 +3661,14 @@ SYSCALL_DEFINE2(sched_setparam, pid_t, pid, struct sched_param __user *, param) | |||
| 3661 | * @pid: the pid in question. | 3661 | * @pid: the pid in question. |
| 3662 | * @uattr: structure containing the extended parameters. | 3662 | * @uattr: structure containing the extended parameters. |
| 3663 | */ | 3663 | */ |
| 3664 | SYSCALL_DEFINE2(sched_setattr, pid_t, pid, struct sched_attr __user *, uattr) | 3664 | SYSCALL_DEFINE3(sched_setattr, pid_t, pid, struct sched_attr __user *, uattr, |
| 3665 | unsigned int, flags) | ||
| 3665 | { | 3666 | { |
| 3666 | struct sched_attr attr; | 3667 | struct sched_attr attr; |
| 3667 | struct task_struct *p; | 3668 | struct task_struct *p; |
| 3668 | int retval; | 3669 | int retval; |
| 3669 | 3670 | ||
| 3670 | if (!uattr || pid < 0) | 3671 | if (!uattr || pid < 0 || flags) |
| 3671 | return -EINVAL; | 3672 | return -EINVAL; |
| 3672 | 3673 | ||
| 3673 | if (sched_copy_attr(uattr, &attr)) | 3674 | if (sched_copy_attr(uattr, &attr)) |
| @@ -3786,7 +3787,7 @@ static int sched_read_attr(struct sched_attr __user *uattr, | |||
| 3786 | attr->size = usize; | 3787 | attr->size = usize; |
| 3787 | } | 3788 | } |
| 3788 | 3789 | ||
| 3789 | ret = copy_to_user(uattr, attr, usize); | 3790 | ret = copy_to_user(uattr, attr, attr->size); |
| 3790 | if (ret) | 3791 | if (ret) |
| 3791 | return -EFAULT; | 3792 | return -EFAULT; |
| 3792 | 3793 | ||
| @@ -3804,8 +3805,8 @@ err_size: | |||
| 3804 | * @uattr: structure containing the extended parameters. | 3805 | * @uattr: structure containing the extended parameters. |
| 3805 | * @size: sizeof(attr) for fwd/bwd comp. | 3806 | * @size: sizeof(attr) for fwd/bwd comp. |
| 3806 | */ | 3807 | */ |
| 3807 | SYSCALL_DEFINE3(sched_getattr, pid_t, pid, struct sched_attr __user *, uattr, | 3808 | SYSCALL_DEFINE4(sched_getattr, pid_t, pid, struct sched_attr __user *, uattr, |
| 3808 | unsigned int, size) | 3809 | unsigned int, size, unsigned int, flags) |
| 3809 | { | 3810 | { |
| 3810 | struct sched_attr attr = { | 3811 | struct sched_attr attr = { |
| 3811 | .size = sizeof(struct sched_attr), | 3812 | .size = sizeof(struct sched_attr), |
| @@ -3814,7 +3815,7 @@ SYSCALL_DEFINE3(sched_getattr, pid_t, pid, struct sched_attr __user *, uattr, | |||
| 3814 | int retval; | 3815 | int retval; |
| 3815 | 3816 | ||
| 3816 | if (!uattr || pid < 0 || size > PAGE_SIZE || | 3817 | if (!uattr || pid < 0 || size > PAGE_SIZE || |
| 3817 | size < SCHED_ATTR_SIZE_VER0) | 3818 | size < SCHED_ATTR_SIZE_VER0 || flags) |
| 3818 | return -EINVAL; | 3819 | return -EINVAL; |
| 3819 | 3820 | ||
| 3820 | rcu_read_lock(); | 3821 | rcu_read_lock(); |
| @@ -7422,6 +7423,7 @@ static int sched_dl_global_constraints(void) | |||
| 7422 | u64 period = global_rt_period(); | 7423 | u64 period = global_rt_period(); |
| 7423 | u64 new_bw = to_ratio(period, runtime); | 7424 | u64 new_bw = to_ratio(period, runtime); |
| 7424 | int cpu, ret = 0; | 7425 | int cpu, ret = 0; |
| 7426 | unsigned long flags; | ||
| 7425 | 7427 | ||
| 7426 | /* | 7428 | /* |
| 7427 | * Here we want to check the bandwidth not being set to some | 7429 | * Here we want to check the bandwidth not being set to some |
| @@ -7435,10 +7437,10 @@ static int sched_dl_global_constraints(void) | |||
| 7435 | for_each_possible_cpu(cpu) { | 7437 | for_each_possible_cpu(cpu) { |
| 7436 | struct dl_bw *dl_b = dl_bw_of(cpu); | 7438 | struct dl_bw *dl_b = dl_bw_of(cpu); |
| 7437 | 7439 | ||
| 7438 | raw_spin_lock(&dl_b->lock); | 7440 | raw_spin_lock_irqsave(&dl_b->lock, flags); |
| 7439 | if (new_bw < dl_b->total_bw) | 7441 | if (new_bw < dl_b->total_bw) |
| 7440 | ret = -EBUSY; | 7442 | ret = -EBUSY; |
| 7441 | raw_spin_unlock(&dl_b->lock); | 7443 | raw_spin_unlock_irqrestore(&dl_b->lock, flags); |
| 7442 | 7444 | ||
| 7443 | if (ret) | 7445 | if (ret) |
| 7444 | break; | 7446 | break; |
| @@ -7451,6 +7453,7 @@ static void sched_dl_do_global(void) | |||
| 7451 | { | 7453 | { |
| 7452 | u64 new_bw = -1; | 7454 | u64 new_bw = -1; |
| 7453 | int cpu; | 7455 | int cpu; |
| 7456 | unsigned long flags; | ||
| 7454 | 7457 | ||
| 7455 | def_dl_bandwidth.dl_period = global_rt_period(); | 7458 | def_dl_bandwidth.dl_period = global_rt_period(); |
| 7456 | def_dl_bandwidth.dl_runtime = global_rt_runtime(); | 7459 | def_dl_bandwidth.dl_runtime = global_rt_runtime(); |
| @@ -7464,9 +7467,9 @@ static void sched_dl_do_global(void) | |||
| 7464 | for_each_possible_cpu(cpu) { | 7467 | for_each_possible_cpu(cpu) { |
| 7465 | struct dl_bw *dl_b = dl_bw_of(cpu); | 7468 | struct dl_bw *dl_b = dl_bw_of(cpu); |
| 7466 | 7469 | ||
| 7467 | raw_spin_lock(&dl_b->lock); | 7470 | raw_spin_lock_irqsave(&dl_b->lock, flags); |
| 7468 | dl_b->bw = new_bw; | 7471 | dl_b->bw = new_bw; |
| 7469 | raw_spin_unlock(&dl_b->lock); | 7472 | raw_spin_unlock_irqrestore(&dl_b->lock, flags); |
| 7470 | } | 7473 | } |
| 7471 | } | 7474 | } |
| 7472 | 7475 | ||
| @@ -7475,7 +7478,8 @@ static int sched_rt_global_validate(void) | |||
| 7475 | if (sysctl_sched_rt_period <= 0) | 7478 | if (sysctl_sched_rt_period <= 0) |
| 7476 | return -EINVAL; | 7479 | return -EINVAL; |
| 7477 | 7480 | ||
| 7478 | if (sysctl_sched_rt_runtime > sysctl_sched_rt_period) | 7481 | if ((sysctl_sched_rt_runtime != RUNTIME_INF) && |
| 7482 | (sysctl_sched_rt_runtime > sysctl_sched_rt_period)) | ||
| 7479 | return -EINVAL; | 7483 | return -EINVAL; |
| 7480 | 7484 | ||
| 7481 | return 0; | 7485 | return 0; |
diff --git a/kernel/sched/cpudeadline.c b/kernel/sched/cpudeadline.c index 045fc74e3f09..5b9bb42b2d47 100644 --- a/kernel/sched/cpudeadline.c +++ b/kernel/sched/cpudeadline.c | |||
| @@ -70,7 +70,7 @@ static void cpudl_heapify(struct cpudl *cp, int idx) | |||
| 70 | 70 | ||
| 71 | static void cpudl_change_key(struct cpudl *cp, int idx, u64 new_dl) | 71 | static void cpudl_change_key(struct cpudl *cp, int idx, u64 new_dl) |
| 72 | { | 72 | { |
| 73 | WARN_ON(idx > num_present_cpus() || idx == IDX_INVALID); | 73 | WARN_ON(idx == IDX_INVALID || !cpu_present(idx)); |
| 74 | 74 | ||
| 75 | if (dl_time_before(new_dl, cp->elements[idx].dl)) { | 75 | if (dl_time_before(new_dl, cp->elements[idx].dl)) { |
| 76 | cp->elements[idx].dl = new_dl; | 76 | cp->elements[idx].dl = new_dl; |
| @@ -117,7 +117,7 @@ int cpudl_find(struct cpudl *cp, struct task_struct *p, | |||
| 117 | } | 117 | } |
| 118 | 118 | ||
| 119 | out: | 119 | out: |
| 120 | WARN_ON(best_cpu > num_present_cpus() && best_cpu != -1); | 120 | WARN_ON(best_cpu != -1 && !cpu_present(best_cpu)); |
| 121 | 121 | ||
| 122 | return best_cpu; | 122 | return best_cpu; |
| 123 | } | 123 | } |
| @@ -137,7 +137,7 @@ void cpudl_set(struct cpudl *cp, int cpu, u64 dl, int is_valid) | |||
| 137 | int old_idx, new_cpu; | 137 | int old_idx, new_cpu; |
| 138 | unsigned long flags; | 138 | unsigned long flags; |
| 139 | 139 | ||
| 140 | WARN_ON(cpu > num_present_cpus()); | 140 | WARN_ON(!cpu_present(cpu)); |
| 141 | 141 | ||
| 142 | raw_spin_lock_irqsave(&cp->lock, flags); | 142 | raw_spin_lock_irqsave(&cp->lock, flags); |
| 143 | old_idx = cp->cpu_to_idx[cpu]; | 143 | old_idx = cp->cpu_to_idx[cpu]; |
diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c index 0dd5e0971a07..6e79b3faa4cd 100644 --- a/kernel/sched/deadline.c +++ b/kernel/sched/deadline.c | |||
| @@ -121,7 +121,7 @@ static inline void dl_clear_overload(struct rq *rq) | |||
| 121 | 121 | ||
| 122 | static void update_dl_migration(struct dl_rq *dl_rq) | 122 | static void update_dl_migration(struct dl_rq *dl_rq) |
| 123 | { | 123 | { |
| 124 | if (dl_rq->dl_nr_migratory && dl_rq->dl_nr_total > 1) { | 124 | if (dl_rq->dl_nr_migratory && dl_rq->dl_nr_running > 1) { |
| 125 | if (!dl_rq->overloaded) { | 125 | if (!dl_rq->overloaded) { |
| 126 | dl_set_overload(rq_of_dl_rq(dl_rq)); | 126 | dl_set_overload(rq_of_dl_rq(dl_rq)); |
| 127 | dl_rq->overloaded = 1; | 127 | dl_rq->overloaded = 1; |
| @@ -135,9 +135,7 @@ static void update_dl_migration(struct dl_rq *dl_rq) | |||
| 135 | static void inc_dl_migration(struct sched_dl_entity *dl_se, struct dl_rq *dl_rq) | 135 | static void inc_dl_migration(struct sched_dl_entity *dl_se, struct dl_rq *dl_rq) |
| 136 | { | 136 | { |
| 137 | struct task_struct *p = dl_task_of(dl_se); | 137 | struct task_struct *p = dl_task_of(dl_se); |
| 138 | dl_rq = &rq_of_dl_rq(dl_rq)->dl; | ||
| 139 | 138 | ||
| 140 | dl_rq->dl_nr_total++; | ||
| 141 | if (p->nr_cpus_allowed > 1) | 139 | if (p->nr_cpus_allowed > 1) |
| 142 | dl_rq->dl_nr_migratory++; | 140 | dl_rq->dl_nr_migratory++; |
| 143 | 141 | ||
| @@ -147,9 +145,7 @@ static void inc_dl_migration(struct sched_dl_entity *dl_se, struct dl_rq *dl_rq) | |||
| 147 | static void dec_dl_migration(struct sched_dl_entity *dl_se, struct dl_rq *dl_rq) | 145 | static void dec_dl_migration(struct sched_dl_entity *dl_se, struct dl_rq *dl_rq) |
| 148 | { | 146 | { |
| 149 | struct task_struct *p = dl_task_of(dl_se); | 147 | struct task_struct *p = dl_task_of(dl_se); |
| 150 | dl_rq = &rq_of_dl_rq(dl_rq)->dl; | ||
| 151 | 148 | ||
| 152 | dl_rq->dl_nr_total--; | ||
| 153 | if (p->nr_cpus_allowed > 1) | 149 | if (p->nr_cpus_allowed > 1) |
| 154 | dl_rq->dl_nr_migratory--; | 150 | dl_rq->dl_nr_migratory--; |
| 155 | 151 | ||
| @@ -566,6 +562,8 @@ int dl_runtime_exceeded(struct rq *rq, struct sched_dl_entity *dl_se) | |||
| 566 | return 1; | 562 | return 1; |
| 567 | } | 563 | } |
| 568 | 564 | ||
| 565 | extern bool sched_rt_bandwidth_account(struct rt_rq *rt_rq); | ||
| 566 | |||
| 569 | /* | 567 | /* |
| 570 | * Update the current task's runtime statistics (provided it is still | 568 | * Update the current task's runtime statistics (provided it is still |
| 571 | * a -deadline task and has not been removed from the dl_rq). | 569 | * a -deadline task and has not been removed from the dl_rq). |
| @@ -629,11 +627,13 @@ static void update_curr_dl(struct rq *rq) | |||
| 629 | struct rt_rq *rt_rq = &rq->rt; | 627 | struct rt_rq *rt_rq = &rq->rt; |
| 630 | 628 | ||
| 631 | raw_spin_lock(&rt_rq->rt_runtime_lock); | 629 | raw_spin_lock(&rt_rq->rt_runtime_lock); |
| 632 | rt_rq->rt_time += delta_exec; | ||
| 633 | /* | 630 | /* |
| 634 | * We'll let actual RT tasks worry about the overflow here, we | 631 | * We'll let actual RT tasks worry about the overflow here, we |
| 635 | * have our own CBS to keep us inline -- see above. | 632 | * have our own CBS to keep us inline; only account when RT |
| 633 | * bandwidth is relevant. | ||
| 636 | */ | 634 | */ |
| 635 | if (sched_rt_bandwidth_account(rt_rq)) | ||
| 636 | rt_rq->rt_time += delta_exec; | ||
| 637 | raw_spin_unlock(&rt_rq->rt_runtime_lock); | 637 | raw_spin_unlock(&rt_rq->rt_runtime_lock); |
| 638 | } | 638 | } |
| 639 | } | 639 | } |
| @@ -717,6 +717,7 @@ void inc_dl_tasks(struct sched_dl_entity *dl_se, struct dl_rq *dl_rq) | |||
| 717 | 717 | ||
| 718 | WARN_ON(!dl_prio(prio)); | 718 | WARN_ON(!dl_prio(prio)); |
| 719 | dl_rq->dl_nr_running++; | 719 | dl_rq->dl_nr_running++; |
| 720 | inc_nr_running(rq_of_dl_rq(dl_rq)); | ||
| 720 | 721 | ||
| 721 | inc_dl_deadline(dl_rq, deadline); | 722 | inc_dl_deadline(dl_rq, deadline); |
| 722 | inc_dl_migration(dl_se, dl_rq); | 723 | inc_dl_migration(dl_se, dl_rq); |
| @@ -730,6 +731,7 @@ void dec_dl_tasks(struct sched_dl_entity *dl_se, struct dl_rq *dl_rq) | |||
| 730 | WARN_ON(!dl_prio(prio)); | 731 | WARN_ON(!dl_prio(prio)); |
| 731 | WARN_ON(!dl_rq->dl_nr_running); | 732 | WARN_ON(!dl_rq->dl_nr_running); |
| 732 | dl_rq->dl_nr_running--; | 733 | dl_rq->dl_nr_running--; |
| 734 | dec_nr_running(rq_of_dl_rq(dl_rq)); | ||
| 733 | 735 | ||
| 734 | dec_dl_deadline(dl_rq, dl_se->deadline); | 736 | dec_dl_deadline(dl_rq, dl_se->deadline); |
| 735 | dec_dl_migration(dl_se, dl_rq); | 737 | dec_dl_migration(dl_se, dl_rq); |
| @@ -836,8 +838,6 @@ static void enqueue_task_dl(struct rq *rq, struct task_struct *p, int flags) | |||
| 836 | 838 | ||
| 837 | if (!task_current(rq, p) && p->nr_cpus_allowed > 1) | 839 | if (!task_current(rq, p) && p->nr_cpus_allowed > 1) |
| 838 | enqueue_pushable_dl_task(rq, p); | 840 | enqueue_pushable_dl_task(rq, p); |
| 839 | |||
| 840 | inc_nr_running(rq); | ||
| 841 | } | 841 | } |
| 842 | 842 | ||
| 843 | static void __dequeue_task_dl(struct rq *rq, struct task_struct *p, int flags) | 843 | static void __dequeue_task_dl(struct rq *rq, struct task_struct *p, int flags) |
| @@ -850,8 +850,6 @@ static void dequeue_task_dl(struct rq *rq, struct task_struct *p, int flags) | |||
| 850 | { | 850 | { |
| 851 | update_curr_dl(rq); | 851 | update_curr_dl(rq); |
| 852 | __dequeue_task_dl(rq, p, flags); | 852 | __dequeue_task_dl(rq, p, flags); |
| 853 | |||
| 854 | dec_nr_running(rq); | ||
| 855 | } | 853 | } |
| 856 | 854 | ||
| 857 | /* | 855 | /* |
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 966cc2bfcb77..9b4c4f320130 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c | |||
| @@ -1757,6 +1757,8 @@ void task_numa_work(struct callback_head *work) | |||
| 1757 | start = end; | 1757 | start = end; |
| 1758 | if (pages <= 0) | 1758 | if (pages <= 0) |
| 1759 | goto out; | 1759 | goto out; |
| 1760 | |||
| 1761 | cond_resched(); | ||
| 1760 | } while (end != vma->vm_end); | 1762 | } while (end != vma->vm_end); |
| 1761 | } | 1763 | } |
| 1762 | 1764 | ||
| @@ -6999,15 +7001,15 @@ static void switched_from_fair(struct rq *rq, struct task_struct *p) | |||
| 6999 | struct cfs_rq *cfs_rq = cfs_rq_of(se); | 7001 | struct cfs_rq *cfs_rq = cfs_rq_of(se); |
| 7000 | 7002 | ||
| 7001 | /* | 7003 | /* |
| 7002 | * Ensure the task's vruntime is normalized, so that when its | 7004 | * Ensure the task's vruntime is normalized, so that when it's |
| 7003 | * switched back to the fair class the enqueue_entity(.flags=0) will | 7005 | * switched back to the fair class the enqueue_entity(.flags=0) will |
| 7004 | * do the right thing. | 7006 | * do the right thing. |
| 7005 | * | 7007 | * |
| 7006 | * If it was on_rq, then the dequeue_entity(.flags=0) will already | 7008 | * If it's on_rq, then the dequeue_entity(.flags=0) will already |
| 7007 | * have normalized the vruntime, if it was !on_rq, then only when | 7009 | * have normalized the vruntime, if it's !on_rq, then only when |
| 7008 | * the task is sleeping will it still have non-normalized vruntime. | 7010 | * the task is sleeping will it still have non-normalized vruntime. |
| 7009 | */ | 7011 | */ |
| 7010 | if (!se->on_rq && p->state != TASK_RUNNING) { | 7012 | if (!p->on_rq && p->state != TASK_RUNNING) { |
| 7011 | /* | 7013 | /* |
| 7012 | * Fix up our vruntime so that the current sleep doesn't | 7014 | * Fix up our vruntime so that the current sleep doesn't |
| 7013 | * cause 'unlimited' sleep bonus. | 7015 | * cause 'unlimited' sleep bonus. |
diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c index a2740b775b45..1999021042c7 100644 --- a/kernel/sched/rt.c +++ b/kernel/sched/rt.c | |||
| @@ -538,6 +538,14 @@ static inline struct rt_bandwidth *sched_rt_bandwidth(struct rt_rq *rt_rq) | |||
| 538 | 538 | ||
| 539 | #endif /* CONFIG_RT_GROUP_SCHED */ | 539 | #endif /* CONFIG_RT_GROUP_SCHED */ |
| 540 | 540 | ||
| 541 | bool sched_rt_bandwidth_account(struct rt_rq *rt_rq) | ||
| 542 | { | ||
| 543 | struct rt_bandwidth *rt_b = sched_rt_bandwidth(rt_rq); | ||
| 544 | |||
| 545 | return (hrtimer_active(&rt_b->rt_period_timer) || | ||
| 546 | rt_rq->rt_time < rt_b->rt_runtime); | ||
| 547 | } | ||
| 548 | |||
| 541 | #ifdef CONFIG_SMP | 549 | #ifdef CONFIG_SMP |
| 542 | /* | 550 | /* |
| 543 | * We ran out of runtime, see if we can borrow some from our neighbours. | 551 | * We ran out of runtime, see if we can borrow some from our neighbours. |
diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index c2119fd20f8b..f964add50f38 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h | |||
| @@ -462,7 +462,6 @@ struct dl_rq { | |||
| 462 | } earliest_dl; | 462 | } earliest_dl; |
| 463 | 463 | ||
| 464 | unsigned long dl_nr_migratory; | 464 | unsigned long dl_nr_migratory; |
| 465 | unsigned long dl_nr_total; | ||
| 466 | int overloaded; | 465 | int overloaded; |
| 467 | 466 | ||
| 468 | /* | 467 | /* |
diff --git a/kernel/time/sched_clock.c b/kernel/time/sched_clock.c index 0abb36464281..4d23dc4d8139 100644 --- a/kernel/time/sched_clock.c +++ b/kernel/time/sched_clock.c | |||
| @@ -116,20 +116,42 @@ static enum hrtimer_restart sched_clock_poll(struct hrtimer *hrt) | |||
| 116 | void __init sched_clock_register(u64 (*read)(void), int bits, | 116 | void __init sched_clock_register(u64 (*read)(void), int bits, |
| 117 | unsigned long rate) | 117 | unsigned long rate) |
| 118 | { | 118 | { |
| 119 | u64 res, wrap, new_mask, new_epoch, cyc, ns; | ||
| 120 | u32 new_mult, new_shift; | ||
| 121 | ktime_t new_wrap_kt; | ||
| 119 | unsigned long r; | 122 | unsigned long r; |
| 120 | u64 res, wrap; | ||
| 121 | char r_unit; | 123 | char r_unit; |
| 122 | 124 | ||
| 123 | if (cd.rate > rate) | 125 | if (cd.rate > rate) |
| 124 | return; | 126 | return; |
| 125 | 127 | ||
| 126 | WARN_ON(!irqs_disabled()); | 128 | WARN_ON(!irqs_disabled()); |
| 127 | read_sched_clock = read; | ||
| 128 | sched_clock_mask = CLOCKSOURCE_MASK(bits); | ||
| 129 | cd.rate = rate; | ||
| 130 | 129 | ||
| 131 | /* calculate the mult/shift to convert counter ticks to ns. */ | 130 | /* calculate the mult/shift to convert counter ticks to ns. */ |
| 132 | clocks_calc_mult_shift(&cd.mult, &cd.shift, rate, NSEC_PER_SEC, 3600); | 131 | clocks_calc_mult_shift(&new_mult, &new_shift, rate, NSEC_PER_SEC, 3600); |
| 132 | |||
| 133 | new_mask = CLOCKSOURCE_MASK(bits); | ||
| 134 | |||
| 135 | /* calculate how many ns until we wrap */ | ||
| 136 | wrap = clocks_calc_max_nsecs(new_mult, new_shift, 0, new_mask); | ||
| 137 | new_wrap_kt = ns_to_ktime(wrap - (wrap >> 3)); | ||
| 138 | |||
| 139 | /* update epoch for new counter and update epoch_ns from old counter*/ | ||
| 140 | new_epoch = read(); | ||
| 141 | cyc = read_sched_clock(); | ||
| 142 | ns = cd.epoch_ns + cyc_to_ns((cyc - cd.epoch_cyc) & sched_clock_mask, | ||
| 143 | cd.mult, cd.shift); | ||
| 144 | |||
| 145 | raw_write_seqcount_begin(&cd.seq); | ||
| 146 | read_sched_clock = read; | ||
| 147 | sched_clock_mask = new_mask; | ||
| 148 | cd.rate = rate; | ||
| 149 | cd.wrap_kt = new_wrap_kt; | ||
| 150 | cd.mult = new_mult; | ||
| 151 | cd.shift = new_shift; | ||
| 152 | cd.epoch_cyc = new_epoch; | ||
| 153 | cd.epoch_ns = ns; | ||
| 154 | raw_write_seqcount_end(&cd.seq); | ||
| 133 | 155 | ||
| 134 | r = rate; | 156 | r = rate; |
| 135 | if (r >= 4000000) { | 157 | if (r >= 4000000) { |
| @@ -141,22 +163,12 @@ void __init sched_clock_register(u64 (*read)(void), int bits, | |||
| 141 | } else | 163 | } else |
| 142 | r_unit = ' '; | 164 | r_unit = ' '; |
| 143 | 165 | ||
| 144 | /* calculate how many ns until we wrap */ | ||
| 145 | wrap = clocks_calc_max_nsecs(cd.mult, cd.shift, 0, sched_clock_mask); | ||
| 146 | cd.wrap_kt = ns_to_ktime(wrap - (wrap >> 3)); | ||
| 147 | |||
| 148 | /* calculate the ns resolution of this counter */ | 166 | /* calculate the ns resolution of this counter */ |
| 149 | res = cyc_to_ns(1ULL, cd.mult, cd.shift); | 167 | res = cyc_to_ns(1ULL, new_mult, new_shift); |
| 168 | |||
| 150 | pr_info("sched_clock: %u bits at %lu%cHz, resolution %lluns, wraps every %lluns\n", | 169 | pr_info("sched_clock: %u bits at %lu%cHz, resolution %lluns, wraps every %lluns\n", |
| 151 | bits, r, r_unit, res, wrap); | 170 | bits, r, r_unit, res, wrap); |
| 152 | 171 | ||
| 153 | update_sched_clock(); | ||
| 154 | |||
| 155 | /* | ||
| 156 | * Ensure that sched_clock() starts off at 0ns | ||
| 157 | */ | ||
| 158 | cd.epoch_ns = 0; | ||
| 159 | |||
| 160 | /* Enable IRQ time accounting if we have a fast enough sched_clock */ | 172 | /* Enable IRQ time accounting if we have a fast enough sched_clock */ |
| 161 | if (irqtime > 0 || (irqtime == -1 && rate >= 1000000)) | 173 | if (irqtime > 0 || (irqtime == -1 && rate >= 1000000)) |
| 162 | enable_sched_clock_irqtime(); | 174 | enable_sched_clock_irqtime(); |
diff --git a/kernel/user_namespace.c b/kernel/user_namespace.c index 240fb62cf394..dd06439b9c84 100644 --- a/kernel/user_namespace.c +++ b/kernel/user_namespace.c | |||
| @@ -225,7 +225,7 @@ static u32 map_id_up(struct uid_gid_map *map, u32 id) | |||
| 225 | * | 225 | * |
| 226 | * When there is no mapping defined for the user-namespace uid | 226 | * When there is no mapping defined for the user-namespace uid |
| 227 | * pair INVALID_UID is returned. Callers are expected to test | 227 | * pair INVALID_UID is returned. Callers are expected to test |
| 228 | * for and handle handle INVALID_UID being returned. INVALID_UID | 228 | * for and handle INVALID_UID being returned. INVALID_UID |
| 229 | * may be tested for using uid_valid(). | 229 | * may be tested for using uid_valid(). |
| 230 | */ | 230 | */ |
| 231 | kuid_t make_kuid(struct user_namespace *ns, uid_t uid) | 231 | kuid_t make_kuid(struct user_namespace *ns, uid_t uid) |
diff --git a/kernel/workqueue.c b/kernel/workqueue.c index 82ef9f3b7473..193e977a10ea 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c | |||
| @@ -1851,6 +1851,12 @@ static void destroy_worker(struct worker *worker) | |||
| 1851 | if (worker->flags & WORKER_IDLE) | 1851 | if (worker->flags & WORKER_IDLE) |
| 1852 | pool->nr_idle--; | 1852 | pool->nr_idle--; |
| 1853 | 1853 | ||
| 1854 | /* | ||
| 1855 | * Once WORKER_DIE is set, the kworker may destroy itself at any | ||
| 1856 | * point. Pin to ensure the task stays until we're done with it. | ||
| 1857 | */ | ||
| 1858 | get_task_struct(worker->task); | ||
| 1859 | |||
| 1854 | list_del_init(&worker->entry); | 1860 | list_del_init(&worker->entry); |
| 1855 | worker->flags |= WORKER_DIE; | 1861 | worker->flags |= WORKER_DIE; |
| 1856 | 1862 | ||
| @@ -1859,6 +1865,7 @@ static void destroy_worker(struct worker *worker) | |||
| 1859 | spin_unlock_irq(&pool->lock); | 1865 | spin_unlock_irq(&pool->lock); |
| 1860 | 1866 | ||
| 1861 | kthread_stop(worker->task); | 1867 | kthread_stop(worker->task); |
| 1868 | put_task_struct(worker->task); | ||
| 1862 | kfree(worker); | 1869 | kfree(worker); |
| 1863 | 1870 | ||
| 1864 | spin_lock_irq(&pool->lock); | 1871 | spin_lock_irq(&pool->lock); |
diff --git a/lib/dma-debug.c b/lib/dma-debug.c index 2defd1308b04..98f2d7e91a91 100644 --- a/lib/dma-debug.c +++ b/lib/dma-debug.c | |||
| @@ -424,111 +424,134 @@ void debug_dma_dump_mappings(struct device *dev) | |||
| 424 | EXPORT_SYMBOL(debug_dma_dump_mappings); | 424 | EXPORT_SYMBOL(debug_dma_dump_mappings); |
| 425 | 425 | ||
| 426 | /* | 426 | /* |
| 427 | * For each page mapped (initial page in the case of | 427 | * For each mapping (initial cacheline in the case of |
| 428 | * dma_alloc_coherent/dma_map_{single|page}, or each page in a | 428 | * dma_alloc_coherent/dma_map_page, initial cacheline in each page of a |
| 429 | * scatterlist) insert into this tree using the pfn as the key. At | 429 | * scatterlist, or the cacheline specified in dma_map_single) insert |
| 430 | * into this tree using the cacheline as the key. At | ||
| 430 | * dma_unmap_{single|sg|page} or dma_free_coherent delete the entry. If | 431 | * dma_unmap_{single|sg|page} or dma_free_coherent delete the entry. If |
| 431 | * the pfn already exists at insertion time add a tag as a reference | 432 | * the entry already exists at insertion time add a tag as a reference |
| 432 | * count for the overlapping mappings. For now, the overlap tracking | 433 | * count for the overlapping mappings. For now, the overlap tracking |
| 433 | * just ensures that 'unmaps' balance 'maps' before marking the pfn | 434 | * just ensures that 'unmaps' balance 'maps' before marking the |
| 434 | * idle, but we should also be flagging overlaps as an API violation. | 435 | * cacheline idle, but we should also be flagging overlaps as an API |
| 436 | * violation. | ||
| 435 | * | 437 | * |
| 436 | * Memory usage is mostly constrained by the maximum number of available | 438 | * Memory usage is mostly constrained by the maximum number of available |
| 437 | * dma-debug entries in that we need a free dma_debug_entry before | 439 | * dma-debug entries in that we need a free dma_debug_entry before |
| 438 | * inserting into the tree. In the case of dma_map_{single|page} and | 440 | * inserting into the tree. In the case of dma_map_page and |
| 439 | * dma_alloc_coherent there is only one dma_debug_entry and one pfn to | 441 | * dma_alloc_coherent there is only one dma_debug_entry and one |
| 440 | * track per event. dma_map_sg(), on the other hand, | 442 | * dma_active_cacheline entry to track per event. dma_map_sg(), on the |
| 441 | * consumes a single dma_debug_entry, but inserts 'nents' entries into | 443 | * other hand, consumes a single dma_debug_entry, but inserts 'nents' |
| 442 | * the tree. | 444 | * entries into the tree. |
| 443 | * | 445 | * |
| 444 | * At any time debug_dma_assert_idle() can be called to trigger a | 446 | * At any time debug_dma_assert_idle() can be called to trigger a |
| 445 | * warning if the given page is in the active set. | 447 | * warning if any cachelines in the given page are in the active set. |
| 446 | */ | 448 | */ |
| 447 | static RADIX_TREE(dma_active_pfn, GFP_NOWAIT); | 449 | static RADIX_TREE(dma_active_cacheline, GFP_NOWAIT); |
| 448 | static DEFINE_SPINLOCK(radix_lock); | 450 | static DEFINE_SPINLOCK(radix_lock); |
| 449 | #define ACTIVE_PFN_MAX_OVERLAP ((1 << RADIX_TREE_MAX_TAGS) - 1) | 451 | #define ACTIVE_CACHELINE_MAX_OVERLAP ((1 << RADIX_TREE_MAX_TAGS) - 1) |
| 452 | #define CACHELINE_PER_PAGE_SHIFT (PAGE_SHIFT - L1_CACHE_SHIFT) | ||
| 453 | #define CACHELINES_PER_PAGE (1 << CACHELINE_PER_PAGE_SHIFT) | ||
| 450 | 454 | ||
| 451 | static int active_pfn_read_overlap(unsigned long pfn) | 455 | static phys_addr_t to_cacheline_number(struct dma_debug_entry *entry) |
| 456 | { | ||
| 457 | return (entry->pfn << CACHELINE_PER_PAGE_SHIFT) + | ||
| 458 | (entry->offset >> L1_CACHE_SHIFT); | ||
| 459 | } | ||
| 460 | |||
| 461 | static int active_cacheline_read_overlap(phys_addr_t cln) | ||
| 452 | { | 462 | { |
| 453 | int overlap = 0, i; | 463 | int overlap = 0, i; |
| 454 | 464 | ||
| 455 | for (i = RADIX_TREE_MAX_TAGS - 1; i >= 0; i--) | 465 | for (i = RADIX_TREE_MAX_TAGS - 1; i >= 0; i--) |
| 456 | if (radix_tree_tag_get(&dma_active_pfn, pfn, i)) | 466 | if (radix_tree_tag_get(&dma_active_cacheline, cln, i)) |
| 457 | overlap |= 1 << i; | 467 | overlap |= 1 << i; |
| 458 | return overlap; | 468 | return overlap; |
| 459 | } | 469 | } |
| 460 | 470 | ||
| 461 | static int active_pfn_set_overlap(unsigned long pfn, int overlap) | 471 | static int active_cacheline_set_overlap(phys_addr_t cln, int overlap) |
| 462 | { | 472 | { |
| 463 | int i; | 473 | int i; |
| 464 | 474 | ||
| 465 | if (overlap > ACTIVE_PFN_MAX_OVERLAP || overlap < 0) | 475 | if (overlap > ACTIVE_CACHELINE_MAX_OVERLAP || overlap < 0) |
| 466 | return overlap; | 476 | return overlap; |
| 467 | 477 | ||
| 468 | for (i = RADIX_TREE_MAX_TAGS - 1; i >= 0; i--) | 478 | for (i = RADIX_TREE_MAX_TAGS - 1; i >= 0; i--) |
| 469 | if (overlap & 1 << i) | 479 | if (overlap & 1 << i) |
| 470 | radix_tree_tag_set(&dma_active_pfn, pfn, i); | 480 | radix_tree_tag_set(&dma_active_cacheline, cln, i); |
| 471 | else | 481 | else |
| 472 | radix_tree_tag_clear(&dma_active_pfn, pfn, i); | 482 | radix_tree_tag_clear(&dma_active_cacheline, cln, i); |
| 473 | 483 | ||
| 474 | return overlap; | 484 | return overlap; |
| 475 | } | 485 | } |
| 476 | 486 | ||
| 477 | static void active_pfn_inc_overlap(unsigned long pfn) | 487 | static void active_cacheline_inc_overlap(phys_addr_t cln) |
| 478 | { | 488 | { |
| 479 | int overlap = active_pfn_read_overlap(pfn); | 489 | int overlap = active_cacheline_read_overlap(cln); |
| 480 | 490 | ||
| 481 | overlap = active_pfn_set_overlap(pfn, ++overlap); | 491 | overlap = active_cacheline_set_overlap(cln, ++overlap); |
| 482 | 492 | ||
| 483 | /* If we overflowed the overlap counter then we're potentially | 493 | /* If we overflowed the overlap counter then we're potentially |
| 484 | * leaking dma-mappings. Otherwise, if maps and unmaps are | 494 | * leaking dma-mappings. Otherwise, if maps and unmaps are |
| 485 | * balanced then this overflow may cause false negatives in | 495 | * balanced then this overflow may cause false negatives in |
| 486 | * debug_dma_assert_idle() as the pfn may be marked idle | 496 | * debug_dma_assert_idle() as the cacheline may be marked idle |
| 487 | * prematurely. | 497 | * prematurely. |
| 488 | */ | 498 | */ |
| 489 | WARN_ONCE(overlap > ACTIVE_PFN_MAX_OVERLAP, | 499 | WARN_ONCE(overlap > ACTIVE_CACHELINE_MAX_OVERLAP, |
| 490 | "DMA-API: exceeded %d overlapping mappings of pfn %lx\n", | 500 | "DMA-API: exceeded %d overlapping mappings of cacheline %pa\n", |
| 491 | ACTIVE_PFN_MAX_OVERLAP, pfn); | 501 | ACTIVE_CACHELINE_MAX_OVERLAP, &cln); |
| 492 | } | 502 | } |
| 493 | 503 | ||
| 494 | static int active_pfn_dec_overlap(unsigned long pfn) | 504 | static int active_cacheline_dec_overlap(phys_addr_t cln) |
| 495 | { | 505 | { |
| 496 | int overlap = active_pfn_read_overlap(pfn); | 506 | int overlap = active_cacheline_read_overlap(cln); |
| 497 | 507 | ||
| 498 | return active_pfn_set_overlap(pfn, --overlap); | 508 | return active_cacheline_set_overlap(cln, --overlap); |
| 499 | } | 509 | } |
| 500 | 510 | ||
| 501 | static int active_pfn_insert(struct dma_debug_entry *entry) | 511 | static int active_cacheline_insert(struct dma_debug_entry *entry) |
| 502 | { | 512 | { |
| 513 | phys_addr_t cln = to_cacheline_number(entry); | ||
| 503 | unsigned long flags; | 514 | unsigned long flags; |
| 504 | int rc; | 515 | int rc; |
| 505 | 516 | ||
| 517 | /* If the device is not writing memory then we don't have any | ||
| 518 | * concerns about the cpu consuming stale data. This mitigates | ||
| 519 | * legitimate usages of overlapping mappings. | ||
| 520 | */ | ||
| 521 | if (entry->direction == DMA_TO_DEVICE) | ||
| 522 | return 0; | ||
| 523 | |||
| 506 | spin_lock_irqsave(&radix_lock, flags); | 524 | spin_lock_irqsave(&radix_lock, flags); |
| 507 | rc = radix_tree_insert(&dma_active_pfn, entry->pfn, entry); | 525 | rc = radix_tree_insert(&dma_active_cacheline, cln, entry); |
| 508 | if (rc == -EEXIST) | 526 | if (rc == -EEXIST) |
| 509 | active_pfn_inc_overlap(entry->pfn); | 527 | active_cacheline_inc_overlap(cln); |
| 510 | spin_unlock_irqrestore(&radix_lock, flags); | 528 | spin_unlock_irqrestore(&radix_lock, flags); |
| 511 | 529 | ||
| 512 | return rc; | 530 | return rc; |
| 513 | } | 531 | } |
| 514 | 532 | ||
| 515 | static void active_pfn_remove(struct dma_debug_entry *entry) | 533 | static void active_cacheline_remove(struct dma_debug_entry *entry) |
| 516 | { | 534 | { |
| 535 | phys_addr_t cln = to_cacheline_number(entry); | ||
| 517 | unsigned long flags; | 536 | unsigned long flags; |
| 518 | 537 | ||
| 538 | /* ...mirror the insert case */ | ||
| 539 | if (entry->direction == DMA_TO_DEVICE) | ||
| 540 | return; | ||
| 541 | |||
| 519 | spin_lock_irqsave(&radix_lock, flags); | 542 | spin_lock_irqsave(&radix_lock, flags); |
| 520 | /* since we are counting overlaps the final put of the | 543 | /* since we are counting overlaps the final put of the |
| 521 | * entry->pfn will occur when the overlap count is 0. | 544 | * cacheline will occur when the overlap count is 0. |
| 522 | * active_pfn_dec_overlap() returns -1 in that case | 545 | * active_cacheline_dec_overlap() returns -1 in that case |
| 523 | */ | 546 | */ |
| 524 | if (active_pfn_dec_overlap(entry->pfn) < 0) | 547 | if (active_cacheline_dec_overlap(cln) < 0) |
| 525 | radix_tree_delete(&dma_active_pfn, entry->pfn); | 548 | radix_tree_delete(&dma_active_cacheline, cln); |
| 526 | spin_unlock_irqrestore(&radix_lock, flags); | 549 | spin_unlock_irqrestore(&radix_lock, flags); |
| 527 | } | 550 | } |
| 528 | 551 | ||
| 529 | /** | 552 | /** |
| 530 | * debug_dma_assert_idle() - assert that a page is not undergoing dma | 553 | * debug_dma_assert_idle() - assert that a page is not undergoing dma |
| 531 | * @page: page to lookup in the dma_active_pfn tree | 554 | * @page: page to lookup in the dma_active_cacheline tree |
| 532 | * | 555 | * |
| 533 | * Place a call to this routine in cases where the cpu touching the page | 556 | * Place a call to this routine in cases where the cpu touching the page |
| 534 | * before the dma completes (page is dma_unmapped) will lead to data | 557 | * before the dma completes (page is dma_unmapped) will lead to data |
| @@ -536,22 +559,38 @@ static void active_pfn_remove(struct dma_debug_entry *entry) | |||
| 536 | */ | 559 | */ |
| 537 | void debug_dma_assert_idle(struct page *page) | 560 | void debug_dma_assert_idle(struct page *page) |
| 538 | { | 561 | { |
| 562 | static struct dma_debug_entry *ents[CACHELINES_PER_PAGE]; | ||
| 563 | struct dma_debug_entry *entry = NULL; | ||
| 564 | void **results = (void **) &ents; | ||
| 565 | unsigned int nents, i; | ||
| 539 | unsigned long flags; | 566 | unsigned long flags; |
| 540 | struct dma_debug_entry *entry; | 567 | phys_addr_t cln; |
| 541 | 568 | ||
| 542 | if (!page) | 569 | if (!page) |
| 543 | return; | 570 | return; |
| 544 | 571 | ||
| 572 | cln = (phys_addr_t) page_to_pfn(page) << CACHELINE_PER_PAGE_SHIFT; | ||
| 545 | spin_lock_irqsave(&radix_lock, flags); | 573 | spin_lock_irqsave(&radix_lock, flags); |
| 546 | entry = radix_tree_lookup(&dma_active_pfn, page_to_pfn(page)); | 574 | nents = radix_tree_gang_lookup(&dma_active_cacheline, results, cln, |
| 575 | CACHELINES_PER_PAGE); | ||
| 576 | for (i = 0; i < nents; i++) { | ||
| 577 | phys_addr_t ent_cln = to_cacheline_number(ents[i]); | ||
| 578 | |||
| 579 | if (ent_cln == cln) { | ||
| 580 | entry = ents[i]; | ||
| 581 | break; | ||
| 582 | } else if (ent_cln >= cln + CACHELINES_PER_PAGE) | ||
| 583 | break; | ||
| 584 | } | ||
| 547 | spin_unlock_irqrestore(&radix_lock, flags); | 585 | spin_unlock_irqrestore(&radix_lock, flags); |
| 548 | 586 | ||
| 549 | if (!entry) | 587 | if (!entry) |
| 550 | return; | 588 | return; |
| 551 | 589 | ||
| 590 | cln = to_cacheline_number(entry); | ||
| 552 | err_printk(entry->dev, entry, | 591 | err_printk(entry->dev, entry, |
| 553 | "DMA-API: cpu touching an active dma mapped page " | 592 | "DMA-API: cpu touching an active dma mapped cacheline [cln=%pa]\n", |
| 554 | "[pfn=0x%lx]\n", entry->pfn); | 593 | &cln); |
| 555 | } | 594 | } |
| 556 | 595 | ||
| 557 | /* | 596 | /* |
| @@ -568,9 +607,9 @@ static void add_dma_entry(struct dma_debug_entry *entry) | |||
| 568 | hash_bucket_add(bucket, entry); | 607 | hash_bucket_add(bucket, entry); |
| 569 | put_hash_bucket(bucket, &flags); | 608 | put_hash_bucket(bucket, &flags); |
| 570 | 609 | ||
| 571 | rc = active_pfn_insert(entry); | 610 | rc = active_cacheline_insert(entry); |
| 572 | if (rc == -ENOMEM) { | 611 | if (rc == -ENOMEM) { |
| 573 | pr_err("DMA-API: pfn tracking ENOMEM, dma-debug disabled\n"); | 612 | pr_err("DMA-API: cacheline tracking ENOMEM, dma-debug disabled\n"); |
| 574 | global_disable = true; | 613 | global_disable = true; |
| 575 | } | 614 | } |
| 576 | 615 | ||
| @@ -631,7 +670,7 @@ static void dma_entry_free(struct dma_debug_entry *entry) | |||
| 631 | { | 670 | { |
| 632 | unsigned long flags; | 671 | unsigned long flags; |
| 633 | 672 | ||
| 634 | active_pfn_remove(entry); | 673 | active_cacheline_remove(entry); |
| 635 | 674 | ||
| 636 | /* | 675 | /* |
| 637 | * add to beginning of the list - this way the entries are | 676 | * add to beginning of the list - this way the entries are |
diff --git a/lib/radix-tree.c b/lib/radix-tree.c index 7811ed3b4e70..bd4a8dfdf0b8 100644 --- a/lib/radix-tree.c +++ b/lib/radix-tree.c | |||
| @@ -1253,8 +1253,10 @@ unsigned long radix_tree_locate_item(struct radix_tree_root *root, void *item) | |||
| 1253 | 1253 | ||
| 1254 | node = indirect_to_ptr(node); | 1254 | node = indirect_to_ptr(node); |
| 1255 | max_index = radix_tree_maxindex(node->height); | 1255 | max_index = radix_tree_maxindex(node->height); |
| 1256 | if (cur_index > max_index) | 1256 | if (cur_index > max_index) { |
| 1257 | rcu_read_unlock(); | ||
| 1257 | break; | 1258 | break; |
| 1259 | } | ||
| 1258 | 1260 | ||
| 1259 | cur_index = __locate(node, item, cur_index, &found_index); | 1261 | cur_index = __locate(node, item, cur_index, &found_index); |
| 1260 | rcu_read_unlock(); | 1262 | rcu_read_unlock(); |
diff --git a/mm/huge_memory.c b/mm/huge_memory.c index da23eb96779f..1546655a2d78 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c | |||
| @@ -1166,8 +1166,10 @@ alloc: | |||
| 1166 | } else { | 1166 | } else { |
| 1167 | ret = do_huge_pmd_wp_page_fallback(mm, vma, address, | 1167 | ret = do_huge_pmd_wp_page_fallback(mm, vma, address, |
| 1168 | pmd, orig_pmd, page, haddr); | 1168 | pmd, orig_pmd, page, haddr); |
| 1169 | if (ret & VM_FAULT_OOM) | 1169 | if (ret & VM_FAULT_OOM) { |
| 1170 | split_huge_page(page); | 1170 | split_huge_page(page); |
| 1171 | ret |= VM_FAULT_FALLBACK; | ||
| 1172 | } | ||
| 1171 | put_page(page); | 1173 | put_page(page); |
| 1172 | } | 1174 | } |
| 1173 | count_vm_event(THP_FAULT_FALLBACK); | 1175 | count_vm_event(THP_FAULT_FALLBACK); |
| @@ -1179,9 +1181,10 @@ alloc: | |||
| 1179 | if (page) { | 1181 | if (page) { |
| 1180 | split_huge_page(page); | 1182 | split_huge_page(page); |
| 1181 | put_page(page); | 1183 | put_page(page); |
| 1182 | } | 1184 | } else |
| 1185 | split_huge_page_pmd(vma, address, pmd); | ||
| 1186 | ret |= VM_FAULT_FALLBACK; | ||
| 1183 | count_vm_event(THP_FAULT_FALLBACK); | 1187 | count_vm_event(THP_FAULT_FALLBACK); |
| 1184 | ret |= VM_FAULT_OOM; | ||
| 1185 | goto out; | 1188 | goto out; |
| 1186 | } | 1189 | } |
| 1187 | 1190 | ||
| @@ -1958,7 +1961,7 @@ out: | |||
| 1958 | return ret; | 1961 | return ret; |
| 1959 | } | 1962 | } |
| 1960 | 1963 | ||
| 1961 | #define VM_NO_THP (VM_SPECIAL|VM_MIXEDMAP|VM_HUGETLB|VM_SHARED|VM_MAYSHARE) | 1964 | #define VM_NO_THP (VM_SPECIAL | VM_HUGETLB | VM_SHARED | VM_MAYSHARE) |
| 1962 | 1965 | ||
| 1963 | int hugepage_madvise(struct vm_area_struct *vma, | 1966 | int hugepage_madvise(struct vm_area_struct *vma, |
| 1964 | unsigned long *vm_flags, int advice) | 1967 | unsigned long *vm_flags, int advice) |
| @@ -444,7 +444,7 @@ static void break_cow(struct rmap_item *rmap_item) | |||
| 444 | static struct page *page_trans_compound_anon(struct page *page) | 444 | static struct page *page_trans_compound_anon(struct page *page) |
| 445 | { | 445 | { |
| 446 | if (PageTransCompound(page)) { | 446 | if (PageTransCompound(page)) { |
| 447 | struct page *head = compound_trans_head(page); | 447 | struct page *head = compound_head(page); |
| 448 | /* | 448 | /* |
| 449 | * head may actually be splitted and freed from under | 449 | * head may actually be splitted and freed from under |
| 450 | * us but it's ok here. | 450 | * us but it's ok here. |
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 53385cd4e6f0..5b6b0039f725 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
| @@ -1127,8 +1127,8 @@ skip_node: | |||
| 1127 | * skipping css reference should be safe. | 1127 | * skipping css reference should be safe. |
| 1128 | */ | 1128 | */ |
| 1129 | if (next_css) { | 1129 | if (next_css) { |
| 1130 | if ((next_css->flags & CSS_ONLINE) && | 1130 | if ((next_css == &root->css) || |
| 1131 | (next_css == &root->css || css_tryget(next_css))) | 1131 | ((next_css->flags & CSS_ONLINE) && css_tryget(next_css))) |
| 1132 | return mem_cgroup_from_css(next_css); | 1132 | return mem_cgroup_from_css(next_css); |
| 1133 | 1133 | ||
| 1134 | prev_css = next_css; | 1134 | prev_css = next_css; |
| @@ -1687,7 +1687,7 @@ void mem_cgroup_print_oom_info(struct mem_cgroup *memcg, struct task_struct *p) | |||
| 1687 | * protects memcg_name and makes sure that parallel ooms do not | 1687 | * protects memcg_name and makes sure that parallel ooms do not |
| 1688 | * interleave | 1688 | * interleave |
| 1689 | */ | 1689 | */ |
| 1690 | static DEFINE_SPINLOCK(oom_info_lock); | 1690 | static DEFINE_MUTEX(oom_info_lock); |
| 1691 | struct cgroup *task_cgrp; | 1691 | struct cgroup *task_cgrp; |
| 1692 | struct cgroup *mem_cgrp; | 1692 | struct cgroup *mem_cgrp; |
| 1693 | static char memcg_name[PATH_MAX]; | 1693 | static char memcg_name[PATH_MAX]; |
| @@ -1698,7 +1698,7 @@ void mem_cgroup_print_oom_info(struct mem_cgroup *memcg, struct task_struct *p) | |||
| 1698 | if (!p) | 1698 | if (!p) |
| 1699 | return; | 1699 | return; |
| 1700 | 1700 | ||
| 1701 | spin_lock(&oom_info_lock); | 1701 | mutex_lock(&oom_info_lock); |
| 1702 | rcu_read_lock(); | 1702 | rcu_read_lock(); |
| 1703 | 1703 | ||
| 1704 | mem_cgrp = memcg->css.cgroup; | 1704 | mem_cgrp = memcg->css.cgroup; |
| @@ -1767,7 +1767,7 @@ done: | |||
| 1767 | 1767 | ||
| 1768 | pr_cont("\n"); | 1768 | pr_cont("\n"); |
| 1769 | } | 1769 | } |
| 1770 | spin_unlock(&oom_info_lock); | 1770 | mutex_unlock(&oom_info_lock); |
| 1771 | } | 1771 | } |
| 1772 | 1772 | ||
| 1773 | /* | 1773 | /* |
| @@ -6595,6 +6595,7 @@ static void mem_cgroup_css_offline(struct cgroup_subsys_state *css) | |||
| 6595 | { | 6595 | { |
| 6596 | struct mem_cgroup *memcg = mem_cgroup_from_css(css); | 6596 | struct mem_cgroup *memcg = mem_cgroup_from_css(css); |
| 6597 | struct mem_cgroup_event *event, *tmp; | 6597 | struct mem_cgroup_event *event, *tmp; |
| 6598 | struct cgroup_subsys_state *iter; | ||
| 6598 | 6599 | ||
| 6599 | /* | 6600 | /* |
| 6600 | * Unregister events and notify userspace. | 6601 | * Unregister events and notify userspace. |
| @@ -6611,7 +6612,14 @@ static void mem_cgroup_css_offline(struct cgroup_subsys_state *css) | |||
| 6611 | kmem_cgroup_css_offline(memcg); | 6612 | kmem_cgroup_css_offline(memcg); |
| 6612 | 6613 | ||
| 6613 | mem_cgroup_invalidate_reclaim_iterators(memcg); | 6614 | mem_cgroup_invalidate_reclaim_iterators(memcg); |
| 6614 | mem_cgroup_reparent_charges(memcg); | 6615 | |
| 6616 | /* | ||
| 6617 | * This requires that offlining is serialized. Right now that is | ||
| 6618 | * guaranteed because css_killed_work_fn() holds the cgroup_mutex. | ||
| 6619 | */ | ||
| 6620 | css_for_each_descendant_post(iter, css) | ||
| 6621 | mem_cgroup_reparent_charges(mem_cgroup_from_css(iter)); | ||
| 6622 | |||
| 6615 | mem_cgroup_destroy_all_caches(memcg); | 6623 | mem_cgroup_destroy_all_caches(memcg); |
| 6616 | vmpressure_cleanup(&memcg->vmpressure); | 6624 | vmpressure_cleanup(&memcg->vmpressure); |
| 6617 | } | 6625 | } |
diff --git a/mm/memory-failure.c b/mm/memory-failure.c index 2f2f34a4e77d..90002ea43638 100644 --- a/mm/memory-failure.c +++ b/mm/memory-failure.c | |||
| @@ -1651,7 +1651,7 @@ int soft_offline_page(struct page *page, int flags) | |||
| 1651 | { | 1651 | { |
| 1652 | int ret; | 1652 | int ret; |
| 1653 | unsigned long pfn = page_to_pfn(page); | 1653 | unsigned long pfn = page_to_pfn(page); |
| 1654 | struct page *hpage = compound_trans_head(page); | 1654 | struct page *hpage = compound_head(page); |
| 1655 | 1655 | ||
| 1656 | if (PageHWPoison(page)) { | 1656 | if (PageHWPoison(page)) { |
| 1657 | pr_info("soft offline: %#lx page already poisoned\n", pfn); | 1657 | pr_info("soft offline: %#lx page already poisoned\n", pfn); |
diff --git a/mm/memory.c b/mm/memory.c index be6a0c0d4ae0..22dfa617bddb 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
| @@ -3348,6 +3348,7 @@ static int __do_fault(struct mm_struct *mm, struct vm_area_struct *vma, | |||
| 3348 | if (ret & VM_FAULT_LOCKED) | 3348 | if (ret & VM_FAULT_LOCKED) |
| 3349 | unlock_page(vmf.page); | 3349 | unlock_page(vmf.page); |
| 3350 | ret = VM_FAULT_HWPOISON; | 3350 | ret = VM_FAULT_HWPOISON; |
| 3351 | page_cache_release(vmf.page); | ||
| 3351 | goto uncharge_out; | 3352 | goto uncharge_out; |
| 3352 | } | 3353 | } |
| 3353 | 3354 | ||
| @@ -3703,7 +3704,6 @@ static int __handle_mm_fault(struct mm_struct *mm, struct vm_area_struct *vma, | |||
| 3703 | if (unlikely(is_vm_hugetlb_page(vma))) | 3704 | if (unlikely(is_vm_hugetlb_page(vma))) |
| 3704 | return hugetlb_fault(mm, vma, address, flags); | 3705 | return hugetlb_fault(mm, vma, address, flags); |
| 3705 | 3706 | ||
| 3706 | retry: | ||
| 3707 | pgd = pgd_offset(mm, address); | 3707 | pgd = pgd_offset(mm, address); |
| 3708 | pud = pud_alloc(mm, pgd, address); | 3708 | pud = pud_alloc(mm, pgd, address); |
| 3709 | if (!pud) | 3709 | if (!pud) |
| @@ -3741,20 +3741,13 @@ retry: | |||
| 3741 | if (dirty && !pmd_write(orig_pmd)) { | 3741 | if (dirty && !pmd_write(orig_pmd)) { |
| 3742 | ret = do_huge_pmd_wp_page(mm, vma, address, pmd, | 3742 | ret = do_huge_pmd_wp_page(mm, vma, address, pmd, |
| 3743 | orig_pmd); | 3743 | orig_pmd); |
| 3744 | /* | 3744 | if (!(ret & VM_FAULT_FALLBACK)) |
| 3745 | * If COW results in an oom, the huge pmd will | 3745 | return ret; |
| 3746 | * have been split, so retry the fault on the | ||
| 3747 | * pte for a smaller charge. | ||
| 3748 | */ | ||
| 3749 | if (unlikely(ret & VM_FAULT_OOM)) | ||
| 3750 | goto retry; | ||
| 3751 | return ret; | ||
| 3752 | } else { | 3746 | } else { |
| 3753 | huge_pmd_set_accessed(mm, vma, address, pmd, | 3747 | huge_pmd_set_accessed(mm, vma, address, pmd, |
| 3754 | orig_pmd, dirty); | 3748 | orig_pmd, dirty); |
| 3749 | return 0; | ||
| 3755 | } | 3750 | } |
| 3756 | |||
| 3757 | return 0; | ||
| 3758 | } | 3751 | } |
| 3759 | } | 3752 | } |
| 3760 | 3753 | ||
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index e3758a09a009..3bac76ae4b30 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
| @@ -369,9 +369,11 @@ void prep_compound_page(struct page *page, unsigned long order) | |||
| 369 | __SetPageHead(page); | 369 | __SetPageHead(page); |
| 370 | for (i = 1; i < nr_pages; i++) { | 370 | for (i = 1; i < nr_pages; i++) { |
| 371 | struct page *p = page + i; | 371 | struct page *p = page + i; |
| 372 | __SetPageTail(p); | ||
| 373 | set_page_count(p, 0); | 372 | set_page_count(p, 0); |
| 374 | p->first_page = page; | 373 | p->first_page = page; |
| 374 | /* Make sure p->first_page is always valid for PageTail() */ | ||
| 375 | smp_wmb(); | ||
| 376 | __SetPageTail(p); | ||
| 375 | } | 377 | } |
| 376 | } | 378 | } |
| 377 | 379 | ||
| @@ -1236,6 +1238,15 @@ void drain_zone_pages(struct zone *zone, struct per_cpu_pages *pcp) | |||
| 1236 | } | 1238 | } |
| 1237 | local_irq_restore(flags); | 1239 | local_irq_restore(flags); |
| 1238 | } | 1240 | } |
| 1241 | static bool gfp_thisnode_allocation(gfp_t gfp_mask) | ||
| 1242 | { | ||
| 1243 | return (gfp_mask & GFP_THISNODE) == GFP_THISNODE; | ||
| 1244 | } | ||
| 1245 | #else | ||
| 1246 | static bool gfp_thisnode_allocation(gfp_t gfp_mask) | ||
| 1247 | { | ||
| 1248 | return false; | ||
| 1249 | } | ||
| 1239 | #endif | 1250 | #endif |
| 1240 | 1251 | ||
| 1241 | /* | 1252 | /* |
| @@ -1572,7 +1583,13 @@ again: | |||
| 1572 | get_pageblock_migratetype(page)); | 1583 | get_pageblock_migratetype(page)); |
| 1573 | } | 1584 | } |
| 1574 | 1585 | ||
| 1575 | __mod_zone_page_state(zone, NR_ALLOC_BATCH, -(1 << order)); | 1586 | /* |
| 1587 | * NOTE: GFP_THISNODE allocations do not partake in the kswapd | ||
| 1588 | * aging protocol, so they can't be fair. | ||
| 1589 | */ | ||
| 1590 | if (!gfp_thisnode_allocation(gfp_flags)) | ||
| 1591 | __mod_zone_page_state(zone, NR_ALLOC_BATCH, -(1 << order)); | ||
| 1592 | |||
| 1576 | __count_zone_vm_events(PGALLOC, zone, 1 << order); | 1593 | __count_zone_vm_events(PGALLOC, zone, 1 << order); |
| 1577 | zone_statistics(preferred_zone, zone, gfp_flags); | 1594 | zone_statistics(preferred_zone, zone, gfp_flags); |
| 1578 | local_irq_restore(flags); | 1595 | local_irq_restore(flags); |
| @@ -1944,8 +1961,12 @@ zonelist_scan: | |||
| 1944 | * ultimately fall back to remote zones that do not | 1961 | * ultimately fall back to remote zones that do not |
| 1945 | * partake in the fairness round-robin cycle of this | 1962 | * partake in the fairness round-robin cycle of this |
| 1946 | * zonelist. | 1963 | * zonelist. |
| 1964 | * | ||
| 1965 | * NOTE: GFP_THISNODE allocations do not partake in | ||
| 1966 | * the kswapd aging protocol, so they can't be fair. | ||
| 1947 | */ | 1967 | */ |
| 1948 | if (alloc_flags & ALLOC_WMARK_LOW) { | 1968 | if ((alloc_flags & ALLOC_WMARK_LOW) && |
| 1969 | !gfp_thisnode_allocation(gfp_mask)) { | ||
| 1949 | if (zone_page_state(zone, NR_ALLOC_BATCH) <= 0) | 1970 | if (zone_page_state(zone, NR_ALLOC_BATCH) <= 0) |
| 1950 | continue; | 1971 | continue; |
| 1951 | if (!zone_local(preferred_zone, zone)) | 1972 | if (!zone_local(preferred_zone, zone)) |
| @@ -2501,8 +2522,7 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order, | |||
| 2501 | * allowed per node queues are empty and that nodes are | 2522 | * allowed per node queues are empty and that nodes are |
| 2502 | * over allocated. | 2523 | * over allocated. |
| 2503 | */ | 2524 | */ |
| 2504 | if (IS_ENABLED(CONFIG_NUMA) && | 2525 | if (gfp_thisnode_allocation(gfp_mask)) |
| 2505 | (gfp_mask & GFP_THISNODE) == GFP_THISNODE) | ||
| 2506 | goto nopage; | 2526 | goto nopage; |
| 2507 | 2527 | ||
| 2508 | restart: | 2528 | restart: |
| @@ -98,7 +98,7 @@ static void put_compound_page(struct page *page) | |||
| 98 | } | 98 | } |
| 99 | 99 | ||
| 100 | /* __split_huge_page_refcount can run under us */ | 100 | /* __split_huge_page_refcount can run under us */ |
| 101 | page_head = compound_trans_head(page); | 101 | page_head = compound_head(page); |
| 102 | 102 | ||
| 103 | /* | 103 | /* |
| 104 | * THP can not break up slab pages so avoid taking | 104 | * THP can not break up slab pages so avoid taking |
| @@ -253,7 +253,7 @@ bool __get_page_tail(struct page *page) | |||
| 253 | */ | 253 | */ |
| 254 | unsigned long flags; | 254 | unsigned long flags; |
| 255 | bool got; | 255 | bool got; |
| 256 | struct page *page_head = compound_trans_head(page); | 256 | struct page *page_head = compound_head(page); |
| 257 | 257 | ||
| 258 | /* Ref to put_compound_page() comment. */ | 258 | /* Ref to put_compound_page() comment. */ |
| 259 | if (!__compound_tail_refcounted(page_head)) { | 259 | if (!__compound_tail_refcounted(page_head)) { |
diff --git a/mm/vmpressure.c b/mm/vmpressure.c index 196970a4541f..d4042e75f7c7 100644 --- a/mm/vmpressure.c +++ b/mm/vmpressure.c | |||
| @@ -19,6 +19,7 @@ | |||
| 19 | #include <linux/mm.h> | 19 | #include <linux/mm.h> |
| 20 | #include <linux/vmstat.h> | 20 | #include <linux/vmstat.h> |
| 21 | #include <linux/eventfd.h> | 21 | #include <linux/eventfd.h> |
| 22 | #include <linux/slab.h> | ||
| 22 | #include <linux/swap.h> | 23 | #include <linux/swap.h> |
| 23 | #include <linux/printk.h> | 24 | #include <linux/printk.h> |
| 24 | #include <linux/vmpressure.h> | 25 | #include <linux/vmpressure.h> |
diff --git a/net/sunrpc/auth_gss/auth_gss.c b/net/sunrpc/auth_gss/auth_gss.c index 6c0513a7f992..36e431ee1c90 100644 --- a/net/sunrpc/auth_gss/auth_gss.c +++ b/net/sunrpc/auth_gss/auth_gss.c | |||
| @@ -108,6 +108,7 @@ struct gss_auth { | |||
| 108 | static DEFINE_SPINLOCK(pipe_version_lock); | 108 | static DEFINE_SPINLOCK(pipe_version_lock); |
| 109 | static struct rpc_wait_queue pipe_version_rpc_waitqueue; | 109 | static struct rpc_wait_queue pipe_version_rpc_waitqueue; |
| 110 | static DECLARE_WAIT_QUEUE_HEAD(pipe_version_waitqueue); | 110 | static DECLARE_WAIT_QUEUE_HEAD(pipe_version_waitqueue); |
| 111 | static void gss_put_auth(struct gss_auth *gss_auth); | ||
| 111 | 112 | ||
| 112 | static void gss_free_ctx(struct gss_cl_ctx *); | 113 | static void gss_free_ctx(struct gss_cl_ctx *); |
| 113 | static const struct rpc_pipe_ops gss_upcall_ops_v0; | 114 | static const struct rpc_pipe_ops gss_upcall_ops_v0; |
| @@ -320,6 +321,7 @@ gss_release_msg(struct gss_upcall_msg *gss_msg) | |||
| 320 | if (gss_msg->ctx != NULL) | 321 | if (gss_msg->ctx != NULL) |
| 321 | gss_put_ctx(gss_msg->ctx); | 322 | gss_put_ctx(gss_msg->ctx); |
| 322 | rpc_destroy_wait_queue(&gss_msg->rpc_waitqueue); | 323 | rpc_destroy_wait_queue(&gss_msg->rpc_waitqueue); |
| 324 | gss_put_auth(gss_msg->auth); | ||
| 323 | kfree(gss_msg); | 325 | kfree(gss_msg); |
| 324 | } | 326 | } |
| 325 | 327 | ||
| @@ -498,9 +500,12 @@ gss_alloc_msg(struct gss_auth *gss_auth, | |||
| 498 | default: | 500 | default: |
| 499 | err = gss_encode_v1_msg(gss_msg, service_name, gss_auth->target_name); | 501 | err = gss_encode_v1_msg(gss_msg, service_name, gss_auth->target_name); |
| 500 | if (err) | 502 | if (err) |
| 501 | goto err_free_msg; | 503 | goto err_put_pipe_version; |
| 502 | }; | 504 | }; |
| 505 | kref_get(&gss_auth->kref); | ||
| 503 | return gss_msg; | 506 | return gss_msg; |
| 507 | err_put_pipe_version: | ||
| 508 | put_pipe_version(gss_auth->net); | ||
| 504 | err_free_msg: | 509 | err_free_msg: |
| 505 | kfree(gss_msg); | 510 | kfree(gss_msg); |
| 506 | err: | 511 | err: |
| @@ -991,6 +996,8 @@ gss_create_new(struct rpc_auth_create_args *args, struct rpc_clnt *clnt) | |||
| 991 | gss_auth->service = gss_pseudoflavor_to_service(gss_auth->mech, flavor); | 996 | gss_auth->service = gss_pseudoflavor_to_service(gss_auth->mech, flavor); |
| 992 | if (gss_auth->service == 0) | 997 | if (gss_auth->service == 0) |
| 993 | goto err_put_mech; | 998 | goto err_put_mech; |
| 999 | if (!gssd_running(gss_auth->net)) | ||
| 1000 | goto err_put_mech; | ||
| 994 | auth = &gss_auth->rpc_auth; | 1001 | auth = &gss_auth->rpc_auth; |
| 995 | auth->au_cslack = GSS_CRED_SLACK >> 2; | 1002 | auth->au_cslack = GSS_CRED_SLACK >> 2; |
| 996 | auth->au_rslack = GSS_VERF_SLACK >> 2; | 1003 | auth->au_rslack = GSS_VERF_SLACK >> 2; |
| @@ -1062,6 +1069,12 @@ gss_free_callback(struct kref *kref) | |||
| 1062 | } | 1069 | } |
| 1063 | 1070 | ||
| 1064 | static void | 1071 | static void |
| 1072 | gss_put_auth(struct gss_auth *gss_auth) | ||
| 1073 | { | ||
| 1074 | kref_put(&gss_auth->kref, gss_free_callback); | ||
| 1075 | } | ||
| 1076 | |||
| 1077 | static void | ||
| 1065 | gss_destroy(struct rpc_auth *auth) | 1078 | gss_destroy(struct rpc_auth *auth) |
| 1066 | { | 1079 | { |
| 1067 | struct gss_auth *gss_auth = container_of(auth, | 1080 | struct gss_auth *gss_auth = container_of(auth, |
| @@ -1082,7 +1095,7 @@ gss_destroy(struct rpc_auth *auth) | |||
| 1082 | gss_auth->gss_pipe[1] = NULL; | 1095 | gss_auth->gss_pipe[1] = NULL; |
| 1083 | rpcauth_destroy_credcache(auth); | 1096 | rpcauth_destroy_credcache(auth); |
| 1084 | 1097 | ||
| 1085 | kref_put(&gss_auth->kref, gss_free_callback); | 1098 | gss_put_auth(gss_auth); |
| 1086 | } | 1099 | } |
| 1087 | 1100 | ||
| 1088 | /* | 1101 | /* |
| @@ -1253,7 +1266,7 @@ gss_destroy_nullcred(struct rpc_cred *cred) | |||
| 1253 | call_rcu(&cred->cr_rcu, gss_free_cred_callback); | 1266 | call_rcu(&cred->cr_rcu, gss_free_cred_callback); |
| 1254 | if (ctx) | 1267 | if (ctx) |
| 1255 | gss_put_ctx(ctx); | 1268 | gss_put_ctx(ctx); |
| 1256 | kref_put(&gss_auth->kref, gss_free_callback); | 1269 | gss_put_auth(gss_auth); |
| 1257 | } | 1270 | } |
| 1258 | 1271 | ||
| 1259 | static void | 1272 | static void |
diff --git a/net/sunrpc/backchannel_rqst.c b/net/sunrpc/backchannel_rqst.c index 890a29912d5a..e860d4f7ed2a 100644 --- a/net/sunrpc/backchannel_rqst.c +++ b/net/sunrpc/backchannel_rqst.c | |||
| @@ -64,7 +64,6 @@ static void xprt_free_allocation(struct rpc_rqst *req) | |||
| 64 | free_page((unsigned long)xbufp->head[0].iov_base); | 64 | free_page((unsigned long)xbufp->head[0].iov_base); |
| 65 | xbufp = &req->rq_snd_buf; | 65 | xbufp = &req->rq_snd_buf; |
| 66 | free_page((unsigned long)xbufp->head[0].iov_base); | 66 | free_page((unsigned long)xbufp->head[0].iov_base); |
| 67 | list_del(&req->rq_bc_pa_list); | ||
| 68 | kfree(req); | 67 | kfree(req); |
| 69 | } | 68 | } |
| 70 | 69 | ||
| @@ -168,8 +167,10 @@ out_free: | |||
| 168 | /* | 167 | /* |
| 169 | * Memory allocation failed, free the temporary list | 168 | * Memory allocation failed, free the temporary list |
| 170 | */ | 169 | */ |
| 171 | list_for_each_entry_safe(req, tmp, &tmp_list, rq_bc_pa_list) | 170 | list_for_each_entry_safe(req, tmp, &tmp_list, rq_bc_pa_list) { |
| 171 | list_del(&req->rq_bc_pa_list); | ||
| 172 | xprt_free_allocation(req); | 172 | xprt_free_allocation(req); |
| 173 | } | ||
| 173 | 174 | ||
| 174 | dprintk("RPC: setup backchannel transport failed\n"); | 175 | dprintk("RPC: setup backchannel transport failed\n"); |
| 175 | return -ENOMEM; | 176 | return -ENOMEM; |
| @@ -198,6 +199,7 @@ void xprt_destroy_backchannel(struct rpc_xprt *xprt, unsigned int max_reqs) | |||
| 198 | xprt_dec_alloc_count(xprt, max_reqs); | 199 | xprt_dec_alloc_count(xprt, max_reqs); |
| 199 | list_for_each_entry_safe(req, tmp, &xprt->bc_pa_list, rq_bc_pa_list) { | 200 | list_for_each_entry_safe(req, tmp, &xprt->bc_pa_list, rq_bc_pa_list) { |
| 200 | dprintk("RPC: req=%p\n", req); | 201 | dprintk("RPC: req=%p\n", req); |
| 202 | list_del(&req->rq_bc_pa_list); | ||
| 201 | xprt_free_allocation(req); | 203 | xprt_free_allocation(req); |
| 202 | if (--max_reqs == 0) | 204 | if (--max_reqs == 0) |
| 203 | break; | 205 | break; |
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index 817a1e523969..0addefca8e77 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c | |||
| @@ -510,6 +510,7 @@ static int xs_nospace(struct rpc_task *task) | |||
| 510 | struct rpc_rqst *req = task->tk_rqstp; | 510 | struct rpc_rqst *req = task->tk_rqstp; |
| 511 | struct rpc_xprt *xprt = req->rq_xprt; | 511 | struct rpc_xprt *xprt = req->rq_xprt; |
| 512 | struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); | 512 | struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); |
| 513 | struct sock *sk = transport->inet; | ||
| 513 | int ret = -EAGAIN; | 514 | int ret = -EAGAIN; |
| 514 | 515 | ||
| 515 | dprintk("RPC: %5u xmit incomplete (%u left of %u)\n", | 516 | dprintk("RPC: %5u xmit incomplete (%u left of %u)\n", |
| @@ -527,7 +528,7 @@ static int xs_nospace(struct rpc_task *task) | |||
| 527 | * window size | 528 | * window size |
| 528 | */ | 529 | */ |
| 529 | set_bit(SOCK_NOSPACE, &transport->sock->flags); | 530 | set_bit(SOCK_NOSPACE, &transport->sock->flags); |
| 530 | transport->inet->sk_write_pending++; | 531 | sk->sk_write_pending++; |
| 531 | /* ...and wait for more buffer space */ | 532 | /* ...and wait for more buffer space */ |
| 532 | xprt_wait_for_buffer_space(task, xs_nospace_callback); | 533 | xprt_wait_for_buffer_space(task, xs_nospace_callback); |
| 533 | } | 534 | } |
| @@ -537,6 +538,9 @@ static int xs_nospace(struct rpc_task *task) | |||
| 537 | } | 538 | } |
| 538 | 539 | ||
| 539 | spin_unlock_bh(&xprt->transport_lock); | 540 | spin_unlock_bh(&xprt->transport_lock); |
| 541 | |||
| 542 | /* Race breaker in case memory is freed before above code is called */ | ||
| 543 | sk->sk_write_space(sk); | ||
| 540 | return ret; | 544 | return ret; |
| 541 | } | 545 | } |
| 542 | 546 | ||
diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib index 49392ecbef17..79c059e70860 100644 --- a/scripts/Makefile.lib +++ b/scripts/Makefile.lib | |||
| @@ -152,6 +152,7 @@ ld_flags = $(LDFLAGS) $(ldflags-y) | |||
| 152 | dtc_cpp_flags = -Wp,-MD,$(depfile).pre.tmp -nostdinc \ | 152 | dtc_cpp_flags = -Wp,-MD,$(depfile).pre.tmp -nostdinc \ |
| 153 | -I$(srctree)/arch/$(SRCARCH)/boot/dts \ | 153 | -I$(srctree)/arch/$(SRCARCH)/boot/dts \ |
| 154 | -I$(srctree)/arch/$(SRCARCH)/boot/dts/include \ | 154 | -I$(srctree)/arch/$(SRCARCH)/boot/dts/include \ |
| 155 | -I$(srctree)/drivers/of/testcase-data \ | ||
| 155 | -undef -D__DTS__ | 156 | -undef -D__DTS__ |
| 156 | 157 | ||
| 157 | # Finds the multi-part object the current object will be linked into | 158 | # Finds the multi-part object the current object will be linked into |
diff --git a/scripts/gen_initramfs_list.sh b/scripts/gen_initramfs_list.sh index ef474098d9f1..17fa901418ae 100644 --- a/scripts/gen_initramfs_list.sh +++ b/scripts/gen_initramfs_list.sh | |||
| @@ -257,7 +257,7 @@ case "$arg" in | |||
| 257 | && compr="lzop -9 -f" | 257 | && compr="lzop -9 -f" |
| 258 | echo "$output_file" | grep -q "\.lz4$" \ | 258 | echo "$output_file" | grep -q "\.lz4$" \ |
| 259 | && [ -x "`which lz4 2> /dev/null`" ] \ | 259 | && [ -x "`which lz4 2> /dev/null`" ] \ |
| 260 | && compr="lz4 -9 -f" | 260 | && compr="lz4 -l -9 -f" |
| 261 | echo "$output_file" | grep -q "\.cpio$" && compr="cat" | 261 | echo "$output_file" | grep -q "\.cpio$" && compr="cat" |
| 262 | shift | 262 | shift |
| 263 | ;; | 263 | ;; |
diff --git a/scripts/kallsyms.c b/scripts/kallsyms.c index 10085de886fe..276e84b8a8e5 100644 --- a/scripts/kallsyms.c +++ b/scripts/kallsyms.c | |||
| @@ -330,8 +330,7 @@ static void write_src(void) | |||
| 330 | printf("\tPTR\t_text + %#llx\n", | 330 | printf("\tPTR\t_text + %#llx\n", |
| 331 | table[i].addr - _text); | 331 | table[i].addr - _text); |
| 332 | else | 332 | else |
| 333 | printf("\tPTR\t_text - %#llx\n", | 333 | printf("\tPTR\t%#llx\n", table[i].addr); |
| 334 | _text - table[i].addr); | ||
| 335 | } else { | 334 | } else { |
| 336 | printf("\tPTR\t%#llx\n", table[i].addr); | 335 | printf("\tPTR\t%#llx\n", table[i].addr); |
| 337 | } | 336 | } |
diff --git a/security/selinux/ss/policydb.c b/security/selinux/ss/policydb.c index c0f498842129..9c5cdc2caaef 100644 --- a/security/selinux/ss/policydb.c +++ b/security/selinux/ss/policydb.c | |||
| @@ -3338,10 +3338,10 @@ static int filename_write_helper(void *key, void *data, void *ptr) | |||
| 3338 | if (rc) | 3338 | if (rc) |
| 3339 | return rc; | 3339 | return rc; |
| 3340 | 3340 | ||
| 3341 | buf[0] = ft->stype; | 3341 | buf[0] = cpu_to_le32(ft->stype); |
| 3342 | buf[1] = ft->ttype; | 3342 | buf[1] = cpu_to_le32(ft->ttype); |
| 3343 | buf[2] = ft->tclass; | 3343 | buf[2] = cpu_to_le32(ft->tclass); |
| 3344 | buf[3] = otype->otype; | 3344 | buf[3] = cpu_to_le32(otype->otype); |
| 3345 | 3345 | ||
| 3346 | rc = put_entry(buf, sizeof(u32), 4, fp); | 3346 | rc = put_entry(buf, sizeof(u32), 4, fp); |
| 3347 | if (rc) | 3347 | if (rc) |
diff --git a/sound/pci/hda/patch_ca0132.c b/sound/pci/hda/patch_ca0132.c index 54d14793725a..46ecdbb9053f 100644 --- a/sound/pci/hda/patch_ca0132.c +++ b/sound/pci/hda/patch_ca0132.c | |||
| @@ -2662,60 +2662,6 @@ static bool dspload_wait_loaded(struct hda_codec *codec) | |||
| 2662 | } | 2662 | } |
| 2663 | 2663 | ||
| 2664 | /* | 2664 | /* |
| 2665 | * PCM stuffs | ||
| 2666 | */ | ||
| 2667 | static void ca0132_setup_stream(struct hda_codec *codec, hda_nid_t nid, | ||
| 2668 | u32 stream_tag, | ||
| 2669 | int channel_id, int format) | ||
| 2670 | { | ||
| 2671 | unsigned int oldval, newval; | ||
| 2672 | |||
| 2673 | if (!nid) | ||
| 2674 | return; | ||
| 2675 | |||
| 2676 | snd_printdd( | ||
| 2677 | "ca0132_setup_stream: NID=0x%x, stream=0x%x, " | ||
| 2678 | "channel=%d, format=0x%x\n", | ||
| 2679 | nid, stream_tag, channel_id, format); | ||
| 2680 | |||
| 2681 | /* update the format-id if changed */ | ||
| 2682 | oldval = snd_hda_codec_read(codec, nid, 0, | ||
| 2683 | AC_VERB_GET_STREAM_FORMAT, | ||
| 2684 | 0); | ||
| 2685 | if (oldval != format) { | ||
| 2686 | msleep(20); | ||
| 2687 | snd_hda_codec_write(codec, nid, 0, | ||
| 2688 | AC_VERB_SET_STREAM_FORMAT, | ||
| 2689 | format); | ||
| 2690 | } | ||
| 2691 | |||
| 2692 | oldval = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONV, 0); | ||
| 2693 | newval = (stream_tag << 4) | channel_id; | ||
| 2694 | if (oldval != newval) { | ||
| 2695 | snd_hda_codec_write(codec, nid, 0, | ||
| 2696 | AC_VERB_SET_CHANNEL_STREAMID, | ||
| 2697 | newval); | ||
| 2698 | } | ||
| 2699 | } | ||
| 2700 | |||
| 2701 | static void ca0132_cleanup_stream(struct hda_codec *codec, hda_nid_t nid) | ||
| 2702 | { | ||
| 2703 | unsigned int val; | ||
| 2704 | |||
| 2705 | if (!nid) | ||
| 2706 | return; | ||
| 2707 | |||
| 2708 | snd_printdd(KERN_INFO "ca0132_cleanup_stream: NID=0x%x\n", nid); | ||
| 2709 | |||
| 2710 | val = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONV, 0); | ||
| 2711 | if (!val) | ||
| 2712 | return; | ||
| 2713 | |||
| 2714 | snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_STREAM_FORMAT, 0); | ||
| 2715 | snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CHANNEL_STREAMID, 0); | ||
| 2716 | } | ||
| 2717 | |||
| 2718 | /* | ||
| 2719 | * PCM callbacks | 2665 | * PCM callbacks |
| 2720 | */ | 2666 | */ |
| 2721 | static int ca0132_playback_pcm_prepare(struct hda_pcm_stream *hinfo, | 2667 | static int ca0132_playback_pcm_prepare(struct hda_pcm_stream *hinfo, |
| @@ -2726,7 +2672,7 @@ static int ca0132_playback_pcm_prepare(struct hda_pcm_stream *hinfo, | |||
| 2726 | { | 2672 | { |
| 2727 | struct ca0132_spec *spec = codec->spec; | 2673 | struct ca0132_spec *spec = codec->spec; |
| 2728 | 2674 | ||
| 2729 | ca0132_setup_stream(codec, spec->dacs[0], stream_tag, 0, format); | 2675 | snd_hda_codec_setup_stream(codec, spec->dacs[0], stream_tag, 0, format); |
| 2730 | 2676 | ||
| 2731 | return 0; | 2677 | return 0; |
| 2732 | } | 2678 | } |
| @@ -2745,7 +2691,7 @@ static int ca0132_playback_pcm_cleanup(struct hda_pcm_stream *hinfo, | |||
| 2745 | if (spec->effects_switch[PLAY_ENHANCEMENT - EFFECT_START_NID]) | 2691 | if (spec->effects_switch[PLAY_ENHANCEMENT - EFFECT_START_NID]) |
| 2746 | msleep(50); | 2692 | msleep(50); |
| 2747 | 2693 | ||
| 2748 | ca0132_cleanup_stream(codec, spec->dacs[0]); | 2694 | snd_hda_codec_cleanup_stream(codec, spec->dacs[0]); |
| 2749 | 2695 | ||
| 2750 | return 0; | 2696 | return 0; |
| 2751 | } | 2697 | } |
| @@ -2822,10 +2768,8 @@ static int ca0132_capture_pcm_prepare(struct hda_pcm_stream *hinfo, | |||
| 2822 | unsigned int format, | 2768 | unsigned int format, |
| 2823 | struct snd_pcm_substream *substream) | 2769 | struct snd_pcm_substream *substream) |
| 2824 | { | 2770 | { |
| 2825 | struct ca0132_spec *spec = codec->spec; | 2771 | snd_hda_codec_setup_stream(codec, hinfo->nid, |
| 2826 | 2772 | stream_tag, 0, format); | |
| 2827 | ca0132_setup_stream(codec, spec->adcs[substream->number], | ||
| 2828 | stream_tag, 0, format); | ||
| 2829 | 2773 | ||
| 2830 | return 0; | 2774 | return 0; |
| 2831 | } | 2775 | } |
| @@ -2839,7 +2783,7 @@ static int ca0132_capture_pcm_cleanup(struct hda_pcm_stream *hinfo, | |||
| 2839 | if (spec->dsp_state == DSP_DOWNLOADING) | 2783 | if (spec->dsp_state == DSP_DOWNLOADING) |
| 2840 | return 0; | 2784 | return 0; |
| 2841 | 2785 | ||
| 2842 | ca0132_cleanup_stream(codec, hinfo->nid); | 2786 | snd_hda_codec_cleanup_stream(codec, hinfo->nid); |
| 2843 | return 0; | 2787 | return 0; |
| 2844 | } | 2788 | } |
| 2845 | 2789 | ||
| @@ -4742,6 +4686,8 @@ static int patch_ca0132(struct hda_codec *codec) | |||
| 4742 | return err; | 4686 | return err; |
| 4743 | 4687 | ||
| 4744 | codec->patch_ops = ca0132_patch_ops; | 4688 | codec->patch_ops = ca0132_patch_ops; |
| 4689 | codec->pcm_format_first = 1; | ||
| 4690 | codec->no_sticky_stream = 1; | ||
| 4745 | 4691 | ||
| 4746 | return 0; | 4692 | return 0; |
| 4747 | } | 4693 | } |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index a9a83b85517a..ec304f3ae3b4 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -4308,7 +4308,9 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | |||
| 4308 | SND_PCI_QUIRK(0x1028, 0x0651, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE), | 4308 | SND_PCI_QUIRK(0x1028, 0x0651, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE), |
| 4309 | SND_PCI_QUIRK(0x1028, 0x0652, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE), | 4309 | SND_PCI_QUIRK(0x1028, 0x0652, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE), |
| 4310 | SND_PCI_QUIRK(0x1028, 0x0653, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE), | 4310 | SND_PCI_QUIRK(0x1028, 0x0653, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE), |
| 4311 | SND_PCI_QUIRK(0x1028, 0x0657, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE), | ||
| 4311 | SND_PCI_QUIRK(0x1028, 0x0658, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | 4312 | SND_PCI_QUIRK(0x1028, 0x0658, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
| 4313 | SND_PCI_QUIRK(0x1028, 0x065f, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE), | ||
| 4312 | SND_PCI_QUIRK(0x1028, 0x0662, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE), | 4314 | SND_PCI_QUIRK(0x1028, 0x0662, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE), |
| 4313 | SND_PCI_QUIRK(0x1028, 0x15cc, "Dell X5 Precision", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE), | 4315 | SND_PCI_QUIRK(0x1028, 0x15cc, "Dell X5 Precision", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE), |
| 4314 | SND_PCI_QUIRK(0x1028, 0x15cd, "Dell X5 Precision", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE), | 4316 | SND_PCI_QUIRK(0x1028, 0x15cd, "Dell X5 Precision", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE), |
| @@ -4317,6 +4319,54 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | |||
| 4317 | SND_PCI_QUIRK(0x103c, 0x1973, "HP Pavilion", ALC269_FIXUP_HP_MUTE_LED_MIC1), | 4319 | SND_PCI_QUIRK(0x103c, 0x1973, "HP Pavilion", ALC269_FIXUP_HP_MUTE_LED_MIC1), |
| 4318 | SND_PCI_QUIRK(0x103c, 0x1983, "HP Pavilion", ALC269_FIXUP_HP_MUTE_LED_MIC1), | 4320 | SND_PCI_QUIRK(0x103c, 0x1983, "HP Pavilion", ALC269_FIXUP_HP_MUTE_LED_MIC1), |
| 4319 | SND_PCI_QUIRK(0x103c, 0x218b, "HP", ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED), | 4321 | SND_PCI_QUIRK(0x103c, 0x218b, "HP", ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED), |
| 4322 | /* ALC282 */ | ||
| 4323 | SND_PCI_QUIRK(0x103c, 0x220f, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4324 | SND_PCI_QUIRK(0x103c, 0x2213, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4325 | SND_PCI_QUIRK(0x103c, 0x2266, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4326 | SND_PCI_QUIRK(0x103c, 0x2267, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4327 | SND_PCI_QUIRK(0x103c, 0x2268, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4328 | SND_PCI_QUIRK(0x103c, 0x2269, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4329 | SND_PCI_QUIRK(0x103c, 0x226a, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4330 | SND_PCI_QUIRK(0x103c, 0x226b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4331 | SND_PCI_QUIRK(0x103c, 0x227a, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4332 | SND_PCI_QUIRK(0x103c, 0x227b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4333 | SND_PCI_QUIRK(0x103c, 0x229e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4334 | SND_PCI_QUIRK(0x103c, 0x22a0, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4335 | SND_PCI_QUIRK(0x103c, 0x22b2, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4336 | SND_PCI_QUIRK(0x103c, 0x22b7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4337 | SND_PCI_QUIRK(0x103c, 0x22bf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4338 | SND_PCI_QUIRK(0x103c, 0x22c0, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4339 | SND_PCI_QUIRK(0x103c, 0x22c1, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4340 | SND_PCI_QUIRK(0x103c, 0x22c2, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4341 | SND_PCI_QUIRK(0x103c, 0x22cd, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4342 | SND_PCI_QUIRK(0x103c, 0x22ce, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4343 | SND_PCI_QUIRK(0x103c, 0x22cf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4344 | SND_PCI_QUIRK(0x103c, 0x22d0, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4345 | /* ALC290 */ | ||
| 4346 | SND_PCI_QUIRK(0x103c, 0x2260, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4347 | SND_PCI_QUIRK(0x103c, 0x2261, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4348 | SND_PCI_QUIRK(0x103c, 0x2262, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4349 | SND_PCI_QUIRK(0x103c, 0x2263, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4350 | SND_PCI_QUIRK(0x103c, 0x2264, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4351 | SND_PCI_QUIRK(0x103c, 0x2265, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4352 | SND_PCI_QUIRK(0x103c, 0x227d, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4353 | SND_PCI_QUIRK(0x103c, 0x227e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4354 | SND_PCI_QUIRK(0x103c, 0x227f, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4355 | SND_PCI_QUIRK(0x103c, 0x2280, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4356 | SND_PCI_QUIRK(0x103c, 0x2281, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4357 | SND_PCI_QUIRK(0x103c, 0x2282, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4358 | SND_PCI_QUIRK(0x103c, 0x2289, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4359 | SND_PCI_QUIRK(0x103c, 0x228a, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4360 | SND_PCI_QUIRK(0x103c, 0x228b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4361 | SND_PCI_QUIRK(0x103c, 0x228c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4362 | SND_PCI_QUIRK(0x103c, 0x228d, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4363 | SND_PCI_QUIRK(0x103c, 0x228e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4364 | SND_PCI_QUIRK(0x103c, 0x22c5, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4365 | SND_PCI_QUIRK(0x103c, 0x22c6, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4366 | SND_PCI_QUIRK(0x103c, 0x22c7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4367 | SND_PCI_QUIRK(0x103c, 0x22c8, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4368 | SND_PCI_QUIRK(0x103c, 0x22c3, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4369 | SND_PCI_QUIRK(0x103c, 0x22c4, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4320 | SND_PCI_QUIRK_VENDOR(0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED), | 4370 | SND_PCI_QUIRK_VENDOR(0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED), |
| 4321 | SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300), | 4371 | SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300), |
| 4322 | SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), | 4372 | SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), |
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 7311badf6a94..3bc29c9b2529 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
| @@ -83,6 +83,7 @@ enum { | |||
| 83 | STAC_DELL_M6_BOTH, | 83 | STAC_DELL_M6_BOTH, |
| 84 | STAC_DELL_EQ, | 84 | STAC_DELL_EQ, |
| 85 | STAC_ALIENWARE_M17X, | 85 | STAC_ALIENWARE_M17X, |
| 86 | STAC_92HD89XX_HP_FRONT_JACK, | ||
| 86 | STAC_92HD73XX_MODELS | 87 | STAC_92HD73XX_MODELS |
| 87 | }; | 88 | }; |
| 88 | 89 | ||
| @@ -97,6 +98,7 @@ enum { | |||
| 97 | STAC_92HD83XXX_HP_LED, | 98 | STAC_92HD83XXX_HP_LED, |
| 98 | STAC_92HD83XXX_HP_INV_LED, | 99 | STAC_92HD83XXX_HP_INV_LED, |
| 99 | STAC_92HD83XXX_HP_MIC_LED, | 100 | STAC_92HD83XXX_HP_MIC_LED, |
| 101 | STAC_HP_LED_GPIO10, | ||
| 100 | STAC_92HD83XXX_HEADSET_JACK, | 102 | STAC_92HD83XXX_HEADSET_JACK, |
| 101 | STAC_92HD83XXX_HP, | 103 | STAC_92HD83XXX_HP, |
| 102 | STAC_HP_ENVY_BASS, | 104 | STAC_HP_ENVY_BASS, |
| @@ -1795,6 +1797,12 @@ static const struct hda_pintbl intel_dg45id_pin_configs[] = { | |||
| 1795 | {} | 1797 | {} |
| 1796 | }; | 1798 | }; |
| 1797 | 1799 | ||
| 1800 | static const struct hda_pintbl stac92hd89xx_hp_front_jack_pin_configs[] = { | ||
| 1801 | { 0x0a, 0x02214030 }, | ||
| 1802 | { 0x0b, 0x02A19010 }, | ||
| 1803 | {} | ||
| 1804 | }; | ||
| 1805 | |||
| 1798 | static void stac92hd73xx_fixup_ref(struct hda_codec *codec, | 1806 | static void stac92hd73xx_fixup_ref(struct hda_codec *codec, |
| 1799 | const struct hda_fixup *fix, int action) | 1807 | const struct hda_fixup *fix, int action) |
| 1800 | { | 1808 | { |
| @@ -1913,6 +1921,10 @@ static const struct hda_fixup stac92hd73xx_fixups[] = { | |||
| 1913 | [STAC_92HD73XX_NO_JD] = { | 1921 | [STAC_92HD73XX_NO_JD] = { |
| 1914 | .type = HDA_FIXUP_FUNC, | 1922 | .type = HDA_FIXUP_FUNC, |
| 1915 | .v.func = stac92hd73xx_fixup_no_jd, | 1923 | .v.func = stac92hd73xx_fixup_no_jd, |
| 1924 | }, | ||
| 1925 | [STAC_92HD89XX_HP_FRONT_JACK] = { | ||
| 1926 | .type = HDA_FIXUP_PINS, | ||
| 1927 | .v.pins = stac92hd89xx_hp_front_jack_pin_configs, | ||
| 1916 | } | 1928 | } |
| 1917 | }; | 1929 | }; |
| 1918 | 1930 | ||
| @@ -1973,6 +1985,8 @@ static const struct snd_pci_quirk stac92hd73xx_fixup_tbl[] = { | |||
| 1973 | "Alienware M17x", STAC_ALIENWARE_M17X), | 1985 | "Alienware M17x", STAC_ALIENWARE_M17X), |
| 1974 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0490, | 1986 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0490, |
| 1975 | "Alienware M17x R3", STAC_DELL_EQ), | 1987 | "Alienware M17x R3", STAC_DELL_EQ), |
| 1988 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2b17, | ||
| 1989 | "unknown HP", STAC_92HD89XX_HP_FRONT_JACK), | ||
| 1976 | {} /* terminator */ | 1990 | {} /* terminator */ |
| 1977 | }; | 1991 | }; |
| 1978 | 1992 | ||
| @@ -2117,6 +2131,17 @@ static void stac92hd83xxx_fixup_hp_mic_led(struct hda_codec *codec, | |||
| 2117 | } | 2131 | } |
| 2118 | } | 2132 | } |
| 2119 | 2133 | ||
| 2134 | static void stac92hd83xxx_fixup_hp_led_gpio10(struct hda_codec *codec, | ||
| 2135 | const struct hda_fixup *fix, int action) | ||
| 2136 | { | ||
| 2137 | struct sigmatel_spec *spec = codec->spec; | ||
| 2138 | |||
| 2139 | if (action == HDA_FIXUP_ACT_PRE_PROBE) { | ||
| 2140 | spec->gpio_led = 0x10; /* GPIO4 */ | ||
| 2141 | spec->default_polarity = 0; | ||
| 2142 | } | ||
| 2143 | } | ||
| 2144 | |||
| 2120 | static void stac92hd83xxx_fixup_headset_jack(struct hda_codec *codec, | 2145 | static void stac92hd83xxx_fixup_headset_jack(struct hda_codec *codec, |
| 2121 | const struct hda_fixup *fix, int action) | 2146 | const struct hda_fixup *fix, int action) |
| 2122 | { | 2147 | { |
| @@ -2611,6 +2636,12 @@ static const struct hda_fixup stac92hd83xxx_fixups[] = { | |||
| 2611 | .chained = true, | 2636 | .chained = true, |
| 2612 | .chain_id = STAC_92HD83XXX_HP, | 2637 | .chain_id = STAC_92HD83XXX_HP, |
| 2613 | }, | 2638 | }, |
| 2639 | [STAC_HP_LED_GPIO10] = { | ||
| 2640 | .type = HDA_FIXUP_FUNC, | ||
| 2641 | .v.func = stac92hd83xxx_fixup_hp_led_gpio10, | ||
| 2642 | .chained = true, | ||
| 2643 | .chain_id = STAC_92HD83XXX_HP, | ||
| 2644 | }, | ||
| 2614 | [STAC_92HD83XXX_HEADSET_JACK] = { | 2645 | [STAC_92HD83XXX_HEADSET_JACK] = { |
| 2615 | .type = HDA_FIXUP_FUNC, | 2646 | .type = HDA_FIXUP_FUNC, |
| 2616 | .v.func = stac92hd83xxx_fixup_headset_jack, | 2647 | .v.func = stac92hd83xxx_fixup_headset_jack, |
| @@ -2689,6 +2720,8 @@ static const struct snd_pci_quirk stac92hd83xxx_fixup_tbl[] = { | |||
| 2689 | "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), | 2720 | "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), |
| 2690 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1888, | 2721 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1888, |
| 2691 | "HP Envy Spectre", STAC_HP_ENVY_BASS), | 2722 | "HP Envy Spectre", STAC_HP_ENVY_BASS), |
| 2723 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1899, | ||
| 2724 | "HP Folio 13", STAC_HP_LED_GPIO10), | ||
| 2692 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x18df, | 2725 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x18df, |
| 2693 | "HP Folio", STAC_HP_BNB13_EQ), | 2726 | "HP Folio", STAC_HP_BNB13_EQ), |
| 2694 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x18F8, | 2727 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x18F8, |
diff --git a/sound/soc/blackfin/Kconfig b/sound/soc/blackfin/Kconfig index 54f74f8cbb75..4544d8eb1452 100644 --- a/sound/soc/blackfin/Kconfig +++ b/sound/soc/blackfin/Kconfig | |||
| @@ -11,7 +11,7 @@ config SND_BF5XX_I2S | |||
| 11 | 11 | ||
| 12 | config SND_BF5XX_SOC_SSM2602 | 12 | config SND_BF5XX_SOC_SSM2602 |
| 13 | tristate "SoC SSM2602 Audio Codec Add-On Card support" | 13 | tristate "SoC SSM2602 Audio Codec Add-On Card support" |
| 14 | depends on SND_BF5XX_I2S && (SPI_MASTER || I2C) | 14 | depends on SND_BF5XX_I2S && SND_SOC_I2C_AND_SPI |
| 15 | select SND_BF5XX_SOC_I2S if !BF60x | 15 | select SND_BF5XX_SOC_I2S if !BF60x |
| 16 | select SND_BF6XX_SOC_I2S if BF60x | 16 | select SND_BF6XX_SOC_I2S if BF60x |
| 17 | select SND_SOC_SSM2602 | 17 | select SND_SOC_SSM2602 |
| @@ -21,10 +21,9 @@ config SND_BF5XX_SOC_SSM2602 | |||
| 21 | 21 | ||
| 22 | config SND_SOC_BFIN_EVAL_ADAU1701 | 22 | config SND_SOC_BFIN_EVAL_ADAU1701 |
| 23 | tristate "Support for the EVAL-ADAU1701MINIZ board on Blackfin eval boards" | 23 | tristate "Support for the EVAL-ADAU1701MINIZ board on Blackfin eval boards" |
| 24 | depends on SND_BF5XX_I2S | 24 | depends on SND_BF5XX_I2S && I2C |
| 25 | select SND_BF5XX_SOC_I2S | 25 | select SND_BF5XX_SOC_I2S |
| 26 | select SND_SOC_ADAU1701 | 26 | select SND_SOC_ADAU1701 |
| 27 | select I2C | ||
| 28 | help | 27 | help |
| 29 | Say Y if you want to add support for the Analog Devices EVAL-ADAU1701MINIZ | 28 | Say Y if you want to add support for the Analog Devices EVAL-ADAU1701MINIZ |
| 30 | board connected to one of the Blackfin evaluation boards like the | 29 | board connected to one of the Blackfin evaluation boards like the |
| @@ -45,7 +44,7 @@ config SND_SOC_BFIN_EVAL_ADAU1373 | |||
| 45 | 44 | ||
| 46 | config SND_SOC_BFIN_EVAL_ADAV80X | 45 | config SND_SOC_BFIN_EVAL_ADAV80X |
| 47 | tristate "Support for the EVAL-ADAV80X boards on Blackfin eval boards" | 46 | tristate "Support for the EVAL-ADAV80X boards on Blackfin eval boards" |
| 48 | depends on SND_BF5XX_I2S && (SPI_MASTER || I2C) | 47 | depends on SND_BF5XX_I2S && SND_SOC_I2C_AND_SPI |
| 49 | select SND_BF5XX_SOC_I2S | 48 | select SND_BF5XX_SOC_I2S |
| 50 | select SND_SOC_ADAV80X | 49 | select SND_SOC_ADAV80X |
| 51 | help | 50 | help |
| @@ -58,7 +57,7 @@ config SND_SOC_BFIN_EVAL_ADAV80X | |||
| 58 | 57 | ||
| 59 | config SND_BF5XX_SOC_AD1836 | 58 | config SND_BF5XX_SOC_AD1836 |
| 60 | tristate "SoC AD1836 Audio support for BF5xx" | 59 | tristate "SoC AD1836 Audio support for BF5xx" |
| 61 | depends on SND_BF5XX_I2S | 60 | depends on SND_BF5XX_I2S && SPI_MASTER |
| 62 | select SND_BF5XX_SOC_I2S | 61 | select SND_BF5XX_SOC_I2S |
| 63 | select SND_SOC_AD1836 | 62 | select SND_SOC_AD1836 |
| 64 | help | 63 | help |
| @@ -66,7 +65,7 @@ config SND_BF5XX_SOC_AD1836 | |||
| 66 | 65 | ||
| 67 | config SND_BF5XX_SOC_AD193X | 66 | config SND_BF5XX_SOC_AD193X |
| 68 | tristate "SoC AD193X Audio support for Blackfin" | 67 | tristate "SoC AD193X Audio support for Blackfin" |
| 69 | depends on SND_BF5XX_I2S | 68 | depends on SND_BF5XX_I2S && SND_SOC_I2C_AND_SPI |
| 70 | select SND_BF5XX_SOC_I2S | 69 | select SND_BF5XX_SOC_I2S |
| 71 | select SND_SOC_AD193X | 70 | select SND_SOC_AD193X |
| 72 | help | 71 | help |
diff --git a/sound/soc/codecs/ad1980.c b/sound/soc/codecs/ad1980.c index 7257a8885f42..34d965a4a040 100644 --- a/sound/soc/codecs/ad1980.c +++ b/sound/soc/codecs/ad1980.c | |||
| @@ -57,8 +57,8 @@ static const u16 ad1980_reg[] = { | |||
| 57 | static const char *ad1980_rec_sel[] = {"Mic", "CD", "NC", "AUX", "Line", | 57 | static const char *ad1980_rec_sel[] = {"Mic", "CD", "NC", "AUX", "Line", |
| 58 | "Stereo Mix", "Mono Mix", "Phone"}; | 58 | "Stereo Mix", "Mono Mix", "Phone"}; |
| 59 | 59 | ||
| 60 | static const struct soc_enum ad1980_cap_src = | 60 | static SOC_ENUM_DOUBLE_DECL(ad1980_cap_src, |
| 61 | SOC_ENUM_DOUBLE(AC97_REC_SEL, 8, 0, 7, ad1980_rec_sel); | 61 | AC97_REC_SEL, 8, 0, ad1980_rec_sel); |
| 62 | 62 | ||
| 63 | static const struct snd_kcontrol_new ad1980_snd_ac97_controls[] = { | 63 | static const struct snd_kcontrol_new ad1980_snd_ac97_controls[] = { |
| 64 | SOC_DOUBLE("Master Playback Volume", AC97_MASTER, 8, 0, 31, 1), | 64 | SOC_DOUBLE("Master Playback Volume", AC97_MASTER, 8, 0, 31, 1), |
diff --git a/sound/soc/codecs/da732x.c b/sound/soc/codecs/da732x.c index f295b6569910..f4d965ebc29e 100644 --- a/sound/soc/codecs/da732x.c +++ b/sound/soc/codecs/da732x.c | |||
| @@ -1268,11 +1268,23 @@ static struct snd_soc_dai_driver da732x_dai[] = { | |||
| 1268 | }, | 1268 | }, |
| 1269 | }; | 1269 | }; |
| 1270 | 1270 | ||
| 1271 | static bool da732x_volatile(struct device *dev, unsigned int reg) | ||
| 1272 | { | ||
| 1273 | switch (reg) { | ||
| 1274 | case DA732X_REG_HPL_DAC_OFF_CNTL: | ||
| 1275 | case DA732X_REG_HPR_DAC_OFF_CNTL: | ||
| 1276 | return true; | ||
| 1277 | default: | ||
| 1278 | return false; | ||
| 1279 | } | ||
| 1280 | } | ||
| 1281 | |||
| 1271 | static const struct regmap_config da732x_regmap = { | 1282 | static const struct regmap_config da732x_regmap = { |
| 1272 | .reg_bits = 8, | 1283 | .reg_bits = 8, |
| 1273 | .val_bits = 8, | 1284 | .val_bits = 8, |
| 1274 | 1285 | ||
| 1275 | .max_register = DA732X_MAX_REG, | 1286 | .max_register = DA732X_MAX_REG, |
| 1287 | .volatile_reg = da732x_volatile, | ||
| 1276 | .reg_defaults = da732x_reg_cache, | 1288 | .reg_defaults = da732x_reg_cache, |
| 1277 | .num_reg_defaults = ARRAY_SIZE(da732x_reg_cache), | 1289 | .num_reg_defaults = ARRAY_SIZE(da732x_reg_cache), |
| 1278 | .cache_type = REGCACHE_RBTREE, | 1290 | .cache_type = REGCACHE_RBTREE, |
diff --git a/sound/soc/codecs/da9055.c b/sound/soc/codecs/da9055.c index 52b79a487ac7..422812613a28 100644 --- a/sound/soc/codecs/da9055.c +++ b/sound/soc/codecs/da9055.c | |||
| @@ -1523,8 +1523,15 @@ static int da9055_remove(struct i2c_client *client) | |||
| 1523 | return 0; | 1523 | return 0; |
| 1524 | } | 1524 | } |
| 1525 | 1525 | ||
| 1526 | /* | ||
| 1527 | * DO NOT change the device Ids. The naming is intentionally specific as both | ||
| 1528 | * the CODEC and PMIC parts of this chip are instantiated separately as I2C | ||
| 1529 | * devices (both have configurable I2C addresses, and are to all intents and | ||
| 1530 | * purposes separate). As a result there are specific DA9055 Ids for CODEC | ||
| 1531 | * and PMIC, which must be different to operate together. | ||
| 1532 | */ | ||
| 1526 | static const struct i2c_device_id da9055_i2c_id[] = { | 1533 | static const struct i2c_device_id da9055_i2c_id[] = { |
| 1527 | { "da9055", 0 }, | 1534 | { "da9055-codec", 0 }, |
| 1528 | { } | 1535 | { } |
| 1529 | }; | 1536 | }; |
| 1530 | MODULE_DEVICE_TABLE(i2c, da9055_i2c_id); | 1537 | MODULE_DEVICE_TABLE(i2c, da9055_i2c_id); |
| @@ -1532,7 +1539,7 @@ MODULE_DEVICE_TABLE(i2c, da9055_i2c_id); | |||
| 1532 | /* I2C codec control layer */ | 1539 | /* I2C codec control layer */ |
| 1533 | static struct i2c_driver da9055_i2c_driver = { | 1540 | static struct i2c_driver da9055_i2c_driver = { |
| 1534 | .driver = { | 1541 | .driver = { |
| 1535 | .name = "da9055", | 1542 | .name = "da9055-codec", |
| 1536 | .owner = THIS_MODULE, | 1543 | .owner = THIS_MODULE, |
| 1537 | }, | 1544 | }, |
| 1538 | .probe = da9055_i2c_probe, | 1545 | .probe = da9055_i2c_probe, |
diff --git a/sound/soc/codecs/isabelle.c b/sound/soc/codecs/isabelle.c index 5839048ec467..cb736ddc446d 100644 --- a/sound/soc/codecs/isabelle.c +++ b/sound/soc/codecs/isabelle.c | |||
| @@ -140,13 +140,17 @@ static const char *isabelle_rx1_texts[] = {"VRX1", "ARX1"}; | |||
| 140 | static const char *isabelle_rx2_texts[] = {"VRX2", "ARX2"}; | 140 | static const char *isabelle_rx2_texts[] = {"VRX2", "ARX2"}; |
| 141 | 141 | ||
| 142 | static const struct soc_enum isabelle_rx1_enum[] = { | 142 | static const struct soc_enum isabelle_rx1_enum[] = { |
| 143 | SOC_ENUM_SINGLE(ISABELLE_VOICE_HPF_CFG_REG, 3, 1, isabelle_rx1_texts), | 143 | SOC_ENUM_SINGLE(ISABELLE_VOICE_HPF_CFG_REG, 3, |
| 144 | SOC_ENUM_SINGLE(ISABELLE_AUDIO_HPF_CFG_REG, 5, 1, isabelle_rx1_texts), | 144 | ARRAY_SIZE(isabelle_rx1_texts), isabelle_rx1_texts), |
| 145 | SOC_ENUM_SINGLE(ISABELLE_AUDIO_HPF_CFG_REG, 5, | ||
| 146 | ARRAY_SIZE(isabelle_rx1_texts), isabelle_rx1_texts), | ||
| 145 | }; | 147 | }; |
| 146 | 148 | ||
| 147 | static const struct soc_enum isabelle_rx2_enum[] = { | 149 | static const struct soc_enum isabelle_rx2_enum[] = { |
| 148 | SOC_ENUM_SINGLE(ISABELLE_VOICE_HPF_CFG_REG, 2, 1, isabelle_rx2_texts), | 150 | SOC_ENUM_SINGLE(ISABELLE_VOICE_HPF_CFG_REG, 2, |
| 149 | SOC_ENUM_SINGLE(ISABELLE_AUDIO_HPF_CFG_REG, 4, 1, isabelle_rx2_texts), | 151 | ARRAY_SIZE(isabelle_rx2_texts), isabelle_rx2_texts), |
| 152 | SOC_ENUM_SINGLE(ISABELLE_AUDIO_HPF_CFG_REG, 4, | ||
| 153 | ARRAY_SIZE(isabelle_rx2_texts), isabelle_rx2_texts), | ||
| 150 | }; | 154 | }; |
| 151 | 155 | ||
| 152 | /* Headset DAC playback switches */ | 156 | /* Headset DAC playback switches */ |
| @@ -161,13 +165,17 @@ static const char *isabelle_atx_texts[] = {"AMIC1", "DMIC"}; | |||
| 161 | static const char *isabelle_vtx_texts[] = {"AMIC2", "DMIC"}; | 165 | static const char *isabelle_vtx_texts[] = {"AMIC2", "DMIC"}; |
| 162 | 166 | ||
| 163 | static const struct soc_enum isabelle_atx_enum[] = { | 167 | static const struct soc_enum isabelle_atx_enum[] = { |
| 164 | SOC_ENUM_SINGLE(ISABELLE_AMIC_CFG_REG, 7, 1, isabelle_atx_texts), | 168 | SOC_ENUM_SINGLE(ISABELLE_AMIC_CFG_REG, 7, |
| 165 | SOC_ENUM_SINGLE(ISABELLE_DMIC_CFG_REG, 0, 1, isabelle_atx_texts), | 169 | ARRAY_SIZE(isabelle_atx_texts), isabelle_atx_texts), |
| 170 | SOC_ENUM_SINGLE(ISABELLE_DMIC_CFG_REG, 0, | ||
| 171 | ARRAY_SIZE(isabelle_atx_texts), isabelle_atx_texts), | ||
| 166 | }; | 172 | }; |
| 167 | 173 | ||
| 168 | static const struct soc_enum isabelle_vtx_enum[] = { | 174 | static const struct soc_enum isabelle_vtx_enum[] = { |
| 169 | SOC_ENUM_SINGLE(ISABELLE_AMIC_CFG_REG, 6, 1, isabelle_vtx_texts), | 175 | SOC_ENUM_SINGLE(ISABELLE_AMIC_CFG_REG, 6, |
| 170 | SOC_ENUM_SINGLE(ISABELLE_DMIC_CFG_REG, 0, 1, isabelle_vtx_texts), | 176 | ARRAY_SIZE(isabelle_vtx_texts), isabelle_vtx_texts), |
| 177 | SOC_ENUM_SINGLE(ISABELLE_DMIC_CFG_REG, 0, | ||
| 178 | ARRAY_SIZE(isabelle_vtx_texts), isabelle_vtx_texts), | ||
| 171 | }; | 179 | }; |
| 172 | 180 | ||
| 173 | static const struct snd_kcontrol_new atx_mux_controls = | 181 | static const struct snd_kcontrol_new atx_mux_controls = |
| @@ -183,17 +191,13 @@ static const char *isabelle_amic1_texts[] = { | |||
| 183 | /* Left analog microphone selection */ | 191 | /* Left analog microphone selection */ |
| 184 | static const char *isabelle_amic2_texts[] = {"Sub Mic", "Aux/FM Right"}; | 192 | static const char *isabelle_amic2_texts[] = {"Sub Mic", "Aux/FM Right"}; |
| 185 | 193 | ||
| 186 | static const struct soc_enum isabelle_amic1_enum[] = { | 194 | static SOC_ENUM_SINGLE_DECL(isabelle_amic1_enum, |
| 187 | SOC_ENUM_SINGLE(ISABELLE_AMIC_CFG_REG, 5, | 195 | ISABELLE_AMIC_CFG_REG, 5, |
| 188 | ARRAY_SIZE(isabelle_amic1_texts), | 196 | isabelle_amic1_texts); |
| 189 | isabelle_amic1_texts), | ||
| 190 | }; | ||
| 191 | 197 | ||
| 192 | static const struct soc_enum isabelle_amic2_enum[] = { | 198 | static SOC_ENUM_SINGLE_DECL(isabelle_amic2_enum, |
| 193 | SOC_ENUM_SINGLE(ISABELLE_AMIC_CFG_REG, 4, | 199 | ISABELLE_AMIC_CFG_REG, 4, |
| 194 | ARRAY_SIZE(isabelle_amic2_texts), | 200 | isabelle_amic2_texts); |
| 195 | isabelle_amic2_texts), | ||
| 196 | }; | ||
| 197 | 201 | ||
| 198 | static const struct snd_kcontrol_new amic1_control = | 202 | static const struct snd_kcontrol_new amic1_control = |
| 199 | SOC_DAPM_ENUM("Route", isabelle_amic1_enum); | 203 | SOC_DAPM_ENUM("Route", isabelle_amic1_enum); |
| @@ -206,16 +210,20 @@ static const char *isabelle_st_audio_texts[] = {"ATX1", "ATX2"}; | |||
| 206 | static const char *isabelle_st_voice_texts[] = {"VTX1", "VTX2"}; | 210 | static const char *isabelle_st_voice_texts[] = {"VTX1", "VTX2"}; |
| 207 | 211 | ||
| 208 | static const struct soc_enum isabelle_st_audio_enum[] = { | 212 | static const struct soc_enum isabelle_st_audio_enum[] = { |
| 209 | SOC_ENUM_SINGLE(ISABELLE_ATX_STPGA1_CFG_REG, 7, 1, | 213 | SOC_ENUM_SINGLE(ISABELLE_ATX_STPGA1_CFG_REG, 7, |
| 214 | ARRAY_SIZE(isabelle_st_audio_texts), | ||
| 210 | isabelle_st_audio_texts), | 215 | isabelle_st_audio_texts), |
| 211 | SOC_ENUM_SINGLE(ISABELLE_ATX_STPGA2_CFG_REG, 7, 1, | 216 | SOC_ENUM_SINGLE(ISABELLE_ATX_STPGA2_CFG_REG, 7, |
| 217 | ARRAY_SIZE(isabelle_st_audio_texts), | ||
| 212 | isabelle_st_audio_texts), | 218 | isabelle_st_audio_texts), |
| 213 | }; | 219 | }; |
| 214 | 220 | ||
| 215 | static const struct soc_enum isabelle_st_voice_enum[] = { | 221 | static const struct soc_enum isabelle_st_voice_enum[] = { |
| 216 | SOC_ENUM_SINGLE(ISABELLE_VTX_STPGA1_CFG_REG, 7, 1, | 222 | SOC_ENUM_SINGLE(ISABELLE_VTX_STPGA1_CFG_REG, 7, |
| 223 | ARRAY_SIZE(isabelle_st_voice_texts), | ||
| 217 | isabelle_st_voice_texts), | 224 | isabelle_st_voice_texts), |
| 218 | SOC_ENUM_SINGLE(ISABELLE_VTX2_STPGA2_CFG_REG, 7, 1, | 225 | SOC_ENUM_SINGLE(ISABELLE_VTX2_STPGA2_CFG_REG, 7, |
| 226 | ARRAY_SIZE(isabelle_st_voice_texts), | ||
| 219 | isabelle_st_voice_texts), | 227 | isabelle_st_voice_texts), |
| 220 | }; | 228 | }; |
| 221 | 229 | ||
diff --git a/sound/soc/codecs/max98090.c b/sound/soc/codecs/max98090.c index 51f9b3d16b41..9f714ea86613 100644 --- a/sound/soc/codecs/max98090.c +++ b/sound/soc/codecs/max98090.c | |||
| @@ -336,6 +336,7 @@ static bool max98090_readable_register(struct device *dev, unsigned int reg) | |||
| 336 | case M98090_REG_RECORD_TDM_SLOT: | 336 | case M98090_REG_RECORD_TDM_SLOT: |
| 337 | case M98090_REG_SAMPLE_RATE: | 337 | case M98090_REG_SAMPLE_RATE: |
| 338 | case M98090_REG_DMIC34_BIQUAD_BASE ... M98090_REG_DMIC34_BIQUAD_BASE + 0x0E: | 338 | case M98090_REG_DMIC34_BIQUAD_BASE ... M98090_REG_DMIC34_BIQUAD_BASE + 0x0E: |
| 339 | case M98090_REG_REVISION_ID: | ||
| 339 | return true; | 340 | return true; |
| 340 | default: | 341 | default: |
| 341 | return false; | 342 | return false; |
| @@ -1769,16 +1770,6 @@ static int max98090_set_bias_level(struct snd_soc_codec *codec, | |||
| 1769 | 1770 | ||
| 1770 | switch (level) { | 1771 | switch (level) { |
| 1771 | case SND_SOC_BIAS_ON: | 1772 | case SND_SOC_BIAS_ON: |
| 1772 | if (codec->dapm.bias_level == SND_SOC_BIAS_OFF) { | ||
| 1773 | ret = regcache_sync(max98090->regmap); | ||
| 1774 | |||
| 1775 | if (ret != 0) { | ||
| 1776 | dev_err(codec->dev, | ||
| 1777 | "Failed to sync cache: %d\n", ret); | ||
| 1778 | return ret; | ||
| 1779 | } | ||
| 1780 | } | ||
| 1781 | |||
| 1782 | if (max98090->jack_state == M98090_JACK_STATE_HEADSET) { | 1773 | if (max98090->jack_state == M98090_JACK_STATE_HEADSET) { |
| 1783 | /* | 1774 | /* |
| 1784 | * Set to normal bias level. | 1775 | * Set to normal bias level. |
| @@ -1792,6 +1783,16 @@ static int max98090_set_bias_level(struct snd_soc_codec *codec, | |||
| 1792 | break; | 1783 | break; |
| 1793 | 1784 | ||
| 1794 | case SND_SOC_BIAS_STANDBY: | 1785 | case SND_SOC_BIAS_STANDBY: |
| 1786 | if (codec->dapm.bias_level == SND_SOC_BIAS_OFF) { | ||
| 1787 | ret = regcache_sync(max98090->regmap); | ||
| 1788 | if (ret != 0) { | ||
| 1789 | dev_err(codec->dev, | ||
| 1790 | "Failed to sync cache: %d\n", ret); | ||
| 1791 | return ret; | ||
| 1792 | } | ||
| 1793 | } | ||
| 1794 | break; | ||
| 1795 | |||
| 1795 | case SND_SOC_BIAS_OFF: | 1796 | case SND_SOC_BIAS_OFF: |
| 1796 | /* Set internal pull-up to lowest power mode */ | 1797 | /* Set internal pull-up to lowest power mode */ |
| 1797 | snd_soc_update_bits(codec, M98090_REG_JACK_DETECT, | 1798 | snd_soc_update_bits(codec, M98090_REG_JACK_DETECT, |
diff --git a/sound/soc/codecs/rt5640.c b/sound/soc/codecs/rt5640.c index a3fb41179636..886924934aa5 100644 --- a/sound/soc/codecs/rt5640.c +++ b/sound/soc/codecs/rt5640.c | |||
| @@ -2093,6 +2093,7 @@ MODULE_DEVICE_TABLE(i2c, rt5640_i2c_id); | |||
| 2093 | #ifdef CONFIG_ACPI | 2093 | #ifdef CONFIG_ACPI |
| 2094 | static struct acpi_device_id rt5640_acpi_match[] = { | 2094 | static struct acpi_device_id rt5640_acpi_match[] = { |
| 2095 | { "INT33CA", 0 }, | 2095 | { "INT33CA", 0 }, |
| 2096 | { "10EC5640", 0 }, | ||
| 2096 | { }, | 2097 | { }, |
| 2097 | }; | 2098 | }; |
| 2098 | MODULE_DEVICE_TABLE(acpi, rt5640_acpi_match); | 2099 | MODULE_DEVICE_TABLE(acpi, rt5640_acpi_match); |
diff --git a/sound/soc/codecs/sta32x.c b/sound/soc/codecs/sta32x.c index 06edb396e733..2735361a4c3c 100644 --- a/sound/soc/codecs/sta32x.c +++ b/sound/soc/codecs/sta32x.c | |||
| @@ -187,42 +187,42 @@ static const unsigned int sta32x_limiter_drc_release_tlv[] = { | |||
| 187 | 13, 16, TLV_DB_SCALE_ITEM(-1500, 300, 0), | 187 | 13, 16, TLV_DB_SCALE_ITEM(-1500, 300, 0), |
| 188 | }; | 188 | }; |
| 189 | 189 | ||
| 190 | static const struct soc_enum sta32x_drc_ac_enum = | 190 | static SOC_ENUM_SINGLE_DECL(sta32x_drc_ac_enum, |
| 191 | SOC_ENUM_SINGLE(STA32X_CONFD, STA32X_CONFD_DRC_SHIFT, | 191 | STA32X_CONFD, STA32X_CONFD_DRC_SHIFT, |
| 192 | 2, sta32x_drc_ac); | 192 | sta32x_drc_ac); |
| 193 | static const struct soc_enum sta32x_auto_eq_enum = | 193 | static SOC_ENUM_SINGLE_DECL(sta32x_auto_eq_enum, |
| 194 | SOC_ENUM_SINGLE(STA32X_AUTO1, STA32X_AUTO1_AMEQ_SHIFT, | 194 | STA32X_AUTO1, STA32X_AUTO1_AMEQ_SHIFT, |
| 195 | 3, sta32x_auto_eq_mode); | 195 | sta32x_auto_eq_mode); |
| 196 | static const struct soc_enum sta32x_auto_gc_enum = | 196 | static SOC_ENUM_SINGLE_DECL(sta32x_auto_gc_enum, |
| 197 | SOC_ENUM_SINGLE(STA32X_AUTO1, STA32X_AUTO1_AMGC_SHIFT, | 197 | STA32X_AUTO1, STA32X_AUTO1_AMGC_SHIFT, |
| 198 | 4, sta32x_auto_gc_mode); | 198 | sta32x_auto_gc_mode); |
| 199 | static const struct soc_enum sta32x_auto_xo_enum = | 199 | static SOC_ENUM_SINGLE_DECL(sta32x_auto_xo_enum, |
| 200 | SOC_ENUM_SINGLE(STA32X_AUTO2, STA32X_AUTO2_XO_SHIFT, | 200 | STA32X_AUTO2, STA32X_AUTO2_XO_SHIFT, |
| 201 | 16, sta32x_auto_xo_mode); | 201 | sta32x_auto_xo_mode); |
| 202 | static const struct soc_enum sta32x_preset_eq_enum = | 202 | static SOC_ENUM_SINGLE_DECL(sta32x_preset_eq_enum, |
| 203 | SOC_ENUM_SINGLE(STA32X_AUTO3, STA32X_AUTO3_PEQ_SHIFT, | 203 | STA32X_AUTO3, STA32X_AUTO3_PEQ_SHIFT, |
| 204 | 32, sta32x_preset_eq_mode); | 204 | sta32x_preset_eq_mode); |
| 205 | static const struct soc_enum sta32x_limiter_ch1_enum = | 205 | static SOC_ENUM_SINGLE_DECL(sta32x_limiter_ch1_enum, |
| 206 | SOC_ENUM_SINGLE(STA32X_C1CFG, STA32X_CxCFG_LS_SHIFT, | 206 | STA32X_C1CFG, STA32X_CxCFG_LS_SHIFT, |
| 207 | 3, sta32x_limiter_select); | 207 | sta32x_limiter_select); |
| 208 | static const struct soc_enum sta32x_limiter_ch2_enum = | 208 | static SOC_ENUM_SINGLE_DECL(sta32x_limiter_ch2_enum, |
| 209 | SOC_ENUM_SINGLE(STA32X_C2CFG, STA32X_CxCFG_LS_SHIFT, | 209 | STA32X_C2CFG, STA32X_CxCFG_LS_SHIFT, |
| 210 | 3, sta32x_limiter_select); | 210 | sta32x_limiter_select); |
| 211 | static const struct soc_enum sta32x_limiter_ch3_enum = | 211 | static SOC_ENUM_SINGLE_DECL(sta32x_limiter_ch3_enum, |
| 212 | SOC_ENUM_SINGLE(STA32X_C3CFG, STA32X_CxCFG_LS_SHIFT, | 212 | STA32X_C3CFG, STA32X_CxCFG_LS_SHIFT, |
| 213 | 3, sta32x_limiter_select); | 213 | sta32x_limiter_select); |
| 214 | static const struct soc_enum sta32x_limiter1_attack_rate_enum = | 214 | static SOC_ENUM_SINGLE_DECL(sta32x_limiter1_attack_rate_enum, |
| 215 | SOC_ENUM_SINGLE(STA32X_L1AR, STA32X_LxA_SHIFT, | 215 | STA32X_L1AR, STA32X_LxA_SHIFT, |
| 216 | 16, sta32x_limiter_attack_rate); | 216 | sta32x_limiter_attack_rate); |
| 217 | static const struct soc_enum sta32x_limiter2_attack_rate_enum = | 217 | static SOC_ENUM_SINGLE_DECL(sta32x_limiter2_attack_rate_enum, |
| 218 | SOC_ENUM_SINGLE(STA32X_L2AR, STA32X_LxA_SHIFT, | 218 | STA32X_L2AR, STA32X_LxA_SHIFT, |
| 219 | 16, sta32x_limiter_attack_rate); | 219 | sta32x_limiter_attack_rate); |
| 220 | static const struct soc_enum sta32x_limiter1_release_rate_enum = | 220 | static SOC_ENUM_SINGLE_DECL(sta32x_limiter1_release_rate_enum, |
| 221 | SOC_ENUM_SINGLE(STA32X_L1AR, STA32X_LxR_SHIFT, | 221 | STA32X_L1AR, STA32X_LxR_SHIFT, |
| 222 | 16, sta32x_limiter_release_rate); | 222 | sta32x_limiter_release_rate); |
| 223 | static const struct soc_enum sta32x_limiter2_release_rate_enum = | 223 | static SOC_ENUM_SINGLE_DECL(sta32x_limiter2_release_rate_enum, |
| 224 | SOC_ENUM_SINGLE(STA32X_L2AR, STA32X_LxR_SHIFT, | 224 | STA32X_L2AR, STA32X_LxR_SHIFT, |
| 225 | 16, sta32x_limiter_release_rate); | 225 | sta32x_limiter_release_rate); |
| 226 | 226 | ||
| 227 | /* byte array controls for setting biquad, mixer, scaling coefficients; | 227 | /* byte array controls for setting biquad, mixer, scaling coefficients; |
| 228 | * for biquads all five coefficients need to be set in one go, | 228 | * for biquads all five coefficients need to be set in one go, |
| @@ -331,7 +331,7 @@ static int sta32x_sync_coef_shadow(struct snd_soc_codec *codec) | |||
| 331 | 331 | ||
| 332 | static int sta32x_cache_sync(struct snd_soc_codec *codec) | 332 | static int sta32x_cache_sync(struct snd_soc_codec *codec) |
| 333 | { | 333 | { |
| 334 | struct sta32x_priv *sta32x = codec->control_data; | 334 | struct sta32x_priv *sta32x = snd_soc_codec_get_drvdata(codec); |
| 335 | unsigned int mute; | 335 | unsigned int mute; |
| 336 | int rc; | 336 | int rc; |
| 337 | 337 | ||
| @@ -434,7 +434,7 @@ SOC_SINGLE_TLV("Treble Tone Control", STA32X_TONE, STA32X_TONE_TTC_SHIFT, 15, 0, | |||
| 434 | SOC_ENUM("Limiter1 Attack Rate (dB/ms)", sta32x_limiter1_attack_rate_enum), | 434 | SOC_ENUM("Limiter1 Attack Rate (dB/ms)", sta32x_limiter1_attack_rate_enum), |
| 435 | SOC_ENUM("Limiter2 Attack Rate (dB/ms)", sta32x_limiter2_attack_rate_enum), | 435 | SOC_ENUM("Limiter2 Attack Rate (dB/ms)", sta32x_limiter2_attack_rate_enum), |
| 436 | SOC_ENUM("Limiter1 Release Rate (dB/ms)", sta32x_limiter1_release_rate_enum), | 436 | SOC_ENUM("Limiter1 Release Rate (dB/ms)", sta32x_limiter1_release_rate_enum), |
| 437 | SOC_ENUM("Limiter2 Release Rate (dB/ms)", sta32x_limiter1_release_rate_enum), | 437 | SOC_ENUM("Limiter2 Release Rate (dB/ms)", sta32x_limiter2_release_rate_enum), |
| 438 | 438 | ||
| 439 | /* depending on mode, the attack/release thresholds have | 439 | /* depending on mode, the attack/release thresholds have |
| 440 | * two different enum definitions; provide both | 440 | * two different enum definitions; provide both |
diff --git a/sound/soc/codecs/wm8400.c b/sound/soc/codecs/wm8400.c index 48dc7d2fee36..6d684d934f4d 100644 --- a/sound/soc/codecs/wm8400.c +++ b/sound/soc/codecs/wm8400.c | |||
| @@ -117,19 +117,23 @@ static int wm8400_outpga_put_volsw_vu(struct snd_kcontrol *kcontrol, | |||
| 117 | static const char *wm8400_digital_sidetone[] = | 117 | static const char *wm8400_digital_sidetone[] = |
| 118 | {"None", "Left ADC", "Right ADC", "Reserved"}; | 118 | {"None", "Left ADC", "Right ADC", "Reserved"}; |
| 119 | 119 | ||
| 120 | static const struct soc_enum wm8400_left_digital_sidetone_enum = | 120 | static SOC_ENUM_SINGLE_DECL(wm8400_left_digital_sidetone_enum, |
| 121 | SOC_ENUM_SINGLE(WM8400_DIGITAL_SIDE_TONE, | 121 | WM8400_DIGITAL_SIDE_TONE, |
| 122 | WM8400_ADC_TO_DACL_SHIFT, 2, wm8400_digital_sidetone); | 122 | WM8400_ADC_TO_DACL_SHIFT, |
| 123 | wm8400_digital_sidetone); | ||
| 123 | 124 | ||
| 124 | static const struct soc_enum wm8400_right_digital_sidetone_enum = | 125 | static SOC_ENUM_SINGLE_DECL(wm8400_right_digital_sidetone_enum, |
| 125 | SOC_ENUM_SINGLE(WM8400_DIGITAL_SIDE_TONE, | 126 | WM8400_DIGITAL_SIDE_TONE, |
| 126 | WM8400_ADC_TO_DACR_SHIFT, 2, wm8400_digital_sidetone); | 127 | WM8400_ADC_TO_DACR_SHIFT, |
| 128 | wm8400_digital_sidetone); | ||
| 127 | 129 | ||
| 128 | static const char *wm8400_adcmode[] = | 130 | static const char *wm8400_adcmode[] = |
| 129 | {"Hi-fi mode", "Voice mode 1", "Voice mode 2", "Voice mode 3"}; | 131 | {"Hi-fi mode", "Voice mode 1", "Voice mode 2", "Voice mode 3"}; |
| 130 | 132 | ||
| 131 | static const struct soc_enum wm8400_right_adcmode_enum = | 133 | static SOC_ENUM_SINGLE_DECL(wm8400_right_adcmode_enum, |
| 132 | SOC_ENUM_SINGLE(WM8400_ADC_CTRL, WM8400_ADC_HPF_CUT_SHIFT, 3, wm8400_adcmode); | 134 | WM8400_ADC_CTRL, |
| 135 | WM8400_ADC_HPF_CUT_SHIFT, | ||
| 136 | wm8400_adcmode); | ||
| 133 | 137 | ||
| 134 | static const struct snd_kcontrol_new wm8400_snd_controls[] = { | 138 | static const struct snd_kcontrol_new wm8400_snd_controls[] = { |
| 135 | /* INMIXL */ | 139 | /* INMIXL */ |
| @@ -422,9 +426,10 @@ SOC_DAPM_SINGLE("RINPGA34 Switch", WM8400_INPUT_MIXER3, WM8400_L34MNB_SHIFT, | |||
| 422 | static const char *wm8400_ainlmux[] = | 426 | static const char *wm8400_ainlmux[] = |
| 423 | {"INMIXL Mix", "RXVOICE Mix", "DIFFINL Mix"}; | 427 | {"INMIXL Mix", "RXVOICE Mix", "DIFFINL Mix"}; |
| 424 | 428 | ||
| 425 | static const struct soc_enum wm8400_ainlmux_enum = | 429 | static SOC_ENUM_SINGLE_DECL(wm8400_ainlmux_enum, |
| 426 | SOC_ENUM_SINGLE( WM8400_INPUT_MIXER1, WM8400_AINLMODE_SHIFT, | 430 | WM8400_INPUT_MIXER1, |
| 427 | ARRAY_SIZE(wm8400_ainlmux), wm8400_ainlmux); | 431 | WM8400_AINLMODE_SHIFT, |
| 432 | wm8400_ainlmux); | ||
| 428 | 433 | ||
| 429 | static const struct snd_kcontrol_new wm8400_dapm_ainlmux_controls = | 434 | static const struct snd_kcontrol_new wm8400_dapm_ainlmux_controls = |
| 430 | SOC_DAPM_ENUM("Route", wm8400_ainlmux_enum); | 435 | SOC_DAPM_ENUM("Route", wm8400_ainlmux_enum); |
| @@ -435,9 +440,10 @@ SOC_DAPM_ENUM("Route", wm8400_ainlmux_enum); | |||
| 435 | static const char *wm8400_ainrmux[] = | 440 | static const char *wm8400_ainrmux[] = |
| 436 | {"INMIXR Mix", "RXVOICE Mix", "DIFFINR Mix"}; | 441 | {"INMIXR Mix", "RXVOICE Mix", "DIFFINR Mix"}; |
| 437 | 442 | ||
| 438 | static const struct soc_enum wm8400_ainrmux_enum = | 443 | static SOC_ENUM_SINGLE_DECL(wm8400_ainrmux_enum, |
| 439 | SOC_ENUM_SINGLE( WM8400_INPUT_MIXER1, WM8400_AINRMODE_SHIFT, | 444 | WM8400_INPUT_MIXER1, |
| 440 | ARRAY_SIZE(wm8400_ainrmux), wm8400_ainrmux); | 445 | WM8400_AINRMODE_SHIFT, |
| 446 | wm8400_ainrmux); | ||
| 441 | 447 | ||
| 442 | static const struct snd_kcontrol_new wm8400_dapm_ainrmux_controls = | 448 | static const struct snd_kcontrol_new wm8400_dapm_ainrmux_controls = |
| 443 | SOC_DAPM_ENUM("Route", wm8400_ainrmux_enum); | 449 | SOC_DAPM_ENUM("Route", wm8400_ainrmux_enum); |
diff --git a/sound/soc/codecs/wm8770.c b/sound/soc/codecs/wm8770.c index 89a18d82f303..5bce21013485 100644 --- a/sound/soc/codecs/wm8770.c +++ b/sound/soc/codecs/wm8770.c | |||
| @@ -196,8 +196,8 @@ static const char *ain_text[] = { | |||
| 196 | "AIN5", "AIN6", "AIN7", "AIN8" | 196 | "AIN5", "AIN6", "AIN7", "AIN8" |
| 197 | }; | 197 | }; |
| 198 | 198 | ||
| 199 | static const struct soc_enum ain_enum = | 199 | static SOC_ENUM_DOUBLE_DECL(ain_enum, |
| 200 | SOC_ENUM_DOUBLE(WM8770_ADCMUX, 0, 4, 8, ain_text); | 200 | WM8770_ADCMUX, 0, 4, ain_text); |
| 201 | 201 | ||
| 202 | static const struct snd_kcontrol_new ain_mux = | 202 | static const struct snd_kcontrol_new ain_mux = |
| 203 | SOC_DAPM_ENUM("Capture Mux", ain_enum); | 203 | SOC_DAPM_ENUM("Capture Mux", ain_enum); |
diff --git a/sound/soc/codecs/wm8900.c b/sound/soc/codecs/wm8900.c index e98bc7038a08..43c2201cb901 100644 --- a/sound/soc/codecs/wm8900.c +++ b/sound/soc/codecs/wm8900.c | |||
| @@ -304,53 +304,53 @@ static const DECLARE_TLV_DB_SCALE(adc_tlv, -7200, 75, 1); | |||
| 304 | 304 | ||
| 305 | static const char *mic_bias_level_txt[] = { "0.9*AVDD", "0.65*AVDD" }; | 305 | static const char *mic_bias_level_txt[] = { "0.9*AVDD", "0.65*AVDD" }; |
| 306 | 306 | ||
| 307 | static const struct soc_enum mic_bias_level = | 307 | static SOC_ENUM_SINGLE_DECL(mic_bias_level, |
| 308 | SOC_ENUM_SINGLE(WM8900_REG_INCTL, 8, 2, mic_bias_level_txt); | 308 | WM8900_REG_INCTL, 8, mic_bias_level_txt); |
| 309 | 309 | ||
| 310 | static const char *dac_mute_rate_txt[] = { "Fast", "Slow" }; | 310 | static const char *dac_mute_rate_txt[] = { "Fast", "Slow" }; |
| 311 | 311 | ||
| 312 | static const struct soc_enum dac_mute_rate = | 312 | static SOC_ENUM_SINGLE_DECL(dac_mute_rate, |
| 313 | SOC_ENUM_SINGLE(WM8900_REG_DACCTRL, 7, 2, dac_mute_rate_txt); | 313 | WM8900_REG_DACCTRL, 7, dac_mute_rate_txt); |
| 314 | 314 | ||
| 315 | static const char *dac_deemphasis_txt[] = { | 315 | static const char *dac_deemphasis_txt[] = { |
| 316 | "Disabled", "32kHz", "44.1kHz", "48kHz" | 316 | "Disabled", "32kHz", "44.1kHz", "48kHz" |
| 317 | }; | 317 | }; |
| 318 | 318 | ||
| 319 | static const struct soc_enum dac_deemphasis = | 319 | static SOC_ENUM_SINGLE_DECL(dac_deemphasis, |
| 320 | SOC_ENUM_SINGLE(WM8900_REG_DACCTRL, 4, 4, dac_deemphasis_txt); | 320 | WM8900_REG_DACCTRL, 4, dac_deemphasis_txt); |
| 321 | 321 | ||
| 322 | static const char *adc_hpf_cut_txt[] = { | 322 | static const char *adc_hpf_cut_txt[] = { |
| 323 | "Hi-fi mode", "Voice mode 1", "Voice mode 2", "Voice mode 3" | 323 | "Hi-fi mode", "Voice mode 1", "Voice mode 2", "Voice mode 3" |
| 324 | }; | 324 | }; |
| 325 | 325 | ||
| 326 | static const struct soc_enum adc_hpf_cut = | 326 | static SOC_ENUM_SINGLE_DECL(adc_hpf_cut, |
| 327 | SOC_ENUM_SINGLE(WM8900_REG_ADCCTRL, 5, 4, adc_hpf_cut_txt); | 327 | WM8900_REG_ADCCTRL, 5, adc_hpf_cut_txt); |
| 328 | 328 | ||
| 329 | static const char *lr_txt[] = { | 329 | static const char *lr_txt[] = { |
| 330 | "Left", "Right" | 330 | "Left", "Right" |
| 331 | }; | 331 | }; |
| 332 | 332 | ||
| 333 | static const struct soc_enum aifl_src = | 333 | static SOC_ENUM_SINGLE_DECL(aifl_src, |
| 334 | SOC_ENUM_SINGLE(WM8900_REG_AUDIO1, 15, 2, lr_txt); | 334 | WM8900_REG_AUDIO1, 15, lr_txt); |
| 335 | 335 | ||
| 336 | static const struct soc_enum aifr_src = | 336 | static SOC_ENUM_SINGLE_DECL(aifr_src, |
| 337 | SOC_ENUM_SINGLE(WM8900_REG_AUDIO1, 14, 2, lr_txt); | 337 | WM8900_REG_AUDIO1, 14, lr_txt); |
| 338 | 338 | ||
| 339 | static const struct soc_enum dacl_src = | 339 | static SOC_ENUM_SINGLE_DECL(dacl_src, |
| 340 | SOC_ENUM_SINGLE(WM8900_REG_AUDIO2, 15, 2, lr_txt); | 340 | WM8900_REG_AUDIO2, 15, lr_txt); |
| 341 | 341 | ||
| 342 | static const struct soc_enum dacr_src = | 342 | static SOC_ENUM_SINGLE_DECL(dacr_src, |
| 343 | SOC_ENUM_SINGLE(WM8900_REG_AUDIO2, 14, 2, lr_txt); | 343 | WM8900_REG_AUDIO2, 14, lr_txt); |
| 344 | 344 | ||
| 345 | static const char *sidetone_txt[] = { | 345 | static const char *sidetone_txt[] = { |
| 346 | "Disabled", "Left ADC", "Right ADC" | 346 | "Disabled", "Left ADC", "Right ADC" |
| 347 | }; | 347 | }; |
| 348 | 348 | ||
| 349 | static const struct soc_enum dacl_sidetone = | 349 | static SOC_ENUM_SINGLE_DECL(dacl_sidetone, |
| 350 | SOC_ENUM_SINGLE(WM8900_REG_SIDETONE, 2, 3, sidetone_txt); | 350 | WM8900_REG_SIDETONE, 2, sidetone_txt); |
| 351 | 351 | ||
| 352 | static const struct soc_enum dacr_sidetone = | 352 | static SOC_ENUM_SINGLE_DECL(dacr_sidetone, |
| 353 | SOC_ENUM_SINGLE(WM8900_REG_SIDETONE, 0, 3, sidetone_txt); | 353 | WM8900_REG_SIDETONE, 0, sidetone_txt); |
| 354 | 354 | ||
| 355 | static const struct snd_kcontrol_new wm8900_snd_controls[] = { | 355 | static const struct snd_kcontrol_new wm8900_snd_controls[] = { |
| 356 | SOC_ENUM("Mic Bias Level", mic_bias_level), | 356 | SOC_ENUM("Mic Bias Level", mic_bias_level), |
| @@ -496,8 +496,8 @@ SOC_DAPM_SINGLE("RINPUT3 Switch", WM8900_REG_INCTL, 0, 1, 0), | |||
| 496 | 496 | ||
| 497 | static const char *wm8900_lp_mux[] = { "Disabled", "Enabled" }; | 497 | static const char *wm8900_lp_mux[] = { "Disabled", "Enabled" }; |
| 498 | 498 | ||
| 499 | static const struct soc_enum wm8900_lineout2_lp_mux = | 499 | static SOC_ENUM_SINGLE_DECL(wm8900_lineout2_lp_mux, |
| 500 | SOC_ENUM_SINGLE(WM8900_REG_LOUTMIXCTL1, 1, 2, wm8900_lp_mux); | 500 | WM8900_REG_LOUTMIXCTL1, 1, wm8900_lp_mux); |
| 501 | 501 | ||
| 502 | static const struct snd_kcontrol_new wm8900_lineout2_lp = | 502 | static const struct snd_kcontrol_new wm8900_lineout2_lp = |
| 503 | SOC_DAPM_ENUM("Route", wm8900_lineout2_lp_mux); | 503 | SOC_DAPM_ENUM("Route", wm8900_lineout2_lp_mux); |
diff --git a/sound/soc/codecs/wm8958-dsp2.c b/sound/soc/codecs/wm8958-dsp2.c index b7488f190d2b..d4248e00160e 100644 --- a/sound/soc/codecs/wm8958-dsp2.c +++ b/sound/soc/codecs/wm8958-dsp2.c | |||
| @@ -153,7 +153,7 @@ static int wm8958_dsp2_fw(struct snd_soc_codec *codec, const char *name, | |||
| 153 | 153 | ||
| 154 | data32 &= 0xffffff; | 154 | data32 &= 0xffffff; |
| 155 | 155 | ||
| 156 | wm8994_bulk_write(codec->control_data, | 156 | wm8994_bulk_write(wm8994->wm8994, |
| 157 | data32 & 0xffffff, | 157 | data32 & 0xffffff, |
| 158 | block_len / 2, | 158 | block_len / 2, |
| 159 | (void *)(data + 8)); | 159 | (void *)(data + 8)); |
diff --git a/sound/soc/codecs/wm8993.c b/sound/soc/codecs/wm8993.c index 433d59a0f3ef..2ee23a39622c 100644 --- a/sound/soc/codecs/wm8993.c +++ b/sound/soc/codecs/wm8993.c | |||
| @@ -1562,7 +1562,6 @@ static int wm8993_remove(struct snd_soc_codec *codec) | |||
| 1562 | struct wm8993_priv *wm8993 = snd_soc_codec_get_drvdata(codec); | 1562 | struct wm8993_priv *wm8993 = snd_soc_codec_get_drvdata(codec); |
| 1563 | 1563 | ||
| 1564 | wm8993_set_bias_level(codec, SND_SOC_BIAS_OFF); | 1564 | wm8993_set_bias_level(codec, SND_SOC_BIAS_OFF); |
| 1565 | regulator_bulk_free(ARRAY_SIZE(wm8993->supplies), wm8993->supplies); | ||
| 1566 | return 0; | 1565 | return 0; |
| 1567 | } | 1566 | } |
| 1568 | 1567 | ||
diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c index b9be9cbc4603..adb72063d44e 100644 --- a/sound/soc/codecs/wm8994.c +++ b/sound/soc/codecs/wm8994.c | |||
| @@ -265,21 +265,21 @@ static const char *sidetone_hpf_text[] = { | |||
| 265 | "2.7kHz", "1.35kHz", "675Hz", "370Hz", "180Hz", "90Hz", "45Hz" | 265 | "2.7kHz", "1.35kHz", "675Hz", "370Hz", "180Hz", "90Hz", "45Hz" |
| 266 | }; | 266 | }; |
| 267 | 267 | ||
| 268 | static const struct soc_enum sidetone_hpf = | 268 | static SOC_ENUM_SINGLE_DECL(sidetone_hpf, |
| 269 | SOC_ENUM_SINGLE(WM8994_SIDETONE, 7, 7, sidetone_hpf_text); | 269 | WM8994_SIDETONE, 7, sidetone_hpf_text); |
| 270 | 270 | ||
| 271 | static const char *adc_hpf_text[] = { | 271 | static const char *adc_hpf_text[] = { |
| 272 | "HiFi", "Voice 1", "Voice 2", "Voice 3" | 272 | "HiFi", "Voice 1", "Voice 2", "Voice 3" |
| 273 | }; | 273 | }; |
| 274 | 274 | ||
| 275 | static const struct soc_enum aif1adc1_hpf = | 275 | static SOC_ENUM_SINGLE_DECL(aif1adc1_hpf, |
| 276 | SOC_ENUM_SINGLE(WM8994_AIF1_ADC1_FILTERS, 13, 4, adc_hpf_text); | 276 | WM8994_AIF1_ADC1_FILTERS, 13, adc_hpf_text); |
| 277 | 277 | ||
| 278 | static const struct soc_enum aif1adc2_hpf = | 278 | static SOC_ENUM_SINGLE_DECL(aif1adc2_hpf, |
| 279 | SOC_ENUM_SINGLE(WM8994_AIF1_ADC2_FILTERS, 13, 4, adc_hpf_text); | 279 | WM8994_AIF1_ADC2_FILTERS, 13, adc_hpf_text); |
| 280 | 280 | ||
| 281 | static const struct soc_enum aif2adc_hpf = | 281 | static SOC_ENUM_SINGLE_DECL(aif2adc_hpf, |
| 282 | SOC_ENUM_SINGLE(WM8994_AIF2_ADC_FILTERS, 13, 4, adc_hpf_text); | 282 | WM8994_AIF2_ADC_FILTERS, 13, adc_hpf_text); |
| 283 | 283 | ||
| 284 | static const DECLARE_TLV_DB_SCALE(aif_tlv, 0, 600, 0); | 284 | static const DECLARE_TLV_DB_SCALE(aif_tlv, 0, 600, 0); |
| 285 | static const DECLARE_TLV_DB_SCALE(digital_tlv, -7200, 75, 1); | 285 | static const DECLARE_TLV_DB_SCALE(digital_tlv, -7200, 75, 1); |
| @@ -501,39 +501,39 @@ static const char *aif_chan_src_text[] = { | |||
| 501 | "Left", "Right" | 501 | "Left", "Right" |
| 502 | }; | 502 | }; |
| 503 | 503 | ||
| 504 | static const struct soc_enum aif1adcl_src = | 504 | static SOC_ENUM_SINGLE_DECL(aif1adcl_src, |
| 505 | SOC_ENUM_SINGLE(WM8994_AIF1_CONTROL_1, 15, 2, aif_chan_src_text); | 505 | WM8994_AIF1_CONTROL_1, 15, aif_chan_src_text); |
| 506 | 506 | ||
| 507 | static const struct soc_enum aif1adcr_src = | 507 | static SOC_ENUM_SINGLE_DECL(aif1adcr_src, |
| 508 | SOC_ENUM_SINGLE(WM8994_AIF1_CONTROL_1, 14, 2, aif_chan_src_text); | 508 | WM8994_AIF1_CONTROL_1, 14, aif_chan_src_text); |
| 509 | 509 | ||
| 510 | static const struct soc_enum aif2adcl_src = | 510 | static SOC_ENUM_SINGLE_DECL(aif2adcl_src, |
| 511 | SOC_ENUM_SINGLE(WM8994_AIF2_CONTROL_1, 15, 2, aif_chan_src_text); | 511 | WM8994_AIF2_CONTROL_1, 15, aif_chan_src_text); |
| 512 | 512 | ||
| 513 | static const struct soc_enum aif2adcr_src = | 513 | static SOC_ENUM_SINGLE_DECL(aif2adcr_src, |
| 514 | SOC_ENUM_SINGLE(WM8994_AIF2_CONTROL_1, 14, 2, aif_chan_src_text); | 514 | WM8994_AIF2_CONTROL_1, 14, aif_chan_src_text); |
| 515 | 515 | ||
| 516 | static const struct soc_enum aif1dacl_src = | 516 | static SOC_ENUM_SINGLE_DECL(aif1dacl_src, |
| 517 | SOC_ENUM_SINGLE(WM8994_AIF1_CONTROL_2, 15, 2, aif_chan_src_text); | 517 | WM8994_AIF1_CONTROL_2, 15, aif_chan_src_text); |
| 518 | 518 | ||
| 519 | static const struct soc_enum aif1dacr_src = | 519 | static SOC_ENUM_SINGLE_DECL(aif1dacr_src, |
| 520 | SOC_ENUM_SINGLE(WM8994_AIF1_CONTROL_2, 14, 2, aif_chan_src_text); | 520 | WM8994_AIF1_CONTROL_2, 14, aif_chan_src_text); |
| 521 | 521 | ||
| 522 | static const struct soc_enum aif2dacl_src = | 522 | static SOC_ENUM_SINGLE_DECL(aif2dacl_src, |
| 523 | SOC_ENUM_SINGLE(WM8994_AIF2_CONTROL_2, 15, 2, aif_chan_src_text); | 523 | WM8994_AIF2_CONTROL_2, 15, aif_chan_src_text); |
| 524 | 524 | ||
| 525 | static const struct soc_enum aif2dacr_src = | 525 | static SOC_ENUM_SINGLE_DECL(aif2dacr_src, |
| 526 | SOC_ENUM_SINGLE(WM8994_AIF2_CONTROL_2, 14, 2, aif_chan_src_text); | 526 | WM8994_AIF2_CONTROL_2, 14, aif_chan_src_text); |
| 527 | 527 | ||
| 528 | static const char *osr_text[] = { | 528 | static const char *osr_text[] = { |
| 529 | "Low Power", "High Performance", | 529 | "Low Power", "High Performance", |
| 530 | }; | 530 | }; |
| 531 | 531 | ||
| 532 | static const struct soc_enum dac_osr = | 532 | static SOC_ENUM_SINGLE_DECL(dac_osr, |
| 533 | SOC_ENUM_SINGLE(WM8994_OVERSAMPLING, 0, 2, osr_text); | 533 | WM8994_OVERSAMPLING, 0, osr_text); |
| 534 | 534 | ||
| 535 | static const struct soc_enum adc_osr = | 535 | static SOC_ENUM_SINGLE_DECL(adc_osr, |
| 536 | SOC_ENUM_SINGLE(WM8994_OVERSAMPLING, 1, 2, osr_text); | 536 | WM8994_OVERSAMPLING, 1, osr_text); |
| 537 | 537 | ||
| 538 | static const struct snd_kcontrol_new wm8994_snd_controls[] = { | 538 | static const struct snd_kcontrol_new wm8994_snd_controls[] = { |
| 539 | SOC_DOUBLE_R_TLV("AIF1ADC1 Volume", WM8994_AIF1_ADC1_LEFT_VOLUME, | 539 | SOC_DOUBLE_R_TLV("AIF1ADC1 Volume", WM8994_AIF1_ADC1_LEFT_VOLUME, |
| @@ -690,17 +690,20 @@ static const char *wm8958_ng_text[] = { | |||
| 690 | "30ms", "125ms", "250ms", "500ms", | 690 | "30ms", "125ms", "250ms", "500ms", |
| 691 | }; | 691 | }; |
| 692 | 692 | ||
| 693 | static const struct soc_enum wm8958_aif1dac1_ng_hold = | 693 | static SOC_ENUM_SINGLE_DECL(wm8958_aif1dac1_ng_hold, |
| 694 | SOC_ENUM_SINGLE(WM8958_AIF1_DAC1_NOISE_GATE, | 694 | WM8958_AIF1_DAC1_NOISE_GATE, |
| 695 | WM8958_AIF1DAC1_NG_THR_SHIFT, 4, wm8958_ng_text); | 695 | WM8958_AIF1DAC1_NG_THR_SHIFT, |
| 696 | wm8958_ng_text); | ||
| 696 | 697 | ||
| 697 | static const struct soc_enum wm8958_aif1dac2_ng_hold = | 698 | static SOC_ENUM_SINGLE_DECL(wm8958_aif1dac2_ng_hold, |
| 698 | SOC_ENUM_SINGLE(WM8958_AIF1_DAC2_NOISE_GATE, | 699 | WM8958_AIF1_DAC2_NOISE_GATE, |
| 699 | WM8958_AIF1DAC2_NG_THR_SHIFT, 4, wm8958_ng_text); | 700 | WM8958_AIF1DAC2_NG_THR_SHIFT, |
| 701 | wm8958_ng_text); | ||
| 700 | 702 | ||
| 701 | static const struct soc_enum wm8958_aif2dac_ng_hold = | 703 | static SOC_ENUM_SINGLE_DECL(wm8958_aif2dac_ng_hold, |
| 702 | SOC_ENUM_SINGLE(WM8958_AIF2_DAC_NOISE_GATE, | 704 | WM8958_AIF2_DAC_NOISE_GATE, |
| 703 | WM8958_AIF2DAC_NG_THR_SHIFT, 4, wm8958_ng_text); | 705 | WM8958_AIF2DAC_NG_THR_SHIFT, |
| 706 | wm8958_ng_text); | ||
| 704 | 707 | ||
| 705 | static const struct snd_kcontrol_new wm8958_snd_controls[] = { | 708 | static const struct snd_kcontrol_new wm8958_snd_controls[] = { |
| 706 | SOC_SINGLE_TLV("AIF3 Boost Volume", WM8958_AIF3_CONTROL_2, 10, 3, 0, aif_tlv), | 709 | SOC_SINGLE_TLV("AIF3 Boost Volume", WM8958_AIF3_CONTROL_2, 10, 3, 0, aif_tlv), |
| @@ -1341,8 +1344,8 @@ static const char *adc_mux_text[] = { | |||
| 1341 | "DMIC", | 1344 | "DMIC", |
| 1342 | }; | 1345 | }; |
| 1343 | 1346 | ||
| 1344 | static const struct soc_enum adc_enum = | 1347 | static SOC_ENUM_SINGLE_DECL(adc_enum, |
| 1345 | SOC_ENUM_SINGLE(0, 0, 2, adc_mux_text); | 1348 | 0, 0, adc_mux_text); |
| 1346 | 1349 | ||
| 1347 | static const struct snd_kcontrol_new adcl_mux = | 1350 | static const struct snd_kcontrol_new adcl_mux = |
| 1348 | SOC_DAPM_ENUM_VIRT("ADCL Mux", adc_enum); | 1351 | SOC_DAPM_ENUM_VIRT("ADCL Mux", adc_enum); |
| @@ -1478,14 +1481,14 @@ static const char *sidetone_text[] = { | |||
| 1478 | "ADC/DMIC1", "DMIC2", | 1481 | "ADC/DMIC1", "DMIC2", |
| 1479 | }; | 1482 | }; |
| 1480 | 1483 | ||
| 1481 | static const struct soc_enum sidetone1_enum = | 1484 | static SOC_ENUM_SINGLE_DECL(sidetone1_enum, |
| 1482 | SOC_ENUM_SINGLE(WM8994_SIDETONE, 0, 2, sidetone_text); | 1485 | WM8994_SIDETONE, 0, sidetone_text); |
| 1483 | 1486 | ||
| 1484 | static const struct snd_kcontrol_new sidetone1_mux = | 1487 | static const struct snd_kcontrol_new sidetone1_mux = |
| 1485 | SOC_DAPM_ENUM("Left Sidetone Mux", sidetone1_enum); | 1488 | SOC_DAPM_ENUM("Left Sidetone Mux", sidetone1_enum); |
| 1486 | 1489 | ||
| 1487 | static const struct soc_enum sidetone2_enum = | 1490 | static SOC_ENUM_SINGLE_DECL(sidetone2_enum, |
| 1488 | SOC_ENUM_SINGLE(WM8994_SIDETONE, 1, 2, sidetone_text); | 1491 | WM8994_SIDETONE, 1, sidetone_text); |
| 1489 | 1492 | ||
| 1490 | static const struct snd_kcontrol_new sidetone2_mux = | 1493 | static const struct snd_kcontrol_new sidetone2_mux = |
| 1491 | SOC_DAPM_ENUM("Right Sidetone Mux", sidetone2_enum); | 1494 | SOC_DAPM_ENUM("Right Sidetone Mux", sidetone2_enum); |
| @@ -1498,22 +1501,24 @@ static const char *loopback_text[] = { | |||
| 1498 | "None", "ADCDAT", | 1501 | "None", "ADCDAT", |
| 1499 | }; | 1502 | }; |
| 1500 | 1503 | ||
| 1501 | static const struct soc_enum aif1_loopback_enum = | 1504 | static SOC_ENUM_SINGLE_DECL(aif1_loopback_enum, |
| 1502 | SOC_ENUM_SINGLE(WM8994_AIF1_CONTROL_2, WM8994_AIF1_LOOPBACK_SHIFT, 2, | 1505 | WM8994_AIF1_CONTROL_2, |
| 1503 | loopback_text); | 1506 | WM8994_AIF1_LOOPBACK_SHIFT, |
| 1507 | loopback_text); | ||
| 1504 | 1508 | ||
| 1505 | static const struct snd_kcontrol_new aif1_loopback = | 1509 | static const struct snd_kcontrol_new aif1_loopback = |
| 1506 | SOC_DAPM_ENUM("AIF1 Loopback", aif1_loopback_enum); | 1510 | SOC_DAPM_ENUM("AIF1 Loopback", aif1_loopback_enum); |
| 1507 | 1511 | ||
| 1508 | static const struct soc_enum aif2_loopback_enum = | 1512 | static SOC_ENUM_SINGLE_DECL(aif2_loopback_enum, |
| 1509 | SOC_ENUM_SINGLE(WM8994_AIF2_CONTROL_2, WM8994_AIF2_LOOPBACK_SHIFT, 2, | 1513 | WM8994_AIF2_CONTROL_2, |
| 1510 | loopback_text); | 1514 | WM8994_AIF2_LOOPBACK_SHIFT, |
| 1515 | loopback_text); | ||
| 1511 | 1516 | ||
| 1512 | static const struct snd_kcontrol_new aif2_loopback = | 1517 | static const struct snd_kcontrol_new aif2_loopback = |
| 1513 | SOC_DAPM_ENUM("AIF2 Loopback", aif2_loopback_enum); | 1518 | SOC_DAPM_ENUM("AIF2 Loopback", aif2_loopback_enum); |
| 1514 | 1519 | ||
| 1515 | static const struct soc_enum aif1dac_enum = | 1520 | static SOC_ENUM_SINGLE_DECL(aif1dac_enum, |
| 1516 | SOC_ENUM_SINGLE(WM8994_POWER_MANAGEMENT_6, 0, 2, aif1dac_text); | 1521 | WM8994_POWER_MANAGEMENT_6, 0, aif1dac_text); |
| 1517 | 1522 | ||
| 1518 | static const struct snd_kcontrol_new aif1dac_mux = | 1523 | static const struct snd_kcontrol_new aif1dac_mux = |
| 1519 | SOC_DAPM_ENUM("AIF1DAC Mux", aif1dac_enum); | 1524 | SOC_DAPM_ENUM("AIF1DAC Mux", aif1dac_enum); |
| @@ -1522,8 +1527,8 @@ static const char *aif2dac_text[] = { | |||
| 1522 | "AIF2DACDAT", "AIF3DACDAT", | 1527 | "AIF2DACDAT", "AIF3DACDAT", |
| 1523 | }; | 1528 | }; |
| 1524 | 1529 | ||
| 1525 | static const struct soc_enum aif2dac_enum = | 1530 | static SOC_ENUM_SINGLE_DECL(aif2dac_enum, |
| 1526 | SOC_ENUM_SINGLE(WM8994_POWER_MANAGEMENT_6, 1, 2, aif2dac_text); | 1531 | WM8994_POWER_MANAGEMENT_6, 1, aif2dac_text); |
| 1527 | 1532 | ||
| 1528 | static const struct snd_kcontrol_new aif2dac_mux = | 1533 | static const struct snd_kcontrol_new aif2dac_mux = |
| 1529 | SOC_DAPM_ENUM("AIF2DAC Mux", aif2dac_enum); | 1534 | SOC_DAPM_ENUM("AIF2DAC Mux", aif2dac_enum); |
| @@ -1532,8 +1537,8 @@ static const char *aif2adc_text[] = { | |||
| 1532 | "AIF2ADCDAT", "AIF3DACDAT", | 1537 | "AIF2ADCDAT", "AIF3DACDAT", |
| 1533 | }; | 1538 | }; |
| 1534 | 1539 | ||
| 1535 | static const struct soc_enum aif2adc_enum = | 1540 | static SOC_ENUM_SINGLE_DECL(aif2adc_enum, |
| 1536 | SOC_ENUM_SINGLE(WM8994_POWER_MANAGEMENT_6, 2, 2, aif2adc_text); | 1541 | WM8994_POWER_MANAGEMENT_6, 2, aif2adc_text); |
| 1537 | 1542 | ||
| 1538 | static const struct snd_kcontrol_new aif2adc_mux = | 1543 | static const struct snd_kcontrol_new aif2adc_mux = |
| 1539 | SOC_DAPM_ENUM("AIF2ADC Mux", aif2adc_enum); | 1544 | SOC_DAPM_ENUM("AIF2ADC Mux", aif2adc_enum); |
| @@ -1542,14 +1547,14 @@ static const char *aif3adc_text[] = { | |||
| 1542 | "AIF1ADCDAT", "AIF2ADCDAT", "AIF2DACDAT", "Mono PCM", | 1547 | "AIF1ADCDAT", "AIF2ADCDAT", "AIF2DACDAT", "Mono PCM", |
| 1543 | }; | 1548 | }; |
| 1544 | 1549 | ||
| 1545 | static const struct soc_enum wm8994_aif3adc_enum = | 1550 | static SOC_ENUM_SINGLE_DECL(wm8994_aif3adc_enum, |
| 1546 | SOC_ENUM_SINGLE(WM8994_POWER_MANAGEMENT_6, 3, 3, aif3adc_text); | 1551 | WM8994_POWER_MANAGEMENT_6, 3, aif3adc_text); |
| 1547 | 1552 | ||
| 1548 | static const struct snd_kcontrol_new wm8994_aif3adc_mux = | 1553 | static const struct snd_kcontrol_new wm8994_aif3adc_mux = |
| 1549 | SOC_DAPM_ENUM("AIF3ADC Mux", wm8994_aif3adc_enum); | 1554 | SOC_DAPM_ENUM("AIF3ADC Mux", wm8994_aif3adc_enum); |
| 1550 | 1555 | ||
| 1551 | static const struct soc_enum wm8958_aif3adc_enum = | 1556 | static SOC_ENUM_SINGLE_DECL(wm8958_aif3adc_enum, |
| 1552 | SOC_ENUM_SINGLE(WM8994_POWER_MANAGEMENT_6, 3, 4, aif3adc_text); | 1557 | WM8994_POWER_MANAGEMENT_6, 3, aif3adc_text); |
| 1553 | 1558 | ||
| 1554 | static const struct snd_kcontrol_new wm8958_aif3adc_mux = | 1559 | static const struct snd_kcontrol_new wm8958_aif3adc_mux = |
| 1555 | SOC_DAPM_ENUM("AIF3ADC Mux", wm8958_aif3adc_enum); | 1560 | SOC_DAPM_ENUM("AIF3ADC Mux", wm8958_aif3adc_enum); |
| @@ -1558,8 +1563,8 @@ static const char *mono_pcm_out_text[] = { | |||
| 1558 | "None", "AIF2ADCL", "AIF2ADCR", | 1563 | "None", "AIF2ADCL", "AIF2ADCR", |
| 1559 | }; | 1564 | }; |
| 1560 | 1565 | ||
| 1561 | static const struct soc_enum mono_pcm_out_enum = | 1566 | static SOC_ENUM_SINGLE_DECL(mono_pcm_out_enum, |
| 1562 | SOC_ENUM_SINGLE(WM8994_POWER_MANAGEMENT_6, 9, 3, mono_pcm_out_text); | 1567 | WM8994_POWER_MANAGEMENT_6, 9, mono_pcm_out_text); |
| 1563 | 1568 | ||
| 1564 | static const struct snd_kcontrol_new mono_pcm_out_mux = | 1569 | static const struct snd_kcontrol_new mono_pcm_out_mux = |
| 1565 | SOC_DAPM_ENUM("Mono PCM Out Mux", mono_pcm_out_enum); | 1570 | SOC_DAPM_ENUM("Mono PCM Out Mux", mono_pcm_out_enum); |
| @@ -1569,14 +1574,14 @@ static const char *aif2dac_src_text[] = { | |||
| 1569 | }; | 1574 | }; |
| 1570 | 1575 | ||
| 1571 | /* Note that these two control shouldn't be simultaneously switched to AIF3 */ | 1576 | /* Note that these two control shouldn't be simultaneously switched to AIF3 */ |
| 1572 | static const struct soc_enum aif2dacl_src_enum = | 1577 | static SOC_ENUM_SINGLE_DECL(aif2dacl_src_enum, |
| 1573 | SOC_ENUM_SINGLE(WM8994_POWER_MANAGEMENT_6, 7, 2, aif2dac_src_text); | 1578 | WM8994_POWER_MANAGEMENT_6, 7, aif2dac_src_text); |
| 1574 | 1579 | ||
| 1575 | static const struct snd_kcontrol_new aif2dacl_src_mux = | 1580 | static const struct snd_kcontrol_new aif2dacl_src_mux = |
| 1576 | SOC_DAPM_ENUM("AIF2DACL Mux", aif2dacl_src_enum); | 1581 | SOC_DAPM_ENUM("AIF2DACL Mux", aif2dacl_src_enum); |
| 1577 | 1582 | ||
| 1578 | static const struct soc_enum aif2dacr_src_enum = | 1583 | static SOC_ENUM_SINGLE_DECL(aif2dacr_src_enum, |
| 1579 | SOC_ENUM_SINGLE(WM8994_POWER_MANAGEMENT_6, 8, 2, aif2dac_src_text); | 1584 | WM8994_POWER_MANAGEMENT_6, 8, aif2dac_src_text); |
| 1580 | 1585 | ||
| 1581 | static const struct snd_kcontrol_new aif2dacr_src_mux = | 1586 | static const struct snd_kcontrol_new aif2dacr_src_mux = |
| 1582 | SOC_DAPM_ENUM("AIF2DACR Mux", aif2dacr_src_enum); | 1587 | SOC_DAPM_ENUM("AIF2DACR Mux", aif2dacr_src_enum); |
diff --git a/sound/soc/davinci/davinci-evm.c b/sound/soc/davinci/davinci-evm.c index 70ff3772079f..5e3bc3c6801a 100644 --- a/sound/soc/davinci/davinci-evm.c +++ b/sound/soc/davinci/davinci-evm.c | |||
| @@ -399,6 +399,7 @@ static struct platform_driver davinci_evm_driver = { | |||
| 399 | .driver = { | 399 | .driver = { |
| 400 | .name = "davinci_evm", | 400 | .name = "davinci_evm", |
| 401 | .owner = THIS_MODULE, | 401 | .owner = THIS_MODULE, |
| 402 | .pm = &snd_soc_pm_ops, | ||
| 402 | .of_match_table = of_match_ptr(davinci_evm_dt_ids), | 403 | .of_match_table = of_match_ptr(davinci_evm_dt_ids), |
| 403 | }, | 404 | }, |
| 404 | }; | 405 | }; |
diff --git a/sound/soc/davinci/davinci-mcasp.c b/sound/soc/davinci/davinci-mcasp.c index b7858bfa0295..670afa29e30d 100644 --- a/sound/soc/davinci/davinci-mcasp.c +++ b/sound/soc/davinci/davinci-mcasp.c | |||
| @@ -263,7 +263,9 @@ static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai, | |||
| 263 | unsigned int fmt) | 263 | unsigned int fmt) |
| 264 | { | 264 | { |
| 265 | struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(cpu_dai); | 265 | struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(cpu_dai); |
| 266 | int ret = 0; | ||
| 266 | 267 | ||
| 268 | pm_runtime_get_sync(mcasp->dev); | ||
| 267 | switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { | 269 | switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { |
| 268 | case SND_SOC_DAIFMT_DSP_B: | 270 | case SND_SOC_DAIFMT_DSP_B: |
| 269 | case SND_SOC_DAIFMT_AC97: | 271 | case SND_SOC_DAIFMT_AC97: |
| @@ -317,7 +319,8 @@ static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai, | |||
| 317 | break; | 319 | break; |
| 318 | 320 | ||
| 319 | default: | 321 | default: |
| 320 | return -EINVAL; | 322 | ret = -EINVAL; |
| 323 | goto out; | ||
| 321 | } | 324 | } |
| 322 | 325 | ||
| 323 | switch (fmt & SND_SOC_DAIFMT_INV_MASK) { | 326 | switch (fmt & SND_SOC_DAIFMT_INV_MASK) { |
| @@ -354,10 +357,12 @@ static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai, | |||
| 354 | break; | 357 | break; |
| 355 | 358 | ||
| 356 | default: | 359 | default: |
| 357 | return -EINVAL; | 360 | ret = -EINVAL; |
| 361 | break; | ||
| 358 | } | 362 | } |
| 359 | 363 | out: | |
| 360 | return 0; | 364 | pm_runtime_put_sync(mcasp->dev); |
| 365 | return ret; | ||
| 361 | } | 366 | } |
| 362 | 367 | ||
| 363 | static int davinci_mcasp_set_clkdiv(struct snd_soc_dai *dai, int div_id, int div) | 368 | static int davinci_mcasp_set_clkdiv(struct snd_soc_dai *dai, int div_id, int div) |
| @@ -448,7 +453,7 @@ static int davinci_config_channel_size(struct davinci_mcasp *mcasp, | |||
| 448 | return 0; | 453 | return 0; |
| 449 | } | 454 | } |
| 450 | 455 | ||
| 451 | static int davinci_hw_common_param(struct davinci_mcasp *mcasp, int stream, | 456 | static int mcasp_common_hw_param(struct davinci_mcasp *mcasp, int stream, |
| 452 | int channels) | 457 | int channels) |
| 453 | { | 458 | { |
| 454 | int i; | 459 | int i; |
| @@ -524,12 +529,18 @@ static int davinci_hw_common_param(struct davinci_mcasp *mcasp, int stream, | |||
| 524 | return 0; | 529 | return 0; |
| 525 | } | 530 | } |
| 526 | 531 | ||
| 527 | static void davinci_hw_param(struct davinci_mcasp *mcasp, int stream) | 532 | static int mcasp_i2s_hw_param(struct davinci_mcasp *mcasp, int stream) |
| 528 | { | 533 | { |
| 529 | int i, active_slots; | 534 | int i, active_slots; |
| 530 | u32 mask = 0; | 535 | u32 mask = 0; |
| 531 | u32 busel = 0; | 536 | u32 busel = 0; |
| 532 | 537 | ||
| 538 | if ((mcasp->tdm_slots < 2) || (mcasp->tdm_slots > 32)) { | ||
| 539 | dev_err(mcasp->dev, "tdm slot %d not supported\n", | ||
| 540 | mcasp->tdm_slots); | ||
| 541 | return -EINVAL; | ||
| 542 | } | ||
| 543 | |||
| 533 | active_slots = (mcasp->tdm_slots > 31) ? 32 : mcasp->tdm_slots; | 544 | active_slots = (mcasp->tdm_slots > 31) ? 32 : mcasp->tdm_slots; |
| 534 | for (i = 0; i < active_slots; i++) | 545 | for (i = 0; i < active_slots; i++) |
| 535 | mask |= (1 << i); | 546 | mask |= (1 << i); |
| @@ -539,35 +550,21 @@ static void davinci_hw_param(struct davinci_mcasp *mcasp, int stream) | |||
| 539 | if (!mcasp->dat_port) | 550 | if (!mcasp->dat_port) |
| 540 | busel = TXSEL; | 551 | busel = TXSEL; |
| 541 | 552 | ||
| 542 | if (stream == SNDRV_PCM_STREAM_PLAYBACK) { | 553 | mcasp_set_reg(mcasp, DAVINCI_MCASP_TXTDM_REG, mask); |
| 543 | /* bit stream is MSB first with no delay */ | 554 | mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, busel | TXORD); |
| 544 | /* DSP_B mode */ | 555 | mcasp_mod_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, |
| 545 | mcasp_set_reg(mcasp, DAVINCI_MCASP_TXTDM_REG, mask); | 556 | FSXMOD(mcasp->tdm_slots), FSXMOD(0x1FF)); |
| 546 | mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, busel | TXORD); | 557 | |
| 547 | 558 | mcasp_set_reg(mcasp, DAVINCI_MCASP_RXTDM_REG, mask); | |
| 548 | if ((mcasp->tdm_slots >= 2) && (mcasp->tdm_slots <= 32)) | 559 | mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMT_REG, busel | RXORD); |
| 549 | mcasp_mod_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, | 560 | mcasp_mod_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, |
| 550 | FSXMOD(mcasp->tdm_slots), FSXMOD(0x1FF)); | 561 | FSRMOD(mcasp->tdm_slots), FSRMOD(0x1FF)); |
| 551 | else | 562 | |
| 552 | printk(KERN_ERR "playback tdm slot %d not supported\n", | 563 | return 0; |
| 553 | mcasp->tdm_slots); | ||
| 554 | } else { | ||
| 555 | /* bit stream is MSB first with no delay */ | ||
| 556 | /* DSP_B mode */ | ||
| 557 | mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMT_REG, busel | RXORD); | ||
| 558 | mcasp_set_reg(mcasp, DAVINCI_MCASP_RXTDM_REG, mask); | ||
| 559 | |||
| 560 | if ((mcasp->tdm_slots >= 2) && (mcasp->tdm_slots <= 32)) | ||
| 561 | mcasp_mod_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, | ||
| 562 | FSRMOD(mcasp->tdm_slots), FSRMOD(0x1FF)); | ||
| 563 | else | ||
| 564 | printk(KERN_ERR "capture tdm slot %d not supported\n", | ||
| 565 | mcasp->tdm_slots); | ||
| 566 | } | ||
| 567 | } | 564 | } |
| 568 | 565 | ||
| 569 | /* S/PDIF */ | 566 | /* S/PDIF */ |
| 570 | static void davinci_hw_dit_param(struct davinci_mcasp *mcasp) | 567 | static int mcasp_dit_hw_param(struct davinci_mcasp *mcasp) |
| 571 | { | 568 | { |
| 572 | /* Set the TX format : 24 bit right rotation, 32 bit slot, Pad 0 | 569 | /* Set the TX format : 24 bit right rotation, 32 bit slot, Pad 0 |
| 573 | and LSB first */ | 570 | and LSB first */ |
| @@ -589,6 +586,8 @@ static void davinci_hw_dit_param(struct davinci_mcasp *mcasp) | |||
| 589 | 586 | ||
| 590 | /* Enable the DIT */ | 587 | /* Enable the DIT */ |
| 591 | mcasp_set_bits(mcasp, DAVINCI_MCASP_TXDITCTL_REG, DITEN); | 588 | mcasp_set_bits(mcasp, DAVINCI_MCASP_TXDITCTL_REG, DITEN); |
| 589 | |||
| 590 | return 0; | ||
| 592 | } | 591 | } |
| 593 | 592 | ||
| 594 | static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream, | 593 | static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream, |
| @@ -605,13 +604,14 @@ static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream, | |||
| 605 | u8 slots = mcasp->tdm_slots; | 604 | u8 slots = mcasp->tdm_slots; |
| 606 | u8 active_serializers; | 605 | u8 active_serializers; |
| 607 | int channels; | 606 | int channels; |
| 607 | int ret; | ||
| 608 | struct snd_interval *pcm_channels = hw_param_interval(params, | 608 | struct snd_interval *pcm_channels = hw_param_interval(params, |
| 609 | SNDRV_PCM_HW_PARAM_CHANNELS); | 609 | SNDRV_PCM_HW_PARAM_CHANNELS); |
| 610 | channels = pcm_channels->min; | 610 | channels = pcm_channels->min; |
| 611 | 611 | ||
| 612 | active_serializers = (channels + slots - 1) / slots; | 612 | active_serializers = (channels + slots - 1) / slots; |
| 613 | 613 | ||
| 614 | if (davinci_hw_common_param(mcasp, substream->stream, channels) == -EINVAL) | 614 | if (mcasp_common_hw_param(mcasp, substream->stream, channels) == -EINVAL) |
| 615 | return -EINVAL; | 615 | return -EINVAL; |
| 616 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) | 616 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) |
| 617 | fifo_level = mcasp->txnumevt * active_serializers; | 617 | fifo_level = mcasp->txnumevt * active_serializers; |
| @@ -619,9 +619,12 @@ static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream, | |||
| 619 | fifo_level = mcasp->rxnumevt * active_serializers; | 619 | fifo_level = mcasp->rxnumevt * active_serializers; |
| 620 | 620 | ||
| 621 | if (mcasp->op_mode == DAVINCI_MCASP_DIT_MODE) | 621 | if (mcasp->op_mode == DAVINCI_MCASP_DIT_MODE) |
| 622 | davinci_hw_dit_param(mcasp); | 622 | ret = mcasp_dit_hw_param(mcasp); |
| 623 | else | 623 | else |
| 624 | davinci_hw_param(mcasp, substream->stream); | 624 | ret = mcasp_i2s_hw_param(mcasp, substream->stream); |
| 625 | |||
| 626 | if (ret) | ||
| 627 | return ret; | ||
| 625 | 628 | ||
| 626 | switch (params_format(params)) { | 629 | switch (params_format(params)) { |
| 627 | case SNDRV_PCM_FORMAT_U8: | 630 | case SNDRV_PCM_FORMAT_U8: |
| @@ -678,19 +681,9 @@ static int davinci_mcasp_trigger(struct snd_pcm_substream *substream, | |||
| 678 | case SNDRV_PCM_TRIGGER_RESUME: | 681 | case SNDRV_PCM_TRIGGER_RESUME: |
| 679 | case SNDRV_PCM_TRIGGER_START: | 682 | case SNDRV_PCM_TRIGGER_START: |
| 680 | case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: | 683 | case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: |
| 681 | ret = pm_runtime_get_sync(mcasp->dev); | ||
| 682 | if (IS_ERR_VALUE(ret)) | ||
| 683 | dev_err(mcasp->dev, "pm_runtime_get_sync() failed\n"); | ||
| 684 | davinci_mcasp_start(mcasp, substream->stream); | 684 | davinci_mcasp_start(mcasp, substream->stream); |
| 685 | break; | 685 | break; |
| 686 | |||
| 687 | case SNDRV_PCM_TRIGGER_SUSPEND: | 686 | case SNDRV_PCM_TRIGGER_SUSPEND: |
| 688 | davinci_mcasp_stop(mcasp, substream->stream); | ||
| 689 | ret = pm_runtime_put_sync(mcasp->dev); | ||
| 690 | if (IS_ERR_VALUE(ret)) | ||
| 691 | dev_err(mcasp->dev, "pm_runtime_put_sync() failed\n"); | ||
| 692 | break; | ||
| 693 | |||
| 694 | case SNDRV_PCM_TRIGGER_STOP: | 687 | case SNDRV_PCM_TRIGGER_STOP: |
| 695 | case SNDRV_PCM_TRIGGER_PAUSE_PUSH: | 688 | case SNDRV_PCM_TRIGGER_PAUSE_PUSH: |
| 696 | davinci_mcasp_stop(mcasp, substream->stream); | 689 | davinci_mcasp_stop(mcasp, substream->stream); |
diff --git a/sound/soc/fsl/fsl_esai.c b/sound/soc/fsl/fsl_esai.c index d0c72ed261e7..c84026c99134 100644 --- a/sound/soc/fsl/fsl_esai.c +++ b/sound/soc/fsl/fsl_esai.c | |||
| @@ -326,7 +326,7 @@ static int fsl_esai_set_dai_tdm_slot(struct snd_soc_dai *dai, u32 tx_mask, | |||
| 326 | regmap_update_bits(esai_priv->regmap, REG_ESAI_TSMA, | 326 | regmap_update_bits(esai_priv->regmap, REG_ESAI_TSMA, |
| 327 | ESAI_xSMA_xS_MASK, ESAI_xSMA_xS(tx_mask)); | 327 | ESAI_xSMA_xS_MASK, ESAI_xSMA_xS(tx_mask)); |
| 328 | regmap_update_bits(esai_priv->regmap, REG_ESAI_TSMB, | 328 | regmap_update_bits(esai_priv->regmap, REG_ESAI_TSMB, |
| 329 | ESAI_xSMA_xS_MASK, ESAI_xSMB_xS(tx_mask)); | 329 | ESAI_xSMB_xS_MASK, ESAI_xSMB_xS(tx_mask)); |
| 330 | 330 | ||
| 331 | regmap_update_bits(esai_priv->regmap, REG_ESAI_RCCR, | 331 | regmap_update_bits(esai_priv->regmap, REG_ESAI_RCCR, |
| 332 | ESAI_xCCR_xDC_MASK, ESAI_xCCR_xDC(slots)); | 332 | ESAI_xCCR_xDC_MASK, ESAI_xCCR_xDC(slots)); |
| @@ -334,7 +334,7 @@ static int fsl_esai_set_dai_tdm_slot(struct snd_soc_dai *dai, u32 tx_mask, | |||
| 334 | regmap_update_bits(esai_priv->regmap, REG_ESAI_RSMA, | 334 | regmap_update_bits(esai_priv->regmap, REG_ESAI_RSMA, |
| 335 | ESAI_xSMA_xS_MASK, ESAI_xSMA_xS(rx_mask)); | 335 | ESAI_xSMA_xS_MASK, ESAI_xSMA_xS(rx_mask)); |
| 336 | regmap_update_bits(esai_priv->regmap, REG_ESAI_RSMB, | 336 | regmap_update_bits(esai_priv->regmap, REG_ESAI_RSMB, |
| 337 | ESAI_xSMA_xS_MASK, ESAI_xSMB_xS(rx_mask)); | 337 | ESAI_xSMB_xS_MASK, ESAI_xSMB_xS(rx_mask)); |
| 338 | 338 | ||
| 339 | esai_priv->slot_width = slot_width; | 339 | esai_priv->slot_width = slot_width; |
| 340 | 340 | ||
diff --git a/sound/soc/fsl/fsl_esai.h b/sound/soc/fsl/fsl_esai.h index 9c9f957fcae1..75e14033e8d8 100644 --- a/sound/soc/fsl/fsl_esai.h +++ b/sound/soc/fsl/fsl_esai.h | |||
| @@ -322,7 +322,7 @@ | |||
| 322 | #define ESAI_xSMB_xS_SHIFT 0 | 322 | #define ESAI_xSMB_xS_SHIFT 0 |
| 323 | #define ESAI_xSMB_xS_WIDTH 16 | 323 | #define ESAI_xSMB_xS_WIDTH 16 |
| 324 | #define ESAI_xSMB_xS_MASK (((1 << ESAI_xSMB_xS_WIDTH) - 1) << ESAI_xSMB_xS_SHIFT) | 324 | #define ESAI_xSMB_xS_MASK (((1 << ESAI_xSMB_xS_WIDTH) - 1) << ESAI_xSMB_xS_SHIFT) |
| 325 | #define ESAI_xSMB_xS(v) (((v) >> ESAI_xSMA_xS_WIDTH) & ESAI_xSMA_xS_MASK) | 325 | #define ESAI_xSMB_xS(v) (((v) >> ESAI_xSMA_xS_WIDTH) & ESAI_xSMB_xS_MASK) |
| 326 | 326 | ||
| 327 | /* Port C Direction Register -- REG_ESAI_PRRC 0xF8 */ | 327 | /* Port C Direction Register -- REG_ESAI_PRRC 0xF8 */ |
| 328 | #define ESAI_PRRC_PDC_SHIFT 0 | 328 | #define ESAI_PRRC_PDC_SHIFT 0 |
diff --git a/sound/soc/fsl/imx-mc13783.c b/sound/soc/fsl/imx-mc13783.c index 79cee782dbbf..a2fd7321b5a9 100644 --- a/sound/soc/fsl/imx-mc13783.c +++ b/sound/soc/fsl/imx-mc13783.c | |||
| @@ -160,7 +160,6 @@ static struct platform_driver imx_mc13783_audio_driver = { | |||
| 160 | .driver = { | 160 | .driver = { |
| 161 | .name = "imx_mc13783", | 161 | .name = "imx_mc13783", |
| 162 | .owner = THIS_MODULE, | 162 | .owner = THIS_MODULE, |
| 163 | .pm = &snd_soc_pm_ops, | ||
| 164 | }, | 163 | }, |
| 165 | .probe = imx_mc13783_probe, | 164 | .probe = imx_mc13783_probe, |
| 166 | .remove = imx_mc13783_remove | 165 | .remove = imx_mc13783_remove |
diff --git a/sound/soc/fsl/imx-sgtl5000.c b/sound/soc/fsl/imx-sgtl5000.c index f2beae78969f..1cb22dd034eb 100644 --- a/sound/soc/fsl/imx-sgtl5000.c +++ b/sound/soc/fsl/imx-sgtl5000.c | |||
| @@ -33,8 +33,7 @@ struct imx_sgtl5000_data { | |||
| 33 | 33 | ||
| 34 | static int imx_sgtl5000_dai_init(struct snd_soc_pcm_runtime *rtd) | 34 | static int imx_sgtl5000_dai_init(struct snd_soc_pcm_runtime *rtd) |
| 35 | { | 35 | { |
| 36 | struct imx_sgtl5000_data *data = container_of(rtd->card, | 36 | struct imx_sgtl5000_data *data = snd_soc_card_get_drvdata(rtd->card); |
| 37 | struct imx_sgtl5000_data, card); | ||
| 38 | struct device *dev = rtd->card->dev; | 37 | struct device *dev = rtd->card->dev; |
| 39 | int ret; | 38 | int ret; |
| 40 | 39 | ||
| @@ -159,13 +158,15 @@ static int imx_sgtl5000_probe(struct platform_device *pdev) | |||
| 159 | data->card.dapm_widgets = imx_sgtl5000_dapm_widgets; | 158 | data->card.dapm_widgets = imx_sgtl5000_dapm_widgets; |
| 160 | data->card.num_dapm_widgets = ARRAY_SIZE(imx_sgtl5000_dapm_widgets); | 159 | data->card.num_dapm_widgets = ARRAY_SIZE(imx_sgtl5000_dapm_widgets); |
| 161 | 160 | ||
| 161 | platform_set_drvdata(pdev, &data->card); | ||
| 162 | snd_soc_card_set_drvdata(&data->card, data); | ||
| 163 | |||
| 162 | ret = devm_snd_soc_register_card(&pdev->dev, &data->card); | 164 | ret = devm_snd_soc_register_card(&pdev->dev, &data->card); |
| 163 | if (ret) { | 165 | if (ret) { |
| 164 | dev_err(&pdev->dev, "snd_soc_register_card failed (%d)\n", ret); | 166 | dev_err(&pdev->dev, "snd_soc_register_card failed (%d)\n", ret); |
| 165 | goto fail; | 167 | goto fail; |
| 166 | } | 168 | } |
| 167 | 169 | ||
| 168 | platform_set_drvdata(pdev, data); | ||
| 169 | of_node_put(ssi_np); | 170 | of_node_put(ssi_np); |
| 170 | of_node_put(codec_np); | 171 | of_node_put(codec_np); |
| 171 | 172 | ||
| @@ -184,7 +185,8 @@ fail: | |||
| 184 | 185 | ||
| 185 | static int imx_sgtl5000_remove(struct platform_device *pdev) | 186 | static int imx_sgtl5000_remove(struct platform_device *pdev) |
| 186 | { | 187 | { |
| 187 | struct imx_sgtl5000_data *data = platform_get_drvdata(pdev); | 188 | struct snd_soc_card *card = platform_get_drvdata(pdev); |
| 189 | struct imx_sgtl5000_data *data = snd_soc_card_get_drvdata(card); | ||
| 188 | 190 | ||
| 189 | clk_put(data->codec_clk); | 191 | clk_put(data->codec_clk); |
| 190 | 192 | ||
diff --git a/sound/soc/fsl/imx-wm8962.c b/sound/soc/fsl/imx-wm8962.c index 3fd76bc391de..3a3d17ce6ba4 100644 --- a/sound/soc/fsl/imx-wm8962.c +++ b/sound/soc/fsl/imx-wm8962.c | |||
| @@ -71,7 +71,7 @@ static int imx_wm8962_set_bias_level(struct snd_soc_card *card, | |||
| 71 | { | 71 | { |
| 72 | struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai; | 72 | struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai; |
| 73 | struct imx_priv *priv = &card_priv; | 73 | struct imx_priv *priv = &card_priv; |
| 74 | struct imx_wm8962_data *data = platform_get_drvdata(priv->pdev); | 74 | struct imx_wm8962_data *data = snd_soc_card_get_drvdata(card); |
| 75 | struct device *dev = &priv->pdev->dev; | 75 | struct device *dev = &priv->pdev->dev; |
| 76 | unsigned int pll_out; | 76 | unsigned int pll_out; |
| 77 | int ret; | 77 | int ret; |
| @@ -137,7 +137,7 @@ static int imx_wm8962_late_probe(struct snd_soc_card *card) | |||
| 137 | { | 137 | { |
| 138 | struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai; | 138 | struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai; |
| 139 | struct imx_priv *priv = &card_priv; | 139 | struct imx_priv *priv = &card_priv; |
| 140 | struct imx_wm8962_data *data = platform_get_drvdata(priv->pdev); | 140 | struct imx_wm8962_data *data = snd_soc_card_get_drvdata(card); |
| 141 | struct device *dev = &priv->pdev->dev; | 141 | struct device *dev = &priv->pdev->dev; |
| 142 | int ret; | 142 | int ret; |
| 143 | 143 | ||
| @@ -264,13 +264,15 @@ static int imx_wm8962_probe(struct platform_device *pdev) | |||
| 264 | data->card.late_probe = imx_wm8962_late_probe; | 264 | data->card.late_probe = imx_wm8962_late_probe; |
| 265 | data->card.set_bias_level = imx_wm8962_set_bias_level; | 265 | data->card.set_bias_level = imx_wm8962_set_bias_level; |
| 266 | 266 | ||
| 267 | platform_set_drvdata(pdev, &data->card); | ||
| 268 | snd_soc_card_set_drvdata(&data->card, data); | ||
| 269 | |||
| 267 | ret = devm_snd_soc_register_card(&pdev->dev, &data->card); | 270 | ret = devm_snd_soc_register_card(&pdev->dev, &data->card); |
| 268 | if (ret) { | 271 | if (ret) { |
| 269 | dev_err(&pdev->dev, "snd_soc_register_card failed (%d)\n", ret); | 272 | dev_err(&pdev->dev, "snd_soc_register_card failed (%d)\n", ret); |
| 270 | goto clk_fail; | 273 | goto clk_fail; |
| 271 | } | 274 | } |
| 272 | 275 | ||
| 273 | platform_set_drvdata(pdev, data); | ||
| 274 | of_node_put(ssi_np); | 276 | of_node_put(ssi_np); |
| 275 | of_node_put(codec_np); | 277 | of_node_put(codec_np); |
| 276 | 278 | ||
| @@ -289,7 +291,8 @@ fail: | |||
| 289 | 291 | ||
| 290 | static int imx_wm8962_remove(struct platform_device *pdev) | 292 | static int imx_wm8962_remove(struct platform_device *pdev) |
| 291 | { | 293 | { |
| 292 | struct imx_wm8962_data *data = platform_get_drvdata(pdev); | 294 | struct snd_soc_card *card = platform_get_drvdata(pdev); |
| 295 | struct imx_wm8962_data *data = snd_soc_card_get_drvdata(card); | ||
| 293 | 296 | ||
| 294 | if (!IS_ERR(data->codec_clk)) | 297 | if (!IS_ERR(data->codec_clk)) |
| 295 | clk_disable_unprepare(data->codec_clk); | 298 | clk_disable_unprepare(data->codec_clk); |
diff --git a/sound/soc/samsung/Kconfig b/sound/soc/samsung/Kconfig index 454f41cfc828..350757400391 100644 --- a/sound/soc/samsung/Kconfig +++ b/sound/soc/samsung/Kconfig | |||
| @@ -59,7 +59,7 @@ config SND_SOC_SAMSUNG_JIVE_WM8750 | |||
| 59 | select SND_SOC_WM8750 | 59 | select SND_SOC_WM8750 |
| 60 | select SND_S3C2412_SOC_I2S | 60 | select SND_S3C2412_SOC_I2S |
| 61 | help | 61 | help |
| 62 | Sat Y if you want to add support for SoC audio on the Jive. | 62 | Say Y if you want to add support for SoC audio on the Jive. |
| 63 | 63 | ||
| 64 | config SND_SOC_SAMSUNG_SMDK_WM8580 | 64 | config SND_SOC_SAMSUNG_SMDK_WM8580 |
| 65 | tristate "SoC I2S Audio support for WM8580 on SMDK" | 65 | tristate "SoC I2S Audio support for WM8580 on SMDK" |
| @@ -145,11 +145,11 @@ config SND_SOC_SAMSUNG_RX1950_UDA1380 | |||
| 145 | 145 | ||
| 146 | config SND_SOC_SAMSUNG_SMDK_WM9713 | 146 | config SND_SOC_SAMSUNG_SMDK_WM9713 |
| 147 | tristate "SoC AC97 Audio support for SMDK with WM9713" | 147 | tristate "SoC AC97 Audio support for SMDK with WM9713" |
| 148 | depends on SND_SOC_SAMSUNG && (MACH_SMDK6410 || MACH_SMDKC100 || MACH_SMDKV210 || MACH_SMDKC110 || MACH_SMDKV310 || MACH_SMDKC210) | 148 | depends on SND_SOC_SAMSUNG && (MACH_SMDK6410 || MACH_SMDKC100 || MACH_SMDKV210 || MACH_SMDKC110) |
| 149 | select SND_SOC_WM9713 | 149 | select SND_SOC_WM9713 |
| 150 | select SND_SAMSUNG_AC97 | 150 | select SND_SAMSUNG_AC97 |
| 151 | help | 151 | help |
| 152 | Sat Y if you want to add support for SoC audio on the SMDK. | 152 | Say Y if you want to add support for SoC audio on the SMDK. |
| 153 | 153 | ||
| 154 | config SND_SOC_SMARTQ | 154 | config SND_SOC_SMARTQ |
| 155 | tristate "SoC I2S Audio support for SmartQ board" | 155 | tristate "SoC I2S Audio support for SmartQ board" |
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c index dc8ff13187f7..b9dc6acbba8c 100644 --- a/sound/soc/soc-dapm.c +++ b/sound/soc/soc-dapm.c | |||
| @@ -1218,7 +1218,7 @@ int dapm_regulator_event(struct snd_soc_dapm_widget *w, | |||
| 1218 | ret = regulator_allow_bypass(w->regulator, false); | 1218 | ret = regulator_allow_bypass(w->regulator, false); |
| 1219 | if (ret != 0) | 1219 | if (ret != 0) |
| 1220 | dev_warn(w->dapm->dev, | 1220 | dev_warn(w->dapm->dev, |
| 1221 | "ASoC: Failed to bypass %s: %d\n", | 1221 | "ASoC: Failed to unbypass %s: %d\n", |
| 1222 | w->name, ret); | 1222 | w->name, ret); |
| 1223 | } | 1223 | } |
| 1224 | 1224 | ||
| @@ -1228,7 +1228,7 @@ int dapm_regulator_event(struct snd_soc_dapm_widget *w, | |||
| 1228 | ret = regulator_allow_bypass(w->regulator, true); | 1228 | ret = regulator_allow_bypass(w->regulator, true); |
| 1229 | if (ret != 0) | 1229 | if (ret != 0) |
| 1230 | dev_warn(w->dapm->dev, | 1230 | dev_warn(w->dapm->dev, |
| 1231 | "ASoC: Failed to unbypass %s: %d\n", | 1231 | "ASoC: Failed to bypass %s: %d\n", |
| 1232 | w->name, ret); | 1232 | w->name, ret); |
| 1233 | } | 1233 | } |
| 1234 | 1234 | ||
| @@ -3210,15 +3210,11 @@ int snd_soc_dapm_put_pin_switch(struct snd_kcontrol *kcontrol, | |||
| 3210 | struct snd_soc_card *card = snd_kcontrol_chip(kcontrol); | 3210 | struct snd_soc_card *card = snd_kcontrol_chip(kcontrol); |
| 3211 | const char *pin = (const char *)kcontrol->private_value; | 3211 | const char *pin = (const char *)kcontrol->private_value; |
| 3212 | 3212 | ||
| 3213 | mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME); | ||
| 3214 | |||
| 3215 | if (ucontrol->value.integer.value[0]) | 3213 | if (ucontrol->value.integer.value[0]) |
| 3216 | snd_soc_dapm_enable_pin(&card->dapm, pin); | 3214 | snd_soc_dapm_enable_pin(&card->dapm, pin); |
| 3217 | else | 3215 | else |
| 3218 | snd_soc_dapm_disable_pin(&card->dapm, pin); | 3216 | snd_soc_dapm_disable_pin(&card->dapm, pin); |
| 3219 | 3217 | ||
| 3220 | mutex_unlock(&card->dapm_mutex); | ||
| 3221 | |||
| 3222 | snd_soc_dapm_sync(&card->dapm); | 3218 | snd_soc_dapm_sync(&card->dapm); |
| 3223 | return 0; | 3219 | return 0; |
| 3224 | } | 3220 | } |
| @@ -3248,7 +3244,7 @@ snd_soc_dapm_new_control(struct snd_soc_dapm_context *dapm, | |||
| 3248 | ret = regulator_allow_bypass(w->regulator, true); | 3244 | ret = regulator_allow_bypass(w->regulator, true); |
| 3249 | if (ret != 0) | 3245 | if (ret != 0) |
| 3250 | dev_warn(w->dapm->dev, | 3246 | dev_warn(w->dapm->dev, |
| 3251 | "ASoC: Failed to unbypass %s: %d\n", | 3247 | "ASoC: Failed to bypass %s: %d\n", |
| 3252 | w->name, ret); | 3248 | w->name, ret); |
| 3253 | } | 3249 | } |
| 3254 | break; | 3250 | break; |
| @@ -3767,23 +3763,52 @@ void snd_soc_dapm_stream_event(struct snd_soc_pcm_runtime *rtd, int stream, | |||
| 3767 | } | 3763 | } |
| 3768 | 3764 | ||
| 3769 | /** | 3765 | /** |
| 3766 | * snd_soc_dapm_enable_pin_unlocked - enable pin. | ||
| 3767 | * @dapm: DAPM context | ||
| 3768 | * @pin: pin name | ||
| 3769 | * | ||
| 3770 | * Enables input/output pin and its parents or children widgets iff there is | ||
| 3771 | * a valid audio route and active audio stream. | ||
| 3772 | * | ||
| 3773 | * Requires external locking. | ||
| 3774 | * | ||
| 3775 | * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to | ||
| 3776 | * do any widget power switching. | ||
| 3777 | */ | ||
| 3778 | int snd_soc_dapm_enable_pin_unlocked(struct snd_soc_dapm_context *dapm, | ||
| 3779 | const char *pin) | ||
| 3780 | { | ||
| 3781 | return snd_soc_dapm_set_pin(dapm, pin, 1); | ||
| 3782 | } | ||
| 3783 | EXPORT_SYMBOL_GPL(snd_soc_dapm_enable_pin_unlocked); | ||
| 3784 | |||
| 3785 | /** | ||
| 3770 | * snd_soc_dapm_enable_pin - enable pin. | 3786 | * snd_soc_dapm_enable_pin - enable pin. |
| 3771 | * @dapm: DAPM context | 3787 | * @dapm: DAPM context |
| 3772 | * @pin: pin name | 3788 | * @pin: pin name |
| 3773 | * | 3789 | * |
| 3774 | * Enables input/output pin and its parents or children widgets iff there is | 3790 | * Enables input/output pin and its parents or children widgets iff there is |
| 3775 | * a valid audio route and active audio stream. | 3791 | * a valid audio route and active audio stream. |
| 3792 | * | ||
| 3776 | * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to | 3793 | * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to |
| 3777 | * do any widget power switching. | 3794 | * do any widget power switching. |
| 3778 | */ | 3795 | */ |
| 3779 | int snd_soc_dapm_enable_pin(struct snd_soc_dapm_context *dapm, const char *pin) | 3796 | int snd_soc_dapm_enable_pin(struct snd_soc_dapm_context *dapm, const char *pin) |
| 3780 | { | 3797 | { |
| 3781 | return snd_soc_dapm_set_pin(dapm, pin, 1); | 3798 | int ret; |
| 3799 | |||
| 3800 | mutex_lock_nested(&dapm->card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME); | ||
| 3801 | |||
| 3802 | ret = snd_soc_dapm_set_pin(dapm, pin, 1); | ||
| 3803 | |||
| 3804 | mutex_unlock(&dapm->card->dapm_mutex); | ||
| 3805 | |||
| 3806 | return ret; | ||
| 3782 | } | 3807 | } |
| 3783 | EXPORT_SYMBOL_GPL(snd_soc_dapm_enable_pin); | 3808 | EXPORT_SYMBOL_GPL(snd_soc_dapm_enable_pin); |
| 3784 | 3809 | ||
| 3785 | /** | 3810 | /** |
| 3786 | * snd_soc_dapm_force_enable_pin - force a pin to be enabled | 3811 | * snd_soc_dapm_force_enable_pin_unlocked - force a pin to be enabled |
| 3787 | * @dapm: DAPM context | 3812 | * @dapm: DAPM context |
| 3788 | * @pin: pin name | 3813 | * @pin: pin name |
| 3789 | * | 3814 | * |
| @@ -3791,11 +3816,13 @@ EXPORT_SYMBOL_GPL(snd_soc_dapm_enable_pin); | |||
| 3791 | * intended for use with microphone bias supplies used in microphone | 3816 | * intended for use with microphone bias supplies used in microphone |
| 3792 | * jack detection. | 3817 | * jack detection. |
| 3793 | * | 3818 | * |
| 3819 | * Requires external locking. | ||
| 3820 | * | ||
| 3794 | * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to | 3821 | * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to |
| 3795 | * do any widget power switching. | 3822 | * do any widget power switching. |
| 3796 | */ | 3823 | */ |
| 3797 | int snd_soc_dapm_force_enable_pin(struct snd_soc_dapm_context *dapm, | 3824 | int snd_soc_dapm_force_enable_pin_unlocked(struct snd_soc_dapm_context *dapm, |
| 3798 | const char *pin) | 3825 | const char *pin) |
| 3799 | { | 3826 | { |
| 3800 | struct snd_soc_dapm_widget *w = dapm_find_widget(dapm, pin, true); | 3827 | struct snd_soc_dapm_widget *w = dapm_find_widget(dapm, pin, true); |
| 3801 | 3828 | ||
| @@ -3811,25 +3838,103 @@ int snd_soc_dapm_force_enable_pin(struct snd_soc_dapm_context *dapm, | |||
| 3811 | 3838 | ||
| 3812 | return 0; | 3839 | return 0; |
| 3813 | } | 3840 | } |
| 3841 | EXPORT_SYMBOL_GPL(snd_soc_dapm_force_enable_pin_unlocked); | ||
| 3842 | |||
| 3843 | /** | ||
| 3844 | * snd_soc_dapm_force_enable_pin - force a pin to be enabled | ||
| 3845 | * @dapm: DAPM context | ||
| 3846 | * @pin: pin name | ||
| 3847 | * | ||
| 3848 | * Enables input/output pin regardless of any other state. This is | ||
| 3849 | * intended for use with microphone bias supplies used in microphone | ||
| 3850 | * jack detection. | ||
| 3851 | * | ||
| 3852 | * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to | ||
| 3853 | * do any widget power switching. | ||
| 3854 | */ | ||
| 3855 | int snd_soc_dapm_force_enable_pin(struct snd_soc_dapm_context *dapm, | ||
| 3856 | const char *pin) | ||
| 3857 | { | ||
| 3858 | int ret; | ||
| 3859 | |||
| 3860 | mutex_lock_nested(&dapm->card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME); | ||
| 3861 | |||
| 3862 | ret = snd_soc_dapm_force_enable_pin_unlocked(dapm, pin); | ||
| 3863 | |||
| 3864 | mutex_unlock(&dapm->card->dapm_mutex); | ||
| 3865 | |||
| 3866 | return ret; | ||
| 3867 | } | ||
| 3814 | EXPORT_SYMBOL_GPL(snd_soc_dapm_force_enable_pin); | 3868 | EXPORT_SYMBOL_GPL(snd_soc_dapm_force_enable_pin); |
| 3815 | 3869 | ||
| 3816 | /** | 3870 | /** |
| 3871 | * snd_soc_dapm_disable_pin_unlocked - disable pin. | ||
| 3872 | * @dapm: DAPM context | ||
| 3873 | * @pin: pin name | ||
| 3874 | * | ||
| 3875 | * Disables input/output pin and its parents or children widgets. | ||
| 3876 | * | ||
| 3877 | * Requires external locking. | ||
| 3878 | * | ||
| 3879 | * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to | ||
| 3880 | * do any widget power switching. | ||
| 3881 | */ | ||
| 3882 | int snd_soc_dapm_disable_pin_unlocked(struct snd_soc_dapm_context *dapm, | ||
| 3883 | const char *pin) | ||
| 3884 | { | ||
| 3885 | return snd_soc_dapm_set_pin(dapm, pin, 0); | ||
| 3886 | } | ||
| 3887 | EXPORT_SYMBOL_GPL(snd_soc_dapm_disable_pin_unlocked); | ||
| 3888 | |||
| 3889 | /** | ||
| 3817 | * snd_soc_dapm_disable_pin - disable pin. | 3890 | * snd_soc_dapm_disable_pin - disable pin. |
| 3818 | * @dapm: DAPM context | 3891 | * @dapm: DAPM context |
| 3819 | * @pin: pin name | 3892 | * @pin: pin name |
| 3820 | * | 3893 | * |
| 3821 | * Disables input/output pin and its parents or children widgets. | 3894 | * Disables input/output pin and its parents or children widgets. |
| 3895 | * | ||
| 3822 | * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to | 3896 | * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to |
| 3823 | * do any widget power switching. | 3897 | * do any widget power switching. |
| 3824 | */ | 3898 | */ |
| 3825 | int snd_soc_dapm_disable_pin(struct snd_soc_dapm_context *dapm, | 3899 | int snd_soc_dapm_disable_pin(struct snd_soc_dapm_context *dapm, |
| 3826 | const char *pin) | 3900 | const char *pin) |
| 3827 | { | 3901 | { |
| 3828 | return snd_soc_dapm_set_pin(dapm, pin, 0); | 3902 | int ret; |
| 3903 | |||
| 3904 | mutex_lock_nested(&dapm->card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME); | ||
| 3905 | |||
| 3906 | ret = snd_soc_dapm_set_pin(dapm, pin, 0); | ||
| 3907 | |||
| 3908 | mutex_unlock(&dapm->card->dapm_mutex); | ||
| 3909 | |||
| 3910 | return ret; | ||
| 3829 | } | 3911 | } |
| 3830 | EXPORT_SYMBOL_GPL(snd_soc_dapm_disable_pin); | 3912 | EXPORT_SYMBOL_GPL(snd_soc_dapm_disable_pin); |
| 3831 | 3913 | ||
| 3832 | /** | 3914 | /** |
| 3915 | * snd_soc_dapm_nc_pin_unlocked - permanently disable pin. | ||
| 3916 | * @dapm: DAPM context | ||
| 3917 | * @pin: pin name | ||
| 3918 | * | ||
| 3919 | * Marks the specified pin as being not connected, disabling it along | ||
| 3920 | * any parent or child widgets. At present this is identical to | ||
| 3921 | * snd_soc_dapm_disable_pin() but in future it will be extended to do | ||
| 3922 | * additional things such as disabling controls which only affect | ||
| 3923 | * paths through the pin. | ||
| 3924 | * | ||
| 3925 | * Requires external locking. | ||
| 3926 | * | ||
| 3927 | * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to | ||
| 3928 | * do any widget power switching. | ||
| 3929 | */ | ||
| 3930 | int snd_soc_dapm_nc_pin_unlocked(struct snd_soc_dapm_context *dapm, | ||
| 3931 | const char *pin) | ||
| 3932 | { | ||
| 3933 | return snd_soc_dapm_set_pin(dapm, pin, 0); | ||
| 3934 | } | ||
| 3935 | EXPORT_SYMBOL_GPL(snd_soc_dapm_nc_pin_unlocked); | ||
| 3936 | |||
| 3937 | /** | ||
| 3833 | * snd_soc_dapm_nc_pin - permanently disable pin. | 3938 | * snd_soc_dapm_nc_pin - permanently disable pin. |
| 3834 | * @dapm: DAPM context | 3939 | * @dapm: DAPM context |
| 3835 | * @pin: pin name | 3940 | * @pin: pin name |
| @@ -3845,7 +3950,15 @@ EXPORT_SYMBOL_GPL(snd_soc_dapm_disable_pin); | |||
| 3845 | */ | 3950 | */ |
| 3846 | int snd_soc_dapm_nc_pin(struct snd_soc_dapm_context *dapm, const char *pin) | 3951 | int snd_soc_dapm_nc_pin(struct snd_soc_dapm_context *dapm, const char *pin) |
| 3847 | { | 3952 | { |
| 3848 | return snd_soc_dapm_set_pin(dapm, pin, 0); | 3953 | int ret; |
| 3954 | |||
| 3955 | mutex_lock_nested(&dapm->card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME); | ||
| 3956 | |||
| 3957 | ret = snd_soc_dapm_set_pin(dapm, pin, 0); | ||
| 3958 | |||
| 3959 | mutex_unlock(&dapm->card->dapm_mutex); | ||
| 3960 | |||
| 3961 | return ret; | ||
| 3849 | } | 3962 | } |
| 3850 | EXPORT_SYMBOL_GPL(snd_soc_dapm_nc_pin); | 3963 | EXPORT_SYMBOL_GPL(snd_soc_dapm_nc_pin); |
| 3851 | 3964 | ||
diff --git a/sound/soc/txx9/txx9aclc-ac97.c b/sound/soc/txx9/txx9aclc-ac97.c index e0305a148568..9edd68db9f48 100644 --- a/sound/soc/txx9/txx9aclc-ac97.c +++ b/sound/soc/txx9/txx9aclc-ac97.c | |||
| @@ -183,14 +183,16 @@ static int txx9aclc_ac97_dev_probe(struct platform_device *pdev) | |||
| 183 | irq = platform_get_irq(pdev, 0); | 183 | irq = platform_get_irq(pdev, 0); |
| 184 | if (irq < 0) | 184 | if (irq < 0) |
| 185 | return irq; | 185 | return irq; |
| 186 | |||
| 187 | drvdata = devm_kzalloc(&pdev->dev, sizeof(*drvdata), GFP_KERNEL); | ||
| 188 | if (!drvdata) | ||
| 189 | return -ENOMEM; | ||
| 190 | |||
| 186 | r = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 191 | r = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 187 | drvdata->base = devm_ioremap_resource(&pdev->dev, r); | 192 | drvdata->base = devm_ioremap_resource(&pdev->dev, r); |
| 188 | if (IS_ERR(drvdata->base)) | 193 | if (IS_ERR(drvdata->base)) |
| 189 | return PTR_ERR(drvdata->base); | 194 | return PTR_ERR(drvdata->base); |
| 190 | 195 | ||
| 191 | drvdata = devm_kzalloc(&pdev->dev, sizeof(*drvdata), GFP_KERNEL); | ||
| 192 | if (!drvdata) | ||
| 193 | return -ENOMEM; | ||
| 194 | platform_set_drvdata(pdev, drvdata); | 196 | platform_set_drvdata(pdev, drvdata); |
| 195 | drvdata->physbase = r->start; | 197 | drvdata->physbase = r->start; |
| 196 | if (sizeof(drvdata->physbase) > sizeof(r->start) && | 198 | if (sizeof(drvdata->physbase) > sizeof(r->start) && |
diff --git a/sound/usb/mixer_maps.c b/sound/usb/mixer_maps.c index 32af6b741ef5..d1d72ff50347 100644 --- a/sound/usb/mixer_maps.c +++ b/sound/usb/mixer_maps.c | |||
| @@ -328,6 +328,11 @@ static struct usbmix_name_map gamecom780_map[] = { | |||
| 328 | {} | 328 | {} |
| 329 | }; | 329 | }; |
| 330 | 330 | ||
| 331 | static const struct usbmix_name_map kef_x300a_map[] = { | ||
| 332 | { 10, NULL }, /* firmware locks up (?) when we try to access this FU */ | ||
| 333 | { 0 } | ||
| 334 | }; | ||
| 335 | |||
| 331 | /* | 336 | /* |
| 332 | * Control map entries | 337 | * Control map entries |
| 333 | */ | 338 | */ |
| @@ -419,6 +424,10 @@ static struct usbmix_ctl_map usbmix_ctl_maps[] = { | |||
| 419 | .id = USB_ID(0x200c, 0x1018), | 424 | .id = USB_ID(0x200c, 0x1018), |
| 420 | .map = ebox44_map, | 425 | .map = ebox44_map, |
| 421 | }, | 426 | }, |
| 427 | { | ||
| 428 | .id = USB_ID(0x27ac, 0x1000), | ||
| 429 | .map = kef_x300a_map, | ||
| 430 | }, | ||
| 422 | { 0 } /* terminator */ | 431 | { 0 } /* terminator */ |
| 423 | }; | 432 | }; |
| 424 | 433 | ||
diff --git a/tools/lib/lockdep/Makefile b/tools/lib/lockdep/Makefile index da8b7aa3d351..07b0b7542511 100644 --- a/tools/lib/lockdep/Makefile +++ b/tools/lib/lockdep/Makefile | |||
| @@ -87,8 +87,8 @@ endif # BUILD_SRC | |||
| 87 | # We process the rest of the Makefile if this is the final invocation of make | 87 | # We process the rest of the Makefile if this is the final invocation of make |
| 88 | ifeq ($(skip-makefile),) | 88 | ifeq ($(skip-makefile),) |
| 89 | 89 | ||
| 90 | srctree := $(if $(BUILD_SRC),$(BUILD_SRC),$(CURDIR)) | 90 | srctree := $(realpath $(if $(BUILD_SRC),$(BUILD_SRC),$(CURDIR))) |
| 91 | objtree := $(CURDIR) | 91 | objtree := $(realpath $(CURDIR)) |
| 92 | src := $(srctree) | 92 | src := $(srctree) |
| 93 | obj := $(objtree) | 93 | obj := $(objtree) |
| 94 | 94 | ||
| @@ -112,7 +112,7 @@ export Q VERBOSE | |||
| 112 | 112 | ||
| 113 | LIBLOCKDEP_VERSION = $(LL_VERSION).$(LL_PATCHLEVEL).$(LL_EXTRAVERSION) | 113 | LIBLOCKDEP_VERSION = $(LL_VERSION).$(LL_PATCHLEVEL).$(LL_EXTRAVERSION) |
| 114 | 114 | ||
| 115 | INCLUDES = -I. -I/usr/local/include -I./uinclude $(CONFIG_INCLUDES) | 115 | INCLUDES = -I. -I/usr/local/include -I./uinclude -I./include $(CONFIG_INCLUDES) |
| 116 | 116 | ||
| 117 | # Set compile option CFLAGS if not set elsewhere | 117 | # Set compile option CFLAGS if not set elsewhere |
| 118 | CFLAGS ?= -g -DCONFIG_LOCKDEP -DCONFIG_STACKTRACE -DCONFIG_PROVE_LOCKING -DBITS_PER_LONG=__WORDSIZE -DLIBLOCKDEP_VERSION='"$(LIBLOCKDEP_VERSION)"' -rdynamic -O0 -g | 118 | CFLAGS ?= -g -DCONFIG_LOCKDEP -DCONFIG_STACKTRACE -DCONFIG_PROVE_LOCKING -DBITS_PER_LONG=__WORDSIZE -DLIBLOCKDEP_VERSION='"$(LIBLOCKDEP_VERSION)"' -rdynamic -O0 -g |
diff --git a/tools/lib/lockdep/preload.c b/tools/lib/lockdep/preload.c index f8465a811aa5..23bd69cb5ade 100644 --- a/tools/lib/lockdep/preload.c +++ b/tools/lib/lockdep/preload.c | |||
| @@ -418,7 +418,7 @@ int pthread_rwlock_unlock(pthread_rwlock_t *rwlock) | |||
| 418 | 418 | ||
| 419 | __attribute__((constructor)) static void init_preload(void) | 419 | __attribute__((constructor)) static void init_preload(void) |
| 420 | { | 420 | { |
| 421 | if (__init_state != done) | 421 | if (__init_state == done) |
| 422 | return; | 422 | return; |
| 423 | 423 | ||
| 424 | #ifndef __GLIBC__ | 424 | #ifndef __GLIBC__ |
diff --git a/tools/lib/lockdep/run_tests.sh b/tools/lib/lockdep/run_tests.sh index 5334ad9d39b7..5334ad9d39b7 100644..100755 --- a/tools/lib/lockdep/run_tests.sh +++ b/tools/lib/lockdep/run_tests.sh | |||
diff --git a/tools/lib/lockdep/uinclude/asm/hash.h b/tools/lib/lockdep/uinclude/asm/hash.h new file mode 100644 index 000000000000..d82b170bb216 --- /dev/null +++ b/tools/lib/lockdep/uinclude/asm/hash.h | |||
| @@ -0,0 +1,6 @@ | |||
| 1 | #ifndef __ASM_GENERIC_HASH_H | ||
| 2 | #define __ASM_GENERIC_HASH_H | ||
| 3 | |||
| 4 | /* Stub */ | ||
| 5 | |||
| 6 | #endif /* __ASM_GENERIC_HASH_H */ | ||
diff --git a/tools/lib/lockdep/uinclude/linux/rcu.h b/tools/lib/lockdep/uinclude/linux/rcu.h index 4c99fcb5da27..042ee8e463c9 100644 --- a/tools/lib/lockdep/uinclude/linux/rcu.h +++ b/tools/lib/lockdep/uinclude/linux/rcu.h | |||
| @@ -13,4 +13,9 @@ static inline int rcu_is_cpu_idle(void) | |||
| 13 | return 1; | 13 | return 1; |
| 14 | } | 14 | } |
| 15 | 15 | ||
| 16 | static inline bool rcu_is_watching(void) | ||
| 17 | { | ||
| 18 | return false; | ||
| 19 | } | ||
| 20 | |||
| 16 | #endif | 21 | #endif |
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index 3c53ec268fbc..02f985f3a396 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c | |||
| @@ -113,14 +113,16 @@ static int report__add_mem_hist_entry(struct perf_tool *tool, struct addr_locati | |||
| 113 | if (!he) | 113 | if (!he) |
| 114 | return -ENOMEM; | 114 | return -ENOMEM; |
| 115 | 115 | ||
| 116 | err = hist_entry__inc_addr_samples(he, evsel->idx, al->addr); | 116 | if (ui__has_annotation()) { |
| 117 | if (err) | 117 | err = hist_entry__inc_addr_samples(he, evsel->idx, al->addr); |
| 118 | goto out; | 118 | if (err) |
| 119 | goto out; | ||
| 119 | 120 | ||
| 120 | mx = he->mem_info; | 121 | mx = he->mem_info; |
| 121 | err = addr_map_symbol__inc_samples(&mx->daddr, evsel->idx); | 122 | err = addr_map_symbol__inc_samples(&mx->daddr, evsel->idx); |
| 122 | if (err) | 123 | if (err) |
| 123 | goto out; | 124 | goto out; |
| 125 | } | ||
| 124 | 126 | ||
| 125 | evsel->hists.stats.total_period += cost; | 127 | evsel->hists.stats.total_period += cost; |
| 126 | hists__inc_nr_events(&evsel->hists, PERF_RECORD_SAMPLE); | 128 | hists__inc_nr_events(&evsel->hists, PERF_RECORD_SAMPLE); |
| @@ -164,14 +166,18 @@ static int report__add_branch_hist_entry(struct perf_tool *tool, struct addr_loc | |||
| 164 | he = __hists__add_entry(&evsel->hists, al, parent, &bi[i], NULL, | 166 | he = __hists__add_entry(&evsel->hists, al, parent, &bi[i], NULL, |
| 165 | 1, 1, 0); | 167 | 1, 1, 0); |
| 166 | if (he) { | 168 | if (he) { |
| 167 | bx = he->branch_info; | 169 | if (ui__has_annotation()) { |
| 168 | err = addr_map_symbol__inc_samples(&bx->from, evsel->idx); | 170 | bx = he->branch_info; |
| 169 | if (err) | 171 | err = addr_map_symbol__inc_samples(&bx->from, |
| 170 | goto out; | 172 | evsel->idx); |
| 171 | 173 | if (err) | |
| 172 | err = addr_map_symbol__inc_samples(&bx->to, evsel->idx); | 174 | goto out; |
| 173 | if (err) | 175 | |
| 174 | goto out; | 176 | err = addr_map_symbol__inc_samples(&bx->to, |
| 177 | evsel->idx); | ||
| 178 | if (err) | ||
| 179 | goto out; | ||
| 180 | } | ||
| 175 | 181 | ||
| 176 | evsel->hists.stats.total_period += 1; | 182 | evsel->hists.stats.total_period += 1; |
| 177 | hists__inc_nr_events(&evsel->hists, PERF_RECORD_SAMPLE); | 183 | hists__inc_nr_events(&evsel->hists, PERF_RECORD_SAMPLE); |
| @@ -205,7 +211,9 @@ static int report__add_hist_entry(struct perf_tool *tool, struct perf_evsel *evs | |||
| 205 | if (err) | 211 | if (err) |
| 206 | goto out; | 212 | goto out; |
| 207 | 213 | ||
| 208 | err = hist_entry__inc_addr_samples(he, evsel->idx, al->addr); | 214 | if (ui__has_annotation()) |
| 215 | err = hist_entry__inc_addr_samples(he, evsel->idx, al->addr); | ||
| 216 | |||
| 209 | evsel->hists.stats.total_period += sample->period; | 217 | evsel->hists.stats.total_period += sample->period; |
| 210 | hists__inc_nr_events(&evsel->hists, PERF_RECORD_SAMPLE); | 218 | hists__inc_nr_events(&evsel->hists, PERF_RECORD_SAMPLE); |
| 211 | out: | 219 | out: |
diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c index 76cd510d34d0..5f989a7d8bc2 100644 --- a/tools/perf/builtin-top.c +++ b/tools/perf/builtin-top.c | |||
| @@ -176,7 +176,7 @@ static void perf_top__record_precise_ip(struct perf_top *top, | |||
| 176 | { | 176 | { |
| 177 | struct annotation *notes; | 177 | struct annotation *notes; |
| 178 | struct symbol *sym; | 178 | struct symbol *sym; |
| 179 | int err; | 179 | int err = 0; |
| 180 | 180 | ||
| 181 | if (he == NULL || he->ms.sym == NULL || | 181 | if (he == NULL || he->ms.sym == NULL || |
| 182 | ((top->sym_filter_entry == NULL || | 182 | ((top->sym_filter_entry == NULL || |
| @@ -190,7 +190,9 @@ static void perf_top__record_precise_ip(struct perf_top *top, | |||
| 190 | return; | 190 | return; |
| 191 | 191 | ||
| 192 | ip = he->ms.map->map_ip(he->ms.map, ip); | 192 | ip = he->ms.map->map_ip(he->ms.map, ip); |
| 193 | err = hist_entry__inc_addr_samples(he, counter, ip); | 193 | |
| 194 | if (ui__has_annotation()) | ||
| 195 | err = hist_entry__inc_addr_samples(he, counter, ip); | ||
| 194 | 196 | ||
| 195 | pthread_mutex_unlock(¬es->lock); | 197 | pthread_mutex_unlock(¬es->lock); |
| 196 | 198 | ||
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index 896f27047ed6..6aa6fb6f7bd9 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c | |||
| @@ -37,6 +37,10 @@ | |||
| 37 | # define MADV_UNMERGEABLE 13 | 37 | # define MADV_UNMERGEABLE 13 |
| 38 | #endif | 38 | #endif |
| 39 | 39 | ||
| 40 | #ifndef EFD_SEMAPHORE | ||
| 41 | # define EFD_SEMAPHORE 1 | ||
| 42 | #endif | ||
| 43 | |||
| 40 | struct tp_field { | 44 | struct tp_field { |
| 41 | int offset; | 45 | int offset; |
| 42 | union { | 46 | union { |
| @@ -279,6 +283,11 @@ static size_t syscall_arg__scnprintf_strarray(char *bf, size_t size, | |||
| 279 | 283 | ||
| 280 | #define SCA_STRARRAY syscall_arg__scnprintf_strarray | 284 | #define SCA_STRARRAY syscall_arg__scnprintf_strarray |
| 281 | 285 | ||
| 286 | #if defined(__i386__) || defined(__x86_64__) | ||
| 287 | /* | ||
| 288 | * FIXME: Make this available to all arches as soon as the ioctl beautifier | ||
| 289 | * gets rewritten to support all arches. | ||
| 290 | */ | ||
| 282 | static size_t syscall_arg__scnprintf_strhexarray(char *bf, size_t size, | 291 | static size_t syscall_arg__scnprintf_strhexarray(char *bf, size_t size, |
| 283 | struct syscall_arg *arg) | 292 | struct syscall_arg *arg) |
| 284 | { | 293 | { |
| @@ -286,6 +295,7 @@ static size_t syscall_arg__scnprintf_strhexarray(char *bf, size_t size, | |||
| 286 | } | 295 | } |
| 287 | 296 | ||
| 288 | #define SCA_STRHEXARRAY syscall_arg__scnprintf_strhexarray | 297 | #define SCA_STRHEXARRAY syscall_arg__scnprintf_strhexarray |
| 298 | #endif /* defined(__i386__) || defined(__x86_64__) */ | ||
| 289 | 299 | ||
| 290 | static size_t syscall_arg__scnprintf_fd(char *bf, size_t size, | 300 | static size_t syscall_arg__scnprintf_fd(char *bf, size_t size, |
| 291 | struct syscall_arg *arg); | 301 | struct syscall_arg *arg); |
| @@ -839,6 +849,10 @@ static size_t syscall_arg__scnprintf_signum(char *bf, size_t size, struct syscal | |||
| 839 | 849 | ||
| 840 | #define SCA_SIGNUM syscall_arg__scnprintf_signum | 850 | #define SCA_SIGNUM syscall_arg__scnprintf_signum |
| 841 | 851 | ||
| 852 | #if defined(__i386__) || defined(__x86_64__) | ||
| 853 | /* | ||
| 854 | * FIXME: Make this available to all arches. | ||
| 855 | */ | ||
| 842 | #define TCGETS 0x5401 | 856 | #define TCGETS 0x5401 |
| 843 | 857 | ||
| 844 | static const char *tioctls[] = { | 858 | static const char *tioctls[] = { |
| @@ -860,6 +874,7 @@ static const char *tioctls[] = { | |||
| 860 | }; | 874 | }; |
| 861 | 875 | ||
| 862 | static DEFINE_STRARRAY_OFFSET(tioctls, 0x5401); | 876 | static DEFINE_STRARRAY_OFFSET(tioctls, 0x5401); |
| 877 | #endif /* defined(__i386__) || defined(__x86_64__) */ | ||
| 863 | 878 | ||
| 864 | #define STRARRAY(arg, name, array) \ | 879 | #define STRARRAY(arg, name, array) \ |
| 865 | .arg_scnprintf = { [arg] = SCA_STRARRAY, }, \ | 880 | .arg_scnprintf = { [arg] = SCA_STRARRAY, }, \ |
| @@ -941,9 +956,16 @@ static struct syscall_fmt { | |||
| 941 | { .name = "getrlimit", .errmsg = true, STRARRAY(0, resource, rlimit_resources), }, | 956 | { .name = "getrlimit", .errmsg = true, STRARRAY(0, resource, rlimit_resources), }, |
| 942 | { .name = "ioctl", .errmsg = true, | 957 | { .name = "ioctl", .errmsg = true, |
| 943 | .arg_scnprintf = { [0] = SCA_FD, /* fd */ | 958 | .arg_scnprintf = { [0] = SCA_FD, /* fd */ |
| 959 | #if defined(__i386__) || defined(__x86_64__) | ||
| 960 | /* | ||
| 961 | * FIXME: Make this available to all arches. | ||
| 962 | */ | ||
| 944 | [1] = SCA_STRHEXARRAY, /* cmd */ | 963 | [1] = SCA_STRHEXARRAY, /* cmd */ |
| 945 | [2] = SCA_HEX, /* arg */ }, | 964 | [2] = SCA_HEX, /* arg */ }, |
| 946 | .arg_parm = { [1] = &strarray__tioctls, /* cmd */ }, }, | 965 | .arg_parm = { [1] = &strarray__tioctls, /* cmd */ }, }, |
| 966 | #else | ||
| 967 | [2] = SCA_HEX, /* arg */ }, }, | ||
| 968 | #endif | ||
| 947 | { .name = "kill", .errmsg = true, | 969 | { .name = "kill", .errmsg = true, |
| 948 | .arg_scnprintf = { [1] = SCA_SIGNUM, /* sig */ }, }, | 970 | .arg_scnprintf = { [1] = SCA_SIGNUM, /* sig */ }, }, |
| 949 | { .name = "linkat", .errmsg = true, | 971 | { .name = "linkat", .errmsg = true, |
diff --git a/tools/perf/config/Makefile b/tools/perf/config/Makefile index c48d44958172..0331ea2701a3 100644 --- a/tools/perf/config/Makefile +++ b/tools/perf/config/Makefile | |||
| @@ -478,7 +478,7 @@ else | |||
| 478 | endif | 478 | endif |
| 479 | 479 | ||
| 480 | ifeq ($(feature-libbfd), 1) | 480 | ifeq ($(feature-libbfd), 1) |
| 481 | EXTLIBS += -lbfd | 481 | EXTLIBS += -lbfd -lz -liberty |
| 482 | endif | 482 | endif |
| 483 | 483 | ||
| 484 | ifdef NO_DEMANGLE | 484 | ifdef NO_DEMANGLE |
diff --git a/tools/perf/config/feature-checks/Makefile b/tools/perf/config/feature-checks/Makefile index 12e551346fa6..523b7bc10553 100644 --- a/tools/perf/config/feature-checks/Makefile +++ b/tools/perf/config/feature-checks/Makefile | |||
| @@ -121,7 +121,7 @@ test-libpython-version.bin: | |||
| 121 | $(BUILD) $(FLAGS_PYTHON_EMBED) | 121 | $(BUILD) $(FLAGS_PYTHON_EMBED) |
| 122 | 122 | ||
| 123 | test-libbfd.bin: | 123 | test-libbfd.bin: |
| 124 | $(BUILD) -DPACKAGE='"perf"' -lbfd -ldl | 124 | $(BUILD) -DPACKAGE='"perf"' -lbfd -lz -liberty -ldl |
| 125 | 125 | ||
| 126 | test-liberty.bin: | 126 | test-liberty.bin: |
| 127 | $(CC) -o $(OUTPUT)$@ test-libbfd.c -DPACKAGE='"perf"' -lbfd -ldl -liberty | 127 | $(CC) -o $(OUTPUT)$@ test-libbfd.c -DPACKAGE='"perf"' -lbfd -ldl -liberty |
diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c index 469eb679fb9d..3aa555ff9d89 100644 --- a/tools/perf/util/annotate.c +++ b/tools/perf/util/annotate.c | |||
| @@ -8,6 +8,8 @@ | |||
| 8 | */ | 8 | */ |
| 9 | 9 | ||
| 10 | #include "util.h" | 10 | #include "util.h" |
| 11 | #include "ui/ui.h" | ||
| 12 | #include "sort.h" | ||
| 11 | #include "build-id.h" | 13 | #include "build-id.h" |
| 12 | #include "color.h" | 14 | #include "color.h" |
| 13 | #include "cache.h" | 15 | #include "cache.h" |
| @@ -489,7 +491,7 @@ static int symbol__inc_addr_samples(struct symbol *sym, struct map *map, | |||
| 489 | { | 491 | { |
| 490 | struct annotation *notes; | 492 | struct annotation *notes; |
| 491 | 493 | ||
| 492 | if (sym == NULL || use_browser != 1 || !sort__has_sym) | 494 | if (sym == NULL) |
| 493 | return 0; | 495 | return 0; |
| 494 | 496 | ||
| 495 | notes = symbol__annotation(sym); | 497 | notes = symbol__annotation(sym); |
| @@ -1399,3 +1401,8 @@ int hist_entry__annotate(struct hist_entry *he, size_t privsize) | |||
| 1399 | { | 1401 | { |
| 1400 | return symbol__annotate(he->ms.sym, he->ms.map, privsize); | 1402 | return symbol__annotate(he->ms.sym, he->ms.map, privsize); |
| 1401 | } | 1403 | } |
| 1404 | |||
| 1405 | bool ui__has_annotation(void) | ||
| 1406 | { | ||
| 1407 | return use_browser == 1 && sort__has_sym; | ||
| 1408 | } | ||
diff --git a/tools/perf/util/annotate.h b/tools/perf/util/annotate.h index b2aef59d6bb2..56ad4f5287de 100644 --- a/tools/perf/util/annotate.h +++ b/tools/perf/util/annotate.h | |||
| @@ -151,6 +151,8 @@ void symbol__annotate_zero_histogram(struct symbol *sym, int evidx); | |||
| 151 | void symbol__annotate_decay_histogram(struct symbol *sym, int evidx); | 151 | void symbol__annotate_decay_histogram(struct symbol *sym, int evidx); |
| 152 | void disasm__purge(struct list_head *head); | 152 | void disasm__purge(struct list_head *head); |
| 153 | 153 | ||
| 154 | bool ui__has_annotation(void); | ||
| 155 | |||
| 154 | int symbol__tty_annotate(struct symbol *sym, struct map *map, | 156 | int symbol__tty_annotate(struct symbol *sym, struct map *map, |
| 155 | struct perf_evsel *evsel, bool print_lines, | 157 | struct perf_evsel *evsel, bool print_lines, |
| 156 | bool full_paths, int min_pcnt, int max_lines); | 158 | bool full_paths, int min_pcnt, int max_lines); |
diff --git a/tools/perf/util/include/linux/bitops.h b/tools/perf/util/include/linux/bitops.h index 45cf10a562bd..dadfa7e54287 100644 --- a/tools/perf/util/include/linux/bitops.h +++ b/tools/perf/util/include/linux/bitops.h | |||
| @@ -87,13 +87,15 @@ static __always_inline unsigned long __ffs(unsigned long word) | |||
| 87 | return num; | 87 | return num; |
| 88 | } | 88 | } |
| 89 | 89 | ||
| 90 | typedef const unsigned long __attribute__((__may_alias__)) long_alias_t; | ||
| 91 | |||
| 90 | /* | 92 | /* |
| 91 | * Find the first set bit in a memory region. | 93 | * Find the first set bit in a memory region. |
| 92 | */ | 94 | */ |
| 93 | static inline unsigned long | 95 | static inline unsigned long |
| 94 | find_first_bit(const unsigned long *addr, unsigned long size) | 96 | find_first_bit(const unsigned long *addr, unsigned long size) |
| 95 | { | 97 | { |
| 96 | const unsigned long *p = addr; | 98 | long_alias_t *p = (long_alias_t *) addr; |
| 97 | unsigned long result = 0; | 99 | unsigned long result = 0; |
| 98 | unsigned long tmp; | 100 | unsigned long tmp; |
| 99 | 101 | ||
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index d248fca6d7ed..1e15df10a88c 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c | |||
| @@ -1091,12 +1091,12 @@ int is_valid_tracepoint(const char *event_string) | |||
| 1091 | static bool is_event_supported(u8 type, unsigned config) | 1091 | static bool is_event_supported(u8 type, unsigned config) |
| 1092 | { | 1092 | { |
| 1093 | bool ret = true; | 1093 | bool ret = true; |
| 1094 | int open_return; | ||
| 1094 | struct perf_evsel *evsel; | 1095 | struct perf_evsel *evsel; |
| 1095 | struct perf_event_attr attr = { | 1096 | struct perf_event_attr attr = { |
| 1096 | .type = type, | 1097 | .type = type, |
| 1097 | .config = config, | 1098 | .config = config, |
| 1098 | .disabled = 1, | 1099 | .disabled = 1, |
| 1099 | .exclude_kernel = 1, | ||
| 1100 | }; | 1100 | }; |
| 1101 | struct { | 1101 | struct { |
| 1102 | struct thread_map map; | 1102 | struct thread_map map; |
| @@ -1108,7 +1108,20 @@ static bool is_event_supported(u8 type, unsigned config) | |||
| 1108 | 1108 | ||
| 1109 | evsel = perf_evsel__new(&attr); | 1109 | evsel = perf_evsel__new(&attr); |
| 1110 | if (evsel) { | 1110 | if (evsel) { |
| 1111 | ret = perf_evsel__open(evsel, NULL, &tmap.map) >= 0; | 1111 | open_return = perf_evsel__open(evsel, NULL, &tmap.map); |
| 1112 | ret = open_return >= 0; | ||
| 1113 | |||
| 1114 | if (open_return == -EACCES) { | ||
| 1115 | /* | ||
| 1116 | * This happens if the paranoid value | ||
| 1117 | * /proc/sys/kernel/perf_event_paranoid is set to 2 | ||
| 1118 | * Re-run with exclude_kernel set; we don't do that | ||
| 1119 | * by default as some ARM machines do not support it. | ||
| 1120 | * | ||
| 1121 | */ | ||
| 1122 | evsel->attr.exclude_kernel = 1; | ||
| 1123 | ret = perf_evsel__open(evsel, NULL, &tmap.map) >= 0; | ||
| 1124 | } | ||
| 1112 | perf_evsel__delete(evsel); | 1125 | perf_evsel__delete(evsel); |
| 1113 | } | 1126 | } |
| 1114 | 1127 | ||
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c index a8a9b6cd93a8..d8b048c20cde 100644 --- a/tools/perf/util/probe-event.c +++ b/tools/perf/util/probe-event.c | |||
| @@ -336,8 +336,8 @@ static int add_exec_to_probe_trace_events(struct probe_trace_event *tevs, | |||
| 336 | return ret; | 336 | return ret; |
| 337 | 337 | ||
| 338 | for (i = 0; i < ntevs && ret >= 0; i++) { | 338 | for (i = 0; i < ntevs && ret >= 0; i++) { |
| 339 | /* point.address is the addres of point.symbol + point.offset */ | ||
| 339 | offset = tevs[i].point.address - stext; | 340 | offset = tevs[i].point.address - stext; |
| 340 | offset += tevs[i].point.offset; | ||
| 341 | tevs[i].point.offset = 0; | 341 | tevs[i].point.offset = 0; |
| 342 | zfree(&tevs[i].point.symbol); | 342 | zfree(&tevs[i].point.symbol); |
| 343 | ret = e_snprintf(buf, 32, "0x%lx", offset); | 343 | ret = e_snprintf(buf, 32, "0x%lx", offset); |
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index 0b39a48e5110..5da6ce74c676 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c | |||
| @@ -1008,6 +1008,12 @@ static int perf_session__process_user_event(struct perf_session *session, union | |||
| 1008 | if (err == 0) | 1008 | if (err == 0) |
| 1009 | perf_session__set_id_hdr_size(session); | 1009 | perf_session__set_id_hdr_size(session); |
| 1010 | return err; | 1010 | return err; |
| 1011 | case PERF_RECORD_HEADER_EVENT_TYPE: | ||
| 1012 | /* | ||
| 1013 | * Depreceated, but we need to handle it for sake | ||
| 1014 | * of old data files create in pipe mode. | ||
| 1015 | */ | ||
| 1016 | return 0; | ||
| 1011 | case PERF_RECORD_HEADER_TRACING_DATA: | 1017 | case PERF_RECORD_HEADER_TRACING_DATA: |
| 1012 | /* setup for reading amidst mmap */ | 1018 | /* setup for reading amidst mmap */ |
| 1013 | lseek(fd, file_offset, SEEK_SET); | 1019 | lseek(fd, file_offset, SEEK_SET); |
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c index a9d758a3b371..e89afc097d8a 100644 --- a/tools/perf/util/symbol.c +++ b/tools/perf/util/symbol.c | |||
| @@ -1336,6 +1336,8 @@ int dso__load(struct dso *dso, struct map *map, symbol_filter_t filter) | |||
| 1336 | 1336 | ||
| 1337 | if (syms_ss && runtime_ss) | 1337 | if (syms_ss && runtime_ss) |
| 1338 | break; | 1338 | break; |
| 1339 | } else { | ||
| 1340 | symsrc__destroy(ss); | ||
| 1339 | } | 1341 | } |
| 1340 | 1342 | ||
| 1341 | } | 1343 | } |
