diff options
254 files changed, 2657 insertions, 1943 deletions
diff --git a/Documentation/devicetree/bindings/mtd/atmel-nand.txt b/Documentation/devicetree/bindings/mtd/atmel-nand.txt index 5903ecf6e895..a20069502f5a 100644 --- a/Documentation/devicetree/bindings/mtd/atmel-nand.txt +++ b/Documentation/devicetree/bindings/mtd/atmel-nand.txt | |||
@@ -27,13 +27,13 @@ nand0: nand@40000000,0 { | |||
27 | reg = <0x40000000 0x10000000 | 27 | reg = <0x40000000 0x10000000 |
28 | 0xffffe800 0x200 | 28 | 0xffffe800 0x200 |
29 | >; | 29 | >; |
30 | atmel,nand-addr-offset = <21>; | 30 | atmel,nand-addr-offset = <21>; /* ale */ |
31 | atmel,nand-cmd-offset = <22>; | 31 | atmel,nand-cmd-offset = <22>; /* cle */ |
32 | nand-on-flash-bbt; | 32 | nand-on-flash-bbt; |
33 | nand-ecc-mode = "soft"; | 33 | nand-ecc-mode = "soft"; |
34 | gpios = <&pioC 13 0 | 34 | gpios = <&pioC 13 0 /* rdy */ |
35 | &pioC 14 0 | 35 | &pioC 14 0 /* nce */ |
36 | 0 | 36 | 0 /* cd */ |
37 | >; | 37 | >; |
38 | partition@0 { | 38 | partition@0 { |
39 | ... | 39 | ... |
diff --git a/Documentation/networking/driver.txt b/Documentation/networking/driver.txt index 03283daa64fe..da59e2884130 100644 --- a/Documentation/networking/driver.txt +++ b/Documentation/networking/driver.txt | |||
@@ -2,16 +2,16 @@ Document about softnet driver issues | |||
2 | 2 | ||
3 | Transmit path guidelines: | 3 | Transmit path guidelines: |
4 | 4 | ||
5 | 1) The hard_start_xmit method must never return '1' under any | 5 | 1) The ndo_start_xmit method must not return NETDEV_TX_BUSY under |
6 | normal circumstances. It is considered a hard error unless | 6 | any normal circumstances. It is considered a hard error unless |
7 | there is no way your device can tell ahead of time when it's | 7 | there is no way your device can tell ahead of time when it's |
8 | transmit function will become busy. | 8 | transmit function will become busy. |
9 | 9 | ||
10 | Instead it must maintain the queue properly. For example, | 10 | Instead it must maintain the queue properly. For example, |
11 | for a driver implementing scatter-gather this means: | 11 | for a driver implementing scatter-gather this means: |
12 | 12 | ||
13 | static int drv_hard_start_xmit(struct sk_buff *skb, | 13 | static netdev_tx_t drv_hard_start_xmit(struct sk_buff *skb, |
14 | struct net_device *dev) | 14 | struct net_device *dev) |
15 | { | 15 | { |
16 | struct drv *dp = netdev_priv(dev); | 16 | struct drv *dp = netdev_priv(dev); |
17 | 17 | ||
@@ -23,7 +23,7 @@ Transmit path guidelines: | |||
23 | unlock_tx(dp); | 23 | unlock_tx(dp); |
24 | printk(KERN_ERR PFX "%s: BUG! Tx Ring full when queue awake!\n", | 24 | printk(KERN_ERR PFX "%s: BUG! Tx Ring full when queue awake!\n", |
25 | dev->name); | 25 | dev->name); |
26 | return 1; | 26 | return NETDEV_TX_BUSY; |
27 | } | 27 | } |
28 | 28 | ||
29 | ... queue packet to card ... | 29 | ... queue packet to card ... |
@@ -35,6 +35,7 @@ Transmit path guidelines: | |||
35 | ... | 35 | ... |
36 | unlock_tx(dp); | 36 | unlock_tx(dp); |
37 | ... | 37 | ... |
38 | return NETDEV_TX_OK; | ||
38 | } | 39 | } |
39 | 40 | ||
40 | And then at the end of your TX reclamation event handling: | 41 | And then at the end of your TX reclamation event handling: |
@@ -58,15 +59,12 @@ Transmit path guidelines: | |||
58 | TX_BUFFS_AVAIL(dp) > 0) | 59 | TX_BUFFS_AVAIL(dp) > 0) |
59 | netif_wake_queue(dp->dev); | 60 | netif_wake_queue(dp->dev); |
60 | 61 | ||
61 | 2) Do not forget to update netdev->trans_start to jiffies after | 62 | 2) An ndo_start_xmit method must not modify the shared parts of a |
62 | each new tx packet is given to the hardware. | ||
63 | |||
64 | 3) A hard_start_xmit method must not modify the shared parts of a | ||
65 | cloned SKB. | 63 | cloned SKB. |
66 | 64 | ||
67 | 4) Do not forget that once you return 0 from your hard_start_xmit | 65 | 3) Do not forget that once you return NETDEV_TX_OK from your |
68 | method, it is your driver's responsibility to free up the SKB | 66 | ndo_start_xmit method, it is your driver's responsibility to free |
69 | and in some finite amount of time. | 67 | up the SKB and in some finite amount of time. |
70 | 68 | ||
71 | For example, this means that it is not allowed for your TX | 69 | For example, this means that it is not allowed for your TX |
72 | mitigation scheme to let TX packets "hang out" in the TX | 70 | mitigation scheme to let TX packets "hang out" in the TX |
@@ -74,8 +72,9 @@ Transmit path guidelines: | |||
74 | This error can deadlock sockets waiting for send buffer room | 72 | This error can deadlock sockets waiting for send buffer room |
75 | to be freed up. | 73 | to be freed up. |
76 | 74 | ||
77 | If you return 1 from the hard_start_xmit method, you must not keep | 75 | If you return NETDEV_TX_BUSY from the ndo_start_xmit method, you |
78 | any reference to that SKB and you must not attempt to free it up. | 76 | must not keep any reference to that SKB and you must not attempt |
77 | to free it up. | ||
79 | 78 | ||
80 | Probing guidelines: | 79 | Probing guidelines: |
81 | 80 | ||
@@ -85,10 +84,10 @@ Probing guidelines: | |||
85 | 84 | ||
86 | Close/stop guidelines: | 85 | Close/stop guidelines: |
87 | 86 | ||
88 | 1) After the dev->stop routine has been called, the hardware must | 87 | 1) After the ndo_stop routine has been called, the hardware must |
89 | not receive or transmit any data. All in flight packets must | 88 | not receive or transmit any data. All in flight packets must |
90 | be aborted. If necessary, poll or wait for completion of | 89 | be aborted. If necessary, poll or wait for completion of |
91 | any reset commands. | 90 | any reset commands. |
92 | 91 | ||
93 | 2) The dev->stop routine will be called by unregister_netdevice | 92 | 2) The ndo_stop routine will be called by unregister_netdevice |
94 | if device is still UP. | 93 | if device is still UP. |
diff --git a/Documentation/networking/ip-sysctl.txt b/Documentation/networking/ip-sysctl.txt index ad3e80e17b4f..bd80ba5847d2 100644 --- a/Documentation/networking/ip-sysctl.txt +++ b/Documentation/networking/ip-sysctl.txt | |||
@@ -604,15 +604,8 @@ IP Variables: | |||
604 | ip_local_port_range - 2 INTEGERS | 604 | ip_local_port_range - 2 INTEGERS |
605 | Defines the local port range that is used by TCP and UDP to | 605 | Defines the local port range that is used by TCP and UDP to |
606 | choose the local port. The first number is the first, the | 606 | choose the local port. The first number is the first, the |
607 | second the last local port number. Default value depends on | 607 | second the last local port number. The default values are |
608 | amount of memory available on the system: | 608 | 32768 and 61000 respectively. |
609 | > 128Mb 32768-61000 | ||
610 | < 128Mb 1024-4999 or even less. | ||
611 | This number defines number of active connections, which this | ||
612 | system can issue simultaneously to systems not supporting | ||
613 | TCP extensions (timestamps). With tcp_tw_recycle enabled | ||
614 | (i.e. by default) range 1024-4999 is enough to issue up to | ||
615 | 2000 connections per second to systems supporting timestamps. | ||
616 | 609 | ||
617 | ip_local_reserved_ports - list of comma separated ranges | 610 | ip_local_reserved_ports - list of comma separated ranges |
618 | Specify the ports which are reserved for known third-party | 611 | Specify the ports which are reserved for known third-party |
diff --git a/Documentation/networking/netdevices.txt b/Documentation/networking/netdevices.txt index 89358341682a..c7ecc7080494 100644 --- a/Documentation/networking/netdevices.txt +++ b/Documentation/networking/netdevices.txt | |||
@@ -47,26 +47,25 @@ packets is preferred. | |||
47 | 47 | ||
48 | struct net_device synchronization rules | 48 | struct net_device synchronization rules |
49 | ======================================= | 49 | ======================================= |
50 | dev->open: | 50 | ndo_open: |
51 | Synchronization: rtnl_lock() semaphore. | 51 | Synchronization: rtnl_lock() semaphore. |
52 | Context: process | 52 | Context: process |
53 | 53 | ||
54 | dev->stop: | 54 | ndo_stop: |
55 | Synchronization: rtnl_lock() semaphore. | 55 | Synchronization: rtnl_lock() semaphore. |
56 | Context: process | 56 | Context: process |
57 | Note1: netif_running() is guaranteed false | 57 | Note: netif_running() is guaranteed false |
58 | Note2: dev->poll() is guaranteed to be stopped | ||
59 | 58 | ||
60 | dev->do_ioctl: | 59 | ndo_do_ioctl: |
61 | Synchronization: rtnl_lock() semaphore. | 60 | Synchronization: rtnl_lock() semaphore. |
62 | Context: process | 61 | Context: process |
63 | 62 | ||
64 | dev->get_stats: | 63 | ndo_get_stats: |
65 | Synchronization: dev_base_lock rwlock. | 64 | Synchronization: dev_base_lock rwlock. |
66 | Context: nominally process, but don't sleep inside an rwlock | 65 | Context: nominally process, but don't sleep inside an rwlock |
67 | 66 | ||
68 | dev->hard_start_xmit: | 67 | ndo_start_xmit: |
69 | Synchronization: netif_tx_lock spinlock. | 68 | Synchronization: __netif_tx_lock spinlock. |
70 | 69 | ||
71 | When the driver sets NETIF_F_LLTX in dev->features this will be | 70 | When the driver sets NETIF_F_LLTX in dev->features this will be |
72 | called without holding netif_tx_lock. In this case the driver | 71 | called without holding netif_tx_lock. In this case the driver |
@@ -87,20 +86,20 @@ dev->hard_start_xmit: | |||
87 | o NETDEV_TX_LOCKED Locking failed, please retry quickly. | 86 | o NETDEV_TX_LOCKED Locking failed, please retry quickly. |
88 | Only valid when NETIF_F_LLTX is set. | 87 | Only valid when NETIF_F_LLTX is set. |
89 | 88 | ||
90 | dev->tx_timeout: | 89 | ndo_tx_timeout: |
91 | Synchronization: netif_tx_lock spinlock. | 90 | Synchronization: netif_tx_lock spinlock; all TX queues frozen. |
92 | Context: BHs disabled | 91 | Context: BHs disabled |
93 | Notes: netif_queue_stopped() is guaranteed true | 92 | Notes: netif_queue_stopped() is guaranteed true |
94 | 93 | ||
95 | dev->set_rx_mode: | 94 | ndo_set_rx_mode: |
96 | Synchronization: netif_tx_lock spinlock. | 95 | Synchronization: netif_addr_lock spinlock. |
97 | Context: BHs disabled | 96 | Context: BHs disabled |
98 | 97 | ||
99 | struct napi_struct synchronization rules | 98 | struct napi_struct synchronization rules |
100 | ======================================== | 99 | ======================================== |
101 | napi->poll: | 100 | napi->poll: |
102 | Synchronization: NAPI_STATE_SCHED bit in napi->state. Device | 101 | Synchronization: NAPI_STATE_SCHED bit in napi->state. Device |
103 | driver's dev->close method will invoke napi_disable() on | 102 | driver's ndo_stop method will invoke napi_disable() on |
104 | all NAPI instances which will do a sleeping poll on the | 103 | all NAPI instances which will do a sleeping poll on the |
105 | NAPI_STATE_SCHED napi->state bit, waiting for all pending | 104 | NAPI_STATE_SCHED napi->state bit, waiting for all pending |
106 | NAPI activity to cease. | 105 | NAPI activity to cease. |
diff --git a/MAINTAINERS b/MAINTAINERS index 962232d62781..2dcfca850639 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -228,7 +228,7 @@ M: Len Brown <lenb@kernel.org> | |||
228 | L: linux-acpi@vger.kernel.org | 228 | L: linux-acpi@vger.kernel.org |
229 | W: http://www.lesswatts.org/projects/acpi/ | 229 | W: http://www.lesswatts.org/projects/acpi/ |
230 | Q: http://patchwork.kernel.org/project/linux-acpi/list/ | 230 | Q: http://patchwork.kernel.org/project/linux-acpi/list/ |
231 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6.git | 231 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux |
232 | S: Supported | 232 | S: Supported |
233 | F: drivers/acpi/ | 233 | F: drivers/acpi/ |
234 | F: drivers/pnp/pnpacpi/ | 234 | F: drivers/pnp/pnpacpi/ |
@@ -2450,17 +2450,17 @@ F: fs/ecryptfs/ | |||
2450 | 2450 | ||
2451 | EDAC-CORE | 2451 | EDAC-CORE |
2452 | M: Doug Thompson <dougthompson@xmission.com> | 2452 | M: Doug Thompson <dougthompson@xmission.com> |
2453 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) | 2453 | L: linux-edac@vger.kernel.org |
2454 | W: bluesmoke.sourceforge.net | 2454 | W: bluesmoke.sourceforge.net |
2455 | S: Supported | 2455 | S: Supported |
2456 | F: Documentation/edac.txt | 2456 | F: Documentation/edac.txt |
2457 | F: drivers/edac/edac_* | 2457 | F: drivers/edac/ |
2458 | F: include/linux/edac.h | 2458 | F: include/linux/edac.h |
2459 | 2459 | ||
2460 | EDAC-AMD64 | 2460 | EDAC-AMD64 |
2461 | M: Doug Thompson <dougthompson@xmission.com> | 2461 | M: Doug Thompson <dougthompson@xmission.com> |
2462 | M: Borislav Petkov <borislav.petkov@amd.com> | 2462 | M: Borislav Petkov <borislav.petkov@amd.com> |
2463 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) | 2463 | L: linux-edac@vger.kernel.org |
2464 | W: bluesmoke.sourceforge.net | 2464 | W: bluesmoke.sourceforge.net |
2465 | S: Supported | 2465 | S: Supported |
2466 | F: drivers/edac/amd64_edac* | 2466 | F: drivers/edac/amd64_edac* |
@@ -2468,35 +2468,35 @@ F: drivers/edac/amd64_edac* | |||
2468 | EDAC-E752X | 2468 | EDAC-E752X |
2469 | M: Mark Gross <mark.gross@intel.com> | 2469 | M: Mark Gross <mark.gross@intel.com> |
2470 | M: Doug Thompson <dougthompson@xmission.com> | 2470 | M: Doug Thompson <dougthompson@xmission.com> |
2471 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) | 2471 | L: linux-edac@vger.kernel.org |
2472 | W: bluesmoke.sourceforge.net | 2472 | W: bluesmoke.sourceforge.net |
2473 | S: Maintained | 2473 | S: Maintained |
2474 | F: drivers/edac/e752x_edac.c | 2474 | F: drivers/edac/e752x_edac.c |
2475 | 2475 | ||
2476 | EDAC-E7XXX | 2476 | EDAC-E7XXX |
2477 | M: Doug Thompson <dougthompson@xmission.com> | 2477 | M: Doug Thompson <dougthompson@xmission.com> |
2478 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) | 2478 | L: linux-edac@vger.kernel.org |
2479 | W: bluesmoke.sourceforge.net | 2479 | W: bluesmoke.sourceforge.net |
2480 | S: Maintained | 2480 | S: Maintained |
2481 | F: drivers/edac/e7xxx_edac.c | 2481 | F: drivers/edac/e7xxx_edac.c |
2482 | 2482 | ||
2483 | EDAC-I82443BXGX | 2483 | EDAC-I82443BXGX |
2484 | M: Tim Small <tim@buttersideup.com> | 2484 | M: Tim Small <tim@buttersideup.com> |
2485 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) | 2485 | L: linux-edac@vger.kernel.org |
2486 | W: bluesmoke.sourceforge.net | 2486 | W: bluesmoke.sourceforge.net |
2487 | S: Maintained | 2487 | S: Maintained |
2488 | F: drivers/edac/i82443bxgx_edac.c | 2488 | F: drivers/edac/i82443bxgx_edac.c |
2489 | 2489 | ||
2490 | EDAC-I3000 | 2490 | EDAC-I3000 |
2491 | M: Jason Uhlenkott <juhlenko@akamai.com> | 2491 | M: Jason Uhlenkott <juhlenko@akamai.com> |
2492 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) | 2492 | L: linux-edac@vger.kernel.org |
2493 | W: bluesmoke.sourceforge.net | 2493 | W: bluesmoke.sourceforge.net |
2494 | S: Maintained | 2494 | S: Maintained |
2495 | F: drivers/edac/i3000_edac.c | 2495 | F: drivers/edac/i3000_edac.c |
2496 | 2496 | ||
2497 | EDAC-I5000 | 2497 | EDAC-I5000 |
2498 | M: Doug Thompson <dougthompson@xmission.com> | 2498 | M: Doug Thompson <dougthompson@xmission.com> |
2499 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) | 2499 | L: linux-edac@vger.kernel.org |
2500 | W: bluesmoke.sourceforge.net | 2500 | W: bluesmoke.sourceforge.net |
2501 | S: Maintained | 2501 | S: Maintained |
2502 | F: drivers/edac/i5000_edac.c | 2502 | F: drivers/edac/i5000_edac.c |
@@ -2525,21 +2525,21 @@ F: drivers/edac/i7core_edac.c | |||
2525 | EDAC-I82975X | 2525 | EDAC-I82975X |
2526 | M: Ranganathan Desikan <ravi@jetztechnologies.com> | 2526 | M: Ranganathan Desikan <ravi@jetztechnologies.com> |
2527 | M: "Arvind R." <arvino55@gmail.com> | 2527 | M: "Arvind R." <arvino55@gmail.com> |
2528 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) | 2528 | L: linux-edac@vger.kernel.org |
2529 | W: bluesmoke.sourceforge.net | 2529 | W: bluesmoke.sourceforge.net |
2530 | S: Maintained | 2530 | S: Maintained |
2531 | F: drivers/edac/i82975x_edac.c | 2531 | F: drivers/edac/i82975x_edac.c |
2532 | 2532 | ||
2533 | EDAC-PASEMI | 2533 | EDAC-PASEMI |
2534 | M: Egor Martovetsky <egor@pasemi.com> | 2534 | M: Egor Martovetsky <egor@pasemi.com> |
2535 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) | 2535 | L: linux-edac@vger.kernel.org |
2536 | W: bluesmoke.sourceforge.net | 2536 | W: bluesmoke.sourceforge.net |
2537 | S: Maintained | 2537 | S: Maintained |
2538 | F: drivers/edac/pasemi_edac.c | 2538 | F: drivers/edac/pasemi_edac.c |
2539 | 2539 | ||
2540 | EDAC-R82600 | 2540 | EDAC-R82600 |
2541 | M: Tim Small <tim@buttersideup.com> | 2541 | M: Tim Small <tim@buttersideup.com> |
2542 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) | 2542 | L: linux-edac@vger.kernel.org |
2543 | W: bluesmoke.sourceforge.net | 2543 | W: bluesmoke.sourceforge.net |
2544 | S: Maintained | 2544 | S: Maintained |
2545 | F: drivers/edac/r82600_edac.c | 2545 | F: drivers/edac/r82600_edac.c |
@@ -4309,6 +4309,13 @@ W: http://www.kernel.org/doc/man-pages | |||
4309 | L: linux-man@vger.kernel.org | 4309 | L: linux-man@vger.kernel.org |
4310 | S: Maintained | 4310 | S: Maintained |
4311 | 4311 | ||
4312 | MARVELL GIGABIT ETHERNET DRIVERS (skge/sky2) | ||
4313 | M: Mirko Lindner <mlindner@marvell.com> | ||
4314 | M: Stephen Hemminger <shemminger@vyatta.com> | ||
4315 | L: netdev@vger.kernel.org | ||
4316 | S: Maintained | ||
4317 | F: drivers/net/ethernet/marvell/sk* | ||
4318 | |||
4312 | MARVELL LIBERTAS WIRELESS DRIVER | 4319 | MARVELL LIBERTAS WIRELESS DRIVER |
4313 | M: Dan Williams <dcbw@redhat.com> | 4320 | M: Dan Williams <dcbw@redhat.com> |
4314 | L: libertas-dev@lists.infradead.org | 4321 | L: libertas-dev@lists.infradead.org |
@@ -4339,12 +4346,6 @@ M: Nicolas Pitre <nico@fluxnic.net> | |||
4339 | S: Odd Fixes | 4346 | S: Odd Fixes |
4340 | F: drivers/mmc/host/mvsdio.* | 4347 | F: drivers/mmc/host/mvsdio.* |
4341 | 4348 | ||
4342 | MARVELL YUKON / SYSKONNECT DRIVER | ||
4343 | M: Mirko Lindner <mlindner@syskonnect.de> | ||
4344 | M: Ralph Roesler <rroesler@syskonnect.de> | ||
4345 | W: http://www.syskonnect.com | ||
4346 | S: Supported | ||
4347 | |||
4348 | MATROX FRAMEBUFFER DRIVER | 4349 | MATROX FRAMEBUFFER DRIVER |
4349 | L: linux-fbdev@vger.kernel.org | 4350 | L: linux-fbdev@vger.kernel.org |
4350 | S: Orphan | 4351 | S: Orphan |
@@ -5637,7 +5638,7 @@ M: Ohad Ben-Cohen <ohad@wizery.com> | |||
5637 | S: Maintained | 5638 | S: Maintained |
5638 | F: drivers/remoteproc/ | 5639 | F: drivers/remoteproc/ |
5639 | F: Documentation/remoteproc.txt | 5640 | F: Documentation/remoteproc.txt |
5640 | F: include/linux/remoteproc.txt | 5641 | F: include/linux/remoteproc.h |
5641 | 5642 | ||
5642 | RFKILL | 5643 | RFKILL |
5643 | M: Johannes Berg <johannes@sipsolutions.net> | 5644 | M: Johannes Berg <johannes@sipsolutions.net> |
@@ -6116,12 +6117,6 @@ W: http://www.winischhofer.at/linuxsisusbvga.shtml | |||
6116 | S: Maintained | 6117 | S: Maintained |
6117 | F: drivers/usb/misc/sisusbvga/ | 6118 | F: drivers/usb/misc/sisusbvga/ |
6118 | 6119 | ||
6119 | SKGE, SKY2 10/100/1000 GIGABIT ETHERNET DRIVERS | ||
6120 | M: Stephen Hemminger <shemminger@vyatta.com> | ||
6121 | L: netdev@vger.kernel.org | ||
6122 | S: Maintained | ||
6123 | F: drivers/net/ethernet/marvell/sk* | ||
6124 | |||
6125 | SLAB ALLOCATOR | 6120 | SLAB ALLOCATOR |
6126 | M: Christoph Lameter <cl@linux-foundation.org> | 6121 | M: Christoph Lameter <cl@linux-foundation.org> |
6127 | M: Pekka Enberg <penberg@kernel.org> | 6122 | M: Pekka Enberg <penberg@kernel.org> |
@@ -6287,6 +6282,15 @@ F: drivers/tty/serial/sunsu.c | |||
6287 | F: drivers/tty/serial/sunzilog.c | 6282 | F: drivers/tty/serial/sunzilog.c |
6288 | F: drivers/tty/serial/sunzilog.h | 6283 | F: drivers/tty/serial/sunzilog.h |
6289 | 6284 | ||
6285 | SPARSE CHECKER | ||
6286 | M: "Christopher Li" <sparse@chrisli.org> | ||
6287 | L: linux-sparse@vger.kernel.org | ||
6288 | W: https://sparse.wiki.kernel.org/ | ||
6289 | T: git git://git.kernel.org/pub/scm/devel/sparse/sparse.git | ||
6290 | T: git git://git.kernel.org/pub/scm/devel/sparse/chrisl/sparse.git | ||
6291 | S: Maintained | ||
6292 | F: include/linux/compiler.h | ||
6293 | |||
6290 | SPEAR PLATFORM SUPPORT | 6294 | SPEAR PLATFORM SUPPORT |
6291 | M: Viresh Kumar <viresh.kumar@st.com> | 6295 | M: Viresh Kumar <viresh.kumar@st.com> |
6292 | L: spear-devel@list.st.com | 6296 | L: spear-devel@list.st.com |
diff --git a/arch/alpha/kernel/signal.c b/arch/alpha/kernel/signal.c index 6f7feb5db271..35f2ef44de12 100644 --- a/arch/alpha/kernel/signal.c +++ b/arch/alpha/kernel/signal.c | |||
@@ -120,12 +120,13 @@ SYSCALL_DEFINE5(rt_sigaction, int, sig, const struct sigaction __user *, act, | |||
120 | */ | 120 | */ |
121 | SYSCALL_DEFINE1(sigsuspend, old_sigset_t, mask) | 121 | SYSCALL_DEFINE1(sigsuspend, old_sigset_t, mask) |
122 | { | 122 | { |
123 | mask &= _BLOCKABLE; | 123 | sigset_t blocked; |
124 | spin_lock_irq(¤t->sighand->siglock); | 124 | |
125 | current->saved_sigmask = current->blocked; | 125 | current->saved_sigmask = current->blocked; |
126 | siginitset(¤t->blocked, mask); | 126 | |
127 | recalc_sigpending(); | 127 | mask &= _BLOCKABLE; |
128 | spin_unlock_irq(¤t->sighand->siglock); | 128 | siginitset(&blocked, mask); |
129 | set_current_blocked(&blocked); | ||
129 | 130 | ||
130 | current->state = TASK_INTERRUPTIBLE; | 131 | current->state = TASK_INTERRUPTIBLE; |
131 | schedule(); | 132 | schedule(); |
@@ -238,10 +239,7 @@ do_sigreturn(struct sigcontext __user *sc, struct pt_regs *regs, | |||
238 | goto give_sigsegv; | 239 | goto give_sigsegv; |
239 | 240 | ||
240 | sigdelsetmask(&set, ~_BLOCKABLE); | 241 | sigdelsetmask(&set, ~_BLOCKABLE); |
241 | spin_lock_irq(¤t->sighand->siglock); | 242 | set_current_blocked(&set); |
242 | current->blocked = set; | ||
243 | recalc_sigpending(); | ||
244 | spin_unlock_irq(¤t->sighand->siglock); | ||
245 | 243 | ||
246 | if (restore_sigcontext(sc, regs, sw)) | 244 | if (restore_sigcontext(sc, regs, sw)) |
247 | goto give_sigsegv; | 245 | goto give_sigsegv; |
@@ -276,10 +274,7 @@ do_rt_sigreturn(struct rt_sigframe __user *frame, struct pt_regs *regs, | |||
276 | goto give_sigsegv; | 274 | goto give_sigsegv; |
277 | 275 | ||
278 | sigdelsetmask(&set, ~_BLOCKABLE); | 276 | sigdelsetmask(&set, ~_BLOCKABLE); |
279 | spin_lock_irq(¤t->sighand->siglock); | 277 | set_current_blocked(&set); |
280 | current->blocked = set; | ||
281 | recalc_sigpending(); | ||
282 | spin_unlock_irq(¤t->sighand->siglock); | ||
283 | 278 | ||
284 | if (restore_sigcontext(&frame->uc.uc_mcontext, regs, sw)) | 279 | if (restore_sigcontext(&frame->uc.uc_mcontext, regs, sw)) |
285 | goto give_sigsegv; | 280 | goto give_sigsegv; |
@@ -501,14 +496,8 @@ handle_signal(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
501 | else | 496 | else |
502 | ret = setup_frame(sig, ka, oldset, regs, sw); | 497 | ret = setup_frame(sig, ka, oldset, regs, sw); |
503 | 498 | ||
504 | if (ret == 0) { | 499 | if (ret == 0) |
505 | spin_lock_irq(¤t->sighand->siglock); | 500 | block_sigmask(ka, sig); |
506 | sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask); | ||
507 | if (!(ka->sa.sa_flags & SA_NODEFER)) | ||
508 | sigaddset(¤t->blocked,sig); | ||
509 | recalc_sigpending(); | ||
510 | spin_unlock_irq(¤t->sighand->siglock); | ||
511 | } | ||
512 | 501 | ||
513 | return ret; | 502 | return ret; |
514 | } | 503 | } |
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 93180845ae16..cf006d40342c 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -338,6 +338,7 @@ config ARCH_AT91 | |||
338 | select HAVE_CLK | 338 | select HAVE_CLK |
339 | select CLKDEV_LOOKUP | 339 | select CLKDEV_LOOKUP |
340 | select IRQ_DOMAIN | 340 | select IRQ_DOMAIN |
341 | select NEED_MACH_IO_H if PCCARD | ||
341 | help | 342 | help |
342 | This enables support for systems based on the Atmel AT91RM9200, | 343 | This enables support for systems based on the Atmel AT91RM9200, |
343 | AT91SAM9 processors. | 344 | AT91SAM9 processors. |
diff --git a/arch/arm/boot/dts/at91sam9g20.dtsi b/arch/arm/boot/dts/at91sam9g20.dtsi index 92f36627e7f8..799ad1889b51 100644 --- a/arch/arm/boot/dts/at91sam9g20.dtsi +++ b/arch/arm/boot/dts/at91sam9g20.dtsi | |||
@@ -35,7 +35,7 @@ | |||
35 | }; | 35 | }; |
36 | }; | 36 | }; |
37 | 37 | ||
38 | memory@20000000 { | 38 | memory { |
39 | reg = <0x20000000 0x08000000>; | 39 | reg = <0x20000000 0x08000000>; |
40 | }; | 40 | }; |
41 | 41 | ||
diff --git a/arch/arm/boot/dts/at91sam9g25ek.dts b/arch/arm/boot/dts/at91sam9g25ek.dts index ac0dc0031dda..7829a4d0cb22 100644 --- a/arch/arm/boot/dts/at91sam9g25ek.dts +++ b/arch/arm/boot/dts/at91sam9g25ek.dts | |||
@@ -37,8 +37,8 @@ | |||
37 | usb0: ohci@00600000 { | 37 | usb0: ohci@00600000 { |
38 | status = "okay"; | 38 | status = "okay"; |
39 | num-ports = <2>; | 39 | num-ports = <2>; |
40 | atmel,vbus-gpio = <&pioD 19 0 | 40 | atmel,vbus-gpio = <&pioD 19 1 |
41 | &pioD 20 0 | 41 | &pioD 20 1 |
42 | >; | 42 | >; |
43 | }; | 43 | }; |
44 | 44 | ||
diff --git a/arch/arm/boot/dts/at91sam9g45.dtsi b/arch/arm/boot/dts/at91sam9g45.dtsi index 3d0c32fb218f..9e6eb6ecea0e 100644 --- a/arch/arm/boot/dts/at91sam9g45.dtsi +++ b/arch/arm/boot/dts/at91sam9g45.dtsi | |||
@@ -36,7 +36,7 @@ | |||
36 | }; | 36 | }; |
37 | }; | 37 | }; |
38 | 38 | ||
39 | memory@70000000 { | 39 | memory { |
40 | reg = <0x70000000 0x10000000>; | 40 | reg = <0x70000000 0x10000000>; |
41 | }; | 41 | }; |
42 | 42 | ||
diff --git a/arch/arm/boot/dts/at91sam9m10g45ek.dts b/arch/arm/boot/dts/at91sam9m10g45ek.dts index c4c8ae4123d5..a3633bd13111 100644 --- a/arch/arm/boot/dts/at91sam9m10g45ek.dts +++ b/arch/arm/boot/dts/at91sam9m10g45ek.dts | |||
@@ -17,7 +17,7 @@ | |||
17 | bootargs = "mem=64M console=ttyS0,115200 root=/dev/mtdblock1 rw rootfstype=jffs2"; | 17 | bootargs = "mem=64M console=ttyS0,115200 root=/dev/mtdblock1 rw rootfstype=jffs2"; |
18 | }; | 18 | }; |
19 | 19 | ||
20 | memory@70000000 { | 20 | memory { |
21 | reg = <0x70000000 0x4000000>; | 21 | reg = <0x70000000 0x4000000>; |
22 | }; | 22 | }; |
23 | 23 | ||
@@ -73,8 +73,8 @@ | |||
73 | usb0: ohci@00700000 { | 73 | usb0: ohci@00700000 { |
74 | status = "okay"; | 74 | status = "okay"; |
75 | num-ports = <2>; | 75 | num-ports = <2>; |
76 | atmel,vbus-gpio = <&pioD 1 0 | 76 | atmel,vbus-gpio = <&pioD 1 1 |
77 | &pioD 3 0>; | 77 | &pioD 3 1>; |
78 | }; | 78 | }; |
79 | 79 | ||
80 | usb1: ehci@00800000 { | 80 | usb1: ehci@00800000 { |
diff --git a/arch/arm/boot/dts/at91sam9x5.dtsi b/arch/arm/boot/dts/at91sam9x5.dtsi index c111001f254e..70ab3a4e026f 100644 --- a/arch/arm/boot/dts/at91sam9x5.dtsi +++ b/arch/arm/boot/dts/at91sam9x5.dtsi | |||
@@ -34,7 +34,7 @@ | |||
34 | }; | 34 | }; |
35 | }; | 35 | }; |
36 | 36 | ||
37 | memory@20000000 { | 37 | memory { |
38 | reg = <0x20000000 0x10000000>; | 38 | reg = <0x20000000 0x10000000>; |
39 | }; | 39 | }; |
40 | 40 | ||
@@ -201,8 +201,8 @@ | |||
201 | >; | 201 | >; |
202 | atmel,nand-addr-offset = <21>; | 202 | atmel,nand-addr-offset = <21>; |
203 | atmel,nand-cmd-offset = <22>; | 203 | atmel,nand-cmd-offset = <22>; |
204 | gpios = <&pioC 8 0 | 204 | gpios = <&pioD 5 0 |
205 | &pioC 14 0 | 205 | &pioD 4 0 |
206 | 0 | 206 | 0 |
207 | >; | 207 | >; |
208 | status = "disabled"; | 208 | status = "disabled"; |
diff --git a/arch/arm/boot/dts/at91sam9x5cm.dtsi b/arch/arm/boot/dts/at91sam9x5cm.dtsi index 67936f83c694..31e7be23703d 100644 --- a/arch/arm/boot/dts/at91sam9x5cm.dtsi +++ b/arch/arm/boot/dts/at91sam9x5cm.dtsi | |||
@@ -8,7 +8,7 @@ | |||
8 | */ | 8 | */ |
9 | 9 | ||
10 | / { | 10 | / { |
11 | memory@20000000 { | 11 | memory { |
12 | reg = <0x20000000 0x8000000>; | 12 | reg = <0x20000000 0x8000000>; |
13 | }; | 13 | }; |
14 | 14 | ||
diff --git a/arch/arm/boot/dts/usb_a9g20.dts b/arch/arm/boot/dts/usb_a9g20.dts index 3b3c4e0fa79f..7c2399c532e5 100644 --- a/arch/arm/boot/dts/usb_a9g20.dts +++ b/arch/arm/boot/dts/usb_a9g20.dts | |||
@@ -16,7 +16,7 @@ | |||
16 | bootargs = "mem=64M console=ttyS0,115200 root=/dev/mtdblock5 rw rootfstype=ubifs"; | 16 | bootargs = "mem=64M console=ttyS0,115200 root=/dev/mtdblock5 rw rootfstype=ubifs"; |
17 | }; | 17 | }; |
18 | 18 | ||
19 | memory@20000000 { | 19 | memory { |
20 | reg = <0x20000000 0x4000000>; | 20 | reg = <0x20000000 0x4000000>; |
21 | }; | 21 | }; |
22 | 22 | ||
diff --git a/arch/arm/include/asm/barrier.h b/arch/arm/include/asm/barrier.h index 44f4a09ff37b..05112380dc53 100644 --- a/arch/arm/include/asm/barrier.h +++ b/arch/arm/include/asm/barrier.h | |||
@@ -2,6 +2,7 @@ | |||
2 | #define __ASM_BARRIER_H | 2 | #define __ASM_BARRIER_H |
3 | 3 | ||
4 | #ifndef __ASSEMBLY__ | 4 | #ifndef __ASSEMBLY__ |
5 | #include <asm/outercache.h> | ||
5 | 6 | ||
6 | #define nop() __asm__ __volatile__("mov\tr0,r0\t@ nop\n\t"); | 7 | #define nop() __asm__ __volatile__("mov\tr0,r0\t@ nop\n\t"); |
7 | 8 | ||
@@ -39,7 +40,6 @@ | |||
39 | #ifdef CONFIG_ARCH_HAS_BARRIERS | 40 | #ifdef CONFIG_ARCH_HAS_BARRIERS |
40 | #include <mach/barriers.h> | 41 | #include <mach/barriers.h> |
41 | #elif defined(CONFIG_ARM_DMA_MEM_BUFFERABLE) || defined(CONFIG_SMP) | 42 | #elif defined(CONFIG_ARM_DMA_MEM_BUFFERABLE) || defined(CONFIG_SMP) |
42 | #include <asm/outercache.h> | ||
43 | #define mb() do { dsb(); outer_sync(); } while (0) | 43 | #define mb() do { dsb(); outer_sync(); } while (0) |
44 | #define rmb() dsb() | 44 | #define rmb() dsb() |
45 | #define wmb() mb() | 45 | #define wmb() mb() |
diff --git a/arch/arm/include/asm/io.h b/arch/arm/include/asm/io.h index df0ac0bb39aa..9af5563dd3eb 100644 --- a/arch/arm/include/asm/io.h +++ b/arch/arm/include/asm/io.h | |||
@@ -119,7 +119,7 @@ static inline void __iomem *__typesafe_io(unsigned long addr) | |||
119 | #ifdef CONFIG_NEED_MACH_IO_H | 119 | #ifdef CONFIG_NEED_MACH_IO_H |
120 | #include <mach/io.h> | 120 | #include <mach/io.h> |
121 | #else | 121 | #else |
122 | #define __io(a) ({ (void)(a); __typesafe_io(0); }) | 122 | #define __io(a) __typesafe_io((a) & IO_SPACE_LIMIT) |
123 | #endif | 123 | #endif |
124 | 124 | ||
125 | /* | 125 | /* |
diff --git a/arch/arm/mach-at91/at91sam9260_devices.c b/arch/arm/mach-at91/at91sam9260_devices.c index 7e5651ee9f85..5652dde4bbe2 100644 --- a/arch/arm/mach-at91/at91sam9260_devices.c +++ b/arch/arm/mach-at91/at91sam9260_devices.c | |||
@@ -598,6 +598,9 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) | |||
598 | else | 598 | else |
599 | cs_pin = spi1_standard_cs[devices[i].chip_select]; | 599 | cs_pin = spi1_standard_cs[devices[i].chip_select]; |
600 | 600 | ||
601 | if (!gpio_is_valid(cs_pin)) | ||
602 | continue; | ||
603 | |||
601 | if (devices[i].bus_num == 0) | 604 | if (devices[i].bus_num == 0) |
602 | enable_spi0 = 1; | 605 | enable_spi0 = 1; |
603 | else | 606 | else |
diff --git a/arch/arm/mach-at91/at91sam9261_devices.c b/arch/arm/mach-at91/at91sam9261_devices.c index 096da87dc00d..4db961a93085 100644 --- a/arch/arm/mach-at91/at91sam9261_devices.c +++ b/arch/arm/mach-at91/at91sam9261_devices.c | |||
@@ -415,6 +415,9 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) | |||
415 | else | 415 | else |
416 | cs_pin = spi1_standard_cs[devices[i].chip_select]; | 416 | cs_pin = spi1_standard_cs[devices[i].chip_select]; |
417 | 417 | ||
418 | if (!gpio_is_valid(cs_pin)) | ||
419 | continue; | ||
420 | |||
418 | if (devices[i].bus_num == 0) | 421 | if (devices[i].bus_num == 0) |
419 | enable_spi0 = 1; | 422 | enable_spi0 = 1; |
420 | else | 423 | else |
diff --git a/arch/arm/mach-at91/at91sam9263_devices.c b/arch/arm/mach-at91/at91sam9263_devices.c index 53688c46f956..fe99206de880 100644 --- a/arch/arm/mach-at91/at91sam9263_devices.c +++ b/arch/arm/mach-at91/at91sam9263_devices.c | |||
@@ -72,7 +72,8 @@ void __init at91_add_device_usbh(struct at91_usbh_data *data) | |||
72 | /* Enable VBus control for UHP ports */ | 72 | /* Enable VBus control for UHP ports */ |
73 | for (i = 0; i < data->ports; i++) { | 73 | for (i = 0; i < data->ports; i++) { |
74 | if (gpio_is_valid(data->vbus_pin[i])) | 74 | if (gpio_is_valid(data->vbus_pin[i])) |
75 | at91_set_gpio_output(data->vbus_pin[i], 0); | 75 | at91_set_gpio_output(data->vbus_pin[i], |
76 | data->vbus_pin_active_low[i]); | ||
76 | } | 77 | } |
77 | 78 | ||
78 | /* Enable overcurrent notification */ | 79 | /* Enable overcurrent notification */ |
@@ -671,6 +672,9 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) | |||
671 | else | 672 | else |
672 | cs_pin = spi1_standard_cs[devices[i].chip_select]; | 673 | cs_pin = spi1_standard_cs[devices[i].chip_select]; |
673 | 674 | ||
675 | if (!gpio_is_valid(cs_pin)) | ||
676 | continue; | ||
677 | |||
674 | if (devices[i].bus_num == 0) | 678 | if (devices[i].bus_num == 0) |
675 | enable_spi0 = 1; | 679 | enable_spi0 = 1; |
676 | else | 680 | else |
diff --git a/arch/arm/mach-at91/at91sam9g45_devices.c b/arch/arm/mach-at91/at91sam9g45_devices.c index 698479f1e197..6b008aee1dff 100644 --- a/arch/arm/mach-at91/at91sam9g45_devices.c +++ b/arch/arm/mach-at91/at91sam9g45_devices.c | |||
@@ -127,12 +127,13 @@ void __init at91_add_device_usbh_ohci(struct at91_usbh_data *data) | |||
127 | /* Enable VBus control for UHP ports */ | 127 | /* Enable VBus control for UHP ports */ |
128 | for (i = 0; i < data->ports; i++) { | 128 | for (i = 0; i < data->ports; i++) { |
129 | if (gpio_is_valid(data->vbus_pin[i])) | 129 | if (gpio_is_valid(data->vbus_pin[i])) |
130 | at91_set_gpio_output(data->vbus_pin[i], 0); | 130 | at91_set_gpio_output(data->vbus_pin[i], |
131 | data->vbus_pin_active_low[i]); | ||
131 | } | 132 | } |
132 | 133 | ||
133 | /* Enable overcurrent notification */ | 134 | /* Enable overcurrent notification */ |
134 | for (i = 0; i < data->ports; i++) { | 135 | for (i = 0; i < data->ports; i++) { |
135 | if (data->overcurrent_pin[i]) | 136 | if (gpio_is_valid(data->overcurrent_pin[i])) |
136 | at91_set_gpio_input(data->overcurrent_pin[i], 1); | 137 | at91_set_gpio_input(data->overcurrent_pin[i], 1); |
137 | } | 138 | } |
138 | 139 | ||
@@ -188,7 +189,8 @@ void __init at91_add_device_usbh_ehci(struct at91_usbh_data *data) | |||
188 | /* Enable VBus control for UHP ports */ | 189 | /* Enable VBus control for UHP ports */ |
189 | for (i = 0; i < data->ports; i++) { | 190 | for (i = 0; i < data->ports; i++) { |
190 | if (gpio_is_valid(data->vbus_pin[i])) | 191 | if (gpio_is_valid(data->vbus_pin[i])) |
191 | at91_set_gpio_output(data->vbus_pin[i], 0); | 192 | at91_set_gpio_output(data->vbus_pin[i], |
193 | data->vbus_pin_active_low[i]); | ||
192 | } | 194 | } |
193 | 195 | ||
194 | usbh_ehci_data = *data; | 196 | usbh_ehci_data = *data; |
@@ -785,6 +787,9 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) | |||
785 | else | 787 | else |
786 | cs_pin = spi1_standard_cs[devices[i].chip_select]; | 788 | cs_pin = spi1_standard_cs[devices[i].chip_select]; |
787 | 789 | ||
790 | if (!gpio_is_valid(cs_pin)) | ||
791 | continue; | ||
792 | |||
788 | if (devices[i].bus_num == 0) | 793 | if (devices[i].bus_num == 0) |
789 | enable_spi0 = 1; | 794 | enable_spi0 = 1; |
790 | else | 795 | else |
diff --git a/arch/arm/mach-at91/at91sam9rl_devices.c b/arch/arm/mach-at91/at91sam9rl_devices.c index eda72e83037d..fe4ae22e8561 100644 --- a/arch/arm/mach-at91/at91sam9rl_devices.c +++ b/arch/arm/mach-at91/at91sam9rl_devices.c | |||
@@ -419,6 +419,9 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) | |||
419 | else | 419 | else |
420 | cs_pin = spi_standard_cs[devices[i].chip_select]; | 420 | cs_pin = spi_standard_cs[devices[i].chip_select]; |
421 | 421 | ||
422 | if (!gpio_is_valid(cs_pin)) | ||
423 | continue; | ||
424 | |||
422 | /* enable chip-select pin */ | 425 | /* enable chip-select pin */ |
423 | at91_set_gpio_output(cs_pin, 1); | 426 | at91_set_gpio_output(cs_pin, 1); |
424 | 427 | ||
diff --git a/arch/arm/mach-at91/at91sam9x5.c b/arch/arm/mach-at91/at91sam9x5.c index b6831eeb7b76..13c8cae60462 100644 --- a/arch/arm/mach-at91/at91sam9x5.c +++ b/arch/arm/mach-at91/at91sam9x5.c | |||
@@ -223,6 +223,8 @@ static struct clk_lookup periph_clocks_lookups[] = { | |||
223 | CLKDEV_CON_DEV_ID("usart", "f8028000.serial", &usart3_clk), | 223 | CLKDEV_CON_DEV_ID("usart", "f8028000.serial", &usart3_clk), |
224 | CLKDEV_CON_DEV_ID("t0_clk", "f8008000.timer", &tcb0_clk), | 224 | CLKDEV_CON_DEV_ID("t0_clk", "f8008000.timer", &tcb0_clk), |
225 | CLKDEV_CON_DEV_ID("t0_clk", "f800c000.timer", &tcb0_clk), | 225 | CLKDEV_CON_DEV_ID("t0_clk", "f800c000.timer", &tcb0_clk), |
226 | CLKDEV_CON_DEV_ID("dma_clk", "ffffec00.dma-controller", &dma0_clk), | ||
227 | CLKDEV_CON_DEV_ID("dma_clk", "ffffee00.dma-controller", &dma1_clk), | ||
226 | CLKDEV_CON_ID("pioA", &pioAB_clk), | 228 | CLKDEV_CON_ID("pioA", &pioAB_clk), |
227 | CLKDEV_CON_ID("pioB", &pioAB_clk), | 229 | CLKDEV_CON_ID("pioB", &pioAB_clk), |
228 | CLKDEV_CON_ID("pioC", &pioCD_clk), | 230 | CLKDEV_CON_ID("pioC", &pioCD_clk), |
diff --git a/arch/arm/mach-at91/board-sam9263ek.c b/arch/arm/mach-at91/board-sam9263ek.c index 66f0ddf4b2ae..2ffe50f3a9e9 100644 --- a/arch/arm/mach-at91/board-sam9263ek.c +++ b/arch/arm/mach-at91/board-sam9263ek.c | |||
@@ -74,6 +74,7 @@ static void __init ek_init_early(void) | |||
74 | static struct at91_usbh_data __initdata ek_usbh_data = { | 74 | static struct at91_usbh_data __initdata ek_usbh_data = { |
75 | .ports = 2, | 75 | .ports = 2, |
76 | .vbus_pin = { AT91_PIN_PA24, AT91_PIN_PA21 }, | 76 | .vbus_pin = { AT91_PIN_PA24, AT91_PIN_PA21 }, |
77 | .vbus_pin_active_low = {1, 1}, | ||
77 | .overcurrent_pin= {-EINVAL, -EINVAL}, | 78 | .overcurrent_pin= {-EINVAL, -EINVAL}, |
78 | }; | 79 | }; |
79 | 80 | ||
diff --git a/arch/arm/mach-at91/board-sam9m10g45ek.c b/arch/arm/mach-at91/board-sam9m10g45ek.c index e1bea73e6b30..c88e908ddd82 100644 --- a/arch/arm/mach-at91/board-sam9m10g45ek.c +++ b/arch/arm/mach-at91/board-sam9m10g45ek.c | |||
@@ -71,6 +71,7 @@ static void __init ek_init_early(void) | |||
71 | static struct at91_usbh_data __initdata ek_usbh_hs_data = { | 71 | static struct at91_usbh_data __initdata ek_usbh_hs_data = { |
72 | .ports = 2, | 72 | .ports = 2, |
73 | .vbus_pin = {AT91_PIN_PD1, AT91_PIN_PD3}, | 73 | .vbus_pin = {AT91_PIN_PD1, AT91_PIN_PD3}, |
74 | .vbus_pin_active_low = {1, 1}, | ||
74 | .overcurrent_pin= {-EINVAL, -EINVAL}, | 75 | .overcurrent_pin= {-EINVAL, -EINVAL}, |
75 | }; | 76 | }; |
76 | 77 | ||
diff --git a/arch/arm/mach-at91/include/mach/board.h b/arch/arm/mach-at91/include/mach/board.h index 544a5d5ce416..49a821192c65 100644 --- a/arch/arm/mach-at91/include/mach/board.h +++ b/arch/arm/mach-at91/include/mach/board.h | |||
@@ -86,14 +86,15 @@ extern void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *d | |||
86 | extern void __init at91_add_device_eth(struct macb_platform_data *data); | 86 | extern void __init at91_add_device_eth(struct macb_platform_data *data); |
87 | 87 | ||
88 | /* USB Host */ | 88 | /* USB Host */ |
89 | #define AT91_MAX_USBH_PORTS 3 | ||
89 | struct at91_usbh_data { | 90 | struct at91_usbh_data { |
90 | u8 ports; /* number of ports on root hub */ | 91 | int vbus_pin[AT91_MAX_USBH_PORTS]; /* port power-control pin */ |
91 | int vbus_pin[2]; /* port power-control pin */ | 92 | int overcurrent_pin[AT91_MAX_USBH_PORTS]; |
92 | u8 vbus_pin_active_low[2]; | 93 | u8 ports; /* number of ports on root hub */ |
93 | u8 overcurrent_supported; | 94 | u8 overcurrent_supported; |
94 | int overcurrent_pin[2]; | 95 | u8 vbus_pin_active_low[AT91_MAX_USBH_PORTS]; |
95 | u8 overcurrent_status[2]; | 96 | u8 overcurrent_status[AT91_MAX_USBH_PORTS]; |
96 | u8 overcurrent_changed[2]; | 97 | u8 overcurrent_changed[AT91_MAX_USBH_PORTS]; |
97 | }; | 98 | }; |
98 | extern void __init at91_add_device_usbh(struct at91_usbh_data *data); | 99 | extern void __init at91_add_device_usbh(struct at91_usbh_data *data); |
99 | extern void __init at91_add_device_usbh_ohci(struct at91_usbh_data *data); | 100 | extern void __init at91_add_device_usbh_ohci(struct at91_usbh_data *data); |
diff --git a/arch/arm/mach-at91/include/mach/io.h b/arch/arm/mach-at91/include/mach/io.h new file mode 100644 index 000000000000..2d9ca0455745 --- /dev/null +++ b/arch/arm/mach-at91/include/mach/io.h | |||
@@ -0,0 +1,27 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-at91/include/mach/io.h | ||
3 | * | ||
4 | * Copyright (C) 2003 SAN People | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
19 | */ | ||
20 | |||
21 | #ifndef __ASM_ARCH_IO_H | ||
22 | #define __ASM_ARCH_IO_H | ||
23 | |||
24 | #define IO_SPACE_LIMIT 0xFFFFFFFF | ||
25 | #define __io(a) __typesafe_io(a) | ||
26 | |||
27 | #endif | ||
diff --git a/arch/arm/mach-exynos/common.c b/arch/arm/mach-exynos/common.c index e6cc50e94a58..8614aab47cc0 100644 --- a/arch/arm/mach-exynos/common.c +++ b/arch/arm/mach-exynos/common.c | |||
@@ -583,10 +583,11 @@ core_initcall(exynos_core_init); | |||
583 | #ifdef CONFIG_CACHE_L2X0 | 583 | #ifdef CONFIG_CACHE_L2X0 |
584 | static int __init exynos4_l2x0_cache_init(void) | 584 | static int __init exynos4_l2x0_cache_init(void) |
585 | { | 585 | { |
586 | int ret; | ||
587 | |||
586 | if (soc_is_exynos5250()) | 588 | if (soc_is_exynos5250()) |
587 | return 0; | 589 | return 0; |
588 | 590 | ||
589 | int ret; | ||
590 | ret = l2x0_of_init(L2_AUX_VAL, L2_AUX_MASK); | 591 | ret = l2x0_of_init(L2_AUX_VAL, L2_AUX_MASK); |
591 | if (!ret) { | 592 | if (!ret) { |
592 | l2x0_regs_phys = virt_to_phys(&l2x0_saved_regs); | 593 | l2x0_regs_phys = virt_to_phys(&l2x0_saved_regs); |
diff --git a/arch/arm/mach-exynos/dma.c b/arch/arm/mach-exynos/dma.c index 3983abee4264..69aaa4503205 100644 --- a/arch/arm/mach-exynos/dma.c +++ b/arch/arm/mach-exynos/dma.c | |||
@@ -35,8 +35,6 @@ | |||
35 | #include <mach/irqs.h> | 35 | #include <mach/irqs.h> |
36 | #include <mach/dma.h> | 36 | #include <mach/dma.h> |
37 | 37 | ||
38 | static u64 dma_dmamask = DMA_BIT_MASK(32); | ||
39 | |||
40 | static u8 exynos4210_pdma0_peri[] = { | 38 | static u8 exynos4210_pdma0_peri[] = { |
41 | DMACH_PCM0_RX, | 39 | DMACH_PCM0_RX, |
42 | DMACH_PCM0_TX, | 40 | DMACH_PCM0_TX, |
diff --git a/arch/arm/mach-exynos/include/mach/debug-macro.S b/arch/arm/mach-exynos/include/mach/debug-macro.S index 6c857ff0b5d8..e0c86ea475e7 100644 --- a/arch/arm/mach-exynos/include/mach/debug-macro.S +++ b/arch/arm/mach-exynos/include/mach/debug-macro.S | |||
@@ -21,10 +21,9 @@ | |||
21 | */ | 21 | */ |
22 | 22 | ||
23 | .macro addruart, rp, rv, tmp | 23 | .macro addruart, rp, rv, tmp |
24 | mov \rp, #0x10000000 | 24 | mrc p15, 0, \tmp, c0, c0, 0 |
25 | ldr \rp, [\rp, #0x0] | 25 | and \tmp, \tmp, #0xf0 |
26 | and \rp, \rp, #0xf00000 | 26 | teq \tmp, #0xf0 @@ A15 |
27 | teq \rp, #0x500000 @@ EXYNOS5 | ||
28 | ldreq \rp, =EXYNOS5_PA_UART | 27 | ldreq \rp, =EXYNOS5_PA_UART |
29 | movne \rp, #EXYNOS4_PA_UART @@ EXYNOS4 | 28 | movne \rp, #EXYNOS4_PA_UART @@ EXYNOS4 |
30 | ldr \rv, =S3C_VA_UART | 29 | ldr \rv, =S3C_VA_UART |
diff --git a/arch/arm/mach-exynos/include/mach/uncompress.h b/arch/arm/mach-exynos/include/mach/uncompress.h index 493f4f365ddf..2979995d5a6a 100644 --- a/arch/arm/mach-exynos/include/mach/uncompress.h +++ b/arch/arm/mach-exynos/include/mach/uncompress.h | |||
@@ -20,9 +20,24 @@ volatile u8 *uart_base; | |||
20 | 20 | ||
21 | #include <plat/uncompress.h> | 21 | #include <plat/uncompress.h> |
22 | 22 | ||
23 | static unsigned int __raw_readl(unsigned int ptr) | ||
24 | { | ||
25 | return *((volatile unsigned int *)ptr); | ||
26 | } | ||
27 | |||
23 | static void arch_detect_cpu(void) | 28 | static void arch_detect_cpu(void) |
24 | { | 29 | { |
25 | if (machine_is_smdk5250()) | 30 | u32 chip_id = __raw_readl(EXYNOS_PA_CHIPID); |
31 | |||
32 | /* | ||
33 | * product_id is bits 31:12 | ||
34 | * bits 23:20 describe the exynosX family | ||
35 | * | ||
36 | */ | ||
37 | chip_id >>= 20; | ||
38 | chip_id &= 0xf; | ||
39 | |||
40 | if (chip_id == 0x5) | ||
26 | uart_base = (volatile u8 *)EXYNOS5_PA_UART + (S3C_UART_OFFSET * CONFIG_S3C_LOWLEVEL_UART_PORT); | 41 | uart_base = (volatile u8 *)EXYNOS5_PA_UART + (S3C_UART_OFFSET * CONFIG_S3C_LOWLEVEL_UART_PORT); |
27 | else | 42 | else |
28 | uart_base = (volatile u8 *)EXYNOS4_PA_UART + (S3C_UART_OFFSET * CONFIG_S3C_LOWLEVEL_UART_PORT); | 43 | uart_base = (volatile u8 *)EXYNOS4_PA_UART + (S3C_UART_OFFSET * CONFIG_S3C_LOWLEVEL_UART_PORT); |
diff --git a/arch/arm/mach-imx/clock-imx27.c b/arch/arm/mach-imx/clock-imx27.c index b9a95ed75553..98e04f5a87dd 100644 --- a/arch/arm/mach-imx/clock-imx27.c +++ b/arch/arm/mach-imx/clock-imx27.c | |||
@@ -662,6 +662,7 @@ static struct clk_lookup lookups[] = { | |||
662 | _REGISTER_CLOCK(NULL, "dma", dma_clk) | 662 | _REGISTER_CLOCK(NULL, "dma", dma_clk) |
663 | _REGISTER_CLOCK(NULL, "rtic", rtic_clk) | 663 | _REGISTER_CLOCK(NULL, "rtic", rtic_clk) |
664 | _REGISTER_CLOCK(NULL, "brom", brom_clk) | 664 | _REGISTER_CLOCK(NULL, "brom", brom_clk) |
665 | _REGISTER_CLOCK(NULL, "emma", emma_clk) | ||
665 | _REGISTER_CLOCK("m2m-emmaprp.0", NULL, emma_clk) | 666 | _REGISTER_CLOCK("m2m-emmaprp.0", NULL, emma_clk) |
666 | _REGISTER_CLOCK(NULL, "slcdc", slcdc_clk) | 667 | _REGISTER_CLOCK(NULL, "slcdc", slcdc_clk) |
667 | _REGISTER_CLOCK("imx27-fec.0", NULL, fec_clk) | 668 | _REGISTER_CLOCK("imx27-fec.0", NULL, fec_clk) |
diff --git a/arch/arm/mach-imx/clock-imx35.c b/arch/arm/mach-imx/clock-imx35.c index 1e279af656ad..e56c1a83eee3 100644 --- a/arch/arm/mach-imx/clock-imx35.c +++ b/arch/arm/mach-imx/clock-imx35.c | |||
@@ -483,7 +483,7 @@ static struct clk_lookup lookups[] = { | |||
483 | _REGISTER_CLOCK("imx2-wdt.0", NULL, wdog_clk) | 483 | _REGISTER_CLOCK("imx2-wdt.0", NULL, wdog_clk) |
484 | _REGISTER_CLOCK(NULL, "max", max_clk) | 484 | _REGISTER_CLOCK(NULL, "max", max_clk) |
485 | _REGISTER_CLOCK(NULL, "audmux", audmux_clk) | 485 | _REGISTER_CLOCK(NULL, "audmux", audmux_clk) |
486 | _REGISTER_CLOCK(NULL, "csi", csi_clk) | 486 | _REGISTER_CLOCK("mx3-camera.0", NULL, csi_clk) |
487 | _REGISTER_CLOCK(NULL, "iim", iim_clk) | 487 | _REGISTER_CLOCK(NULL, "iim", iim_clk) |
488 | _REGISTER_CLOCK(NULL, "gpu2d", gpu2d_clk) | 488 | _REGISTER_CLOCK(NULL, "gpu2d", gpu2d_clk) |
489 | _REGISTER_CLOCK("mxc_nand.0", NULL, nfc_clk) | 489 | _REGISTER_CLOCK("mxc_nand.0", NULL, nfc_clk) |
diff --git a/arch/arm/mach-imx/mach-armadillo5x0.c b/arch/arm/mach-imx/mach-armadillo5x0.c index 27bc27e6ea41..c650145d1646 100644 --- a/arch/arm/mach-imx/mach-armadillo5x0.c +++ b/arch/arm/mach-imx/mach-armadillo5x0.c | |||
@@ -38,6 +38,8 @@ | |||
38 | #include <linux/usb/otg.h> | 38 | #include <linux/usb/otg.h> |
39 | #include <linux/usb/ulpi.h> | 39 | #include <linux/usb/ulpi.h> |
40 | #include <linux/delay.h> | 40 | #include <linux/delay.h> |
41 | #include <linux/regulator/machine.h> | ||
42 | #include <linux/regulator/fixed.h> | ||
41 | 43 | ||
42 | #include <mach/hardware.h> | 44 | #include <mach/hardware.h> |
43 | #include <asm/mach-types.h> | 45 | #include <asm/mach-types.h> |
@@ -479,6 +481,11 @@ static struct platform_device *devices[] __initdata = { | |||
479 | &armadillo5x0_smc911x_device, | 481 | &armadillo5x0_smc911x_device, |
480 | }; | 482 | }; |
481 | 483 | ||
484 | static struct regulator_consumer_supply dummy_supplies[] = { | ||
485 | REGULATOR_SUPPLY("vdd33a", "smsc911x"), | ||
486 | REGULATOR_SUPPLY("vddvario", "smsc911x"), | ||
487 | }; | ||
488 | |||
482 | /* | 489 | /* |
483 | * Perform board specific initializations | 490 | * Perform board specific initializations |
484 | */ | 491 | */ |
@@ -489,6 +496,8 @@ static void __init armadillo5x0_init(void) | |||
489 | mxc_iomux_setup_multiple_pins(armadillo5x0_pins, | 496 | mxc_iomux_setup_multiple_pins(armadillo5x0_pins, |
490 | ARRAY_SIZE(armadillo5x0_pins), "armadillo5x0"); | 497 | ARRAY_SIZE(armadillo5x0_pins), "armadillo5x0"); |
491 | 498 | ||
499 | regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies)); | ||
500 | |||
492 | platform_add_devices(devices, ARRAY_SIZE(devices)); | 501 | platform_add_devices(devices, ARRAY_SIZE(devices)); |
493 | imx_add_gpio_keys(&armadillo5x0_button_data); | 502 | imx_add_gpio_keys(&armadillo5x0_button_data); |
494 | imx31_add_imx_i2c1(NULL); | 503 | imx31_add_imx_i2c1(NULL); |
diff --git a/arch/arm/mach-imx/mach-kzm_arm11_01.c b/arch/arm/mach-imx/mach-kzm_arm11_01.c index fc78e8071cd1..15a26e908260 100644 --- a/arch/arm/mach-imx/mach-kzm_arm11_01.c +++ b/arch/arm/mach-imx/mach-kzm_arm11_01.c | |||
@@ -24,6 +24,8 @@ | |||
24 | #include <linux/serial_8250.h> | 24 | #include <linux/serial_8250.h> |
25 | #include <linux/smsc911x.h> | 25 | #include <linux/smsc911x.h> |
26 | #include <linux/types.h> | 26 | #include <linux/types.h> |
27 | #include <linux/regulator/machine.h> | ||
28 | #include <linux/regulator/fixed.h> | ||
27 | 29 | ||
28 | #include <asm/irq.h> | 30 | #include <asm/irq.h> |
29 | #include <asm/mach-types.h> | 31 | #include <asm/mach-types.h> |
@@ -166,6 +168,11 @@ static struct platform_device kzm_smsc9118_device = { | |||
166 | }, | 168 | }, |
167 | }; | 169 | }; |
168 | 170 | ||
171 | static struct regulator_consumer_supply dummy_supplies[] = { | ||
172 | REGULATOR_SUPPLY("vdd33a", "smsc911x"), | ||
173 | REGULATOR_SUPPLY("vddvario", "smsc911x"), | ||
174 | }; | ||
175 | |||
169 | static int __init kzm_init_smsc9118(void) | 176 | static int __init kzm_init_smsc9118(void) |
170 | { | 177 | { |
171 | /* | 178 | /* |
@@ -175,6 +182,8 @@ static int __init kzm_init_smsc9118(void) | |||
175 | gpio_request(IOMUX_TO_GPIO(MX31_PIN_GPIO1_2), "smsc9118-int"); | 182 | gpio_request(IOMUX_TO_GPIO(MX31_PIN_GPIO1_2), "smsc9118-int"); |
176 | gpio_direction_input(IOMUX_TO_GPIO(MX31_PIN_GPIO1_2)); | 183 | gpio_direction_input(IOMUX_TO_GPIO(MX31_PIN_GPIO1_2)); |
177 | 184 | ||
185 | regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies)); | ||
186 | |||
178 | return platform_device_register(&kzm_smsc9118_device); | 187 | return platform_device_register(&kzm_smsc9118_device); |
179 | } | 188 | } |
180 | #else | 189 | #else |
diff --git a/arch/arm/mach-imx/mach-mx31lilly.c b/arch/arm/mach-imx/mach-mx31lilly.c index 02401bbd6d53..83714b0cc290 100644 --- a/arch/arm/mach-imx/mach-mx31lilly.c +++ b/arch/arm/mach-imx/mach-mx31lilly.c | |||
@@ -34,6 +34,8 @@ | |||
34 | #include <linux/mfd/mc13783.h> | 34 | #include <linux/mfd/mc13783.h> |
35 | #include <linux/usb/otg.h> | 35 | #include <linux/usb/otg.h> |
36 | #include <linux/usb/ulpi.h> | 36 | #include <linux/usb/ulpi.h> |
37 | #include <linux/regulator/machine.h> | ||
38 | #include <linux/regulator/fixed.h> | ||
37 | 39 | ||
38 | #include <asm/mach-types.h> | 40 | #include <asm/mach-types.h> |
39 | #include <asm/mach/arch.h> | 41 | #include <asm/mach/arch.h> |
@@ -242,6 +244,11 @@ static struct platform_device *devices[] __initdata = { | |||
242 | static int mx31lilly_baseboard; | 244 | static int mx31lilly_baseboard; |
243 | core_param(mx31lilly_baseboard, mx31lilly_baseboard, int, 0444); | 245 | core_param(mx31lilly_baseboard, mx31lilly_baseboard, int, 0444); |
244 | 246 | ||
247 | static struct regulator_consumer_supply dummy_supplies[] = { | ||
248 | REGULATOR_SUPPLY("vdd33a", "smsc911x"), | ||
249 | REGULATOR_SUPPLY("vddvario", "smsc911x"), | ||
250 | }; | ||
251 | |||
245 | static void __init mx31lilly_board_init(void) | 252 | static void __init mx31lilly_board_init(void) |
246 | { | 253 | { |
247 | imx31_soc_init(); | 254 | imx31_soc_init(); |
@@ -280,6 +287,8 @@ static void __init mx31lilly_board_init(void) | |||
280 | imx31_add_spi_imx1(&spi1_pdata); | 287 | imx31_add_spi_imx1(&spi1_pdata); |
281 | spi_register_board_info(&mc13783_dev, 1); | 288 | spi_register_board_info(&mc13783_dev, 1); |
282 | 289 | ||
290 | regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies)); | ||
291 | |||
283 | platform_add_devices(devices, ARRAY_SIZE(devices)); | 292 | platform_add_devices(devices, ARRAY_SIZE(devices)); |
284 | 293 | ||
285 | /* USB */ | 294 | /* USB */ |
diff --git a/arch/arm/mach-imx/mach-mx31lite.c b/arch/arm/mach-imx/mach-mx31lite.c index ef80751712e7..0abef5f13df5 100644 --- a/arch/arm/mach-imx/mach-mx31lite.c +++ b/arch/arm/mach-imx/mach-mx31lite.c | |||
@@ -29,6 +29,8 @@ | |||
29 | #include <linux/usb/ulpi.h> | 29 | #include <linux/usb/ulpi.h> |
30 | #include <linux/mtd/physmap.h> | 30 | #include <linux/mtd/physmap.h> |
31 | #include <linux/delay.h> | 31 | #include <linux/delay.h> |
32 | #include <linux/regulator/machine.h> | ||
33 | #include <linux/regulator/fixed.h> | ||
32 | 34 | ||
33 | #include <asm/mach-types.h> | 35 | #include <asm/mach-types.h> |
34 | #include <asm/mach/arch.h> | 36 | #include <asm/mach/arch.h> |
@@ -226,6 +228,11 @@ void __init mx31lite_map_io(void) | |||
226 | static int mx31lite_baseboard; | 228 | static int mx31lite_baseboard; |
227 | core_param(mx31lite_baseboard, mx31lite_baseboard, int, 0444); | 229 | core_param(mx31lite_baseboard, mx31lite_baseboard, int, 0444); |
228 | 230 | ||
231 | static struct regulator_consumer_supply dummy_supplies[] = { | ||
232 | REGULATOR_SUPPLY("vdd33a", "smsc911x"), | ||
233 | REGULATOR_SUPPLY("vddvario", "smsc911x"), | ||
234 | }; | ||
235 | |||
229 | static void __init mx31lite_init(void) | 236 | static void __init mx31lite_init(void) |
230 | { | 237 | { |
231 | int ret; | 238 | int ret; |
@@ -259,6 +266,8 @@ static void __init mx31lite_init(void) | |||
259 | if (usbh2_pdata.otg) | 266 | if (usbh2_pdata.otg) |
260 | imx31_add_mxc_ehci_hs(2, &usbh2_pdata); | 267 | imx31_add_mxc_ehci_hs(2, &usbh2_pdata); |
261 | 268 | ||
269 | regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies)); | ||
270 | |||
262 | /* SMSC9117 IRQ pin */ | 271 | /* SMSC9117 IRQ pin */ |
263 | ret = gpio_request(IOMUX_TO_GPIO(MX31_PIN_SFS6), "sms9117-irq"); | 272 | ret = gpio_request(IOMUX_TO_GPIO(MX31_PIN_SFS6), "sms9117-irq"); |
264 | if (ret) | 273 | if (ret) |
diff --git a/arch/arm/mach-imx/mach-mx35_3ds.c b/arch/arm/mach-imx/mach-mx35_3ds.c index e14291d89e4f..6ae51c6b95b7 100644 --- a/arch/arm/mach-imx/mach-mx35_3ds.c +++ b/arch/arm/mach-imx/mach-mx35_3ds.c | |||
@@ -97,7 +97,7 @@ static struct i2c_board_info __initdata i2c_devices_3ds[] = { | |||
97 | static int lcd_power_gpio = -ENXIO; | 97 | static int lcd_power_gpio = -ENXIO; |
98 | 98 | ||
99 | static int mc9s08dz60_gpiochip_match(struct gpio_chip *chip, | 99 | static int mc9s08dz60_gpiochip_match(struct gpio_chip *chip, |
100 | void *data) | 100 | const void *data) |
101 | { | 101 | { |
102 | return !strcmp(chip->label, data); | 102 | return !strcmp(chip->label, data); |
103 | } | 103 | } |
diff --git a/arch/arm/mach-imx/mach-mx53_ard.c b/arch/arm/mach-imx/mach-mx53_ard.c index 753f4fc9ec04..05641980dc5e 100644 --- a/arch/arm/mach-imx/mach-mx53_ard.c +++ b/arch/arm/mach-imx/mach-mx53_ard.c | |||
@@ -23,6 +23,8 @@ | |||
23 | #include <linux/delay.h> | 23 | #include <linux/delay.h> |
24 | #include <linux/gpio.h> | 24 | #include <linux/gpio.h> |
25 | #include <linux/smsc911x.h> | 25 | #include <linux/smsc911x.h> |
26 | #include <linux/regulator/machine.h> | ||
27 | #include <linux/regulator/fixed.h> | ||
26 | 28 | ||
27 | #include <mach/common.h> | 29 | #include <mach/common.h> |
28 | #include <mach/hardware.h> | 30 | #include <mach/hardware.h> |
@@ -214,6 +216,11 @@ static int weim_cs_config(void) | |||
214 | return 0; | 216 | return 0; |
215 | } | 217 | } |
216 | 218 | ||
219 | static struct regulator_consumer_supply dummy_supplies[] = { | ||
220 | REGULATOR_SUPPLY("vdd33a", "smsc911x"), | ||
221 | REGULATOR_SUPPLY("vddvario", "smsc911x"), | ||
222 | }; | ||
223 | |||
217 | void __init imx53_ard_common_init(void) | 224 | void __init imx53_ard_common_init(void) |
218 | { | 225 | { |
219 | mxc_iomux_v3_setup_multiple_pads(mx53_ard_pads, | 226 | mxc_iomux_v3_setup_multiple_pads(mx53_ard_pads, |
@@ -232,6 +239,7 @@ static void __init mx53_ard_board_init(void) | |||
232 | 239 | ||
233 | imx53_ard_common_init(); | 240 | imx53_ard_common_init(); |
234 | mx53_ard_io_init(); | 241 | mx53_ard_io_init(); |
242 | regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies)); | ||
235 | platform_add_devices(devices, ARRAY_SIZE(devices)); | 243 | platform_add_devices(devices, ARRAY_SIZE(devices)); |
236 | 244 | ||
237 | imx53_add_sdhci_esdhc_imx(0, &mx53_ard_sd1_data); | 245 | imx53_add_sdhci_esdhc_imx(0, &mx53_ard_sd1_data); |
diff --git a/arch/arm/mach-msm/smd_debug.c b/arch/arm/mach-msm/smd_debug.c index 0c56a5aaf588..c56df9e932ae 100644 --- a/arch/arm/mach-msm/smd_debug.c +++ b/arch/arm/mach-msm/smd_debug.c | |||
@@ -203,15 +203,9 @@ static ssize_t debug_read(struct file *file, char __user *buf, | |||
203 | return simple_read_from_buffer(buf, count, ppos, debug_buffer, bsize); | 203 | return simple_read_from_buffer(buf, count, ppos, debug_buffer, bsize); |
204 | } | 204 | } |
205 | 205 | ||
206 | static int debug_open(struct inode *inode, struct file *file) | ||
207 | { | ||
208 | file->private_data = inode->i_private; | ||
209 | return 0; | ||
210 | } | ||
211 | |||
212 | static const struct file_operations debug_ops = { | 206 | static const struct file_operations debug_ops = { |
213 | .read = debug_read, | 207 | .read = debug_read, |
214 | .open = debug_open, | 208 | .open = simple_open, |
215 | .llseek = default_llseek, | 209 | .llseek = default_llseek, |
216 | }; | 210 | }; |
217 | 211 | ||
diff --git a/arch/arm/mach-omap1/include/mach/io.h b/arch/arm/mach-omap1/include/mach/io.h new file mode 100644 index 000000000000..ce4f8005b26f --- /dev/null +++ b/arch/arm/mach-omap1/include/mach/io.h | |||
@@ -0,0 +1,45 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-omap1/include/mach/io.h | ||
3 | * | ||
4 | * IO definitions for TI OMAP processors and boards | ||
5 | * | ||
6 | * Copied from arch/arm/mach-sa1100/include/mach/io.h | ||
7 | * Copyright (C) 1997-1999 Russell King | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify it | ||
10 | * under the terms of the GNU General Public License as published by the | ||
11 | * Free Software Foundation; either version 2 of the License, or (at your | ||
12 | * option) any later version. | ||
13 | * | ||
14 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED | ||
15 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
16 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN | ||
17 | * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
18 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
19 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | ||
20 | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||
21 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
22 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
23 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
24 | * | ||
25 | * You should have received a copy of the GNU General Public License along | ||
26 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
27 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
28 | * | ||
29 | * Modifications: | ||
30 | * 06-12-1997 RMK Created. | ||
31 | * 07-04-1999 RMK Major cleanup | ||
32 | */ | ||
33 | |||
34 | #ifndef __ASM_ARM_ARCH_IO_H | ||
35 | #define __ASM_ARM_ARCH_IO_H | ||
36 | |||
37 | #define IO_SPACE_LIMIT 0xffffffff | ||
38 | |||
39 | /* | ||
40 | * We don't actually have real ISA nor PCI buses, but there is so many | ||
41 | * drivers out there that might just work if we fake them... | ||
42 | */ | ||
43 | #define __io(a) __typesafe_io(a) | ||
44 | |||
45 | #endif | ||
diff --git a/arch/arm/mach-omap2/board-cm-t35.c b/arch/arm/mach-omap2/board-cm-t35.c index 41b0a2fe0b04..909a8b91b564 100644 --- a/arch/arm/mach-omap2/board-cm-t35.c +++ b/arch/arm/mach-omap2/board-cm-t35.c | |||
@@ -26,6 +26,7 @@ | |||
26 | 26 | ||
27 | #include <linux/i2c/at24.h> | 27 | #include <linux/i2c/at24.h> |
28 | #include <linux/i2c/twl.h> | 28 | #include <linux/i2c/twl.h> |
29 | #include <linux/regulator/fixed.h> | ||
29 | #include <linux/regulator/machine.h> | 30 | #include <linux/regulator/machine.h> |
30 | #include <linux/mmc/host.h> | 31 | #include <linux/mmc/host.h> |
31 | 32 | ||
@@ -81,8 +82,23 @@ static struct omap_smsc911x_platform_data sb_t35_smsc911x_cfg = { | |||
81 | .flags = SMSC911X_USE_32BIT | SMSC911X_SAVE_MAC_ADDRESS, | 82 | .flags = SMSC911X_USE_32BIT | SMSC911X_SAVE_MAC_ADDRESS, |
82 | }; | 83 | }; |
83 | 84 | ||
85 | static struct regulator_consumer_supply cm_t35_smsc911x_supplies[] = { | ||
86 | REGULATOR_SUPPLY("vddvario", "smsc911x.0"), | ||
87 | REGULATOR_SUPPLY("vdd33a", "smsc911x.0"), | ||
88 | }; | ||
89 | |||
90 | static struct regulator_consumer_supply sb_t35_smsc911x_supplies[] = { | ||
91 | REGULATOR_SUPPLY("vddvario", "smsc911x.1"), | ||
92 | REGULATOR_SUPPLY("vdd33a", "smsc911x.1"), | ||
93 | }; | ||
94 | |||
84 | static void __init cm_t35_init_ethernet(void) | 95 | static void __init cm_t35_init_ethernet(void) |
85 | { | 96 | { |
97 | regulator_register_fixed(0, cm_t35_smsc911x_supplies, | ||
98 | ARRAY_SIZE(cm_t35_smsc911x_supplies)); | ||
99 | regulator_register_fixed(1, sb_t35_smsc911x_supplies, | ||
100 | ARRAY_SIZE(sb_t35_smsc911x_supplies)); | ||
101 | |||
86 | gpmc_smsc911x_init(&cm_t35_smsc911x_cfg); | 102 | gpmc_smsc911x_init(&cm_t35_smsc911x_cfg); |
87 | gpmc_smsc911x_init(&sb_t35_smsc911x_cfg); | 103 | gpmc_smsc911x_init(&sb_t35_smsc911x_cfg); |
88 | } | 104 | } |
diff --git a/arch/arm/mach-omap2/board-igep0020.c b/arch/arm/mach-omap2/board-igep0020.c index e558800adfdf..930c0d380435 100644 --- a/arch/arm/mach-omap2/board-igep0020.c +++ b/arch/arm/mach-omap2/board-igep0020.c | |||
@@ -634,8 +634,14 @@ static void __init igep_wlan_bt_init(void) | |||
634 | static inline void __init igep_wlan_bt_init(void) { } | 634 | static inline void __init igep_wlan_bt_init(void) { } |
635 | #endif | 635 | #endif |
636 | 636 | ||
637 | static struct regulator_consumer_supply dummy_supplies[] = { | ||
638 | REGULATOR_SUPPLY("vddvario", "smsc911x.0"), | ||
639 | REGULATOR_SUPPLY("vdd33a", "smsc911x.0"), | ||
640 | }; | ||
641 | |||
637 | static void __init igep_init(void) | 642 | static void __init igep_init(void) |
638 | { | 643 | { |
644 | regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies)); | ||
639 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); | 645 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); |
640 | 646 | ||
641 | /* Get IGEP2 hardware revision */ | 647 | /* Get IGEP2 hardware revision */ |
diff --git a/arch/arm/mach-omap2/board-ldp.c b/arch/arm/mach-omap2/board-ldp.c index d50a562adfa0..1b6049567ab4 100644 --- a/arch/arm/mach-omap2/board-ldp.c +++ b/arch/arm/mach-omap2/board-ldp.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <linux/err.h> | 22 | #include <linux/err.h> |
23 | #include <linux/clk.h> | 23 | #include <linux/clk.h> |
24 | #include <linux/spi/spi.h> | 24 | #include <linux/spi/spi.h> |
25 | #include <linux/regulator/fixed.h> | ||
25 | #include <linux/regulator/machine.h> | 26 | #include <linux/regulator/machine.h> |
26 | #include <linux/i2c/twl.h> | 27 | #include <linux/i2c/twl.h> |
27 | #include <linux/io.h> | 28 | #include <linux/io.h> |
@@ -410,8 +411,14 @@ static struct mtd_partition ldp_nand_partitions[] = { | |||
410 | 411 | ||
411 | }; | 412 | }; |
412 | 413 | ||
414 | static struct regulator_consumer_supply dummy_supplies[] = { | ||
415 | REGULATOR_SUPPLY("vddvario", "smsc911x.0"), | ||
416 | REGULATOR_SUPPLY("vdd33a", "smsc911x.0"), | ||
417 | }; | ||
418 | |||
413 | static void __init omap_ldp_init(void) | 419 | static void __init omap_ldp_init(void) |
414 | { | 420 | { |
421 | regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies)); | ||
415 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); | 422 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); |
416 | ldp_init_smsc911x(); | 423 | ldp_init_smsc911x(); |
417 | omap_i2c_init(); | 424 | omap_i2c_init(); |
diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-omap2/board-omap3evm.c index 4c90f078abe1..49df12735b41 100644 --- a/arch/arm/mach-omap2/board-omap3evm.c +++ b/arch/arm/mach-omap2/board-omap3evm.c | |||
@@ -114,15 +114,6 @@ static struct omap_smsc911x_platform_data smsc911x_cfg = { | |||
114 | 114 | ||
115 | static inline void __init omap3evm_init_smsc911x(void) | 115 | static inline void __init omap3evm_init_smsc911x(void) |
116 | { | 116 | { |
117 | struct clk *l3ck; | ||
118 | unsigned int rate; | ||
119 | |||
120 | l3ck = clk_get(NULL, "l3_ck"); | ||
121 | if (IS_ERR(l3ck)) | ||
122 | rate = 100000000; | ||
123 | else | ||
124 | rate = clk_get_rate(l3ck); | ||
125 | |||
126 | /* Configure ethernet controller reset gpio */ | 117 | /* Configure ethernet controller reset gpio */ |
127 | if (cpu_is_omap3430()) { | 118 | if (cpu_is_omap3430()) { |
128 | if (get_omap3_evm_rev() == OMAP3EVM_BOARD_GEN_1) | 119 | if (get_omap3_evm_rev() == OMAP3EVM_BOARD_GEN_1) |
@@ -632,9 +623,15 @@ static void __init omap3_evm_wl12xx_init(void) | |||
632 | #endif | 623 | #endif |
633 | } | 624 | } |
634 | 625 | ||
626 | static struct regulator_consumer_supply dummy_supplies[] = { | ||
627 | REGULATOR_SUPPLY("vddvario", "smsc911x.0"), | ||
628 | REGULATOR_SUPPLY("vdd33a", "smsc911x.0"), | ||
629 | }; | ||
630 | |||
635 | static void __init omap3_evm_init(void) | 631 | static void __init omap3_evm_init(void) |
636 | { | 632 | { |
637 | omap3_evm_get_revision(); | 633 | omap3_evm_get_revision(); |
634 | regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies)); | ||
638 | 635 | ||
639 | if (cpu_is_omap3630()) | 636 | if (cpu_is_omap3630()) |
640 | omap3_mux_init(omap36x_board_mux, OMAP_PACKAGE_CBB); | 637 | omap3_mux_init(omap36x_board_mux, OMAP_PACKAGE_CBB); |
diff --git a/arch/arm/mach-omap2/board-omap3logic.c b/arch/arm/mach-omap2/board-omap3logic.c index 4a7d8c8a75da..9b3c141ff51b 100644 --- a/arch/arm/mach-omap2/board-omap3logic.c +++ b/arch/arm/mach-omap2/board-omap3logic.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <linux/io.h> | 23 | #include <linux/io.h> |
24 | #include <linux/gpio.h> | 24 | #include <linux/gpio.h> |
25 | 25 | ||
26 | #include <linux/regulator/fixed.h> | ||
26 | #include <linux/regulator/machine.h> | 27 | #include <linux/regulator/machine.h> |
27 | 28 | ||
28 | #include <linux/i2c/twl.h> | 29 | #include <linux/i2c/twl.h> |
@@ -188,8 +189,14 @@ static struct omap_board_mux board_mux[] __initdata = { | |||
188 | }; | 189 | }; |
189 | #endif | 190 | #endif |
190 | 191 | ||
192 | static struct regulator_consumer_supply dummy_supplies[] = { | ||
193 | REGULATOR_SUPPLY("vddvario", "smsc911x.0"), | ||
194 | REGULATOR_SUPPLY("vdd33a", "smsc911x.0"), | ||
195 | }; | ||
196 | |||
191 | static void __init omap3logic_init(void) | 197 | static void __init omap3logic_init(void) |
192 | { | 198 | { |
199 | regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies)); | ||
193 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); | 200 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); |
194 | omap3torpedo_fix_pbias_voltage(); | 201 | omap3torpedo_fix_pbias_voltage(); |
195 | omap3logic_i2c_init(); | 202 | omap3logic_i2c_init(); |
diff --git a/arch/arm/mach-omap2/board-omap3stalker.c b/arch/arm/mach-omap2/board-omap3stalker.c index 641004380795..4dffc95bddd2 100644 --- a/arch/arm/mach-omap2/board-omap3stalker.c +++ b/arch/arm/mach-omap2/board-omap3stalker.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/input.h> | 24 | #include <linux/input.h> |
25 | #include <linux/gpio_keys.h> | 25 | #include <linux/gpio_keys.h> |
26 | 26 | ||
27 | #include <linux/regulator/fixed.h> | ||
27 | #include <linux/regulator/machine.h> | 28 | #include <linux/regulator/machine.h> |
28 | #include <linux/i2c/twl.h> | 29 | #include <linux/i2c/twl.h> |
29 | #include <linux/mmc/host.h> | 30 | #include <linux/mmc/host.h> |
@@ -72,15 +73,6 @@ static struct omap_smsc911x_platform_data smsc911x_cfg = { | |||
72 | 73 | ||
73 | static inline void __init omap3stalker_init_eth(void) | 74 | static inline void __init omap3stalker_init_eth(void) |
74 | { | 75 | { |
75 | struct clk *l3ck; | ||
76 | unsigned int rate; | ||
77 | |||
78 | l3ck = clk_get(NULL, "l3_ck"); | ||
79 | if (IS_ERR(l3ck)) | ||
80 | rate = 100000000; | ||
81 | else | ||
82 | rate = clk_get_rate(l3ck); | ||
83 | |||
84 | omap_mux_init_gpio(19, OMAP_PIN_INPUT_PULLUP); | 76 | omap_mux_init_gpio(19, OMAP_PIN_INPUT_PULLUP); |
85 | gpmc_smsc911x_init(&smsc911x_cfg); | 77 | gpmc_smsc911x_init(&smsc911x_cfg); |
86 | } | 78 | } |
@@ -419,8 +411,14 @@ static struct omap_board_mux board_mux[] __initdata = { | |||
419 | }; | 411 | }; |
420 | #endif | 412 | #endif |
421 | 413 | ||
414 | static struct regulator_consumer_supply dummy_supplies[] = { | ||
415 | REGULATOR_SUPPLY("vddvario", "smsc911x.0"), | ||
416 | REGULATOR_SUPPLY("vdd33a", "smsc911x.0"), | ||
417 | }; | ||
418 | |||
422 | static void __init omap3_stalker_init(void) | 419 | static void __init omap3_stalker_init(void) |
423 | { | 420 | { |
421 | regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies)); | ||
424 | omap3_mux_init(board_mux, OMAP_PACKAGE_CUS); | 422 | omap3_mux_init(board_mux, OMAP_PACKAGE_CUS); |
425 | omap_board_config = omap3_stalker_config; | 423 | omap_board_config = omap3_stalker_config; |
426 | omap_board_config_size = ARRAY_SIZE(omap3_stalker_config); | 424 | omap_board_config_size = ARRAY_SIZE(omap3_stalker_config); |
diff --git a/arch/arm/mach-omap2/board-overo.c b/arch/arm/mach-omap2/board-overo.c index 668533e2a379..33aa3910b09e 100644 --- a/arch/arm/mach-omap2/board-overo.c +++ b/arch/arm/mach-omap2/board-overo.c | |||
@@ -498,10 +498,18 @@ static struct gpio overo_bt_gpios[] __initdata = { | |||
498 | { OVERO_GPIO_BT_NRESET, GPIOF_OUT_INIT_HIGH, "lcd bl enable" }, | 498 | { OVERO_GPIO_BT_NRESET, GPIOF_OUT_INIT_HIGH, "lcd bl enable" }, |
499 | }; | 499 | }; |
500 | 500 | ||
501 | static struct regulator_consumer_supply dummy_supplies[] = { | ||
502 | REGULATOR_SUPPLY("vddvario", "smsc911x.0"), | ||
503 | REGULATOR_SUPPLY("vdd33a", "smsc911x.0"), | ||
504 | REGULATOR_SUPPLY("vddvario", "smsc911x.1"), | ||
505 | REGULATOR_SUPPLY("vdd33a", "smsc911x.1"), | ||
506 | }; | ||
507 | |||
501 | static void __init overo_init(void) | 508 | static void __init overo_init(void) |
502 | { | 509 | { |
503 | int ret; | 510 | int ret; |
504 | 511 | ||
512 | regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies)); | ||
505 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); | 513 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); |
506 | omap_hsmmc_init(mmc); | 514 | omap_hsmmc_init(mmc); |
507 | overo_i2c_init(); | 515 | overo_i2c_init(); |
diff --git a/arch/arm/mach-omap2/board-zoom-debugboard.c b/arch/arm/mach-omap2/board-zoom-debugboard.c index 1e8540eabde9..f64f44173061 100644 --- a/arch/arm/mach-omap2/board-zoom-debugboard.c +++ b/arch/arm/mach-omap2/board-zoom-debugboard.c | |||
@@ -14,6 +14,9 @@ | |||
14 | #include <linux/smsc911x.h> | 14 | #include <linux/smsc911x.h> |
15 | #include <linux/interrupt.h> | 15 | #include <linux/interrupt.h> |
16 | 16 | ||
17 | #include <linux/regulator/fixed.h> | ||
18 | #include <linux/regulator/machine.h> | ||
19 | |||
17 | #include <plat/gpmc.h> | 20 | #include <plat/gpmc.h> |
18 | #include <plat/gpmc-smsc911x.h> | 21 | #include <plat/gpmc-smsc911x.h> |
19 | 22 | ||
@@ -117,11 +120,17 @@ static struct platform_device *zoom_devices[] __initdata = { | |||
117 | &zoom_debugboard_serial_device, | 120 | &zoom_debugboard_serial_device, |
118 | }; | 121 | }; |
119 | 122 | ||
123 | static struct regulator_consumer_supply dummy_supplies[] = { | ||
124 | REGULATOR_SUPPLY("vddvario", "smsc911x.0"), | ||
125 | REGULATOR_SUPPLY("vdd33a", "smsc911x.0"), | ||
126 | }; | ||
127 | |||
120 | int __init zoom_debugboard_init(void) | 128 | int __init zoom_debugboard_init(void) |
121 | { | 129 | { |
122 | if (!omap_zoom_debugboard_detect()) | 130 | if (!omap_zoom_debugboard_detect()) |
123 | return 0; | 131 | return 0; |
124 | 132 | ||
133 | regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies)); | ||
125 | zoom_init_smsc911x(); | 134 | zoom_init_smsc911x(); |
126 | zoom_init_quaduart(); | 135 | zoom_init_quaduart(); |
127 | return platform_add_devices(zoom_devices, ARRAY_SIZE(zoom_devices)); | 136 | return platform_add_devices(zoom_devices, ARRAY_SIZE(zoom_devices)); |
diff --git a/arch/arm/mach-omap2/clock3xxx_data.c b/arch/arm/mach-omap2/clock3xxx_data.c index 480fb8f09aed..f4a626f7c79e 100644 --- a/arch/arm/mach-omap2/clock3xxx_data.c +++ b/arch/arm/mach-omap2/clock3xxx_data.c | |||
@@ -747,7 +747,7 @@ static struct clk dpll4_m3_ck = { | |||
747 | .parent = &dpll4_ck, | 747 | .parent = &dpll4_ck, |
748 | .init = &omap2_init_clksel_parent, | 748 | .init = &omap2_init_clksel_parent, |
749 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_CLKSEL), | 749 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_CLKSEL), |
750 | .clksel_mask = OMAP3430_CLKSEL_TV_MASK, | 750 | .clksel_mask = OMAP3630_CLKSEL_TV_MASK, |
751 | .clksel = dpll4_clksel, | 751 | .clksel = dpll4_clksel, |
752 | .clkdm_name = "dpll4_clkdm", | 752 | .clkdm_name = "dpll4_clkdm", |
753 | .recalc = &omap2_clksel_recalc, | 753 | .recalc = &omap2_clksel_recalc, |
@@ -832,7 +832,7 @@ static struct clk dpll4_m4_ck = { | |||
832 | .parent = &dpll4_ck, | 832 | .parent = &dpll4_ck, |
833 | .init = &omap2_init_clksel_parent, | 833 | .init = &omap2_init_clksel_parent, |
834 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_CLKSEL), | 834 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_CLKSEL), |
835 | .clksel_mask = OMAP3430_CLKSEL_DSS1_MASK, | 835 | .clksel_mask = OMAP3630_CLKSEL_DSS1_MASK, |
836 | .clksel = dpll4_clksel, | 836 | .clksel = dpll4_clksel, |
837 | .clkdm_name = "dpll4_clkdm", | 837 | .clkdm_name = "dpll4_clkdm", |
838 | .recalc = &omap2_clksel_recalc, | 838 | .recalc = &omap2_clksel_recalc, |
@@ -859,7 +859,7 @@ static struct clk dpll4_m5_ck = { | |||
859 | .parent = &dpll4_ck, | 859 | .parent = &dpll4_ck, |
860 | .init = &omap2_init_clksel_parent, | 860 | .init = &omap2_init_clksel_parent, |
861 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_CAM_MOD, CM_CLKSEL), | 861 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_CAM_MOD, CM_CLKSEL), |
862 | .clksel_mask = OMAP3430_CLKSEL_CAM_MASK, | 862 | .clksel_mask = OMAP3630_CLKSEL_CAM_MASK, |
863 | .clksel = dpll4_clksel, | 863 | .clksel = dpll4_clksel, |
864 | .clkdm_name = "dpll4_clkdm", | 864 | .clkdm_name = "dpll4_clkdm", |
865 | .set_rate = &omap2_clksel_set_rate, | 865 | .set_rate = &omap2_clksel_set_rate, |
@@ -886,7 +886,7 @@ static struct clk dpll4_m6_ck = { | |||
886 | .parent = &dpll4_ck, | 886 | .parent = &dpll4_ck, |
887 | .init = &omap2_init_clksel_parent, | 887 | .init = &omap2_init_clksel_parent, |
888 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1), | 888 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1), |
889 | .clksel_mask = OMAP3430_DIV_DPLL4_MASK, | 889 | .clksel_mask = OMAP3630_DIV_DPLL4_MASK, |
890 | .clksel = dpll4_clksel, | 890 | .clksel = dpll4_clksel, |
891 | .clkdm_name = "dpll4_clkdm", | 891 | .clkdm_name = "dpll4_clkdm", |
892 | .recalc = &omap2_clksel_recalc, | 892 | .recalc = &omap2_clksel_recalc, |
@@ -1394,6 +1394,7 @@ static struct clk cpefuse_fck = { | |||
1394 | .name = "cpefuse_fck", | 1394 | .name = "cpefuse_fck", |
1395 | .ops = &clkops_omap2_dflt, | 1395 | .ops = &clkops_omap2_dflt, |
1396 | .parent = &sys_ck, | 1396 | .parent = &sys_ck, |
1397 | .clkdm_name = "core_l4_clkdm", | ||
1397 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP3430ES2_CM_FCLKEN3), | 1398 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP3430ES2_CM_FCLKEN3), |
1398 | .enable_bit = OMAP3430ES2_EN_CPEFUSE_SHIFT, | 1399 | .enable_bit = OMAP3430ES2_EN_CPEFUSE_SHIFT, |
1399 | .recalc = &followparent_recalc, | 1400 | .recalc = &followparent_recalc, |
@@ -1403,6 +1404,7 @@ static struct clk ts_fck = { | |||
1403 | .name = "ts_fck", | 1404 | .name = "ts_fck", |
1404 | .ops = &clkops_omap2_dflt, | 1405 | .ops = &clkops_omap2_dflt, |
1405 | .parent = &omap_32k_fck, | 1406 | .parent = &omap_32k_fck, |
1407 | .clkdm_name = "core_l4_clkdm", | ||
1406 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP3430ES2_CM_FCLKEN3), | 1408 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP3430ES2_CM_FCLKEN3), |
1407 | .enable_bit = OMAP3430ES2_EN_TS_SHIFT, | 1409 | .enable_bit = OMAP3430ES2_EN_TS_SHIFT, |
1408 | .recalc = &followparent_recalc, | 1410 | .recalc = &followparent_recalc, |
@@ -1412,6 +1414,7 @@ static struct clk usbtll_fck = { | |||
1412 | .name = "usbtll_fck", | 1414 | .name = "usbtll_fck", |
1413 | .ops = &clkops_omap2_dflt_wait, | 1415 | .ops = &clkops_omap2_dflt_wait, |
1414 | .parent = &dpll5_m2_ck, | 1416 | .parent = &dpll5_m2_ck, |
1417 | .clkdm_name = "core_l4_clkdm", | ||
1415 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP3430ES2_CM_FCLKEN3), | 1418 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP3430ES2_CM_FCLKEN3), |
1416 | .enable_bit = OMAP3430ES2_EN_USBTLL_SHIFT, | 1419 | .enable_bit = OMAP3430ES2_EN_USBTLL_SHIFT, |
1417 | .recalc = &followparent_recalc, | 1420 | .recalc = &followparent_recalc, |
@@ -1617,6 +1620,7 @@ static struct clk fshostusb_fck = { | |||
1617 | .name = "fshostusb_fck", | 1620 | .name = "fshostusb_fck", |
1618 | .ops = &clkops_omap2_dflt_wait, | 1621 | .ops = &clkops_omap2_dflt_wait, |
1619 | .parent = &core_48m_fck, | 1622 | .parent = &core_48m_fck, |
1623 | .clkdm_name = "core_l4_clkdm", | ||
1620 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), | 1624 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), |
1621 | .enable_bit = OMAP3430ES1_EN_FSHOSTUSB_SHIFT, | 1625 | .enable_bit = OMAP3430ES1_EN_FSHOSTUSB_SHIFT, |
1622 | .recalc = &followparent_recalc, | 1626 | .recalc = &followparent_recalc, |
@@ -2043,6 +2047,7 @@ static struct clk omapctrl_ick = { | |||
2043 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 2047 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
2044 | .enable_bit = OMAP3430_EN_OMAPCTRL_SHIFT, | 2048 | .enable_bit = OMAP3430_EN_OMAPCTRL_SHIFT, |
2045 | .flags = ENABLE_ON_INIT, | 2049 | .flags = ENABLE_ON_INIT, |
2050 | .clkdm_name = "core_l4_clkdm", | ||
2046 | .recalc = &followparent_recalc, | 2051 | .recalc = &followparent_recalc, |
2047 | }; | 2052 | }; |
2048 | 2053 | ||
@@ -2094,6 +2099,7 @@ static struct clk usb_l4_ick = { | |||
2094 | .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL), | 2099 | .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL), |
2095 | .clksel_mask = OMAP3430ES1_CLKSEL_FSHOSTUSB_MASK, | 2100 | .clksel_mask = OMAP3430ES1_CLKSEL_FSHOSTUSB_MASK, |
2096 | .clksel = usb_l4_clksel, | 2101 | .clksel = usb_l4_clksel, |
2102 | .clkdm_name = "core_l4_clkdm", | ||
2097 | .recalc = &omap2_clksel_recalc, | 2103 | .recalc = &omap2_clksel_recalc, |
2098 | }; | 2104 | }; |
2099 | 2105 | ||
@@ -3467,8 +3473,8 @@ static struct omap_clk omap3xxx_clks[] = { | |||
3467 | CLK(NULL, "ipss_ick", &ipss_ick, CK_AM35XX), | 3473 | CLK(NULL, "ipss_ick", &ipss_ick, CK_AM35XX), |
3468 | CLK(NULL, "rmii_ck", &rmii_ck, CK_AM35XX), | 3474 | CLK(NULL, "rmii_ck", &rmii_ck, CK_AM35XX), |
3469 | CLK(NULL, "pclk_ck", &pclk_ck, CK_AM35XX), | 3475 | CLK(NULL, "pclk_ck", &pclk_ck, CK_AM35XX), |
3470 | CLK("davinci_emac", "emac_clk", &emac_ick, CK_AM35XX), | 3476 | CLK("davinci_emac", NULL, &emac_ick, CK_AM35XX), |
3471 | CLK("davinci_emac", "phy_clk", &emac_fck, CK_AM35XX), | 3477 | CLK("davinci_mdio.0", NULL, &emac_fck, CK_AM35XX), |
3472 | CLK("vpfe-capture", "master", &vpfe_ick, CK_AM35XX), | 3478 | CLK("vpfe-capture", "master", &vpfe_ick, CK_AM35XX), |
3473 | CLK("vpfe-capture", "slave", &vpfe_fck, CK_AM35XX), | 3479 | CLK("vpfe-capture", "slave", &vpfe_fck, CK_AM35XX), |
3474 | CLK("musb-am35x", "ick", &hsotgusb_ick_am35xx, CK_AM35XX), | 3480 | CLK("musb-am35x", "ick", &hsotgusb_ick_am35xx, CK_AM35XX), |
diff --git a/arch/arm/mach-omap2/clock44xx_data.c b/arch/arm/mach-omap2/clock44xx_data.c index c03c1108468e..fa6ea65ad44b 100644 --- a/arch/arm/mach-omap2/clock44xx_data.c +++ b/arch/arm/mach-omap2/clock44xx_data.c | |||
@@ -957,8 +957,8 @@ static struct dpll_data dpll_usb_dd = { | |||
957 | .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED), | 957 | .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED), |
958 | .autoidle_reg = OMAP4430_CM_AUTOIDLE_DPLL_USB, | 958 | .autoidle_reg = OMAP4430_CM_AUTOIDLE_DPLL_USB, |
959 | .idlest_reg = OMAP4430_CM_IDLEST_DPLL_USB, | 959 | .idlest_reg = OMAP4430_CM_IDLEST_DPLL_USB, |
960 | .mult_mask = OMAP4430_DPLL_MULT_MASK, | 960 | .mult_mask = OMAP4430_DPLL_MULT_USB_MASK, |
961 | .div1_mask = OMAP4430_DPLL_DIV_MASK, | 961 | .div1_mask = OMAP4430_DPLL_DIV_0_7_MASK, |
962 | .enable_mask = OMAP4430_DPLL_EN_MASK, | 962 | .enable_mask = OMAP4430_DPLL_EN_MASK, |
963 | .autoidle_mask = OMAP4430_AUTO_DPLL_MODE_MASK, | 963 | .autoidle_mask = OMAP4430_AUTO_DPLL_MODE_MASK, |
964 | .idlest_mask = OMAP4430_ST_DPLL_CLK_MASK, | 964 | .idlest_mask = OMAP4430_ST_DPLL_CLK_MASK, |
@@ -978,6 +978,7 @@ static struct clk dpll_usb_ck = { | |||
978 | .recalc = &omap3_dpll_recalc, | 978 | .recalc = &omap3_dpll_recalc, |
979 | .round_rate = &omap2_dpll_round_rate, | 979 | .round_rate = &omap2_dpll_round_rate, |
980 | .set_rate = &omap3_noncore_dpll_set_rate, | 980 | .set_rate = &omap3_noncore_dpll_set_rate, |
981 | .clkdm_name = "l3_init_clkdm", | ||
981 | }; | 982 | }; |
982 | 983 | ||
983 | static struct clk dpll_usb_clkdcoldo_ck = { | 984 | static struct clk dpll_usb_clkdcoldo_ck = { |
diff --git a/arch/arm/mach-omap2/clockdomains44xx_data.c b/arch/arm/mach-omap2/clockdomains44xx_data.c index 9299ac291d28..bd7ed13515cc 100644 --- a/arch/arm/mach-omap2/clockdomains44xx_data.c +++ b/arch/arm/mach-omap2/clockdomains44xx_data.c | |||
@@ -390,7 +390,7 @@ static struct clockdomain emu_sys_44xx_clkdm = { | |||
390 | .prcm_partition = OMAP4430_PRM_PARTITION, | 390 | .prcm_partition = OMAP4430_PRM_PARTITION, |
391 | .cm_inst = OMAP4430_PRM_EMU_CM_INST, | 391 | .cm_inst = OMAP4430_PRM_EMU_CM_INST, |
392 | .clkdm_offs = OMAP4430_PRM_EMU_CM_EMU_CDOFFS, | 392 | .clkdm_offs = OMAP4430_PRM_EMU_CM_EMU_CDOFFS, |
393 | .flags = CLKDM_CAN_HWSUP, | 393 | .flags = CLKDM_CAN_ENABLE_AUTO | CLKDM_CAN_FORCE_WAKEUP, |
394 | }; | 394 | }; |
395 | 395 | ||
396 | static struct clockdomain l3_dma_44xx_clkdm = { | 396 | static struct clockdomain l3_dma_44xx_clkdm = { |
diff --git a/arch/arm/mach-omap2/gpmc-smsc911x.c b/arch/arm/mach-omap2/gpmc-smsc911x.c index 5e5880d6d099..b6c77be3e8f7 100644 --- a/arch/arm/mach-omap2/gpmc-smsc911x.c +++ b/arch/arm/mach-omap2/gpmc-smsc911x.c | |||
@@ -19,15 +19,11 @@ | |||
19 | #include <linux/interrupt.h> | 19 | #include <linux/interrupt.h> |
20 | #include <linux/io.h> | 20 | #include <linux/io.h> |
21 | #include <linux/smsc911x.h> | 21 | #include <linux/smsc911x.h> |
22 | #include <linux/regulator/fixed.h> | ||
23 | #include <linux/regulator/machine.h> | ||
24 | 22 | ||
25 | #include <plat/board.h> | 23 | #include <plat/board.h> |
26 | #include <plat/gpmc.h> | 24 | #include <plat/gpmc.h> |
27 | #include <plat/gpmc-smsc911x.h> | 25 | #include <plat/gpmc-smsc911x.h> |
28 | 26 | ||
29 | static struct omap_smsc911x_platform_data *gpmc_cfg; | ||
30 | |||
31 | static struct resource gpmc_smsc911x_resources[] = { | 27 | static struct resource gpmc_smsc911x_resources[] = { |
32 | [0] = { | 28 | [0] = { |
33 | .flags = IORESOURCE_MEM, | 29 | .flags = IORESOURCE_MEM, |
@@ -41,51 +37,6 @@ static struct smsc911x_platform_config gpmc_smsc911x_config = { | |||
41 | .phy_interface = PHY_INTERFACE_MODE_MII, | 37 | .phy_interface = PHY_INTERFACE_MODE_MII, |
42 | .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW, | 38 | .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW, |
43 | .irq_type = SMSC911X_IRQ_TYPE_OPEN_DRAIN, | 39 | .irq_type = SMSC911X_IRQ_TYPE_OPEN_DRAIN, |
44 | .flags = SMSC911X_USE_16BIT, | ||
45 | }; | ||
46 | |||
47 | static struct regulator_consumer_supply gpmc_smsc911x_supply[] = { | ||
48 | REGULATOR_SUPPLY("vddvario", "smsc911x.0"), | ||
49 | REGULATOR_SUPPLY("vdd33a", "smsc911x.0"), | ||
50 | }; | ||
51 | |||
52 | /* Generic regulator definition to satisfy smsc911x */ | ||
53 | static struct regulator_init_data gpmc_smsc911x_reg_init_data = { | ||
54 | .constraints = { | ||
55 | .min_uV = 3300000, | ||
56 | .max_uV = 3300000, | ||
57 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
58 | | REGULATOR_MODE_STANDBY, | ||
59 | .valid_ops_mask = REGULATOR_CHANGE_MODE | ||
60 | | REGULATOR_CHANGE_STATUS, | ||
61 | }, | ||
62 | .num_consumer_supplies = ARRAY_SIZE(gpmc_smsc911x_supply), | ||
63 | .consumer_supplies = gpmc_smsc911x_supply, | ||
64 | }; | ||
65 | |||
66 | static struct fixed_voltage_config gpmc_smsc911x_fixed_reg_data = { | ||
67 | .supply_name = "gpmc_smsc911x", | ||
68 | .microvolts = 3300000, | ||
69 | .gpio = -EINVAL, | ||
70 | .startup_delay = 0, | ||
71 | .enable_high = 0, | ||
72 | .enabled_at_boot = 1, | ||
73 | .init_data = &gpmc_smsc911x_reg_init_data, | ||
74 | }; | ||
75 | |||
76 | /* | ||
77 | * Platform device id of 42 is a temporary fix to avoid conflicts | ||
78 | * with other reg-fixed-voltage devices. The real fix should | ||
79 | * involve the driver core providing a way of dynamically | ||
80 | * assigning a unique id on registration for platform devices | ||
81 | * in the same name space. | ||
82 | */ | ||
83 | static struct platform_device gpmc_smsc911x_regulator = { | ||
84 | .name = "reg-fixed-voltage", | ||
85 | .id = 42, | ||
86 | .dev = { | ||
87 | .platform_data = &gpmc_smsc911x_fixed_reg_data, | ||
88 | }, | ||
89 | }; | 40 | }; |
90 | 41 | ||
91 | /* | 42 | /* |
@@ -93,23 +44,12 @@ static struct platform_device gpmc_smsc911x_regulator = { | |||
93 | * assume that pin multiplexing is done in the board-*.c file, | 44 | * assume that pin multiplexing is done in the board-*.c file, |
94 | * or in the bootloader. | 45 | * or in the bootloader. |
95 | */ | 46 | */ |
96 | void __init gpmc_smsc911x_init(struct omap_smsc911x_platform_data *board_data) | 47 | void __init gpmc_smsc911x_init(struct omap_smsc911x_platform_data *gpmc_cfg) |
97 | { | 48 | { |
98 | struct platform_device *pdev; | 49 | struct platform_device *pdev; |
99 | unsigned long cs_mem_base; | 50 | unsigned long cs_mem_base; |
100 | int ret; | 51 | int ret; |
101 | 52 | ||
102 | gpmc_cfg = board_data; | ||
103 | |||
104 | if (!gpmc_cfg->id) { | ||
105 | ret = platform_device_register(&gpmc_smsc911x_regulator); | ||
106 | if (ret < 0) { | ||
107 | pr_err("Unable to register smsc911x regulators: %d\n", | ||
108 | ret); | ||
109 | return; | ||
110 | } | ||
111 | } | ||
112 | |||
113 | if (gpmc_cs_request(gpmc_cfg->cs, SZ_16M, &cs_mem_base) < 0) { | 53 | if (gpmc_cs_request(gpmc_cfg->cs, SZ_16M, &cs_mem_base) < 0) { |
114 | pr_err("Failed to request GPMC mem region\n"); | 54 | pr_err("Failed to request GPMC mem region\n"); |
115 | return; | 55 | return; |
@@ -139,8 +79,7 @@ void __init gpmc_smsc911x_init(struct omap_smsc911x_platform_data *board_data) | |||
139 | gpio_set_value(gpmc_cfg->gpio_reset, 1); | 79 | gpio_set_value(gpmc_cfg->gpio_reset, 1); |
140 | } | 80 | } |
141 | 81 | ||
142 | if (gpmc_cfg->flags) | 82 | gpmc_smsc911x_config.flags = gpmc_cfg->flags ? : SMSC911X_USE_16BIT; |
143 | gpmc_smsc911x_config.flags = gpmc_cfg->flags; | ||
144 | 83 | ||
145 | pdev = platform_device_register_resndata(NULL, "smsc911x", gpmc_cfg->id, | 84 | pdev = platform_device_register_resndata(NULL, "smsc911x", gpmc_cfg->id, |
146 | gpmc_smsc911x_resources, ARRAY_SIZE(gpmc_smsc911x_resources), | 85 | gpmc_smsc911x_resources, ARRAY_SIZE(gpmc_smsc911x_resources), |
diff --git a/arch/arm/mach-omap2/hsmmc.c b/arch/arm/mach-omap2/hsmmc.c index 100db6217f39..b0268eaffe13 100644 --- a/arch/arm/mach-omap2/hsmmc.c +++ b/arch/arm/mach-omap2/hsmmc.c | |||
@@ -506,6 +506,13 @@ static void __init omap_hsmmc_init_one(struct omap2_hsmmc_info *hsmmcinfo, | |||
506 | if (oh->dev_attr != NULL) { | 506 | if (oh->dev_attr != NULL) { |
507 | mmc_dev_attr = oh->dev_attr; | 507 | mmc_dev_attr = oh->dev_attr; |
508 | mmc_data->controller_flags = mmc_dev_attr->flags; | 508 | mmc_data->controller_flags = mmc_dev_attr->flags; |
509 | /* | ||
510 | * erratum 2.1.1.128 doesn't apply if board has | ||
511 | * a transceiver is attached | ||
512 | */ | ||
513 | if (hsmmcinfo->transceiver) | ||
514 | mmc_data->controller_flags &= | ||
515 | ~OMAP_HSMMC_BROKEN_MULTIBLOCK_READ; | ||
509 | } | 516 | } |
510 | 517 | ||
511 | pdev = platform_device_alloc(name, ctrl_nr - 1); | 518 | pdev = platform_device_alloc(name, ctrl_nr - 1); |
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index eba6cd3816f5..2c27fdb61e66 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c | |||
@@ -1395,7 +1395,7 @@ static int _read_hardreset(struct omap_hwmod *oh, const char *name) | |||
1395 | */ | 1395 | */ |
1396 | static int _ocp_softreset(struct omap_hwmod *oh) | 1396 | static int _ocp_softreset(struct omap_hwmod *oh) |
1397 | { | 1397 | { |
1398 | u32 v; | 1398 | u32 v, softrst_mask; |
1399 | int c = 0; | 1399 | int c = 0; |
1400 | int ret = 0; | 1400 | int ret = 0; |
1401 | 1401 | ||
@@ -1427,11 +1427,13 @@ static int _ocp_softreset(struct omap_hwmod *oh) | |||
1427 | oh->class->sysc->syss_offs) | 1427 | oh->class->sysc->syss_offs) |
1428 | & SYSS_RESETDONE_MASK), | 1428 | & SYSS_RESETDONE_MASK), |
1429 | MAX_MODULE_SOFTRESET_WAIT, c); | 1429 | MAX_MODULE_SOFTRESET_WAIT, c); |
1430 | else if (oh->class->sysc->sysc_flags & SYSC_HAS_RESET_STATUS) | 1430 | else if (oh->class->sysc->sysc_flags & SYSC_HAS_RESET_STATUS) { |
1431 | softrst_mask = (0x1 << oh->class->sysc->sysc_fields->srst_shift); | ||
1431 | omap_test_timeout(!(omap_hwmod_read(oh, | 1432 | omap_test_timeout(!(omap_hwmod_read(oh, |
1432 | oh->class->sysc->sysc_offs) | 1433 | oh->class->sysc->sysc_offs) |
1433 | & SYSC_TYPE2_SOFTRESET_MASK), | 1434 | & softrst_mask), |
1434 | MAX_MODULE_SOFTRESET_WAIT, c); | 1435 | MAX_MODULE_SOFTRESET_WAIT, c); |
1436 | } | ||
1435 | 1437 | ||
1436 | if (c == MAX_MODULE_SOFTRESET_WAIT) | 1438 | if (c == MAX_MODULE_SOFTRESET_WAIT) |
1437 | pr_warning("omap_hwmod: %s: softreset failed (waited %d usec)\n", | 1439 | pr_warning("omap_hwmod: %s: softreset failed (waited %d usec)\n", |
@@ -1477,6 +1479,11 @@ static int _reset(struct omap_hwmod *oh) | |||
1477 | 1479 | ||
1478 | ret = (oh->class->reset) ? oh->class->reset(oh) : _ocp_softreset(oh); | 1480 | ret = (oh->class->reset) ? oh->class->reset(oh) : _ocp_softreset(oh); |
1479 | 1481 | ||
1482 | if (oh->class->sysc) { | ||
1483 | _update_sysc_cache(oh); | ||
1484 | _enable_sysc(oh); | ||
1485 | } | ||
1486 | |||
1480 | return ret; | 1487 | return ret; |
1481 | } | 1488 | } |
1482 | 1489 | ||
@@ -1786,20 +1793,9 @@ static int _setup(struct omap_hwmod *oh, void *data) | |||
1786 | return 0; | 1793 | return 0; |
1787 | } | 1794 | } |
1788 | 1795 | ||
1789 | if (!(oh->flags & HWMOD_INIT_NO_RESET)) { | 1796 | if (!(oh->flags & HWMOD_INIT_NO_RESET)) |
1790 | _reset(oh); | 1797 | _reset(oh); |
1791 | 1798 | ||
1792 | /* | ||
1793 | * OCP_SYSCONFIG bits need to be reprogrammed after a softreset. | ||
1794 | * The _enable() function should be split to | ||
1795 | * avoid the rewrite of the OCP_SYSCONFIG register. | ||
1796 | */ | ||
1797 | if (oh->class->sysc) { | ||
1798 | _update_sysc_cache(oh); | ||
1799 | _enable_sysc(oh); | ||
1800 | } | ||
1801 | } | ||
1802 | |||
1803 | postsetup_state = oh->_postsetup_state; | 1799 | postsetup_state = oh->_postsetup_state; |
1804 | if (postsetup_state == _HWMOD_STATE_UNKNOWN) | 1800 | if (postsetup_state == _HWMOD_STATE_UNKNOWN) |
1805 | postsetup_state = _HWMOD_STATE_ENABLED; | 1801 | postsetup_state = _HWMOD_STATE_ENABLED; |
@@ -1907,20 +1903,10 @@ void omap_hwmod_write(u32 v, struct omap_hwmod *oh, u16 reg_offs) | |||
1907 | */ | 1903 | */ |
1908 | int omap_hwmod_softreset(struct omap_hwmod *oh) | 1904 | int omap_hwmod_softreset(struct omap_hwmod *oh) |
1909 | { | 1905 | { |
1910 | u32 v; | 1906 | if (!oh) |
1911 | int ret; | ||
1912 | |||
1913 | if (!oh || !(oh->_sysc_cache)) | ||
1914 | return -EINVAL; | 1907 | return -EINVAL; |
1915 | 1908 | ||
1916 | v = oh->_sysc_cache; | 1909 | return _ocp_softreset(oh); |
1917 | ret = _set_softreset(oh, &v); | ||
1918 | if (ret) | ||
1919 | goto error; | ||
1920 | _write_sysconfig(v, oh); | ||
1921 | |||
1922 | error: | ||
1923 | return ret; | ||
1924 | } | 1910 | } |
1925 | 1911 | ||
1926 | /** | 1912 | /** |
@@ -2463,26 +2449,28 @@ int omap_hwmod_del_initiator_dep(struct omap_hwmod *oh, | |||
2463 | * @oh: struct omap_hwmod * | 2449 | * @oh: struct omap_hwmod * |
2464 | * | 2450 | * |
2465 | * Sets the module OCP socket ENAWAKEUP bit to allow the module to | 2451 | * Sets the module OCP socket ENAWAKEUP bit to allow the module to |
2466 | * send wakeups to the PRCM. Eventually this should sets PRCM wakeup | 2452 | * send wakeups to the PRCM, and enable I/O ring wakeup events for |
2467 | * registers to cause the PRCM to receive wakeup events from the | 2453 | * this IP block if it has dynamic mux entries. Eventually this |
2468 | * module. Does not set any wakeup routing registers beyond this | 2454 | * should set PRCM wakeup registers to cause the PRCM to receive |
2469 | * point - if the module is to wake up any other module or subsystem, | 2455 | * wakeup events from the module. Does not set any wakeup routing |
2470 | * that must be set separately. Called by omap_device code. Returns | 2456 | * registers beyond this point - if the module is to wake up any other |
2471 | * -EINVAL on error or 0 upon success. | 2457 | * module or subsystem, that must be set separately. Called by |
2458 | * omap_device code. Returns -EINVAL on error or 0 upon success. | ||
2472 | */ | 2459 | */ |
2473 | int omap_hwmod_enable_wakeup(struct omap_hwmod *oh) | 2460 | int omap_hwmod_enable_wakeup(struct omap_hwmod *oh) |
2474 | { | 2461 | { |
2475 | unsigned long flags; | 2462 | unsigned long flags; |
2476 | u32 v; | 2463 | u32 v; |
2477 | 2464 | ||
2478 | if (!oh->class->sysc || | ||
2479 | !(oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP)) | ||
2480 | return -EINVAL; | ||
2481 | |||
2482 | spin_lock_irqsave(&oh->_lock, flags); | 2465 | spin_lock_irqsave(&oh->_lock, flags); |
2483 | v = oh->_sysc_cache; | 2466 | |
2484 | _enable_wakeup(oh, &v); | 2467 | if (oh->class->sysc && |
2485 | _write_sysconfig(v, oh); | 2468 | (oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP)) { |
2469 | v = oh->_sysc_cache; | ||
2470 | _enable_wakeup(oh, &v); | ||
2471 | _write_sysconfig(v, oh); | ||
2472 | } | ||
2473 | |||
2486 | _set_idle_ioring_wakeup(oh, true); | 2474 | _set_idle_ioring_wakeup(oh, true); |
2487 | spin_unlock_irqrestore(&oh->_lock, flags); | 2475 | spin_unlock_irqrestore(&oh->_lock, flags); |
2488 | 2476 | ||
@@ -2494,26 +2482,28 @@ int omap_hwmod_enable_wakeup(struct omap_hwmod *oh) | |||
2494 | * @oh: struct omap_hwmod * | 2482 | * @oh: struct omap_hwmod * |
2495 | * | 2483 | * |
2496 | * Clears the module OCP socket ENAWAKEUP bit to prevent the module | 2484 | * Clears the module OCP socket ENAWAKEUP bit to prevent the module |
2497 | * from sending wakeups to the PRCM. Eventually this should clear | 2485 | * from sending wakeups to the PRCM, and disable I/O ring wakeup |
2498 | * PRCM wakeup registers to cause the PRCM to ignore wakeup events | 2486 | * events for this IP block if it has dynamic mux entries. Eventually |
2499 | * from the module. Does not set any wakeup routing registers beyond | 2487 | * this should clear PRCM wakeup registers to cause the PRCM to ignore |
2500 | * this point - if the module is to wake up any other module or | 2488 | * wakeup events from the module. Does not set any wakeup routing |
2501 | * subsystem, that must be set separately. Called by omap_device | 2489 | * registers beyond this point - if the module is to wake up any other |
2502 | * code. Returns -EINVAL on error or 0 upon success. | 2490 | * module or subsystem, that must be set separately. Called by |
2491 | * omap_device code. Returns -EINVAL on error or 0 upon success. | ||
2503 | */ | 2492 | */ |
2504 | int omap_hwmod_disable_wakeup(struct omap_hwmod *oh) | 2493 | int omap_hwmod_disable_wakeup(struct omap_hwmod *oh) |
2505 | { | 2494 | { |
2506 | unsigned long flags; | 2495 | unsigned long flags; |
2507 | u32 v; | 2496 | u32 v; |
2508 | 2497 | ||
2509 | if (!oh->class->sysc || | ||
2510 | !(oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP)) | ||
2511 | return -EINVAL; | ||
2512 | |||
2513 | spin_lock_irqsave(&oh->_lock, flags); | 2498 | spin_lock_irqsave(&oh->_lock, flags); |
2514 | v = oh->_sysc_cache; | 2499 | |
2515 | _disable_wakeup(oh, &v); | 2500 | if (oh->class->sysc && |
2516 | _write_sysconfig(v, oh); | 2501 | (oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP)) { |
2502 | v = oh->_sysc_cache; | ||
2503 | _disable_wakeup(oh, &v); | ||
2504 | _write_sysconfig(v, oh); | ||
2505 | } | ||
2506 | |||
2517 | _set_idle_ioring_wakeup(oh, false); | 2507 | _set_idle_ioring_wakeup(oh, false); |
2518 | spin_unlock_irqrestore(&oh->_lock, flags); | 2508 | spin_unlock_irqrestore(&oh->_lock, flags); |
2519 | 2509 | ||
diff --git a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c index 08daa5e0eb5f..cc9bd106a854 100644 --- a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c | |||
@@ -2996,6 +2996,11 @@ static struct omap_hwmod_ocp_if *omap44xx_mcbsp1_slaves[] = { | |||
2996 | &omap44xx_l4_abe__mcbsp1_dma, | 2996 | &omap44xx_l4_abe__mcbsp1_dma, |
2997 | }; | 2997 | }; |
2998 | 2998 | ||
2999 | static struct omap_hwmod_opt_clk mcbsp1_opt_clks[] = { | ||
3000 | { .role = "pad_fck", .clk = "pad_clks_ck" }, | ||
3001 | { .role = "prcm_clk", .clk = "mcbsp1_sync_mux_ck" }, | ||
3002 | }; | ||
3003 | |||
2999 | static struct omap_hwmod omap44xx_mcbsp1_hwmod = { | 3004 | static struct omap_hwmod omap44xx_mcbsp1_hwmod = { |
3000 | .name = "mcbsp1", | 3005 | .name = "mcbsp1", |
3001 | .class = &omap44xx_mcbsp_hwmod_class, | 3006 | .class = &omap44xx_mcbsp_hwmod_class, |
@@ -3012,6 +3017,8 @@ static struct omap_hwmod omap44xx_mcbsp1_hwmod = { | |||
3012 | }, | 3017 | }, |
3013 | .slaves = omap44xx_mcbsp1_slaves, | 3018 | .slaves = omap44xx_mcbsp1_slaves, |
3014 | .slaves_cnt = ARRAY_SIZE(omap44xx_mcbsp1_slaves), | 3019 | .slaves_cnt = ARRAY_SIZE(omap44xx_mcbsp1_slaves), |
3020 | .opt_clks = mcbsp1_opt_clks, | ||
3021 | .opt_clks_cnt = ARRAY_SIZE(mcbsp1_opt_clks), | ||
3015 | }; | 3022 | }; |
3016 | 3023 | ||
3017 | /* mcbsp2 */ | 3024 | /* mcbsp2 */ |
@@ -3071,6 +3078,11 @@ static struct omap_hwmod_ocp_if *omap44xx_mcbsp2_slaves[] = { | |||
3071 | &omap44xx_l4_abe__mcbsp2_dma, | 3078 | &omap44xx_l4_abe__mcbsp2_dma, |
3072 | }; | 3079 | }; |
3073 | 3080 | ||
3081 | static struct omap_hwmod_opt_clk mcbsp2_opt_clks[] = { | ||
3082 | { .role = "pad_fck", .clk = "pad_clks_ck" }, | ||
3083 | { .role = "prcm_clk", .clk = "mcbsp2_sync_mux_ck" }, | ||
3084 | }; | ||
3085 | |||
3074 | static struct omap_hwmod omap44xx_mcbsp2_hwmod = { | 3086 | static struct omap_hwmod omap44xx_mcbsp2_hwmod = { |
3075 | .name = "mcbsp2", | 3087 | .name = "mcbsp2", |
3076 | .class = &omap44xx_mcbsp_hwmod_class, | 3088 | .class = &omap44xx_mcbsp_hwmod_class, |
@@ -3087,6 +3099,8 @@ static struct omap_hwmod omap44xx_mcbsp2_hwmod = { | |||
3087 | }, | 3099 | }, |
3088 | .slaves = omap44xx_mcbsp2_slaves, | 3100 | .slaves = omap44xx_mcbsp2_slaves, |
3089 | .slaves_cnt = ARRAY_SIZE(omap44xx_mcbsp2_slaves), | 3101 | .slaves_cnt = ARRAY_SIZE(omap44xx_mcbsp2_slaves), |
3102 | .opt_clks = mcbsp2_opt_clks, | ||
3103 | .opt_clks_cnt = ARRAY_SIZE(mcbsp2_opt_clks), | ||
3090 | }; | 3104 | }; |
3091 | 3105 | ||
3092 | /* mcbsp3 */ | 3106 | /* mcbsp3 */ |
@@ -3146,6 +3160,11 @@ static struct omap_hwmod_ocp_if *omap44xx_mcbsp3_slaves[] = { | |||
3146 | &omap44xx_l4_abe__mcbsp3_dma, | 3160 | &omap44xx_l4_abe__mcbsp3_dma, |
3147 | }; | 3161 | }; |
3148 | 3162 | ||
3163 | static struct omap_hwmod_opt_clk mcbsp3_opt_clks[] = { | ||
3164 | { .role = "pad_fck", .clk = "pad_clks_ck" }, | ||
3165 | { .role = "prcm_clk", .clk = "mcbsp3_sync_mux_ck" }, | ||
3166 | }; | ||
3167 | |||
3149 | static struct omap_hwmod omap44xx_mcbsp3_hwmod = { | 3168 | static struct omap_hwmod omap44xx_mcbsp3_hwmod = { |
3150 | .name = "mcbsp3", | 3169 | .name = "mcbsp3", |
3151 | .class = &omap44xx_mcbsp_hwmod_class, | 3170 | .class = &omap44xx_mcbsp_hwmod_class, |
@@ -3162,6 +3181,8 @@ static struct omap_hwmod omap44xx_mcbsp3_hwmod = { | |||
3162 | }, | 3181 | }, |
3163 | .slaves = omap44xx_mcbsp3_slaves, | 3182 | .slaves = omap44xx_mcbsp3_slaves, |
3164 | .slaves_cnt = ARRAY_SIZE(omap44xx_mcbsp3_slaves), | 3183 | .slaves_cnt = ARRAY_SIZE(omap44xx_mcbsp3_slaves), |
3184 | .opt_clks = mcbsp3_opt_clks, | ||
3185 | .opt_clks_cnt = ARRAY_SIZE(mcbsp3_opt_clks), | ||
3165 | }; | 3186 | }; |
3166 | 3187 | ||
3167 | /* mcbsp4 */ | 3188 | /* mcbsp4 */ |
@@ -3200,6 +3221,11 @@ static struct omap_hwmod_ocp_if *omap44xx_mcbsp4_slaves[] = { | |||
3200 | &omap44xx_l4_per__mcbsp4, | 3221 | &omap44xx_l4_per__mcbsp4, |
3201 | }; | 3222 | }; |
3202 | 3223 | ||
3224 | static struct omap_hwmod_opt_clk mcbsp4_opt_clks[] = { | ||
3225 | { .role = "pad_fck", .clk = "pad_clks_ck" }, | ||
3226 | { .role = "prcm_clk", .clk = "mcbsp4_sync_mux_ck" }, | ||
3227 | }; | ||
3228 | |||
3203 | static struct omap_hwmod omap44xx_mcbsp4_hwmod = { | 3229 | static struct omap_hwmod omap44xx_mcbsp4_hwmod = { |
3204 | .name = "mcbsp4", | 3230 | .name = "mcbsp4", |
3205 | .class = &omap44xx_mcbsp_hwmod_class, | 3231 | .class = &omap44xx_mcbsp_hwmod_class, |
@@ -3216,6 +3242,8 @@ static struct omap_hwmod omap44xx_mcbsp4_hwmod = { | |||
3216 | }, | 3242 | }, |
3217 | .slaves = omap44xx_mcbsp4_slaves, | 3243 | .slaves = omap44xx_mcbsp4_slaves, |
3218 | .slaves_cnt = ARRAY_SIZE(omap44xx_mcbsp4_slaves), | 3244 | .slaves_cnt = ARRAY_SIZE(omap44xx_mcbsp4_slaves), |
3245 | .opt_clks = mcbsp4_opt_clks, | ||
3246 | .opt_clks_cnt = ARRAY_SIZE(mcbsp4_opt_clks), | ||
3219 | }; | 3247 | }; |
3220 | 3248 | ||
3221 | /* | 3249 | /* |
diff --git a/arch/arm/mach-omap2/opp.c b/arch/arm/mach-omap2/opp.c index 9262a6b47702..de6d46451746 100644 --- a/arch/arm/mach-omap2/opp.c +++ b/arch/arm/mach-omap2/opp.c | |||
@@ -64,10 +64,10 @@ int __init omap_init_opp_table(struct omap_opp_def *opp_def, | |||
64 | } | 64 | } |
65 | oh = omap_hwmod_lookup(opp_def->hwmod_name); | 65 | oh = omap_hwmod_lookup(opp_def->hwmod_name); |
66 | if (!oh || !oh->od) { | 66 | if (!oh || !oh->od) { |
67 | pr_warn("%s: no hwmod or odev for %s, [%d] " | 67 | pr_debug("%s: no hwmod or odev for %s, [%d] " |
68 | "cannot add OPPs.\n", __func__, | 68 | "cannot add OPPs.\n", __func__, |
69 | opp_def->hwmod_name, i); | 69 | opp_def->hwmod_name, i); |
70 | return -EINVAL; | 70 | continue; |
71 | } | 71 | } |
72 | dev = &oh->od->pdev->dev; | 72 | dev = &oh->od->pdev->dev; |
73 | 73 | ||
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index 238defc6f6df..703bd1099259 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c | |||
@@ -153,8 +153,7 @@ static void omap3_save_secure_ram_context(void) | |||
153 | pwrdm_set_next_pwrst(mpu_pwrdm, mpu_next_state); | 153 | pwrdm_set_next_pwrst(mpu_pwrdm, mpu_next_state); |
154 | /* Following is for error tracking, it should not happen */ | 154 | /* Following is for error tracking, it should not happen */ |
155 | if (ret) { | 155 | if (ret) { |
156 | printk(KERN_ERR "save_secure_sram() returns %08x\n", | 156 | pr_err("save_secure_sram() returns %08x\n", ret); |
157 | ret); | ||
158 | while (1) | 157 | while (1) |
159 | ; | 158 | ; |
160 | } | 159 | } |
@@ -289,7 +288,7 @@ void omap_sram_idle(void) | |||
289 | break; | 288 | break; |
290 | default: | 289 | default: |
291 | /* Invalid state */ | 290 | /* Invalid state */ |
292 | printk(KERN_ERR "Invalid mpu state in sram_idle\n"); | 291 | pr_err("Invalid mpu state in sram_idle\n"); |
293 | return; | 292 | return; |
294 | } | 293 | } |
295 | 294 | ||
@@ -439,18 +438,17 @@ restore: | |||
439 | list_for_each_entry(pwrst, &pwrst_list, node) { | 438 | list_for_each_entry(pwrst, &pwrst_list, node) { |
440 | state = pwrdm_read_prev_pwrst(pwrst->pwrdm); | 439 | state = pwrdm_read_prev_pwrst(pwrst->pwrdm); |
441 | if (state > pwrst->next_state) { | 440 | if (state > pwrst->next_state) { |
442 | printk(KERN_INFO "Powerdomain (%s) didn't enter " | 441 | pr_info("Powerdomain (%s) didn't enter " |
443 | "target state %d\n", | 442 | "target state %d\n", |
444 | pwrst->pwrdm->name, pwrst->next_state); | 443 | pwrst->pwrdm->name, pwrst->next_state); |
445 | ret = -1; | 444 | ret = -1; |
446 | } | 445 | } |
447 | omap_set_pwrdm_state(pwrst->pwrdm, pwrst->saved_state); | 446 | omap_set_pwrdm_state(pwrst->pwrdm, pwrst->saved_state); |
448 | } | 447 | } |
449 | if (ret) | 448 | if (ret) |
450 | printk(KERN_ERR "Could not enter target state in pm_suspend\n"); | 449 | pr_err("Could not enter target state in pm_suspend\n"); |
451 | else | 450 | else |
452 | printk(KERN_INFO "Successfully put all powerdomains " | 451 | pr_info("Successfully put all powerdomains to target state\n"); |
453 | "to target state\n"); | ||
454 | 452 | ||
455 | return ret; | 453 | return ret; |
456 | } | 454 | } |
@@ -734,21 +732,22 @@ static int __init omap3_pm_init(void) | |||
734 | 732 | ||
735 | if (ret) { | 733 | if (ret) { |
736 | pr_err("pm: Failed to request pm_io irq\n"); | 734 | pr_err("pm: Failed to request pm_io irq\n"); |
737 | goto err1; | 735 | goto err2; |
738 | } | 736 | } |
739 | 737 | ||
740 | ret = pwrdm_for_each(pwrdms_setup, NULL); | 738 | ret = pwrdm_for_each(pwrdms_setup, NULL); |
741 | if (ret) { | 739 | if (ret) { |
742 | printk(KERN_ERR "Failed to setup powerdomains\n"); | 740 | pr_err("Failed to setup powerdomains\n"); |
743 | goto err2; | 741 | goto err3; |
744 | } | 742 | } |
745 | 743 | ||
746 | (void) clkdm_for_each(omap_pm_clkdms_setup, NULL); | 744 | (void) clkdm_for_each(omap_pm_clkdms_setup, NULL); |
747 | 745 | ||
748 | mpu_pwrdm = pwrdm_lookup("mpu_pwrdm"); | 746 | mpu_pwrdm = pwrdm_lookup("mpu_pwrdm"); |
749 | if (mpu_pwrdm == NULL) { | 747 | if (mpu_pwrdm == NULL) { |
750 | printk(KERN_ERR "Failed to get mpu_pwrdm\n"); | 748 | pr_err("Failed to get mpu_pwrdm\n"); |
751 | goto err2; | 749 | ret = -EINVAL; |
750 | goto err3; | ||
752 | } | 751 | } |
753 | 752 | ||
754 | neon_pwrdm = pwrdm_lookup("neon_pwrdm"); | 753 | neon_pwrdm = pwrdm_lookup("neon_pwrdm"); |
@@ -781,8 +780,8 @@ static int __init omap3_pm_init(void) | |||
781 | omap3_secure_ram_storage = | 780 | omap3_secure_ram_storage = |
782 | kmalloc(0x803F, GFP_KERNEL); | 781 | kmalloc(0x803F, GFP_KERNEL); |
783 | if (!omap3_secure_ram_storage) | 782 | if (!omap3_secure_ram_storage) |
784 | printk(KERN_ERR "Memory allocation failed when" | 783 | pr_err("Memory allocation failed when " |
785 | "allocating for secure sram context\n"); | 784 | "allocating for secure sram context\n"); |
786 | 785 | ||
787 | local_irq_disable(); | 786 | local_irq_disable(); |
788 | local_fiq_disable(); | 787 | local_fiq_disable(); |
@@ -796,14 +795,17 @@ static int __init omap3_pm_init(void) | |||
796 | } | 795 | } |
797 | 796 | ||
798 | omap3_save_scratchpad_contents(); | 797 | omap3_save_scratchpad_contents(); |
799 | err1: | ||
800 | return ret; | 798 | return ret; |
801 | err2: | 799 | |
802 | free_irq(INT_34XX_PRCM_MPU_IRQ, NULL); | 800 | err3: |
803 | list_for_each_entry_safe(pwrst, tmp, &pwrst_list, node) { | 801 | list_for_each_entry_safe(pwrst, tmp, &pwrst_list, node) { |
804 | list_del(&pwrst->node); | 802 | list_del(&pwrst->node); |
805 | kfree(pwrst); | 803 | kfree(pwrst); |
806 | } | 804 | } |
805 | free_irq(omap_prcm_event_to_irq("io"), omap3_pm_init); | ||
806 | err2: | ||
807 | free_irq(omap_prcm_event_to_irq("wkup"), NULL); | ||
808 | err1: | ||
807 | return ret; | 809 | return ret; |
808 | } | 810 | } |
809 | 811 | ||
diff --git a/arch/arm/mach-omap2/pm44xx.c b/arch/arm/mach-omap2/pm44xx.c index 9ccaadc2cf07..885625352429 100644 --- a/arch/arm/mach-omap2/pm44xx.c +++ b/arch/arm/mach-omap2/pm44xx.c | |||
@@ -144,7 +144,7 @@ static void omap_default_idle(void) | |||
144 | static int __init omap4_pm_init(void) | 144 | static int __init omap4_pm_init(void) |
145 | { | 145 | { |
146 | int ret; | 146 | int ret; |
147 | struct clockdomain *emif_clkdm, *mpuss_clkdm, *l3_1_clkdm; | 147 | struct clockdomain *emif_clkdm, *mpuss_clkdm, *l3_1_clkdm, *l4wkup; |
148 | struct clockdomain *ducati_clkdm, *l3_2_clkdm, *l4_per_clkdm; | 148 | struct clockdomain *ducati_clkdm, *l3_2_clkdm, *l4_per_clkdm; |
149 | 149 | ||
150 | if (!cpu_is_omap44xx()) | 150 | if (!cpu_is_omap44xx()) |
@@ -168,14 +168,19 @@ static int __init omap4_pm_init(void) | |||
168 | * MPUSS -> L4_PER/L3_* and DUCATI -> L3_* doesn't work as | 168 | * MPUSS -> L4_PER/L3_* and DUCATI -> L3_* doesn't work as |
169 | * expected. The hardware recommendation is to enable static | 169 | * expected. The hardware recommendation is to enable static |
170 | * dependencies for these to avoid system lock ups or random crashes. | 170 | * dependencies for these to avoid system lock ups or random crashes. |
171 | * The L4 wakeup depedency is added to workaround the OCP sync hardware | ||
172 | * BUG with 32K synctimer which lead to incorrect timer value read | ||
173 | * from the 32K counter. The BUG applies for GPTIMER1 and WDT2 which | ||
174 | * are part of L4 wakeup clockdomain. | ||
171 | */ | 175 | */ |
172 | mpuss_clkdm = clkdm_lookup("mpuss_clkdm"); | 176 | mpuss_clkdm = clkdm_lookup("mpuss_clkdm"); |
173 | emif_clkdm = clkdm_lookup("l3_emif_clkdm"); | 177 | emif_clkdm = clkdm_lookup("l3_emif_clkdm"); |
174 | l3_1_clkdm = clkdm_lookup("l3_1_clkdm"); | 178 | l3_1_clkdm = clkdm_lookup("l3_1_clkdm"); |
175 | l3_2_clkdm = clkdm_lookup("l3_2_clkdm"); | 179 | l3_2_clkdm = clkdm_lookup("l3_2_clkdm"); |
176 | l4_per_clkdm = clkdm_lookup("l4_per_clkdm"); | 180 | l4_per_clkdm = clkdm_lookup("l4_per_clkdm"); |
181 | l4wkup = clkdm_lookup("l4_wkup_clkdm"); | ||
177 | ducati_clkdm = clkdm_lookup("ducati_clkdm"); | 182 | ducati_clkdm = clkdm_lookup("ducati_clkdm"); |
178 | if ((!mpuss_clkdm) || (!emif_clkdm) || (!l3_1_clkdm) || | 183 | if ((!mpuss_clkdm) || (!emif_clkdm) || (!l3_1_clkdm) || (!l4wkup) || |
179 | (!l3_2_clkdm) || (!ducati_clkdm) || (!l4_per_clkdm)) | 184 | (!l3_2_clkdm) || (!ducati_clkdm) || (!l4_per_clkdm)) |
180 | goto err2; | 185 | goto err2; |
181 | 186 | ||
@@ -183,6 +188,7 @@ static int __init omap4_pm_init(void) | |||
183 | ret |= clkdm_add_wkdep(mpuss_clkdm, l3_1_clkdm); | 188 | ret |= clkdm_add_wkdep(mpuss_clkdm, l3_1_clkdm); |
184 | ret |= clkdm_add_wkdep(mpuss_clkdm, l3_2_clkdm); | 189 | ret |= clkdm_add_wkdep(mpuss_clkdm, l3_2_clkdm); |
185 | ret |= clkdm_add_wkdep(mpuss_clkdm, l4_per_clkdm); | 190 | ret |= clkdm_add_wkdep(mpuss_clkdm, l4_per_clkdm); |
191 | ret |= clkdm_add_wkdep(mpuss_clkdm, l4wkup); | ||
186 | ret |= clkdm_add_wkdep(ducati_clkdm, l3_1_clkdm); | 192 | ret |= clkdm_add_wkdep(ducati_clkdm, l3_1_clkdm); |
187 | ret |= clkdm_add_wkdep(ducati_clkdm, l3_2_clkdm); | 193 | ret |= clkdm_add_wkdep(ducati_clkdm, l3_2_clkdm); |
188 | if (ret) { | 194 | if (ret) { |
diff --git a/arch/arm/mach-omap2/powerdomain.c b/arch/arm/mach-omap2/powerdomain.c index 8a18d1bd61c8..96ad3dbeac34 100644 --- a/arch/arm/mach-omap2/powerdomain.c +++ b/arch/arm/mach-omap2/powerdomain.c | |||
@@ -972,7 +972,13 @@ int pwrdm_wait_transition(struct powerdomain *pwrdm) | |||
972 | 972 | ||
973 | int pwrdm_state_switch(struct powerdomain *pwrdm) | 973 | int pwrdm_state_switch(struct powerdomain *pwrdm) |
974 | { | 974 | { |
975 | return _pwrdm_state_switch(pwrdm, PWRDM_STATE_NOW); | 975 | int ret; |
976 | |||
977 | ret = pwrdm_wait_transition(pwrdm); | ||
978 | if (!ret) | ||
979 | ret = _pwrdm_state_switch(pwrdm, PWRDM_STATE_NOW); | ||
980 | |||
981 | return ret; | ||
976 | } | 982 | } |
977 | 983 | ||
978 | int pwrdm_clkdm_state_switch(struct clockdomain *clkdm) | 984 | int pwrdm_clkdm_state_switch(struct clockdomain *clkdm) |
diff --git a/arch/arm/mach-omap2/prm44xx.c b/arch/arm/mach-omap2/prm44xx.c index eac623c7c3d8..f106d21ff581 100644 --- a/arch/arm/mach-omap2/prm44xx.c +++ b/arch/arm/mach-omap2/prm44xx.c | |||
@@ -147,8 +147,9 @@ static inline u32 _read_pending_irq_reg(u16 irqen_offs, u16 irqst_offs) | |||
147 | u32 mask, st; | 147 | u32 mask, st; |
148 | 148 | ||
149 | /* XXX read mask from RAM? */ | 149 | /* XXX read mask from RAM? */ |
150 | mask = omap4_prm_read_inst_reg(OMAP4430_PRM_DEVICE_INST, irqen_offs); | 150 | mask = omap4_prm_read_inst_reg(OMAP4430_PRM_OCP_SOCKET_INST, |
151 | st = omap4_prm_read_inst_reg(OMAP4430_PRM_DEVICE_INST, irqst_offs); | 151 | irqen_offs); |
152 | st = omap4_prm_read_inst_reg(OMAP4430_PRM_OCP_SOCKET_INST, irqst_offs); | ||
152 | 153 | ||
153 | return mask & st; | 154 | return mask & st; |
154 | } | 155 | } |
@@ -180,7 +181,7 @@ void omap44xx_prm_read_pending_irqs(unsigned long *events) | |||
180 | */ | 181 | */ |
181 | void omap44xx_prm_ocp_barrier(void) | 182 | void omap44xx_prm_ocp_barrier(void) |
182 | { | 183 | { |
183 | omap4_prm_read_inst_reg(OMAP4430_PRM_DEVICE_INST, | 184 | omap4_prm_read_inst_reg(OMAP4430_PRM_OCP_SOCKET_INST, |
184 | OMAP4_REVISION_PRM_OFFSET); | 185 | OMAP4_REVISION_PRM_OFFSET); |
185 | } | 186 | } |
186 | 187 | ||
@@ -198,19 +199,19 @@ void omap44xx_prm_ocp_barrier(void) | |||
198 | void omap44xx_prm_save_and_clear_irqen(u32 *saved_mask) | 199 | void omap44xx_prm_save_and_clear_irqen(u32 *saved_mask) |
199 | { | 200 | { |
200 | saved_mask[0] = | 201 | saved_mask[0] = |
201 | omap4_prm_read_inst_reg(OMAP4430_PRM_DEVICE_INST, | 202 | omap4_prm_read_inst_reg(OMAP4430_PRM_OCP_SOCKET_INST, |
202 | OMAP4_PRM_IRQSTATUS_MPU_OFFSET); | 203 | OMAP4_PRM_IRQSTATUS_MPU_OFFSET); |
203 | saved_mask[1] = | 204 | saved_mask[1] = |
204 | omap4_prm_read_inst_reg(OMAP4430_PRM_DEVICE_INST, | 205 | omap4_prm_read_inst_reg(OMAP4430_PRM_OCP_SOCKET_INST, |
205 | OMAP4_PRM_IRQSTATUS_MPU_2_OFFSET); | 206 | OMAP4_PRM_IRQSTATUS_MPU_2_OFFSET); |
206 | 207 | ||
207 | omap4_prm_write_inst_reg(0, OMAP4430_PRM_DEVICE_INST, | 208 | omap4_prm_write_inst_reg(0, OMAP4430_PRM_OCP_SOCKET_INST, |
208 | OMAP4_PRM_IRQENABLE_MPU_OFFSET); | 209 | OMAP4_PRM_IRQENABLE_MPU_OFFSET); |
209 | omap4_prm_write_inst_reg(0, OMAP4430_PRM_DEVICE_INST, | 210 | omap4_prm_write_inst_reg(0, OMAP4430_PRM_OCP_SOCKET_INST, |
210 | OMAP4_PRM_IRQENABLE_MPU_2_OFFSET); | 211 | OMAP4_PRM_IRQENABLE_MPU_2_OFFSET); |
211 | 212 | ||
212 | /* OCP barrier */ | 213 | /* OCP barrier */ |
213 | omap4_prm_read_inst_reg(OMAP4430_PRM_DEVICE_INST, | 214 | omap4_prm_read_inst_reg(OMAP4430_PRM_OCP_SOCKET_INST, |
214 | OMAP4_REVISION_PRM_OFFSET); | 215 | OMAP4_REVISION_PRM_OFFSET); |
215 | } | 216 | } |
216 | 217 | ||
@@ -226,9 +227,9 @@ void omap44xx_prm_save_and_clear_irqen(u32 *saved_mask) | |||
226 | */ | 227 | */ |
227 | void omap44xx_prm_restore_irqen(u32 *saved_mask) | 228 | void omap44xx_prm_restore_irqen(u32 *saved_mask) |
228 | { | 229 | { |
229 | omap4_prm_write_inst_reg(saved_mask[0], OMAP4430_PRM_DEVICE_INST, | 230 | omap4_prm_write_inst_reg(saved_mask[0], OMAP4430_PRM_OCP_SOCKET_INST, |
230 | OMAP4_PRM_IRQENABLE_MPU_OFFSET); | 231 | OMAP4_PRM_IRQENABLE_MPU_OFFSET); |
231 | omap4_prm_write_inst_reg(saved_mask[1], OMAP4430_PRM_DEVICE_INST, | 232 | omap4_prm_write_inst_reg(saved_mask[1], OMAP4430_PRM_OCP_SOCKET_INST, |
232 | OMAP4_PRM_IRQENABLE_MPU_2_OFFSET); | 233 | OMAP4_PRM_IRQENABLE_MPU_2_OFFSET); |
233 | } | 234 | } |
234 | 235 | ||
diff --git a/arch/arm/mach-omap2/prm_common.c b/arch/arm/mach-omap2/prm_common.c index 873b51d494ea..d28f848897d6 100644 --- a/arch/arm/mach-omap2/prm_common.c +++ b/arch/arm/mach-omap2/prm_common.c | |||
@@ -290,7 +290,7 @@ int omap_prcm_register_chain_handler(struct omap_prcm_irq_setup *irq_setup) | |||
290 | goto err; | 290 | goto err; |
291 | } | 291 | } |
292 | 292 | ||
293 | for (i = 0; i <= irq_setup->nr_regs; i++) { | 293 | for (i = 0; i < irq_setup->nr_regs; i++) { |
294 | gc = irq_alloc_generic_chip("PRCM", 1, | 294 | gc = irq_alloc_generic_chip("PRCM", 1, |
295 | irq_setup->base_irq + i * 32, prm_base, | 295 | irq_setup->base_irq + i * 32, prm_base, |
296 | handle_level_irq); | 296 | handle_level_irq); |
diff --git a/arch/arm/mach-omap2/usb-host.c b/arch/arm/mach-omap2/usb-host.c index f51348dafafd..dde8a11f47d5 100644 --- a/arch/arm/mach-omap2/usb-host.c +++ b/arch/arm/mach-omap2/usb-host.c | |||
@@ -54,7 +54,7 @@ static struct omap_device_pm_latency omap_uhhtll_latency[] = { | |||
54 | /* | 54 | /* |
55 | * setup_ehci_io_mux - initialize IO pad mux for USBHOST | 55 | * setup_ehci_io_mux - initialize IO pad mux for USBHOST |
56 | */ | 56 | */ |
57 | static void setup_ehci_io_mux(const enum usbhs_omap_port_mode *port_mode) | 57 | static void __init setup_ehci_io_mux(const enum usbhs_omap_port_mode *port_mode) |
58 | { | 58 | { |
59 | switch (port_mode[0]) { | 59 | switch (port_mode[0]) { |
60 | case OMAP_EHCI_PORT_MODE_PHY: | 60 | case OMAP_EHCI_PORT_MODE_PHY: |
@@ -197,7 +197,8 @@ static void setup_ehci_io_mux(const enum usbhs_omap_port_mode *port_mode) | |||
197 | return; | 197 | return; |
198 | } | 198 | } |
199 | 199 | ||
200 | static void setup_4430ehci_io_mux(const enum usbhs_omap_port_mode *port_mode) | 200 | static |
201 | void __init setup_4430ehci_io_mux(const enum usbhs_omap_port_mode *port_mode) | ||
201 | { | 202 | { |
202 | switch (port_mode[0]) { | 203 | switch (port_mode[0]) { |
203 | case OMAP_EHCI_PORT_MODE_PHY: | 204 | case OMAP_EHCI_PORT_MODE_PHY: |
@@ -315,7 +316,7 @@ static void setup_4430ehci_io_mux(const enum usbhs_omap_port_mode *port_mode) | |||
315 | } | 316 | } |
316 | } | 317 | } |
317 | 318 | ||
318 | static void setup_ohci_io_mux(const enum usbhs_omap_port_mode *port_mode) | 319 | static void __init setup_ohci_io_mux(const enum usbhs_omap_port_mode *port_mode) |
319 | { | 320 | { |
320 | switch (port_mode[0]) { | 321 | switch (port_mode[0]) { |
321 | case OMAP_OHCI_PORT_MODE_PHY_6PIN_DATSE0: | 322 | case OMAP_OHCI_PORT_MODE_PHY_6PIN_DATSE0: |
@@ -412,7 +413,8 @@ static void setup_ohci_io_mux(const enum usbhs_omap_port_mode *port_mode) | |||
412 | } | 413 | } |
413 | } | 414 | } |
414 | 415 | ||
415 | static void setup_4430ohci_io_mux(const enum usbhs_omap_port_mode *port_mode) | 416 | static |
417 | void __init setup_4430ohci_io_mux(const enum usbhs_omap_port_mode *port_mode) | ||
416 | { | 418 | { |
417 | switch (port_mode[0]) { | 419 | switch (port_mode[0]) { |
418 | case OMAP_OHCI_PORT_MODE_PHY_6PIN_DATSE0: | 420 | case OMAP_OHCI_PORT_MODE_PHY_6PIN_DATSE0: |
diff --git a/arch/arm/mach-pxa/Kconfig b/arch/arm/mach-pxa/Kconfig index 109ccd2a8885..fe2d1f80ef50 100644 --- a/arch/arm/mach-pxa/Kconfig +++ b/arch/arm/mach-pxa/Kconfig | |||
@@ -113,6 +113,7 @@ config MACH_ARMCORE | |||
113 | select IWMMXT | 113 | select IWMMXT |
114 | select PXA25x | 114 | select PXA25x |
115 | select MIGHT_HAVE_PCI | 115 | select MIGHT_HAVE_PCI |
116 | select NEED_MACH_IO_H if PCI | ||
116 | 117 | ||
117 | config MACH_EM_X270 | 118 | config MACH_EM_X270 |
118 | bool "CompuLab EM-x270 platform" | 119 | bool "CompuLab EM-x270 platform" |
diff --git a/arch/arm/mach-pxa/include/mach/io.h b/arch/arm/mach-pxa/include/mach/io.h new file mode 100644 index 000000000000..cd78b7fe3567 --- /dev/null +++ b/arch/arm/mach-pxa/include/mach/io.h | |||
@@ -0,0 +1,17 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-pxa/include/mach/io.h | ||
3 | * | ||
4 | * Copied from asm/arch/sa1100/io.h | ||
5 | */ | ||
6 | #ifndef __ASM_ARM_ARCH_IO_H | ||
7 | #define __ASM_ARM_ARCH_IO_H | ||
8 | |||
9 | #define IO_SPACE_LIMIT 0xffffffff | ||
10 | |||
11 | /* | ||
12 | * We don't actually have real ISA nor PCI buses, but there is so many | ||
13 | * drivers out there that might just work if we fake them... | ||
14 | */ | ||
15 | #define __io(a) __typesafe_io(a) | ||
16 | |||
17 | #endif | ||
diff --git a/arch/arm/mach-s3c24xx/common.h b/arch/arm/mach-s3c24xx/common.h new file mode 100644 index 000000000000..c2f596e7bc2d --- /dev/null +++ b/arch/arm/mach-s3c24xx/common.h | |||
@@ -0,0 +1,18 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2012 Samsung Electronics Co., Ltd. | ||
3 | * http://www.samsung.com | ||
4 | * | ||
5 | * Common Header for S3C24XX SoCs | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | */ | ||
11 | |||
12 | #ifndef __ARCH_ARM_MACH_S3C24XX_COMMON_H | ||
13 | #define __ARCH_ARM_MACH_S3C24XX_COMMON_H __FILE__ | ||
14 | |||
15 | void s3c2410_restart(char mode, const char *cmd); | ||
16 | void s3c244x_restart(char mode, const char *cmd); | ||
17 | |||
18 | #endif /* __ARCH_ARM_MACH_S3C24XX_COMMON_H */ | ||
diff --git a/arch/arm/mach-sa1100/collie.c b/arch/arm/mach-sa1100/collie.c index 48885b7efd6b..c7f418b0cde9 100644 --- a/arch/arm/mach-sa1100/collie.c +++ b/arch/arm/mach-sa1100/collie.c | |||
@@ -313,6 +313,10 @@ static struct sa1100fb_mach_info collie_lcd_info = { | |||
313 | 313 | ||
314 | .lccr0 = LCCR0_Color | LCCR0_Sngl | LCCR0_Act, | 314 | .lccr0 = LCCR0_Color | LCCR0_Sngl | LCCR0_Act, |
315 | .lccr3 = LCCR3_OutEnH | LCCR3_PixRsEdg | LCCR3_ACBsDiv(2), | 315 | .lccr3 = LCCR3_OutEnH | LCCR3_PixRsEdg | LCCR3_ACBsDiv(2), |
316 | |||
317 | #ifdef CONFIG_BACKLIGHT_LOCOMO | ||
318 | .lcd_power = locomolcd_power | ||
319 | #endif | ||
316 | }; | 320 | }; |
317 | 321 | ||
318 | static void __init collie_init(void) | 322 | static void __init collie_init(void) |
diff --git a/arch/arm/mach-sa1100/include/mach/collie.h b/arch/arm/mach-sa1100/include/mach/collie.h index 52acda7061b7..f33679d2d3ee 100644 --- a/arch/arm/mach-sa1100/include/mach/collie.h +++ b/arch/arm/mach-sa1100/include/mach/collie.h | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * arch/arm/mach-sa1100/include/mach/collie.h | 2 | * arch/arm/mach-sa1100/include/mach/collie.h |
3 | * | 3 | * |
4 | * This file contains the hardware specific definitions for Assabet | 4 | * This file contains the hardware specific definitions for Collie |
5 | * Only include this file from SA1100-specific files. | 5 | * Only include this file from SA1100-specific files. |
6 | * | 6 | * |
7 | * ChangeLog: | 7 | * ChangeLog: |
@@ -13,6 +13,7 @@ | |||
13 | #ifndef __ASM_ARCH_COLLIE_H | 13 | #ifndef __ASM_ARCH_COLLIE_H |
14 | #define __ASM_ARCH_COLLIE_H | 14 | #define __ASM_ARCH_COLLIE_H |
15 | 15 | ||
16 | extern void locomolcd_power(int on); | ||
16 | 17 | ||
17 | #define COLLIE_SCOOP_GPIO_BASE (GPIO_MAX + 1) | 18 | #define COLLIE_SCOOP_GPIO_BASE (GPIO_MAX + 1) |
18 | #define COLLIE_GPIO_CHARGE_ON (COLLIE_SCOOP_GPIO_BASE + 0) | 19 | #define COLLIE_GPIO_CHARGE_ON (COLLIE_SCOOP_GPIO_BASE + 0) |
diff --git a/arch/arm/mach-versatile/pci.c b/arch/arm/mach-versatile/pci.c index a6e23f464528..d2268be8c34c 100644 --- a/arch/arm/mach-versatile/pci.c +++ b/arch/arm/mach-versatile/pci.c | |||
@@ -190,7 +190,7 @@ static struct resource pre_mem = { | |||
190 | .flags = IORESOURCE_MEM | IORESOURCE_PREFETCH, | 190 | .flags = IORESOURCE_MEM | IORESOURCE_PREFETCH, |
191 | }; | 191 | }; |
192 | 192 | ||
193 | static int __init pci_versatile_setup_resources(struct list_head *resources) | 193 | static int __init pci_versatile_setup_resources(struct pci_sys_data *sys) |
194 | { | 194 | { |
195 | int ret = 0; | 195 | int ret = 0; |
196 | 196 | ||
@@ -218,9 +218,9 @@ static int __init pci_versatile_setup_resources(struct list_head *resources) | |||
218 | * the mem resource for this bus | 218 | * the mem resource for this bus |
219 | * the prefetch mem resource for this bus | 219 | * the prefetch mem resource for this bus |
220 | */ | 220 | */ |
221 | pci_add_resource_offset(resources, &io_mem, sys->io_offset); | 221 | pci_add_resource_offset(&sys->resources, &io_mem, sys->io_offset); |
222 | pci_add_resource_offset(resources, &non_mem, sys->mem_offset); | 222 | pci_add_resource_offset(&sys->resources, &non_mem, sys->mem_offset); |
223 | pci_add_resource_offset(resources, &pre_mem, sys->mem_offset); | 223 | pci_add_resource_offset(&sys->resources, &pre_mem, sys->mem_offset); |
224 | 224 | ||
225 | goto out; | 225 | goto out; |
226 | 226 | ||
@@ -249,7 +249,7 @@ int __init pci_versatile_setup(int nr, struct pci_sys_data *sys) | |||
249 | 249 | ||
250 | if (nr == 0) { | 250 | if (nr == 0) { |
251 | sys->mem_offset = 0; | 251 | sys->mem_offset = 0; |
252 | ret = pci_versatile_setup_resources(&sys->resources); | 252 | ret = pci_versatile_setup_resources(sys); |
253 | if (ret < 0) { | 253 | if (ret < 0) { |
254 | printk("pci_versatile_setup: resources... oops?\n"); | 254 | printk("pci_versatile_setup: resources... oops?\n"); |
255 | goto out; | 255 | goto out; |
diff --git a/arch/arm/plat-mxc/3ds_debugboard.c b/arch/arm/plat-mxc/3ds_debugboard.c index d1e31fa1b0c3..5cac2c540f4f 100644 --- a/arch/arm/plat-mxc/3ds_debugboard.c +++ b/arch/arm/plat-mxc/3ds_debugboard.c | |||
@@ -80,7 +80,7 @@ static struct smsc911x_platform_config smsc911x_config = { | |||
80 | 80 | ||
81 | static struct platform_device smsc_lan9217_device = { | 81 | static struct platform_device smsc_lan9217_device = { |
82 | .name = "smsc911x", | 82 | .name = "smsc911x", |
83 | .id = 0, | 83 | .id = -1, |
84 | .dev = { | 84 | .dev = { |
85 | .platform_data = &smsc911x_config, | 85 | .platform_data = &smsc911x_config, |
86 | }, | 86 | }, |
diff --git a/arch/arm/plat-omap/Kconfig b/arch/arm/plat-omap/Kconfig index ce1e9b96ba1a..ad95c7a5d009 100644 --- a/arch/arm/plat-omap/Kconfig +++ b/arch/arm/plat-omap/Kconfig | |||
@@ -17,6 +17,7 @@ config ARCH_OMAP1 | |||
17 | select IRQ_DOMAIN | 17 | select IRQ_DOMAIN |
18 | select HAVE_IDE | 18 | select HAVE_IDE |
19 | select NEED_MACH_MEMORY_H | 19 | select NEED_MACH_MEMORY_H |
20 | select NEED_MACH_IO_H if PCCARD | ||
20 | help | 21 | help |
21 | "Systems based on omap7xx, omap15xx or omap16xx" | 22 | "Systems based on omap7xx, omap15xx or omap16xx" |
22 | 23 | ||
diff --git a/arch/arm/plat-omap/clock.c b/arch/arm/plat-omap/clock.c index 56b6f8b7053e..8506cbb7fea4 100644 --- a/arch/arm/plat-omap/clock.c +++ b/arch/arm/plat-omap/clock.c | |||
@@ -441,6 +441,8 @@ static int __init clk_disable_unused(void) | |||
441 | return 0; | 441 | return 0; |
442 | 442 | ||
443 | pr_info("clock: disabling unused clocks to save power\n"); | 443 | pr_info("clock: disabling unused clocks to save power\n"); |
444 | |||
445 | spin_lock_irqsave(&clockfw_lock, flags); | ||
444 | list_for_each_entry(ck, &clocks, node) { | 446 | list_for_each_entry(ck, &clocks, node) { |
445 | if (ck->ops == &clkops_null) | 447 | if (ck->ops == &clkops_null) |
446 | continue; | 448 | continue; |
@@ -448,10 +450,9 @@ static int __init clk_disable_unused(void) | |||
448 | if (ck->usecount > 0 || !ck->enable_reg) | 450 | if (ck->usecount > 0 || !ck->enable_reg) |
449 | continue; | 451 | continue; |
450 | 452 | ||
451 | spin_lock_irqsave(&clockfw_lock, flags); | ||
452 | arch_clock->clk_disable_unused(ck); | 453 | arch_clock->clk_disable_unused(ck); |
453 | spin_unlock_irqrestore(&clockfw_lock, flags); | ||
454 | } | 454 | } |
455 | spin_unlock_irqrestore(&clockfw_lock, flags); | ||
455 | 456 | ||
456 | return 0; | 457 | return 0; |
457 | } | 458 | } |
diff --git a/arch/arm/plat-omap/include/plat/omap_hwmod.h b/arch/arm/plat-omap/include/plat/omap_hwmod.h index 9e8e63d52aab..8070145ccb98 100644 --- a/arch/arm/plat-omap/include/plat/omap_hwmod.h +++ b/arch/arm/plat-omap/include/plat/omap_hwmod.h | |||
@@ -47,17 +47,17 @@ extern struct omap_hwmod_sysc_fields omap_hwmod_sysc_type2; | |||
47 | * with the original PRCM protocol defined for OMAP2420 | 47 | * with the original PRCM protocol defined for OMAP2420 |
48 | */ | 48 | */ |
49 | #define SYSC_TYPE1_MIDLEMODE_SHIFT 12 | 49 | #define SYSC_TYPE1_MIDLEMODE_SHIFT 12 |
50 | #define SYSC_TYPE1_MIDLEMODE_MASK (0x3 << SYSC_MIDLEMODE_SHIFT) | 50 | #define SYSC_TYPE1_MIDLEMODE_MASK (0x3 << SYSC_TYPE1_MIDLEMODE_SHIFT) |
51 | #define SYSC_TYPE1_CLOCKACTIVITY_SHIFT 8 | 51 | #define SYSC_TYPE1_CLOCKACTIVITY_SHIFT 8 |
52 | #define SYSC_TYPE1_CLOCKACTIVITY_MASK (0x3 << SYSC_CLOCKACTIVITY_SHIFT) | 52 | #define SYSC_TYPE1_CLOCKACTIVITY_MASK (0x3 << SYSC_TYPE1_CLOCKACTIVITY_SHIFT) |
53 | #define SYSC_TYPE1_SIDLEMODE_SHIFT 3 | 53 | #define SYSC_TYPE1_SIDLEMODE_SHIFT 3 |
54 | #define SYSC_TYPE1_SIDLEMODE_MASK (0x3 << SYSC_SIDLEMODE_SHIFT) | 54 | #define SYSC_TYPE1_SIDLEMODE_MASK (0x3 << SYSC_TYPE1_SIDLEMODE_SHIFT) |
55 | #define SYSC_TYPE1_ENAWAKEUP_SHIFT 2 | 55 | #define SYSC_TYPE1_ENAWAKEUP_SHIFT 2 |
56 | #define SYSC_TYPE1_ENAWAKEUP_MASK (1 << SYSC_ENAWAKEUP_SHIFT) | 56 | #define SYSC_TYPE1_ENAWAKEUP_MASK (1 << SYSC_TYPE1_ENAWAKEUP_SHIFT) |
57 | #define SYSC_TYPE1_SOFTRESET_SHIFT 1 | 57 | #define SYSC_TYPE1_SOFTRESET_SHIFT 1 |
58 | #define SYSC_TYPE1_SOFTRESET_MASK (1 << SYSC_SOFTRESET_SHIFT) | 58 | #define SYSC_TYPE1_SOFTRESET_MASK (1 << SYSC_TYPE1_SOFTRESET_SHIFT) |
59 | #define SYSC_TYPE1_AUTOIDLE_SHIFT 0 | 59 | #define SYSC_TYPE1_AUTOIDLE_SHIFT 0 |
60 | #define SYSC_TYPE1_AUTOIDLE_MASK (1 << SYSC_AUTOIDLE_SHIFT) | 60 | #define SYSC_TYPE1_AUTOIDLE_MASK (1 << SYSC_TYPE1_AUTOIDLE_SHIFT) |
61 | 61 | ||
62 | /* | 62 | /* |
63 | * OCP SYSCONFIG bit shifts/masks TYPE2. These are for IPs compliant | 63 | * OCP SYSCONFIG bit shifts/masks TYPE2. These are for IPs compliant |
diff --git a/arch/blackfin/Kconfig b/arch/blackfin/Kconfig index c1269a1085e1..373a6902d8fa 100644 --- a/arch/blackfin/Kconfig +++ b/arch/blackfin/Kconfig | |||
@@ -823,7 +823,7 @@ config CACHELINE_ALIGNED_L1 | |||
823 | bool "Locate cacheline_aligned data to L1 Data Memory" | 823 | bool "Locate cacheline_aligned data to L1 Data Memory" |
824 | default y if !BF54x | 824 | default y if !BF54x |
825 | default n if BF54x | 825 | default n if BF54x |
826 | depends on !SMP && !BF531 | 826 | depends on !SMP && !BF531 && !CRC32 |
827 | help | 827 | help |
828 | If enabled, cacheline_aligned data is linked | 828 | If enabled, cacheline_aligned data is linked |
829 | into L1 data memory. (less latency) | 829 | into L1 data memory. (less latency) |
diff --git a/arch/blackfin/configs/BF527-EZKIT_defconfig b/arch/blackfin/configs/BF527-EZKIT_defconfig index 9ccc18a6b4df..90b175323644 100644 --- a/arch/blackfin/configs/BF527-EZKIT_defconfig +++ b/arch/blackfin/configs/BF527-EZKIT_defconfig | |||
@@ -147,6 +147,7 @@ CONFIG_USB_OTG_BLACKLIST_HUB=y | |||
147 | CONFIG_USB_MON=y | 147 | CONFIG_USB_MON=y |
148 | CONFIG_USB_MUSB_HDRC=y | 148 | CONFIG_USB_MUSB_HDRC=y |
149 | CONFIG_USB_MUSB_BLACKFIN=y | 149 | CONFIG_USB_MUSB_BLACKFIN=y |
150 | CONFIG_MUSB_PIO_ONLY=y | ||
150 | CONFIG_USB_STORAGE=y | 151 | CONFIG_USB_STORAGE=y |
151 | CONFIG_USB_GADGET=y | 152 | CONFIG_USB_GADGET=y |
152 | CONFIG_RTC_CLASS=y | 153 | CONFIG_RTC_CLASS=y |
diff --git a/arch/blackfin/include/asm/gpio.h b/arch/blackfin/include/asm/gpio.h index 5a25856381ff..12d3571b5232 100644 --- a/arch/blackfin/include/asm/gpio.h +++ b/arch/blackfin/include/asm/gpio.h | |||
@@ -244,16 +244,26 @@ static inline int gpio_set_debounce(unsigned gpio, unsigned debounce) | |||
244 | return -EINVAL; | 244 | return -EINVAL; |
245 | } | 245 | } |
246 | 246 | ||
247 | static inline int gpio_get_value(unsigned gpio) | 247 | static inline int __gpio_get_value(unsigned gpio) |
248 | { | 248 | { |
249 | return bfin_gpio_get_value(gpio); | 249 | return bfin_gpio_get_value(gpio); |
250 | } | 250 | } |
251 | 251 | ||
252 | static inline void gpio_set_value(unsigned gpio, int value) | 252 | static inline void __gpio_set_value(unsigned gpio, int value) |
253 | { | 253 | { |
254 | return bfin_gpio_set_value(gpio, value); | 254 | return bfin_gpio_set_value(gpio, value); |
255 | } | 255 | } |
256 | 256 | ||
257 | static inline int gpio_get_value(unsigned gpio) | ||
258 | { | ||
259 | return __gpio_get_value(gpio); | ||
260 | } | ||
261 | |||
262 | static inline void gpio_set_value(unsigned gpio, int value) | ||
263 | { | ||
264 | return __gpio_set_value(gpio, value); | ||
265 | } | ||
266 | |||
257 | static inline int gpio_to_irq(unsigned gpio) | 267 | static inline int gpio_to_irq(unsigned gpio) |
258 | { | 268 | { |
259 | if (likely(gpio < MAX_BLACKFIN_GPIOS)) | 269 | if (likely(gpio < MAX_BLACKFIN_GPIOS)) |
diff --git a/arch/c6x/kernel/signal.c b/arch/c6x/kernel/signal.c index 304f675826e9..3b5a05099989 100644 --- a/arch/c6x/kernel/signal.c +++ b/arch/c6x/kernel/signal.c | |||
@@ -85,10 +85,7 @@ asmlinkage int do_rt_sigreturn(struct pt_regs *regs) | |||
85 | goto badframe; | 85 | goto badframe; |
86 | 86 | ||
87 | sigdelsetmask(&set, ~_BLOCKABLE); | 87 | sigdelsetmask(&set, ~_BLOCKABLE); |
88 | spin_lock_irq(¤t->sighand->siglock); | 88 | set_current_blocked(&set); |
89 | current->blocked = set; | ||
90 | recalc_sigpending(); | ||
91 | spin_unlock_irq(¤t->sighand->siglock); | ||
92 | 89 | ||
93 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext)) | 90 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext)) |
94 | goto badframe; | 91 | goto badframe; |
@@ -279,15 +276,8 @@ static int handle_signal(int sig, | |||
279 | 276 | ||
280 | /* Set up the stack frame */ | 277 | /* Set up the stack frame */ |
281 | ret = setup_rt_frame(sig, ka, info, oldset, regs); | 278 | ret = setup_rt_frame(sig, ka, info, oldset, regs); |
282 | if (ret == 0) { | 279 | if (ret == 0) |
283 | spin_lock_irq(¤t->sighand->siglock); | 280 | block_sigmask(ka, sig); |
284 | sigorsets(¤t->blocked, ¤t->blocked, | ||
285 | &ka->sa.sa_mask); | ||
286 | if (!(ka->sa.sa_flags & SA_NODEFER)) | ||
287 | sigaddset(¤t->blocked, sig); | ||
288 | recalc_sigpending(); | ||
289 | spin_unlock_irq(¤t->sighand->siglock); | ||
290 | } | ||
291 | 281 | ||
292 | return ret; | 282 | return ret; |
293 | } | 283 | } |
diff --git a/arch/tile/Kconfig b/arch/tile/Kconfig index 11270ca22c0a..96033e2d6845 100644 --- a/arch/tile/Kconfig +++ b/arch/tile/Kconfig | |||
@@ -12,7 +12,7 @@ config TILE | |||
12 | select GENERIC_PENDING_IRQ if SMP | 12 | select GENERIC_PENDING_IRQ if SMP |
13 | select GENERIC_IRQ_SHOW | 13 | select GENERIC_IRQ_SHOW |
14 | select SYS_HYPERVISOR | 14 | select SYS_HYPERVISOR |
15 | select ARCH_HAVE_NMI_SAFE_CMPXCHG if !M386 | 15 | select ARCH_HAVE_NMI_SAFE_CMPXCHG |
16 | 16 | ||
17 | # FIXME: investigate whether we need/want these options. | 17 | # FIXME: investigate whether we need/want these options. |
18 | # select HAVE_IOREMAP_PROT | 18 | # select HAVE_IOREMAP_PROT |
@@ -69,6 +69,9 @@ config ARCH_PHYS_ADDR_T_64BIT | |||
69 | config ARCH_DMA_ADDR_T_64BIT | 69 | config ARCH_DMA_ADDR_T_64BIT |
70 | def_bool y | 70 | def_bool y |
71 | 71 | ||
72 | config NEED_DMA_MAP_STATE | ||
73 | def_bool y | ||
74 | |||
72 | config LOCKDEP_SUPPORT | 75 | config LOCKDEP_SUPPORT |
73 | def_bool y | 76 | def_bool y |
74 | 77 | ||
@@ -118,7 +121,7 @@ config 64BIT | |||
118 | 121 | ||
119 | config ARCH_DEFCONFIG | 122 | config ARCH_DEFCONFIG |
120 | string | 123 | string |
121 | default "arch/tile/configs/tile_defconfig" if !TILEGX | 124 | default "arch/tile/configs/tilepro_defconfig" if !TILEGX |
122 | default "arch/tile/configs/tilegx_defconfig" if TILEGX | 125 | default "arch/tile/configs/tilegx_defconfig" if TILEGX |
123 | 126 | ||
124 | source "init/Kconfig" | 127 | source "init/Kconfig" |
@@ -240,6 +243,7 @@ endchoice | |||
240 | 243 | ||
241 | config PAGE_OFFSET | 244 | config PAGE_OFFSET |
242 | hex | 245 | hex |
246 | depends on !64BIT | ||
243 | default 0xF0000000 if VMSPLIT_3_75G | 247 | default 0xF0000000 if VMSPLIT_3_75G |
244 | default 0xE0000000 if VMSPLIT_3_5G | 248 | default 0xE0000000 if VMSPLIT_3_5G |
245 | default 0xB0000000 if VMSPLIT_2_75G | 249 | default 0xB0000000 if VMSPLIT_2_75G |
diff --git a/arch/tile/Makefile b/arch/tile/Makefile index 17acce70569b..9520bc5a4b7f 100644 --- a/arch/tile/Makefile +++ b/arch/tile/Makefile | |||
@@ -30,7 +30,8 @@ ifneq ($(CONFIG_DEBUG_EXTRA_FLAGS),"") | |||
30 | KBUILD_CFLAGS += $(CONFIG_DEBUG_EXTRA_FLAGS) | 30 | KBUILD_CFLAGS += $(CONFIG_DEBUG_EXTRA_FLAGS) |
31 | endif | 31 | endif |
32 | 32 | ||
33 | LIBGCC_PATH := $(shell $(CC) $(KBUILD_CFLAGS) -print-libgcc-file-name) | 33 | LIBGCC_PATH := \ |
34 | $(shell $(CC) $(KBUILD_CFLAGS) $(KCFLAGS) -print-libgcc-file-name) | ||
34 | 35 | ||
35 | # Provide the path to use for "make defconfig". | 36 | # Provide the path to use for "make defconfig". |
36 | KBUILD_DEFCONFIG := $(ARCH)_defconfig | 37 | KBUILD_DEFCONFIG := $(ARCH)_defconfig |
@@ -53,8 +54,6 @@ libs-y += $(LIBGCC_PATH) | |||
53 | # See arch/tile/Kbuild for content of core part of the kernel | 54 | # See arch/tile/Kbuild for content of core part of the kernel |
54 | core-y += arch/tile/ | 55 | core-y += arch/tile/ |
55 | 56 | ||
56 | core-$(CONFIG_KVM) += arch/tile/kvm/ | ||
57 | |||
58 | ifdef TILERA_ROOT | 57 | ifdef TILERA_ROOT |
59 | INSTALL_PATH ?= $(TILERA_ROOT)/tile/boot | 58 | INSTALL_PATH ?= $(TILERA_ROOT)/tile/boot |
60 | endif | 59 | endif |
diff --git a/arch/tile/include/arch/spr_def.h b/arch/tile/include/arch/spr_def.h index f548efeb2de3..d6ba449b5363 100644 --- a/arch/tile/include/arch/spr_def.h +++ b/arch/tile/include/arch/spr_def.h | |||
@@ -60,8 +60,8 @@ | |||
60 | _concat4(SPR_IPI_EVENT_, CONFIG_KERNEL_PL,,) | 60 | _concat4(SPR_IPI_EVENT_, CONFIG_KERNEL_PL,,) |
61 | #define SPR_IPI_EVENT_RESET_K \ | 61 | #define SPR_IPI_EVENT_RESET_K \ |
62 | _concat4(SPR_IPI_EVENT_RESET_, CONFIG_KERNEL_PL,,) | 62 | _concat4(SPR_IPI_EVENT_RESET_, CONFIG_KERNEL_PL,,) |
63 | #define SPR_IPI_MASK_SET_K \ | 63 | #define SPR_IPI_EVENT_SET_K \ |
64 | _concat4(SPR_IPI_MASK_SET_, CONFIG_KERNEL_PL,,) | 64 | _concat4(SPR_IPI_EVENT_SET_, CONFIG_KERNEL_PL,,) |
65 | #define INT_IPI_K \ | 65 | #define INT_IPI_K \ |
66 | _concat4(INT_IPI_, CONFIG_KERNEL_PL,,) | 66 | _concat4(INT_IPI_, CONFIG_KERNEL_PL,,) |
67 | 67 | ||
diff --git a/arch/tile/include/asm/atomic.h b/arch/tile/include/asm/atomic.h index bb696da5d7cd..f2461429a4a4 100644 --- a/arch/tile/include/asm/atomic.h +++ b/arch/tile/include/asm/atomic.h | |||
@@ -17,6 +17,8 @@ | |||
17 | #ifndef _ASM_TILE_ATOMIC_H | 17 | #ifndef _ASM_TILE_ATOMIC_H |
18 | #define _ASM_TILE_ATOMIC_H | 18 | #define _ASM_TILE_ATOMIC_H |
19 | 19 | ||
20 | #include <asm/cmpxchg.h> | ||
21 | |||
20 | #ifndef __ASSEMBLY__ | 22 | #ifndef __ASSEMBLY__ |
21 | 23 | ||
22 | #include <linux/compiler.h> | 24 | #include <linux/compiler.h> |
@@ -121,54 +123,6 @@ static inline int atomic_read(const atomic_t *v) | |||
121 | */ | 123 | */ |
122 | #define atomic_add_negative(i, v) (atomic_add_return((i), (v)) < 0) | 124 | #define atomic_add_negative(i, v) (atomic_add_return((i), (v)) < 0) |
123 | 125 | ||
124 | /* Nonexistent functions intended to cause link errors. */ | ||
125 | extern unsigned long __xchg_called_with_bad_pointer(void); | ||
126 | extern unsigned long __cmpxchg_called_with_bad_pointer(void); | ||
127 | |||
128 | #define xchg(ptr, x) \ | ||
129 | ({ \ | ||
130 | typeof(*(ptr)) __x; \ | ||
131 | switch (sizeof(*(ptr))) { \ | ||
132 | case 4: \ | ||
133 | __x = (typeof(__x))(typeof(__x-__x))atomic_xchg( \ | ||
134 | (atomic_t *)(ptr), \ | ||
135 | (u32)(typeof((x)-(x)))(x)); \ | ||
136 | break; \ | ||
137 | case 8: \ | ||
138 | __x = (typeof(__x))(typeof(__x-__x))atomic64_xchg( \ | ||
139 | (atomic64_t *)(ptr), \ | ||
140 | (u64)(typeof((x)-(x)))(x)); \ | ||
141 | break; \ | ||
142 | default: \ | ||
143 | __xchg_called_with_bad_pointer(); \ | ||
144 | } \ | ||
145 | __x; \ | ||
146 | }) | ||
147 | |||
148 | #define cmpxchg(ptr, o, n) \ | ||
149 | ({ \ | ||
150 | typeof(*(ptr)) __x; \ | ||
151 | switch (sizeof(*(ptr))) { \ | ||
152 | case 4: \ | ||
153 | __x = (typeof(__x))(typeof(__x-__x))atomic_cmpxchg( \ | ||
154 | (atomic_t *)(ptr), \ | ||
155 | (u32)(typeof((o)-(o)))(o), \ | ||
156 | (u32)(typeof((n)-(n)))(n)); \ | ||
157 | break; \ | ||
158 | case 8: \ | ||
159 | __x = (typeof(__x))(typeof(__x-__x))atomic64_cmpxchg( \ | ||
160 | (atomic64_t *)(ptr), \ | ||
161 | (u64)(typeof((o)-(o)))(o), \ | ||
162 | (u64)(typeof((n)-(n)))(n)); \ | ||
163 | break; \ | ||
164 | default: \ | ||
165 | __cmpxchg_called_with_bad_pointer(); \ | ||
166 | } \ | ||
167 | __x; \ | ||
168 | }) | ||
169 | |||
170 | #define tas(ptr) (xchg((ptr), 1)) | ||
171 | |||
172 | #endif /* __ASSEMBLY__ */ | 126 | #endif /* __ASSEMBLY__ */ |
173 | 127 | ||
174 | #ifndef __tilegx__ | 128 | #ifndef __tilegx__ |
diff --git a/arch/tile/include/asm/atomic_32.h b/arch/tile/include/asm/atomic_32.h index 466dc4a39a4f..54d1da826f93 100644 --- a/arch/tile/include/asm/atomic_32.h +++ b/arch/tile/include/asm/atomic_32.h | |||
@@ -200,7 +200,7 @@ static inline u64 atomic64_add_return(u64 i, atomic64_t *v) | |||
200 | * @u: ...unless v is equal to u. | 200 | * @u: ...unless v is equal to u. |
201 | * | 201 | * |
202 | * Atomically adds @a to @v, so long as @v was not already @u. | 202 | * Atomically adds @a to @v, so long as @v was not already @u. |
203 | * Returns the old value of @v. | 203 | * Returns non-zero if @v was not @u, and zero otherwise. |
204 | */ | 204 | */ |
205 | static inline u64 atomic64_add_unless(atomic64_t *v, u64 a, u64 u) | 205 | static inline u64 atomic64_add_unless(atomic64_t *v, u64 a, u64 u) |
206 | { | 206 | { |
diff --git a/arch/tile/include/asm/bitops_64.h b/arch/tile/include/asm/bitops_64.h index 58d021a9834f..60b87ee54fb8 100644 --- a/arch/tile/include/asm/bitops_64.h +++ b/arch/tile/include/asm/bitops_64.h | |||
@@ -38,10 +38,10 @@ static inline void clear_bit(unsigned nr, volatile unsigned long *addr) | |||
38 | 38 | ||
39 | static inline void change_bit(unsigned nr, volatile unsigned long *addr) | 39 | static inline void change_bit(unsigned nr, volatile unsigned long *addr) |
40 | { | 40 | { |
41 | unsigned long old, mask = (1UL << (nr % BITS_PER_LONG)); | 41 | unsigned long mask = (1UL << (nr % BITS_PER_LONG)); |
42 | long guess, oldval; | 42 | unsigned long guess, oldval; |
43 | addr += nr / BITS_PER_LONG; | 43 | addr += nr / BITS_PER_LONG; |
44 | old = *addr; | 44 | oldval = *addr; |
45 | do { | 45 | do { |
46 | guess = oldval; | 46 | guess = oldval; |
47 | oldval = atomic64_cmpxchg((atomic64_t *)addr, | 47 | oldval = atomic64_cmpxchg((atomic64_t *)addr, |
@@ -85,7 +85,7 @@ static inline int test_and_change_bit(unsigned nr, | |||
85 | volatile unsigned long *addr) | 85 | volatile unsigned long *addr) |
86 | { | 86 | { |
87 | unsigned long mask = (1UL << (nr % BITS_PER_LONG)); | 87 | unsigned long mask = (1UL << (nr % BITS_PER_LONG)); |
88 | long guess, oldval = *addr; | 88 | unsigned long guess, oldval; |
89 | addr += nr / BITS_PER_LONG; | 89 | addr += nr / BITS_PER_LONG; |
90 | oldval = *addr; | 90 | oldval = *addr; |
91 | do { | 91 | do { |
diff --git a/arch/tile/include/asm/cmpxchg.h b/arch/tile/include/asm/cmpxchg.h new file mode 100644 index 000000000000..276f067e3640 --- /dev/null +++ b/arch/tile/include/asm/cmpxchg.h | |||
@@ -0,0 +1,73 @@ | |||
1 | /* | ||
2 | * cmpxchg.h -- forked from asm/atomic.h with this copyright: | ||
3 | * | ||
4 | * Copyright 2010 Tilera Corporation. All Rights Reserved. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation, version 2. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, but | ||
11 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or | ||
13 | * NON INFRINGEMENT. See the GNU General Public License for | ||
14 | * more details. | ||
15 | * | ||
16 | */ | ||
17 | |||
18 | #ifndef _ASM_TILE_CMPXCHG_H | ||
19 | #define _ASM_TILE_CMPXCHG_H | ||
20 | |||
21 | #ifndef __ASSEMBLY__ | ||
22 | |||
23 | /* Nonexistent functions intended to cause link errors. */ | ||
24 | extern unsigned long __xchg_called_with_bad_pointer(void); | ||
25 | extern unsigned long __cmpxchg_called_with_bad_pointer(void); | ||
26 | |||
27 | #define xchg(ptr, x) \ | ||
28 | ({ \ | ||
29 | typeof(*(ptr)) __x; \ | ||
30 | switch (sizeof(*(ptr))) { \ | ||
31 | case 4: \ | ||
32 | __x = (typeof(__x))(typeof(__x-__x))atomic_xchg( \ | ||
33 | (atomic_t *)(ptr), \ | ||
34 | (u32)(typeof((x)-(x)))(x)); \ | ||
35 | break; \ | ||
36 | case 8: \ | ||
37 | __x = (typeof(__x))(typeof(__x-__x))atomic64_xchg( \ | ||
38 | (atomic64_t *)(ptr), \ | ||
39 | (u64)(typeof((x)-(x)))(x)); \ | ||
40 | break; \ | ||
41 | default: \ | ||
42 | __xchg_called_with_bad_pointer(); \ | ||
43 | } \ | ||
44 | __x; \ | ||
45 | }) | ||
46 | |||
47 | #define cmpxchg(ptr, o, n) \ | ||
48 | ({ \ | ||
49 | typeof(*(ptr)) __x; \ | ||
50 | switch (sizeof(*(ptr))) { \ | ||
51 | case 4: \ | ||
52 | __x = (typeof(__x))(typeof(__x-__x))atomic_cmpxchg( \ | ||
53 | (atomic_t *)(ptr), \ | ||
54 | (u32)(typeof((o)-(o)))(o), \ | ||
55 | (u32)(typeof((n)-(n)))(n)); \ | ||
56 | break; \ | ||
57 | case 8: \ | ||
58 | __x = (typeof(__x))(typeof(__x-__x))atomic64_cmpxchg( \ | ||
59 | (atomic64_t *)(ptr), \ | ||
60 | (u64)(typeof((o)-(o)))(o), \ | ||
61 | (u64)(typeof((n)-(n)))(n)); \ | ||
62 | break; \ | ||
63 | default: \ | ||
64 | __cmpxchg_called_with_bad_pointer(); \ | ||
65 | } \ | ||
66 | __x; \ | ||
67 | }) | ||
68 | |||
69 | #define tas(ptr) (xchg((ptr), 1)) | ||
70 | |||
71 | #endif /* __ASSEMBLY__ */ | ||
72 | |||
73 | #endif /* _ASM_TILE_CMPXCHG_H */ | ||
diff --git a/arch/tile/include/asm/irq.h b/arch/tile/include/asm/irq.h index f80f8ceabc67..33cff9a3058b 100644 --- a/arch/tile/include/asm/irq.h +++ b/arch/tile/include/asm/irq.h | |||
@@ -21,7 +21,7 @@ | |||
21 | #define NR_IRQS 32 | 21 | #define NR_IRQS 32 |
22 | 22 | ||
23 | /* IRQ numbers used for linux IPIs. */ | 23 | /* IRQ numbers used for linux IPIs. */ |
24 | #define IRQ_RESCHEDULE 1 | 24 | #define IRQ_RESCHEDULE 0 |
25 | 25 | ||
26 | #define irq_canonicalize(irq) (irq) | 26 | #define irq_canonicalize(irq) (irq) |
27 | 27 | ||
diff --git a/arch/tile/include/asm/spinlock_64.h b/arch/tile/include/asm/spinlock_64.h index 72be5904e020..5f8b6a095fd8 100644 --- a/arch/tile/include/asm/spinlock_64.h +++ b/arch/tile/include/asm/spinlock_64.h | |||
@@ -137,7 +137,7 @@ static inline void arch_read_unlock(arch_rwlock_t *rw) | |||
137 | static inline void arch_write_unlock(arch_rwlock_t *rw) | 137 | static inline void arch_write_unlock(arch_rwlock_t *rw) |
138 | { | 138 | { |
139 | __insn_mf(); | 139 | __insn_mf(); |
140 | rw->lock = 0; | 140 | __insn_exch4(&rw->lock, 0); /* Avoid waiting in the write buffer. */ |
141 | } | 141 | } |
142 | 142 | ||
143 | static inline int arch_read_trylock(arch_rwlock_t *rw) | 143 | static inline int arch_read_trylock(arch_rwlock_t *rw) |
diff --git a/arch/tile/include/asm/stack.h b/arch/tile/include/asm/stack.h index 4d97a2db932e..0e9d382a2d45 100644 --- a/arch/tile/include/asm/stack.h +++ b/arch/tile/include/asm/stack.h | |||
@@ -25,7 +25,6 @@ | |||
25 | struct KBacktraceIterator { | 25 | struct KBacktraceIterator { |
26 | BacktraceIterator it; | 26 | BacktraceIterator it; |
27 | struct task_struct *task; /* task we are backtracing */ | 27 | struct task_struct *task; /* task we are backtracing */ |
28 | pte_t *pgtable; /* page table for user space access */ | ||
29 | int end; /* iteration complete. */ | 28 | int end; /* iteration complete. */ |
30 | int new_context; /* new context is starting */ | 29 | int new_context; /* new context is starting */ |
31 | int profile; /* profiling, so stop on async intrpt */ | 30 | int profile; /* profiling, so stop on async intrpt */ |
diff --git a/arch/tile/include/asm/traps.h b/arch/tile/include/asm/traps.h index 5f20f920f932..e28c3df4176a 100644 --- a/arch/tile/include/asm/traps.h +++ b/arch/tile/include/asm/traps.h | |||
@@ -64,7 +64,11 @@ void do_breakpoint(struct pt_regs *, int fault_num); | |||
64 | 64 | ||
65 | 65 | ||
66 | #ifdef __tilegx__ | 66 | #ifdef __tilegx__ |
67 | /* kernel/single_step.c */ | ||
67 | void gx_singlestep_handle(struct pt_regs *, int fault_num); | 68 | void gx_singlestep_handle(struct pt_regs *, int fault_num); |
69 | |||
70 | /* kernel/intvec_64.S */ | ||
71 | void fill_ra_stack(void); | ||
68 | #endif | 72 | #endif |
69 | 73 | ||
70 | #endif /* _ASM_TILE_SYSCALLS_H */ | 74 | #endif /* _ASM_TILE_TRAPS_H */ |
diff --git a/arch/tile/kernel/entry.S b/arch/tile/kernel/entry.S index 431e9ae60488..ec91568df880 100644 --- a/arch/tile/kernel/entry.S +++ b/arch/tile/kernel/entry.S | |||
@@ -85,6 +85,7 @@ STD_ENTRY(cpu_idle_on_new_stack) | |||
85 | /* Loop forever on a nap during SMP boot. */ | 85 | /* Loop forever on a nap during SMP boot. */ |
86 | STD_ENTRY(smp_nap) | 86 | STD_ENTRY(smp_nap) |
87 | nap | 87 | nap |
88 | nop /* avoid provoking the icache prefetch with a jump */ | ||
88 | j smp_nap /* we are not architecturally guaranteed not to exit nap */ | 89 | j smp_nap /* we are not architecturally guaranteed not to exit nap */ |
89 | jrp lr /* clue in the backtracer */ | 90 | jrp lr /* clue in the backtracer */ |
90 | STD_ENDPROC(smp_nap) | 91 | STD_ENDPROC(smp_nap) |
@@ -105,5 +106,6 @@ STD_ENTRY(_cpu_idle) | |||
105 | .global _cpu_idle_nap | 106 | .global _cpu_idle_nap |
106 | _cpu_idle_nap: | 107 | _cpu_idle_nap: |
107 | nap | 108 | nap |
109 | nop /* avoid provoking the icache prefetch with a jump */ | ||
108 | jrp lr | 110 | jrp lr |
109 | STD_ENDPROC(_cpu_idle) | 111 | STD_ENDPROC(_cpu_idle) |
diff --git a/arch/tile/kernel/intvec_32.S b/arch/tile/kernel/intvec_32.S index aecc8ed5f39b..5d56a1ef5ba5 100644 --- a/arch/tile/kernel/intvec_32.S +++ b/arch/tile/kernel/intvec_32.S | |||
@@ -799,6 +799,10 @@ handle_interrupt: | |||
799 | * This routine takes a boolean in r30 indicating if this is an NMI. | 799 | * This routine takes a boolean in r30 indicating if this is an NMI. |
800 | * If so, we also expect a boolean in r31 indicating whether to | 800 | * If so, we also expect a boolean in r31 indicating whether to |
801 | * re-enable the oprofile interrupts. | 801 | * re-enable the oprofile interrupts. |
802 | * | ||
803 | * Note that .Lresume_userspace is jumped to directly in several | ||
804 | * places, and we need to make sure r30 is set correctly in those | ||
805 | * callers as well. | ||
802 | */ | 806 | */ |
803 | STD_ENTRY(interrupt_return) | 807 | STD_ENTRY(interrupt_return) |
804 | /* If we're resuming to kernel space, don't check thread flags. */ | 808 | /* If we're resuming to kernel space, don't check thread flags. */ |
@@ -1237,7 +1241,10 @@ handle_syscall: | |||
1237 | bzt r30, 1f | 1241 | bzt r30, 1f |
1238 | jal do_syscall_trace | 1242 | jal do_syscall_trace |
1239 | FEEDBACK_REENTER(handle_syscall) | 1243 | FEEDBACK_REENTER(handle_syscall) |
1240 | 1: j .Lresume_userspace /* jump into middle of interrupt_return */ | 1244 | 1: { |
1245 | movei r30, 0 /* not an NMI */ | ||
1246 | j .Lresume_userspace /* jump into middle of interrupt_return */ | ||
1247 | } | ||
1241 | 1248 | ||
1242 | .Linvalid_syscall: | 1249 | .Linvalid_syscall: |
1243 | /* Report an invalid syscall back to the user program */ | 1250 | /* Report an invalid syscall back to the user program */ |
@@ -1246,7 +1253,10 @@ handle_syscall: | |||
1246 | movei r28, -ENOSYS | 1253 | movei r28, -ENOSYS |
1247 | } | 1254 | } |
1248 | sw r29, r28 | 1255 | sw r29, r28 |
1249 | j .Lresume_userspace /* jump into middle of interrupt_return */ | 1256 | { |
1257 | movei r30, 0 /* not an NMI */ | ||
1258 | j .Lresume_userspace /* jump into middle of interrupt_return */ | ||
1259 | } | ||
1250 | STD_ENDPROC(handle_syscall) | 1260 | STD_ENDPROC(handle_syscall) |
1251 | 1261 | ||
1252 | /* Return the address for oprofile to suppress in backtraces. */ | 1262 | /* Return the address for oprofile to suppress in backtraces. */ |
@@ -1262,7 +1272,10 @@ STD_ENTRY(ret_from_fork) | |||
1262 | jal sim_notify_fork | 1272 | jal sim_notify_fork |
1263 | jal schedule_tail | 1273 | jal schedule_tail |
1264 | FEEDBACK_REENTER(ret_from_fork) | 1274 | FEEDBACK_REENTER(ret_from_fork) |
1265 | j .Lresume_userspace /* jump into middle of interrupt_return */ | 1275 | { |
1276 | movei r30, 0 /* not an NMI */ | ||
1277 | j .Lresume_userspace /* jump into middle of interrupt_return */ | ||
1278 | } | ||
1266 | STD_ENDPROC(ret_from_fork) | 1279 | STD_ENDPROC(ret_from_fork) |
1267 | 1280 | ||
1268 | /* | 1281 | /* |
@@ -1376,7 +1389,10 @@ handle_ill: | |||
1376 | 1389 | ||
1377 | jal send_sigtrap /* issue a SIGTRAP */ | 1390 | jal send_sigtrap /* issue a SIGTRAP */ |
1378 | FEEDBACK_REENTER(handle_ill) | 1391 | FEEDBACK_REENTER(handle_ill) |
1379 | j .Lresume_userspace /* jump into middle of interrupt_return */ | 1392 | { |
1393 | movei r30, 0 /* not an NMI */ | ||
1394 | j .Lresume_userspace /* jump into middle of interrupt_return */ | ||
1395 | } | ||
1380 | 1396 | ||
1381 | .Ldispatch_normal_ill: | 1397 | .Ldispatch_normal_ill: |
1382 | { | 1398 | { |
diff --git a/arch/tile/kernel/intvec_64.S b/arch/tile/kernel/intvec_64.S index 79c93e10ba27..49d9d6621682 100644 --- a/arch/tile/kernel/intvec_64.S +++ b/arch/tile/kernel/intvec_64.S | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <asm/irqflags.h> | 22 | #include <asm/irqflags.h> |
23 | #include <asm/asm-offsets.h> | 23 | #include <asm/asm-offsets.h> |
24 | #include <asm/types.h> | 24 | #include <asm/types.h> |
25 | #include <asm/signal.h> | ||
25 | #include <hv/hypervisor.h> | 26 | #include <hv/hypervisor.h> |
26 | #include <arch/abi.h> | 27 | #include <arch/abi.h> |
27 | #include <arch/interrupts.h> | 28 | #include <arch/interrupts.h> |
@@ -605,6 +606,10 @@ handle_interrupt: | |||
605 | * This routine takes a boolean in r30 indicating if this is an NMI. | 606 | * This routine takes a boolean in r30 indicating if this is an NMI. |
606 | * If so, we also expect a boolean in r31 indicating whether to | 607 | * If so, we also expect a boolean in r31 indicating whether to |
607 | * re-enable the oprofile interrupts. | 608 | * re-enable the oprofile interrupts. |
609 | * | ||
610 | * Note that .Lresume_userspace is jumped to directly in several | ||
611 | * places, and we need to make sure r30 is set correctly in those | ||
612 | * callers as well. | ||
608 | */ | 613 | */ |
609 | STD_ENTRY(interrupt_return) | 614 | STD_ENTRY(interrupt_return) |
610 | /* If we're resuming to kernel space, don't check thread flags. */ | 615 | /* If we're resuming to kernel space, don't check thread flags. */ |
@@ -1039,11 +1044,28 @@ handle_syscall: | |||
1039 | 1044 | ||
1040 | /* Do syscall trace again, if requested. */ | 1045 | /* Do syscall trace again, if requested. */ |
1041 | ld r30, r31 | 1046 | ld r30, r31 |
1042 | andi r30, r30, _TIF_SYSCALL_TRACE | 1047 | andi r0, r30, _TIF_SYSCALL_TRACE |
1043 | beqzt r30, 1f | 1048 | { |
1049 | andi r0, r30, _TIF_SINGLESTEP | ||
1050 | beqzt r0, 1f | ||
1051 | } | ||
1044 | jal do_syscall_trace | 1052 | jal do_syscall_trace |
1045 | FEEDBACK_REENTER(handle_syscall) | 1053 | FEEDBACK_REENTER(handle_syscall) |
1046 | 1: j .Lresume_userspace /* jump into middle of interrupt_return */ | 1054 | andi r0, r30, _TIF_SINGLESTEP |
1055 | |||
1056 | 1: beqzt r0, 2f | ||
1057 | |||
1058 | /* Single stepping -- notify ptrace. */ | ||
1059 | { | ||
1060 | movei r0, SIGTRAP | ||
1061 | jal ptrace_notify | ||
1062 | } | ||
1063 | FEEDBACK_REENTER(handle_syscall) | ||
1064 | |||
1065 | 2: { | ||
1066 | movei r30, 0 /* not an NMI */ | ||
1067 | j .Lresume_userspace /* jump into middle of interrupt_return */ | ||
1068 | } | ||
1047 | 1069 | ||
1048 | .Lcompat_syscall: | 1070 | .Lcompat_syscall: |
1049 | /* | 1071 | /* |
@@ -1077,7 +1099,10 @@ handle_syscall: | |||
1077 | movei r28, -ENOSYS | 1099 | movei r28, -ENOSYS |
1078 | } | 1100 | } |
1079 | st r29, r28 | 1101 | st r29, r28 |
1080 | j .Lresume_userspace /* jump into middle of interrupt_return */ | 1102 | { |
1103 | movei r30, 0 /* not an NMI */ | ||
1104 | j .Lresume_userspace /* jump into middle of interrupt_return */ | ||
1105 | } | ||
1081 | STD_ENDPROC(handle_syscall) | 1106 | STD_ENDPROC(handle_syscall) |
1082 | 1107 | ||
1083 | /* Return the address for oprofile to suppress in backtraces. */ | 1108 | /* Return the address for oprofile to suppress in backtraces. */ |
@@ -1093,7 +1118,10 @@ STD_ENTRY(ret_from_fork) | |||
1093 | jal sim_notify_fork | 1118 | jal sim_notify_fork |
1094 | jal schedule_tail | 1119 | jal schedule_tail |
1095 | FEEDBACK_REENTER(ret_from_fork) | 1120 | FEEDBACK_REENTER(ret_from_fork) |
1096 | j .Lresume_userspace | 1121 | { |
1122 | movei r30, 0 /* not an NMI */ | ||
1123 | j .Lresume_userspace /* jump into middle of interrupt_return */ | ||
1124 | } | ||
1097 | STD_ENDPROC(ret_from_fork) | 1125 | STD_ENDPROC(ret_from_fork) |
1098 | 1126 | ||
1099 | /* Various stub interrupt handlers and syscall handlers */ | 1127 | /* Various stub interrupt handlers and syscall handlers */ |
@@ -1156,6 +1184,18 @@ int_unalign: | |||
1156 | push_extra_callee_saves r0 | 1184 | push_extra_callee_saves r0 |
1157 | j do_trap | 1185 | j do_trap |
1158 | 1186 | ||
1187 | /* Fill the return address stack with nonzero entries. */ | ||
1188 | STD_ENTRY(fill_ra_stack) | ||
1189 | { | ||
1190 | move r0, lr | ||
1191 | jal 1f | ||
1192 | } | ||
1193 | 1: jal 2f | ||
1194 | 2: jal 3f | ||
1195 | 3: jal 4f | ||
1196 | 4: jrp r0 | ||
1197 | STD_ENDPROC(fill_ra_stack) | ||
1198 | |||
1159 | /* Include .intrpt1 array of interrupt vectors */ | 1199 | /* Include .intrpt1 array of interrupt vectors */ |
1160 | .section ".intrpt1", "ax" | 1200 | .section ".intrpt1", "ax" |
1161 | 1201 | ||
@@ -1166,7 +1206,7 @@ int_unalign: | |||
1166 | #define do_hardwall_trap bad_intr | 1206 | #define do_hardwall_trap bad_intr |
1167 | #endif | 1207 | #endif |
1168 | 1208 | ||
1169 | int_hand INT_MEM_ERROR, MEM_ERROR, bad_intr | 1209 | int_hand INT_MEM_ERROR, MEM_ERROR, do_trap |
1170 | int_hand INT_SINGLE_STEP_3, SINGLE_STEP_3, bad_intr | 1210 | int_hand INT_SINGLE_STEP_3, SINGLE_STEP_3, bad_intr |
1171 | #if CONFIG_KERNEL_PL == 2 | 1211 | #if CONFIG_KERNEL_PL == 2 |
1172 | int_hand INT_SINGLE_STEP_2, SINGLE_STEP_2, gx_singlestep_handle | 1212 | int_hand INT_SINGLE_STEP_2, SINGLE_STEP_2, gx_singlestep_handle |
diff --git a/arch/tile/kernel/module.c b/arch/tile/kernel/module.c index b90ab9925674..98d476920106 100644 --- a/arch/tile/kernel/module.c +++ b/arch/tile/kernel/module.c | |||
@@ -67,6 +67,8 @@ void *module_alloc(unsigned long size) | |||
67 | area = __get_vm_area(size, VM_ALLOC, MEM_MODULE_START, MEM_MODULE_END); | 67 | area = __get_vm_area(size, VM_ALLOC, MEM_MODULE_START, MEM_MODULE_END); |
68 | if (!area) | 68 | if (!area) |
69 | goto error; | 69 | goto error; |
70 | area->nr_pages = npages; | ||
71 | area->pages = pages; | ||
70 | 72 | ||
71 | if (map_vm_area(area, prot_rwx, &pages)) { | 73 | if (map_vm_area(area, prot_rwx, &pages)) { |
72 | vunmap(area->addr); | 74 | vunmap(area->addr); |
diff --git a/arch/tile/kernel/process.c b/arch/tile/kernel/process.c index 30caecac94dc..2d5ef617bb39 100644 --- a/arch/tile/kernel/process.c +++ b/arch/tile/kernel/process.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <linux/tracehook.h> | 28 | #include <linux/tracehook.h> |
29 | #include <linux/signal.h> | 29 | #include <linux/signal.h> |
30 | #include <asm/stack.h> | 30 | #include <asm/stack.h> |
31 | #include <asm/switch_to.h> | ||
31 | #include <asm/homecache.h> | 32 | #include <asm/homecache.h> |
32 | #include <asm/syscalls.h> | 33 | #include <asm/syscalls.h> |
33 | #include <asm/traps.h> | 34 | #include <asm/traps.h> |
@@ -285,7 +286,7 @@ struct task_struct *validate_current(void) | |||
285 | static struct task_struct corrupt = { .comm = "<corrupt>" }; | 286 | static struct task_struct corrupt = { .comm = "<corrupt>" }; |
286 | struct task_struct *tsk = current; | 287 | struct task_struct *tsk = current; |
287 | if (unlikely((unsigned long)tsk < PAGE_OFFSET || | 288 | if (unlikely((unsigned long)tsk < PAGE_OFFSET || |
288 | (void *)tsk > high_memory || | 289 | (high_memory && (void *)tsk > high_memory) || |
289 | ((unsigned long)tsk & (__alignof__(*tsk) - 1)) != 0)) { | 290 | ((unsigned long)tsk & (__alignof__(*tsk) - 1)) != 0)) { |
290 | pr_err("Corrupt 'current' %p (sp %#lx)\n", tsk, stack_pointer); | 291 | pr_err("Corrupt 'current' %p (sp %#lx)\n", tsk, stack_pointer); |
291 | tsk = &corrupt; | 292 | tsk = &corrupt; |
diff --git a/arch/tile/kernel/setup.c b/arch/tile/kernel/setup.c index 92a94f4920ad..bff23f476110 100644 --- a/arch/tile/kernel/setup.c +++ b/arch/tile/kernel/setup.c | |||
@@ -103,13 +103,11 @@ unsigned long __initdata pci_reserve_end_pfn = -1U; | |||
103 | 103 | ||
104 | static int __init setup_maxmem(char *str) | 104 | static int __init setup_maxmem(char *str) |
105 | { | 105 | { |
106 | long maxmem_mb; | 106 | unsigned long long maxmem; |
107 | if (str == NULL || strict_strtol(str, 0, &maxmem_mb) != 0 || | 107 | if (str == NULL || (maxmem = memparse(str, NULL)) == 0) |
108 | maxmem_mb == 0) | ||
109 | return -EINVAL; | 108 | return -EINVAL; |
110 | 109 | ||
111 | maxmem_pfn = (maxmem_mb >> (HPAGE_SHIFT - 20)) << | 110 | maxmem_pfn = (maxmem >> HPAGE_SHIFT) << (HPAGE_SHIFT - PAGE_SHIFT); |
112 | (HPAGE_SHIFT - PAGE_SHIFT); | ||
113 | pr_info("Forcing RAM used to no more than %dMB\n", | 111 | pr_info("Forcing RAM used to no more than %dMB\n", |
114 | maxmem_pfn >> (20 - PAGE_SHIFT)); | 112 | maxmem_pfn >> (20 - PAGE_SHIFT)); |
115 | return 0; | 113 | return 0; |
@@ -119,14 +117,15 @@ early_param("maxmem", setup_maxmem); | |||
119 | static int __init setup_maxnodemem(char *str) | 117 | static int __init setup_maxnodemem(char *str) |
120 | { | 118 | { |
121 | char *endp; | 119 | char *endp; |
122 | long maxnodemem_mb, node; | 120 | unsigned long long maxnodemem; |
121 | long node; | ||
123 | 122 | ||
124 | node = str ? simple_strtoul(str, &endp, 0) : INT_MAX; | 123 | node = str ? simple_strtoul(str, &endp, 0) : INT_MAX; |
125 | if (node >= MAX_NUMNODES || *endp != ':' || | 124 | if (node >= MAX_NUMNODES || *endp != ':') |
126 | strict_strtol(endp+1, 0, &maxnodemem_mb) != 0) | ||
127 | return -EINVAL; | 125 | return -EINVAL; |
128 | 126 | ||
129 | maxnodemem_pfn[node] = (maxnodemem_mb >> (HPAGE_SHIFT - 20)) << | 127 | maxnodemem = memparse(endp+1, NULL); |
128 | maxnodemem_pfn[node] = (maxnodemem >> HPAGE_SHIFT) << | ||
130 | (HPAGE_SHIFT - PAGE_SHIFT); | 129 | (HPAGE_SHIFT - PAGE_SHIFT); |
131 | pr_info("Forcing RAM used on node %ld to no more than %dMB\n", | 130 | pr_info("Forcing RAM used on node %ld to no more than %dMB\n", |
132 | node, maxnodemem_pfn[node] >> (20 - PAGE_SHIFT)); | 131 | node, maxnodemem_pfn[node] >> (20 - PAGE_SHIFT)); |
@@ -913,6 +912,13 @@ void __cpuinit setup_cpu(int boot) | |||
913 | 912 | ||
914 | #ifdef CONFIG_BLK_DEV_INITRD | 913 | #ifdef CONFIG_BLK_DEV_INITRD |
915 | 914 | ||
915 | /* | ||
916 | * Note that the kernel can potentially support other compression | ||
917 | * techniques than gz, though we don't do so by default. If we ever | ||
918 | * decide to do so we can either look for other filename extensions, | ||
919 | * or just allow a file with this name to be compressed with an | ||
920 | * arbitrary compressor (somewhat counterintuitively). | ||
921 | */ | ||
916 | static int __initdata set_initramfs_file; | 922 | static int __initdata set_initramfs_file; |
917 | static char __initdata initramfs_file[128] = "initramfs.cpio.gz"; | 923 | static char __initdata initramfs_file[128] = "initramfs.cpio.gz"; |
918 | 924 | ||
@@ -928,9 +934,9 @@ static int __init setup_initramfs_file(char *str) | |||
928 | early_param("initramfs_file", setup_initramfs_file); | 934 | early_param("initramfs_file", setup_initramfs_file); |
929 | 935 | ||
930 | /* | 936 | /* |
931 | * We look for an additional "initramfs.cpio.gz" file in the hvfs. | 937 | * We look for an "initramfs.cpio.gz" file in the hvfs. |
932 | * If there is one, we allocate some memory for it and it will be | 938 | * If there is one, we allocate some memory for it and it will be |
933 | * unpacked to the initramfs after any built-in initramfs_data. | 939 | * unpacked to the initramfs. |
934 | */ | 940 | */ |
935 | static void __init load_hv_initrd(void) | 941 | static void __init load_hv_initrd(void) |
936 | { | 942 | { |
diff --git a/arch/tile/kernel/single_step.c b/arch/tile/kernel/single_step.c index bc1eb586e24d..9efbc1391b3c 100644 --- a/arch/tile/kernel/single_step.c +++ b/arch/tile/kernel/single_step.c | |||
@@ -153,6 +153,25 @@ static tile_bundle_bits rewrite_load_store_unaligned( | |||
153 | if (((unsigned long)addr % size) == 0) | 153 | if (((unsigned long)addr % size) == 0) |
154 | return bundle; | 154 | return bundle; |
155 | 155 | ||
156 | /* | ||
157 | * Return SIGBUS with the unaligned address, if requested. | ||
158 | * Note that we return SIGBUS even for completely invalid addresses | ||
159 | * as long as they are in fact unaligned; this matches what the | ||
160 | * tilepro hardware would be doing, if it could provide us with the | ||
161 | * actual bad address in an SPR, which it doesn't. | ||
162 | */ | ||
163 | if (unaligned_fixup == 0) { | ||
164 | siginfo_t info = { | ||
165 | .si_signo = SIGBUS, | ||
166 | .si_code = BUS_ADRALN, | ||
167 | .si_addr = addr | ||
168 | }; | ||
169 | trace_unhandled_signal("unaligned trap", regs, | ||
170 | (unsigned long)addr, SIGBUS); | ||
171 | force_sig_info(info.si_signo, &info, current); | ||
172 | return (tilepro_bundle_bits) 0; | ||
173 | } | ||
174 | |||
156 | #ifndef __LITTLE_ENDIAN | 175 | #ifndef __LITTLE_ENDIAN |
157 | # error We assume little-endian representation with copy_xx_user size 2 here | 176 | # error We assume little-endian representation with copy_xx_user size 2 here |
158 | #endif | 177 | #endif |
@@ -192,18 +211,6 @@ static tile_bundle_bits rewrite_load_store_unaligned( | |||
192 | return (tile_bundle_bits) 0; | 211 | return (tile_bundle_bits) 0; |
193 | } | 212 | } |
194 | 213 | ||
195 | if (unaligned_fixup == 0) { | ||
196 | siginfo_t info = { | ||
197 | .si_signo = SIGBUS, | ||
198 | .si_code = BUS_ADRALN, | ||
199 | .si_addr = addr | ||
200 | }; | ||
201 | trace_unhandled_signal("unaligned trap", regs, | ||
202 | (unsigned long)addr, SIGBUS); | ||
203 | force_sig_info(info.si_signo, &info, current); | ||
204 | return (tile_bundle_bits) 0; | ||
205 | } | ||
206 | |||
207 | if (unaligned_printk || unaligned_fixup_count == 0) { | 214 | if (unaligned_printk || unaligned_fixup_count == 0) { |
208 | pr_info("Process %d/%s: PC %#lx: Fixup of" | 215 | pr_info("Process %d/%s: PC %#lx: Fixup of" |
209 | " unaligned %s at %#lx.\n", | 216 | " unaligned %s at %#lx.\n", |
diff --git a/arch/tile/kernel/smp.c b/arch/tile/kernel/smp.c index a44e103c5a63..91da0f721958 100644 --- a/arch/tile/kernel/smp.c +++ b/arch/tile/kernel/smp.c | |||
@@ -103,7 +103,7 @@ static void smp_stop_cpu_interrupt(void) | |||
103 | set_cpu_online(smp_processor_id(), 0); | 103 | set_cpu_online(smp_processor_id(), 0); |
104 | arch_local_irq_disable_all(); | 104 | arch_local_irq_disable_all(); |
105 | for (;;) | 105 | for (;;) |
106 | asm("nap"); | 106 | asm("nap; nop"); |
107 | } | 107 | } |
108 | 108 | ||
109 | /* This function calls the 'stop' function on all other CPUs in the system. */ | 109 | /* This function calls the 'stop' function on all other CPUs in the system. */ |
@@ -113,6 +113,12 @@ void smp_send_stop(void) | |||
113 | send_IPI_allbutself(MSG_TAG_STOP_CPU); | 113 | send_IPI_allbutself(MSG_TAG_STOP_CPU); |
114 | } | 114 | } |
115 | 115 | ||
116 | /* On panic, just wait; we may get an smp_send_stop() later on. */ | ||
117 | void panic_smp_self_stop(void) | ||
118 | { | ||
119 | while (1) | ||
120 | asm("nap; nop"); | ||
121 | } | ||
116 | 122 | ||
117 | /* | 123 | /* |
118 | * Dispatch code called from hv_message_intr() for HV_MSG_TILE hv messages. | 124 | * Dispatch code called from hv_message_intr() for HV_MSG_TILE hv messages. |
diff --git a/arch/tile/kernel/stack.c b/arch/tile/kernel/stack.c index 37ee4d037e0b..b2f44c28dda6 100644 --- a/arch/tile/kernel/stack.c +++ b/arch/tile/kernel/stack.c | |||
@@ -21,10 +21,12 @@ | |||
21 | #include <linux/stacktrace.h> | 21 | #include <linux/stacktrace.h> |
22 | #include <linux/uaccess.h> | 22 | #include <linux/uaccess.h> |
23 | #include <linux/mmzone.h> | 23 | #include <linux/mmzone.h> |
24 | #include <linux/dcache.h> | ||
25 | #include <linux/fs.h> | ||
24 | #include <asm/backtrace.h> | 26 | #include <asm/backtrace.h> |
25 | #include <asm/page.h> | 27 | #include <asm/page.h> |
26 | #include <asm/tlbflush.h> | ||
27 | #include <asm/ucontext.h> | 28 | #include <asm/ucontext.h> |
29 | #include <asm/switch_to.h> | ||
28 | #include <asm/sigframe.h> | 30 | #include <asm/sigframe.h> |
29 | #include <asm/stack.h> | 31 | #include <asm/stack.h> |
30 | #include <arch/abi.h> | 32 | #include <arch/abi.h> |
@@ -44,72 +46,23 @@ static int in_kernel_stack(struct KBacktraceIterator *kbt, unsigned long sp) | |||
44 | return sp >= kstack_base && sp < kstack_base + THREAD_SIZE; | 46 | return sp >= kstack_base && sp < kstack_base + THREAD_SIZE; |
45 | } | 47 | } |
46 | 48 | ||
47 | /* Is address valid for reading? */ | ||
48 | static int valid_address(struct KBacktraceIterator *kbt, unsigned long address) | ||
49 | { | ||
50 | HV_PTE *l1_pgtable = kbt->pgtable; | ||
51 | HV_PTE *l2_pgtable; | ||
52 | unsigned long pfn; | ||
53 | HV_PTE pte; | ||
54 | struct page *page; | ||
55 | |||
56 | if (l1_pgtable == NULL) | ||
57 | return 0; /* can't read user space in other tasks */ | ||
58 | |||
59 | #ifdef CONFIG_64BIT | ||
60 | /* Find the real l1_pgtable by looking in the l0_pgtable. */ | ||
61 | pte = l1_pgtable[HV_L0_INDEX(address)]; | ||
62 | if (!hv_pte_get_present(pte)) | ||
63 | return 0; | ||
64 | pfn = hv_pte_get_pfn(pte); | ||
65 | if (pte_huge(pte)) { | ||
66 | if (!pfn_valid(pfn)) { | ||
67 | pr_err("L0 huge page has bad pfn %#lx\n", pfn); | ||
68 | return 0; | ||
69 | } | ||
70 | return hv_pte_get_present(pte) && hv_pte_get_readable(pte); | ||
71 | } | ||
72 | page = pfn_to_page(pfn); | ||
73 | BUG_ON(PageHighMem(page)); /* No HIGHMEM on 64-bit. */ | ||
74 | l1_pgtable = (HV_PTE *)pfn_to_kaddr(pfn); | ||
75 | #endif | ||
76 | pte = l1_pgtable[HV_L1_INDEX(address)]; | ||
77 | if (!hv_pte_get_present(pte)) | ||
78 | return 0; | ||
79 | pfn = hv_pte_get_pfn(pte); | ||
80 | if (pte_huge(pte)) { | ||
81 | if (!pfn_valid(pfn)) { | ||
82 | pr_err("huge page has bad pfn %#lx\n", pfn); | ||
83 | return 0; | ||
84 | } | ||
85 | return hv_pte_get_present(pte) && hv_pte_get_readable(pte); | ||
86 | } | ||
87 | |||
88 | page = pfn_to_page(pfn); | ||
89 | if (PageHighMem(page)) { | ||
90 | pr_err("L2 page table not in LOWMEM (%#llx)\n", | ||
91 | HV_PFN_TO_CPA(pfn)); | ||
92 | return 0; | ||
93 | } | ||
94 | l2_pgtable = (HV_PTE *)pfn_to_kaddr(pfn); | ||
95 | pte = l2_pgtable[HV_L2_INDEX(address)]; | ||
96 | return hv_pte_get_present(pte) && hv_pte_get_readable(pte); | ||
97 | } | ||
98 | |||
99 | /* Callback for backtracer; basically a glorified memcpy */ | 49 | /* Callback for backtracer; basically a glorified memcpy */ |
100 | static bool read_memory_func(void *result, unsigned long address, | 50 | static bool read_memory_func(void *result, unsigned long address, |
101 | unsigned int size, void *vkbt) | 51 | unsigned int size, void *vkbt) |
102 | { | 52 | { |
103 | int retval; | 53 | int retval; |
104 | struct KBacktraceIterator *kbt = (struct KBacktraceIterator *)vkbt; | 54 | struct KBacktraceIterator *kbt = (struct KBacktraceIterator *)vkbt; |
55 | |||
56 | if (address == 0) | ||
57 | return 0; | ||
105 | if (__kernel_text_address(address)) { | 58 | if (__kernel_text_address(address)) { |
106 | /* OK to read kernel code. */ | 59 | /* OK to read kernel code. */ |
107 | } else if (address >= PAGE_OFFSET) { | 60 | } else if (address >= PAGE_OFFSET) { |
108 | /* We only tolerate kernel-space reads of this task's stack */ | 61 | /* We only tolerate kernel-space reads of this task's stack */ |
109 | if (!in_kernel_stack(kbt, address)) | 62 | if (!in_kernel_stack(kbt, address)) |
110 | return 0; | 63 | return 0; |
111 | } else if (!valid_address(kbt, address)) { | 64 | } else if (!kbt->is_current) { |
112 | return 0; /* invalid user-space address */ | 65 | return 0; /* can't read from other user address spaces */ |
113 | } | 66 | } |
114 | pagefault_disable(); | 67 | pagefault_disable(); |
115 | retval = __copy_from_user_inatomic(result, | 68 | retval = __copy_from_user_inatomic(result, |
@@ -127,6 +80,8 @@ static struct pt_regs *valid_fault_handler(struct KBacktraceIterator* kbt) | |||
127 | unsigned long sp = kbt->it.sp; | 80 | unsigned long sp = kbt->it.sp; |
128 | struct pt_regs *p; | 81 | struct pt_regs *p; |
129 | 82 | ||
83 | if (sp % sizeof(long) != 0) | ||
84 | return NULL; | ||
130 | if (!in_kernel_stack(kbt, sp)) | 85 | if (!in_kernel_stack(kbt, sp)) |
131 | return NULL; | 86 | return NULL; |
132 | if (!in_kernel_stack(kbt, sp + C_ABI_SAVE_AREA_SIZE + PTREGS_SIZE-1)) | 87 | if (!in_kernel_stack(kbt, sp + C_ABI_SAVE_AREA_SIZE + PTREGS_SIZE-1)) |
@@ -169,27 +124,27 @@ static int is_sigreturn(unsigned long pc) | |||
169 | } | 124 | } |
170 | 125 | ||
171 | /* Return a pt_regs pointer for a valid signal handler frame */ | 126 | /* Return a pt_regs pointer for a valid signal handler frame */ |
172 | static struct pt_regs *valid_sigframe(struct KBacktraceIterator* kbt) | 127 | static struct pt_regs *valid_sigframe(struct KBacktraceIterator* kbt, |
128 | struct rt_sigframe* kframe) | ||
173 | { | 129 | { |
174 | BacktraceIterator *b = &kbt->it; | 130 | BacktraceIterator *b = &kbt->it; |
175 | 131 | ||
176 | if (b->pc == VDSO_BASE) { | 132 | if (b->pc == VDSO_BASE && b->sp < PAGE_OFFSET && |
177 | struct rt_sigframe *frame; | 133 | b->sp % sizeof(long) == 0) { |
178 | unsigned long sigframe_top = | 134 | int retval; |
179 | b->sp + sizeof(struct rt_sigframe) - 1; | 135 | pagefault_disable(); |
180 | if (!valid_address(kbt, b->sp) || | 136 | retval = __copy_from_user_inatomic( |
181 | !valid_address(kbt, sigframe_top)) { | 137 | kframe, (void __user __force *)b->sp, |
182 | if (kbt->verbose) | 138 | sizeof(*kframe)); |
183 | pr_err(" (odd signal: sp %#lx?)\n", | 139 | pagefault_enable(); |
184 | (unsigned long)(b->sp)); | 140 | if (retval != 0 || |
141 | (unsigned int)(kframe->info.si_signo) >= _NSIG) | ||
185 | return NULL; | 142 | return NULL; |
186 | } | ||
187 | frame = (struct rt_sigframe *)b->sp; | ||
188 | if (kbt->verbose) { | 143 | if (kbt->verbose) { |
189 | pr_err(" <received signal %d>\n", | 144 | pr_err(" <received signal %d>\n", |
190 | frame->info.si_signo); | 145 | kframe->info.si_signo); |
191 | } | 146 | } |
192 | return (struct pt_regs *)&frame->uc.uc_mcontext; | 147 | return (struct pt_regs *)&kframe->uc.uc_mcontext; |
193 | } | 148 | } |
194 | return NULL; | 149 | return NULL; |
195 | } | 150 | } |
@@ -202,10 +157,11 @@ static int KBacktraceIterator_is_sigreturn(struct KBacktraceIterator *kbt) | |||
202 | static int KBacktraceIterator_restart(struct KBacktraceIterator *kbt) | 157 | static int KBacktraceIterator_restart(struct KBacktraceIterator *kbt) |
203 | { | 158 | { |
204 | struct pt_regs *p; | 159 | struct pt_regs *p; |
160 | struct rt_sigframe kframe; | ||
205 | 161 | ||
206 | p = valid_fault_handler(kbt); | 162 | p = valid_fault_handler(kbt); |
207 | if (p == NULL) | 163 | if (p == NULL) |
208 | p = valid_sigframe(kbt); | 164 | p = valid_sigframe(kbt, &kframe); |
209 | if (p == NULL) | 165 | if (p == NULL) |
210 | return 0; | 166 | return 0; |
211 | backtrace_init(&kbt->it, read_memory_func, kbt, | 167 | backtrace_init(&kbt->it, read_memory_func, kbt, |
@@ -265,41 +221,19 @@ void KBacktraceIterator_init(struct KBacktraceIterator *kbt, | |||
265 | 221 | ||
266 | /* | 222 | /* |
267 | * Set up callback information. We grab the kernel stack base | 223 | * Set up callback information. We grab the kernel stack base |
268 | * so we will allow reads of that address range, and if we're | 224 | * so we will allow reads of that address range. |
269 | * asking about the current process we grab the page table | ||
270 | * so we can check user accesses before trying to read them. | ||
271 | * We flush the TLB to avoid any weird skew issues. | ||
272 | */ | 225 | */ |
273 | is_current = (t == NULL); | 226 | is_current = (t == NULL || t == current); |
274 | kbt->is_current = is_current; | 227 | kbt->is_current = is_current; |
275 | if (is_current) | 228 | if (is_current) |
276 | t = validate_current(); | 229 | t = validate_current(); |
277 | kbt->task = t; | 230 | kbt->task = t; |
278 | kbt->pgtable = NULL; | ||
279 | kbt->verbose = 0; /* override in caller if desired */ | 231 | kbt->verbose = 0; /* override in caller if desired */ |
280 | kbt->profile = 0; /* override in caller if desired */ | 232 | kbt->profile = 0; /* override in caller if desired */ |
281 | kbt->end = KBT_ONGOING; | 233 | kbt->end = KBT_ONGOING; |
282 | kbt->new_context = 0; | 234 | kbt->new_context = 1; |
283 | if (is_current) { | 235 | if (is_current) |
284 | HV_PhysAddr pgdir_pa = hv_inquire_context().page_table; | ||
285 | if (pgdir_pa == (unsigned long)swapper_pg_dir - PAGE_OFFSET) { | ||
286 | /* | ||
287 | * Not just an optimization: this also allows | ||
288 | * this to work at all before va/pa mappings | ||
289 | * are set up. | ||
290 | */ | ||
291 | kbt->pgtable = swapper_pg_dir; | ||
292 | } else { | ||
293 | struct page *page = pfn_to_page(PFN_DOWN(pgdir_pa)); | ||
294 | if (!PageHighMem(page)) | ||
295 | kbt->pgtable = __va(pgdir_pa); | ||
296 | else | ||
297 | pr_err("page table not in LOWMEM" | ||
298 | " (%#llx)\n", pgdir_pa); | ||
299 | } | ||
300 | local_flush_tlb_all(); | ||
301 | validate_stack(regs); | 236 | validate_stack(regs); |
302 | } | ||
303 | 237 | ||
304 | if (regs == NULL) { | 238 | if (regs == NULL) { |
305 | if (is_current || t->state == TASK_RUNNING) { | 239 | if (is_current || t->state == TASK_RUNNING) { |
@@ -345,6 +279,78 @@ void KBacktraceIterator_next(struct KBacktraceIterator *kbt) | |||
345 | } | 279 | } |
346 | EXPORT_SYMBOL(KBacktraceIterator_next); | 280 | EXPORT_SYMBOL(KBacktraceIterator_next); |
347 | 281 | ||
282 | static void describe_addr(struct KBacktraceIterator *kbt, | ||
283 | unsigned long address, | ||
284 | int have_mmap_sem, char *buf, size_t bufsize) | ||
285 | { | ||
286 | struct vm_area_struct *vma; | ||
287 | size_t namelen, remaining; | ||
288 | unsigned long size, offset, adjust; | ||
289 | char *p, *modname; | ||
290 | const char *name; | ||
291 | int rc; | ||
292 | |||
293 | /* | ||
294 | * Look one byte back for every caller frame (i.e. those that | ||
295 | * aren't a new context) so we look up symbol data for the | ||
296 | * call itself, not the following instruction, which may be on | ||
297 | * a different line (or in a different function). | ||
298 | */ | ||
299 | adjust = !kbt->new_context; | ||
300 | address -= adjust; | ||
301 | |||
302 | if (address >= PAGE_OFFSET) { | ||
303 | /* Handle kernel symbols. */ | ||
304 | BUG_ON(bufsize < KSYM_NAME_LEN); | ||
305 | name = kallsyms_lookup(address, &size, &offset, | ||
306 | &modname, buf); | ||
307 | if (name == NULL) { | ||
308 | buf[0] = '\0'; | ||
309 | return; | ||
310 | } | ||
311 | namelen = strlen(buf); | ||
312 | remaining = (bufsize - 1) - namelen; | ||
313 | p = buf + namelen; | ||
314 | rc = snprintf(p, remaining, "+%#lx/%#lx ", | ||
315 | offset + adjust, size); | ||
316 | if (modname && rc < remaining) | ||
317 | snprintf(p + rc, remaining - rc, "[%s] ", modname); | ||
318 | buf[bufsize-1] = '\0'; | ||
319 | return; | ||
320 | } | ||
321 | |||
322 | /* If we don't have the mmap_sem, we can't show any more info. */ | ||
323 | buf[0] = '\0'; | ||
324 | if (!have_mmap_sem) | ||
325 | return; | ||
326 | |||
327 | /* Find vma info. */ | ||
328 | vma = find_vma(kbt->task->mm, address); | ||
329 | if (vma == NULL || address < vma->vm_start) { | ||
330 | snprintf(buf, bufsize, "[unmapped address] "); | ||
331 | return; | ||
332 | } | ||
333 | |||
334 | if (vma->vm_file) { | ||
335 | char *s; | ||
336 | p = d_path(&vma->vm_file->f_path, buf, bufsize); | ||
337 | if (IS_ERR(p)) | ||
338 | p = "?"; | ||
339 | s = strrchr(p, '/'); | ||
340 | if (s) | ||
341 | p = s+1; | ||
342 | } else { | ||
343 | p = "anon"; | ||
344 | } | ||
345 | |||
346 | /* Generate a string description of the vma info. */ | ||
347 | namelen = strlen(p); | ||
348 | remaining = (bufsize - 1) - namelen; | ||
349 | memmove(buf, p, namelen); | ||
350 | snprintf(buf + namelen, remaining, "[%lx+%lx] ", | ||
351 | vma->vm_start, vma->vm_end - vma->vm_start); | ||
352 | } | ||
353 | |||
348 | /* | 354 | /* |
349 | * This method wraps the backtracer's more generic support. | 355 | * This method wraps the backtracer's more generic support. |
350 | * It is only invoked from the architecture-specific code; show_stack() | 356 | * It is only invoked from the architecture-specific code; show_stack() |
@@ -353,6 +359,7 @@ EXPORT_SYMBOL(KBacktraceIterator_next); | |||
353 | void tile_show_stack(struct KBacktraceIterator *kbt, int headers) | 359 | void tile_show_stack(struct KBacktraceIterator *kbt, int headers) |
354 | { | 360 | { |
355 | int i; | 361 | int i; |
362 | int have_mmap_sem = 0; | ||
356 | 363 | ||
357 | if (headers) { | 364 | if (headers) { |
358 | /* | 365 | /* |
@@ -369,31 +376,16 @@ void tile_show_stack(struct KBacktraceIterator *kbt, int headers) | |||
369 | kbt->verbose = 1; | 376 | kbt->verbose = 1; |
370 | i = 0; | 377 | i = 0; |
371 | for (; !KBacktraceIterator_end(kbt); KBacktraceIterator_next(kbt)) { | 378 | for (; !KBacktraceIterator_end(kbt); KBacktraceIterator_next(kbt)) { |
372 | char *modname; | ||
373 | const char *name; | ||
374 | unsigned long address = kbt->it.pc; | ||
375 | unsigned long offset, size; | ||
376 | char namebuf[KSYM_NAME_LEN+100]; | 379 | char namebuf[KSYM_NAME_LEN+100]; |
380 | unsigned long address = kbt->it.pc; | ||
377 | 381 | ||
378 | if (address >= PAGE_OFFSET) | 382 | /* Try to acquire the mmap_sem as we pass into userspace. */ |
379 | name = kallsyms_lookup(address, &size, &offset, | 383 | if (address < PAGE_OFFSET && !have_mmap_sem && kbt->task->mm) |
380 | &modname, namebuf); | 384 | have_mmap_sem = |
381 | else | 385 | down_read_trylock(&kbt->task->mm->mmap_sem); |
382 | name = NULL; | 386 | |
383 | 387 | describe_addr(kbt, address, have_mmap_sem, | |
384 | if (!name) | 388 | namebuf, sizeof(namebuf)); |
385 | namebuf[0] = '\0'; | ||
386 | else { | ||
387 | size_t namelen = strlen(namebuf); | ||
388 | size_t remaining = (sizeof(namebuf) - 1) - namelen; | ||
389 | char *p = namebuf + namelen; | ||
390 | int rc = snprintf(p, remaining, "+%#lx/%#lx ", | ||
391 | offset, size); | ||
392 | if (modname && rc < remaining) | ||
393 | snprintf(p + rc, remaining - rc, | ||
394 | "[%s] ", modname); | ||
395 | namebuf[sizeof(namebuf)-1] = '\0'; | ||
396 | } | ||
397 | 389 | ||
398 | pr_err(" frame %d: 0x%lx %s(sp 0x%lx)\n", | 390 | pr_err(" frame %d: 0x%lx %s(sp 0x%lx)\n", |
399 | i++, address, namebuf, (unsigned long)(kbt->it.sp)); | 391 | i++, address, namebuf, (unsigned long)(kbt->it.sp)); |
@@ -408,6 +400,8 @@ void tile_show_stack(struct KBacktraceIterator *kbt, int headers) | |||
408 | pr_err("Stack dump stopped; next frame identical to this one\n"); | 400 | pr_err("Stack dump stopped; next frame identical to this one\n"); |
409 | if (headers) | 401 | if (headers) |
410 | pr_err("Stack dump complete\n"); | 402 | pr_err("Stack dump complete\n"); |
403 | if (have_mmap_sem) | ||
404 | up_read(&kbt->task->mm->mmap_sem); | ||
411 | } | 405 | } |
412 | EXPORT_SYMBOL(tile_show_stack); | 406 | EXPORT_SYMBOL(tile_show_stack); |
413 | 407 | ||
diff --git a/arch/tile/kernel/traps.c b/arch/tile/kernel/traps.c index 2bb6602a1ee7..73cff814ac57 100644 --- a/arch/tile/kernel/traps.c +++ b/arch/tile/kernel/traps.c | |||
@@ -200,7 +200,7 @@ void __kprobes do_trap(struct pt_regs *regs, int fault_num, | |||
200 | { | 200 | { |
201 | siginfo_t info = { 0 }; | 201 | siginfo_t info = { 0 }; |
202 | int signo, code; | 202 | int signo, code; |
203 | unsigned long address; | 203 | unsigned long address = 0; |
204 | bundle_bits instr; | 204 | bundle_bits instr; |
205 | 205 | ||
206 | /* Re-enable interrupts. */ | 206 | /* Re-enable interrupts. */ |
@@ -223,6 +223,10 @@ void __kprobes do_trap(struct pt_regs *regs, int fault_num, | |||
223 | } | 223 | } |
224 | 224 | ||
225 | switch (fault_num) { | 225 | switch (fault_num) { |
226 | case INT_MEM_ERROR: | ||
227 | signo = SIGBUS; | ||
228 | code = BUS_OBJERR; | ||
229 | break; | ||
226 | case INT_ILL: | 230 | case INT_ILL: |
227 | if (copy_from_user(&instr, (void __user *)regs->pc, | 231 | if (copy_from_user(&instr, (void __user *)regs->pc, |
228 | sizeof(instr))) { | 232 | sizeof(instr))) { |
@@ -289,7 +293,10 @@ void __kprobes do_trap(struct pt_regs *regs, int fault_num, | |||
289 | address = regs->pc; | 293 | address = regs->pc; |
290 | break; | 294 | break; |
291 | #ifdef __tilegx__ | 295 | #ifdef __tilegx__ |
292 | case INT_ILL_TRANS: | 296 | case INT_ILL_TRANS: { |
297 | /* Avoid a hardware erratum with the return address stack. */ | ||
298 | fill_ra_stack(); | ||
299 | |||
293 | signo = SIGSEGV; | 300 | signo = SIGSEGV; |
294 | code = SEGV_MAPERR; | 301 | code = SEGV_MAPERR; |
295 | if (reason & SPR_ILL_TRANS_REASON__I_STREAM_VA_RMASK) | 302 | if (reason & SPR_ILL_TRANS_REASON__I_STREAM_VA_RMASK) |
@@ -297,6 +304,7 @@ void __kprobes do_trap(struct pt_regs *regs, int fault_num, | |||
297 | else | 304 | else |
298 | address = 0; /* FIXME: GX: single-step for address */ | 305 | address = 0; /* FIXME: GX: single-step for address */ |
299 | break; | 306 | break; |
307 | } | ||
300 | #endif | 308 | #endif |
301 | default: | 309 | default: |
302 | panic("Unexpected do_trap interrupt number %d", fault_num); | 310 | panic("Unexpected do_trap interrupt number %d", fault_num); |
@@ -308,7 +316,8 @@ void __kprobes do_trap(struct pt_regs *regs, int fault_num, | |||
308 | info.si_addr = (void __user *)address; | 316 | info.si_addr = (void __user *)address; |
309 | if (signo == SIGILL) | 317 | if (signo == SIGILL) |
310 | info.si_trapno = fault_num; | 318 | info.si_trapno = fault_num; |
311 | trace_unhandled_signal("trap", regs, address, signo); | 319 | if (signo != SIGTRAP) |
320 | trace_unhandled_signal("trap", regs, address, signo); | ||
312 | force_sig_info(signo, &info, current); | 321 | force_sig_info(signo, &info, current); |
313 | } | 322 | } |
314 | 323 | ||
diff --git a/arch/tile/lib/Makefile b/arch/tile/lib/Makefile index 0c26086ecbef..985f59858234 100644 --- a/arch/tile/lib/Makefile +++ b/arch/tile/lib/Makefile | |||
@@ -7,6 +7,7 @@ lib-y = cacheflush.o checksum.o cpumask.o delay.o uaccess.o \ | |||
7 | strchr_$(BITS).o strlen_$(BITS).o | 7 | strchr_$(BITS).o strlen_$(BITS).o |
8 | 8 | ||
9 | ifeq ($(CONFIG_TILEGX),y) | 9 | ifeq ($(CONFIG_TILEGX),y) |
10 | CFLAGS_REMOVE_memcpy_user_64.o = -fno-omit-frame-pointer | ||
10 | lib-y += memcpy_user_64.o | 11 | lib-y += memcpy_user_64.o |
11 | else | 12 | else |
12 | lib-y += atomic_32.o atomic_asm_32.o memcpy_tile64.o | 13 | lib-y += atomic_32.o atomic_asm_32.o memcpy_tile64.o |
diff --git a/arch/tile/lib/cacheflush.c b/arch/tile/lib/cacheflush.c index 8928aace7a64..db4fb89e12d8 100644 --- a/arch/tile/lib/cacheflush.c +++ b/arch/tile/lib/cacheflush.c | |||
@@ -39,7 +39,21 @@ void finv_buffer_remote(void *buffer, size_t size, int hfh) | |||
39 | { | 39 | { |
40 | char *p, *base; | 40 | char *p, *base; |
41 | size_t step_size, load_count; | 41 | size_t step_size, load_count; |
42 | |||
43 | /* | ||
44 | * On TILEPro the striping granularity is a fixed 8KB; on | ||
45 | * TILE-Gx it is configurable, and we rely on the fact that | ||
46 | * the hypervisor always configures maximum striping, so that | ||
47 | * bits 9 and 10 of the PA are part of the stripe function, so | ||
48 | * every 512 bytes we hit a striping boundary. | ||
49 | * | ||
50 | */ | ||
51 | #ifdef __tilegx__ | ||
52 | const unsigned long STRIPE_WIDTH = 512; | ||
53 | #else | ||
42 | const unsigned long STRIPE_WIDTH = 8192; | 54 | const unsigned long STRIPE_WIDTH = 8192; |
55 | #endif | ||
56 | |||
43 | #ifdef __tilegx__ | 57 | #ifdef __tilegx__ |
44 | /* | 58 | /* |
45 | * On TILE-Gx, we must disable the dstream prefetcher before doing | 59 | * On TILE-Gx, we must disable the dstream prefetcher before doing |
@@ -74,7 +88,7 @@ void finv_buffer_remote(void *buffer, size_t size, int hfh) | |||
74 | * memory, that one load would be sufficient, but since we may | 88 | * memory, that one load would be sufficient, but since we may |
75 | * be, we also need to back up to the last load issued to | 89 | * be, we also need to back up to the last load issued to |
76 | * another memory controller, which would be the point where | 90 | * another memory controller, which would be the point where |
77 | * we crossed an 8KB boundary (the granularity of striping | 91 | * we crossed a "striping" boundary (the granularity of striping |
78 | * across memory controllers). Keep backing up and doing this | 92 | * across memory controllers). Keep backing up and doing this |
79 | * until we are before the beginning of the buffer, or have | 93 | * until we are before the beginning of the buffer, or have |
80 | * hit all the controllers. | 94 | * hit all the controllers. |
@@ -88,12 +102,22 @@ void finv_buffer_remote(void *buffer, size_t size, int hfh) | |||
88 | * every cache line on a full memory stripe on each | 102 | * every cache line on a full memory stripe on each |
89 | * controller" that we simply do that, to simplify the logic. | 103 | * controller" that we simply do that, to simplify the logic. |
90 | * | 104 | * |
91 | * FIXME: See bug 9535 for some issues with this code. | 105 | * On TILE-Gx the hash-for-home function is much more complex, |
106 | * with the upshot being we can't readily guarantee we have | ||
107 | * hit both entries in the 128-entry AMT that were hit by any | ||
108 | * load in the entire range, so we just re-load them all. | ||
109 | * With larger buffers, we may want to consider using a hypervisor | ||
110 | * trap to issue loads directly to each hash-for-home tile for | ||
111 | * each controller (doing it from Linux would trash the TLB). | ||
92 | */ | 112 | */ |
93 | if (hfh) { | 113 | if (hfh) { |
94 | step_size = L2_CACHE_BYTES; | 114 | step_size = L2_CACHE_BYTES; |
115 | #ifdef __tilegx__ | ||
116 | load_count = (size + L2_CACHE_BYTES - 1) / L2_CACHE_BYTES; | ||
117 | #else | ||
95 | load_count = (STRIPE_WIDTH / L2_CACHE_BYTES) * | 118 | load_count = (STRIPE_WIDTH / L2_CACHE_BYTES) * |
96 | (1 << CHIP_LOG_NUM_MSHIMS()); | 119 | (1 << CHIP_LOG_NUM_MSHIMS()); |
120 | #endif | ||
97 | } else { | 121 | } else { |
98 | step_size = STRIPE_WIDTH; | 122 | step_size = STRIPE_WIDTH; |
99 | load_count = (1 << CHIP_LOG_NUM_MSHIMS()); | 123 | load_count = (1 << CHIP_LOG_NUM_MSHIMS()); |
@@ -109,7 +133,7 @@ void finv_buffer_remote(void *buffer, size_t size, int hfh) | |||
109 | 133 | ||
110 | /* Figure out how far back we need to go. */ | 134 | /* Figure out how far back we need to go. */ |
111 | base = p - (step_size * (load_count - 2)); | 135 | base = p - (step_size * (load_count - 2)); |
112 | if ((long)base < (long)buffer) | 136 | if ((unsigned long)base < (unsigned long)buffer) |
113 | base = buffer; | 137 | base = buffer; |
114 | 138 | ||
115 | /* | 139 | /* |
diff --git a/arch/tile/lib/memcpy_user_64.c b/arch/tile/lib/memcpy_user_64.c index 4763b3aff1cc..37440caa7370 100644 --- a/arch/tile/lib/memcpy_user_64.c +++ b/arch/tile/lib/memcpy_user_64.c | |||
@@ -14,7 +14,13 @@ | |||
14 | * Do memcpy(), but trap and return "n" when a load or store faults. | 14 | * Do memcpy(), but trap and return "n" when a load or store faults. |
15 | * | 15 | * |
16 | * Note: this idiom only works when memcpy() compiles to a leaf function. | 16 | * Note: this idiom only works when memcpy() compiles to a leaf function. |
17 | * If "sp" is updated during memcpy, the "jrp lr" will be incorrect. | 17 | * Here leaf function not only means it does not have calls, but also |
18 | * requires no stack operations (sp, stack frame pointer) and no | ||
19 | * use of callee-saved registers, else "jrp lr" will be incorrect since | ||
20 | * unwinding stack frame is bypassed. Since memcpy() is not complex so | ||
21 | * these conditions are satisfied here, but we need to be careful when | ||
22 | * modifying this file. This is not a clean solution but is the best | ||
23 | * one so far. | ||
18 | * | 24 | * |
19 | * Also note that we are capturing "n" from the containing scope here. | 25 | * Also note that we are capturing "n" from the containing scope here. |
20 | */ | 26 | */ |
diff --git a/arch/tile/lib/spinlock_common.h b/arch/tile/lib/spinlock_common.h index c10109809132..6ac37509faca 100644 --- a/arch/tile/lib/spinlock_common.h +++ b/arch/tile/lib/spinlock_common.h | |||
@@ -60,5 +60,5 @@ static void delay_backoff(int iterations) | |||
60 | loops += __insn_crc32_32(stack_pointer, get_cycles_low()) & | 60 | loops += __insn_crc32_32(stack_pointer, get_cycles_low()) & |
61 | (loops - 1); | 61 | (loops - 1); |
62 | 62 | ||
63 | relax(1 << exponent); | 63 | relax(loops); |
64 | } | 64 | } |
diff --git a/arch/tile/mm/fault.c b/arch/tile/mm/fault.c index cba30e9547b4..22e58f51ed23 100644 --- a/arch/tile/mm/fault.c +++ b/arch/tile/mm/fault.c | |||
@@ -130,7 +130,7 @@ static inline pmd_t *vmalloc_sync_one(pgd_t *pgd, unsigned long address) | |||
130 | } | 130 | } |
131 | 131 | ||
132 | /* | 132 | /* |
133 | * Handle a fault on the vmalloc or module mapping area | 133 | * Handle a fault on the vmalloc area. |
134 | */ | 134 | */ |
135 | static inline int vmalloc_fault(pgd_t *pgd, unsigned long address) | 135 | static inline int vmalloc_fault(pgd_t *pgd, unsigned long address) |
136 | { | 136 | { |
@@ -203,9 +203,14 @@ static pgd_t *get_current_pgd(void) | |||
203 | * interrupt or a critical region, and must do as little as possible. | 203 | * interrupt or a critical region, and must do as little as possible. |
204 | * Similarly, we can't use atomic ops here, since we may be handling a | 204 | * Similarly, we can't use atomic ops here, since we may be handling a |
205 | * fault caused by an atomic op access. | 205 | * fault caused by an atomic op access. |
206 | * | ||
207 | * If we find a migrating PTE while we're in an NMI context, and we're | ||
208 | * at a PC that has a registered exception handler, we don't wait, | ||
209 | * since this thread may (e.g.) have been interrupted while migrating | ||
210 | * its own stack, which would then cause us to self-deadlock. | ||
206 | */ | 211 | */ |
207 | static int handle_migrating_pte(pgd_t *pgd, int fault_num, | 212 | static int handle_migrating_pte(pgd_t *pgd, int fault_num, |
208 | unsigned long address, | 213 | unsigned long address, unsigned long pc, |
209 | int is_kernel_mode, int write) | 214 | int is_kernel_mode, int write) |
210 | { | 215 | { |
211 | pud_t *pud; | 216 | pud_t *pud; |
@@ -227,6 +232,8 @@ static int handle_migrating_pte(pgd_t *pgd, int fault_num, | |||
227 | pte_offset_kernel(pmd, address); | 232 | pte_offset_kernel(pmd, address); |
228 | pteval = *pte; | 233 | pteval = *pte; |
229 | if (pte_migrating(pteval)) { | 234 | if (pte_migrating(pteval)) { |
235 | if (in_nmi() && search_exception_tables(pc)) | ||
236 | return 0; | ||
230 | wait_for_migration(pte); | 237 | wait_for_migration(pte); |
231 | return 1; | 238 | return 1; |
232 | } | 239 | } |
@@ -300,7 +307,7 @@ static int handle_page_fault(struct pt_regs *regs, | |||
300 | * rather than trying to patch up the existing PTE. | 307 | * rather than trying to patch up the existing PTE. |
301 | */ | 308 | */ |
302 | pgd = get_current_pgd(); | 309 | pgd = get_current_pgd(); |
303 | if (handle_migrating_pte(pgd, fault_num, address, | 310 | if (handle_migrating_pte(pgd, fault_num, address, regs->pc, |
304 | is_kernel_mode, write)) | 311 | is_kernel_mode, write)) |
305 | return 1; | 312 | return 1; |
306 | 313 | ||
@@ -335,9 +342,12 @@ static int handle_page_fault(struct pt_regs *regs, | |||
335 | /* | 342 | /* |
336 | * If we're trying to touch user-space addresses, we must | 343 | * If we're trying to touch user-space addresses, we must |
337 | * be either at PL0, or else with interrupts enabled in the | 344 | * be either at PL0, or else with interrupts enabled in the |
338 | * kernel, so either way we can re-enable interrupts here. | 345 | * kernel, so either way we can re-enable interrupts here |
346 | * unless we are doing atomic access to user space with | ||
347 | * interrupts disabled. | ||
339 | */ | 348 | */ |
340 | local_irq_enable(); | 349 | if (!(regs->flags & PT_FLAGS_DISABLE_IRQ)) |
350 | local_irq_enable(); | ||
341 | 351 | ||
342 | mm = tsk->mm; | 352 | mm = tsk->mm; |
343 | 353 | ||
@@ -665,7 +675,7 @@ struct intvec_state do_page_fault_ics(struct pt_regs *regs, int fault_num, | |||
665 | */ | 675 | */ |
666 | if (fault_num == INT_DTLB_ACCESS) | 676 | if (fault_num == INT_DTLB_ACCESS) |
667 | write = 1; | 677 | write = 1; |
668 | if (handle_migrating_pte(pgd, fault_num, address, 1, write)) | 678 | if (handle_migrating_pte(pgd, fault_num, address, pc, 1, write)) |
669 | return state; | 679 | return state; |
670 | 680 | ||
671 | /* Return zero so that we continue on with normal fault handling. */ | 681 | /* Return zero so that we continue on with normal fault handling. */ |
diff --git a/arch/tile/mm/homecache.c b/arch/tile/mm/homecache.c index 1cc6ae477c98..499f73770b05 100644 --- a/arch/tile/mm/homecache.c +++ b/arch/tile/mm/homecache.c | |||
@@ -394,6 +394,7 @@ int page_home(struct page *page) | |||
394 | return pte_to_home(*virt_to_pte(NULL, kva)); | 394 | return pte_to_home(*virt_to_pte(NULL, kva)); |
395 | } | 395 | } |
396 | } | 396 | } |
397 | EXPORT_SYMBOL(page_home); | ||
397 | 398 | ||
398 | void homecache_change_page_home(struct page *page, int order, int home) | 399 | void homecache_change_page_home(struct page *page, int order, int home) |
399 | { | 400 | { |
diff --git a/arch/tile/mm/init.c b/arch/tile/mm/init.c index 830c4908ea76..6a9d20ddc34f 100644 --- a/arch/tile/mm/init.c +++ b/arch/tile/mm/init.c | |||
@@ -254,11 +254,6 @@ static pgprot_t __init init_pgprot(ulong address) | |||
254 | return construct_pgprot(PAGE_KERNEL_RO, PAGE_HOME_IMMUTABLE); | 254 | return construct_pgprot(PAGE_KERNEL_RO, PAGE_HOME_IMMUTABLE); |
255 | } | 255 | } |
256 | 256 | ||
257 | /* As a performance optimization, keep the boot init stack here. */ | ||
258 | if (address >= (ulong)&init_thread_union && | ||
259 | address < (ulong)&init_thread_union + THREAD_SIZE) | ||
260 | return construct_pgprot(PAGE_KERNEL, smp_processor_id()); | ||
261 | |||
262 | #ifndef __tilegx__ | 257 | #ifndef __tilegx__ |
263 | #if !ATOMIC_LOCKS_FOUND_VIA_TABLE() | 258 | #if !ATOMIC_LOCKS_FOUND_VIA_TABLE() |
264 | /* Force the atomic_locks[] array page to be hash-for-home. */ | 259 | /* Force the atomic_locks[] array page to be hash-for-home. */ |
@@ -557,6 +552,7 @@ static void __init kernel_physical_mapping_init(pgd_t *pgd_base) | |||
557 | 552 | ||
558 | address = MEM_SV_INTRPT; | 553 | address = MEM_SV_INTRPT; |
559 | pmd = get_pmd(pgtables, address); | 554 | pmd = get_pmd(pgtables, address); |
555 | pfn = 0; /* code starts at PA 0 */ | ||
560 | if (ktext_small) { | 556 | if (ktext_small) { |
561 | /* Allocate an L2 PTE for the kernel text */ | 557 | /* Allocate an L2 PTE for the kernel text */ |
562 | int cpu = 0; | 558 | int cpu = 0; |
@@ -579,10 +575,15 @@ static void __init kernel_physical_mapping_init(pgd_t *pgd_base) | |||
579 | } | 575 | } |
580 | 576 | ||
581 | BUG_ON(address != (unsigned long)_stext); | 577 | BUG_ON(address != (unsigned long)_stext); |
582 | pfn = 0; /* code starts at PA 0 */ | 578 | pte = NULL; |
583 | pte = alloc_pte(); | 579 | for (; address < (unsigned long)_einittext; |
584 | for (pte_ofs = 0; address < (unsigned long)_einittext; | 580 | pfn++, address += PAGE_SIZE) { |
585 | pfn++, pte_ofs++, address += PAGE_SIZE) { | 581 | pte_ofs = pte_index(address); |
582 | if (pte_ofs == 0) { | ||
583 | if (pte) | ||
584 | assign_pte(pmd++, pte); | ||
585 | pte = alloc_pte(); | ||
586 | } | ||
586 | if (!ktext_local) { | 587 | if (!ktext_local) { |
587 | prot = set_remote_cache_cpu(prot, cpu); | 588 | prot = set_remote_cache_cpu(prot, cpu); |
588 | cpu = cpumask_next(cpu, &ktext_mask); | 589 | cpu = cpumask_next(cpu, &ktext_mask); |
@@ -591,7 +592,8 @@ static void __init kernel_physical_mapping_init(pgd_t *pgd_base) | |||
591 | } | 592 | } |
592 | pte[pte_ofs] = pfn_pte(pfn, prot); | 593 | pte[pte_ofs] = pfn_pte(pfn, prot); |
593 | } | 594 | } |
594 | assign_pte(pmd, pte); | 595 | if (pte) |
596 | assign_pte(pmd, pte); | ||
595 | } else { | 597 | } else { |
596 | pte_t pteval = pfn_pte(0, PAGE_KERNEL_EXEC); | 598 | pte_t pteval = pfn_pte(0, PAGE_KERNEL_EXEC); |
597 | pteval = pte_mkhuge(pteval); | 599 | pteval = pte_mkhuge(pteval); |
@@ -614,7 +616,9 @@ static void __init kernel_physical_mapping_init(pgd_t *pgd_base) | |||
614 | else | 616 | else |
615 | pteval = hv_pte_set_mode(pteval, | 617 | pteval = hv_pte_set_mode(pteval, |
616 | HV_PTE_MODE_CACHE_NO_L3); | 618 | HV_PTE_MODE_CACHE_NO_L3); |
617 | *(pte_t *)pmd = pteval; | 619 | for (; address < (unsigned long)_einittext; |
620 | pfn += PFN_DOWN(HPAGE_SIZE), address += HPAGE_SIZE) | ||
621 | *(pte_t *)(pmd++) = pfn_pte(pfn, pteval); | ||
618 | } | 622 | } |
619 | 623 | ||
620 | /* Set swapper_pgprot here so it is flushed to memory right away. */ | 624 | /* Set swapper_pgprot here so it is flushed to memory right away. */ |
diff --git a/arch/tile/mm/pgtable.c b/arch/tile/mm/pgtable.c index 87303693a072..2410aa899b3e 100644 --- a/arch/tile/mm/pgtable.c +++ b/arch/tile/mm/pgtable.c | |||
@@ -177,14 +177,10 @@ void shatter_huge_page(unsigned long addr) | |||
177 | if (!pmd_huge_page(*pmd)) | 177 | if (!pmd_huge_page(*pmd)) |
178 | return; | 178 | return; |
179 | 179 | ||
180 | /* | 180 | spin_lock_irqsave(&init_mm.page_table_lock, flags); |
181 | * Grab the pgd_lock, since we may need it to walk the pgd_list, | ||
182 | * and since we need some kind of lock here to avoid races. | ||
183 | */ | ||
184 | spin_lock_irqsave(&pgd_lock, flags); | ||
185 | if (!pmd_huge_page(*pmd)) { | 181 | if (!pmd_huge_page(*pmd)) { |
186 | /* Lost the race to convert the huge page. */ | 182 | /* Lost the race to convert the huge page. */ |
187 | spin_unlock_irqrestore(&pgd_lock, flags); | 183 | spin_unlock_irqrestore(&init_mm.page_table_lock, flags); |
188 | return; | 184 | return; |
189 | } | 185 | } |
190 | 186 | ||
@@ -194,6 +190,7 @@ void shatter_huge_page(unsigned long addr) | |||
194 | 190 | ||
195 | #ifdef __PAGETABLE_PMD_FOLDED | 191 | #ifdef __PAGETABLE_PMD_FOLDED |
196 | /* Walk every pgd on the system and update the pmd there. */ | 192 | /* Walk every pgd on the system and update the pmd there. */ |
193 | spin_lock(&pgd_lock); | ||
197 | list_for_each(pos, &pgd_list) { | 194 | list_for_each(pos, &pgd_list) { |
198 | pmd_t *copy_pmd; | 195 | pmd_t *copy_pmd; |
199 | pgd = list_to_pgd(pos) + pgd_index(addr); | 196 | pgd = list_to_pgd(pos) + pgd_index(addr); |
@@ -201,6 +198,7 @@ void shatter_huge_page(unsigned long addr) | |||
201 | copy_pmd = pmd_offset(pud, addr); | 198 | copy_pmd = pmd_offset(pud, addr); |
202 | __set_pmd(copy_pmd, *pmd); | 199 | __set_pmd(copy_pmd, *pmd); |
203 | } | 200 | } |
201 | spin_unlock(&pgd_lock); | ||
204 | #endif | 202 | #endif |
205 | 203 | ||
206 | /* Tell every cpu to notice the change. */ | 204 | /* Tell every cpu to notice the change. */ |
@@ -208,7 +206,7 @@ void shatter_huge_page(unsigned long addr) | |||
208 | cpu_possible_mask, NULL, 0); | 206 | cpu_possible_mask, NULL, 0); |
209 | 207 | ||
210 | /* Hold the lock until the TLB flush is finished to avoid races. */ | 208 | /* Hold the lock until the TLB flush is finished to avoid races. */ |
211 | spin_unlock_irqrestore(&pgd_lock, flags); | 209 | spin_unlock_irqrestore(&init_mm.page_table_lock, flags); |
212 | } | 210 | } |
213 | 211 | ||
214 | /* | 212 | /* |
@@ -217,9 +215,13 @@ void shatter_huge_page(unsigned long addr) | |||
217 | * against pageattr.c; it is the unique case in which a valid change | 215 | * against pageattr.c; it is the unique case in which a valid change |
218 | * of kernel pagetables can't be lazily synchronized by vmalloc faults. | 216 | * of kernel pagetables can't be lazily synchronized by vmalloc faults. |
219 | * vmalloc faults work because attached pagetables are never freed. | 217 | * vmalloc faults work because attached pagetables are never freed. |
220 | * The locking scheme was chosen on the basis of manfred's | 218 | * |
221 | * recommendations and having no core impact whatsoever. | 219 | * The lock is always taken with interrupts disabled, unlike on x86 |
222 | * -- wli | 220 | * and other platforms, because we need to take the lock in |
221 | * shatter_huge_page(), which may be called from an interrupt context. | ||
222 | * We are not at risk from the tlbflush IPI deadlock that was seen on | ||
223 | * x86, since we use the flush_remote() API to have the hypervisor do | ||
224 | * the TLB flushes regardless of irq disabling. | ||
223 | */ | 225 | */ |
224 | DEFINE_SPINLOCK(pgd_lock); | 226 | DEFINE_SPINLOCK(pgd_lock); |
225 | LIST_HEAD(pgd_list); | 227 | LIST_HEAD(pgd_list); |
@@ -469,10 +471,18 @@ void __set_pte(pte_t *ptep, pte_t pte) | |||
469 | 471 | ||
470 | void set_pte(pte_t *ptep, pte_t pte) | 472 | void set_pte(pte_t *ptep, pte_t pte) |
471 | { | 473 | { |
472 | struct page *page = pfn_to_page(pte_pfn(pte)); | 474 | if (pte_present(pte) && |
473 | 475 | (!CHIP_HAS_MMIO() || hv_pte_get_mode(pte) != HV_PTE_MODE_MMIO)) { | |
474 | /* Update the home of a PTE if necessary */ | 476 | /* The PTE actually references physical memory. */ |
475 | pte = pte_set_home(pte, page_home(page)); | 477 | unsigned long pfn = pte_pfn(pte); |
478 | if (pfn_valid(pfn)) { | ||
479 | /* Update the home of the PTE from the struct page. */ | ||
480 | pte = pte_set_home(pte, page_home(pfn_to_page(pfn))); | ||
481 | } else if (hv_pte_get_mode(pte) == 0) { | ||
482 | /* remap_pfn_range(), etc, must supply PTE mode. */ | ||
483 | panic("set_pte(): out-of-range PFN and mode 0\n"); | ||
484 | } | ||
485 | } | ||
476 | 486 | ||
477 | __set_pte(ptep, pte); | 487 | __set_pte(ptep, pte); |
478 | } | 488 | } |
diff --git a/arch/x86/include/asm/word-at-a-time.h b/arch/x86/include/asm/word-at-a-time.h new file mode 100644 index 000000000000..6fe6767b7124 --- /dev/null +++ b/arch/x86/include/asm/word-at-a-time.h | |||
@@ -0,0 +1,46 @@ | |||
1 | #ifndef _ASM_WORD_AT_A_TIME_H | ||
2 | #define _ASM_WORD_AT_A_TIME_H | ||
3 | |||
4 | /* | ||
5 | * This is largely generic for little-endian machines, but the | ||
6 | * optimal byte mask counting is probably going to be something | ||
7 | * that is architecture-specific. If you have a reliably fast | ||
8 | * bit count instruction, that might be better than the multiply | ||
9 | * and shift, for example. | ||
10 | */ | ||
11 | |||
12 | #ifdef CONFIG_64BIT | ||
13 | |||
14 | /* | ||
15 | * Jan Achrenius on G+: microoptimized version of | ||
16 | * the simpler "(mask & ONEBYTES) * ONEBYTES >> 56" | ||
17 | * that works for the bytemasks without having to | ||
18 | * mask them first. | ||
19 | */ | ||
20 | static inline long count_masked_bytes(unsigned long mask) | ||
21 | { | ||
22 | return mask*0x0001020304050608ul >> 56; | ||
23 | } | ||
24 | |||
25 | #else /* 32-bit case */ | ||
26 | |||
27 | /* Carl Chatfield / Jan Achrenius G+ version for 32-bit */ | ||
28 | static inline long count_masked_bytes(long mask) | ||
29 | { | ||
30 | /* (000000 0000ff 00ffff ffffff) -> ( 1 1 2 3 ) */ | ||
31 | long a = (0x0ff0001+mask) >> 23; | ||
32 | /* Fix the 1 for 00 case */ | ||
33 | return a & mask; | ||
34 | } | ||
35 | |||
36 | #endif | ||
37 | |||
38 | #define REPEAT_BYTE(x) ((~0ul / 0xff) * (x)) | ||
39 | |||
40 | /* Return the high bit set in the first byte that is a zero */ | ||
41 | static inline unsigned long has_zero(unsigned long a) | ||
42 | { | ||
43 | return ((a - REPEAT_BYTE(0x01)) & ~a) & REPEAT_BYTE(0x80); | ||
44 | } | ||
45 | |||
46 | #endif /* _ASM_WORD_AT_A_TIME_H */ | ||
diff --git a/arch/x86/kernel/kdebugfs.c b/arch/x86/kernel/kdebugfs.c index 90fcf62854bb..1d5d31ea686b 100644 --- a/arch/x86/kernel/kdebugfs.c +++ b/arch/x86/kernel/kdebugfs.c | |||
@@ -68,16 +68,9 @@ static ssize_t setup_data_read(struct file *file, char __user *user_buf, | |||
68 | return count; | 68 | return count; |
69 | } | 69 | } |
70 | 70 | ||
71 | static int setup_data_open(struct inode *inode, struct file *file) | ||
72 | { | ||
73 | file->private_data = inode->i_private; | ||
74 | |||
75 | return 0; | ||
76 | } | ||
77 | |||
78 | static const struct file_operations fops_setup_data = { | 71 | static const struct file_operations fops_setup_data = { |
79 | .read = setup_data_read, | 72 | .read = setup_data_read, |
80 | .open = setup_data_open, | 73 | .open = simple_open, |
81 | .llseek = default_llseek, | 74 | .llseek = default_llseek, |
82 | }; | 75 | }; |
83 | 76 | ||
diff --git a/arch/x86/net/bpf_jit.S b/arch/x86/net/bpf_jit.S index 66870223f8c5..877b9a1b2152 100644 --- a/arch/x86/net/bpf_jit.S +++ b/arch/x86/net/bpf_jit.S | |||
@@ -18,17 +18,17 @@ | |||
18 | * r9d : hlen = skb->len - skb->data_len | 18 | * r9d : hlen = skb->len - skb->data_len |
19 | */ | 19 | */ |
20 | #define SKBDATA %r8 | 20 | #define SKBDATA %r8 |
21 | 21 | #define SKF_MAX_NEG_OFF $(-0x200000) /* SKF_LL_OFF from filter.h */ | |
22 | sk_load_word_ind: | ||
23 | .globl sk_load_word_ind | ||
24 | |||
25 | add %ebx,%esi /* offset += X */ | ||
26 | # test %esi,%esi /* if (offset < 0) goto bpf_error; */ | ||
27 | js bpf_error | ||
28 | 22 | ||
29 | sk_load_word: | 23 | sk_load_word: |
30 | .globl sk_load_word | 24 | .globl sk_load_word |
31 | 25 | ||
26 | test %esi,%esi | ||
27 | js bpf_slow_path_word_neg | ||
28 | |||
29 | sk_load_word_positive_offset: | ||
30 | .globl sk_load_word_positive_offset | ||
31 | |||
32 | mov %r9d,%eax # hlen | 32 | mov %r9d,%eax # hlen |
33 | sub %esi,%eax # hlen - offset | 33 | sub %esi,%eax # hlen - offset |
34 | cmp $3,%eax | 34 | cmp $3,%eax |
@@ -37,16 +37,15 @@ sk_load_word: | |||
37 | bswap %eax /* ntohl() */ | 37 | bswap %eax /* ntohl() */ |
38 | ret | 38 | ret |
39 | 39 | ||
40 | |||
41 | sk_load_half_ind: | ||
42 | .globl sk_load_half_ind | ||
43 | |||
44 | add %ebx,%esi /* offset += X */ | ||
45 | js bpf_error | ||
46 | |||
47 | sk_load_half: | 40 | sk_load_half: |
48 | .globl sk_load_half | 41 | .globl sk_load_half |
49 | 42 | ||
43 | test %esi,%esi | ||
44 | js bpf_slow_path_half_neg | ||
45 | |||
46 | sk_load_half_positive_offset: | ||
47 | .globl sk_load_half_positive_offset | ||
48 | |||
50 | mov %r9d,%eax | 49 | mov %r9d,%eax |
51 | sub %esi,%eax # hlen - offset | 50 | sub %esi,%eax # hlen - offset |
52 | cmp $1,%eax | 51 | cmp $1,%eax |
@@ -55,14 +54,15 @@ sk_load_half: | |||
55 | rol $8,%ax # ntohs() | 54 | rol $8,%ax # ntohs() |
56 | ret | 55 | ret |
57 | 56 | ||
58 | sk_load_byte_ind: | ||
59 | .globl sk_load_byte_ind | ||
60 | add %ebx,%esi /* offset += X */ | ||
61 | js bpf_error | ||
62 | |||
63 | sk_load_byte: | 57 | sk_load_byte: |
64 | .globl sk_load_byte | 58 | .globl sk_load_byte |
65 | 59 | ||
60 | test %esi,%esi | ||
61 | js bpf_slow_path_byte_neg | ||
62 | |||
63 | sk_load_byte_positive_offset: | ||
64 | .globl sk_load_byte_positive_offset | ||
65 | |||
66 | cmp %esi,%r9d /* if (offset >= hlen) goto bpf_slow_path_byte */ | 66 | cmp %esi,%r9d /* if (offset >= hlen) goto bpf_slow_path_byte */ |
67 | jle bpf_slow_path_byte | 67 | jle bpf_slow_path_byte |
68 | movzbl (SKBDATA,%rsi),%eax | 68 | movzbl (SKBDATA,%rsi),%eax |
@@ -73,25 +73,21 @@ sk_load_byte: | |||
73 | * | 73 | * |
74 | * Implements BPF_S_LDX_B_MSH : ldxb 4*([offset]&0xf) | 74 | * Implements BPF_S_LDX_B_MSH : ldxb 4*([offset]&0xf) |
75 | * Must preserve A accumulator (%eax) | 75 | * Must preserve A accumulator (%eax) |
76 | * Inputs : %esi is the offset value, already known positive | 76 | * Inputs : %esi is the offset value |
77 | */ | 77 | */ |
78 | ENTRY(sk_load_byte_msh) | 78 | sk_load_byte_msh: |
79 | CFI_STARTPROC | 79 | .globl sk_load_byte_msh |
80 | test %esi,%esi | ||
81 | js bpf_slow_path_byte_msh_neg | ||
82 | |||
83 | sk_load_byte_msh_positive_offset: | ||
84 | .globl sk_load_byte_msh_positive_offset | ||
80 | cmp %esi,%r9d /* if (offset >= hlen) goto bpf_slow_path_byte_msh */ | 85 | cmp %esi,%r9d /* if (offset >= hlen) goto bpf_slow_path_byte_msh */ |
81 | jle bpf_slow_path_byte_msh | 86 | jle bpf_slow_path_byte_msh |
82 | movzbl (SKBDATA,%rsi),%ebx | 87 | movzbl (SKBDATA,%rsi),%ebx |
83 | and $15,%bl | 88 | and $15,%bl |
84 | shl $2,%bl | 89 | shl $2,%bl |
85 | ret | 90 | ret |
86 | CFI_ENDPROC | ||
87 | ENDPROC(sk_load_byte_msh) | ||
88 | |||
89 | bpf_error: | ||
90 | # force a return 0 from jit handler | ||
91 | xor %eax,%eax | ||
92 | mov -8(%rbp),%rbx | ||
93 | leaveq | ||
94 | ret | ||
95 | 91 | ||
96 | /* rsi contains offset and can be scratched */ | 92 | /* rsi contains offset and can be scratched */ |
97 | #define bpf_slow_path_common(LEN) \ | 93 | #define bpf_slow_path_common(LEN) \ |
@@ -138,3 +134,67 @@ bpf_slow_path_byte_msh: | |||
138 | shl $2,%al | 134 | shl $2,%al |
139 | xchg %eax,%ebx | 135 | xchg %eax,%ebx |
140 | ret | 136 | ret |
137 | |||
138 | #define sk_negative_common(SIZE) \ | ||
139 | push %rdi; /* save skb */ \ | ||
140 | push %r9; \ | ||
141 | push SKBDATA; \ | ||
142 | /* rsi already has offset */ \ | ||
143 | mov $SIZE,%ecx; /* size */ \ | ||
144 | call bpf_internal_load_pointer_neg_helper; \ | ||
145 | test %rax,%rax; \ | ||
146 | pop SKBDATA; \ | ||
147 | pop %r9; \ | ||
148 | pop %rdi; \ | ||
149 | jz bpf_error | ||
150 | |||
151 | |||
152 | bpf_slow_path_word_neg: | ||
153 | cmp SKF_MAX_NEG_OFF, %esi /* test range */ | ||
154 | jl bpf_error /* offset lower -> error */ | ||
155 | sk_load_word_negative_offset: | ||
156 | .globl sk_load_word_negative_offset | ||
157 | sk_negative_common(4) | ||
158 | mov (%rax), %eax | ||
159 | bswap %eax | ||
160 | ret | ||
161 | |||
162 | bpf_slow_path_half_neg: | ||
163 | cmp SKF_MAX_NEG_OFF, %esi | ||
164 | jl bpf_error | ||
165 | sk_load_half_negative_offset: | ||
166 | .globl sk_load_half_negative_offset | ||
167 | sk_negative_common(2) | ||
168 | mov (%rax),%ax | ||
169 | rol $8,%ax | ||
170 | movzwl %ax,%eax | ||
171 | ret | ||
172 | |||
173 | bpf_slow_path_byte_neg: | ||
174 | cmp SKF_MAX_NEG_OFF, %esi | ||
175 | jl bpf_error | ||
176 | sk_load_byte_negative_offset: | ||
177 | .globl sk_load_byte_negative_offset | ||
178 | sk_negative_common(1) | ||
179 | movzbl (%rax), %eax | ||
180 | ret | ||
181 | |||
182 | bpf_slow_path_byte_msh_neg: | ||
183 | cmp SKF_MAX_NEG_OFF, %esi | ||
184 | jl bpf_error | ||
185 | sk_load_byte_msh_negative_offset: | ||
186 | .globl sk_load_byte_msh_negative_offset | ||
187 | xchg %eax,%ebx /* dont lose A , X is about to be scratched */ | ||
188 | sk_negative_common(1) | ||
189 | movzbl (%rax),%eax | ||
190 | and $15,%al | ||
191 | shl $2,%al | ||
192 | xchg %eax,%ebx | ||
193 | ret | ||
194 | |||
195 | bpf_error: | ||
196 | # force a return 0 from jit handler | ||
197 | xor %eax,%eax | ||
198 | mov -8(%rbp),%rbx | ||
199 | leaveq | ||
200 | ret | ||
diff --git a/arch/x86/net/bpf_jit_comp.c b/arch/x86/net/bpf_jit_comp.c index 5a5b6e4dd738..0597f95b6da6 100644 --- a/arch/x86/net/bpf_jit_comp.c +++ b/arch/x86/net/bpf_jit_comp.c | |||
@@ -30,7 +30,10 @@ int bpf_jit_enable __read_mostly; | |||
30 | * assembly code in arch/x86/net/bpf_jit.S | 30 | * assembly code in arch/x86/net/bpf_jit.S |
31 | */ | 31 | */ |
32 | extern u8 sk_load_word[], sk_load_half[], sk_load_byte[], sk_load_byte_msh[]; | 32 | extern u8 sk_load_word[], sk_load_half[], sk_load_byte[], sk_load_byte_msh[]; |
33 | extern u8 sk_load_word_ind[], sk_load_half_ind[], sk_load_byte_ind[]; | 33 | extern u8 sk_load_word_positive_offset[], sk_load_half_positive_offset[]; |
34 | extern u8 sk_load_byte_positive_offset[], sk_load_byte_msh_positive_offset[]; | ||
35 | extern u8 sk_load_word_negative_offset[], sk_load_half_negative_offset[]; | ||
36 | extern u8 sk_load_byte_negative_offset[], sk_load_byte_msh_negative_offset[]; | ||
34 | 37 | ||
35 | static inline u8 *emit_code(u8 *ptr, u32 bytes, unsigned int len) | 38 | static inline u8 *emit_code(u8 *ptr, u32 bytes, unsigned int len) |
36 | { | 39 | { |
@@ -117,6 +120,8 @@ static inline void bpf_flush_icache(void *start, void *end) | |||
117 | set_fs(old_fs); | 120 | set_fs(old_fs); |
118 | } | 121 | } |
119 | 122 | ||
123 | #define CHOOSE_LOAD_FUNC(K, func) \ | ||
124 | ((int)K < 0 ? ((int)K >= SKF_LL_OFF ? func##_negative_offset : func) : func##_positive_offset) | ||
120 | 125 | ||
121 | void bpf_jit_compile(struct sk_filter *fp) | 126 | void bpf_jit_compile(struct sk_filter *fp) |
122 | { | 127 | { |
@@ -473,44 +478,46 @@ void bpf_jit_compile(struct sk_filter *fp) | |||
473 | #endif | 478 | #endif |
474 | break; | 479 | break; |
475 | case BPF_S_LD_W_ABS: | 480 | case BPF_S_LD_W_ABS: |
476 | func = sk_load_word; | 481 | func = CHOOSE_LOAD_FUNC(K, sk_load_word); |
477 | common_load: seen |= SEEN_DATAREF; | 482 | common_load: seen |= SEEN_DATAREF; |
478 | if ((int)K < 0) { | ||
479 | /* Abort the JIT because __load_pointer() is needed. */ | ||
480 | goto out; | ||
481 | } | ||
482 | t_offset = func - (image + addrs[i]); | 483 | t_offset = func - (image + addrs[i]); |
483 | EMIT1_off32(0xbe, K); /* mov imm32,%esi */ | 484 | EMIT1_off32(0xbe, K); /* mov imm32,%esi */ |
484 | EMIT1_off32(0xe8, t_offset); /* call */ | 485 | EMIT1_off32(0xe8, t_offset); /* call */ |
485 | break; | 486 | break; |
486 | case BPF_S_LD_H_ABS: | 487 | case BPF_S_LD_H_ABS: |
487 | func = sk_load_half; | 488 | func = CHOOSE_LOAD_FUNC(K, sk_load_half); |
488 | goto common_load; | 489 | goto common_load; |
489 | case BPF_S_LD_B_ABS: | 490 | case BPF_S_LD_B_ABS: |
490 | func = sk_load_byte; | 491 | func = CHOOSE_LOAD_FUNC(K, sk_load_byte); |
491 | goto common_load; | 492 | goto common_load; |
492 | case BPF_S_LDX_B_MSH: | 493 | case BPF_S_LDX_B_MSH: |
493 | if ((int)K < 0) { | 494 | func = CHOOSE_LOAD_FUNC(K, sk_load_byte_msh); |
494 | /* Abort the JIT because __load_pointer() is needed. */ | ||
495 | goto out; | ||
496 | } | ||
497 | seen |= SEEN_DATAREF | SEEN_XREG; | 495 | seen |= SEEN_DATAREF | SEEN_XREG; |
498 | t_offset = sk_load_byte_msh - (image + addrs[i]); | 496 | t_offset = func - (image + addrs[i]); |
499 | EMIT1_off32(0xbe, K); /* mov imm32,%esi */ | 497 | EMIT1_off32(0xbe, K); /* mov imm32,%esi */ |
500 | EMIT1_off32(0xe8, t_offset); /* call sk_load_byte_msh */ | 498 | EMIT1_off32(0xe8, t_offset); /* call sk_load_byte_msh */ |
501 | break; | 499 | break; |
502 | case BPF_S_LD_W_IND: | 500 | case BPF_S_LD_W_IND: |
503 | func = sk_load_word_ind; | 501 | func = sk_load_word; |
504 | common_load_ind: seen |= SEEN_DATAREF | SEEN_XREG; | 502 | common_load_ind: seen |= SEEN_DATAREF | SEEN_XREG; |
505 | t_offset = func - (image + addrs[i]); | 503 | t_offset = func - (image + addrs[i]); |
506 | EMIT1_off32(0xbe, K); /* mov imm32,%esi */ | 504 | if (K) { |
505 | if (is_imm8(K)) { | ||
506 | EMIT3(0x8d, 0x73, K); /* lea imm8(%rbx), %esi */ | ||
507 | } else { | ||
508 | EMIT2(0x8d, 0xb3); /* lea imm32(%rbx),%esi */ | ||
509 | EMIT(K, 4); | ||
510 | } | ||
511 | } else { | ||
512 | EMIT2(0x89,0xde); /* mov %ebx,%esi */ | ||
513 | } | ||
507 | EMIT1_off32(0xe8, t_offset); /* call sk_load_xxx_ind */ | 514 | EMIT1_off32(0xe8, t_offset); /* call sk_load_xxx_ind */ |
508 | break; | 515 | break; |
509 | case BPF_S_LD_H_IND: | 516 | case BPF_S_LD_H_IND: |
510 | func = sk_load_half_ind; | 517 | func = sk_load_half; |
511 | goto common_load_ind; | 518 | goto common_load_ind; |
512 | case BPF_S_LD_B_IND: | 519 | case BPF_S_LD_B_IND: |
513 | func = sk_load_byte_ind; | 520 | func = sk_load_byte; |
514 | goto common_load_ind; | 521 | goto common_load_ind; |
515 | case BPF_S_JMP_JA: | 522 | case BPF_S_JMP_JA: |
516 | t_offset = addrs[i + K] - addrs[i]; | 523 | t_offset = addrs[i + K] - addrs[i]; |
diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c index 988828b479ed..b8e279479a6b 100644 --- a/arch/x86/xen/mmu.c +++ b/arch/x86/xen/mmu.c | |||
@@ -1859,6 +1859,7 @@ pgd_t * __init xen_setup_kernel_pagetable(pgd_t *pgd, | |||
1859 | #endif /* CONFIG_X86_64 */ | 1859 | #endif /* CONFIG_X86_64 */ |
1860 | 1860 | ||
1861 | static unsigned char dummy_mapping[PAGE_SIZE] __page_aligned_bss; | 1861 | static unsigned char dummy_mapping[PAGE_SIZE] __page_aligned_bss; |
1862 | static unsigned char fake_ioapic_mapping[PAGE_SIZE] __page_aligned_bss; | ||
1862 | 1863 | ||
1863 | static void xen_set_fixmap(unsigned idx, phys_addr_t phys, pgprot_t prot) | 1864 | static void xen_set_fixmap(unsigned idx, phys_addr_t phys, pgprot_t prot) |
1864 | { | 1865 | { |
@@ -1899,7 +1900,7 @@ static void xen_set_fixmap(unsigned idx, phys_addr_t phys, pgprot_t prot) | |||
1899 | * We just don't map the IO APIC - all access is via | 1900 | * We just don't map the IO APIC - all access is via |
1900 | * hypercalls. Keep the address in the pte for reference. | 1901 | * hypercalls. Keep the address in the pte for reference. |
1901 | */ | 1902 | */ |
1902 | pte = pfn_pte(PFN_DOWN(__pa(dummy_mapping)), PAGE_KERNEL); | 1903 | pte = pfn_pte(PFN_DOWN(__pa(fake_ioapic_mapping)), PAGE_KERNEL); |
1903 | break; | 1904 | break; |
1904 | #endif | 1905 | #endif |
1905 | 1906 | ||
@@ -2064,6 +2065,7 @@ void __init xen_init_mmu_ops(void) | |||
2064 | pv_mmu_ops = xen_mmu_ops; | 2065 | pv_mmu_ops = xen_mmu_ops; |
2065 | 2066 | ||
2066 | memset(dummy_mapping, 0xff, PAGE_SIZE); | 2067 | memset(dummy_mapping, 0xff, PAGE_SIZE); |
2068 | memset(fake_ioapic_mapping, 0xfd, PAGE_SIZE); | ||
2067 | } | 2069 | } |
2068 | 2070 | ||
2069 | /* Protected by xen_reservation_lock. */ | 2071 | /* Protected by xen_reservation_lock. */ |
diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c index 02900e8ce26c..5fac6919b957 100644 --- a/arch/x86/xen/smp.c +++ b/arch/x86/xen/smp.c | |||
@@ -59,7 +59,7 @@ static irqreturn_t xen_reschedule_interrupt(int irq, void *dev_id) | |||
59 | 59 | ||
60 | static void __cpuinit cpu_bringup(void) | 60 | static void __cpuinit cpu_bringup(void) |
61 | { | 61 | { |
62 | int cpu = smp_processor_id(); | 62 | int cpu; |
63 | 63 | ||
64 | cpu_init(); | 64 | cpu_init(); |
65 | touch_softlockup_watchdog(); | 65 | touch_softlockup_watchdog(); |
diff --git a/drivers/acpi/ec_sys.c b/drivers/acpi/ec_sys.c index b258cab9061c..7586544fddb4 100644 --- a/drivers/acpi/ec_sys.c +++ b/drivers/acpi/ec_sys.c | |||
@@ -27,12 +27,6 @@ MODULE_PARM_DESC(write_support, "Dangerous, reboot and removal of battery may " | |||
27 | 27 | ||
28 | static struct dentry *acpi_ec_debugfs_dir; | 28 | static struct dentry *acpi_ec_debugfs_dir; |
29 | 29 | ||
30 | static int acpi_ec_open_io(struct inode *i, struct file *f) | ||
31 | { | ||
32 | f->private_data = i->i_private; | ||
33 | return 0; | ||
34 | } | ||
35 | |||
36 | static ssize_t acpi_ec_read_io(struct file *f, char __user *buf, | 30 | static ssize_t acpi_ec_read_io(struct file *f, char __user *buf, |
37 | size_t count, loff_t *off) | 31 | size_t count, loff_t *off) |
38 | { | 32 | { |
@@ -95,7 +89,7 @@ static ssize_t acpi_ec_write_io(struct file *f, const char __user *buf, | |||
95 | 89 | ||
96 | static const struct file_operations acpi_ec_io_ops = { | 90 | static const struct file_operations acpi_ec_io_ops = { |
97 | .owner = THIS_MODULE, | 91 | .owner = THIS_MODULE, |
98 | .open = acpi_ec_open_io, | 92 | .open = simple_open, |
99 | .read = acpi_ec_read_io, | 93 | .read = acpi_ec_read_io, |
100 | .write = acpi_ec_write_io, | 94 | .write = acpi_ec_write_io, |
101 | .llseek = default_llseek, | 95 | .llseek = default_llseek, |
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c index b3447f63e46b..f3decb30223f 100644 --- a/drivers/acpi/processor_idle.c +++ b/drivers/acpi/processor_idle.c | |||
@@ -786,7 +786,7 @@ static int acpi_idle_play_dead(struct cpuidle_device *dev, int index) | |||
786 | while (1) { | 786 | while (1) { |
787 | 787 | ||
788 | if (cx->entry_method == ACPI_CSTATE_HALT) | 788 | if (cx->entry_method == ACPI_CSTATE_HALT) |
789 | halt(); | 789 | safe_halt(); |
790 | else if (cx->entry_method == ACPI_CSTATE_SYSTEMIO) { | 790 | else if (cx->entry_method == ACPI_CSTATE_SYSTEMIO) { |
791 | inb(cx->address); | 791 | inb(cx->address); |
792 | /* See comment in acpi_idle_do_entry() */ | 792 | /* See comment in acpi_idle_do_entry() */ |
diff --git a/drivers/base/regmap/regmap-debugfs.c b/drivers/base/regmap/regmap-debugfs.c index 58517a5dac13..251eb70f83e7 100644 --- a/drivers/base/regmap/regmap-debugfs.c +++ b/drivers/base/regmap/regmap-debugfs.c | |||
@@ -27,12 +27,6 @@ static size_t regmap_calc_reg_len(int max_val, char *buf, size_t buf_size) | |||
27 | return strlen(buf); | 27 | return strlen(buf); |
28 | } | 28 | } |
29 | 29 | ||
30 | static int regmap_open_file(struct inode *inode, struct file *file) | ||
31 | { | ||
32 | file->private_data = inode->i_private; | ||
33 | return 0; | ||
34 | } | ||
35 | |||
36 | static ssize_t regmap_name_read_file(struct file *file, | 30 | static ssize_t regmap_name_read_file(struct file *file, |
37 | char __user *user_buf, size_t count, | 31 | char __user *user_buf, size_t count, |
38 | loff_t *ppos) | 32 | loff_t *ppos) |
@@ -57,7 +51,7 @@ static ssize_t regmap_name_read_file(struct file *file, | |||
57 | } | 51 | } |
58 | 52 | ||
59 | static const struct file_operations regmap_name_fops = { | 53 | static const struct file_operations regmap_name_fops = { |
60 | .open = regmap_open_file, | 54 | .open = simple_open, |
61 | .read = regmap_name_read_file, | 55 | .read = regmap_name_read_file, |
62 | .llseek = default_llseek, | 56 | .llseek = default_llseek, |
63 | }; | 57 | }; |
@@ -174,7 +168,7 @@ static ssize_t regmap_map_write_file(struct file *file, | |||
174 | #endif | 168 | #endif |
175 | 169 | ||
176 | static const struct file_operations regmap_map_fops = { | 170 | static const struct file_operations regmap_map_fops = { |
177 | .open = regmap_open_file, | 171 | .open = simple_open, |
178 | .read = regmap_map_read_file, | 172 | .read = regmap_map_read_file, |
179 | .write = regmap_map_write_file, | 173 | .write = regmap_map_write_file, |
180 | .llseek = default_llseek, | 174 | .llseek = default_llseek, |
@@ -243,7 +237,7 @@ out: | |||
243 | } | 237 | } |
244 | 238 | ||
245 | static const struct file_operations regmap_access_fops = { | 239 | static const struct file_operations regmap_access_fops = { |
246 | .open = regmap_open_file, | 240 | .open = simple_open, |
247 | .read = regmap_access_read_file, | 241 | .read = regmap_access_read_file, |
248 | .llseek = default_llseek, | 242 | .llseek = default_llseek, |
249 | }; | 243 | }; |
diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c index d5e1ab956740..98cbeba8cd53 100644 --- a/drivers/block/xen-blkfront.c +++ b/drivers/block/xen-blkfront.c | |||
@@ -1475,7 +1475,7 @@ static int __init xlblk_init(void) | |||
1475 | if (!xen_domain()) | 1475 | if (!xen_domain()) |
1476 | return -ENODEV; | 1476 | return -ENODEV; |
1477 | 1477 | ||
1478 | if (!xen_platform_pci_unplug) | 1478 | if (xen_hvm_domain() && !xen_platform_pci_unplug) |
1479 | return -ENODEV; | 1479 | return -ENODEV; |
1480 | 1480 | ||
1481 | if (register_blkdev(XENVBD_MAJOR, DEV_NAME)) { | 1481 | if (register_blkdev(XENVBD_MAJOR, DEV_NAME)) { |
diff --git a/drivers/bluetooth/btmrvl_debugfs.c b/drivers/bluetooth/btmrvl_debugfs.c index 6c20bbb54b71..428dbb7574bd 100644 --- a/drivers/bluetooth/btmrvl_debugfs.c +++ b/drivers/bluetooth/btmrvl_debugfs.c | |||
@@ -45,12 +45,6 @@ struct btmrvl_debugfs_data { | |||
45 | struct dentry *txdnldready; | 45 | struct dentry *txdnldready; |
46 | }; | 46 | }; |
47 | 47 | ||
48 | static int btmrvl_open_generic(struct inode *inode, struct file *file) | ||
49 | { | ||
50 | file->private_data = inode->i_private; | ||
51 | return 0; | ||
52 | } | ||
53 | |||
54 | static ssize_t btmrvl_hscfgcmd_write(struct file *file, | 48 | static ssize_t btmrvl_hscfgcmd_write(struct file *file, |
55 | const char __user *ubuf, size_t count, loff_t *ppos) | 49 | const char __user *ubuf, size_t count, loff_t *ppos) |
56 | { | 50 | { |
@@ -93,7 +87,7 @@ static ssize_t btmrvl_hscfgcmd_read(struct file *file, char __user *userbuf, | |||
93 | static const struct file_operations btmrvl_hscfgcmd_fops = { | 87 | static const struct file_operations btmrvl_hscfgcmd_fops = { |
94 | .read = btmrvl_hscfgcmd_read, | 88 | .read = btmrvl_hscfgcmd_read, |
95 | .write = btmrvl_hscfgcmd_write, | 89 | .write = btmrvl_hscfgcmd_write, |
96 | .open = btmrvl_open_generic, | 90 | .open = simple_open, |
97 | .llseek = default_llseek, | 91 | .llseek = default_llseek, |
98 | }; | 92 | }; |
99 | 93 | ||
@@ -134,7 +128,7 @@ static ssize_t btmrvl_psmode_read(struct file *file, char __user *userbuf, | |||
134 | static const struct file_operations btmrvl_psmode_fops = { | 128 | static const struct file_operations btmrvl_psmode_fops = { |
135 | .read = btmrvl_psmode_read, | 129 | .read = btmrvl_psmode_read, |
136 | .write = btmrvl_psmode_write, | 130 | .write = btmrvl_psmode_write, |
137 | .open = btmrvl_open_generic, | 131 | .open = simple_open, |
138 | .llseek = default_llseek, | 132 | .llseek = default_llseek, |
139 | }; | 133 | }; |
140 | 134 | ||
@@ -180,7 +174,7 @@ static ssize_t btmrvl_pscmd_read(struct file *file, char __user *userbuf, | |||
180 | static const struct file_operations btmrvl_pscmd_fops = { | 174 | static const struct file_operations btmrvl_pscmd_fops = { |
181 | .read = btmrvl_pscmd_read, | 175 | .read = btmrvl_pscmd_read, |
182 | .write = btmrvl_pscmd_write, | 176 | .write = btmrvl_pscmd_write, |
183 | .open = btmrvl_open_generic, | 177 | .open = simple_open, |
184 | .llseek = default_llseek, | 178 | .llseek = default_llseek, |
185 | }; | 179 | }; |
186 | 180 | ||
@@ -221,7 +215,7 @@ static ssize_t btmrvl_gpiogap_read(struct file *file, char __user *userbuf, | |||
221 | static const struct file_operations btmrvl_gpiogap_fops = { | 215 | static const struct file_operations btmrvl_gpiogap_fops = { |
222 | .read = btmrvl_gpiogap_read, | 216 | .read = btmrvl_gpiogap_read, |
223 | .write = btmrvl_gpiogap_write, | 217 | .write = btmrvl_gpiogap_write, |
224 | .open = btmrvl_open_generic, | 218 | .open = simple_open, |
225 | .llseek = default_llseek, | 219 | .llseek = default_llseek, |
226 | }; | 220 | }; |
227 | 221 | ||
@@ -265,7 +259,7 @@ static ssize_t btmrvl_hscmd_read(struct file *file, char __user *userbuf, | |||
265 | static const struct file_operations btmrvl_hscmd_fops = { | 259 | static const struct file_operations btmrvl_hscmd_fops = { |
266 | .read = btmrvl_hscmd_read, | 260 | .read = btmrvl_hscmd_read, |
267 | .write = btmrvl_hscmd_write, | 261 | .write = btmrvl_hscmd_write, |
268 | .open = btmrvl_open_generic, | 262 | .open = simple_open, |
269 | .llseek = default_llseek, | 263 | .llseek = default_llseek, |
270 | }; | 264 | }; |
271 | 265 | ||
@@ -305,7 +299,7 @@ static ssize_t btmrvl_hsmode_read(struct file *file, char __user * userbuf, | |||
305 | static const struct file_operations btmrvl_hsmode_fops = { | 299 | static const struct file_operations btmrvl_hsmode_fops = { |
306 | .read = btmrvl_hsmode_read, | 300 | .read = btmrvl_hsmode_read, |
307 | .write = btmrvl_hsmode_write, | 301 | .write = btmrvl_hsmode_write, |
308 | .open = btmrvl_open_generic, | 302 | .open = simple_open, |
309 | .llseek = default_llseek, | 303 | .llseek = default_llseek, |
310 | }; | 304 | }; |
311 | 305 | ||
@@ -323,7 +317,7 @@ static ssize_t btmrvl_curpsmode_read(struct file *file, char __user *userbuf, | |||
323 | 317 | ||
324 | static const struct file_operations btmrvl_curpsmode_fops = { | 318 | static const struct file_operations btmrvl_curpsmode_fops = { |
325 | .read = btmrvl_curpsmode_read, | 319 | .read = btmrvl_curpsmode_read, |
326 | .open = btmrvl_open_generic, | 320 | .open = simple_open, |
327 | .llseek = default_llseek, | 321 | .llseek = default_llseek, |
328 | }; | 322 | }; |
329 | 323 | ||
@@ -341,7 +335,7 @@ static ssize_t btmrvl_psstate_read(struct file *file, char __user * userbuf, | |||
341 | 335 | ||
342 | static const struct file_operations btmrvl_psstate_fops = { | 336 | static const struct file_operations btmrvl_psstate_fops = { |
343 | .read = btmrvl_psstate_read, | 337 | .read = btmrvl_psstate_read, |
344 | .open = btmrvl_open_generic, | 338 | .open = simple_open, |
345 | .llseek = default_llseek, | 339 | .llseek = default_llseek, |
346 | }; | 340 | }; |
347 | 341 | ||
@@ -359,7 +353,7 @@ static ssize_t btmrvl_hsstate_read(struct file *file, char __user *userbuf, | |||
359 | 353 | ||
360 | static const struct file_operations btmrvl_hsstate_fops = { | 354 | static const struct file_operations btmrvl_hsstate_fops = { |
361 | .read = btmrvl_hsstate_read, | 355 | .read = btmrvl_hsstate_read, |
362 | .open = btmrvl_open_generic, | 356 | .open = simple_open, |
363 | .llseek = default_llseek, | 357 | .llseek = default_llseek, |
364 | }; | 358 | }; |
365 | 359 | ||
@@ -378,7 +372,7 @@ static ssize_t btmrvl_txdnldready_read(struct file *file, char __user *userbuf, | |||
378 | 372 | ||
379 | static const struct file_operations btmrvl_txdnldready_fops = { | 373 | static const struct file_operations btmrvl_txdnldready_fops = { |
380 | .read = btmrvl_txdnldready_read, | 374 | .read = btmrvl_txdnldready_read, |
381 | .open = btmrvl_open_generic, | 375 | .open = simple_open, |
382 | .llseek = default_llseek, | 376 | .llseek = default_llseek, |
383 | }; | 377 | }; |
384 | 378 | ||
diff --git a/drivers/char/apm-emulation.c b/drivers/char/apm-emulation.c index 57501ca9204b..46118f845948 100644 --- a/drivers/char/apm-emulation.c +++ b/drivers/char/apm-emulation.c | |||
@@ -301,7 +301,7 @@ apm_ioctl(struct file *filp, u_int cmd, u_long arg) | |||
301 | * anything critical, chill a bit on each iteration. | 301 | * anything critical, chill a bit on each iteration. |
302 | */ | 302 | */ |
303 | while (wait_event_freezable(apm_suspend_waitqueue, | 303 | while (wait_event_freezable(apm_suspend_waitqueue, |
304 | as->suspend_state == SUSPEND_DONE)) | 304 | as->suspend_state != SUSPEND_ACKED)) |
305 | msleep(10); | 305 | msleep(10); |
306 | break; | 306 | break; |
307 | case SUSPEND_ACKTO: | 307 | case SUSPEND_ACKTO: |
diff --git a/drivers/char/tile-srom.c b/drivers/char/tile-srom.c index 4dc019408fac..3b22a606f79d 100644 --- a/drivers/char/tile-srom.c +++ b/drivers/char/tile-srom.c | |||
@@ -194,17 +194,17 @@ static ssize_t srom_read(struct file *filp, char __user *buf, | |||
194 | 194 | ||
195 | hv_retval = _srom_read(srom->hv_devhdl, kernbuf, | 195 | hv_retval = _srom_read(srom->hv_devhdl, kernbuf, |
196 | *f_pos, bytes_this_pass); | 196 | *f_pos, bytes_this_pass); |
197 | if (hv_retval > 0) { | 197 | if (hv_retval <= 0) { |
198 | if (copy_to_user(buf, kernbuf, hv_retval) != 0) { | ||
199 | retval = -EFAULT; | ||
200 | break; | ||
201 | } | ||
202 | } else if (hv_retval <= 0) { | ||
203 | if (retval == 0) | 198 | if (retval == 0) |
204 | retval = hv_retval; | 199 | retval = hv_retval; |
205 | break; | 200 | break; |
206 | } | 201 | } |
207 | 202 | ||
203 | if (copy_to_user(buf, kernbuf, hv_retval) != 0) { | ||
204 | retval = -EFAULT; | ||
205 | break; | ||
206 | } | ||
207 | |||
208 | retval += hv_retval; | 208 | retval += hv_retval; |
209 | *f_pos += hv_retval; | 209 | *f_pos += hv_retval; |
210 | buf += hv_retval; | 210 | buf += hv_retval; |
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c index b58b56187065..ddf86b6500b7 100644 --- a/drivers/char/virtio_console.c +++ b/drivers/char/virtio_console.c | |||
@@ -1038,12 +1038,6 @@ static struct attribute_group port_attribute_group = { | |||
1038 | .attrs = port_sysfs_entries, | 1038 | .attrs = port_sysfs_entries, |
1039 | }; | 1039 | }; |
1040 | 1040 | ||
1041 | static int debugfs_open(struct inode *inode, struct file *filp) | ||
1042 | { | ||
1043 | filp->private_data = inode->i_private; | ||
1044 | return 0; | ||
1045 | } | ||
1046 | |||
1047 | static ssize_t debugfs_read(struct file *filp, char __user *ubuf, | 1041 | static ssize_t debugfs_read(struct file *filp, char __user *ubuf, |
1048 | size_t count, loff_t *offp) | 1042 | size_t count, loff_t *offp) |
1049 | { | 1043 | { |
@@ -1087,7 +1081,7 @@ static ssize_t debugfs_read(struct file *filp, char __user *ubuf, | |||
1087 | 1081 | ||
1088 | static const struct file_operations port_debugfs_ops = { | 1082 | static const struct file_operations port_debugfs_ops = { |
1089 | .owner = THIS_MODULE, | 1083 | .owner = THIS_MODULE, |
1090 | .open = debugfs_open, | 1084 | .open = simple_open, |
1091 | .read = debugfs_read, | 1085 | .read = debugfs_read, |
1092 | }; | 1086 | }; |
1093 | 1087 | ||
diff --git a/drivers/cpufreq/Kconfig.arm b/drivers/cpufreq/Kconfig.arm index 32d790dd8180..ffbb44685915 100644 --- a/drivers/cpufreq/Kconfig.arm +++ b/drivers/cpufreq/Kconfig.arm | |||
@@ -51,9 +51,6 @@ config ARM_S5PV210_CPUFREQ | |||
51 | config ARM_EXYNOS_CPUFREQ | 51 | config ARM_EXYNOS_CPUFREQ |
52 | bool "SAMSUNG EXYNOS SoCs" | 52 | bool "SAMSUNG EXYNOS SoCs" |
53 | depends on ARCH_EXYNOS | 53 | depends on ARCH_EXYNOS |
54 | select ARM_EXYNOS4210_CPUFREQ if CPU_EXYNOS4210 | ||
55 | select ARM_EXYNOS4X12_CPUFREQ if (SOC_EXYNOS4212 || SOC_EXYNOS4412) | ||
56 | select ARM_EXYNOS5250_CPUFREQ if SOC_EXYNOS5250 | ||
57 | default y | 54 | default y |
58 | help | 55 | help |
59 | This adds the CPUFreq driver common part for Samsung | 56 | This adds the CPUFreq driver common part for Samsung |
@@ -62,20 +59,19 @@ config ARM_EXYNOS_CPUFREQ | |||
62 | If in doubt, say N. | 59 | If in doubt, say N. |
63 | 60 | ||
64 | config ARM_EXYNOS4210_CPUFREQ | 61 | config ARM_EXYNOS4210_CPUFREQ |
65 | bool "Samsung EXYNOS4210" | 62 | def_bool CPU_EXYNOS4210 |
66 | depends on ARCH_EXYNOS | ||
67 | help | 63 | help |
68 | This adds the CPUFreq driver for Samsung EXYNOS4210 | 64 | This adds the CPUFreq driver for Samsung EXYNOS4210 |
69 | SoC (S5PV310 or S5PC210). | 65 | SoC (S5PV310 or S5PC210). |
70 | 66 | ||
71 | config ARM_EXYNOS4X12_CPUFREQ | 67 | config ARM_EXYNOS4X12_CPUFREQ |
72 | bool "Samsung EXYNOS4X12" | 68 | def_bool (SOC_EXYNOS4212 || SOC_EXYNOS4412) |
73 | help | 69 | help |
74 | This adds the CPUFreq driver for Samsung EXYNOS4X12 | 70 | This adds the CPUFreq driver for Samsung EXYNOS4X12 |
75 | SoC (EXYNOS4212 or EXYNOS4412). | 71 | SoC (EXYNOS4212 or EXYNOS4412). |
76 | 72 | ||
77 | config ARM_EXYNOS5250_CPUFREQ | 73 | config ARM_EXYNOS5250_CPUFREQ |
78 | bool "Samsung EXYNOS5250" | 74 | def_bool SOC_EXYNOS5250 |
79 | help | 75 | help |
80 | This adds the CPUFreq driver for Samsung EXYNOS5250 | 76 | This adds the CPUFreq driver for Samsung EXYNOS5250 |
81 | SoC. | 77 | SoC. |
diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c index 87411cebc577..2f0083a51a9a 100644 --- a/drivers/cpuidle/cpuidle.c +++ b/drivers/cpuidle/cpuidle.c | |||
@@ -74,7 +74,7 @@ static cpuidle_enter_t cpuidle_enter_ops; | |||
74 | /** | 74 | /** |
75 | * cpuidle_play_dead - cpu off-lining | 75 | * cpuidle_play_dead - cpu off-lining |
76 | * | 76 | * |
77 | * Only returns in case of an error | 77 | * Returns in case of an error or no driver |
78 | */ | 78 | */ |
79 | int cpuidle_play_dead(void) | 79 | int cpuidle_play_dead(void) |
80 | { | 80 | { |
@@ -83,6 +83,9 @@ int cpuidle_play_dead(void) | |||
83 | int i, dead_state = -1; | 83 | int i, dead_state = -1; |
84 | int power_usage = -1; | 84 | int power_usage = -1; |
85 | 85 | ||
86 | if (!drv) | ||
87 | return -ENODEV; | ||
88 | |||
86 | /* Find lowest-power state that supports long-term idle */ | 89 | /* Find lowest-power state that supports long-term idle */ |
87 | for (i = CPUIDLE_DRIVER_STATE_START; i < drv->state_count; i++) { | 90 | for (i = CPUIDLE_DRIVER_STATE_START; i < drv->state_count; i++) { |
88 | struct cpuidle_state *s = &drv->states[i]; | 91 | struct cpuidle_state *s = &drv->states[i]; |
diff --git a/drivers/dma/coh901318.c b/drivers/dma/coh901318.c index dc89455f5550..750925f9638b 100644 --- a/drivers/dma/coh901318.c +++ b/drivers/dma/coh901318.c | |||
@@ -104,13 +104,6 @@ static void coh901318_list_print(struct coh901318_chan *cohc, | |||
104 | static struct coh901318_base *debugfs_dma_base; | 104 | static struct coh901318_base *debugfs_dma_base; |
105 | static struct dentry *dma_dentry; | 105 | static struct dentry *dma_dentry; |
106 | 106 | ||
107 | static int coh901318_debugfs_open(struct inode *inode, struct file *file) | ||
108 | { | ||
109 | |||
110 | file->private_data = inode->i_private; | ||
111 | return 0; | ||
112 | } | ||
113 | |||
114 | static int coh901318_debugfs_read(struct file *file, char __user *buf, | 107 | static int coh901318_debugfs_read(struct file *file, char __user *buf, |
115 | size_t count, loff_t *f_pos) | 108 | size_t count, loff_t *f_pos) |
116 | { | 109 | { |
@@ -158,7 +151,7 @@ static int coh901318_debugfs_read(struct file *file, char __user *buf, | |||
158 | 151 | ||
159 | static const struct file_operations coh901318_debugfs_status_operations = { | 152 | static const struct file_operations coh901318_debugfs_status_operations = { |
160 | .owner = THIS_MODULE, | 153 | .owner = THIS_MODULE, |
161 | .open = coh901318_debugfs_open, | 154 | .open = simple_open, |
162 | .read = coh901318_debugfs_read, | 155 | .read = coh901318_debugfs_read, |
163 | .llseek = default_llseek, | 156 | .llseek = default_llseek, |
164 | }; | 157 | }; |
diff --git a/drivers/edac/tile_edac.c b/drivers/edac/tile_edac.c index 1d5cf06f6c6b..e99d00976189 100644 --- a/drivers/edac/tile_edac.c +++ b/drivers/edac/tile_edac.c | |||
@@ -145,7 +145,11 @@ static int __devinit tile_edac_mc_probe(struct platform_device *pdev) | |||
145 | mci->edac_ctl_cap = EDAC_FLAG_SECDED; | 145 | mci->edac_ctl_cap = EDAC_FLAG_SECDED; |
146 | 146 | ||
147 | mci->mod_name = DRV_NAME; | 147 | mci->mod_name = DRV_NAME; |
148 | #ifdef __tilegx__ | ||
149 | mci->ctl_name = "TILEGx_Memory_Controller"; | ||
150 | #else | ||
148 | mci->ctl_name = "TILEPro_Memory_Controller"; | 151 | mci->ctl_name = "TILEPro_Memory_Controller"; |
152 | #endif | ||
149 | mci->dev_name = dev_name(&pdev->dev); | 153 | mci->dev_name = dev_name(&pdev->dev); |
150 | mci->edac_check = tile_edac_check; | 154 | mci->edac_check = tile_edac_check; |
151 | 155 | ||
diff --git a/drivers/gpio/gpio-tegra.c b/drivers/gpio/gpio-tegra.c index 32de6707e3c4..12f349b3830d 100644 --- a/drivers/gpio/gpio-tegra.c +++ b/drivers/gpio/gpio-tegra.c | |||
@@ -22,7 +22,7 @@ | |||
22 | #include <linux/interrupt.h> | 22 | #include <linux/interrupt.h> |
23 | #include <linux/io.h> | 23 | #include <linux/io.h> |
24 | #include <linux/gpio.h> | 24 | #include <linux/gpio.h> |
25 | #include <linux/of.h> | 25 | #include <linux/of_device.h> |
26 | #include <linux/platform_device.h> | 26 | #include <linux/platform_device.h> |
27 | #include <linux/module.h> | 27 | #include <linux/module.h> |
28 | #include <linux/irqdomain.h> | 28 | #include <linux/irqdomain.h> |
@@ -37,7 +37,8 @@ | |||
37 | #define GPIO_PORT(x) (((x) >> 3) & 0x3) | 37 | #define GPIO_PORT(x) (((x) >> 3) & 0x3) |
38 | #define GPIO_BIT(x) ((x) & 0x7) | 38 | #define GPIO_BIT(x) ((x) & 0x7) |
39 | 39 | ||
40 | #define GPIO_REG(x) (GPIO_BANK(x) * 0x80 + GPIO_PORT(x) * 4) | 40 | #define GPIO_REG(x) (GPIO_BANK(x) * tegra_gpio_bank_stride + \ |
41 | GPIO_PORT(x) * 4) | ||
41 | 42 | ||
42 | #define GPIO_CNF(x) (GPIO_REG(x) + 0x00) | 43 | #define GPIO_CNF(x) (GPIO_REG(x) + 0x00) |
43 | #define GPIO_OE(x) (GPIO_REG(x) + 0x10) | 44 | #define GPIO_OE(x) (GPIO_REG(x) + 0x10) |
@@ -48,12 +49,12 @@ | |||
48 | #define GPIO_INT_LVL(x) (GPIO_REG(x) + 0x60) | 49 | #define GPIO_INT_LVL(x) (GPIO_REG(x) + 0x60) |
49 | #define GPIO_INT_CLR(x) (GPIO_REG(x) + 0x70) | 50 | #define GPIO_INT_CLR(x) (GPIO_REG(x) + 0x70) |
50 | 51 | ||
51 | #define GPIO_MSK_CNF(x) (GPIO_REG(x) + 0x800) | 52 | #define GPIO_MSK_CNF(x) (GPIO_REG(x) + tegra_gpio_upper_offset + 0x00) |
52 | #define GPIO_MSK_OE(x) (GPIO_REG(x) + 0x810) | 53 | #define GPIO_MSK_OE(x) (GPIO_REG(x) + tegra_gpio_upper_offset + 0x10) |
53 | #define GPIO_MSK_OUT(x) (GPIO_REG(x) + 0X820) | 54 | #define GPIO_MSK_OUT(x) (GPIO_REG(x) + tegra_gpio_upper_offset + 0X20) |
54 | #define GPIO_MSK_INT_STA(x) (GPIO_REG(x) + 0x840) | 55 | #define GPIO_MSK_INT_STA(x) (GPIO_REG(x) + tegra_gpio_upper_offset + 0x40) |
55 | #define GPIO_MSK_INT_ENB(x) (GPIO_REG(x) + 0x850) | 56 | #define GPIO_MSK_INT_ENB(x) (GPIO_REG(x) + tegra_gpio_upper_offset + 0x50) |
56 | #define GPIO_MSK_INT_LVL(x) (GPIO_REG(x) + 0x860) | 57 | #define GPIO_MSK_INT_LVL(x) (GPIO_REG(x) + tegra_gpio_upper_offset + 0x60) |
57 | 58 | ||
58 | #define GPIO_INT_LVL_MASK 0x010101 | 59 | #define GPIO_INT_LVL_MASK 0x010101 |
59 | #define GPIO_INT_LVL_EDGE_RISING 0x000101 | 60 | #define GPIO_INT_LVL_EDGE_RISING 0x000101 |
@@ -78,6 +79,8 @@ struct tegra_gpio_bank { | |||
78 | static struct irq_domain *irq_domain; | 79 | static struct irq_domain *irq_domain; |
79 | static void __iomem *regs; | 80 | static void __iomem *regs; |
80 | static u32 tegra_gpio_bank_count; | 81 | static u32 tegra_gpio_bank_count; |
82 | static u32 tegra_gpio_bank_stride; | ||
83 | static u32 tegra_gpio_upper_offset; | ||
81 | static struct tegra_gpio_bank *tegra_gpio_banks; | 84 | static struct tegra_gpio_bank *tegra_gpio_banks; |
82 | 85 | ||
83 | static inline void tegra_gpio_writel(u32 val, u32 reg) | 86 | static inline void tegra_gpio_writel(u32 val, u32 reg) |
@@ -333,6 +336,26 @@ static struct irq_chip tegra_gpio_irq_chip = { | |||
333 | #endif | 336 | #endif |
334 | }; | 337 | }; |
335 | 338 | ||
339 | struct tegra_gpio_soc_config { | ||
340 | u32 bank_stride; | ||
341 | u32 upper_offset; | ||
342 | }; | ||
343 | |||
344 | static struct tegra_gpio_soc_config tegra20_gpio_config = { | ||
345 | .bank_stride = 0x80, | ||
346 | .upper_offset = 0x800, | ||
347 | }; | ||
348 | |||
349 | static struct tegra_gpio_soc_config tegra30_gpio_config = { | ||
350 | .bank_stride = 0x100, | ||
351 | .upper_offset = 0x80, | ||
352 | }; | ||
353 | |||
354 | static struct of_device_id tegra_gpio_of_match[] __devinitdata = { | ||
355 | { .compatible = "nvidia,tegra30-gpio", .data = &tegra30_gpio_config }, | ||
356 | { .compatible = "nvidia,tegra20-gpio", .data = &tegra20_gpio_config }, | ||
357 | { }, | ||
358 | }; | ||
336 | 359 | ||
337 | /* This lock class tells lockdep that GPIO irqs are in a different | 360 | /* This lock class tells lockdep that GPIO irqs are in a different |
338 | * category than their parents, so it won't report false recursion. | 361 | * category than their parents, so it won't report false recursion. |
@@ -341,6 +364,8 @@ static struct lock_class_key gpio_lock_class; | |||
341 | 364 | ||
342 | static int __devinit tegra_gpio_probe(struct platform_device *pdev) | 365 | static int __devinit tegra_gpio_probe(struct platform_device *pdev) |
343 | { | 366 | { |
367 | const struct of_device_id *match; | ||
368 | struct tegra_gpio_soc_config *config; | ||
344 | int irq_base; | 369 | int irq_base; |
345 | struct resource *res; | 370 | struct resource *res; |
346 | struct tegra_gpio_bank *bank; | 371 | struct tegra_gpio_bank *bank; |
@@ -348,6 +373,15 @@ static int __devinit tegra_gpio_probe(struct platform_device *pdev) | |||
348 | int i; | 373 | int i; |
349 | int j; | 374 | int j; |
350 | 375 | ||
376 | match = of_match_device(tegra_gpio_of_match, &pdev->dev); | ||
377 | if (match) | ||
378 | config = (struct tegra_gpio_soc_config *)match->data; | ||
379 | else | ||
380 | config = &tegra20_gpio_config; | ||
381 | |||
382 | tegra_gpio_bank_stride = config->bank_stride; | ||
383 | tegra_gpio_upper_offset = config->upper_offset; | ||
384 | |||
351 | for (;;) { | 385 | for (;;) { |
352 | res = platform_get_resource(pdev, IORESOURCE_IRQ, tegra_gpio_bank_count); | 386 | res = platform_get_resource(pdev, IORESOURCE_IRQ, tegra_gpio_bank_count); |
353 | if (!res) | 387 | if (!res) |
@@ -402,7 +436,7 @@ static int __devinit tegra_gpio_probe(struct platform_device *pdev) | |||
402 | return -ENODEV; | 436 | return -ENODEV; |
403 | } | 437 | } |
404 | 438 | ||
405 | for (i = 0; i < 7; i++) { | 439 | for (i = 0; i < tegra_gpio_bank_count; i++) { |
406 | for (j = 0; j < 4; j++) { | 440 | for (j = 0; j < 4; j++) { |
407 | int gpio = tegra_gpio_compose(i, j, 0); | 441 | int gpio = tegra_gpio_compose(i, j, 0); |
408 | tegra_gpio_writel(0x00, GPIO_INT_ENB(gpio)); | 442 | tegra_gpio_writel(0x00, GPIO_INT_ENB(gpio)); |
@@ -441,11 +475,6 @@ static int __devinit tegra_gpio_probe(struct platform_device *pdev) | |||
441 | return 0; | 475 | return 0; |
442 | } | 476 | } |
443 | 477 | ||
444 | static struct of_device_id tegra_gpio_of_match[] __devinitdata = { | ||
445 | { .compatible = "nvidia,tegra20-gpio", }, | ||
446 | { }, | ||
447 | }; | ||
448 | |||
449 | static struct platform_driver tegra_gpio_driver = { | 478 | static struct platform_driver tegra_gpio_driver = { |
450 | .driver = { | 479 | .driver = { |
451 | .name = "tegra-gpio", | 480 | .name = "tegra-gpio", |
@@ -485,7 +514,7 @@ static int dbg_gpio_show(struct seq_file *s, void *unused) | |||
485 | int i; | 514 | int i; |
486 | int j; | 515 | int j; |
487 | 516 | ||
488 | for (i = 0; i < 7; i++) { | 517 | for (i = 0; i < tegra_gpio_bank_count; i++) { |
489 | for (j = 0; j < 4; j++) { | 518 | for (j = 0; j < 4; j++) { |
490 | int gpio = tegra_gpio_compose(i, j, 0); | 519 | int gpio = tegra_gpio_compose(i, j, 0); |
491 | seq_printf(s, | 520 | seq_printf(s, |
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index fdb7ccefffbd..b505b70dba05 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c | |||
@@ -1502,14 +1502,6 @@ static int i915_ppgtt_info(struct seq_file *m, void *data) | |||
1502 | return 0; | 1502 | return 0; |
1503 | } | 1503 | } |
1504 | 1504 | ||
1505 | static int | ||
1506 | i915_debugfs_common_open(struct inode *inode, | ||
1507 | struct file *filp) | ||
1508 | { | ||
1509 | filp->private_data = inode->i_private; | ||
1510 | return 0; | ||
1511 | } | ||
1512 | |||
1513 | static ssize_t | 1505 | static ssize_t |
1514 | i915_wedged_read(struct file *filp, | 1506 | i915_wedged_read(struct file *filp, |
1515 | char __user *ubuf, | 1507 | char __user *ubuf, |
@@ -1560,7 +1552,7 @@ i915_wedged_write(struct file *filp, | |||
1560 | 1552 | ||
1561 | static const struct file_operations i915_wedged_fops = { | 1553 | static const struct file_operations i915_wedged_fops = { |
1562 | .owner = THIS_MODULE, | 1554 | .owner = THIS_MODULE, |
1563 | .open = i915_debugfs_common_open, | 1555 | .open = simple_open, |
1564 | .read = i915_wedged_read, | 1556 | .read = i915_wedged_read, |
1565 | .write = i915_wedged_write, | 1557 | .write = i915_wedged_write, |
1566 | .llseek = default_llseek, | 1558 | .llseek = default_llseek, |
@@ -1622,7 +1614,7 @@ i915_max_freq_write(struct file *filp, | |||
1622 | 1614 | ||
1623 | static const struct file_operations i915_max_freq_fops = { | 1615 | static const struct file_operations i915_max_freq_fops = { |
1624 | .owner = THIS_MODULE, | 1616 | .owner = THIS_MODULE, |
1625 | .open = i915_debugfs_common_open, | 1617 | .open = simple_open, |
1626 | .read = i915_max_freq_read, | 1618 | .read = i915_max_freq_read, |
1627 | .write = i915_max_freq_write, | 1619 | .write = i915_max_freq_write, |
1628 | .llseek = default_llseek, | 1620 | .llseek = default_llseek, |
@@ -1693,7 +1685,7 @@ i915_cache_sharing_write(struct file *filp, | |||
1693 | 1685 | ||
1694 | static const struct file_operations i915_cache_sharing_fops = { | 1686 | static const struct file_operations i915_cache_sharing_fops = { |
1695 | .owner = THIS_MODULE, | 1687 | .owner = THIS_MODULE, |
1696 | .open = i915_debugfs_common_open, | 1688 | .open = simple_open, |
1697 | .read = i915_cache_sharing_read, | 1689 | .read = i915_cache_sharing_read, |
1698 | .write = i915_cache_sharing_write, | 1690 | .write = i915_cache_sharing_write, |
1699 | .llseek = default_llseek, | 1691 | .llseek = default_llseek, |
diff --git a/drivers/hid/hid-picolcd.c b/drivers/hid/hid-picolcd.c index 12f9777c385d..45c3433f7986 100644 --- a/drivers/hid/hid-picolcd.c +++ b/drivers/hid/hid-picolcd.c | |||
@@ -1525,12 +1525,6 @@ static const struct file_operations picolcd_debug_reset_fops = { | |||
1525 | /* | 1525 | /* |
1526 | * The "eeprom" file | 1526 | * The "eeprom" file |
1527 | */ | 1527 | */ |
1528 | static int picolcd_debug_eeprom_open(struct inode *i, struct file *f) | ||
1529 | { | ||
1530 | f->private_data = i->i_private; | ||
1531 | return 0; | ||
1532 | } | ||
1533 | |||
1534 | static ssize_t picolcd_debug_eeprom_read(struct file *f, char __user *u, | 1528 | static ssize_t picolcd_debug_eeprom_read(struct file *f, char __user *u, |
1535 | size_t s, loff_t *off) | 1529 | size_t s, loff_t *off) |
1536 | { | 1530 | { |
@@ -1618,7 +1612,7 @@ static ssize_t picolcd_debug_eeprom_write(struct file *f, const char __user *u, | |||
1618 | */ | 1612 | */ |
1619 | static const struct file_operations picolcd_debug_eeprom_fops = { | 1613 | static const struct file_operations picolcd_debug_eeprom_fops = { |
1620 | .owner = THIS_MODULE, | 1614 | .owner = THIS_MODULE, |
1621 | .open = picolcd_debug_eeprom_open, | 1615 | .open = simple_open, |
1622 | .read = picolcd_debug_eeprom_read, | 1616 | .read = picolcd_debug_eeprom_read, |
1623 | .write = picolcd_debug_eeprom_write, | 1617 | .write = picolcd_debug_eeprom_write, |
1624 | .llseek = generic_file_llseek, | 1618 | .llseek = generic_file_llseek, |
@@ -1627,12 +1621,6 @@ static const struct file_operations picolcd_debug_eeprom_fops = { | |||
1627 | /* | 1621 | /* |
1628 | * The "flash" file | 1622 | * The "flash" file |
1629 | */ | 1623 | */ |
1630 | static int picolcd_debug_flash_open(struct inode *i, struct file *f) | ||
1631 | { | ||
1632 | f->private_data = i->i_private; | ||
1633 | return 0; | ||
1634 | } | ||
1635 | |||
1636 | /* record a flash address to buf (bounds check to be done by caller) */ | 1624 | /* record a flash address to buf (bounds check to be done by caller) */ |
1637 | static int _picolcd_flash_setaddr(struct picolcd_data *data, u8 *buf, long off) | 1625 | static int _picolcd_flash_setaddr(struct picolcd_data *data, u8 *buf, long off) |
1638 | { | 1626 | { |
@@ -1817,7 +1805,7 @@ static ssize_t picolcd_debug_flash_write(struct file *f, const char __user *u, | |||
1817 | */ | 1805 | */ |
1818 | static const struct file_operations picolcd_debug_flash_fops = { | 1806 | static const struct file_operations picolcd_debug_flash_fops = { |
1819 | .owner = THIS_MODULE, | 1807 | .owner = THIS_MODULE, |
1820 | .open = picolcd_debug_flash_open, | 1808 | .open = simple_open, |
1821 | .read = picolcd_debug_flash_read, | 1809 | .read = picolcd_debug_flash_read, |
1822 | .write = picolcd_debug_flash_write, | 1810 | .write = picolcd_debug_flash_write, |
1823 | .llseek = generic_file_llseek, | 1811 | .llseek = generic_file_llseek, |
diff --git a/drivers/hid/hid-wiimote-debug.c b/drivers/hid/hid-wiimote-debug.c index 17dabc1f339e..eec329197c16 100644 --- a/drivers/hid/hid-wiimote-debug.c +++ b/drivers/hid/hid-wiimote-debug.c | |||
@@ -23,12 +23,6 @@ struct wiimote_debug { | |||
23 | struct dentry *drm; | 23 | struct dentry *drm; |
24 | }; | 24 | }; |
25 | 25 | ||
26 | static int wiidebug_eeprom_open(struct inode *i, struct file *f) | ||
27 | { | ||
28 | f->private_data = i->i_private; | ||
29 | return 0; | ||
30 | } | ||
31 | |||
32 | static ssize_t wiidebug_eeprom_read(struct file *f, char __user *u, size_t s, | 26 | static ssize_t wiidebug_eeprom_read(struct file *f, char __user *u, size_t s, |
33 | loff_t *off) | 27 | loff_t *off) |
34 | { | 28 | { |
@@ -83,7 +77,7 @@ static ssize_t wiidebug_eeprom_read(struct file *f, char __user *u, size_t s, | |||
83 | 77 | ||
84 | static const struct file_operations wiidebug_eeprom_fops = { | 78 | static const struct file_operations wiidebug_eeprom_fops = { |
85 | .owner = THIS_MODULE, | 79 | .owner = THIS_MODULE, |
86 | .open = wiidebug_eeprom_open, | 80 | .open = simple_open, |
87 | .read = wiidebug_eeprom_read, | 81 | .read = wiidebug_eeprom_read, |
88 | .llseek = generic_file_llseek, | 82 | .llseek = generic_file_llseek, |
89 | }; | 83 | }; |
diff --git a/drivers/idle/i7300_idle.c b/drivers/idle/i7300_idle.c index c976285d313e..fa080ebd568f 100644 --- a/drivers/idle/i7300_idle.c +++ b/drivers/idle/i7300_idle.c | |||
@@ -516,12 +516,6 @@ static struct notifier_block i7300_idle_nb = { | |||
516 | 516 | ||
517 | MODULE_DEVICE_TABLE(pci, pci_tbl); | 517 | MODULE_DEVICE_TABLE(pci, pci_tbl); |
518 | 518 | ||
519 | int stats_open_generic(struct inode *inode, struct file *fp) | ||
520 | { | ||
521 | fp->private_data = inode->i_private; | ||
522 | return 0; | ||
523 | } | ||
524 | |||
525 | static ssize_t stats_read_ul(struct file *fp, char __user *ubuf, size_t count, | 519 | static ssize_t stats_read_ul(struct file *fp, char __user *ubuf, size_t count, |
526 | loff_t *off) | 520 | loff_t *off) |
527 | { | 521 | { |
@@ -534,7 +528,7 @@ static ssize_t stats_read_ul(struct file *fp, char __user *ubuf, size_t count, | |||
534 | } | 528 | } |
535 | 529 | ||
536 | static const struct file_operations idle_fops = { | 530 | static const struct file_operations idle_fops = { |
537 | .open = stats_open_generic, | 531 | .open = simple_open, |
538 | .read = stats_read_ul, | 532 | .read = stats_read_ul, |
539 | .llseek = default_llseek, | 533 | .llseek = default_llseek, |
540 | }; | 534 | }; |
diff --git a/drivers/iommu/omap-iommu-debug.c b/drivers/iommu/omap-iommu-debug.c index 103dbd92e256..f55fc5dfbadc 100644 --- a/drivers/iommu/omap-iommu-debug.c +++ b/drivers/iommu/omap-iommu-debug.c | |||
@@ -323,15 +323,9 @@ err_out: | |||
323 | return count; | 323 | return count; |
324 | } | 324 | } |
325 | 325 | ||
326 | static int debug_open_generic(struct inode *inode, struct file *file) | ||
327 | { | ||
328 | file->private_data = inode->i_private; | ||
329 | return 0; | ||
330 | } | ||
331 | |||
332 | #define DEBUG_FOPS(name) \ | 326 | #define DEBUG_FOPS(name) \ |
333 | static const struct file_operations debug_##name##_fops = { \ | 327 | static const struct file_operations debug_##name##_fops = { \ |
334 | .open = debug_open_generic, \ | 328 | .open = simple_open, \ |
335 | .read = debug_read_##name, \ | 329 | .read = debug_read_##name, \ |
336 | .write = debug_write_##name, \ | 330 | .write = debug_write_##name, \ |
337 | .llseek = generic_file_llseek, \ | 331 | .llseek = generic_file_llseek, \ |
@@ -339,7 +333,7 @@ static int debug_open_generic(struct inode *inode, struct file *file) | |||
339 | 333 | ||
340 | #define DEBUG_FOPS_RO(name) \ | 334 | #define DEBUG_FOPS_RO(name) \ |
341 | static const struct file_operations debug_##name##_fops = { \ | 335 | static const struct file_operations debug_##name##_fops = { \ |
342 | .open = debug_open_generic, \ | 336 | .open = simple_open, \ |
343 | .read = debug_read_##name, \ | 337 | .read = debug_read_##name, \ |
344 | .llseek = generic_file_llseek, \ | 338 | .llseek = generic_file_llseek, \ |
345 | }; | 339 | }; |
diff --git a/drivers/mfd/aat2870-core.c b/drivers/mfd/aat2870-core.c index 3aa36eb5c79b..44a3fdbadef4 100644 --- a/drivers/mfd/aat2870-core.c +++ b/drivers/mfd/aat2870-core.c | |||
@@ -262,13 +262,6 @@ static ssize_t aat2870_dump_reg(struct aat2870_data *aat2870, char *buf) | |||
262 | return count; | 262 | return count; |
263 | } | 263 | } |
264 | 264 | ||
265 | static int aat2870_reg_open_file(struct inode *inode, struct file *file) | ||
266 | { | ||
267 | file->private_data = inode->i_private; | ||
268 | |||
269 | return 0; | ||
270 | } | ||
271 | |||
272 | static ssize_t aat2870_reg_read_file(struct file *file, char __user *user_buf, | 265 | static ssize_t aat2870_reg_read_file(struct file *file, char __user *user_buf, |
273 | size_t count, loff_t *ppos) | 266 | size_t count, loff_t *ppos) |
274 | { | 267 | { |
@@ -330,7 +323,7 @@ static ssize_t aat2870_reg_write_file(struct file *file, | |||
330 | } | 323 | } |
331 | 324 | ||
332 | static const struct file_operations aat2870_reg_fops = { | 325 | static const struct file_operations aat2870_reg_fops = { |
333 | .open = aat2870_reg_open_file, | 326 | .open = simple_open, |
334 | .read = aat2870_reg_read_file, | 327 | .read = aat2870_reg_read_file, |
335 | .write = aat2870_reg_write_file, | 328 | .write = aat2870_reg_write_file, |
336 | }; | 329 | }; |
diff --git a/drivers/mfd/ab3100-core.c b/drivers/mfd/ab3100-core.c index 60107ee166fc..1efad20fb175 100644 --- a/drivers/mfd/ab3100-core.c +++ b/drivers/mfd/ab3100-core.c | |||
@@ -483,12 +483,6 @@ struct ab3100_get_set_reg_priv { | |||
483 | bool mode; | 483 | bool mode; |
484 | }; | 484 | }; |
485 | 485 | ||
486 | static int ab3100_get_set_reg_open_file(struct inode *inode, struct file *file) | ||
487 | { | ||
488 | file->private_data = inode->i_private; | ||
489 | return 0; | ||
490 | } | ||
491 | |||
492 | static ssize_t ab3100_get_set_reg(struct file *file, | 486 | static ssize_t ab3100_get_set_reg(struct file *file, |
493 | const char __user *user_buf, | 487 | const char __user *user_buf, |
494 | size_t count, loff_t *ppos) | 488 | size_t count, loff_t *ppos) |
@@ -583,7 +577,7 @@ static ssize_t ab3100_get_set_reg(struct file *file, | |||
583 | } | 577 | } |
584 | 578 | ||
585 | static const struct file_operations ab3100_get_set_reg_fops = { | 579 | static const struct file_operations ab3100_get_set_reg_fops = { |
586 | .open = ab3100_get_set_reg_open_file, | 580 | .open = simple_open, |
587 | .write = ab3100_get_set_reg, | 581 | .write = ab3100_get_set_reg, |
588 | .llseek = noop_llseek, | 582 | .llseek = noop_llseek, |
589 | }; | 583 | }; |
diff --git a/drivers/misc/ibmasm/ibmasmfs.c b/drivers/misc/ibmasm/ibmasmfs.c index 1c034b80d408..6673e578b3e9 100644 --- a/drivers/misc/ibmasm/ibmasmfs.c +++ b/drivers/misc/ibmasm/ibmasmfs.c | |||
@@ -500,12 +500,6 @@ static ssize_t r_heartbeat_file_write(struct file *file, const char __user *buf, | |||
500 | return 1; | 500 | return 1; |
501 | } | 501 | } |
502 | 502 | ||
503 | static int remote_settings_file_open(struct inode *inode, struct file *file) | ||
504 | { | ||
505 | file->private_data = inode->i_private; | ||
506 | return 0; | ||
507 | } | ||
508 | |||
509 | static int remote_settings_file_close(struct inode *inode, struct file *file) | 503 | static int remote_settings_file_close(struct inode *inode, struct file *file) |
510 | { | 504 | { |
511 | return 0; | 505 | return 0; |
@@ -600,7 +594,7 @@ static const struct file_operations r_heartbeat_fops = { | |||
600 | }; | 594 | }; |
601 | 595 | ||
602 | static const struct file_operations remote_settings_fops = { | 596 | static const struct file_operations remote_settings_fops = { |
603 | .open = remote_settings_file_open, | 597 | .open = simple_open, |
604 | .release = remote_settings_file_close, | 598 | .release = remote_settings_file_close, |
605 | .read = remote_settings_file_read, | 599 | .read = remote_settings_file_read, |
606 | .write = remote_settings_file_write, | 600 | .write = remote_settings_file_write, |
diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index eed213a5c8cb..b1809650b7aa 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c | |||
@@ -1623,24 +1623,6 @@ static int mmc_blk_alloc_parts(struct mmc_card *card, struct mmc_blk_data *md) | |||
1623 | return ret; | 1623 | return ret; |
1624 | } | 1624 | } |
1625 | 1625 | ||
1626 | static int | ||
1627 | mmc_blk_set_blksize(struct mmc_blk_data *md, struct mmc_card *card) | ||
1628 | { | ||
1629 | int err; | ||
1630 | |||
1631 | mmc_claim_host(card->host); | ||
1632 | err = mmc_set_blocklen(card, 512); | ||
1633 | mmc_release_host(card->host); | ||
1634 | |||
1635 | if (err) { | ||
1636 | pr_err("%s: unable to set block size to 512: %d\n", | ||
1637 | md->disk->disk_name, err); | ||
1638 | return -EINVAL; | ||
1639 | } | ||
1640 | |||
1641 | return 0; | ||
1642 | } | ||
1643 | |||
1644 | static void mmc_blk_remove_req(struct mmc_blk_data *md) | 1626 | static void mmc_blk_remove_req(struct mmc_blk_data *md) |
1645 | { | 1627 | { |
1646 | struct mmc_card *card; | 1628 | struct mmc_card *card; |
@@ -1768,7 +1750,6 @@ static const struct mmc_fixup blk_fixups[] = | |||
1768 | static int mmc_blk_probe(struct mmc_card *card) | 1750 | static int mmc_blk_probe(struct mmc_card *card) |
1769 | { | 1751 | { |
1770 | struct mmc_blk_data *md, *part_md; | 1752 | struct mmc_blk_data *md, *part_md; |
1771 | int err; | ||
1772 | char cap_str[10]; | 1753 | char cap_str[10]; |
1773 | 1754 | ||
1774 | /* | 1755 | /* |
@@ -1781,10 +1762,6 @@ static int mmc_blk_probe(struct mmc_card *card) | |||
1781 | if (IS_ERR(md)) | 1762 | if (IS_ERR(md)) |
1782 | return PTR_ERR(md); | 1763 | return PTR_ERR(md); |
1783 | 1764 | ||
1784 | err = mmc_blk_set_blksize(md, card); | ||
1785 | if (err) | ||
1786 | goto out; | ||
1787 | |||
1788 | string_get_size((u64)get_capacity(md->disk) << 9, STRING_UNITS_2, | 1765 | string_get_size((u64)get_capacity(md->disk) << 9, STRING_UNITS_2, |
1789 | cap_str, sizeof(cap_str)); | 1766 | cap_str, sizeof(cap_str)); |
1790 | pr_info("%s: %s %s %s %s\n", | 1767 | pr_info("%s: %s %s %s %s\n", |
@@ -1809,7 +1786,7 @@ static int mmc_blk_probe(struct mmc_card *card) | |||
1809 | out: | 1786 | out: |
1810 | mmc_blk_remove_parts(card, md); | 1787 | mmc_blk_remove_parts(card, md); |
1811 | mmc_blk_remove_req(md); | 1788 | mmc_blk_remove_req(md); |
1812 | return err; | 1789 | return 0; |
1813 | } | 1790 | } |
1814 | 1791 | ||
1815 | static void mmc_blk_remove(struct mmc_card *card) | 1792 | static void mmc_blk_remove(struct mmc_card *card) |
@@ -1845,8 +1822,6 @@ static int mmc_blk_resume(struct mmc_card *card) | |||
1845 | struct mmc_blk_data *md = mmc_get_drvdata(card); | 1822 | struct mmc_blk_data *md = mmc_get_drvdata(card); |
1846 | 1823 | ||
1847 | if (md) { | 1824 | if (md) { |
1848 | mmc_blk_set_blksize(md, card); | ||
1849 | |||
1850 | /* | 1825 | /* |
1851 | * Resume involves the card going into idle state, | 1826 | * Resume involves the card going into idle state, |
1852 | * so current partition is always the main one. | 1827 | * so current partition is always the main one. |
diff --git a/drivers/mmc/core/bus.c b/drivers/mmc/core/bus.c index 5d011a39dfff..3f606068d552 100644 --- a/drivers/mmc/core/bus.c +++ b/drivers/mmc/core/bus.c | |||
@@ -267,6 +267,15 @@ int mmc_add_card(struct mmc_card *card) | |||
267 | { | 267 | { |
268 | int ret; | 268 | int ret; |
269 | const char *type; | 269 | const char *type; |
270 | const char *uhs_bus_speed_mode = ""; | ||
271 | static const char *const uhs_speeds[] = { | ||
272 | [UHS_SDR12_BUS_SPEED] = "SDR12 ", | ||
273 | [UHS_SDR25_BUS_SPEED] = "SDR25 ", | ||
274 | [UHS_SDR50_BUS_SPEED] = "SDR50 ", | ||
275 | [UHS_SDR104_BUS_SPEED] = "SDR104 ", | ||
276 | [UHS_DDR50_BUS_SPEED] = "DDR50 ", | ||
277 | }; | ||
278 | |||
270 | 279 | ||
271 | dev_set_name(&card->dev, "%s:%04x", mmc_hostname(card->host), card->rca); | 280 | dev_set_name(&card->dev, "%s:%04x", mmc_hostname(card->host), card->rca); |
272 | 281 | ||
@@ -296,6 +305,10 @@ int mmc_add_card(struct mmc_card *card) | |||
296 | break; | 305 | break; |
297 | } | 306 | } |
298 | 307 | ||
308 | if (mmc_sd_card_uhs(card) && | ||
309 | (card->sd_bus_speed < ARRAY_SIZE(uhs_speeds))) | ||
310 | uhs_bus_speed_mode = uhs_speeds[card->sd_bus_speed]; | ||
311 | |||
299 | if (mmc_host_is_spi(card->host)) { | 312 | if (mmc_host_is_spi(card->host)) { |
300 | pr_info("%s: new %s%s%s card on SPI\n", | 313 | pr_info("%s: new %s%s%s card on SPI\n", |
301 | mmc_hostname(card->host), | 314 | mmc_hostname(card->host), |
@@ -303,13 +316,13 @@ int mmc_add_card(struct mmc_card *card) | |||
303 | mmc_card_ddr_mode(card) ? "DDR " : "", | 316 | mmc_card_ddr_mode(card) ? "DDR " : "", |
304 | type); | 317 | type); |
305 | } else { | 318 | } else { |
306 | pr_info("%s: new %s%s%s%s card at address %04x\n", | 319 | pr_info("%s: new %s%s%s%s%s card at address %04x\n", |
307 | mmc_hostname(card->host), | 320 | mmc_hostname(card->host), |
308 | mmc_card_uhs(card) ? "ultra high speed " : | 321 | mmc_card_uhs(card) ? "ultra high speed " : |
309 | (mmc_card_highspeed(card) ? "high speed " : ""), | 322 | (mmc_card_highspeed(card) ? "high speed " : ""), |
310 | (mmc_card_hs200(card) ? "HS200 " : ""), | 323 | (mmc_card_hs200(card) ? "HS200 " : ""), |
311 | mmc_card_ddr_mode(card) ? "DDR " : "", | 324 | mmc_card_ddr_mode(card) ? "DDR " : "", |
312 | type, card->rca); | 325 | uhs_bus_speed_mode, type, card->rca); |
313 | } | 326 | } |
314 | 327 | ||
315 | #ifdef CONFIG_DEBUG_FS | 328 | #ifdef CONFIG_DEBUG_FS |
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index 14f262e9246d..7474c47b9c08 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c | |||
@@ -527,10 +527,14 @@ void mmc_set_data_timeout(struct mmc_data *data, const struct mmc_card *card) | |||
527 | 527 | ||
528 | if (data->flags & MMC_DATA_WRITE) | 528 | if (data->flags & MMC_DATA_WRITE) |
529 | /* | 529 | /* |
530 | * The limit is really 250 ms, but that is | 530 | * The MMC spec "It is strongly recommended |
531 | * insufficient for some crappy cards. | 531 | * for hosts to implement more than 500ms |
532 | * timeout value even if the card indicates | ||
533 | * the 250ms maximum busy length." Even the | ||
534 | * previous value of 300ms is known to be | ||
535 | * insufficient for some cards. | ||
532 | */ | 536 | */ |
533 | limit_us = 300000; | 537 | limit_us = 3000000; |
534 | else | 538 | else |
535 | limit_us = 100000; | 539 | limit_us = 100000; |
536 | 540 | ||
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index 02914d609a91..54df5adc0413 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c | |||
@@ -695,6 +695,11 @@ static int mmc_select_powerclass(struct mmc_card *card, | |||
695 | else if (host->ios.clock <= 200000000) | 695 | else if (host->ios.clock <= 200000000) |
696 | index = EXT_CSD_PWR_CL_200_195; | 696 | index = EXT_CSD_PWR_CL_200_195; |
697 | break; | 697 | break; |
698 | case MMC_VDD_27_28: | ||
699 | case MMC_VDD_28_29: | ||
700 | case MMC_VDD_29_30: | ||
701 | case MMC_VDD_30_31: | ||
702 | case MMC_VDD_31_32: | ||
698 | case MMC_VDD_32_33: | 703 | case MMC_VDD_32_33: |
699 | case MMC_VDD_33_34: | 704 | case MMC_VDD_33_34: |
700 | case MMC_VDD_34_35: | 705 | case MMC_VDD_34_35: |
@@ -1111,11 +1116,10 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, | |||
1111 | ext_csd_bits = (bus_width == MMC_BUS_WIDTH_8) ? | 1116 | ext_csd_bits = (bus_width == MMC_BUS_WIDTH_8) ? |
1112 | EXT_CSD_BUS_WIDTH_8 : EXT_CSD_BUS_WIDTH_4; | 1117 | EXT_CSD_BUS_WIDTH_8 : EXT_CSD_BUS_WIDTH_4; |
1113 | err = mmc_select_powerclass(card, ext_csd_bits, ext_csd); | 1118 | err = mmc_select_powerclass(card, ext_csd_bits, ext_csd); |
1114 | if (err) { | 1119 | if (err) |
1115 | pr_err("%s: power class selection to bus width %d failed\n", | 1120 | pr_warning("%s: power class selection to bus width %d" |
1116 | mmc_hostname(card->host), 1 << bus_width); | 1121 | " failed\n", mmc_hostname(card->host), |
1117 | goto err; | 1122 | 1 << bus_width); |
1118 | } | ||
1119 | } | 1123 | } |
1120 | 1124 | ||
1121 | /* | 1125 | /* |
@@ -1147,10 +1151,10 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, | |||
1147 | err = mmc_select_powerclass(card, ext_csd_bits[idx][0], | 1151 | err = mmc_select_powerclass(card, ext_csd_bits[idx][0], |
1148 | ext_csd); | 1152 | ext_csd); |
1149 | if (err) | 1153 | if (err) |
1150 | pr_err("%s: power class selection to " | 1154 | pr_warning("%s: power class selection to " |
1151 | "bus width %d failed\n", | 1155 | "bus width %d failed\n", |
1152 | mmc_hostname(card->host), | 1156 | mmc_hostname(card->host), |
1153 | 1 << bus_width); | 1157 | 1 << bus_width); |
1154 | 1158 | ||
1155 | err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, | 1159 | err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, |
1156 | EXT_CSD_BUS_WIDTH, | 1160 | EXT_CSD_BUS_WIDTH, |
@@ -1178,10 +1182,10 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, | |||
1178 | err = mmc_select_powerclass(card, ext_csd_bits[idx][1], | 1182 | err = mmc_select_powerclass(card, ext_csd_bits[idx][1], |
1179 | ext_csd); | 1183 | ext_csd); |
1180 | if (err) | 1184 | if (err) |
1181 | pr_err("%s: power class selection to " | 1185 | pr_warning("%s: power class selection to " |
1182 | "bus width %d ddr %d failed\n", | 1186 | "bus width %d ddr %d failed\n", |
1183 | mmc_hostname(card->host), | 1187 | mmc_hostname(card->host), |
1184 | 1 << bus_width, ddr); | 1188 | 1 << bus_width, ddr); |
1185 | 1189 | ||
1186 | err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, | 1190 | err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, |
1187 | EXT_CSD_BUS_WIDTH, | 1191 | EXT_CSD_BUS_WIDTH, |
diff --git a/drivers/mmc/core/sdio_bus.c b/drivers/mmc/core/sdio_bus.c index 40989e6bb53a..236842ec955a 100644 --- a/drivers/mmc/core/sdio_bus.c +++ b/drivers/mmc/core/sdio_bus.c | |||
@@ -192,9 +192,15 @@ static int sdio_bus_remove(struct device *dev) | |||
192 | return ret; | 192 | return ret; |
193 | } | 193 | } |
194 | 194 | ||
195 | #ifdef CONFIG_PM_RUNTIME | 195 | #ifdef CONFIG_PM |
196 | |||
197 | static int pm_no_operation(struct device *dev) | ||
198 | { | ||
199 | return 0; | ||
200 | } | ||
196 | 201 | ||
197 | static const struct dev_pm_ops sdio_bus_pm_ops = { | 202 | static const struct dev_pm_ops sdio_bus_pm_ops = { |
203 | SET_SYSTEM_SLEEP_PM_OPS(pm_no_operation, pm_no_operation) | ||
198 | SET_RUNTIME_PM_OPS( | 204 | SET_RUNTIME_PM_OPS( |
199 | pm_generic_runtime_suspend, | 205 | pm_generic_runtime_suspend, |
200 | pm_generic_runtime_resume, | 206 | pm_generic_runtime_resume, |
@@ -204,11 +210,11 @@ static const struct dev_pm_ops sdio_bus_pm_ops = { | |||
204 | 210 | ||
205 | #define SDIO_PM_OPS_PTR (&sdio_bus_pm_ops) | 211 | #define SDIO_PM_OPS_PTR (&sdio_bus_pm_ops) |
206 | 212 | ||
207 | #else /* !CONFIG_PM_RUNTIME */ | 213 | #else /* !CONFIG_PM */ |
208 | 214 | ||
209 | #define SDIO_PM_OPS_PTR NULL | 215 | #define SDIO_PM_OPS_PTR NULL |
210 | 216 | ||
211 | #endif /* !CONFIG_PM_RUNTIME */ | 217 | #endif /* !CONFIG_PM */ |
212 | 218 | ||
213 | static struct bus_type sdio_bus_type = { | 219 | static struct bus_type sdio_bus_type = { |
214 | .name = "sdio", | 220 | .name = "sdio", |
diff --git a/drivers/mmc/host/atmel-mci-regs.h b/drivers/mmc/host/atmel-mci-regs.h index 000b3ad0f5ca..787aba1682bb 100644 --- a/drivers/mmc/host/atmel-mci-regs.h +++ b/drivers/mmc/host/atmel-mci-regs.h | |||
@@ -31,6 +31,7 @@ | |||
31 | # define ATMCI_MR_PDCFBYTE ( 1 << 13) /* Force Byte Transfer */ | 31 | # define ATMCI_MR_PDCFBYTE ( 1 << 13) /* Force Byte Transfer */ |
32 | # define ATMCI_MR_PDCPADV ( 1 << 14) /* Padding Value */ | 32 | # define ATMCI_MR_PDCPADV ( 1 << 14) /* Padding Value */ |
33 | # define ATMCI_MR_PDCMODE ( 1 << 15) /* PDC-oriented Mode */ | 33 | # define ATMCI_MR_PDCMODE ( 1 << 15) /* PDC-oriented Mode */ |
34 | # define ATMCI_MR_CLKODD(x) ((x) << 16) /* LSB of Clock Divider */ | ||
34 | #define ATMCI_DTOR 0x0008 /* Data Timeout */ | 35 | #define ATMCI_DTOR 0x0008 /* Data Timeout */ |
35 | # define ATMCI_DTOCYC(x) ((x) << 0) /* Data Timeout Cycles */ | 36 | # define ATMCI_DTOCYC(x) ((x) << 0) /* Data Timeout Cycles */ |
36 | # define ATMCI_DTOMUL(x) ((x) << 4) /* Data Timeout Multiplier */ | 37 | # define ATMCI_DTOMUL(x) ((x) << 4) /* Data Timeout Multiplier */ |
diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c index 9819dc09ce08..e94476beca18 100644 --- a/drivers/mmc/host/atmel-mci.c +++ b/drivers/mmc/host/atmel-mci.c | |||
@@ -77,6 +77,7 @@ struct atmel_mci_caps { | |||
77 | bool has_cstor_reg; | 77 | bool has_cstor_reg; |
78 | bool has_highspeed; | 78 | bool has_highspeed; |
79 | bool has_rwproof; | 79 | bool has_rwproof; |
80 | bool has_odd_clk_div; | ||
80 | }; | 81 | }; |
81 | 82 | ||
82 | struct atmel_mci_dma { | 83 | struct atmel_mci_dma { |
@@ -482,7 +483,14 @@ err: | |||
482 | static inline unsigned int atmci_ns_to_clocks(struct atmel_mci *host, | 483 | static inline unsigned int atmci_ns_to_clocks(struct atmel_mci *host, |
483 | unsigned int ns) | 484 | unsigned int ns) |
484 | { | 485 | { |
485 | return (ns * (host->bus_hz / 1000000) + 999) / 1000; | 486 | /* |
487 | * It is easier here to use us instead of ns for the timeout, | ||
488 | * it prevents from overflows during calculation. | ||
489 | */ | ||
490 | unsigned int us = DIV_ROUND_UP(ns, 1000); | ||
491 | |||
492 | /* Maximum clock frequency is host->bus_hz/2 */ | ||
493 | return us * (DIV_ROUND_UP(host->bus_hz, 2000000)); | ||
486 | } | 494 | } |
487 | 495 | ||
488 | static void atmci_set_timeout(struct atmel_mci *host, | 496 | static void atmci_set_timeout(struct atmel_mci *host, |
@@ -1127,16 +1135,27 @@ static void atmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) | |||
1127 | } | 1135 | } |
1128 | 1136 | ||
1129 | /* Calculate clock divider */ | 1137 | /* Calculate clock divider */ |
1130 | clkdiv = DIV_ROUND_UP(host->bus_hz, 2 * clock_min) - 1; | 1138 | if (host->caps.has_odd_clk_div) { |
1131 | if (clkdiv > 255) { | 1139 | clkdiv = DIV_ROUND_UP(host->bus_hz, clock_min) - 2; |
1132 | dev_warn(&mmc->class_dev, | 1140 | if (clkdiv > 511) { |
1133 | "clock %u too slow; using %lu\n", | 1141 | dev_warn(&mmc->class_dev, |
1134 | clock_min, host->bus_hz / (2 * 256)); | 1142 | "clock %u too slow; using %lu\n", |
1135 | clkdiv = 255; | 1143 | clock_min, host->bus_hz / (511 + 2)); |
1144 | clkdiv = 511; | ||
1145 | } | ||
1146 | host->mode_reg = ATMCI_MR_CLKDIV(clkdiv >> 1) | ||
1147 | | ATMCI_MR_CLKODD(clkdiv & 1); | ||
1148 | } else { | ||
1149 | clkdiv = DIV_ROUND_UP(host->bus_hz, 2 * clock_min) - 1; | ||
1150 | if (clkdiv > 255) { | ||
1151 | dev_warn(&mmc->class_dev, | ||
1152 | "clock %u too slow; using %lu\n", | ||
1153 | clock_min, host->bus_hz / (2 * 256)); | ||
1154 | clkdiv = 255; | ||
1155 | } | ||
1156 | host->mode_reg = ATMCI_MR_CLKDIV(clkdiv); | ||
1136 | } | 1157 | } |
1137 | 1158 | ||
1138 | host->mode_reg = ATMCI_MR_CLKDIV(clkdiv); | ||
1139 | |||
1140 | /* | 1159 | /* |
1141 | * WRPROOF and RDPROOF prevent overruns/underruns by | 1160 | * WRPROOF and RDPROOF prevent overruns/underruns by |
1142 | * stopping the clock when the FIFO is full/empty. | 1161 | * stopping the clock when the FIFO is full/empty. |
@@ -2007,35 +2026,35 @@ static void __init atmci_get_cap(struct atmel_mci *host) | |||
2007 | "version: 0x%x\n", version); | 2026 | "version: 0x%x\n", version); |
2008 | 2027 | ||
2009 | host->caps.has_dma = 0; | 2028 | host->caps.has_dma = 0; |
2010 | host->caps.has_pdc = 0; | 2029 | host->caps.has_pdc = 1; |
2011 | host->caps.has_cfg_reg = 0; | 2030 | host->caps.has_cfg_reg = 0; |
2012 | host->caps.has_cstor_reg = 0; | 2031 | host->caps.has_cstor_reg = 0; |
2013 | host->caps.has_highspeed = 0; | 2032 | host->caps.has_highspeed = 0; |
2014 | host->caps.has_rwproof = 0; | 2033 | host->caps.has_rwproof = 0; |
2034 | host->caps.has_odd_clk_div = 0; | ||
2015 | 2035 | ||
2016 | /* keep only major version number */ | 2036 | /* keep only major version number */ |
2017 | switch (version & 0xf00) { | 2037 | switch (version & 0xf00) { |
2018 | case 0x100: | ||
2019 | case 0x200: | ||
2020 | host->caps.has_pdc = 1; | ||
2021 | host->caps.has_rwproof = 1; | ||
2022 | break; | ||
2023 | case 0x300: | ||
2024 | case 0x400: | ||
2025 | case 0x500: | 2038 | case 0x500: |
2039 | host->caps.has_odd_clk_div = 1; | ||
2040 | case 0x400: | ||
2041 | case 0x300: | ||
2026 | #ifdef CONFIG_AT_HDMAC | 2042 | #ifdef CONFIG_AT_HDMAC |
2027 | host->caps.has_dma = 1; | 2043 | host->caps.has_dma = 1; |
2028 | #else | 2044 | #else |
2029 | host->caps.has_dma = 0; | ||
2030 | dev_info(&host->pdev->dev, | 2045 | dev_info(&host->pdev->dev, |
2031 | "has dma capability but dma engine is not selected, then use pio\n"); | 2046 | "has dma capability but dma engine is not selected, then use pio\n"); |
2032 | #endif | 2047 | #endif |
2048 | host->caps.has_pdc = 0; | ||
2033 | host->caps.has_cfg_reg = 1; | 2049 | host->caps.has_cfg_reg = 1; |
2034 | host->caps.has_cstor_reg = 1; | 2050 | host->caps.has_cstor_reg = 1; |
2035 | host->caps.has_highspeed = 1; | 2051 | host->caps.has_highspeed = 1; |
2052 | case 0x200: | ||
2036 | host->caps.has_rwproof = 1; | 2053 | host->caps.has_rwproof = 1; |
2054 | case 0x100: | ||
2037 | break; | 2055 | break; |
2038 | default: | 2056 | default: |
2057 | host->caps.has_pdc = 0; | ||
2039 | dev_warn(&host->pdev->dev, | 2058 | dev_warn(&host->pdev->dev, |
2040 | "Unmanaged mci version, set minimum capabilities\n"); | 2059 | "Unmanaged mci version, set minimum capabilities\n"); |
2041 | break; | 2060 | break; |
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c index 47adb161d3ad..5c2b1c10af9c 100644 --- a/drivers/mmc/host/omap_hsmmc.c +++ b/drivers/mmc/host/omap_hsmmc.c | |||
@@ -1785,7 +1785,7 @@ static inline struct omap_mmc_platform_data | |||
1785 | } | 1785 | } |
1786 | #endif | 1786 | #endif |
1787 | 1787 | ||
1788 | static int __init omap_hsmmc_probe(struct platform_device *pdev) | 1788 | static int __devinit omap_hsmmc_probe(struct platform_device *pdev) |
1789 | { | 1789 | { |
1790 | struct omap_mmc_platform_data *pdata = pdev->dev.platform_data; | 1790 | struct omap_mmc_platform_data *pdata = pdev->dev.platform_data; |
1791 | struct mmc_host *mmc; | 1791 | struct mmc_host *mmc; |
@@ -1818,8 +1818,6 @@ static int __init omap_hsmmc_probe(struct platform_device *pdev) | |||
1818 | if (res == NULL || irq < 0) | 1818 | if (res == NULL || irq < 0) |
1819 | return -ENXIO; | 1819 | return -ENXIO; |
1820 | 1820 | ||
1821 | res->start += pdata->reg_offset; | ||
1822 | res->end += pdata->reg_offset; | ||
1823 | res = request_mem_region(res->start, resource_size(res), pdev->name); | 1821 | res = request_mem_region(res->start, resource_size(res), pdev->name); |
1824 | if (res == NULL) | 1822 | if (res == NULL) |
1825 | return -EBUSY; | 1823 | return -EBUSY; |
@@ -1843,7 +1841,7 @@ static int __init omap_hsmmc_probe(struct platform_device *pdev) | |||
1843 | host->dma_ch = -1; | 1841 | host->dma_ch = -1; |
1844 | host->irq = irq; | 1842 | host->irq = irq; |
1845 | host->slot_id = 0; | 1843 | host->slot_id = 0; |
1846 | host->mapbase = res->start; | 1844 | host->mapbase = res->start + pdata->reg_offset; |
1847 | host->base = ioremap(host->mapbase, SZ_4K); | 1845 | host->base = ioremap(host->mapbase, SZ_4K); |
1848 | host->power_mode = MMC_POWER_OFF; | 1846 | host->power_mode = MMC_POWER_OFF; |
1849 | host->next_data.cookie = 1; | 1847 | host->next_data.cookie = 1; |
@@ -1875,8 +1873,6 @@ static int __init omap_hsmmc_probe(struct platform_device *pdev) | |||
1875 | goto err1; | 1873 | goto err1; |
1876 | } | 1874 | } |
1877 | 1875 | ||
1878 | omap_hsmmc_context_save(host); | ||
1879 | |||
1880 | if (host->pdata->controller_flags & OMAP_HSMMC_BROKEN_MULTIBLOCK_READ) { | 1876 | if (host->pdata->controller_flags & OMAP_HSMMC_BROKEN_MULTIBLOCK_READ) { |
1881 | dev_info(&pdev->dev, "multiblock reads disabled due to 35xx erratum 2.1.1.128; MMC read performance may suffer\n"); | 1877 | dev_info(&pdev->dev, "multiblock reads disabled due to 35xx erratum 2.1.1.128; MMC read performance may suffer\n"); |
1882 | mmc->caps2 |= MMC_CAP2_NO_MULTI_READ; | 1878 | mmc->caps2 |= MMC_CAP2_NO_MULTI_READ; |
@@ -1887,6 +1883,8 @@ static int __init omap_hsmmc_probe(struct platform_device *pdev) | |||
1887 | pm_runtime_set_autosuspend_delay(host->dev, MMC_AUTOSUSPEND_DELAY); | 1883 | pm_runtime_set_autosuspend_delay(host->dev, MMC_AUTOSUSPEND_DELAY); |
1888 | pm_runtime_use_autosuspend(host->dev); | 1884 | pm_runtime_use_autosuspend(host->dev); |
1889 | 1885 | ||
1886 | omap_hsmmc_context_save(host); | ||
1887 | |||
1890 | if (cpu_is_omap2430()) { | 1888 | if (cpu_is_omap2430()) { |
1891 | host->dbclk = clk_get(&pdev->dev, "mmchsdb_fck"); | 1889 | host->dbclk = clk_get(&pdev->dev, "mmchsdb_fck"); |
1892 | /* | 1890 | /* |
@@ -2018,8 +2016,7 @@ err_reg: | |||
2018 | err_irq_cd_init: | 2016 | err_irq_cd_init: |
2019 | free_irq(host->irq, host); | 2017 | free_irq(host->irq, host); |
2020 | err_irq: | 2018 | err_irq: |
2021 | pm_runtime_mark_last_busy(host->dev); | 2019 | pm_runtime_put_sync(host->dev); |
2022 | pm_runtime_put_autosuspend(host->dev); | ||
2023 | pm_runtime_disable(host->dev); | 2020 | pm_runtime_disable(host->dev); |
2024 | clk_put(host->fclk); | 2021 | clk_put(host->fclk); |
2025 | if (host->got_dbclk) { | 2022 | if (host->got_dbclk) { |
@@ -2037,35 +2034,33 @@ err: | |||
2037 | return ret; | 2034 | return ret; |
2038 | } | 2035 | } |
2039 | 2036 | ||
2040 | static int omap_hsmmc_remove(struct platform_device *pdev) | 2037 | static int __devexit omap_hsmmc_remove(struct platform_device *pdev) |
2041 | { | 2038 | { |
2042 | struct omap_hsmmc_host *host = platform_get_drvdata(pdev); | 2039 | struct omap_hsmmc_host *host = platform_get_drvdata(pdev); |
2043 | struct resource *res; | 2040 | struct resource *res; |
2044 | 2041 | ||
2045 | if (host) { | 2042 | pm_runtime_get_sync(host->dev); |
2046 | pm_runtime_get_sync(host->dev); | 2043 | mmc_remove_host(host->mmc); |
2047 | mmc_remove_host(host->mmc); | 2044 | if (host->use_reg) |
2048 | if (host->use_reg) | 2045 | omap_hsmmc_reg_put(host); |
2049 | omap_hsmmc_reg_put(host); | 2046 | if (host->pdata->cleanup) |
2050 | if (host->pdata->cleanup) | 2047 | host->pdata->cleanup(&pdev->dev); |
2051 | host->pdata->cleanup(&pdev->dev); | 2048 | free_irq(host->irq, host); |
2052 | free_irq(host->irq, host); | 2049 | if (mmc_slot(host).card_detect_irq) |
2053 | if (mmc_slot(host).card_detect_irq) | 2050 | free_irq(mmc_slot(host).card_detect_irq, host); |
2054 | free_irq(mmc_slot(host).card_detect_irq, host); | ||
2055 | |||
2056 | pm_runtime_put_sync(host->dev); | ||
2057 | pm_runtime_disable(host->dev); | ||
2058 | clk_put(host->fclk); | ||
2059 | if (host->got_dbclk) { | ||
2060 | clk_disable(host->dbclk); | ||
2061 | clk_put(host->dbclk); | ||
2062 | } | ||
2063 | 2051 | ||
2064 | mmc_free_host(host->mmc); | 2052 | pm_runtime_put_sync(host->dev); |
2065 | iounmap(host->base); | 2053 | pm_runtime_disable(host->dev); |
2066 | omap_hsmmc_gpio_free(pdev->dev.platform_data); | 2054 | clk_put(host->fclk); |
2055 | if (host->got_dbclk) { | ||
2056 | clk_disable(host->dbclk); | ||
2057 | clk_put(host->dbclk); | ||
2067 | } | 2058 | } |
2068 | 2059 | ||
2060 | mmc_free_host(host->mmc); | ||
2061 | iounmap(host->base); | ||
2062 | omap_hsmmc_gpio_free(pdev->dev.platform_data); | ||
2063 | |||
2069 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 2064 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
2070 | if (res) | 2065 | if (res) |
2071 | release_mem_region(res->start, resource_size(res)); | 2066 | release_mem_region(res->start, resource_size(res)); |
@@ -2078,49 +2073,45 @@ static int omap_hsmmc_remove(struct platform_device *pdev) | |||
2078 | static int omap_hsmmc_suspend(struct device *dev) | 2073 | static int omap_hsmmc_suspend(struct device *dev) |
2079 | { | 2074 | { |
2080 | int ret = 0; | 2075 | int ret = 0; |
2081 | struct platform_device *pdev = to_platform_device(dev); | 2076 | struct omap_hsmmc_host *host = dev_get_drvdata(dev); |
2082 | struct omap_hsmmc_host *host = platform_get_drvdata(pdev); | ||
2083 | 2077 | ||
2084 | if (host && host->suspended) | 2078 | if (!host) |
2085 | return 0; | 2079 | return 0; |
2086 | 2080 | ||
2087 | if (host) { | 2081 | if (host && host->suspended) |
2088 | pm_runtime_get_sync(host->dev); | 2082 | return 0; |
2089 | host->suspended = 1; | ||
2090 | if (host->pdata->suspend) { | ||
2091 | ret = host->pdata->suspend(&pdev->dev, | ||
2092 | host->slot_id); | ||
2093 | if (ret) { | ||
2094 | dev_dbg(mmc_dev(host->mmc), | ||
2095 | "Unable to handle MMC board" | ||
2096 | " level suspend\n"); | ||
2097 | host->suspended = 0; | ||
2098 | return ret; | ||
2099 | } | ||
2100 | } | ||
2101 | ret = mmc_suspend_host(host->mmc); | ||
2102 | 2083 | ||
2084 | pm_runtime_get_sync(host->dev); | ||
2085 | host->suspended = 1; | ||
2086 | if (host->pdata->suspend) { | ||
2087 | ret = host->pdata->suspend(dev, host->slot_id); | ||
2103 | if (ret) { | 2088 | if (ret) { |
2089 | dev_dbg(dev, "Unable to handle MMC board" | ||
2090 | " level suspend\n"); | ||
2104 | host->suspended = 0; | 2091 | host->suspended = 0; |
2105 | if (host->pdata->resume) { | 2092 | return ret; |
2106 | ret = host->pdata->resume(&pdev->dev, | ||
2107 | host->slot_id); | ||
2108 | if (ret) | ||
2109 | dev_dbg(mmc_dev(host->mmc), | ||
2110 | "Unmask interrupt failed\n"); | ||
2111 | } | ||
2112 | goto err; | ||
2113 | } | 2093 | } |
2094 | } | ||
2095 | ret = mmc_suspend_host(host->mmc); | ||
2114 | 2096 | ||
2115 | if (!(host->mmc->pm_flags & MMC_PM_KEEP_POWER)) { | 2097 | if (ret) { |
2116 | omap_hsmmc_disable_irq(host); | 2098 | host->suspended = 0; |
2117 | OMAP_HSMMC_WRITE(host->base, HCTL, | 2099 | if (host->pdata->resume) { |
2118 | OMAP_HSMMC_READ(host->base, HCTL) & ~SDBP); | 2100 | ret = host->pdata->resume(dev, host->slot_id); |
2101 | if (ret) | ||
2102 | dev_dbg(dev, "Unmask interrupt failed\n"); | ||
2119 | } | 2103 | } |
2120 | if (host->got_dbclk) | 2104 | goto err; |
2121 | clk_disable(host->dbclk); | 2105 | } |
2122 | 2106 | ||
2107 | if (!(host->mmc->pm_flags & MMC_PM_KEEP_POWER)) { | ||
2108 | omap_hsmmc_disable_irq(host); | ||
2109 | OMAP_HSMMC_WRITE(host->base, HCTL, | ||
2110 | OMAP_HSMMC_READ(host->base, HCTL) & ~SDBP); | ||
2123 | } | 2111 | } |
2112 | |||
2113 | if (host->got_dbclk) | ||
2114 | clk_disable(host->dbclk); | ||
2124 | err: | 2115 | err: |
2125 | pm_runtime_put_sync(host->dev); | 2116 | pm_runtime_put_sync(host->dev); |
2126 | return ret; | 2117 | return ret; |
@@ -2130,38 +2121,37 @@ err: | |||
2130 | static int omap_hsmmc_resume(struct device *dev) | 2121 | static int omap_hsmmc_resume(struct device *dev) |
2131 | { | 2122 | { |
2132 | int ret = 0; | 2123 | int ret = 0; |
2133 | struct platform_device *pdev = to_platform_device(dev); | 2124 | struct omap_hsmmc_host *host = dev_get_drvdata(dev); |
2134 | struct omap_hsmmc_host *host = platform_get_drvdata(pdev); | 2125 | |
2126 | if (!host) | ||
2127 | return 0; | ||
2135 | 2128 | ||
2136 | if (host && !host->suspended) | 2129 | if (host && !host->suspended) |
2137 | return 0; | 2130 | return 0; |
2138 | 2131 | ||
2139 | if (host) { | 2132 | pm_runtime_get_sync(host->dev); |
2140 | pm_runtime_get_sync(host->dev); | ||
2141 | 2133 | ||
2142 | if (host->got_dbclk) | 2134 | if (host->got_dbclk) |
2143 | clk_enable(host->dbclk); | 2135 | clk_enable(host->dbclk); |
2144 | 2136 | ||
2145 | if (!(host->mmc->pm_flags & MMC_PM_KEEP_POWER)) | 2137 | if (!(host->mmc->pm_flags & MMC_PM_KEEP_POWER)) |
2146 | omap_hsmmc_conf_bus_power(host); | 2138 | omap_hsmmc_conf_bus_power(host); |
2147 | 2139 | ||
2148 | if (host->pdata->resume) { | 2140 | if (host->pdata->resume) { |
2149 | ret = host->pdata->resume(&pdev->dev, host->slot_id); | 2141 | ret = host->pdata->resume(dev, host->slot_id); |
2150 | if (ret) | 2142 | if (ret) |
2151 | dev_dbg(mmc_dev(host->mmc), | 2143 | dev_dbg(dev, "Unmask interrupt failed\n"); |
2152 | "Unmask interrupt failed\n"); | 2144 | } |
2153 | } | ||
2154 | 2145 | ||
2155 | omap_hsmmc_protect_card(host); | 2146 | omap_hsmmc_protect_card(host); |
2156 | 2147 | ||
2157 | /* Notify the core to resume the host */ | 2148 | /* Notify the core to resume the host */ |
2158 | ret = mmc_resume_host(host->mmc); | 2149 | ret = mmc_resume_host(host->mmc); |
2159 | if (ret == 0) | 2150 | if (ret == 0) |
2160 | host->suspended = 0; | 2151 | host->suspended = 0; |
2161 | 2152 | ||
2162 | pm_runtime_mark_last_busy(host->dev); | 2153 | pm_runtime_mark_last_busy(host->dev); |
2163 | pm_runtime_put_autosuspend(host->dev); | 2154 | pm_runtime_put_autosuspend(host->dev); |
2164 | } | ||
2165 | 2155 | ||
2166 | return ret; | 2156 | return ret; |
2167 | 2157 | ||
@@ -2178,7 +2168,7 @@ static int omap_hsmmc_runtime_suspend(struct device *dev) | |||
2178 | 2168 | ||
2179 | host = platform_get_drvdata(to_platform_device(dev)); | 2169 | host = platform_get_drvdata(to_platform_device(dev)); |
2180 | omap_hsmmc_context_save(host); | 2170 | omap_hsmmc_context_save(host); |
2181 | dev_dbg(mmc_dev(host->mmc), "disabled\n"); | 2171 | dev_dbg(dev, "disabled\n"); |
2182 | 2172 | ||
2183 | return 0; | 2173 | return 0; |
2184 | } | 2174 | } |
@@ -2189,7 +2179,7 @@ static int omap_hsmmc_runtime_resume(struct device *dev) | |||
2189 | 2179 | ||
2190 | host = platform_get_drvdata(to_platform_device(dev)); | 2180 | host = platform_get_drvdata(to_platform_device(dev)); |
2191 | omap_hsmmc_context_restore(host); | 2181 | omap_hsmmc_context_restore(host); |
2192 | dev_dbg(mmc_dev(host->mmc), "enabled\n"); | 2182 | dev_dbg(dev, "enabled\n"); |
2193 | 2183 | ||
2194 | return 0; | 2184 | return 0; |
2195 | } | 2185 | } |
@@ -2202,7 +2192,8 @@ static struct dev_pm_ops omap_hsmmc_dev_pm_ops = { | |||
2202 | }; | 2192 | }; |
2203 | 2193 | ||
2204 | static struct platform_driver omap_hsmmc_driver = { | 2194 | static struct platform_driver omap_hsmmc_driver = { |
2205 | .remove = omap_hsmmc_remove, | 2195 | .probe = omap_hsmmc_probe, |
2196 | .remove = __devexit_p(omap_hsmmc_remove), | ||
2206 | .driver = { | 2197 | .driver = { |
2207 | .name = DRIVER_NAME, | 2198 | .name = DRIVER_NAME, |
2208 | .owner = THIS_MODULE, | 2199 | .owner = THIS_MODULE, |
@@ -2211,21 +2202,7 @@ static struct platform_driver omap_hsmmc_driver = { | |||
2211 | }, | 2202 | }, |
2212 | }; | 2203 | }; |
2213 | 2204 | ||
2214 | static int __init omap_hsmmc_init(void) | 2205 | module_platform_driver(omap_hsmmc_driver); |
2215 | { | ||
2216 | /* Register the MMC driver */ | ||
2217 | return platform_driver_probe(&omap_hsmmc_driver, omap_hsmmc_probe); | ||
2218 | } | ||
2219 | |||
2220 | static void __exit omap_hsmmc_cleanup(void) | ||
2221 | { | ||
2222 | /* Unregister MMC driver */ | ||
2223 | platform_driver_unregister(&omap_hsmmc_driver); | ||
2224 | } | ||
2225 | |||
2226 | module_init(omap_hsmmc_init); | ||
2227 | module_exit(omap_hsmmc_cleanup); | ||
2228 | |||
2229 | MODULE_DESCRIPTION("OMAP High Speed Multimedia Card driver"); | 2206 | MODULE_DESCRIPTION("OMAP High Speed Multimedia Card driver"); |
2230 | MODULE_LICENSE("GPL"); | 2207 | MODULE_LICENSE("GPL"); |
2231 | MODULE_ALIAS("platform:" DRIVER_NAME); | 2208 | MODULE_ALIAS("platform:" DRIVER_NAME); |
diff --git a/drivers/mmc/host/sdhci-dove.c b/drivers/mmc/host/sdhci-dove.c index 46fd1fd1b605..177f697b5835 100644 --- a/drivers/mmc/host/sdhci-dove.c +++ b/drivers/mmc/host/sdhci-dove.c | |||
@@ -20,6 +20,7 @@ | |||
20 | */ | 20 | */ |
21 | 21 | ||
22 | #include <linux/io.h> | 22 | #include <linux/io.h> |
23 | #include <linux/module.h> | ||
23 | #include <linux/mmc/host.h> | 24 | #include <linux/mmc/host.h> |
24 | 25 | ||
25 | #include "sdhci-pltfm.h" | 26 | #include "sdhci-pltfm.h" |
diff --git a/drivers/mmc/host/sdhci-pci.c b/drivers/mmc/host/sdhci-pci.c index fbbebe251e01..69ef0beae104 100644 --- a/drivers/mmc/host/sdhci-pci.c +++ b/drivers/mmc/host/sdhci-pci.c | |||
@@ -1418,8 +1418,6 @@ static int __devinit sdhci_pci_probe(struct pci_dev *pdev, | |||
1418 | 1418 | ||
1419 | slots = chip->num_slots; /* Quirk may have changed this */ | 1419 | slots = chip->num_slots; /* Quirk may have changed this */ |
1420 | 1420 | ||
1421 | pci_enable_msi(pdev); | ||
1422 | |||
1423 | for (i = 0; i < slots; i++) { | 1421 | for (i = 0; i < slots; i++) { |
1424 | slot = sdhci_pci_probe_slot(pdev, chip, first_bar, i); | 1422 | slot = sdhci_pci_probe_slot(pdev, chip, first_bar, i); |
1425 | if (IS_ERR(slot)) { | 1423 | if (IS_ERR(slot)) { |
@@ -1438,8 +1436,6 @@ static int __devinit sdhci_pci_probe(struct pci_dev *pdev, | |||
1438 | return 0; | 1436 | return 0; |
1439 | 1437 | ||
1440 | free: | 1438 | free: |
1441 | pci_disable_msi(pdev); | ||
1442 | |||
1443 | pci_set_drvdata(pdev, NULL); | 1439 | pci_set_drvdata(pdev, NULL); |
1444 | kfree(chip); | 1440 | kfree(chip); |
1445 | 1441 | ||
@@ -1462,8 +1458,6 @@ static void __devexit sdhci_pci_remove(struct pci_dev *pdev) | |||
1462 | for (i = 0; i < chip->num_slots; i++) | 1458 | for (i = 0; i < chip->num_slots; i++) |
1463 | sdhci_pci_remove_slot(chip->slots[i]); | 1459 | sdhci_pci_remove_slot(chip->slots[i]); |
1464 | 1460 | ||
1465 | pci_disable_msi(pdev); | ||
1466 | |||
1467 | pci_set_drvdata(pdev, NULL); | 1461 | pci_set_drvdata(pdev, NULL); |
1468 | kfree(chip); | 1462 | kfree(chip); |
1469 | } | 1463 | } |
diff --git a/drivers/mmc/host/sdhci-s3c.c b/drivers/mmc/host/sdhci-s3c.c index b19e7d435f8d..55a164fcaa15 100644 --- a/drivers/mmc/host/sdhci-s3c.c +++ b/drivers/mmc/host/sdhci-s3c.c | |||
@@ -20,6 +20,10 @@ | |||
20 | #include <linux/io.h> | 20 | #include <linux/io.h> |
21 | #include <linux/gpio.h> | 21 | #include <linux/gpio.h> |
22 | #include <linux/module.h> | 22 | #include <linux/module.h> |
23 | #include <linux/of.h> | ||
24 | #include <linux/of_gpio.h> | ||
25 | #include <linux/pm.h> | ||
26 | #include <linux/pm_runtime.h> | ||
23 | 27 | ||
24 | #include <linux/mmc/host.h> | 28 | #include <linux/mmc/host.h> |
25 | 29 | ||
@@ -53,6 +57,18 @@ struct sdhci_s3c { | |||
53 | struct clk *clk_bus[MAX_BUS_CLK]; | 57 | struct clk *clk_bus[MAX_BUS_CLK]; |
54 | }; | 58 | }; |
55 | 59 | ||
60 | /** | ||
61 | * struct sdhci_s3c_driver_data - S3C SDHCI platform specific driver data | ||
62 | * @sdhci_quirks: sdhci host specific quirks. | ||
63 | * | ||
64 | * Specifies platform specific configuration of sdhci controller. | ||
65 | * Note: A structure for driver specific platform data is used for future | ||
66 | * expansion of its usage. | ||
67 | */ | ||
68 | struct sdhci_s3c_drv_data { | ||
69 | unsigned int sdhci_quirks; | ||
70 | }; | ||
71 | |||
56 | static inline struct sdhci_s3c *to_s3c(struct sdhci_host *host) | 72 | static inline struct sdhci_s3c *to_s3c(struct sdhci_host *host) |
57 | { | 73 | { |
58 | return sdhci_priv(host); | 74 | return sdhci_priv(host); |
@@ -132,10 +148,10 @@ static unsigned int sdhci_s3c_consider_clock(struct sdhci_s3c *ourhost, | |||
132 | return UINT_MAX; | 148 | return UINT_MAX; |
133 | 149 | ||
134 | /* | 150 | /* |
135 | * Clock divider's step is different as 1 from that of host controller | 151 | * If controller uses a non-standard clock division, find the best clock |
136 | * when 'clk_type' is S3C_SDHCI_CLK_DIV_EXTERNAL. | 152 | * speed possible with selected clock source and skip the division. |
137 | */ | 153 | */ |
138 | if (ourhost->pdata->clk_type) { | 154 | if (ourhost->host->quirks & SDHCI_QUIRK_NONSTANDARD_CLOCK) { |
139 | rate = clk_round_rate(clksrc, wanted); | 155 | rate = clk_round_rate(clksrc, wanted); |
140 | return wanted - rate; | 156 | return wanted - rate; |
141 | } | 157 | } |
@@ -272,6 +288,8 @@ static unsigned int sdhci_cmu_get_min_clock(struct sdhci_host *host) | |||
272 | static void sdhci_cmu_set_clock(struct sdhci_host *host, unsigned int clock) | 288 | static void sdhci_cmu_set_clock(struct sdhci_host *host, unsigned int clock) |
273 | { | 289 | { |
274 | struct sdhci_s3c *ourhost = to_s3c(host); | 290 | struct sdhci_s3c *ourhost = to_s3c(host); |
291 | unsigned long timeout; | ||
292 | u16 clk = 0; | ||
275 | 293 | ||
276 | /* don't bother if the clock is going off */ | 294 | /* don't bother if the clock is going off */ |
277 | if (clock == 0) | 295 | if (clock == 0) |
@@ -282,6 +300,25 @@ static void sdhci_cmu_set_clock(struct sdhci_host *host, unsigned int clock) | |||
282 | clk_set_rate(ourhost->clk_bus[ourhost->cur_clk], clock); | 300 | clk_set_rate(ourhost->clk_bus[ourhost->cur_clk], clock); |
283 | 301 | ||
284 | host->clock = clock; | 302 | host->clock = clock; |
303 | |||
304 | clk = SDHCI_CLOCK_INT_EN; | ||
305 | sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL); | ||
306 | |||
307 | /* Wait max 20 ms */ | ||
308 | timeout = 20; | ||
309 | while (!((clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL)) | ||
310 | & SDHCI_CLOCK_INT_STABLE)) { | ||
311 | if (timeout == 0) { | ||
312 | printk(KERN_ERR "%s: Internal clock never " | ||
313 | "stabilised.\n", mmc_hostname(host->mmc)); | ||
314 | return; | ||
315 | } | ||
316 | timeout--; | ||
317 | mdelay(1); | ||
318 | } | ||
319 | |||
320 | clk |= SDHCI_CLOCK_CARD_EN; | ||
321 | sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL); | ||
285 | } | 322 | } |
286 | 323 | ||
287 | /** | 324 | /** |
@@ -382,16 +419,24 @@ static void sdhci_s3c_setup_card_detect_gpio(struct sdhci_s3c *sc) | |||
382 | } | 419 | } |
383 | } | 420 | } |
384 | 421 | ||
422 | static inline struct sdhci_s3c_drv_data *sdhci_s3c_get_driver_data( | ||
423 | struct platform_device *pdev) | ||
424 | { | ||
425 | return (struct sdhci_s3c_drv_data *) | ||
426 | platform_get_device_id(pdev)->driver_data; | ||
427 | } | ||
428 | |||
385 | static int __devinit sdhci_s3c_probe(struct platform_device *pdev) | 429 | static int __devinit sdhci_s3c_probe(struct platform_device *pdev) |
386 | { | 430 | { |
387 | struct s3c_sdhci_platdata *pdata = pdev->dev.platform_data; | 431 | struct s3c_sdhci_platdata *pdata; |
432 | struct sdhci_s3c_drv_data *drv_data; | ||
388 | struct device *dev = &pdev->dev; | 433 | struct device *dev = &pdev->dev; |
389 | struct sdhci_host *host; | 434 | struct sdhci_host *host; |
390 | struct sdhci_s3c *sc; | 435 | struct sdhci_s3c *sc; |
391 | struct resource *res; | 436 | struct resource *res; |
392 | int ret, irq, ptr, clks; | 437 | int ret, irq, ptr, clks; |
393 | 438 | ||
394 | if (!pdata) { | 439 | if (!pdev->dev.platform_data) { |
395 | dev_err(dev, "no device data specified\n"); | 440 | dev_err(dev, "no device data specified\n"); |
396 | return -ENOENT; | 441 | return -ENOENT; |
397 | } | 442 | } |
@@ -402,18 +447,20 @@ static int __devinit sdhci_s3c_probe(struct platform_device *pdev) | |||
402 | return irq; | 447 | return irq; |
403 | } | 448 | } |
404 | 449 | ||
405 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
406 | if (!res) { | ||
407 | dev_err(dev, "no memory specified\n"); | ||
408 | return -ENOENT; | ||
409 | } | ||
410 | |||
411 | host = sdhci_alloc_host(dev, sizeof(struct sdhci_s3c)); | 450 | host = sdhci_alloc_host(dev, sizeof(struct sdhci_s3c)); |
412 | if (IS_ERR(host)) { | 451 | if (IS_ERR(host)) { |
413 | dev_err(dev, "sdhci_alloc_host() failed\n"); | 452 | dev_err(dev, "sdhci_alloc_host() failed\n"); |
414 | return PTR_ERR(host); | 453 | return PTR_ERR(host); |
415 | } | 454 | } |
416 | 455 | ||
456 | pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL); | ||
457 | if (!pdata) { | ||
458 | ret = -ENOMEM; | ||
459 | goto err_io_clk; | ||
460 | } | ||
461 | memcpy(pdata, pdev->dev.platform_data, sizeof(*pdata)); | ||
462 | |||
463 | drv_data = sdhci_s3c_get_driver_data(pdev); | ||
417 | sc = sdhci_priv(host); | 464 | sc = sdhci_priv(host); |
418 | 465 | ||
419 | sc->host = host; | 466 | sc->host = host; |
@@ -464,15 +511,8 @@ static int __devinit sdhci_s3c_probe(struct platform_device *pdev) | |||
464 | goto err_no_busclks; | 511 | goto err_no_busclks; |
465 | } | 512 | } |
466 | 513 | ||
467 | sc->ioarea = request_mem_region(res->start, resource_size(res), | 514 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
468 | mmc_hostname(host->mmc)); | 515 | host->ioaddr = devm_request_and_ioremap(&pdev->dev, res); |
469 | if (!sc->ioarea) { | ||
470 | dev_err(dev, "failed to reserve register area\n"); | ||
471 | ret = -ENXIO; | ||
472 | goto err_req_regs; | ||
473 | } | ||
474 | |||
475 | host->ioaddr = ioremap_nocache(res->start, resource_size(res)); | ||
476 | if (!host->ioaddr) { | 516 | if (!host->ioaddr) { |
477 | dev_err(dev, "failed to map registers\n"); | 517 | dev_err(dev, "failed to map registers\n"); |
478 | ret = -ENXIO; | 518 | ret = -ENXIO; |
@@ -491,6 +531,8 @@ static int __devinit sdhci_s3c_probe(struct platform_device *pdev) | |||
491 | /* Setup quirks for the controller */ | 531 | /* Setup quirks for the controller */ |
492 | host->quirks |= SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC; | 532 | host->quirks |= SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC; |
493 | host->quirks |= SDHCI_QUIRK_NO_HISPD_BIT; | 533 | host->quirks |= SDHCI_QUIRK_NO_HISPD_BIT; |
534 | if (drv_data) | ||
535 | host->quirks |= drv_data->sdhci_quirks; | ||
494 | 536 | ||
495 | #ifndef CONFIG_MMC_SDHCI_S3C_DMA | 537 | #ifndef CONFIG_MMC_SDHCI_S3C_DMA |
496 | 538 | ||
@@ -518,6 +560,14 @@ static int __devinit sdhci_s3c_probe(struct platform_device *pdev) | |||
518 | if (pdata->cd_type == S3C_SDHCI_CD_PERMANENT) | 560 | if (pdata->cd_type == S3C_SDHCI_CD_PERMANENT) |
519 | host->mmc->caps = MMC_CAP_NONREMOVABLE; | 561 | host->mmc->caps = MMC_CAP_NONREMOVABLE; |
520 | 562 | ||
563 | switch (pdata->max_width) { | ||
564 | case 8: | ||
565 | host->mmc->caps |= MMC_CAP_8_BIT_DATA; | ||
566 | case 4: | ||
567 | host->mmc->caps |= MMC_CAP_4_BIT_DATA; | ||
568 | break; | ||
569 | } | ||
570 | |||
521 | if (pdata->pm_caps) | 571 | if (pdata->pm_caps) |
522 | host->mmc->pm_caps |= pdata->pm_caps; | 572 | host->mmc->pm_caps |= pdata->pm_caps; |
523 | 573 | ||
@@ -531,7 +581,7 @@ static int __devinit sdhci_s3c_probe(struct platform_device *pdev) | |||
531 | * If controller does not have internal clock divider, | 581 | * If controller does not have internal clock divider, |
532 | * we can use overriding functions instead of default. | 582 | * we can use overriding functions instead of default. |
533 | */ | 583 | */ |
534 | if (pdata->clk_type) { | 584 | if (host->quirks & SDHCI_QUIRK_NONSTANDARD_CLOCK) { |
535 | sdhci_s3c_ops.set_clock = sdhci_cmu_set_clock; | 585 | sdhci_s3c_ops.set_clock = sdhci_cmu_set_clock; |
536 | sdhci_s3c_ops.get_min_clock = sdhci_cmu_get_min_clock; | 586 | sdhci_s3c_ops.get_min_clock = sdhci_cmu_get_min_clock; |
537 | sdhci_s3c_ops.get_max_clock = sdhci_cmu_get_max_clock; | 587 | sdhci_s3c_ops.get_max_clock = sdhci_cmu_get_max_clock; |
@@ -544,10 +594,17 @@ static int __devinit sdhci_s3c_probe(struct platform_device *pdev) | |||
544 | if (pdata->host_caps2) | 594 | if (pdata->host_caps2) |
545 | host->mmc->caps2 |= pdata->host_caps2; | 595 | host->mmc->caps2 |= pdata->host_caps2; |
546 | 596 | ||
597 | pm_runtime_enable(&pdev->dev); | ||
598 | pm_runtime_set_autosuspend_delay(&pdev->dev, 50); | ||
599 | pm_runtime_use_autosuspend(&pdev->dev); | ||
600 | pm_suspend_ignore_children(&pdev->dev, 1); | ||
601 | |||
547 | ret = sdhci_add_host(host); | 602 | ret = sdhci_add_host(host); |
548 | if (ret) { | 603 | if (ret) { |
549 | dev_err(dev, "sdhci_add_host() failed\n"); | 604 | dev_err(dev, "sdhci_add_host() failed\n"); |
550 | goto err_add_host; | 605 | pm_runtime_forbid(&pdev->dev); |
606 | pm_runtime_get_noresume(&pdev->dev); | ||
607 | goto err_req_regs; | ||
551 | } | 608 | } |
552 | 609 | ||
553 | /* The following two methods of card detection might call | 610 | /* The following two methods of card detection might call |
@@ -561,10 +618,6 @@ static int __devinit sdhci_s3c_probe(struct platform_device *pdev) | |||
561 | 618 | ||
562 | return 0; | 619 | return 0; |
563 | 620 | ||
564 | err_add_host: | ||
565 | release_resource(sc->ioarea); | ||
566 | kfree(sc->ioarea); | ||
567 | |||
568 | err_req_regs: | 621 | err_req_regs: |
569 | for (ptr = 0; ptr < MAX_BUS_CLK; ptr++) { | 622 | for (ptr = 0; ptr < MAX_BUS_CLK; ptr++) { |
570 | if (sc->clk_bus[ptr]) { | 623 | if (sc->clk_bus[ptr]) { |
@@ -601,6 +654,8 @@ static int __devexit sdhci_s3c_remove(struct platform_device *pdev) | |||
601 | 654 | ||
602 | sdhci_remove_host(host, 1); | 655 | sdhci_remove_host(host, 1); |
603 | 656 | ||
657 | pm_runtime_disable(&pdev->dev); | ||
658 | |||
604 | for (ptr = 0; ptr < 3; ptr++) { | 659 | for (ptr = 0; ptr < 3; ptr++) { |
605 | if (sc->clk_bus[ptr]) { | 660 | if (sc->clk_bus[ptr]) { |
606 | clk_disable(sc->clk_bus[ptr]); | 661 | clk_disable(sc->clk_bus[ptr]); |
@@ -610,18 +665,13 @@ static int __devexit sdhci_s3c_remove(struct platform_device *pdev) | |||
610 | clk_disable(sc->clk_io); | 665 | clk_disable(sc->clk_io); |
611 | clk_put(sc->clk_io); | 666 | clk_put(sc->clk_io); |
612 | 667 | ||
613 | iounmap(host->ioaddr); | ||
614 | release_resource(sc->ioarea); | ||
615 | kfree(sc->ioarea); | ||
616 | |||
617 | sdhci_free_host(host); | 668 | sdhci_free_host(host); |
618 | platform_set_drvdata(pdev, NULL); | 669 | platform_set_drvdata(pdev, NULL); |
619 | 670 | ||
620 | return 0; | 671 | return 0; |
621 | } | 672 | } |
622 | 673 | ||
623 | #ifdef CONFIG_PM | 674 | #ifdef CONFIG_PM_SLEEP |
624 | |||
625 | static int sdhci_s3c_suspend(struct device *dev) | 675 | static int sdhci_s3c_suspend(struct device *dev) |
626 | { | 676 | { |
627 | struct sdhci_host *host = dev_get_drvdata(dev); | 677 | struct sdhci_host *host = dev_get_drvdata(dev); |
@@ -635,10 +685,29 @@ static int sdhci_s3c_resume(struct device *dev) | |||
635 | 685 | ||
636 | return sdhci_resume_host(host); | 686 | return sdhci_resume_host(host); |
637 | } | 687 | } |
688 | #endif | ||
689 | |||
690 | #ifdef CONFIG_PM_RUNTIME | ||
691 | static int sdhci_s3c_runtime_suspend(struct device *dev) | ||
692 | { | ||
693 | struct sdhci_host *host = dev_get_drvdata(dev); | ||
694 | |||
695 | return sdhci_runtime_suspend_host(host); | ||
696 | } | ||
638 | 697 | ||
698 | static int sdhci_s3c_runtime_resume(struct device *dev) | ||
699 | { | ||
700 | struct sdhci_host *host = dev_get_drvdata(dev); | ||
701 | |||
702 | return sdhci_runtime_resume_host(host); | ||
703 | } | ||
704 | #endif | ||
705 | |||
706 | #ifdef CONFIG_PM | ||
639 | static const struct dev_pm_ops sdhci_s3c_pmops = { | 707 | static const struct dev_pm_ops sdhci_s3c_pmops = { |
640 | .suspend = sdhci_s3c_suspend, | 708 | SET_SYSTEM_SLEEP_PM_OPS(sdhci_s3c_suspend, sdhci_s3c_resume) |
641 | .resume = sdhci_s3c_resume, | 709 | SET_RUNTIME_PM_OPS(sdhci_s3c_runtime_suspend, sdhci_s3c_runtime_resume, |
710 | NULL) | ||
642 | }; | 711 | }; |
643 | 712 | ||
644 | #define SDHCI_S3C_PMOPS (&sdhci_s3c_pmops) | 713 | #define SDHCI_S3C_PMOPS (&sdhci_s3c_pmops) |
@@ -647,9 +716,31 @@ static const struct dev_pm_ops sdhci_s3c_pmops = { | |||
647 | #define SDHCI_S3C_PMOPS NULL | 716 | #define SDHCI_S3C_PMOPS NULL |
648 | #endif | 717 | #endif |
649 | 718 | ||
719 | #if defined(CONFIG_CPU_EXYNOS4210) || defined(CONFIG_SOC_EXYNOS4212) | ||
720 | static struct sdhci_s3c_drv_data exynos4_sdhci_drv_data = { | ||
721 | .sdhci_quirks = SDHCI_QUIRK_NONSTANDARD_CLOCK, | ||
722 | }; | ||
723 | #define EXYNOS4_SDHCI_DRV_DATA ((kernel_ulong_t)&exynos4_sdhci_drv_data) | ||
724 | #else | ||
725 | #define EXYNOS4_SDHCI_DRV_DATA ((kernel_ulong_t)NULL) | ||
726 | #endif | ||
727 | |||
728 | static struct platform_device_id sdhci_s3c_driver_ids[] = { | ||
729 | { | ||
730 | .name = "s3c-sdhci", | ||
731 | .driver_data = (kernel_ulong_t)NULL, | ||
732 | }, { | ||
733 | .name = "exynos4-sdhci", | ||
734 | .driver_data = EXYNOS4_SDHCI_DRV_DATA, | ||
735 | }, | ||
736 | { } | ||
737 | }; | ||
738 | MODULE_DEVICE_TABLE(platform, sdhci_s3c_driver_ids); | ||
739 | |||
650 | static struct platform_driver sdhci_s3c_driver = { | 740 | static struct platform_driver sdhci_s3c_driver = { |
651 | .probe = sdhci_s3c_probe, | 741 | .probe = sdhci_s3c_probe, |
652 | .remove = __devexit_p(sdhci_s3c_remove), | 742 | .remove = __devexit_p(sdhci_s3c_remove), |
743 | .id_table = sdhci_s3c_driver_ids, | ||
653 | .driver = { | 744 | .driver = { |
654 | .owner = THIS_MODULE, | 745 | .owner = THIS_MODULE, |
655 | .name = "s3c-sdhci", | 746 | .name = "s3c-sdhci", |
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index 8262cadfdab7..9aa77f3f04a8 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c | |||
@@ -2782,8 +2782,9 @@ int sdhci_add_host(struct sdhci_host *host) | |||
2782 | mmc_card_is_removable(mmc)) | 2782 | mmc_card_is_removable(mmc)) |
2783 | mmc->caps |= MMC_CAP_NEEDS_POLL; | 2783 | mmc->caps |= MMC_CAP_NEEDS_POLL; |
2784 | 2784 | ||
2785 | /* UHS-I mode(s) supported by the host controller. */ | 2785 | /* Any UHS-I mode in caps implies SDR12 and SDR25 support. */ |
2786 | if (host->version >= SDHCI_SPEC_300) | 2786 | if (caps[1] & (SDHCI_SUPPORT_SDR104 | SDHCI_SUPPORT_SDR50 | |
2787 | SDHCI_SUPPORT_DDR50)) | ||
2787 | mmc->caps |= MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25; | 2788 | mmc->caps |= MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25; |
2788 | 2789 | ||
2789 | /* SDR104 supports also implies SDR50 support */ | 2790 | /* SDR104 supports also implies SDR50 support */ |
diff --git a/drivers/mmc/host/sh_mmcif.c b/drivers/mmc/host/sh_mmcif.c index aafaf0b6eb1c..724b35e85a26 100644 --- a/drivers/mmc/host/sh_mmcif.c +++ b/drivers/mmc/host/sh_mmcif.c | |||
@@ -454,7 +454,8 @@ static void sh_mmcif_clock_control(struct sh_mmcif_host *host, unsigned int clk) | |||
454 | sh_mmcif_bitset(host, MMCIF_CE_CLK_CTRL, CLK_SUP_PCLK); | 454 | sh_mmcif_bitset(host, MMCIF_CE_CLK_CTRL, CLK_SUP_PCLK); |
455 | else | 455 | else |
456 | sh_mmcif_bitset(host, MMCIF_CE_CLK_CTRL, CLK_CLEAR & | 456 | sh_mmcif_bitset(host, MMCIF_CE_CLK_CTRL, CLK_CLEAR & |
457 | ((fls(host->clk / clk) - 1) << 16)); | 457 | ((fls(DIV_ROUND_UP(host->clk, |
458 | clk) - 1) - 1) << 16)); | ||
458 | 459 | ||
459 | sh_mmcif_bitset(host, MMCIF_CE_CLK_CTRL, CLK_ENABLE); | 460 | sh_mmcif_bitset(host, MMCIF_CE_CLK_CTRL, CLK_ENABLE); |
460 | } | 461 | } |
@@ -1297,14 +1298,8 @@ static int __devinit sh_mmcif_probe(struct platform_device *pdev) | |||
1297 | spin_lock_init(&host->lock); | 1298 | spin_lock_init(&host->lock); |
1298 | 1299 | ||
1299 | mmc->ops = &sh_mmcif_ops; | 1300 | mmc->ops = &sh_mmcif_ops; |
1300 | mmc->f_max = host->clk; | 1301 | mmc->f_max = host->clk / 2; |
1301 | /* close to 400KHz */ | 1302 | mmc->f_min = host->clk / 512; |
1302 | if (mmc->f_max < 51200000) | ||
1303 | mmc->f_min = mmc->f_max / 128; | ||
1304 | else if (mmc->f_max < 102400000) | ||
1305 | mmc->f_min = mmc->f_max / 256; | ||
1306 | else | ||
1307 | mmc->f_min = mmc->f_max / 512; | ||
1308 | if (pd->ocr) | 1303 | if (pd->ocr) |
1309 | mmc->ocr_avail = pd->ocr; | 1304 | mmc->ocr_avail = pd->ocr; |
1310 | mmc->caps = MMC_CAP_MMC_HIGHSPEED; | 1305 | mmc->caps = MMC_CAP_MMC_HIGHSPEED; |
diff --git a/drivers/mtd/ubi/debug.c b/drivers/mtd/ubi/debug.c index e2cdebf40840..61af9bb560ab 100644 --- a/drivers/mtd/ubi/debug.c +++ b/drivers/mtd/ubi/debug.c | |||
@@ -386,19 +386,11 @@ out: | |||
386 | return count; | 386 | return count; |
387 | } | 387 | } |
388 | 388 | ||
389 | static int default_open(struct inode *inode, struct file *file) | ||
390 | { | ||
391 | if (inode->i_private) | ||
392 | file->private_data = inode->i_private; | ||
393 | |||
394 | return 0; | ||
395 | } | ||
396 | |||
397 | /* File operations for all UBI debugfs files */ | 389 | /* File operations for all UBI debugfs files */ |
398 | static const struct file_operations dfs_fops = { | 390 | static const struct file_operations dfs_fops = { |
399 | .read = dfs_file_read, | 391 | .read = dfs_file_read, |
400 | .write = dfs_file_write, | 392 | .write = dfs_file_write, |
401 | .open = default_open, | 393 | .open = simple_open, |
402 | .llseek = no_llseek, | 394 | .llseek = no_llseek, |
403 | .owner = THIS_MODULE, | 395 | .owner = THIS_MODULE, |
404 | }; | 396 | }; |
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 941b4e189adf..62d2409bb293 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
@@ -2034,6 +2034,9 @@ int bond_release(struct net_device *bond_dev, struct net_device *slave_dev) | |||
2034 | write_unlock_bh(&bond->lock); | 2034 | write_unlock_bh(&bond->lock); |
2035 | unblock_netpoll_tx(); | 2035 | unblock_netpoll_tx(); |
2036 | 2036 | ||
2037 | if (bond->slave_cnt == 0) | ||
2038 | call_netdevice_notifiers(NETDEV_CHANGEADDR, bond->dev); | ||
2039 | |||
2037 | bond_compute_features(bond); | 2040 | bond_compute_features(bond); |
2038 | if (!(bond_dev->features & NETIF_F_VLAN_CHALLENGED) && | 2041 | if (!(bond_dev->features & NETIF_F_VLAN_CHALLENGED) && |
2039 | (old_features & NETIF_F_VLAN_CHALLENGED)) | 2042 | (old_features & NETIF_F_VLAN_CHALLENGED)) |
@@ -3007,7 +3010,11 @@ static void bond_ab_arp_commit(struct bonding *bond, int delta_in_ticks) | |||
3007 | trans_start + delta_in_ticks)) || | 3010 | trans_start + delta_in_ticks)) || |
3008 | bond->curr_active_slave != slave) { | 3011 | bond->curr_active_slave != slave) { |
3009 | slave->link = BOND_LINK_UP; | 3012 | slave->link = BOND_LINK_UP; |
3010 | bond->current_arp_slave = NULL; | 3013 | if (bond->current_arp_slave) { |
3014 | bond_set_slave_inactive_flags( | ||
3015 | bond->current_arp_slave); | ||
3016 | bond->current_arp_slave = NULL; | ||
3017 | } | ||
3011 | 3018 | ||
3012 | pr_info("%s: link status definitely up for interface %s.\n", | 3019 | pr_info("%s: link status definitely up for interface %s.\n", |
3013 | bond->dev->name, slave->dev->name); | 3020 | bond->dev->name, slave->dev->name); |
@@ -3701,17 +3708,52 @@ static void bond_set_multicast_list(struct net_device *bond_dev) | |||
3701 | read_unlock(&bond->lock); | 3708 | read_unlock(&bond->lock); |
3702 | } | 3709 | } |
3703 | 3710 | ||
3704 | static int bond_neigh_setup(struct net_device *dev, struct neigh_parms *parms) | 3711 | static int bond_neigh_init(struct neighbour *n) |
3705 | { | 3712 | { |
3706 | struct bonding *bond = netdev_priv(dev); | 3713 | struct bonding *bond = netdev_priv(n->dev); |
3707 | struct slave *slave = bond->first_slave; | 3714 | struct slave *slave = bond->first_slave; |
3715 | const struct net_device_ops *slave_ops; | ||
3716 | struct neigh_parms parms; | ||
3717 | int ret; | ||
3718 | |||
3719 | if (!slave) | ||
3720 | return 0; | ||
3721 | |||
3722 | slave_ops = slave->dev->netdev_ops; | ||
3723 | |||
3724 | if (!slave_ops->ndo_neigh_setup) | ||
3725 | return 0; | ||
3726 | |||
3727 | parms.neigh_setup = NULL; | ||
3728 | parms.neigh_cleanup = NULL; | ||
3729 | ret = slave_ops->ndo_neigh_setup(slave->dev, &parms); | ||
3730 | if (ret) | ||
3731 | return ret; | ||
3732 | |||
3733 | /* | ||
3734 | * Assign slave's neigh_cleanup to neighbour in case cleanup is called | ||
3735 | * after the last slave has been detached. Assumes that all slaves | ||
3736 | * utilize the same neigh_cleanup (true at this writing as only user | ||
3737 | * is ipoib). | ||
3738 | */ | ||
3739 | n->parms->neigh_cleanup = parms.neigh_cleanup; | ||
3740 | |||
3741 | if (!parms.neigh_setup) | ||
3742 | return 0; | ||
3743 | |||
3744 | return parms.neigh_setup(n); | ||
3745 | } | ||
3746 | |||
3747 | /* | ||
3748 | * The bonding ndo_neigh_setup is called at init time beofre any | ||
3749 | * slave exists. So we must declare proxy setup function which will | ||
3750 | * be used at run time to resolve the actual slave neigh param setup. | ||
3751 | */ | ||
3752 | static int bond_neigh_setup(struct net_device *dev, | ||
3753 | struct neigh_parms *parms) | ||
3754 | { | ||
3755 | parms->neigh_setup = bond_neigh_init; | ||
3708 | 3756 | ||
3709 | if (slave) { | ||
3710 | const struct net_device_ops *slave_ops | ||
3711 | = slave->dev->netdev_ops; | ||
3712 | if (slave_ops->ndo_neigh_setup) | ||
3713 | return slave_ops->ndo_neigh_setup(slave->dev, parms); | ||
3714 | } | ||
3715 | return 0; | 3757 | return 0; |
3716 | } | 3758 | } |
3717 | 3759 | ||
diff --git a/drivers/net/caif/caif_spi.c b/drivers/net/caif/caif_spi.c index 96391c36fa74..b71ce9bf0afb 100644 --- a/drivers/net/caif/caif_spi.c +++ b/drivers/net/caif/caif_spi.c | |||
@@ -127,12 +127,6 @@ static inline void dev_debugfs_rem(struct cfspi *cfspi) | |||
127 | debugfs_remove(cfspi->dbgfs_dir); | 127 | debugfs_remove(cfspi->dbgfs_dir); |
128 | } | 128 | } |
129 | 129 | ||
130 | static int dbgfs_open(struct inode *inode, struct file *file) | ||
131 | { | ||
132 | file->private_data = inode->i_private; | ||
133 | return 0; | ||
134 | } | ||
135 | |||
136 | static ssize_t dbgfs_state(struct file *file, char __user *user_buf, | 130 | static ssize_t dbgfs_state(struct file *file, char __user *user_buf, |
137 | size_t count, loff_t *ppos) | 131 | size_t count, loff_t *ppos) |
138 | { | 132 | { |
@@ -243,13 +237,13 @@ static ssize_t dbgfs_frame(struct file *file, char __user *user_buf, | |||
243 | } | 237 | } |
244 | 238 | ||
245 | static const struct file_operations dbgfs_state_fops = { | 239 | static const struct file_operations dbgfs_state_fops = { |
246 | .open = dbgfs_open, | 240 | .open = simple_open, |
247 | .read = dbgfs_state, | 241 | .read = dbgfs_state, |
248 | .owner = THIS_MODULE | 242 | .owner = THIS_MODULE |
249 | }; | 243 | }; |
250 | 244 | ||
251 | static const struct file_operations dbgfs_frame_fops = { | 245 | static const struct file_operations dbgfs_frame_fops = { |
252 | .open = dbgfs_open, | 246 | .open = simple_open, |
253 | .read = dbgfs_frame, | 247 | .read = dbgfs_frame, |
254 | .owner = THIS_MODULE | 248 | .owner = THIS_MODULE |
255 | }; | 249 | }; |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c index 44556b719e81..4b054812713a 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | |||
@@ -1874,7 +1874,6 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode) | |||
1874 | * bnx2x_periodic_task(). | 1874 | * bnx2x_periodic_task(). |
1875 | */ | 1875 | */ |
1876 | smp_mb(); | 1876 | smp_mb(); |
1877 | queue_delayed_work(bnx2x_wq, &bp->period_task, 0); | ||
1878 | } else | 1877 | } else |
1879 | bp->port.pmf = 0; | 1878 | bp->port.pmf = 0; |
1880 | 1879 | ||
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_fw_defs.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_fw_defs.h index cd6dfa9eaa3a..b9b263323436 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_fw_defs.h +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_fw_defs.h | |||
@@ -25,31 +25,31 @@ | |||
25 | (IRO[149].base + ((funcId) * IRO[149].m1)) | 25 | (IRO[149].base + ((funcId) * IRO[149].m1)) |
26 | #define CSTORM_IGU_MODE_OFFSET (IRO[157].base) | 26 | #define CSTORM_IGU_MODE_OFFSET (IRO[157].base) |
27 | #define CSTORM_ISCSI_CQ_SIZE_OFFSET(pfId) \ | 27 | #define CSTORM_ISCSI_CQ_SIZE_OFFSET(pfId) \ |
28 | (IRO[315].base + ((pfId) * IRO[315].m1)) | ||
29 | #define CSTORM_ISCSI_CQ_SQN_SIZE_OFFSET(pfId) \ | ||
30 | (IRO[316].base + ((pfId) * IRO[316].m1)) | 28 | (IRO[316].base + ((pfId) * IRO[316].m1)) |
29 | #define CSTORM_ISCSI_CQ_SQN_SIZE_OFFSET(pfId) \ | ||
30 | (IRO[317].base + ((pfId) * IRO[317].m1)) | ||
31 | #define CSTORM_ISCSI_EQ_CONS_OFFSET(pfId, iscsiEqId) \ | 31 | #define CSTORM_ISCSI_EQ_CONS_OFFSET(pfId, iscsiEqId) \ |
32 | (IRO[308].base + ((pfId) * IRO[308].m1) + ((iscsiEqId) * IRO[308].m2)) | 32 | (IRO[309].base + ((pfId) * IRO[309].m1) + ((iscsiEqId) * IRO[309].m2)) |
33 | #define CSTORM_ISCSI_EQ_NEXT_EQE_ADDR_OFFSET(pfId, iscsiEqId) \ | 33 | #define CSTORM_ISCSI_EQ_NEXT_EQE_ADDR_OFFSET(pfId, iscsiEqId) \ |
34 | (IRO[310].base + ((pfId) * IRO[310].m1) + ((iscsiEqId) * IRO[310].m2)) | 34 | (IRO[311].base + ((pfId) * IRO[311].m1) + ((iscsiEqId) * IRO[311].m2)) |
35 | #define CSTORM_ISCSI_EQ_NEXT_PAGE_ADDR_OFFSET(pfId, iscsiEqId) \ | 35 | #define CSTORM_ISCSI_EQ_NEXT_PAGE_ADDR_OFFSET(pfId, iscsiEqId) \ |
36 | (IRO[309].base + ((pfId) * IRO[309].m1) + ((iscsiEqId) * IRO[309].m2)) | 36 | (IRO[310].base + ((pfId) * IRO[310].m1) + ((iscsiEqId) * IRO[310].m2)) |
37 | #define CSTORM_ISCSI_EQ_NEXT_PAGE_ADDR_VALID_OFFSET(pfId, iscsiEqId) \ | 37 | #define CSTORM_ISCSI_EQ_NEXT_PAGE_ADDR_VALID_OFFSET(pfId, iscsiEqId) \ |
38 | (IRO[311].base + ((pfId) * IRO[311].m1) + ((iscsiEqId) * IRO[311].m2)) | 38 | (IRO[312].base + ((pfId) * IRO[312].m1) + ((iscsiEqId) * IRO[312].m2)) |
39 | #define CSTORM_ISCSI_EQ_PROD_OFFSET(pfId, iscsiEqId) \ | 39 | #define CSTORM_ISCSI_EQ_PROD_OFFSET(pfId, iscsiEqId) \ |
40 | (IRO[307].base + ((pfId) * IRO[307].m1) + ((iscsiEqId) * IRO[307].m2)) | 40 | (IRO[308].base + ((pfId) * IRO[308].m1) + ((iscsiEqId) * IRO[308].m2)) |
41 | #define CSTORM_ISCSI_EQ_SB_INDEX_OFFSET(pfId, iscsiEqId) \ | 41 | #define CSTORM_ISCSI_EQ_SB_INDEX_OFFSET(pfId, iscsiEqId) \ |
42 | (IRO[313].base + ((pfId) * IRO[313].m1) + ((iscsiEqId) * IRO[313].m2)) | 42 | (IRO[314].base + ((pfId) * IRO[314].m1) + ((iscsiEqId) * IRO[314].m2)) |
43 | #define CSTORM_ISCSI_EQ_SB_NUM_OFFSET(pfId, iscsiEqId) \ | 43 | #define CSTORM_ISCSI_EQ_SB_NUM_OFFSET(pfId, iscsiEqId) \ |
44 | (IRO[312].base + ((pfId) * IRO[312].m1) + ((iscsiEqId) * IRO[312].m2)) | 44 | (IRO[313].base + ((pfId) * IRO[313].m1) + ((iscsiEqId) * IRO[313].m2)) |
45 | #define CSTORM_ISCSI_HQ_SIZE_OFFSET(pfId) \ | 45 | #define CSTORM_ISCSI_HQ_SIZE_OFFSET(pfId) \ |
46 | (IRO[314].base + ((pfId) * IRO[314].m1)) | 46 | (IRO[315].base + ((pfId) * IRO[315].m1)) |
47 | #define CSTORM_ISCSI_NUM_OF_TASKS_OFFSET(pfId) \ | 47 | #define CSTORM_ISCSI_NUM_OF_TASKS_OFFSET(pfId) \ |
48 | (IRO[306].base + ((pfId) * IRO[306].m1)) | 48 | (IRO[307].base + ((pfId) * IRO[307].m1)) |
49 | #define CSTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(pfId) \ | 49 | #define CSTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(pfId) \ |
50 | (IRO[305].base + ((pfId) * IRO[305].m1)) | 50 | (IRO[306].base + ((pfId) * IRO[306].m1)) |
51 | #define CSTORM_ISCSI_PAGE_SIZE_OFFSET(pfId) \ | 51 | #define CSTORM_ISCSI_PAGE_SIZE_OFFSET(pfId) \ |
52 | (IRO[304].base + ((pfId) * IRO[304].m1)) | 52 | (IRO[305].base + ((pfId) * IRO[305].m1)) |
53 | #define CSTORM_RECORD_SLOW_PATH_OFFSET(funcId) \ | 53 | #define CSTORM_RECORD_SLOW_PATH_OFFSET(funcId) \ |
54 | (IRO[151].base + ((funcId) * IRO[151].m1)) | 54 | (IRO[151].base + ((funcId) * IRO[151].m1)) |
55 | #define CSTORM_SP_STATUS_BLOCK_DATA_OFFSET(pfId) \ | 55 | #define CSTORM_SP_STATUS_BLOCK_DATA_OFFSET(pfId) \ |
@@ -96,37 +96,37 @@ | |||
96 | #define TSTORM_FUNC_EN_OFFSET(funcId) \ | 96 | #define TSTORM_FUNC_EN_OFFSET(funcId) \ |
97 | (IRO[103].base + ((funcId) * IRO[103].m1)) | 97 | (IRO[103].base + ((funcId) * IRO[103].m1)) |
98 | #define TSTORM_ISCSI_ERROR_BITMAP_OFFSET(pfId) \ | 98 | #define TSTORM_ISCSI_ERROR_BITMAP_OFFSET(pfId) \ |
99 | (IRO[271].base + ((pfId) * IRO[271].m1)) | ||
100 | #define TSTORM_ISCSI_L2_ISCSI_OOO_CID_TABLE_OFFSET(pfId) \ | ||
101 | (IRO[272].base + ((pfId) * IRO[272].m1)) | 99 | (IRO[272].base + ((pfId) * IRO[272].m1)) |
102 | #define TSTORM_ISCSI_L2_ISCSI_OOO_CLIENT_ID_TABLE_OFFSET(pfId) \ | 100 | #define TSTORM_ISCSI_L2_ISCSI_OOO_CID_TABLE_OFFSET(pfId) \ |
103 | (IRO[273].base + ((pfId) * IRO[273].m1)) | 101 | (IRO[273].base + ((pfId) * IRO[273].m1)) |
104 | #define TSTORM_ISCSI_L2_ISCSI_OOO_PROD_OFFSET(pfId) \ | 102 | #define TSTORM_ISCSI_L2_ISCSI_OOO_CLIENT_ID_TABLE_OFFSET(pfId) \ |
105 | (IRO[274].base + ((pfId) * IRO[274].m1)) | 103 | (IRO[274].base + ((pfId) * IRO[274].m1)) |
104 | #define TSTORM_ISCSI_L2_ISCSI_OOO_PROD_OFFSET(pfId) \ | ||
105 | (IRO[275].base + ((pfId) * IRO[275].m1)) | ||
106 | #define TSTORM_ISCSI_NUM_OF_TASKS_OFFSET(pfId) \ | 106 | #define TSTORM_ISCSI_NUM_OF_TASKS_OFFSET(pfId) \ |
107 | (IRO[270].base + ((pfId) * IRO[270].m1)) | 107 | (IRO[271].base + ((pfId) * IRO[271].m1)) |
108 | #define TSTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(pfId) \ | 108 | #define TSTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(pfId) \ |
109 | (IRO[269].base + ((pfId) * IRO[269].m1)) | 109 | (IRO[270].base + ((pfId) * IRO[270].m1)) |
110 | #define TSTORM_ISCSI_PAGE_SIZE_OFFSET(pfId) \ | 110 | #define TSTORM_ISCSI_PAGE_SIZE_OFFSET(pfId) \ |
111 | (IRO[268].base + ((pfId) * IRO[268].m1)) | 111 | (IRO[269].base + ((pfId) * IRO[269].m1)) |
112 | #define TSTORM_ISCSI_RQ_SIZE_OFFSET(pfId) \ | 112 | #define TSTORM_ISCSI_RQ_SIZE_OFFSET(pfId) \ |
113 | (IRO[267].base + ((pfId) * IRO[267].m1)) | 113 | (IRO[268].base + ((pfId) * IRO[268].m1)) |
114 | #define TSTORM_ISCSI_TCP_LOCAL_ADV_WND_OFFSET(pfId) \ | 114 | #define TSTORM_ISCSI_TCP_LOCAL_ADV_WND_OFFSET(pfId) \ |
115 | (IRO[276].base + ((pfId) * IRO[276].m1)) | 115 | (IRO[277].base + ((pfId) * IRO[277].m1)) |
116 | #define TSTORM_ISCSI_TCP_VARS_FLAGS_OFFSET(pfId) \ | 116 | #define TSTORM_ISCSI_TCP_VARS_FLAGS_OFFSET(pfId) \ |
117 | (IRO[263].base + ((pfId) * IRO[263].m1)) | ||
118 | #define TSTORM_ISCSI_TCP_VARS_LSB_LOCAL_MAC_ADDR_OFFSET(pfId) \ | ||
119 | (IRO[264].base + ((pfId) * IRO[264].m1)) | 117 | (IRO[264].base + ((pfId) * IRO[264].m1)) |
120 | #define TSTORM_ISCSI_TCP_VARS_MID_LOCAL_MAC_ADDR_OFFSET(pfId) \ | 118 | #define TSTORM_ISCSI_TCP_VARS_LSB_LOCAL_MAC_ADDR_OFFSET(pfId) \ |
121 | (IRO[265].base + ((pfId) * IRO[265].m1)) | 119 | (IRO[265].base + ((pfId) * IRO[265].m1)) |
122 | #define TSTORM_ISCSI_TCP_VARS_MSB_LOCAL_MAC_ADDR_OFFSET(pfId) \ | 120 | #define TSTORM_ISCSI_TCP_VARS_MID_LOCAL_MAC_ADDR_OFFSET(pfId) \ |
123 | (IRO[266].base + ((pfId) * IRO[266].m1)) | 121 | (IRO[266].base + ((pfId) * IRO[266].m1)) |
122 | #define TSTORM_ISCSI_TCP_VARS_MSB_LOCAL_MAC_ADDR_OFFSET(pfId) \ | ||
123 | (IRO[267].base + ((pfId) * IRO[267].m1)) | ||
124 | #define TSTORM_MAC_FILTER_CONFIG_OFFSET(pfId) \ | 124 | #define TSTORM_MAC_FILTER_CONFIG_OFFSET(pfId) \ |
125 | (IRO[202].base + ((pfId) * IRO[202].m1)) | 125 | (IRO[202].base + ((pfId) * IRO[202].m1)) |
126 | #define TSTORM_RECORD_SLOW_PATH_OFFSET(funcId) \ | 126 | #define TSTORM_RECORD_SLOW_PATH_OFFSET(funcId) \ |
127 | (IRO[105].base + ((funcId) * IRO[105].m1)) | 127 | (IRO[105].base + ((funcId) * IRO[105].m1)) |
128 | #define TSTORM_TCP_MAX_CWND_OFFSET(pfId) \ | 128 | #define TSTORM_TCP_MAX_CWND_OFFSET(pfId) \ |
129 | (IRO[216].base + ((pfId) * IRO[216].m1)) | 129 | (IRO[217].base + ((pfId) * IRO[217].m1)) |
130 | #define TSTORM_VF_TO_PF_OFFSET(funcId) \ | 130 | #define TSTORM_VF_TO_PF_OFFSET(funcId) \ |
131 | (IRO[104].base + ((funcId) * IRO[104].m1)) | 131 | (IRO[104].base + ((funcId) * IRO[104].m1)) |
132 | #define USTORM_AGG_DATA_OFFSET (IRO[206].base) | 132 | #define USTORM_AGG_DATA_OFFSET (IRO[206].base) |
@@ -140,29 +140,29 @@ | |||
140 | #define USTORM_ETH_PAUSE_ENABLED_OFFSET(portId) \ | 140 | #define USTORM_ETH_PAUSE_ENABLED_OFFSET(portId) \ |
141 | (IRO[183].base + ((portId) * IRO[183].m1)) | 141 | (IRO[183].base + ((portId) * IRO[183].m1)) |
142 | #define USTORM_FCOE_EQ_PROD_OFFSET(pfId) \ | 142 | #define USTORM_FCOE_EQ_PROD_OFFSET(pfId) \ |
143 | (IRO[317].base + ((pfId) * IRO[317].m1)) | 143 | (IRO[318].base + ((pfId) * IRO[318].m1)) |
144 | #define USTORM_FUNC_EN_OFFSET(funcId) \ | 144 | #define USTORM_FUNC_EN_OFFSET(funcId) \ |
145 | (IRO[178].base + ((funcId) * IRO[178].m1)) | 145 | (IRO[178].base + ((funcId) * IRO[178].m1)) |
146 | #define USTORM_ISCSI_CQ_SIZE_OFFSET(pfId) \ | 146 | #define USTORM_ISCSI_CQ_SIZE_OFFSET(pfId) \ |
147 | (IRO[281].base + ((pfId) * IRO[281].m1)) | ||
148 | #define USTORM_ISCSI_CQ_SQN_SIZE_OFFSET(pfId) \ | ||
149 | (IRO[282].base + ((pfId) * IRO[282].m1)) | 147 | (IRO[282].base + ((pfId) * IRO[282].m1)) |
148 | #define USTORM_ISCSI_CQ_SQN_SIZE_OFFSET(pfId) \ | ||
149 | (IRO[283].base + ((pfId) * IRO[283].m1)) | ||
150 | #define USTORM_ISCSI_ERROR_BITMAP_OFFSET(pfId) \ | 150 | #define USTORM_ISCSI_ERROR_BITMAP_OFFSET(pfId) \ |
151 | (IRO[286].base + ((pfId) * IRO[286].m1)) | 151 | (IRO[287].base + ((pfId) * IRO[287].m1)) |
152 | #define USTORM_ISCSI_GLOBAL_BUF_PHYS_ADDR_OFFSET(pfId) \ | 152 | #define USTORM_ISCSI_GLOBAL_BUF_PHYS_ADDR_OFFSET(pfId) \ |
153 | (IRO[283].base + ((pfId) * IRO[283].m1)) | 153 | (IRO[284].base + ((pfId) * IRO[284].m1)) |
154 | #define USTORM_ISCSI_NUM_OF_TASKS_OFFSET(pfId) \ | 154 | #define USTORM_ISCSI_NUM_OF_TASKS_OFFSET(pfId) \ |
155 | (IRO[279].base + ((pfId) * IRO[279].m1)) | 155 | (IRO[280].base + ((pfId) * IRO[280].m1)) |
156 | #define USTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(pfId) \ | 156 | #define USTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(pfId) \ |
157 | (IRO[278].base + ((pfId) * IRO[278].m1)) | 157 | (IRO[279].base + ((pfId) * IRO[279].m1)) |
158 | #define USTORM_ISCSI_PAGE_SIZE_OFFSET(pfId) \ | 158 | #define USTORM_ISCSI_PAGE_SIZE_OFFSET(pfId) \ |
159 | (IRO[277].base + ((pfId) * IRO[277].m1)) | 159 | (IRO[278].base + ((pfId) * IRO[278].m1)) |
160 | #define USTORM_ISCSI_R2TQ_SIZE_OFFSET(pfId) \ | 160 | #define USTORM_ISCSI_R2TQ_SIZE_OFFSET(pfId) \ |
161 | (IRO[280].base + ((pfId) * IRO[280].m1)) | 161 | (IRO[281].base + ((pfId) * IRO[281].m1)) |
162 | #define USTORM_ISCSI_RQ_BUFFER_SIZE_OFFSET(pfId) \ | 162 | #define USTORM_ISCSI_RQ_BUFFER_SIZE_OFFSET(pfId) \ |
163 | (IRO[284].base + ((pfId) * IRO[284].m1)) | ||
164 | #define USTORM_ISCSI_RQ_SIZE_OFFSET(pfId) \ | ||
165 | (IRO[285].base + ((pfId) * IRO[285].m1)) | 163 | (IRO[285].base + ((pfId) * IRO[285].m1)) |
164 | #define USTORM_ISCSI_RQ_SIZE_OFFSET(pfId) \ | ||
165 | (IRO[286].base + ((pfId) * IRO[286].m1)) | ||
166 | #define USTORM_MEM_WORKAROUND_ADDRESS_OFFSET(pfId) \ | 166 | #define USTORM_MEM_WORKAROUND_ADDRESS_OFFSET(pfId) \ |
167 | (IRO[182].base + ((pfId) * IRO[182].m1)) | 167 | (IRO[182].base + ((pfId) * IRO[182].m1)) |
168 | #define USTORM_RECORD_SLOW_PATH_OFFSET(funcId) \ | 168 | #define USTORM_RECORD_SLOW_PATH_OFFSET(funcId) \ |
@@ -188,39 +188,39 @@ | |||
188 | #define XSTORM_FUNC_EN_OFFSET(funcId) \ | 188 | #define XSTORM_FUNC_EN_OFFSET(funcId) \ |
189 | (IRO[47].base + ((funcId) * IRO[47].m1)) | 189 | (IRO[47].base + ((funcId) * IRO[47].m1)) |
190 | #define XSTORM_ISCSI_HQ_SIZE_OFFSET(pfId) \ | 190 | #define XSTORM_ISCSI_HQ_SIZE_OFFSET(pfId) \ |
191 | (IRO[294].base + ((pfId) * IRO[294].m1)) | 191 | (IRO[295].base + ((pfId) * IRO[295].m1)) |
192 | #define XSTORM_ISCSI_LOCAL_MAC_ADDR0_OFFSET(pfId) \ | 192 | #define XSTORM_ISCSI_LOCAL_MAC_ADDR0_OFFSET(pfId) \ |
193 | (IRO[297].base + ((pfId) * IRO[297].m1)) | ||
194 | #define XSTORM_ISCSI_LOCAL_MAC_ADDR1_OFFSET(pfId) \ | ||
195 | (IRO[298].base + ((pfId) * IRO[298].m1)) | 193 | (IRO[298].base + ((pfId) * IRO[298].m1)) |
196 | #define XSTORM_ISCSI_LOCAL_MAC_ADDR2_OFFSET(pfId) \ | 194 | #define XSTORM_ISCSI_LOCAL_MAC_ADDR1_OFFSET(pfId) \ |
197 | (IRO[299].base + ((pfId) * IRO[299].m1)) | 195 | (IRO[299].base + ((pfId) * IRO[299].m1)) |
198 | #define XSTORM_ISCSI_LOCAL_MAC_ADDR3_OFFSET(pfId) \ | 196 | #define XSTORM_ISCSI_LOCAL_MAC_ADDR2_OFFSET(pfId) \ |
199 | (IRO[300].base + ((pfId) * IRO[300].m1)) | 197 | (IRO[300].base + ((pfId) * IRO[300].m1)) |
200 | #define XSTORM_ISCSI_LOCAL_MAC_ADDR4_OFFSET(pfId) \ | 198 | #define XSTORM_ISCSI_LOCAL_MAC_ADDR3_OFFSET(pfId) \ |
201 | (IRO[301].base + ((pfId) * IRO[301].m1)) | 199 | (IRO[301].base + ((pfId) * IRO[301].m1)) |
202 | #define XSTORM_ISCSI_LOCAL_MAC_ADDR5_OFFSET(pfId) \ | 200 | #define XSTORM_ISCSI_LOCAL_MAC_ADDR4_OFFSET(pfId) \ |
203 | (IRO[302].base + ((pfId) * IRO[302].m1)) | 201 | (IRO[302].base + ((pfId) * IRO[302].m1)) |
204 | #define XSTORM_ISCSI_LOCAL_VLAN_OFFSET(pfId) \ | 202 | #define XSTORM_ISCSI_LOCAL_MAC_ADDR5_OFFSET(pfId) \ |
205 | (IRO[303].base + ((pfId) * IRO[303].m1)) | 203 | (IRO[303].base + ((pfId) * IRO[303].m1)) |
204 | #define XSTORM_ISCSI_LOCAL_VLAN_OFFSET(pfId) \ | ||
205 | (IRO[304].base + ((pfId) * IRO[304].m1)) | ||
206 | #define XSTORM_ISCSI_NUM_OF_TASKS_OFFSET(pfId) \ | 206 | #define XSTORM_ISCSI_NUM_OF_TASKS_OFFSET(pfId) \ |
207 | (IRO[293].base + ((pfId) * IRO[293].m1)) | 207 | (IRO[294].base + ((pfId) * IRO[294].m1)) |
208 | #define XSTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(pfId) \ | 208 | #define XSTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(pfId) \ |
209 | (IRO[292].base + ((pfId) * IRO[292].m1)) | 209 | (IRO[293].base + ((pfId) * IRO[293].m1)) |
210 | #define XSTORM_ISCSI_PAGE_SIZE_OFFSET(pfId) \ | 210 | #define XSTORM_ISCSI_PAGE_SIZE_OFFSET(pfId) \ |
211 | (IRO[291].base + ((pfId) * IRO[291].m1)) | 211 | (IRO[292].base + ((pfId) * IRO[292].m1)) |
212 | #define XSTORM_ISCSI_R2TQ_SIZE_OFFSET(pfId) \ | 212 | #define XSTORM_ISCSI_R2TQ_SIZE_OFFSET(pfId) \ |
213 | (IRO[296].base + ((pfId) * IRO[296].m1)) | 213 | (IRO[297].base + ((pfId) * IRO[297].m1)) |
214 | #define XSTORM_ISCSI_SQ_SIZE_OFFSET(pfId) \ | 214 | #define XSTORM_ISCSI_SQ_SIZE_OFFSET(pfId) \ |
215 | (IRO[295].base + ((pfId) * IRO[295].m1)) | 215 | (IRO[296].base + ((pfId) * IRO[296].m1)) |
216 | #define XSTORM_ISCSI_TCP_VARS_ADV_WND_SCL_OFFSET(pfId) \ | 216 | #define XSTORM_ISCSI_TCP_VARS_ADV_WND_SCL_OFFSET(pfId) \ |
217 | (IRO[290].base + ((pfId) * IRO[290].m1)) | 217 | (IRO[291].base + ((pfId) * IRO[291].m1)) |
218 | #define XSTORM_ISCSI_TCP_VARS_FLAGS_OFFSET(pfId) \ | 218 | #define XSTORM_ISCSI_TCP_VARS_FLAGS_OFFSET(pfId) \ |
219 | (IRO[289].base + ((pfId) * IRO[289].m1)) | 219 | (IRO[290].base + ((pfId) * IRO[290].m1)) |
220 | #define XSTORM_ISCSI_TCP_VARS_TOS_OFFSET(pfId) \ | 220 | #define XSTORM_ISCSI_TCP_VARS_TOS_OFFSET(pfId) \ |
221 | (IRO[288].base + ((pfId) * IRO[288].m1)) | 221 | (IRO[289].base + ((pfId) * IRO[289].m1)) |
222 | #define XSTORM_ISCSI_TCP_VARS_TTL_OFFSET(pfId) \ | 222 | #define XSTORM_ISCSI_TCP_VARS_TTL_OFFSET(pfId) \ |
223 | (IRO[287].base + ((pfId) * IRO[287].m1)) | 223 | (IRO[288].base + ((pfId) * IRO[288].m1)) |
224 | #define XSTORM_RATE_SHAPING_PER_VN_VARS_OFFSET(pfId) \ | 224 | #define XSTORM_RATE_SHAPING_PER_VN_VARS_OFFSET(pfId) \ |
225 | (IRO[44].base + ((pfId) * IRO[44].m1)) | 225 | (IRO[44].base + ((pfId) * IRO[44].m1)) |
226 | #define XSTORM_RECORD_SLOW_PATH_OFFSET(funcId) \ | 226 | #define XSTORM_RECORD_SLOW_PATH_OFFSET(funcId) \ |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c index efa557b76ac7..ad95324dc042 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c | |||
@@ -1371,7 +1371,14 @@ static void bnx2x_update_pfc_xmac(struct link_params *params, | |||
1371 | pfc1_val |= XMAC_PFC_CTRL_HI_REG_PFC_REFRESH_EN | | 1371 | pfc1_val |= XMAC_PFC_CTRL_HI_REG_PFC_REFRESH_EN | |
1372 | XMAC_PFC_CTRL_HI_REG_PFC_STATS_EN | | 1372 | XMAC_PFC_CTRL_HI_REG_PFC_STATS_EN | |
1373 | XMAC_PFC_CTRL_HI_REG_RX_PFC_EN | | 1373 | XMAC_PFC_CTRL_HI_REG_RX_PFC_EN | |
1374 | XMAC_PFC_CTRL_HI_REG_TX_PFC_EN; | 1374 | XMAC_PFC_CTRL_HI_REG_TX_PFC_EN | |
1375 | XMAC_PFC_CTRL_HI_REG_FORCE_PFC_XON; | ||
1376 | /* Write pause and PFC registers */ | ||
1377 | REG_WR(bp, xmac_base + XMAC_REG_PAUSE_CTRL, pause_val); | ||
1378 | REG_WR(bp, xmac_base + XMAC_REG_PFC_CTRL, pfc0_val); | ||
1379 | REG_WR(bp, xmac_base + XMAC_REG_PFC_CTRL_HI, pfc1_val); | ||
1380 | pfc1_val &= ~XMAC_PFC_CTRL_HI_REG_FORCE_PFC_XON; | ||
1381 | |||
1375 | } | 1382 | } |
1376 | 1383 | ||
1377 | /* Write pause and PFC registers */ | 1384 | /* Write pause and PFC registers */ |
@@ -3648,6 +3655,33 @@ static void bnx2x_ext_phy_update_adv_fc(struct bnx2x_phy *phy, | |||
3648 | if (phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM54618SE) { | 3655 | if (phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM54618SE) { |
3649 | bnx2x_cl22_read(bp, phy, 0x4, &ld_pause); | 3656 | bnx2x_cl22_read(bp, phy, 0x4, &ld_pause); |
3650 | bnx2x_cl22_read(bp, phy, 0x5, &lp_pause); | 3657 | bnx2x_cl22_read(bp, phy, 0x5, &lp_pause); |
3658 | } else if (CHIP_IS_E3(bp) && | ||
3659 | SINGLE_MEDIA_DIRECT(params)) { | ||
3660 | u8 lane = bnx2x_get_warpcore_lane(phy, params); | ||
3661 | u16 gp_status, gp_mask; | ||
3662 | bnx2x_cl45_read(bp, phy, | ||
3663 | MDIO_AN_DEVAD, MDIO_WC_REG_GP2_STATUS_GP_2_4, | ||
3664 | &gp_status); | ||
3665 | gp_mask = (MDIO_WC_REG_GP2_STATUS_GP_2_4_CL73_AN_CMPL | | ||
3666 | MDIO_WC_REG_GP2_STATUS_GP_2_4_CL37_LP_AN_CAP) << | ||
3667 | lane; | ||
3668 | if ((gp_status & gp_mask) == gp_mask) { | ||
3669 | bnx2x_cl45_read(bp, phy, MDIO_AN_DEVAD, | ||
3670 | MDIO_AN_REG_ADV_PAUSE, &ld_pause); | ||
3671 | bnx2x_cl45_read(bp, phy, MDIO_AN_DEVAD, | ||
3672 | MDIO_AN_REG_LP_AUTO_NEG, &lp_pause); | ||
3673 | } else { | ||
3674 | bnx2x_cl45_read(bp, phy, MDIO_AN_DEVAD, | ||
3675 | MDIO_AN_REG_CL37_FC_LD, &ld_pause); | ||
3676 | bnx2x_cl45_read(bp, phy, MDIO_AN_DEVAD, | ||
3677 | MDIO_AN_REG_CL37_FC_LP, &lp_pause); | ||
3678 | ld_pause = ((ld_pause & | ||
3679 | MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_BOTH) | ||
3680 | << 3); | ||
3681 | lp_pause = ((lp_pause & | ||
3682 | MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_BOTH) | ||
3683 | << 3); | ||
3684 | } | ||
3651 | } else { | 3685 | } else { |
3652 | bnx2x_cl45_read(bp, phy, | 3686 | bnx2x_cl45_read(bp, phy, |
3653 | MDIO_AN_DEVAD, | 3687 | MDIO_AN_DEVAD, |
@@ -3698,7 +3732,23 @@ static void bnx2x_warpcore_enable_AN_KR(struct bnx2x_phy *phy, | |||
3698 | u16 val16 = 0, lane, bam37 = 0; | 3732 | u16 val16 = 0, lane, bam37 = 0; |
3699 | struct bnx2x *bp = params->bp; | 3733 | struct bnx2x *bp = params->bp; |
3700 | DP(NETIF_MSG_LINK, "Enable Auto Negotiation for KR\n"); | 3734 | DP(NETIF_MSG_LINK, "Enable Auto Negotiation for KR\n"); |
3701 | 3735 | /* Set to default registers that may be overriden by 10G force */ | |
3736 | bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, | ||
3737 | MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X2, 0x7); | ||
3738 | bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, | ||
3739 | MDIO_WC_REG_PAR_DET_10G_CTRL, 0); | ||
3740 | bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, | ||
3741 | MDIO_WC_REG_CL72_USERB0_CL72_MISC1_CONTROL, 0); | ||
3742 | bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, | ||
3743 | MDIO_WC_REG_XGXSBLK1_LANECTRL0, 0xff); | ||
3744 | bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, | ||
3745 | MDIO_WC_REG_XGXSBLK1_LANECTRL1, 0x5555); | ||
3746 | bnx2x_cl45_write(bp, phy, MDIO_PMA_DEVAD, | ||
3747 | MDIO_WC_REG_IEEE0BLK_AUTONEGNP, 0x0); | ||
3748 | bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, | ||
3749 | MDIO_WC_REG_RX66_CONTROL, 0x7415); | ||
3750 | bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, | ||
3751 | MDIO_WC_REG_SERDESDIGITAL_MISC2, 0x6190); | ||
3702 | /* Disable Autoneg: re-enable it after adv is done. */ | 3752 | /* Disable Autoneg: re-enable it after adv is done. */ |
3703 | bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, | 3753 | bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, |
3704 | MDIO_WC_REG_IEEE0BLK_MIICNTL, 0); | 3754 | MDIO_WC_REG_IEEE0BLK_MIICNTL, 0); |
@@ -3944,13 +3994,13 @@ static void bnx2x_warpcore_set_10G_XFI(struct bnx2x_phy *phy, | |||
3944 | 3994 | ||
3945 | } else { | 3995 | } else { |
3946 | misc1_val |= 0x9; | 3996 | misc1_val |= 0x9; |
3947 | tap_val = ((0x12 << MDIO_WC_REG_TX_FIR_TAP_POST_TAP_OFFSET) | | 3997 | tap_val = ((0x0f << MDIO_WC_REG_TX_FIR_TAP_POST_TAP_OFFSET) | |
3948 | (0x2d << MDIO_WC_REG_TX_FIR_TAP_MAIN_TAP_OFFSET) | | 3998 | (0x2b << MDIO_WC_REG_TX_FIR_TAP_MAIN_TAP_OFFSET) | |
3949 | (0x00 << MDIO_WC_REG_TX_FIR_TAP_PRE_TAP_OFFSET)); | 3999 | (0x02 << MDIO_WC_REG_TX_FIR_TAP_PRE_TAP_OFFSET)); |
3950 | tx_driver_val = | 4000 | tx_driver_val = |
3951 | ((0x02 << MDIO_WC_REG_TX0_TX_DRIVER_POST2_COEFF_OFFSET) | | 4001 | ((0x03 << MDIO_WC_REG_TX0_TX_DRIVER_POST2_COEFF_OFFSET) | |
3952 | (0x02 << MDIO_WC_REG_TX0_TX_DRIVER_IDRIVER_OFFSET) | | 4002 | (0x02 << MDIO_WC_REG_TX0_TX_DRIVER_IDRIVER_OFFSET) | |
3953 | (0x02 << MDIO_WC_REG_TX0_TX_DRIVER_IPRE_DRIVER_OFFSET)); | 4003 | (0x06 << MDIO_WC_REG_TX0_TX_DRIVER_IPRE_DRIVER_OFFSET)); |
3954 | } | 4004 | } |
3955 | bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, | 4005 | bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, |
3956 | MDIO_WC_REG_SERDESDIGITAL_MISC1, misc1_val); | 4006 | MDIO_WC_REG_SERDESDIGITAL_MISC1, misc1_val); |
@@ -4368,7 +4418,7 @@ static void bnx2x_warpcore_config_init(struct bnx2x_phy *phy, | |||
4368 | switch (serdes_net_if) { | 4418 | switch (serdes_net_if) { |
4369 | case PORT_HW_CFG_NET_SERDES_IF_KR: | 4419 | case PORT_HW_CFG_NET_SERDES_IF_KR: |
4370 | /* Enable KR Auto Neg */ | 4420 | /* Enable KR Auto Neg */ |
4371 | if (params->loopback_mode == LOOPBACK_NONE) | 4421 | if (params->loopback_mode != LOOPBACK_EXT) |
4372 | bnx2x_warpcore_enable_AN_KR(phy, params, vars); | 4422 | bnx2x_warpcore_enable_AN_KR(phy, params, vars); |
4373 | else { | 4423 | else { |
4374 | DP(NETIF_MSG_LINK, "Setting KR 10G-Force\n"); | 4424 | DP(NETIF_MSG_LINK, "Setting KR 10G-Force\n"); |
@@ -6166,12 +6216,14 @@ int bnx2x_set_led(struct link_params *params, | |||
6166 | 6216 | ||
6167 | tmp = EMAC_RD(bp, EMAC_REG_EMAC_LED); | 6217 | tmp = EMAC_RD(bp, EMAC_REG_EMAC_LED); |
6168 | if (params->phy[EXT_PHY1].type == | 6218 | if (params->phy[EXT_PHY1].type == |
6169 | PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM54618SE) | 6219 | PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM54618SE) |
6170 | EMAC_WR(bp, EMAC_REG_EMAC_LED, tmp & 0xfff1); | 6220 | tmp &= ~(EMAC_LED_1000MB_OVERRIDE | |
6171 | else { | 6221 | EMAC_LED_100MB_OVERRIDE | |
6172 | EMAC_WR(bp, EMAC_REG_EMAC_LED, | 6222 | EMAC_LED_10MB_OVERRIDE); |
6173 | (tmp | EMAC_LED_OVERRIDE)); | 6223 | else |
6174 | } | 6224 | tmp |= EMAC_LED_OVERRIDE; |
6225 | |||
6226 | EMAC_WR(bp, EMAC_REG_EMAC_LED, tmp); | ||
6175 | break; | 6227 | break; |
6176 | 6228 | ||
6177 | case LED_MODE_OPER: | 6229 | case LED_MODE_OPER: |
@@ -6226,10 +6278,15 @@ int bnx2x_set_led(struct link_params *params, | |||
6226 | hw_led_mode); | 6278 | hw_led_mode); |
6227 | } else if ((params->phy[EXT_PHY1].type == | 6279 | } else if ((params->phy[EXT_PHY1].type == |
6228 | PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM54618SE) && | 6280 | PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM54618SE) && |
6229 | (mode != LED_MODE_OPER)) { | 6281 | (mode == LED_MODE_ON)) { |
6230 | REG_WR(bp, NIG_REG_LED_MODE_P0 + port*4, 0); | 6282 | REG_WR(bp, NIG_REG_LED_MODE_P0 + port*4, 0); |
6231 | tmp = EMAC_RD(bp, EMAC_REG_EMAC_LED); | 6283 | tmp = EMAC_RD(bp, EMAC_REG_EMAC_LED); |
6232 | EMAC_WR(bp, EMAC_REG_EMAC_LED, tmp | 0x3); | 6284 | EMAC_WR(bp, EMAC_REG_EMAC_LED, tmp | |
6285 | EMAC_LED_OVERRIDE | EMAC_LED_1000MB_OVERRIDE); | ||
6286 | /* Break here; otherwise, it'll disable the | ||
6287 | * intended override. | ||
6288 | */ | ||
6289 | break; | ||
6233 | } else | 6290 | } else |
6234 | REG_WR(bp, NIG_REG_LED_MODE_P0 + port*4, | 6291 | REG_WR(bp, NIG_REG_LED_MODE_P0 + port*4, |
6235 | hw_led_mode); | 6292 | hw_led_mode); |
@@ -6244,13 +6301,9 @@ int bnx2x_set_led(struct link_params *params, | |||
6244 | LED_BLINK_RATE_VAL_E1X_E2); | 6301 | LED_BLINK_RATE_VAL_E1X_E2); |
6245 | REG_WR(bp, NIG_REG_LED_CONTROL_BLINK_RATE_ENA_P0 + | 6302 | REG_WR(bp, NIG_REG_LED_CONTROL_BLINK_RATE_ENA_P0 + |
6246 | port*4, 1); | 6303 | port*4, 1); |
6247 | if ((params->phy[EXT_PHY1].type != | 6304 | tmp = EMAC_RD(bp, EMAC_REG_EMAC_LED); |
6248 | PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM54618SE) && | 6305 | EMAC_WR(bp, EMAC_REG_EMAC_LED, |
6249 | (mode != LED_MODE_OPER)) { | 6306 | (tmp & (~EMAC_LED_OVERRIDE))); |
6250 | tmp = EMAC_RD(bp, EMAC_REG_EMAC_LED); | ||
6251 | EMAC_WR(bp, EMAC_REG_EMAC_LED, | ||
6252 | (tmp & (~EMAC_LED_OVERRIDE))); | ||
6253 | } | ||
6254 | 6307 | ||
6255 | if (CHIP_IS_E1(bp) && | 6308 | if (CHIP_IS_E1(bp) && |
6256 | ((speed == SPEED_2500) || | 6309 | ((speed == SPEED_2500) || |
@@ -6843,6 +6896,12 @@ int bnx2x_link_update(struct link_params *params, struct link_vars *vars) | |||
6843 | SINGLE_MEDIA_DIRECT(params)) && | 6896 | SINGLE_MEDIA_DIRECT(params)) && |
6844 | (phy_vars[active_external_phy].fault_detected == 0)); | 6897 | (phy_vars[active_external_phy].fault_detected == 0)); |
6845 | 6898 | ||
6899 | /* Update the PFC configuration in case it was changed */ | ||
6900 | if (params->feature_config_flags & FEATURE_CONFIG_PFC_ENABLED) | ||
6901 | vars->link_status |= LINK_STATUS_PFC_ENABLED; | ||
6902 | else | ||
6903 | vars->link_status &= ~LINK_STATUS_PFC_ENABLED; | ||
6904 | |||
6846 | if (vars->link_up) | 6905 | if (vars->link_up) |
6847 | rc = bnx2x_update_link_up(params, vars, link_10g_plus); | 6906 | rc = bnx2x_update_link_up(params, vars, link_10g_plus); |
6848 | else | 6907 | else |
@@ -8030,7 +8089,9 @@ static int bnx2x_verify_sfp_module(struct bnx2x_phy *phy, | |||
8030 | netdev_err(bp->dev, "Warning: Unqualified SFP+ module detected," | 8089 | netdev_err(bp->dev, "Warning: Unqualified SFP+ module detected," |
8031 | " Port %d from %s part number %s\n", | 8090 | " Port %d from %s part number %s\n", |
8032 | params->port, vendor_name, vendor_pn); | 8091 | params->port, vendor_name, vendor_pn); |
8033 | phy->flags |= FLAGS_SFP_NOT_APPROVED; | 8092 | if ((val & PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_MASK) != |
8093 | PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_WARNING_MSG) | ||
8094 | phy->flags |= FLAGS_SFP_NOT_APPROVED; | ||
8034 | return -EINVAL; | 8095 | return -EINVAL; |
8035 | } | 8096 | } |
8036 | 8097 | ||
@@ -9090,6 +9151,12 @@ static int bnx2x_8727_config_init(struct bnx2x_phy *phy, | |||
9090 | tmp2 &= 0xFFEF; | 9151 | tmp2 &= 0xFFEF; |
9091 | bnx2x_cl45_write(bp, phy, | 9152 | bnx2x_cl45_write(bp, phy, |
9092 | MDIO_PMA_DEVAD, MDIO_PMA_REG_8727_OPT_CFG_REG, tmp2); | 9153 | MDIO_PMA_DEVAD, MDIO_PMA_REG_8727_OPT_CFG_REG, tmp2); |
9154 | bnx2x_cl45_read(bp, phy, | ||
9155 | MDIO_PMA_DEVAD, MDIO_PMA_REG_PHY_IDENTIFIER, | ||
9156 | &tmp2); | ||
9157 | bnx2x_cl45_write(bp, phy, | ||
9158 | MDIO_PMA_DEVAD, MDIO_PMA_REG_PHY_IDENTIFIER, | ||
9159 | (tmp2 & 0x7fff)); | ||
9093 | } | 9160 | } |
9094 | 9161 | ||
9095 | return 0; | 9162 | return 0; |
@@ -9270,12 +9337,11 @@ static u8 bnx2x_8727_read_status(struct bnx2x_phy *phy, | |||
9270 | MDIO_PMA_DEVAD, MDIO_PMA_LASI_RXCTRL, | 9337 | MDIO_PMA_DEVAD, MDIO_PMA_LASI_RXCTRL, |
9271 | ((1<<5) | (1<<2))); | 9338 | ((1<<5) | (1<<2))); |
9272 | } | 9339 | } |
9273 | DP(NETIF_MSG_LINK, "Enabling 8727 TX laser if SFP is approved\n"); | 9340 | |
9274 | bnx2x_8727_specific_func(phy, params, ENABLE_TX); | 9341 | if (!(phy->flags & FLAGS_SFP_NOT_APPROVED)) { |
9275 | /* If transmitter is disabled, ignore false link up indication */ | 9342 | DP(NETIF_MSG_LINK, "Enabling 8727 TX laser\n"); |
9276 | bnx2x_cl45_read(bp, phy, | 9343 | bnx2x_sfp_set_transmitter(params, phy, 1); |
9277 | MDIO_PMA_DEVAD, MDIO_PMA_REG_PHY_IDENTIFIER, &val1); | 9344 | } else { |
9278 | if (val1 & (1<<15)) { | ||
9279 | DP(NETIF_MSG_LINK, "Tx is disabled\n"); | 9345 | DP(NETIF_MSG_LINK, "Tx is disabled\n"); |
9280 | return 0; | 9346 | return 0; |
9281 | } | 9347 | } |
@@ -9369,8 +9435,7 @@ static void bnx2x_save_848xx_spirom_version(struct bnx2x_phy *phy, | |||
9369 | 9435 | ||
9370 | if (phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84833) { | 9436 | if (phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84833) { |
9371 | bnx2x_cl45_read(bp, phy, MDIO_CTL_DEVAD, 0x400f, &fw_ver1); | 9437 | bnx2x_cl45_read(bp, phy, MDIO_CTL_DEVAD, 0x400f, &fw_ver1); |
9372 | bnx2x_save_spirom_version(bp, port, | 9438 | bnx2x_save_spirom_version(bp, port, fw_ver1 & 0xfff, |
9373 | ((fw_ver1 & 0xf000)>>5) | (fw_ver1 & 0x7f), | ||
9374 | phy->ver_addr); | 9439 | phy->ver_addr); |
9375 | } else { | 9440 | } else { |
9376 | /* For 32-bit registers in 848xx, access via MDIO2ARM i/f. */ | 9441 | /* For 32-bit registers in 848xx, access via MDIO2ARM i/f. */ |
@@ -9793,6 +9858,15 @@ static int bnx2x_84833_hw_reset_phy(struct bnx2x_phy *phy, | |||
9793 | other_shmem_base_addr)); | 9858 | other_shmem_base_addr)); |
9794 | 9859 | ||
9795 | u32 shmem_base_path[2]; | 9860 | u32 shmem_base_path[2]; |
9861 | |||
9862 | /* Work around for 84833 LED failure inside RESET status */ | ||
9863 | bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, | ||
9864 | MDIO_AN_REG_8481_LEGACY_MII_CTRL, | ||
9865 | MDIO_AN_REG_8481_MII_CTRL_FORCE_1G); | ||
9866 | bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, | ||
9867 | MDIO_AN_REG_8481_1G_100T_EXT_CTRL, | ||
9868 | MIDO_AN_REG_8481_EXT_CTRL_FORCE_LEDS_OFF); | ||
9869 | |||
9796 | shmem_base_path[0] = params->shmem_base; | 9870 | shmem_base_path[0] = params->shmem_base; |
9797 | shmem_base_path[1] = other_shmem_base_addr; | 9871 | shmem_base_path[1] = other_shmem_base_addr; |
9798 | 9872 | ||
@@ -10103,7 +10177,7 @@ static void bnx2x_848x3_link_reset(struct bnx2x_phy *phy, | |||
10103 | u8 port; | 10177 | u8 port; |
10104 | u16 val16; | 10178 | u16 val16; |
10105 | 10179 | ||
10106 | if (!(CHIP_IS_E1(bp))) | 10180 | if (!(CHIP_IS_E1x(bp))) |
10107 | port = BP_PATH(bp); | 10181 | port = BP_PATH(bp); |
10108 | else | 10182 | else |
10109 | port = params->port; | 10183 | port = params->port; |
@@ -10130,7 +10204,7 @@ static void bnx2x_848xx_set_link_led(struct bnx2x_phy *phy, | |||
10130 | u16 val; | 10204 | u16 val; |
10131 | u8 port; | 10205 | u8 port; |
10132 | 10206 | ||
10133 | if (!(CHIP_IS_E1(bp))) | 10207 | if (!(CHIP_IS_E1x(bp))) |
10134 | port = BP_PATH(bp); | 10208 | port = BP_PATH(bp); |
10135 | else | 10209 | else |
10136 | port = params->port; | 10210 | port = params->port; |
@@ -12049,6 +12123,9 @@ int bnx2x_phy_init(struct link_params *params, struct link_vars *vars) | |||
12049 | 12123 | ||
12050 | bnx2x_emac_init(params, vars); | 12124 | bnx2x_emac_init(params, vars); |
12051 | 12125 | ||
12126 | if (params->feature_config_flags & FEATURE_CONFIG_PFC_ENABLED) | ||
12127 | vars->link_status |= LINK_STATUS_PFC_ENABLED; | ||
12128 | |||
12052 | if (params->num_phys == 0) { | 12129 | if (params->num_phys == 0) { |
12053 | DP(NETIF_MSG_LINK, "No phy found for initialization !!\n"); | 12130 | DP(NETIF_MSG_LINK, "No phy found for initialization !!\n"); |
12054 | return -EINVAL; | 12131 | return -EINVAL; |
@@ -12128,10 +12205,10 @@ int bnx2x_link_reset(struct link_params *params, struct link_vars *vars, | |||
12128 | * Hold it as vars low | 12205 | * Hold it as vars low |
12129 | */ | 12206 | */ |
12130 | /* clear link led */ | 12207 | /* clear link led */ |
12208 | bnx2x_set_mdio_clk(bp, params->chip_id, port); | ||
12131 | bnx2x_set_led(params, vars, LED_MODE_OFF, 0); | 12209 | bnx2x_set_led(params, vars, LED_MODE_OFF, 0); |
12132 | 12210 | ||
12133 | if (reset_ext_phy) { | 12211 | if (reset_ext_phy) { |
12134 | bnx2x_set_mdio_clk(bp, params->chip_id, port); | ||
12135 | for (phy_index = EXT_PHY1; phy_index < params->num_phys; | 12212 | for (phy_index = EXT_PHY1; phy_index < params->num_phys; |
12136 | phy_index++) { | 12213 | phy_index++) { |
12137 | if (params->phy[phy_index].link_reset) { | 12214 | if (params->phy[phy_index].link_reset) { |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h index ab0a250f95fa..c25803b9c0ca 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h | |||
@@ -5354,6 +5354,7 @@ | |||
5354 | #define XMAC_CTRL_REG_TX_EN (0x1<<0) | 5354 | #define XMAC_CTRL_REG_TX_EN (0x1<<0) |
5355 | #define XMAC_PAUSE_CTRL_REG_RX_PAUSE_EN (0x1<<18) | 5355 | #define XMAC_PAUSE_CTRL_REG_RX_PAUSE_EN (0x1<<18) |
5356 | #define XMAC_PAUSE_CTRL_REG_TX_PAUSE_EN (0x1<<17) | 5356 | #define XMAC_PAUSE_CTRL_REG_TX_PAUSE_EN (0x1<<17) |
5357 | #define XMAC_PFC_CTRL_HI_REG_FORCE_PFC_XON (0x1<<1) | ||
5357 | #define XMAC_PFC_CTRL_HI_REG_PFC_REFRESH_EN (0x1<<0) | 5358 | #define XMAC_PFC_CTRL_HI_REG_PFC_REFRESH_EN (0x1<<0) |
5358 | #define XMAC_PFC_CTRL_HI_REG_PFC_STATS_EN (0x1<<3) | 5359 | #define XMAC_PFC_CTRL_HI_REG_PFC_STATS_EN (0x1<<3) |
5359 | #define XMAC_PFC_CTRL_HI_REG_RX_PFC_EN (0x1<<4) | 5360 | #define XMAC_PFC_CTRL_HI_REG_RX_PFC_EN (0x1<<4) |
@@ -6820,10 +6821,13 @@ Theotherbitsarereservedandshouldbezero*/ | |||
6820 | 6821 | ||
6821 | #define MDIO_AN_REG_8481_10GBASE_T_AN_CTRL 0x0020 | 6822 | #define MDIO_AN_REG_8481_10GBASE_T_AN_CTRL 0x0020 |
6822 | #define MDIO_AN_REG_8481_LEGACY_MII_CTRL 0xffe0 | 6823 | #define MDIO_AN_REG_8481_LEGACY_MII_CTRL 0xffe0 |
6824 | #define MDIO_AN_REG_8481_MII_CTRL_FORCE_1G 0x40 | ||
6823 | #define MDIO_AN_REG_8481_LEGACY_MII_STATUS 0xffe1 | 6825 | #define MDIO_AN_REG_8481_LEGACY_MII_STATUS 0xffe1 |
6824 | #define MDIO_AN_REG_8481_LEGACY_AN_ADV 0xffe4 | 6826 | #define MDIO_AN_REG_8481_LEGACY_AN_ADV 0xffe4 |
6825 | #define MDIO_AN_REG_8481_LEGACY_AN_EXPANSION 0xffe6 | 6827 | #define MDIO_AN_REG_8481_LEGACY_AN_EXPANSION 0xffe6 |
6826 | #define MDIO_AN_REG_8481_1000T_CTRL 0xffe9 | 6828 | #define MDIO_AN_REG_8481_1000T_CTRL 0xffe9 |
6829 | #define MDIO_AN_REG_8481_1G_100T_EXT_CTRL 0xfff0 | ||
6830 | #define MIDO_AN_REG_8481_EXT_CTRL_FORCE_LEDS_OFF 0x0008 | ||
6827 | #define MDIO_AN_REG_8481_EXPANSION_REG_RD_RW 0xfff5 | 6831 | #define MDIO_AN_REG_8481_EXPANSION_REG_RD_RW 0xfff5 |
6828 | #define MDIO_AN_REG_8481_EXPANSION_REG_ACCESS 0xfff7 | 6832 | #define MDIO_AN_REG_8481_EXPANSION_REG_ACCESS 0xfff7 |
6829 | #define MDIO_AN_REG_8481_AUX_CTRL 0xfff8 | 6833 | #define MDIO_AN_REG_8481_AUX_CTRL 0xfff8 |
@@ -6943,6 +6947,10 @@ Theotherbitsarereservedandshouldbezero*/ | |||
6943 | #define MDIO_WC_REG_GP2_STATUS_GP_2_2 0x81d2 | 6947 | #define MDIO_WC_REG_GP2_STATUS_GP_2_2 0x81d2 |
6944 | #define MDIO_WC_REG_GP2_STATUS_GP_2_3 0x81d3 | 6948 | #define MDIO_WC_REG_GP2_STATUS_GP_2_3 0x81d3 |
6945 | #define MDIO_WC_REG_GP2_STATUS_GP_2_4 0x81d4 | 6949 | #define MDIO_WC_REG_GP2_STATUS_GP_2_4 0x81d4 |
6950 | #define MDIO_WC_REG_GP2_STATUS_GP_2_4_CL73_AN_CMPL 0x1000 | ||
6951 | #define MDIO_WC_REG_GP2_STATUS_GP_2_4_CL37_AN_CMPL 0x0100 | ||
6952 | #define MDIO_WC_REG_GP2_STATUS_GP_2_4_CL37_LP_AN_CAP 0x0010 | ||
6953 | #define MDIO_WC_REG_GP2_STATUS_GP_2_4_CL37_AN_CAP 0x1 | ||
6946 | #define MDIO_WC_REG_UC_INFO_B0_DEAD_TRAP 0x81EE | 6954 | #define MDIO_WC_REG_UC_INFO_B0_DEAD_TRAP 0x81EE |
6947 | #define MDIO_WC_REG_UC_INFO_B1_VERSION 0x81F0 | 6955 | #define MDIO_WC_REG_UC_INFO_B1_VERSION 0x81F0 |
6948 | #define MDIO_WC_REG_UC_INFO_B1_FIRMWARE_MODE 0x81F2 | 6956 | #define MDIO_WC_REG_UC_INFO_B1_FIRMWARE_MODE 0x81F2 |
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c index 05ff076af06d..b126b98065a9 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | |||
@@ -2000,13 +2000,6 @@ static const struct ethtool_ops cxgb_ethtool_ops = { | |||
2000 | /* | 2000 | /* |
2001 | * debugfs support | 2001 | * debugfs support |
2002 | */ | 2002 | */ |
2003 | |||
2004 | static int mem_open(struct inode *inode, struct file *file) | ||
2005 | { | ||
2006 | file->private_data = inode->i_private; | ||
2007 | return 0; | ||
2008 | } | ||
2009 | |||
2010 | static ssize_t mem_read(struct file *file, char __user *buf, size_t count, | 2003 | static ssize_t mem_read(struct file *file, char __user *buf, size_t count, |
2011 | loff_t *ppos) | 2004 | loff_t *ppos) |
2012 | { | 2005 | { |
@@ -2050,7 +2043,7 @@ static ssize_t mem_read(struct file *file, char __user *buf, size_t count, | |||
2050 | 2043 | ||
2051 | static const struct file_operations mem_debugfs_fops = { | 2044 | static const struct file_operations mem_debugfs_fops = { |
2052 | .owner = THIS_MODULE, | 2045 | .owner = THIS_MODULE, |
2053 | .open = mem_open, | 2046 | .open = simple_open, |
2054 | .read = mem_read, | 2047 | .read = mem_read, |
2055 | .llseek = default_llseek, | 2048 | .llseek = default_llseek, |
2056 | }; | 2049 | }; |
diff --git a/drivers/net/ethernet/intel/e1000e/e1000.h b/drivers/net/ethernet/intel/e1000e/e1000.h index 86cdd4793992..b83897f76ee3 100644 --- a/drivers/net/ethernet/intel/e1000e/e1000.h +++ b/drivers/net/ethernet/intel/e1000e/e1000.h | |||
@@ -161,6 +161,12 @@ struct e1000_info; | |||
161 | /* Time to wait before putting the device into D3 if there's no link (in ms). */ | 161 | /* Time to wait before putting the device into D3 if there's no link (in ms). */ |
162 | #define LINK_TIMEOUT 100 | 162 | #define LINK_TIMEOUT 100 |
163 | 163 | ||
164 | /* | ||
165 | * Count for polling __E1000_RESET condition every 10-20msec. | ||
166 | * Experimentation has shown the reset can take approximately 210msec. | ||
167 | */ | ||
168 | #define E1000_CHECK_RESET_COUNT 25 | ||
169 | |||
164 | #define DEFAULT_RDTR 0 | 170 | #define DEFAULT_RDTR 0 |
165 | #define DEFAULT_RADV 8 | 171 | #define DEFAULT_RADV 8 |
166 | #define BURST_RDTR 0x20 | 172 | #define BURST_RDTR 0x20 |
diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c index 2c38a65ade87..19ab2154802c 100644 --- a/drivers/net/ethernet/intel/e1000e/netdev.c +++ b/drivers/net/ethernet/intel/e1000e/netdev.c | |||
@@ -1059,6 +1059,13 @@ static void e1000_print_hw_hang(struct work_struct *work) | |||
1059 | ew32(TIDV, adapter->tx_int_delay | E1000_TIDV_FPD); | 1059 | ew32(TIDV, adapter->tx_int_delay | E1000_TIDV_FPD); |
1060 | /* execute the writes immediately */ | 1060 | /* execute the writes immediately */ |
1061 | e1e_flush(); | 1061 | e1e_flush(); |
1062 | /* | ||
1063 | * Due to rare timing issues, write to TIDV again to ensure | ||
1064 | * the write is successful | ||
1065 | */ | ||
1066 | ew32(TIDV, adapter->tx_int_delay | E1000_TIDV_FPD); | ||
1067 | /* execute the writes immediately */ | ||
1068 | e1e_flush(); | ||
1062 | adapter->tx_hang_recheck = true; | 1069 | adapter->tx_hang_recheck = true; |
1063 | return; | 1070 | return; |
1064 | } | 1071 | } |
@@ -3616,6 +3623,16 @@ static void e1000e_flush_descriptors(struct e1000_adapter *adapter) | |||
3616 | 3623 | ||
3617 | /* execute the writes immediately */ | 3624 | /* execute the writes immediately */ |
3618 | e1e_flush(); | 3625 | e1e_flush(); |
3626 | |||
3627 | /* | ||
3628 | * due to rare timing issues, write to TIDV/RDTR again to ensure the | ||
3629 | * write is successful | ||
3630 | */ | ||
3631 | ew32(TIDV, adapter->tx_int_delay | E1000_TIDV_FPD); | ||
3632 | ew32(RDTR, adapter->rx_int_delay | E1000_RDTR_FPD); | ||
3633 | |||
3634 | /* execute the writes immediately */ | ||
3635 | e1e_flush(); | ||
3619 | } | 3636 | } |
3620 | 3637 | ||
3621 | static void e1000e_update_stats(struct e1000_adapter *adapter); | 3638 | static void e1000e_update_stats(struct e1000_adapter *adapter); |
@@ -3968,6 +3985,10 @@ static int e1000_close(struct net_device *netdev) | |||
3968 | { | 3985 | { |
3969 | struct e1000_adapter *adapter = netdev_priv(netdev); | 3986 | struct e1000_adapter *adapter = netdev_priv(netdev); |
3970 | struct pci_dev *pdev = adapter->pdev; | 3987 | struct pci_dev *pdev = adapter->pdev; |
3988 | int count = E1000_CHECK_RESET_COUNT; | ||
3989 | |||
3990 | while (test_bit(__E1000_RESETTING, &adapter->state) && count--) | ||
3991 | usleep_range(10000, 20000); | ||
3971 | 3992 | ||
3972 | WARN_ON(test_bit(__E1000_RESETTING, &adapter->state)); | 3993 | WARN_ON(test_bit(__E1000_RESETTING, &adapter->state)); |
3973 | 3994 | ||
@@ -5472,6 +5493,11 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool *enable_wake, | |||
5472 | netif_device_detach(netdev); | 5493 | netif_device_detach(netdev); |
5473 | 5494 | ||
5474 | if (netif_running(netdev)) { | 5495 | if (netif_running(netdev)) { |
5496 | int count = E1000_CHECK_RESET_COUNT; | ||
5497 | |||
5498 | while (test_bit(__E1000_RESETTING, &adapter->state) && count--) | ||
5499 | usleep_range(10000, 20000); | ||
5500 | |||
5475 | WARN_ON(test_bit(__E1000_RESETTING, &adapter->state)); | 5501 | WARN_ON(test_bit(__E1000_RESETTING, &adapter->state)); |
5476 | e1000e_down(adapter); | 5502 | e1000e_down(adapter); |
5477 | e1000_free_irq(adapter); | 5503 | e1000_free_irq(adapter); |
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_dcb_nl.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_dcb_nl.c index dde65f951400..652e4b09546d 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_dcb_nl.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_dcb_nl.c | |||
@@ -44,62 +44,94 @@ | |||
44 | #define DCB_NO_HW_CHG 1 /* DCB configuration did not change */ | 44 | #define DCB_NO_HW_CHG 1 /* DCB configuration did not change */ |
45 | #define DCB_HW_CHG 2 /* DCB configuration changed, no reset */ | 45 | #define DCB_HW_CHG 2 /* DCB configuration changed, no reset */ |
46 | 46 | ||
47 | int ixgbe_copy_dcb_cfg(struct ixgbe_dcb_config *src_dcb_cfg, | 47 | int ixgbe_copy_dcb_cfg(struct ixgbe_dcb_config *scfg, |
48 | struct ixgbe_dcb_config *dst_dcb_cfg, int tc_max) | 48 | struct ixgbe_dcb_config *dcfg, int tc_max) |
49 | { | 49 | { |
50 | struct tc_configuration *src_tc_cfg = NULL; | 50 | struct tc_configuration *src = NULL; |
51 | struct tc_configuration *dst_tc_cfg = NULL; | 51 | struct tc_configuration *dst = NULL; |
52 | int i; | 52 | int i, j; |
53 | int tx = DCB_TX_CONFIG; | ||
54 | int rx = DCB_RX_CONFIG; | ||
55 | int changes = 0; | ||
53 | 56 | ||
54 | if (!src_dcb_cfg || !dst_dcb_cfg) | 57 | if (!scfg || !dcfg) |
55 | return -EINVAL; | 58 | return changes; |
56 | 59 | ||
57 | for (i = DCB_PG_ATTR_TC_0; i < tc_max + DCB_PG_ATTR_TC_0; i++) { | 60 | for (i = DCB_PG_ATTR_TC_0; i < tc_max + DCB_PG_ATTR_TC_0; i++) { |
58 | src_tc_cfg = &src_dcb_cfg->tc_config[i - DCB_PG_ATTR_TC_0]; | 61 | src = &scfg->tc_config[i - DCB_PG_ATTR_TC_0]; |
59 | dst_tc_cfg = &dst_dcb_cfg->tc_config[i - DCB_PG_ATTR_TC_0]; | 62 | dst = &dcfg->tc_config[i - DCB_PG_ATTR_TC_0]; |
60 | 63 | ||
61 | dst_tc_cfg->path[DCB_TX_CONFIG].prio_type = | 64 | if (dst->path[tx].prio_type != src->path[tx].prio_type) { |
62 | src_tc_cfg->path[DCB_TX_CONFIG].prio_type; | 65 | dst->path[tx].prio_type = src->path[tx].prio_type; |
66 | changes |= BIT_PG_TX; | ||
67 | } | ||
63 | 68 | ||
64 | dst_tc_cfg->path[DCB_TX_CONFIG].bwg_id = | 69 | if (dst->path[tx].bwg_id != src->path[tx].bwg_id) { |
65 | src_tc_cfg->path[DCB_TX_CONFIG].bwg_id; | 70 | dst->path[tx].bwg_id = src->path[tx].bwg_id; |
71 | changes |= BIT_PG_TX; | ||
72 | } | ||
66 | 73 | ||
67 | dst_tc_cfg->path[DCB_TX_CONFIG].bwg_percent = | 74 | if (dst->path[tx].bwg_percent != src->path[tx].bwg_percent) { |
68 | src_tc_cfg->path[DCB_TX_CONFIG].bwg_percent; | 75 | dst->path[tx].bwg_percent = src->path[tx].bwg_percent; |
76 | changes |= BIT_PG_TX; | ||
77 | } | ||
69 | 78 | ||
70 | dst_tc_cfg->path[DCB_TX_CONFIG].up_to_tc_bitmap = | 79 | if (dst->path[tx].up_to_tc_bitmap != |
71 | src_tc_cfg->path[DCB_TX_CONFIG].up_to_tc_bitmap; | 80 | src->path[tx].up_to_tc_bitmap) { |
81 | dst->path[tx].up_to_tc_bitmap = | ||
82 | src->path[tx].up_to_tc_bitmap; | ||
83 | changes |= (BIT_PG_TX | BIT_PFC | BIT_APP_UPCHG); | ||
84 | } | ||
72 | 85 | ||
73 | dst_tc_cfg->path[DCB_RX_CONFIG].prio_type = | 86 | if (dst->path[rx].prio_type != src->path[rx].prio_type) { |
74 | src_tc_cfg->path[DCB_RX_CONFIG].prio_type; | 87 | dst->path[rx].prio_type = src->path[rx].prio_type; |
88 | changes |= BIT_PG_RX; | ||
89 | } | ||
75 | 90 | ||
76 | dst_tc_cfg->path[DCB_RX_CONFIG].bwg_id = | 91 | if (dst->path[rx].bwg_id != src->path[rx].bwg_id) { |
77 | src_tc_cfg->path[DCB_RX_CONFIG].bwg_id; | 92 | dst->path[rx].bwg_id = src->path[rx].bwg_id; |
93 | changes |= BIT_PG_RX; | ||
94 | } | ||
78 | 95 | ||
79 | dst_tc_cfg->path[DCB_RX_CONFIG].bwg_percent = | 96 | if (dst->path[rx].bwg_percent != src->path[rx].bwg_percent) { |
80 | src_tc_cfg->path[DCB_RX_CONFIG].bwg_percent; | 97 | dst->path[rx].bwg_percent = src->path[rx].bwg_percent; |
98 | changes |= BIT_PG_RX; | ||
99 | } | ||
81 | 100 | ||
82 | dst_tc_cfg->path[DCB_RX_CONFIG].up_to_tc_bitmap = | 101 | if (dst->path[rx].up_to_tc_bitmap != |
83 | src_tc_cfg->path[DCB_RX_CONFIG].up_to_tc_bitmap; | 102 | src->path[rx].up_to_tc_bitmap) { |
103 | dst->path[rx].up_to_tc_bitmap = | ||
104 | src->path[rx].up_to_tc_bitmap; | ||
105 | changes |= (BIT_PG_RX | BIT_PFC | BIT_APP_UPCHG); | ||
106 | } | ||
84 | } | 107 | } |
85 | 108 | ||
86 | for (i = DCB_PG_ATTR_BW_ID_0; i < DCB_PG_ATTR_BW_ID_MAX; i++) { | 109 | for (i = DCB_PG_ATTR_BW_ID_0; i < DCB_PG_ATTR_BW_ID_MAX; i++) { |
87 | dst_dcb_cfg->bw_percentage[DCB_TX_CONFIG] | 110 | j = i - DCB_PG_ATTR_BW_ID_0; |
88 | [i-DCB_PG_ATTR_BW_ID_0] = src_dcb_cfg->bw_percentage | 111 | if (dcfg->bw_percentage[tx][j] != scfg->bw_percentage[tx][j]) { |
89 | [DCB_TX_CONFIG][i-DCB_PG_ATTR_BW_ID_0]; | 112 | dcfg->bw_percentage[tx][j] = scfg->bw_percentage[tx][j]; |
90 | dst_dcb_cfg->bw_percentage[DCB_RX_CONFIG] | 113 | changes |= BIT_PG_TX; |
91 | [i-DCB_PG_ATTR_BW_ID_0] = src_dcb_cfg->bw_percentage | 114 | } |
92 | [DCB_RX_CONFIG][i-DCB_PG_ATTR_BW_ID_0]; | 115 | if (dcfg->bw_percentage[rx][j] != scfg->bw_percentage[rx][j]) { |
116 | dcfg->bw_percentage[rx][j] = scfg->bw_percentage[rx][j]; | ||
117 | changes |= BIT_PG_RX; | ||
118 | } | ||
93 | } | 119 | } |
94 | 120 | ||
95 | for (i = DCB_PFC_UP_ATTR_0; i < DCB_PFC_UP_ATTR_MAX; i++) { | 121 | for (i = DCB_PFC_UP_ATTR_0; i < DCB_PFC_UP_ATTR_MAX; i++) { |
96 | dst_dcb_cfg->tc_config[i - DCB_PFC_UP_ATTR_0].dcb_pfc = | 122 | j = i - DCB_PFC_UP_ATTR_0; |
97 | src_dcb_cfg->tc_config[i - DCB_PFC_UP_ATTR_0].dcb_pfc; | 123 | if (dcfg->tc_config[j].dcb_pfc != scfg->tc_config[j].dcb_pfc) { |
124 | dcfg->tc_config[j].dcb_pfc = scfg->tc_config[j].dcb_pfc; | ||
125 | changes |= BIT_PFC; | ||
126 | } | ||
98 | } | 127 | } |
99 | 128 | ||
100 | dst_dcb_cfg->pfc_mode_enable = src_dcb_cfg->pfc_mode_enable; | 129 | if (dcfg->pfc_mode_enable != scfg->pfc_mode_enable) { |
130 | dcfg->pfc_mode_enable = scfg->pfc_mode_enable; | ||
131 | changes |= BIT_PFC; | ||
132 | } | ||
101 | 133 | ||
102 | return 0; | 134 | return changes; |
103 | } | 135 | } |
104 | 136 | ||
105 | static u8 ixgbe_dcbnl_get_state(struct net_device *netdev) | 137 | static u8 ixgbe_dcbnl_get_state(struct net_device *netdev) |
@@ -179,20 +211,6 @@ static void ixgbe_dcbnl_set_pg_tc_cfg_tx(struct net_device *netdev, int tc, | |||
179 | if (up_map != DCB_ATTR_VALUE_UNDEFINED) | 211 | if (up_map != DCB_ATTR_VALUE_UNDEFINED) |
180 | adapter->temp_dcb_cfg.tc_config[tc].path[0].up_to_tc_bitmap = | 212 | adapter->temp_dcb_cfg.tc_config[tc].path[0].up_to_tc_bitmap = |
181 | up_map; | 213 | up_map; |
182 | |||
183 | if ((adapter->temp_dcb_cfg.tc_config[tc].path[0].prio_type != | ||
184 | adapter->dcb_cfg.tc_config[tc].path[0].prio_type) || | ||
185 | (adapter->temp_dcb_cfg.tc_config[tc].path[0].bwg_id != | ||
186 | adapter->dcb_cfg.tc_config[tc].path[0].bwg_id) || | ||
187 | (adapter->temp_dcb_cfg.tc_config[tc].path[0].bwg_percent != | ||
188 | adapter->dcb_cfg.tc_config[tc].path[0].bwg_percent) || | ||
189 | (adapter->temp_dcb_cfg.tc_config[tc].path[0].up_to_tc_bitmap != | ||
190 | adapter->dcb_cfg.tc_config[tc].path[0].up_to_tc_bitmap)) | ||
191 | adapter->dcb_set_bitmap |= BIT_PG_TX; | ||
192 | |||
193 | if (adapter->temp_dcb_cfg.tc_config[tc].path[0].up_to_tc_bitmap != | ||
194 | adapter->dcb_cfg.tc_config[tc].path[0].up_to_tc_bitmap) | ||
195 | adapter->dcb_set_bitmap |= BIT_PFC | BIT_APP_UPCHG; | ||
196 | } | 214 | } |
197 | 215 | ||
198 | static void ixgbe_dcbnl_set_pg_bwg_cfg_tx(struct net_device *netdev, int bwg_id, | 216 | static void ixgbe_dcbnl_set_pg_bwg_cfg_tx(struct net_device *netdev, int bwg_id, |
@@ -201,10 +219,6 @@ static void ixgbe_dcbnl_set_pg_bwg_cfg_tx(struct net_device *netdev, int bwg_id, | |||
201 | struct ixgbe_adapter *adapter = netdev_priv(netdev); | 219 | struct ixgbe_adapter *adapter = netdev_priv(netdev); |
202 | 220 | ||
203 | adapter->temp_dcb_cfg.bw_percentage[0][bwg_id] = bw_pct; | 221 | adapter->temp_dcb_cfg.bw_percentage[0][bwg_id] = bw_pct; |
204 | |||
205 | if (adapter->temp_dcb_cfg.bw_percentage[0][bwg_id] != | ||
206 | adapter->dcb_cfg.bw_percentage[0][bwg_id]) | ||
207 | adapter->dcb_set_bitmap |= BIT_PG_TX; | ||
208 | } | 222 | } |
209 | 223 | ||
210 | static void ixgbe_dcbnl_set_pg_tc_cfg_rx(struct net_device *netdev, int tc, | 224 | static void ixgbe_dcbnl_set_pg_tc_cfg_rx(struct net_device *netdev, int tc, |
@@ -223,20 +237,6 @@ static void ixgbe_dcbnl_set_pg_tc_cfg_rx(struct net_device *netdev, int tc, | |||
223 | if (up_map != DCB_ATTR_VALUE_UNDEFINED) | 237 | if (up_map != DCB_ATTR_VALUE_UNDEFINED) |
224 | adapter->temp_dcb_cfg.tc_config[tc].path[1].up_to_tc_bitmap = | 238 | adapter->temp_dcb_cfg.tc_config[tc].path[1].up_to_tc_bitmap = |
225 | up_map; | 239 | up_map; |
226 | |||
227 | if ((adapter->temp_dcb_cfg.tc_config[tc].path[1].prio_type != | ||
228 | adapter->dcb_cfg.tc_config[tc].path[1].prio_type) || | ||
229 | (adapter->temp_dcb_cfg.tc_config[tc].path[1].bwg_id != | ||
230 | adapter->dcb_cfg.tc_config[tc].path[1].bwg_id) || | ||
231 | (adapter->temp_dcb_cfg.tc_config[tc].path[1].bwg_percent != | ||
232 | adapter->dcb_cfg.tc_config[tc].path[1].bwg_percent) || | ||
233 | (adapter->temp_dcb_cfg.tc_config[tc].path[1].up_to_tc_bitmap != | ||
234 | adapter->dcb_cfg.tc_config[tc].path[1].up_to_tc_bitmap)) | ||
235 | adapter->dcb_set_bitmap |= BIT_PG_RX; | ||
236 | |||
237 | if (adapter->temp_dcb_cfg.tc_config[tc].path[1].up_to_tc_bitmap != | ||
238 | adapter->dcb_cfg.tc_config[tc].path[1].up_to_tc_bitmap) | ||
239 | adapter->dcb_set_bitmap |= BIT_PFC; | ||
240 | } | 240 | } |
241 | 241 | ||
242 | static void ixgbe_dcbnl_set_pg_bwg_cfg_rx(struct net_device *netdev, int bwg_id, | 242 | static void ixgbe_dcbnl_set_pg_bwg_cfg_rx(struct net_device *netdev, int bwg_id, |
@@ -245,10 +245,6 @@ static void ixgbe_dcbnl_set_pg_bwg_cfg_rx(struct net_device *netdev, int bwg_id, | |||
245 | struct ixgbe_adapter *adapter = netdev_priv(netdev); | 245 | struct ixgbe_adapter *adapter = netdev_priv(netdev); |
246 | 246 | ||
247 | adapter->temp_dcb_cfg.bw_percentage[1][bwg_id] = bw_pct; | 247 | adapter->temp_dcb_cfg.bw_percentage[1][bwg_id] = bw_pct; |
248 | |||
249 | if (adapter->temp_dcb_cfg.bw_percentage[1][bwg_id] != | ||
250 | adapter->dcb_cfg.bw_percentage[1][bwg_id]) | ||
251 | adapter->dcb_set_bitmap |= BIT_PG_RX; | ||
252 | } | 248 | } |
253 | 249 | ||
254 | static void ixgbe_dcbnl_get_pg_tc_cfg_tx(struct net_device *netdev, int tc, | 250 | static void ixgbe_dcbnl_get_pg_tc_cfg_tx(struct net_device *netdev, int tc, |
@@ -298,10 +294,8 @@ static void ixgbe_dcbnl_set_pfc_cfg(struct net_device *netdev, int priority, | |||
298 | 294 | ||
299 | adapter->temp_dcb_cfg.tc_config[priority].dcb_pfc = setting; | 295 | adapter->temp_dcb_cfg.tc_config[priority].dcb_pfc = setting; |
300 | if (adapter->temp_dcb_cfg.tc_config[priority].dcb_pfc != | 296 | if (adapter->temp_dcb_cfg.tc_config[priority].dcb_pfc != |
301 | adapter->dcb_cfg.tc_config[priority].dcb_pfc) { | 297 | adapter->dcb_cfg.tc_config[priority].dcb_pfc) |
302 | adapter->dcb_set_bitmap |= BIT_PFC; | ||
303 | adapter->temp_dcb_cfg.pfc_mode_enable = true; | 298 | adapter->temp_dcb_cfg.pfc_mode_enable = true; |
304 | } | ||
305 | } | 299 | } |
306 | 300 | ||
307 | static void ixgbe_dcbnl_get_pfc_cfg(struct net_device *netdev, int priority, | 301 | static void ixgbe_dcbnl_get_pfc_cfg(struct net_device *netdev, int priority, |
@@ -336,7 +330,8 @@ static void ixgbe_dcbnl_devreset(struct net_device *dev) | |||
336 | static u8 ixgbe_dcbnl_set_all(struct net_device *netdev) | 330 | static u8 ixgbe_dcbnl_set_all(struct net_device *netdev) |
337 | { | 331 | { |
338 | struct ixgbe_adapter *adapter = netdev_priv(netdev); | 332 | struct ixgbe_adapter *adapter = netdev_priv(netdev); |
339 | int ret, i; | 333 | int ret = DCB_NO_HW_CHG; |
334 | int i; | ||
340 | #ifdef IXGBE_FCOE | 335 | #ifdef IXGBE_FCOE |
341 | struct dcb_app app = { | 336 | struct dcb_app app = { |
342 | .selector = DCB_APP_IDTYPE_ETHTYPE, | 337 | .selector = DCB_APP_IDTYPE_ETHTYPE, |
@@ -355,12 +350,13 @@ static u8 ixgbe_dcbnl_set_all(struct net_device *netdev) | |||
355 | 350 | ||
356 | /* Fail command if not in CEE mode */ | 351 | /* Fail command if not in CEE mode */ |
357 | if (!(adapter->dcbx_cap & DCB_CAP_DCBX_VER_CEE)) | 352 | if (!(adapter->dcbx_cap & DCB_CAP_DCBX_VER_CEE)) |
358 | return 1; | 353 | return ret; |
359 | 354 | ||
360 | ret = ixgbe_copy_dcb_cfg(&adapter->temp_dcb_cfg, &adapter->dcb_cfg, | 355 | adapter->dcb_set_bitmap |= ixgbe_copy_dcb_cfg(&adapter->temp_dcb_cfg, |
361 | MAX_TRAFFIC_CLASS); | 356 | &adapter->dcb_cfg, |
362 | if (ret) | 357 | MAX_TRAFFIC_CLASS); |
363 | return DCB_NO_HW_CHG; | 358 | if (!adapter->dcb_set_bitmap) |
359 | return ret; | ||
364 | 360 | ||
365 | if (adapter->dcb_cfg.pfc_mode_enable) { | 361 | if (adapter->dcb_cfg.pfc_mode_enable) { |
366 | switch (adapter->hw.mac.type) { | 362 | switch (adapter->hw.mac.type) { |
@@ -420,6 +416,8 @@ static u8 ixgbe_dcbnl_set_all(struct net_device *netdev) | |||
420 | 416 | ||
421 | for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++) | 417 | for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++) |
422 | netdev_set_prio_tc_map(netdev, i, prio_tc[i]); | 418 | netdev_set_prio_tc_map(netdev, i, prio_tc[i]); |
419 | |||
420 | ret = DCB_HW_CHG_RST; | ||
423 | } | 421 | } |
424 | 422 | ||
425 | if (adapter->dcb_set_bitmap & BIT_PFC) { | 423 | if (adapter->dcb_set_bitmap & BIT_PFC) { |
@@ -430,7 +428,8 @@ static u8 ixgbe_dcbnl_set_all(struct net_device *netdev) | |||
430 | DCB_TX_CONFIG, prio_tc); | 428 | DCB_TX_CONFIG, prio_tc); |
431 | ixgbe_dcb_unpack_pfc(&adapter->dcb_cfg, &pfc_en); | 429 | ixgbe_dcb_unpack_pfc(&adapter->dcb_cfg, &pfc_en); |
432 | ixgbe_dcb_hw_pfc_config(&adapter->hw, pfc_en, prio_tc); | 430 | ixgbe_dcb_hw_pfc_config(&adapter->hw, pfc_en, prio_tc); |
433 | ret = DCB_HW_CHG; | 431 | if (ret != DCB_HW_CHG_RST) |
432 | ret = DCB_HW_CHG; | ||
434 | } | 433 | } |
435 | 434 | ||
436 | if (adapter->dcb_cfg.pfc_mode_enable) | 435 | if (adapter->dcb_cfg.pfc_mode_enable) |
@@ -531,9 +530,6 @@ static void ixgbe_dcbnl_setpfcstate(struct net_device *netdev, u8 state) | |||
531 | struct ixgbe_adapter *adapter = netdev_priv(netdev); | 530 | struct ixgbe_adapter *adapter = netdev_priv(netdev); |
532 | 531 | ||
533 | adapter->temp_dcb_cfg.pfc_mode_enable = state; | 532 | adapter->temp_dcb_cfg.pfc_mode_enable = state; |
534 | if (adapter->temp_dcb_cfg.pfc_mode_enable != | ||
535 | adapter->dcb_cfg.pfc_mode_enable) | ||
536 | adapter->dcb_set_bitmap |= BIT_PFC; | ||
537 | } | 533 | } |
538 | 534 | ||
539 | /** | 535 | /** |
diff --git a/drivers/net/ethernet/marvell/sky2.c b/drivers/net/ethernet/marvell/sky2.c index b806d9b4defb..c9b504e2dfc3 100644 --- a/drivers/net/ethernet/marvell/sky2.c +++ b/drivers/net/ethernet/marvell/sky2.c | |||
@@ -2469,6 +2469,17 @@ static int sky2_change_mtu(struct net_device *dev, int new_mtu) | |||
2469 | return err; | 2469 | return err; |
2470 | } | 2470 | } |
2471 | 2471 | ||
2472 | static inline bool needs_copy(const struct rx_ring_info *re, | ||
2473 | unsigned length) | ||
2474 | { | ||
2475 | #ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS | ||
2476 | /* Some architectures need the IP header to be aligned */ | ||
2477 | if (!IS_ALIGNED(re->data_addr + ETH_HLEN, sizeof(u32))) | ||
2478 | return true; | ||
2479 | #endif | ||
2480 | return length < copybreak; | ||
2481 | } | ||
2482 | |||
2472 | /* For small just reuse existing skb for next receive */ | 2483 | /* For small just reuse existing skb for next receive */ |
2473 | static struct sk_buff *receive_copy(struct sky2_port *sky2, | 2484 | static struct sk_buff *receive_copy(struct sky2_port *sky2, |
2474 | const struct rx_ring_info *re, | 2485 | const struct rx_ring_info *re, |
@@ -2599,7 +2610,7 @@ static struct sk_buff *sky2_receive(struct net_device *dev, | |||
2599 | goto error; | 2610 | goto error; |
2600 | 2611 | ||
2601 | okay: | 2612 | okay: |
2602 | if (length < copybreak) | 2613 | if (needs_copy(re, length)) |
2603 | skb = receive_copy(sky2, re, length); | 2614 | skb = receive_copy(sky2, re, length); |
2604 | else | 2615 | else |
2605 | skb = receive_new(sky2, re, length); | 2616 | skb = receive_new(sky2, re, length); |
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h index 9e2b911a1230..d69fee41f24a 100644 --- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h +++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | |||
@@ -83,8 +83,9 @@ | |||
83 | 83 | ||
84 | #define MLX4_EN_WATCHDOG_TIMEOUT (15 * HZ) | 84 | #define MLX4_EN_WATCHDOG_TIMEOUT (15 * HZ) |
85 | 85 | ||
86 | #define MLX4_EN_ALLOC_ORDER 2 | 86 | /* Use the maximum between 16384 and a single page */ |
87 | #define MLX4_EN_ALLOC_SIZE (PAGE_SIZE << MLX4_EN_ALLOC_ORDER) | 87 | #define MLX4_EN_ALLOC_SIZE PAGE_ALIGN(16384) |
88 | #define MLX4_EN_ALLOC_ORDER get_order(MLX4_EN_ALLOC_SIZE) | ||
88 | 89 | ||
89 | #define MLX4_EN_MAX_LRO_DESCRIPTORS 32 | 90 | #define MLX4_EN_MAX_LRO_DESCRIPTORS 32 |
90 | 91 | ||
diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c index 7b23554f80b6..f54509377efa 100644 --- a/drivers/net/ethernet/realtek/r8169.c +++ b/drivers/net/ethernet/realtek/r8169.c | |||
@@ -5810,7 +5810,10 @@ static void __rtl8169_resume(struct net_device *dev) | |||
5810 | 5810 | ||
5811 | rtl_pll_power_up(tp); | 5811 | rtl_pll_power_up(tp); |
5812 | 5812 | ||
5813 | rtl_lock_work(tp); | ||
5814 | napi_enable(&tp->napi); | ||
5813 | set_bit(RTL_FLAG_TASK_ENABLED, tp->wk.flags); | 5815 | set_bit(RTL_FLAG_TASK_ENABLED, tp->wk.flags); |
5816 | rtl_unlock_work(tp); | ||
5814 | 5817 | ||
5815 | rtl_schedule_task(tp, RTL_FLAG_TASK_RESET_PENDING); | 5818 | rtl_schedule_task(tp, RTL_FLAG_TASK_RESET_PENDING); |
5816 | } | 5819 | } |
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index e85ffbd54830..48d56da62f08 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | |||
@@ -1737,10 +1737,12 @@ static int stmmac_hw_init(struct stmmac_priv *priv) | |||
1737 | struct mac_device_info *mac; | 1737 | struct mac_device_info *mac; |
1738 | 1738 | ||
1739 | /* Identify the MAC HW device */ | 1739 | /* Identify the MAC HW device */ |
1740 | if (priv->plat->has_gmac) | 1740 | if (priv->plat->has_gmac) { |
1741 | priv->dev->priv_flags |= IFF_UNICAST_FLT; | ||
1741 | mac = dwmac1000_setup(priv->ioaddr); | 1742 | mac = dwmac1000_setup(priv->ioaddr); |
1742 | else | 1743 | } else { |
1743 | mac = dwmac100_setup(priv->ioaddr); | 1744 | mac = dwmac100_setup(priv->ioaddr); |
1745 | } | ||
1744 | if (!mac) | 1746 | if (!mac) |
1745 | return -ENOMEM; | 1747 | return -ENOMEM; |
1746 | 1748 | ||
diff --git a/drivers/net/ethernet/tile/tilepro.c b/drivers/net/ethernet/tile/tilepro.c index 261356c2dc99..3d501ec7fad7 100644 --- a/drivers/net/ethernet/tile/tilepro.c +++ b/drivers/net/ethernet/tile/tilepro.c | |||
@@ -342,6 +342,21 @@ inline int __netio_fastio1(u32 fastio_index, u32 arg0) | |||
342 | } | 342 | } |
343 | 343 | ||
344 | 344 | ||
345 | static void tile_net_return_credit(struct tile_net_cpu *info) | ||
346 | { | ||
347 | struct tile_netio_queue *queue = &info->queue; | ||
348 | netio_queue_user_impl_t *qup = &queue->__user_part; | ||
349 | |||
350 | /* Return four credits after every fourth packet. */ | ||
351 | if (--qup->__receive_credit_remaining == 0) { | ||
352 | u32 interval = qup->__receive_credit_interval; | ||
353 | qup->__receive_credit_remaining = interval; | ||
354 | __netio_fastio_return_credits(qup->__fastio_index, interval); | ||
355 | } | ||
356 | } | ||
357 | |||
358 | |||
359 | |||
345 | /* | 360 | /* |
346 | * Provide a linux buffer to LIPP. | 361 | * Provide a linux buffer to LIPP. |
347 | */ | 362 | */ |
@@ -433,7 +448,7 @@ static bool tile_net_provide_needed_buffer(struct tile_net_cpu *info, | |||
433 | struct sk_buff **skb_ptr; | 448 | struct sk_buff **skb_ptr; |
434 | 449 | ||
435 | /* Request 96 extra bytes for alignment purposes. */ | 450 | /* Request 96 extra bytes for alignment purposes. */ |
436 | skb = netdev_alloc_skb(info->napi->dev, len + padding); | 451 | skb = netdev_alloc_skb(info->napi.dev, len + padding); |
437 | if (skb == NULL) | 452 | if (skb == NULL) |
438 | return false; | 453 | return false; |
439 | 454 | ||
@@ -864,19 +879,11 @@ static bool tile_net_poll_aux(struct tile_net_cpu *info, int index) | |||
864 | 879 | ||
865 | stats->rx_packets++; | 880 | stats->rx_packets++; |
866 | stats->rx_bytes += len; | 881 | stats->rx_bytes += len; |
867 | |||
868 | if (small) | ||
869 | info->num_needed_small_buffers++; | ||
870 | else | ||
871 | info->num_needed_large_buffers++; | ||
872 | } | 882 | } |
873 | 883 | ||
874 | /* Return four credits after every fourth packet. */ | 884 | /* ISSUE: It would be nice to defer this until the packet has */ |
875 | if (--qup->__receive_credit_remaining == 0) { | 885 | /* actually been processed. */ |
876 | u32 interval = qup->__receive_credit_interval; | 886 | tile_net_return_credit(info); |
877 | qup->__receive_credit_remaining = interval; | ||
878 | __netio_fastio_return_credits(qup->__fastio_index, interval); | ||
879 | } | ||
880 | 887 | ||
881 | /* Consume this packet. */ | 888 | /* Consume this packet. */ |
882 | qup->__packet_receive_read = index2; | 889 | qup->__packet_receive_read = index2; |
@@ -1543,7 +1550,7 @@ static int tile_net_drain_lipp_buffers(struct tile_net_priv *priv) | |||
1543 | 1550 | ||
1544 | /* Drain all the LIPP buffers. */ | 1551 | /* Drain all the LIPP buffers. */ |
1545 | while (true) { | 1552 | while (true) { |
1546 | int buffer; | 1553 | unsigned int buffer; |
1547 | 1554 | ||
1548 | /* NOTE: This should never fail. */ | 1555 | /* NOTE: This should never fail. */ |
1549 | if (hv_dev_pread(priv->hv_devhdl, 0, (HV_VirtAddr)&buffer, | 1556 | if (hv_dev_pread(priv->hv_devhdl, 0, (HV_VirtAddr)&buffer, |
@@ -1707,7 +1714,7 @@ static unsigned int tile_net_tx_frags(lepp_frag_t *frags, | |||
1707 | if (!hash_default) { | 1714 | if (!hash_default) { |
1708 | void *va = pfn_to_kaddr(pfn) + f->page_offset; | 1715 | void *va = pfn_to_kaddr(pfn) + f->page_offset; |
1709 | BUG_ON(PageHighMem(skb_frag_page(f))); | 1716 | BUG_ON(PageHighMem(skb_frag_page(f))); |
1710 | finv_buffer_remote(va, f->size, 0); | 1717 | finv_buffer_remote(va, skb_frag_size(f), 0); |
1711 | } | 1718 | } |
1712 | 1719 | ||
1713 | cpa = ((phys_addr_t)pfn << PAGE_SHIFT) + f->page_offset; | 1720 | cpa = ((phys_addr_t)pfn << PAGE_SHIFT) + f->page_offset; |
@@ -1735,8 +1742,8 @@ static unsigned int tile_net_tx_frags(lepp_frag_t *frags, | |||
1735 | * Sometimes, if "sendfile()" requires copying, we will be called with | 1742 | * Sometimes, if "sendfile()" requires copying, we will be called with |
1736 | * "data" containing the header and payload, with "frags" being empty. | 1743 | * "data" containing the header and payload, with "frags" being empty. |
1737 | * | 1744 | * |
1738 | * In theory, "sh->nr_frags" could be 3, but in practice, it seems | 1745 | * Sometimes, for example when using NFS over TCP, a single segment can |
1739 | * that this will never actually happen. | 1746 | * span 3 fragments, which must be handled carefully in LEPP. |
1740 | * | 1747 | * |
1741 | * See "emulate_large_send_offload()" for some reference code, which | 1748 | * See "emulate_large_send_offload()" for some reference code, which |
1742 | * does not handle checksumming. | 1749 | * does not handle checksumming. |
@@ -1844,10 +1851,8 @@ static int tile_net_tx_tso(struct sk_buff *skb, struct net_device *dev) | |||
1844 | 1851 | ||
1845 | spin_lock_irqsave(&priv->eq_lock, irqflags); | 1852 | spin_lock_irqsave(&priv->eq_lock, irqflags); |
1846 | 1853 | ||
1847 | /* | 1854 | /* Handle completions if needed to make room. */ |
1848 | * Handle completions if needed to make room. | 1855 | /* NOTE: Return NETDEV_TX_BUSY if there is still no room. */ |
1849 | * HACK: Spin until there is sufficient room. | ||
1850 | */ | ||
1851 | if (lepp_num_free_comp_slots(eq) == 0) { | 1856 | if (lepp_num_free_comp_slots(eq) == 0) { |
1852 | nolds = tile_net_lepp_grab_comps(eq, olds, wanted, 0); | 1857 | nolds = tile_net_lepp_grab_comps(eq, olds, wanted, 0); |
1853 | if (nolds == 0) { | 1858 | if (nolds == 0) { |
@@ -1861,6 +1866,7 @@ busy: | |||
1861 | cmd_tail = eq->cmd_tail; | 1866 | cmd_tail = eq->cmd_tail; |
1862 | 1867 | ||
1863 | /* Prepare to advance, detecting full queue. */ | 1868 | /* Prepare to advance, detecting full queue. */ |
1869 | /* NOTE: Return NETDEV_TX_BUSY if the queue is full. */ | ||
1864 | cmd_next = cmd_tail + cmd_size; | 1870 | cmd_next = cmd_tail + cmd_size; |
1865 | if (cmd_tail < cmd_head && cmd_next >= cmd_head) | 1871 | if (cmd_tail < cmd_head && cmd_next >= cmd_head) |
1866 | goto busy; | 1872 | goto busy; |
@@ -2023,10 +2029,8 @@ static int tile_net_tx(struct sk_buff *skb, struct net_device *dev) | |||
2023 | 2029 | ||
2024 | spin_lock_irqsave(&priv->eq_lock, irqflags); | 2030 | spin_lock_irqsave(&priv->eq_lock, irqflags); |
2025 | 2031 | ||
2026 | /* | 2032 | /* Handle completions if needed to make room. */ |
2027 | * Handle completions if needed to make room. | 2033 | /* NOTE: Return NETDEV_TX_BUSY if there is still no room. */ |
2028 | * HACK: Spin until there is sufficient room. | ||
2029 | */ | ||
2030 | if (lepp_num_free_comp_slots(eq) == 0) { | 2034 | if (lepp_num_free_comp_slots(eq) == 0) { |
2031 | nolds = tile_net_lepp_grab_comps(eq, olds, wanted, 0); | 2035 | nolds = tile_net_lepp_grab_comps(eq, olds, wanted, 0); |
2032 | if (nolds == 0) { | 2036 | if (nolds == 0) { |
@@ -2040,6 +2044,7 @@ busy: | |||
2040 | cmd_tail = eq->cmd_tail; | 2044 | cmd_tail = eq->cmd_tail; |
2041 | 2045 | ||
2042 | /* Copy the commands, or fail. */ | 2046 | /* Copy the commands, or fail. */ |
2047 | /* NOTE: Return NETDEV_TX_BUSY if the queue is full. */ | ||
2043 | for (i = 0; i < num_frags; i++) { | 2048 | for (i = 0; i < num_frags; i++) { |
2044 | 2049 | ||
2045 | /* Prepare to advance, detecting full queue. */ | 2050 | /* Prepare to advance, detecting full queue. */ |
@@ -2261,6 +2266,23 @@ static int tile_net_get_mac(struct net_device *dev) | |||
2261 | return 0; | 2266 | return 0; |
2262 | } | 2267 | } |
2263 | 2268 | ||
2269 | |||
2270 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
2271 | /* | ||
2272 | * Polling 'interrupt' - used by things like netconsole to send skbs | ||
2273 | * without having to re-enable interrupts. It's not called while | ||
2274 | * the interrupt routine is executing. | ||
2275 | */ | ||
2276 | static void tile_net_netpoll(struct net_device *dev) | ||
2277 | { | ||
2278 | struct tile_net_priv *priv = netdev_priv(dev); | ||
2279 | disable_percpu_irq(priv->intr_id); | ||
2280 | tile_net_handle_ingress_interrupt(priv->intr_id, dev); | ||
2281 | enable_percpu_irq(priv->intr_id, 0); | ||
2282 | } | ||
2283 | #endif | ||
2284 | |||
2285 | |||
2264 | static const struct net_device_ops tile_net_ops = { | 2286 | static const struct net_device_ops tile_net_ops = { |
2265 | .ndo_open = tile_net_open, | 2287 | .ndo_open = tile_net_open, |
2266 | .ndo_stop = tile_net_stop, | 2288 | .ndo_stop = tile_net_stop, |
@@ -2269,7 +2291,10 @@ static const struct net_device_ops tile_net_ops = { | |||
2269 | .ndo_get_stats = tile_net_get_stats, | 2291 | .ndo_get_stats = tile_net_get_stats, |
2270 | .ndo_change_mtu = tile_net_change_mtu, | 2292 | .ndo_change_mtu = tile_net_change_mtu, |
2271 | .ndo_tx_timeout = tile_net_tx_timeout, | 2293 | .ndo_tx_timeout = tile_net_tx_timeout, |
2272 | .ndo_set_mac_address = tile_net_set_mac_address | 2294 | .ndo_set_mac_address = tile_net_set_mac_address, |
2295 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
2296 | .ndo_poll_controller = tile_net_netpoll, | ||
2297 | #endif | ||
2273 | }; | 2298 | }; |
2274 | 2299 | ||
2275 | 2300 | ||
@@ -2409,7 +2434,7 @@ static void tile_net_cleanup(void) | |||
2409 | */ | 2434 | */ |
2410 | static int tile_net_init_module(void) | 2435 | static int tile_net_init_module(void) |
2411 | { | 2436 | { |
2412 | pr_info("Tilera IPP Net Driver\n"); | 2437 | pr_info("Tilera Network Driver\n"); |
2413 | 2438 | ||
2414 | tile_net_devs[0] = tile_net_dev_init("xgbe0"); | 2439 | tile_net_devs[0] = tile_net_dev_init("xgbe0"); |
2415 | tile_net_devs[1] = tile_net_dev_init("xgbe1"); | 2440 | tile_net_devs[1] = tile_net_dev_init("xgbe1"); |
diff --git a/drivers/net/phy/icplus.c b/drivers/net/phy/icplus.c index 0856e1b7a849..f08c85acf761 100644 --- a/drivers/net/phy/icplus.c +++ b/drivers/net/phy/icplus.c | |||
@@ -162,7 +162,8 @@ static int ip101a_g_config_init(struct phy_device *phydev) | |||
162 | /* Enable Auto Power Saving mode */ | 162 | /* Enable Auto Power Saving mode */ |
163 | c = phy_read(phydev, IP10XX_SPEC_CTRL_STATUS); | 163 | c = phy_read(phydev, IP10XX_SPEC_CTRL_STATUS); |
164 | c |= IP101A_G_APS_ON; | 164 | c |= IP101A_G_APS_ON; |
165 | return c; | 165 | |
166 | return phy_write(phydev, IP10XX_SPEC_CTRL_STATUS, c); | ||
166 | } | 167 | } |
167 | 168 | ||
168 | static int ip175c_read_status(struct phy_device *phydev) | 169 | static int ip175c_read_status(struct phy_device *phydev) |
diff --git a/drivers/net/ppp/ppp_generic.c b/drivers/net/ppp/ppp_generic.c index 159da2905fe9..33f8c51968b6 100644 --- a/drivers/net/ppp/ppp_generic.c +++ b/drivers/net/ppp/ppp_generic.c | |||
@@ -235,7 +235,7 @@ struct ppp_net { | |||
235 | /* Prototypes. */ | 235 | /* Prototypes. */ |
236 | static int ppp_unattached_ioctl(struct net *net, struct ppp_file *pf, | 236 | static int ppp_unattached_ioctl(struct net *net, struct ppp_file *pf, |
237 | struct file *file, unsigned int cmd, unsigned long arg); | 237 | struct file *file, unsigned int cmd, unsigned long arg); |
238 | static void ppp_xmit_process(struct ppp *ppp); | 238 | static int ppp_xmit_process(struct ppp *ppp); |
239 | static void ppp_send_frame(struct ppp *ppp, struct sk_buff *skb); | 239 | static void ppp_send_frame(struct ppp *ppp, struct sk_buff *skb); |
240 | static void ppp_push(struct ppp *ppp); | 240 | static void ppp_push(struct ppp *ppp); |
241 | static void ppp_channel_push(struct channel *pch); | 241 | static void ppp_channel_push(struct channel *pch); |
@@ -968,9 +968,9 @@ ppp_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
968 | proto = npindex_to_proto[npi]; | 968 | proto = npindex_to_proto[npi]; |
969 | put_unaligned_be16(proto, pp); | 969 | put_unaligned_be16(proto, pp); |
970 | 970 | ||
971 | netif_stop_queue(dev); | ||
972 | skb_queue_tail(&ppp->file.xq, skb); | 971 | skb_queue_tail(&ppp->file.xq, skb); |
973 | ppp_xmit_process(ppp); | 972 | if (!ppp_xmit_process(ppp)) |
973 | netif_stop_queue(dev); | ||
974 | return NETDEV_TX_OK; | 974 | return NETDEV_TX_OK; |
975 | 975 | ||
976 | outf: | 976 | outf: |
@@ -1048,10 +1048,11 @@ static void ppp_setup(struct net_device *dev) | |||
1048 | * Called to do any work queued up on the transmit side | 1048 | * Called to do any work queued up on the transmit side |
1049 | * that can now be done. | 1049 | * that can now be done. |
1050 | */ | 1050 | */ |
1051 | static void | 1051 | static int |
1052 | ppp_xmit_process(struct ppp *ppp) | 1052 | ppp_xmit_process(struct ppp *ppp) |
1053 | { | 1053 | { |
1054 | struct sk_buff *skb; | 1054 | struct sk_buff *skb; |
1055 | int ret = 0; | ||
1055 | 1056 | ||
1056 | ppp_xmit_lock(ppp); | 1057 | ppp_xmit_lock(ppp); |
1057 | if (!ppp->closing) { | 1058 | if (!ppp->closing) { |
@@ -1061,10 +1062,13 @@ ppp_xmit_process(struct ppp *ppp) | |||
1061 | ppp_send_frame(ppp, skb); | 1062 | ppp_send_frame(ppp, skb); |
1062 | /* If there's no work left to do, tell the core net | 1063 | /* If there's no work left to do, tell the core net |
1063 | code that we can accept some more. */ | 1064 | code that we can accept some more. */ |
1064 | if (!ppp->xmit_pending && !skb_peek(&ppp->file.xq)) | 1065 | if (!ppp->xmit_pending && !skb_peek(&ppp->file.xq)) { |
1065 | netif_wake_queue(ppp->dev); | 1066 | netif_wake_queue(ppp->dev); |
1067 | ret = 1; | ||
1068 | } | ||
1066 | } | 1069 | } |
1067 | ppp_xmit_unlock(ppp); | 1070 | ppp_xmit_unlock(ppp); |
1071 | return ret; | ||
1068 | } | 1072 | } |
1069 | 1073 | ||
1070 | static inline struct sk_buff * | 1074 | static inline struct sk_buff * |
diff --git a/drivers/net/wimax/i2400m/debugfs.c b/drivers/net/wimax/i2400m/debugfs.c index 129ba36bd04d..4b66ab1d0e5c 100644 --- a/drivers/net/wimax/i2400m/debugfs.c +++ b/drivers/net/wimax/i2400m/debugfs.c | |||
@@ -53,17 +53,6 @@ struct dentry *debugfs_create_netdev_queue_stopped( | |||
53 | &fops_netdev_queue_stopped); | 53 | &fops_netdev_queue_stopped); |
54 | } | 54 | } |
55 | 55 | ||
56 | |||
57 | /* | ||
58 | * inode->i_private has the @data argument to debugfs_create_file() | ||
59 | */ | ||
60 | static | ||
61 | int i2400m_stats_open(struct inode *inode, struct file *filp) | ||
62 | { | ||
63 | filp->private_data = inode->i_private; | ||
64 | return 0; | ||
65 | } | ||
66 | |||
67 | /* | 56 | /* |
68 | * We don't allow partial reads of this file, as then the reader would | 57 | * We don't allow partial reads of this file, as then the reader would |
69 | * get weirdly confused data as it is updated. | 58 | * get weirdly confused data as it is updated. |
@@ -117,7 +106,7 @@ ssize_t i2400m_rx_stats_write(struct file *filp, const char __user *buffer, | |||
117 | static | 106 | static |
118 | const struct file_operations i2400m_rx_stats_fops = { | 107 | const struct file_operations i2400m_rx_stats_fops = { |
119 | .owner = THIS_MODULE, | 108 | .owner = THIS_MODULE, |
120 | .open = i2400m_stats_open, | 109 | .open = simple_open, |
121 | .read = i2400m_rx_stats_read, | 110 | .read = i2400m_rx_stats_read, |
122 | .write = i2400m_rx_stats_write, | 111 | .write = i2400m_rx_stats_write, |
123 | .llseek = default_llseek, | 112 | .llseek = default_llseek, |
@@ -170,7 +159,7 @@ ssize_t i2400m_tx_stats_write(struct file *filp, const char __user *buffer, | |||
170 | static | 159 | static |
171 | const struct file_operations i2400m_tx_stats_fops = { | 160 | const struct file_operations i2400m_tx_stats_fops = { |
172 | .owner = THIS_MODULE, | 161 | .owner = THIS_MODULE, |
173 | .open = i2400m_stats_open, | 162 | .open = simple_open, |
174 | .read = i2400m_tx_stats_read, | 163 | .read = i2400m_tx_stats_read, |
175 | .write = i2400m_tx_stats_write, | 164 | .write = i2400m_tx_stats_write, |
176 | .llseek = default_llseek, | 165 | .llseek = default_llseek, |
diff --git a/drivers/net/wireless/ath/ath5k/debug.c b/drivers/net/wireless/ath/ath5k/debug.c index 8c5ce8b0c734..e5e8f45d86ac 100644 --- a/drivers/net/wireless/ath/ath5k/debug.c +++ b/drivers/net/wireless/ath/ath5k/debug.c | |||
@@ -71,13 +71,6 @@ static unsigned int ath5k_debug; | |||
71 | module_param_named(debug, ath5k_debug, uint, 0); | 71 | module_param_named(debug, ath5k_debug, uint, 0); |
72 | 72 | ||
73 | 73 | ||
74 | static int ath5k_debugfs_open(struct inode *inode, struct file *file) | ||
75 | { | ||
76 | file->private_data = inode->i_private; | ||
77 | return 0; | ||
78 | } | ||
79 | |||
80 | |||
81 | /* debugfs: registers */ | 74 | /* debugfs: registers */ |
82 | 75 | ||
83 | struct reg { | 76 | struct reg { |
@@ -265,7 +258,7 @@ static ssize_t write_file_beacon(struct file *file, | |||
265 | static const struct file_operations fops_beacon = { | 258 | static const struct file_operations fops_beacon = { |
266 | .read = read_file_beacon, | 259 | .read = read_file_beacon, |
267 | .write = write_file_beacon, | 260 | .write = write_file_beacon, |
268 | .open = ath5k_debugfs_open, | 261 | .open = simple_open, |
269 | .owner = THIS_MODULE, | 262 | .owner = THIS_MODULE, |
270 | .llseek = default_llseek, | 263 | .llseek = default_llseek, |
271 | }; | 264 | }; |
@@ -285,7 +278,7 @@ static ssize_t write_file_reset(struct file *file, | |||
285 | 278 | ||
286 | static const struct file_operations fops_reset = { | 279 | static const struct file_operations fops_reset = { |
287 | .write = write_file_reset, | 280 | .write = write_file_reset, |
288 | .open = ath5k_debugfs_open, | 281 | .open = simple_open, |
289 | .owner = THIS_MODULE, | 282 | .owner = THIS_MODULE, |
290 | .llseek = noop_llseek, | 283 | .llseek = noop_llseek, |
291 | }; | 284 | }; |
@@ -365,7 +358,7 @@ static ssize_t write_file_debug(struct file *file, | |||
365 | static const struct file_operations fops_debug = { | 358 | static const struct file_operations fops_debug = { |
366 | .read = read_file_debug, | 359 | .read = read_file_debug, |
367 | .write = write_file_debug, | 360 | .write = write_file_debug, |
368 | .open = ath5k_debugfs_open, | 361 | .open = simple_open, |
369 | .owner = THIS_MODULE, | 362 | .owner = THIS_MODULE, |
370 | .llseek = default_llseek, | 363 | .llseek = default_llseek, |
371 | }; | 364 | }; |
@@ -477,7 +470,7 @@ static ssize_t write_file_antenna(struct file *file, | |||
477 | static const struct file_operations fops_antenna = { | 470 | static const struct file_operations fops_antenna = { |
478 | .read = read_file_antenna, | 471 | .read = read_file_antenna, |
479 | .write = write_file_antenna, | 472 | .write = write_file_antenna, |
480 | .open = ath5k_debugfs_open, | 473 | .open = simple_open, |
481 | .owner = THIS_MODULE, | 474 | .owner = THIS_MODULE, |
482 | .llseek = default_llseek, | 475 | .llseek = default_llseek, |
483 | }; | 476 | }; |
@@ -532,7 +525,7 @@ static ssize_t read_file_misc(struct file *file, char __user *user_buf, | |||
532 | 525 | ||
533 | static const struct file_operations fops_misc = { | 526 | static const struct file_operations fops_misc = { |
534 | .read = read_file_misc, | 527 | .read = read_file_misc, |
535 | .open = ath5k_debugfs_open, | 528 | .open = simple_open, |
536 | .owner = THIS_MODULE, | 529 | .owner = THIS_MODULE, |
537 | }; | 530 | }; |
538 | 531 | ||
@@ -647,7 +640,7 @@ static ssize_t write_file_frameerrors(struct file *file, | |||
647 | static const struct file_operations fops_frameerrors = { | 640 | static const struct file_operations fops_frameerrors = { |
648 | .read = read_file_frameerrors, | 641 | .read = read_file_frameerrors, |
649 | .write = write_file_frameerrors, | 642 | .write = write_file_frameerrors, |
650 | .open = ath5k_debugfs_open, | 643 | .open = simple_open, |
651 | .owner = THIS_MODULE, | 644 | .owner = THIS_MODULE, |
652 | .llseek = default_llseek, | 645 | .llseek = default_llseek, |
653 | }; | 646 | }; |
@@ -810,7 +803,7 @@ static ssize_t write_file_ani(struct file *file, | |||
810 | static const struct file_operations fops_ani = { | 803 | static const struct file_operations fops_ani = { |
811 | .read = read_file_ani, | 804 | .read = read_file_ani, |
812 | .write = write_file_ani, | 805 | .write = write_file_ani, |
813 | .open = ath5k_debugfs_open, | 806 | .open = simple_open, |
814 | .owner = THIS_MODULE, | 807 | .owner = THIS_MODULE, |
815 | .llseek = default_llseek, | 808 | .llseek = default_llseek, |
816 | }; | 809 | }; |
@@ -881,7 +874,7 @@ static ssize_t write_file_queue(struct file *file, | |||
881 | static const struct file_operations fops_queue = { | 874 | static const struct file_operations fops_queue = { |
882 | .read = read_file_queue, | 875 | .read = read_file_queue, |
883 | .write = write_file_queue, | 876 | .write = write_file_queue, |
884 | .open = ath5k_debugfs_open, | 877 | .open = simple_open, |
885 | .owner = THIS_MODULE, | 878 | .owner = THIS_MODULE, |
886 | .llseek = default_llseek, | 879 | .llseek = default_llseek, |
887 | }; | 880 | }; |
diff --git a/drivers/net/wireless/ath/ath6kl/debug.c b/drivers/net/wireless/ath/ath6kl/debug.c index 552adb3f80d0..d01403a263ff 100644 --- a/drivers/net/wireless/ath/ath6kl/debug.c +++ b/drivers/net/wireless/ath/ath6kl/debug.c | |||
@@ -217,12 +217,6 @@ void dump_cred_dist_stats(struct htc_target *target) | |||
217 | target->credit_info->cur_free_credits); | 217 | target->credit_info->cur_free_credits); |
218 | } | 218 | } |
219 | 219 | ||
220 | static int ath6kl_debugfs_open(struct inode *inode, struct file *file) | ||
221 | { | ||
222 | file->private_data = inode->i_private; | ||
223 | return 0; | ||
224 | } | ||
225 | |||
226 | void ath6kl_debug_war(struct ath6kl *ar, enum ath6kl_war war) | 220 | void ath6kl_debug_war(struct ath6kl *ar, enum ath6kl_war war) |
227 | { | 221 | { |
228 | switch (war) { | 222 | switch (war) { |
@@ -263,7 +257,7 @@ static ssize_t read_file_war_stats(struct file *file, char __user *user_buf, | |||
263 | 257 | ||
264 | static const struct file_operations fops_war_stats = { | 258 | static const struct file_operations fops_war_stats = { |
265 | .read = read_file_war_stats, | 259 | .read = read_file_war_stats, |
266 | .open = ath6kl_debugfs_open, | 260 | .open = simple_open, |
267 | .owner = THIS_MODULE, | 261 | .owner = THIS_MODULE, |
268 | .llseek = default_llseek, | 262 | .llseek = default_llseek, |
269 | }; | 263 | }; |
@@ -488,7 +482,7 @@ static ssize_t ath6kl_fwlog_mask_write(struct file *file, | |||
488 | } | 482 | } |
489 | 483 | ||
490 | static const struct file_operations fops_fwlog_mask = { | 484 | static const struct file_operations fops_fwlog_mask = { |
491 | .open = ath6kl_debugfs_open, | 485 | .open = simple_open, |
492 | .read = ath6kl_fwlog_mask_read, | 486 | .read = ath6kl_fwlog_mask_read, |
493 | .write = ath6kl_fwlog_mask_write, | 487 | .write = ath6kl_fwlog_mask_write, |
494 | .owner = THIS_MODULE, | 488 | .owner = THIS_MODULE, |
@@ -634,7 +628,7 @@ static ssize_t read_file_tgt_stats(struct file *file, char __user *user_buf, | |||
634 | 628 | ||
635 | static const struct file_operations fops_tgt_stats = { | 629 | static const struct file_operations fops_tgt_stats = { |
636 | .read = read_file_tgt_stats, | 630 | .read = read_file_tgt_stats, |
637 | .open = ath6kl_debugfs_open, | 631 | .open = simple_open, |
638 | .owner = THIS_MODULE, | 632 | .owner = THIS_MODULE, |
639 | .llseek = default_llseek, | 633 | .llseek = default_llseek, |
640 | }; | 634 | }; |
@@ -699,7 +693,7 @@ static ssize_t read_file_credit_dist_stats(struct file *file, | |||
699 | 693 | ||
700 | static const struct file_operations fops_credit_dist_stats = { | 694 | static const struct file_operations fops_credit_dist_stats = { |
701 | .read = read_file_credit_dist_stats, | 695 | .read = read_file_credit_dist_stats, |
702 | .open = ath6kl_debugfs_open, | 696 | .open = simple_open, |
703 | .owner = THIS_MODULE, | 697 | .owner = THIS_MODULE, |
704 | .llseek = default_llseek, | 698 | .llseek = default_llseek, |
705 | }; | 699 | }; |
@@ -802,7 +796,7 @@ static ssize_t ath6kl_endpoint_stats_write(struct file *file, | |||
802 | } | 796 | } |
803 | 797 | ||
804 | static const struct file_operations fops_endpoint_stats = { | 798 | static const struct file_operations fops_endpoint_stats = { |
805 | .open = ath6kl_debugfs_open, | 799 | .open = simple_open, |
806 | .read = ath6kl_endpoint_stats_read, | 800 | .read = ath6kl_endpoint_stats_read, |
807 | .write = ath6kl_endpoint_stats_write, | 801 | .write = ath6kl_endpoint_stats_write, |
808 | .owner = THIS_MODULE, | 802 | .owner = THIS_MODULE, |
@@ -875,7 +869,7 @@ static ssize_t ath6kl_regread_write(struct file *file, | |||
875 | static const struct file_operations fops_diag_reg_read = { | 869 | static const struct file_operations fops_diag_reg_read = { |
876 | .read = ath6kl_regread_read, | 870 | .read = ath6kl_regread_read, |
877 | .write = ath6kl_regread_write, | 871 | .write = ath6kl_regread_write, |
878 | .open = ath6kl_debugfs_open, | 872 | .open = simple_open, |
879 | .owner = THIS_MODULE, | 873 | .owner = THIS_MODULE, |
880 | .llseek = default_llseek, | 874 | .llseek = default_llseek, |
881 | }; | 875 | }; |
@@ -999,7 +993,7 @@ static ssize_t ath6kl_lrssi_roam_read(struct file *file, | |||
999 | static const struct file_operations fops_lrssi_roam_threshold = { | 993 | static const struct file_operations fops_lrssi_roam_threshold = { |
1000 | .read = ath6kl_lrssi_roam_read, | 994 | .read = ath6kl_lrssi_roam_read, |
1001 | .write = ath6kl_lrssi_roam_write, | 995 | .write = ath6kl_lrssi_roam_write, |
1002 | .open = ath6kl_debugfs_open, | 996 | .open = simple_open, |
1003 | .owner = THIS_MODULE, | 997 | .owner = THIS_MODULE, |
1004 | .llseek = default_llseek, | 998 | .llseek = default_llseek, |
1005 | }; | 999 | }; |
@@ -1061,7 +1055,7 @@ static ssize_t ath6kl_regwrite_write(struct file *file, | |||
1061 | static const struct file_operations fops_diag_reg_write = { | 1055 | static const struct file_operations fops_diag_reg_write = { |
1062 | .read = ath6kl_regwrite_read, | 1056 | .read = ath6kl_regwrite_read, |
1063 | .write = ath6kl_regwrite_write, | 1057 | .write = ath6kl_regwrite_write, |
1064 | .open = ath6kl_debugfs_open, | 1058 | .open = simple_open, |
1065 | .owner = THIS_MODULE, | 1059 | .owner = THIS_MODULE, |
1066 | .llseek = default_llseek, | 1060 | .llseek = default_llseek, |
1067 | }; | 1061 | }; |
@@ -1166,7 +1160,7 @@ static ssize_t ath6kl_roam_table_read(struct file *file, char __user *user_buf, | |||
1166 | 1160 | ||
1167 | static const struct file_operations fops_roam_table = { | 1161 | static const struct file_operations fops_roam_table = { |
1168 | .read = ath6kl_roam_table_read, | 1162 | .read = ath6kl_roam_table_read, |
1169 | .open = ath6kl_debugfs_open, | 1163 | .open = simple_open, |
1170 | .owner = THIS_MODULE, | 1164 | .owner = THIS_MODULE, |
1171 | .llseek = default_llseek, | 1165 | .llseek = default_llseek, |
1172 | }; | 1166 | }; |
@@ -1204,7 +1198,7 @@ static ssize_t ath6kl_force_roam_write(struct file *file, | |||
1204 | 1198 | ||
1205 | static const struct file_operations fops_force_roam = { | 1199 | static const struct file_operations fops_force_roam = { |
1206 | .write = ath6kl_force_roam_write, | 1200 | .write = ath6kl_force_roam_write, |
1207 | .open = ath6kl_debugfs_open, | 1201 | .open = simple_open, |
1208 | .owner = THIS_MODULE, | 1202 | .owner = THIS_MODULE, |
1209 | .llseek = default_llseek, | 1203 | .llseek = default_llseek, |
1210 | }; | 1204 | }; |
@@ -1244,7 +1238,7 @@ static ssize_t ath6kl_roam_mode_write(struct file *file, | |||
1244 | 1238 | ||
1245 | static const struct file_operations fops_roam_mode = { | 1239 | static const struct file_operations fops_roam_mode = { |
1246 | .write = ath6kl_roam_mode_write, | 1240 | .write = ath6kl_roam_mode_write, |
1247 | .open = ath6kl_debugfs_open, | 1241 | .open = simple_open, |
1248 | .owner = THIS_MODULE, | 1242 | .owner = THIS_MODULE, |
1249 | .llseek = default_llseek, | 1243 | .llseek = default_llseek, |
1250 | }; | 1244 | }; |
@@ -1286,7 +1280,7 @@ static ssize_t ath6kl_keepalive_write(struct file *file, | |||
1286 | } | 1280 | } |
1287 | 1281 | ||
1288 | static const struct file_operations fops_keepalive = { | 1282 | static const struct file_operations fops_keepalive = { |
1289 | .open = ath6kl_debugfs_open, | 1283 | .open = simple_open, |
1290 | .read = ath6kl_keepalive_read, | 1284 | .read = ath6kl_keepalive_read, |
1291 | .write = ath6kl_keepalive_write, | 1285 | .write = ath6kl_keepalive_write, |
1292 | .owner = THIS_MODULE, | 1286 | .owner = THIS_MODULE, |
@@ -1331,7 +1325,7 @@ static ssize_t ath6kl_disconnect_timeout_write(struct file *file, | |||
1331 | } | 1325 | } |
1332 | 1326 | ||
1333 | static const struct file_operations fops_disconnect_timeout = { | 1327 | static const struct file_operations fops_disconnect_timeout = { |
1334 | .open = ath6kl_debugfs_open, | 1328 | .open = simple_open, |
1335 | .read = ath6kl_disconnect_timeout_read, | 1329 | .read = ath6kl_disconnect_timeout_read, |
1336 | .write = ath6kl_disconnect_timeout_write, | 1330 | .write = ath6kl_disconnect_timeout_write, |
1337 | .owner = THIS_MODULE, | 1331 | .owner = THIS_MODULE, |
@@ -1512,7 +1506,7 @@ static ssize_t ath6kl_create_qos_write(struct file *file, | |||
1512 | 1506 | ||
1513 | static const struct file_operations fops_create_qos = { | 1507 | static const struct file_operations fops_create_qos = { |
1514 | .write = ath6kl_create_qos_write, | 1508 | .write = ath6kl_create_qos_write, |
1515 | .open = ath6kl_debugfs_open, | 1509 | .open = simple_open, |
1516 | .owner = THIS_MODULE, | 1510 | .owner = THIS_MODULE, |
1517 | .llseek = default_llseek, | 1511 | .llseek = default_llseek, |
1518 | }; | 1512 | }; |
@@ -1560,7 +1554,7 @@ static ssize_t ath6kl_delete_qos_write(struct file *file, | |||
1560 | 1554 | ||
1561 | static const struct file_operations fops_delete_qos = { | 1555 | static const struct file_operations fops_delete_qos = { |
1562 | .write = ath6kl_delete_qos_write, | 1556 | .write = ath6kl_delete_qos_write, |
1563 | .open = ath6kl_debugfs_open, | 1557 | .open = simple_open, |
1564 | .owner = THIS_MODULE, | 1558 | .owner = THIS_MODULE, |
1565 | .llseek = default_llseek, | 1559 | .llseek = default_llseek, |
1566 | }; | 1560 | }; |
@@ -1593,7 +1587,7 @@ static ssize_t ath6kl_bgscan_int_write(struct file *file, | |||
1593 | 1587 | ||
1594 | static const struct file_operations fops_bgscan_int = { | 1588 | static const struct file_operations fops_bgscan_int = { |
1595 | .write = ath6kl_bgscan_int_write, | 1589 | .write = ath6kl_bgscan_int_write, |
1596 | .open = ath6kl_debugfs_open, | 1590 | .open = simple_open, |
1597 | .owner = THIS_MODULE, | 1591 | .owner = THIS_MODULE, |
1598 | .llseek = default_llseek, | 1592 | .llseek = default_llseek, |
1599 | }; | 1593 | }; |
@@ -1651,7 +1645,7 @@ static ssize_t ath6kl_listen_int_read(struct file *file, | |||
1651 | static const struct file_operations fops_listen_int = { | 1645 | static const struct file_operations fops_listen_int = { |
1652 | .read = ath6kl_listen_int_read, | 1646 | .read = ath6kl_listen_int_read, |
1653 | .write = ath6kl_listen_int_write, | 1647 | .write = ath6kl_listen_int_write, |
1654 | .open = ath6kl_debugfs_open, | 1648 | .open = simple_open, |
1655 | .owner = THIS_MODULE, | 1649 | .owner = THIS_MODULE, |
1656 | .llseek = default_llseek, | 1650 | .llseek = default_llseek, |
1657 | }; | 1651 | }; |
@@ -1711,7 +1705,7 @@ static ssize_t ath6kl_power_params_write(struct file *file, | |||
1711 | 1705 | ||
1712 | static const struct file_operations fops_power_params = { | 1706 | static const struct file_operations fops_power_params = { |
1713 | .write = ath6kl_power_params_write, | 1707 | .write = ath6kl_power_params_write, |
1714 | .open = ath6kl_debugfs_open, | 1708 | .open = simple_open, |
1715 | .owner = THIS_MODULE, | 1709 | .owner = THIS_MODULE, |
1716 | .llseek = default_llseek, | 1710 | .llseek = default_llseek, |
1717 | }; | 1711 | }; |
diff --git a/drivers/net/wireless/ath/ath9k/debug.c b/drivers/net/wireless/ath/ath9k/debug.c index 35d1c8e91d1c..ff47b32ecaf4 100644 --- a/drivers/net/wireless/ath/ath9k/debug.c +++ b/drivers/net/wireless/ath/ath9k/debug.c | |||
@@ -26,11 +26,6 @@ | |||
26 | #define REG_READ_D(_ah, _reg) \ | 26 | #define REG_READ_D(_ah, _reg) \ |
27 | ath9k_hw_common(_ah)->ops->read((_ah), (_reg)) | 27 | ath9k_hw_common(_ah)->ops->read((_ah), (_reg)) |
28 | 28 | ||
29 | static int ath9k_debugfs_open(struct inode *inode, struct file *file) | ||
30 | { | ||
31 | file->private_data = inode->i_private; | ||
32 | return 0; | ||
33 | } | ||
34 | 29 | ||
35 | static ssize_t ath9k_debugfs_read_buf(struct file *file, char __user *user_buf, | 30 | static ssize_t ath9k_debugfs_read_buf(struct file *file, char __user *user_buf, |
36 | size_t count, loff_t *ppos) | 31 | size_t count, loff_t *ppos) |
@@ -83,7 +78,7 @@ static ssize_t write_file_debug(struct file *file, const char __user *user_buf, | |||
83 | static const struct file_operations fops_debug = { | 78 | static const struct file_operations fops_debug = { |
84 | .read = read_file_debug, | 79 | .read = read_file_debug, |
85 | .write = write_file_debug, | 80 | .write = write_file_debug, |
86 | .open = ath9k_debugfs_open, | 81 | .open = simple_open, |
87 | .owner = THIS_MODULE, | 82 | .owner = THIS_MODULE, |
88 | .llseek = default_llseek, | 83 | .llseek = default_llseek, |
89 | }; | 84 | }; |
@@ -129,7 +124,7 @@ static ssize_t write_file_tx_chainmask(struct file *file, const char __user *use | |||
129 | static const struct file_operations fops_tx_chainmask = { | 124 | static const struct file_operations fops_tx_chainmask = { |
130 | .read = read_file_tx_chainmask, | 125 | .read = read_file_tx_chainmask, |
131 | .write = write_file_tx_chainmask, | 126 | .write = write_file_tx_chainmask, |
132 | .open = ath9k_debugfs_open, | 127 | .open = simple_open, |
133 | .owner = THIS_MODULE, | 128 | .owner = THIS_MODULE, |
134 | .llseek = default_llseek, | 129 | .llseek = default_llseek, |
135 | }; | 130 | }; |
@@ -172,7 +167,7 @@ static ssize_t write_file_rx_chainmask(struct file *file, const char __user *use | |||
172 | static const struct file_operations fops_rx_chainmask = { | 167 | static const struct file_operations fops_rx_chainmask = { |
173 | .read = read_file_rx_chainmask, | 168 | .read = read_file_rx_chainmask, |
174 | .write = write_file_rx_chainmask, | 169 | .write = write_file_rx_chainmask, |
175 | .open = ath9k_debugfs_open, | 170 | .open = simple_open, |
176 | .owner = THIS_MODULE, | 171 | .owner = THIS_MODULE, |
177 | .llseek = default_llseek, | 172 | .llseek = default_llseek, |
178 | }; | 173 | }; |
@@ -223,7 +218,7 @@ static ssize_t write_file_disable_ani(struct file *file, | |||
223 | static const struct file_operations fops_disable_ani = { | 218 | static const struct file_operations fops_disable_ani = { |
224 | .read = read_file_disable_ani, | 219 | .read = read_file_disable_ani, |
225 | .write = write_file_disable_ani, | 220 | .write = write_file_disable_ani, |
226 | .open = ath9k_debugfs_open, | 221 | .open = simple_open, |
227 | .owner = THIS_MODULE, | 222 | .owner = THIS_MODULE, |
228 | .llseek = default_llseek, | 223 | .llseek = default_llseek, |
229 | }; | 224 | }; |
@@ -324,7 +319,7 @@ static ssize_t read_file_dma(struct file *file, char __user *user_buf, | |||
324 | 319 | ||
325 | static const struct file_operations fops_dma = { | 320 | static const struct file_operations fops_dma = { |
326 | .read = read_file_dma, | 321 | .read = read_file_dma, |
327 | .open = ath9k_debugfs_open, | 322 | .open = simple_open, |
328 | .owner = THIS_MODULE, | 323 | .owner = THIS_MODULE, |
329 | .llseek = default_llseek, | 324 | .llseek = default_llseek, |
330 | }; | 325 | }; |
@@ -446,7 +441,7 @@ static ssize_t read_file_interrupt(struct file *file, char __user *user_buf, | |||
446 | 441 | ||
447 | static const struct file_operations fops_interrupt = { | 442 | static const struct file_operations fops_interrupt = { |
448 | .read = read_file_interrupt, | 443 | .read = read_file_interrupt, |
449 | .open = ath9k_debugfs_open, | 444 | .open = simple_open, |
450 | .owner = THIS_MODULE, | 445 | .owner = THIS_MODULE, |
451 | .llseek = default_llseek, | 446 | .llseek = default_llseek, |
452 | }; | 447 | }; |
@@ -852,28 +847,28 @@ void ath_debug_stat_tx(struct ath_softc *sc, struct ath_buf *bf, | |||
852 | 847 | ||
853 | static const struct file_operations fops_xmit = { | 848 | static const struct file_operations fops_xmit = { |
854 | .read = read_file_xmit, | 849 | .read = read_file_xmit, |
855 | .open = ath9k_debugfs_open, | 850 | .open = simple_open, |
856 | .owner = THIS_MODULE, | 851 | .owner = THIS_MODULE, |
857 | .llseek = default_llseek, | 852 | .llseek = default_llseek, |
858 | }; | 853 | }; |
859 | 854 | ||
860 | static const struct file_operations fops_stations = { | 855 | static const struct file_operations fops_stations = { |
861 | .read = read_file_stations, | 856 | .read = read_file_stations, |
862 | .open = ath9k_debugfs_open, | 857 | .open = simple_open, |
863 | .owner = THIS_MODULE, | 858 | .owner = THIS_MODULE, |
864 | .llseek = default_llseek, | 859 | .llseek = default_llseek, |
865 | }; | 860 | }; |
866 | 861 | ||
867 | static const struct file_operations fops_misc = { | 862 | static const struct file_operations fops_misc = { |
868 | .read = read_file_misc, | 863 | .read = read_file_misc, |
869 | .open = ath9k_debugfs_open, | 864 | .open = simple_open, |
870 | .owner = THIS_MODULE, | 865 | .owner = THIS_MODULE, |
871 | .llseek = default_llseek, | 866 | .llseek = default_llseek, |
872 | }; | 867 | }; |
873 | 868 | ||
874 | static const struct file_operations fops_reset = { | 869 | static const struct file_operations fops_reset = { |
875 | .read = read_file_reset, | 870 | .read = read_file_reset, |
876 | .open = ath9k_debugfs_open, | 871 | .open = simple_open, |
877 | .owner = THIS_MODULE, | 872 | .owner = THIS_MODULE, |
878 | .llseek = default_llseek, | 873 | .llseek = default_llseek, |
879 | }; | 874 | }; |
@@ -1016,7 +1011,7 @@ void ath_debug_stat_rx(struct ath_softc *sc, struct ath_rx_status *rs) | |||
1016 | 1011 | ||
1017 | static const struct file_operations fops_recv = { | 1012 | static const struct file_operations fops_recv = { |
1018 | .read = read_file_recv, | 1013 | .read = read_file_recv, |
1019 | .open = ath9k_debugfs_open, | 1014 | .open = simple_open, |
1020 | .owner = THIS_MODULE, | 1015 | .owner = THIS_MODULE, |
1021 | .llseek = default_llseek, | 1016 | .llseek = default_llseek, |
1022 | }; | 1017 | }; |
@@ -1055,7 +1050,7 @@ static ssize_t write_file_regidx(struct file *file, const char __user *user_buf, | |||
1055 | static const struct file_operations fops_regidx = { | 1050 | static const struct file_operations fops_regidx = { |
1056 | .read = read_file_regidx, | 1051 | .read = read_file_regidx, |
1057 | .write = write_file_regidx, | 1052 | .write = write_file_regidx, |
1058 | .open = ath9k_debugfs_open, | 1053 | .open = simple_open, |
1059 | .owner = THIS_MODULE, | 1054 | .owner = THIS_MODULE, |
1060 | .llseek = default_llseek, | 1055 | .llseek = default_llseek, |
1061 | }; | 1056 | }; |
@@ -1102,7 +1097,7 @@ static ssize_t write_file_regval(struct file *file, const char __user *user_buf, | |||
1102 | static const struct file_operations fops_regval = { | 1097 | static const struct file_operations fops_regval = { |
1103 | .read = read_file_regval, | 1098 | .read = read_file_regval, |
1104 | .write = write_file_regval, | 1099 | .write = write_file_regval, |
1105 | .open = ath9k_debugfs_open, | 1100 | .open = simple_open, |
1106 | .owner = THIS_MODULE, | 1101 | .owner = THIS_MODULE, |
1107 | .llseek = default_llseek, | 1102 | .llseek = default_llseek, |
1108 | }; | 1103 | }; |
@@ -1191,7 +1186,7 @@ static ssize_t read_file_dump_nfcal(struct file *file, char __user *user_buf, | |||
1191 | 1186 | ||
1192 | static const struct file_operations fops_dump_nfcal = { | 1187 | static const struct file_operations fops_dump_nfcal = { |
1193 | .read = read_file_dump_nfcal, | 1188 | .read = read_file_dump_nfcal, |
1194 | .open = ath9k_debugfs_open, | 1189 | .open = simple_open, |
1195 | .owner = THIS_MODULE, | 1190 | .owner = THIS_MODULE, |
1196 | .llseek = default_llseek, | 1191 | .llseek = default_llseek, |
1197 | }; | 1192 | }; |
@@ -1219,7 +1214,7 @@ static ssize_t read_file_base_eeprom(struct file *file, char __user *user_buf, | |||
1219 | 1214 | ||
1220 | static const struct file_operations fops_base_eeprom = { | 1215 | static const struct file_operations fops_base_eeprom = { |
1221 | .read = read_file_base_eeprom, | 1216 | .read = read_file_base_eeprom, |
1222 | .open = ath9k_debugfs_open, | 1217 | .open = simple_open, |
1223 | .owner = THIS_MODULE, | 1218 | .owner = THIS_MODULE, |
1224 | .llseek = default_llseek, | 1219 | .llseek = default_llseek, |
1225 | }; | 1220 | }; |
@@ -1247,7 +1242,7 @@ static ssize_t read_file_modal_eeprom(struct file *file, char __user *user_buf, | |||
1247 | 1242 | ||
1248 | static const struct file_operations fops_modal_eeprom = { | 1243 | static const struct file_operations fops_modal_eeprom = { |
1249 | .read = read_file_modal_eeprom, | 1244 | .read = read_file_modal_eeprom, |
1250 | .open = ath9k_debugfs_open, | 1245 | .open = simple_open, |
1251 | .owner = THIS_MODULE, | 1246 | .owner = THIS_MODULE, |
1252 | .llseek = default_llseek, | 1247 | .llseek = default_llseek, |
1253 | }; | 1248 | }; |
diff --git a/drivers/net/wireless/ath/ath9k/dfs_debug.c b/drivers/net/wireless/ath/ath9k/dfs_debug.c index 106d031d834a..4364c103ed33 100644 --- a/drivers/net/wireless/ath/ath9k/dfs_debug.c +++ b/drivers/net/wireless/ath/ath9k/dfs_debug.c | |||
@@ -60,16 +60,9 @@ static ssize_t read_file_dfs(struct file *file, char __user *user_buf, | |||
60 | return retval; | 60 | return retval; |
61 | } | 61 | } |
62 | 62 | ||
63 | static int ath9k_dfs_debugfs_open(struct inode *inode, struct file *file) | ||
64 | { | ||
65 | file->private_data = inode->i_private; | ||
66 | |||
67 | return 0; | ||
68 | } | ||
69 | |||
70 | static const struct file_operations fops_dfs_stats = { | 63 | static const struct file_operations fops_dfs_stats = { |
71 | .read = read_file_dfs, | 64 | .read = read_file_dfs, |
72 | .open = ath9k_dfs_debugfs_open, | 65 | .open = simple_open, |
73 | .owner = THIS_MODULE, | 66 | .owner = THIS_MODULE, |
74 | .llseek = default_llseek, | 67 | .llseek = default_llseek, |
75 | }; | 68 | }; |
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_debug.c b/drivers/net/wireless/ath/ath9k/htc_drv_debug.c index d3ff33c71aa5..3035deb7a0cd 100644 --- a/drivers/net/wireless/ath/ath9k/htc_drv_debug.c +++ b/drivers/net/wireless/ath/ath9k/htc_drv_debug.c | |||
@@ -16,12 +16,6 @@ | |||
16 | 16 | ||
17 | #include "htc.h" | 17 | #include "htc.h" |
18 | 18 | ||
19 | static int ath9k_debugfs_open(struct inode *inode, struct file *file) | ||
20 | { | ||
21 | file->private_data = inode->i_private; | ||
22 | return 0; | ||
23 | } | ||
24 | |||
25 | static ssize_t read_file_tgt_int_stats(struct file *file, char __user *user_buf, | 19 | static ssize_t read_file_tgt_int_stats(struct file *file, char __user *user_buf, |
26 | size_t count, loff_t *ppos) | 20 | size_t count, loff_t *ppos) |
27 | { | 21 | { |
@@ -75,7 +69,7 @@ static ssize_t read_file_tgt_int_stats(struct file *file, char __user *user_buf, | |||
75 | 69 | ||
76 | static const struct file_operations fops_tgt_int_stats = { | 70 | static const struct file_operations fops_tgt_int_stats = { |
77 | .read = read_file_tgt_int_stats, | 71 | .read = read_file_tgt_int_stats, |
78 | .open = ath9k_debugfs_open, | 72 | .open = simple_open, |
79 | .owner = THIS_MODULE, | 73 | .owner = THIS_MODULE, |
80 | .llseek = default_llseek, | 74 | .llseek = default_llseek, |
81 | }; | 75 | }; |
@@ -145,7 +139,7 @@ static ssize_t read_file_tgt_tx_stats(struct file *file, char __user *user_buf, | |||
145 | 139 | ||
146 | static const struct file_operations fops_tgt_tx_stats = { | 140 | static const struct file_operations fops_tgt_tx_stats = { |
147 | .read = read_file_tgt_tx_stats, | 141 | .read = read_file_tgt_tx_stats, |
148 | .open = ath9k_debugfs_open, | 142 | .open = simple_open, |
149 | .owner = THIS_MODULE, | 143 | .owner = THIS_MODULE, |
150 | .llseek = default_llseek, | 144 | .llseek = default_llseek, |
151 | }; | 145 | }; |
@@ -191,7 +185,7 @@ static ssize_t read_file_tgt_rx_stats(struct file *file, char __user *user_buf, | |||
191 | 185 | ||
192 | static const struct file_operations fops_tgt_rx_stats = { | 186 | static const struct file_operations fops_tgt_rx_stats = { |
193 | .read = read_file_tgt_rx_stats, | 187 | .read = read_file_tgt_rx_stats, |
194 | .open = ath9k_debugfs_open, | 188 | .open = simple_open, |
195 | .owner = THIS_MODULE, | 189 | .owner = THIS_MODULE, |
196 | .llseek = default_llseek, | 190 | .llseek = default_llseek, |
197 | }; | 191 | }; |
@@ -243,7 +237,7 @@ static ssize_t read_file_xmit(struct file *file, char __user *user_buf, | |||
243 | 237 | ||
244 | static const struct file_operations fops_xmit = { | 238 | static const struct file_operations fops_xmit = { |
245 | .read = read_file_xmit, | 239 | .read = read_file_xmit, |
246 | .open = ath9k_debugfs_open, | 240 | .open = simple_open, |
247 | .owner = THIS_MODULE, | 241 | .owner = THIS_MODULE, |
248 | .llseek = default_llseek, | 242 | .llseek = default_llseek, |
249 | }; | 243 | }; |
@@ -364,7 +358,7 @@ static ssize_t read_file_recv(struct file *file, char __user *user_buf, | |||
364 | 358 | ||
365 | static const struct file_operations fops_recv = { | 359 | static const struct file_operations fops_recv = { |
366 | .read = read_file_recv, | 360 | .read = read_file_recv, |
367 | .open = ath9k_debugfs_open, | 361 | .open = simple_open, |
368 | .owner = THIS_MODULE, | 362 | .owner = THIS_MODULE, |
369 | .llseek = default_llseek, | 363 | .llseek = default_llseek, |
370 | }; | 364 | }; |
@@ -399,7 +393,7 @@ static ssize_t read_file_slot(struct file *file, char __user *user_buf, | |||
399 | 393 | ||
400 | static const struct file_operations fops_slot = { | 394 | static const struct file_operations fops_slot = { |
401 | .read = read_file_slot, | 395 | .read = read_file_slot, |
402 | .open = ath9k_debugfs_open, | 396 | .open = simple_open, |
403 | .owner = THIS_MODULE, | 397 | .owner = THIS_MODULE, |
404 | .llseek = default_llseek, | 398 | .llseek = default_llseek, |
405 | }; | 399 | }; |
@@ -446,7 +440,7 @@ static ssize_t read_file_queue(struct file *file, char __user *user_buf, | |||
446 | 440 | ||
447 | static const struct file_operations fops_queue = { | 441 | static const struct file_operations fops_queue = { |
448 | .read = read_file_queue, | 442 | .read = read_file_queue, |
449 | .open = ath9k_debugfs_open, | 443 | .open = simple_open, |
450 | .owner = THIS_MODULE, | 444 | .owner = THIS_MODULE, |
451 | .llseek = default_llseek, | 445 | .llseek = default_llseek, |
452 | }; | 446 | }; |
@@ -487,7 +481,7 @@ static ssize_t write_file_debug(struct file *file, const char __user *user_buf, | |||
487 | static const struct file_operations fops_debug = { | 481 | static const struct file_operations fops_debug = { |
488 | .read = read_file_debug, | 482 | .read = read_file_debug, |
489 | .write = write_file_debug, | 483 | .write = write_file_debug, |
490 | .open = ath9k_debugfs_open, | 484 | .open = simple_open, |
491 | .owner = THIS_MODULE, | 485 | .owner = THIS_MODULE, |
492 | .llseek = default_llseek, | 486 | .llseek = default_llseek, |
493 | }; | 487 | }; |
@@ -636,7 +630,7 @@ static ssize_t read_file_base_eeprom(struct file *file, char __user *user_buf, | |||
636 | 630 | ||
637 | static const struct file_operations fops_base_eeprom = { | 631 | static const struct file_operations fops_base_eeprom = { |
638 | .read = read_file_base_eeprom, | 632 | .read = read_file_base_eeprom, |
639 | .open = ath9k_debugfs_open, | 633 | .open = simple_open, |
640 | .owner = THIS_MODULE, | 634 | .owner = THIS_MODULE, |
641 | .llseek = default_llseek, | 635 | .llseek = default_llseek, |
642 | }; | 636 | }; |
@@ -917,7 +911,7 @@ static ssize_t read_file_modal_eeprom(struct file *file, char __user *user_buf, | |||
917 | 911 | ||
918 | static const struct file_operations fops_modal_eeprom = { | 912 | static const struct file_operations fops_modal_eeprom = { |
919 | .read = read_file_modal_eeprom, | 913 | .read = read_file_modal_eeprom, |
920 | .open = ath9k_debugfs_open, | 914 | .open = simple_open, |
921 | .owner = THIS_MODULE, | 915 | .owner = THIS_MODULE, |
922 | .llseek = default_llseek, | 916 | .llseek = default_llseek, |
923 | }; | 917 | }; |
diff --git a/drivers/net/wireless/ath/ath9k/rc.c b/drivers/net/wireless/ath/ath9k/rc.c index 4f848493fece..08bb45532701 100644 --- a/drivers/net/wireless/ath/ath9k/rc.c +++ b/drivers/net/wireless/ath/ath9k/rc.c | |||
@@ -1480,12 +1480,6 @@ static void ath_rate_update(void *priv, struct ieee80211_supported_band *sband, | |||
1480 | 1480 | ||
1481 | #ifdef CONFIG_ATH9K_DEBUGFS | 1481 | #ifdef CONFIG_ATH9K_DEBUGFS |
1482 | 1482 | ||
1483 | static int ath9k_debugfs_open(struct inode *inode, struct file *file) | ||
1484 | { | ||
1485 | file->private_data = inode->i_private; | ||
1486 | return 0; | ||
1487 | } | ||
1488 | |||
1489 | static ssize_t read_file_rcstat(struct file *file, char __user *user_buf, | 1483 | static ssize_t read_file_rcstat(struct file *file, char __user *user_buf, |
1490 | size_t count, loff_t *ppos) | 1484 | size_t count, loff_t *ppos) |
1491 | { | 1485 | { |
@@ -1553,7 +1547,7 @@ static ssize_t read_file_rcstat(struct file *file, char __user *user_buf, | |||
1553 | 1547 | ||
1554 | static const struct file_operations fops_rcstat = { | 1548 | static const struct file_operations fops_rcstat = { |
1555 | .read = read_file_rcstat, | 1549 | .read = read_file_rcstat, |
1556 | .open = ath9k_debugfs_open, | 1550 | .open = simple_open, |
1557 | .owner = THIS_MODULE | 1551 | .owner = THIS_MODULE |
1558 | }; | 1552 | }; |
1559 | 1553 | ||
diff --git a/drivers/net/wireless/ath/carl9170/debug.c b/drivers/net/wireless/ath/carl9170/debug.c index 3c164226687f..93fe6003a493 100644 --- a/drivers/net/wireless/ath/carl9170/debug.c +++ b/drivers/net/wireless/ath/carl9170/debug.c | |||
@@ -48,11 +48,6 @@ | |||
48 | #define ADD(buf, off, max, fmt, args...) \ | 48 | #define ADD(buf, off, max, fmt, args...) \ |
49 | off += snprintf(&buf[off], max - off, fmt, ##args); | 49 | off += snprintf(&buf[off], max - off, fmt, ##args); |
50 | 50 | ||
51 | static int carl9170_debugfs_open(struct inode *inode, struct file *file) | ||
52 | { | ||
53 | file->private_data = inode->i_private; | ||
54 | return 0; | ||
55 | } | ||
56 | 51 | ||
57 | struct carl9170_debugfs_fops { | 52 | struct carl9170_debugfs_fops { |
58 | unsigned int read_bufsize; | 53 | unsigned int read_bufsize; |
@@ -178,7 +173,7 @@ static const struct carl9170_debugfs_fops carl_debugfs_##name ##_ops = {\ | |||
178 | .attr = _attr, \ | 173 | .attr = _attr, \ |
179 | .req_dev_state = _dstate, \ | 174 | .req_dev_state = _dstate, \ |
180 | .fops = { \ | 175 | .fops = { \ |
181 | .open = carl9170_debugfs_open, \ | 176 | .open = simple_open, \ |
182 | .read = carl9170_debugfs_read, \ | 177 | .read = carl9170_debugfs_read, \ |
183 | .write = carl9170_debugfs_write, \ | 178 | .write = carl9170_debugfs_write, \ |
184 | .owner = THIS_MODULE \ | 179 | .owner = THIS_MODULE \ |
diff --git a/drivers/net/wireless/b43/debugfs.c b/drivers/net/wireless/b43/debugfs.c index e751fdee89b2..e807bd930647 100644 --- a/drivers/net/wireless/b43/debugfs.c +++ b/drivers/net/wireless/b43/debugfs.c | |||
@@ -500,12 +500,6 @@ out: | |||
500 | 500 | ||
501 | #undef fappend | 501 | #undef fappend |
502 | 502 | ||
503 | static int b43_debugfs_open(struct inode *inode, struct file *file) | ||
504 | { | ||
505 | file->private_data = inode->i_private; | ||
506 | return 0; | ||
507 | } | ||
508 | |||
509 | static ssize_t b43_debugfs_read(struct file *file, char __user *userbuf, | 503 | static ssize_t b43_debugfs_read(struct file *file, char __user *userbuf, |
510 | size_t count, loff_t *ppos) | 504 | size_t count, loff_t *ppos) |
511 | { | 505 | { |
@@ -624,7 +618,7 @@ out_unlock: | |||
624 | .read = _read, \ | 618 | .read = _read, \ |
625 | .write = _write, \ | 619 | .write = _write, \ |
626 | .fops = { \ | 620 | .fops = { \ |
627 | .open = b43_debugfs_open, \ | 621 | .open = simple_open, \ |
628 | .read = b43_debugfs_read, \ | 622 | .read = b43_debugfs_read, \ |
629 | .write = b43_debugfs_write, \ | 623 | .write = b43_debugfs_write, \ |
630 | .llseek = generic_file_llseek, \ | 624 | .llseek = generic_file_llseek, \ |
diff --git a/drivers/net/wireless/b43legacy/debugfs.c b/drivers/net/wireless/b43legacy/debugfs.c index 5e28ad0d6d17..1965edb765a2 100644 --- a/drivers/net/wireless/b43legacy/debugfs.c +++ b/drivers/net/wireless/b43legacy/debugfs.c | |||
@@ -197,12 +197,6 @@ static int restart_write_file(struct b43legacy_wldev *dev, const char *buf, size | |||
197 | 197 | ||
198 | #undef fappend | 198 | #undef fappend |
199 | 199 | ||
200 | static int b43legacy_debugfs_open(struct inode *inode, struct file *file) | ||
201 | { | ||
202 | file->private_data = inode->i_private; | ||
203 | return 0; | ||
204 | } | ||
205 | |||
206 | static ssize_t b43legacy_debugfs_read(struct file *file, char __user *userbuf, | 200 | static ssize_t b43legacy_debugfs_read(struct file *file, char __user *userbuf, |
207 | size_t count, loff_t *ppos) | 201 | size_t count, loff_t *ppos) |
208 | { | 202 | { |
@@ -331,7 +325,7 @@ out_unlock: | |||
331 | .read = _read, \ | 325 | .read = _read, \ |
332 | .write = _write, \ | 326 | .write = _write, \ |
333 | .fops = { \ | 327 | .fops = { \ |
334 | .open = b43legacy_debugfs_open, \ | 328 | .open = simple_open, \ |
335 | .read = b43legacy_debugfs_read, \ | 329 | .read = b43legacy_debugfs_read, \ |
336 | .write = b43legacy_debugfs_write, \ | 330 | .write = b43legacy_debugfs_write, \ |
337 | .llseek = generic_file_llseek, \ | 331 | .llseek = generic_file_llseek, \ |
diff --git a/drivers/net/wireless/iwlegacy/3945-rs.c b/drivers/net/wireless/iwlegacy/3945-rs.c index 70bee1a4d876..4b10157d8686 100644 --- a/drivers/net/wireless/iwlegacy/3945-rs.c +++ b/drivers/net/wireless/iwlegacy/3945-rs.c | |||
@@ -821,12 +821,6 @@ out: | |||
821 | } | 821 | } |
822 | 822 | ||
823 | #ifdef CONFIG_MAC80211_DEBUGFS | 823 | #ifdef CONFIG_MAC80211_DEBUGFS |
824 | static int | ||
825 | il3945_open_file_generic(struct inode *inode, struct file *file) | ||
826 | { | ||
827 | file->private_data = inode->i_private; | ||
828 | return 0; | ||
829 | } | ||
830 | 824 | ||
831 | static ssize_t | 825 | static ssize_t |
832 | il3945_sta_dbgfs_stats_table_read(struct file *file, char __user *user_buf, | 826 | il3945_sta_dbgfs_stats_table_read(struct file *file, char __user *user_buf, |
@@ -862,7 +856,7 @@ il3945_sta_dbgfs_stats_table_read(struct file *file, char __user *user_buf, | |||
862 | 856 | ||
863 | static const struct file_operations rs_sta_dbgfs_stats_table_ops = { | 857 | static const struct file_operations rs_sta_dbgfs_stats_table_ops = { |
864 | .read = il3945_sta_dbgfs_stats_table_read, | 858 | .read = il3945_sta_dbgfs_stats_table_read, |
865 | .open = il3945_open_file_generic, | 859 | .open = simple_open, |
866 | .llseek = default_llseek, | 860 | .llseek = default_llseek, |
867 | }; | 861 | }; |
868 | 862 | ||
diff --git a/drivers/net/wireless/iwlegacy/4965-rs.c b/drivers/net/wireless/iwlegacy/4965-rs.c index d7e2856e41d3..11ab1247fae1 100644 --- a/drivers/net/wireless/iwlegacy/4965-rs.c +++ b/drivers/net/wireless/iwlegacy/4965-rs.c | |||
@@ -2518,12 +2518,6 @@ il4965_rs_free_sta(void *il_r, struct ieee80211_sta *sta, void *il_sta) | |||
2518 | } | 2518 | } |
2519 | 2519 | ||
2520 | #ifdef CONFIG_MAC80211_DEBUGFS | 2520 | #ifdef CONFIG_MAC80211_DEBUGFS |
2521 | static int | ||
2522 | il4965_open_file_generic(struct inode *inode, struct file *file) | ||
2523 | { | ||
2524 | file->private_data = inode->i_private; | ||
2525 | return 0; | ||
2526 | } | ||
2527 | 2521 | ||
2528 | static void | 2522 | static void |
2529 | il4965_rs_dbgfs_set_mcs(struct il_lq_sta *lq_sta, u32 * rate_n_flags, int idx) | 2523 | il4965_rs_dbgfs_set_mcs(struct il_lq_sta *lq_sta, u32 * rate_n_flags, int idx) |
@@ -2695,7 +2689,7 @@ il4965_rs_sta_dbgfs_scale_table_read(struct file *file, char __user *user_buf, | |||
2695 | static const struct file_operations rs_sta_dbgfs_scale_table_ops = { | 2689 | static const struct file_operations rs_sta_dbgfs_scale_table_ops = { |
2696 | .write = il4965_rs_sta_dbgfs_scale_table_write, | 2690 | .write = il4965_rs_sta_dbgfs_scale_table_write, |
2697 | .read = il4965_rs_sta_dbgfs_scale_table_read, | 2691 | .read = il4965_rs_sta_dbgfs_scale_table_read, |
2698 | .open = il4965_open_file_generic, | 2692 | .open = simple_open, |
2699 | .llseek = default_llseek, | 2693 | .llseek = default_llseek, |
2700 | }; | 2694 | }; |
2701 | 2695 | ||
@@ -2740,7 +2734,7 @@ il4965_rs_sta_dbgfs_stats_table_read(struct file *file, char __user *user_buf, | |||
2740 | 2734 | ||
2741 | static const struct file_operations rs_sta_dbgfs_stats_table_ops = { | 2735 | static const struct file_operations rs_sta_dbgfs_stats_table_ops = { |
2742 | .read = il4965_rs_sta_dbgfs_stats_table_read, | 2736 | .read = il4965_rs_sta_dbgfs_stats_table_read, |
2743 | .open = il4965_open_file_generic, | 2737 | .open = simple_open, |
2744 | .llseek = default_llseek, | 2738 | .llseek = default_llseek, |
2745 | }; | 2739 | }; |
2746 | 2740 | ||
@@ -2768,7 +2762,7 @@ il4965_rs_sta_dbgfs_rate_scale_data_read(struct file *file, | |||
2768 | 2762 | ||
2769 | static const struct file_operations rs_sta_dbgfs_rate_scale_data_ops = { | 2763 | static const struct file_operations rs_sta_dbgfs_rate_scale_data_ops = { |
2770 | .read = il4965_rs_sta_dbgfs_rate_scale_data_read, | 2764 | .read = il4965_rs_sta_dbgfs_rate_scale_data_read, |
2771 | .open = il4965_open_file_generic, | 2765 | .open = simple_open, |
2772 | .llseek = default_llseek, | 2766 | .llseek = default_llseek, |
2773 | }; | 2767 | }; |
2774 | 2768 | ||
diff --git a/drivers/net/wireless/iwlegacy/debug.c b/drivers/net/wireless/iwlegacy/debug.c index 229849150aac..eff26501d60a 100644 --- a/drivers/net/wireless/iwlegacy/debug.c +++ b/drivers/net/wireless/iwlegacy/debug.c | |||
@@ -160,18 +160,12 @@ static ssize_t il_dbgfs_##name##_write(struct file *file, \ | |||
160 | const char __user *user_buf, \ | 160 | const char __user *user_buf, \ |
161 | size_t count, loff_t *ppos); | 161 | size_t count, loff_t *ppos); |
162 | 162 | ||
163 | static int | ||
164 | il_dbgfs_open_file_generic(struct inode *inode, struct file *file) | ||
165 | { | ||
166 | file->private_data = inode->i_private; | ||
167 | return 0; | ||
168 | } | ||
169 | 163 | ||
170 | #define DEBUGFS_READ_FILE_OPS(name) \ | 164 | #define DEBUGFS_READ_FILE_OPS(name) \ |
171 | DEBUGFS_READ_FUNC(name); \ | 165 | DEBUGFS_READ_FUNC(name); \ |
172 | static const struct file_operations il_dbgfs_##name##_ops = { \ | 166 | static const struct file_operations il_dbgfs_##name##_ops = { \ |
173 | .read = il_dbgfs_##name##_read, \ | 167 | .read = il_dbgfs_##name##_read, \ |
174 | .open = il_dbgfs_open_file_generic, \ | 168 | .open = simple_open, \ |
175 | .llseek = generic_file_llseek, \ | 169 | .llseek = generic_file_llseek, \ |
176 | }; | 170 | }; |
177 | 171 | ||
@@ -179,7 +173,7 @@ static const struct file_operations il_dbgfs_##name##_ops = { \ | |||
179 | DEBUGFS_WRITE_FUNC(name); \ | 173 | DEBUGFS_WRITE_FUNC(name); \ |
180 | static const struct file_operations il_dbgfs_##name##_ops = { \ | 174 | static const struct file_operations il_dbgfs_##name##_ops = { \ |
181 | .write = il_dbgfs_##name##_write, \ | 175 | .write = il_dbgfs_##name##_write, \ |
182 | .open = il_dbgfs_open_file_generic, \ | 176 | .open = simple_open, \ |
183 | .llseek = generic_file_llseek, \ | 177 | .llseek = generic_file_llseek, \ |
184 | }; | 178 | }; |
185 | 179 | ||
@@ -189,7 +183,7 @@ static const struct file_operations il_dbgfs_##name##_ops = { \ | |||
189 | static const struct file_operations il_dbgfs_##name##_ops = { \ | 183 | static const struct file_operations il_dbgfs_##name##_ops = { \ |
190 | .write = il_dbgfs_##name##_write, \ | 184 | .write = il_dbgfs_##name##_write, \ |
191 | .read = il_dbgfs_##name##_read, \ | 185 | .read = il_dbgfs_##name##_read, \ |
192 | .open = il_dbgfs_open_file_generic, \ | 186 | .open = simple_open, \ |
193 | .llseek = generic_file_llseek, \ | 187 | .llseek = generic_file_llseek, \ |
194 | }; | 188 | }; |
195 | 189 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c index 53f8c51cfcdb..7e590b349dd7 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c | |||
@@ -3083,11 +3083,6 @@ static void rs_free_sta(void *priv_r, struct ieee80211_sta *sta, | |||
3083 | } | 3083 | } |
3084 | 3084 | ||
3085 | #ifdef CONFIG_MAC80211_DEBUGFS | 3085 | #ifdef CONFIG_MAC80211_DEBUGFS |
3086 | static int open_file_generic(struct inode *inode, struct file *file) | ||
3087 | { | ||
3088 | file->private_data = inode->i_private; | ||
3089 | return 0; | ||
3090 | } | ||
3091 | static void rs_dbgfs_set_mcs(struct iwl_lq_sta *lq_sta, | 3086 | static void rs_dbgfs_set_mcs(struct iwl_lq_sta *lq_sta, |
3092 | u32 *rate_n_flags, int index) | 3087 | u32 *rate_n_flags, int index) |
3093 | { | 3088 | { |
@@ -3226,7 +3221,7 @@ static ssize_t rs_sta_dbgfs_scale_table_read(struct file *file, | |||
3226 | static const struct file_operations rs_sta_dbgfs_scale_table_ops = { | 3221 | static const struct file_operations rs_sta_dbgfs_scale_table_ops = { |
3227 | .write = rs_sta_dbgfs_scale_table_write, | 3222 | .write = rs_sta_dbgfs_scale_table_write, |
3228 | .read = rs_sta_dbgfs_scale_table_read, | 3223 | .read = rs_sta_dbgfs_scale_table_read, |
3229 | .open = open_file_generic, | 3224 | .open = simple_open, |
3230 | .llseek = default_llseek, | 3225 | .llseek = default_llseek, |
3231 | }; | 3226 | }; |
3232 | static ssize_t rs_sta_dbgfs_stats_table_read(struct file *file, | 3227 | static ssize_t rs_sta_dbgfs_stats_table_read(struct file *file, |
@@ -3269,7 +3264,7 @@ static ssize_t rs_sta_dbgfs_stats_table_read(struct file *file, | |||
3269 | 3264 | ||
3270 | static const struct file_operations rs_sta_dbgfs_stats_table_ops = { | 3265 | static const struct file_operations rs_sta_dbgfs_stats_table_ops = { |
3271 | .read = rs_sta_dbgfs_stats_table_read, | 3266 | .read = rs_sta_dbgfs_stats_table_read, |
3272 | .open = open_file_generic, | 3267 | .open = simple_open, |
3273 | .llseek = default_llseek, | 3268 | .llseek = default_llseek, |
3274 | }; | 3269 | }; |
3275 | 3270 | ||
@@ -3295,7 +3290,7 @@ static ssize_t rs_sta_dbgfs_rate_scale_data_read(struct file *file, | |||
3295 | 3290 | ||
3296 | static const struct file_operations rs_sta_dbgfs_rate_scale_data_ops = { | 3291 | static const struct file_operations rs_sta_dbgfs_rate_scale_data_ops = { |
3297 | .read = rs_sta_dbgfs_rate_scale_data_read, | 3292 | .read = rs_sta_dbgfs_rate_scale_data_read, |
3298 | .open = open_file_generic, | 3293 | .open = simple_open, |
3299 | .llseek = default_llseek, | 3294 | .llseek = default_llseek, |
3300 | }; | 3295 | }; |
3301 | 3296 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-debugfs.c b/drivers/net/wireless/iwlwifi/iwl-debugfs.c index b7b1c04f2fba..2bbaebd99ad4 100644 --- a/drivers/net/wireless/iwlwifi/iwl-debugfs.c +++ b/drivers/net/wireless/iwlwifi/iwl-debugfs.c | |||
@@ -84,17 +84,11 @@ static ssize_t iwl_dbgfs_##name##_write(struct file *file, \ | |||
84 | size_t count, loff_t *ppos); | 84 | size_t count, loff_t *ppos); |
85 | 85 | ||
86 | 86 | ||
87 | static int iwl_dbgfs_open_file_generic(struct inode *inode, struct file *file) | ||
88 | { | ||
89 | file->private_data = inode->i_private; | ||
90 | return 0; | ||
91 | } | ||
92 | |||
93 | #define DEBUGFS_READ_FILE_OPS(name) \ | 87 | #define DEBUGFS_READ_FILE_OPS(name) \ |
94 | DEBUGFS_READ_FUNC(name); \ | 88 | DEBUGFS_READ_FUNC(name); \ |
95 | static const struct file_operations iwl_dbgfs_##name##_ops = { \ | 89 | static const struct file_operations iwl_dbgfs_##name##_ops = { \ |
96 | .read = iwl_dbgfs_##name##_read, \ | 90 | .read = iwl_dbgfs_##name##_read, \ |
97 | .open = iwl_dbgfs_open_file_generic, \ | 91 | .open = simple_open, \ |
98 | .llseek = generic_file_llseek, \ | 92 | .llseek = generic_file_llseek, \ |
99 | }; | 93 | }; |
100 | 94 | ||
@@ -102,7 +96,7 @@ static const struct file_operations iwl_dbgfs_##name##_ops = { \ | |||
102 | DEBUGFS_WRITE_FUNC(name); \ | 96 | DEBUGFS_WRITE_FUNC(name); \ |
103 | static const struct file_operations iwl_dbgfs_##name##_ops = { \ | 97 | static const struct file_operations iwl_dbgfs_##name##_ops = { \ |
104 | .write = iwl_dbgfs_##name##_write, \ | 98 | .write = iwl_dbgfs_##name##_write, \ |
105 | .open = iwl_dbgfs_open_file_generic, \ | 99 | .open = simple_open, \ |
106 | .llseek = generic_file_llseek, \ | 100 | .llseek = generic_file_llseek, \ |
107 | }; | 101 | }; |
108 | 102 | ||
@@ -113,7 +107,7 @@ static const struct file_operations iwl_dbgfs_##name##_ops = { \ | |||
113 | static const struct file_operations iwl_dbgfs_##name##_ops = { \ | 107 | static const struct file_operations iwl_dbgfs_##name##_ops = { \ |
114 | .write = iwl_dbgfs_##name##_write, \ | 108 | .write = iwl_dbgfs_##name##_write, \ |
115 | .read = iwl_dbgfs_##name##_read, \ | 109 | .read = iwl_dbgfs_##name##_read, \ |
116 | .open = iwl_dbgfs_open_file_generic, \ | 110 | .open = simple_open, \ |
117 | .llseek = generic_file_llseek, \ | 111 | .llseek = generic_file_llseek, \ |
118 | }; | 112 | }; |
119 | 113 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c b/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c index b4f796c82e1e..4d7b30d3e648 100644 --- a/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c +++ b/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c | |||
@@ -1898,17 +1898,11 @@ static ssize_t iwl_dbgfs_##name##_write(struct file *file, \ | |||
1898 | size_t count, loff_t *ppos); | 1898 | size_t count, loff_t *ppos); |
1899 | 1899 | ||
1900 | 1900 | ||
1901 | static int iwl_dbgfs_open_file_generic(struct inode *inode, struct file *file) | ||
1902 | { | ||
1903 | file->private_data = inode->i_private; | ||
1904 | return 0; | ||
1905 | } | ||
1906 | |||
1907 | #define DEBUGFS_READ_FILE_OPS(name) \ | 1901 | #define DEBUGFS_READ_FILE_OPS(name) \ |
1908 | DEBUGFS_READ_FUNC(name); \ | 1902 | DEBUGFS_READ_FUNC(name); \ |
1909 | static const struct file_operations iwl_dbgfs_##name##_ops = { \ | 1903 | static const struct file_operations iwl_dbgfs_##name##_ops = { \ |
1910 | .read = iwl_dbgfs_##name##_read, \ | 1904 | .read = iwl_dbgfs_##name##_read, \ |
1911 | .open = iwl_dbgfs_open_file_generic, \ | 1905 | .open = simple_open, \ |
1912 | .llseek = generic_file_llseek, \ | 1906 | .llseek = generic_file_llseek, \ |
1913 | }; | 1907 | }; |
1914 | 1908 | ||
@@ -1916,7 +1910,7 @@ static const struct file_operations iwl_dbgfs_##name##_ops = { \ | |||
1916 | DEBUGFS_WRITE_FUNC(name); \ | 1910 | DEBUGFS_WRITE_FUNC(name); \ |
1917 | static const struct file_operations iwl_dbgfs_##name##_ops = { \ | 1911 | static const struct file_operations iwl_dbgfs_##name##_ops = { \ |
1918 | .write = iwl_dbgfs_##name##_write, \ | 1912 | .write = iwl_dbgfs_##name##_write, \ |
1919 | .open = iwl_dbgfs_open_file_generic, \ | 1913 | .open = simple_open, \ |
1920 | .llseek = generic_file_llseek, \ | 1914 | .llseek = generic_file_llseek, \ |
1921 | }; | 1915 | }; |
1922 | 1916 | ||
@@ -1926,7 +1920,7 @@ static const struct file_operations iwl_dbgfs_##name##_ops = { \ | |||
1926 | static const struct file_operations iwl_dbgfs_##name##_ops = { \ | 1920 | static const struct file_operations iwl_dbgfs_##name##_ops = { \ |
1927 | .write = iwl_dbgfs_##name##_write, \ | 1921 | .write = iwl_dbgfs_##name##_write, \ |
1928 | .read = iwl_dbgfs_##name##_read, \ | 1922 | .read = iwl_dbgfs_##name##_read, \ |
1929 | .open = iwl_dbgfs_open_file_generic, \ | 1923 | .open = simple_open, \ |
1930 | .llseek = generic_file_llseek, \ | 1924 | .llseek = generic_file_llseek, \ |
1931 | }; | 1925 | }; |
1932 | 1926 | ||
diff --git a/drivers/net/wireless/iwmc3200wifi/debugfs.c b/drivers/net/wireless/iwmc3200wifi/debugfs.c index 87eef5773a02..b6199d124bb9 100644 --- a/drivers/net/wireless/iwmc3200wifi/debugfs.c +++ b/drivers/net/wireless/iwmc3200wifi/debugfs.c | |||
@@ -99,12 +99,6 @@ DEFINE_SIMPLE_ATTRIBUTE(fops_iwm_dbg_modules, | |||
99 | iwm_debugfs_u32_read, iwm_debugfs_dbg_modules_write, | 99 | iwm_debugfs_u32_read, iwm_debugfs_dbg_modules_write, |
100 | "%llu\n"); | 100 | "%llu\n"); |
101 | 101 | ||
102 | static int iwm_generic_open(struct inode *inode, struct file *filp) | ||
103 | { | ||
104 | filp->private_data = inode->i_private; | ||
105 | return 0; | ||
106 | } | ||
107 | |||
108 | 102 | ||
109 | static ssize_t iwm_debugfs_txq_read(struct file *filp, char __user *buffer, | 103 | static ssize_t iwm_debugfs_txq_read(struct file *filp, char __user *buffer, |
110 | size_t count, loff_t *ppos) | 104 | size_t count, loff_t *ppos) |
@@ -401,28 +395,28 @@ out: | |||
401 | 395 | ||
402 | static const struct file_operations iwm_debugfs_txq_fops = { | 396 | static const struct file_operations iwm_debugfs_txq_fops = { |
403 | .owner = THIS_MODULE, | 397 | .owner = THIS_MODULE, |
404 | .open = iwm_generic_open, | 398 | .open = simple_open, |
405 | .read = iwm_debugfs_txq_read, | 399 | .read = iwm_debugfs_txq_read, |
406 | .llseek = default_llseek, | 400 | .llseek = default_llseek, |
407 | }; | 401 | }; |
408 | 402 | ||
409 | static const struct file_operations iwm_debugfs_tx_credit_fops = { | 403 | static const struct file_operations iwm_debugfs_tx_credit_fops = { |
410 | .owner = THIS_MODULE, | 404 | .owner = THIS_MODULE, |
411 | .open = iwm_generic_open, | 405 | .open = simple_open, |
412 | .read = iwm_debugfs_tx_credit_read, | 406 | .read = iwm_debugfs_tx_credit_read, |
413 | .llseek = default_llseek, | 407 | .llseek = default_llseek, |
414 | }; | 408 | }; |
415 | 409 | ||
416 | static const struct file_operations iwm_debugfs_rx_ticket_fops = { | 410 | static const struct file_operations iwm_debugfs_rx_ticket_fops = { |
417 | .owner = THIS_MODULE, | 411 | .owner = THIS_MODULE, |
418 | .open = iwm_generic_open, | 412 | .open = simple_open, |
419 | .read = iwm_debugfs_rx_ticket_read, | 413 | .read = iwm_debugfs_rx_ticket_read, |
420 | .llseek = default_llseek, | 414 | .llseek = default_llseek, |
421 | }; | 415 | }; |
422 | 416 | ||
423 | static const struct file_operations iwm_debugfs_fw_err_fops = { | 417 | static const struct file_operations iwm_debugfs_fw_err_fops = { |
424 | .owner = THIS_MODULE, | 418 | .owner = THIS_MODULE, |
425 | .open = iwm_generic_open, | 419 | .open = simple_open, |
426 | .read = iwm_debugfs_fw_err_read, | 420 | .read = iwm_debugfs_fw_err_read, |
427 | .llseek = default_llseek, | 421 | .llseek = default_llseek, |
428 | }; | 422 | }; |
diff --git a/drivers/net/wireless/iwmc3200wifi/sdio.c b/drivers/net/wireless/iwmc3200wifi/sdio.c index 764b40dd24ad..0042f204b07f 100644 --- a/drivers/net/wireless/iwmc3200wifi/sdio.c +++ b/drivers/net/wireless/iwmc3200wifi/sdio.c | |||
@@ -264,13 +264,6 @@ static int if_sdio_send_chunk(struct iwm_priv *iwm, u8 *buf, int count) | |||
264 | return ret; | 264 | return ret; |
265 | } | 265 | } |
266 | 266 | ||
267 | /* debugfs hooks */ | ||
268 | static int iwm_debugfs_sdio_open(struct inode *inode, struct file *filp) | ||
269 | { | ||
270 | filp->private_data = inode->i_private; | ||
271 | return 0; | ||
272 | } | ||
273 | |||
274 | static ssize_t iwm_debugfs_sdio_read(struct file *filp, char __user *buffer, | 267 | static ssize_t iwm_debugfs_sdio_read(struct file *filp, char __user *buffer, |
275 | size_t count, loff_t *ppos) | 268 | size_t count, loff_t *ppos) |
276 | { | 269 | { |
@@ -363,7 +356,7 @@ err: | |||
363 | 356 | ||
364 | static const struct file_operations iwm_debugfs_sdio_fops = { | 357 | static const struct file_operations iwm_debugfs_sdio_fops = { |
365 | .owner = THIS_MODULE, | 358 | .owner = THIS_MODULE, |
366 | .open = iwm_debugfs_sdio_open, | 359 | .open = simple_open, |
367 | .read = iwm_debugfs_sdio_read, | 360 | .read = iwm_debugfs_sdio_read, |
368 | .llseek = default_llseek, | 361 | .llseek = default_llseek, |
369 | }; | 362 | }; |
diff --git a/drivers/net/wireless/libertas/debugfs.c b/drivers/net/wireless/libertas/debugfs.c index c192671610fc..a06cc283e23d 100644 --- a/drivers/net/wireless/libertas/debugfs.c +++ b/drivers/net/wireless/libertas/debugfs.c | |||
@@ -21,12 +21,6 @@ static char *szStates[] = { | |||
21 | static void lbs_debug_init(struct lbs_private *priv); | 21 | static void lbs_debug_init(struct lbs_private *priv); |
22 | #endif | 22 | #endif |
23 | 23 | ||
24 | static int open_file_generic(struct inode *inode, struct file *file) | ||
25 | { | ||
26 | file->private_data = inode->i_private; | ||
27 | return 0; | ||
28 | } | ||
29 | |||
30 | static ssize_t write_file_dummy(struct file *file, const char __user *buf, | 24 | static ssize_t write_file_dummy(struct file *file, const char __user *buf, |
31 | size_t count, loff_t *ppos) | 25 | size_t count, loff_t *ppos) |
32 | { | 26 | { |
@@ -696,7 +690,7 @@ out_unlock: | |||
696 | 690 | ||
697 | #define FOPS(fread, fwrite) { \ | 691 | #define FOPS(fread, fwrite) { \ |
698 | .owner = THIS_MODULE, \ | 692 | .owner = THIS_MODULE, \ |
699 | .open = open_file_generic, \ | 693 | .open = simple_open, \ |
700 | .read = (fread), \ | 694 | .read = (fread), \ |
701 | .write = (fwrite), \ | 695 | .write = (fwrite), \ |
702 | .llseek = generic_file_llseek, \ | 696 | .llseek = generic_file_llseek, \ |
@@ -962,7 +956,7 @@ static ssize_t lbs_debugfs_write(struct file *f, const char __user *buf, | |||
962 | 956 | ||
963 | static const struct file_operations lbs_debug_fops = { | 957 | static const struct file_operations lbs_debug_fops = { |
964 | .owner = THIS_MODULE, | 958 | .owner = THIS_MODULE, |
965 | .open = open_file_generic, | 959 | .open = simple_open, |
966 | .write = lbs_debugfs_write, | 960 | .write = lbs_debugfs_write, |
967 | .read = lbs_debugfs_read, | 961 | .read = lbs_debugfs_read, |
968 | .llseek = default_llseek, | 962 | .llseek = default_llseek, |
diff --git a/drivers/net/wireless/mwifiex/debugfs.c b/drivers/net/wireless/mwifiex/debugfs.c index d26a78b6b3c4..1a845074c52a 100644 --- a/drivers/net/wireless/mwifiex/debugfs.c +++ b/drivers/net/wireless/mwifiex/debugfs.c | |||
@@ -140,18 +140,6 @@ static struct mwifiex_debug_data items[] = { | |||
140 | static int num_of_items = ARRAY_SIZE(items); | 140 | static int num_of_items = ARRAY_SIZE(items); |
141 | 141 | ||
142 | /* | 142 | /* |
143 | * Generic proc file open handler. | ||
144 | * | ||
145 | * This function is called every time a file is accessed for read or write. | ||
146 | */ | ||
147 | static int | ||
148 | mwifiex_open_generic(struct inode *inode, struct file *file) | ||
149 | { | ||
150 | file->private_data = inode->i_private; | ||
151 | return 0; | ||
152 | } | ||
153 | |||
154 | /* | ||
155 | * Proc info file read handler. | 143 | * Proc info file read handler. |
156 | * | 144 | * |
157 | * This function is called when the 'info' file is opened for reading. | 145 | * This function is called when the 'info' file is opened for reading. |
@@ -676,19 +664,19 @@ done: | |||
676 | static const struct file_operations mwifiex_dfs_##name##_fops = { \ | 664 | static const struct file_operations mwifiex_dfs_##name##_fops = { \ |
677 | .read = mwifiex_##name##_read, \ | 665 | .read = mwifiex_##name##_read, \ |
678 | .write = mwifiex_##name##_write, \ | 666 | .write = mwifiex_##name##_write, \ |
679 | .open = mwifiex_open_generic, \ | 667 | .open = simple_open, \ |
680 | }; | 668 | }; |
681 | 669 | ||
682 | #define MWIFIEX_DFS_FILE_READ_OPS(name) \ | 670 | #define MWIFIEX_DFS_FILE_READ_OPS(name) \ |
683 | static const struct file_operations mwifiex_dfs_##name##_fops = { \ | 671 | static const struct file_operations mwifiex_dfs_##name##_fops = { \ |
684 | .read = mwifiex_##name##_read, \ | 672 | .read = mwifiex_##name##_read, \ |
685 | .open = mwifiex_open_generic, \ | 673 | .open = simple_open, \ |
686 | }; | 674 | }; |
687 | 675 | ||
688 | #define MWIFIEX_DFS_FILE_WRITE_OPS(name) \ | 676 | #define MWIFIEX_DFS_FILE_WRITE_OPS(name) \ |
689 | static const struct file_operations mwifiex_dfs_##name##_fops = { \ | 677 | static const struct file_operations mwifiex_dfs_##name##_fops = { \ |
690 | .write = mwifiex_##name##_write, \ | 678 | .write = mwifiex_##name##_write, \ |
691 | .open = mwifiex_open_generic, \ | 679 | .open = simple_open, \ |
692 | }; | 680 | }; |
693 | 681 | ||
694 | 682 | ||
diff --git a/drivers/net/wireless/wl1251/debugfs.c b/drivers/net/wireless/wl1251/debugfs.c index 6c274007d200..448da1f8c22f 100644 --- a/drivers/net/wireless/wl1251/debugfs.c +++ b/drivers/net/wireless/wl1251/debugfs.c | |||
@@ -47,7 +47,7 @@ static ssize_t name## _read(struct file *file, char __user *userbuf, \ | |||
47 | \ | 47 | \ |
48 | static const struct file_operations name## _ops = { \ | 48 | static const struct file_operations name## _ops = { \ |
49 | .read = name## _read, \ | 49 | .read = name## _read, \ |
50 | .open = wl1251_open_file_generic, \ | 50 | .open = simple_open, \ |
51 | .llseek = generic_file_llseek, \ | 51 | .llseek = generic_file_llseek, \ |
52 | }; | 52 | }; |
53 | 53 | ||
@@ -84,7 +84,7 @@ static ssize_t sub## _ ##name## _read(struct file *file, \ | |||
84 | \ | 84 | \ |
85 | static const struct file_operations sub## _ ##name## _ops = { \ | 85 | static const struct file_operations sub## _ ##name## _ops = { \ |
86 | .read = sub## _ ##name## _read, \ | 86 | .read = sub## _ ##name## _read, \ |
87 | .open = wl1251_open_file_generic, \ | 87 | .open = simple_open, \ |
88 | .llseek = generic_file_llseek, \ | 88 | .llseek = generic_file_llseek, \ |
89 | }; | 89 | }; |
90 | 90 | ||
@@ -117,12 +117,6 @@ out: | |||
117 | mutex_unlock(&wl->mutex); | 117 | mutex_unlock(&wl->mutex); |
118 | } | 118 | } |
119 | 119 | ||
120 | static int wl1251_open_file_generic(struct inode *inode, struct file *file) | ||
121 | { | ||
122 | file->private_data = inode->i_private; | ||
123 | return 0; | ||
124 | } | ||
125 | |||
126 | DEBUGFS_FWSTATS_FILE(tx, internal_desc_overflow, 20, "%u"); | 120 | DEBUGFS_FWSTATS_FILE(tx, internal_desc_overflow, 20, "%u"); |
127 | 121 | ||
128 | DEBUGFS_FWSTATS_FILE(rx, out_of_mem, 20, "%u"); | 122 | DEBUGFS_FWSTATS_FILE(rx, out_of_mem, 20, "%u"); |
@@ -235,7 +229,7 @@ static ssize_t tx_queue_len_read(struct file *file, char __user *userbuf, | |||
235 | 229 | ||
236 | static const struct file_operations tx_queue_len_ops = { | 230 | static const struct file_operations tx_queue_len_ops = { |
237 | .read = tx_queue_len_read, | 231 | .read = tx_queue_len_read, |
238 | .open = wl1251_open_file_generic, | 232 | .open = simple_open, |
239 | .llseek = generic_file_llseek, | 233 | .llseek = generic_file_llseek, |
240 | }; | 234 | }; |
241 | 235 | ||
@@ -257,7 +251,7 @@ static ssize_t tx_queue_status_read(struct file *file, char __user *userbuf, | |||
257 | 251 | ||
258 | static const struct file_operations tx_queue_status_ops = { | 252 | static const struct file_operations tx_queue_status_ops = { |
259 | .read = tx_queue_status_read, | 253 | .read = tx_queue_status_read, |
260 | .open = wl1251_open_file_generic, | 254 | .open = simple_open, |
261 | .llseek = generic_file_llseek, | 255 | .llseek = generic_file_llseek, |
262 | }; | 256 | }; |
263 | 257 | ||
diff --git a/drivers/net/wireless/wl12xx/debugfs.c b/drivers/net/wireless/wl12xx/debugfs.c index e1cf72765965..564d49575c94 100644 --- a/drivers/net/wireless/wl12xx/debugfs.c +++ b/drivers/net/wireless/wl12xx/debugfs.c | |||
@@ -63,7 +63,7 @@ static ssize_t name## _read(struct file *file, char __user *userbuf, \ | |||
63 | \ | 63 | \ |
64 | static const struct file_operations name## _ops = { \ | 64 | static const struct file_operations name## _ops = { \ |
65 | .read = name## _read, \ | 65 | .read = name## _read, \ |
66 | .open = wl1271_open_file_generic, \ | 66 | .open = simple_open, \ |
67 | .llseek = generic_file_llseek, \ | 67 | .llseek = generic_file_llseek, \ |
68 | }; | 68 | }; |
69 | 69 | ||
@@ -96,7 +96,7 @@ static ssize_t sub## _ ##name## _read(struct file *file, \ | |||
96 | \ | 96 | \ |
97 | static const struct file_operations sub## _ ##name## _ops = { \ | 97 | static const struct file_operations sub## _ ##name## _ops = { \ |
98 | .read = sub## _ ##name## _read, \ | 98 | .read = sub## _ ##name## _read, \ |
99 | .open = wl1271_open_file_generic, \ | 99 | .open = simple_open, \ |
100 | .llseek = generic_file_llseek, \ | 100 | .llseek = generic_file_llseek, \ |
101 | }; | 101 | }; |
102 | 102 | ||
@@ -126,12 +126,6 @@ out: | |||
126 | mutex_unlock(&wl->mutex); | 126 | mutex_unlock(&wl->mutex); |
127 | } | 127 | } |
128 | 128 | ||
129 | static int wl1271_open_file_generic(struct inode *inode, struct file *file) | ||
130 | { | ||
131 | file->private_data = inode->i_private; | ||
132 | return 0; | ||
133 | } | ||
134 | |||
135 | DEBUGFS_FWSTATS_FILE(tx, internal_desc_overflow, "%u"); | 129 | DEBUGFS_FWSTATS_FILE(tx, internal_desc_overflow, "%u"); |
136 | 130 | ||
137 | DEBUGFS_FWSTATS_FILE(rx, out_of_mem, "%u"); | 131 | DEBUGFS_FWSTATS_FILE(rx, out_of_mem, "%u"); |
@@ -243,7 +237,7 @@ static ssize_t tx_queue_len_read(struct file *file, char __user *userbuf, | |||
243 | 237 | ||
244 | static const struct file_operations tx_queue_len_ops = { | 238 | static const struct file_operations tx_queue_len_ops = { |
245 | .read = tx_queue_len_read, | 239 | .read = tx_queue_len_read, |
246 | .open = wl1271_open_file_generic, | 240 | .open = simple_open, |
247 | .llseek = default_llseek, | 241 | .llseek = default_llseek, |
248 | }; | 242 | }; |
249 | 243 | ||
@@ -289,7 +283,7 @@ static ssize_t gpio_power_write(struct file *file, | |||
289 | static const struct file_operations gpio_power_ops = { | 283 | static const struct file_operations gpio_power_ops = { |
290 | .read = gpio_power_read, | 284 | .read = gpio_power_read, |
291 | .write = gpio_power_write, | 285 | .write = gpio_power_write, |
292 | .open = wl1271_open_file_generic, | 286 | .open = simple_open, |
293 | .llseek = default_llseek, | 287 | .llseek = default_llseek, |
294 | }; | 288 | }; |
295 | 289 | ||
@@ -308,7 +302,7 @@ static ssize_t start_recovery_write(struct file *file, | |||
308 | 302 | ||
309 | static const struct file_operations start_recovery_ops = { | 303 | static const struct file_operations start_recovery_ops = { |
310 | .write = start_recovery_write, | 304 | .write = start_recovery_write, |
311 | .open = wl1271_open_file_generic, | 305 | .open = simple_open, |
312 | .llseek = default_llseek, | 306 | .llseek = default_llseek, |
313 | }; | 307 | }; |
314 | 308 | ||
@@ -372,7 +366,7 @@ out: | |||
372 | static const struct file_operations dynamic_ps_timeout_ops = { | 366 | static const struct file_operations dynamic_ps_timeout_ops = { |
373 | .read = dynamic_ps_timeout_read, | 367 | .read = dynamic_ps_timeout_read, |
374 | .write = dynamic_ps_timeout_write, | 368 | .write = dynamic_ps_timeout_write, |
375 | .open = wl1271_open_file_generic, | 369 | .open = simple_open, |
376 | .llseek = default_llseek, | 370 | .llseek = default_llseek, |
377 | }; | 371 | }; |
378 | 372 | ||
@@ -441,7 +435,7 @@ out: | |||
441 | static const struct file_operations forced_ps_ops = { | 435 | static const struct file_operations forced_ps_ops = { |
442 | .read = forced_ps_read, | 436 | .read = forced_ps_read, |
443 | .write = forced_ps_write, | 437 | .write = forced_ps_write, |
444 | .open = wl1271_open_file_generic, | 438 | .open = simple_open, |
445 | .llseek = default_llseek, | 439 | .llseek = default_llseek, |
446 | }; | 440 | }; |
447 | 441 | ||
@@ -483,7 +477,7 @@ static ssize_t split_scan_timeout_write(struct file *file, | |||
483 | static const struct file_operations split_scan_timeout_ops = { | 477 | static const struct file_operations split_scan_timeout_ops = { |
484 | .read = split_scan_timeout_read, | 478 | .read = split_scan_timeout_read, |
485 | .write = split_scan_timeout_write, | 479 | .write = split_scan_timeout_write, |
486 | .open = wl1271_open_file_generic, | 480 | .open = simple_open, |
487 | .llseek = default_llseek, | 481 | .llseek = default_llseek, |
488 | }; | 482 | }; |
489 | 483 | ||
@@ -566,7 +560,7 @@ static ssize_t driver_state_read(struct file *file, char __user *user_buf, | |||
566 | 560 | ||
567 | static const struct file_operations driver_state_ops = { | 561 | static const struct file_operations driver_state_ops = { |
568 | .read = driver_state_read, | 562 | .read = driver_state_read, |
569 | .open = wl1271_open_file_generic, | 563 | .open = simple_open, |
570 | .llseek = default_llseek, | 564 | .llseek = default_llseek, |
571 | }; | 565 | }; |
572 | 566 | ||
@@ -675,7 +669,7 @@ static ssize_t vifs_state_read(struct file *file, char __user *user_buf, | |||
675 | 669 | ||
676 | static const struct file_operations vifs_state_ops = { | 670 | static const struct file_operations vifs_state_ops = { |
677 | .read = vifs_state_read, | 671 | .read = vifs_state_read, |
678 | .open = wl1271_open_file_generic, | 672 | .open = simple_open, |
679 | .llseek = default_llseek, | 673 | .llseek = default_llseek, |
680 | }; | 674 | }; |
681 | 675 | ||
@@ -733,7 +727,7 @@ static ssize_t dtim_interval_write(struct file *file, | |||
733 | static const struct file_operations dtim_interval_ops = { | 727 | static const struct file_operations dtim_interval_ops = { |
734 | .read = dtim_interval_read, | 728 | .read = dtim_interval_read, |
735 | .write = dtim_interval_write, | 729 | .write = dtim_interval_write, |
736 | .open = wl1271_open_file_generic, | 730 | .open = simple_open, |
737 | .llseek = default_llseek, | 731 | .llseek = default_llseek, |
738 | }; | 732 | }; |
739 | 733 | ||
@@ -791,7 +785,7 @@ static ssize_t suspend_dtim_interval_write(struct file *file, | |||
791 | static const struct file_operations suspend_dtim_interval_ops = { | 785 | static const struct file_operations suspend_dtim_interval_ops = { |
792 | .read = suspend_dtim_interval_read, | 786 | .read = suspend_dtim_interval_read, |
793 | .write = suspend_dtim_interval_write, | 787 | .write = suspend_dtim_interval_write, |
794 | .open = wl1271_open_file_generic, | 788 | .open = simple_open, |
795 | .llseek = default_llseek, | 789 | .llseek = default_llseek, |
796 | }; | 790 | }; |
797 | 791 | ||
@@ -849,7 +843,7 @@ static ssize_t beacon_interval_write(struct file *file, | |||
849 | static const struct file_operations beacon_interval_ops = { | 843 | static const struct file_operations beacon_interval_ops = { |
850 | .read = beacon_interval_read, | 844 | .read = beacon_interval_read, |
851 | .write = beacon_interval_write, | 845 | .write = beacon_interval_write, |
852 | .open = wl1271_open_file_generic, | 846 | .open = simple_open, |
853 | .llseek = default_llseek, | 847 | .llseek = default_llseek, |
854 | }; | 848 | }; |
855 | 849 | ||
@@ -904,7 +898,7 @@ static ssize_t rx_streaming_interval_read(struct file *file, | |||
904 | static const struct file_operations rx_streaming_interval_ops = { | 898 | static const struct file_operations rx_streaming_interval_ops = { |
905 | .read = rx_streaming_interval_read, | 899 | .read = rx_streaming_interval_read, |
906 | .write = rx_streaming_interval_write, | 900 | .write = rx_streaming_interval_write, |
907 | .open = wl1271_open_file_generic, | 901 | .open = simple_open, |
908 | .llseek = default_llseek, | 902 | .llseek = default_llseek, |
909 | }; | 903 | }; |
910 | 904 | ||
@@ -959,7 +953,7 @@ static ssize_t rx_streaming_always_read(struct file *file, | |||
959 | static const struct file_operations rx_streaming_always_ops = { | 953 | static const struct file_operations rx_streaming_always_ops = { |
960 | .read = rx_streaming_always_read, | 954 | .read = rx_streaming_always_read, |
961 | .write = rx_streaming_always_write, | 955 | .write = rx_streaming_always_write, |
962 | .open = wl1271_open_file_generic, | 956 | .open = simple_open, |
963 | .llseek = default_llseek, | 957 | .llseek = default_llseek, |
964 | }; | 958 | }; |
965 | 959 | ||
@@ -1003,7 +997,7 @@ out: | |||
1003 | 997 | ||
1004 | static const struct file_operations beacon_filtering_ops = { | 998 | static const struct file_operations beacon_filtering_ops = { |
1005 | .write = beacon_filtering_write, | 999 | .write = beacon_filtering_write, |
1006 | .open = wl1271_open_file_generic, | 1000 | .open = simple_open, |
1007 | .llseek = default_llseek, | 1001 | .llseek = default_llseek, |
1008 | }; | 1002 | }; |
1009 | 1003 | ||
diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c index 663b32c2e931..0ebbb1906c30 100644 --- a/drivers/net/xen-netfront.c +++ b/drivers/net/xen-netfront.c | |||
@@ -1965,7 +1965,7 @@ static int __init netif_init(void) | |||
1965 | if (xen_initial_domain()) | 1965 | if (xen_initial_domain()) |
1966 | return 0; | 1966 | return 0; |
1967 | 1967 | ||
1968 | if (!xen_platform_pci_unplug) | 1968 | if (xen_hvm_domain() && !xen_platform_pci_unplug) |
1969 | return -ENODEV; | 1969 | return -ENODEV; |
1970 | 1970 | ||
1971 | printk(KERN_INFO "Initialising Xen virtual ethernet driver.\n"); | 1971 | printk(KERN_INFO "Initialising Xen virtual ethernet driver.\n"); |
diff --git a/drivers/oprofile/oprofilefs.c b/drivers/oprofile/oprofilefs.c index ee8fd037bb53..849357c1045c 100644 --- a/drivers/oprofile/oprofilefs.c +++ b/drivers/oprofile/oprofilefs.c | |||
@@ -117,25 +117,17 @@ static ssize_t ulong_write_file(struct file *file, char const __user *buf, size_ | |||
117 | } | 117 | } |
118 | 118 | ||
119 | 119 | ||
120 | static int default_open(struct inode *inode, struct file *filp) | ||
121 | { | ||
122 | if (inode->i_private) | ||
123 | filp->private_data = inode->i_private; | ||
124 | return 0; | ||
125 | } | ||
126 | |||
127 | |||
128 | static const struct file_operations ulong_fops = { | 120 | static const struct file_operations ulong_fops = { |
129 | .read = ulong_read_file, | 121 | .read = ulong_read_file, |
130 | .write = ulong_write_file, | 122 | .write = ulong_write_file, |
131 | .open = default_open, | 123 | .open = simple_open, |
132 | .llseek = default_llseek, | 124 | .llseek = default_llseek, |
133 | }; | 125 | }; |
134 | 126 | ||
135 | 127 | ||
136 | static const struct file_operations ulong_ro_fops = { | 128 | static const struct file_operations ulong_ro_fops = { |
137 | .read = ulong_read_file, | 129 | .read = ulong_read_file, |
138 | .open = default_open, | 130 | .open = simple_open, |
139 | .llseek = default_llseek, | 131 | .llseek = default_llseek, |
140 | }; | 132 | }; |
141 | 133 | ||
@@ -187,7 +179,7 @@ static ssize_t atomic_read_file(struct file *file, char __user *buf, size_t coun | |||
187 | 179 | ||
188 | static const struct file_operations atomic_ro_fops = { | 180 | static const struct file_operations atomic_ro_fops = { |
189 | .read = atomic_read_file, | 181 | .read = atomic_read_file, |
190 | .open = default_open, | 182 | .open = simple_open, |
191 | .llseek = default_llseek, | 183 | .llseek = default_llseek, |
192 | }; | 184 | }; |
193 | 185 | ||
diff --git a/drivers/pci/xen-pcifront.c b/drivers/pci/xen-pcifront.c index fd00ff02ab4d..d6cc62cb4cf7 100644 --- a/drivers/pci/xen-pcifront.c +++ b/drivers/pci/xen-pcifront.c | |||
@@ -290,6 +290,7 @@ static int pci_frontend_enable_msix(struct pci_dev *dev, | |||
290 | } else { | 290 | } else { |
291 | printk(KERN_DEBUG "enable msix get value %x\n", | 291 | printk(KERN_DEBUG "enable msix get value %x\n", |
292 | op.value); | 292 | op.value); |
293 | err = op.value; | ||
293 | } | 294 | } |
294 | } else { | 295 | } else { |
295 | dev_err(&dev->dev, "enable msix get err %x\n", err); | 296 | dev_err(&dev->dev, "enable msix get err %x\n", err); |
diff --git a/drivers/remoteproc/remoteproc_debugfs.c b/drivers/remoteproc/remoteproc_debugfs.c index 70277a530133..85d31a69e117 100644 --- a/drivers/remoteproc/remoteproc_debugfs.c +++ b/drivers/remoteproc/remoteproc_debugfs.c | |||
@@ -50,16 +50,9 @@ static ssize_t rproc_trace_read(struct file *filp, char __user *userbuf, | |||
50 | return simple_read_from_buffer(userbuf, count, ppos, trace->va, len); | 50 | return simple_read_from_buffer(userbuf, count, ppos, trace->va, len); |
51 | } | 51 | } |
52 | 52 | ||
53 | static int rproc_open_generic(struct inode *inode, struct file *file) | ||
54 | { | ||
55 | file->private_data = inode->i_private; | ||
56 | |||
57 | return 0; | ||
58 | } | ||
59 | |||
60 | static const struct file_operations trace_rproc_ops = { | 53 | static const struct file_operations trace_rproc_ops = { |
61 | .read = rproc_trace_read, | 54 | .read = rproc_trace_read, |
62 | .open = rproc_open_generic, | 55 | .open = simple_open, |
63 | .llseek = generic_file_llseek, | 56 | .llseek = generic_file_llseek, |
64 | }; | 57 | }; |
65 | 58 | ||
@@ -94,7 +87,7 @@ static ssize_t rproc_state_read(struct file *filp, char __user *userbuf, | |||
94 | 87 | ||
95 | static const struct file_operations rproc_state_ops = { | 88 | static const struct file_operations rproc_state_ops = { |
96 | .read = rproc_state_read, | 89 | .read = rproc_state_read, |
97 | .open = rproc_open_generic, | 90 | .open = simple_open, |
98 | .llseek = generic_file_llseek, | 91 | .llseek = generic_file_llseek, |
99 | }; | 92 | }; |
100 | 93 | ||
@@ -114,7 +107,7 @@ static ssize_t rproc_name_read(struct file *filp, char __user *userbuf, | |||
114 | 107 | ||
115 | static const struct file_operations rproc_name_ops = { | 108 | static const struct file_operations rproc_name_ops = { |
116 | .read = rproc_name_read, | 109 | .read = rproc_name_read, |
117 | .open = rproc_open_generic, | 110 | .open = simple_open, |
118 | .llseek = generic_file_llseek, | 111 | .llseek = generic_file_llseek, |
119 | }; | 112 | }; |
120 | 113 | ||
diff --git a/drivers/rtc/rtc-88pm860x.c b/drivers/rtc/rtc-88pm860x.c index afee0e8ae714..feddefc42109 100644 --- a/drivers/rtc/rtc-88pm860x.c +++ b/drivers/rtc/rtc-88pm860x.c | |||
@@ -72,9 +72,9 @@ static int pm860x_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled) | |||
72 | struct pm860x_rtc_info *info = dev_get_drvdata(dev); | 72 | struct pm860x_rtc_info *info = dev_get_drvdata(dev); |
73 | 73 | ||
74 | if (enabled) | 74 | if (enabled) |
75 | pm860x_set_bits(info->i2c, PM8607_RTC1, ALARM, ALARM); | 75 | pm860x_set_bits(info->i2c, PM8607_RTC1, ALARM_EN, ALARM_EN); |
76 | else | 76 | else |
77 | pm860x_set_bits(info->i2c, PM8607_RTC1, ALARM, 0); | 77 | pm860x_set_bits(info->i2c, PM8607_RTC1, ALARM_EN, 0); |
78 | return 0; | 78 | return 0; |
79 | } | 79 | } |
80 | 80 | ||
diff --git a/drivers/scsi/lpfc/lpfc_debugfs.c b/drivers/scsi/lpfc/lpfc_debugfs.c index 5bdf2eecb178..af04b0d6688d 100644 --- a/drivers/scsi/lpfc/lpfc_debugfs.c +++ b/drivers/scsi/lpfc/lpfc_debugfs.c | |||
@@ -997,13 +997,6 @@ lpfc_debugfs_dumpDataDif_write(struct file *file, const char __user *buf, | |||
997 | return nbytes; | 997 | return nbytes; |
998 | } | 998 | } |
999 | 999 | ||
1000 | static int | ||
1001 | lpfc_debugfs_dif_err_open(struct inode *inode, struct file *file) | ||
1002 | { | ||
1003 | file->private_data = inode->i_private; | ||
1004 | return 0; | ||
1005 | } | ||
1006 | |||
1007 | static ssize_t | 1000 | static ssize_t |
1008 | lpfc_debugfs_dif_err_read(struct file *file, char __user *buf, | 1001 | lpfc_debugfs_dif_err_read(struct file *file, char __user *buf, |
1009 | size_t nbytes, loff_t *ppos) | 1002 | size_t nbytes, loff_t *ppos) |
@@ -3541,7 +3534,7 @@ static const struct file_operations lpfc_debugfs_op_dumpDif = { | |||
3541 | #undef lpfc_debugfs_op_dif_err | 3534 | #undef lpfc_debugfs_op_dif_err |
3542 | static const struct file_operations lpfc_debugfs_op_dif_err = { | 3535 | static const struct file_operations lpfc_debugfs_op_dif_err = { |
3543 | .owner = THIS_MODULE, | 3536 | .owner = THIS_MODULE, |
3544 | .open = lpfc_debugfs_dif_err_open, | 3537 | .open = simple_open, |
3545 | .llseek = lpfc_debugfs_lseek, | 3538 | .llseek = lpfc_debugfs_lseek, |
3546 | .read = lpfc_debugfs_dif_err_read, | 3539 | .read = lpfc_debugfs_dif_err_read, |
3547 | .write = lpfc_debugfs_dif_err_write, | 3540 | .write = lpfc_debugfs_dif_err_write, |
diff --git a/drivers/spi/spi-dw.c b/drivers/spi/spi-dw.c index 082458d73ce9..d1a495f64e2d 100644 --- a/drivers/spi/spi-dw.c +++ b/drivers/spi/spi-dw.c | |||
@@ -63,12 +63,6 @@ struct chip_data { | |||
63 | }; | 63 | }; |
64 | 64 | ||
65 | #ifdef CONFIG_DEBUG_FS | 65 | #ifdef CONFIG_DEBUG_FS |
66 | static int spi_show_regs_open(struct inode *inode, struct file *file) | ||
67 | { | ||
68 | file->private_data = inode->i_private; | ||
69 | return 0; | ||
70 | } | ||
71 | |||
72 | #define SPI_REGS_BUFSIZE 1024 | 66 | #define SPI_REGS_BUFSIZE 1024 |
73 | static ssize_t spi_show_regs(struct file *file, char __user *user_buf, | 67 | static ssize_t spi_show_regs(struct file *file, char __user *user_buf, |
74 | size_t count, loff_t *ppos) | 68 | size_t count, loff_t *ppos) |
@@ -128,7 +122,7 @@ static ssize_t spi_show_regs(struct file *file, char __user *user_buf, | |||
128 | 122 | ||
129 | static const struct file_operations mrst_spi_regs_ops = { | 123 | static const struct file_operations mrst_spi_regs_ops = { |
130 | .owner = THIS_MODULE, | 124 | .owner = THIS_MODULE, |
131 | .open = spi_show_regs_open, | 125 | .open = simple_open, |
132 | .read = spi_show_regs, | 126 | .read = spi_show_regs, |
133 | .llseek = default_llseek, | 127 | .llseek = default_llseek, |
134 | }; | 128 | }; |
diff --git a/drivers/target/tcm_fc/tcm_fc.h b/drivers/target/tcm_fc/tcm_fc.h index 830657908db8..c5eb3c33c3db 100644 --- a/drivers/target/tcm_fc/tcm_fc.h +++ b/drivers/target/tcm_fc/tcm_fc.h | |||
@@ -122,6 +122,7 @@ struct ft_cmd { | |||
122 | /* Local sense buffer */ | 122 | /* Local sense buffer */ |
123 | unsigned char ft_sense_buffer[TRANSPORT_SENSE_BUFFER]; | 123 | unsigned char ft_sense_buffer[TRANSPORT_SENSE_BUFFER]; |
124 | u32 was_ddp_setup:1; /* Set only if ddp is setup */ | 124 | u32 was_ddp_setup:1; /* Set only if ddp is setup */ |
125 | u32 aborted:1; /* Set if aborted by reset or timeout */ | ||
125 | struct scatterlist *sg; /* Set only if DDP is setup */ | 126 | struct scatterlist *sg; /* Set only if DDP is setup */ |
126 | u32 sg_cnt; /* No. of item in scatterlist */ | 127 | u32 sg_cnt; /* No. of item in scatterlist */ |
127 | }; | 128 | }; |
diff --git a/drivers/target/tcm_fc/tfc_cmd.c b/drivers/target/tcm_fc/tfc_cmd.c index 62dec9715ce5..a375f257aabc 100644 --- a/drivers/target/tcm_fc/tfc_cmd.c +++ b/drivers/target/tcm_fc/tfc_cmd.c | |||
@@ -121,6 +121,8 @@ int ft_queue_status(struct se_cmd *se_cmd) | |||
121 | struct fc_exch *ep; | 121 | struct fc_exch *ep; |
122 | size_t len; | 122 | size_t len; |
123 | 123 | ||
124 | if (cmd->aborted) | ||
125 | return 0; | ||
124 | ft_dump_cmd(cmd, __func__); | 126 | ft_dump_cmd(cmd, __func__); |
125 | ep = fc_seq_exch(cmd->seq); | 127 | ep = fc_seq_exch(cmd->seq); |
126 | lport = ep->lp; | 128 | lport = ep->lp; |
@@ -187,6 +189,8 @@ int ft_write_pending(struct se_cmd *se_cmd) | |||
187 | 189 | ||
188 | ft_dump_cmd(cmd, __func__); | 190 | ft_dump_cmd(cmd, __func__); |
189 | 191 | ||
192 | if (cmd->aborted) | ||
193 | return 0; | ||
190 | ep = fc_seq_exch(cmd->seq); | 194 | ep = fc_seq_exch(cmd->seq); |
191 | lport = ep->lp; | 195 | lport = ep->lp; |
192 | fp = fc_frame_alloc(lport, sizeof(*txrdy)); | 196 | fp = fc_frame_alloc(lport, sizeof(*txrdy)); |
@@ -252,10 +256,10 @@ static void ft_recv_seq(struct fc_seq *sp, struct fc_frame *fp, void *arg) | |||
252 | struct ft_cmd *cmd = arg; | 256 | struct ft_cmd *cmd = arg; |
253 | struct fc_frame_header *fh; | 257 | struct fc_frame_header *fh; |
254 | 258 | ||
255 | if (IS_ERR(fp)) { | 259 | if (unlikely(IS_ERR(fp))) { |
256 | /* XXX need to find cmd if queued */ | 260 | /* XXX need to find cmd if queued */ |
257 | cmd->seq = NULL; | 261 | cmd->seq = NULL; |
258 | transport_generic_free_cmd(&cmd->se_cmd, 0); | 262 | cmd->aborted = true; |
259 | return; | 263 | return; |
260 | } | 264 | } |
261 | 265 | ||
@@ -399,6 +403,8 @@ int ft_queue_tm_resp(struct se_cmd *se_cmd) | |||
399 | struct se_tmr_req *tmr = se_cmd->se_tmr_req; | 403 | struct se_tmr_req *tmr = se_cmd->se_tmr_req; |
400 | enum fcp_resp_rsp_codes code; | 404 | enum fcp_resp_rsp_codes code; |
401 | 405 | ||
406 | if (cmd->aborted) | ||
407 | return 0; | ||
402 | switch (tmr->response) { | 408 | switch (tmr->response) { |
403 | case TMR_FUNCTION_COMPLETE: | 409 | case TMR_FUNCTION_COMPLETE: |
404 | code = FCP_TMF_CMPL; | 410 | code = FCP_TMF_CMPL; |
diff --git a/drivers/target/tcm_fc/tfc_conf.c b/drivers/target/tcm_fc/tfc_conf.c index f357039349ba..2948dc944619 100644 --- a/drivers/target/tcm_fc/tfc_conf.c +++ b/drivers/target/tcm_fc/tfc_conf.c | |||
@@ -300,6 +300,7 @@ static struct se_portal_group *ft_add_tpg( | |||
300 | { | 300 | { |
301 | struct ft_lport_acl *lacl; | 301 | struct ft_lport_acl *lacl; |
302 | struct ft_tpg *tpg; | 302 | struct ft_tpg *tpg; |
303 | struct workqueue_struct *wq; | ||
303 | unsigned long index; | 304 | unsigned long index; |
304 | int ret; | 305 | int ret; |
305 | 306 | ||
@@ -321,18 +322,20 @@ static struct se_portal_group *ft_add_tpg( | |||
321 | tpg->lport_acl = lacl; | 322 | tpg->lport_acl = lacl; |
322 | INIT_LIST_HEAD(&tpg->lun_list); | 323 | INIT_LIST_HEAD(&tpg->lun_list); |
323 | 324 | ||
324 | ret = core_tpg_register(&ft_configfs->tf_ops, wwn, &tpg->se_tpg, | 325 | wq = alloc_workqueue("tcm_fc", 0, 1); |
325 | tpg, TRANSPORT_TPG_TYPE_NORMAL); | 326 | if (!wq) { |
326 | if (ret < 0) { | ||
327 | kfree(tpg); | 327 | kfree(tpg); |
328 | return NULL; | 328 | return NULL; |
329 | } | 329 | } |
330 | 330 | ||
331 | tpg->workqueue = alloc_workqueue("tcm_fc", 0, 1); | 331 | ret = core_tpg_register(&ft_configfs->tf_ops, wwn, &tpg->se_tpg, |
332 | if (!tpg->workqueue) { | 332 | tpg, TRANSPORT_TPG_TYPE_NORMAL); |
333 | if (ret < 0) { | ||
334 | destroy_workqueue(wq); | ||
333 | kfree(tpg); | 335 | kfree(tpg); |
334 | return NULL; | 336 | return NULL; |
335 | } | 337 | } |
338 | tpg->workqueue = wq; | ||
336 | 339 | ||
337 | mutex_lock(&ft_lport_lock); | 340 | mutex_lock(&ft_lport_lock); |
338 | list_add_tail(&tpg->list, &lacl->tpg_list); | 341 | list_add_tail(&tpg->list, &lacl->tpg_list); |
diff --git a/drivers/target/tcm_fc/tfc_io.c b/drivers/target/tcm_fc/tfc_io.c index 2b693eefac55..dc7c0db26e20 100644 --- a/drivers/target/tcm_fc/tfc_io.c +++ b/drivers/target/tcm_fc/tfc_io.c | |||
@@ -81,6 +81,8 @@ int ft_queue_data_in(struct se_cmd *se_cmd) | |||
81 | void *from; | 81 | void *from; |
82 | void *to = NULL; | 82 | void *to = NULL; |
83 | 83 | ||
84 | if (cmd->aborted) | ||
85 | return 0; | ||
84 | ep = fc_seq_exch(cmd->seq); | 86 | ep = fc_seq_exch(cmd->seq); |
85 | lport = ep->lp; | 87 | lport = ep->lp; |
86 | cmd->seq = lport->tt.seq_start_next(cmd->seq); | 88 | cmd->seq = lport->tt.seq_start_next(cmd->seq); |
diff --git a/drivers/tty/serial/mfd.c b/drivers/tty/serial/mfd.c index a9234ba8f8d5..c4b50af46c44 100644 --- a/drivers/tty/serial/mfd.c +++ b/drivers/tty/serial/mfd.c | |||
@@ -127,11 +127,6 @@ static inline void serial_out(struct uart_hsu_port *up, int offset, int value) | |||
127 | 127 | ||
128 | #define HSU_REGS_BUFSIZE 1024 | 128 | #define HSU_REGS_BUFSIZE 1024 |
129 | 129 | ||
130 | static int hsu_show_regs_open(struct inode *inode, struct file *file) | ||
131 | { | ||
132 | file->private_data = inode->i_private; | ||
133 | return 0; | ||
134 | } | ||
135 | 130 | ||
136 | static ssize_t port_show_regs(struct file *file, char __user *user_buf, | 131 | static ssize_t port_show_regs(struct file *file, char __user *user_buf, |
137 | size_t count, loff_t *ppos) | 132 | size_t count, loff_t *ppos) |
@@ -231,14 +226,14 @@ static ssize_t dma_show_regs(struct file *file, char __user *user_buf, | |||
231 | 226 | ||
232 | static const struct file_operations port_regs_ops = { | 227 | static const struct file_operations port_regs_ops = { |
233 | .owner = THIS_MODULE, | 228 | .owner = THIS_MODULE, |
234 | .open = hsu_show_regs_open, | 229 | .open = simple_open, |
235 | .read = port_show_regs, | 230 | .read = port_show_regs, |
236 | .llseek = default_llseek, | 231 | .llseek = default_llseek, |
237 | }; | 232 | }; |
238 | 233 | ||
239 | static const struct file_operations dma_regs_ops = { | 234 | static const struct file_operations dma_regs_ops = { |
240 | .owner = THIS_MODULE, | 235 | .owner = THIS_MODULE, |
241 | .open = hsu_show_regs_open, | 236 | .open = simple_open, |
242 | .read = dma_show_regs, | 237 | .read = dma_show_regs, |
243 | .llseek = default_llseek, | 238 | .llseek = default_llseek, |
244 | }; | 239 | }; |
diff --git a/drivers/tty/serial/pch_uart.c b/drivers/tty/serial/pch_uart.c index e825460478be..08b9962b8fda 100644 --- a/drivers/tty/serial/pch_uart.c +++ b/drivers/tty/serial/pch_uart.c | |||
@@ -304,11 +304,7 @@ static const int trigger_level_1[4] = { 1, 1, 1, 1 }; | |||
304 | #ifdef CONFIG_DEBUG_FS | 304 | #ifdef CONFIG_DEBUG_FS |
305 | 305 | ||
306 | #define PCH_REGS_BUFSIZE 1024 | 306 | #define PCH_REGS_BUFSIZE 1024 |
307 | static int pch_show_regs_open(struct inode *inode, struct file *file) | 307 | |
308 | { | ||
309 | file->private_data = inode->i_private; | ||
310 | return 0; | ||
311 | } | ||
312 | 308 | ||
313 | static ssize_t port_show_regs(struct file *file, char __user *user_buf, | 309 | static ssize_t port_show_regs(struct file *file, char __user *user_buf, |
314 | size_t count, loff_t *ppos) | 310 | size_t count, loff_t *ppos) |
@@ -362,7 +358,7 @@ static ssize_t port_show_regs(struct file *file, char __user *user_buf, | |||
362 | 358 | ||
363 | static const struct file_operations port_regs_ops = { | 359 | static const struct file_operations port_regs_ops = { |
364 | .owner = THIS_MODULE, | 360 | .owner = THIS_MODULE, |
365 | .open = pch_show_regs_open, | 361 | .open = simple_open, |
366 | .read = port_show_regs, | 362 | .read = port_show_regs, |
367 | .llseek = default_llseek, | 363 | .llseek = default_llseek, |
368 | }; | 364 | }; |
diff --git a/drivers/tty/sysrq.c b/drivers/tty/sysrq.c index 136e86faa1e1..05728894a88c 100644 --- a/drivers/tty/sysrq.c +++ b/drivers/tty/sysrq.c | |||
@@ -327,7 +327,7 @@ static void send_sig_all(int sig) | |||
327 | if (is_global_init(p)) | 327 | if (is_global_init(p)) |
328 | continue; | 328 | continue; |
329 | 329 | ||
330 | force_sig(sig, p); | 330 | do_send_sig_info(sig, SEND_SIG_FORCED, p, true); |
331 | } | 331 | } |
332 | read_unlock(&tasklist_lock); | 332 | read_unlock(&tasklist_lock); |
333 | } | 333 | } |
diff --git a/drivers/usb/core/inode.c b/drivers/usb/core/inode.c index cefa0c8b5b6a..d2b9af59cba9 100644 --- a/drivers/usb/core/inode.c +++ b/drivers/usb/core/inode.c | |||
@@ -428,18 +428,10 @@ static loff_t default_file_lseek (struct file *file, loff_t offset, int orig) | |||
428 | return retval; | 428 | return retval; |
429 | } | 429 | } |
430 | 430 | ||
431 | static int default_open (struct inode *inode, struct file *file) | ||
432 | { | ||
433 | if (inode->i_private) | ||
434 | file->private_data = inode->i_private; | ||
435 | |||
436 | return 0; | ||
437 | } | ||
438 | |||
439 | static const struct file_operations default_file_operations = { | 431 | static const struct file_operations default_file_operations = { |
440 | .read = default_read_file, | 432 | .read = default_read_file, |
441 | .write = default_write_file, | 433 | .write = default_write_file, |
442 | .open = default_open, | 434 | .open = simple_open, |
443 | .llseek = default_file_lseek, | 435 | .llseek = default_file_lseek, |
444 | }; | 436 | }; |
445 | 437 | ||
diff --git a/drivers/usb/host/ehci-atmel.c b/drivers/usb/host/ehci-atmel.c index 19f318ababa2..cf14c95a6700 100644 --- a/drivers/usb/host/ehci-atmel.c +++ b/drivers/usb/host/ehci-atmel.c | |||
@@ -13,6 +13,7 @@ | |||
13 | 13 | ||
14 | #include <linux/clk.h> | 14 | #include <linux/clk.h> |
15 | #include <linux/platform_device.h> | 15 | #include <linux/platform_device.h> |
16 | #include <linux/of.h> | ||
16 | #include <linux/of_platform.h> | 17 | #include <linux/of_platform.h> |
17 | 18 | ||
18 | /* interface and function clocks */ | 19 | /* interface and function clocks */ |
diff --git a/drivers/usb/host/ehci-dbg.c b/drivers/usb/host/ehci-dbg.c index fd9109d7eb0e..680e1a31fb87 100644 --- a/drivers/usb/host/ehci-dbg.c +++ b/drivers/usb/host/ehci-dbg.c | |||
@@ -352,7 +352,6 @@ static int debug_async_open(struct inode *, struct file *); | |||
352 | static int debug_periodic_open(struct inode *, struct file *); | 352 | static int debug_periodic_open(struct inode *, struct file *); |
353 | static int debug_registers_open(struct inode *, struct file *); | 353 | static int debug_registers_open(struct inode *, struct file *); |
354 | static int debug_async_open(struct inode *, struct file *); | 354 | static int debug_async_open(struct inode *, struct file *); |
355 | static int debug_lpm_open(struct inode *, struct file *); | ||
356 | static ssize_t debug_lpm_read(struct file *file, char __user *user_buf, | 355 | static ssize_t debug_lpm_read(struct file *file, char __user *user_buf, |
357 | size_t count, loff_t *ppos); | 356 | size_t count, loff_t *ppos); |
358 | static ssize_t debug_lpm_write(struct file *file, const char __user *buffer, | 357 | static ssize_t debug_lpm_write(struct file *file, const char __user *buffer, |
@@ -385,7 +384,7 @@ static const struct file_operations debug_registers_fops = { | |||
385 | }; | 384 | }; |
386 | static const struct file_operations debug_lpm_fops = { | 385 | static const struct file_operations debug_lpm_fops = { |
387 | .owner = THIS_MODULE, | 386 | .owner = THIS_MODULE, |
388 | .open = debug_lpm_open, | 387 | .open = simple_open, |
389 | .read = debug_lpm_read, | 388 | .read = debug_lpm_read, |
390 | .write = debug_lpm_write, | 389 | .write = debug_lpm_write, |
391 | .release = debug_lpm_close, | 390 | .release = debug_lpm_close, |
@@ -970,12 +969,6 @@ static int debug_registers_open(struct inode *inode, struct file *file) | |||
970 | return file->private_data ? 0 : -ENOMEM; | 969 | return file->private_data ? 0 : -ENOMEM; |
971 | } | 970 | } |
972 | 971 | ||
973 | static int debug_lpm_open(struct inode *inode, struct file *file) | ||
974 | { | ||
975 | file->private_data = inode->i_private; | ||
976 | return 0; | ||
977 | } | ||
978 | |||
979 | static int debug_lpm_close(struct inode *inode, struct file *file) | 972 | static int debug_lpm_close(struct inode *inode, struct file *file) |
980 | { | 973 | { |
981 | return 0; | 974 | return 0; |
diff --git a/drivers/usb/host/ohci-at91.c b/drivers/usb/host/ohci-at91.c index db8963f5fbce..09f597ad6e00 100644 --- a/drivers/usb/host/ohci-at91.c +++ b/drivers/usb/host/ohci-at91.c | |||
@@ -27,6 +27,10 @@ | |||
27 | #error "CONFIG_ARCH_AT91 must be defined." | 27 | #error "CONFIG_ARCH_AT91 must be defined." |
28 | #endif | 28 | #endif |
29 | 29 | ||
30 | #define valid_port(index) ((index) >= 0 && (index) < AT91_MAX_USBH_PORTS) | ||
31 | #define at91_for_each_port(index) \ | ||
32 | for ((index) = 0; (index) < AT91_MAX_USBH_PORTS; (index)++) | ||
33 | |||
30 | /* interface and function clocks; sometimes also an AHB clock */ | 34 | /* interface and function clocks; sometimes also an AHB clock */ |
31 | static struct clk *iclk, *fclk, *hclk; | 35 | static struct clk *iclk, *fclk, *hclk; |
32 | static int clocked; | 36 | static int clocked; |
@@ -240,26 +244,26 @@ ohci_at91_start (struct usb_hcd *hcd) | |||
240 | 244 | ||
241 | static void ohci_at91_usb_set_power(struct at91_usbh_data *pdata, int port, int enable) | 245 | static void ohci_at91_usb_set_power(struct at91_usbh_data *pdata, int port, int enable) |
242 | { | 246 | { |
243 | if (port < 0 || port >= 2) | 247 | if (!valid_port(port)) |
244 | return; | 248 | return; |
245 | 249 | ||
246 | if (!gpio_is_valid(pdata->vbus_pin[port])) | 250 | if (!gpio_is_valid(pdata->vbus_pin[port])) |
247 | return; | 251 | return; |
248 | 252 | ||
249 | gpio_set_value(pdata->vbus_pin[port], | 253 | gpio_set_value(pdata->vbus_pin[port], |
250 | !pdata->vbus_pin_active_low[port] ^ enable); | 254 | pdata->vbus_pin_active_low[port] ^ enable); |
251 | } | 255 | } |
252 | 256 | ||
253 | static int ohci_at91_usb_get_power(struct at91_usbh_data *pdata, int port) | 257 | static int ohci_at91_usb_get_power(struct at91_usbh_data *pdata, int port) |
254 | { | 258 | { |
255 | if (port < 0 || port >= 2) | 259 | if (!valid_port(port)) |
256 | return -EINVAL; | 260 | return -EINVAL; |
257 | 261 | ||
258 | if (!gpio_is_valid(pdata->vbus_pin[port])) | 262 | if (!gpio_is_valid(pdata->vbus_pin[port])) |
259 | return -EINVAL; | 263 | return -EINVAL; |
260 | 264 | ||
261 | return gpio_get_value(pdata->vbus_pin[port]) ^ | 265 | return gpio_get_value(pdata->vbus_pin[port]) ^ |
262 | !pdata->vbus_pin_active_low[port]; | 266 | pdata->vbus_pin_active_low[port]; |
263 | } | 267 | } |
264 | 268 | ||
265 | /* | 269 | /* |
@@ -271,9 +275,9 @@ static int ohci_at91_hub_status_data(struct usb_hcd *hcd, char *buf) | |||
271 | int length = ohci_hub_status_data(hcd, buf); | 275 | int length = ohci_hub_status_data(hcd, buf); |
272 | int port; | 276 | int port; |
273 | 277 | ||
274 | for (port = 0; port < ARRAY_SIZE(pdata->overcurrent_pin); port++) { | 278 | at91_for_each_port(port) { |
275 | if (pdata->overcurrent_changed[port]) { | 279 | if (pdata->overcurrent_changed[port]) { |
276 | if (! length) | 280 | if (!length) |
277 | length = 1; | 281 | length = 1; |
278 | buf[0] |= 1 << (port + 1); | 282 | buf[0] |= 1 << (port + 1); |
279 | } | 283 | } |
@@ -297,11 +301,17 @@ static int ohci_at91_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | |||
297 | "ohci_at91_hub_control(%p,0x%04x,0x%04x,0x%04x,%p,%04x)\n", | 301 | "ohci_at91_hub_control(%p,0x%04x,0x%04x,0x%04x,%p,%04x)\n", |
298 | hcd, typeReq, wValue, wIndex, buf, wLength); | 302 | hcd, typeReq, wValue, wIndex, buf, wLength); |
299 | 303 | ||
304 | wIndex--; | ||
305 | |||
300 | switch (typeReq) { | 306 | switch (typeReq) { |
301 | case SetPortFeature: | 307 | case SetPortFeature: |
302 | if (wValue == USB_PORT_FEAT_POWER) { | 308 | if (wValue == USB_PORT_FEAT_POWER) { |
303 | dev_dbg(hcd->self.controller, "SetPortFeat: POWER\n"); | 309 | dev_dbg(hcd->self.controller, "SetPortFeat: POWER\n"); |
304 | ohci_at91_usb_set_power(pdata, wIndex - 1, 1); | 310 | if (valid_port(wIndex)) { |
311 | ohci_at91_usb_set_power(pdata, wIndex, 1); | ||
312 | ret = 0; | ||
313 | } | ||
314 | |||
305 | goto out; | 315 | goto out; |
306 | } | 316 | } |
307 | break; | 317 | break; |
@@ -312,9 +322,9 @@ static int ohci_at91_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | |||
312 | dev_dbg(hcd->self.controller, | 322 | dev_dbg(hcd->self.controller, |
313 | "ClearPortFeature: C_OVER_CURRENT\n"); | 323 | "ClearPortFeature: C_OVER_CURRENT\n"); |
314 | 324 | ||
315 | if (wIndex == 1 || wIndex == 2) { | 325 | if (valid_port(wIndex)) { |
316 | pdata->overcurrent_changed[wIndex-1] = 0; | 326 | pdata->overcurrent_changed[wIndex] = 0; |
317 | pdata->overcurrent_status[wIndex-1] = 0; | 327 | pdata->overcurrent_status[wIndex] = 0; |
318 | } | 328 | } |
319 | 329 | ||
320 | goto out; | 330 | goto out; |
@@ -323,9 +333,8 @@ static int ohci_at91_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | |||
323 | dev_dbg(hcd->self.controller, | 333 | dev_dbg(hcd->self.controller, |
324 | "ClearPortFeature: OVER_CURRENT\n"); | 334 | "ClearPortFeature: OVER_CURRENT\n"); |
325 | 335 | ||
326 | if (wIndex == 1 || wIndex == 2) { | 336 | if (valid_port(wIndex)) |
327 | pdata->overcurrent_status[wIndex-1] = 0; | 337 | pdata->overcurrent_status[wIndex] = 0; |
328 | } | ||
329 | 338 | ||
330 | goto out; | 339 | goto out; |
331 | 340 | ||
@@ -333,15 +342,15 @@ static int ohci_at91_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | |||
333 | dev_dbg(hcd->self.controller, | 342 | dev_dbg(hcd->self.controller, |
334 | "ClearPortFeature: POWER\n"); | 343 | "ClearPortFeature: POWER\n"); |
335 | 344 | ||
336 | if (wIndex == 1 || wIndex == 2) { | 345 | if (valid_port(wIndex)) { |
337 | ohci_at91_usb_set_power(pdata, wIndex - 1, 0); | 346 | ohci_at91_usb_set_power(pdata, wIndex, 0); |
338 | return 0; | 347 | return 0; |
339 | } | 348 | } |
340 | } | 349 | } |
341 | break; | 350 | break; |
342 | } | 351 | } |
343 | 352 | ||
344 | ret = ohci_hub_control(hcd, typeReq, wValue, wIndex, buf, wLength); | 353 | ret = ohci_hub_control(hcd, typeReq, wValue, wIndex + 1, buf, wLength); |
345 | if (ret) | 354 | if (ret) |
346 | goto out; | 355 | goto out; |
347 | 356 | ||
@@ -377,18 +386,15 @@ static int ohci_at91_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | |||
377 | 386 | ||
378 | dev_dbg(hcd->self.controller, "GetPortStatus(%d)\n", wIndex); | 387 | dev_dbg(hcd->self.controller, "GetPortStatus(%d)\n", wIndex); |
379 | 388 | ||
380 | if (wIndex == 1 || wIndex == 2) { | 389 | if (valid_port(wIndex)) { |
381 | if (! ohci_at91_usb_get_power(pdata, wIndex-1)) { | 390 | if (!ohci_at91_usb_get_power(pdata, wIndex)) |
382 | *data &= ~cpu_to_le32(RH_PS_PPS); | 391 | *data &= ~cpu_to_le32(RH_PS_PPS); |
383 | } | ||
384 | 392 | ||
385 | if (pdata->overcurrent_changed[wIndex-1]) { | 393 | if (pdata->overcurrent_changed[wIndex]) |
386 | *data |= cpu_to_le32(RH_PS_OCIC); | 394 | *data |= cpu_to_le32(RH_PS_OCIC); |
387 | } | ||
388 | 395 | ||
389 | if (pdata->overcurrent_status[wIndex-1]) { | 396 | if (pdata->overcurrent_status[wIndex]) |
390 | *data |= cpu_to_le32(RH_PS_POCI); | 397 | *data |= cpu_to_le32(RH_PS_POCI); |
391 | } | ||
392 | } | 398 | } |
393 | } | 399 | } |
394 | 400 | ||
@@ -450,14 +456,14 @@ static irqreturn_t ohci_hcd_at91_overcurrent_irq(int irq, void *data) | |||
450 | 456 | ||
451 | /* From the GPIO notifying the over-current situation, find | 457 | /* From the GPIO notifying the over-current situation, find |
452 | * out the corresponding port */ | 458 | * out the corresponding port */ |
453 | for (port = 0; port < ARRAY_SIZE(pdata->overcurrent_pin); port++) { | 459 | at91_for_each_port(port) { |
454 | if (gpio_to_irq(pdata->overcurrent_pin[port]) == irq) { | 460 | if (gpio_to_irq(pdata->overcurrent_pin[port]) == irq) { |
455 | gpio = pdata->overcurrent_pin[port]; | 461 | gpio = pdata->overcurrent_pin[port]; |
456 | break; | 462 | break; |
457 | } | 463 | } |
458 | } | 464 | } |
459 | 465 | ||
460 | if (port == ARRAY_SIZE(pdata->overcurrent_pin)) { | 466 | if (port == AT91_MAX_USBH_PORTS) { |
461 | dev_err(& pdev->dev, "overcurrent interrupt from unknown GPIO\n"); | 467 | dev_err(& pdev->dev, "overcurrent interrupt from unknown GPIO\n"); |
462 | return IRQ_HANDLED; | 468 | return IRQ_HANDLED; |
463 | } | 469 | } |
@@ -467,7 +473,7 @@ static irqreturn_t ohci_hcd_at91_overcurrent_irq(int irq, void *data) | |||
467 | /* When notified of an over-current situation, disable power | 473 | /* When notified of an over-current situation, disable power |
468 | on the corresponding port, and mark this port in | 474 | on the corresponding port, and mark this port in |
469 | over-current. */ | 475 | over-current. */ |
470 | if (! val) { | 476 | if (!val) { |
471 | ohci_at91_usb_set_power(pdata, port, 0); | 477 | ohci_at91_usb_set_power(pdata, port, 0); |
472 | pdata->overcurrent_status[port] = 1; | 478 | pdata->overcurrent_status[port] = 1; |
473 | pdata->overcurrent_changed[port] = 1; | 479 | pdata->overcurrent_changed[port] = 1; |
@@ -492,7 +498,7 @@ static u64 at91_ohci_dma_mask = DMA_BIT_MASK(32); | |||
492 | static int __devinit ohci_at91_of_init(struct platform_device *pdev) | 498 | static int __devinit ohci_at91_of_init(struct platform_device *pdev) |
493 | { | 499 | { |
494 | struct device_node *np = pdev->dev.of_node; | 500 | struct device_node *np = pdev->dev.of_node; |
495 | int i, ret, gpio; | 501 | int i, gpio; |
496 | enum of_gpio_flags flags; | 502 | enum of_gpio_flags flags; |
497 | struct at91_usbh_data *pdata; | 503 | struct at91_usbh_data *pdata; |
498 | u32 ports; | 504 | u32 ports; |
@@ -514,48 +520,17 @@ static int __devinit ohci_at91_of_init(struct platform_device *pdev) | |||
514 | if (!of_property_read_u32(np, "num-ports", &ports)) | 520 | if (!of_property_read_u32(np, "num-ports", &ports)) |
515 | pdata->ports = ports; | 521 | pdata->ports = ports; |
516 | 522 | ||
517 | for (i = 0; i < 2; i++) { | 523 | at91_for_each_port(i) { |
518 | gpio = of_get_named_gpio_flags(np, "atmel,vbus-gpio", i, &flags); | 524 | gpio = of_get_named_gpio_flags(np, "atmel,vbus-gpio", i, &flags); |
519 | pdata->vbus_pin[i] = gpio; | 525 | pdata->vbus_pin[i] = gpio; |
520 | if (!gpio_is_valid(gpio)) | 526 | if (!gpio_is_valid(gpio)) |
521 | continue; | 527 | continue; |
522 | pdata->vbus_pin_active_low[i] = flags & OF_GPIO_ACTIVE_LOW; | 528 | pdata->vbus_pin_active_low[i] = flags & OF_GPIO_ACTIVE_LOW; |
523 | ret = gpio_request(gpio, "ohci_vbus"); | ||
524 | if (ret) { | ||
525 | dev_warn(&pdev->dev, "can't request vbus gpio %d", gpio); | ||
526 | continue; | ||
527 | } | ||
528 | ret = gpio_direction_output(gpio, !(flags & OF_GPIO_ACTIVE_LOW) ^ 1); | ||
529 | if (ret) | ||
530 | dev_warn(&pdev->dev, "can't put vbus gpio %d as output %d", | ||
531 | !(flags & OF_GPIO_ACTIVE_LOW) ^ 1, gpio); | ||
532 | } | 529 | } |
533 | 530 | ||
534 | for (i = 0; i < 2; i++) { | 531 | at91_for_each_port(i) |
535 | gpio = of_get_named_gpio_flags(np, "atmel,oc-gpio", i, &flags); | 532 | pdata->overcurrent_pin[i] = |
536 | pdata->overcurrent_pin[i] = gpio; | 533 | of_get_named_gpio_flags(np, "atmel,oc-gpio", i, &flags); |
537 | if (!gpio_is_valid(gpio)) | ||
538 | continue; | ||
539 | ret = gpio_request(gpio, "ohci_overcurrent"); | ||
540 | if (ret) { | ||
541 | dev_err(&pdev->dev, "can't request overcurrent gpio %d", gpio); | ||
542 | continue; | ||
543 | } | ||
544 | |||
545 | ret = gpio_direction_input(gpio); | ||
546 | if (ret) { | ||
547 | dev_err(&pdev->dev, "can't configure overcurrent gpio %d as input", gpio); | ||
548 | continue; | ||
549 | } | ||
550 | |||
551 | ret = request_irq(gpio_to_irq(gpio), | ||
552 | ohci_hcd_at91_overcurrent_irq, | ||
553 | IRQF_SHARED, "ohci_overcurrent", pdev); | ||
554 | if (ret) { | ||
555 | gpio_free(gpio); | ||
556 | dev_warn(& pdev->dev, "cannot get GPIO IRQ for overcurrent\n"); | ||
557 | } | ||
558 | } | ||
559 | 534 | ||
560 | pdev->dev.platform_data = pdata; | 535 | pdev->dev.platform_data = pdata; |
561 | 536 | ||
@@ -574,35 +549,69 @@ static int ohci_hcd_at91_drv_probe(struct platform_device *pdev) | |||
574 | { | 549 | { |
575 | struct at91_usbh_data *pdata; | 550 | struct at91_usbh_data *pdata; |
576 | int i; | 551 | int i; |
552 | int gpio; | ||
553 | int ret; | ||
577 | 554 | ||
578 | i = ohci_at91_of_init(pdev); | 555 | ret = ohci_at91_of_init(pdev); |
579 | 556 | if (ret) | |
580 | if (i) | 557 | return ret; |
581 | return i; | ||
582 | 558 | ||
583 | pdata = pdev->dev.platform_data; | 559 | pdata = pdev->dev.platform_data; |
584 | 560 | ||
585 | if (pdata) { | 561 | if (pdata) { |
586 | for (i = 0; i < ARRAY_SIZE(pdata->vbus_pin); i++) { | 562 | at91_for_each_port(i) { |
587 | if (!gpio_is_valid(pdata->vbus_pin[i])) | 563 | if (!gpio_is_valid(pdata->vbus_pin[i])) |
588 | continue; | 564 | continue; |
589 | gpio_request(pdata->vbus_pin[i], "ohci_vbus"); | 565 | gpio = pdata->vbus_pin[i]; |
566 | |||
567 | ret = gpio_request(gpio, "ohci_vbus"); | ||
568 | if (ret) { | ||
569 | dev_err(&pdev->dev, | ||
570 | "can't request vbus gpio %d\n", gpio); | ||
571 | continue; | ||
572 | } | ||
573 | ret = gpio_direction_output(gpio, | ||
574 | !pdata->vbus_pin_active_low[i]); | ||
575 | if (ret) { | ||
576 | dev_err(&pdev->dev, | ||
577 | "can't put vbus gpio %d as output %d\n", | ||
578 | gpio, !pdata->vbus_pin_active_low[i]); | ||
579 | gpio_free(gpio); | ||
580 | continue; | ||
581 | } | ||
582 | |||
590 | ohci_at91_usb_set_power(pdata, i, 1); | 583 | ohci_at91_usb_set_power(pdata, i, 1); |
591 | } | 584 | } |
592 | 585 | ||
593 | for (i = 0; i < ARRAY_SIZE(pdata->overcurrent_pin); i++) { | 586 | at91_for_each_port(i) { |
594 | int ret; | ||
595 | |||
596 | if (!gpio_is_valid(pdata->overcurrent_pin[i])) | 587 | if (!gpio_is_valid(pdata->overcurrent_pin[i])) |
597 | continue; | 588 | continue; |
598 | gpio_request(pdata->overcurrent_pin[i], "ohci_overcurrent"); | 589 | gpio = pdata->overcurrent_pin[i]; |
590 | |||
591 | ret = gpio_request(gpio, "ohci_overcurrent"); | ||
592 | if (ret) { | ||
593 | dev_err(&pdev->dev, | ||
594 | "can't request overcurrent gpio %d\n", | ||
595 | gpio); | ||
596 | continue; | ||
597 | } | ||
598 | |||
599 | ret = gpio_direction_input(gpio); | ||
600 | if (ret) { | ||
601 | dev_err(&pdev->dev, | ||
602 | "can't configure overcurrent gpio %d as input\n", | ||
603 | gpio); | ||
604 | gpio_free(gpio); | ||
605 | continue; | ||
606 | } | ||
599 | 607 | ||
600 | ret = request_irq(gpio_to_irq(pdata->overcurrent_pin[i]), | 608 | ret = request_irq(gpio_to_irq(gpio), |
601 | ohci_hcd_at91_overcurrent_irq, | 609 | ohci_hcd_at91_overcurrent_irq, |
602 | IRQF_SHARED, "ohci_overcurrent", pdev); | 610 | IRQF_SHARED, "ohci_overcurrent", pdev); |
603 | if (ret) { | 611 | if (ret) { |
604 | gpio_free(pdata->overcurrent_pin[i]); | 612 | gpio_free(gpio); |
605 | dev_warn(& pdev->dev, "cannot get GPIO IRQ for overcurrent\n"); | 613 | dev_err(&pdev->dev, |
614 | "can't get gpio IRQ for overcurrent\n"); | ||
606 | } | 615 | } |
607 | } | 616 | } |
608 | } | 617 | } |
@@ -617,14 +626,14 @@ static int ohci_hcd_at91_drv_remove(struct platform_device *pdev) | |||
617 | int i; | 626 | int i; |
618 | 627 | ||
619 | if (pdata) { | 628 | if (pdata) { |
620 | for (i = 0; i < ARRAY_SIZE(pdata->vbus_pin); i++) { | 629 | at91_for_each_port(i) { |
621 | if (!gpio_is_valid(pdata->vbus_pin[i])) | 630 | if (!gpio_is_valid(pdata->vbus_pin[i])) |
622 | continue; | 631 | continue; |
623 | ohci_at91_usb_set_power(pdata, i, 0); | 632 | ohci_at91_usb_set_power(pdata, i, 0); |
624 | gpio_free(pdata->vbus_pin[i]); | 633 | gpio_free(pdata->vbus_pin[i]); |
625 | } | 634 | } |
626 | 635 | ||
627 | for (i = 0; i < ARRAY_SIZE(pdata->overcurrent_pin); i++) { | 636 | at91_for_each_port(i) { |
628 | if (!gpio_is_valid(pdata->overcurrent_pin[i])) | 637 | if (!gpio_is_valid(pdata->overcurrent_pin[i])) |
629 | continue; | 638 | continue; |
630 | free_irq(gpio_to_irq(pdata->overcurrent_pin[i]), pdev); | 639 | free_irq(gpio_to_irq(pdata->overcurrent_pin[i]), pdev); |
diff --git a/drivers/uwb/uwb-debug.c b/drivers/uwb/uwb-debug.c index 2eecec0c13c9..6ec45beb7af5 100644 --- a/drivers/uwb/uwb-debug.c +++ b/drivers/uwb/uwb-debug.c | |||
@@ -159,13 +159,6 @@ static int cmd_ie_rm(struct uwb_rc *rc, struct uwb_dbg_cmd_ie *ie_to_rm) | |||
159 | return uwb_rc_ie_rm(rc, ie_to_rm->data[0]); | 159 | return uwb_rc_ie_rm(rc, ie_to_rm->data[0]); |
160 | } | 160 | } |
161 | 161 | ||
162 | static int command_open(struct inode *inode, struct file *file) | ||
163 | { | ||
164 | file->private_data = inode->i_private; | ||
165 | |||
166 | return 0; | ||
167 | } | ||
168 | |||
169 | static ssize_t command_write(struct file *file, const char __user *buf, | 162 | static ssize_t command_write(struct file *file, const char __user *buf, |
170 | size_t len, loff_t *off) | 163 | size_t len, loff_t *off) |
171 | { | 164 | { |
@@ -206,7 +199,7 @@ static ssize_t command_write(struct file *file, const char __user *buf, | |||
206 | } | 199 | } |
207 | 200 | ||
208 | static const struct file_operations command_fops = { | 201 | static const struct file_operations command_fops = { |
209 | .open = command_open, | 202 | .open = simple_open, |
210 | .write = command_write, | 203 | .write = command_write, |
211 | .read = NULL, | 204 | .read = NULL, |
212 | .llseek = no_llseek, | 205 | .llseek = no_llseek, |
diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig index 7ed9991fa747..af16884491ed 100644 --- a/drivers/video/backlight/Kconfig +++ b/drivers/video/backlight/Kconfig | |||
@@ -245,6 +245,12 @@ config BACKLIGHT_DA903X | |||
245 | If you have a LCD backlight connected to the WLED output of DA9030 | 245 | If you have a LCD backlight connected to the WLED output of DA9030 |
246 | or DA9034 WLED output, say Y here to enable this driver. | 246 | or DA9034 WLED output, say Y here to enable this driver. |
247 | 247 | ||
248 | config BACKLIGHT_DA9052 | ||
249 | tristate "Dialog DA9052/DA9053 WLED" | ||
250 | depends on PMIC_DA9052 | ||
251 | help | ||
252 | Enable the Backlight Driver for DA9052-BC and DA9053-AA/Bx PMICs. | ||
253 | |||
248 | config BACKLIGHT_MAX8925 | 254 | config BACKLIGHT_MAX8925 |
249 | tristate "Backlight driver for MAX8925" | 255 | tristate "Backlight driver for MAX8925" |
250 | depends on MFD_MAX8925 | 256 | depends on MFD_MAX8925 |
diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile index 8071eb656147..36855ae887d6 100644 --- a/drivers/video/backlight/Makefile +++ b/drivers/video/backlight/Makefile | |||
@@ -29,6 +29,7 @@ obj-$(CONFIG_BACKLIGHT_PROGEAR) += progear_bl.o | |||
29 | obj-$(CONFIG_BACKLIGHT_CARILLO_RANCH) += cr_bllcd.o | 29 | obj-$(CONFIG_BACKLIGHT_CARILLO_RANCH) += cr_bllcd.o |
30 | obj-$(CONFIG_BACKLIGHT_PWM) += pwm_bl.o | 30 | obj-$(CONFIG_BACKLIGHT_PWM) += pwm_bl.o |
31 | obj-$(CONFIG_BACKLIGHT_DA903X) += da903x_bl.o | 31 | obj-$(CONFIG_BACKLIGHT_DA903X) += da903x_bl.o |
32 | obj-$(CONFIG_BACKLIGHT_DA9052) += da9052_bl.o | ||
32 | obj-$(CONFIG_BACKLIGHT_MAX8925) += max8925_bl.o | 33 | obj-$(CONFIG_BACKLIGHT_MAX8925) += max8925_bl.o |
33 | obj-$(CONFIG_BACKLIGHT_APPLE) += apple_bl.o | 34 | obj-$(CONFIG_BACKLIGHT_APPLE) += apple_bl.o |
34 | obj-$(CONFIG_BACKLIGHT_TOSA) += tosa_bl.o | 35 | obj-$(CONFIG_BACKLIGHT_TOSA) += tosa_bl.o |
diff --git a/drivers/video/backlight/da9052_bl.c b/drivers/video/backlight/da9052_bl.c new file mode 100644 index 000000000000..b628d68f5162 --- /dev/null +++ b/drivers/video/backlight/da9052_bl.c | |||
@@ -0,0 +1,187 @@ | |||
1 | /* | ||
2 | * Backlight Driver for Dialog DA9052 PMICs | ||
3 | * | ||
4 | * Copyright(c) 2012 Dialog Semiconductor Ltd. | ||
5 | * | ||
6 | * Author: David Dajun Chen <dchen@diasemi.com> | ||
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 as published by | ||
10 | * the Free Software Foundation; either version 2 of the License, or | ||
11 | * (at your option) any later version. | ||
12 | * | ||
13 | */ | ||
14 | |||
15 | #include <linux/backlight.h> | ||
16 | #include <linux/delay.h> | ||
17 | #include <linux/fb.h> | ||
18 | #include <linux/module.h> | ||
19 | #include <linux/platform_device.h> | ||
20 | |||
21 | #include <linux/mfd/da9052/da9052.h> | ||
22 | #include <linux/mfd/da9052/reg.h> | ||
23 | |||
24 | #define DA9052_MAX_BRIGHTNESS 0xFF | ||
25 | |||
26 | enum { | ||
27 | DA9052_WLEDS_OFF, | ||
28 | DA9052_WLEDS_ON, | ||
29 | }; | ||
30 | |||
31 | enum { | ||
32 | DA9052_TYPE_WLED1, | ||
33 | DA9052_TYPE_WLED2, | ||
34 | DA9052_TYPE_WLED3, | ||
35 | }; | ||
36 | |||
37 | static unsigned char wled_bank[] = { | ||
38 | DA9052_LED1_CONF_REG, | ||
39 | DA9052_LED2_CONF_REG, | ||
40 | DA9052_LED3_CONF_REG, | ||
41 | }; | ||
42 | |||
43 | struct da9052_bl { | ||
44 | struct da9052 *da9052; | ||
45 | uint brightness; | ||
46 | uint state; | ||
47 | uint led_reg; | ||
48 | }; | ||
49 | |||
50 | static int da9052_adjust_wled_brightness(struct da9052_bl *wleds) | ||
51 | { | ||
52 | unsigned char boost_en; | ||
53 | unsigned char i_sink; | ||
54 | int ret; | ||
55 | |||
56 | boost_en = 0x3F; | ||
57 | i_sink = 0xFF; | ||
58 | if (wleds->state == DA9052_WLEDS_OFF) { | ||
59 | boost_en = 0x00; | ||
60 | i_sink = 0x00; | ||
61 | } | ||
62 | |||
63 | ret = da9052_reg_write(wleds->da9052, DA9052_BOOST_REG, boost_en); | ||
64 | if (ret < 0) | ||
65 | return ret; | ||
66 | |||
67 | ret = da9052_reg_write(wleds->da9052, DA9052_LED_CONT_REG, i_sink); | ||
68 | if (ret < 0) | ||
69 | return ret; | ||
70 | |||
71 | ret = da9052_reg_write(wleds->da9052, wled_bank[wleds->led_reg], 0x0); | ||
72 | if (ret < 0) | ||
73 | return ret; | ||
74 | |||
75 | msleep(10); | ||
76 | |||
77 | if (wleds->brightness) { | ||
78 | ret = da9052_reg_write(wleds->da9052, wled_bank[wleds->led_reg], | ||
79 | wleds->brightness); | ||
80 | if (ret < 0) | ||
81 | return ret; | ||
82 | } | ||
83 | |||
84 | return 0; | ||
85 | } | ||
86 | |||
87 | static int da9052_backlight_update_status(struct backlight_device *bl) | ||
88 | { | ||
89 | int brightness = bl->props.brightness; | ||
90 | struct da9052_bl *wleds = bl_get_data(bl); | ||
91 | |||
92 | wleds->brightness = brightness; | ||
93 | wleds->state = DA9052_WLEDS_ON; | ||
94 | |||
95 | return da9052_adjust_wled_brightness(wleds); | ||
96 | } | ||
97 | |||
98 | static int da9052_backlight_get_brightness(struct backlight_device *bl) | ||
99 | { | ||
100 | struct da9052_bl *wleds = bl_get_data(bl); | ||
101 | |||
102 | return wleds->brightness; | ||
103 | } | ||
104 | |||
105 | static const struct backlight_ops da9052_backlight_ops = { | ||
106 | .update_status = da9052_backlight_update_status, | ||
107 | .get_brightness = da9052_backlight_get_brightness, | ||
108 | }; | ||
109 | |||
110 | static int da9052_backlight_probe(struct platform_device *pdev) | ||
111 | { | ||
112 | struct backlight_device *bl; | ||
113 | struct backlight_properties props; | ||
114 | struct da9052_bl *wleds; | ||
115 | |||
116 | wleds = devm_kzalloc(&pdev->dev, sizeof(struct da9052_bl), GFP_KERNEL); | ||
117 | if (!wleds) | ||
118 | return -ENOMEM; | ||
119 | |||
120 | wleds->da9052 = dev_get_drvdata(pdev->dev.parent); | ||
121 | wleds->brightness = 0; | ||
122 | wleds->led_reg = platform_get_device_id(pdev)->driver_data; | ||
123 | wleds->state = DA9052_WLEDS_OFF; | ||
124 | |||
125 | props.type = BACKLIGHT_RAW; | ||
126 | props.max_brightness = DA9052_MAX_BRIGHTNESS; | ||
127 | |||
128 | bl = backlight_device_register(pdev->name, wleds->da9052->dev, wleds, | ||
129 | &da9052_backlight_ops, &props); | ||
130 | if (IS_ERR(bl)) { | ||
131 | dev_err(&pdev->dev, "Failed to register backlight\n"); | ||
132 | devm_kfree(&pdev->dev, wleds); | ||
133 | return PTR_ERR(bl); | ||
134 | } | ||
135 | |||
136 | bl->props.max_brightness = DA9052_MAX_BRIGHTNESS; | ||
137 | bl->props.brightness = 0; | ||
138 | platform_set_drvdata(pdev, bl); | ||
139 | |||
140 | return da9052_adjust_wled_brightness(wleds); | ||
141 | } | ||
142 | |||
143 | static int da9052_backlight_remove(struct platform_device *pdev) | ||
144 | { | ||
145 | struct backlight_device *bl = platform_get_drvdata(pdev); | ||
146 | struct da9052_bl *wleds = bl_get_data(bl); | ||
147 | |||
148 | wleds->brightness = 0; | ||
149 | wleds->state = DA9052_WLEDS_OFF; | ||
150 | da9052_adjust_wled_brightness(wleds); | ||
151 | backlight_device_unregister(bl); | ||
152 | devm_kfree(&pdev->dev, wleds); | ||
153 | |||
154 | return 0; | ||
155 | } | ||
156 | |||
157 | static struct platform_device_id da9052_wled_ids[] = { | ||
158 | { | ||
159 | .name = "da9052-wled1", | ||
160 | .driver_data = DA9052_TYPE_WLED1, | ||
161 | }, | ||
162 | { | ||
163 | .name = "da9052-wled2", | ||
164 | .driver_data = DA9052_TYPE_WLED2, | ||
165 | }, | ||
166 | { | ||
167 | .name = "da9052-wled3", | ||
168 | .driver_data = DA9052_TYPE_WLED3, | ||
169 | }, | ||
170 | }; | ||
171 | |||
172 | static struct platform_driver da9052_wled_driver = { | ||
173 | .probe = da9052_backlight_probe, | ||
174 | .remove = da9052_backlight_remove, | ||
175 | .id_table = da9052_wled_ids, | ||
176 | .driver = { | ||
177 | .name = "da9052-wled", | ||
178 | .owner = THIS_MODULE, | ||
179 | }, | ||
180 | }; | ||
181 | |||
182 | module_platform_driver(da9052_wled_driver); | ||
183 | |||
184 | MODULE_AUTHOR("David Dajun Chen <dchen@diasemi.com>"); | ||
185 | MODULE_DESCRIPTION("Backlight driver for DA9052 PMIC"); | ||
186 | MODULE_LICENSE("GPL"); | ||
187 | MODULE_ALIAS("platform:da9052-backlight"); | ||
diff --git a/drivers/video/backlight/locomolcd.c b/drivers/video/backlight/locomolcd.c index be20b5cbe26c..3a6d5419e3e3 100644 --- a/drivers/video/backlight/locomolcd.c +++ b/drivers/video/backlight/locomolcd.c | |||
@@ -229,14 +229,7 @@ static struct locomo_driver poodle_lcd_driver = { | |||
229 | 229 | ||
230 | static int __init locomolcd_init(void) | 230 | static int __init locomolcd_init(void) |
231 | { | 231 | { |
232 | int ret = locomo_driver_register(&poodle_lcd_driver); | 232 | return locomo_driver_register(&poodle_lcd_driver); |
233 | if (ret) | ||
234 | return ret; | ||
235 | |||
236 | #ifdef CONFIG_SA1100_COLLIE | ||
237 | sa1100fb_lcd_power = locomolcd_power; | ||
238 | #endif | ||
239 | return 0; | ||
240 | } | 233 | } |
241 | 234 | ||
242 | static void __exit locomolcd_exit(void) | 235 | static void __exit locomolcd_exit(void) |
diff --git a/drivers/xen/xen-pciback/pciback_ops.c b/drivers/xen/xen-pciback/pciback_ops.c index 63616d7453e6..97f5d264c31e 100644 --- a/drivers/xen/xen-pciback/pciback_ops.c +++ b/drivers/xen/xen-pciback/pciback_ops.c | |||
@@ -234,7 +234,7 @@ int xen_pcibk_enable_msix(struct xen_pcibk_device *pdev, | |||
234 | if (dev_data) | 234 | if (dev_data) |
235 | dev_data->ack_intr = 0; | 235 | dev_data->ack_intr = 0; |
236 | 236 | ||
237 | return result; | 237 | return result > 0 ? 0 : result; |
238 | } | 238 | } |
239 | 239 | ||
240 | static | 240 | static |
diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c index 8fecc99be344..f52c5ab78f9d 100644 --- a/fs/cifs/cifssmb.c +++ b/fs/cifs/cifssmb.c | |||
@@ -3892,13 +3892,12 @@ CIFSSMBSetCIFSACL(const int xid, struct cifs_tcon *tcon, __u16 fid, | |||
3892 | int rc = 0; | 3892 | int rc = 0; |
3893 | int bytes_returned = 0; | 3893 | int bytes_returned = 0; |
3894 | SET_SEC_DESC_REQ *pSMB = NULL; | 3894 | SET_SEC_DESC_REQ *pSMB = NULL; |
3895 | NTRANSACT_RSP *pSMBr = NULL; | 3895 | void *pSMBr; |
3896 | 3896 | ||
3897 | setCifsAclRetry: | 3897 | setCifsAclRetry: |
3898 | rc = smb_init(SMB_COM_NT_TRANSACT, 19, tcon, (void **) &pSMB, | 3898 | rc = smb_init(SMB_COM_NT_TRANSACT, 19, tcon, (void **) &pSMB, &pSMBr); |
3899 | (void **) &pSMBr); | ||
3900 | if (rc) | 3899 | if (rc) |
3901 | return (rc); | 3900 | return rc; |
3902 | 3901 | ||
3903 | pSMB->MaxSetupCount = 0; | 3902 | pSMB->MaxSetupCount = 0; |
3904 | pSMB->Reserved = 0; | 3903 | pSMB->Reserved = 0; |
@@ -3926,9 +3925,8 @@ setCifsAclRetry: | |||
3926 | pSMB->AclFlags = cpu_to_le32(aclflag); | 3925 | pSMB->AclFlags = cpu_to_le32(aclflag); |
3927 | 3926 | ||
3928 | if (pntsd && acllen) { | 3927 | if (pntsd && acllen) { |
3929 | memcpy((char *) &pSMBr->hdr.Protocol + data_offset, | 3928 | memcpy((char *)pSMBr + offsetof(struct smb_hdr, Protocol) + |
3930 | (char *) pntsd, | 3929 | data_offset, pntsd, acllen); |
3931 | acllen); | ||
3932 | inc_rfc1001_len(pSMB, byte_count + data_count); | 3930 | inc_rfc1001_len(pSMB, byte_count + data_count); |
3933 | } else | 3931 | } else |
3934 | inc_rfc1001_len(pSMB, byte_count); | 3932 | inc_rfc1001_len(pSMB, byte_count); |
@@ -5708,7 +5706,8 @@ CIFSSMBSetFileInfo(const int xid, struct cifs_tcon *tcon, | |||
5708 | param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4; | 5706 | param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4; |
5709 | offset = param_offset + params; | 5707 | offset = param_offset + params; |
5710 | 5708 | ||
5711 | data_offset = (char *) (&pSMB->hdr.Protocol) + offset; | 5709 | data_offset = (char *)pSMB + |
5710 | offsetof(struct smb_hdr, Protocol) + offset; | ||
5712 | 5711 | ||
5713 | count = sizeof(FILE_BASIC_INFO); | 5712 | count = sizeof(FILE_BASIC_INFO); |
5714 | pSMB->MaxParameterCount = cpu_to_le16(2); | 5713 | pSMB->MaxParameterCount = cpu_to_le16(2); |
@@ -5977,7 +5976,7 @@ CIFSSMBUnixSetFileInfo(const int xid, struct cifs_tcon *tcon, | |||
5977 | u16 fid, u32 pid_of_opener) | 5976 | u16 fid, u32 pid_of_opener) |
5978 | { | 5977 | { |
5979 | struct smb_com_transaction2_sfi_req *pSMB = NULL; | 5978 | struct smb_com_transaction2_sfi_req *pSMB = NULL; |
5980 | FILE_UNIX_BASIC_INFO *data_offset; | 5979 | char *data_offset; |
5981 | int rc = 0; | 5980 | int rc = 0; |
5982 | u16 params, param_offset, offset, byte_count, count; | 5981 | u16 params, param_offset, offset, byte_count, count; |
5983 | 5982 | ||
@@ -5999,8 +5998,9 @@ CIFSSMBUnixSetFileInfo(const int xid, struct cifs_tcon *tcon, | |||
5999 | param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4; | 5998 | param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4; |
6000 | offset = param_offset + params; | 5999 | offset = param_offset + params; |
6001 | 6000 | ||
6002 | data_offset = (FILE_UNIX_BASIC_INFO *) | 6001 | data_offset = (char *)pSMB + |
6003 | ((char *)(&pSMB->hdr.Protocol) + offset); | 6002 | offsetof(struct smb_hdr, Protocol) + offset; |
6003 | |||
6004 | count = sizeof(FILE_UNIX_BASIC_INFO); | 6004 | count = sizeof(FILE_UNIX_BASIC_INFO); |
6005 | 6005 | ||
6006 | pSMB->MaxParameterCount = cpu_to_le16(2); | 6006 | pSMB->MaxParameterCount = cpu_to_le16(2); |
@@ -6022,7 +6022,7 @@ CIFSSMBUnixSetFileInfo(const int xid, struct cifs_tcon *tcon, | |||
6022 | inc_rfc1001_len(pSMB, byte_count); | 6022 | inc_rfc1001_len(pSMB, byte_count); |
6023 | pSMB->ByteCount = cpu_to_le16(byte_count); | 6023 | pSMB->ByteCount = cpu_to_le16(byte_count); |
6024 | 6024 | ||
6025 | cifs_fill_unix_set_info(data_offset, args); | 6025 | cifs_fill_unix_set_info((FILE_UNIX_BASIC_INFO *)data_offset, args); |
6026 | 6026 | ||
6027 | rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0); | 6027 | rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0); |
6028 | if (rc) | 6028 | if (rc) |
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index 302a15c505a9..d81e933a796b 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c | |||
@@ -1565,8 +1565,7 @@ cifs_parse_mount_options(const char *mountdata, const char *devname, | |||
1565 | 1565 | ||
1566 | /* Obtain the value string */ | 1566 | /* Obtain the value string */ |
1567 | value = strchr(data, '='); | 1567 | value = strchr(data, '='); |
1568 | if (value != NULL) | 1568 | value++; |
1569 | *value++ = '\0'; | ||
1570 | 1569 | ||
1571 | /* Set tmp_end to end of the string */ | 1570 | /* Set tmp_end to end of the string */ |
1572 | tmp_end = (char *) value + strlen(value); | 1571 | tmp_end = (char *) value + strlen(value); |
@@ -1649,6 +1648,13 @@ cifs_parse_mount_options(const char *mountdata, const char *devname, | |||
1649 | goto cifs_parse_mount_err; | 1648 | goto cifs_parse_mount_err; |
1650 | } | 1649 | } |
1651 | 1650 | ||
1651 | vol->UNC = kmalloc(temp_len+1, GFP_KERNEL); | ||
1652 | if (vol->UNC == NULL) { | ||
1653 | printk(KERN_WARNING "CIFS: no memory for UNC\n"); | ||
1654 | goto cifs_parse_mount_err; | ||
1655 | } | ||
1656 | strcpy(vol->UNC, string); | ||
1657 | |||
1652 | if (strncmp(string, "//", 2) == 0) { | 1658 | if (strncmp(string, "//", 2) == 0) { |
1653 | vol->UNC[0] = '\\'; | 1659 | vol->UNC[0] = '\\'; |
1654 | vol->UNC[1] = '\\'; | 1660 | vol->UNC[1] = '\\'; |
@@ -1658,13 +1664,6 @@ cifs_parse_mount_options(const char *mountdata, const char *devname, | |||
1658 | goto cifs_parse_mount_err; | 1664 | goto cifs_parse_mount_err; |
1659 | } | 1665 | } |
1660 | 1666 | ||
1661 | vol->UNC = kmalloc(temp_len+1, GFP_KERNEL); | ||
1662 | if (vol->UNC == NULL) { | ||
1663 | printk(KERN_WARNING "CIFS: no memory " | ||
1664 | "for UNC\n"); | ||
1665 | goto cifs_parse_mount_err; | ||
1666 | } | ||
1667 | strcpy(vol->UNC, string); | ||
1668 | break; | 1667 | break; |
1669 | case Opt_domain: | 1668 | case Opt_domain: |
1670 | string = match_strdup(args); | 1669 | string = match_strdup(args); |
diff --git a/fs/cifs/file.c b/fs/cifs/file.c index 460d87b7cda0..fae765dac934 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c | |||
@@ -835,13 +835,21 @@ cifs_posix_lock_set(struct file *file, struct file_lock *flock) | |||
835 | if ((flock->fl_flags & FL_POSIX) == 0) | 835 | if ((flock->fl_flags & FL_POSIX) == 0) |
836 | return rc; | 836 | return rc; |
837 | 837 | ||
838 | try_again: | ||
838 | mutex_lock(&cinode->lock_mutex); | 839 | mutex_lock(&cinode->lock_mutex); |
839 | if (!cinode->can_cache_brlcks) { | 840 | if (!cinode->can_cache_brlcks) { |
840 | mutex_unlock(&cinode->lock_mutex); | 841 | mutex_unlock(&cinode->lock_mutex); |
841 | return rc; | 842 | return rc; |
842 | } | 843 | } |
843 | rc = posix_lock_file_wait(file, flock); | 844 | |
845 | rc = posix_lock_file(file, flock, NULL); | ||
844 | mutex_unlock(&cinode->lock_mutex); | 846 | mutex_unlock(&cinode->lock_mutex); |
847 | if (rc == FILE_LOCK_DEFERRED) { | ||
848 | rc = wait_event_interruptible(flock->fl_wait, !flock->fl_next); | ||
849 | if (!rc) | ||
850 | goto try_again; | ||
851 | locks_delete_block(flock); | ||
852 | } | ||
845 | return rc; | 853 | return rc; |
846 | } | 854 | } |
847 | 855 | ||
diff --git a/fs/cifs/netmisc.c b/fs/cifs/netmisc.c index dd23a321bdda..581c225f7f50 100644 --- a/fs/cifs/netmisc.c +++ b/fs/cifs/netmisc.c | |||
@@ -197,8 +197,7 @@ cifs_convert_address(struct sockaddr *dst, const char *src, int len) | |||
197 | memcpy(scope_id, pct + 1, slen); | 197 | memcpy(scope_id, pct + 1, slen); |
198 | scope_id[slen] = '\0'; | 198 | scope_id[slen] = '\0'; |
199 | 199 | ||
200 | rc = strict_strtoul(scope_id, 0, | 200 | rc = kstrtouint(scope_id, 0, &s6->sin6_scope_id); |
201 | (unsigned long *)&s6->sin6_scope_id); | ||
202 | rc = (rc == 0) ? 1 : 0; | 201 | rc = (rc == 0) ? 1 : 0; |
203 | } | 202 | } |
204 | 203 | ||
diff --git a/fs/debugfs/file.c b/fs/debugfs/file.c index 21e93605161c..5dfafdd1dbd3 100644 --- a/fs/debugfs/file.c +++ b/fs/debugfs/file.c | |||
@@ -33,18 +33,10 @@ static ssize_t default_write_file(struct file *file, const char __user *buf, | |||
33 | return count; | 33 | return count; |
34 | } | 34 | } |
35 | 35 | ||
36 | static int default_open(struct inode *inode, struct file *file) | ||
37 | { | ||
38 | if (inode->i_private) | ||
39 | file->private_data = inode->i_private; | ||
40 | |||
41 | return 0; | ||
42 | } | ||
43 | |||
44 | const struct file_operations debugfs_file_operations = { | 36 | const struct file_operations debugfs_file_operations = { |
45 | .read = default_read_file, | 37 | .read = default_read_file, |
46 | .write = default_write_file, | 38 | .write = default_write_file, |
47 | .open = default_open, | 39 | .open = simple_open, |
48 | .llseek = noop_llseek, | 40 | .llseek = noop_llseek, |
49 | }; | 41 | }; |
50 | 42 | ||
@@ -447,7 +439,7 @@ static ssize_t write_file_bool(struct file *file, const char __user *user_buf, | |||
447 | static const struct file_operations fops_bool = { | 439 | static const struct file_operations fops_bool = { |
448 | .read = read_file_bool, | 440 | .read = read_file_bool, |
449 | .write = write_file_bool, | 441 | .write = write_file_bool, |
450 | .open = default_open, | 442 | .open = simple_open, |
451 | .llseek = default_llseek, | 443 | .llseek = default_llseek, |
452 | }; | 444 | }; |
453 | 445 | ||
@@ -492,7 +484,7 @@ static ssize_t read_file_blob(struct file *file, char __user *user_buf, | |||
492 | 484 | ||
493 | static const struct file_operations fops_blob = { | 485 | static const struct file_operations fops_blob = { |
494 | .read = read_file_blob, | 486 | .read = read_file_blob, |
495 | .open = default_open, | 487 | .open = simple_open, |
496 | .llseek = default_llseek, | 488 | .llseek = default_llseek, |
497 | }; | 489 | }; |
498 | 490 | ||
diff --git a/fs/dlm/debug_fs.c b/fs/dlm/debug_fs.c index 3dca2b39e83f..1c9b08095f98 100644 --- a/fs/dlm/debug_fs.c +++ b/fs/dlm/debug_fs.c | |||
@@ -609,13 +609,6 @@ static const struct file_operations format3_fops = { | |||
609 | /* | 609 | /* |
610 | * dump lkb's on the ls_waiters list | 610 | * dump lkb's on the ls_waiters list |
611 | */ | 611 | */ |
612 | |||
613 | static int waiters_open(struct inode *inode, struct file *file) | ||
614 | { | ||
615 | file->private_data = inode->i_private; | ||
616 | return 0; | ||
617 | } | ||
618 | |||
619 | static ssize_t waiters_read(struct file *file, char __user *userbuf, | 612 | static ssize_t waiters_read(struct file *file, char __user *userbuf, |
620 | size_t count, loff_t *ppos) | 613 | size_t count, loff_t *ppos) |
621 | { | 614 | { |
@@ -644,7 +637,7 @@ static ssize_t waiters_read(struct file *file, char __user *userbuf, | |||
644 | 637 | ||
645 | static const struct file_operations waiters_fops = { | 638 | static const struct file_operations waiters_fops = { |
646 | .owner = THIS_MODULE, | 639 | .owner = THIS_MODULE, |
647 | .open = waiters_open, | 640 | .open = simple_open, |
648 | .read = waiters_read, | 641 | .read = waiters_read, |
649 | .llseek = default_llseek, | 642 | .llseek = default_llseek, |
650 | }; | 643 | }; |
diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index ea251749d9d5..28cf06e4ec84 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c | |||
@@ -1031,7 +1031,6 @@ static int __init init_hugetlbfs_fs(void) | |||
1031 | } | 1031 | } |
1032 | 1032 | ||
1033 | error = PTR_ERR(vfsmount); | 1033 | error = PTR_ERR(vfsmount); |
1034 | unregister_filesystem(&hugetlbfs_fs_type); | ||
1035 | 1034 | ||
1036 | out: | 1035 | out: |
1037 | kmem_cache_destroy(hugetlbfs_inode_cachep); | 1036 | kmem_cache_destroy(hugetlbfs_inode_cachep); |
diff --git a/fs/libfs.c b/fs/libfs.c index 4a0d1f06da57..358094f0433d 100644 --- a/fs/libfs.c +++ b/fs/libfs.c | |||
@@ -264,6 +264,13 @@ Enomem: | |||
264 | return ERR_PTR(-ENOMEM); | 264 | return ERR_PTR(-ENOMEM); |
265 | } | 265 | } |
266 | 266 | ||
267 | int simple_open(struct inode *inode, struct file *file) | ||
268 | { | ||
269 | if (inode->i_private) | ||
270 | file->private_data = inode->i_private; | ||
271 | return 0; | ||
272 | } | ||
273 | |||
267 | int simple_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry) | 274 | int simple_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry) |
268 | { | 275 | { |
269 | struct inode *inode = old_dentry->d_inode; | 276 | struct inode *inode = old_dentry->d_inode; |
@@ -984,6 +991,7 @@ EXPORT_SYMBOL(simple_dir_operations); | |||
984 | EXPORT_SYMBOL(simple_empty); | 991 | EXPORT_SYMBOL(simple_empty); |
985 | EXPORT_SYMBOL(simple_fill_super); | 992 | EXPORT_SYMBOL(simple_fill_super); |
986 | EXPORT_SYMBOL(simple_getattr); | 993 | EXPORT_SYMBOL(simple_getattr); |
994 | EXPORT_SYMBOL(simple_open); | ||
987 | EXPORT_SYMBOL(simple_link); | 995 | EXPORT_SYMBOL(simple_link); |
988 | EXPORT_SYMBOL(simple_lookup); | 996 | EXPORT_SYMBOL(simple_lookup); |
989 | EXPORT_SYMBOL(simple_pin_fs); | 997 | EXPORT_SYMBOL(simple_pin_fs); |
diff --git a/fs/locks.c b/fs/locks.c index 637694bf3a03..0d68f1f81799 100644 --- a/fs/locks.c +++ b/fs/locks.c | |||
@@ -510,12 +510,13 @@ static void __locks_delete_block(struct file_lock *waiter) | |||
510 | 510 | ||
511 | /* | 511 | /* |
512 | */ | 512 | */ |
513 | static void locks_delete_block(struct file_lock *waiter) | 513 | void locks_delete_block(struct file_lock *waiter) |
514 | { | 514 | { |
515 | lock_flocks(); | 515 | lock_flocks(); |
516 | __locks_delete_block(waiter); | 516 | __locks_delete_block(waiter); |
517 | unlock_flocks(); | 517 | unlock_flocks(); |
518 | } | 518 | } |
519 | EXPORT_SYMBOL(locks_delete_block); | ||
519 | 520 | ||
520 | /* Insert waiter into blocker's block list. | 521 | /* Insert waiter into blocker's block list. |
521 | * We use a circular list so that processes can be easily woken up in | 522 | * We use a circular list so that processes can be easily woken up in |
diff --git a/fs/namei.c b/fs/namei.c index 1898198abc3d..0062dd17eb55 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
@@ -1407,18 +1407,9 @@ static inline int can_lookup(struct inode *inode) | |||
1407 | */ | 1407 | */ |
1408 | #ifdef CONFIG_DCACHE_WORD_ACCESS | 1408 | #ifdef CONFIG_DCACHE_WORD_ACCESS |
1409 | 1409 | ||
1410 | #ifdef CONFIG_64BIT | 1410 | #include <asm/word-at-a-time.h> |
1411 | 1411 | ||
1412 | /* | 1412 | #ifdef CONFIG_64BIT |
1413 | * Jan Achrenius on G+: microoptimized version of | ||
1414 | * the simpler "(mask & ONEBYTES) * ONEBYTES >> 56" | ||
1415 | * that works for the bytemasks without having to | ||
1416 | * mask them first. | ||
1417 | */ | ||
1418 | static inline long count_masked_bytes(unsigned long mask) | ||
1419 | { | ||
1420 | return mask*0x0001020304050608ul >> 56; | ||
1421 | } | ||
1422 | 1413 | ||
1423 | static inline unsigned int fold_hash(unsigned long hash) | 1414 | static inline unsigned int fold_hash(unsigned long hash) |
1424 | { | 1415 | { |
@@ -1428,15 +1419,6 @@ static inline unsigned int fold_hash(unsigned long hash) | |||
1428 | 1419 | ||
1429 | #else /* 32-bit case */ | 1420 | #else /* 32-bit case */ |
1430 | 1421 | ||
1431 | /* Carl Chatfield / Jan Achrenius G+ version for 32-bit */ | ||
1432 | static inline long count_masked_bytes(long mask) | ||
1433 | { | ||
1434 | /* (000000 0000ff 00ffff ffffff) -> ( 1 1 2 3 ) */ | ||
1435 | long a = (0x0ff0001+mask) >> 23; | ||
1436 | /* Fix the 1 for 00 case */ | ||
1437 | return a & mask; | ||
1438 | } | ||
1439 | |||
1440 | #define fold_hash(x) (x) | 1422 | #define fold_hash(x) (x) |
1441 | 1423 | ||
1442 | #endif | 1424 | #endif |
@@ -1464,17 +1446,6 @@ done: | |||
1464 | } | 1446 | } |
1465 | EXPORT_SYMBOL(full_name_hash); | 1447 | EXPORT_SYMBOL(full_name_hash); |
1466 | 1448 | ||
1467 | #define REPEAT_BYTE(x) ((~0ul / 0xff) * (x)) | ||
1468 | #define ONEBYTES REPEAT_BYTE(0x01) | ||
1469 | #define SLASHBYTES REPEAT_BYTE('/') | ||
1470 | #define HIGHBITS REPEAT_BYTE(0x80) | ||
1471 | |||
1472 | /* Return the high bit set in the first byte that is a zero */ | ||
1473 | static inline unsigned long has_zero(unsigned long a) | ||
1474 | { | ||
1475 | return ((a - ONEBYTES) & ~a) & HIGHBITS; | ||
1476 | } | ||
1477 | |||
1478 | /* | 1449 | /* |
1479 | * Calculate the length and hash of the path component, and | 1450 | * Calculate the length and hash of the path component, and |
1480 | * return the length of the component; | 1451 | * return the length of the component; |
@@ -1490,7 +1461,7 @@ static inline unsigned long hash_name(const char *name, unsigned int *hashp) | |||
1490 | len += sizeof(unsigned long); | 1461 | len += sizeof(unsigned long); |
1491 | a = *(unsigned long *)(name+len); | 1462 | a = *(unsigned long *)(name+len); |
1492 | /* Do we have any NUL or '/' bytes in this word? */ | 1463 | /* Do we have any NUL or '/' bytes in this word? */ |
1493 | mask = has_zero(a) | has_zero(a ^ SLASHBYTES); | 1464 | mask = has_zero(a) | has_zero(a ^ REPEAT_BYTE('/')); |
1494 | } while (!mask); | 1465 | } while (!mask); |
1495 | 1466 | ||
1496 | /* The mask *below* the first high bit set */ | 1467 | /* The mask *below* the first high bit set */ |
diff --git a/fs/proc/root.c b/fs/proc/root.c index 46a15d8a29ca..eed44bfc85db 100644 --- a/fs/proc/root.c +++ b/fs/proc/root.c | |||
@@ -115,12 +115,13 @@ static struct dentry *proc_mount(struct file_system_type *fs_type, | |||
115 | if (IS_ERR(sb)) | 115 | if (IS_ERR(sb)) |
116 | return ERR_CAST(sb); | 116 | return ERR_CAST(sb); |
117 | 117 | ||
118 | if (!proc_parse_options(options, ns)) { | ||
119 | deactivate_locked_super(sb); | ||
120 | return ERR_PTR(-EINVAL); | ||
121 | } | ||
122 | |||
118 | if (!sb->s_root) { | 123 | if (!sb->s_root) { |
119 | sb->s_flags = flags; | 124 | sb->s_flags = flags; |
120 | if (!proc_parse_options(options, ns)) { | ||
121 | deactivate_locked_super(sb); | ||
122 | return ERR_PTR(-EINVAL); | ||
123 | } | ||
124 | err = proc_fill_super(sb); | 125 | err = proc_fill_super(sb); |
125 | if (err) { | 126 | if (err) { |
126 | deactivate_locked_super(sb); | 127 | deactivate_locked_super(sb); |
diff --git a/fs/pstore/inode.c b/fs/pstore/inode.c index 50952c9bd06c..19507889bb7f 100644 --- a/fs/pstore/inode.c +++ b/fs/pstore/inode.c | |||
@@ -52,12 +52,6 @@ struct pstore_private { | |||
52 | char data[]; | 52 | char data[]; |
53 | }; | 53 | }; |
54 | 54 | ||
55 | static int pstore_file_open(struct inode *inode, struct file *file) | ||
56 | { | ||
57 | file->private_data = inode->i_private; | ||
58 | return 0; | ||
59 | } | ||
60 | |||
61 | static ssize_t pstore_file_read(struct file *file, char __user *userbuf, | 55 | static ssize_t pstore_file_read(struct file *file, char __user *userbuf, |
62 | size_t count, loff_t *ppos) | 56 | size_t count, loff_t *ppos) |
63 | { | 57 | { |
@@ -67,7 +61,7 @@ static ssize_t pstore_file_read(struct file *file, char __user *userbuf, | |||
67 | } | 61 | } |
68 | 62 | ||
69 | static const struct file_operations pstore_file_operations = { | 63 | static const struct file_operations pstore_file_operations = { |
70 | .open = pstore_file_open, | 64 | .open = simple_open, |
71 | .read = pstore_file_read, | 65 | .read = pstore_file_read, |
72 | .llseek = default_llseek, | 66 | .llseek = default_llseek, |
73 | }; | 67 | }; |
diff --git a/fs/splice.c b/fs/splice.c index 5f883de7ef3a..f8476841eb04 100644 --- a/fs/splice.c +++ b/fs/splice.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <linux/uio.h> | 30 | #include <linux/uio.h> |
31 | #include <linux/security.h> | 31 | #include <linux/security.h> |
32 | #include <linux/gfp.h> | 32 | #include <linux/gfp.h> |
33 | #include <linux/socket.h> | ||
33 | 34 | ||
34 | /* | 35 | /* |
35 | * Attempt to steal a page from a pipe buffer. This should perhaps go into | 36 | * Attempt to steal a page from a pipe buffer. This should perhaps go into |
@@ -690,7 +691,9 @@ static int pipe_to_sendpage(struct pipe_inode_info *pipe, | |||
690 | if (!likely(file->f_op && file->f_op->sendpage)) | 691 | if (!likely(file->f_op && file->f_op->sendpage)) |
691 | return -EINVAL; | 692 | return -EINVAL; |
692 | 693 | ||
693 | more = (sd->flags & SPLICE_F_MORE) || sd->len < sd->total_len; | 694 | more = (sd->flags & SPLICE_F_MORE) ? MSG_MORE : 0; |
695 | if (sd->len < sd->total_len) | ||
696 | more |= MSG_SENDPAGE_NOTLAST; | ||
694 | return file->f_op->sendpage(file, buf->page, buf->offset, | 697 | return file->f_op->sendpage(file, buf->page, buf->offset, |
695 | sd->len, &pos, more); | 698 | sd->len, &pos, more); |
696 | } | 699 | } |
diff --git a/fs/xattr.c b/fs/xattr.c index d6dfd247bb2f..3c8c1cc333c7 100644 --- a/fs/xattr.c +++ b/fs/xattr.c | |||
@@ -19,8 +19,9 @@ | |||
19 | #include <linux/export.h> | 19 | #include <linux/export.h> |
20 | #include <linux/fsnotify.h> | 20 | #include <linux/fsnotify.h> |
21 | #include <linux/audit.h> | 21 | #include <linux/audit.h> |
22 | #include <asm/uaccess.h> | 22 | #include <linux/vmalloc.h> |
23 | 23 | ||
24 | #include <asm/uaccess.h> | ||
24 | 25 | ||
25 | /* | 26 | /* |
26 | * Check permissions for extended attribute access. This is a bit complicated | 27 | * Check permissions for extended attribute access. This is a bit complicated |
@@ -320,6 +321,7 @@ setxattr(struct dentry *d, const char __user *name, const void __user *value, | |||
320 | { | 321 | { |
321 | int error; | 322 | int error; |
322 | void *kvalue = NULL; | 323 | void *kvalue = NULL; |
324 | void *vvalue = NULL; /* If non-NULL, we used vmalloc() */ | ||
323 | char kname[XATTR_NAME_MAX + 1]; | 325 | char kname[XATTR_NAME_MAX + 1]; |
324 | 326 | ||
325 | if (flags & ~(XATTR_CREATE|XATTR_REPLACE)) | 327 | if (flags & ~(XATTR_CREATE|XATTR_REPLACE)) |
@@ -334,13 +336,25 @@ setxattr(struct dentry *d, const char __user *name, const void __user *value, | |||
334 | if (size) { | 336 | if (size) { |
335 | if (size > XATTR_SIZE_MAX) | 337 | if (size > XATTR_SIZE_MAX) |
336 | return -E2BIG; | 338 | return -E2BIG; |
337 | kvalue = memdup_user(value, size); | 339 | kvalue = kmalloc(size, GFP_KERNEL | __GFP_NOWARN); |
338 | if (IS_ERR(kvalue)) | 340 | if (!kvalue) { |
339 | return PTR_ERR(kvalue); | 341 | vvalue = vmalloc(size); |
342 | if (!vvalue) | ||
343 | return -ENOMEM; | ||
344 | kvalue = vvalue; | ||
345 | } | ||
346 | if (copy_from_user(kvalue, value, size)) { | ||
347 | error = -EFAULT; | ||
348 | goto out; | ||
349 | } | ||
340 | } | 350 | } |
341 | 351 | ||
342 | error = vfs_setxattr(d, kname, kvalue, size, flags); | 352 | error = vfs_setxattr(d, kname, kvalue, size, flags); |
343 | kfree(kvalue); | 353 | out: |
354 | if (vvalue) | ||
355 | vfree(vvalue); | ||
356 | else | ||
357 | kfree(kvalue); | ||
344 | return error; | 358 | return error; |
345 | } | 359 | } |
346 | 360 | ||
@@ -492,13 +506,18 @@ listxattr(struct dentry *d, char __user *list, size_t size) | |||
492 | { | 506 | { |
493 | ssize_t error; | 507 | ssize_t error; |
494 | char *klist = NULL; | 508 | char *klist = NULL; |
509 | char *vlist = NULL; /* If non-NULL, we used vmalloc() */ | ||
495 | 510 | ||
496 | if (size) { | 511 | if (size) { |
497 | if (size > XATTR_LIST_MAX) | 512 | if (size > XATTR_LIST_MAX) |
498 | size = XATTR_LIST_MAX; | 513 | size = XATTR_LIST_MAX; |
499 | klist = kmalloc(size, GFP_KERNEL); | 514 | klist = kmalloc(size, __GFP_NOWARN | GFP_KERNEL); |
500 | if (!klist) | 515 | if (!klist) { |
501 | return -ENOMEM; | 516 | vlist = vmalloc(size); |
517 | if (!vlist) | ||
518 | return -ENOMEM; | ||
519 | klist = vlist; | ||
520 | } | ||
502 | } | 521 | } |
503 | 522 | ||
504 | error = vfs_listxattr(d, klist, size); | 523 | error = vfs_listxattr(d, klist, size); |
@@ -510,7 +529,10 @@ listxattr(struct dentry *d, char __user *list, size_t size) | |||
510 | than XATTR_LIST_MAX bytes. Not possible. */ | 529 | than XATTR_LIST_MAX bytes. Not possible. */ |
511 | error = -E2BIG; | 530 | error = -E2BIG; |
512 | } | 531 | } |
513 | kfree(klist); | 532 | if (vlist) |
533 | vfree(vlist); | ||
534 | else | ||
535 | kfree(klist); | ||
514 | return error; | 536 | return error; |
515 | } | 537 | } |
516 | 538 | ||
diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h index e1d9e0ede309..f5647b59a90e 100644 --- a/include/linux/ethtool.h +++ b/include/linux/ethtool.h | |||
@@ -896,8 +896,7 @@ static inline u32 ethtool_rxfh_indir_default(u32 index, u32 n_rx_rings) | |||
896 | * | 896 | * |
897 | * All operations are optional (i.e. the function pointer may be set | 897 | * All operations are optional (i.e. the function pointer may be set |
898 | * to %NULL) and callers must take this into account. Callers must | 898 | * to %NULL) and callers must take this into account. Callers must |
899 | * hold the RTNL, except that for @get_drvinfo the caller may or may | 899 | * hold the RTNL lock. |
900 | * not hold the RTNL. | ||
901 | * | 900 | * |
902 | * See the structures used by these operations for further documentation. | 901 | * See the structures used by these operations for further documentation. |
903 | * | 902 | * |
diff --git a/include/linux/fs.h b/include/linux/fs.h index 135693e79f2b..8de675523e46 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
@@ -1215,6 +1215,7 @@ extern int vfs_setlease(struct file *, long, struct file_lock **); | |||
1215 | extern int lease_modify(struct file_lock **, int); | 1215 | extern int lease_modify(struct file_lock **, int); |
1216 | extern int lock_may_read(struct inode *, loff_t start, unsigned long count); | 1216 | extern int lock_may_read(struct inode *, loff_t start, unsigned long count); |
1217 | extern int lock_may_write(struct inode *, loff_t start, unsigned long count); | 1217 | extern int lock_may_write(struct inode *, loff_t start, unsigned long count); |
1218 | extern void locks_delete_block(struct file_lock *waiter); | ||
1218 | extern void lock_flocks(void); | 1219 | extern void lock_flocks(void); |
1219 | extern void unlock_flocks(void); | 1220 | extern void unlock_flocks(void); |
1220 | #else /* !CONFIG_FILE_LOCKING */ | 1221 | #else /* !CONFIG_FILE_LOCKING */ |
@@ -1359,6 +1360,10 @@ static inline int lock_may_write(struct inode *inode, loff_t start, | |||
1359 | return 1; | 1360 | return 1; |
1360 | } | 1361 | } |
1361 | 1362 | ||
1363 | static inline void locks_delete_block(struct file_lock *waiter) | ||
1364 | { | ||
1365 | } | ||
1366 | |||
1362 | static inline void lock_flocks(void) | 1367 | static inline void lock_flocks(void) |
1363 | { | 1368 | { |
1364 | } | 1369 | } |
@@ -2506,6 +2511,7 @@ extern int dcache_readdir(struct file *, void *, filldir_t); | |||
2506 | extern int simple_setattr(struct dentry *, struct iattr *); | 2511 | extern int simple_setattr(struct dentry *, struct iattr *); |
2507 | extern int simple_getattr(struct vfsmount *, struct dentry *, struct kstat *); | 2512 | extern int simple_getattr(struct vfsmount *, struct dentry *, struct kstat *); |
2508 | extern int simple_statfs(struct dentry *, struct kstatfs *); | 2513 | extern int simple_statfs(struct dentry *, struct kstatfs *); |
2514 | extern int simple_open(struct inode *inode, struct file *file); | ||
2509 | extern int simple_link(struct dentry *, struct inode *, struct dentry *); | 2515 | extern int simple_link(struct dentry *, struct inode *, struct dentry *); |
2510 | extern int simple_unlink(struct inode *, struct dentry *); | 2516 | extern int simple_unlink(struct inode *, struct dentry *); |
2511 | extern int simple_rmdir(struct inode *, struct dentry *); | 2517 | extern int simple_rmdir(struct inode *, struct dentry *); |
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 1f77540bdc95..5cbaa20f1659 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
@@ -2604,8 +2604,6 @@ extern void net_disable_timestamp(void); | |||
2604 | extern void *dev_seq_start(struct seq_file *seq, loff_t *pos); | 2604 | extern void *dev_seq_start(struct seq_file *seq, loff_t *pos); |
2605 | extern void *dev_seq_next(struct seq_file *seq, void *v, loff_t *pos); | 2605 | extern void *dev_seq_next(struct seq_file *seq, void *v, loff_t *pos); |
2606 | extern void dev_seq_stop(struct seq_file *seq, void *v); | 2606 | extern void dev_seq_stop(struct seq_file *seq, void *v); |
2607 | extern int dev_seq_open_ops(struct inode *inode, struct file *file, | ||
2608 | const struct seq_operations *ops); | ||
2609 | #endif | 2607 | #endif |
2610 | 2608 | ||
2611 | extern int netdev_class_create_file(struct class_attribute *class_attr); | 2609 | extern int netdev_class_create_file(struct class_attribute *class_attr); |
diff --git a/include/linux/netfilter/xt_set.h b/include/linux/netfilter/xt_set.h index c0405ac92870..e3a9978f259f 100644 --- a/include/linux/netfilter/xt_set.h +++ b/include/linux/netfilter/xt_set.h | |||
@@ -58,8 +58,8 @@ struct xt_set_info_target_v1 { | |||
58 | struct xt_set_info_target_v2 { | 58 | struct xt_set_info_target_v2 { |
59 | struct xt_set_info add_set; | 59 | struct xt_set_info add_set; |
60 | struct xt_set_info del_set; | 60 | struct xt_set_info del_set; |
61 | u32 flags; | 61 | __u32 flags; |
62 | u32 timeout; | 62 | __u32 timeout; |
63 | }; | 63 | }; |
64 | 64 | ||
65 | #endif /*_XT_SET_H*/ | 65 | #endif /*_XT_SET_H*/ |
diff --git a/include/linux/socket.h b/include/linux/socket.h index da2d3e2543f3..b84bbd48b874 100644 --- a/include/linux/socket.h +++ b/include/linux/socket.h | |||
@@ -265,7 +265,7 @@ struct ucred { | |||
265 | #define MSG_NOSIGNAL 0x4000 /* Do not generate SIGPIPE */ | 265 | #define MSG_NOSIGNAL 0x4000 /* Do not generate SIGPIPE */ |
266 | #define MSG_MORE 0x8000 /* Sender will send more */ | 266 | #define MSG_MORE 0x8000 /* Sender will send more */ |
267 | #define MSG_WAITFORONE 0x10000 /* recvmmsg(): block until 1+ packets avail */ | 267 | #define MSG_WAITFORONE 0x10000 /* recvmmsg(): block until 1+ packets avail */ |
268 | 268 | #define MSG_SENDPAGE_NOTLAST 0x20000 /* sendpage() internal : not the last page */ | |
269 | #define MSG_EOF MSG_FIN | 269 | #define MSG_EOF MSG_FIN |
270 | 270 | ||
271 | #define MSG_CMSG_CLOEXEC 0x40000000 /* Set close_on_exit for file | 271 | #define MSG_CMSG_CLOEXEC 0x40000000 /* Set close_on_exit for file |
diff --git a/include/linux/swap.h b/include/linux/swap.h index 8dc0ea7caf02..b1fd5c7925fe 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h | |||
@@ -305,6 +305,13 @@ static inline int mem_cgroup_swappiness(struct mem_cgroup *mem) | |||
305 | return vm_swappiness; | 305 | return vm_swappiness; |
306 | } | 306 | } |
307 | #endif | 307 | #endif |
308 | #ifdef CONFIG_CGROUP_MEM_RES_CTLR_SWAP | ||
309 | extern void mem_cgroup_uncharge_swap(swp_entry_t ent); | ||
310 | #else | ||
311 | static inline void mem_cgroup_uncharge_swap(swp_entry_t ent) | ||
312 | { | ||
313 | } | ||
314 | #endif | ||
308 | #ifdef CONFIG_SWAP | 315 | #ifdef CONFIG_SWAP |
309 | /* linux/mm/page_io.c */ | 316 | /* linux/mm/page_io.c */ |
310 | extern int swap_readpage(struct page *); | 317 | extern int swap_readpage(struct page *); |
@@ -375,13 +382,6 @@ mem_cgroup_uncharge_swapcache(struct page *page, swp_entry_t ent, bool swapout) | |||
375 | { | 382 | { |
376 | } | 383 | } |
377 | #endif | 384 | #endif |
378 | #ifdef CONFIG_CGROUP_MEM_RES_CTLR_SWAP | ||
379 | extern void mem_cgroup_uncharge_swap(swp_entry_t ent); | ||
380 | #else | ||
381 | static inline void mem_cgroup_uncharge_swap(swp_entry_t ent) | ||
382 | { | ||
383 | } | ||
384 | #endif | ||
385 | 385 | ||
386 | #else /* CONFIG_SWAP */ | 386 | #else /* CONFIG_SWAP */ |
387 | 387 | ||
diff --git a/include/net/netfilter/xt_log.h b/include/net/netfilter/xt_log.h index 7e1544e8f70d..9d9756cca013 100644 --- a/include/net/netfilter/xt_log.h +++ b/include/net/netfilter/xt_log.h | |||
@@ -47,7 +47,7 @@ static void sb_close(struct sbuff *m) | |||
47 | if (likely(m != &emergency)) | 47 | if (likely(m != &emergency)) |
48 | kfree(m); | 48 | kfree(m); |
49 | else { | 49 | else { |
50 | xchg(&emergency_ptr, m); | 50 | emergency_ptr = m; |
51 | local_bh_enable(); | 51 | local_bh_enable(); |
52 | } | 52 | } |
53 | } | 53 | } |
diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c index cdea7b56b0c9..c0bd0308741c 100644 --- a/kernel/trace/blktrace.c +++ b/kernel/trace/blktrace.c | |||
@@ -311,13 +311,6 @@ int blk_trace_remove(struct request_queue *q) | |||
311 | } | 311 | } |
312 | EXPORT_SYMBOL_GPL(blk_trace_remove); | 312 | EXPORT_SYMBOL_GPL(blk_trace_remove); |
313 | 313 | ||
314 | static int blk_dropped_open(struct inode *inode, struct file *filp) | ||
315 | { | ||
316 | filp->private_data = inode->i_private; | ||
317 | |||
318 | return 0; | ||
319 | } | ||
320 | |||
321 | static ssize_t blk_dropped_read(struct file *filp, char __user *buffer, | 314 | static ssize_t blk_dropped_read(struct file *filp, char __user *buffer, |
322 | size_t count, loff_t *ppos) | 315 | size_t count, loff_t *ppos) |
323 | { | 316 | { |
@@ -331,18 +324,11 @@ static ssize_t blk_dropped_read(struct file *filp, char __user *buffer, | |||
331 | 324 | ||
332 | static const struct file_operations blk_dropped_fops = { | 325 | static const struct file_operations blk_dropped_fops = { |
333 | .owner = THIS_MODULE, | 326 | .owner = THIS_MODULE, |
334 | .open = blk_dropped_open, | 327 | .open = simple_open, |
335 | .read = blk_dropped_read, | 328 | .read = blk_dropped_read, |
336 | .llseek = default_llseek, | 329 | .llseek = default_llseek, |
337 | }; | 330 | }; |
338 | 331 | ||
339 | static int blk_msg_open(struct inode *inode, struct file *filp) | ||
340 | { | ||
341 | filp->private_data = inode->i_private; | ||
342 | |||
343 | return 0; | ||
344 | } | ||
345 | |||
346 | static ssize_t blk_msg_write(struct file *filp, const char __user *buffer, | 332 | static ssize_t blk_msg_write(struct file *filp, const char __user *buffer, |
347 | size_t count, loff_t *ppos) | 333 | size_t count, loff_t *ppos) |
348 | { | 334 | { |
@@ -371,7 +357,7 @@ static ssize_t blk_msg_write(struct file *filp, const char __user *buffer, | |||
371 | 357 | ||
372 | static const struct file_operations blk_msg_fops = { | 358 | static const struct file_operations blk_msg_fops = { |
373 | .owner = THIS_MODULE, | 359 | .owner = THIS_MODULE, |
374 | .open = blk_msg_open, | 360 | .open = simple_open, |
375 | .write = blk_msg_write, | 361 | .write = blk_msg_write, |
376 | .llseek = noop_llseek, | 362 | .llseek = noop_llseek, |
377 | }; | 363 | }; |
diff --git a/net/core/dev.c b/net/core/dev.c index 6c7dc9d78e10..c25d453b2803 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -4028,54 +4028,41 @@ static int dev_ifconf(struct net *net, char __user *arg) | |||
4028 | 4028 | ||
4029 | #ifdef CONFIG_PROC_FS | 4029 | #ifdef CONFIG_PROC_FS |
4030 | 4030 | ||
4031 | #define BUCKET_SPACE (32 - NETDEV_HASHBITS) | 4031 | #define BUCKET_SPACE (32 - NETDEV_HASHBITS - 1) |
4032 | |||
4033 | struct dev_iter_state { | ||
4034 | struct seq_net_private p; | ||
4035 | unsigned int pos; /* bucket << BUCKET_SPACE + offset */ | ||
4036 | }; | ||
4037 | 4032 | ||
4038 | #define get_bucket(x) ((x) >> BUCKET_SPACE) | 4033 | #define get_bucket(x) ((x) >> BUCKET_SPACE) |
4039 | #define get_offset(x) ((x) & ((1 << BUCKET_SPACE) - 1)) | 4034 | #define get_offset(x) ((x) & ((1 << BUCKET_SPACE) - 1)) |
4040 | #define set_bucket_offset(b, o) ((b) << BUCKET_SPACE | (o)) | 4035 | #define set_bucket_offset(b, o) ((b) << BUCKET_SPACE | (o)) |
4041 | 4036 | ||
4042 | static inline struct net_device *dev_from_same_bucket(struct seq_file *seq) | 4037 | static inline struct net_device *dev_from_same_bucket(struct seq_file *seq, loff_t *pos) |
4043 | { | 4038 | { |
4044 | struct dev_iter_state *state = seq->private; | ||
4045 | struct net *net = seq_file_net(seq); | 4039 | struct net *net = seq_file_net(seq); |
4046 | struct net_device *dev; | 4040 | struct net_device *dev; |
4047 | struct hlist_node *p; | 4041 | struct hlist_node *p; |
4048 | struct hlist_head *h; | 4042 | struct hlist_head *h; |
4049 | unsigned int count, bucket, offset; | 4043 | unsigned int count = 0, offset = get_offset(*pos); |
4050 | 4044 | ||
4051 | bucket = get_bucket(state->pos); | 4045 | h = &net->dev_name_head[get_bucket(*pos)]; |
4052 | offset = get_offset(state->pos); | ||
4053 | h = &net->dev_name_head[bucket]; | ||
4054 | count = 0; | ||
4055 | hlist_for_each_entry_rcu(dev, p, h, name_hlist) { | 4046 | hlist_for_each_entry_rcu(dev, p, h, name_hlist) { |
4056 | if (count++ == offset) { | 4047 | if (++count == offset) |
4057 | state->pos = set_bucket_offset(bucket, count); | ||
4058 | return dev; | 4048 | return dev; |
4059 | } | ||
4060 | } | 4049 | } |
4061 | 4050 | ||
4062 | return NULL; | 4051 | return NULL; |
4063 | } | 4052 | } |
4064 | 4053 | ||
4065 | static inline struct net_device *dev_from_new_bucket(struct seq_file *seq) | 4054 | static inline struct net_device *dev_from_bucket(struct seq_file *seq, loff_t *pos) |
4066 | { | 4055 | { |
4067 | struct dev_iter_state *state = seq->private; | ||
4068 | struct net_device *dev; | 4056 | struct net_device *dev; |
4069 | unsigned int bucket; | 4057 | unsigned int bucket; |
4070 | 4058 | ||
4071 | bucket = get_bucket(state->pos); | ||
4072 | do { | 4059 | do { |
4073 | dev = dev_from_same_bucket(seq); | 4060 | dev = dev_from_same_bucket(seq, pos); |
4074 | if (dev) | 4061 | if (dev) |
4075 | return dev; | 4062 | return dev; |
4076 | 4063 | ||
4077 | bucket++; | 4064 | bucket = get_bucket(*pos) + 1; |
4078 | state->pos = set_bucket_offset(bucket, 0); | 4065 | *pos = set_bucket_offset(bucket, 1); |
4079 | } while (bucket < NETDEV_HASHENTRIES); | 4066 | } while (bucket < NETDEV_HASHENTRIES); |
4080 | 4067 | ||
4081 | return NULL; | 4068 | return NULL; |
@@ -4088,33 +4075,20 @@ static inline struct net_device *dev_from_new_bucket(struct seq_file *seq) | |||
4088 | void *dev_seq_start(struct seq_file *seq, loff_t *pos) | 4075 | void *dev_seq_start(struct seq_file *seq, loff_t *pos) |
4089 | __acquires(RCU) | 4076 | __acquires(RCU) |
4090 | { | 4077 | { |
4091 | struct dev_iter_state *state = seq->private; | ||
4092 | |||
4093 | rcu_read_lock(); | 4078 | rcu_read_lock(); |
4094 | if (!*pos) | 4079 | if (!*pos) |
4095 | return SEQ_START_TOKEN; | 4080 | return SEQ_START_TOKEN; |
4096 | 4081 | ||
4097 | /* check for end of the hash */ | 4082 | if (get_bucket(*pos) >= NETDEV_HASHENTRIES) |
4098 | if (state->pos == 0 && *pos > 1) | ||
4099 | return NULL; | 4083 | return NULL; |
4100 | 4084 | ||
4101 | return dev_from_new_bucket(seq); | 4085 | return dev_from_bucket(seq, pos); |
4102 | } | 4086 | } |
4103 | 4087 | ||
4104 | void *dev_seq_next(struct seq_file *seq, void *v, loff_t *pos) | 4088 | void *dev_seq_next(struct seq_file *seq, void *v, loff_t *pos) |
4105 | { | 4089 | { |
4106 | struct net_device *dev; | ||
4107 | |||
4108 | ++*pos; | 4090 | ++*pos; |
4109 | 4091 | return dev_from_bucket(seq, pos); | |
4110 | if (v == SEQ_START_TOKEN) | ||
4111 | return dev_from_new_bucket(seq); | ||
4112 | |||
4113 | dev = dev_from_same_bucket(seq); | ||
4114 | if (dev) | ||
4115 | return dev; | ||
4116 | |||
4117 | return dev_from_new_bucket(seq); | ||
4118 | } | 4092 | } |
4119 | 4093 | ||
4120 | void dev_seq_stop(struct seq_file *seq, void *v) | 4094 | void dev_seq_stop(struct seq_file *seq, void *v) |
@@ -4213,13 +4187,7 @@ static const struct seq_operations dev_seq_ops = { | |||
4213 | static int dev_seq_open(struct inode *inode, struct file *file) | 4187 | static int dev_seq_open(struct inode *inode, struct file *file) |
4214 | { | 4188 | { |
4215 | return seq_open_net(inode, file, &dev_seq_ops, | 4189 | return seq_open_net(inode, file, &dev_seq_ops, |
4216 | sizeof(struct dev_iter_state)); | 4190 | sizeof(struct seq_net_private)); |
4217 | } | ||
4218 | |||
4219 | int dev_seq_open_ops(struct inode *inode, struct file *file, | ||
4220 | const struct seq_operations *ops) | ||
4221 | { | ||
4222 | return seq_open_net(inode, file, ops, sizeof(struct dev_iter_state)); | ||
4223 | } | 4191 | } |
4224 | 4192 | ||
4225 | static const struct file_operations dev_seq_fops = { | 4193 | static const struct file_operations dev_seq_fops = { |
diff --git a/net/core/dev_addr_lists.c b/net/core/dev_addr_lists.c index 29c07fef9228..626698f0db8b 100644 --- a/net/core/dev_addr_lists.c +++ b/net/core/dev_addr_lists.c | |||
@@ -696,7 +696,8 @@ static const struct seq_operations dev_mc_seq_ops = { | |||
696 | 696 | ||
697 | static int dev_mc_seq_open(struct inode *inode, struct file *file) | 697 | static int dev_mc_seq_open(struct inode *inode, struct file *file) |
698 | { | 698 | { |
699 | return dev_seq_open_ops(inode, file, &dev_mc_seq_ops); | 699 | return seq_open_net(inode, file, &dev_mc_seq_ops, |
700 | sizeof(struct seq_net_private)); | ||
700 | } | 701 | } |
701 | 702 | ||
702 | static const struct file_operations dev_mc_seq_fops = { | 703 | static const struct file_operations dev_mc_seq_fops = { |
diff --git a/net/core/filter.c b/net/core/filter.c index cf4989ac503b..6f755cca4520 100644 --- a/net/core/filter.c +++ b/net/core/filter.c | |||
@@ -39,8 +39,11 @@ | |||
39 | #include <linux/reciprocal_div.h> | 39 | #include <linux/reciprocal_div.h> |
40 | #include <linux/ratelimit.h> | 40 | #include <linux/ratelimit.h> |
41 | 41 | ||
42 | /* No hurry in this branch */ | 42 | /* No hurry in this branch |
43 | static void *__load_pointer(const struct sk_buff *skb, int k, unsigned int size) | 43 | * |
44 | * Exported for the bpf jit load helper. | ||
45 | */ | ||
46 | void *bpf_internal_load_pointer_neg_helper(const struct sk_buff *skb, int k, unsigned int size) | ||
44 | { | 47 | { |
45 | u8 *ptr = NULL; | 48 | u8 *ptr = NULL; |
46 | 49 | ||
@@ -59,7 +62,7 @@ static inline void *load_pointer(const struct sk_buff *skb, int k, | |||
59 | { | 62 | { |
60 | if (k >= 0) | 63 | if (k >= 0) |
61 | return skb_header_pointer(skb, k, size, buffer); | 64 | return skb_header_pointer(skb, k, size, buffer); |
62 | return __load_pointer(skb, k, size); | 65 | return bpf_internal_load_pointer_neg_helper(skb, k, size); |
63 | } | 66 | } |
64 | 67 | ||
65 | /** | 68 | /** |
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index f223cdc75da6..baf8d281152c 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
@@ -3161,6 +3161,8 @@ static void sock_rmem_free(struct sk_buff *skb) | |||
3161 | */ | 3161 | */ |
3162 | int sock_queue_err_skb(struct sock *sk, struct sk_buff *skb) | 3162 | int sock_queue_err_skb(struct sock *sk, struct sk_buff *skb) |
3163 | { | 3163 | { |
3164 | int len = skb->len; | ||
3165 | |||
3164 | if (atomic_read(&sk->sk_rmem_alloc) + skb->truesize >= | 3166 | if (atomic_read(&sk->sk_rmem_alloc) + skb->truesize >= |
3165 | (unsigned)sk->sk_rcvbuf) | 3167 | (unsigned)sk->sk_rcvbuf) |
3166 | return -ENOMEM; | 3168 | return -ENOMEM; |
@@ -3175,7 +3177,7 @@ int sock_queue_err_skb(struct sock *sk, struct sk_buff *skb) | |||
3175 | 3177 | ||
3176 | skb_queue_tail(&sk->sk_error_queue, skb); | 3178 | skb_queue_tail(&sk->sk_error_queue, skb); |
3177 | if (!sock_flag(sk, SOCK_DEAD)) | 3179 | if (!sock_flag(sk, SOCK_DEAD)) |
3178 | sk->sk_data_ready(sk, skb->len); | 3180 | sk->sk_data_ready(sk, len); |
3179 | return 0; | 3181 | return 0; |
3180 | } | 3182 | } |
3181 | EXPORT_SYMBOL(sock_queue_err_skb); | 3183 | EXPORT_SYMBOL(sock_queue_err_skb); |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index cfd7edda0a8e..5d54ed30e821 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
@@ -860,7 +860,7 @@ wait_for_memory: | |||
860 | } | 860 | } |
861 | 861 | ||
862 | out: | 862 | out: |
863 | if (copied) | 863 | if (copied && !(flags & MSG_SENDPAGE_NOTLAST)) |
864 | tcp_push(sk, flags, mss_now, tp->nonagle); | 864 | tcp_push(sk, flags, mss_now, tp->nonagle); |
865 | return copied; | 865 | return copied; |
866 | 866 | ||
diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c index 16c33e308121..b2869cab2092 100644 --- a/net/ipv6/mcast.c +++ b/net/ipv6/mcast.c | |||
@@ -2044,7 +2044,7 @@ static int ip6_mc_add_src(struct inet6_dev *idev, const struct in6_addr *pmca, | |||
2044 | if (!delta) | 2044 | if (!delta) |
2045 | pmc->mca_sfcount[sfmode]--; | 2045 | pmc->mca_sfcount[sfmode]--; |
2046 | for (j=0; j<i; j++) | 2046 | for (j=0; j<i; j++) |
2047 | (void) ip6_mc_del1_src(pmc, sfmode, &psfsrc[i]); | 2047 | ip6_mc_del1_src(pmc, sfmode, &psfsrc[j]); |
2048 | } else if (isexclude != (pmc->mca_sfcount[MCAST_EXCLUDE] != 0)) { | 2048 | } else if (isexclude != (pmc->mca_sfcount[MCAST_EXCLUDE] != 0)) { |
2049 | struct ip6_sf_list *psf; | 2049 | struct ip6_sf_list *psf; |
2050 | 2050 | ||
diff --git a/net/mac80211/debugfs.c b/net/mac80211/debugfs.c index cc5b7a6e7e0b..778e5916d7c3 100644 --- a/net/mac80211/debugfs.c +++ b/net/mac80211/debugfs.c | |||
@@ -15,12 +15,6 @@ | |||
15 | #include "rate.h" | 15 | #include "rate.h" |
16 | #include "debugfs.h" | 16 | #include "debugfs.h" |
17 | 17 | ||
18 | int mac80211_open_file_generic(struct inode *inode, struct file *file) | ||
19 | { | ||
20 | file->private_data = inode->i_private; | ||
21 | return 0; | ||
22 | } | ||
23 | |||
24 | #define DEBUGFS_FORMAT_BUFFER_SIZE 100 | 18 | #define DEBUGFS_FORMAT_BUFFER_SIZE 100 |
25 | 19 | ||
26 | int mac80211_format_buffer(char __user *userbuf, size_t count, | 20 | int mac80211_format_buffer(char __user *userbuf, size_t count, |
@@ -50,7 +44,7 @@ static ssize_t name## _read(struct file *file, char __user *userbuf, \ | |||
50 | #define DEBUGFS_READONLY_FILE_OPS(name) \ | 44 | #define DEBUGFS_READONLY_FILE_OPS(name) \ |
51 | static const struct file_operations name## _ops = { \ | 45 | static const struct file_operations name## _ops = { \ |
52 | .read = name## _read, \ | 46 | .read = name## _read, \ |
53 | .open = mac80211_open_file_generic, \ | 47 | .open = simple_open, \ |
54 | .llseek = generic_file_llseek, \ | 48 | .llseek = generic_file_llseek, \ |
55 | }; | 49 | }; |
56 | 50 | ||
@@ -93,7 +87,7 @@ static ssize_t reset_write(struct file *file, const char __user *user_buf, | |||
93 | 87 | ||
94 | static const struct file_operations reset_ops = { | 88 | static const struct file_operations reset_ops = { |
95 | .write = reset_write, | 89 | .write = reset_write, |
96 | .open = mac80211_open_file_generic, | 90 | .open = simple_open, |
97 | .llseek = noop_llseek, | 91 | .llseek = noop_llseek, |
98 | }; | 92 | }; |
99 | 93 | ||
@@ -254,7 +248,7 @@ static ssize_t stats_ ##name## _read(struct file *file, \ | |||
254 | \ | 248 | \ |
255 | static const struct file_operations stats_ ##name## _ops = { \ | 249 | static const struct file_operations stats_ ##name## _ops = { \ |
256 | .read = stats_ ##name## _read, \ | 250 | .read = stats_ ##name## _read, \ |
257 | .open = mac80211_open_file_generic, \ | 251 | .open = simple_open, \ |
258 | .llseek = generic_file_llseek, \ | 252 | .llseek = generic_file_llseek, \ |
259 | }; | 253 | }; |
260 | 254 | ||
diff --git a/net/mac80211/debugfs.h b/net/mac80211/debugfs.h index 7c87529630f5..9be4e6d71d00 100644 --- a/net/mac80211/debugfs.h +++ b/net/mac80211/debugfs.h | |||
@@ -3,7 +3,6 @@ | |||
3 | 3 | ||
4 | #ifdef CONFIG_MAC80211_DEBUGFS | 4 | #ifdef CONFIG_MAC80211_DEBUGFS |
5 | extern void debugfs_hw_add(struct ieee80211_local *local); | 5 | extern void debugfs_hw_add(struct ieee80211_local *local); |
6 | extern int mac80211_open_file_generic(struct inode *inode, struct file *file); | ||
7 | extern int mac80211_format_buffer(char __user *userbuf, size_t count, | 6 | extern int mac80211_format_buffer(char __user *userbuf, size_t count, |
8 | loff_t *ppos, char *fmt, ...); | 7 | loff_t *ppos, char *fmt, ...); |
9 | #else | 8 | #else |
diff --git a/net/mac80211/debugfs_key.c b/net/mac80211/debugfs_key.c index 59edcd95a58d..7932767bb482 100644 --- a/net/mac80211/debugfs_key.c +++ b/net/mac80211/debugfs_key.c | |||
@@ -30,7 +30,7 @@ static ssize_t key_##name##_read(struct file *file, \ | |||
30 | #define KEY_OPS(name) \ | 30 | #define KEY_OPS(name) \ |
31 | static const struct file_operations key_ ##name## _ops = { \ | 31 | static const struct file_operations key_ ##name## _ops = { \ |
32 | .read = key_##name##_read, \ | 32 | .read = key_##name##_read, \ |
33 | .open = mac80211_open_file_generic, \ | 33 | .open = simple_open, \ |
34 | .llseek = generic_file_llseek, \ | 34 | .llseek = generic_file_llseek, \ |
35 | } | 35 | } |
36 | 36 | ||
@@ -45,7 +45,7 @@ static const struct file_operations key_ ##name## _ops = { \ | |||
45 | #define KEY_CONF_OPS(name) \ | 45 | #define KEY_CONF_OPS(name) \ |
46 | static const struct file_operations key_ ##name## _ops = { \ | 46 | static const struct file_operations key_ ##name## _ops = { \ |
47 | .read = key_conf_##name##_read, \ | 47 | .read = key_conf_##name##_read, \ |
48 | .open = mac80211_open_file_generic, \ | 48 | .open = simple_open, \ |
49 | .llseek = generic_file_llseek, \ | 49 | .llseek = generic_file_llseek, \ |
50 | } | 50 | } |
51 | 51 | ||
diff --git a/net/mac80211/debugfs_netdev.c b/net/mac80211/debugfs_netdev.c index a32eeda04aa3..30f99c344847 100644 --- a/net/mac80211/debugfs_netdev.c +++ b/net/mac80211/debugfs_netdev.c | |||
@@ -135,7 +135,7 @@ static ssize_t ieee80211_if_read_##name(struct file *file, \ | |||
135 | static const struct file_operations name##_ops = { \ | 135 | static const struct file_operations name##_ops = { \ |
136 | .read = ieee80211_if_read_##name, \ | 136 | .read = ieee80211_if_read_##name, \ |
137 | .write = (_write), \ | 137 | .write = (_write), \ |
138 | .open = mac80211_open_file_generic, \ | 138 | .open = simple_open, \ |
139 | .llseek = generic_file_llseek, \ | 139 | .llseek = generic_file_llseek, \ |
140 | } | 140 | } |
141 | 141 | ||
diff --git a/net/mac80211/debugfs_sta.c b/net/mac80211/debugfs_sta.c index 6d45804d09bc..832b2da5e4cd 100644 --- a/net/mac80211/debugfs_sta.c +++ b/net/mac80211/debugfs_sta.c | |||
@@ -33,7 +33,7 @@ static ssize_t sta_ ##name## _read(struct file *file, \ | |||
33 | #define STA_OPS(name) \ | 33 | #define STA_OPS(name) \ |
34 | static const struct file_operations sta_ ##name## _ops = { \ | 34 | static const struct file_operations sta_ ##name## _ops = { \ |
35 | .read = sta_##name##_read, \ | 35 | .read = sta_##name##_read, \ |
36 | .open = mac80211_open_file_generic, \ | 36 | .open = simple_open, \ |
37 | .llseek = generic_file_llseek, \ | 37 | .llseek = generic_file_llseek, \ |
38 | } | 38 | } |
39 | 39 | ||
@@ -41,7 +41,7 @@ static const struct file_operations sta_ ##name## _ops = { \ | |||
41 | static const struct file_operations sta_ ##name## _ops = { \ | 41 | static const struct file_operations sta_ ##name## _ops = { \ |
42 | .read = sta_##name##_read, \ | 42 | .read = sta_##name##_read, \ |
43 | .write = sta_##name##_write, \ | 43 | .write = sta_##name##_write, \ |
44 | .open = mac80211_open_file_generic, \ | 44 | .open = simple_open, \ |
45 | .llseek = generic_file_llseek, \ | 45 | .llseek = generic_file_llseek, \ |
46 | } | 46 | } |
47 | 47 | ||
diff --git a/net/mac80211/rate.c b/net/mac80211/rate.c index b4f7600a3e36..3313c117b322 100644 --- a/net/mac80211/rate.c +++ b/net/mac80211/rate.c | |||
@@ -145,7 +145,7 @@ static ssize_t rcname_read(struct file *file, char __user *userbuf, | |||
145 | 145 | ||
146 | static const struct file_operations rcname_ops = { | 146 | static const struct file_operations rcname_ops = { |
147 | .read = rcname_read, | 147 | .read = rcname_read, |
148 | .open = mac80211_open_file_generic, | 148 | .open = simple_open, |
149 | .llseek = default_llseek, | 149 | .llseek = default_llseek, |
150 | }; | 150 | }; |
151 | #endif | 151 | #endif |
diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c index cbdb754dbb10..3cc4487ac349 100644 --- a/net/netfilter/nf_conntrack_core.c +++ b/net/netfilter/nf_conntrack_core.c | |||
@@ -735,6 +735,7 @@ __nf_conntrack_alloc(struct net *net, u16 zone, | |||
735 | 735 | ||
736 | #ifdef CONFIG_NF_CONNTRACK_ZONES | 736 | #ifdef CONFIG_NF_CONNTRACK_ZONES |
737 | out_free: | 737 | out_free: |
738 | atomic_dec(&net->ct.count); | ||
738 | kmem_cache_free(net->ct.nf_conntrack_cachep, ct); | 739 | kmem_cache_free(net->ct.nf_conntrack_cachep, ct); |
739 | return ERR_PTR(-ENOMEM); | 740 | return ERR_PTR(-ENOMEM); |
740 | #endif | 741 | #endif |
diff --git a/net/netfilter/xt_CT.c b/net/netfilter/xt_CT.c index 0c8e43810ce3..59530e93fa58 100644 --- a/net/netfilter/xt_CT.c +++ b/net/netfilter/xt_CT.c | |||
@@ -150,6 +150,17 @@ err1: | |||
150 | return ret; | 150 | return ret; |
151 | } | 151 | } |
152 | 152 | ||
153 | #ifdef CONFIG_NF_CONNTRACK_TIMEOUT | ||
154 | static void __xt_ct_tg_timeout_put(struct ctnl_timeout *timeout) | ||
155 | { | ||
156 | typeof(nf_ct_timeout_put_hook) timeout_put; | ||
157 | |||
158 | timeout_put = rcu_dereference(nf_ct_timeout_put_hook); | ||
159 | if (timeout_put) | ||
160 | timeout_put(timeout); | ||
161 | } | ||
162 | #endif | ||
163 | |||
153 | static int xt_ct_tg_check_v1(const struct xt_tgchk_param *par) | 164 | static int xt_ct_tg_check_v1(const struct xt_tgchk_param *par) |
154 | { | 165 | { |
155 | struct xt_ct_target_info_v1 *info = par->targinfo; | 166 | struct xt_ct_target_info_v1 *info = par->targinfo; |
@@ -158,7 +169,9 @@ static int xt_ct_tg_check_v1(const struct xt_tgchk_param *par) | |||
158 | struct nf_conn *ct; | 169 | struct nf_conn *ct; |
159 | int ret = 0; | 170 | int ret = 0; |
160 | u8 proto; | 171 | u8 proto; |
161 | 172 | #ifdef CONFIG_NF_CONNTRACK_TIMEOUT | |
173 | struct ctnl_timeout *timeout; | ||
174 | #endif | ||
162 | if (info->flags & ~XT_CT_NOTRACK) | 175 | if (info->flags & ~XT_CT_NOTRACK) |
163 | return -EINVAL; | 176 | return -EINVAL; |
164 | 177 | ||
@@ -216,7 +229,6 @@ static int xt_ct_tg_check_v1(const struct xt_tgchk_param *par) | |||
216 | #ifdef CONFIG_NF_CONNTRACK_TIMEOUT | 229 | #ifdef CONFIG_NF_CONNTRACK_TIMEOUT |
217 | if (info->timeout) { | 230 | if (info->timeout) { |
218 | typeof(nf_ct_timeout_find_get_hook) timeout_find_get; | 231 | typeof(nf_ct_timeout_find_get_hook) timeout_find_get; |
219 | struct ctnl_timeout *timeout; | ||
220 | struct nf_conn_timeout *timeout_ext; | 232 | struct nf_conn_timeout *timeout_ext; |
221 | 233 | ||
222 | rcu_read_lock(); | 234 | rcu_read_lock(); |
@@ -245,7 +257,7 @@ static int xt_ct_tg_check_v1(const struct xt_tgchk_param *par) | |||
245 | pr_info("Timeout policy `%s' can only be " | 257 | pr_info("Timeout policy `%s' can only be " |
246 | "used by L3 protocol number %d\n", | 258 | "used by L3 protocol number %d\n", |
247 | info->timeout, timeout->l3num); | 259 | info->timeout, timeout->l3num); |
248 | goto err4; | 260 | goto err5; |
249 | } | 261 | } |
250 | /* Make sure the timeout policy matches any existing | 262 | /* Make sure the timeout policy matches any existing |
251 | * protocol tracker, otherwise default to generic. | 263 | * protocol tracker, otherwise default to generic. |
@@ -258,13 +270,13 @@ static int xt_ct_tg_check_v1(const struct xt_tgchk_param *par) | |||
258 | "used by L4 protocol number %d\n", | 270 | "used by L4 protocol number %d\n", |
259 | info->timeout, | 271 | info->timeout, |
260 | timeout->l4proto->l4proto); | 272 | timeout->l4proto->l4proto); |
261 | goto err4; | 273 | goto err5; |
262 | } | 274 | } |
263 | timeout_ext = nf_ct_timeout_ext_add(ct, timeout, | 275 | timeout_ext = nf_ct_timeout_ext_add(ct, timeout, |
264 | GFP_KERNEL); | 276 | GFP_ATOMIC); |
265 | if (timeout_ext == NULL) { | 277 | if (timeout_ext == NULL) { |
266 | ret = -ENOMEM; | 278 | ret = -ENOMEM; |
267 | goto err4; | 279 | goto err5; |
268 | } | 280 | } |
269 | } else { | 281 | } else { |
270 | ret = -ENOENT; | 282 | ret = -ENOENT; |
@@ -281,8 +293,12 @@ out: | |||
281 | info->ct = ct; | 293 | info->ct = ct; |
282 | return 0; | 294 | return 0; |
283 | 295 | ||
296 | #ifdef CONFIG_NF_CONNTRACK_TIMEOUT | ||
297 | err5: | ||
298 | __xt_ct_tg_timeout_put(timeout); | ||
284 | err4: | 299 | err4: |
285 | rcu_read_unlock(); | 300 | rcu_read_unlock(); |
301 | #endif | ||
286 | err3: | 302 | err3: |
287 | nf_conntrack_free(ct); | 303 | nf_conntrack_free(ct); |
288 | err2: | 304 | err2: |
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 32bb75324e76..faa48f70b7c9 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c | |||
@@ -829,12 +829,19 @@ int netlink_attachskb(struct sock *sk, struct sk_buff *skb, | |||
829 | return 0; | 829 | return 0; |
830 | } | 830 | } |
831 | 831 | ||
832 | int netlink_sendskb(struct sock *sk, struct sk_buff *skb) | 832 | static int __netlink_sendskb(struct sock *sk, struct sk_buff *skb) |
833 | { | 833 | { |
834 | int len = skb->len; | 834 | int len = skb->len; |
835 | 835 | ||
836 | skb_queue_tail(&sk->sk_receive_queue, skb); | 836 | skb_queue_tail(&sk->sk_receive_queue, skb); |
837 | sk->sk_data_ready(sk, len); | 837 | sk->sk_data_ready(sk, len); |
838 | return len; | ||
839 | } | ||
840 | |||
841 | int netlink_sendskb(struct sock *sk, struct sk_buff *skb) | ||
842 | { | ||
843 | int len = __netlink_sendskb(sk, skb); | ||
844 | |||
838 | sock_put(sk); | 845 | sock_put(sk); |
839 | return len; | 846 | return len; |
840 | } | 847 | } |
@@ -957,8 +964,7 @@ static int netlink_broadcast_deliver(struct sock *sk, struct sk_buff *skb) | |||
957 | if (atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf && | 964 | if (atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf && |
958 | !test_bit(0, &nlk->state)) { | 965 | !test_bit(0, &nlk->state)) { |
959 | skb_set_owner_r(skb, sk); | 966 | skb_set_owner_r(skb, sk); |
960 | skb_queue_tail(&sk->sk_receive_queue, skb); | 967 | __netlink_sendskb(sk, skb); |
961 | sk->sk_data_ready(sk, skb->len); | ||
962 | return atomic_read(&sk->sk_rmem_alloc) > (sk->sk_rcvbuf >> 1); | 968 | return atomic_read(&sk->sk_rmem_alloc) > (sk->sk_rcvbuf >> 1); |
963 | } | 969 | } |
964 | return -1; | 970 | return -1; |
@@ -1698,10 +1704,8 @@ static int netlink_dump(struct sock *sk) | |||
1698 | 1704 | ||
1699 | if (sk_filter(sk, skb)) | 1705 | if (sk_filter(sk, skb)) |
1700 | kfree_skb(skb); | 1706 | kfree_skb(skb); |
1701 | else { | 1707 | else |
1702 | skb_queue_tail(&sk->sk_receive_queue, skb); | 1708 | __netlink_sendskb(sk, skb); |
1703 | sk->sk_data_ready(sk, skb->len); | ||
1704 | } | ||
1705 | return 0; | 1709 | return 0; |
1706 | } | 1710 | } |
1707 | 1711 | ||
@@ -1715,10 +1719,8 @@ static int netlink_dump(struct sock *sk) | |||
1715 | 1719 | ||
1716 | if (sk_filter(sk, skb)) | 1720 | if (sk_filter(sk, skb)) |
1717 | kfree_skb(skb); | 1721 | kfree_skb(skb); |
1718 | else { | 1722 | else |
1719 | skb_queue_tail(&sk->sk_receive_queue, skb); | 1723 | __netlink_sendskb(sk, skb); |
1720 | sk->sk_data_ready(sk, skb->len); | ||
1721 | } | ||
1722 | 1724 | ||
1723 | if (cb->done) | 1725 | if (cb->done) |
1724 | cb->done(cb); | 1726 | cb->done(cb); |
diff --git a/net/phonet/pep.c b/net/phonet/pep.c index 9f60008740e3..9726fe684ab8 100644 --- a/net/phonet/pep.c +++ b/net/phonet/pep.c | |||
@@ -1130,6 +1130,9 @@ static int pep_sendmsg(struct kiocb *iocb, struct sock *sk, | |||
1130 | int flags = msg->msg_flags; | 1130 | int flags = msg->msg_flags; |
1131 | int err, done; | 1131 | int err, done; |
1132 | 1132 | ||
1133 | if (len > USHRT_MAX) | ||
1134 | return -EMSGSIZE; | ||
1135 | |||
1133 | if ((msg->msg_flags & ~(MSG_DONTWAIT|MSG_EOR|MSG_NOSIGNAL| | 1136 | if ((msg->msg_flags & ~(MSG_DONTWAIT|MSG_EOR|MSG_NOSIGNAL| |
1134 | MSG_CMSG_COMPAT)) || | 1137 | MSG_CMSG_COMPAT)) || |
1135 | !(msg->msg_flags & MSG_EOR)) | 1138 | !(msg->msg_flags & MSG_EOR)) |
diff --git a/net/sctp/socket.c b/net/sctp/socket.c index 06b42b7f5a02..92ba71dfe080 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c | |||
@@ -4133,9 +4133,10 @@ static int sctp_getsockopt_disable_fragments(struct sock *sk, int len, | |||
4133 | static int sctp_getsockopt_events(struct sock *sk, int len, char __user *optval, | 4133 | static int sctp_getsockopt_events(struct sock *sk, int len, char __user *optval, |
4134 | int __user *optlen) | 4134 | int __user *optlen) |
4135 | { | 4135 | { |
4136 | if (len < sizeof(struct sctp_event_subscribe)) | 4136 | if (len <= 0) |
4137 | return -EINVAL; | 4137 | return -EINVAL; |
4138 | len = sizeof(struct sctp_event_subscribe); | 4138 | if (len > sizeof(struct sctp_event_subscribe)) |
4139 | len = sizeof(struct sctp_event_subscribe); | ||
4139 | if (put_user(len, optlen)) | 4140 | if (put_user(len, optlen)) |
4140 | return -EFAULT; | 4141 | return -EFAULT; |
4141 | if (copy_to_user(optval, &sctp_sk(sk)->subscribe, len)) | 4142 | if (copy_to_user(optval, &sctp_sk(sk)->subscribe, len)) |
diff --git a/net/socket.c b/net/socket.c index 484cc6953fc6..851edcd6b098 100644 --- a/net/socket.c +++ b/net/socket.c | |||
@@ -811,9 +811,9 @@ static ssize_t sock_sendpage(struct file *file, struct page *page, | |||
811 | 811 | ||
812 | sock = file->private_data; | 812 | sock = file->private_data; |
813 | 813 | ||
814 | flags = !(file->f_flags & O_NONBLOCK) ? 0 : MSG_DONTWAIT; | 814 | flags = (file->f_flags & O_NONBLOCK) ? MSG_DONTWAIT : 0; |
815 | if (more) | 815 | /* more is a combination of MSG_MORE and MSG_SENDPAGE_NOTLAST */ |
816 | flags |= MSG_MORE; | 816 | flags |= more; |
817 | 817 | ||
818 | return kernel_sendpage(sock, page, offset, size, flags); | 818 | return kernel_sendpage(sock, page, offset, size, flags); |
819 | } | 819 | } |
diff --git a/net/wireless/debugfs.c b/net/wireless/debugfs.c index 39765bcfb472..920cabe0461b 100644 --- a/net/wireless/debugfs.c +++ b/net/wireless/debugfs.c | |||
@@ -13,12 +13,6 @@ | |||
13 | #include "core.h" | 13 | #include "core.h" |
14 | #include "debugfs.h" | 14 | #include "debugfs.h" |
15 | 15 | ||
16 | static int cfg80211_open_file_generic(struct inode *inode, struct file *file) | ||
17 | { | ||
18 | file->private_data = inode->i_private; | ||
19 | return 0; | ||
20 | } | ||
21 | |||
22 | #define DEBUGFS_READONLY_FILE(name, buflen, fmt, value...) \ | 16 | #define DEBUGFS_READONLY_FILE(name, buflen, fmt, value...) \ |
23 | static ssize_t name## _read(struct file *file, char __user *userbuf, \ | 17 | static ssize_t name## _read(struct file *file, char __user *userbuf, \ |
24 | size_t count, loff_t *ppos) \ | 18 | size_t count, loff_t *ppos) \ |
@@ -33,7 +27,7 @@ static ssize_t name## _read(struct file *file, char __user *userbuf, \ | |||
33 | \ | 27 | \ |
34 | static const struct file_operations name## _ops = { \ | 28 | static const struct file_operations name## _ops = { \ |
35 | .read = name## _read, \ | 29 | .read = name## _read, \ |
36 | .open = cfg80211_open_file_generic, \ | 30 | .open = simple_open, \ |
37 | .llseek = generic_file_llseek, \ | 31 | .llseek = generic_file_llseek, \ |
38 | }; | 32 | }; |
39 | 33 | ||
@@ -102,7 +96,7 @@ static ssize_t ht40allow_map_read(struct file *file, | |||
102 | 96 | ||
103 | static const struct file_operations ht40allow_map_ops = { | 97 | static const struct file_operations ht40allow_map_ops = { |
104 | .read = ht40allow_map_read, | 98 | .read = ht40allow_map_read, |
105 | .open = cfg80211_open_file_generic, | 99 | .open = simple_open, |
106 | .llseek = default_llseek, | 100 | .llseek = default_llseek, |
107 | }; | 101 | }; |
108 | 102 | ||
diff --git a/scripts/coccinelle/api/simple_open.cocci b/scripts/coccinelle/api/simple_open.cocci new file mode 100644 index 000000000000..05962f7be155 --- /dev/null +++ b/scripts/coccinelle/api/simple_open.cocci | |||
@@ -0,0 +1,70 @@ | |||
1 | /// This removes an open coded simple_open() function | ||
2 | /// and replaces file operations references to the function | ||
3 | /// with simple_open() instead. | ||
4 | /// | ||
5 | // Confidence: High | ||
6 | // Comments: | ||
7 | // Options: -no_includes -include_headers | ||
8 | |||
9 | virtual patch | ||
10 | virtual report | ||
11 | |||
12 | @ open depends on patch @ | ||
13 | identifier open_f != simple_open; | ||
14 | identifier i, f; | ||
15 | @@ | ||
16 | -int open_f(struct inode *i, struct file *f) | ||
17 | -{ | ||
18 | ( | ||
19 | -if (i->i_private) | ||
20 | -f->private_data = i->i_private; | ||
21 | | | ||
22 | -f->private_data = i->i_private; | ||
23 | ) | ||
24 | -return 0; | ||
25 | -} | ||
26 | |||
27 | @ has_open depends on open @ | ||
28 | identifier fops; | ||
29 | identifier open.open_f; | ||
30 | @@ | ||
31 | struct file_operations fops = { | ||
32 | ..., | ||
33 | -.open = open_f, | ||
34 | +.open = simple_open, | ||
35 | ... | ||
36 | }; | ||
37 | |||
38 | @ openr depends on report @ | ||
39 | identifier open_f != simple_open; | ||
40 | identifier i, f; | ||
41 | position p; | ||
42 | @@ | ||
43 | int open_f@p(struct inode *i, struct file *f) | ||
44 | { | ||
45 | ( | ||
46 | if (i->i_private) | ||
47 | f->private_data = i->i_private; | ||
48 | | | ||
49 | f->private_data = i->i_private; | ||
50 | ) | ||
51 | return 0; | ||
52 | } | ||
53 | |||
54 | @ has_openr depends on openr @ | ||
55 | identifier fops; | ||
56 | identifier openr.open_f; | ||
57 | position p; | ||
58 | @@ | ||
59 | struct file_operations fops = { | ||
60 | ..., | ||
61 | .open = open_f@p, | ||
62 | ... | ||
63 | }; | ||
64 | |||
65 | @script:python@ | ||
66 | pf << openr.p; | ||
67 | ps << has_openr.p; | ||
68 | @@ | ||
69 | |||
70 | coccilib.report.print_report(pf[0],"WARNING opportunity for simple_open, see also structure on line %s"%(ps[0].line)) | ||
diff --git a/sound/soc/imx/imx-audmux.c b/sound/soc/imx/imx-audmux.c index 601df809a26a..1765a197acb0 100644 --- a/sound/soc/imx/imx-audmux.c +++ b/sound/soc/imx/imx-audmux.c | |||
@@ -40,12 +40,6 @@ static void __iomem *audmux_base; | |||
40 | #ifdef CONFIG_DEBUG_FS | 40 | #ifdef CONFIG_DEBUG_FS |
41 | static struct dentry *audmux_debugfs_root; | 41 | static struct dentry *audmux_debugfs_root; |
42 | 42 | ||
43 | static int audmux_open_file(struct inode *inode, struct file *file) | ||
44 | { | ||
45 | file->private_data = inode->i_private; | ||
46 | return 0; | ||
47 | } | ||
48 | |||
49 | /* There is an annoying discontinuity in the SSI numbering with regard | 43 | /* There is an annoying discontinuity in the SSI numbering with regard |
50 | * to the Linux number of the devices */ | 44 | * to the Linux number of the devices */ |
51 | static const char *audmux_port_string(int port) | 45 | static const char *audmux_port_string(int port) |
@@ -142,7 +136,7 @@ static ssize_t audmux_read_file(struct file *file, char __user *user_buf, | |||
142 | } | 136 | } |
143 | 137 | ||
144 | static const struct file_operations audmux_debugfs_fops = { | 138 | static const struct file_operations audmux_debugfs_fops = { |
145 | .open = audmux_open_file, | 139 | .open = simple_open, |
146 | .read = audmux_read_file, | 140 | .read = audmux_read_file, |
147 | .llseek = default_llseek, | 141 | .llseek = default_llseek, |
148 | }; | 142 | }; |
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index a4deebc0801a..e19c24ade414 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c | |||
@@ -201,12 +201,6 @@ static ssize_t pmdown_time_set(struct device *dev, | |||
201 | static DEVICE_ATTR(pmdown_time, 0644, pmdown_time_show, pmdown_time_set); | 201 | static DEVICE_ATTR(pmdown_time, 0644, pmdown_time_show, pmdown_time_set); |
202 | 202 | ||
203 | #ifdef CONFIG_DEBUG_FS | 203 | #ifdef CONFIG_DEBUG_FS |
204 | static int codec_reg_open_file(struct inode *inode, struct file *file) | ||
205 | { | ||
206 | file->private_data = inode->i_private; | ||
207 | return 0; | ||
208 | } | ||
209 | |||
210 | static ssize_t codec_reg_read_file(struct file *file, char __user *user_buf, | 204 | static ssize_t codec_reg_read_file(struct file *file, char __user *user_buf, |
211 | size_t count, loff_t *ppos) | 205 | size_t count, loff_t *ppos) |
212 | { | 206 | { |
@@ -264,7 +258,7 @@ static ssize_t codec_reg_write_file(struct file *file, | |||
264 | } | 258 | } |
265 | 259 | ||
266 | static const struct file_operations codec_reg_fops = { | 260 | static const struct file_operations codec_reg_fops = { |
267 | .open = codec_reg_open_file, | 261 | .open = simple_open, |
268 | .read = codec_reg_read_file, | 262 | .read = codec_reg_read_file, |
269 | .write = codec_reg_write_file, | 263 | .write = codec_reg_write_file, |
270 | .llseek = default_llseek, | 264 | .llseek = default_llseek, |
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c index 6241490fff30..5cbd2d7623b8 100644 --- a/sound/soc/soc-dapm.c +++ b/sound/soc/soc-dapm.c | |||
@@ -1544,12 +1544,6 @@ static int dapm_power_widgets(struct snd_soc_dapm_context *dapm, int event) | |||
1544 | } | 1544 | } |
1545 | 1545 | ||
1546 | #ifdef CONFIG_DEBUG_FS | 1546 | #ifdef CONFIG_DEBUG_FS |
1547 | static int dapm_widget_power_open_file(struct inode *inode, struct file *file) | ||
1548 | { | ||
1549 | file->private_data = inode->i_private; | ||
1550 | return 0; | ||
1551 | } | ||
1552 | |||
1553 | static ssize_t dapm_widget_power_read_file(struct file *file, | 1547 | static ssize_t dapm_widget_power_read_file(struct file *file, |
1554 | char __user *user_buf, | 1548 | char __user *user_buf, |
1555 | size_t count, loff_t *ppos) | 1549 | size_t count, loff_t *ppos) |
@@ -1613,17 +1607,11 @@ static ssize_t dapm_widget_power_read_file(struct file *file, | |||
1613 | } | 1607 | } |
1614 | 1608 | ||
1615 | static const struct file_operations dapm_widget_power_fops = { | 1609 | static const struct file_operations dapm_widget_power_fops = { |
1616 | .open = dapm_widget_power_open_file, | 1610 | .open = simple_open, |
1617 | .read = dapm_widget_power_read_file, | 1611 | .read = dapm_widget_power_read_file, |
1618 | .llseek = default_llseek, | 1612 | .llseek = default_llseek, |
1619 | }; | 1613 | }; |
1620 | 1614 | ||
1621 | static int dapm_bias_open_file(struct inode *inode, struct file *file) | ||
1622 | { | ||
1623 | file->private_data = inode->i_private; | ||
1624 | return 0; | ||
1625 | } | ||
1626 | |||
1627 | static ssize_t dapm_bias_read_file(struct file *file, char __user *user_buf, | 1615 | static ssize_t dapm_bias_read_file(struct file *file, char __user *user_buf, |
1628 | size_t count, loff_t *ppos) | 1616 | size_t count, loff_t *ppos) |
1629 | { | 1617 | { |
@@ -1654,7 +1642,7 @@ static ssize_t dapm_bias_read_file(struct file *file, char __user *user_buf, | |||
1654 | } | 1642 | } |
1655 | 1643 | ||
1656 | static const struct file_operations dapm_bias_fops = { | 1644 | static const struct file_operations dapm_bias_fops = { |
1657 | .open = dapm_bias_open_file, | 1645 | .open = simple_open, |
1658 | .read = dapm_bias_read_file, | 1646 | .read = dapm_bias_read_file, |
1659 | .llseek = default_llseek, | 1647 | .llseek = default_llseek, |
1660 | }; | 1648 | }; |