diff options
241 files changed, 1767 insertions, 2287 deletions
diff --git a/Documentation/devicetree/bindings/clock/imx23-clock.txt b/Documentation/devicetree/bindings/clock/imx23-clock.txt index baadbb11fe98..5083c0b834b2 100644 --- a/Documentation/devicetree/bindings/clock/imx23-clock.txt +++ b/Documentation/devicetree/bindings/clock/imx23-clock.txt | |||
| @@ -60,11 +60,6 @@ clks: clkctrl@80040000 { | |||
| 60 | compatible = "fsl,imx23-clkctrl"; | 60 | compatible = "fsl,imx23-clkctrl"; |
| 61 | reg = <0x80040000 0x2000>; | 61 | reg = <0x80040000 0x2000>; |
| 62 | #clock-cells = <1>; | 62 | #clock-cells = <1>; |
| 63 | clock-output-names = | ||
| 64 | ... | ||
| 65 | "uart", /* 32 */ | ||
| 66 | ... | ||
| 67 | "end_of_list"; | ||
| 68 | }; | 63 | }; |
| 69 | 64 | ||
| 70 | auart0: serial@8006c000 { | 65 | auart0: serial@8006c000 { |
diff --git a/Documentation/devicetree/bindings/clock/imx25-clock.txt b/Documentation/devicetree/bindings/clock/imx25-clock.txt index c2a3525ecb4e..db4f2f05c4d0 100644 --- a/Documentation/devicetree/bindings/clock/imx25-clock.txt +++ b/Documentation/devicetree/bindings/clock/imx25-clock.txt | |||
| @@ -146,10 +146,6 @@ clks: ccm@53f80000 { | |||
| 146 | compatible = "fsl,imx25-ccm"; | 146 | compatible = "fsl,imx25-ccm"; |
| 147 | reg = <0x53f80000 0x4000>; | 147 | reg = <0x53f80000 0x4000>; |
| 148 | interrupts = <31>; | 148 | interrupts = <31>; |
| 149 | clock-output-names = ... | ||
| 150 | "uart_ipg", | ||
| 151 | "uart_serial", | ||
| 152 | ...; | ||
| 153 | }; | 149 | }; |
| 154 | 150 | ||
| 155 | uart1: serial@43f90000 { | 151 | uart1: serial@43f90000 { |
diff --git a/Documentation/devicetree/bindings/clock/imx28-clock.txt b/Documentation/devicetree/bindings/clock/imx28-clock.txt index 52a49a4a50b3..e6587af62ff0 100644 --- a/Documentation/devicetree/bindings/clock/imx28-clock.txt +++ b/Documentation/devicetree/bindings/clock/imx28-clock.txt | |||
| @@ -83,11 +83,6 @@ clks: clkctrl@80040000 { | |||
| 83 | compatible = "fsl,imx28-clkctrl"; | 83 | compatible = "fsl,imx28-clkctrl"; |
| 84 | reg = <0x80040000 0x2000>; | 84 | reg = <0x80040000 0x2000>; |
| 85 | #clock-cells = <1>; | 85 | #clock-cells = <1>; |
| 86 | clock-output-names = | ||
| 87 | ... | ||
| 88 | "uart", /* 45 */ | ||
| 89 | ... | ||
| 90 | "end_of_list"; | ||
| 91 | }; | 86 | }; |
| 92 | 87 | ||
| 93 | auart0: serial@8006a000 { | 88 | auart0: serial@8006a000 { |
diff --git a/Documentation/devicetree/bindings/clock/imx6q-clock.txt b/Documentation/devicetree/bindings/clock/imx6q-clock.txt index d77b4e68dc42..f73fdf595568 100644 --- a/Documentation/devicetree/bindings/clock/imx6q-clock.txt +++ b/Documentation/devicetree/bindings/clock/imx6q-clock.txt | |||
| @@ -211,10 +211,6 @@ clks: ccm@020c4000 { | |||
| 211 | reg = <0x020c4000 0x4000>; | 211 | reg = <0x020c4000 0x4000>; |
| 212 | interrupts = <0 87 0x04 0 88 0x04>; | 212 | interrupts = <0 87 0x04 0 88 0x04>; |
| 213 | #clock-cells = <1>; | 213 | #clock-cells = <1>; |
| 214 | clock-output-names = ... | ||
| 215 | "uart_ipg", | ||
| 216 | "uart_serial", | ||
| 217 | ...; | ||
| 218 | }; | 214 | }; |
| 219 | 215 | ||
| 220 | uart1: serial@02020000 { | 216 | uart1: serial@02020000 { |
diff --git a/Documentation/devicetree/bindings/gpio/gpio-poweroff.txt b/Documentation/devicetree/bindings/gpio/gpio-poweroff.txt index 558cdf3c9abc..d4eab9227ea4 100644 --- a/Documentation/devicetree/bindings/gpio/gpio-poweroff.txt +++ b/Documentation/devicetree/bindings/gpio/gpio-poweroff.txt | |||
| @@ -1,4 +1,19 @@ | |||
| 1 | GPIO line that should be set high/low to power off a device | 1 | Driver a GPIO line that can be used to turn the power off. |
| 2 | |||
| 3 | The driver supports both level triggered and edge triggered power off. | ||
| 4 | At driver load time, the driver will request the given gpio line and | ||
| 5 | install a pm_power_off handler. If the optional properties 'input' is | ||
| 6 | not found, the GPIO line will be driven in the inactive | ||
| 7 | state. Otherwise its configured as an input. | ||
| 8 | |||
| 9 | When the pm_power_off is called, the gpio is configured as an output, | ||
| 10 | and drive active, so triggering a level triggered power off | ||
| 11 | condition. This will also cause an inactive->active edge condition, so | ||
| 12 | triggering positive edge triggered power off. After a delay of 100ms, | ||
| 13 | the GPIO is set to inactive, thus causing an active->inactive edge, | ||
| 14 | triggering negative edge triggered power off. After another 100ms | ||
| 15 | delay the GPIO is driver active again. If the power is still on and | ||
| 16 | the CPU still running after a 3000ms delay, a WARN_ON(1) is emitted. | ||
| 2 | 17 | ||
| 3 | Required properties: | 18 | Required properties: |
| 4 | - compatible : should be "gpio-poweroff". | 19 | - compatible : should be "gpio-poweroff". |
| @@ -13,10 +28,9 @@ Optional properties: | |||
| 13 | property is not specified, the GPIO is initialized as an output in its | 28 | property is not specified, the GPIO is initialized as an output in its |
| 14 | inactive state. | 29 | inactive state. |
| 15 | 30 | ||
| 16 | |||
| 17 | Examples: | 31 | Examples: |
| 18 | 32 | ||
| 19 | gpio-poweroff { | 33 | gpio-poweroff { |
| 20 | compatible = "gpio-poweroff"; | 34 | compatible = "gpio-poweroff"; |
| 21 | gpios = <&gpio 4 0>; /* GPIO 4 Active Low */ | 35 | gpios = <&gpio 4 0>; |
| 22 | }; | 36 | }; |
diff --git a/Documentation/networking/ip-sysctl.txt b/Documentation/networking/ip-sysctl.txt index dd52d516cb89..dbca66182089 100644 --- a/Documentation/networking/ip-sysctl.txt +++ b/Documentation/networking/ip-sysctl.txt | |||
| @@ -36,7 +36,7 @@ neigh/default/unres_qlen_bytes - INTEGER | |||
| 36 | The maximum number of bytes which may be used by packets | 36 | The maximum number of bytes which may be used by packets |
| 37 | queued for each unresolved address by other network layers. | 37 | queued for each unresolved address by other network layers. |
| 38 | (added in linux 3.3) | 38 | (added in linux 3.3) |
| 39 | Seting negative value is meaningless and will retrun error. | 39 | Setting negative value is meaningless and will return error. |
| 40 | Default: 65536 Bytes(64KB) | 40 | Default: 65536 Bytes(64KB) |
| 41 | 41 | ||
| 42 | neigh/default/unres_qlen - INTEGER | 42 | neigh/default/unres_qlen - INTEGER |
| @@ -215,7 +215,7 @@ tcp_ecn - INTEGER | |||
| 215 | Possible values are: | 215 | Possible values are: |
| 216 | 0 Disable ECN. Neither initiate nor accept ECN. | 216 | 0 Disable ECN. Neither initiate nor accept ECN. |
| 217 | 1 Always request ECN on outgoing connection attempts. | 217 | 1 Always request ECN on outgoing connection attempts. |
| 218 | 2 Enable ECN when requested by incomming connections | 218 | 2 Enable ECN when requested by incoming connections |
| 219 | but do not request ECN on outgoing connections. | 219 | but do not request ECN on outgoing connections. |
| 220 | Default: 2 | 220 | Default: 2 |
| 221 | 221 | ||
| @@ -503,7 +503,7 @@ tcp_fastopen - INTEGER | |||
| 503 | tcp_syn_retries - INTEGER | 503 | tcp_syn_retries - INTEGER |
| 504 | Number of times initial SYNs for an active TCP connection attempt | 504 | Number of times initial SYNs for an active TCP connection attempt |
| 505 | will be retransmitted. Should not be higher than 255. Default value | 505 | will be retransmitted. Should not be higher than 255. Default value |
| 506 | is 6, which corresponds to 63seconds till the last restransmission | 506 | is 6, which corresponds to 63seconds till the last retransmission |
| 507 | with the current initial RTO of 1second. With this the final timeout | 507 | with the current initial RTO of 1second. With this the final timeout |
| 508 | for an active TCP connection attempt will happen after 127seconds. | 508 | for an active TCP connection attempt will happen after 127seconds. |
| 509 | 509 | ||
| @@ -1331,6 +1331,12 @@ force_tllao - BOOLEAN | |||
| 1331 | race condition where the sender deletes the cached link-layer address | 1331 | race condition where the sender deletes the cached link-layer address |
| 1332 | prior to receiving a response to a previous solicitation." | 1332 | prior to receiving a response to a previous solicitation." |
| 1333 | 1333 | ||
| 1334 | ndisc_notify - BOOLEAN | ||
| 1335 | Define mode for notification of address and device changes. | ||
| 1336 | 0 - (default): do nothing | ||
| 1337 | 1 - Generate unsolicited neighbour advertisements when device is brought | ||
| 1338 | up or hardware address changes. | ||
| 1339 | |||
| 1334 | icmp/*: | 1340 | icmp/*: |
| 1335 | ratelimit - INTEGER | 1341 | ratelimit - INTEGER |
| 1336 | Limit the maximal rates for sending ICMPv6 packets. | 1342 | Limit the maximal rates for sending ICMPv6 packets. |
| @@ -1530,7 +1536,7 @@ cookie_hmac_alg - STRING | |||
| 1530 | * sha1 | 1536 | * sha1 |
| 1531 | * none | 1537 | * none |
| 1532 | Ability to assign md5 or sha1 as the selected alg is predicated on the | 1538 | Ability to assign md5 or sha1 as the selected alg is predicated on the |
| 1533 | configuarion of those algorithms at build time (CONFIG_CRYPTO_MD5 and | 1539 | configuration of those algorithms at build time (CONFIG_CRYPTO_MD5 and |
| 1534 | CONFIG_CRYPTO_SHA1). | 1540 | CONFIG_CRYPTO_SHA1). |
| 1535 | 1541 | ||
| 1536 | Default: Dependent on configuration. MD5 if available, else SHA1 if | 1542 | Default: Dependent on configuration. MD5 if available, else SHA1 if |
| @@ -1548,7 +1554,7 @@ rcvbuf_policy - INTEGER | |||
| 1548 | blocking. | 1554 | blocking. |
| 1549 | 1555 | ||
| 1550 | 1: rcvbuf space is per association | 1556 | 1: rcvbuf space is per association |
| 1551 | 0: recbuf space is per socket | 1557 | 0: rcvbuf space is per socket |
| 1552 | 1558 | ||
| 1553 | Default: 0 | 1559 | Default: 0 |
| 1554 | 1560 | ||
diff --git a/Documentation/power/runtime_pm.txt b/Documentation/power/runtime_pm.txt index 4abe83e1045a..03591a750f99 100644 --- a/Documentation/power/runtime_pm.txt +++ b/Documentation/power/runtime_pm.txt | |||
| @@ -642,12 +642,13 @@ out the following operations: | |||
| 642 | * During system suspend it calls pm_runtime_get_noresume() and | 642 | * During system suspend it calls pm_runtime_get_noresume() and |
| 643 | pm_runtime_barrier() for every device right before executing the | 643 | pm_runtime_barrier() for every device right before executing the |
| 644 | subsystem-level .suspend() callback for it. In addition to that it calls | 644 | subsystem-level .suspend() callback for it. In addition to that it calls |
| 645 | pm_runtime_disable() for every device right after executing the | 645 | __pm_runtime_disable() with 'false' as the second argument for every device |
| 646 | subsystem-level .suspend() callback for it. | 646 | right before executing the subsystem-level .suspend_late() callback for it. |
| 647 | 647 | ||
| 648 | * During system resume it calls pm_runtime_enable() and pm_runtime_put_sync() | 648 | * During system resume it calls pm_runtime_enable() and pm_runtime_put_sync() |
| 649 | for every device right before and right after executing the subsystem-level | 649 | for every device right after executing the subsystem-level .resume_early() |
| 650 | .resume() callback for it, respectively. | 650 | callback and right after executing the subsystem-level .resume() callback |
| 651 | for it, respectively. | ||
| 651 | 652 | ||
| 652 | 7. Generic subsystem callbacks | 653 | 7. Generic subsystem callbacks |
| 653 | 654 | ||
| @@ -1,7 +1,7 @@ | |||
| 1 | VERSION = 3 | 1 | VERSION = 3 |
| 2 | PATCHLEVEL = 8 | 2 | PATCHLEVEL = 8 |
| 3 | SUBLEVEL = 0 | 3 | SUBLEVEL = 0 |
| 4 | EXTRAVERSION = -rc2 | 4 | EXTRAVERSION = -rc3 |
| 5 | NAME = Terrified Chipmunk | 5 | NAME = Terrified Chipmunk |
| 6 | 6 | ||
| 7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index f95ba14ae3d0..67874b82a4ed 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
| @@ -371,7 +371,6 @@ config ARCH_CNS3XXX | |||
| 371 | config ARCH_CLPS711X | 371 | config ARCH_CLPS711X |
| 372 | bool "Cirrus Logic CLPS711x/EP721x/EP731x-based" | 372 | bool "Cirrus Logic CLPS711x/EP721x/EP731x-based" |
| 373 | select ARCH_REQUIRE_GPIOLIB | 373 | select ARCH_REQUIRE_GPIOLIB |
| 374 | select ARCH_USES_GETTIMEOFFSET | ||
| 375 | select AUTO_ZRELADDR | 374 | select AUTO_ZRELADDR |
| 376 | select CLKDEV_LOOKUP | 375 | select CLKDEV_LOOKUP |
| 377 | select COMMON_CLK | 376 | select COMMON_CLK |
| @@ -1230,6 +1229,7 @@ config ARM_ERRATA_430973 | |||
| 1230 | config ARM_ERRATA_458693 | 1229 | config ARM_ERRATA_458693 |
| 1231 | bool "ARM errata: Processor deadlock when a false hazard is created" | 1230 | bool "ARM errata: Processor deadlock when a false hazard is created" |
| 1232 | depends on CPU_V7 | 1231 | depends on CPU_V7 |
| 1232 | depends on !ARCH_MULTIPLATFORM | ||
| 1233 | help | 1233 | help |
| 1234 | This option enables the workaround for the 458693 Cortex-A8 (r2p0) | 1234 | This option enables the workaround for the 458693 Cortex-A8 (r2p0) |
| 1235 | erratum. For very specific sequences of memory operations, it is | 1235 | erratum. For very specific sequences of memory operations, it is |
| @@ -1243,6 +1243,7 @@ config ARM_ERRATA_458693 | |||
| 1243 | config ARM_ERRATA_460075 | 1243 | config ARM_ERRATA_460075 |
| 1244 | bool "ARM errata: Data written to the L2 cache can be overwritten with stale data" | 1244 | bool "ARM errata: Data written to the L2 cache can be overwritten with stale data" |
| 1245 | depends on CPU_V7 | 1245 | depends on CPU_V7 |
| 1246 | depends on !ARCH_MULTIPLATFORM | ||
| 1246 | help | 1247 | help |
| 1247 | This option enables the workaround for the 460075 Cortex-A8 (r2p0) | 1248 | This option enables the workaround for the 460075 Cortex-A8 (r2p0) |
| 1248 | erratum. Any asynchronous access to the L2 cache may encounter a | 1249 | erratum. Any asynchronous access to the L2 cache may encounter a |
| @@ -1255,6 +1256,7 @@ config ARM_ERRATA_460075 | |||
| 1255 | config ARM_ERRATA_742230 | 1256 | config ARM_ERRATA_742230 |
| 1256 | bool "ARM errata: DMB operation may be faulty" | 1257 | bool "ARM errata: DMB operation may be faulty" |
| 1257 | depends on CPU_V7 && SMP | 1258 | depends on CPU_V7 && SMP |
| 1259 | depends on !ARCH_MULTIPLATFORM | ||
| 1258 | help | 1260 | help |
| 1259 | This option enables the workaround for the 742230 Cortex-A9 | 1261 | This option enables the workaround for the 742230 Cortex-A9 |
| 1260 | (r1p0..r2p2) erratum. Under rare circumstances, a DMB instruction | 1262 | (r1p0..r2p2) erratum. Under rare circumstances, a DMB instruction |
| @@ -1267,6 +1269,7 @@ config ARM_ERRATA_742230 | |||
| 1267 | config ARM_ERRATA_742231 | 1269 | config ARM_ERRATA_742231 |
| 1268 | bool "ARM errata: Incorrect hazard handling in the SCU may lead to data corruption" | 1270 | bool "ARM errata: Incorrect hazard handling in the SCU may lead to data corruption" |
| 1269 | depends on CPU_V7 && SMP | 1271 | depends on CPU_V7 && SMP |
| 1272 | depends on !ARCH_MULTIPLATFORM | ||
| 1270 | help | 1273 | help |
| 1271 | This option enables the workaround for the 742231 Cortex-A9 | 1274 | This option enables the workaround for the 742231 Cortex-A9 |
| 1272 | (r2p0..r2p2) erratum. Under certain conditions, specific to the | 1275 | (r2p0..r2p2) erratum. Under certain conditions, specific to the |
| @@ -1317,6 +1320,7 @@ config PL310_ERRATA_727915 | |||
| 1317 | config ARM_ERRATA_743622 | 1320 | config ARM_ERRATA_743622 |
| 1318 | bool "ARM errata: Faulty hazard checking in the Store Buffer may lead to data corruption" | 1321 | bool "ARM errata: Faulty hazard checking in the Store Buffer may lead to data corruption" |
| 1319 | depends on CPU_V7 | 1322 | depends on CPU_V7 |
| 1323 | depends on !ARCH_MULTIPLATFORM | ||
| 1320 | help | 1324 | help |
| 1321 | This option enables the workaround for the 743622 Cortex-A9 | 1325 | This option enables the workaround for the 743622 Cortex-A9 |
| 1322 | (r2p*) erratum. Under very rare conditions, a faulty | 1326 | (r2p*) erratum. Under very rare conditions, a faulty |
| @@ -1330,6 +1334,7 @@ config ARM_ERRATA_743622 | |||
| 1330 | config ARM_ERRATA_751472 | 1334 | config ARM_ERRATA_751472 |
| 1331 | bool "ARM errata: Interrupted ICIALLUIS may prevent completion of broadcasted operation" | 1335 | bool "ARM errata: Interrupted ICIALLUIS may prevent completion of broadcasted operation" |
| 1332 | depends on CPU_V7 | 1336 | depends on CPU_V7 |
| 1337 | depends on !ARCH_MULTIPLATFORM | ||
| 1333 | help | 1338 | help |
| 1334 | This option enables the workaround for the 751472 Cortex-A9 (prior | 1339 | This option enables the workaround for the 751472 Cortex-A9 (prior |
| 1335 | to r3p0) erratum. An interrupted ICIALLUIS operation may prevent the | 1340 | to r3p0) erratum. An interrupted ICIALLUIS operation may prevent the |
diff --git a/arch/arm/boot/dts/armada-370-xp.dtsi b/arch/arm/boot/dts/armada-370-xp.dtsi index cf6c48a09eac..4c0abe85405f 100644 --- a/arch/arm/boot/dts/armada-370-xp.dtsi +++ b/arch/arm/boot/dts/armada-370-xp.dtsi | |||
| @@ -50,17 +50,19 @@ | |||
| 50 | ranges; | 50 | ranges; |
| 51 | 51 | ||
| 52 | serial@d0012000 { | 52 | serial@d0012000 { |
| 53 | compatible = "ns16550"; | 53 | compatible = "snps,dw-apb-uart"; |
| 54 | reg = <0xd0012000 0x100>; | 54 | reg = <0xd0012000 0x100>; |
| 55 | reg-shift = <2>; | 55 | reg-shift = <2>; |
| 56 | interrupts = <41>; | 56 | interrupts = <41>; |
| 57 | reg-io-width = <4>; | ||
| 57 | status = "disabled"; | 58 | status = "disabled"; |
| 58 | }; | 59 | }; |
| 59 | serial@d0012100 { | 60 | serial@d0012100 { |
| 60 | compatible = "ns16550"; | 61 | compatible = "snps,dw-apb-uart"; |
| 61 | reg = <0xd0012100 0x100>; | 62 | reg = <0xd0012100 0x100>; |
| 62 | reg-shift = <2>; | 63 | reg-shift = <2>; |
| 63 | interrupts = <42>; | 64 | interrupts = <42>; |
| 65 | reg-io-width = <4>; | ||
| 64 | status = "disabled"; | 66 | status = "disabled"; |
| 65 | }; | 67 | }; |
| 66 | 68 | ||
diff --git a/arch/arm/boot/dts/armada-xp-mv78230.dtsi b/arch/arm/boot/dts/armada-xp-mv78230.dtsi index c45c7b4dc352..271855a6e224 100644 --- a/arch/arm/boot/dts/armada-xp-mv78230.dtsi +++ b/arch/arm/boot/dts/armada-xp-mv78230.dtsi | |||
| @@ -34,7 +34,14 @@ | |||
| 34 | reg = <0>; | 34 | reg = <0>; |
| 35 | clocks = <&cpuclk 0>; | 35 | clocks = <&cpuclk 0>; |
| 36 | }; | 36 | }; |
| 37 | } | 37 | |
| 38 | cpu@1 { | ||
| 39 | device_type = "cpu"; | ||
| 40 | compatible = "marvell,sheeva-v7"; | ||
| 41 | reg = <1>; | ||
| 42 | clocks = <&cpuclk 1>; | ||
| 43 | }; | ||
| 44 | }; | ||
| 38 | 45 | ||
| 39 | soc { | 46 | soc { |
| 40 | pinctrl { | 47 | pinctrl { |
diff --git a/arch/arm/boot/dts/armada-xp-mv78260.dtsi b/arch/arm/boot/dts/armada-xp-mv78260.dtsi index a2aee5707377..1c1937dbce73 100644 --- a/arch/arm/boot/dts/armada-xp-mv78260.dtsi +++ b/arch/arm/boot/dts/armada-xp-mv78260.dtsi | |||
| @@ -85,5 +85,13 @@ | |||
| 85 | #interrupts-cells = <2>; | 85 | #interrupts-cells = <2>; |
| 86 | interrupts = <24>; | 86 | interrupts = <24>; |
| 87 | }; | 87 | }; |
| 88 | |||
| 89 | ethernet@d0034000 { | ||
| 90 | compatible = "marvell,armada-370-neta"; | ||
| 91 | reg = <0xd0034000 0x2500>; | ||
| 92 | interrupts = <14>; | ||
| 93 | clocks = <&gateclk 1>; | ||
| 94 | status = "disabled"; | ||
| 95 | }; | ||
| 88 | }; | 96 | }; |
| 89 | }; | 97 | }; |
diff --git a/arch/arm/boot/dts/armada-xp-mv78460.dtsi b/arch/arm/boot/dts/armada-xp-mv78460.dtsi index da03a129243a..4905cf3a5ef8 100644 --- a/arch/arm/boot/dts/armada-xp-mv78460.dtsi +++ b/arch/arm/boot/dts/armada-xp-mv78460.dtsi | |||
| @@ -100,5 +100,13 @@ | |||
| 100 | #interrupts-cells = <2>; | 100 | #interrupts-cells = <2>; |
| 101 | interrupts = <24>; | 101 | interrupts = <24>; |
| 102 | }; | 102 | }; |
| 103 | |||
| 104 | ethernet@d0034000 { | ||
| 105 | compatible = "marvell,armada-370-neta"; | ||
| 106 | reg = <0xd0034000 0x2500>; | ||
| 107 | interrupts = <14>; | ||
| 108 | clocks = <&gateclk 1>; | ||
| 109 | status = "disabled"; | ||
| 110 | }; | ||
| 103 | }; | 111 | }; |
| 104 | }; | 112 | }; |
diff --git a/arch/arm/boot/dts/armada-xp.dtsi b/arch/arm/boot/dts/armada-xp.dtsi index 367aa3f94912..2e37ef101c90 100644 --- a/arch/arm/boot/dts/armada-xp.dtsi +++ b/arch/arm/boot/dts/armada-xp.dtsi | |||
| @@ -42,17 +42,19 @@ | |||
| 42 | 42 | ||
| 43 | soc { | 43 | soc { |
| 44 | serial@d0012200 { | 44 | serial@d0012200 { |
| 45 | compatible = "ns16550"; | 45 | compatible = "snps,dw-apb-uart"; |
| 46 | reg = <0xd0012200 0x100>; | 46 | reg = <0xd0012200 0x100>; |
| 47 | reg-shift = <2>; | 47 | reg-shift = <2>; |
| 48 | interrupts = <43>; | 48 | interrupts = <43>; |
| 49 | reg-io-width = <4>; | ||
| 49 | status = "disabled"; | 50 | status = "disabled"; |
| 50 | }; | 51 | }; |
| 51 | serial@d0012300 { | 52 | serial@d0012300 { |
| 52 | compatible = "ns16550"; | 53 | compatible = "snps,dw-apb-uart"; |
| 53 | reg = <0xd0012300 0x100>; | 54 | reg = <0xd0012300 0x100>; |
| 54 | reg-shift = <2>; | 55 | reg-shift = <2>; |
| 55 | interrupts = <44>; | 56 | interrupts = <44>; |
| 57 | reg-io-width = <4>; | ||
| 56 | status = "disabled"; | 58 | status = "disabled"; |
| 57 | }; | 59 | }; |
| 58 | 60 | ||
| @@ -93,14 +95,6 @@ | |||
| 93 | status = "disabled"; | 95 | status = "disabled"; |
| 94 | }; | 96 | }; |
| 95 | 97 | ||
| 96 | ethernet@d0034000 { | ||
| 97 | compatible = "marvell,armada-370-neta"; | ||
| 98 | reg = <0xd0034000 0x2500>; | ||
| 99 | interrupts = <14>; | ||
| 100 | clocks = <&gateclk 1>; | ||
| 101 | status = "disabled"; | ||
| 102 | }; | ||
| 103 | |||
| 104 | xor@d0060900 { | 98 | xor@d0060900 { |
| 105 | compatible = "marvell,orion-xor"; | 99 | compatible = "marvell,orion-xor"; |
| 106 | reg = <0xd0060900 0x100 | 100 | reg = <0xd0060900 0x100 |
diff --git a/arch/arm/boot/dts/dove.dtsi b/arch/arm/boot/dts/dove.dtsi index f3f7e9d8adca..42eac1ff3cc8 100644 --- a/arch/arm/boot/dts/dove.dtsi +++ b/arch/arm/boot/dts/dove.dtsi | |||
| @@ -117,6 +117,7 @@ | |||
| 117 | pinctrl: pinctrl@d0200 { | 117 | pinctrl: pinctrl@d0200 { |
| 118 | compatible = "marvell,dove-pinctrl"; | 118 | compatible = "marvell,dove-pinctrl"; |
| 119 | reg = <0xd0200 0x10>; | 119 | reg = <0xd0200 0x10>; |
| 120 | clocks = <&gate_clk 22>; | ||
| 120 | }; | 121 | }; |
| 121 | 122 | ||
| 122 | spi0: spi@10600 { | 123 | spi0: spi@10600 { |
diff --git a/arch/arm/boot/dts/ecx-2000.dts b/arch/arm/boot/dts/ecx-2000.dts index 46477ac1de99..139b40cc3a23 100644 --- a/arch/arm/boot/dts/ecx-2000.dts +++ b/arch/arm/boot/dts/ecx-2000.dts | |||
| @@ -32,6 +32,7 @@ | |||
| 32 | 32 | ||
| 33 | cpu@0 { | 33 | cpu@0 { |
| 34 | compatible = "arm,cortex-a15"; | 34 | compatible = "arm,cortex-a15"; |
| 35 | device_type = "cpu"; | ||
| 35 | reg = <0>; | 36 | reg = <0>; |
| 36 | clocks = <&a9pll>; | 37 | clocks = <&a9pll>; |
| 37 | clock-names = "cpu"; | 38 | clock-names = "cpu"; |
| @@ -39,6 +40,7 @@ | |||
| 39 | 40 | ||
| 40 | cpu@1 { | 41 | cpu@1 { |
| 41 | compatible = "arm,cortex-a15"; | 42 | compatible = "arm,cortex-a15"; |
| 43 | device_type = "cpu"; | ||
| 42 | reg = <1>; | 44 | reg = <1>; |
| 43 | clocks = <&a9pll>; | 45 | clocks = <&a9pll>; |
| 44 | clock-names = "cpu"; | 46 | clock-names = "cpu"; |
| @@ -46,6 +48,7 @@ | |||
| 46 | 48 | ||
| 47 | cpu@2 { | 49 | cpu@2 { |
| 48 | compatible = "arm,cortex-a15"; | 50 | compatible = "arm,cortex-a15"; |
| 51 | device_type = "cpu"; | ||
| 49 | reg = <2>; | 52 | reg = <2>; |
| 50 | clocks = <&a9pll>; | 53 | clocks = <&a9pll>; |
| 51 | clock-names = "cpu"; | 54 | clock-names = "cpu"; |
| @@ -53,6 +56,7 @@ | |||
| 53 | 56 | ||
| 54 | cpu@3 { | 57 | cpu@3 { |
| 55 | compatible = "arm,cortex-a15"; | 58 | compatible = "arm,cortex-a15"; |
| 59 | device_type = "cpu"; | ||
| 56 | reg = <3>; | 60 | reg = <3>; |
| 57 | clocks = <&a9pll>; | 61 | clocks = <&a9pll>; |
| 58 | clock-names = "cpu"; | 62 | clock-names = "cpu"; |
diff --git a/arch/arm/boot/dts/exynos4210-smdkv310.dts b/arch/arm/boot/dts/exynos4210-smdkv310.dts index 9b23a8255e39..f63490707f3a 100644 --- a/arch/arm/boot/dts/exynos4210-smdkv310.dts +++ b/arch/arm/boot/dts/exynos4210-smdkv310.dts | |||
| @@ -26,7 +26,7 @@ | |||
| 26 | }; | 26 | }; |
| 27 | 27 | ||
| 28 | chosen { | 28 | chosen { |
| 29 | bootargs = "root=/dev/ram0 rw ramdisk=8192 initrd=0x41000000,8M console=ttySAC2,115200 init=/linuxrc"; | 29 | bootargs = "root=/dev/ram0 rw ramdisk=8192 initrd=0x41000000,8M console=ttySAC1,115200 init=/linuxrc"; |
| 30 | }; | 30 | }; |
| 31 | 31 | ||
| 32 | sdhci@12530000 { | 32 | sdhci@12530000 { |
diff --git a/arch/arm/boot/dts/exynos5250.dtsi b/arch/arm/boot/dts/exynos5250.dtsi index 2e3b6efaf1a2..3acf594ea60b 100644 --- a/arch/arm/boot/dts/exynos5250.dtsi +++ b/arch/arm/boot/dts/exynos5250.dtsi | |||
| @@ -574,7 +574,7 @@ | |||
| 574 | 574 | ||
| 575 | hdmi { | 575 | hdmi { |
| 576 | compatible = "samsung,exynos5-hdmi"; | 576 | compatible = "samsung,exynos5-hdmi"; |
| 577 | reg = <0x14530000 0x100000>; | 577 | reg = <0x14530000 0x70000>; |
| 578 | interrupts = <0 95 0>; | 578 | interrupts = <0 95 0>; |
| 579 | }; | 579 | }; |
| 580 | 580 | ||
diff --git a/arch/arm/boot/dts/exynos5440-ssdk5440.dts b/arch/arm/boot/dts/exynos5440-ssdk5440.dts index 921c83cf694f..81e2c964a900 100644 --- a/arch/arm/boot/dts/exynos5440-ssdk5440.dts +++ b/arch/arm/boot/dts/exynos5440-ssdk5440.dts | |||
| @@ -21,7 +21,7 @@ | |||
| 21 | }; | 21 | }; |
| 22 | 22 | ||
| 23 | chosen { | 23 | chosen { |
| 24 | bootargs = "root=/dev/ram0 rw ramdisk=8192 initrd=0x81000000,8M console=ttySAC2,115200 init=/linuxrc"; | 24 | bootargs = "root=/dev/ram0 rw ramdisk=8192 initrd=0x81000000,8M console=ttySAC0,115200 init=/linuxrc"; |
| 25 | }; | 25 | }; |
| 26 | 26 | ||
| 27 | spi { | 27 | spi { |
diff --git a/arch/arm/boot/dts/highbank.dts b/arch/arm/boot/dts/highbank.dts index a9ae5d32e80d..5927a8df5625 100644 --- a/arch/arm/boot/dts/highbank.dts +++ b/arch/arm/boot/dts/highbank.dts | |||
| @@ -30,33 +30,37 @@ | |||
| 30 | #address-cells = <1>; | 30 | #address-cells = <1>; |
| 31 | #size-cells = <0>; | 31 | #size-cells = <0>; |
| 32 | 32 | ||
| 33 | cpu@0 { | 33 | cpu@900 { |
| 34 | compatible = "arm,cortex-a9"; | 34 | compatible = "arm,cortex-a9"; |
| 35 | reg = <0>; | 35 | device_type = "cpu"; |
| 36 | reg = <0x900>; | ||
| 36 | next-level-cache = <&L2>; | 37 | next-level-cache = <&L2>; |
| 37 | clocks = <&a9pll>; | 38 | clocks = <&a9pll>; |
| 38 | clock-names = "cpu"; | 39 | clock-names = "cpu"; |
| 39 | }; | 40 | }; |
| 40 | 41 | ||
| 41 | cpu@1 { | 42 | cpu@901 { |
| 42 | compatible = "arm,cortex-a9"; | 43 | compatible = "arm,cortex-a9"; |
| 43 | reg = <1>; | 44 | device_type = "cpu"; |
| 45 | reg = <0x901>; | ||
| 44 | next-level-cache = <&L2>; | 46 | next-level-cache = <&L2>; |
| 45 | clocks = <&a9pll>; | 47 | clocks = <&a9pll>; |
| 46 | clock-names = "cpu"; | 48 | clock-names = "cpu"; |
| 47 | }; | 49 | }; |
| 48 | 50 | ||
| 49 | cpu@2 { | 51 | cpu@902 { |
| 50 | compatible = "arm,cortex-a9"; | 52 | compatible = "arm,cortex-a9"; |
| 51 | reg = <2>; | 53 | device_type = "cpu"; |
| 54 | reg = <0x902>; | ||
| 52 | next-level-cache = <&L2>; | 55 | next-level-cache = <&L2>; |
| 53 | clocks = <&a9pll>; | 56 | clocks = <&a9pll>; |
| 54 | clock-names = "cpu"; | 57 | clock-names = "cpu"; |
| 55 | }; | 58 | }; |
| 56 | 59 | ||
| 57 | cpu@3 { | 60 | cpu@903 { |
| 58 | compatible = "arm,cortex-a9"; | 61 | compatible = "arm,cortex-a9"; |
| 59 | reg = <3>; | 62 | device_type = "cpu"; |
| 63 | reg = <0x903>; | ||
| 60 | next-level-cache = <&L2>; | 64 | next-level-cache = <&L2>; |
| 61 | clocks = <&a9pll>; | 65 | clocks = <&a9pll>; |
| 62 | clock-names = "cpu"; | 66 | clock-names = "cpu"; |
diff --git a/arch/arm/boot/dts/imx23-olinuxino.dts b/arch/arm/boot/dts/imx23-olinuxino.dts index 7c43b8e70b9f..e7484e4ea659 100644 --- a/arch/arm/boot/dts/imx23-olinuxino.dts +++ b/arch/arm/boot/dts/imx23-olinuxino.dts | |||
| @@ -39,17 +39,17 @@ | |||
| 39 | hog_pins_a: hog@0 { | 39 | hog_pins_a: hog@0 { |
| 40 | reg = <0>; | 40 | reg = <0>; |
| 41 | fsl,pinmux-ids = < | 41 | fsl,pinmux-ids = < |
| 42 | 0x2013 /* MX23_PAD_SSP1_DETECT__GPIO_2_1 */ | 42 | 0x0113 /* MX23_PAD_GPMI_ALE__GPIO_0_17 */ |
| 43 | >; | 43 | >; |
| 44 | fsl,drive-strength = <0>; | 44 | fsl,drive-strength = <0>; |
| 45 | fsl,voltage = <1>; | 45 | fsl,voltage = <1>; |
| 46 | fsl,pull-up = <0>; | 46 | fsl,pull-up = <0>; |
| 47 | }; | 47 | }; |
| 48 | 48 | ||
| 49 | led_pin_gpio0_17: led_gpio0_17@0 { | 49 | led_pin_gpio2_1: led_gpio2_1@0 { |
| 50 | reg = <0>; | 50 | reg = <0>; |
| 51 | fsl,pinmux-ids = < | 51 | fsl,pinmux-ids = < |
| 52 | 0x0113 /* MX23_PAD_GPMI_ALE__GPIO_0_17 */ | 52 | 0x2013 /* MX23_PAD_SSP1_DETECT__GPIO_2_1 */ |
| 53 | >; | 53 | >; |
| 54 | fsl,drive-strength = <0>; | 54 | fsl,drive-strength = <0>; |
| 55 | fsl,voltage = <1>; | 55 | fsl,voltage = <1>; |
| @@ -110,7 +110,7 @@ | |||
| 110 | leds { | 110 | leds { |
| 111 | compatible = "gpio-leds"; | 111 | compatible = "gpio-leds"; |
| 112 | pinctrl-names = "default"; | 112 | pinctrl-names = "default"; |
| 113 | pinctrl-0 = <&led_pin_gpio0_17>; | 113 | pinctrl-0 = <&led_pin_gpio2_1>; |
| 114 | 114 | ||
| 115 | user { | 115 | user { |
| 116 | label = "green"; | 116 | label = "green"; |
diff --git a/arch/arm/boot/dts/imx31-bug.dts b/arch/arm/boot/dts/imx31-bug.dts index 24731cb78e8e..7f67402328d3 100644 --- a/arch/arm/boot/dts/imx31-bug.dts +++ b/arch/arm/boot/dts/imx31-bug.dts | |||
| @@ -14,7 +14,7 @@ | |||
| 14 | 14 | ||
| 15 | / { | 15 | / { |
| 16 | model = "Buglabs i.MX31 Bug 1.x"; | 16 | model = "Buglabs i.MX31 Bug 1.x"; |
| 17 | compatible = "fsl,imx31-bug", "fsl,imx31"; | 17 | compatible = "buglabs,imx31-bug", "fsl,imx31"; |
| 18 | 18 | ||
| 19 | memory { | 19 | memory { |
| 20 | reg = <0x80000000 0x8000000>; /* 128M */ | 20 | reg = <0x80000000 0x8000000>; /* 128M */ |
diff --git a/arch/arm/boot/dts/imx53.dtsi b/arch/arm/boot/dts/imx53.dtsi index 552aed4ff982..edc3f1eb6699 100644 --- a/arch/arm/boot/dts/imx53.dtsi +++ b/arch/arm/boot/dts/imx53.dtsi | |||
| @@ -492,7 +492,7 @@ | |||
| 492 | compatible = "fsl,imx53-flexcan", "fsl,p1010-flexcan"; | 492 | compatible = "fsl,imx53-flexcan", "fsl,p1010-flexcan"; |
| 493 | reg = <0x53fcc000 0x4000>; | 493 | reg = <0x53fcc000 0x4000>; |
| 494 | interrupts = <83>; | 494 | interrupts = <83>; |
| 495 | clocks = <&clks 158>, <&clks 157>; | 495 | clocks = <&clks 87>, <&clks 86>; |
| 496 | clock-names = "ipg", "per"; | 496 | clock-names = "ipg", "per"; |
| 497 | status = "disabled"; | 497 | status = "disabled"; |
| 498 | }; | 498 | }; |
diff --git a/arch/arm/boot/dts/kirkwood-6282.dtsi b/arch/arm/boot/dts/kirkwood-6282.dtsi index 9ae2004d5675..4ccea2130a6c 100644 --- a/arch/arm/boot/dts/kirkwood-6282.dtsi +++ b/arch/arm/boot/dts/kirkwood-6282.dtsi | |||
| @@ -39,6 +39,7 @@ | |||
| 39 | #size-cells = <0>; | 39 | #size-cells = <0>; |
| 40 | interrupts = <32>; | 40 | interrupts = <32>; |
| 41 | clock-frequency = <100000>; | 41 | clock-frequency = <100000>; |
| 42 | clocks = <&gate_clk 7>; | ||
| 42 | status = "disabled"; | 43 | status = "disabled"; |
| 43 | }; | 44 | }; |
| 44 | }; | 45 | }; |
diff --git a/arch/arm/boot/dts/kirkwood-topkick.dts b/arch/arm/boot/dts/kirkwood-topkick.dts index c0de5a7f660d..cd15452a52a6 100644 --- a/arch/arm/boot/dts/kirkwood-topkick.dts +++ b/arch/arm/boot/dts/kirkwood-topkick.dts | |||
| @@ -82,4 +82,21 @@ | |||
| 82 | gpios = <&gpio1 16 1>; | 82 | gpios = <&gpio1 16 1>; |
| 83 | }; | 83 | }; |
| 84 | }; | 84 | }; |
| 85 | regulators { | ||
| 86 | compatible = "simple-bus"; | ||
| 87 | #address-cells = <1>; | ||
| 88 | #size-cells = <0>; | ||
| 89 | |||
| 90 | sata0_power: regulator@1 { | ||
| 91 | compatible = "regulator-fixed"; | ||
| 92 | reg = <1>; | ||
| 93 | regulator-name = "SATA0 Power"; | ||
| 94 | regulator-min-microvolt = <5000000>; | ||
| 95 | regulator-max-microvolt = <5000000>; | ||
| 96 | enable-active-high; | ||
| 97 | regulator-always-on; | ||
| 98 | regulator-boot-on; | ||
| 99 | gpio = <&gpio1 4 0>; | ||
| 100 | }; | ||
| 101 | }; | ||
| 85 | }; | 102 | }; |
diff --git a/arch/arm/boot/dts/kirkwood.dtsi b/arch/arm/boot/dts/kirkwood.dtsi index 7735cee4a9c6..110d6cbb795b 100644 --- a/arch/arm/boot/dts/kirkwood.dtsi +++ b/arch/arm/boot/dts/kirkwood.dtsi | |||
| @@ -144,6 +144,7 @@ | |||
| 144 | compatible = "marvell,orion-ehci"; | 144 | compatible = "marvell,orion-ehci"; |
| 145 | reg = <0x50000 0x1000>; | 145 | reg = <0x50000 0x1000>; |
| 146 | interrupts = <19>; | 146 | interrupts = <19>; |
| 147 | clocks = <&gate_clk 3>; | ||
| 147 | status = "okay"; | 148 | status = "okay"; |
| 148 | }; | 149 | }; |
| 149 | 150 | ||
diff --git a/arch/arm/common/vic.c b/arch/arm/common/vic.c index e4df17ca90c7..8f324b99416e 100644 --- a/arch/arm/common/vic.c +++ b/arch/arm/common/vic.c | |||
| @@ -206,6 +206,7 @@ static void __init vic_register(void __iomem *base, unsigned int irq, | |||
| 206 | struct device_node *node) | 206 | struct device_node *node) |
| 207 | { | 207 | { |
| 208 | struct vic_device *v; | 208 | struct vic_device *v; |
| 209 | int i; | ||
| 209 | 210 | ||
| 210 | if (vic_id >= ARRAY_SIZE(vic_devices)) { | 211 | if (vic_id >= ARRAY_SIZE(vic_devices)) { |
| 211 | printk(KERN_ERR "%s: too few VICs, increase CONFIG_ARM_VIC_NR\n", __func__); | 212 | printk(KERN_ERR "%s: too few VICs, increase CONFIG_ARM_VIC_NR\n", __func__); |
| @@ -220,6 +221,10 @@ static void __init vic_register(void __iomem *base, unsigned int irq, | |||
| 220 | vic_id++; | 221 | vic_id++; |
| 221 | v->domain = irq_domain_add_simple(node, fls(valid_sources), irq, | 222 | v->domain = irq_domain_add_simple(node, fls(valid_sources), irq, |
| 222 | &vic_irqdomain_ops, v); | 223 | &vic_irqdomain_ops, v); |
| 224 | /* create an IRQ mapping for each valid IRQ */ | ||
| 225 | for (i = 0; i < fls(valid_sources); i++) | ||
| 226 | if (valid_sources & (1 << i)) | ||
| 227 | irq_create_mapping(v->domain, i); | ||
| 223 | } | 228 | } |
| 224 | 229 | ||
| 225 | static void vic_ack_irq(struct irq_data *d) | 230 | static void vic_ack_irq(struct irq_data *d) |
| @@ -416,9 +421,9 @@ int __init vic_of_init(struct device_node *node, struct device_node *parent) | |||
| 416 | return -EIO; | 421 | return -EIO; |
| 417 | 422 | ||
| 418 | /* | 423 | /* |
| 419 | * Passing -1 as first IRQ makes the simple domain allocate descriptors | 424 | * Passing 0 as first IRQ makes the simple domain allocate descriptors |
| 420 | */ | 425 | */ |
| 421 | __vic_init(regs, -1, ~0, ~0, node); | 426 | __vic_init(regs, 0, ~0, ~0, node); |
| 422 | 427 | ||
| 423 | return 0; | 428 | return 0; |
| 424 | } | 429 | } |
diff --git a/arch/arm/configs/mvebu_defconfig b/arch/arm/configs/mvebu_defconfig index a702fb345c01..b5bc96cb65a7 100644 --- a/arch/arm/configs/mvebu_defconfig +++ b/arch/arm/configs/mvebu_defconfig | |||
| @@ -33,9 +33,7 @@ CONFIG_MVNETA=y | |||
| 33 | CONFIG_MARVELL_PHY=y | 33 | CONFIG_MARVELL_PHY=y |
| 34 | CONFIG_SERIAL_8250=y | 34 | CONFIG_SERIAL_8250=y |
| 35 | CONFIG_SERIAL_8250_CONSOLE=y | 35 | CONFIG_SERIAL_8250_CONSOLE=y |
| 36 | CONFIG_SERIAL_OF_PLATFORM=y | 36 | CONFIG_SERIAL_8250_DW=y |
| 37 | CONFIG_I2C=y | ||
| 38 | CONFIG_I2C_MV64XXX=y | ||
| 39 | CONFIG_GPIOLIB=y | 37 | CONFIG_GPIOLIB=y |
| 40 | CONFIG_GPIO_SYSFS=y | 38 | CONFIG_GPIO_SYSFS=y |
| 41 | # CONFIG_USB_SUPPORT is not set | 39 | # CONFIG_USB_SUPPORT is not set |
diff --git a/arch/arm/mach-exynos/Kconfig b/arch/arm/mach-exynos/Kconfig index 91d5b6f1d5af..e103c290bc9e 100644 --- a/arch/arm/mach-exynos/Kconfig +++ b/arch/arm/mach-exynos/Kconfig | |||
| @@ -74,6 +74,8 @@ config SOC_EXYNOS5440 | |||
| 74 | depends on ARCH_EXYNOS5 | 74 | depends on ARCH_EXYNOS5 |
| 75 | select ARM_ARCH_TIMER | 75 | select ARM_ARCH_TIMER |
| 76 | select AUTO_ZRELADDR | 76 | select AUTO_ZRELADDR |
| 77 | select PINCTRL | ||
| 78 | select PINCTRL_EXYNOS5440 | ||
| 77 | help | 79 | help |
| 78 | Enable EXYNOS5440 SoC support | 80 | Enable EXYNOS5440 SoC support |
| 79 | 81 | ||
diff --git a/arch/arm/mach-exynos/common.c b/arch/arm/mach-exynos/common.c index d6d0dc651089..1a89824a5f78 100644 --- a/arch/arm/mach-exynos/common.c +++ b/arch/arm/mach-exynos/common.c | |||
| @@ -424,11 +424,18 @@ static void __init exynos5_init_clocks(int xtal) | |||
| 424 | { | 424 | { |
| 425 | printk(KERN_DEBUG "%s: initializing clocks\n", __func__); | 425 | printk(KERN_DEBUG "%s: initializing clocks\n", __func__); |
| 426 | 426 | ||
| 427 | /* EXYNOS5440 can support only common clock framework */ | ||
| 428 | |||
| 429 | if (soc_is_exynos5440()) | ||
| 430 | return; | ||
| 431 | |||
| 432 | #ifdef CONFIG_SOC_EXYNOS5250 | ||
| 427 | s3c24xx_register_baseclocks(xtal); | 433 | s3c24xx_register_baseclocks(xtal); |
| 428 | s5p_register_clocks(xtal); | 434 | s5p_register_clocks(xtal); |
| 429 | 435 | ||
| 430 | exynos5_register_clocks(); | 436 | exynos5_register_clocks(); |
| 431 | exynos5_setup_clocks(); | 437 | exynos5_setup_clocks(); |
| 438 | #endif | ||
| 432 | } | 439 | } |
| 433 | 440 | ||
| 434 | #define COMBINER_ENABLE_SET 0x0 | 441 | #define COMBINER_ENABLE_SET 0x0 |
diff --git a/arch/arm/mach-highbank/highbank.c b/arch/arm/mach-highbank/highbank.c index dc248167d206..981dc1e1da51 100644 --- a/arch/arm/mach-highbank/highbank.c +++ b/arch/arm/mach-highbank/highbank.c | |||
| @@ -135,7 +135,7 @@ static struct sys_timer highbank_timer = { | |||
| 135 | 135 | ||
| 136 | static void highbank_power_off(void) | 136 | static void highbank_power_off(void) |
| 137 | { | 137 | { |
| 138 | hignbank_set_pwr_shutdown(); | 138 | highbank_set_pwr_shutdown(); |
| 139 | 139 | ||
| 140 | while (1) | 140 | while (1) |
| 141 | cpu_do_idle(); | 141 | cpu_do_idle(); |
diff --git a/arch/arm/mach-highbank/hotplug.c b/arch/arm/mach-highbank/hotplug.c index 7b60faccd551..f30c52843396 100644 --- a/arch/arm/mach-highbank/hotplug.c +++ b/arch/arm/mach-highbank/hotplug.c | |||
| @@ -30,7 +30,7 @@ void __ref highbank_cpu_die(unsigned int cpu) | |||
| 30 | { | 30 | { |
| 31 | flush_cache_all(); | 31 | flush_cache_all(); |
| 32 | 32 | ||
| 33 | highbank_set_cpu_jump(cpu, secondary_startup); | 33 | highbank_set_cpu_jump(cpu, phys_to_virt(0)); |
| 34 | highbank_set_core_pwr(); | 34 | highbank_set_core_pwr(); |
| 35 | 35 | ||
| 36 | cpu_do_idle(); | 36 | cpu_do_idle(); |
diff --git a/arch/arm/mach-highbank/platsmp.c b/arch/arm/mach-highbank/platsmp.c index 1129957f6c1d..4ecc864ac8b9 100644 --- a/arch/arm/mach-highbank/platsmp.c +++ b/arch/arm/mach-highbank/platsmp.c | |||
| @@ -32,6 +32,7 @@ static void __cpuinit highbank_secondary_init(unsigned int cpu) | |||
| 32 | 32 | ||
| 33 | static int __cpuinit highbank_boot_secondary(unsigned int cpu, struct task_struct *idle) | 33 | static int __cpuinit highbank_boot_secondary(unsigned int cpu, struct task_struct *idle) |
| 34 | { | 34 | { |
| 35 | highbank_set_cpu_jump(cpu, secondary_startup); | ||
| 35 | gic_raise_softirq(cpumask_of(cpu), 0); | 36 | gic_raise_softirq(cpumask_of(cpu), 0); |
| 36 | return 0; | 37 | return 0; |
| 37 | } | 38 | } |
| @@ -61,19 +62,8 @@ static void __init highbank_smp_init_cpus(void) | |||
| 61 | 62 | ||
| 62 | static void __init highbank_smp_prepare_cpus(unsigned int max_cpus) | 63 | static void __init highbank_smp_prepare_cpus(unsigned int max_cpus) |
| 63 | { | 64 | { |
| 64 | int i; | ||
| 65 | |||
| 66 | if (scu_base_addr) | 65 | if (scu_base_addr) |
| 67 | scu_enable(scu_base_addr); | 66 | scu_enable(scu_base_addr); |
| 68 | |||
| 69 | /* | ||
| 70 | * Write the address of secondary startup into the jump table | ||
| 71 | * The cores are in wfi and wait until they receive a soft interrupt | ||
| 72 | * and a non-zero value to jump to. Then the secondary CPU branches | ||
| 73 | * to this address. | ||
| 74 | */ | ||
| 75 | for (i = 1; i < max_cpus; i++) | ||
| 76 | highbank_set_cpu_jump(i, secondary_startup); | ||
| 77 | } | 67 | } |
| 78 | 68 | ||
| 79 | struct smp_operations highbank_smp_ops __initdata = { | 69 | struct smp_operations highbank_smp_ops __initdata = { |
diff --git a/arch/arm/mach-highbank/pm.c b/arch/arm/mach-highbank/pm.c index 74aa135966f0..04eddb4f4380 100644 --- a/arch/arm/mach-highbank/pm.c +++ b/arch/arm/mach-highbank/pm.c | |||
| @@ -14,10 +14,12 @@ | |||
| 14 | * this program. If not, see <http://www.gnu.org/licenses/>. | 14 | * this program. If not, see <http://www.gnu.org/licenses/>. |
| 15 | */ | 15 | */ |
| 16 | 16 | ||
| 17 | #include <linux/cpu_pm.h> | ||
| 17 | #include <linux/init.h> | 18 | #include <linux/init.h> |
| 18 | #include <linux/io.h> | 19 | #include <linux/io.h> |
| 19 | #include <linux/suspend.h> | 20 | #include <linux/suspend.h> |
| 20 | 21 | ||
| 22 | #include <asm/cacheflush.h> | ||
| 21 | #include <asm/proc-fns.h> | 23 | #include <asm/proc-fns.h> |
| 22 | #include <asm/suspend.h> | 24 | #include <asm/suspend.h> |
| 23 | 25 | ||
| @@ -26,16 +28,31 @@ | |||
| 26 | 28 | ||
| 27 | static int highbank_suspend_finish(unsigned long val) | 29 | static int highbank_suspend_finish(unsigned long val) |
| 28 | { | 30 | { |
| 31 | outer_flush_all(); | ||
| 32 | outer_disable(); | ||
| 33 | |||
| 34 | highbank_set_pwr_suspend(); | ||
| 35 | |||
| 29 | cpu_do_idle(); | 36 | cpu_do_idle(); |
| 37 | |||
| 38 | highbank_clear_pwr_request(); | ||
| 30 | return 0; | 39 | return 0; |
| 31 | } | 40 | } |
| 32 | 41 | ||
| 33 | static int highbank_pm_enter(suspend_state_t state) | 42 | static int highbank_pm_enter(suspend_state_t state) |
| 34 | { | 43 | { |
| 35 | hignbank_set_pwr_suspend(); | 44 | cpu_pm_enter(); |
| 45 | cpu_cluster_pm_enter(); | ||
| 46 | |||
| 36 | highbank_set_cpu_jump(0, cpu_resume); | 47 | highbank_set_cpu_jump(0, cpu_resume); |
| 37 | cpu_suspend(0, highbank_suspend_finish); | 48 | cpu_suspend(0, highbank_suspend_finish); |
| 38 | 49 | ||
| 50 | cpu_cluster_pm_exit(); | ||
| 51 | cpu_pm_exit(); | ||
| 52 | |||
| 53 | highbank_smc1(0x102, 0x1); | ||
| 54 | if (scu_base_addr) | ||
| 55 | scu_enable(scu_base_addr); | ||
| 39 | return 0; | 56 | return 0; |
| 40 | } | 57 | } |
| 41 | 58 | ||
diff --git a/arch/arm/mach-highbank/sysregs.h b/arch/arm/mach-highbank/sysregs.h index e13e8ea7c6cb..70af9d13fcef 100644 --- a/arch/arm/mach-highbank/sysregs.h +++ b/arch/arm/mach-highbank/sysregs.h | |||
| @@ -44,28 +44,43 @@ static inline void highbank_set_core_pwr(void) | |||
| 44 | writel_relaxed(1, sregs_base + SREG_CPU_PWR_CTRL(cpu)); | 44 | writel_relaxed(1, sregs_base + SREG_CPU_PWR_CTRL(cpu)); |
| 45 | } | 45 | } |
| 46 | 46 | ||
| 47 | static inline void hignbank_set_pwr_suspend(void) | 47 | static inline void highbank_clear_core_pwr(void) |
| 48 | { | ||
| 49 | int cpu = cpu_logical_map(smp_processor_id()); | ||
| 50 | if (scu_base_addr) | ||
| 51 | scu_power_mode(scu_base_addr, SCU_PM_NORMAL); | ||
| 52 | else | ||
| 53 | writel_relaxed(0, sregs_base + SREG_CPU_PWR_CTRL(cpu)); | ||
| 54 | } | ||
| 55 | |||
| 56 | static inline void highbank_set_pwr_suspend(void) | ||
| 48 | { | 57 | { |
| 49 | writel(HB_PWR_SUSPEND, sregs_base + HB_SREG_A9_PWR_REQ); | 58 | writel(HB_PWR_SUSPEND, sregs_base + HB_SREG_A9_PWR_REQ); |
| 50 | highbank_set_core_pwr(); | 59 | highbank_set_core_pwr(); |
| 51 | } | 60 | } |
| 52 | 61 | ||
| 53 | static inline void hignbank_set_pwr_shutdown(void) | 62 | static inline void highbank_set_pwr_shutdown(void) |
| 54 | { | 63 | { |
| 55 | writel(HB_PWR_SHUTDOWN, sregs_base + HB_SREG_A9_PWR_REQ); | 64 | writel(HB_PWR_SHUTDOWN, sregs_base + HB_SREG_A9_PWR_REQ); |
| 56 | highbank_set_core_pwr(); | 65 | highbank_set_core_pwr(); |
| 57 | } | 66 | } |
| 58 | 67 | ||
| 59 | static inline void hignbank_set_pwr_soft_reset(void) | 68 | static inline void highbank_set_pwr_soft_reset(void) |
| 60 | { | 69 | { |
| 61 | writel(HB_PWR_SOFT_RESET, sregs_base + HB_SREG_A9_PWR_REQ); | 70 | writel(HB_PWR_SOFT_RESET, sregs_base + HB_SREG_A9_PWR_REQ); |
| 62 | highbank_set_core_pwr(); | 71 | highbank_set_core_pwr(); |
| 63 | } | 72 | } |
| 64 | 73 | ||
| 65 | static inline void hignbank_set_pwr_hard_reset(void) | 74 | static inline void highbank_set_pwr_hard_reset(void) |
| 66 | { | 75 | { |
| 67 | writel(HB_PWR_HARD_RESET, sregs_base + HB_SREG_A9_PWR_REQ); | 76 | writel(HB_PWR_HARD_RESET, sregs_base + HB_SREG_A9_PWR_REQ); |
| 68 | highbank_set_core_pwr(); | 77 | highbank_set_core_pwr(); |
| 69 | } | 78 | } |
| 70 | 79 | ||
| 80 | static inline void highbank_clear_pwr_request(void) | ||
| 81 | { | ||
| 82 | writel(~0UL, sregs_base + HB_SREG_A9_PWR_REQ); | ||
| 83 | highbank_clear_core_pwr(); | ||
| 84 | } | ||
| 85 | |||
| 71 | #endif | 86 | #endif |
diff --git a/arch/arm/mach-highbank/system.c b/arch/arm/mach-highbank/system.c index aed96ad9bd4a..37d8384dcf19 100644 --- a/arch/arm/mach-highbank/system.c +++ b/arch/arm/mach-highbank/system.c | |||
| @@ -22,9 +22,9 @@ | |||
| 22 | void highbank_restart(char mode, const char *cmd) | 22 | void highbank_restart(char mode, const char *cmd) |
| 23 | { | 23 | { |
| 24 | if (mode == 'h') | 24 | if (mode == 'h') |
| 25 | hignbank_set_pwr_hard_reset(); | 25 | highbank_set_pwr_hard_reset(); |
| 26 | else | 26 | else |
| 27 | hignbank_set_pwr_soft_reset(); | 27 | highbank_set_pwr_soft_reset(); |
| 28 | 28 | ||
| 29 | while (1) | 29 | while (1) |
| 30 | cpu_do_idle(); | 30 | cpu_do_idle(); |
diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig index 1ad0d76de8c7..3e628fd7a674 100644 --- a/arch/arm/mach-imx/Kconfig +++ b/arch/arm/mach-imx/Kconfig | |||
| @@ -841,8 +841,6 @@ config SOC_IMX6Q | |||
| 841 | select ARCH_HAS_CPUFREQ | 841 | select ARCH_HAS_CPUFREQ |
| 842 | select ARCH_HAS_OPP | 842 | select ARCH_HAS_OPP |
| 843 | select ARM_CPU_SUSPEND if PM | 843 | select ARM_CPU_SUSPEND if PM |
| 844 | select ARM_ERRATA_743622 | ||
| 845 | select ARM_ERRATA_751472 | ||
| 846 | select ARM_ERRATA_754322 | 844 | select ARM_ERRATA_754322 |
| 847 | select ARM_ERRATA_764369 if SMP | 845 | select ARM_ERRATA_764369 if SMP |
| 848 | select ARM_ERRATA_775420 | 846 | select ARM_ERRATA_775420 |
diff --git a/arch/arm/mach-kirkwood/board-dt.c b/arch/arm/mach-kirkwood/board-dt.c index ff4150a2ad05..de4fd2bb1e27 100644 --- a/arch/arm/mach-kirkwood/board-dt.c +++ b/arch/arm/mach-kirkwood/board-dt.c | |||
| @@ -67,6 +67,10 @@ static void __init kirkwood_legacy_clk_init(void) | |||
| 67 | orion_clkdev_add(NULL, "mv643xx_eth_port.1", | 67 | orion_clkdev_add(NULL, "mv643xx_eth_port.1", |
| 68 | of_clk_get_from_provider(&clkspec)); | 68 | of_clk_get_from_provider(&clkspec)); |
| 69 | 69 | ||
| 70 | clkspec.args[0] = CGC_BIT_SDIO; | ||
| 71 | orion_clkdev_add(NULL, "mvsdio", | ||
| 72 | of_clk_get_from_provider(&clkspec)); | ||
| 73 | |||
| 70 | } | 74 | } |
| 71 | 75 | ||
| 72 | static void __init kirkwood_of_clk_init(void) | 76 | static void __init kirkwood_of_clk_init(void) |
diff --git a/arch/arm/mach-kirkwood/board-usi_topkick.c b/arch/arm/mach-kirkwood/board-usi_topkick.c index 15e69fcde9f4..23d2dd1b1b1e 100644 --- a/arch/arm/mach-kirkwood/board-usi_topkick.c +++ b/arch/arm/mach-kirkwood/board-usi_topkick.c | |||
| @@ -64,8 +64,6 @@ static unsigned int topkick_mpp_config[] __initdata = { | |||
| 64 | 0 | 64 | 0 |
| 65 | }; | 65 | }; |
| 66 | 66 | ||
| 67 | #define TOPKICK_SATA0_PWR_ENABLE 36 | ||
| 68 | |||
| 69 | void __init usi_topkick_init(void) | 67 | void __init usi_topkick_init(void) |
| 70 | { | 68 | { |
| 71 | /* | 69 | /* |
| @@ -73,8 +71,6 @@ void __init usi_topkick_init(void) | |||
| 73 | */ | 71 | */ |
| 74 | kirkwood_mpp_conf(topkick_mpp_config); | 72 | kirkwood_mpp_conf(topkick_mpp_config); |
| 75 | 73 | ||
| 76 | /* SATA0 power enable */ | ||
| 77 | gpio_set_value(TOPKICK_SATA0_PWR_ENABLE, 1); | ||
| 78 | 74 | ||
| 79 | kirkwood_ge00_init(&topkick_ge00_data); | 75 | kirkwood_ge00_init(&topkick_ge00_data); |
| 80 | kirkwood_sdio_init(&topkick_mvsdio_data); | 76 | kirkwood_sdio_init(&topkick_mvsdio_data); |
diff --git a/arch/arm/mach-nomadik/board-nhk8815.c b/arch/arm/mach-nomadik/board-nhk8815.c index 98167a4319f7..9f19069248da 100644 --- a/arch/arm/mach-nomadik/board-nhk8815.c +++ b/arch/arm/mach-nomadik/board-nhk8815.c | |||
| @@ -27,7 +27,6 @@ | |||
| 27 | #include <linux/pinctrl/machine.h> | 27 | #include <linux/pinctrl/machine.h> |
| 28 | #include <linux/platform_data/pinctrl-nomadik.h> | 28 | #include <linux/platform_data/pinctrl-nomadik.h> |
| 29 | #include <linux/platform_data/clocksource-nomadik-mtu.h> | 29 | #include <linux/platform_data/clocksource-nomadik-mtu.h> |
| 30 | #include <linux/platform_data/mtd-nomadik-nand.h> | ||
| 31 | #include <asm/hardware/vic.h> | 30 | #include <asm/hardware/vic.h> |
| 32 | #include <asm/sizes.h> | 31 | #include <asm/sizes.h> |
| 33 | #include <asm/mach-types.h> | 32 | #include <asm/mach-types.h> |
diff --git a/arch/arm/mach-nomadik/include/mach/irqs.h b/arch/arm/mach-nomadik/include/mach/irqs.h index b549d0571548..215f8cdb4004 100644 --- a/arch/arm/mach-nomadik/include/mach/irqs.h +++ b/arch/arm/mach-nomadik/include/mach/irqs.h | |||
| @@ -22,49 +22,49 @@ | |||
| 22 | 22 | ||
| 23 | #include <mach/hardware.h> | 23 | #include <mach/hardware.h> |
| 24 | 24 | ||
| 25 | #define IRQ_VIC_START 1 /* first VIC interrupt is 1 */ | 25 | #define IRQ_VIC_START 32 /* first VIC interrupt is 1 */ |
| 26 | 26 | ||
| 27 | /* | 27 | /* |
| 28 | * Interrupt numbers generic for all Nomadik Chip cuts | 28 | * Interrupt numbers generic for all Nomadik Chip cuts |
| 29 | */ | 29 | */ |
| 30 | #define IRQ_WATCHDOG 1 | 30 | #define IRQ_WATCHDOG (IRQ_VIC_START+0) |
| 31 | #define IRQ_SOFTINT 2 | 31 | #define IRQ_SOFTINT (IRQ_VIC_START+1) |
| 32 | #define IRQ_CRYPTO 3 | 32 | #define IRQ_CRYPTO (IRQ_VIC_START+2) |
| 33 | #define IRQ_OWM 4 | 33 | #define IRQ_OWM (IRQ_VIC_START+3) |
| 34 | #define IRQ_MTU0 5 | 34 | #define IRQ_MTU0 (IRQ_VIC_START+4) |
| 35 | #define IRQ_MTU1 6 | 35 | #define IRQ_MTU1 (IRQ_VIC_START+5) |
| 36 | #define IRQ_GPIO0 7 | 36 | #define IRQ_GPIO0 (IRQ_VIC_START+6) |
| 37 | #define IRQ_GPIO1 8 | 37 | #define IRQ_GPIO1 (IRQ_VIC_START+7) |
| 38 | #define IRQ_GPIO2 9 | 38 | #define IRQ_GPIO2 (IRQ_VIC_START+8) |
| 39 | #define IRQ_GPIO3 10 | 39 | #define IRQ_GPIO3 (IRQ_VIC_START+9) |
| 40 | #define IRQ_RTC_RTT 11 | 40 | #define IRQ_RTC_RTT (IRQ_VIC_START+10) |
| 41 | #define IRQ_SSP 12 | 41 | #define IRQ_SSP (IRQ_VIC_START+11) |
| 42 | #define IRQ_UART0 13 | 42 | #define IRQ_UART0 (IRQ_VIC_START+12) |
| 43 | #define IRQ_DMA1 14 | 43 | #define IRQ_DMA1 (IRQ_VIC_START+13) |
| 44 | #define IRQ_CLCD_MDIF 15 | 44 | #define IRQ_CLCD_MDIF (IRQ_VIC_START+14) |
| 45 | #define IRQ_DMA0 16 | 45 | #define IRQ_DMA0 (IRQ_VIC_START+15) |
| 46 | #define IRQ_PWRFAIL 17 | 46 | #define IRQ_PWRFAIL (IRQ_VIC_START+16) |
| 47 | #define IRQ_UART1 18 | 47 | #define IRQ_UART1 (IRQ_VIC_START+17) |
| 48 | #define IRQ_FIRDA 19 | 48 | #define IRQ_FIRDA (IRQ_VIC_START+18) |
| 49 | #define IRQ_MSP0 20 | 49 | #define IRQ_MSP0 (IRQ_VIC_START+19) |
| 50 | #define IRQ_I2C0 21 | 50 | #define IRQ_I2C0 (IRQ_VIC_START+20) |
| 51 | #define IRQ_I2C1 22 | 51 | #define IRQ_I2C1 (IRQ_VIC_START+21) |
| 52 | #define IRQ_SDMMC 23 | 52 | #define IRQ_SDMMC (IRQ_VIC_START+22) |
| 53 | #define IRQ_USBOTG 24 | 53 | #define IRQ_USBOTG (IRQ_VIC_START+23) |
| 54 | #define IRQ_SVA_IT0 25 | 54 | #define IRQ_SVA_IT0 (IRQ_VIC_START+24) |
| 55 | #define IRQ_SVA_IT1 26 | 55 | #define IRQ_SVA_IT1 (IRQ_VIC_START+25) |
| 56 | #define IRQ_SAA_IT0 27 | 56 | #define IRQ_SAA_IT0 (IRQ_VIC_START+26) |
| 57 | #define IRQ_SAA_IT1 28 | 57 | #define IRQ_SAA_IT1 (IRQ_VIC_START+27) |
| 58 | #define IRQ_UART2 29 | 58 | #define IRQ_UART2 (IRQ_VIC_START+28) |
| 59 | #define IRQ_MSP2 30 | 59 | #define IRQ_MSP2 (IRQ_VIC_START+29) |
| 60 | #define IRQ_L2CC 49 | 60 | #define IRQ_L2CC (IRQ_VIC_START+30) |
| 61 | #define IRQ_HPI 50 | 61 | #define IRQ_HPI (IRQ_VIC_START+31) |
| 62 | #define IRQ_SKE 51 | 62 | #define IRQ_SKE (IRQ_VIC_START+32) |
| 63 | #define IRQ_KP 52 | 63 | #define IRQ_KP (IRQ_VIC_START+33) |
| 64 | #define IRQ_MEMST 55 | 64 | #define IRQ_MEMST (IRQ_VIC_START+34) |
| 65 | #define IRQ_SGA_IT 59 | 65 | #define IRQ_SGA_IT (IRQ_VIC_START+35) |
| 66 | #define IRQ_USBM 61 | 66 | #define IRQ_USBM (IRQ_VIC_START+36) |
| 67 | #define IRQ_MSP1 63 | 67 | #define IRQ_MSP1 (IRQ_VIC_START+37) |
| 68 | 68 | ||
| 69 | #define NOMADIK_GPIO_OFFSET (IRQ_VIC_START+64) | 69 | #define NOMADIK_GPIO_OFFSET (IRQ_VIC_START+64) |
| 70 | 70 | ||
diff --git a/arch/arm/mach-omap1/board-ams-delta.c b/arch/arm/mach-omap1/board-ams-delta.c index a8fce3ccc707..2e98a3ac7c5e 100644 --- a/arch/arm/mach-omap1/board-ams-delta.c +++ b/arch/arm/mach-omap1/board-ams-delta.c | |||
| @@ -160,7 +160,7 @@ static struct omap_lcd_config ams_delta_lcd_config __initdata = { | |||
| 160 | .ctrl_name = "internal", | 160 | .ctrl_name = "internal", |
| 161 | }; | 161 | }; |
| 162 | 162 | ||
| 163 | static struct omap_usb_config ams_delta_usb_config = { | 163 | static struct omap_usb_config ams_delta_usb_config __initdata = { |
| 164 | .register_host = 1, | 164 | .register_host = 1, |
| 165 | .hmc_mode = 16, | 165 | .hmc_mode = 16, |
| 166 | .pins[0] = 2, | 166 | .pins[0] = 2, |
diff --git a/arch/arm/mach-omap1/usb.c b/arch/arm/mach-omap1/usb.c index 104fed366b8f..1a1db5971cd9 100644 --- a/arch/arm/mach-omap1/usb.c +++ b/arch/arm/mach-omap1/usb.c | |||
| @@ -629,8 +629,14 @@ static void __init omap_1510_usb_init(struct omap_usb_config *config) | |||
| 629 | static inline void omap_1510_usb_init(struct omap_usb_config *config) {} | 629 | static inline void omap_1510_usb_init(struct omap_usb_config *config) {} |
| 630 | #endif | 630 | #endif |
| 631 | 631 | ||
| 632 | void __init omap1_usb_init(struct omap_usb_config *pdata) | 632 | void __init omap1_usb_init(struct omap_usb_config *_pdata) |
| 633 | { | 633 | { |
| 634 | struct omap_usb_config *pdata; | ||
| 635 | |||
| 636 | pdata = kmemdup(_pdata, sizeof(*pdata), GFP_KERNEL); | ||
| 637 | if (!pdata) | ||
| 638 | return; | ||
| 639 | |||
| 634 | pdata->usb0_init = omap1_usb0_init; | 640 | pdata->usb0_init = omap1_usb0_init; |
| 635 | pdata->usb1_init = omap1_usb1_init; | 641 | pdata->usb1_init = omap1_usb1_init; |
| 636 | pdata->usb2_init = omap1_usb2_init; | 642 | pdata->usb2_init = omap1_usb2_init; |
diff --git a/arch/arm/mach-omap2/cclock3xxx_data.c b/arch/arm/mach-omap2/cclock3xxx_data.c index bdf39481fbd6..6ef87580c33f 100644 --- a/arch/arm/mach-omap2/cclock3xxx_data.c +++ b/arch/arm/mach-omap2/cclock3xxx_data.c | |||
| @@ -1167,6 +1167,8 @@ static const struct clk_ops emu_src_ck_ops = { | |||
| 1167 | .recalc_rate = &omap2_clksel_recalc, | 1167 | .recalc_rate = &omap2_clksel_recalc, |
| 1168 | .get_parent = &omap2_clksel_find_parent_index, | 1168 | .get_parent = &omap2_clksel_find_parent_index, |
| 1169 | .set_parent = &omap2_clksel_set_parent, | 1169 | .set_parent = &omap2_clksel_set_parent, |
| 1170 | .enable = &omap2_clkops_enable_clkdm, | ||
| 1171 | .disable = &omap2_clkops_disable_clkdm, | ||
| 1170 | }; | 1172 | }; |
| 1171 | 1173 | ||
| 1172 | static struct clk emu_src_ck; | 1174 | static struct clk emu_src_ck; |
diff --git a/arch/arm/mach-omap2/omap_hwmod_33xx_data.c b/arch/arm/mach-omap2/omap_hwmod_33xx_data.c index 081c71edddf4..646c14d9fdb9 100644 --- a/arch/arm/mach-omap2/omap_hwmod_33xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_33xx_data.c | |||
| @@ -2070,7 +2070,7 @@ static struct omap_hwmod_irq_info am33xx_usbss_mpu_irqs[] = { | |||
| 2070 | { .name = "usbss-irq", .irq = 17 + OMAP_INTC_START, }, | 2070 | { .name = "usbss-irq", .irq = 17 + OMAP_INTC_START, }, |
| 2071 | { .name = "musb0-irq", .irq = 18 + OMAP_INTC_START, }, | 2071 | { .name = "musb0-irq", .irq = 18 + OMAP_INTC_START, }, |
| 2072 | { .name = "musb1-irq", .irq = 19 + OMAP_INTC_START, }, | 2072 | { .name = "musb1-irq", .irq = 19 + OMAP_INTC_START, }, |
| 2073 | { .irq = -1 + OMAP_INTC_START, }, | 2073 | { .irq = -1, }, |
| 2074 | }; | 2074 | }; |
| 2075 | 2075 | ||
| 2076 | static struct omap_hwmod am33xx_usbss_hwmod = { | 2076 | static struct omap_hwmod am33xx_usbss_hwmod = { |
| @@ -2515,7 +2515,7 @@ static struct omap_hwmod_ocp_if am33xx_l4_hs__cpgmac0 = { | |||
| 2515 | .user = OCP_USER_MPU, | 2515 | .user = OCP_USER_MPU, |
| 2516 | }; | 2516 | }; |
| 2517 | 2517 | ||
| 2518 | struct omap_hwmod_addr_space am33xx_mdio_addr_space[] = { | 2518 | static struct omap_hwmod_addr_space am33xx_mdio_addr_space[] = { |
| 2519 | { | 2519 | { |
| 2520 | .pa_start = 0x4A101000, | 2520 | .pa_start = 0x4A101000, |
| 2521 | .pa_end = 0x4A101000 + SZ_256 - 1, | 2521 | .pa_end = 0x4A101000 + SZ_256 - 1, |
| @@ -2523,7 +2523,7 @@ struct omap_hwmod_addr_space am33xx_mdio_addr_space[] = { | |||
| 2523 | { } | 2523 | { } |
| 2524 | }; | 2524 | }; |
| 2525 | 2525 | ||
| 2526 | struct omap_hwmod_ocp_if am33xx_cpgmac0__mdio = { | 2526 | static struct omap_hwmod_ocp_if am33xx_cpgmac0__mdio = { |
| 2527 | .master = &am33xx_cpgmac0_hwmod, | 2527 | .master = &am33xx_cpgmac0_hwmod, |
| 2528 | .slave = &am33xx_mdio_hwmod, | 2528 | .slave = &am33xx_mdio_hwmod, |
| 2529 | .addr = am33xx_mdio_addr_space, | 2529 | .addr = am33xx_mdio_addr_space, |
diff --git a/arch/arm/mach-omap2/prm2xxx.c b/arch/arm/mach-omap2/prm2xxx.c index cc0e71430af1..418de9c3b319 100644 --- a/arch/arm/mach-omap2/prm2xxx.c +++ b/arch/arm/mach-omap2/prm2xxx.c | |||
| @@ -28,6 +28,14 @@ | |||
| 28 | #include "prm-regbits-24xx.h" | 28 | #include "prm-regbits-24xx.h" |
| 29 | 29 | ||
| 30 | /* | 30 | /* |
| 31 | * OMAP24xx PM_PWSTCTRL_*.POWERSTATE and PM_PWSTST_*.LASTSTATEENTERED bits - | ||
| 32 | * these are reversed from the bits used on OMAP3+ | ||
| 33 | */ | ||
| 34 | #define OMAP24XX_PWRDM_POWER_ON 0x0 | ||
| 35 | #define OMAP24XX_PWRDM_POWER_RET 0x1 | ||
| 36 | #define OMAP24XX_PWRDM_POWER_OFF 0x3 | ||
| 37 | |||
| 38 | /* | ||
| 31 | * omap2xxx_prm_reset_src_map - map from bits in the PRM_RSTST_WKUP | 39 | * omap2xxx_prm_reset_src_map - map from bits in the PRM_RSTST_WKUP |
| 32 | * hardware register (which are specific to the OMAP2xxx SoCs) to | 40 | * hardware register (which are specific to the OMAP2xxx SoCs) to |
| 33 | * reset source ID bit shifts (which is an OMAP SoC-independent | 41 | * reset source ID bit shifts (which is an OMAP SoC-independent |
| @@ -68,6 +76,34 @@ static u32 omap2xxx_prm_read_reset_sources(void) | |||
| 68 | } | 76 | } |
| 69 | 77 | ||
| 70 | /** | 78 | /** |
| 79 | * omap2xxx_pwrst_to_common_pwrst - convert OMAP2xxx pwrst to common pwrst | ||
| 80 | * @omap2xxx_pwrst: OMAP2xxx hardware power state to convert | ||
| 81 | * | ||
| 82 | * Return the common power state bits corresponding to the OMAP2xxx | ||
| 83 | * hardware power state bits @omap2xxx_pwrst, or -EINVAL upon error. | ||
| 84 | */ | ||
| 85 | static int omap2xxx_pwrst_to_common_pwrst(u8 omap2xxx_pwrst) | ||
| 86 | { | ||
| 87 | u8 pwrst; | ||
| 88 | |||
| 89 | switch (omap2xxx_pwrst) { | ||
| 90 | case OMAP24XX_PWRDM_POWER_OFF: | ||
| 91 | pwrst = PWRDM_POWER_OFF; | ||
| 92 | break; | ||
| 93 | case OMAP24XX_PWRDM_POWER_RET: | ||
| 94 | pwrst = PWRDM_POWER_RET; | ||
| 95 | break; | ||
| 96 | case OMAP24XX_PWRDM_POWER_ON: | ||
| 97 | pwrst = PWRDM_POWER_ON; | ||
| 98 | break; | ||
| 99 | default: | ||
| 100 | return -EINVAL; | ||
| 101 | } | ||
| 102 | |||
| 103 | return pwrst; | ||
| 104 | } | ||
| 105 | |||
| 106 | /** | ||
| 71 | * omap2xxx_prm_dpll_reset - use DPLL reset to reboot the OMAP SoC | 107 | * omap2xxx_prm_dpll_reset - use DPLL reset to reboot the OMAP SoC |
| 72 | * | 108 | * |
| 73 | * Set the DPLL reset bit, which should reboot the SoC. This is the | 109 | * Set the DPLL reset bit, which should reboot the SoC. This is the |
| @@ -97,10 +133,56 @@ int omap2xxx_clkdm_wakeup(struct clockdomain *clkdm) | |||
| 97 | return 0; | 133 | return 0; |
| 98 | } | 134 | } |
| 99 | 135 | ||
| 136 | static int omap2xxx_pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst) | ||
| 137 | { | ||
| 138 | u8 omap24xx_pwrst; | ||
| 139 | |||
| 140 | switch (pwrst) { | ||
| 141 | case PWRDM_POWER_OFF: | ||
| 142 | omap24xx_pwrst = OMAP24XX_PWRDM_POWER_OFF; | ||
| 143 | break; | ||
| 144 | case PWRDM_POWER_RET: | ||
| 145 | omap24xx_pwrst = OMAP24XX_PWRDM_POWER_RET; | ||
| 146 | break; | ||
| 147 | case PWRDM_POWER_ON: | ||
| 148 | omap24xx_pwrst = OMAP24XX_PWRDM_POWER_ON; | ||
| 149 | break; | ||
| 150 | default: | ||
| 151 | return -EINVAL; | ||
| 152 | } | ||
| 153 | |||
| 154 | omap2_prm_rmw_mod_reg_bits(OMAP_POWERSTATE_MASK, | ||
| 155 | (omap24xx_pwrst << OMAP_POWERSTATE_SHIFT), | ||
| 156 | pwrdm->prcm_offs, OMAP2_PM_PWSTCTRL); | ||
| 157 | return 0; | ||
| 158 | } | ||
| 159 | |||
| 160 | static int omap2xxx_pwrdm_read_next_pwrst(struct powerdomain *pwrdm) | ||
| 161 | { | ||
| 162 | u8 omap2xxx_pwrst; | ||
| 163 | |||
| 164 | omap2xxx_pwrst = omap2_prm_read_mod_bits_shift(pwrdm->prcm_offs, | ||
| 165 | OMAP2_PM_PWSTCTRL, | ||
| 166 | OMAP_POWERSTATE_MASK); | ||
| 167 | |||
| 168 | return omap2xxx_pwrst_to_common_pwrst(omap2xxx_pwrst); | ||
| 169 | } | ||
| 170 | |||
| 171 | static int omap2xxx_pwrdm_read_pwrst(struct powerdomain *pwrdm) | ||
| 172 | { | ||
| 173 | u8 omap2xxx_pwrst; | ||
| 174 | |||
| 175 | omap2xxx_pwrst = omap2_prm_read_mod_bits_shift(pwrdm->prcm_offs, | ||
| 176 | OMAP2_PM_PWSTST, | ||
| 177 | OMAP_POWERSTATEST_MASK); | ||
| 178 | |||
| 179 | return omap2xxx_pwrst_to_common_pwrst(omap2xxx_pwrst); | ||
| 180 | } | ||
| 181 | |||
| 100 | struct pwrdm_ops omap2_pwrdm_operations = { | 182 | struct pwrdm_ops omap2_pwrdm_operations = { |
| 101 | .pwrdm_set_next_pwrst = omap2_pwrdm_set_next_pwrst, | 183 | .pwrdm_set_next_pwrst = omap2xxx_pwrdm_set_next_pwrst, |
| 102 | .pwrdm_read_next_pwrst = omap2_pwrdm_read_next_pwrst, | 184 | .pwrdm_read_next_pwrst = omap2xxx_pwrdm_read_next_pwrst, |
| 103 | .pwrdm_read_pwrst = omap2_pwrdm_read_pwrst, | 185 | .pwrdm_read_pwrst = omap2xxx_pwrdm_read_pwrst, |
| 104 | .pwrdm_set_logic_retst = omap2_pwrdm_set_logic_retst, | 186 | .pwrdm_set_logic_retst = omap2_pwrdm_set_logic_retst, |
| 105 | .pwrdm_set_mem_onst = omap2_pwrdm_set_mem_onst, | 187 | .pwrdm_set_mem_onst = omap2_pwrdm_set_mem_onst, |
| 106 | .pwrdm_set_mem_retst = omap2_pwrdm_set_mem_retst, | 188 | .pwrdm_set_mem_retst = omap2_pwrdm_set_mem_retst, |
diff --git a/arch/arm/mach-omap2/prm2xxx_3xxx.c b/arch/arm/mach-omap2/prm2xxx_3xxx.c index 30517f5af707..a3e121f94a86 100644 --- a/arch/arm/mach-omap2/prm2xxx_3xxx.c +++ b/arch/arm/mach-omap2/prm2xxx_3xxx.c | |||
| @@ -103,28 +103,6 @@ int omap2_prm_deassert_hardreset(s16 prm_mod, u8 rst_shift, u8 st_shift) | |||
| 103 | /* Powerdomain low-level functions */ | 103 | /* Powerdomain low-level functions */ |
| 104 | 104 | ||
| 105 | /* Common functions across OMAP2 and OMAP3 */ | 105 | /* Common functions across OMAP2 and OMAP3 */ |
| 106 | int omap2_pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst) | ||
| 107 | { | ||
| 108 | omap2_prm_rmw_mod_reg_bits(OMAP_POWERSTATE_MASK, | ||
| 109 | (pwrst << OMAP_POWERSTATE_SHIFT), | ||
| 110 | pwrdm->prcm_offs, OMAP2_PM_PWSTCTRL); | ||
| 111 | return 0; | ||
| 112 | } | ||
| 113 | |||
| 114 | int omap2_pwrdm_read_next_pwrst(struct powerdomain *pwrdm) | ||
| 115 | { | ||
| 116 | return omap2_prm_read_mod_bits_shift(pwrdm->prcm_offs, | ||
| 117 | OMAP2_PM_PWSTCTRL, | ||
| 118 | OMAP_POWERSTATE_MASK); | ||
| 119 | } | ||
| 120 | |||
| 121 | int omap2_pwrdm_read_pwrst(struct powerdomain *pwrdm) | ||
| 122 | { | ||
| 123 | return omap2_prm_read_mod_bits_shift(pwrdm->prcm_offs, | ||
| 124 | OMAP2_PM_PWSTST, | ||
| 125 | OMAP_POWERSTATEST_MASK); | ||
| 126 | } | ||
| 127 | |||
| 128 | int omap2_pwrdm_set_mem_onst(struct powerdomain *pwrdm, u8 bank, | 106 | int omap2_pwrdm_set_mem_onst(struct powerdomain *pwrdm, u8 bank, |
| 129 | u8 pwrst) | 107 | u8 pwrst) |
| 130 | { | 108 | { |
diff --git a/arch/arm/mach-omap2/prm3xxx.c b/arch/arm/mach-omap2/prm3xxx.c index 39822aabcff3..e648bd55b072 100644 --- a/arch/arm/mach-omap2/prm3xxx.c +++ b/arch/arm/mach-omap2/prm3xxx.c | |||
| @@ -277,6 +277,28 @@ static u32 omap3xxx_prm_read_reset_sources(void) | |||
| 277 | 277 | ||
| 278 | /* Powerdomain low-level functions */ | 278 | /* Powerdomain low-level functions */ |
| 279 | 279 | ||
| 280 | static int omap3_pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst) | ||
| 281 | { | ||
| 282 | omap2_prm_rmw_mod_reg_bits(OMAP_POWERSTATE_MASK, | ||
| 283 | (pwrst << OMAP_POWERSTATE_SHIFT), | ||
| 284 | pwrdm->prcm_offs, OMAP2_PM_PWSTCTRL); | ||
| 285 | return 0; | ||
| 286 | } | ||
| 287 | |||
| 288 | static int omap3_pwrdm_read_next_pwrst(struct powerdomain *pwrdm) | ||
| 289 | { | ||
| 290 | return omap2_prm_read_mod_bits_shift(pwrdm->prcm_offs, | ||
| 291 | OMAP2_PM_PWSTCTRL, | ||
| 292 | OMAP_POWERSTATE_MASK); | ||
| 293 | } | ||
| 294 | |||
| 295 | static int omap3_pwrdm_read_pwrst(struct powerdomain *pwrdm) | ||
| 296 | { | ||
| 297 | return omap2_prm_read_mod_bits_shift(pwrdm->prcm_offs, | ||
| 298 | OMAP2_PM_PWSTST, | ||
| 299 | OMAP_POWERSTATEST_MASK); | ||
| 300 | } | ||
| 301 | |||
| 280 | /* Applicable only for OMAP3. Not supported on OMAP2 */ | 302 | /* Applicable only for OMAP3. Not supported on OMAP2 */ |
| 281 | static int omap3_pwrdm_read_prev_pwrst(struct powerdomain *pwrdm) | 303 | static int omap3_pwrdm_read_prev_pwrst(struct powerdomain *pwrdm) |
| 282 | { | 304 | { |
| @@ -355,9 +377,9 @@ static int omap3_pwrdm_disable_hdwr_sar(struct powerdomain *pwrdm) | |||
| 355 | } | 377 | } |
| 356 | 378 | ||
| 357 | struct pwrdm_ops omap3_pwrdm_operations = { | 379 | struct pwrdm_ops omap3_pwrdm_operations = { |
| 358 | .pwrdm_set_next_pwrst = omap2_pwrdm_set_next_pwrst, | 380 | .pwrdm_set_next_pwrst = omap3_pwrdm_set_next_pwrst, |
| 359 | .pwrdm_read_next_pwrst = omap2_pwrdm_read_next_pwrst, | 381 | .pwrdm_read_next_pwrst = omap3_pwrdm_read_next_pwrst, |
| 360 | .pwrdm_read_pwrst = omap2_pwrdm_read_pwrst, | 382 | .pwrdm_read_pwrst = omap3_pwrdm_read_pwrst, |
| 361 | .pwrdm_read_prev_pwrst = omap3_pwrdm_read_prev_pwrst, | 383 | .pwrdm_read_prev_pwrst = omap3_pwrdm_read_prev_pwrst, |
| 362 | .pwrdm_set_logic_retst = omap2_pwrdm_set_logic_retst, | 384 | .pwrdm_set_logic_retst = omap2_pwrdm_set_logic_retst, |
| 363 | .pwrdm_read_logic_pwrst = omap3_pwrdm_read_logic_pwrst, | 385 | .pwrdm_read_logic_pwrst = omap3_pwrdm_read_logic_pwrst, |
diff --git a/arch/arm/mach-omap2/prm44xx.c b/arch/arm/mach-omap2/prm44xx.c index 7498bc77fe8b..c05a343d465d 100644 --- a/arch/arm/mach-omap2/prm44xx.c +++ b/arch/arm/mach-omap2/prm44xx.c | |||
| @@ -56,9 +56,9 @@ static struct omap_prcm_irq_setup omap4_prcm_irq_setup = { | |||
| 56 | * enumeration) | 56 | * enumeration) |
| 57 | */ | 57 | */ |
| 58 | static struct prm_reset_src_map omap44xx_prm_reset_src_map[] = { | 58 | static struct prm_reset_src_map omap44xx_prm_reset_src_map[] = { |
| 59 | { OMAP4430_RST_GLOBAL_WARM_SW_SHIFT, | 59 | { OMAP4430_GLOBAL_WARM_SW_RST_SHIFT, |
| 60 | OMAP_GLOBAL_WARM_RST_SRC_ID_SHIFT }, | 60 | OMAP_GLOBAL_WARM_RST_SRC_ID_SHIFT }, |
| 61 | { OMAP4430_RST_GLOBAL_COLD_SW_SHIFT, | 61 | { OMAP4430_GLOBAL_COLD_RST_SHIFT, |
| 62 | OMAP_GLOBAL_COLD_RST_SRC_ID_SHIFT }, | 62 | OMAP_GLOBAL_COLD_RST_SRC_ID_SHIFT }, |
| 63 | { OMAP4430_MPU_SECURITY_VIOL_RST_SHIFT, | 63 | { OMAP4430_MPU_SECURITY_VIOL_RST_SHIFT, |
| 64 | OMAP_SECU_VIOL_RST_SRC_ID_SHIFT }, | 64 | OMAP_SECU_VIOL_RST_SRC_ID_SHIFT }, |
| @@ -333,7 +333,7 @@ static u32 omap44xx_prm_read_reset_sources(void) | |||
| 333 | u32 r = 0; | 333 | u32 r = 0; |
| 334 | u32 v; | 334 | u32 v; |
| 335 | 335 | ||
| 336 | v = omap4_prm_read_inst_reg(OMAP4430_PRM_OCP_SOCKET_INST, | 336 | v = omap4_prm_read_inst_reg(OMAP4430_PRM_DEVICE_INST, |
| 337 | OMAP4_RM_RSTST); | 337 | OMAP4_RM_RSTST); |
| 338 | 338 | ||
| 339 | p = omap44xx_prm_reset_src_map; | 339 | p = omap44xx_prm_reset_src_map; |
diff --git a/arch/arm/mach-omap2/prm44xx.h b/arch/arm/mach-omap2/prm44xx.h index 22b0979206ca..8ee1fbdec561 100644 --- a/arch/arm/mach-omap2/prm44xx.h +++ b/arch/arm/mach-omap2/prm44xx.h | |||
| @@ -62,8 +62,8 @@ | |||
| 62 | 62 | ||
| 63 | /* OMAP4 specific register offsets */ | 63 | /* OMAP4 specific register offsets */ |
| 64 | #define OMAP4_RM_RSTCTRL 0x0000 | 64 | #define OMAP4_RM_RSTCTRL 0x0000 |
| 65 | #define OMAP4_RM_RSTTIME 0x0004 | 65 | #define OMAP4_RM_RSTST 0x0004 |
| 66 | #define OMAP4_RM_RSTST 0x0008 | 66 | #define OMAP4_RM_RSTTIME 0x0008 |
| 67 | #define OMAP4_PM_PWSTCTRL 0x0000 | 67 | #define OMAP4_PM_PWSTCTRL 0x0000 |
| 68 | #define OMAP4_PM_PWSTST 0x0004 | 68 | #define OMAP4_PM_PWSTST 0x0004 |
| 69 | 69 | ||
diff --git a/arch/arm/mach-versatile/include/mach/irqs.h b/arch/arm/mach-versatile/include/mach/irqs.h index bf44c61bd1f6..0fd771ca617b 100644 --- a/arch/arm/mach-versatile/include/mach/irqs.h +++ b/arch/arm/mach-versatile/include/mach/irqs.h | |||
| @@ -25,7 +25,7 @@ | |||
| 25 | * IRQ interrupts definitions are the same as the INT definitions | 25 | * IRQ interrupts definitions are the same as the INT definitions |
| 26 | * held within platform.h | 26 | * held within platform.h |
| 27 | */ | 27 | */ |
| 28 | #define IRQ_VIC_START 0 | 28 | #define IRQ_VIC_START 32 |
| 29 | #define IRQ_WDOGINT (IRQ_VIC_START + INT_WDOGINT) | 29 | #define IRQ_WDOGINT (IRQ_VIC_START + INT_WDOGINT) |
| 30 | #define IRQ_SOFTINT (IRQ_VIC_START + INT_SOFTINT) | 30 | #define IRQ_SOFTINT (IRQ_VIC_START + INT_SOFTINT) |
| 31 | #define IRQ_COMMRx (IRQ_VIC_START + INT_COMMRx) | 31 | #define IRQ_COMMRx (IRQ_VIC_START + INT_COMMRx) |
| @@ -100,7 +100,7 @@ | |||
| 100 | /* | 100 | /* |
| 101 | * Secondary interrupt controller | 101 | * Secondary interrupt controller |
| 102 | */ | 102 | */ |
| 103 | #define IRQ_SIC_START 32 | 103 | #define IRQ_SIC_START 64 |
| 104 | #define IRQ_SIC_MMCI0B (IRQ_SIC_START + SIC_INT_MMCI0B) | 104 | #define IRQ_SIC_MMCI0B (IRQ_SIC_START + SIC_INT_MMCI0B) |
| 105 | #define IRQ_SIC_MMCI1B (IRQ_SIC_START + SIC_INT_MMCI1B) | 105 | #define IRQ_SIC_MMCI1B (IRQ_SIC_START + SIC_INT_MMCI1B) |
| 106 | #define IRQ_SIC_KMI0 (IRQ_SIC_START + SIC_INT_KMI0) | 106 | #define IRQ_SIC_KMI0 (IRQ_SIC_START + SIC_INT_KMI0) |
| @@ -120,7 +120,7 @@ | |||
| 120 | #define IRQ_SIC_PCI1 (IRQ_SIC_START + SIC_INT_PCI1) | 120 | #define IRQ_SIC_PCI1 (IRQ_SIC_START + SIC_INT_PCI1) |
| 121 | #define IRQ_SIC_PCI2 (IRQ_SIC_START + SIC_INT_PCI2) | 121 | #define IRQ_SIC_PCI2 (IRQ_SIC_START + SIC_INT_PCI2) |
| 122 | #define IRQ_SIC_PCI3 (IRQ_SIC_START + SIC_INT_PCI3) | 122 | #define IRQ_SIC_PCI3 (IRQ_SIC_START + SIC_INT_PCI3) |
| 123 | #define IRQ_SIC_END 63 | 123 | #define IRQ_SIC_END 95 |
| 124 | 124 | ||
| 125 | #define IRQ_GPIO0_START (IRQ_SIC_END + 1) | 125 | #define IRQ_GPIO0_START (IRQ_SIC_END + 1) |
| 126 | #define IRQ_GPIO0_END (IRQ_GPIO0_START + 31) | 126 | #define IRQ_GPIO0_END (IRQ_GPIO0_START + 31) |
diff --git a/arch/arm/mach-vexpress/Kconfig b/arch/arm/mach-vexpress/Kconfig index 99e63f5f99d1..52d315b792c8 100644 --- a/arch/arm/mach-vexpress/Kconfig +++ b/arch/arm/mach-vexpress/Kconfig | |||
| @@ -42,7 +42,6 @@ config ARCH_VEXPRESS_CORTEX_A5_A9_ERRATA | |||
| 42 | bool "Enable A5 and A9 only errata work-arounds" | 42 | bool "Enable A5 and A9 only errata work-arounds" |
| 43 | default y | 43 | default y |
| 44 | select ARM_ERRATA_720789 | 44 | select ARM_ERRATA_720789 |
| 45 | select ARM_ERRATA_751472 | ||
| 46 | select PL310_ERRATA_753970 if CACHE_PL310 | 45 | select PL310_ERRATA_753970 if CACHE_PL310 |
| 47 | help | 46 | help |
| 48 | Provides common dependencies for Versatile Express platforms | 47 | Provides common dependencies for Versatile Express platforms |
diff --git a/arch/arm/mm/cache-l2x0.c b/arch/arm/mm/cache-l2x0.c index 6911b8b2745c..c2f37390308a 100644 --- a/arch/arm/mm/cache-l2x0.c +++ b/arch/arm/mm/cache-l2x0.c | |||
| @@ -352,7 +352,8 @@ void __init l2x0_init(void __iomem *base, u32 aux_val, u32 aux_mask) | |||
| 352 | /* Unmapped register. */ | 352 | /* Unmapped register. */ |
| 353 | sync_reg_offset = L2X0_DUMMY_REG; | 353 | sync_reg_offset = L2X0_DUMMY_REG; |
| 354 | #endif | 354 | #endif |
| 355 | outer_cache.set_debug = pl310_set_debug; | 355 | if ((cache_id & L2X0_CACHE_ID_RTL_MASK) <= L2X0_CACHE_ID_RTL_R3P0) |
| 356 | outer_cache.set_debug = pl310_set_debug; | ||
| 356 | break; | 357 | break; |
| 357 | case L2X0_CACHE_ID_PART_L210: | 358 | case L2X0_CACHE_ID_PART_L210: |
| 358 | ways = (aux >> 13) & 0xf; | 359 | ways = (aux >> 13) & 0xf; |
| @@ -459,8 +460,8 @@ static void aurora_pa_range(unsigned long start, unsigned long end, | |||
| 459 | unsigned long flags; | 460 | unsigned long flags; |
| 460 | 461 | ||
| 461 | raw_spin_lock_irqsave(&l2x0_lock, flags); | 462 | raw_spin_lock_irqsave(&l2x0_lock, flags); |
| 462 | writel(start, l2x0_base + AURORA_RANGE_BASE_ADDR_REG); | 463 | writel_relaxed(start, l2x0_base + AURORA_RANGE_BASE_ADDR_REG); |
| 463 | writel(end, l2x0_base + offset); | 464 | writel_relaxed(end, l2x0_base + offset); |
| 464 | raw_spin_unlock_irqrestore(&l2x0_lock, flags); | 465 | raw_spin_unlock_irqrestore(&l2x0_lock, flags); |
| 465 | 466 | ||
| 466 | cache_sync(); | 467 | cache_sync(); |
| @@ -505,15 +506,21 @@ static void aurora_clean_range(unsigned long start, unsigned long end) | |||
| 505 | 506 | ||
| 506 | static void aurora_flush_range(unsigned long start, unsigned long end) | 507 | static void aurora_flush_range(unsigned long start, unsigned long end) |
| 507 | { | 508 | { |
| 508 | if (!l2_wt_override) { | 509 | start &= ~(CACHE_LINE_SIZE - 1); |
| 509 | start &= ~(CACHE_LINE_SIZE - 1); | 510 | end = ALIGN(end, CACHE_LINE_SIZE); |
| 510 | end = ALIGN(end, CACHE_LINE_SIZE); | 511 | while (start != end) { |
| 511 | while (start != end) { | 512 | unsigned long range_end = calc_range_end(start, end); |
| 512 | unsigned long range_end = calc_range_end(start, end); | 513 | /* |
| 514 | * If L2 is forced to WT, the L2 will always be clean and we | ||
| 515 | * just need to invalidate. | ||
| 516 | */ | ||
| 517 | if (l2_wt_override) | ||
| 513 | aurora_pa_range(start, range_end - CACHE_LINE_SIZE, | 518 | aurora_pa_range(start, range_end - CACHE_LINE_SIZE, |
| 514 | AURORA_FLUSH_RANGE_REG); | 519 | AURORA_INVAL_RANGE_REG); |
| 515 | start = range_end; | 520 | else |
| 516 | } | 521 | aurora_pa_range(start, range_end - CACHE_LINE_SIZE, |
| 522 | AURORA_FLUSH_RANGE_REG); | ||
| 523 | start = range_end; | ||
| 517 | } | 524 | } |
| 518 | } | 525 | } |
| 519 | 526 | ||
| @@ -668,8 +675,9 @@ static void pl310_resume(void) | |||
| 668 | static void aurora_resume(void) | 675 | static void aurora_resume(void) |
| 669 | { | 676 | { |
| 670 | if (!(readl(l2x0_base + L2X0_CTRL) & L2X0_CTRL_EN)) { | 677 | if (!(readl(l2x0_base + L2X0_CTRL) & L2X0_CTRL_EN)) { |
| 671 | writel(l2x0_saved_regs.aux_ctrl, l2x0_base + L2X0_AUX_CTRL); | 678 | writel_relaxed(l2x0_saved_regs.aux_ctrl, |
| 672 | writel(l2x0_saved_regs.ctrl, l2x0_base + L2X0_CTRL); | 679 | l2x0_base + L2X0_AUX_CTRL); |
| 680 | writel_relaxed(l2x0_saved_regs.ctrl, l2x0_base + L2X0_CTRL); | ||
| 673 | } | 681 | } |
| 674 | } | 682 | } |
| 675 | 683 | ||
diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S index 350f6a74992b..3a3c015f8d5c 100644 --- a/arch/arm/mm/proc-v7.S +++ b/arch/arm/mm/proc-v7.S | |||
| @@ -169,6 +169,7 @@ __v7_ca15mp_setup: | |||
| 169 | orreq r0, r0, r10 @ Enable CPU-specific SMP bits | 169 | orreq r0, r0, r10 @ Enable CPU-specific SMP bits |
| 170 | mcreq p15, 0, r0, c1, c0, 1 | 170 | mcreq p15, 0, r0, c1, c0, 1 |
| 171 | #endif | 171 | #endif |
| 172 | b __v7_setup | ||
| 172 | 173 | ||
| 173 | __v7_pj4b_setup: | 174 | __v7_pj4b_setup: |
| 174 | #ifdef CONFIG_CPU_PJ4B | 175 | #ifdef CONFIG_CPU_PJ4B |
| @@ -245,7 +246,8 @@ __v7_setup: | |||
| 245 | ldr r10, =0x00000c08 @ Cortex-A8 primary part number | 246 | ldr r10, =0x00000c08 @ Cortex-A8 primary part number |
| 246 | teq r0, r10 | 247 | teq r0, r10 |
| 247 | bne 2f | 248 | bne 2f |
| 248 | #ifdef CONFIG_ARM_ERRATA_430973 | 249 | #if defined(CONFIG_ARM_ERRATA_430973) && !defined(CONFIG_ARCH_MULTIPLATFORM) |
| 250 | |||
| 249 | teq r5, #0x00100000 @ only present in r1p* | 251 | teq r5, #0x00100000 @ only present in r1p* |
| 250 | mrceq p15, 0, r10, c1, c0, 1 @ read aux control register | 252 | mrceq p15, 0, r10, c1, c0, 1 @ read aux control register |
| 251 | orreq r10, r10, #(1 << 6) @ set IBE to 1 | 253 | orreq r10, r10, #(1 << 6) @ set IBE to 1 |
diff --git a/arch/arm/plat-omap/counter_32k.c b/arch/arm/plat-omap/counter_32k.c index f3771cdb9838..5b0b86bb34bb 100644 --- a/arch/arm/plat-omap/counter_32k.c +++ b/arch/arm/plat-omap/counter_32k.c | |||
| @@ -22,6 +22,8 @@ | |||
| 22 | #include <asm/mach/time.h> | 22 | #include <asm/mach/time.h> |
| 23 | #include <asm/sched_clock.h> | 23 | #include <asm/sched_clock.h> |
| 24 | 24 | ||
| 25 | #include <plat/counter-32k.h> | ||
| 26 | |||
| 25 | /* OMAP2_32KSYNCNT_CR_OFF: offset of 32ksync counter register */ | 27 | /* OMAP2_32KSYNCNT_CR_OFF: offset of 32ksync counter register */ |
| 26 | #define OMAP2_32KSYNCNT_REV_OFF 0x0 | 28 | #define OMAP2_32KSYNCNT_REV_OFF 0x0 |
| 27 | #define OMAP2_32KSYNCNT_REV_SCHEME (0x3 << 30) | 29 | #define OMAP2_32KSYNCNT_REV_SCHEME (0x3 << 30) |
diff --git a/arch/arm/plat-omap/sram.c b/arch/arm/plat-omap/sram.c index 743fc2836f7a..a5bc92d7e476 100644 --- a/arch/arm/plat-omap/sram.c +++ b/arch/arm/plat-omap/sram.c | |||
| @@ -26,6 +26,8 @@ | |||
| 26 | 26 | ||
| 27 | #include <asm/mach/map.h> | 27 | #include <asm/mach/map.h> |
| 28 | 28 | ||
| 29 | #include <plat/sram.h> | ||
| 30 | |||
| 29 | #define ROUND_DOWN(value,boundary) ((value) & (~((boundary)-1))) | 31 | #define ROUND_DOWN(value,boundary) ((value) & (~((boundary)-1))) |
| 30 | 32 | ||
| 31 | static void __iomem *omap_sram_base; | 33 | static void __iomem *omap_sram_base; |
diff --git a/arch/arm/plat-samsung/include/plat/cpu.h b/arch/arm/plat-samsung/include/plat/cpu.h index e0072ce8d6e9..b69e11dc679d 100644 --- a/arch/arm/plat-samsung/include/plat/cpu.h +++ b/arch/arm/plat-samsung/include/plat/cpu.h | |||
| @@ -43,7 +43,7 @@ extern unsigned long samsung_cpu_id; | |||
| 43 | #define EXYNOS4_CPU_MASK 0xFFFE0000 | 43 | #define EXYNOS4_CPU_MASK 0xFFFE0000 |
| 44 | 44 | ||
| 45 | #define EXYNOS5250_SOC_ID 0x43520000 | 45 | #define EXYNOS5250_SOC_ID 0x43520000 |
| 46 | #define EXYNOS5440_SOC_ID 0x54400000 | 46 | #define EXYNOS5440_SOC_ID 0xE5440000 |
| 47 | #define EXYNOS5_SOC_MASK 0xFFFFF000 | 47 | #define EXYNOS5_SOC_MASK 0xFFFFF000 |
| 48 | 48 | ||
| 49 | #define IS_SAMSUNG_CPU(name, id, mask) \ | 49 | #define IS_SAMSUNG_CPU(name, id, mask) \ |
diff --git a/arch/powerpc/include/uapi/asm/kvm_para.h b/arch/powerpc/include/uapi/asm/kvm_para.h index ed0e0254b47f..e3af3286a068 100644 --- a/arch/powerpc/include/uapi/asm/kvm_para.h +++ b/arch/powerpc/include/uapi/asm/kvm_para.h | |||
| @@ -78,7 +78,7 @@ struct kvm_vcpu_arch_shared { | |||
| 78 | 78 | ||
| 79 | #define KVM_HCALL_TOKEN(num) _EV_HCALL_TOKEN(EV_KVM_VENDOR_ID, num) | 79 | #define KVM_HCALL_TOKEN(num) _EV_HCALL_TOKEN(EV_KVM_VENDOR_ID, num) |
| 80 | 80 | ||
| 81 | #include <uapi/asm/epapr_hcalls.h> | 81 | #include <asm/epapr_hcalls.h> |
| 82 | 82 | ||
| 83 | #define KVM_FEATURE_MAGIC_PAGE 1 | 83 | #define KVM_FEATURE_MAGIC_PAGE 1 |
| 84 | 84 | ||
diff --git a/arch/powerpc/kvm/book3s_hv_ras.c b/arch/powerpc/kvm/book3s_hv_ras.c index 35f3cf0269b3..a353c485808c 100644 --- a/arch/powerpc/kvm/book3s_hv_ras.c +++ b/arch/powerpc/kvm/book3s_hv_ras.c | |||
| @@ -79,7 +79,9 @@ static void flush_tlb_power7(struct kvm_vcpu *vcpu) | |||
| 79 | static long kvmppc_realmode_mc_power7(struct kvm_vcpu *vcpu) | 79 | static long kvmppc_realmode_mc_power7(struct kvm_vcpu *vcpu) |
| 80 | { | 80 | { |
| 81 | unsigned long srr1 = vcpu->arch.shregs.msr; | 81 | unsigned long srr1 = vcpu->arch.shregs.msr; |
| 82 | #ifdef CONFIG_PPC_POWERNV | ||
| 82 | struct opal_machine_check_event *opal_evt; | 83 | struct opal_machine_check_event *opal_evt; |
| 84 | #endif | ||
| 83 | long handled = 1; | 85 | long handled = 1; |
| 84 | 86 | ||
| 85 | if (srr1 & SRR1_MC_LDSTERR) { | 87 | if (srr1 & SRR1_MC_LDSTERR) { |
| @@ -117,6 +119,7 @@ static long kvmppc_realmode_mc_power7(struct kvm_vcpu *vcpu) | |||
| 117 | handled = 0; | 119 | handled = 0; |
| 118 | } | 120 | } |
| 119 | 121 | ||
| 122 | #ifdef CONFIG_PPC_POWERNV | ||
| 120 | /* | 123 | /* |
| 121 | * See if OPAL has already handled the condition. | 124 | * See if OPAL has already handled the condition. |
| 122 | * We assume that if the condition is recovered then OPAL | 125 | * We assume that if the condition is recovered then OPAL |
| @@ -131,6 +134,7 @@ static long kvmppc_realmode_mc_power7(struct kvm_vcpu *vcpu) | |||
| 131 | 134 | ||
| 132 | if (handled) | 135 | if (handled) |
| 133 | opal_evt->in_use = 0; | 136 | opal_evt->in_use = 0; |
| 137 | #endif | ||
| 134 | 138 | ||
| 135 | return handled; | 139 | return handled; |
| 136 | } | 140 | } |
diff --git a/arch/s390/include/asm/dma.h b/arch/s390/include/asm/dma.h index de015d85e3e5..bb9bdcd20864 100644 --- a/arch/s390/include/asm/dma.h +++ b/arch/s390/include/asm/dma.h | |||
| @@ -10,4 +10,10 @@ | |||
| 10 | */ | 10 | */ |
| 11 | #define MAX_DMA_ADDRESS 0x80000000 | 11 | #define MAX_DMA_ADDRESS 0x80000000 |
| 12 | 12 | ||
| 13 | #ifdef CONFIG_PCI | ||
| 14 | extern int isa_dma_bridge_buggy; | ||
| 15 | #else | ||
| 16 | #define isa_dma_bridge_buggy (0) | ||
| 17 | #endif | ||
| 18 | |||
| 13 | #endif /* _ASM_S390_DMA_H */ | 19 | #endif /* _ASM_S390_DMA_H */ |
diff --git a/arch/s390/include/asm/io.h b/arch/s390/include/asm/io.h index 16c3eb164f4f..27cb32185ce1 100644 --- a/arch/s390/include/asm/io.h +++ b/arch/s390/include/asm/io.h | |||
| @@ -85,6 +85,11 @@ static inline void iounmap(volatile void __iomem *addr) | |||
| 85 | #define __raw_writel zpci_write_u32 | 85 | #define __raw_writel zpci_write_u32 |
| 86 | #define __raw_writeq zpci_write_u64 | 86 | #define __raw_writeq zpci_write_u64 |
| 87 | 87 | ||
| 88 | #define readb_relaxed readb | ||
| 89 | #define readw_relaxed readw | ||
| 90 | #define readl_relaxed readl | ||
| 91 | #define readq_relaxed readq | ||
| 92 | |||
| 88 | #endif /* CONFIG_PCI */ | 93 | #endif /* CONFIG_PCI */ |
| 89 | 94 | ||
| 90 | #include <asm-generic/io.h> | 95 | #include <asm-generic/io.h> |
diff --git a/arch/s390/include/asm/irq.h b/arch/s390/include/asm/irq.h index e6972f85d2b0..7def77302d63 100644 --- a/arch/s390/include/asm/irq.h +++ b/arch/s390/include/asm/irq.h | |||
| @@ -2,43 +2,61 @@ | |||
| 2 | #define _ASM_IRQ_H | 2 | #define _ASM_IRQ_H |
| 3 | 3 | ||
| 4 | #include <linux/hardirq.h> | 4 | #include <linux/hardirq.h> |
| 5 | #include <linux/percpu.h> | ||
| 6 | #include <linux/cache.h> | ||
| 5 | #include <linux/types.h> | 7 | #include <linux/types.h> |
| 6 | 8 | ||
| 7 | enum interruption_class { | 9 | enum interruption_main_class { |
| 8 | EXTERNAL_INTERRUPT, | 10 | EXTERNAL_INTERRUPT, |
| 9 | IO_INTERRUPT, | 11 | IO_INTERRUPT, |
| 10 | EXTINT_CLK, | 12 | NR_IRQS |
| 11 | EXTINT_EXC, | 13 | }; |
| 12 | EXTINT_EMS, | 14 | |
| 13 | EXTINT_TMR, | 15 | enum interruption_class { |
| 14 | EXTINT_TLA, | 16 | IRQEXT_CLK, |
| 15 | EXTINT_PFL, | 17 | IRQEXT_EXC, |
| 16 | EXTINT_DSD, | 18 | IRQEXT_EMS, |
| 17 | EXTINT_VRT, | 19 | IRQEXT_TMR, |
| 18 | EXTINT_SCP, | 20 | IRQEXT_TLA, |
| 19 | EXTINT_IUC, | 21 | IRQEXT_PFL, |
| 20 | EXTINT_CMS, | 22 | IRQEXT_DSD, |
| 21 | EXTINT_CMC, | 23 | IRQEXT_VRT, |
| 22 | EXTINT_CMR, | 24 | IRQEXT_SCP, |
| 23 | IOINT_CIO, | 25 | IRQEXT_IUC, |
| 24 | IOINT_QAI, | 26 | IRQEXT_CMS, |
| 25 | IOINT_DAS, | 27 | IRQEXT_CMC, |
| 26 | IOINT_C15, | 28 | IRQEXT_CMR, |
| 27 | IOINT_C70, | 29 | IRQIO_CIO, |
| 28 | IOINT_TAP, | 30 | IRQIO_QAI, |
| 29 | IOINT_VMR, | 31 | IRQIO_DAS, |
| 30 | IOINT_LCS, | 32 | IRQIO_C15, |
| 31 | IOINT_CLW, | 33 | IRQIO_C70, |
| 32 | IOINT_CTC, | 34 | IRQIO_TAP, |
| 33 | IOINT_APB, | 35 | IRQIO_VMR, |
| 34 | IOINT_ADM, | 36 | IRQIO_LCS, |
| 35 | IOINT_CSC, | 37 | IRQIO_CLW, |
| 36 | IOINT_PCI, | 38 | IRQIO_CTC, |
| 37 | IOINT_MSI, | 39 | IRQIO_APB, |
| 40 | IRQIO_ADM, | ||
| 41 | IRQIO_CSC, | ||
| 42 | IRQIO_PCI, | ||
| 43 | IRQIO_MSI, | ||
| 38 | NMI_NMI, | 44 | NMI_NMI, |
| 39 | NR_IRQS, | 45 | CPU_RST, |
| 46 | NR_ARCH_IRQS | ||
| 40 | }; | 47 | }; |
| 41 | 48 | ||
| 49 | struct irq_stat { | ||
| 50 | unsigned int irqs[NR_ARCH_IRQS]; | ||
| 51 | }; | ||
| 52 | |||
| 53 | DECLARE_PER_CPU_SHARED_ALIGNED(struct irq_stat, irq_stat); | ||
| 54 | |||
| 55 | static __always_inline void inc_irq_stat(enum interruption_class irq) | ||
| 56 | { | ||
| 57 | __get_cpu_var(irq_stat).irqs[irq]++; | ||
| 58 | } | ||
| 59 | |||
| 42 | struct ext_code { | 60 | struct ext_code { |
| 43 | unsigned short subcode; | 61 | unsigned short subcode; |
| 44 | unsigned short code; | 62 | unsigned short code; |
diff --git a/arch/s390/include/uapi/asm/unistd.h b/arch/s390/include/uapi/asm/unistd.h index 63e6078699f1..864f693c237f 100644 --- a/arch/s390/include/uapi/asm/unistd.h +++ b/arch/s390/include/uapi/asm/unistd.h | |||
| @@ -279,7 +279,8 @@ | |||
| 279 | #define __NR_process_vm_writev 341 | 279 | #define __NR_process_vm_writev 341 |
| 280 | #define __NR_s390_runtime_instr 342 | 280 | #define __NR_s390_runtime_instr 342 |
| 281 | #define __NR_kcmp 343 | 281 | #define __NR_kcmp 343 |
| 282 | #define NR_syscalls 344 | 282 | #define __NR_finit_module 344 |
| 283 | #define NR_syscalls 345 | ||
| 283 | 284 | ||
| 284 | /* | 285 | /* |
| 285 | * There are some system calls that are not present on 64 bit, some | 286 | * There are some system calls that are not present on 64 bit, some |
diff --git a/arch/s390/kernel/compat_wrapper.S b/arch/s390/kernel/compat_wrapper.S index 827e094a2f49..9b9a805656b5 100644 --- a/arch/s390/kernel/compat_wrapper.S +++ b/arch/s390/kernel/compat_wrapper.S | |||
| @@ -1659,3 +1659,9 @@ ENTRY(sys_kcmp_wrapper) | |||
| 1659 | llgfr %r5,%r5 # unsigned long | 1659 | llgfr %r5,%r5 # unsigned long |
| 1660 | llgfr %r6,%r6 # unsigned long | 1660 | llgfr %r6,%r6 # unsigned long |
| 1661 | jg sys_kcmp | 1661 | jg sys_kcmp |
| 1662 | |||
| 1663 | ENTRY(sys_finit_module_wrapper) | ||
| 1664 | lgfr %r2,%r2 # int | ||
| 1665 | llgtr %r3,%r3 # const char __user * | ||
| 1666 | lgfr %r4,%r4 # int | ||
| 1667 | jg sys_finit_module | ||
diff --git a/arch/s390/kernel/debug.c b/arch/s390/kernel/debug.c index ba500d8dc392..4e8215e0d4b6 100644 --- a/arch/s390/kernel/debug.c +++ b/arch/s390/kernel/debug.c | |||
| @@ -1127,13 +1127,14 @@ debug_register_view(debug_info_t * id, struct debug_view *view) | |||
| 1127 | if (i == DEBUG_MAX_VIEWS) { | 1127 | if (i == DEBUG_MAX_VIEWS) { |
| 1128 | pr_err("Registering view %s/%s would exceed the maximum " | 1128 | pr_err("Registering view %s/%s would exceed the maximum " |
| 1129 | "number of views %i\n", id->name, view->name, i); | 1129 | "number of views %i\n", id->name, view->name, i); |
| 1130 | debugfs_remove(pde); | ||
| 1131 | rc = -1; | 1130 | rc = -1; |
| 1132 | } else { | 1131 | } else { |
| 1133 | id->views[i] = view; | 1132 | id->views[i] = view; |
| 1134 | id->debugfs_entries[i] = pde; | 1133 | id->debugfs_entries[i] = pde; |
| 1135 | } | 1134 | } |
| 1136 | spin_unlock_irqrestore(&id->lock, flags); | 1135 | spin_unlock_irqrestore(&id->lock, flags); |
| 1136 | if (rc) | ||
| 1137 | debugfs_remove(pde); | ||
| 1137 | out: | 1138 | out: |
| 1138 | return rc; | 1139 | return rc; |
| 1139 | } | 1140 | } |
| @@ -1146,9 +1147,9 @@ EXPORT_SYMBOL(debug_register_view); | |||
| 1146 | int | 1147 | int |
| 1147 | debug_unregister_view(debug_info_t * id, struct debug_view *view) | 1148 | debug_unregister_view(debug_info_t * id, struct debug_view *view) |
| 1148 | { | 1149 | { |
| 1149 | int rc = 0; | 1150 | struct dentry *dentry = NULL; |
| 1150 | int i; | ||
| 1151 | unsigned long flags; | 1151 | unsigned long flags; |
| 1152 | int i, rc = 0; | ||
| 1152 | 1153 | ||
| 1153 | if (!id) | 1154 | if (!id) |
| 1154 | goto out; | 1155 | goto out; |
| @@ -1160,10 +1161,12 @@ debug_unregister_view(debug_info_t * id, struct debug_view *view) | |||
| 1160 | if (i == DEBUG_MAX_VIEWS) | 1161 | if (i == DEBUG_MAX_VIEWS) |
| 1161 | rc = -1; | 1162 | rc = -1; |
| 1162 | else { | 1163 | else { |
| 1163 | debugfs_remove(id->debugfs_entries[i]); | 1164 | dentry = id->debugfs_entries[i]; |
| 1164 | id->views[i] = NULL; | 1165 | id->views[i] = NULL; |
| 1166 | id->debugfs_entries[i] = NULL; | ||
| 1165 | } | 1167 | } |
| 1166 | spin_unlock_irqrestore(&id->lock, flags); | 1168 | spin_unlock_irqrestore(&id->lock, flags); |
| 1169 | debugfs_remove(dentry); | ||
| 1167 | out: | 1170 | out: |
| 1168 | return rc; | 1171 | return rc; |
| 1169 | } | 1172 | } |
diff --git a/arch/s390/kernel/irq.c b/arch/s390/kernel/irq.c index bf24293970ce..9df824ea1667 100644 --- a/arch/s390/kernel/irq.c +++ b/arch/s390/kernel/irq.c | |||
| @@ -24,43 +24,65 @@ | |||
| 24 | #include <asm/irq.h> | 24 | #include <asm/irq.h> |
| 25 | #include "entry.h" | 25 | #include "entry.h" |
| 26 | 26 | ||
| 27 | DEFINE_PER_CPU_SHARED_ALIGNED(struct irq_stat, irq_stat); | ||
| 28 | EXPORT_PER_CPU_SYMBOL_GPL(irq_stat); | ||
| 29 | |||
| 27 | struct irq_class { | 30 | struct irq_class { |
| 28 | char *name; | 31 | char *name; |
| 29 | char *desc; | 32 | char *desc; |
| 30 | }; | 33 | }; |
| 31 | 34 | ||
| 32 | static const struct irq_class intrclass_names[] = { | 35 | /* |
| 36 | * The list of "main" irq classes on s390. This is the list of interrrupts | ||
| 37 | * that appear both in /proc/stat ("intr" line) and /proc/interrupts. | ||
| 38 | * Historically only external and I/O interrupts have been part of /proc/stat. | ||
| 39 | * We can't add the split external and I/O sub classes since the first field | ||
| 40 | * in the "intr" line in /proc/stat is supposed to be the sum of all other | ||
| 41 | * fields. | ||
| 42 | * Since the external and I/O interrupt fields are already sums we would end | ||
| 43 | * up with having a sum which accounts each interrupt twice. | ||
| 44 | */ | ||
| 45 | static const struct irq_class irqclass_main_desc[NR_IRQS] = { | ||
| 33 | [EXTERNAL_INTERRUPT] = {.name = "EXT"}, | 46 | [EXTERNAL_INTERRUPT] = {.name = "EXT"}, |
| 34 | [IO_INTERRUPT] = {.name = "I/O"}, | 47 | [IO_INTERRUPT] = {.name = "I/O"} |
| 35 | [EXTINT_CLK] = {.name = "CLK", .desc = "[EXT] Clock Comparator"}, | 48 | }; |
| 36 | [EXTINT_EXC] = {.name = "EXC", .desc = "[EXT] External Call"}, | 49 | |
| 37 | [EXTINT_EMS] = {.name = "EMS", .desc = "[EXT] Emergency Signal"}, | 50 | /* |
| 38 | [EXTINT_TMR] = {.name = "TMR", .desc = "[EXT] CPU Timer"}, | 51 | * The list of split external and I/O interrupts that appear only in |
| 39 | [EXTINT_TLA] = {.name = "TAL", .desc = "[EXT] Timing Alert"}, | 52 | * /proc/interrupts. |
| 40 | [EXTINT_PFL] = {.name = "PFL", .desc = "[EXT] Pseudo Page Fault"}, | 53 | * In addition this list contains non external / I/O events like NMIs. |
| 41 | [EXTINT_DSD] = {.name = "DSD", .desc = "[EXT] DASD Diag"}, | 54 | */ |
| 42 | [EXTINT_VRT] = {.name = "VRT", .desc = "[EXT] Virtio"}, | 55 | static const struct irq_class irqclass_sub_desc[NR_ARCH_IRQS] = { |
| 43 | [EXTINT_SCP] = {.name = "SCP", .desc = "[EXT] Service Call"}, | 56 | [IRQEXT_CLK] = {.name = "CLK", .desc = "[EXT] Clock Comparator"}, |
| 44 | [EXTINT_IUC] = {.name = "IUC", .desc = "[EXT] IUCV"}, | 57 | [IRQEXT_EXC] = {.name = "EXC", .desc = "[EXT] External Call"}, |
| 45 | [EXTINT_CMS] = {.name = "CMS", .desc = "[EXT] CPU-Measurement: Sampling"}, | 58 | [IRQEXT_EMS] = {.name = "EMS", .desc = "[EXT] Emergency Signal"}, |
| 46 | [EXTINT_CMC] = {.name = "CMC", .desc = "[EXT] CPU-Measurement: Counter"}, | 59 | [IRQEXT_TMR] = {.name = "TMR", .desc = "[EXT] CPU Timer"}, |
| 47 | [EXTINT_CMR] = {.name = "CMR", .desc = "[EXT] CPU-Measurement: RI"}, | 60 | [IRQEXT_TLA] = {.name = "TAL", .desc = "[EXT] Timing Alert"}, |
| 48 | [IOINT_CIO] = {.name = "CIO", .desc = "[I/O] Common I/O Layer Interrupt"}, | 61 | [IRQEXT_PFL] = {.name = "PFL", .desc = "[EXT] Pseudo Page Fault"}, |
| 49 | [IOINT_QAI] = {.name = "QAI", .desc = "[I/O] QDIO Adapter Interrupt"}, | 62 | [IRQEXT_DSD] = {.name = "DSD", .desc = "[EXT] DASD Diag"}, |
| 50 | [IOINT_DAS] = {.name = "DAS", .desc = "[I/O] DASD"}, | 63 | [IRQEXT_VRT] = {.name = "VRT", .desc = "[EXT] Virtio"}, |
| 51 | [IOINT_C15] = {.name = "C15", .desc = "[I/O] 3215"}, | 64 | [IRQEXT_SCP] = {.name = "SCP", .desc = "[EXT] Service Call"}, |
| 52 | [IOINT_C70] = {.name = "C70", .desc = "[I/O] 3270"}, | 65 | [IRQEXT_IUC] = {.name = "IUC", .desc = "[EXT] IUCV"}, |
| 53 | [IOINT_TAP] = {.name = "TAP", .desc = "[I/O] Tape"}, | 66 | [IRQEXT_CMS] = {.name = "CMS", .desc = "[EXT] CPU-Measurement: Sampling"}, |
| 54 | [IOINT_VMR] = {.name = "VMR", .desc = "[I/O] Unit Record Devices"}, | 67 | [IRQEXT_CMC] = {.name = "CMC", .desc = "[EXT] CPU-Measurement: Counter"}, |
| 55 | [IOINT_LCS] = {.name = "LCS", .desc = "[I/O] LCS"}, | 68 | [IRQEXT_CMR] = {.name = "CMR", .desc = "[EXT] CPU-Measurement: RI"}, |
| 56 | [IOINT_CLW] = {.name = "CLW", .desc = "[I/O] CLAW"}, | 69 | [IRQIO_CIO] = {.name = "CIO", .desc = "[I/O] Common I/O Layer Interrupt"}, |
| 57 | [IOINT_CTC] = {.name = "CTC", .desc = "[I/O] CTC"}, | 70 | [IRQIO_QAI] = {.name = "QAI", .desc = "[I/O] QDIO Adapter Interrupt"}, |
| 58 | [IOINT_APB] = {.name = "APB", .desc = "[I/O] AP Bus"}, | 71 | [IRQIO_DAS] = {.name = "DAS", .desc = "[I/O] DASD"}, |
| 59 | [IOINT_ADM] = {.name = "ADM", .desc = "[I/O] EADM Subchannel"}, | 72 | [IRQIO_C15] = {.name = "C15", .desc = "[I/O] 3215"}, |
| 60 | [IOINT_CSC] = {.name = "CSC", .desc = "[I/O] CHSC Subchannel"}, | 73 | [IRQIO_C70] = {.name = "C70", .desc = "[I/O] 3270"}, |
| 61 | [IOINT_PCI] = {.name = "PCI", .desc = "[I/O] PCI Interrupt" }, | 74 | [IRQIO_TAP] = {.name = "TAP", .desc = "[I/O] Tape"}, |
| 62 | [IOINT_MSI] = {.name = "MSI", .desc = "[I/O] MSI Interrupt" }, | 75 | [IRQIO_VMR] = {.name = "VMR", .desc = "[I/O] Unit Record Devices"}, |
| 76 | [IRQIO_LCS] = {.name = "LCS", .desc = "[I/O] LCS"}, | ||
| 77 | [IRQIO_CLW] = {.name = "CLW", .desc = "[I/O] CLAW"}, | ||
| 78 | [IRQIO_CTC] = {.name = "CTC", .desc = "[I/O] CTC"}, | ||
| 79 | [IRQIO_APB] = {.name = "APB", .desc = "[I/O] AP Bus"}, | ||
| 80 | [IRQIO_ADM] = {.name = "ADM", .desc = "[I/O] EADM Subchannel"}, | ||
| 81 | [IRQIO_CSC] = {.name = "CSC", .desc = "[I/O] CHSC Subchannel"}, | ||
| 82 | [IRQIO_PCI] = {.name = "PCI", .desc = "[I/O] PCI Interrupt" }, | ||
| 83 | [IRQIO_MSI] = {.name = "MSI", .desc = "[I/O] MSI Interrupt" }, | ||
| 63 | [NMI_NMI] = {.name = "NMI", .desc = "[NMI] Machine Check"}, | 84 | [NMI_NMI] = {.name = "NMI", .desc = "[NMI] Machine Check"}, |
| 85 | [CPU_RST] = {.name = "RST", .desc = "[CPU] CPU Restart"}, | ||
| 64 | }; | 86 | }; |
| 65 | 87 | ||
| 66 | /* | 88 | /* |
| @@ -68,30 +90,34 @@ static const struct irq_class intrclass_names[] = { | |||
| 68 | */ | 90 | */ |
| 69 | int show_interrupts(struct seq_file *p, void *v) | 91 | int show_interrupts(struct seq_file *p, void *v) |
| 70 | { | 92 | { |
| 71 | int i = *(loff_t *) v, j; | 93 | int irq = *(loff_t *) v; |
| 94 | int cpu; | ||
| 72 | 95 | ||
| 73 | get_online_cpus(); | 96 | get_online_cpus(); |
| 74 | if (i == 0) { | 97 | if (irq == 0) { |
| 75 | seq_puts(p, " "); | 98 | seq_puts(p, " "); |
| 76 | for_each_online_cpu(j) | 99 | for_each_online_cpu(cpu) |
| 77 | seq_printf(p, "CPU%d ",j); | 100 | seq_printf(p, "CPU%d ", cpu); |
| 78 | seq_putc(p, '\n'); | 101 | seq_putc(p, '\n'); |
| 79 | } | 102 | } |
| 80 | 103 | if (irq < NR_IRQS) { | |
| 81 | if (i < NR_IRQS) { | 104 | seq_printf(p, "%s: ", irqclass_main_desc[irq].name); |
| 82 | seq_printf(p, "%s: ", intrclass_names[i].name); | 105 | for_each_online_cpu(cpu) |
| 83 | #ifndef CONFIG_SMP | 106 | seq_printf(p, "%10u ", kstat_cpu(cpu).irqs[irq]); |
| 84 | seq_printf(p, "%10u ", kstat_irqs(i)); | 107 | seq_putc(p, '\n'); |
| 85 | #else | 108 | goto skip_arch_irqs; |
| 86 | for_each_online_cpu(j) | 109 | } |
| 87 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); | 110 | for (irq = 0; irq < NR_ARCH_IRQS; irq++) { |
| 88 | #endif | 111 | seq_printf(p, "%s: ", irqclass_sub_desc[irq].name); |
| 89 | if (intrclass_names[i].desc) | 112 | for_each_online_cpu(cpu) |
| 90 | seq_printf(p, " %s", intrclass_names[i].desc); | 113 | seq_printf(p, "%10u ", per_cpu(irq_stat, cpu).irqs[irq]); |
| 91 | seq_putc(p, '\n'); | 114 | if (irqclass_sub_desc[irq].desc) |
| 92 | } | 115 | seq_printf(p, " %s", irqclass_sub_desc[irq].desc); |
| 116 | seq_putc(p, '\n'); | ||
| 117 | } | ||
| 118 | skip_arch_irqs: | ||
| 93 | put_online_cpus(); | 119 | put_online_cpus(); |
| 94 | return 0; | 120 | return 0; |
| 95 | } | 121 | } |
| 96 | 122 | ||
| 97 | /* | 123 | /* |
| @@ -222,7 +248,7 @@ void __irq_entry do_extint(struct pt_regs *regs, struct ext_code ext_code, | |||
| 222 | /* Serve timer interrupts first. */ | 248 | /* Serve timer interrupts first. */ |
| 223 | clock_comparator_work(); | 249 | clock_comparator_work(); |
| 224 | } | 250 | } |
| 225 | kstat_cpu(smp_processor_id()).irqs[EXTERNAL_INTERRUPT]++; | 251 | kstat_incr_irqs_this_cpu(EXTERNAL_INTERRUPT, NULL); |
| 226 | if (ext_code.code != 0x1004) | 252 | if (ext_code.code != 0x1004) |
| 227 | __get_cpu_var(s390_idle).nohz_delay = 1; | 253 | __get_cpu_var(s390_idle).nohz_delay = 1; |
| 228 | 254 | ||
diff --git a/arch/s390/kernel/nmi.c b/arch/s390/kernel/nmi.c index a6daa5c5cdb0..7918fbea36bb 100644 --- a/arch/s390/kernel/nmi.c +++ b/arch/s390/kernel/nmi.c | |||
| @@ -254,7 +254,7 @@ void notrace s390_do_machine_check(struct pt_regs *regs) | |||
| 254 | int umode; | 254 | int umode; |
| 255 | 255 | ||
| 256 | nmi_enter(); | 256 | nmi_enter(); |
| 257 | kstat_cpu(smp_processor_id()).irqs[NMI_NMI]++; | 257 | inc_irq_stat(NMI_NMI); |
| 258 | mci = (struct mci *) &S390_lowcore.mcck_interruption_code; | 258 | mci = (struct mci *) &S390_lowcore.mcck_interruption_code; |
| 259 | mcck = &__get_cpu_var(cpu_mcck); | 259 | mcck = &__get_cpu_var(cpu_mcck); |
| 260 | umode = user_mode(regs); | 260 | umode = user_mode(regs); |
diff --git a/arch/s390/kernel/perf_cpum_cf.c b/arch/s390/kernel/perf_cpum_cf.c index c4e7269d4a09..86ec7447e1f5 100644 --- a/arch/s390/kernel/perf_cpum_cf.c +++ b/arch/s390/kernel/perf_cpum_cf.c | |||
| @@ -229,7 +229,7 @@ static void cpumf_measurement_alert(struct ext_code ext_code, | |||
| 229 | if (!(alert & CPU_MF_INT_CF_MASK)) | 229 | if (!(alert & CPU_MF_INT_CF_MASK)) |
| 230 | return; | 230 | return; |
| 231 | 231 | ||
| 232 | kstat_cpu(smp_processor_id()).irqs[EXTINT_CMC]++; | 232 | inc_irq_stat(IRQEXT_CMC); |
| 233 | cpuhw = &__get_cpu_var(cpu_hw_events); | 233 | cpuhw = &__get_cpu_var(cpu_hw_events); |
| 234 | 234 | ||
| 235 | /* Measurement alerts are shared and might happen when the PMU | 235 | /* Measurement alerts are shared and might happen when the PMU |
diff --git a/arch/s390/kernel/runtime_instr.c b/arch/s390/kernel/runtime_instr.c index 61066f6f71a5..077a99389b07 100644 --- a/arch/s390/kernel/runtime_instr.c +++ b/arch/s390/kernel/runtime_instr.c | |||
| @@ -71,7 +71,7 @@ static void runtime_instr_int_handler(struct ext_code ext_code, | |||
| 71 | if (!(param32 & CPU_MF_INT_RI_MASK)) | 71 | if (!(param32 & CPU_MF_INT_RI_MASK)) |
| 72 | return; | 72 | return; |
| 73 | 73 | ||
| 74 | kstat_cpu(smp_processor_id()).irqs[EXTINT_CMR]++; | 74 | inc_irq_stat(IRQEXT_CMR); |
| 75 | 75 | ||
| 76 | if (!current->thread.ri_cb) | 76 | if (!current->thread.ri_cb) |
| 77 | return; | 77 | return; |
diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c index 2568590973ad..a5360de85ec7 100644 --- a/arch/s390/kernel/setup.c +++ b/arch/s390/kernel/setup.c | |||
| @@ -16,7 +16,7 @@ | |||
| 16 | #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt | 16 | #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt |
| 17 | 17 | ||
| 18 | #include <linux/errno.h> | 18 | #include <linux/errno.h> |
| 19 | #include <linux/module.h> | 19 | #include <linux/export.h> |
| 20 | #include <linux/sched.h> | 20 | #include <linux/sched.h> |
| 21 | #include <linux/kernel.h> | 21 | #include <linux/kernel.h> |
| 22 | #include <linux/memblock.h> | 22 | #include <linux/memblock.h> |
| @@ -289,6 +289,7 @@ void machine_power_off(void) | |||
| 289 | * Dummy power off function. | 289 | * Dummy power off function. |
| 290 | */ | 290 | */ |
| 291 | void (*pm_power_off)(void) = machine_power_off; | 291 | void (*pm_power_off)(void) = machine_power_off; |
| 292 | EXPORT_SYMBOL_GPL(pm_power_off); | ||
| 292 | 293 | ||
| 293 | static int __init early_parse_mem(char *p) | 294 | static int __init early_parse_mem(char *p) |
| 294 | { | 295 | { |
diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c index 0b45baa55438..7433a2f9e5cc 100644 --- a/arch/s390/kernel/smp.c +++ b/arch/s390/kernel/smp.c | |||
| @@ -433,9 +433,9 @@ static void do_ext_call_interrupt(struct ext_code ext_code, | |||
| 433 | 433 | ||
| 434 | cpu = smp_processor_id(); | 434 | cpu = smp_processor_id(); |
| 435 | if (ext_code.code == 0x1202) | 435 | if (ext_code.code == 0x1202) |
| 436 | kstat_cpu(cpu).irqs[EXTINT_EXC]++; | 436 | inc_irq_stat(IRQEXT_EXC); |
| 437 | else | 437 | else |
| 438 | kstat_cpu(cpu).irqs[EXTINT_EMS]++; | 438 | inc_irq_stat(IRQEXT_EMS); |
| 439 | /* | 439 | /* |
| 440 | * handle bit signal external calls | 440 | * handle bit signal external calls |
| 441 | */ | 441 | */ |
| @@ -623,9 +623,10 @@ static struct sclp_cpu_info *smp_get_cpu_info(void) | |||
| 623 | return info; | 623 | return info; |
| 624 | } | 624 | } |
| 625 | 625 | ||
| 626 | static int smp_add_present_cpu(int cpu); | 626 | static int __cpuinit smp_add_present_cpu(int cpu); |
| 627 | 627 | ||
| 628 | static int __smp_rescan_cpus(struct sclp_cpu_info *info, int sysfs_add) | 628 | static int __cpuinit __smp_rescan_cpus(struct sclp_cpu_info *info, |
| 629 | int sysfs_add) | ||
| 629 | { | 630 | { |
| 630 | struct pcpu *pcpu; | 631 | struct pcpu *pcpu; |
| 631 | cpumask_t avail; | 632 | cpumask_t avail; |
| @@ -708,6 +709,7 @@ static void __cpuinit smp_start_secondary(void *cpuvoid) | |||
| 708 | pfault_init(); | 709 | pfault_init(); |
| 709 | notify_cpu_starting(smp_processor_id()); | 710 | notify_cpu_starting(smp_processor_id()); |
| 710 | set_cpu_online(smp_processor_id(), true); | 711 | set_cpu_online(smp_processor_id(), true); |
| 712 | inc_irq_stat(CPU_RST); | ||
| 711 | local_irq_enable(); | 713 | local_irq_enable(); |
| 712 | /* cpu_idle will call schedule for us */ | 714 | /* cpu_idle will call schedule for us */ |
| 713 | cpu_idle(); | 715 | cpu_idle(); |
| @@ -985,7 +987,7 @@ static int __cpuinit smp_cpu_notify(struct notifier_block *self, | |||
| 985 | return notifier_from_errno(err); | 987 | return notifier_from_errno(err); |
| 986 | } | 988 | } |
| 987 | 989 | ||
| 988 | static int smp_add_present_cpu(int cpu) | 990 | static int __cpuinit smp_add_present_cpu(int cpu) |
| 989 | { | 991 | { |
| 990 | struct cpu *c = &pcpu_devices[cpu].cpu; | 992 | struct cpu *c = &pcpu_devices[cpu].cpu; |
| 991 | struct device *s = &c->dev; | 993 | struct device *s = &c->dev; |
diff --git a/arch/s390/kernel/syscalls.S b/arch/s390/kernel/syscalls.S index 48174850f3b0..6a6c61f94dd3 100644 --- a/arch/s390/kernel/syscalls.S +++ b/arch/s390/kernel/syscalls.S | |||
| @@ -352,3 +352,4 @@ SYSCALL(sys_process_vm_readv,sys_process_vm_readv,compat_sys_process_vm_readv_wr | |||
| 352 | SYSCALL(sys_process_vm_writev,sys_process_vm_writev,compat_sys_process_vm_writev_wrapper) | 352 | SYSCALL(sys_process_vm_writev,sys_process_vm_writev,compat_sys_process_vm_writev_wrapper) |
| 353 | SYSCALL(sys_ni_syscall,sys_s390_runtime_instr,sys_s390_runtime_instr_wrapper) | 353 | SYSCALL(sys_ni_syscall,sys_s390_runtime_instr,sys_s390_runtime_instr_wrapper) |
| 354 | SYSCALL(sys_kcmp,sys_kcmp,sys_kcmp_wrapper) | 354 | SYSCALL(sys_kcmp,sys_kcmp,sys_kcmp_wrapper) |
| 355 | SYSCALL(sys_finit_module,sys_finit_module,sys_finit_module_wrapper) | ||
diff --git a/arch/s390/kernel/time.c b/arch/s390/kernel/time.c index 7fcd690d42c7..aff0e350d776 100644 --- a/arch/s390/kernel/time.c +++ b/arch/s390/kernel/time.c | |||
| @@ -168,7 +168,7 @@ static void clock_comparator_interrupt(struct ext_code ext_code, | |||
| 168 | unsigned int param32, | 168 | unsigned int param32, |
| 169 | unsigned long param64) | 169 | unsigned long param64) |
| 170 | { | 170 | { |
| 171 | kstat_cpu(smp_processor_id()).irqs[EXTINT_CLK]++; | 171 | inc_irq_stat(IRQEXT_CLK); |
| 172 | if (S390_lowcore.clock_comparator == -1ULL) | 172 | if (S390_lowcore.clock_comparator == -1ULL) |
| 173 | set_clock_comparator(S390_lowcore.clock_comparator); | 173 | set_clock_comparator(S390_lowcore.clock_comparator); |
| 174 | } | 174 | } |
| @@ -179,7 +179,7 @@ static void stp_timing_alert(struct stp_irq_parm *); | |||
| 179 | static void timing_alert_interrupt(struct ext_code ext_code, | 179 | static void timing_alert_interrupt(struct ext_code ext_code, |
| 180 | unsigned int param32, unsigned long param64) | 180 | unsigned int param32, unsigned long param64) |
| 181 | { | 181 | { |
| 182 | kstat_cpu(smp_processor_id()).irqs[EXTINT_TLA]++; | 182 | inc_irq_stat(IRQEXT_TLA); |
| 183 | if (param32 & 0x00c40000) | 183 | if (param32 & 0x00c40000) |
| 184 | etr_timing_alert((struct etr_irq_parm *) ¶m32); | 184 | etr_timing_alert((struct etr_irq_parm *) ¶m32); |
| 185 | if (param32 & 0x00038000) | 185 | if (param32 & 0x00038000) |
diff --git a/arch/s390/kernel/topology.c b/arch/s390/kernel/topology.c index f1aba87cceb8..4b2e3e317004 100644 --- a/arch/s390/kernel/topology.c +++ b/arch/s390/kernel/topology.c | |||
| @@ -10,6 +10,7 @@ | |||
| 10 | #include <linux/bootmem.h> | 10 | #include <linux/bootmem.h> |
| 11 | #include <linux/cpuset.h> | 11 | #include <linux/cpuset.h> |
| 12 | #include <linux/device.h> | 12 | #include <linux/device.h> |
| 13 | #include <linux/export.h> | ||
| 13 | #include <linux/kernel.h> | 14 | #include <linux/kernel.h> |
| 14 | #include <linux/sched.h> | 15 | #include <linux/sched.h> |
| 15 | #include <linux/init.h> | 16 | #include <linux/init.h> |
| @@ -42,6 +43,7 @@ static struct mask_info socket_info; | |||
| 42 | static struct mask_info book_info; | 43 | static struct mask_info book_info; |
| 43 | 44 | ||
| 44 | struct cpu_topology_s390 cpu_topology[NR_CPUS]; | 45 | struct cpu_topology_s390 cpu_topology[NR_CPUS]; |
| 46 | EXPORT_SYMBOL_GPL(cpu_topology); | ||
| 45 | 47 | ||
| 46 | static cpumask_t cpu_group_map(struct mask_info *info, unsigned int cpu) | 48 | static cpumask_t cpu_group_map(struct mask_info *info, unsigned int cpu) |
| 47 | { | 49 | { |
diff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c index 42601d6e166f..2fb9e63b8fc4 100644 --- a/arch/s390/mm/fault.c +++ b/arch/s390/mm/fault.c | |||
| @@ -569,7 +569,7 @@ static void pfault_interrupt(struct ext_code ext_code, | |||
| 569 | subcode = ext_code.subcode; | 569 | subcode = ext_code.subcode; |
| 570 | if ((subcode & 0xff00) != __SUBCODE_MASK) | 570 | if ((subcode & 0xff00) != __SUBCODE_MASK) |
| 571 | return; | 571 | return; |
| 572 | kstat_cpu(smp_processor_id()).irqs[EXTINT_PFL]++; | 572 | inc_irq_stat(IRQEXT_PFL); |
| 573 | /* Get the token (= pid of the affected task). */ | 573 | /* Get the token (= pid of the affected task). */ |
| 574 | pid = sizeof(void *) == 4 ? param32 : param64; | 574 | pid = sizeof(void *) == 4 ? param32 : param64; |
| 575 | rcu_read_lock(); | 575 | rcu_read_lock(); |
diff --git a/arch/s390/oprofile/hwsampler.c b/arch/s390/oprofile/hwsampler.c index 0cb385da202c..b5b2916895e0 100644 --- a/arch/s390/oprofile/hwsampler.c +++ b/arch/s390/oprofile/hwsampler.c | |||
| @@ -233,7 +233,7 @@ static void hws_ext_handler(struct ext_code ext_code, | |||
| 233 | if (!(param32 & CPU_MF_INT_SF_MASK)) | 233 | if (!(param32 & CPU_MF_INT_SF_MASK)) |
| 234 | return; | 234 | return; |
| 235 | 235 | ||
| 236 | kstat_cpu(smp_processor_id()).irqs[EXTINT_CMS]++; | 236 | inc_irq_stat(IRQEXT_CMS); |
| 237 | atomic_xchg(&cb->ext_params, atomic_read(&cb->ext_params) | param32); | 237 | atomic_xchg(&cb->ext_params, atomic_read(&cb->ext_params) | param32); |
| 238 | 238 | ||
| 239 | if (hws_wq) | 239 | if (hws_wq) |
diff --git a/arch/s390/pci/pci.c b/arch/s390/pci/pci.c index ff49427e9941..60e0372545d2 100644 --- a/arch/s390/pci/pci.c +++ b/arch/s390/pci/pci.c | |||
| @@ -160,35 +160,6 @@ int pci_proc_domain(struct pci_bus *bus) | |||
| 160 | } | 160 | } |
| 161 | EXPORT_SYMBOL_GPL(pci_proc_domain); | 161 | EXPORT_SYMBOL_GPL(pci_proc_domain); |
| 162 | 162 | ||
| 163 | /* Store PCI function information block */ | ||
| 164 | static int zpci_store_fib(struct zpci_dev *zdev, u8 *fc) | ||
| 165 | { | ||
| 166 | struct zpci_fib *fib; | ||
| 167 | u8 status, cc; | ||
| 168 | |||
| 169 | fib = (void *) get_zeroed_page(GFP_KERNEL); | ||
| 170 | if (!fib) | ||
| 171 | return -ENOMEM; | ||
| 172 | |||
| 173 | do { | ||
| 174 | cc = __stpcifc(zdev->fh, 0, fib, &status); | ||
| 175 | if (cc == 2) { | ||
| 176 | msleep(ZPCI_INSN_BUSY_DELAY); | ||
| 177 | memset(fib, 0, PAGE_SIZE); | ||
| 178 | } | ||
| 179 | } while (cc == 2); | ||
| 180 | |||
| 181 | if (cc) | ||
| 182 | pr_err_once("%s: cc: %u status: %u\n", | ||
| 183 | __func__, cc, status); | ||
| 184 | |||
| 185 | /* Return PCI function controls */ | ||
| 186 | *fc = fib->fc; | ||
| 187 | |||
| 188 | free_page((unsigned long) fib); | ||
| 189 | return (cc) ? -EIO : 0; | ||
| 190 | } | ||
| 191 | |||
| 192 | /* Modify PCI: Register adapter interruptions */ | 163 | /* Modify PCI: Register adapter interruptions */ |
| 193 | static int zpci_register_airq(struct zpci_dev *zdev, unsigned int aisb, | 164 | static int zpci_register_airq(struct zpci_dev *zdev, unsigned int aisb, |
| 194 | u64 aibv) | 165 | u64 aibv) |
| @@ -469,7 +440,7 @@ static void zpci_irq_handler(void *dont, void *need) | |||
| 469 | int rescan = 0, max = aisb_max; | 440 | int rescan = 0, max = aisb_max; |
| 470 | struct zdev_irq_map *imap; | 441 | struct zdev_irq_map *imap; |
| 471 | 442 | ||
| 472 | kstat_cpu(smp_processor_id()).irqs[IOINT_PCI]++; | 443 | inc_irq_stat(IRQIO_PCI); |
| 473 | sbit = start; | 444 | sbit = start; |
| 474 | 445 | ||
| 475 | scan: | 446 | scan: |
| @@ -481,7 +452,7 @@ scan: | |||
| 481 | /* find vector bit */ | 452 | /* find vector bit */ |
| 482 | imap = bucket->imap[sbit]; | 453 | imap = bucket->imap[sbit]; |
| 483 | for_each_set_bit_left(mbit, &imap->aibv, imap->msi_vecs) { | 454 | for_each_set_bit_left(mbit, &imap->aibv, imap->msi_vecs) { |
| 484 | kstat_cpu(smp_processor_id()).irqs[IOINT_MSI]++; | 455 | inc_irq_stat(IRQIO_MSI); |
| 485 | clear_bit(63 - mbit, &imap->aibv); | 456 | clear_bit(63 - mbit, &imap->aibv); |
| 486 | 457 | ||
| 487 | spin_lock(&imap->lock); | 458 | spin_lock(&imap->lock); |
diff --git a/arch/s390/pci/pci_dma.c b/arch/s390/pci/pci_dma.c index 6138468b420f..a547419907c3 100644 --- a/arch/s390/pci/pci_dma.c +++ b/arch/s390/pci/pci_dma.c | |||
| @@ -13,8 +13,6 @@ | |||
| 13 | #include <linux/pci.h> | 13 | #include <linux/pci.h> |
| 14 | #include <asm/pci_dma.h> | 14 | #include <asm/pci_dma.h> |
| 15 | 15 | ||
| 16 | static enum zpci_ioat_dtype zpci_ioat_dt = ZPCI_IOTA_RTTO; | ||
| 17 | |||
| 18 | static struct kmem_cache *dma_region_table_cache; | 16 | static struct kmem_cache *dma_region_table_cache; |
| 19 | static struct kmem_cache *dma_page_table_cache; | 17 | static struct kmem_cache *dma_page_table_cache; |
| 20 | 18 | ||
diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c index 08b973f64032..9c2bd8bd4b4c 100644 --- a/arch/x86/kernel/kvm.c +++ b/arch/x86/kernel/kvm.c | |||
| @@ -43,6 +43,7 @@ | |||
| 43 | #include <asm/apicdef.h> | 43 | #include <asm/apicdef.h> |
| 44 | #include <asm/hypervisor.h> | 44 | #include <asm/hypervisor.h> |
| 45 | #include <asm/kvm_guest.h> | 45 | #include <asm/kvm_guest.h> |
| 46 | #include <asm/context_tracking.h> | ||
| 46 | 47 | ||
| 47 | static int kvmapf = 1; | 48 | static int kvmapf = 1; |
| 48 | 49 | ||
| @@ -121,6 +122,8 @@ void kvm_async_pf_task_wait(u32 token) | |||
| 121 | struct kvm_task_sleep_node n, *e; | 122 | struct kvm_task_sleep_node n, *e; |
| 122 | DEFINE_WAIT(wait); | 123 | DEFINE_WAIT(wait); |
| 123 | 124 | ||
| 125 | rcu_irq_enter(); | ||
| 126 | |||
| 124 | spin_lock(&b->lock); | 127 | spin_lock(&b->lock); |
| 125 | e = _find_apf_task(b, token); | 128 | e = _find_apf_task(b, token); |
| 126 | if (e) { | 129 | if (e) { |
| @@ -128,6 +131,8 @@ void kvm_async_pf_task_wait(u32 token) | |||
| 128 | hlist_del(&e->link); | 131 | hlist_del(&e->link); |
| 129 | kfree(e); | 132 | kfree(e); |
| 130 | spin_unlock(&b->lock); | 133 | spin_unlock(&b->lock); |
| 134 | |||
| 135 | rcu_irq_exit(); | ||
| 131 | return; | 136 | return; |
| 132 | } | 137 | } |
| 133 | 138 | ||
| @@ -152,13 +157,16 @@ void kvm_async_pf_task_wait(u32 token) | |||
| 152 | /* | 157 | /* |
| 153 | * We cannot reschedule. So halt. | 158 | * We cannot reschedule. So halt. |
| 154 | */ | 159 | */ |
| 160 | rcu_irq_exit(); | ||
| 155 | native_safe_halt(); | 161 | native_safe_halt(); |
| 162 | rcu_irq_enter(); | ||
| 156 | local_irq_disable(); | 163 | local_irq_disable(); |
| 157 | } | 164 | } |
| 158 | } | 165 | } |
| 159 | if (!n.halted) | 166 | if (!n.halted) |
| 160 | finish_wait(&n.wq, &wait); | 167 | finish_wait(&n.wq, &wait); |
| 161 | 168 | ||
| 169 | rcu_irq_exit(); | ||
| 162 | return; | 170 | return; |
| 163 | } | 171 | } |
| 164 | EXPORT_SYMBOL_GPL(kvm_async_pf_task_wait); | 172 | EXPORT_SYMBOL_GPL(kvm_async_pf_task_wait); |
| @@ -252,10 +260,10 @@ do_async_page_fault(struct pt_regs *regs, unsigned long error_code) | |||
| 252 | break; | 260 | break; |
| 253 | case KVM_PV_REASON_PAGE_NOT_PRESENT: | 261 | case KVM_PV_REASON_PAGE_NOT_PRESENT: |
| 254 | /* page is swapped out by the host. */ | 262 | /* page is swapped out by the host. */ |
| 255 | rcu_irq_enter(); | 263 | exception_enter(regs); |
| 256 | exit_idle(); | 264 | exit_idle(); |
| 257 | kvm_async_pf_task_wait((u32)read_cr2()); | 265 | kvm_async_pf_task_wait((u32)read_cr2()); |
| 258 | rcu_irq_exit(); | 266 | exception_exit(regs); |
| 259 | break; | 267 | break; |
| 260 | case KVM_PV_REASON_PAGE_READY: | 268 | case KVM_PV_REASON_PAGE_READY: |
| 261 | rcu_irq_enter(); | 269 | rcu_irq_enter(); |
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 76f54461f7cb..c243b81e3c74 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
| @@ -120,7 +120,7 @@ struct kvm_shared_msrs { | |||
| 120 | }; | 120 | }; |
| 121 | 121 | ||
| 122 | static struct kvm_shared_msrs_global __read_mostly shared_msrs_global; | 122 | static struct kvm_shared_msrs_global __read_mostly shared_msrs_global; |
| 123 | static DEFINE_PER_CPU(struct kvm_shared_msrs, shared_msrs); | 123 | static struct kvm_shared_msrs __percpu *shared_msrs; |
| 124 | 124 | ||
| 125 | struct kvm_stats_debugfs_item debugfs_entries[] = { | 125 | struct kvm_stats_debugfs_item debugfs_entries[] = { |
| 126 | { "pf_fixed", VCPU_STAT(pf_fixed) }, | 126 | { "pf_fixed", VCPU_STAT(pf_fixed) }, |
| @@ -191,10 +191,10 @@ static void kvm_on_user_return(struct user_return_notifier *urn) | |||
| 191 | 191 | ||
| 192 | static void shared_msr_update(unsigned slot, u32 msr) | 192 | static void shared_msr_update(unsigned slot, u32 msr) |
| 193 | { | 193 | { |
| 194 | struct kvm_shared_msrs *smsr; | ||
| 195 | u64 value; | 194 | u64 value; |
| 195 | unsigned int cpu = smp_processor_id(); | ||
| 196 | struct kvm_shared_msrs *smsr = per_cpu_ptr(shared_msrs, cpu); | ||
| 196 | 197 | ||
| 197 | smsr = &__get_cpu_var(shared_msrs); | ||
| 198 | /* only read, and nobody should modify it at this time, | 198 | /* only read, and nobody should modify it at this time, |
| 199 | * so don't need lock */ | 199 | * so don't need lock */ |
| 200 | if (slot >= shared_msrs_global.nr) { | 200 | if (slot >= shared_msrs_global.nr) { |
| @@ -226,7 +226,8 @@ static void kvm_shared_msr_cpu_online(void) | |||
| 226 | 226 | ||
| 227 | void kvm_set_shared_msr(unsigned slot, u64 value, u64 mask) | 227 | void kvm_set_shared_msr(unsigned slot, u64 value, u64 mask) |
| 228 | { | 228 | { |
| 229 | struct kvm_shared_msrs *smsr = &__get_cpu_var(shared_msrs); | 229 | unsigned int cpu = smp_processor_id(); |
| 230 | struct kvm_shared_msrs *smsr = per_cpu_ptr(shared_msrs, cpu); | ||
| 230 | 231 | ||
| 231 | if (((value ^ smsr->values[slot].curr) & mask) == 0) | 232 | if (((value ^ smsr->values[slot].curr) & mask) == 0) |
| 232 | return; | 233 | return; |
| @@ -242,7 +243,8 @@ EXPORT_SYMBOL_GPL(kvm_set_shared_msr); | |||
| 242 | 243 | ||
| 243 | static void drop_user_return_notifiers(void *ignore) | 244 | static void drop_user_return_notifiers(void *ignore) |
| 244 | { | 245 | { |
| 245 | struct kvm_shared_msrs *smsr = &__get_cpu_var(shared_msrs); | 246 | unsigned int cpu = smp_processor_id(); |
| 247 | struct kvm_shared_msrs *smsr = per_cpu_ptr(shared_msrs, cpu); | ||
| 246 | 248 | ||
| 247 | if (smsr->registered) | 249 | if (smsr->registered) |
| 248 | kvm_on_user_return(&smsr->urn); | 250 | kvm_on_user_return(&smsr->urn); |
| @@ -5233,9 +5235,16 @@ int kvm_arch_init(void *opaque) | |||
| 5233 | goto out; | 5235 | goto out; |
| 5234 | } | 5236 | } |
| 5235 | 5237 | ||
| 5238 | r = -ENOMEM; | ||
| 5239 | shared_msrs = alloc_percpu(struct kvm_shared_msrs); | ||
| 5240 | if (!shared_msrs) { | ||
| 5241 | printk(KERN_ERR "kvm: failed to allocate percpu kvm_shared_msrs\n"); | ||
| 5242 | goto out; | ||
| 5243 | } | ||
| 5244 | |||
| 5236 | r = kvm_mmu_module_init(); | 5245 | r = kvm_mmu_module_init(); |
| 5237 | if (r) | 5246 | if (r) |
| 5238 | goto out; | 5247 | goto out_free_percpu; |
| 5239 | 5248 | ||
| 5240 | kvm_set_mmio_spte_mask(); | 5249 | kvm_set_mmio_spte_mask(); |
| 5241 | kvm_init_msr_list(); | 5250 | kvm_init_msr_list(); |
| @@ -5258,6 +5267,8 @@ int kvm_arch_init(void *opaque) | |||
| 5258 | 5267 | ||
| 5259 | return 0; | 5268 | return 0; |
| 5260 | 5269 | ||
| 5270 | out_free_percpu: | ||
| 5271 | free_percpu(shared_msrs); | ||
| 5261 | out: | 5272 | out: |
| 5262 | return r; | 5273 | return r; |
| 5263 | } | 5274 | } |
| @@ -5275,6 +5286,7 @@ void kvm_arch_exit(void) | |||
| 5275 | #endif | 5286 | #endif |
| 5276 | kvm_x86_ops = NULL; | 5287 | kvm_x86_ops = NULL; |
| 5277 | kvm_mmu_module_exit(); | 5288 | kvm_mmu_module_exit(); |
| 5289 | free_percpu(shared_msrs); | ||
| 5278 | } | 5290 | } |
| 5279 | 5291 | ||
| 5280 | int kvm_emulate_halt(struct kvm_vcpu *vcpu) | 5292 | int kvm_emulate_halt(struct kvm_vcpu *vcpu) |
diff --git a/drivers/acpi/acpi_memhotplug.c b/drivers/acpi/acpi_memhotplug.c index eb30e5ab4cab..b679bf8478f7 100644 --- a/drivers/acpi/acpi_memhotplug.c +++ b/drivers/acpi/acpi_memhotplug.c | |||
| @@ -226,16 +226,6 @@ static int acpi_memory_enable_device(struct acpi_memory_device *mem_device) | |||
| 226 | struct acpi_memory_info *info; | 226 | struct acpi_memory_info *info; |
| 227 | int node; | 227 | int node; |
| 228 | 228 | ||
| 229 | |||
| 230 | /* Get the range from the _CRS */ | ||
| 231 | result = acpi_memory_get_device_resources(mem_device); | ||
| 232 | if (result) { | ||
| 233 | dev_err(&mem_device->device->dev, | ||
| 234 | "get_device_resources failed\n"); | ||
| 235 | mem_device->state = MEMORY_INVALID_STATE; | ||
| 236 | return result; | ||
| 237 | } | ||
| 238 | |||
| 239 | node = acpi_get_node(mem_device->device->handle); | 229 | node = acpi_get_node(mem_device->device->handle); |
| 240 | /* | 230 | /* |
| 241 | * Tell the VM there is more memory here... | 231 | * Tell the VM there is more memory here... |
| @@ -342,14 +332,6 @@ static void acpi_memory_device_notify(acpi_handle handle, u32 event, void *data) | |||
| 342 | break; | 332 | break; |
| 343 | } | 333 | } |
| 344 | 334 | ||
| 345 | if (acpi_memory_check_device(mem_device)) | ||
| 346 | break; | ||
| 347 | |||
| 348 | if (acpi_memory_enable_device(mem_device)) { | ||
| 349 | acpi_handle_err(handle,"Cannot enable memory device\n"); | ||
| 350 | break; | ||
| 351 | } | ||
| 352 | |||
| 353 | ost_code = ACPI_OST_SC_SUCCESS; | 335 | ost_code = ACPI_OST_SC_SUCCESS; |
| 354 | break; | 336 | break; |
| 355 | 337 | ||
diff --git a/drivers/acpi/acpica/Makefile b/drivers/acpi/acpica/Makefile index c8bc24bd1f72..bc7a03ded064 100644 --- a/drivers/acpi/acpica/Makefile +++ b/drivers/acpi/acpica/Makefile | |||
| @@ -162,5 +162,5 @@ acpi-y += \ | |||
| 162 | utxferror.o \ | 162 | utxferror.o \ |
| 163 | utxfmutex.o | 163 | utxfmutex.o |
| 164 | 164 | ||
| 165 | acpi-$(ACPI_FUTURE_USAGE) += uttrack.o utcache.o utclib.o | 165 | acpi-$(ACPI_FUTURE_USAGE) += uttrack.o utcache.o |
| 166 | 166 | ||
diff --git a/drivers/acpi/acpica/utclib.c b/drivers/acpi/acpica/utclib.c deleted file mode 100644 index 19ea4755aa73..000000000000 --- a/drivers/acpi/acpica/utclib.c +++ /dev/null | |||
| @@ -1,749 +0,0 @@ | |||
| 1 | /****************************************************************************** | ||
| 2 | * | ||
| 3 | * Module Name: cmclib - Local implementation of C library functions | ||
| 4 | * | ||
| 5 | *****************************************************************************/ | ||
| 6 | |||
| 7 | /* | ||
| 8 | * Copyright (C) 2000 - 2012, Intel Corp. | ||
| 9 | * All rights reserved. | ||
| 10 | * | ||
| 11 | * Redistribution and use in source and binary forms, with or without | ||
| 12 | * modification, are permitted provided that the following conditions | ||
| 13 | * are met: | ||
| 14 | * 1. Redistributions of source code must retain the above copyright | ||
| 15 | * notice, this list of conditions, and the following disclaimer, | ||
| 16 | * without modification. | ||
| 17 | * 2. Redistributions in binary form must reproduce at minimum a disclaimer | ||
| 18 | * substantially similar to the "NO WARRANTY" disclaimer below | ||
| 19 | * ("Disclaimer") and any redistribution must be conditioned upon | ||
| 20 | * including a substantially similar Disclaimer requirement for further | ||
| 21 | * binary redistribution. | ||
| 22 | * 3. Neither the names of the above-listed copyright holders nor the names | ||
| 23 | * of any contributors may be used to endorse or promote products derived | ||
| 24 | * from this software without specific prior written permission. | ||
| 25 | * | ||
| 26 | * Alternatively, this software may be distributed under the terms of the | ||
| 27 | * GNU General Public License ("GPL") version 2 as published by the Free | ||
| 28 | * Software Foundation. | ||
| 29 | * | ||
| 30 | * NO WARRANTY | ||
| 31 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| 32 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| 33 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR | ||
| 34 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
| 35 | * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
| 36 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
| 37 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
| 38 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
| 39 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | ||
| 40 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
| 41 | * POSSIBILITY OF SUCH DAMAGES. | ||
| 42 | */ | ||
| 43 | |||
| 44 | #include <acpi/acpi.h> | ||
| 45 | #include "accommon.h" | ||
| 46 | |||
| 47 | /* | ||
| 48 | * These implementations of standard C Library routines can optionally be | ||
| 49 | * used if a C library is not available. In general, they are less efficient | ||
| 50 | * than an inline or assembly implementation | ||
| 51 | */ | ||
| 52 | |||
| 53 | #define _COMPONENT ACPI_UTILITIES | ||
| 54 | ACPI_MODULE_NAME("cmclib") | ||
| 55 | |||
| 56 | #ifndef ACPI_USE_SYSTEM_CLIBRARY | ||
| 57 | #define NEGATIVE 1 | ||
| 58 | #define POSITIVE 0 | ||
| 59 | /******************************************************************************* | ||
| 60 | * | ||
| 61 | * FUNCTION: acpi_ut_memcmp (memcmp) | ||
| 62 | * | ||
| 63 | * PARAMETERS: buffer1 - First Buffer | ||
| 64 | * buffer2 - Second Buffer | ||
| 65 | * count - Maximum # of bytes to compare | ||
| 66 | * | ||
| 67 | * RETURN: Index where Buffers mismatched, or 0 if Buffers matched | ||
| 68 | * | ||
| 69 | * DESCRIPTION: Compare two Buffers, with a maximum length | ||
| 70 | * | ||
| 71 | ******************************************************************************/ | ||
| 72 | int acpi_ut_memcmp(const char *buffer1, const char *buffer2, acpi_size count) | ||
| 73 | { | ||
| 74 | |||
| 75 | return ((count == ACPI_SIZE_MAX) ? 0 : ((unsigned char)*buffer1 - | ||
| 76 | (unsigned char)*buffer2)); | ||
| 77 | } | ||
| 78 | |||
| 79 | /******************************************************************************* | ||
| 80 | * | ||
| 81 | * FUNCTION: acpi_ut_memcpy (memcpy) | ||
| 82 | * | ||
| 83 | * PARAMETERS: dest - Target of the copy | ||
| 84 | * src - Source buffer to copy | ||
| 85 | * count - Number of bytes to copy | ||
| 86 | * | ||
| 87 | * RETURN: Dest | ||
| 88 | * | ||
| 89 | * DESCRIPTION: Copy arbitrary bytes of memory | ||
| 90 | * | ||
| 91 | ******************************************************************************/ | ||
| 92 | |||
| 93 | void *acpi_ut_memcpy(void *dest, const void *src, acpi_size count) | ||
| 94 | { | ||
| 95 | char *new = (char *)dest; | ||
| 96 | char *old = (char *)src; | ||
| 97 | |||
| 98 | while (count) { | ||
| 99 | *new = *old; | ||
| 100 | new++; | ||
| 101 | old++; | ||
| 102 | count--; | ||
| 103 | } | ||
| 104 | |||
| 105 | return (dest); | ||
| 106 | } | ||
| 107 | |||
| 108 | /******************************************************************************* | ||
| 109 | * | ||
| 110 | * FUNCTION: acpi_ut_memset (memset) | ||
| 111 | * | ||
| 112 | * PARAMETERS: dest - Buffer to set | ||
| 113 | * value - Value to set each byte of memory | ||
| 114 | * count - Number of bytes to set | ||
| 115 | * | ||
| 116 | * RETURN: Dest | ||
| 117 | * | ||
| 118 | * DESCRIPTION: Initialize a buffer to a known value. | ||
| 119 | * | ||
| 120 | ******************************************************************************/ | ||
| 121 | |||
| 122 | void *acpi_ut_memset(void *dest, u8 value, acpi_size count) | ||
| 123 | { | ||
| 124 | char *new = (char *)dest; | ||
| 125 | |||
| 126 | while (count) { | ||
| 127 | *new = (char)value; | ||
| 128 | new++; | ||
| 129 | count--; | ||
| 130 | } | ||
| 131 | |||
| 132 | return (dest); | ||
| 133 | } | ||
| 134 | |||
| 135 | /******************************************************************************* | ||
| 136 | * | ||
| 137 | * FUNCTION: acpi_ut_strlen (strlen) | ||
| 138 | * | ||
| 139 | * PARAMETERS: string - Null terminated string | ||
| 140 | * | ||
| 141 | * RETURN: Length | ||
| 142 | * | ||
| 143 | * DESCRIPTION: Returns the length of the input string | ||
| 144 | * | ||
| 145 | ******************************************************************************/ | ||
| 146 | |||
| 147 | acpi_size acpi_ut_strlen(const char *string) | ||
| 148 | { | ||
| 149 | u32 length = 0; | ||
| 150 | |||
| 151 | /* Count the string until a null is encountered */ | ||
| 152 | |||
| 153 | while (*string) { | ||
| 154 | length++; | ||
| 155 | string++; | ||
| 156 | } | ||
| 157 | |||
| 158 | return (length); | ||
| 159 | } | ||
| 160 | |||
| 161 | /******************************************************************************* | ||
| 162 | * | ||
| 163 | * FUNCTION: acpi_ut_strcpy (strcpy) | ||
| 164 | * | ||
| 165 | * PARAMETERS: dst_string - Target of the copy | ||
| 166 | * src_string - The source string to copy | ||
| 167 | * | ||
| 168 | * RETURN: dst_string | ||
| 169 | * | ||
| 170 | * DESCRIPTION: Copy a null terminated string | ||
| 171 | * | ||
| 172 | ******************************************************************************/ | ||
| 173 | |||
| 174 | char *acpi_ut_strcpy(char *dst_string, const char *src_string) | ||
| 175 | { | ||
| 176 | char *string = dst_string; | ||
| 177 | |||
| 178 | /* Move bytes brute force */ | ||
| 179 | |||
| 180 | while (*src_string) { | ||
| 181 | *string = *src_string; | ||
| 182 | |||
| 183 | string++; | ||
| 184 | src_string++; | ||
| 185 | } | ||
| 186 | |||
| 187 | /* Null terminate */ | ||
| 188 | |||
| 189 | *string = 0; | ||
| 190 | return (dst_string); | ||
| 191 | } | ||
| 192 | |||
| 193 | /******************************************************************************* | ||
| 194 | * | ||
| 195 | * FUNCTION: acpi_ut_strncpy (strncpy) | ||
| 196 | * | ||
| 197 | * PARAMETERS: dst_string - Target of the copy | ||
| 198 | * src_string - The source string to copy | ||
| 199 | * count - Maximum # of bytes to copy | ||
| 200 | * | ||
| 201 | * RETURN: dst_string | ||
| 202 | * | ||
| 203 | * DESCRIPTION: Copy a null terminated string, with a maximum length | ||
| 204 | * | ||
| 205 | ******************************************************************************/ | ||
| 206 | |||
| 207 | char *acpi_ut_strncpy(char *dst_string, const char *src_string, acpi_size count) | ||
| 208 | { | ||
| 209 | char *string = dst_string; | ||
| 210 | |||
| 211 | /* Copy the string */ | ||
| 212 | |||
| 213 | for (string = dst_string; | ||
| 214 | count && (count--, (*string++ = *src_string++));) {; | ||
| 215 | } | ||
| 216 | |||
| 217 | /* Pad with nulls if necessary */ | ||
| 218 | |||
| 219 | while (count--) { | ||
| 220 | *string = 0; | ||
| 221 | string++; | ||
| 222 | } | ||
| 223 | |||
| 224 | /* Return original pointer */ | ||
| 225 | |||
| 226 | return (dst_string); | ||
| 227 | } | ||
| 228 | |||
| 229 | /******************************************************************************* | ||
| 230 | * | ||
| 231 | * FUNCTION: acpi_ut_strcmp (strcmp) | ||
| 232 | * | ||
| 233 | * PARAMETERS: string1 - First string | ||
| 234 | * string2 - Second string | ||
| 235 | * | ||
| 236 | * RETURN: Index where strings mismatched, or 0 if strings matched | ||
| 237 | * | ||
| 238 | * DESCRIPTION: Compare two null terminated strings | ||
| 239 | * | ||
| 240 | ******************************************************************************/ | ||
| 241 | |||
| 242 | int acpi_ut_strcmp(const char *string1, const char *string2) | ||
| 243 | { | ||
| 244 | |||
| 245 | for (; (*string1 == *string2); string2++) { | ||
| 246 | if (!*string1++) { | ||
| 247 | return (0); | ||
| 248 | } | ||
| 249 | } | ||
| 250 | |||
| 251 | return ((unsigned char)*string1 - (unsigned char)*string2); | ||
| 252 | } | ||
| 253 | |||
| 254 | #ifdef ACPI_FUTURE_IMPLEMENTATION | ||
| 255 | /* Not used at this time */ | ||
| 256 | /******************************************************************************* | ||
| 257 | * | ||
| 258 | * FUNCTION: acpi_ut_strchr (strchr) | ||
| 259 | * | ||
| 260 | * PARAMETERS: string - Search string | ||
| 261 | * ch - character to search for | ||
| 262 | * | ||
| 263 | * RETURN: Ptr to char or NULL if not found | ||
| 264 | * | ||
| 265 | * DESCRIPTION: Search a string for a character | ||
| 266 | * | ||
| 267 | ******************************************************************************/ | ||
| 268 | |||
| 269 | char *acpi_ut_strchr(const char *string, int ch) | ||
| 270 | { | ||
| 271 | |||
| 272 | for (; (*string); string++) { | ||
| 273 | if ((*string) == (char)ch) { | ||
| 274 | return ((char *)string); | ||
| 275 | } | ||
| 276 | } | ||
| 277 | |||
| 278 | return (NULL); | ||
| 279 | } | ||
| 280 | #endif | ||
| 281 | |||
| 282 | /******************************************************************************* | ||
| 283 | * | ||
| 284 | * FUNCTION: acpi_ut_strncmp (strncmp) | ||
| 285 | * | ||
| 286 | * PARAMETERS: string1 - First string | ||
| 287 | * string2 - Second string | ||
| 288 | * count - Maximum # of bytes to compare | ||
| 289 | * | ||
| 290 | * RETURN: Index where strings mismatched, or 0 if strings matched | ||
| 291 | * | ||
| 292 | * DESCRIPTION: Compare two null terminated strings, with a maximum length | ||
| 293 | * | ||
| 294 | ******************************************************************************/ | ||
| 295 | |||
| 296 | int acpi_ut_strncmp(const char *string1, const char *string2, acpi_size count) | ||
| 297 | { | ||
| 298 | |||
| 299 | for (; count-- && (*string1 == *string2); string2++) { | ||
| 300 | if (!*string1++) { | ||
| 301 | return (0); | ||
| 302 | } | ||
| 303 | } | ||
| 304 | |||
| 305 | return ((count == ACPI_SIZE_MAX) ? 0 : ((unsigned char)*string1 - | ||
| 306 | (unsigned char)*string2)); | ||
| 307 | } | ||
| 308 | |||
| 309 | /******************************************************************************* | ||
| 310 | * | ||
| 311 | * FUNCTION: acpi_ut_strcat (Strcat) | ||
| 312 | * | ||
| 313 | * PARAMETERS: dst_string - Target of the copy | ||
| 314 | * src_string - The source string to copy | ||
| 315 | * | ||
| 316 | * RETURN: dst_string | ||
| 317 | * | ||
| 318 | * DESCRIPTION: Append a null terminated string to a null terminated string | ||
| 319 | * | ||
| 320 | ******************************************************************************/ | ||
| 321 | |||
| 322 | char *acpi_ut_strcat(char *dst_string, const char *src_string) | ||
| 323 | { | ||
| 324 | char *string; | ||
| 325 | |||
| 326 | /* Find end of the destination string */ | ||
| 327 | |||
| 328 | for (string = dst_string; *string++;) {; | ||
| 329 | } | ||
| 330 | |||
| 331 | /* Concatenate the string */ | ||
| 332 | |||
| 333 | for (--string; (*string++ = *src_string++);) {; | ||
| 334 | } | ||
| 335 | |||
| 336 | return (dst_string); | ||
| 337 | } | ||
| 338 | |||
| 339 | /******************************************************************************* | ||
| 340 | * | ||
| 341 | * FUNCTION: acpi_ut_strncat (strncat) | ||
| 342 | * | ||
| 343 | * PARAMETERS: dst_string - Target of the copy | ||
| 344 | * src_string - The source string to copy | ||
| 345 | * count - Maximum # of bytes to copy | ||
| 346 | * | ||
| 347 | * RETURN: dst_string | ||
| 348 | * | ||
| 349 | * DESCRIPTION: Append a null terminated string to a null terminated string, | ||
| 350 | * with a maximum count. | ||
| 351 | * | ||
| 352 | ******************************************************************************/ | ||
| 353 | |||
| 354 | char *acpi_ut_strncat(char *dst_string, const char *src_string, acpi_size count) | ||
| 355 | { | ||
| 356 | char *string; | ||
| 357 | |||
| 358 | if (count) { | ||
| 359 | |||
| 360 | /* Find end of the destination string */ | ||
| 361 | |||
| 362 | for (string = dst_string; *string++;) {; | ||
| 363 | } | ||
| 364 | |||
| 365 | /* Concatenate the string */ | ||
| 366 | |||
| 367 | for (--string; (*string++ = *src_string++) && --count;) {; | ||
| 368 | } | ||
| 369 | |||
| 370 | /* Null terminate if necessary */ | ||
| 371 | |||
| 372 | if (!count) { | ||
| 373 | *string = 0; | ||
| 374 | } | ||
| 375 | } | ||
| 376 | |||
| 377 | return (dst_string); | ||
| 378 | } | ||
| 379 | |||
| 380 | /******************************************************************************* | ||
| 381 | * | ||
| 382 | * FUNCTION: acpi_ut_strstr (strstr) | ||
| 383 | * | ||
| 384 | * PARAMETERS: string1 - Target string | ||
| 385 | * string2 - Substring to search for | ||
| 386 | * | ||
| 387 | * RETURN: Where substring match starts, Null if no match found | ||
| 388 | * | ||
| 389 | * DESCRIPTION: Checks if String2 occurs in String1. This is not really a | ||
| 390 | * full implementation of strstr, only sufficient for command | ||
| 391 | * matching | ||
| 392 | * | ||
| 393 | ******************************************************************************/ | ||
| 394 | |||
| 395 | char *acpi_ut_strstr(char *string1, char *string2) | ||
| 396 | { | ||
| 397 | char *string; | ||
| 398 | |||
| 399 | if (acpi_ut_strlen(string2) > acpi_ut_strlen(string1)) { | ||
| 400 | return (NULL); | ||
| 401 | } | ||
| 402 | |||
| 403 | /* Walk entire string, comparing the letters */ | ||
| 404 | |||
| 405 | for (string = string1; *string2;) { | ||
| 406 | if (*string2 != *string) { | ||
| 407 | return (NULL); | ||
| 408 | } | ||
| 409 | |||
| 410 | string2++; | ||
| 411 | string++; | ||
| 412 | } | ||
| 413 | |||
| 414 | return (string1); | ||
| 415 | } | ||
| 416 | |||
| 417 | /******************************************************************************* | ||
| 418 | * | ||
| 419 | * FUNCTION: acpi_ut_strtoul (strtoul) | ||
| 420 | * | ||
| 421 | * PARAMETERS: string - Null terminated string | ||
| 422 | * terminater - Where a pointer to the terminating byte is | ||
| 423 | * returned | ||
| 424 | * base - Radix of the string | ||
| 425 | * | ||
| 426 | * RETURN: Converted value | ||
| 427 | * | ||
| 428 | * DESCRIPTION: Convert a string into a 32-bit unsigned value. | ||
| 429 | * Note: use acpi_ut_strtoul64 for 64-bit integers. | ||
| 430 | * | ||
| 431 | ******************************************************************************/ | ||
| 432 | |||
| 433 | u32 acpi_ut_strtoul(const char *string, char **terminator, u32 base) | ||
| 434 | { | ||
| 435 | u32 converted = 0; | ||
| 436 | u32 index; | ||
| 437 | u32 sign; | ||
| 438 | const char *string_start; | ||
| 439 | u32 return_value = 0; | ||
| 440 | acpi_status status = AE_OK; | ||
| 441 | |||
| 442 | /* | ||
| 443 | * Save the value of the pointer to the buffer's first | ||
| 444 | * character, save the current errno value, and then | ||
| 445 | * skip over any white space in the buffer: | ||
| 446 | */ | ||
| 447 | string_start = string; | ||
| 448 | while (ACPI_IS_SPACE(*string) || *string == '\t') { | ||
| 449 | ++string; | ||
| 450 | } | ||
| 451 | |||
| 452 | /* | ||
| 453 | * The buffer may contain an optional plus or minus sign. | ||
| 454 | * If it does, then skip over it but remember what is was: | ||
| 455 | */ | ||
| 456 | if (*string == '-') { | ||
| 457 | sign = NEGATIVE; | ||
| 458 | ++string; | ||
| 459 | } else if (*string == '+') { | ||
| 460 | ++string; | ||
| 461 | sign = POSITIVE; | ||
| 462 | } else { | ||
| 463 | sign = POSITIVE; | ||
| 464 | } | ||
| 465 | |||
| 466 | /* | ||
| 467 | * If the input parameter Base is zero, then we need to | ||
| 468 | * determine if it is octal, decimal, or hexadecimal: | ||
| 469 | */ | ||
| 470 | if (base == 0) { | ||
| 471 | if (*string == '0') { | ||
| 472 | if (acpi_ut_to_lower(*(++string)) == 'x') { | ||
| 473 | base = 16; | ||
| 474 | ++string; | ||
| 475 | } else { | ||
| 476 | base = 8; | ||
| 477 | } | ||
| 478 | } else { | ||
| 479 | base = 10; | ||
| 480 | } | ||
| 481 | } else if (base < 2 || base > 36) { | ||
| 482 | /* | ||
| 483 | * The specified Base parameter is not in the domain of | ||
| 484 | * this function: | ||
| 485 | */ | ||
| 486 | goto done; | ||
| 487 | } | ||
| 488 | |||
| 489 | /* | ||
| 490 | * For octal and hexadecimal bases, skip over the leading | ||
| 491 | * 0 or 0x, if they are present. | ||
| 492 | */ | ||
| 493 | if (base == 8 && *string == '0') { | ||
| 494 | string++; | ||
| 495 | } | ||
| 496 | |||
| 497 | if (base == 16 && | ||
| 498 | *string == '0' && acpi_ut_to_lower(*(++string)) == 'x') { | ||
| 499 | string++; | ||
| 500 | } | ||
| 501 | |||
| 502 | /* | ||
| 503 | * Main loop: convert the string to an unsigned long: | ||
| 504 | */ | ||
| 505 | while (*string) { | ||
| 506 | if (ACPI_IS_DIGIT(*string)) { | ||
| 507 | index = (u32)((u8)*string - '0'); | ||
| 508 | } else { | ||
| 509 | index = (u32)acpi_ut_to_upper(*string); | ||
| 510 | if (ACPI_IS_UPPER(index)) { | ||
| 511 | index = index - 'A' + 10; | ||
| 512 | } else { | ||
| 513 | goto done; | ||
| 514 | } | ||
| 515 | } | ||
| 516 | |||
| 517 | if (index >= base) { | ||
| 518 | goto done; | ||
| 519 | } | ||
| 520 | |||
| 521 | /* | ||
| 522 | * Check to see if value is out of range: | ||
| 523 | */ | ||
| 524 | |||
| 525 | if (return_value > ((ACPI_UINT32_MAX - (u32)index) / (u32)base)) { | ||
| 526 | status = AE_ERROR; | ||
| 527 | return_value = 0; /* reset */ | ||
| 528 | } else { | ||
| 529 | return_value *= base; | ||
| 530 | return_value += index; | ||
| 531 | converted = 1; | ||
| 532 | } | ||
| 533 | |||
| 534 | ++string; | ||
| 535 | } | ||
| 536 | |||
| 537 | done: | ||
| 538 | /* | ||
| 539 | * If appropriate, update the caller's pointer to the next | ||
| 540 | * unconverted character in the buffer. | ||
| 541 | */ | ||
| 542 | if (terminator) { | ||
| 543 | if (converted == 0 && return_value == 0 && string != NULL) { | ||
| 544 | *terminator = (char *)string_start; | ||
| 545 | } else { | ||
| 546 | *terminator = (char *)string; | ||
| 547 | } | ||
| 548 | } | ||
| 549 | |||
| 550 | if (status == AE_ERROR) { | ||
| 551 | return_value = ACPI_UINT32_MAX; | ||
| 552 | } | ||
| 553 | |||
| 554 | /* | ||
| 555 | * If a minus sign was present, then "the conversion is negated": | ||
| 556 | */ | ||
| 557 | if (sign == NEGATIVE) { | ||
| 558 | return_value = (ACPI_UINT32_MAX - return_value) + 1; | ||
| 559 | } | ||
| 560 | |||
| 561 | return (return_value); | ||
| 562 | } | ||
| 563 | |||
| 564 | /******************************************************************************* | ||
| 565 | * | ||
| 566 | * FUNCTION: acpi_ut_to_upper (TOUPPER) | ||
| 567 | * | ||
| 568 | * PARAMETERS: c - Character to convert | ||
| 569 | * | ||
| 570 | * RETURN: Converted character as an int | ||
| 571 | * | ||
| 572 | * DESCRIPTION: Convert character to uppercase | ||
| 573 | * | ||
| 574 | ******************************************************************************/ | ||
| 575 | |||
| 576 | int acpi_ut_to_upper(int c) | ||
| 577 | { | ||
| 578 | |||
| 579 | return (ACPI_IS_LOWER(c) ? ((c) - 0x20) : (c)); | ||
| 580 | } | ||
| 581 | |||
| 582 | /******************************************************************************* | ||
| 583 | * | ||
| 584 | * FUNCTION: acpi_ut_to_lower (TOLOWER) | ||
| 585 | * | ||
| 586 | * PARAMETERS: c - Character to convert | ||
| 587 | * | ||
| 588 | * RETURN: Converted character as an int | ||
| 589 | * | ||
| 590 | * DESCRIPTION: Convert character to lowercase | ||
| 591 | * | ||
| 592 | ******************************************************************************/ | ||
| 593 | |||
| 594 | int acpi_ut_to_lower(int c) | ||
| 595 | { | ||
| 596 | |||
| 597 | return (ACPI_IS_UPPER(c) ? ((c) + 0x20) : (c)); | ||
| 598 | } | ||
| 599 | |||
| 600 | /******************************************************************************* | ||
| 601 | * | ||
| 602 | * FUNCTION: is* functions | ||
| 603 | * | ||
| 604 | * DESCRIPTION: is* functions use the ctype table below | ||
| 605 | * | ||
| 606 | ******************************************************************************/ | ||
| 607 | |||
| 608 | const u8 _acpi_ctype[257] = { | ||
| 609 | _ACPI_CN, /* 0x00 0 NUL */ | ||
| 610 | _ACPI_CN, /* 0x01 1 SOH */ | ||
| 611 | _ACPI_CN, /* 0x02 2 STX */ | ||
| 612 | _ACPI_CN, /* 0x03 3 ETX */ | ||
| 613 | _ACPI_CN, /* 0x04 4 EOT */ | ||
| 614 | _ACPI_CN, /* 0x05 5 ENQ */ | ||
| 615 | _ACPI_CN, /* 0x06 6 ACK */ | ||
| 616 | _ACPI_CN, /* 0x07 7 BEL */ | ||
| 617 | _ACPI_CN, /* 0x08 8 BS */ | ||
| 618 | _ACPI_CN | _ACPI_SP, /* 0x09 9 TAB */ | ||
| 619 | _ACPI_CN | _ACPI_SP, /* 0x0A 10 LF */ | ||
| 620 | _ACPI_CN | _ACPI_SP, /* 0x0B 11 VT */ | ||
| 621 | _ACPI_CN | _ACPI_SP, /* 0x0C 12 FF */ | ||
| 622 | _ACPI_CN | _ACPI_SP, /* 0x0D 13 CR */ | ||
| 623 | _ACPI_CN, /* 0x0E 14 SO */ | ||
| 624 | _ACPI_CN, /* 0x0F 15 SI */ | ||
| 625 | _ACPI_CN, /* 0x10 16 DLE */ | ||
| 626 | _ACPI_CN, /* 0x11 17 DC1 */ | ||
| 627 | _ACPI_CN, /* 0x12 18 DC2 */ | ||
| 628 | _ACPI_CN, /* 0x13 19 DC3 */ | ||
| 629 | _ACPI_CN, /* 0x14 20 DC4 */ | ||
| 630 | _ACPI_CN, /* 0x15 21 NAK */ | ||
| 631 | _ACPI_CN, /* 0x16 22 SYN */ | ||
| 632 | _ACPI_CN, /* 0x17 23 ETB */ | ||
| 633 | _ACPI_CN, /* 0x18 24 CAN */ | ||
| 634 | _ACPI_CN, /* 0x19 25 EM */ | ||
| 635 | _ACPI_CN, /* 0x1A 26 SUB */ | ||
| 636 | _ACPI_CN, /* 0x1B 27 ESC */ | ||
| 637 | _ACPI_CN, /* 0x1C 28 FS */ | ||
| 638 | _ACPI_CN, /* 0x1D 29 GS */ | ||
| 639 | _ACPI_CN, /* 0x1E 30 RS */ | ||
| 640 | _ACPI_CN, /* 0x1F 31 US */ | ||
| 641 | _ACPI_XS | _ACPI_SP, /* 0x20 32 ' ' */ | ||
| 642 | _ACPI_PU, /* 0x21 33 '!' */ | ||
| 643 | _ACPI_PU, /* 0x22 34 '"' */ | ||
| 644 | _ACPI_PU, /* 0x23 35 '#' */ | ||
| 645 | _ACPI_PU, /* 0x24 36 '$' */ | ||
| 646 | _ACPI_PU, /* 0x25 37 '%' */ | ||
| 647 | _ACPI_PU, /* 0x26 38 '&' */ | ||
| 648 | _ACPI_PU, /* 0x27 39 ''' */ | ||
| 649 | _ACPI_PU, /* 0x28 40 '(' */ | ||
| 650 | _ACPI_PU, /* 0x29 41 ')' */ | ||
| 651 | _ACPI_PU, /* 0x2A 42 '*' */ | ||
| 652 | _ACPI_PU, /* 0x2B 43 '+' */ | ||
| 653 | _ACPI_PU, /* 0x2C 44 ',' */ | ||
| 654 | _ACPI_PU, /* 0x2D 45 '-' */ | ||
| 655 | _ACPI_PU, /* 0x2E 46 '.' */ | ||
| 656 | _ACPI_PU, /* 0x2F 47 '/' */ | ||
| 657 | _ACPI_XD | _ACPI_DI, /* 0x30 48 '0' */ | ||
| 658 | _ACPI_XD | _ACPI_DI, /* 0x31 49 '1' */ | ||
| 659 | _ACPI_XD | _ACPI_DI, /* 0x32 50 '2' */ | ||
| 660 | _ACPI_XD | _ACPI_DI, /* 0x33 51 '3' */ | ||
| 661 | _ACPI_XD | _ACPI_DI, /* 0x34 52 '4' */ | ||
| 662 | _ACPI_XD | _ACPI_DI, /* 0x35 53 '5' */ | ||
| 663 | _ACPI_XD | _ACPI_DI, /* 0x36 54 '6' */ | ||
| 664 | _ACPI_XD | _ACPI_DI, /* 0x37 55 '7' */ | ||
| 665 | _ACPI_XD | _ACPI_DI, /* 0x38 56 '8' */ | ||
| 666 | _ACPI_XD | _ACPI_DI, /* 0x39 57 '9' */ | ||
| 667 | _ACPI_PU, /* 0x3A 58 ':' */ | ||
| 668 | _ACPI_PU, /* 0x3B 59 ';' */ | ||
| 669 | _ACPI_PU, /* 0x3C 60 '<' */ | ||
| 670 | _ACPI_PU, /* 0x3D 61 '=' */ | ||
| 671 | _ACPI_PU, /* 0x3E 62 '>' */ | ||
| 672 | _ACPI_PU, /* 0x3F 63 '?' */ | ||
| 673 | _ACPI_PU, /* 0x40 64 '@' */ | ||
| 674 | _ACPI_XD | _ACPI_UP, /* 0x41 65 'A' */ | ||
| 675 | _ACPI_XD | _ACPI_UP, /* 0x42 66 'B' */ | ||
| 676 | _ACPI_XD | _ACPI_UP, /* 0x43 67 'C' */ | ||
| 677 | _ACPI_XD | _ACPI_UP, /* 0x44 68 'D' */ | ||
| 678 | _ACPI_XD | _ACPI_UP, /* 0x45 69 'E' */ | ||
| 679 | _ACPI_XD | _ACPI_UP, /* 0x46 70 'F' */ | ||
| 680 | _ACPI_UP, /* 0x47 71 'G' */ | ||
| 681 | _ACPI_UP, /* 0x48 72 'H' */ | ||
| 682 | _ACPI_UP, /* 0x49 73 'I' */ | ||
| 683 | _ACPI_UP, /* 0x4A 74 'J' */ | ||
| 684 | _ACPI_UP, /* 0x4B 75 'K' */ | ||
| 685 | _ACPI_UP, /* 0x4C 76 'L' */ | ||
| 686 | _ACPI_UP, /* 0x4D 77 'M' */ | ||
| 687 | _ACPI_UP, /* 0x4E 78 'N' */ | ||
| 688 | _ACPI_UP, /* 0x4F 79 'O' */ | ||
| 689 | _ACPI_UP, /* 0x50 80 'P' */ | ||
| 690 | _ACPI_UP, /* 0x51 81 'Q' */ | ||
| 691 | _ACPI_UP, /* 0x52 82 'R' */ | ||
| 692 | _ACPI_UP, /* 0x53 83 'S' */ | ||
| 693 | _ACPI_UP, /* 0x54 84 'T' */ | ||
| 694 | _ACPI_UP, /* 0x55 85 'U' */ | ||
| 695 | _ACPI_UP, /* 0x56 86 'V' */ | ||
| 696 | _ACPI_UP, /* 0x57 87 'W' */ | ||
| 697 | _ACPI_UP, /* 0x58 88 'X' */ | ||
| 698 | _ACPI_UP, /* 0x59 89 'Y' */ | ||
| 699 | _ACPI_UP, /* 0x5A 90 'Z' */ | ||
| 700 | _ACPI_PU, /* 0x5B 91 '[' */ | ||
| 701 | _ACPI_PU, /* 0x5C 92 '\' */ | ||
| 702 | _ACPI_PU, /* 0x5D 93 ']' */ | ||
| 703 | _ACPI_PU, /* 0x5E 94 '^' */ | ||
| 704 | _ACPI_PU, /* 0x5F 95 '_' */ | ||
| 705 | _ACPI_PU, /* 0x60 96 '`' */ | ||
| 706 | _ACPI_XD | _ACPI_LO, /* 0x61 97 'a' */ | ||
| 707 | _ACPI_XD | _ACPI_LO, /* 0x62 98 'b' */ | ||
| 708 | _ACPI_XD | _ACPI_LO, /* 0x63 99 'c' */ | ||
| 709 | _ACPI_XD | _ACPI_LO, /* 0x64 100 'd' */ | ||
| 710 | _ACPI_XD | _ACPI_LO, /* 0x65 101 'e' */ | ||
| 711 | _ACPI_XD | _ACPI_LO, /* 0x66 102 'f' */ | ||
| 712 | _ACPI_LO, /* 0x67 103 'g' */ | ||
| 713 | _ACPI_LO, /* 0x68 104 'h' */ | ||
| 714 | _ACPI_LO, /* 0x69 105 'i' */ | ||
| 715 | _ACPI_LO, /* 0x6A 106 'j' */ | ||
| 716 | _ACPI_LO, /* 0x6B 107 'k' */ | ||
| 717 | _ACPI_LO, /* 0x6C 108 'l' */ | ||
| 718 | _ACPI_LO, /* 0x6D 109 'm' */ | ||
| 719 | _ACPI_LO, /* 0x6E 110 'n' */ | ||
| 720 | _ACPI_LO, /* 0x6F 111 'o' */ | ||
| 721 | _ACPI_LO, /* 0x70 112 'p' */ | ||
| 722 | _ACPI_LO, /* 0x71 113 'q' */ | ||
| 723 | _ACPI_LO, /* 0x72 114 'r' */ | ||
| 724 | _ACPI_LO, /* 0x73 115 's' */ | ||
| 725 | _ACPI_LO, /* 0x74 116 't' */ | ||
| 726 | _ACPI_LO, /* 0x75 117 'u' */ | ||
| 727 | _ACPI_LO, /* 0x76 118 'v' */ | ||
| 728 | _ACPI_LO, /* 0x77 119 'w' */ | ||
| 729 | _ACPI_LO, /* 0x78 120 'x' */ | ||
| 730 | _ACPI_LO, /* 0x79 121 'y' */ | ||
| 731 | _ACPI_LO, /* 0x7A 122 'z' */ | ||
| 732 | _ACPI_PU, /* 0x7B 123 '{' */ | ||
| 733 | _ACPI_PU, /* 0x7C 124 '|' */ | ||
| 734 | _ACPI_PU, /* 0x7D 125 '}' */ | ||
| 735 | _ACPI_PU, /* 0x7E 126 '~' */ | ||
| 736 | _ACPI_CN, /* 0x7F 127 DEL */ | ||
| 737 | |||
| 738 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 to 0x8F */ | ||
| 739 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 to 0x9F */ | ||
| 740 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 to 0xAF */ | ||
| 741 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 to 0xBF */ | ||
| 742 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 to 0xCF */ | ||
| 743 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 to 0xDF */ | ||
| 744 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 to 0xEF */ | ||
| 745 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 to 0xFF */ | ||
| 746 | 0 /* 0x100 */ | ||
| 747 | }; | ||
| 748 | |||
| 749 | #endif /* ACPI_USE_SYSTEM_CLIBRARY */ | ||
diff --git a/drivers/acpi/apei/erst-dbg.c b/drivers/acpi/apei/erst-dbg.c index 903549df809b..04ab5c9d3ced 100644 --- a/drivers/acpi/apei/erst-dbg.c +++ b/drivers/acpi/apei/erst-dbg.c | |||
| @@ -111,8 +111,17 @@ retry_next: | |||
| 111 | if (rc) | 111 | if (rc) |
| 112 | goto out; | 112 | goto out; |
| 113 | /* no more record */ | 113 | /* no more record */ |
| 114 | if (id == APEI_ERST_INVALID_RECORD_ID) | 114 | if (id == APEI_ERST_INVALID_RECORD_ID) { |
| 115 | /* | ||
| 116 | * If the persistent store is empty initially, the function | ||
| 117 | * 'erst_read' below will return "-ENOENT" value. This causes | ||
| 118 | * 'retry_next' label is entered again. The returned value | ||
| 119 | * should be zero indicating the read operation is EOF. | ||
| 120 | */ | ||
| 121 | len = 0; | ||
| 122 | |||
| 115 | goto out; | 123 | goto out; |
| 124 | } | ||
| 116 | retry: | 125 | retry: |
| 117 | rc = len = erst_read(id, erst_dbg_buf, erst_dbg_buf_len); | 126 | rc = len = erst_read(id, erst_dbg_buf, erst_dbg_buf_len); |
| 118 | /* The record may be cleared by others, try read next record */ | 127 | /* The record may be cleared by others, try read next record */ |
diff --git a/drivers/acpi/device_pm.c b/drivers/acpi/device_pm.c index f09dc987cf17..c6ff606c6d5b 100644 --- a/drivers/acpi/device_pm.c +++ b/drivers/acpi/device_pm.c | |||
| @@ -358,8 +358,7 @@ static struct acpi_device *acpi_dev_pm_get_node(struct device *dev) | |||
| 358 | acpi_handle handle = DEVICE_ACPI_HANDLE(dev); | 358 | acpi_handle handle = DEVICE_ACPI_HANDLE(dev); |
| 359 | struct acpi_device *adev; | 359 | struct acpi_device *adev; |
| 360 | 360 | ||
| 361 | return handle && ACPI_SUCCESS(acpi_bus_get_device(handle, &adev)) ? | 361 | return handle && !acpi_bus_get_device(handle, &adev) ? adev : NULL; |
| 362 | adev : NULL; | ||
| 363 | } | 362 | } |
| 364 | 363 | ||
| 365 | /** | 364 | /** |
diff --git a/drivers/acpi/glue.c b/drivers/acpi/glue.c index 01551840d236..95af6f674a6c 100644 --- a/drivers/acpi/glue.c +++ b/drivers/acpi/glue.c | |||
| @@ -18,9 +18,14 @@ | |||
| 18 | 18 | ||
| 19 | #define ACPI_GLUE_DEBUG 0 | 19 | #define ACPI_GLUE_DEBUG 0 |
| 20 | #if ACPI_GLUE_DEBUG | 20 | #if ACPI_GLUE_DEBUG |
| 21 | #define DBG(x...) printk(PREFIX x) | 21 | #define DBG(fmt, ...) \ |
| 22 | printk(KERN_DEBUG PREFIX fmt, ##__VA_ARGS__) | ||
| 22 | #else | 23 | #else |
| 23 | #define DBG(x...) do { } while(0) | 24 | #define DBG(fmt, ...) \ |
| 25 | do { \ | ||
| 26 | if (0) \ | ||
| 27 | printk(KERN_DEBUG PREFIX fmt, ##__VA_ARGS__); \ | ||
| 28 | } while (0) | ||
| 24 | #endif | 29 | #endif |
| 25 | static LIST_HEAD(bus_type_list); | 30 | static LIST_HEAD(bus_type_list); |
| 26 | static DECLARE_RWSEM(bus_type_sem); | 31 | static DECLARE_RWSEM(bus_type_sem); |
diff --git a/drivers/acpi/power.c b/drivers/acpi/power.c index 7db61b8fa11f..6e7b9d523812 100644 --- a/drivers/acpi/power.c +++ b/drivers/acpi/power.c | |||
| @@ -445,11 +445,8 @@ int acpi_power_resource_register_device(struct device *dev, acpi_handle handle) | |||
| 445 | return -ENODEV; | 445 | return -ENODEV; |
| 446 | 446 | ||
| 447 | ret = acpi_bus_get_device(handle, &acpi_dev); | 447 | ret = acpi_bus_get_device(handle, &acpi_dev); |
| 448 | if (ret) | 448 | if (ret || !acpi_dev->power.flags.power_resources) |
| 449 | goto no_power_resource; | 449 | return -ENODEV; |
| 450 | |||
| 451 | if (!acpi_dev->power.flags.power_resources) | ||
| 452 | goto no_power_resource; | ||
| 453 | 450 | ||
| 454 | powered_device = kzalloc(sizeof(*powered_device), GFP_KERNEL); | 451 | powered_device = kzalloc(sizeof(*powered_device), GFP_KERNEL); |
| 455 | if (!powered_device) | 452 | if (!powered_device) |
| @@ -471,10 +468,6 @@ int acpi_power_resource_register_device(struct device *dev, acpi_handle handle) | |||
| 471 | } | 468 | } |
| 472 | 469 | ||
| 473 | return ret; | 470 | return ret; |
| 474 | |||
| 475 | no_power_resource: | ||
| 476 | printk(KERN_DEBUG PREFIX "Invalid Power Resource to register!\n"); | ||
| 477 | return -ENODEV; | ||
| 478 | } | 471 | } |
| 479 | EXPORT_SYMBOL_GPL(acpi_power_resource_register_device); | 472 | EXPORT_SYMBOL_GPL(acpi_power_resource_register_device); |
| 480 | 473 | ||
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index 53502d1bbf26..c88be6c37c30 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c | |||
| @@ -1346,7 +1346,7 @@ static void acpi_device_set_id(struct acpi_device *device) | |||
| 1346 | acpi_add_id(device, ACPI_DOCK_HID); | 1346 | acpi_add_id(device, ACPI_DOCK_HID); |
| 1347 | else if (!acpi_ibm_smbus_match(device)) | 1347 | else if (!acpi_ibm_smbus_match(device)) |
| 1348 | acpi_add_id(device, ACPI_SMBUS_IBM_HID); | 1348 | acpi_add_id(device, ACPI_SMBUS_IBM_HID); |
| 1349 | else if (!acpi_device_hid(device) && | 1349 | else if (list_empty(&device->pnp.ids) && |
| 1350 | ACPI_IS_ROOT_DEVICE(device->parent)) { | 1350 | ACPI_IS_ROOT_DEVICE(device->parent)) { |
| 1351 | acpi_add_id(device, ACPI_BUS_HID); /* \_SB, LNXSYBUS */ | 1351 | acpi_add_id(device, ACPI_BUS_HID); /* \_SB, LNXSYBUS */ |
| 1352 | strcpy(device->pnp.device_name, ACPI_BUS_DEVICE_NAME); | 1352 | strcpy(device->pnp.device_name, ACPI_BUS_DEVICE_NAME); |
diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c index a3c1404c7933..2b7f77d3fcb0 100644 --- a/drivers/base/power/main.c +++ b/drivers/base/power/main.c | |||
| @@ -513,6 +513,8 @@ static int device_resume_early(struct device *dev, pm_message_t state) | |||
| 513 | 513 | ||
| 514 | Out: | 514 | Out: |
| 515 | TRACE_RESUME(error); | 515 | TRACE_RESUME(error); |
| 516 | |||
| 517 | pm_runtime_enable(dev); | ||
| 516 | return error; | 518 | return error; |
| 517 | } | 519 | } |
| 518 | 520 | ||
| @@ -589,8 +591,6 @@ static int device_resume(struct device *dev, pm_message_t state, bool async) | |||
| 589 | if (!dev->power.is_suspended) | 591 | if (!dev->power.is_suspended) |
| 590 | goto Unlock; | 592 | goto Unlock; |
| 591 | 593 | ||
| 592 | pm_runtime_enable(dev); | ||
| 593 | |||
| 594 | if (dev->pm_domain) { | 594 | if (dev->pm_domain) { |
| 595 | info = "power domain "; | 595 | info = "power domain "; |
| 596 | callback = pm_op(&dev->pm_domain->ops, state); | 596 | callback = pm_op(&dev->pm_domain->ops, state); |
| @@ -930,6 +930,8 @@ static int device_suspend_late(struct device *dev, pm_message_t state) | |||
| 930 | pm_callback_t callback = NULL; | 930 | pm_callback_t callback = NULL; |
| 931 | char *info = NULL; | 931 | char *info = NULL; |
| 932 | 932 | ||
| 933 | __pm_runtime_disable(dev, false); | ||
| 934 | |||
| 933 | if (dev->power.syscore) | 935 | if (dev->power.syscore) |
| 934 | return 0; | 936 | return 0; |
| 935 | 937 | ||
| @@ -1133,11 +1135,8 @@ static int __device_suspend(struct device *dev, pm_message_t state, bool async) | |||
| 1133 | 1135 | ||
| 1134 | Complete: | 1136 | Complete: |
| 1135 | complete_all(&dev->power.completion); | 1137 | complete_all(&dev->power.completion); |
| 1136 | |||
| 1137 | if (error) | 1138 | if (error) |
| 1138 | async_error = error; | 1139 | async_error = error; |
| 1139 | else if (dev->power.is_suspended) | ||
| 1140 | __pm_runtime_disable(dev, false); | ||
| 1141 | 1140 | ||
| 1142 | return error; | 1141 | return error; |
| 1143 | } | 1142 | } |
diff --git a/drivers/base/power/qos.c b/drivers/base/power/qos.c index ff46387f5308..d21349544ce5 100644 --- a/drivers/base/power/qos.c +++ b/drivers/base/power/qos.c | |||
| @@ -542,19 +542,19 @@ int dev_pm_qos_add_ancestor_request(struct device *dev, | |||
| 542 | struct dev_pm_qos_request *req, s32 value) | 542 | struct dev_pm_qos_request *req, s32 value) |
| 543 | { | 543 | { |
| 544 | struct device *ancestor = dev->parent; | 544 | struct device *ancestor = dev->parent; |
| 545 | int error = -ENODEV; | 545 | int ret = -ENODEV; |
| 546 | 546 | ||
| 547 | while (ancestor && !ancestor->power.ignore_children) | 547 | while (ancestor && !ancestor->power.ignore_children) |
| 548 | ancestor = ancestor->parent; | 548 | ancestor = ancestor->parent; |
| 549 | 549 | ||
| 550 | if (ancestor) | 550 | if (ancestor) |
| 551 | error = dev_pm_qos_add_request(ancestor, req, | 551 | ret = dev_pm_qos_add_request(ancestor, req, |
| 552 | DEV_PM_QOS_LATENCY, value); | 552 | DEV_PM_QOS_LATENCY, value); |
| 553 | 553 | ||
| 554 | if (error < 0) | 554 | if (ret < 0) |
| 555 | req->dev = NULL; | 555 | req->dev = NULL; |
| 556 | 556 | ||
| 557 | return error; | 557 | return ret; |
| 558 | } | 558 | } |
| 559 | EXPORT_SYMBOL_GPL(dev_pm_qos_add_ancestor_request); | 559 | EXPORT_SYMBOL_GPL(dev_pm_qos_add_ancestor_request); |
| 560 | 560 | ||
diff --git a/drivers/bcma/Kconfig b/drivers/bcma/Kconfig index d7b56a88c9f4..8b4221cfd118 100644 --- a/drivers/bcma/Kconfig +++ b/drivers/bcma/Kconfig | |||
| @@ -67,8 +67,7 @@ config BCMA_DRIVER_GMAC_CMN | |||
| 67 | 67 | ||
| 68 | config BCMA_DRIVER_GPIO | 68 | config BCMA_DRIVER_GPIO |
| 69 | bool "BCMA GPIO driver" | 69 | bool "BCMA GPIO driver" |
| 70 | depends on BCMA | 70 | depends on BCMA && GPIOLIB |
| 71 | select GPIOLIB | ||
| 72 | help | 71 | help |
| 73 | Driver to provide access to the GPIO pins of the bcma bus. | 72 | Driver to provide access to the GPIO pins of the bcma bus. |
| 74 | 73 | ||
diff --git a/drivers/bcma/driver_chipcommon_sflash.c b/drivers/bcma/driver_chipcommon_sflash.c index 63e688393825..1e694db4532d 100644 --- a/drivers/bcma/driver_chipcommon_sflash.c +++ b/drivers/bcma/driver_chipcommon_sflash.c | |||
| @@ -35,7 +35,7 @@ static struct bcma_sflash_tbl_e bcma_sflash_st_tbl[] = { | |||
| 35 | { "M25P40", 0x12, 0x10000, 8, }, | 35 | { "M25P40", 0x12, 0x10000, 8, }, |
| 36 | 36 | ||
| 37 | { "M25P16", 0x14, 0x10000, 32, }, | 37 | { "M25P16", 0x14, 0x10000, 32, }, |
| 38 | { "M25P32", 0x14, 0x10000, 64, }, | 38 | { "M25P32", 0x15, 0x10000, 64, }, |
| 39 | { "M25P64", 0x16, 0x10000, 128, }, | 39 | { "M25P64", 0x16, 0x10000, 128, }, |
| 40 | { "M25FL128", 0x17, 0x10000, 256, }, | 40 | { "M25FL128", 0x17, 0x10000, 256, }, |
| 41 | { 0 }, | 41 | { 0 }, |
diff --git a/drivers/clk/mvebu/clk-gating-ctrl.c b/drivers/clk/mvebu/clk-gating-ctrl.c index c6d3c263b070..8fa5408b6c7d 100644 --- a/drivers/clk/mvebu/clk-gating-ctrl.c +++ b/drivers/clk/mvebu/clk-gating-ctrl.c | |||
| @@ -32,7 +32,7 @@ struct mvebu_soc_descr { | |||
| 32 | 32 | ||
| 33 | #define to_clk_gate(_hw) container_of(_hw, struct clk_gate, hw) | 33 | #define to_clk_gate(_hw) container_of(_hw, struct clk_gate, hw) |
| 34 | 34 | ||
| 35 | static struct clk __init *mvebu_clk_gating_get_src( | 35 | static struct clk *mvebu_clk_gating_get_src( |
| 36 | struct of_phandle_args *clkspec, void *data) | 36 | struct of_phandle_args *clkspec, void *data) |
| 37 | { | 37 | { |
| 38 | struct mvebu_gating_ctrl *ctrl = (struct mvebu_gating_ctrl *)data; | 38 | struct mvebu_gating_ctrl *ctrl = (struct mvebu_gating_ctrl *)data; |
diff --git a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig index ea512f47b789..e0a899f25e37 100644 --- a/drivers/cpufreq/Kconfig +++ b/drivers/cpufreq/Kconfig | |||
| @@ -20,6 +20,9 @@ if CPU_FREQ | |||
| 20 | config CPU_FREQ_TABLE | 20 | config CPU_FREQ_TABLE |
| 21 | tristate | 21 | tristate |
| 22 | 22 | ||
| 23 | config CPU_FREQ_GOV_COMMON | ||
| 24 | bool | ||
| 25 | |||
| 23 | config CPU_FREQ_STAT | 26 | config CPU_FREQ_STAT |
| 24 | tristate "CPU frequency translation statistics" | 27 | tristate "CPU frequency translation statistics" |
| 25 | select CPU_FREQ_TABLE | 28 | select CPU_FREQ_TABLE |
| @@ -141,6 +144,7 @@ config CPU_FREQ_GOV_USERSPACE | |||
| 141 | config CPU_FREQ_GOV_ONDEMAND | 144 | config CPU_FREQ_GOV_ONDEMAND |
| 142 | tristate "'ondemand' cpufreq policy governor" | 145 | tristate "'ondemand' cpufreq policy governor" |
| 143 | select CPU_FREQ_TABLE | 146 | select CPU_FREQ_TABLE |
| 147 | select CPU_FREQ_GOV_COMMON | ||
| 144 | help | 148 | help |
| 145 | 'ondemand' - This driver adds a dynamic cpufreq policy governor. | 149 | 'ondemand' - This driver adds a dynamic cpufreq policy governor. |
| 146 | The governor does a periodic polling and | 150 | The governor does a periodic polling and |
| @@ -159,6 +163,7 @@ config CPU_FREQ_GOV_ONDEMAND | |||
| 159 | config CPU_FREQ_GOV_CONSERVATIVE | 163 | config CPU_FREQ_GOV_CONSERVATIVE |
| 160 | tristate "'conservative' cpufreq governor" | 164 | tristate "'conservative' cpufreq governor" |
| 161 | depends on CPU_FREQ | 165 | depends on CPU_FREQ |
| 166 | select CPU_FREQ_GOV_COMMON | ||
| 162 | help | 167 | help |
| 163 | 'conservative' - this driver is rather similar to the 'ondemand' | 168 | 'conservative' - this driver is rather similar to the 'ondemand' |
| 164 | governor both in its source code and its purpose, the difference is | 169 | governor both in its source code and its purpose, the difference is |
diff --git a/drivers/cpufreq/Makefile b/drivers/cpufreq/Makefile index 1f254ec087c1..fadc4d496e2f 100644 --- a/drivers/cpufreq/Makefile +++ b/drivers/cpufreq/Makefile | |||
| @@ -7,8 +7,9 @@ obj-$(CONFIG_CPU_FREQ_STAT) += cpufreq_stats.o | |||
| 7 | obj-$(CONFIG_CPU_FREQ_GOV_PERFORMANCE) += cpufreq_performance.o | 7 | obj-$(CONFIG_CPU_FREQ_GOV_PERFORMANCE) += cpufreq_performance.o |
| 8 | obj-$(CONFIG_CPU_FREQ_GOV_POWERSAVE) += cpufreq_powersave.o | 8 | obj-$(CONFIG_CPU_FREQ_GOV_POWERSAVE) += cpufreq_powersave.o |
| 9 | obj-$(CONFIG_CPU_FREQ_GOV_USERSPACE) += cpufreq_userspace.o | 9 | obj-$(CONFIG_CPU_FREQ_GOV_USERSPACE) += cpufreq_userspace.o |
| 10 | obj-$(CONFIG_CPU_FREQ_GOV_ONDEMAND) += cpufreq_ondemand.o cpufreq_governor.o | 10 | obj-$(CONFIG_CPU_FREQ_GOV_ONDEMAND) += cpufreq_ondemand.o |
| 11 | obj-$(CONFIG_CPU_FREQ_GOV_CONSERVATIVE) += cpufreq_conservative.o cpufreq_governor.o | 11 | obj-$(CONFIG_CPU_FREQ_GOV_CONSERVATIVE) += cpufreq_conservative.o |
| 12 | obj-$(CONFIG_CPU_FREQ_GOV_COMMON) += cpufreq_governor.o | ||
| 12 | 13 | ||
| 13 | # CPUfreq cross-arch helpers | 14 | # CPUfreq cross-arch helpers |
| 14 | obj-$(CONFIG_CPU_FREQ_TABLE) += freq_table.o | 15 | obj-$(CONFIG_CPU_FREQ_TABLE) += freq_table.o |
diff --git a/drivers/cpufreq/cpufreq_stats.c b/drivers/cpufreq/cpufreq_stats.c index e40e50809644..9d7732b81044 100644 --- a/drivers/cpufreq/cpufreq_stats.c +++ b/drivers/cpufreq/cpufreq_stats.c | |||
| @@ -364,18 +364,21 @@ static int __init cpufreq_stats_init(void) | |||
| 364 | if (ret) | 364 | if (ret) |
| 365 | return ret; | 365 | return ret; |
| 366 | 366 | ||
| 367 | register_hotcpu_notifier(&cpufreq_stat_cpu_notifier); | ||
| 368 | for_each_online_cpu(cpu) | ||
| 369 | cpufreq_update_policy(cpu); | ||
| 370 | |||
| 367 | ret = cpufreq_register_notifier(¬ifier_trans_block, | 371 | ret = cpufreq_register_notifier(¬ifier_trans_block, |
| 368 | CPUFREQ_TRANSITION_NOTIFIER); | 372 | CPUFREQ_TRANSITION_NOTIFIER); |
| 369 | if (ret) { | 373 | if (ret) { |
| 370 | cpufreq_unregister_notifier(¬ifier_policy_block, | 374 | cpufreq_unregister_notifier(¬ifier_policy_block, |
| 371 | CPUFREQ_POLICY_NOTIFIER); | 375 | CPUFREQ_POLICY_NOTIFIER); |
| 376 | unregister_hotcpu_notifier(&cpufreq_stat_cpu_notifier); | ||
| 377 | for_each_online_cpu(cpu) | ||
| 378 | cpufreq_stats_free_table(cpu); | ||
| 372 | return ret; | 379 | return ret; |
| 373 | } | 380 | } |
| 374 | 381 | ||
| 375 | register_hotcpu_notifier(&cpufreq_stat_cpu_notifier); | ||
| 376 | for_each_online_cpu(cpu) { | ||
| 377 | cpufreq_update_policy(cpu); | ||
| 378 | } | ||
| 379 | return 0; | 382 | return 0; |
| 380 | } | 383 | } |
| 381 | static void __exit cpufreq_stats_exit(void) | 384 | static void __exit cpufreq_stats_exit(void) |
diff --git a/drivers/cpufreq/longhaul.c b/drivers/cpufreq/longhaul.c index f1fa500ac105..1180d536d1eb 100644 --- a/drivers/cpufreq/longhaul.c +++ b/drivers/cpufreq/longhaul.c | |||
| @@ -77,7 +77,7 @@ static unsigned int longhaul_index; | |||
| 77 | static int scale_voltage; | 77 | static int scale_voltage; |
| 78 | static int disable_acpi_c3; | 78 | static int disable_acpi_c3; |
| 79 | static int revid_errata; | 79 | static int revid_errata; |
| 80 | 80 | static int enable; | |
| 81 | 81 | ||
| 82 | /* Clock ratios multiplied by 10 */ | 82 | /* Clock ratios multiplied by 10 */ |
| 83 | static int mults[32]; | 83 | static int mults[32]; |
| @@ -965,6 +965,10 @@ static int __init longhaul_init(void) | |||
| 965 | if (!x86_match_cpu(longhaul_id)) | 965 | if (!x86_match_cpu(longhaul_id)) |
| 966 | return -ENODEV; | 966 | return -ENODEV; |
| 967 | 967 | ||
| 968 | if (!enable) { | ||
| 969 | printk(KERN_ERR PFX "Option \"enable\" not set. Aborting.\n"); | ||
| 970 | return -ENODEV; | ||
| 971 | } | ||
| 968 | #ifdef CONFIG_SMP | 972 | #ifdef CONFIG_SMP |
| 969 | if (num_online_cpus() > 1) { | 973 | if (num_online_cpus() > 1) { |
| 970 | printk(KERN_ERR PFX "More than 1 CPU detected, " | 974 | printk(KERN_ERR PFX "More than 1 CPU detected, " |
| @@ -1021,6 +1025,10 @@ MODULE_PARM_DESC(scale_voltage, "Scale voltage of processor"); | |||
| 1021 | * such. */ | 1025 | * such. */ |
| 1022 | module_param(revid_errata, int, 0644); | 1026 | module_param(revid_errata, int, 0644); |
| 1023 | MODULE_PARM_DESC(revid_errata, "Ignore CPU Revision ID"); | 1027 | MODULE_PARM_DESC(revid_errata, "Ignore CPU Revision ID"); |
| 1028 | /* By default driver is disabled to prevent incompatible | ||
| 1029 | * system freeze. */ | ||
| 1030 | module_param(enable, int, 0644); | ||
| 1031 | MODULE_PARM_DESC(enable, "Enable driver"); | ||
| 1024 | 1032 | ||
| 1025 | MODULE_AUTHOR("Dave Jones <davej@redhat.com>"); | 1033 | MODULE_AUTHOR("Dave Jones <davej@redhat.com>"); |
| 1026 | MODULE_DESCRIPTION("Longhaul driver for VIA Cyrix processors."); | 1034 | MODULE_DESCRIPTION("Longhaul driver for VIA Cyrix processors."); |
diff --git a/drivers/cpuidle/coupled.c b/drivers/cpuidle/coupled.c index 3265844839bf..2a297f86dbad 100644 --- a/drivers/cpuidle/coupled.c +++ b/drivers/cpuidle/coupled.c | |||
| @@ -209,7 +209,7 @@ inline int cpuidle_coupled_set_not_ready(struct cpuidle_coupled *coupled) | |||
| 209 | int all; | 209 | int all; |
| 210 | int ret; | 210 | int ret; |
| 211 | 211 | ||
| 212 | all = coupled->online_count || (coupled->online_count << WAITING_BITS); | 212 | all = coupled->online_count | (coupled->online_count << WAITING_BITS); |
| 213 | ret = atomic_add_unless(&coupled->ready_waiting_counts, | 213 | ret = atomic_add_unless(&coupled->ready_waiting_counts, |
| 214 | -MAX_WAITING_CPUS, all); | 214 | -MAX_WAITING_CPUS, all); |
| 215 | 215 | ||
diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c index 8df53dd8dbe1..fb4a7dd57f94 100644 --- a/drivers/cpuidle/cpuidle.c +++ b/drivers/cpuidle/cpuidle.c | |||
| @@ -70,7 +70,7 @@ int cpuidle_play_dead(void) | |||
| 70 | struct cpuidle_device *dev = __this_cpu_read(cpuidle_devices); | 70 | struct cpuidle_device *dev = __this_cpu_read(cpuidle_devices); |
| 71 | struct cpuidle_driver *drv = cpuidle_get_cpu_driver(dev); | 71 | struct cpuidle_driver *drv = cpuidle_get_cpu_driver(dev); |
| 72 | int i, dead_state = -1; | 72 | int i, dead_state = -1; |
| 73 | int power_usage = -1; | 73 | int power_usage = INT_MAX; |
| 74 | 74 | ||
| 75 | if (!drv) | 75 | if (!drv) |
| 76 | return -ENODEV; | 76 | return -ENODEV; |
diff --git a/drivers/cpuidle/driver.c b/drivers/cpuidle/driver.c index 3af841fb397a..c2b281afe0ed 100644 --- a/drivers/cpuidle/driver.c +++ b/drivers/cpuidle/driver.c | |||
| @@ -235,16 +235,10 @@ EXPORT_SYMBOL_GPL(cpuidle_get_driver); | |||
| 235 | */ | 235 | */ |
| 236 | struct cpuidle_driver *cpuidle_get_cpu_driver(struct cpuidle_device *dev) | 236 | struct cpuidle_driver *cpuidle_get_cpu_driver(struct cpuidle_device *dev) |
| 237 | { | 237 | { |
| 238 | struct cpuidle_driver *drv; | ||
| 239 | |||
| 240 | if (!dev) | 238 | if (!dev) |
| 241 | return NULL; | 239 | return NULL; |
| 242 | 240 | ||
| 243 | spin_lock(&cpuidle_driver_lock); | 241 | return __cpuidle_get_cpu_driver(dev->cpu); |
| 244 | drv = __cpuidle_get_cpu_driver(dev->cpu); | ||
| 245 | spin_unlock(&cpuidle_driver_lock); | ||
| 246 | |||
| 247 | return drv; | ||
| 248 | } | 242 | } |
| 249 | EXPORT_SYMBOL_GPL(cpuidle_get_cpu_driver); | 243 | EXPORT_SYMBOL_GPL(cpuidle_get_cpu_driver); |
| 250 | 244 | ||
diff --git a/drivers/cpuidle/governors/menu.c b/drivers/cpuidle/governors/menu.c index bd40b943b6db..20ea33afdda1 100644 --- a/drivers/cpuidle/governors/menu.c +++ b/drivers/cpuidle/governors/menu.c | |||
| @@ -312,7 +312,7 @@ static int menu_select(struct cpuidle_driver *drv, struct cpuidle_device *dev) | |||
| 312 | { | 312 | { |
| 313 | struct menu_device *data = &__get_cpu_var(menu_devices); | 313 | struct menu_device *data = &__get_cpu_var(menu_devices); |
| 314 | int latency_req = pm_qos_request(PM_QOS_CPU_DMA_LATENCY); | 314 | int latency_req = pm_qos_request(PM_QOS_CPU_DMA_LATENCY); |
| 315 | int power_usage = -1; | 315 | int power_usage = INT_MAX; |
| 316 | int i; | 316 | int i; |
| 317 | int multiplier; | 317 | int multiplier; |
| 318 | struct timespec t; | 318 | struct timespec t; |
diff --git a/drivers/dma/mv_xor.c b/drivers/dma/mv_xor.c index ac71f555dd72..e17fad03cb80 100644 --- a/drivers/dma/mv_xor.c +++ b/drivers/dma/mv_xor.c | |||
| @@ -1361,13 +1361,16 @@ static int mv_xor_probe(struct platform_device *pdev) | |||
| 1361 | err_channel_add: | 1361 | err_channel_add: |
| 1362 | for (i = 0; i < MV_XOR_MAX_CHANNELS; i++) | 1362 | for (i = 0; i < MV_XOR_MAX_CHANNELS; i++) |
| 1363 | if (xordev->channels[i]) { | 1363 | if (xordev->channels[i]) { |
| 1364 | mv_xor_channel_remove(xordev->channels[i]); | ||
| 1364 | if (pdev->dev.of_node) | 1365 | if (pdev->dev.of_node) |
| 1365 | irq_dispose_mapping(xordev->channels[i]->irq); | 1366 | irq_dispose_mapping(xordev->channels[i]->irq); |
| 1366 | mv_xor_channel_remove(xordev->channels[i]); | ||
| 1367 | } | 1367 | } |
| 1368 | 1368 | ||
| 1369 | clk_disable_unprepare(xordev->clk); | 1369 | if (!IS_ERR(xordev->clk)) { |
| 1370 | clk_put(xordev->clk); | 1370 | clk_disable_unprepare(xordev->clk); |
| 1371 | clk_put(xordev->clk); | ||
| 1372 | } | ||
| 1373 | |||
| 1371 | return ret; | 1374 | return ret; |
| 1372 | } | 1375 | } |
| 1373 | 1376 | ||
diff --git a/drivers/edac/Kconfig b/drivers/edac/Kconfig index 4c6c876d9dc3..66719925970f 100644 --- a/drivers/edac/Kconfig +++ b/drivers/edac/Kconfig | |||
| @@ -4,6 +4,9 @@ | |||
| 4 | # Licensed and distributed under the GPL | 4 | # Licensed and distributed under the GPL |
| 5 | # | 5 | # |
| 6 | 6 | ||
| 7 | config EDAC_SUPPORT | ||
| 8 | bool | ||
| 9 | |||
| 7 | menuconfig EDAC | 10 | menuconfig EDAC |
| 8 | bool "EDAC (Error Detection And Correction) reporting" | 11 | bool "EDAC (Error Detection And Correction) reporting" |
| 9 | depends on HAS_IOMEM | 12 | depends on HAS_IOMEM |
| @@ -27,13 +30,8 @@ menuconfig EDAC | |||
| 27 | There is also a mailing list for the EDAC project, which can | 30 | There is also a mailing list for the EDAC project, which can |
| 28 | be found via the sourceforge page. | 31 | be found via the sourceforge page. |
| 29 | 32 | ||
| 30 | config EDAC_SUPPORT | ||
| 31 | bool | ||
| 32 | |||
| 33 | if EDAC | 33 | if EDAC |
| 34 | 34 | ||
| 35 | comment "Reporting subsystems" | ||
| 36 | |||
| 37 | config EDAC_LEGACY_SYSFS | 35 | config EDAC_LEGACY_SYSFS |
| 38 | bool "EDAC legacy sysfs" | 36 | bool "EDAC legacy sysfs" |
| 39 | default y | 37 | default y |
diff --git a/drivers/edac/edac_mc_sysfs.c b/drivers/edac/edac_mc_sysfs.c index de2df92f9c77..0ca1ca71157f 100644 --- a/drivers/edac/edac_mc_sysfs.c +++ b/drivers/edac/edac_mc_sysfs.c | |||
| @@ -472,8 +472,7 @@ static void edac_delete_csrow_objects(struct mem_ctl_info *mci) | |||
| 472 | device_remove_file(&csrow->dev, | 472 | device_remove_file(&csrow->dev, |
| 473 | dynamic_csrow_ce_count_attr[chan]); | 473 | dynamic_csrow_ce_count_attr[chan]); |
| 474 | } | 474 | } |
| 475 | put_device(&mci->csrows[i]->dev); | 475 | device_unregister(&mci->csrows[i]->dev); |
| 476 | device_del(&mci->csrows[i]->dev); | ||
| 477 | } | 476 | } |
| 478 | } | 477 | } |
| 479 | #endif | 478 | #endif |
| @@ -1055,11 +1054,9 @@ fail: | |||
| 1055 | struct dimm_info *dimm = mci->dimms[i]; | 1054 | struct dimm_info *dimm = mci->dimms[i]; |
| 1056 | if (dimm->nr_pages == 0) | 1055 | if (dimm->nr_pages == 0) |
| 1057 | continue; | 1056 | continue; |
| 1058 | put_device(&dimm->dev); | 1057 | device_unregister(&dimm->dev); |
| 1059 | device_del(&dimm->dev); | ||
| 1060 | } | 1058 | } |
| 1061 | put_device(&mci->dev); | 1059 | device_unregister(&mci->dev); |
| 1062 | device_del(&mci->dev); | ||
| 1063 | bus_unregister(&mci->bus); | 1060 | bus_unregister(&mci->bus); |
| 1064 | kfree(mci->bus.name); | 1061 | kfree(mci->bus.name); |
| 1065 | return err; | 1062 | return err; |
| @@ -1086,16 +1083,14 @@ void edac_remove_sysfs_mci_device(struct mem_ctl_info *mci) | |||
| 1086 | if (dimm->nr_pages == 0) | 1083 | if (dimm->nr_pages == 0) |
| 1087 | continue; | 1084 | continue; |
| 1088 | edac_dbg(0, "removing device %s\n", dev_name(&dimm->dev)); | 1085 | edac_dbg(0, "removing device %s\n", dev_name(&dimm->dev)); |
| 1089 | put_device(&dimm->dev); | 1086 | device_unregister(&dimm->dev); |
| 1090 | device_del(&dimm->dev); | ||
| 1091 | } | 1087 | } |
| 1092 | } | 1088 | } |
| 1093 | 1089 | ||
| 1094 | void edac_unregister_sysfs(struct mem_ctl_info *mci) | 1090 | void edac_unregister_sysfs(struct mem_ctl_info *mci) |
| 1095 | { | 1091 | { |
| 1096 | edac_dbg(1, "Unregistering device %s\n", dev_name(&mci->dev)); | 1092 | edac_dbg(1, "Unregistering device %s\n", dev_name(&mci->dev)); |
| 1097 | put_device(&mci->dev); | 1093 | device_unregister(&mci->dev); |
| 1098 | device_del(&mci->dev); | ||
| 1099 | bus_unregister(&mci->bus); | 1094 | bus_unregister(&mci->bus); |
| 1100 | kfree(mci->bus.name); | 1095 | kfree(mci->bus.name); |
| 1101 | } | 1096 | } |
| @@ -1159,8 +1154,6 @@ int __init edac_mc_sysfs_init(void) | |||
| 1159 | 1154 | ||
| 1160 | void __exit edac_mc_sysfs_exit(void) | 1155 | void __exit edac_mc_sysfs_exit(void) |
| 1161 | { | 1156 | { |
| 1162 | put_device(mci_pdev); | 1157 | device_unregister(mci_pdev); |
| 1163 | device_del(mci_pdev); | ||
| 1164 | edac_put_sysfs_subsys(); | 1158 | edac_put_sysfs_subsys(); |
| 1165 | kfree(mci_pdev); | ||
| 1166 | } | 1159 | } |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_buf.c b/drivers/gpu/drm/exynos/exynos_drm_buf.c index 9601bad47a2e..57affae9568b 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_buf.c +++ b/drivers/gpu/drm/exynos/exynos_drm_buf.c | |||
| @@ -3,24 +3,10 @@ | |||
| 3 | * Copyright (c) 2011 Samsung Electronics Co., Ltd. | 3 | * Copyright (c) 2011 Samsung Electronics Co., Ltd. |
| 4 | * Author: Inki Dae <inki.dae@samsung.com> | 4 | * Author: Inki Dae <inki.dae@samsung.com> |
| 5 | * | 5 | * |
| 6 | * Permission is hereby granted, free of charge, to any person obtaining a | 6 | * This program is free software; you can redistribute it and/or modify it |
| 7 | * copy of this software and associated documentation files (the "Software"), | 7 | * under the terms of the GNU General Public License as published by the |
| 8 | * to deal in the Software without restriction, including without limitation | 8 | * Free Software Foundation; either version 2 of the License, or (at your |
| 9 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | 9 | * option) any later version. |
| 10 | * and/or sell copies of the Software, and to permit persons to whom the | ||
| 11 | * Software is furnished to do so, subject to the following conditions: | ||
| 12 | * | ||
| 13 | * The above copyright notice and this permission notice (including the next | ||
| 14 | * paragraph) shall be included in all copies or substantial portions of the | ||
| 15 | * Software. | ||
| 16 | * | ||
| 17 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 18 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 19 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 20 | * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
| 21 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
| 22 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 23 | * OTHER DEALINGS IN THE SOFTWARE. | ||
| 24 | */ | 10 | */ |
| 25 | 11 | ||
| 26 | #include <drm/drmP.h> | 12 | #include <drm/drmP.h> |
| @@ -29,6 +15,7 @@ | |||
| 29 | #include "exynos_drm_drv.h" | 15 | #include "exynos_drm_drv.h" |
| 30 | #include "exynos_drm_gem.h" | 16 | #include "exynos_drm_gem.h" |
| 31 | #include "exynos_drm_buf.h" | 17 | #include "exynos_drm_buf.h" |
| 18 | #include "exynos_drm_iommu.h" | ||
| 32 | 19 | ||
| 33 | static int lowlevel_buffer_allocate(struct drm_device *dev, | 20 | static int lowlevel_buffer_allocate(struct drm_device *dev, |
| 34 | unsigned int flags, struct exynos_drm_gem_buf *buf) | 21 | unsigned int flags, struct exynos_drm_gem_buf *buf) |
| @@ -51,7 +38,7 @@ static int lowlevel_buffer_allocate(struct drm_device *dev, | |||
| 51 | * region will be allocated else physically contiguous | 38 | * region will be allocated else physically contiguous |
| 52 | * as possible. | 39 | * as possible. |
| 53 | */ | 40 | */ |
| 54 | if (flags & EXYNOS_BO_CONTIG) | 41 | if (!(flags & EXYNOS_BO_NONCONTIG)) |
| 55 | dma_set_attr(DMA_ATTR_FORCE_CONTIGUOUS, &buf->dma_attrs); | 42 | dma_set_attr(DMA_ATTR_FORCE_CONTIGUOUS, &buf->dma_attrs); |
| 56 | 43 | ||
| 57 | /* | 44 | /* |
| @@ -66,14 +53,45 @@ static int lowlevel_buffer_allocate(struct drm_device *dev, | |||
| 66 | dma_set_attr(attr, &buf->dma_attrs); | 53 | dma_set_attr(attr, &buf->dma_attrs); |
| 67 | dma_set_attr(DMA_ATTR_NO_KERNEL_MAPPING, &buf->dma_attrs); | 54 | dma_set_attr(DMA_ATTR_NO_KERNEL_MAPPING, &buf->dma_attrs); |
| 68 | 55 | ||
| 69 | buf->pages = dma_alloc_attrs(dev->dev, buf->size, | 56 | nr_pages = buf->size >> PAGE_SHIFT; |
| 70 | &buf->dma_addr, GFP_KERNEL, &buf->dma_attrs); | 57 | |
| 71 | if (!buf->pages) { | 58 | if (!is_drm_iommu_supported(dev)) { |
| 72 | DRM_ERROR("failed to allocate buffer.\n"); | 59 | dma_addr_t start_addr; |
| 73 | return -ENOMEM; | 60 | unsigned int i = 0; |
| 61 | |||
| 62 | buf->pages = kzalloc(sizeof(struct page) * nr_pages, | ||
| 63 | GFP_KERNEL); | ||
| 64 | if (!buf->pages) { | ||
| 65 | DRM_ERROR("failed to allocate pages.\n"); | ||
| 66 | return -ENOMEM; | ||
| 67 | } | ||
| 68 | |||
| 69 | buf->kvaddr = dma_alloc_attrs(dev->dev, buf->size, | ||
| 70 | &buf->dma_addr, GFP_KERNEL, | ||
| 71 | &buf->dma_attrs); | ||
| 72 | if (!buf->kvaddr) { | ||
| 73 | DRM_ERROR("failed to allocate buffer.\n"); | ||
| 74 | kfree(buf->pages); | ||
| 75 | return -ENOMEM; | ||
| 76 | } | ||
| 77 | |||
| 78 | start_addr = buf->dma_addr; | ||
| 79 | while (i < nr_pages) { | ||
| 80 | buf->pages[i] = phys_to_page(start_addr); | ||
| 81 | start_addr += PAGE_SIZE; | ||
| 82 | i++; | ||
| 83 | } | ||
| 84 | } else { | ||
| 85 | |||
| 86 | buf->pages = dma_alloc_attrs(dev->dev, buf->size, | ||
| 87 | &buf->dma_addr, GFP_KERNEL, | ||
| 88 | &buf->dma_attrs); | ||
| 89 | if (!buf->pages) { | ||
| 90 | DRM_ERROR("failed to allocate buffer.\n"); | ||
| 91 | return -ENOMEM; | ||
| 92 | } | ||
| 74 | } | 93 | } |
| 75 | 94 | ||
| 76 | nr_pages = buf->size >> PAGE_SHIFT; | ||
| 77 | buf->sgt = drm_prime_pages_to_sg(buf->pages, nr_pages); | 95 | buf->sgt = drm_prime_pages_to_sg(buf->pages, nr_pages); |
| 78 | if (!buf->sgt) { | 96 | if (!buf->sgt) { |
| 79 | DRM_ERROR("failed to get sg table.\n"); | 97 | DRM_ERROR("failed to get sg table.\n"); |
| @@ -92,6 +110,9 @@ err_free_attrs: | |||
| 92 | (dma_addr_t)buf->dma_addr, &buf->dma_attrs); | 110 | (dma_addr_t)buf->dma_addr, &buf->dma_attrs); |
| 93 | buf->dma_addr = (dma_addr_t)NULL; | 111 | buf->dma_addr = (dma_addr_t)NULL; |
| 94 | 112 | ||
| 113 | if (!is_drm_iommu_supported(dev)) | ||
| 114 | kfree(buf->pages); | ||
| 115 | |||
| 95 | return ret; | 116 | return ret; |
| 96 | } | 117 | } |
| 97 | 118 | ||
| @@ -114,8 +135,14 @@ static void lowlevel_buffer_deallocate(struct drm_device *dev, | |||
| 114 | kfree(buf->sgt); | 135 | kfree(buf->sgt); |
| 115 | buf->sgt = NULL; | 136 | buf->sgt = NULL; |
| 116 | 137 | ||
| 117 | dma_free_attrs(dev->dev, buf->size, buf->pages, | 138 | if (!is_drm_iommu_supported(dev)) { |
| 139 | dma_free_attrs(dev->dev, buf->size, buf->kvaddr, | ||
| 118 | (dma_addr_t)buf->dma_addr, &buf->dma_attrs); | 140 | (dma_addr_t)buf->dma_addr, &buf->dma_attrs); |
| 141 | kfree(buf->pages); | ||
| 142 | } else | ||
| 143 | dma_free_attrs(dev->dev, buf->size, buf->pages, | ||
| 144 | (dma_addr_t)buf->dma_addr, &buf->dma_attrs); | ||
| 145 | |||
| 119 | buf->dma_addr = (dma_addr_t)NULL; | 146 | buf->dma_addr = (dma_addr_t)NULL; |
| 120 | } | 147 | } |
| 121 | 148 | ||
diff --git a/drivers/gpu/drm/exynos/exynos_drm_buf.h b/drivers/gpu/drm/exynos/exynos_drm_buf.h index 25cf16285033..a6412f19673c 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_buf.h +++ b/drivers/gpu/drm/exynos/exynos_drm_buf.h | |||
| @@ -3,24 +3,10 @@ | |||
| 3 | * Copyright (c) 2011 Samsung Electronics Co., Ltd. | 3 | * Copyright (c) 2011 Samsung Electronics Co., Ltd. |
| 4 | * Author: Inki Dae <inki.dae@samsung.com> | 4 | * Author: Inki Dae <inki.dae@samsung.com> |
| 5 | * | 5 | * |
| 6 | * Permission is hereby granted, free of charge, to any person obtaining a | 6 | * This program is free software; you can redistribute it and/or modify it |
| 7 | * copy of this software and associated documentation files (the "Software"), | 7 | * under the terms of the GNU General Public License as published by the |
| 8 | * to deal in the Software without restriction, including without limitation | 8 | * Free Software Foundation; either version 2 of the License, or (at your |
| 9 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | 9 | * option) any later version. |
| 10 | * and/or sell copies of the Software, and to permit persons to whom the | ||
| 11 | * Software is furnished to do so, subject to the following conditions: | ||
| 12 | * | ||
| 13 | * The above copyright notice and this permission notice (including the next | ||
| 14 | * paragraph) shall be included in all copies or substantial portions of the | ||
| 15 | * Software. | ||
| 16 | * | ||
| 17 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 18 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 19 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 20 | * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
| 21 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
| 22 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 23 | * OTHER DEALINGS IN THE SOFTWARE. | ||
| 24 | */ | 10 | */ |
| 25 | 11 | ||
| 26 | #ifndef _EXYNOS_DRM_BUF_H_ | 12 | #ifndef _EXYNOS_DRM_BUF_H_ |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_connector.c b/drivers/gpu/drm/exynos/exynos_drm_connector.c index 0f68a2872673..ab37437bad8a 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_connector.c +++ b/drivers/gpu/drm/exynos/exynos_drm_connector.c | |||
| @@ -5,24 +5,10 @@ | |||
| 5 | * Joonyoung Shim <jy0922.shim@samsung.com> | 5 | * Joonyoung Shim <jy0922.shim@samsung.com> |
| 6 | * Seung-Woo Kim <sw0312.kim@samsung.com> | 6 | * Seung-Woo Kim <sw0312.kim@samsung.com> |
| 7 | * | 7 | * |
| 8 | * Permission is hereby granted, free of charge, to any person obtaining a | 8 | * This program is free software; you can redistribute it and/or modify it |
| 9 | * copy of this software and associated documentation files (the "Software"), | 9 | * under the terms of the GNU General Public License as published by the |
| 10 | * to deal in the Software without restriction, including without limitation | 10 | * Free Software Foundation; either version 2 of the License, or (at your |
| 11 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | 11 | * option) any later version. |
| 12 | * and/or sell copies of the Software, and to permit persons to whom the | ||
| 13 | * Software is furnished to do so, subject to the following conditions: | ||
| 14 | * | ||
| 15 | * The above copyright notice and this permission notice (including the next | ||
| 16 | * paragraph) shall be included in all copies or substantial portions of the | ||
| 17 | * Software. | ||
| 18 | * | ||
| 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 20 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 21 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 22 | * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
| 23 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
| 24 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 25 | * OTHER DEALINGS IN THE SOFTWARE. | ||
| 26 | */ | 12 | */ |
| 27 | 13 | ||
| 28 | #include <drm/drmP.h> | 14 | #include <drm/drmP.h> |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_connector.h b/drivers/gpu/drm/exynos/exynos_drm_connector.h index 22f6cc442c3d..547c6b590357 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_connector.h +++ b/drivers/gpu/drm/exynos/exynos_drm_connector.h | |||
| @@ -5,24 +5,10 @@ | |||
| 5 | * Joonyoung Shim <jy0922.shim@samsung.com> | 5 | * Joonyoung Shim <jy0922.shim@samsung.com> |
| 6 | * Seung-Woo Kim <sw0312.kim@samsung.com> | 6 | * Seung-Woo Kim <sw0312.kim@samsung.com> |
| 7 | * | 7 | * |
| 8 | * Permission is hereby granted, free of charge, to any person obtaining a | 8 | * This program is free software; you can redistribute it and/or modify it |
| 9 | * copy of this software and associated documentation files (the "Software"), | 9 | * under the terms of the GNU General Public License as published by the |
| 10 | * to deal in the Software without restriction, including without limitation | 10 | * Free Software Foundation; either version 2 of the License, or (at your |
| 11 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | 11 | * option) any later version. |
| 12 | * and/or sell copies of the Software, and to permit persons to whom the | ||
| 13 | * Software is furnished to do so, subject to the following conditions: | ||
| 14 | * | ||
| 15 | * The above copyright notice and this permission notice (including the next | ||
| 16 | * paragraph) shall be included in all copies or substantial portions of the | ||
| 17 | * Software. | ||
| 18 | * | ||
| 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 20 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 21 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 22 | * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
| 23 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
| 24 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 25 | * OTHER DEALINGS IN THE SOFTWARE. | ||
| 26 | */ | 12 | */ |
| 27 | 13 | ||
| 28 | #ifndef _EXYNOS_DRM_CONNECTOR_H_ | 14 | #ifndef _EXYNOS_DRM_CONNECTOR_H_ |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_core.c b/drivers/gpu/drm/exynos/exynos_drm_core.c index 94026ad76a77..4667c9f67acd 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_core.c +++ b/drivers/gpu/drm/exynos/exynos_drm_core.c | |||
| @@ -6,24 +6,10 @@ | |||
| 6 | * Joonyoung Shim <jy0922.shim@samsung.com> | 6 | * Joonyoung Shim <jy0922.shim@samsung.com> |
| 7 | * Seung-Woo Kim <sw0312.kim@samsung.com> | 7 | * Seung-Woo Kim <sw0312.kim@samsung.com> |
| 8 | * | 8 | * |
| 9 | * Permission is hereby granted, free of charge, to any person obtaining a | 9 | * This program is free software; you can redistribute it and/or modify it |
| 10 | * copy of this software and associated documentation files (the "Software"), | 10 | * under the terms of the GNU General Public License as published by the |
| 11 | * to deal in the Software without restriction, including without limitation | 11 | * Free Software Foundation; either version 2 of the License, or (at your |
| 12 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | 12 | * option) any later version. |
| 13 | * and/or sell copies of the Software, and to permit persons to whom the | ||
| 14 | * Software is furnished to do so, subject to the following conditions: | ||
| 15 | * | ||
| 16 | * The above copyright notice and this permission notice (including the next | ||
| 17 | * paragraph) shall be included in all copies or substantial portions of the | ||
| 18 | * Software. | ||
| 19 | * | ||
| 20 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 21 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 22 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 23 | * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
| 24 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
| 25 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 26 | * OTHER DEALINGS IN THE SOFTWARE. | ||
| 27 | */ | 13 | */ |
| 28 | 14 | ||
| 29 | #include <drm/drmP.h> | 15 | #include <drm/drmP.h> |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.c b/drivers/gpu/drm/exynos/exynos_drm_crtc.c index 2efa4b031d73..e8894bc9e6d5 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_crtc.c +++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.c | |||
| @@ -6,24 +6,10 @@ | |||
| 6 | * Joonyoung Shim <jy0922.shim@samsung.com> | 6 | * Joonyoung Shim <jy0922.shim@samsung.com> |
| 7 | * Seung-Woo Kim <sw0312.kim@samsung.com> | 7 | * Seung-Woo Kim <sw0312.kim@samsung.com> |
| 8 | * | 8 | * |
| 9 | * Permission is hereby granted, free of charge, to any person obtaining a | 9 | * This program is free software; you can redistribute it and/or modify it |
| 10 | * copy of this software and associated documentation files (the "Software"), | 10 | * under the terms of the GNU General Public License as published by the |
| 11 | * to deal in the Software without restriction, including without limitation | 11 | * Free Software Foundation; either version 2 of the License, or (at your |
| 12 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | 12 | * option) any later version. |
| 13 | * and/or sell copies of the Software, and to permit persons to whom the | ||
| 14 | * Software is furnished to do so, subject to the following conditions: | ||
| 15 | * | ||
| 16 | * The above copyright notice and this permission notice (including the next | ||
| 17 | * paragraph) shall be included in all copies or substantial portions of the | ||
| 18 | * Software. | ||
| 19 | * | ||
| 20 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 21 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 22 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 23 | * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
| 24 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
| 25 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 26 | * OTHER DEALINGS IN THE SOFTWARE. | ||
| 27 | */ | 13 | */ |
| 28 | 14 | ||
| 29 | #include <drm/drmP.h> | 15 | #include <drm/drmP.h> |
| @@ -407,3 +393,33 @@ void exynos_drm_crtc_disable_vblank(struct drm_device *dev, int crtc) | |||
| 407 | exynos_drm_fn_encoder(private->crtc[crtc], &crtc, | 393 | exynos_drm_fn_encoder(private->crtc[crtc], &crtc, |
| 408 | exynos_drm_disable_vblank); | 394 | exynos_drm_disable_vblank); |
| 409 | } | 395 | } |
| 396 | |||
| 397 | void exynos_drm_crtc_finish_pageflip(struct drm_device *dev, int crtc) | ||
| 398 | { | ||
| 399 | struct exynos_drm_private *dev_priv = dev->dev_private; | ||
| 400 | struct drm_pending_vblank_event *e, *t; | ||
| 401 | struct timeval now; | ||
| 402 | unsigned long flags; | ||
| 403 | |||
| 404 | DRM_DEBUG_KMS("%s\n", __FILE__); | ||
| 405 | |||
| 406 | spin_lock_irqsave(&dev->event_lock, flags); | ||
| 407 | |||
| 408 | list_for_each_entry_safe(e, t, &dev_priv->pageflip_event_list, | ||
| 409 | base.link) { | ||
| 410 | /* if event's pipe isn't same as crtc then ignore it. */ | ||
| 411 | if (crtc != e->pipe) | ||
| 412 | continue; | ||
| 413 | |||
| 414 | do_gettimeofday(&now); | ||
| 415 | e->event.sequence = 0; | ||
| 416 | e->event.tv_sec = now.tv_sec; | ||
| 417 | e->event.tv_usec = now.tv_usec; | ||
| 418 | |||
| 419 | list_move_tail(&e->base.link, &e->base.file_priv->event_list); | ||
| 420 | wake_up_interruptible(&e->base.file_priv->event_wait); | ||
| 421 | drm_vblank_put(dev, crtc); | ||
| 422 | } | ||
| 423 | |||
| 424 | spin_unlock_irqrestore(&dev->event_lock, flags); | ||
| 425 | } | ||
diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.h b/drivers/gpu/drm/exynos/exynos_drm_crtc.h index 6bae8d8c250e..3e197e6ae7d9 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_crtc.h +++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.h | |||
| @@ -6,24 +6,10 @@ | |||
| 6 | * Joonyoung Shim <jy0922.shim@samsung.com> | 6 | * Joonyoung Shim <jy0922.shim@samsung.com> |
| 7 | * Seung-Woo Kim <sw0312.kim@samsung.com> | 7 | * Seung-Woo Kim <sw0312.kim@samsung.com> |
| 8 | * | 8 | * |
| 9 | * Permission is hereby granted, free of charge, to any person obtaining a | 9 | * This program is free software; you can redistribute it and/or modify it |
| 10 | * copy of this software and associated documentation files (the "Software"), | 10 | * under the terms of the GNU General Public License as published by the |
| 11 | * to deal in the Software without restriction, including without limitation | 11 | * Free Software Foundation; either version 2 of the License, or (at your |
| 12 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | 12 | * option) any later version. |
| 13 | * and/or sell copies of the Software, and to permit persons to whom the | ||
| 14 | * Software is furnished to do so, subject to the following conditions: | ||
| 15 | * | ||
| 16 | * The above copyright notice and this permission notice (including the next | ||
| 17 | * paragraph) shall be included in all copies or substantial portions of the | ||
| 18 | * Software. | ||
| 19 | * | ||
| 20 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 21 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 22 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 23 | * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
| 24 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
| 25 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 26 | * OTHER DEALINGS IN THE SOFTWARE. | ||
| 27 | */ | 13 | */ |
| 28 | 14 | ||
| 29 | #ifndef _EXYNOS_DRM_CRTC_H_ | 15 | #ifndef _EXYNOS_DRM_CRTC_H_ |
| @@ -32,5 +18,6 @@ | |||
| 32 | int exynos_drm_crtc_create(struct drm_device *dev, unsigned int nr); | 18 | int exynos_drm_crtc_create(struct drm_device *dev, unsigned int nr); |
| 33 | int exynos_drm_crtc_enable_vblank(struct drm_device *dev, int crtc); | 19 | int exynos_drm_crtc_enable_vblank(struct drm_device *dev, int crtc); |
| 34 | void exynos_drm_crtc_disable_vblank(struct drm_device *dev, int crtc); | 20 | void exynos_drm_crtc_disable_vblank(struct drm_device *dev, int crtc); |
| 21 | void exynos_drm_crtc_finish_pageflip(struct drm_device *dev, int crtc); | ||
| 35 | 22 | ||
| 36 | #endif | 23 | #endif |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c b/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c index 61d5a8402eb8..9df97714b6c0 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c +++ b/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c | |||
| @@ -3,24 +3,10 @@ | |||
| 3 | * Copyright (c) 2012 Samsung Electronics Co., Ltd. | 3 | * Copyright (c) 2012 Samsung Electronics Co., Ltd. |
| 4 | * Author: Inki Dae <inki.dae@samsung.com> | 4 | * Author: Inki Dae <inki.dae@samsung.com> |
| 5 | * | 5 | * |
| 6 | * Permission is hereby granted, free of charge, to any person obtaining a | 6 | * This program is free software; you can redistribute it and/or modify it |
| 7 | * copy of this software and associated documentation files (the "Software"), | 7 | * under the terms of the GNU General Public License as published by the |
| 8 | * to deal in the Software without restriction, including without limitation | 8 | * Free Software Foundation; either version 2 of the License, or (at your |
| 9 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | 9 | * option) any later version. |
| 10 | * and/or sell copies of the Software, and to permit persons to whom the | ||
| 11 | * Software is furnished to do so, subject to the following conditions: | ||
| 12 | * | ||
| 13 | * The above copyright notice and this permission notice (including the next | ||
| 14 | * paragraph) shall be included in all copies or substantial portions of the | ||
| 15 | * Software. | ||
| 16 | * | ||
| 17 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 18 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 19 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 20 | * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
| 21 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
| 22 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 23 | * OTHER DEALINGS IN THE SOFTWARE. | ||
| 24 | */ | 10 | */ |
| 25 | 11 | ||
| 26 | #include <drm/drmP.h> | 12 | #include <drm/drmP.h> |
| @@ -222,7 +208,7 @@ struct dma_buf *exynos_dmabuf_prime_export(struct drm_device *drm_dev, | |||
| 222 | struct exynos_drm_gem_obj *exynos_gem_obj = to_exynos_gem_obj(obj); | 208 | struct exynos_drm_gem_obj *exynos_gem_obj = to_exynos_gem_obj(obj); |
| 223 | 209 | ||
| 224 | return dma_buf_export(exynos_gem_obj, &exynos_dmabuf_ops, | 210 | return dma_buf_export(exynos_gem_obj, &exynos_dmabuf_ops, |
| 225 | exynos_gem_obj->base.size, 0600); | 211 | exynos_gem_obj->base.size, flags); |
| 226 | } | 212 | } |
| 227 | 213 | ||
| 228 | struct drm_gem_object *exynos_dmabuf_prime_import(struct drm_device *drm_dev, | 214 | struct drm_gem_object *exynos_dmabuf_prime_import(struct drm_device *drm_dev, |
| @@ -246,7 +232,12 @@ struct drm_gem_object *exynos_dmabuf_prime_import(struct drm_device *drm_dev, | |||
| 246 | 232 | ||
| 247 | /* is it from our device? */ | 233 | /* is it from our device? */ |
| 248 | if (obj->dev == drm_dev) { | 234 | if (obj->dev == drm_dev) { |
| 235 | /* | ||
| 236 | * Importing dmabuf exported from out own gem increases | ||
| 237 | * refcount on gem itself instead of f_count of dmabuf. | ||
| 238 | */ | ||
| 249 | drm_gem_object_reference(obj); | 239 | drm_gem_object_reference(obj); |
| 240 | dma_buf_put(dma_buf); | ||
| 250 | return obj; | 241 | return obj; |
| 251 | } | 242 | } |
| 252 | } | 243 | } |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_dmabuf.h b/drivers/gpu/drm/exynos/exynos_drm_dmabuf.h index 662a8f98ccdb..49acfafb4fdb 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_dmabuf.h +++ b/drivers/gpu/drm/exynos/exynos_drm_dmabuf.h | |||
| @@ -3,24 +3,10 @@ | |||
| 3 | * Copyright (c) 2012 Samsung Electronics Co., Ltd. | 3 | * Copyright (c) 2012 Samsung Electronics Co., Ltd. |
| 4 | * Author: Inki Dae <inki.dae@samsung.com> | 4 | * Author: Inki Dae <inki.dae@samsung.com> |
| 5 | * | 5 | * |
| 6 | * Permission is hereby granted, free of charge, to any person obtaining a | 6 | * This program is free software; you can redistribute it and/or modify it |
| 7 | * copy of this software and associated documentation files (the "Software"), | 7 | * under the terms of the GNU General Public License as published by the |
| 8 | * to deal in the Software without restriction, including without limitation | 8 | * Free Software Foundation; either version 2 of the License, or (at your |
| 9 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | 9 | * option) any later version. |
| 10 | * and/or sell copies of the Software, and to permit persons to whom the | ||
| 11 | * Software is furnished to do so, subject to the following conditions: | ||
| 12 | * | ||
| 13 | * The above copyright notice and this permission notice (including the next | ||
| 14 | * paragraph) shall be included in all copies or substantial portions of the | ||
| 15 | * Software. | ||
| 16 | * | ||
| 17 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 18 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 19 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 20 | * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
| 21 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
| 22 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 23 | * OTHER DEALINGS IN THE SOFTWARE. | ||
| 24 | */ | 10 | */ |
| 25 | 11 | ||
| 26 | #ifndef _EXYNOS_DRM_DMABUF_H_ | 12 | #ifndef _EXYNOS_DRM_DMABUF_H_ |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c index 1713e53d4751..3da5c2d214d8 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_drv.c +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c | |||
| @@ -5,24 +5,10 @@ | |||
| 5 | * Joonyoung Shim <jy0922.shim@samsung.com> | 5 | * Joonyoung Shim <jy0922.shim@samsung.com> |
| 6 | * Seung-Woo Kim <sw0312.kim@samsung.com> | 6 | * Seung-Woo Kim <sw0312.kim@samsung.com> |
| 7 | * | 7 | * |
| 8 | * Permission is hereby granted, free of charge, to any person obtaining a | 8 | * This program is free software; you can redistribute it and/or modify it |
| 9 | * copy of this software and associated documentation files (the "Software"), | 9 | * under the terms of the GNU General Public License as published by the |
| 10 | * to deal in the Software without restriction, including without limitation | 10 | * Free Software Foundation; either version 2 of the License, or (at your |
| 11 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | 11 | * option) any later version. |
| 12 | * and/or sell copies of the Software, and to permit persons to whom the | ||
| 13 | * Software is furnished to do so, subject to the following conditions: | ||
| 14 | * | ||
| 15 | * The above copyright notice and this permission notice (including the next | ||
| 16 | * paragraph) shall be included in all copies or substantial portions of the | ||
| 17 | * Software. | ||
| 18 | * | ||
| 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 20 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 21 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 22 | * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
| 23 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
| 24 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 25 | * OTHER DEALINGS IN THE SOFTWARE. | ||
| 26 | */ | 12 | */ |
| 27 | 13 | ||
| 28 | #include <drm/drmP.h> | 14 | #include <drm/drmP.h> |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h index f5a97745bf93..b9e51bc09e81 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h | |||
| @@ -6,24 +6,10 @@ | |||
| 6 | * Joonyoung Shim <jy0922.shim@samsung.com> | 6 | * Joonyoung Shim <jy0922.shim@samsung.com> |
| 7 | * Seung-Woo Kim <sw0312.kim@samsung.com> | 7 | * Seung-Woo Kim <sw0312.kim@samsung.com> |
| 8 | * | 8 | * |
| 9 | * Permission is hereby granted, free of charge, to any person obtaining a | 9 | * This program is free software; you can redistribute it and/or modify it |
| 10 | * copy of this software and associated documentation files (the "Software"), | 10 | * under the terms of the GNU General Public License as published by the |
| 11 | * to deal in the Software without restriction, including without limitation | 11 | * Free Software Foundation; either version 2 of the License, or (at your |
| 12 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | 12 | * option) any later version. |
| 13 | * and/or sell copies of the Software, and to permit persons to whom the | ||
| 14 | * Software is furnished to do so, subject to the following conditions: | ||
| 15 | * | ||
| 16 | * The above copyright notice and this permission notice (including the next | ||
| 17 | * paragraph) shall be included in all copies or substantial portions of the | ||
| 18 | * Software. | ||
| 19 | * | ||
| 20 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 21 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 22 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 23 | * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
| 24 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
| 25 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 26 | * OTHER DEALINGS IN THE SOFTWARE. | ||
| 27 | */ | 13 | */ |
| 28 | 14 | ||
| 29 | #ifndef _EXYNOS_DRM_DRV_H_ | 15 | #ifndef _EXYNOS_DRM_DRV_H_ |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_encoder.c b/drivers/gpu/drm/exynos/exynos_drm_encoder.c index 301485215a70..c63721f64aec 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_encoder.c +++ b/drivers/gpu/drm/exynos/exynos_drm_encoder.c | |||
| @@ -6,24 +6,10 @@ | |||
| 6 | * Joonyoung Shim <jy0922.shim@samsung.com> | 6 | * Joonyoung Shim <jy0922.shim@samsung.com> |
| 7 | * Seung-Woo Kim <sw0312.kim@samsung.com> | 7 | * Seung-Woo Kim <sw0312.kim@samsung.com> |
| 8 | * | 8 | * |
| 9 | * Permission is hereby granted, free of charge, to any person obtaining a | 9 | * This program is free software; you can redistribute it and/or modify it |
| 10 | * copy of this software and associated documentation files (the "Software"), | 10 | * under the terms of the GNU General Public License as published by the |
| 11 | * to deal in the Software without restriction, including without limitation | 11 | * Free Software Foundation; either version 2 of the License, or (at your |
| 12 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | 12 | * option) any later version. |
| 13 | * and/or sell copies of the Software, and to permit persons to whom the | ||
| 14 | * Software is furnished to do so, subject to the following conditions: | ||
| 15 | * | ||
| 16 | * The above copyright notice and this permission notice (including the next | ||
| 17 | * paragraph) shall be included in all copies or substantial portions of the | ||
| 18 | * Software. | ||
| 19 | * | ||
| 20 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 21 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 22 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 23 | * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
| 24 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
| 25 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 26 | * OTHER DEALINGS IN THE SOFTWARE. | ||
| 27 | */ | 13 | */ |
| 28 | 14 | ||
| 29 | #include <drm/drmP.h> | 15 | #include <drm/drmP.h> |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_encoder.h b/drivers/gpu/drm/exynos/exynos_drm_encoder.h index 88bb25a2a917..89e2fb0770af 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_encoder.h +++ b/drivers/gpu/drm/exynos/exynos_drm_encoder.h | |||
| @@ -5,24 +5,10 @@ | |||
| 5 | * Joonyoung Shim <jy0922.shim@samsung.com> | 5 | * Joonyoung Shim <jy0922.shim@samsung.com> |
| 6 | * Seung-Woo Kim <sw0312.kim@samsung.com> | 6 | * Seung-Woo Kim <sw0312.kim@samsung.com> |
| 7 | * | 7 | * |
| 8 | * Permission is hereby granted, free of charge, to any person obtaining a | 8 | * This program is free software; you can redistribute it and/or modify it |
| 9 | * copy of this software and associated documentation files (the "Software"), | 9 | * under the terms of the GNU General Public License as published by the |
| 10 | * to deal in the Software without restriction, including without limitation | 10 | * Free Software Foundation; either version 2 of the License, or (at your |
| 11 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | 11 | * option) any later version. |
| 12 | * and/or sell copies of the Software, and to permit persons to whom the | ||
| 13 | * Software is furnished to do so, subject to the following conditions: | ||
| 14 | * | ||
| 15 | * The above copyright notice and this permission notice (including the next | ||
| 16 | * paragraph) shall be included in all copies or substantial portions of the | ||
| 17 | * Software. | ||
| 18 | * | ||
| 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 20 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 21 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 22 | * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
| 23 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
| 24 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 25 | * OTHER DEALINGS IN THE SOFTWARE. | ||
| 26 | */ | 12 | */ |
| 27 | 13 | ||
| 28 | #ifndef _EXYNOS_DRM_ENCODER_H_ | 14 | #ifndef _EXYNOS_DRM_ENCODER_H_ |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fb.c b/drivers/gpu/drm/exynos/exynos_drm_fb.c index 5426cc5a5e8d..294c0513f587 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fb.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fb.c | |||
| @@ -6,24 +6,10 @@ | |||
| 6 | * Joonyoung Shim <jy0922.shim@samsung.com> | 6 | * Joonyoung Shim <jy0922.shim@samsung.com> |
| 7 | * Seung-Woo Kim <sw0312.kim@samsung.com> | 7 | * Seung-Woo Kim <sw0312.kim@samsung.com> |
| 8 | * | 8 | * |
| 9 | * Permission is hereby granted, free of charge, to any person obtaining a | 9 | * This program is free software; you can redistribute it and/or modify it |
| 10 | * copy of this software and associated documentation files (the "Software"), | 10 | * under the terms of the GNU General Public License as published by the |
| 11 | * to deal in the Software without restriction, including without limitation | 11 | * Free Software Foundation; either version 2 of the License, or (at your |
| 12 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | 12 | * option) any later version. |
| 13 | * and/or sell copies of the Software, and to permit persons to whom the | ||
| 14 | * Software is furnished to do so, subject to the following conditions: | ||
| 15 | * | ||
| 16 | * The above copyright notice and this permission notice (including the next | ||
| 17 | * paragraph) shall be included in all copies or substantial portions of the | ||
| 18 | * Software. | ||
| 19 | * | ||
| 20 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 21 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 22 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 23 | * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
| 24 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
| 25 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 26 | * OTHER DEALINGS IN THE SOFTWARE. | ||
| 27 | */ | 13 | */ |
| 28 | 14 | ||
| 29 | #include <drm/drmP.h> | 15 | #include <drm/drmP.h> |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fb.h b/drivers/gpu/drm/exynos/exynos_drm_fb.h index 96262e54f76d..517471b37566 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fb.h +++ b/drivers/gpu/drm/exynos/exynos_drm_fb.h | |||
| @@ -5,24 +5,10 @@ | |||
| 5 | * Joonyoung Shim <jy0922.shim@samsung.com> | 5 | * Joonyoung Shim <jy0922.shim@samsung.com> |
| 6 | * Seung-Woo Kim <sw0312.kim@samsung.com> | 6 | * Seung-Woo Kim <sw0312.kim@samsung.com> |
| 7 | * | 7 | * |
| 8 | * Permission is hereby granted, free of charge, to any person obtaining a | 8 | * This program is free software; you can redistribute it and/or modify it |
| 9 | * copy of this software and associated documentation files (the "Software"), | 9 | * under the terms of the GNU General Public License as published by the |
| 10 | * to deal in the Software without restriction, including without limitation | 10 | * Free Software Foundation; either version 2 of the License, or (at your |
| 11 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | 11 | * option) any later version. |
| 12 | * and/or sell copies of the Software, and to permit persons to whom the | ||
| 13 | * Software is furnished to do so, subject to the following conditions: | ||
| 14 | * | ||
| 15 | * The above copyright notice and this permission notice (including the next | ||
| 16 | * paragraph) shall be included in all copies or substantial portions of the | ||
| 17 | * Software. | ||
| 18 | * | ||
| 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 20 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 21 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 22 | * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
| 23 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
| 24 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 25 | * OTHER DEALINGS IN THE SOFTWARE. | ||
| 26 | */ | 12 | */ |
| 27 | 13 | ||
| 28 | #ifndef _EXYNOS_DRM_FB_H_ | 14 | #ifndef _EXYNOS_DRM_FB_H_ |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c index f433eb7533a9..71f867340a88 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c | |||
| @@ -6,24 +6,10 @@ | |||
| 6 | * Joonyoung Shim <jy0922.shim@samsung.com> | 6 | * Joonyoung Shim <jy0922.shim@samsung.com> |
| 7 | * Seung-Woo Kim <sw0312.kim@samsung.com> | 7 | * Seung-Woo Kim <sw0312.kim@samsung.com> |
| 8 | * | 8 | * |
| 9 | * Permission is hereby granted, free of charge, to any person obtaining a | 9 | * This program is free software; you can redistribute it and/or modify it |
| 10 | * copy of this software and associated documentation files (the "Software"), | 10 | * under the terms of the GNU General Public License as published by the |
| 11 | * to deal in the Software without restriction, including without limitation | 11 | * Free Software Foundation; either version 2 of the License, or (at your |
| 12 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | 12 | * option) any later version. |
| 13 | * and/or sell copies of the Software, and to permit persons to whom the | ||
| 14 | * Software is furnished to do so, subject to the following conditions: | ||
| 15 | * | ||
| 16 | * The above copyright notice and this permission notice (including the next | ||
| 17 | * paragraph) shall be included in all copies or substantial portions of the | ||
| 18 | * Software. | ||
| 19 | * | ||
| 20 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 21 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 22 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 23 | * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
| 24 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
| 25 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 26 | * OTHER DEALINGS IN THE SOFTWARE. | ||
| 27 | */ | 13 | */ |
| 28 | 14 | ||
| 29 | #include <drm/drmP.h> | 15 | #include <drm/drmP.h> |
| @@ -34,6 +20,7 @@ | |||
| 34 | #include "exynos_drm_drv.h" | 20 | #include "exynos_drm_drv.h" |
| 35 | #include "exynos_drm_fb.h" | 21 | #include "exynos_drm_fb.h" |
| 36 | #include "exynos_drm_gem.h" | 22 | #include "exynos_drm_gem.h" |
| 23 | #include "exynos_drm_iommu.h" | ||
| 37 | 24 | ||
| 38 | #define MAX_CONNECTOR 4 | 25 | #define MAX_CONNECTOR 4 |
| 39 | #define PREFERRED_BPP 32 | 26 | #define PREFERRED_BPP 32 |
| @@ -111,9 +98,18 @@ static int exynos_drm_fbdev_update(struct drm_fb_helper *helper, | |||
| 111 | 98 | ||
| 112 | /* map pages with kernel virtual space. */ | 99 | /* map pages with kernel virtual space. */ |
| 113 | if (!buffer->kvaddr) { | 100 | if (!buffer->kvaddr) { |
| 114 | unsigned int nr_pages = buffer->size >> PAGE_SHIFT; | 101 | if (is_drm_iommu_supported(dev)) { |
| 115 | buffer->kvaddr = vmap(buffer->pages, nr_pages, VM_MAP, | 102 | unsigned int nr_pages = buffer->size >> PAGE_SHIFT; |
| 103 | |||
| 104 | buffer->kvaddr = vmap(buffer->pages, nr_pages, VM_MAP, | ||
| 116 | pgprot_writecombine(PAGE_KERNEL)); | 105 | pgprot_writecombine(PAGE_KERNEL)); |
| 106 | } else { | ||
| 107 | phys_addr_t dma_addr = buffer->dma_addr; | ||
| 108 | if (dma_addr) | ||
| 109 | buffer->kvaddr = phys_to_virt(dma_addr); | ||
| 110 | else | ||
| 111 | buffer->kvaddr = (void __iomem *)NULL; | ||
| 112 | } | ||
| 117 | if (!buffer->kvaddr) { | 113 | if (!buffer->kvaddr) { |
| 118 | DRM_ERROR("failed to map pages to kernel space.\n"); | 114 | DRM_ERROR("failed to map pages to kernel space.\n"); |
| 119 | return -EIO; | 115 | return -EIO; |
| @@ -128,8 +124,12 @@ static int exynos_drm_fbdev_update(struct drm_fb_helper *helper, | |||
| 128 | 124 | ||
| 129 | dev->mode_config.fb_base = (resource_size_t)buffer->dma_addr; | 125 | dev->mode_config.fb_base = (resource_size_t)buffer->dma_addr; |
| 130 | fbi->screen_base = buffer->kvaddr + offset; | 126 | fbi->screen_base = buffer->kvaddr + offset; |
| 131 | fbi->fix.smem_start = (unsigned long) | 127 | if (is_drm_iommu_supported(dev)) |
| 128 | fbi->fix.smem_start = (unsigned long) | ||
| 132 | (page_to_phys(sg_page(buffer->sgt->sgl)) + offset); | 129 | (page_to_phys(sg_page(buffer->sgt->sgl)) + offset); |
| 130 | else | ||
| 131 | fbi->fix.smem_start = (unsigned long)buffer->dma_addr; | ||
| 132 | |||
| 133 | fbi->screen_size = size; | 133 | fbi->screen_size = size; |
| 134 | fbi->fix.smem_len = size; | 134 | fbi->fix.smem_len = size; |
| 135 | 135 | ||
| @@ -320,7 +320,7 @@ static void exynos_drm_fbdev_destroy(struct drm_device *dev, | |||
| 320 | struct exynos_drm_gem_obj *exynos_gem_obj = exynos_fbd->exynos_gem_obj; | 320 | struct exynos_drm_gem_obj *exynos_gem_obj = exynos_fbd->exynos_gem_obj; |
| 321 | struct drm_framebuffer *fb; | 321 | struct drm_framebuffer *fb; |
| 322 | 322 | ||
| 323 | if (exynos_gem_obj->buffer->kvaddr) | 323 | if (is_drm_iommu_supported(dev) && exynos_gem_obj->buffer->kvaddr) |
| 324 | vunmap(exynos_gem_obj->buffer->kvaddr); | 324 | vunmap(exynos_gem_obj->buffer->kvaddr); |
| 325 | 325 | ||
| 326 | /* release drm framebuffer and real buffer */ | 326 | /* release drm framebuffer and real buffer */ |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.h b/drivers/gpu/drm/exynos/exynos_drm_fbdev.h index ccfce8a1a451..e16d7f0ae192 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.h +++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.h | |||
| @@ -6,24 +6,10 @@ | |||
| 6 | * Joonyoung Shim <jy0922.shim@samsung.com> | 6 | * Joonyoung Shim <jy0922.shim@samsung.com> |
| 7 | * Seung-Woo Kim <sw0312.kim@samsung.com> | 7 | * Seung-Woo Kim <sw0312.kim@samsung.com> |
| 8 | * | 8 | * |
| 9 | * Permission is hereby granted, free of charge, to any person obtaining a | 9 | * This program is free software; you can redistribute it and/or modify it |
| 10 | * copy of this software and associated documentation files (the "Software"), | 10 | * under the terms of the GNU General Public License as published by the |
| 11 | * to deal in the Software without restriction, including without limitation | 11 | * Free Software Foundation; either version 2 of the License, or (at your |
| 12 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | 12 | * option) any later version. |
| 13 | * and/or sell copies of the Software, and to permit persons to whom the | ||
| 14 | * Software is furnished to do so, subject to the following conditions: | ||
| 15 | * | ||
| 16 | * The above copyright notice and this permission notice (including the next | ||
| 17 | * paragraph) shall be included in all copies or substantial portions of the | ||
| 18 | * Software. | ||
| 19 | * | ||
| 20 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 21 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 22 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 23 | * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
| 24 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
| 25 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 26 | * OTHER DEALINGS IN THE SOFTWARE. | ||
| 27 | */ | 13 | */ |
| 28 | 14 | ||
| 29 | #ifndef _EXYNOS_DRM_FBDEV_H_ | 15 | #ifndef _EXYNOS_DRM_FBDEV_H_ |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimc.c b/drivers/gpu/drm/exynos/exynos_drm_fimc.c index d9963171fd0b..67a83e69544b 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fimc.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fimc.c | |||
| @@ -25,7 +25,7 @@ | |||
| 25 | #include "exynos_drm_fimc.h" | 25 | #include "exynos_drm_fimc.h" |
| 26 | 26 | ||
| 27 | /* | 27 | /* |
| 28 | * FIMC is stand for Fully Interactive Mobile Camera and | 28 | * FIMC stands for Fully Interactive Mobile Camera and |
| 29 | * supports image scaler/rotator and input/output DMA operations. | 29 | * supports image scaler/rotator and input/output DMA operations. |
| 30 | * input DMA reads image data from the memory. | 30 | * input DMA reads image data from the memory. |
| 31 | * output DMA writes image data to memory. | 31 | * output DMA writes image data to memory. |
| @@ -163,19 +163,29 @@ struct fimc_context { | |||
| 163 | bool suspended; | 163 | bool suspended; |
| 164 | }; | 164 | }; |
| 165 | 165 | ||
| 166 | static void fimc_sw_reset(struct fimc_context *ctx, bool pattern) | 166 | static void fimc_sw_reset(struct fimc_context *ctx) |
| 167 | { | 167 | { |
| 168 | u32 cfg; | 168 | u32 cfg; |
| 169 | 169 | ||
| 170 | DRM_DEBUG_KMS("%s:pattern[%d]\n", __func__, pattern); | 170 | DRM_DEBUG_KMS("%s\n", __func__); |
| 171 | |||
| 172 | /* stop dma operation */ | ||
| 173 | cfg = fimc_read(EXYNOS_CISTATUS); | ||
| 174 | if (EXYNOS_CISTATUS_GET_ENVID_STATUS(cfg)) { | ||
| 175 | cfg = fimc_read(EXYNOS_MSCTRL); | ||
| 176 | cfg &= ~EXYNOS_MSCTRL_ENVID; | ||
| 177 | fimc_write(cfg, EXYNOS_MSCTRL); | ||
| 178 | } | ||
| 171 | 179 | ||
| 172 | cfg = fimc_read(EXYNOS_CISRCFMT); | 180 | cfg = fimc_read(EXYNOS_CISRCFMT); |
| 173 | cfg |= EXYNOS_CISRCFMT_ITU601_8BIT; | 181 | cfg |= EXYNOS_CISRCFMT_ITU601_8BIT; |
| 174 | if (pattern) | ||
| 175 | cfg |= EXYNOS_CIGCTRL_TESTPATTERN_COLOR_BAR; | ||
| 176 | |||
| 177 | fimc_write(cfg, EXYNOS_CISRCFMT); | 182 | fimc_write(cfg, EXYNOS_CISRCFMT); |
| 178 | 183 | ||
| 184 | /* disable image capture */ | ||
| 185 | cfg = fimc_read(EXYNOS_CIIMGCPT); | ||
| 186 | cfg &= ~(EXYNOS_CIIMGCPT_IMGCPTEN_SC | EXYNOS_CIIMGCPT_IMGCPTEN); | ||
| 187 | fimc_write(cfg, EXYNOS_CIIMGCPT); | ||
| 188 | |||
| 179 | /* s/w reset */ | 189 | /* s/w reset */ |
| 180 | cfg = fimc_read(EXYNOS_CIGCTRL); | 190 | cfg = fimc_read(EXYNOS_CIGCTRL); |
| 181 | cfg |= (EXYNOS_CIGCTRL_SWRST); | 191 | cfg |= (EXYNOS_CIGCTRL_SWRST); |
| @@ -695,7 +705,7 @@ static int fimc_src_set_addr(struct device *dev, | |||
| 695 | { | 705 | { |
| 696 | struct fimc_context *ctx = get_fimc_context(dev); | 706 | struct fimc_context *ctx = get_fimc_context(dev); |
| 697 | struct exynos_drm_ippdrv *ippdrv = &ctx->ippdrv; | 707 | struct exynos_drm_ippdrv *ippdrv = &ctx->ippdrv; |
| 698 | struct drm_exynos_ipp_cmd_node *c_node = ippdrv->cmd; | 708 | struct drm_exynos_ipp_cmd_node *c_node = ippdrv->c_node; |
| 699 | struct drm_exynos_ipp_property *property; | 709 | struct drm_exynos_ipp_property *property; |
| 700 | struct drm_exynos_ipp_config *config; | 710 | struct drm_exynos_ipp_config *config; |
| 701 | 711 | ||
| @@ -705,10 +715,6 @@ static int fimc_src_set_addr(struct device *dev, | |||
| 705 | } | 715 | } |
| 706 | 716 | ||
| 707 | property = &c_node->property; | 717 | property = &c_node->property; |
| 708 | if (!property) { | ||
| 709 | DRM_ERROR("failed to get property.\n"); | ||
| 710 | return -EINVAL; | ||
| 711 | } | ||
| 712 | 718 | ||
| 713 | DRM_DEBUG_KMS("%s:prop_id[%d]buf_id[%d]buf_type[%d]\n", __func__, | 719 | DRM_DEBUG_KMS("%s:prop_id[%d]buf_id[%d]buf_type[%d]\n", __func__, |
| 714 | property->prop_id, buf_id, buf_type); | 720 | property->prop_id, buf_id, buf_type); |
| @@ -1206,7 +1212,7 @@ static int fimc_dst_set_buf_seq(struct fimc_context *ctx, u32 buf_id, | |||
| 1206 | } | 1212 | } |
| 1207 | 1213 | ||
| 1208 | /* sequence id */ | 1214 | /* sequence id */ |
| 1209 | cfg &= (~mask); | 1215 | cfg &= ~mask; |
| 1210 | cfg |= (enable << buf_id); | 1216 | cfg |= (enable << buf_id); |
| 1211 | fimc_write(cfg, EXYNOS_CIFCNTSEQ); | 1217 | fimc_write(cfg, EXYNOS_CIFCNTSEQ); |
| 1212 | 1218 | ||
| @@ -1231,7 +1237,7 @@ static int fimc_dst_set_addr(struct device *dev, | |||
| 1231 | { | 1237 | { |
| 1232 | struct fimc_context *ctx = get_fimc_context(dev); | 1238 | struct fimc_context *ctx = get_fimc_context(dev); |
| 1233 | struct exynos_drm_ippdrv *ippdrv = &ctx->ippdrv; | 1239 | struct exynos_drm_ippdrv *ippdrv = &ctx->ippdrv; |
| 1234 | struct drm_exynos_ipp_cmd_node *c_node = ippdrv->cmd; | 1240 | struct drm_exynos_ipp_cmd_node *c_node = ippdrv->c_node; |
| 1235 | struct drm_exynos_ipp_property *property; | 1241 | struct drm_exynos_ipp_property *property; |
| 1236 | struct drm_exynos_ipp_config *config; | 1242 | struct drm_exynos_ipp_config *config; |
| 1237 | 1243 | ||
| @@ -1241,10 +1247,6 @@ static int fimc_dst_set_addr(struct device *dev, | |||
| 1241 | } | 1247 | } |
| 1242 | 1248 | ||
| 1243 | property = &c_node->property; | 1249 | property = &c_node->property; |
| 1244 | if (!property) { | ||
| 1245 | DRM_ERROR("failed to get property.\n"); | ||
| 1246 | return -EINVAL; | ||
| 1247 | } | ||
| 1248 | 1250 | ||
| 1249 | DRM_DEBUG_KMS("%s:prop_id[%d]buf_id[%d]buf_type[%d]\n", __func__, | 1251 | DRM_DEBUG_KMS("%s:prop_id[%d]buf_id[%d]buf_type[%d]\n", __func__, |
| 1250 | property->prop_id, buf_id, buf_type); | 1252 | property->prop_id, buf_id, buf_type); |
| @@ -1317,7 +1319,7 @@ static irqreturn_t fimc_irq_handler(int irq, void *dev_id) | |||
| 1317 | { | 1319 | { |
| 1318 | struct fimc_context *ctx = dev_id; | 1320 | struct fimc_context *ctx = dev_id; |
| 1319 | struct exynos_drm_ippdrv *ippdrv = &ctx->ippdrv; | 1321 | struct exynos_drm_ippdrv *ippdrv = &ctx->ippdrv; |
| 1320 | struct drm_exynos_ipp_cmd_node *c_node = ippdrv->cmd; | 1322 | struct drm_exynos_ipp_cmd_node *c_node = ippdrv->c_node; |
| 1321 | struct drm_exynos_ipp_event_work *event_work = | 1323 | struct drm_exynos_ipp_event_work *event_work = |
| 1322 | c_node->event_work; | 1324 | c_node->event_work; |
| 1323 | int buf_id; | 1325 | int buf_id; |
| @@ -1395,6 +1397,7 @@ static inline bool fimc_check_drm_flip(enum drm_exynos_flip flip) | |||
| 1395 | case EXYNOS_DRM_FLIP_NONE: | 1397 | case EXYNOS_DRM_FLIP_NONE: |
| 1396 | case EXYNOS_DRM_FLIP_VERTICAL: | 1398 | case EXYNOS_DRM_FLIP_VERTICAL: |
| 1397 | case EXYNOS_DRM_FLIP_HORIZONTAL: | 1399 | case EXYNOS_DRM_FLIP_HORIZONTAL: |
| 1400 | case EXYNOS_DRM_FLIP_BOTH: | ||
| 1398 | return true; | 1401 | return true; |
| 1399 | default: | 1402 | default: |
| 1400 | DRM_DEBUG_KMS("%s:invalid flip\n", __func__); | 1403 | DRM_DEBUG_KMS("%s:invalid flip\n", __func__); |
| @@ -1543,7 +1546,7 @@ static int fimc_ippdrv_reset(struct device *dev) | |||
| 1543 | DRM_DEBUG_KMS("%s\n", __func__); | 1546 | DRM_DEBUG_KMS("%s\n", __func__); |
| 1544 | 1547 | ||
| 1545 | /* reset h/w block */ | 1548 | /* reset h/w block */ |
| 1546 | fimc_sw_reset(ctx, false); | 1549 | fimc_sw_reset(ctx); |
| 1547 | 1550 | ||
| 1548 | /* reset scaler capability */ | 1551 | /* reset scaler capability */ |
| 1549 | memset(&ctx->sc, 0x0, sizeof(ctx->sc)); | 1552 | memset(&ctx->sc, 0x0, sizeof(ctx->sc)); |
| @@ -1557,7 +1560,7 @@ static int fimc_ippdrv_start(struct device *dev, enum drm_exynos_ipp_cmd cmd) | |||
| 1557 | { | 1560 | { |
| 1558 | struct fimc_context *ctx = get_fimc_context(dev); | 1561 | struct fimc_context *ctx = get_fimc_context(dev); |
| 1559 | struct exynos_drm_ippdrv *ippdrv = &ctx->ippdrv; | 1562 | struct exynos_drm_ippdrv *ippdrv = &ctx->ippdrv; |
| 1560 | struct drm_exynos_ipp_cmd_node *c_node = ippdrv->cmd; | 1563 | struct drm_exynos_ipp_cmd_node *c_node = ippdrv->c_node; |
| 1561 | struct drm_exynos_ipp_property *property; | 1564 | struct drm_exynos_ipp_property *property; |
| 1562 | struct drm_exynos_ipp_config *config; | 1565 | struct drm_exynos_ipp_config *config; |
| 1563 | struct drm_exynos_pos img_pos[EXYNOS_DRM_OPS_MAX]; | 1566 | struct drm_exynos_pos img_pos[EXYNOS_DRM_OPS_MAX]; |
| @@ -1573,10 +1576,6 @@ static int fimc_ippdrv_start(struct device *dev, enum drm_exynos_ipp_cmd cmd) | |||
| 1573 | } | 1576 | } |
| 1574 | 1577 | ||
| 1575 | property = &c_node->property; | 1578 | property = &c_node->property; |
| 1576 | if (!property) { | ||
| 1577 | DRM_ERROR("failed to get property.\n"); | ||
| 1578 | return -EINVAL; | ||
| 1579 | } | ||
| 1580 | 1579 | ||
| 1581 | fimc_handle_irq(ctx, true, false, true); | 1580 | fimc_handle_irq(ctx, true, false, true); |
| 1582 | 1581 | ||
| @@ -1739,93 +1738,64 @@ static int fimc_probe(struct platform_device *pdev) | |||
| 1739 | platform_get_device_id(pdev)->driver_data; | 1738 | platform_get_device_id(pdev)->driver_data; |
| 1740 | 1739 | ||
| 1741 | /* clock control */ | 1740 | /* clock control */ |
| 1742 | ctx->sclk_fimc_clk = clk_get(dev, "sclk_fimc"); | 1741 | ctx->sclk_fimc_clk = devm_clk_get(dev, "sclk_fimc"); |
| 1743 | if (IS_ERR(ctx->sclk_fimc_clk)) { | 1742 | if (IS_ERR(ctx->sclk_fimc_clk)) { |
| 1744 | dev_err(dev, "failed to get src fimc clock.\n"); | 1743 | dev_err(dev, "failed to get src fimc clock.\n"); |
| 1745 | ret = PTR_ERR(ctx->sclk_fimc_clk); | 1744 | return PTR_ERR(ctx->sclk_fimc_clk); |
| 1746 | goto err_ctx; | ||
| 1747 | } | 1745 | } |
| 1748 | clk_enable(ctx->sclk_fimc_clk); | 1746 | clk_enable(ctx->sclk_fimc_clk); |
| 1749 | 1747 | ||
| 1750 | ctx->fimc_clk = clk_get(dev, "fimc"); | 1748 | ctx->fimc_clk = devm_clk_get(dev, "fimc"); |
| 1751 | if (IS_ERR(ctx->fimc_clk)) { | 1749 | if (IS_ERR(ctx->fimc_clk)) { |
| 1752 | dev_err(dev, "failed to get fimc clock.\n"); | 1750 | dev_err(dev, "failed to get fimc clock.\n"); |
| 1753 | ret = PTR_ERR(ctx->fimc_clk); | ||
| 1754 | clk_disable(ctx->sclk_fimc_clk); | 1751 | clk_disable(ctx->sclk_fimc_clk); |
| 1755 | clk_put(ctx->sclk_fimc_clk); | 1752 | return PTR_ERR(ctx->fimc_clk); |
| 1756 | goto err_ctx; | ||
| 1757 | } | 1753 | } |
| 1758 | 1754 | ||
| 1759 | ctx->wb_clk = clk_get(dev, "pxl_async0"); | 1755 | ctx->wb_clk = devm_clk_get(dev, "pxl_async0"); |
| 1760 | if (IS_ERR(ctx->wb_clk)) { | 1756 | if (IS_ERR(ctx->wb_clk)) { |
| 1761 | dev_err(dev, "failed to get writeback a clock.\n"); | 1757 | dev_err(dev, "failed to get writeback a clock.\n"); |
| 1762 | ret = PTR_ERR(ctx->wb_clk); | ||
| 1763 | clk_disable(ctx->sclk_fimc_clk); | 1758 | clk_disable(ctx->sclk_fimc_clk); |
| 1764 | clk_put(ctx->sclk_fimc_clk); | 1759 | return PTR_ERR(ctx->wb_clk); |
| 1765 | clk_put(ctx->fimc_clk); | ||
| 1766 | goto err_ctx; | ||
| 1767 | } | 1760 | } |
| 1768 | 1761 | ||
| 1769 | ctx->wb_b_clk = clk_get(dev, "pxl_async1"); | 1762 | ctx->wb_b_clk = devm_clk_get(dev, "pxl_async1"); |
| 1770 | if (IS_ERR(ctx->wb_b_clk)) { | 1763 | if (IS_ERR(ctx->wb_b_clk)) { |
| 1771 | dev_err(dev, "failed to get writeback b clock.\n"); | 1764 | dev_err(dev, "failed to get writeback b clock.\n"); |
| 1772 | ret = PTR_ERR(ctx->wb_b_clk); | ||
| 1773 | clk_disable(ctx->sclk_fimc_clk); | 1765 | clk_disable(ctx->sclk_fimc_clk); |
| 1774 | clk_put(ctx->sclk_fimc_clk); | 1766 | return PTR_ERR(ctx->wb_b_clk); |
| 1775 | clk_put(ctx->fimc_clk); | ||
| 1776 | clk_put(ctx->wb_clk); | ||
| 1777 | goto err_ctx; | ||
| 1778 | } | 1767 | } |
| 1779 | 1768 | ||
| 1780 | parent_clk = clk_get(dev, ddata->parent_clk); | 1769 | parent_clk = devm_clk_get(dev, ddata->parent_clk); |
| 1781 | 1770 | ||
| 1782 | if (IS_ERR(parent_clk)) { | 1771 | if (IS_ERR(parent_clk)) { |
| 1783 | dev_err(dev, "failed to get parent clock.\n"); | 1772 | dev_err(dev, "failed to get parent clock.\n"); |
| 1784 | ret = PTR_ERR(parent_clk); | ||
| 1785 | clk_disable(ctx->sclk_fimc_clk); | 1773 | clk_disable(ctx->sclk_fimc_clk); |
| 1786 | clk_put(ctx->sclk_fimc_clk); | 1774 | return PTR_ERR(parent_clk); |
| 1787 | clk_put(ctx->fimc_clk); | ||
| 1788 | clk_put(ctx->wb_clk); | ||
| 1789 | clk_put(ctx->wb_b_clk); | ||
| 1790 | goto err_ctx; | ||
| 1791 | } | 1775 | } |
| 1792 | 1776 | ||
| 1793 | if (clk_set_parent(ctx->sclk_fimc_clk, parent_clk)) { | 1777 | if (clk_set_parent(ctx->sclk_fimc_clk, parent_clk)) { |
| 1794 | dev_err(dev, "failed to set parent.\n"); | 1778 | dev_err(dev, "failed to set parent.\n"); |
| 1795 | ret = -EINVAL; | ||
| 1796 | clk_put(parent_clk); | ||
| 1797 | clk_disable(ctx->sclk_fimc_clk); | 1779 | clk_disable(ctx->sclk_fimc_clk); |
| 1798 | clk_put(ctx->sclk_fimc_clk); | 1780 | return -EINVAL; |
| 1799 | clk_put(ctx->fimc_clk); | ||
| 1800 | clk_put(ctx->wb_clk); | ||
| 1801 | clk_put(ctx->wb_b_clk); | ||
| 1802 | goto err_ctx; | ||
| 1803 | } | 1781 | } |
| 1804 | 1782 | ||
| 1805 | clk_put(parent_clk); | 1783 | devm_clk_put(dev, parent_clk); |
| 1806 | clk_set_rate(ctx->sclk_fimc_clk, pdata->clk_rate); | 1784 | clk_set_rate(ctx->sclk_fimc_clk, pdata->clk_rate); |
| 1807 | 1785 | ||
| 1808 | /* resource memory */ | 1786 | /* resource memory */ |
| 1809 | ctx->regs_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 1787 | ctx->regs_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 1810 | if (!ctx->regs_res) { | ||
| 1811 | dev_err(dev, "failed to find registers.\n"); | ||
| 1812 | ret = -ENOENT; | ||
| 1813 | goto err_clk; | ||
| 1814 | } | ||
| 1815 | |||
| 1816 | ctx->regs = devm_request_and_ioremap(dev, ctx->regs_res); | 1788 | ctx->regs = devm_request_and_ioremap(dev, ctx->regs_res); |
| 1817 | if (!ctx->regs) { | 1789 | if (!ctx->regs) { |
| 1818 | dev_err(dev, "failed to map registers.\n"); | 1790 | dev_err(dev, "failed to map registers.\n"); |
| 1819 | ret = -ENXIO; | 1791 | return -ENXIO; |
| 1820 | goto err_clk; | ||
| 1821 | } | 1792 | } |
| 1822 | 1793 | ||
| 1823 | /* resource irq */ | 1794 | /* resource irq */ |
| 1824 | res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); | 1795 | res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); |
| 1825 | if (!res) { | 1796 | if (!res) { |
| 1826 | dev_err(dev, "failed to request irq resource.\n"); | 1797 | dev_err(dev, "failed to request irq resource.\n"); |
| 1827 | ret = -ENOENT; | 1798 | return -ENOENT; |
| 1828 | goto err_get_regs; | ||
| 1829 | } | 1799 | } |
| 1830 | 1800 | ||
| 1831 | ctx->irq = res->start; | 1801 | ctx->irq = res->start; |
| @@ -1833,7 +1803,7 @@ static int fimc_probe(struct platform_device *pdev) | |||
| 1833 | IRQF_ONESHOT, "drm_fimc", ctx); | 1803 | IRQF_ONESHOT, "drm_fimc", ctx); |
| 1834 | if (ret < 0) { | 1804 | if (ret < 0) { |
| 1835 | dev_err(dev, "failed to request irq.\n"); | 1805 | dev_err(dev, "failed to request irq.\n"); |
| 1836 | goto err_get_regs; | 1806 | return ret; |
| 1837 | } | 1807 | } |
| 1838 | 1808 | ||
| 1839 | /* context initailization */ | 1809 | /* context initailization */ |
| @@ -1879,15 +1849,7 @@ err_ippdrv_register: | |||
| 1879 | pm_runtime_disable(dev); | 1849 | pm_runtime_disable(dev); |
| 1880 | err_get_irq: | 1850 | err_get_irq: |
| 1881 | free_irq(ctx->irq, ctx); | 1851 | free_irq(ctx->irq, ctx); |
| 1882 | err_get_regs: | 1852 | |
| 1883 | devm_iounmap(dev, ctx->regs); | ||
| 1884 | err_clk: | ||
| 1885 | clk_put(ctx->sclk_fimc_clk); | ||
| 1886 | clk_put(ctx->fimc_clk); | ||
| 1887 | clk_put(ctx->wb_clk); | ||
| 1888 | clk_put(ctx->wb_b_clk); | ||
| 1889 | err_ctx: | ||
| 1890 | devm_kfree(dev, ctx); | ||
| 1891 | return ret; | 1853 | return ret; |
| 1892 | } | 1854 | } |
| 1893 | 1855 | ||
| @@ -1905,14 +1867,6 @@ static int fimc_remove(struct platform_device *pdev) | |||
| 1905 | pm_runtime_disable(dev); | 1867 | pm_runtime_disable(dev); |
| 1906 | 1868 | ||
| 1907 | free_irq(ctx->irq, ctx); | 1869 | free_irq(ctx->irq, ctx); |
| 1908 | devm_iounmap(dev, ctx->regs); | ||
| 1909 | |||
| 1910 | clk_put(ctx->sclk_fimc_clk); | ||
| 1911 | clk_put(ctx->fimc_clk); | ||
| 1912 | clk_put(ctx->wb_clk); | ||
| 1913 | clk_put(ctx->wb_b_clk); | ||
| 1914 | |||
| 1915 | devm_kfree(dev, ctx); | ||
| 1916 | 1870 | ||
| 1917 | return 0; | 1871 | return 0; |
| 1918 | } | 1872 | } |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimc.h b/drivers/gpu/drm/exynos/exynos_drm_fimc.h index dc970fa0d888..127a424c5fdf 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fimc.h +++ b/drivers/gpu/drm/exynos/exynos_drm_fimc.h | |||
| @@ -6,24 +6,10 @@ | |||
| 6 | * Jinyoung Jeon <jy0.jeon@samsung.com> | 6 | * Jinyoung Jeon <jy0.jeon@samsung.com> |
| 7 | * Sangmin Lee <lsmin.lee@samsung.com> | 7 | * Sangmin Lee <lsmin.lee@samsung.com> |
| 8 | * | 8 | * |
| 9 | * Permission is hereby granted, free of charge, to any person obtaining a | 9 | * This program is free software; you can redistribute it and/or modify it |
| 10 | * copy of this software and associated documentation files (the "Software"), | 10 | * under the terms of the GNU General Public License as published by the |
| 11 | * to deal in the Software without restriction, including without limitation | 11 | * Free Software Foundation; either version 2 of the License, or (at your |
| 12 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | 12 | * option) any later version. |
| 13 | * and/or sell copies of the Software, and to permit persons to whom the | ||
| 14 | * Software is furnished to do so, subject to the following conditions: | ||
| 15 | * | ||
| 16 | * The above copyright notice and this permission notice (including the next | ||
| 17 | * paragraph) shall be included in all copies or substantial portions of the | ||
| 18 | * Software. | ||
| 19 | * | ||
| 20 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 21 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 22 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 23 | * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
| 24 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
| 25 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 26 | * OTHER DEALINGS IN THE SOFTWARE. | ||
| 27 | */ | 13 | */ |
| 28 | 14 | ||
| 29 | #ifndef _EXYNOS_DRM_FIMC_H_ | 15 | #ifndef _EXYNOS_DRM_FIMC_H_ |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c index 3ac911894dc7..9537761931ee 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c | |||
| @@ -663,34 +663,6 @@ static struct exynos_drm_manager fimd_manager = { | |||
| 663 | .display_ops = &fimd_display_ops, | 663 | .display_ops = &fimd_display_ops, |
| 664 | }; | 664 | }; |
| 665 | 665 | ||
| 666 | static void fimd_finish_pageflip(struct drm_device *drm_dev, int crtc) | ||
| 667 | { | ||
| 668 | struct exynos_drm_private *dev_priv = drm_dev->dev_private; | ||
| 669 | struct drm_pending_vblank_event *e, *t; | ||
| 670 | struct timeval now; | ||
| 671 | unsigned long flags; | ||
| 672 | |||
| 673 | spin_lock_irqsave(&drm_dev->event_lock, flags); | ||
| 674 | |||
| 675 | list_for_each_entry_safe(e, t, &dev_priv->pageflip_event_list, | ||
| 676 | base.link) { | ||
| 677 | /* if event's pipe isn't same as crtc then ignore it. */ | ||
| 678 | if (crtc != e->pipe) | ||
| 679 | continue; | ||
| 680 | |||
| 681 | do_gettimeofday(&now); | ||
| 682 | e->event.sequence = 0; | ||
| 683 | e->event.tv_sec = now.tv_sec; | ||
| 684 | e->event.tv_usec = now.tv_usec; | ||
| 685 | |||
| 686 | list_move_tail(&e->base.link, &e->base.file_priv->event_list); | ||
| 687 | wake_up_interruptible(&e->base.file_priv->event_wait); | ||
| 688 | drm_vblank_put(drm_dev, crtc); | ||
| 689 | } | ||
| 690 | |||
| 691 | spin_unlock_irqrestore(&drm_dev->event_lock, flags); | ||
| 692 | } | ||
| 693 | |||
| 694 | static irqreturn_t fimd_irq_handler(int irq, void *dev_id) | 666 | static irqreturn_t fimd_irq_handler(int irq, void *dev_id) |
| 695 | { | 667 | { |
| 696 | struct fimd_context *ctx = (struct fimd_context *)dev_id; | 668 | struct fimd_context *ctx = (struct fimd_context *)dev_id; |
| @@ -710,7 +682,7 @@ static irqreturn_t fimd_irq_handler(int irq, void *dev_id) | |||
| 710 | goto out; | 682 | goto out; |
| 711 | 683 | ||
| 712 | drm_handle_vblank(drm_dev, manager->pipe); | 684 | drm_handle_vblank(drm_dev, manager->pipe); |
| 713 | fimd_finish_pageflip(drm_dev, manager->pipe); | 685 | exynos_drm_crtc_finish_pageflip(drm_dev, manager->pipe); |
| 714 | 686 | ||
| 715 | /* set wait vsync event to zero and wake up queue. */ | 687 | /* set wait vsync event to zero and wake up queue. */ |
| 716 | if (atomic_read(&ctx->wait_vsync_event)) { | 688 | if (atomic_read(&ctx->wait_vsync_event)) { |
| @@ -1046,7 +1018,7 @@ static int fimd_resume(struct device *dev) | |||
| 1046 | * of pm runtime would still be 1 so in this case, fimd driver | 1018 | * of pm runtime would still be 1 so in this case, fimd driver |
| 1047 | * should be on directly not drawing on pm runtime interface. | 1019 | * should be on directly not drawing on pm runtime interface. |
| 1048 | */ | 1020 | */ |
| 1049 | if (pm_runtime_suspended(dev)) { | 1021 | if (!pm_runtime_suspended(dev)) { |
| 1050 | int ret; | 1022 | int ret; |
| 1051 | 1023 | ||
| 1052 | ret = fimd_activate(ctx, true); | 1024 | ret = fimd_activate(ctx, true); |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_gem.c b/drivers/gpu/drm/exynos/exynos_drm_gem.c index d48183e7e056..473180776528 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_gem.c +++ b/drivers/gpu/drm/exynos/exynos_drm_gem.c | |||
| @@ -3,24 +3,10 @@ | |||
| 3 | * Copyright (c) 2011 Samsung Electronics Co., Ltd. | 3 | * Copyright (c) 2011 Samsung Electronics Co., Ltd. |
| 4 | * Author: Inki Dae <inki.dae@samsung.com> | 4 | * Author: Inki Dae <inki.dae@samsung.com> |
| 5 | * | 5 | * |
| 6 | * Permission is hereby granted, free of charge, to any person obtaining a | 6 | * This program is free software; you can redistribute it and/or modify it |
| 7 | * copy of this software and associated documentation files (the "Software"), | 7 | * under the terms of the GNU General Public License as published by the |
| 8 | * to deal in the Software without restriction, including without limitation | 8 | * Free Software Foundation; either version 2 of the License, or (at your |
| 9 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | 9 | * option) any later version. |
| 10 | * and/or sell copies of the Software, and to permit persons to whom the | ||
| 11 | * Software is furnished to do so, subject to the following conditions: | ||
| 12 | * | ||
| 13 | * The above copyright notice and this permission notice (including the next | ||
| 14 | * paragraph) shall be included in all copies or substantial portions of the | ||
| 15 | * Software. | ||
| 16 | * | ||
| 17 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 18 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 19 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 20 | * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
| 21 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
| 22 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 23 | * OTHER DEALINGS IN THE SOFTWARE. | ||
| 24 | */ | 10 | */ |
| 25 | 11 | ||
| 26 | #include <drm/drmP.h> | 12 | #include <drm/drmP.h> |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_gem.h b/drivers/gpu/drm/exynos/exynos_drm_gem.h index f11f2afd5bfc..35ebac47dc2b 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_gem.h +++ b/drivers/gpu/drm/exynos/exynos_drm_gem.h | |||
| @@ -3,24 +3,10 @@ | |||
| 3 | * Copyright (c) 2011 Samsung Electronics Co., Ltd. | 3 | * Copyright (c) 2011 Samsung Electronics Co., Ltd. |
| 4 | * Authoer: Inki Dae <inki.dae@samsung.com> | 4 | * Authoer: Inki Dae <inki.dae@samsung.com> |
| 5 | * | 5 | * |
| 6 | * Permission is hereby granted, free of charge, to any person obtaining a | 6 | * This program is free software; you can redistribute it and/or modify it |
| 7 | * copy of this software and associated documentation files (the "Software"), | 7 | * under the terms of the GNU General Public License as published by the |
| 8 | * to deal in the Software without restriction, including without limitation | 8 | * Free Software Foundation; either version 2 of the License, or (at your |
| 9 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | 9 | * option) any later version. |
| 10 | * and/or sell copies of the Software, and to permit persons to whom the | ||
| 11 | * Software is furnished to do so, subject to the following conditions: | ||
| 12 | * | ||
| 13 | * The above copyright notice and this permission notice (including the next | ||
| 14 | * paragraph) shall be included in all copies or substantial portions of the | ||
| 15 | * Software. | ||
| 16 | * | ||
| 17 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 18 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 19 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 20 | * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
| 21 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
| 22 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 23 | * OTHER DEALINGS IN THE SOFTWARE. | ||
| 24 | */ | 10 | */ |
| 25 | 11 | ||
| 26 | #ifndef _EXYNOS_DRM_GEM_H_ | 12 | #ifndef _EXYNOS_DRM_GEM_H_ |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_gsc.c b/drivers/gpu/drm/exynos/exynos_drm_gsc.c index 4b0e8589bd19..8140753ec9c8 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_gsc.c +++ b/drivers/gpu/drm/exynos/exynos_drm_gsc.c | |||
| @@ -25,7 +25,7 @@ | |||
| 25 | #include "exynos_drm_gsc.h" | 25 | #include "exynos_drm_gsc.h" |
| 26 | 26 | ||
| 27 | /* | 27 | /* |
| 28 | * GSC is stand for General SCaler and | 28 | * GSC stands for General SCaler and |
| 29 | * supports image scaler/rotator and input/output DMA operations. | 29 | * supports image scaler/rotator and input/output DMA operations. |
| 30 | * input DMA reads image data from the memory. | 30 | * input DMA reads image data from the memory. |
| 31 | * output DMA writes image data to memory. | 31 | * output DMA writes image data to memory. |
| @@ -711,7 +711,7 @@ static int gsc_src_set_addr(struct device *dev, | |||
| 711 | { | 711 | { |
| 712 | struct gsc_context *ctx = get_gsc_context(dev); | 712 | struct gsc_context *ctx = get_gsc_context(dev); |
| 713 | struct exynos_drm_ippdrv *ippdrv = &ctx->ippdrv; | 713 | struct exynos_drm_ippdrv *ippdrv = &ctx->ippdrv; |
| 714 | struct drm_exynos_ipp_cmd_node *c_node = ippdrv->cmd; | 714 | struct drm_exynos_ipp_cmd_node *c_node = ippdrv->c_node; |
| 715 | struct drm_exynos_ipp_property *property; | 715 | struct drm_exynos_ipp_property *property; |
| 716 | 716 | ||
| 717 | if (!c_node) { | 717 | if (!c_node) { |
| @@ -720,10 +720,6 @@ static int gsc_src_set_addr(struct device *dev, | |||
| 720 | } | 720 | } |
| 721 | 721 | ||
| 722 | property = &c_node->property; | 722 | property = &c_node->property; |
| 723 | if (!property) { | ||
| 724 | DRM_ERROR("failed to get property.\n"); | ||
| 725 | return -EFAULT; | ||
| 726 | } | ||
| 727 | 723 | ||
| 728 | DRM_DEBUG_KMS("%s:prop_id[%d]buf_id[%d]buf_type[%d]\n", __func__, | 724 | DRM_DEBUG_KMS("%s:prop_id[%d]buf_id[%d]buf_type[%d]\n", __func__, |
| 729 | property->prop_id, buf_id, buf_type); | 725 | property->prop_id, buf_id, buf_type); |
| @@ -1171,7 +1167,7 @@ static int gsc_dst_set_addr(struct device *dev, | |||
| 1171 | { | 1167 | { |
| 1172 | struct gsc_context *ctx = get_gsc_context(dev); | 1168 | struct gsc_context *ctx = get_gsc_context(dev); |
| 1173 | struct exynos_drm_ippdrv *ippdrv = &ctx->ippdrv; | 1169 | struct exynos_drm_ippdrv *ippdrv = &ctx->ippdrv; |
| 1174 | struct drm_exynos_ipp_cmd_node *c_node = ippdrv->cmd; | 1170 | struct drm_exynos_ipp_cmd_node *c_node = ippdrv->c_node; |
| 1175 | struct drm_exynos_ipp_property *property; | 1171 | struct drm_exynos_ipp_property *property; |
| 1176 | 1172 | ||
| 1177 | if (!c_node) { | 1173 | if (!c_node) { |
| @@ -1180,10 +1176,6 @@ static int gsc_dst_set_addr(struct device *dev, | |||
| 1180 | } | 1176 | } |
| 1181 | 1177 | ||
| 1182 | property = &c_node->property; | 1178 | property = &c_node->property; |
| 1183 | if (!property) { | ||
| 1184 | DRM_ERROR("failed to get property.\n"); | ||
| 1185 | return -EFAULT; | ||
| 1186 | } | ||
| 1187 | 1179 | ||
| 1188 | DRM_DEBUG_KMS("%s:prop_id[%d]buf_id[%d]buf_type[%d]\n", __func__, | 1180 | DRM_DEBUG_KMS("%s:prop_id[%d]buf_id[%d]buf_type[%d]\n", __func__, |
| 1189 | property->prop_id, buf_id, buf_type); | 1181 | property->prop_id, buf_id, buf_type); |
| @@ -1312,7 +1304,7 @@ static irqreturn_t gsc_irq_handler(int irq, void *dev_id) | |||
| 1312 | { | 1304 | { |
| 1313 | struct gsc_context *ctx = dev_id; | 1305 | struct gsc_context *ctx = dev_id; |
| 1314 | struct exynos_drm_ippdrv *ippdrv = &ctx->ippdrv; | 1306 | struct exynos_drm_ippdrv *ippdrv = &ctx->ippdrv; |
| 1315 | struct drm_exynos_ipp_cmd_node *c_node = ippdrv->cmd; | 1307 | struct drm_exynos_ipp_cmd_node *c_node = ippdrv->c_node; |
| 1316 | struct drm_exynos_ipp_event_work *event_work = | 1308 | struct drm_exynos_ipp_event_work *event_work = |
| 1317 | c_node->event_work; | 1309 | c_node->event_work; |
| 1318 | u32 status; | 1310 | u32 status; |
| @@ -1399,7 +1391,7 @@ static inline bool gsc_check_drm_flip(enum drm_exynos_flip flip) | |||
| 1399 | case EXYNOS_DRM_FLIP_NONE: | 1391 | case EXYNOS_DRM_FLIP_NONE: |
| 1400 | case EXYNOS_DRM_FLIP_VERTICAL: | 1392 | case EXYNOS_DRM_FLIP_VERTICAL: |
| 1401 | case EXYNOS_DRM_FLIP_HORIZONTAL: | 1393 | case EXYNOS_DRM_FLIP_HORIZONTAL: |
| 1402 | case EXYNOS_DRM_FLIP_VERTICAL | EXYNOS_DRM_FLIP_HORIZONTAL: | 1394 | case EXYNOS_DRM_FLIP_BOTH: |
| 1403 | return true; | 1395 | return true; |
| 1404 | default: | 1396 | default: |
| 1405 | DRM_DEBUG_KMS("%s:invalid flip\n", __func__); | 1397 | DRM_DEBUG_KMS("%s:invalid flip\n", __func__); |
| @@ -1549,7 +1541,7 @@ static int gsc_ippdrv_start(struct device *dev, enum drm_exynos_ipp_cmd cmd) | |||
| 1549 | { | 1541 | { |
| 1550 | struct gsc_context *ctx = get_gsc_context(dev); | 1542 | struct gsc_context *ctx = get_gsc_context(dev); |
| 1551 | struct exynos_drm_ippdrv *ippdrv = &ctx->ippdrv; | 1543 | struct exynos_drm_ippdrv *ippdrv = &ctx->ippdrv; |
| 1552 | struct drm_exynos_ipp_cmd_node *c_node = ippdrv->cmd; | 1544 | struct drm_exynos_ipp_cmd_node *c_node = ippdrv->c_node; |
| 1553 | struct drm_exynos_ipp_property *property; | 1545 | struct drm_exynos_ipp_property *property; |
| 1554 | struct drm_exynos_ipp_config *config; | 1546 | struct drm_exynos_ipp_config *config; |
| 1555 | struct drm_exynos_pos img_pos[EXYNOS_DRM_OPS_MAX]; | 1547 | struct drm_exynos_pos img_pos[EXYNOS_DRM_OPS_MAX]; |
| @@ -1565,10 +1557,6 @@ static int gsc_ippdrv_start(struct device *dev, enum drm_exynos_ipp_cmd cmd) | |||
| 1565 | } | 1557 | } |
| 1566 | 1558 | ||
| 1567 | property = &c_node->property; | 1559 | property = &c_node->property; |
| 1568 | if (!property) { | ||
| 1569 | DRM_ERROR("failed to get property.\n"); | ||
| 1570 | return -EINVAL; | ||
| 1571 | } | ||
| 1572 | 1560 | ||
| 1573 | gsc_handle_irq(ctx, true, false, true); | 1561 | gsc_handle_irq(ctx, true, false, true); |
| 1574 | 1562 | ||
| @@ -1604,7 +1592,7 @@ static int gsc_ippdrv_start(struct device *dev, enum drm_exynos_ipp_cmd cmd) | |||
| 1604 | exynos_drm_ippnb_send_event(IPP_SET_WRITEBACK, (void *)&set_wb); | 1592 | exynos_drm_ippnb_send_event(IPP_SET_WRITEBACK, (void *)&set_wb); |
| 1605 | 1593 | ||
| 1606 | /* src local path */ | 1594 | /* src local path */ |
| 1607 | cfg = readl(GSC_IN_CON); | 1595 | cfg = gsc_read(GSC_IN_CON); |
| 1608 | cfg &= ~(GSC_IN_PATH_MASK | GSC_IN_LOCAL_SEL_MASK); | 1596 | cfg &= ~(GSC_IN_PATH_MASK | GSC_IN_LOCAL_SEL_MASK); |
| 1609 | cfg |= (GSC_IN_PATH_LOCAL | GSC_IN_LOCAL_FIMD_WB); | 1597 | cfg |= (GSC_IN_PATH_LOCAL | GSC_IN_LOCAL_FIMD_WB); |
| 1610 | gsc_write(cfg, GSC_IN_CON); | 1598 | gsc_write(cfg, GSC_IN_CON); |
| @@ -1696,34 +1684,25 @@ static int gsc_probe(struct platform_device *pdev) | |||
| 1696 | return -ENOMEM; | 1684 | return -ENOMEM; |
| 1697 | 1685 | ||
| 1698 | /* clock control */ | 1686 | /* clock control */ |
| 1699 | ctx->gsc_clk = clk_get(dev, "gscl"); | 1687 | ctx->gsc_clk = devm_clk_get(dev, "gscl"); |
| 1700 | if (IS_ERR(ctx->gsc_clk)) { | 1688 | if (IS_ERR(ctx->gsc_clk)) { |
| 1701 | dev_err(dev, "failed to get gsc clock.\n"); | 1689 | dev_err(dev, "failed to get gsc clock.\n"); |
| 1702 | ret = PTR_ERR(ctx->gsc_clk); | 1690 | return PTR_ERR(ctx->gsc_clk); |
| 1703 | goto err_ctx; | ||
| 1704 | } | 1691 | } |
| 1705 | 1692 | ||
| 1706 | /* resource memory */ | 1693 | /* resource memory */ |
| 1707 | ctx->regs_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 1694 | ctx->regs_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 1708 | if (!ctx->regs_res) { | ||
| 1709 | dev_err(dev, "failed to find registers.\n"); | ||
| 1710 | ret = -ENOENT; | ||
| 1711 | goto err_clk; | ||
| 1712 | } | ||
| 1713 | |||
| 1714 | ctx->regs = devm_request_and_ioremap(dev, ctx->regs_res); | 1695 | ctx->regs = devm_request_and_ioremap(dev, ctx->regs_res); |
| 1715 | if (!ctx->regs) { | 1696 | if (!ctx->regs) { |
| 1716 | dev_err(dev, "failed to map registers.\n"); | 1697 | dev_err(dev, "failed to map registers.\n"); |
| 1717 | ret = -ENXIO; | 1698 | return -ENXIO; |
| 1718 | goto err_clk; | ||
| 1719 | } | 1699 | } |
| 1720 | 1700 | ||
| 1721 | /* resource irq */ | 1701 | /* resource irq */ |
| 1722 | res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); | 1702 | res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); |
| 1723 | if (!res) { | 1703 | if (!res) { |
| 1724 | dev_err(dev, "failed to request irq resource.\n"); | 1704 | dev_err(dev, "failed to request irq resource.\n"); |
| 1725 | ret = -ENOENT; | 1705 | return -ENOENT; |
| 1726 | goto err_get_regs; | ||
| 1727 | } | 1706 | } |
| 1728 | 1707 | ||
| 1729 | ctx->irq = res->start; | 1708 | ctx->irq = res->start; |
| @@ -1731,7 +1710,7 @@ static int gsc_probe(struct platform_device *pdev) | |||
| 1731 | IRQF_ONESHOT, "drm_gsc", ctx); | 1710 | IRQF_ONESHOT, "drm_gsc", ctx); |
| 1732 | if (ret < 0) { | 1711 | if (ret < 0) { |
| 1733 | dev_err(dev, "failed to request irq.\n"); | 1712 | dev_err(dev, "failed to request irq.\n"); |
| 1734 | goto err_get_regs; | 1713 | return ret; |
| 1735 | } | 1714 | } |
| 1736 | 1715 | ||
| 1737 | /* context initailization */ | 1716 | /* context initailization */ |
| @@ -1775,12 +1754,6 @@ err_ippdrv_register: | |||
| 1775 | pm_runtime_disable(dev); | 1754 | pm_runtime_disable(dev); |
| 1776 | err_get_irq: | 1755 | err_get_irq: |
| 1777 | free_irq(ctx->irq, ctx); | 1756 | free_irq(ctx->irq, ctx); |
| 1778 | err_get_regs: | ||
| 1779 | devm_iounmap(dev, ctx->regs); | ||
| 1780 | err_clk: | ||
| 1781 | clk_put(ctx->gsc_clk); | ||
| 1782 | err_ctx: | ||
| 1783 | devm_kfree(dev, ctx); | ||
| 1784 | return ret; | 1757 | return ret; |
| 1785 | } | 1758 | } |
| 1786 | 1759 | ||
| @@ -1798,11 +1771,6 @@ static int gsc_remove(struct platform_device *pdev) | |||
| 1798 | pm_runtime_disable(dev); | 1771 | pm_runtime_disable(dev); |
| 1799 | 1772 | ||
| 1800 | free_irq(ctx->irq, ctx); | 1773 | free_irq(ctx->irq, ctx); |
| 1801 | devm_iounmap(dev, ctx->regs); | ||
| 1802 | |||
| 1803 | clk_put(ctx->gsc_clk); | ||
| 1804 | |||
| 1805 | devm_kfree(dev, ctx); | ||
| 1806 | 1774 | ||
| 1807 | return 0; | 1775 | return 0; |
| 1808 | } | 1776 | } |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_gsc.h b/drivers/gpu/drm/exynos/exynos_drm_gsc.h index b3c3bc618c0f..29ec1c5efcf2 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_gsc.h +++ b/drivers/gpu/drm/exynos/exynos_drm_gsc.h | |||
| @@ -6,24 +6,10 @@ | |||
| 6 | * Jinyoung Jeon <jy0.jeon@samsung.com> | 6 | * Jinyoung Jeon <jy0.jeon@samsung.com> |
| 7 | * Sangmin Lee <lsmin.lee@samsung.com> | 7 | * Sangmin Lee <lsmin.lee@samsung.com> |
| 8 | * | 8 | * |
| 9 | * Permission is hereby granted, free of charge, to any person obtaining a | 9 | * This program is free software; you can redistribute it and/or modify it |
| 10 | * copy of this software and associated documentation files (the "Software"), | 10 | * under the terms of the GNU General Public License as published by the |
| 11 | * to deal in the Software without restriction, including without limitation | 11 | * Free Software Foundation; either version 2 of the License, or (at your |
| 12 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | 12 | * option) any later version. |
| 13 | * and/or sell copies of the Software, and to permit persons to whom the | ||
| 14 | * Software is furnished to do so, subject to the following conditions: | ||
| 15 | * | ||
| 16 | * The above copyright notice and this permission notice (including the next | ||
| 17 | * paragraph) shall be included in all copies or substantial portions of the | ||
| 18 | * Software. | ||
| 19 | * | ||
| 20 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 21 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 22 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 23 | * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
| 24 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
| 25 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 26 | * OTHER DEALINGS IN THE SOFTWARE. | ||
| 27 | */ | 13 | */ |
| 28 | 14 | ||
| 29 | #ifndef _EXYNOS_DRM_GSC_H_ | 15 | #ifndef _EXYNOS_DRM_GSC_H_ |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_hdmi.h b/drivers/gpu/drm/exynos/exynos_drm_hdmi.h index fcc3093ec8fe..784a7e9a766c 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_hdmi.h +++ b/drivers/gpu/drm/exynos/exynos_drm_hdmi.h | |||
| @@ -3,24 +3,10 @@ | |||
| 3 | * Copyright (c) 2011 Samsung Electronics Co., Ltd. | 3 | * Copyright (c) 2011 Samsung Electronics Co., Ltd. |
| 4 | * Authoer: Inki Dae <inki.dae@samsung.com> | 4 | * Authoer: Inki Dae <inki.dae@samsung.com> |
| 5 | * | 5 | * |
| 6 | * Permission is hereby granted, free of charge, to any person obtaining a | 6 | * This program is free software; you can redistribute it and/or modify it |
| 7 | * copy of this software and associated documentation files (the "Software"), | 7 | * under the terms of the GNU General Public License as published by the |
| 8 | * to deal in the Software without restriction, including without limitation | 8 | * Free Software Foundation; either version 2 of the License, or (at your |
| 9 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | 9 | * option) any later version. |
| 10 | * and/or sell copies of the Software, and to permit persons to whom the | ||
| 11 | * Software is furnished to do so, subject to the following conditions: | ||
| 12 | * | ||
| 13 | * The above copyright notice and this permission notice (including the next | ||
| 14 | * paragraph) shall be included in all copies or substantial portions of the | ||
| 15 | * Software. | ||
| 16 | * | ||
| 17 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 18 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 19 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 20 | * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
| 21 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
| 22 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 23 | * OTHER DEALINGS IN THE SOFTWARE. | ||
| 24 | */ | 10 | */ |
| 25 | 11 | ||
| 26 | #ifndef _EXYNOS_DRM_HDMI_H_ | 12 | #ifndef _EXYNOS_DRM_HDMI_H_ |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_iommu.c b/drivers/gpu/drm/exynos/exynos_drm_iommu.c index 2482b7f96341..3799d5c2b5df 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_iommu.c +++ b/drivers/gpu/drm/exynos/exynos_drm_iommu.c | |||
| @@ -3,24 +3,10 @@ | |||
| 3 | * Copyright (c) 2012 Samsung Electronics Co., Ltd. | 3 | * Copyright (c) 2012 Samsung Electronics Co., Ltd. |
| 4 | * Author: Inki Dae <inki.dae@samsung.com> | 4 | * Author: Inki Dae <inki.dae@samsung.com> |
| 5 | * | 5 | * |
| 6 | * Permission is hereby granted, free of charge, to any person obtaining a | 6 | * This program is free software; you can redistribute it and/or modify it |
| 7 | * copy of this software and associated documentation files (the "Software"), | 7 | * under the terms of the GNU General Public License as published by the |
| 8 | * to deal in the Software without restriction, including without limitation | 8 | * Free Software Foundation; either version 2 of the License, or (at your |
| 9 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | 9 | * option) any later version. |
| 10 | * and/or sell copies of the Software, and to permit persons to whom the | ||
| 11 | * Software is furnished to do so, subject to the following conditions: | ||
| 12 | * | ||
| 13 | * The above copyright notice and this permission notice (including the next | ||
| 14 | * paragraph) shall be included in all copies or substantial portions of the | ||
| 15 | * Software. | ||
| 16 | * | ||
| 17 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 18 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 19 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 20 | * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
| 21 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
| 22 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 23 | * OTHER DEALINGS IN THE SOFTWARE. | ||
| 24 | */ | 10 | */ |
| 25 | 11 | ||
| 26 | #include <drmP.h> | 12 | #include <drmP.h> |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_iommu.h b/drivers/gpu/drm/exynos/exynos_drm_iommu.h index 18a0ca190b98..53b7deea8ab7 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_iommu.h +++ b/drivers/gpu/drm/exynos/exynos_drm_iommu.h | |||
| @@ -3,24 +3,10 @@ | |||
| 3 | * Copyright (c) 2012 Samsung Electronics Co., Ltd. | 3 | * Copyright (c) 2012 Samsung Electronics Co., Ltd. |
| 4 | * Authoer: Inki Dae <inki.dae@samsung.com> | 4 | * Authoer: Inki Dae <inki.dae@samsung.com> |
| 5 | * | 5 | * |
| 6 | * Permission is hereby granted, free of charge, to any person obtaining a | 6 | * This program is free software; you can redistribute it and/or modify it |
| 7 | * copy of this software and associated documentation files (the "Software"), | 7 | * under the terms of the GNU General Public License as published by the |
| 8 | * to deal in the Software without restriction, including without limitation | 8 | * Free Software Foundation; either version 2 of the License, or (at your |
| 9 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | 9 | * option) any later version. |
| 10 | * and/or sell copies of the Software, and to permit persons to whom the | ||
| 11 | * Software is furnished to do so, subject to the following conditions: | ||
| 12 | * | ||
| 13 | * The above copyright notice and this permission notice (including the next | ||
| 14 | * paragraph) shall be included in all copies or substantial portions of the | ||
| 15 | * Software. | ||
| 16 | * | ||
| 17 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 18 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 19 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 20 | * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
| 21 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
| 22 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 23 | * OTHER DEALINGS IN THE SOFTWARE. | ||
| 24 | */ | 10 | */ |
| 25 | 11 | ||
| 26 | #ifndef _EXYNOS_DRM_IOMMU_H_ | 12 | #ifndef _EXYNOS_DRM_IOMMU_H_ |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_ipp.c b/drivers/gpu/drm/exynos/exynos_drm_ipp.c index c1f12301224c..0bda96454a02 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_ipp.c +++ b/drivers/gpu/drm/exynos/exynos_drm_ipp.c | |||
| @@ -27,7 +27,7 @@ | |||
| 27 | #include "exynos_drm_iommu.h" | 27 | #include "exynos_drm_iommu.h" |
| 28 | 28 | ||
| 29 | /* | 29 | /* |
| 30 | * IPP is stand for Image Post Processing and | 30 | * IPP stands for Image Post Processing and |
| 31 | * supports image scaler/rotator and input/output DMA operations. | 31 | * supports image scaler/rotator and input/output DMA operations. |
| 32 | * using FIMC, GSC, Rotator, so on. | 32 | * using FIMC, GSC, Rotator, so on. |
| 33 | * IPP is integration device driver of same attribute h/w | 33 | * IPP is integration device driver of same attribute h/w |
| @@ -1292,7 +1292,7 @@ static int ipp_start_property(struct exynos_drm_ippdrv *ippdrv, | |||
| 1292 | DRM_DEBUG_KMS("%s:prop_id[%d]\n", __func__, property->prop_id); | 1292 | DRM_DEBUG_KMS("%s:prop_id[%d]\n", __func__, property->prop_id); |
| 1293 | 1293 | ||
| 1294 | /* store command info in ippdrv */ | 1294 | /* store command info in ippdrv */ |
| 1295 | ippdrv->cmd = c_node; | 1295 | ippdrv->c_node = c_node; |
| 1296 | 1296 | ||
| 1297 | if (!ipp_check_mem_list(c_node)) { | 1297 | if (!ipp_check_mem_list(c_node)) { |
| 1298 | DRM_DEBUG_KMS("%s:empty memory.\n", __func__); | 1298 | DRM_DEBUG_KMS("%s:empty memory.\n", __func__); |
| @@ -1303,7 +1303,7 @@ static int ipp_start_property(struct exynos_drm_ippdrv *ippdrv, | |||
| 1303 | ret = ipp_set_property(ippdrv, property); | 1303 | ret = ipp_set_property(ippdrv, property); |
| 1304 | if (ret) { | 1304 | if (ret) { |
| 1305 | DRM_ERROR("failed to set property.\n"); | 1305 | DRM_ERROR("failed to set property.\n"); |
| 1306 | ippdrv->cmd = NULL; | 1306 | ippdrv->c_node = NULL; |
| 1307 | return ret; | 1307 | return ret; |
| 1308 | } | 1308 | } |
| 1309 | 1309 | ||
| @@ -1487,11 +1487,6 @@ void ipp_sched_cmd(struct work_struct *work) | |||
| 1487 | mutex_lock(&c_node->cmd_lock); | 1487 | mutex_lock(&c_node->cmd_lock); |
| 1488 | 1488 | ||
| 1489 | property = &c_node->property; | 1489 | property = &c_node->property; |
| 1490 | if (!property) { | ||
| 1491 | DRM_ERROR("failed to get property:prop_id[%d]\n", | ||
| 1492 | c_node->property.prop_id); | ||
| 1493 | goto err_unlock; | ||
| 1494 | } | ||
| 1495 | 1490 | ||
| 1496 | switch (cmd_work->ctrl) { | 1491 | switch (cmd_work->ctrl) { |
| 1497 | case IPP_CTRL_PLAY: | 1492 | case IPP_CTRL_PLAY: |
| @@ -1704,7 +1699,7 @@ void ipp_sched_event(struct work_struct *work) | |||
| 1704 | return; | 1699 | return; |
| 1705 | } | 1700 | } |
| 1706 | 1701 | ||
| 1707 | c_node = ippdrv->cmd; | 1702 | c_node = ippdrv->c_node; |
| 1708 | if (!c_node) { | 1703 | if (!c_node) { |
| 1709 | DRM_ERROR("failed to get command node.\n"); | 1704 | DRM_ERROR("failed to get command node.\n"); |
| 1710 | return; | 1705 | return; |
| @@ -1895,7 +1890,7 @@ static int ipp_probe(struct platform_device *pdev) | |||
| 1895 | struct exynos_drm_subdrv *subdrv; | 1890 | struct exynos_drm_subdrv *subdrv; |
| 1896 | int ret; | 1891 | int ret; |
| 1897 | 1892 | ||
| 1898 | ctx = kzalloc(sizeof(*ctx), GFP_KERNEL); | 1893 | ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL); |
| 1899 | if (!ctx) | 1894 | if (!ctx) |
| 1900 | return -ENOMEM; | 1895 | return -ENOMEM; |
| 1901 | 1896 | ||
| @@ -1916,8 +1911,7 @@ static int ipp_probe(struct platform_device *pdev) | |||
| 1916 | ctx->event_workq = create_singlethread_workqueue("ipp_event"); | 1911 | ctx->event_workq = create_singlethread_workqueue("ipp_event"); |
| 1917 | if (!ctx->event_workq) { | 1912 | if (!ctx->event_workq) { |
| 1918 | dev_err(dev, "failed to create event workqueue\n"); | 1913 | dev_err(dev, "failed to create event workqueue\n"); |
| 1919 | ret = -EINVAL; | 1914 | return -EINVAL; |
| 1920 | goto err_clear; | ||
| 1921 | } | 1915 | } |
| 1922 | 1916 | ||
| 1923 | /* | 1917 | /* |
| @@ -1958,8 +1952,6 @@ err_cmd_workq: | |||
| 1958 | destroy_workqueue(ctx->cmd_workq); | 1952 | destroy_workqueue(ctx->cmd_workq); |
| 1959 | err_event_workq: | 1953 | err_event_workq: |
| 1960 | destroy_workqueue(ctx->event_workq); | 1954 | destroy_workqueue(ctx->event_workq); |
| 1961 | err_clear: | ||
| 1962 | kfree(ctx); | ||
| 1963 | return ret; | 1955 | return ret; |
| 1964 | } | 1956 | } |
| 1965 | 1957 | ||
| @@ -1985,8 +1977,6 @@ static int ipp_remove(struct platform_device *pdev) | |||
| 1985 | destroy_workqueue(ctx->cmd_workq); | 1977 | destroy_workqueue(ctx->cmd_workq); |
| 1986 | destroy_workqueue(ctx->event_workq); | 1978 | destroy_workqueue(ctx->event_workq); |
| 1987 | 1979 | ||
| 1988 | kfree(ctx); | ||
| 1989 | |||
| 1990 | return 0; | 1980 | return 0; |
| 1991 | } | 1981 | } |
| 1992 | 1982 | ||
diff --git a/drivers/gpu/drm/exynos/exynos_drm_ipp.h b/drivers/gpu/drm/exynos/exynos_drm_ipp.h index 28ffac95386c..4cadbea7dbde 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_ipp.h +++ b/drivers/gpu/drm/exynos/exynos_drm_ipp.h | |||
| @@ -6,24 +6,10 @@ | |||
| 6 | * Jinyoung Jeon <jy0.jeon@samsung.com> | 6 | * Jinyoung Jeon <jy0.jeon@samsung.com> |
| 7 | * Sangmin Lee <lsmin.lee@samsung.com> | 7 | * Sangmin Lee <lsmin.lee@samsung.com> |
| 8 | * | 8 | * |
| 9 | * Permission is hereby granted, free of charge, to any person obtaining a | 9 | * This program is free software; you can redistribute it and/or modify it |
| 10 | * copy of this software and associated documentation files (the "Software"), | 10 | * under the terms of the GNU General Public License as published by the |
| 11 | * to deal in the Software without restriction, including without limitation | 11 | * Free Software Foundation; either version 2 of the License, or (at your |
| 12 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | 12 | * option) any later version. |
| 13 | * and/or sell copies of the Software, and to permit persons to whom the | ||
| 14 | * Software is furnished to do so, subject to the following conditions: | ||
| 15 | * | ||
| 16 | * The above copyright notice and this permission notice (including the next | ||
| 17 | * paragraph) shall be included in all copies or substantial portions of the | ||
| 18 | * Software. | ||
| 19 | * | ||
| 20 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 21 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 22 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 23 | * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
| 24 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
| 25 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 26 | * OTHER DEALINGS IN THE SOFTWARE. | ||
| 27 | */ | 13 | */ |
| 28 | 14 | ||
| 29 | #ifndef _EXYNOS_DRM_IPP_H_ | 15 | #ifndef _EXYNOS_DRM_IPP_H_ |
| @@ -160,7 +146,7 @@ struct exynos_drm_ipp_ops { | |||
| 160 | * @dedicated: dedicated ipp device. | 146 | * @dedicated: dedicated ipp device. |
| 161 | * @ops: source, destination operations. | 147 | * @ops: source, destination operations. |
| 162 | * @event_workq: event work queue. | 148 | * @event_workq: event work queue. |
| 163 | * @cmd: current command information. | 149 | * @c_node: current command information. |
| 164 | * @cmd_list: list head for command information. | 150 | * @cmd_list: list head for command information. |
| 165 | * @prop_list: property informations of current ipp driver. | 151 | * @prop_list: property informations of current ipp driver. |
| 166 | * @check_property: check property about format, size, buffer. | 152 | * @check_property: check property about format, size, buffer. |
| @@ -178,7 +164,7 @@ struct exynos_drm_ippdrv { | |||
| 178 | bool dedicated; | 164 | bool dedicated; |
| 179 | struct exynos_drm_ipp_ops *ops[EXYNOS_DRM_OPS_MAX]; | 165 | struct exynos_drm_ipp_ops *ops[EXYNOS_DRM_OPS_MAX]; |
| 180 | struct workqueue_struct *event_workq; | 166 | struct workqueue_struct *event_workq; |
| 181 | struct drm_exynos_ipp_cmd_node *cmd; | 167 | struct drm_exynos_ipp_cmd_node *c_node; |
| 182 | struct list_head cmd_list; | 168 | struct list_head cmd_list; |
| 183 | struct drm_exynos_ipp_prop_list *prop_list; | 169 | struct drm_exynos_ipp_prop_list *prop_list; |
| 184 | 170 | ||
diff --git a/drivers/gpu/drm/exynos/exynos_drm_rotator.c b/drivers/gpu/drm/exynos/exynos_drm_rotator.c index c748850737a1..e9e83ef688f0 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_rotator.c +++ b/drivers/gpu/drm/exynos/exynos_drm_rotator.c | |||
| @@ -139,7 +139,7 @@ static irqreturn_t rotator_irq_handler(int irq, void *arg) | |||
| 139 | { | 139 | { |
| 140 | struct rot_context *rot = arg; | 140 | struct rot_context *rot = arg; |
| 141 | struct exynos_drm_ippdrv *ippdrv = &rot->ippdrv; | 141 | struct exynos_drm_ippdrv *ippdrv = &rot->ippdrv; |
| 142 | struct drm_exynos_ipp_cmd_node *c_node = ippdrv->cmd; | 142 | struct drm_exynos_ipp_cmd_node *c_node = ippdrv->c_node; |
| 143 | struct drm_exynos_ipp_event_work *event_work = c_node->event_work; | 143 | struct drm_exynos_ipp_event_work *event_work = c_node->event_work; |
| 144 | enum rot_irq_status irq_status; | 144 | enum rot_irq_status irq_status; |
| 145 | u32 val; | 145 | u32 val; |
| @@ -513,6 +513,7 @@ static inline bool rotator_check_drm_flip(enum drm_exynos_flip flip) | |||
| 513 | case EXYNOS_DRM_FLIP_NONE: | 513 | case EXYNOS_DRM_FLIP_NONE: |
| 514 | case EXYNOS_DRM_FLIP_VERTICAL: | 514 | case EXYNOS_DRM_FLIP_VERTICAL: |
| 515 | case EXYNOS_DRM_FLIP_HORIZONTAL: | 515 | case EXYNOS_DRM_FLIP_HORIZONTAL: |
| 516 | case EXYNOS_DRM_FLIP_BOTH: | ||
| 516 | return true; | 517 | return true; |
| 517 | default: | 518 | default: |
| 518 | DRM_DEBUG_KMS("%s:invalid flip\n", __func__); | 519 | DRM_DEBUG_KMS("%s:invalid flip\n", __func__); |
| @@ -655,34 +656,26 @@ static int rotator_probe(struct platform_device *pdev) | |||
| 655 | platform_get_device_id(pdev)->driver_data; | 656 | platform_get_device_id(pdev)->driver_data; |
| 656 | 657 | ||
| 657 | rot->regs_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 658 | rot->regs_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 658 | if (!rot->regs_res) { | ||
| 659 | dev_err(dev, "failed to find registers\n"); | ||
| 660 | ret = -ENOENT; | ||
| 661 | goto err_get_resource; | ||
| 662 | } | ||
| 663 | |||
| 664 | rot->regs = devm_request_and_ioremap(dev, rot->regs_res); | 659 | rot->regs = devm_request_and_ioremap(dev, rot->regs_res); |
| 665 | if (!rot->regs) { | 660 | if (!rot->regs) { |
| 666 | dev_err(dev, "failed to map register\n"); | 661 | dev_err(dev, "failed to map register\n"); |
| 667 | ret = -ENXIO; | 662 | return -ENXIO; |
| 668 | goto err_get_resource; | ||
| 669 | } | 663 | } |
| 670 | 664 | ||
| 671 | rot->irq = platform_get_irq(pdev, 0); | 665 | rot->irq = platform_get_irq(pdev, 0); |
| 672 | if (rot->irq < 0) { | 666 | if (rot->irq < 0) { |
| 673 | dev_err(dev, "failed to get irq\n"); | 667 | dev_err(dev, "failed to get irq\n"); |
| 674 | ret = rot->irq; | 668 | return rot->irq; |
| 675 | goto err_get_irq; | ||
| 676 | } | 669 | } |
| 677 | 670 | ||
| 678 | ret = request_threaded_irq(rot->irq, NULL, rotator_irq_handler, | 671 | ret = request_threaded_irq(rot->irq, NULL, rotator_irq_handler, |
| 679 | IRQF_ONESHOT, "drm_rotator", rot); | 672 | IRQF_ONESHOT, "drm_rotator", rot); |
| 680 | if (ret < 0) { | 673 | if (ret < 0) { |
| 681 | dev_err(dev, "failed to request irq\n"); | 674 | dev_err(dev, "failed to request irq\n"); |
| 682 | goto err_get_irq; | 675 | return ret; |
| 683 | } | 676 | } |
| 684 | 677 | ||
| 685 | rot->clock = clk_get(dev, "rotator"); | 678 | rot->clock = devm_clk_get(dev, "rotator"); |
| 686 | if (IS_ERR_OR_NULL(rot->clock)) { | 679 | if (IS_ERR_OR_NULL(rot->clock)) { |
| 687 | dev_err(dev, "failed to get clock\n"); | 680 | dev_err(dev, "failed to get clock\n"); |
| 688 | ret = PTR_ERR(rot->clock); | 681 | ret = PTR_ERR(rot->clock); |
| @@ -720,13 +713,8 @@ static int rotator_probe(struct platform_device *pdev) | |||
| 720 | err_ippdrv_register: | 713 | err_ippdrv_register: |
| 721 | devm_kfree(dev, ippdrv->prop_list); | 714 | devm_kfree(dev, ippdrv->prop_list); |
| 722 | pm_runtime_disable(dev); | 715 | pm_runtime_disable(dev); |
| 723 | clk_put(rot->clock); | ||
| 724 | err_clk_get: | 716 | err_clk_get: |
| 725 | free_irq(rot->irq, rot); | 717 | free_irq(rot->irq, rot); |
| 726 | err_get_irq: | ||
| 727 | devm_iounmap(dev, rot->regs); | ||
| 728 | err_get_resource: | ||
| 729 | devm_kfree(dev, rot); | ||
| 730 | return ret; | 718 | return ret; |
| 731 | } | 719 | } |
| 732 | 720 | ||
| @@ -740,12 +728,8 @@ static int rotator_remove(struct platform_device *pdev) | |||
| 740 | exynos_drm_ippdrv_unregister(ippdrv); | 728 | exynos_drm_ippdrv_unregister(ippdrv); |
| 741 | 729 | ||
| 742 | pm_runtime_disable(dev); | 730 | pm_runtime_disable(dev); |
| 743 | clk_put(rot->clock); | ||
| 744 | 731 | ||
| 745 | free_irq(rot->irq, rot); | 732 | free_irq(rot->irq, rot); |
| 746 | devm_iounmap(dev, rot->regs); | ||
| 747 | |||
| 748 | devm_kfree(dev, rot); | ||
| 749 | 733 | ||
| 750 | return 0; | 734 | return 0; |
| 751 | } | 735 | } |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_rotator.h b/drivers/gpu/drm/exynos/exynos_drm_rotator.h index a2d7a14a52b6..71a0b4c0c1e8 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_rotator.h +++ b/drivers/gpu/drm/exynos/exynos_drm_rotator.h | |||
| @@ -5,24 +5,10 @@ | |||
| 5 | * YoungJun Cho <yj44.cho@samsung.com> | 5 | * YoungJun Cho <yj44.cho@samsung.com> |
| 6 | * Eunchul Kim <chulspro.kim@samsung.com> | 6 | * Eunchul Kim <chulspro.kim@samsung.com> |
| 7 | * | 7 | * |
| 8 | * Permission is hereby granted, free of charge, to any person obtaining a | 8 | * This program is free software; you can redistribute it and/or modify it |
| 9 | * copy of this software and associated documentation files (the "Software"), | 9 | * under the terms of the GNU General Public License as published by the |
| 10 | * to deal in the Software without restriction, including without limitation | 10 | * Free Software Foundation; either version 2 of the License, or (at your |
| 11 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | 11 | * option) any later version. |
| 12 | * and/or sell copies of the Software, and to permit persons to whom the | ||
| 13 | * Software is furnished to do so, subject to the following conditions: | ||
| 14 | * | ||
| 15 | * The above copyright notice and this permission notice (including the next | ||
| 16 | * paragraph) shall be included in all copies or substantial portions of the | ||
| 17 | * Software. | ||
| 18 | * | ||
| 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 20 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 21 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 22 | * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
| 23 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
| 24 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 25 | * OTHER DEALINGS IN THE SOFTWARE. | ||
| 26 | */ | 12 | */ |
| 27 | 13 | ||
| 28 | #ifndef _EXYNOS_DRM_ROTATOR_H_ | 14 | #ifndef _EXYNOS_DRM_ROTATOR_H_ |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c index a5c5a179e3b6..d0ca3c4e06c6 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c | |||
| @@ -372,34 +372,6 @@ static struct exynos_drm_manager vidi_manager = { | |||
| 372 | .display_ops = &vidi_display_ops, | 372 | .display_ops = &vidi_display_ops, |
| 373 | }; | 373 | }; |
| 374 | 374 | ||
| 375 | static void vidi_finish_pageflip(struct drm_device *drm_dev, int crtc) | ||
| 376 | { | ||
| 377 | struct exynos_drm_private *dev_priv = drm_dev->dev_private; | ||
| 378 | struct drm_pending_vblank_event *e, *t; | ||
| 379 | struct timeval now; | ||
| 380 | unsigned long flags; | ||
| 381 | |||
| 382 | spin_lock_irqsave(&drm_dev->event_lock, flags); | ||
| 383 | |||
| 384 | list_for_each_entry_safe(e, t, &dev_priv->pageflip_event_list, | ||
| 385 | base.link) { | ||
| 386 | /* if event's pipe isn't same as crtc then ignore it. */ | ||
| 387 | if (crtc != e->pipe) | ||
| 388 | continue; | ||
| 389 | |||
| 390 | do_gettimeofday(&now); | ||
| 391 | e->event.sequence = 0; | ||
| 392 | e->event.tv_sec = now.tv_sec; | ||
| 393 | e->event.tv_usec = now.tv_usec; | ||
| 394 | |||
| 395 | list_move_tail(&e->base.link, &e->base.file_priv->event_list); | ||
| 396 | wake_up_interruptible(&e->base.file_priv->event_wait); | ||
| 397 | drm_vblank_put(drm_dev, crtc); | ||
| 398 | } | ||
| 399 | |||
| 400 | spin_unlock_irqrestore(&drm_dev->event_lock, flags); | ||
| 401 | } | ||
| 402 | |||
| 403 | static void vidi_fake_vblank_handler(struct work_struct *work) | 375 | static void vidi_fake_vblank_handler(struct work_struct *work) |
| 404 | { | 376 | { |
| 405 | struct vidi_context *ctx = container_of(work, struct vidi_context, | 377 | struct vidi_context *ctx = container_of(work, struct vidi_context, |
| @@ -424,7 +396,7 @@ static void vidi_fake_vblank_handler(struct work_struct *work) | |||
| 424 | 396 | ||
| 425 | mutex_unlock(&ctx->lock); | 397 | mutex_unlock(&ctx->lock); |
| 426 | 398 | ||
| 427 | vidi_finish_pageflip(subdrv->drm_dev, manager->pipe); | 399 | exynos_drm_crtc_finish_pageflip(subdrv->drm_dev, manager->pipe); |
| 428 | } | 400 | } |
| 429 | 401 | ||
| 430 | static int vidi_subdrv_probe(struct drm_device *drm_dev, struct device *dev) | 402 | static int vidi_subdrv_probe(struct drm_device *drm_dev, struct device *dev) |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.h b/drivers/gpu/drm/exynos/exynos_drm_vidi.h index a4babe4e65d7..1e5fdaa36ccc 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.h +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.h | |||
| @@ -3,24 +3,10 @@ | |||
| 3 | * Copyright (c) 2012 Samsung Electronics Co., Ltd. | 3 | * Copyright (c) 2012 Samsung Electronics Co., Ltd. |
| 4 | * Author: Inki Dae <inki.dae@samsung.com> | 4 | * Author: Inki Dae <inki.dae@samsung.com> |
| 5 | * | 5 | * |
| 6 | * Permission is hereby granted, free of charge, to any person obtaining a | 6 | * This program is free software; you can redistribute it and/or modify it |
| 7 | * copy of this software and associated documentation files (the "Software"), | 7 | * under the terms of the GNU General Public License as published by the |
| 8 | * to deal in the Software without restriction, including without limitation | 8 | * Free Software Foundation; either version 2 of the License, or (at your |
| 9 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | 9 | * option) any later version. |
| 10 | * and/or sell copies of the Software, and to permit persons to whom the | ||
| 11 | * Software is furnished to do so, subject to the following conditions: | ||
| 12 | * | ||
| 13 | * The above copyright notice and this permission notice (including the next | ||
| 14 | * paragraph) shall be included in all copies or substantial portions of the | ||
| 15 | * Software. | ||
| 16 | * | ||
| 17 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 18 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 19 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 20 | * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
| 21 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
| 22 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 23 | * OTHER DEALINGS IN THE SOFTWARE. | ||
| 24 | */ | 10 | */ |
| 25 | 11 | ||
| 26 | #ifndef _EXYNOS_DRM_VIDI_H_ | 12 | #ifndef _EXYNOS_DRM_VIDI_H_ |
diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.h b/drivers/gpu/drm/exynos/exynos_hdmi.h index 1c3b6d8f1fe7..0ddf3957de15 100644 --- a/drivers/gpu/drm/exynos/exynos_hdmi.h +++ b/drivers/gpu/drm/exynos/exynos_hdmi.h | |||
| @@ -5,24 +5,10 @@ | |||
| 5 | * Inki Dae <inki.dae@samsung.com> | 5 | * Inki Dae <inki.dae@samsung.com> |
| 6 | * Seung-Woo Kim <sw0312.kim@samsung.com> | 6 | * Seung-Woo Kim <sw0312.kim@samsung.com> |
| 7 | * | 7 | * |
| 8 | * Permission is hereby granted, free of charge, to any person obtaining a | 8 | * This program is free software; you can redistribute it and/or modify it |
| 9 | * copy of this software and associated documentation files (the "Software"), | 9 | * under the terms of the GNU General Public License as published by the |
| 10 | * to deal in the Software without restriction, including without limitation | 10 | * Free Software Foundation; either version 2 of the License, or (at your |
| 11 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | 11 | * option) any later version. |
| 12 | * and/or sell copies of the Software, and to permit persons to whom the | ||
| 13 | * Software is furnished to do so, subject to the following conditions: | ||
| 14 | * | ||
| 15 | * The above copyright notice and this permission notice (including the next | ||
| 16 | * paragraph) shall be included in all copies or substantial portions of the | ||
| 17 | * Software. | ||
| 18 | * | ||
| 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 20 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 21 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 22 | * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
| 23 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
| 24 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 25 | * OTHER DEALINGS IN THE SOFTWARE. | ||
| 26 | */ | 12 | */ |
| 27 | 13 | ||
| 28 | #ifndef _EXYNOS_HDMI_H_ | 14 | #ifndef _EXYNOS_HDMI_H_ |
diff --git a/drivers/gpu/drm/exynos/exynos_mixer.c b/drivers/gpu/drm/exynos/exynos_mixer.c index 3f68b34fa127..c187ea33b748 100644 --- a/drivers/gpu/drm/exynos/exynos_mixer.c +++ b/drivers/gpu/drm/exynos/exynos_mixer.c | |||
| @@ -35,6 +35,7 @@ | |||
| 35 | #include <drm/exynos_drm.h> | 35 | #include <drm/exynos_drm.h> |
| 36 | 36 | ||
| 37 | #include "exynos_drm_drv.h" | 37 | #include "exynos_drm_drv.h" |
| 38 | #include "exynos_drm_crtc.h" | ||
| 38 | #include "exynos_drm_hdmi.h" | 39 | #include "exynos_drm_hdmi.h" |
| 39 | #include "exynos_drm_iommu.h" | 40 | #include "exynos_drm_iommu.h" |
| 40 | 41 | ||
| @@ -949,35 +950,6 @@ static struct exynos_mixer_ops mixer_ops = { | |||
| 949 | .win_disable = mixer_win_disable, | 950 | .win_disable = mixer_win_disable, |
| 950 | }; | 951 | }; |
| 951 | 952 | ||
| 952 | /* for pageflip event */ | ||
| 953 | static void mixer_finish_pageflip(struct drm_device *drm_dev, int crtc) | ||
| 954 | { | ||
| 955 | struct exynos_drm_private *dev_priv = drm_dev->dev_private; | ||
| 956 | struct drm_pending_vblank_event *e, *t; | ||
| 957 | struct timeval now; | ||
| 958 | unsigned long flags; | ||
| 959 | |||
| 960 | spin_lock_irqsave(&drm_dev->event_lock, flags); | ||
| 961 | |||
| 962 | list_for_each_entry_safe(e, t, &dev_priv->pageflip_event_list, | ||
| 963 | base.link) { | ||
| 964 | /* if event's pipe isn't same as crtc then ignore it. */ | ||
| 965 | if (crtc != e->pipe) | ||
| 966 | continue; | ||
| 967 | |||
| 968 | do_gettimeofday(&now); | ||
| 969 | e->event.sequence = 0; | ||
| 970 | e->event.tv_sec = now.tv_sec; | ||
| 971 | e->event.tv_usec = now.tv_usec; | ||
| 972 | |||
| 973 | list_move_tail(&e->base.link, &e->base.file_priv->event_list); | ||
| 974 | wake_up_interruptible(&e->base.file_priv->event_wait); | ||
| 975 | drm_vblank_put(drm_dev, crtc); | ||
| 976 | } | ||
| 977 | |||
| 978 | spin_unlock_irqrestore(&drm_dev->event_lock, flags); | ||
| 979 | } | ||
| 980 | |||
| 981 | static irqreturn_t mixer_irq_handler(int irq, void *arg) | 953 | static irqreturn_t mixer_irq_handler(int irq, void *arg) |
| 982 | { | 954 | { |
| 983 | struct exynos_drm_hdmi_context *drm_hdmi_ctx = arg; | 955 | struct exynos_drm_hdmi_context *drm_hdmi_ctx = arg; |
| @@ -1006,7 +978,8 @@ static irqreturn_t mixer_irq_handler(int irq, void *arg) | |||
| 1006 | } | 978 | } |
| 1007 | 979 | ||
| 1008 | drm_handle_vblank(drm_hdmi_ctx->drm_dev, ctx->pipe); | 980 | drm_handle_vblank(drm_hdmi_ctx->drm_dev, ctx->pipe); |
| 1009 | mixer_finish_pageflip(drm_hdmi_ctx->drm_dev, ctx->pipe); | 981 | exynos_drm_crtc_finish_pageflip(drm_hdmi_ctx->drm_dev, |
| 982 | ctx->pipe); | ||
| 1010 | 983 | ||
| 1011 | /* set wait vsync event to zero and wake up queue. */ | 984 | /* set wait vsync event to zero and wake up queue. */ |
| 1012 | if (atomic_read(&ctx->wait_vsync_event)) { | 985 | if (atomic_read(&ctx->wait_vsync_event)) { |
diff --git a/drivers/gpu/drm/i915/i915_gem_dmabuf.c b/drivers/gpu/drm/i915/i915_gem_dmabuf.c index 7be4241e8242..abeaafef6d7e 100644 --- a/drivers/gpu/drm/i915/i915_gem_dmabuf.c +++ b/drivers/gpu/drm/i915/i915_gem_dmabuf.c | |||
| @@ -266,7 +266,12 @@ struct drm_gem_object *i915_gem_prime_import(struct drm_device *dev, | |||
| 266 | obj = dma_buf->priv; | 266 | obj = dma_buf->priv; |
| 267 | /* is it from our device? */ | 267 | /* is it from our device? */ |
| 268 | if (obj->base.dev == dev) { | 268 | if (obj->base.dev == dev) { |
| 269 | /* | ||
| 270 | * Importing dmabuf exported from out own gem increases | ||
| 271 | * refcount on gem itself instead of f_count of dmabuf. | ||
| 272 | */ | ||
| 269 | drm_gem_object_reference(&obj->base); | 273 | drm_gem_object_reference(&obj->base); |
| 274 | dma_buf_put(dma_buf); | ||
| 270 | return &obj->base; | 275 | return &obj->base; |
| 271 | } | 276 | } |
| 272 | } | 277 | } |
diff --git a/drivers/gpu/drm/nouveau/nouveau_prime.c b/drivers/gpu/drm/nouveau/nouveau_prime.c index 3543fec2355e..b8e05ae38212 100644 --- a/drivers/gpu/drm/nouveau/nouveau_prime.c +++ b/drivers/gpu/drm/nouveau/nouveau_prime.c | |||
| @@ -193,6 +193,7 @@ struct drm_gem_object *nouveau_gem_prime_import(struct drm_device *dev, | |||
| 193 | if (nvbo->gem) { | 193 | if (nvbo->gem) { |
| 194 | if (nvbo->gem->dev == dev) { | 194 | if (nvbo->gem->dev == dev) { |
| 195 | drm_gem_object_reference(nvbo->gem); | 195 | drm_gem_object_reference(nvbo->gem); |
| 196 | dma_buf_put(dma_buf); | ||
| 196 | return nvbo->gem; | 197 | return nvbo->gem; |
| 197 | } | 198 | } |
| 198 | } | 199 | } |
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index 923f93647042..537e259b3837 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
| @@ -2646,7 +2646,7 @@ int r600_copy_blit(struct radeon_device *rdev, | |||
| 2646 | * @num_gpu_pages: number of GPU pages to xfer | 2646 | * @num_gpu_pages: number of GPU pages to xfer |
| 2647 | * @fence: radeon fence object | 2647 | * @fence: radeon fence object |
| 2648 | * | 2648 | * |
| 2649 | * Copy GPU paging using the DMA engine (r6xx-r7xx). | 2649 | * Copy GPU paging using the DMA engine (r6xx). |
| 2650 | * Used by the radeon ttm implementation to move pages if | 2650 | * Used by the radeon ttm implementation to move pages if |
| 2651 | * registered as the asic copy callback. | 2651 | * registered as the asic copy callback. |
| 2652 | */ | 2652 | */ |
| @@ -2669,8 +2669,8 @@ int r600_copy_dma(struct radeon_device *rdev, | |||
| 2669 | } | 2669 | } |
| 2670 | 2670 | ||
| 2671 | size_in_dw = (num_gpu_pages << RADEON_GPU_PAGE_SHIFT) / 4; | 2671 | size_in_dw = (num_gpu_pages << RADEON_GPU_PAGE_SHIFT) / 4; |
| 2672 | num_loops = DIV_ROUND_UP(size_in_dw, 0xffff); | 2672 | num_loops = DIV_ROUND_UP(size_in_dw, 0xFFFE); |
| 2673 | r = radeon_ring_lock(rdev, ring, num_loops * 5 + 8); | 2673 | r = radeon_ring_lock(rdev, ring, num_loops * 4 + 8); |
| 2674 | if (r) { | 2674 | if (r) { |
| 2675 | DRM_ERROR("radeon: moving bo (%d).\n", r); | 2675 | DRM_ERROR("radeon: moving bo (%d).\n", r); |
| 2676 | radeon_semaphore_free(rdev, &sem, NULL); | 2676 | radeon_semaphore_free(rdev, &sem, NULL); |
| @@ -2693,8 +2693,8 @@ int r600_copy_dma(struct radeon_device *rdev, | |||
| 2693 | radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_COPY, 0, 0, cur_size_in_dw)); | 2693 | radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_COPY, 0, 0, cur_size_in_dw)); |
| 2694 | radeon_ring_write(ring, dst_offset & 0xfffffffc); | 2694 | radeon_ring_write(ring, dst_offset & 0xfffffffc); |
| 2695 | radeon_ring_write(ring, src_offset & 0xfffffffc); | 2695 | radeon_ring_write(ring, src_offset & 0xfffffffc); |
| 2696 | radeon_ring_write(ring, upper_32_bits(dst_offset) & 0xff); | 2696 | radeon_ring_write(ring, (((upper_32_bits(dst_offset) & 0xff) << 16) | |
| 2697 | radeon_ring_write(ring, upper_32_bits(src_offset) & 0xff); | 2697 | (upper_32_bits(src_offset) & 0xff))); |
| 2698 | src_offset += cur_size_in_dw * 4; | 2698 | src_offset += cur_size_in_dw * 4; |
| 2699 | dst_offset += cur_size_in_dw * 4; | 2699 | dst_offset += cur_size_in_dw * 4; |
| 2700 | } | 2700 | } |
diff --git a/drivers/gpu/drm/radeon/r600_cs.c b/drivers/gpu/drm/radeon/r600_cs.c index 9ea13d07cc55..03191a56eb44 100644 --- a/drivers/gpu/drm/radeon/r600_cs.c +++ b/drivers/gpu/drm/radeon/r600_cs.c | |||
| @@ -2677,16 +2677,29 @@ int r600_dma_cs_parse(struct radeon_cs_parser *p) | |||
| 2677 | } | 2677 | } |
| 2678 | p->idx += 7; | 2678 | p->idx += 7; |
| 2679 | } else { | 2679 | } else { |
| 2680 | src_offset = ib[idx+2]; | 2680 | if (p->family >= CHIP_RV770) { |
| 2681 | src_offset |= ((u64)(ib[idx+4] & 0xff)) << 32; | 2681 | src_offset = ib[idx+2]; |
| 2682 | dst_offset = ib[idx+1]; | 2682 | src_offset |= ((u64)(ib[idx+4] & 0xff)) << 32; |
| 2683 | dst_offset |= ((u64)(ib[idx+3] & 0xff)) << 32; | 2683 | dst_offset = ib[idx+1]; |
| 2684 | dst_offset |= ((u64)(ib[idx+3] & 0xff)) << 32; | ||
| 2684 | 2685 | ||
| 2685 | ib[idx+1] += (u32)(dst_reloc->lobj.gpu_offset & 0xfffffffc); | 2686 | ib[idx+1] += (u32)(dst_reloc->lobj.gpu_offset & 0xfffffffc); |
| 2686 | ib[idx+2] += (u32)(src_reloc->lobj.gpu_offset & 0xfffffffc); | 2687 | ib[idx+2] += (u32)(src_reloc->lobj.gpu_offset & 0xfffffffc); |
| 2687 | ib[idx+3] += upper_32_bits(dst_reloc->lobj.gpu_offset) & 0xff; | 2688 | ib[idx+3] += upper_32_bits(dst_reloc->lobj.gpu_offset) & 0xff; |
| 2688 | ib[idx+4] += upper_32_bits(src_reloc->lobj.gpu_offset) & 0xff; | 2689 | ib[idx+4] += upper_32_bits(src_reloc->lobj.gpu_offset) & 0xff; |
| 2689 | p->idx += 5; | 2690 | p->idx += 5; |
| 2691 | } else { | ||
| 2692 | src_offset = ib[idx+2]; | ||
| 2693 | src_offset |= ((u64)(ib[idx+3] & 0xff)) << 32; | ||
| 2694 | dst_offset = ib[idx+1]; | ||
| 2695 | dst_offset |= ((u64)(ib[idx+3] & 0xff0000)) << 16; | ||
| 2696 | |||
| 2697 | ib[idx+1] += (u32)(dst_reloc->lobj.gpu_offset & 0xfffffffc); | ||
| 2698 | ib[idx+2] += (u32)(src_reloc->lobj.gpu_offset & 0xfffffffc); | ||
| 2699 | ib[idx+3] += upper_32_bits(src_reloc->lobj.gpu_offset) & 0xff; | ||
| 2700 | ib[idx+3] += (upper_32_bits(dst_reloc->lobj.gpu_offset) & 0xff) << 16; | ||
| 2701 | p->idx += 4; | ||
| 2702 | } | ||
| 2690 | } | 2703 | } |
| 2691 | if ((src_offset + (count * 4)) > radeon_bo_size(src_reloc->robj)) { | 2704 | if ((src_offset + (count * 4)) > radeon_bo_size(src_reloc->robj)) { |
| 2692 | dev_warn(p->dev, "DMA copy src buffer too small (%llu %lu)\n", | 2705 | dev_warn(p->dev, "DMA copy src buffer too small (%llu %lu)\n", |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.c b/drivers/gpu/drm/radeon/radeon_asic.c index 596bcbe80ed0..9056fafb00ea 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.c +++ b/drivers/gpu/drm/radeon/radeon_asic.c | |||
| @@ -1140,9 +1140,9 @@ static struct radeon_asic rv770_asic = { | |||
| 1140 | .copy = { | 1140 | .copy = { |
| 1141 | .blit = &r600_copy_blit, | 1141 | .blit = &r600_copy_blit, |
| 1142 | .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX, | 1142 | .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX, |
| 1143 | .dma = &r600_copy_dma, | 1143 | .dma = &rv770_copy_dma, |
| 1144 | .dma_ring_index = R600_RING_TYPE_DMA_INDEX, | 1144 | .dma_ring_index = R600_RING_TYPE_DMA_INDEX, |
| 1145 | .copy = &r600_copy_dma, | 1145 | .copy = &rv770_copy_dma, |
| 1146 | .copy_ring_index = R600_RING_TYPE_DMA_INDEX, | 1146 | .copy_ring_index = R600_RING_TYPE_DMA_INDEX, |
| 1147 | }, | 1147 | }, |
| 1148 | .surface = { | 1148 | .surface = { |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h index 5f4882cc2152..15d70e613076 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.h +++ b/drivers/gpu/drm/radeon/radeon_asic.h | |||
| @@ -403,6 +403,10 @@ u32 rv770_page_flip(struct radeon_device *rdev, int crtc, u64 crtc_base); | |||
| 403 | void r700_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc); | 403 | void r700_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc); |
| 404 | void r700_cp_stop(struct radeon_device *rdev); | 404 | void r700_cp_stop(struct radeon_device *rdev); |
| 405 | void r700_cp_fini(struct radeon_device *rdev); | 405 | void r700_cp_fini(struct radeon_device *rdev); |
| 406 | int rv770_copy_dma(struct radeon_device *rdev, | ||
| 407 | uint64_t src_offset, uint64_t dst_offset, | ||
| 408 | unsigned num_gpu_pages, | ||
| 409 | struct radeon_fence **fence); | ||
| 406 | 410 | ||
| 407 | /* | 411 | /* |
| 408 | * evergreen | 412 | * evergreen |
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index cd756262924d..edfc54e41842 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
| @@ -897,6 +897,25 @@ static void radeon_check_arguments(struct radeon_device *rdev) | |||
| 897 | } | 897 | } |
| 898 | 898 | ||
| 899 | /** | 899 | /** |
| 900 | * radeon_switcheroo_quirk_long_wakeup - return true if longer d3 delay is | ||
| 901 | * needed for waking up. | ||
| 902 | * | ||
| 903 | * @pdev: pci dev pointer | ||
| 904 | */ | ||
| 905 | static bool radeon_switcheroo_quirk_long_wakeup(struct pci_dev *pdev) | ||
| 906 | { | ||
| 907 | |||
| 908 | /* 6600m in a macbook pro */ | ||
| 909 | if (pdev->subsystem_vendor == PCI_VENDOR_ID_APPLE && | ||
| 910 | pdev->subsystem_device == 0x00e2) { | ||
| 911 | printk(KERN_INFO "radeon: quirking longer d3 wakeup delay\n"); | ||
| 912 | return true; | ||
| 913 | } | ||
| 914 | |||
| 915 | return false; | ||
| 916 | } | ||
| 917 | |||
| 918 | /** | ||
| 900 | * radeon_switcheroo_set_state - set switcheroo state | 919 | * radeon_switcheroo_set_state - set switcheroo state |
| 901 | * | 920 | * |
| 902 | * @pdev: pci dev pointer | 921 | * @pdev: pci dev pointer |
| @@ -910,10 +929,19 @@ static void radeon_switcheroo_set_state(struct pci_dev *pdev, enum vga_switchero | |||
| 910 | struct drm_device *dev = pci_get_drvdata(pdev); | 929 | struct drm_device *dev = pci_get_drvdata(pdev); |
| 911 | pm_message_t pmm = { .event = PM_EVENT_SUSPEND }; | 930 | pm_message_t pmm = { .event = PM_EVENT_SUSPEND }; |
| 912 | if (state == VGA_SWITCHEROO_ON) { | 931 | if (state == VGA_SWITCHEROO_ON) { |
| 932 | unsigned d3_delay = dev->pdev->d3_delay; | ||
| 933 | |||
| 913 | printk(KERN_INFO "radeon: switched on\n"); | 934 | printk(KERN_INFO "radeon: switched on\n"); |
| 914 | /* don't suspend or resume card normally */ | 935 | /* don't suspend or resume card normally */ |
| 915 | dev->switch_power_state = DRM_SWITCH_POWER_CHANGING; | 936 | dev->switch_power_state = DRM_SWITCH_POWER_CHANGING; |
| 937 | |||
| 938 | if (d3_delay < 20 && radeon_switcheroo_quirk_long_wakeup(pdev)) | ||
| 939 | dev->pdev->d3_delay = 20; | ||
| 940 | |||
| 916 | radeon_resume_kms(dev); | 941 | radeon_resume_kms(dev); |
| 942 | |||
| 943 | dev->pdev->d3_delay = d3_delay; | ||
| 944 | |||
| 917 | dev->switch_power_state = DRM_SWITCH_POWER_ON; | 945 | dev->switch_power_state = DRM_SWITCH_POWER_ON; |
| 918 | drm_kms_helper_poll_enable(dev); | 946 | drm_kms_helper_poll_enable(dev); |
| 919 | } else { | 947 | } else { |
diff --git a/drivers/gpu/drm/radeon/radeon_prime.c b/drivers/gpu/drm/radeon/radeon_prime.c index e09521858f64..26c23bb651c6 100644 --- a/drivers/gpu/drm/radeon/radeon_prime.c +++ b/drivers/gpu/drm/radeon/radeon_prime.c | |||
| @@ -194,6 +194,7 @@ struct drm_gem_object *radeon_gem_prime_import(struct drm_device *dev, | |||
| 194 | bo = dma_buf->priv; | 194 | bo = dma_buf->priv; |
| 195 | if (bo->gem_base.dev == dev) { | 195 | if (bo->gem_base.dev == dev) { |
| 196 | drm_gem_object_reference(&bo->gem_base); | 196 | drm_gem_object_reference(&bo->gem_base); |
| 197 | dma_buf_put(dma_buf); | ||
| 197 | return &bo->gem_base; | 198 | return &bo->gem_base; |
| 198 | } | 199 | } |
| 199 | } | 200 | } |
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c index 87c979c4f721..1b2444f4d8f4 100644 --- a/drivers/gpu/drm/radeon/rv770.c +++ b/drivers/gpu/drm/radeon/rv770.c | |||
| @@ -887,6 +887,80 @@ static int rv770_mc_init(struct radeon_device *rdev) | |||
| 887 | return 0; | 887 | return 0; |
| 888 | } | 888 | } |
| 889 | 889 | ||
| 890 | /** | ||
| 891 | * rv770_copy_dma - copy pages using the DMA engine | ||
| 892 | * | ||
| 893 | * @rdev: radeon_device pointer | ||
| 894 | * @src_offset: src GPU address | ||
| 895 | * @dst_offset: dst GPU address | ||
| 896 | * @num_gpu_pages: number of GPU pages to xfer | ||
| 897 | * @fence: radeon fence object | ||
| 898 | * | ||
| 899 | * Copy GPU paging using the DMA engine (r7xx). | ||
| 900 | * Used by the radeon ttm implementation to move pages if | ||
| 901 | * registered as the asic copy callback. | ||
| 902 | */ | ||
| 903 | int rv770_copy_dma(struct radeon_device *rdev, | ||
| 904 | uint64_t src_offset, uint64_t dst_offset, | ||
| 905 | unsigned num_gpu_pages, | ||
| 906 | struct radeon_fence **fence) | ||
| 907 | { | ||
| 908 | struct radeon_semaphore *sem = NULL; | ||
| 909 | int ring_index = rdev->asic->copy.dma_ring_index; | ||
| 910 | struct radeon_ring *ring = &rdev->ring[ring_index]; | ||
| 911 | u32 size_in_dw, cur_size_in_dw; | ||
| 912 | int i, num_loops; | ||
| 913 | int r = 0; | ||
| 914 | |||
| 915 | r = radeon_semaphore_create(rdev, &sem); | ||
| 916 | if (r) { | ||
| 917 | DRM_ERROR("radeon: moving bo (%d).\n", r); | ||
| 918 | return r; | ||
| 919 | } | ||
| 920 | |||
| 921 | size_in_dw = (num_gpu_pages << RADEON_GPU_PAGE_SHIFT) / 4; | ||
| 922 | num_loops = DIV_ROUND_UP(size_in_dw, 0xFFFF); | ||
| 923 | r = radeon_ring_lock(rdev, ring, num_loops * 5 + 8); | ||
| 924 | if (r) { | ||
| 925 | DRM_ERROR("radeon: moving bo (%d).\n", r); | ||
| 926 | radeon_semaphore_free(rdev, &sem, NULL); | ||
| 927 | return r; | ||
| 928 | } | ||
| 929 | |||
| 930 | if (radeon_fence_need_sync(*fence, ring->idx)) { | ||
| 931 | radeon_semaphore_sync_rings(rdev, sem, (*fence)->ring, | ||
| 932 | ring->idx); | ||
| 933 | radeon_fence_note_sync(*fence, ring->idx); | ||
| 934 | } else { | ||
| 935 | radeon_semaphore_free(rdev, &sem, NULL); | ||
| 936 | } | ||
| 937 | |||
| 938 | for (i = 0; i < num_loops; i++) { | ||
| 939 | cur_size_in_dw = size_in_dw; | ||
| 940 | if (cur_size_in_dw > 0xFFFF) | ||
| 941 | cur_size_in_dw = 0xFFFF; | ||
| 942 | size_in_dw -= cur_size_in_dw; | ||
| 943 | radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_COPY, 0, 0, cur_size_in_dw)); | ||
| 944 | radeon_ring_write(ring, dst_offset & 0xfffffffc); | ||
| 945 | radeon_ring_write(ring, src_offset & 0xfffffffc); | ||
| 946 | radeon_ring_write(ring, upper_32_bits(dst_offset) & 0xff); | ||
| 947 | radeon_ring_write(ring, upper_32_bits(src_offset) & 0xff); | ||
| 948 | src_offset += cur_size_in_dw * 4; | ||
| 949 | dst_offset += cur_size_in_dw * 4; | ||
| 950 | } | ||
| 951 | |||
| 952 | r = radeon_fence_emit(rdev, fence, ring->idx); | ||
| 953 | if (r) { | ||
| 954 | radeon_ring_unlock_undo(rdev, ring); | ||
| 955 | return r; | ||
| 956 | } | ||
| 957 | |||
| 958 | radeon_ring_unlock_commit(rdev, ring); | ||
| 959 | radeon_semaphore_free(rdev, &sem, *fence); | ||
| 960 | |||
| 961 | return r; | ||
| 962 | } | ||
| 963 | |||
| 890 | static int rv770_startup(struct radeon_device *rdev) | 964 | static int rv770_startup(struct radeon_device *rdev) |
| 891 | { | 965 | { |
| 892 | struct radeon_ring *ring; | 966 | struct radeon_ring *ring; |
diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c index 9e9c5d2a5c74..d73d6e3e17b2 100644 --- a/drivers/gpu/drm/ttm/ttm_bo_util.c +++ b/drivers/gpu/drm/ttm/ttm_bo_util.c | |||
| @@ -654,11 +654,13 @@ int ttm_bo_move_accel_cleanup(struct ttm_buffer_object *bo, | |||
| 654 | */ | 654 | */ |
| 655 | 655 | ||
| 656 | set_bit(TTM_BO_PRIV_FLAG_MOVING, &bo->priv_flags); | 656 | set_bit(TTM_BO_PRIV_FLAG_MOVING, &bo->priv_flags); |
| 657 | |||
| 658 | /* ttm_buffer_object_transfer accesses bo->sync_obj */ | ||
| 659 | ret = ttm_buffer_object_transfer(bo, &ghost_obj); | ||
| 657 | spin_unlock(&bdev->fence_lock); | 660 | spin_unlock(&bdev->fence_lock); |
| 658 | if (tmp_obj) | 661 | if (tmp_obj) |
| 659 | driver->sync_obj_unref(&tmp_obj); | 662 | driver->sync_obj_unref(&tmp_obj); |
| 660 | 663 | ||
| 661 | ret = ttm_buffer_object_transfer(bo, &ghost_obj); | ||
| 662 | if (ret) | 664 | if (ret) |
| 663 | return ret; | 665 | return ret; |
| 664 | 666 | ||
diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c index c49c04d9c2b0..4ba384f1ab54 100644 --- a/drivers/idle/intel_idle.c +++ b/drivers/idle/intel_idle.c | |||
| @@ -506,7 +506,7 @@ static int intel_idle_cpuidle_driver_init(void) | |||
| 506 | if (*cpuidle_state_table[cstate].name == '\0') | 506 | if (*cpuidle_state_table[cstate].name == '\0') |
| 507 | pr_debug(PREFIX "unaware of model 0x%x" | 507 | pr_debug(PREFIX "unaware of model 0x%x" |
| 508 | " MWAIT %d please" | 508 | " MWAIT %d please" |
| 509 | " contact lenb@kernel.org", | 509 | " contact lenb@kernel.org\n", |
| 510 | boot_cpu_data.x86_model, cstate); | 510 | boot_cpu_data.x86_model, cstate); |
| 511 | continue; | 511 | continue; |
| 512 | } | 512 | } |
diff --git a/drivers/net/ethernet/nvidia/forcedeth.c b/drivers/net/ethernet/nvidia/forcedeth.c index 653487dc7b52..87fa5919c455 100644 --- a/drivers/net/ethernet/nvidia/forcedeth.c +++ b/drivers/net/ethernet/nvidia/forcedeth.c | |||
| @@ -1821,6 +1821,11 @@ static int nv_alloc_rx(struct net_device *dev) | |||
| 1821 | skb->data, | 1821 | skb->data, |
| 1822 | skb_tailroom(skb), | 1822 | skb_tailroom(skb), |
| 1823 | PCI_DMA_FROMDEVICE); | 1823 | PCI_DMA_FROMDEVICE); |
| 1824 | if (pci_dma_mapping_error(np->pci_dev, | ||
| 1825 | np->put_rx_ctx->dma)) { | ||
| 1826 | kfree_skb(skb); | ||
| 1827 | goto packet_dropped; | ||
| 1828 | } | ||
| 1824 | np->put_rx_ctx->dma_len = skb_tailroom(skb); | 1829 | np->put_rx_ctx->dma_len = skb_tailroom(skb); |
| 1825 | np->put_rx.orig->buf = cpu_to_le32(np->put_rx_ctx->dma); | 1830 | np->put_rx.orig->buf = cpu_to_le32(np->put_rx_ctx->dma); |
| 1826 | wmb(); | 1831 | wmb(); |
| @@ -1830,6 +1835,7 @@ static int nv_alloc_rx(struct net_device *dev) | |||
| 1830 | if (unlikely(np->put_rx_ctx++ == np->last_rx_ctx)) | 1835 | if (unlikely(np->put_rx_ctx++ == np->last_rx_ctx)) |
| 1831 | np->put_rx_ctx = np->first_rx_ctx; | 1836 | np->put_rx_ctx = np->first_rx_ctx; |
| 1832 | } else { | 1837 | } else { |
| 1838 | packet_dropped: | ||
| 1833 | u64_stats_update_begin(&np->swstats_rx_syncp); | 1839 | u64_stats_update_begin(&np->swstats_rx_syncp); |
| 1834 | np->stat_rx_dropped++; | 1840 | np->stat_rx_dropped++; |
| 1835 | u64_stats_update_end(&np->swstats_rx_syncp); | 1841 | u64_stats_update_end(&np->swstats_rx_syncp); |
| @@ -1856,6 +1862,11 @@ static int nv_alloc_rx_optimized(struct net_device *dev) | |||
| 1856 | skb->data, | 1862 | skb->data, |
| 1857 | skb_tailroom(skb), | 1863 | skb_tailroom(skb), |
| 1858 | PCI_DMA_FROMDEVICE); | 1864 | PCI_DMA_FROMDEVICE); |
| 1865 | if (pci_dma_mapping_error(np->pci_dev, | ||
| 1866 | np->put_rx_ctx->dma)) { | ||
| 1867 | kfree_skb(skb); | ||
| 1868 | goto packet_dropped; | ||
| 1869 | } | ||
| 1859 | np->put_rx_ctx->dma_len = skb_tailroom(skb); | 1870 | np->put_rx_ctx->dma_len = skb_tailroom(skb); |
| 1860 | np->put_rx.ex->bufhigh = cpu_to_le32(dma_high(np->put_rx_ctx->dma)); | 1871 | np->put_rx.ex->bufhigh = cpu_to_le32(dma_high(np->put_rx_ctx->dma)); |
| 1861 | np->put_rx.ex->buflow = cpu_to_le32(dma_low(np->put_rx_ctx->dma)); | 1872 | np->put_rx.ex->buflow = cpu_to_le32(dma_low(np->put_rx_ctx->dma)); |
| @@ -1866,6 +1877,7 @@ static int nv_alloc_rx_optimized(struct net_device *dev) | |||
| 1866 | if (unlikely(np->put_rx_ctx++ == np->last_rx_ctx)) | 1877 | if (unlikely(np->put_rx_ctx++ == np->last_rx_ctx)) |
| 1867 | np->put_rx_ctx = np->first_rx_ctx; | 1878 | np->put_rx_ctx = np->first_rx_ctx; |
| 1868 | } else { | 1879 | } else { |
| 1880 | packet_dropped: | ||
| 1869 | u64_stats_update_begin(&np->swstats_rx_syncp); | 1881 | u64_stats_update_begin(&np->swstats_rx_syncp); |
| 1870 | np->stat_rx_dropped++; | 1882 | np->stat_rx_dropped++; |
| 1871 | u64_stats_update_end(&np->swstats_rx_syncp); | 1883 | u64_stats_update_end(&np->swstats_rx_syncp); |
| @@ -2217,6 +2229,15 @@ static netdev_tx_t nv_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 2217 | bcnt = (size > NV_TX2_TSO_MAX_SIZE) ? NV_TX2_TSO_MAX_SIZE : size; | 2229 | bcnt = (size > NV_TX2_TSO_MAX_SIZE) ? NV_TX2_TSO_MAX_SIZE : size; |
| 2218 | np->put_tx_ctx->dma = pci_map_single(np->pci_dev, skb->data + offset, bcnt, | 2230 | np->put_tx_ctx->dma = pci_map_single(np->pci_dev, skb->data + offset, bcnt, |
| 2219 | PCI_DMA_TODEVICE); | 2231 | PCI_DMA_TODEVICE); |
| 2232 | if (pci_dma_mapping_error(np->pci_dev, | ||
| 2233 | np->put_tx_ctx->dma)) { | ||
| 2234 | /* on DMA mapping error - drop the packet */ | ||
| 2235 | kfree_skb(skb); | ||
| 2236 | u64_stats_update_begin(&np->swstats_tx_syncp); | ||
| 2237 | np->stat_tx_dropped++; | ||
| 2238 | u64_stats_update_end(&np->swstats_tx_syncp); | ||
| 2239 | return NETDEV_TX_OK; | ||
| 2240 | } | ||
| 2220 | np->put_tx_ctx->dma_len = bcnt; | 2241 | np->put_tx_ctx->dma_len = bcnt; |
| 2221 | np->put_tx_ctx->dma_single = 1; | 2242 | np->put_tx_ctx->dma_single = 1; |
| 2222 | put_tx->buf = cpu_to_le32(np->put_tx_ctx->dma); | 2243 | put_tx->buf = cpu_to_le32(np->put_tx_ctx->dma); |
| @@ -2337,6 +2358,15 @@ static netdev_tx_t nv_start_xmit_optimized(struct sk_buff *skb, | |||
| 2337 | bcnt = (size > NV_TX2_TSO_MAX_SIZE) ? NV_TX2_TSO_MAX_SIZE : size; | 2358 | bcnt = (size > NV_TX2_TSO_MAX_SIZE) ? NV_TX2_TSO_MAX_SIZE : size; |
| 2338 | np->put_tx_ctx->dma = pci_map_single(np->pci_dev, skb->data + offset, bcnt, | 2359 | np->put_tx_ctx->dma = pci_map_single(np->pci_dev, skb->data + offset, bcnt, |
| 2339 | PCI_DMA_TODEVICE); | 2360 | PCI_DMA_TODEVICE); |
| 2361 | if (pci_dma_mapping_error(np->pci_dev, | ||
| 2362 | np->put_tx_ctx->dma)) { | ||
| 2363 | /* on DMA mapping error - drop the packet */ | ||
| 2364 | kfree_skb(skb); | ||
| 2365 | u64_stats_update_begin(&np->swstats_tx_syncp); | ||
| 2366 | np->stat_tx_dropped++; | ||
| 2367 | u64_stats_update_end(&np->swstats_tx_syncp); | ||
| 2368 | return NETDEV_TX_OK; | ||
| 2369 | } | ||
| 2340 | np->put_tx_ctx->dma_len = bcnt; | 2370 | np->put_tx_ctx->dma_len = bcnt; |
| 2341 | np->put_tx_ctx->dma_single = 1; | 2371 | np->put_tx_ctx->dma_single = 1; |
| 2342 | put_tx->bufhigh = cpu_to_le32(dma_high(np->put_tx_ctx->dma)); | 2372 | put_tx->bufhigh = cpu_to_le32(dma_high(np->put_tx_ctx->dma)); |
| @@ -5003,6 +5033,11 @@ static int nv_loopback_test(struct net_device *dev) | |||
| 5003 | test_dma_addr = pci_map_single(np->pci_dev, tx_skb->data, | 5033 | test_dma_addr = pci_map_single(np->pci_dev, tx_skb->data, |
| 5004 | skb_tailroom(tx_skb), | 5034 | skb_tailroom(tx_skb), |
| 5005 | PCI_DMA_FROMDEVICE); | 5035 | PCI_DMA_FROMDEVICE); |
| 5036 | if (pci_dma_mapping_error(np->pci_dev, | ||
| 5037 | test_dma_addr)) { | ||
| 5038 | dev_kfree_skb_any(tx_skb); | ||
| 5039 | goto out; | ||
| 5040 | } | ||
| 5006 | pkt_data = skb_put(tx_skb, pkt_len); | 5041 | pkt_data = skb_put(tx_skb, pkt_len); |
| 5007 | for (i = 0; i < pkt_len; i++) | 5042 | for (i = 0; i < pkt_len; i++) |
| 5008 | pkt_data[i] = (u8)(i & 0xff); | 5043 | pkt_data[i] = (u8)(i & 0xff); |
diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c index 91d7cb9728eb..6a1ca500e612 100644 --- a/drivers/net/usb/qmi_wwan.c +++ b/drivers/net/usb/qmi_wwan.c | |||
| @@ -458,6 +458,7 @@ static const struct usb_device_id products[] = { | |||
| 458 | {QMI_FIXED_INTF(0x1199, 0x68a2, 8)}, /* Sierra Wireless MC7710 in QMI mode */ | 458 | {QMI_FIXED_INTF(0x1199, 0x68a2, 8)}, /* Sierra Wireless MC7710 in QMI mode */ |
| 459 | {QMI_FIXED_INTF(0x1199, 0x68a2, 19)}, /* Sierra Wireless MC7710 in QMI mode */ | 459 | {QMI_FIXED_INTF(0x1199, 0x68a2, 19)}, /* Sierra Wireless MC7710 in QMI mode */ |
| 460 | {QMI_FIXED_INTF(0x1199, 0x901c, 8)}, /* Sierra Wireless EM7700 */ | 460 | {QMI_FIXED_INTF(0x1199, 0x901c, 8)}, /* Sierra Wireless EM7700 */ |
| 461 | {QMI_FIXED_INTF(0x1bbb, 0x011e, 4)}, /* Telekom Speedstick LTE II (Alcatel One Touch L100V LTE) */ | ||
| 461 | 462 | ||
| 462 | /* 4. Gobi 1000 devices */ | 463 | /* 4. Gobi 1000 devices */ |
| 463 | {QMI_GOBI1K_DEVICE(0x05c6, 0x9212)}, /* Acer Gobi Modem Device */ | 464 | {QMI_GOBI1K_DEVICE(0x05c6, 0x9212)}, /* Acer Gobi Modem Device */ |
diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c index 40f2cc135a49..656230e0d18c 100644 --- a/drivers/net/vxlan.c +++ b/drivers/net/vxlan.c | |||
| @@ -1191,6 +1191,7 @@ static void vxlan_setup(struct net_device *dev) | |||
| 1191 | 1191 | ||
| 1192 | dev->hw_features |= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_RXCSUM; | 1192 | dev->hw_features |= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_RXCSUM; |
| 1193 | dev->priv_flags &= ~IFF_XMIT_DST_RELEASE; | 1193 | dev->priv_flags &= ~IFF_XMIT_DST_RELEASE; |
| 1194 | dev->priv_flags |= IFF_LIVE_ADDR_CHANGE; | ||
| 1194 | 1195 | ||
| 1195 | spin_lock_init(&vxlan->hash_lock); | 1196 | spin_lock_init(&vxlan->hash_lock); |
| 1196 | 1197 | ||
diff --git a/drivers/net/wireless/ath/ath9k/Kconfig b/drivers/net/wireless/ath/ath9k/Kconfig index 5fc15bf8be09..7647ed6b73d7 100644 --- a/drivers/net/wireless/ath/ath9k/Kconfig +++ b/drivers/net/wireless/ath/ath9k/Kconfig | |||
| @@ -2,6 +2,7 @@ config ATH9K_HW | |||
| 2 | tristate | 2 | tristate |
| 3 | config ATH9K_COMMON | 3 | config ATH9K_COMMON |
| 4 | tristate | 4 | tristate |
| 5 | select ATH_COMMON | ||
| 5 | config ATH9K_DFS_DEBUGFS | 6 | config ATH9K_DFS_DEBUGFS |
| 6 | def_bool y | 7 | def_bool y |
| 7 | depends on ATH9K_DEBUGFS && ATH9K_DFS_CERTIFIED | 8 | depends on ATH9K_DEBUGFS && ATH9K_DFS_CERTIFIED |
| @@ -17,7 +18,6 @@ config ATH9K_BTCOEX_SUPPORT | |||
| 17 | config ATH9K | 18 | config ATH9K |
| 18 | tristate "Atheros 802.11n wireless cards support" | 19 | tristate "Atheros 802.11n wireless cards support" |
| 19 | depends on MAC80211 | 20 | depends on MAC80211 |
| 20 | select ATH_COMMON | ||
| 21 | select ATH9K_HW | 21 | select ATH9K_HW |
| 22 | select MAC80211_LEDS | 22 | select MAC80211_LEDS |
| 23 | select LEDS_CLASS | 23 | select LEDS_CLASS |
| @@ -56,7 +56,8 @@ config ATH9K_AHB | |||
| 56 | 56 | ||
| 57 | config ATH9K_DEBUGFS | 57 | config ATH9K_DEBUGFS |
| 58 | bool "Atheros ath9k debugging" | 58 | bool "Atheros ath9k debugging" |
| 59 | depends on ATH9K && DEBUG_FS | 59 | depends on ATH9K |
| 60 | select MAC80211_DEBUGFS | ||
| 60 | ---help--- | 61 | ---help--- |
| 61 | Say Y, if you need access to ath9k's statistics for | 62 | Say Y, if you need access to ath9k's statistics for |
| 62 | interrupts, rate control, etc. | 63 | interrupts, rate control, etc. |
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_hw.c b/drivers/net/wireless/ath/ath9k/ar9003_hw.c index 74fd3977feeb..59bf5f31e212 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_hw.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_hw.c | |||
| @@ -544,7 +544,7 @@ static void ar9003_rx_gain_table_mode0(struct ath_hw *ah) | |||
| 544 | ar9340Common_rx_gain_table_1p0); | 544 | ar9340Common_rx_gain_table_1p0); |
| 545 | else if (AR_SREV_9485_11(ah)) | 545 | else if (AR_SREV_9485_11(ah)) |
| 546 | INIT_INI_ARRAY(&ah->iniModesRxGain, | 546 | INIT_INI_ARRAY(&ah->iniModesRxGain, |
| 547 | ar9485Common_wo_xlna_rx_gain_1_1); | 547 | ar9485_common_rx_gain_1_1); |
| 548 | else if (AR_SREV_9550(ah)) { | 548 | else if (AR_SREV_9550(ah)) { |
| 549 | INIT_INI_ARRAY(&ah->iniModesRxGain, | 549 | INIT_INI_ARRAY(&ah->iniModesRxGain, |
| 550 | ar955x_1p0_common_rx_gain_table); | 550 | ar955x_1p0_common_rx_gain_table); |
diff --git a/drivers/net/wireless/ath/carl9170/fw.c b/drivers/net/wireless/ath/carl9170/fw.c index aaebecd19e59..63fd9af3fd39 100644 --- a/drivers/net/wireless/ath/carl9170/fw.c +++ b/drivers/net/wireless/ath/carl9170/fw.c | |||
| @@ -336,8 +336,12 @@ static int carl9170_fw(struct ar9170 *ar, const __u8 *data, size_t len) | |||
| 336 | if (SUPP(CARL9170FW_WLANTX_CAB)) { | 336 | if (SUPP(CARL9170FW_WLANTX_CAB)) { |
| 337 | if_comb_types |= | 337 | if_comb_types |= |
| 338 | BIT(NL80211_IFTYPE_AP) | | 338 | BIT(NL80211_IFTYPE_AP) | |
| 339 | BIT(NL80211_IFTYPE_MESH_POINT) | | ||
| 340 | BIT(NL80211_IFTYPE_P2P_GO); | 339 | BIT(NL80211_IFTYPE_P2P_GO); |
| 340 | |||
| 341 | #ifdef CONFIG_MAC80211_MESH | ||
| 342 | if_comb_types |= | ||
| 343 | BIT(NL80211_IFTYPE_MESH_POINT); | ||
| 344 | #endif /* CONFIG_MAC80211_MESH */ | ||
| 341 | } | 345 | } |
| 342 | } | 346 | } |
| 343 | 347 | ||
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c index 1261a9b84e04..75464ad4fbd1 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c | |||
| @@ -3091,10 +3091,11 @@ brcmf_configure_wpaie(struct net_device *ndev, struct brcmf_vs_tlv *wpa_ie, | |||
| 3091 | 3091 | ||
| 3092 | len = wpa_ie->len + TLV_HDR_LEN; | 3092 | len = wpa_ie->len + TLV_HDR_LEN; |
| 3093 | data = (u8 *)wpa_ie; | 3093 | data = (u8 *)wpa_ie; |
| 3094 | offset = 0; | 3094 | offset = TLV_HDR_LEN; |
| 3095 | if (!is_rsn_ie) | 3095 | if (!is_rsn_ie) |
| 3096 | offset += VS_IE_FIXED_HDR_LEN; | 3096 | offset += VS_IE_FIXED_HDR_LEN; |
| 3097 | offset += WPA_IE_VERSION_LEN; | 3097 | else |
| 3098 | offset += WPA_IE_VERSION_LEN; | ||
| 3098 | 3099 | ||
| 3099 | /* check for multicast cipher suite */ | 3100 | /* check for multicast cipher suite */ |
| 3100 | if (offset + WPA_IE_MIN_OUI_LEN > len) { | 3101 | if (offset + WPA_IE_MIN_OUI_LEN > len) { |
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/debug.h b/drivers/net/wireless/brcm80211/brcmsmac/debug.h index 796836b0f469..822781cf15d4 100644 --- a/drivers/net/wireless/brcm80211/brcmsmac/debug.h +++ b/drivers/net/wireless/brcm80211/brcmsmac/debug.h | |||
| @@ -1,5 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (c) 2012 Broadcom Corporation | 2 | * Copyright (c) 2012 Broadcom Corporation |
| 3 | * Copyright (c) 2012 Canonical Ltd. | ||
| 3 | * | 4 | * |
| 4 | * Permission to use, copy, modify, and/or distribute this software for any | 5 | * Permission to use, copy, modify, and/or distribute this software for any |
| 5 | * purpose with or without fee is hereby granted, provided that the above | 6 | * purpose with or without fee is hereby granted, provided that the above |
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_lcn.c b/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_lcn.c index 606b534347bc..21a824232478 100644 --- a/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_lcn.c +++ b/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_lcn.c | |||
| @@ -1343,13 +1343,13 @@ static bool wlc_lcnphy_rx_iq_cal_gain(struct brcms_phy *pi, u16 biq1_gain, | |||
| 1343 | 1343 | ||
| 1344 | wlc_lcnphy_rx_gain_override_enable(pi, true); | 1344 | wlc_lcnphy_rx_gain_override_enable(pi, true); |
| 1345 | wlc_lcnphy_start_tx_tone(pi, 2000, (40 >> 1), 0); | 1345 | wlc_lcnphy_start_tx_tone(pi, 2000, (40 >> 1), 0); |
| 1346 | usleep_range(500, 500); | 1346 | udelay(500); |
| 1347 | write_radio_reg(pi, RADIO_2064_REG112, 0); | 1347 | write_radio_reg(pi, RADIO_2064_REG112, 0); |
| 1348 | if (!wlc_lcnphy_rx_iq_est(pi, 1024, 32, &iq_est_l)) | 1348 | if (!wlc_lcnphy_rx_iq_est(pi, 1024, 32, &iq_est_l)) |
| 1349 | return false; | 1349 | return false; |
| 1350 | 1350 | ||
| 1351 | wlc_lcnphy_start_tx_tone(pi, 2000, 40, 0); | 1351 | wlc_lcnphy_start_tx_tone(pi, 2000, 40, 0); |
| 1352 | usleep_range(500, 500); | 1352 | udelay(500); |
| 1353 | write_radio_reg(pi, RADIO_2064_REG112, 0); | 1353 | write_radio_reg(pi, RADIO_2064_REG112, 0); |
| 1354 | if (!wlc_lcnphy_rx_iq_est(pi, 1024, 32, &iq_est_h)) | 1354 | if (!wlc_lcnphy_rx_iq_est(pi, 1024, 32, &iq_est_h)) |
| 1355 | return false; | 1355 | return false; |
diff --git a/drivers/net/wireless/p54/p54usb.c b/drivers/net/wireless/p54/p54usb.c index e71c702e2eb1..800a16526c8e 100644 --- a/drivers/net/wireless/p54/p54usb.c +++ b/drivers/net/wireless/p54/p54usb.c | |||
| @@ -47,6 +47,7 @@ static struct usb_device_id p54u_table[] = { | |||
| 47 | {USB_DEVICE(0x0411, 0x0050)}, /* Buffalo WLI2-USB2-G54 */ | 47 | {USB_DEVICE(0x0411, 0x0050)}, /* Buffalo WLI2-USB2-G54 */ |
| 48 | {USB_DEVICE(0x045e, 0x00c2)}, /* Microsoft MN-710 */ | 48 | {USB_DEVICE(0x045e, 0x00c2)}, /* Microsoft MN-710 */ |
| 49 | {USB_DEVICE(0x0506, 0x0a11)}, /* 3COM 3CRWE254G72 */ | 49 | {USB_DEVICE(0x0506, 0x0a11)}, /* 3COM 3CRWE254G72 */ |
| 50 | {USB_DEVICE(0x0675, 0x0530)}, /* DrayTek Vigor 530 */ | ||
| 50 | {USB_DEVICE(0x06b9, 0x0120)}, /* Thomson SpeedTouch 120g */ | 51 | {USB_DEVICE(0x06b9, 0x0120)}, /* Thomson SpeedTouch 120g */ |
| 51 | {USB_DEVICE(0x0707, 0xee06)}, /* SMC 2862W-G */ | 52 | {USB_DEVICE(0x0707, 0xee06)}, /* SMC 2862W-G */ |
| 52 | {USB_DEVICE(0x07aa, 0x001c)}, /* Corega CG-WLUSB2GT */ | 53 | {USB_DEVICE(0x07aa, 0x001c)}, /* Corega CG-WLUSB2GT */ |
| @@ -82,6 +83,8 @@ static struct usb_device_id p54u_table[] = { | |||
| 82 | {USB_DEVICE(0x06a9, 0x000e)}, /* Westell 802.11g USB (A90-211WG-01) */ | 83 | {USB_DEVICE(0x06a9, 0x000e)}, /* Westell 802.11g USB (A90-211WG-01) */ |
| 83 | {USB_DEVICE(0x06b9, 0x0121)}, /* Thomson SpeedTouch 121g */ | 84 | {USB_DEVICE(0x06b9, 0x0121)}, /* Thomson SpeedTouch 121g */ |
| 84 | {USB_DEVICE(0x0707, 0xee13)}, /* SMC 2862W-G version 2 */ | 85 | {USB_DEVICE(0x0707, 0xee13)}, /* SMC 2862W-G version 2 */ |
| 86 | {USB_DEVICE(0x0803, 0x4310)}, /* Zoom 4410a */ | ||
| 87 | {USB_DEVICE(0x083a, 0x4503)}, /* T-Com Sinus 154 data II */ | ||
| 85 | {USB_DEVICE(0x083a, 0x4521)}, /* Siemens Gigaset USB Adapter 54 version 2 */ | 88 | {USB_DEVICE(0x083a, 0x4521)}, /* Siemens Gigaset USB Adapter 54 version 2 */ |
| 86 | {USB_DEVICE(0x083a, 0xc501)}, /* Zoom Wireless-G 4410 */ | 89 | {USB_DEVICE(0x083a, 0xc501)}, /* Zoom Wireless-G 4410 */ |
| 87 | {USB_DEVICE(0x083a, 0xf503)}, /* Accton FD7050E ver 1010ec */ | 90 | {USB_DEVICE(0x083a, 0xf503)}, /* Accton FD7050E ver 1010ec */ |
| @@ -101,6 +104,7 @@ static struct usb_device_id p54u_table[] = { | |||
| 101 | {USB_DEVICE(0x13B1, 0x000C)}, /* Linksys WUSB54AG */ | 104 | {USB_DEVICE(0x13B1, 0x000C)}, /* Linksys WUSB54AG */ |
| 102 | {USB_DEVICE(0x1413, 0x5400)}, /* Telsey 802.11g USB2.0 Adapter */ | 105 | {USB_DEVICE(0x1413, 0x5400)}, /* Telsey 802.11g USB2.0 Adapter */ |
| 103 | {USB_DEVICE(0x1435, 0x0427)}, /* Inventel UR054G */ | 106 | {USB_DEVICE(0x1435, 0x0427)}, /* Inventel UR054G */ |
| 107 | /* {USB_DEVICE(0x15a9, 0x0002)}, * Also SparkLAN WL-682 with 3887 */ | ||
| 104 | {USB_DEVICE(0x1668, 0x1050)}, /* Actiontec 802UIG-1 */ | 108 | {USB_DEVICE(0x1668, 0x1050)}, /* Actiontec 802UIG-1 */ |
| 105 | {USB_DEVICE(0x1740, 0x1000)}, /* Senao NUB-350 */ | 109 | {USB_DEVICE(0x1740, 0x1000)}, /* Senao NUB-350 */ |
| 106 | {USB_DEVICE(0x2001, 0x3704)}, /* DLink DWL-G122 rev A2 */ | 110 | {USB_DEVICE(0x2001, 0x3704)}, /* DLink DWL-G122 rev A2 */ |
diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c index 3deacafdcd5e..4261e8ecc4c3 100644 --- a/drivers/net/wireless/rtlwifi/pci.c +++ b/drivers/net/wireless/rtlwifi/pci.c | |||
| @@ -743,6 +743,8 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw) | |||
| 743 | 743 | ||
| 744 | done: | 744 | done: |
| 745 | bufferaddress = (*((dma_addr_t *)skb->cb)); | 745 | bufferaddress = (*((dma_addr_t *)skb->cb)); |
| 746 | if (pci_dma_mapping_error(rtlpci->pdev, bufferaddress)) | ||
| 747 | return; | ||
| 746 | tmp_one = 1; | 748 | tmp_one = 1; |
| 747 | rtlpriv->cfg->ops->set_desc((u8 *) pdesc, false, | 749 | rtlpriv->cfg->ops->set_desc((u8 *) pdesc, false, |
| 748 | HW_DESC_RXBUFF_ADDR, | 750 | HW_DESC_RXBUFF_ADDR, |
| @@ -1115,6 +1117,10 @@ static int _rtl_pci_init_rx_ring(struct ieee80211_hw *hw) | |||
| 1115 | PCI_DMA_FROMDEVICE); | 1117 | PCI_DMA_FROMDEVICE); |
| 1116 | 1118 | ||
| 1117 | bufferaddress = (*((dma_addr_t *)skb->cb)); | 1119 | bufferaddress = (*((dma_addr_t *)skb->cb)); |
| 1120 | if (pci_dma_mapping_error(rtlpci->pdev, bufferaddress)) { | ||
| 1121 | dev_kfree_skb_any(skb); | ||
| 1122 | return 1; | ||
| 1123 | } | ||
| 1118 | rtlpriv->cfg->ops->set_desc((u8 *)entry, false, | 1124 | rtlpriv->cfg->ops->set_desc((u8 *)entry, false, |
| 1119 | HW_DESC_RXBUFF_ADDR, | 1125 | HW_DESC_RXBUFF_ADDR, |
| 1120 | (u8 *)&bufferaddress); | 1126 | (u8 *)&bufferaddress); |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c b/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c index 173424756149..c31795e379f7 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c +++ b/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c | |||
| @@ -611,8 +611,14 @@ void rtl92ce_tx_fill_desc(struct ieee80211_hw *hw, | |||
| 611 | dma_addr_t mapping = pci_map_single(rtlpci->pdev, | 611 | dma_addr_t mapping = pci_map_single(rtlpci->pdev, |
| 612 | skb->data, skb->len, | 612 | skb->data, skb->len, |
| 613 | PCI_DMA_TODEVICE); | 613 | PCI_DMA_TODEVICE); |
| 614 | |||
| 614 | u8 bw_40 = 0; | 615 | u8 bw_40 = 0; |
| 615 | 616 | ||
| 617 | if (pci_dma_mapping_error(rtlpci->pdev, mapping)) { | ||
| 618 | RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE, | ||
| 619 | "DMA mapping error"); | ||
| 620 | return; | ||
| 621 | } | ||
| 616 | rcu_read_lock(); | 622 | rcu_read_lock(); |
| 617 | sta = get_sta(hw, mac->vif, mac->bssid); | 623 | sta = get_sta(hw, mac->vif, mac->bssid); |
| 618 | if (mac->opmode == NL80211_IFTYPE_STATION) { | 624 | if (mac->opmode == NL80211_IFTYPE_STATION) { |
| @@ -774,6 +780,11 @@ void rtl92ce_tx_fill_cmddesc(struct ieee80211_hw *hw, | |||
| 774 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)(skb->data); | 780 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)(skb->data); |
| 775 | __le16 fc = hdr->frame_control; | 781 | __le16 fc = hdr->frame_control; |
| 776 | 782 | ||
| 783 | if (pci_dma_mapping_error(rtlpci->pdev, mapping)) { | ||
| 784 | RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE, | ||
| 785 | "DMA mapping error"); | ||
| 786 | return; | ||
| 787 | } | ||
| 777 | CLEAR_PCI_TX_DESC_CONTENT(pdesc, TX_DESC_SIZE); | 788 | CLEAR_PCI_TX_DESC_CONTENT(pdesc, TX_DESC_SIZE); |
| 778 | 789 | ||
| 779 | if (firstseg) | 790 | if (firstseg) |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192de/trx.c b/drivers/net/wireless/rtlwifi/rtl8192de/trx.c index f9f3861046c1..a0fbf284420e 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192de/trx.c +++ b/drivers/net/wireless/rtlwifi/rtl8192de/trx.c | |||
| @@ -587,6 +587,11 @@ void rtl92de_tx_fill_desc(struct ieee80211_hw *hw, | |||
| 587 | buf_len = skb->len; | 587 | buf_len = skb->len; |
| 588 | mapping = pci_map_single(rtlpci->pdev, skb->data, skb->len, | 588 | mapping = pci_map_single(rtlpci->pdev, skb->data, skb->len, |
| 589 | PCI_DMA_TODEVICE); | 589 | PCI_DMA_TODEVICE); |
| 590 | if (pci_dma_mapping_error(rtlpci->pdev, mapping)) { | ||
| 591 | RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE, | ||
| 592 | "DMA mapping error"); | ||
| 593 | return; | ||
| 594 | } | ||
| 590 | CLEAR_PCI_TX_DESC_CONTENT(pdesc, sizeof(struct tx_desc_92d)); | 595 | CLEAR_PCI_TX_DESC_CONTENT(pdesc, sizeof(struct tx_desc_92d)); |
| 591 | if (ieee80211_is_nullfunc(fc) || ieee80211_is_ctl(fc)) { | 596 | if (ieee80211_is_nullfunc(fc) || ieee80211_is_ctl(fc)) { |
| 592 | firstseg = true; | 597 | firstseg = true; |
| @@ -740,6 +745,11 @@ void rtl92de_tx_fill_cmddesc(struct ieee80211_hw *hw, | |||
| 740 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)(skb->data); | 745 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)(skb->data); |
| 741 | __le16 fc = hdr->frame_control; | 746 | __le16 fc = hdr->frame_control; |
| 742 | 747 | ||
| 748 | if (pci_dma_mapping_error(rtlpci->pdev, mapping)) { | ||
| 749 | RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE, | ||
| 750 | "DMA mapping error"); | ||
| 751 | return; | ||
| 752 | } | ||
| 743 | CLEAR_PCI_TX_DESC_CONTENT(pdesc, TX_DESC_SIZE); | 753 | CLEAR_PCI_TX_DESC_CONTENT(pdesc, TX_DESC_SIZE); |
| 744 | if (firstseg) | 754 | if (firstseg) |
| 745 | SET_TX_DESC_OFFSET(pdesc, USB_HWDESC_HEADER_LEN); | 755 | SET_TX_DESC_OFFSET(pdesc, USB_HWDESC_HEADER_LEN); |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/trx.c b/drivers/net/wireless/rtlwifi/rtl8192se/trx.c index 0e9f6ebf078a..206561d7282f 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192se/trx.c +++ b/drivers/net/wireless/rtlwifi/rtl8192se/trx.c | |||
| @@ -611,6 +611,11 @@ void rtl92se_tx_fill_desc(struct ieee80211_hw *hw, | |||
| 611 | PCI_DMA_TODEVICE); | 611 | PCI_DMA_TODEVICE); |
| 612 | u8 bw_40 = 0; | 612 | u8 bw_40 = 0; |
| 613 | 613 | ||
| 614 | if (pci_dma_mapping_error(rtlpci->pdev, mapping)) { | ||
| 615 | RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE, | ||
| 616 | "DMA mapping error"); | ||
| 617 | return; | ||
| 618 | } | ||
| 614 | if (mac->opmode == NL80211_IFTYPE_STATION) { | 619 | if (mac->opmode == NL80211_IFTYPE_STATION) { |
| 615 | bw_40 = mac->bw_40; | 620 | bw_40 = mac->bw_40; |
| 616 | } else if (mac->opmode == NL80211_IFTYPE_AP || | 621 | } else if (mac->opmode == NL80211_IFTYPE_AP || |
| @@ -763,6 +768,7 @@ void rtl92se_tx_fill_desc(struct ieee80211_hw *hw, | |||
| 763 | void rtl92se_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc, | 768 | void rtl92se_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc, |
| 764 | bool firstseg, bool lastseg, struct sk_buff *skb) | 769 | bool firstseg, bool lastseg, struct sk_buff *skb) |
| 765 | { | 770 | { |
| 771 | struct rtl_priv *rtlpriv = rtl_priv(hw); | ||
| 766 | struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); | 772 | struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); |
| 767 | struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); | 773 | struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); |
| 768 | struct rtl_tcb_desc *tcb_desc = (struct rtl_tcb_desc *)(skb->cb); | 774 | struct rtl_tcb_desc *tcb_desc = (struct rtl_tcb_desc *)(skb->cb); |
| @@ -770,7 +776,12 @@ void rtl92se_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc, | |||
| 770 | dma_addr_t mapping = pci_map_single(rtlpci->pdev, skb->data, skb->len, | 776 | dma_addr_t mapping = pci_map_single(rtlpci->pdev, skb->data, skb->len, |
| 771 | PCI_DMA_TODEVICE); | 777 | PCI_DMA_TODEVICE); |
| 772 | 778 | ||
| 773 | /* Clear all status */ | 779 | if (pci_dma_mapping_error(rtlpci->pdev, mapping)) { |
| 780 | RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE, | ||
| 781 | "DMA mapping error"); | ||
| 782 | return; | ||
| 783 | } | ||
| 784 | /* Clear all status */ | ||
| 774 | CLEAR_PCI_TX_DESC_CONTENT(pdesc, TX_CMDDESC_SIZE_RTL8192S); | 785 | CLEAR_PCI_TX_DESC_CONTENT(pdesc, TX_CMDDESC_SIZE_RTL8192S); |
| 775 | 786 | ||
| 776 | /* This bit indicate this packet is used for FW download. */ | 787 | /* This bit indicate this packet is used for FW download. */ |
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c b/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c index 87331d826d73..a313be8c21d2 100644 --- a/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c +++ b/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c | |||
| @@ -387,6 +387,11 @@ void rtl8723ae_tx_fill_desc(struct ieee80211_hw *hw, | |||
| 387 | PCI_DMA_TODEVICE); | 387 | PCI_DMA_TODEVICE); |
| 388 | u8 bw_40 = 0; | 388 | u8 bw_40 = 0; |
| 389 | 389 | ||
| 390 | if (pci_dma_mapping_error(rtlpci->pdev, mapping)) { | ||
| 391 | RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE, | ||
| 392 | "DMA mapping error"); | ||
| 393 | return; | ||
| 394 | } | ||
| 390 | if (mac->opmode == NL80211_IFTYPE_STATION) { | 395 | if (mac->opmode == NL80211_IFTYPE_STATION) { |
| 391 | bw_40 = mac->bw_40; | 396 | bw_40 = mac->bw_40; |
| 392 | } else if (mac->opmode == NL80211_IFTYPE_AP || | 397 | } else if (mac->opmode == NL80211_IFTYPE_AP || |
| @@ -542,6 +547,11 @@ void rtl8723ae_tx_fill_cmddesc(struct ieee80211_hw *hw, | |||
| 542 | PCI_DMA_TODEVICE); | 547 | PCI_DMA_TODEVICE); |
| 543 | __le16 fc = hdr->frame_control; | 548 | __le16 fc = hdr->frame_control; |
| 544 | 549 | ||
| 550 | if (pci_dma_mapping_error(rtlpci->pdev, mapping)) { | ||
| 551 | RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE, | ||
| 552 | "DMA mapping error"); | ||
| 553 | return; | ||
| 554 | } | ||
| 545 | CLEAR_PCI_TX_DESC_CONTENT(pdesc, TX_DESC_SIZE); | 555 | CLEAR_PCI_TX_DESC_CONTENT(pdesc, TX_DESC_SIZE); |
| 546 | 556 | ||
| 547 | if (firstseg) | 557 | if (firstseg) |
diff --git a/drivers/net/wireless/rtlwifi/usb.c b/drivers/net/wireless/rtlwifi/usb.c index 29f0969e4ba0..f2ecdeb3a90d 100644 --- a/drivers/net/wireless/rtlwifi/usb.c +++ b/drivers/net/wireless/rtlwifi/usb.c | |||
| @@ -210,17 +210,16 @@ static void _usb_writeN_sync(struct rtl_priv *rtlpriv, u32 addr, void *data, | |||
| 210 | u16 index = REALTEK_USB_VENQT_CMD_IDX; | 210 | u16 index = REALTEK_USB_VENQT_CMD_IDX; |
| 211 | int pipe = usb_sndctrlpipe(udev, 0); /* write_out */ | 211 | int pipe = usb_sndctrlpipe(udev, 0); /* write_out */ |
| 212 | u8 *buffer; | 212 | u8 *buffer; |
| 213 | dma_addr_t dma_addr; | ||
| 214 | 213 | ||
| 215 | wvalue = (u16)(addr&0x0000ffff); | 214 | wvalue = (u16)(addr & 0x0000ffff); |
| 216 | buffer = usb_alloc_coherent(udev, (size_t)len, GFP_ATOMIC, &dma_addr); | 215 | buffer = kmalloc(len, GFP_ATOMIC); |
| 217 | if (!buffer) | 216 | if (!buffer) |
| 218 | return; | 217 | return; |
| 219 | memcpy(buffer, data, len); | 218 | memcpy(buffer, data, len); |
| 220 | usb_control_msg(udev, pipe, request, reqtype, wvalue, | 219 | usb_control_msg(udev, pipe, request, reqtype, wvalue, |
| 221 | index, buffer, len, 50); | 220 | index, buffer, len, 50); |
| 222 | 221 | ||
| 223 | usb_free_coherent(udev, (size_t)len, buffer, dma_addr); | 222 | kfree(buffer); |
| 224 | } | 223 | } |
| 225 | 224 | ||
| 226 | static void _rtl_usb_io_handler_init(struct device *dev, | 225 | static void _rtl_usb_io_handler_init(struct device *dev, |
| @@ -640,6 +639,7 @@ static int _rtl_usb_receive(struct ieee80211_hw *hw) | |||
| 640 | RT_TRACE(rtlpriv, COMP_USB, DBG_EMERG, | 639 | RT_TRACE(rtlpriv, COMP_USB, DBG_EMERG, |
| 641 | "Failed to prep_rx_urb!!\n"); | 640 | "Failed to prep_rx_urb!!\n"); |
| 642 | err = PTR_ERR(skb); | 641 | err = PTR_ERR(skb); |
| 642 | usb_free_urb(urb); | ||
| 643 | goto err_out; | 643 | goto err_out; |
| 644 | } | 644 | } |
| 645 | 645 | ||
diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c index c26e28b4bd9f..7ffa43bd7cf9 100644 --- a/drivers/net/xen-netfront.c +++ b/drivers/net/xen-netfront.c | |||
| @@ -1015,29 +1015,10 @@ err: | |||
| 1015 | i = xennet_fill_frags(np, skb, &tmpq); | 1015 | i = xennet_fill_frags(np, skb, &tmpq); |
| 1016 | 1016 | ||
| 1017 | /* | 1017 | /* |
| 1018 | * Truesize approximates the size of true data plus | 1018 | * Truesize is the actual allocation size, even if the |
| 1019 | * any supervisor overheads. Adding hypervisor | 1019 | * allocation is only partially used. |
| 1020 | * overheads has been shown to significantly reduce | 1020 | */ |
| 1021 | * achievable bandwidth with the default receive | 1021 | skb->truesize += PAGE_SIZE * skb_shinfo(skb)->nr_frags; |
| 1022 | * buffer size. It is therefore not wise to account | ||
| 1023 | * for it here. | ||
| 1024 | * | ||
| 1025 | * After alloc_skb(RX_COPY_THRESHOLD), truesize is set | ||
| 1026 | * to RX_COPY_THRESHOLD + the supervisor | ||
| 1027 | * overheads. Here, we add the size of the data pulled | ||
| 1028 | * in xennet_fill_frags(). | ||
| 1029 | * | ||
| 1030 | * We also adjust for any unused space in the main | ||
| 1031 | * data area by subtracting (RX_COPY_THRESHOLD - | ||
| 1032 | * len). This is especially important with drivers | ||
| 1033 | * which split incoming packets into header and data, | ||
| 1034 | * using only 66 bytes of the main data area (see the | ||
| 1035 | * e1000 driver for example.) On such systems, | ||
| 1036 | * without this last adjustement, our achievable | ||
| 1037 | * receive throughout using the standard receive | ||
| 1038 | * buffer size was cut by 25%(!!!). | ||
| 1039 | */ | ||
| 1040 | skb->truesize += skb->data_len - RX_COPY_THRESHOLD; | ||
| 1041 | skb->len += skb->data_len; | 1022 | skb->len += skb->data_len; |
| 1042 | 1023 | ||
| 1043 | if (rx->flags & XEN_NETRXF_csum_blank) | 1024 | if (rx->flags & XEN_NETRXF_csum_blank) |
diff --git a/drivers/pinctrl/mvebu/pinctrl-dove.c b/drivers/pinctrl/mvebu/pinctrl-dove.c index 750dea78f53a..69aba3697287 100644 --- a/drivers/pinctrl/mvebu/pinctrl-dove.c +++ b/drivers/pinctrl/mvebu/pinctrl-dove.c | |||
| @@ -595,8 +595,11 @@ static int dove_pinctrl_probe(struct platform_device *pdev) | |||
| 595 | * grab clk to make sure it is ticking. | 595 | * grab clk to make sure it is ticking. |
| 596 | */ | 596 | */ |
| 597 | clk = devm_clk_get(&pdev->dev, NULL); | 597 | clk = devm_clk_get(&pdev->dev, NULL); |
| 598 | if (!IS_ERR(clk)) | 598 | if (IS_ERR(clk)) { |
| 599 | clk_prepare_enable(clk); | 599 | dev_err(&pdev->dev, "Unable to get pdma clock"); |
| 600 | return PTR_RET(clk); | ||
| 601 | } | ||
| 602 | clk_prepare_enable(clk); | ||
| 600 | 603 | ||
| 601 | return mvebu_pinctrl_probe(pdev); | 604 | return mvebu_pinctrl_probe(pdev); |
| 602 | } | 605 | } |
diff --git a/drivers/pnp/interface.c b/drivers/pnp/interface.c index cfaf5b73540b..0c201317284b 100644 --- a/drivers/pnp/interface.c +++ b/drivers/pnp/interface.c | |||
| @@ -298,6 +298,39 @@ static ssize_t pnp_show_current_resources(struct device *dmdev, | |||
| 298 | return ret; | 298 | return ret; |
| 299 | } | 299 | } |
| 300 | 300 | ||
| 301 | static char *pnp_get_resource_value(char *buf, | ||
| 302 | unsigned long type, | ||
| 303 | resource_size_t *start, | ||
| 304 | resource_size_t *end, | ||
| 305 | unsigned long *flags) | ||
| 306 | { | ||
| 307 | if (start) | ||
| 308 | *start = 0; | ||
| 309 | if (end) | ||
| 310 | *end = 0; | ||
| 311 | if (flags) | ||
| 312 | *flags = 0; | ||
| 313 | |||
| 314 | /* TBD: allow for disabled resources */ | ||
| 315 | |||
| 316 | buf = skip_spaces(buf); | ||
| 317 | if (start) { | ||
| 318 | *start = simple_strtoull(buf, &buf, 0); | ||
| 319 | if (end) { | ||
| 320 | buf = skip_spaces(buf); | ||
| 321 | if (*buf == '-') { | ||
| 322 | buf = skip_spaces(buf + 1); | ||
| 323 | *end = simple_strtoull(buf, &buf, 0); | ||
| 324 | } else | ||
| 325 | *end = *start; | ||
| 326 | } | ||
| 327 | } | ||
| 328 | |||
| 329 | /* TBD: allow for additional flags, e.g., IORESOURCE_WINDOW */ | ||
| 330 | |||
| 331 | return buf; | ||
| 332 | } | ||
| 333 | |||
| 301 | static ssize_t pnp_set_current_resources(struct device *dmdev, | 334 | static ssize_t pnp_set_current_resources(struct device *dmdev, |
| 302 | struct device_attribute *attr, | 335 | struct device_attribute *attr, |
| 303 | const char *ubuf, size_t count) | 336 | const char *ubuf, size_t count) |
| @@ -305,7 +338,6 @@ static ssize_t pnp_set_current_resources(struct device *dmdev, | |||
| 305 | struct pnp_dev *dev = to_pnp_dev(dmdev); | 338 | struct pnp_dev *dev = to_pnp_dev(dmdev); |
| 306 | char *buf = (void *)ubuf; | 339 | char *buf = (void *)ubuf; |
| 307 | int retval = 0; | 340 | int retval = 0; |
| 308 | resource_size_t start, end; | ||
| 309 | 341 | ||
| 310 | if (dev->status & PNP_ATTACHED) { | 342 | if (dev->status & PNP_ATTACHED) { |
| 311 | retval = -EBUSY; | 343 | retval = -EBUSY; |
| @@ -349,6 +381,10 @@ static ssize_t pnp_set_current_resources(struct device *dmdev, | |||
| 349 | goto done; | 381 | goto done; |
| 350 | } | 382 | } |
| 351 | if (!strnicmp(buf, "set", 3)) { | 383 | if (!strnicmp(buf, "set", 3)) { |
| 384 | resource_size_t start; | ||
| 385 | resource_size_t end; | ||
| 386 | unsigned long flags; | ||
| 387 | |||
| 352 | if (dev->active) | 388 | if (dev->active) |
| 353 | goto done; | 389 | goto done; |
| 354 | buf += 3; | 390 | buf += 3; |
| @@ -357,42 +393,37 @@ static ssize_t pnp_set_current_resources(struct device *dmdev, | |||
| 357 | while (1) { | 393 | while (1) { |
| 358 | buf = skip_spaces(buf); | 394 | buf = skip_spaces(buf); |
| 359 | if (!strnicmp(buf, "io", 2)) { | 395 | if (!strnicmp(buf, "io", 2)) { |
| 360 | buf = skip_spaces(buf + 2); | 396 | buf = pnp_get_resource_value(buf + 2, |
| 361 | start = simple_strtoul(buf, &buf, 0); | 397 | IORESOURCE_IO, |
| 362 | buf = skip_spaces(buf); | 398 | &start, &end, |
| 363 | if (*buf == '-') { | 399 | &flags); |
| 364 | buf = skip_spaces(buf + 1); | 400 | pnp_add_io_resource(dev, start, end, flags); |
| 365 | end = simple_strtoul(buf, &buf, 0); | 401 | } else if (!strnicmp(buf, "mem", 3)) { |
| 366 | } else | 402 | buf = pnp_get_resource_value(buf + 3, |
| 367 | end = start; | 403 | IORESOURCE_MEM, |
| 368 | pnp_add_io_resource(dev, start, end, 0); | 404 | &start, &end, |
| 369 | continue; | 405 | &flags); |
| 370 | } | 406 | pnp_add_mem_resource(dev, start, end, flags); |
| 371 | if (!strnicmp(buf, "mem", 3)) { | 407 | } else if (!strnicmp(buf, "irq", 3)) { |
| 372 | buf = skip_spaces(buf + 3); | 408 | buf = pnp_get_resource_value(buf + 3, |
| 373 | start = simple_strtoul(buf, &buf, 0); | 409 | IORESOURCE_IRQ, |
| 374 | buf = skip_spaces(buf); | 410 | &start, NULL, |
| 375 | if (*buf == '-') { | 411 | &flags); |
| 376 | buf = skip_spaces(buf + 1); | 412 | pnp_add_irq_resource(dev, start, flags); |
| 377 | end = simple_strtoul(buf, &buf, 0); | 413 | } else if (!strnicmp(buf, "dma", 3)) { |
| 378 | } else | 414 | buf = pnp_get_resource_value(buf + 3, |
| 379 | end = start; | 415 | IORESOURCE_DMA, |
| 380 | pnp_add_mem_resource(dev, start, end, 0); | 416 | &start, NULL, |
| 381 | continue; | 417 | &flags); |
| 382 | } | 418 | pnp_add_dma_resource(dev, start, flags); |
| 383 | if (!strnicmp(buf, "irq", 3)) { | 419 | } else if (!strnicmp(buf, "bus", 3)) { |
| 384 | buf = skip_spaces(buf + 3); | 420 | buf = pnp_get_resource_value(buf + 3, |
| 385 | start = simple_strtoul(buf, &buf, 0); | 421 | IORESOURCE_BUS, |
| 386 | pnp_add_irq_resource(dev, start, 0); | 422 | &start, &end, |
| 387 | continue; | 423 | NULL); |
| 388 | } | 424 | pnp_add_bus_resource(dev, start, end); |
| 389 | if (!strnicmp(buf, "dma", 3)) { | 425 | } else |
| 390 | buf = skip_spaces(buf + 3); | 426 | break; |
| 391 | start = simple_strtoul(buf, &buf, 0); | ||
| 392 | pnp_add_dma_resource(dev, start, 0); | ||
| 393 | continue; | ||
| 394 | } | ||
| 395 | break; | ||
| 396 | } | 427 | } |
| 397 | mutex_unlock(&pnp_res_mutex); | 428 | mutex_unlock(&pnp_res_mutex); |
| 398 | goto done; | 429 | goto done; |
diff --git a/drivers/pnp/manager.c b/drivers/pnp/manager.c index ed9ce507149a..95cebf0185de 100644 --- a/drivers/pnp/manager.c +++ b/drivers/pnp/manager.c | |||
| @@ -18,11 +18,27 @@ | |||
| 18 | 18 | ||
| 19 | DEFINE_MUTEX(pnp_res_mutex); | 19 | DEFINE_MUTEX(pnp_res_mutex); |
| 20 | 20 | ||
| 21 | static struct resource *pnp_find_resource(struct pnp_dev *dev, | ||
| 22 | unsigned char rule, | ||
| 23 | unsigned long type, | ||
| 24 | unsigned int bar) | ||
| 25 | { | ||
| 26 | struct resource *res = pnp_get_resource(dev, type, bar); | ||
| 27 | |||
| 28 | /* when the resource already exists, set its resource bits from rule */ | ||
| 29 | if (res) { | ||
| 30 | res->flags &= ~IORESOURCE_BITS; | ||
| 31 | res->flags |= rule & IORESOURCE_BITS; | ||
| 32 | } | ||
| 33 | |||
| 34 | return res; | ||
| 35 | } | ||
| 36 | |||
| 21 | static int pnp_assign_port(struct pnp_dev *dev, struct pnp_port *rule, int idx) | 37 | static int pnp_assign_port(struct pnp_dev *dev, struct pnp_port *rule, int idx) |
| 22 | { | 38 | { |
| 23 | struct resource *res, local_res; | 39 | struct resource *res, local_res; |
| 24 | 40 | ||
| 25 | res = pnp_get_resource(dev, IORESOURCE_IO, idx); | 41 | res = pnp_find_resource(dev, rule->flags, IORESOURCE_IO, idx); |
| 26 | if (res) { | 42 | if (res) { |
| 27 | pnp_dbg(&dev->dev, " io %d already set to %#llx-%#llx " | 43 | pnp_dbg(&dev->dev, " io %d already set to %#llx-%#llx " |
| 28 | "flags %#lx\n", idx, (unsigned long long) res->start, | 44 | "flags %#lx\n", idx, (unsigned long long) res->start, |
| @@ -65,7 +81,7 @@ static int pnp_assign_mem(struct pnp_dev *dev, struct pnp_mem *rule, int idx) | |||
| 65 | { | 81 | { |
| 66 | struct resource *res, local_res; | 82 | struct resource *res, local_res; |
| 67 | 83 | ||
| 68 | res = pnp_get_resource(dev, IORESOURCE_MEM, idx); | 84 | res = pnp_find_resource(dev, rule->flags, IORESOURCE_MEM, idx); |
| 69 | if (res) { | 85 | if (res) { |
| 70 | pnp_dbg(&dev->dev, " mem %d already set to %#llx-%#llx " | 86 | pnp_dbg(&dev->dev, " mem %d already set to %#llx-%#llx " |
| 71 | "flags %#lx\n", idx, (unsigned long long) res->start, | 87 | "flags %#lx\n", idx, (unsigned long long) res->start, |
| @@ -78,6 +94,7 @@ static int pnp_assign_mem(struct pnp_dev *dev, struct pnp_mem *rule, int idx) | |||
| 78 | res->start = 0; | 94 | res->start = 0; |
| 79 | res->end = 0; | 95 | res->end = 0; |
| 80 | 96 | ||
| 97 | /* ??? rule->flags restricted to 8 bits, all tests bogus ??? */ | ||
| 81 | if (!(rule->flags & IORESOURCE_MEM_WRITEABLE)) | 98 | if (!(rule->flags & IORESOURCE_MEM_WRITEABLE)) |
| 82 | res->flags |= IORESOURCE_READONLY; | 99 | res->flags |= IORESOURCE_READONLY; |
| 83 | if (rule->flags & IORESOURCE_MEM_CACHEABLE) | 100 | if (rule->flags & IORESOURCE_MEM_CACHEABLE) |
| @@ -123,7 +140,7 @@ static int pnp_assign_irq(struct pnp_dev *dev, struct pnp_irq *rule, int idx) | |||
| 123 | 5, 10, 11, 12, 9, 14, 15, 7, 3, 4, 13, 0, 1, 6, 8, 2 | 140 | 5, 10, 11, 12, 9, 14, 15, 7, 3, 4, 13, 0, 1, 6, 8, 2 |
| 124 | }; | 141 | }; |
| 125 | 142 | ||
| 126 | res = pnp_get_resource(dev, IORESOURCE_IRQ, idx); | 143 | res = pnp_find_resource(dev, rule->flags, IORESOURCE_IRQ, idx); |
| 127 | if (res) { | 144 | if (res) { |
| 128 | pnp_dbg(&dev->dev, " irq %d already set to %d flags %#lx\n", | 145 | pnp_dbg(&dev->dev, " irq %d already set to %d flags %#lx\n", |
| 129 | idx, (int) res->start, res->flags); | 146 | idx, (int) res->start, res->flags); |
| @@ -182,7 +199,7 @@ static int pnp_assign_dma(struct pnp_dev *dev, struct pnp_dma *rule, int idx) | |||
| 182 | 1, 3, 5, 6, 7, 0, 2, 4 | 199 | 1, 3, 5, 6, 7, 0, 2, 4 |
| 183 | }; | 200 | }; |
| 184 | 201 | ||
| 185 | res = pnp_get_resource(dev, IORESOURCE_DMA, idx); | 202 | res = pnp_find_resource(dev, rule->flags, IORESOURCE_DMA, idx); |
| 186 | if (res) { | 203 | if (res) { |
| 187 | pnp_dbg(&dev->dev, " dma %d already set to %d flags %#lx\n", | 204 | pnp_dbg(&dev->dev, " dma %d already set to %d flags %#lx\n", |
| 188 | idx, (int) res->start, res->flags); | 205 | idx, (int) res->start, res->flags); |
diff --git a/drivers/power/reset/gpio-poweroff.c b/drivers/power/reset/gpio-poweroff.c index 06074248ba7a..e290d48ddd99 100644 --- a/drivers/power/reset/gpio-poweroff.c +++ b/drivers/power/reset/gpio-poweroff.c | |||
| @@ -29,15 +29,16 @@ static int gpio_active_low; | |||
| 29 | 29 | ||
| 30 | static void gpio_poweroff_do_poweroff(void) | 30 | static void gpio_poweroff_do_poweroff(void) |
| 31 | { | 31 | { |
| 32 | BUG_ON(gpio_num == -1); | 32 | BUG_ON(!gpio_is_valid(gpio_num)); |
| 33 | 33 | ||
| 34 | /* drive it active */ | 34 | /* drive it active, also inactive->active edge */ |
| 35 | gpio_direction_output(gpio_num, !gpio_active_low); | 35 | gpio_direction_output(gpio_num, !gpio_active_low); |
| 36 | mdelay(100); | 36 | mdelay(100); |
| 37 | /* rising edge or drive inactive */ | 37 | /* drive inactive, also active->inactive edge */ |
| 38 | gpio_set_value(gpio_num, gpio_active_low); | 38 | gpio_set_value(gpio_num, gpio_active_low); |
| 39 | mdelay(100); | 39 | mdelay(100); |
| 40 | /* falling edge */ | 40 | |
| 41 | /* drive it active, also inactive->active edge */ | ||
| 41 | gpio_set_value(gpio_num, !gpio_active_low); | 42 | gpio_set_value(gpio_num, !gpio_active_low); |
| 42 | 43 | ||
| 43 | /* give it some time */ | 44 | /* give it some time */ |
| @@ -60,15 +61,12 @@ static int gpio_poweroff_probe(struct platform_device *pdev) | |||
| 60 | } | 61 | } |
| 61 | 62 | ||
| 62 | gpio_num = of_get_gpio_flags(pdev->dev.of_node, 0, &flags); | 63 | gpio_num = of_get_gpio_flags(pdev->dev.of_node, 0, &flags); |
| 63 | if (gpio_num < 0) { | 64 | if (!gpio_is_valid(gpio_num)) |
| 64 | pr_err("%s: Could not get GPIO configuration: %d", | 65 | return gpio_num; |
| 65 | __func__, gpio_num); | 66 | |
| 66 | return -ENODEV; | ||
| 67 | } | ||
| 68 | gpio_active_low = flags & OF_GPIO_ACTIVE_LOW; | 67 | gpio_active_low = flags & OF_GPIO_ACTIVE_LOW; |
| 69 | 68 | ||
| 70 | if (of_get_property(pdev->dev.of_node, "input", NULL)) | 69 | input = of_property_read_bool(pdev->dev.of_node, "input"); |
| 71 | input = true; | ||
| 72 | 70 | ||
| 73 | ret = gpio_request(gpio_num, "poweroff-gpio"); | 71 | ret = gpio_request(gpio_num, "poweroff-gpio"); |
| 74 | if (ret) { | 72 | if (ret) { |
| @@ -98,8 +96,7 @@ err: | |||
| 98 | 96 | ||
| 99 | static int gpio_poweroff_remove(struct platform_device *pdev) | 97 | static int gpio_poweroff_remove(struct platform_device *pdev) |
| 100 | { | 98 | { |
| 101 | if (gpio_num != -1) | 99 | gpio_free(gpio_num); |
| 102 | gpio_free(gpio_num); | ||
| 103 | if (pm_power_off == &gpio_poweroff_do_poweroff) | 100 | if (pm_power_off == &gpio_poweroff_do_poweroff) |
| 104 | pm_power_off = NULL; | 101 | pm_power_off = NULL; |
| 105 | 102 | ||
| @@ -115,15 +112,15 @@ static struct platform_driver gpio_poweroff_driver = { | |||
| 115 | .probe = gpio_poweroff_probe, | 112 | .probe = gpio_poweroff_probe, |
| 116 | .remove = gpio_poweroff_remove, | 113 | .remove = gpio_poweroff_remove, |
| 117 | .driver = { | 114 | .driver = { |
| 118 | .name = "poweroff-gpio", | 115 | .name = "poweroff-gpio", |
| 119 | .owner = THIS_MODULE, | 116 | .owner = THIS_MODULE, |
| 120 | .of_match_table = of_gpio_poweroff_match, | 117 | .of_match_table = of_gpio_poweroff_match, |
| 121 | }, | 118 | }, |
| 122 | }; | 119 | }; |
| 123 | 120 | ||
| 124 | module_platform_driver(gpio_poweroff_driver); | 121 | module_platform_driver(gpio_poweroff_driver); |
| 125 | 122 | ||
| 126 | MODULE_AUTHOR("Jamie Lentin <jm@lentin.co.uk>"); | 123 | MODULE_AUTHOR("Jamie Lentin <jm@lentin.co.uk>"); |
| 127 | MODULE_DESCRIPTION("GPIO poweroff driver"); | 124 | MODULE_DESCRIPTION("GPIO poweroff driver"); |
| 128 | MODULE_LICENSE("GPL"); | 125 | MODULE_LICENSE("GPL v2"); |
| 129 | MODULE_ALIAS("platform:poweroff-gpio"); | 126 | MODULE_ALIAS("platform:poweroff-gpio"); |
diff --git a/drivers/s390/block/dasd_diag.c b/drivers/s390/block/dasd_diag.c index 9bd5da36f99e..704488d0f819 100644 --- a/drivers/s390/block/dasd_diag.c +++ b/drivers/s390/block/dasd_diag.c | |||
| @@ -248,7 +248,7 @@ static void dasd_ext_handler(struct ext_code ext_code, | |||
| 248 | default: | 248 | default: |
| 249 | return; | 249 | return; |
| 250 | } | 250 | } |
| 251 | kstat_cpu(smp_processor_id()).irqs[EXTINT_DSD]++; | 251 | inc_irq_stat(IRQEXT_DSD); |
| 252 | if (!ip) { /* no intparm: unsolicited interrupt */ | 252 | if (!ip) { /* no intparm: unsolicited interrupt */ |
| 253 | DBF_EVENT(DBF_NOTICE, "%s", "caught unsolicited " | 253 | DBF_EVENT(DBF_NOTICE, "%s", "caught unsolicited " |
| 254 | "interrupt"); | 254 | "interrupt"); |
diff --git a/drivers/s390/block/dasd_eckd.c b/drivers/s390/block/dasd_eckd.c index 806fe912d6e7..e37bc1620d14 100644 --- a/drivers/s390/block/dasd_eckd.c +++ b/drivers/s390/block/dasd_eckd.c | |||
| @@ -4274,7 +4274,7 @@ static struct ccw_driver dasd_eckd_driver = { | |||
| 4274 | .thaw = dasd_generic_restore_device, | 4274 | .thaw = dasd_generic_restore_device, |
| 4275 | .restore = dasd_generic_restore_device, | 4275 | .restore = dasd_generic_restore_device, |
| 4276 | .uc_handler = dasd_generic_uc_handler, | 4276 | .uc_handler = dasd_generic_uc_handler, |
| 4277 | .int_class = IOINT_DAS, | 4277 | .int_class = IRQIO_DAS, |
| 4278 | }; | 4278 | }; |
| 4279 | 4279 | ||
| 4280 | /* | 4280 | /* |
diff --git a/drivers/s390/block/dasd_fba.c b/drivers/s390/block/dasd_fba.c index eb748507c7fa..414698584344 100644 --- a/drivers/s390/block/dasd_fba.c +++ b/drivers/s390/block/dasd_fba.c | |||
| @@ -78,7 +78,7 @@ static struct ccw_driver dasd_fba_driver = { | |||
| 78 | .freeze = dasd_generic_pm_freeze, | 78 | .freeze = dasd_generic_pm_freeze, |
| 79 | .thaw = dasd_generic_restore_device, | 79 | .thaw = dasd_generic_restore_device, |
| 80 | .restore = dasd_generic_restore_device, | 80 | .restore = dasd_generic_restore_device, |
| 81 | .int_class = IOINT_DAS, | 81 | .int_class = IRQIO_DAS, |
| 82 | }; | 82 | }; |
| 83 | 83 | ||
| 84 | static void | 84 | static void |
diff --git a/drivers/s390/char/con3215.c b/drivers/s390/char/con3215.c index 40084501c31b..33b7141a182f 100644 --- a/drivers/s390/char/con3215.c +++ b/drivers/s390/char/con3215.c | |||
| @@ -44,6 +44,7 @@ | |||
| 44 | #define RAW3215_NR_CCWS 3 | 44 | #define RAW3215_NR_CCWS 3 |
| 45 | #define RAW3215_TIMEOUT HZ/10 /* time for delayed output */ | 45 | #define RAW3215_TIMEOUT HZ/10 /* time for delayed output */ |
| 46 | 46 | ||
| 47 | #define RAW3215_FIXED 1 /* 3215 console device is not be freed */ | ||
| 47 | #define RAW3215_WORKING 4 /* set if a request is being worked on */ | 48 | #define RAW3215_WORKING 4 /* set if a request is being worked on */ |
| 48 | #define RAW3215_THROTTLED 8 /* set if reading is disabled */ | 49 | #define RAW3215_THROTTLED 8 /* set if reading is disabled */ |
| 49 | #define RAW3215_STOPPED 16 /* set if writing is disabled */ | 50 | #define RAW3215_STOPPED 16 /* set if writing is disabled */ |
| @@ -630,7 +631,8 @@ static void raw3215_shutdown(struct raw3215_info *raw) | |||
| 630 | DECLARE_WAITQUEUE(wait, current); | 631 | DECLARE_WAITQUEUE(wait, current); |
| 631 | unsigned long flags; | 632 | unsigned long flags; |
| 632 | 633 | ||
| 633 | if (!(raw->port.flags & ASYNC_INITIALIZED)) | 634 | if (!(raw->port.flags & ASYNC_INITIALIZED) || |
| 635 | (raw->flags & RAW3215_FIXED)) | ||
| 634 | return; | 636 | return; |
| 635 | /* Wait for outstanding requests, then free irq */ | 637 | /* Wait for outstanding requests, then free irq */ |
| 636 | spin_lock_irqsave(get_ccwdev_lock(raw->cdev), flags); | 638 | spin_lock_irqsave(get_ccwdev_lock(raw->cdev), flags); |
| @@ -805,7 +807,7 @@ static struct ccw_driver raw3215_ccw_driver = { | |||
| 805 | .freeze = &raw3215_pm_stop, | 807 | .freeze = &raw3215_pm_stop, |
| 806 | .thaw = &raw3215_pm_start, | 808 | .thaw = &raw3215_pm_start, |
| 807 | .restore = &raw3215_pm_start, | 809 | .restore = &raw3215_pm_start, |
| 808 | .int_class = IOINT_C15, | 810 | .int_class = IRQIO_C15, |
| 809 | }; | 811 | }; |
| 810 | 812 | ||
| 811 | #ifdef CONFIG_TN3215_CONSOLE | 813 | #ifdef CONFIG_TN3215_CONSOLE |
| @@ -927,6 +929,8 @@ static int __init con3215_init(void) | |||
| 927 | dev_set_drvdata(&cdev->dev, raw); | 929 | dev_set_drvdata(&cdev->dev, raw); |
| 928 | cdev->handler = raw3215_irq; | 930 | cdev->handler = raw3215_irq; |
| 929 | 931 | ||
| 932 | raw->flags |= RAW3215_FIXED; | ||
| 933 | |||
| 930 | /* Request the console irq */ | 934 | /* Request the console irq */ |
| 931 | if (raw3215_startup(raw) != 0) { | 935 | if (raw3215_startup(raw) != 0) { |
| 932 | raw3215_free_info(raw); | 936 | raw3215_free_info(raw); |
diff --git a/drivers/s390/char/raw3270.c b/drivers/s390/char/raw3270.c index f3b8bb84faf2..9a6c140c5f07 100644 --- a/drivers/s390/char/raw3270.c +++ b/drivers/s390/char/raw3270.c | |||
| @@ -1396,7 +1396,7 @@ static struct ccw_driver raw3270_ccw_driver = { | |||
| 1396 | .freeze = &raw3270_pm_stop, | 1396 | .freeze = &raw3270_pm_stop, |
| 1397 | .thaw = &raw3270_pm_start, | 1397 | .thaw = &raw3270_pm_start, |
| 1398 | .restore = &raw3270_pm_start, | 1398 | .restore = &raw3270_pm_start, |
| 1399 | .int_class = IOINT_C70, | 1399 | .int_class = IRQIO_C70, |
| 1400 | }; | 1400 | }; |
| 1401 | 1401 | ||
| 1402 | static int | 1402 | static int |
diff --git a/drivers/s390/char/sclp.c b/drivers/s390/char/sclp.c index 4fa21f7e2308..12c16a65dd25 100644 --- a/drivers/s390/char/sclp.c +++ b/drivers/s390/char/sclp.c | |||
| @@ -400,7 +400,7 @@ static void sclp_interrupt_handler(struct ext_code ext_code, | |||
| 400 | u32 finished_sccb; | 400 | u32 finished_sccb; |
| 401 | u32 evbuf_pending; | 401 | u32 evbuf_pending; |
| 402 | 402 | ||
| 403 | kstat_cpu(smp_processor_id()).irqs[EXTINT_SCP]++; | 403 | inc_irq_stat(IRQEXT_SCP); |
| 404 | spin_lock(&sclp_lock); | 404 | spin_lock(&sclp_lock); |
| 405 | finished_sccb = param32 & 0xfffffff8; | 405 | finished_sccb = param32 & 0xfffffff8; |
| 406 | evbuf_pending = param32 & 0x3; | 406 | evbuf_pending = param32 & 0x3; |
| @@ -813,7 +813,7 @@ static void sclp_check_handler(struct ext_code ext_code, | |||
| 813 | { | 813 | { |
| 814 | u32 finished_sccb; | 814 | u32 finished_sccb; |
| 815 | 815 | ||
| 816 | kstat_cpu(smp_processor_id()).irqs[EXTINT_SCP]++; | 816 | inc_irq_stat(IRQEXT_SCP); |
| 817 | finished_sccb = param32 & 0xfffffff8; | 817 | finished_sccb = param32 & 0xfffffff8; |
| 818 | /* Is this the interrupt we are waiting for? */ | 818 | /* Is this the interrupt we are waiting for? */ |
| 819 | if (finished_sccb == 0) | 819 | if (finished_sccb == 0) |
diff --git a/drivers/s390/char/tape_34xx.c b/drivers/s390/char/tape_34xx.c index 6ae929c024ae..9aa79702b370 100644 --- a/drivers/s390/char/tape_34xx.c +++ b/drivers/s390/char/tape_34xx.c | |||
| @@ -1193,7 +1193,7 @@ static struct ccw_driver tape_34xx_driver = { | |||
| 1193 | .set_online = tape_34xx_online, | 1193 | .set_online = tape_34xx_online, |
| 1194 | .set_offline = tape_generic_offline, | 1194 | .set_offline = tape_generic_offline, |
| 1195 | .freeze = tape_generic_pm_suspend, | 1195 | .freeze = tape_generic_pm_suspend, |
| 1196 | .int_class = IOINT_TAP, | 1196 | .int_class = IRQIO_TAP, |
| 1197 | }; | 1197 | }; |
| 1198 | 1198 | ||
| 1199 | static int | 1199 | static int |
diff --git a/drivers/s390/char/tape_3590.c b/drivers/s390/char/tape_3590.c index 1b0eb49f739c..327cb19ad0b0 100644 --- a/drivers/s390/char/tape_3590.c +++ b/drivers/s390/char/tape_3590.c | |||
| @@ -1656,7 +1656,7 @@ static struct ccw_driver tape_3590_driver = { | |||
| 1656 | .set_offline = tape_generic_offline, | 1656 | .set_offline = tape_generic_offline, |
| 1657 | .set_online = tape_3590_online, | 1657 | .set_online = tape_3590_online, |
| 1658 | .freeze = tape_generic_pm_suspend, | 1658 | .freeze = tape_generic_pm_suspend, |
| 1659 | .int_class = IOINT_TAP, | 1659 | .int_class = IRQIO_TAP, |
| 1660 | }; | 1660 | }; |
| 1661 | 1661 | ||
| 1662 | /* | 1662 | /* |
diff --git a/drivers/s390/char/vmur.c b/drivers/s390/char/vmur.c index 73bef0bd394c..483f72ba030d 100644 --- a/drivers/s390/char/vmur.c +++ b/drivers/s390/char/vmur.c | |||
| @@ -74,7 +74,7 @@ static struct ccw_driver ur_driver = { | |||
| 74 | .set_online = ur_set_online, | 74 | .set_online = ur_set_online, |
| 75 | .set_offline = ur_set_offline, | 75 | .set_offline = ur_set_offline, |
| 76 | .freeze = ur_pm_suspend, | 76 | .freeze = ur_pm_suspend, |
| 77 | .int_class = IOINT_VMR, | 77 | .int_class = IRQIO_VMR, |
| 78 | }; | 78 | }; |
| 79 | 79 | ||
| 80 | static DEFINE_MUTEX(vmur_mutex); | 80 | static DEFINE_MUTEX(vmur_mutex); |
diff --git a/drivers/s390/cio/chsc_sch.c b/drivers/s390/cio/chsc_sch.c index 8f9a1a384496..facdf809113f 100644 --- a/drivers/s390/cio/chsc_sch.c +++ b/drivers/s390/cio/chsc_sch.c | |||
| @@ -58,7 +58,7 @@ static void chsc_subchannel_irq(struct subchannel *sch) | |||
| 58 | 58 | ||
| 59 | CHSC_LOG(4, "irb"); | 59 | CHSC_LOG(4, "irb"); |
| 60 | CHSC_LOG_HEX(4, irb, sizeof(*irb)); | 60 | CHSC_LOG_HEX(4, irb, sizeof(*irb)); |
| 61 | kstat_cpu(smp_processor_id()).irqs[IOINT_CSC]++; | 61 | inc_irq_stat(IRQIO_CSC); |
| 62 | 62 | ||
| 63 | /* Copy irb to provided request and set done. */ | 63 | /* Copy irb to provided request and set done. */ |
| 64 | if (!request) { | 64 | if (!request) { |
diff --git a/drivers/s390/cio/cio.c b/drivers/s390/cio/cio.c index 8e927b9f285f..c8faf6230b0f 100644 --- a/drivers/s390/cio/cio.c +++ b/drivers/s390/cio/cio.c | |||
| @@ -611,7 +611,7 @@ void __irq_entry do_IRQ(struct pt_regs *regs) | |||
| 611 | tpi_info = (struct tpi_info *)&S390_lowcore.subchannel_id; | 611 | tpi_info = (struct tpi_info *)&S390_lowcore.subchannel_id; |
| 612 | irb = (struct irb *)&S390_lowcore.irb; | 612 | irb = (struct irb *)&S390_lowcore.irb; |
| 613 | do { | 613 | do { |
| 614 | kstat_cpu(smp_processor_id()).irqs[IO_INTERRUPT]++; | 614 | kstat_incr_irqs_this_cpu(IO_INTERRUPT, NULL); |
| 615 | if (tpi_info->adapter_IO) { | 615 | if (tpi_info->adapter_IO) { |
| 616 | do_adapter_IO(tpi_info->isc); | 616 | do_adapter_IO(tpi_info->isc); |
| 617 | continue; | 617 | continue; |
| @@ -619,7 +619,7 @@ void __irq_entry do_IRQ(struct pt_regs *regs) | |||
| 619 | sch = (struct subchannel *)(unsigned long)tpi_info->intparm; | 619 | sch = (struct subchannel *)(unsigned long)tpi_info->intparm; |
| 620 | if (!sch) { | 620 | if (!sch) { |
| 621 | /* Clear pending interrupt condition. */ | 621 | /* Clear pending interrupt condition. */ |
| 622 | kstat_cpu(smp_processor_id()).irqs[IOINT_CIO]++; | 622 | inc_irq_stat(IRQIO_CIO); |
| 623 | tsch(tpi_info->schid, irb); | 623 | tsch(tpi_info->schid, irb); |
| 624 | continue; | 624 | continue; |
| 625 | } | 625 | } |
| @@ -633,9 +633,9 @@ void __irq_entry do_IRQ(struct pt_regs *regs) | |||
| 633 | if (sch->driver && sch->driver->irq) | 633 | if (sch->driver && sch->driver->irq) |
| 634 | sch->driver->irq(sch); | 634 | sch->driver->irq(sch); |
| 635 | else | 635 | else |
| 636 | kstat_cpu(smp_processor_id()).irqs[IOINT_CIO]++; | 636 | inc_irq_stat(IRQIO_CIO); |
| 637 | } else | 637 | } else |
| 638 | kstat_cpu(smp_processor_id()).irqs[IOINT_CIO]++; | 638 | inc_irq_stat(IRQIO_CIO); |
| 639 | spin_unlock(sch->lock); | 639 | spin_unlock(sch->lock); |
| 640 | /* | 640 | /* |
| 641 | * Are more interrupts pending? | 641 | * Are more interrupts pending? |
| @@ -678,7 +678,7 @@ static void cio_tsch(struct subchannel *sch) | |||
| 678 | if (sch->driver && sch->driver->irq) | 678 | if (sch->driver && sch->driver->irq) |
| 679 | sch->driver->irq(sch); | 679 | sch->driver->irq(sch); |
| 680 | else | 680 | else |
| 681 | kstat_cpu(smp_processor_id()).irqs[IOINT_CIO]++; | 681 | inc_irq_stat(IRQIO_CIO); |
| 682 | if (!irq_context) { | 682 | if (!irq_context) { |
| 683 | irq_exit(); | 683 | irq_exit(); |
| 684 | _local_bh_enable(); | 684 | _local_bh_enable(); |
diff --git a/drivers/s390/cio/device.c b/drivers/s390/cio/device.c index 6995cff44636..7cd5c6812ac7 100644 --- a/drivers/s390/cio/device.c +++ b/drivers/s390/cio/device.c | |||
| @@ -758,7 +758,7 @@ static int io_subchannel_initialize_dev(struct subchannel *sch, | |||
| 758 | struct ccw_device *cdev) | 758 | struct ccw_device *cdev) |
| 759 | { | 759 | { |
| 760 | cdev->private->cdev = cdev; | 760 | cdev->private->cdev = cdev; |
| 761 | cdev->private->int_class = IOINT_CIO; | 761 | cdev->private->int_class = IRQIO_CIO; |
| 762 | atomic_set(&cdev->private->onoff, 0); | 762 | atomic_set(&cdev->private->onoff, 0); |
| 763 | cdev->dev.parent = &sch->dev; | 763 | cdev->dev.parent = &sch->dev; |
| 764 | cdev->dev.release = ccw_device_release; | 764 | cdev->dev.release = ccw_device_release; |
| @@ -1023,7 +1023,7 @@ static void io_subchannel_irq(struct subchannel *sch) | |||
| 1023 | if (cdev) | 1023 | if (cdev) |
| 1024 | dev_fsm_event(cdev, DEV_EVENT_INTERRUPT); | 1024 | dev_fsm_event(cdev, DEV_EVENT_INTERRUPT); |
| 1025 | else | 1025 | else |
| 1026 | kstat_cpu(smp_processor_id()).irqs[IOINT_CIO]++; | 1026 | inc_irq_stat(IRQIO_CIO); |
| 1027 | } | 1027 | } |
| 1028 | 1028 | ||
| 1029 | void io_subchannel_init_config(struct subchannel *sch) | 1029 | void io_subchannel_init_config(struct subchannel *sch) |
| @@ -1634,7 +1634,7 @@ ccw_device_probe_console(void) | |||
| 1634 | memset(&console_private, 0, sizeof(struct ccw_device_private)); | 1634 | memset(&console_private, 0, sizeof(struct ccw_device_private)); |
| 1635 | console_cdev.private = &console_private; | 1635 | console_cdev.private = &console_private; |
| 1636 | console_private.cdev = &console_cdev; | 1636 | console_private.cdev = &console_cdev; |
| 1637 | console_private.int_class = IOINT_CIO; | 1637 | console_private.int_class = IRQIO_CIO; |
| 1638 | ret = ccw_device_console_enable(&console_cdev, sch); | 1638 | ret = ccw_device_console_enable(&console_cdev, sch); |
| 1639 | if (ret) { | 1639 | if (ret) { |
| 1640 | cio_release_console(); | 1640 | cio_release_console(); |
| @@ -1715,13 +1715,13 @@ ccw_device_probe (struct device *dev) | |||
| 1715 | if (cdrv->int_class != 0) | 1715 | if (cdrv->int_class != 0) |
| 1716 | cdev->private->int_class = cdrv->int_class; | 1716 | cdev->private->int_class = cdrv->int_class; |
| 1717 | else | 1717 | else |
| 1718 | cdev->private->int_class = IOINT_CIO; | 1718 | cdev->private->int_class = IRQIO_CIO; |
| 1719 | 1719 | ||
| 1720 | ret = cdrv->probe ? cdrv->probe(cdev) : -ENODEV; | 1720 | ret = cdrv->probe ? cdrv->probe(cdev) : -ENODEV; |
| 1721 | 1721 | ||
| 1722 | if (ret) { | 1722 | if (ret) { |
| 1723 | cdev->drv = NULL; | 1723 | cdev->drv = NULL; |
| 1724 | cdev->private->int_class = IOINT_CIO; | 1724 | cdev->private->int_class = IRQIO_CIO; |
| 1725 | return ret; | 1725 | return ret; |
| 1726 | } | 1726 | } |
| 1727 | 1727 | ||
| @@ -1755,7 +1755,7 @@ ccw_device_remove (struct device *dev) | |||
| 1755 | } | 1755 | } |
| 1756 | ccw_device_set_timeout(cdev, 0); | 1756 | ccw_device_set_timeout(cdev, 0); |
| 1757 | cdev->drv = NULL; | 1757 | cdev->drv = NULL; |
| 1758 | cdev->private->int_class = IOINT_CIO; | 1758 | cdev->private->int_class = IRQIO_CIO; |
| 1759 | return 0; | 1759 | return 0; |
| 1760 | } | 1760 | } |
| 1761 | 1761 | ||
diff --git a/drivers/s390/cio/device.h b/drivers/s390/cio/device.h index 2e575cff9845..7d4ecb65db00 100644 --- a/drivers/s390/cio/device.h +++ b/drivers/s390/cio/device.h | |||
| @@ -61,11 +61,10 @@ dev_fsm_event(struct ccw_device *cdev, enum dev_event dev_event) | |||
| 61 | 61 | ||
| 62 | if (dev_event == DEV_EVENT_INTERRUPT) { | 62 | if (dev_event == DEV_EVENT_INTERRUPT) { |
| 63 | if (state == DEV_STATE_ONLINE) | 63 | if (state == DEV_STATE_ONLINE) |
| 64 | kstat_cpu(smp_processor_id()). | 64 | inc_irq_stat(cdev->private->int_class); |
| 65 | irqs[cdev->private->int_class]++; | ||
| 66 | else if (state != DEV_STATE_CMFCHANGE && | 65 | else if (state != DEV_STATE_CMFCHANGE && |
| 67 | state != DEV_STATE_CMFUPDATE) | 66 | state != DEV_STATE_CMFUPDATE) |
| 68 | kstat_cpu(smp_processor_id()).irqs[IOINT_CIO]++; | 67 | inc_irq_stat(IRQIO_CIO); |
| 69 | } | 68 | } |
| 70 | dev_jumptable[state][dev_event](cdev, dev_event); | 69 | dev_jumptable[state][dev_event](cdev, dev_event); |
| 71 | } | 70 | } |
diff --git a/drivers/s390/cio/eadm_sch.c b/drivers/s390/cio/eadm_sch.c index 6c9673400464..d9eddcba7e88 100644 --- a/drivers/s390/cio/eadm_sch.c +++ b/drivers/s390/cio/eadm_sch.c | |||
| @@ -139,7 +139,7 @@ static void eadm_subchannel_irq(struct subchannel *sch) | |||
| 139 | EADM_LOG(6, "irq"); | 139 | EADM_LOG(6, "irq"); |
| 140 | EADM_LOG_HEX(6, irb, sizeof(*irb)); | 140 | EADM_LOG_HEX(6, irb, sizeof(*irb)); |
| 141 | 141 | ||
| 142 | kstat_cpu(smp_processor_id()).irqs[IOINT_ADM]++; | 142 | inc_irq_stat(IRQIO_ADM); |
| 143 | 143 | ||
| 144 | if ((scsw->stctl & (SCSW_STCTL_ALERT_STATUS | SCSW_STCTL_STATUS_PEND)) | 144 | if ((scsw->stctl & (SCSW_STCTL_ALERT_STATUS | SCSW_STCTL_STATUS_PEND)) |
| 145 | && scsw->eswf == 1 && irb->esw.eadm.erw.r) | 145 | && scsw->eswf == 1 && irb->esw.eadm.erw.r) |
diff --git a/drivers/s390/cio/qdio_thinint.c b/drivers/s390/cio/qdio_thinint.c index bdb394b066fc..bde5255200dc 100644 --- a/drivers/s390/cio/qdio_thinint.c +++ b/drivers/s390/cio/qdio_thinint.c | |||
| @@ -182,7 +182,7 @@ static void tiqdio_thinint_handler(void *alsi, void *data) | |||
| 182 | struct qdio_q *q; | 182 | struct qdio_q *q; |
| 183 | 183 | ||
| 184 | last_ai_time = S390_lowcore.int_clock; | 184 | last_ai_time = S390_lowcore.int_clock; |
| 185 | kstat_cpu(smp_processor_id()).irqs[IOINT_QAI]++; | 185 | inc_irq_stat(IRQIO_QAI); |
| 186 | 186 | ||
| 187 | /* protect tiq_list entries, only changed in activate or shutdown */ | 187 | /* protect tiq_list entries, only changed in activate or shutdown */ |
| 188 | rcu_read_lock(); | 188 | rcu_read_lock(); |
diff --git a/drivers/s390/crypto/ap_bus.c b/drivers/s390/crypto/ap_bus.c index 7b865a7300e6..b8b340ac5332 100644 --- a/drivers/s390/crypto/ap_bus.c +++ b/drivers/s390/crypto/ap_bus.c | |||
| @@ -1272,7 +1272,7 @@ out: | |||
| 1272 | 1272 | ||
| 1273 | static void ap_interrupt_handler(void *unused1, void *unused2) | 1273 | static void ap_interrupt_handler(void *unused1, void *unused2) |
| 1274 | { | 1274 | { |
| 1275 | kstat_cpu(smp_processor_id()).irqs[IOINT_APB]++; | 1275 | inc_irq_stat(IRQIO_APB); |
| 1276 | tasklet_schedule(&ap_tasklet); | 1276 | tasklet_schedule(&ap_tasklet); |
| 1277 | } | 1277 | } |
| 1278 | 1278 | ||
diff --git a/drivers/s390/kvm/kvm_virtio.c b/drivers/s390/kvm/kvm_virtio.c index 7dabef624da3..8491111aec12 100644 --- a/drivers/s390/kvm/kvm_virtio.c +++ b/drivers/s390/kvm/kvm_virtio.c | |||
| @@ -392,7 +392,7 @@ static void kvm_extint_handler(struct ext_code ext_code, | |||
| 392 | 392 | ||
| 393 | if ((ext_code.subcode & 0xff00) != VIRTIO_SUBCODE_64) | 393 | if ((ext_code.subcode & 0xff00) != VIRTIO_SUBCODE_64) |
| 394 | return; | 394 | return; |
| 395 | kstat_cpu(smp_processor_id()).irqs[EXTINT_VRT]++; | 395 | inc_irq_stat(IRQEXT_VRT); |
| 396 | 396 | ||
| 397 | /* The LSB might be overloaded, we have to mask it */ | 397 | /* The LSB might be overloaded, we have to mask it */ |
| 398 | vq = (struct virtqueue *)(param64 & ~1UL); | 398 | vq = (struct virtqueue *)(param64 & ~1UL); |
diff --git a/drivers/s390/net/claw.c b/drivers/s390/net/claw.c index 5c70a6599578..83bc9c5fa0c1 100644 --- a/drivers/s390/net/claw.c +++ b/drivers/s390/net/claw.c | |||
| @@ -282,7 +282,7 @@ static struct ccw_driver claw_ccw_driver = { | |||
| 282 | .ids = claw_ids, | 282 | .ids = claw_ids, |
| 283 | .probe = ccwgroup_probe_ccwdev, | 283 | .probe = ccwgroup_probe_ccwdev, |
| 284 | .remove = ccwgroup_remove_ccwdev, | 284 | .remove = ccwgroup_remove_ccwdev, |
| 285 | .int_class = IOINT_CLW, | 285 | .int_class = IRQIO_CLW, |
| 286 | }; | 286 | }; |
| 287 | 287 | ||
| 288 | static ssize_t claw_driver_group_store(struct device_driver *ddrv, | 288 | static ssize_t claw_driver_group_store(struct device_driver *ddrv, |
diff --git a/drivers/s390/net/ctcm_main.c b/drivers/s390/net/ctcm_main.c index 817b68925ddd..676f12049a36 100644 --- a/drivers/s390/net/ctcm_main.c +++ b/drivers/s390/net/ctcm_main.c | |||
| @@ -1755,7 +1755,7 @@ static struct ccw_driver ctcm_ccw_driver = { | |||
| 1755 | .ids = ctcm_ids, | 1755 | .ids = ctcm_ids, |
| 1756 | .probe = ccwgroup_probe_ccwdev, | 1756 | .probe = ccwgroup_probe_ccwdev, |
| 1757 | .remove = ccwgroup_remove_ccwdev, | 1757 | .remove = ccwgroup_remove_ccwdev, |
| 1758 | .int_class = IOINT_CTC, | 1758 | .int_class = IRQIO_CTC, |
| 1759 | }; | 1759 | }; |
| 1760 | 1760 | ||
| 1761 | static struct ccwgroup_driver ctcm_group_driver = { | 1761 | static struct ccwgroup_driver ctcm_group_driver = { |
diff --git a/drivers/s390/net/lcs.c b/drivers/s390/net/lcs.c index 2ca0f1dd7a00..c645dc9e98af 100644 --- a/drivers/s390/net/lcs.c +++ b/drivers/s390/net/lcs.c | |||
| @@ -2384,7 +2384,7 @@ static struct ccw_driver lcs_ccw_driver = { | |||
| 2384 | .ids = lcs_ids, | 2384 | .ids = lcs_ids, |
| 2385 | .probe = ccwgroup_probe_ccwdev, | 2385 | .probe = ccwgroup_probe_ccwdev, |
| 2386 | .remove = ccwgroup_remove_ccwdev, | 2386 | .remove = ccwgroup_remove_ccwdev, |
| 2387 | .int_class = IOINT_LCS, | 2387 | .int_class = IRQIO_LCS, |
| 2388 | }; | 2388 | }; |
| 2389 | 2389 | ||
| 2390 | /** | 2390 | /** |
diff --git a/drivers/ssb/Kconfig b/drivers/ssb/Kconfig index ff3c8a21f10d..5d6f2ec1c705 100644 --- a/drivers/ssb/Kconfig +++ b/drivers/ssb/Kconfig | |||
| @@ -162,8 +162,7 @@ config SSB_DRIVER_GIGE | |||
| 162 | 162 | ||
| 163 | config SSB_DRIVER_GPIO | 163 | config SSB_DRIVER_GPIO |
| 164 | bool "SSB GPIO driver" | 164 | bool "SSB GPIO driver" |
| 165 | depends on SSB | 165 | depends on SSB && GPIOLIB |
| 166 | select GPIOLIB | ||
| 167 | help | 166 | help |
| 168 | Driver to provide access to the GPIO pins on the bus. | 167 | Driver to provide access to the GPIO pins on the bus. |
| 169 | 168 | ||
diff --git a/drivers/staging/omapdrm/omap_gem_dmabuf.c b/drivers/staging/omapdrm/omap_gem_dmabuf.c index 9a302062b031..ea3840038250 100644 --- a/drivers/staging/omapdrm/omap_gem_dmabuf.c +++ b/drivers/staging/omapdrm/omap_gem_dmabuf.c | |||
| @@ -207,7 +207,12 @@ struct drm_gem_object *omap_gem_prime_import(struct drm_device *dev, | |||
| 207 | obj = buffer->priv; | 207 | obj = buffer->priv; |
| 208 | /* is it from our device? */ | 208 | /* is it from our device? */ |
| 209 | if (obj->dev == dev) { | 209 | if (obj->dev == dev) { |
| 210 | /* | ||
| 211 | * Importing dmabuf exported from out own gem increases | ||
| 212 | * refcount on gem itself instead of f_count of dmabuf. | ||
| 213 | */ | ||
| 210 | drm_gem_object_reference(obj); | 214 | drm_gem_object_reference(obj); |
| 215 | dma_buf_put(buffer); | ||
| 211 | return obj; | 216 | return obj; |
| 212 | } | 217 | } |
| 213 | } | 218 | } |
diff --git a/drivers/video/mxsfb.c b/drivers/video/mxsfb.c index a45b37c2e88e..755556ca5b2d 100644 --- a/drivers/video/mxsfb.c +++ b/drivers/video/mxsfb.c | |||
| @@ -369,7 +369,8 @@ static void mxsfb_disable_controller(struct fb_info *fb_info) | |||
| 369 | loop--; | 369 | loop--; |
| 370 | } | 370 | } |
| 371 | 371 | ||
| 372 | writel(VDCTRL4_SYNC_SIGNALS_ON, host->base + LCDC_VDCTRL4 + REG_CLR); | 372 | reg = readl(host->base + LCDC_VDCTRL4); |
| 373 | writel(reg & ~VDCTRL4_SYNC_SIGNALS_ON, host->base + LCDC_VDCTRL4); | ||
| 373 | 374 | ||
| 374 | clk_disable_unprepare(host->clk); | 375 | clk_disable_unprepare(host->clk); |
| 375 | 376 | ||
diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c index f653835d067b..de7f9168a118 100644 --- a/fs/cifs/cifsfs.c +++ b/fs/cifs/cifsfs.c | |||
| @@ -228,7 +228,6 @@ cifs_alloc_inode(struct super_block *sb) | |||
| 228 | cifs_set_oplock_level(cifs_inode, 0); | 228 | cifs_set_oplock_level(cifs_inode, 0); |
| 229 | cifs_inode->delete_pending = false; | 229 | cifs_inode->delete_pending = false; |
| 230 | cifs_inode->invalid_mapping = false; | 230 | cifs_inode->invalid_mapping = false; |
| 231 | cifs_inode->leave_pages_clean = false; | ||
| 232 | cifs_inode->vfs_inode.i_blkbits = 14; /* 2**14 = CIFS_MAX_MSGSIZE */ | 231 | cifs_inode->vfs_inode.i_blkbits = 14; /* 2**14 = CIFS_MAX_MSGSIZE */ |
| 233 | cifs_inode->server_eof = 0; | 232 | cifs_inode->server_eof = 0; |
| 234 | cifs_inode->uniqueid = 0; | 233 | cifs_inode->uniqueid = 0; |
diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h index aea1eec64911..e6899cea1c35 100644 --- a/fs/cifs/cifsglob.h +++ b/fs/cifs/cifsglob.h | |||
| @@ -386,6 +386,7 @@ struct smb_version_values { | |||
| 386 | unsigned int cap_unix; | 386 | unsigned int cap_unix; |
| 387 | unsigned int cap_nt_find; | 387 | unsigned int cap_nt_find; |
| 388 | unsigned int cap_large_files; | 388 | unsigned int cap_large_files; |
| 389 | unsigned int oplock_read; | ||
| 389 | }; | 390 | }; |
| 390 | 391 | ||
| 391 | #define HEADER_SIZE(server) (server->vals->header_size) | 392 | #define HEADER_SIZE(server) (server->vals->header_size) |
| @@ -1030,7 +1031,6 @@ struct cifsInodeInfo { | |||
| 1030 | bool clientCanCacheAll; /* read and writebehind oplock */ | 1031 | bool clientCanCacheAll; /* read and writebehind oplock */ |
| 1031 | bool delete_pending; /* DELETE_ON_CLOSE is set */ | 1032 | bool delete_pending; /* DELETE_ON_CLOSE is set */ |
| 1032 | bool invalid_mapping; /* pagecache is invalid */ | 1033 | bool invalid_mapping; /* pagecache is invalid */ |
| 1033 | bool leave_pages_clean; /* protected by i_mutex, not set pages dirty */ | ||
| 1034 | unsigned long time; /* jiffies of last update of inode */ | 1034 | unsigned long time; /* jiffies of last update of inode */ |
| 1035 | u64 server_eof; /* current file size on server -- protected by i_lock */ | 1035 | u64 server_eof; /* current file size on server -- protected by i_lock */ |
| 1036 | u64 uniqueid; /* server inode number */ | 1036 | u64 uniqueid; /* server inode number */ |
diff --git a/fs/cifs/file.c b/fs/cifs/file.c index 0a6677ba212b..8ea6ca50a665 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c | |||
| @@ -238,6 +238,23 @@ out: | |||
| 238 | return rc; | 238 | return rc; |
| 239 | } | 239 | } |
| 240 | 240 | ||
| 241 | static bool | ||
| 242 | cifs_has_mand_locks(struct cifsInodeInfo *cinode) | ||
| 243 | { | ||
| 244 | struct cifs_fid_locks *cur; | ||
| 245 | bool has_locks = false; | ||
| 246 | |||
| 247 | down_read(&cinode->lock_sem); | ||
| 248 | list_for_each_entry(cur, &cinode->llist, llist) { | ||
| 249 | if (!list_empty(&cur->locks)) { | ||
| 250 | has_locks = true; | ||
| 251 | break; | ||
| 252 | } | ||
| 253 | } | ||
| 254 | up_read(&cinode->lock_sem); | ||
| 255 | return has_locks; | ||
| 256 | } | ||
| 257 | |||
| 241 | struct cifsFileInfo * | 258 | struct cifsFileInfo * |
| 242 | cifs_new_fileinfo(struct cifs_fid *fid, struct file *file, | 259 | cifs_new_fileinfo(struct cifs_fid *fid, struct file *file, |
| 243 | struct tcon_link *tlink, __u32 oplock) | 260 | struct tcon_link *tlink, __u32 oplock) |
| @@ -248,6 +265,7 @@ cifs_new_fileinfo(struct cifs_fid *fid, struct file *file, | |||
| 248 | struct cifsFileInfo *cfile; | 265 | struct cifsFileInfo *cfile; |
| 249 | struct cifs_fid_locks *fdlocks; | 266 | struct cifs_fid_locks *fdlocks; |
| 250 | struct cifs_tcon *tcon = tlink_tcon(tlink); | 267 | struct cifs_tcon *tcon = tlink_tcon(tlink); |
| 268 | struct TCP_Server_Info *server = tcon->ses->server; | ||
| 251 | 269 | ||
| 252 | cfile = kzalloc(sizeof(struct cifsFileInfo), GFP_KERNEL); | 270 | cfile = kzalloc(sizeof(struct cifsFileInfo), GFP_KERNEL); |
| 253 | if (cfile == NULL) | 271 | if (cfile == NULL) |
| @@ -276,12 +294,22 @@ cifs_new_fileinfo(struct cifs_fid *fid, struct file *file, | |||
| 276 | INIT_WORK(&cfile->oplock_break, cifs_oplock_break); | 294 | INIT_WORK(&cfile->oplock_break, cifs_oplock_break); |
| 277 | mutex_init(&cfile->fh_mutex); | 295 | mutex_init(&cfile->fh_mutex); |
| 278 | 296 | ||
| 297 | /* | ||
| 298 | * If the server returned a read oplock and we have mandatory brlocks, | ||
| 299 | * set oplock level to None. | ||
| 300 | */ | ||
| 301 | if (oplock == server->vals->oplock_read && | ||
| 302 | cifs_has_mand_locks(cinode)) { | ||
| 303 | cFYI(1, "Reset oplock val from read to None due to mand locks"); | ||
| 304 | oplock = 0; | ||
| 305 | } | ||
| 306 | |||
| 279 | spin_lock(&cifs_file_list_lock); | 307 | spin_lock(&cifs_file_list_lock); |
| 280 | if (fid->pending_open->oplock != CIFS_OPLOCK_NO_CHANGE) | 308 | if (fid->pending_open->oplock != CIFS_OPLOCK_NO_CHANGE && oplock) |
| 281 | oplock = fid->pending_open->oplock; | 309 | oplock = fid->pending_open->oplock; |
| 282 | list_del(&fid->pending_open->olist); | 310 | list_del(&fid->pending_open->olist); |
| 283 | 311 | ||
| 284 | tlink_tcon(tlink)->ses->server->ops->set_fid(cfile, fid, oplock); | 312 | server->ops->set_fid(cfile, fid, oplock); |
| 285 | 313 | ||
| 286 | list_add(&cfile->tlist, &tcon->openFileList); | 314 | list_add(&cfile->tlist, &tcon->openFileList); |
| 287 | /* if readable file instance put first in list*/ | 315 | /* if readable file instance put first in list*/ |
| @@ -1422,6 +1450,7 @@ cifs_setlk(struct file *file, struct file_lock *flock, __u32 type, | |||
| 1422 | struct cifsFileInfo *cfile = (struct cifsFileInfo *)file->private_data; | 1450 | struct cifsFileInfo *cfile = (struct cifsFileInfo *)file->private_data; |
| 1423 | struct cifs_tcon *tcon = tlink_tcon(cfile->tlink); | 1451 | struct cifs_tcon *tcon = tlink_tcon(cfile->tlink); |
| 1424 | struct TCP_Server_Info *server = tcon->ses->server; | 1452 | struct TCP_Server_Info *server = tcon->ses->server; |
| 1453 | struct inode *inode = cfile->dentry->d_inode; | ||
| 1425 | 1454 | ||
| 1426 | if (posix_lck) { | 1455 | if (posix_lck) { |
| 1427 | int posix_lock_type; | 1456 | int posix_lock_type; |
| @@ -1459,6 +1488,21 @@ cifs_setlk(struct file *file, struct file_lock *flock, __u32 type, | |||
| 1459 | if (!rc) | 1488 | if (!rc) |
| 1460 | goto out; | 1489 | goto out; |
| 1461 | 1490 | ||
| 1491 | /* | ||
| 1492 | * Windows 7 server can delay breaking lease from read to None | ||
| 1493 | * if we set a byte-range lock on a file - break it explicitly | ||
| 1494 | * before sending the lock to the server to be sure the next | ||
| 1495 | * read won't conflict with non-overlapted locks due to | ||
| 1496 | * pagereading. | ||
| 1497 | */ | ||
| 1498 | if (!CIFS_I(inode)->clientCanCacheAll && | ||
| 1499 | CIFS_I(inode)->clientCanCacheRead) { | ||
| 1500 | cifs_invalidate_mapping(inode); | ||
| 1501 | cFYI(1, "Set no oplock for inode=%p due to mand locks", | ||
| 1502 | inode); | ||
| 1503 | CIFS_I(inode)->clientCanCacheRead = false; | ||
| 1504 | } | ||
| 1505 | |||
| 1462 | rc = server->ops->mand_lock(xid, cfile, flock->fl_start, length, | 1506 | rc = server->ops->mand_lock(xid, cfile, flock->fl_start, length, |
| 1463 | type, 1, 0, wait_flag); | 1507 | type, 1, 0, wait_flag); |
| 1464 | if (rc) { | 1508 | if (rc) { |
| @@ -2103,15 +2147,7 @@ static int cifs_write_end(struct file *file, struct address_space *mapping, | |||
| 2103 | } else { | 2147 | } else { |
| 2104 | rc = copied; | 2148 | rc = copied; |
| 2105 | pos += copied; | 2149 | pos += copied; |
| 2106 | /* | 2150 | set_page_dirty(page); |
| 2107 | * When we use strict cache mode and cifs_strict_writev was run | ||
| 2108 | * with level II oplock (indicated by leave_pages_clean field of | ||
| 2109 | * CIFS_I(inode)), we can leave pages clean - cifs_strict_writev | ||
| 2110 | * sent the data to the server itself. | ||
| 2111 | */ | ||
| 2112 | if (!CIFS_I(inode)->leave_pages_clean || | ||
| 2113 | !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_STRICT_IO)) | ||
| 2114 | set_page_dirty(page); | ||
| 2115 | } | 2151 | } |
| 2116 | 2152 | ||
| 2117 | if (rc > 0) { | 2153 | if (rc > 0) { |
| @@ -2462,8 +2498,8 @@ ssize_t cifs_user_writev(struct kiocb *iocb, const struct iovec *iov, | |||
| 2462 | } | 2498 | } |
| 2463 | 2499 | ||
| 2464 | static ssize_t | 2500 | static ssize_t |
| 2465 | cifs_pagecache_writev(struct kiocb *iocb, const struct iovec *iov, | 2501 | cifs_writev(struct kiocb *iocb, const struct iovec *iov, |
| 2466 | unsigned long nr_segs, loff_t pos, bool cache_ex) | 2502 | unsigned long nr_segs, loff_t pos) |
| 2467 | { | 2503 | { |
| 2468 | struct file *file = iocb->ki_filp; | 2504 | struct file *file = iocb->ki_filp; |
| 2469 | struct cifsFileInfo *cfile = (struct cifsFileInfo *)file->private_data; | 2505 | struct cifsFileInfo *cfile = (struct cifsFileInfo *)file->private_data; |
| @@ -2485,12 +2521,8 @@ cifs_pagecache_writev(struct kiocb *iocb, const struct iovec *iov, | |||
| 2485 | server->vals->exclusive_lock_type, NULL, | 2521 | server->vals->exclusive_lock_type, NULL, |
| 2486 | CIFS_WRITE_OP)) { | 2522 | CIFS_WRITE_OP)) { |
| 2487 | mutex_lock(&inode->i_mutex); | 2523 | mutex_lock(&inode->i_mutex); |
| 2488 | if (!cache_ex) | ||
| 2489 | cinode->leave_pages_clean = true; | ||
| 2490 | rc = __generic_file_aio_write(iocb, iov, nr_segs, | 2524 | rc = __generic_file_aio_write(iocb, iov, nr_segs, |
| 2491 | &iocb->ki_pos); | 2525 | &iocb->ki_pos); |
| 2492 | if (!cache_ex) | ||
| 2493 | cinode->leave_pages_clean = false; | ||
| 2494 | mutex_unlock(&inode->i_mutex); | 2526 | mutex_unlock(&inode->i_mutex); |
| 2495 | } | 2527 | } |
| 2496 | 2528 | ||
| @@ -2517,60 +2549,32 @@ cifs_strict_writev(struct kiocb *iocb, const struct iovec *iov, | |||
| 2517 | struct cifsFileInfo *cfile = (struct cifsFileInfo *) | 2549 | struct cifsFileInfo *cfile = (struct cifsFileInfo *) |
| 2518 | iocb->ki_filp->private_data; | 2550 | iocb->ki_filp->private_data; |
| 2519 | struct cifs_tcon *tcon = tlink_tcon(cfile->tlink); | 2551 | struct cifs_tcon *tcon = tlink_tcon(cfile->tlink); |
| 2520 | ssize_t written, written2; | 2552 | ssize_t written; |
| 2521 | /* | ||
| 2522 | * We need to store clientCanCacheAll here to prevent race | ||
| 2523 | * conditions - this value can be changed during an execution | ||
| 2524 | * of generic_file_aio_write. For CIFS it can be changed from | ||
| 2525 | * true to false only, but for SMB2 it can be changed both from | ||
| 2526 | * true to false and vice versa. So, we can end up with a data | ||
| 2527 | * stored in the cache, not marked dirty and not sent to the | ||
| 2528 | * server if this value changes its state from false to true | ||
| 2529 | * after cifs_write_end. | ||
| 2530 | */ | ||
| 2531 | bool cache_ex = cinode->clientCanCacheAll; | ||
| 2532 | bool cache_read = cinode->clientCanCacheRead; | ||
| 2533 | int rc; | ||
| 2534 | loff_t saved_pos; | ||
| 2535 | 2553 | ||
| 2536 | if (cache_ex) { | 2554 | if (cinode->clientCanCacheAll) { |
| 2537 | if (cap_unix(tcon->ses) && | 2555 | if (cap_unix(tcon->ses) && |
| 2538 | ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL) == 0) && | 2556 | (CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability)) |
| 2539 | (CIFS_UNIX_FCNTL_CAP & le64_to_cpu( | 2557 | && ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL) == 0)) |
| 2540 | tcon->fsUnixInfo.Capability))) | ||
| 2541 | return generic_file_aio_write(iocb, iov, nr_segs, pos); | 2558 | return generic_file_aio_write(iocb, iov, nr_segs, pos); |
| 2542 | return cifs_pagecache_writev(iocb, iov, nr_segs, pos, cache_ex); | 2559 | return cifs_writev(iocb, iov, nr_segs, pos); |
| 2543 | } | 2560 | } |
| 2544 | |||
| 2545 | /* | 2561 | /* |
| 2546 | * For files without exclusive oplock in strict cache mode we need to | 2562 | * For non-oplocked files in strict cache mode we need to write the data |
| 2547 | * write the data to the server exactly from the pos to pos+len-1 rather | 2563 | * to the server exactly from the pos to pos+len-1 rather than flush all |
| 2548 | * than flush all affected pages because it may cause a error with | 2564 | * affected pages because it may cause a error with mandatory locks on |
| 2549 | * mandatory locks on these pages but not on the region from pos to | 2565 | * these pages but not on the region from pos to ppos+len-1. |
| 2550 | * ppos+len-1. | ||
| 2551 | */ | 2566 | */ |
| 2552 | written = cifs_user_writev(iocb, iov, nr_segs, pos); | 2567 | written = cifs_user_writev(iocb, iov, nr_segs, pos); |
| 2553 | if (!cache_read || written <= 0) | 2568 | if (written > 0 && cinode->clientCanCacheRead) { |
| 2554 | return written; | 2569 | /* |
| 2555 | 2570 | * Windows 7 server can delay breaking level2 oplock if a write | |
| 2556 | saved_pos = iocb->ki_pos; | 2571 | * request comes - break it on the client to prevent reading |
| 2557 | iocb->ki_pos = pos; | 2572 | * an old data. |
| 2558 | /* we have a read oplock - need to store a data in the page cache */ | 2573 | */ |
| 2559 | if (cap_unix(tcon->ses) && | 2574 | cifs_invalidate_mapping(inode); |
| 2560 | ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL) == 0) && | 2575 | cFYI(1, "Set no oplock for inode=%p after a write operation", |
| 2561 | (CIFS_UNIX_FCNTL_CAP & le64_to_cpu( | 2576 | inode); |
| 2562 | tcon->fsUnixInfo.Capability))) | 2577 | cinode->clientCanCacheRead = false; |
| 2563 | written2 = generic_file_aio_write(iocb, iov, nr_segs, pos); | ||
| 2564 | else | ||
| 2565 | written2 = cifs_pagecache_writev(iocb, iov, nr_segs, pos, | ||
| 2566 | cache_ex); | ||
| 2567 | /* errors occured during writing - invalidate the page cache */ | ||
| 2568 | if (written2 < 0) { | ||
| 2569 | rc = cifs_invalidate_mapping(inode); | ||
| 2570 | if (rc) | ||
| 2571 | written = (ssize_t)rc; | ||
| 2572 | else | ||
| 2573 | iocb->ki_pos = saved_pos; | ||
| 2574 | } | 2578 | } |
| 2575 | return written; | 2579 | return written; |
| 2576 | } | 2580 | } |
| @@ -3577,6 +3581,13 @@ void cifs_oplock_break(struct work_struct *work) | |||
| 3577 | struct cifs_tcon *tcon = tlink_tcon(cfile->tlink); | 3581 | struct cifs_tcon *tcon = tlink_tcon(cfile->tlink); |
| 3578 | int rc = 0; | 3582 | int rc = 0; |
| 3579 | 3583 | ||
| 3584 | if (!cinode->clientCanCacheAll && cinode->clientCanCacheRead && | ||
| 3585 | cifs_has_mand_locks(cinode)) { | ||
| 3586 | cFYI(1, "Reset oplock to None for inode=%p due to mand locks", | ||
| 3587 | inode); | ||
| 3588 | cinode->clientCanCacheRead = false; | ||
| 3589 | } | ||
| 3590 | |||
| 3580 | if (inode && S_ISREG(inode->i_mode)) { | 3591 | if (inode && S_ISREG(inode->i_mode)) { |
| 3581 | if (cinode->clientCanCacheRead) | 3592 | if (cinode->clientCanCacheRead) |
| 3582 | break_lease(inode, O_RDONLY); | 3593 | break_lease(inode, O_RDONLY); |
diff --git a/fs/cifs/smb1ops.c b/fs/cifs/smb1ops.c index a5d234c8d5d9..47bc5a87f94e 100644 --- a/fs/cifs/smb1ops.c +++ b/fs/cifs/smb1ops.c | |||
| @@ -53,6 +53,13 @@ send_nt_cancel(struct TCP_Server_Info *server, void *buf, | |||
| 53 | mutex_unlock(&server->srv_mutex); | 53 | mutex_unlock(&server->srv_mutex); |
| 54 | return rc; | 54 | return rc; |
| 55 | } | 55 | } |
| 56 | |||
| 57 | /* | ||
| 58 | * The response to this call was already factored into the sequence | ||
| 59 | * number when the call went out, so we must adjust it back downward | ||
| 60 | * after signing here. | ||
| 61 | */ | ||
| 62 | --server->sequence_number; | ||
| 56 | rc = smb_send(server, in_buf, be32_to_cpu(in_buf->smb_buf_length)); | 63 | rc = smb_send(server, in_buf, be32_to_cpu(in_buf->smb_buf_length)); |
| 57 | mutex_unlock(&server->srv_mutex); | 64 | mutex_unlock(&server->srv_mutex); |
| 58 | 65 | ||
| @@ -952,4 +959,5 @@ struct smb_version_values smb1_values = { | |||
| 952 | .cap_unix = CAP_UNIX, | 959 | .cap_unix = CAP_UNIX, |
| 953 | .cap_nt_find = CAP_NT_SMBS | CAP_NT_FIND, | 960 | .cap_nt_find = CAP_NT_SMBS | CAP_NT_FIND, |
| 954 | .cap_large_files = CAP_LARGE_FILES, | 961 | .cap_large_files = CAP_LARGE_FILES, |
| 962 | .oplock_read = OPLOCK_READ, | ||
| 955 | }; | 963 | }; |
diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c index d79de7bc4435..c9c7aa7ed966 100644 --- a/fs/cifs/smb2ops.c +++ b/fs/cifs/smb2ops.c | |||
| @@ -708,6 +708,7 @@ struct smb_version_values smb20_values = { | |||
| 708 | .cap_unix = 0, | 708 | .cap_unix = 0, |
| 709 | .cap_nt_find = SMB2_NT_FIND, | 709 | .cap_nt_find = SMB2_NT_FIND, |
| 710 | .cap_large_files = SMB2_LARGE_FILES, | 710 | .cap_large_files = SMB2_LARGE_FILES, |
| 711 | .oplock_read = SMB2_OPLOCK_LEVEL_II, | ||
| 711 | }; | 712 | }; |
| 712 | 713 | ||
| 713 | struct smb_version_values smb21_values = { | 714 | struct smb_version_values smb21_values = { |
| @@ -725,6 +726,7 @@ struct smb_version_values smb21_values = { | |||
| 725 | .cap_unix = 0, | 726 | .cap_unix = 0, |
| 726 | .cap_nt_find = SMB2_NT_FIND, | 727 | .cap_nt_find = SMB2_NT_FIND, |
| 727 | .cap_large_files = SMB2_LARGE_FILES, | 728 | .cap_large_files = SMB2_LARGE_FILES, |
| 729 | .oplock_read = SMB2_OPLOCK_LEVEL_II, | ||
| 728 | }; | 730 | }; |
| 729 | 731 | ||
| 730 | struct smb_version_values smb30_values = { | 732 | struct smb_version_values smb30_values = { |
diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c index 76d974c952fe..1a528680ec5a 100644 --- a/fs/cifs/transport.c +++ b/fs/cifs/transport.c | |||
| @@ -144,9 +144,6 @@ smb_send_kvec(struct TCP_Server_Info *server, struct kvec *iov, size_t n_vec, | |||
| 144 | 144 | ||
| 145 | *sent = 0; | 145 | *sent = 0; |
| 146 | 146 | ||
| 147 | if (ssocket == NULL) | ||
| 148 | return -ENOTSOCK; /* BB eventually add reconnect code here */ | ||
| 149 | |||
| 150 | smb_msg.msg_name = (struct sockaddr *) &server->dstaddr; | 147 | smb_msg.msg_name = (struct sockaddr *) &server->dstaddr; |
| 151 | smb_msg.msg_namelen = sizeof(struct sockaddr); | 148 | smb_msg.msg_namelen = sizeof(struct sockaddr); |
| 152 | smb_msg.msg_control = NULL; | 149 | smb_msg.msg_control = NULL; |
| @@ -291,6 +288,9 @@ smb_send_rqst(struct TCP_Server_Info *server, struct smb_rqst *rqst) | |||
| 291 | struct socket *ssocket = server->ssocket; | 288 | struct socket *ssocket = server->ssocket; |
| 292 | int val = 1; | 289 | int val = 1; |
| 293 | 290 | ||
| 291 | if (ssocket == NULL) | ||
| 292 | return -ENOTSOCK; | ||
| 293 | |||
| 294 | cFYI(1, "Sending smb: smb_len=%u", smb_buf_length); | 294 | cFYI(1, "Sending smb: smb_len=%u", smb_buf_length); |
| 295 | dump_smb(iov[0].iov_base, iov[0].iov_len); | 295 | dump_smb(iov[0].iov_base, iov[0].iov_len); |
| 296 | 296 | ||
diff --git a/fs/ext4/Kconfig b/fs/ext4/Kconfig index 0a475c881852..987358740cb9 100644 --- a/fs/ext4/Kconfig +++ b/fs/ext4/Kconfig | |||
| @@ -41,6 +41,7 @@ config EXT4_USE_FOR_EXT23 | |||
| 41 | 41 | ||
| 42 | config EXT4_FS_POSIX_ACL | 42 | config EXT4_FS_POSIX_ACL |
| 43 | bool "Ext4 POSIX Access Control Lists" | 43 | bool "Ext4 POSIX Access Control Lists" |
| 44 | depends on EXT4_FS | ||
| 44 | select FS_POSIX_ACL | 45 | select FS_POSIX_ACL |
| 45 | help | 46 | help |
| 46 | POSIX Access Control Lists (ACLs) support permissions for users and | 47 | POSIX Access Control Lists (ACLs) support permissions for users and |
| @@ -53,6 +54,7 @@ config EXT4_FS_POSIX_ACL | |||
| 53 | 54 | ||
| 54 | config EXT4_FS_SECURITY | 55 | config EXT4_FS_SECURITY |
| 55 | bool "Ext4 Security Labels" | 56 | bool "Ext4 Security Labels" |
| 57 | depends on EXT4_FS | ||
| 56 | help | 58 | help |
| 57 | Security labels support alternative access control models | 59 | Security labels support alternative access control models |
| 58 | implemented by security modules like SELinux. This option | 60 | implemented by security modules like SELinux. This option |
diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c index 8990165346ee..f9ed946a448e 100644 --- a/fs/ext4/namei.c +++ b/fs/ext4/namei.c | |||
| @@ -722,7 +722,7 @@ dx_probe(const struct qstr *d_name, struct inode *dir, | |||
| 722 | ext4_warning(dir->i_sb, "Node failed checksum"); | 722 | ext4_warning(dir->i_sb, "Node failed checksum"); |
| 723 | brelse(bh); | 723 | brelse(bh); |
| 724 | *err = ERR_BAD_DX_DIR; | 724 | *err = ERR_BAD_DX_DIR; |
| 725 | goto fail; | 725 | goto fail2; |
| 726 | } | 726 | } |
| 727 | set_buffer_verified(bh); | 727 | set_buffer_verified(bh); |
| 728 | 728 | ||
| @@ -2368,7 +2368,6 @@ static int ext4_init_new_dir(handle_t *handle, struct inode *dir, | |||
| 2368 | } | 2368 | } |
| 2369 | 2369 | ||
| 2370 | inode->i_size = EXT4_I(inode)->i_disksize = blocksize; | 2370 | inode->i_size = EXT4_I(inode)->i_disksize = blocksize; |
| 2371 | dir_block = ext4_bread(handle, inode, 0, 1, &err); | ||
| 2372 | if (!(dir_block = ext4_bread(handle, inode, 0, 1, &err))) { | 2371 | if (!(dir_block = ext4_bread(handle, inode, 0, 1, &err))) { |
| 2373 | if (!err) { | 2372 | if (!err) { |
| 2374 | err = -EIO; | 2373 | err = -EIO; |
diff --git a/fs/splice.c b/fs/splice.c index 8890604e3fcd..6909d89d0da5 100644 --- a/fs/splice.c +++ b/fs/splice.c | |||
| @@ -696,8 +696,10 @@ static int pipe_to_sendpage(struct pipe_inode_info *pipe, | |||
| 696 | return -EINVAL; | 696 | return -EINVAL; |
| 697 | 697 | ||
| 698 | more = (sd->flags & SPLICE_F_MORE) ? MSG_MORE : 0; | 698 | more = (sd->flags & SPLICE_F_MORE) ? MSG_MORE : 0; |
| 699 | if (sd->len < sd->total_len) | 699 | |
| 700 | if (sd->len < sd->total_len && pipe->nrbufs > 1) | ||
| 700 | more |= MSG_SENDPAGE_NOTLAST; | 701 | more |= MSG_SENDPAGE_NOTLAST; |
| 702 | |||
| 701 | return file->f_op->sendpage(file, buf->page, buf->offset, | 703 | return file->f_op->sendpage(file, buf->page, buf->offset, |
| 702 | sd->len, &pos, more); | 704 | sd->len, &pos, more); |
| 703 | } | 705 | } |
diff --git a/include/drm/exynos_drm.h b/include/drm/exynos_drm.h index 808dad29607a..d6aeaf3c6d6c 100644 --- a/include/drm/exynos_drm.h +++ b/include/drm/exynos_drm.h | |||
| @@ -6,24 +6,10 @@ | |||
| 6 | * Joonyoung Shim <jy0922.shim@samsung.com> | 6 | * Joonyoung Shim <jy0922.shim@samsung.com> |
| 7 | * Seung-Woo Kim <sw0312.kim@samsung.com> | 7 | * Seung-Woo Kim <sw0312.kim@samsung.com> |
| 8 | * | 8 | * |
| 9 | * Permission is hereby granted, free of charge, to any person obtaining a | 9 | * This program is free software; you can redistribute it and/or modify it |
| 10 | * copy of this software and associated documentation files (the "Software"), | 10 | * under the terms of the GNU General Public License as published by the |
| 11 | * to deal in the Software without restriction, including without limitation | 11 | * Free Software Foundation; either version 2 of the License, or (at your |
| 12 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | 12 | * option) any later version. |
| 13 | * and/or sell copies of the Software, and to permit persons to whom the | ||
| 14 | * Software is furnished to do so, subject to the following conditions: | ||
| 15 | * | ||
| 16 | * The above copyright notice and this permission notice (including the next | ||
| 17 | * paragraph) shall be included in all copies or substantial portions of the | ||
| 18 | * Software. | ||
| 19 | * | ||
| 20 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 21 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 22 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 23 | * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
| 24 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
| 25 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 26 | * OTHER DEALINGS IN THE SOFTWARE. | ||
| 27 | */ | 13 | */ |
| 28 | #ifndef _EXYNOS_DRM_H_ | 14 | #ifndef _EXYNOS_DRM_H_ |
| 29 | #define _EXYNOS_DRM_H_ | 15 | #define _EXYNOS_DRM_H_ |
diff --git a/include/linux/cred.h b/include/linux/cred.h index abb2cd50f6b2..04421e825365 100644 --- a/include/linux/cred.h +++ b/include/linux/cred.h | |||
| @@ -128,7 +128,6 @@ struct cred { | |||
| 128 | struct key *process_keyring; /* keyring private to this process */ | 128 | struct key *process_keyring; /* keyring private to this process */ |
| 129 | struct key *thread_keyring; /* keyring private to this thread */ | 129 | struct key *thread_keyring; /* keyring private to this thread */ |
| 130 | struct key *request_key_auth; /* assumed request_key authority */ | 130 | struct key *request_key_auth; /* assumed request_key authority */ |
| 131 | struct thread_group_cred *tgcred; /* thread-group shared credentials */ | ||
| 132 | #endif | 131 | #endif |
| 133 | #ifdef CONFIG_SECURITY | 132 | #ifdef CONFIG_SECURITY |
| 134 | void *security; /* subjective LSM security */ | 133 | void *security; /* subjective LSM security */ |
diff --git a/include/linux/namei.h b/include/linux/namei.h index e998c030061d..5a5ff57ceed4 100644 --- a/include/linux/namei.h +++ b/include/linux/namei.h | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | #define _LINUX_NAMEI_H | 2 | #define _LINUX_NAMEI_H |
| 3 | 3 | ||
| 4 | #include <linux/dcache.h> | 4 | #include <linux/dcache.h> |
| 5 | #include <linux/errno.h> | ||
| 5 | #include <linux/linkage.h> | 6 | #include <linux/linkage.h> |
| 6 | #include <linux/path.h> | 7 | #include <linux/path.h> |
| 7 | 8 | ||
diff --git a/include/net/netns/conntrack.h b/include/net/netns/conntrack.h index a1d83cc8bf85..923cb20051ed 100644 --- a/include/net/netns/conntrack.h +++ b/include/net/netns/conntrack.h | |||
| @@ -71,6 +71,7 @@ struct netns_ct { | |||
| 71 | struct hlist_head *expect_hash; | 71 | struct hlist_head *expect_hash; |
| 72 | struct hlist_nulls_head unconfirmed; | 72 | struct hlist_nulls_head unconfirmed; |
| 73 | struct hlist_nulls_head dying; | 73 | struct hlist_nulls_head dying; |
| 74 | struct hlist_nulls_head tmpl; | ||
| 74 | struct ip_conntrack_stat __percpu *stat; | 75 | struct ip_conntrack_stat __percpu *stat; |
| 75 | struct nf_ct_event_notifier __rcu *nf_conntrack_event_cb; | 76 | struct nf_ct_event_notifier __rcu *nf_conntrack_event_cb; |
| 76 | struct nf_exp_event_notifier __rcu *nf_expect_event_cb; | 77 | struct nf_exp_event_notifier __rcu *nf_expect_event_cb; |
diff --git a/include/net/netns/x_tables.h b/include/net/netns/x_tables.h index 591db7d657a3..c24060ee411e 100644 --- a/include/net/netns/x_tables.h +++ b/include/net/netns/x_tables.h | |||
| @@ -8,6 +8,7 @@ struct ebt_table; | |||
| 8 | 8 | ||
| 9 | struct netns_xt { | 9 | struct netns_xt { |
| 10 | struct list_head tables[NFPROTO_NUMPROTO]; | 10 | struct list_head tables[NFPROTO_NUMPROTO]; |
| 11 | bool notrack_deprecated_warning; | ||
| 11 | #if defined(CONFIG_BRIDGE_NF_EBTABLES) || \ | 12 | #if defined(CONFIG_BRIDGE_NF_EBTABLES) || \ |
| 12 | defined(CONFIG_BRIDGE_NF_EBTABLES_MODULE) | 13 | defined(CONFIG_BRIDGE_NF_EBTABLES_MODULE) |
| 13 | struct ebt_table *broute_table; | 14 | struct ebt_table *broute_table; |
diff --git a/include/uapi/drm/exynos_drm.h b/include/uapi/drm/exynos_drm.h index e7f52c334005..d5844122ff32 100644 --- a/include/uapi/drm/exynos_drm.h +++ b/include/uapi/drm/exynos_drm.h | |||
| @@ -6,24 +6,10 @@ | |||
| 6 | * Joonyoung Shim <jy0922.shim@samsung.com> | 6 | * Joonyoung Shim <jy0922.shim@samsung.com> |
| 7 | * Seung-Woo Kim <sw0312.kim@samsung.com> | 7 | * Seung-Woo Kim <sw0312.kim@samsung.com> |
| 8 | * | 8 | * |
| 9 | * Permission is hereby granted, free of charge, to any person obtaining a | 9 | * This program is free software; you can redistribute it and/or modify it |
| 10 | * copy of this software and associated documentation files (the "Software"), | 10 | * under the terms of the GNU General Public License as published by the |
| 11 | * to deal in the Software without restriction, including without limitation | 11 | * Free Software Foundation; either version 2 of the License, or (at your |
| 12 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | 12 | * option) any later version. |
| 13 | * and/or sell copies of the Software, and to permit persons to whom the | ||
| 14 | * Software is furnished to do so, subject to the following conditions: | ||
| 15 | * | ||
| 16 | * The above copyright notice and this permission notice (including the next | ||
| 17 | * paragraph) shall be included in all copies or substantial portions of the | ||
| 18 | * Software. | ||
| 19 | * | ||
| 20 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 21 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 22 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 23 | * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
| 24 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
| 25 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 26 | * OTHER DEALINGS IN THE SOFTWARE. | ||
| 27 | */ | 13 | */ |
| 28 | 14 | ||
| 29 | #ifndef _UAPI_EXYNOS_DRM_H_ | 15 | #ifndef _UAPI_EXYNOS_DRM_H_ |
| @@ -185,6 +171,8 @@ enum drm_exynos_flip { | |||
| 185 | EXYNOS_DRM_FLIP_NONE = (0 << 0), | 171 | EXYNOS_DRM_FLIP_NONE = (0 << 0), |
| 186 | EXYNOS_DRM_FLIP_VERTICAL = (1 << 0), | 172 | EXYNOS_DRM_FLIP_VERTICAL = (1 << 0), |
| 187 | EXYNOS_DRM_FLIP_HORIZONTAL = (1 << 1), | 173 | EXYNOS_DRM_FLIP_HORIZONTAL = (1 << 1), |
| 174 | EXYNOS_DRM_FLIP_BOTH = EXYNOS_DRM_FLIP_VERTICAL | | ||
| 175 | EXYNOS_DRM_FLIP_HORIZONTAL, | ||
| 188 | }; | 176 | }; |
| 189 | 177 | ||
| 190 | enum drm_exynos_degree { | 178 | enum drm_exynos_degree { |
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index e5125677efa0..1bbfa0446507 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
| @@ -2899,6 +2899,8 @@ tracing_trace_options_write(struct file *filp, const char __user *ubuf, | |||
| 2899 | if (copy_from_user(&buf, ubuf, cnt)) | 2899 | if (copy_from_user(&buf, ubuf, cnt)) |
| 2900 | return -EFAULT; | 2900 | return -EFAULT; |
| 2901 | 2901 | ||
| 2902 | buf[cnt] = 0; | ||
| 2903 | |||
| 2902 | trace_set_options(buf); | 2904 | trace_set_options(buf); |
| 2903 | 2905 | ||
| 2904 | *ppos += cnt; | 2906 | *ppos += cnt; |
diff --git a/mm/memory.c b/mm/memory.c index 49fb1cf08611..bb1369f7b9b4 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
| @@ -3711,6 +3711,14 @@ retry: | |||
| 3711 | if (pmd_trans_huge(orig_pmd)) { | 3711 | if (pmd_trans_huge(orig_pmd)) { |
| 3712 | unsigned int dirty = flags & FAULT_FLAG_WRITE; | 3712 | unsigned int dirty = flags & FAULT_FLAG_WRITE; |
| 3713 | 3713 | ||
| 3714 | /* | ||
| 3715 | * If the pmd is splitting, return and retry the | ||
| 3716 | * the fault. Alternative: wait until the split | ||
| 3717 | * is done, and goto retry. | ||
| 3718 | */ | ||
| 3719 | if (pmd_trans_splitting(orig_pmd)) | ||
| 3720 | return 0; | ||
| 3721 | |||
| 3714 | if (pmd_numa(orig_pmd)) | 3722 | if (pmd_numa(orig_pmd)) |
| 3715 | return do_huge_pmd_numa_page(mm, vma, address, | 3723 | return do_huge_pmd_numa_page(mm, vma, address, |
| 3716 | orig_pmd, pmd); | 3724 | orig_pmd, pmd); |
diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c index 5391ca43336a..6d6f26531de2 100644 --- a/net/bridge/br_multicast.c +++ b/net/bridge/br_multicast.c | |||
| @@ -1608,7 +1608,6 @@ void br_multicast_init(struct net_bridge *br) | |||
| 1608 | br_multicast_querier_expired, (unsigned long)br); | 1608 | br_multicast_querier_expired, (unsigned long)br); |
| 1609 | setup_timer(&br->multicast_query_timer, br_multicast_query_expired, | 1609 | setup_timer(&br->multicast_query_timer, br_multicast_query_expired, |
| 1610 | (unsigned long)br); | 1610 | (unsigned long)br); |
| 1611 | br_mdb_init(); | ||
| 1612 | } | 1611 | } |
| 1613 | 1612 | ||
| 1614 | void br_multicast_open(struct net_bridge *br) | 1613 | void br_multicast_open(struct net_bridge *br) |
| @@ -1633,7 +1632,6 @@ void br_multicast_stop(struct net_bridge *br) | |||
| 1633 | del_timer_sync(&br->multicast_querier_timer); | 1632 | del_timer_sync(&br->multicast_querier_timer); |
| 1634 | del_timer_sync(&br->multicast_query_timer); | 1633 | del_timer_sync(&br->multicast_query_timer); |
| 1635 | 1634 | ||
| 1636 | br_mdb_uninit(); | ||
| 1637 | spin_lock_bh(&br->multicast_lock); | 1635 | spin_lock_bh(&br->multicast_lock); |
| 1638 | mdb = mlock_dereference(br->mdb, br); | 1636 | mdb = mlock_dereference(br->mdb, br); |
| 1639 | if (!mdb) | 1637 | if (!mdb) |
diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c index 97ba0189c6f7..5dc66abcc9e2 100644 --- a/net/bridge/br_netlink.c +++ b/net/bridge/br_netlink.c | |||
| @@ -299,10 +299,21 @@ struct rtnl_link_ops br_link_ops __read_mostly = { | |||
| 299 | 299 | ||
| 300 | int __init br_netlink_init(void) | 300 | int __init br_netlink_init(void) |
| 301 | { | 301 | { |
| 302 | return rtnl_link_register(&br_link_ops); | 302 | int err; |
| 303 | |||
| 304 | br_mdb_init(); | ||
| 305 | err = rtnl_link_register(&br_link_ops); | ||
| 306 | if (err) | ||
| 307 | goto out; | ||
| 308 | |||
| 309 | return 0; | ||
| 310 | out: | ||
| 311 | br_mdb_uninit(); | ||
| 312 | return err; | ||
| 303 | } | 313 | } |
| 304 | 314 | ||
| 305 | void __exit br_netlink_fini(void) | 315 | void __exit br_netlink_fini(void) |
| 306 | { | 316 | { |
| 317 | br_mdb_uninit(); | ||
| 307 | rtnl_link_unregister(&br_link_ops); | 318 | rtnl_link_unregister(&br_link_ops); |
| 308 | } | 319 | } |
diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h index 8d83be5ffedc..711094aed41a 100644 --- a/net/bridge/br_private.h +++ b/net/bridge/br_private.h | |||
| @@ -526,6 +526,12 @@ static inline bool br_multicast_is_router(struct net_bridge *br) | |||
| 526 | { | 526 | { |
| 527 | return 0; | 527 | return 0; |
| 528 | } | 528 | } |
| 529 | static inline void br_mdb_init(void) | ||
| 530 | { | ||
| 531 | } | ||
| 532 | static inline void br_mdb_uninit(void) | ||
| 533 | { | ||
| 534 | } | ||
| 529 | #endif | 535 | #endif |
| 530 | 536 | ||
| 531 | /* br_netfilter.c */ | 537 | /* br_netfilter.c */ |
diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c index cc06a47f1216..a8e4f2665d5e 100644 --- a/net/ipv4/devinet.c +++ b/net/ipv4/devinet.c | |||
| @@ -823,9 +823,9 @@ int devinet_ioctl(struct net *net, unsigned int cmd, void __user *arg) | |||
| 823 | if (!ifa) { | 823 | if (!ifa) { |
| 824 | ret = -ENOBUFS; | 824 | ret = -ENOBUFS; |
| 825 | ifa = inet_alloc_ifa(); | 825 | ifa = inet_alloc_ifa(); |
| 826 | INIT_HLIST_NODE(&ifa->hash); | ||
| 827 | if (!ifa) | 826 | if (!ifa) |
| 828 | break; | 827 | break; |
| 828 | INIT_HLIST_NODE(&ifa->hash); | ||
| 829 | if (colon) | 829 | if (colon) |
| 830 | memcpy(ifa->ifa_label, ifr.ifr_name, IFNAMSIZ); | 830 | memcpy(ifa->ifa_label, ifr.ifr_name, IFNAMSIZ); |
| 831 | else | 831 | else |
diff --git a/net/ipv4/ipconfig.c b/net/ipv4/ipconfig.c index d763701cff1b..a2e50ae80b53 100644 --- a/net/ipv4/ipconfig.c +++ b/net/ipv4/ipconfig.c | |||
| @@ -136,6 +136,8 @@ __be32 ic_myaddr = NONE; /* My IP address */ | |||
| 136 | static __be32 ic_netmask = NONE; /* Netmask for local subnet */ | 136 | static __be32 ic_netmask = NONE; /* Netmask for local subnet */ |
| 137 | __be32 ic_gateway = NONE; /* Gateway IP address */ | 137 | __be32 ic_gateway = NONE; /* Gateway IP address */ |
| 138 | 138 | ||
| 139 | __be32 ic_addrservaddr = NONE; /* IP Address of the IP addresses'server */ | ||
| 140 | |||
| 139 | __be32 ic_servaddr = NONE; /* Boot server IP address */ | 141 | __be32 ic_servaddr = NONE; /* Boot server IP address */ |
| 140 | 142 | ||
| 141 | __be32 root_server_addr = NONE; /* Address of NFS server */ | 143 | __be32 root_server_addr = NONE; /* Address of NFS server */ |
| @@ -558,6 +560,7 @@ ic_rarp_recv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt | |||
| 558 | if (ic_myaddr == NONE) | 560 | if (ic_myaddr == NONE) |
| 559 | ic_myaddr = tip; | 561 | ic_myaddr = tip; |
| 560 | ic_servaddr = sip; | 562 | ic_servaddr = sip; |
| 563 | ic_addrservaddr = sip; | ||
| 561 | ic_got_reply = IC_RARP; | 564 | ic_got_reply = IC_RARP; |
| 562 | 565 | ||
| 563 | drop_unlock: | 566 | drop_unlock: |
| @@ -1068,7 +1071,7 @@ static int __init ic_bootp_recv(struct sk_buff *skb, struct net_device *dev, str | |||
| 1068 | ic_servaddr = server_id; | 1071 | ic_servaddr = server_id; |
| 1069 | #ifdef IPCONFIG_DEBUG | 1072 | #ifdef IPCONFIG_DEBUG |
| 1070 | printk("DHCP: Offered address %pI4 by server %pI4\n", | 1073 | printk("DHCP: Offered address %pI4 by server %pI4\n", |
| 1071 | &ic_myaddr, &ic_servaddr); | 1074 | &ic_myaddr, &b->iph.saddr); |
| 1072 | #endif | 1075 | #endif |
| 1073 | /* The DHCP indicated server address takes | 1076 | /* The DHCP indicated server address takes |
| 1074 | * precedence over the bootp header one if | 1077 | * precedence over the bootp header one if |
| @@ -1113,6 +1116,7 @@ static int __init ic_bootp_recv(struct sk_buff *skb, struct net_device *dev, str | |||
| 1113 | ic_dev = dev; | 1116 | ic_dev = dev; |
| 1114 | ic_myaddr = b->your_ip; | 1117 | ic_myaddr = b->your_ip; |
| 1115 | ic_servaddr = b->server_ip; | 1118 | ic_servaddr = b->server_ip; |
| 1119 | ic_addrservaddr = b->iph.saddr; | ||
| 1116 | if (ic_gateway == NONE && b->relay_ip) | 1120 | if (ic_gateway == NONE && b->relay_ip) |
| 1117 | ic_gateway = b->relay_ip; | 1121 | ic_gateway = b->relay_ip; |
| 1118 | if (ic_nameservers[0] == NONE) | 1122 | if (ic_nameservers[0] == NONE) |
| @@ -1268,7 +1272,7 @@ static int __init ic_dynamic(void) | |||
| 1268 | printk("IP-Config: Got %s answer from %pI4, ", | 1272 | printk("IP-Config: Got %s answer from %pI4, ", |
| 1269 | ((ic_got_reply & IC_RARP) ? "RARP" | 1273 | ((ic_got_reply & IC_RARP) ? "RARP" |
| 1270 | : (ic_proto_enabled & IC_USE_DHCP) ? "DHCP" : "BOOTP"), | 1274 | : (ic_proto_enabled & IC_USE_DHCP) ? "DHCP" : "BOOTP"), |
| 1271 | &ic_servaddr); | 1275 | &ic_addrservaddr); |
| 1272 | pr_cont("my address is %pI4\n", &ic_myaddr); | 1276 | pr_cont("my address is %pI4\n", &ic_myaddr); |
| 1273 | 1277 | ||
| 1274 | return 0; | 1278 | return 0; |
diff --git a/net/ipv4/netfilter/ipt_REJECT.c b/net/ipv4/netfilter/ipt_REJECT.c index 51f13f8ec724..04b18c1ac345 100644 --- a/net/ipv4/netfilter/ipt_REJECT.c +++ b/net/ipv4/netfilter/ipt_REJECT.c | |||
| @@ -81,6 +81,7 @@ static void send_reset(struct sk_buff *oldskb, int hook) | |||
| 81 | niph->saddr = oiph->daddr; | 81 | niph->saddr = oiph->daddr; |
| 82 | niph->daddr = oiph->saddr; | 82 | niph->daddr = oiph->saddr; |
| 83 | 83 | ||
| 84 | skb_reset_transport_header(nskb); | ||
| 84 | tcph = (struct tcphdr *)skb_put(nskb, sizeof(struct tcphdr)); | 85 | tcph = (struct tcphdr *)skb_put(nskb, sizeof(struct tcphdr)); |
| 85 | memset(tcph, 0, sizeof(*tcph)); | 86 | memset(tcph, 0, sizeof(*tcph)); |
| 86 | tcph->source = oth->dest; | 87 | tcph->source = oth->dest; |
diff --git a/net/ipv4/netfilter/iptable_nat.c b/net/ipv4/netfilter/iptable_nat.c index da2c8a368f68..eeaff7e4acb5 100644 --- a/net/ipv4/netfilter/iptable_nat.c +++ b/net/ipv4/netfilter/iptable_nat.c | |||
| @@ -124,23 +124,28 @@ nf_nat_ipv4_fn(unsigned int hooknum, | |||
| 124 | ret = nf_nat_rule_find(skb, hooknum, in, out, ct); | 124 | ret = nf_nat_rule_find(skb, hooknum, in, out, ct); |
| 125 | if (ret != NF_ACCEPT) | 125 | if (ret != NF_ACCEPT) |
| 126 | return ret; | 126 | return ret; |
| 127 | } else | 127 | } else { |
| 128 | pr_debug("Already setup manip %s for ct %p\n", | 128 | pr_debug("Already setup manip %s for ct %p\n", |
| 129 | maniptype == NF_NAT_MANIP_SRC ? "SRC" : "DST", | 129 | maniptype == NF_NAT_MANIP_SRC ? "SRC" : "DST", |
| 130 | ct); | 130 | ct); |
| 131 | if (nf_nat_oif_changed(hooknum, ctinfo, nat, out)) | ||
| 132 | goto oif_changed; | ||
| 133 | } | ||
| 131 | break; | 134 | break; |
| 132 | 135 | ||
| 133 | default: | 136 | default: |
| 134 | /* ESTABLISHED */ | 137 | /* ESTABLISHED */ |
| 135 | NF_CT_ASSERT(ctinfo == IP_CT_ESTABLISHED || | 138 | NF_CT_ASSERT(ctinfo == IP_CT_ESTABLISHED || |
| 136 | ctinfo == IP_CT_ESTABLISHED_REPLY); | 139 | ctinfo == IP_CT_ESTABLISHED_REPLY); |
| 137 | if (nf_nat_oif_changed(hooknum, ctinfo, nat, out)) { | 140 | if (nf_nat_oif_changed(hooknum, ctinfo, nat, out)) |
| 138 | nf_ct_kill_acct(ct, ctinfo, skb); | 141 | goto oif_changed; |
| 139 | return NF_DROP; | ||
| 140 | } | ||
| 141 | } | 142 | } |
| 142 | 143 | ||
| 143 | return nf_nat_packet(ct, ctinfo, hooknum, skb); | 144 | return nf_nat_packet(ct, ctinfo, hooknum, skb); |
| 145 | |||
| 146 | oif_changed: | ||
| 147 | nf_ct_kill_acct(ct, ctinfo, skb); | ||
| 148 | return NF_DROP; | ||
| 144 | } | 149 | } |
| 145 | 150 | ||
| 146 | static unsigned int | 151 | static unsigned int |
diff --git a/net/ipv6/netfilter/ip6t_NPT.c b/net/ipv6/netfilter/ip6t_NPT.c index e9486915eff6..7302b0b7b642 100644 --- a/net/ipv6/netfilter/ip6t_NPT.c +++ b/net/ipv6/netfilter/ip6t_NPT.c | |||
| @@ -14,42 +14,23 @@ | |||
| 14 | #include <linux/netfilter_ipv6/ip6t_NPT.h> | 14 | #include <linux/netfilter_ipv6/ip6t_NPT.h> |
| 15 | #include <linux/netfilter/x_tables.h> | 15 | #include <linux/netfilter/x_tables.h> |
| 16 | 16 | ||
| 17 | static __sum16 csum16_complement(__sum16 a) | ||
| 18 | { | ||
| 19 | return (__force __sum16)(0xffff - (__force u16)a); | ||
| 20 | } | ||
| 21 | |||
| 22 | static __sum16 csum16_add(__sum16 a, __sum16 b) | ||
| 23 | { | ||
| 24 | u16 sum; | ||
| 25 | |||
| 26 | sum = (__force u16)a + (__force u16)b; | ||
| 27 | sum += (__force u16)a < (__force u16)b; | ||
| 28 | return (__force __sum16)sum; | ||
| 29 | } | ||
| 30 | |||
| 31 | static __sum16 csum16_sub(__sum16 a, __sum16 b) | ||
| 32 | { | ||
| 33 | return csum16_add(a, csum16_complement(b)); | ||
| 34 | } | ||
| 35 | |||
| 36 | static int ip6t_npt_checkentry(const struct xt_tgchk_param *par) | 17 | static int ip6t_npt_checkentry(const struct xt_tgchk_param *par) |
| 37 | { | 18 | { |
| 38 | struct ip6t_npt_tginfo *npt = par->targinfo; | 19 | struct ip6t_npt_tginfo *npt = par->targinfo; |
| 39 | __sum16 src_sum = 0, dst_sum = 0; | 20 | __wsum src_sum = 0, dst_sum = 0; |
| 40 | unsigned int i; | 21 | unsigned int i; |
| 41 | 22 | ||
| 42 | if (npt->src_pfx_len > 64 || npt->dst_pfx_len > 64) | 23 | if (npt->src_pfx_len > 64 || npt->dst_pfx_len > 64) |
| 43 | return -EINVAL; | 24 | return -EINVAL; |
| 44 | 25 | ||
| 45 | for (i = 0; i < ARRAY_SIZE(npt->src_pfx.in6.s6_addr16); i++) { | 26 | for (i = 0; i < ARRAY_SIZE(npt->src_pfx.in6.s6_addr16); i++) { |
| 46 | src_sum = csum16_add(src_sum, | 27 | src_sum = csum_add(src_sum, |
| 47 | (__force __sum16)npt->src_pfx.in6.s6_addr16[i]); | 28 | (__force __wsum)npt->src_pfx.in6.s6_addr16[i]); |
| 48 | dst_sum = csum16_add(dst_sum, | 29 | dst_sum = csum_add(dst_sum, |
| 49 | (__force __sum16)npt->dst_pfx.in6.s6_addr16[i]); | 30 | (__force __wsum)npt->dst_pfx.in6.s6_addr16[i]); |
| 50 | } | 31 | } |
| 51 | 32 | ||
| 52 | npt->adjustment = csum16_sub(src_sum, dst_sum); | 33 | npt->adjustment = (__force __sum16) csum_sub(src_sum, dst_sum); |
| 53 | return 0; | 34 | return 0; |
| 54 | } | 35 | } |
| 55 | 36 | ||
| @@ -85,7 +66,7 @@ static bool ip6t_npt_map_pfx(const struct ip6t_npt_tginfo *npt, | |||
| 85 | return false; | 66 | return false; |
| 86 | } | 67 | } |
| 87 | 68 | ||
| 88 | sum = csum16_add((__force __sum16)addr->s6_addr16[idx], | 69 | sum = (__force __sum16) csum_add((__force __wsum)addr->s6_addr16[idx], |
| 89 | npt->adjustment); | 70 | npt->adjustment); |
| 90 | if (sum == CSUM_MANGLED_0) | 71 | if (sum == CSUM_MANGLED_0) |
| 91 | sum = 0; | 72 | sum = 0; |
diff --git a/net/ipv6/netfilter/ip6t_REJECT.c b/net/ipv6/netfilter/ip6t_REJECT.c index fd4fb34c51c7..029623dbd411 100644 --- a/net/ipv6/netfilter/ip6t_REJECT.c +++ b/net/ipv6/netfilter/ip6t_REJECT.c | |||
| @@ -132,6 +132,7 @@ static void send_reset(struct net *net, struct sk_buff *oldskb) | |||
| 132 | ip6h->saddr = oip6h->daddr; | 132 | ip6h->saddr = oip6h->daddr; |
| 133 | ip6h->daddr = oip6h->saddr; | 133 | ip6h->daddr = oip6h->saddr; |
| 134 | 134 | ||
| 135 | skb_reset_transport_header(nskb); | ||
| 135 | tcph = (struct tcphdr *)skb_put(nskb, sizeof(struct tcphdr)); | 136 | tcph = (struct tcphdr *)skb_put(nskb, sizeof(struct tcphdr)); |
| 136 | /* Truncate to length (no data) */ | 137 | /* Truncate to length (no data) */ |
| 137 | tcph->doff = sizeof(struct tcphdr)/4; | 138 | tcph->doff = sizeof(struct tcphdr)/4; |
diff --git a/net/ipv6/netfilter/ip6table_nat.c b/net/ipv6/netfilter/ip6table_nat.c index 6c8ae24b85eb..e0e788d25b14 100644 --- a/net/ipv6/netfilter/ip6table_nat.c +++ b/net/ipv6/netfilter/ip6table_nat.c | |||
| @@ -127,23 +127,28 @@ nf_nat_ipv6_fn(unsigned int hooknum, | |||
| 127 | ret = nf_nat_rule_find(skb, hooknum, in, out, ct); | 127 | ret = nf_nat_rule_find(skb, hooknum, in, out, ct); |
| 128 | if (ret != NF_ACCEPT) | 128 | if (ret != NF_ACCEPT) |
| 129 | return ret; | 129 | return ret; |
| 130 | } else | 130 | } else { |
| 131 | pr_debug("Already setup manip %s for ct %p\n", | 131 | pr_debug("Already setup manip %s for ct %p\n", |
| 132 | maniptype == NF_NAT_MANIP_SRC ? "SRC" : "DST", | 132 | maniptype == NF_NAT_MANIP_SRC ? "SRC" : "DST", |
| 133 | ct); | 133 | ct); |
| 134 | if (nf_nat_oif_changed(hooknum, ctinfo, nat, out)) | ||
| 135 | goto oif_changed; | ||
| 136 | } | ||
| 134 | break; | 137 | break; |
| 135 | 138 | ||
| 136 | default: | 139 | default: |
| 137 | /* ESTABLISHED */ | 140 | /* ESTABLISHED */ |
| 138 | NF_CT_ASSERT(ctinfo == IP_CT_ESTABLISHED || | 141 | NF_CT_ASSERT(ctinfo == IP_CT_ESTABLISHED || |
| 139 | ctinfo == IP_CT_ESTABLISHED_REPLY); | 142 | ctinfo == IP_CT_ESTABLISHED_REPLY); |
| 140 | if (nf_nat_oif_changed(hooknum, ctinfo, nat, out)) { | 143 | if (nf_nat_oif_changed(hooknum, ctinfo, nat, out)) |
| 141 | nf_ct_kill_acct(ct, ctinfo, skb); | 144 | goto oif_changed; |
| 142 | return NF_DROP; | ||
| 143 | } | ||
| 144 | } | 145 | } |
| 145 | 146 | ||
| 146 | return nf_nat_packet(ct, ctinfo, hooknum, skb); | 147 | return nf_nat_packet(ct, ctinfo, hooknum, skb); |
| 148 | |||
| 149 | oif_changed: | ||
| 150 | nf_ct_kill_acct(ct, ctinfo, skb); | ||
| 151 | return NF_DROP; | ||
| 147 | } | 152 | } |
| 148 | 153 | ||
| 149 | static unsigned int | 154 | static unsigned int |
diff --git a/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c b/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c index 00ee17c3e893..137e245860ab 100644 --- a/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c +++ b/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c | |||
| @@ -81,8 +81,8 @@ static int ipv6_get_l4proto(const struct sk_buff *skb, unsigned int nhoff, | |||
| 81 | } | 81 | } |
| 82 | protoff = ipv6_skip_exthdr(skb, extoff, &nexthdr, &frag_off); | 82 | protoff = ipv6_skip_exthdr(skb, extoff, &nexthdr, &frag_off); |
| 83 | /* | 83 | /* |
| 84 | * (protoff == skb->len) mean that the packet doesn't have no data | 84 | * (protoff == skb->len) means the packet has not data, just |
| 85 | * except of IPv6 & ext headers. but it's tracked anyway. - YK | 85 | * IPv6 and possibly extensions headers, but it is tracked anyway |
| 86 | */ | 86 | */ |
| 87 | if (protoff < 0 || (frag_off & htons(~0x7)) != 0) { | 87 | if (protoff < 0 || (frag_off & htons(~0x7)) != 0) { |
| 88 | pr_debug("ip6_conntrack_core: can't find proto in pkt\n"); | 88 | pr_debug("ip6_conntrack_core: can't find proto in pkt\n"); |
diff --git a/net/ipv6/netfilter/nf_conntrack_reasm.c b/net/ipv6/netfilter/nf_conntrack_reasm.c index 22c8ea951185..3dacecc99065 100644 --- a/net/ipv6/netfilter/nf_conntrack_reasm.c +++ b/net/ipv6/netfilter/nf_conntrack_reasm.c | |||
| @@ -311,7 +311,10 @@ found: | |||
| 311 | else | 311 | else |
| 312 | fq->q.fragments = skb; | 312 | fq->q.fragments = skb; |
| 313 | 313 | ||
| 314 | skb->dev = NULL; | 314 | if (skb->dev) { |
| 315 | fq->iif = skb->dev->ifindex; | ||
| 316 | skb->dev = NULL; | ||
| 317 | } | ||
| 315 | fq->q.stamp = skb->tstamp; | 318 | fq->q.stamp = skb->tstamp; |
| 316 | fq->q.meat += skb->len; | 319 | fq->q.meat += skb->len; |
| 317 | if (payload_len > fq->q.max_size) | 320 | if (payload_len > fq->q.max_size) |
diff --git a/net/iucv/iucv.c b/net/iucv/iucv.c index 3ad1f9db5f8b..df082508362d 100644 --- a/net/iucv/iucv.c +++ b/net/iucv/iucv.c | |||
| @@ -1806,7 +1806,7 @@ static void iucv_external_interrupt(struct ext_code ext_code, | |||
| 1806 | struct iucv_irq_data *p; | 1806 | struct iucv_irq_data *p; |
| 1807 | struct iucv_irq_list *work; | 1807 | struct iucv_irq_list *work; |
| 1808 | 1808 | ||
| 1809 | kstat_cpu(smp_processor_id()).irqs[EXTINT_IUC]++; | 1809 | inc_irq_stat(IRQEXT_IUC); |
| 1810 | p = iucv_irq_data[smp_processor_id()]; | 1810 | p = iucv_irq_data[smp_processor_id()]; |
| 1811 | if (p->ippathid >= iucv_max_pathid) { | 1811 | if (p->ippathid >= iucv_max_pathid) { |
| 1812 | WARN_ON(p->ippathid >= iucv_max_pathid); | 1812 | WARN_ON(p->ippathid >= iucv_max_pathid); |
diff --git a/net/mac802154/wpan.c b/net/mac802154/wpan.c index 1191039c2b1b..199b92261e94 100644 --- a/net/mac802154/wpan.c +++ b/net/mac802154/wpan.c | |||
| @@ -389,7 +389,7 @@ void mac802154_wpan_setup(struct net_device *dev) | |||
| 389 | 389 | ||
| 390 | static int mac802154_process_data(struct net_device *dev, struct sk_buff *skb) | 390 | static int mac802154_process_data(struct net_device *dev, struct sk_buff *skb) |
| 391 | { | 391 | { |
| 392 | return netif_rx(skb); | 392 | return netif_rx_ni(skb); |
| 393 | } | 393 | } |
| 394 | 394 | ||
| 395 | static int | 395 | static int |
diff --git a/net/netfilter/Kconfig b/net/netfilter/Kconfig index fefa514b9917..49e96df5fbc4 100644 --- a/net/netfilter/Kconfig +++ b/net/netfilter/Kconfig | |||
| @@ -680,6 +680,13 @@ config NETFILTER_XT_TARGET_NFQUEUE | |||
| 680 | 680 | ||
| 681 | To compile it as a module, choose M here. If unsure, say N. | 681 | To compile it as a module, choose M here. If unsure, say N. |
| 682 | 682 | ||
| 683 | config NETFILTER_XT_TARGET_NOTRACK | ||
| 684 | tristate '"NOTRACK" target support (DEPRECATED)' | ||
| 685 | depends on NF_CONNTRACK | ||
| 686 | depends on IP_NF_RAW || IP6_NF_RAW | ||
| 687 | depends on NETFILTER_ADVANCED | ||
| 688 | select NETFILTER_XT_TARGET_CT | ||
| 689 | |||
| 683 | config NETFILTER_XT_TARGET_RATEEST | 690 | config NETFILTER_XT_TARGET_RATEEST |
| 684 | tristate '"RATEEST" target support' | 691 | tristate '"RATEEST" target support' |
| 685 | depends on NETFILTER_ADVANCED | 692 | depends on NETFILTER_ADVANCED |
diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c index 08cdc71d8e87..016d95ead930 100644 --- a/net/netfilter/nf_conntrack_core.c +++ b/net/netfilter/nf_conntrack_core.c | |||
| @@ -1526,6 +1526,7 @@ err_extend: | |||
| 1526 | */ | 1526 | */ |
| 1527 | #define UNCONFIRMED_NULLS_VAL ((1<<30)+0) | 1527 | #define UNCONFIRMED_NULLS_VAL ((1<<30)+0) |
| 1528 | #define DYING_NULLS_VAL ((1<<30)+1) | 1528 | #define DYING_NULLS_VAL ((1<<30)+1) |
| 1529 | #define TEMPLATE_NULLS_VAL ((1<<30)+2) | ||
| 1529 | 1530 | ||
| 1530 | static int nf_conntrack_init_net(struct net *net) | 1531 | static int nf_conntrack_init_net(struct net *net) |
| 1531 | { | 1532 | { |
| @@ -1534,6 +1535,7 @@ static int nf_conntrack_init_net(struct net *net) | |||
| 1534 | atomic_set(&net->ct.count, 0); | 1535 | atomic_set(&net->ct.count, 0); |
| 1535 | INIT_HLIST_NULLS_HEAD(&net->ct.unconfirmed, UNCONFIRMED_NULLS_VAL); | 1536 | INIT_HLIST_NULLS_HEAD(&net->ct.unconfirmed, UNCONFIRMED_NULLS_VAL); |
| 1536 | INIT_HLIST_NULLS_HEAD(&net->ct.dying, DYING_NULLS_VAL); | 1537 | INIT_HLIST_NULLS_HEAD(&net->ct.dying, DYING_NULLS_VAL); |
| 1538 | INIT_HLIST_NULLS_HEAD(&net->ct.tmpl, TEMPLATE_NULLS_VAL); | ||
| 1537 | net->ct.stat = alloc_percpu(struct ip_conntrack_stat); | 1539 | net->ct.stat = alloc_percpu(struct ip_conntrack_stat); |
| 1538 | if (!net->ct.stat) { | 1540 | if (!net->ct.stat) { |
| 1539 | ret = -ENOMEM; | 1541 | ret = -ENOMEM; |
diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c index 4e078cd84d83..627b0e50b238 100644 --- a/net/netfilter/nf_conntrack_netlink.c +++ b/net/netfilter/nf_conntrack_netlink.c | |||
| @@ -2624,7 +2624,7 @@ ctnetlink_create_expect(struct net *net, u16 zone, | |||
| 2624 | if (!help) { | 2624 | if (!help) { |
| 2625 | if (!cda[CTA_EXPECT_TIMEOUT]) { | 2625 | if (!cda[CTA_EXPECT_TIMEOUT]) { |
| 2626 | err = -EINVAL; | 2626 | err = -EINVAL; |
| 2627 | goto out; | 2627 | goto err_out; |
| 2628 | } | 2628 | } |
| 2629 | exp->timeout.expires = | 2629 | exp->timeout.expires = |
| 2630 | jiffies + ntohl(nla_get_be32(cda[CTA_EXPECT_TIMEOUT])) * HZ; | 2630 | jiffies + ntohl(nla_get_be32(cda[CTA_EXPECT_TIMEOUT])) * HZ; |
diff --git a/net/netfilter/nfnetlink_log.c b/net/netfilter/nfnetlink_log.c index 9f199f2e31fa..92fd8eca0d31 100644 --- a/net/netfilter/nfnetlink_log.c +++ b/net/netfilter/nfnetlink_log.c | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | */ | 13 | */ |
| 14 | #include <linux/module.h> | 14 | #include <linux/module.h> |
| 15 | #include <linux/skbuff.h> | 15 | #include <linux/skbuff.h> |
| 16 | #include <linux/if_arp.h> | ||
| 16 | #include <linux/init.h> | 17 | #include <linux/init.h> |
| 17 | #include <linux/ip.h> | 18 | #include <linux/ip.h> |
| 18 | #include <linux/ipv6.h> | 19 | #include <linux/ipv6.h> |
| @@ -384,6 +385,7 @@ __build_packet_message(struct nfulnl_instance *inst, | |||
| 384 | struct nfgenmsg *nfmsg; | 385 | struct nfgenmsg *nfmsg; |
| 385 | sk_buff_data_t old_tail = inst->skb->tail; | 386 | sk_buff_data_t old_tail = inst->skb->tail; |
| 386 | struct sock *sk; | 387 | struct sock *sk; |
| 388 | const unsigned char *hwhdrp; | ||
| 387 | 389 | ||
| 388 | nlh = nlmsg_put(inst->skb, 0, 0, | 390 | nlh = nlmsg_put(inst->skb, 0, 0, |
| 389 | NFNL_SUBSYS_ULOG << 8 | NFULNL_MSG_PACKET, | 391 | NFNL_SUBSYS_ULOG << 8 | NFULNL_MSG_PACKET, |
| @@ -485,9 +487,17 @@ __build_packet_message(struct nfulnl_instance *inst, | |||
| 485 | if (indev && skb_mac_header_was_set(skb)) { | 487 | if (indev && skb_mac_header_was_set(skb)) { |
| 486 | if (nla_put_be16(inst->skb, NFULA_HWTYPE, htons(skb->dev->type)) || | 488 | if (nla_put_be16(inst->skb, NFULA_HWTYPE, htons(skb->dev->type)) || |
| 487 | nla_put_be16(inst->skb, NFULA_HWLEN, | 489 | nla_put_be16(inst->skb, NFULA_HWLEN, |
| 488 | htons(skb->dev->hard_header_len)) || | 490 | htons(skb->dev->hard_header_len))) |
| 489 | nla_put(inst->skb, NFULA_HWHEADER, skb->dev->hard_header_len, | 491 | goto nla_put_failure; |
| 490 | skb_mac_header(skb))) | 492 | |
| 493 | hwhdrp = skb_mac_header(skb); | ||
| 494 | |||
| 495 | if (skb->dev->type == ARPHRD_SIT) | ||
| 496 | hwhdrp -= ETH_HLEN; | ||
| 497 | |||
| 498 | if (hwhdrp >= skb->head && | ||
| 499 | nla_put(inst->skb, NFULA_HWHEADER, | ||
| 500 | skb->dev->hard_header_len, hwhdrp)) | ||
| 491 | goto nla_put_failure; | 501 | goto nla_put_failure; |
| 492 | } | 502 | } |
| 493 | 503 | ||
diff --git a/net/netfilter/xt_CT.c b/net/netfilter/xt_CT.c index ae7f5daeee43..2a0843081840 100644 --- a/net/netfilter/xt_CT.c +++ b/net/netfilter/xt_CT.c | |||
| @@ -149,6 +149,10 @@ static int xt_ct_tg_check_v0(const struct xt_tgchk_param *par) | |||
| 149 | 149 | ||
| 150 | __set_bit(IPS_TEMPLATE_BIT, &ct->status); | 150 | __set_bit(IPS_TEMPLATE_BIT, &ct->status); |
| 151 | __set_bit(IPS_CONFIRMED_BIT, &ct->status); | 151 | __set_bit(IPS_CONFIRMED_BIT, &ct->status); |
| 152 | |||
| 153 | /* Overload tuple linked list to put us in template list. */ | ||
| 154 | hlist_nulls_add_head_rcu(&ct->tuplehash[IP_CT_DIR_ORIGINAL].hnnode, | ||
| 155 | &par->net->ct.tmpl); | ||
| 152 | out: | 156 | out: |
| 153 | info->ct = ct; | 157 | info->ct = ct; |
| 154 | return 0; | 158 | return 0; |
| @@ -289,6 +293,10 @@ static int xt_ct_tg_check_v1(const struct xt_tgchk_param *par) | |||
| 289 | 293 | ||
| 290 | __set_bit(IPS_TEMPLATE_BIT, &ct->status); | 294 | __set_bit(IPS_TEMPLATE_BIT, &ct->status); |
| 291 | __set_bit(IPS_CONFIRMED_BIT, &ct->status); | 295 | __set_bit(IPS_CONFIRMED_BIT, &ct->status); |
| 296 | |||
| 297 | /* Overload tuple linked list to put us in template list. */ | ||
| 298 | hlist_nulls_add_head_rcu(&ct->tuplehash[IP_CT_DIR_ORIGINAL].hnnode, | ||
| 299 | &par->net->ct.tmpl); | ||
| 292 | out: | 300 | out: |
| 293 | info->ct = ct; | 301 | info->ct = ct; |
| 294 | return 0; | 302 | return 0; |
| @@ -377,14 +385,60 @@ static struct xt_target xt_ct_tg_reg[] __read_mostly = { | |||
| 377 | }, | 385 | }, |
| 378 | }; | 386 | }; |
| 379 | 387 | ||
| 388 | static unsigned int | ||
| 389 | notrack_tg(struct sk_buff *skb, const struct xt_action_param *par) | ||
| 390 | { | ||
| 391 | /* Previously seen (loopback)? Ignore. */ | ||
| 392 | if (skb->nfct != NULL) | ||
| 393 | return XT_CONTINUE; | ||
| 394 | |||
| 395 | skb->nfct = &nf_ct_untracked_get()->ct_general; | ||
| 396 | skb->nfctinfo = IP_CT_NEW; | ||
| 397 | nf_conntrack_get(skb->nfct); | ||
| 398 | |||
| 399 | return XT_CONTINUE; | ||
| 400 | } | ||
| 401 | |||
| 402 | static int notrack_chk(const struct xt_tgchk_param *par) | ||
| 403 | { | ||
| 404 | if (!par->net->xt.notrack_deprecated_warning) { | ||
| 405 | pr_info("netfilter: NOTRACK target is deprecated, " | ||
| 406 | "use CT instead or upgrade iptables\n"); | ||
| 407 | par->net->xt.notrack_deprecated_warning = true; | ||
| 408 | } | ||
| 409 | return 0; | ||
| 410 | } | ||
| 411 | |||
| 412 | static struct xt_target notrack_tg_reg __read_mostly = { | ||
| 413 | .name = "NOTRACK", | ||
| 414 | .revision = 0, | ||
| 415 | .family = NFPROTO_UNSPEC, | ||
| 416 | .checkentry = notrack_chk, | ||
| 417 | .target = notrack_tg, | ||
| 418 | .table = "raw", | ||
| 419 | .me = THIS_MODULE, | ||
| 420 | }; | ||
| 421 | |||
| 380 | static int __init xt_ct_tg_init(void) | 422 | static int __init xt_ct_tg_init(void) |
| 381 | { | 423 | { |
| 382 | return xt_register_targets(xt_ct_tg_reg, ARRAY_SIZE(xt_ct_tg_reg)); | 424 | int ret; |
| 425 | |||
| 426 | ret = xt_register_target(¬rack_tg_reg); | ||
| 427 | if (ret < 0) | ||
| 428 | return ret; | ||
| 429 | |||
| 430 | ret = xt_register_targets(xt_ct_tg_reg, ARRAY_SIZE(xt_ct_tg_reg)); | ||
| 431 | if (ret < 0) { | ||
| 432 | xt_unregister_target(¬rack_tg_reg); | ||
| 433 | return ret; | ||
| 434 | } | ||
| 435 | return 0; | ||
| 383 | } | 436 | } |
| 384 | 437 | ||
| 385 | static void __exit xt_ct_tg_exit(void) | 438 | static void __exit xt_ct_tg_exit(void) |
| 386 | { | 439 | { |
| 387 | xt_unregister_targets(xt_ct_tg_reg, ARRAY_SIZE(xt_ct_tg_reg)); | 440 | xt_unregister_targets(xt_ct_tg_reg, ARRAY_SIZE(xt_ct_tg_reg)); |
| 441 | xt_unregister_target(¬rack_tg_reg); | ||
| 388 | } | 442 | } |
| 389 | 443 | ||
| 390 | module_init(xt_ct_tg_init); | 444 | module_init(xt_ct_tg_init); |
| @@ -394,3 +448,5 @@ MODULE_LICENSE("GPL"); | |||
| 394 | MODULE_DESCRIPTION("Xtables: connection tracking target"); | 448 | MODULE_DESCRIPTION("Xtables: connection tracking target"); |
| 395 | MODULE_ALIAS("ipt_CT"); | 449 | MODULE_ALIAS("ipt_CT"); |
| 396 | MODULE_ALIAS("ip6t_CT"); | 450 | MODULE_ALIAS("ip6t_CT"); |
| 451 | MODULE_ALIAS("ipt_NOTRACK"); | ||
| 452 | MODULE_ALIAS("ip6t_NOTRACK"); | ||
diff --git a/net/netfilter/xt_hashlimit.c b/net/netfilter/xt_hashlimit.c index 26a668a84aa2..a9d7af953ceb 100644 --- a/net/netfilter/xt_hashlimit.c +++ b/net/netfilter/xt_hashlimit.c | |||
| @@ -157,11 +157,22 @@ dsthash_find(const struct xt_hashlimit_htable *ht, | |||
| 157 | /* allocate dsthash_ent, initialize dst, put in htable and lock it */ | 157 | /* allocate dsthash_ent, initialize dst, put in htable and lock it */ |
| 158 | static struct dsthash_ent * | 158 | static struct dsthash_ent * |
| 159 | dsthash_alloc_init(struct xt_hashlimit_htable *ht, | 159 | dsthash_alloc_init(struct xt_hashlimit_htable *ht, |
| 160 | const struct dsthash_dst *dst) | 160 | const struct dsthash_dst *dst, bool *race) |
| 161 | { | 161 | { |
| 162 | struct dsthash_ent *ent; | 162 | struct dsthash_ent *ent; |
| 163 | 163 | ||
| 164 | spin_lock(&ht->lock); | 164 | spin_lock(&ht->lock); |
| 165 | |||
| 166 | /* Two or more packets may race to create the same entry in the | ||
| 167 | * hashtable, double check if this packet lost race. | ||
| 168 | */ | ||
| 169 | ent = dsthash_find(ht, dst); | ||
| 170 | if (ent != NULL) { | ||
| 171 | spin_unlock(&ht->lock); | ||
| 172 | *race = true; | ||
| 173 | return ent; | ||
| 174 | } | ||
| 175 | |||
| 165 | /* initialize hash with random val at the time we allocate | 176 | /* initialize hash with random val at the time we allocate |
| 166 | * the first hashtable entry */ | 177 | * the first hashtable entry */ |
| 167 | if (unlikely(!ht->rnd_initialized)) { | 178 | if (unlikely(!ht->rnd_initialized)) { |
| @@ -318,7 +329,10 @@ static void htable_destroy(struct xt_hashlimit_htable *hinfo) | |||
| 318 | parent = hashlimit_net->ipt_hashlimit; | 329 | parent = hashlimit_net->ipt_hashlimit; |
| 319 | else | 330 | else |
| 320 | parent = hashlimit_net->ip6t_hashlimit; | 331 | parent = hashlimit_net->ip6t_hashlimit; |
| 321 | remove_proc_entry(hinfo->pde->name, parent); | 332 | |
| 333 | if(parent != NULL) | ||
| 334 | remove_proc_entry(hinfo->pde->name, parent); | ||
| 335 | |||
| 322 | htable_selective_cleanup(hinfo, select_all); | 336 | htable_selective_cleanup(hinfo, select_all); |
| 323 | vfree(hinfo); | 337 | vfree(hinfo); |
| 324 | } | 338 | } |
| @@ -585,6 +599,7 @@ hashlimit_mt(const struct sk_buff *skb, struct xt_action_param *par) | |||
| 585 | unsigned long now = jiffies; | 599 | unsigned long now = jiffies; |
| 586 | struct dsthash_ent *dh; | 600 | struct dsthash_ent *dh; |
| 587 | struct dsthash_dst dst; | 601 | struct dsthash_dst dst; |
| 602 | bool race = false; | ||
| 588 | u32 cost; | 603 | u32 cost; |
| 589 | 604 | ||
| 590 | if (hashlimit_init_dst(hinfo, &dst, skb, par->thoff) < 0) | 605 | if (hashlimit_init_dst(hinfo, &dst, skb, par->thoff) < 0) |
| @@ -593,13 +608,18 @@ hashlimit_mt(const struct sk_buff *skb, struct xt_action_param *par) | |||
| 593 | rcu_read_lock_bh(); | 608 | rcu_read_lock_bh(); |
| 594 | dh = dsthash_find(hinfo, &dst); | 609 | dh = dsthash_find(hinfo, &dst); |
| 595 | if (dh == NULL) { | 610 | if (dh == NULL) { |
| 596 | dh = dsthash_alloc_init(hinfo, &dst); | 611 | dh = dsthash_alloc_init(hinfo, &dst, &race); |
| 597 | if (dh == NULL) { | 612 | if (dh == NULL) { |
| 598 | rcu_read_unlock_bh(); | 613 | rcu_read_unlock_bh(); |
| 599 | goto hotdrop; | 614 | goto hotdrop; |
| 615 | } else if (race) { | ||
| 616 | /* Already got an entry, update expiration timeout */ | ||
| 617 | dh->expires = now + msecs_to_jiffies(hinfo->cfg.expire); | ||
| 618 | rateinfo_recalc(dh, now, hinfo->cfg.mode); | ||
| 619 | } else { | ||
| 620 | dh->expires = jiffies + msecs_to_jiffies(hinfo->cfg.expire); | ||
| 621 | rateinfo_init(dh, hinfo); | ||
| 600 | } | 622 | } |
| 601 | dh->expires = jiffies + msecs_to_jiffies(hinfo->cfg.expire); | ||
| 602 | rateinfo_init(dh, hinfo); | ||
| 603 | } else { | 623 | } else { |
| 604 | /* update expiration timeout */ | 624 | /* update expiration timeout */ |
| 605 | dh->expires = now + msecs_to_jiffies(hinfo->cfg.expire); | 625 | dh->expires = now + msecs_to_jiffies(hinfo->cfg.expire); |
| @@ -856,6 +876,27 @@ static int __net_init hashlimit_proc_net_init(struct net *net) | |||
| 856 | 876 | ||
| 857 | static void __net_exit hashlimit_proc_net_exit(struct net *net) | 877 | static void __net_exit hashlimit_proc_net_exit(struct net *net) |
| 858 | { | 878 | { |
| 879 | struct xt_hashlimit_htable *hinfo; | ||
| 880 | struct hlist_node *pos; | ||
| 881 | struct proc_dir_entry *pde; | ||
| 882 | struct hashlimit_net *hashlimit_net = hashlimit_pernet(net); | ||
| 883 | |||
| 884 | /* recent_net_exit() is called before recent_mt_destroy(). Make sure | ||
| 885 | * that the parent xt_recent proc entry is is empty before trying to | ||
| 886 | * remove it. | ||
| 887 | */ | ||
| 888 | mutex_lock(&hashlimit_mutex); | ||
| 889 | pde = hashlimit_net->ipt_hashlimit; | ||
| 890 | if (pde == NULL) | ||
| 891 | pde = hashlimit_net->ip6t_hashlimit; | ||
| 892 | |||
| 893 | hlist_for_each_entry(hinfo, pos, &hashlimit_net->htables, node) | ||
| 894 | remove_proc_entry(hinfo->pde->name, pde); | ||
| 895 | |||
| 896 | hashlimit_net->ipt_hashlimit = NULL; | ||
| 897 | hashlimit_net->ip6t_hashlimit = NULL; | ||
| 898 | mutex_unlock(&hashlimit_mutex); | ||
| 899 | |||
| 859 | proc_net_remove(net, "ipt_hashlimit"); | 900 | proc_net_remove(net, "ipt_hashlimit"); |
| 860 | #if IS_ENABLED(CONFIG_IP6_NF_IPTABLES) | 901 | #if IS_ENABLED(CONFIG_IP6_NF_IPTABLES) |
| 861 | proc_net_remove(net, "ip6t_hashlimit"); | 902 | proc_net_remove(net, "ip6t_hashlimit"); |
| @@ -872,9 +913,6 @@ static int __net_init hashlimit_net_init(struct net *net) | |||
| 872 | 913 | ||
| 873 | static void __net_exit hashlimit_net_exit(struct net *net) | 914 | static void __net_exit hashlimit_net_exit(struct net *net) |
| 874 | { | 915 | { |
| 875 | struct hashlimit_net *hashlimit_net = hashlimit_pernet(net); | ||
| 876 | |||
| 877 | BUG_ON(!hlist_empty(&hashlimit_net->htables)); | ||
| 878 | hashlimit_proc_net_exit(net); | 916 | hashlimit_proc_net_exit(net); |
| 879 | } | 917 | } |
| 880 | 918 | ||
diff --git a/net/netfilter/xt_recent.c b/net/netfilter/xt_recent.c index 4635c9b00459..978efc9b555a 100644 --- a/net/netfilter/xt_recent.c +++ b/net/netfilter/xt_recent.c | |||
| @@ -29,6 +29,7 @@ | |||
| 29 | #include <linux/skbuff.h> | 29 | #include <linux/skbuff.h> |
| 30 | #include <linux/inet.h> | 30 | #include <linux/inet.h> |
| 31 | #include <linux/slab.h> | 31 | #include <linux/slab.h> |
| 32 | #include <linux/vmalloc.h> | ||
| 32 | #include <net/net_namespace.h> | 33 | #include <net/net_namespace.h> |
| 33 | #include <net/netns/generic.h> | 34 | #include <net/netns/generic.h> |
| 34 | 35 | ||
| @@ -310,6 +311,14 @@ out: | |||
| 310 | return ret; | 311 | return ret; |
| 311 | } | 312 | } |
| 312 | 313 | ||
| 314 | static void recent_table_free(void *addr) | ||
| 315 | { | ||
| 316 | if (is_vmalloc_addr(addr)) | ||
| 317 | vfree(addr); | ||
| 318 | else | ||
| 319 | kfree(addr); | ||
| 320 | } | ||
| 321 | |||
| 313 | static int recent_mt_check(const struct xt_mtchk_param *par, | 322 | static int recent_mt_check(const struct xt_mtchk_param *par, |
| 314 | const struct xt_recent_mtinfo_v1 *info) | 323 | const struct xt_recent_mtinfo_v1 *info) |
| 315 | { | 324 | { |
| @@ -322,6 +331,7 @@ static int recent_mt_check(const struct xt_mtchk_param *par, | |||
| 322 | #endif | 331 | #endif |
| 323 | unsigned int i; | 332 | unsigned int i; |
| 324 | int ret = -EINVAL; | 333 | int ret = -EINVAL; |
| 334 | size_t sz; | ||
| 325 | 335 | ||
| 326 | if (unlikely(!hash_rnd_inited)) { | 336 | if (unlikely(!hash_rnd_inited)) { |
| 327 | get_random_bytes(&hash_rnd, sizeof(hash_rnd)); | 337 | get_random_bytes(&hash_rnd, sizeof(hash_rnd)); |
| @@ -360,8 +370,11 @@ static int recent_mt_check(const struct xt_mtchk_param *par, | |||
| 360 | goto out; | 370 | goto out; |
| 361 | } | 371 | } |
| 362 | 372 | ||
| 363 | t = kzalloc(sizeof(*t) + sizeof(t->iphash[0]) * ip_list_hash_size, | 373 | sz = sizeof(*t) + sizeof(t->iphash[0]) * ip_list_hash_size; |
| 364 | GFP_KERNEL); | 374 | if (sz <= PAGE_SIZE) |
| 375 | t = kzalloc(sz, GFP_KERNEL); | ||
| 376 | else | ||
| 377 | t = vzalloc(sz); | ||
| 365 | if (t == NULL) { | 378 | if (t == NULL) { |
| 366 | ret = -ENOMEM; | 379 | ret = -ENOMEM; |
| 367 | goto out; | 380 | goto out; |
| @@ -377,14 +390,14 @@ static int recent_mt_check(const struct xt_mtchk_param *par, | |||
| 377 | uid = make_kuid(&init_user_ns, ip_list_uid); | 390 | uid = make_kuid(&init_user_ns, ip_list_uid); |
| 378 | gid = make_kgid(&init_user_ns, ip_list_gid); | 391 | gid = make_kgid(&init_user_ns, ip_list_gid); |
| 379 | if (!uid_valid(uid) || !gid_valid(gid)) { | 392 | if (!uid_valid(uid) || !gid_valid(gid)) { |
| 380 | kfree(t); | 393 | recent_table_free(t); |
| 381 | ret = -EINVAL; | 394 | ret = -EINVAL; |
| 382 | goto out; | 395 | goto out; |
| 383 | } | 396 | } |
| 384 | pde = proc_create_data(t->name, ip_list_perms, recent_net->xt_recent, | 397 | pde = proc_create_data(t->name, ip_list_perms, recent_net->xt_recent, |
| 385 | &recent_mt_fops, t); | 398 | &recent_mt_fops, t); |
| 386 | if (pde == NULL) { | 399 | if (pde == NULL) { |
| 387 | kfree(t); | 400 | recent_table_free(t); |
| 388 | ret = -ENOMEM; | 401 | ret = -ENOMEM; |
| 389 | goto out; | 402 | goto out; |
| 390 | } | 403 | } |
| @@ -431,10 +444,11 @@ static void recent_mt_destroy(const struct xt_mtdtor_param *par) | |||
| 431 | list_del(&t->list); | 444 | list_del(&t->list); |
| 432 | spin_unlock_bh(&recent_lock); | 445 | spin_unlock_bh(&recent_lock); |
| 433 | #ifdef CONFIG_PROC_FS | 446 | #ifdef CONFIG_PROC_FS |
| 434 | remove_proc_entry(t->name, recent_net->xt_recent); | 447 | if (recent_net->xt_recent != NULL) |
| 448 | remove_proc_entry(t->name, recent_net->xt_recent); | ||
| 435 | #endif | 449 | #endif |
| 436 | recent_table_flush(t); | 450 | recent_table_flush(t); |
| 437 | kfree(t); | 451 | recent_table_free(t); |
| 438 | } | 452 | } |
| 439 | mutex_unlock(&recent_mutex); | 453 | mutex_unlock(&recent_mutex); |
| 440 | } | 454 | } |
| @@ -615,6 +629,20 @@ static int __net_init recent_proc_net_init(struct net *net) | |||
| 615 | 629 | ||
| 616 | static void __net_exit recent_proc_net_exit(struct net *net) | 630 | static void __net_exit recent_proc_net_exit(struct net *net) |
| 617 | { | 631 | { |
| 632 | struct recent_net *recent_net = recent_pernet(net); | ||
| 633 | struct recent_table *t; | ||
| 634 | |||
| 635 | /* recent_net_exit() is called before recent_mt_destroy(). Make sure | ||
| 636 | * that the parent xt_recent proc entry is is empty before trying to | ||
| 637 | * remove it. | ||
| 638 | */ | ||
| 639 | spin_lock_bh(&recent_lock); | ||
| 640 | list_for_each_entry(t, &recent_net->tables, list) | ||
| 641 | remove_proc_entry(t->name, recent_net->xt_recent); | ||
| 642 | |||
| 643 | recent_net->xt_recent = NULL; | ||
| 644 | spin_unlock_bh(&recent_lock); | ||
| 645 | |||
| 618 | proc_net_remove(net, "xt_recent"); | 646 | proc_net_remove(net, "xt_recent"); |
| 619 | } | 647 | } |
| 620 | #else | 648 | #else |
| @@ -638,9 +666,6 @@ static int __net_init recent_net_init(struct net *net) | |||
| 638 | 666 | ||
| 639 | static void __net_exit recent_net_exit(struct net *net) | 667 | static void __net_exit recent_net_exit(struct net *net) |
| 640 | { | 668 | { |
| 641 | struct recent_net *recent_net = recent_pernet(net); | ||
| 642 | |||
| 643 | BUG_ON(!list_empty(&recent_net->tables)); | ||
| 644 | recent_proc_net_exit(net); | 669 | recent_proc_net_exit(net); |
| 645 | } | 670 | } |
| 646 | 671 | ||
diff --git a/net/sctp/Kconfig b/net/sctp/Kconfig index c26210618e14..7521d944c0fb 100644 --- a/net/sctp/Kconfig +++ b/net/sctp/Kconfig | |||
| @@ -68,7 +68,7 @@ config SCTP_DBG_OBJCNT | |||
| 68 | If unsure, say N | 68 | If unsure, say N |
| 69 | choice | 69 | choice |
| 70 | prompt "Default SCTP cookie HMAC encoding" | 70 | prompt "Default SCTP cookie HMAC encoding" |
| 71 | default SCTP_COOKIE_HMAC_MD5 | 71 | default SCTP_DEFAULT_COOKIE_HMAC_MD5 |
| 72 | help | 72 | help |
| 73 | This option sets the default sctp cookie hmac algorithm | 73 | This option sets the default sctp cookie hmac algorithm |
| 74 | when in doubt select 'md5' | 74 | when in doubt select 'md5' |
diff --git a/sound/oss/pas2_card.c b/sound/oss/pas2_card.c index dabf8a871dcc..7004e24d209f 100644 --- a/sound/oss/pas2_card.c +++ b/sound/oss/pas2_card.c | |||
| @@ -333,6 +333,11 @@ static void __init attach_pas_card(struct address_info *hw_config) | |||
| 333 | { | 333 | { |
| 334 | char temp[100]; | 334 | char temp[100]; |
| 335 | 335 | ||
| 336 | if (pas_model < 0 || | ||
| 337 | pas_model >= ARRAY_SIZE(pas_model_names)) { | ||
| 338 | printk(KERN_ERR "pas2 unrecognized model.\n"); | ||
| 339 | return; | ||
| 340 | } | ||
| 336 | sprintf(temp, | 341 | sprintf(temp, |
| 337 | "%s rev %d", pas_model_names[(int) pas_model], | 342 | "%s rev %d", pas_model_names[(int) pas_model], |
| 338 | pas_read(0x2789)); | 343 | pas_read(0x2789)); |
diff --git a/sound/pci/au88x0/au88x0_synth.c b/sound/pci/au88x0/au88x0_synth.c index 2805e34bd41d..8bef47311e45 100644 --- a/sound/pci/au88x0/au88x0_synth.c +++ b/sound/pci/au88x0/au88x0_synth.c | |||
| @@ -58,7 +58,7 @@ static void vortex_wt_setdsout(vortex_t * vortex, u32 wt, int en) | |||
| 58 | if (en) | 58 | if (en) |
| 59 | temp |= (1 << (wt & 0x1f)); | 59 | temp |= (1 << (wt & 0x1f)); |
| 60 | else | 60 | else |
| 61 | temp &= (1 << ~(wt & 0x1f)); | 61 | temp &= ~(1 << (wt & 0x1f)); |
| 62 | hwwrite(vortex->mmio, WT_DSREG((wt >= 0x20) ? 1 : 0), temp); | 62 | hwwrite(vortex->mmio, WT_DSREG((wt >= 0x20) ? 1 : 0), temp); |
| 63 | } | 63 | } |
| 64 | 64 | ||
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index 8353c77536ac..b8fb0a5adb9b 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c | |||
| @@ -2531,7 +2531,7 @@ static int vmaster_mute_mode_info(struct snd_kcontrol *kcontrol, | |||
| 2531 | struct snd_ctl_elem_info *uinfo) | 2531 | struct snd_ctl_elem_info *uinfo) |
| 2532 | { | 2532 | { |
| 2533 | static const char * const texts[] = { | 2533 | static const char * const texts[] = { |
| 2534 | "Off", "On", "Follow Master" | 2534 | "On", "Off", "Follow Master" |
| 2535 | }; | 2535 | }; |
| 2536 | unsigned int index; | 2536 | unsigned int index; |
| 2537 | 2537 | ||
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 6ee34593774a..71ae23dd7103 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -5992,6 +5992,30 @@ static void alc269_fixup_quanta_mute(struct hda_codec *codec, | |||
| 5992 | spec->automute_hook = alc269_quanta_automute; | 5992 | spec->automute_hook = alc269_quanta_automute; |
| 5993 | } | 5993 | } |
| 5994 | 5994 | ||
| 5995 | /* update mute-LED according to the speaker mute state via mic1 VREF pin */ | ||
| 5996 | static void alc269_fixup_mic1_mute_hook(void *private_data, int enabled) | ||
| 5997 | { | ||
| 5998 | struct hda_codec *codec = private_data; | ||
| 5999 | unsigned int pinval = AC_PINCTL_IN_EN + (enabled ? | ||
| 6000 | AC_PINCTL_VREF_HIZ : AC_PINCTL_VREF_80); | ||
| 6001 | snd_hda_set_pin_ctl_cache(codec, 0x18, pinval); | ||
| 6002 | } | ||
| 6003 | |||
| 6004 | static void alc269_fixup_mic1_mute(struct hda_codec *codec, | ||
| 6005 | const struct alc_fixup *fix, int action) | ||
| 6006 | { | ||
| 6007 | struct alc_spec *spec = codec->spec; | ||
| 6008 | switch (action) { | ||
| 6009 | case ALC_FIXUP_ACT_BUILD: | ||
| 6010 | spec->vmaster_mute.hook = alc269_fixup_mic1_mute_hook; | ||
| 6011 | snd_hda_add_vmaster_hook(codec, &spec->vmaster_mute, true); | ||
| 6012 | /* fallthru */ | ||
| 6013 | case ALC_FIXUP_ACT_INIT: | ||
| 6014 | snd_hda_sync_vmaster_hook(&spec->vmaster_mute); | ||
| 6015 | break; | ||
| 6016 | } | ||
| 6017 | } | ||
| 6018 | |||
| 5995 | /* update mute-LED according to the speaker mute state via mic2 VREF pin */ | 6019 | /* update mute-LED according to the speaker mute state via mic2 VREF pin */ |
| 5996 | static void alc269_fixup_mic2_mute_hook(void *private_data, int enabled) | 6020 | static void alc269_fixup_mic2_mute_hook(void *private_data, int enabled) |
| 5997 | { | 6021 | { |
| @@ -6043,6 +6067,7 @@ enum { | |||
| 6043 | ALC269_FIXUP_DMIC, | 6067 | ALC269_FIXUP_DMIC, |
| 6044 | ALC269VB_FIXUP_AMIC, | 6068 | ALC269VB_FIXUP_AMIC, |
| 6045 | ALC269VB_FIXUP_DMIC, | 6069 | ALC269VB_FIXUP_DMIC, |
| 6070 | ALC269_FIXUP_MIC1_MUTE_LED, | ||
| 6046 | ALC269_FIXUP_MIC2_MUTE_LED, | 6071 | ALC269_FIXUP_MIC2_MUTE_LED, |
| 6047 | ALC269_FIXUP_INV_DMIC, | 6072 | ALC269_FIXUP_INV_DMIC, |
| 6048 | ALC269_FIXUP_LENOVO_DOCK, | 6073 | ALC269_FIXUP_LENOVO_DOCK, |
| @@ -6171,6 +6196,10 @@ static const struct alc_fixup alc269_fixups[] = { | |||
| 6171 | { } | 6196 | { } |
| 6172 | }, | 6197 | }, |
| 6173 | }, | 6198 | }, |
| 6199 | [ALC269_FIXUP_MIC1_MUTE_LED] = { | ||
| 6200 | .type = ALC_FIXUP_FUNC, | ||
| 6201 | .v.func = alc269_fixup_mic1_mute, | ||
| 6202 | }, | ||
| 6174 | [ALC269_FIXUP_MIC2_MUTE_LED] = { | 6203 | [ALC269_FIXUP_MIC2_MUTE_LED] = { |
| 6175 | .type = ALC_FIXUP_FUNC, | 6204 | .type = ALC_FIXUP_FUNC, |
| 6176 | .v.func = alc269_fixup_mic2_mute, | 6205 | .v.func = alc269_fixup_mic2_mute, |
| @@ -6215,6 +6244,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | |||
| 6215 | SND_PCI_QUIRK(0x1025, 0x029b, "Acer 1810TZ", ALC269_FIXUP_INV_DMIC), | 6244 | SND_PCI_QUIRK(0x1025, 0x029b, "Acer 1810TZ", ALC269_FIXUP_INV_DMIC), |
| 6216 | SND_PCI_QUIRK(0x1025, 0x0349, "Acer AOD260", ALC269_FIXUP_INV_DMIC), | 6245 | SND_PCI_QUIRK(0x1025, 0x0349, "Acer AOD260", ALC269_FIXUP_INV_DMIC), |
| 6217 | SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_MIC2_MUTE_LED), | 6246 | SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_MIC2_MUTE_LED), |
| 6247 | SND_PCI_QUIRK(0x103c, 0x1972, "HP Pavilion 17", ALC269_FIXUP_MIC1_MUTE_LED), | ||
| 6218 | SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_DMIC), | 6248 | SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_DMIC), |
| 6219 | SND_PCI_QUIRK(0x1043, 0x1517, "Asus Zenbook UX31A", ALC269VB_FIXUP_DMIC), | 6249 | SND_PCI_QUIRK(0x1043, 0x1517, "Asus Zenbook UX31A", ALC269VB_FIXUP_DMIC), |
| 6220 | SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW), | 6250 | SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW), |
diff --git a/sound/usb/midi.c b/sound/usb/midi.c index c183d34842ac..34b9bb7fe87c 100644 --- a/sound/usb/midi.c +++ b/sound/usb/midi.c | |||
| @@ -2181,10 +2181,6 @@ int snd_usbmidi_create(struct snd_card *card, | |||
| 2181 | umidi->usb_protocol_ops = &snd_usbmidi_novation_ops; | 2181 | umidi->usb_protocol_ops = &snd_usbmidi_novation_ops; |
| 2182 | err = snd_usbmidi_detect_per_port_endpoints(umidi, endpoints); | 2182 | err = snd_usbmidi_detect_per_port_endpoints(umidi, endpoints); |
| 2183 | break; | 2183 | break; |
| 2184 | case QUIRK_MIDI_MBOX2: | ||
| 2185 | umidi->usb_protocol_ops = &snd_usbmidi_midiman_ops; | ||
| 2186 | err = snd_usbmidi_detect_per_port_endpoints(umidi, endpoints); | ||
| 2187 | break; | ||
| 2188 | case QUIRK_MIDI_RAW_BYTES: | 2184 | case QUIRK_MIDI_RAW_BYTES: |
| 2189 | umidi->usb_protocol_ops = &snd_usbmidi_raw_ops; | 2185 | umidi->usb_protocol_ops = &snd_usbmidi_raw_ops; |
| 2190 | /* | 2186 | /* |
diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h index cdcf6b45e8a8..78e845ec65da 100644 --- a/sound/usb/quirks-table.h +++ b/sound/usb/quirks-table.h | |||
| @@ -50,6 +50,28 @@ | |||
| 50 | } | 50 | } |
| 51 | }, | 51 | }, |
| 52 | 52 | ||
| 53 | { | ||
| 54 | /* Creative BT-D1 */ | ||
| 55 | USB_DEVICE(0x041e, 0x0005), | ||
| 56 | .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { | ||
| 57 | .ifnum = 1, | ||
| 58 | .type = QUIRK_AUDIO_FIXED_ENDPOINT, | ||
| 59 | .data = &(const struct audioformat) { | ||
| 60 | .formats = SNDRV_PCM_FMTBIT_S16_LE, | ||
| 61 | .channels = 2, | ||
| 62 | .iface = 1, | ||
| 63 | .altsetting = 1, | ||
| 64 | .altset_idx = 1, | ||
| 65 | .endpoint = 0x03, | ||
| 66 | .ep_attr = USB_ENDPOINT_XFER_ISOC, | ||
| 67 | .attributes = 0, | ||
| 68 | .rates = SNDRV_PCM_RATE_CONTINUOUS, | ||
| 69 | .rate_min = 48000, | ||
| 70 | .rate_max = 48000, | ||
| 71 | } | ||
| 72 | } | ||
| 73 | }, | ||
| 74 | |||
| 53 | /* Creative/Toshiba Multimedia Center SB-0500 */ | 75 | /* Creative/Toshiba Multimedia Center SB-0500 */ |
| 54 | { | 76 | { |
| 55 | USB_DEVICE(0x041e, 0x3048), | 77 | USB_DEVICE(0x041e, 0x3048), |
| @@ -2993,7 +3015,7 @@ YAMAHA_DEVICE(0x7010, "UB99"), | |||
| 2993 | }, | 3015 | }, |
| 2994 | { | 3016 | { |
| 2995 | .ifnum = 6, | 3017 | .ifnum = 6, |
| 2996 | .type = QUIRK_MIDI_MBOX2, | 3018 | .type = QUIRK_MIDI_MIDIMAN, |
| 2997 | .data = &(const struct snd_usb_midi_endpoint_info) { | 3019 | .data = &(const struct snd_usb_midi_endpoint_info) { |
| 2998 | .out_ep = 0x02, | 3020 | .out_ep = 0x02, |
| 2999 | .out_cables = 0x0001, | 3021 | .out_cables = 0x0001, |
diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c index f104c68fe1e0..acc12f004c23 100644 --- a/sound/usb/quirks.c +++ b/sound/usb/quirks.c | |||
| @@ -306,7 +306,6 @@ int snd_usb_create_quirk(struct snd_usb_audio *chip, | |||
| 306 | [QUIRK_MIDI_YAMAHA] = create_any_midi_quirk, | 306 | [QUIRK_MIDI_YAMAHA] = create_any_midi_quirk, |
| 307 | [QUIRK_MIDI_MIDIMAN] = create_any_midi_quirk, | 307 | [QUIRK_MIDI_MIDIMAN] = create_any_midi_quirk, |
| 308 | [QUIRK_MIDI_NOVATION] = create_any_midi_quirk, | 308 | [QUIRK_MIDI_NOVATION] = create_any_midi_quirk, |
| 309 | [QUIRK_MIDI_MBOX2] = create_any_midi_quirk, | ||
| 310 | [QUIRK_MIDI_RAW_BYTES] = create_any_midi_quirk, | 309 | [QUIRK_MIDI_RAW_BYTES] = create_any_midi_quirk, |
| 311 | [QUIRK_MIDI_EMAGIC] = create_any_midi_quirk, | 310 | [QUIRK_MIDI_EMAGIC] = create_any_midi_quirk, |
| 312 | [QUIRK_MIDI_CME] = create_any_midi_quirk, | 311 | [QUIRK_MIDI_CME] = create_any_midi_quirk, |
| @@ -528,11 +527,11 @@ static void mbox2_setup_48_24_magic(struct usb_device *dev) | |||
| 528 | #define MBOX2_BOOT_LOADING 0x01 /* Hard coded into the device */ | 527 | #define MBOX2_BOOT_LOADING 0x01 /* Hard coded into the device */ |
| 529 | #define MBOX2_BOOT_READY 0x02 /* Hard coded into the device */ | 528 | #define MBOX2_BOOT_READY 0x02 /* Hard coded into the device */ |
| 530 | 529 | ||
| 531 | int snd_usb_mbox2_boot_quirk(struct usb_device *dev) | 530 | static int snd_usb_mbox2_boot_quirk(struct usb_device *dev) |
| 532 | { | 531 | { |
| 533 | struct usb_host_config *config = dev->actconfig; | 532 | struct usb_host_config *config = dev->actconfig; |
| 534 | int err; | 533 | int err; |
| 535 | u8 bootresponse; | 534 | u8 bootresponse[12]; |
| 536 | int fwsize; | 535 | int fwsize; |
| 537 | int count; | 536 | int count; |
| 538 | 537 | ||
| @@ -546,20 +545,20 @@ int snd_usb_mbox2_boot_quirk(struct usb_device *dev) | |||
| 546 | snd_printd("usb-audio: Sending Digidesign Mbox 2 boot sequence...\n"); | 545 | snd_printd("usb-audio: Sending Digidesign Mbox 2 boot sequence...\n"); |
| 547 | 546 | ||
| 548 | count = 0; | 547 | count = 0; |
| 549 | bootresponse = MBOX2_BOOT_LOADING; | 548 | bootresponse[0] = MBOX2_BOOT_LOADING; |
| 550 | while ((bootresponse == MBOX2_BOOT_LOADING) && (count < 10)) { | 549 | while ((bootresponse[0] == MBOX2_BOOT_LOADING) && (count < 10)) { |
| 551 | msleep(500); /* 0.5 second delay */ | 550 | msleep(500); /* 0.5 second delay */ |
| 552 | snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), | 551 | snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), |
| 553 | /* Control magic - load onboard firmware */ | 552 | /* Control magic - load onboard firmware */ |
| 554 | 0x85, 0xc0, 0x0001, 0x0000, &bootresponse, 0x0012); | 553 | 0x85, 0xc0, 0x0001, 0x0000, &bootresponse, 0x0012); |
| 555 | if (bootresponse == MBOX2_BOOT_READY) | 554 | if (bootresponse[0] == MBOX2_BOOT_READY) |
| 556 | break; | 555 | break; |
| 557 | snd_printd("usb-audio: device not ready, resending boot sequence...\n"); | 556 | snd_printd("usb-audio: device not ready, resending boot sequence...\n"); |
| 558 | count++; | 557 | count++; |
| 559 | } | 558 | } |
| 560 | 559 | ||
| 561 | if (bootresponse != MBOX2_BOOT_READY) { | 560 | if (bootresponse[0] != MBOX2_BOOT_READY) { |
| 562 | snd_printk(KERN_ERR "usb-audio: Unknown bootresponse=%d, or timed out, ignoring device.\n", bootresponse); | 561 | snd_printk(KERN_ERR "usb-audio: Unknown bootresponse=%d, or timed out, ignoring device.\n", bootresponse[0]); |
| 563 | return -ENODEV; | 562 | return -ENODEV; |
| 564 | } | 563 | } |
| 565 | 564 | ||
| @@ -660,7 +659,6 @@ static int audiophile_skip_setting_quirk(struct snd_usb_audio *chip, | |||
| 660 | return 0; /* keep this altsetting */ | 659 | return 0; /* keep this altsetting */ |
| 661 | } | 660 | } |
| 662 | 661 | ||
| 663 | |||
| 664 | static int fasttrackpro_skip_setting_quirk(struct snd_usb_audio *chip, | 662 | static int fasttrackpro_skip_setting_quirk(struct snd_usb_audio *chip, |
| 665 | int iface, int altno) | 663 | int iface, int altno) |
| 666 | { | 664 | { |
diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h index a8172c119796..1ac3fd9cc5a6 100644 --- a/sound/usb/usbaudio.h +++ b/sound/usb/usbaudio.h | |||
| @@ -76,7 +76,6 @@ enum quirk_type { | |||
| 76 | QUIRK_MIDI_YAMAHA, | 76 | QUIRK_MIDI_YAMAHA, |
| 77 | QUIRK_MIDI_MIDIMAN, | 77 | QUIRK_MIDI_MIDIMAN, |
| 78 | QUIRK_MIDI_NOVATION, | 78 | QUIRK_MIDI_NOVATION, |
| 79 | QUIRK_MIDI_MBOX2, | ||
| 80 | QUIRK_MIDI_RAW_BYTES, | 79 | QUIRK_MIDI_RAW_BYTES, |
| 81 | QUIRK_MIDI_EMAGIC, | 80 | QUIRK_MIDI_EMAGIC, |
| 82 | QUIRK_MIDI_CME, | 81 | QUIRK_MIDI_CME, |
