diff options
author | Olof Johansson <olof@lixom.net> | 2012-11-26 04:09:30 -0500 |
---|---|---|
committer | Olof Johansson <olof@lixom.net> | 2012-11-26 04:09:53 -0500 |
commit | 0dfeada90989833d0144b4df25d2b9ce3746624f (patch) | |
tree | 0773c2f81a94ca99b8b07b0d984754c81fdd16cc | |
parent | d408c5dcc524dfc8e687c443719a3d6be86e2ea0 (diff) | |
parent | 2a18588c0ce336933be3c99c91e74e21db56a0fe (diff) |
Merge tag 'orion_dt_for_3.8' of git://git.infradead.org/users/jcooper/linux into next/dt
From Jason Cooper:
orion dt for v3.8
- ehci-orion dt binding
- gpio-poweroff
- use dt regulators
- move mpp to DT/pinctrl
Depends on:
- orion/boards
- merge conflicts
- keep all 'select's in Kconfig
- remove all #includes in board-*.c
- pinctrl/devel up to:
- 06763c7 pinctrl: mvebu: move to its own directory
* tag 'orion_dt_for_3.8' of git://git.infradead.org/users/jcooper/linux: (211 commits)
ARM: Kirkwood: remove kirkwood_ehci_init() from new boards
ARM: Kirkwood: Add support LED of OpenBlocks A6
ARM: Kirkwood: Convert to EHCI via DT for OpenBlocks A6
ARM: kirkwood: Add NAND partiton map for OpenBlocks A6
ARM: kirkwood: Add support second I2C bus and RTC on OpenBlocks A6
ARM: kirkwood: Add support DT of second I2C bus
ARM: kirkwood: Convert mplcec4 board to pinctrl
ARM: Kirkwood: Convert km_kirkwood to pinctrl
ARM: Kirkwood: support 98DX412x kirkwoods with pinctrl
ARM: Kirkwood: Convert IX2-200 to pinctrl.
ARM: Kirkwood: Convert lsxl boards to pinctrl.
ARM: Kirkwood: Convert ib62x0 to pinctrl.
ARM: Kirkwood: Convert GoFlex Net to pinctrl.
ARM: Kirkwood: Convert dreamplug to pinctrl.
ARM: Kirkwood: Convert dockstar to pinctrl.
ARM: Kirkwood: Convert dnskw to pinctrl
ARM: Kirkwood: Convert iConnect to pinctrl.
ARM: Kirkwood: Convert TS219 to pinctrl.
ARM: Kirkwood: Add DTSI files for pinctrl
ARM: Kirkwood: Make use of mvebu pincltl and gpio drivers
...
Signed-off-by: Olof Johansson <olof@lixom.net>
271 files changed, 5821 insertions, 1952 deletions
diff --git a/Documentation/cgroups/memory.txt b/Documentation/cgroups/memory.txt index c07f7b4fb88d..71c4da413444 100644 --- a/Documentation/cgroups/memory.txt +++ b/Documentation/cgroups/memory.txt | |||
@@ -466,6 +466,10 @@ Note: | |||
466 | 5.3 swappiness | 466 | 5.3 swappiness |
467 | 467 | ||
468 | Similar to /proc/sys/vm/swappiness, but affecting a hierarchy of groups only. | 468 | Similar to /proc/sys/vm/swappiness, but affecting a hierarchy of groups only. |
469 | Please note that unlike the global swappiness, memcg knob set to 0 | ||
470 | really prevents from any swapping even if there is a swap storage | ||
471 | available. This might lead to memcg OOM killer if there are no file | ||
472 | pages to reclaim. | ||
469 | 473 | ||
470 | Following cgroups' swappiness can't be changed. | 474 | Following cgroups' swappiness can't be changed. |
471 | - root cgroup (uses /proc/sys/vm/swappiness). | 475 | - root cgroup (uses /proc/sys/vm/swappiness). |
diff --git a/Documentation/devicetree/bindings/gpio/gpio-poweroff.txt b/Documentation/devicetree/bindings/gpio/gpio-poweroff.txt new file mode 100644 index 000000000000..558cdf3c9abc --- /dev/null +++ b/Documentation/devicetree/bindings/gpio/gpio-poweroff.txt | |||
@@ -0,0 +1,22 @@ | |||
1 | GPIO line that should be set high/low to power off a device | ||
2 | |||
3 | Required properties: | ||
4 | - compatible : should be "gpio-poweroff". | ||
5 | - gpios : The GPIO to set high/low, see "gpios property" in | ||
6 | Documentation/devicetree/bindings/gpio/gpio.txt. If the pin should be | ||
7 | low to power down the board set it to "Active Low", otherwise set | ||
8 | gpio to "Active High". | ||
9 | |||
10 | Optional properties: | ||
11 | - input : Initially configure the GPIO line as an input. Only reconfigure | ||
12 | it to an output when the pm_power_off function is called. If this optional | ||
13 | property is not specified, the GPIO is initialized as an output in its | ||
14 | inactive state. | ||
15 | |||
16 | |||
17 | Examples: | ||
18 | |||
19 | gpio-poweroff { | ||
20 | compatible = "gpio-poweroff"; | ||
21 | gpios = <&gpio 4 0>; /* GPIO 4 Active Low */ | ||
22 | }; | ||
diff --git a/Documentation/devicetree/bindings/gpio/leds-ns2.txt b/Documentation/devicetree/bindings/gpio/leds-ns2.txt new file mode 100644 index 000000000000..aef3aca34d2d --- /dev/null +++ b/Documentation/devicetree/bindings/gpio/leds-ns2.txt | |||
@@ -0,0 +1,26 @@ | |||
1 | Binding for dual-GPIO LED found on Network Space v2 (and parents). | ||
2 | |||
3 | Required properties: | ||
4 | - compatible: "lacie,ns2-leds". | ||
5 | |||
6 | Each LED is represented as a sub-node of the ns2-leds device. | ||
7 | |||
8 | Required sub-node properties: | ||
9 | - cmd-gpio: Command LED GPIO. See OF device-tree GPIO specification. | ||
10 | - slow-gpio: Slow LED GPIO. See OF device-tree GPIO specification. | ||
11 | |||
12 | Optional sub-node properties: | ||
13 | - label: Name for this LED. If omitted, the label is taken from the node name. | ||
14 | - linux,default-trigger: Trigger assigned to the LED. | ||
15 | |||
16 | Example: | ||
17 | |||
18 | ns2-leds { | ||
19 | compatible = "lacie,ns2-leds"; | ||
20 | |||
21 | blue-sata { | ||
22 | label = "ns2:blue:sata"; | ||
23 | slow-gpio = <&gpio0 29 0>; | ||
24 | cmd-gpio = <&gpio0 30 0>; | ||
25 | }; | ||
26 | }; | ||
diff --git a/Documentation/devicetree/bindings/pinctrl/marvell,kirkwood-pinctrl.txt b/Documentation/devicetree/bindings/pinctrl/marvell,kirkwood-pinctrl.txt index 361bccb7ec89..95daf6335c37 100644 --- a/Documentation/devicetree/bindings/pinctrl/marvell,kirkwood-pinctrl.txt +++ b/Documentation/devicetree/bindings/pinctrl/marvell,kirkwood-pinctrl.txt | |||
@@ -7,8 +7,10 @@ Required properties: | |||
7 | - compatible: "marvell,88f6180-pinctrl", | 7 | - compatible: "marvell,88f6180-pinctrl", |
8 | "marvell,88f6190-pinctrl", "marvell,88f6192-pinctrl", | 8 | "marvell,88f6190-pinctrl", "marvell,88f6192-pinctrl", |
9 | "marvell,88f6281-pinctrl", "marvell,88f6282-pinctrl" | 9 | "marvell,88f6281-pinctrl", "marvell,88f6282-pinctrl" |
10 | "marvell,98dx4122-pinctrl" | ||
10 | 11 | ||
11 | This driver supports all kirkwood variants, i.e. 88f6180, 88f619x, and 88f628x. | 12 | This driver supports all kirkwood variants, i.e. 88f6180, 88f619x, and 88f628x. |
13 | It also support the 88f6281-based variant in the 98dx412x Bobcat SoCs. | ||
12 | 14 | ||
13 | Available mpp pins/groups and functions: | 15 | Available mpp pins/groups and functions: |
14 | Note: brackets (x) are not part of the mpp name for marvell,function and given | 16 | Note: brackets (x) are not part of the mpp name for marvell,function and given |
@@ -277,3 +279,40 @@ mpp46 46 gpio, ts(mp10), tdm(fs), lcd(hsync) | |||
277 | mpp47 47 gpio, ts(mp11), tdm(drx), lcd(vsync) | 279 | mpp47 47 gpio, ts(mp11), tdm(drx), lcd(vsync) |
278 | mpp48 48 gpio, ts(mp12), tdm(dtx), lcd(d16) | 280 | mpp48 48 gpio, ts(mp12), tdm(dtx), lcd(d16) |
279 | mpp49 49 gpo, tdm(rx0ql), pex(clkreq), lcd(d17) | 281 | mpp49 49 gpo, tdm(rx0ql), pex(clkreq), lcd(d17) |
282 | |||
283 | * Marvell Bobcat 98dx4122 | ||
284 | |||
285 | name pins functions | ||
286 | ================================================================================ | ||
287 | mpp0 0 gpio, nand(io2), spi(cs) | ||
288 | mpp1 1 gpo, nand(io3), spi(mosi) | ||
289 | mpp2 2 gpo, nand(io4), spi(sck) | ||
290 | mpp3 3 gpo, nand(io5), spi(miso) | ||
291 | mpp4 4 gpio, nand(io6), uart0(rxd) | ||
292 | mpp5 5 gpo, nand(io7), uart0(txd) | ||
293 | mpp6 6 sysrst(out), spi(mosi) | ||
294 | mpp7 7 gpo, pex(rsto), spi(cs) | ||
295 | mpp8 8 gpio, twsi0(sda), uart0(rts), uart1(rts) | ||
296 | mpp9 9 gpio, twsi(sck), uart0(cts), uart1(cts) | ||
297 | mpp10 10 gpo, spi(sck), uart0(txd) | ||
298 | mpp11 11 gpio, spi(miso), uart0(rxd) | ||
299 | mpp13 13 gpio, uart1(txd) | ||
300 | mpp14 14 gpio, uart1(rxd) | ||
301 | mpp15 15 gpio, uart0(rts) | ||
302 | mpp16 16 gpio, uart0(cts) | ||
303 | mpp18 18 gpo, nand(io0) | ||
304 | mpp19 19 gpo, nand(io1) | ||
305 | mpp34 34 gpio | ||
306 | mpp35 35 gpio | ||
307 | mpp36 36 gpio | ||
308 | mpp37 37 gpio | ||
309 | mpp38 38 gpio | ||
310 | mpp39 39 gpio | ||
311 | mpp40 40 gpio | ||
312 | mpp41 41 gpio | ||
313 | mpp42 42 gpio | ||
314 | mpp43 43 gpio | ||
315 | mpp44 44 gpio | ||
316 | mpp45 45 gpio | ||
317 | mpp49 49 gpio | ||
318 | |||
diff --git a/Documentation/devicetree/bindings/usb/ehci-orion.txt b/Documentation/devicetree/bindings/usb/ehci-orion.txt new file mode 100644 index 000000000000..6bc09ec14c4d --- /dev/null +++ b/Documentation/devicetree/bindings/usb/ehci-orion.txt | |||
@@ -0,0 +1,15 @@ | |||
1 | * EHCI controller, Orion Marvell variants | ||
2 | |||
3 | Required properties: | ||
4 | - compatible: must be "marvell,orion-ehci" | ||
5 | - reg: physical base address of the controller and length of memory mapped | ||
6 | region. | ||
7 | - interrupts: The EHCI interrupt | ||
8 | |||
9 | Example: | ||
10 | |||
11 | ehci@50000 { | ||
12 | compatible = "marvell,orion-ehci"; | ||
13 | reg = <0x50000 0x1000>; | ||
14 | interrupts = <19>; | ||
15 | }; | ||
diff --git a/Documentation/filesystems/proc.txt b/Documentation/filesystems/proc.txt index a1793d670cd0..3844d21d6ca3 100644 --- a/Documentation/filesystems/proc.txt +++ b/Documentation/filesystems/proc.txt | |||
@@ -33,7 +33,7 @@ Table of Contents | |||
33 | 2 Modifying System Parameters | 33 | 2 Modifying System Parameters |
34 | 34 | ||
35 | 3 Per-Process Parameters | 35 | 3 Per-Process Parameters |
36 | 3.1 /proc/<pid>/oom_score_adj - Adjust the oom-killer | 36 | 3.1 /proc/<pid>/oom_adj & /proc/<pid>/oom_score_adj - Adjust the oom-killer |
37 | score | 37 | score |
38 | 3.2 /proc/<pid>/oom_score - Display current oom-killer score | 38 | 3.2 /proc/<pid>/oom_score - Display current oom-killer score |
39 | 3.3 /proc/<pid>/io - Display the IO accounting fields | 39 | 3.3 /proc/<pid>/io - Display the IO accounting fields |
@@ -1320,10 +1320,10 @@ of the kernel. | |||
1320 | CHAPTER 3: PER-PROCESS PARAMETERS | 1320 | CHAPTER 3: PER-PROCESS PARAMETERS |
1321 | ------------------------------------------------------------------------------ | 1321 | ------------------------------------------------------------------------------ |
1322 | 1322 | ||
1323 | 3.1 /proc/<pid>/oom_score_adj- Adjust the oom-killer score | 1323 | 3.1 /proc/<pid>/oom_adj & /proc/<pid>/oom_score_adj- Adjust the oom-killer score |
1324 | -------------------------------------------------------------------------------- | 1324 | -------------------------------------------------------------------------------- |
1325 | 1325 | ||
1326 | This file can be used to adjust the badness heuristic used to select which | 1326 | These file can be used to adjust the badness heuristic used to select which |
1327 | process gets killed in out of memory conditions. | 1327 | process gets killed in out of memory conditions. |
1328 | 1328 | ||
1329 | The badness heuristic assigns a value to each candidate task ranging from 0 | 1329 | The badness heuristic assigns a value to each candidate task ranging from 0 |
@@ -1361,6 +1361,12 @@ same system, cpuset, mempolicy, or memory controller resources to use at least | |||
1361 | equivalent to discounting 50% of the task's allowed memory from being considered | 1361 | equivalent to discounting 50% of the task's allowed memory from being considered |
1362 | as scoring against the task. | 1362 | as scoring against the task. |
1363 | 1363 | ||
1364 | For backwards compatibility with previous kernels, /proc/<pid>/oom_adj may also | ||
1365 | be used to tune the badness score. Its acceptable values range from -16 | ||
1366 | (OOM_ADJUST_MIN) to +15 (OOM_ADJUST_MAX) and a special value of -17 | ||
1367 | (OOM_DISABLE) to disable oom killing entirely for that task. Its value is | ||
1368 | scaled linearly with /proc/<pid>/oom_score_adj. | ||
1369 | |||
1364 | The value of /proc/<pid>/oom_score_adj may be reduced no lower than the last | 1370 | The value of /proc/<pid>/oom_score_adj may be reduced no lower than the last |
1365 | value set by a CAP_SYS_RESOURCE process. To reduce the value any lower | 1371 | value set by a CAP_SYS_RESOURCE process. To reduce the value any lower |
1366 | requires CAP_SYS_RESOURCE. | 1372 | requires CAP_SYS_RESOURCE. |
@@ -1375,7 +1381,9 @@ minimal amount of work. | |||
1375 | ------------------------------------------------------------- | 1381 | ------------------------------------------------------------- |
1376 | 1382 | ||
1377 | This file can be used to check the current score used by the oom-killer is for | 1383 | This file can be used to check the current score used by the oom-killer is for |
1378 | any given <pid>. | 1384 | any given <pid>. Use it together with /proc/<pid>/oom_score_adj to tune which |
1385 | process should be killed in an out-of-memory situation. | ||
1386 | |||
1379 | 1387 | ||
1380 | 3.3 /proc/<pid>/io - Display the IO accounting fields | 1388 | 3.3 /proc/<pid>/io - Display the IO accounting fields |
1381 | ------------------------------------------------------- | 1389 | ------------------------------------------------------- |
diff --git a/Documentation/networking/netdev-features.txt b/Documentation/networking/netdev-features.txt index 4164f5c02e4b..f310edec8a77 100644 --- a/Documentation/networking/netdev-features.txt +++ b/Documentation/networking/netdev-features.txt | |||
@@ -164,4 +164,4 @@ read the CRC recorded by the NIC on receipt of the packet. | |||
164 | This requests that the NIC receive all possible frames, including errored | 164 | This requests that the NIC receive all possible frames, including errored |
165 | frames (such as bad FCS, etc). This can be helpful when sniffing a link with | 165 | frames (such as bad FCS, etc). This can be helpful when sniffing a link with |
166 | bad packets on it. Some NICs may receive more packets if also put into normal | 166 | bad packets on it. Some NICs may receive more packets if also put into normal |
167 | PROMISC mdoe. | 167 | PROMISC mode. |
diff --git a/Documentation/pinctrl.txt b/Documentation/pinctrl.txt index 3b4ee5328868..a1cd2f9428d7 100644 --- a/Documentation/pinctrl.txt +++ b/Documentation/pinctrl.txt | |||
@@ -1193,4 +1193,6 @@ foo_switch() | |||
1193 | ... | 1193 | ... |
1194 | } | 1194 | } |
1195 | 1195 | ||
1196 | The above has to be done from process context. | 1196 | The above has to be done from process context. The reservation of the pins |
1197 | will be done when the state is activated, so in effect one specific pin | ||
1198 | can be used by different functions at different times on a running system. | ||
diff --git a/MAINTAINERS b/MAINTAINERS index 99199e63f349..f77a903fd1c5 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -3597,6 +3597,49 @@ F: drivers/hid/hid-hyperv.c | |||
3597 | F: drivers/net/hyperv/ | 3597 | F: drivers/net/hyperv/ |
3598 | F: drivers/staging/hv/ | 3598 | F: drivers/staging/hv/ |
3599 | 3599 | ||
3600 | I2C OVER PARALLEL PORT | ||
3601 | M: Jean Delvare <khali@linux-fr.org> | ||
3602 | L: linux-i2c@vger.kernel.org | ||
3603 | S: Maintained | ||
3604 | F: Documentation/i2c/busses/i2c-parport | ||
3605 | F: Documentation/i2c/busses/i2c-parport-light | ||
3606 | F: drivers/i2c/busses/i2c-parport.c | ||
3607 | F: drivers/i2c/busses/i2c-parport-light.c | ||
3608 | |||
3609 | I2C/SMBUS CONTROLLER DRIVERS FOR PC | ||
3610 | M: Jean Delvare <khali@linux-fr.org> | ||
3611 | L: linux-i2c@vger.kernel.org | ||
3612 | S: Maintained | ||
3613 | F: Documentation/i2c/busses/i2c-ali1535 | ||
3614 | F: Documentation/i2c/busses/i2c-ali1563 | ||
3615 | F: Documentation/i2c/busses/i2c-ali15x3 | ||
3616 | F: Documentation/i2c/busses/i2c-amd756 | ||
3617 | F: Documentation/i2c/busses/i2c-amd8111 | ||
3618 | F: Documentation/i2c/busses/i2c-i801 | ||
3619 | F: Documentation/i2c/busses/i2c-nforce2 | ||
3620 | F: Documentation/i2c/busses/i2c-piix4 | ||
3621 | F: Documentation/i2c/busses/i2c-sis5595 | ||
3622 | F: Documentation/i2c/busses/i2c-sis630 | ||
3623 | F: Documentation/i2c/busses/i2c-sis96x | ||
3624 | F: Documentation/i2c/busses/i2c-via | ||
3625 | F: Documentation/i2c/busses/i2c-viapro | ||
3626 | F: drivers/i2c/busses/i2c-ali1535.c | ||
3627 | F: drivers/i2c/busses/i2c-ali1563.c | ||
3628 | F: drivers/i2c/busses/i2c-ali15x3.c | ||
3629 | F: drivers/i2c/busses/i2c-amd756.c | ||
3630 | F: drivers/i2c/busses/i2c-amd756-s4882.c | ||
3631 | F: drivers/i2c/busses/i2c-amd8111.c | ||
3632 | F: drivers/i2c/busses/i2c-i801.c | ||
3633 | F: drivers/i2c/busses/i2c-isch.c | ||
3634 | F: drivers/i2c/busses/i2c-nforce2.c | ||
3635 | F: drivers/i2c/busses/i2c-nforce2-s4985.c | ||
3636 | F: drivers/i2c/busses/i2c-piix4.c | ||
3637 | F: drivers/i2c/busses/i2c-sis5595.c | ||
3638 | F: drivers/i2c/busses/i2c-sis630.c | ||
3639 | F: drivers/i2c/busses/i2c-sis96x.c | ||
3640 | F: drivers/i2c/busses/i2c-via.c | ||
3641 | F: drivers/i2c/busses/i2c-viapro.c | ||
3642 | |||
3600 | I2C/SMBUS STUB DRIVER | 3643 | I2C/SMBUS STUB DRIVER |
3601 | M: "Mark M. Hoffman" <mhoffman@lightlink.com> | 3644 | M: "Mark M. Hoffman" <mhoffman@lightlink.com> |
3602 | L: linux-i2c@vger.kernel.org | 3645 | L: linux-i2c@vger.kernel.org |
@@ -3604,9 +3647,8 @@ S: Maintained | |||
3604 | F: drivers/i2c/busses/i2c-stub.c | 3647 | F: drivers/i2c/busses/i2c-stub.c |
3605 | 3648 | ||
3606 | I2C SUBSYSTEM | 3649 | I2C SUBSYSTEM |
3607 | M: "Jean Delvare (PC drivers, core)" <khali@linux-fr.org> | 3650 | M: Wolfram Sang <w.sang@pengutronix.de> |
3608 | M: "Ben Dooks (embedded platforms)" <ben-linux@fluff.org> | 3651 | M: "Ben Dooks (embedded platforms)" <ben-linux@fluff.org> |
3609 | M: "Wolfram Sang (embedded platforms)" <w.sang@pengutronix.de> | ||
3610 | L: linux-i2c@vger.kernel.org | 3652 | L: linux-i2c@vger.kernel.org |
3611 | W: http://i2c.wiki.kernel.org/ | 3653 | W: http://i2c.wiki.kernel.org/ |
3612 | T: quilt kernel.org/pub/linux/kernel/people/jdelvare/linux-2.6/jdelvare-i2c/ | 3654 | T: quilt kernel.org/pub/linux/kernel/people/jdelvare/linux-2.6/jdelvare-i2c/ |
@@ -3617,6 +3659,13 @@ F: drivers/i2c/ | |||
3617 | F: include/linux/i2c.h | 3659 | F: include/linux/i2c.h |
3618 | F: include/linux/i2c-*.h | 3660 | F: include/linux/i2c-*.h |
3619 | 3661 | ||
3662 | I2C-TAOS-EVM DRIVER | ||
3663 | M: Jean Delvare <khali@linux-fr.org> | ||
3664 | L: linux-i2c@vger.kernel.org | ||
3665 | S: Maintained | ||
3666 | F: Documentation/i2c/busses/i2c-taos-evm | ||
3667 | F: drivers/i2c/busses/i2c-taos-evm.c | ||
3668 | |||
3620 | I2C-TINY-USB DRIVER | 3669 | I2C-TINY-USB DRIVER |
3621 | M: Till Harbaum <till@harbaum.org> | 3670 | M: Till Harbaum <till@harbaum.org> |
3622 | L: linux-i2c@vger.kernel.org | 3671 | L: linux-i2c@vger.kernel.org |
@@ -7209,6 +7258,14 @@ L: linux-xtensa@linux-xtensa.org | |||
7209 | S: Maintained | 7258 | S: Maintained |
7210 | F: arch/xtensa/ | 7259 | F: arch/xtensa/ |
7211 | 7260 | ||
7261 | THERMAL | ||
7262 | M: Zhang Rui <rui.zhang@intel.com> | ||
7263 | L: linux-pm@vger.kernel.org | ||
7264 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/rzhang/linux.git | ||
7265 | S: Supported | ||
7266 | F: drivers/thermal/ | ||
7267 | F: include/linux/thermal.h | ||
7268 | |||
7212 | THINKPAD ACPI EXTRAS DRIVER | 7269 | THINKPAD ACPI EXTRAS DRIVER |
7213 | M: Henrique de Moraes Holschuh <ibm-acpi@hmh.eng.br> | 7270 | M: Henrique de Moraes Holschuh <ibm-acpi@hmh.eng.br> |
7214 | L: ibm-acpi-devel@lists.sourceforge.net | 7271 | L: ibm-acpi-devel@lists.sourceforge.net |
@@ -7886,13 +7943,6 @@ M: Roger Luethi <rl@hellgate.ch> | |||
7886 | S: Maintained | 7943 | S: Maintained |
7887 | F: drivers/net/ethernet/via/via-rhine.c | 7944 | F: drivers/net/ethernet/via/via-rhine.c |
7888 | 7945 | ||
7889 | VIAPRO SMBUS DRIVER | ||
7890 | M: Jean Delvare <khali@linux-fr.org> | ||
7891 | L: linux-i2c@vger.kernel.org | ||
7892 | S: Maintained | ||
7893 | F: Documentation/i2c/busses/i2c-viapro | ||
7894 | F: drivers/i2c/busses/i2c-viapro.c | ||
7895 | |||
7896 | VIA SD/MMC CARD CONTROLLER DRIVER | 7946 | VIA SD/MMC CARD CONTROLLER DRIVER |
7897 | M: Bruce Chang <brucechang@via.com.tw> | 7947 | M: Bruce Chang <brucechang@via.com.tw> |
7898 | M: Harald Welte <HaraldWelte@viatech.com> | 7948 | M: Harald Welte <HaraldWelte@viatech.com> |
@@ -1,7 +1,7 @@ | |||
1 | VERSION = 3 | 1 | VERSION = 3 |
2 | PATCHLEVEL = 7 | 2 | PATCHLEVEL = 7 |
3 | SUBLEVEL = 0 | 3 | SUBLEVEL = 0 |
4 | EXTRAVERSION = -rc5 | 4 | EXTRAVERSION = -rc6 |
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 dbbe74c10b1c..f88fce5e9772 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -523,6 +523,8 @@ config ARCH_DOVE | |||
523 | select CPU_V7 | 523 | select CPU_V7 |
524 | select GENERIC_CLOCKEVENTS | 524 | select GENERIC_CLOCKEVENTS |
525 | select MIGHT_HAVE_PCI | 525 | select MIGHT_HAVE_PCI |
526 | select PINCTRL | ||
527 | select PINCTRL_DOVE | ||
526 | select PLAT_ORION_LEGACY | 528 | select PLAT_ORION_LEGACY |
527 | select USB_ARCH_HAS_EHCI | 529 | select USB_ARCH_HAS_EHCI |
528 | help | 530 | help |
@@ -534,6 +536,8 @@ config ARCH_KIRKWOOD | |||
534 | select CPU_FEROCEON | 536 | select CPU_FEROCEON |
535 | select GENERIC_CLOCKEVENTS | 537 | select GENERIC_CLOCKEVENTS |
536 | select PCI | 538 | select PCI |
539 | select PINCTRL | ||
540 | select PINCTRL_KIRKWOOD | ||
537 | select PLAT_ORION_LEGACY | 541 | select PLAT_ORION_LEGACY |
538 | help | 542 | help |
539 | Support for the following Marvell Kirkwood series SoCs: | 543 | Support for the following Marvell Kirkwood series SoCs: |
diff --git a/arch/arm/boot/Makefile b/arch/arm/boot/Makefile index f2aa09eb658e..9137df539b61 100644 --- a/arch/arm/boot/Makefile +++ b/arch/arm/boot/Makefile | |||
@@ -33,7 +33,7 @@ ifeq ($(CONFIG_XIP_KERNEL),y) | |||
33 | 33 | ||
34 | $(obj)/xipImage: vmlinux FORCE | 34 | $(obj)/xipImage: vmlinux FORCE |
35 | $(call if_changed,objcopy) | 35 | $(call if_changed,objcopy) |
36 | $(kecho) ' Kernel: $@ is ready (physical address: $(CONFIG_XIP_PHYS_ADDR))' | 36 | @$(kecho) ' Kernel: $@ is ready (physical address: $(CONFIG_XIP_PHYS_ADDR))' |
37 | 37 | ||
38 | $(obj)/Image $(obj)/zImage: FORCE | 38 | $(obj)/Image $(obj)/zImage: FORCE |
39 | @echo 'Kernel configured for XIP (CONFIG_XIP_KERNEL=y)' | 39 | @echo 'Kernel configured for XIP (CONFIG_XIP_KERNEL=y)' |
@@ -48,14 +48,14 @@ $(obj)/xipImage: FORCE | |||
48 | 48 | ||
49 | $(obj)/Image: vmlinux FORCE | 49 | $(obj)/Image: vmlinux FORCE |
50 | $(call if_changed,objcopy) | 50 | $(call if_changed,objcopy) |
51 | $(kecho) ' Kernel: $@ is ready' | 51 | @$(kecho) ' Kernel: $@ is ready' |
52 | 52 | ||
53 | $(obj)/compressed/vmlinux: $(obj)/Image FORCE | 53 | $(obj)/compressed/vmlinux: $(obj)/Image FORCE |
54 | $(Q)$(MAKE) $(build)=$(obj)/compressed $@ | 54 | $(Q)$(MAKE) $(build)=$(obj)/compressed $@ |
55 | 55 | ||
56 | $(obj)/zImage: $(obj)/compressed/vmlinux FORCE | 56 | $(obj)/zImage: $(obj)/compressed/vmlinux FORCE |
57 | $(call if_changed,objcopy) | 57 | $(call if_changed,objcopy) |
58 | $(kecho) ' Kernel: $@ is ready' | 58 | @$(kecho) ' Kernel: $@ is ready' |
59 | 59 | ||
60 | endif | 60 | endif |
61 | 61 | ||
@@ -90,7 +90,7 @@ fi | |||
90 | $(obj)/uImage: $(obj)/zImage FORCE | 90 | $(obj)/uImage: $(obj)/zImage FORCE |
91 | @$(check_for_multiple_loadaddr) | 91 | @$(check_for_multiple_loadaddr) |
92 | $(call if_changed,uimage) | 92 | $(call if_changed,uimage) |
93 | $(kecho) ' Image $@ is ready' | 93 | @$(kecho) ' Image $@ is ready' |
94 | 94 | ||
95 | $(obj)/bootp/bootp: $(obj)/zImage initrd FORCE | 95 | $(obj)/bootp/bootp: $(obj)/zImage initrd FORCE |
96 | $(Q)$(MAKE) $(build)=$(obj)/bootp $@ | 96 | $(Q)$(MAKE) $(build)=$(obj)/bootp $@ |
@@ -98,7 +98,7 @@ $(obj)/bootp/bootp: $(obj)/zImage initrd FORCE | |||
98 | 98 | ||
99 | $(obj)/bootpImage: $(obj)/bootp/bootp FORCE | 99 | $(obj)/bootpImage: $(obj)/bootp/bootp FORCE |
100 | $(call if_changed,objcopy) | 100 | $(call if_changed,objcopy) |
101 | $(kecho) ' Kernel: $@ is ready' | 101 | @$(kecho) ' Kernel: $@ is ready' |
102 | 102 | ||
103 | PHONY += initrd FORCE | 103 | PHONY += initrd FORCE |
104 | initrd: | 104 | initrd: |
diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile index a31211904e91..d9cf7340572f 100644 --- a/arch/arm/boot/dts/Makefile +++ b/arch/arm/boot/dts/Makefile | |||
@@ -40,11 +40,20 @@ dtb-$(CONFIG_ARCH_KIRKWOOD) += kirkwood-dns320.dtb \ | |||
40 | kirkwood-ib62x0.dtb \ | 40 | kirkwood-ib62x0.dtb \ |
41 | kirkwood-iconnect.dtb \ | 41 | kirkwood-iconnect.dtb \ |
42 | kirkwood-iomega_ix2_200.dtb \ | 42 | kirkwood-iomega_ix2_200.dtb \ |
43 | kirkwood-is2.dtb \ | ||
43 | kirkwood-km_kirkwood.dtb \ | 44 | kirkwood-km_kirkwood.dtb \ |
44 | kirkwood-lschlv2.dtb \ | 45 | kirkwood-lschlv2.dtb \ |
45 | kirkwood-lsxhl.dtb \ | 46 | kirkwood-lsxhl.dtb \ |
47 | kirkwood-mplcec4.dtb \ | ||
48 | kirkwood-ns2.dtb \ | ||
49 | kirkwood-ns2lite.dtb \ | ||
50 | kirkwood-ns2max.dtb \ | ||
51 | kirkwood-ns2mini.dtb \ | ||
52 | kirkwood-nsa310.dtb \ | ||
53 | kirkwood-topkick.dtb \ | ||
46 | kirkwood-ts219-6281.dtb \ | 54 | kirkwood-ts219-6281.dtb \ |
47 | kirkwood-ts219-6282.dtb | 55 | kirkwood-ts219-6282.dtb \ |
56 | kirkwood-openblocks_a6.dtb | ||
48 | dtb-$(CONFIG_ARCH_MSM) += msm8660-surf.dtb \ | 57 | dtb-$(CONFIG_ARCH_MSM) += msm8660-surf.dtb \ |
49 | msm8960-cdp.dtb | 58 | msm8960-cdp.dtb |
50 | dtb-$(CONFIG_ARCH_MVEBU) += armada-370-db.dtb \ | 59 | dtb-$(CONFIG_ARCH_MVEBU) += armada-370-db.dtb \ |
@@ -83,6 +92,7 @@ dtb-$(CONFIG_ARCH_OMAP2PLUS) += omap2420-h4.dtb \ | |||
83 | am335x-evm.dtb \ | 92 | am335x-evm.dtb \ |
84 | am335x-evmsk.dtb \ | 93 | am335x-evmsk.dtb \ |
85 | am335x-bone.dtb | 94 | am335x-bone.dtb |
95 | dtb-$(CONFIG_ARCH_ORION5X) += orion5x-lacie-ethernet-disk-mini-v2.dtb | ||
86 | dtb-$(CONFIG_ARCH_PRIMA2) += prima2-evb.dtb | 96 | dtb-$(CONFIG_ARCH_PRIMA2) += prima2-evb.dtb |
87 | dtb-$(CONFIG_ARCH_U8500) += snowball.dtb | 97 | dtb-$(CONFIG_ARCH_U8500) += snowball.dtb |
88 | dtb-$(CONFIG_ARCH_SHMOBILE) += emev2-kzm9d.dtb \ | 98 | dtb-$(CONFIG_ARCH_SHMOBILE) += emev2-kzm9d.dtb \ |
diff --git a/arch/arm/boot/dts/dove-cubox.dts b/arch/arm/boot/dts/dove-cubox.dts index 0adbd5a38095..fed7d3f9f431 100644 --- a/arch/arm/boot/dts/dove-cubox.dts +++ b/arch/arm/boot/dts/dove-cubox.dts | |||
@@ -40,3 +40,13 @@ | |||
40 | reg = <0>; | 40 | reg = <0>; |
41 | }; | 41 | }; |
42 | }; | 42 | }; |
43 | |||
44 | &pinctrl { | ||
45 | pinctrl-0 = <&pmx_gpio_18>; | ||
46 | pinctrl-names = "default"; | ||
47 | |||
48 | pmx_gpio_18: pmx-gpio-18 { | ||
49 | marvell,pins = "mpp18"; | ||
50 | marvell,function = "gpio"; | ||
51 | }; | ||
52 | }; | ||
diff --git a/arch/arm/boot/dts/dove.dtsi b/arch/arm/boot/dts/dove.dtsi index 5a00022383e7..61f391412a5a 100644 --- a/arch/arm/boot/dts/dove.dtsi +++ b/arch/arm/boot/dts/dove.dtsi | |||
@@ -4,6 +4,12 @@ | |||
4 | compatible = "marvell,dove"; | 4 | compatible = "marvell,dove"; |
5 | model = "Marvell Armada 88AP510 SoC"; | 5 | model = "Marvell Armada 88AP510 SoC"; |
6 | 6 | ||
7 | aliases { | ||
8 | gpio0 = &gpio0; | ||
9 | gpio1 = &gpio1; | ||
10 | gpio2 = &gpio2; | ||
11 | }; | ||
12 | |||
7 | soc@f1000000 { | 13 | soc@f1000000 { |
8 | compatible = "simple-bus"; | 14 | compatible = "simple-bus"; |
9 | #address-cells = <1>; | 15 | #address-cells = <1>; |
@@ -72,7 +78,8 @@ | |||
72 | #gpio-cells = <2>; | 78 | #gpio-cells = <2>; |
73 | gpio-controller; | 79 | gpio-controller; |
74 | reg = <0xd0400 0x20>; | 80 | reg = <0xd0400 0x20>; |
75 | ngpio = <32>; | 81 | ngpios = <32>; |
82 | interrupt-controller; | ||
76 | interrupts = <12>, <13>, <14>, <60>; | 83 | interrupts = <12>, <13>, <14>, <60>; |
77 | }; | 84 | }; |
78 | 85 | ||
@@ -81,7 +88,8 @@ | |||
81 | #gpio-cells = <2>; | 88 | #gpio-cells = <2>; |
82 | gpio-controller; | 89 | gpio-controller; |
83 | reg = <0xd0420 0x20>; | 90 | reg = <0xd0420 0x20>; |
84 | ngpio = <32>; | 91 | ngpios = <32>; |
92 | interrupt-controller; | ||
85 | interrupts = <61>; | 93 | interrupts = <61>; |
86 | }; | 94 | }; |
87 | 95 | ||
@@ -90,7 +98,12 @@ | |||
90 | #gpio-cells = <2>; | 98 | #gpio-cells = <2>; |
91 | gpio-controller; | 99 | gpio-controller; |
92 | reg = <0xe8400 0x0c>; | 100 | reg = <0xe8400 0x0c>; |
93 | ngpio = <8>; | 101 | ngpios = <8>; |
102 | }; | ||
103 | |||
104 | pinctrl: pinctrl@d0200 { | ||
105 | compatible = "marvell,dove-pinctrl"; | ||
106 | reg = <0xd0200 0x10>; | ||
94 | }; | 107 | }; |
95 | 108 | ||
96 | spi0: spi@10600 { | 109 | spi0: spi@10600 { |
diff --git a/arch/arm/boot/dts/kirkwood-6281.dtsi b/arch/arm/boot/dts/kirkwood-6281.dtsi new file mode 100644 index 000000000000..d6c9d65cbaeb --- /dev/null +++ b/arch/arm/boot/dts/kirkwood-6281.dtsi | |||
@@ -0,0 +1,44 @@ | |||
1 | / { | ||
2 | ocp@f1000000 { | ||
3 | pinctrl: pinctrl@10000 { | ||
4 | compatible = "marvell,88f6281-pinctrl"; | ||
5 | reg = <0x10000 0x20>; | ||
6 | |||
7 | pmx_nand: pmx-nand { | ||
8 | marvell,pins = "mpp0", "mpp1", "mpp2", "mpp3", | ||
9 | "mpp4", "mpp5", "mpp18", | ||
10 | "mpp19"; | ||
11 | marvell,function = "nand"; | ||
12 | }; | ||
13 | pmx_sata0: pmx-sata0 { | ||
14 | marvell,pins = "mpp5", "mpp21", "mpp23"; | ||
15 | marvell,function = "sata0"; | ||
16 | }; | ||
17 | pmx_sata1: pmx-sata1 { | ||
18 | marvell,pins = "mpp4", "mpp20", "mpp22"; | ||
19 | marvell,function = "sata1"; | ||
20 | }; | ||
21 | pmx_spi: pmx-spi { | ||
22 | marvell,pins = "mpp0", "mpp1", "mpp2", "mpp3"; | ||
23 | marvell,function = "spi"; | ||
24 | }; | ||
25 | pmx_twsi0: pmx-twsi0 { | ||
26 | marvell,pins = "mpp8", "mpp9"; | ||
27 | marvell,function = "twsi0"; | ||
28 | }; | ||
29 | pmx_uart0: pmx-uart0 { | ||
30 | marvell,pins = "mpp10", "mpp11"; | ||
31 | marvell,function = "uart0"; | ||
32 | }; | ||
33 | pmx_uart1: pmx-uart1 { | ||
34 | marvell,pins = "mpp13", "mpp14"; | ||
35 | marvell,function = "uart1"; | ||
36 | }; | ||
37 | pmx_sdio: pmx-sdio { | ||
38 | marvell,pins = "mpp12", "mpp13", "mpp14", | ||
39 | "mpp15", "mpp16", "mpp17"; | ||
40 | marvell,function = "sdio"; | ||
41 | }; | ||
42 | }; | ||
43 | }; | ||
44 | }; | ||
diff --git a/arch/arm/boot/dts/kirkwood-6282.dtsi b/arch/arm/boot/dts/kirkwood-6282.dtsi new file mode 100644 index 000000000000..9ae2004d5675 --- /dev/null +++ b/arch/arm/boot/dts/kirkwood-6282.dtsi | |||
@@ -0,0 +1,45 @@ | |||
1 | / { | ||
2 | ocp@f1000000 { | ||
3 | |||
4 | pinctrl: pinctrl@10000 { | ||
5 | compatible = "marvell,88f6282-pinctrl"; | ||
6 | reg = <0x10000 0x20>; | ||
7 | |||
8 | pmx_sata0: pmx-sata0 { | ||
9 | marvell,pins = "mpp5", "mpp21", "mpp23"; | ||
10 | marvell,function = "sata0"; | ||
11 | }; | ||
12 | pmx_sata1: pmx-sata1 { | ||
13 | marvell,pins = "mpp4", "mpp20", "mpp22"; | ||
14 | marvell,function = "sata1"; | ||
15 | }; | ||
16 | pmx_spi: pmx-spi { | ||
17 | marvell,pins = "mpp0", "mpp1", "mpp2", "mpp3"; | ||
18 | marvell,function = "spi"; | ||
19 | }; | ||
20 | pmx_twsi0: pmx-twsi0 { | ||
21 | marvell,pins = "mpp8", "mpp9"; | ||
22 | marvell,function = "twsi0"; | ||
23 | }; | ||
24 | pmx_uart0: pmx-uart0 { | ||
25 | marvell,pins = "mpp10", "mpp11"; | ||
26 | marvell,function = "uart0"; | ||
27 | }; | ||
28 | |||
29 | pmx_uart1: pmx-uart1 { | ||
30 | marvell,pins = "mpp13", "mpp14"; | ||
31 | marvell,function = "uart1"; | ||
32 | }; | ||
33 | }; | ||
34 | |||
35 | i2c@11100 { | ||
36 | compatible = "marvell,mv64xxx-i2c"; | ||
37 | reg = <0x11100 0x20>; | ||
38 | #address-cells = <1>; | ||
39 | #size-cells = <0>; | ||
40 | interrupts = <32>; | ||
41 | clock-frequency = <100000>; | ||
42 | status = "disabled"; | ||
43 | }; | ||
44 | }; | ||
45 | }; | ||
diff --git a/arch/arm/boot/dts/kirkwood-98dx4122.dtsi b/arch/arm/boot/dts/kirkwood-98dx4122.dtsi new file mode 100644 index 000000000000..3271e4c8ea07 --- /dev/null +++ b/arch/arm/boot/dts/kirkwood-98dx4122.dtsi | |||
@@ -0,0 +1,31 @@ | |||
1 | / { | ||
2 | ocp@f1000000 { | ||
3 | pinctrl: pinctrl@10000 { | ||
4 | compatible = "marvell,98dx4122-pinctrl"; | ||
5 | reg = <0x10000 0x20>; | ||
6 | |||
7 | pmx_nand: pmx-nand { | ||
8 | marvell,pins = "mpp0", "mpp1", "mpp2", "mpp3", | ||
9 | "mpp4", "mpp5", "mpp18", | ||
10 | "mpp19"; | ||
11 | marvell,function = "nand"; | ||
12 | }; | ||
13 | pmx_spi: pmx-spi { | ||
14 | marvell,pins = "mpp0", "mpp1", "mpp2", "mpp3"; | ||
15 | marvell,function = "spi"; | ||
16 | }; | ||
17 | pmx_twsi0: pmx-twsi0 { | ||
18 | marvell,pins = "mpp8", "mpp9"; | ||
19 | marvell,function = "twsi0"; | ||
20 | }; | ||
21 | pmx_uart0: pmx-uart0 { | ||
22 | marvell,pins = "mpp10", "mpp11"; | ||
23 | marvell,function = "uart0"; | ||
24 | }; | ||
25 | pmx_uart1: pmx-uart1 { | ||
26 | marvell,pins = "mpp13", "mpp14"; | ||
27 | marvell,function = "uart1"; | ||
28 | }; | ||
29 | }; | ||
30 | }; | ||
31 | }; | ||
diff --git a/arch/arm/boot/dts/kirkwood-dnskw.dtsi b/arch/arm/boot/dts/kirkwood-dnskw.dtsi index 9b32d0272825..6875ac00c174 100644 --- a/arch/arm/boot/dts/kirkwood-dnskw.dtsi +++ b/arch/arm/boot/dts/kirkwood-dnskw.dtsi | |||
@@ -1,4 +1,5 @@ | |||
1 | /include/ "kirkwood.dtsi" | 1 | /include/ "kirkwood.dtsi" |
2 | /include/ "kirkwood-6281.dtsi" | ||
2 | 3 | ||
3 | / { | 4 | / { |
4 | model = "D-Link DNS NASes (kirkwood-based)"; | 5 | model = "D-Link DNS NASes (kirkwood-based)"; |
@@ -35,7 +36,116 @@ | |||
35 | 6000 2>; | 36 | 6000 2>; |
36 | }; | 37 | }; |
37 | 38 | ||
39 | gpio_poweroff { | ||
40 | compatible = "gpio-poweroff"; | ||
41 | gpios = <&gpio1 4 0>; | ||
42 | }; | ||
43 | |||
38 | ocp@f1000000 { | 44 | ocp@f1000000 { |
45 | pinctrl: pinctrl@10000 { | ||
46 | |||
47 | pinctrl-0 = < &pmx_nand &pmx_uart1 | ||
48 | &pmx_sata0 &pmx_sata1 | ||
49 | &pmx_led_power | ||
50 | &pmx_led_red_right_hdd | ||
51 | &pmx_led_red_left_hdd | ||
52 | &pmx_led_red_usb_325 | ||
53 | &pmx_button_power | ||
54 | &pmx_led_red_usb_320 | ||
55 | &pmx_power_off &pmx_power_back_on | ||
56 | &pmx_power_sata0 &pmx_power_sata1 | ||
57 | &pmx_present_sata0 &pmx_present_sata1 | ||
58 | &pmx_led_white_usb &pmx_fan_tacho | ||
59 | &pmx_fan_high_speed &pmx_fan_low_speed | ||
60 | &pmx_button_unmount &pmx_button_reset | ||
61 | &pmx_temp_alarm >; | ||
62 | pinctrl-names = "default"; | ||
63 | |||
64 | pmx_sata0: pmx-sata0 { | ||
65 | marvell,pins = "mpp20"; | ||
66 | marvell,function = "sata1"; | ||
67 | }; | ||
68 | pmx_sata1: pmx-sata1 { | ||
69 | marvell,pins = "mpp21"; | ||
70 | marvell,function = "sata0"; | ||
71 | }; | ||
72 | pmx_led_power: pmx-led-power { | ||
73 | marvell,pins = "mpp26"; | ||
74 | marvell,function = "gpio"; | ||
75 | }; | ||
76 | pmx_led_red_right_hdd: pmx-led-red-right-hdd { | ||
77 | marvell,pins = "mpp27"; | ||
78 | marvell,function = "gpio"; | ||
79 | }; | ||
80 | pmx_led_red_left_hdd: pmx-led-red-left-hdd { | ||
81 | marvell,pins = "mpp28"; | ||
82 | marvell,function = "gpio"; | ||
83 | }; | ||
84 | pmx_led_red_usb_325: pmx-led-red-usb-325 { | ||
85 | marvell,pins = "mpp29"; | ||
86 | marvell,function = "gpio"; | ||
87 | }; | ||
88 | pmx_button_power: pmx-button-power { | ||
89 | marvell,pins = "mpp34"; | ||
90 | marvell,function = "gpio"; | ||
91 | }; | ||
92 | pmx_led_red_usb_320: pmx-led-red-usb-320 { | ||
93 | marvell,pins = "mpp35"; | ||
94 | marvell,function = "gpio"; | ||
95 | }; | ||
96 | pmx_power_off: pmx-power-off { | ||
97 | marvell,pins = "mpp36"; | ||
98 | marvell,function = "gpio"; | ||
99 | }; | ||
100 | pmx_power_back_on: pmx-power-back-on { | ||
101 | marvell,pins = "mpp37"; | ||
102 | marvell,function = "gpio"; | ||
103 | }; | ||
104 | pmx_power_sata0: pmx-power-sata0 { | ||
105 | marvell,pins = "mpp39"; | ||
106 | marvell,function = "gpio"; | ||
107 | }; | ||
108 | pmx_power_sata1: pmx-power-sata1 { | ||
109 | marvell,pins = "mpp40"; | ||
110 | marvell,function = "gpio"; | ||
111 | }; | ||
112 | pmx_present_sata0: pmx-present-sata0 { | ||
113 | marvell,pins = "mpp41"; | ||
114 | marvell,function = "gpio"; | ||
115 | }; | ||
116 | pmx_present_sata1: pmx-present-sata1 { | ||
117 | marvell,pins = "mpp42"; | ||
118 | marvell,function = "gpio"; | ||
119 | }; | ||
120 | pmx_led_white_usb: pmx-led-white-usb { | ||
121 | marvell,pins = "mpp43"; | ||
122 | marvell,function = "gpio"; | ||
123 | }; | ||
124 | pmx_fan_tacho: pmx-fan-tacho { | ||
125 | marvell,pins = "mpp44"; | ||
126 | marvell,function = "gpio"; | ||
127 | }; | ||
128 | pmx_fan_high_speed: pmx-fan-high-speed { | ||
129 | marvell,pins = "mpp45"; | ||
130 | marvell,function = "gpio"; | ||
131 | }; | ||
132 | pmx_fan_low_speed: pmx-fan-low-speed { | ||
133 | marvell,pins = "mpp46"; | ||
134 | marvell,function = "gpio"; | ||
135 | }; | ||
136 | pmx_button_unmount: pmx-button-unmount { | ||
137 | marvell,pins = "mpp47"; | ||
138 | marvell,function = "gpio"; | ||
139 | }; | ||
140 | pmx_button_reset: pmx-button-reset { | ||
141 | marvell,pins = "mpp48"; | ||
142 | marvell,function = "gpio"; | ||
143 | }; | ||
144 | pmx_temp_alarm: pmx-temp-alarm { | ||
145 | marvell,pins = "mpp49"; | ||
146 | marvell,function = "gpio"; | ||
147 | }; | ||
148 | }; | ||
39 | sata@80000 { | 149 | sata@80000 { |
40 | status = "okay"; | 150 | status = "okay"; |
41 | nr-ports = <2>; | 151 | nr-ports = <2>; |
@@ -43,6 +153,7 @@ | |||
43 | 153 | ||
44 | nand@3000000 { | 154 | nand@3000000 { |
45 | status = "okay"; | 155 | status = "okay"; |
156 | chip-delay = <35>; | ||
46 | 157 | ||
47 | partition@0 { | 158 | partition@0 { |
48 | label = "u-boot"; | 159 | label = "u-boot"; |
@@ -76,4 +187,33 @@ | |||
76 | }; | 187 | }; |
77 | }; | 188 | }; |
78 | }; | 189 | }; |
190 | |||
191 | regulators { | ||
192 | compatible = "simple-bus"; | ||
193 | #address-cells = <1>; | ||
194 | #size-cells = <0>; | ||
195 | |||
196 | sata0_power: regulator@1 { | ||
197 | compatible = "regulator-fixed"; | ||
198 | reg = <1>; | ||
199 | regulator-name = "SATA0 Power"; | ||
200 | regulator-min-microvolt = <5000000>; | ||
201 | regulator-max-microvolt = <5000000>; | ||
202 | enable-active-high; | ||
203 | regulator-always-on; | ||
204 | regulator-boot-on; | ||
205 | gpio = <&gpio1 7 0>; | ||
206 | }; | ||
207 | sata1_power: regulator@2 { | ||
208 | compatible = "regulator-fixed"; | ||
209 | reg = <2>; | ||
210 | regulator-name = "SATA1 Power"; | ||
211 | regulator-min-microvolt = <5000000>; | ||
212 | regulator-max-microvolt = <5000000>; | ||
213 | enable-active-high; | ||
214 | regulator-always-on; | ||
215 | regulator-boot-on; | ||
216 | gpio = <&gpio1 8 0>; | ||
217 | }; | ||
218 | }; | ||
79 | }; | 219 | }; |
diff --git a/arch/arm/boot/dts/kirkwood-dockstar.dts b/arch/arm/boot/dts/kirkwood-dockstar.dts index 08a582414b88..2e3dd34e21a5 100644 --- a/arch/arm/boot/dts/kirkwood-dockstar.dts +++ b/arch/arm/boot/dts/kirkwood-dockstar.dts | |||
@@ -1,6 +1,7 @@ | |||
1 | /dts-v1/; | 1 | /dts-v1/; |
2 | 2 | ||
3 | /include/ "kirkwood.dtsi" | 3 | /include/ "kirkwood.dtsi" |
4 | /include/ "kirkwood-6281.dtsi" | ||
4 | 5 | ||
5 | / { | 6 | / { |
6 | model = "Seagate FreeAgent Dockstar"; | 7 | model = "Seagate FreeAgent Dockstar"; |
@@ -16,6 +17,25 @@ | |||
16 | }; | 17 | }; |
17 | 18 | ||
18 | ocp@f1000000 { | 19 | ocp@f1000000 { |
20 | pinctrl: pinctrl@10000 { | ||
21 | |||
22 | pinctrl-0 = < &pmx_usb_power_enable | ||
23 | &pmx_led_green &pmx_led_orange >; | ||
24 | pinctrl-names = "default"; | ||
25 | |||
26 | pmx_usb_power_enable: pmx-usb-power-enable { | ||
27 | marvell,pins = "mpp29"; | ||
28 | marvell,function = "gpio"; | ||
29 | }; | ||
30 | pmx_led_green: pmx-led-green { | ||
31 | marvell,pins = "mpp46"; | ||
32 | marvell,function = "gpio"; | ||
33 | }; | ||
34 | pmx_led_orange: pmx-led-orange { | ||
35 | marvell,pins = "mpp47"; | ||
36 | marvell,function = "gpio"; | ||
37 | }; | ||
38 | }; | ||
19 | serial@12000 { | 39 | serial@12000 { |
20 | clock-frequency = <200000000>; | 40 | clock-frequency = <200000000>; |
21 | status = "ok"; | 41 | status = "ok"; |
@@ -54,4 +74,21 @@ | |||
54 | gpios = <&gpio1 15 1>; | 74 | gpios = <&gpio1 15 1>; |
55 | }; | 75 | }; |
56 | }; | 76 | }; |
77 | regulators { | ||
78 | compatible = "simple-bus"; | ||
79 | #address-cells = <1>; | ||
80 | #size-cells = <0>; | ||
81 | |||
82 | usb_power: regulator@1 { | ||
83 | compatible = "regulator-fixed"; | ||
84 | reg = <1>; | ||
85 | regulator-name = "USB Power"; | ||
86 | regulator-min-microvolt = <5000000>; | ||
87 | regulator-max-microvolt = <5000000>; | ||
88 | enable-active-high; | ||
89 | regulator-always-on; | ||
90 | regulator-boot-on; | ||
91 | gpio = <&gpio0 29 0>; | ||
92 | }; | ||
93 | }; | ||
57 | }; | 94 | }; |
diff --git a/arch/arm/boot/dts/kirkwood-dreamplug.dts b/arch/arm/boot/dts/kirkwood-dreamplug.dts index 26e281fbf6bc..f2d386c95b07 100644 --- a/arch/arm/boot/dts/kirkwood-dreamplug.dts +++ b/arch/arm/boot/dts/kirkwood-dreamplug.dts | |||
@@ -1,6 +1,7 @@ | |||
1 | /dts-v1/; | 1 | /dts-v1/; |
2 | 2 | ||
3 | /include/ "kirkwood.dtsi" | 3 | /include/ "kirkwood.dtsi" |
4 | /include/ "kirkwood-6281.dtsi" | ||
4 | 5 | ||
5 | / { | 6 | / { |
6 | model = "Globalscale Technologies Dreamplug"; | 7 | model = "Globalscale Technologies Dreamplug"; |
@@ -16,6 +17,26 @@ | |||
16 | }; | 17 | }; |
17 | 18 | ||
18 | ocp@f1000000 { | 19 | ocp@f1000000 { |
20 | pinctrl: pinctrl@10000 { | ||
21 | |||
22 | pinctrl-0 = < &pmx_spi | ||
23 | &pmx_led_bluetooth &pmx_led_wifi | ||
24 | &pmx_led_wifi_ap >; | ||
25 | pinctrl-names = "default"; | ||
26 | |||
27 | pmx_led_bluetooth: pmx-led-bluetooth { | ||
28 | marvell,pins = "mpp47"; | ||
29 | marvell,function = "gpio"; | ||
30 | }; | ||
31 | pmx_led_wifi: pmx-led-wifi { | ||
32 | marvell,pins = "mpp48"; | ||
33 | marvell,function = "gpio"; | ||
34 | }; | ||
35 | pmx_led_wifi_ap: pmx-led-wifi-ap { | ||
36 | marvell,pins = "mpp49"; | ||
37 | marvell,function = "gpio"; | ||
38 | }; | ||
39 | }; | ||
19 | serial@12000 { | 40 | serial@12000 { |
20 | clock-frequency = <200000000>; | 41 | clock-frequency = <200000000>; |
21 | status = "ok"; | 42 | status = "ok"; |
diff --git a/arch/arm/boot/dts/kirkwood-goflexnet.dts b/arch/arm/boot/dts/kirkwood-goflexnet.dts index 7c8238fbb6f9..1b133e0c566e 100644 --- a/arch/arm/boot/dts/kirkwood-goflexnet.dts +++ b/arch/arm/boot/dts/kirkwood-goflexnet.dts | |||
@@ -1,6 +1,7 @@ | |||
1 | /dts-v1/; | 1 | /dts-v1/; |
2 | 2 | ||
3 | /include/ "kirkwood.dtsi" | 3 | /include/ "kirkwood.dtsi" |
4 | /include/ "kirkwood-6281.dtsi" | ||
4 | 5 | ||
5 | / { | 6 | / { |
6 | model = "Seagate GoFlex Net"; | 7 | model = "Seagate GoFlex Net"; |
@@ -16,6 +17,61 @@ | |||
16 | }; | 17 | }; |
17 | 18 | ||
18 | ocp@f1000000 { | 19 | ocp@f1000000 { |
20 | pinctrl: pinctrl@10000 { | ||
21 | |||
22 | pinctrl-0 = < &pmx_usb_power_enable &pmx_led_orange | ||
23 | &pmx_led_left_cap_0 &pmx_led_left_cap_1 | ||
24 | &pmx_led_left_cap_2 &pmx_led_left_cap_3 | ||
25 | &pmx_led_right_cap_0 &pmx_led_right_cap_1 | ||
26 | &pmx_led_right_cap_2 &pmx_led_right_cap_3 | ||
27 | >; | ||
28 | pinctrl-names = "default"; | ||
29 | |||
30 | pmx_usb_power_enable: pmx-usb-power-enable { | ||
31 | marvell,pins = "mpp29"; | ||
32 | marvell,function = "gpio"; | ||
33 | }; | ||
34 | pmx_led_right_cap_0: pmx-led_right_cap_0 { | ||
35 | marvell,pins = "mpp38"; | ||
36 | marvell,function = "gpio"; | ||
37 | }; | ||
38 | pmx_led_right_cap_1: pmx-led_right_cap_1 { | ||
39 | marvell,pins = "mpp39"; | ||
40 | marvell,function = "gpio"; | ||
41 | }; | ||
42 | pmx_led_right_cap_2: pmx-led_right_cap_2 { | ||
43 | marvell,pins = "mpp40"; | ||
44 | marvell,function = "gpio"; | ||
45 | }; | ||
46 | pmx_led_right_cap_3: pmx-led_right_cap_3 { | ||
47 | marvell,pins = "mpp41"; | ||
48 | marvell,function = "gpio"; | ||
49 | }; | ||
50 | pmx_led_left_cap_0: pmx-led_left_cap_0 { | ||
51 | marvell,pins = "mpp42"; | ||
52 | marvell,function = "gpio"; | ||
53 | }; | ||
54 | pmx_led_left_cap_1: pmx-led_left_cap_1 { | ||
55 | marvell,pins = "mpp43"; | ||
56 | marvell,function = "gpio"; | ||
57 | }; | ||
58 | pmx_led_left_cap_2: pmx-led_left_cap_2 { | ||
59 | marvell,pins = "mpp44"; | ||
60 | marvell,function = "gpio"; | ||
61 | }; | ||
62 | pmx_led_left_cap_3: pmx-led_left_cap_3 { | ||
63 | marvell,pins = "mpp45"; | ||
64 | marvell,function = "gpio"; | ||
65 | }; | ||
66 | pmx_led_green: pmx-led_green { | ||
67 | marvell,pins = "mpp46"; | ||
68 | marvell,function = "gpio"; | ||
69 | }; | ||
70 | pmx_led_orange: pmx-led_orange { | ||
71 | marvell,pins = "mpp47"; | ||
72 | marvell,function = "gpio"; | ||
73 | }; | ||
74 | }; | ||
19 | serial@12000 { | 75 | serial@12000 { |
20 | clock-frequency = <200000000>; | 76 | clock-frequency = <200000000>; |
21 | status = "ok"; | 77 | status = "ok"; |
@@ -96,4 +152,21 @@ | |||
96 | gpios = <&gpio1 9 0>; | 152 | gpios = <&gpio1 9 0>; |
97 | }; | 153 | }; |
98 | }; | 154 | }; |
155 | regulators { | ||
156 | compatible = "simple-bus"; | ||
157 | #address-cells = <1>; | ||
158 | #size-cells = <0>; | ||
159 | |||
160 | usb_power: regulator@1 { | ||
161 | compatible = "regulator-fixed"; | ||
162 | reg = <1>; | ||
163 | regulator-name = "USB Power"; | ||
164 | regulator-min-microvolt = <5000000>; | ||
165 | regulator-max-microvolt = <5000000>; | ||
166 | enable-active-high; | ||
167 | regulator-always-on; | ||
168 | regulator-boot-on; | ||
169 | gpio = <&gpio0 29 0>; | ||
170 | }; | ||
171 | }; | ||
99 | }; | 172 | }; |
diff --git a/arch/arm/boot/dts/kirkwood-ib62x0.dts b/arch/arm/boot/dts/kirkwood-ib62x0.dts index 66794ed75ff1..71902da33d63 100644 --- a/arch/arm/boot/dts/kirkwood-ib62x0.dts +++ b/arch/arm/boot/dts/kirkwood-ib62x0.dts | |||
@@ -1,6 +1,7 @@ | |||
1 | /dts-v1/; | 1 | /dts-v1/; |
2 | 2 | ||
3 | /include/ "kirkwood.dtsi" | 3 | /include/ "kirkwood.dtsi" |
4 | /include/ "kirkwood-6281.dtsi" | ||
4 | 5 | ||
5 | / { | 6 | / { |
6 | model = "RaidSonic ICY BOX IB-NAS62x0 (Rev B)"; | 7 | model = "RaidSonic ICY BOX IB-NAS62x0 (Rev B)"; |
@@ -16,6 +17,39 @@ | |||
16 | }; | 17 | }; |
17 | 18 | ||
18 | ocp@f1000000 { | 19 | ocp@f1000000 { |
20 | pinctrl: pinctrl@10000 { | ||
21 | |||
22 | pinctrl-0 = < &pmx_nand | ||
23 | &pmx_led_os_red &pmx_power_off | ||
24 | &pmx_led_os_green &pmx_led_usb_transfer | ||
25 | &pmx_button_reset &pmx_button_usb_copy >; | ||
26 | pinctrl-names = "default"; | ||
27 | |||
28 | pmx_led_os_red: pmx-led-os-red { | ||
29 | marvell,pins = "mpp22"; | ||
30 | marvell,function = "gpio"; | ||
31 | }; | ||
32 | pmx_power_off: pmx-power-off { | ||
33 | marvell,pins = "mpp24"; | ||
34 | marvell,function = "gpio"; | ||
35 | }; | ||
36 | pmx_led_os_green: pmx-led-os-green { | ||
37 | marvell,pins = "mpp25"; | ||
38 | marvell,function = "gpio"; | ||
39 | }; | ||
40 | pmx_led_usb_transfer: pmx-led-usb-transfer { | ||
41 | marvell,pins = "mpp27"; | ||
42 | marvell,function = "gpio"; | ||
43 | }; | ||
44 | pmx_button_reset: pmx-button-reset { | ||
45 | marvell,pins = "mpp28"; | ||
46 | marvell,function = "gpio"; | ||
47 | }; | ||
48 | pmx_button_usb_copy: pmx-button-usb-copy { | ||
49 | marvell,pins = "mpp29"; | ||
50 | marvell,function = "gpio"; | ||
51 | }; | ||
52 | }; | ||
19 | serial@12000 { | 53 | serial@12000 { |
20 | clock-frequency = <200000000>; | 54 | clock-frequency = <200000000>; |
21 | status = "okay"; | 55 | status = "okay"; |
@@ -79,4 +113,10 @@ | |||
79 | gpios = <&gpio0 27 0>; | 113 | gpios = <&gpio0 27 0>; |
80 | }; | 114 | }; |
81 | }; | 115 | }; |
116 | gpio_poweroff { | ||
117 | compatible = "gpio-poweroff"; | ||
118 | gpios = <&gpio0 24 0>; | ||
119 | }; | ||
120 | |||
121 | |||
82 | }; | 122 | }; |
diff --git a/arch/arm/boot/dts/kirkwood-iconnect.dts b/arch/arm/boot/dts/kirkwood-iconnect.dts index d97cd9d4753e..504f16be8b54 100644 --- a/arch/arm/boot/dts/kirkwood-iconnect.dts +++ b/arch/arm/boot/dts/kirkwood-iconnect.dts | |||
@@ -1,6 +1,7 @@ | |||
1 | /dts-v1/; | 1 | /dts-v1/; |
2 | 2 | ||
3 | /include/ "kirkwood.dtsi" | 3 | /include/ "kirkwood.dtsi" |
4 | /include/ "kirkwood-6281.dtsi" | ||
4 | 5 | ||
5 | / { | 6 | / { |
6 | model = "Iomega Iconnect"; | 7 | model = "Iomega Iconnect"; |
@@ -18,6 +19,56 @@ | |||
18 | }; | 19 | }; |
19 | 20 | ||
20 | ocp@f1000000 { | 21 | ocp@f1000000 { |
22 | pinctrl: pinctrl@10000 { | ||
23 | |||
24 | pinctrl-0 = < &pmx_gpio_12 &pmx_gpio_35 | ||
25 | &pmx_gpio_41 &pmx_gpio_42 | ||
26 | &pmx_gpio_43 &pmx_gpio_44 | ||
27 | &pmx_gpio_45 &pmx_gpio_46 | ||
28 | &pmx_gpio_47 &pmx_gpio_48 >; | ||
29 | pinctrl-names = "default"; | ||
30 | |||
31 | pmx_gpio_12: pmx-gpio-12 { | ||
32 | marvell,pins = "mpp12"; | ||
33 | marvell,function = "gpio"; | ||
34 | }; | ||
35 | pmx_gpio_35: pmx-gpio-35 { | ||
36 | marvell,pins = "mpp35"; | ||
37 | marvell,function = "gpio"; | ||
38 | }; | ||
39 | pmx_gpio_41: pmx-gpio-41 { | ||
40 | marvell,pins = "mpp41"; | ||
41 | marvell,function = "gpio"; | ||
42 | }; | ||
43 | pmx_gpio_42: pmx-gpio-42 { | ||
44 | marvell,pins = "mpp42"; | ||
45 | marvell,function = "gpio"; | ||
46 | }; | ||
47 | pmx_gpio_43: pmx-gpio-43 { | ||
48 | marvell,pins = "mpp43"; | ||
49 | marvell,function = "gpio"; | ||
50 | }; | ||
51 | pmx_gpio_44: pmx-gpio-44 { | ||
52 | marvell,pins = "mpp44"; | ||
53 | marvell,function = "gpio"; | ||
54 | }; | ||
55 | pmx_gpio_45: pmx-gpio-45 { | ||
56 | marvell,pins = "mpp45"; | ||
57 | marvell,function = "gpio"; | ||
58 | }; | ||
59 | pmx_gpio_46: pmx-gpio-46 { | ||
60 | marvell,pins = "mpp46"; | ||
61 | marvell,function = "gpio"; | ||
62 | }; | ||
63 | pmx_gpio_47: pmx-gpio-47 { | ||
64 | marvell,pins = "mpp47"; | ||
65 | marvell,function = "gpio"; | ||
66 | }; | ||
67 | pmx_gpio_48: pmx-gpio-48 { | ||
68 | marvell,pins = "mpp48"; | ||
69 | marvell,function = "gpio"; | ||
70 | }; | ||
71 | }; | ||
21 | i2c@11000 { | 72 | i2c@11000 { |
22 | status = "okay"; | 73 | status = "okay"; |
23 | 74 | ||
diff --git a/arch/arm/boot/dts/kirkwood-iomega_ix2_200.dts b/arch/arm/boot/dts/kirkwood-iomega_ix2_200.dts index 865aeec40a26..6cae4599c4b3 100644 --- a/arch/arm/boot/dts/kirkwood-iomega_ix2_200.dts +++ b/arch/arm/boot/dts/kirkwood-iomega_ix2_200.dts | |||
@@ -1,6 +1,7 @@ | |||
1 | /dts-v1/; | 1 | /dts-v1/; |
2 | 2 | ||
3 | /include/ "kirkwood.dtsi" | 3 | /include/ "kirkwood.dtsi" |
4 | /include/ "kirkwood-6281.dtsi" | ||
4 | 5 | ||
5 | / { | 6 | / { |
6 | model = "Iomega StorCenter ix2-200"; | 7 | model = "Iomega StorCenter ix2-200"; |
@@ -16,6 +17,94 @@ | |||
16 | }; | 17 | }; |
17 | 18 | ||
18 | ocp@f1000000 { | 19 | ocp@f1000000 { |
20 | pinctrl: pinctrl@10000 { | ||
21 | |||
22 | pinctrl-0 = < &pmx_button_reset &pmx_button_power | ||
23 | &pmx_led_backup &pmx_led_power | ||
24 | &pmx_button_otb &pmx_led_rebuild | ||
25 | &pmx_led_health | ||
26 | &pmx_led_sata_brt_ctrl_1 | ||
27 | &pmx_led_sata_brt_ctrl_2 | ||
28 | &pmx_led_backup_brt_ctrl_1 | ||
29 | &pmx_led_backup_brt_ctrl_2 | ||
30 | &pmx_led_power_brt_ctrl_1 | ||
31 | &pmx_led_power_brt_ctrl_2 | ||
32 | &pmx_led_health_brt_ctrl_1 | ||
33 | &pmx_led_health_brt_ctrl_2 | ||
34 | &pmx_led_rebuild_brt_ctrl_1 | ||
35 | &pmx_led_rebuild_brt_ctrl_2 >; | ||
36 | pinctrl-names = "default"; | ||
37 | |||
38 | pmx_button_reset: pmx-button-reset { | ||
39 | marvell,pins = "mpp12"; | ||
40 | marvell,function = "gpio"; | ||
41 | }; | ||
42 | pmx_button_power: pmx-button-power { | ||
43 | marvell,pins = "mpp14"; | ||
44 | marvell,function = "gpio"; | ||
45 | }; | ||
46 | pmx_led_backup: pmx-led-backup { | ||
47 | marvell,pins = "mpp15"; | ||
48 | marvell,function = "gpio"; | ||
49 | }; | ||
50 | pmx_led_power: pmx-led-power { | ||
51 | marvell,pins = "mpp16"; | ||
52 | marvell,function = "gpio"; | ||
53 | }; | ||
54 | pmx_button_otb: pmx-button-otb { | ||
55 | marvell,pins = "mpp35"; | ||
56 | marvell,function = "gpio"; | ||
57 | }; | ||
58 | pmx_led_rebuild: pmx-led-rebuild { | ||
59 | marvell,pins = "mpp36"; | ||
60 | marvell,function = "gpio"; | ||
61 | }; | ||
62 | pmx_led_health: pmx-led_health { | ||
63 | marvell,pins = "mpp37"; | ||
64 | marvell,function = "gpio"; | ||
65 | }; | ||
66 | pmx_led_sata_brt_ctrl_1: pmx-led-sata-brt-ctrl-1 { | ||
67 | marvell,pins = "mpp38"; | ||
68 | marvell,function = "gpio"; | ||
69 | }; | ||
70 | pmx_led_sata_brt_ctrl_2: pmx-led-sata-brt-ctrl-2 { | ||
71 | marvell,pins = "mpp39"; | ||
72 | marvell,function = "gpio"; | ||
73 | }; | ||
74 | pmx_led_backup_brt_ctrl_1: pmx-led-backup-brt-ctrl-1 { | ||
75 | marvell,pins = "mpp40"; | ||
76 | marvell,function = "gpio"; | ||
77 | }; | ||
78 | pmx_led_backup_brt_ctrl_2: pmx-led-backup-brt-ctrl-2 { | ||
79 | marvell,pins = "mpp41"; | ||
80 | marvell,function = "gpio"; | ||
81 | }; | ||
82 | pmx_led_power_brt_ctrl_1: pmx-led-power-brt-ctrl-1 { | ||
83 | marvell,pins = "mpp42"; | ||
84 | marvell,function = "gpio"; | ||
85 | }; | ||
86 | pmx_led_power_brt_ctrl_2: pmx-led-power-brt-ctrl-2 { | ||
87 | marvell,pins = "mpp43"; | ||
88 | marvell,function = "gpio"; | ||
89 | }; | ||
90 | pmx_led_health_brt_ctrl_1: pmx-led-health-brt-ctrl-1 { | ||
91 | marvell,pins = "mpp44"; | ||
92 | marvell,function = "gpio"; | ||
93 | }; | ||
94 | pmx_led_health_brt_ctrl_2: pmx-led-health-brt-ctrl-2 { | ||
95 | marvell,pins = "mpp45"; | ||
96 | marvell,function = "gpio"; | ||
97 | }; | ||
98 | pmx_led_rebuild_brt_ctrl_1: pmx-led-rebuild-brt-ctrl-1 { | ||
99 | marvell,pins = "mpp44"; | ||
100 | marvell,function = "gpio"; | ||
101 | }; | ||
102 | pmx_led_rebuild_brt_ctrl_2: pmx-led-rebuild-brt-ctrl-2 { | ||
103 | marvell,pins = "mpp45"; | ||
104 | marvell,function = "gpio"; | ||
105 | }; | ||
106 | |||
107 | }; | ||
19 | i2c@11000 { | 108 | i2c@11000 { |
20 | status = "okay"; | 109 | status = "okay"; |
21 | 110 | ||
diff --git a/arch/arm/boot/dts/kirkwood-is2.dts b/arch/arm/boot/dts/kirkwood-is2.dts new file mode 100644 index 000000000000..0bdce0ad7277 --- /dev/null +++ b/arch/arm/boot/dts/kirkwood-is2.dts | |||
@@ -0,0 +1,30 @@ | |||
1 | /dts-v1/; | ||
2 | |||
3 | /include/ "kirkwood-ns2-common.dtsi" | ||
4 | |||
5 | / { | ||
6 | model = "LaCie Internet Space v2"; | ||
7 | compatible = "lacie,inetspace_v2", "marvell,kirkwood-88f6281", "marvell,kirkwood"; | ||
8 | |||
9 | memory { | ||
10 | device_type = "memory"; | ||
11 | reg = <0x00000000 0x8000000>; | ||
12 | }; | ||
13 | |||
14 | ocp@f1000000 { | ||
15 | sata@80000 { | ||
16 | status = "okay"; | ||
17 | nr-ports = <1>; | ||
18 | }; | ||
19 | }; | ||
20 | |||
21 | ns2-leds { | ||
22 | compatible = "lacie,ns2-leds"; | ||
23 | |||
24 | blue-sata { | ||
25 | label = "ns2:blue:sata"; | ||
26 | slow-gpio = <&gpio0 29 0>; | ||
27 | cmd-gpio = <&gpio0 30 0>; | ||
28 | }; | ||
29 | }; | ||
30 | }; | ||
diff --git a/arch/arm/boot/dts/kirkwood-km_kirkwood.dts b/arch/arm/boot/dts/kirkwood-km_kirkwood.dts index 75bdb93fed26..8db3123ac80f 100644 --- a/arch/arm/boot/dts/kirkwood-km_kirkwood.dts +++ b/arch/arm/boot/dts/kirkwood-km_kirkwood.dts | |||
@@ -1,6 +1,7 @@ | |||
1 | /dts-v1/; | 1 | /dts-v1/; |
2 | 2 | ||
3 | /include/ "kirkwood.dtsi" | 3 | /include/ "kirkwood.dtsi" |
4 | /include/ "kirkwood-98dx4122.dtsi" | ||
4 | 5 | ||
5 | / { | 6 | / { |
6 | model = "Keymile Kirkwood Reference Design"; | 7 | model = "Keymile Kirkwood Reference Design"; |
@@ -16,6 +17,22 @@ | |||
16 | }; | 17 | }; |
17 | 18 | ||
18 | ocp@f1000000 { | 19 | ocp@f1000000 { |
20 | pinctrl: pinctrl@10000 { | ||
21 | |||
22 | pinctrl-0 = < &pmx_nand &pmx_i2c_gpio_sda | ||
23 | &pmx_i2c_gpio_scl >; | ||
24 | pinctrl-names = "default"; | ||
25 | |||
26 | pmx_i2c_gpio_sda: pmx-gpio-sda { | ||
27 | marvell,pins = "mpp8"; | ||
28 | marvell,function = "gpio"; | ||
29 | }; | ||
30 | pmx_i2c_gpio_scl: pmx-gpio-scl { | ||
31 | marvell,pins = "mpp9"; | ||
32 | marvell,function = "gpio"; | ||
33 | }; | ||
34 | }; | ||
35 | |||
19 | serial@12000 { | 36 | serial@12000 { |
20 | clock-frequency = <200000000>; | 37 | clock-frequency = <200000000>; |
21 | status = "ok"; | 38 | status = "ok"; |
diff --git a/arch/arm/boot/dts/kirkwood-lsxl.dtsi b/arch/arm/boot/dts/kirkwood-lsxl.dtsi index 8fea375c734d..37d45c4f88fb 100644 --- a/arch/arm/boot/dts/kirkwood-lsxl.dtsi +++ b/arch/arm/boot/dts/kirkwood-lsxl.dtsi | |||
@@ -1,4 +1,5 @@ | |||
1 | /include/ "kirkwood.dtsi" | 1 | /include/ "kirkwood.dtsi" |
2 | /include/ "kirkwood-6281.dtsi" | ||
2 | 3 | ||
3 | / { | 4 | / { |
4 | chosen { | 5 | chosen { |
@@ -6,6 +7,71 @@ | |||
6 | }; | 7 | }; |
7 | 8 | ||
8 | ocp@f1000000 { | 9 | ocp@f1000000 { |
10 | pinctrl: pinctrl@10000 { | ||
11 | |||
12 | pinctrl-0 = < &pmx_power_hdd &pmx_usb_vbus | ||
13 | &pmx_fan_low &pmx_fan_high | ||
14 | &pmx_led_function_red &pmx_led_alarm | ||
15 | &pmx_led_info &pmx_led_power | ||
16 | &pmx_fan_lock &pmx_button_function | ||
17 | &pmx_power_switch &pmx_power_auto_switch | ||
18 | &pmx_led_function_blue >; | ||
19 | pinctrl-names = "default"; | ||
20 | |||
21 | pmx_power_hdd: pmx-power-hdd { | ||
22 | marvell,pins = "mpp10"; | ||
23 | marvell,function = "gpo"; | ||
24 | }; | ||
25 | pmx_usb_vbus: pmx-usb-vbus { | ||
26 | marvell,pins = "mpp11"; | ||
27 | marvell,function = "gpio"; | ||
28 | }; | ||
29 | pmx_fan_high: pmx-fan-high { | ||
30 | marvell,pins = "mpp18"; | ||
31 | marvell,function = "gpo"; | ||
32 | }; | ||
33 | pmx_fan_low: pmx-fan-low { | ||
34 | marvell,pins = "mpp19"; | ||
35 | marvell,function = "gpo"; | ||
36 | }; | ||
37 | pmx_led_function_blue: pmx-led-function-blue { | ||
38 | marvell,pins = "mpp36"; | ||
39 | marvell,function = "gpio"; | ||
40 | }; | ||
41 | pmx_led_alarm: pmx-led-alarm { | ||
42 | marvell,pins = "mpp37"; | ||
43 | marvell,function = "gpio"; | ||
44 | }; | ||
45 | pmx_led_info: pmx-led-info { | ||
46 | marvell,pins = "mpp38"; | ||
47 | marvell,function = "gpio"; | ||
48 | }; | ||
49 | pmx_led_power: pmx-led-power { | ||
50 | marvell,pins = "mpp39"; | ||
51 | marvell,function = "gpio"; | ||
52 | }; | ||
53 | pmx_fan_lock: pmx-fan-lock { | ||
54 | marvell,pins = "mpp40"; | ||
55 | marvell,function = "gpio"; | ||
56 | }; | ||
57 | pmx_button_function: pmx-button-function { | ||
58 | marvell,pins = "mpp41"; | ||
59 | marvell,function = "gpio"; | ||
60 | }; | ||
61 | pmx_power_switch: pmx-power-switch { | ||
62 | marvell,pins = "mpp42"; | ||
63 | marvell,function = "gpio"; | ||
64 | }; | ||
65 | pmx_power_auto_switch: pmx-power-auto-switch { | ||
66 | marvell,pins = "mpp43"; | ||
67 | marvell,function = "gpio"; | ||
68 | }; | ||
69 | pmx_led_function_red: pmx-led-function_red { | ||
70 | marvell,pins = "mpp48"; | ||
71 | marvell,function = "gpio"; | ||
72 | }; | ||
73 | |||
74 | }; | ||
9 | sata@80000 { | 75 | sata@80000 { |
10 | status = "okay"; | 76 | status = "okay"; |
11 | nr-ports = <1>; | 77 | nr-ports = <1>; |
@@ -94,4 +160,44 @@ | |||
94 | gpios = <&gpio1 16 1>; | 160 | gpios = <&gpio1 16 1>; |
95 | }; | 161 | }; |
96 | }; | 162 | }; |
163 | |||
164 | gpio_fan { | ||
165 | compatible = "gpio-fan"; | ||
166 | gpios = <&gpio0 19 1 | ||
167 | &gpio0 18 1>; | ||
168 | gpio-fan,speed-map = <0 3 | ||
169 | 1500 2 | ||
170 | 3250 1 | ||
171 | 5000 0>; | ||
172 | alarm-gpios = <&gpio1 8 0>; | ||
173 | }; | ||
174 | |||
175 | regulators { | ||
176 | compatible = "simple-bus"; | ||
177 | #address-cells = <1>; | ||
178 | #size-cells = <0>; | ||
179 | |||
180 | usb_power: regulator@1 { | ||
181 | compatible = "regulator-fixed"; | ||
182 | reg = <1>; | ||
183 | regulator-name = "USB Power"; | ||
184 | regulator-min-microvolt = <5000000>; | ||
185 | regulator-max-microvolt = <5000000>; | ||
186 | enable-active-high; | ||
187 | regulator-always-on; | ||
188 | regulator-boot-on; | ||
189 | gpio = <&gpio0 11 0>; | ||
190 | }; | ||
191 | hdd_power: regulator@2 { | ||
192 | compatible = "regulator-fixed"; | ||
193 | reg = <2>; | ||
194 | regulator-name = "HDD Power"; | ||
195 | regulator-min-microvolt = <5000000>; | ||
196 | regulator-max-microvolt = <5000000>; | ||
197 | enable-active-high; | ||
198 | regulator-always-on; | ||
199 | regulator-boot-on; | ||
200 | gpio = <&gpio0 10 0>; | ||
201 | }; | ||
202 | }; | ||
97 | }; | 203 | }; |
diff --git a/arch/arm/boot/dts/kirkwood-mplcec4.dts b/arch/arm/boot/dts/kirkwood-mplcec4.dts new file mode 100644 index 000000000000..262c65403760 --- /dev/null +++ b/arch/arm/boot/dts/kirkwood-mplcec4.dts | |||
@@ -0,0 +1,178 @@ | |||
1 | /dts-v1/; | ||
2 | |||
3 | /include/ "kirkwood.dtsi" | ||
4 | /include/ "kirkwood-6281.dtsi" | ||
5 | |||
6 | / { | ||
7 | model = "MPL CEC4"; | ||
8 | compatible = "mpl,cec4-10", "mpl,cec4", "marvell,kirkwood-88f6281", "marvell,kirkwood"; | ||
9 | |||
10 | memory { | ||
11 | device_type = "memory"; | ||
12 | reg = <0x00000000 0x20000000>; | ||
13 | }; | ||
14 | |||
15 | chosen { | ||
16 | bootargs = "console=ttyS0,115200n8 earlyprintk"; | ||
17 | }; | ||
18 | |||
19 | ocp@f1000000 { | ||
20 | pinctrl: pinctrl@10000 { | ||
21 | |||
22 | pinctrl-0 = < &pmx_nand &pmx_uart0 | ||
23 | &pmx_led_health &pmx_sdio | ||
24 | &pmx_sata0 &pmx_sata1 | ||
25 | &pmx_led_user1o | ||
26 | &pmx_led_user1g &pmx_led_user0o | ||
27 | &pmx_led_user0g &pmx_led_misc | ||
28 | &pmx_sdio_cd | ||
29 | >; | ||
30 | pinctrl-names = "default"; | ||
31 | |||
32 | pmx_led_health: pmx-led-health { | ||
33 | marvell,pins = "mpp7"; | ||
34 | marvell,function = "gpo"; | ||
35 | }; | ||
36 | |||
37 | pmx_sata1: pmx-sata1 { | ||
38 | marvell,pins = "mpp34"; | ||
39 | marvell,function = "sata1"; | ||
40 | }; | ||
41 | |||
42 | pmx_sata0: pmx-sata0 { | ||
43 | marvell,pins = "mpp35"; | ||
44 | marvell,function = "sata0"; | ||
45 | }; | ||
46 | |||
47 | pmx_led_user1o: pmx-led-user1o { | ||
48 | marvell,pins = "mpp40"; | ||
49 | marvell,function = "gpio"; | ||
50 | }; | ||
51 | |||
52 | pmx_led_user1g: pmx-led-user1g { | ||
53 | marvell,pins = "mpp41"; | ||
54 | marvell,function = "gpio"; | ||
55 | }; | ||
56 | |||
57 | pmx_led_user0o: pmx-led-user0o { | ||
58 | marvell,pins = "mpp44"; | ||
59 | marvell,function = "gpio"; | ||
60 | }; | ||
61 | |||
62 | pmx_led_user0g: pmx-led-user0g { | ||
63 | marvell,pins = "mpp45"; | ||
64 | marvell,function = "gpio"; | ||
65 | }; | ||
66 | |||
67 | pmx_led_misc: pmx-led-misc { | ||
68 | marvell,pins = "mpp46"; | ||
69 | marvell,function = "gpio"; | ||
70 | }; | ||
71 | |||
72 | pmx_sdio_cd: pmx-sdio-cd { | ||
73 | marvell,pins = "mpp47"; | ||
74 | marvell,function = "gpio"; | ||
75 | }; | ||
76 | }; | ||
77 | |||
78 | i2c@11000 { | ||
79 | status = "okay"; | ||
80 | |||
81 | rtc@51 { | ||
82 | compatible = "nxp,pcf8563"; | ||
83 | reg = <0x51>; | ||
84 | }; | ||
85 | |||
86 | eeprom@57 { | ||
87 | compatible = "atmel,24c02"; | ||
88 | reg = <0x57>; | ||
89 | }; | ||
90 | |||
91 | }; | ||
92 | |||
93 | serial@12000 { | ||
94 | clock-frequency = <200000000>; | ||
95 | status = "ok"; | ||
96 | }; | ||
97 | |||
98 | nand@3000000 { | ||
99 | status = "okay"; | ||
100 | |||
101 | partition@0 { | ||
102 | label = "uboot"; | ||
103 | reg = <0x0000000 0x100000>; | ||
104 | }; | ||
105 | |||
106 | partition@100000 { | ||
107 | label = "env"; | ||
108 | reg = <0x100000 0x80000>; | ||
109 | }; | ||
110 | |||
111 | partition@180000 { | ||
112 | label = "fdt"; | ||
113 | reg = <0x180000 0x80000>; | ||
114 | }; | ||
115 | |||
116 | partition@200000 { | ||
117 | label = "kernel"; | ||
118 | reg = <0x200000 0x400000>; | ||
119 | }; | ||
120 | |||
121 | partition@600000 { | ||
122 | label = "rootfs"; | ||
123 | reg = <0x600000 0x1fa00000>; | ||
124 | }; | ||
125 | }; | ||
126 | |||
127 | rtc@10300 { | ||
128 | status = "disabled"; | ||
129 | }; | ||
130 | |||
131 | sata@80000 { | ||
132 | nr-ports = <2>; | ||
133 | status = "okay"; | ||
134 | |||
135 | }; | ||
136 | }; | ||
137 | |||
138 | gpio-leds { | ||
139 | compatible = "gpio-leds"; | ||
140 | |||
141 | health { | ||
142 | label = "status:green:health"; | ||
143 | gpios = <&gpio0 7 1>; | ||
144 | }; | ||
145 | |||
146 | user1o { | ||
147 | label = "user1:orange"; | ||
148 | gpios = <&gpio1 8 1>; | ||
149 | default-state = "on"; | ||
150 | }; | ||
151 | |||
152 | user1g { | ||
153 | label = "user1:green"; | ||
154 | gpios = <&gpio1 9 1>; | ||
155 | default-state = "on"; | ||
156 | }; | ||
157 | |||
158 | user0o { | ||
159 | label = "user0:orange"; | ||
160 | gpios = <&gpio1 12 1>; | ||
161 | default-state = "on"; | ||
162 | }; | ||
163 | |||
164 | user0g { | ||
165 | label = "user0:green"; | ||
166 | gpios = <&gpio1 13 1>; | ||
167 | default-state = "on"; | ||
168 | }; | ||
169 | |||
170 | misc { | ||
171 | label = "status:orange:misc"; | ||
172 | gpios = <&gpio1 14 1>; | ||
173 | default-state = "on"; | ||
174 | }; | ||
175 | |||
176 | }; | ||
177 | }; | ||
178 | |||
diff --git a/arch/arm/boot/dts/kirkwood-ns2-common.dtsi b/arch/arm/boot/dts/kirkwood-ns2-common.dtsi new file mode 100644 index 000000000000..9bc6785ad228 --- /dev/null +++ b/arch/arm/boot/dts/kirkwood-ns2-common.dtsi | |||
@@ -0,0 +1,63 @@ | |||
1 | /include/ "kirkwood.dtsi" | ||
2 | |||
3 | / { | ||
4 | chosen { | ||
5 | bootargs = "console=ttyS0,115200n8"; | ||
6 | }; | ||
7 | |||
8 | ocp@f1000000 { | ||
9 | serial@12000 { | ||
10 | clock-frequency = <166666667>; | ||
11 | status = "okay"; | ||
12 | }; | ||
13 | |||
14 | spi@10600 { | ||
15 | status = "okay"; | ||
16 | |||
17 | flash@0 { | ||
18 | #address-cells = <1>; | ||
19 | #size-cells = <1>; | ||
20 | compatible = "mx25l4005a"; | ||
21 | reg = <0>; | ||
22 | spi-max-frequency = <20000000>; | ||
23 | mode = <0>; | ||
24 | |||
25 | partition@0 { | ||
26 | reg = <0x0 0x80000>; | ||
27 | label = "u-boot"; | ||
28 | }; | ||
29 | }; | ||
30 | }; | ||
31 | |||
32 | i2c@11000 { | ||
33 | status = "okay"; | ||
34 | |||
35 | eeprom@50 { | ||
36 | compatible = "at,24c04"; | ||
37 | pagesize = <16>; | ||
38 | reg = <0x50>; | ||
39 | }; | ||
40 | }; | ||
41 | }; | ||
42 | |||
43 | gpio_keys { | ||
44 | compatible = "gpio-keys"; | ||
45 | #address-cells = <1>; | ||
46 | #size-cells = <0>; | ||
47 | |||
48 | button@1 { | ||
49 | label = "Power push button"; | ||
50 | linux,code = <116>; | ||
51 | gpios = <&gpio1 0 0>; | ||
52 | }; | ||
53 | }; | ||
54 | |||
55 | gpio-leds { | ||
56 | compatible = "gpio-leds"; | ||
57 | |||
58 | red-fail { | ||
59 | label = "ns2:red:fail"; | ||
60 | gpios = <&gpio0 12 0>; | ||
61 | }; | ||
62 | }; | ||
63 | }; | ||
diff --git a/arch/arm/boot/dts/kirkwood-ns2.dts b/arch/arm/boot/dts/kirkwood-ns2.dts new file mode 100644 index 000000000000..f2d36ecf36d8 --- /dev/null +++ b/arch/arm/boot/dts/kirkwood-ns2.dts | |||
@@ -0,0 +1,30 @@ | |||
1 | /dts-v1/; | ||
2 | |||
3 | /include/ "kirkwood-ns2-common.dtsi" | ||
4 | |||
5 | / { | ||
6 | model = "LaCie Network Space v2"; | ||
7 | compatible = "lacie,netspace_v2", "marvell,kirkwood-88f6281", "marvell,kirkwood"; | ||
8 | |||
9 | memory { | ||
10 | device_type = "memory"; | ||
11 | reg = <0x00000000 0x10000000>; | ||
12 | }; | ||
13 | |||
14 | ocp@f1000000 { | ||
15 | sata@80000 { | ||
16 | status = "okay"; | ||
17 | nr-ports = <1>; | ||
18 | }; | ||
19 | }; | ||
20 | |||
21 | ns2-leds { | ||
22 | compatible = "lacie,ns2-leds"; | ||
23 | |||
24 | blue-sata { | ||
25 | label = "ns2:blue:sata"; | ||
26 | slow-gpio = <&gpio0 29 0>; | ||
27 | cmd-gpio = <&gpio0 30 0>; | ||
28 | }; | ||
29 | }; | ||
30 | }; | ||
diff --git a/arch/arm/boot/dts/kirkwood-ns2lite.dts b/arch/arm/boot/dts/kirkwood-ns2lite.dts new file mode 100644 index 000000000000..b02eb4ea1bb4 --- /dev/null +++ b/arch/arm/boot/dts/kirkwood-ns2lite.dts | |||
@@ -0,0 +1,30 @@ | |||
1 | /dts-v1/; | ||
2 | |||
3 | /include/ "kirkwood-ns2-common.dtsi" | ||
4 | |||
5 | / { | ||
6 | model = "LaCie Network Space Lite v2"; | ||
7 | compatible = "lacie,netspace_lite_v2", "marvell,kirkwood-88f6192", "marvell,kirkwood"; | ||
8 | |||
9 | memory { | ||
10 | device_type = "memory"; | ||
11 | reg = <0x00000000 0x8000000>; | ||
12 | }; | ||
13 | |||
14 | ocp@f1000000 { | ||
15 | sata@80000 { | ||
16 | status = "okay"; | ||
17 | nr-ports = <1>; | ||
18 | }; | ||
19 | }; | ||
20 | |||
21 | gpio-leds { | ||
22 | compatible = "gpio-leds"; | ||
23 | |||
24 | blue-sata { | ||
25 | label = "ns2:blue:sata"; | ||
26 | gpios = <&gpio0 30 1>; | ||
27 | linux,default-trigger = "default-on"; | ||
28 | }; | ||
29 | }; | ||
30 | }; | ||
diff --git a/arch/arm/boot/dts/kirkwood-ns2max.dts b/arch/arm/boot/dts/kirkwood-ns2max.dts new file mode 100644 index 000000000000..bcec4d6cada7 --- /dev/null +++ b/arch/arm/boot/dts/kirkwood-ns2max.dts | |||
@@ -0,0 +1,49 @@ | |||
1 | /dts-v1/; | ||
2 | |||
3 | /include/ "kirkwood-ns2-common.dtsi" | ||
4 | |||
5 | / { | ||
6 | model = "LaCie Network Space Max v2"; | ||
7 | compatible = "lacie,netspace_max_v2", "marvell,kirkwood-88f6281", "marvell,kirkwood"; | ||
8 | |||
9 | memory { | ||
10 | device_type = "memory"; | ||
11 | reg = <0x00000000 0x10000000>; | ||
12 | }; | ||
13 | |||
14 | ocp@f1000000 { | ||
15 | sata@80000 { | ||
16 | status = "okay"; | ||
17 | nr-ports = <2>; | ||
18 | }; | ||
19 | }; | ||
20 | |||
21 | gpio_fan { | ||
22 | compatible = "gpio-fan"; | ||
23 | gpios = <&gpio0 22 1 | ||
24 | &gpio0 7 1 | ||
25 | &gpio1 1 1 | ||
26 | &gpio0 23 1>; | ||
27 | gpio-fan,speed-map = | ||
28 | < 0 0 | ||
29 | 1500 15 | ||
30 | 1700 14 | ||
31 | 1800 13 | ||
32 | 2100 12 | ||
33 | 3100 11 | ||
34 | 3300 10 | ||
35 | 4300 9 | ||
36 | 5500 8>; | ||
37 | alarm-gpios = <&gpio0 25 1>; | ||
38 | }; | ||
39 | |||
40 | ns2-leds { | ||
41 | compatible = "lacie,ns2-leds"; | ||
42 | |||
43 | blue-sata { | ||
44 | label = "ns2:blue:sata"; | ||
45 | slow-gpio = <&gpio0 29 0>; | ||
46 | cmd-gpio = <&gpio0 30 0>; | ||
47 | }; | ||
48 | }; | ||
49 | }; | ||
diff --git a/arch/arm/boot/dts/kirkwood-ns2mini.dts b/arch/arm/boot/dts/kirkwood-ns2mini.dts new file mode 100644 index 000000000000..b79f5eb25589 --- /dev/null +++ b/arch/arm/boot/dts/kirkwood-ns2mini.dts | |||
@@ -0,0 +1,49 @@ | |||
1 | /dts-v1/; | ||
2 | |||
3 | /include/ "kirkwood-ns2-common.dtsi" | ||
4 | |||
5 | / { | ||
6 | model = "LaCie Network Space Mini v2"; | ||
7 | compatible = "lacie,netspace_mini_v2", "marvell,kirkwood-88f6192", "marvell,kirkwood"; | ||
8 | |||
9 | memory { | ||
10 | device_type = "memory"; | ||
11 | reg = <0x00000000 0x8000000>; | ||
12 | }; | ||
13 | |||
14 | ocp@f1000000 { | ||
15 | sata@80000 { | ||
16 | status = "okay"; | ||
17 | nr-ports = <1>; | ||
18 | }; | ||
19 | }; | ||
20 | |||
21 | gpio_fan { | ||
22 | compatible = "gpio-fan"; | ||
23 | gpios = <&gpio0 22 1 | ||
24 | &gpio0 7 1 | ||
25 | &gpio1 1 1 | ||
26 | &gpio0 23 1>; | ||
27 | gpio-fan,speed-map = | ||
28 | < 0 0 | ||
29 | 3000 15 | ||
30 | 3180 14 | ||
31 | 4140 13 | ||
32 | 4570 12 | ||
33 | 6760 11 | ||
34 | 7140 10 | ||
35 | 7980 9 | ||
36 | 9200 8>; | ||
37 | alarm-gpios = <&gpio0 25 1>; | ||
38 | }; | ||
39 | |||
40 | ns2-leds { | ||
41 | compatible = "lacie,ns2-leds"; | ||
42 | |||
43 | blue-sata { | ||
44 | label = "ns2:blue:sata"; | ||
45 | slow-gpio = <&gpio0 29 0>; | ||
46 | cmd-gpio = <&gpio0 30 0>; | ||
47 | }; | ||
48 | }; | ||
49 | }; | ||
diff --git a/arch/arm/boot/dts/kirkwood-nsa310.dts b/arch/arm/boot/dts/kirkwood-nsa310.dts new file mode 100644 index 000000000000..5509f9659546 --- /dev/null +++ b/arch/arm/boot/dts/kirkwood-nsa310.dts | |||
@@ -0,0 +1,144 @@ | |||
1 | /dts-v1/; | ||
2 | |||
3 | /include/ "kirkwood.dtsi" | ||
4 | |||
5 | / { | ||
6 | model = "ZyXEL NSA310"; | ||
7 | compatible = "zyxel,nsa310", "marvell,kirkwood-88f6281", "marvell,kirkwood"; | ||
8 | |||
9 | memory { | ||
10 | device_type = "memory"; | ||
11 | reg = <0x00000000 0x10000000>; | ||
12 | }; | ||
13 | |||
14 | chosen { | ||
15 | bootargs = "console=ttyS0,115200"; | ||
16 | }; | ||
17 | |||
18 | ocp@f1000000 { | ||
19 | |||
20 | serial@12000 { | ||
21 | clock-frequency = <200000000>; | ||
22 | status = "ok"; | ||
23 | }; | ||
24 | |||
25 | sata@80000 { | ||
26 | status = "okay"; | ||
27 | nr-ports = <2>; | ||
28 | }; | ||
29 | |||
30 | i2c@11000 { | ||
31 | status = "okay"; | ||
32 | }; | ||
33 | |||
34 | nand@3000000 { | ||
35 | status = "okay"; | ||
36 | chip-delay = <35>; | ||
37 | |||
38 | partition@0 { | ||
39 | label = "uboot"; | ||
40 | reg = <0x0000000 0x0100000>; | ||
41 | read-only; | ||
42 | }; | ||
43 | partition@100000 { | ||
44 | label = "uboot_env"; | ||
45 | reg = <0x0100000 0x0080000>; | ||
46 | }; | ||
47 | partition@180000 { | ||
48 | label = "key_store"; | ||
49 | reg = <0x0180000 0x0080000>; | ||
50 | }; | ||
51 | partition@200000 { | ||
52 | label = "info"; | ||
53 | reg = <0x0200000 0x0080000>; | ||
54 | }; | ||
55 | partition@280000 { | ||
56 | label = "etc"; | ||
57 | reg = <0x0280000 0x0a00000>; | ||
58 | }; | ||
59 | partition@c80000 { | ||
60 | label = "kernel_1"; | ||
61 | reg = <0x0c80000 0x0a00000>; | ||
62 | }; | ||
63 | partition@1680000 { | ||
64 | label = "rootfs1"; | ||
65 | reg = <0x1680000 0x2fc0000>; | ||
66 | }; | ||
67 | partition@4640000 { | ||
68 | label = "kernel_2"; | ||
69 | reg = <0x4640000 0x0a00000>; | ||
70 | }; | ||
71 | partition@5040000 { | ||
72 | label = "rootfs2"; | ||
73 | reg = <0x5040000 0x2fc0000>; | ||
74 | }; | ||
75 | }; | ||
76 | }; | ||
77 | |||
78 | gpio_keys { | ||
79 | compatible = "gpio-keys"; | ||
80 | #address-cells = <1>; | ||
81 | #size-cells = <0>; | ||
82 | |||
83 | button@1 { | ||
84 | label = "Power Button"; | ||
85 | linux,code = <116>; | ||
86 | gpios = <&gpio1 14 0>; | ||
87 | }; | ||
88 | button@2 { | ||
89 | label = "Copy Button"; | ||
90 | linux,code = <133>; | ||
91 | gpios = <&gpio1 5 1>; | ||
92 | }; | ||
93 | button@3 { | ||
94 | label = "Reset Button"; | ||
95 | linux,code = <0x198>; | ||
96 | gpios = <&gpio1 4 1>; | ||
97 | }; | ||
98 | }; | ||
99 | |||
100 | gpio-leds { | ||
101 | compatible = "gpio-leds"; | ||
102 | |||
103 | green-sys { | ||
104 | label = "nsa310:green:sys"; | ||
105 | gpios = <&gpio0 28 0>; | ||
106 | }; | ||
107 | red-sys { | ||
108 | label = "nsa310:red:sys"; | ||
109 | gpios = <&gpio0 29 0>; | ||
110 | }; | ||
111 | green-hdd { | ||
112 | label = "nsa310:green:hdd"; | ||
113 | gpios = <&gpio1 9 0>; | ||
114 | }; | ||
115 | red-hdd { | ||
116 | label = "nsa310:red:hdd"; | ||
117 | gpios = <&gpio1 10 0>; | ||
118 | }; | ||
119 | green-esata { | ||
120 | label = "nsa310:green:esata"; | ||
121 | gpios = <&gpio0 12 0>; | ||
122 | }; | ||
123 | red-esata { | ||
124 | label = "nsa310:red:esata"; | ||
125 | gpios = <&gpio0 13 0>; | ||
126 | }; | ||
127 | green-usb { | ||
128 | label = "nsa310:green:usb"; | ||
129 | gpios = <&gpio0 15 0>; | ||
130 | }; | ||
131 | red-usb { | ||
132 | label = "nsa310:red:usb"; | ||
133 | gpios = <&gpio0 16 0>; | ||
134 | }; | ||
135 | green-copy { | ||
136 | label = "nsa310:green:copy"; | ||
137 | gpios = <&gpio1 7 0>; | ||
138 | }; | ||
139 | red-copy { | ||
140 | label = "nsa310:red:copy"; | ||
141 | gpios = <&gpio1 8 0>; | ||
142 | }; | ||
143 | }; | ||
144 | }; | ||
diff --git a/arch/arm/boot/dts/kirkwood-openblocks_a6.dts b/arch/arm/boot/dts/kirkwood-openblocks_a6.dts new file mode 100644 index 000000000000..49d3d74d4d38 --- /dev/null +++ b/arch/arm/boot/dts/kirkwood-openblocks_a6.dts | |||
@@ -0,0 +1,98 @@ | |||
1 | /dts-v1/; | ||
2 | |||
3 | /include/ "kirkwood.dtsi" | ||
4 | /include/ "kirkwood-6282.dtsi" | ||
5 | |||
6 | / { | ||
7 | model = "Plat'Home OpenBlocksA6"; | ||
8 | compatible = "plathome,openblocks-a6", "marvell,kirkwood-88f6283", "marvell,kirkwood"; | ||
9 | |||
10 | memory { | ||
11 | device_type = "memory"; | ||
12 | reg = <0x00000000 0x20000000>; | ||
13 | }; | ||
14 | |||
15 | chosen { | ||
16 | bootargs = "console=ttyS0,115200n8 earlyprintk"; | ||
17 | }; | ||
18 | |||
19 | ocp@f1000000 { | ||
20 | serial@12000 { | ||
21 | clock-frequency = <200000000>; | ||
22 | status = "ok"; | ||
23 | }; | ||
24 | |||
25 | serial@12100 { | ||
26 | clock-frequency = <200000000>; | ||
27 | status = "ok"; | ||
28 | }; | ||
29 | |||
30 | nand@3000000 { | ||
31 | chip-delay = <25>; | ||
32 | status = "okay"; | ||
33 | |||
34 | partition@0 { | ||
35 | label = "uboot"; | ||
36 | reg = <0x0 0x90000>; | ||
37 | }; | ||
38 | |||
39 | partition@90000 { | ||
40 | label = "env"; | ||
41 | reg = <0x90000 0x44000>; | ||
42 | }; | ||
43 | |||
44 | partition@d4000 { | ||
45 | label = "test"; | ||
46 | reg = <0xd4000 0x24000>; | ||
47 | }; | ||
48 | |||
49 | partition@f4000 { | ||
50 | label = "conf"; | ||
51 | reg = <0xf4000 0x400000>; | ||
52 | }; | ||
53 | |||
54 | partition@4f4000 { | ||
55 | label = "linux"; | ||
56 | reg = <0x4f4000 0x1d20000>; | ||
57 | }; | ||
58 | |||
59 | partition@2214000 { | ||
60 | label = "user"; | ||
61 | reg = <0x2214000 0x1dec000>; | ||
62 | }; | ||
63 | }; | ||
64 | |||
65 | sata@80000 { | ||
66 | nr-ports = <1>; | ||
67 | status = "okay"; | ||
68 | }; | ||
69 | |||
70 | i2c@11100 { | ||
71 | status = "okay"; | ||
72 | |||
73 | s35390a: s35390a@30 { | ||
74 | compatible = "s35390a"; | ||
75 | reg = <0x30>; | ||
76 | }; | ||
77 | }; | ||
78 | }; | ||
79 | |||
80 | gpio-leds { | ||
81 | compatible = "gpio-leds"; | ||
82 | |||
83 | led-red { | ||
84 | label = "obsa6:red:stat"; | ||
85 | gpios = <&gpio1 9 1>; | ||
86 | }; | ||
87 | |||
88 | led-green { | ||
89 | label = "obsa6:green:stat"; | ||
90 | gpios = <&gpio1 10 1>; | ||
91 | }; | ||
92 | |||
93 | led-yellow { | ||
94 | label = "obsa6:yellow:stat"; | ||
95 | gpios = <&gpio1 11 1>; | ||
96 | }; | ||
97 | }; | ||
98 | }; | ||
diff --git a/arch/arm/boot/dts/kirkwood-topkick.dts b/arch/arm/boot/dts/kirkwood-topkick.dts new file mode 100644 index 000000000000..c0de5a7f660d --- /dev/null +++ b/arch/arm/boot/dts/kirkwood-topkick.dts | |||
@@ -0,0 +1,85 @@ | |||
1 | /dts-v1/; | ||
2 | |||
3 | /include/ "kirkwood.dtsi" | ||
4 | |||
5 | / { | ||
6 | model = "Univeral Scientific Industrial Co. Topkick-1281P2"; | ||
7 | compatible = "usi,topkick-1281P2", "usi,topkick", "marvell,kirkwood-88f6282", "marvell,kirkwood"; | ||
8 | |||
9 | memory { | ||
10 | device_type = "memory"; | ||
11 | reg = <0x00000000 0x10000000>; | ||
12 | }; | ||
13 | |||
14 | chosen { | ||
15 | bootargs = "console=ttyS0,115200n8 earlyprintk"; | ||
16 | }; | ||
17 | |||
18 | ocp@f1000000 { | ||
19 | serial@12000 { | ||
20 | clock-frequency = <200000000>; | ||
21 | status = "ok"; | ||
22 | }; | ||
23 | |||
24 | nand@3000000 { | ||
25 | status = "okay"; | ||
26 | |||
27 | partition@0 { | ||
28 | label = "u-boot"; | ||
29 | reg = <0x0000000 0x180000>; | ||
30 | }; | ||
31 | |||
32 | partition@180000 { | ||
33 | label = "u-boot env"; | ||
34 | reg = <0x0180000 0x20000>; | ||
35 | }; | ||
36 | |||
37 | partition@200000 { | ||
38 | label = "uImage"; | ||
39 | reg = <0x0200000 0x600000>; | ||
40 | }; | ||
41 | |||
42 | partition@800000 { | ||
43 | label = "uInitrd"; | ||
44 | reg = <0x0800000 0x1000000>; | ||
45 | }; | ||
46 | |||
47 | partition@1800000 { | ||
48 | label = "rootfs"; | ||
49 | reg = <0x1800000 0xe800000>; | ||
50 | }; | ||
51 | }; | ||
52 | |||
53 | sata@80000 { | ||
54 | status = "okay"; | ||
55 | nr-ports = <1>; | ||
56 | }; | ||
57 | }; | ||
58 | |||
59 | gpio-leds { | ||
60 | compatible = "gpio-leds"; | ||
61 | |||
62 | disk { | ||
63 | label = "topkick:yellow:disk"; | ||
64 | gpios = <&gpio0 21 1>; | ||
65 | linux,default-trigger = "ide-disk"; | ||
66 | }; | ||
67 | system2 { | ||
68 | label = "topkick:red:system"; | ||
69 | gpios = <&gpio1 5 1>; | ||
70 | }; | ||
71 | system { | ||
72 | label = "topkick:blue:system"; | ||
73 | gpios = <&gpio1 6 1>; | ||
74 | default-state = "on"; | ||
75 | }; | ||
76 | wifi { | ||
77 | label = "topkick:green:wifi"; | ||
78 | gpios = <&gpio1 7 1>; | ||
79 | }; | ||
80 | wifi2 { | ||
81 | label = "topkick:yellow:wifi"; | ||
82 | gpios = <&gpio1 16 1>; | ||
83 | }; | ||
84 | }; | ||
85 | }; | ||
diff --git a/arch/arm/boot/dts/kirkwood-ts219-6281.dts b/arch/arm/boot/dts/kirkwood-ts219-6281.dts index ccbf32757800..8295c833887f 100644 --- a/arch/arm/boot/dts/kirkwood-ts219-6281.dts +++ b/arch/arm/boot/dts/kirkwood-ts219-6281.dts | |||
@@ -1,8 +1,39 @@ | |||
1 | /dts-v1/; | 1 | /dts-v1/; |
2 | 2 | ||
3 | /include/ "kirkwood-ts219.dtsi" | 3 | /include/ "kirkwood-ts219.dtsi" |
4 | /include/ "kirkwood-6281.dtsi" | ||
4 | 5 | ||
5 | / { | 6 | / { |
7 | ocp@f1000000 { | ||
8 | pinctrl: pinctrl@10000 { | ||
9 | |||
10 | pinctrl-0 = < &pmx_uart0 &pmx_uart1 &pmx_spi | ||
11 | &pmx_twsi0 &pmx_sata0 &pmx_sata1 | ||
12 | &pmx_ram_size &pmx_reset_button | ||
13 | &pmx_USB_copy_button &pmx_board_id>; | ||
14 | pinctrl-names = "default"; | ||
15 | |||
16 | pmx_ram_size: pmx-ram-size { | ||
17 | /* RAM: 0: 256 MB, 1: 512 MB */ | ||
18 | marvell,pins = "mpp36"; | ||
19 | marvell,function = "gpio"; | ||
20 | }; | ||
21 | pmx_USB_copy_button: pmx-USB-copy-button { | ||
22 | marvell,pins = "mpp15"; | ||
23 | marvell,function = "gpio"; | ||
24 | }; | ||
25 | pmx_reset_button: pmx-reset-button { | ||
26 | marvell,pins = "mpp16"; | ||
27 | marvell,function = "gpio"; | ||
28 | }; | ||
29 | pmx_board_id: pmx-board-id { | ||
30 | /* 0: TS-11x, 1: TS-21x */ | ||
31 | marvell,pins = "mpp44"; | ||
32 | marvell,function = "gpio"; | ||
33 | }; | ||
34 | }; | ||
35 | }; | ||
36 | |||
6 | gpio_keys { | 37 | gpio_keys { |
7 | compatible = "gpio-keys"; | 38 | compatible = "gpio-keys"; |
8 | #address-cells = <1>; | 39 | #address-cells = <1>; |
diff --git a/arch/arm/boot/dts/kirkwood-ts219-6282.dts b/arch/arm/boot/dts/kirkwood-ts219-6282.dts index fbe9932161a1..df3f95dfba33 100644 --- a/arch/arm/boot/dts/kirkwood-ts219-6282.dts +++ b/arch/arm/boot/dts/kirkwood-ts219-6282.dts | |||
@@ -1,8 +1,39 @@ | |||
1 | /dts-v1/; | 1 | /dts-v1/; |
2 | 2 | ||
3 | /include/ "kirkwood-ts219.dtsi" | 3 | /include/ "kirkwood-ts219.dtsi" |
4 | /include/ "kirkwood-6282.dtsi" | ||
4 | 5 | ||
5 | / { | 6 | / { |
7 | ocp@f1000000 { | ||
8 | pinctrl: pinctrl@10000 { | ||
9 | |||
10 | pinctrl-0 = < &pmx_uart0 &pmx_uart1 &pmx_spi | ||
11 | &pmx_twsi0 &pmx_sata0 &pmx_sata1 | ||
12 | &pmx_ram_size &pmx_reset_button | ||
13 | &pmx_USB_copy_button &pmx_board_id>; | ||
14 | pinctrl-names = "default"; | ||
15 | |||
16 | pmx_ram_size: pmx-ram-size { | ||
17 | /* RAM: 0: 256 MB, 1: 512 MB */ | ||
18 | marvell,pins = "mpp36"; | ||
19 | marvell,function = "gpio"; | ||
20 | }; | ||
21 | pmx_reset_button: pmx-reset-button { | ||
22 | marvell,pins = "mpp37"; | ||
23 | marvell,function = "gpio"; | ||
24 | }; | ||
25 | pmx_USB_copy_button: pmx-USB-copy-button { | ||
26 | marvell,pins = "mpp43"; | ||
27 | marvell,function = "gpio"; | ||
28 | }; | ||
29 | pmx_board_id: pmx-board-id { | ||
30 | /* 0: TS-11x, 1: TS-21x */ | ||
31 | marvell,pins = "mpp44"; | ||
32 | marvell,function = "gpio"; | ||
33 | }; | ||
34 | }; | ||
35 | }; | ||
36 | |||
6 | gpio_keys { | 37 | gpio_keys { |
7 | compatible = "gpio-keys"; | 38 | compatible = "gpio-keys"; |
8 | #address-cells = <1>; | 39 | #address-cells = <1>; |
diff --git a/arch/arm/boot/dts/kirkwood.dtsi b/arch/arm/boot/dts/kirkwood.dtsi index 4e5b8154a5be..a990c30f0a26 100644 --- a/arch/arm/boot/dts/kirkwood.dtsi +++ b/arch/arm/boot/dts/kirkwood.dtsi | |||
@@ -4,6 +4,10 @@ | |||
4 | compatible = "marvell,kirkwood"; | 4 | compatible = "marvell,kirkwood"; |
5 | interrupt-parent = <&intc>; | 5 | interrupt-parent = <&intc>; |
6 | 6 | ||
7 | aliases { | ||
8 | gpio0 = &gpio0; | ||
9 | gpio1 = &gpio1; | ||
10 | }; | ||
7 | intc: interrupt-controller { | 11 | intc: interrupt-controller { |
8 | compatible = "marvell,orion-intc", "marvell,intc"; | 12 | compatible = "marvell,orion-intc", "marvell,intc"; |
9 | interrupt-controller; | 13 | interrupt-controller; |
@@ -24,7 +28,8 @@ | |||
24 | #gpio-cells = <2>; | 28 | #gpio-cells = <2>; |
25 | gpio-controller; | 29 | gpio-controller; |
26 | reg = <0x10100 0x40>; | 30 | reg = <0x10100 0x40>; |
27 | ngpio = <32>; | 31 | ngpios = <32>; |
32 | interrupt-controller; | ||
28 | interrupts = <35>, <36>, <37>, <38>; | 33 | interrupts = <35>, <36>, <37>, <38>; |
29 | }; | 34 | }; |
30 | 35 | ||
@@ -33,7 +38,8 @@ | |||
33 | #gpio-cells = <2>; | 38 | #gpio-cells = <2>; |
34 | gpio-controller; | 39 | gpio-controller; |
35 | reg = <0x10140 0x40>; | 40 | reg = <0x10140 0x40>; |
36 | ngpio = <18>; | 41 | ngpios = <18>; |
42 | interrupt-controller; | ||
37 | interrupts = <39>, <40>, <41>; | 43 | interrupts = <39>, <40>, <41>; |
38 | }; | 44 | }; |
39 | 45 | ||
@@ -77,6 +83,13 @@ | |||
77 | status = "okay"; | 83 | status = "okay"; |
78 | }; | 84 | }; |
79 | 85 | ||
86 | ehci@50000 { | ||
87 | compatible = "marvell,orion-ehci"; | ||
88 | reg = <0x50000 0x1000>; | ||
89 | interrupts = <19>; | ||
90 | status = "okay"; | ||
91 | }; | ||
92 | |||
80 | sata@80000 { | 93 | sata@80000 { |
81 | compatible = "marvell,orion-sata"; | 94 | compatible = "marvell,orion-sata"; |
82 | reg = <0x80000 0x5000>; | 95 | reg = <0x80000 0x5000>; |
diff --git a/arch/arm/boot/dts/orion5x-lacie-ethernet-disk-mini-v2.dts b/arch/arm/boot/dts/orion5x-lacie-ethernet-disk-mini-v2.dts new file mode 100644 index 000000000000..5a3a58b7e18f --- /dev/null +++ b/arch/arm/boot/dts/orion5x-lacie-ethernet-disk-mini-v2.dts | |||
@@ -0,0 +1,55 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2012 Thomas Petazzoni <thomas.petazzoni@free-electrons.com> | ||
3 | * | ||
4 | * This file is licensed under the terms of the GNU General Public | ||
5 | * License version 2. This program is licensed "as is" without any | ||
6 | * warranty of any kind, whether express or implied. | ||
7 | */ | ||
8 | |||
9 | /dts-v1/; | ||
10 | /include/ "orion5x.dtsi" | ||
11 | |||
12 | / { | ||
13 | model = "LaCie Ethernet Disk mini V2"; | ||
14 | compatible = "lacie,ethernet-disk-mini-v2", "marvell-orion5x-88f5182", "marvell,orion5x"; | ||
15 | |||
16 | memory { | ||
17 | reg = <0x00000000 0x4000000>; /* 64 MB */ | ||
18 | }; | ||
19 | |||
20 | chosen { | ||
21 | bootargs = "console=ttyS0,115200n8 earlyprintk"; | ||
22 | }; | ||
23 | |||
24 | ocp@f1000000 { | ||
25 | serial@12000 { | ||
26 | clock-frequency = <166666667>; | ||
27 | status = "okay"; | ||
28 | }; | ||
29 | |||
30 | sata@80000 { | ||
31 | status = "okay"; | ||
32 | nr-ports = <2>; | ||
33 | }; | ||
34 | }; | ||
35 | |||
36 | gpio_keys { | ||
37 | compatible = "gpio-keys"; | ||
38 | #address-cells = <1>; | ||
39 | #size-cells = <0>; | ||
40 | button@1 { | ||
41 | label = "Power-on Switch"; | ||
42 | linux,code = <116>; /* KEY_POWER */ | ||
43 | gpios = <&gpio0 18 0>; | ||
44 | }; | ||
45 | }; | ||
46 | |||
47 | gpio_leds { | ||
48 | compatible = "gpio-leds"; | ||
49 | |||
50 | led@1 { | ||
51 | label = "power:blue"; | ||
52 | gpios = <&gpio0 16 1>; | ||
53 | }; | ||
54 | }; | ||
55 | }; | ||
diff --git a/arch/arm/boot/dts/orion5x.dtsi b/arch/arm/boot/dts/orion5x.dtsi new file mode 100644 index 000000000000..8aad00f81ed9 --- /dev/null +++ b/arch/arm/boot/dts/orion5x.dtsi | |||
@@ -0,0 +1,98 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2012 Thomas Petazzoni <thomas.petazzoni@free-electrons.com> | ||
3 | * | ||
4 | * This file is licensed under the terms of the GNU General Public | ||
5 | * License version 2. This program is licensed "as is" without any | ||
6 | * warranty of any kind, whether express or implied. | ||
7 | */ | ||
8 | |||
9 | /include/ "skeleton.dtsi" | ||
10 | |||
11 | / { | ||
12 | model = "Marvell Orion5x SoC"; | ||
13 | compatible = "marvell,orion5x"; | ||
14 | interrupt-parent = <&intc>; | ||
15 | |||
16 | intc: interrupt-controller { | ||
17 | compatible = "marvell,orion-intc", "marvell,intc"; | ||
18 | interrupt-controller; | ||
19 | #interrupt-cells = <1>; | ||
20 | reg = <0xf1020204 0x04>; | ||
21 | }; | ||
22 | |||
23 | ocp@f1000000 { | ||
24 | compatible = "simple-bus"; | ||
25 | ranges = <0x00000000 0xf1000000 0x4000000 | ||
26 | 0xf2200000 0xf2200000 0x0000800>; | ||
27 | #address-cells = <1>; | ||
28 | #size-cells = <1>; | ||
29 | |||
30 | gpio0: gpio@10100 { | ||
31 | compatible = "marvell,orion-gpio"; | ||
32 | #gpio-cells = <2>; | ||
33 | gpio-controller; | ||
34 | reg = <0x10100 0x40>; | ||
35 | ngpio = <32>; | ||
36 | interrupts = <6>, <7>, <8>, <9>; | ||
37 | }; | ||
38 | |||
39 | serial@12000 { | ||
40 | compatible = "ns16550a"; | ||
41 | reg = <0x12000 0x100>; | ||
42 | reg-shift = <2>; | ||
43 | interrupts = <3>; | ||
44 | /* set clock-frequency in board dts */ | ||
45 | status = "disabled"; | ||
46 | }; | ||
47 | |||
48 | serial@12100 { | ||
49 | compatible = "ns16550a"; | ||
50 | reg = <0x12100 0x100>; | ||
51 | reg-shift = <2>; | ||
52 | interrupts = <4>; | ||
53 | /* set clock-frequency in board dts */ | ||
54 | status = "disabled"; | ||
55 | }; | ||
56 | |||
57 | spi@10600 { | ||
58 | compatible = "marvell,orion-spi"; | ||
59 | #address-cells = <1>; | ||
60 | #size-cells = <0>; | ||
61 | cell-index = <0>; | ||
62 | reg = <0x10600 0x28>; | ||
63 | status = "disabled"; | ||
64 | }; | ||
65 | |||
66 | wdt@20300 { | ||
67 | compatible = "marvell,orion-wdt"; | ||
68 | reg = <0x20300 0x28>; | ||
69 | status = "okay"; | ||
70 | }; | ||
71 | |||
72 | sata@80000 { | ||
73 | compatible = "marvell,orion-sata"; | ||
74 | reg = <0x80000 0x5000>; | ||
75 | interrupts = <29>; | ||
76 | status = "disabled"; | ||
77 | }; | ||
78 | |||
79 | i2c@11000 { | ||
80 | compatible = "marvell,mv64xxx-i2c"; | ||
81 | reg = <0x11000 0x20>; | ||
82 | #address-cells = <1>; | ||
83 | #size-cells = <0>; | ||
84 | interrupts = <5>; | ||
85 | clock-frequency = <100000>; | ||
86 | status = "disabled"; | ||
87 | }; | ||
88 | |||
89 | crypto@90000 { | ||
90 | compatible = "marvell,orion-crypto"; | ||
91 | reg = <0x90000 0x10000>, | ||
92 | <0xf2200000 0x800>; | ||
93 | reg-names = "regs", "sram"; | ||
94 | interrupts = <22>; | ||
95 | status = "okay"; | ||
96 | }; | ||
97 | }; | ||
98 | }; | ||
diff --git a/arch/arm/boot/dts/tegra30.dtsi b/arch/arm/boot/dts/tegra30.dtsi index 1f7f49aabe6b..efa603d47a6a 100644 --- a/arch/arm/boot/dts/tegra30.dtsi +++ b/arch/arm/boot/dts/tegra30.dtsi | |||
@@ -169,8 +169,8 @@ | |||
169 | 169 | ||
170 | pinmux: pinmux { | 170 | pinmux: pinmux { |
171 | compatible = "nvidia,tegra30-pinmux"; | 171 | compatible = "nvidia,tegra30-pinmux"; |
172 | reg = <0x70000868 0xd0 /* Pad control registers */ | 172 | reg = <0x70000868 0xd4 /* Pad control registers */ |
173 | 0x70003000 0x3e0>; /* Mux registers */ | 173 | 0x70003000 0x3e4>; /* Mux registers */ |
174 | }; | 174 | }; |
175 | 175 | ||
176 | serial@70006000 { | 176 | serial@70006000 { |
diff --git a/arch/arm/configs/dove_defconfig b/arch/arm/configs/dove_defconfig index 40db34cf2771..0b7ee92c5713 100644 --- a/arch/arm/configs/dove_defconfig +++ b/arch/arm/configs/dove_defconfig | |||
@@ -8,11 +8,19 @@ CONFIG_MODULE_UNLOAD=y | |||
8 | # CONFIG_BLK_DEV_BSG is not set | 8 | # CONFIG_BLK_DEV_BSG is not set |
9 | CONFIG_ARCH_DOVE=y | 9 | CONFIG_ARCH_DOVE=y |
10 | CONFIG_MACH_DOVE_DB=y | 10 | CONFIG_MACH_DOVE_DB=y |
11 | CONFIG_MACH_CM_A510=y | ||
12 | CONFIG_MACH_DOVE_DT=y | ||
11 | CONFIG_NO_HZ=y | 13 | CONFIG_NO_HZ=y |
12 | CONFIG_HIGH_RES_TIMERS=y | 14 | CONFIG_HIGH_RES_TIMERS=y |
13 | CONFIG_AEABI=y | 15 | CONFIG_AEABI=y |
14 | CONFIG_ZBOOT_ROM_TEXT=0x0 | 16 | CONFIG_ZBOOT_ROM_TEXT=0x0 |
15 | CONFIG_ZBOOT_ROM_BSS=0x0 | 17 | CONFIG_ZBOOT_ROM_BSS=0x0 |
18 | CONFIG_HIGHMEM=y | ||
19 | CONFIG_USE_OF=y | ||
20 | CONFIG_ATAGS=y | ||
21 | CONFIG_ARM_APPENDED_DTB=y | ||
22 | CONFIG_ARM_ATAG_DTB_COMPAT=y | ||
23 | CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_FROM_BOOTLOADER=y | ||
16 | CONFIG_VFP=y | 24 | CONFIG_VFP=y |
17 | CONFIG_NET=y | 25 | CONFIG_NET=y |
18 | CONFIG_PACKET=y | 26 | CONFIG_PACKET=y |
@@ -62,6 +70,9 @@ CONFIG_SERIAL_8250=y | |||
62 | CONFIG_SERIAL_8250_CONSOLE=y | 70 | CONFIG_SERIAL_8250_CONSOLE=y |
63 | # CONFIG_SERIAL_8250_PCI is not set | 71 | # CONFIG_SERIAL_8250_PCI is not set |
64 | CONFIG_SERIAL_8250_RUNTIME_UARTS=2 | 72 | CONFIG_SERIAL_8250_RUNTIME_UARTS=2 |
73 | CONFIG_SERIAL_CORE=y | ||
74 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
75 | CONFIG_SERIAL_OF_PLATFORM=y | ||
65 | # CONFIG_HW_RANDOM is not set | 76 | # CONFIG_HW_RANDOM is not set |
66 | CONFIG_I2C=y | 77 | CONFIG_I2C=y |
67 | CONFIG_I2C_CHARDEV=y | 78 | CONFIG_I2C_CHARDEV=y |
@@ -74,6 +85,18 @@ CONFIG_USB_DEVICEFS=y | |||
74 | CONFIG_USB_EHCI_HCD=y | 85 | CONFIG_USB_EHCI_HCD=y |
75 | CONFIG_USB_EHCI_ROOT_HUB_TT=y | 86 | CONFIG_USB_EHCI_ROOT_HUB_TT=y |
76 | CONFIG_USB_STORAGE=y | 87 | CONFIG_USB_STORAGE=y |
88 | CONFIG_MMC=y | ||
89 | CONFIG_MMC_SDHCI=y | ||
90 | CONFIG_MMC_SDHCI_IO_ACCESSORS=y | ||
91 | CONFIG_MMC_SDHCI_PLTFM=y | ||
92 | CONFIG_MMC_SDHCI_DOVE=y | ||
93 | CONFIG_NEW_LEDS=y | ||
94 | CONFIG_LEDS_CLASS=y | ||
95 | CONFIG_LEDS_GPIO=y | ||
96 | CONFIG_LEDS_TRIGGERS=y | ||
97 | CONFIG_LEDS_TRIGGER_TIMER=y | ||
98 | CONFIG_LEDS_TRIGGER_HEARTBEAT=y | ||
99 | CONFIG_LEDS_TRIGGER_DEFAULT_ON=y | ||
77 | CONFIG_RTC_CLASS=y | 100 | CONFIG_RTC_CLASS=y |
78 | CONFIG_RTC_DRV_MV=y | 101 | CONFIG_RTC_DRV_MV=y |
79 | CONFIG_DMADEVICES=y | 102 | CONFIG_DMADEVICES=y |
@@ -122,6 +145,7 @@ CONFIG_CRYPTO_TWOFISH=y | |||
122 | CONFIG_CRYPTO_DEFLATE=y | 145 | CONFIG_CRYPTO_DEFLATE=y |
123 | CONFIG_CRYPTO_LZO=y | 146 | CONFIG_CRYPTO_LZO=y |
124 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | 147 | # CONFIG_CRYPTO_ANSI_CPRNG is not set |
148 | CONFIG_CRYPTO_DEV_MV_CESA=y | ||
125 | CONFIG_CRC_CCITT=y | 149 | CONFIG_CRC_CCITT=y |
126 | CONFIG_CRC16=y | 150 | CONFIG_CRC16=y |
127 | CONFIG_LIBCRC32C=y | 151 | CONFIG_LIBCRC32C=y |
diff --git a/arch/arm/configs/kirkwood_defconfig b/arch/arm/configs/kirkwood_defconfig index 74eee0c78f28..93f3794ba5cb 100644 --- a/arch/arm/configs/kirkwood_defconfig +++ b/arch/arm/configs/kirkwood_defconfig | |||
@@ -27,6 +27,14 @@ CONFIG_MACH_GOFLEXNET_DT=y | |||
27 | CONFIG_MACH_LSXL_DT=y | 27 | CONFIG_MACH_LSXL_DT=y |
28 | CONFIG_MACH_IOMEGA_IX2_200_DT=y | 28 | CONFIG_MACH_IOMEGA_IX2_200_DT=y |
29 | CONFIG_MACH_KM_KIRKWOOD_DT=y | 29 | CONFIG_MACH_KM_KIRKWOOD_DT=y |
30 | CONFIG_MACH_INETSPACE_V2_DT=y | ||
31 | CONFIG_MACH_MPLCEC4_DT=y | ||
32 | CONFIG_MACH_NETSPACE_V2_DT=y | ||
33 | CONFIG_MACH_NETSPACE_MAX_V2_DT=y | ||
34 | CONFIG_MACH_NETSPACE_LITE_V2_DT=y | ||
35 | CONFIG_MACH_NETSPACE_MINI_V2_DT=y | ||
36 | CONFIG_MACH_OPENBLOCKS_A6_DT=y | ||
37 | CONFIG_MACH_TOPKICK_DT=y | ||
30 | CONFIG_MACH_TS219=y | 38 | CONFIG_MACH_TS219=y |
31 | CONFIG_MACH_TS41X=y | 39 | CONFIG_MACH_TS41X=y |
32 | CONFIG_MACH_DOCKSTAR=y | 40 | CONFIG_MACH_DOCKSTAR=y |
@@ -40,6 +48,7 @@ CONFIG_MACH_D2NET_V2=y | |||
40 | CONFIG_MACH_NET2BIG_V2=y | 48 | CONFIG_MACH_NET2BIG_V2=y |
41 | CONFIG_MACH_NET5BIG_V2=y | 49 | CONFIG_MACH_NET5BIG_V2=y |
42 | CONFIG_MACH_T5325=y | 50 | CONFIG_MACH_T5325=y |
51 | CONFIG_MACH_NSA310_DT=y | ||
43 | # CONFIG_CPU_FEROCEON_OLD_ID is not set | 52 | # CONFIG_CPU_FEROCEON_OLD_ID is not set |
44 | CONFIG_PREEMPT=y | 53 | CONFIG_PREEMPT=y |
45 | CONFIG_AEABI=y | 54 | CONFIG_AEABI=y |
diff --git a/arch/arm/configs/orion5x_defconfig b/arch/arm/configs/orion5x_defconfig index cd5e6ba9a54d..952430d9e2d9 100644 --- a/arch/arm/configs/orion5x_defconfig +++ b/arch/arm/configs/orion5x_defconfig | |||
@@ -1,7 +1,8 @@ | |||
1 | CONFIG_EXPERIMENTAL=y | 1 | CONFIG_EXPERIMENTAL=y |
2 | CONFIG_SYSVIPC=y | 2 | CONFIG_SYSVIPC=y |
3 | CONFIG_NO_HZ=y | ||
4 | CONFIG_HIGH_RES_TIMERS=y | ||
3 | CONFIG_LOG_BUF_SHIFT=14 | 5 | CONFIG_LOG_BUF_SHIFT=14 |
4 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
5 | CONFIG_EXPERT=y | 6 | CONFIG_EXPERT=y |
6 | # CONFIG_SLUB_DEBUG is not set | 7 | # CONFIG_SLUB_DEBUG is not set |
7 | CONFIG_PROFILING=y | 8 | CONFIG_PROFILING=y |
@@ -10,6 +11,8 @@ CONFIG_KPROBES=y | |||
10 | CONFIG_MODULES=y | 11 | CONFIG_MODULES=y |
11 | CONFIG_MODULE_UNLOAD=y | 12 | CONFIG_MODULE_UNLOAD=y |
12 | # CONFIG_BLK_DEV_BSG is not set | 13 | # CONFIG_BLK_DEV_BSG is not set |
14 | CONFIG_PARTITION_ADVANCED=y | ||
15 | CONFIG_BSD_DISKLABEL=y | ||
13 | CONFIG_ARCH_ORION5X=y | 16 | CONFIG_ARCH_ORION5X=y |
14 | CONFIG_MACH_DB88F5281=y | 17 | CONFIG_MACH_DB88F5281=y |
15 | CONFIG_MACH_RD88F5182=y | 18 | CONFIG_MACH_RD88F5182=y |
@@ -24,7 +27,7 @@ CONFIG_MACH_TS409=y | |||
24 | CONFIG_MACH_WRT350N_V2=y | 27 | CONFIG_MACH_WRT350N_V2=y |
25 | CONFIG_MACH_TS78XX=y | 28 | CONFIG_MACH_TS78XX=y |
26 | CONFIG_MACH_MV2120=y | 29 | CONFIG_MACH_MV2120=y |
27 | CONFIG_MACH_EDMINI_V2=y | 30 | CONFIG_MACH_EDMINI_V2_DT=y |
28 | CONFIG_MACH_D2NET=y | 31 | CONFIG_MACH_D2NET=y |
29 | CONFIG_MACH_BIGDISK=y | 32 | CONFIG_MACH_BIGDISK=y |
30 | CONFIG_MACH_NET2BIG=y | 33 | CONFIG_MACH_NET2BIG=y |
@@ -33,17 +36,13 @@ CONFIG_MACH_WNR854T=y | |||
33 | CONFIG_MACH_RD88F5181L_GE=y | 36 | CONFIG_MACH_RD88F5181L_GE=y |
34 | CONFIG_MACH_RD88F5181L_FXO=y | 37 | CONFIG_MACH_RD88F5181L_FXO=y |
35 | CONFIG_MACH_RD88F6183AP_GE=y | 38 | CONFIG_MACH_RD88F6183AP_GE=y |
36 | CONFIG_NO_HZ=y | ||
37 | CONFIG_HIGH_RES_TIMERS=y | ||
38 | CONFIG_PREEMPT=y | 39 | CONFIG_PREEMPT=y |
39 | CONFIG_AEABI=y | 40 | CONFIG_AEABI=y |
40 | CONFIG_LEDS=y | ||
41 | CONFIG_LEDS_CPU=y | ||
42 | CONFIG_ZBOOT_ROM_TEXT=0x0 | 41 | CONFIG_ZBOOT_ROM_TEXT=0x0 |
43 | CONFIG_ZBOOT_ROM_BSS=0x0 | 42 | CONFIG_ZBOOT_ROM_BSS=0x0 |
43 | CONFIG_ARM_APPENDED_DTB=y | ||
44 | CONFIG_FPE_NWFPE=y | 44 | CONFIG_FPE_NWFPE=y |
45 | CONFIG_VFP=y | 45 | CONFIG_VFP=y |
46 | # CONFIG_SUSPEND is not set | ||
47 | CONFIG_NET=y | 46 | CONFIG_NET=y |
48 | CONFIG_PACKET=y | 47 | CONFIG_PACKET=y |
49 | CONFIG_UNIX=y | 48 | CONFIG_UNIX=y |
@@ -54,13 +53,10 @@ CONFIG_IP_PNP_DHCP=y | |||
54 | CONFIG_IP_PNP_BOOTP=y | 53 | CONFIG_IP_PNP_BOOTP=y |
55 | # CONFIG_IPV6 is not set | 54 | # CONFIG_IPV6 is not set |
56 | CONFIG_NET_DSA=y | 55 | CONFIG_NET_DSA=y |
57 | CONFIG_NET_DSA_MV88E6131=y | ||
58 | CONFIG_NET_DSA_MV88E6123_61_65=y | ||
59 | CONFIG_NET_PKTGEN=m | 56 | CONFIG_NET_PKTGEN=m |
60 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | 57 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" |
61 | # CONFIG_FIRMWARE_IN_KERNEL is not set | 58 | # CONFIG_FIRMWARE_IN_KERNEL is not set |
62 | CONFIG_MTD=y | 59 | CONFIG_MTD=y |
63 | CONFIG_MTD_PARTITIONS=y | ||
64 | CONFIG_MTD_CMDLINE_PARTS=y | 60 | CONFIG_MTD_CMDLINE_PARTS=y |
65 | CONFIG_MTD_CHAR=y | 61 | CONFIG_MTD_CHAR=y |
66 | CONFIG_MTD_BLOCK=y | 62 | CONFIG_MTD_BLOCK=y |
@@ -82,12 +78,11 @@ CONFIG_CHR_DEV_SG=m | |||
82 | CONFIG_ATA=y | 78 | CONFIG_ATA=y |
83 | CONFIG_SATA_MV=y | 79 | CONFIG_SATA_MV=y |
84 | CONFIG_NETDEVICES=y | 80 | CONFIG_NETDEVICES=y |
85 | CONFIG_MARVELL_PHY=y | ||
86 | CONFIG_NET_ETHERNET=y | ||
87 | CONFIG_MII=y | 81 | CONFIG_MII=y |
88 | CONFIG_NET_PCI=y | 82 | CONFIG_NET_DSA_MV88E6131=y |
83 | CONFIG_NET_DSA_MV88E6123_61_65=y | ||
89 | CONFIG_MV643XX_ETH=y | 84 | CONFIG_MV643XX_ETH=y |
90 | # CONFIG_NETDEV_10000 is not set | 85 | CONFIG_MARVELL_PHY=y |
91 | # CONFIG_INPUT_MOUSEDEV is not set | 86 | # CONFIG_INPUT_MOUSEDEV is not set |
92 | CONFIG_INPUT_EVDEV=y | 87 | CONFIG_INPUT_EVDEV=y |
93 | # CONFIG_KEYBOARD_ATKBD is not set | 88 | # CONFIG_KEYBOARD_ATKBD is not set |
@@ -95,11 +90,12 @@ CONFIG_KEYBOARD_GPIO=y | |||
95 | # CONFIG_INPUT_MOUSE is not set | 90 | # CONFIG_INPUT_MOUSE is not set |
96 | # CONFIG_SERIO is not set | 91 | # CONFIG_SERIO is not set |
97 | # CONFIG_VT is not set | 92 | # CONFIG_VT is not set |
93 | CONFIG_LEGACY_PTY_COUNT=16 | ||
98 | CONFIG_SERIAL_8250=y | 94 | CONFIG_SERIAL_8250=y |
99 | CONFIG_SERIAL_8250_CONSOLE=y | 95 | CONFIG_SERIAL_8250_CONSOLE=y |
100 | # CONFIG_SERIAL_8250_PCI is not set | 96 | # CONFIG_SERIAL_8250_PCI is not set |
101 | CONFIG_SERIAL_8250_RUNTIME_UARTS=2 | 97 | CONFIG_SERIAL_8250_RUNTIME_UARTS=2 |
102 | CONFIG_LEGACY_PTY_COUNT=16 | 98 | CONFIG_SERIAL_OF_PLATFORM=y |
103 | CONFIG_HW_RANDOM_TIMERIOMEM=m | 99 | CONFIG_HW_RANDOM_TIMERIOMEM=m |
104 | CONFIG_I2C=y | 100 | CONFIG_I2C=y |
105 | # CONFIG_I2C_COMPAT is not set | 101 | # CONFIG_I2C_COMPAT is not set |
@@ -109,10 +105,8 @@ CONFIG_GPIO_SYSFS=y | |||
109 | CONFIG_SENSORS_LM75=y | 105 | CONFIG_SENSORS_LM75=y |
110 | # CONFIG_VGA_ARB is not set | 106 | # CONFIG_VGA_ARB is not set |
111 | CONFIG_USB=y | 107 | CONFIG_USB=y |
112 | CONFIG_USB_DEVICEFS=y | ||
113 | CONFIG_USB_EHCI_HCD=y | 108 | CONFIG_USB_EHCI_HCD=y |
114 | CONFIG_USB_EHCI_ROOT_HUB_TT=y | 109 | CONFIG_USB_EHCI_ROOT_HUB_TT=y |
115 | CONFIG_USB_EHCI_TT_NEWSCHED=y | ||
116 | CONFIG_USB_PRINTER=y | 110 | CONFIG_USB_PRINTER=y |
117 | CONFIG_USB_STORAGE=y | 111 | CONFIG_USB_STORAGE=y |
118 | CONFIG_USB_STORAGE_DATAFAB=y | 112 | CONFIG_USB_STORAGE_DATAFAB=y |
@@ -140,7 +134,6 @@ CONFIG_EXT2_FS=y | |||
140 | CONFIG_EXT3_FS=y | 134 | CONFIG_EXT3_FS=y |
141 | # CONFIG_EXT3_FS_XATTR is not set | 135 | # CONFIG_EXT3_FS_XATTR is not set |
142 | CONFIG_EXT4_FS=m | 136 | CONFIG_EXT4_FS=m |
143 | CONFIG_INOTIFY=y | ||
144 | CONFIG_ISO9660_FS=m | 137 | CONFIG_ISO9660_FS=m |
145 | CONFIG_JOLIET=y | 138 | CONFIG_JOLIET=y |
146 | CONFIG_UDF_FS=m | 139 | CONFIG_UDF_FS=m |
@@ -150,25 +143,18 @@ CONFIG_TMPFS=y | |||
150 | CONFIG_JFFS2_FS=y | 143 | CONFIG_JFFS2_FS=y |
151 | CONFIG_CRAMFS=y | 144 | CONFIG_CRAMFS=y |
152 | CONFIG_NFS_FS=y | 145 | CONFIG_NFS_FS=y |
153 | CONFIG_NFS_V3=y | ||
154 | CONFIG_ROOT_NFS=y | 146 | CONFIG_ROOT_NFS=y |
155 | CONFIG_PARTITION_ADVANCED=y | ||
156 | CONFIG_BSD_DISKLABEL=y | ||
157 | CONFIG_NLS_CODEPAGE_437=y | 147 | CONFIG_NLS_CODEPAGE_437=y |
158 | CONFIG_NLS_CODEPAGE_850=y | 148 | CONFIG_NLS_CODEPAGE_850=y |
159 | CONFIG_NLS_ISO8859_1=y | 149 | CONFIG_NLS_ISO8859_1=y |
160 | CONFIG_NLS_ISO8859_2=y | 150 | CONFIG_NLS_ISO8859_2=y |
161 | CONFIG_MAGIC_SYSRQ=y | 151 | CONFIG_MAGIC_SYSRQ=y |
162 | CONFIG_DEBUG_FS=y | 152 | CONFIG_DEBUG_FS=y |
163 | CONFIG_DEBUG_KERNEL=y | ||
164 | # CONFIG_DEBUG_BUGVERBOSE is not set | 153 | # CONFIG_DEBUG_BUGVERBOSE is not set |
165 | CONFIG_DEBUG_INFO=y | 154 | CONFIG_DEBUG_INFO=y |
166 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | ||
167 | CONFIG_LATENCYTOP=y | 155 | CONFIG_LATENCYTOP=y |
168 | CONFIG_SYSCTL_SYSCALL_CHECK=y | ||
169 | # CONFIG_FTRACE is not set | 156 | # CONFIG_FTRACE is not set |
170 | CONFIG_DEBUG_USER=y | 157 | CONFIG_DEBUG_USER=y |
171 | CONFIG_DEBUG_ERRORS=y | ||
172 | CONFIG_DEBUG_LL=y | 158 | CONFIG_DEBUG_LL=y |
173 | CONFIG_CRYPTO_CBC=m | 159 | CONFIG_CRYPTO_CBC=m |
174 | CONFIG_CRYPTO_ECB=m | 160 | CONFIG_CRYPTO_ECB=m |
diff --git a/arch/arm/mach-at91/at91rm9200_devices.c b/arch/arm/mach-at91/at91rm9200_devices.c index 1e122bcd7845..3cee0e6ea7c3 100644 --- a/arch/arm/mach-at91/at91rm9200_devices.c +++ b/arch/arm/mach-at91/at91rm9200_devices.c | |||
@@ -68,7 +68,7 @@ void __init at91_add_device_usbh(struct at91_usbh_data *data) | |||
68 | 68 | ||
69 | /* Enable overcurrent notification */ | 69 | /* Enable overcurrent notification */ |
70 | for (i = 0; i < data->ports; i++) { | 70 | for (i = 0; i < data->ports; i++) { |
71 | if (data->overcurrent_pin[i]) | 71 | if (gpio_is_valid(data->overcurrent_pin[i])) |
72 | at91_set_gpio_input(data->overcurrent_pin[i], 1); | 72 | at91_set_gpio_input(data->overcurrent_pin[i], 1); |
73 | } | 73 | } |
74 | 74 | ||
diff --git a/arch/arm/mach-at91/at91sam9260_devices.c b/arch/arm/mach-at91/at91sam9260_devices.c index aa1e58729885..414bd855fb0c 100644 --- a/arch/arm/mach-at91/at91sam9260_devices.c +++ b/arch/arm/mach-at91/at91sam9260_devices.c | |||
@@ -72,7 +72,7 @@ void __init at91_add_device_usbh(struct at91_usbh_data *data) | |||
72 | 72 | ||
73 | /* Enable overcurrent notification */ | 73 | /* Enable overcurrent notification */ |
74 | for (i = 0; i < data->ports; i++) { | 74 | for (i = 0; i < data->ports; i++) { |
75 | if (data->overcurrent_pin[i]) | 75 | if (gpio_is_valid(data->overcurrent_pin[i])) |
76 | at91_set_gpio_input(data->overcurrent_pin[i], 1); | 76 | at91_set_gpio_input(data->overcurrent_pin[i], 1); |
77 | } | 77 | } |
78 | 78 | ||
diff --git a/arch/arm/mach-at91/at91sam9261_devices.c b/arch/arm/mach-at91/at91sam9261_devices.c index b9487696b7be..cd604aad8e96 100644 --- a/arch/arm/mach-at91/at91sam9261_devices.c +++ b/arch/arm/mach-at91/at91sam9261_devices.c | |||
@@ -72,7 +72,7 @@ void __init at91_add_device_usbh(struct at91_usbh_data *data) | |||
72 | 72 | ||
73 | /* Enable overcurrent notification */ | 73 | /* Enable overcurrent notification */ |
74 | for (i = 0; i < data->ports; i++) { | 74 | for (i = 0; i < data->ports; i++) { |
75 | if (data->overcurrent_pin[i]) | 75 | if (gpio_is_valid(data->overcurrent_pin[i])) |
76 | at91_set_gpio_input(data->overcurrent_pin[i], 1); | 76 | at91_set_gpio_input(data->overcurrent_pin[i], 1); |
77 | } | 77 | } |
78 | 78 | ||
diff --git a/arch/arm/mach-at91/at91sam9263_devices.c b/arch/arm/mach-at91/at91sam9263_devices.c index cb85da2eccea..9c61e59a2104 100644 --- a/arch/arm/mach-at91/at91sam9263_devices.c +++ b/arch/arm/mach-at91/at91sam9263_devices.c | |||
@@ -78,7 +78,7 @@ void __init at91_add_device_usbh(struct at91_usbh_data *data) | |||
78 | 78 | ||
79 | /* Enable overcurrent notification */ | 79 | /* Enable overcurrent notification */ |
80 | for (i = 0; i < data->ports; i++) { | 80 | for (i = 0; i < data->ports; i++) { |
81 | if (data->overcurrent_pin[i]) | 81 | if (gpio_is_valid(data->overcurrent_pin[i])) |
82 | at91_set_gpio_input(data->overcurrent_pin[i], 1); | 82 | at91_set_gpio_input(data->overcurrent_pin[i], 1); |
83 | } | 83 | } |
84 | 84 | ||
diff --git a/arch/arm/mach-at91/at91sam9g45_devices.c b/arch/arm/mach-at91/at91sam9g45_devices.c index b1596072dcc2..fcd233cb33d2 100644 --- a/arch/arm/mach-at91/at91sam9g45_devices.c +++ b/arch/arm/mach-at91/at91sam9g45_devices.c | |||
@@ -1841,8 +1841,8 @@ static struct resource sha_resources[] = { | |||
1841 | .flags = IORESOURCE_MEM, | 1841 | .flags = IORESOURCE_MEM, |
1842 | }, | 1842 | }, |
1843 | [1] = { | 1843 | [1] = { |
1844 | .start = AT91SAM9G45_ID_AESTDESSHA, | 1844 | .start = NR_IRQS_LEGACY + AT91SAM9G45_ID_AESTDESSHA, |
1845 | .end = AT91SAM9G45_ID_AESTDESSHA, | 1845 | .end = NR_IRQS_LEGACY + AT91SAM9G45_ID_AESTDESSHA, |
1846 | .flags = IORESOURCE_IRQ, | 1846 | .flags = IORESOURCE_IRQ, |
1847 | }, | 1847 | }, |
1848 | }; | 1848 | }; |
@@ -1874,8 +1874,8 @@ static struct resource tdes_resources[] = { | |||
1874 | .flags = IORESOURCE_MEM, | 1874 | .flags = IORESOURCE_MEM, |
1875 | }, | 1875 | }, |
1876 | [1] = { | 1876 | [1] = { |
1877 | .start = AT91SAM9G45_ID_AESTDESSHA, | 1877 | .start = NR_IRQS_LEGACY + AT91SAM9G45_ID_AESTDESSHA, |
1878 | .end = AT91SAM9G45_ID_AESTDESSHA, | 1878 | .end = NR_IRQS_LEGACY + AT91SAM9G45_ID_AESTDESSHA, |
1879 | .flags = IORESOURCE_IRQ, | 1879 | .flags = IORESOURCE_IRQ, |
1880 | }, | 1880 | }, |
1881 | }; | 1881 | }; |
@@ -1910,8 +1910,8 @@ static struct resource aes_resources[] = { | |||
1910 | .flags = IORESOURCE_MEM, | 1910 | .flags = IORESOURCE_MEM, |
1911 | }, | 1911 | }, |
1912 | [1] = { | 1912 | [1] = { |
1913 | .start = AT91SAM9G45_ID_AESTDESSHA, | 1913 | .start = NR_IRQS_LEGACY + AT91SAM9G45_ID_AESTDESSHA, |
1914 | .end = AT91SAM9G45_ID_AESTDESSHA, | 1914 | .end = NR_IRQS_LEGACY + AT91SAM9G45_ID_AESTDESSHA, |
1915 | .flags = IORESOURCE_IRQ, | 1915 | .flags = IORESOURCE_IRQ, |
1916 | }, | 1916 | }, |
1917 | }; | 1917 | }; |
diff --git a/arch/arm/mach-highbank/system.c b/arch/arm/mach-highbank/system.c index 82c27230d4a9..86e37cd9376c 100644 --- a/arch/arm/mach-highbank/system.c +++ b/arch/arm/mach-highbank/system.c | |||
@@ -28,6 +28,7 @@ void highbank_restart(char mode, const char *cmd) | |||
28 | hignbank_set_pwr_soft_reset(); | 28 | hignbank_set_pwr_soft_reset(); |
29 | 29 | ||
30 | scu_power_mode(scu_base_addr, SCU_PM_POWEROFF); | 30 | scu_power_mode(scu_base_addr, SCU_PM_POWEROFF); |
31 | cpu_do_idle(); | 31 | while (1) |
32 | cpu_do_idle(); | ||
32 | } | 33 | } |
33 | 34 | ||
diff --git a/arch/arm/mach-imx/clk-gate2.c b/arch/arm/mach-imx/clk-gate2.c index 3c1b8ff9a0a6..cc49c7ae186e 100644 --- a/arch/arm/mach-imx/clk-gate2.c +++ b/arch/arm/mach-imx/clk-gate2.c | |||
@@ -112,7 +112,7 @@ struct clk *clk_register_gate2(struct device *dev, const char *name, | |||
112 | 112 | ||
113 | clk = clk_register(dev, &gate->hw); | 113 | clk = clk_register(dev, &gate->hw); |
114 | if (IS_ERR(clk)) | 114 | if (IS_ERR(clk)) |
115 | kfree(clk); | 115 | kfree(gate); |
116 | 116 | ||
117 | return clk; | 117 | return clk; |
118 | } | 118 | } |
diff --git a/arch/arm/mach-imx/ehci-imx25.c b/arch/arm/mach-imx/ehci-imx25.c index 27e40d17de99..134c190e3003 100644 --- a/arch/arm/mach-imx/ehci-imx25.c +++ b/arch/arm/mach-imx/ehci-imx25.c | |||
@@ -30,7 +30,7 @@ | |||
30 | #define MX25_H1_SIC_SHIFT 21 | 30 | #define MX25_H1_SIC_SHIFT 21 |
31 | #define MX25_H1_SIC_MASK (0x3 << MX25_H1_SIC_SHIFT) | 31 | #define MX25_H1_SIC_MASK (0x3 << MX25_H1_SIC_SHIFT) |
32 | #define MX25_H1_PP_BIT (1 << 18) | 32 | #define MX25_H1_PP_BIT (1 << 18) |
33 | #define MX25_H1_PM_BIT (1 << 8) | 33 | #define MX25_H1_PM_BIT (1 << 16) |
34 | #define MX25_H1_IPPUE_UP_BIT (1 << 7) | 34 | #define MX25_H1_IPPUE_UP_BIT (1 << 7) |
35 | #define MX25_H1_IPPUE_DOWN_BIT (1 << 6) | 35 | #define MX25_H1_IPPUE_DOWN_BIT (1 << 6) |
36 | #define MX25_H1_TLL_BIT (1 << 5) | 36 | #define MX25_H1_TLL_BIT (1 << 5) |
diff --git a/arch/arm/mach-imx/ehci-imx35.c b/arch/arm/mach-imx/ehci-imx35.c index a596f709a937..554e7cccff53 100644 --- a/arch/arm/mach-imx/ehci-imx35.c +++ b/arch/arm/mach-imx/ehci-imx35.c | |||
@@ -30,7 +30,7 @@ | |||
30 | #define MX35_H1_SIC_SHIFT 21 | 30 | #define MX35_H1_SIC_SHIFT 21 |
31 | #define MX35_H1_SIC_MASK (0x3 << MX35_H1_SIC_SHIFT) | 31 | #define MX35_H1_SIC_MASK (0x3 << MX35_H1_SIC_SHIFT) |
32 | #define MX35_H1_PP_BIT (1 << 18) | 32 | #define MX35_H1_PP_BIT (1 << 18) |
33 | #define MX35_H1_PM_BIT (1 << 8) | 33 | #define MX35_H1_PM_BIT (1 << 16) |
34 | #define MX35_H1_IPPUE_UP_BIT (1 << 7) | 34 | #define MX35_H1_IPPUE_UP_BIT (1 << 7) |
35 | #define MX35_H1_IPPUE_DOWN_BIT (1 << 6) | 35 | #define MX35_H1_IPPUE_DOWN_BIT (1 << 6) |
36 | #define MX35_H1_TLL_BIT (1 << 5) | 36 | #define MX35_H1_TLL_BIT (1 << 5) |
diff --git a/arch/arm/mach-kirkwood/Kconfig b/arch/arm/mach-kirkwood/Kconfig index 50bca5032b7e..503d7dd944ff 100644 --- a/arch/arm/mach-kirkwood/Kconfig +++ b/arch/arm/mach-kirkwood/Kconfig | |||
@@ -46,6 +46,11 @@ config MACH_GURUPLUG | |||
46 | 46 | ||
47 | config ARCH_KIRKWOOD_DT | 47 | config ARCH_KIRKWOOD_DT |
48 | bool "Marvell Kirkwood Flattened Device Tree" | 48 | bool "Marvell Kirkwood Flattened Device Tree" |
49 | select POWER_SUPPLY | ||
50 | select POWER_RESET | ||
51 | select POWER_RESET_GPIO | ||
52 | select REGULATOR | ||
53 | select REGULATOR_FIXED_VOLTAGE | ||
49 | select USE_OF | 54 | select USE_OF |
50 | help | 55 | help |
51 | Say 'Y' here if you want your kernel to support the | 56 | Say 'Y' here if you want your kernel to support the |
@@ -130,6 +135,63 @@ config MACH_KM_KIRKWOOD_DT | |||
130 | Say 'Y' here if you want your kernel to support the | 135 | Say 'Y' here if you want your kernel to support the |
131 | Keymile Kirkwood Reference Desgin, using Flattened Device Tree. | 136 | Keymile Kirkwood Reference Desgin, using Flattened Device Tree. |
132 | 137 | ||
138 | config MACH_INETSPACE_V2_DT | ||
139 | bool "LaCie Internet Space v2 NAS (Flattened Device Tree)" | ||
140 | select ARCH_KIRKWOOD_DT | ||
141 | help | ||
142 | Say 'Y' here if you want your kernel to support the LaCie | ||
143 | Internet Space v2 NAS, using Flattened Device Tree. | ||
144 | |||
145 | config MACH_MPLCEC4_DT | ||
146 | bool "MPL CEC4 (Flattened Device Tree)" | ||
147 | select ARCH_KIRKWOOD_DT | ||
148 | help | ||
149 | Say 'Y' here if you want your kernel to support the | ||
150 | MPL CEC4 (Flattened Device Tree). | ||
151 | |||
152 | config MACH_NETSPACE_V2_DT | ||
153 | bool "LaCie Network Space v2 NAS (Flattened Device Tree)" | ||
154 | select ARCH_KIRKWOOD_DT | ||
155 | help | ||
156 | Say 'Y' here if you want your kernel to support the LaCie | ||
157 | Network Space v2 NAS, using Flattened Device Tree. | ||
158 | |||
159 | config MACH_NETSPACE_MAX_V2_DT | ||
160 | bool "LaCie Network Space Max v2 NAS (Flattened Device Tree)" | ||
161 | select ARCH_KIRKWOOD_DT | ||
162 | help | ||
163 | Say 'Y' here if you want your kernel to support the LaCie | ||
164 | Network Space Max v2 NAS, using Flattened Device Tree. | ||
165 | |||
166 | config MACH_NETSPACE_LITE_V2_DT | ||
167 | bool "LaCie Network Space Lite v2 NAS (Flattened Device Tree)" | ||
168 | select ARCH_KIRKWOOD_DT | ||
169 | help | ||
170 | Say 'Y' here if you want your kernel to support the LaCie | ||
171 | Network Space Lite v2 NAS, using Flattened Device Tree. | ||
172 | |||
173 | config MACH_NETSPACE_MINI_V2_DT | ||
174 | bool "LaCie Network Space Mini v2 NAS (Flattened Device Tree)" | ||
175 | select ARCH_KIRKWOOD_DT | ||
176 | help | ||
177 | Say 'Y' here if you want your kernel to support the LaCie | ||
178 | Network Space Mini v2 NAS (aka SafeBox), using Flattened | ||
179 | Device Tree. | ||
180 | |||
181 | config MACH_OPENBLOCKS_A6_DT | ||
182 | bool "Plat'Home OpenBlocks A6 (Flattened Device Tree)" | ||
183 | select ARCH_KIRKWOOD_DT | ||
184 | help | ||
185 | Say 'Y' here if you want your kernel to support the | ||
186 | Plat'Home OpenBlocks A6 (Flattened Device Tree). | ||
187 | |||
188 | config MACH_TOPKICK_DT | ||
189 | bool "USI Topkick (Flattened Device Tree)" | ||
190 | select ARCH_KIRKWOOD_DT | ||
191 | help | ||
192 | Say 'Y' here if you want your kernel to support the | ||
193 | USI Topkick, using Flattened Device Tree | ||
194 | |||
133 | config MACH_TS219 | 195 | config MACH_TS219 |
134 | bool "QNAP TS-110, TS-119, TS-119P+, TS-210, TS-219, TS-219P and TS-219P+ Turbo NAS" | 196 | bool "QNAP TS-110, TS-119, TS-119P+, TS-210, TS-219, TS-219P and TS-219P+ Turbo NAS" |
135 | help | 197 | help |
@@ -216,6 +278,14 @@ config MACH_T5325 | |||
216 | Say 'Y' here if you want your kernel to support the | 278 | Say 'Y' here if you want your kernel to support the |
217 | HP t5325 Thin Client. | 279 | HP t5325 Thin Client. |
218 | 280 | ||
281 | config MACH_NSA310_DT | ||
282 | bool "ZyXEL NSA-310 (Flattened Device Tree)" | ||
283 | select ARCH_KIRKWOOD_DT | ||
284 | select ARM_ATAG_DTB_COMPAT | ||
285 | help | ||
286 | Say 'Y' here if you want your kernel to support the | ||
287 | ZyXEL NSA-310 board (Flattened Device Tree). | ||
288 | |||
219 | endmenu | 289 | endmenu |
220 | 290 | ||
221 | endif | 291 | endif |
diff --git a/arch/arm/mach-kirkwood/Makefile b/arch/arm/mach-kirkwood/Makefile index 294779f892d9..8d2e5a96247c 100644 --- a/arch/arm/mach-kirkwood/Makefile +++ b/arch/arm/mach-kirkwood/Makefile | |||
@@ -31,3 +31,12 @@ obj-$(CONFIG_MACH_GOFLEXNET_DT) += board-goflexnet.o | |||
31 | obj-$(CONFIG_MACH_LSXL_DT) += board-lsxl.o | 31 | obj-$(CONFIG_MACH_LSXL_DT) += board-lsxl.o |
32 | obj-$(CONFIG_MACH_IOMEGA_IX2_200_DT) += board-iomega_ix2_200.o | 32 | obj-$(CONFIG_MACH_IOMEGA_IX2_200_DT) += board-iomega_ix2_200.o |
33 | obj-$(CONFIG_MACH_KM_KIRKWOOD_DT) += board-km_kirkwood.o | 33 | obj-$(CONFIG_MACH_KM_KIRKWOOD_DT) += board-km_kirkwood.o |
34 | obj-$(CONFIG_MACH_INETSPACE_V2_DT) += board-ns2.o | ||
35 | obj-$(CONFIG_MACH_MPLCEC4_DT) += board-mplcec4.o | ||
36 | obj-$(CONFIG_MACH_NETSPACE_V2_DT) += board-ns2.o | ||
37 | obj-$(CONFIG_MACH_NETSPACE_MAX_V2_DT) += board-ns2.o | ||
38 | obj-$(CONFIG_MACH_NETSPACE_LITE_V2_DT) += board-ns2.o | ||
39 | obj-$(CONFIG_MACH_NETSPACE_MINI_V2_DT) += board-ns2.o | ||
40 | obj-$(CONFIG_MACH_NSA310_DT) += board-nsa310.o | ||
41 | obj-$(CONFIG_MACH_OPENBLOCKS_A6_DT) += board-openblocks_a6.o | ||
42 | obj-$(CONFIG_MACH_TOPKICK_DT) += board-usi_topkick.o | ||
diff --git a/arch/arm/mach-kirkwood/board-dnskw.c b/arch/arm/mach-kirkwood/board-dnskw.c index 43d16d6714b8..a1aa87f09180 100644 --- a/arch/arm/mach-kirkwood/board-dnskw.c +++ b/arch/arm/mach-kirkwood/board-dnskw.c | |||
@@ -17,51 +17,11 @@ | |||
17 | #include <linux/mv643xx_eth.h> | 17 | #include <linux/mv643xx_eth.h> |
18 | #include <linux/gpio.h> | 18 | #include <linux/gpio.h> |
19 | #include "common.h" | 19 | #include "common.h" |
20 | #include "mpp.h" | ||
21 | 20 | ||
22 | static struct mv643xx_eth_platform_data dnskw_ge00_data = { | 21 | static struct mv643xx_eth_platform_data dnskw_ge00_data = { |
23 | .phy_addr = MV643XX_ETH_PHY_ADDR(8), | 22 | .phy_addr = MV643XX_ETH_PHY_ADDR(8), |
24 | }; | 23 | }; |
25 | 24 | ||
26 | static unsigned int dnskw_mpp_config[] __initdata = { | ||
27 | MPP13_UART1_TXD, /* Custom ... */ | ||
28 | MPP14_UART1_RXD, /* ... Controller (DNS-320 only) */ | ||
29 | MPP20_SATA1_ACTn, /* LED: White Right HDD */ | ||
30 | MPP21_SATA0_ACTn, /* LED: White Left HDD */ | ||
31 | MPP24_GPIO, | ||
32 | MPP25_GPIO, | ||
33 | MPP26_GPIO, /* LED: Power */ | ||
34 | MPP27_GPIO, /* LED: Red Right HDD */ | ||
35 | MPP28_GPIO, /* LED: Red Left HDD */ | ||
36 | MPP29_GPIO, /* LED: Red USB (DNS-325 only) */ | ||
37 | MPP30_GPIO, | ||
38 | MPP31_GPIO, | ||
39 | MPP32_GPIO, | ||
40 | MPP33_GPO, | ||
41 | MPP34_GPIO, /* Button: Front power */ | ||
42 | MPP35_GPIO, /* LED: Red USB (DNS-320 only) */ | ||
43 | MPP36_GPIO, /* Power: Turn off board */ | ||
44 | MPP37_GPIO, /* Power: Turn back on after power failure */ | ||
45 | MPP38_GPIO, | ||
46 | MPP39_GPIO, /* Power: SATA0 */ | ||
47 | MPP40_GPIO, /* Power: SATA1 */ | ||
48 | MPP41_GPIO, /* SATA0 present */ | ||
49 | MPP42_GPIO, /* SATA1 present */ | ||
50 | MPP43_GPIO, /* LED: White USB */ | ||
51 | MPP44_GPIO, /* Fan: Tachometer Pin */ | ||
52 | MPP45_GPIO, /* Fan: high speed */ | ||
53 | MPP46_GPIO, /* Fan: low speed */ | ||
54 | MPP47_GPIO, /* Button: Back unmount */ | ||
55 | MPP48_GPIO, /* Button: Back reset */ | ||
56 | MPP49_GPIO, /* Temp Alarm (DNS-325) Pin of U5 (DNS-320) */ | ||
57 | 0 | ||
58 | }; | ||
59 | |||
60 | static void dnskw_power_off(void) | ||
61 | { | ||
62 | gpio_set_value(36, 1); | ||
63 | } | ||
64 | |||
65 | /* Register any GPIO for output and set the value */ | 25 | /* Register any GPIO for output and set the value */ |
66 | static void __init dnskw_gpio_register(unsigned gpio, char *name, int def) | 26 | static void __init dnskw_gpio_register(unsigned gpio, char *name, int def) |
67 | { | 27 | { |
@@ -76,22 +36,8 @@ static void __init dnskw_gpio_register(unsigned gpio, char *name, int def) | |||
76 | 36 | ||
77 | void __init dnskw_init(void) | 37 | void __init dnskw_init(void) |
78 | { | 38 | { |
79 | kirkwood_mpp_conf(dnskw_mpp_config); | ||
80 | |||
81 | kirkwood_ehci_init(); | ||
82 | kirkwood_ge00_init(&dnskw_ge00_data); | 39 | kirkwood_ge00_init(&dnskw_ge00_data); |
83 | 40 | ||
84 | /* Register power-off GPIO. */ | ||
85 | if (gpio_request(36, "dnskw:power:off") == 0 | ||
86 | && gpio_direction_output(36, 0) == 0) | ||
87 | pm_power_off = dnskw_power_off; | ||
88 | else | ||
89 | pr_err("dnskw: failed to configure power-off GPIO\n"); | ||
90 | |||
91 | /* Ensure power is supplied to both HDDs */ | ||
92 | dnskw_gpio_register(39, "dnskw:power:sata0", 1); | ||
93 | dnskw_gpio_register(40, "dnskw:power:sata1", 1); | ||
94 | |||
95 | /* Set NAS to turn back on after a power failure */ | 41 | /* Set NAS to turn back on after a power failure */ |
96 | dnskw_gpio_register(37, "dnskw:power:recover", 1); | 42 | dnskw_gpio_register(37, "dnskw:power:recover", 1); |
97 | } | 43 | } |
diff --git a/arch/arm/mach-kirkwood/board-dockstar.c b/arch/arm/mach-kirkwood/board-dockstar.c index f2fbb023e679..726cfc4b8921 100644 --- a/arch/arm/mach-kirkwood/board-dockstar.c +++ b/arch/arm/mach-kirkwood/board-dockstar.c | |||
@@ -24,7 +24,6 @@ | |||
24 | #include <linux/of_fdt.h> | 24 | #include <linux/of_fdt.h> |
25 | #include <linux/of_irq.h> | 25 | #include <linux/of_irq.h> |
26 | #include <linux/of_platform.h> | 26 | #include <linux/of_platform.h> |
27 | #include <linux/gpio.h> | ||
28 | #include <asm/mach-types.h> | 27 | #include <asm/mach-types.h> |
29 | #include <asm/mach/arch.h> | 28 | #include <asm/mach/arch.h> |
30 | #include <asm/mach/map.h> | 29 | #include <asm/mach/map.h> |
@@ -32,30 +31,15 @@ | |||
32 | #include <mach/bridge-regs.h> | 31 | #include <mach/bridge-regs.h> |
33 | #include <linux/platform_data/mmc-mvsdio.h> | 32 | #include <linux/platform_data/mmc-mvsdio.h> |
34 | #include "common.h" | 33 | #include "common.h" |
35 | #include "mpp.h" | ||
36 | 34 | ||
37 | static struct mv643xx_eth_platform_data dockstar_ge00_data = { | 35 | static struct mv643xx_eth_platform_data dockstar_ge00_data = { |
38 | .phy_addr = MV643XX_ETH_PHY_ADDR(0), | 36 | .phy_addr = MV643XX_ETH_PHY_ADDR(0), |
39 | }; | 37 | }; |
40 | 38 | ||
41 | static unsigned int dockstar_mpp_config[] __initdata = { | ||
42 | MPP29_GPIO, /* USB Power Enable */ | ||
43 | MPP46_GPIO, /* LED green */ | ||
44 | MPP47_GPIO, /* LED orange */ | ||
45 | 0 | ||
46 | }; | ||
47 | |||
48 | void __init dockstar_dt_init(void) | 39 | void __init dockstar_dt_init(void) |
49 | { | 40 | { |
50 | /* | 41 | /* |
51 | * Basic setup. Needs to be called early. | 42 | * Basic setup. Needs to be called early. |
52 | */ | 43 | */ |
53 | kirkwood_mpp_conf(dockstar_mpp_config); | ||
54 | |||
55 | if (gpio_request(29, "USB Power Enable") != 0 || | ||
56 | gpio_direction_output(29, 1) != 0) | ||
57 | pr_err("can't setup GPIO 29 (USB Power Enable)\n"); | ||
58 | kirkwood_ehci_init(); | ||
59 | |||
60 | kirkwood_ge00_init(&dockstar_ge00_data); | 44 | kirkwood_ge00_init(&dockstar_ge00_data); |
61 | } | 45 | } |
diff --git a/arch/arm/mach-kirkwood/board-dreamplug.c b/arch/arm/mach-kirkwood/board-dreamplug.c index 20af53a56c0e..3e2d95d629ee 100644 --- a/arch/arm/mach-kirkwood/board-dreamplug.c +++ b/arch/arm/mach-kirkwood/board-dreamplug.c | |||
@@ -32,7 +32,6 @@ | |||
32 | #include <mach/bridge-regs.h> | 32 | #include <mach/bridge-regs.h> |
33 | #include <linux/platform_data/mmc-mvsdio.h> | 33 | #include <linux/platform_data/mmc-mvsdio.h> |
34 | #include "common.h" | 34 | #include "common.h" |
35 | #include "mpp.h" | ||
36 | 35 | ||
37 | static struct mv643xx_eth_platform_data dreamplug_ge00_data = { | 36 | static struct mv643xx_eth_platform_data dreamplug_ge00_data = { |
38 | .phy_addr = MV643XX_ETH_PHY_ADDR(0), | 37 | .phy_addr = MV643XX_ETH_PHY_ADDR(0), |
@@ -46,25 +45,11 @@ static struct mvsdio_platform_data dreamplug_mvsdio_data = { | |||
46 | /* unfortunately the CD signal has not been connected */ | 45 | /* unfortunately the CD signal has not been connected */ |
47 | }; | 46 | }; |
48 | 47 | ||
49 | static unsigned int dreamplug_mpp_config[] __initdata = { | ||
50 | MPP0_SPI_SCn, | ||
51 | MPP1_SPI_MOSI, | ||
52 | MPP2_SPI_SCK, | ||
53 | MPP3_SPI_MISO, | ||
54 | MPP47_GPIO, /* Bluetooth LED */ | ||
55 | MPP48_GPIO, /* Wifi LED */ | ||
56 | MPP49_GPIO, /* Wifi AP LED */ | ||
57 | 0 | ||
58 | }; | ||
59 | |||
60 | void __init dreamplug_init(void) | 48 | void __init dreamplug_init(void) |
61 | { | 49 | { |
62 | /* | 50 | /* |
63 | * Basic setup. Needs to be called early. | 51 | * Basic setup. Needs to be called early. |
64 | */ | 52 | */ |
65 | kirkwood_mpp_conf(dreamplug_mpp_config); | ||
66 | |||
67 | kirkwood_ehci_init(); | ||
68 | kirkwood_ge00_init(&dreamplug_ge00_data); | 53 | kirkwood_ge00_init(&dreamplug_ge00_data); |
69 | kirkwood_ge01_init(&dreamplug_ge01_data); | 54 | kirkwood_ge01_init(&dreamplug_ge01_data); |
70 | kirkwood_sdio_init(&dreamplug_mvsdio_data); | 55 | kirkwood_sdio_init(&dreamplug_mvsdio_data); |
diff --git a/arch/arm/mach-kirkwood/board-dt.c b/arch/arm/mach-kirkwood/board-dt.c index d94872fed8c0..70eb01d96085 100644 --- a/arch/arm/mach-kirkwood/board-dt.c +++ b/arch/arm/mach-kirkwood/board-dt.c | |||
@@ -30,6 +30,8 @@ struct of_dev_auxdata kirkwood_auxdata_lookup[] __initdata = { | |||
30 | OF_DEV_AUXDATA("marvell,orion-spi", 0xf1010600, "orion_spi.0", NULL), | 30 | OF_DEV_AUXDATA("marvell,orion-spi", 0xf1010600, "orion_spi.0", NULL), |
31 | OF_DEV_AUXDATA("marvell,mv64xxx-i2c", 0xf1011000, "mv64xxx_i2c.0", | 31 | OF_DEV_AUXDATA("marvell,mv64xxx-i2c", 0xf1011000, "mv64xxx_i2c.0", |
32 | NULL), | 32 | NULL), |
33 | OF_DEV_AUXDATA("marvell,mv64xxx-i2c", 0xf1011100, "mv64xxx_i2c.1", | ||
34 | NULL), | ||
33 | OF_DEV_AUXDATA("marvell,orion-wdt", 0xf1020300, "orion_wdt", NULL), | 35 | OF_DEV_AUXDATA("marvell,orion-wdt", 0xf1020300, "orion_wdt", NULL), |
34 | OF_DEV_AUXDATA("marvell,orion-sata", 0xf1080000, "sata_mv.0", NULL), | 36 | OF_DEV_AUXDATA("marvell,orion-sata", 0xf1080000, "sata_mv.0", NULL), |
35 | OF_DEV_AUXDATA("marvell,orion-nand", 0xf4000000, "orion_nand", NULL), | 37 | OF_DEV_AUXDATA("marvell,orion-nand", 0xf4000000, "orion_nand", NULL), |
@@ -94,6 +96,25 @@ static void __init kirkwood_dt_init(void) | |||
94 | if (of_machine_is_compatible("keymile,km_kirkwood")) | 96 | if (of_machine_is_compatible("keymile,km_kirkwood")) |
95 | km_kirkwood_init(); | 97 | km_kirkwood_init(); |
96 | 98 | ||
99 | if (of_machine_is_compatible("lacie,inetspace_v2") || | ||
100 | of_machine_is_compatible("lacie,netspace_v2") || | ||
101 | of_machine_is_compatible("lacie,netspace_max_v2") || | ||
102 | of_machine_is_compatible("lacie,netspace_lite_v2") || | ||
103 | of_machine_is_compatible("lacie,netspace_mini_v2")) | ||
104 | ns2_init(); | ||
105 | |||
106 | if (of_machine_is_compatible("mpl,cec4")) | ||
107 | mplcec4_init(); | ||
108 | |||
109 | if (of_machine_is_compatible("plathome,openblocks-a6")) | ||
110 | openblocks_a6_init(); | ||
111 | |||
112 | if (of_machine_is_compatible("usi,topkick")) | ||
113 | usi_topkick_init(); | ||
114 | |||
115 | if (of_machine_is_compatible("zyxel,nsa310")) | ||
116 | nsa310_init(); | ||
117 | |||
97 | of_platform_populate(NULL, kirkwood_dt_match_table, | 118 | of_platform_populate(NULL, kirkwood_dt_match_table, |
98 | kirkwood_auxdata_lookup, NULL); | 119 | kirkwood_auxdata_lookup, NULL); |
99 | } | 120 | } |
@@ -110,6 +131,15 @@ static const char *kirkwood_dt_board_compat[] = { | |||
110 | "buffalo,lsxl", | 131 | "buffalo,lsxl", |
111 | "iom,ix2-200", | 132 | "iom,ix2-200", |
112 | "keymile,km_kirkwood", | 133 | "keymile,km_kirkwood", |
134 | "lacie,inetspace_v2", | ||
135 | "lacie,netspace_max_v2", | ||
136 | "lacie,netspace_v2", | ||
137 | "lacie,netspace_lite_v2", | ||
138 | "lacie,netspace_mini_v2", | ||
139 | "mpl,cec4", | ||
140 | "plathome,openblocks-a6", | ||
141 | "usi,topkick", | ||
142 | "zyxel,nsa310", | ||
113 | NULL | 143 | NULL |
114 | }; | 144 | }; |
115 | 145 | ||
diff --git a/arch/arm/mach-kirkwood/board-goflexnet.c b/arch/arm/mach-kirkwood/board-goflexnet.c index 001ca8c96980..3b9661802f8c 100644 --- a/arch/arm/mach-kirkwood/board-goflexnet.c +++ b/arch/arm/mach-kirkwood/board-goflexnet.c | |||
@@ -26,7 +26,6 @@ | |||
26 | #include <linux/of_fdt.h> | 26 | #include <linux/of_fdt.h> |
27 | #include <linux/of_irq.h> | 27 | #include <linux/of_irq.h> |
28 | #include <linux/of_platform.h> | 28 | #include <linux/of_platform.h> |
29 | #include <linux/gpio.h> | ||
30 | #include <asm/mach-types.h> | 29 | #include <asm/mach-types.h> |
31 | #include <asm/mach/arch.h> | 30 | #include <asm/mach/arch.h> |
32 | #include <asm/mach/map.h> | 31 | #include <asm/mach/map.h> |
@@ -34,38 +33,15 @@ | |||
34 | #include <mach/bridge-regs.h> | 33 | #include <mach/bridge-regs.h> |
35 | #include <linux/platform_data/mmc-mvsdio.h> | 34 | #include <linux/platform_data/mmc-mvsdio.h> |
36 | #include "common.h" | 35 | #include "common.h" |
37 | #include "mpp.h" | ||
38 | 36 | ||
39 | static struct mv643xx_eth_platform_data goflexnet_ge00_data = { | 37 | static struct mv643xx_eth_platform_data goflexnet_ge00_data = { |
40 | .phy_addr = MV643XX_ETH_PHY_ADDR(0), | 38 | .phy_addr = MV643XX_ETH_PHY_ADDR(0), |
41 | }; | 39 | }; |
42 | 40 | ||
43 | static unsigned int goflexnet_mpp_config[] __initdata = { | ||
44 | MPP29_GPIO, /* USB Power Enable */ | ||
45 | MPP47_GPIO, /* LED Orange */ | ||
46 | MPP46_GPIO, /* LED Green */ | ||
47 | MPP45_GPIO, /* LED Left Capacity 3 */ | ||
48 | MPP44_GPIO, /* LED Left Capacity 2 */ | ||
49 | MPP43_GPIO, /* LED Left Capacity 1 */ | ||
50 | MPP42_GPIO, /* LED Left Capacity 0 */ | ||
51 | MPP41_GPIO, /* LED Right Capacity 3 */ | ||
52 | MPP40_GPIO, /* LED Right Capacity 2 */ | ||
53 | MPP39_GPIO, /* LED Right Capacity 1 */ | ||
54 | MPP38_GPIO, /* LED Right Capacity 0 */ | ||
55 | 0 | ||
56 | }; | ||
57 | |||
58 | void __init goflexnet_init(void) | 41 | void __init goflexnet_init(void) |
59 | { | 42 | { |
60 | /* | 43 | /* |
61 | * Basic setup. Needs to be called early. | 44 | * Basic setup. Needs to be called early. |
62 | */ | 45 | */ |
63 | kirkwood_mpp_conf(goflexnet_mpp_config); | ||
64 | |||
65 | if (gpio_request(29, "USB Power Enable") != 0 || | ||
66 | gpio_direction_output(29, 1) != 0) | ||
67 | pr_err("can't setup GPIO 29 (USB Power Enable)\n"); | ||
68 | kirkwood_ehci_init(); | ||
69 | |||
70 | kirkwood_ge00_init(&goflexnet_ge00_data); | 46 | kirkwood_ge00_init(&goflexnet_ge00_data); |
71 | } | 47 | } |
diff --git a/arch/arm/mach-kirkwood/board-ib62x0.c b/arch/arm/mach-kirkwood/board-ib62x0.c index cfc47f80e734..b6e5db9c7ed0 100644 --- a/arch/arm/mach-kirkwood/board-ib62x0.c +++ b/arch/arm/mach-kirkwood/board-ib62x0.c | |||
@@ -17,55 +17,20 @@ | |||
17 | #include <linux/mtd/partitions.h> | 17 | #include <linux/mtd/partitions.h> |
18 | #include <linux/ata_platform.h> | 18 | #include <linux/ata_platform.h> |
19 | #include <linux/mv643xx_eth.h> | 19 | #include <linux/mv643xx_eth.h> |
20 | #include <linux/gpio.h> | ||
21 | #include <linux/input.h> | 20 | #include <linux/input.h> |
22 | #include <asm/mach-types.h> | 21 | #include <asm/mach-types.h> |
23 | #include <asm/mach/arch.h> | 22 | #include <asm/mach/arch.h> |
24 | #include <mach/kirkwood.h> | 23 | #include <mach/kirkwood.h> |
25 | #include "common.h" | 24 | #include "common.h" |
26 | #include "mpp.h" | ||
27 | |||
28 | #define IB62X0_GPIO_POWER_OFF 24 | ||
29 | 25 | ||
30 | static struct mv643xx_eth_platform_data ib62x0_ge00_data = { | 26 | static struct mv643xx_eth_platform_data ib62x0_ge00_data = { |
31 | .phy_addr = MV643XX_ETH_PHY_ADDR(8), | 27 | .phy_addr = MV643XX_ETH_PHY_ADDR(8), |
32 | }; | 28 | }; |
33 | 29 | ||
34 | static unsigned int ib62x0_mpp_config[] __initdata = { | ||
35 | MPP0_NF_IO2, | ||
36 | MPP1_NF_IO3, | ||
37 | MPP2_NF_IO4, | ||
38 | MPP3_NF_IO5, | ||
39 | MPP4_NF_IO6, | ||
40 | MPP5_NF_IO7, | ||
41 | MPP18_NF_IO0, | ||
42 | MPP19_NF_IO1, | ||
43 | MPP22_GPIO, /* OS LED red */ | ||
44 | MPP24_GPIO, /* Power off device */ | ||
45 | MPP25_GPIO, /* OS LED green */ | ||
46 | MPP27_GPIO, /* USB transfer LED */ | ||
47 | MPP28_GPIO, /* Reset button */ | ||
48 | MPP29_GPIO, /* USB Copy button */ | ||
49 | 0 | ||
50 | }; | ||
51 | |||
52 | static void ib62x0_power_off(void) | ||
53 | { | ||
54 | gpio_set_value(IB62X0_GPIO_POWER_OFF, 1); | ||
55 | } | ||
56 | |||
57 | void __init ib62x0_init(void) | 30 | void __init ib62x0_init(void) |
58 | { | 31 | { |
59 | /* | 32 | /* |
60 | * Basic setup. Needs to be called early. | 33 | * Basic setup. Needs to be called early. |
61 | */ | 34 | */ |
62 | kirkwood_mpp_conf(ib62x0_mpp_config); | ||
63 | |||
64 | kirkwood_ehci_init(); | ||
65 | kirkwood_ge00_init(&ib62x0_ge00_data); | 35 | kirkwood_ge00_init(&ib62x0_ge00_data); |
66 | if (gpio_request(IB62X0_GPIO_POWER_OFF, "ib62x0:power:off") == 0 && | ||
67 | gpio_direction_output(IB62X0_GPIO_POWER_OFF, 0) == 0) | ||
68 | pm_power_off = ib62x0_power_off; | ||
69 | else | ||
70 | pr_err("board-ib62x0: failed to configure power-off GPIO\n"); | ||
71 | } | 36 | } |
diff --git a/arch/arm/mach-kirkwood/board-iconnect.c b/arch/arm/mach-kirkwood/board-iconnect.c index d084b1e2943a..7d3c54c8490b 100644 --- a/arch/arm/mach-kirkwood/board-iconnect.c +++ b/arch/arm/mach-kirkwood/board-iconnect.c | |||
@@ -21,31 +21,13 @@ | |||
21 | #include <asm/mach/arch.h> | 21 | #include <asm/mach/arch.h> |
22 | #include <mach/kirkwood.h> | 22 | #include <mach/kirkwood.h> |
23 | #include "common.h" | 23 | #include "common.h" |
24 | #include "mpp.h" | ||
25 | 24 | ||
26 | static struct mv643xx_eth_platform_data iconnect_ge00_data = { | 25 | static struct mv643xx_eth_platform_data iconnect_ge00_data = { |
27 | .phy_addr = MV643XX_ETH_PHY_ADDR(11), | 26 | .phy_addr = MV643XX_ETH_PHY_ADDR(11), |
28 | }; | 27 | }; |
29 | 28 | ||
30 | static unsigned int iconnect_mpp_config[] __initdata = { | ||
31 | MPP12_GPIO, | ||
32 | MPP35_GPIO, | ||
33 | MPP41_GPIO, | ||
34 | MPP42_GPIO, | ||
35 | MPP43_GPIO, | ||
36 | MPP44_GPIO, | ||
37 | MPP45_GPIO, | ||
38 | MPP46_GPIO, | ||
39 | MPP47_GPIO, | ||
40 | MPP48_GPIO, | ||
41 | 0 | ||
42 | }; | ||
43 | |||
44 | void __init iconnect_init(void) | 29 | void __init iconnect_init(void) |
45 | { | 30 | { |
46 | kirkwood_mpp_conf(iconnect_mpp_config); | ||
47 | |||
48 | kirkwood_ehci_init(); | ||
49 | kirkwood_ge00_init(&iconnect_ge00_data); | 31 | kirkwood_ge00_init(&iconnect_ge00_data); |
50 | } | 32 | } |
51 | 33 | ||
diff --git a/arch/arm/mach-kirkwood/board-iomega_ix2_200.c b/arch/arm/mach-kirkwood/board-iomega_ix2_200.c index 158fb97d0397..22b86494671f 100644 --- a/arch/arm/mach-kirkwood/board-iomega_ix2_200.c +++ b/arch/arm/mach-kirkwood/board-iomega_ix2_200.c | |||
@@ -15,7 +15,6 @@ | |||
15 | #include <linux/ethtool.h> | 15 | #include <linux/ethtool.h> |
16 | #include <mach/kirkwood.h> | 16 | #include <mach/kirkwood.h> |
17 | #include "common.h" | 17 | #include "common.h" |
18 | #include "mpp.h" | ||
19 | 18 | ||
20 | static struct mv643xx_eth_platform_data iomega_ix2_200_ge00_data = { | 19 | static struct mv643xx_eth_platform_data iomega_ix2_200_ge00_data = { |
21 | .phy_addr = MV643XX_ETH_PHY_NONE, | 20 | .phy_addr = MV643XX_ETH_PHY_NONE, |
@@ -23,35 +22,10 @@ static struct mv643xx_eth_platform_data iomega_ix2_200_ge00_data = { | |||
23 | .duplex = DUPLEX_FULL, | 22 | .duplex = DUPLEX_FULL, |
24 | }; | 23 | }; |
25 | 24 | ||
26 | static unsigned int iomega_ix2_200_mpp_config[] __initdata = { | ||
27 | MPP12_GPIO, /* Reset Button */ | ||
28 | MPP14_GPIO, /* Power Button */ | ||
29 | MPP15_GPIO, /* Backup LED (blue) */ | ||
30 | MPP16_GPIO, /* Power LED (white) */ | ||
31 | MPP35_GPIO, /* OTB Button */ | ||
32 | MPP36_GPIO, /* Rebuild LED (white) */ | ||
33 | MPP37_GPIO, /* Health LED (red) */ | ||
34 | MPP38_GPIO, /* SATA LED brightness control 1 */ | ||
35 | MPP39_GPIO, /* SATA LED brightness control 2 */ | ||
36 | MPP40_GPIO, /* Backup LED brightness control 1 */ | ||
37 | MPP41_GPIO, /* Backup LED brightness control 2 */ | ||
38 | MPP42_GPIO, /* Power LED brightness control 1 */ | ||
39 | MPP43_GPIO, /* Power LED brightness control 2 */ | ||
40 | MPP44_GPIO, /* Health LED brightness control 1 */ | ||
41 | MPP45_GPIO, /* Health LED brightness control 2 */ | ||
42 | MPP46_GPIO, /* Rebuild LED brightness control 1 */ | ||
43 | MPP47_GPIO, /* Rebuild LED brightness control 2 */ | ||
44 | 0 | ||
45 | }; | ||
46 | |||
47 | void __init iomega_ix2_200_init(void) | 25 | void __init iomega_ix2_200_init(void) |
48 | { | 26 | { |
49 | /* | 27 | /* |
50 | * Basic setup. Needs to be called early. | 28 | * Basic setup. Needs to be called early. |
51 | */ | 29 | */ |
52 | kirkwood_mpp_conf(iomega_ix2_200_mpp_config); | ||
53 | |||
54 | kirkwood_ehci_init(); | ||
55 | |||
56 | kirkwood_ge01_init(&iomega_ix2_200_ge00_data); | 30 | kirkwood_ge01_init(&iomega_ix2_200_ge00_data); |
57 | } | 31 | } |
diff --git a/arch/arm/mach-kirkwood/board-km_kirkwood.c b/arch/arm/mach-kirkwood/board-km_kirkwood.c index f7d32834b757..44e4605ba0bf 100644 --- a/arch/arm/mach-kirkwood/board-km_kirkwood.c +++ b/arch/arm/mach-kirkwood/board-km_kirkwood.c | |||
@@ -18,27 +18,15 @@ | |||
18 | #include <linux/clk.h> | 18 | #include <linux/clk.h> |
19 | #include <linux/clk-private.h> | 19 | #include <linux/clk-private.h> |
20 | #include "common.h" | 20 | #include "common.h" |
21 | #include "mpp.h" | ||
22 | 21 | ||
23 | static struct mv643xx_eth_platform_data km_kirkwood_ge00_data = { | 22 | static struct mv643xx_eth_platform_data km_kirkwood_ge00_data = { |
24 | .phy_addr = MV643XX_ETH_PHY_ADDR(0), | 23 | .phy_addr = MV643XX_ETH_PHY_ADDR(0), |
25 | }; | 24 | }; |
26 | 25 | ||
27 | static unsigned int km_kirkwood_mpp_config[] __initdata = { | ||
28 | MPP8_GPIO, /* I2C SDA */ | ||
29 | MPP9_GPIO, /* I2C SCL */ | ||
30 | 0 | ||
31 | }; | ||
32 | |||
33 | void __init km_kirkwood_init(void) | 26 | void __init km_kirkwood_init(void) |
34 | { | 27 | { |
35 | struct clk *sata_clk; | 28 | struct clk *sata_clk; |
36 | /* | 29 | /* |
37 | * Basic setup. Needs to be called early. | ||
38 | */ | ||
39 | kirkwood_mpp_conf(km_kirkwood_mpp_config); | ||
40 | |||
41 | /* | ||
42 | * Our variant of kirkwood (integrated in the Bobcat) hangs on accessing | 30 | * Our variant of kirkwood (integrated in the Bobcat) hangs on accessing |
43 | * SATA bits (14-15) of the Clock Gating Control Register. Since these | 31 | * SATA bits (14-15) of the Clock Gating Control Register. Since these |
44 | * devices are also not present in this variant, their clocks get | 32 | * devices are also not present in this variant, their clocks get |
@@ -52,6 +40,5 @@ void __init km_kirkwood_init(void) | |||
52 | if (!IS_ERR(sata_clk)) | 40 | if (!IS_ERR(sata_clk)) |
53 | sata_clk->flags |= CLK_IGNORE_UNUSED; | 41 | sata_clk->flags |= CLK_IGNORE_UNUSED; |
54 | 42 | ||
55 | kirkwood_ehci_init(); | ||
56 | kirkwood_ge00_init(&km_kirkwood_ge00_data); | 43 | kirkwood_ge00_init(&km_kirkwood_ge00_data); |
57 | } | 44 | } |
diff --git a/arch/arm/mach-kirkwood/board-lsxl.c b/arch/arm/mach-kirkwood/board-lsxl.c index 83d8975592f8..d60cdab46f4b 100644 --- a/arch/arm/mach-kirkwood/board-lsxl.c +++ b/arch/arm/mach-kirkwood/board-lsxl.c | |||
@@ -19,14 +19,7 @@ | |||
19 | #include <linux/spi/flash.h> | 19 | #include <linux/spi/flash.h> |
20 | #include <linux/spi/spi.h> | 20 | #include <linux/spi/spi.h> |
21 | #include <linux/mv643xx_eth.h> | 21 | #include <linux/mv643xx_eth.h> |
22 | #include <linux/gpio.h> | ||
23 | #include <linux/gpio-fan.h> | ||
24 | #include <linux/input.h> | ||
25 | #include <asm/mach-types.h> | ||
26 | #include <asm/mach/arch.h> | ||
27 | #include <mach/kirkwood.h> | ||
28 | #include "common.h" | 22 | #include "common.h" |
29 | #include "mpp.h" | ||
30 | 23 | ||
31 | static struct mv643xx_eth_platform_data lsxl_ge00_data = { | 24 | static struct mv643xx_eth_platform_data lsxl_ge00_data = { |
32 | .phy_addr = MV643XX_ETH_PHY_ADDR(0), | 25 | .phy_addr = MV643XX_ETH_PHY_ADDR(0), |
@@ -36,68 +29,6 @@ static struct mv643xx_eth_platform_data lsxl_ge01_data = { | |||
36 | .phy_addr = MV643XX_ETH_PHY_ADDR(8), | 29 | .phy_addr = MV643XX_ETH_PHY_ADDR(8), |
37 | }; | 30 | }; |
38 | 31 | ||
39 | static unsigned int lsxl_mpp_config[] __initdata = { | ||
40 | MPP10_GPO, /* HDD Power Enable */ | ||
41 | MPP11_GPIO, /* USB Vbus Enable */ | ||
42 | MPP18_GPO, /* FAN High Enable# */ | ||
43 | MPP19_GPO, /* FAN Low Enable# */ | ||
44 | MPP36_GPIO, /* Function Blue LED */ | ||
45 | MPP37_GPIO, /* Alarm LED */ | ||
46 | MPP38_GPIO, /* Info LED */ | ||
47 | MPP39_GPIO, /* Power LED */ | ||
48 | MPP40_GPIO, /* Fan Lock */ | ||
49 | MPP41_GPIO, /* Function Button */ | ||
50 | MPP42_GPIO, /* Power Switch */ | ||
51 | MPP43_GPIO, /* Power Auto Switch */ | ||
52 | MPP48_GPIO, /* Function Red LED */ | ||
53 | 0 | ||
54 | }; | ||
55 | |||
56 | #define LSXL_GPIO_FAN_HIGH 18 | ||
57 | #define LSXL_GPIO_FAN_LOW 19 | ||
58 | #define LSXL_GPIO_FAN_LOCK 40 | ||
59 | |||
60 | static struct gpio_fan_alarm lsxl_alarm = { | ||
61 | .gpio = LSXL_GPIO_FAN_LOCK, | ||
62 | }; | ||
63 | |||
64 | static struct gpio_fan_speed lsxl_speeds[] = { | ||
65 | { | ||
66 | .rpm = 0, | ||
67 | .ctrl_val = 3, | ||
68 | }, { | ||
69 | .rpm = 1500, | ||
70 | .ctrl_val = 1, | ||
71 | }, { | ||
72 | .rpm = 3250, | ||
73 | .ctrl_val = 2, | ||
74 | }, { | ||
75 | .rpm = 5000, | ||
76 | .ctrl_val = 0, | ||
77 | } | ||
78 | }; | ||
79 | |||
80 | static int lsxl_gpio_list[] = { | ||
81 | LSXL_GPIO_FAN_HIGH, LSXL_GPIO_FAN_LOW, | ||
82 | }; | ||
83 | |||
84 | static struct gpio_fan_platform_data lsxl_fan_data = { | ||
85 | .num_ctrl = ARRAY_SIZE(lsxl_gpio_list), | ||
86 | .ctrl = lsxl_gpio_list, | ||
87 | .alarm = &lsxl_alarm, | ||
88 | .num_speed = ARRAY_SIZE(lsxl_speeds), | ||
89 | .speed = lsxl_speeds, | ||
90 | }; | ||
91 | |||
92 | static struct platform_device lsxl_fan_device = { | ||
93 | .name = "gpio-fan", | ||
94 | .id = -1, | ||
95 | .num_resources = 0, | ||
96 | .dev = { | ||
97 | .platform_data = &lsxl_fan_data, | ||
98 | }, | ||
99 | }; | ||
100 | |||
101 | /* | 32 | /* |
102 | * On the LS-XHL/LS-CHLv2, the shutdown process is following: | 33 | * On the LS-XHL/LS-CHLv2, the shutdown process is following: |
103 | * - Userland monitors key events until the power switch goes to off position | 34 | * - Userland monitors key events until the power switch goes to off position |
@@ -111,24 +42,14 @@ static void lsxl_power_off(void) | |||
111 | kirkwood_restart('h', NULL); | 42 | kirkwood_restart('h', NULL); |
112 | } | 43 | } |
113 | 44 | ||
114 | #define LSXL_GPIO_HDD_POWER 10 | ||
115 | #define LSXL_GPIO_USB_POWER 11 | ||
116 | |||
117 | void __init lsxl_init(void) | 45 | void __init lsxl_init(void) |
118 | { | 46 | { |
119 | /* | 47 | /* |
120 | * Basic setup. Needs to be called early. | 48 | * Basic setup. Needs to be called early. |
121 | */ | 49 | */ |
122 | kirkwood_mpp_conf(lsxl_mpp_config); | ||
123 | |||
124 | /* usb and sata power on */ | ||
125 | gpio_set_value(LSXL_GPIO_USB_POWER, 1); | ||
126 | gpio_set_value(LSXL_GPIO_HDD_POWER, 1); | ||
127 | 50 | ||
128 | kirkwood_ehci_init(); | ||
129 | kirkwood_ge00_init(&lsxl_ge00_data); | 51 | kirkwood_ge00_init(&lsxl_ge00_data); |
130 | kirkwood_ge01_init(&lsxl_ge01_data); | 52 | kirkwood_ge01_init(&lsxl_ge01_data); |
131 | platform_device_register(&lsxl_fan_device); | ||
132 | 53 | ||
133 | /* register power-off method */ | 54 | /* register power-off method */ |
134 | pm_power_off = lsxl_power_off; | 55 | pm_power_off = lsxl_power_off; |
diff --git a/arch/arm/mach-kirkwood/board-mplcec4.c b/arch/arm/mach-kirkwood/board-mplcec4.c new file mode 100644 index 000000000000..56bfe5a1605a --- /dev/null +++ b/arch/arm/mach-kirkwood/board-mplcec4.c | |||
@@ -0,0 +1,44 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2012 MPL AG, Switzerland | ||
3 | * Stefan Peter <s.peter@mpl.ch> | ||
4 | * | ||
5 | * arch/arm/mach-kirkwood/board-mplcec4.c | ||
6 | * | ||
7 | * This file is licensed under the terms of the GNU General Public | ||
8 | * License version 2. This program is licensed "as is" without any | ||
9 | * warranty of any kind, whether express or implied. | ||
10 | */ | ||
11 | |||
12 | #include <linux/kernel.h> | ||
13 | #include <linux/init.h> | ||
14 | #include <linux/mv643xx_eth.h> | ||
15 | #include <linux/platform_data/mmc-mvsdio.h> | ||
16 | #include "common.h" | ||
17 | #include "mpp.h" | ||
18 | |||
19 | static struct mv643xx_eth_platform_data mplcec4_ge00_data = { | ||
20 | .phy_addr = MV643XX_ETH_PHY_ADDR(1), | ||
21 | }; | ||
22 | |||
23 | static struct mv643xx_eth_platform_data mplcec4_ge01_data = { | ||
24 | .phy_addr = MV643XX_ETH_PHY_ADDR(2), | ||
25 | }; | ||
26 | |||
27 | static struct mvsdio_platform_data mplcec4_mvsdio_data = { | ||
28 | .gpio_card_detect = 47, /* MPP47 used as SD card detect */ | ||
29 | }; | ||
30 | |||
31 | |||
32 | void __init mplcec4_init(void) | ||
33 | { | ||
34 | /* | ||
35 | * Basic setup. Needs to be called early. | ||
36 | */ | ||
37 | kirkwood_ge00_init(&mplcec4_ge00_data); | ||
38 | kirkwood_ge01_init(&mplcec4_ge01_data); | ||
39 | kirkwood_sdio_init(&mplcec4_mvsdio_data); | ||
40 | kirkwood_pcie_init(KW_PCIE0); | ||
41 | } | ||
42 | |||
43 | |||
44 | |||
diff --git a/arch/arm/mach-kirkwood/board-ns2.c b/arch/arm/mach-kirkwood/board-ns2.c new file mode 100644 index 000000000000..8821720ab5a4 --- /dev/null +++ b/arch/arm/mach-kirkwood/board-ns2.c | |||
@@ -0,0 +1,86 @@ | |||
1 | /* | ||
2 | * Copyright 2012 (C), Simon Guinot <simon.guinot@sequanux.org> | ||
3 | * | ||
4 | * arch/arm/mach-kirkwood/board-ns2.c | ||
5 | * | ||
6 | * LaCie Network Space v2 board (and parents) initialization for drivers | ||
7 | * not converted to flattened device tree yet. | ||
8 | * | ||
9 | * This file is licensed under the terms of the GNU General Public | ||
10 | * License version 2. This program is licensed "as is" without any | ||
11 | * warranty of any kind, whether express or implied. | ||
12 | */ | ||
13 | |||
14 | #include <linux/kernel.h> | ||
15 | #include <linux/init.h> | ||
16 | #include <linux/platform_device.h> | ||
17 | #include <linux/mv643xx_eth.h> | ||
18 | #include <linux/gpio.h> | ||
19 | #include <linux/of.h> | ||
20 | #include "common.h" | ||
21 | #include "mpp.h" | ||
22 | |||
23 | static struct mv643xx_eth_platform_data ns2_ge00_data = { | ||
24 | .phy_addr = MV643XX_ETH_PHY_ADDR(8), | ||
25 | }; | ||
26 | |||
27 | static unsigned int ns2_mpp_config[] __initdata = { | ||
28 | MPP0_SPI_SCn, | ||
29 | MPP1_SPI_MOSI, | ||
30 | MPP2_SPI_SCK, | ||
31 | MPP3_SPI_MISO, | ||
32 | MPP4_NF_IO6, | ||
33 | MPP5_NF_IO7, | ||
34 | MPP6_SYSRST_OUTn, | ||
35 | MPP7_GPO, /* Fan speed (bit 1) */ | ||
36 | MPP8_TW0_SDA, | ||
37 | MPP9_TW0_SCK, | ||
38 | MPP10_UART0_TXD, | ||
39 | MPP11_UART0_RXD, | ||
40 | MPP12_GPO, /* Red led */ | ||
41 | MPP14_GPIO, /* USB fuse */ | ||
42 | MPP16_GPIO, /* SATA 0 power */ | ||
43 | MPP17_GPIO, /* SATA 1 power */ | ||
44 | MPP18_NF_IO0, | ||
45 | MPP19_NF_IO1, | ||
46 | MPP20_SATA1_ACTn, | ||
47 | MPP21_SATA0_ACTn, | ||
48 | MPP22_GPIO, /* Fan speed (bit 0) */ | ||
49 | MPP23_GPIO, /* Fan power */ | ||
50 | MPP24_GPIO, /* USB mode select */ | ||
51 | MPP25_GPIO, /* Fan rotation fail */ | ||
52 | MPP26_GPIO, /* USB device vbus */ | ||
53 | MPP28_GPIO, /* USB enable host vbus */ | ||
54 | MPP29_GPIO, /* Blue led (slow register) */ | ||
55 | MPP30_GPIO, /* Blue led (command register) */ | ||
56 | MPP31_GPIO, /* Board power off */ | ||
57 | MPP32_GPIO, /* Power button (0 = Released, 1 = Pushed) */ | ||
58 | MPP33_GPO, /* Fan speed (bit 2) */ | ||
59 | 0 | ||
60 | }; | ||
61 | |||
62 | #define NS2_GPIO_POWER_OFF 31 | ||
63 | |||
64 | static void ns2_power_off(void) | ||
65 | { | ||
66 | gpio_set_value(NS2_GPIO_POWER_OFF, 1); | ||
67 | } | ||
68 | |||
69 | void __init ns2_init(void) | ||
70 | { | ||
71 | /* | ||
72 | * Basic setup. Needs to be called early. | ||
73 | */ | ||
74 | kirkwood_mpp_conf(ns2_mpp_config); | ||
75 | |||
76 | if (of_machine_is_compatible("lacie,netspace_lite_v2") || | ||
77 | of_machine_is_compatible("lacie,netspace_mini_v2")) | ||
78 | ns2_ge00_data.phy_addr = MV643XX_ETH_PHY_ADDR(0); | ||
79 | kirkwood_ge00_init(&ns2_ge00_data); | ||
80 | |||
81 | if (gpio_request(NS2_GPIO_POWER_OFF, "power-off") == 0 && | ||
82 | gpio_direction_output(NS2_GPIO_POWER_OFF, 0) == 0) | ||
83 | pm_power_off = ns2_power_off; | ||
84 | else | ||
85 | pr_err("ns2: failed to configure power-off GPIO\n"); | ||
86 | } | ||
diff --git a/arch/arm/mach-kirkwood/board-nsa310.c b/arch/arm/mach-kirkwood/board-nsa310.c new file mode 100644 index 000000000000..f58d2e1a4042 --- /dev/null +++ b/arch/arm/mach-kirkwood/board-nsa310.c | |||
@@ -0,0 +1,101 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-kirkwood/nsa-310-setup.c | ||
3 | * | ||
4 | * ZyXEL NSA-310 Setup | ||
5 | * | ||
6 | * This file is licensed under the terms of the GNU General Public | ||
7 | * License version 2. This program is licensed "as is" without any | ||
8 | * warranty of any kind, whether express or implied. | ||
9 | */ | ||
10 | |||
11 | #include <linux/kernel.h> | ||
12 | #include <linux/init.h> | ||
13 | #include <linux/i2c.h> | ||
14 | #include <linux/gpio.h> | ||
15 | |||
16 | #include <asm/mach-types.h> | ||
17 | #include <asm/mach/arch.h> | ||
18 | #include <mach/kirkwood.h> | ||
19 | #include "common.h" | ||
20 | #include "mpp.h" | ||
21 | |||
22 | #define NSA310_GPIO_USB_POWER_OFF 21 | ||
23 | #define NSA310_GPIO_POWER_OFF 48 | ||
24 | |||
25 | static unsigned int nsa310_mpp_config[] __initdata = { | ||
26 | MPP12_GPIO, /* led esata green */ | ||
27 | MPP13_GPIO, /* led esata red */ | ||
28 | MPP15_GPIO, /* led usb green */ | ||
29 | MPP16_GPIO, /* led usb red */ | ||
30 | MPP21_GPIO, /* control usb power off */ | ||
31 | MPP28_GPIO, /* led sys green */ | ||
32 | MPP29_GPIO, /* led sys red */ | ||
33 | MPP36_GPIO, /* key reset */ | ||
34 | MPP37_GPIO, /* key copy */ | ||
35 | MPP39_GPIO, /* led copy green */ | ||
36 | MPP40_GPIO, /* led copy red */ | ||
37 | MPP41_GPIO, /* led hdd green */ | ||
38 | MPP42_GPIO, /* led hdd red */ | ||
39 | MPP44_GPIO, /* ?? */ | ||
40 | MPP46_GPIO, /* key power */ | ||
41 | MPP48_GPIO, /* control power off */ | ||
42 | 0 | ||
43 | }; | ||
44 | |||
45 | static struct i2c_board_info __initdata nsa310_i2c_info[] = { | ||
46 | { I2C_BOARD_INFO("adt7476", 0x2e) }, | ||
47 | }; | ||
48 | |||
49 | static void nsa310_power_off(void) | ||
50 | { | ||
51 | gpio_set_value(NSA310_GPIO_POWER_OFF, 1); | ||
52 | } | ||
53 | |||
54 | static int __init nsa310_gpio_request(unsigned int gpio, unsigned long flags, | ||
55 | const char *label) | ||
56 | { | ||
57 | int err; | ||
58 | |||
59 | err = gpio_request_one(gpio, flags, label); | ||
60 | if (err) | ||
61 | pr_err("NSA-310: can't setup GPIO%u (%s), err=%d\n", | ||
62 | gpio, label, err); | ||
63 | |||
64 | return err; | ||
65 | } | ||
66 | |||
67 | static void __init nsa310_gpio_init(void) | ||
68 | { | ||
69 | int err; | ||
70 | |||
71 | err = nsa310_gpio_request(NSA310_GPIO_POWER_OFF, GPIOF_OUT_INIT_LOW, | ||
72 | "Power Off"); | ||
73 | if (!err) | ||
74 | pm_power_off = nsa310_power_off; | ||
75 | |||
76 | nsa310_gpio_request(NSA310_GPIO_USB_POWER_OFF, GPIOF_OUT_INIT_LOW, | ||
77 | "USB Power Off"); | ||
78 | } | ||
79 | |||
80 | void __init nsa310_init(void) | ||
81 | { | ||
82 | u32 dev, rev; | ||
83 | |||
84 | kirkwood_mpp_conf(nsa310_mpp_config); | ||
85 | |||
86 | nsa310_gpio_init(); | ||
87 | |||
88 | kirkwood_pcie_id(&dev, &rev); | ||
89 | |||
90 | i2c_register_board_info(0, ARRAY_AND_SIZE(nsa310_i2c_info)); | ||
91 | } | ||
92 | |||
93 | static int __init nsa310_pci_init(void) | ||
94 | { | ||
95 | if (of_machine_is_compatible("zyxel,nsa310")) | ||
96 | kirkwood_pcie_init(KW_PCIE0); | ||
97 | |||
98 | return 0; | ||
99 | } | ||
100 | |||
101 | subsys_initcall(nsa310_pci_init); | ||
diff --git a/arch/arm/mach-kirkwood/board-openblocks_a6.c b/arch/arm/mach-kirkwood/board-openblocks_a6.c new file mode 100644 index 000000000000..815fc6451d52 --- /dev/null +++ b/arch/arm/mach-kirkwood/board-openblocks_a6.c | |||
@@ -0,0 +1,70 @@ | |||
1 | /* | ||
2 | * Copyright 2012 Nobuhiro Iwamatsu <iwamatsu@nigauri.org> | ||
3 | * | ||
4 | * arch/arm/mach-kirkwood/board-openblocks_a6.c | ||
5 | * | ||
6 | * This file is licensed under the terms of the GNU General Public | ||
7 | * License version 2. This program is licensed "as is" without any | ||
8 | * warranty of any kind, whether express or implied. | ||
9 | */ | ||
10 | |||
11 | #include <linux/kernel.h> | ||
12 | #include <linux/init.h> | ||
13 | #include <linux/mv643xx_eth.h> | ||
14 | #include <linux/clk.h> | ||
15 | #include <linux/clk-private.h> | ||
16 | #include "common.h" | ||
17 | #include "mpp.h" | ||
18 | |||
19 | static struct mv643xx_eth_platform_data openblocks_ge00_data = { | ||
20 | .phy_addr = MV643XX_ETH_PHY_ADDR(0), | ||
21 | }; | ||
22 | |||
23 | static unsigned int openblocks_a6_mpp_config[] __initdata = { | ||
24 | MPP0_NF_IO2, | ||
25 | MPP1_NF_IO3, | ||
26 | MPP2_NF_IO4, | ||
27 | MPP3_NF_IO5, | ||
28 | MPP4_NF_IO6, | ||
29 | MPP5_NF_IO7, | ||
30 | MPP6_SYSRST_OUTn, | ||
31 | MPP8_UART1_RTS, | ||
32 | MPP9_UART1_CTS, | ||
33 | MPP10_UART0_TXD, | ||
34 | MPP11_UART0_RXD, | ||
35 | MPP13_UART1_TXD, | ||
36 | MPP14_UART1_RXD, | ||
37 | MPP15_UART0_RTS, | ||
38 | MPP16_UART0_CTS, | ||
39 | MPP18_NF_IO0, | ||
40 | MPP19_NF_IO1, | ||
41 | MPP20_GPIO, /* DIP SW0 */ | ||
42 | MPP21_GPIO, /* DIP SW1 */ | ||
43 | MPP22_GPIO, /* DIP SW2 */ | ||
44 | MPP23_GPIO, /* DIP SW3 */ | ||
45 | MPP24_GPIO, /* GPIO 0 */ | ||
46 | MPP25_GPIO, /* GPIO 1 */ | ||
47 | MPP26_GPIO, /* GPIO 2 */ | ||
48 | MPP27_GPIO, /* GPIO 3 */ | ||
49 | MPP28_GPIO, /* GPIO 4 */ | ||
50 | MPP29_GPIO, /* GPIO 5 */ | ||
51 | MPP30_GPIO, /* GPIO 6 */ | ||
52 | MPP31_GPIO, /* GPIO 7 */ | ||
53 | MPP36_TW1_SDA, | ||
54 | MPP37_TW1_SCK, | ||
55 | MPP38_GPIO, /* INIT */ | ||
56 | MPP39_GPIO, /* USB OC */ | ||
57 | MPP41_GPIO, /* LED: Red */ | ||
58 | MPP42_GPIO, /* LED: Green */ | ||
59 | MPP43_GPIO, /* LED: Yellow */ | ||
60 | 0, | ||
61 | }; | ||
62 | |||
63 | void __init openblocks_a6_init(void) | ||
64 | { | ||
65 | /* | ||
66 | * Basic setup. Needs to be called early. | ||
67 | */ | ||
68 | kirkwood_mpp_conf(openblocks_a6_mpp_config); | ||
69 | kirkwood_ge00_init(&openblocks_ge00_data); | ||
70 | } | ||
diff --git a/arch/arm/mach-kirkwood/board-ts219.c b/arch/arm/mach-kirkwood/board-ts219.c index 1750e68506c1..329ff682e4e6 100644 --- a/arch/arm/mach-kirkwood/board-ts219.c +++ b/arch/arm/mach-kirkwood/board-ts219.c | |||
@@ -26,47 +26,21 @@ | |||
26 | #include <asm/mach/arch.h> | 26 | #include <asm/mach/arch.h> |
27 | #include <mach/kirkwood.h> | 27 | #include <mach/kirkwood.h> |
28 | #include "common.h" | 28 | #include "common.h" |
29 | #include "mpp.h" | ||
30 | #include "tsx1x-common.h" | 29 | #include "tsx1x-common.h" |
31 | 30 | ||
32 | static struct mv643xx_eth_platform_data qnap_ts219_ge00_data = { | 31 | static struct mv643xx_eth_platform_data qnap_ts219_ge00_data = { |
33 | .phy_addr = MV643XX_ETH_PHY_ADDR(8), | 32 | .phy_addr = MV643XX_ETH_PHY_ADDR(8), |
34 | }; | 33 | }; |
35 | 34 | ||
36 | static unsigned int qnap_ts219_mpp_config[] __initdata = { | ||
37 | MPP0_SPI_SCn, | ||
38 | MPP1_SPI_MOSI, | ||
39 | MPP2_SPI_SCK, | ||
40 | MPP3_SPI_MISO, | ||
41 | MPP4_SATA1_ACTn, | ||
42 | MPP5_SATA0_ACTn, | ||
43 | MPP8_TW0_SDA, | ||
44 | MPP9_TW0_SCK, | ||
45 | MPP10_UART0_TXD, | ||
46 | MPP11_UART0_RXD, | ||
47 | MPP13_UART1_TXD, /* PIC controller */ | ||
48 | MPP14_UART1_RXD, /* PIC controller */ | ||
49 | MPP15_GPIO, /* USB Copy button (on devices with 88F6281) */ | ||
50 | MPP16_GPIO, /* Reset button (on devices with 88F6281) */ | ||
51 | MPP36_GPIO, /* RAM: 0: 256 MB, 1: 512 MB */ | ||
52 | MPP37_GPIO, /* Reset button (on devices with 88F6282) */ | ||
53 | MPP43_GPIO, /* USB Copy button (on devices with 88F6282) */ | ||
54 | MPP44_GPIO, /* Board ID: 0: TS-11x, 1: TS-21x */ | ||
55 | 0 | ||
56 | }; | ||
57 | |||
58 | void __init qnap_dt_ts219_init(void) | 35 | void __init qnap_dt_ts219_init(void) |
59 | { | 36 | { |
60 | u32 dev, rev; | 37 | u32 dev, rev; |
61 | 38 | ||
62 | kirkwood_mpp_conf(qnap_ts219_mpp_config); | ||
63 | |||
64 | kirkwood_pcie_id(&dev, &rev); | 39 | kirkwood_pcie_id(&dev, &rev); |
65 | if (dev == MV88F6282_DEV_ID) | 40 | if (dev == MV88F6282_DEV_ID) |
66 | qnap_ts219_ge00_data.phy_addr = MV643XX_ETH_PHY_ADDR(0); | 41 | qnap_ts219_ge00_data.phy_addr = MV643XX_ETH_PHY_ADDR(0); |
67 | 42 | ||
68 | kirkwood_ge00_init(&qnap_ts219_ge00_data); | 43 | kirkwood_ge00_init(&qnap_ts219_ge00_data); |
69 | kirkwood_ehci_init(); | ||
70 | 44 | ||
71 | pm_power_off = qnap_tsx1x_power_off; | 45 | pm_power_off = qnap_tsx1x_power_off; |
72 | } | 46 | } |
diff --git a/arch/arm/mach-kirkwood/board-usi_topkick.c b/arch/arm/mach-kirkwood/board-usi_topkick.c new file mode 100644 index 000000000000..15e69fcde9f4 --- /dev/null +++ b/arch/arm/mach-kirkwood/board-usi_topkick.c | |||
@@ -0,0 +1,81 @@ | |||
1 | /* | ||
2 | * Copyright 2012 (C), Jason Cooper <jason@lakedaemon.net> | ||
3 | * | ||
4 | * arch/arm/mach-kirkwood/board-usi_topkick.c | ||
5 | * | ||
6 | * USI Topkick Init for drivers not converted to flattened device tree yet. | ||
7 | * | ||
8 | * This file is licensed under the terms of the GNU General Public | ||
9 | * License version 2. This program is licensed "as is" without any | ||
10 | * warranty of any kind, whether express or implied. | ||
11 | */ | ||
12 | |||
13 | #include <linux/kernel.h> | ||
14 | #include <linux/init.h> | ||
15 | #include <linux/mv643xx_eth.h> | ||
16 | #include <linux/gpio.h> | ||
17 | #include <linux/platform_data/mmc-mvsdio.h> | ||
18 | #include "common.h" | ||
19 | #include "mpp.h" | ||
20 | |||
21 | static struct mv643xx_eth_platform_data topkick_ge00_data = { | ||
22 | .phy_addr = MV643XX_ETH_PHY_ADDR(0), | ||
23 | }; | ||
24 | |||
25 | static struct mvsdio_platform_data topkick_mvsdio_data = { | ||
26 | /* unfortunately the CD signal has not been connected */ | ||
27 | }; | ||
28 | |||
29 | /* | ||
30 | * GPIO LED layout | ||
31 | * | ||
32 | * /-SYS_LED(2) | ||
33 | * | | ||
34 | * | /-DISK_LED | ||
35 | * | | | ||
36 | * | | /-WLAN_LED(2) | ||
37 | * | | | | ||
38 | * [SW] [*] [*] [*] | ||
39 | */ | ||
40 | |||
41 | /* | ||
42 | * Switch positions | ||
43 | * | ||
44 | * /-SW_LEFT | ||
45 | * | | ||
46 | * | /-SW_IDLE | ||
47 | * | | | ||
48 | * | | /-SW_RIGHT | ||
49 | * | | | | ||
50 | * PS [L] [I] [R] LEDS | ||
51 | */ | ||
52 | |||
53 | static unsigned int topkick_mpp_config[] __initdata = { | ||
54 | MPP21_GPIO, /* DISK_LED (low active) - yellow */ | ||
55 | MPP36_GPIO, /* SATA0 power enable (high active) */ | ||
56 | MPP37_GPIO, /* SYS_LED2 (low active) - red */ | ||
57 | MPP38_GPIO, /* SYS_LED (low active) - blue */ | ||
58 | MPP39_GPIO, /* WLAN_LED (low active) - green */ | ||
59 | MPP43_GPIO, /* SW_LEFT (low active) */ | ||
60 | MPP44_GPIO, /* SW_RIGHT (low active) */ | ||
61 | MPP45_GPIO, /* SW_IDLE (low active) */ | ||
62 | MPP46_GPIO, /* SW_LEFT (low active) */ | ||
63 | MPP48_GPIO, /* WLAN_LED2 (low active) - yellow */ | ||
64 | 0 | ||
65 | }; | ||
66 | |||
67 | #define TOPKICK_SATA0_PWR_ENABLE 36 | ||
68 | |||
69 | void __init usi_topkick_init(void) | ||
70 | { | ||
71 | /* | ||
72 | * Basic setup. Needs to be called early. | ||
73 | */ | ||
74 | kirkwood_mpp_conf(topkick_mpp_config); | ||
75 | |||
76 | /* SATA0 power enable */ | ||
77 | gpio_set_value(TOPKICK_SATA0_PWR_ENABLE, 1); | ||
78 | |||
79 | kirkwood_ge00_init(&topkick_ge00_data); | ||
80 | kirkwood_sdio_init(&topkick_mvsdio_data); | ||
81 | } | ||
diff --git a/arch/arm/mach-kirkwood/common.c b/arch/arm/mach-kirkwood/common.c index 2c6c218fb79e..906c22eca4e9 100644 --- a/arch/arm/mach-kirkwood/common.c +++ b/arch/arm/mach-kirkwood/common.c | |||
@@ -266,6 +266,7 @@ void __init kirkwood_clk_init(void) | |||
266 | orion_clkdev_add("1", "pcie", pex1); | 266 | orion_clkdev_add("1", "pcie", pex1); |
267 | orion_clkdev_add(NULL, "kirkwood-i2s", audio); | 267 | orion_clkdev_add(NULL, "kirkwood-i2s", audio); |
268 | orion_clkdev_add(NULL, MV64XXX_I2C_CTLR_NAME ".0", runit); | 268 | orion_clkdev_add(NULL, MV64XXX_I2C_CTLR_NAME ".0", runit); |
269 | orion_clkdev_add(NULL, MV64XXX_I2C_CTLR_NAME ".1", runit); | ||
269 | 270 | ||
270 | /* Marvell says runit is used by SPI, UART, NAND, TWSI, ..., | 271 | /* Marvell says runit is used by SPI, UART, NAND, TWSI, ..., |
271 | * so should never be gated. | 272 | * so should never be gated. |
diff --git a/arch/arm/mach-kirkwood/common.h b/arch/arm/mach-kirkwood/common.h index bcffd7ca1ca2..3e079d1d99d0 100644 --- a/arch/arm/mach-kirkwood/common.h +++ b/arch/arm/mach-kirkwood/common.h | |||
@@ -112,6 +112,40 @@ void km_kirkwood_init(void); | |||
112 | static inline void km_kirkwood_init(void) {}; | 112 | static inline void km_kirkwood_init(void) {}; |
113 | #endif | 113 | #endif |
114 | 114 | ||
115 | #ifdef CONFIG_MACH_MPLCEC4_DT | ||
116 | void mplcec4_init(void); | ||
117 | #else | ||
118 | static inline void mplcec4_init(void) {}; | ||
119 | #endif | ||
120 | |||
121 | #if defined(CONFIG_MACH_INETSPACE_V2_DT) || \ | ||
122 | defined(CONFIG_MACH_NETSPACE_V2_DT) || \ | ||
123 | defined(CONFIG_MACH_NETSPACE_MAX_V2_DT) || \ | ||
124 | defined(CONFIG_MACH_NETSPACE_LITE_V2_DT) || \ | ||
125 | defined(CONFIG_MACH_NETSPACE_MINI_V2_DT) | ||
126 | void ns2_init(void); | ||
127 | #else | ||
128 | static inline void ns2_init(void) {}; | ||
129 | #endif | ||
130 | |||
131 | #ifdef CONFIG_MACH_NSA310_DT | ||
132 | void nsa310_init(void); | ||
133 | #else | ||
134 | static inline void nsa310_init(void) {}; | ||
135 | #endif | ||
136 | |||
137 | #ifdef CONFIG_MACH_OPENBLOCKS_A6_DT | ||
138 | void openblocks_a6_init(void); | ||
139 | #else | ||
140 | static inline void openblocks_a6_init(void) {}; | ||
141 | #endif | ||
142 | |||
143 | #ifdef CONFIG_MACH_TOPKICK_DT | ||
144 | void usi_topkick_init(void); | ||
145 | #else | ||
146 | static inline void usi_topkick_init(void) {}; | ||
147 | #endif | ||
148 | |||
115 | /* early init functions not converted to fdt yet */ | 149 | /* early init functions not converted to fdt yet */ |
116 | char *kirkwood_id(void); | 150 | char *kirkwood_id(void); |
117 | void kirkwood_l2_init(void); | 151 | void kirkwood_l2_init(void); |
diff --git a/arch/arm/mach-omap2/clockdomains44xx_data.c b/arch/arm/mach-omap2/clockdomains44xx_data.c index b56d06b48782..95192a062d5d 100644 --- a/arch/arm/mach-omap2/clockdomains44xx_data.c +++ b/arch/arm/mach-omap2/clockdomains44xx_data.c | |||
@@ -359,7 +359,7 @@ static struct clockdomain iss_44xx_clkdm = { | |||
359 | .clkdm_offs = OMAP4430_CM2_CAM_CAM_CDOFFS, | 359 | .clkdm_offs = OMAP4430_CM2_CAM_CAM_CDOFFS, |
360 | .wkdep_srcs = iss_wkup_sleep_deps, | 360 | .wkdep_srcs = iss_wkup_sleep_deps, |
361 | .sleepdep_srcs = iss_wkup_sleep_deps, | 361 | .sleepdep_srcs = iss_wkup_sleep_deps, |
362 | .flags = CLKDM_CAN_HWSUP_SWSUP, | 362 | .flags = CLKDM_CAN_SWSUP, |
363 | }; | 363 | }; |
364 | 364 | ||
365 | static struct clockdomain l3_dss_44xx_clkdm = { | 365 | static struct clockdomain l3_dss_44xx_clkdm = { |
diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c index cf365c387c06..d2215e9873a5 100644 --- a/arch/arm/mach-omap2/devices.c +++ b/arch/arm/mach-omap2/devices.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/of.h> | 19 | #include <linux/of.h> |
20 | #include <linux/pinctrl/machine.h> | 20 | #include <linux/pinctrl/machine.h> |
21 | #include <linux/platform_data/omap4-keypad.h> | 21 | #include <linux/platform_data/omap4-keypad.h> |
22 | #include <linux/platform_data/omap_ocp2scp.h> | ||
22 | 23 | ||
23 | #include <asm/mach-types.h> | 24 | #include <asm/mach-types.h> |
24 | #include <asm/mach/map.h> | 25 | #include <asm/mach/map.h> |
@@ -615,6 +616,83 @@ static void omap_init_vout(void) | |||
615 | static inline void omap_init_vout(void) {} | 616 | static inline void omap_init_vout(void) {} |
616 | #endif | 617 | #endif |
617 | 618 | ||
619 | #if defined(CONFIG_OMAP_OCP2SCP) || defined(CONFIG_OMAP_OCP2SCP_MODULE) | ||
620 | static int count_ocp2scp_devices(struct omap_ocp2scp_dev *ocp2scp_dev) | ||
621 | { | ||
622 | int cnt = 0; | ||
623 | |||
624 | while (ocp2scp_dev->drv_name != NULL) { | ||
625 | cnt++; | ||
626 | ocp2scp_dev++; | ||
627 | } | ||
628 | |||
629 | return cnt; | ||
630 | } | ||
631 | |||
632 | static void omap_init_ocp2scp(void) | ||
633 | { | ||
634 | struct omap_hwmod *oh; | ||
635 | struct platform_device *pdev; | ||
636 | int bus_id = -1, dev_cnt = 0, i; | ||
637 | struct omap_ocp2scp_dev *ocp2scp_dev; | ||
638 | const char *oh_name, *name; | ||
639 | struct omap_ocp2scp_platform_data *pdata; | ||
640 | |||
641 | if (!cpu_is_omap44xx()) | ||
642 | return; | ||
643 | |||
644 | oh_name = "ocp2scp_usb_phy"; | ||
645 | name = "omap-ocp2scp"; | ||
646 | |||
647 | oh = omap_hwmod_lookup(oh_name); | ||
648 | if (!oh) { | ||
649 | pr_err("%s: could not find omap_hwmod for %s\n", __func__, | ||
650 | oh_name); | ||
651 | return; | ||
652 | } | ||
653 | |||
654 | pdata = kzalloc(sizeof(*pdata), GFP_KERNEL); | ||
655 | if (!pdata) { | ||
656 | pr_err("%s: No memory for ocp2scp pdata\n", __func__); | ||
657 | return; | ||
658 | } | ||
659 | |||
660 | ocp2scp_dev = oh->dev_attr; | ||
661 | dev_cnt = count_ocp2scp_devices(ocp2scp_dev); | ||
662 | |||
663 | if (!dev_cnt) { | ||
664 | pr_err("%s: No devices connected to ocp2scp\n", __func__); | ||
665 | kfree(pdata); | ||
666 | return; | ||
667 | } | ||
668 | |||
669 | pdata->devices = kzalloc(sizeof(struct omap_ocp2scp_dev *) | ||
670 | * dev_cnt, GFP_KERNEL); | ||
671 | if (!pdata->devices) { | ||
672 | pr_err("%s: No memory for ocp2scp pdata devices\n", __func__); | ||
673 | kfree(pdata); | ||
674 | return; | ||
675 | } | ||
676 | |||
677 | for (i = 0; i < dev_cnt; i++, ocp2scp_dev++) | ||
678 | pdata->devices[i] = ocp2scp_dev; | ||
679 | |||
680 | pdata->dev_cnt = dev_cnt; | ||
681 | |||
682 | pdev = omap_device_build(name, bus_id, oh, pdata, sizeof(*pdata), NULL, | ||
683 | 0, false); | ||
684 | if (IS_ERR(pdev)) { | ||
685 | pr_err("Could not build omap_device for %s %s\n", | ||
686 | name, oh_name); | ||
687 | kfree(pdata->devices); | ||
688 | kfree(pdata); | ||
689 | return; | ||
690 | } | ||
691 | } | ||
692 | #else | ||
693 | static inline void omap_init_ocp2scp(void) { } | ||
694 | #endif | ||
695 | |||
618 | /*-------------------------------------------------------------------------*/ | 696 | /*-------------------------------------------------------------------------*/ |
619 | 697 | ||
620 | static int __init omap2_init_devices(void) | 698 | static int __init omap2_init_devices(void) |
@@ -642,6 +720,7 @@ static int __init omap2_init_devices(void) | |||
642 | omap_init_sham(); | 720 | omap_init_sham(); |
643 | omap_init_aes(); | 721 | omap_init_aes(); |
644 | omap_init_vout(); | 722 | omap_init_vout(); |
723 | omap_init_ocp2scp(); | ||
645 | 724 | ||
646 | return 0; | 725 | return 0; |
647 | } | 726 | } |
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index 139adca3bda1..b3b00f43dd7c 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c | |||
@@ -420,6 +420,38 @@ static int _set_softreset(struct omap_hwmod *oh, u32 *v) | |||
420 | } | 420 | } |
421 | 421 | ||
422 | /** | 422 | /** |
423 | * _wait_softreset_complete - wait for an OCP softreset to complete | ||
424 | * @oh: struct omap_hwmod * to wait on | ||
425 | * | ||
426 | * Wait until the IP block represented by @oh reports that its OCP | ||
427 | * softreset is complete. This can be triggered by software (see | ||
428 | * _ocp_softreset()) or by hardware upon returning from off-mode (one | ||
429 | * example is HSMMC). Waits for up to MAX_MODULE_SOFTRESET_WAIT | ||
430 | * microseconds. Returns the number of microseconds waited. | ||
431 | */ | ||
432 | static int _wait_softreset_complete(struct omap_hwmod *oh) | ||
433 | { | ||
434 | struct omap_hwmod_class_sysconfig *sysc; | ||
435 | u32 softrst_mask; | ||
436 | int c = 0; | ||
437 | |||
438 | sysc = oh->class->sysc; | ||
439 | |||
440 | if (sysc->sysc_flags & SYSS_HAS_RESET_STATUS) | ||
441 | omap_test_timeout((omap_hwmod_read(oh, sysc->syss_offs) | ||
442 | & SYSS_RESETDONE_MASK), | ||
443 | MAX_MODULE_SOFTRESET_WAIT, c); | ||
444 | else if (sysc->sysc_flags & SYSC_HAS_RESET_STATUS) { | ||
445 | softrst_mask = (0x1 << sysc->sysc_fields->srst_shift); | ||
446 | omap_test_timeout(!(omap_hwmod_read(oh, sysc->sysc_offs) | ||
447 | & softrst_mask), | ||
448 | MAX_MODULE_SOFTRESET_WAIT, c); | ||
449 | } | ||
450 | |||
451 | return c; | ||
452 | } | ||
453 | |||
454 | /** | ||
423 | * _set_dmadisable: set OCP_SYSCONFIG.DMADISABLE bit in @v | 455 | * _set_dmadisable: set OCP_SYSCONFIG.DMADISABLE bit in @v |
424 | * @oh: struct omap_hwmod * | 456 | * @oh: struct omap_hwmod * |
425 | * | 457 | * |
@@ -1280,6 +1312,18 @@ static void _enable_sysc(struct omap_hwmod *oh) | |||
1280 | if (!oh->class->sysc) | 1312 | if (!oh->class->sysc) |
1281 | return; | 1313 | return; |
1282 | 1314 | ||
1315 | /* | ||
1316 | * Wait until reset has completed, this is needed as the IP | ||
1317 | * block is reset automatically by hardware in some cases | ||
1318 | * (off-mode for example), and the drivers require the | ||
1319 | * IP to be ready when they access it | ||
1320 | */ | ||
1321 | if (oh->flags & HWMOD_CONTROL_OPT_CLKS_IN_RESET) | ||
1322 | _enable_optional_clocks(oh); | ||
1323 | _wait_softreset_complete(oh); | ||
1324 | if (oh->flags & HWMOD_CONTROL_OPT_CLKS_IN_RESET) | ||
1325 | _disable_optional_clocks(oh); | ||
1326 | |||
1283 | v = oh->_sysc_cache; | 1327 | v = oh->_sysc_cache; |
1284 | sf = oh->class->sysc->sysc_flags; | 1328 | sf = oh->class->sysc->sysc_flags; |
1285 | 1329 | ||
@@ -1802,7 +1846,7 @@ static int _am33xx_disable_module(struct omap_hwmod *oh) | |||
1802 | */ | 1846 | */ |
1803 | static int _ocp_softreset(struct omap_hwmod *oh) | 1847 | static int _ocp_softreset(struct omap_hwmod *oh) |
1804 | { | 1848 | { |
1805 | u32 v, softrst_mask; | 1849 | u32 v; |
1806 | int c = 0; | 1850 | int c = 0; |
1807 | int ret = 0; | 1851 | int ret = 0; |
1808 | 1852 | ||
@@ -1832,19 +1876,7 @@ static int _ocp_softreset(struct omap_hwmod *oh) | |||
1832 | if (oh->class->sysc->srst_udelay) | 1876 | if (oh->class->sysc->srst_udelay) |
1833 | udelay(oh->class->sysc->srst_udelay); | 1877 | udelay(oh->class->sysc->srst_udelay); |
1834 | 1878 | ||
1835 | if (oh->class->sysc->sysc_flags & SYSS_HAS_RESET_STATUS) | 1879 | c = _wait_softreset_complete(oh); |
1836 | omap_test_timeout((omap_hwmod_read(oh, | ||
1837 | oh->class->sysc->syss_offs) | ||
1838 | & SYSS_RESETDONE_MASK), | ||
1839 | MAX_MODULE_SOFTRESET_WAIT, c); | ||
1840 | else if (oh->class->sysc->sysc_flags & SYSC_HAS_RESET_STATUS) { | ||
1841 | softrst_mask = (0x1 << oh->class->sysc->sysc_fields->srst_shift); | ||
1842 | omap_test_timeout(!(omap_hwmod_read(oh, | ||
1843 | oh->class->sysc->sysc_offs) | ||
1844 | & softrst_mask), | ||
1845 | MAX_MODULE_SOFTRESET_WAIT, c); | ||
1846 | } | ||
1847 | |||
1848 | if (c == MAX_MODULE_SOFTRESET_WAIT) | 1880 | if (c == MAX_MODULE_SOFTRESET_WAIT) |
1849 | pr_warning("omap_hwmod: %s: softreset failed (waited %d usec)\n", | 1881 | pr_warning("omap_hwmod: %s: softreset failed (waited %d usec)\n", |
1850 | oh->name, MAX_MODULE_SOFTRESET_WAIT); | 1882 | oh->name, MAX_MODULE_SOFTRESET_WAIT); |
@@ -2351,6 +2383,9 @@ static int __init _setup_reset(struct omap_hwmod *oh) | |||
2351 | if (oh->_state != _HWMOD_STATE_INITIALIZED) | 2383 | if (oh->_state != _HWMOD_STATE_INITIALIZED) |
2352 | return -EINVAL; | 2384 | return -EINVAL; |
2353 | 2385 | ||
2386 | if (oh->flags & HWMOD_EXT_OPT_MAIN_CLK) | ||
2387 | return -EPERM; | ||
2388 | |||
2354 | if (oh->rst_lines_cnt == 0) { | 2389 | if (oh->rst_lines_cnt == 0) { |
2355 | r = _enable(oh); | 2390 | r = _enable(oh); |
2356 | if (r) { | 2391 | if (r) { |
diff --git a/arch/arm/mach-omap2/omap_hwmod.h b/arch/arm/mach-omap2/omap_hwmod.h index 87b59b45c678..87a3c5b7aa74 100644 --- a/arch/arm/mach-omap2/omap_hwmod.h +++ b/arch/arm/mach-omap2/omap_hwmod.h | |||
@@ -442,6 +442,11 @@ struct omap_hwmod_omap4_prcm { | |||
442 | * in order to complete the reset. Optional clocks will be disabled | 442 | * in order to complete the reset. Optional clocks will be disabled |
443 | * again after the reset. | 443 | * again after the reset. |
444 | * HWMOD_16BIT_REG: Module has 16bit registers | 444 | * HWMOD_16BIT_REG: Module has 16bit registers |
445 | * HWMOD_EXT_OPT_MAIN_CLK: The only main functional clock source for | ||
446 | * this IP block comes from an off-chip source and is not always | ||
447 | * enabled. This prevents the hwmod code from being able to | ||
448 | * enable and reset the IP block early. XXX Eventually it should | ||
449 | * be possible to query the clock framework for this information. | ||
445 | */ | 450 | */ |
446 | #define HWMOD_SWSUP_SIDLE (1 << 0) | 451 | #define HWMOD_SWSUP_SIDLE (1 << 0) |
447 | #define HWMOD_SWSUP_MSTANDBY (1 << 1) | 452 | #define HWMOD_SWSUP_MSTANDBY (1 << 1) |
@@ -452,6 +457,7 @@ struct omap_hwmod_omap4_prcm { | |||
452 | #define HWMOD_NO_IDLEST (1 << 6) | 457 | #define HWMOD_NO_IDLEST (1 << 6) |
453 | #define HWMOD_CONTROL_OPT_CLKS_IN_RESET (1 << 7) | 458 | #define HWMOD_CONTROL_OPT_CLKS_IN_RESET (1 << 7) |
454 | #define HWMOD_16BIT_REG (1 << 8) | 459 | #define HWMOD_16BIT_REG (1 << 8) |
460 | #define HWMOD_EXT_OPT_MAIN_CLK (1 << 9) | ||
455 | 461 | ||
456 | /* | 462 | /* |
457 | * omap_hwmod._int_flags definitions | 463 | * omap_hwmod._int_flags definitions |
diff --git a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c index 7a6132848f5d..b80bbf607ef8 100644 --- a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c | |||
@@ -25,6 +25,7 @@ | |||
25 | 25 | ||
26 | #include <plat-omap/dma-omap.h> | 26 | #include <plat-omap/dma-omap.h> |
27 | 27 | ||
28 | #include <linux/platform_data/omap_ocp2scp.h> | ||
28 | #include <linux/platform_data/spi-omap2-mcspi.h> | 29 | #include <linux/platform_data/spi-omap2-mcspi.h> |
29 | #include <linux/platform_data/asoc-ti-mcbsp.h> | 30 | #include <linux/platform_data/asoc-ti-mcbsp.h> |
30 | #include <plat/dmtimer.h> | 31 | #include <plat/dmtimer.h> |
@@ -2126,6 +2127,14 @@ static struct omap_hwmod omap44xx_mcpdm_hwmod = { | |||
2126 | .name = "mcpdm", | 2127 | .name = "mcpdm", |
2127 | .class = &omap44xx_mcpdm_hwmod_class, | 2128 | .class = &omap44xx_mcpdm_hwmod_class, |
2128 | .clkdm_name = "abe_clkdm", | 2129 | .clkdm_name = "abe_clkdm", |
2130 | /* | ||
2131 | * It's suspected that the McPDM requires an off-chip main | ||
2132 | * functional clock, controlled via I2C. This IP block is | ||
2133 | * currently reset very early during boot, before I2C is | ||
2134 | * available, so it doesn't seem that we have any choice in | ||
2135 | * the kernel other than to avoid resetting it. | ||
2136 | */ | ||
2137 | .flags = HWMOD_EXT_OPT_MAIN_CLK, | ||
2129 | .mpu_irqs = omap44xx_mcpdm_irqs, | 2138 | .mpu_irqs = omap44xx_mcpdm_irqs, |
2130 | .sdma_reqs = omap44xx_mcpdm_sdma_reqs, | 2139 | .sdma_reqs = omap44xx_mcpdm_sdma_reqs, |
2131 | .main_clk = "mcpdm_fck", | 2140 | .main_clk = "mcpdm_fck", |
@@ -2682,6 +2691,32 @@ static struct omap_hwmod_class omap44xx_ocp2scp_hwmod_class = { | |||
2682 | .sysc = &omap44xx_ocp2scp_sysc, | 2691 | .sysc = &omap44xx_ocp2scp_sysc, |
2683 | }; | 2692 | }; |
2684 | 2693 | ||
2694 | /* ocp2scp dev_attr */ | ||
2695 | static struct resource omap44xx_usb_phy_and_pll_addrs[] = { | ||
2696 | { | ||
2697 | .name = "usb_phy", | ||
2698 | .start = 0x4a0ad080, | ||
2699 | .end = 0x4a0ae000, | ||
2700 | .flags = IORESOURCE_MEM, | ||
2701 | }, | ||
2702 | { | ||
2703 | /* XXX: Remove this once control module driver is in place */ | ||
2704 | .name = "ctrl_dev", | ||
2705 | .start = 0x4a002300, | ||
2706 | .end = 0x4a002303, | ||
2707 | .flags = IORESOURCE_MEM, | ||
2708 | }, | ||
2709 | { } | ||
2710 | }; | ||
2711 | |||
2712 | static struct omap_ocp2scp_dev ocp2scp_dev_attr[] = { | ||
2713 | { | ||
2714 | .drv_name = "omap-usb2", | ||
2715 | .res = omap44xx_usb_phy_and_pll_addrs, | ||
2716 | }, | ||
2717 | { } | ||
2718 | }; | ||
2719 | |||
2685 | /* ocp2scp_usb_phy */ | 2720 | /* ocp2scp_usb_phy */ |
2686 | static struct omap_hwmod omap44xx_ocp2scp_usb_phy_hwmod = { | 2721 | static struct omap_hwmod omap44xx_ocp2scp_usb_phy_hwmod = { |
2687 | .name = "ocp2scp_usb_phy", | 2722 | .name = "ocp2scp_usb_phy", |
@@ -2695,6 +2730,7 @@ static struct omap_hwmod omap44xx_ocp2scp_usb_phy_hwmod = { | |||
2695 | .modulemode = MODULEMODE_HWCTRL, | 2730 | .modulemode = MODULEMODE_HWCTRL, |
2696 | }, | 2731 | }, |
2697 | }, | 2732 | }, |
2733 | .dev_attr = ocp2scp_dev_attr, | ||
2698 | }; | 2734 | }; |
2699 | 2735 | ||
2700 | /* | 2736 | /* |
diff --git a/arch/arm/mach-omap2/twl-common.c b/arch/arm/mach-omap2/twl-common.c index 827f54a1dd1d..3fa2bdb44106 100644 --- a/arch/arm/mach-omap2/twl-common.c +++ b/arch/arm/mach-omap2/twl-common.c | |||
@@ -363,7 +363,7 @@ static struct regulator_init_data omap4_clk32kg_idata = { | |||
363 | }; | 363 | }; |
364 | 364 | ||
365 | static struct regulator_consumer_supply omap4_vdd1_supply[] = { | 365 | static struct regulator_consumer_supply omap4_vdd1_supply[] = { |
366 | REGULATOR_SUPPLY("vcc", "mpu.0"), | 366 | REGULATOR_SUPPLY("vcc", "cpu0"), |
367 | }; | 367 | }; |
368 | 368 | ||
369 | static struct regulator_consumer_supply omap4_vdd2_supply[] = { | 369 | static struct regulator_consumer_supply omap4_vdd2_supply[] = { |
diff --git a/arch/arm/mach-omap2/vc.c b/arch/arm/mach-omap2/vc.c index 880249b17012..75878c37959b 100644 --- a/arch/arm/mach-omap2/vc.c +++ b/arch/arm/mach-omap2/vc.c | |||
@@ -264,7 +264,7 @@ static void __init omap_vc_i2c_init(struct voltagedomain *voltdm) | |||
264 | 264 | ||
265 | if (initialized) { | 265 | if (initialized) { |
266 | if (voltdm->pmic->i2c_high_speed != i2c_high_speed) | 266 | if (voltdm->pmic->i2c_high_speed != i2c_high_speed) |
267 | pr_warn("%s: I2C config for vdd_%s does not match other channels (%u).", | 267 | pr_warn("%s: I2C config for vdd_%s does not match other channels (%u).\n", |
268 | __func__, voltdm->name, i2c_high_speed); | 268 | __func__, voltdm->name, i2c_high_speed); |
269 | return; | 269 | return; |
270 | } | 270 | } |
diff --git a/arch/arm/mach-orion5x/Kconfig b/arch/arm/mach-orion5x/Kconfig index 0673f0c10432..2cb2f06c20f5 100644 --- a/arch/arm/mach-orion5x/Kconfig +++ b/arch/arm/mach-orion5x/Kconfig | |||
@@ -2,6 +2,13 @@ if ARCH_ORION5X | |||
2 | 2 | ||
3 | menu "Orion Implementations" | 3 | menu "Orion Implementations" |
4 | 4 | ||
5 | config ARCH_ORION5X_DT | ||
6 | bool "Marvell Orion5x Flattened Device Tree" | ||
7 | select USE_OF | ||
8 | help | ||
9 | Say 'Y' here if you want your kernel to support the | ||
10 | Marvell Orion5x using flattened device tree. | ||
11 | |||
5 | config MACH_DB88F5281 | 12 | config MACH_DB88F5281 |
6 | bool "Marvell Orion-2 Development Board" | 13 | bool "Marvell Orion-2 Development Board" |
7 | select I2C_BOARDINFO | 14 | select I2C_BOARDINFO |
@@ -96,12 +103,13 @@ config MACH_MV2120 | |||
96 | Say 'Y' here if you want your kernel to support the | 103 | Say 'Y' here if you want your kernel to support the |
97 | HP Media Vault mv2120 or mv5100. | 104 | HP Media Vault mv2120 or mv5100. |
98 | 105 | ||
99 | config MACH_EDMINI_V2 | 106 | config MACH_EDMINI_V2_DT |
100 | bool "LaCie Ethernet Disk mini V2" | 107 | bool "LaCie Ethernet Disk mini V2 (Flattened Device Tree)" |
101 | select I2C_BOARDINFO | 108 | select I2C_BOARDINFO |
109 | select ARCH_ORION5X_DT | ||
102 | help | 110 | help |
103 | Say 'Y' here if you want your kernel to support the | 111 | Say 'Y' here if you want your kernel to support the |
104 | LaCie Ethernet Disk mini V2. | 112 | LaCie Ethernet Disk mini V2 (Flattened Device Tree). |
105 | 113 | ||
106 | config MACH_D2NET | 114 | config MACH_D2NET |
107 | bool "LaCie d2 Network" | 115 | bool "LaCie d2 Network" |
diff --git a/arch/arm/mach-orion5x/Makefile b/arch/arm/mach-orion5x/Makefile index 7f18cdacd487..9e809a7c05c0 100644 --- a/arch/arm/mach-orion5x/Makefile +++ b/arch/arm/mach-orion5x/Makefile | |||
@@ -12,7 +12,6 @@ obj-$(CONFIG_MACH_TS409) += ts409-setup.o tsx09-common.o | |||
12 | obj-$(CONFIG_MACH_WRT350N_V2) += wrt350n-v2-setup.o | 12 | obj-$(CONFIG_MACH_WRT350N_V2) += wrt350n-v2-setup.o |
13 | obj-$(CONFIG_MACH_TS78XX) += ts78xx-setup.o | 13 | obj-$(CONFIG_MACH_TS78XX) += ts78xx-setup.o |
14 | obj-$(CONFIG_MACH_MV2120) += mv2120-setup.o | 14 | obj-$(CONFIG_MACH_MV2120) += mv2120-setup.o |
15 | obj-$(CONFIG_MACH_EDMINI_V2) += edmini_v2-setup.o | ||
16 | obj-$(CONFIG_MACH_D2NET) += d2net-setup.o | 15 | obj-$(CONFIG_MACH_D2NET) += d2net-setup.o |
17 | obj-$(CONFIG_MACH_BIGDISK) += d2net-setup.o | 16 | obj-$(CONFIG_MACH_BIGDISK) += d2net-setup.o |
18 | obj-$(CONFIG_MACH_NET2BIG) += net2big-setup.o | 17 | obj-$(CONFIG_MACH_NET2BIG) += net2big-setup.o |
@@ -22,3 +21,6 @@ obj-$(CONFIG_MACH_RD88F5181L_GE) += rd88f5181l-ge-setup.o | |||
22 | obj-$(CONFIG_MACH_RD88F5181L_FXO) += rd88f5181l-fxo-setup.o | 21 | obj-$(CONFIG_MACH_RD88F5181L_FXO) += rd88f5181l-fxo-setup.o |
23 | obj-$(CONFIG_MACH_RD88F6183AP_GE) += rd88f6183ap-ge-setup.o | 22 | obj-$(CONFIG_MACH_RD88F6183AP_GE) += rd88f6183ap-ge-setup.o |
24 | obj-$(CONFIG_MACH_LINKSTATION_LSCHL) += ls-chl-setup.o | 23 | obj-$(CONFIG_MACH_LINKSTATION_LSCHL) += ls-chl-setup.o |
24 | |||
25 | obj-$(CONFIG_ARCH_ORION5X_DT) += board-dt.o | ||
26 | obj-$(CONFIG_MACH_EDMINI_V2_DT) += edmini_v2-setup.o | ||
diff --git a/arch/arm/mach-orion5x/board-dt.c b/arch/arm/mach-orion5x/board-dt.c new file mode 100644 index 000000000000..32e5c211a89b --- /dev/null +++ b/arch/arm/mach-orion5x/board-dt.c | |||
@@ -0,0 +1,79 @@ | |||
1 | /* | ||
2 | * Copyright 2012 (C), Thomas Petazzoni <thomas.petazzoni@free-electrons.com> | ||
3 | * | ||
4 | * arch/arm/mach-orion5x/board-dt.c | ||
5 | * | ||
6 | * Flattened Device Tree board initialization | ||
7 | * | ||
8 | * This file is licensed under the terms of the GNU General Public | ||
9 | * License version 2. This program is licensed "as is" without any | ||
10 | * warranty of any kind, whether express or implied. | ||
11 | */ | ||
12 | |||
13 | #include <linux/kernel.h> | ||
14 | #include <linux/init.h> | ||
15 | #include <linux/of.h> | ||
16 | #include <linux/of_platform.h> | ||
17 | #include <asm/system_misc.h> | ||
18 | #include <asm/mach/arch.h> | ||
19 | #include <mach/orion5x.h> | ||
20 | #include <plat/irq.h> | ||
21 | #include "common.h" | ||
22 | |||
23 | struct of_dev_auxdata orion5x_auxdata_lookup[] __initdata = { | ||
24 | OF_DEV_AUXDATA("marvell,orion-spi", 0xf1010600, "orion_spi.0", NULL), | ||
25 | OF_DEV_AUXDATA("marvell,mv64xxx-i2c", 0xf1011000, "mv64xxx_i2c.0", | ||
26 | NULL), | ||
27 | OF_DEV_AUXDATA("marvell,orion-wdt", 0xf1020300, "orion_wdt", NULL), | ||
28 | OF_DEV_AUXDATA("marvell,orion-sata", 0xf1080000, "sata_mv.0", NULL), | ||
29 | OF_DEV_AUXDATA("marvell,orion-crypto", 0xf1090000, "mv_crypto", NULL), | ||
30 | {}, | ||
31 | }; | ||
32 | |||
33 | static void __init orion5x_dt_init(void) | ||
34 | { | ||
35 | char *dev_name; | ||
36 | u32 dev, rev; | ||
37 | |||
38 | orion5x_id(&dev, &rev, &dev_name); | ||
39 | printk(KERN_INFO "Orion ID: %s. TCLK=%d.\n", dev_name, orion5x_tclk); | ||
40 | |||
41 | /* | ||
42 | * Setup Orion address map | ||
43 | */ | ||
44 | orion5x_setup_cpu_mbus_bridge(); | ||
45 | |||
46 | /* Setup root of clk tree */ | ||
47 | clk_init(); | ||
48 | |||
49 | /* | ||
50 | * Don't issue "Wait for Interrupt" instruction if we are | ||
51 | * running on D0 5281 silicon. | ||
52 | */ | ||
53 | if (dev == MV88F5281_DEV_ID && rev == MV88F5281_REV_D0) { | ||
54 | printk(KERN_INFO "Orion: Applying 5281 D0 WFI workaround.\n"); | ||
55 | disable_hlt(); | ||
56 | } | ||
57 | |||
58 | if (of_machine_is_compatible("lacie,ethernet-disk-mini-v2")) | ||
59 | edmini_v2_init(); | ||
60 | |||
61 | of_platform_populate(NULL, of_default_bus_match_table, | ||
62 | orion5x_auxdata_lookup, NULL); | ||
63 | } | ||
64 | |||
65 | static const char *orion5x_dt_compat[] = { | ||
66 | "marvell,orion5x", | ||
67 | NULL, | ||
68 | }; | ||
69 | |||
70 | DT_MACHINE_START(ORION5X_DT, "Marvell Orion5x (Flattened Device Tree)") | ||
71 | /* Maintainer: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> */ | ||
72 | .map_io = orion5x_map_io, | ||
73 | .init_early = orion5x_init_early, | ||
74 | .init_irq = orion_dt_init_irq, | ||
75 | .timer = &orion5x_timer, | ||
76 | .init_machine = orion5x_dt_init, | ||
77 | .restart = orion5x_restart, | ||
78 | .dt_compat = orion5x_dt_compat, | ||
79 | MACHINE_END | ||
diff --git a/arch/arm/mach-orion5x/common.c b/arch/arm/mach-orion5x/common.c index b3eb3da01160..550f92320afb 100644 --- a/arch/arm/mach-orion5x/common.c +++ b/arch/arm/mach-orion5x/common.c | |||
@@ -65,7 +65,7 @@ void __init orion5x_map_io(void) | |||
65 | ****************************************************************************/ | 65 | ****************************************************************************/ |
66 | static struct clk *tclk; | 66 | static struct clk *tclk; |
67 | 67 | ||
68 | static void __init clk_init(void) | 68 | void __init clk_init(void) |
69 | { | 69 | { |
70 | tclk = clk_register_fixed_rate(NULL, "tclk", NULL, CLK_IS_ROOT, | 70 | tclk = clk_register_fixed_rate(NULL, "tclk", NULL, CLK_IS_ROOT, |
71 | orion5x_tclk); | 71 | orion5x_tclk); |
@@ -236,7 +236,7 @@ struct sys_timer orion5x_timer = { | |||
236 | /* | 236 | /* |
237 | * Identify device ID and rev from PCIe configuration header space '0'. | 237 | * Identify device ID and rev from PCIe configuration header space '0'. |
238 | */ | 238 | */ |
239 | static void __init orion5x_id(u32 *dev, u32 *rev, char **dev_name) | 239 | void __init orion5x_id(u32 *dev, u32 *rev, char **dev_name) |
240 | { | 240 | { |
241 | orion5x_pcie_id(dev, rev); | 241 | orion5x_pcie_id(dev, rev); |
242 | 242 | ||
diff --git a/arch/arm/mach-orion5x/common.h b/arch/arm/mach-orion5x/common.h index 31bab92ce038..7db5cdd9c4b7 100644 --- a/arch/arm/mach-orion5x/common.h +++ b/arch/arm/mach-orion5x/common.h | |||
@@ -12,6 +12,8 @@ void orion5x_map_io(void); | |||
12 | void orion5x_init_early(void); | 12 | void orion5x_init_early(void); |
13 | void orion5x_init_irq(void); | 13 | void orion5x_init_irq(void); |
14 | void orion5x_init(void); | 14 | void orion5x_init(void); |
15 | void orion5x_id(u32 *dev, u32 *rev, char **dev_name); | ||
16 | void clk_init(void); | ||
15 | extern int orion5x_tclk; | 17 | extern int orion5x_tclk; |
16 | extern struct sys_timer orion5x_timer; | 18 | extern struct sys_timer orion5x_timer; |
17 | 19 | ||
@@ -54,6 +56,13 @@ int orion5x_pci_sys_setup(int nr, struct pci_sys_data *sys); | |||
54 | struct pci_bus *orion5x_pci_sys_scan_bus(int nr, struct pci_sys_data *sys); | 56 | struct pci_bus *orion5x_pci_sys_scan_bus(int nr, struct pci_sys_data *sys); |
55 | int orion5x_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin); | 57 | int orion5x_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin); |
56 | 58 | ||
59 | /* board init functions for boards not fully converted to fdt */ | ||
60 | #ifdef CONFIG_MACH_EDMINI_V2_DT | ||
61 | void edmini_v2_init(void); | ||
62 | #else | ||
63 | static inline void edmini_v2_init(void) {}; | ||
64 | #endif | ||
65 | |||
57 | struct meminfo; | 66 | struct meminfo; |
58 | struct tag; | 67 | struct tag; |
59 | extern void __init tag_fixup_mem32(struct tag *, char **, struct meminfo *); | 68 | extern void __init tag_fixup_mem32(struct tag *, char **, struct meminfo *); |
diff --git a/arch/arm/mach-orion5x/edmini_v2-setup.c b/arch/arm/mach-orion5x/edmini_v2-setup.c index 355e962137c7..d675e727803d 100644 --- a/arch/arm/mach-orion5x/edmini_v2-setup.c +++ b/arch/arm/mach-orion5x/edmini_v2-setup.c | |||
@@ -115,69 +115,6 @@ static struct i2c_board_info __initdata edmini_v2_i2c_rtc = { | |||
115 | }; | 115 | }; |
116 | 116 | ||
117 | /***************************************************************************** | 117 | /***************************************************************************** |
118 | * Sata | ||
119 | ****************************************************************************/ | ||
120 | |||
121 | static struct mv_sata_platform_data edmini_v2_sata_data = { | ||
122 | .n_ports = 2, | ||
123 | }; | ||
124 | |||
125 | /***************************************************************************** | ||
126 | * GPIO LED (simple - doesn't use hardware blinking support) | ||
127 | ****************************************************************************/ | ||
128 | |||
129 | #define EDMINI_V2_GPIO_LED_POWER 16 | ||
130 | |||
131 | static struct gpio_led edmini_v2_leds[] = { | ||
132 | { | ||
133 | .name = "power:blue", | ||
134 | .gpio = EDMINI_V2_GPIO_LED_POWER, | ||
135 | .active_low = 1, | ||
136 | }, | ||
137 | }; | ||
138 | |||
139 | static struct gpio_led_platform_data edmini_v2_led_data = { | ||
140 | .num_leds = ARRAY_SIZE(edmini_v2_leds), | ||
141 | .leds = edmini_v2_leds, | ||
142 | }; | ||
143 | |||
144 | static struct platform_device edmini_v2_gpio_leds = { | ||
145 | .name = "leds-gpio", | ||
146 | .id = -1, | ||
147 | .dev = { | ||
148 | .platform_data = &edmini_v2_led_data, | ||
149 | }, | ||
150 | }; | ||
151 | |||
152 | /**************************************************************************** | ||
153 | * GPIO key | ||
154 | ****************************************************************************/ | ||
155 | |||
156 | #define EDMINI_V2_GPIO_KEY_POWER 18 | ||
157 | |||
158 | static struct gpio_keys_button edmini_v2_buttons[] = { | ||
159 | { | ||
160 | .code = KEY_POWER, | ||
161 | .gpio = EDMINI_V2_GPIO_KEY_POWER, | ||
162 | .desc = "Power Button", | ||
163 | .active_low = 0, | ||
164 | }, | ||
165 | }; | ||
166 | |||
167 | static struct gpio_keys_platform_data edmini_v2_button_data = { | ||
168 | .buttons = edmini_v2_buttons, | ||
169 | .nbuttons = ARRAY_SIZE(edmini_v2_buttons), | ||
170 | }; | ||
171 | |||
172 | static struct platform_device edmini_v2_gpio_buttons = { | ||
173 | .name = "gpio-keys", | ||
174 | .id = -1, | ||
175 | .dev = { | ||
176 | .platform_data = &edmini_v2_button_data, | ||
177 | }, | ||
178 | }; | ||
179 | |||
180 | /***************************************************************************** | ||
181 | * General Setup | 118 | * General Setup |
182 | ****************************************************************************/ | 119 | ****************************************************************************/ |
183 | static unsigned int edminiv2_mpp_modes[] __initdata = { | 120 | static unsigned int edminiv2_mpp_modes[] __initdata = { |
@@ -207,13 +144,8 @@ static unsigned int edminiv2_mpp_modes[] __initdata = { | |||
207 | 0, | 144 | 0, |
208 | }; | 145 | }; |
209 | 146 | ||
210 | static void __init edmini_v2_init(void) | 147 | void __init edmini_v2_init(void) |
211 | { | 148 | { |
212 | /* | ||
213 | * Setup basic Orion functions. Need to be called early. | ||
214 | */ | ||
215 | orion5x_init(); | ||
216 | |||
217 | orion5x_mpp_conf(edminiv2_mpp_modes); | 149 | orion5x_mpp_conf(edminiv2_mpp_modes); |
218 | 150 | ||
219 | /* | 151 | /* |
@@ -221,15 +153,10 @@ static void __init edmini_v2_init(void) | |||
221 | */ | 153 | */ |
222 | orion5x_ehci0_init(); | 154 | orion5x_ehci0_init(); |
223 | orion5x_eth_init(&edmini_v2_eth_data); | 155 | orion5x_eth_init(&edmini_v2_eth_data); |
224 | orion5x_i2c_init(); | ||
225 | orion5x_sata_init(&edmini_v2_sata_data); | ||
226 | orion5x_uart0_init(); | ||
227 | 156 | ||
228 | orion5x_setup_dev_boot_win(EDMINI_V2_NOR_BOOT_BASE, | 157 | orion5x_setup_dev_boot_win(EDMINI_V2_NOR_BOOT_BASE, |
229 | EDMINI_V2_NOR_BOOT_SIZE); | 158 | EDMINI_V2_NOR_BOOT_SIZE); |
230 | platform_device_register(&edmini_v2_nor_flash); | 159 | platform_device_register(&edmini_v2_nor_flash); |
231 | platform_device_register(&edmini_v2_gpio_leds); | ||
232 | platform_device_register(&edmini_v2_gpio_buttons); | ||
233 | 160 | ||
234 | pr_notice("edmini_v2: USB device port, flash write and power-off " | 161 | pr_notice("edmini_v2: USB device port, flash write and power-off " |
235 | "are not yet supported.\n"); | 162 | "are not yet supported.\n"); |
@@ -247,16 +174,3 @@ static void __init edmini_v2_init(void) | |||
247 | 174 | ||
248 | i2c_register_board_info(0, &edmini_v2_i2c_rtc, 1); | 175 | i2c_register_board_info(0, &edmini_v2_i2c_rtc, 1); |
249 | } | 176 | } |
250 | |||
251 | /* Warning: LaCie use a wrong mach-type (0x20e=526) in their bootloader. */ | ||
252 | MACHINE_START(EDMINI_V2, "LaCie Ethernet Disk mini V2") | ||
253 | /* Maintainer: Christopher Moore <moore@free.fr> */ | ||
254 | .atag_offset = 0x100, | ||
255 | .init_machine = edmini_v2_init, | ||
256 | .map_io = orion5x_map_io, | ||
257 | .init_early = orion5x_init_early, | ||
258 | .init_irq = orion5x_init_irq, | ||
259 | .timer = &orion5x_timer, | ||
260 | .fixup = tag_fixup_mem32, | ||
261 | .restart = orion5x_restart, | ||
262 | MACHINE_END | ||
diff --git a/arch/arm/mach-pxa/hx4700.c b/arch/arm/mach-pxa/hx4700.c index 5ecbd17b5641..e2c6391863fe 100644 --- a/arch/arm/mach-pxa/hx4700.c +++ b/arch/arm/mach-pxa/hx4700.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <linux/mfd/asic3.h> | 28 | #include <linux/mfd/asic3.h> |
29 | #include <linux/mtd/physmap.h> | 29 | #include <linux/mtd/physmap.h> |
30 | #include <linux/pda_power.h> | 30 | #include <linux/pda_power.h> |
31 | #include <linux/pwm.h> | ||
31 | #include <linux/pwm_backlight.h> | 32 | #include <linux/pwm_backlight.h> |
32 | #include <linux/regulator/driver.h> | 33 | #include <linux/regulator/driver.h> |
33 | #include <linux/regulator/gpio-regulator.h> | 34 | #include <linux/regulator/gpio-regulator.h> |
@@ -556,7 +557,7 @@ static struct platform_device hx4700_lcd = { | |||
556 | */ | 557 | */ |
557 | 558 | ||
558 | static struct platform_pwm_backlight_data backlight_data = { | 559 | static struct platform_pwm_backlight_data backlight_data = { |
559 | .pwm_id = 1, | 560 | .pwm_id = -1, /* Superseded by pwm_lookup */ |
560 | .max_brightness = 200, | 561 | .max_brightness = 200, |
561 | .dft_brightness = 100, | 562 | .dft_brightness = 100, |
562 | .pwm_period_ns = 30923, | 563 | .pwm_period_ns = 30923, |
@@ -571,6 +572,10 @@ static struct platform_device backlight = { | |||
571 | }, | 572 | }, |
572 | }; | 573 | }; |
573 | 574 | ||
575 | static struct pwm_lookup hx4700_pwm_lookup[] = { | ||
576 | PWM_LOOKUP("pxa27x-pwm.1", 0, "pwm-backlight", NULL), | ||
577 | }; | ||
578 | |||
574 | /* | 579 | /* |
575 | * USB "Transceiver" | 580 | * USB "Transceiver" |
576 | */ | 581 | */ |
@@ -872,6 +877,7 @@ static void __init hx4700_init(void) | |||
872 | pxa_set_stuart_info(NULL); | 877 | pxa_set_stuart_info(NULL); |
873 | 878 | ||
874 | platform_add_devices(devices, ARRAY_SIZE(devices)); | 879 | platform_add_devices(devices, ARRAY_SIZE(devices)); |
880 | pwm_add_table(hx4700_pwm_lookup, ARRAY_SIZE(hx4700_pwm_lookup)); | ||
875 | 881 | ||
876 | pxa_set_ficp_info(&ficp_info); | 882 | pxa_set_ficp_info(&ficp_info); |
877 | pxa27x_set_i2c_power_info(NULL); | 883 | pxa27x_set_i2c_power_info(NULL); |
diff --git a/arch/arm/mach-pxa/spitz_pm.c b/arch/arm/mach-pxa/spitz_pm.c index 438f02fe122a..842596d4d31e 100644 --- a/arch/arm/mach-pxa/spitz_pm.c +++ b/arch/arm/mach-pxa/spitz_pm.c | |||
@@ -86,10 +86,7 @@ static void spitz_discharge1(int on) | |||
86 | gpio_set_value(SPITZ_GPIO_LED_GREEN, on); | 86 | gpio_set_value(SPITZ_GPIO_LED_GREEN, on); |
87 | } | 87 | } |
88 | 88 | ||
89 | static unsigned long gpio18_config[] = { | 89 | static unsigned long gpio18_config = GPIO18_GPIO; |
90 | GPIO18_RDY, | ||
91 | GPIO18_GPIO, | ||
92 | }; | ||
93 | 90 | ||
94 | static void spitz_presuspend(void) | 91 | static void spitz_presuspend(void) |
95 | { | 92 | { |
@@ -112,7 +109,7 @@ static void spitz_presuspend(void) | |||
112 | PGSR3 &= ~SPITZ_GPIO_G3_STROBE_BIT; | 109 | PGSR3 &= ~SPITZ_GPIO_G3_STROBE_BIT; |
113 | PGSR2 |= GPIO_bit(SPITZ_GPIO_KEY_STROBE0); | 110 | PGSR2 |= GPIO_bit(SPITZ_GPIO_KEY_STROBE0); |
114 | 111 | ||
115 | pxa2xx_mfp_config(&gpio18_config[0], 1); | 112 | pxa2xx_mfp_config(&gpio18_config, 1); |
116 | gpio_request_one(18, GPIOF_OUT_INIT_HIGH, "Unknown"); | 113 | gpio_request_one(18, GPIOF_OUT_INIT_HIGH, "Unknown"); |
117 | gpio_free(18); | 114 | gpio_free(18); |
118 | 115 | ||
@@ -131,7 +128,6 @@ static void spitz_presuspend(void) | |||
131 | 128 | ||
132 | static void spitz_postsuspend(void) | 129 | static void spitz_postsuspend(void) |
133 | { | 130 | { |
134 | pxa2xx_mfp_config(&gpio18_config[1], 1); | ||
135 | } | 131 | } |
136 | 132 | ||
137 | static int spitz_should_wakeup(unsigned int resume_on_alarm) | 133 | static int spitz_should_wakeup(unsigned int resume_on_alarm) |
diff --git a/arch/arm/plat-orion/irq.c b/arch/arm/plat-orion/irq.c index 1867944415ca..8db0b981ca64 100644 --- a/arch/arm/plat-orion/irq.c +++ b/arch/arm/plat-orion/irq.c | |||
@@ -41,7 +41,7 @@ void __init orion_irq_init(unsigned int irq_start, void __iomem *maskaddr) | |||
41 | static int __init orion_add_irq_domain(struct device_node *np, | 41 | static int __init orion_add_irq_domain(struct device_node *np, |
42 | struct device_node *interrupt_parent) | 42 | struct device_node *interrupt_parent) |
43 | { | 43 | { |
44 | int i = 0, irq_gpio; | 44 | int i = 0; |
45 | void __iomem *base; | 45 | void __iomem *base; |
46 | 46 | ||
47 | do { | 47 | do { |
@@ -54,10 +54,6 @@ static int __init orion_add_irq_domain(struct device_node *np, | |||
54 | 54 | ||
55 | irq_domain_add_legacy(np, i * 32, 0, 0, | 55 | irq_domain_add_legacy(np, i * 32, 0, 0, |
56 | &irq_domain_simple_ops, NULL); | 56 | &irq_domain_simple_ops, NULL); |
57 | |||
58 | irq_gpio = i * 32; | ||
59 | orion_gpio_of_init(irq_gpio); | ||
60 | |||
61 | return 0; | 57 | return 0; |
62 | } | 58 | } |
63 | 59 | ||
diff --git a/arch/arm/tools/Makefile b/arch/arm/tools/Makefile index cd60a81163e9..32d05c8219dc 100644 --- a/arch/arm/tools/Makefile +++ b/arch/arm/tools/Makefile | |||
@@ -5,6 +5,6 @@ | |||
5 | # | 5 | # |
6 | 6 | ||
7 | include/generated/mach-types.h: $(src)/gen-mach-types $(src)/mach-types | 7 | include/generated/mach-types.h: $(src)/gen-mach-types $(src)/mach-types |
8 | $(kecho) ' Generating $@' | 8 | @$(kecho) ' Generating $@' |
9 | @mkdir -p $(dir $@) | 9 | @mkdir -p $(dir $@) |
10 | $(Q)$(AWK) -f $^ > $@ || { rm -f $@; /bin/false; } | 10 | $(Q)$(AWK) -f $^ > $@ || { rm -f $@; /bin/false; } |
diff --git a/arch/arm64/include/asm/io.h b/arch/arm64/include/asm/io.h index 54f6116697f7..d2f05a608274 100644 --- a/arch/arm64/include/asm/io.h +++ b/arch/arm64/include/asm/io.h | |||
@@ -222,7 +222,7 @@ extern void __iomem *__ioremap(phys_addr_t phys_addr, size_t size, pgprot_t prot | |||
222 | extern void __iounmap(volatile void __iomem *addr); | 222 | extern void __iounmap(volatile void __iomem *addr); |
223 | 223 | ||
224 | #define PROT_DEFAULT (PTE_TYPE_PAGE | PTE_AF | PTE_DIRTY) | 224 | #define PROT_DEFAULT (PTE_TYPE_PAGE | PTE_AF | PTE_DIRTY) |
225 | #define PROT_DEVICE_nGnRE (PROT_DEFAULT | PTE_XN | PTE_ATTRINDX(MT_DEVICE_nGnRE)) | 225 | #define PROT_DEVICE_nGnRE (PROT_DEFAULT | PTE_PXN | PTE_UXN | PTE_ATTRINDX(MT_DEVICE_nGnRE)) |
226 | #define PROT_NORMAL_NC (PROT_DEFAULT | PTE_ATTRINDX(MT_NORMAL_NC)) | 226 | #define PROT_NORMAL_NC (PROT_DEFAULT | PTE_ATTRINDX(MT_NORMAL_NC)) |
227 | 227 | ||
228 | #define ioremap(addr, size) __ioremap((addr), (size), __pgprot(PROT_DEVICE_nGnRE)) | 228 | #define ioremap(addr, size) __ioremap((addr), (size), __pgprot(PROT_DEVICE_nGnRE)) |
diff --git a/arch/arm64/include/asm/pgtable-hwdef.h b/arch/arm64/include/asm/pgtable-hwdef.h index 0f3b4581d925..75fd13d289b9 100644 --- a/arch/arm64/include/asm/pgtable-hwdef.h +++ b/arch/arm64/include/asm/pgtable-hwdef.h | |||
@@ -38,7 +38,8 @@ | |||
38 | #define PMD_SECT_S (_AT(pmdval_t, 3) << 8) | 38 | #define PMD_SECT_S (_AT(pmdval_t, 3) << 8) |
39 | #define PMD_SECT_AF (_AT(pmdval_t, 1) << 10) | 39 | #define PMD_SECT_AF (_AT(pmdval_t, 1) << 10) |
40 | #define PMD_SECT_NG (_AT(pmdval_t, 1) << 11) | 40 | #define PMD_SECT_NG (_AT(pmdval_t, 1) << 11) |
41 | #define PMD_SECT_XN (_AT(pmdval_t, 1) << 54) | 41 | #define PMD_SECT_PXN (_AT(pmdval_t, 1) << 53) |
42 | #define PMD_SECT_UXN (_AT(pmdval_t, 1) << 54) | ||
42 | 43 | ||
43 | /* | 44 | /* |
44 | * AttrIndx[2:0] encoding (mapping attributes defined in the MAIR* registers). | 45 | * AttrIndx[2:0] encoding (mapping attributes defined in the MAIR* registers). |
@@ -57,7 +58,8 @@ | |||
57 | #define PTE_SHARED (_AT(pteval_t, 3) << 8) /* SH[1:0], inner shareable */ | 58 | #define PTE_SHARED (_AT(pteval_t, 3) << 8) /* SH[1:0], inner shareable */ |
58 | #define PTE_AF (_AT(pteval_t, 1) << 10) /* Access Flag */ | 59 | #define PTE_AF (_AT(pteval_t, 1) << 10) /* Access Flag */ |
59 | #define PTE_NG (_AT(pteval_t, 1) << 11) /* nG */ | 60 | #define PTE_NG (_AT(pteval_t, 1) << 11) /* nG */ |
60 | #define PTE_XN (_AT(pteval_t, 1) << 54) /* XN */ | 61 | #define PTE_PXN (_AT(pteval_t, 1) << 53) /* Privileged XN */ |
62 | #define PTE_UXN (_AT(pteval_t, 1) << 54) /* User XN */ | ||
61 | 63 | ||
62 | /* | 64 | /* |
63 | * AttrIndx[2:0] encoding (mapping attributes defined in the MAIR* registers). | 65 | * AttrIndx[2:0] encoding (mapping attributes defined in the MAIR* registers). |
diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h index 8960239be722..14aba2db6776 100644 --- a/arch/arm64/include/asm/pgtable.h +++ b/arch/arm64/include/asm/pgtable.h | |||
@@ -62,23 +62,23 @@ extern pgprot_t pgprot_default; | |||
62 | 62 | ||
63 | #define _MOD_PROT(p, b) __pgprot(pgprot_val(p) | (b)) | 63 | #define _MOD_PROT(p, b) __pgprot(pgprot_val(p) | (b)) |
64 | 64 | ||
65 | #define PAGE_NONE _MOD_PROT(pgprot_default, PTE_NG | PTE_XN | PTE_RDONLY) | 65 | #define PAGE_NONE _MOD_PROT(pgprot_default, PTE_NG | PTE_PXN | PTE_UXN | PTE_RDONLY) |
66 | #define PAGE_SHARED _MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_XN) | 66 | #define PAGE_SHARED _MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_PXN | PTE_UXN) |
67 | #define PAGE_SHARED_EXEC _MOD_PROT(pgprot_default, PTE_USER | PTE_NG) | 67 | #define PAGE_SHARED_EXEC _MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_PXN) |
68 | #define PAGE_COPY _MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_XN | PTE_RDONLY) | 68 | #define PAGE_COPY _MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_PXN | PTE_UXN | PTE_RDONLY) |
69 | #define PAGE_COPY_EXEC _MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_RDONLY) | 69 | #define PAGE_COPY_EXEC _MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_PXN | PTE_RDONLY) |
70 | #define PAGE_READONLY _MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_XN | PTE_RDONLY) | 70 | #define PAGE_READONLY _MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_PXN | PTE_UXN | PTE_RDONLY) |
71 | #define PAGE_READONLY_EXEC _MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_RDONLY) | 71 | #define PAGE_READONLY_EXEC _MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_PXN | PTE_RDONLY) |
72 | #define PAGE_KERNEL _MOD_PROT(pgprot_default, PTE_XN | PTE_DIRTY) | 72 | #define PAGE_KERNEL _MOD_PROT(pgprot_default, PTE_PXN | PTE_UXN | PTE_DIRTY) |
73 | #define PAGE_KERNEL_EXEC _MOD_PROT(pgprot_default, PTE_DIRTY) | 73 | #define PAGE_KERNEL_EXEC _MOD_PROT(pgprot_default, PTE_UXN | PTE_DIRTY) |
74 | 74 | ||
75 | #define __PAGE_NONE __pgprot(_PAGE_DEFAULT | PTE_NG | PTE_XN | PTE_RDONLY) | 75 | #define __PAGE_NONE __pgprot(_PAGE_DEFAULT | PTE_NG | PTE_PXN | PTE_UXN | PTE_RDONLY) |
76 | #define __PAGE_SHARED __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_XN) | 76 | #define __PAGE_SHARED __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_UXN) |
77 | #define __PAGE_SHARED_EXEC __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG) | 77 | #define __PAGE_SHARED_EXEC __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN) |
78 | #define __PAGE_COPY __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_XN | PTE_RDONLY) | 78 | #define __PAGE_COPY __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_UXN | PTE_RDONLY) |
79 | #define __PAGE_COPY_EXEC __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_RDONLY) | 79 | #define __PAGE_COPY_EXEC __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_RDONLY) |
80 | #define __PAGE_READONLY __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_XN | PTE_RDONLY) | 80 | #define __PAGE_READONLY __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_UXN | PTE_RDONLY) |
81 | #define __PAGE_READONLY_EXEC __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_RDONLY) | 81 | #define __PAGE_READONLY_EXEC __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_RDONLY) |
82 | 82 | ||
83 | #endif /* __ASSEMBLY__ */ | 83 | #endif /* __ASSEMBLY__ */ |
84 | 84 | ||
@@ -130,10 +130,10 @@ extern struct page *empty_zero_page; | |||
130 | #define pte_young(pte) (pte_val(pte) & PTE_AF) | 130 | #define pte_young(pte) (pte_val(pte) & PTE_AF) |
131 | #define pte_special(pte) (pte_val(pte) & PTE_SPECIAL) | 131 | #define pte_special(pte) (pte_val(pte) & PTE_SPECIAL) |
132 | #define pte_write(pte) (!(pte_val(pte) & PTE_RDONLY)) | 132 | #define pte_write(pte) (!(pte_val(pte) & PTE_RDONLY)) |
133 | #define pte_exec(pte) (!(pte_val(pte) & PTE_XN)) | 133 | #define pte_exec(pte) (!(pte_val(pte) & PTE_UXN)) |
134 | 134 | ||
135 | #define pte_present_exec_user(pte) \ | 135 | #define pte_present_exec_user(pte) \ |
136 | ((pte_val(pte) & (PTE_VALID | PTE_USER | PTE_XN)) == \ | 136 | ((pte_val(pte) & (PTE_VALID | PTE_USER | PTE_UXN)) == \ |
137 | (PTE_VALID | PTE_USER)) | 137 | (PTE_VALID | PTE_USER)) |
138 | 138 | ||
139 | #define PTE_BIT_FUNC(fn,op) \ | 139 | #define PTE_BIT_FUNC(fn,op) \ |
@@ -262,7 +262,7 @@ static inline pmd_t *pmd_offset(pud_t *pud, unsigned long addr) | |||
262 | 262 | ||
263 | static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) | 263 | static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) |
264 | { | 264 | { |
265 | const pteval_t mask = PTE_USER | PTE_XN | PTE_RDONLY; | 265 | const pteval_t mask = PTE_USER | PTE_PXN | PTE_UXN | PTE_RDONLY; |
266 | pte_val(pte) = (pte_val(pte) & ~mask) | (pgprot_val(newprot) & mask); | 266 | pte_val(pte) = (pte_val(pte) & ~mask) | (pgprot_val(newprot) & mask); |
267 | return pte; | 267 | return pte; |
268 | } | 268 | } |
diff --git a/arch/ia64/mm/init.c b/arch/ia64/mm/init.c index acd5b68e8871..082e383c1b6f 100644 --- a/arch/ia64/mm/init.c +++ b/arch/ia64/mm/init.c | |||
@@ -637,7 +637,6 @@ mem_init (void) | |||
637 | 637 | ||
638 | high_memory = __va(max_low_pfn * PAGE_SIZE); | 638 | high_memory = __va(max_low_pfn * PAGE_SIZE); |
639 | 639 | ||
640 | reset_zone_present_pages(); | ||
641 | for_each_online_pgdat(pgdat) | 640 | for_each_online_pgdat(pgdat) |
642 | if (pgdat->bdata->node_bootmem_map) | 641 | if (pgdat->bdata->node_bootmem_map) |
643 | totalram_pages += free_all_bootmem_node(pgdat); | 642 | totalram_pages += free_all_bootmem_node(pgdat); |
diff --git a/arch/mips/cavium-octeon/executive/cvmx-l2c.c b/arch/mips/cavium-octeon/executive/cvmx-l2c.c index d38246e33ddb..9f883bf76953 100644 --- a/arch/mips/cavium-octeon/executive/cvmx-l2c.c +++ b/arch/mips/cavium-octeon/executive/cvmx-l2c.c | |||
@@ -30,6 +30,7 @@ | |||
30 | * measurement, and debugging facilities. | 30 | * measurement, and debugging facilities. |
31 | */ | 31 | */ |
32 | 32 | ||
33 | #include <linux/irqflags.h> | ||
33 | #include <asm/octeon/cvmx.h> | 34 | #include <asm/octeon/cvmx.h> |
34 | #include <asm/octeon/cvmx-l2c.h> | 35 | #include <asm/octeon/cvmx-l2c.h> |
35 | #include <asm/octeon/cvmx-spinlock.h> | 36 | #include <asm/octeon/cvmx-spinlock.h> |
diff --git a/arch/mips/fw/arc/misc.c b/arch/mips/fw/arc/misc.c index 7cf80ca2c1d2..f9f5307434c2 100644 --- a/arch/mips/fw/arc/misc.c +++ b/arch/mips/fw/arc/misc.c | |||
@@ -11,6 +11,7 @@ | |||
11 | */ | 11 | */ |
12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
13 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
14 | #include <linux/irqflags.h> | ||
14 | 15 | ||
15 | #include <asm/bcache.h> | 16 | #include <asm/bcache.h> |
16 | 17 | ||
diff --git a/arch/mips/include/asm/bitops.h b/arch/mips/include/asm/bitops.h index 82ad35ce2b45..46ac73abd5ee 100644 --- a/arch/mips/include/asm/bitops.h +++ b/arch/mips/include/asm/bitops.h | |||
@@ -14,7 +14,6 @@ | |||
14 | #endif | 14 | #endif |
15 | 15 | ||
16 | #include <linux/compiler.h> | 16 | #include <linux/compiler.h> |
17 | #include <linux/irqflags.h> | ||
18 | #include <linux/types.h> | 17 | #include <linux/types.h> |
19 | #include <asm/barrier.h> | 18 | #include <asm/barrier.h> |
20 | #include <asm/byteorder.h> /* sigh ... */ | 19 | #include <asm/byteorder.h> /* sigh ... */ |
@@ -44,6 +43,24 @@ | |||
44 | #define smp_mb__before_clear_bit() smp_mb__before_llsc() | 43 | #define smp_mb__before_clear_bit() smp_mb__before_llsc() |
45 | #define smp_mb__after_clear_bit() smp_llsc_mb() | 44 | #define smp_mb__after_clear_bit() smp_llsc_mb() |
46 | 45 | ||
46 | |||
47 | /* | ||
48 | * These are the "slower" versions of the functions and are in bitops.c. | ||
49 | * These functions call raw_local_irq_{save,restore}(). | ||
50 | */ | ||
51 | void __mips_set_bit(unsigned long nr, volatile unsigned long *addr); | ||
52 | void __mips_clear_bit(unsigned long nr, volatile unsigned long *addr); | ||
53 | void __mips_change_bit(unsigned long nr, volatile unsigned long *addr); | ||
54 | int __mips_test_and_set_bit(unsigned long nr, | ||
55 | volatile unsigned long *addr); | ||
56 | int __mips_test_and_set_bit_lock(unsigned long nr, | ||
57 | volatile unsigned long *addr); | ||
58 | int __mips_test_and_clear_bit(unsigned long nr, | ||
59 | volatile unsigned long *addr); | ||
60 | int __mips_test_and_change_bit(unsigned long nr, | ||
61 | volatile unsigned long *addr); | ||
62 | |||
63 | |||
47 | /* | 64 | /* |
48 | * set_bit - Atomically set a bit in memory | 65 | * set_bit - Atomically set a bit in memory |
49 | * @nr: the bit to set | 66 | * @nr: the bit to set |
@@ -57,7 +74,7 @@ | |||
57 | static inline void set_bit(unsigned long nr, volatile unsigned long *addr) | 74 | static inline void set_bit(unsigned long nr, volatile unsigned long *addr) |
58 | { | 75 | { |
59 | unsigned long *m = ((unsigned long *) addr) + (nr >> SZLONG_LOG); | 76 | unsigned long *m = ((unsigned long *) addr) + (nr >> SZLONG_LOG); |
60 | unsigned short bit = nr & SZLONG_MASK; | 77 | int bit = nr & SZLONG_MASK; |
61 | unsigned long temp; | 78 | unsigned long temp; |
62 | 79 | ||
63 | if (kernel_uses_llsc && R10000_LLSC_WAR) { | 80 | if (kernel_uses_llsc && R10000_LLSC_WAR) { |
@@ -92,17 +109,8 @@ static inline void set_bit(unsigned long nr, volatile unsigned long *addr) | |||
92 | : "=&r" (temp), "+m" (*m) | 109 | : "=&r" (temp), "+m" (*m) |
93 | : "ir" (1UL << bit)); | 110 | : "ir" (1UL << bit)); |
94 | } while (unlikely(!temp)); | 111 | } while (unlikely(!temp)); |
95 | } else { | 112 | } else |
96 | volatile unsigned long *a = addr; | 113 | __mips_set_bit(nr, addr); |
97 | unsigned long mask; | ||
98 | unsigned long flags; | ||
99 | |||
100 | a += nr >> SZLONG_LOG; | ||
101 | mask = 1UL << bit; | ||
102 | raw_local_irq_save(flags); | ||
103 | *a |= mask; | ||
104 | raw_local_irq_restore(flags); | ||
105 | } | ||
106 | } | 114 | } |
107 | 115 | ||
108 | /* | 116 | /* |
@@ -118,7 +126,7 @@ static inline void set_bit(unsigned long nr, volatile unsigned long *addr) | |||
118 | static inline void clear_bit(unsigned long nr, volatile unsigned long *addr) | 126 | static inline void clear_bit(unsigned long nr, volatile unsigned long *addr) |
119 | { | 127 | { |
120 | unsigned long *m = ((unsigned long *) addr) + (nr >> SZLONG_LOG); | 128 | unsigned long *m = ((unsigned long *) addr) + (nr >> SZLONG_LOG); |
121 | unsigned short bit = nr & SZLONG_MASK; | 129 | int bit = nr & SZLONG_MASK; |
122 | unsigned long temp; | 130 | unsigned long temp; |
123 | 131 | ||
124 | if (kernel_uses_llsc && R10000_LLSC_WAR) { | 132 | if (kernel_uses_llsc && R10000_LLSC_WAR) { |
@@ -153,17 +161,8 @@ static inline void clear_bit(unsigned long nr, volatile unsigned long *addr) | |||
153 | : "=&r" (temp), "+m" (*m) | 161 | : "=&r" (temp), "+m" (*m) |
154 | : "ir" (~(1UL << bit))); | 162 | : "ir" (~(1UL << bit))); |
155 | } while (unlikely(!temp)); | 163 | } while (unlikely(!temp)); |
156 | } else { | 164 | } else |
157 | volatile unsigned long *a = addr; | 165 | __mips_clear_bit(nr, addr); |
158 | unsigned long mask; | ||
159 | unsigned long flags; | ||
160 | |||
161 | a += nr >> SZLONG_LOG; | ||
162 | mask = 1UL << bit; | ||
163 | raw_local_irq_save(flags); | ||
164 | *a &= ~mask; | ||
165 | raw_local_irq_restore(flags); | ||
166 | } | ||
167 | } | 166 | } |
168 | 167 | ||
169 | /* | 168 | /* |
@@ -191,7 +190,7 @@ static inline void clear_bit_unlock(unsigned long nr, volatile unsigned long *ad | |||
191 | */ | 190 | */ |
192 | static inline void change_bit(unsigned long nr, volatile unsigned long *addr) | 191 | static inline void change_bit(unsigned long nr, volatile unsigned long *addr) |
193 | { | 192 | { |
194 | unsigned short bit = nr & SZLONG_MASK; | 193 | int bit = nr & SZLONG_MASK; |
195 | 194 | ||
196 | if (kernel_uses_llsc && R10000_LLSC_WAR) { | 195 | if (kernel_uses_llsc && R10000_LLSC_WAR) { |
197 | unsigned long *m = ((unsigned long *) addr) + (nr >> SZLONG_LOG); | 196 | unsigned long *m = ((unsigned long *) addr) + (nr >> SZLONG_LOG); |
@@ -220,17 +219,8 @@ static inline void change_bit(unsigned long nr, volatile unsigned long *addr) | |||
220 | : "=&r" (temp), "+m" (*m) | 219 | : "=&r" (temp), "+m" (*m) |
221 | : "ir" (1UL << bit)); | 220 | : "ir" (1UL << bit)); |
222 | } while (unlikely(!temp)); | 221 | } while (unlikely(!temp)); |
223 | } else { | 222 | } else |
224 | volatile unsigned long *a = addr; | 223 | __mips_change_bit(nr, addr); |
225 | unsigned long mask; | ||
226 | unsigned long flags; | ||
227 | |||
228 | a += nr >> SZLONG_LOG; | ||
229 | mask = 1UL << bit; | ||
230 | raw_local_irq_save(flags); | ||
231 | *a ^= mask; | ||
232 | raw_local_irq_restore(flags); | ||
233 | } | ||
234 | } | 224 | } |
235 | 225 | ||
236 | /* | 226 | /* |
@@ -244,7 +234,7 @@ static inline void change_bit(unsigned long nr, volatile unsigned long *addr) | |||
244 | static inline int test_and_set_bit(unsigned long nr, | 234 | static inline int test_and_set_bit(unsigned long nr, |
245 | volatile unsigned long *addr) | 235 | volatile unsigned long *addr) |
246 | { | 236 | { |
247 | unsigned short bit = nr & SZLONG_MASK; | 237 | int bit = nr & SZLONG_MASK; |
248 | unsigned long res; | 238 | unsigned long res; |
249 | 239 | ||
250 | smp_mb__before_llsc(); | 240 | smp_mb__before_llsc(); |
@@ -281,18 +271,8 @@ static inline int test_and_set_bit(unsigned long nr, | |||
281 | } while (unlikely(!res)); | 271 | } while (unlikely(!res)); |
282 | 272 | ||
283 | res = temp & (1UL << bit); | 273 | res = temp & (1UL << bit); |
284 | } else { | 274 | } else |
285 | volatile unsigned long *a = addr; | 275 | res = __mips_test_and_set_bit(nr, addr); |
286 | unsigned long mask; | ||
287 | unsigned long flags; | ||
288 | |||
289 | a += nr >> SZLONG_LOG; | ||
290 | mask = 1UL << bit; | ||
291 | raw_local_irq_save(flags); | ||
292 | res = (mask & *a); | ||
293 | *a |= mask; | ||
294 | raw_local_irq_restore(flags); | ||
295 | } | ||
296 | 276 | ||
297 | smp_llsc_mb(); | 277 | smp_llsc_mb(); |
298 | 278 | ||
@@ -310,7 +290,7 @@ static inline int test_and_set_bit(unsigned long nr, | |||
310 | static inline int test_and_set_bit_lock(unsigned long nr, | 290 | static inline int test_and_set_bit_lock(unsigned long nr, |
311 | volatile unsigned long *addr) | 291 | volatile unsigned long *addr) |
312 | { | 292 | { |
313 | unsigned short bit = nr & SZLONG_MASK; | 293 | int bit = nr & SZLONG_MASK; |
314 | unsigned long res; | 294 | unsigned long res; |
315 | 295 | ||
316 | if (kernel_uses_llsc && R10000_LLSC_WAR) { | 296 | if (kernel_uses_llsc && R10000_LLSC_WAR) { |
@@ -345,18 +325,8 @@ static inline int test_and_set_bit_lock(unsigned long nr, | |||
345 | } while (unlikely(!res)); | 325 | } while (unlikely(!res)); |
346 | 326 | ||
347 | res = temp & (1UL << bit); | 327 | res = temp & (1UL << bit); |
348 | } else { | 328 | } else |
349 | volatile unsigned long *a = addr; | 329 | res = __mips_test_and_set_bit_lock(nr, addr); |
350 | unsigned long mask; | ||
351 | unsigned long flags; | ||
352 | |||
353 | a += nr >> SZLONG_LOG; | ||
354 | mask = 1UL << bit; | ||
355 | raw_local_irq_save(flags); | ||
356 | res = (mask & *a); | ||
357 | *a |= mask; | ||
358 | raw_local_irq_restore(flags); | ||
359 | } | ||
360 | 330 | ||
361 | smp_llsc_mb(); | 331 | smp_llsc_mb(); |
362 | 332 | ||
@@ -373,7 +343,7 @@ static inline int test_and_set_bit_lock(unsigned long nr, | |||
373 | static inline int test_and_clear_bit(unsigned long nr, | 343 | static inline int test_and_clear_bit(unsigned long nr, |
374 | volatile unsigned long *addr) | 344 | volatile unsigned long *addr) |
375 | { | 345 | { |
376 | unsigned short bit = nr & SZLONG_MASK; | 346 | int bit = nr & SZLONG_MASK; |
377 | unsigned long res; | 347 | unsigned long res; |
378 | 348 | ||
379 | smp_mb__before_llsc(); | 349 | smp_mb__before_llsc(); |
@@ -428,18 +398,8 @@ static inline int test_and_clear_bit(unsigned long nr, | |||
428 | } while (unlikely(!res)); | 398 | } while (unlikely(!res)); |
429 | 399 | ||
430 | res = temp & (1UL << bit); | 400 | res = temp & (1UL << bit); |
431 | } else { | 401 | } else |
432 | volatile unsigned long *a = addr; | 402 | res = __mips_test_and_clear_bit(nr, addr); |
433 | unsigned long mask; | ||
434 | unsigned long flags; | ||
435 | |||
436 | a += nr >> SZLONG_LOG; | ||
437 | mask = 1UL << bit; | ||
438 | raw_local_irq_save(flags); | ||
439 | res = (mask & *a); | ||
440 | *a &= ~mask; | ||
441 | raw_local_irq_restore(flags); | ||
442 | } | ||
443 | 403 | ||
444 | smp_llsc_mb(); | 404 | smp_llsc_mb(); |
445 | 405 | ||
@@ -457,7 +417,7 @@ static inline int test_and_clear_bit(unsigned long nr, | |||
457 | static inline int test_and_change_bit(unsigned long nr, | 417 | static inline int test_and_change_bit(unsigned long nr, |
458 | volatile unsigned long *addr) | 418 | volatile unsigned long *addr) |
459 | { | 419 | { |
460 | unsigned short bit = nr & SZLONG_MASK; | 420 | int bit = nr & SZLONG_MASK; |
461 | unsigned long res; | 421 | unsigned long res; |
462 | 422 | ||
463 | smp_mb__before_llsc(); | 423 | smp_mb__before_llsc(); |
@@ -494,18 +454,8 @@ static inline int test_and_change_bit(unsigned long nr, | |||
494 | } while (unlikely(!res)); | 454 | } while (unlikely(!res)); |
495 | 455 | ||
496 | res = temp & (1UL << bit); | 456 | res = temp & (1UL << bit); |
497 | } else { | 457 | } else |
498 | volatile unsigned long *a = addr; | 458 | res = __mips_test_and_change_bit(nr, addr); |
499 | unsigned long mask; | ||
500 | unsigned long flags; | ||
501 | |||
502 | a += nr >> SZLONG_LOG; | ||
503 | mask = 1UL << bit; | ||
504 | raw_local_irq_save(flags); | ||
505 | res = (mask & *a); | ||
506 | *a ^= mask; | ||
507 | raw_local_irq_restore(flags); | ||
508 | } | ||
509 | 459 | ||
510 | smp_llsc_mb(); | 460 | smp_llsc_mb(); |
511 | 461 | ||
diff --git a/arch/mips/include/asm/compat.h b/arch/mips/include/asm/compat.h index 58277e0e9cd4..3c5d1464b7bd 100644 --- a/arch/mips/include/asm/compat.h +++ b/arch/mips/include/asm/compat.h | |||
@@ -290,7 +290,7 @@ struct compat_shmid64_ds { | |||
290 | 290 | ||
291 | static inline int is_compat_task(void) | 291 | static inline int is_compat_task(void) |
292 | { | 292 | { |
293 | return test_thread_flag(TIF_32BIT); | 293 | return test_thread_flag(TIF_32BIT_ADDR); |
294 | } | 294 | } |
295 | 295 | ||
296 | #endif /* _ASM_COMPAT_H */ | 296 | #endif /* _ASM_COMPAT_H */ |
diff --git a/arch/mips/include/asm/io.h b/arch/mips/include/asm/io.h index 29d9c23c20c7..ff2e0345e013 100644 --- a/arch/mips/include/asm/io.h +++ b/arch/mips/include/asm/io.h | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/compiler.h> | 15 | #include <linux/compiler.h> |
16 | #include <linux/kernel.h> | 16 | #include <linux/kernel.h> |
17 | #include <linux/types.h> | 17 | #include <linux/types.h> |
18 | #include <linux/irqflags.h> | ||
18 | 19 | ||
19 | #include <asm/addrspace.h> | 20 | #include <asm/addrspace.h> |
20 | #include <asm/bug.h> | 21 | #include <asm/bug.h> |
diff --git a/arch/mips/include/asm/irqflags.h b/arch/mips/include/asm/irqflags.h index 309cbcd6909c..9f3384c789d7 100644 --- a/arch/mips/include/asm/irqflags.h +++ b/arch/mips/include/asm/irqflags.h | |||
@@ -16,83 +16,13 @@ | |||
16 | #include <linux/compiler.h> | 16 | #include <linux/compiler.h> |
17 | #include <asm/hazards.h> | 17 | #include <asm/hazards.h> |
18 | 18 | ||
19 | __asm__( | 19 | #if defined(CONFIG_CPU_MIPSR2) && !defined(CONFIG_MIPS_MT_SMTC) |
20 | " .macro arch_local_irq_enable \n" | ||
21 | " .set push \n" | ||
22 | " .set reorder \n" | ||
23 | " .set noat \n" | ||
24 | #ifdef CONFIG_MIPS_MT_SMTC | ||
25 | " mfc0 $1, $2, 1 # SMTC - clear TCStatus.IXMT \n" | ||
26 | " ori $1, 0x400 \n" | ||
27 | " xori $1, 0x400 \n" | ||
28 | " mtc0 $1, $2, 1 \n" | ||
29 | #elif defined(CONFIG_CPU_MIPSR2) | ||
30 | " ei \n" | ||
31 | #else | ||
32 | " mfc0 $1,$12 \n" | ||
33 | " ori $1,0x1f \n" | ||
34 | " xori $1,0x1e \n" | ||
35 | " mtc0 $1,$12 \n" | ||
36 | #endif | ||
37 | " irq_enable_hazard \n" | ||
38 | " .set pop \n" | ||
39 | " .endm"); | ||
40 | 20 | ||
41 | extern void smtc_ipi_replay(void); | ||
42 | |||
43 | static inline void arch_local_irq_enable(void) | ||
44 | { | ||
45 | #ifdef CONFIG_MIPS_MT_SMTC | ||
46 | /* | ||
47 | * SMTC kernel needs to do a software replay of queued | ||
48 | * IPIs, at the cost of call overhead on each local_irq_enable() | ||
49 | */ | ||
50 | smtc_ipi_replay(); | ||
51 | #endif | ||
52 | __asm__ __volatile__( | ||
53 | "arch_local_irq_enable" | ||
54 | : /* no outputs */ | ||
55 | : /* no inputs */ | ||
56 | : "memory"); | ||
57 | } | ||
58 | |||
59 | |||
60 | /* | ||
61 | * For cli() we have to insert nops to make sure that the new value | ||
62 | * has actually arrived in the status register before the end of this | ||
63 | * macro. | ||
64 | * R4000/R4400 need three nops, the R4600 two nops and the R10000 needs | ||
65 | * no nops at all. | ||
66 | */ | ||
67 | /* | ||
68 | * For TX49, operating only IE bit is not enough. | ||
69 | * | ||
70 | * If mfc0 $12 follows store and the mfc0 is last instruction of a | ||
71 | * page and fetching the next instruction causes TLB miss, the result | ||
72 | * of the mfc0 might wrongly contain EXL bit. | ||
73 | * | ||
74 | * ERT-TX49H2-027, ERT-TX49H3-012, ERT-TX49HL3-006, ERT-TX49H4-008 | ||
75 | * | ||
76 | * Workaround: mask EXL bit of the result or place a nop before mfc0. | ||
77 | */ | ||
78 | __asm__( | 21 | __asm__( |
79 | " .macro arch_local_irq_disable\n" | 22 | " .macro arch_local_irq_disable\n" |
80 | " .set push \n" | 23 | " .set push \n" |
81 | " .set noat \n" | 24 | " .set noat \n" |
82 | #ifdef CONFIG_MIPS_MT_SMTC | ||
83 | " mfc0 $1, $2, 1 \n" | ||
84 | " ori $1, 0x400 \n" | ||
85 | " .set noreorder \n" | ||
86 | " mtc0 $1, $2, 1 \n" | ||
87 | #elif defined(CONFIG_CPU_MIPSR2) | ||
88 | " di \n" | 25 | " di \n" |
89 | #else | ||
90 | " mfc0 $1,$12 \n" | ||
91 | " ori $1,0x1f \n" | ||
92 | " xori $1,0x1f \n" | ||
93 | " .set noreorder \n" | ||
94 | " mtc0 $1,$12 \n" | ||
95 | #endif | ||
96 | " irq_disable_hazard \n" | 26 | " irq_disable_hazard \n" |
97 | " .set pop \n" | 27 | " .set pop \n" |
98 | " .endm \n"); | 28 | " .endm \n"); |
@@ -106,46 +36,14 @@ static inline void arch_local_irq_disable(void) | |||
106 | : "memory"); | 36 | : "memory"); |
107 | } | 37 | } |
108 | 38 | ||
109 | __asm__( | ||
110 | " .macro arch_local_save_flags flags \n" | ||
111 | " .set push \n" | ||
112 | " .set reorder \n" | ||
113 | #ifdef CONFIG_MIPS_MT_SMTC | ||
114 | " mfc0 \\flags, $2, 1 \n" | ||
115 | #else | ||
116 | " mfc0 \\flags, $12 \n" | ||
117 | #endif | ||
118 | " .set pop \n" | ||
119 | " .endm \n"); | ||
120 | |||
121 | static inline unsigned long arch_local_save_flags(void) | ||
122 | { | ||
123 | unsigned long flags; | ||
124 | asm volatile("arch_local_save_flags %0" : "=r" (flags)); | ||
125 | return flags; | ||
126 | } | ||
127 | 39 | ||
128 | __asm__( | 40 | __asm__( |
129 | " .macro arch_local_irq_save result \n" | 41 | " .macro arch_local_irq_save result \n" |
130 | " .set push \n" | 42 | " .set push \n" |
131 | " .set reorder \n" | 43 | " .set reorder \n" |
132 | " .set noat \n" | 44 | " .set noat \n" |
133 | #ifdef CONFIG_MIPS_MT_SMTC | ||
134 | " mfc0 \\result, $2, 1 \n" | ||
135 | " ori $1, \\result, 0x400 \n" | ||
136 | " .set noreorder \n" | ||
137 | " mtc0 $1, $2, 1 \n" | ||
138 | " andi \\result, \\result, 0x400 \n" | ||
139 | #elif defined(CONFIG_CPU_MIPSR2) | ||
140 | " di \\result \n" | 45 | " di \\result \n" |
141 | " andi \\result, 1 \n" | 46 | " andi \\result, 1 \n" |
142 | #else | ||
143 | " mfc0 \\result, $12 \n" | ||
144 | " ori $1, \\result, 0x1f \n" | ||
145 | " xori $1, 0x1f \n" | ||
146 | " .set noreorder \n" | ||
147 | " mtc0 $1, $12 \n" | ||
148 | #endif | ||
149 | " irq_disable_hazard \n" | 47 | " irq_disable_hazard \n" |
150 | " .set pop \n" | 48 | " .set pop \n" |
151 | " .endm \n"); | 49 | " .endm \n"); |
@@ -160,61 +58,37 @@ static inline unsigned long arch_local_irq_save(void) | |||
160 | return flags; | 58 | return flags; |
161 | } | 59 | } |
162 | 60 | ||
61 | |||
163 | __asm__( | 62 | __asm__( |
164 | " .macro arch_local_irq_restore flags \n" | 63 | " .macro arch_local_irq_restore flags \n" |
165 | " .set push \n" | 64 | " .set push \n" |
166 | " .set noreorder \n" | 65 | " .set noreorder \n" |
167 | " .set noat \n" | 66 | " .set noat \n" |
168 | #ifdef CONFIG_MIPS_MT_SMTC | 67 | #if defined(CONFIG_IRQ_CPU) |
169 | "mfc0 $1, $2, 1 \n" | ||
170 | "andi \\flags, 0x400 \n" | ||
171 | "ori $1, 0x400 \n" | ||
172 | "xori $1, 0x400 \n" | ||
173 | "or \\flags, $1 \n" | ||
174 | "mtc0 \\flags, $2, 1 \n" | ||
175 | #elif defined(CONFIG_CPU_MIPSR2) && defined(CONFIG_IRQ_CPU) | ||
176 | /* | 68 | /* |
177 | * Slow, but doesn't suffer from a relatively unlikely race | 69 | * Slow, but doesn't suffer from a relatively unlikely race |
178 | * condition we're having since days 1. | 70 | * condition we're having since days 1. |
179 | */ | 71 | */ |
180 | " beqz \\flags, 1f \n" | 72 | " beqz \\flags, 1f \n" |
181 | " di \n" | 73 | " di \n" |
182 | " ei \n" | 74 | " ei \n" |
183 | "1: \n" | 75 | "1: \n" |
184 | #elif defined(CONFIG_CPU_MIPSR2) | 76 | #else |
185 | /* | 77 | /* |
186 | * Fast, dangerous. Life is fun, life is good. | 78 | * Fast, dangerous. Life is fun, life is good. |
187 | */ | 79 | */ |
188 | " mfc0 $1, $12 \n" | 80 | " mfc0 $1, $12 \n" |
189 | " ins $1, \\flags, 0, 1 \n" | 81 | " ins $1, \\flags, 0, 1 \n" |
190 | " mtc0 $1, $12 \n" | 82 | " mtc0 $1, $12 \n" |
191 | #else | ||
192 | " mfc0 $1, $12 \n" | ||
193 | " andi \\flags, 1 \n" | ||
194 | " ori $1, 0x1f \n" | ||
195 | " xori $1, 0x1f \n" | ||
196 | " or \\flags, $1 \n" | ||
197 | " mtc0 \\flags, $12 \n" | ||
198 | #endif | 83 | #endif |
199 | " irq_disable_hazard \n" | 84 | " irq_disable_hazard \n" |
200 | " .set pop \n" | 85 | " .set pop \n" |
201 | " .endm \n"); | 86 | " .endm \n"); |
202 | 87 | ||
203 | |||
204 | static inline void arch_local_irq_restore(unsigned long flags) | 88 | static inline void arch_local_irq_restore(unsigned long flags) |
205 | { | 89 | { |
206 | unsigned long __tmp1; | 90 | unsigned long __tmp1; |
207 | 91 | ||
208 | #ifdef CONFIG_MIPS_MT_SMTC | ||
209 | /* | ||
210 | * SMTC kernel needs to do a software replay of queued | ||
211 | * IPIs, at the cost of branch and call overhead on each | ||
212 | * local_irq_restore() | ||
213 | */ | ||
214 | if (unlikely(!(flags & 0x0400))) | ||
215 | smtc_ipi_replay(); | ||
216 | #endif | ||
217 | |||
218 | __asm__ __volatile__( | 92 | __asm__ __volatile__( |
219 | "arch_local_irq_restore\t%0" | 93 | "arch_local_irq_restore\t%0" |
220 | : "=r" (__tmp1) | 94 | : "=r" (__tmp1) |
@@ -232,6 +106,75 @@ static inline void __arch_local_irq_restore(unsigned long flags) | |||
232 | : "0" (flags) | 106 | : "0" (flags) |
233 | : "memory"); | 107 | : "memory"); |
234 | } | 108 | } |
109 | #else | ||
110 | /* Functions that require preempt_{dis,en}able() are in mips-atomic.c */ | ||
111 | void arch_local_irq_disable(void); | ||
112 | unsigned long arch_local_irq_save(void); | ||
113 | void arch_local_irq_restore(unsigned long flags); | ||
114 | void __arch_local_irq_restore(unsigned long flags); | ||
115 | #endif /* if defined(CONFIG_CPU_MIPSR2) && !defined(CONFIG_MIPS_MT_SMTC) */ | ||
116 | |||
117 | |||
118 | __asm__( | ||
119 | " .macro arch_local_irq_enable \n" | ||
120 | " .set push \n" | ||
121 | " .set reorder \n" | ||
122 | " .set noat \n" | ||
123 | #ifdef CONFIG_MIPS_MT_SMTC | ||
124 | " mfc0 $1, $2, 1 # SMTC - clear TCStatus.IXMT \n" | ||
125 | " ori $1, 0x400 \n" | ||
126 | " xori $1, 0x400 \n" | ||
127 | " mtc0 $1, $2, 1 \n" | ||
128 | #elif defined(CONFIG_CPU_MIPSR2) | ||
129 | " ei \n" | ||
130 | #else | ||
131 | " mfc0 $1,$12 \n" | ||
132 | " ori $1,0x1f \n" | ||
133 | " xori $1,0x1e \n" | ||
134 | " mtc0 $1,$12 \n" | ||
135 | #endif | ||
136 | " irq_enable_hazard \n" | ||
137 | " .set pop \n" | ||
138 | " .endm"); | ||
139 | |||
140 | extern void smtc_ipi_replay(void); | ||
141 | |||
142 | static inline void arch_local_irq_enable(void) | ||
143 | { | ||
144 | #ifdef CONFIG_MIPS_MT_SMTC | ||
145 | /* | ||
146 | * SMTC kernel needs to do a software replay of queued | ||
147 | * IPIs, at the cost of call overhead on each local_irq_enable() | ||
148 | */ | ||
149 | smtc_ipi_replay(); | ||
150 | #endif | ||
151 | __asm__ __volatile__( | ||
152 | "arch_local_irq_enable" | ||
153 | : /* no outputs */ | ||
154 | : /* no inputs */ | ||
155 | : "memory"); | ||
156 | } | ||
157 | |||
158 | |||
159 | __asm__( | ||
160 | " .macro arch_local_save_flags flags \n" | ||
161 | " .set push \n" | ||
162 | " .set reorder \n" | ||
163 | #ifdef CONFIG_MIPS_MT_SMTC | ||
164 | " mfc0 \\flags, $2, 1 \n" | ||
165 | #else | ||
166 | " mfc0 \\flags, $12 \n" | ||
167 | #endif | ||
168 | " .set pop \n" | ||
169 | " .endm \n"); | ||
170 | |||
171 | static inline unsigned long arch_local_save_flags(void) | ||
172 | { | ||
173 | unsigned long flags; | ||
174 | asm volatile("arch_local_save_flags %0" : "=r" (flags)); | ||
175 | return flags; | ||
176 | } | ||
177 | |||
235 | 178 | ||
236 | static inline int arch_irqs_disabled_flags(unsigned long flags) | 179 | static inline int arch_irqs_disabled_flags(unsigned long flags) |
237 | { | 180 | { |
@@ -245,7 +188,7 @@ static inline int arch_irqs_disabled_flags(unsigned long flags) | |||
245 | #endif | 188 | #endif |
246 | } | 189 | } |
247 | 190 | ||
248 | #endif | 191 | #endif /* #ifndef __ASSEMBLY__ */ |
249 | 192 | ||
250 | /* | 193 | /* |
251 | * Do the CPU's IRQ-state tracing from assembly code. | 194 | * Do the CPU's IRQ-state tracing from assembly code. |
diff --git a/arch/mips/include/asm/thread_info.h b/arch/mips/include/asm/thread_info.h index 8debe9e91754..18806a52061c 100644 --- a/arch/mips/include/asm/thread_info.h +++ b/arch/mips/include/asm/thread_info.h | |||
@@ -112,12 +112,6 @@ register struct thread_info *__current_thread_info __asm__("$28"); | |||
112 | #define TIF_LOAD_WATCH 25 /* If set, load watch registers */ | 112 | #define TIF_LOAD_WATCH 25 /* If set, load watch registers */ |
113 | #define TIF_SYSCALL_TRACE 31 /* syscall trace active */ | 113 | #define TIF_SYSCALL_TRACE 31 /* syscall trace active */ |
114 | 114 | ||
115 | #ifdef CONFIG_MIPS32_O32 | ||
116 | #define TIF_32BIT TIF_32BIT_REGS | ||
117 | #elif defined(CONFIG_MIPS32_N32) | ||
118 | #define TIF_32BIT _TIF_32BIT_ADDR | ||
119 | #endif /* CONFIG_MIPS32_O32 */ | ||
120 | |||
121 | #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) | 115 | #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) |
122 | #define _TIF_SIGPENDING (1<<TIF_SIGPENDING) | 116 | #define _TIF_SIGPENDING (1<<TIF_SIGPENDING) |
123 | #define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED) | 117 | #define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED) |
diff --git a/arch/mips/lib/Makefile b/arch/mips/lib/Makefile index c4a82e841c73..eeddc58802e1 100644 --- a/arch/mips/lib/Makefile +++ b/arch/mips/lib/Makefile | |||
@@ -2,8 +2,9 @@ | |||
2 | # Makefile for MIPS-specific library files.. | 2 | # Makefile for MIPS-specific library files.. |
3 | # | 3 | # |
4 | 4 | ||
5 | lib-y += csum_partial.o delay.o memcpy.o memset.o \ | 5 | lib-y += bitops.o csum_partial.o delay.o memcpy.o memset.o \ |
6 | strlen_user.o strncpy_user.o strnlen_user.o uncached.o | 6 | mips-atomic.o strlen_user.o strncpy_user.o \ |
7 | strnlen_user.o uncached.o | ||
7 | 8 | ||
8 | obj-y += iomap.o | 9 | obj-y += iomap.o |
9 | obj-$(CONFIG_PCI) += iomap-pci.o | 10 | obj-$(CONFIG_PCI) += iomap-pci.o |
diff --git a/arch/mips/lib/bitops.c b/arch/mips/lib/bitops.c new file mode 100644 index 000000000000..239a9c957b02 --- /dev/null +++ b/arch/mips/lib/bitops.c | |||
@@ -0,0 +1,179 @@ | |||
1 | /* | ||
2 | * This file is subject to the terms and conditions of the GNU General Public | ||
3 | * License. See the file "COPYING" in the main directory of this archive | ||
4 | * for more details. | ||
5 | * | ||
6 | * Copyright (c) 1994-1997, 99, 2000, 06, 07 Ralf Baechle (ralf@linux-mips.org) | ||
7 | * Copyright (c) 1999, 2000 Silicon Graphics, Inc. | ||
8 | */ | ||
9 | #include <linux/bitops.h> | ||
10 | #include <linux/irqflags.h> | ||
11 | #include <linux/export.h> | ||
12 | |||
13 | |||
14 | /** | ||
15 | * __mips_set_bit - Atomically set a bit in memory. This is called by | ||
16 | * set_bit() if it cannot find a faster solution. | ||
17 | * @nr: the bit to set | ||
18 | * @addr: the address to start counting from | ||
19 | */ | ||
20 | void __mips_set_bit(unsigned long nr, volatile unsigned long *addr) | ||
21 | { | ||
22 | volatile unsigned long *a = addr; | ||
23 | unsigned bit = nr & SZLONG_MASK; | ||
24 | unsigned long mask; | ||
25 | unsigned long flags; | ||
26 | |||
27 | a += nr >> SZLONG_LOG; | ||
28 | mask = 1UL << bit; | ||
29 | raw_local_irq_save(flags); | ||
30 | *a |= mask; | ||
31 | raw_local_irq_restore(flags); | ||
32 | } | ||
33 | EXPORT_SYMBOL(__mips_set_bit); | ||
34 | |||
35 | |||
36 | /** | ||
37 | * __mips_clear_bit - Clears a bit in memory. This is called by clear_bit() if | ||
38 | * it cannot find a faster solution. | ||
39 | * @nr: Bit to clear | ||
40 | * @addr: Address to start counting from | ||
41 | */ | ||
42 | void __mips_clear_bit(unsigned long nr, volatile unsigned long *addr) | ||
43 | { | ||
44 | volatile unsigned long *a = addr; | ||
45 | unsigned bit = nr & SZLONG_MASK; | ||
46 | unsigned long mask; | ||
47 | unsigned long flags; | ||
48 | |||
49 | a += nr >> SZLONG_LOG; | ||
50 | mask = 1UL << bit; | ||
51 | raw_local_irq_save(flags); | ||
52 | *a &= ~mask; | ||
53 | raw_local_irq_restore(flags); | ||
54 | } | ||
55 | EXPORT_SYMBOL(__mips_clear_bit); | ||
56 | |||
57 | |||
58 | /** | ||
59 | * __mips_change_bit - Toggle a bit in memory. This is called by change_bit() | ||
60 | * if it cannot find a faster solution. | ||
61 | * @nr: Bit to change | ||
62 | * @addr: Address to start counting from | ||
63 | */ | ||
64 | void __mips_change_bit(unsigned long nr, volatile unsigned long *addr) | ||
65 | { | ||
66 | volatile unsigned long *a = addr; | ||
67 | unsigned bit = nr & SZLONG_MASK; | ||
68 | unsigned long mask; | ||
69 | unsigned long flags; | ||
70 | |||
71 | a += nr >> SZLONG_LOG; | ||
72 | mask = 1UL << bit; | ||
73 | raw_local_irq_save(flags); | ||
74 | *a ^= mask; | ||
75 | raw_local_irq_restore(flags); | ||
76 | } | ||
77 | EXPORT_SYMBOL(__mips_change_bit); | ||
78 | |||
79 | |||
80 | /** | ||
81 | * __mips_test_and_set_bit - Set a bit and return its old value. This is | ||
82 | * called by test_and_set_bit() if it cannot find a faster solution. | ||
83 | * @nr: Bit to set | ||
84 | * @addr: Address to count from | ||
85 | */ | ||
86 | int __mips_test_and_set_bit(unsigned long nr, | ||
87 | volatile unsigned long *addr) | ||
88 | { | ||
89 | volatile unsigned long *a = addr; | ||
90 | unsigned bit = nr & SZLONG_MASK; | ||
91 | unsigned long mask; | ||
92 | unsigned long flags; | ||
93 | unsigned long res; | ||
94 | |||
95 | a += nr >> SZLONG_LOG; | ||
96 | mask = 1UL << bit; | ||
97 | raw_local_irq_save(flags); | ||
98 | res = (mask & *a); | ||
99 | *a |= mask; | ||
100 | raw_local_irq_restore(flags); | ||
101 | return res; | ||
102 | } | ||
103 | EXPORT_SYMBOL(__mips_test_and_set_bit); | ||
104 | |||
105 | |||
106 | /** | ||
107 | * __mips_test_and_set_bit_lock - Set a bit and return its old value. This is | ||
108 | * called by test_and_set_bit_lock() if it cannot find a faster solution. | ||
109 | * @nr: Bit to set | ||
110 | * @addr: Address to count from | ||
111 | */ | ||
112 | int __mips_test_and_set_bit_lock(unsigned long nr, | ||
113 | volatile unsigned long *addr) | ||
114 | { | ||
115 | volatile unsigned long *a = addr; | ||
116 | unsigned bit = nr & SZLONG_MASK; | ||
117 | unsigned long mask; | ||
118 | unsigned long flags; | ||
119 | unsigned long res; | ||
120 | |||
121 | a += nr >> SZLONG_LOG; | ||
122 | mask = 1UL << bit; | ||
123 | raw_local_irq_save(flags); | ||
124 | res = (mask & *a); | ||
125 | *a |= mask; | ||
126 | raw_local_irq_restore(flags); | ||
127 | return res; | ||
128 | } | ||
129 | EXPORT_SYMBOL(__mips_test_and_set_bit_lock); | ||
130 | |||
131 | |||
132 | /** | ||
133 | * __mips_test_and_clear_bit - Clear a bit and return its old value. This is | ||
134 | * called by test_and_clear_bit() if it cannot find a faster solution. | ||
135 | * @nr: Bit to clear | ||
136 | * @addr: Address to count from | ||
137 | */ | ||
138 | int __mips_test_and_clear_bit(unsigned long nr, volatile unsigned long *addr) | ||
139 | { | ||
140 | volatile unsigned long *a = addr; | ||
141 | unsigned bit = nr & SZLONG_MASK; | ||
142 | unsigned long mask; | ||
143 | unsigned long flags; | ||
144 | unsigned long res; | ||
145 | |||
146 | a += nr >> SZLONG_LOG; | ||
147 | mask = 1UL << bit; | ||
148 | raw_local_irq_save(flags); | ||
149 | res = (mask & *a); | ||
150 | *a &= ~mask; | ||
151 | raw_local_irq_restore(flags); | ||
152 | return res; | ||
153 | } | ||
154 | EXPORT_SYMBOL(__mips_test_and_clear_bit); | ||
155 | |||
156 | |||
157 | /** | ||
158 | * __mips_test_and_change_bit - Change a bit and return its old value. This is | ||
159 | * called by test_and_change_bit() if it cannot find a faster solution. | ||
160 | * @nr: Bit to change | ||
161 | * @addr: Address to count from | ||
162 | */ | ||
163 | int __mips_test_and_change_bit(unsigned long nr, volatile unsigned long *addr) | ||
164 | { | ||
165 | volatile unsigned long *a = addr; | ||
166 | unsigned bit = nr & SZLONG_MASK; | ||
167 | unsigned long mask; | ||
168 | unsigned long flags; | ||
169 | unsigned long res; | ||
170 | |||
171 | a += nr >> SZLONG_LOG; | ||
172 | mask = 1UL << bit; | ||
173 | raw_local_irq_save(flags); | ||
174 | res = (mask & *a); | ||
175 | *a ^= mask; | ||
176 | raw_local_irq_restore(flags); | ||
177 | return res; | ||
178 | } | ||
179 | EXPORT_SYMBOL(__mips_test_and_change_bit); | ||
diff --git a/arch/mips/lib/mips-atomic.c b/arch/mips/lib/mips-atomic.c new file mode 100644 index 000000000000..e091430dbeb1 --- /dev/null +++ b/arch/mips/lib/mips-atomic.c | |||
@@ -0,0 +1,176 @@ | |||
1 | /* | ||
2 | * This file is subject to the terms and conditions of the GNU General Public | ||
3 | * License. See the file "COPYING" in the main directory of this archive | ||
4 | * for more details. | ||
5 | * | ||
6 | * Copyright (C) 1994, 95, 96, 97, 98, 99, 2003 by Ralf Baechle | ||
7 | * Copyright (C) 1996 by Paul M. Antoine | ||
8 | * Copyright (C) 1999 Silicon Graphics | ||
9 | * Copyright (C) 2000 MIPS Technologies, Inc. | ||
10 | */ | ||
11 | #include <asm/irqflags.h> | ||
12 | #include <asm/hazards.h> | ||
13 | #include <linux/compiler.h> | ||
14 | #include <linux/preempt.h> | ||
15 | #include <linux/export.h> | ||
16 | |||
17 | #if !defined(CONFIG_CPU_MIPSR2) || defined(CONFIG_MIPS_MT_SMTC) | ||
18 | |||
19 | /* | ||
20 | * For cli() we have to insert nops to make sure that the new value | ||
21 | * has actually arrived in the status register before the end of this | ||
22 | * macro. | ||
23 | * R4000/R4400 need three nops, the R4600 two nops and the R10000 needs | ||
24 | * no nops at all. | ||
25 | */ | ||
26 | /* | ||
27 | * For TX49, operating only IE bit is not enough. | ||
28 | * | ||
29 | * If mfc0 $12 follows store and the mfc0 is last instruction of a | ||
30 | * page and fetching the next instruction causes TLB miss, the result | ||
31 | * of the mfc0 might wrongly contain EXL bit. | ||
32 | * | ||
33 | * ERT-TX49H2-027, ERT-TX49H3-012, ERT-TX49HL3-006, ERT-TX49H4-008 | ||
34 | * | ||
35 | * Workaround: mask EXL bit of the result or place a nop before mfc0. | ||
36 | */ | ||
37 | __asm__( | ||
38 | " .macro arch_local_irq_disable\n" | ||
39 | " .set push \n" | ||
40 | " .set noat \n" | ||
41 | #ifdef CONFIG_MIPS_MT_SMTC | ||
42 | " mfc0 $1, $2, 1 \n" | ||
43 | " ori $1, 0x400 \n" | ||
44 | " .set noreorder \n" | ||
45 | " mtc0 $1, $2, 1 \n" | ||
46 | #elif defined(CONFIG_CPU_MIPSR2) | ||
47 | /* see irqflags.h for inline function */ | ||
48 | #else | ||
49 | " mfc0 $1,$12 \n" | ||
50 | " ori $1,0x1f \n" | ||
51 | " xori $1,0x1f \n" | ||
52 | " .set noreorder \n" | ||
53 | " mtc0 $1,$12 \n" | ||
54 | #endif | ||
55 | " irq_disable_hazard \n" | ||
56 | " .set pop \n" | ||
57 | " .endm \n"); | ||
58 | |||
59 | void arch_local_irq_disable(void) | ||
60 | { | ||
61 | preempt_disable(); | ||
62 | __asm__ __volatile__( | ||
63 | "arch_local_irq_disable" | ||
64 | : /* no outputs */ | ||
65 | : /* no inputs */ | ||
66 | : "memory"); | ||
67 | preempt_enable(); | ||
68 | } | ||
69 | EXPORT_SYMBOL(arch_local_irq_disable); | ||
70 | |||
71 | |||
72 | __asm__( | ||
73 | " .macro arch_local_irq_save result \n" | ||
74 | " .set push \n" | ||
75 | " .set reorder \n" | ||
76 | " .set noat \n" | ||
77 | #ifdef CONFIG_MIPS_MT_SMTC | ||
78 | " mfc0 \\result, $2, 1 \n" | ||
79 | " ori $1, \\result, 0x400 \n" | ||
80 | " .set noreorder \n" | ||
81 | " mtc0 $1, $2, 1 \n" | ||
82 | " andi \\result, \\result, 0x400 \n" | ||
83 | #elif defined(CONFIG_CPU_MIPSR2) | ||
84 | /* see irqflags.h for inline function */ | ||
85 | #else | ||
86 | " mfc0 \\result, $12 \n" | ||
87 | " ori $1, \\result, 0x1f \n" | ||
88 | " xori $1, 0x1f \n" | ||
89 | " .set noreorder \n" | ||
90 | " mtc0 $1, $12 \n" | ||
91 | #endif | ||
92 | " irq_disable_hazard \n" | ||
93 | " .set pop \n" | ||
94 | " .endm \n"); | ||
95 | |||
96 | unsigned long arch_local_irq_save(void) | ||
97 | { | ||
98 | unsigned long flags; | ||
99 | preempt_disable(); | ||
100 | asm volatile("arch_local_irq_save\t%0" | ||
101 | : "=r" (flags) | ||
102 | : /* no inputs */ | ||
103 | : "memory"); | ||
104 | preempt_enable(); | ||
105 | return flags; | ||
106 | } | ||
107 | EXPORT_SYMBOL(arch_local_irq_save); | ||
108 | |||
109 | |||
110 | __asm__( | ||
111 | " .macro arch_local_irq_restore flags \n" | ||
112 | " .set push \n" | ||
113 | " .set noreorder \n" | ||
114 | " .set noat \n" | ||
115 | #ifdef CONFIG_MIPS_MT_SMTC | ||
116 | "mfc0 $1, $2, 1 \n" | ||
117 | "andi \\flags, 0x400 \n" | ||
118 | "ori $1, 0x400 \n" | ||
119 | "xori $1, 0x400 \n" | ||
120 | "or \\flags, $1 \n" | ||
121 | "mtc0 \\flags, $2, 1 \n" | ||
122 | #elif defined(CONFIG_CPU_MIPSR2) && defined(CONFIG_IRQ_CPU) | ||
123 | /* see irqflags.h for inline function */ | ||
124 | #elif defined(CONFIG_CPU_MIPSR2) | ||
125 | /* see irqflags.h for inline function */ | ||
126 | #else | ||
127 | " mfc0 $1, $12 \n" | ||
128 | " andi \\flags, 1 \n" | ||
129 | " ori $1, 0x1f \n" | ||
130 | " xori $1, 0x1f \n" | ||
131 | " or \\flags, $1 \n" | ||
132 | " mtc0 \\flags, $12 \n" | ||
133 | #endif | ||
134 | " irq_disable_hazard \n" | ||
135 | " .set pop \n" | ||
136 | " .endm \n"); | ||
137 | |||
138 | void arch_local_irq_restore(unsigned long flags) | ||
139 | { | ||
140 | unsigned long __tmp1; | ||
141 | |||
142 | #ifdef CONFIG_MIPS_MT_SMTC | ||
143 | /* | ||
144 | * SMTC kernel needs to do a software replay of queued | ||
145 | * IPIs, at the cost of branch and call overhead on each | ||
146 | * local_irq_restore() | ||
147 | */ | ||
148 | if (unlikely(!(flags & 0x0400))) | ||
149 | smtc_ipi_replay(); | ||
150 | #endif | ||
151 | preempt_disable(); | ||
152 | __asm__ __volatile__( | ||
153 | "arch_local_irq_restore\t%0" | ||
154 | : "=r" (__tmp1) | ||
155 | : "0" (flags) | ||
156 | : "memory"); | ||
157 | preempt_enable(); | ||
158 | } | ||
159 | EXPORT_SYMBOL(arch_local_irq_restore); | ||
160 | |||
161 | |||
162 | void __arch_local_irq_restore(unsigned long flags) | ||
163 | { | ||
164 | unsigned long __tmp1; | ||
165 | |||
166 | preempt_disable(); | ||
167 | __asm__ __volatile__( | ||
168 | "arch_local_irq_restore\t%0" | ||
169 | : "=r" (__tmp1) | ||
170 | : "0" (flags) | ||
171 | : "memory"); | ||
172 | preempt_enable(); | ||
173 | } | ||
174 | EXPORT_SYMBOL(__arch_local_irq_restore); | ||
175 | |||
176 | #endif /* !defined(CONFIG_CPU_MIPSR2) || defined(CONFIG_MIPS_MT_SMTC) */ | ||
diff --git a/arch/mips/mti-malta/malta-platform.c b/arch/mips/mti-malta/malta-platform.c index 80562b81f0f2..74732177851c 100644 --- a/arch/mips/mti-malta/malta-platform.c +++ b/arch/mips/mti-malta/malta-platform.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <linux/mtd/partitions.h> | 29 | #include <linux/mtd/partitions.h> |
30 | #include <linux/mtd/physmap.h> | 30 | #include <linux/mtd/physmap.h> |
31 | #include <linux/platform_device.h> | 31 | #include <linux/platform_device.h> |
32 | #include <asm/mips-boards/maltaint.h> | ||
32 | #include <mtd/mtd-abi.h> | 33 | #include <mtd/mtd-abi.h> |
33 | 34 | ||
34 | #define SMC_PORT(base, int) \ | 35 | #define SMC_PORT(base, int) \ |
@@ -48,7 +49,7 @@ static struct plat_serial8250_port uart8250_data[] = { | |||
48 | SMC_PORT(0x2F8, 3), | 49 | SMC_PORT(0x2F8, 3), |
49 | { | 50 | { |
50 | .mapbase = 0x1f000900, /* The CBUS UART */ | 51 | .mapbase = 0x1f000900, /* The CBUS UART */ |
51 | .irq = MIPS_CPU_IRQ_BASE + 2, | 52 | .irq = MIPS_CPU_IRQ_BASE + MIPSCPU_INT_MB2, |
52 | .uartclk = 3686400, /* Twice the usual clk! */ | 53 | .uartclk = 3686400, /* Twice the usual clk! */ |
53 | .iotype = UPIO_MEM32, | 54 | .iotype = UPIO_MEM32, |
54 | .flags = CBUS_UART_FLAGS, | 55 | .flags = CBUS_UART_FLAGS, |
diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index 5dba755a43e6..d385f396dfee 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig | |||
@@ -96,6 +96,7 @@ config S390 | |||
96 | select HAVE_MEMBLOCK_NODE_MAP | 96 | select HAVE_MEMBLOCK_NODE_MAP |
97 | select HAVE_CMPXCHG_LOCAL | 97 | select HAVE_CMPXCHG_LOCAL |
98 | select HAVE_CMPXCHG_DOUBLE | 98 | select HAVE_CMPXCHG_DOUBLE |
99 | select HAVE_ALIGNED_STRUCT_PAGE if SLUB | ||
99 | select HAVE_VIRT_CPU_ACCOUNTING | 100 | select HAVE_VIRT_CPU_ACCOUNTING |
100 | select VIRT_CPU_ACCOUNTING | 101 | select VIRT_CPU_ACCOUNTING |
101 | select ARCH_DISCARD_MEMBLOCK | 102 | select ARCH_DISCARD_MEMBLOCK |
diff --git a/arch/s390/include/asm/compat.h b/arch/s390/include/asm/compat.h index a34a9d612fc0..18cd6b592650 100644 --- a/arch/s390/include/asm/compat.h +++ b/arch/s390/include/asm/compat.h | |||
@@ -20,7 +20,7 @@ | |||
20 | #define PSW32_MASK_CC 0x00003000UL | 20 | #define PSW32_MASK_CC 0x00003000UL |
21 | #define PSW32_MASK_PM 0x00000f00UL | 21 | #define PSW32_MASK_PM 0x00000f00UL |
22 | 22 | ||
23 | #define PSW32_MASK_USER 0x00003F00UL | 23 | #define PSW32_MASK_USER 0x0000FF00UL |
24 | 24 | ||
25 | #define PSW32_ADDR_AMODE 0x80000000UL | 25 | #define PSW32_ADDR_AMODE 0x80000000UL |
26 | #define PSW32_ADDR_INSN 0x7FFFFFFFUL | 26 | #define PSW32_ADDR_INSN 0x7FFFFFFFUL |
diff --git a/arch/s390/include/asm/topology.h b/arch/s390/include/asm/topology.h index 9ca305383760..9935cbd6a46f 100644 --- a/arch/s390/include/asm/topology.h +++ b/arch/s390/include/asm/topology.h | |||
@@ -8,6 +8,9 @@ struct cpu; | |||
8 | 8 | ||
9 | #ifdef CONFIG_SCHED_BOOK | 9 | #ifdef CONFIG_SCHED_BOOK |
10 | 10 | ||
11 | extern unsigned char cpu_socket_id[NR_CPUS]; | ||
12 | #define topology_physical_package_id(cpu) (cpu_socket_id[cpu]) | ||
13 | |||
11 | extern unsigned char cpu_core_id[NR_CPUS]; | 14 | extern unsigned char cpu_core_id[NR_CPUS]; |
12 | extern cpumask_t cpu_core_map[NR_CPUS]; | 15 | extern cpumask_t cpu_core_map[NR_CPUS]; |
13 | 16 | ||
diff --git a/arch/s390/include/uapi/asm/ptrace.h b/arch/s390/include/uapi/asm/ptrace.h index 705588a16d70..a5ca214b34fd 100644 --- a/arch/s390/include/uapi/asm/ptrace.h +++ b/arch/s390/include/uapi/asm/ptrace.h | |||
@@ -239,7 +239,7 @@ typedef struct | |||
239 | #define PSW_MASK_EA 0x00000000UL | 239 | #define PSW_MASK_EA 0x00000000UL |
240 | #define PSW_MASK_BA 0x00000000UL | 240 | #define PSW_MASK_BA 0x00000000UL |
241 | 241 | ||
242 | #define PSW_MASK_USER 0x00003F00UL | 242 | #define PSW_MASK_USER 0x0000FF00UL |
243 | 243 | ||
244 | #define PSW_ADDR_AMODE 0x80000000UL | 244 | #define PSW_ADDR_AMODE 0x80000000UL |
245 | #define PSW_ADDR_INSN 0x7FFFFFFFUL | 245 | #define PSW_ADDR_INSN 0x7FFFFFFFUL |
@@ -269,7 +269,7 @@ typedef struct | |||
269 | #define PSW_MASK_EA 0x0000000100000000UL | 269 | #define PSW_MASK_EA 0x0000000100000000UL |
270 | #define PSW_MASK_BA 0x0000000080000000UL | 270 | #define PSW_MASK_BA 0x0000000080000000UL |
271 | 271 | ||
272 | #define PSW_MASK_USER 0x00003F8180000000UL | 272 | #define PSW_MASK_USER 0x0000FF8180000000UL |
273 | 273 | ||
274 | #define PSW_ADDR_AMODE 0x0000000000000000UL | 274 | #define PSW_ADDR_AMODE 0x0000000000000000UL |
275 | #define PSW_ADDR_INSN 0xFFFFFFFFFFFFFFFFUL | 275 | #define PSW_ADDR_INSN 0xFFFFFFFFFFFFFFFFUL |
diff --git a/arch/s390/kernel/compat_signal.c b/arch/s390/kernel/compat_signal.c index a1e8a8694bb7..593fcc9253fc 100644 --- a/arch/s390/kernel/compat_signal.c +++ b/arch/s390/kernel/compat_signal.c | |||
@@ -309,6 +309,10 @@ static int restore_sigregs32(struct pt_regs *regs,_sigregs32 __user *sregs) | |||
309 | regs->psw.mask = (regs->psw.mask & ~PSW_MASK_USER) | | 309 | regs->psw.mask = (regs->psw.mask & ~PSW_MASK_USER) | |
310 | (__u64)(regs32.psw.mask & PSW32_MASK_USER) << 32 | | 310 | (__u64)(regs32.psw.mask & PSW32_MASK_USER) << 32 | |
311 | (__u64)(regs32.psw.addr & PSW32_ADDR_AMODE); | 311 | (__u64)(regs32.psw.addr & PSW32_ADDR_AMODE); |
312 | /* Check for invalid user address space control. */ | ||
313 | if ((regs->psw.mask & PSW_MASK_ASC) >= (psw_kernel_bits & PSW_MASK_ASC)) | ||
314 | regs->psw.mask = (psw_user_bits & PSW_MASK_ASC) | | ||
315 | (regs->psw.mask & ~PSW_MASK_ASC); | ||
312 | regs->psw.addr = (__u64)(regs32.psw.addr & PSW32_ADDR_INSN); | 316 | regs->psw.addr = (__u64)(regs32.psw.addr & PSW32_ADDR_INSN); |
313 | for (i = 0; i < NUM_GPRS; i++) | 317 | for (i = 0; i < NUM_GPRS; i++) |
314 | regs->gprs[i] = (__u64) regs32.gprs[i]; | 318 | regs->gprs[i] = (__u64) regs32.gprs[i]; |
@@ -481,7 +485,10 @@ static int setup_frame32(int sig, struct k_sigaction *ka, | |||
481 | 485 | ||
482 | /* Set up registers for signal handler */ | 486 | /* Set up registers for signal handler */ |
483 | regs->gprs[15] = (__force __u64) frame; | 487 | regs->gprs[15] = (__force __u64) frame; |
484 | regs->psw.mask |= PSW_MASK_BA; /* force amode 31 */ | 488 | /* Force 31 bit amode and default user address space control. */ |
489 | regs->psw.mask = PSW_MASK_BA | | ||
490 | (psw_user_bits & PSW_MASK_ASC) | | ||
491 | (regs->psw.mask & ~PSW_MASK_ASC); | ||
485 | regs->psw.addr = (__force __u64) ka->sa.sa_handler; | 492 | regs->psw.addr = (__force __u64) ka->sa.sa_handler; |
486 | 493 | ||
487 | regs->gprs[2] = map_signal(sig); | 494 | regs->gprs[2] = map_signal(sig); |
@@ -549,7 +556,10 @@ static int setup_rt_frame32(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
549 | 556 | ||
550 | /* Set up registers for signal handler */ | 557 | /* Set up registers for signal handler */ |
551 | regs->gprs[15] = (__force __u64) frame; | 558 | regs->gprs[15] = (__force __u64) frame; |
552 | regs->psw.mask |= PSW_MASK_BA; /* force amode 31 */ | 559 | /* Force 31 bit amode and default user address space control. */ |
560 | regs->psw.mask = PSW_MASK_BA | | ||
561 | (psw_user_bits & PSW_MASK_ASC) | | ||
562 | (regs->psw.mask & ~PSW_MASK_ASC); | ||
553 | regs->psw.addr = (__u64) ka->sa.sa_handler; | 563 | regs->psw.addr = (__u64) ka->sa.sa_handler; |
554 | 564 | ||
555 | regs->gprs[2] = map_signal(sig); | 565 | regs->gprs[2] = map_signal(sig); |
diff --git a/arch/s390/kernel/signal.c b/arch/s390/kernel/signal.c index c13a2a37ef00..d1259d875074 100644 --- a/arch/s390/kernel/signal.c +++ b/arch/s390/kernel/signal.c | |||
@@ -136,6 +136,10 @@ static int restore_sigregs(struct pt_regs *regs, _sigregs __user *sregs) | |||
136 | /* Use regs->psw.mask instead of psw_user_bits to preserve PER bit. */ | 136 | /* Use regs->psw.mask instead of psw_user_bits to preserve PER bit. */ |
137 | regs->psw.mask = (regs->psw.mask & ~PSW_MASK_USER) | | 137 | regs->psw.mask = (regs->psw.mask & ~PSW_MASK_USER) | |
138 | (user_sregs.regs.psw.mask & PSW_MASK_USER); | 138 | (user_sregs.regs.psw.mask & PSW_MASK_USER); |
139 | /* Check for invalid user address space control. */ | ||
140 | if ((regs->psw.mask & PSW_MASK_ASC) >= (psw_kernel_bits & PSW_MASK_ASC)) | ||
141 | regs->psw.mask = (psw_user_bits & PSW_MASK_ASC) | | ||
142 | (regs->psw.mask & ~PSW_MASK_ASC); | ||
139 | /* Check for invalid amode */ | 143 | /* Check for invalid amode */ |
140 | if (regs->psw.mask & PSW_MASK_EA) | 144 | if (regs->psw.mask & PSW_MASK_EA) |
141 | regs->psw.mask |= PSW_MASK_BA; | 145 | regs->psw.mask |= PSW_MASK_BA; |
@@ -273,7 +277,10 @@ static int setup_frame(int sig, struct k_sigaction *ka, | |||
273 | 277 | ||
274 | /* Set up registers for signal handler */ | 278 | /* Set up registers for signal handler */ |
275 | regs->gprs[15] = (unsigned long) frame; | 279 | regs->gprs[15] = (unsigned long) frame; |
276 | regs->psw.mask |= PSW_MASK_EA | PSW_MASK_BA; /* 64 bit amode */ | 280 | /* Force default amode and default user address space control. */ |
281 | regs->psw.mask = PSW_MASK_EA | PSW_MASK_BA | | ||
282 | (psw_user_bits & PSW_MASK_ASC) | | ||
283 | (regs->psw.mask & ~PSW_MASK_ASC); | ||
277 | regs->psw.addr = (unsigned long) ka->sa.sa_handler | PSW_ADDR_AMODE; | 284 | regs->psw.addr = (unsigned long) ka->sa.sa_handler | PSW_ADDR_AMODE; |
278 | 285 | ||
279 | regs->gprs[2] = map_signal(sig); | 286 | regs->gprs[2] = map_signal(sig); |
@@ -346,7 +353,10 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
346 | 353 | ||
347 | /* Set up registers for signal handler */ | 354 | /* Set up registers for signal handler */ |
348 | regs->gprs[15] = (unsigned long) frame; | 355 | regs->gprs[15] = (unsigned long) frame; |
349 | regs->psw.mask |= PSW_MASK_EA | PSW_MASK_BA; /* 64 bit amode */ | 356 | /* Force default amode and default user address space control. */ |
357 | regs->psw.mask = PSW_MASK_EA | PSW_MASK_BA | | ||
358 | (psw_user_bits & PSW_MASK_ASC) | | ||
359 | (regs->psw.mask & ~PSW_MASK_ASC); | ||
350 | regs->psw.addr = (unsigned long) ka->sa.sa_handler | PSW_ADDR_AMODE; | 360 | regs->psw.addr = (unsigned long) ka->sa.sa_handler | PSW_ADDR_AMODE; |
351 | 361 | ||
352 | regs->gprs[2] = map_signal(sig); | 362 | regs->gprs[2] = map_signal(sig); |
diff --git a/arch/s390/kernel/topology.c b/arch/s390/kernel/topology.c index 54d93f4b6818..dd55f7c20104 100644 --- a/arch/s390/kernel/topology.c +++ b/arch/s390/kernel/topology.c | |||
@@ -40,6 +40,7 @@ static DEFINE_SPINLOCK(topology_lock); | |||
40 | static struct mask_info core_info; | 40 | static struct mask_info core_info; |
41 | cpumask_t cpu_core_map[NR_CPUS]; | 41 | cpumask_t cpu_core_map[NR_CPUS]; |
42 | unsigned char cpu_core_id[NR_CPUS]; | 42 | unsigned char cpu_core_id[NR_CPUS]; |
43 | unsigned char cpu_socket_id[NR_CPUS]; | ||
43 | 44 | ||
44 | static struct mask_info book_info; | 45 | static struct mask_info book_info; |
45 | cpumask_t cpu_book_map[NR_CPUS]; | 46 | cpumask_t cpu_book_map[NR_CPUS]; |
@@ -83,11 +84,12 @@ static struct mask_info *add_cpus_to_mask(struct topology_cpu *tl_cpu, | |||
83 | cpumask_set_cpu(lcpu, &book->mask); | 84 | cpumask_set_cpu(lcpu, &book->mask); |
84 | cpu_book_id[lcpu] = book->id; | 85 | cpu_book_id[lcpu] = book->id; |
85 | cpumask_set_cpu(lcpu, &core->mask); | 86 | cpumask_set_cpu(lcpu, &core->mask); |
87 | cpu_core_id[lcpu] = rcpu; | ||
86 | if (one_core_per_cpu) { | 88 | if (one_core_per_cpu) { |
87 | cpu_core_id[lcpu] = rcpu; | 89 | cpu_socket_id[lcpu] = rcpu; |
88 | core = core->next; | 90 | core = core->next; |
89 | } else { | 91 | } else { |
90 | cpu_core_id[lcpu] = core->id; | 92 | cpu_socket_id[lcpu] = core->id; |
91 | } | 93 | } |
92 | smp_cpu_set_polarization(lcpu, tl_cpu->pp); | 94 | smp_cpu_set_polarization(lcpu, tl_cpu->pp); |
93 | } | 95 | } |
diff --git a/arch/s390/mm/gup.c b/arch/s390/mm/gup.c index 8b8285310b5a..1f5315d1215c 100644 --- a/arch/s390/mm/gup.c +++ b/arch/s390/mm/gup.c | |||
@@ -180,8 +180,7 @@ int __get_user_pages_fast(unsigned long start, int nr_pages, int write, | |||
180 | addr = start; | 180 | addr = start; |
181 | len = (unsigned long) nr_pages << PAGE_SHIFT; | 181 | len = (unsigned long) nr_pages << PAGE_SHIFT; |
182 | end = start + len; | 182 | end = start + len; |
183 | if (unlikely(!access_ok(write ? VERIFY_WRITE : VERIFY_READ, | 183 | if ((end < start) || (end > TASK_SIZE)) |
184 | (void __user *)start, len))) | ||
185 | return 0; | 184 | return 0; |
186 | 185 | ||
187 | local_irq_save(flags); | 186 | local_irq_save(flags); |
@@ -229,7 +228,7 @@ int get_user_pages_fast(unsigned long start, int nr_pages, int write, | |||
229 | addr = start; | 228 | addr = start; |
230 | len = (unsigned long) nr_pages << PAGE_SHIFT; | 229 | len = (unsigned long) nr_pages << PAGE_SHIFT; |
231 | end = start + len; | 230 | end = start + len; |
232 | if (end < start) | 231 | if ((end < start) || (end > TASK_SIZE)) |
233 | goto slow_irqon; | 232 | goto slow_irqon; |
234 | 233 | ||
235 | /* | 234 | /* |
diff --git a/arch/unicore32/Kconfig b/arch/unicore32/Kconfig index e5c5473e69ce..c4fbb21e802b 100644 --- a/arch/unicore32/Kconfig +++ b/arch/unicore32/Kconfig | |||
@@ -16,6 +16,8 @@ config UNICORE32 | |||
16 | select ARCH_WANT_FRAME_POINTERS | 16 | select ARCH_WANT_FRAME_POINTERS |
17 | select GENERIC_IOMAP | 17 | select GENERIC_IOMAP |
18 | select MODULES_USE_ELF_REL | 18 | select MODULES_USE_ELF_REL |
19 | select GENERIC_KERNEL_THREAD | ||
20 | select GENERIC_KERNEL_EXECVE | ||
19 | help | 21 | help |
20 | UniCore-32 is 32-bit Instruction Set Architecture, | 22 | UniCore-32 is 32-bit Instruction Set Architecture, |
21 | including a series of low-power-consumption RISC chip | 23 | including a series of low-power-consumption RISC chip |
@@ -64,6 +66,9 @@ config GENERIC_CALIBRATE_DELAY | |||
64 | config ARCH_MAY_HAVE_PC_FDC | 66 | config ARCH_MAY_HAVE_PC_FDC |
65 | bool | 67 | bool |
66 | 68 | ||
69 | config ZONE_DMA | ||
70 | def_bool y | ||
71 | |||
67 | config NEED_DMA_MAP_STATE | 72 | config NEED_DMA_MAP_STATE |
68 | def_bool y | 73 | def_bool y |
69 | 74 | ||
@@ -216,7 +221,7 @@ config PUV3_GPIO | |||
216 | bool | 221 | bool |
217 | depends on !ARCH_FPGA | 222 | depends on !ARCH_FPGA |
218 | select GENERIC_GPIO | 223 | select GENERIC_GPIO |
219 | select GPIO_SYSFS if EXPERIMENTAL | 224 | select GPIO_SYSFS |
220 | default y | 225 | default y |
221 | 226 | ||
222 | if PUV3_NB0916 | 227 | if PUV3_NB0916 |
diff --git a/arch/unicore32/include/asm/Kbuild b/arch/unicore32/include/asm/Kbuild index c910c9857e11..601e92f18af6 100644 --- a/arch/unicore32/include/asm/Kbuild +++ b/arch/unicore32/include/asm/Kbuild | |||
@@ -1,4 +1,3 @@ | |||
1 | include include/asm-generic/Kbuild.asm | ||
2 | 1 | ||
3 | generic-y += atomic.h | 2 | generic-y += atomic.h |
4 | generic-y += auxvec.h | 3 | generic-y += auxvec.h |
diff --git a/arch/unicore32/include/asm/bug.h b/arch/unicore32/include/asm/bug.h index b1ff8cadb086..93a56f3e2344 100644 --- a/arch/unicore32/include/asm/bug.h +++ b/arch/unicore32/include/asm/bug.h | |||
@@ -19,9 +19,4 @@ extern void die(const char *msg, struct pt_regs *regs, int err); | |||
19 | extern void uc32_notify_die(const char *str, struct pt_regs *regs, | 19 | extern void uc32_notify_die(const char *str, struct pt_regs *regs, |
20 | struct siginfo *info, unsigned long err, unsigned long trap); | 20 | struct siginfo *info, unsigned long err, unsigned long trap); |
21 | 21 | ||
22 | extern asmlinkage void __backtrace(void); | ||
23 | extern asmlinkage void c_backtrace(unsigned long fp, int pmode); | ||
24 | |||
25 | extern void __show_regs(struct pt_regs *); | ||
26 | |||
27 | #endif /* __UNICORE_BUG_H__ */ | 22 | #endif /* __UNICORE_BUG_H__ */ |
diff --git a/arch/unicore32/include/asm/cmpxchg.h b/arch/unicore32/include/asm/cmpxchg.h index df4d5acfd19f..8e797ad4fa24 100644 --- a/arch/unicore32/include/asm/cmpxchg.h +++ b/arch/unicore32/include/asm/cmpxchg.h | |||
@@ -35,7 +35,7 @@ static inline unsigned long __xchg(unsigned long x, volatile void *ptr, | |||
35 | : "memory", "cc"); | 35 | : "memory", "cc"); |
36 | break; | 36 | break; |
37 | default: | 37 | default: |
38 | ret = __xchg_bad_pointer(); | 38 | __xchg_bad_pointer(); |
39 | } | 39 | } |
40 | 40 | ||
41 | return ret; | 41 | return ret; |
diff --git a/arch/unicore32/include/asm/kvm_para.h b/arch/unicore32/include/asm/kvm_para.h deleted file mode 100644 index 14fab8f0b957..000000000000 --- a/arch/unicore32/include/asm/kvm_para.h +++ /dev/null | |||
@@ -1 +0,0 @@ | |||
1 | #include <asm-generic/kvm_para.h> | ||
diff --git a/arch/unicore32/include/asm/processor.h b/arch/unicore32/include/asm/processor.h index 14382cb09657..4eaa42167667 100644 --- a/arch/unicore32/include/asm/processor.h +++ b/arch/unicore32/include/asm/processor.h | |||
@@ -72,11 +72,6 @@ unsigned long get_wchan(struct task_struct *p); | |||
72 | 72 | ||
73 | #define cpu_relax() barrier() | 73 | #define cpu_relax() barrier() |
74 | 74 | ||
75 | /* | ||
76 | * Create a new kernel thread | ||
77 | */ | ||
78 | extern int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags); | ||
79 | |||
80 | #define task_pt_regs(p) \ | 75 | #define task_pt_regs(p) \ |
81 | ((struct pt_regs *)(THREAD_START_SP + task_stack_page(p)) - 1) | 76 | ((struct pt_regs *)(THREAD_START_SP + task_stack_page(p)) - 1) |
82 | 77 | ||
diff --git a/arch/unicore32/include/asm/ptrace.h b/arch/unicore32/include/asm/ptrace.h index b9caf9b0997b..726749dab52f 100644 --- a/arch/unicore32/include/asm/ptrace.h +++ b/arch/unicore32/include/asm/ptrace.h | |||
@@ -12,80 +12,10 @@ | |||
12 | #ifndef __UNICORE_PTRACE_H__ | 12 | #ifndef __UNICORE_PTRACE_H__ |
13 | #define __UNICORE_PTRACE_H__ | 13 | #define __UNICORE_PTRACE_H__ |
14 | 14 | ||
15 | #define PTRACE_GET_THREAD_AREA 22 | 15 | #include <uapi/asm/ptrace.h> |
16 | |||
17 | /* | ||
18 | * PSR bits | ||
19 | */ | ||
20 | #define USER_MODE 0x00000010 | ||
21 | #define REAL_MODE 0x00000011 | ||
22 | #define INTR_MODE 0x00000012 | ||
23 | #define PRIV_MODE 0x00000013 | ||
24 | #define ABRT_MODE 0x00000017 | ||
25 | #define EXTN_MODE 0x0000001b | ||
26 | #define SUSR_MODE 0x0000001f | ||
27 | #define MODE_MASK 0x0000001f | ||
28 | #define PSR_R_BIT 0x00000040 | ||
29 | #define PSR_I_BIT 0x00000080 | ||
30 | #define PSR_V_BIT 0x10000000 | ||
31 | #define PSR_C_BIT 0x20000000 | ||
32 | #define PSR_Z_BIT 0x40000000 | ||
33 | #define PSR_S_BIT 0x80000000 | ||
34 | |||
35 | /* | ||
36 | * Groups of PSR bits | ||
37 | */ | ||
38 | #define PSR_f 0xff000000 /* Flags */ | ||
39 | #define PSR_c 0x000000ff /* Control */ | ||
40 | 16 | ||
41 | #ifndef __ASSEMBLY__ | 17 | #ifndef __ASSEMBLY__ |
42 | 18 | ||
43 | /* | ||
44 | * This struct defines the way the registers are stored on the | ||
45 | * stack during a system call. Note that sizeof(struct pt_regs) | ||
46 | * has to be a multiple of 8. | ||
47 | */ | ||
48 | struct pt_regs { | ||
49 | unsigned long uregs[34]; | ||
50 | }; | ||
51 | |||
52 | #define UCreg_asr uregs[32] | ||
53 | #define UCreg_pc uregs[31] | ||
54 | #define UCreg_lr uregs[30] | ||
55 | #define UCreg_sp uregs[29] | ||
56 | #define UCreg_ip uregs[28] | ||
57 | #define UCreg_fp uregs[27] | ||
58 | #define UCreg_26 uregs[26] | ||
59 | #define UCreg_25 uregs[25] | ||
60 | #define UCreg_24 uregs[24] | ||
61 | #define UCreg_23 uregs[23] | ||
62 | #define UCreg_22 uregs[22] | ||
63 | #define UCreg_21 uregs[21] | ||
64 | #define UCreg_20 uregs[20] | ||
65 | #define UCreg_19 uregs[19] | ||
66 | #define UCreg_18 uregs[18] | ||
67 | #define UCreg_17 uregs[17] | ||
68 | #define UCreg_16 uregs[16] | ||
69 | #define UCreg_15 uregs[15] | ||
70 | #define UCreg_14 uregs[14] | ||
71 | #define UCreg_13 uregs[13] | ||
72 | #define UCreg_12 uregs[12] | ||
73 | #define UCreg_11 uregs[11] | ||
74 | #define UCreg_10 uregs[10] | ||
75 | #define UCreg_09 uregs[9] | ||
76 | #define UCreg_08 uregs[8] | ||
77 | #define UCreg_07 uregs[7] | ||
78 | #define UCreg_06 uregs[6] | ||
79 | #define UCreg_05 uregs[5] | ||
80 | #define UCreg_04 uregs[4] | ||
81 | #define UCreg_03 uregs[3] | ||
82 | #define UCreg_02 uregs[2] | ||
83 | #define UCreg_01 uregs[1] | ||
84 | #define UCreg_00 uregs[0] | ||
85 | #define UCreg_ORIG_00 uregs[33] | ||
86 | |||
87 | #ifdef __KERNEL__ | ||
88 | |||
89 | #define user_mode(regs) \ | 19 | #define user_mode(regs) \ |
90 | (processor_mode(regs) == USER_MODE) | 20 | (processor_mode(regs) == USER_MODE) |
91 | 21 | ||
@@ -125,9 +55,5 @@ static inline int valid_user_regs(struct pt_regs *regs) | |||
125 | 55 | ||
126 | #define instruction_pointer(regs) ((regs)->UCreg_pc) | 56 | #define instruction_pointer(regs) ((regs)->UCreg_pc) |
127 | 57 | ||
128 | #endif /* __KERNEL__ */ | ||
129 | |||
130 | #endif /* __ASSEMBLY__ */ | 58 | #endif /* __ASSEMBLY__ */ |
131 | |||
132 | #endif | 59 | #endif |
133 | |||
diff --git a/arch/unicore32/include/uapi/asm/Kbuild b/arch/unicore32/include/uapi/asm/Kbuild index baebb3da1d44..0514d7ad6855 100644 --- a/arch/unicore32/include/uapi/asm/Kbuild +++ b/arch/unicore32/include/uapi/asm/Kbuild | |||
@@ -1,3 +1,10 @@ | |||
1 | # UAPI Header export list | 1 | # UAPI Header export list |
2 | include include/uapi/asm-generic/Kbuild.asm | 2 | include include/uapi/asm-generic/Kbuild.asm |
3 | 3 | ||
4 | header-y += byteorder.h | ||
5 | header-y += kvm_para.h | ||
6 | header-y += ptrace.h | ||
7 | header-y += sigcontext.h | ||
8 | header-y += unistd.h | ||
9 | |||
10 | generic-y += kvm_para.h | ||
diff --git a/arch/unicore32/include/asm/byteorder.h b/arch/unicore32/include/uapi/asm/byteorder.h index ebe1b3fef3e3..ebe1b3fef3e3 100644 --- a/arch/unicore32/include/asm/byteorder.h +++ b/arch/unicore32/include/uapi/asm/byteorder.h | |||
diff --git a/arch/unicore32/include/uapi/asm/ptrace.h b/arch/unicore32/include/uapi/asm/ptrace.h new file mode 100644 index 000000000000..187aa2e98a53 --- /dev/null +++ b/arch/unicore32/include/uapi/asm/ptrace.h | |||
@@ -0,0 +1,90 @@ | |||
1 | /* | ||
2 | * linux/arch/unicore32/include/asm/ptrace.h | ||
3 | * | ||
4 | * Code specific to PKUnity SoC and UniCore ISA | ||
5 | * | ||
6 | * Copyright (C) 2001-2010 GUAN Xue-tao | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | #ifndef _UAPI__UNICORE_PTRACE_H__ | ||
13 | #define _UAPI__UNICORE_PTRACE_H__ | ||
14 | |||
15 | #define PTRACE_GET_THREAD_AREA 22 | ||
16 | |||
17 | /* | ||
18 | * PSR bits | ||
19 | */ | ||
20 | #define USER_MODE 0x00000010 | ||
21 | #define REAL_MODE 0x00000011 | ||
22 | #define INTR_MODE 0x00000012 | ||
23 | #define PRIV_MODE 0x00000013 | ||
24 | #define ABRT_MODE 0x00000017 | ||
25 | #define EXTN_MODE 0x0000001b | ||
26 | #define SUSR_MODE 0x0000001f | ||
27 | #define MODE_MASK 0x0000001f | ||
28 | #define PSR_R_BIT 0x00000040 | ||
29 | #define PSR_I_BIT 0x00000080 | ||
30 | #define PSR_V_BIT 0x10000000 | ||
31 | #define PSR_C_BIT 0x20000000 | ||
32 | #define PSR_Z_BIT 0x40000000 | ||
33 | #define PSR_S_BIT 0x80000000 | ||
34 | |||
35 | /* | ||
36 | * Groups of PSR bits | ||
37 | */ | ||
38 | #define PSR_f 0xff000000 /* Flags */ | ||
39 | #define PSR_c 0x000000ff /* Control */ | ||
40 | |||
41 | #ifndef __ASSEMBLY__ | ||
42 | |||
43 | /* | ||
44 | * This struct defines the way the registers are stored on the | ||
45 | * stack during a system call. Note that sizeof(struct pt_regs) | ||
46 | * has to be a multiple of 8. | ||
47 | */ | ||
48 | struct pt_regs { | ||
49 | unsigned long uregs[34]; | ||
50 | }; | ||
51 | |||
52 | #define UCreg_asr uregs[32] | ||
53 | #define UCreg_pc uregs[31] | ||
54 | #define UCreg_lr uregs[30] | ||
55 | #define UCreg_sp uregs[29] | ||
56 | #define UCreg_ip uregs[28] | ||
57 | #define UCreg_fp uregs[27] | ||
58 | #define UCreg_26 uregs[26] | ||
59 | #define UCreg_25 uregs[25] | ||
60 | #define UCreg_24 uregs[24] | ||
61 | #define UCreg_23 uregs[23] | ||
62 | #define UCreg_22 uregs[22] | ||
63 | #define UCreg_21 uregs[21] | ||
64 | #define UCreg_20 uregs[20] | ||
65 | #define UCreg_19 uregs[19] | ||
66 | #define UCreg_18 uregs[18] | ||
67 | #define UCreg_17 uregs[17] | ||
68 | #define UCreg_16 uregs[16] | ||
69 | #define UCreg_15 uregs[15] | ||
70 | #define UCreg_14 uregs[14] | ||
71 | #define UCreg_13 uregs[13] | ||
72 | #define UCreg_12 uregs[12] | ||
73 | #define UCreg_11 uregs[11] | ||
74 | #define UCreg_10 uregs[10] | ||
75 | #define UCreg_09 uregs[9] | ||
76 | #define UCreg_08 uregs[8] | ||
77 | #define UCreg_07 uregs[7] | ||
78 | #define UCreg_06 uregs[6] | ||
79 | #define UCreg_05 uregs[5] | ||
80 | #define UCreg_04 uregs[4] | ||
81 | #define UCreg_03 uregs[3] | ||
82 | #define UCreg_02 uregs[2] | ||
83 | #define UCreg_01 uregs[1] | ||
84 | #define UCreg_00 uregs[0] | ||
85 | #define UCreg_ORIG_00 uregs[33] | ||
86 | |||
87 | |||
88 | #endif /* __ASSEMBLY__ */ | ||
89 | |||
90 | #endif /* _UAPI__UNICORE_PTRACE_H__ */ | ||
diff --git a/arch/unicore32/include/asm/sigcontext.h b/arch/unicore32/include/uapi/asm/sigcontext.h index 6a2d7671c052..6a2d7671c052 100644 --- a/arch/unicore32/include/asm/sigcontext.h +++ b/arch/unicore32/include/uapi/asm/sigcontext.h | |||
diff --git a/arch/unicore32/include/asm/unistd.h b/arch/unicore32/include/uapi/asm/unistd.h index 2abcf61c615d..d18a3be89b38 100644 --- a/arch/unicore32/include/asm/unistd.h +++ b/arch/unicore32/include/uapi/asm/unistd.h | |||
@@ -12,3 +12,4 @@ | |||
12 | 12 | ||
13 | /* Use the standard ABI for syscalls. */ | 13 | /* Use the standard ABI for syscalls. */ |
14 | #include <asm-generic/unistd.h> | 14 | #include <asm-generic/unistd.h> |
15 | #define __ARCH_WANT_SYS_EXECVE | ||
diff --git a/arch/unicore32/kernel/entry.S b/arch/unicore32/kernel/entry.S index dcb87ab19ddd..7049350c790f 100644 --- a/arch/unicore32/kernel/entry.S +++ b/arch/unicore32/kernel/entry.S | |||
@@ -573,17 +573,16 @@ ENDPROC(ret_to_user) | |||
573 | */ | 573 | */ |
574 | ENTRY(ret_from_fork) | 574 | ENTRY(ret_from_fork) |
575 | b.l schedule_tail | 575 | b.l schedule_tail |
576 | get_thread_info tsk | ||
577 | ldw r1, [tsk+], #TI_FLAGS @ check for syscall tracing | ||
578 | mov why, #1 | ||
579 | cand.a r1, #_TIF_SYSCALL_TRACE @ are we tracing syscalls? | ||
580 | beq ret_slow_syscall | ||
581 | mov r1, sp | ||
582 | mov r0, #1 @ trace exit [IP = 1] | ||
583 | b.l syscall_trace | ||
584 | b ret_slow_syscall | 576 | b ret_slow_syscall |
585 | ENDPROC(ret_from_fork) | 577 | ENDPROC(ret_from_fork) |
586 | 578 | ||
579 | ENTRY(ret_from_kernel_thread) | ||
580 | b.l schedule_tail | ||
581 | mov r0, r5 | ||
582 | adr lr, ret_slow_syscall | ||
583 | mov pc, r4 | ||
584 | ENDPROC(ret_from_kernel_thread) | ||
585 | |||
587 | /*============================================================================= | 586 | /*============================================================================= |
588 | * SWI handler | 587 | * SWI handler |
589 | *----------------------------------------------------------------------------- | 588 | *----------------------------------------------------------------------------- |
@@ -669,11 +668,6 @@ __cr_alignment: | |||
669 | #endif | 668 | #endif |
670 | .ltorg | 669 | .ltorg |
671 | 670 | ||
672 | ENTRY(sys_execve) | ||
673 | add r3, sp, #S_OFF | ||
674 | b __sys_execve | ||
675 | ENDPROC(sys_execve) | ||
676 | |||
677 | ENTRY(sys_clone) | 671 | ENTRY(sys_clone) |
678 | add ip, sp, #S_OFF | 672 | add ip, sp, #S_OFF |
679 | stw ip, [sp+], #4 | 673 | stw ip, [sp+], #4 |
diff --git a/arch/unicore32/kernel/process.c b/arch/unicore32/kernel/process.c index b008586dad75..a8fe265ce2c0 100644 --- a/arch/unicore32/kernel/process.c +++ b/arch/unicore32/kernel/process.c | |||
@@ -258,6 +258,7 @@ void release_thread(struct task_struct *dead_task) | |||
258 | } | 258 | } |
259 | 259 | ||
260 | asmlinkage void ret_from_fork(void) __asm__("ret_from_fork"); | 260 | asmlinkage void ret_from_fork(void) __asm__("ret_from_fork"); |
261 | asmlinkage void ret_from_kernel_thread(void) __asm__("ret_from_kernel_thread"); | ||
261 | 262 | ||
262 | int | 263 | int |
263 | copy_thread(unsigned long clone_flags, unsigned long stack_start, | 264 | copy_thread(unsigned long clone_flags, unsigned long stack_start, |
@@ -266,17 +267,22 @@ copy_thread(unsigned long clone_flags, unsigned long stack_start, | |||
266 | struct thread_info *thread = task_thread_info(p); | 267 | struct thread_info *thread = task_thread_info(p); |
267 | struct pt_regs *childregs = task_pt_regs(p); | 268 | struct pt_regs *childregs = task_pt_regs(p); |
268 | 269 | ||
269 | *childregs = *regs; | ||
270 | childregs->UCreg_00 = 0; | ||
271 | childregs->UCreg_sp = stack_start; | ||
272 | |||
273 | memset(&thread->cpu_context, 0, sizeof(struct cpu_context_save)); | 270 | memset(&thread->cpu_context, 0, sizeof(struct cpu_context_save)); |
274 | thread->cpu_context.sp = (unsigned long)childregs; | 271 | thread->cpu_context.sp = (unsigned long)childregs; |
275 | thread->cpu_context.pc = (unsigned long)ret_from_fork; | 272 | if (unlikely(!regs)) { |
276 | 273 | thread->cpu_context.pc = (unsigned long)ret_from_kernel_thread; | |
277 | if (clone_flags & CLONE_SETTLS) | 274 | thread->cpu_context.r4 = stack_start; |
278 | childregs->UCreg_16 = regs->UCreg_03; | 275 | thread->cpu_context.r5 = stk_sz; |
276 | memset(childregs, 0, sizeof(struct pt_regs)); | ||
277 | } else { | ||
278 | thread->cpu_context.pc = (unsigned long)ret_from_fork; | ||
279 | *childregs = *regs; | ||
280 | childregs->UCreg_00 = 0; | ||
281 | childregs->UCreg_sp = stack_start; | ||
279 | 282 | ||
283 | if (clone_flags & CLONE_SETTLS) | ||
284 | childregs->UCreg_16 = regs->UCreg_03; | ||
285 | } | ||
280 | return 0; | 286 | return 0; |
281 | } | 287 | } |
282 | 288 | ||
@@ -305,42 +311,6 @@ int dump_fpu(struct pt_regs *regs, elf_fpregset_t *fp) | |||
305 | } | 311 | } |
306 | EXPORT_SYMBOL(dump_fpu); | 312 | EXPORT_SYMBOL(dump_fpu); |
307 | 313 | ||
308 | /* | ||
309 | * Shuffle the argument into the correct register before calling the | ||
310 | * thread function. r1 is the thread argument, r2 is the pointer to | ||
311 | * the thread function, and r3 points to the exit function. | ||
312 | */ | ||
313 | asm(".pushsection .text\n" | ||
314 | " .align\n" | ||
315 | " .type kernel_thread_helper, #function\n" | ||
316 | "kernel_thread_helper:\n" | ||
317 | " mov.a asr, r7\n" | ||
318 | " mov r0, r4\n" | ||
319 | " mov lr, r6\n" | ||
320 | " mov pc, r5\n" | ||
321 | " .size kernel_thread_helper, . - kernel_thread_helper\n" | ||
322 | " .popsection"); | ||
323 | |||
324 | /* | ||
325 | * Create a kernel thread. | ||
326 | */ | ||
327 | pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags) | ||
328 | { | ||
329 | struct pt_regs regs; | ||
330 | |||
331 | memset(®s, 0, sizeof(regs)); | ||
332 | |||
333 | regs.UCreg_04 = (unsigned long)arg; | ||
334 | regs.UCreg_05 = (unsigned long)fn; | ||
335 | regs.UCreg_06 = (unsigned long)do_exit; | ||
336 | regs.UCreg_07 = PRIV_MODE; | ||
337 | regs.UCreg_pc = (unsigned long)kernel_thread_helper; | ||
338 | regs.UCreg_asr = regs.UCreg_07 | PSR_I_BIT; | ||
339 | |||
340 | return do_fork(flags|CLONE_VM|CLONE_UNTRACED, 0, ®s, 0, NULL, NULL); | ||
341 | } | ||
342 | EXPORT_SYMBOL(kernel_thread); | ||
343 | |||
344 | unsigned long get_wchan(struct task_struct *p) | 314 | unsigned long get_wchan(struct task_struct *p) |
345 | { | 315 | { |
346 | struct stackframe frame; | 316 | struct stackframe frame; |
diff --git a/arch/unicore32/kernel/setup.h b/arch/unicore32/kernel/setup.h index f23955028a18..30f749da8f73 100644 --- a/arch/unicore32/kernel/setup.h +++ b/arch/unicore32/kernel/setup.h | |||
@@ -30,4 +30,10 @@ extern char __vectors_start[], __vectors_end[]; | |||
30 | extern void kernel_thread_helper(void); | 30 | extern void kernel_thread_helper(void); |
31 | 31 | ||
32 | extern void __init early_signal_init(void); | 32 | extern void __init early_signal_init(void); |
33 | |||
34 | extern asmlinkage void __backtrace(void); | ||
35 | extern asmlinkage void c_backtrace(unsigned long fp, int pmode); | ||
36 | |||
37 | extern void __show_regs(struct pt_regs *); | ||
38 | |||
33 | #endif | 39 | #endif |
diff --git a/arch/unicore32/kernel/sys.c b/arch/unicore32/kernel/sys.c index fabdee96110b..9680134b31f0 100644 --- a/arch/unicore32/kernel/sys.c +++ b/arch/unicore32/kernel/sys.c | |||
@@ -42,69 +42,6 @@ asmlinkage long __sys_clone(unsigned long clone_flags, unsigned long newsp, | |||
42 | parent_tid, child_tid); | 42 | parent_tid, child_tid); |
43 | } | 43 | } |
44 | 44 | ||
45 | /* sys_execve() executes a new program. | ||
46 | * This is called indirectly via a small wrapper | ||
47 | */ | ||
48 | asmlinkage long __sys_execve(const char __user *filename, | ||
49 | const char __user *const __user *argv, | ||
50 | const char __user *const __user *envp, | ||
51 | struct pt_regs *regs) | ||
52 | { | ||
53 | int error; | ||
54 | struct filename *fn; | ||
55 | |||
56 | fn = getname(filename); | ||
57 | error = PTR_ERR(fn); | ||
58 | if (IS_ERR(fn)) | ||
59 | goto out; | ||
60 | error = do_execve(fn->name, argv, envp, regs); | ||
61 | putname(fn); | ||
62 | out: | ||
63 | return error; | ||
64 | } | ||
65 | |||
66 | int kernel_execve(const char *filename, | ||
67 | const char *const argv[], | ||
68 | const char *const envp[]) | ||
69 | { | ||
70 | struct pt_regs regs; | ||
71 | int ret; | ||
72 | |||
73 | memset(®s, 0, sizeof(struct pt_regs)); | ||
74 | ret = do_execve(filename, | ||
75 | (const char __user *const __user *)argv, | ||
76 | (const char __user *const __user *)envp, ®s); | ||
77 | if (ret < 0) | ||
78 | goto out; | ||
79 | |||
80 | /* | ||
81 | * Save argc to the register structure for userspace. | ||
82 | */ | ||
83 | regs.UCreg_00 = ret; | ||
84 | |||
85 | /* | ||
86 | * We were successful. We won't be returning to our caller, but | ||
87 | * instead to user space by manipulating the kernel stack. | ||
88 | */ | ||
89 | asm("add r0, %0, %1\n\t" | ||
90 | "mov r1, %2\n\t" | ||
91 | "mov r2, %3\n\t" | ||
92 | "mov r22, #0\n\t" /* not a syscall */ | ||
93 | "mov r23, %0\n\t" /* thread structure */ | ||
94 | "b.l memmove\n\t" /* copy regs to top of stack */ | ||
95 | "mov sp, r0\n\t" /* reposition stack pointer */ | ||
96 | "b ret_to_user" | ||
97 | : | ||
98 | : "r" (current_thread_info()), | ||
99 | "Ir" (THREAD_START_SP - sizeof(regs)), | ||
100 | "r" (®s), | ||
101 | "Ir" (sizeof(regs)) | ||
102 | : "r0", "r1", "r2", "r3", "ip", "lr", "memory"); | ||
103 | |||
104 | out: | ||
105 | return ret; | ||
106 | } | ||
107 | |||
108 | /* Note: used by the compat code even in 64-bit Linux. */ | 45 | /* Note: used by the compat code even in 64-bit Linux. */ |
109 | SYSCALL_DEFINE6(mmap2, unsigned long, addr, unsigned long, len, | 46 | SYSCALL_DEFINE6(mmap2, unsigned long, addr, unsigned long, len, |
110 | unsigned long, prot, unsigned long, flags, | 47 | unsigned long, prot, unsigned long, flags, |
diff --git a/arch/unicore32/mm/fault.c b/arch/unicore32/mm/fault.c index 2eeb9c04cab0..f9b5c10bccee 100644 --- a/arch/unicore32/mm/fault.c +++ b/arch/unicore32/mm/fault.c | |||
@@ -168,7 +168,7 @@ static inline bool access_error(unsigned int fsr, struct vm_area_struct *vma) | |||
168 | } | 168 | } |
169 | 169 | ||
170 | static int __do_pf(struct mm_struct *mm, unsigned long addr, unsigned int fsr, | 170 | static int __do_pf(struct mm_struct *mm, unsigned long addr, unsigned int fsr, |
171 | struct task_struct *tsk) | 171 | unsigned int flags, struct task_struct *tsk) |
172 | { | 172 | { |
173 | struct vm_area_struct *vma; | 173 | struct vm_area_struct *vma; |
174 | int fault; | 174 | int fault; |
@@ -194,14 +194,7 @@ good_area: | |||
194 | * If for any reason at all we couldn't handle the fault, make | 194 | * If for any reason at all we couldn't handle the fault, make |
195 | * sure we exit gracefully rather than endlessly redo the fault. | 195 | * sure we exit gracefully rather than endlessly redo the fault. |
196 | */ | 196 | */ |
197 | fault = handle_mm_fault(mm, vma, addr & PAGE_MASK, | 197 | fault = handle_mm_fault(mm, vma, addr & PAGE_MASK, flags); |
198 | (!(fsr ^ 0x12)) ? FAULT_FLAG_WRITE : 0); | ||
199 | if (unlikely(fault & VM_FAULT_ERROR)) | ||
200 | return fault; | ||
201 | if (fault & VM_FAULT_MAJOR) | ||
202 | tsk->maj_flt++; | ||
203 | else | ||
204 | tsk->min_flt++; | ||
205 | return fault; | 198 | return fault; |
206 | 199 | ||
207 | check_stack: | 200 | check_stack: |
@@ -216,6 +209,8 @@ static int do_pf(unsigned long addr, unsigned int fsr, struct pt_regs *regs) | |||
216 | struct task_struct *tsk; | 209 | struct task_struct *tsk; |
217 | struct mm_struct *mm; | 210 | struct mm_struct *mm; |
218 | int fault, sig, code; | 211 | int fault, sig, code; |
212 | unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE | | ||
213 | ((!(fsr ^ 0x12)) ? FAULT_FLAG_WRITE : 0); | ||
219 | 214 | ||
220 | tsk = current; | 215 | tsk = current; |
221 | mm = tsk->mm; | 216 | mm = tsk->mm; |
@@ -236,6 +231,7 @@ static int do_pf(unsigned long addr, unsigned int fsr, struct pt_regs *regs) | |||
236 | if (!user_mode(regs) | 231 | if (!user_mode(regs) |
237 | && !search_exception_tables(regs->UCreg_pc)) | 232 | && !search_exception_tables(regs->UCreg_pc)) |
238 | goto no_context; | 233 | goto no_context; |
234 | retry: | ||
239 | down_read(&mm->mmap_sem); | 235 | down_read(&mm->mmap_sem); |
240 | } else { | 236 | } else { |
241 | /* | 237 | /* |
@@ -251,7 +247,28 @@ static int do_pf(unsigned long addr, unsigned int fsr, struct pt_regs *regs) | |||
251 | #endif | 247 | #endif |
252 | } | 248 | } |
253 | 249 | ||
254 | fault = __do_pf(mm, addr, fsr, tsk); | 250 | fault = __do_pf(mm, addr, fsr, flags, tsk); |
251 | |||
252 | /* If we need to retry but a fatal signal is pending, handle the | ||
253 | * signal first. We do not need to release the mmap_sem because | ||
254 | * it would already be released in __lock_page_or_retry in | ||
255 | * mm/filemap.c. */ | ||
256 | if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current)) | ||
257 | return 0; | ||
258 | |||
259 | if (!(fault & VM_FAULT_ERROR) && (flags & FAULT_FLAG_ALLOW_RETRY)) { | ||
260 | if (fault & VM_FAULT_MAJOR) | ||
261 | tsk->maj_flt++; | ||
262 | else | ||
263 | tsk->min_flt++; | ||
264 | if (fault & VM_FAULT_RETRY) { | ||
265 | /* Clear FAULT_FLAG_ALLOW_RETRY to avoid any risk | ||
266 | * of starvation. */ | ||
267 | flags &= ~FAULT_FLAG_ALLOW_RETRY; | ||
268 | goto retry; | ||
269 | } | ||
270 | } | ||
271 | |||
255 | up_read(&mm->mmap_sem); | 272 | up_read(&mm->mmap_sem); |
256 | 273 | ||
257 | /* | 274 | /* |
diff --git a/arch/x86/kvm/cpuid.h b/arch/x86/kvm/cpuid.h index a10e46016851..58fc51488828 100644 --- a/arch/x86/kvm/cpuid.h +++ b/arch/x86/kvm/cpuid.h | |||
@@ -24,6 +24,9 @@ static inline bool guest_cpuid_has_xsave(struct kvm_vcpu *vcpu) | |||
24 | { | 24 | { |
25 | struct kvm_cpuid_entry2 *best; | 25 | struct kvm_cpuid_entry2 *best; |
26 | 26 | ||
27 | if (!static_cpu_has(X86_FEATURE_XSAVE)) | ||
28 | return 0; | ||
29 | |||
27 | best = kvm_find_cpuid_entry(vcpu, 1, 0); | 30 | best = kvm_find_cpuid_entry(vcpu, 1, 0); |
28 | return best && (best->ecx & bit(X86_FEATURE_XSAVE)); | 31 | return best && (best->ecx & bit(X86_FEATURE_XSAVE)); |
29 | } | 32 | } |
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index ad6b1dd06f8b..f85815945fc6 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c | |||
@@ -6549,19 +6549,22 @@ static void vmx_cpuid_update(struct kvm_vcpu *vcpu) | |||
6549 | } | 6549 | } |
6550 | } | 6550 | } |
6551 | 6551 | ||
6552 | exec_control = vmcs_read32(SECONDARY_VM_EXEC_CONTROL); | ||
6553 | /* Exposing INVPCID only when PCID is exposed */ | 6552 | /* Exposing INVPCID only when PCID is exposed */ |
6554 | best = kvm_find_cpuid_entry(vcpu, 0x7, 0); | 6553 | best = kvm_find_cpuid_entry(vcpu, 0x7, 0); |
6555 | if (vmx_invpcid_supported() && | 6554 | if (vmx_invpcid_supported() && |
6556 | best && (best->ebx & bit(X86_FEATURE_INVPCID)) && | 6555 | best && (best->ebx & bit(X86_FEATURE_INVPCID)) && |
6557 | guest_cpuid_has_pcid(vcpu)) { | 6556 | guest_cpuid_has_pcid(vcpu)) { |
6557 | exec_control = vmcs_read32(SECONDARY_VM_EXEC_CONTROL); | ||
6558 | exec_control |= SECONDARY_EXEC_ENABLE_INVPCID; | 6558 | exec_control |= SECONDARY_EXEC_ENABLE_INVPCID; |
6559 | vmcs_write32(SECONDARY_VM_EXEC_CONTROL, | 6559 | vmcs_write32(SECONDARY_VM_EXEC_CONTROL, |
6560 | exec_control); | 6560 | exec_control); |
6561 | } else { | 6561 | } else { |
6562 | exec_control &= ~SECONDARY_EXEC_ENABLE_INVPCID; | 6562 | if (cpu_has_secondary_exec_ctrls()) { |
6563 | vmcs_write32(SECONDARY_VM_EXEC_CONTROL, | 6563 | exec_control = vmcs_read32(SECONDARY_VM_EXEC_CONTROL); |
6564 | exec_control); | 6564 | exec_control &= ~SECONDARY_EXEC_ENABLE_INVPCID; |
6565 | vmcs_write32(SECONDARY_VM_EXEC_CONTROL, | ||
6566 | exec_control); | ||
6567 | } | ||
6565 | if (best) | 6568 | if (best) |
6566 | best->ebx &= ~bit(X86_FEATURE_INVPCID); | 6569 | best->ebx &= ~bit(X86_FEATURE_INVPCID); |
6567 | } | 6570 | } |
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 224a7e78cb6c..4f7641756be2 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
@@ -5781,6 +5781,9 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, | |||
5781 | int pending_vec, max_bits, idx; | 5781 | int pending_vec, max_bits, idx; |
5782 | struct desc_ptr dt; | 5782 | struct desc_ptr dt; |
5783 | 5783 | ||
5784 | if (!guest_cpuid_has_xsave(vcpu) && (sregs->cr4 & X86_CR4_OSXSAVE)) | ||
5785 | return -EINVAL; | ||
5786 | |||
5784 | dt.size = sregs->idt.limit; | 5787 | dt.size = sregs->idt.limit; |
5785 | dt.address = sregs->idt.base; | 5788 | dt.address = sregs->idt.base; |
5786 | kvm_x86_ops->set_idt(vcpu, &dt); | 5789 | kvm_x86_ops->set_idt(vcpu, &dt); |
diff --git a/drivers/bluetooth/ath3k.c b/drivers/bluetooth/ath3k.c index fc2de5528dcc..b00000e8aef6 100644 --- a/drivers/bluetooth/ath3k.c +++ b/drivers/bluetooth/ath3k.c | |||
@@ -67,6 +67,7 @@ static struct usb_device_id ath3k_table[] = { | |||
67 | { USB_DEVICE(0x13d3, 0x3304) }, | 67 | { USB_DEVICE(0x13d3, 0x3304) }, |
68 | { USB_DEVICE(0x0930, 0x0215) }, | 68 | { USB_DEVICE(0x0930, 0x0215) }, |
69 | { USB_DEVICE(0x0489, 0xE03D) }, | 69 | { USB_DEVICE(0x0489, 0xE03D) }, |
70 | { USB_DEVICE(0x0489, 0xE027) }, | ||
70 | 71 | ||
71 | /* Atheros AR9285 Malbec with sflash firmware */ | 72 | /* Atheros AR9285 Malbec with sflash firmware */ |
72 | { USB_DEVICE(0x03F0, 0x311D) }, | 73 | { USB_DEVICE(0x03F0, 0x311D) }, |
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c index debda27df9b0..ee82f2fb65f0 100644 --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c | |||
@@ -124,6 +124,7 @@ static struct usb_device_id blacklist_table[] = { | |||
124 | { USB_DEVICE(0x13d3, 0x3304), .driver_info = BTUSB_IGNORE }, | 124 | { USB_DEVICE(0x13d3, 0x3304), .driver_info = BTUSB_IGNORE }, |
125 | { USB_DEVICE(0x0930, 0x0215), .driver_info = BTUSB_IGNORE }, | 125 | { USB_DEVICE(0x0930, 0x0215), .driver_info = BTUSB_IGNORE }, |
126 | { USB_DEVICE(0x0489, 0xe03d), .driver_info = BTUSB_IGNORE }, | 126 | { USB_DEVICE(0x0489, 0xe03d), .driver_info = BTUSB_IGNORE }, |
127 | { USB_DEVICE(0x0489, 0xe027), .driver_info = BTUSB_IGNORE }, | ||
127 | 128 | ||
128 | /* Atheros AR9285 Malbec with sflash firmware */ | 129 | /* Atheros AR9285 Malbec with sflash firmware */ |
129 | { USB_DEVICE(0x03f0, 0x311d), .driver_info = BTUSB_IGNORE }, | 130 | { USB_DEVICE(0x03f0, 0x311d), .driver_info = BTUSB_IGNORE }, |
diff --git a/drivers/bus/omap-ocp2scp.c b/drivers/bus/omap-ocp2scp.c index ff63560b8467..0c48b0e05ed6 100644 --- a/drivers/bus/omap-ocp2scp.c +++ b/drivers/bus/omap-ocp2scp.c | |||
@@ -22,6 +22,26 @@ | |||
22 | #include <linux/pm_runtime.h> | 22 | #include <linux/pm_runtime.h> |
23 | #include <linux/of.h> | 23 | #include <linux/of.h> |
24 | #include <linux/of_platform.h> | 24 | #include <linux/of_platform.h> |
25 | #include <linux/platform_data/omap_ocp2scp.h> | ||
26 | |||
27 | /** | ||
28 | * _count_resources - count for the number of resources | ||
29 | * @res: struct resource * | ||
30 | * | ||
31 | * Count and return the number of resources populated for the device that is | ||
32 | * connected to ocp2scp. | ||
33 | */ | ||
34 | static unsigned _count_resources(struct resource *res) | ||
35 | { | ||
36 | int cnt = 0; | ||
37 | |||
38 | while (res->start != res->end) { | ||
39 | cnt++; | ||
40 | res++; | ||
41 | } | ||
42 | |||
43 | return cnt; | ||
44 | } | ||
25 | 45 | ||
26 | static int ocp2scp_remove_devices(struct device *dev, void *c) | 46 | static int ocp2scp_remove_devices(struct device *dev, void *c) |
27 | { | 47 | { |
@@ -34,20 +54,62 @@ static int ocp2scp_remove_devices(struct device *dev, void *c) | |||
34 | 54 | ||
35 | static int __devinit omap_ocp2scp_probe(struct platform_device *pdev) | 55 | static int __devinit omap_ocp2scp_probe(struct platform_device *pdev) |
36 | { | 56 | { |
37 | int ret; | 57 | int ret; |
38 | struct device_node *np = pdev->dev.of_node; | 58 | unsigned res_cnt, i; |
59 | struct device_node *np = pdev->dev.of_node; | ||
60 | struct platform_device *pdev_child; | ||
61 | struct omap_ocp2scp_platform_data *pdata = pdev->dev.platform_data; | ||
62 | struct omap_ocp2scp_dev *dev; | ||
39 | 63 | ||
40 | if (np) { | 64 | if (np) { |
41 | ret = of_platform_populate(np, NULL, NULL, &pdev->dev); | 65 | ret = of_platform_populate(np, NULL, NULL, &pdev->dev); |
42 | if (ret) { | 66 | if (ret) { |
43 | dev_err(&pdev->dev, "failed to add resources for ocp2scp child\n"); | 67 | dev_err(&pdev->dev, |
68 | "failed to add resources for ocp2scp child\n"); | ||
44 | goto err0; | 69 | goto err0; |
45 | } | 70 | } |
71 | } else if (pdata) { | ||
72 | for (i = 0, dev = *pdata->devices; i < pdata->dev_cnt; i++, | ||
73 | dev++) { | ||
74 | res_cnt = _count_resources(dev->res); | ||
75 | |||
76 | pdev_child = platform_device_alloc(dev->drv_name, | ||
77 | PLATFORM_DEVID_AUTO); | ||
78 | if (!pdev_child) { | ||
79 | dev_err(&pdev->dev, | ||
80 | "failed to allocate mem for ocp2scp child\n"); | ||
81 | goto err0; | ||
82 | } | ||
83 | |||
84 | ret = platform_device_add_resources(pdev_child, | ||
85 | dev->res, res_cnt); | ||
86 | if (ret) { | ||
87 | dev_err(&pdev->dev, | ||
88 | "failed to add resources for ocp2scp child\n"); | ||
89 | goto err1; | ||
90 | } | ||
91 | |||
92 | pdev_child->dev.parent = &pdev->dev; | ||
93 | |||
94 | ret = platform_device_add(pdev_child); | ||
95 | if (ret) { | ||
96 | dev_err(&pdev->dev, | ||
97 | "failed to register ocp2scp child device\n"); | ||
98 | goto err1; | ||
99 | } | ||
100 | } | ||
101 | } else { | ||
102 | dev_err(&pdev->dev, "OCP2SCP initialized without plat data\n"); | ||
103 | return -EINVAL; | ||
46 | } | 104 | } |
105 | |||
47 | pm_runtime_enable(&pdev->dev); | 106 | pm_runtime_enable(&pdev->dev); |
48 | 107 | ||
49 | return 0; | 108 | return 0; |
50 | 109 | ||
110 | err1: | ||
111 | platform_device_put(pdev_child); | ||
112 | |||
51 | err0: | 113 | err0: |
52 | device_for_each_child(&pdev->dev, NULL, ocp2scp_remove_devices); | 114 | device_for_each_child(&pdev->dev, NULL, ocp2scp_remove_devices); |
53 | 115 | ||
diff --git a/drivers/clk/ux500/u8500_clk.c b/drivers/clk/ux500/u8500_clk.c index ca4a25ed844c..e2c17d187d98 100644 --- a/drivers/clk/ux500/u8500_clk.c +++ b/drivers/clk/ux500/u8500_clk.c | |||
@@ -40,7 +40,7 @@ void u8500_clk_init(void) | |||
40 | CLK_IS_ROOT|CLK_IGNORE_UNUSED, | 40 | CLK_IS_ROOT|CLK_IGNORE_UNUSED, |
41 | 32768); | 41 | 32768); |
42 | clk_register_clkdev(clk, "clk32k", NULL); | 42 | clk_register_clkdev(clk, "clk32k", NULL); |
43 | clk_register_clkdev(clk, NULL, "rtc-pl031"); | 43 | clk_register_clkdev(clk, "apb_pclk", "rtc-pl031"); |
44 | 44 | ||
45 | /* PRCMU clocks */ | 45 | /* PRCMU clocks */ |
46 | fw_version = prcmu_get_fw_version(); | 46 | fw_version = prcmu_get_fw_version(); |
@@ -228,10 +228,17 @@ void u8500_clk_init(void) | |||
228 | 228 | ||
229 | clk = clk_reg_prcc_pclk("p1_pclk2", "per1clk", U8500_CLKRST1_BASE, | 229 | clk = clk_reg_prcc_pclk("p1_pclk2", "per1clk", U8500_CLKRST1_BASE, |
230 | BIT(2), 0); | 230 | BIT(2), 0); |
231 | clk_register_clkdev(clk, "apb_pclk", "nmk-i2c.1"); | ||
232 | |||
231 | clk = clk_reg_prcc_pclk("p1_pclk3", "per1clk", U8500_CLKRST1_BASE, | 233 | clk = clk_reg_prcc_pclk("p1_pclk3", "per1clk", U8500_CLKRST1_BASE, |
232 | BIT(3), 0); | 234 | BIT(3), 0); |
235 | clk_register_clkdev(clk, "apb_pclk", "msp0"); | ||
236 | clk_register_clkdev(clk, "apb_pclk", "ux500-msp-i2s.0"); | ||
237 | |||
233 | clk = clk_reg_prcc_pclk("p1_pclk4", "per1clk", U8500_CLKRST1_BASE, | 238 | clk = clk_reg_prcc_pclk("p1_pclk4", "per1clk", U8500_CLKRST1_BASE, |
234 | BIT(4), 0); | 239 | BIT(4), 0); |
240 | clk_register_clkdev(clk, "apb_pclk", "msp1"); | ||
241 | clk_register_clkdev(clk, "apb_pclk", "ux500-msp-i2s.1"); | ||
235 | 242 | ||
236 | clk = clk_reg_prcc_pclk("p1_pclk5", "per1clk", U8500_CLKRST1_BASE, | 243 | clk = clk_reg_prcc_pclk("p1_pclk5", "per1clk", U8500_CLKRST1_BASE, |
237 | BIT(5), 0); | 244 | BIT(5), 0); |
@@ -239,6 +246,7 @@ void u8500_clk_init(void) | |||
239 | 246 | ||
240 | clk = clk_reg_prcc_pclk("p1_pclk6", "per1clk", U8500_CLKRST1_BASE, | 247 | clk = clk_reg_prcc_pclk("p1_pclk6", "per1clk", U8500_CLKRST1_BASE, |
241 | BIT(6), 0); | 248 | BIT(6), 0); |
249 | clk_register_clkdev(clk, "apb_pclk", "nmk-i2c.2"); | ||
242 | 250 | ||
243 | clk = clk_reg_prcc_pclk("p1_pclk7", "per1clk", U8500_CLKRST1_BASE, | 251 | clk = clk_reg_prcc_pclk("p1_pclk7", "per1clk", U8500_CLKRST1_BASE, |
244 | BIT(7), 0); | 252 | BIT(7), 0); |
@@ -246,6 +254,7 @@ void u8500_clk_init(void) | |||
246 | 254 | ||
247 | clk = clk_reg_prcc_pclk("p1_pclk8", "per1clk", U8500_CLKRST1_BASE, | 255 | clk = clk_reg_prcc_pclk("p1_pclk8", "per1clk", U8500_CLKRST1_BASE, |
248 | BIT(8), 0); | 256 | BIT(8), 0); |
257 | clk_register_clkdev(clk, "apb_pclk", "slimbus0"); | ||
249 | 258 | ||
250 | clk = clk_reg_prcc_pclk("p1_pclk9", "per1clk", U8500_CLKRST1_BASE, | 259 | clk = clk_reg_prcc_pclk("p1_pclk9", "per1clk", U8500_CLKRST1_BASE, |
251 | BIT(9), 0); | 260 | BIT(9), 0); |
@@ -255,11 +264,16 @@ void u8500_clk_init(void) | |||
255 | 264 | ||
256 | clk = clk_reg_prcc_pclk("p1_pclk10", "per1clk", U8500_CLKRST1_BASE, | 265 | clk = clk_reg_prcc_pclk("p1_pclk10", "per1clk", U8500_CLKRST1_BASE, |
257 | BIT(10), 0); | 266 | BIT(10), 0); |
267 | clk_register_clkdev(clk, "apb_pclk", "nmk-i2c.4"); | ||
268 | |||
258 | clk = clk_reg_prcc_pclk("p1_pclk11", "per1clk", U8500_CLKRST1_BASE, | 269 | clk = clk_reg_prcc_pclk("p1_pclk11", "per1clk", U8500_CLKRST1_BASE, |
259 | BIT(11), 0); | 270 | BIT(11), 0); |
271 | clk_register_clkdev(clk, "apb_pclk", "msp3"); | ||
272 | clk_register_clkdev(clk, "apb_pclk", "ux500-msp-i2s.3"); | ||
260 | 273 | ||
261 | clk = clk_reg_prcc_pclk("p2_pclk0", "per2clk", U8500_CLKRST2_BASE, | 274 | clk = clk_reg_prcc_pclk("p2_pclk0", "per2clk", U8500_CLKRST2_BASE, |
262 | BIT(0), 0); | 275 | BIT(0), 0); |
276 | clk_register_clkdev(clk, "apb_pclk", "nmk-i2c.3"); | ||
263 | 277 | ||
264 | clk = clk_reg_prcc_pclk("p2_pclk1", "per2clk", U8500_CLKRST2_BASE, | 278 | clk = clk_reg_prcc_pclk("p2_pclk1", "per2clk", U8500_CLKRST2_BASE, |
265 | BIT(1), 0); | 279 | BIT(1), 0); |
@@ -279,12 +293,13 @@ void u8500_clk_init(void) | |||
279 | 293 | ||
280 | clk = clk_reg_prcc_pclk("p2_pclk5", "per2clk", U8500_CLKRST2_BASE, | 294 | clk = clk_reg_prcc_pclk("p2_pclk5", "per2clk", U8500_CLKRST2_BASE, |
281 | BIT(5), 0); | 295 | BIT(5), 0); |
296 | clk_register_clkdev(clk, "apb_pclk", "msp2"); | ||
297 | clk_register_clkdev(clk, "apb_pclk", "ux500-msp-i2s.2"); | ||
282 | 298 | ||
283 | clk = clk_reg_prcc_pclk("p2_pclk6", "per2clk", U8500_CLKRST2_BASE, | 299 | clk = clk_reg_prcc_pclk("p2_pclk6", "per2clk", U8500_CLKRST2_BASE, |
284 | BIT(6), 0); | 300 | BIT(6), 0); |
285 | clk_register_clkdev(clk, "apb_pclk", "sdi1"); | 301 | clk_register_clkdev(clk, "apb_pclk", "sdi1"); |
286 | 302 | ||
287 | |||
288 | clk = clk_reg_prcc_pclk("p2_pclk7", "per2clk", U8500_CLKRST2_BASE, | 303 | clk = clk_reg_prcc_pclk("p2_pclk7", "per2clk", U8500_CLKRST2_BASE, |
289 | BIT(7), 0); | 304 | BIT(7), 0); |
290 | clk_register_clkdev(clk, "apb_pclk", "sdi3"); | 305 | clk_register_clkdev(clk, "apb_pclk", "sdi3"); |
@@ -316,10 +331,15 @@ void u8500_clk_init(void) | |||
316 | 331 | ||
317 | clk = clk_reg_prcc_pclk("p3_pclk1", "per3clk", U8500_CLKRST3_BASE, | 332 | clk = clk_reg_prcc_pclk("p3_pclk1", "per3clk", U8500_CLKRST3_BASE, |
318 | BIT(1), 0); | 333 | BIT(1), 0); |
334 | clk_register_clkdev(clk, "apb_pclk", "ssp0"); | ||
335 | |||
319 | clk = clk_reg_prcc_pclk("p3_pclk2", "per3clk", U8500_CLKRST3_BASE, | 336 | clk = clk_reg_prcc_pclk("p3_pclk2", "per3clk", U8500_CLKRST3_BASE, |
320 | BIT(2), 0); | 337 | BIT(2), 0); |
338 | clk_register_clkdev(clk, "apb_pclk", "ssp1"); | ||
339 | |||
321 | clk = clk_reg_prcc_pclk("p3_pclk3", "per3clk", U8500_CLKRST3_BASE, | 340 | clk = clk_reg_prcc_pclk("p3_pclk3", "per3clk", U8500_CLKRST3_BASE, |
322 | BIT(3), 0); | 341 | BIT(3), 0); |
342 | clk_register_clkdev(clk, "apb_pclk", "nmk-i2c.0"); | ||
323 | 343 | ||
324 | clk = clk_reg_prcc_pclk("p3_pclk4", "per3clk", U8500_CLKRST3_BASE, | 344 | clk = clk_reg_prcc_pclk("p3_pclk4", "per3clk", U8500_CLKRST3_BASE, |
325 | BIT(4), 0); | 345 | BIT(4), 0); |
@@ -401,10 +421,17 @@ void u8500_clk_init(void) | |||
401 | 421 | ||
402 | clk = clk_reg_prcc_kclk("p1_i2c1_kclk", "i2cclk", | 422 | clk = clk_reg_prcc_kclk("p1_i2c1_kclk", "i2cclk", |
403 | U8500_CLKRST1_BASE, BIT(2), CLK_SET_RATE_GATE); | 423 | U8500_CLKRST1_BASE, BIT(2), CLK_SET_RATE_GATE); |
424 | clk_register_clkdev(clk, NULL, "nmk-i2c.1"); | ||
425 | |||
404 | clk = clk_reg_prcc_kclk("p1_msp0_kclk", "msp02clk", | 426 | clk = clk_reg_prcc_kclk("p1_msp0_kclk", "msp02clk", |
405 | U8500_CLKRST1_BASE, BIT(3), CLK_SET_RATE_GATE); | 427 | U8500_CLKRST1_BASE, BIT(3), CLK_SET_RATE_GATE); |
428 | clk_register_clkdev(clk, NULL, "msp0"); | ||
429 | clk_register_clkdev(clk, NULL, "ux500-msp-i2s.0"); | ||
430 | |||
406 | clk = clk_reg_prcc_kclk("p1_msp1_kclk", "msp1clk", | 431 | clk = clk_reg_prcc_kclk("p1_msp1_kclk", "msp1clk", |
407 | U8500_CLKRST1_BASE, BIT(4), CLK_SET_RATE_GATE); | 432 | U8500_CLKRST1_BASE, BIT(4), CLK_SET_RATE_GATE); |
433 | clk_register_clkdev(clk, NULL, "msp1"); | ||
434 | clk_register_clkdev(clk, NULL, "ux500-msp-i2s.1"); | ||
408 | 435 | ||
409 | clk = clk_reg_prcc_kclk("p1_sdi0_kclk", "sdmmcclk", | 436 | clk = clk_reg_prcc_kclk("p1_sdi0_kclk", "sdmmcclk", |
410 | U8500_CLKRST1_BASE, BIT(5), CLK_SET_RATE_GATE); | 437 | U8500_CLKRST1_BASE, BIT(5), CLK_SET_RATE_GATE); |
@@ -412,17 +439,25 @@ void u8500_clk_init(void) | |||
412 | 439 | ||
413 | clk = clk_reg_prcc_kclk("p1_i2c2_kclk", "i2cclk", | 440 | clk = clk_reg_prcc_kclk("p1_i2c2_kclk", "i2cclk", |
414 | U8500_CLKRST1_BASE, BIT(6), CLK_SET_RATE_GATE); | 441 | U8500_CLKRST1_BASE, BIT(6), CLK_SET_RATE_GATE); |
442 | clk_register_clkdev(clk, NULL, "nmk-i2c.2"); | ||
443 | |||
415 | clk = clk_reg_prcc_kclk("p1_slimbus0_kclk", "slimclk", | 444 | clk = clk_reg_prcc_kclk("p1_slimbus0_kclk", "slimclk", |
416 | U8500_CLKRST1_BASE, BIT(3), CLK_SET_RATE_GATE); | 445 | U8500_CLKRST1_BASE, BIT(8), CLK_SET_RATE_GATE); |
417 | /* FIXME: Redefinition of BIT(3). */ | 446 | clk_register_clkdev(clk, NULL, "slimbus0"); |
447 | |||
418 | clk = clk_reg_prcc_kclk("p1_i2c4_kclk", "i2cclk", | 448 | clk = clk_reg_prcc_kclk("p1_i2c4_kclk", "i2cclk", |
419 | U8500_CLKRST1_BASE, BIT(9), CLK_SET_RATE_GATE); | 449 | U8500_CLKRST1_BASE, BIT(9), CLK_SET_RATE_GATE); |
450 | clk_register_clkdev(clk, NULL, "nmk-i2c.4"); | ||
451 | |||
420 | clk = clk_reg_prcc_kclk("p1_msp3_kclk", "msp1clk", | 452 | clk = clk_reg_prcc_kclk("p1_msp3_kclk", "msp1clk", |
421 | U8500_CLKRST1_BASE, BIT(10), CLK_SET_RATE_GATE); | 453 | U8500_CLKRST1_BASE, BIT(10), CLK_SET_RATE_GATE); |
454 | clk_register_clkdev(clk, NULL, "msp3"); | ||
455 | clk_register_clkdev(clk, NULL, "ux500-msp-i2s.3"); | ||
422 | 456 | ||
423 | /* Periph2 */ | 457 | /* Periph2 */ |
424 | clk = clk_reg_prcc_kclk("p2_i2c3_kclk", "i2cclk", | 458 | clk = clk_reg_prcc_kclk("p2_i2c3_kclk", "i2cclk", |
425 | U8500_CLKRST2_BASE, BIT(0), CLK_SET_RATE_GATE); | 459 | U8500_CLKRST2_BASE, BIT(0), CLK_SET_RATE_GATE); |
460 | clk_register_clkdev(clk, NULL, "nmk-i2c.3"); | ||
426 | 461 | ||
427 | clk = clk_reg_prcc_kclk("p2_sdi4_kclk", "sdmmcclk", | 462 | clk = clk_reg_prcc_kclk("p2_sdi4_kclk", "sdmmcclk", |
428 | U8500_CLKRST2_BASE, BIT(2), CLK_SET_RATE_GATE); | 463 | U8500_CLKRST2_BASE, BIT(2), CLK_SET_RATE_GATE); |
@@ -430,6 +465,8 @@ void u8500_clk_init(void) | |||
430 | 465 | ||
431 | clk = clk_reg_prcc_kclk("p2_msp2_kclk", "msp02clk", | 466 | clk = clk_reg_prcc_kclk("p2_msp2_kclk", "msp02clk", |
432 | U8500_CLKRST2_BASE, BIT(3), CLK_SET_RATE_GATE); | 467 | U8500_CLKRST2_BASE, BIT(3), CLK_SET_RATE_GATE); |
468 | clk_register_clkdev(clk, NULL, "msp2"); | ||
469 | clk_register_clkdev(clk, NULL, "ux500-msp-i2s.2"); | ||
433 | 470 | ||
434 | clk = clk_reg_prcc_kclk("p2_sdi1_kclk", "sdmmcclk", | 471 | clk = clk_reg_prcc_kclk("p2_sdi1_kclk", "sdmmcclk", |
435 | U8500_CLKRST2_BASE, BIT(4), CLK_SET_RATE_GATE); | 472 | U8500_CLKRST2_BASE, BIT(4), CLK_SET_RATE_GATE); |
@@ -450,10 +487,15 @@ void u8500_clk_init(void) | |||
450 | /* Periph3 */ | 487 | /* Periph3 */ |
451 | clk = clk_reg_prcc_kclk("p3_ssp0_kclk", "sspclk", | 488 | clk = clk_reg_prcc_kclk("p3_ssp0_kclk", "sspclk", |
452 | U8500_CLKRST3_BASE, BIT(1), CLK_SET_RATE_GATE); | 489 | U8500_CLKRST3_BASE, BIT(1), CLK_SET_RATE_GATE); |
490 | clk_register_clkdev(clk, NULL, "ssp0"); | ||
491 | |||
453 | clk = clk_reg_prcc_kclk("p3_ssp1_kclk", "sspclk", | 492 | clk = clk_reg_prcc_kclk("p3_ssp1_kclk", "sspclk", |
454 | U8500_CLKRST3_BASE, BIT(2), CLK_SET_RATE_GATE); | 493 | U8500_CLKRST3_BASE, BIT(2), CLK_SET_RATE_GATE); |
494 | clk_register_clkdev(clk, NULL, "ssp1"); | ||
495 | |||
455 | clk = clk_reg_prcc_kclk("p3_i2c0_kclk", "i2cclk", | 496 | clk = clk_reg_prcc_kclk("p3_i2c0_kclk", "i2cclk", |
456 | U8500_CLKRST3_BASE, BIT(3), CLK_SET_RATE_GATE); | 497 | U8500_CLKRST3_BASE, BIT(3), CLK_SET_RATE_GATE); |
498 | clk_register_clkdev(clk, NULL, "nmk-i2c.0"); | ||
457 | 499 | ||
458 | clk = clk_reg_prcc_kclk("p3_sdi2_kclk", "sdmmcclk", | 500 | clk = clk_reg_prcc_kclk("p3_sdi2_kclk", "sdmmcclk", |
459 | U8500_CLKRST3_BASE, BIT(4), CLK_SET_RATE_GATE); | 501 | U8500_CLKRST3_BASE, BIT(4), CLK_SET_RATE_GATE); |
diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig index f11d8e3b4041..6dbc4031f825 100644 --- a/drivers/gpio/Kconfig +++ b/drivers/gpio/Kconfig | |||
@@ -152,7 +152,7 @@ config GPIO_MSM_V2 | |||
152 | 152 | ||
153 | config GPIO_MVEBU | 153 | config GPIO_MVEBU |
154 | def_bool y | 154 | def_bool y |
155 | depends on ARCH_MVEBU | 155 | depends on PLAT_ORION |
156 | select GPIO_GENERIC | 156 | select GPIO_GENERIC |
157 | select GENERIC_IRQ_CHIP | 157 | select GENERIC_IRQ_CHIP |
158 | 158 | ||
diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c index b726b478a4f5..6345878ae1e7 100644 --- a/drivers/gpu/drm/i915/intel_crt.c +++ b/drivers/gpu/drm/i915/intel_crt.c | |||
@@ -143,7 +143,7 @@ static void intel_crt_dpms(struct drm_connector *connector, int mode) | |||
143 | int old_dpms; | 143 | int old_dpms; |
144 | 144 | ||
145 | /* PCH platforms and VLV only support on/off. */ | 145 | /* PCH platforms and VLV only support on/off. */ |
146 | if (INTEL_INFO(dev)->gen < 5 && mode != DRM_MODE_DPMS_ON) | 146 | if (INTEL_INFO(dev)->gen >= 5 && mode != DRM_MODE_DPMS_ON) |
147 | mode = DRM_MODE_DPMS_OFF; | 147 | mode = DRM_MODE_DPMS_OFF; |
148 | 148 | ||
149 | if (mode == connector->dpms) | 149 | if (mode == connector->dpms) |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 461a637f1ef7..4154bcd7a070 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -3841,6 +3841,17 @@ static bool intel_choose_pipe_bpp_dither(struct drm_crtc *crtc, | |||
3841 | } | 3841 | } |
3842 | } | 3842 | } |
3843 | 3843 | ||
3844 | if (intel_encoder->type == INTEL_OUTPUT_EDP) { | ||
3845 | /* Use VBT settings if we have an eDP panel */ | ||
3846 | unsigned int edp_bpc = dev_priv->edp.bpp / 3; | ||
3847 | |||
3848 | if (edp_bpc < display_bpc) { | ||
3849 | DRM_DEBUG_KMS("clamping display bpc (was %d) to eDP (%d)\n", display_bpc, edp_bpc); | ||
3850 | display_bpc = edp_bpc; | ||
3851 | } | ||
3852 | continue; | ||
3853 | } | ||
3854 | |||
3844 | /* | 3855 | /* |
3845 | * HDMI is either 12 or 8, so if the display lets 10bpc sneak | 3856 | * HDMI is either 12 or 8, so if the display lets 10bpc sneak |
3846 | * through, clamp it down. (Note: >12bpc will be caught below.) | 3857 | * through, clamp it down. (Note: >12bpc will be caught below.) |
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c index 79d308da29ff..c600fb06e25e 100644 --- a/drivers/gpu/drm/i915/intel_sdvo.c +++ b/drivers/gpu/drm/i915/intel_sdvo.c | |||
@@ -2382,6 +2382,18 @@ intel_sdvo_output_setup(struct intel_sdvo *intel_sdvo, uint16_t flags) | |||
2382 | return true; | 2382 | return true; |
2383 | } | 2383 | } |
2384 | 2384 | ||
2385 | static void intel_sdvo_output_cleanup(struct intel_sdvo *intel_sdvo) | ||
2386 | { | ||
2387 | struct drm_device *dev = intel_sdvo->base.base.dev; | ||
2388 | struct drm_connector *connector, *tmp; | ||
2389 | |||
2390 | list_for_each_entry_safe(connector, tmp, | ||
2391 | &dev->mode_config.connector_list, head) { | ||
2392 | if (intel_attached_encoder(connector) == &intel_sdvo->base) | ||
2393 | intel_sdvo_destroy(connector); | ||
2394 | } | ||
2395 | } | ||
2396 | |||
2385 | static bool intel_sdvo_tv_create_property(struct intel_sdvo *intel_sdvo, | 2397 | static bool intel_sdvo_tv_create_property(struct intel_sdvo *intel_sdvo, |
2386 | struct intel_sdvo_connector *intel_sdvo_connector, | 2398 | struct intel_sdvo_connector *intel_sdvo_connector, |
2387 | int type) | 2399 | int type) |
@@ -2705,7 +2717,8 @@ bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg, bool is_sdvob) | |||
2705 | intel_sdvo->caps.output_flags) != true) { | 2717 | intel_sdvo->caps.output_flags) != true) { |
2706 | DRM_DEBUG_KMS("SDVO output failed to setup on %s\n", | 2718 | DRM_DEBUG_KMS("SDVO output failed to setup on %s\n", |
2707 | SDVO_NAME(intel_sdvo)); | 2719 | SDVO_NAME(intel_sdvo)); |
2708 | goto err; | 2720 | /* Output_setup can leave behind connectors! */ |
2721 | goto err_output; | ||
2709 | } | 2722 | } |
2710 | 2723 | ||
2711 | /* Only enable the hotplug irq if we need it, to work around noisy | 2724 | /* Only enable the hotplug irq if we need it, to work around noisy |
@@ -2718,12 +2731,12 @@ bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg, bool is_sdvob) | |||
2718 | 2731 | ||
2719 | /* Set the input timing to the screen. Assume always input 0. */ | 2732 | /* Set the input timing to the screen. Assume always input 0. */ |
2720 | if (!intel_sdvo_set_target_input(intel_sdvo)) | 2733 | if (!intel_sdvo_set_target_input(intel_sdvo)) |
2721 | goto err; | 2734 | goto err_output; |
2722 | 2735 | ||
2723 | if (!intel_sdvo_get_input_pixel_clock_range(intel_sdvo, | 2736 | if (!intel_sdvo_get_input_pixel_clock_range(intel_sdvo, |
2724 | &intel_sdvo->pixel_clock_min, | 2737 | &intel_sdvo->pixel_clock_min, |
2725 | &intel_sdvo->pixel_clock_max)) | 2738 | &intel_sdvo->pixel_clock_max)) |
2726 | goto err; | 2739 | goto err_output; |
2727 | 2740 | ||
2728 | DRM_DEBUG_KMS("%s device VID/DID: %02X:%02X.%02X, " | 2741 | DRM_DEBUG_KMS("%s device VID/DID: %02X:%02X.%02X, " |
2729 | "clock range %dMHz - %dMHz, " | 2742 | "clock range %dMHz - %dMHz, " |
@@ -2743,6 +2756,9 @@ bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg, bool is_sdvob) | |||
2743 | (SDVO_OUTPUT_TMDS1 | SDVO_OUTPUT_RGB1) ? 'Y' : 'N'); | 2756 | (SDVO_OUTPUT_TMDS1 | SDVO_OUTPUT_RGB1) ? 'Y' : 'N'); |
2744 | return true; | 2757 | return true; |
2745 | 2758 | ||
2759 | err_output: | ||
2760 | intel_sdvo_output_cleanup(intel_sdvo); | ||
2761 | |||
2746 | err: | 2762 | err: |
2747 | drm_encoder_cleanup(&intel_encoder->base); | 2763 | drm_encoder_cleanup(&intel_encoder->base); |
2748 | i2c_del_adapter(&intel_sdvo->ddc); | 2764 | i2c_del_adapter(&intel_sdvo->ddc); |
diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c index ba498f8e47a2..010bae19554a 100644 --- a/drivers/gpu/drm/radeon/atombios_encoders.c +++ b/drivers/gpu/drm/radeon/atombios_encoders.c | |||
@@ -1625,7 +1625,7 @@ radeon_atom_encoder_dpms_dig(struct drm_encoder *encoder, int mode) | |||
1625 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_SETUP, 0, 0); | 1625 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_SETUP, 0, 0); |
1626 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0); | 1626 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0); |
1627 | /* some early dce3.2 boards have a bug in their transmitter control table */ | 1627 | /* some early dce3.2 boards have a bug in their transmitter control table */ |
1628 | if ((rdev->family != CHIP_RV710) || (rdev->family != CHIP_RV730)) | 1628 | if ((rdev->family != CHIP_RV710) && (rdev->family != CHIP_RV730)) |
1629 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT, 0, 0); | 1629 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT, 0, 0); |
1630 | } | 1630 | } |
1631 | if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(encoder)) && connector) { | 1631 | if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(encoder)) && connector) { |
diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c index 860dc4813e99..bd2a3b40cd12 100644 --- a/drivers/gpu/drm/ttm/ttm_page_alloc.c +++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c | |||
@@ -749,7 +749,10 @@ static int ttm_get_pages(struct page **pages, unsigned npages, int flags, | |||
749 | /* clear the pages coming from the pool if requested */ | 749 | /* clear the pages coming from the pool if requested */ |
750 | if (flags & TTM_PAGE_FLAG_ZERO_ALLOC) { | 750 | if (flags & TTM_PAGE_FLAG_ZERO_ALLOC) { |
751 | list_for_each_entry(p, &plist, lru) { | 751 | list_for_each_entry(p, &plist, lru) { |
752 | clear_page(page_address(p)); | 752 | if (PageHighMem(p)) |
753 | clear_highpage(p); | ||
754 | else | ||
755 | clear_page(page_address(p)); | ||
753 | } | 756 | } |
754 | } | 757 | } |
755 | 758 | ||
diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c index bf8260133ea9..7d759a430294 100644 --- a/drivers/gpu/drm/ttm/ttm_tt.c +++ b/drivers/gpu/drm/ttm/ttm_tt.c | |||
@@ -308,9 +308,7 @@ int ttm_tt_swapin(struct ttm_tt *ttm) | |||
308 | if (unlikely(to_page == NULL)) | 308 | if (unlikely(to_page == NULL)) |
309 | goto out_err; | 309 | goto out_err; |
310 | 310 | ||
311 | preempt_disable(); | ||
312 | copy_highpage(to_page, from_page); | 311 | copy_highpage(to_page, from_page); |
313 | preempt_enable(); | ||
314 | page_cache_release(from_page); | 312 | page_cache_release(from_page); |
315 | } | 313 | } |
316 | 314 | ||
@@ -358,9 +356,7 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistent_swap_storage) | |||
358 | ret = PTR_ERR(to_page); | 356 | ret = PTR_ERR(to_page); |
359 | goto out_err; | 357 | goto out_err; |
360 | } | 358 | } |
361 | preempt_disable(); | ||
362 | copy_highpage(to_page, from_page); | 359 | copy_highpage(to_page, from_page); |
363 | preempt_enable(); | ||
364 | set_page_dirty(to_page); | 360 | set_page_dirty(to_page); |
365 | mark_page_accessed(to_page); | 361 | mark_page_accessed(to_page); |
366 | page_cache_release(to_page); | 362 | page_cache_release(to_page); |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c index b07ca2e4d04b..7290811f89be 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c | |||
@@ -110,6 +110,8 @@ int vmw_get_cap_3d_ioctl(struct drm_device *dev, void *data, | |||
110 | memcpy_fromio(bounce, &fifo_mem[SVGA_FIFO_3D_CAPS], size); | 110 | memcpy_fromio(bounce, &fifo_mem[SVGA_FIFO_3D_CAPS], size); |
111 | 111 | ||
112 | ret = copy_to_user(buffer, bounce, size); | 112 | ret = copy_to_user(buffer, bounce, size); |
113 | if (ret) | ||
114 | ret = -EFAULT; | ||
113 | vfree(bounce); | 115 | vfree(bounce); |
114 | 116 | ||
115 | if (unlikely(ret != 0)) | 117 | if (unlikely(ret != 0)) |
diff --git a/drivers/hid/hid-microsoft.c b/drivers/hid/hid-microsoft.c index f676c01bb471..6fcd466d0825 100644 --- a/drivers/hid/hid-microsoft.c +++ b/drivers/hid/hid-microsoft.c | |||
@@ -46,9 +46,9 @@ static __u8 *ms_report_fixup(struct hid_device *hdev, __u8 *rdesc, | |||
46 | rdesc[559] = 0x45; | 46 | rdesc[559] = 0x45; |
47 | } | 47 | } |
48 | /* the same as above (s/usage/physical/) */ | 48 | /* the same as above (s/usage/physical/) */ |
49 | if ((quirks & MS_RDESC_3K) && *rsize == 106 && | 49 | if ((quirks & MS_RDESC_3K) && *rsize == 106 && rdesc[94] == 0x19 && |
50 | !memcmp((char []){ 0x19, 0x00, 0x29, 0xff }, | 50 | rdesc[95] == 0x00 && rdesc[96] == 0x29 && |
51 | &rdesc[94], 4)) { | 51 | rdesc[97] == 0xff) { |
52 | rdesc[94] = 0x35; | 52 | rdesc[94] = 0x35; |
53 | rdesc[96] = 0x45; | 53 | rdesc[96] = 0x45; |
54 | } | 54 | } |
diff --git a/drivers/i2c/muxes/i2c-mux-pinctrl.c b/drivers/i2c/muxes/i2c-mux-pinctrl.c index 5f097f309b9f..7fa5b24b16db 100644 --- a/drivers/i2c/muxes/i2c-mux-pinctrl.c +++ b/drivers/i2c/muxes/i2c-mux-pinctrl.c | |||
@@ -169,7 +169,7 @@ static int __devinit i2c_mux_pinctrl_probe(struct platform_device *pdev) | |||
169 | mux->busses = devm_kzalloc(&pdev->dev, | 169 | mux->busses = devm_kzalloc(&pdev->dev, |
170 | sizeof(mux->busses) * mux->pdata->bus_count, | 170 | sizeof(mux->busses) * mux->pdata->bus_count, |
171 | GFP_KERNEL); | 171 | GFP_KERNEL); |
172 | if (!mux->states) { | 172 | if (!mux->busses) { |
173 | dev_err(&pdev->dev, "Cannot allocate busses\n"); | 173 | dev_err(&pdev->dev, "Cannot allocate busses\n"); |
174 | ret = -ENOMEM; | 174 | ret = -ENOMEM; |
175 | goto err; | 175 | goto err; |
diff --git a/drivers/irqchip/irq-bcm2835.c b/drivers/irqchip/irq-bcm2835.c index dc670ccc6978..16c78f1c5ef2 100644 --- a/drivers/irqchip/irq-bcm2835.c +++ b/drivers/irqchip/irq-bcm2835.c | |||
@@ -168,7 +168,8 @@ static int __init armctrl_of_init(struct device_node *node, | |||
168 | } | 168 | } |
169 | 169 | ||
170 | static struct of_device_id irq_of_match[] __initconst = { | 170 | static struct of_device_id irq_of_match[] __initconst = { |
171 | { .compatible = "brcm,bcm2835-armctrl-ic", .data = armctrl_of_init } | 171 | { .compatible = "brcm,bcm2835-armctrl-ic", .data = armctrl_of_init }, |
172 | { } | ||
172 | }; | 173 | }; |
173 | 174 | ||
174 | void __init bcm2835_init_irq(void) | 175 | void __init bcm2835_init_irq(void) |
diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig index f508defc0d96..b58bc8a14b9c 100644 --- a/drivers/leds/Kconfig +++ b/drivers/leds/Kconfig | |||
@@ -379,7 +379,9 @@ config LEDS_NS2 | |||
379 | tristate "LED support for Network Space v2 GPIO LEDs" | 379 | tristate "LED support for Network Space v2 GPIO LEDs" |
380 | depends on LEDS_CLASS | 380 | depends on LEDS_CLASS |
381 | depends on MACH_NETSPACE_V2 || MACH_INETSPACE_V2 || \ | 381 | depends on MACH_NETSPACE_V2 || MACH_INETSPACE_V2 || \ |
382 | MACH_NETSPACE_MAX_V2 || MACH_D2NET_V2 | 382 | MACH_NETSPACE_MAX_V2 || MACH_D2NET_V2 || \ |
383 | MACH_NETSPACE_V2_DT || MACH_INETSPACE_V2_DT || \ | ||
384 | MACH_NETSPACE_MAX_V2_DT || MACH_NETSPACE_MINI_V2_DT | ||
383 | default y | 385 | default y |
384 | help | 386 | help |
385 | This option enable support for the dual-GPIO LED found on the | 387 | This option enable support for the dual-GPIO LED found on the |
diff --git a/drivers/leds/leds-ns2.c b/drivers/leds/leds-ns2.c index d176ec83f5d9..d64cc2227fd9 100644 --- a/drivers/leds/leds-ns2.c +++ b/drivers/leds/leds-ns2.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <linux/leds.h> | 30 | #include <linux/leds.h> |
31 | #include <linux/module.h> | 31 | #include <linux/module.h> |
32 | #include <linux/platform_data/leds-kirkwood-ns2.h> | 32 | #include <linux/platform_data/leds-kirkwood-ns2.h> |
33 | #include <linux/of_gpio.h> | ||
33 | 34 | ||
34 | /* | 35 | /* |
35 | * The Network Space v2 dual-GPIO LED is wired to a CPLD and can blink in | 36 | * The Network Space v2 dual-GPIO LED is wired to a CPLD and can blink in |
@@ -263,6 +264,62 @@ static void delete_ns2_led(struct ns2_led_data *led_dat) | |||
263 | gpio_free(led_dat->slow); | 264 | gpio_free(led_dat->slow); |
264 | } | 265 | } |
265 | 266 | ||
267 | #ifdef CONFIG_OF_GPIO | ||
268 | /* | ||
269 | * Translate OpenFirmware node properties into platform_data. | ||
270 | */ | ||
271 | static int __devinit | ||
272 | ns2_leds_get_of_pdata(struct device *dev, struct ns2_led_platform_data *pdata) | ||
273 | { | ||
274 | struct device_node *np = dev->of_node; | ||
275 | struct device_node *child; | ||
276 | struct ns2_led *leds; | ||
277 | int num_leds = 0; | ||
278 | int i = 0; | ||
279 | |||
280 | num_leds = of_get_child_count(np); | ||
281 | if (!num_leds) | ||
282 | return -ENODEV; | ||
283 | |||
284 | leds = devm_kzalloc(dev, num_leds * sizeof(struct ns2_led), | ||
285 | GFP_KERNEL); | ||
286 | if (!leds) | ||
287 | return -ENOMEM; | ||
288 | |||
289 | for_each_child_of_node(np, child) { | ||
290 | const char *string; | ||
291 | int ret; | ||
292 | |||
293 | ret = of_get_named_gpio(child, "cmd-gpio", 0); | ||
294 | if (ret < 0) | ||
295 | return ret; | ||
296 | leds[i].cmd = ret; | ||
297 | ret = of_get_named_gpio(child, "slow-gpio", 0); | ||
298 | if (ret < 0) | ||
299 | return ret; | ||
300 | leds[i].slow = ret; | ||
301 | ret = of_property_read_string(child, "label", &string); | ||
302 | leds[i].name = (ret == 0) ? string : child->name; | ||
303 | ret = of_property_read_string(child, "linux,default-trigger", | ||
304 | &string); | ||
305 | if (ret == 0) | ||
306 | leds[i].default_trigger = string; | ||
307 | |||
308 | i++; | ||
309 | } | ||
310 | |||
311 | pdata->leds = leds; | ||
312 | pdata->num_leds = num_leds; | ||
313 | |||
314 | return 0; | ||
315 | } | ||
316 | |||
317 | static const struct of_device_id of_ns2_leds_match[] = { | ||
318 | { .compatible = "lacie,ns2-leds", }, | ||
319 | {}, | ||
320 | }; | ||
321 | #endif /* CONFIG_OF_GPIO */ | ||
322 | |||
266 | static int __devinit ns2_led_probe(struct platform_device *pdev) | 323 | static int __devinit ns2_led_probe(struct platform_device *pdev) |
267 | { | 324 | { |
268 | struct ns2_led_platform_data *pdata = pdev->dev.platform_data; | 325 | struct ns2_led_platform_data *pdata = pdev->dev.platform_data; |
@@ -270,11 +327,25 @@ static int __devinit ns2_led_probe(struct platform_device *pdev) | |||
270 | int i; | 327 | int i; |
271 | int ret; | 328 | int ret; |
272 | 329 | ||
330 | #ifdef CONFIG_OF_GPIO | ||
331 | if (!pdata) { | ||
332 | pdata = devm_kzalloc(&pdev->dev, | ||
333 | sizeof(struct ns2_led_platform_data), | ||
334 | GFP_KERNEL); | ||
335 | if (!pdata) | ||
336 | return -ENOMEM; | ||
337 | |||
338 | ret = ns2_leds_get_of_pdata(&pdev->dev, pdata); | ||
339 | if (ret) | ||
340 | return ret; | ||
341 | } | ||
342 | #else | ||
273 | if (!pdata) | 343 | if (!pdata) |
274 | return -EINVAL; | 344 | return -EINVAL; |
345 | #endif /* CONFIG_OF_GPIO */ | ||
275 | 346 | ||
276 | leds_data = devm_kzalloc(&pdev->dev, sizeof(struct ns2_led_data) * | 347 | leds_data = devm_kzalloc(&pdev->dev, sizeof(struct ns2_led_data) * |
277 | pdata->num_leds, GFP_KERNEL); | 348 | pdata->num_leds, GFP_KERNEL); |
278 | if (!leds_data) | 349 | if (!leds_data) |
279 | return -ENOMEM; | 350 | return -ENOMEM; |
280 | 351 | ||
@@ -312,8 +383,9 @@ static struct platform_driver ns2_led_driver = { | |||
312 | .probe = ns2_led_probe, | 383 | .probe = ns2_led_probe, |
313 | .remove = __devexit_p(ns2_led_remove), | 384 | .remove = __devexit_p(ns2_led_remove), |
314 | .driver = { | 385 | .driver = { |
315 | .name = "leds-ns2", | 386 | .name = "leds-ns2", |
316 | .owner = THIS_MODULE, | 387 | .owner = THIS_MODULE, |
388 | .of_match_table = of_match_ptr(of_ns2_leds_match), | ||
317 | }, | 389 | }, |
318 | }; | 390 | }; |
319 | 391 | ||
diff --git a/drivers/leds/ledtrig-cpu.c b/drivers/leds/ledtrig-cpu.c index b312056da14d..4239b3955ff0 100644 --- a/drivers/leds/ledtrig-cpu.c +++ b/drivers/leds/ledtrig-cpu.c | |||
@@ -33,8 +33,6 @@ | |||
33 | struct led_trigger_cpu { | 33 | struct led_trigger_cpu { |
34 | char name[MAX_NAME_LEN]; | 34 | char name[MAX_NAME_LEN]; |
35 | struct led_trigger *_trig; | 35 | struct led_trigger *_trig; |
36 | struct mutex lock; | ||
37 | int lock_is_inited; | ||
38 | }; | 36 | }; |
39 | 37 | ||
40 | static DEFINE_PER_CPU(struct led_trigger_cpu, cpu_trig); | 38 | static DEFINE_PER_CPU(struct led_trigger_cpu, cpu_trig); |
@@ -50,12 +48,6 @@ void ledtrig_cpu(enum cpu_led_event ledevt) | |||
50 | { | 48 | { |
51 | struct led_trigger_cpu *trig = &__get_cpu_var(cpu_trig); | 49 | struct led_trigger_cpu *trig = &__get_cpu_var(cpu_trig); |
52 | 50 | ||
53 | /* mutex lock should be initialized before calling mutex_call() */ | ||
54 | if (!trig->lock_is_inited) | ||
55 | return; | ||
56 | |||
57 | mutex_lock(&trig->lock); | ||
58 | |||
59 | /* Locate the correct CPU LED */ | 51 | /* Locate the correct CPU LED */ |
60 | switch (ledevt) { | 52 | switch (ledevt) { |
61 | case CPU_LED_IDLE_END: | 53 | case CPU_LED_IDLE_END: |
@@ -75,8 +67,6 @@ void ledtrig_cpu(enum cpu_led_event ledevt) | |||
75 | /* Will leave the LED as it is */ | 67 | /* Will leave the LED as it is */ |
76 | break; | 68 | break; |
77 | } | 69 | } |
78 | |||
79 | mutex_unlock(&trig->lock); | ||
80 | } | 70 | } |
81 | EXPORT_SYMBOL(ledtrig_cpu); | 71 | EXPORT_SYMBOL(ledtrig_cpu); |
82 | 72 | ||
@@ -117,14 +107,9 @@ static int __init ledtrig_cpu_init(void) | |||
117 | for_each_possible_cpu(cpu) { | 107 | for_each_possible_cpu(cpu) { |
118 | struct led_trigger_cpu *trig = &per_cpu(cpu_trig, cpu); | 108 | struct led_trigger_cpu *trig = &per_cpu(cpu_trig, cpu); |
119 | 109 | ||
120 | mutex_init(&trig->lock); | ||
121 | |||
122 | snprintf(trig->name, MAX_NAME_LEN, "cpu%d", cpu); | 110 | snprintf(trig->name, MAX_NAME_LEN, "cpu%d", cpu); |
123 | 111 | ||
124 | mutex_lock(&trig->lock); | ||
125 | led_trigger_register_simple(trig->name, &trig->_trig); | 112 | led_trigger_register_simple(trig->name, &trig->_trig); |
126 | trig->lock_is_inited = 1; | ||
127 | mutex_unlock(&trig->lock); | ||
128 | } | 113 | } |
129 | 114 | ||
130 | register_syscore_ops(&ledtrig_cpu_syscore_ops); | 115 | register_syscore_ops(&ledtrig_cpu_syscore_ops); |
@@ -142,15 +127,9 @@ static void __exit ledtrig_cpu_exit(void) | |||
142 | for_each_possible_cpu(cpu) { | 127 | for_each_possible_cpu(cpu) { |
143 | struct led_trigger_cpu *trig = &per_cpu(cpu_trig, cpu); | 128 | struct led_trigger_cpu *trig = &per_cpu(cpu_trig, cpu); |
144 | 129 | ||
145 | mutex_lock(&trig->lock); | ||
146 | |||
147 | led_trigger_unregister_simple(trig->_trig); | 130 | led_trigger_unregister_simple(trig->_trig); |
148 | trig->_trig = NULL; | 131 | trig->_trig = NULL; |
149 | memset(trig->name, 0, MAX_NAME_LEN); | 132 | memset(trig->name, 0, MAX_NAME_LEN); |
150 | trig->lock_is_inited = 0; | ||
151 | |||
152 | mutex_unlock(&trig->lock); | ||
153 | mutex_destroy(&trig->lock); | ||
154 | } | 133 | } |
155 | 134 | ||
156 | unregister_syscore_ops(&ledtrig_cpu_syscore_ops); | 135 | unregister_syscore_ops(&ledtrig_cpu_syscore_ops); |
diff --git a/drivers/net/ethernet/jme.c b/drivers/net/ethernet/jme.c index 92317e9c0f73..60ac46f4ac08 100644 --- a/drivers/net/ethernet/jme.c +++ b/drivers/net/ethernet/jme.c | |||
@@ -1860,10 +1860,14 @@ jme_open(struct net_device *netdev) | |||
1860 | jme_clear_pm(jme); | 1860 | jme_clear_pm(jme); |
1861 | JME_NAPI_ENABLE(jme); | 1861 | JME_NAPI_ENABLE(jme); |
1862 | 1862 | ||
1863 | tasklet_enable(&jme->linkch_task); | 1863 | tasklet_init(&jme->linkch_task, jme_link_change_tasklet, |
1864 | tasklet_enable(&jme->txclean_task); | 1864 | (unsigned long) jme); |
1865 | tasklet_hi_enable(&jme->rxclean_task); | 1865 | tasklet_init(&jme->txclean_task, jme_tx_clean_tasklet, |
1866 | tasklet_hi_enable(&jme->rxempty_task); | 1866 | (unsigned long) jme); |
1867 | tasklet_init(&jme->rxclean_task, jme_rx_clean_tasklet, | ||
1868 | (unsigned long) jme); | ||
1869 | tasklet_init(&jme->rxempty_task, jme_rx_empty_tasklet, | ||
1870 | (unsigned long) jme); | ||
1867 | 1871 | ||
1868 | rc = jme_request_irq(jme); | 1872 | rc = jme_request_irq(jme); |
1869 | if (rc) | 1873 | if (rc) |
@@ -3079,22 +3083,6 @@ jme_init_one(struct pci_dev *pdev, | |||
3079 | tasklet_init(&jme->pcc_task, | 3083 | tasklet_init(&jme->pcc_task, |
3080 | jme_pcc_tasklet, | 3084 | jme_pcc_tasklet, |
3081 | (unsigned long) jme); | 3085 | (unsigned long) jme); |
3082 | tasklet_init(&jme->linkch_task, | ||
3083 | jme_link_change_tasklet, | ||
3084 | (unsigned long) jme); | ||
3085 | tasklet_init(&jme->txclean_task, | ||
3086 | jme_tx_clean_tasklet, | ||
3087 | (unsigned long) jme); | ||
3088 | tasklet_init(&jme->rxclean_task, | ||
3089 | jme_rx_clean_tasklet, | ||
3090 | (unsigned long) jme); | ||
3091 | tasklet_init(&jme->rxempty_task, | ||
3092 | jme_rx_empty_tasklet, | ||
3093 | (unsigned long) jme); | ||
3094 | tasklet_disable_nosync(&jme->linkch_task); | ||
3095 | tasklet_disable_nosync(&jme->txclean_task); | ||
3096 | tasklet_disable_nosync(&jme->rxclean_task); | ||
3097 | tasklet_disable_nosync(&jme->rxempty_task); | ||
3098 | jme->dpi.cur = PCC_P1; | 3086 | jme->dpi.cur = PCC_P1; |
3099 | 3087 | ||
3100 | jme->reg_ghc = 0; | 3088 | jme->reg_ghc = 0; |
diff --git a/drivers/net/ethernet/micrel/ksz884x.c b/drivers/net/ethernet/micrel/ksz884x.c index e558edd1cb6c..69e01977a1dd 100644 --- a/drivers/net/ethernet/micrel/ksz884x.c +++ b/drivers/net/ethernet/micrel/ksz884x.c | |||
@@ -5459,8 +5459,10 @@ static int prepare_hardware(struct net_device *dev) | |||
5459 | rc = request_irq(dev->irq, netdev_intr, IRQF_SHARED, dev->name, dev); | 5459 | rc = request_irq(dev->irq, netdev_intr, IRQF_SHARED, dev->name, dev); |
5460 | if (rc) | 5460 | if (rc) |
5461 | return rc; | 5461 | return rc; |
5462 | tasklet_enable(&hw_priv->rx_tasklet); | 5462 | tasklet_init(&hw_priv->rx_tasklet, rx_proc_task, |
5463 | tasklet_enable(&hw_priv->tx_tasklet); | 5463 | (unsigned long) hw_priv); |
5464 | tasklet_init(&hw_priv->tx_tasklet, tx_proc_task, | ||
5465 | (unsigned long) hw_priv); | ||
5464 | 5466 | ||
5465 | hw->promiscuous = 0; | 5467 | hw->promiscuous = 0; |
5466 | hw->all_multi = 0; | 5468 | hw->all_multi = 0; |
@@ -7033,16 +7035,6 @@ static int __devinit pcidev_init(struct pci_dev *pdev, | |||
7033 | spin_lock_init(&hw_priv->hwlock); | 7035 | spin_lock_init(&hw_priv->hwlock); |
7034 | mutex_init(&hw_priv->lock); | 7036 | mutex_init(&hw_priv->lock); |
7035 | 7037 | ||
7036 | /* tasklet is enabled. */ | ||
7037 | tasklet_init(&hw_priv->rx_tasklet, rx_proc_task, | ||
7038 | (unsigned long) hw_priv); | ||
7039 | tasklet_init(&hw_priv->tx_tasklet, tx_proc_task, | ||
7040 | (unsigned long) hw_priv); | ||
7041 | |||
7042 | /* tasklet_enable will decrement the atomic counter. */ | ||
7043 | tasklet_disable(&hw_priv->rx_tasklet); | ||
7044 | tasklet_disable(&hw_priv->tx_tasklet); | ||
7045 | |||
7046 | for (i = 0; i < TOTAL_PORT_NUM; i++) | 7038 | for (i = 0; i < TOTAL_PORT_NUM; i++) |
7047 | init_waitqueue_head(&hw_priv->counter[i].counter); | 7039 | init_waitqueue_head(&hw_priv->counter[i].counter); |
7048 | 7040 | ||
diff --git a/drivers/net/ethernet/smsc/smsc911x.c b/drivers/net/ethernet/smsc/smsc911x.c index 62d1baf111ea..c53c0f4e2ce3 100644 --- a/drivers/net/ethernet/smsc/smsc911x.c +++ b/drivers/net/ethernet/smsc/smsc911x.c | |||
@@ -2110,7 +2110,7 @@ static void __devinit smsc911x_read_mac_address(struct net_device *dev) | |||
2110 | static int __devinit smsc911x_init(struct net_device *dev) | 2110 | static int __devinit smsc911x_init(struct net_device *dev) |
2111 | { | 2111 | { |
2112 | struct smsc911x_data *pdata = netdev_priv(dev); | 2112 | struct smsc911x_data *pdata = netdev_priv(dev); |
2113 | unsigned int byte_test; | 2113 | unsigned int byte_test, mask; |
2114 | unsigned int to = 100; | 2114 | unsigned int to = 100; |
2115 | 2115 | ||
2116 | SMSC_TRACE(pdata, probe, "Driver Parameters:"); | 2116 | SMSC_TRACE(pdata, probe, "Driver Parameters:"); |
@@ -2130,9 +2130,22 @@ static int __devinit smsc911x_init(struct net_device *dev) | |||
2130 | /* | 2130 | /* |
2131 | * poll the READY bit in PMT_CTRL. Any other access to the device is | 2131 | * poll the READY bit in PMT_CTRL. Any other access to the device is |
2132 | * forbidden while this bit isn't set. Try for 100ms | 2132 | * forbidden while this bit isn't set. Try for 100ms |
2133 | * | ||
2134 | * Note that this test is done before the WORD_SWAP register is | ||
2135 | * programmed. So in some configurations the READY bit is at 16 before | ||
2136 | * WORD_SWAP is written to. This issue is worked around by waiting | ||
2137 | * until either bit 0 or bit 16 gets set in PMT_CTRL. | ||
2138 | * | ||
2139 | * SMSC has confirmed that checking bit 16 (marked as reserved in | ||
2140 | * the datasheet) is fine since these bits "will either never be set | ||
2141 | * or can only go high after READY does (so also indicate the device | ||
2142 | * is ready)". | ||
2133 | */ | 2143 | */ |
2134 | while (!(smsc911x_reg_read(pdata, PMT_CTRL) & PMT_CTRL_READY_) && --to) | 2144 | |
2145 | mask = PMT_CTRL_READY_ | swahw32(PMT_CTRL_READY_); | ||
2146 | while (!(smsc911x_reg_read(pdata, PMT_CTRL) & mask) && --to) | ||
2135 | udelay(1000); | 2147 | udelay(1000); |
2148 | |||
2136 | if (to == 0) { | 2149 | if (to == 0) { |
2137 | pr_err("Device not READY in 100ms aborting\n"); | 2150 | pr_err("Device not READY in 100ms aborting\n"); |
2138 | return -ENODEV; | 2151 | return -ENODEV; |
diff --git a/drivers/net/ethernet/tile/tilegx.c b/drivers/net/ethernet/tile/tilegx.c index 4e9810013850..66e025ad5df1 100644 --- a/drivers/net/ethernet/tile/tilegx.c +++ b/drivers/net/ethernet/tile/tilegx.c | |||
@@ -917,7 +917,7 @@ static int tile_net_setup_interrupts(struct net_device *dev) | |||
917 | ingress_irq = rc; | 917 | ingress_irq = rc; |
918 | tile_irq_activate(ingress_irq, TILE_IRQ_PERCPU); | 918 | tile_irq_activate(ingress_irq, TILE_IRQ_PERCPU); |
919 | rc = request_irq(ingress_irq, tile_net_handle_ingress_irq, | 919 | rc = request_irq(ingress_irq, tile_net_handle_ingress_irq, |
920 | 0, NULL, NULL); | 920 | 0, "tile_net", NULL); |
921 | if (rc != 0) { | 921 | if (rc != 0) { |
922 | netdev_err(dev, "request_irq failed: %d\n", rc); | 922 | netdev_err(dev, "request_irq failed: %d\n", rc); |
923 | destroy_irq(ingress_irq); | 923 | destroy_irq(ingress_irq); |
diff --git a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c index 1d04754a6637..77e6db9dcfed 100644 --- a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c +++ b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c | |||
@@ -942,6 +942,10 @@ static int axienet_open(struct net_device *ndev) | |||
942 | phy_start(lp->phy_dev); | 942 | phy_start(lp->phy_dev); |
943 | } | 943 | } |
944 | 944 | ||
945 | /* Enable tasklets for Axi DMA error handling */ | ||
946 | tasklet_init(&lp->dma_err_tasklet, axienet_dma_err_handler, | ||
947 | (unsigned long) lp); | ||
948 | |||
945 | /* Enable interrupts for Axi DMA Tx */ | 949 | /* Enable interrupts for Axi DMA Tx */ |
946 | ret = request_irq(lp->tx_irq, axienet_tx_irq, 0, ndev->name, ndev); | 950 | ret = request_irq(lp->tx_irq, axienet_tx_irq, 0, ndev->name, ndev); |
947 | if (ret) | 951 | if (ret) |
@@ -950,8 +954,7 @@ static int axienet_open(struct net_device *ndev) | |||
950 | ret = request_irq(lp->rx_irq, axienet_rx_irq, 0, ndev->name, ndev); | 954 | ret = request_irq(lp->rx_irq, axienet_rx_irq, 0, ndev->name, ndev); |
951 | if (ret) | 955 | if (ret) |
952 | goto err_rx_irq; | 956 | goto err_rx_irq; |
953 | /* Enable tasklets for Axi DMA error handling */ | 957 | |
954 | tasklet_enable(&lp->dma_err_tasklet); | ||
955 | return 0; | 958 | return 0; |
956 | 959 | ||
957 | err_rx_irq: | 960 | err_rx_irq: |
@@ -960,6 +963,7 @@ err_tx_irq: | |||
960 | if (lp->phy_dev) | 963 | if (lp->phy_dev) |
961 | phy_disconnect(lp->phy_dev); | 964 | phy_disconnect(lp->phy_dev); |
962 | lp->phy_dev = NULL; | 965 | lp->phy_dev = NULL; |
966 | tasklet_kill(&lp->dma_err_tasklet); | ||
963 | dev_err(lp->dev, "request_irq() failed\n"); | 967 | dev_err(lp->dev, "request_irq() failed\n"); |
964 | return ret; | 968 | return ret; |
965 | } | 969 | } |
@@ -1613,10 +1617,6 @@ static int __devinit axienet_of_probe(struct platform_device *op) | |||
1613 | goto err_iounmap_2; | 1617 | goto err_iounmap_2; |
1614 | } | 1618 | } |
1615 | 1619 | ||
1616 | tasklet_init(&lp->dma_err_tasklet, axienet_dma_err_handler, | ||
1617 | (unsigned long) lp); | ||
1618 | tasklet_disable(&lp->dma_err_tasklet); | ||
1619 | |||
1620 | return 0; | 1620 | return 0; |
1621 | 1621 | ||
1622 | err_iounmap_2: | 1622 | err_iounmap_2: |
diff --git a/drivers/net/phy/mdio-bitbang.c b/drivers/net/phy/mdio-bitbang.c index 6428fcbbdd4b..daec9b05d168 100644 --- a/drivers/net/phy/mdio-bitbang.c +++ b/drivers/net/phy/mdio-bitbang.c | |||
@@ -234,7 +234,6 @@ void free_mdio_bitbang(struct mii_bus *bus) | |||
234 | struct mdiobb_ctrl *ctrl = bus->priv; | 234 | struct mdiobb_ctrl *ctrl = bus->priv; |
235 | 235 | ||
236 | module_put(ctrl->ops->owner); | 236 | module_put(ctrl->ops->owner); |
237 | mdiobus_unregister(bus); | ||
238 | mdiobus_free(bus); | 237 | mdiobus_free(bus); |
239 | } | 238 | } |
240 | EXPORT_SYMBOL(free_mdio_bitbang); | 239 | EXPORT_SYMBOL(free_mdio_bitbang); |
diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c index 4cd582a4f625..74fab1a40156 100644 --- a/drivers/net/usb/cdc_ncm.c +++ b/drivers/net/usb/cdc_ncm.c | |||
@@ -540,10 +540,12 @@ advance: | |||
540 | (ctx->ether_desc == NULL) || (ctx->control != intf)) | 540 | (ctx->ether_desc == NULL) || (ctx->control != intf)) |
541 | goto error; | 541 | goto error; |
542 | 542 | ||
543 | /* claim interfaces, if any */ | 543 | /* claim data interface, if different from control */ |
544 | temp = usb_driver_claim_interface(driver, ctx->data, dev); | 544 | if (ctx->data != ctx->control) { |
545 | if (temp) | 545 | temp = usb_driver_claim_interface(driver, ctx->data, dev); |
546 | goto error; | 546 | if (temp) |
547 | goto error; | ||
548 | } | ||
547 | 549 | ||
548 | iface_no = ctx->data->cur_altsetting->desc.bInterfaceNumber; | 550 | iface_no = ctx->data->cur_altsetting->desc.bInterfaceNumber; |
549 | 551 | ||
@@ -623,6 +625,10 @@ static void cdc_ncm_unbind(struct usbnet *dev, struct usb_interface *intf) | |||
623 | 625 | ||
624 | tasklet_kill(&ctx->bh); | 626 | tasklet_kill(&ctx->bh); |
625 | 627 | ||
628 | /* handle devices with combined control and data interface */ | ||
629 | if (ctx->control == ctx->data) | ||
630 | ctx->data = NULL; | ||
631 | |||
626 | /* disconnect master --> disconnect slave */ | 632 | /* disconnect master --> disconnect slave */ |
627 | if (intf == ctx->control && ctx->data) { | 633 | if (intf == ctx->control && ctx->data) { |
628 | usb_set_intfdata(ctx->data, NULL); | 634 | usb_set_intfdata(ctx->data, NULL); |
@@ -1245,6 +1251,14 @@ static const struct usb_device_id cdc_devs[] = { | |||
1245 | .driver_info = (unsigned long) &wwan_info, | 1251 | .driver_info = (unsigned long) &wwan_info, |
1246 | }, | 1252 | }, |
1247 | 1253 | ||
1254 | /* Huawei NCM devices disguised as vendor specific */ | ||
1255 | { USB_VENDOR_AND_INTERFACE_INFO(0x12d1, 0xff, 0x02, 0x16), | ||
1256 | .driver_info = (unsigned long)&wwan_info, | ||
1257 | }, | ||
1258 | { USB_VENDOR_AND_INTERFACE_INFO(0x12d1, 0xff, 0x02, 0x46), | ||
1259 | .driver_info = (unsigned long)&wwan_info, | ||
1260 | }, | ||
1261 | |||
1248 | /* Generic CDC-NCM devices */ | 1262 | /* Generic CDC-NCM devices */ |
1249 | { USB_INTERFACE_INFO(USB_CLASS_COMM, | 1263 | { USB_INTERFACE_INFO(USB_CLASS_COMM, |
1250 | USB_CDC_SUBCLASS_NCM, USB_CDC_PROTO_NONE), | 1264 | USB_CDC_SUBCLASS_NCM, USB_CDC_PROTO_NONE), |
diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c index 3286166415b4..362cb8cfeb92 100644 --- a/drivers/net/usb/smsc95xx.c +++ b/drivers/net/usb/smsc95xx.c | |||
@@ -184,7 +184,7 @@ static int smsc95xx_mdio_read(struct net_device *netdev, int phy_id, int idx) | |||
184 | /* set the address, index & direction (read from PHY) */ | 184 | /* set the address, index & direction (read from PHY) */ |
185 | phy_id &= dev->mii.phy_id_mask; | 185 | phy_id &= dev->mii.phy_id_mask; |
186 | idx &= dev->mii.reg_num_mask; | 186 | idx &= dev->mii.reg_num_mask; |
187 | addr = (phy_id << 11) | (idx << 6) | MII_READ_; | 187 | addr = (phy_id << 11) | (idx << 6) | MII_READ_ | MII_BUSY_; |
188 | ret = smsc95xx_write_reg(dev, MII_ADDR, addr); | 188 | ret = smsc95xx_write_reg(dev, MII_ADDR, addr); |
189 | check_warn_goto_done(ret, "Error writing MII_ADDR"); | 189 | check_warn_goto_done(ret, "Error writing MII_ADDR"); |
190 | 190 | ||
@@ -221,7 +221,7 @@ static void smsc95xx_mdio_write(struct net_device *netdev, int phy_id, int idx, | |||
221 | /* set the address, index & direction (write to PHY) */ | 221 | /* set the address, index & direction (write to PHY) */ |
222 | phy_id &= dev->mii.phy_id_mask; | 222 | phy_id &= dev->mii.phy_id_mask; |
223 | idx &= dev->mii.reg_num_mask; | 223 | idx &= dev->mii.reg_num_mask; |
224 | addr = (phy_id << 11) | (idx << 6) | MII_WRITE_; | 224 | addr = (phy_id << 11) | (idx << 6) | MII_WRITE_ | MII_BUSY_; |
225 | ret = smsc95xx_write_reg(dev, MII_ADDR, addr); | 225 | ret = smsc95xx_write_reg(dev, MII_ADDR, addr); |
226 | check_warn_goto_done(ret, "Error writing MII_ADDR"); | 226 | check_warn_goto_done(ret, "Error writing MII_ADDR"); |
227 | 227 | ||
diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c index 7b4adde93c01..8b5c61917076 100644 --- a/drivers/net/vxlan.c +++ b/drivers/net/vxlan.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * VXLAN: Virtual eXtensiable Local Area Network | 2 | * VXLAN: Virtual eXtensible Local Area Network |
3 | * | 3 | * |
4 | * Copyright (c) 2012 Vyatta Inc. | 4 | * Copyright (c) 2012 Vyatta Inc. |
5 | * | 5 | * |
@@ -50,8 +50,8 @@ | |||
50 | 50 | ||
51 | #define VXLAN_N_VID (1u << 24) | 51 | #define VXLAN_N_VID (1u << 24) |
52 | #define VXLAN_VID_MASK (VXLAN_N_VID - 1) | 52 | #define VXLAN_VID_MASK (VXLAN_N_VID - 1) |
53 | /* VLAN + IP header + UDP + VXLAN */ | 53 | /* IP header + UDP + VXLAN + Ethernet header */ |
54 | #define VXLAN_HEADROOM (4 + 20 + 8 + 8) | 54 | #define VXLAN_HEADROOM (20 + 8 + 8 + 14) |
55 | 55 | ||
56 | #define VXLAN_FLAGS 0x08000000 /* struct vxlanhdr.vx_flags required value. */ | 56 | #define VXLAN_FLAGS 0x08000000 /* struct vxlanhdr.vx_flags required value. */ |
57 | 57 | ||
@@ -1102,6 +1102,10 @@ static int vxlan_newlink(struct net *net, struct net_device *dev, | |||
1102 | 1102 | ||
1103 | if (!tb[IFLA_MTU]) | 1103 | if (!tb[IFLA_MTU]) |
1104 | dev->mtu = lowerdev->mtu - VXLAN_HEADROOM; | 1104 | dev->mtu = lowerdev->mtu - VXLAN_HEADROOM; |
1105 | |||
1106 | /* update header length based on lower device */ | ||
1107 | dev->hard_header_len = lowerdev->hard_header_len + | ||
1108 | VXLAN_HEADROOM; | ||
1105 | } | 1109 | } |
1106 | 1110 | ||
1107 | if (data[IFLA_VXLAN_TOS]) | 1111 | if (data[IFLA_VXLAN_TOS]) |
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c index a6f1e8166008..481345c23ded 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c | |||
@@ -4401,7 +4401,7 @@ static s32 brcmf_mode_to_nl80211_iftype(s32 mode) | |||
4401 | 4401 | ||
4402 | static void brcmf_wiphy_pno_params(struct wiphy *wiphy) | 4402 | static void brcmf_wiphy_pno_params(struct wiphy *wiphy) |
4403 | { | 4403 | { |
4404 | #ifndef CONFIG_BRCMFISCAN | 4404 | #ifndef CONFIG_BRCMISCAN |
4405 | /* scheduled scan settings */ | 4405 | /* scheduled scan settings */ |
4406 | wiphy->max_sched_scan_ssids = BRCMF_PNO_MAX_PFN_COUNT; | 4406 | wiphy->max_sched_scan_ssids = BRCMF_PNO_MAX_PFN_COUNT; |
4407 | wiphy->max_match_sets = BRCMF_PNO_MAX_PFN_COUNT; | 4407 | wiphy->max_match_sets = BRCMF_PNO_MAX_PFN_COUNT; |
diff --git a/drivers/net/wireless/iwlwifi/dvm/mac80211.c b/drivers/net/wireless/iwlwifi/dvm/mac80211.c index ff8162d4c454..fa4d1b8cd9f6 100644 --- a/drivers/net/wireless/iwlwifi/dvm/mac80211.c +++ b/drivers/net/wireless/iwlwifi/dvm/mac80211.c | |||
@@ -521,7 +521,7 @@ static void iwlagn_mac_tx(struct ieee80211_hw *hw, | |||
521 | ieee80211_get_tx_rate(hw, IEEE80211_SKB_CB(skb))->bitrate); | 521 | ieee80211_get_tx_rate(hw, IEEE80211_SKB_CB(skb))->bitrate); |
522 | 522 | ||
523 | if (iwlagn_tx_skb(priv, control->sta, skb)) | 523 | if (iwlagn_tx_skb(priv, control->sta, skb)) |
524 | dev_kfree_skb_any(skb); | 524 | ieee80211_free_txskb(hw, skb); |
525 | } | 525 | } |
526 | 526 | ||
527 | static void iwlagn_mac_update_tkip_key(struct ieee80211_hw *hw, | 527 | static void iwlagn_mac_update_tkip_key(struct ieee80211_hw *hw, |
diff --git a/drivers/net/wireless/iwlwifi/dvm/main.c b/drivers/net/wireless/iwlwifi/dvm/main.c index 7ff3f1430678..408132cf83c1 100644 --- a/drivers/net/wireless/iwlwifi/dvm/main.c +++ b/drivers/net/wireless/iwlwifi/dvm/main.c | |||
@@ -2114,7 +2114,7 @@ static void iwl_free_skb(struct iwl_op_mode *op_mode, struct sk_buff *skb) | |||
2114 | 2114 | ||
2115 | info = IEEE80211_SKB_CB(skb); | 2115 | info = IEEE80211_SKB_CB(skb); |
2116 | iwl_trans_free_tx_cmd(priv->trans, info->driver_data[1]); | 2116 | iwl_trans_free_tx_cmd(priv->trans, info->driver_data[1]); |
2117 | dev_kfree_skb_any(skb); | 2117 | ieee80211_free_txskb(priv->hw, skb); |
2118 | } | 2118 | } |
2119 | 2119 | ||
2120 | static void iwl_set_hw_rfkill_state(struct iwl_op_mode *op_mode, bool state) | 2120 | static void iwl_set_hw_rfkill_state(struct iwl_op_mode *op_mode, bool state) |
diff --git a/drivers/net/wireless/iwlwifi/pcie/rx.c b/drivers/net/wireless/iwlwifi/pcie/rx.c index 17c8e5d82681..bb69f8f90b3b 100644 --- a/drivers/net/wireless/iwlwifi/pcie/rx.c +++ b/drivers/net/wireless/iwlwifi/pcie/rx.c | |||
@@ -321,6 +321,14 @@ static void iwl_rx_allocate(struct iwl_trans *trans, gfp_t priority) | |||
321 | dma_map_page(trans->dev, page, 0, | 321 | dma_map_page(trans->dev, page, 0, |
322 | PAGE_SIZE << trans_pcie->rx_page_order, | 322 | PAGE_SIZE << trans_pcie->rx_page_order, |
323 | DMA_FROM_DEVICE); | 323 | DMA_FROM_DEVICE); |
324 | if (dma_mapping_error(trans->dev, rxb->page_dma)) { | ||
325 | rxb->page = NULL; | ||
326 | spin_lock_irqsave(&rxq->lock, flags); | ||
327 | list_add(&rxb->list, &rxq->rx_used); | ||
328 | spin_unlock_irqrestore(&rxq->lock, flags); | ||
329 | __free_pages(page, trans_pcie->rx_page_order); | ||
330 | return; | ||
331 | } | ||
324 | /* dma address must be no more than 36 bits */ | 332 | /* dma address must be no more than 36 bits */ |
325 | BUG_ON(rxb->page_dma & ~DMA_BIT_MASK(36)); | 333 | BUG_ON(rxb->page_dma & ~DMA_BIT_MASK(36)); |
326 | /* and also 256 byte aligned! */ | 334 | /* and also 256 byte aligned! */ |
@@ -488,8 +496,19 @@ static void iwl_rx_handle_rxbuf(struct iwl_trans *trans, | |||
488 | dma_map_page(trans->dev, rxb->page, 0, | 496 | dma_map_page(trans->dev, rxb->page, 0, |
489 | PAGE_SIZE << trans_pcie->rx_page_order, | 497 | PAGE_SIZE << trans_pcie->rx_page_order, |
490 | DMA_FROM_DEVICE); | 498 | DMA_FROM_DEVICE); |
491 | list_add_tail(&rxb->list, &rxq->rx_free); | 499 | if (dma_mapping_error(trans->dev, rxb->page_dma)) { |
492 | rxq->free_count++; | 500 | /* |
501 | * free the page(s) as well to not break | ||
502 | * the invariant that the items on the used | ||
503 | * list have no page(s) | ||
504 | */ | ||
505 | __free_pages(rxb->page, trans_pcie->rx_page_order); | ||
506 | rxb->page = NULL; | ||
507 | list_add_tail(&rxb->list, &rxq->rx_used); | ||
508 | } else { | ||
509 | list_add_tail(&rxb->list, &rxq->rx_free); | ||
510 | rxq->free_count++; | ||
511 | } | ||
493 | } else | 512 | } else |
494 | list_add_tail(&rxb->list, &rxq->rx_used); | 513 | list_add_tail(&rxb->list, &rxq->rx_used); |
495 | spin_unlock_irqrestore(&rxq->lock, flags); | 514 | spin_unlock_irqrestore(&rxq->lock, flags); |
diff --git a/drivers/pinctrl/Kconfig b/drivers/pinctrl/Kconfig index d96caefd914a..011133772d2a 100644 --- a/drivers/pinctrl/Kconfig +++ b/drivers/pinctrl/Kconfig | |||
@@ -188,27 +188,7 @@ config PINCTRL_EXYNOS4 | |||
188 | depends on OF && GPIOLIB | 188 | depends on OF && GPIOLIB |
189 | select PINCTRL_SAMSUNG | 189 | select PINCTRL_SAMSUNG |
190 | 190 | ||
191 | config PINCTRL_MVEBU | 191 | source "drivers/pinctrl/mvebu/Kconfig" |
192 | bool | ||
193 | depends on ARCH_MVEBU | ||
194 | select PINMUX | ||
195 | select PINCONF | ||
196 | |||
197 | config PINCTRL_DOVE | ||
198 | bool | ||
199 | select PINCTRL_MVEBU | ||
200 | |||
201 | config PINCTRL_KIRKWOOD | ||
202 | bool | ||
203 | select PINCTRL_MVEBU | ||
204 | |||
205 | config PINCTRL_ARMADA_370 | ||
206 | bool | ||
207 | select PINCTRL_MVEBU | ||
208 | |||
209 | config PINCTRL_ARMADA_XP | ||
210 | bool | ||
211 | select PINCTRL_MVEBU | ||
212 | 192 | ||
213 | source "drivers/pinctrl/spear/Kconfig" | 193 | source "drivers/pinctrl/spear/Kconfig" |
214 | 194 | ||
diff --git a/drivers/pinctrl/Makefile b/drivers/pinctrl/Makefile index f395ba5cec25..3cb6a0a668a8 100644 --- a/drivers/pinctrl/Makefile +++ b/drivers/pinctrl/Makefile | |||
@@ -36,12 +36,8 @@ obj-$(CONFIG_PINCTRL_U300) += pinctrl-u300.o | |||
36 | obj-$(CONFIG_PINCTRL_COH901) += pinctrl-coh901.o | 36 | obj-$(CONFIG_PINCTRL_COH901) += pinctrl-coh901.o |
37 | obj-$(CONFIG_PINCTRL_SAMSUNG) += pinctrl-samsung.o | 37 | obj-$(CONFIG_PINCTRL_SAMSUNG) += pinctrl-samsung.o |
38 | obj-$(CONFIG_PINCTRL_EXYNOS4) += pinctrl-exynos.o | 38 | obj-$(CONFIG_PINCTRL_EXYNOS4) += pinctrl-exynos.o |
39 | obj-$(CONFIG_PINCTRL_MVEBU) += pinctrl-mvebu.o | ||
40 | obj-$(CONFIG_PINCTRL_DOVE) += pinctrl-dove.o | ||
41 | obj-$(CONFIG_PINCTRL_KIRKWOOD) += pinctrl-kirkwood.o | ||
42 | obj-$(CONFIG_PINCTRL_ARMADA_370) += pinctrl-armada-370.o | ||
43 | obj-$(CONFIG_PINCTRL_ARMADA_XP) += pinctrl-armada-xp.o | ||
44 | obj-$(CONFIG_PINCTRL_XWAY) += pinctrl-xway.o | 39 | obj-$(CONFIG_PINCTRL_XWAY) += pinctrl-xway.o |
45 | obj-$(CONFIG_PINCTRL_LANTIQ) += pinctrl-lantiq.o | 40 | obj-$(CONFIG_PINCTRL_LANTIQ) += pinctrl-lantiq.o |
46 | 41 | ||
42 | obj-$(CONFIG_PLAT_ORION) += mvebu/ | ||
47 | obj-$(CONFIG_PLAT_SPEAR) += spear/ | 43 | obj-$(CONFIG_PLAT_SPEAR) += spear/ |
diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c index 2e39c04fc16b..cec6072cd7c1 100644 --- a/drivers/pinctrl/core.c +++ b/drivers/pinctrl/core.c | |||
@@ -563,6 +563,8 @@ static int add_setting(struct pinctrl *p, struct pinctrl_map const *map) | |||
563 | return -EPROBE_DEFER; | 563 | return -EPROBE_DEFER; |
564 | } | 564 | } |
565 | 565 | ||
566 | setting->dev_name = map->dev_name; | ||
567 | |||
566 | switch (map->type) { | 568 | switch (map->type) { |
567 | case PIN_MAP_TYPE_MUX_GROUP: | 569 | case PIN_MAP_TYPE_MUX_GROUP: |
568 | ret = pinmux_map_to_setting(map, setting); | 570 | ret = pinmux_map_to_setting(map, setting); |
diff --git a/drivers/pinctrl/core.h b/drivers/pinctrl/core.h index 1f40ff68a8c4..12f5694f3d5d 100644 --- a/drivers/pinctrl/core.h +++ b/drivers/pinctrl/core.h | |||
@@ -105,12 +105,14 @@ struct pinctrl_setting_configs { | |||
105 | * @type: the type of setting | 105 | * @type: the type of setting |
106 | * @pctldev: pin control device handling to be programmed. Not used for | 106 | * @pctldev: pin control device handling to be programmed. Not used for |
107 | * PIN_MAP_TYPE_DUMMY_STATE. | 107 | * PIN_MAP_TYPE_DUMMY_STATE. |
108 | * @dev_name: the name of the device using this state | ||
108 | * @data: Data specific to the setting type | 109 | * @data: Data specific to the setting type |
109 | */ | 110 | */ |
110 | struct pinctrl_setting { | 111 | struct pinctrl_setting { |
111 | struct list_head node; | 112 | struct list_head node; |
112 | enum pinctrl_map_type type; | 113 | enum pinctrl_map_type type; |
113 | struct pinctrl_dev *pctldev; | 114 | struct pinctrl_dev *pctldev; |
115 | const char *dev_name; | ||
114 | union { | 116 | union { |
115 | struct pinctrl_setting_mux mux; | 117 | struct pinctrl_setting_mux mux; |
116 | struct pinctrl_setting_configs configs; | 118 | struct pinctrl_setting_configs configs; |
diff --git a/drivers/pinctrl/mvebu/Kconfig b/drivers/pinctrl/mvebu/Kconfig new file mode 100644 index 000000000000..366fa541ee91 --- /dev/null +++ b/drivers/pinctrl/mvebu/Kconfig | |||
@@ -0,0 +1,24 @@ | |||
1 | if PLAT_ORION | ||
2 | |||
3 | config PINCTRL_MVEBU | ||
4 | bool | ||
5 | select PINMUX | ||
6 | select PINCONF | ||
7 | |||
8 | config PINCTRL_DOVE | ||
9 | bool | ||
10 | select PINCTRL_MVEBU | ||
11 | |||
12 | config PINCTRL_KIRKWOOD | ||
13 | bool | ||
14 | select PINCTRL_MVEBU | ||
15 | |||
16 | config PINCTRL_ARMADA_370 | ||
17 | bool | ||
18 | select PINCTRL_MVEBU | ||
19 | |||
20 | config PINCTRL_ARMADA_XP | ||
21 | bool | ||
22 | select PINCTRL_MVEBU | ||
23 | |||
24 | endif | ||
diff --git a/drivers/pinctrl/mvebu/Makefile b/drivers/pinctrl/mvebu/Makefile new file mode 100644 index 000000000000..37c253297af0 --- /dev/null +++ b/drivers/pinctrl/mvebu/Makefile | |||
@@ -0,0 +1,5 @@ | |||
1 | obj-$(CONFIG_PINCTRL_MVEBU) += pinctrl-mvebu.o | ||
2 | obj-$(CONFIG_PINCTRL_DOVE) += pinctrl-dove.o | ||
3 | obj-$(CONFIG_PINCTRL_KIRKWOOD) += pinctrl-kirkwood.o | ||
4 | obj-$(CONFIG_PINCTRL_ARMADA_370) += pinctrl-armada-370.o | ||
5 | obj-$(CONFIG_PINCTRL_ARMADA_XP) += pinctrl-armada-xp.o | ||
diff --git a/drivers/pinctrl/pinctrl-armada-370.c b/drivers/pinctrl/mvebu/pinctrl-armada-370.c index c907647de6ad..c907647de6ad 100644 --- a/drivers/pinctrl/pinctrl-armada-370.c +++ b/drivers/pinctrl/mvebu/pinctrl-armada-370.c | |||
diff --git a/drivers/pinctrl/pinctrl-armada-xp.c b/drivers/pinctrl/mvebu/pinctrl-armada-xp.c index 40bd52a46b4e..40bd52a46b4e 100644 --- a/drivers/pinctrl/pinctrl-armada-xp.c +++ b/drivers/pinctrl/mvebu/pinctrl-armada-xp.c | |||
diff --git a/drivers/pinctrl/pinctrl-dove.c b/drivers/pinctrl/mvebu/pinctrl-dove.c index ffe74b27d66d..40c9c3eecd94 100644 --- a/drivers/pinctrl/pinctrl-dove.c +++ b/drivers/pinctrl/mvebu/pinctrl-dove.c | |||
@@ -22,22 +22,22 @@ | |||
22 | 22 | ||
23 | #include "pinctrl-mvebu.h" | 23 | #include "pinctrl-mvebu.h" |
24 | 24 | ||
25 | #define DOVE_SB_REGS_VIRT_BASE 0xfde00000 | 25 | #define DOVE_SB_REGS_VIRT_BASE IOMEM(0xfde00000) |
26 | #define DOVE_MPP_VIRT_BASE (DOVE_SB_REGS_VIRT_BASE | 0xd0200) | 26 | #define DOVE_MPP_VIRT_BASE (DOVE_SB_REGS_VIRT_BASE + 0xd0200) |
27 | #define DOVE_PMU_MPP_GENERAL_CTRL (DOVE_MPP_VIRT_BASE + 0x10) | 27 | #define DOVE_PMU_MPP_GENERAL_CTRL (DOVE_MPP_VIRT_BASE + 0x10) |
28 | #define DOVE_AU0_AC97_SEL BIT(16) | 28 | #define DOVE_AU0_AC97_SEL BIT(16) |
29 | #define DOVE_GLOBAL_CONFIG_1 (DOVE_SB_REGS_VIRT_BASE | 0xe802C) | 29 | #define DOVE_GLOBAL_CONFIG_1 (DOVE_SB_REGS_VIRT_BASE + 0xe802C) |
30 | #define DOVE_TWSI_ENABLE_OPTION1 BIT(7) | 30 | #define DOVE_TWSI_ENABLE_OPTION1 BIT(7) |
31 | #define DOVE_GLOBAL_CONFIG_2 (DOVE_SB_REGS_VIRT_BASE | 0xe8030) | 31 | #define DOVE_GLOBAL_CONFIG_2 (DOVE_SB_REGS_VIRT_BASE + 0xe8030) |
32 | #define DOVE_TWSI_ENABLE_OPTION2 BIT(20) | 32 | #define DOVE_TWSI_ENABLE_OPTION2 BIT(20) |
33 | #define DOVE_TWSI_ENABLE_OPTION3 BIT(21) | 33 | #define DOVE_TWSI_ENABLE_OPTION3 BIT(21) |
34 | #define DOVE_TWSI_OPTION3_GPIO BIT(22) | 34 | #define DOVE_TWSI_OPTION3_GPIO BIT(22) |
35 | #define DOVE_SSP_CTRL_STATUS_1 (DOVE_SB_REGS_VIRT_BASE | 0xe8034) | 35 | #define DOVE_SSP_CTRL_STATUS_1 (DOVE_SB_REGS_VIRT_BASE + 0xe8034) |
36 | #define DOVE_SSP_ON_AU1 BIT(0) | 36 | #define DOVE_SSP_ON_AU1 BIT(0) |
37 | #define DOVE_MPP_GENERAL_VIRT_BASE (DOVE_SB_REGS_VIRT_BASE | 0xe803c) | 37 | #define DOVE_MPP_GENERAL_VIRT_BASE (DOVE_SB_REGS_VIRT_BASE + 0xe803c) |
38 | #define DOVE_AU1_SPDIFO_GPIO_EN BIT(1) | 38 | #define DOVE_AU1_SPDIFO_GPIO_EN BIT(1) |
39 | #define DOVE_NAND_GPIO_EN BIT(0) | 39 | #define DOVE_NAND_GPIO_EN BIT(0) |
40 | #define DOVE_GPIO_LO_VIRT_BASE (DOVE_SB_REGS_VIRT_BASE | 0xd0400) | 40 | #define DOVE_GPIO_LO_VIRT_BASE (DOVE_SB_REGS_VIRT_BASE + 0xd0400) |
41 | #define DOVE_MPP_CTRL4_VIRT_BASE (DOVE_GPIO_LO_VIRT_BASE + 0x40) | 41 | #define DOVE_MPP_CTRL4_VIRT_BASE (DOVE_GPIO_LO_VIRT_BASE + 0x40) |
42 | #define DOVE_SPI_GPIO_SEL BIT(5) | 42 | #define DOVE_SPI_GPIO_SEL BIT(5) |
43 | #define DOVE_UART1_GPIO_SEL BIT(4) | 43 | #define DOVE_UART1_GPIO_SEL BIT(4) |
@@ -234,6 +234,14 @@ static int dove_audio1_ctrl_set(struct mvebu_mpp_ctrl *ctrl, | |||
234 | unsigned long gmpp = readl(DOVE_MPP_GENERAL_VIRT_BASE); | 234 | unsigned long gmpp = readl(DOVE_MPP_GENERAL_VIRT_BASE); |
235 | unsigned long gcfg2 = readl(DOVE_GLOBAL_CONFIG_2); | 235 | unsigned long gcfg2 = readl(DOVE_GLOBAL_CONFIG_2); |
236 | 236 | ||
237 | /* | ||
238 | * clear all audio1 related bits before configure | ||
239 | */ | ||
240 | gcfg2 &= ~DOVE_TWSI_OPTION3_GPIO; | ||
241 | gmpp &= ~DOVE_AU1_SPDIFO_GPIO_EN; | ||
242 | sspc1 &= ~DOVE_SSP_ON_AU1; | ||
243 | mpp4 &= ~DOVE_AU1_GPIO_SEL; | ||
244 | |||
237 | if (config & BIT(0)) | 245 | if (config & BIT(0)) |
238 | gcfg2 |= DOVE_TWSI_OPTION3_GPIO; | 246 | gcfg2 |= DOVE_TWSI_OPTION3_GPIO; |
239 | if (config & BIT(1)) | 247 | if (config & BIT(1)) |
diff --git a/drivers/pinctrl/mvebu/pinctrl-kirkwood.c b/drivers/pinctrl/mvebu/pinctrl-kirkwood.c new file mode 100644 index 000000000000..fa6ce31c94d9 --- /dev/null +++ b/drivers/pinctrl/mvebu/pinctrl-kirkwood.c | |||
@@ -0,0 +1,484 @@ | |||
1 | /* | ||
2 | * Marvell Kirkwood pinctrl driver based on mvebu pinctrl core | ||
3 | * | ||
4 | * Author: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #include <linux/err.h> | ||
13 | #include <linux/init.h> | ||
14 | #include <linux/io.h> | ||
15 | #include <linux/module.h> | ||
16 | #include <linux/platform_device.h> | ||
17 | #include <linux/clk.h> | ||
18 | #include <linux/of.h> | ||
19 | #include <linux/of_device.h> | ||
20 | #include <linux/pinctrl/pinctrl.h> | ||
21 | |||
22 | #include "pinctrl-mvebu.h" | ||
23 | |||
24 | #define V(f6180, f6190, f6192, f6281, f6282, dx4122) \ | ||
25 | ((f6180 << 0) | (f6190 << 1) | (f6192 << 2) | \ | ||
26 | (f6281 << 3) | (f6282 << 4) | (dx4122 << 5)) | ||
27 | |||
28 | enum kirkwood_variant { | ||
29 | VARIANT_MV88F6180 = V(1, 0, 0, 0, 0, 0), | ||
30 | VARIANT_MV88F6190 = V(0, 1, 0, 0, 0, 0), | ||
31 | VARIANT_MV88F6192 = V(0, 0, 1, 0, 0, 0), | ||
32 | VARIANT_MV88F6281 = V(0, 0, 0, 1, 0, 0), | ||
33 | VARIANT_MV88F6282 = V(0, 0, 0, 0, 1, 0), | ||
34 | VARIANT_MV98DX4122 = V(0, 0, 0, 0, 0, 1), | ||
35 | }; | ||
36 | |||
37 | static struct mvebu_mpp_mode mv88f6xxx_mpp_modes[] = { | ||
38 | MPP_MODE(0, | ||
39 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(1, 1, 1, 1, 1, 1)), | ||
40 | MPP_VAR_FUNCTION(0x1, "nand", "io2", V(1, 1, 1, 1, 1, 1)), | ||
41 | MPP_VAR_FUNCTION(0x2, "spi", "cs", V(1, 1, 1, 1, 1, 1))), | ||
42 | MPP_MODE(1, | ||
43 | MPP_VAR_FUNCTION(0x0, "gpo", NULL, V(1, 1, 1, 1, 1, 1)), | ||
44 | MPP_VAR_FUNCTION(0x1, "nand", "io3", V(1, 1, 1, 1, 1, 1)), | ||
45 | MPP_VAR_FUNCTION(0x2, "spi", "mosi", V(1, 1, 1, 1, 1, 1))), | ||
46 | MPP_MODE(2, | ||
47 | MPP_VAR_FUNCTION(0x0, "gpo", NULL, V(1, 1, 1, 1, 1, 1)), | ||
48 | MPP_VAR_FUNCTION(0x1, "nand", "io4", V(1, 1, 1, 1, 1, 1)), | ||
49 | MPP_VAR_FUNCTION(0x2, "spi", "sck", V(1, 1, 1, 1, 1, 1))), | ||
50 | MPP_MODE(3, | ||
51 | MPP_VAR_FUNCTION(0x0, "gpo", NULL, V(1, 1, 1, 1, 1, 1)), | ||
52 | MPP_VAR_FUNCTION(0x1, "nand", "io5", V(1, 1, 1, 1, 1, 1)), | ||
53 | MPP_VAR_FUNCTION(0x2, "spi", "miso", V(1, 1, 1, 1, 1, 1))), | ||
54 | MPP_MODE(4, | ||
55 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(1, 1, 1, 1, 1, 1)), | ||
56 | MPP_VAR_FUNCTION(0x1, "nand", "io6", V(1, 1, 1, 1, 1, 1)), | ||
57 | MPP_VAR_FUNCTION(0x2, "uart0", "rxd", V(1, 1, 1, 1, 1, 1)), | ||
58 | MPP_VAR_FUNCTION(0x5, "sata1", "act", V(0, 0, 1, 1, 1, 0)), | ||
59 | MPP_VAR_FUNCTION(0xb, "lcd", "hsync", V(0, 0, 0, 0, 1, 0)), | ||
60 | MPP_VAR_FUNCTION(0xd, "ptp", "clk", V(1, 1, 1, 1, 0, 0))), | ||
61 | MPP_MODE(5, | ||
62 | MPP_VAR_FUNCTION(0x0, "gpo", NULL, V(1, 1, 1, 1, 1, 1)), | ||
63 | MPP_VAR_FUNCTION(0x1, "nand", "io7", V(1, 1, 1, 1, 1, 1)), | ||
64 | MPP_VAR_FUNCTION(0x2, "uart0", "txd", V(1, 1, 1, 1, 1, 1)), | ||
65 | MPP_VAR_FUNCTION(0x4, "ptp", "trig", V(1, 1, 1, 1, 0, 0)), | ||
66 | MPP_VAR_FUNCTION(0x5, "sata0", "act", V(0, 1, 1, 1, 1, 0)), | ||
67 | MPP_VAR_FUNCTION(0xb, "lcd", "vsync", V(0, 0, 0, 0, 1, 0))), | ||
68 | MPP_MODE(6, | ||
69 | MPP_VAR_FUNCTION(0x0, "sysrst", "out", V(1, 1, 1, 1, 1, 1)), | ||
70 | MPP_VAR_FUNCTION(0x1, "spi", "mosi", V(1, 1, 1, 1, 1, 1)), | ||
71 | MPP_VAR_FUNCTION(0x2, "ptp", "trig", V(1, 1, 1, 1, 0, 0))), | ||
72 | MPP_MODE(7, | ||
73 | MPP_VAR_FUNCTION(0x0, "gpo", NULL, V(1, 1, 1, 1, 1, 1)), | ||
74 | MPP_VAR_FUNCTION(0x1, "pex", "rsto", V(1, 1, 1, 1, 0, 1)), | ||
75 | MPP_VAR_FUNCTION(0x2, "spi", "cs", V(1, 1, 1, 1, 1, 1)), | ||
76 | MPP_VAR_FUNCTION(0x3, "ptp", "trig", V(1, 1, 1, 1, 0, 0)), | ||
77 | MPP_VAR_FUNCTION(0xb, "lcd", "pwm", V(0, 0, 0, 0, 1, 0))), | ||
78 | MPP_MODE(8, | ||
79 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(1, 1, 1, 1, 1, 1)), | ||
80 | MPP_VAR_FUNCTION(0x1, "twsi0", "sda", V(1, 1, 1, 1, 1, 1)), | ||
81 | MPP_VAR_FUNCTION(0x2, "uart0", "rts", V(1, 1, 1, 1, 1, 1)), | ||
82 | MPP_VAR_FUNCTION(0x3, "uart1", "rts", V(1, 1, 1, 1, 1, 1)), | ||
83 | MPP_VAR_FUNCTION(0x4, "mii-1", "rxerr", V(0, 1, 1, 1, 1, 0)), | ||
84 | MPP_VAR_FUNCTION(0x5, "sata1", "prsnt", V(0, 0, 1, 1, 1, 0)), | ||
85 | MPP_VAR_FUNCTION(0xc, "ptp", "clk", V(1, 1, 1, 1, 0, 0)), | ||
86 | MPP_VAR_FUNCTION(0xd, "mii", "col", V(1, 1, 1, 1, 1, 0))), | ||
87 | MPP_MODE(9, | ||
88 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(1, 1, 1, 1, 1, 1)), | ||
89 | MPP_VAR_FUNCTION(0x1, "twsi0", "sck", V(1, 1, 1, 1, 1, 1)), | ||
90 | MPP_VAR_FUNCTION(0x2, "uart0", "cts", V(1, 1, 1, 1, 1, 1)), | ||
91 | MPP_VAR_FUNCTION(0x3, "uart1", "cts", V(1, 1, 1, 1, 1, 1)), | ||
92 | MPP_VAR_FUNCTION(0x5, "sata0", "prsnt", V(0, 1, 1, 1, 1, 0)), | ||
93 | MPP_VAR_FUNCTION(0xc, "ptp", "evreq", V(1, 1, 1, 1, 0, 0)), | ||
94 | MPP_VAR_FUNCTION(0xd, "mii", "crs", V(1, 1, 1, 1, 1, 0))), | ||
95 | MPP_MODE(10, | ||
96 | MPP_VAR_FUNCTION(0x0, "gpo", NULL, V(1, 1, 1, 1, 1, 1)), | ||
97 | MPP_VAR_FUNCTION(0x2, "spi", "sck", V(1, 1, 1, 1, 1, 1)), | ||
98 | MPP_VAR_FUNCTION(0X3, "uart0", "txd", V(1, 1, 1, 1, 1, 1)), | ||
99 | MPP_VAR_FUNCTION(0x5, "sata1", "act", V(0, 0, 1, 1, 1, 0)), | ||
100 | MPP_VAR_FUNCTION(0xc, "ptp", "trig", V(1, 1, 1, 1, 0, 0))), | ||
101 | MPP_MODE(11, | ||
102 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(1, 1, 1, 1, 1, 1)), | ||
103 | MPP_VAR_FUNCTION(0x2, "spi", "miso", V(1, 1, 1, 1, 1, 1)), | ||
104 | MPP_VAR_FUNCTION(0x3, "uart0", "rxd", V(1, 1, 1, 1, 1, 1)), | ||
105 | MPP_VAR_FUNCTION(0x4, "ptp-1", "evreq", V(1, 1, 1, 1, 0, 0)), | ||
106 | MPP_VAR_FUNCTION(0xc, "ptp-2", "trig", V(1, 1, 1, 1, 0, 0)), | ||
107 | MPP_VAR_FUNCTION(0xd, "ptp", "clk", V(1, 1, 1, 1, 0, 0)), | ||
108 | MPP_VAR_FUNCTION(0x5, "sata0", "act", V(0, 1, 1, 1, 1, 0))), | ||
109 | MPP_MODE(12, | ||
110 | MPP_VAR_FUNCTION(0x0, "gpo", NULL, V(1, 1, 1, 0, 1, 0)), | ||
111 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(0, 0, 0, 1, 0, 0)), | ||
112 | MPP_VAR_FUNCTION(0x1, "sdio", "clk", V(1, 1, 1, 1, 1, 0)), | ||
113 | MPP_VAR_FUNCTION(0xa, "audio", "spdifo", V(0, 0, 0, 0, 1, 0)), | ||
114 | MPP_VAR_FUNCTION(0xb, "spi", "mosi", V(0, 0, 0, 0, 1, 0)), | ||
115 | MPP_VAR_FUNCTION(0xd, "twsi1", "sda", V(0, 0, 0, 0, 1, 0))), | ||
116 | MPP_MODE(13, | ||
117 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(1, 1, 1, 1, 1, 1)), | ||
118 | MPP_VAR_FUNCTION(0x1, "sdio", "cmd", V(1, 1, 1, 1, 1, 0)), | ||
119 | MPP_VAR_FUNCTION(0x3, "uart1", "txd", V(1, 1, 1, 1, 1, 1)), | ||
120 | MPP_VAR_FUNCTION(0xa, "audio", "rmclk", V(0, 0, 0, 0, 1, 0)), | ||
121 | MPP_VAR_FUNCTION(0xb, "lcd", "pwm", V(0, 0, 0, 0, 1, 0))), | ||
122 | MPP_MODE(14, | ||
123 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(1, 1, 1, 1, 1, 1)), | ||
124 | MPP_VAR_FUNCTION(0x1, "sdio", "d0", V(1, 1, 1, 1, 1, 0)), | ||
125 | MPP_VAR_FUNCTION(0x3, "uart1", "rxd", V(1, 1, 1, 1, 1, 1)), | ||
126 | MPP_VAR_FUNCTION(0x4, "sata1", "prsnt", V(0, 0, 1, 1, 1, 0)), | ||
127 | MPP_VAR_FUNCTION(0xa, "audio", "spdifi", V(0, 0, 0, 0, 1, 0)), | ||
128 | MPP_VAR_FUNCTION(0xb, "audio-1", "sdi", V(0, 0, 0, 0, 1, 0)), | ||
129 | MPP_VAR_FUNCTION(0xd, "mii", "col", V(1, 1, 1, 1, 1, 0))), | ||
130 | MPP_MODE(15, | ||
131 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(1, 1, 1, 1, 1, 1)), | ||
132 | MPP_VAR_FUNCTION(0x1, "sdio", "d1", V(1, 1, 1, 1, 1, 0)), | ||
133 | MPP_VAR_FUNCTION(0x2, "uart0", "rts", V(1, 1, 1, 1, 1, 1)), | ||
134 | MPP_VAR_FUNCTION(0x3, "uart1", "txd", V(1, 1, 1, 1, 1, 0)), | ||
135 | MPP_VAR_FUNCTION(0x4, "sata0", "act", V(0, 1, 1, 1, 1, 0)), | ||
136 | MPP_VAR_FUNCTION(0xb, "spi", "cs", V(0, 0, 0, 0, 1, 0))), | ||
137 | MPP_MODE(16, | ||
138 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(1, 1, 1, 1, 1, 1)), | ||
139 | MPP_VAR_FUNCTION(0x1, "sdio", "d2", V(1, 1, 1, 1, 1, 0)), | ||
140 | MPP_VAR_FUNCTION(0x2, "uart0", "cts", V(1, 1, 1, 1, 1, 1)), | ||
141 | MPP_VAR_FUNCTION(0x3, "uart1", "rxd", V(1, 1, 1, 1, 1, 0)), | ||
142 | MPP_VAR_FUNCTION(0x4, "sata1", "act", V(0, 0, 1, 1, 1, 0)), | ||
143 | MPP_VAR_FUNCTION(0xb, "lcd", "extclk", V(0, 0, 0, 0, 1, 0)), | ||
144 | MPP_VAR_FUNCTION(0xd, "mii", "crs", V(1, 1, 1, 1, 1, 0))), | ||
145 | MPP_MODE(17, | ||
146 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(1, 1, 1, 1, 1, 0)), | ||
147 | MPP_VAR_FUNCTION(0x1, "sdio", "d3", V(1, 1, 1, 1, 1, 0)), | ||
148 | MPP_VAR_FUNCTION(0x4, "sata0", "prsnt", V(0, 1, 1, 1, 1, 0)), | ||
149 | MPP_VAR_FUNCTION(0xa, "sata1", "act", V(0, 0, 0, 0, 1, 0)), | ||
150 | MPP_VAR_FUNCTION(0xd, "twsi1", "sck", V(0, 0, 0, 0, 1, 0))), | ||
151 | MPP_MODE(18, | ||
152 | MPP_VAR_FUNCTION(0x0, "gpo", NULL, V(1, 1, 1, 1, 1, 1)), | ||
153 | MPP_VAR_FUNCTION(0x1, "nand", "io0", V(1, 1, 1, 1, 1, 1)), | ||
154 | MPP_VAR_FUNCTION(0x2, "pex", "clkreq", V(0, 0, 0, 0, 1, 0))), | ||
155 | MPP_MODE(19, | ||
156 | MPP_VAR_FUNCTION(0x0, "gpo", NULL, V(1, 1, 1, 1, 1, 1)), | ||
157 | MPP_VAR_FUNCTION(0x1, "nand", "io1", V(1, 1, 1, 1, 1, 1))), | ||
158 | MPP_MODE(20, | ||
159 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(1, 1, 1, 1, 1, 0)), | ||
160 | MPP_VAR_FUNCTION(0x1, "ts", "mp0", V(0, 0, 1, 1, 1, 0)), | ||
161 | MPP_VAR_FUNCTION(0x2, "tdm", "tx0ql", V(0, 0, 1, 1, 1, 0)), | ||
162 | MPP_VAR_FUNCTION(0x3, "ge1", "txd0", V(0, 1, 1, 1, 1, 0)), | ||
163 | MPP_VAR_FUNCTION(0x4, "audio", "spdifi", V(0, 0, 1, 1, 1, 0)), | ||
164 | MPP_VAR_FUNCTION(0x5, "sata1", "act", V(0, 0, 1, 1, 1, 0)), | ||
165 | MPP_VAR_FUNCTION(0xb, "lcd", "d0", V(0, 0, 0, 0, 1, 0)), | ||
166 | MPP_VAR_FUNCTION(0xc, "mii", "rxerr", V(1, 0, 0, 0, 0, 0))), | ||
167 | MPP_MODE(21, | ||
168 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(1, 1, 1, 1, 1, 0)), | ||
169 | MPP_VAR_FUNCTION(0x1, "ts", "mp1", V(0, 0, 1, 1, 1, 0)), | ||
170 | MPP_VAR_FUNCTION(0x2, "tdm", "rx0ql", V(0, 0, 1, 1, 1, 0)), | ||
171 | MPP_VAR_FUNCTION(0x3, "ge1", "txd1", V(0, 1, 1, 1, 1, 0)), | ||
172 | MPP_VAR_FUNCTION(0x4, "audio", "spdifi", V(1, 0, 0, 0, 0, 0)), | ||
173 | MPP_VAR_FUNCTION(0x4, "audio", "spdifo", V(0, 0, 1, 1, 1, 0)), | ||
174 | MPP_VAR_FUNCTION(0x5, "sata0", "act", V(0, 1, 1, 1, 1, 0)), | ||
175 | MPP_VAR_FUNCTION(0xb, "lcd", "d1", V(0, 0, 0, 0, 1, 0))), | ||
176 | MPP_MODE(22, | ||
177 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(1, 1, 1, 1, 1, 0)), | ||
178 | MPP_VAR_FUNCTION(0x1, "ts", "mp2", V(0, 0, 1, 1, 1, 0)), | ||
179 | MPP_VAR_FUNCTION(0x2, "tdm", "tx2ql", V(0, 0, 1, 1, 1, 0)), | ||
180 | MPP_VAR_FUNCTION(0x3, "ge1", "txd2", V(0, 1, 1, 1, 1, 0)), | ||
181 | MPP_VAR_FUNCTION(0x4, "audio", "spdifo", V(1, 0, 0, 0, 0, 0)), | ||
182 | MPP_VAR_FUNCTION(0x4, "audio", "rmclk", V(0, 0, 1, 1, 1, 0)), | ||
183 | MPP_VAR_FUNCTION(0x5, "sata1", "prsnt", V(0, 0, 1, 1, 1, 0)), | ||
184 | MPP_VAR_FUNCTION(0xb, "lcd", "d2", V(0, 0, 0, 0, 1, 0))), | ||
185 | MPP_MODE(23, | ||
186 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(1, 1, 1, 1, 1, 0)), | ||
187 | MPP_VAR_FUNCTION(0x1, "ts", "mp3", V(0, 0, 1, 1, 1, 0)), | ||
188 | MPP_VAR_FUNCTION(0x2, "tdm", "rx2ql", V(0, 0, 1, 1, 1, 0)), | ||
189 | MPP_VAR_FUNCTION(0x3, "ge1", "txd3", V(0, 1, 1, 1, 1, 0)), | ||
190 | MPP_VAR_FUNCTION(0x4, "audio", "rmclk", V(1, 0, 0, 0, 0, 0)), | ||
191 | MPP_VAR_FUNCTION(0x4, "audio", "bclk", V(0, 0, 1, 1, 1, 0)), | ||
192 | MPP_VAR_FUNCTION(0x5, "sata0", "prsnt", V(0, 1, 1, 1, 1, 0)), | ||
193 | MPP_VAR_FUNCTION(0xb, "lcd", "d3", V(0, 0, 0, 0, 1, 0))), | ||
194 | MPP_MODE(24, | ||
195 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(1, 1, 1, 1, 1, 0)), | ||
196 | MPP_VAR_FUNCTION(0x1, "ts", "mp4", V(0, 0, 1, 1, 1, 0)), | ||
197 | MPP_VAR_FUNCTION(0x2, "tdm", "spi-cs0", V(0, 0, 1, 1, 1, 0)), | ||
198 | MPP_VAR_FUNCTION(0x3, "ge1", "rxd0", V(0, 1, 1, 1, 1, 0)), | ||
199 | MPP_VAR_FUNCTION(0x4, "audio", "bclk", V(1, 0, 0, 0, 0, 0)), | ||
200 | MPP_VAR_FUNCTION(0x4, "audio", "sdo", V(0, 0, 1, 1, 1, 0)), | ||
201 | MPP_VAR_FUNCTION(0xb, "lcd", "d4", V(0, 0, 0, 0, 1, 0))), | ||
202 | MPP_MODE(25, | ||
203 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(1, 1, 1, 1, 1, 0)), | ||
204 | MPP_VAR_FUNCTION(0x1, "ts", "mp5", V(0, 0, 1, 1, 1, 0)), | ||
205 | MPP_VAR_FUNCTION(0x2, "tdm", "spi-sck", V(0, 0, 1, 1, 1, 0)), | ||
206 | MPP_VAR_FUNCTION(0x3, "ge1", "rxd1", V(0, 1, 1, 1, 1, 0)), | ||
207 | MPP_VAR_FUNCTION(0x4, "audio", "sdo", V(1, 0, 0, 0, 0, 0)), | ||
208 | MPP_VAR_FUNCTION(0x4, "audio", "lrclk", V(0, 0, 1, 1, 1, 0)), | ||
209 | MPP_VAR_FUNCTION(0xb, "lcd", "d5", V(0, 0, 0, 0, 1, 0))), | ||
210 | MPP_MODE(26, | ||
211 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(1, 1, 1, 1, 1, 0)), | ||
212 | MPP_VAR_FUNCTION(0x1, "ts", "mp6", V(0, 0, 1, 1, 1, 0)), | ||
213 | MPP_VAR_FUNCTION(0x2, "tdm", "spi-miso", V(0, 0, 1, 1, 1, 0)), | ||
214 | MPP_VAR_FUNCTION(0x3, "ge1", "rxd2", V(0, 1, 1, 1, 1, 0)), | ||
215 | MPP_VAR_FUNCTION(0x4, "audio", "lrclk", V(1, 0, 0, 0, 0, 0)), | ||
216 | MPP_VAR_FUNCTION(0x4, "audio", "mclk", V(0, 0, 1, 1, 1, 0)), | ||
217 | MPP_VAR_FUNCTION(0xb, "lcd", "d6", V(0, 0, 0, 0, 1, 0))), | ||
218 | MPP_MODE(27, | ||
219 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(1, 1, 1, 1, 1, 0)), | ||
220 | MPP_VAR_FUNCTION(0x1, "ts", "mp7", V(0, 0, 1, 1, 1, 0)), | ||
221 | MPP_VAR_FUNCTION(0x2, "tdm", "spi-mosi", V(0, 0, 1, 1, 1, 0)), | ||
222 | MPP_VAR_FUNCTION(0x3, "ge1", "rxd3", V(0, 1, 1, 1, 1, 0)), | ||
223 | MPP_VAR_FUNCTION(0x4, "audio", "mclk", V(1, 0, 0, 0, 0, 0)), | ||
224 | MPP_VAR_FUNCTION(0x4, "audio", "sdi", V(0, 0, 1, 1, 1, 0)), | ||
225 | MPP_VAR_FUNCTION(0xb, "lcd", "d7", V(0, 0, 0, 0, 1, 0))), | ||
226 | MPP_MODE(28, | ||
227 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(1, 1, 1, 1, 1, 0)), | ||
228 | MPP_VAR_FUNCTION(0x1, "ts", "mp8", V(0, 0, 1, 1, 1, 0)), | ||
229 | MPP_VAR_FUNCTION(0x2, "tdm", "int", V(0, 0, 1, 1, 1, 0)), | ||
230 | MPP_VAR_FUNCTION(0x3, "ge1", "col", V(0, 1, 1, 1, 1, 0)), | ||
231 | MPP_VAR_FUNCTION(0x4, "audio", "sdi", V(1, 0, 0, 0, 0, 0)), | ||
232 | MPP_VAR_FUNCTION(0x4, "audio", "extclk", V(0, 0, 1, 1, 1, 0)), | ||
233 | MPP_VAR_FUNCTION(0xb, "lcd", "d8", V(0, 0, 0, 0, 1, 0))), | ||
234 | MPP_MODE(29, | ||
235 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(1, 1, 1, 1, 1, 0)), | ||
236 | MPP_VAR_FUNCTION(0x1, "ts", "mp9", V(0, 0, 1, 1, 1, 0)), | ||
237 | MPP_VAR_FUNCTION(0x2, "tdm", "rst", V(0, 0, 1, 1, 1, 0)), | ||
238 | MPP_VAR_FUNCTION(0x3, "ge1", "txclk", V(0, 1, 1, 1, 1, 0)), | ||
239 | MPP_VAR_FUNCTION(0x4, "audio", "extclk", V(1, 0, 0, 0, 0, 0)), | ||
240 | MPP_VAR_FUNCTION(0xb, "lcd", "d9", V(0, 0, 0, 0, 1, 0))), | ||
241 | MPP_MODE(30, | ||
242 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(0, 1, 1, 1, 1, 0)), | ||
243 | MPP_VAR_FUNCTION(0x1, "ts", "mp10", V(0, 0, 1, 1, 1, 0)), | ||
244 | MPP_VAR_FUNCTION(0x2, "tdm", "pclk", V(0, 0, 1, 1, 1, 0)), | ||
245 | MPP_VAR_FUNCTION(0x3, "ge1", "rxctl", V(0, 1, 1, 1, 1, 0)), | ||
246 | MPP_VAR_FUNCTION(0xb, "lcd", "d10", V(0, 0, 0, 0, 1, 0))), | ||
247 | MPP_MODE(31, | ||
248 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(0, 1, 1, 1, 1, 0)), | ||
249 | MPP_VAR_FUNCTION(0x1, "ts", "mp11", V(0, 0, 1, 1, 1, 0)), | ||
250 | MPP_VAR_FUNCTION(0x2, "tdm", "fs", V(0, 0, 1, 1, 1, 0)), | ||
251 | MPP_VAR_FUNCTION(0x3, "ge1", "rxclk", V(0, 1, 1, 1, 1, 0)), | ||
252 | MPP_VAR_FUNCTION(0xb, "lcd", "d11", V(0, 0, 0, 0, 1, 0))), | ||
253 | MPP_MODE(32, | ||
254 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(0, 1, 1, 1, 1, 0)), | ||
255 | MPP_VAR_FUNCTION(0x1, "ts", "mp12", V(0, 0, 1, 1, 1, 0)), | ||
256 | MPP_VAR_FUNCTION(0x2, "tdm", "drx", V(0, 0, 1, 1, 1, 0)), | ||
257 | MPP_VAR_FUNCTION(0x3, "ge1", "txclko", V(0, 1, 1, 1, 1, 0)), | ||
258 | MPP_VAR_FUNCTION(0xb, "lcd", "d12", V(0, 0, 0, 0, 1, 0))), | ||
259 | MPP_MODE(33, | ||
260 | MPP_VAR_FUNCTION(0x0, "gpo", NULL, V(0, 1, 1, 1, 1, 0)), | ||
261 | MPP_VAR_FUNCTION(0x2, "tdm", "dtx", V(0, 0, 1, 1, 1, 0)), | ||
262 | MPP_VAR_FUNCTION(0x3, "ge1", "txctl", V(0, 1, 1, 1, 1, 0)), | ||
263 | MPP_VAR_FUNCTION(0xb, "lcd", "d13", V(0, 0, 0, 0, 1, 0))), | ||
264 | MPP_MODE(34, | ||
265 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(0, 1, 1, 1, 1, 1)), | ||
266 | MPP_VAR_FUNCTION(0x2, "tdm", "spi-cs1", V(0, 0, 1, 1, 1, 0)), | ||
267 | MPP_VAR_FUNCTION(0x3, "ge1", "txen", V(0, 1, 1, 1, 1, 0)), | ||
268 | MPP_VAR_FUNCTION(0x5, "sata1", "act", V(0, 0, 0, 1, 1, 0)), | ||
269 | MPP_VAR_FUNCTION(0xb, "lcd", "d14", V(0, 0, 0, 0, 1, 0))), | ||
270 | MPP_MODE(35, | ||
271 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(0, 1, 1, 1, 1, 1)), | ||
272 | MPP_VAR_FUNCTION(0x2, "tdm", "tx0ql", V(0, 0, 1, 1, 1, 0)), | ||
273 | MPP_VAR_FUNCTION(0x3, "ge1", "rxerr", V(0, 1, 1, 1, 1, 0)), | ||
274 | MPP_VAR_FUNCTION(0x5, "sata0", "act", V(0, 1, 1, 1, 1, 0)), | ||
275 | MPP_VAR_FUNCTION(0xb, "lcd", "d15", V(0, 0, 0, 0, 1, 0)), | ||
276 | MPP_VAR_FUNCTION(0xc, "mii", "rxerr", V(0, 1, 1, 1, 1, 0))), | ||
277 | MPP_MODE(36, | ||
278 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(0, 0, 0, 1, 1, 1)), | ||
279 | MPP_VAR_FUNCTION(0x1, "ts", "mp0", V(0, 0, 0, 1, 1, 0)), | ||
280 | MPP_VAR_FUNCTION(0x2, "tdm", "spi-cs1", V(0, 0, 0, 1, 1, 0)), | ||
281 | MPP_VAR_FUNCTION(0x4, "audio", "spdifi", V(0, 0, 0, 1, 1, 0)), | ||
282 | MPP_VAR_FUNCTION(0xb, "twsi1", "sda", V(0, 0, 0, 0, 1, 0))), | ||
283 | MPP_MODE(37, | ||
284 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(0, 0, 0, 1, 1, 1)), | ||
285 | MPP_VAR_FUNCTION(0x1, "ts", "mp1", V(0, 0, 0, 1, 1, 0)), | ||
286 | MPP_VAR_FUNCTION(0x2, "tdm", "tx2ql", V(0, 0, 0, 1, 1, 0)), | ||
287 | MPP_VAR_FUNCTION(0x4, "audio", "spdifo", V(0, 0, 0, 1, 1, 0)), | ||
288 | MPP_VAR_FUNCTION(0xb, "twsi1", "sck", V(0, 0, 0, 0, 1, 0))), | ||
289 | MPP_MODE(38, | ||
290 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(0, 0, 0, 1, 1, 1)), | ||
291 | MPP_VAR_FUNCTION(0x1, "ts", "mp2", V(0, 0, 0, 1, 1, 0)), | ||
292 | MPP_VAR_FUNCTION(0x2, "tdm", "rx2ql", V(0, 0, 0, 1, 1, 0)), | ||
293 | MPP_VAR_FUNCTION(0x4, "audio", "rmclk", V(0, 0, 0, 1, 1, 0)), | ||
294 | MPP_VAR_FUNCTION(0xb, "lcd", "d18", V(0, 0, 0, 0, 1, 0))), | ||
295 | MPP_MODE(39, | ||
296 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(0, 0, 0, 1, 1, 1)), | ||
297 | MPP_VAR_FUNCTION(0x1, "ts", "mp3", V(0, 0, 0, 1, 1, 0)), | ||
298 | MPP_VAR_FUNCTION(0x2, "tdm", "spi-cs0", V(0, 0, 0, 1, 1, 0)), | ||
299 | MPP_VAR_FUNCTION(0x4, "audio", "bclk", V(0, 0, 0, 1, 1, 0)), | ||
300 | MPP_VAR_FUNCTION(0xb, "lcd", "d19", V(0, 0, 0, 0, 1, 0))), | ||
301 | MPP_MODE(40, | ||
302 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(0, 0, 0, 1, 1, 1)), | ||
303 | MPP_VAR_FUNCTION(0x1, "ts", "mp4", V(0, 0, 0, 1, 1, 0)), | ||
304 | MPP_VAR_FUNCTION(0x2, "tdm", "spi-sck", V(0, 0, 0, 1, 1, 0)), | ||
305 | MPP_VAR_FUNCTION(0x4, "audio", "sdo", V(0, 0, 0, 1, 1, 0)), | ||
306 | MPP_VAR_FUNCTION(0xb, "lcd", "d20", V(0, 0, 0, 0, 1, 0))), | ||
307 | MPP_MODE(41, | ||
308 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(0, 0, 0, 1, 1, 1)), | ||
309 | MPP_VAR_FUNCTION(0x1, "ts", "mp5", V(0, 0, 0, 1, 1, 0)), | ||
310 | MPP_VAR_FUNCTION(0x2, "tdm", "spi-miso", V(0, 0, 0, 1, 1, 0)), | ||
311 | MPP_VAR_FUNCTION(0x4, "audio", "lrclk", V(0, 0, 0, 1, 1, 0)), | ||
312 | MPP_VAR_FUNCTION(0xb, "lcd", "d21", V(0, 0, 0, 0, 1, 0))), | ||
313 | MPP_MODE(42, | ||
314 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(0, 0, 0, 1, 1, 1)), | ||
315 | MPP_VAR_FUNCTION(0x1, "ts", "mp6", V(0, 0, 0, 1, 1, 0)), | ||
316 | MPP_VAR_FUNCTION(0x2, "tdm", "spi-mosi", V(0, 0, 0, 1, 1, 0)), | ||
317 | MPP_VAR_FUNCTION(0x4, "audio", "mclk", V(0, 0, 0, 1, 1, 0)), | ||
318 | MPP_VAR_FUNCTION(0xb, "lcd", "d22", V(0, 0, 0, 0, 1, 0))), | ||
319 | MPP_MODE(43, | ||
320 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(0, 0, 0, 1, 1, 1)), | ||
321 | MPP_VAR_FUNCTION(0x1, "ts", "mp7", V(0, 0, 0, 1, 1, 0)), | ||
322 | MPP_VAR_FUNCTION(0x2, "tdm", "int", V(0, 0, 0, 1, 1, 0)), | ||
323 | MPP_VAR_FUNCTION(0x4, "audio", "sdi", V(0, 0, 0, 1, 1, 0)), | ||
324 | MPP_VAR_FUNCTION(0xb, "lcd", "d23", V(0, 0, 0, 0, 1, 0))), | ||
325 | MPP_MODE(44, | ||
326 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(0, 0, 0, 1, 1, 1)), | ||
327 | MPP_VAR_FUNCTION(0x1, "ts", "mp8", V(0, 0, 0, 1, 1, 0)), | ||
328 | MPP_VAR_FUNCTION(0x2, "tdm", "rst", V(0, 0, 0, 1, 1, 0)), | ||
329 | MPP_VAR_FUNCTION(0x4, "audio", "extclk", V(0, 0, 0, 1, 1, 0)), | ||
330 | MPP_VAR_FUNCTION(0xb, "lcd", "clk", V(0, 0, 0, 0, 1, 0))), | ||
331 | MPP_MODE(45, | ||
332 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(0, 0, 0, 1, 1, 1)), | ||
333 | MPP_VAR_FUNCTION(0x1, "ts", "mp9", V(0, 0, 0, 1, 1, 0)), | ||
334 | MPP_VAR_FUNCTION(0x2, "tdm", "pclk", V(0, 0, 0, 1, 1, 0)), | ||
335 | MPP_VAR_FUNCTION(0xb, "lcd", "e", V(0, 0, 0, 0, 1, 0))), | ||
336 | MPP_MODE(46, | ||
337 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(0, 0, 0, 1, 1, 0)), | ||
338 | MPP_VAR_FUNCTION(0x1, "ts", "mp10", V(0, 0, 0, 1, 1, 0)), | ||
339 | MPP_VAR_FUNCTION(0x2, "tdm", "fs", V(0, 0, 0, 1, 1, 0)), | ||
340 | MPP_VAR_FUNCTION(0xb, "lcd", "hsync", V(0, 0, 0, 0, 1, 0))), | ||
341 | MPP_MODE(47, | ||
342 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(0, 0, 0, 1, 1, 0)), | ||
343 | MPP_VAR_FUNCTION(0x1, "ts", "mp11", V(0, 0, 0, 1, 1, 0)), | ||
344 | MPP_VAR_FUNCTION(0x2, "tdm", "drx", V(0, 0, 0, 1, 1, 0)), | ||
345 | MPP_VAR_FUNCTION(0xb, "lcd", "vsync", V(0, 0, 0, 0, 1, 0))), | ||
346 | MPP_MODE(48, | ||
347 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(0, 0, 0, 1, 1, 0)), | ||
348 | MPP_VAR_FUNCTION(0x1, "ts", "mp12", V(0, 0, 0, 1, 1, 0)), | ||
349 | MPP_VAR_FUNCTION(0x2, "tdm", "dtx", V(0, 0, 0, 1, 1, 0)), | ||
350 | MPP_VAR_FUNCTION(0xb, "lcd", "d16", V(0, 0, 0, 0, 1, 0))), | ||
351 | MPP_MODE(49, | ||
352 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(0, 0, 0, 1, 0, 1)), | ||
353 | MPP_VAR_FUNCTION(0x0, "gpo", NULL, V(0, 0, 0, 0, 1, 0)), | ||
354 | MPP_VAR_FUNCTION(0x1, "ts", "mp9", V(0, 0, 0, 1, 0, 0)), | ||
355 | MPP_VAR_FUNCTION(0x2, "tdm", "rx0ql", V(0, 0, 0, 1, 1, 0)), | ||
356 | MPP_VAR_FUNCTION(0x5, "ptp", "clk", V(0, 0, 0, 1, 0, 0)), | ||
357 | MPP_VAR_FUNCTION(0xa, "pex", "clkreq", V(0, 0, 0, 0, 1, 0)), | ||
358 | MPP_VAR_FUNCTION(0xb, "lcd", "d17", V(0, 0, 0, 0, 1, 0))), | ||
359 | }; | ||
360 | |||
361 | static struct mvebu_mpp_ctrl mv88f6180_mpp_controls[] = { | ||
362 | MPP_REG_CTRL(0, 29), | ||
363 | }; | ||
364 | |||
365 | static struct pinctrl_gpio_range mv88f6180_gpio_ranges[] = { | ||
366 | MPP_GPIO_RANGE(0, 0, 0, 30), | ||
367 | }; | ||
368 | |||
369 | static struct mvebu_mpp_ctrl mv88f619x_mpp_controls[] = { | ||
370 | MPP_REG_CTRL(0, 35), | ||
371 | }; | ||
372 | |||
373 | static struct pinctrl_gpio_range mv88f619x_gpio_ranges[] = { | ||
374 | MPP_GPIO_RANGE(0, 0, 0, 32), | ||
375 | MPP_GPIO_RANGE(1, 32, 32, 4), | ||
376 | }; | ||
377 | |||
378 | static struct mvebu_mpp_ctrl mv88f628x_mpp_controls[] = { | ||
379 | MPP_REG_CTRL(0, 49), | ||
380 | }; | ||
381 | |||
382 | static struct pinctrl_gpio_range mv88f628x_gpio_ranges[] = { | ||
383 | MPP_GPIO_RANGE(0, 0, 0, 32), | ||
384 | MPP_GPIO_RANGE(1, 32, 32, 18), | ||
385 | }; | ||
386 | |||
387 | static struct mvebu_pinctrl_soc_info mv88f6180_info = { | ||
388 | .variant = VARIANT_MV88F6180, | ||
389 | .controls = mv88f6180_mpp_controls, | ||
390 | .ncontrols = ARRAY_SIZE(mv88f6180_mpp_controls), | ||
391 | .modes = mv88f6xxx_mpp_modes, | ||
392 | .nmodes = ARRAY_SIZE(mv88f6xxx_mpp_modes), | ||
393 | .gpioranges = mv88f6180_gpio_ranges, | ||
394 | .ngpioranges = ARRAY_SIZE(mv88f6180_gpio_ranges), | ||
395 | }; | ||
396 | |||
397 | static struct mvebu_pinctrl_soc_info mv88f6190_info = { | ||
398 | .variant = VARIANT_MV88F6190, | ||
399 | .controls = mv88f619x_mpp_controls, | ||
400 | .ncontrols = ARRAY_SIZE(mv88f619x_mpp_controls), | ||
401 | .modes = mv88f6xxx_mpp_modes, | ||
402 | .nmodes = ARRAY_SIZE(mv88f6xxx_mpp_modes), | ||
403 | .gpioranges = mv88f619x_gpio_ranges, | ||
404 | .ngpioranges = ARRAY_SIZE(mv88f619x_gpio_ranges), | ||
405 | }; | ||
406 | |||
407 | static struct mvebu_pinctrl_soc_info mv88f6192_info = { | ||
408 | .variant = VARIANT_MV88F6192, | ||
409 | .controls = mv88f619x_mpp_controls, | ||
410 | .ncontrols = ARRAY_SIZE(mv88f619x_mpp_controls), | ||
411 | .modes = mv88f6xxx_mpp_modes, | ||
412 | .nmodes = ARRAY_SIZE(mv88f6xxx_mpp_modes), | ||
413 | .gpioranges = mv88f619x_gpio_ranges, | ||
414 | .ngpioranges = ARRAY_SIZE(mv88f619x_gpio_ranges), | ||
415 | }; | ||
416 | |||
417 | static struct mvebu_pinctrl_soc_info mv88f6281_info = { | ||
418 | .variant = VARIANT_MV88F6281, | ||
419 | .controls = mv88f628x_mpp_controls, | ||
420 | .ncontrols = ARRAY_SIZE(mv88f628x_mpp_controls), | ||
421 | .modes = mv88f6xxx_mpp_modes, | ||
422 | .nmodes = ARRAY_SIZE(mv88f6xxx_mpp_modes), | ||
423 | .gpioranges = mv88f628x_gpio_ranges, | ||
424 | .ngpioranges = ARRAY_SIZE(mv88f628x_gpio_ranges), | ||
425 | }; | ||
426 | |||
427 | static struct mvebu_pinctrl_soc_info mv88f6282_info = { | ||
428 | .variant = VARIANT_MV88F6282, | ||
429 | .controls = mv88f628x_mpp_controls, | ||
430 | .ncontrols = ARRAY_SIZE(mv88f628x_mpp_controls), | ||
431 | .modes = mv88f6xxx_mpp_modes, | ||
432 | .nmodes = ARRAY_SIZE(mv88f6xxx_mpp_modes), | ||
433 | .gpioranges = mv88f628x_gpio_ranges, | ||
434 | .ngpioranges = ARRAY_SIZE(mv88f628x_gpio_ranges), | ||
435 | }; | ||
436 | |||
437 | static struct mvebu_pinctrl_soc_info mv98dx4122_info = { | ||
438 | .variant = VARIANT_MV98DX4122, | ||
439 | .controls = mv88f628x_mpp_controls, | ||
440 | .ncontrols = ARRAY_SIZE(mv88f628x_mpp_controls), | ||
441 | .modes = mv88f6xxx_mpp_modes, | ||
442 | .nmodes = ARRAY_SIZE(mv88f6xxx_mpp_modes), | ||
443 | .gpioranges = mv88f628x_gpio_ranges, | ||
444 | .ngpioranges = ARRAY_SIZE(mv88f628x_gpio_ranges), | ||
445 | }; | ||
446 | |||
447 | static struct of_device_id kirkwood_pinctrl_of_match[] __devinitdata = { | ||
448 | { .compatible = "marvell,88f6180-pinctrl", .data = &mv88f6180_info }, | ||
449 | { .compatible = "marvell,88f6190-pinctrl", .data = &mv88f6190_info }, | ||
450 | { .compatible = "marvell,88f6192-pinctrl", .data = &mv88f6192_info }, | ||
451 | { .compatible = "marvell,88f6281-pinctrl", .data = &mv88f6281_info }, | ||
452 | { .compatible = "marvell,88f6282-pinctrl", .data = &mv88f6282_info }, | ||
453 | { .compatible = "marvell,98dx4122-pinctrl", .data = &mv98dx4122_info }, | ||
454 | { } | ||
455 | }; | ||
456 | |||
457 | static int __devinit kirkwood_pinctrl_probe(struct platform_device *pdev) | ||
458 | { | ||
459 | const struct of_device_id *match = | ||
460 | of_match_device(kirkwood_pinctrl_of_match, &pdev->dev); | ||
461 | pdev->dev.platform_data = match->data; | ||
462 | return mvebu_pinctrl_probe(pdev); | ||
463 | } | ||
464 | |||
465 | static int __devexit kirkwood_pinctrl_remove(struct platform_device *pdev) | ||
466 | { | ||
467 | return mvebu_pinctrl_remove(pdev); | ||
468 | } | ||
469 | |||
470 | static struct platform_driver kirkwood_pinctrl_driver = { | ||
471 | .driver = { | ||
472 | .name = "kirkwood-pinctrl", | ||
473 | .owner = THIS_MODULE, | ||
474 | .of_match_table = of_match_ptr(kirkwood_pinctrl_of_match), | ||
475 | }, | ||
476 | .probe = kirkwood_pinctrl_probe, | ||
477 | .remove = __devexit_p(kirkwood_pinctrl_remove), | ||
478 | }; | ||
479 | |||
480 | module_platform_driver(kirkwood_pinctrl_driver); | ||
481 | |||
482 | MODULE_AUTHOR("Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>"); | ||
483 | MODULE_DESCRIPTION("Marvell Kirkwood pinctrl driver"); | ||
484 | MODULE_LICENSE("GPL v2"); | ||
diff --git a/drivers/pinctrl/pinctrl-mvebu.c b/drivers/pinctrl/mvebu/pinctrl-mvebu.c index 8e6266c6249a..6c44b7e8964c 100644 --- a/drivers/pinctrl/pinctrl-mvebu.c +++ b/drivers/pinctrl/mvebu/pinctrl-mvebu.c | |||
@@ -24,7 +24,6 @@ | |||
24 | #include <linux/pinctrl/pinctrl.h> | 24 | #include <linux/pinctrl/pinctrl.h> |
25 | #include <linux/pinctrl/pinmux.h> | 25 | #include <linux/pinctrl/pinmux.h> |
26 | 26 | ||
27 | #include "core.h" | ||
28 | #include "pinctrl-mvebu.h" | 27 | #include "pinctrl-mvebu.h" |
29 | 28 | ||
30 | #define MPPS_PER_REG 8 | 29 | #define MPPS_PER_REG 8 |
diff --git a/drivers/pinctrl/pinctrl-mvebu.h b/drivers/pinctrl/mvebu/pinctrl-mvebu.h index 90bd3beee860..90bd3beee860 100644 --- a/drivers/pinctrl/pinctrl-mvebu.h +++ b/drivers/pinctrl/mvebu/pinctrl-mvebu.h | |||
diff --git a/drivers/pinctrl/pinctrl-kirkwood.c b/drivers/pinctrl/pinctrl-kirkwood.c deleted file mode 100644 index 9a74ef674a0e..000000000000 --- a/drivers/pinctrl/pinctrl-kirkwood.c +++ /dev/null | |||
@@ -1,472 +0,0 @@ | |||
1 | /* | ||
2 | * Marvell Kirkwood pinctrl driver based on mvebu pinctrl core | ||
3 | * | ||
4 | * Author: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #include <linux/err.h> | ||
13 | #include <linux/init.h> | ||
14 | #include <linux/io.h> | ||
15 | #include <linux/module.h> | ||
16 | #include <linux/platform_device.h> | ||
17 | #include <linux/clk.h> | ||
18 | #include <linux/of.h> | ||
19 | #include <linux/of_device.h> | ||
20 | #include <linux/pinctrl/pinctrl.h> | ||
21 | |||
22 | #include "pinctrl-mvebu.h" | ||
23 | |||
24 | #define V(f6180, f6190, f6192, f6281, f6282) \ | ||
25 | ((f6180 << 0) | (f6190 << 1) | (f6192 << 2) | \ | ||
26 | (f6281 << 3) | (f6282 << 4)) | ||
27 | |||
28 | enum kirkwood_variant { | ||
29 | VARIANT_MV88F6180 = V(1, 0, 0, 0, 0), | ||
30 | VARIANT_MV88F6190 = V(0, 1, 0, 0, 0), | ||
31 | VARIANT_MV88F6192 = V(0, 0, 1, 0, 0), | ||
32 | VARIANT_MV88F6281 = V(0, 0, 0, 1, 0), | ||
33 | VARIANT_MV88F6282 = V(0, 0, 0, 0, 1), | ||
34 | }; | ||
35 | |||
36 | static struct mvebu_mpp_mode mv88f6xxx_mpp_modes[] = { | ||
37 | MPP_MODE(0, | ||
38 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(1, 1, 1, 1, 1)), | ||
39 | MPP_VAR_FUNCTION(0x1, "nand", "io2", V(1, 1, 1, 1, 1)), | ||
40 | MPP_VAR_FUNCTION(0x2, "spi", "cs", V(1, 1, 1, 1, 1))), | ||
41 | MPP_MODE(1, | ||
42 | MPP_VAR_FUNCTION(0x0, "gpo", NULL, V(1, 1, 1, 1, 1)), | ||
43 | MPP_VAR_FUNCTION(0x1, "nand", "io3", V(1, 1, 1, 1, 1)), | ||
44 | MPP_VAR_FUNCTION(0x2, "spi", "mosi", V(1, 1, 1, 1, 1))), | ||
45 | MPP_MODE(2, | ||
46 | MPP_VAR_FUNCTION(0x0, "gpo", NULL, V(1, 1, 1, 1, 1)), | ||
47 | MPP_VAR_FUNCTION(0x1, "nand", "io4", V(1, 1, 1, 1, 1)), | ||
48 | MPP_VAR_FUNCTION(0x2, "spi", "sck", V(1, 1, 1, 1, 1))), | ||
49 | MPP_MODE(3, | ||
50 | MPP_VAR_FUNCTION(0x0, "gpo", NULL, V(1, 1, 1, 1, 1)), | ||
51 | MPP_VAR_FUNCTION(0x1, "nand", "io5", V(1, 1, 1, 1, 1)), | ||
52 | MPP_VAR_FUNCTION(0x2, "spi", "miso", V(1, 1, 1, 1, 1))), | ||
53 | MPP_MODE(4, | ||
54 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(1, 1, 1, 1, 1)), | ||
55 | MPP_VAR_FUNCTION(0x1, "nand", "io6", V(1, 1, 1, 1, 1)), | ||
56 | MPP_VAR_FUNCTION(0x2, "uart0", "rxd", V(1, 1, 1, 1, 1)), | ||
57 | MPP_VAR_FUNCTION(0x5, "sata1", "act", V(0, 0, 1, 1, 1)), | ||
58 | MPP_VAR_FUNCTION(0xb, "lcd", "hsync", V(0, 0, 0, 0, 1)), | ||
59 | MPP_VAR_FUNCTION(0xd, "ptp", "clk", V(1, 1, 1, 1, 0))), | ||
60 | MPP_MODE(5, | ||
61 | MPP_VAR_FUNCTION(0x0, "gpo", NULL, V(1, 1, 1, 1, 1)), | ||
62 | MPP_VAR_FUNCTION(0x1, "nand", "io7", V(1, 1, 1, 1, 1)), | ||
63 | MPP_VAR_FUNCTION(0x2, "uart0", "txd", V(1, 1, 1, 1, 1)), | ||
64 | MPP_VAR_FUNCTION(0x4, "ptp", "trig", V(1, 1, 1, 1, 0)), | ||
65 | MPP_VAR_FUNCTION(0x5, "sata0", "act", V(0, 1, 1, 1, 1)), | ||
66 | MPP_VAR_FUNCTION(0xb, "lcd", "vsync", V(0, 0, 0, 0, 1))), | ||
67 | MPP_MODE(6, | ||
68 | MPP_VAR_FUNCTION(0x0, "sysrst", "out", V(1, 1, 1, 1, 1)), | ||
69 | MPP_VAR_FUNCTION(0x1, "spi", "mosi", V(1, 1, 1, 1, 1)), | ||
70 | MPP_VAR_FUNCTION(0x2, "ptp", "trig", V(1, 1, 1, 1, 0))), | ||
71 | MPP_MODE(7, | ||
72 | MPP_VAR_FUNCTION(0x0, "gpo", NULL, V(1, 1, 1, 1, 1)), | ||
73 | MPP_VAR_FUNCTION(0x1, "pex", "rsto", V(1, 1, 1, 1, 0)), | ||
74 | MPP_VAR_FUNCTION(0x2, "spi", "cs", V(1, 1, 1, 1, 1)), | ||
75 | MPP_VAR_FUNCTION(0x3, "ptp", "trig", V(1, 1, 1, 1, 0)), | ||
76 | MPP_VAR_FUNCTION(0xb, "lcd", "pwm", V(0, 0, 0, 0, 1))), | ||
77 | MPP_MODE(8, | ||
78 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(1, 1, 1, 1, 1)), | ||
79 | MPP_VAR_FUNCTION(0x1, "twsi0", "sda", V(1, 1, 1, 1, 1)), | ||
80 | MPP_VAR_FUNCTION(0x2, "uart0", "rts", V(1, 1, 1, 1, 1)), | ||
81 | MPP_VAR_FUNCTION(0x3, "uart1", "rts", V(1, 1, 1, 1, 1)), | ||
82 | MPP_VAR_FUNCTION(0x4, "mii-1", "rxerr", V(0, 1, 1, 1, 1)), | ||
83 | MPP_VAR_FUNCTION(0x5, "sata1", "prsnt", V(0, 0, 1, 1, 1)), | ||
84 | MPP_VAR_FUNCTION(0xc, "ptp", "clk", V(1, 1, 1, 1, 0)), | ||
85 | MPP_VAR_FUNCTION(0xd, "mii", "col", V(1, 1, 1, 1, 1))), | ||
86 | MPP_MODE(9, | ||
87 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(1, 1, 1, 1, 1)), | ||
88 | MPP_VAR_FUNCTION(0x1, "twsi0", "sck", V(1, 1, 1, 1, 1)), | ||
89 | MPP_VAR_FUNCTION(0x2, "uart0", "cts", V(1, 1, 1, 1, 1)), | ||
90 | MPP_VAR_FUNCTION(0x3, "uart1", "cts", V(1, 1, 1, 1, 1)), | ||
91 | MPP_VAR_FUNCTION(0x5, "sata0", "prsnt", V(0, 1, 1, 1, 1)), | ||
92 | MPP_VAR_FUNCTION(0xc, "ptp", "evreq", V(1, 1, 1, 1, 0)), | ||
93 | MPP_VAR_FUNCTION(0xd, "mii", "crs", V(1, 1, 1, 1, 1))), | ||
94 | MPP_MODE(10, | ||
95 | MPP_VAR_FUNCTION(0x0, "gpo", NULL, V(1, 1, 1, 1, 1)), | ||
96 | MPP_VAR_FUNCTION(0x2, "spi", "sck", V(1, 1, 1, 1, 1)), | ||
97 | MPP_VAR_FUNCTION(0X3, "uart0", "txd", V(1, 1, 1, 1, 1)), | ||
98 | MPP_VAR_FUNCTION(0x5, "sata1", "act", V(0, 0, 1, 1, 1)), | ||
99 | MPP_VAR_FUNCTION(0xc, "ptp", "trig", V(1, 1, 1, 1, 0))), | ||
100 | MPP_MODE(11, | ||
101 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(1, 1, 1, 1, 1)), | ||
102 | MPP_VAR_FUNCTION(0x2, "spi", "miso", V(1, 1, 1, 1, 1)), | ||
103 | MPP_VAR_FUNCTION(0x3, "uart0", "rxd", V(1, 1, 1, 1, 1)), | ||
104 | MPP_VAR_FUNCTION(0x4, "ptp-1", "evreq", V(1, 1, 1, 1, 0)), | ||
105 | MPP_VAR_FUNCTION(0xc, "ptp-2", "trig", V(1, 1, 1, 1, 0)), | ||
106 | MPP_VAR_FUNCTION(0xd, "ptp", "clk", V(1, 1, 1, 1, 0)), | ||
107 | MPP_VAR_FUNCTION(0x5, "sata0", "act", V(0, 1, 1, 1, 1))), | ||
108 | MPP_MODE(12, | ||
109 | MPP_VAR_FUNCTION(0x0, "gpo", NULL, V(1, 1, 1, 0, 1)), | ||
110 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(0, 0, 0, 1, 0)), | ||
111 | MPP_VAR_FUNCTION(0x1, "sdio", "clk", V(1, 1, 1, 1, 1)), | ||
112 | MPP_VAR_FUNCTION(0xa, "audio", "spdifo", V(0, 0, 0, 0, 1)), | ||
113 | MPP_VAR_FUNCTION(0xb, "spi", "mosi", V(0, 0, 0, 0, 1)), | ||
114 | MPP_VAR_FUNCTION(0xd, "twsi1", "sda", V(0, 0, 0, 0, 1))), | ||
115 | MPP_MODE(13, | ||
116 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(1, 1, 1, 1, 1)), | ||
117 | MPP_VAR_FUNCTION(0x1, "sdio", "cmd", V(1, 1, 1, 1, 1)), | ||
118 | MPP_VAR_FUNCTION(0x3, "uart1", "txd", V(1, 1, 1, 1, 1)), | ||
119 | MPP_VAR_FUNCTION(0xa, "audio", "rmclk", V(0, 0, 0, 0, 1)), | ||
120 | MPP_VAR_FUNCTION(0xb, "lcd", "pwm", V(0, 0, 0, 0, 1))), | ||
121 | MPP_MODE(14, | ||
122 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(1, 1, 1, 1, 1)), | ||
123 | MPP_VAR_FUNCTION(0x1, "sdio", "d0", V(1, 1, 1, 1, 1)), | ||
124 | MPP_VAR_FUNCTION(0x3, "uart1", "rxd", V(1, 1, 1, 1, 1)), | ||
125 | MPP_VAR_FUNCTION(0x4, "sata1", "prsnt", V(0, 0, 1, 1, 1)), | ||
126 | MPP_VAR_FUNCTION(0xa, "audio", "spdifi", V(0, 0, 0, 0, 1)), | ||
127 | MPP_VAR_FUNCTION(0xb, "audio-1", "sdi", V(0, 0, 0, 0, 1)), | ||
128 | MPP_VAR_FUNCTION(0xd, "mii", "col", V(1, 1, 1, 1, 1))), | ||
129 | MPP_MODE(15, | ||
130 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(1, 1, 1, 1, 1)), | ||
131 | MPP_VAR_FUNCTION(0x1, "sdio", "d1", V(1, 1, 1, 1, 1)), | ||
132 | MPP_VAR_FUNCTION(0x2, "uart0", "rts", V(1, 1, 1, 1, 1)), | ||
133 | MPP_VAR_FUNCTION(0x3, "uart1", "txd", V(1, 1, 1, 1, 1)), | ||
134 | MPP_VAR_FUNCTION(0x4, "sata0", "act", V(0, 1, 1, 1, 1)), | ||
135 | MPP_VAR_FUNCTION(0xb, "spi", "cs", V(0, 0, 0, 0, 1))), | ||
136 | MPP_MODE(16, | ||
137 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(1, 1, 1, 1, 1)), | ||
138 | MPP_VAR_FUNCTION(0x1, "sdio", "d2", V(1, 1, 1, 1, 1)), | ||
139 | MPP_VAR_FUNCTION(0x2, "uart0", "cts", V(1, 1, 1, 1, 1)), | ||
140 | MPP_VAR_FUNCTION(0x3, "uart1", "rxd", V(1, 1, 1, 1, 1)), | ||
141 | MPP_VAR_FUNCTION(0x4, "sata1", "act", V(0, 0, 1, 1, 1)), | ||
142 | MPP_VAR_FUNCTION(0xb, "lcd", "extclk", V(0, 0, 0, 0, 1)), | ||
143 | MPP_VAR_FUNCTION(0xd, "mii", "crs", V(1, 1, 1, 1, 1))), | ||
144 | MPP_MODE(17, | ||
145 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(1, 1, 1, 1, 1)), | ||
146 | MPP_VAR_FUNCTION(0x1, "sdio", "d3", V(1, 1, 1, 1, 1)), | ||
147 | MPP_VAR_FUNCTION(0x4, "sata0", "prsnt", V(0, 1, 1, 1, 1)), | ||
148 | MPP_VAR_FUNCTION(0xa, "sata1", "act", V(0, 0, 0, 0, 1)), | ||
149 | MPP_VAR_FUNCTION(0xd, "twsi1", "sck", V(0, 0, 0, 0, 1))), | ||
150 | MPP_MODE(18, | ||
151 | MPP_VAR_FUNCTION(0x0, "gpo", NULL, V(1, 1, 1, 1, 1)), | ||
152 | MPP_VAR_FUNCTION(0x1, "nand", "io0", V(1, 1, 1, 1, 1)), | ||
153 | MPP_VAR_FUNCTION(0x2, "pex", "clkreq", V(0, 0, 0, 0, 1))), | ||
154 | MPP_MODE(19, | ||
155 | MPP_VAR_FUNCTION(0x0, "gpo", NULL, V(1, 1, 1, 1, 1)), | ||
156 | MPP_VAR_FUNCTION(0x1, "nand", "io1", V(1, 1, 1, 1, 1))), | ||
157 | MPP_MODE(20, | ||
158 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(1, 1, 1, 1, 1)), | ||
159 | MPP_VAR_FUNCTION(0x1, "ts", "mp0", V(0, 0, 1, 1, 1)), | ||
160 | MPP_VAR_FUNCTION(0x2, "tdm", "tx0ql", V(0, 0, 1, 1, 1)), | ||
161 | MPP_VAR_FUNCTION(0x3, "ge1", "txd0", V(0, 1, 1, 1, 1)), | ||
162 | MPP_VAR_FUNCTION(0x4, "audio", "spdifi", V(0, 0, 1, 1, 1)), | ||
163 | MPP_VAR_FUNCTION(0x5, "sata1", "act", V(0, 0, 1, 1, 1)), | ||
164 | MPP_VAR_FUNCTION(0xb, "lcd", "d0", V(0, 0, 0, 0, 1)), | ||
165 | MPP_VAR_FUNCTION(0xc, "mii", "rxerr", V(1, 0, 0, 0, 0))), | ||
166 | MPP_MODE(21, | ||
167 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(1, 1, 1, 1, 1)), | ||
168 | MPP_VAR_FUNCTION(0x1, "ts", "mp1", V(0, 0, 1, 1, 1)), | ||
169 | MPP_VAR_FUNCTION(0x2, "tdm", "rx0ql", V(0, 0, 1, 1, 1)), | ||
170 | MPP_VAR_FUNCTION(0x3, "ge1", "txd1", V(0, 1, 1, 1, 1)), | ||
171 | MPP_VAR_FUNCTION(0x4, "audio", "spdifi", V(1, 0, 0, 0, 0)), | ||
172 | MPP_VAR_FUNCTION(0x4, "audio", "spdifo", V(0, 0, 1, 1, 1)), | ||
173 | MPP_VAR_FUNCTION(0x5, "sata0", "act", V(0, 1, 1, 1, 1)), | ||
174 | MPP_VAR_FUNCTION(0xb, "lcd", "d1", V(0, 0, 0, 0, 1))), | ||
175 | MPP_MODE(22, | ||
176 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(1, 1, 1, 1, 1)), | ||
177 | MPP_VAR_FUNCTION(0x1, "ts", "mp2", V(0, 0, 1, 1, 1)), | ||
178 | MPP_VAR_FUNCTION(0x2, "tdm", "tx2ql", V(0, 0, 1, 1, 1)), | ||
179 | MPP_VAR_FUNCTION(0x3, "ge1", "txd2", V(0, 1, 1, 1, 1)), | ||
180 | MPP_VAR_FUNCTION(0x4, "audio", "spdifo", V(1, 0, 0, 0, 0)), | ||
181 | MPP_VAR_FUNCTION(0x4, "audio", "rmclk", V(0, 0, 1, 1, 1)), | ||
182 | MPP_VAR_FUNCTION(0x5, "sata1", "prsnt", V(0, 0, 1, 1, 1)), | ||
183 | MPP_VAR_FUNCTION(0xb, "lcd", "d2", V(0, 0, 0, 0, 1))), | ||
184 | MPP_MODE(23, | ||
185 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(1, 1, 1, 1, 1)), | ||
186 | MPP_VAR_FUNCTION(0x1, "ts", "mp3", V(0, 0, 1, 1, 1)), | ||
187 | MPP_VAR_FUNCTION(0x2, "tdm", "rx2ql", V(0, 0, 1, 1, 1)), | ||
188 | MPP_VAR_FUNCTION(0x3, "ge1", "txd3", V(0, 1, 1, 1, 1)), | ||
189 | MPP_VAR_FUNCTION(0x4, "audio", "rmclk", V(1, 0, 0, 0, 0)), | ||
190 | MPP_VAR_FUNCTION(0x4, "audio", "bclk", V(0, 0, 1, 1, 1)), | ||
191 | MPP_VAR_FUNCTION(0x5, "sata0", "prsnt", V(0, 1, 1, 1, 1)), | ||
192 | MPP_VAR_FUNCTION(0xb, "lcd", "d3", V(0, 0, 0, 0, 1))), | ||
193 | MPP_MODE(24, | ||
194 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(1, 1, 1, 1, 1)), | ||
195 | MPP_VAR_FUNCTION(0x1, "ts", "mp4", V(0, 0, 1, 1, 1)), | ||
196 | MPP_VAR_FUNCTION(0x2, "tdm", "spi-cs0", V(0, 0, 1, 1, 1)), | ||
197 | MPP_VAR_FUNCTION(0x3, "ge1", "rxd0", V(0, 1, 1, 1, 1)), | ||
198 | MPP_VAR_FUNCTION(0x4, "audio", "bclk", V(1, 0, 0, 0, 0)), | ||
199 | MPP_VAR_FUNCTION(0x4, "audio", "sdo", V(0, 0, 1, 1, 1)), | ||
200 | MPP_VAR_FUNCTION(0xb, "lcd", "d4", V(0, 0, 0, 0, 1))), | ||
201 | MPP_MODE(25, | ||
202 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(1, 1, 1, 1, 1)), | ||
203 | MPP_VAR_FUNCTION(0x1, "ts", "mp5", V(0, 0, 1, 1, 1)), | ||
204 | MPP_VAR_FUNCTION(0x2, "tdm", "spi-sck", V(0, 0, 1, 1, 1)), | ||
205 | MPP_VAR_FUNCTION(0x3, "ge1", "rxd1", V(0, 1, 1, 1, 1)), | ||
206 | MPP_VAR_FUNCTION(0x4, "audio", "sdo", V(1, 0, 0, 0, 0)), | ||
207 | MPP_VAR_FUNCTION(0x4, "audio", "lrclk", V(0, 0, 1, 1, 1)), | ||
208 | MPP_VAR_FUNCTION(0xb, "lcd", "d5", V(0, 0, 0, 0, 1))), | ||
209 | MPP_MODE(26, | ||
210 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(1, 1, 1, 1, 1)), | ||
211 | MPP_VAR_FUNCTION(0x1, "ts", "mp6", V(0, 0, 1, 1, 1)), | ||
212 | MPP_VAR_FUNCTION(0x2, "tdm", "spi-miso", V(0, 0, 1, 1, 1)), | ||
213 | MPP_VAR_FUNCTION(0x3, "ge1", "rxd2", V(0, 1, 1, 1, 1)), | ||
214 | MPP_VAR_FUNCTION(0x4, "audio", "lrclk", V(1, 0, 0, 0, 0)), | ||
215 | MPP_VAR_FUNCTION(0x4, "audio", "mclk", V(0, 0, 1, 1, 1)), | ||
216 | MPP_VAR_FUNCTION(0xb, "lcd", "d6", V(0, 0, 0, 0, 1))), | ||
217 | MPP_MODE(27, | ||
218 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(1, 1, 1, 1, 1)), | ||
219 | MPP_VAR_FUNCTION(0x1, "ts", "mp7", V(0, 0, 1, 1, 1)), | ||
220 | MPP_VAR_FUNCTION(0x2, "tdm", "spi-mosi", V(0, 0, 1, 1, 1)), | ||
221 | MPP_VAR_FUNCTION(0x3, "ge1", "rxd3", V(0, 1, 1, 1, 1)), | ||
222 | MPP_VAR_FUNCTION(0x4, "audio", "mclk", V(1, 0, 0, 0, 0)), | ||
223 | MPP_VAR_FUNCTION(0x4, "audio", "sdi", V(0, 0, 1, 1, 1)), | ||
224 | MPP_VAR_FUNCTION(0xb, "lcd", "d7", V(0, 0, 0, 0, 1))), | ||
225 | MPP_MODE(28, | ||
226 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(1, 1, 1, 1, 1)), | ||
227 | MPP_VAR_FUNCTION(0x1, "ts", "mp8", V(0, 0, 1, 1, 1)), | ||
228 | MPP_VAR_FUNCTION(0x2, "tdm", "int", V(0, 0, 1, 1, 1)), | ||
229 | MPP_VAR_FUNCTION(0x3, "ge1", "col", V(0, 1, 1, 1, 1)), | ||
230 | MPP_VAR_FUNCTION(0x4, "audio", "sdi", V(1, 0, 0, 0, 0)), | ||
231 | MPP_VAR_FUNCTION(0x4, "audio", "extclk", V(0, 0, 1, 1, 1)), | ||
232 | MPP_VAR_FUNCTION(0xb, "lcd", "d8", V(0, 0, 0, 0, 1))), | ||
233 | MPP_MODE(29, | ||
234 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(1, 1, 1, 1, 1)), | ||
235 | MPP_VAR_FUNCTION(0x1, "ts", "mp9", V(0, 0, 1, 1, 1)), | ||
236 | MPP_VAR_FUNCTION(0x2, "tdm", "rst", V(0, 0, 1, 1, 1)), | ||
237 | MPP_VAR_FUNCTION(0x3, "ge1", "txclk", V(0, 1, 1, 1, 1)), | ||
238 | MPP_VAR_FUNCTION(0x4, "audio", "extclk", V(1, 0, 0, 0, 0)), | ||
239 | MPP_VAR_FUNCTION(0xb, "lcd", "d9", V(0, 0, 0, 0, 1))), | ||
240 | MPP_MODE(30, | ||
241 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(0, 1, 1, 1, 1)), | ||
242 | MPP_VAR_FUNCTION(0x1, "ts", "mp10", V(0, 0, 1, 1, 1)), | ||
243 | MPP_VAR_FUNCTION(0x2, "tdm", "pclk", V(0, 0, 1, 1, 1)), | ||
244 | MPP_VAR_FUNCTION(0x3, "ge1", "rxctl", V(0, 1, 1, 1, 1)), | ||
245 | MPP_VAR_FUNCTION(0xb, "lcd", "d10", V(0, 0, 0, 0, 1))), | ||
246 | MPP_MODE(31, | ||
247 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(0, 1, 1, 1, 1)), | ||
248 | MPP_VAR_FUNCTION(0x1, "ts", "mp11", V(0, 0, 1, 1, 1)), | ||
249 | MPP_VAR_FUNCTION(0x2, "tdm", "fs", V(0, 0, 1, 1, 1)), | ||
250 | MPP_VAR_FUNCTION(0x3, "ge1", "rxclk", V(0, 1, 1, 1, 1)), | ||
251 | MPP_VAR_FUNCTION(0xb, "lcd", "d11", V(0, 0, 0, 0, 1))), | ||
252 | MPP_MODE(32, | ||
253 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(0, 1, 1, 1, 1)), | ||
254 | MPP_VAR_FUNCTION(0x1, "ts", "mp12", V(0, 0, 1, 1, 1)), | ||
255 | MPP_VAR_FUNCTION(0x2, "tdm", "drx", V(0, 0, 1, 1, 1)), | ||
256 | MPP_VAR_FUNCTION(0x3, "ge1", "txclko", V(0, 1, 1, 1, 1)), | ||
257 | MPP_VAR_FUNCTION(0xb, "lcd", "d12", V(0, 0, 0, 0, 1))), | ||
258 | MPP_MODE(33, | ||
259 | MPP_VAR_FUNCTION(0x0, "gpo", NULL, V(0, 1, 1, 1, 1)), | ||
260 | MPP_VAR_FUNCTION(0x2, "tdm", "dtx", V(0, 0, 1, 1, 1)), | ||
261 | MPP_VAR_FUNCTION(0x3, "ge1", "txctl", V(0, 1, 1, 1, 1)), | ||
262 | MPP_VAR_FUNCTION(0xb, "lcd", "d13", V(0, 0, 0, 0, 1))), | ||
263 | MPP_MODE(34, | ||
264 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(0, 1, 1, 1, 1)), | ||
265 | MPP_VAR_FUNCTION(0x2, "tdm", "spi-cs1", V(0, 0, 1, 1, 1)), | ||
266 | MPP_VAR_FUNCTION(0x3, "ge1", "txen", V(0, 1, 1, 1, 1)), | ||
267 | MPP_VAR_FUNCTION(0x5, "sata1", "act", V(0, 0, 0, 1, 1)), | ||
268 | MPP_VAR_FUNCTION(0xb, "lcd", "d14", V(0, 0, 0, 0, 1))), | ||
269 | MPP_MODE(35, | ||
270 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(0, 1, 1, 1, 1)), | ||
271 | MPP_VAR_FUNCTION(0x2, "tdm", "tx0ql", V(0, 0, 1, 1, 1)), | ||
272 | MPP_VAR_FUNCTION(0x3, "ge1", "rxerr", V(0, 1, 1, 1, 1)), | ||
273 | MPP_VAR_FUNCTION(0x5, "sata0", "act", V(0, 1, 1, 1, 1)), | ||
274 | MPP_VAR_FUNCTION(0xb, "lcd", "d15", V(0, 0, 0, 0, 1)), | ||
275 | MPP_VAR_FUNCTION(0xc, "mii", "rxerr", V(0, 1, 1, 1, 1))), | ||
276 | MPP_MODE(36, | ||
277 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(0, 0, 0, 1, 1)), | ||
278 | MPP_VAR_FUNCTION(0x1, "ts", "mp0", V(0, 0, 0, 1, 1)), | ||
279 | MPP_VAR_FUNCTION(0x2, "tdm", "spi-cs1", V(0, 0, 0, 1, 1)), | ||
280 | MPP_VAR_FUNCTION(0x4, "audio", "spdifi", V(0, 0, 0, 1, 1)), | ||
281 | MPP_VAR_FUNCTION(0xb, "twsi1", "sda", V(0, 0, 0, 0, 1))), | ||
282 | MPP_MODE(37, | ||
283 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(0, 0, 0, 1, 1)), | ||
284 | MPP_VAR_FUNCTION(0x1, "ts", "mp1", V(0, 0, 0, 1, 1)), | ||
285 | MPP_VAR_FUNCTION(0x2, "tdm", "tx2ql", V(0, 0, 0, 1, 1)), | ||
286 | MPP_VAR_FUNCTION(0x4, "audio", "spdifo", V(0, 0, 0, 1, 1)), | ||
287 | MPP_VAR_FUNCTION(0xb, "twsi1", "sck", V(0, 0, 0, 0, 1))), | ||
288 | MPP_MODE(38, | ||
289 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(0, 0, 0, 1, 1)), | ||
290 | MPP_VAR_FUNCTION(0x1, "ts", "mp2", V(0, 0, 0, 1, 1)), | ||
291 | MPP_VAR_FUNCTION(0x2, "tdm", "rx2ql", V(0, 0, 0, 1, 1)), | ||
292 | MPP_VAR_FUNCTION(0x4, "audio", "rmclk", V(0, 0, 0, 1, 1)), | ||
293 | MPP_VAR_FUNCTION(0xb, "lcd", "d18", V(0, 0, 0, 0, 1))), | ||
294 | MPP_MODE(39, | ||
295 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(0, 0, 0, 1, 1)), | ||
296 | MPP_VAR_FUNCTION(0x1, "ts", "mp3", V(0, 0, 0, 1, 1)), | ||
297 | MPP_VAR_FUNCTION(0x2, "tdm", "spi-cs0", V(0, 0, 0, 1, 1)), | ||
298 | MPP_VAR_FUNCTION(0x4, "audio", "bclk", V(0, 0, 0, 1, 1)), | ||
299 | MPP_VAR_FUNCTION(0xb, "lcd", "d19", V(0, 0, 0, 0, 1))), | ||
300 | MPP_MODE(40, | ||
301 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(0, 0, 0, 1, 1)), | ||
302 | MPP_VAR_FUNCTION(0x1, "ts", "mp4", V(0, 0, 0, 1, 1)), | ||
303 | MPP_VAR_FUNCTION(0x2, "tdm", "spi-sck", V(0, 0, 0, 1, 1)), | ||
304 | MPP_VAR_FUNCTION(0x4, "audio", "sdo", V(0, 0, 0, 1, 1)), | ||
305 | MPP_VAR_FUNCTION(0xb, "lcd", "d20", V(0, 0, 0, 0, 1))), | ||
306 | MPP_MODE(41, | ||
307 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(0, 0, 0, 1, 1)), | ||
308 | MPP_VAR_FUNCTION(0x1, "ts", "mp5", V(0, 0, 0, 1, 1)), | ||
309 | MPP_VAR_FUNCTION(0x2, "tdm", "spi-miso", V(0, 0, 0, 1, 1)), | ||
310 | MPP_VAR_FUNCTION(0x4, "audio", "lrclk", V(0, 0, 0, 1, 1)), | ||
311 | MPP_VAR_FUNCTION(0xb, "lcd", "d21", V(0, 0, 0, 0, 1))), | ||
312 | MPP_MODE(42, | ||
313 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(0, 0, 0, 1, 1)), | ||
314 | MPP_VAR_FUNCTION(0x1, "ts", "mp6", V(0, 0, 0, 1, 1)), | ||
315 | MPP_VAR_FUNCTION(0x2, "tdm", "spi-mosi", V(0, 0, 0, 1, 1)), | ||
316 | MPP_VAR_FUNCTION(0x4, "audio", "mclk", V(0, 0, 0, 1, 1)), | ||
317 | MPP_VAR_FUNCTION(0xb, "lcd", "d22", V(0, 0, 0, 0, 1))), | ||
318 | MPP_MODE(43, | ||
319 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(0, 0, 0, 1, 1)), | ||
320 | MPP_VAR_FUNCTION(0x1, "ts", "mp7", V(0, 0, 0, 1, 1)), | ||
321 | MPP_VAR_FUNCTION(0x2, "tdm", "int", V(0, 0, 0, 1, 1)), | ||
322 | MPP_VAR_FUNCTION(0x4, "audio", "sdi", V(0, 0, 0, 1, 1)), | ||
323 | MPP_VAR_FUNCTION(0xb, "lcd", "d23", V(0, 0, 0, 0, 1))), | ||
324 | MPP_MODE(44, | ||
325 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(0, 0, 0, 1, 1)), | ||
326 | MPP_VAR_FUNCTION(0x1, "ts", "mp8", V(0, 0, 0, 1, 1)), | ||
327 | MPP_VAR_FUNCTION(0x2, "tdm", "rst", V(0, 0, 0, 1, 1)), | ||
328 | MPP_VAR_FUNCTION(0x4, "audio", "extclk", V(0, 0, 0, 1, 1)), | ||
329 | MPP_VAR_FUNCTION(0xb, "lcd", "clk", V(0, 0, 0, 0, 1))), | ||
330 | MPP_MODE(45, | ||
331 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(0, 0, 0, 1, 1)), | ||
332 | MPP_VAR_FUNCTION(0x1, "ts", "mp9", V(0, 0, 0, 1, 1)), | ||
333 | MPP_VAR_FUNCTION(0x2, "tdm", "pclk", V(0, 0, 0, 1, 1)), | ||
334 | MPP_VAR_FUNCTION(0xb, "lcd", "e", V(0, 0, 0, 0, 1))), | ||
335 | MPP_MODE(46, | ||
336 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(0, 0, 0, 1, 1)), | ||
337 | MPP_VAR_FUNCTION(0x1, "ts", "mp10", V(0, 0, 0, 1, 1)), | ||
338 | MPP_VAR_FUNCTION(0x2, "tdm", "fs", V(0, 0, 0, 1, 1)), | ||
339 | MPP_VAR_FUNCTION(0xb, "lcd", "hsync", V(0, 0, 0, 0, 1))), | ||
340 | MPP_MODE(47, | ||
341 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(0, 0, 0, 1, 1)), | ||
342 | MPP_VAR_FUNCTION(0x1, "ts", "mp11", V(0, 0, 0, 1, 1)), | ||
343 | MPP_VAR_FUNCTION(0x2, "tdm", "drx", V(0, 0, 0, 1, 1)), | ||
344 | MPP_VAR_FUNCTION(0xb, "lcd", "vsync", V(0, 0, 0, 0, 1))), | ||
345 | MPP_MODE(48, | ||
346 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(0, 0, 0, 1, 1)), | ||
347 | MPP_VAR_FUNCTION(0x1, "ts", "mp12", V(0, 0, 0, 1, 1)), | ||
348 | MPP_VAR_FUNCTION(0x2, "tdm", "dtx", V(0, 0, 0, 1, 1)), | ||
349 | MPP_VAR_FUNCTION(0xb, "lcd", "d16", V(0, 0, 0, 0, 1))), | ||
350 | MPP_MODE(49, | ||
351 | MPP_VAR_FUNCTION(0x0, "gpio", NULL, V(0, 0, 0, 1, 0)), | ||
352 | MPP_VAR_FUNCTION(0x0, "gpo", NULL, V(0, 0, 0, 0, 1)), | ||
353 | MPP_VAR_FUNCTION(0x1, "ts", "mp9", V(0, 0, 0, 1, 0)), | ||
354 | MPP_VAR_FUNCTION(0x2, "tdm", "rx0ql", V(0, 0, 0, 1, 1)), | ||
355 | MPP_VAR_FUNCTION(0x5, "ptp", "clk", V(0, 0, 0, 1, 0)), | ||
356 | MPP_VAR_FUNCTION(0xa, "pex", "clkreq", V(0, 0, 0, 0, 1)), | ||
357 | MPP_VAR_FUNCTION(0xb, "lcd", "d17", V(0, 0, 0, 0, 1))), | ||
358 | }; | ||
359 | |||
360 | static struct mvebu_mpp_ctrl mv88f6180_mpp_controls[] = { | ||
361 | MPP_REG_CTRL(0, 29), | ||
362 | }; | ||
363 | |||
364 | static struct pinctrl_gpio_range mv88f6180_gpio_ranges[] = { | ||
365 | MPP_GPIO_RANGE(0, 0, 0, 30), | ||
366 | }; | ||
367 | |||
368 | static struct mvebu_mpp_ctrl mv88f619x_mpp_controls[] = { | ||
369 | MPP_REG_CTRL(0, 35), | ||
370 | }; | ||
371 | |||
372 | static struct pinctrl_gpio_range mv88f619x_gpio_ranges[] = { | ||
373 | MPP_GPIO_RANGE(0, 0, 0, 32), | ||
374 | MPP_GPIO_RANGE(1, 32, 32, 4), | ||
375 | }; | ||
376 | |||
377 | static struct mvebu_mpp_ctrl mv88f628x_mpp_controls[] = { | ||
378 | MPP_REG_CTRL(0, 49), | ||
379 | }; | ||
380 | |||
381 | static struct pinctrl_gpio_range mv88f628x_gpio_ranges[] = { | ||
382 | MPP_GPIO_RANGE(0, 0, 0, 32), | ||
383 | MPP_GPIO_RANGE(1, 32, 32, 18), | ||
384 | }; | ||
385 | |||
386 | static struct mvebu_pinctrl_soc_info mv88f6180_info = { | ||
387 | .variant = VARIANT_MV88F6180, | ||
388 | .controls = mv88f6180_mpp_controls, | ||
389 | .ncontrols = ARRAY_SIZE(mv88f6180_mpp_controls), | ||
390 | .modes = mv88f6xxx_mpp_modes, | ||
391 | .nmodes = ARRAY_SIZE(mv88f6xxx_mpp_modes), | ||
392 | .gpioranges = mv88f6180_gpio_ranges, | ||
393 | .ngpioranges = ARRAY_SIZE(mv88f6180_gpio_ranges), | ||
394 | }; | ||
395 | |||
396 | static struct mvebu_pinctrl_soc_info mv88f6190_info = { | ||
397 | .variant = VARIANT_MV88F6190, | ||
398 | .controls = mv88f619x_mpp_controls, | ||
399 | .ncontrols = ARRAY_SIZE(mv88f619x_mpp_controls), | ||
400 | .modes = mv88f6xxx_mpp_modes, | ||
401 | .nmodes = ARRAY_SIZE(mv88f6xxx_mpp_modes), | ||
402 | .gpioranges = mv88f619x_gpio_ranges, | ||
403 | .ngpioranges = ARRAY_SIZE(mv88f619x_gpio_ranges), | ||
404 | }; | ||
405 | |||
406 | static struct mvebu_pinctrl_soc_info mv88f6192_info = { | ||
407 | .variant = VARIANT_MV88F6192, | ||
408 | .controls = mv88f619x_mpp_controls, | ||
409 | .ncontrols = ARRAY_SIZE(mv88f619x_mpp_controls), | ||
410 | .modes = mv88f6xxx_mpp_modes, | ||
411 | .nmodes = ARRAY_SIZE(mv88f6xxx_mpp_modes), | ||
412 | .gpioranges = mv88f619x_gpio_ranges, | ||
413 | .ngpioranges = ARRAY_SIZE(mv88f619x_gpio_ranges), | ||
414 | }; | ||
415 | |||
416 | static struct mvebu_pinctrl_soc_info mv88f6281_info = { | ||
417 | .variant = VARIANT_MV88F6281, | ||
418 | .controls = mv88f628x_mpp_controls, | ||
419 | .ncontrols = ARRAY_SIZE(mv88f628x_mpp_controls), | ||
420 | .modes = mv88f6xxx_mpp_modes, | ||
421 | .nmodes = ARRAY_SIZE(mv88f6xxx_mpp_modes), | ||
422 | .gpioranges = mv88f628x_gpio_ranges, | ||
423 | .ngpioranges = ARRAY_SIZE(mv88f628x_gpio_ranges), | ||
424 | }; | ||
425 | |||
426 | static struct mvebu_pinctrl_soc_info mv88f6282_info = { | ||
427 | .variant = VARIANT_MV88F6282, | ||
428 | .controls = mv88f628x_mpp_controls, | ||
429 | .ncontrols = ARRAY_SIZE(mv88f628x_mpp_controls), | ||
430 | .modes = mv88f6xxx_mpp_modes, | ||
431 | .nmodes = ARRAY_SIZE(mv88f6xxx_mpp_modes), | ||
432 | .gpioranges = mv88f628x_gpio_ranges, | ||
433 | .ngpioranges = ARRAY_SIZE(mv88f628x_gpio_ranges), | ||
434 | }; | ||
435 | |||
436 | static struct of_device_id kirkwood_pinctrl_of_match[] __devinitdata = { | ||
437 | { .compatible = "marvell,88f6180-pinctrl", .data = &mv88f6180_info }, | ||
438 | { .compatible = "marvell,88f6190-pinctrl", .data = &mv88f6190_info }, | ||
439 | { .compatible = "marvell,88f6192-pinctrl", .data = &mv88f6192_info }, | ||
440 | { .compatible = "marvell,88f6281-pinctrl", .data = &mv88f6281_info }, | ||
441 | { .compatible = "marvell,88f6282-pinctrl", .data = &mv88f6282_info }, | ||
442 | { } | ||
443 | }; | ||
444 | |||
445 | static int __devinit kirkwood_pinctrl_probe(struct platform_device *pdev) | ||
446 | { | ||
447 | const struct of_device_id *match = | ||
448 | of_match_device(kirkwood_pinctrl_of_match, &pdev->dev); | ||
449 | pdev->dev.platform_data = match->data; | ||
450 | return mvebu_pinctrl_probe(pdev); | ||
451 | } | ||
452 | |||
453 | static int __devexit kirkwood_pinctrl_remove(struct platform_device *pdev) | ||
454 | { | ||
455 | return mvebu_pinctrl_remove(pdev); | ||
456 | } | ||
457 | |||
458 | static struct platform_driver kirkwood_pinctrl_driver = { | ||
459 | .driver = { | ||
460 | .name = "kirkwood-pinctrl", | ||
461 | .owner = THIS_MODULE, | ||
462 | .of_match_table = of_match_ptr(kirkwood_pinctrl_of_match), | ||
463 | }, | ||
464 | .probe = kirkwood_pinctrl_probe, | ||
465 | .remove = __devexit_p(kirkwood_pinctrl_remove), | ||
466 | }; | ||
467 | |||
468 | module_platform_driver(kirkwood_pinctrl_driver); | ||
469 | |||
470 | MODULE_AUTHOR("Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>"); | ||
471 | MODULE_DESCRIPTION("Marvell Kirkwood pinctrl driver"); | ||
472 | MODULE_LICENSE("GPL v2"); | ||
diff --git a/drivers/pinctrl/pinmux.c b/drivers/pinctrl/pinmux.c index 9301a7a95eff..0ef01ee2835f 100644 --- a/drivers/pinctrl/pinmux.c +++ b/drivers/pinctrl/pinmux.c | |||
@@ -314,14 +314,11 @@ int pinmux_map_to_setting(struct pinctrl_map const *map, | |||
314 | { | 314 | { |
315 | struct pinctrl_dev *pctldev = setting->pctldev; | 315 | struct pinctrl_dev *pctldev = setting->pctldev; |
316 | const struct pinmux_ops *pmxops = pctldev->desc->pmxops; | 316 | const struct pinmux_ops *pmxops = pctldev->desc->pmxops; |
317 | const struct pinctrl_ops *pctlops = pctldev->desc->pctlops; | ||
318 | char const * const *groups; | 317 | char const * const *groups; |
319 | unsigned num_groups; | 318 | unsigned num_groups; |
320 | int ret; | 319 | int ret; |
321 | const char *group; | 320 | const char *group; |
322 | int i; | 321 | int i; |
323 | const unsigned *pins; | ||
324 | unsigned num_pins; | ||
325 | 322 | ||
326 | if (!pmxops) { | 323 | if (!pmxops) { |
327 | dev_err(pctldev->dev, "does not support mux function\n"); | 324 | dev_err(pctldev->dev, "does not support mux function\n"); |
@@ -376,53 +373,12 @@ int pinmux_map_to_setting(struct pinctrl_map const *map, | |||
376 | } | 373 | } |
377 | setting->data.mux.group = ret; | 374 | setting->data.mux.group = ret; |
378 | 375 | ||
379 | ret = pctlops->get_group_pins(pctldev, setting->data.mux.group, &pins, | ||
380 | &num_pins); | ||
381 | if (ret) { | ||
382 | dev_err(pctldev->dev, | ||
383 | "could not get pins for device %s group selector %d\n", | ||
384 | pinctrl_dev_get_name(pctldev), setting->data.mux.group); | ||
385 | return -ENODEV; | ||
386 | } | ||
387 | |||
388 | /* Try to allocate all pins in this group, one by one */ | ||
389 | for (i = 0; i < num_pins; i++) { | ||
390 | ret = pin_request(pctldev, pins[i], map->dev_name, NULL); | ||
391 | if (ret) { | ||
392 | dev_err(pctldev->dev, | ||
393 | "could not request pin %d on device %s\n", | ||
394 | pins[i], pinctrl_dev_get_name(pctldev)); | ||
395 | /* On error release all taken pins */ | ||
396 | i--; /* this pin just failed */ | ||
397 | for (; i >= 0; i--) | ||
398 | pin_free(pctldev, pins[i], NULL); | ||
399 | return -ENODEV; | ||
400 | } | ||
401 | } | ||
402 | |||
403 | return 0; | 376 | return 0; |
404 | } | 377 | } |
405 | 378 | ||
406 | void pinmux_free_setting(struct pinctrl_setting const *setting) | 379 | void pinmux_free_setting(struct pinctrl_setting const *setting) |
407 | { | 380 | { |
408 | struct pinctrl_dev *pctldev = setting->pctldev; | 381 | /* This function is currently unused */ |
409 | const struct pinctrl_ops *pctlops = pctldev->desc->pctlops; | ||
410 | const unsigned *pins; | ||
411 | unsigned num_pins; | ||
412 | int ret; | ||
413 | int i; | ||
414 | |||
415 | ret = pctlops->get_group_pins(pctldev, setting->data.mux.group, | ||
416 | &pins, &num_pins); | ||
417 | if (ret) { | ||
418 | dev_err(pctldev->dev, | ||
419 | "could not get pins for device %s group selector %d\n", | ||
420 | pinctrl_dev_get_name(pctldev), setting->data.mux.group); | ||
421 | return; | ||
422 | } | ||
423 | |||
424 | for (i = 0; i < num_pins; i++) | ||
425 | pin_free(pctldev, pins[i], NULL); | ||
426 | } | 382 | } |
427 | 383 | ||
428 | int pinmux_enable_setting(struct pinctrl_setting const *setting) | 384 | int pinmux_enable_setting(struct pinctrl_setting const *setting) |
@@ -446,6 +402,22 @@ int pinmux_enable_setting(struct pinctrl_setting const *setting) | |||
446 | num_pins = 0; | 402 | num_pins = 0; |
447 | } | 403 | } |
448 | 404 | ||
405 | /* Try to allocate all pins in this group, one by one */ | ||
406 | for (i = 0; i < num_pins; i++) { | ||
407 | ret = pin_request(pctldev, pins[i], setting->dev_name, NULL); | ||
408 | if (ret) { | ||
409 | dev_err(pctldev->dev, | ||
410 | "could not request pin %d on device %s\n", | ||
411 | pins[i], pinctrl_dev_get_name(pctldev)); | ||
412 | /* On error release all taken pins */ | ||
413 | i--; /* this pin just failed */ | ||
414 | for (; i >= 0; i--) | ||
415 | pin_free(pctldev, pins[i], NULL); | ||
416 | return -ENODEV; | ||
417 | } | ||
418 | } | ||
419 | |||
420 | /* Now that we have acquired the pins, encode the mux setting */ | ||
449 | for (i = 0; i < num_pins; i++) { | 421 | for (i = 0; i < num_pins; i++) { |
450 | desc = pin_desc_get(pctldev, pins[i]); | 422 | desc = pin_desc_get(pctldev, pins[i]); |
451 | if (desc == NULL) { | 423 | if (desc == NULL) { |
@@ -482,6 +454,7 @@ void pinmux_disable_setting(struct pinctrl_setting const *setting) | |||
482 | num_pins = 0; | 454 | num_pins = 0; |
483 | } | 455 | } |
484 | 456 | ||
457 | /* Flag the descs that no setting is active */ | ||
485 | for (i = 0; i < num_pins; i++) { | 458 | for (i = 0; i < num_pins; i++) { |
486 | desc = pin_desc_get(pctldev, pins[i]); | 459 | desc = pin_desc_get(pctldev, pins[i]); |
487 | if (desc == NULL) { | 460 | if (desc == NULL) { |
@@ -493,6 +466,10 @@ void pinmux_disable_setting(struct pinctrl_setting const *setting) | |||
493 | desc->mux_setting = NULL; | 466 | desc->mux_setting = NULL; |
494 | } | 467 | } |
495 | 468 | ||
469 | /* And release the pins */ | ||
470 | for (i = 0; i < num_pins; i++) | ||
471 | pin_free(pctldev, pins[i], NULL); | ||
472 | |||
496 | if (ops->disable) | 473 | if (ops->disable) |
497 | ops->disable(pctldev, setting->data.mux.func, setting->data.mux.group); | 474 | ops->disable(pctldev, setting->data.mux.func, setting->data.mux.group); |
498 | } | 475 | } |
diff --git a/drivers/power/Kconfig b/drivers/power/Kconfig index 49a893972318..b1d956d81f0c 100644 --- a/drivers/power/Kconfig +++ b/drivers/power/Kconfig | |||
@@ -335,6 +335,9 @@ config AB8500_BATTERY_THERM_ON_BATCTRL | |||
335 | help | 335 | help |
336 | Say Y to enable battery temperature measurements using | 336 | Say Y to enable battery temperature measurements using |
337 | thermistor connected on BATCTRL ADC. | 337 | thermistor connected on BATCTRL ADC. |
338 | |||
339 | source "drivers/power/reset/Kconfig" | ||
340 | |||
338 | endif # POWER_SUPPLY | 341 | endif # POWER_SUPPLY |
339 | 342 | ||
340 | source "drivers/power/avs/Kconfig" | 343 | source "drivers/power/avs/Kconfig" |
diff --git a/drivers/power/Makefile b/drivers/power/Makefile index b949cf85590c..f1d99f4a0bc3 100644 --- a/drivers/power/Makefile +++ b/drivers/power/Makefile | |||
@@ -49,3 +49,4 @@ obj-$(CONFIG_CHARGER_MAX8997) += max8997_charger.o | |||
49 | obj-$(CONFIG_CHARGER_MAX8998) += max8998_charger.o | 49 | obj-$(CONFIG_CHARGER_MAX8998) += max8998_charger.o |
50 | obj-$(CONFIG_POWER_AVS) += avs/ | 50 | obj-$(CONFIG_POWER_AVS) += avs/ |
51 | obj-$(CONFIG_CHARGER_SMB347) += smb347-charger.o | 51 | obj-$(CONFIG_CHARGER_SMB347) += smb347-charger.o |
52 | obj-$(CONFIG_POWER_RESET) += reset/ | ||
diff --git a/drivers/power/reset/Kconfig b/drivers/power/reset/Kconfig new file mode 100644 index 000000000000..6461b489fb09 --- /dev/null +++ b/drivers/power/reset/Kconfig | |||
@@ -0,0 +1,15 @@ | |||
1 | menuconfig POWER_RESET | ||
2 | bool "Board level reset or power off" | ||
3 | help | ||
4 | Provides a number of drivers which either reset a complete board | ||
5 | or shut it down, by manipulating the main power supply on the board. | ||
6 | |||
7 | Say Y here to enable board reset and power off | ||
8 | |||
9 | config POWER_RESET_GPIO | ||
10 | bool "GPIO power-off driver" | ||
11 | depends on OF_GPIO && POWER_RESET | ||
12 | help | ||
13 | This driver supports turning off your board via a GPIO line. | ||
14 | If your board needs a GPIO high/low to power down, say Y and | ||
15 | create a binding in your devicetree. | ||
diff --git a/drivers/power/reset/Makefile b/drivers/power/reset/Makefile new file mode 100644 index 000000000000..751488a4a0c5 --- /dev/null +++ b/drivers/power/reset/Makefile | |||
@@ -0,0 +1 @@ | |||
obj-$(CONFIG_POWER_RESET_GPIO) += gpio-poweroff.o | |||
diff --git a/drivers/power/reset/gpio-poweroff.c b/drivers/power/reset/gpio-poweroff.c new file mode 100644 index 000000000000..0491e5335d02 --- /dev/null +++ b/drivers/power/reset/gpio-poweroff.c | |||
@@ -0,0 +1,129 @@ | |||
1 | /* | ||
2 | * Toggles a GPIO pin to power down a device | ||
3 | * | ||
4 | * Jamie Lentin <jm@lentin.co.uk> | ||
5 | * Andrew Lunn <andrew@lunn.ch> | ||
6 | * | ||
7 | * Copyright (C) 2012 Jamie Lentin | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License version 2 as | ||
11 | * published by the Free Software Foundation. | ||
12 | * | ||
13 | */ | ||
14 | #include <linux/kernel.h> | ||
15 | #include <linux/init.h> | ||
16 | #include <linux/delay.h> | ||
17 | #include <linux/platform_device.h> | ||
18 | #include <linux/gpio.h> | ||
19 | #include <linux/of_platform.h> | ||
20 | #include <linux/of_gpio.h> | ||
21 | #include <linux/module.h> | ||
22 | |||
23 | /* | ||
24 | * Hold configuration here, cannot be more than one instance of the driver | ||
25 | * since pm_power_off itself is global. | ||
26 | */ | ||
27 | static int gpio_num = -1; | ||
28 | static int gpio_active_low; | ||
29 | |||
30 | static void gpio_poweroff_do_poweroff(void) | ||
31 | { | ||
32 | BUG_ON(gpio_num == -1); | ||
33 | |||
34 | /* drive it active */ | ||
35 | gpio_direction_output(gpio_num, !gpio_active_low); | ||
36 | mdelay(100); | ||
37 | /* rising edge or drive inactive */ | ||
38 | gpio_set_value(gpio_num, gpio_active_low); | ||
39 | mdelay(100); | ||
40 | /* falling edge */ | ||
41 | gpio_set_value(gpio_num, !gpio_active_low); | ||
42 | |||
43 | /* give it some time */ | ||
44 | mdelay(3000); | ||
45 | |||
46 | WARN_ON(1); | ||
47 | } | ||
48 | |||
49 | static int __devinit gpio_poweroff_probe(struct platform_device *pdev) | ||
50 | { | ||
51 | enum of_gpio_flags flags; | ||
52 | bool input = false; | ||
53 | int ret; | ||
54 | |||
55 | /* If a pm_power_off function has already been added, leave it alone */ | ||
56 | if (pm_power_off != NULL) { | ||
57 | pr_err("%s: pm_power_off function already registered", | ||
58 | __func__); | ||
59 | return -EBUSY; | ||
60 | } | ||
61 | |||
62 | gpio_num = of_get_gpio_flags(pdev->dev.of_node, 0, &flags); | ||
63 | if (gpio_num < 0) { | ||
64 | pr_err("%s: Could not get GPIO configuration: %d", | ||
65 | __func__, gpio_num); | ||
66 | return -ENODEV; | ||
67 | } | ||
68 | gpio_active_low = flags & OF_GPIO_ACTIVE_LOW; | ||
69 | |||
70 | if (of_get_property(pdev->dev.of_node, "input", NULL)) | ||
71 | input = true; | ||
72 | |||
73 | ret = gpio_request(gpio_num, "poweroff-gpio"); | ||
74 | if (ret) { | ||
75 | pr_err("%s: Could not get GPIO %d", __func__, gpio_num); | ||
76 | return ret; | ||
77 | } | ||
78 | if (input) { | ||
79 | if (gpio_direction_input(gpio_num)) { | ||
80 | pr_err("Could not set direction of GPIO %d to input", | ||
81 | gpio_num); | ||
82 | goto err; | ||
83 | } | ||
84 | } else { | ||
85 | if (gpio_direction_output(gpio_num, gpio_active_low)) { | ||
86 | pr_err("Could not set direction of GPIO %d", gpio_num); | ||
87 | goto err; | ||
88 | } | ||
89 | } | ||
90 | |||
91 | pm_power_off = &gpio_poweroff_do_poweroff; | ||
92 | return 0; | ||
93 | |||
94 | err: | ||
95 | gpio_free(gpio_num); | ||
96 | return -ENODEV; | ||
97 | } | ||
98 | |||
99 | static int __devexit gpio_poweroff_remove(struct platform_device *pdev) | ||
100 | { | ||
101 | if (gpio_num != -1) | ||
102 | gpio_free(gpio_num); | ||
103 | if (pm_power_off == &gpio_poweroff_do_poweroff) | ||
104 | pm_power_off = NULL; | ||
105 | |||
106 | return 0; | ||
107 | } | ||
108 | |||
109 | static const struct of_device_id of_gpio_poweroff_match[] = { | ||
110 | { .compatible = "gpio-poweroff", }, | ||
111 | {}, | ||
112 | }; | ||
113 | |||
114 | static struct platform_driver gpio_poweroff_driver = { | ||
115 | .probe = gpio_poweroff_probe, | ||
116 | .remove = __devexit_p(gpio_poweroff_remove), | ||
117 | .driver = { | ||
118 | .name = "poweroff-gpio", | ||
119 | .owner = THIS_MODULE, | ||
120 | .of_match_table = of_gpio_poweroff_match, | ||
121 | }, | ||
122 | }; | ||
123 | |||
124 | module_platform_driver(gpio_poweroff_driver); | ||
125 | |||
126 | MODULE_AUTHOR("Jamie Lentin <jm@lentin.co.uk>"); | ||
127 | MODULE_DESCRIPTION("GPIO poweroff driver"); | ||
128 | MODULE_LICENSE("GPL"); | ||
129 | MODULE_ALIAS("platform:poweroff-gpio"); | ||
diff --git a/drivers/rapidio/rio.c b/drivers/rapidio/rio.c index c17ae22567e0..0c6fcb461faf 100644 --- a/drivers/rapidio/rio.c +++ b/drivers/rapidio/rio.c | |||
@@ -401,7 +401,7 @@ EXPORT_SYMBOL_GPL(rio_release_inb_pwrite); | |||
401 | /** | 401 | /** |
402 | * rio_map_inb_region -- Map inbound memory region. | 402 | * rio_map_inb_region -- Map inbound memory region. |
403 | * @mport: Master port. | 403 | * @mport: Master port. |
404 | * @lstart: physical address of memory region to be mapped | 404 | * @local: physical address of memory region to be mapped |
405 | * @rbase: RIO base address assigned to this window | 405 | * @rbase: RIO base address assigned to this window |
406 | * @size: Size of the memory region | 406 | * @size: Size of the memory region |
407 | * @rflags: Flags for mapping. | 407 | * @rflags: Flags for mapping. |
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index 5c4829cba6a6..e872c8be080e 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c | |||
@@ -1381,22 +1381,14 @@ struct regulator *regulator_get_exclusive(struct device *dev, const char *id) | |||
1381 | } | 1381 | } |
1382 | EXPORT_SYMBOL_GPL(regulator_get_exclusive); | 1382 | EXPORT_SYMBOL_GPL(regulator_get_exclusive); |
1383 | 1383 | ||
1384 | /** | 1384 | /* Locks held by regulator_put() */ |
1385 | * regulator_put - "free" the regulator source | 1385 | static void _regulator_put(struct regulator *regulator) |
1386 | * @regulator: regulator source | ||
1387 | * | ||
1388 | * Note: drivers must ensure that all regulator_enable calls made on this | ||
1389 | * regulator source are balanced by regulator_disable calls prior to calling | ||
1390 | * this function. | ||
1391 | */ | ||
1392 | void regulator_put(struct regulator *regulator) | ||
1393 | { | 1386 | { |
1394 | struct regulator_dev *rdev; | 1387 | struct regulator_dev *rdev; |
1395 | 1388 | ||
1396 | if (regulator == NULL || IS_ERR(regulator)) | 1389 | if (regulator == NULL || IS_ERR(regulator)) |
1397 | return; | 1390 | return; |
1398 | 1391 | ||
1399 | mutex_lock(®ulator_list_mutex); | ||
1400 | rdev = regulator->rdev; | 1392 | rdev = regulator->rdev; |
1401 | 1393 | ||
1402 | debugfs_remove_recursive(regulator->debugfs); | 1394 | debugfs_remove_recursive(regulator->debugfs); |
@@ -1412,6 +1404,20 @@ void regulator_put(struct regulator *regulator) | |||
1412 | rdev->exclusive = 0; | 1404 | rdev->exclusive = 0; |
1413 | 1405 | ||
1414 | module_put(rdev->owner); | 1406 | module_put(rdev->owner); |
1407 | } | ||
1408 | |||
1409 | /** | ||
1410 | * regulator_put - "free" the regulator source | ||
1411 | * @regulator: regulator source | ||
1412 | * | ||
1413 | * Note: drivers must ensure that all regulator_enable calls made on this | ||
1414 | * regulator source are balanced by regulator_disable calls prior to calling | ||
1415 | * this function. | ||
1416 | */ | ||
1417 | void regulator_put(struct regulator *regulator) | ||
1418 | { | ||
1419 | mutex_lock(®ulator_list_mutex); | ||
1420 | _regulator_put(regulator); | ||
1415 | mutex_unlock(®ulator_list_mutex); | 1421 | mutex_unlock(®ulator_list_mutex); |
1416 | } | 1422 | } |
1417 | EXPORT_SYMBOL_GPL(regulator_put); | 1423 | EXPORT_SYMBOL_GPL(regulator_put); |
@@ -1974,7 +1980,7 @@ int regulator_is_supported_voltage(struct regulator *regulator, | |||
1974 | if (!(rdev->constraints->valid_ops_mask & REGULATOR_CHANGE_VOLTAGE)) { | 1980 | if (!(rdev->constraints->valid_ops_mask & REGULATOR_CHANGE_VOLTAGE)) { |
1975 | ret = regulator_get_voltage(regulator); | 1981 | ret = regulator_get_voltage(regulator); |
1976 | if (ret >= 0) | 1982 | if (ret >= 0) |
1977 | return (min_uV >= ret && ret <= max_uV); | 1983 | return (min_uV <= ret && ret <= max_uV); |
1978 | else | 1984 | else |
1979 | return ret; | 1985 | return ret; |
1980 | } | 1986 | } |
@@ -3365,7 +3371,7 @@ regulator_register(const struct regulator_desc *regulator_desc, | |||
3365 | if (ret != 0) { | 3371 | if (ret != 0) { |
3366 | rdev_err(rdev, "Failed to request enable GPIO%d: %d\n", | 3372 | rdev_err(rdev, "Failed to request enable GPIO%d: %d\n", |
3367 | config->ena_gpio, ret); | 3373 | config->ena_gpio, ret); |
3368 | goto clean; | 3374 | goto wash; |
3369 | } | 3375 | } |
3370 | 3376 | ||
3371 | rdev->ena_gpio = config->ena_gpio; | 3377 | rdev->ena_gpio = config->ena_gpio; |
@@ -3445,10 +3451,11 @@ unset_supplies: | |||
3445 | 3451 | ||
3446 | scrub: | 3452 | scrub: |
3447 | if (rdev->supply) | 3453 | if (rdev->supply) |
3448 | regulator_put(rdev->supply); | 3454 | _regulator_put(rdev->supply); |
3449 | if (rdev->ena_gpio) | 3455 | if (rdev->ena_gpio) |
3450 | gpio_free(rdev->ena_gpio); | 3456 | gpio_free(rdev->ena_gpio); |
3451 | kfree(rdev->constraints); | 3457 | kfree(rdev->constraints); |
3458 | wash: | ||
3452 | device_unregister(&rdev->dev); | 3459 | device_unregister(&rdev->dev); |
3453 | /* device core frees rdev */ | 3460 | /* device core frees rdev */ |
3454 | rdev = ERR_PTR(ret); | 3461 | rdev = ERR_PTR(ret); |
diff --git a/drivers/s390/char/con3215.c b/drivers/s390/char/con3215.c index 9ffb6d5f17aa..4ed343e4eb41 100644 --- a/drivers/s390/char/con3215.c +++ b/drivers/s390/char/con3215.c | |||
@@ -44,7 +44,6 @@ | |||
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 */ | ||
48 | #define RAW3215_WORKING 4 /* set if a request is being worked on */ | 47 | #define RAW3215_WORKING 4 /* set if a request is being worked on */ |
49 | #define RAW3215_THROTTLED 8 /* set if reading is disabled */ | 48 | #define RAW3215_THROTTLED 8 /* set if reading is disabled */ |
50 | #define RAW3215_STOPPED 16 /* set if writing is disabled */ | 49 | #define RAW3215_STOPPED 16 /* set if writing is disabled */ |
@@ -339,8 +338,10 @@ static void raw3215_wakeup(unsigned long data) | |||
339 | struct tty_struct *tty; | 338 | struct tty_struct *tty; |
340 | 339 | ||
341 | tty = tty_port_tty_get(&raw->port); | 340 | tty = tty_port_tty_get(&raw->port); |
342 | tty_wakeup(tty); | 341 | if (tty) { |
343 | tty_kref_put(tty); | 342 | tty_wakeup(tty); |
343 | tty_kref_put(tty); | ||
344 | } | ||
344 | } | 345 | } |
345 | 346 | ||
346 | /* | 347 | /* |
@@ -629,8 +630,7 @@ static void raw3215_shutdown(struct raw3215_info *raw) | |||
629 | DECLARE_WAITQUEUE(wait, current); | 630 | DECLARE_WAITQUEUE(wait, current); |
630 | unsigned long flags; | 631 | unsigned long flags; |
631 | 632 | ||
632 | if (!(raw->port.flags & ASYNC_INITIALIZED) || | 633 | if (!(raw->port.flags & ASYNC_INITIALIZED)) |
633 | (raw->flags & RAW3215_FIXED)) | ||
634 | return; | 634 | return; |
635 | /* Wait for outstanding requests, then free irq */ | 635 | /* Wait for outstanding requests, then free irq */ |
636 | spin_lock_irqsave(get_ccwdev_lock(raw->cdev), flags); | 636 | spin_lock_irqsave(get_ccwdev_lock(raw->cdev), flags); |
@@ -926,8 +926,6 @@ static int __init con3215_init(void) | |||
926 | dev_set_drvdata(&cdev->dev, raw); | 926 | dev_set_drvdata(&cdev->dev, raw); |
927 | cdev->handler = raw3215_irq; | 927 | cdev->handler = raw3215_irq; |
928 | 928 | ||
929 | raw->flags |= RAW3215_FIXED; | ||
930 | |||
931 | /* Request the console irq */ | 929 | /* Request the console irq */ |
932 | if (raw3215_startup(raw) != 0) { | 930 | if (raw3215_startup(raw) != 0) { |
933 | raw3215_free_info(raw); | 931 | raw3215_free_info(raw); |
diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c index 3e25d3150456..4d6ba00d0047 100644 --- a/drivers/s390/net/qeth_core_main.c +++ b/drivers/s390/net/qeth_core_main.c | |||
@@ -2942,13 +2942,33 @@ static int qeth_query_ipassists_cb(struct qeth_card *card, | |||
2942 | QETH_DBF_TEXT(SETUP, 2, "qipasscb"); | 2942 | QETH_DBF_TEXT(SETUP, 2, "qipasscb"); |
2943 | 2943 | ||
2944 | cmd = (struct qeth_ipa_cmd *) data; | 2944 | cmd = (struct qeth_ipa_cmd *) data; |
2945 | |||
2946 | switch (cmd->hdr.return_code) { | ||
2947 | case IPA_RC_NOTSUPP: | ||
2948 | case IPA_RC_L2_UNSUPPORTED_CMD: | ||
2949 | QETH_DBF_TEXT(SETUP, 2, "ipaunsup"); | ||
2950 | card->options.ipa4.supported_funcs |= IPA_SETADAPTERPARMS; | ||
2951 | card->options.ipa6.supported_funcs |= IPA_SETADAPTERPARMS; | ||
2952 | return -0; | ||
2953 | default: | ||
2954 | if (cmd->hdr.return_code) { | ||
2955 | QETH_DBF_MESSAGE(1, "%s IPA_CMD_QIPASSIST: Unhandled " | ||
2956 | "rc=%d\n", | ||
2957 | dev_name(&card->gdev->dev), | ||
2958 | cmd->hdr.return_code); | ||
2959 | return 0; | ||
2960 | } | ||
2961 | } | ||
2962 | |||
2945 | if (cmd->hdr.prot_version == QETH_PROT_IPV4) { | 2963 | if (cmd->hdr.prot_version == QETH_PROT_IPV4) { |
2946 | card->options.ipa4.supported_funcs = cmd->hdr.ipa_supported; | 2964 | card->options.ipa4.supported_funcs = cmd->hdr.ipa_supported; |
2947 | card->options.ipa4.enabled_funcs = cmd->hdr.ipa_enabled; | 2965 | card->options.ipa4.enabled_funcs = cmd->hdr.ipa_enabled; |
2948 | } else { | 2966 | } else if (cmd->hdr.prot_version == QETH_PROT_IPV6) { |
2949 | card->options.ipa6.supported_funcs = cmd->hdr.ipa_supported; | 2967 | card->options.ipa6.supported_funcs = cmd->hdr.ipa_supported; |
2950 | card->options.ipa6.enabled_funcs = cmd->hdr.ipa_enabled; | 2968 | card->options.ipa6.enabled_funcs = cmd->hdr.ipa_enabled; |
2951 | } | 2969 | } else |
2970 | QETH_DBF_MESSAGE(1, "%s IPA_CMD_QIPASSIST: Flawed LIC detected" | ||
2971 | "\n", dev_name(&card->gdev->dev)); | ||
2952 | QETH_DBF_TEXT(SETUP, 2, "suppenbl"); | 2972 | QETH_DBF_TEXT(SETUP, 2, "suppenbl"); |
2953 | QETH_DBF_TEXT_(SETUP, 2, "%08x", (__u32)cmd->hdr.ipa_supported); | 2973 | QETH_DBF_TEXT_(SETUP, 2, "%08x", (__u32)cmd->hdr.ipa_supported); |
2954 | QETH_DBF_TEXT_(SETUP, 2, "%08x", (__u32)cmd->hdr.ipa_enabled); | 2974 | QETH_DBF_TEXT_(SETUP, 2, "%08x", (__u32)cmd->hdr.ipa_enabled); |
diff --git a/drivers/s390/net/qeth_l2_main.c b/drivers/s390/net/qeth_l2_main.c index e67e0258aec5..fddb62654b6a 100644 --- a/drivers/s390/net/qeth_l2_main.c +++ b/drivers/s390/net/qeth_l2_main.c | |||
@@ -626,10 +626,13 @@ static int qeth_l2_request_initial_mac(struct qeth_card *card) | |||
626 | QETH_DBF_TEXT(SETUP, 2, "doL2init"); | 626 | QETH_DBF_TEXT(SETUP, 2, "doL2init"); |
627 | QETH_DBF_TEXT_(SETUP, 2, "doL2%s", CARD_BUS_ID(card)); | 627 | QETH_DBF_TEXT_(SETUP, 2, "doL2%s", CARD_BUS_ID(card)); |
628 | 628 | ||
629 | rc = qeth_query_setadapterparms(card); | 629 | if (qeth_is_supported(card, IPA_SETADAPTERPARMS)) { |
630 | if (rc) { | 630 | rc = qeth_query_setadapterparms(card); |
631 | QETH_DBF_MESSAGE(2, "could not query adapter parameters on " | 631 | if (rc) { |
632 | "device %s: x%x\n", CARD_BUS_ID(card), rc); | 632 | QETH_DBF_MESSAGE(2, "could not query adapter " |
633 | "parameters on device %s: x%x\n", | ||
634 | CARD_BUS_ID(card), rc); | ||
635 | } | ||
633 | } | 636 | } |
634 | 637 | ||
635 | if (card->info.type == QETH_CARD_TYPE_IQD || | 638 | if (card->info.type == QETH_CARD_TYPE_IQD || |
@@ -676,7 +679,7 @@ static int qeth_l2_set_mac_address(struct net_device *dev, void *p) | |||
676 | return -ERESTARTSYS; | 679 | return -ERESTARTSYS; |
677 | } | 680 | } |
678 | rc = qeth_l2_send_delmac(card, &card->dev->dev_addr[0]); | 681 | rc = qeth_l2_send_delmac(card, &card->dev->dev_addr[0]); |
679 | if (!rc) | 682 | if (!rc || (rc == IPA_RC_L2_MAC_NOT_FOUND)) |
680 | rc = qeth_l2_send_setmac(card, addr->sa_data); | 683 | rc = qeth_l2_send_setmac(card, addr->sa_data); |
681 | return rc ? -EINVAL : 0; | 684 | return rc ? -EINVAL : 0; |
682 | } | 685 | } |
diff --git a/drivers/staging/android/android_alarm.h b/drivers/staging/android/android_alarm.h index f2ffd963f1c3..d0cafd637199 100644 --- a/drivers/staging/android/android_alarm.h +++ b/drivers/staging/android/android_alarm.h | |||
@@ -51,12 +51,10 @@ enum android_alarm_return_flags { | |||
51 | #define ANDROID_ALARM_WAIT _IO('a', 1) | 51 | #define ANDROID_ALARM_WAIT _IO('a', 1) |
52 | 52 | ||
53 | #define ALARM_IOW(c, type, size) _IOW('a', (c) | ((type) << 4), size) | 53 | #define ALARM_IOW(c, type, size) _IOW('a', (c) | ((type) << 4), size) |
54 | #define ALARM_IOR(c, type, size) _IOR('a', (c) | ((type) << 4), size) | ||
55 | |||
56 | /* Set alarm */ | 54 | /* Set alarm */ |
57 | #define ANDROID_ALARM_SET(type) ALARM_IOW(2, type, struct timespec) | 55 | #define ANDROID_ALARM_SET(type) ALARM_IOW(2, type, struct timespec) |
58 | #define ANDROID_ALARM_SET_AND_WAIT(type) ALARM_IOW(3, type, struct timespec) | 56 | #define ANDROID_ALARM_SET_AND_WAIT(type) ALARM_IOW(3, type, struct timespec) |
59 | #define ANDROID_ALARM_GET_TIME(type) ALARM_IOR(4, type, struct timespec) | 57 | #define ANDROID_ALARM_GET_TIME(type) ALARM_IOW(4, type, struct timespec) |
60 | #define ANDROID_ALARM_SET_RTC _IOW('a', 5, struct timespec) | 58 | #define ANDROID_ALARM_SET_RTC _IOW('a', 5, struct timespec) |
61 | #define ANDROID_ALARM_BASE_CMD(cmd) (cmd & ~(_IOC(0, 0, 0xf0, 0))) | 59 | #define ANDROID_ALARM_BASE_CMD(cmd) (cmd & ~(_IOC(0, 0, 0xf0, 0))) |
62 | #define ANDROID_ALARM_IOCTL_TO_TYPE(cmd) (_IOC_NR(cmd) >> 4) | 60 | #define ANDROID_ALARM_IOCTL_TO_TYPE(cmd) (_IOC_NR(cmd) >> 4) |
diff --git a/drivers/tty/hvc/hvc_console.c b/drivers/tty/hvc/hvc_console.c index a5dec1ca1b82..13ee53bd0bf6 100644 --- a/drivers/tty/hvc/hvc_console.c +++ b/drivers/tty/hvc/hvc_console.c | |||
@@ -424,7 +424,6 @@ static void hvc_hangup(struct tty_struct *tty) | |||
424 | { | 424 | { |
425 | struct hvc_struct *hp = tty->driver_data; | 425 | struct hvc_struct *hp = tty->driver_data; |
426 | unsigned long flags; | 426 | unsigned long flags; |
427 | int temp_open_count; | ||
428 | 427 | ||
429 | if (!hp) | 428 | if (!hp) |
430 | return; | 429 | return; |
@@ -444,7 +443,6 @@ static void hvc_hangup(struct tty_struct *tty) | |||
444 | return; | 443 | return; |
445 | } | 444 | } |
446 | 445 | ||
447 | temp_open_count = hp->port.count; | ||
448 | hp->port.count = 0; | 446 | hp->port.count = 0; |
449 | spin_unlock_irqrestore(&hp->port.lock, flags); | 447 | spin_unlock_irqrestore(&hp->port.lock, flags); |
450 | tty_port_tty_set(&hp->port, NULL); | 448 | tty_port_tty_set(&hp->port, NULL); |
@@ -453,11 +451,6 @@ static void hvc_hangup(struct tty_struct *tty) | |||
453 | 451 | ||
454 | if (hp->ops->notifier_hangup) | 452 | if (hp->ops->notifier_hangup) |
455 | hp->ops->notifier_hangup(hp, hp->data); | 453 | hp->ops->notifier_hangup(hp, hp->data); |
456 | |||
457 | while(temp_open_count) { | ||
458 | --temp_open_count; | ||
459 | tty_port_put(&hp->port); | ||
460 | } | ||
461 | } | 454 | } |
462 | 455 | ||
463 | /* | 456 | /* |
diff --git a/drivers/tty/serial/max310x.c b/drivers/tty/serial/max310x.c index 2bc28a59d385..1ab1d2c66de4 100644 --- a/drivers/tty/serial/max310x.c +++ b/drivers/tty/serial/max310x.c | |||
@@ -1239,6 +1239,7 @@ static int __devexit max310x_remove(struct spi_device *spi) | |||
1239 | static const struct spi_device_id max310x_id_table[] = { | 1239 | static const struct spi_device_id max310x_id_table[] = { |
1240 | { "max3107", MAX310X_TYPE_MAX3107 }, | 1240 | { "max3107", MAX310X_TYPE_MAX3107 }, |
1241 | { "max3108", MAX310X_TYPE_MAX3108 }, | 1241 | { "max3108", MAX310X_TYPE_MAX3108 }, |
1242 | { } | ||
1242 | }; | 1243 | }; |
1243 | MODULE_DEVICE_TABLE(spi, max310x_id_table); | 1244 | MODULE_DEVICE_TABLE(spi, max310x_id_table); |
1244 | 1245 | ||
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index 1e741bca0265..f034716190ff 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c | |||
@@ -2151,8 +2151,15 @@ EXPORT_SYMBOL_GPL(usb_bus_start_enum); | |||
2151 | irqreturn_t usb_hcd_irq (int irq, void *__hcd) | 2151 | irqreturn_t usb_hcd_irq (int irq, void *__hcd) |
2152 | { | 2152 | { |
2153 | struct usb_hcd *hcd = __hcd; | 2153 | struct usb_hcd *hcd = __hcd; |
2154 | unsigned long flags; | ||
2154 | irqreturn_t rc; | 2155 | irqreturn_t rc; |
2155 | 2156 | ||
2157 | /* IRQF_DISABLED doesn't work correctly with shared IRQs | ||
2158 | * when the first handler doesn't use it. So let's just | ||
2159 | * assume it's never used. | ||
2160 | */ | ||
2161 | local_irq_save(flags); | ||
2162 | |||
2156 | if (unlikely(HCD_DEAD(hcd) || !HCD_HW_ACCESSIBLE(hcd))) | 2163 | if (unlikely(HCD_DEAD(hcd) || !HCD_HW_ACCESSIBLE(hcd))) |
2157 | rc = IRQ_NONE; | 2164 | rc = IRQ_NONE; |
2158 | else if (hcd->driver->irq(hcd) == IRQ_NONE) | 2165 | else if (hcd->driver->irq(hcd) == IRQ_NONE) |
@@ -2160,6 +2167,7 @@ irqreturn_t usb_hcd_irq (int irq, void *__hcd) | |||
2160 | else | 2167 | else |
2161 | rc = IRQ_HANDLED; | 2168 | rc = IRQ_HANDLED; |
2162 | 2169 | ||
2170 | local_irq_restore(flags); | ||
2163 | return rc; | 2171 | return rc; |
2164 | } | 2172 | } |
2165 | EXPORT_SYMBOL_GPL(usb_hcd_irq); | 2173 | EXPORT_SYMBOL_GPL(usb_hcd_irq); |
@@ -2347,6 +2355,14 @@ static int usb_hcd_request_irqs(struct usb_hcd *hcd, | |||
2347 | int retval; | 2355 | int retval; |
2348 | 2356 | ||
2349 | if (hcd->driver->irq) { | 2357 | if (hcd->driver->irq) { |
2358 | |||
2359 | /* IRQF_DISABLED doesn't work as advertised when used together | ||
2360 | * with IRQF_SHARED. As usb_hcd_irq() will always disable | ||
2361 | * interrupts we can remove it here. | ||
2362 | */ | ||
2363 | if (irqflags & IRQF_SHARED) | ||
2364 | irqflags &= ~IRQF_DISABLED; | ||
2365 | |||
2350 | snprintf(hcd->irq_descr, sizeof(hcd->irq_descr), "%s:usb%d", | 2366 | snprintf(hcd->irq_descr, sizeof(hcd->irq_descr), "%s:usb%d", |
2351 | hcd->driver->description, hcd->self.busnum); | 2367 | hcd->driver->description, hcd->self.busnum); |
2352 | retval = request_irq(irqnum, &usb_hcd_irq, irqflags, | 2368 | retval = request_irq(irqnum, &usb_hcd_irq, irqflags, |
diff --git a/drivers/usb/early/ehci-dbgp.c b/drivers/usb/early/ehci-dbgp.c index e426ad626d74..4bfa78af379c 100644 --- a/drivers/usb/early/ehci-dbgp.c +++ b/drivers/usb/early/ehci-dbgp.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/usb/ehci_def.h> | 20 | #include <linux/usb/ehci_def.h> |
21 | #include <linux/delay.h> | 21 | #include <linux/delay.h> |
22 | #include <linux/serial_core.h> | 22 | #include <linux/serial_core.h> |
23 | #include <linux/kconfig.h> | ||
23 | #include <linux/kgdb.h> | 24 | #include <linux/kgdb.h> |
24 | #include <linux/kthread.h> | 25 | #include <linux/kthread.h> |
25 | #include <asm/io.h> | 26 | #include <asm/io.h> |
@@ -614,12 +615,6 @@ err: | |||
614 | return -ENODEV; | 615 | return -ENODEV; |
615 | } | 616 | } |
616 | 617 | ||
617 | int dbgp_external_startup(struct usb_hcd *hcd) | ||
618 | { | ||
619 | return xen_dbgp_external_startup(hcd) ?: _dbgp_external_startup(); | ||
620 | } | ||
621 | EXPORT_SYMBOL_GPL(dbgp_external_startup); | ||
622 | |||
623 | static int ehci_reset_port(int port) | 618 | static int ehci_reset_port(int port) |
624 | { | 619 | { |
625 | u32 portsc; | 620 | u32 portsc; |
@@ -979,6 +974,7 @@ struct console early_dbgp_console = { | |||
979 | .index = -1, | 974 | .index = -1, |
980 | }; | 975 | }; |
981 | 976 | ||
977 | #if IS_ENABLED(CONFIG_USB_EHCI_HCD) | ||
982 | int dbgp_reset_prep(struct usb_hcd *hcd) | 978 | int dbgp_reset_prep(struct usb_hcd *hcd) |
983 | { | 979 | { |
984 | int ret = xen_dbgp_reset_prep(hcd); | 980 | int ret = xen_dbgp_reset_prep(hcd); |
@@ -1007,6 +1003,13 @@ int dbgp_reset_prep(struct usb_hcd *hcd) | |||
1007 | } | 1003 | } |
1008 | EXPORT_SYMBOL_GPL(dbgp_reset_prep); | 1004 | EXPORT_SYMBOL_GPL(dbgp_reset_prep); |
1009 | 1005 | ||
1006 | int dbgp_external_startup(struct usb_hcd *hcd) | ||
1007 | { | ||
1008 | return xen_dbgp_external_startup(hcd) ?: _dbgp_external_startup(); | ||
1009 | } | ||
1010 | EXPORT_SYMBOL_GPL(dbgp_external_startup); | ||
1011 | #endif /* USB_EHCI_HCD */ | ||
1012 | |||
1010 | #ifdef CONFIG_KGDB | 1013 | #ifdef CONFIG_KGDB |
1011 | 1014 | ||
1012 | static char kgdbdbgp_buf[DBGP_MAX_PACKET]; | 1015 | static char kgdbdbgp_buf[DBGP_MAX_PACKET]; |
diff --git a/drivers/usb/host/ehci-ls1x.c b/drivers/usb/host/ehci-ls1x.c index ca759652626b..aa0f328922df 100644 --- a/drivers/usb/host/ehci-ls1x.c +++ b/drivers/usb/host/ehci-ls1x.c | |||
@@ -113,7 +113,7 @@ static int ehci_hcd_ls1x_probe(struct platform_device *pdev) | |||
113 | goto err_put_hcd; | 113 | goto err_put_hcd; |
114 | } | 114 | } |
115 | 115 | ||
116 | ret = usb_add_hcd(hcd, irq, IRQF_SHARED); | 116 | ret = usb_add_hcd(hcd, irq, IRQF_DISABLED | IRQF_SHARED); |
117 | if (ret) | 117 | if (ret) |
118 | goto err_put_hcd; | 118 | goto err_put_hcd; |
119 | 119 | ||
diff --git a/drivers/usb/host/ehci-orion.c b/drivers/usb/host/ehci-orion.c index 9c2717d66730..e7e8275028d3 100644 --- a/drivers/usb/host/ehci-orion.c +++ b/drivers/usb/host/ehci-orion.c | |||
@@ -14,6 +14,9 @@ | |||
14 | #include <linux/mbus.h> | 14 | #include <linux/mbus.h> |
15 | #include <linux/clk.h> | 15 | #include <linux/clk.h> |
16 | #include <linux/platform_data/usb-ehci-orion.h> | 16 | #include <linux/platform_data/usb-ehci-orion.h> |
17 | #include <linux/of.h> | ||
18 | #include <linux/of_device.h> | ||
19 | #include <linux/of_irq.h> | ||
17 | 20 | ||
18 | #define rdl(off) __raw_readl(hcd->regs + (off)) | 21 | #define rdl(off) __raw_readl(hcd->regs + (off)) |
19 | #define wrl(off, val) __raw_writel((val), hcd->regs + (off)) | 22 | #define wrl(off, val) __raw_writel((val), hcd->regs + (off)) |
@@ -181,6 +184,8 @@ ehci_orion_conf_mbus_windows(struct usb_hcd *hcd, | |||
181 | } | 184 | } |
182 | } | 185 | } |
183 | 186 | ||
187 | static u64 ehci_orion_dma_mask = DMA_BIT_MASK(32); | ||
188 | |||
184 | static int __devinit ehci_orion_drv_probe(struct platform_device *pdev) | 189 | static int __devinit ehci_orion_drv_probe(struct platform_device *pdev) |
185 | { | 190 | { |
186 | struct orion_ehci_data *pd = pdev->dev.platform_data; | 191 | struct orion_ehci_data *pd = pdev->dev.platform_data; |
@@ -191,13 +196,17 @@ static int __devinit ehci_orion_drv_probe(struct platform_device *pdev) | |||
191 | struct clk *clk; | 196 | struct clk *clk; |
192 | void __iomem *regs; | 197 | void __iomem *regs; |
193 | int irq, err; | 198 | int irq, err; |
199 | enum orion_ehci_phy_ver phy_version; | ||
194 | 200 | ||
195 | if (usb_disabled()) | 201 | if (usb_disabled()) |
196 | return -ENODEV; | 202 | return -ENODEV; |
197 | 203 | ||
198 | pr_debug("Initializing Orion-SoC USB Host Controller\n"); | 204 | pr_debug("Initializing Orion-SoC USB Host Controller\n"); |
199 | 205 | ||
200 | irq = platform_get_irq(pdev, 0); | 206 | if (pdev->dev.of_node) |
207 | irq = irq_of_parse_and_map(pdev->dev.of_node, 0); | ||
208 | else | ||
209 | irq = platform_get_irq(pdev, 0); | ||
201 | if (irq <= 0) { | 210 | if (irq <= 0) { |
202 | dev_err(&pdev->dev, | 211 | dev_err(&pdev->dev, |
203 | "Found HC with no IRQ. Check %s setup!\n", | 212 | "Found HC with no IRQ. Check %s setup!\n", |
@@ -215,6 +224,14 @@ static int __devinit ehci_orion_drv_probe(struct platform_device *pdev) | |||
215 | goto err1; | 224 | goto err1; |
216 | } | 225 | } |
217 | 226 | ||
227 | /* | ||
228 | * Right now device-tree probed devices don't get dma_mask | ||
229 | * set. Since shared usb code relies on it, set it here for | ||
230 | * now. Once we have dma capability bindings this can go away. | ||
231 | */ | ||
232 | if (!pdev->dev.dma_mask) | ||
233 | pdev->dev.dma_mask = &ehci_orion_dma_mask; | ||
234 | |||
218 | if (!request_mem_region(res->start, resource_size(res), | 235 | if (!request_mem_region(res->start, resource_size(res), |
219 | ehci_orion_hc_driver.description)) { | 236 | ehci_orion_hc_driver.description)) { |
220 | dev_dbg(&pdev->dev, "controller already in use\n"); | 237 | dev_dbg(&pdev->dev, "controller already in use\n"); |
@@ -262,7 +279,12 @@ static int __devinit ehci_orion_drv_probe(struct platform_device *pdev) | |||
262 | /* | 279 | /* |
263 | * setup Orion USB controller. | 280 | * setup Orion USB controller. |
264 | */ | 281 | */ |
265 | switch (pd->phy_version) { | 282 | if (pdev->dev.of_node) |
283 | phy_version = EHCI_PHY_NA; | ||
284 | else | ||
285 | phy_version = pd->phy_version; | ||
286 | |||
287 | switch (phy_version) { | ||
266 | case EHCI_PHY_NA: /* dont change USB phy settings */ | 288 | case EHCI_PHY_NA: /* dont change USB phy settings */ |
267 | break; | 289 | break; |
268 | case EHCI_PHY_ORION: | 290 | case EHCI_PHY_ORION: |
@@ -317,9 +339,19 @@ static int __exit ehci_orion_drv_remove(struct platform_device *pdev) | |||
317 | 339 | ||
318 | MODULE_ALIAS("platform:orion-ehci"); | 340 | MODULE_ALIAS("platform:orion-ehci"); |
319 | 341 | ||
342 | static const struct of_device_id ehci_orion_dt_ids[] __devinitdata = { | ||
343 | { .compatible = "marvell,orion-ehci", }, | ||
344 | {}, | ||
345 | }; | ||
346 | MODULE_DEVICE_TABLE(of, ehci_orion_dt_ids); | ||
347 | |||
320 | static struct platform_driver ehci_orion_driver = { | 348 | static struct platform_driver ehci_orion_driver = { |
321 | .probe = ehci_orion_drv_probe, | 349 | .probe = ehci_orion_drv_probe, |
322 | .remove = __exit_p(ehci_orion_drv_remove), | 350 | .remove = __exit_p(ehci_orion_drv_remove), |
323 | .shutdown = usb_hcd_platform_shutdown, | 351 | .shutdown = usb_hcd_platform_shutdown, |
324 | .driver.name = "orion-ehci", | 352 | .driver = { |
353 | .name = "orion-ehci", | ||
354 | .owner = THIS_MODULE, | ||
355 | .of_match_table = of_match_ptr(ehci_orion_dt_ids), | ||
356 | }, | ||
325 | }; | 357 | }; |
diff --git a/drivers/usb/host/ohci-xls.c b/drivers/usb/host/ohci-xls.c index 84201cd1a472..41e378f17c66 100644 --- a/drivers/usb/host/ohci-xls.c +++ b/drivers/usb/host/ohci-xls.c | |||
@@ -56,7 +56,7 @@ static int ohci_xls_probe_internal(const struct hc_driver *driver, | |||
56 | goto err3; | 56 | goto err3; |
57 | } | 57 | } |
58 | 58 | ||
59 | retval = usb_add_hcd(hcd, irq, IRQF_SHARED); | 59 | retval = usb_add_hcd(hcd, irq, IRQF_DISABLED | IRQF_SHARED); |
60 | if (retval != 0) | 60 | if (retval != 0) |
61 | goto err4; | 61 | goto err4; |
62 | return retval; | 62 | return retval; |
diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c index d0b87e7b4abf..b6b84dacc791 100644 --- a/drivers/usb/musb/musb_gadget.c +++ b/drivers/usb/musb/musb_gadget.c | |||
@@ -707,11 +707,12 @@ static void rxstate(struct musb *musb, struct musb_request *req) | |||
707 | fifo_count = musb_readw(epio, MUSB_RXCOUNT); | 707 | fifo_count = musb_readw(epio, MUSB_RXCOUNT); |
708 | 708 | ||
709 | /* | 709 | /* |
710 | * use mode 1 only if we expect data of at least ep packet_sz | 710 | * Enable Mode 1 on RX transfers only when short_not_ok flag |
711 | * and have not yet received a short packet | 711 | * is set. Currently short_not_ok flag is set only from |
712 | * file_storage and f_mass_storage drivers | ||
712 | */ | 713 | */ |
713 | if ((request->length - request->actual >= musb_ep->packet_sz) && | 714 | |
714 | (fifo_count >= musb_ep->packet_sz)) | 715 | if (request->short_not_ok && fifo_count == musb_ep->packet_sz) |
715 | use_mode_1 = 1; | 716 | use_mode_1 = 1; |
716 | else | 717 | else |
717 | use_mode_1 = 0; | 718 | use_mode_1 = 0; |
@@ -727,6 +728,27 @@ static void rxstate(struct musb *musb, struct musb_request *req) | |||
727 | c = musb->dma_controller; | 728 | c = musb->dma_controller; |
728 | channel = musb_ep->dma; | 729 | channel = musb_ep->dma; |
729 | 730 | ||
731 | /* We use DMA Req mode 0 in rx_csr, and DMA controller operates in | ||
732 | * mode 0 only. So we do not get endpoint interrupts due to DMA | ||
733 | * completion. We only get interrupts from DMA controller. | ||
734 | * | ||
735 | * We could operate in DMA mode 1 if we knew the size of the tranfer | ||
736 | * in advance. For mass storage class, request->length = what the host | ||
737 | * sends, so that'd work. But for pretty much everything else, | ||
738 | * request->length is routinely more than what the host sends. For | ||
739 | * most these gadgets, end of is signified either by a short packet, | ||
740 | * or filling the last byte of the buffer. (Sending extra data in | ||
741 | * that last pckate should trigger an overflow fault.) But in mode 1, | ||
742 | * we don't get DMA completion interrupt for short packets. | ||
743 | * | ||
744 | * Theoretically, we could enable DMAReq irq (MUSB_RXCSR_DMAMODE = 1), | ||
745 | * to get endpoint interrupt on every DMA req, but that didn't seem | ||
746 | * to work reliably. | ||
747 | * | ||
748 | * REVISIT an updated g_file_storage can set req->short_not_ok, which | ||
749 | * then becomes usable as a runtime "use mode 1" hint... | ||
750 | */ | ||
751 | |||
730 | /* Experimental: Mode1 works with mass storage use cases */ | 752 | /* Experimental: Mode1 works with mass storage use cases */ |
731 | if (use_mode_1) { | 753 | if (use_mode_1) { |
732 | csr |= MUSB_RXCSR_AUTOCLEAR; | 754 | csr |= MUSB_RXCSR_AUTOCLEAR; |
diff --git a/drivers/usb/musb/ux500.c b/drivers/usb/musb/ux500.c index d62a91fedc22..0e62f504410e 100644 --- a/drivers/usb/musb/ux500.c +++ b/drivers/usb/musb/ux500.c | |||
@@ -65,7 +65,7 @@ static int __devinit ux500_probe(struct platform_device *pdev) | |||
65 | struct platform_device *musb; | 65 | struct platform_device *musb; |
66 | struct ux500_glue *glue; | 66 | struct ux500_glue *glue; |
67 | struct clk *clk; | 67 | struct clk *clk; |
68 | 68 | int musbid; | |
69 | int ret = -ENOMEM; | 69 | int ret = -ENOMEM; |
70 | 70 | ||
71 | glue = kzalloc(sizeof(*glue), GFP_KERNEL); | 71 | glue = kzalloc(sizeof(*glue), GFP_KERNEL); |
diff --git a/drivers/usb/otg/Kconfig b/drivers/usb/otg/Kconfig index d8c8a42bff3e..6223062d5d1b 100644 --- a/drivers/usb/otg/Kconfig +++ b/drivers/usb/otg/Kconfig | |||
@@ -58,7 +58,7 @@ config USB_ULPI_VIEWPORT | |||
58 | 58 | ||
59 | config TWL4030_USB | 59 | config TWL4030_USB |
60 | tristate "TWL4030 USB Transceiver Driver" | 60 | tristate "TWL4030 USB Transceiver Driver" |
61 | depends on TWL4030_CORE && REGULATOR_TWL4030 | 61 | depends on TWL4030_CORE && REGULATOR_TWL4030 && USB_MUSB_OMAP2PLUS |
62 | select USB_OTG_UTILS | 62 | select USB_OTG_UTILS |
63 | help | 63 | help |
64 | Enable this to support the USB OTG transceiver on TWL4030 | 64 | Enable this to support the USB OTG transceiver on TWL4030 |
@@ -68,7 +68,7 @@ config TWL4030_USB | |||
68 | 68 | ||
69 | config TWL6030_USB | 69 | config TWL6030_USB |
70 | tristate "TWL6030 USB Transceiver Driver" | 70 | tristate "TWL6030 USB Transceiver Driver" |
71 | depends on TWL4030_CORE && OMAP_USB2 | 71 | depends on TWL4030_CORE && OMAP_USB2 && USB_MUSB_OMAP2PLUS |
72 | select USB_OTG_UTILS | 72 | select USB_OTG_UTILS |
73 | help | 73 | help |
74 | Enable this to support the USB OTG transceiver on TWL6030 | 74 | Enable this to support the USB OTG transceiver on TWL6030 |
diff --git a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c index 7179b0c5f814..cff8dd5b462d 100644 --- a/drivers/usb/serial/keyspan.c +++ b/drivers/usb/serial/keyspan.c | |||
@@ -2430,7 +2430,7 @@ static void keyspan_release(struct usb_serial *serial) | |||
2430 | static int keyspan_port_probe(struct usb_serial_port *port) | 2430 | static int keyspan_port_probe(struct usb_serial_port *port) |
2431 | { | 2431 | { |
2432 | struct usb_serial *serial = port->serial; | 2432 | struct usb_serial *serial = port->serial; |
2433 | struct keyspan_port_private *s_priv; | 2433 | struct keyspan_serial_private *s_priv; |
2434 | struct keyspan_port_private *p_priv; | 2434 | struct keyspan_port_private *p_priv; |
2435 | const struct keyspan_device_details *d_details; | 2435 | const struct keyspan_device_details *d_details; |
2436 | struct callbacks *cback; | 2436 | struct callbacks *cback; |
@@ -2445,7 +2445,6 @@ static int keyspan_port_probe(struct usb_serial_port *port) | |||
2445 | if (!p_priv) | 2445 | if (!p_priv) |
2446 | return -ENOMEM; | 2446 | return -ENOMEM; |
2447 | 2447 | ||
2448 | s_priv = usb_get_serial_data(port->serial); | ||
2449 | p_priv->device_details = d_details; | 2448 | p_priv->device_details = d_details; |
2450 | 2449 | ||
2451 | /* Setup values for the various callback routines */ | 2450 | /* Setup values for the various callback routines */ |
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 5dee7d61241e..edc64bb6f457 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
@@ -158,6 +158,7 @@ static void option_instat_callback(struct urb *urb); | |||
158 | #define NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_HIGHSPEED 0x8001 | 158 | #define NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_HIGHSPEED 0x8001 |
159 | #define NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_FULLSPEED 0x9000 | 159 | #define NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_FULLSPEED 0x9000 |
160 | #define NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_HIGHSPEED 0x9001 | 160 | #define NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_HIGHSPEED 0x9001 |
161 | #define NOVATELWIRELESS_PRODUCT_E362 0x9010 | ||
161 | #define NOVATELWIRELESS_PRODUCT_G1 0xA001 | 162 | #define NOVATELWIRELESS_PRODUCT_G1 0xA001 |
162 | #define NOVATELWIRELESS_PRODUCT_G1_M 0xA002 | 163 | #define NOVATELWIRELESS_PRODUCT_G1_M 0xA002 |
163 | #define NOVATELWIRELESS_PRODUCT_G2 0xA010 | 164 | #define NOVATELWIRELESS_PRODUCT_G2 0xA010 |
@@ -193,6 +194,9 @@ static void option_instat_callback(struct urb *urb); | |||
193 | #define DELL_PRODUCT_5730_MINICARD_TELUS 0x8181 | 194 | #define DELL_PRODUCT_5730_MINICARD_TELUS 0x8181 |
194 | #define DELL_PRODUCT_5730_MINICARD_VZW 0x8182 | 195 | #define DELL_PRODUCT_5730_MINICARD_VZW 0x8182 |
195 | 196 | ||
197 | #define DELL_PRODUCT_5800_MINICARD_VZW 0x8195 /* Novatel E362 */ | ||
198 | #define DELL_PRODUCT_5800_V2_MINICARD_VZW 0x8196 /* Novatel E362 */ | ||
199 | |||
196 | #define KYOCERA_VENDOR_ID 0x0c88 | 200 | #define KYOCERA_VENDOR_ID 0x0c88 |
197 | #define KYOCERA_PRODUCT_KPC650 0x17da | 201 | #define KYOCERA_PRODUCT_KPC650 0x17da |
198 | #define KYOCERA_PRODUCT_KPC680 0x180a | 202 | #define KYOCERA_PRODUCT_KPC680 0x180a |
@@ -283,6 +287,7 @@ static void option_instat_callback(struct urb *urb); | |||
283 | /* ALCATEL PRODUCTS */ | 287 | /* ALCATEL PRODUCTS */ |
284 | #define ALCATEL_VENDOR_ID 0x1bbb | 288 | #define ALCATEL_VENDOR_ID 0x1bbb |
285 | #define ALCATEL_PRODUCT_X060S_X200 0x0000 | 289 | #define ALCATEL_PRODUCT_X060S_X200 0x0000 |
290 | #define ALCATEL_PRODUCT_X220_X500D 0x0017 | ||
286 | 291 | ||
287 | #define PIRELLI_VENDOR_ID 0x1266 | 292 | #define PIRELLI_VENDOR_ID 0x1266 |
288 | #define PIRELLI_PRODUCT_C100_1 0x1002 | 293 | #define PIRELLI_PRODUCT_C100_1 0x1002 |
@@ -706,6 +711,7 @@ static const struct usb_device_id option_ids[] = { | |||
706 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_G2) }, | 711 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_G2) }, |
707 | /* Novatel Ovation MC551 a.k.a. Verizon USB551L */ | 712 | /* Novatel Ovation MC551 a.k.a. Verizon USB551L */ |
708 | { USB_DEVICE_AND_INTERFACE_INFO(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC551, 0xff, 0xff, 0xff) }, | 713 | { USB_DEVICE_AND_INTERFACE_INFO(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC551, 0xff, 0xff, 0xff) }, |
714 | { USB_DEVICE_AND_INTERFACE_INFO(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_E362, 0xff, 0xff, 0xff) }, | ||
709 | 715 | ||
710 | { USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_H01) }, | 716 | { USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_H01) }, |
711 | { USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_H01A) }, | 717 | { USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_H01A) }, |
@@ -728,6 +734,8 @@ static const struct usb_device_id option_ids[] = { | |||
728 | { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_SPRINT) }, /* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */ | 734 | { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_SPRINT) }, /* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */ |
729 | { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_TELUS) }, /* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */ | 735 | { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_TELUS) }, /* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */ |
730 | { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_VZW) }, /* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */ | 736 | { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_VZW) }, /* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */ |
737 | { USB_DEVICE_AND_INTERFACE_INFO(DELL_VENDOR_ID, DELL_PRODUCT_5800_MINICARD_VZW, 0xff, 0xff, 0xff) }, | ||
738 | { USB_DEVICE_AND_INTERFACE_INFO(DELL_VENDOR_ID, DELL_PRODUCT_5800_V2_MINICARD_VZW, 0xff, 0xff, 0xff) }, | ||
731 | { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) }, /* ADU-E100, ADU-310 */ | 739 | { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) }, /* ADU-E100, ADU-310 */ |
732 | { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) }, | 740 | { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) }, |
733 | { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_620UW) }, | 741 | { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_620UW) }, |
@@ -1157,6 +1165,7 @@ static const struct usb_device_id option_ids[] = { | |||
1157 | { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_X060S_X200), | 1165 | { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_X060S_X200), |
1158 | .driver_info = (kernel_ulong_t)&alcatel_x200_blacklist | 1166 | .driver_info = (kernel_ulong_t)&alcatel_x200_blacklist |
1159 | }, | 1167 | }, |
1168 | { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_X220_X500D) }, | ||
1160 | { USB_DEVICE(AIRPLUS_VENDOR_ID, AIRPLUS_PRODUCT_MCD650) }, | 1169 | { USB_DEVICE(AIRPLUS_VENDOR_ID, AIRPLUS_PRODUCT_MCD650) }, |
1161 | { USB_DEVICE(TLAYTECH_VENDOR_ID, TLAYTECH_PRODUCT_TEU800) }, | 1170 | { USB_DEVICE(TLAYTECH_VENDOR_ID, TLAYTECH_PRODUCT_TEU800) }, |
1162 | { USB_DEVICE(LONGCHEER_VENDOR_ID, FOUR_G_SYSTEMS_PRODUCT_W14), | 1171 | { USB_DEVICE(LONGCHEER_VENDOR_ID, FOUR_G_SYSTEMS_PRODUCT_W14), |
diff --git a/drivers/usb/serial/usb_wwan.c b/drivers/usb/serial/usb_wwan.c index 61a73ad1a187..a3e9c095f0d8 100644 --- a/drivers/usb/serial/usb_wwan.c +++ b/drivers/usb/serial/usb_wwan.c | |||
@@ -455,9 +455,6 @@ static struct urb *usb_wwan_setup_urb(struct usb_serial_port *port, | |||
455 | struct usb_serial *serial = port->serial; | 455 | struct usb_serial *serial = port->serial; |
456 | struct urb *urb; | 456 | struct urb *urb; |
457 | 457 | ||
458 | if (endpoint == -1) | ||
459 | return NULL; /* endpoint not needed */ | ||
460 | |||
461 | urb = usb_alloc_urb(0, GFP_KERNEL); /* No ISO */ | 458 | urb = usb_alloc_urb(0, GFP_KERNEL); /* No ISO */ |
462 | if (urb == NULL) { | 459 | if (urb == NULL) { |
463 | dev_dbg(&serial->interface->dev, | 460 | dev_dbg(&serial->interface->dev, |
@@ -489,6 +486,9 @@ int usb_wwan_port_probe(struct usb_serial_port *port) | |||
489 | init_usb_anchor(&portdata->delayed); | 486 | init_usb_anchor(&portdata->delayed); |
490 | 487 | ||
491 | for (i = 0; i < N_IN_URB; i++) { | 488 | for (i = 0; i < N_IN_URB; i++) { |
489 | if (!port->bulk_in_size) | ||
490 | break; | ||
491 | |||
492 | buffer = (u8 *)__get_free_page(GFP_KERNEL); | 492 | buffer = (u8 *)__get_free_page(GFP_KERNEL); |
493 | if (!buffer) | 493 | if (!buffer) |
494 | goto bail_out_error; | 494 | goto bail_out_error; |
@@ -502,8 +502,8 @@ int usb_wwan_port_probe(struct usb_serial_port *port) | |||
502 | } | 502 | } |
503 | 503 | ||
504 | for (i = 0; i < N_OUT_URB; i++) { | 504 | for (i = 0; i < N_OUT_URB; i++) { |
505 | if (port->bulk_out_endpointAddress == -1) | 505 | if (!port->bulk_out_size) |
506 | continue; | 506 | break; |
507 | 507 | ||
508 | buffer = kmalloc(OUT_BUFLEN, GFP_KERNEL); | 508 | buffer = kmalloc(OUT_BUFLEN, GFP_KERNEL); |
509 | if (!buffer) | 509 | if (!buffer) |
diff --git a/fs/proc/base.c b/fs/proc/base.c index 144a96732dd7..3c231adf8450 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
@@ -873,6 +873,113 @@ static const struct file_operations proc_environ_operations = { | |||
873 | .release = mem_release, | 873 | .release = mem_release, |
874 | }; | 874 | }; |
875 | 875 | ||
876 | static ssize_t oom_adj_read(struct file *file, char __user *buf, size_t count, | ||
877 | loff_t *ppos) | ||
878 | { | ||
879 | struct task_struct *task = get_proc_task(file->f_path.dentry->d_inode); | ||
880 | char buffer[PROC_NUMBUF]; | ||
881 | int oom_adj = OOM_ADJUST_MIN; | ||
882 | size_t len; | ||
883 | unsigned long flags; | ||
884 | |||
885 | if (!task) | ||
886 | return -ESRCH; | ||
887 | if (lock_task_sighand(task, &flags)) { | ||
888 | if (task->signal->oom_score_adj == OOM_SCORE_ADJ_MAX) | ||
889 | oom_adj = OOM_ADJUST_MAX; | ||
890 | else | ||
891 | oom_adj = (task->signal->oom_score_adj * -OOM_DISABLE) / | ||
892 | OOM_SCORE_ADJ_MAX; | ||
893 | unlock_task_sighand(task, &flags); | ||
894 | } | ||
895 | put_task_struct(task); | ||
896 | len = snprintf(buffer, sizeof(buffer), "%d\n", oom_adj); | ||
897 | return simple_read_from_buffer(buf, count, ppos, buffer, len); | ||
898 | } | ||
899 | |||
900 | static ssize_t oom_adj_write(struct file *file, const char __user *buf, | ||
901 | size_t count, loff_t *ppos) | ||
902 | { | ||
903 | struct task_struct *task; | ||
904 | char buffer[PROC_NUMBUF]; | ||
905 | int oom_adj; | ||
906 | unsigned long flags; | ||
907 | int err; | ||
908 | |||
909 | memset(buffer, 0, sizeof(buffer)); | ||
910 | if (count > sizeof(buffer) - 1) | ||
911 | count = sizeof(buffer) - 1; | ||
912 | if (copy_from_user(buffer, buf, count)) { | ||
913 | err = -EFAULT; | ||
914 | goto out; | ||
915 | } | ||
916 | |||
917 | err = kstrtoint(strstrip(buffer), 0, &oom_adj); | ||
918 | if (err) | ||
919 | goto out; | ||
920 | if ((oom_adj < OOM_ADJUST_MIN || oom_adj > OOM_ADJUST_MAX) && | ||
921 | oom_adj != OOM_DISABLE) { | ||
922 | err = -EINVAL; | ||
923 | goto out; | ||
924 | } | ||
925 | |||
926 | task = get_proc_task(file->f_path.dentry->d_inode); | ||
927 | if (!task) { | ||
928 | err = -ESRCH; | ||
929 | goto out; | ||
930 | } | ||
931 | |||
932 | task_lock(task); | ||
933 | if (!task->mm) { | ||
934 | err = -EINVAL; | ||
935 | goto err_task_lock; | ||
936 | } | ||
937 | |||
938 | if (!lock_task_sighand(task, &flags)) { | ||
939 | err = -ESRCH; | ||
940 | goto err_task_lock; | ||
941 | } | ||
942 | |||
943 | /* | ||
944 | * Scale /proc/pid/oom_score_adj appropriately ensuring that a maximum | ||
945 | * value is always attainable. | ||
946 | */ | ||
947 | if (oom_adj == OOM_ADJUST_MAX) | ||
948 | oom_adj = OOM_SCORE_ADJ_MAX; | ||
949 | else | ||
950 | oom_adj = (oom_adj * OOM_SCORE_ADJ_MAX) / -OOM_DISABLE; | ||
951 | |||
952 | if (oom_adj < task->signal->oom_score_adj && | ||
953 | !capable(CAP_SYS_RESOURCE)) { | ||
954 | err = -EACCES; | ||
955 | goto err_sighand; | ||
956 | } | ||
957 | |||
958 | /* | ||
959 | * /proc/pid/oom_adj is provided for legacy purposes, ask users to use | ||
960 | * /proc/pid/oom_score_adj instead. | ||
961 | */ | ||
962 | printk_once(KERN_WARNING "%s (%d): /proc/%d/oom_adj is deprecated, please use /proc/%d/oom_score_adj instead.\n", | ||
963 | current->comm, task_pid_nr(current), task_pid_nr(task), | ||
964 | task_pid_nr(task)); | ||
965 | |||
966 | task->signal->oom_score_adj = oom_adj; | ||
967 | trace_oom_score_adj_update(task); | ||
968 | err_sighand: | ||
969 | unlock_task_sighand(task, &flags); | ||
970 | err_task_lock: | ||
971 | task_unlock(task); | ||
972 | put_task_struct(task); | ||
973 | out: | ||
974 | return err < 0 ? err : count; | ||
975 | } | ||
976 | |||
977 | static const struct file_operations proc_oom_adj_operations = { | ||
978 | .read = oom_adj_read, | ||
979 | .write = oom_adj_write, | ||
980 | .llseek = generic_file_llseek, | ||
981 | }; | ||
982 | |||
876 | static ssize_t oom_score_adj_read(struct file *file, char __user *buf, | 983 | static ssize_t oom_score_adj_read(struct file *file, char __user *buf, |
877 | size_t count, loff_t *ppos) | 984 | size_t count, loff_t *ppos) |
878 | { | 985 | { |
@@ -2598,6 +2705,7 @@ static const struct pid_entry tgid_base_stuff[] = { | |||
2598 | REG("cgroup", S_IRUGO, proc_cgroup_operations), | 2705 | REG("cgroup", S_IRUGO, proc_cgroup_operations), |
2599 | #endif | 2706 | #endif |
2600 | INF("oom_score", S_IRUGO, proc_oom_score), | 2707 | INF("oom_score", S_IRUGO, proc_oom_score), |
2708 | REG("oom_adj", S_IRUGO|S_IWUSR, proc_oom_adj_operations), | ||
2601 | REG("oom_score_adj", S_IRUGO|S_IWUSR, proc_oom_score_adj_operations), | 2709 | REG("oom_score_adj", S_IRUGO|S_IWUSR, proc_oom_score_adj_operations), |
2602 | #ifdef CONFIG_AUDITSYSCALL | 2710 | #ifdef CONFIG_AUDITSYSCALL |
2603 | REG("loginuid", S_IWUSR|S_IRUGO, proc_loginuid_operations), | 2711 | REG("loginuid", S_IWUSR|S_IRUGO, proc_loginuid_operations), |
@@ -2964,6 +3072,7 @@ static const struct pid_entry tid_base_stuff[] = { | |||
2964 | REG("cgroup", S_IRUGO, proc_cgroup_operations), | 3072 | REG("cgroup", S_IRUGO, proc_cgroup_operations), |
2965 | #endif | 3073 | #endif |
2966 | INF("oom_score", S_IRUGO, proc_oom_score), | 3074 | INF("oom_score", S_IRUGO, proc_oom_score), |
3075 | REG("oom_adj", S_IRUGO|S_IWUSR, proc_oom_adj_operations), | ||
2967 | REG("oom_score_adj", S_IRUGO|S_IWUSR, proc_oom_score_adj_operations), | 3076 | REG("oom_score_adj", S_IRUGO|S_IWUSR, proc_oom_score_adj_operations), |
2968 | #ifdef CONFIG_AUDITSYSCALL | 3077 | #ifdef CONFIG_AUDITSYSCALL |
2969 | REG("loginuid", S_IWUSR|S_IRUGO, proc_loginuid_operations), | 3078 | REG("loginuid", S_IWUSR|S_IRUGO, proc_loginuid_operations), |
diff --git a/fs/pstore/platform.c b/fs/pstore/platform.c index a40da07e93d6..947fbe06c3b1 100644 --- a/fs/pstore/platform.c +++ b/fs/pstore/platform.c | |||
@@ -161,6 +161,7 @@ static void pstore_console_write(struct console *con, const char *s, unsigned c) | |||
161 | 161 | ||
162 | while (s < e) { | 162 | while (s < e) { |
163 | unsigned long flags; | 163 | unsigned long flags; |
164 | u64 id; | ||
164 | 165 | ||
165 | if (c > psinfo->bufsize) | 166 | if (c > psinfo->bufsize) |
166 | c = psinfo->bufsize; | 167 | c = psinfo->bufsize; |
@@ -172,7 +173,7 @@ static void pstore_console_write(struct console *con, const char *s, unsigned c) | |||
172 | spin_lock_irqsave(&psinfo->buf_lock, flags); | 173 | spin_lock_irqsave(&psinfo->buf_lock, flags); |
173 | } | 174 | } |
174 | memcpy(psinfo->buf, s, c); | 175 | memcpy(psinfo->buf, s, c); |
175 | psinfo->write(PSTORE_TYPE_CONSOLE, 0, NULL, 0, c, psinfo); | 176 | psinfo->write(PSTORE_TYPE_CONSOLE, 0, &id, 0, c, psinfo); |
176 | spin_unlock_irqrestore(&psinfo->buf_lock, flags); | 177 | spin_unlock_irqrestore(&psinfo->buf_lock, flags); |
177 | s += c; | 178 | s += c; |
178 | c = e - s; | 179 | c = e - s; |
diff --git a/fs/ubifs/find.c b/fs/ubifs/find.c index 28ec13af28d9..2dcf3d473fec 100644 --- a/fs/ubifs/find.c +++ b/fs/ubifs/find.c | |||
@@ -681,8 +681,16 @@ int ubifs_find_free_leb_for_idx(struct ubifs_info *c) | |||
681 | if (!lprops) { | 681 | if (!lprops) { |
682 | lprops = ubifs_fast_find_freeable(c); | 682 | lprops = ubifs_fast_find_freeable(c); |
683 | if (!lprops) { | 683 | if (!lprops) { |
684 | ubifs_assert(c->freeable_cnt == 0); | 684 | /* |
685 | if (c->lst.empty_lebs - c->lst.taken_empty_lebs > 0) { | 685 | * The first condition means the following: go scan the |
686 | * LPT if there are uncategorized lprops, which means | ||
687 | * there may be freeable LEBs there (UBIFS does not | ||
688 | * store the information about freeable LEBs in the | ||
689 | * master node). | ||
690 | */ | ||
691 | if (c->in_a_category_cnt != c->main_lebs || | ||
692 | c->lst.empty_lebs - c->lst.taken_empty_lebs > 0) { | ||
693 | ubifs_assert(c->freeable_cnt == 0); | ||
686 | lprops = scan_for_leb_for_idx(c); | 694 | lprops = scan_for_leb_for_idx(c); |
687 | if (IS_ERR(lprops)) { | 695 | if (IS_ERR(lprops)) { |
688 | err = PTR_ERR(lprops); | 696 | err = PTR_ERR(lprops); |
diff --git a/fs/ubifs/lprops.c b/fs/ubifs/lprops.c index e5a2a35a46dc..46190a7c42a6 100644 --- a/fs/ubifs/lprops.c +++ b/fs/ubifs/lprops.c | |||
@@ -300,8 +300,11 @@ void ubifs_add_to_cat(struct ubifs_info *c, struct ubifs_lprops *lprops, | |||
300 | default: | 300 | default: |
301 | ubifs_assert(0); | 301 | ubifs_assert(0); |
302 | } | 302 | } |
303 | |||
303 | lprops->flags &= ~LPROPS_CAT_MASK; | 304 | lprops->flags &= ~LPROPS_CAT_MASK; |
304 | lprops->flags |= cat; | 305 | lprops->flags |= cat; |
306 | c->in_a_category_cnt += 1; | ||
307 | ubifs_assert(c->in_a_category_cnt <= c->main_lebs); | ||
305 | } | 308 | } |
306 | 309 | ||
307 | /** | 310 | /** |
@@ -334,6 +337,9 @@ static void ubifs_remove_from_cat(struct ubifs_info *c, | |||
334 | default: | 337 | default: |
335 | ubifs_assert(0); | 338 | ubifs_assert(0); |
336 | } | 339 | } |
340 | |||
341 | c->in_a_category_cnt -= 1; | ||
342 | ubifs_assert(c->in_a_category_cnt >= 0); | ||
337 | } | 343 | } |
338 | 344 | ||
339 | /** | 345 | /** |
diff --git a/fs/ubifs/ubifs.h b/fs/ubifs/ubifs.h index 5486346d0a3f..d133c276fe05 100644 --- a/fs/ubifs/ubifs.h +++ b/fs/ubifs/ubifs.h | |||
@@ -1183,6 +1183,8 @@ struct ubifs_debug_info; | |||
1183 | * @freeable_list: list of freeable non-index LEBs (free + dirty == @leb_size) | 1183 | * @freeable_list: list of freeable non-index LEBs (free + dirty == @leb_size) |
1184 | * @frdi_idx_list: list of freeable index LEBs (free + dirty == @leb_size) | 1184 | * @frdi_idx_list: list of freeable index LEBs (free + dirty == @leb_size) |
1185 | * @freeable_cnt: number of freeable LEBs in @freeable_list | 1185 | * @freeable_cnt: number of freeable LEBs in @freeable_list |
1186 | * @in_a_category_cnt: count of lprops which are in a certain category, which | ||
1187 | * basically meants that they were loaded from the flash | ||
1186 | * | 1188 | * |
1187 | * @ltab_lnum: LEB number of LPT's own lprops table | 1189 | * @ltab_lnum: LEB number of LPT's own lprops table |
1188 | * @ltab_offs: offset of LPT's own lprops table | 1190 | * @ltab_offs: offset of LPT's own lprops table |
@@ -1412,6 +1414,7 @@ struct ubifs_info { | |||
1412 | struct list_head freeable_list; | 1414 | struct list_head freeable_list; |
1413 | struct list_head frdi_idx_list; | 1415 | struct list_head frdi_idx_list; |
1414 | int freeable_cnt; | 1416 | int freeable_cnt; |
1417 | int in_a_category_cnt; | ||
1415 | 1418 | ||
1416 | int ltab_lnum; | 1419 | int ltab_lnum; |
1417 | int ltab_offs; | 1420 | int ltab_offs; |
diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h index c12731582920..f9f5e9eeb9dd 100644 --- a/include/linux/clk-provider.h +++ b/include/linux/clk-provider.h | |||
@@ -335,8 +335,8 @@ const char *__clk_get_name(struct clk *clk); | |||
335 | struct clk_hw *__clk_get_hw(struct clk *clk); | 335 | struct clk_hw *__clk_get_hw(struct clk *clk); |
336 | u8 __clk_get_num_parents(struct clk *clk); | 336 | u8 __clk_get_num_parents(struct clk *clk); |
337 | struct clk *__clk_get_parent(struct clk *clk); | 337 | struct clk *__clk_get_parent(struct clk *clk); |
338 | inline int __clk_get_enable_count(struct clk *clk); | 338 | int __clk_get_enable_count(struct clk *clk); |
339 | inline int __clk_get_prepare_count(struct clk *clk); | 339 | int __clk_get_prepare_count(struct clk *clk); |
340 | unsigned long __clk_get_rate(struct clk *clk); | 340 | unsigned long __clk_get_rate(struct clk *clk); |
341 | unsigned long __clk_get_flags(struct clk *clk); | 341 | unsigned long __clk_get_flags(struct clk *clk); |
342 | int __clk_is_enabled(struct clk *clk); | 342 | int __clk_is_enabled(struct clk *clk); |
diff --git a/include/linux/mm.h b/include/linux/mm.h index fa0680402738..bcaab4e6fe91 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
@@ -1684,9 +1684,5 @@ static inline unsigned int debug_guardpage_minorder(void) { return 0; } | |||
1684 | static inline bool page_is_guard(struct page *page) { return false; } | 1684 | static inline bool page_is_guard(struct page *page) { return false; } |
1685 | #endif /* CONFIG_DEBUG_PAGEALLOC */ | 1685 | #endif /* CONFIG_DEBUG_PAGEALLOC */ |
1686 | 1686 | ||
1687 | extern void reset_zone_present_pages(void); | ||
1688 | extern void fixup_zone_present_pages(int nid, unsigned long start_pfn, | ||
1689 | unsigned long end_pfn); | ||
1690 | |||
1691 | #endif /* __KERNEL__ */ | 1687 | #endif /* __KERNEL__ */ |
1692 | #endif /* _LINUX_MM_H */ | 1688 | #endif /* _LINUX_MM_H */ |
diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index 50aaca81f63d..a23923ba8263 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h | |||
@@ -752,7 +752,7 @@ extern int init_currently_empty_zone(struct zone *zone, unsigned long start_pfn, | |||
752 | unsigned long size, | 752 | unsigned long size, |
753 | enum memmap_context context); | 753 | enum memmap_context context); |
754 | 754 | ||
755 | extern void lruvec_init(struct lruvec *lruvec, struct zone *zone); | 755 | extern void lruvec_init(struct lruvec *lruvec); |
756 | 756 | ||
757 | static inline struct zone *lruvec_zone(struct lruvec *lruvec) | 757 | static inline struct zone *lruvec_zone(struct lruvec *lruvec) |
758 | { | 758 | { |
diff --git a/include/linux/platform_data/omap_ocp2scp.h b/include/linux/platform_data/omap_ocp2scp.h new file mode 100644 index 000000000000..5c6c3939355f --- /dev/null +++ b/include/linux/platform_data/omap_ocp2scp.h | |||
@@ -0,0 +1,31 @@ | |||
1 | /* | ||
2 | * omap_ocp2scp.h -- ocp2scp header file | ||
3 | * | ||
4 | * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License as published by | ||
7 | * the Free Software Foundation; either version 2 of the License, or | ||
8 | * (at your option) any later version. | ||
9 | * | ||
10 | * Author: Kishon Vijay Abraham I <kishon@ti.com> | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | */ | ||
18 | |||
19 | #ifndef __DRIVERS_OMAP_OCP2SCP_H | ||
20 | #define __DRIVERS_OMAP_OCP2SCP_H | ||
21 | |||
22 | struct omap_ocp2scp_dev { | ||
23 | const char *drv_name; | ||
24 | struct resource *res; | ||
25 | }; | ||
26 | |||
27 | struct omap_ocp2scp_platform_data { | ||
28 | int dev_cnt; | ||
29 | struct omap_ocp2scp_dev **devices; | ||
30 | }; | ||
31 | #endif /* __DRIVERS_OMAP_OCP2SCP_H */ | ||
diff --git a/include/linux/rio.h b/include/linux/rio.h index 4187da511006..a3e784278667 100644 --- a/include/linux/rio.h +++ b/include/linux/rio.h | |||
@@ -275,9 +275,11 @@ struct rio_id_table { | |||
275 | * struct rio_net - RIO network info | 275 | * struct rio_net - RIO network info |
276 | * @node: Node in global list of RIO networks | 276 | * @node: Node in global list of RIO networks |
277 | * @devices: List of devices in this network | 277 | * @devices: List of devices in this network |
278 | * @switches: List of switches in this netowrk | ||
278 | * @mports: List of master ports accessing this network | 279 | * @mports: List of master ports accessing this network |
279 | * @hport: Default port for accessing this network | 280 | * @hport: Default port for accessing this network |
280 | * @id: RIO network ID | 281 | * @id: RIO network ID |
282 | * @destid_table: destID allocation table | ||
281 | */ | 283 | */ |
282 | struct rio_net { | 284 | struct rio_net { |
283 | struct list_head node; /* node in list of networks */ | 285 | struct list_head node; /* node in list of networks */ |
diff --git a/include/uapi/linux/oom.h b/include/uapi/linux/oom.h index a49c4afc7060..b29272d621ce 100644 --- a/include/uapi/linux/oom.h +++ b/include/uapi/linux/oom.h | |||
@@ -8,4 +8,13 @@ | |||
8 | #define OOM_SCORE_ADJ_MIN (-1000) | 8 | #define OOM_SCORE_ADJ_MIN (-1000) |
9 | #define OOM_SCORE_ADJ_MAX 1000 | 9 | #define OOM_SCORE_ADJ_MAX 1000 |
10 | 10 | ||
11 | /* | ||
12 | * /proc/<pid>/oom_adj set to -17 protects from the oom killer for legacy | ||
13 | * purposes. | ||
14 | */ | ||
15 | #define OOM_DISABLE (-17) | ||
16 | /* inclusive */ | ||
17 | #define OOM_ADJUST_MIN (-16) | ||
18 | #define OOM_ADJUST_MAX 15 | ||
19 | |||
11 | #endif /* _UAPI__INCLUDE_LINUX_OOM_H */ | 20 | #endif /* _UAPI__INCLUDE_LINUX_OOM_H */ |
diff --git a/kernel/futex.c b/kernel/futex.c index 3717e7b306e0..20ef219bbe9b 100644 --- a/kernel/futex.c +++ b/kernel/futex.c | |||
@@ -716,7 +716,7 @@ static int futex_lock_pi_atomic(u32 __user *uaddr, struct futex_hash_bucket *hb, | |||
716 | struct futex_pi_state **ps, | 716 | struct futex_pi_state **ps, |
717 | struct task_struct *task, int set_waiters) | 717 | struct task_struct *task, int set_waiters) |
718 | { | 718 | { |
719 | int lock_taken, ret, ownerdied = 0; | 719 | int lock_taken, ret, force_take = 0; |
720 | u32 uval, newval, curval, vpid = task_pid_vnr(task); | 720 | u32 uval, newval, curval, vpid = task_pid_vnr(task); |
721 | 721 | ||
722 | retry: | 722 | retry: |
@@ -755,17 +755,15 @@ retry: | |||
755 | newval = curval | FUTEX_WAITERS; | 755 | newval = curval | FUTEX_WAITERS; |
756 | 756 | ||
757 | /* | 757 | /* |
758 | * There are two cases, where a futex might have no owner (the | 758 | * Should we force take the futex? See below. |
759 | * owner TID is 0): OWNER_DIED. We take over the futex in this | ||
760 | * case. We also do an unconditional take over, when the owner | ||
761 | * of the futex died. | ||
762 | * | ||
763 | * This is safe as we are protected by the hash bucket lock ! | ||
764 | */ | 759 | */ |
765 | if (unlikely(ownerdied || !(curval & FUTEX_TID_MASK))) { | 760 | if (unlikely(force_take)) { |
766 | /* Keep the OWNER_DIED bit */ | 761 | /* |
762 | * Keep the OWNER_DIED and the WAITERS bit and set the | ||
763 | * new TID value. | ||
764 | */ | ||
767 | newval = (curval & ~FUTEX_TID_MASK) | vpid; | 765 | newval = (curval & ~FUTEX_TID_MASK) | vpid; |
768 | ownerdied = 0; | 766 | force_take = 0; |
769 | lock_taken = 1; | 767 | lock_taken = 1; |
770 | } | 768 | } |
771 | 769 | ||
@@ -775,7 +773,7 @@ retry: | |||
775 | goto retry; | 773 | goto retry; |
776 | 774 | ||
777 | /* | 775 | /* |
778 | * We took the lock due to owner died take over. | 776 | * We took the lock due to forced take over. |
779 | */ | 777 | */ |
780 | if (unlikely(lock_taken)) | 778 | if (unlikely(lock_taken)) |
781 | return 1; | 779 | return 1; |
@@ -790,20 +788,25 @@ retry: | |||
790 | switch (ret) { | 788 | switch (ret) { |
791 | case -ESRCH: | 789 | case -ESRCH: |
792 | /* | 790 | /* |
793 | * No owner found for this futex. Check if the | 791 | * We failed to find an owner for this |
794 | * OWNER_DIED bit is set to figure out whether | 792 | * futex. So we have no pi_state to block |
795 | * this is a robust futex or not. | 793 | * on. This can happen in two cases: |
794 | * | ||
795 | * 1) The owner died | ||
796 | * 2) A stale FUTEX_WAITERS bit | ||
797 | * | ||
798 | * Re-read the futex value. | ||
796 | */ | 799 | */ |
797 | if (get_futex_value_locked(&curval, uaddr)) | 800 | if (get_futex_value_locked(&curval, uaddr)) |
798 | return -EFAULT; | 801 | return -EFAULT; |
799 | 802 | ||
800 | /* | 803 | /* |
801 | * We simply start over in case of a robust | 804 | * If the owner died or we have a stale |
802 | * futex. The code above will take the futex | 805 | * WAITERS bit the owner TID in the user space |
803 | * and return happy. | 806 | * futex is 0. |
804 | */ | 807 | */ |
805 | if (curval & FUTEX_OWNER_DIED) { | 808 | if (!(curval & FUTEX_TID_MASK)) { |
806 | ownerdied = 1; | 809 | force_take = 1; |
807 | goto retry; | 810 | goto retry; |
808 | } | 811 | } |
809 | default: | 812 | default: |
diff --git a/mm/bootmem.c b/mm/bootmem.c index 434be4ae7a04..f468185b3b28 100644 --- a/mm/bootmem.c +++ b/mm/bootmem.c | |||
@@ -198,8 +198,6 @@ static unsigned long __init free_all_bootmem_core(bootmem_data_t *bdata) | |||
198 | int order = ilog2(BITS_PER_LONG); | 198 | int order = ilog2(BITS_PER_LONG); |
199 | 199 | ||
200 | __free_pages_bootmem(pfn_to_page(start), order); | 200 | __free_pages_bootmem(pfn_to_page(start), order); |
201 | fixup_zone_present_pages(page_to_nid(pfn_to_page(start)), | ||
202 | start, start + BITS_PER_LONG); | ||
203 | count += BITS_PER_LONG; | 201 | count += BITS_PER_LONG; |
204 | start += BITS_PER_LONG; | 202 | start += BITS_PER_LONG; |
205 | } else { | 203 | } else { |
@@ -210,9 +208,6 @@ static unsigned long __init free_all_bootmem_core(bootmem_data_t *bdata) | |||
210 | if (vec & 1) { | 208 | if (vec & 1) { |
211 | page = pfn_to_page(start + off); | 209 | page = pfn_to_page(start + off); |
212 | __free_pages_bootmem(page, 0); | 210 | __free_pages_bootmem(page, 0); |
213 | fixup_zone_present_pages( | ||
214 | page_to_nid(page), | ||
215 | start + off, start + off + 1); | ||
216 | count++; | 211 | count++; |
217 | } | 212 | } |
218 | vec >>= 1; | 213 | vec >>= 1; |
@@ -226,11 +221,8 @@ static unsigned long __init free_all_bootmem_core(bootmem_data_t *bdata) | |||
226 | pages = bdata->node_low_pfn - bdata->node_min_pfn; | 221 | pages = bdata->node_low_pfn - bdata->node_min_pfn; |
227 | pages = bootmem_bootmap_pages(pages); | 222 | pages = bootmem_bootmap_pages(pages); |
228 | count += pages; | 223 | count += pages; |
229 | while (pages--) { | 224 | while (pages--) |
230 | fixup_zone_present_pages(page_to_nid(page), | ||
231 | page_to_pfn(page), page_to_pfn(page) + 1); | ||
232 | __free_pages_bootmem(page++, 0); | 225 | __free_pages_bootmem(page++, 0); |
233 | } | ||
234 | 226 | ||
235 | bdebug("nid=%td released=%lx\n", bdata - bootmem_node_data, count); | 227 | bdebug("nid=%td released=%lx\n", bdata - bootmem_node_data, count); |
236 | 228 | ||
diff --git a/mm/highmem.c b/mm/highmem.c index d517cd16a6eb..2da13a5c50e2 100644 --- a/mm/highmem.c +++ b/mm/highmem.c | |||
@@ -98,7 +98,7 @@ struct page *kmap_to_page(void *vaddr) | |||
98 | { | 98 | { |
99 | unsigned long addr = (unsigned long)vaddr; | 99 | unsigned long addr = (unsigned long)vaddr; |
100 | 100 | ||
101 | if (addr >= PKMAP_ADDR(0) && addr <= PKMAP_ADDR(LAST_PKMAP)) { | 101 | if (addr >= PKMAP_ADDR(0) && addr < PKMAP_ADDR(LAST_PKMAP)) { |
102 | int i = (addr - PKMAP_ADDR(0)) >> PAGE_SHIFT; | 102 | int i = (addr - PKMAP_ADDR(0)) >> PAGE_SHIFT; |
103 | return pte_page(pkmap_page_table[i]); | 103 | return pte_page(pkmap_page_table[i]); |
104 | } | 104 | } |
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 7acf43bf04a2..dd39ba000b31 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -1055,12 +1055,24 @@ struct lruvec *mem_cgroup_zone_lruvec(struct zone *zone, | |||
1055 | struct mem_cgroup *memcg) | 1055 | struct mem_cgroup *memcg) |
1056 | { | 1056 | { |
1057 | struct mem_cgroup_per_zone *mz; | 1057 | struct mem_cgroup_per_zone *mz; |
1058 | struct lruvec *lruvec; | ||
1058 | 1059 | ||
1059 | if (mem_cgroup_disabled()) | 1060 | if (mem_cgroup_disabled()) { |
1060 | return &zone->lruvec; | 1061 | lruvec = &zone->lruvec; |
1062 | goto out; | ||
1063 | } | ||
1061 | 1064 | ||
1062 | mz = mem_cgroup_zoneinfo(memcg, zone_to_nid(zone), zone_idx(zone)); | 1065 | mz = mem_cgroup_zoneinfo(memcg, zone_to_nid(zone), zone_idx(zone)); |
1063 | return &mz->lruvec; | 1066 | lruvec = &mz->lruvec; |
1067 | out: | ||
1068 | /* | ||
1069 | * Since a node can be onlined after the mem_cgroup was created, | ||
1070 | * we have to be prepared to initialize lruvec->zone here; | ||
1071 | * and if offlined then reonlined, we need to reinitialize it. | ||
1072 | */ | ||
1073 | if (unlikely(lruvec->zone != zone)) | ||
1074 | lruvec->zone = zone; | ||
1075 | return lruvec; | ||
1064 | } | 1076 | } |
1065 | 1077 | ||
1066 | /* | 1078 | /* |
@@ -1087,9 +1099,12 @@ struct lruvec *mem_cgroup_page_lruvec(struct page *page, struct zone *zone) | |||
1087 | struct mem_cgroup_per_zone *mz; | 1099 | struct mem_cgroup_per_zone *mz; |
1088 | struct mem_cgroup *memcg; | 1100 | struct mem_cgroup *memcg; |
1089 | struct page_cgroup *pc; | 1101 | struct page_cgroup *pc; |
1102 | struct lruvec *lruvec; | ||
1090 | 1103 | ||
1091 | if (mem_cgroup_disabled()) | 1104 | if (mem_cgroup_disabled()) { |
1092 | return &zone->lruvec; | 1105 | lruvec = &zone->lruvec; |
1106 | goto out; | ||
1107 | } | ||
1093 | 1108 | ||
1094 | pc = lookup_page_cgroup(page); | 1109 | pc = lookup_page_cgroup(page); |
1095 | memcg = pc->mem_cgroup; | 1110 | memcg = pc->mem_cgroup; |
@@ -1107,7 +1122,16 @@ struct lruvec *mem_cgroup_page_lruvec(struct page *page, struct zone *zone) | |||
1107 | pc->mem_cgroup = memcg = root_mem_cgroup; | 1122 | pc->mem_cgroup = memcg = root_mem_cgroup; |
1108 | 1123 | ||
1109 | mz = page_cgroup_zoneinfo(memcg, page); | 1124 | mz = page_cgroup_zoneinfo(memcg, page); |
1110 | return &mz->lruvec; | 1125 | lruvec = &mz->lruvec; |
1126 | out: | ||
1127 | /* | ||
1128 | * Since a node can be onlined after the mem_cgroup was created, | ||
1129 | * we have to be prepared to initialize lruvec->zone here; | ||
1130 | * and if offlined then reonlined, we need to reinitialize it. | ||
1131 | */ | ||
1132 | if (unlikely(lruvec->zone != zone)) | ||
1133 | lruvec->zone = zone; | ||
1134 | return lruvec; | ||
1111 | } | 1135 | } |
1112 | 1136 | ||
1113 | /** | 1137 | /** |
@@ -1452,17 +1476,26 @@ static int mem_cgroup_count_children(struct mem_cgroup *memcg) | |||
1452 | static u64 mem_cgroup_get_limit(struct mem_cgroup *memcg) | 1476 | static u64 mem_cgroup_get_limit(struct mem_cgroup *memcg) |
1453 | { | 1477 | { |
1454 | u64 limit; | 1478 | u64 limit; |
1455 | u64 memsw; | ||
1456 | 1479 | ||
1457 | limit = res_counter_read_u64(&memcg->res, RES_LIMIT); | 1480 | limit = res_counter_read_u64(&memcg->res, RES_LIMIT); |
1458 | limit += total_swap_pages << PAGE_SHIFT; | ||
1459 | 1481 | ||
1460 | memsw = res_counter_read_u64(&memcg->memsw, RES_LIMIT); | ||
1461 | /* | 1482 | /* |
1462 | * If memsw is finite and limits the amount of swap space available | 1483 | * Do not consider swap space if we cannot swap due to swappiness |
1463 | * to this memcg, return that limit. | ||
1464 | */ | 1484 | */ |
1465 | return min(limit, memsw); | 1485 | if (mem_cgroup_swappiness(memcg)) { |
1486 | u64 memsw; | ||
1487 | |||
1488 | limit += total_swap_pages << PAGE_SHIFT; | ||
1489 | memsw = res_counter_read_u64(&memcg->memsw, RES_LIMIT); | ||
1490 | |||
1491 | /* | ||
1492 | * If memsw is finite and limits the amount of swap space | ||
1493 | * available to this memcg, return that limit. | ||
1494 | */ | ||
1495 | limit = min(limit, memsw); | ||
1496 | } | ||
1497 | |||
1498 | return limit; | ||
1466 | } | 1499 | } |
1467 | 1500 | ||
1468 | void mem_cgroup_out_of_memory(struct mem_cgroup *memcg, gfp_t gfp_mask, | 1501 | void mem_cgroup_out_of_memory(struct mem_cgroup *memcg, gfp_t gfp_mask, |
@@ -3688,17 +3721,17 @@ unsigned long mem_cgroup_soft_limit_reclaim(struct zone *zone, int order, | |||
3688 | static bool mem_cgroup_force_empty_list(struct mem_cgroup *memcg, | 3721 | static bool mem_cgroup_force_empty_list(struct mem_cgroup *memcg, |
3689 | int node, int zid, enum lru_list lru) | 3722 | int node, int zid, enum lru_list lru) |
3690 | { | 3723 | { |
3691 | struct mem_cgroup_per_zone *mz; | 3724 | struct lruvec *lruvec; |
3692 | unsigned long flags, loop; | 3725 | unsigned long flags, loop; |
3693 | struct list_head *list; | 3726 | struct list_head *list; |
3694 | struct page *busy; | 3727 | struct page *busy; |
3695 | struct zone *zone; | 3728 | struct zone *zone; |
3696 | 3729 | ||
3697 | zone = &NODE_DATA(node)->node_zones[zid]; | 3730 | zone = &NODE_DATA(node)->node_zones[zid]; |
3698 | mz = mem_cgroup_zoneinfo(memcg, node, zid); | 3731 | lruvec = mem_cgroup_zone_lruvec(zone, memcg); |
3699 | list = &mz->lruvec.lists[lru]; | 3732 | list = &lruvec->lists[lru]; |
3700 | 3733 | ||
3701 | loop = mz->lru_size[lru]; | 3734 | loop = mem_cgroup_get_lru_size(lruvec, lru); |
3702 | /* give some margin against EBUSY etc...*/ | 3735 | /* give some margin against EBUSY etc...*/ |
3703 | loop += 256; | 3736 | loop += 256; |
3704 | busy = NULL; | 3737 | busy = NULL; |
@@ -4736,7 +4769,7 @@ static int alloc_mem_cgroup_per_zone_info(struct mem_cgroup *memcg, int node) | |||
4736 | 4769 | ||
4737 | for (zone = 0; zone < MAX_NR_ZONES; zone++) { | 4770 | for (zone = 0; zone < MAX_NR_ZONES; zone++) { |
4738 | mz = &pn->zoneinfo[zone]; | 4771 | mz = &pn->zoneinfo[zone]; |
4739 | lruvec_init(&mz->lruvec, &NODE_DATA(node)->node_zones[zone]); | 4772 | lruvec_init(&mz->lruvec); |
4740 | mz->usage_in_excess = 0; | 4773 | mz->usage_in_excess = 0; |
4741 | mz->on_tree = false; | 4774 | mz->on_tree = false; |
4742 | mz->memcg = memcg; | 4775 | mz->memcg = memcg; |
diff --git a/mm/memory.c b/mm/memory.c index fb135ba4aba9..221fc9ffcab1 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
@@ -2527,9 +2527,8 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct *vma, | |||
2527 | int ret = 0; | 2527 | int ret = 0; |
2528 | int page_mkwrite = 0; | 2528 | int page_mkwrite = 0; |
2529 | struct page *dirty_page = NULL; | 2529 | struct page *dirty_page = NULL; |
2530 | unsigned long mmun_start; /* For mmu_notifiers */ | 2530 | unsigned long mmun_start = 0; /* For mmu_notifiers */ |
2531 | unsigned long mmun_end; /* For mmu_notifiers */ | 2531 | unsigned long mmun_end = 0; /* For mmu_notifiers */ |
2532 | bool mmun_called = false; /* For mmu_notifiers */ | ||
2533 | 2532 | ||
2534 | old_page = vm_normal_page(vma, address, orig_pte); | 2533 | old_page = vm_normal_page(vma, address, orig_pte); |
2535 | if (!old_page) { | 2534 | if (!old_page) { |
@@ -2708,8 +2707,7 @@ gotten: | |||
2708 | goto oom_free_new; | 2707 | goto oom_free_new; |
2709 | 2708 | ||
2710 | mmun_start = address & PAGE_MASK; | 2709 | mmun_start = address & PAGE_MASK; |
2711 | mmun_end = (address & PAGE_MASK) + PAGE_SIZE; | 2710 | mmun_end = mmun_start + PAGE_SIZE; |
2712 | mmun_called = true; | ||
2713 | mmu_notifier_invalidate_range_start(mm, mmun_start, mmun_end); | 2711 | mmu_notifier_invalidate_range_start(mm, mmun_start, mmun_end); |
2714 | 2712 | ||
2715 | /* | 2713 | /* |
@@ -2778,7 +2776,7 @@ gotten: | |||
2778 | page_cache_release(new_page); | 2776 | page_cache_release(new_page); |
2779 | unlock: | 2777 | unlock: |
2780 | pte_unmap_unlock(page_table, ptl); | 2778 | pte_unmap_unlock(page_table, ptl); |
2781 | if (mmun_called) | 2779 | if (mmun_end > mmun_start) |
2782 | mmu_notifier_invalidate_range_end(mm, mmun_start, mmun_end); | 2780 | mmu_notifier_invalidate_range_end(mm, mmun_start, mmun_end); |
2783 | if (old_page) { | 2781 | if (old_page) { |
2784 | /* | 2782 | /* |
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index 56b758ae57d2..e4eeacae2b91 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c | |||
@@ -106,7 +106,6 @@ static void get_page_bootmem(unsigned long info, struct page *page, | |||
106 | void __ref put_page_bootmem(struct page *page) | 106 | void __ref put_page_bootmem(struct page *page) |
107 | { | 107 | { |
108 | unsigned long type; | 108 | unsigned long type; |
109 | struct zone *zone; | ||
110 | 109 | ||
111 | type = (unsigned long) page->lru.next; | 110 | type = (unsigned long) page->lru.next; |
112 | BUG_ON(type < MEMORY_HOTPLUG_MIN_BOOTMEM_TYPE || | 111 | BUG_ON(type < MEMORY_HOTPLUG_MIN_BOOTMEM_TYPE || |
@@ -117,12 +116,6 @@ void __ref put_page_bootmem(struct page *page) | |||
117 | set_page_private(page, 0); | 116 | set_page_private(page, 0); |
118 | INIT_LIST_HEAD(&page->lru); | 117 | INIT_LIST_HEAD(&page->lru); |
119 | __free_pages_bootmem(page, 0); | 118 | __free_pages_bootmem(page, 0); |
120 | |||
121 | zone = page_zone(page); | ||
122 | zone_span_writelock(zone); | ||
123 | zone->present_pages++; | ||
124 | zone_span_writeunlock(zone); | ||
125 | totalram_pages++; | ||
126 | } | 119 | } |
127 | 120 | ||
128 | } | 121 | } |
@@ -334,8 +334,10 @@ void validate_mm(struct mm_struct *mm) | |||
334 | struct vm_area_struct *vma = mm->mmap; | 334 | struct vm_area_struct *vma = mm->mmap; |
335 | while (vma) { | 335 | while (vma) { |
336 | struct anon_vma_chain *avc; | 336 | struct anon_vma_chain *avc; |
337 | vma_lock_anon_vma(vma); | ||
337 | list_for_each_entry(avc, &vma->anon_vma_chain, same_vma) | 338 | list_for_each_entry(avc, &vma->anon_vma_chain, same_vma) |
338 | anon_vma_interval_tree_verify(avc); | 339 | anon_vma_interval_tree_verify(avc); |
340 | vma_unlock_anon_vma(vma); | ||
339 | vma = vma->vm_next; | 341 | vma = vma->vm_next; |
340 | i++; | 342 | i++; |
341 | } | 343 | } |
diff --git a/mm/mmzone.c b/mm/mmzone.c index 3cef80f6ac79..4596d81b89b1 100644 --- a/mm/mmzone.c +++ b/mm/mmzone.c | |||
@@ -87,7 +87,7 @@ int memmap_valid_within(unsigned long pfn, | |||
87 | } | 87 | } |
88 | #endif /* CONFIG_ARCH_HAS_HOLES_MEMORYMODEL */ | 88 | #endif /* CONFIG_ARCH_HAS_HOLES_MEMORYMODEL */ |
89 | 89 | ||
90 | void lruvec_init(struct lruvec *lruvec, struct zone *zone) | 90 | void lruvec_init(struct lruvec *lruvec) |
91 | { | 91 | { |
92 | enum lru_list lru; | 92 | enum lru_list lru; |
93 | 93 | ||
@@ -95,8 +95,4 @@ void lruvec_init(struct lruvec *lruvec, struct zone *zone) | |||
95 | 95 | ||
96 | for_each_lru(lru) | 96 | for_each_lru(lru) |
97 | INIT_LIST_HEAD(&lruvec->lists[lru]); | 97 | INIT_LIST_HEAD(&lruvec->lists[lru]); |
98 | |||
99 | #ifdef CONFIG_MEMCG | ||
100 | lruvec->zone = zone; | ||
101 | #endif | ||
102 | } | 98 | } |
diff --git a/mm/nobootmem.c b/mm/nobootmem.c index 714d5d650470..bd82f6b31411 100644 --- a/mm/nobootmem.c +++ b/mm/nobootmem.c | |||
@@ -116,8 +116,6 @@ static unsigned long __init __free_memory_core(phys_addr_t start, | |||
116 | return 0; | 116 | return 0; |
117 | 117 | ||
118 | __free_pages_memory(start_pfn, end_pfn); | 118 | __free_pages_memory(start_pfn, end_pfn); |
119 | fixup_zone_present_pages(pfn_to_nid(start >> PAGE_SHIFT), | ||
120 | start_pfn, end_pfn); | ||
121 | 119 | ||
122 | return end_pfn - start_pfn; | 120 | return end_pfn - start_pfn; |
123 | } | 121 | } |
@@ -128,7 +126,6 @@ unsigned long __init free_low_memory_core_early(int nodeid) | |||
128 | phys_addr_t start, end, size; | 126 | phys_addr_t start, end, size; |
129 | u64 i; | 127 | u64 i; |
130 | 128 | ||
131 | reset_zone_present_pages(); | ||
132 | for_each_free_mem_range(i, MAX_NUMNODES, &start, &end, NULL) | 129 | for_each_free_mem_range(i, MAX_NUMNODES, &start, &end, NULL) |
133 | count += __free_memory_core(start, end); | 130 | count += __free_memory_core(start, end); |
134 | 131 | ||
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 5b74de6702e0..7bb35ac0964a 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -4505,7 +4505,7 @@ static void __paginginit free_area_init_core(struct pglist_data *pgdat, | |||
4505 | zone->zone_pgdat = pgdat; | 4505 | zone->zone_pgdat = pgdat; |
4506 | 4506 | ||
4507 | zone_pcp_init(zone); | 4507 | zone_pcp_init(zone); |
4508 | lruvec_init(&zone->lruvec, zone); | 4508 | lruvec_init(&zone->lruvec); |
4509 | if (!size) | 4509 | if (!size) |
4510 | continue; | 4510 | continue; |
4511 | 4511 | ||
@@ -6098,37 +6098,3 @@ void dump_page(struct page *page) | |||
6098 | dump_page_flags(page->flags); | 6098 | dump_page_flags(page->flags); |
6099 | mem_cgroup_print_bad_page(page); | 6099 | mem_cgroup_print_bad_page(page); |
6100 | } | 6100 | } |
6101 | |||
6102 | /* reset zone->present_pages */ | ||
6103 | void reset_zone_present_pages(void) | ||
6104 | { | ||
6105 | struct zone *z; | ||
6106 | int i, nid; | ||
6107 | |||
6108 | for_each_node_state(nid, N_HIGH_MEMORY) { | ||
6109 | for (i = 0; i < MAX_NR_ZONES; i++) { | ||
6110 | z = NODE_DATA(nid)->node_zones + i; | ||
6111 | z->present_pages = 0; | ||
6112 | } | ||
6113 | } | ||
6114 | } | ||
6115 | |||
6116 | /* calculate zone's present pages in buddy system */ | ||
6117 | void fixup_zone_present_pages(int nid, unsigned long start_pfn, | ||
6118 | unsigned long end_pfn) | ||
6119 | { | ||
6120 | struct zone *z; | ||
6121 | unsigned long zone_start_pfn, zone_end_pfn; | ||
6122 | int i; | ||
6123 | |||
6124 | for (i = 0; i < MAX_NR_ZONES; i++) { | ||
6125 | z = NODE_DATA(nid)->node_zones + i; | ||
6126 | zone_start_pfn = z->zone_start_pfn; | ||
6127 | zone_end_pfn = zone_start_pfn + z->spanned_pages; | ||
6128 | |||
6129 | /* if the two regions intersect */ | ||
6130 | if (!(zone_start_pfn >= end_pfn || zone_end_pfn <= start_pfn)) | ||
6131 | z->present_pages += min(end_pfn, zone_end_pfn) - | ||
6132 | max(start_pfn, zone_start_pfn); | ||
6133 | } | ||
6134 | } | ||
diff --git a/mm/shmem.c b/mm/shmem.c index 67afba5117f2..89341b658bd0 100644 --- a/mm/shmem.c +++ b/mm/shmem.c | |||
@@ -643,7 +643,7 @@ static void shmem_evict_inode(struct inode *inode) | |||
643 | kfree(info->symlink); | 643 | kfree(info->symlink); |
644 | 644 | ||
645 | simple_xattrs_free(&info->xattrs); | 645 | simple_xattrs_free(&info->xattrs); |
646 | BUG_ON(inode->i_blocks); | 646 | WARN_ON(inode->i_blocks); |
647 | shmem_free_inode(inode->i_sb); | 647 | shmem_free_inode(inode->i_sb); |
648 | clear_inode(inode); | 648 | clear_inode(inode); |
649 | } | 649 | } |
@@ -1145,8 +1145,20 @@ repeat: | |||
1145 | if (!error) { | 1145 | if (!error) { |
1146 | error = shmem_add_to_page_cache(page, mapping, index, | 1146 | error = shmem_add_to_page_cache(page, mapping, index, |
1147 | gfp, swp_to_radix_entry(swap)); | 1147 | gfp, swp_to_radix_entry(swap)); |
1148 | /* We already confirmed swap, and make no allocation */ | 1148 | /* |
1149 | VM_BUG_ON(error); | 1149 | * We already confirmed swap under page lock, and make |
1150 | * no memory allocation here, so usually no possibility | ||
1151 | * of error; but free_swap_and_cache() only trylocks a | ||
1152 | * page, so it is just possible that the entry has been | ||
1153 | * truncated or holepunched since swap was confirmed. | ||
1154 | * shmem_undo_range() will have done some of the | ||
1155 | * unaccounting, now delete_from_swap_cache() will do | ||
1156 | * the rest (including mem_cgroup_uncharge_swapcache). | ||
1157 | * Reset swap.val? No, leave it so "failed" goes back to | ||
1158 | * "repeat": reading a hole and writing should succeed. | ||
1159 | */ | ||
1160 | if (error) | ||
1161 | delete_from_swap_cache(page); | ||
1150 | } | 1162 | } |
1151 | if (error) | 1163 | if (error) |
1152 | goto failed; | 1164 | goto failed; |
diff --git a/mm/swapfile.c b/mm/swapfile.c index 71cd288b2001..f91a25547ffe 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c | |||
@@ -1494,9 +1494,8 @@ SYSCALL_DEFINE1(swapoff, const char __user *, specialfile) | |||
1494 | BUG_ON(!current->mm); | 1494 | BUG_ON(!current->mm); |
1495 | 1495 | ||
1496 | pathname = getname(specialfile); | 1496 | pathname = getname(specialfile); |
1497 | err = PTR_ERR(pathname); | ||
1498 | if (IS_ERR(pathname)) | 1497 | if (IS_ERR(pathname)) |
1499 | goto out; | 1498 | return PTR_ERR(pathname); |
1500 | 1499 | ||
1501 | victim = file_open_name(pathname, O_RDWR|O_LARGEFILE, 0); | 1500 | victim = file_open_name(pathname, O_RDWR|O_LARGEFILE, 0); |
1502 | err = PTR_ERR(victim); | 1501 | err = PTR_ERR(victim); |
@@ -1608,6 +1607,7 @@ SYSCALL_DEFINE1(swapoff, const char __user *, specialfile) | |||
1608 | out_dput: | 1607 | out_dput: |
1609 | filp_close(victim, NULL); | 1608 | filp_close(victim, NULL); |
1610 | out: | 1609 | out: |
1610 | putname(pathname); | ||
1611 | return err; | 1611 | return err; |
1612 | } | 1612 | } |
1613 | 1613 | ||
diff --git a/mm/vmscan.c b/mm/vmscan.c index 8b055e9379bc..48550c66f1f2 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
@@ -1760,28 +1760,6 @@ static bool in_reclaim_compaction(struct scan_control *sc) | |||
1760 | return false; | 1760 | return false; |
1761 | } | 1761 | } |
1762 | 1762 | ||
1763 | #ifdef CONFIG_COMPACTION | ||
1764 | /* | ||
1765 | * If compaction is deferred for sc->order then scale the number of pages | ||
1766 | * reclaimed based on the number of consecutive allocation failures | ||
1767 | */ | ||
1768 | static unsigned long scale_for_compaction(unsigned long pages_for_compaction, | ||
1769 | struct lruvec *lruvec, struct scan_control *sc) | ||
1770 | { | ||
1771 | struct zone *zone = lruvec_zone(lruvec); | ||
1772 | |||
1773 | if (zone->compact_order_failed <= sc->order) | ||
1774 | pages_for_compaction <<= zone->compact_defer_shift; | ||
1775 | return pages_for_compaction; | ||
1776 | } | ||
1777 | #else | ||
1778 | static unsigned long scale_for_compaction(unsigned long pages_for_compaction, | ||
1779 | struct lruvec *lruvec, struct scan_control *sc) | ||
1780 | { | ||
1781 | return pages_for_compaction; | ||
1782 | } | ||
1783 | #endif | ||
1784 | |||
1785 | /* | 1763 | /* |
1786 | * Reclaim/compaction is used for high-order allocation requests. It reclaims | 1764 | * Reclaim/compaction is used for high-order allocation requests. It reclaims |
1787 | * order-0 pages before compacting the zone. should_continue_reclaim() returns | 1765 | * order-0 pages before compacting the zone. should_continue_reclaim() returns |
@@ -1829,9 +1807,6 @@ static inline bool should_continue_reclaim(struct lruvec *lruvec, | |||
1829 | * inactive lists are large enough, continue reclaiming | 1807 | * inactive lists are large enough, continue reclaiming |
1830 | */ | 1808 | */ |
1831 | pages_for_compaction = (2UL << sc->order); | 1809 | pages_for_compaction = (2UL << sc->order); |
1832 | |||
1833 | pages_for_compaction = scale_for_compaction(pages_for_compaction, | ||
1834 | lruvec, sc); | ||
1835 | inactive_lru_pages = get_lru_size(lruvec, LRU_INACTIVE_FILE); | 1810 | inactive_lru_pages = get_lru_size(lruvec, LRU_INACTIVE_FILE); |
1836 | if (nr_swap_pages > 0) | 1811 | if (nr_swap_pages > 0) |
1837 | inactive_lru_pages += get_lru_size(lruvec, LRU_INACTIVE_ANON); | 1812 | inactive_lru_pages += get_lru_size(lruvec, LRU_INACTIVE_ANON); |
diff --git a/net/batman-adv/soft-interface.c b/net/batman-adv/soft-interface.c index b9a28d2dd3e8..ce0684a1fc83 100644 --- a/net/batman-adv/soft-interface.c +++ b/net/batman-adv/soft-interface.c | |||
@@ -325,6 +325,12 @@ void batadv_interface_rx(struct net_device *soft_iface, | |||
325 | 325 | ||
326 | soft_iface->last_rx = jiffies; | 326 | soft_iface->last_rx = jiffies; |
327 | 327 | ||
328 | /* Let the bridge loop avoidance check the packet. If will | ||
329 | * not handle it, we can safely push it up. | ||
330 | */ | ||
331 | if (batadv_bla_rx(bat_priv, skb, vid, is_bcast)) | ||
332 | goto out; | ||
333 | |||
328 | if (orig_node) | 334 | if (orig_node) |
329 | batadv_tt_add_temporary_global_entry(bat_priv, orig_node, | 335 | batadv_tt_add_temporary_global_entry(bat_priv, orig_node, |
330 | ethhdr->h_source); | 336 | ethhdr->h_source); |
@@ -332,12 +338,6 @@ void batadv_interface_rx(struct net_device *soft_iface, | |||
332 | if (batadv_is_ap_isolated(bat_priv, ethhdr->h_source, ethhdr->h_dest)) | 338 | if (batadv_is_ap_isolated(bat_priv, ethhdr->h_source, ethhdr->h_dest)) |
333 | goto dropped; | 339 | goto dropped; |
334 | 340 | ||
335 | /* Let the bridge loop avoidance check the packet. If will | ||
336 | * not handle it, we can safely push it up. | ||
337 | */ | ||
338 | if (batadv_bla_rx(bat_priv, skb, vid, is_bcast)) | ||
339 | goto out; | ||
340 | |||
341 | netif_rx(skb); | 341 | netif_rx(skb); |
342 | goto out; | 342 | goto out; |
343 | 343 | ||
diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c index 112edd371b2f..baae71585804 100644 --- a/net/batman-adv/translation-table.c +++ b/net/batman-adv/translation-table.c | |||
@@ -769,6 +769,12 @@ int batadv_tt_global_add(struct batadv_priv *bat_priv, | |||
769 | */ | 769 | */ |
770 | tt_global_entry->common.flags &= ~BATADV_TT_CLIENT_TEMP; | 770 | tt_global_entry->common.flags &= ~BATADV_TT_CLIENT_TEMP; |
771 | 771 | ||
772 | /* the change can carry possible "attribute" flags like the | ||
773 | * TT_CLIENT_WIFI, therefore they have to be copied in the | ||
774 | * client entry | ||
775 | */ | ||
776 | tt_global_entry->common.flags |= flags; | ||
777 | |||
772 | /* If there is the BATADV_TT_CLIENT_ROAM flag set, there is only | 778 | /* If there is the BATADV_TT_CLIENT_ROAM flag set, there is only |
773 | * one originator left in the list and we previously received a | 779 | * one originator left in the list and we previously received a |
774 | * delete + roaming change for this originator. | 780 | * delete + roaming change for this originator. |
@@ -1496,7 +1502,7 @@ batadv_tt_response_fill_table(uint16_t tt_len, uint8_t ttvn, | |||
1496 | 1502 | ||
1497 | memcpy(tt_change->addr, tt_common_entry->addr, | 1503 | memcpy(tt_change->addr, tt_common_entry->addr, |
1498 | ETH_ALEN); | 1504 | ETH_ALEN); |
1499 | tt_change->flags = BATADV_NO_FLAGS; | 1505 | tt_change->flags = tt_common_entry->flags; |
1500 | 1506 | ||
1501 | tt_count++; | 1507 | tt_count++; |
1502 | tt_change++; | 1508 | tt_change++; |
@@ -2450,6 +2456,13 @@ bool batadv_tt_add_temporary_global_entry(struct batadv_priv *bat_priv, | |||
2450 | { | 2456 | { |
2451 | bool ret = false; | 2457 | bool ret = false; |
2452 | 2458 | ||
2459 | /* if the originator is a backbone node (meaning it belongs to the same | ||
2460 | * LAN of this node) the temporary client must not be added because to | ||
2461 | * reach such destination the node must use the LAN instead of the mesh | ||
2462 | */ | ||
2463 | if (batadv_bla_is_backbone_gw_orig(bat_priv, orig_node->orig)) | ||
2464 | goto out; | ||
2465 | |||
2453 | if (!batadv_tt_global_add(bat_priv, orig_node, addr, | 2466 | if (!batadv_tt_global_add(bat_priv, orig_node, addr, |
2454 | BATADV_TT_CLIENT_TEMP, | 2467 | BATADV_TT_CLIENT_TEMP, |
2455 | atomic_read(&orig_node->last_ttvn))) | 2468 | atomic_read(&orig_node->last_ttvn))) |
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index 8a0ce706aebd..a0a2f97b9c62 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c | |||
@@ -1754,11 +1754,11 @@ int hci_register_dev(struct hci_dev *hdev) | |||
1754 | if (hdev->dev_type != HCI_AMP) | 1754 | if (hdev->dev_type != HCI_AMP) |
1755 | set_bit(HCI_AUTO_OFF, &hdev->dev_flags); | 1755 | set_bit(HCI_AUTO_OFF, &hdev->dev_flags); |
1756 | 1756 | ||
1757 | schedule_work(&hdev->power_on); | ||
1758 | |||
1759 | hci_notify(hdev, HCI_DEV_REG); | 1757 | hci_notify(hdev, HCI_DEV_REG); |
1760 | hci_dev_hold(hdev); | 1758 | hci_dev_hold(hdev); |
1761 | 1759 | ||
1760 | schedule_work(&hdev->power_on); | ||
1761 | |||
1762 | return id; | 1762 | return id; |
1763 | 1763 | ||
1764 | err_wqueue: | 1764 | err_wqueue: |
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c index aa2ea0a8142c..91de4239da66 100644 --- a/net/bluetooth/mgmt.c +++ b/net/bluetooth/mgmt.c | |||
@@ -326,7 +326,7 @@ static int read_index_list(struct sock *sk, struct hci_dev *hdev, void *data, | |||
326 | struct hci_dev *d; | 326 | struct hci_dev *d; |
327 | size_t rp_len; | 327 | size_t rp_len; |
328 | u16 count; | 328 | u16 count; |
329 | int i, err; | 329 | int err; |
330 | 330 | ||
331 | BT_DBG("sock %p", sk); | 331 | BT_DBG("sock %p", sk); |
332 | 332 | ||
@@ -347,9 +347,7 @@ static int read_index_list(struct sock *sk, struct hci_dev *hdev, void *data, | |||
347 | return -ENOMEM; | 347 | return -ENOMEM; |
348 | } | 348 | } |
349 | 349 | ||
350 | rp->num_controllers = cpu_to_le16(count); | 350 | count = 0; |
351 | |||
352 | i = 0; | ||
353 | list_for_each_entry(d, &hci_dev_list, list) { | 351 | list_for_each_entry(d, &hci_dev_list, list) { |
354 | if (test_bit(HCI_SETUP, &d->dev_flags)) | 352 | if (test_bit(HCI_SETUP, &d->dev_flags)) |
355 | continue; | 353 | continue; |
@@ -357,10 +355,13 @@ static int read_index_list(struct sock *sk, struct hci_dev *hdev, void *data, | |||
357 | if (!mgmt_valid_hdev(d)) | 355 | if (!mgmt_valid_hdev(d)) |
358 | continue; | 356 | continue; |
359 | 357 | ||
360 | rp->index[i++] = cpu_to_le16(d->id); | 358 | rp->index[count++] = cpu_to_le16(d->id); |
361 | BT_DBG("Added hci%u", d->id); | 359 | BT_DBG("Added hci%u", d->id); |
362 | } | 360 | } |
363 | 361 | ||
362 | rp->num_controllers = cpu_to_le16(count); | ||
363 | rp_len = sizeof(*rp) + (2 * count); | ||
364 | |||
364 | read_unlock(&hci_dev_list_lock); | 365 | read_unlock(&hci_dev_list_lock); |
365 | 366 | ||
366 | err = cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_INDEX_LIST, 0, rp, | 367 | err = cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_INDEX_LIST, 0, rp, |
@@ -1366,6 +1367,7 @@ static int remove_uuid(struct sock *sk, struct hci_dev *hdev, void *data, | |||
1366 | continue; | 1367 | continue; |
1367 | 1368 | ||
1368 | list_del(&match->list); | 1369 | list_del(&match->list); |
1370 | kfree(match); | ||
1369 | found++; | 1371 | found++; |
1370 | } | 1372 | } |
1371 | 1373 | ||
diff --git a/net/bluetooth/smp.c b/net/bluetooth/smp.c index 2ac8d50861e0..a5923378bdf0 100644 --- a/net/bluetooth/smp.c +++ b/net/bluetooth/smp.c | |||
@@ -267,7 +267,7 @@ static void smp_failure(struct l2cap_conn *conn, u8 reason, u8 send) | |||
267 | 267 | ||
268 | clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->hcon->flags); | 268 | clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->hcon->flags); |
269 | mgmt_auth_failed(conn->hcon->hdev, conn->dst, hcon->type, | 269 | mgmt_auth_failed(conn->hcon->hdev, conn->dst, hcon->type, |
270 | hcon->dst_type, reason); | 270 | hcon->dst_type, HCI_ERROR_AUTH_FAILURE); |
271 | 271 | ||
272 | cancel_delayed_work_sync(&conn->security_timer); | 272 | cancel_delayed_work_sync(&conn->security_timer); |
273 | 273 | ||
diff --git a/net/core/dev.c b/net/core/dev.c index bda6d004f9f0..c0946cb2b354 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -2818,8 +2818,10 @@ static int get_rps_cpu(struct net_device *dev, struct sk_buff *skb, | |||
2818 | if (unlikely(tcpu != next_cpu) && | 2818 | if (unlikely(tcpu != next_cpu) && |
2819 | (tcpu == RPS_NO_CPU || !cpu_online(tcpu) || | 2819 | (tcpu == RPS_NO_CPU || !cpu_online(tcpu) || |
2820 | ((int)(per_cpu(softnet_data, tcpu).input_queue_head - | 2820 | ((int)(per_cpu(softnet_data, tcpu).input_queue_head - |
2821 | rflow->last_qtail)) >= 0)) | 2821 | rflow->last_qtail)) >= 0)) { |
2822 | tcpu = next_cpu; | ||
2822 | rflow = set_rps_cpu(dev, skb, rflow, next_cpu); | 2823 | rflow = set_rps_cpu(dev, skb, rflow, next_cpu); |
2824 | } | ||
2823 | 2825 | ||
2824 | if (tcpu != RPS_NO_CPU && cpu_online(tcpu)) { | 2826 | if (tcpu != RPS_NO_CPU && cpu_online(tcpu)) { |
2825 | *rflowp = rflow; | 2827 | *rflowp = rflow; |
diff --git a/net/core/dev_addr_lists.c b/net/core/dev_addr_lists.c index 87cc17db2d56..b079c7bbc157 100644 --- a/net/core/dev_addr_lists.c +++ b/net/core/dev_addr_lists.c | |||
@@ -319,7 +319,8 @@ int dev_addr_del(struct net_device *dev, const unsigned char *addr, | |||
319 | */ | 319 | */ |
320 | ha = list_first_entry(&dev->dev_addrs.list, | 320 | ha = list_first_entry(&dev->dev_addrs.list, |
321 | struct netdev_hw_addr, list); | 321 | struct netdev_hw_addr, list); |
322 | if (ha->addr == dev->dev_addr && ha->refcount == 1) | 322 | if (!memcmp(ha->addr, addr, dev->addr_len) && |
323 | ha->type == addr_type && ha->refcount == 1) | ||
323 | return -ENOENT; | 324 | return -ENOENT; |
324 | 325 | ||
325 | err = __hw_addr_del(&dev->dev_addrs, addr, dev->addr_len, | 326 | err = __hw_addr_del(&dev->dev_addrs, addr, dev->addr_len, |
diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c index 5eea4a811042..14bbfcf717ac 100644 --- a/net/ipv4/ip_sockglue.c +++ b/net/ipv4/ip_sockglue.c | |||
@@ -457,19 +457,28 @@ static int do_ip_setsockopt(struct sock *sk, int level, | |||
457 | struct inet_sock *inet = inet_sk(sk); | 457 | struct inet_sock *inet = inet_sk(sk); |
458 | int val = 0, err; | 458 | int val = 0, err; |
459 | 459 | ||
460 | if (((1<<optname) & ((1<<IP_PKTINFO) | (1<<IP_RECVTTL) | | 460 | switch (optname) { |
461 | (1<<IP_RECVOPTS) | (1<<IP_RECVTOS) | | 461 | case IP_PKTINFO: |
462 | (1<<IP_RETOPTS) | (1<<IP_TOS) | | 462 | case IP_RECVTTL: |
463 | (1<<IP_TTL) | (1<<IP_HDRINCL) | | 463 | case IP_RECVOPTS: |
464 | (1<<IP_MTU_DISCOVER) | (1<<IP_RECVERR) | | 464 | case IP_RECVTOS: |
465 | (1<<IP_ROUTER_ALERT) | (1<<IP_FREEBIND) | | 465 | case IP_RETOPTS: |
466 | (1<<IP_PASSSEC) | (1<<IP_TRANSPARENT) | | 466 | case IP_TOS: |
467 | (1<<IP_MINTTL) | (1<<IP_NODEFRAG))) || | 467 | case IP_TTL: |
468 | optname == IP_UNICAST_IF || | 468 | case IP_HDRINCL: |
469 | optname == IP_MULTICAST_TTL || | 469 | case IP_MTU_DISCOVER: |
470 | optname == IP_MULTICAST_ALL || | 470 | case IP_RECVERR: |
471 | optname == IP_MULTICAST_LOOP || | 471 | case IP_ROUTER_ALERT: |
472 | optname == IP_RECVORIGDSTADDR) { | 472 | case IP_FREEBIND: |
473 | case IP_PASSSEC: | ||
474 | case IP_TRANSPARENT: | ||
475 | case IP_MINTTL: | ||
476 | case IP_NODEFRAG: | ||
477 | case IP_UNICAST_IF: | ||
478 | case IP_MULTICAST_TTL: | ||
479 | case IP_MULTICAST_ALL: | ||
480 | case IP_MULTICAST_LOOP: | ||
481 | case IP_RECVORIGDSTADDR: | ||
473 | if (optlen >= sizeof(int)) { | 482 | if (optlen >= sizeof(int)) { |
474 | if (get_user(val, (int __user *) optval)) | 483 | if (get_user(val, (int __user *) optval)) |
475 | return -EFAULT; | 484 | return -EFAULT; |
diff --git a/net/ipv4/ip_vti.c b/net/ipv4/ip_vti.c index 1831092f999f..858fddf6482a 100644 --- a/net/ipv4/ip_vti.c +++ b/net/ipv4/ip_vti.c | |||
@@ -338,12 +338,17 @@ static int vti_rcv(struct sk_buff *skb) | |||
338 | if (tunnel != NULL) { | 338 | if (tunnel != NULL) { |
339 | struct pcpu_tstats *tstats; | 339 | struct pcpu_tstats *tstats; |
340 | 340 | ||
341 | if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) | ||
342 | return -1; | ||
343 | |||
341 | tstats = this_cpu_ptr(tunnel->dev->tstats); | 344 | tstats = this_cpu_ptr(tunnel->dev->tstats); |
342 | u64_stats_update_begin(&tstats->syncp); | 345 | u64_stats_update_begin(&tstats->syncp); |
343 | tstats->rx_packets++; | 346 | tstats->rx_packets++; |
344 | tstats->rx_bytes += skb->len; | 347 | tstats->rx_bytes += skb->len; |
345 | u64_stats_update_end(&tstats->syncp); | 348 | u64_stats_update_end(&tstats->syncp); |
346 | 349 | ||
350 | skb->mark = 0; | ||
351 | secpath_reset(skb); | ||
347 | skb->dev = tunnel->dev; | 352 | skb->dev = tunnel->dev; |
348 | return 1; | 353 | return 1; |
349 | } | 354 | } |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 197c0008503c..083092e3aed6 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
@@ -1212,7 +1212,7 @@ new_segment: | |||
1212 | wait_for_sndbuf: | 1212 | wait_for_sndbuf: |
1213 | set_bit(SOCK_NOSPACE, &sk->sk_socket->flags); | 1213 | set_bit(SOCK_NOSPACE, &sk->sk_socket->flags); |
1214 | wait_for_memory: | 1214 | wait_for_memory: |
1215 | if (copied && likely(!tp->repair)) | 1215 | if (copied) |
1216 | tcp_push(sk, flags & ~MSG_MORE, mss_now, TCP_NAGLE_PUSH); | 1216 | tcp_push(sk, flags & ~MSG_MORE, mss_now, TCP_NAGLE_PUSH); |
1217 | 1217 | ||
1218 | if ((err = sk_stream_wait_memory(sk, &timeo)) != 0) | 1218 | if ((err = sk_stream_wait_memory(sk, &timeo)) != 0) |
@@ -1223,7 +1223,7 @@ wait_for_memory: | |||
1223 | } | 1223 | } |
1224 | 1224 | ||
1225 | out: | 1225 | out: |
1226 | if (copied && likely(!tp->repair)) | 1226 | if (copied) |
1227 | tcp_push(sk, flags, mss_now, tp->nonagle); | 1227 | tcp_push(sk, flags, mss_now, tp->nonagle); |
1228 | release_sock(sk); | 1228 | release_sock(sk); |
1229 | return copied + copied_syn; | 1229 | return copied + copied_syn; |
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 2c2b13a999ea..609ff98aeb47 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -5313,11 +5313,6 @@ static bool tcp_validate_incoming(struct sock *sk, struct sk_buff *skb, | |||
5313 | goto discard; | 5313 | goto discard; |
5314 | } | 5314 | } |
5315 | 5315 | ||
5316 | /* ts_recent update must be made after we are sure that the packet | ||
5317 | * is in window. | ||
5318 | */ | ||
5319 | tcp_replace_ts_recent(tp, TCP_SKB_CB(skb)->seq); | ||
5320 | |||
5321 | /* step 3: check security and precedence [ignored] */ | 5316 | /* step 3: check security and precedence [ignored] */ |
5322 | 5317 | ||
5323 | /* step 4: Check for a SYN | 5318 | /* step 4: Check for a SYN |
@@ -5552,6 +5547,11 @@ step5: | |||
5552 | if (th->ack && tcp_ack(sk, skb, FLAG_SLOWPATH) < 0) | 5547 | if (th->ack && tcp_ack(sk, skb, FLAG_SLOWPATH) < 0) |
5553 | goto discard; | 5548 | goto discard; |
5554 | 5549 | ||
5550 | /* ts_recent update must be made after we are sure that the packet | ||
5551 | * is in window. | ||
5552 | */ | ||
5553 | tcp_replace_ts_recent(tp, TCP_SKB_CB(skb)->seq); | ||
5554 | |||
5555 | tcp_rcv_rtt_measure_ts(sk, skb); | 5555 | tcp_rcv_rtt_measure_ts(sk, skb); |
5556 | 5556 | ||
5557 | /* Process urgent data. */ | 5557 | /* Process urgent data. */ |
@@ -6130,6 +6130,11 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb, | |||
6130 | } else | 6130 | } else |
6131 | goto discard; | 6131 | goto discard; |
6132 | 6132 | ||
6133 | /* ts_recent update must be made after we are sure that the packet | ||
6134 | * is in window. | ||
6135 | */ | ||
6136 | tcp_replace_ts_recent(tp, TCP_SKB_CB(skb)->seq); | ||
6137 | |||
6133 | /* step 6: check the URG bit */ | 6138 | /* step 6: check the URG bit */ |
6134 | tcp_urg(sk, skb, th); | 6139 | tcp_urg(sk, skb, th); |
6135 | 6140 | ||
diff --git a/net/ipv4/tcp_metrics.c b/net/ipv4/tcp_metrics.c index 53bc5847bfa8..f696d7c2e9fa 100644 --- a/net/ipv4/tcp_metrics.c +++ b/net/ipv4/tcp_metrics.c | |||
@@ -1,7 +1,6 @@ | |||
1 | #include <linux/rcupdate.h> | 1 | #include <linux/rcupdate.h> |
2 | #include <linux/spinlock.h> | 2 | #include <linux/spinlock.h> |
3 | #include <linux/jiffies.h> | 3 | #include <linux/jiffies.h> |
4 | #include <linux/bootmem.h> | ||
5 | #include <linux/module.h> | 4 | #include <linux/module.h> |
6 | #include <linux/cache.h> | 5 | #include <linux/cache.h> |
7 | #include <linux/slab.h> | 6 | #include <linux/slab.h> |
@@ -9,6 +8,7 @@ | |||
9 | #include <linux/tcp.h> | 8 | #include <linux/tcp.h> |
10 | #include <linux/hash.h> | 9 | #include <linux/hash.h> |
11 | #include <linux/tcp_metrics.h> | 10 | #include <linux/tcp_metrics.h> |
11 | #include <linux/vmalloc.h> | ||
12 | 12 | ||
13 | #include <net/inet_connection_sock.h> | 13 | #include <net/inet_connection_sock.h> |
14 | #include <net/net_namespace.h> | 14 | #include <net/net_namespace.h> |
@@ -1034,7 +1034,10 @@ static int __net_init tcp_net_metrics_init(struct net *net) | |||
1034 | net->ipv4.tcp_metrics_hash_log = order_base_2(slots); | 1034 | net->ipv4.tcp_metrics_hash_log = order_base_2(slots); |
1035 | size = sizeof(struct tcpm_hash_bucket) << net->ipv4.tcp_metrics_hash_log; | 1035 | size = sizeof(struct tcpm_hash_bucket) << net->ipv4.tcp_metrics_hash_log; |
1036 | 1036 | ||
1037 | net->ipv4.tcp_metrics_hash = kzalloc(size, GFP_KERNEL); | 1037 | net->ipv4.tcp_metrics_hash = kzalloc(size, GFP_KERNEL | __GFP_NOWARN); |
1038 | if (!net->ipv4.tcp_metrics_hash) | ||
1039 | net->ipv4.tcp_metrics_hash = vzalloc(size); | ||
1040 | |||
1038 | if (!net->ipv4.tcp_metrics_hash) | 1041 | if (!net->ipv4.tcp_metrics_hash) |
1039 | return -ENOMEM; | 1042 | return -ENOMEM; |
1040 | 1043 | ||
@@ -1055,7 +1058,10 @@ static void __net_exit tcp_net_metrics_exit(struct net *net) | |||
1055 | tm = next; | 1058 | tm = next; |
1056 | } | 1059 | } |
1057 | } | 1060 | } |
1058 | kfree(net->ipv4.tcp_metrics_hash); | 1061 | if (is_vmalloc_addr(net->ipv4.tcp_metrics_hash)) |
1062 | vfree(net->ipv4.tcp_metrics_hash); | ||
1063 | else | ||
1064 | kfree(net->ipv4.tcp_metrics_hash); | ||
1059 | } | 1065 | } |
1060 | 1066 | ||
1061 | static __net_initdata struct pernet_operations tcp_net_metrics_ops = { | 1067 | static __net_initdata struct pernet_operations tcp_net_metrics_ops = { |
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index cfe6ffe1c177..2798706cb063 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
@@ -1986,6 +1986,9 @@ static bool tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle, | |||
1986 | tso_segs = tcp_init_tso_segs(sk, skb, mss_now); | 1986 | tso_segs = tcp_init_tso_segs(sk, skb, mss_now); |
1987 | BUG_ON(!tso_segs); | 1987 | BUG_ON(!tso_segs); |
1988 | 1988 | ||
1989 | if (unlikely(tp->repair) && tp->repair_queue == TCP_SEND_QUEUE) | ||
1990 | goto repair; /* Skip network transmission */ | ||
1991 | |||
1989 | cwnd_quota = tcp_cwnd_test(tp, skb); | 1992 | cwnd_quota = tcp_cwnd_test(tp, skb); |
1990 | if (!cwnd_quota) | 1993 | if (!cwnd_quota) |
1991 | break; | 1994 | break; |
@@ -2026,6 +2029,7 @@ static bool tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle, | |||
2026 | if (unlikely(tcp_transmit_skb(sk, skb, 1, gfp))) | 2029 | if (unlikely(tcp_transmit_skb(sk, skb, 1, gfp))) |
2027 | break; | 2030 | break; |
2028 | 2031 | ||
2032 | repair: | ||
2029 | /* Advance the send_head. This one is sent out. | 2033 | /* Advance the send_head. This one is sent out. |
2030 | * This call will increment packets_out. | 2034 | * This call will increment packets_out. |
2031 | */ | 2035 | */ |
diff --git a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c index ba6d13d1f1e1..e02faed6d17e 100644 --- a/net/ipv6/ipv6_sockglue.c +++ b/net/ipv6/ipv6_sockglue.c | |||
@@ -827,6 +827,7 @@ pref_skip_coa: | |||
827 | if (val < 0 || val > 255) | 827 | if (val < 0 || val > 255) |
828 | goto e_inval; | 828 | goto e_inval; |
829 | np->min_hopcount = val; | 829 | np->min_hopcount = val; |
830 | retv = 0; | ||
830 | break; | 831 | break; |
831 | case IPV6_DONTFRAG: | 832 | case IPV6_DONTFRAG: |
832 | np->dontfrag = valbool; | 833 | np->dontfrag = valbool; |
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index 05f3a313db88..7371f676cf41 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c | |||
@@ -2594,6 +2594,9 @@ static void ieee80211_mgmt_frame_register(struct wiphy *wiphy, | |||
2594 | else | 2594 | else |
2595 | local->probe_req_reg--; | 2595 | local->probe_req_reg--; |
2596 | 2596 | ||
2597 | if (!local->open_count) | ||
2598 | break; | ||
2599 | |||
2597 | ieee80211_queue_work(&local->hw, &local->reconfig_filter); | 2600 | ieee80211_queue_work(&local->hw, &local->reconfig_filter); |
2598 | break; | 2601 | break; |
2599 | default: | 2602 | default: |
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index 8c804550465b..156e5835e37f 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h | |||
@@ -1314,6 +1314,8 @@ netdev_tx_t ieee80211_monitor_start_xmit(struct sk_buff *skb, | |||
1314 | struct net_device *dev); | 1314 | struct net_device *dev); |
1315 | netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb, | 1315 | netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb, |
1316 | struct net_device *dev); | 1316 | struct net_device *dev); |
1317 | void ieee80211_purge_tx_queue(struct ieee80211_hw *hw, | ||
1318 | struct sk_buff_head *skbs); | ||
1317 | 1319 | ||
1318 | /* HT */ | 1320 | /* HT */ |
1319 | void ieee80211_apply_htcap_overrides(struct ieee80211_sub_if_data *sdata, | 1321 | void ieee80211_apply_htcap_overrides(struct ieee80211_sub_if_data *sdata, |
diff --git a/net/mac80211/main.c b/net/mac80211/main.c index c80c4490351c..f57f597972f8 100644 --- a/net/mac80211/main.c +++ b/net/mac80211/main.c | |||
@@ -871,8 +871,10 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) | |||
871 | local->hw.wiphy->cipher_suites, | 871 | local->hw.wiphy->cipher_suites, |
872 | sizeof(u32) * local->hw.wiphy->n_cipher_suites, | 872 | sizeof(u32) * local->hw.wiphy->n_cipher_suites, |
873 | GFP_KERNEL); | 873 | GFP_KERNEL); |
874 | if (!suites) | 874 | if (!suites) { |
875 | return -ENOMEM; | 875 | result = -ENOMEM; |
876 | goto fail_wiphy_register; | ||
877 | } | ||
876 | for (r = 0; r < local->hw.wiphy->n_cipher_suites; r++) { | 878 | for (r = 0; r < local->hw.wiphy->n_cipher_suites; r++) { |
877 | u32 suite = local->hw.wiphy->cipher_suites[r]; | 879 | u32 suite = local->hw.wiphy->cipher_suites[r]; |
878 | if (suite == WLAN_CIPHER_SUITE_WEP40 || | 880 | if (suite == WLAN_CIPHER_SUITE_WEP40 || |
diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c index c4cdbde24fd3..43e60b5a7546 100644 --- a/net/mac80211/scan.c +++ b/net/mac80211/scan.c | |||
@@ -917,7 +917,7 @@ int ieee80211_request_sched_scan_start(struct ieee80211_sub_if_data *sdata, | |||
917 | struct cfg80211_sched_scan_request *req) | 917 | struct cfg80211_sched_scan_request *req) |
918 | { | 918 | { |
919 | struct ieee80211_local *local = sdata->local; | 919 | struct ieee80211_local *local = sdata->local; |
920 | struct ieee80211_sched_scan_ies sched_scan_ies; | 920 | struct ieee80211_sched_scan_ies sched_scan_ies = {}; |
921 | int ret, i; | 921 | int ret, i; |
922 | 922 | ||
923 | mutex_lock(&local->mtx); | 923 | mutex_lock(&local->mtx); |
diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c index 0a4e4c04db89..d2eb64e12353 100644 --- a/net/mac80211/sta_info.c +++ b/net/mac80211/sta_info.c | |||
@@ -117,8 +117,8 @@ static void free_sta_work(struct work_struct *wk) | |||
117 | 117 | ||
118 | for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) { | 118 | for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) { |
119 | local->total_ps_buffered -= skb_queue_len(&sta->ps_tx_buf[ac]); | 119 | local->total_ps_buffered -= skb_queue_len(&sta->ps_tx_buf[ac]); |
120 | __skb_queue_purge(&sta->ps_tx_buf[ac]); | 120 | ieee80211_purge_tx_queue(&local->hw, &sta->ps_tx_buf[ac]); |
121 | __skb_queue_purge(&sta->tx_filtered[ac]); | 121 | ieee80211_purge_tx_queue(&local->hw, &sta->tx_filtered[ac]); |
122 | } | 122 | } |
123 | 123 | ||
124 | #ifdef CONFIG_MAC80211_MESH | 124 | #ifdef CONFIG_MAC80211_MESH |
@@ -141,7 +141,7 @@ static void free_sta_work(struct work_struct *wk) | |||
141 | tid_tx = rcu_dereference_raw(sta->ampdu_mlme.tid_tx[i]); | 141 | tid_tx = rcu_dereference_raw(sta->ampdu_mlme.tid_tx[i]); |
142 | if (!tid_tx) | 142 | if (!tid_tx) |
143 | continue; | 143 | continue; |
144 | __skb_queue_purge(&tid_tx->pending); | 144 | ieee80211_purge_tx_queue(&local->hw, &tid_tx->pending); |
145 | kfree(tid_tx); | 145 | kfree(tid_tx); |
146 | } | 146 | } |
147 | 147 | ||
@@ -961,6 +961,7 @@ void ieee80211_sta_ps_deliver_wakeup(struct sta_info *sta) | |||
961 | struct ieee80211_local *local = sdata->local; | 961 | struct ieee80211_local *local = sdata->local; |
962 | struct sk_buff_head pending; | 962 | struct sk_buff_head pending; |
963 | int filtered = 0, buffered = 0, ac; | 963 | int filtered = 0, buffered = 0, ac; |
964 | unsigned long flags; | ||
964 | 965 | ||
965 | clear_sta_flag(sta, WLAN_STA_SP); | 966 | clear_sta_flag(sta, WLAN_STA_SP); |
966 | 967 | ||
@@ -976,12 +977,16 @@ void ieee80211_sta_ps_deliver_wakeup(struct sta_info *sta) | |||
976 | for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) { | 977 | for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) { |
977 | int count = skb_queue_len(&pending), tmp; | 978 | int count = skb_queue_len(&pending), tmp; |
978 | 979 | ||
980 | spin_lock_irqsave(&sta->tx_filtered[ac].lock, flags); | ||
979 | skb_queue_splice_tail_init(&sta->tx_filtered[ac], &pending); | 981 | skb_queue_splice_tail_init(&sta->tx_filtered[ac], &pending); |
982 | spin_unlock_irqrestore(&sta->tx_filtered[ac].lock, flags); | ||
980 | tmp = skb_queue_len(&pending); | 983 | tmp = skb_queue_len(&pending); |
981 | filtered += tmp - count; | 984 | filtered += tmp - count; |
982 | count = tmp; | 985 | count = tmp; |
983 | 986 | ||
987 | spin_lock_irqsave(&sta->ps_tx_buf[ac].lock, flags); | ||
984 | skb_queue_splice_tail_init(&sta->ps_tx_buf[ac], &pending); | 988 | skb_queue_splice_tail_init(&sta->ps_tx_buf[ac], &pending); |
989 | spin_unlock_irqrestore(&sta->ps_tx_buf[ac].lock, flags); | ||
985 | tmp = skb_queue_len(&pending); | 990 | tmp = skb_queue_len(&pending); |
986 | buffered += tmp - count; | 991 | buffered += tmp - count; |
987 | } | 992 | } |
diff --git a/net/mac80211/status.c b/net/mac80211/status.c index 3af0cc4130f1..101eb88a2b78 100644 --- a/net/mac80211/status.c +++ b/net/mac80211/status.c | |||
@@ -668,3 +668,12 @@ void ieee80211_free_txskb(struct ieee80211_hw *hw, struct sk_buff *skb) | |||
668 | dev_kfree_skb_any(skb); | 668 | dev_kfree_skb_any(skb); |
669 | } | 669 | } |
670 | EXPORT_SYMBOL(ieee80211_free_txskb); | 670 | EXPORT_SYMBOL(ieee80211_free_txskb); |
671 | |||
672 | void ieee80211_purge_tx_queue(struct ieee80211_hw *hw, | ||
673 | struct sk_buff_head *skbs) | ||
674 | { | ||
675 | struct sk_buff *skb; | ||
676 | |||
677 | while ((skb = __skb_dequeue(skbs))) | ||
678 | ieee80211_free_txskb(hw, skb); | ||
679 | } | ||
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index c9bf83f36657..b858ebe41fda 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c | |||
@@ -1358,7 +1358,7 @@ static int invoke_tx_handlers(struct ieee80211_tx_data *tx) | |||
1358 | if (tx->skb) | 1358 | if (tx->skb) |
1359 | ieee80211_free_txskb(&tx->local->hw, tx->skb); | 1359 | ieee80211_free_txskb(&tx->local->hw, tx->skb); |
1360 | else | 1360 | else |
1361 | __skb_queue_purge(&tx->skbs); | 1361 | ieee80211_purge_tx_queue(&tx->local->hw, &tx->skbs); |
1362 | return -1; | 1362 | return -1; |
1363 | } else if (unlikely(res == TX_QUEUED)) { | 1363 | } else if (unlikely(res == TX_QUEUED)) { |
1364 | I802_DEBUG_INC(tx->local->tx_handlers_queued); | 1364 | I802_DEBUG_INC(tx->local->tx_handlers_queued); |
@@ -2120,10 +2120,13 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb, | |||
2120 | */ | 2120 | */ |
2121 | void ieee80211_clear_tx_pending(struct ieee80211_local *local) | 2121 | void ieee80211_clear_tx_pending(struct ieee80211_local *local) |
2122 | { | 2122 | { |
2123 | struct sk_buff *skb; | ||
2123 | int i; | 2124 | int i; |
2124 | 2125 | ||
2125 | for (i = 0; i < local->hw.queues; i++) | 2126 | for (i = 0; i < local->hw.queues; i++) { |
2126 | skb_queue_purge(&local->pending[i]); | 2127 | while ((skb = skb_dequeue(&local->pending[i])) != NULL) |
2128 | ieee80211_free_txskb(&local->hw, skb); | ||
2129 | } | ||
2127 | } | 2130 | } |
2128 | 2131 | ||
2129 | /* | 2132 | /* |
diff --git a/net/mac80211/util.c b/net/mac80211/util.c index 239391807ca9..0151ae33c4cd 100644 --- a/net/mac80211/util.c +++ b/net/mac80211/util.c | |||
@@ -1491,6 +1491,8 @@ int ieee80211_reconfig(struct ieee80211_local *local) | |||
1491 | list_for_each_entry(sdata, &local->interfaces, list) { | 1491 | list_for_each_entry(sdata, &local->interfaces, list) { |
1492 | if (sdata->vif.type != NL80211_IFTYPE_STATION) | 1492 | if (sdata->vif.type != NL80211_IFTYPE_STATION) |
1493 | continue; | 1493 | continue; |
1494 | if (!sdata->u.mgd.associated) | ||
1495 | continue; | ||
1494 | 1496 | ||
1495 | ieee80211_send_nullfunc(local, sdata, 0); | 1497 | ieee80211_send_nullfunc(local, sdata, 0); |
1496 | } | 1498 | } |
diff --git a/net/sctp/proc.c b/net/sctp/proc.c index c3bea269faf4..9966e7b16451 100644 --- a/net/sctp/proc.c +++ b/net/sctp/proc.c | |||
@@ -102,7 +102,7 @@ static const struct file_operations sctp_snmp_seq_fops = { | |||
102 | .open = sctp_snmp_seq_open, | 102 | .open = sctp_snmp_seq_open, |
103 | .read = seq_read, | 103 | .read = seq_read, |
104 | .llseek = seq_lseek, | 104 | .llseek = seq_lseek, |
105 | .release = single_release, | 105 | .release = single_release_net, |
106 | }; | 106 | }; |
107 | 107 | ||
108 | /* Set up the proc fs entry for 'snmp' object. */ | 108 | /* Set up the proc fs entry for 'snmp' object. */ |
@@ -251,7 +251,7 @@ static const struct file_operations sctp_eps_seq_fops = { | |||
251 | .open = sctp_eps_seq_open, | 251 | .open = sctp_eps_seq_open, |
252 | .read = seq_read, | 252 | .read = seq_read, |
253 | .llseek = seq_lseek, | 253 | .llseek = seq_lseek, |
254 | .release = seq_release, | 254 | .release = seq_release_net, |
255 | }; | 255 | }; |
256 | 256 | ||
257 | /* Set up the proc fs entry for 'eps' object. */ | 257 | /* Set up the proc fs entry for 'eps' object. */ |
@@ -372,7 +372,7 @@ static const struct file_operations sctp_assocs_seq_fops = { | |||
372 | .open = sctp_assocs_seq_open, | 372 | .open = sctp_assocs_seq_open, |
373 | .read = seq_read, | 373 | .read = seq_read, |
374 | .llseek = seq_lseek, | 374 | .llseek = seq_lseek, |
375 | .release = seq_release, | 375 | .release = seq_release_net, |
376 | }; | 376 | }; |
377 | 377 | ||
378 | /* Set up the proc fs entry for 'assocs' object. */ | 378 | /* Set up the proc fs entry for 'assocs' object. */ |
@@ -517,7 +517,7 @@ static const struct file_operations sctp_remaddr_seq_fops = { | |||
517 | .open = sctp_remaddr_seq_open, | 517 | .open = sctp_remaddr_seq_open, |
518 | .read = seq_read, | 518 | .read = seq_read, |
519 | .llseek = seq_lseek, | 519 | .llseek = seq_lseek, |
520 | .release = seq_release, | 520 | .release = seq_release_net, |
521 | }; | 521 | }; |
522 | 522 | ||
523 | int __net_init sctp_remaddr_proc_init(struct net *net) | 523 | int __net_init sctp_remaddr_proc_init(struct net *net) |
diff --git a/net/wireless/reg.c b/net/wireless/reg.c index bcc7d7ee5a51..b75756b05af7 100644 --- a/net/wireless/reg.c +++ b/net/wireless/reg.c | |||
@@ -141,9 +141,8 @@ static const struct ieee80211_regdomain world_regdom = { | |||
141 | .reg_rules = { | 141 | .reg_rules = { |
142 | /* IEEE 802.11b/g, channels 1..11 */ | 142 | /* IEEE 802.11b/g, channels 1..11 */ |
143 | REG_RULE(2412-10, 2462+10, 40, 6, 20, 0), | 143 | REG_RULE(2412-10, 2462+10, 40, 6, 20, 0), |
144 | /* IEEE 802.11b/g, channels 12..13. No HT40 | 144 | /* IEEE 802.11b/g, channels 12..13. */ |
145 | * channel fits here. */ | 145 | REG_RULE(2467-10, 2472+10, 40, 6, 20, |
146 | REG_RULE(2467-10, 2472+10, 20, 6, 20, | ||
147 | NL80211_RRF_PASSIVE_SCAN | | 146 | NL80211_RRF_PASSIVE_SCAN | |
148 | NL80211_RRF_NO_IBSS), | 147 | NL80211_RRF_NO_IBSS), |
149 | /* IEEE 802.11 channel 14 - Only JP enables | 148 | /* IEEE 802.11 channel 14 - Only JP enables |
diff --git a/scripts/kconfig/expr.h b/scripts/kconfig/expr.h index bd2e09895553..cdd48600e02a 100644 --- a/scripts/kconfig/expr.h +++ b/scripts/kconfig/expr.h | |||
@@ -12,7 +12,7 @@ extern "C" { | |||
12 | 12 | ||
13 | #include <assert.h> | 13 | #include <assert.h> |
14 | #include <stdio.h> | 14 | #include <stdio.h> |
15 | #include <sys/queue.h> | 15 | #include "list.h" |
16 | #ifndef __cplusplus | 16 | #ifndef __cplusplus |
17 | #include <stdbool.h> | 17 | #include <stdbool.h> |
18 | #endif | 18 | #endif |
@@ -175,12 +175,11 @@ struct menu { | |||
175 | #define MENU_ROOT 0x0002 | 175 | #define MENU_ROOT 0x0002 |
176 | 176 | ||
177 | struct jump_key { | 177 | struct jump_key { |
178 | CIRCLEQ_ENTRY(jump_key) entries; | 178 | struct list_head entries; |
179 | size_t offset; | 179 | size_t offset; |
180 | struct menu *target; | 180 | struct menu *target; |
181 | int index; | 181 | int index; |
182 | }; | 182 | }; |
183 | CIRCLEQ_HEAD(jk_head, jump_key); | ||
184 | 183 | ||
185 | #define JUMP_NB 9 | 184 | #define JUMP_NB 9 |
186 | 185 | ||
diff --git a/scripts/kconfig/list.h b/scripts/kconfig/list.h new file mode 100644 index 000000000000..0ae730be5f49 --- /dev/null +++ b/scripts/kconfig/list.h | |||
@@ -0,0 +1,91 @@ | |||
1 | #ifndef LIST_H | ||
2 | #define LIST_H | ||
3 | |||
4 | /* | ||
5 | * Copied from include/linux/... | ||
6 | */ | ||
7 | |||
8 | #undef offsetof | ||
9 | #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) | ||
10 | |||
11 | /** | ||
12 | * container_of - cast a member of a structure out to the containing structure | ||
13 | * @ptr: the pointer to the member. | ||
14 | * @type: the type of the container struct this is embedded in. | ||
15 | * @member: the name of the member within the struct. | ||
16 | * | ||
17 | */ | ||
18 | #define container_of(ptr, type, member) ({ \ | ||
19 | const typeof( ((type *)0)->member ) *__mptr = (ptr); \ | ||
20 | (type *)( (char *)__mptr - offsetof(type,member) );}) | ||
21 | |||
22 | |||
23 | struct list_head { | ||
24 | struct list_head *next, *prev; | ||
25 | }; | ||
26 | |||
27 | |||
28 | #define LIST_HEAD_INIT(name) { &(name), &(name) } | ||
29 | |||
30 | #define LIST_HEAD(name) \ | ||
31 | struct list_head name = LIST_HEAD_INIT(name) | ||
32 | |||
33 | /** | ||
34 | * list_entry - get the struct for this entry | ||
35 | * @ptr: the &struct list_head pointer. | ||
36 | * @type: the type of the struct this is embedded in. | ||
37 | * @member: the name of the list_struct within the struct. | ||
38 | */ | ||
39 | #define list_entry(ptr, type, member) \ | ||
40 | container_of(ptr, type, member) | ||
41 | |||
42 | /** | ||
43 | * list_for_each_entry - iterate over list of given type | ||
44 | * @pos: the type * to use as a loop cursor. | ||
45 | * @head: the head for your list. | ||
46 | * @member: the name of the list_struct within the struct. | ||
47 | */ | ||
48 | #define list_for_each_entry(pos, head, member) \ | ||
49 | for (pos = list_entry((head)->next, typeof(*pos), member); \ | ||
50 | &pos->member != (head); \ | ||
51 | pos = list_entry(pos->member.next, typeof(*pos), member)) | ||
52 | |||
53 | /** | ||
54 | * list_empty - tests whether a list is empty | ||
55 | * @head: the list to test. | ||
56 | */ | ||
57 | static inline int list_empty(const struct list_head *head) | ||
58 | { | ||
59 | return head->next == head; | ||
60 | } | ||
61 | |||
62 | /* | ||
63 | * Insert a new entry between two known consecutive entries. | ||
64 | * | ||
65 | * This is only for internal list manipulation where we know | ||
66 | * the prev/next entries already! | ||
67 | */ | ||
68 | static inline void __list_add(struct list_head *_new, | ||
69 | struct list_head *prev, | ||
70 | struct list_head *next) | ||
71 | { | ||
72 | next->prev = _new; | ||
73 | _new->next = next; | ||
74 | _new->prev = prev; | ||
75 | prev->next = _new; | ||
76 | } | ||
77 | |||
78 | /** | ||
79 | * list_add_tail - add a new entry | ||
80 | * @new: new entry to be added | ||
81 | * @head: list head to add it before | ||
82 | * | ||
83 | * Insert a new entry before the specified head. | ||
84 | * This is useful for implementing queues. | ||
85 | */ | ||
86 | static inline void list_add_tail(struct list_head *_new, struct list_head *head) | ||
87 | { | ||
88 | __list_add(_new, head->prev, head); | ||
89 | } | ||
90 | |||
91 | #endif | ||
diff --git a/scripts/kconfig/lkc_proto.h b/scripts/kconfig/lkc_proto.h index 1d1c08537f1e..ef1a7381f956 100644 --- a/scripts/kconfig/lkc_proto.h +++ b/scripts/kconfig/lkc_proto.h | |||
@@ -21,9 +21,9 @@ P(menu_get_root_menu,struct menu *,(struct menu *menu)); | |||
21 | P(menu_get_parent_menu,struct menu *,(struct menu *menu)); | 21 | P(menu_get_parent_menu,struct menu *,(struct menu *menu)); |
22 | P(menu_has_help,bool,(struct menu *menu)); | 22 | P(menu_has_help,bool,(struct menu *menu)); |
23 | P(menu_get_help,const char *,(struct menu *menu)); | 23 | P(menu_get_help,const char *,(struct menu *menu)); |
24 | P(get_symbol_str, void, (struct gstr *r, struct symbol *sym, struct jk_head | 24 | P(get_symbol_str, void, (struct gstr *r, struct symbol *sym, struct list_head |
25 | *head)); | 25 | *head)); |
26 | P(get_relations_str, struct gstr, (struct symbol **sym_arr, struct jk_head | 26 | P(get_relations_str, struct gstr, (struct symbol **sym_arr, struct list_head |
27 | *head)); | 27 | *head)); |
28 | P(menu_get_ext_help,void,(struct menu *menu, struct gstr *help)); | 28 | P(menu_get_ext_help,void,(struct menu *menu, struct gstr *help)); |
29 | 29 | ||
diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c index 48f67448af7b..53975cf87608 100644 --- a/scripts/kconfig/mconf.c +++ b/scripts/kconfig/mconf.c | |||
@@ -312,7 +312,7 @@ static void set_config_filename(const char *config_filename) | |||
312 | 312 | ||
313 | 313 | ||
314 | struct search_data { | 314 | struct search_data { |
315 | struct jk_head *head; | 315 | struct list_head *head; |
316 | struct menu **targets; | 316 | struct menu **targets; |
317 | int *keys; | 317 | int *keys; |
318 | }; | 318 | }; |
@@ -323,7 +323,7 @@ static void update_text(char *buf, size_t start, size_t end, void *_data) | |||
323 | struct jump_key *pos; | 323 | struct jump_key *pos; |
324 | int k = 0; | 324 | int k = 0; |
325 | 325 | ||
326 | CIRCLEQ_FOREACH(pos, data->head, entries) { | 326 | list_for_each_entry(pos, data->head, entries) { |
327 | if (pos->offset >= start && pos->offset < end) { | 327 | if (pos->offset >= start && pos->offset < end) { |
328 | char header[4]; | 328 | char header[4]; |
329 | 329 | ||
@@ -375,7 +375,7 @@ again: | |||
375 | 375 | ||
376 | sym_arr = sym_re_search(dialog_input); | 376 | sym_arr = sym_re_search(dialog_input); |
377 | do { | 377 | do { |
378 | struct jk_head head = CIRCLEQ_HEAD_INITIALIZER(head); | 378 | LIST_HEAD(head); |
379 | struct menu *targets[JUMP_NB]; | 379 | struct menu *targets[JUMP_NB]; |
380 | int keys[JUMP_NB + 1], i; | 380 | int keys[JUMP_NB + 1], i; |
381 | struct search_data data = { | 381 | struct search_data data = { |
diff --git a/scripts/kconfig/menu.c b/scripts/kconfig/menu.c index a3cade659f89..e98a05c8e508 100644 --- a/scripts/kconfig/menu.c +++ b/scripts/kconfig/menu.c | |||
@@ -508,7 +508,7 @@ const char *menu_get_help(struct menu *menu) | |||
508 | } | 508 | } |
509 | 509 | ||
510 | static void get_prompt_str(struct gstr *r, struct property *prop, | 510 | static void get_prompt_str(struct gstr *r, struct property *prop, |
511 | struct jk_head *head) | 511 | struct list_head *head) |
512 | { | 512 | { |
513 | int i, j; | 513 | int i, j; |
514 | struct menu *submenu[8], *menu, *location = NULL; | 514 | struct menu *submenu[8], *menu, *location = NULL; |
@@ -544,12 +544,13 @@ static void get_prompt_str(struct gstr *r, struct property *prop, | |||
544 | } else | 544 | } else |
545 | jump->target = location; | 545 | jump->target = location; |
546 | 546 | ||
547 | if (CIRCLEQ_EMPTY(head)) | 547 | if (list_empty(head)) |
548 | jump->index = 0; | 548 | jump->index = 0; |
549 | else | 549 | else |
550 | jump->index = CIRCLEQ_LAST(head)->index + 1; | 550 | jump->index = list_entry(head->prev, struct jump_key, |
551 | entries)->index + 1; | ||
551 | 552 | ||
552 | CIRCLEQ_INSERT_TAIL(head, jump, entries); | 553 | list_add_tail(&jump->entries, head); |
553 | } | 554 | } |
554 | 555 | ||
555 | if (i > 0) { | 556 | if (i > 0) { |
@@ -573,7 +574,8 @@ static void get_prompt_str(struct gstr *r, struct property *prop, | |||
573 | /* | 574 | /* |
574 | * head is optional and may be NULL | 575 | * head is optional and may be NULL |
575 | */ | 576 | */ |
576 | void get_symbol_str(struct gstr *r, struct symbol *sym, struct jk_head *head) | 577 | void get_symbol_str(struct gstr *r, struct symbol *sym, |
578 | struct list_head *head) | ||
577 | { | 579 | { |
578 | bool hit; | 580 | bool hit; |
579 | struct property *prop; | 581 | struct property *prop; |
@@ -612,7 +614,7 @@ void get_symbol_str(struct gstr *r, struct symbol *sym, struct jk_head *head) | |||
612 | str_append(r, "\n\n"); | 614 | str_append(r, "\n\n"); |
613 | } | 615 | } |
614 | 616 | ||
615 | struct gstr get_relations_str(struct symbol **sym_arr, struct jk_head *head) | 617 | struct gstr get_relations_str(struct symbol **sym_arr, struct list_head *head) |
616 | { | 618 | { |
617 | struct symbol *sym; | 619 | struct symbol *sym; |
618 | struct gstr res = str_new(); | 620 | struct gstr res = str_new(); |
diff --git a/security/device_cgroup.c b/security/device_cgroup.c index 842c254396db..b08d20c66c2e 100644 --- a/security/device_cgroup.c +++ b/security/device_cgroup.c | |||
@@ -164,8 +164,8 @@ static void dev_exception_clean(struct dev_cgroup *dev_cgroup) | |||
164 | struct dev_exception_item *ex, *tmp; | 164 | struct dev_exception_item *ex, *tmp; |
165 | 165 | ||
166 | list_for_each_entry_safe(ex, tmp, &dev_cgroup->exceptions, list) { | 166 | list_for_each_entry_safe(ex, tmp, &dev_cgroup->exceptions, list) { |
167 | list_del(&ex->list); | 167 | list_del_rcu(&ex->list); |
168 | kfree(ex); | 168 | kfree_rcu(ex, rcu); |
169 | } | 169 | } |
170 | } | 170 | } |
171 | 171 | ||
@@ -298,7 +298,7 @@ static int may_access(struct dev_cgroup *dev_cgroup, | |||
298 | struct dev_exception_item *ex; | 298 | struct dev_exception_item *ex; |
299 | bool match = false; | 299 | bool match = false; |
300 | 300 | ||
301 | list_for_each_entry(ex, &dev_cgroup->exceptions, list) { | 301 | list_for_each_entry_rcu(ex, &dev_cgroup->exceptions, list) { |
302 | if ((refex->type & DEV_BLOCK) && !(ex->type & DEV_BLOCK)) | 302 | if ((refex->type & DEV_BLOCK) && !(ex->type & DEV_BLOCK)) |
303 | continue; | 303 | continue; |
304 | if ((refex->type & DEV_CHAR) && !(ex->type & DEV_CHAR)) | 304 | if ((refex->type & DEV_CHAR) && !(ex->type & DEV_CHAR)) |
@@ -352,6 +352,8 @@ static int parent_has_perm(struct dev_cgroup *childcg, | |||
352 | */ | 352 | */ |
353 | static inline int may_allow_all(struct dev_cgroup *parent) | 353 | static inline int may_allow_all(struct dev_cgroup *parent) |
354 | { | 354 | { |
355 | if (!parent) | ||
356 | return 1; | ||
355 | return parent->behavior == DEVCG_DEFAULT_ALLOW; | 357 | return parent->behavior == DEVCG_DEFAULT_ALLOW; |
356 | } | 358 | } |
357 | 359 | ||
@@ -376,11 +378,14 @@ static int devcgroup_update_access(struct dev_cgroup *devcgroup, | |||
376 | int count, rc; | 378 | int count, rc; |
377 | struct dev_exception_item ex; | 379 | struct dev_exception_item ex; |
378 | struct cgroup *p = devcgroup->css.cgroup; | 380 | struct cgroup *p = devcgroup->css.cgroup; |
379 | struct dev_cgroup *parent = cgroup_to_devcgroup(p->parent); | 381 | struct dev_cgroup *parent = NULL; |
380 | 382 | ||
381 | if (!capable(CAP_SYS_ADMIN)) | 383 | if (!capable(CAP_SYS_ADMIN)) |
382 | return -EPERM; | 384 | return -EPERM; |
383 | 385 | ||
386 | if (p->parent) | ||
387 | parent = cgroup_to_devcgroup(p->parent); | ||
388 | |||
384 | memset(&ex, 0, sizeof(ex)); | 389 | memset(&ex, 0, sizeof(ex)); |
385 | b = buffer; | 390 | b = buffer; |
386 | 391 | ||
@@ -391,11 +396,14 @@ static int devcgroup_update_access(struct dev_cgroup *devcgroup, | |||
391 | if (!may_allow_all(parent)) | 396 | if (!may_allow_all(parent)) |
392 | return -EPERM; | 397 | return -EPERM; |
393 | dev_exception_clean(devcgroup); | 398 | dev_exception_clean(devcgroup); |
399 | devcgroup->behavior = DEVCG_DEFAULT_ALLOW; | ||
400 | if (!parent) | ||
401 | break; | ||
402 | |||
394 | rc = dev_exceptions_copy(&devcgroup->exceptions, | 403 | rc = dev_exceptions_copy(&devcgroup->exceptions, |
395 | &parent->exceptions); | 404 | &parent->exceptions); |
396 | if (rc) | 405 | if (rc) |
397 | return rc; | 406 | return rc; |
398 | devcgroup->behavior = DEVCG_DEFAULT_ALLOW; | ||
399 | break; | 407 | break; |
400 | case DEVCG_DENY: | 408 | case DEVCG_DENY: |
401 | dev_exception_clean(devcgroup); | 409 | dev_exception_clean(devcgroup); |
diff --git a/sound/pci/es1968.c b/sound/pci/es1968.c index 50169bcfd903..7266020c16cb 100644 --- a/sound/pci/es1968.c +++ b/sound/pci/es1968.c | |||
@@ -2581,9 +2581,14 @@ static u8 snd_es1968_tea575x_get_pins(struct snd_tea575x *tea) | |||
2581 | struct es1968 *chip = tea->private_data; | 2581 | struct es1968 *chip = tea->private_data; |
2582 | unsigned long io = chip->io_port + GPIO_DATA; | 2582 | unsigned long io = chip->io_port + GPIO_DATA; |
2583 | u16 val = inw(io); | 2583 | u16 val = inw(io); |
2584 | 2584 | u8 ret; | |
2585 | return (val & STR_DATA) ? TEA575X_DATA : 0 | | 2585 | |
2586 | (val & STR_MOST) ? TEA575X_MOST : 0; | 2586 | ret = 0; |
2587 | if (val & STR_DATA) | ||
2588 | ret |= TEA575X_DATA; | ||
2589 | if (val & STR_MOST) | ||
2590 | ret |= TEA575X_MOST; | ||
2591 | return ret; | ||
2587 | } | 2592 | } |
2588 | 2593 | ||
2589 | static void snd_es1968_tea575x_set_direction(struct snd_tea575x *tea, bool output) | 2594 | static void snd_es1968_tea575x_set_direction(struct snd_tea575x *tea, bool output) |
diff --git a/sound/pci/fm801.c b/sound/pci/fm801.c index cc2e91d15538..c5806f89be1e 100644 --- a/sound/pci/fm801.c +++ b/sound/pci/fm801.c | |||
@@ -767,9 +767,14 @@ static u8 snd_fm801_tea575x_get_pins(struct snd_tea575x *tea) | |||
767 | struct fm801 *chip = tea->private_data; | 767 | struct fm801 *chip = tea->private_data; |
768 | unsigned short reg = inw(FM801_REG(chip, GPIO_CTRL)); | 768 | unsigned short reg = inw(FM801_REG(chip, GPIO_CTRL)); |
769 | struct snd_fm801_tea575x_gpio gpio = *get_tea575x_gpio(chip); | 769 | struct snd_fm801_tea575x_gpio gpio = *get_tea575x_gpio(chip); |
770 | 770 | u8 ret; | |
771 | return (reg & FM801_GPIO_GP(gpio.data)) ? TEA575X_DATA : 0 | | 771 | |
772 | (reg & FM801_GPIO_GP(gpio.most)) ? TEA575X_MOST : 0; | 772 | ret = 0; |
773 | if (reg & FM801_GPIO_GP(gpio.data)) | ||
774 | ret |= TEA575X_DATA; | ||
775 | if (reg & FM801_GPIO_GP(gpio.most)) | ||
776 | ret |= TEA575X_MOST; | ||
777 | return ret; | ||
773 | } | 778 | } |
774 | 779 | ||
775 | static void snd_fm801_tea575x_set_direction(struct snd_tea575x *tea, bool output) | 780 | static void snd_fm801_tea575x_set_direction(struct snd_tea575x *tea, bool output) |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index c0ce3b1f04b4..68fd49294b26 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -5407,6 +5407,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = { | |||
5407 | SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC889_FIXUP_IMAC91_VREF), | 5407 | SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC889_FIXUP_IMAC91_VREF), |
5408 | SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC889_FIXUP_IMAC91_VREF), | 5408 | SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC889_FIXUP_IMAC91_VREF), |
5409 | SND_PCI_QUIRK(0x106b, 0x4200, "Mac Pro 5,1", ALC885_FIXUP_MACPRO_GPIO), | 5409 | SND_PCI_QUIRK(0x106b, 0x4200, "Mac Pro 5,1", ALC885_FIXUP_MACPRO_GPIO), |
5410 | SND_PCI_QUIRK(0x106b, 0x4300, "iMac 9,1", ALC889_FIXUP_IMAC91_VREF), | ||
5410 | SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC889_FIXUP_IMAC91_VREF), | 5411 | SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC889_FIXUP_IMAC91_VREF), |
5411 | SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC889_FIXUP_IMAC91_VREF), | 5412 | SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC889_FIXUP_IMAC91_VREF), |
5412 | SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_IMAC91_VREF), | 5413 | SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_IMAC91_VREF), |
diff --git a/sound/soc/codecs/cs42l52.c b/sound/soc/codecs/cs42l52.c index 4d8db3685e96..97a81051e88d 100644 --- a/sound/soc/codecs/cs42l52.c +++ b/sound/soc/codecs/cs42l52.c | |||
@@ -773,7 +773,6 @@ static int cs42l52_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) | |||
773 | { | 773 | { |
774 | struct snd_soc_codec *codec = codec_dai->codec; | 774 | struct snd_soc_codec *codec = codec_dai->codec; |
775 | struct cs42l52_private *cs42l52 = snd_soc_codec_get_drvdata(codec); | 775 | struct cs42l52_private *cs42l52 = snd_soc_codec_get_drvdata(codec); |
776 | int ret = 0; | ||
777 | u8 iface = 0; | 776 | u8 iface = 0; |
778 | 777 | ||
779 | switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { | 778 | switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { |
@@ -822,7 +821,7 @@ static int cs42l52_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) | |||
822 | case SND_SOC_DAIFMT_NB_IF: | 821 | case SND_SOC_DAIFMT_NB_IF: |
823 | break; | 822 | break; |
824 | default: | 823 | default: |
825 | ret = -EINVAL; | 824 | return -EINVAL; |
826 | } | 825 | } |
827 | cs42l52->config.format = iface; | 826 | cs42l52->config.format = iface; |
828 | snd_soc_write(codec, CS42L52_IFACE_CTL1, cs42l52->config.format); | 827 | snd_soc_write(codec, CS42L52_IFACE_CTL1, cs42l52->config.format); |
diff --git a/sound/soc/codecs/wm5102.c b/sound/soc/codecs/wm5102.c index 1722b586bdba..7394e73fa43c 100644 --- a/sound/soc/codecs/wm5102.c +++ b/sound/soc/codecs/wm5102.c | |||
@@ -42,6 +42,556 @@ static DECLARE_TLV_DB_SCALE(eq_tlv, -1200, 100, 0); | |||
42 | static DECLARE_TLV_DB_SCALE(digital_tlv, -6400, 50, 0); | 42 | static DECLARE_TLV_DB_SCALE(digital_tlv, -6400, 50, 0); |
43 | static DECLARE_TLV_DB_SCALE(noise_tlv, 0, 600, 0); | 43 | static DECLARE_TLV_DB_SCALE(noise_tlv, 0, 600, 0); |
44 | 44 | ||
45 | static const struct reg_default wm5102_sysclk_reva_patch[] = { | ||
46 | { 0x3000, 0x2225 }, | ||
47 | { 0x3001, 0x3a03 }, | ||
48 | { 0x3002, 0x0225 }, | ||
49 | { 0x3003, 0x0801 }, | ||
50 | { 0x3004, 0x6249 }, | ||
51 | { 0x3005, 0x0c04 }, | ||
52 | { 0x3006, 0x0225 }, | ||
53 | { 0x3007, 0x5901 }, | ||
54 | { 0x3008, 0xe249 }, | ||
55 | { 0x3009, 0x030d }, | ||
56 | { 0x300a, 0x0249 }, | ||
57 | { 0x300b, 0x2c01 }, | ||
58 | { 0x300c, 0xe249 }, | ||
59 | { 0x300d, 0x4342 }, | ||
60 | { 0x300e, 0xe249 }, | ||
61 | { 0x300f, 0x73c0 }, | ||
62 | { 0x3010, 0x4249 }, | ||
63 | { 0x3011, 0x0c00 }, | ||
64 | { 0x3012, 0x0225 }, | ||
65 | { 0x3013, 0x1f01 }, | ||
66 | { 0x3014, 0x0225 }, | ||
67 | { 0x3015, 0x1e01 }, | ||
68 | { 0x3016, 0x0225 }, | ||
69 | { 0x3017, 0xfa00 }, | ||
70 | { 0x3018, 0x0000 }, | ||
71 | { 0x3019, 0xf000 }, | ||
72 | { 0x301a, 0x0000 }, | ||
73 | { 0x301b, 0xf000 }, | ||
74 | { 0x301c, 0x0000 }, | ||
75 | { 0x301d, 0xf000 }, | ||
76 | { 0x301e, 0x0000 }, | ||
77 | { 0x301f, 0xf000 }, | ||
78 | { 0x3020, 0x0000 }, | ||
79 | { 0x3021, 0xf000 }, | ||
80 | { 0x3022, 0x0000 }, | ||
81 | { 0x3023, 0xf000 }, | ||
82 | { 0x3024, 0x0000 }, | ||
83 | { 0x3025, 0xf000 }, | ||
84 | { 0x3026, 0x0000 }, | ||
85 | { 0x3027, 0xf000 }, | ||
86 | { 0x3028, 0x0000 }, | ||
87 | { 0x3029, 0xf000 }, | ||
88 | { 0x302a, 0x0000 }, | ||
89 | { 0x302b, 0xf000 }, | ||
90 | { 0x302c, 0x0000 }, | ||
91 | { 0x302d, 0xf000 }, | ||
92 | { 0x302e, 0x0000 }, | ||
93 | { 0x302f, 0xf000 }, | ||
94 | { 0x3030, 0x0225 }, | ||
95 | { 0x3031, 0x1a01 }, | ||
96 | { 0x3032, 0x0225 }, | ||
97 | { 0x3033, 0x1e00 }, | ||
98 | { 0x3034, 0x0225 }, | ||
99 | { 0x3035, 0x1f00 }, | ||
100 | { 0x3036, 0x6225 }, | ||
101 | { 0x3037, 0xf800 }, | ||
102 | { 0x3038, 0x0000 }, | ||
103 | { 0x3039, 0xf000 }, | ||
104 | { 0x303a, 0x0000 }, | ||
105 | { 0x303b, 0xf000 }, | ||
106 | { 0x303c, 0x0000 }, | ||
107 | { 0x303d, 0xf000 }, | ||
108 | { 0x303e, 0x0000 }, | ||
109 | { 0x303f, 0xf000 }, | ||
110 | { 0x3040, 0x2226 }, | ||
111 | { 0x3041, 0x3a03 }, | ||
112 | { 0x3042, 0x0226 }, | ||
113 | { 0x3043, 0x0801 }, | ||
114 | { 0x3044, 0x6249 }, | ||
115 | { 0x3045, 0x0c06 }, | ||
116 | { 0x3046, 0x0226 }, | ||
117 | { 0x3047, 0x5901 }, | ||
118 | { 0x3048, 0xe249 }, | ||
119 | { 0x3049, 0x030d }, | ||
120 | { 0x304a, 0x0249 }, | ||
121 | { 0x304b, 0x2c01 }, | ||
122 | { 0x304c, 0xe249 }, | ||
123 | { 0x304d, 0x4342 }, | ||
124 | { 0x304e, 0xe249 }, | ||
125 | { 0x304f, 0x73c0 }, | ||
126 | { 0x3050, 0x4249 }, | ||
127 | { 0x3051, 0x0c00 }, | ||
128 | { 0x3052, 0x0226 }, | ||
129 | { 0x3053, 0x1f01 }, | ||
130 | { 0x3054, 0x0226 }, | ||
131 | { 0x3055, 0x1e01 }, | ||
132 | { 0x3056, 0x0226 }, | ||
133 | { 0x3057, 0xfa00 }, | ||
134 | { 0x3058, 0x0000 }, | ||
135 | { 0x3059, 0xf000 }, | ||
136 | { 0x305a, 0x0000 }, | ||
137 | { 0x305b, 0xf000 }, | ||
138 | { 0x305c, 0x0000 }, | ||
139 | { 0x305d, 0xf000 }, | ||
140 | { 0x305e, 0x0000 }, | ||
141 | { 0x305f, 0xf000 }, | ||
142 | { 0x3060, 0x0000 }, | ||
143 | { 0x3061, 0xf000 }, | ||
144 | { 0x3062, 0x0000 }, | ||
145 | { 0x3063, 0xf000 }, | ||
146 | { 0x3064, 0x0000 }, | ||
147 | { 0x3065, 0xf000 }, | ||
148 | { 0x3066, 0x0000 }, | ||
149 | { 0x3067, 0xf000 }, | ||
150 | { 0x3068, 0x0000 }, | ||
151 | { 0x3069, 0xf000 }, | ||
152 | { 0x306a, 0x0000 }, | ||
153 | { 0x306b, 0xf000 }, | ||
154 | { 0x306c, 0x0000 }, | ||
155 | { 0x306d, 0xf000 }, | ||
156 | { 0x306e, 0x0000 }, | ||
157 | { 0x306f, 0xf000 }, | ||
158 | { 0x3070, 0x0226 }, | ||
159 | { 0x3071, 0x1a01 }, | ||
160 | { 0x3072, 0x0226 }, | ||
161 | { 0x3073, 0x1e00 }, | ||
162 | { 0x3074, 0x0226 }, | ||
163 | { 0x3075, 0x1f00 }, | ||
164 | { 0x3076, 0x6226 }, | ||
165 | { 0x3077, 0xf800 }, | ||
166 | { 0x3078, 0x0000 }, | ||
167 | { 0x3079, 0xf000 }, | ||
168 | { 0x307a, 0x0000 }, | ||
169 | { 0x307b, 0xf000 }, | ||
170 | { 0x307c, 0x0000 }, | ||
171 | { 0x307d, 0xf000 }, | ||
172 | { 0x307e, 0x0000 }, | ||
173 | { 0x307f, 0xf000 }, | ||
174 | { 0x3080, 0x2227 }, | ||
175 | { 0x3081, 0x3a03 }, | ||
176 | { 0x3082, 0x0227 }, | ||
177 | { 0x3083, 0x0801 }, | ||
178 | { 0x3084, 0x6255 }, | ||
179 | { 0x3085, 0x0c04 }, | ||
180 | { 0x3086, 0x0227 }, | ||
181 | { 0x3087, 0x5901 }, | ||
182 | { 0x3088, 0xe255 }, | ||
183 | { 0x3089, 0x030d }, | ||
184 | { 0x308a, 0x0255 }, | ||
185 | { 0x308b, 0x2c01 }, | ||
186 | { 0x308c, 0xe255 }, | ||
187 | { 0x308d, 0x4342 }, | ||
188 | { 0x308e, 0xe255 }, | ||
189 | { 0x308f, 0x73c0 }, | ||
190 | { 0x3090, 0x4255 }, | ||
191 | { 0x3091, 0x0c00 }, | ||
192 | { 0x3092, 0x0227 }, | ||
193 | { 0x3093, 0x1f01 }, | ||
194 | { 0x3094, 0x0227 }, | ||
195 | { 0x3095, 0x1e01 }, | ||
196 | { 0x3096, 0x0227 }, | ||
197 | { 0x3097, 0xfa00 }, | ||
198 | { 0x3098, 0x0000 }, | ||
199 | { 0x3099, 0xf000 }, | ||
200 | { 0x309a, 0x0000 }, | ||
201 | { 0x309b, 0xf000 }, | ||
202 | { 0x309c, 0x0000 }, | ||
203 | { 0x309d, 0xf000 }, | ||
204 | { 0x309e, 0x0000 }, | ||
205 | { 0x309f, 0xf000 }, | ||
206 | { 0x30a0, 0x0000 }, | ||
207 | { 0x30a1, 0xf000 }, | ||
208 | { 0x30a2, 0x0000 }, | ||
209 | { 0x30a3, 0xf000 }, | ||
210 | { 0x30a4, 0x0000 }, | ||
211 | { 0x30a5, 0xf000 }, | ||
212 | { 0x30a6, 0x0000 }, | ||
213 | { 0x30a7, 0xf000 }, | ||
214 | { 0x30a8, 0x0000 }, | ||
215 | { 0x30a9, 0xf000 }, | ||
216 | { 0x30aa, 0x0000 }, | ||
217 | { 0x30ab, 0xf000 }, | ||
218 | { 0x30ac, 0x0000 }, | ||
219 | { 0x30ad, 0xf000 }, | ||
220 | { 0x30ae, 0x0000 }, | ||
221 | { 0x30af, 0xf000 }, | ||
222 | { 0x30b0, 0x0227 }, | ||
223 | { 0x30b1, 0x1a01 }, | ||
224 | { 0x30b2, 0x0227 }, | ||
225 | { 0x30b3, 0x1e00 }, | ||
226 | { 0x30b4, 0x0227 }, | ||
227 | { 0x30b5, 0x1f00 }, | ||
228 | { 0x30b6, 0x6227 }, | ||
229 | { 0x30b7, 0xf800 }, | ||
230 | { 0x30b8, 0x0000 }, | ||
231 | { 0x30b9, 0xf000 }, | ||
232 | { 0x30ba, 0x0000 }, | ||
233 | { 0x30bb, 0xf000 }, | ||
234 | { 0x30bc, 0x0000 }, | ||
235 | { 0x30bd, 0xf000 }, | ||
236 | { 0x30be, 0x0000 }, | ||
237 | { 0x30bf, 0xf000 }, | ||
238 | { 0x30c0, 0x2228 }, | ||
239 | { 0x30c1, 0x3a03 }, | ||
240 | { 0x30c2, 0x0228 }, | ||
241 | { 0x30c3, 0x0801 }, | ||
242 | { 0x30c4, 0x6255 }, | ||
243 | { 0x30c5, 0x0c06 }, | ||
244 | { 0x30c6, 0x0228 }, | ||
245 | { 0x30c7, 0x5901 }, | ||
246 | { 0x30c8, 0xe255 }, | ||
247 | { 0x30c9, 0x030d }, | ||
248 | { 0x30ca, 0x0255 }, | ||
249 | { 0x30cb, 0x2c01 }, | ||
250 | { 0x30cc, 0xe255 }, | ||
251 | { 0x30cd, 0x4342 }, | ||
252 | { 0x30ce, 0xe255 }, | ||
253 | { 0x30cf, 0x73c0 }, | ||
254 | { 0x30d0, 0x4255 }, | ||
255 | { 0x30d1, 0x0c00 }, | ||
256 | { 0x30d2, 0x0228 }, | ||
257 | { 0x30d3, 0x1f01 }, | ||
258 | { 0x30d4, 0x0228 }, | ||
259 | { 0x30d5, 0x1e01 }, | ||
260 | { 0x30d6, 0x0228 }, | ||
261 | { 0x30d7, 0xfa00 }, | ||
262 | { 0x30d8, 0x0000 }, | ||
263 | { 0x30d9, 0xf000 }, | ||
264 | { 0x30da, 0x0000 }, | ||
265 | { 0x30db, 0xf000 }, | ||
266 | { 0x30dc, 0x0000 }, | ||
267 | { 0x30dd, 0xf000 }, | ||
268 | { 0x30de, 0x0000 }, | ||
269 | { 0x30df, 0xf000 }, | ||
270 | { 0x30e0, 0x0000 }, | ||
271 | { 0x30e1, 0xf000 }, | ||
272 | { 0x30e2, 0x0000 }, | ||
273 | { 0x30e3, 0xf000 }, | ||
274 | { 0x30e4, 0x0000 }, | ||
275 | { 0x30e5, 0xf000 }, | ||
276 | { 0x30e6, 0x0000 }, | ||
277 | { 0x30e7, 0xf000 }, | ||
278 | { 0x30e8, 0x0000 }, | ||
279 | { 0x30e9, 0xf000 }, | ||
280 | { 0x30ea, 0x0000 }, | ||
281 | { 0x30eb, 0xf000 }, | ||
282 | { 0x30ec, 0x0000 }, | ||
283 | { 0x30ed, 0xf000 }, | ||
284 | { 0x30ee, 0x0000 }, | ||
285 | { 0x30ef, 0xf000 }, | ||
286 | { 0x30f0, 0x0228 }, | ||
287 | { 0x30f1, 0x1a01 }, | ||
288 | { 0x30f2, 0x0228 }, | ||
289 | { 0x30f3, 0x1e00 }, | ||
290 | { 0x30f4, 0x0228 }, | ||
291 | { 0x30f5, 0x1f00 }, | ||
292 | { 0x30f6, 0x6228 }, | ||
293 | { 0x30f7, 0xf800 }, | ||
294 | { 0x30f8, 0x0000 }, | ||
295 | { 0x30f9, 0xf000 }, | ||
296 | { 0x30fa, 0x0000 }, | ||
297 | { 0x30fb, 0xf000 }, | ||
298 | { 0x30fc, 0x0000 }, | ||
299 | { 0x30fd, 0xf000 }, | ||
300 | { 0x30fe, 0x0000 }, | ||
301 | { 0x30ff, 0xf000 }, | ||
302 | { 0x3100, 0x222b }, | ||
303 | { 0x3101, 0x3a03 }, | ||
304 | { 0x3102, 0x222b }, | ||
305 | { 0x3103, 0x5803 }, | ||
306 | { 0x3104, 0xe26f }, | ||
307 | { 0x3105, 0x030d }, | ||
308 | { 0x3106, 0x626f }, | ||
309 | { 0x3107, 0x2c01 }, | ||
310 | { 0x3108, 0xe26f }, | ||
311 | { 0x3109, 0x4342 }, | ||
312 | { 0x310a, 0xe26f }, | ||
313 | { 0x310b, 0x73c0 }, | ||
314 | { 0x310c, 0x026f }, | ||
315 | { 0x310d, 0x0c00 }, | ||
316 | { 0x310e, 0x022b }, | ||
317 | { 0x310f, 0x1f01 }, | ||
318 | { 0x3110, 0x022b }, | ||
319 | { 0x3111, 0x1e01 }, | ||
320 | { 0x3112, 0x022b }, | ||
321 | { 0x3113, 0xfa00 }, | ||
322 | { 0x3114, 0x0000 }, | ||
323 | { 0x3115, 0xf000 }, | ||
324 | { 0x3116, 0x0000 }, | ||
325 | { 0x3117, 0xf000 }, | ||
326 | { 0x3118, 0x0000 }, | ||
327 | { 0x3119, 0xf000 }, | ||
328 | { 0x311a, 0x0000 }, | ||
329 | { 0x311b, 0xf000 }, | ||
330 | { 0x311c, 0x0000 }, | ||
331 | { 0x311d, 0xf000 }, | ||
332 | { 0x311e, 0x0000 }, | ||
333 | { 0x311f, 0xf000 }, | ||
334 | { 0x3120, 0x022b }, | ||
335 | { 0x3121, 0x0a01 }, | ||
336 | { 0x3122, 0x022b }, | ||
337 | { 0x3123, 0x1e00 }, | ||
338 | { 0x3124, 0x022b }, | ||
339 | { 0x3125, 0x1f00 }, | ||
340 | { 0x3126, 0x622b }, | ||
341 | { 0x3127, 0xf800 }, | ||
342 | { 0x3128, 0x0000 }, | ||
343 | { 0x3129, 0xf000 }, | ||
344 | { 0x312a, 0x0000 }, | ||
345 | { 0x312b, 0xf000 }, | ||
346 | { 0x312c, 0x0000 }, | ||
347 | { 0x312d, 0xf000 }, | ||
348 | { 0x312e, 0x0000 }, | ||
349 | { 0x312f, 0xf000 }, | ||
350 | { 0x3130, 0x0000 }, | ||
351 | { 0x3131, 0xf000 }, | ||
352 | { 0x3132, 0x0000 }, | ||
353 | { 0x3133, 0xf000 }, | ||
354 | { 0x3134, 0x0000 }, | ||
355 | { 0x3135, 0xf000 }, | ||
356 | { 0x3136, 0x0000 }, | ||
357 | { 0x3137, 0xf000 }, | ||
358 | { 0x3138, 0x0000 }, | ||
359 | { 0x3139, 0xf000 }, | ||
360 | { 0x313a, 0x0000 }, | ||
361 | { 0x313b, 0xf000 }, | ||
362 | { 0x313c, 0x0000 }, | ||
363 | { 0x313d, 0xf000 }, | ||
364 | { 0x313e, 0x0000 }, | ||
365 | { 0x313f, 0xf000 }, | ||
366 | { 0x3140, 0x0000 }, | ||
367 | { 0x3141, 0xf000 }, | ||
368 | { 0x3142, 0x0000 }, | ||
369 | { 0x3143, 0xf000 }, | ||
370 | { 0x3144, 0x0000 }, | ||
371 | { 0x3145, 0xf000 }, | ||
372 | { 0x3146, 0x0000 }, | ||
373 | { 0x3147, 0xf000 }, | ||
374 | { 0x3148, 0x0000 }, | ||
375 | { 0x3149, 0xf000 }, | ||
376 | { 0x314a, 0x0000 }, | ||
377 | { 0x314b, 0xf000 }, | ||
378 | { 0x314c, 0x0000 }, | ||
379 | { 0x314d, 0xf000 }, | ||
380 | { 0x314e, 0x0000 }, | ||
381 | { 0x314f, 0xf000 }, | ||
382 | { 0x3150, 0x0000 }, | ||
383 | { 0x3151, 0xf000 }, | ||
384 | { 0x3152, 0x0000 }, | ||
385 | { 0x3153, 0xf000 }, | ||
386 | { 0x3154, 0x0000 }, | ||
387 | { 0x3155, 0xf000 }, | ||
388 | { 0x3156, 0x0000 }, | ||
389 | { 0x3157, 0xf000 }, | ||
390 | { 0x3158, 0x0000 }, | ||
391 | { 0x3159, 0xf000 }, | ||
392 | { 0x315a, 0x0000 }, | ||
393 | { 0x315b, 0xf000 }, | ||
394 | { 0x315c, 0x0000 }, | ||
395 | { 0x315d, 0xf000 }, | ||
396 | { 0x315e, 0x0000 }, | ||
397 | { 0x315f, 0xf000 }, | ||
398 | { 0x3160, 0x0000 }, | ||
399 | { 0x3161, 0xf000 }, | ||
400 | { 0x3162, 0x0000 }, | ||
401 | { 0x3163, 0xf000 }, | ||
402 | { 0x3164, 0x0000 }, | ||
403 | { 0x3165, 0xf000 }, | ||
404 | { 0x3166, 0x0000 }, | ||
405 | { 0x3167, 0xf000 }, | ||
406 | { 0x3168, 0x0000 }, | ||
407 | { 0x3169, 0xf000 }, | ||
408 | { 0x316a, 0x0000 }, | ||
409 | { 0x316b, 0xf000 }, | ||
410 | { 0x316c, 0x0000 }, | ||
411 | { 0x316d, 0xf000 }, | ||
412 | { 0x316e, 0x0000 }, | ||
413 | { 0x316f, 0xf000 }, | ||
414 | { 0x3170, 0x0000 }, | ||
415 | { 0x3171, 0xf000 }, | ||
416 | { 0x3172, 0x0000 }, | ||
417 | { 0x3173, 0xf000 }, | ||
418 | { 0x3174, 0x0000 }, | ||
419 | { 0x3175, 0xf000 }, | ||
420 | { 0x3176, 0x0000 }, | ||
421 | { 0x3177, 0xf000 }, | ||
422 | { 0x3178, 0x0000 }, | ||
423 | { 0x3179, 0xf000 }, | ||
424 | { 0x317a, 0x0000 }, | ||
425 | { 0x317b, 0xf000 }, | ||
426 | { 0x317c, 0x0000 }, | ||
427 | { 0x317d, 0xf000 }, | ||
428 | { 0x317e, 0x0000 }, | ||
429 | { 0x317f, 0xf000 }, | ||
430 | { 0x3180, 0x2001 }, | ||
431 | { 0x3181, 0xf101 }, | ||
432 | { 0x3182, 0x0000 }, | ||
433 | { 0x3183, 0xf000 }, | ||
434 | { 0x3184, 0x0000 }, | ||
435 | { 0x3185, 0xf000 }, | ||
436 | { 0x3186, 0x0000 }, | ||
437 | { 0x3187, 0xf000 }, | ||
438 | { 0x3188, 0x0000 }, | ||
439 | { 0x3189, 0xf000 }, | ||
440 | { 0x318a, 0x0000 }, | ||
441 | { 0x318b, 0xf000 }, | ||
442 | { 0x318c, 0x0000 }, | ||
443 | { 0x318d, 0xf000 }, | ||
444 | { 0x318e, 0x0000 }, | ||
445 | { 0x318f, 0xf000 }, | ||
446 | { 0x3190, 0x0000 }, | ||
447 | { 0x3191, 0xf000 }, | ||
448 | { 0x3192, 0x0000 }, | ||
449 | { 0x3193, 0xf000 }, | ||
450 | { 0x3194, 0x0000 }, | ||
451 | { 0x3195, 0xf000 }, | ||
452 | { 0x3196, 0x0000 }, | ||
453 | { 0x3197, 0xf000 }, | ||
454 | { 0x3198, 0x0000 }, | ||
455 | { 0x3199, 0xf000 }, | ||
456 | { 0x319a, 0x0000 }, | ||
457 | { 0x319b, 0xf000 }, | ||
458 | { 0x319c, 0x0000 }, | ||
459 | { 0x319d, 0xf000 }, | ||
460 | { 0x319e, 0x0000 }, | ||
461 | { 0x319f, 0xf000 }, | ||
462 | { 0x31a0, 0x0000 }, | ||
463 | { 0x31a1, 0xf000 }, | ||
464 | { 0x31a2, 0x0000 }, | ||
465 | { 0x31a3, 0xf000 }, | ||
466 | { 0x31a4, 0x0000 }, | ||
467 | { 0x31a5, 0xf000 }, | ||
468 | { 0x31a6, 0x0000 }, | ||
469 | { 0x31a7, 0xf000 }, | ||
470 | { 0x31a8, 0x0000 }, | ||
471 | { 0x31a9, 0xf000 }, | ||
472 | { 0x31aa, 0x0000 }, | ||
473 | { 0x31ab, 0xf000 }, | ||
474 | { 0x31ac, 0x0000 }, | ||
475 | { 0x31ad, 0xf000 }, | ||
476 | { 0x31ae, 0x0000 }, | ||
477 | { 0x31af, 0xf000 }, | ||
478 | { 0x31b0, 0x0000 }, | ||
479 | { 0x31b1, 0xf000 }, | ||
480 | { 0x31b2, 0x0000 }, | ||
481 | { 0x31b3, 0xf000 }, | ||
482 | { 0x31b4, 0x0000 }, | ||
483 | { 0x31b5, 0xf000 }, | ||
484 | { 0x31b6, 0x0000 }, | ||
485 | { 0x31b7, 0xf000 }, | ||
486 | { 0x31b8, 0x0000 }, | ||
487 | { 0x31b9, 0xf000 }, | ||
488 | { 0x31ba, 0x0000 }, | ||
489 | { 0x31bb, 0xf000 }, | ||
490 | { 0x31bc, 0x0000 }, | ||
491 | { 0x31bd, 0xf000 }, | ||
492 | { 0x31be, 0x0000 }, | ||
493 | { 0x31bf, 0xf000 }, | ||
494 | { 0x31c0, 0x0000 }, | ||
495 | { 0x31c1, 0xf000 }, | ||
496 | { 0x31c2, 0x0000 }, | ||
497 | { 0x31c3, 0xf000 }, | ||
498 | { 0x31c4, 0x0000 }, | ||
499 | { 0x31c5, 0xf000 }, | ||
500 | { 0x31c6, 0x0000 }, | ||
501 | { 0x31c7, 0xf000 }, | ||
502 | { 0x31c8, 0x0000 }, | ||
503 | { 0x31c9, 0xf000 }, | ||
504 | { 0x31ca, 0x0000 }, | ||
505 | { 0x31cb, 0xf000 }, | ||
506 | { 0x31cc, 0x0000 }, | ||
507 | { 0x31cd, 0xf000 }, | ||
508 | { 0x31ce, 0x0000 }, | ||
509 | { 0x31cf, 0xf000 }, | ||
510 | { 0x31d0, 0x0000 }, | ||
511 | { 0x31d1, 0xf000 }, | ||
512 | { 0x31d2, 0x0000 }, | ||
513 | { 0x31d3, 0xf000 }, | ||
514 | { 0x31d4, 0x0000 }, | ||
515 | { 0x31d5, 0xf000 }, | ||
516 | { 0x31d6, 0x0000 }, | ||
517 | { 0x31d7, 0xf000 }, | ||
518 | { 0x31d8, 0x0000 }, | ||
519 | { 0x31d9, 0xf000 }, | ||
520 | { 0x31da, 0x0000 }, | ||
521 | { 0x31db, 0xf000 }, | ||
522 | { 0x31dc, 0x0000 }, | ||
523 | { 0x31dd, 0xf000 }, | ||
524 | { 0x31de, 0x0000 }, | ||
525 | { 0x31df, 0xf000 }, | ||
526 | { 0x31e0, 0x0000 }, | ||
527 | { 0x31e1, 0xf000 }, | ||
528 | { 0x31e2, 0x0000 }, | ||
529 | { 0x31e3, 0xf000 }, | ||
530 | { 0x31e4, 0x0000 }, | ||
531 | { 0x31e5, 0xf000 }, | ||
532 | { 0x31e6, 0x0000 }, | ||
533 | { 0x31e7, 0xf000 }, | ||
534 | { 0x31e8, 0x0000 }, | ||
535 | { 0x31e9, 0xf000 }, | ||
536 | { 0x31ea, 0x0000 }, | ||
537 | { 0x31eb, 0xf000 }, | ||
538 | { 0x31ec, 0x0000 }, | ||
539 | { 0x31ed, 0xf000 }, | ||
540 | { 0x31ee, 0x0000 }, | ||
541 | { 0x31ef, 0xf000 }, | ||
542 | { 0x31f0, 0x0000 }, | ||
543 | { 0x31f1, 0xf000 }, | ||
544 | { 0x31f2, 0x0000 }, | ||
545 | { 0x31f3, 0xf000 }, | ||
546 | { 0x31f4, 0x0000 }, | ||
547 | { 0x31f5, 0xf000 }, | ||
548 | { 0x31f6, 0x0000 }, | ||
549 | { 0x31f7, 0xf000 }, | ||
550 | { 0x31f8, 0x0000 }, | ||
551 | { 0x31f9, 0xf000 }, | ||
552 | { 0x31fa, 0x0000 }, | ||
553 | { 0x31fb, 0xf000 }, | ||
554 | { 0x31fc, 0x0000 }, | ||
555 | { 0x31fd, 0xf000 }, | ||
556 | { 0x31fe, 0x0000 }, | ||
557 | { 0x31ff, 0xf000 }, | ||
558 | { 0x024d, 0xff50 }, | ||
559 | { 0x0252, 0xff50 }, | ||
560 | { 0x0259, 0x0112 }, | ||
561 | { 0x025e, 0x0112 }, | ||
562 | }; | ||
563 | |||
564 | static int wm5102_sysclk_ev(struct snd_soc_dapm_widget *w, | ||
565 | struct snd_kcontrol *kcontrol, int event) | ||
566 | { | ||
567 | struct snd_soc_codec *codec = w->codec; | ||
568 | struct arizona *arizona = dev_get_drvdata(codec->dev); | ||
569 | struct regmap *regmap = codec->control_data; | ||
570 | const struct reg_default *patch = NULL; | ||
571 | int i, patch_size; | ||
572 | |||
573 | switch (arizona->rev) { | ||
574 | case 0: | ||
575 | patch = wm5102_sysclk_reva_patch; | ||
576 | patch_size = ARRAY_SIZE(wm5102_sysclk_reva_patch); | ||
577 | break; | ||
578 | } | ||
579 | |||
580 | switch (event) { | ||
581 | case SND_SOC_DAPM_POST_PMU: | ||
582 | if (patch) | ||
583 | for (i = 0; i < patch_size; i++) | ||
584 | regmap_write(regmap, patch[i].reg, | ||
585 | patch[i].def); | ||
586 | break; | ||
587 | |||
588 | default: | ||
589 | break; | ||
590 | } | ||
591 | |||
592 | return 0; | ||
593 | } | ||
594 | |||
45 | static const struct snd_kcontrol_new wm5102_snd_controls[] = { | 595 | static const struct snd_kcontrol_new wm5102_snd_controls[] = { |
46 | SOC_SINGLE("IN1 High Performance Switch", ARIZONA_IN1L_CONTROL, | 596 | SOC_SINGLE("IN1 High Performance Switch", ARIZONA_IN1L_CONTROL, |
47 | ARIZONA_IN1_OSR_SHIFT, 1, 0), | 597 | ARIZONA_IN1_OSR_SHIFT, 1, 0), |
@@ -297,7 +847,7 @@ static const struct snd_kcontrol_new wm5102_aec_loopback_mux = | |||
297 | 847 | ||
298 | static const struct snd_soc_dapm_widget wm5102_dapm_widgets[] = { | 848 | static const struct snd_soc_dapm_widget wm5102_dapm_widgets[] = { |
299 | SND_SOC_DAPM_SUPPLY("SYSCLK", ARIZONA_SYSTEM_CLOCK_1, ARIZONA_SYSCLK_ENA_SHIFT, | 849 | SND_SOC_DAPM_SUPPLY("SYSCLK", ARIZONA_SYSTEM_CLOCK_1, ARIZONA_SYSCLK_ENA_SHIFT, |
300 | 0, NULL, 0), | 850 | 0, wm5102_sysclk_ev, SND_SOC_DAPM_POST_PMU), |
301 | SND_SOC_DAPM_SUPPLY("ASYNCCLK", ARIZONA_ASYNC_CLOCK_1, | 851 | SND_SOC_DAPM_SUPPLY("ASYNCCLK", ARIZONA_ASYNC_CLOCK_1, |
302 | ARIZONA_ASYNC_CLK_ENA_SHIFT, 0, NULL, 0), | 852 | ARIZONA_ASYNC_CLK_ENA_SHIFT, 0, NULL, 0), |
303 | SND_SOC_DAPM_SUPPLY("OPCLK", ARIZONA_OUTPUT_SYSTEM_CLOCK, | 853 | SND_SOC_DAPM_SUPPLY("OPCLK", ARIZONA_OUTPUT_SYSTEM_CLOCK, |
diff --git a/sound/soc/codecs/wm8978.c b/sound/soc/codecs/wm8978.c index 5421fd9fbcb5..4c0a8e496131 100644 --- a/sound/soc/codecs/wm8978.c +++ b/sound/soc/codecs/wm8978.c | |||
@@ -782,7 +782,7 @@ static int wm8978_hw_params(struct snd_pcm_substream *substream, | |||
782 | wm8978->mclk_idx = -1; | 782 | wm8978->mclk_idx = -1; |
783 | f_sel = wm8978->f_mclk; | 783 | f_sel = wm8978->f_mclk; |
784 | } else { | 784 | } else { |
785 | if (!wm8978->f_pllout) { | 785 | if (!wm8978->f_opclk) { |
786 | /* We only enter here, if OPCLK is not used */ | 786 | /* We only enter here, if OPCLK is not used */ |
787 | int ret = wm8978_configure_pll(codec); | 787 | int ret = wm8978_configure_pll(codec); |
788 | if (ret < 0) | 788 | if (ret < 0) |
diff --git a/sound/soc/mxs/mxs-saif.c b/sound/soc/mxs/mxs-saif.c index aa037b292f3d..c294fbb523fc 100644 --- a/sound/soc/mxs/mxs-saif.c +++ b/sound/soc/mxs/mxs-saif.c | |||
@@ -523,16 +523,24 @@ static int mxs_saif_trigger(struct snd_pcm_substream *substream, int cmd, | |||
523 | 523 | ||
524 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { | 524 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { |
525 | /* | 525 | /* |
526 | * write a data to saif data register to trigger | 526 | * write data to saif data register to trigger |
527 | * the transfer | 527 | * the transfer. |
528 | * For 24-bit format the 32-bit FIFO register stores | ||
529 | * only one channel, so we need to write twice. | ||
530 | * This is also safe for the other non 24-bit formats. | ||
528 | */ | 531 | */ |
529 | __raw_writel(0, saif->base + SAIF_DATA); | 532 | __raw_writel(0, saif->base + SAIF_DATA); |
533 | __raw_writel(0, saif->base + SAIF_DATA); | ||
530 | } else { | 534 | } else { |
531 | /* | 535 | /* |
532 | * read a data from saif data register to trigger | 536 | * read data from saif data register to trigger |
533 | * the receive | 537 | * the receive. |
538 | * For 24-bit format the 32-bit FIFO register stores | ||
539 | * only one channel, so we need to read twice. | ||
540 | * This is also safe for the other non 24-bit formats. | ||
534 | */ | 541 | */ |
535 | __raw_readl(saif->base + SAIF_DATA); | 542 | __raw_readl(saif->base + SAIF_DATA); |
543 | __raw_readl(saif->base + SAIF_DATA); | ||
536 | } | 544 | } |
537 | 545 | ||
538 | master_saif->ongoing = 1; | 546 | master_saif->ongoing = 1; |
@@ -812,3 +820,4 @@ module_platform_driver(mxs_saif_driver); | |||
812 | MODULE_AUTHOR("Freescale Semiconductor, Inc."); | 820 | MODULE_AUTHOR("Freescale Semiconductor, Inc."); |
813 | MODULE_DESCRIPTION("MXS ASoC SAIF driver"); | 821 | MODULE_DESCRIPTION("MXS ASoC SAIF driver"); |
814 | MODULE_LICENSE("GPL"); | 822 | MODULE_LICENSE("GPL"); |
823 | MODULE_ALIAS("platform:mxs-saif"); | ||
diff --git a/sound/soc/samsung/Kconfig b/sound/soc/samsung/Kconfig index e7b83179aca2..3c7c3a59ed39 100644 --- a/sound/soc/samsung/Kconfig +++ b/sound/soc/samsung/Kconfig | |||
@@ -207,6 +207,8 @@ config SND_SOC_BELLS | |||
207 | select SND_SOC_WM5102 | 207 | select SND_SOC_WM5102 |
208 | select SND_SOC_WM5110 | 208 | select SND_SOC_WM5110 |
209 | select SND_SOC_WM9081 | 209 | select SND_SOC_WM9081 |
210 | select SND_SOC_WM0010 | ||
211 | select SND_SOC_WM1250_EV1 | ||
210 | 212 | ||
211 | config SND_SOC_LOWLAND | 213 | config SND_SOC_LOWLAND |
212 | tristate "Audio support for Wolfson Lowland" | 214 | tristate "Audio support for Wolfson Lowland" |
diff --git a/sound/soc/samsung/bells.c b/sound/soc/samsung/bells.c index b0d46d63d55e..b56b9a3c6169 100644 --- a/sound/soc/samsung/bells.c +++ b/sound/soc/samsung/bells.c | |||
@@ -247,7 +247,7 @@ static struct snd_soc_dai_link bells_dai_wm5110[] = { | |||
247 | { | 247 | { |
248 | .name = "Sub", | 248 | .name = "Sub", |
249 | .stream_name = "Sub", | 249 | .stream_name = "Sub", |
250 | .cpu_dai_name = "wm5110-aif3", | 250 | .cpu_dai_name = "wm5102-aif3", |
251 | .codec_dai_name = "wm9081-hifi", | 251 | .codec_dai_name = "wm9081-hifi", |
252 | .codec_name = "wm9081.1-006c", | 252 | .codec_name = "wm9081.1-006c", |
253 | .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | 253 | .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index d1198627fc40..10d21be383f6 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c | |||
@@ -2786,8 +2786,9 @@ int snd_soc_put_volsw_sx(struct snd_kcontrol *kcontrol, | |||
2786 | val = (ucontrol->value.integer.value[0] + min) & mask; | 2786 | val = (ucontrol->value.integer.value[0] + min) & mask; |
2787 | val = val << shift; | 2787 | val = val << shift; |
2788 | 2788 | ||
2789 | if (snd_soc_update_bits_locked(codec, reg, val_mask, val)) | 2789 | err = snd_soc_update_bits_locked(codec, reg, val_mask, val); |
2790 | return err; | 2790 | if (err < 0) |
2791 | return err; | ||
2791 | 2792 | ||
2792 | if (snd_soc_volsw_is_stereo(mc)) { | 2793 | if (snd_soc_volsw_is_stereo(mc)) { |
2793 | val_mask = mask << rshift; | 2794 | val_mask = mask << rshift; |
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c index d0a4be38dc0f..6e35bcae02df 100644 --- a/sound/soc/soc-dapm.c +++ b/sound/soc/soc-dapm.c | |||
@@ -3745,7 +3745,7 @@ void snd_soc_dapm_shutdown(struct snd_soc_card *card) | |||
3745 | { | 3745 | { |
3746 | struct snd_soc_codec *codec; | 3746 | struct snd_soc_codec *codec; |
3747 | 3747 | ||
3748 | list_for_each_entry(codec, &card->codec_dev_list, list) { | 3748 | list_for_each_entry(codec, &card->codec_dev_list, card_list) { |
3749 | soc_dapm_shutdown_codec(&codec->dapm); | 3749 | soc_dapm_shutdown_codec(&codec->dapm); |
3750 | if (codec->dapm.bias_level == SND_SOC_BIAS_STANDBY) | 3750 | if (codec->dapm.bias_level == SND_SOC_BIAS_STANDBY) |
3751 | snd_soc_dapm_set_bias_level(&codec->dapm, | 3751 | snd_soc_dapm_set_bias_level(&codec->dapm, |
diff --git a/sound/usb/card.c b/sound/usb/card.c index 282f0fc9fed1..dbf7999d18b4 100644 --- a/sound/usb/card.c +++ b/sound/usb/card.c | |||
@@ -559,9 +559,11 @@ static void snd_usb_audio_disconnect(struct usb_device *dev, | |||
559 | return; | 559 | return; |
560 | 560 | ||
561 | card = chip->card; | 561 | card = chip->card; |
562 | mutex_lock(®ister_mutex); | ||
563 | down_write(&chip->shutdown_rwsem); | 562 | down_write(&chip->shutdown_rwsem); |
564 | chip->shutdown = 1; | 563 | chip->shutdown = 1; |
564 | up_write(&chip->shutdown_rwsem); | ||
565 | |||
566 | mutex_lock(®ister_mutex); | ||
565 | chip->num_interfaces--; | 567 | chip->num_interfaces--; |
566 | if (chip->num_interfaces <= 0) { | 568 | if (chip->num_interfaces <= 0) { |
567 | snd_card_disconnect(card); | 569 | snd_card_disconnect(card); |
@@ -582,11 +584,9 @@ static void snd_usb_audio_disconnect(struct usb_device *dev, | |||
582 | snd_usb_mixer_disconnect(p); | 584 | snd_usb_mixer_disconnect(p); |
583 | } | 585 | } |
584 | usb_chip[chip->index] = NULL; | 586 | usb_chip[chip->index] = NULL; |
585 | up_write(&chip->shutdown_rwsem); | ||
586 | mutex_unlock(®ister_mutex); | 587 | mutex_unlock(®ister_mutex); |
587 | snd_card_free_when_closed(card); | 588 | snd_card_free_when_closed(card); |
588 | } else { | 589 | } else { |
589 | up_write(&chip->shutdown_rwsem); | ||
590 | mutex_unlock(®ister_mutex); | 590 | mutex_unlock(®ister_mutex); |
591 | } | 591 | } |
592 | } | 592 | } |
diff --git a/tools/power/x86/turbostat/turbostat.c b/tools/power/x86/turbostat/turbostat.c index 2655ae9a3ad8..ea095abbe97e 100644 --- a/tools/power/x86/turbostat/turbostat.c +++ b/tools/power/x86/turbostat/turbostat.c | |||
@@ -206,8 +206,10 @@ int get_msr(int cpu, off_t offset, unsigned long long *msr) | |||
206 | retval = pread(fd, msr, sizeof *msr, offset); | 206 | retval = pread(fd, msr, sizeof *msr, offset); |
207 | close(fd); | 207 | close(fd); |
208 | 208 | ||
209 | if (retval != sizeof *msr) | 209 | if (retval != sizeof *msr) { |
210 | fprintf(stderr, "%s offset 0x%zx read failed\n", pathname, offset); | ||
210 | return -1; | 211 | return -1; |
212 | } | ||
211 | 213 | ||
212 | return 0; | 214 | return 0; |
213 | } | 215 | } |
@@ -1101,7 +1103,9 @@ void turbostat_loop() | |||
1101 | 1103 | ||
1102 | restart: | 1104 | restart: |
1103 | retval = for_all_cpus(get_counters, EVEN_COUNTERS); | 1105 | retval = for_all_cpus(get_counters, EVEN_COUNTERS); |
1104 | if (retval) { | 1106 | if (retval < -1) { |
1107 | exit(retval); | ||
1108 | } else if (retval == -1) { | ||
1105 | re_initialize(); | 1109 | re_initialize(); |
1106 | goto restart; | 1110 | goto restart; |
1107 | } | 1111 | } |
@@ -1114,7 +1118,9 @@ restart: | |||
1114 | } | 1118 | } |
1115 | sleep(interval_sec); | 1119 | sleep(interval_sec); |
1116 | retval = for_all_cpus(get_counters, ODD_COUNTERS); | 1120 | retval = for_all_cpus(get_counters, ODD_COUNTERS); |
1117 | if (retval) { | 1121 | if (retval < -1) { |
1122 | exit(retval); | ||
1123 | } else if (retval == -1) { | ||
1118 | re_initialize(); | 1124 | re_initialize(); |
1119 | goto restart; | 1125 | goto restart; |
1120 | } | 1126 | } |
@@ -1126,7 +1132,9 @@ restart: | |||
1126 | flush_stdout(); | 1132 | flush_stdout(); |
1127 | sleep(interval_sec); | 1133 | sleep(interval_sec); |
1128 | retval = for_all_cpus(get_counters, EVEN_COUNTERS); | 1134 | retval = for_all_cpus(get_counters, EVEN_COUNTERS); |
1129 | if (retval) { | 1135 | if (retval < -1) { |
1136 | exit(retval); | ||
1137 | } else if (retval == -1) { | ||
1130 | re_initialize(); | 1138 | re_initialize(); |
1131 | goto restart; | 1139 | goto restart; |
1132 | } | 1140 | } |
@@ -1545,8 +1553,11 @@ void turbostat_init() | |||
1545 | int fork_it(char **argv) | 1553 | int fork_it(char **argv) |
1546 | { | 1554 | { |
1547 | pid_t child_pid; | 1555 | pid_t child_pid; |
1556 | int status; | ||
1548 | 1557 | ||
1549 | for_all_cpus(get_counters, EVEN_COUNTERS); | 1558 | status = for_all_cpus(get_counters, EVEN_COUNTERS); |
1559 | if (status) | ||
1560 | exit(status); | ||
1550 | /* clear affinity side-effect of get_counters() */ | 1561 | /* clear affinity side-effect of get_counters() */ |
1551 | sched_setaffinity(0, cpu_present_setsize, cpu_present_set); | 1562 | sched_setaffinity(0, cpu_present_setsize, cpu_present_set); |
1552 | gettimeofday(&tv_even, (struct timezone *)NULL); | 1563 | gettimeofday(&tv_even, (struct timezone *)NULL); |
@@ -1556,7 +1567,6 @@ int fork_it(char **argv) | |||
1556 | /* child */ | 1567 | /* child */ |
1557 | execvp(argv[0], argv); | 1568 | execvp(argv[0], argv); |
1558 | } else { | 1569 | } else { |
1559 | int status; | ||
1560 | 1570 | ||
1561 | /* parent */ | 1571 | /* parent */ |
1562 | if (child_pid == -1) { | 1572 | if (child_pid == -1) { |
@@ -1568,7 +1578,7 @@ int fork_it(char **argv) | |||
1568 | signal(SIGQUIT, SIG_IGN); | 1578 | signal(SIGQUIT, SIG_IGN); |
1569 | if (waitpid(child_pid, &status, 0) == -1) { | 1579 | if (waitpid(child_pid, &status, 0) == -1) { |
1570 | perror("wait"); | 1580 | perror("wait"); |
1571 | exit(1); | 1581 | exit(status); |
1572 | } | 1582 | } |
1573 | } | 1583 | } |
1574 | /* | 1584 | /* |
@@ -1585,7 +1595,7 @@ int fork_it(char **argv) | |||
1585 | 1595 | ||
1586 | fprintf(stderr, "%.6f sec\n", tv_delta.tv_sec + tv_delta.tv_usec/1000000.0); | 1596 | fprintf(stderr, "%.6f sec\n", tv_delta.tv_sec + tv_delta.tv_usec/1000000.0); |
1587 | 1597 | ||
1588 | return 0; | 1598 | return status; |
1589 | } | 1599 | } |
1590 | 1600 | ||
1591 | void cmdline(int argc, char **argv) | 1601 | void cmdline(int argc, char **argv) |
@@ -1594,7 +1604,7 @@ void cmdline(int argc, char **argv) | |||
1594 | 1604 | ||
1595 | progname = argv[0]; | 1605 | progname = argv[0]; |
1596 | 1606 | ||
1597 | while ((opt = getopt(argc, argv, "+pPSvisc:sC:m:M:")) != -1) { | 1607 | while ((opt = getopt(argc, argv, "+pPSvi:sc:sC:m:M:")) != -1) { |
1598 | switch (opt) { | 1608 | switch (opt) { |
1599 | case 'p': | 1609 | case 'p': |
1600 | show_core_only++; | 1610 | show_core_only++; |