diff options
742 files changed, 18162 insertions, 5805 deletions
diff --git a/Documentation/00-INDEX b/Documentation/00-INDEX index edef85ce1195..2a39aeba1464 100644 --- a/Documentation/00-INDEX +++ b/Documentation/00-INDEX | |||
@@ -42,14 +42,8 @@ IRQ.txt | |||
42 | - description of what an IRQ is. | 42 | - description of what an IRQ is. |
43 | ManagementStyle | 43 | ManagementStyle |
44 | - how to (attempt to) manage kernel hackers. | 44 | - how to (attempt to) manage kernel hackers. |
45 | MSI-HOWTO.txt | ||
46 | - the Message Signaled Interrupts (MSI) Driver Guide HOWTO and FAQ. | ||
47 | RCU/ | 45 | RCU/ |
48 | - directory with info on RCU (read-copy update). | 46 | - directory with info on RCU (read-copy update). |
49 | README.DAC960 | ||
50 | - info on Mylex DAC960/DAC1100 PCI RAID Controller Driver for Linux. | ||
51 | README.cycladesZ | ||
52 | - info on Cyclades-Z firmware loading. | ||
53 | SAK.txt | 47 | SAK.txt |
54 | - info on Secure Attention Keys. | 48 | - info on Secure Attention Keys. |
55 | SM501.txt | 49 | SM501.txt |
@@ -86,20 +80,16 @@ blackfin/ | |||
86 | - directory with documentation for the Blackfin arch. | 80 | - directory with documentation for the Blackfin arch. |
87 | block/ | 81 | block/ |
88 | - info on the Block I/O (BIO) layer. | 82 | - info on the Block I/O (BIO) layer. |
83 | blockdev/ | ||
84 | - info on block devices & drivers | ||
89 | cachetlb.txt | 85 | cachetlb.txt |
90 | - describes the cache/TLB flushing interfaces Linux uses. | 86 | - describes the cache/TLB flushing interfaces Linux uses. |
91 | cciss.txt | ||
92 | - info, major/minor #'s for Compaq's SMART Array Controllers. | ||
93 | cdrom/ | 87 | cdrom/ |
94 | - directory with information on the CD-ROM drivers that Linux has. | 88 | - directory with information on the CD-ROM drivers that Linux has. |
95 | computone.txt | ||
96 | - info on Computone Intelliport II/Plus Multiport Serial Driver. | ||
97 | connector/ | 89 | connector/ |
98 | - docs on the netlink based userspace<->kernel space communication mod. | 90 | - docs on the netlink based userspace<->kernel space communication mod. |
99 | console/ | 91 | console/ |
100 | - documentation on Linux console drivers. | 92 | - documentation on Linux console drivers. |
101 | cpqarray.txt | ||
102 | - info on using Compaq's SMART2 Intelligent Disk Array Controllers. | ||
103 | cpu-freq/ | 93 | cpu-freq/ |
104 | - info on CPU frequency and voltage scaling. | 94 | - info on CPU frequency and voltage scaling. |
105 | cpu-hotplug.txt | 95 | cpu-hotplug.txt |
@@ -126,8 +116,6 @@ device-mapper/ | |||
126 | - directory with info on Device Mapper. | 116 | - directory with info on Device Mapper. |
127 | devices.txt | 117 | devices.txt |
128 | - plain ASCII listing of all the nodes in /dev/ with major minor #'s. | 118 | - plain ASCII listing of all the nodes in /dev/ with major minor #'s. |
129 | digiepca.txt | ||
130 | - info on Digi Intl. {PC,PCI,EISA}Xx and Xem series cards. | ||
131 | dontdiff | 119 | dontdiff |
132 | - file containing a list of files that should never be diff'ed. | 120 | - file containing a list of files that should never be diff'ed. |
133 | driver-model/ | 121 | driver-model/ |
@@ -152,14 +140,10 @@ filesystems/ | |||
152 | - info on the vfs and the various filesystems that Linux supports. | 140 | - info on the vfs and the various filesystems that Linux supports. |
153 | firmware_class/ | 141 | firmware_class/ |
154 | - request_firmware() hotplug interface info. | 142 | - request_firmware() hotplug interface info. |
155 | floppy.txt | ||
156 | - notes and driver options for the floppy disk driver. | ||
157 | frv/ | 143 | frv/ |
158 | - Fujitsu FR-V Linux documentation. | 144 | - Fujitsu FR-V Linux documentation. |
159 | gpio.txt | 145 | gpio.txt |
160 | - overview of GPIO (General Purpose Input/Output) access conventions. | 146 | - overview of GPIO (General Purpose Input/Output) access conventions. |
161 | hayes-esp.txt | ||
162 | - info on using the Hayes ESP serial driver. | ||
163 | highuid.txt | 147 | highuid.txt |
164 | - notes on the change from 16 bit to 32 bit user/group IDs. | 148 | - notes on the change from 16 bit to 32 bit user/group IDs. |
165 | timers/ | 149 | timers/ |
@@ -186,8 +170,6 @@ io_ordering.txt | |||
186 | - info on ordering I/O writes to memory-mapped addresses. | 170 | - info on ordering I/O writes to memory-mapped addresses. |
187 | ioctl/ | 171 | ioctl/ |
188 | - directory with documents describing various IOCTL calls. | 172 | - directory with documents describing various IOCTL calls. |
189 | ioctl-number.txt | ||
190 | - how to implement and register device/driver ioctl calls. | ||
191 | iostats.txt | 173 | iostats.txt |
192 | - info on I/O statistics Linux kernel provides. | 174 | - info on I/O statistics Linux kernel provides. |
193 | irqflags-tracing.txt | 175 | irqflags-tracing.txt |
@@ -250,14 +232,10 @@ mips/ | |||
250 | - directory with info about Linux on MIPS architecture. | 232 | - directory with info about Linux on MIPS architecture. |
251 | mono.txt | 233 | mono.txt |
252 | - how to execute Mono-based .NET binaries with the help of BINFMT_MISC. | 234 | - how to execute Mono-based .NET binaries with the help of BINFMT_MISC. |
253 | moxa-smartio | ||
254 | - file with info on installing/using Moxa multiport serial driver. | ||
255 | mutex-design.txt | 235 | mutex-design.txt |
256 | - info on the generic mutex subsystem. | 236 | - info on the generic mutex subsystem. |
257 | namespaces/ | 237 | namespaces/ |
258 | - directory with various information about namespaces | 238 | - directory with various information about namespaces |
259 | nbd.txt | ||
260 | - info on a TCP implementation of a network block device. | ||
261 | netlabel/ | 239 | netlabel/ |
262 | - directory with information on the NetLabel subsystem. | 240 | - directory with information on the NetLabel subsystem. |
263 | networking/ | 241 | networking/ |
@@ -270,8 +248,6 @@ numastat.txt | |||
270 | - info on how to read Numa policy hit/miss statistics in sysfs. | 248 | - info on how to read Numa policy hit/miss statistics in sysfs. |
271 | oops-tracing.txt | 249 | oops-tracing.txt |
272 | - how to decode those nasty internal kernel error dump messages. | 250 | - how to decode those nasty internal kernel error dump messages. |
273 | paride.txt | ||
274 | - information about the parallel port IDE subsystem. | ||
275 | parisc/ | 251 | parisc/ |
276 | - directory with info on using Linux on PA-RISC architecture. | 252 | - directory with info on using Linux on PA-RISC architecture. |
277 | parport.txt | 253 | parport.txt |
@@ -290,20 +266,16 @@ powerpc/ | |||
290 | - directory with info on using Linux with the PowerPC. | 266 | - directory with info on using Linux with the PowerPC. |
291 | preempt-locking.txt | 267 | preempt-locking.txt |
292 | - info on locking under a preemptive kernel. | 268 | - info on locking under a preemptive kernel. |
269 | printk-formats.txt | ||
270 | - how to get printk format specifiers right | ||
293 | prio_tree.txt | 271 | prio_tree.txt |
294 | - info on radix-priority-search-tree use for indexing vmas. | 272 | - info on radix-priority-search-tree use for indexing vmas. |
295 | ramdisk.txt | ||
296 | - short guide on how to set up and use the RAM disk. | ||
297 | rbtree.txt | 273 | rbtree.txt |
298 | - info on what red-black trees are and what they are for. | 274 | - info on what red-black trees are and what they are for. |
299 | riscom8.txt | ||
300 | - notes on using the RISCom/8 multi-port serial driver. | ||
301 | robust-futex-ABI.txt | 275 | robust-futex-ABI.txt |
302 | - documentation of the robust futex ABI. | 276 | - documentation of the robust futex ABI. |
303 | robust-futexes.txt | 277 | robust-futexes.txt |
304 | - a description of what robust futexes are. | 278 | - a description of what robust futexes are. |
305 | rocket.txt | ||
306 | - info on the Comtrol RocketPort multiport serial driver. | ||
307 | rt-mutex-design.txt | 279 | rt-mutex-design.txt |
308 | - description of the RealTime mutex implementation design. | 280 | - description of the RealTime mutex implementation design. |
309 | rt-mutex.txt | 281 | rt-mutex.txt |
@@ -332,8 +304,6 @@ sparc/ | |||
332 | - directory with info on using Linux on Sparc architecture. | 304 | - directory with info on using Linux on Sparc architecture. |
333 | sparse.txt | 305 | sparse.txt |
334 | - info on how to obtain and use the sparse tool for typechecking. | 306 | - info on how to obtain and use the sparse tool for typechecking. |
335 | specialix.txt | ||
336 | - info on hardware/driver for specialix IO8+ multiport serial card. | ||
337 | spi/ | 307 | spi/ |
338 | - overview of Linux kernel Serial Peripheral Interface (SPI) support. | 308 | - overview of Linux kernel Serial Peripheral Interface (SPI) support. |
339 | spinlocks.txt | 309 | spinlocks.txt |
@@ -342,14 +312,10 @@ stable_api_nonsense.txt | |||
342 | - info on why the kernel does not have a stable in-kernel api or abi. | 312 | - info on why the kernel does not have a stable in-kernel api or abi. |
343 | stable_kernel_rules.txt | 313 | stable_kernel_rules.txt |
344 | - rules and procedures for the -stable kernel releases. | 314 | - rules and procedures for the -stable kernel releases. |
345 | stallion.txt | ||
346 | - info on using the Stallion multiport serial driver. | ||
347 | svga.txt | 315 | svga.txt |
348 | - short guide on selecting video modes at boot via VGA BIOS. | 316 | - short guide on selecting video modes at boot via VGA BIOS. |
349 | sysfs-rules.txt | 317 | sysfs-rules.txt |
350 | - How not to use sysfs. | 318 | - How not to use sysfs. |
351 | sx.txt | ||
352 | - info on the Specialix SX/SI multiport serial driver. | ||
353 | sysctl/ | 319 | sysctl/ |
354 | - directory with info on the /proc/sys/* files. | 320 | - directory with info on the /proc/sys/* files. |
355 | sysrq.txt | 321 | sysrq.txt |
@@ -358,8 +324,6 @@ telephony/ | |||
358 | - directory with info on telephony (e.g. voice over IP) support. | 324 | - directory with info on telephony (e.g. voice over IP) support. |
359 | time_interpolators.txt | 325 | time_interpolators.txt |
360 | - info on time interpolators. | 326 | - info on time interpolators. |
361 | tty.txt | ||
362 | - guide to the locking policies of the tty layer. | ||
363 | uml/ | 327 | uml/ |
364 | - directory with information about User Mode Linux. | 328 | - directory with information about User Mode Linux. |
365 | unicode.txt | 329 | unicode.txt |
diff --git a/Documentation/ABI/testing/sysfs-c2port b/Documentation/ABI/testing/sysfs-c2port new file mode 100644 index 000000000000..716cffc457e9 --- /dev/null +++ b/Documentation/ABI/testing/sysfs-c2port | |||
@@ -0,0 +1,88 @@ | |||
1 | What: /sys/class/c2port/ | ||
2 | Date: October 2008 | ||
3 | Contact: Rodolfo Giometti <giometti@linux.it> | ||
4 | Description: | ||
5 | The /sys/class/c2port/ directory will contain files and | ||
6 | directories that will provide a unified interface to | ||
7 | the C2 port interface. | ||
8 | |||
9 | What: /sys/class/c2port/c2portX | ||
10 | Date: October 2008 | ||
11 | Contact: Rodolfo Giometti <giometti@linux.it> | ||
12 | Description: | ||
13 | The /sys/class/c2port/c2portX/ directory is related to X-th | ||
14 | C2 port into the system. Each directory will contain files to | ||
15 | manage and control its C2 port. | ||
16 | |||
17 | What: /sys/class/c2port/c2portX/access | ||
18 | Date: October 2008 | ||
19 | Contact: Rodolfo Giometti <giometti@linux.it> | ||
20 | Description: | ||
21 | The /sys/class/c2port/c2portX/access file enable the access | ||
22 | to the C2 port from the system. No commands can be sent | ||
23 | till this entry is set to 0. | ||
24 | |||
25 | What: /sys/class/c2port/c2portX/dev_id | ||
26 | Date: October 2008 | ||
27 | Contact: Rodolfo Giometti <giometti@linux.it> | ||
28 | Description: | ||
29 | The /sys/class/c2port/c2portX/dev_id file show the device ID | ||
30 | of the connected micro. | ||
31 | |||
32 | What: /sys/class/c2port/c2portX/flash_access | ||
33 | Date: October 2008 | ||
34 | Contact: Rodolfo Giometti <giometti@linux.it> | ||
35 | Description: | ||
36 | The /sys/class/c2port/c2portX/flash_access file enable the | ||
37 | access to the on-board flash of the connected micro. | ||
38 | No commands can be sent till this entry is set to 0. | ||
39 | |||
40 | What: /sys/class/c2port/c2portX/flash_block_size | ||
41 | Date: October 2008 | ||
42 | Contact: Rodolfo Giometti <giometti@linux.it> | ||
43 | Description: | ||
44 | The /sys/class/c2port/c2portX/flash_block_size file show | ||
45 | the on-board flash block size of the connected micro. | ||
46 | |||
47 | What: /sys/class/c2port/c2portX/flash_blocks_num | ||
48 | Date: October 2008 | ||
49 | Contact: Rodolfo Giometti <giometti@linux.it> | ||
50 | Description: | ||
51 | The /sys/class/c2port/c2portX/flash_blocks_num file show | ||
52 | the on-board flash blocks number of the connected micro. | ||
53 | |||
54 | What: /sys/class/c2port/c2portX/flash_data | ||
55 | Date: October 2008 | ||
56 | Contact: Rodolfo Giometti <giometti@linux.it> | ||
57 | Description: | ||
58 | The /sys/class/c2port/c2portX/flash_data file export | ||
59 | the content of the on-board flash of the connected micro. | ||
60 | |||
61 | What: /sys/class/c2port/c2portX/flash_erase | ||
62 | Date: October 2008 | ||
63 | Contact: Rodolfo Giometti <giometti@linux.it> | ||
64 | Description: | ||
65 | The /sys/class/c2port/c2portX/flash_erase file execute | ||
66 | the "erase" command on the on-board flash of the connected | ||
67 | micro. | ||
68 | |||
69 | What: /sys/class/c2port/c2portX/flash_erase | ||
70 | Date: October 2008 | ||
71 | Contact: Rodolfo Giometti <giometti@linux.it> | ||
72 | Description: | ||
73 | The /sys/class/c2port/c2portX/flash_erase file show the | ||
74 | on-board flash size of the connected micro. | ||
75 | |||
76 | What: /sys/class/c2port/c2portX/reset | ||
77 | Date: October 2008 | ||
78 | Contact: Rodolfo Giometti <giometti@linux.it> | ||
79 | Description: | ||
80 | The /sys/class/c2port/c2portX/reset file execute a "reset" | ||
81 | command on the connected micro. | ||
82 | |||
83 | What: /sys/class/c2port/c2portX/rev_id | ||
84 | Date: October 2008 | ||
85 | Contact: Rodolfo Giometti <giometti@linux.it> | ||
86 | Description: | ||
87 | The /sys/class/c2port/c2portX/rev_id file show the revision ID | ||
88 | of the connected micro. | ||
diff --git a/Documentation/ABI/testing/sysfs-firmware-acpi b/Documentation/ABI/testing/sysfs-firmware-acpi index f27be7d1a49f..e8ffc70ffe12 100644 --- a/Documentation/ABI/testing/sysfs-firmware-acpi +++ b/Documentation/ABI/testing/sysfs-firmware-acpi | |||
@@ -89,7 +89,7 @@ Description: | |||
89 | 89 | ||
90 | error - an interrupt that can't be accounted for above. | 90 | error - an interrupt that can't be accounted for above. |
91 | 91 | ||
92 | invalid: it's either a wakeup GPE or a GPE/Fixed Event that | 92 | invalid: it's either a GPE or a Fixed Event that |
93 | doesn't have an event handler. | 93 | doesn't have an event handler. |
94 | 94 | ||
95 | disable: the GPE/Fixed Event is valid but disabled. | 95 | disable: the GPE/Fixed Event is valid but disabled. |
@@ -117,30 +117,30 @@ Description: | |||
117 | and other user space applications so that the machine won't shutdown | 117 | and other user space applications so that the machine won't shutdown |
118 | when pressing the power button. | 118 | when pressing the power button. |
119 | # cat ff_pwr_btn | 119 | # cat ff_pwr_btn |
120 | 0 | 120 | 0 enabled |
121 | # press the power button for 3 times; | 121 | # press the power button for 3 times; |
122 | # cat ff_pwr_btn | 122 | # cat ff_pwr_btn |
123 | 3 | 123 | 3 enabled |
124 | # echo disable > ff_pwr_btn | 124 | # echo disable > ff_pwr_btn |
125 | # cat ff_pwr_btn | 125 | # cat ff_pwr_btn |
126 | disable | 126 | 3 disabled |
127 | # press the power button for 3 times; | 127 | # press the power button for 3 times; |
128 | # cat ff_pwr_btn | 128 | # cat ff_pwr_btn |
129 | disable | 129 | 3 disabled |
130 | # echo enable > ff_pwr_btn | 130 | # echo enable > ff_pwr_btn |
131 | # cat ff_pwr_btn | 131 | # cat ff_pwr_btn |
132 | 4 | 132 | 4 enabled |
133 | /* | 133 | /* |
134 | * this is because the status bit is set even if the enable bit is cleared, | 134 | * this is because the status bit is set even if the enable bit is cleared, |
135 | * and it triggers an ACPI fixed event when the enable bit is set again | 135 | * and it triggers an ACPI fixed event when the enable bit is set again |
136 | */ | 136 | */ |
137 | # press the power button for 3 times; | 137 | # press the power button for 3 times; |
138 | # cat ff_pwr_btn | 138 | # cat ff_pwr_btn |
139 | 7 | 139 | 7 enabled |
140 | # echo disable > ff_pwr_btn | 140 | # echo disable > ff_pwr_btn |
141 | # press the power button for 3 times; | 141 | # press the power button for 3 times; |
142 | # echo clear > ff_pwr_btn /* clear the status bit */ | 142 | # echo clear > ff_pwr_btn /* clear the status bit */ |
143 | # echo disable > ff_pwr_btn | 143 | # echo disable > ff_pwr_btn |
144 | # cat ff_pwr_btn | 144 | # cat ff_pwr_btn |
145 | 7 | 145 | 7 enabled |
146 | 146 | ||
diff --git a/Documentation/DMA-API.txt b/Documentation/DMA-API.txt index b8e86460046e..b462bb149543 100644 --- a/Documentation/DMA-API.txt +++ b/Documentation/DMA-API.txt | |||
@@ -316,12 +316,10 @@ reduce current DMA mapping usage or delay and try again later). | |||
316 | pci_map_sg(struct pci_dev *hwdev, struct scatterlist *sg, | 316 | pci_map_sg(struct pci_dev *hwdev, struct scatterlist *sg, |
317 | int nents, int direction) | 317 | int nents, int direction) |
318 | 318 | ||
319 | Maps a scatter gather list from the block layer. | ||
320 | |||
321 | Returns: the number of physical segments mapped (this may be shorter | 319 | Returns: the number of physical segments mapped (this may be shorter |
322 | than <nents> passed in if the block layer determines that some | 320 | than <nents> passed in if some elements of the scatter/gather list are |
323 | elements of the scatter/gather list are physically adjacent and thus | 321 | physically or virtually adjacent and an IOMMU maps them with a single |
324 | may be mapped with a single entry). | 322 | entry). |
325 | 323 | ||
326 | Please note that the sg cannot be mapped again if it has been mapped once. | 324 | Please note that the sg cannot be mapped again if it has been mapped once. |
327 | The mapping process is allowed to destroy information in the sg. | 325 | The mapping process is allowed to destroy information in the sg. |
diff --git a/Documentation/PCI/00-INDEX b/Documentation/PCI/00-INDEX index 49f43946c6b6..812b17fe3ed0 100644 --- a/Documentation/PCI/00-INDEX +++ b/Documentation/PCI/00-INDEX | |||
@@ -1,5 +1,7 @@ | |||
1 | 00-INDEX | 1 | 00-INDEX |
2 | - this file | 2 | - this file |
3 | MSI-HOWTO.txt | ||
4 | - the Message Signaled Interrupts (MSI) Driver Guide HOWTO and FAQ. | ||
3 | PCI-DMA-mapping.txt | 5 | PCI-DMA-mapping.txt |
4 | - info for PCI drivers using DMA portably across all platforms | 6 | - info for PCI drivers using DMA portably across all platforms |
5 | PCIEBUS-HOWTO.txt | 7 | PCIEBUS-HOWTO.txt |
diff --git a/Documentation/MSI-HOWTO.txt b/Documentation/PCI/MSI-HOWTO.txt index 256defd7e174..256defd7e174 100644 --- a/Documentation/MSI-HOWTO.txt +++ b/Documentation/PCI/MSI-HOWTO.txt | |||
diff --git a/Documentation/acpi/debug.txt b/Documentation/acpi/debug.txt new file mode 100644 index 000000000000..65bf47c46b6d --- /dev/null +++ b/Documentation/acpi/debug.txt | |||
@@ -0,0 +1,148 @@ | |||
1 | ACPI Debug Output | ||
2 | |||
3 | |||
4 | The ACPI CA, the Linux ACPI core, and some ACPI drivers can generate debug | ||
5 | output. This document describes how to use this facility. | ||
6 | |||
7 | Compile-time configuration | ||
8 | -------------------------- | ||
9 | |||
10 | ACPI debug output is globally enabled by CONFIG_ACPI_DEBUG. If this config | ||
11 | option is turned off, the debug messages are not even built into the | ||
12 | kernel. | ||
13 | |||
14 | Boot- and run-time configuration | ||
15 | -------------------------------- | ||
16 | |||
17 | When CONFIG_ACPI_DEBUG=y, you can select the component and level of messages | ||
18 | you're interested in. At boot-time, use the acpi.debug_layer and | ||
19 | acpi.debug_level kernel command line options. After boot, you can use the | ||
20 | debug_layer and debug_level files in /sys/module/acpi/parameters/ to control | ||
21 | the debug messages. | ||
22 | |||
23 | debug_layer (component) | ||
24 | ----------------------- | ||
25 | |||
26 | The "debug_layer" is a mask that selects components of interest, e.g., a | ||
27 | specific driver or part of the ACPI interpreter. To build the debug_layer | ||
28 | bitmask, look for the "#define _COMPONENT" in an ACPI source file. | ||
29 | |||
30 | You can set the debug_layer mask at boot-time using the acpi.debug_layer | ||
31 | command line argument, and you can change it after boot by writing values | ||
32 | to /sys/module/acpi/parameters/debug_layer. | ||
33 | |||
34 | The possible components are defined in include/acpi/acoutput.h and | ||
35 | include/acpi/acpi_drivers.h. Reading /sys/module/acpi/parameters/debug_layer | ||
36 | shows the supported mask values, currently these: | ||
37 | |||
38 | ACPI_UTILITIES 0x00000001 | ||
39 | ACPI_HARDWARE 0x00000002 | ||
40 | ACPI_EVENTS 0x00000004 | ||
41 | ACPI_TABLES 0x00000008 | ||
42 | ACPI_NAMESPACE 0x00000010 | ||
43 | ACPI_PARSER 0x00000020 | ||
44 | ACPI_DISPATCHER 0x00000040 | ||
45 | ACPI_EXECUTER 0x00000080 | ||
46 | ACPI_RESOURCES 0x00000100 | ||
47 | ACPI_CA_DEBUGGER 0x00000200 | ||
48 | ACPI_OS_SERVICES 0x00000400 | ||
49 | ACPI_CA_DISASSEMBLER 0x00000800 | ||
50 | ACPI_COMPILER 0x00001000 | ||
51 | ACPI_TOOLS 0x00002000 | ||
52 | ACPI_BUS_COMPONENT 0x00010000 | ||
53 | ACPI_AC_COMPONENT 0x00020000 | ||
54 | ACPI_BATTERY_COMPONENT 0x00040000 | ||
55 | ACPI_BUTTON_COMPONENT 0x00080000 | ||
56 | ACPI_SBS_COMPONENT 0x00100000 | ||
57 | ACPI_FAN_COMPONENT 0x00200000 | ||
58 | ACPI_PCI_COMPONENT 0x00400000 | ||
59 | ACPI_POWER_COMPONENT 0x00800000 | ||
60 | ACPI_CONTAINER_COMPONENT 0x01000000 | ||
61 | ACPI_SYSTEM_COMPONENT 0x02000000 | ||
62 | ACPI_THERMAL_COMPONENT 0x04000000 | ||
63 | ACPI_MEMORY_DEVICE_COMPONENT 0x08000000 | ||
64 | ACPI_VIDEO_COMPONENT 0x10000000 | ||
65 | ACPI_PROCESSOR_COMPONENT 0x20000000 | ||
66 | |||
67 | debug_level | ||
68 | ----------- | ||
69 | |||
70 | The "debug_level" is a mask that selects different types of messages, e.g., | ||
71 | those related to initialization, method execution, informational messages, etc. | ||
72 | To build debug_level, look at the level specified in an ACPI_DEBUG_PRINT() | ||
73 | statement. | ||
74 | |||
75 | The ACPI interpreter uses several different levels, but the Linux | ||
76 | ACPI core and ACPI drivers generally only use ACPI_LV_INFO. | ||
77 | |||
78 | You can set the debug_level mask at boot-time using the acpi.debug_level | ||
79 | command line argument, and you can change it after boot by writing values | ||
80 | to /sys/module/acpi/parameters/debug_level. | ||
81 | |||
82 | The possible levels are defined in include/acpi/acoutput.h. Reading | ||
83 | /sys/module/acpi/parameters/debug_level shows the supported mask values, | ||
84 | currently these: | ||
85 | |||
86 | ACPI_LV_INIT 0x00000001 | ||
87 | ACPI_LV_DEBUG_OBJECT 0x00000002 | ||
88 | ACPI_LV_INFO 0x00000004 | ||
89 | ACPI_LV_INIT_NAMES 0x00000020 | ||
90 | ACPI_LV_PARSE 0x00000040 | ||
91 | ACPI_LV_LOAD 0x00000080 | ||
92 | ACPI_LV_DISPATCH 0x00000100 | ||
93 | ACPI_LV_EXEC 0x00000200 | ||
94 | ACPI_LV_NAMES 0x00000400 | ||
95 | ACPI_LV_OPREGION 0x00000800 | ||
96 | ACPI_LV_BFIELD 0x00001000 | ||
97 | ACPI_LV_TABLES 0x00002000 | ||
98 | ACPI_LV_VALUES 0x00004000 | ||
99 | ACPI_LV_OBJECTS 0x00008000 | ||
100 | ACPI_LV_RESOURCES 0x00010000 | ||
101 | ACPI_LV_USER_REQUESTS 0x00020000 | ||
102 | ACPI_LV_PACKAGE 0x00040000 | ||
103 | ACPI_LV_ALLOCATIONS 0x00100000 | ||
104 | ACPI_LV_FUNCTIONS 0x00200000 | ||
105 | ACPI_LV_OPTIMIZATIONS 0x00400000 | ||
106 | ACPI_LV_MUTEX 0x01000000 | ||
107 | ACPI_LV_THREADS 0x02000000 | ||
108 | ACPI_LV_IO 0x04000000 | ||
109 | ACPI_LV_INTERRUPTS 0x08000000 | ||
110 | ACPI_LV_AML_DISASSEMBLE 0x10000000 | ||
111 | ACPI_LV_VERBOSE_INFO 0x20000000 | ||
112 | ACPI_LV_FULL_TABLES 0x40000000 | ||
113 | ACPI_LV_EVENTS 0x80000000 | ||
114 | |||
115 | Examples | ||
116 | -------- | ||
117 | |||
118 | For example, drivers/acpi/bus.c contains this: | ||
119 | |||
120 | #define _COMPONENT ACPI_BUS_COMPONENT | ||
121 | ... | ||
122 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device insertion detected\n")); | ||
123 | |||
124 | To turn on this message, set the ACPI_BUS_COMPONENT bit in acpi.debug_layer | ||
125 | and the ACPI_LV_INFO bit in acpi.debug_level. (The ACPI_DEBUG_PRINT | ||
126 | statement uses ACPI_DB_INFO, which is macro based on the ACPI_LV_INFO | ||
127 | definition.) | ||
128 | |||
129 | Enable all AML "Debug" output (stores to the Debug object while interpreting | ||
130 | AML) during boot: | ||
131 | |||
132 | acpi.debug_layer=0xffffffff acpi.debug_level=0x2 | ||
133 | |||
134 | Enable PCI and PCI interrupt routing debug messages: | ||
135 | |||
136 | acpi.debug_layer=0x400000 acpi.debug_level=0x4 | ||
137 | |||
138 | Enable all ACPI hardware-related messages: | ||
139 | |||
140 | acpi.debug_layer=0x2 acpi.debug_level=0xffffffff | ||
141 | |||
142 | Enable all ACPI_DB_INFO messages after boot: | ||
143 | |||
144 | # echo 0x4 > /sys/module/acpi/parameters/debug_level | ||
145 | |||
146 | Show all valid component values: | ||
147 | |||
148 | # cat /sys/module/acpi/parameters/debug_layer | ||
diff --git a/Documentation/blockdev/00-INDEX b/Documentation/blockdev/00-INDEX new file mode 100644 index 000000000000..86f054c47013 --- /dev/null +++ b/Documentation/blockdev/00-INDEX | |||
@@ -0,0 +1,16 @@ | |||
1 | 00-INDEX | ||
2 | - this file | ||
3 | README.DAC960 | ||
4 | - info on Mylex DAC960/DAC1100 PCI RAID Controller Driver for Linux. | ||
5 | cciss.txt | ||
6 | - info, major/minor #'s for Compaq's SMART Array Controllers. | ||
7 | cpqarray.txt | ||
8 | - info on using Compaq's SMART2 Intelligent Disk Array Controllers. | ||
9 | floppy.txt | ||
10 | - notes and driver options for the floppy disk driver. | ||
11 | nbd.txt | ||
12 | - info on a TCP implementation of a network block device. | ||
13 | paride.txt | ||
14 | - information about the parallel port IDE subsystem. | ||
15 | ramdisk.txt | ||
16 | - short guide on how to set up and use the RAM disk. | ||
diff --git a/Documentation/README.DAC960 b/Documentation/blockdev/README.DAC960 index 0e8f618ab534..0e8f618ab534 100644 --- a/Documentation/README.DAC960 +++ b/Documentation/blockdev/README.DAC960 | |||
diff --git a/Documentation/cciss.txt b/Documentation/blockdev/cciss.txt index 89698e8df7d4..89698e8df7d4 100644 --- a/Documentation/cciss.txt +++ b/Documentation/blockdev/cciss.txt | |||
diff --git a/Documentation/cpqarray.txt b/Documentation/blockdev/cpqarray.txt index c7154e20ef5e..c7154e20ef5e 100644 --- a/Documentation/cpqarray.txt +++ b/Documentation/blockdev/cpqarray.txt | |||
diff --git a/Documentation/floppy.txt b/Documentation/blockdev/floppy.txt index 6ccab88705cb..6ccab88705cb 100644 --- a/Documentation/floppy.txt +++ b/Documentation/blockdev/floppy.txt | |||
diff --git a/Documentation/nbd.txt b/Documentation/blockdev/nbd.txt index aeb93ffe6416..aeb93ffe6416 100644 --- a/Documentation/nbd.txt +++ b/Documentation/blockdev/nbd.txt | |||
diff --git a/Documentation/paride.txt b/Documentation/blockdev/paride.txt index e4312676bdda..e4312676bdda 100644 --- a/Documentation/paride.txt +++ b/Documentation/blockdev/paride.txt | |||
diff --git a/Documentation/ramdisk.txt b/Documentation/blockdev/ramdisk.txt index 6c820baa19a6..6c820baa19a6 100644 --- a/Documentation/ramdisk.txt +++ b/Documentation/blockdev/ramdisk.txt | |||
diff --git a/Documentation/c2port.txt b/Documentation/c2port.txt new file mode 100644 index 000000000000..d9bf93ea4398 --- /dev/null +++ b/Documentation/c2port.txt | |||
@@ -0,0 +1,90 @@ | |||
1 | C2 port support | ||
2 | --------------- | ||
3 | |||
4 | (C) Copyright 2007 Rodolfo Giometti <giometti@enneenne.com> | ||
5 | |||
6 | This program is free software; you can redistribute it and/or modify | ||
7 | it under the terms of the GNU General Public License as published by | ||
8 | the Free Software Foundation; either version 2 of the License, or | ||
9 | (at your option) any later version. | ||
10 | |||
11 | This program is distributed in the hope that it will be useful, | ||
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | GNU General Public License for more details. | ||
15 | |||
16 | |||
17 | |||
18 | Overview | ||
19 | -------- | ||
20 | |||
21 | This driver implements the support for Linux of Silicon Labs (Silabs) | ||
22 | C2 Interface used for in-system programming of micro controllers. | ||
23 | |||
24 | By using this driver you can reprogram the in-system flash without EC2 | ||
25 | or EC3 debug adapter. This solution is also useful in those systems | ||
26 | where the micro controller is connected via special GPIOs pins. | ||
27 | |||
28 | References | ||
29 | ---------- | ||
30 | |||
31 | The C2 Interface main references are at (http://www.silabs.com) | ||
32 | Silicon Laboratories site], see: | ||
33 | |||
34 | - AN127: FLASH Programming via the C2 Interface at | ||
35 | http://www.silabs.com/public/documents/tpub_doc/anote/Microcontrollers/Small_Form_Factor/en/an127.pdf, and | ||
36 | |||
37 | - C2 Specification at | ||
38 | http://www.silabs.com/public/documents/tpub_doc/spec/Microcontrollers/en/C2spec.pdf, | ||
39 | |||
40 | however it implements a two wire serial communication protocol (bit | ||
41 | banging) designed to enable in-system programming, debugging, and | ||
42 | boundary-scan testing on low pin-count Silicon Labs devices. Currently | ||
43 | this code supports only flash programming but extensions are easy to | ||
44 | add. | ||
45 | |||
46 | Using the driver | ||
47 | ---------------- | ||
48 | |||
49 | Once the driver is loaded you can use sysfs support to get C2port's | ||
50 | info or read/write in-system flash. | ||
51 | |||
52 | # ls /sys/class/c2port/c2port0/ | ||
53 | access flash_block_size flash_erase rev_id | ||
54 | dev_id flash_blocks_num flash_size subsystem/ | ||
55 | flash_access flash_data reset uevent | ||
56 | |||
57 | Initially the C2port access is disabled since you hardware may have | ||
58 | such lines multiplexed with other devices so, to get access to the | ||
59 | C2port, you need the command: | ||
60 | |||
61 | # echo 1 > /sys/class/c2port/c2port0/access | ||
62 | |||
63 | after that you should read the device ID and revision ID of the | ||
64 | connected micro controller: | ||
65 | |||
66 | # cat /sys/class/c2port/c2port0/dev_id | ||
67 | 8 | ||
68 | # cat /sys/class/c2port/c2port0/rev_id | ||
69 | 1 | ||
70 | |||
71 | However, for security reasons, the in-system flash access in not | ||
72 | enabled yet, to do so you need the command: | ||
73 | |||
74 | # echo 1 > /sys/class/c2port/c2port0/flash_access | ||
75 | |||
76 | After that you can read the whole flash: | ||
77 | |||
78 | # cat /sys/class/c2port/c2port0/flash_data > image | ||
79 | |||
80 | erase it: | ||
81 | |||
82 | # echo 1 > /sys/class/c2port/c2port0/flash_erase | ||
83 | |||
84 | and write it: | ||
85 | |||
86 | # cat image > /sys/class/c2port/c2port0/flash_data | ||
87 | |||
88 | after writing you have to reset the device to execute the new code: | ||
89 | |||
90 | # echo 1 > /sys/class/c2port/c2port0/reset | ||
diff --git a/Documentation/cgroups/freezer-subsystem.txt b/Documentation/cgroups/freezer-subsystem.txt index c50ab58b72eb..41f37fea1276 100644 --- a/Documentation/cgroups/freezer-subsystem.txt +++ b/Documentation/cgroups/freezer-subsystem.txt | |||
@@ -1,4 +1,4 @@ | |||
1 | The cgroup freezer is useful to batch job management system which start | 1 | The cgroup freezer is useful to batch job management system which start |
2 | and stop sets of tasks in order to schedule the resources of a machine | 2 | and stop sets of tasks in order to schedule the resources of a machine |
3 | according to the desires of a system administrator. This sort of program | 3 | according to the desires of a system administrator. This sort of program |
4 | is often used on HPC clusters to schedule access to the cluster as a | 4 | is often used on HPC clusters to schedule access to the cluster as a |
@@ -6,7 +6,7 @@ whole. The cgroup freezer uses cgroups to describe the set of tasks to | |||
6 | be started/stopped by the batch job management system. It also provides | 6 | be started/stopped by the batch job management system. It also provides |
7 | a means to start and stop the tasks composing the job. | 7 | a means to start and stop the tasks composing the job. |
8 | 8 | ||
9 | The cgroup freezer will also be useful for checkpointing running groups | 9 | The cgroup freezer will also be useful for checkpointing running groups |
10 | of tasks. The freezer allows the checkpoint code to obtain a consistent | 10 | of tasks. The freezer allows the checkpoint code to obtain a consistent |
11 | image of the tasks by attempting to force the tasks in a cgroup into a | 11 | image of the tasks by attempting to force the tasks in a cgroup into a |
12 | quiescent state. Once the tasks are quiescent another task can | 12 | quiescent state. Once the tasks are quiescent another task can |
@@ -16,7 +16,7 @@ recoverable error occur. This also allows the checkpointed tasks to be | |||
16 | migrated between nodes in a cluster by copying the gathered information | 16 | migrated between nodes in a cluster by copying the gathered information |
17 | to another node and restarting the tasks there. | 17 | to another node and restarting the tasks there. |
18 | 18 | ||
19 | Sequences of SIGSTOP and SIGCONT are not always sufficient for stopping | 19 | Sequences of SIGSTOP and SIGCONT are not always sufficient for stopping |
20 | and resuming tasks in userspace. Both of these signals are observable | 20 | and resuming tasks in userspace. Both of these signals are observable |
21 | from within the tasks we wish to freeze. While SIGSTOP cannot be caught, | 21 | from within the tasks we wish to freeze. While SIGSTOP cannot be caught, |
22 | blocked, or ignored it can be seen by waiting or ptracing parent tasks. | 22 | blocked, or ignored it can be seen by waiting or ptracing parent tasks. |
@@ -37,26 +37,29 @@ demonstrate this problem using nested bash shells: | |||
37 | 37 | ||
38 | <at this point 16990 exits and causes 16644 to exit too> | 38 | <at this point 16990 exits and causes 16644 to exit too> |
39 | 39 | ||
40 | This happens because bash can observe both signals and choose how it | 40 | This happens because bash can observe both signals and choose how it |
41 | responds to them. | 41 | responds to them. |
42 | 42 | ||
43 | Another example of a program which catches and responds to these | 43 | Another example of a program which catches and responds to these |
44 | signals is gdb. In fact any program designed to use ptrace is likely to | 44 | signals is gdb. In fact any program designed to use ptrace is likely to |
45 | have a problem with this method of stopping and resuming tasks. | 45 | have a problem with this method of stopping and resuming tasks. |
46 | 46 | ||
47 | In contrast, the cgroup freezer uses the kernel freezer code to | 47 | In contrast, the cgroup freezer uses the kernel freezer code to |
48 | prevent the freeze/unfreeze cycle from becoming visible to the tasks | 48 | prevent the freeze/unfreeze cycle from becoming visible to the tasks |
49 | being frozen. This allows the bash example above and gdb to run as | 49 | being frozen. This allows the bash example above and gdb to run as |
50 | expected. | 50 | expected. |
51 | 51 | ||
52 | The freezer subsystem in the container filesystem defines a file named | 52 | The freezer subsystem in the container filesystem defines a file named |
53 | freezer.state. Writing "FROZEN" to the state file will freeze all tasks in the | 53 | freezer.state. Writing "FROZEN" to the state file will freeze all tasks in the |
54 | cgroup. Subsequently writing "THAWED" will unfreeze the tasks in the cgroup. | 54 | cgroup. Subsequently writing "THAWED" will unfreeze the tasks in the cgroup. |
55 | Reading will return the current state. | 55 | Reading will return the current state. |
56 | 56 | ||
57 | Note freezer.state doesn't exist in root cgroup, which means root cgroup | ||
58 | is non-freezable. | ||
59 | |||
57 | * Examples of usage : | 60 | * Examples of usage : |
58 | 61 | ||
59 | # mkdir /containers/freezer | 62 | # mkdir /containers |
60 | # mount -t cgroup -ofreezer freezer /containers | 63 | # mount -t cgroup -ofreezer freezer /containers |
61 | # mkdir /containers/0 | 64 | # mkdir /containers/0 |
62 | # echo $some_pid > /containers/0/tasks | 65 | # echo $some_pid > /containers/0/tasks |
@@ -94,6 +97,6 @@ things happens: | |||
94 | the freezer.state file | 97 | the freezer.state file |
95 | 2) Userspace retries the freezing operation by writing "FROZEN" to | 98 | 2) Userspace retries the freezing operation by writing "FROZEN" to |
96 | the freezer.state file (writing "FREEZING" is not legal | 99 | the freezer.state file (writing "FREEZING" is not legal |
97 | and returns EIO) | 100 | and returns EINVAL) |
98 | 3) The tasks that blocked the cgroup from entering the "FROZEN" | 101 | 3) The tasks that blocked the cgroup from entering the "FROZEN" |
99 | state disappear from the cgroup's set of tasks. | 102 | state disappear from the cgroup's set of tasks. |
diff --git a/Documentation/cpu-freq/user-guide.txt b/Documentation/cpu-freq/user-guide.txt index 6c442d8426b5..4f3f3840320e 100644 --- a/Documentation/cpu-freq/user-guide.txt +++ b/Documentation/cpu-freq/user-guide.txt | |||
@@ -23,6 +23,7 @@ Contents: | |||
23 | 1.3 sparc64 | 23 | 1.3 sparc64 |
24 | 1.4 ppc | 24 | 1.4 ppc |
25 | 1.5 SuperH | 25 | 1.5 SuperH |
26 | 1.6 Blackfin | ||
26 | 27 | ||
27 | 2. "Policy" / "Governor"? | 28 | 2. "Policy" / "Governor"? |
28 | 2.1 Policy | 29 | 2.1 Policy |
@@ -97,6 +98,17 @@ The following SuperH processors are supported by cpufreq: | |||
97 | SH-3 | 98 | SH-3 |
98 | SH-4 | 99 | SH-4 |
99 | 100 | ||
101 | 1.6 Blackfin | ||
102 | ------------ | ||
103 | |||
104 | The following Blackfin processors are supported by cpufreq: | ||
105 | |||
106 | BF522, BF523, BF524, BF525, BF526, BF527, Rev 0.1 or higher | ||
107 | BF531, BF532, BF533, Rev 0.3 or higher | ||
108 | BF534, BF536, BF537, Rev 0.2 or higher | ||
109 | BF561, Rev 0.3 or higher | ||
110 | BF542, BF544, BF547, BF548, BF549, Rev 0.1 or higher | ||
111 | |||
100 | 112 | ||
101 | 2. "Policy" / "Governor" ? | 113 | 2. "Policy" / "Governor" ? |
102 | ========================== | 114 | ========================== |
diff --git a/Documentation/filesystems/ocfs2.txt b/Documentation/filesystems/ocfs2.txt index 4340cc825796..67310fbbb7df 100644 --- a/Documentation/filesystems/ocfs2.txt +++ b/Documentation/filesystems/ocfs2.txt | |||
@@ -28,10 +28,7 @@ Manish Singh <manish.singh@oracle.com> | |||
28 | Caveats | 28 | Caveats |
29 | ======= | 29 | ======= |
30 | Features which OCFS2 does not support yet: | 30 | Features which OCFS2 does not support yet: |
31 | - extended attributes | ||
32 | - quotas | 31 | - quotas |
33 | - cluster aware flock | ||
34 | - cluster aware lockf | ||
35 | - Directory change notification (F_NOTIFY) | 32 | - Directory change notification (F_NOTIFY) |
36 | - Distributed Caching (F_SETLEASE/F_GETLEASE/break_lease) | 33 | - Distributed Caching (F_SETLEASE/F_GETLEASE/break_lease) |
37 | - POSIX ACLs | 34 | - POSIX ACLs |
diff --git a/Documentation/filesystems/proc.txt b/Documentation/filesystems/proc.txt index bcceb99b81dd..bb1b0dd3bfcb 100644 --- a/Documentation/filesystems/proc.txt +++ b/Documentation/filesystems/proc.txt | |||
@@ -44,6 +44,7 @@ Table of Contents | |||
44 | 2.14 /proc/<pid>/io - Display the IO accounting fields | 44 | 2.14 /proc/<pid>/io - Display the IO accounting fields |
45 | 2.15 /proc/<pid>/coredump_filter - Core dump filtering settings | 45 | 2.15 /proc/<pid>/coredump_filter - Core dump filtering settings |
46 | 2.16 /proc/<pid>/mountinfo - Information about mounts | 46 | 2.16 /proc/<pid>/mountinfo - Information about mounts |
47 | 2.17 /proc/sys/fs/epoll - Configuration options for the epoll interface | ||
47 | 48 | ||
48 | ------------------------------------------------------------------------------ | 49 | ------------------------------------------------------------------------------ |
49 | Preface | 50 | Preface |
@@ -2483,4 +2484,30 @@ For more information on mount propagation see: | |||
2483 | 2484 | ||
2484 | Documentation/filesystems/sharedsubtree.txt | 2485 | Documentation/filesystems/sharedsubtree.txt |
2485 | 2486 | ||
2487 | 2.17 /proc/sys/fs/epoll - Configuration options for the epoll interface | ||
2488 | -------------------------------------------------------- | ||
2489 | |||
2490 | This directory contains configuration options for the epoll(7) interface. | ||
2491 | |||
2492 | max_user_instances | ||
2493 | ------------------ | ||
2494 | |||
2495 | This is the maximum number of epoll file descriptors that a single user can | ||
2496 | have open at a given time. The default value is 128, and should be enough | ||
2497 | for normal users. | ||
2498 | |||
2499 | max_user_watches | ||
2500 | ---------------- | ||
2501 | |||
2502 | Every epoll file descriptor can store a number of files to be monitored | ||
2503 | for event readiness. Each one of these monitored files constitutes a "watch". | ||
2504 | This configuration option sets the maximum number of "watches" that are | ||
2505 | allowed for each user. | ||
2506 | Each "watch" costs roughly 90 bytes on a 32bit kernel, and roughly 160 bytes | ||
2507 | on a 64bit one. | ||
2508 | The current default value for max_user_watches is the 1/32 of the available | ||
2509 | low memory, divided for the "watch" cost in bytes. | ||
2510 | |||
2511 | |||
2486 | ------------------------------------------------------------------------------ | 2512 | ------------------------------------------------------------------------------ |
2513 | |||
diff --git a/Documentation/filesystems/ramfs-rootfs-initramfs.txt b/Documentation/filesystems/ramfs-rootfs-initramfs.txt index 62fe9b1e0890..a8273d5fad20 100644 --- a/Documentation/filesystems/ramfs-rootfs-initramfs.txt +++ b/Documentation/filesystems/ramfs-rootfs-initramfs.txt | |||
@@ -130,12 +130,12 @@ The 2.6 kernel build process always creates a gzipped cpio format initramfs | |||
130 | archive and links it into the resulting kernel binary. By default, this | 130 | archive and links it into the resulting kernel binary. By default, this |
131 | archive is empty (consuming 134 bytes on x86). | 131 | archive is empty (consuming 134 bytes on x86). |
132 | 132 | ||
133 | The config option CONFIG_INITRAMFS_SOURCE (for some reason buried under | 133 | The config option CONFIG_INITRAMFS_SOURCE (in General Setup in menuconfig, |
134 | devices->block devices in menuconfig, and living in usr/Kconfig) can be used | 134 | and living in usr/Kconfig) can be used to specify a source for the |
135 | to specify a source for the initramfs archive, which will automatically be | 135 | initramfs archive, which will automatically be incorporated into the |
136 | incorporated into the resulting binary. This option can point to an existing | 136 | resulting binary. This option can point to an existing gzipped cpio |
137 | gzipped cpio archive, a directory containing files to be archived, or a text | 137 | archive, a directory containing files to be archived, or a text file |
138 | file specification such as the following example: | 138 | specification such as the following example: |
139 | 139 | ||
140 | dir /dev 755 0 0 | 140 | dir /dev 755 0 0 |
141 | nod /dev/console 644 0 0 c 5 1 | 141 | nod /dev/console 644 0 0 c 5 1 |
diff --git a/Documentation/filesystems/xip.txt b/Documentation/filesystems/xip.txt index 3cc4010521a0..0466ee569278 100644 --- a/Documentation/filesystems/xip.txt +++ b/Documentation/filesystems/xip.txt | |||
@@ -39,10 +39,11 @@ The block device operation is optional, these block devices support it as of | |||
39 | today: | 39 | today: |
40 | - dcssblk: s390 dcss block device driver | 40 | - dcssblk: s390 dcss block device driver |
41 | 41 | ||
42 | An address space operation named get_xip_page is used to retrieve reference | 42 | An address space operation named get_xip_mem is used to retrieve references |
43 | to a struct page. To address the target page, a reference to an address_space, | 43 | to a page frame number and a kernel address. To obtain these values a reference |
44 | and a sector number is provided. A 3rd argument indicates whether the | 44 | to an address_space is provided. This function assigns values to the kmem and |
45 | function should allocate blocks if needed. | 45 | pfn parameters. The third argument indicates whether the function should allocate |
46 | blocks if needed. | ||
46 | 47 | ||
47 | This address space operation is mutually exclusive with readpage&writepage that | 48 | This address space operation is mutually exclusive with readpage&writepage that |
48 | do page cache read/write operations. | 49 | do page cache read/write operations. |
diff --git a/Documentation/hwmon/adt7462 b/Documentation/hwmon/adt7462 new file mode 100644 index 000000000000..ec660b328275 --- /dev/null +++ b/Documentation/hwmon/adt7462 | |||
@@ -0,0 +1,67 @@ | |||
1 | Kernel driver adt7462 | ||
2 | ====================== | ||
3 | |||
4 | Supported chips: | ||
5 | * Analog Devices ADT7462 | ||
6 | Prefix: 'adt7462' | ||
7 | Addresses scanned: I2C 0x58, 0x5C | ||
8 | Datasheet: Publicly available at the Analog Devices website | ||
9 | |||
10 | Author: Darrick J. Wong | ||
11 | |||
12 | Description | ||
13 | ----------- | ||
14 | |||
15 | This driver implements support for the Analog Devices ADT7462 chip family. | ||
16 | |||
17 | This chip is a bit of a beast. It has 8 counters for measuring fan speed. It | ||
18 | can also measure 13 voltages or 4 temperatures, or various combinations of the | ||
19 | two. See the chip documentation for more details about the exact set of | ||
20 | configurations. This driver does not allow one to configure the chip; that is | ||
21 | left to the system designer. | ||
22 | |||
23 | A sophisticated control system for the PWM outputs is designed into the ADT7462 | ||
24 | that allows fan speed to be adjusted automatically based on any of the three | ||
25 | temperature sensors. Each PWM output is individually adjustable and | ||
26 | programmable. Once configured, the ADT7462 will adjust the PWM outputs in | ||
27 | response to the measured temperatures without further host intervention. This | ||
28 | feature can also be disabled for manual control of the PWM's. | ||
29 | |||
30 | Each of the measured inputs (voltage, temperature, fan speed) has | ||
31 | corresponding high/low limit values. The ADT7462 will signal an ALARM if | ||
32 | any measured value exceeds either limit. | ||
33 | |||
34 | The ADT7462 samples all inputs continuously. The driver will not read | ||
35 | the registers more often than once every other second. Further, | ||
36 | configuration data is only read once per minute. | ||
37 | |||
38 | Special Features | ||
39 | ---------------- | ||
40 | |||
41 | The ADT7462 have a 10-bit ADC and can therefore measure temperatures | ||
42 | with 0.25 degC resolution. | ||
43 | |||
44 | The Analog Devices datasheet is very detailed and describes a procedure for | ||
45 | determining an optimal configuration for the automatic PWM control. | ||
46 | |||
47 | The driver will report sensor labels when it is able to determine that | ||
48 | information from the configuration registers. | ||
49 | |||
50 | Configuration Notes | ||
51 | ------------------- | ||
52 | |||
53 | Besides standard interfaces driver adds the following: | ||
54 | |||
55 | * PWM Control | ||
56 | |||
57 | * pwm#_auto_point1_pwm and temp#_auto_point1_temp and | ||
58 | * pwm#_auto_point2_pwm and temp#_auto_point2_temp - | ||
59 | |||
60 | point1: Set the pwm speed at a lower temperature bound. | ||
61 | point2: Set the pwm speed at a higher temperature bound. | ||
62 | |||
63 | The ADT7462 will scale the pwm between the lower and higher pwm speed when | ||
64 | the temperature is between the two temperature boundaries. PWM values range | ||
65 | from 0 (off) to 255 (full speed). Fan speed will be set to maximum when the | ||
66 | temperature sensor associated with the PWM control exceeds temp#_max. | ||
67 | |||
diff --git a/Documentation/hwmon/lis3lv02d b/Documentation/hwmon/lis3lv02d new file mode 100644 index 000000000000..65dfb0c0fd67 --- /dev/null +++ b/Documentation/hwmon/lis3lv02d | |||
@@ -0,0 +1,49 @@ | |||
1 | Kernel driver lis3lv02d | ||
2 | ================== | ||
3 | |||
4 | Supported chips: | ||
5 | |||
6 | * STMicroelectronics LIS3LV02DL and LIS3LV02DQ | ||
7 | |||
8 | Author: | ||
9 | Yan Burman <burman.yan@gmail.com> | ||
10 | Eric Piel <eric.piel@tremplin-utc.net> | ||
11 | |||
12 | |||
13 | Description | ||
14 | ----------- | ||
15 | |||
16 | This driver provides support for the accelerometer found in various HP laptops | ||
17 | sporting the feature officially called "HP Mobile Data Protection System 3D" or | ||
18 | "HP 3D DriveGuard". It detect automatically laptops with this sensor. Known models | ||
19 | (for now the HP 2133, nc6420, nc2510, nc8510, nc84x0, nw9440 and nx9420) will | ||
20 | have their axis automatically oriented on standard way (eg: you can directly | ||
21 | play neverball). The accelerometer data is readable via | ||
22 | /sys/devices/platform/lis3lv02d. | ||
23 | |||
24 | Sysfs attributes under /sys/devices/platform/lis3lv02d/: | ||
25 | position - 3D position that the accelerometer reports. Format: "(x,y,z)" | ||
26 | calibrate - read: values (x, y, z) that are used as the base for input class device operation. | ||
27 | write: forces the base to be recalibrated with the current position. | ||
28 | rate - reports the sampling rate of the accelerometer device in HZ | ||
29 | |||
30 | This driver also provides an absolute input class device, allowing | ||
31 | the laptop to act as a pinball machine-esque joystick. | ||
32 | |||
33 | Axes orientation | ||
34 | ---------------- | ||
35 | |||
36 | For better compatibility between the various laptops. The values reported by | ||
37 | the accelerometer are converted into a "standard" organisation of the axes | ||
38 | (aka "can play neverball out of the box"): | ||
39 | * When the laptop is horizontal the position reported is about 0 for X and Y | ||
40 | and a positive value for Z | ||
41 | * If the left side is elevated, X increases (becomes positive) | ||
42 | * If the front side (where the touchpad is) is elevated, Y decreases (becomes negative) | ||
43 | * If the laptop is put upside-down, Z becomes negative | ||
44 | |||
45 | If your laptop model is not recognized (cf "dmesg"), you can send an email to the | ||
46 | authors to add it to the database. When reporting a new laptop, please include | ||
47 | the output of "dmidecode" plus the value of /sys/devices/platform/lis3lv02d/position | ||
48 | in these four cases. | ||
49 | |||
diff --git a/Documentation/ics932s401 b/Documentation/ics932s401 new file mode 100644 index 000000000000..07a739f406d8 --- /dev/null +++ b/Documentation/ics932s401 | |||
@@ -0,0 +1,31 @@ | |||
1 | Kernel driver ics932s401 | ||
2 | ====================== | ||
3 | |||
4 | Supported chips: | ||
5 | * IDT ICS932S401 | ||
6 | Prefix: 'ics932s401' | ||
7 | Addresses scanned: I2C 0x69 | ||
8 | Datasheet: Publically available at the IDT website | ||
9 | |||
10 | Author: Darrick J. Wong | ||
11 | |||
12 | Description | ||
13 | ----------- | ||
14 | |||
15 | This driver implements support for the IDT ICS932S401 chip family. | ||
16 | |||
17 | This chip has 4 clock outputs--a base clock for the CPU (which is likely | ||
18 | multiplied to get the real CPU clock), a system clock, a PCI clock, a USB | ||
19 | clock, and a reference clock. The driver reports selected and actual | ||
20 | frequency. If spread spectrum mode is enabled, the driver also reports by what | ||
21 | percent the clock signal is being spread, which should be between 0 and -0.5%. | ||
22 | All frequencies are reported in KHz. | ||
23 | |||
24 | The ICS932S401 monitors all inputs continuously. The driver will not read | ||
25 | the registers more often than once every other second. | ||
26 | |||
27 | Special Features | ||
28 | ---------------- | ||
29 | |||
30 | The clocks could be reprogrammed to increase system speed. I will not help you | ||
31 | do this, as you risk damaging your system! | ||
diff --git a/Documentation/input/input-programming.txt b/Documentation/input/input-programming.txt index 81905e81585e..7f8b9d97bc47 100644 --- a/Documentation/input/input-programming.txt +++ b/Documentation/input/input-programming.txt | |||
@@ -20,10 +20,11 @@ pressed or released a BUTTON_IRQ happens. The driver could look like: | |||
20 | 20 | ||
21 | static struct input_dev *button_dev; | 21 | static struct input_dev *button_dev; |
22 | 22 | ||
23 | static void button_interrupt(int irq, void *dummy, struct pt_regs *fp) | 23 | static irqreturn_t button_interrupt(int irq, void *dummy) |
24 | { | 24 | { |
25 | input_report_key(button_dev, BTN_0, inb(BUTTON_PORT) & 1); | 25 | input_report_key(button_dev, BTN_0, inb(BUTTON_PORT) & 1); |
26 | input_sync(button_dev); | 26 | input_sync(button_dev); |
27 | return IRQ_HANDLED; | ||
27 | } | 28 | } |
28 | 29 | ||
29 | static int __init button_init(void) | 30 | static int __init button_init(void) |
diff --git a/Documentation/ioctl/00-INDEX b/Documentation/ioctl/00-INDEX new file mode 100644 index 000000000000..d2fe4d4729ef --- /dev/null +++ b/Documentation/ioctl/00-INDEX | |||
@@ -0,0 +1,10 @@ | |||
1 | 00-INDEX | ||
2 | - this file | ||
3 | cdrom.txt | ||
4 | - summary of CDROM ioctl calls | ||
5 | hdio.txt | ||
6 | - summary of HDIO_ ioctl calls | ||
7 | ioctl-decoding.txt | ||
8 | - how to decode the bits of an IOCTL code | ||
9 | ioctl-number.txt | ||
10 | - how to implement and register device/driver ioctl calls | ||
diff --git a/Documentation/ioctl-number.txt b/Documentation/ioctl/ioctl-number.txt index b880ce5dbd33..b880ce5dbd33 100644 --- a/Documentation/ioctl-number.txt +++ b/Documentation/ioctl/ioctl-number.txt | |||
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index c86c07459712..e0f346d201ed 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
@@ -198,59 +198,42 @@ and is between 256 and 4096 characters. It is defined in the file | |||
198 | that require a timer override, but don't have | 198 | that require a timer override, but don't have |
199 | HPET | 199 | HPET |
200 | 200 | ||
201 | acpi.debug_layer= [HW,ACPI] | 201 | acpi_backlight= [HW,ACPI] |
202 | acpi_backlight=vendor | ||
203 | acpi_backlight=video | ||
204 | If set to vendor, prefer vendor specific driver | ||
205 | (e.g. thinkpad_acpi, sony_acpi, etc.) instead | ||
206 | of the ACPI video.ko driver. | ||
207 | |||
208 | acpi_display_output= [HW,ACPI] | ||
209 | acpi_display_output=vendor | ||
210 | acpi_display_output=video | ||
211 | See above. | ||
212 | |||
213 | acpi.debug_layer= [HW,ACPI,ACPI_DEBUG] | ||
214 | acpi.debug_level= [HW,ACPI,ACPI_DEBUG] | ||
202 | Format: <int> | 215 | Format: <int> |
203 | Each bit of the <int> indicates an ACPI debug layer, | 216 | CONFIG_ACPI_DEBUG must be enabled to produce any ACPI |
204 | 1: enable, 0: disable. It is useful for boot time | 217 | debug output. Bits in debug_layer correspond to a |
205 | debugging. After system has booted up, it can be set | 218 | _COMPONENT in an ACPI source file, e.g., |
206 | via /sys/module/acpi/parameters/debug_layer. | 219 | #define _COMPONENT ACPI_PCI_COMPONENT |
207 | CONFIG_ACPI_DEBUG must be enabled for this to produce any output. | 220 | Bits in debug_level correspond to a level in |
208 | Available bits (add the numbers together) to enable debug output | 221 | ACPI_DEBUG_PRINT statements, e.g., |
209 | for specific parts of the ACPI subsystem: | 222 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, ... |
210 | 0x01 utilities 0x02 hardware 0x04 events 0x08 tables | 223 | See Documentation/acpi/debug.txt for more information |
211 | 0x10 namespace 0x20 parser 0x40 dispatcher | 224 | about debug layers and levels. |
212 | 0x80 executer 0x100 resources 0x200 acpica debugger | 225 | |
213 | 0x400 os services 0x800 acpica disassembler. | 226 | Enable AML "Debug" output, i.e., stores to the Debug |
214 | The number can be in decimal or prefixed with 0x in hex. | 227 | object while interpreting AML: |
215 | Warning: Many of these options can produce a lot of | 228 | acpi.debug_layer=0xffffffff acpi.debug_level=0x2 |
216 | output and make your system unusable. Be very careful. | 229 | Enable PCI/PCI interrupt routing info messages: |
217 | 230 | acpi.debug_layer=0x400000 acpi.debug_level=0x4 | |
218 | acpi.debug_level= [HW,ACPI] | 231 | Enable all messages related to ACPI hardware: |
219 | Format: <int> | 232 | acpi.debug_layer=0x2 acpi.debug_level=0xffffffff |
220 | Each bit of the <int> indicates an ACPI debug level, | 233 | |
221 | which corresponds to the level in an ACPI_DEBUG_PRINT | 234 | Some values produce so much output that the system is |
222 | statement. After system has booted up, this mask | 235 | unusable. The "log_buf_len" parameter may be useful |
223 | can be set via /sys/module/acpi/parameters/debug_level. | 236 | if you need to capture more output. |
224 | |||
225 | CONFIG_ACPI_DEBUG must be enabled for this to produce | ||
226 | any output. The number can be in decimal or prefixed | ||
227 | with 0x in hex. Some of these options produce so much | ||
228 | output that the system is unusable. | ||
229 | |||
230 | The following global components are defined by the | ||
231 | ACPI CA: | ||
232 | 0x01 error | ||
233 | 0x02 warn | ||
234 | 0x04 init | ||
235 | 0x08 debug object | ||
236 | 0x10 info | ||
237 | 0x20 init names | ||
238 | 0x40 parse | ||
239 | 0x80 load | ||
240 | 0x100 dispatch | ||
241 | 0x200 execute | ||
242 | 0x400 names | ||
243 | 0x800 operation region | ||
244 | 0x1000 bfield | ||
245 | 0x2000 tables | ||
246 | 0x4000 values | ||
247 | 0x8000 objects | ||
248 | 0x10000 resources | ||
249 | 0x20000 user requests | ||
250 | 0x40000 package | ||
251 | The number can be in decimal or prefixed with 0x in hex. | ||
252 | Warning: Many of these options can produce a lot of | ||
253 | output and make your system unusable. Be very careful. | ||
254 | 237 | ||
255 | acpi.power_nocheck= [HW,ACPI] | 238 | acpi.power_nocheck= [HW,ACPI] |
256 | Format: 1/0 enable/disable the check of power state. | 239 | Format: 1/0 enable/disable the check of power state. |
@@ -311,7 +294,9 @@ and is between 256 and 4096 characters. It is defined in the file | |||
311 | Possible values are: | 294 | Possible values are: |
312 | isolate - enable device isolation (each device, as far | 295 | isolate - enable device isolation (each device, as far |
313 | as possible, will get its own protection | 296 | as possible, will get its own protection |
314 | domain) | 297 | domain) [default] |
298 | share - put every device behind one IOMMU into the | ||
299 | same protection domain | ||
315 | fullflush - enable flushing of IO/TLB entries when | 300 | fullflush - enable flushing of IO/TLB entries when |
316 | they are unmapped. Otherwise they are | 301 | they are unmapped. Otherwise they are |
317 | flushed before they will be reused, which | 302 | flushed before they will be reused, which |
@@ -646,7 +631,7 @@ and is between 256 and 4096 characters. It is defined in the file | |||
646 | 631 | ||
647 | digiepca= [HW,SERIAL] | 632 | digiepca= [HW,SERIAL] |
648 | See drivers/char/README.epca and | 633 | See drivers/char/README.epca and |
649 | Documentation/digiepca.txt. | 634 | Documentation/serial/digiepca.txt. |
650 | 635 | ||
651 | disable_mtrr_cleanup [X86] | 636 | disable_mtrr_cleanup [X86] |
652 | enable_mtrr_cleanup [X86] | 637 | enable_mtrr_cleanup [X86] |
@@ -757,7 +742,7 @@ and is between 256 and 4096 characters. It is defined in the file | |||
757 | See header of drivers/scsi/fdomain.c. | 742 | See header of drivers/scsi/fdomain.c. |
758 | 743 | ||
759 | floppy= [HW] | 744 | floppy= [HW] |
760 | See Documentation/floppy.txt. | 745 | See Documentation/blockdev/floppy.txt. |
761 | 746 | ||
762 | force_pal_cache_flush | 747 | force_pal_cache_flush |
763 | [IA-64] Avoid check_sal_cache_flush which may hang on | 748 | [IA-64] Avoid check_sal_cache_flush which may hang on |
@@ -1118,7 +1103,7 @@ and is between 256 and 4096 characters. It is defined in the file | |||
1118 | the same attribute, the last one is used. | 1103 | the same attribute, the last one is used. |
1119 | 1104 | ||
1120 | load_ramdisk= [RAM] List of ramdisks to load from floppy | 1105 | load_ramdisk= [RAM] List of ramdisks to load from floppy |
1121 | See Documentation/ramdisk.txt. | 1106 | See Documentation/blockdev/ramdisk.txt. |
1122 | 1107 | ||
1123 | lockd.nlm_grace_period=P [NFS] Assign grace period. | 1108 | lockd.nlm_grace_period=P [NFS] Assign grace period. |
1124 | Format: <integer> | 1109 | Format: <integer> |
@@ -1210,8 +1195,8 @@ and is between 256 and 4096 characters. It is defined in the file | |||
1210 | it is equivalent to "nosmp", which also disables | 1195 | it is equivalent to "nosmp", which also disables |
1211 | the IO APIC. | 1196 | the IO APIC. |
1212 | 1197 | ||
1213 | max_addr=[KMG] [KNL,BOOT,ia64] All physical memory greater than or | 1198 | max_addr=nn[KMG] [KNL,BOOT,ia64] All physical memory greater than |
1214 | equal to this physical address is ignored. | 1199 | or equal to this physical address is ignored. |
1215 | 1200 | ||
1216 | max_luns= [SCSI] Maximum number of LUNs to probe. | 1201 | max_luns= [SCSI] Maximum number of LUNs to probe. |
1217 | Should be between 1 and 2^32-1. | 1202 | Should be between 1 and 2^32-1. |
@@ -1311,6 +1296,9 @@ and is between 256 and 4096 characters. It is defined in the file | |||
1311 | 1296 | ||
1312 | mga= [HW,DRM] | 1297 | mga= [HW,DRM] |
1313 | 1298 | ||
1299 | min_addr=nn[KMG] [KNL,BOOT,ia64] All physical memory below this | ||
1300 | physical address is ignored. | ||
1301 | |||
1314 | mminit_loglevel= | 1302 | mminit_loglevel= |
1315 | [KNL] When CONFIG_DEBUG_MEMORY_INIT is set, this | 1303 | [KNL] When CONFIG_DEBUG_MEMORY_INIT is set, this |
1316 | parameter allows control of the logging verbosity for | 1304 | parameter allows control of the logging verbosity for |
@@ -1613,7 +1601,7 @@ and is between 256 and 4096 characters. It is defined in the file | |||
1613 | 1601 | ||
1614 | pcd. [PARIDE] | 1602 | pcd. [PARIDE] |
1615 | See header of drivers/block/paride/pcd.c. | 1603 | See header of drivers/block/paride/pcd.c. |
1616 | See also Documentation/paride.txt. | 1604 | See also Documentation/blockdev/paride.txt. |
1617 | 1605 | ||
1618 | pci=option[,option...] [PCI] various PCI subsystem options: | 1606 | pci=option[,option...] [PCI] various PCI subsystem options: |
1619 | off [X86] don't probe for the PCI bus | 1607 | off [X86] don't probe for the PCI bus |
@@ -1714,7 +1702,7 @@ and is between 256 and 4096 characters. It is defined in the file | |||
1714 | pcmv= [HW,PCMCIA] BadgePAD 4 | 1702 | pcmv= [HW,PCMCIA] BadgePAD 4 |
1715 | 1703 | ||
1716 | pd. [PARIDE] | 1704 | pd. [PARIDE] |
1717 | See Documentation/paride.txt. | 1705 | See Documentation/blockdev/paride.txt. |
1718 | 1706 | ||
1719 | pdcchassis= [PARISC,HW] Disable/Enable PDC Chassis Status codes at | 1707 | pdcchassis= [PARISC,HW] Disable/Enable PDC Chassis Status codes at |
1720 | boot time. | 1708 | boot time. |
@@ -1722,10 +1710,10 @@ and is between 256 and 4096 characters. It is defined in the file | |||
1722 | See arch/parisc/kernel/pdc_chassis.c | 1710 | See arch/parisc/kernel/pdc_chassis.c |
1723 | 1711 | ||
1724 | pf. [PARIDE] | 1712 | pf. [PARIDE] |
1725 | See Documentation/paride.txt. | 1713 | See Documentation/blockdev/paride.txt. |
1726 | 1714 | ||
1727 | pg. [PARIDE] | 1715 | pg. [PARIDE] |
1728 | See Documentation/paride.txt. | 1716 | See Documentation/blockdev/paride.txt. |
1729 | 1717 | ||
1730 | pirq= [SMP,APIC] Manual mp-table setup | 1718 | pirq= [SMP,APIC] Manual mp-table setup |
1731 | See Documentation/x86/i386/IO-APIC.txt. | 1719 | See Documentation/x86/i386/IO-APIC.txt. |
@@ -1795,7 +1783,7 @@ and is between 256 and 4096 characters. It is defined in the file | |||
1795 | 1783 | ||
1796 | prompt_ramdisk= [RAM] List of RAM disks to prompt for floppy disk | 1784 | prompt_ramdisk= [RAM] List of RAM disks to prompt for floppy disk |
1797 | before loading. | 1785 | before loading. |
1798 | See Documentation/ramdisk.txt. | 1786 | See Documentation/blockdev/ramdisk.txt. |
1799 | 1787 | ||
1800 | psmouse.proto= [HW,MOUSE] Highest PS2 mouse protocol extension to | 1788 | psmouse.proto= [HW,MOUSE] Highest PS2 mouse protocol extension to |
1801 | probe for; one of (bare|imps|exps|lifebook|any). | 1789 | probe for; one of (bare|imps|exps|lifebook|any). |
@@ -1815,7 +1803,7 @@ and is between 256 and 4096 characters. It is defined in the file | |||
1815 | <io>,<mss_io>,<mss_irq>,<mss_dma>,<mpu_io>,<mpu_irq> | 1803 | <io>,<mss_io>,<mss_irq>,<mss_dma>,<mpu_io>,<mpu_irq> |
1816 | 1804 | ||
1817 | pt. [PARIDE] | 1805 | pt. [PARIDE] |
1818 | See Documentation/paride.txt. | 1806 | See Documentation/blockdev/paride.txt. |
1819 | 1807 | ||
1820 | pty.legacy_count= | 1808 | pty.legacy_count= |
1821 | [KNL] Number of legacy pty's. Overwrites compiled-in | 1809 | [KNL] Number of legacy pty's. Overwrites compiled-in |
@@ -1829,10 +1817,10 @@ and is between 256 and 4096 characters. It is defined in the file | |||
1829 | See Documentation/md.txt. | 1817 | See Documentation/md.txt. |
1830 | 1818 | ||
1831 | ramdisk_blocksize= [RAM] | 1819 | ramdisk_blocksize= [RAM] |
1832 | See Documentation/ramdisk.txt. | 1820 | See Documentation/blockdev/ramdisk.txt. |
1833 | 1821 | ||
1834 | ramdisk_size= [RAM] Sizes of RAM disks in kilobytes | 1822 | ramdisk_size= [RAM] Sizes of RAM disks in kilobytes |
1835 | See Documentation/ramdisk.txt. | 1823 | See Documentation/blockdev/ramdisk.txt. |
1836 | 1824 | ||
1837 | rcupdate.blimit= [KNL,BOOT] | 1825 | rcupdate.blimit= [KNL,BOOT] |
1838 | Set maximum number of finished RCU callbacks to process | 1826 | Set maximum number of finished RCU callbacks to process |
@@ -2164,7 +2152,7 @@ and is between 256 and 4096 characters. It is defined in the file | |||
2164 | See Documentation/sonypi.txt | 2152 | See Documentation/sonypi.txt |
2165 | 2153 | ||
2166 | specialix= [HW,SERIAL] Specialix multi-serial port adapter | 2154 | specialix= [HW,SERIAL] Specialix multi-serial port adapter |
2167 | See Documentation/specialix.txt. | 2155 | See Documentation/serial/specialix.txt. |
2168 | 2156 | ||
2169 | spia_io_base= [HW,MTD] | 2157 | spia_io_base= [HW,MTD] |
2170 | spia_fio_base= | 2158 | spia_fio_base= |
diff --git a/Documentation/networking/phy.txt b/Documentation/networking/phy.txt index 8df6a7b0e66c..88bb71b46da4 100644 --- a/Documentation/networking/phy.txt +++ b/Documentation/networking/phy.txt | |||
@@ -96,7 +96,7 @@ Letting the PHY Abstraction Layer do Everything | |||
96 | static void adjust_link(struct net_device *dev); | 96 | static void adjust_link(struct net_device *dev); |
97 | 97 | ||
98 | Next, you need to know the device name of the PHY connected to this device. | 98 | Next, you need to know the device name of the PHY connected to this device. |
99 | The name will look something like, "phy0:0", where the first number is the | 99 | The name will look something like, "0:00", where the first number is the |
100 | bus id, and the second is the PHY's address on that bus. Typically, | 100 | bus id, and the second is the PHY's address on that bus. Typically, |
101 | the bus is responsible for making its ID unique. | 101 | the bus is responsible for making its ID unique. |
102 | 102 | ||
diff --git a/Documentation/printk-formats.txt b/Documentation/printk-formats.txt new file mode 100644 index 000000000000..1b5a5ddbc3ef --- /dev/null +++ b/Documentation/printk-formats.txt | |||
@@ -0,0 +1,35 @@ | |||
1 | If variable is of Type, use printk format specifier: | ||
2 | --------------------------------------------------------- | ||
3 | int %d or %x | ||
4 | unsigned int %u or %x | ||
5 | long %ld or %lx | ||
6 | unsigned long %lu or %lx | ||
7 | long long %lld or %llx | ||
8 | unsigned long long %llu or %llx | ||
9 | size_t %zu or %zx | ||
10 | ssize_t %zd or %zx | ||
11 | |||
12 | Raw pointer value SHOULD be printed with %p. | ||
13 | |||
14 | u64 SHOULD be printed with %llu/%llx, (unsigned long long): | ||
15 | |||
16 | printk("%llu", (unsigned long long)u64_var); | ||
17 | |||
18 | s64 SHOULD be printed with %lld/%llx, (long long): | ||
19 | |||
20 | printk("%lld", (long long)s64_var); | ||
21 | |||
22 | If <type> is dependent on a config option for its size (e.g., sector_t, | ||
23 | blkcnt_t, phys_addr_t, resource_size_t) or is architecture-dependent | ||
24 | for its size (e.g., tcflag_t), use a format specifier of its largest | ||
25 | possible type and explicitly cast to it. Example: | ||
26 | |||
27 | printk("test: sector number/total blocks: %llu/%llu\n", | ||
28 | (unsigned long long)sector, (unsigned long long)blockcount); | ||
29 | |||
30 | Reminder: sizeof() result is of type size_t. | ||
31 | |||
32 | Thank you for your cooperation and attention. | ||
33 | |||
34 | |||
35 | By Randy Dunlap <rdunlap@xenotime.net> | ||
diff --git a/Documentation/serial/00-INDEX b/Documentation/serial/00-INDEX new file mode 100644 index 000000000000..07dcdb0d2a36 --- /dev/null +++ b/Documentation/serial/00-INDEX | |||
@@ -0,0 +1,24 @@ | |||
1 | 00-INDEX | ||
2 | - this file. | ||
3 | README.cycladesZ | ||
4 | - info on Cyclades-Z firmware loading. | ||
5 | computone.txt | ||
6 | - info on Computone Intelliport II/Plus Multiport Serial Driver. | ||
7 | digiepca.txt | ||
8 | - info on Digi Intl. {PC,PCI,EISA}Xx and Xem series cards. | ||
9 | hayes-esp.txt | ||
10 | - info on using the Hayes ESP serial driver. | ||
11 | moxa-smartio | ||
12 | - file with info on installing/using Moxa multiport serial driver. | ||
13 | riscom8.txt | ||
14 | - notes on using the RISCom/8 multi-port serial driver. | ||
15 | rocket.txt | ||
16 | - info on the Comtrol RocketPort multiport serial driver. | ||
17 | specialix.txt | ||
18 | - info on hardware/driver for specialix IO8+ multiport serial card. | ||
19 | stallion.txt | ||
20 | - info on using the Stallion multiport serial driver. | ||
21 | sx.txt | ||
22 | - info on the Specialix SX/SI multiport serial driver. | ||
23 | tty.txt | ||
24 | - guide to the locking policies of the tty layer. | ||
diff --git a/Documentation/README.cycladesZ b/Documentation/serial/README.cycladesZ index 024a69443cc2..024a69443cc2 100644 --- a/Documentation/README.cycladesZ +++ b/Documentation/serial/README.cycladesZ | |||
diff --git a/Documentation/computone.txt b/Documentation/serial/computone.txt index 5e2a0c76bfa0..c57ea4781e5d 100644 --- a/Documentation/computone.txt +++ b/Documentation/serial/computone.txt | |||
@@ -247,7 +247,7 @@ shar archive to make it easier to extract the script from the documentation. | |||
247 | To create the ip2mkdev shell script change to a convenient directory (/tmp | 247 | To create the ip2mkdev shell script change to a convenient directory (/tmp |
248 | works just fine) and run the following command: | 248 | works just fine) and run the following command: |
249 | 249 | ||
250 | unshar Documentation/computone.txt | 250 | unshar Documentation/serial/computone.txt |
251 | (This file) | 251 | (This file) |
252 | 252 | ||
253 | You should now have a file ip2mkdev in your current working directory with | 253 | You should now have a file ip2mkdev in your current working directory with |
diff --git a/Documentation/digiepca.txt b/Documentation/serial/digiepca.txt index f2560e22f2c9..f2560e22f2c9 100644 --- a/Documentation/digiepca.txt +++ b/Documentation/serial/digiepca.txt | |||
diff --git a/Documentation/hayes-esp.txt b/Documentation/serial/hayes-esp.txt index 09b5d5856758..09b5d5856758 100644 --- a/Documentation/hayes-esp.txt +++ b/Documentation/serial/hayes-esp.txt | |||
diff --git a/Documentation/moxa-smartio b/Documentation/serial/moxa-smartio index 5337e80a5b96..5337e80a5b96 100644 --- a/Documentation/moxa-smartio +++ b/Documentation/serial/moxa-smartio | |||
diff --git a/Documentation/riscom8.txt b/Documentation/serial/riscom8.txt index 14f61fdad7ca..14f61fdad7ca 100644 --- a/Documentation/riscom8.txt +++ b/Documentation/serial/riscom8.txt | |||
diff --git a/Documentation/rocket.txt b/Documentation/serial/rocket.txt index 1d8582990435..1d8582990435 100644 --- a/Documentation/rocket.txt +++ b/Documentation/serial/rocket.txt | |||
diff --git a/Documentation/specialix.txt b/Documentation/serial/specialix.txt index 6eb6f3a3331c..6eb6f3a3331c 100644 --- a/Documentation/specialix.txt +++ b/Documentation/serial/specialix.txt | |||
diff --git a/Documentation/stallion.txt b/Documentation/serial/stallion.txt index 5c4902d9a5be..5c4902d9a5be 100644 --- a/Documentation/stallion.txt +++ b/Documentation/serial/stallion.txt | |||
diff --git a/Documentation/sx.txt b/Documentation/serial/sx.txt index cb4efa0fb5cc..cb4efa0fb5cc 100644 --- a/Documentation/sx.txt +++ b/Documentation/serial/sx.txt | |||
diff --git a/Documentation/tty.txt b/Documentation/serial/tty.txt index 8e65c4498c52..8e65c4498c52 100644 --- a/Documentation/tty.txt +++ b/Documentation/serial/tty.txt | |||
diff --git a/Documentation/sound/alsa/ALSA-Configuration.txt b/Documentation/sound/alsa/ALSA-Configuration.txt index e0e54a27fc10..3cd2ad958176 100644 --- a/Documentation/sound/alsa/ALSA-Configuration.txt +++ b/Documentation/sound/alsa/ALSA-Configuration.txt | |||
@@ -1072,10 +1072,13 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. | |||
1072 | ref Reference board | 1072 | ref Reference board |
1073 | dell-m4-1 Dell desktops | 1073 | dell-m4-1 Dell desktops |
1074 | dell-m4-2 Dell desktops | 1074 | dell-m4-2 Dell desktops |
1075 | dell-m4-3 Dell desktops | ||
1075 | 1076 | ||
1076 | STAC92HD73* | 1077 | STAC92HD73* |
1077 | ref Reference board | 1078 | ref Reference board |
1078 | dell-m6 Dell desktops | 1079 | dell-m6-amic Dell desktops/laptops with analog mics |
1080 | dell-m6-dmic Dell desktops/laptops with digital mics | ||
1081 | dell-m6 Dell desktops/laptops with both type of mics | ||
1079 | 1082 | ||
1080 | STAC9872 | 1083 | STAC9872 |
1081 | vaio Setup for VAIO FE550G/SZ110 | 1084 | vaio Setup for VAIO FE550G/SZ110 |
diff --git a/Documentation/spi/spi-summary b/Documentation/spi/spi-summary index 8bae2f018d34..0f5122eb282b 100644 --- a/Documentation/spi/spi-summary +++ b/Documentation/spi/spi-summary | |||
@@ -215,7 +215,7 @@ So for example arch/.../mach-*/board-*.c files might have code like: | |||
215 | /* if your mach-* infrastructure doesn't support kernels that can | 215 | /* if your mach-* infrastructure doesn't support kernels that can |
216 | * run on multiple boards, pdata wouldn't benefit from "__init". | 216 | * run on multiple boards, pdata wouldn't benefit from "__init". |
217 | */ | 217 | */ |
218 | static struct mysoc_spi_data __init pdata = { ... }; | 218 | static struct mysoc_spi_data __initdata pdata = { ... }; |
219 | 219 | ||
220 | static __init board_init(void) | 220 | static __init board_init(void) |
221 | { | 221 | { |
diff --git a/Documentation/tracers/mmiotrace.txt b/Documentation/tracers/mmiotrace.txt index 5bbbe2096223..cde23b4a12a1 100644 --- a/Documentation/tracers/mmiotrace.txt +++ b/Documentation/tracers/mmiotrace.txt | |||
@@ -37,7 +37,7 @@ $ echo mmiotrace > /debug/tracing/current_tracer | |||
37 | $ cat /debug/tracing/trace_pipe > mydump.txt & | 37 | $ cat /debug/tracing/trace_pipe > mydump.txt & |
38 | Start X or whatever. | 38 | Start X or whatever. |
39 | $ echo "X is up" > /debug/tracing/trace_marker | 39 | $ echo "X is up" > /debug/tracing/trace_marker |
40 | $ echo none > /debug/tracing/current_tracer | 40 | $ echo nop > /debug/tracing/current_tracer |
41 | Check for lost events. | 41 | Check for lost events. |
42 | 42 | ||
43 | 43 | ||
@@ -66,7 +66,7 @@ which action. It is recommended to place descriptive markers about what you | |||
66 | do. | 66 | do. |
67 | 67 | ||
68 | Shut down mmiotrace (requires root privileges): | 68 | Shut down mmiotrace (requires root privileges): |
69 | $ echo none > /debug/tracing/current_tracer | 69 | $ echo nop > /debug/tracing/current_tracer |
70 | The 'cat' process exits. If it does not, kill it by issuing 'fg' command and | 70 | The 'cat' process exits. If it does not, kill it by issuing 'fg' command and |
71 | pressing ctrl+c. | 71 | pressing ctrl+c. |
72 | 72 | ||
@@ -81,7 +81,9 @@ are: | |||
81 | $ cat /debug/tracing/trace_entries | 81 | $ cat /debug/tracing/trace_entries |
82 | gives you a number. Approximately double this number and write it back, for | 82 | gives you a number. Approximately double this number and write it back, for |
83 | instance: | 83 | instance: |
84 | $ echo 0 > /debug/tracing/tracing_enabled | ||
84 | $ echo 128000 > /debug/tracing/trace_entries | 85 | $ echo 128000 > /debug/tracing/trace_entries |
86 | $ echo 1 > /debug/tracing/tracing_enabled | ||
85 | Then start again from the top. | 87 | Then start again from the top. |
86 | 88 | ||
87 | If you are doing a trace for a driver project, e.g. Nouveau, you should also | 89 | If you are doing a trace for a driver project, e.g. Nouveau, you should also |
diff --git a/Documentation/w1/masters/omap-hdq b/Documentation/w1/masters/omap-hdq new file mode 100644 index 000000000000..ca722e09b6a1 --- /dev/null +++ b/Documentation/w1/masters/omap-hdq | |||
@@ -0,0 +1,46 @@ | |||
1 | Kernel driver for omap HDQ/1-wire module. | ||
2 | ======================================== | ||
3 | |||
4 | Supported chips: | ||
5 | ================ | ||
6 | HDQ/1-wire controller on the TI OMAP 2430/3430 platforms. | ||
7 | |||
8 | A useful link about HDQ basics: | ||
9 | =============================== | ||
10 | http://focus.ti.com/lit/an/slua408/slua408.pdf | ||
11 | |||
12 | Description: | ||
13 | ============ | ||
14 | The HDQ/1-Wire module of TI OMAP2430/3430 platforms implement the hardware | ||
15 | protocol of the master functions of the Benchmark HDQ and the Dallas | ||
16 | Semiconductor 1-Wire protocols. These protocols use a single wire for | ||
17 | communication between the master (HDQ/1-Wire controller) and the slave | ||
18 | (HDQ/1-Wire external compliant device). | ||
19 | |||
20 | A typical application of the HDQ/1-Wire module is the communication with battery | ||
21 | monitor (gas gauge) integrated circuits. | ||
22 | |||
23 | The controller supports operation in both HDQ and 1-wire mode. The essential | ||
24 | difference between the HDQ and 1-wire mode is how the slave device responds to | ||
25 | initialization pulse.In HDQ mode, the firmware does not require the host to | ||
26 | create an initialization pulse to the slave.However, the slave can be reset by | ||
27 | using an initialization pulse (also referred to as a break pulse).The slave | ||
28 | does not respond with a presence pulse as it does in the 1-Wire protocol. | ||
29 | |||
30 | Remarks: | ||
31 | ======== | ||
32 | The driver (drivers/w1/masters/omap_hdq.c) supports the HDQ mode of the | ||
33 | controller. In this mode, as we can not read the ID which obeys the W1 | ||
34 | spec(family:id:crc), a module parameter can be passed to the driver which will | ||
35 | be used to calculate the CRC and pass back an appropriate slave ID to the W1 | ||
36 | core. | ||
37 | |||
38 | By default the master driver and the BQ slave i/f | ||
39 | driver(drivers/w1/slaves/w1_bq27000.c) sets the ID to 1. | ||
40 | Please note to load both the modules with a different ID if required, but note | ||
41 | that the ID used should be same for both master and slave driver loading. | ||
42 | |||
43 | e.g: | ||
44 | insmod omap_hdq.ko W1_ID=2 | ||
45 | inamod w1_bq27000.ko F_ID=2 | ||
46 | |||
diff --git a/MAINTAINERS b/MAINTAINERS index 53e78c83cc7a..618c1ef4a397 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -1809,7 +1809,7 @@ S: Maintained | |||
1809 | 1809 | ||
1810 | FTRACE | 1810 | FTRACE |
1811 | P: Steven Rostedt | 1811 | P: Steven Rostedt |
1812 | M: srostedt@redhat.com | 1812 | M: rostedt@goodmis.org |
1813 | S: Maintained | 1813 | S: Maintained |
1814 | 1814 | ||
1815 | FUJITSU FR-V (FRV) PORT | 1815 | FUJITSU FR-V (FRV) PORT |
@@ -2216,6 +2216,13 @@ M: adaplas@gmail.com | |||
2216 | L: linux-fbdev-devel@lists.sourceforge.net (moderated for non-subscribers) | 2216 | L: linux-fbdev-devel@lists.sourceforge.net (moderated for non-subscribers) |
2217 | S: Maintained | 2217 | S: Maintained |
2218 | 2218 | ||
2219 | INTEL MENLOW THERMAL DRIVER | ||
2220 | P: Sujith Thomas | ||
2221 | M: sujith.thomas@intel.com | ||
2222 | L: linux-acpi@vger.kernel.org | ||
2223 | W: http://www.lesswatts.org/projects/acpi/ | ||
2224 | S: Supported | ||
2225 | |||
2219 | INTEL IA32 MICROCODE UPDATE SUPPORT | 2226 | INTEL IA32 MICROCODE UPDATE SUPPORT |
2220 | P: Tigran Aivazian | 2227 | P: Tigran Aivazian |
2221 | M: tigran@aivazian.fsnet.co.uk | 2228 | M: tigran@aivazian.fsnet.co.uk |
@@ -2696,6 +2703,11 @@ P: Arnaldo Carvalho de Melo | |||
2696 | M: acme@ghostprotocols.net | 2703 | M: acme@ghostprotocols.net |
2697 | S: Maintained | 2704 | S: Maintained |
2698 | 2705 | ||
2706 | LIS3LV02D ACCELEROMETER DRIVER | ||
2707 | P: Eric Piel | ||
2708 | M: eric.piel@tremplin-utc.net | ||
2709 | S: Maintained | ||
2710 | |||
2699 | LM83 HARDWARE MONITOR DRIVER | 2711 | LM83 HARDWARE MONITOR DRIVER |
2700 | P: Jean Delvare | 2712 | P: Jean Delvare |
2701 | M: khali@linux-fr.org | 2713 | M: khali@linux-fr.org |
@@ -3377,7 +3389,9 @@ S: Maintained | |||
3377 | 3389 | ||
3378 | PNP SUPPORT | 3390 | PNP SUPPORT |
3379 | P: Adam Belay | 3391 | P: Adam Belay |
3380 | M: ambx1@neo.rr.com | 3392 | M: abelay@mit.edu |
3393 | P: Bjorn Helgaas | ||
3394 | M: bjorn.helgaas@hp.com | ||
3381 | S: Maintained | 3395 | S: Maintained |
3382 | 3396 | ||
3383 | PNXxxxx I2C DRIVER | 3397 | PNXxxxx I2C DRIVER |
@@ -3914,8 +3928,6 @@ M: bootc@bootc.net | |||
3914 | S: Maintained | 3928 | S: Maintained |
3915 | 3929 | ||
3916 | SOFTWARE RAID (Multiple Disks) SUPPORT | 3930 | SOFTWARE RAID (Multiple Disks) SUPPORT |
3917 | P: Ingo Molnar | ||
3918 | M: mingo@redhat.com | ||
3919 | P: Neil Brown | 3931 | P: Neil Brown |
3920 | M: neilb@suse.de | 3932 | M: neilb@suse.de |
3921 | L: linux-raid@vger.kernel.org | 3933 | L: linux-raid@vger.kernel.org |
@@ -1,8 +1,8 @@ | |||
1 | VERSION = 2 | 1 | VERSION = 2 |
2 | PATCHLEVEL = 6 | 2 | PATCHLEVEL = 6 |
3 | SUBLEVEL = 28 | 3 | SUBLEVEL = 28 |
4 | EXTRAVERSION = -rc4 | 4 | EXTRAVERSION = -rc7 |
5 | NAME = Killer Bat of Doom | 5 | NAME = Erotic Pickled Herring |
6 | 6 | ||
7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
8 | # To see a list of typical targets execute "make help" | 8 | # To see a list of typical targets execute "make help" |
diff --git a/arch/Kconfig b/arch/Kconfig index 8977d99987cb..471e72dbaf8b 100644 --- a/arch/Kconfig +++ b/arch/Kconfig | |||
@@ -79,8 +79,6 @@ config HAVE_KRETPROBES | |||
79 | # task_pt_regs() in asm/processor.h or asm/ptrace.h | 79 | # task_pt_regs() in asm/processor.h or asm/ptrace.h |
80 | # arch_has_single_step() if there is hardware single-step support | 80 | # arch_has_single_step() if there is hardware single-step support |
81 | # arch_has_block_step() if there is hardware block-step support | 81 | # arch_has_block_step() if there is hardware block-step support |
82 | # arch_ptrace() and not #define __ARCH_SYS_PTRACE | ||
83 | # compat_arch_ptrace() and #define __ARCH_WANT_COMPAT_SYS_PTRACE | ||
84 | # asm/syscall.h supplying asm-generic/syscall.h interface | 82 | # asm/syscall.h supplying asm-generic/syscall.h interface |
85 | # linux/regset.h user_regset interfaces | 83 | # linux/regset.h user_regset interfaces |
86 | # CORE_DUMP_USE_REGSET #define'd in linux/elf.h | 84 | # CORE_DUMP_USE_REGSET #define'd in linux/elf.h |
diff --git a/arch/alpha/kernel/pci.c b/arch/alpha/kernel/pci.c index 5cf45fc51343..ff8cb638472e 100644 --- a/arch/alpha/kernel/pci.c +++ b/arch/alpha/kernel/pci.c | |||
@@ -338,7 +338,7 @@ common_swizzle(struct pci_dev *dev, u8 *pinp) | |||
338 | return PCI_SLOT(dev->devfn); | 338 | return PCI_SLOT(dev->devfn); |
339 | } | 339 | } |
340 | 340 | ||
341 | void __devinit | 341 | void |
342 | pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, | 342 | pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, |
343 | struct resource *res) | 343 | struct resource *res) |
344 | { | 344 | { |
diff --git a/arch/alpha/kernel/smp.c b/arch/alpha/kernel/smp.c index e657c45d91d2..cf7da10097bb 100644 --- a/arch/alpha/kernel/smp.c +++ b/arch/alpha/kernel/smp.c | |||
@@ -121,7 +121,7 @@ wait_boot_cpu_to_stop(int cpuid) | |||
121 | /* | 121 | /* |
122 | * Where secondaries begin a life of C. | 122 | * Where secondaries begin a life of C. |
123 | */ | 123 | */ |
124 | void __init | 124 | void __cpuinit |
125 | smp_callin(void) | 125 | smp_callin(void) |
126 | { | 126 | { |
127 | int cpuid = hard_smp_processor_id(); | 127 | int cpuid = hard_smp_processor_id(); |
@@ -198,7 +198,7 @@ wait_for_txrdy (unsigned long cpumask) | |||
198 | * Send a message to a secondary's console. "START" is one such | 198 | * Send a message to a secondary's console. "START" is one such |
199 | * interesting message. ;-) | 199 | * interesting message. ;-) |
200 | */ | 200 | */ |
201 | static void __init | 201 | static void __cpuinit |
202 | send_secondary_console_msg(char *str, int cpuid) | 202 | send_secondary_console_msg(char *str, int cpuid) |
203 | { | 203 | { |
204 | struct percpu_struct *cpu; | 204 | struct percpu_struct *cpu; |
@@ -289,7 +289,7 @@ recv_secondary_console_msg(void) | |||
289 | /* | 289 | /* |
290 | * Convince the console to have a secondary cpu begin execution. | 290 | * Convince the console to have a secondary cpu begin execution. |
291 | */ | 291 | */ |
292 | static int __init | 292 | static int __cpuinit |
293 | secondary_cpu_start(int cpuid, struct task_struct *idle) | 293 | secondary_cpu_start(int cpuid, struct task_struct *idle) |
294 | { | 294 | { |
295 | struct percpu_struct *cpu; | 295 | struct percpu_struct *cpu; |
diff --git a/arch/alpha/kernel/traps.c b/arch/alpha/kernel/traps.c index c778779007fc..cefc5a355ef9 100644 --- a/arch/alpha/kernel/traps.c +++ b/arch/alpha/kernel/traps.c | |||
@@ -31,7 +31,7 @@ | |||
31 | 31 | ||
32 | static int opDEC_fix; | 32 | static int opDEC_fix; |
33 | 33 | ||
34 | static void __init | 34 | static void __cpuinit |
35 | opDEC_check(void) | 35 | opDEC_check(void) |
36 | { | 36 | { |
37 | __asm__ __volatile__ ( | 37 | __asm__ __volatile__ ( |
@@ -1072,7 +1072,7 @@ give_sigbus: | |||
1072 | return; | 1072 | return; |
1073 | } | 1073 | } |
1074 | 1074 | ||
1075 | void __init | 1075 | void __cpuinit |
1076 | trap_init(void) | 1076 | trap_init(void) |
1077 | { | 1077 | { |
1078 | /* Tell PAL-code what global pointer we want in the kernel. */ | 1078 | /* Tell PAL-code what global pointer we want in the kernel. */ |
diff --git a/arch/arm/configs/corgi_defconfig b/arch/arm/configs/corgi_defconfig index f3af0b593eb0..98765438048d 100644 --- a/arch/arm/configs/corgi_defconfig +++ b/arch/arm/configs/corgi_defconfig | |||
@@ -179,7 +179,7 @@ CONFIG_MACH_HUSKY=y | |||
179 | # CONFIG_MACH_AKITA is not set | 179 | # CONFIG_MACH_AKITA is not set |
180 | # CONFIG_MACH_SPITZ is not set | 180 | # CONFIG_MACH_SPITZ is not set |
181 | # CONFIG_MACH_BORZOI is not set | 181 | # CONFIG_MACH_BORZOI is not set |
182 | CONFIG_MACH_TOSA=y | 182 | # CONFIG_MACH_TOSA is not set |
183 | # CONFIG_ARCH_VIPER is not set | 183 | # CONFIG_ARCH_VIPER is not set |
184 | # CONFIG_ARCH_PXA_ESERIES is not set | 184 | # CONFIG_ARCH_PXA_ESERIES is not set |
185 | # CONFIG_TRIZEPS_PXA is not set | 185 | # CONFIG_TRIZEPS_PXA is not set |
diff --git a/arch/arm/include/asm/dma-mapping.h b/arch/arm/include/asm/dma-mapping.h index 1cb8602dd9d5..4ed149cbb32a 100644 --- a/arch/arm/include/asm/dma-mapping.h +++ b/arch/arm/include/asm/dma-mapping.h | |||
@@ -256,8 +256,17 @@ int dmabounce_sync_for_cpu(struct device *, dma_addr_t, unsigned long, | |||
256 | int dmabounce_sync_for_device(struct device *, dma_addr_t, unsigned long, | 256 | int dmabounce_sync_for_device(struct device *, dma_addr_t, unsigned long, |
257 | size_t, enum dma_data_direction); | 257 | size_t, enum dma_data_direction); |
258 | #else | 258 | #else |
259 | #define dmabounce_sync_for_cpu(dev,dma,off,sz,dir) (1) | 259 | static inline int dmabounce_sync_for_cpu(struct device *d, dma_addr_t addr, |
260 | #define dmabounce_sync_for_device(dev,dma,off,sz,dir) (1) | 260 | unsigned long offset, size_t size, enum dma_data_direction dir) |
261 | { | ||
262 | return 1; | ||
263 | } | ||
264 | |||
265 | static inline int dmabounce_sync_for_device(struct device *d, dma_addr_t addr, | ||
266 | unsigned long offset, size_t size, enum dma_data_direction dir) | ||
267 | { | ||
268 | return 1; | ||
269 | } | ||
261 | 270 | ||
262 | 271 | ||
263 | /** | 272 | /** |
diff --git a/arch/arm/include/asm/hardware/iop3xx-adma.h b/arch/arm/include/asm/hardware/iop3xx-adma.h index 87bff09633aa..83e6ba338e2c 100644 --- a/arch/arm/include/asm/hardware/iop3xx-adma.h +++ b/arch/arm/include/asm/hardware/iop3xx-adma.h | |||
@@ -730,7 +730,8 @@ static inline void iop_desc_set_next_desc(struct iop_adma_desc_slot *desc, | |||
730 | { | 730 | { |
731 | /* hw_desc->next_desc is the same location for all channels */ | 731 | /* hw_desc->next_desc is the same location for all channels */ |
732 | union iop3xx_desc hw_desc = { .ptr = desc->hw_desc, }; | 732 | union iop3xx_desc hw_desc = { .ptr = desc->hw_desc, }; |
733 | BUG_ON(hw_desc.dma->next_desc); | 733 | |
734 | iop_paranoia(hw_desc.dma->next_desc); | ||
734 | hw_desc.dma->next_desc = next_desc_addr; | 735 | hw_desc.dma->next_desc = next_desc_addr; |
735 | } | 736 | } |
736 | 737 | ||
@@ -760,7 +761,7 @@ static inline int iop_desc_get_zero_result(struct iop_adma_desc_slot *desc) | |||
760 | struct iop3xx_desc_aau *hw_desc = desc->hw_desc; | 761 | struct iop3xx_desc_aau *hw_desc = desc->hw_desc; |
761 | struct iop3xx_aau_desc_ctrl desc_ctrl = hw_desc->desc_ctrl_field; | 762 | struct iop3xx_aau_desc_ctrl desc_ctrl = hw_desc->desc_ctrl_field; |
762 | 763 | ||
763 | BUG_ON(!(desc_ctrl.tx_complete && desc_ctrl.zero_result_en)); | 764 | iop_paranoia(!(desc_ctrl.tx_complete && desc_ctrl.zero_result_en)); |
764 | return desc_ctrl.zero_result_err; | 765 | return desc_ctrl.zero_result_err; |
765 | } | 766 | } |
766 | 767 | ||
diff --git a/arch/arm/include/asm/hardware/iop_adma.h b/arch/arm/include/asm/hardware/iop_adma.h index cb7e3611bcba..385c6e8cbbd2 100644 --- a/arch/arm/include/asm/hardware/iop_adma.h +++ b/arch/arm/include/asm/hardware/iop_adma.h | |||
@@ -23,6 +23,12 @@ | |||
23 | 23 | ||
24 | #define IOP_ADMA_SLOT_SIZE 32 | 24 | #define IOP_ADMA_SLOT_SIZE 32 |
25 | #define IOP_ADMA_THRESHOLD 4 | 25 | #define IOP_ADMA_THRESHOLD 4 |
26 | #ifdef DEBUG | ||
27 | #define IOP_PARANOIA 1 | ||
28 | #else | ||
29 | #define IOP_PARANOIA 0 | ||
30 | #endif | ||
31 | #define iop_paranoia(x) BUG_ON(IOP_PARANOIA && (x)) | ||
26 | 32 | ||
27 | /** | 33 | /** |
28 | * struct iop_adma_device - internal representation of an ADMA device | 34 | * struct iop_adma_device - internal representation of an ADMA device |
diff --git a/arch/arm/include/asm/mach/map.h b/arch/arm/include/asm/mach/map.h index cb1139ac1943..39d949b63e80 100644 --- a/arch/arm/include/asm/mach/map.h +++ b/arch/arm/include/asm/mach/map.h | |||
@@ -19,12 +19,13 @@ struct map_desc { | |||
19 | }; | 19 | }; |
20 | 20 | ||
21 | /* types 0-3 are defined in asm/io.h */ | 21 | /* types 0-3 are defined in asm/io.h */ |
22 | #define MT_CACHECLEAN 4 | 22 | #define MT_UNCACHED 4 |
23 | #define MT_MINICLEAN 5 | 23 | #define MT_CACHECLEAN 5 |
24 | #define MT_LOW_VECTORS 6 | 24 | #define MT_MINICLEAN 6 |
25 | #define MT_HIGH_VECTORS 7 | 25 | #define MT_LOW_VECTORS 7 |
26 | #define MT_MEMORY 8 | 26 | #define MT_HIGH_VECTORS 8 |
27 | #define MT_ROM 9 | 27 | #define MT_MEMORY 9 |
28 | #define MT_ROM 10 | ||
28 | 29 | ||
29 | #ifdef CONFIG_MMU | 30 | #ifdef CONFIG_MMU |
30 | extern void iotable_init(struct map_desc *, int); | 31 | extern void iotable_init(struct map_desc *, int); |
diff --git a/arch/arm/mach-clps711x/include/mach/hardware.h b/arch/arm/mach-clps711x/include/mach/hardware.h index 4c3e101b96c9..b3ebe9e4871f 100644 --- a/arch/arm/mach-clps711x/include/mach/hardware.h +++ b/arch/arm/mach-clps711x/include/mach/hardware.h | |||
@@ -94,20 +94,6 @@ | |||
94 | #include <asm/hardware/ep7212.h> | 94 | #include <asm/hardware/ep7212.h> |
95 | #include <asm/hardware/cs89712.h> | 95 | #include <asm/hardware/cs89712.h> |
96 | 96 | ||
97 | /* dynamic ioremap() areas */ | ||
98 | #define FLASH_START 0x00000000 | ||
99 | #define FLASH_SIZE 0x800000 | ||
100 | #define FLASH_WIDTH 4 | ||
101 | |||
102 | #define SRAM_START 0x60000000 | ||
103 | #define SRAM_SIZE 0xc000 | ||
104 | #define SRAM_WIDTH 4 | ||
105 | |||
106 | #define BOOTROM_START 0x70000000 | ||
107 | #define BOOTROM_SIZE 0x80 | ||
108 | #define BOOTROM_WIDTH 4 | ||
109 | |||
110 | |||
111 | /* static cdb89712_map_io() areas */ | 97 | /* static cdb89712_map_io() areas */ |
112 | #define REGISTER_START 0x80000000 | 98 | #define REGISTER_START 0x80000000 |
113 | #define REGISTER_SIZE 0x4000 | 99 | #define REGISTER_SIZE 0x4000 |
@@ -198,14 +184,6 @@ | |||
198 | #define CEIVA_FLASH_SIZE 0x100000 | 184 | #define CEIVA_FLASH_SIZE 0x100000 |
199 | #define CEIVA_FLASH_WIDTH 2 | 185 | #define CEIVA_FLASH_WIDTH 2 |
200 | 186 | ||
201 | #define SRAM_START 0x60000000 | ||
202 | #define SRAM_SIZE 0xc000 | ||
203 | #define SRAM_WIDTH 4 | ||
204 | |||
205 | #define BOOTROM_START 0x70000000 | ||
206 | #define BOOTROM_SIZE 0x80 | ||
207 | #define BOOTROM_WIDTH 4 | ||
208 | |||
209 | /* | 187 | /* |
210 | * SED1355 LCD controller | 188 | * SED1355 LCD controller |
211 | */ | 189 | */ |
diff --git a/arch/arm/mach-clps7500/core.c b/arch/arm/mach-clps7500/core.c index c3a33b8a5aac..7e247c04d41c 100644 --- a/arch/arm/mach-clps7500/core.c +++ b/arch/arm/mach-clps7500/core.c | |||
@@ -275,9 +275,9 @@ static struct map_desc cl7500_io_desc[] __initdata = { | |||
275 | .length = ISA_SIZE, | 275 | .length = ISA_SIZE, |
276 | .type = MT_DEVICE | 276 | .type = MT_DEVICE |
277 | }, { /* Flash */ | 277 | }, { /* Flash */ |
278 | .virtual = FLASH_BASE, | 278 | .virtual = CLPS7500_FLASH_BASE, |
279 | .pfn = __phys_to_pfn(FLASH_START), | 279 | .pfn = __phys_to_pfn(CLPS7500_FLASH_START), |
280 | .length = FLASH_SIZE, | 280 | .length = CLPS7500_FLASH_SIZE, |
281 | .type = MT_DEVICE | 281 | .type = MT_DEVICE |
282 | }, { /* LED */ | 282 | }, { /* LED */ |
283 | .virtual = LED_BASE, | 283 | .virtual = LED_BASE, |
diff --git a/arch/arm/mach-clps7500/include/mach/hardware.h b/arch/arm/mach-clps7500/include/mach/hardware.h index d66578a3371c..a6ad1d44badf 100644 --- a/arch/arm/mach-clps7500/include/mach/hardware.h +++ b/arch/arm/mach-clps7500/include/mach/hardware.h | |||
@@ -39,9 +39,9 @@ | |||
39 | #define ISA_SIZE 0x00010000 | 39 | #define ISA_SIZE 0x00010000 |
40 | #define ISA_BASE 0xe1000000 | 40 | #define ISA_BASE 0xe1000000 |
41 | 41 | ||
42 | #define FLASH_START 0x01000000 /* XXX */ | 42 | #define CLPS7500_FLASH_START 0x01000000 /* XXX */ |
43 | #define FLASH_SIZE 0x01000000 | 43 | #define CLPS7500_FLASH_SIZE 0x01000000 |
44 | #define FLASH_BASE 0xe2000000 | 44 | #define CLPS7500_FLASH_BASE 0xe2000000 |
45 | 45 | ||
46 | #define LED_START 0x0302B000 | 46 | #define LED_START 0x0302B000 |
47 | #define LED_SIZE 0x00001000 | 47 | #define LED_SIZE 0x00001000 |
diff --git a/arch/arm/mach-h720x/include/mach/boards.h b/arch/arm/mach-h720x/include/mach/boards.h index 079b279e1242..38b8e0d61fbf 100644 --- a/arch/arm/mach-h720x/include/mach/boards.h +++ b/arch/arm/mach-h720x/include/mach/boards.h | |||
@@ -19,9 +19,9 @@ | |||
19 | #ifdef CONFIG_ARCH_H7202 | 19 | #ifdef CONFIG_ARCH_H7202 |
20 | 20 | ||
21 | /* FLASH */ | 21 | /* FLASH */ |
22 | #define FLASH_VIRT 0xd0000000 | 22 | #define H720X_FLASH_VIRT 0xd0000000 |
23 | #define FLASH_PHYS 0x00000000 | 23 | #define H720X_FLASH_PHYS 0x00000000 |
24 | #define FLASH_SIZE 0x02000000 | 24 | #define H720X_FLASH_SIZE 0x02000000 |
25 | 25 | ||
26 | /* onboard LAN controller */ | 26 | /* onboard LAN controller */ |
27 | # define ETH0_PHYS 0x08000000 | 27 | # define ETH0_PHYS 0x08000000 |
diff --git a/arch/arm/mach-integrator/include/mach/platform.h b/arch/arm/mach-integrator/include/mach/platform.h index 028b87839c0f..e00a2624f269 100644 --- a/arch/arm/mach-integrator/include/mach/platform.h +++ b/arch/arm/mach-integrator/include/mach/platform.h | |||
@@ -408,27 +408,10 @@ | |||
408 | #define uHAL_MEMORY_SIZE INTEGRATOR_SSRAM_SIZE | 408 | #define uHAL_MEMORY_SIZE INTEGRATOR_SSRAM_SIZE |
409 | 409 | ||
410 | /* | 410 | /* |
411 | * Application Flash | ||
412 | * | ||
413 | */ | ||
414 | #define FLASH_BASE INTEGRATOR_FLASH_BASE | ||
415 | #define FLASH_SIZE INTEGRATOR_FLASH_SIZE | ||
416 | #define FLASH_END (FLASH_BASE + FLASH_SIZE - 1) | ||
417 | #define FLASH_BLOCK_SIZE SZ_128K | ||
418 | |||
419 | /* | ||
420 | * Boot Flash | ||
421 | * | ||
422 | */ | ||
423 | #define EPROM_BASE INTEGRATOR_BOOT_ROM_HI | ||
424 | #define EPROM_SIZE INTEGRATOR_BOOT_ROM_SIZE | ||
425 | #define EPROM_END (EPROM_BASE + EPROM_SIZE - 1) | ||
426 | |||
427 | /* | ||
428 | * Clean base - dummy | 411 | * Clean base - dummy |
429 | * | 412 | * |
430 | */ | 413 | */ |
431 | #define CLEAN_BASE EPROM_BASE | 414 | #define CLEAN_BASE INTEGRATOR_BOOT_ROM_HI |
432 | 415 | ||
433 | /* | 416 | /* |
434 | * Timer definitions | 417 | * Timer definitions |
diff --git a/arch/arm/mach-iop13xx/include/mach/adma.h b/arch/arm/mach-iop13xx/include/mach/adma.h index 60019c8e6465..5722e86f2174 100644 --- a/arch/arm/mach-iop13xx/include/mach/adma.h +++ b/arch/arm/mach-iop13xx/include/mach/adma.h | |||
@@ -404,7 +404,8 @@ static inline void iop_desc_set_next_desc(struct iop_adma_desc_slot *desc, | |||
404 | u32 next_desc_addr) | 404 | u32 next_desc_addr) |
405 | { | 405 | { |
406 | struct iop13xx_adma_desc_hw *hw_desc = desc->hw_desc; | 406 | struct iop13xx_adma_desc_hw *hw_desc = desc->hw_desc; |
407 | BUG_ON(hw_desc->next_desc); | 407 | |
408 | iop_paranoia(hw_desc->next_desc); | ||
408 | hw_desc->next_desc = next_desc_addr; | 409 | hw_desc->next_desc = next_desc_addr; |
409 | } | 410 | } |
410 | 411 | ||
diff --git a/arch/arm/mach-pxa/include/mach/pxafb.h b/arch/arm/mach-pxa/include/mach/pxafb.h index 8e591118371e..cbda4d35c421 100644 --- a/arch/arm/mach-pxa/include/mach/pxafb.h +++ b/arch/arm/mach-pxa/include/mach/pxafb.h | |||
@@ -33,6 +33,7 @@ | |||
33 | #define LCD_CONN_TYPE(_x) ((_x) & 0x0f) | 33 | #define LCD_CONN_TYPE(_x) ((_x) & 0x0f) |
34 | #define LCD_CONN_WIDTH(_x) (((_x) >> 4) & 0x1f) | 34 | #define LCD_CONN_WIDTH(_x) (((_x) >> 4) & 0x1f) |
35 | 35 | ||
36 | #define LCD_TYPE_MASK 0xf | ||
36 | #define LCD_TYPE_UNKNOWN 0 | 37 | #define LCD_TYPE_UNKNOWN 0 |
37 | #define LCD_TYPE_MONO_STN 1 | 38 | #define LCD_TYPE_MONO_STN 1 |
38 | #define LCD_TYPE_MONO_DSTN 2 | 39 | #define LCD_TYPE_MONO_DSTN 2 |
diff --git a/arch/arm/mach-pxa/mioa701.c b/arch/arm/mach-pxa/mioa701.c index 0842c531ee4d..782903fe9c6c 100644 --- a/arch/arm/mach-pxa/mioa701.c +++ b/arch/arm/mach-pxa/mioa701.c | |||
@@ -565,7 +565,7 @@ static int mioa701_sys_suspend(struct sys_device *sysdev, pm_message_t state) | |||
565 | u32 *mem_resume_unknown = phys_to_virt(RESUME_UNKNOWN_ADDR); | 565 | u32 *mem_resume_unknown = phys_to_virt(RESUME_UNKNOWN_ADDR); |
566 | 566 | ||
567 | /* Devices prepare suspend */ | 567 | /* Devices prepare suspend */ |
568 | is_bt_on = gpio_get_value(GPIO83_BT_ON); | 568 | is_bt_on = !!gpio_get_value(GPIO83_BT_ON); |
569 | pxa2xx_mfp_set_lpm(GPIO83_BT_ON, | 569 | pxa2xx_mfp_set_lpm(GPIO83_BT_ON, |
570 | is_bt_on ? MFP_LPM_DRIVE_HIGH : MFP_LPM_DRIVE_LOW); | 570 | is_bt_on ? MFP_LPM_DRIVE_HIGH : MFP_LPM_DRIVE_LOW); |
571 | 571 | ||
diff --git a/arch/arm/mach-pxa/mioa701_bootresume.S b/arch/arm/mach-pxa/mioa701_bootresume.S index a647693d9856..324d25a48c85 100644 --- a/arch/arm/mach-pxa/mioa701_bootresume.S +++ b/arch/arm/mach-pxa/mioa701_bootresume.S | |||
@@ -24,6 +24,7 @@ ENTRY(mioa701_jumpaddr) | |||
24 | 1: | 24 | 1: |
25 | mov r0, #0xa0000000 @ Don't suppose memory access works | 25 | mov r0, #0xa0000000 @ Don't suppose memory access works |
26 | orr r0, r0, #0x00200000 @ even if it's supposed to | 26 | orr r0, r0, #0x00200000 @ even if it's supposed to |
27 | orr r0, r0, #0x0000b000 | ||
27 | mov r1, #0 | 28 | mov r1, #0 |
28 | str r1, [r0] @ Early disable resume for next boot | 29 | str r1, [r0] @ Early disable resume for next boot |
29 | ldr r0, mioa701_jumpaddr @ (Murphy's Law) | 30 | ldr r0, mioa701_jumpaddr @ (Murphy's Law) |
diff --git a/arch/arm/mach-pxa/palmtx.c b/arch/arm/mach-pxa/palmtx.c index 4447711c9fc6..a9d94f5dbec4 100644 --- a/arch/arm/mach-pxa/palmtx.c +++ b/arch/arm/mach-pxa/palmtx.c | |||
@@ -56,6 +56,9 @@ static unsigned long palmtx_pin_config[] __initdata = { | |||
56 | GPIO110_MMC_DAT_2, | 56 | GPIO110_MMC_DAT_2, |
57 | GPIO111_MMC_DAT_3, | 57 | GPIO111_MMC_DAT_3, |
58 | GPIO112_MMC_CMD, | 58 | GPIO112_MMC_CMD, |
59 | GPIO14_GPIO, /* SD detect */ | ||
60 | GPIO114_GPIO, /* SD power */ | ||
61 | GPIO115_GPIO, /* SD r/o switch */ | ||
59 | 62 | ||
60 | /* AC97 */ | 63 | /* AC97 */ |
61 | GPIO28_AC97_BITCLK, | 64 | GPIO28_AC97_BITCLK, |
@@ -64,6 +67,7 @@ static unsigned long palmtx_pin_config[] __initdata = { | |||
64 | GPIO31_AC97_SYNC, | 67 | GPIO31_AC97_SYNC, |
65 | 68 | ||
66 | /* IrDA */ | 69 | /* IrDA */ |
70 | GPIO40_GPIO, /* ir disable */ | ||
67 | GPIO46_FICP_RXD, | 71 | GPIO46_FICP_RXD, |
68 | GPIO47_FICP_TXD, | 72 | GPIO47_FICP_TXD, |
69 | 73 | ||
@@ -71,7 +75,8 @@ static unsigned long palmtx_pin_config[] __initdata = { | |||
71 | GPIO16_PWM0_OUT, | 75 | GPIO16_PWM0_OUT, |
72 | 76 | ||
73 | /* USB */ | 77 | /* USB */ |
74 | GPIO13_GPIO, | 78 | GPIO13_GPIO, /* usb detect */ |
79 | GPIO95_GPIO, /* usb power */ | ||
75 | 80 | ||
76 | /* PCMCIA */ | 81 | /* PCMCIA */ |
77 | GPIO48_nPOE, | 82 | GPIO48_nPOE, |
@@ -84,6 +89,45 @@ static unsigned long palmtx_pin_config[] __initdata = { | |||
84 | GPIO55_nPREG, | 89 | GPIO55_nPREG, |
85 | GPIO56_nPWAIT, | 90 | GPIO56_nPWAIT, |
86 | GPIO57_nIOIS16, | 91 | GPIO57_nIOIS16, |
92 | GPIO94_GPIO, /* wifi power 1 */ | ||
93 | GPIO108_GPIO, /* wifi power 2 */ | ||
94 | GPIO116_GPIO, /* wifi ready */ | ||
95 | |||
96 | /* MATRIX KEYPAD */ | ||
97 | GPIO100_KP_MKIN_0, | ||
98 | GPIO101_KP_MKIN_1, | ||
99 | GPIO102_KP_MKIN_2, | ||
100 | GPIO97_KP_MKIN_3, | ||
101 | GPIO103_KP_MKOUT_0, | ||
102 | GPIO104_KP_MKOUT_1, | ||
103 | GPIO105_KP_MKOUT_2, | ||
104 | |||
105 | /* LCD */ | ||
106 | GPIO58_LCD_LDD_0, | ||
107 | GPIO59_LCD_LDD_1, | ||
108 | GPIO60_LCD_LDD_2, | ||
109 | GPIO61_LCD_LDD_3, | ||
110 | GPIO62_LCD_LDD_4, | ||
111 | GPIO63_LCD_LDD_5, | ||
112 | GPIO64_LCD_LDD_6, | ||
113 | GPIO65_LCD_LDD_7, | ||
114 | GPIO66_LCD_LDD_8, | ||
115 | GPIO67_LCD_LDD_9, | ||
116 | GPIO68_LCD_LDD_10, | ||
117 | GPIO69_LCD_LDD_11, | ||
118 | GPIO70_LCD_LDD_12, | ||
119 | GPIO71_LCD_LDD_13, | ||
120 | GPIO72_LCD_LDD_14, | ||
121 | GPIO73_LCD_LDD_15, | ||
122 | GPIO74_LCD_FCLK, | ||
123 | GPIO75_LCD_LCLK, | ||
124 | GPIO76_LCD_PCLK, | ||
125 | GPIO77_LCD_BIAS, | ||
126 | |||
127 | /* MISC. */ | ||
128 | GPIO10_GPIO, /* hotsync button */ | ||
129 | GPIO12_GPIO, /* power detect */ | ||
130 | GPIO107_GPIO, /* earphone detect */ | ||
87 | }; | 131 | }; |
88 | 132 | ||
89 | /****************************************************************************** | 133 | /****************************************************************************** |
@@ -95,32 +139,49 @@ static int palmtx_mci_init(struct device *dev, irq_handler_t palmtx_detect_int, | |||
95 | int err = 0; | 139 | int err = 0; |
96 | 140 | ||
97 | /* Setup an interrupt for detecting card insert/remove events */ | 141 | /* Setup an interrupt for detecting card insert/remove events */ |
98 | err = request_irq(IRQ_GPIO_PALMTX_SD_DETECT_N, palmtx_detect_int, | 142 | err = gpio_request(GPIO_NR_PALMTX_SD_DETECT_N, "SD IRQ"); |
99 | IRQF_DISABLED | IRQF_SAMPLE_RANDOM | | 143 | if (err) |
144 | goto err; | ||
145 | err = gpio_direction_input(GPIO_NR_PALMTX_SD_DETECT_N); | ||
146 | if (err) | ||
147 | goto err2; | ||
148 | err = request_irq(gpio_to_irq(GPIO_NR_PALMTX_SD_DETECT_N), | ||
149 | palmtx_detect_int, IRQF_DISABLED | IRQF_SAMPLE_RANDOM | | ||
100 | IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, | 150 | IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, |
101 | "SD/MMC card detect", data); | 151 | "SD/MMC card detect", data); |
102 | if (err) { | 152 | if (err) { |
103 | printk(KERN_ERR "%s: cannot request SD/MMC card detect IRQ\n", | 153 | printk(KERN_ERR "%s: cannot request SD/MMC card detect IRQ\n", |
104 | __func__); | 154 | __func__); |
105 | return err; | 155 | goto err2; |
106 | } | 156 | } |
107 | 157 | ||
108 | err = gpio_request(GPIO_NR_PALMTX_SD_POWER, "SD_POWER"); | 158 | err = gpio_request(GPIO_NR_PALMTX_SD_POWER, "SD_POWER"); |
109 | if (err) | 159 | if (err) |
110 | goto pwr_err; | 160 | goto err3; |
161 | err = gpio_direction_output(GPIO_NR_PALMTX_SD_POWER, 0); | ||
162 | if (err) | ||
163 | goto err4; | ||
111 | 164 | ||
112 | err = gpio_request(GPIO_NR_PALMTX_SD_READONLY, "SD_READONLY"); | 165 | err = gpio_request(GPIO_NR_PALMTX_SD_READONLY, "SD_READONLY"); |
113 | if (err) | 166 | if (err) |
114 | goto ro_err; | 167 | goto err4; |
168 | err = gpio_direction_input(GPIO_NR_PALMTX_SD_READONLY); | ||
169 | if (err) | ||
170 | goto err5; | ||
115 | 171 | ||
116 | printk(KERN_DEBUG "%s: irq registered\n", __func__); | 172 | printk(KERN_DEBUG "%s: irq registered\n", __func__); |
117 | 173 | ||
118 | return 0; | 174 | return 0; |
119 | 175 | ||
120 | ro_err: | 176 | err5: |
177 | gpio_free(GPIO_NR_PALMTX_SD_READONLY); | ||
178 | err4: | ||
121 | gpio_free(GPIO_NR_PALMTX_SD_POWER); | 179 | gpio_free(GPIO_NR_PALMTX_SD_POWER); |
122 | pwr_err: | 180 | err3: |
123 | free_irq(IRQ_GPIO_PALMTX_SD_DETECT_N, data); | 181 | free_irq(gpio_to_irq(GPIO_NR_PALMTX_SD_DETECT_N), data); |
182 | err2: | ||
183 | gpio_free(GPIO_NR_PALMTX_SD_DETECT_N); | ||
184 | err: | ||
124 | return err; | 185 | return err; |
125 | } | 186 | } |
126 | 187 | ||
@@ -128,7 +189,8 @@ static void palmtx_mci_exit(struct device *dev, void *data) | |||
128 | { | 189 | { |
129 | gpio_free(GPIO_NR_PALMTX_SD_READONLY); | 190 | gpio_free(GPIO_NR_PALMTX_SD_READONLY); |
130 | gpio_free(GPIO_NR_PALMTX_SD_POWER); | 191 | gpio_free(GPIO_NR_PALMTX_SD_POWER); |
131 | free_irq(IRQ_GPIO_PALMTX_SD_DETECT_N, data); | 192 | free_irq(gpio_to_irq(GPIO_NR_PALMTX_SD_DETECT_N), data); |
193 | gpio_free(GPIO_NR_PALMTX_SD_DETECT_N); | ||
132 | } | 194 | } |
133 | 195 | ||
134 | static void palmtx_mci_power(struct device *dev, unsigned int vdd) | 196 | static void palmtx_mci_power(struct device *dev, unsigned int vdd) |
@@ -167,7 +229,6 @@ static unsigned int palmtx_matrix_keys[] = { | |||
167 | 229 | ||
168 | KEY(3, 0, KEY_RIGHT), | 230 | KEY(3, 0, KEY_RIGHT), |
169 | KEY(3, 2, KEY_LEFT), | 231 | KEY(3, 2, KEY_LEFT), |
170 | |||
171 | }; | 232 | }; |
172 | 233 | ||
173 | static struct pxa27x_keypad_platform_data palmtx_keypad_platform_data = { | 234 | static struct pxa27x_keypad_platform_data palmtx_keypad_platform_data = { |
@@ -209,11 +270,19 @@ static int palmtx_backlight_init(struct device *dev) | |||
209 | ret = gpio_request(GPIO_NR_PALMTX_BL_POWER, "BL POWER"); | 270 | ret = gpio_request(GPIO_NR_PALMTX_BL_POWER, "BL POWER"); |
210 | if (ret) | 271 | if (ret) |
211 | goto err; | 272 | goto err; |
273 | ret = gpio_direction_output(GPIO_NR_PALMTX_BL_POWER, 0); | ||
274 | if (ret) | ||
275 | goto err2; | ||
212 | ret = gpio_request(GPIO_NR_PALMTX_LCD_POWER, "LCD POWER"); | 276 | ret = gpio_request(GPIO_NR_PALMTX_LCD_POWER, "LCD POWER"); |
213 | if (ret) | 277 | if (ret) |
214 | goto err2; | 278 | goto err2; |
279 | ret = gpio_direction_output(GPIO_NR_PALMTX_LCD_POWER, 0); | ||
280 | if (ret) | ||
281 | goto err3; | ||
215 | 282 | ||
216 | return 0; | 283 | return 0; |
284 | err3: | ||
285 | gpio_free(GPIO_NR_PALMTX_LCD_POWER); | ||
217 | err2: | 286 | err2: |
218 | gpio_free(GPIO_NR_PALMTX_BL_POWER); | 287 | gpio_free(GPIO_NR_PALMTX_BL_POWER); |
219 | err: | 288 | err: |
@@ -254,6 +323,24 @@ static struct platform_device palmtx_backlight = { | |||
254 | /****************************************************************************** | 323 | /****************************************************************************** |
255 | * IrDA | 324 | * IrDA |
256 | ******************************************************************************/ | 325 | ******************************************************************************/ |
326 | static int palmtx_irda_startup(struct device *dev) | ||
327 | { | ||
328 | int err; | ||
329 | err = gpio_request(GPIO_NR_PALMTX_IR_DISABLE, "IR DISABLE"); | ||
330 | if (err) | ||
331 | goto err; | ||
332 | err = gpio_direction_output(GPIO_NR_PALMTX_IR_DISABLE, 1); | ||
333 | if (err) | ||
334 | gpio_free(GPIO_NR_PALMTX_IR_DISABLE); | ||
335 | err: | ||
336 | return err; | ||
337 | } | ||
338 | |||
339 | static void palmtx_irda_shutdown(struct device *dev) | ||
340 | { | ||
341 | gpio_free(GPIO_NR_PALMTX_IR_DISABLE); | ||
342 | } | ||
343 | |||
257 | static void palmtx_irda_transceiver_mode(struct device *dev, int mode) | 344 | static void palmtx_irda_transceiver_mode(struct device *dev, int mode) |
258 | { | 345 | { |
259 | gpio_set_value(GPIO_NR_PALMTX_IR_DISABLE, mode & IR_OFF); | 346 | gpio_set_value(GPIO_NR_PALMTX_IR_DISABLE, mode & IR_OFF); |
@@ -261,6 +348,8 @@ static void palmtx_irda_transceiver_mode(struct device *dev, int mode) | |||
261 | } | 348 | } |
262 | 349 | ||
263 | static struct pxaficp_platform_data palmtx_ficp_platform_data = { | 350 | static struct pxaficp_platform_data palmtx_ficp_platform_data = { |
351 | .startup = palmtx_irda_startup, | ||
352 | .shutdown = palmtx_irda_shutdown, | ||
264 | .transceiver_cap = IR_SIRMODE | IR_FIRMODE | IR_OFF, | 353 | .transceiver_cap = IR_SIRMODE | IR_FIRMODE | IR_OFF, |
265 | .transceiver_mode = palmtx_irda_transceiver_mode, | 354 | .transceiver_mode = palmtx_irda_transceiver_mode, |
266 | }; | 355 | }; |
@@ -268,17 +357,11 @@ static struct pxaficp_platform_data palmtx_ficp_platform_data = { | |||
268 | /****************************************************************************** | 357 | /****************************************************************************** |
269 | * UDC | 358 | * UDC |
270 | ******************************************************************************/ | 359 | ******************************************************************************/ |
271 | static void palmtx_udc_command(int cmd) | ||
272 | { | ||
273 | gpio_set_value(GPIO_NR_PALMTX_USB_POWER, !cmd); | ||
274 | udelay(50); | ||
275 | gpio_set_value(GPIO_NR_PALMTX_USB_PULLUP, !cmd); | ||
276 | } | ||
277 | |||
278 | static struct pxa2xx_udc_mach_info palmtx_udc_info __initdata = { | 360 | static struct pxa2xx_udc_mach_info palmtx_udc_info __initdata = { |
279 | .gpio_vbus = GPIO_NR_PALMTX_USB_DETECT_N, | 361 | .gpio_vbus = GPIO_NR_PALMTX_USB_DETECT_N, |
280 | .gpio_vbus_inverted = 1, | 362 | .gpio_vbus_inverted = 1, |
281 | .udc_command = palmtx_udc_command, | 363 | .gpio_pullup = GPIO_NR_PALMTX_USB_POWER, |
364 | .gpio_pullup_inverted = 0, | ||
282 | }; | 365 | }; |
283 | 366 | ||
284 | /****************************************************************************** | 367 | /****************************************************************************** |
@@ -290,17 +373,16 @@ static int power_supply_init(struct device *dev) | |||
290 | 373 | ||
291 | ret = gpio_request(GPIO_NR_PALMTX_POWER_DETECT, "CABLE_STATE_AC"); | 374 | ret = gpio_request(GPIO_NR_PALMTX_POWER_DETECT, "CABLE_STATE_AC"); |
292 | if (ret) | 375 | if (ret) |
293 | goto err_cs_ac; | 376 | goto err1; |
294 | 377 | ret = gpio_direction_input(GPIO_NR_PALMTX_POWER_DETECT); | |
295 | ret = gpio_request(GPIO_NR_PALMTX_USB_DETECT_N, "CABLE_STATE_USB"); | ||
296 | if (ret) | 378 | if (ret) |
297 | goto err_cs_usb; | 379 | goto err2; |
298 | 380 | ||
299 | return 0; | 381 | return 0; |
300 | 382 | ||
301 | err_cs_usb: | 383 | err2: |
302 | gpio_free(GPIO_NR_PALMTX_POWER_DETECT); | 384 | gpio_free(GPIO_NR_PALMTX_POWER_DETECT); |
303 | err_cs_ac: | 385 | err1: |
304 | return ret; | 386 | return ret; |
305 | } | 387 | } |
306 | 388 | ||
@@ -309,14 +391,8 @@ static int palmtx_is_ac_online(void) | |||
309 | return gpio_get_value(GPIO_NR_PALMTX_POWER_DETECT); | 391 | return gpio_get_value(GPIO_NR_PALMTX_POWER_DETECT); |
310 | } | 392 | } |
311 | 393 | ||
312 | static int palmtx_is_usb_online(void) | ||
313 | { | ||
314 | return !gpio_get_value(GPIO_NR_PALMTX_USB_DETECT_N); | ||
315 | } | ||
316 | |||
317 | static void power_supply_exit(struct device *dev) | 394 | static void power_supply_exit(struct device *dev) |
318 | { | 395 | { |
319 | gpio_free(GPIO_NR_PALMTX_USB_DETECT_N); | ||
320 | gpio_free(GPIO_NR_PALMTX_POWER_DETECT); | 396 | gpio_free(GPIO_NR_PALMTX_POWER_DETECT); |
321 | } | 397 | } |
322 | 398 | ||
@@ -327,7 +403,6 @@ static char *palmtx_supplicants[] = { | |||
327 | static struct pda_power_pdata power_supply_info = { | 403 | static struct pda_power_pdata power_supply_info = { |
328 | .init = power_supply_init, | 404 | .init = power_supply_init, |
329 | .is_ac_online = palmtx_is_ac_online, | 405 | .is_ac_online = palmtx_is_ac_online, |
330 | .is_usb_online = palmtx_is_usb_online, | ||
331 | .exit = power_supply_exit, | 406 | .exit = power_supply_exit, |
332 | .supplied_to = palmtx_supplicants, | 407 | .supplied_to = palmtx_supplicants, |
333 | .num_supplicants = ARRAY_SIZE(palmtx_supplicants), | 408 | .num_supplicants = ARRAY_SIZE(palmtx_supplicants), |
@@ -410,12 +485,23 @@ static void __init palmtx_map_io(void) | |||
410 | iotable_init(palmtx_io_desc, ARRAY_SIZE(palmtx_io_desc)); | 485 | iotable_init(palmtx_io_desc, ARRAY_SIZE(palmtx_io_desc)); |
411 | } | 486 | } |
412 | 487 | ||
488 | /* setup udc GPIOs initial state */ | ||
489 | static void __init palmtx_udc_init(void) | ||
490 | { | ||
491 | if (!gpio_request(GPIO_NR_PALMTX_USB_POWER, "UDC Vbus")) { | ||
492 | gpio_direction_output(GPIO_NR_PALMTX_USB_POWER, 1); | ||
493 | gpio_free(GPIO_NR_PALMTX_USB_POWER); | ||
494 | } | ||
495 | } | ||
496 | |||
497 | |||
413 | static void __init palmtx_init(void) | 498 | static void __init palmtx_init(void) |
414 | { | 499 | { |
415 | pxa2xx_mfp_config(ARRAY_AND_SIZE(palmtx_pin_config)); | 500 | pxa2xx_mfp_config(ARRAY_AND_SIZE(palmtx_pin_config)); |
416 | 501 | ||
417 | set_pxa_fb_info(&palmtx_lcd_screen); | 502 | set_pxa_fb_info(&palmtx_lcd_screen); |
418 | pxa_set_mci_info(&palmtx_mci_platform_data); | 503 | pxa_set_mci_info(&palmtx_mci_platform_data); |
504 | palmtx_udc_init(); | ||
419 | pxa_set_udc_info(&palmtx_udc_info); | 505 | pxa_set_udc_info(&palmtx_udc_info); |
420 | pxa_set_ac97_info(NULL); | 506 | pxa_set_ac97_info(NULL); |
421 | pxa_set_ficp_info(&palmtx_ficp_platform_data); | 507 | pxa_set_ficp_info(&palmtx_ficp_platform_data); |
diff --git a/arch/arm/mach-pxa/pcm990-baseboard.c b/arch/arm/mach-pxa/pcm990-baseboard.c index f601425f1b1e..b36cec5c9eed 100644 --- a/arch/arm/mach-pxa/pcm990-baseboard.c +++ b/arch/arm/mach-pxa/pcm990-baseboard.c | |||
@@ -385,6 +385,7 @@ static struct soc_camera_link iclink[] = { | |||
385 | .gpio = NR_BUILTIN_GPIO + 1, | 385 | .gpio = NR_BUILTIN_GPIO + 1, |
386 | }, { | 386 | }, { |
387 | .bus_id = 0, /* Must match with the camera ID above */ | 387 | .bus_id = 0, /* Must match with the camera ID above */ |
388 | .gpio = -ENXIO, | ||
388 | } | 389 | } |
389 | }; | 390 | }; |
390 | 391 | ||
diff --git a/arch/arm/mach-pxa/reset.c b/arch/arm/mach-pxa/reset.c index 1b2af575c40f..00b2dc2a1074 100644 --- a/arch/arm/mach-pxa/reset.c +++ b/arch/arm/mach-pxa/reset.c | |||
@@ -90,12 +90,13 @@ void arch_reset(char mode) | |||
90 | /* Jump into ROM at address 0 */ | 90 | /* Jump into ROM at address 0 */ |
91 | cpu_reset(0); | 91 | cpu_reset(0); |
92 | break; | 92 | break; |
93 | case 'h': | ||
94 | do_hw_reset(); | ||
95 | break; | ||
96 | case 'g': | 93 | case 'g': |
97 | do_gpio_reset(); | 94 | do_gpio_reset(); |
98 | break; | 95 | break; |
96 | case 'h': | ||
97 | default: | ||
98 | do_hw_reset(); | ||
99 | break; | ||
99 | } | 100 | } |
100 | } | 101 | } |
101 | 102 | ||
diff --git a/arch/arm/mach-pxa/spitz.c b/arch/arm/mach-pxa/spitz.c index f0a5bbae0b45..3be76ee2bdbf 100644 --- a/arch/arm/mach-pxa/spitz.c +++ b/arch/arm/mach-pxa/spitz.c | |||
@@ -67,6 +67,7 @@ | |||
67 | static unsigned long spitz_pin_config[] __initdata = { | 67 | static unsigned long spitz_pin_config[] __initdata = { |
68 | /* Chip Selects */ | 68 | /* Chip Selects */ |
69 | GPIO78_nCS_2, /* SCOOP #2 */ | 69 | GPIO78_nCS_2, /* SCOOP #2 */ |
70 | GPIO79_nCS_3, /* NAND */ | ||
70 | GPIO80_nCS_4, /* SCOOP #1 */ | 71 | GPIO80_nCS_4, /* SCOOP #1 */ |
71 | 72 | ||
72 | /* LCD - 16bpp Active TFT */ | 73 | /* LCD - 16bpp Active TFT */ |
@@ -97,10 +98,10 @@ static unsigned long spitz_pin_config[] __initdata = { | |||
97 | GPIO51_nPIOW, | 98 | GPIO51_nPIOW, |
98 | GPIO85_nPCE_1, | 99 | GPIO85_nPCE_1, |
99 | GPIO54_nPCE_2, | 100 | GPIO54_nPCE_2, |
100 | GPIO79_PSKTSEL, | ||
101 | GPIO55_nPREG, | 101 | GPIO55_nPREG, |
102 | GPIO56_nPWAIT, | 102 | GPIO56_nPWAIT, |
103 | GPIO57_nIOIS16, | 103 | GPIO57_nIOIS16, |
104 | GPIO104_PSKTSEL, | ||
104 | 105 | ||
105 | /* MMC */ | 106 | /* MMC */ |
106 | GPIO32_MMC_CLK, | 107 | GPIO32_MMC_CLK, |
@@ -686,7 +687,6 @@ static void __init akita_init(void) | |||
686 | spitz_pcmcia_config.num_devs = 1; | 687 | spitz_pcmcia_config.num_devs = 1; |
687 | platform_scoop_config = &spitz_pcmcia_config; | 688 | platform_scoop_config = &spitz_pcmcia_config; |
688 | 689 | ||
689 | pxa_set_i2c_info(NULL); | ||
690 | i2c_register_board_info(0, ARRAY_AND_SIZE(akita_i2c_board_info)); | 690 | i2c_register_board_info(0, ARRAY_AND_SIZE(akita_i2c_board_info)); |
691 | 691 | ||
692 | common_init(); | 692 | common_init(); |
diff --git a/arch/arm/mach-realview/clock.c b/arch/arm/mach-realview/clock.c index 3e706c57833a..3347c4236a60 100644 --- a/arch/arm/mach-realview/clock.c +++ b/arch/arm/mach-realview/clock.c | |||
@@ -104,7 +104,7 @@ static struct clk uart_clk = { | |||
104 | 104 | ||
105 | static struct clk mmci_clk = { | 105 | static struct clk mmci_clk = { |
106 | .name = "MCLK", | 106 | .name = "MCLK", |
107 | .rate = 33000000, | 107 | .rate = 24000000, |
108 | }; | 108 | }; |
109 | 109 | ||
110 | int clk_register(struct clk *clk) | 110 | int clk_register(struct clk *clk) |
diff --git a/arch/arm/mach-realview/include/mach/platform.h b/arch/arm/mach-realview/include/mach/platform.h index 4034b54950c2..793a3a332712 100644 --- a/arch/arm/mach-realview/include/mach/platform.h +++ b/arch/arm/mach-realview/include/mach/platform.h | |||
@@ -239,27 +239,10 @@ | |||
239 | #define REALVIEW_DECODE_OFFSET 0xC /* Fitted logic modules */ | 239 | #define REALVIEW_DECODE_OFFSET 0xC /* Fitted logic modules */ |
240 | 240 | ||
241 | /* | 241 | /* |
242 | * Application Flash | ||
243 | * | ||
244 | */ | ||
245 | #define FLASH_BASE REALVIEW_FLASH_BASE | ||
246 | #define FLASH_SIZE REALVIEW_FLASH_SIZE | ||
247 | #define FLASH_END (FLASH_BASE + FLASH_SIZE - 1) | ||
248 | #define FLASH_BLOCK_SIZE SZ_128K | ||
249 | |||
250 | /* | ||
251 | * Boot Flash | ||
252 | * | ||
253 | */ | ||
254 | #define EPROM_BASE REALVIEW_BOOT_ROM_HI | ||
255 | #define EPROM_SIZE REALVIEW_BOOT_ROM_SIZE | ||
256 | #define EPROM_END (EPROM_BASE + EPROM_SIZE - 1) | ||
257 | |||
258 | /* | ||
259 | * Clean base - dummy | 242 | * Clean base - dummy |
260 | * | 243 | * |
261 | */ | 244 | */ |
262 | #define CLEAN_BASE EPROM_BASE | 245 | #define CLEAN_BASE REALVIEW_BOOT_ROM_HI |
263 | 246 | ||
264 | /* | 247 | /* |
265 | * System controller bit assignment | 248 | * System controller bit assignment |
diff --git a/arch/arm/mach-s3c2410/include/mach/spi-gpio.h b/arch/arm/mach-s3c2410/include/mach/spi-gpio.h index 3fe8be9ca110..980a099e209c 100644 --- a/arch/arm/mach-s3c2410/include/mach/spi-gpio.h +++ b/arch/arm/mach-s3c2410/include/mach/spi-gpio.h | |||
@@ -18,6 +18,7 @@ struct s3c2410_spigpio_info { | |||
18 | unsigned long pin_mosi; | 18 | unsigned long pin_mosi; |
19 | unsigned long pin_miso; | 19 | unsigned long pin_miso; |
20 | 20 | ||
21 | int num_chipselect; | ||
21 | int bus_num; | 22 | int bus_num; |
22 | 23 | ||
23 | void (*chip_select)(struct s3c2410_spigpio_info *spi, int cs); | 24 | void (*chip_select)(struct s3c2410_spigpio_info *spi, int cs); |
diff --git a/arch/arm/mach-versatile/clock.c b/arch/arm/mach-versatile/clock.c index 9336508ec0b2..58937f1fb38c 100644 --- a/arch/arm/mach-versatile/clock.c +++ b/arch/arm/mach-versatile/clock.c | |||
@@ -105,7 +105,7 @@ static struct clk uart_clk = { | |||
105 | 105 | ||
106 | static struct clk mmci_clk = { | 106 | static struct clk mmci_clk = { |
107 | .name = "MCLK", | 107 | .name = "MCLK", |
108 | .rate = 33000000, | 108 | .rate = 24000000, |
109 | }; | 109 | }; |
110 | 110 | ||
111 | int clk_register(struct clk *clk) | 111 | int clk_register(struct clk *clk) |
diff --git a/arch/arm/mach-versatile/include/mach/platform.h b/arch/arm/mach-versatile/include/mach/platform.h index 27cbe6a3f220..f91ba930ca8a 100644 --- a/arch/arm/mach-versatile/include/mach/platform.h +++ b/arch/arm/mach-versatile/include/mach/platform.h | |||
@@ -436,28 +436,12 @@ | |||
436 | #define SIC_INTMASK_PCI1 (1 << SIC_INT_PCI1) | 436 | #define SIC_INTMASK_PCI1 (1 << SIC_INT_PCI1) |
437 | #define SIC_INTMASK_PCI2 (1 << SIC_INT_PCI2) | 437 | #define SIC_INTMASK_PCI2 (1 << SIC_INT_PCI2) |
438 | #define SIC_INTMASK_PCI3 (1 << SIC_INT_PCI3) | 438 | #define SIC_INTMASK_PCI3 (1 << SIC_INT_PCI3) |
439 | /* | ||
440 | * Application Flash | ||
441 | * | ||
442 | */ | ||
443 | #define FLASH_BASE VERSATILE_FLASH_BASE | ||
444 | #define FLASH_SIZE VERSATILE_FLASH_SIZE | ||
445 | #define FLASH_END (FLASH_BASE + FLASH_SIZE - 1) | ||
446 | #define FLASH_BLOCK_SIZE SZ_128K | ||
447 | |||
448 | /* | ||
449 | * Boot Flash | ||
450 | * | ||
451 | */ | ||
452 | #define EPROM_BASE VERSATILE_BOOT_ROM_HI | ||
453 | #define EPROM_SIZE VERSATILE_BOOT_ROM_SIZE | ||
454 | #define EPROM_END (EPROM_BASE + EPROM_SIZE - 1) | ||
455 | 439 | ||
456 | /* | 440 | /* |
457 | * Clean base - dummy | 441 | * Clean base - dummy |
458 | * | 442 | * |
459 | */ | 443 | */ |
460 | #define CLEAN_BASE EPROM_BASE | 444 | #define CLEAN_BASE VERSATILE_BOOT_ROM_HI |
461 | 445 | ||
462 | /* | 446 | /* |
463 | * System controller bit assignment | 447 | * System controller bit assignment |
diff --git a/arch/arm/mm/cache-feroceon-l2.c b/arch/arm/mm/cache-feroceon-l2.c index 13cdae8b0d44..80cd207cbaea 100644 --- a/arch/arm/mm/cache-feroceon-l2.c +++ b/arch/arm/mm/cache-feroceon-l2.c | |||
@@ -150,7 +150,7 @@ static void feroceon_l2_inv_range(unsigned long start, unsigned long end) | |||
150 | /* | 150 | /* |
151 | * Clean and invalidate partial last cache line. | 151 | * Clean and invalidate partial last cache line. |
152 | */ | 152 | */ |
153 | if (end & (CACHE_LINE_SIZE - 1)) { | 153 | if (start < end && end & (CACHE_LINE_SIZE - 1)) { |
154 | l2_clean_inv_pa(end & ~(CACHE_LINE_SIZE - 1)); | 154 | l2_clean_inv_pa(end & ~(CACHE_LINE_SIZE - 1)); |
155 | end &= ~(CACHE_LINE_SIZE - 1); | 155 | end &= ~(CACHE_LINE_SIZE - 1); |
156 | } | 156 | } |
@@ -158,7 +158,7 @@ static void feroceon_l2_inv_range(unsigned long start, unsigned long end) | |||
158 | /* | 158 | /* |
159 | * Invalidate all full cache lines between 'start' and 'end'. | 159 | * Invalidate all full cache lines between 'start' and 'end'. |
160 | */ | 160 | */ |
161 | while (start != end) { | 161 | while (start < end) { |
162 | unsigned long range_end = calc_range_end(start, end); | 162 | unsigned long range_end = calc_range_end(start, end); |
163 | l2_inv_pa_range(start, range_end - CACHE_LINE_SIZE); | 163 | l2_inv_pa_range(start, range_end - CACHE_LINE_SIZE); |
164 | start = range_end; | 164 | start = range_end; |
diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index e63db11f16a8..7f36c825718d 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c | |||
@@ -208,6 +208,12 @@ static struct mem_type mem_types[] = { | |||
208 | .prot_sect = PROT_SECT_DEVICE, | 208 | .prot_sect = PROT_SECT_DEVICE, |
209 | .domain = DOMAIN_IO, | 209 | .domain = DOMAIN_IO, |
210 | }, | 210 | }, |
211 | [MT_UNCACHED] = { | ||
212 | .prot_pte = PROT_PTE_DEVICE, | ||
213 | .prot_l1 = PMD_TYPE_TABLE, | ||
214 | .prot_sect = PMD_TYPE_SECT | PMD_SECT_XN, | ||
215 | .domain = DOMAIN_IO, | ||
216 | }, | ||
211 | [MT_CACHECLEAN] = { | 217 | [MT_CACHECLEAN] = { |
212 | .prot_sect = PMD_TYPE_SECT | PMD_SECT_XN, | 218 | .prot_sect = PMD_TYPE_SECT | PMD_SECT_XN, |
213 | .domain = DOMAIN_KERNEL, | 219 | .domain = DOMAIN_KERNEL, |
diff --git a/arch/arm/plat-iop/setup.c b/arch/arm/plat-iop/setup.c index 4689db638e95..9e573e78176a 100644 --- a/arch/arm/plat-iop/setup.c +++ b/arch/arm/plat-iop/setup.c | |||
@@ -16,14 +16,15 @@ | |||
16 | #include <asm/hardware/iop3xx.h> | 16 | #include <asm/hardware/iop3xx.h> |
17 | 17 | ||
18 | /* | 18 | /* |
19 | * Standard IO mapping for all IOP3xx based systems | 19 | * Standard IO mapping for all IOP3xx based systems. Note that |
20 | * the IOP3xx OCCDR must be mapped uncached and unbuffered. | ||
20 | */ | 21 | */ |
21 | static struct map_desc iop3xx_std_desc[] __initdata = { | 22 | static struct map_desc iop3xx_std_desc[] __initdata = { |
22 | { /* mem mapped registers */ | 23 | { /* mem mapped registers */ |
23 | .virtual = IOP3XX_PERIPHERAL_VIRT_BASE, | 24 | .virtual = IOP3XX_PERIPHERAL_VIRT_BASE, |
24 | .pfn = __phys_to_pfn(IOP3XX_PERIPHERAL_PHYS_BASE), | 25 | .pfn = __phys_to_pfn(IOP3XX_PERIPHERAL_PHYS_BASE), |
25 | .length = IOP3XX_PERIPHERAL_SIZE, | 26 | .length = IOP3XX_PERIPHERAL_SIZE, |
26 | .type = MT_DEVICE, | 27 | .type = MT_UNCACHED, |
27 | }, { /* PCI IO space */ | 28 | }, { /* PCI IO space */ |
28 | .virtual = IOP3XX_PCI_LOWER_IO_VA, | 29 | .virtual = IOP3XX_PCI_LOWER_IO_VA, |
29 | .pfn = __phys_to_pfn(IOP3XX_PCI_LOWER_IO_PA), | 30 | .pfn = __phys_to_pfn(IOP3XX_PCI_LOWER_IO_PA), |
diff --git a/arch/arm/plat-omap/gpio.c b/arch/arm/plat-omap/gpio.c index 8679fbca6bbe..424049d83fbe 100644 --- a/arch/arm/plat-omap/gpio.c +++ b/arch/arm/plat-omap/gpio.c | |||
@@ -101,6 +101,7 @@ | |||
101 | #define OMAP24XX_GPIO_IRQSTATUS2 0x0028 | 101 | #define OMAP24XX_GPIO_IRQSTATUS2 0x0028 |
102 | #define OMAP24XX_GPIO_IRQENABLE2 0x002c | 102 | #define OMAP24XX_GPIO_IRQENABLE2 0x002c |
103 | #define OMAP24XX_GPIO_IRQENABLE1 0x001c | 103 | #define OMAP24XX_GPIO_IRQENABLE1 0x001c |
104 | #define OMAP24XX_GPIO_WAKE_EN 0x0020 | ||
104 | #define OMAP24XX_GPIO_CTRL 0x0030 | 105 | #define OMAP24XX_GPIO_CTRL 0x0030 |
105 | #define OMAP24XX_GPIO_OE 0x0034 | 106 | #define OMAP24XX_GPIO_OE 0x0034 |
106 | #define OMAP24XX_GPIO_DATAIN 0x0038 | 107 | #define OMAP24XX_GPIO_DATAIN 0x0038 |
@@ -1551,7 +1552,7 @@ static int omap_gpio_suspend(struct sys_device *dev, pm_message_t mesg) | |||
1551 | #endif | 1552 | #endif |
1552 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) | 1553 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) |
1553 | case METHOD_GPIO_24XX: | 1554 | case METHOD_GPIO_24XX: |
1554 | wake_status = bank->base + OMAP24XX_GPIO_SETWKUENA; | 1555 | wake_status = bank->base + OMAP24XX_GPIO_WAKE_EN; |
1555 | wake_clear = bank->base + OMAP24XX_GPIO_CLEARWKUENA; | 1556 | wake_clear = bank->base + OMAP24XX_GPIO_CLEARWKUENA; |
1556 | wake_set = bank->base + OMAP24XX_GPIO_SETWKUENA; | 1557 | wake_set = bank->base + OMAP24XX_GPIO_SETWKUENA; |
1557 | break; | 1558 | break; |
@@ -1574,7 +1575,7 @@ static int omap_gpio_resume(struct sys_device *dev) | |||
1574 | { | 1575 | { |
1575 | int i; | 1576 | int i; |
1576 | 1577 | ||
1577 | if (!cpu_is_omap24xx() && !cpu_is_omap16xx()) | 1578 | if (!cpu_class_is_omap2() && !cpu_is_omap16xx()) |
1578 | return 0; | 1579 | return 0; |
1579 | 1580 | ||
1580 | for (i = 0; i < gpio_bank_count; i++) { | 1581 | for (i = 0; i < gpio_bank_count; i++) { |
diff --git a/arch/arm/plat-omap/include/mach/pm.h b/arch/arm/plat-omap/include/mach/pm.h index 768eb6e7abcf..2a9c27ad4c37 100644 --- a/arch/arm/plat-omap/include/mach/pm.h +++ b/arch/arm/plat-omap/include/mach/pm.h | |||
@@ -128,7 +128,7 @@ void clk_deny_idle(struct clk *clk); | |||
128 | * clk_allow_idle - Counters previous clk_deny_idle | 128 | * clk_allow_idle - Counters previous clk_deny_idle |
129 | * @clk: clock signal handle | 129 | * @clk: clock signal handle |
130 | */ | 130 | */ |
131 | void clk_deny_idle(struct clk *clk); | 131 | void clk_allow_idle(struct clk *clk); |
132 | 132 | ||
133 | extern void omap_pm_idle(void); | 133 | extern void omap_pm_idle(void); |
134 | extern void omap_pm_suspend(void); | 134 | extern void omap_pm_suspend(void); |
diff --git a/arch/blackfin/include/asm/bfin-global.h b/arch/blackfin/include/asm/bfin-global.h index 56dcb0a2d244..77295666c34b 100644 --- a/arch/blackfin/include/asm/bfin-global.h +++ b/arch/blackfin/include/asm/bfin-global.h | |||
@@ -101,7 +101,7 @@ extern u16 _bfin_swrst; /* shadow for Software Reset Register (SWRST) */ | |||
101 | extern unsigned long _ramstart, _ramend, _rambase; | 101 | extern unsigned long _ramstart, _ramend, _rambase; |
102 | extern unsigned long memory_start, memory_end, physical_mem_end; | 102 | extern unsigned long memory_start, memory_end, physical_mem_end; |
103 | extern char _stext_l1[], _etext_l1[], _sdata_l1[], _edata_l1[], _sbss_l1[], | 103 | extern char _stext_l1[], _etext_l1[], _sdata_l1[], _edata_l1[], _sbss_l1[], |
104 | _ebss_l1[], _l1_lma_start[], _sdata_b_l1[], _ebss_b_l1[], | 104 | _ebss_l1[], _l1_lma_start[], _sdata_b_l1[], _sbss_b_l1[], _ebss_b_l1[], |
105 | _stext_l2[], _etext_l2[], _sdata_l2[], _edata_l2[], _sbss_l2[], | 105 | _stext_l2[], _etext_l2[], _sdata_l2[], _edata_l2[], _sbss_l2[], |
106 | _ebss_l2[], _l2_lma_start[]; | 106 | _ebss_l2[], _l2_lma_start[]; |
107 | 107 | ||
diff --git a/arch/blackfin/include/asm/dma-mapping.h b/arch/blackfin/include/asm/dma-mapping.h index ede748d67efd..d7d9148e433c 100644 --- a/arch/blackfin/include/asm/dma-mapping.h +++ b/arch/blackfin/include/asm/dma-mapping.h | |||
@@ -15,7 +15,11 @@ void dma_free_coherent(struct device *dev, size_t size, void *vaddr, | |||
15 | #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f) | 15 | #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f) |
16 | #define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h) | 16 | #define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h) |
17 | 17 | ||
18 | #define dma_mapping_error | 18 | static inline |
19 | int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) | ||
20 | { | ||
21 | return 0; | ||
22 | } | ||
19 | 23 | ||
20 | /* | 24 | /* |
21 | * Map a single buffer of the indicated size for DMA in streaming mode. | 25 | * Map a single buffer of the indicated size for DMA in streaming mode. |
diff --git a/arch/blackfin/kernel/bfin_gpio.c b/arch/blackfin/kernel/bfin_gpio.c index 6e08f425bb44..5c0800adb4dd 100644 --- a/arch/blackfin/kernel/bfin_gpio.c +++ b/arch/blackfin/kernel/bfin_gpio.c | |||
@@ -218,7 +218,7 @@ inline int check_gpio(unsigned gpio) | |||
218 | if (gpio == GPIO_PB15 || gpio == GPIO_PC14 || gpio == GPIO_PC15 | 218 | if (gpio == GPIO_PB15 || gpio == GPIO_PC14 || gpio == GPIO_PC15 |
219 | || gpio == GPIO_PH14 || gpio == GPIO_PH15 | 219 | || gpio == GPIO_PH14 || gpio == GPIO_PH15 |
220 | || gpio == GPIO_PJ14 || gpio == GPIO_PJ15 | 220 | || gpio == GPIO_PJ14 || gpio == GPIO_PJ15 |
221 | || gpio > MAX_BLACKFIN_GPIOS) | 221 | || gpio >= MAX_BLACKFIN_GPIOS) |
222 | return -EINVAL; | 222 | return -EINVAL; |
223 | return 0; | 223 | return 0; |
224 | } | 224 | } |
diff --git a/arch/blackfin/kernel/cplb-nompu/cplbinit.c b/arch/blackfin/kernel/cplb-nompu/cplbinit.c index 512f8c92ead5..2debc900e246 100644 --- a/arch/blackfin/kernel/cplb-nompu/cplbinit.c +++ b/arch/blackfin/kernel/cplb-nompu/cplbinit.c | |||
@@ -188,10 +188,11 @@ static struct cplb_desc cplb_data[] = { | |||
188 | 188 | ||
189 | static u16 __init lock_kernel_check(u32 start, u32 end) | 189 | static u16 __init lock_kernel_check(u32 start, u32 end) |
190 | { | 190 | { |
191 | if ((end <= (u32) _end && end >= (u32)_stext) || | 191 | if (start >= (u32)_end || end <= (u32)_stext) |
192 | (start <= (u32) _end && start >= (u32)_stext)) | 192 | return 0; |
193 | return IN_KERNEL; | 193 | |
194 | return 0; | 194 | /* This cplb block overlapped with kernel area. */ |
195 | return IN_KERNEL; | ||
195 | } | 196 | } |
196 | 197 | ||
197 | static unsigned short __init | 198 | static unsigned short __init |
diff --git a/arch/blackfin/kernel/process.c b/arch/blackfin/kernel/process.c index 77800dd83e57..0c3ea118b657 100644 --- a/arch/blackfin/kernel/process.c +++ b/arch/blackfin/kernel/process.c | |||
@@ -351,10 +351,15 @@ int _access_ok(unsigned long addr, unsigned long size) | |||
351 | return 1; | 351 | return 1; |
352 | #endif | 352 | #endif |
353 | #if L1_DATA_B_LENGTH != 0 | 353 | #if L1_DATA_B_LENGTH != 0 |
354 | if (addr >= L1_DATA_B_START | 354 | if (addr >= L1_DATA_B_START + (_ebss_b_l1 - _sdata_b_l1) |
355 | && addr + size <= L1_DATA_B_START + L1_DATA_B_LENGTH) | 355 | && addr + size <= L1_DATA_B_START + L1_DATA_B_LENGTH) |
356 | return 1; | 356 | return 1; |
357 | #endif | 357 | #endif |
358 | #if L2_LENGTH != 0 | ||
359 | if (addr >= L2_START + (_ebss_l2 - _stext_l2) | ||
360 | && addr + size <= L2_START + L2_LENGTH) | ||
361 | return 1; | ||
362 | #endif | ||
358 | return 0; | 363 | return 0; |
359 | } | 364 | } |
360 | EXPORT_SYMBOL(_access_ok); | 365 | EXPORT_SYMBOL(_access_ok); |
diff --git a/arch/blackfin/kernel/setup.c b/arch/blackfin/kernel/setup.c index 7f35d1046cd8..71a9a8c53cea 100644 --- a/arch/blackfin/kernel/setup.c +++ b/arch/blackfin/kernel/setup.c | |||
@@ -119,23 +119,23 @@ void __init bfin_relocate_l1_mem(void) | |||
119 | /* Copy _stext_l1 to _etext_l1 to L1 instruction SRAM */ | 119 | /* Copy _stext_l1 to _etext_l1 to L1 instruction SRAM */ |
120 | dma_memcpy(_stext_l1, _l1_lma_start, l1_code_length); | 120 | dma_memcpy(_stext_l1, _l1_lma_start, l1_code_length); |
121 | 121 | ||
122 | l1_data_a_length = _ebss_l1 - _sdata_l1; | 122 | l1_data_a_length = _sbss_l1 - _sdata_l1; |
123 | if (l1_data_a_length > L1_DATA_A_LENGTH) | 123 | if (l1_data_a_length > L1_DATA_A_LENGTH) |
124 | panic("L1 Data SRAM Bank A Overflow\n"); | 124 | panic("L1 Data SRAM Bank A Overflow\n"); |
125 | 125 | ||
126 | /* Copy _sdata_l1 to _ebss_l1 to L1 data bank A SRAM */ | 126 | /* Copy _sdata_l1 to _sbss_l1 to L1 data bank A SRAM */ |
127 | dma_memcpy(_sdata_l1, _l1_lma_start + l1_code_length, l1_data_a_length); | 127 | dma_memcpy(_sdata_l1, _l1_lma_start + l1_code_length, l1_data_a_length); |
128 | 128 | ||
129 | l1_data_b_length = _ebss_b_l1 - _sdata_b_l1; | 129 | l1_data_b_length = _sbss_b_l1 - _sdata_b_l1; |
130 | if (l1_data_b_length > L1_DATA_B_LENGTH) | 130 | if (l1_data_b_length > L1_DATA_B_LENGTH) |
131 | panic("L1 Data SRAM Bank B Overflow\n"); | 131 | panic("L1 Data SRAM Bank B Overflow\n"); |
132 | 132 | ||
133 | /* Copy _sdata_b_l1 to _ebss_b_l1 to L1 data bank B SRAM */ | 133 | /* Copy _sdata_b_l1 to _sbss_b_l1 to L1 data bank B SRAM */ |
134 | dma_memcpy(_sdata_b_l1, _l1_lma_start + l1_code_length + | 134 | dma_memcpy(_sdata_b_l1, _l1_lma_start + l1_code_length + |
135 | l1_data_a_length, l1_data_b_length); | 135 | l1_data_a_length, l1_data_b_length); |
136 | 136 | ||
137 | if (L2_LENGTH != 0) { | 137 | if (L2_LENGTH != 0) { |
138 | l2_length = _ebss_l2 - _stext_l2; | 138 | l2_length = _sbss_l2 - _stext_l2; |
139 | if (l2_length > L2_LENGTH) | 139 | if (l2_length > L2_LENGTH) |
140 | panic("L2 SRAM Overflow\n"); | 140 | panic("L2 SRAM Overflow\n"); |
141 | 141 | ||
@@ -827,7 +827,7 @@ void __init setup_arch(char **cmdline_p) | |||
827 | printk(KERN_ERR "Warning: Compiled for Rev %d, but running on Rev %d\n", | 827 | printk(KERN_ERR "Warning: Compiled for Rev %d, but running on Rev %d\n", |
828 | bfin_compiled_revid(), bfin_revid()); | 828 | bfin_compiled_revid(), bfin_revid()); |
829 | } | 829 | } |
830 | if (bfin_revid() <= CONFIG_BF_REV_MIN || bfin_revid() > CONFIG_BF_REV_MAX) | 830 | if (bfin_revid() < CONFIG_BF_REV_MIN || bfin_revid() > CONFIG_BF_REV_MAX) |
831 | printk(KERN_ERR "Warning: Unsupported Chip Revision ADSP-%s Rev 0.%d detected\n", | 831 | printk(KERN_ERR "Warning: Unsupported Chip Revision ADSP-%s Rev 0.%d detected\n", |
832 | CPU, bfin_revid()); | 832 | CPU, bfin_revid()); |
833 | } | 833 | } |
diff --git a/arch/blackfin/kernel/traps.c b/arch/blackfin/kernel/traps.c index 1aa2c788e228..bef025b07443 100644 --- a/arch/blackfin/kernel/traps.c +++ b/arch/blackfin/kernel/traps.c | |||
@@ -59,7 +59,7 @@ | |||
59 | #endif | 59 | #endif |
60 | 60 | ||
61 | 61 | ||
62 | #ifdef CONFIG_VERBOSE_DEBUG | 62 | #ifdef CONFIG_DEBUG_VERBOSE |
63 | #define verbose_printk(fmt, arg...) \ | 63 | #define verbose_printk(fmt, arg...) \ |
64 | printk(fmt, ##arg) | 64 | printk(fmt, ##arg) |
65 | #else | 65 | #else |
@@ -147,9 +147,12 @@ static void decode_address(char *buf, unsigned long address) | |||
147 | char *name = p->comm; | 147 | char *name = p->comm; |
148 | struct file *file = vma->vm_file; | 148 | struct file *file = vma->vm_file; |
149 | 149 | ||
150 | if (file) | 150 | if (file) { |
151 | name = d_path(&file->f_path, _tmpbuf, | 151 | char *d_name = d_path(&file->f_path, _tmpbuf, |
152 | sizeof(_tmpbuf)); | 152 | sizeof(_tmpbuf)); |
153 | if (!IS_ERR(d_name)) | ||
154 | name = d_name; | ||
155 | } | ||
153 | 156 | ||
154 | /* FLAT does not have its text aligned to the start of | 157 | /* FLAT does not have its text aligned to the start of |
155 | * the map while FDPIC ELF does ... | 158 | * the map while FDPIC ELF does ... |
@@ -571,7 +574,7 @@ asmlinkage void trap_c(struct pt_regs *fp) | |||
571 | #endif | 574 | #endif |
572 | panic("Kernel exception"); | 575 | panic("Kernel exception"); |
573 | } else { | 576 | } else { |
574 | #ifdef CONFIG_VERBOSE_DEBUG | 577 | #ifdef CONFIG_DEBUG_VERBOSE |
575 | unsigned long *stack; | 578 | unsigned long *stack; |
576 | /* Dump the user space stack */ | 579 | /* Dump the user space stack */ |
577 | stack = (unsigned long *)rdusp(); | 580 | stack = (unsigned long *)rdusp(); |
diff --git a/arch/blackfin/mach-common/cache.S b/arch/blackfin/mach-common/cache.S index db532181fbde..a028e9450419 100644 --- a/arch/blackfin/mach-common/cache.S +++ b/arch/blackfin/mach-common/cache.S | |||
@@ -25,9 +25,13 @@ | |||
25 | */ | 25 | */ |
26 | .macro do_flush flushins:req optflushins optnopins label | 26 | .macro do_flush flushins:req optflushins optnopins label |
27 | 27 | ||
28 | R2 = -L1_CACHE_BYTES; | ||
29 | |||
30 | /* start = (start & -L1_CACHE_BYTES) */ | ||
31 | R0 = R0 & R2; | ||
32 | |||
28 | /* end = ((end - 1) & -L1_CACHE_BYTES) + L1_CACHE_BYTES; */ | 33 | /* end = ((end - 1) & -L1_CACHE_BYTES) + L1_CACHE_BYTES; */ |
29 | R1 += -1; | 34 | R1 += -1; |
30 | R2 = -L1_CACHE_BYTES; | ||
31 | R1 = R1 & R2; | 35 | R1 = R1 & R2; |
32 | R1 += L1_CACHE_BYTES; | 36 | R1 += L1_CACHE_BYTES; |
33 | 37 | ||
@@ -63,7 +67,7 @@ ENDPROC(_blackfin_icache_flush_range) | |||
63 | 67 | ||
64 | /* Flush all cache lines assocoiated with this area of memory. */ | 68 | /* Flush all cache lines assocoiated with this area of memory. */ |
65 | ENTRY(_blackfin_icache_dcache_flush_range) | 69 | ENTRY(_blackfin_icache_dcache_flush_range) |
66 | do_flush IFLUSH, FLUSH | 70 | do_flush FLUSH, IFLUSH |
67 | ENDPROC(_blackfin_icache_dcache_flush_range) | 71 | ENDPROC(_blackfin_icache_dcache_flush_range) |
68 | 72 | ||
69 | /* Throw away all D-cached data in specified region without any obligation to | 73 | /* Throw away all D-cached data in specified region without any obligation to |
diff --git a/arch/blackfin/mach-common/cpufreq.c b/arch/blackfin/mach-common/cpufreq.c index c22c47b60127..dda5443b37ed 100644 --- a/arch/blackfin/mach-common/cpufreq.c +++ b/arch/blackfin/mach-common/cpufreq.c | |||
@@ -72,13 +72,13 @@ unsigned int __bfin_cycles_mod; | |||
72 | 72 | ||
73 | /**************************************************************************/ | 73 | /**************************************************************************/ |
74 | 74 | ||
75 | static unsigned int bfin_getfreq(unsigned int cpu) | 75 | static unsigned int bfin_getfreq_khz(unsigned int cpu) |
76 | { | 76 | { |
77 | /* The driver only support single cpu */ | 77 | /* The driver only support single cpu */ |
78 | if (cpu != 0) | 78 | if (cpu != 0) |
79 | return -1; | 79 | return -1; |
80 | 80 | ||
81 | return get_cclk(); | 81 | return get_cclk() / 1000; |
82 | } | 82 | } |
83 | 83 | ||
84 | 84 | ||
@@ -96,7 +96,7 @@ static int bfin_target(struct cpufreq_policy *policy, | |||
96 | 96 | ||
97 | cclk_hz = bfin_freq_table[index].frequency; | 97 | cclk_hz = bfin_freq_table[index].frequency; |
98 | 98 | ||
99 | freqs.old = bfin_getfreq(0); | 99 | freqs.old = bfin_getfreq_khz(0); |
100 | freqs.new = cclk_hz; | 100 | freqs.new = cclk_hz; |
101 | freqs.cpu = 0; | 101 | freqs.cpu = 0; |
102 | 102 | ||
@@ -137,8 +137,8 @@ static int __init __bfin_cpu_init(struct cpufreq_policy *policy) | |||
137 | if (policy->cpu != 0) | 137 | if (policy->cpu != 0) |
138 | return -EINVAL; | 138 | return -EINVAL; |
139 | 139 | ||
140 | cclk = get_cclk(); | 140 | cclk = get_cclk() / 1000; |
141 | sclk = get_sclk(); | 141 | sclk = get_sclk() / 1000; |
142 | 142 | ||
143 | #if ANOMALY_05000273 || (!defined(CONFIG_BF54x) && defined(CONFIG_BFIN_DCACHE)) | 143 | #if ANOMALY_05000273 || (!defined(CONFIG_BF54x) && defined(CONFIG_BFIN_DCACHE)) |
144 | min_cclk = sclk * 2; | 144 | min_cclk = sclk * 2; |
@@ -152,7 +152,7 @@ static int __init __bfin_cpu_init(struct cpufreq_policy *policy) | |||
152 | dpm_state_table[index].csel = csel << 4; /* Shift now into PLL_DIV bitpos */ | 152 | dpm_state_table[index].csel = csel << 4; /* Shift now into PLL_DIV bitpos */ |
153 | dpm_state_table[index].tscale = (TIME_SCALE / (1 << csel)) - 1; | 153 | dpm_state_table[index].tscale = (TIME_SCALE / (1 << csel)) - 1; |
154 | 154 | ||
155 | pr_debug("cpufreq: freq:%d csel:%d tscale:%d\n", | 155 | pr_debug("cpufreq: freq:%d csel:0x%x tscale:%d\n", |
156 | bfin_freq_table[index].frequency, | 156 | bfin_freq_table[index].frequency, |
157 | dpm_state_table[index].csel, | 157 | dpm_state_table[index].csel, |
158 | dpm_state_table[index].tscale); | 158 | dpm_state_table[index].tscale); |
@@ -173,7 +173,7 @@ static struct freq_attr *bfin_freq_attr[] = { | |||
173 | static struct cpufreq_driver bfin_driver = { | 173 | static struct cpufreq_driver bfin_driver = { |
174 | .verify = bfin_verify_speed, | 174 | .verify = bfin_verify_speed, |
175 | .target = bfin_target, | 175 | .target = bfin_target, |
176 | .get = bfin_getfreq, | 176 | .get = bfin_getfreq_khz, |
177 | .init = __bfin_cpu_init, | 177 | .init = __bfin_cpu_init, |
178 | .name = "bfin cpufreq", | 178 | .name = "bfin cpufreq", |
179 | .owner = THIS_MODULE, | 179 | .owner = THIS_MODULE, |
diff --git a/arch/blackfin/mach-common/entry.S b/arch/blackfin/mach-common/entry.S index c13fa8da28c7..bde6dc4e2614 100644 --- a/arch/blackfin/mach-common/entry.S +++ b/arch/blackfin/mach-common/entry.S | |||
@@ -277,7 +277,7 @@ ENTRY(_bfin_return_from_exception) | |||
277 | p5.h = hi(ILAT); | 277 | p5.h = hi(ILAT); |
278 | r6 = [p5]; | 278 | r6 = [p5]; |
279 | r7 = 0x20; /* Did I just cause anther HW error? */ | 279 | r7 = 0x20; /* Did I just cause anther HW error? */ |
280 | r7 = r7 & r1; | 280 | r6 = r7 & r6; |
281 | CC = R7 == R6; | 281 | CC = R7 == R6; |
282 | if CC JUMP _double_fault; | 282 | if CC JUMP _double_fault; |
283 | #endif | 283 | #endif |
diff --git a/arch/blackfin/mm/sram-alloc.c b/arch/blackfin/mm/sram-alloc.c index 0f1ca6930c16..cc6f336e7313 100644 --- a/arch/blackfin/mm/sram-alloc.c +++ b/arch/blackfin/mm/sram-alloc.c | |||
@@ -183,10 +183,10 @@ static void __init l2_sram_init(void) | |||
183 | return; | 183 | return; |
184 | } | 184 | } |
185 | 185 | ||
186 | free_l2_sram_head.next->paddr = (void *)L2_START + | 186 | free_l2_sram_head.next->paddr = |
187 | (_etext_l2 - _stext_l2) + (_edata_l2 - _sdata_l2); | 187 | (void *)L2_START + (_ebss_l2 - _stext_l2); |
188 | free_l2_sram_head.next->size = L2_LENGTH - | 188 | free_l2_sram_head.next->size = |
189 | (_etext_l2 - _stext_l2) + (_edata_l2 - _sdata_l2); | 189 | L2_LENGTH - (_ebss_l2 - _stext_l2); |
190 | free_l2_sram_head.next->pid = 0; | 190 | free_l2_sram_head.next->pid = 0; |
191 | free_l2_sram_head.next->next = NULL; | 191 | free_l2_sram_head.next->next = NULL; |
192 | 192 | ||
diff --git a/arch/frv/kernel/sys_frv.c b/arch/frv/kernel/sys_frv.c index 49b2cf2c38f3..baadc97f8627 100644 --- a/arch/frv/kernel/sys_frv.c +++ b/arch/frv/kernel/sys_frv.c | |||
@@ -35,22 +35,21 @@ asmlinkage long sys_mmap2(unsigned long addr, unsigned long len, | |||
35 | int error = -EBADF; | 35 | int error = -EBADF; |
36 | struct file * file = NULL; | 36 | struct file * file = NULL; |
37 | 37 | ||
38 | flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); | ||
39 | if (!(flags & MAP_ANONYMOUS)) { | ||
40 | file = fget(fd); | ||
41 | if (!file) | ||
42 | goto out; | ||
43 | } | ||
44 | |||
45 | /* As with sparc32, make sure the shift for mmap2 is constant | 38 | /* As with sparc32, make sure the shift for mmap2 is constant |
46 | (12), no matter what PAGE_SIZE we have.... */ | 39 | (12), no matter what PAGE_SIZE we have.... */ |
47 | 40 | ||
48 | /* But unlike sparc32, don't just silently break if we're | 41 | /* But unlike sparc32, don't just silently break if we're |
49 | trying to map something we can't */ | 42 | trying to map something we can't */ |
50 | if (pgoff & ((1<<(PAGE_SHIFT-12))-1)) | 43 | if (pgoff & ((1 << (PAGE_SHIFT - 12)) - 1)) |
51 | return -EINVAL; | 44 | return -EINVAL; |
45 | pgoff >>= PAGE_SHIFT - 12; | ||
52 | 46 | ||
53 | pgoff >>= (PAGE_SHIFT - 12); | 47 | flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); |
48 | if (!(flags & MAP_ANONYMOUS)) { | ||
49 | file = fget(fd); | ||
50 | if (!file) | ||
51 | goto out; | ||
52 | } | ||
54 | 53 | ||
55 | down_write(¤t->mm->mmap_sem); | 54 | down_write(¤t->mm->mmap_sem); |
56 | error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); | 55 | error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); |
diff --git a/arch/ia64/include/asm/intrinsics.h b/arch/ia64/include/asm/intrinsics.h index 47d686dba1eb..a3e44a5ed497 100644 --- a/arch/ia64/include/asm/intrinsics.h +++ b/arch/ia64/include/asm/intrinsics.h | |||
@@ -226,7 +226,7 @@ extern long ia64_cmpxchg_called_with_bad_pointer (void); | |||
226 | /************************************************/ | 226 | /************************************************/ |
227 | #define ia64_ssm IA64_INTRINSIC_MACRO(ssm) | 227 | #define ia64_ssm IA64_INTRINSIC_MACRO(ssm) |
228 | #define ia64_rsm IA64_INTRINSIC_MACRO(rsm) | 228 | #define ia64_rsm IA64_INTRINSIC_MACRO(rsm) |
229 | #define ia64_getreg IA64_INTRINSIC_API(getreg) | 229 | #define ia64_getreg IA64_INTRINSIC_MACRO(getreg) |
230 | #define ia64_setreg IA64_INTRINSIC_API(setreg) | 230 | #define ia64_setreg IA64_INTRINSIC_API(setreg) |
231 | #define ia64_set_rr IA64_INTRINSIC_API(set_rr) | 231 | #define ia64_set_rr IA64_INTRINSIC_API(set_rr) |
232 | #define ia64_get_rr IA64_INTRINSIC_API(get_rr) | 232 | #define ia64_get_rr IA64_INTRINSIC_API(get_rr) |
diff --git a/arch/ia64/include/asm/paravirt_privop.h b/arch/ia64/include/asm/paravirt_privop.h index d577aac11835..0b597424fcfc 100644 --- a/arch/ia64/include/asm/paravirt_privop.h +++ b/arch/ia64/include/asm/paravirt_privop.h | |||
@@ -78,6 +78,19 @@ extern unsigned long ia64_native_getreg_func(int regnum); | |||
78 | ia64_native_rsm(mask); \ | 78 | ia64_native_rsm(mask); \ |
79 | } while (0) | 79 | } while (0) |
80 | 80 | ||
81 | /* returned ip value should be the one in the caller, | ||
82 | * not in __paravirt_getreg() */ | ||
83 | #define paravirt_getreg(reg) \ | ||
84 | ({ \ | ||
85 | unsigned long res; \ | ||
86 | BUILD_BUG_ON(!__builtin_constant_p(reg)); \ | ||
87 | if ((reg) == _IA64_REG_IP) \ | ||
88 | res = ia64_native_getreg(_IA64_REG_IP); \ | ||
89 | else \ | ||
90 | res = pv_cpu_ops.getreg(reg); \ | ||
91 | res; \ | ||
92 | }) | ||
93 | |||
81 | /****************************************************************************** | 94 | /****************************************************************************** |
82 | * replacement of hand written assembly codes. | 95 | * replacement of hand written assembly codes. |
83 | */ | 96 | */ |
diff --git a/arch/ia64/include/asm/ptrace.h b/arch/ia64/include/asm/ptrace.h index 6417c1ecb44e..14055c636adf 100644 --- a/arch/ia64/include/asm/ptrace.h +++ b/arch/ia64/include/asm/ptrace.h | |||
@@ -325,8 +325,6 @@ static inline unsigned long user_stack_pointer(struct pt_regs *regs) | |||
325 | #define arch_has_block_step() (1) | 325 | #define arch_has_block_step() (1) |
326 | extern void user_enable_block_step(struct task_struct *); | 326 | extern void user_enable_block_step(struct task_struct *); |
327 | 327 | ||
328 | #define __ARCH_WANT_COMPAT_SYS_PTRACE | ||
329 | |||
330 | #endif /* !__KERNEL__ */ | 328 | #endif /* !__KERNEL__ */ |
331 | 329 | ||
332 | /* pt_all_user_regs is used for PTRACE_GETREGS PTRACE_SETREGS */ | 330 | /* pt_all_user_regs is used for PTRACE_GETREGS PTRACE_SETREGS */ |
diff --git a/arch/ia64/kernel/entry.S b/arch/ia64/kernel/entry.S index 7ef0c594f5ed..d435f4a7a96c 100644 --- a/arch/ia64/kernel/entry.S +++ b/arch/ia64/kernel/entry.S | |||
@@ -499,6 +499,7 @@ GLOBAL_ENTRY(prefetch_stack) | |||
499 | END(prefetch_stack) | 499 | END(prefetch_stack) |
500 | 500 | ||
501 | GLOBAL_ENTRY(kernel_execve) | 501 | GLOBAL_ENTRY(kernel_execve) |
502 | rum psr.ac | ||
502 | mov r15=__NR_execve // put syscall number in place | 503 | mov r15=__NR_execve // put syscall number in place |
503 | break __BREAK_SYSCALL | 504 | break __BREAK_SYSCALL |
504 | br.ret.sptk.many rp | 505 | br.ret.sptk.many rp |
diff --git a/arch/ia64/kernel/head.S b/arch/ia64/kernel/head.S index 66e491d8baac..59301c472800 100644 --- a/arch/ia64/kernel/head.S +++ b/arch/ia64/kernel/head.S | |||
@@ -260,7 +260,7 @@ start_ap: | |||
260 | * Switch into virtual mode: | 260 | * Switch into virtual mode: |
261 | */ | 261 | */ |
262 | movl r16=(IA64_PSR_IT|IA64_PSR_IC|IA64_PSR_DT|IA64_PSR_RT|IA64_PSR_DFH|IA64_PSR_BN \ | 262 | movl r16=(IA64_PSR_IT|IA64_PSR_IC|IA64_PSR_DT|IA64_PSR_RT|IA64_PSR_DFH|IA64_PSR_BN \ |
263 | |IA64_PSR_DI) | 263 | |IA64_PSR_DI|IA64_PSR_AC) |
264 | ;; | 264 | ;; |
265 | mov cr.ipsr=r16 | 265 | mov cr.ipsr=r16 |
266 | movl r17=1f | 266 | movl r17=1f |
diff --git a/arch/ia64/kernel/mca.c b/arch/ia64/kernel/mca.c index 7dd96c127177..bab1de2d2f6a 100644 --- a/arch/ia64/kernel/mca.c +++ b/arch/ia64/kernel/mca.c | |||
@@ -1139,7 +1139,7 @@ ia64_mca_modify_original_stack(struct pt_regs *regs, | |||
1139 | return previous_current; | 1139 | return previous_current; |
1140 | 1140 | ||
1141 | no_mod: | 1141 | no_mod: |
1142 | printk(KERN_INFO "cpu %d, %s %s, original stack not modified\n", | 1142 | mprintk(KERN_INFO "cpu %d, %s %s, original stack not modified\n", |
1143 | smp_processor_id(), type, msg); | 1143 | smp_processor_id(), type, msg); |
1144 | return previous_current; | 1144 | return previous_current; |
1145 | } | 1145 | } |
diff --git a/arch/ia64/kernel/paravirt.c b/arch/ia64/kernel/paravirt.c index de35d8e8b7d2..9f14c16f6369 100644 --- a/arch/ia64/kernel/paravirt.c +++ b/arch/ia64/kernel/paravirt.c | |||
@@ -130,7 +130,7 @@ ia64_native_getreg_func(int regnum) | |||
130 | unsigned long res = -1; | 130 | unsigned long res = -1; |
131 | switch (regnum) { | 131 | switch (regnum) { |
132 | CASE_GET_REG(GP); | 132 | CASE_GET_REG(GP); |
133 | CASE_GET_REG(IP); | 133 | /*CASE_GET_REG(IP);*/ /* returned ip value shouldn't be constant */ |
134 | CASE_GET_REG(PSR); | 134 | CASE_GET_REG(PSR); |
135 | CASE_GET_REG(TP); | 135 | CASE_GET_REG(TP); |
136 | CASE_GET_REG(SP); | 136 | CASE_GET_REG(SP); |
diff --git a/arch/ia64/kernel/pci-dma.c b/arch/ia64/kernel/pci-dma.c index dbdb778efa05..2a92f637431d 100644 --- a/arch/ia64/kernel/pci-dma.c +++ b/arch/ia64/kernel/pci-dma.c | |||
@@ -19,7 +19,6 @@ | |||
19 | #include <linux/kernel.h> | 19 | #include <linux/kernel.h> |
20 | 20 | ||
21 | #include <asm/page.h> | 21 | #include <asm/page.h> |
22 | #include <asm/iommu.h> | ||
23 | 22 | ||
24 | dma_addr_t bad_dma_address __read_mostly; | 23 | dma_addr_t bad_dma_address __read_mostly; |
25 | EXPORT_SYMBOL(bad_dma_address); | 24 | EXPORT_SYMBOL(bad_dma_address); |
diff --git a/arch/ia64/kvm/Kconfig b/arch/ia64/kvm/Kconfig index 8e99fed6b3fd..f833a0b4188d 100644 --- a/arch/ia64/kvm/Kconfig +++ b/arch/ia64/kvm/Kconfig | |||
@@ -20,6 +20,8 @@ if VIRTUALIZATION | |||
20 | config KVM | 20 | config KVM |
21 | tristate "Kernel-based Virtual Machine (KVM) support" | 21 | tristate "Kernel-based Virtual Machine (KVM) support" |
22 | depends on HAVE_KVM && EXPERIMENTAL | 22 | depends on HAVE_KVM && EXPERIMENTAL |
23 | # for device assignment: | ||
24 | depends on PCI | ||
23 | select PREEMPT_NOTIFIERS | 25 | select PREEMPT_NOTIFIERS |
24 | select ANON_INODES | 26 | select ANON_INODES |
25 | ---help--- | 27 | ---help--- |
diff --git a/arch/ia64/kvm/kvm-ia64.c b/arch/ia64/kvm/kvm-ia64.c index 3caac477de9e..af1464f7a6ad 100644 --- a/arch/ia64/kvm/kvm-ia64.c +++ b/arch/ia64/kvm/kvm-ia64.c | |||
@@ -673,16 +673,16 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
673 | 673 | ||
674 | vcpu_load(vcpu); | 674 | vcpu_load(vcpu); |
675 | 675 | ||
676 | if (vcpu->sigset_active) | ||
677 | sigprocmask(SIG_SETMASK, &vcpu->sigset, &sigsaved); | ||
678 | |||
676 | if (unlikely(vcpu->arch.mp_state == KVM_MP_STATE_UNINITIALIZED)) { | 679 | if (unlikely(vcpu->arch.mp_state == KVM_MP_STATE_UNINITIALIZED)) { |
677 | kvm_vcpu_block(vcpu); | 680 | kvm_vcpu_block(vcpu); |
678 | clear_bit(KVM_REQ_UNHALT, &vcpu->requests); | 681 | clear_bit(KVM_REQ_UNHALT, &vcpu->requests); |
679 | vcpu_put(vcpu); | 682 | r = -EAGAIN; |
680 | return -EAGAIN; | 683 | goto out; |
681 | } | 684 | } |
682 | 685 | ||
683 | if (vcpu->sigset_active) | ||
684 | sigprocmask(SIG_SETMASK, &vcpu->sigset, &sigsaved); | ||
685 | |||
686 | if (vcpu->mmio_needed) { | 686 | if (vcpu->mmio_needed) { |
687 | memcpy(vcpu->mmio_data, kvm_run->mmio.data, 8); | 687 | memcpy(vcpu->mmio_data, kvm_run->mmio.data, 8); |
688 | kvm_set_mmio_data(vcpu); | 688 | kvm_set_mmio_data(vcpu); |
@@ -690,7 +690,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
690 | vcpu->mmio_needed = 0; | 690 | vcpu->mmio_needed = 0; |
691 | } | 691 | } |
692 | r = __vcpu_run(vcpu, kvm_run); | 692 | r = __vcpu_run(vcpu, kvm_run); |
693 | 693 | out: | |
694 | if (vcpu->sigset_active) | 694 | if (vcpu->sigset_active) |
695 | sigprocmask(SIG_SETMASK, &sigsaved, NULL); | 695 | sigprocmask(SIG_SETMASK, &sigsaved, NULL); |
696 | 696 | ||
diff --git a/arch/ia64/kvm/vcpu.h b/arch/ia64/kvm/vcpu.h index 341e3fee280c..e9b2a4e121c0 100644 --- a/arch/ia64/kvm/vcpu.h +++ b/arch/ia64/kvm/vcpu.h | |||
@@ -384,6 +384,10 @@ static inline u64 __gpfn_is_io(u64 gpfn) | |||
384 | #define MODE_IND(psr) \ | 384 | #define MODE_IND(psr) \ |
385 | (((psr).it << 2) + ((psr).dt << 1) + (psr).rt) | 385 | (((psr).it << 2) + ((psr).dt << 1) + (psr).rt) |
386 | 386 | ||
387 | #ifndef CONFIG_SMP | ||
388 | #define _vmm_raw_spin_lock(x) do {}while(0) | ||
389 | #define _vmm_raw_spin_unlock(x) do {}while(0) | ||
390 | #else | ||
387 | #define _vmm_raw_spin_lock(x) \ | 391 | #define _vmm_raw_spin_lock(x) \ |
388 | do { \ | 392 | do { \ |
389 | __u32 *ia64_spinlock_ptr = (__u32 *) (x); \ | 393 | __u32 *ia64_spinlock_ptr = (__u32 *) (x); \ |
@@ -403,6 +407,7 @@ static inline u64 __gpfn_is_io(u64 gpfn) | |||
403 | do { barrier(); \ | 407 | do { barrier(); \ |
404 | ((spinlock_t *)x)->raw_lock.lock = 0; } \ | 408 | ((spinlock_t *)x)->raw_lock.lock = 0; } \ |
405 | while (0) | 409 | while (0) |
410 | #endif | ||
406 | 411 | ||
407 | void vmm_spin_lock(spinlock_t *lock); | 412 | void vmm_spin_lock(spinlock_t *lock); |
408 | void vmm_spin_unlock(spinlock_t *lock); | 413 | void vmm_spin_unlock(spinlock_t *lock); |
diff --git a/arch/ia64/sn/kernel/io_init.c b/arch/ia64/sn/kernel/io_init.c index c3aa851d1ca6..4e1801bad83a 100644 --- a/arch/ia64/sn/kernel/io_init.c +++ b/arch/ia64/sn/kernel/io_init.c | |||
@@ -292,7 +292,7 @@ EXPORT_SYMBOL(sn_io_slot_fixup); | |||
292 | * sn_pci_controller_fixup() - This routine sets up a bus's resources | 292 | * sn_pci_controller_fixup() - This routine sets up a bus's resources |
293 | * consistent with the Linux PCI abstraction layer. | 293 | * consistent with the Linux PCI abstraction layer. |
294 | */ | 294 | */ |
295 | static void | 295 | static void __init |
296 | sn_pci_controller_fixup(int segment, int busnum, struct pci_bus *bus) | 296 | sn_pci_controller_fixup(int segment, int busnum, struct pci_bus *bus) |
297 | { | 297 | { |
298 | s64 status = 0; | 298 | s64 status = 0; |
diff --git a/arch/ia64/xen/hypercall.S b/arch/ia64/xen/hypercall.S index d4ff0b9e79f1..45e02bb64a92 100644 --- a/arch/ia64/xen/hypercall.S +++ b/arch/ia64/xen/hypercall.S | |||
@@ -58,7 +58,7 @@ __HCALL2(xen_set_rr, HYPERPRIVOP_SET_RR) | |||
58 | __HCALL2(xen_set_kr, HYPERPRIVOP_SET_KR) | 58 | __HCALL2(xen_set_kr, HYPERPRIVOP_SET_KR) |
59 | 59 | ||
60 | #ifdef CONFIG_IA32_SUPPORT | 60 | #ifdef CONFIG_IA32_SUPPORT |
61 | __HCALL1(xen_get_eflag, HYPERPRIVOP_GET_EFLAG) | 61 | __HCALL0(xen_get_eflag, HYPERPRIVOP_GET_EFLAG) |
62 | __HCALL1(xen_set_eflag, HYPERPRIVOP_SET_EFLAG) // refer SDM vol1 3.1.8 | 62 | __HCALL1(xen_set_eflag, HYPERPRIVOP_SET_EFLAG) // refer SDM vol1 3.1.8 |
63 | #endif /* CONFIG_IA32_SUPPORT */ | 63 | #endif /* CONFIG_IA32_SUPPORT */ |
64 | 64 | ||
diff --git a/arch/m32r/kernel/head.S b/arch/m32r/kernel/head.S index 40180778a5c7..90916067b9c1 100644 --- a/arch/m32r/kernel/head.S +++ b/arch/m32r/kernel/head.S | |||
@@ -23,7 +23,7 @@ __INITDATA | |||
23 | /* | 23 | /* |
24 | * References to members of the boot_cpu_data structure. | 24 | * References to members of the boot_cpu_data structure. |
25 | */ | 25 | */ |
26 | .text | 26 | .section .text.head, "ax" |
27 | .global start_kernel | 27 | .global start_kernel |
28 | .global __bss_start | 28 | .global __bss_start |
29 | .global _end | 29 | .global _end |
@@ -133,7 +133,6 @@ loop1: | |||
133 | /* | 133 | /* |
134 | * AP startup routine | 134 | * AP startup routine |
135 | */ | 135 | */ |
136 | .text | ||
137 | .global eit_vector | 136 | .global eit_vector |
138 | ENTRY(startup_AP) | 137 | ENTRY(startup_AP) |
139 | ;; setup EVB | 138 | ;; setup EVB |
@@ -230,6 +229,7 @@ ENTRY(startup_AP) | |||
230 | nop | 229 | nop |
231 | #endif /* CONFIG_SMP */ | 230 | #endif /* CONFIG_SMP */ |
232 | 231 | ||
232 | .text | ||
233 | ENTRY(stack_start) | 233 | ENTRY(stack_start) |
234 | .long init_thread_union+8192 | 234 | .long init_thread_union+8192 |
235 | .long __KERNEL_DS | 235 | .long __KERNEL_DS |
diff --git a/arch/m32r/kernel/vmlinux.lds.S b/arch/m32r/kernel/vmlinux.lds.S index 15a6f36c06db..9db05df20c0e 100644 --- a/arch/m32r/kernel/vmlinux.lds.S +++ b/arch/m32r/kernel/vmlinux.lds.S | |||
@@ -27,6 +27,7 @@ SECTIONS | |||
27 | _text = .; /* Text and read-only data */ | 27 | _text = .; /* Text and read-only data */ |
28 | .boot : { *(.boot) } = 0 | 28 | .boot : { *(.boot) } = 0 |
29 | .text : { | 29 | .text : { |
30 | *(.text.head) | ||
30 | TEXT_TEXT | 31 | TEXT_TEXT |
31 | SCHED_TEXT | 32 | SCHED_TEXT |
32 | LOCK_TEXT | 33 | LOCK_TEXT |
diff --git a/arch/m68k/kernel/ints.c b/arch/m68k/kernel/ints.c index 7e8a0d394e61..761ee0440c99 100644 --- a/arch/m68k/kernel/ints.c +++ b/arch/m68k/kernel/ints.c | |||
@@ -133,7 +133,7 @@ void __init m68k_setup_user_interrupt(unsigned int vec, unsigned int cnt, | |||
133 | { | 133 | { |
134 | int i; | 134 | int i; |
135 | 135 | ||
136 | BUG_ON(IRQ_USER + cnt >= NR_IRQS); | 136 | BUG_ON(IRQ_USER + cnt > NR_IRQS); |
137 | m68k_first_user_vec = vec; | 137 | m68k_first_user_vec = vec; |
138 | for (i = 0; i < cnt; i++) | 138 | for (i = 0; i < cnt; i++) |
139 | irq_controller[IRQ_USER + i] = &user_irq_controller; | 139 | irq_controller[IRQ_USER + i] = &user_irq_controller; |
diff --git a/arch/mips/include/asm/bug.h b/arch/mips/include/asm/bug.h index 7eb63de808bc..08ea46863fe5 100644 --- a/arch/mips/include/asm/bug.h +++ b/arch/mips/include/asm/bug.h | |||
@@ -7,20 +7,31 @@ | |||
7 | 7 | ||
8 | #include <asm/break.h> | 8 | #include <asm/break.h> |
9 | 9 | ||
10 | #define BUG() \ | 10 | static inline void __noreturn BUG(void) |
11 | do { \ | 11 | { |
12 | __asm__ __volatile__("break %0" : : "i" (BRK_BUG)); \ | 12 | __asm__ __volatile__("break %0" : : "i" (BRK_BUG)); |
13 | } while (0) | 13 | /* Fool GCC into thinking the function doesn't return. */ |
14 | while (1) | ||
15 | ; | ||
16 | } | ||
14 | 17 | ||
15 | #define HAVE_ARCH_BUG | 18 | #define HAVE_ARCH_BUG |
16 | 19 | ||
17 | #if (_MIPS_ISA > _MIPS_ISA_MIPS1) | 20 | #if (_MIPS_ISA > _MIPS_ISA_MIPS1) |
18 | 21 | ||
19 | #define BUG_ON(condition) \ | 22 | static inline void __BUG_ON(unsigned long condition) |
20 | do { \ | 23 | { |
21 | __asm__ __volatile__("tne $0, %0, %1" \ | 24 | if (__builtin_constant_p(condition)) { |
22 | : : "r" (condition), "i" (BRK_BUG)); \ | 25 | if (condition) |
23 | } while (0) | 26 | BUG(); |
27 | else | ||
28 | return; | ||
29 | } | ||
30 | __asm__ __volatile__("tne $0, %0, %1" | ||
31 | : : "r" (condition), "i" (BRK_BUG)); | ||
32 | } | ||
33 | |||
34 | #define BUG_ON(C) __BUG_ON((unsigned long)(C)) | ||
24 | 35 | ||
25 | #define HAVE_ARCH_BUG_ON | 36 | #define HAVE_ARCH_BUG_ON |
26 | 37 | ||
diff --git a/arch/mips/include/asm/mach-rc32434/gpio.h b/arch/mips/include/asm/mach-rc32434/gpio.h index c8e554eafce3..b5cf6457305a 100644 --- a/arch/mips/include/asm/mach-rc32434/gpio.h +++ b/arch/mips/include/asm/mach-rc32434/gpio.h | |||
@@ -84,5 +84,7 @@ extern void set_434_reg(unsigned reg_offs, unsigned bit, unsigned len, unsigned | |||
84 | extern unsigned get_434_reg(unsigned reg_offs); | 84 | extern unsigned get_434_reg(unsigned reg_offs); |
85 | extern void set_latch_u5(unsigned char or_mask, unsigned char nand_mask); | 85 | extern void set_latch_u5(unsigned char or_mask, unsigned char nand_mask); |
86 | extern unsigned char get_latch_u5(void); | 86 | extern unsigned char get_latch_u5(void); |
87 | extern void rb532_gpio_set_ilevel(int bit, unsigned gpio); | ||
88 | extern void rb532_gpio_set_istat(int bit, unsigned gpio); | ||
87 | 89 | ||
88 | #endif /* _RC32434_GPIO_H_ */ | 90 | #endif /* _RC32434_GPIO_H_ */ |
diff --git a/arch/mips/include/asm/mach-rc32434/rb.h b/arch/mips/include/asm/mach-rc32434/rb.h index 79e8ef67d0d3..f25a84916703 100644 --- a/arch/mips/include/asm/mach-rc32434/rb.h +++ b/arch/mips/include/asm/mach-rc32434/rb.h | |||
@@ -40,12 +40,14 @@ | |||
40 | #define BTCS 0x010040 | 40 | #define BTCS 0x010040 |
41 | #define BTCOMPARE 0x010044 | 41 | #define BTCOMPARE 0x010044 |
42 | #define GPIOBASE 0x050000 | 42 | #define GPIOBASE 0x050000 |
43 | #define GPIOCFG 0x050004 | 43 | /* Offsets relative to GPIOBASE */ |
44 | #define GPIOD 0x050008 | 44 | #define GPIOFUNC 0x00 |
45 | #define GPIOILEVEL 0x05000C | 45 | #define GPIOCFG 0x04 |
46 | #define GPIOISTAT 0x050010 | 46 | #define GPIOD 0x08 |
47 | #define GPIONMIEN 0x050014 | 47 | #define GPIOILEVEL 0x0C |
48 | #define IMASK6 0x038038 | 48 | #define GPIOISTAT 0x10 |
49 | #define GPIONMIEN 0x14 | ||
50 | #define IMASK6 0x38 | ||
49 | #define LO_WPX (1 << 0) | 51 | #define LO_WPX (1 << 0) |
50 | #define LO_ALE (1 << 1) | 52 | #define LO_ALE (1 << 1) |
51 | #define LO_CLE (1 << 2) | 53 | #define LO_CLE (1 << 2) |
diff --git a/arch/mips/include/asm/ptrace.h b/arch/mips/include/asm/ptrace.h index 813abd16255d..c2c8bac43307 100644 --- a/arch/mips/include/asm/ptrace.h +++ b/arch/mips/include/asm/ptrace.h | |||
@@ -9,10 +9,6 @@ | |||
9 | #ifndef _ASM_PTRACE_H | 9 | #ifndef _ASM_PTRACE_H |
10 | #define _ASM_PTRACE_H | 10 | #define _ASM_PTRACE_H |
11 | 11 | ||
12 | #ifdef CONFIG_64BIT | ||
13 | #define __ARCH_WANT_COMPAT_SYS_PTRACE | ||
14 | #endif | ||
15 | |||
16 | /* 0 - 31 are integer registers, 32 - 63 are fp registers. */ | 12 | /* 0 - 31 are integer registers, 32 - 63 are fp registers. */ |
17 | #define FPR_BASE 32 | 13 | #define FPR_BASE 32 |
18 | #define PC 64 | 14 | #define PC 64 |
diff --git a/arch/mips/include/asm/time.h b/arch/mips/include/asm/time.h index d3bd5c5aa2ec..9601ea950542 100644 --- a/arch/mips/include/asm/time.h +++ b/arch/mips/include/asm/time.h | |||
@@ -63,7 +63,7 @@ static inline int mips_clockevent_init(void) | |||
63 | /* | 63 | /* |
64 | * Initialize the count register as a clocksource | 64 | * Initialize the count register as a clocksource |
65 | */ | 65 | */ |
66 | #ifdef CONFIG_CEVT_R4K | 66 | #ifdef CONFIG_CSRC_R4K |
67 | extern int init_mips_clocksource(void); | 67 | extern int init_mips_clocksource(void); |
68 | #else | 68 | #else |
69 | static inline int init_mips_clocksource(void) | 69 | static inline int init_mips_clocksource(void) |
diff --git a/arch/mips/kernel/csrc-r4k.c b/arch/mips/kernel/csrc-r4k.c index 86e026f067bc..74fb74583b4e 100644 --- a/arch/mips/kernel/csrc-r4k.c +++ b/arch/mips/kernel/csrc-r4k.c | |||
@@ -27,7 +27,7 @@ int __init init_mips_clocksource(void) | |||
27 | if (!cpu_has_counter || !mips_hpt_frequency) | 27 | if (!cpu_has_counter || !mips_hpt_frequency) |
28 | return -ENXIO; | 28 | return -ENXIO; |
29 | 29 | ||
30 | /* Calclate a somewhat reasonable rating value */ | 30 | /* Calculate a somewhat reasonable rating value */ |
31 | clocksource_mips.rating = 200 + mips_hpt_frequency / 10000000; | 31 | clocksource_mips.rating = 200 + mips_hpt_frequency / 10000000; |
32 | 32 | ||
33 | clocksource_set_clock(&clocksource_mips, mips_hpt_frequency); | 33 | clocksource_set_clock(&clocksource_mips, mips_hpt_frequency); |
diff --git a/arch/mips/mm/sc-ip22.c b/arch/mips/mm/sc-ip22.c index 1f602a110e10..13adb5782110 100644 --- a/arch/mips/mm/sc-ip22.c +++ b/arch/mips/mm/sc-ip22.c | |||
@@ -161,7 +161,7 @@ static inline int __init indy_sc_probe(void) | |||
161 | 161 | ||
162 | /* XXX Check with wje if the Indy caches can differenciate between | 162 | /* XXX Check with wje if the Indy caches can differenciate between |
163 | writeback + invalidate and just invalidate. */ | 163 | writeback + invalidate and just invalidate. */ |
164 | struct bcache_ops indy_sc_ops = { | 164 | static struct bcache_ops indy_sc_ops = { |
165 | .bc_enable = indy_sc_enable, | 165 | .bc_enable = indy_sc_enable, |
166 | .bc_disable = indy_sc_disable, | 166 | .bc_disable = indy_sc_disable, |
167 | .bc_wback_inv = indy_sc_wback_invalidate, | 167 | .bc_wback_inv = indy_sc_wback_invalidate, |
diff --git a/arch/mips/mti-malta/malta-amon.c b/arch/mips/mti-malta/malta-amon.c index 96236bf33838..df9e526312a2 100644 --- a/arch/mips/mti-malta/malta-amon.c +++ b/arch/mips/mti-malta/malta-amon.c | |||
@@ -22,9 +22,9 @@ | |||
22 | #include <linux/init.h> | 22 | #include <linux/init.h> |
23 | #include <linux/smp.h> | 23 | #include <linux/smp.h> |
24 | 24 | ||
25 | #include <asm-mips/addrspace.h> | 25 | #include <asm/addrspace.h> |
26 | #include <asm-mips/mips-boards/launch.h> | 26 | #include <asm/mips-boards/launch.h> |
27 | #include <asm-mips/mipsmtregs.h> | 27 | #include <asm/mipsmtregs.h> |
28 | 28 | ||
29 | int amon_cpu_avail(int cpu) | 29 | int amon_cpu_avail(int cpu) |
30 | { | 30 | { |
diff --git a/arch/mips/rb532/devices.c b/arch/mips/rb532/devices.c index 2f22d714d5b0..c1c29181bd46 100644 --- a/arch/mips/rb532/devices.c +++ b/arch/mips/rb532/devices.c | |||
@@ -118,7 +118,7 @@ static struct platform_device cf_slot0 = { | |||
118 | /* Resources and device for NAND */ | 118 | /* Resources and device for NAND */ |
119 | static int rb532_dev_ready(struct mtd_info *mtd) | 119 | static int rb532_dev_ready(struct mtd_info *mtd) |
120 | { | 120 | { |
121 | return readl(IDT434_REG_BASE + GPIOD) & GPIO_RDY; | 121 | return gpio_get_value(GPIO_RDY); |
122 | } | 122 | } |
123 | 123 | ||
124 | static void rb532_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl) | 124 | static void rb532_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl) |
diff --git a/arch/mips/rb532/gpio.c b/arch/mips/rb532/gpio.c index 70c4a6726377..0e84c8ab6a39 100644 --- a/arch/mips/rb532/gpio.c +++ b/arch/mips/rb532/gpio.c | |||
@@ -39,10 +39,6 @@ | |||
39 | struct rb532_gpio_chip { | 39 | struct rb532_gpio_chip { |
40 | struct gpio_chip chip; | 40 | struct gpio_chip chip; |
41 | void __iomem *regbase; | 41 | void __iomem *regbase; |
42 | void (*set_int_level)(struct gpio_chip *chip, unsigned offset, int value); | ||
43 | int (*get_int_level)(struct gpio_chip *chip, unsigned offset); | ||
44 | void (*set_int_status)(struct gpio_chip *chip, unsigned offset, int value); | ||
45 | int (*get_int_status)(struct gpio_chip *chip, unsigned offset); | ||
46 | }; | 42 | }; |
47 | 43 | ||
48 | struct mpmc_device dev3; | 44 | struct mpmc_device dev3; |
@@ -111,15 +107,47 @@ unsigned char get_latch_u5(void) | |||
111 | } | 107 | } |
112 | EXPORT_SYMBOL(get_latch_u5); | 108 | EXPORT_SYMBOL(get_latch_u5); |
113 | 109 | ||
110 | /* rb532_set_bit - sanely set a bit | ||
111 | * | ||
112 | * bitval: new value for the bit | ||
113 | * offset: bit index in the 4 byte address range | ||
114 | * ioaddr: 4 byte aligned address being altered | ||
115 | */ | ||
116 | static inline void rb532_set_bit(unsigned bitval, | ||
117 | unsigned offset, void __iomem *ioaddr) | ||
118 | { | ||
119 | unsigned long flags; | ||
120 | u32 val; | ||
121 | |||
122 | bitval = !!bitval; /* map parameter to {0,1} */ | ||
123 | |||
124 | local_irq_save(flags); | ||
125 | |||
126 | val = readl(ioaddr); | ||
127 | val &= ~( ~bitval << offset ); /* unset bit if bitval == 0 */ | ||
128 | val |= ( bitval << offset ); /* set bit if bitval == 1 */ | ||
129 | writel(val, ioaddr); | ||
130 | |||
131 | local_irq_restore(flags); | ||
132 | } | ||
133 | |||
134 | /* rb532_get_bit - read a bit | ||
135 | * | ||
136 | * returns the boolean state of the bit, which may be > 1 | ||
137 | */ | ||
138 | static inline int rb532_get_bit(unsigned offset, void __iomem *ioaddr) | ||
139 | { | ||
140 | return (readl(ioaddr) & (1 << offset)); | ||
141 | } | ||
142 | |||
114 | /* | 143 | /* |
115 | * Return GPIO level */ | 144 | * Return GPIO level */ |
116 | static int rb532_gpio_get(struct gpio_chip *chip, unsigned offset) | 145 | static int rb532_gpio_get(struct gpio_chip *chip, unsigned offset) |
117 | { | 146 | { |
118 | u32 mask = 1 << offset; | ||
119 | struct rb532_gpio_chip *gpch; | 147 | struct rb532_gpio_chip *gpch; |
120 | 148 | ||
121 | gpch = container_of(chip, struct rb532_gpio_chip, chip); | 149 | gpch = container_of(chip, struct rb532_gpio_chip, chip); |
122 | return readl(gpch->regbase + GPIOD) & mask; | 150 | return rb532_get_bit(offset, gpch->regbase + GPIOD); |
123 | } | 151 | } |
124 | 152 | ||
125 | /* | 153 | /* |
@@ -128,23 +156,10 @@ static int rb532_gpio_get(struct gpio_chip *chip, unsigned offset) | |||
128 | static void rb532_gpio_set(struct gpio_chip *chip, | 156 | static void rb532_gpio_set(struct gpio_chip *chip, |
129 | unsigned offset, int value) | 157 | unsigned offset, int value) |
130 | { | 158 | { |
131 | unsigned long flags; | ||
132 | u32 mask = 1 << offset; | ||
133 | u32 tmp; | ||
134 | struct rb532_gpio_chip *gpch; | 159 | struct rb532_gpio_chip *gpch; |
135 | void __iomem *gpvr; | ||
136 | 160 | ||
137 | gpch = container_of(chip, struct rb532_gpio_chip, chip); | 161 | gpch = container_of(chip, struct rb532_gpio_chip, chip); |
138 | gpvr = gpch->regbase + GPIOD; | 162 | rb532_set_bit(value, offset, gpch->regbase + GPIOD); |
139 | |||
140 | local_irq_save(flags); | ||
141 | tmp = readl(gpvr); | ||
142 | if (value) | ||
143 | tmp |= mask; | ||
144 | else | ||
145 | tmp &= ~mask; | ||
146 | writel(tmp, gpvr); | ||
147 | local_irq_restore(flags); | ||
148 | } | 163 | } |
149 | 164 | ||
150 | /* | 165 | /* |
@@ -152,21 +167,14 @@ static void rb532_gpio_set(struct gpio_chip *chip, | |||
152 | */ | 167 | */ |
153 | static int rb532_gpio_direction_input(struct gpio_chip *chip, unsigned offset) | 168 | static int rb532_gpio_direction_input(struct gpio_chip *chip, unsigned offset) |
154 | { | 169 | { |
155 | unsigned long flags; | ||
156 | u32 mask = 1 << offset; | ||
157 | u32 value; | ||
158 | struct rb532_gpio_chip *gpch; | 170 | struct rb532_gpio_chip *gpch; |
159 | void __iomem *gpdr; | ||
160 | 171 | ||
161 | gpch = container_of(chip, struct rb532_gpio_chip, chip); | 172 | gpch = container_of(chip, struct rb532_gpio_chip, chip); |
162 | gpdr = gpch->regbase + GPIOCFG; | ||
163 | 173 | ||
164 | local_irq_save(flags); | 174 | if (rb532_get_bit(offset, gpch->regbase + GPIOFUNC)) |
165 | value = readl(gpdr); | 175 | return 1; /* alternate function, GPIOCFG is ignored */ |
166 | value &= ~mask; | ||
167 | writel(value, gpdr); | ||
168 | local_irq_restore(flags); | ||
169 | 176 | ||
177 | rb532_set_bit(0, offset, gpch->regbase + GPIOCFG); | ||
170 | return 0; | 178 | return 0; |
171 | } | 179 | } |
172 | 180 | ||
@@ -176,117 +184,60 @@ static int rb532_gpio_direction_input(struct gpio_chip *chip, unsigned offset) | |||
176 | static int rb532_gpio_direction_output(struct gpio_chip *chip, | 184 | static int rb532_gpio_direction_output(struct gpio_chip *chip, |
177 | unsigned offset, int value) | 185 | unsigned offset, int value) |
178 | { | 186 | { |
179 | unsigned long flags; | ||
180 | u32 mask = 1 << offset; | ||
181 | u32 tmp; | ||
182 | struct rb532_gpio_chip *gpch; | 187 | struct rb532_gpio_chip *gpch; |
183 | void __iomem *gpdr; | ||
184 | 188 | ||
185 | gpch = container_of(chip, struct rb532_gpio_chip, chip); | 189 | gpch = container_of(chip, struct rb532_gpio_chip, chip); |
186 | writel(mask, gpch->regbase + GPIOD); | ||
187 | gpdr = gpch->regbase + GPIOCFG; | ||
188 | 190 | ||
189 | local_irq_save(flags); | 191 | if (rb532_get_bit(offset, gpch->regbase + GPIOFUNC)) |
190 | tmp = readl(gpdr); | 192 | return 1; /* alternate function, GPIOCFG is ignored */ |
191 | tmp |= mask; | ||
192 | writel(tmp, gpdr); | ||
193 | local_irq_restore(flags); | ||
194 | 193 | ||
194 | /* set the initial output value */ | ||
195 | rb532_set_bit(value, offset, gpch->regbase + GPIOD); | ||
196 | |||
197 | rb532_set_bit(1, offset, gpch->regbase + GPIOCFG); | ||
195 | return 0; | 198 | return 0; |
196 | } | 199 | } |
197 | 200 | ||
198 | /* | 201 | static struct rb532_gpio_chip rb532_gpio_chip[] = { |
199 | * Set the GPIO interrupt level | 202 | [0] = { |
200 | */ | 203 | .chip = { |
201 | static void rb532_gpio_set_int_level(struct gpio_chip *chip, | 204 | .label = "gpio0", |
202 | unsigned offset, int value) | 205 | .direction_input = rb532_gpio_direction_input, |
203 | { | 206 | .direction_output = rb532_gpio_direction_output, |
204 | unsigned long flags; | 207 | .get = rb532_gpio_get, |
205 | u32 mask = 1 << offset; | 208 | .set = rb532_gpio_set, |
206 | u32 tmp; | 209 | .base = 0, |
207 | struct rb532_gpio_chip *gpch; | 210 | .ngpio = 32, |
208 | void __iomem *gpil; | 211 | }, |
209 | 212 | }, | |
210 | gpch = container_of(chip, struct rb532_gpio_chip, chip); | 213 | }; |
211 | gpil = gpch->regbase + GPIOILEVEL; | ||
212 | |||
213 | local_irq_save(flags); | ||
214 | tmp = readl(gpil); | ||
215 | if (value) | ||
216 | tmp |= mask; | ||
217 | else | ||
218 | tmp &= ~mask; | ||
219 | writel(tmp, gpil); | ||
220 | local_irq_restore(flags); | ||
221 | } | ||
222 | 214 | ||
223 | /* | 215 | /* |
224 | * Get the GPIO interrupt level | 216 | * Set GPIO interrupt level |
225 | */ | 217 | */ |
226 | static int rb532_gpio_get_int_level(struct gpio_chip *chip, unsigned offset) | 218 | void rb532_gpio_set_ilevel(int bit, unsigned gpio) |
227 | { | 219 | { |
228 | u32 mask = 1 << offset; | 220 | rb532_set_bit(bit, gpio, rb532_gpio_chip->regbase + GPIOILEVEL); |
229 | struct rb532_gpio_chip *gpch; | ||
230 | |||
231 | gpch = container_of(chip, struct rb532_gpio_chip, chip); | ||
232 | return readl(gpch->regbase + GPIOILEVEL) & mask; | ||
233 | } | 221 | } |
222 | EXPORT_SYMBOL(rb532_gpio_set_ilevel); | ||
234 | 223 | ||
235 | /* | 224 | /* |
236 | * Set the GPIO interrupt status | 225 | * Set GPIO interrupt status |
237 | */ | 226 | */ |
238 | static void rb532_gpio_set_int_status(struct gpio_chip *chip, | 227 | void rb532_gpio_set_istat(int bit, unsigned gpio) |
239 | unsigned offset, int value) | ||
240 | { | 228 | { |
241 | unsigned long flags; | 229 | rb532_set_bit(bit, gpio, rb532_gpio_chip->regbase + GPIOISTAT); |
242 | u32 mask = 1 << offset; | ||
243 | u32 tmp; | ||
244 | struct rb532_gpio_chip *gpch; | ||
245 | void __iomem *gpis; | ||
246 | |||
247 | gpch = container_of(chip, struct rb532_gpio_chip, chip); | ||
248 | gpis = gpch->regbase + GPIOISTAT; | ||
249 | |||
250 | local_irq_save(flags); | ||
251 | tmp = readl(gpis); | ||
252 | if (value) | ||
253 | tmp |= mask; | ||
254 | else | ||
255 | tmp &= ~mask; | ||
256 | writel(tmp, gpis); | ||
257 | local_irq_restore(flags); | ||
258 | } | 230 | } |
231 | EXPORT_SYMBOL(rb532_gpio_set_istat); | ||
259 | 232 | ||
260 | /* | 233 | /* |
261 | * Get the GPIO interrupt status | 234 | * Configure GPIO alternate function |
262 | */ | 235 | */ |
263 | static int rb532_gpio_get_int_status(struct gpio_chip *chip, unsigned offset) | 236 | static void rb532_gpio_set_func(int bit, unsigned gpio) |
264 | { | 237 | { |
265 | u32 mask = 1 << offset; | 238 | rb532_set_bit(bit, gpio, rb532_gpio_chip->regbase + GPIOFUNC); |
266 | struct rb532_gpio_chip *gpch; | ||
267 | |||
268 | gpch = container_of(chip, struct rb532_gpio_chip, chip); | ||
269 | return readl(gpch->regbase + GPIOISTAT) & mask; | ||
270 | } | 239 | } |
271 | 240 | ||
272 | static struct rb532_gpio_chip rb532_gpio_chip[] = { | ||
273 | [0] = { | ||
274 | .chip = { | ||
275 | .label = "gpio0", | ||
276 | .direction_input = rb532_gpio_direction_input, | ||
277 | .direction_output = rb532_gpio_direction_output, | ||
278 | .get = rb532_gpio_get, | ||
279 | .set = rb532_gpio_set, | ||
280 | .base = 0, | ||
281 | .ngpio = 32, | ||
282 | }, | ||
283 | .get_int_level = rb532_gpio_get_int_level, | ||
284 | .set_int_level = rb532_gpio_set_int_level, | ||
285 | .get_int_status = rb532_gpio_get_int_status, | ||
286 | .set_int_status = rb532_gpio_set_int_status, | ||
287 | }, | ||
288 | }; | ||
289 | |||
290 | int __init rb532_gpio_init(void) | 241 | int __init rb532_gpio_init(void) |
291 | { | 242 | { |
292 | struct resource *r; | 243 | struct resource *r; |
@@ -310,9 +261,11 @@ int __init rb532_gpio_init(void) | |||
310 | return -ENXIO; | 261 | return -ENXIO; |
311 | } | 262 | } |
312 | 263 | ||
313 | /* Set the interrupt status and level for the CF pin */ | 264 | /* configure CF_GPIO_NUM as CFRDY IRQ source */ |
314 | rb532_gpio_set_int_level(&rb532_gpio_chip->chip, CF_GPIO_NUM, 1); | 265 | rb532_gpio_set_func(0, CF_GPIO_NUM); |
315 | rb532_gpio_set_int_status(&rb532_gpio_chip->chip, CF_GPIO_NUM, 0); | 266 | rb532_gpio_direction_input(&rb532_gpio_chip->chip, CF_GPIO_NUM); |
267 | rb532_gpio_set_ilevel(1, CF_GPIO_NUM); | ||
268 | rb532_gpio_set_istat(0, CF_GPIO_NUM); | ||
316 | 269 | ||
317 | return 0; | 270 | return 0; |
318 | } | 271 | } |
diff --git a/arch/mn10300/Kconfig.debug b/arch/mn10300/Kconfig.debug index 524e33819f32..ff80e86b9bd2 100644 --- a/arch/mn10300/Kconfig.debug +++ b/arch/mn10300/Kconfig.debug | |||
@@ -15,6 +15,15 @@ config DEBUG_DECOMPRESS_KERNEL | |||
15 | decompressing Linux seeing "Uncompressing Linux... " and | 15 | decompressing Linux seeing "Uncompressing Linux... " and |
16 | "Ok, booting the kernel.\n" on console. | 16 | "Ok, booting the kernel.\n" on console. |
17 | 17 | ||
18 | config TEST_MISALIGNMENT_HANDLER | ||
19 | bool "Run tests on the misalignment handler" | ||
20 | depends on DEBUG_KERNEL | ||
21 | default n | ||
22 | help | ||
23 | If you say Y here the kernel will execute a list of misaligned memory | ||
24 | accesses to make sure the misalignment handler deals them with | ||
25 | correctly. If it does not, the kernel will throw a BUG. | ||
26 | |||
18 | config KPROBES | 27 | config KPROBES |
19 | bool "Kprobes" | 28 | bool "Kprobes" |
20 | depends on DEBUG_KERNEL | 29 | depends on DEBUG_KERNEL |
diff --git a/arch/mn10300/kernel/gdb-stub.c b/arch/mn10300/kernel/gdb-stub.c index 54be6afb5555..0ea7482c1522 100644 --- a/arch/mn10300/kernel/gdb-stub.c +++ b/arch/mn10300/kernel/gdb-stub.c | |||
@@ -522,17 +522,7 @@ static int gdbstub_single_step(struct pt_regs *regs) | |||
522 | } else { | 522 | } else { |
523 | switch (cur) { | 523 | switch (cur) { |
524 | /* Bxx (d8,PC) */ | 524 | /* Bxx (d8,PC) */ |
525 | case 0xc0: | 525 | case 0xc0 ... 0xca: |
526 | case 0xc1: | ||
527 | case 0xc2: | ||
528 | case 0xc3: | ||
529 | case 0xc4: | ||
530 | case 0xc5: | ||
531 | case 0xc6: | ||
532 | case 0xc7: | ||
533 | case 0xc8: | ||
534 | case 0xc9: | ||
535 | case 0xca: | ||
536 | if (gdbstub_read_byte(pc + 1, (u8 *) &x) < 0) | 526 | if (gdbstub_read_byte(pc + 1, (u8 *) &x) < 0) |
537 | goto fault; | 527 | goto fault; |
538 | if (!__gdbstub_mark_bp(pc + 2, 0)) | 528 | if (!__gdbstub_mark_bp(pc + 2, 0)) |
@@ -543,17 +533,7 @@ static int gdbstub_single_step(struct pt_regs *regs) | |||
543 | break; | 533 | break; |
544 | 534 | ||
545 | /* LXX (d8,PC) */ | 535 | /* LXX (d8,PC) */ |
546 | case 0xd0: | 536 | case 0xd0 ... 0xda: |
547 | case 0xd1: | ||
548 | case 0xd2: | ||
549 | case 0xd3: | ||
550 | case 0xd4: | ||
551 | case 0xd5: | ||
552 | case 0xd6: | ||
553 | case 0xd7: | ||
554 | case 0xd8: | ||
555 | case 0xd9: | ||
556 | case 0xda: | ||
557 | if (!__gdbstub_mark_bp(pc + 1, 0)) | 537 | if (!__gdbstub_mark_bp(pc + 1, 0)) |
558 | goto fault; | 538 | goto fault; |
559 | if (regs->pc != regs->lar && | 539 | if (regs->pc != regs->lar && |
diff --git a/arch/mn10300/mm/misalignment.c b/arch/mn10300/mm/misalignment.c index 32aa89dc3848..94c4a4358065 100644 --- a/arch/mn10300/mm/misalignment.c +++ b/arch/mn10300/mm/misalignment.c | |||
@@ -37,26 +37,22 @@ | |||
37 | #include <asm/asm-offsets.h> | 37 | #include <asm/asm-offsets.h> |
38 | 38 | ||
39 | #if 0 | 39 | #if 0 |
40 | #define kdebug(FMT, ...) printk(KERN_DEBUG FMT, ##__VA_ARGS__) | 40 | #define kdebug(FMT, ...) printk(KERN_DEBUG "MISALIGN: "FMT"\n", ##__VA_ARGS__) |
41 | #else | 41 | #else |
42 | #define kdebug(FMT, ...) do {} while (0) | 42 | #define kdebug(FMT, ...) do {} while (0) |
43 | #endif | 43 | #endif |
44 | 44 | ||
45 | static int misalignment_addr(unsigned long *registers, unsigned params, | 45 | static int misalignment_addr(unsigned long *registers, unsigned long sp, |
46 | unsigned opcode, unsigned disp, | 46 | unsigned params, unsigned opcode, |
47 | void **_address, unsigned long **_postinc); | 47 | unsigned long disp, |
48 | void **_address, unsigned long **_postinc, | ||
49 | unsigned long *_inc); | ||
48 | 50 | ||
49 | static int misalignment_reg(unsigned long *registers, unsigned params, | 51 | static int misalignment_reg(unsigned long *registers, unsigned params, |
50 | unsigned opcode, unsigned disp, | 52 | unsigned opcode, unsigned long disp, |
51 | unsigned long **_register); | 53 | unsigned long **_register); |
52 | 54 | ||
53 | static inline unsigned int_log2(unsigned x) | 55 | static void misalignment_MOV_Lcc(struct pt_regs *regs, uint32_t opcode); |
54 | { | ||
55 | unsigned y; | ||
56 | asm("bsch %1,%0" : "=r"(y) : "r"(x), "0"(0)); | ||
57 | return y; | ||
58 | } | ||
59 | #define log2(x) int_log2(x) | ||
60 | 56 | ||
61 | static const unsigned Dreg_index[] = { | 57 | static const unsigned Dreg_index[] = { |
62 | REG_D0 >> 2, REG_D1 >> 2, REG_D2 >> 2, REG_D3 >> 2 | 58 | REG_D0 >> 2, REG_D1 >> 2, REG_D2 >> 2, REG_D3 >> 2 |
@@ -86,9 +82,10 @@ enum format_id { | |||
86 | FMT_D7, | 82 | FMT_D7, |
87 | FMT_D8, | 83 | FMT_D8, |
88 | FMT_D9, | 84 | FMT_D9, |
85 | FMT_D10, | ||
89 | }; | 86 | }; |
90 | 87 | ||
91 | struct { | 88 | static const struct { |
92 | u_int8_t opsz, dispsz; | 89 | u_int8_t opsz, dispsz; |
93 | } format_tbl[16] = { | 90 | } format_tbl[16] = { |
94 | [FMT_S0] = { 8, 0 }, | 91 | [FMT_S0] = { 8, 0 }, |
@@ -103,6 +100,7 @@ struct { | |||
103 | [FMT_D7] = { 24, 8 }, | 100 | [FMT_D7] = { 24, 8 }, |
104 | [FMT_D8] = { 24, 24 }, | 101 | [FMT_D8] = { 24, 24 }, |
105 | [FMT_D9] = { 24, 32 }, | 102 | [FMT_D9] = { 24, 32 }, |
103 | [FMT_D10] = { 32, 0 }, | ||
106 | }; | 104 | }; |
107 | 105 | ||
108 | enum value_id { | 106 | enum value_id { |
@@ -128,9 +126,14 @@ enum value_id { | |||
128 | SD24, /* 24-bit signed displacement */ | 126 | SD24, /* 24-bit signed displacement */ |
129 | SIMM4_2, /* 4-bit signed displacement in opcode bits 4-7 */ | 127 | SIMM4_2, /* 4-bit signed displacement in opcode bits 4-7 */ |
130 | SIMM8, /* 8-bit signed immediate */ | 128 | SIMM8, /* 8-bit signed immediate */ |
129 | IMM8, /* 8-bit unsigned immediate */ | ||
130 | IMM16, /* 16-bit unsigned immediate */ | ||
131 | IMM24, /* 24-bit unsigned immediate */ | 131 | IMM24, /* 24-bit unsigned immediate */ |
132 | IMM32, /* 32-bit unsigned immediate */ | 132 | IMM32, /* 32-bit unsigned immediate */ |
133 | IMM32_HIGH8, /* 32-bit unsigned immediate, high 8-bits in opcode */ | 133 | IMM32_HIGH8, /* 32-bit unsigned immediate, LSB in opcode */ |
134 | |||
135 | IMM32_MEM, /* 32-bit unsigned displacement */ | ||
136 | IMM32_HIGH8_MEM, /* 32-bit unsigned displacement, LSB in opcode */ | ||
134 | 137 | ||
135 | DN0 = DM0, | 138 | DN0 = DM0, |
136 | DN1 = DM1, | 139 | DN1 = DM1, |
@@ -149,7 +152,7 @@ enum value_id { | |||
149 | }; | 152 | }; |
150 | 153 | ||
151 | struct mn10300_opcode { | 154 | struct mn10300_opcode { |
152 | const char *name; | 155 | const char name[8]; |
153 | u_int32_t opcode; | 156 | u_int32_t opcode; |
154 | u_int32_t opmask; | 157 | u_int32_t opmask; |
155 | unsigned exclusion; | 158 | unsigned exclusion; |
@@ -185,6 +188,10 @@ struct mn10300_opcode { | |||
185 | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | 188 | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
186 | */ | 189 | */ |
187 | static const struct mn10300_opcode mn10300_opcodes[] = { | 190 | static const struct mn10300_opcode mn10300_opcodes[] = { |
191 | { "mov", 0x4200, 0xf300, 0, FMT_S1, 0, {DM1, MEM2(IMM8, SP)}}, | ||
192 | { "mov", 0x4300, 0xf300, 0, FMT_S1, 0, {AM1, MEM2(IMM8, SP)}}, | ||
193 | { "mov", 0x5800, 0xfc00, 0, FMT_S1, 0, {MEM2(IMM8, SP), DN0}}, | ||
194 | { "mov", 0x5c00, 0xfc00, 0, FMT_S1, 0, {MEM2(IMM8, SP), AN0}}, | ||
188 | { "mov", 0x60, 0xf0, 0, FMT_S0, 0, {DM1, MEM(AN0)}}, | 195 | { "mov", 0x60, 0xf0, 0, FMT_S0, 0, {DM1, MEM(AN0)}}, |
189 | { "mov", 0x70, 0xf0, 0, FMT_S0, 0, {MEM(AM0), DN1}}, | 196 | { "mov", 0x70, 0xf0, 0, FMT_S0, 0, {MEM(AM0), DN1}}, |
190 | { "mov", 0xf000, 0xfff0, 0, FMT_D0, 0, {MEM(AM0), AN1}}, | 197 | { "mov", 0xf000, 0xfff0, 0, FMT_D0, 0, {MEM(AM0), AN1}}, |
@@ -197,8 +204,6 @@ static const struct mn10300_opcode mn10300_opcodes[] = { | |||
197 | { "mov", 0xf81000, 0xfff000, 0, FMT_D1, 0, {DM1, MEM2(SD8, AN0)}}, | 204 | { "mov", 0xf81000, 0xfff000, 0, FMT_D1, 0, {DM1, MEM2(SD8, AN0)}}, |
198 | { "mov", 0xf82000, 0xfff000, 0, FMT_D1, 0, {MEM2(SD8,AM0), AN1}}, | 205 | { "mov", 0xf82000, 0xfff000, 0, FMT_D1, 0, {MEM2(SD8,AM0), AN1}}, |
199 | { "mov", 0xf83000, 0xfff000, 0, FMT_D1, 0, {AM1, MEM2(SD8, AN0)}}, | 206 | { "mov", 0xf83000, 0xfff000, 0, FMT_D1, 0, {AM1, MEM2(SD8, AN0)}}, |
200 | { "mov", 0xf8f000, 0xfffc00, 0, FMT_D1, AM33, {MEM2(SD8, AM0), SP}}, | ||
201 | { "mov", 0xf8f400, 0xfffc00, 0, FMT_D1, AM33, {SP, MEM2(SD8, AN0)}}, | ||
202 | { "mov", 0xf90a00, 0xffff00, 0, FMT_D6, AM33, {MEM(RM0), RN2}}, | 207 | { "mov", 0xf90a00, 0xffff00, 0, FMT_D6, AM33, {MEM(RM0), RN2}}, |
203 | { "mov", 0xf91a00, 0xffff00, 0, FMT_D6, AM33, {RM2, MEM(RN0)}}, | 208 | { "mov", 0xf91a00, 0xffff00, 0, FMT_D6, AM33, {RM2, MEM(RN0)}}, |
204 | { "mov", 0xf96a00, 0xffff00, 0x12, FMT_D6, AM33, {MEMINC(RM0), RN2}}, | 209 | { "mov", 0xf96a00, 0xffff00, 0x12, FMT_D6, AM33, {MEMINC(RM0), RN2}}, |
@@ -207,24 +212,46 @@ static const struct mn10300_opcode mn10300_opcodes[] = { | |||
207 | { "mov", 0xfa100000, 0xfff00000, 0, FMT_D2, 0, {DM1, MEM2(SD16, AN0)}}, | 212 | { "mov", 0xfa100000, 0xfff00000, 0, FMT_D2, 0, {DM1, MEM2(SD16, AN0)}}, |
208 | { "mov", 0xfa200000, 0xfff00000, 0, FMT_D2, 0, {MEM2(SD16, AM0), AN1}}, | 213 | { "mov", 0xfa200000, 0xfff00000, 0, FMT_D2, 0, {MEM2(SD16, AM0), AN1}}, |
209 | { "mov", 0xfa300000, 0xfff00000, 0, FMT_D2, 0, {AM1, MEM2(SD16, AN0)}}, | 214 | { "mov", 0xfa300000, 0xfff00000, 0, FMT_D2, 0, {AM1, MEM2(SD16, AN0)}}, |
215 | { "mov", 0xfa900000, 0xfff30000, 0, FMT_D2, 0, {AM1, MEM2(IMM16, SP)}}, | ||
216 | { "mov", 0xfa910000, 0xfff30000, 0, FMT_D2, 0, {DM1, MEM2(IMM16, SP)}}, | ||
217 | { "mov", 0xfab00000, 0xfffc0000, 0, FMT_D2, 0, {MEM2(IMM16, SP), AN0}}, | ||
218 | { "mov", 0xfab40000, 0xfffc0000, 0, FMT_D2, 0, {MEM2(IMM16, SP), DN0}}, | ||
210 | { "mov", 0xfb0a0000, 0xffff0000, 0, FMT_D7, AM33, {MEM2(SD8, RM0), RN2}}, | 219 | { "mov", 0xfb0a0000, 0xffff0000, 0, FMT_D7, AM33, {MEM2(SD8, RM0), RN2}}, |
211 | { "mov", 0xfb1a0000, 0xffff0000, 0, FMT_D7, AM33, {RM2, MEM2(SD8, RN0)}}, | 220 | { "mov", 0xfb1a0000, 0xffff0000, 0, FMT_D7, AM33, {RM2, MEM2(SD8, RN0)}}, |
212 | { "mov", 0xfb6a0000, 0xffff0000, 0x22, FMT_D7, AM33, {MEMINC2 (RM0, SIMM8), RN2}}, | 221 | { "mov", 0xfb6a0000, 0xffff0000, 0x22, FMT_D7, AM33, {MEMINC2 (RM0, SIMM8), RN2}}, |
213 | { "mov", 0xfb7a0000, 0xffff0000, 0, FMT_D7, AM33, {RM2, MEMINC2 (RN0, SIMM8)}}, | 222 | { "mov", 0xfb7a0000, 0xffff0000, 0, FMT_D7, AM33, {RM2, MEMINC2 (RN0, SIMM8)}}, |
223 | { "mov", 0xfb8a0000, 0xffff0f00, 0, FMT_D7, AM33, {MEM2(IMM8, SP), RN2}}, | ||
214 | { "mov", 0xfb8e0000, 0xffff000f, 0, FMT_D7, AM33, {MEM2(RI, RM0), RD2}}, | 224 | { "mov", 0xfb8e0000, 0xffff000f, 0, FMT_D7, AM33, {MEM2(RI, RM0), RD2}}, |
225 | { "mov", 0xfb9a0000, 0xffff0f00, 0, FMT_D7, AM33, {RM2, MEM2(IMM8, SP)}}, | ||
215 | { "mov", 0xfb9e0000, 0xffff000f, 0, FMT_D7, AM33, {RD2, MEM2(RI, RN0)}}, | 226 | { "mov", 0xfb9e0000, 0xffff000f, 0, FMT_D7, AM33, {RD2, MEM2(RI, RN0)}}, |
216 | { "mov", 0xfc000000, 0xfff00000, 0, FMT_D4, 0, {MEM2(IMM32,AM0), DN1}}, | 227 | { "mov", 0xfc000000, 0xfff00000, 0, FMT_D4, 0, {MEM2(IMM32,AM0), DN1}}, |
217 | { "mov", 0xfc100000, 0xfff00000, 0, FMT_D4, 0, {DM1, MEM2(IMM32,AN0)}}, | 228 | { "mov", 0xfc100000, 0xfff00000, 0, FMT_D4, 0, {DM1, MEM2(IMM32,AN0)}}, |
218 | { "mov", 0xfc200000, 0xfff00000, 0, FMT_D4, 0, {MEM2(IMM32,AM0), AN1}}, | 229 | { "mov", 0xfc200000, 0xfff00000, 0, FMT_D4, 0, {MEM2(IMM32,AM0), AN1}}, |
219 | { "mov", 0xfc300000, 0xfff00000, 0, FMT_D4, 0, {AM1, MEM2(IMM32,AN0)}}, | 230 | { "mov", 0xfc300000, 0xfff00000, 0, FMT_D4, 0, {AM1, MEM2(IMM32,AN0)}}, |
231 | { "mov", 0xfc800000, 0xfff30000, 0, FMT_D4, 0, {AM1, MEM(IMM32_MEM)}}, | ||
232 | { "mov", 0xfc810000, 0xfff30000, 0, FMT_D4, 0, {DM1, MEM(IMM32_MEM)}}, | ||
233 | { "mov", 0xfc900000, 0xfff30000, 0, FMT_D4, 0, {AM1, MEM2(IMM32, SP)}}, | ||
234 | { "mov", 0xfc910000, 0xfff30000, 0, FMT_D4, 0, {DM1, MEM2(IMM32, SP)}}, | ||
235 | { "mov", 0xfca00000, 0xfffc0000, 0, FMT_D4, 0, {MEM(IMM32_MEM), AN0}}, | ||
236 | { "mov", 0xfca40000, 0xfffc0000, 0, FMT_D4, 0, {MEM(IMM32_MEM), DN0}}, | ||
237 | { "mov", 0xfcb00000, 0xfffc0000, 0, FMT_D4, 0, {MEM2(IMM32, SP), AN0}}, | ||
238 | { "mov", 0xfcb40000, 0xfffc0000, 0, FMT_D4, 0, {MEM2(IMM32, SP), DN0}}, | ||
220 | { "mov", 0xfd0a0000, 0xffff0000, 0, FMT_D8, AM33, {MEM2(SD24, RM0), RN2}}, | 239 | { "mov", 0xfd0a0000, 0xffff0000, 0, FMT_D8, AM33, {MEM2(SD24, RM0), RN2}}, |
221 | { "mov", 0xfd1a0000, 0xffff0000, 0, FMT_D8, AM33, {RM2, MEM2(SD24, RN0)}}, | 240 | { "mov", 0xfd1a0000, 0xffff0000, 0, FMT_D8, AM33, {RM2, MEM2(SD24, RN0)}}, |
222 | { "mov", 0xfd6a0000, 0xffff0000, 0x22, FMT_D8, AM33, {MEMINC2 (RM0, IMM24), RN2}}, | 241 | { "mov", 0xfd6a0000, 0xffff0000, 0x22, FMT_D8, AM33, {MEMINC2 (RM0, IMM24), RN2}}, |
223 | { "mov", 0xfd7a0000, 0xffff0000, 0, FMT_D8, AM33, {RM2, MEMINC2 (RN0, IMM24)}}, | 242 | { "mov", 0xfd7a0000, 0xffff0000, 0, FMT_D8, AM33, {RM2, MEMINC2 (RN0, IMM24)}}, |
243 | { "mov", 0xfd8a0000, 0xffff0f00, 0, FMT_D8, AM33, {MEM2(IMM24, SP), RN2}}, | ||
244 | { "mov", 0xfd9a0000, 0xffff0f00, 0, FMT_D8, AM33, {RM2, MEM2(IMM24, SP)}}, | ||
224 | { "mov", 0xfe0a0000, 0xffff0000, 0, FMT_D9, AM33, {MEM2(IMM32_HIGH8,RM0), RN2}}, | 245 | { "mov", 0xfe0a0000, 0xffff0000, 0, FMT_D9, AM33, {MEM2(IMM32_HIGH8,RM0), RN2}}, |
246 | { "mov", 0xfe0a0000, 0xffff0000, 0, FMT_D9, AM33, {MEM2(IMM32_HIGH8,RM0), RN2}}, | ||
247 | { "mov", 0xfe0e0000, 0xffff0f00, 0, FMT_D9, AM33, {MEM(IMM32_HIGH8_MEM), RN2}}, | ||
248 | { "mov", 0xfe1a0000, 0xffff0000, 0, FMT_D9, AM33, {RM2, MEM2(IMM32_HIGH8, RN0)}}, | ||
225 | { "mov", 0xfe1a0000, 0xffff0000, 0, FMT_D9, AM33, {RM2, MEM2(IMM32_HIGH8, RN0)}}, | 249 | { "mov", 0xfe1a0000, 0xffff0000, 0, FMT_D9, AM33, {RM2, MEM2(IMM32_HIGH8, RN0)}}, |
250 | { "mov", 0xfe1e0000, 0xffff0f00, 0, FMT_D9, AM33, {RM2, MEM(IMM32_HIGH8_MEM)}}, | ||
226 | { "mov", 0xfe6a0000, 0xffff0000, 0x22, FMT_D9, AM33, {MEMINC2 (RM0, IMM32_HIGH8), RN2}}, | 251 | { "mov", 0xfe6a0000, 0xffff0000, 0x22, FMT_D9, AM33, {MEMINC2 (RM0, IMM32_HIGH8), RN2}}, |
227 | { "mov", 0xfe7a0000, 0xffff0000, 0, FMT_D9, AM33, {RN2, MEMINC2 (RM0, IMM32_HIGH8)}}, | 252 | { "mov", 0xfe7a0000, 0xffff0000, 0, FMT_D9, AM33, {RN2, MEMINC2 (RM0, IMM32_HIGH8)}}, |
253 | { "mov", 0xfe8a0000, 0xffff0f00, 0, FMT_D9, AM33, {MEM2(IMM32_HIGH8, SP), RN2}}, | ||
254 | { "mov", 0xfe9a0000, 0xffff0f00, 0, FMT_D9, AM33, {RM2, MEM2(IMM32_HIGH8, SP)}}, | ||
228 | 255 | ||
229 | { "movhu", 0xf060, 0xfff0, 0, FMT_D0, 0, {MEM(AM0), DN1}}, | 256 | { "movhu", 0xf060, 0xfff0, 0, FMT_D0, 0, {MEM(AM0), DN1}}, |
230 | { "movhu", 0xf070, 0xfff0, 0, FMT_D0, 0, {DM1, MEM(AN0)}}, | 257 | { "movhu", 0xf070, 0xfff0, 0, FMT_D0, 0, {DM1, MEM(AN0)}}, |
@@ -232,29 +259,58 @@ static const struct mn10300_opcode mn10300_opcodes[] = { | |||
232 | { "movhu", 0xf4c0, 0xffc0, 0, FMT_D0, 0, {DM2, MEM2(DI, AN0)}}, | 259 | { "movhu", 0xf4c0, 0xffc0, 0, FMT_D0, 0, {DM2, MEM2(DI, AN0)}}, |
233 | { "movhu", 0xf86000, 0xfff000, 0, FMT_D1, 0, {MEM2(SD8, AM0), DN1}}, | 260 | { "movhu", 0xf86000, 0xfff000, 0, FMT_D1, 0, {MEM2(SD8, AM0), DN1}}, |
234 | { "movhu", 0xf87000, 0xfff000, 0, FMT_D1, 0, {DM1, MEM2(SD8, AN0)}}, | 261 | { "movhu", 0xf87000, 0xfff000, 0, FMT_D1, 0, {DM1, MEM2(SD8, AN0)}}, |
262 | { "movhu", 0xf89300, 0xfff300, 0, FMT_D1, 0, {DM1, MEM2(IMM8, SP)}}, | ||
263 | { "movhu", 0xf8bc00, 0xfffc00, 0, FMT_D1, 0, {MEM2(IMM8, SP), DN0}}, | ||
235 | { "movhu", 0xf94a00, 0xffff00, 0, FMT_D6, AM33, {MEM(RM0), RN2}}, | 264 | { "movhu", 0xf94a00, 0xffff00, 0, FMT_D6, AM33, {MEM(RM0), RN2}}, |
236 | { "movhu", 0xf95a00, 0xffff00, 0, FMT_D6, AM33, {RM2, MEM(RN0)}}, | 265 | { "movhu", 0xf95a00, 0xffff00, 0, FMT_D6, AM33, {RM2, MEM(RN0)}}, |
237 | { "movhu", 0xf9ea00, 0xffff00, 0x12, FMT_D6, AM33, {MEMINC(RM0), RN2}}, | 266 | { "movhu", 0xf9ea00, 0xffff00, 0x12, FMT_D6, AM33, {MEMINC(RM0), RN2}}, |
238 | { "movhu", 0xf9fa00, 0xffff00, 0, FMT_D6, AM33, {RM2, MEMINC(RN0)}}, | 267 | { "movhu", 0xf9fa00, 0xffff00, 0, FMT_D6, AM33, {RM2, MEMINC(RN0)}}, |
239 | { "movhu", 0xfa600000, 0xfff00000, 0, FMT_D2, 0, {MEM2(SD16, AM0), DN1}}, | 268 | { "movhu", 0xfa600000, 0xfff00000, 0, FMT_D2, 0, {MEM2(SD16, AM0), DN1}}, |
240 | { "movhu", 0xfa700000, 0xfff00000, 0, FMT_D2, 0, {DM1, MEM2(SD16, AN0)}}, | 269 | { "movhu", 0xfa700000, 0xfff00000, 0, FMT_D2, 0, {DM1, MEM2(SD16, AN0)}}, |
270 | { "movhu", 0xfa930000, 0xfff30000, 0, FMT_D2, 0, {DM1, MEM2(IMM16, SP)}}, | ||
271 | { "movhu", 0xfabc0000, 0xfffc0000, 0, FMT_D2, 0, {MEM2(IMM16, SP), DN0}}, | ||
241 | { "movhu", 0xfb4a0000, 0xffff0000, 0, FMT_D7, AM33, {MEM2(SD8, RM0), RN2}}, | 272 | { "movhu", 0xfb4a0000, 0xffff0000, 0, FMT_D7, AM33, {MEM2(SD8, RM0), RN2}}, |
242 | { "movhu", 0xfb5a0000, 0xffff0000, 0, FMT_D7, AM33, {RM2, MEM2(SD8, RN0)}}, | 273 | { "movhu", 0xfb5a0000, 0xffff0000, 0, FMT_D7, AM33, {RM2, MEM2(SD8, RN0)}}, |
274 | { "movhu", 0xfbca0000, 0xffff0f00, 0, FMT_D7, AM33, {MEM2(IMM8, SP), RN2}}, | ||
243 | { "movhu", 0xfbce0000, 0xffff000f, 0, FMT_D7, AM33, {MEM2(RI, RM0), RD2}}, | 275 | { "movhu", 0xfbce0000, 0xffff000f, 0, FMT_D7, AM33, {MEM2(RI, RM0), RD2}}, |
276 | { "movhu", 0xfbda0000, 0xffff0f00, 0, FMT_D7, AM33, {RM2, MEM2(IMM8, SP)}}, | ||
244 | { "movhu", 0xfbde0000, 0xffff000f, 0, FMT_D7, AM33, {RD2, MEM2(RI, RN0)}}, | 277 | { "movhu", 0xfbde0000, 0xffff000f, 0, FMT_D7, AM33, {RD2, MEM2(RI, RN0)}}, |
245 | { "movhu", 0xfbea0000, 0xffff0000, 0x22, FMT_D7, AM33, {MEMINC2 (RM0, SIMM8), RN2}}, | 278 | { "movhu", 0xfbea0000, 0xffff0000, 0x22, FMT_D7, AM33, {MEMINC2 (RM0, SIMM8), RN2}}, |
246 | { "movhu", 0xfbfa0000, 0xffff0000, 0, FMT_D7, AM33, {RM2, MEMINC2 (RN0, SIMM8)}}, | 279 | { "movhu", 0xfbfa0000, 0xffff0000, 0, FMT_D7, AM33, {RM2, MEMINC2 (RN0, SIMM8)}}, |
247 | { "movhu", 0xfc600000, 0xfff00000, 0, FMT_D4, 0, {MEM2(IMM32,AM0), DN1}}, | 280 | { "movhu", 0xfc600000, 0xfff00000, 0, FMT_D4, 0, {MEM2(IMM32,AM0), DN1}}, |
248 | { "movhu", 0xfc700000, 0xfff00000, 0, FMT_D4, 0, {DM1, MEM2(IMM32,AN0)}}, | 281 | { "movhu", 0xfc700000, 0xfff00000, 0, FMT_D4, 0, {DM1, MEM2(IMM32,AN0)}}, |
282 | { "movhu", 0xfc830000, 0xfff30000, 0, FMT_D4, 0, {DM1, MEM(IMM32_MEM)}}, | ||
283 | { "movhu", 0xfc930000, 0xfff30000, 0, FMT_D4, 0, {DM1, MEM2(IMM32, SP)}}, | ||
284 | { "movhu", 0xfcac0000, 0xfffc0000, 0, FMT_D4, 0, {MEM(IMM32_MEM), DN0}}, | ||
285 | { "movhu", 0xfcbc0000, 0xfffc0000, 0, FMT_D4, 0, {MEM2(IMM32, SP), DN0}}, | ||
249 | { "movhu", 0xfd4a0000, 0xffff0000, 0, FMT_D8, AM33, {MEM2(SD24, RM0), RN2}}, | 286 | { "movhu", 0xfd4a0000, 0xffff0000, 0, FMT_D8, AM33, {MEM2(SD24, RM0), RN2}}, |
250 | { "movhu", 0xfd5a0000, 0xffff0000, 0, FMT_D8, AM33, {RM2, MEM2(SD24, RN0)}}, | 287 | { "movhu", 0xfd5a0000, 0xffff0000, 0, FMT_D8, AM33, {RM2, MEM2(SD24, RN0)}}, |
288 | { "movhu", 0xfdca0000, 0xffff0f00, 0, FMT_D8, AM33, {MEM2(IMM24, SP), RN2}}, | ||
289 | { "movhu", 0xfdda0000, 0xffff0f00, 0, FMT_D8, AM33, {RM2, MEM2(IMM24, SP)}}, | ||
251 | { "movhu", 0xfdea0000, 0xffff0000, 0x22, FMT_D8, AM33, {MEMINC2 (RM0, IMM24), RN2}}, | 290 | { "movhu", 0xfdea0000, 0xffff0000, 0x22, FMT_D8, AM33, {MEMINC2 (RM0, IMM24), RN2}}, |
252 | { "movhu", 0xfdfa0000, 0xffff0000, 0, FMT_D8, AM33, {RM2, MEMINC2 (RN0, IMM24)}}, | 291 | { "movhu", 0xfdfa0000, 0xffff0000, 0, FMT_D8, AM33, {RM2, MEMINC2 (RN0, IMM24)}}, |
253 | { "movhu", 0xfe4a0000, 0xffff0000, 0, FMT_D9, AM33, {MEM2(IMM32_HIGH8,RM0), RN2}}, | 292 | { "movhu", 0xfe4a0000, 0xffff0000, 0, FMT_D9, AM33, {MEM2(IMM32_HIGH8,RM0), RN2}}, |
293 | { "movhu", 0xfe4e0000, 0xffff0f00, 0, FMT_D9, AM33, {MEM(IMM32_HIGH8_MEM), RN2}}, | ||
254 | { "movhu", 0xfe5a0000, 0xffff0000, 0, FMT_D9, AM33, {RM2, MEM2(IMM32_HIGH8, RN0)}}, | 294 | { "movhu", 0xfe5a0000, 0xffff0000, 0, FMT_D9, AM33, {RM2, MEM2(IMM32_HIGH8, RN0)}}, |
295 | { "movhu", 0xfe5e0000, 0xffff0f00, 0, FMT_D9, AM33, {RM2, MEM(IMM32_HIGH8_MEM)}}, | ||
296 | { "movhu", 0xfeca0000, 0xffff0f00, 0, FMT_D9, AM33, {MEM2(IMM32_HIGH8, SP), RN2}}, | ||
297 | { "movhu", 0xfeda0000, 0xffff0f00, 0, FMT_D9, AM33, {RM2, MEM2(IMM32_HIGH8, SP)}}, | ||
255 | { "movhu", 0xfeea0000, 0xffff0000, 0x22, FMT_D9, AM33, {MEMINC2 (RM0, IMM32_HIGH8), RN2}}, | 298 | { "movhu", 0xfeea0000, 0xffff0000, 0x22, FMT_D9, AM33, {MEMINC2 (RM0, IMM32_HIGH8), RN2}}, |
256 | { "movhu", 0xfefa0000, 0xffff0000, 0, FMT_D9, AM33, {RN2, MEMINC2 (RM0, IMM32_HIGH8)}}, | 299 | { "movhu", 0xfefa0000, 0xffff0000, 0, FMT_D9, AM33, {RN2, MEMINC2 (RM0, IMM32_HIGH8)}}, |
257 | { 0, 0, 0, 0, 0, 0, {0}}, | 300 | |
301 | { "mov_llt", 0xf7e00000, 0xffff000f, 0x22, FMT_D10, AM33, {MEMINC2 (RN4,SIMM4_2), RM6}}, | ||
302 | { "mov_lgt", 0xf7e00001, 0xffff000f, 0x22, FMT_D10, AM33, {MEMINC2 (RN4,SIMM4_2), RM6}}, | ||
303 | { "mov_lge", 0xf7e00002, 0xffff000f, 0x22, FMT_D10, AM33, {MEMINC2 (RN4,SIMM4_2), RM6}}, | ||
304 | { "mov_lle", 0xf7e00003, 0xffff000f, 0x22, FMT_D10, AM33, {MEMINC2 (RN4,SIMM4_2), RM6}}, | ||
305 | { "mov_lcs", 0xf7e00004, 0xffff000f, 0x22, FMT_D10, AM33, {MEMINC2 (RN4,SIMM4_2), RM6}}, | ||
306 | { "mov_lhi", 0xf7e00005, 0xffff000f, 0x22, FMT_D10, AM33, {MEMINC2 (RN4,SIMM4_2), RM6}}, | ||
307 | { "mov_lcc", 0xf7e00006, 0xffff000f, 0x22, FMT_D10, AM33, {MEMINC2 (RN4,SIMM4_2), RM6}}, | ||
308 | { "mov_lls", 0xf7e00007, 0xffff000f, 0x22, FMT_D10, AM33, {MEMINC2 (RN4,SIMM4_2), RM6}}, | ||
309 | { "mov_leq", 0xf7e00008, 0xffff000f, 0x22, FMT_D10, AM33, {MEMINC2 (RN4,SIMM4_2), RM6}}, | ||
310 | { "mov_lne", 0xf7e00009, 0xffff000f, 0x22, FMT_D10, AM33, {MEMINC2 (RN4,SIMM4_2), RM6}}, | ||
311 | { "mov_lra", 0xf7e0000a, 0xffff000f, 0x22, FMT_D10, AM33, {MEMINC2 (RN4,SIMM4_2), RM6}}, | ||
312 | |||
313 | { "", 0, 0, 0, 0, 0, {0}}, | ||
258 | }; | 314 | }; |
259 | 315 | ||
260 | /* | 316 | /* |
@@ -265,18 +321,21 @@ asmlinkage void misalignment(struct pt_regs *regs, enum exception_code code) | |||
265 | const struct exception_table_entry *fixup; | 321 | const struct exception_table_entry *fixup; |
266 | const struct mn10300_opcode *pop; | 322 | const struct mn10300_opcode *pop; |
267 | unsigned long *registers = (unsigned long *) regs; | 323 | unsigned long *registers = (unsigned long *) regs; |
268 | unsigned long data, *store, *postinc; | 324 | unsigned long data, *store, *postinc, disp, inc, sp; |
269 | mm_segment_t seg; | 325 | mm_segment_t seg; |
270 | siginfo_t info; | 326 | siginfo_t info; |
271 | uint32_t opcode, disp, noc, xo, xm; | 327 | uint32_t opcode, noc, xo, xm; |
272 | uint8_t *pc, byte; | 328 | uint8_t *pc, byte, datasz; |
273 | void *address; | 329 | void *address; |
274 | unsigned tmp, npop; | 330 | unsigned tmp, npop, dispsz, loop; |
331 | |||
332 | /* we don't fix up userspace misalignment faults */ | ||
333 | if (user_mode(regs)) | ||
334 | goto bus_error; | ||
275 | 335 | ||
276 | kdebug("MISALIGN at %lx\n", regs->pc); | 336 | sp = (unsigned long) regs + sizeof(*regs); |
277 | 337 | ||
278 | if (in_interrupt()) | 338 | kdebug("==>misalignment({pc=%lx,sp=%lx})", regs->pc, sp); |
279 | die("Misalignment trap in interrupt context", regs, code); | ||
280 | 339 | ||
281 | if (regs->epsw & EPSW_IE) | 340 | if (regs->epsw & EPSW_IE) |
282 | asm volatile("or %0,epsw" : : "i"(EPSW_IE)); | 341 | asm volatile("or %0,epsw" : : "i"(EPSW_IE)); |
@@ -294,8 +353,8 @@ asmlinkage void misalignment(struct pt_regs *regs, enum exception_code code) | |||
294 | opcode = byte; | 353 | opcode = byte; |
295 | noc = 8; | 354 | noc = 8; |
296 | 355 | ||
297 | for (pop = mn10300_opcodes; pop->name; pop++) { | 356 | for (pop = mn10300_opcodes; pop->name[0]; pop++) { |
298 | npop = log2(pop->opcode | pop->opmask); | 357 | npop = ilog2(pop->opcode | pop->opmask); |
299 | if (npop <= 0 || npop > 31) | 358 | if (npop <= 0 || npop > 31) |
300 | continue; | 359 | continue; |
301 | npop = (npop + 8) & ~7; | 360 | npop = (npop + 8) & ~7; |
@@ -328,15 +387,15 @@ asmlinkage void misalignment(struct pt_regs *regs, enum exception_code code) | |||
328 | } | 387 | } |
329 | 388 | ||
330 | /* didn't manage to find a fixup */ | 389 | /* didn't manage to find a fixup */ |
331 | if (!user_mode(regs)) | 390 | printk(KERN_CRIT "MISALIGN: %lx: unsupported instruction %x\n", |
332 | printk(KERN_CRIT "MISALIGN: %lx: unsupported instruction %x\n", | 391 | regs->pc, opcode); |
333 | regs->pc, opcode); | ||
334 | 392 | ||
335 | failed: | 393 | failed: |
336 | set_fs(seg); | 394 | set_fs(seg); |
337 | if (die_if_no_fixup("misalignment error", regs, code)) | 395 | if (die_if_no_fixup("misalignment error", regs, code)) |
338 | return; | 396 | return; |
339 | 397 | ||
398 | bus_error: | ||
340 | info.si_signo = SIGBUS; | 399 | info.si_signo = SIGBUS; |
341 | info.si_errno = 0; | 400 | info.si_errno = 0; |
342 | info.si_code = BUS_ADRALN; | 401 | info.si_code = BUS_ADRALN; |
@@ -346,31 +405,27 @@ failed: | |||
346 | 405 | ||
347 | /* error reading opcodes */ | 406 | /* error reading opcodes */ |
348 | fetch_error: | 407 | fetch_error: |
349 | if (!user_mode(regs)) | 408 | printk(KERN_CRIT |
350 | printk(KERN_CRIT | 409 | "MISALIGN: %p: fault whilst reading instruction data\n", |
351 | "MISALIGN: %p: fault whilst reading instruction data\n", | 410 | pc); |
352 | pc); | ||
353 | goto failed; | 411 | goto failed; |
354 | 412 | ||
355 | bad_addr_mode: | 413 | bad_addr_mode: |
356 | if (!user_mode(regs)) | 414 | printk(KERN_CRIT |
357 | printk(KERN_CRIT | 415 | "MISALIGN: %lx: unsupported addressing mode %x\n", |
358 | "MISALIGN: %lx: unsupported addressing mode %x\n", | 416 | regs->pc, opcode); |
359 | regs->pc, opcode); | ||
360 | goto failed; | 417 | goto failed; |
361 | 418 | ||
362 | bad_reg_mode: | 419 | bad_reg_mode: |
363 | if (!user_mode(regs)) | 420 | printk(KERN_CRIT |
364 | printk(KERN_CRIT | 421 | "MISALIGN: %lx: unsupported register mode %x\n", |
365 | "MISALIGN: %lx: unsupported register mode %x\n", | 422 | regs->pc, opcode); |
366 | regs->pc, opcode); | ||
367 | goto failed; | 423 | goto failed; |
368 | 424 | ||
369 | unsupported_instruction: | 425 | unsupported_instruction: |
370 | if (!user_mode(regs)) | 426 | printk(KERN_CRIT |
371 | printk(KERN_CRIT | 427 | "MISALIGN: %lx: unsupported instruction %x (%s)\n", |
372 | "MISALIGN: %lx: unsupported instruction %x (%s)\n", | 428 | regs->pc, opcode, pop->name); |
373 | regs->pc, opcode, pop->name); | ||
374 | goto failed; | 429 | goto failed; |
375 | 430 | ||
376 | transfer_failed: | 431 | transfer_failed: |
@@ -391,7 +446,7 @@ transfer_failed: | |||
391 | 446 | ||
392 | /* we matched the opcode */ | 447 | /* we matched the opcode */ |
393 | found_opcode: | 448 | found_opcode: |
394 | kdebug("MISALIGN: %lx: %x==%x { %x, %x }\n", | 449 | kdebug("%lx: %x==%x { %x, %x }", |
395 | regs->pc, opcode, pop->opcode, pop->params[0], pop->params[1]); | 450 | regs->pc, opcode, pop->opcode, pop->params[0], pop->params[1]); |
396 | 451 | ||
397 | tmp = format_tbl[pop->format].opsz; | 452 | tmp = format_tbl[pop->format].opsz; |
@@ -406,106 +461,108 @@ found_opcode: | |||
406 | 461 | ||
407 | /* grab the extra displacement (note it's LSB first) */ | 462 | /* grab the extra displacement (note it's LSB first) */ |
408 | disp = 0; | 463 | disp = 0; |
409 | tmp = format_tbl[pop->format].dispsz >> 3; | 464 | dispsz = format_tbl[pop->format].dispsz; |
410 | while (tmp > 0) { | 465 | for (loop = 0; loop < dispsz; loop += 8) { |
411 | tmp--; | ||
412 | disp <<= 8; | ||
413 | |||
414 | pc++; | 466 | pc++; |
415 | if (__get_user(byte, pc) != 0) | 467 | if (__get_user(byte, pc) != 0) |
416 | goto fetch_error; | 468 | goto fetch_error; |
417 | disp |= byte; | 469 | disp |= byte << loop; |
470 | kdebug("{%p} disp[%02x]=%02x", pc, loop, byte); | ||
418 | } | 471 | } |
419 | 472 | ||
473 | kdebug("disp=%lx", disp); | ||
474 | |||
420 | set_fs(KERNEL_XDS); | 475 | set_fs(KERNEL_XDS); |
421 | if (fixup || regs->epsw & EPSW_nSL) | 476 | if (fixup) |
422 | set_fs(seg); | 477 | set_fs(seg); |
423 | 478 | ||
424 | tmp = (pop->params[0] ^ pop->params[1]) & 0x80000000; | 479 | tmp = (pop->params[0] ^ pop->params[1]) & 0x80000000; |
425 | if (!tmp) { | 480 | if (!tmp) { |
426 | if (!user_mode(regs)) | 481 | printk(KERN_CRIT |
427 | printk(KERN_CRIT | 482 | "MISALIGN: %lx: insn not move to/from memory %x\n", |
428 | "MISALIGN: %lx:" | 483 | regs->pc, opcode); |
429 | " insn not move to/from memory %x\n", | ||
430 | regs->pc, opcode); | ||
431 | goto failed; | 484 | goto failed; |
432 | } | 485 | } |
433 | 486 | ||
487 | /* determine the data transfer size of the move */ | ||
488 | if (pop->name[3] == 0 || /* "mov" */ | ||
489 | pop->name[4] == 'l') /* mov_lcc */ | ||
490 | inc = datasz = 4; | ||
491 | else if (pop->name[3] == 'h') /* movhu */ | ||
492 | inc = datasz = 2; | ||
493 | else | ||
494 | goto unsupported_instruction; | ||
495 | |||
434 | if (pop->params[0] & 0x80000000) { | 496 | if (pop->params[0] & 0x80000000) { |
435 | /* move memory to register */ | 497 | /* move memory to register */ |
436 | if (!misalignment_addr(registers, pop->params[0], opcode, disp, | 498 | if (!misalignment_addr(registers, sp, |
437 | &address, &postinc)) | 499 | pop->params[0], opcode, disp, |
500 | &address, &postinc, &inc)) | ||
438 | goto bad_addr_mode; | 501 | goto bad_addr_mode; |
439 | 502 | ||
440 | if (!misalignment_reg(registers, pop->params[1], opcode, disp, | 503 | if (!misalignment_reg(registers, pop->params[1], opcode, disp, |
441 | &store)) | 504 | &store)) |
442 | goto bad_reg_mode; | 505 | goto bad_reg_mode; |
443 | 506 | ||
444 | if (strcmp(pop->name, "mov") == 0) { | 507 | kdebug("mov%u (%p),DARn", datasz, address); |
445 | kdebug("FIXUP: mov (%p),DARn\n", address); | 508 | if (copy_from_user(&data, (void *) address, datasz) != 0) |
446 | if (copy_from_user(&data, (void *) address, 4) != 0) | 509 | goto transfer_failed; |
447 | goto transfer_failed; | 510 | if (pop->params[0] & 0x1000000) { |
448 | if (pop->params[0] & 0x1000000) | 511 | kdebug("inc=%lx", inc); |
449 | *postinc += 4; | 512 | *postinc += inc; |
450 | } else if (strcmp(pop->name, "movhu") == 0) { | ||
451 | kdebug("FIXUP: movhu (%p),DARn\n", address); | ||
452 | data = 0; | ||
453 | if (copy_from_user(&data, (void *) address, 2) != 0) | ||
454 | goto transfer_failed; | ||
455 | if (pop->params[0] & 0x1000000) | ||
456 | *postinc += 2; | ||
457 | } else { | ||
458 | goto unsupported_instruction; | ||
459 | } | 513 | } |
460 | 514 | ||
461 | *store = data; | 515 | *store = data; |
516 | kdebug("loaded %lx", data); | ||
462 | } else { | 517 | } else { |
463 | /* move register to memory */ | 518 | /* move register to memory */ |
464 | if (!misalignment_reg(registers, pop->params[0], opcode, disp, | 519 | if (!misalignment_reg(registers, pop->params[0], opcode, disp, |
465 | &store)) | 520 | &store)) |
466 | goto bad_reg_mode; | 521 | goto bad_reg_mode; |
467 | 522 | ||
468 | if (!misalignment_addr(registers, pop->params[1], opcode, disp, | 523 | if (!misalignment_addr(registers, sp, |
469 | &address, &postinc)) | 524 | pop->params[1], opcode, disp, |
525 | &address, &postinc, &inc)) | ||
470 | goto bad_addr_mode; | 526 | goto bad_addr_mode; |
471 | 527 | ||
472 | data = *store; | 528 | data = *store; |
473 | 529 | ||
474 | if (strcmp(pop->name, "mov") == 0) { | 530 | kdebug("mov%u %lx,(%p)", datasz, data, address); |
475 | kdebug("FIXUP: mov %lx,(%p)\n", data, address); | 531 | if (copy_to_user((void *) address, &data, datasz) != 0) |
476 | if (copy_to_user((void *) address, &data, 4) != 0) | 532 | goto transfer_failed; |
477 | goto transfer_failed; | 533 | if (pop->params[1] & 0x1000000) |
478 | if (pop->params[1] & 0x1000000) | 534 | *postinc += inc; |
479 | *postinc += 4; | ||
480 | } else if (strcmp(pop->name, "movhu") == 0) { | ||
481 | kdebug("FIXUP: movhu %hx,(%p)\n", | ||
482 | (uint16_t) data, address); | ||
483 | if (copy_to_user((void *) address, &data, 2) != 0) | ||
484 | goto transfer_failed; | ||
485 | if (pop->params[1] & 0x1000000) | ||
486 | *postinc += 2; | ||
487 | } else { | ||
488 | goto unsupported_instruction; | ||
489 | } | ||
490 | } | 535 | } |
491 | 536 | ||
492 | tmp = format_tbl[pop->format].opsz + format_tbl[pop->format].dispsz; | 537 | tmp = format_tbl[pop->format].opsz + format_tbl[pop->format].dispsz; |
493 | regs->pc += tmp >> 3; | 538 | regs->pc += tmp >> 3; |
494 | 539 | ||
540 | /* handle MOV_Lcc, which are currently the only FMT_D10 insns that | ||
541 | * access memory */ | ||
542 | if (pop->format == FMT_D10) | ||
543 | misalignment_MOV_Lcc(regs, opcode); | ||
544 | |||
495 | set_fs(seg); | 545 | set_fs(seg); |
496 | return; | ||
497 | } | 546 | } |
498 | 547 | ||
499 | /* | 548 | /* |
500 | * determine the address that was being accessed | 549 | * determine the address that was being accessed |
501 | */ | 550 | */ |
502 | static int misalignment_addr(unsigned long *registers, unsigned params, | 551 | static int misalignment_addr(unsigned long *registers, unsigned long sp, |
503 | unsigned opcode, unsigned disp, | 552 | unsigned params, unsigned opcode, |
504 | void **_address, unsigned long **_postinc) | 553 | unsigned long disp, |
554 | void **_address, unsigned long **_postinc, | ||
555 | unsigned long *_inc) | ||
505 | { | 556 | { |
506 | unsigned long *postinc = NULL, address = 0, tmp; | 557 | unsigned long *postinc = NULL, address = 0, tmp; |
507 | 558 | ||
508 | params &= 0x7fffffff; | 559 | if (!(params & 0x1000000)) { |
560 | kdebug("noinc"); | ||
561 | *_inc = 0; | ||
562 | _inc = NULL; | ||
563 | } | ||
564 | |||
565 | params &= 0x00ffffff; | ||
509 | 566 | ||
510 | do { | 567 | do { |
511 | switch (params & 0xff) { | 568 | switch (params & 0xff) { |
@@ -514,11 +571,11 @@ static int misalignment_addr(unsigned long *registers, unsigned params, | |||
514 | address += *postinc; | 571 | address += *postinc; |
515 | break; | 572 | break; |
516 | case DM1: | 573 | case DM1: |
517 | postinc = ®isters[Dreg_index[opcode >> 2 & 0x0c]]; | 574 | postinc = ®isters[Dreg_index[opcode >> 2 & 0x03]]; |
518 | address += *postinc; | 575 | address += *postinc; |
519 | break; | 576 | break; |
520 | case DM2: | 577 | case DM2: |
521 | postinc = ®isters[Dreg_index[opcode >> 4 & 0x30]]; | 578 | postinc = ®isters[Dreg_index[opcode >> 4 & 0x03]]; |
522 | address += *postinc; | 579 | address += *postinc; |
523 | break; | 580 | break; |
524 | case AM0: | 581 | case AM0: |
@@ -526,11 +583,11 @@ static int misalignment_addr(unsigned long *registers, unsigned params, | |||
526 | address += *postinc; | 583 | address += *postinc; |
527 | break; | 584 | break; |
528 | case AM1: | 585 | case AM1: |
529 | postinc = ®isters[Areg_index[opcode >> 2 & 0x0c]]; | 586 | postinc = ®isters[Areg_index[opcode >> 2 & 0x03]]; |
530 | address += *postinc; | 587 | address += *postinc; |
531 | break; | 588 | break; |
532 | case AM2: | 589 | case AM2: |
533 | postinc = ®isters[Areg_index[opcode >> 4 & 0x30]]; | 590 | postinc = ®isters[Areg_index[opcode >> 4 & 0x03]]; |
534 | address += *postinc; | 591 | address += *postinc; |
535 | break; | 592 | break; |
536 | case RM0: | 593 | case RM0: |
@@ -561,33 +618,53 @@ static int misalignment_addr(unsigned long *registers, unsigned params, | |||
561 | postinc = ®isters[Rreg_index[disp >> 4 & 0x0f]]; | 618 | postinc = ®isters[Rreg_index[disp >> 4 & 0x0f]]; |
562 | address += *postinc; | 619 | address += *postinc; |
563 | break; | 620 | break; |
621 | case SP: | ||
622 | address += sp; | ||
623 | break; | ||
564 | 624 | ||
625 | /* displacements are either to be added to the address | ||
626 | * before use, or, in the case of post-inc addressing, | ||
627 | * to be added into the base register after use */ | ||
565 | case SD8: | 628 | case SD8: |
566 | case SIMM8: | 629 | case SIMM8: |
567 | address += (int32_t) (int8_t) (disp & 0xff); | 630 | disp = (long) (int8_t) (disp & 0xff); |
568 | break; | 631 | goto displace_or_inc; |
569 | case SD16: | 632 | case SD16: |
570 | address += (int32_t) (int16_t) (disp & 0xffff); | 633 | disp = (long) (int16_t) (disp & 0xffff); |
571 | break; | 634 | goto displace_or_inc; |
572 | case SD24: | 635 | case SD24: |
573 | tmp = disp << 8; | 636 | tmp = disp << 8; |
574 | asm("asr 8,%0" : "=r"(tmp) : "0"(tmp)); | 637 | asm("asr 8,%0" : "=r"(tmp) : "0"(tmp)); |
575 | address += tmp; | 638 | disp = (long) tmp; |
576 | break; | 639 | goto displace_or_inc; |
577 | case SIMM4_2: | 640 | case SIMM4_2: |
578 | tmp = opcode >> 4 & 0x0f; | 641 | tmp = opcode >> 4 & 0x0f; |
579 | tmp <<= 28; | 642 | tmp <<= 28; |
580 | asm("asr 28,%0" : "=r"(tmp) : "0"(tmp)); | 643 | asm("asr 28,%0" : "=r"(tmp) : "0"(tmp)); |
581 | address += tmp; | 644 | disp = (long) tmp; |
582 | break; | 645 | goto displace_or_inc; |
646 | case IMM8: | ||
647 | disp &= 0x000000ff; | ||
648 | goto displace_or_inc; | ||
649 | case IMM16: | ||
650 | disp &= 0x0000ffff; | ||
651 | goto displace_or_inc; | ||
583 | case IMM24: | 652 | case IMM24: |
584 | address += disp & 0x00ffffff; | 653 | disp &= 0x00ffffff; |
585 | break; | 654 | goto displace_or_inc; |
586 | case IMM32: | 655 | case IMM32: |
656 | case IMM32_MEM: | ||
587 | case IMM32_HIGH8: | 657 | case IMM32_HIGH8: |
588 | address += disp; | 658 | case IMM32_HIGH8_MEM: |
659 | displace_or_inc: | ||
660 | kdebug("%s %lx", _inc ? "incr" : "disp", disp); | ||
661 | if (!_inc) | ||
662 | address += disp; | ||
663 | else | ||
664 | *_inc = disp; | ||
589 | break; | 665 | break; |
590 | default: | 666 | default: |
667 | BUG(); | ||
591 | return 0; | 668 | return 0; |
592 | } | 669 | } |
593 | } while ((params >>= 8)); | 670 | } while ((params >>= 8)); |
@@ -601,7 +678,7 @@ static int misalignment_addr(unsigned long *registers, unsigned params, | |||
601 | * determine the register that is acting as source/dest | 678 | * determine the register that is acting as source/dest |
602 | */ | 679 | */ |
603 | static int misalignment_reg(unsigned long *registers, unsigned params, | 680 | static int misalignment_reg(unsigned long *registers, unsigned params, |
604 | unsigned opcode, unsigned disp, | 681 | unsigned opcode, unsigned long disp, |
605 | unsigned long **_register) | 682 | unsigned long **_register) |
606 | { | 683 | { |
607 | params &= 0x7fffffff; | 684 | params &= 0x7fffffff; |
@@ -654,8 +731,239 @@ static int misalignment_reg(unsigned long *registers, unsigned params, | |||
654 | break; | 731 | break; |
655 | 732 | ||
656 | default: | 733 | default: |
734 | BUG(); | ||
657 | return 0; | 735 | return 0; |
658 | } | 736 | } |
659 | 737 | ||
660 | return 1; | 738 | return 1; |
661 | } | 739 | } |
740 | |||
741 | /* | ||
742 | * handle the conditional loop part of the move-and-loop instructions | ||
743 | */ | ||
744 | static void misalignment_MOV_Lcc(struct pt_regs *regs, uint32_t opcode) | ||
745 | { | ||
746 | unsigned long epsw = regs->epsw; | ||
747 | unsigned long NxorV; | ||
748 | |||
749 | kdebug("MOV_Lcc %x [flags=%lx]", opcode, epsw & 0xf); | ||
750 | |||
751 | /* calculate N^V and shift onto the same bit position as Z */ | ||
752 | NxorV = ((epsw >> 3) ^ epsw >> 1) & 1; | ||
753 | |||
754 | switch (opcode & 0xf) { | ||
755 | case 0x0: /* MOV_LLT: N^V */ | ||
756 | if (NxorV) | ||
757 | goto take_the_loop; | ||
758 | return; | ||
759 | case 0x1: /* MOV_LGT: ~(Z or (N^V))*/ | ||
760 | if (!((epsw & EPSW_FLAG_Z) | NxorV)) | ||
761 | goto take_the_loop; | ||
762 | return; | ||
763 | case 0x2: /* MOV_LGE: ~(N^V) */ | ||
764 | if (!NxorV) | ||
765 | goto take_the_loop; | ||
766 | return; | ||
767 | case 0x3: /* MOV_LLE: Z or (N^V) */ | ||
768 | if ((epsw & EPSW_FLAG_Z) | NxorV) | ||
769 | goto take_the_loop; | ||
770 | return; | ||
771 | |||
772 | case 0x4: /* MOV_LCS: C */ | ||
773 | if (epsw & EPSW_FLAG_C) | ||
774 | goto take_the_loop; | ||
775 | return; | ||
776 | case 0x5: /* MOV_LHI: ~(C or Z) */ | ||
777 | if (!(epsw & (EPSW_FLAG_C | EPSW_FLAG_Z))) | ||
778 | goto take_the_loop; | ||
779 | return; | ||
780 | case 0x6: /* MOV_LCC: ~C */ | ||
781 | if (!(epsw & EPSW_FLAG_C)) | ||
782 | goto take_the_loop; | ||
783 | return; | ||
784 | case 0x7: /* MOV_LLS: C or Z */ | ||
785 | if (epsw & (EPSW_FLAG_C | EPSW_FLAG_Z)) | ||
786 | goto take_the_loop; | ||
787 | return; | ||
788 | |||
789 | case 0x8: /* MOV_LEQ: Z */ | ||
790 | if (epsw & EPSW_FLAG_Z) | ||
791 | goto take_the_loop; | ||
792 | return; | ||
793 | case 0x9: /* MOV_LNE: ~Z */ | ||
794 | if (!(epsw & EPSW_FLAG_Z)) | ||
795 | goto take_the_loop; | ||
796 | return; | ||
797 | case 0xa: /* MOV_LRA: always */ | ||
798 | goto take_the_loop; | ||
799 | |||
800 | default: | ||
801 | BUG(); | ||
802 | } | ||
803 | |||
804 | take_the_loop: | ||
805 | /* wind the PC back to just after the SETLB insn */ | ||
806 | kdebug("loop LAR=%lx", regs->lar); | ||
807 | regs->pc = regs->lar - 4; | ||
808 | } | ||
809 | |||
810 | /* | ||
811 | * misalignment handler tests | ||
812 | */ | ||
813 | #ifdef CONFIG_TEST_MISALIGNMENT_HANDLER | ||
814 | static u8 __initdata testbuf[512] __attribute__((aligned(16))) = { | ||
815 | [257] = 0x11, | ||
816 | [258] = 0x22, | ||
817 | [259] = 0x33, | ||
818 | [260] = 0x44, | ||
819 | }; | ||
820 | |||
821 | #define ASSERTCMP(X, OP, Y) \ | ||
822 | do { \ | ||
823 | if (unlikely(!((X) OP (Y)))) { \ | ||
824 | printk(KERN_ERR "\n"); \ | ||
825 | printk(KERN_ERR "MISALIGN: Assertion failed at line %u\n", \ | ||
826 | __LINE__); \ | ||
827 | printk(KERN_ERR "0x%lx " #OP " 0x%lx is false\n", \ | ||
828 | (unsigned long)(X), (unsigned long)(Y)); \ | ||
829 | BUG(); \ | ||
830 | } \ | ||
831 | } while(0) | ||
832 | |||
833 | static int __init test_misalignment(void) | ||
834 | { | ||
835 | register void *r asm("e0"); | ||
836 | register u32 y asm("e1"); | ||
837 | void *p = testbuf, *q; | ||
838 | u32 tmp, tmp2, x; | ||
839 | |||
840 | printk(KERN_NOTICE "==>test_misalignment() [testbuf=%p]\n", p); | ||
841 | p++; | ||
842 | |||
843 | printk(KERN_NOTICE "___ MOV (Am),Dn ___\n"); | ||
844 | q = p + 256; | ||
845 | asm volatile("mov (%0),%1" : "+a"(q), "=d"(x)); | ||
846 | ASSERTCMP(q, ==, p + 256); | ||
847 | ASSERTCMP(x, ==, 0x44332211); | ||
848 | |||
849 | printk(KERN_NOTICE "___ MOV (256,Am),Dn ___\n"); | ||
850 | q = p; | ||
851 | asm volatile("mov (256,%0),%1" : "+a"(q), "=d"(x)); | ||
852 | ASSERTCMP(q, ==, p); | ||
853 | ASSERTCMP(x, ==, 0x44332211); | ||
854 | |||
855 | printk(KERN_NOTICE "___ MOV (Di,Am),Dn ___\n"); | ||
856 | tmp = 256; | ||
857 | q = p; | ||
858 | asm volatile("mov (%2,%0),%1" : "+a"(q), "=d"(x), "+d"(tmp)); | ||
859 | ASSERTCMP(q, ==, p); | ||
860 | ASSERTCMP(x, ==, 0x44332211); | ||
861 | ASSERTCMP(tmp, ==, 256); | ||
862 | |||
863 | printk(KERN_NOTICE "___ MOV (256,Rm),Rn ___\n"); | ||
864 | r = p; | ||
865 | asm volatile("mov (256,%0),%1" : "+r"(r), "=r"(y)); | ||
866 | ASSERTCMP(r, ==, p); | ||
867 | ASSERTCMP(y, ==, 0x44332211); | ||
868 | |||
869 | printk(KERN_NOTICE "___ MOV (Rm+),Rn ___\n"); | ||
870 | r = p + 256; | ||
871 | asm volatile("mov (%0+),%1" : "+r"(r), "=r"(y)); | ||
872 | ASSERTCMP(r, ==, p + 256 + 4); | ||
873 | ASSERTCMP(y, ==, 0x44332211); | ||
874 | |||
875 | printk(KERN_NOTICE "___ MOV (Rm+,8),Rn ___\n"); | ||
876 | r = p + 256; | ||
877 | asm volatile("mov (%0+,8),%1" : "+r"(r), "=r"(y)); | ||
878 | ASSERTCMP(r, ==, p + 256 + 8); | ||
879 | ASSERTCMP(y, ==, 0x44332211); | ||
880 | |||
881 | printk(KERN_NOTICE "___ MOV (7,SP),Rn ___\n"); | ||
882 | asm volatile( | ||
883 | "add -16,sp \n" | ||
884 | "mov +0x11,%0 \n" | ||
885 | "movbu %0,(7,sp) \n" | ||
886 | "mov +0x22,%0 \n" | ||
887 | "movbu %0,(8,sp) \n" | ||
888 | "mov +0x33,%0 \n" | ||
889 | "movbu %0,(9,sp) \n" | ||
890 | "mov +0x44,%0 \n" | ||
891 | "movbu %0,(10,sp) \n" | ||
892 | "mov (7,sp),%1 \n" | ||
893 | "add +16,sp \n" | ||
894 | : "+a"(q), "=d"(x)); | ||
895 | ASSERTCMP(x, ==, 0x44332211); | ||
896 | |||
897 | printk(KERN_NOTICE "___ MOV (259,SP),Rn ___\n"); | ||
898 | asm volatile( | ||
899 | "add -264,sp \n" | ||
900 | "mov +0x11,%0 \n" | ||
901 | "movbu %0,(259,sp) \n" | ||
902 | "mov +0x22,%0 \n" | ||
903 | "movbu %0,(260,sp) \n" | ||
904 | "mov +0x33,%0 \n" | ||
905 | "movbu %0,(261,sp) \n" | ||
906 | "mov +0x55,%0 \n" | ||
907 | "movbu %0,(262,sp) \n" | ||
908 | "mov (259,sp),%1 \n" | ||
909 | "add +264,sp \n" | ||
910 | : "+d"(tmp), "=d"(x)); | ||
911 | ASSERTCMP(x, ==, 0x55332211); | ||
912 | |||
913 | printk(KERN_NOTICE "___ MOV (260,SP),Rn ___\n"); | ||
914 | asm volatile( | ||
915 | "add -264,sp \n" | ||
916 | "mov +0x11,%0 \n" | ||
917 | "movbu %0,(260,sp) \n" | ||
918 | "mov +0x22,%0 \n" | ||
919 | "movbu %0,(261,sp) \n" | ||
920 | "mov +0x33,%0 \n" | ||
921 | "movbu %0,(262,sp) \n" | ||
922 | "mov +0x55,%0 \n" | ||
923 | "movbu %0,(263,sp) \n" | ||
924 | "mov (260,sp),%1 \n" | ||
925 | "add +264,sp \n" | ||
926 | : "+d"(tmp), "=d"(x)); | ||
927 | ASSERTCMP(x, ==, 0x55332211); | ||
928 | |||
929 | |||
930 | printk(KERN_NOTICE "___ MOV_LNE ___\n"); | ||
931 | tmp = 1; | ||
932 | tmp2 = 2; | ||
933 | q = p + 256; | ||
934 | asm volatile( | ||
935 | "setlb \n" | ||
936 | "mov %2,%3 \n" | ||
937 | "mov %1,%2 \n" | ||
938 | "cmp +0,%1 \n" | ||
939 | "mov_lne (%0+,4),%1" | ||
940 | : "+r"(q), "+d"(tmp), "+d"(tmp2), "=d"(x) | ||
941 | : | ||
942 | : "cc"); | ||
943 | ASSERTCMP(q, ==, p + 256 + 12); | ||
944 | ASSERTCMP(x, ==, 0x44332211); | ||
945 | |||
946 | printk(KERN_NOTICE "___ MOV in SETLB ___\n"); | ||
947 | tmp = 1; | ||
948 | tmp2 = 2; | ||
949 | q = p + 256; | ||
950 | asm volatile( | ||
951 | "setlb \n" | ||
952 | "mov %1,%3 \n" | ||
953 | "mov (%0+),%1 \n" | ||
954 | "cmp +0,%1 \n" | ||
955 | "lne " | ||
956 | : "+a"(q), "+d"(tmp), "+d"(tmp2), "=d"(x) | ||
957 | : | ||
958 | : "cc"); | ||
959 | |||
960 | ASSERTCMP(q, ==, p + 256 + 8); | ||
961 | ASSERTCMP(x, ==, 0x44332211); | ||
962 | |||
963 | printk(KERN_NOTICE "<==test_misalignment()\n"); | ||
964 | return 0; | ||
965 | } | ||
966 | |||
967 | arch_initcall(test_misalignment); | ||
968 | |||
969 | #endif /* CONFIG_TEST_MISALIGNMENT_HANDLER */ | ||
diff --git a/arch/parisc/include/asm/parisc-device.h b/arch/parisc/include/asm/parisc-device.h index 7aa13f2add7a..9afdad6c2ffb 100644 --- a/arch/parisc/include/asm/parisc-device.h +++ b/arch/parisc/include/asm/parisc-device.h | |||
@@ -42,9 +42,9 @@ struct parisc_driver { | |||
42 | #define to_parisc_driver(d) container_of(d, struct parisc_driver, drv) | 42 | #define to_parisc_driver(d) container_of(d, struct parisc_driver, drv) |
43 | #define parisc_parent(d) to_parisc_device(d->dev.parent) | 43 | #define parisc_parent(d) to_parisc_device(d->dev.parent) |
44 | 44 | ||
45 | static inline char *parisc_pathname(struct parisc_device *d) | 45 | static inline const char *parisc_pathname(struct parisc_device *d) |
46 | { | 46 | { |
47 | return d->dev.bus_id; | 47 | return dev_name(&d->dev); |
48 | } | 48 | } |
49 | 49 | ||
50 | static inline void | 50 | static inline void |
diff --git a/arch/parisc/include/asm/posix_types.h b/arch/parisc/include/asm/posix_types.h index bb725a6630bb..00da29a340ba 100644 --- a/arch/parisc/include/asm/posix_types.h +++ b/arch/parisc/include/asm/posix_types.h | |||
@@ -24,13 +24,12 @@ typedef int __kernel_daddr_t; | |||
24 | typedef unsigned long __kernel_size_t; | 24 | typedef unsigned long __kernel_size_t; |
25 | typedef long __kernel_ssize_t; | 25 | typedef long __kernel_ssize_t; |
26 | typedef long __kernel_ptrdiff_t; | 26 | typedef long __kernel_ptrdiff_t; |
27 | typedef long __kernel_time_t; | ||
28 | #else | 27 | #else |
29 | typedef unsigned int __kernel_size_t; | 28 | typedef unsigned int __kernel_size_t; |
30 | typedef int __kernel_ssize_t; | 29 | typedef int __kernel_ssize_t; |
31 | typedef int __kernel_ptrdiff_t; | 30 | typedef int __kernel_ptrdiff_t; |
32 | typedef long __kernel_time_t; | ||
33 | #endif | 31 | #endif |
32 | typedef long __kernel_time_t; | ||
34 | typedef char * __kernel_caddr_t; | 33 | typedef char * __kernel_caddr_t; |
35 | 34 | ||
36 | typedef unsigned short __kernel_uid16_t; | 35 | typedef unsigned short __kernel_uid16_t; |
diff --git a/arch/parisc/include/asm/ptrace.h b/arch/parisc/include/asm/ptrace.h index afa5333187b4..302f68dc889c 100644 --- a/arch/parisc/include/asm/ptrace.h +++ b/arch/parisc/include/asm/ptrace.h | |||
@@ -47,8 +47,6 @@ struct pt_regs { | |||
47 | 47 | ||
48 | #define task_regs(task) ((struct pt_regs *) ((char *)(task) + TASK_REGS)) | 48 | #define task_regs(task) ((struct pt_regs *) ((char *)(task) + TASK_REGS)) |
49 | 49 | ||
50 | #define __ARCH_WANT_COMPAT_SYS_PTRACE | ||
51 | |||
52 | struct task_struct; | 50 | struct task_struct; |
53 | #define arch_has_single_step() 1 | 51 | #define arch_has_single_step() 1 |
54 | void user_disable_single_step(struct task_struct *task); | 52 | void user_disable_single_step(struct task_struct *task); |
diff --git a/arch/parisc/include/asm/smp.h b/arch/parisc/include/asm/smp.h index 398cdbaf4e54..409e698f4361 100644 --- a/arch/parisc/include/asm/smp.h +++ b/arch/parisc/include/asm/smp.h | |||
@@ -44,8 +44,6 @@ extern void arch_send_call_function_ipi(cpumask_t mask); | |||
44 | 44 | ||
45 | #define PROC_CHANGE_PENALTY 15 /* Schedule penalty */ | 45 | #define PROC_CHANGE_PENALTY 15 /* Schedule penalty */ |
46 | 46 | ||
47 | extern unsigned long cpu_present_mask; | ||
48 | |||
49 | #define raw_smp_processor_id() (current_thread_info()->cpu) | 47 | #define raw_smp_processor_id() (current_thread_info()->cpu) |
50 | 48 | ||
51 | #else /* CONFIG_SMP */ | 49 | #else /* CONFIG_SMP */ |
diff --git a/arch/parisc/kernel/drivers.c b/arch/parisc/kernel/drivers.c index 2ca654bd6322..884b7ce16a3b 100644 --- a/arch/parisc/kernel/drivers.c +++ b/arch/parisc/kernel/drivers.c | |||
@@ -43,7 +43,7 @@ struct hppa_dma_ops *hppa_dma_ops __read_mostly; | |||
43 | EXPORT_SYMBOL(hppa_dma_ops); | 43 | EXPORT_SYMBOL(hppa_dma_ops); |
44 | 44 | ||
45 | static struct device root = { | 45 | static struct device root = { |
46 | .bus_id = "parisc", | 46 | .init_name = "parisc", |
47 | }; | 47 | }; |
48 | 48 | ||
49 | static inline int check_dev(struct device *dev) | 49 | static inline int check_dev(struct device *dev) |
@@ -393,7 +393,8 @@ EXPORT_SYMBOL(print_pci_hwpath); | |||
393 | static void setup_bus_id(struct parisc_device *padev) | 393 | static void setup_bus_id(struct parisc_device *padev) |
394 | { | 394 | { |
395 | struct hardware_path path; | 395 | struct hardware_path path; |
396 | char *output = padev->dev.bus_id; | 396 | char name[20]; |
397 | char *output = name; | ||
397 | int i; | 398 | int i; |
398 | 399 | ||
399 | get_node_path(padev->dev.parent, &path); | 400 | get_node_path(padev->dev.parent, &path); |
@@ -404,6 +405,7 @@ static void setup_bus_id(struct parisc_device *padev) | |||
404 | output += sprintf(output, "%u:", (unsigned char) path.bc[i]); | 405 | output += sprintf(output, "%u:", (unsigned char) path.bc[i]); |
405 | } | 406 | } |
406 | sprintf(output, "%u", (unsigned char) padev->hw_path); | 407 | sprintf(output, "%u", (unsigned char) padev->hw_path); |
408 | dev_set_name(&padev->dev, name); | ||
407 | } | 409 | } |
408 | 410 | ||
409 | struct parisc_device * create_tree_node(char id, struct device *parent) | 411 | struct parisc_device * create_tree_node(char id, struct device *parent) |
diff --git a/arch/parisc/kernel/ptrace.c b/arch/parisc/kernel/ptrace.c index 90904f9dfc50..927db3668b6f 100644 --- a/arch/parisc/kernel/ptrace.c +++ b/arch/parisc/kernel/ptrace.c | |||
@@ -183,10 +183,10 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
183 | * being 64 bit in both cases. | 183 | * being 64 bit in both cases. |
184 | */ | 184 | */ |
185 | 185 | ||
186 | static long translate_usr_offset(long offset) | 186 | static compat_ulong_t translate_usr_offset(compat_ulong_t offset) |
187 | { | 187 | { |
188 | if (offset < 0) | 188 | if (offset < 0) |
189 | return -1; | 189 | return sizeof(struct pt_regs); |
190 | else if (offset <= 32*4) /* gr[0..31] */ | 190 | else if (offset <= 32*4) /* gr[0..31] */ |
191 | return offset * 2 + 4; | 191 | return offset * 2 + 4; |
192 | else if (offset <= 32*4+32*8) /* gr[0..31] + fr[0..31] */ | 192 | else if (offset <= 32*4+32*8) /* gr[0..31] + fr[0..31] */ |
@@ -194,7 +194,7 @@ static long translate_usr_offset(long offset) | |||
194 | else if (offset < sizeof(struct pt_regs)/2 + 32*4) | 194 | else if (offset < sizeof(struct pt_regs)/2 + 32*4) |
195 | return offset * 2 + 4 - 32*8; | 195 | return offset * 2 + 4 - 32*8; |
196 | else | 196 | else |
197 | return -1; | 197 | return sizeof(struct pt_regs); |
198 | } | 198 | } |
199 | 199 | ||
200 | long compat_arch_ptrace(struct task_struct *child, compat_long_t request, | 200 | long compat_arch_ptrace(struct task_struct *child, compat_long_t request, |
@@ -209,7 +209,7 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, | |||
209 | if (addr & (sizeof(compat_uint_t)-1)) | 209 | if (addr & (sizeof(compat_uint_t)-1)) |
210 | break; | 210 | break; |
211 | addr = translate_usr_offset(addr); | 211 | addr = translate_usr_offset(addr); |
212 | if (addr < 0) | 212 | if (addr >= sizeof(struct pt_regs)) |
213 | break; | 213 | break; |
214 | 214 | ||
215 | tmp = *(compat_uint_t *) ((char *) task_regs(child) + addr); | 215 | tmp = *(compat_uint_t *) ((char *) task_regs(child) + addr); |
@@ -236,7 +236,7 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, | |||
236 | if (addr & (sizeof(compat_uint_t)-1)) | 236 | if (addr & (sizeof(compat_uint_t)-1)) |
237 | break; | 237 | break; |
238 | addr = translate_usr_offset(addr); | 238 | addr = translate_usr_offset(addr); |
239 | if (addr < 0) | 239 | if (addr >= sizeof(struct pt_regs)) |
240 | break; | 240 | break; |
241 | if (addr >= PT_FR0 && addr <= PT_FR31 + 4) { | 241 | if (addr >= PT_FR0 && addr <= PT_FR31 + 4) { |
242 | /* Special case, fp regs are 64 bits anyway */ | 242 | /* Special case, fp regs are 64 bits anyway */ |
diff --git a/arch/parisc/kernel/traps.c b/arch/parisc/kernel/traps.c index 675f1d098f05..4c771cd580ec 100644 --- a/arch/parisc/kernel/traps.c +++ b/arch/parisc/kernel/traps.c | |||
@@ -24,7 +24,6 @@ | |||
24 | #include <linux/init.h> | 24 | #include <linux/init.h> |
25 | #include <linux/interrupt.h> | 25 | #include <linux/interrupt.h> |
26 | #include <linux/console.h> | 26 | #include <linux/console.h> |
27 | #include <linux/kallsyms.h> | ||
28 | #include <linux/bug.h> | 27 | #include <linux/bug.h> |
29 | 28 | ||
30 | #include <asm/assembly.h> | 29 | #include <asm/assembly.h> |
@@ -51,7 +50,7 @@ | |||
51 | DEFINE_SPINLOCK(pa_dbit_lock); | 50 | DEFINE_SPINLOCK(pa_dbit_lock); |
52 | #endif | 51 | #endif |
53 | 52 | ||
54 | void parisc_show_stack(struct task_struct *t, unsigned long *sp, | 53 | static void parisc_show_stack(struct task_struct *task, unsigned long *sp, |
55 | struct pt_regs *regs); | 54 | struct pt_regs *regs); |
56 | 55 | ||
57 | static int printbinary(char *buf, unsigned long x, int nbits) | 56 | static int printbinary(char *buf, unsigned long x, int nbits) |
@@ -121,18 +120,19 @@ static void print_fr(char *level, struct pt_regs *regs) | |||
121 | 120 | ||
122 | void show_regs(struct pt_regs *regs) | 121 | void show_regs(struct pt_regs *regs) |
123 | { | 122 | { |
124 | int i; | 123 | int i, user; |
125 | char *level; | 124 | char *level; |
126 | unsigned long cr30, cr31; | 125 | unsigned long cr30, cr31; |
127 | 126 | ||
128 | level = user_mode(regs) ? KERN_DEBUG : KERN_CRIT; | 127 | user = user_mode(regs); |
128 | level = user ? KERN_DEBUG : KERN_CRIT; | ||
129 | 129 | ||
130 | print_gr(level, regs); | 130 | print_gr(level, regs); |
131 | 131 | ||
132 | for (i = 0; i < 8; i += 4) | 132 | for (i = 0; i < 8; i += 4) |
133 | PRINTREGS(level, regs->sr, "sr", RFMT, i); | 133 | PRINTREGS(level, regs->sr, "sr", RFMT, i); |
134 | 134 | ||
135 | if (user_mode(regs)) | 135 | if (user) |
136 | print_fr(level, regs); | 136 | print_fr(level, regs); |
137 | 137 | ||
138 | cr30 = mfctl(30); | 138 | cr30 = mfctl(30); |
@@ -145,14 +145,18 @@ void show_regs(struct pt_regs *regs) | |||
145 | printk("%s CPU: %8d CR30: " RFMT " CR31: " RFMT "\n", | 145 | printk("%s CPU: %8d CR30: " RFMT " CR31: " RFMT "\n", |
146 | level, current_thread_info()->cpu, cr30, cr31); | 146 | level, current_thread_info()->cpu, cr30, cr31); |
147 | printk("%s ORIG_R28: " RFMT "\n", level, regs->orig_r28); | 147 | printk("%s ORIG_R28: " RFMT "\n", level, regs->orig_r28); |
148 | printk(level); | 148 | |
149 | print_symbol(" IAOQ[0]: %s\n", regs->iaoq[0]); | 149 | if (user) { |
150 | printk(level); | 150 | printk("%s IAOQ[0]: " RFMT "\n", level, regs->iaoq[0]); |
151 | print_symbol(" IAOQ[1]: %s\n", regs->iaoq[1]); | 151 | printk("%s IAOQ[1]: " RFMT "\n", level, regs->iaoq[1]); |
152 | printk(level); | 152 | printk("%s RP(r2): " RFMT "\n", level, regs->gr[2]); |
153 | print_symbol(" RP(r2): %s\n", regs->gr[2]); | 153 | } else { |
154 | 154 | printk("%s IAOQ[0]: %pS\n", level, (void *) regs->iaoq[0]); | |
155 | parisc_show_stack(current, NULL, regs); | 155 | printk("%s IAOQ[1]: %pS\n", level, (void *) regs->iaoq[1]); |
156 | printk("%s RP(r2): %pS\n", level, (void *) regs->gr[2]); | ||
157 | |||
158 | parisc_show_stack(current, NULL, regs); | ||
159 | } | ||
156 | } | 160 | } |
157 | 161 | ||
158 | 162 | ||
@@ -173,20 +177,15 @@ static void do_show_stack(struct unwind_frame_info *info) | |||
173 | break; | 177 | break; |
174 | 178 | ||
175 | if (__kernel_text_address(info->ip)) { | 179 | if (__kernel_text_address(info->ip)) { |
176 | printk("%s [<" RFMT ">] ", (i&0x3)==1 ? KERN_CRIT : "", info->ip); | 180 | printk(KERN_CRIT " [<" RFMT ">] %pS\n", |
177 | #ifdef CONFIG_KALLSYMS | 181 | info->ip, (void *) info->ip); |
178 | print_symbol("%s\n", info->ip); | ||
179 | #else | ||
180 | if ((i & 0x03) == 0) | ||
181 | printk("\n"); | ||
182 | #endif | ||
183 | i++; | 182 | i++; |
184 | } | 183 | } |
185 | } | 184 | } |
186 | printk("\n"); | 185 | printk(KERN_CRIT "\n"); |
187 | } | 186 | } |
188 | 187 | ||
189 | void parisc_show_stack(struct task_struct *task, unsigned long *sp, | 188 | static void parisc_show_stack(struct task_struct *task, unsigned long *sp, |
190 | struct pt_regs *regs) | 189 | struct pt_regs *regs) |
191 | { | 190 | { |
192 | struct unwind_frame_info info; | 191 | struct unwind_frame_info info; |
diff --git a/arch/powerpc/boot/dts/mpc832x_rdb.dts b/arch/powerpc/boot/dts/mpc832x_rdb.dts index 226ff066652b..dea30910c136 100644 --- a/arch/powerpc/boot/dts/mpc832x_rdb.dts +++ b/arch/powerpc/boot/dts/mpc832x_rdb.dts | |||
@@ -18,8 +18,8 @@ | |||
18 | #size-cells = <1>; | 18 | #size-cells = <1>; |
19 | 19 | ||
20 | aliases { | 20 | aliases { |
21 | ethernet0 = &enet0; | 21 | ethernet0 = &enet1; |
22 | ethernet1 = &enet1; | 22 | ethernet1 = &enet0; |
23 | serial0 = &serial0; | 23 | serial0 = &serial0; |
24 | serial1 = &serial1; | 24 | serial1 = &serial1; |
25 | pci0 = &pci0; | 25 | pci0 = &pci0; |
diff --git a/arch/powerpc/boot/dts/mpc8572ds.dts b/arch/powerpc/boot/dts/mpc8572ds.dts index cadd4652a695..5c69b2fafd32 100644 --- a/arch/powerpc/boot/dts/mpc8572ds.dts +++ b/arch/powerpc/boot/dts/mpc8572ds.dts | |||
@@ -90,7 +90,7 @@ | |||
90 | compatible = "fsl,mpc8572-l2-cache-controller"; | 90 | compatible = "fsl,mpc8572-l2-cache-controller"; |
91 | reg = <0x20000 0x1000>; | 91 | reg = <0x20000 0x1000>; |
92 | cache-line-size = <32>; // 32 bytes | 92 | cache-line-size = <32>; // 32 bytes |
93 | cache-size = <0x80000>; // L2, 512K | 93 | cache-size = <0x100000>; // L2, 1M |
94 | interrupt-parent = <&mpic>; | 94 | interrupt-parent = <&mpic>; |
95 | interrupts = <16 2>; | 95 | interrupts = <16 2>; |
96 | }; | 96 | }; |
diff --git a/arch/powerpc/configs/40x/virtex_defconfig b/arch/powerpc/configs/40x/virtex_defconfig new file mode 100644 index 000000000000..9a9350ded292 --- /dev/null +++ b/arch/powerpc/configs/40x/virtex_defconfig | |||
@@ -0,0 +1,1176 @@ | |||
1 | # | ||
2 | # Automatically generated make config: don't edit | ||
3 | # Linux kernel version: 2.6.28-rc4 | ||
4 | # Fri Nov 14 10:49:16 2008 | ||
5 | # | ||
6 | # CONFIG_PPC64 is not set | ||
7 | |||
8 | # | ||
9 | # Processor support | ||
10 | # | ||
11 | # CONFIG_6xx is not set | ||
12 | # CONFIG_PPC_85xx is not set | ||
13 | # CONFIG_PPC_8xx is not set | ||
14 | CONFIG_40x=y | ||
15 | # CONFIG_44x is not set | ||
16 | # CONFIG_E200 is not set | ||
17 | CONFIG_4xx=y | ||
18 | # CONFIG_PPC_MM_SLICES is not set | ||
19 | CONFIG_NOT_COHERENT_CACHE=y | ||
20 | CONFIG_PPC32=y | ||
21 | CONFIG_WORD_SIZE=32 | ||
22 | # CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set | ||
23 | CONFIG_MMU=y | ||
24 | CONFIG_GENERIC_CMOS_UPDATE=y | ||
25 | CONFIG_GENERIC_TIME=y | ||
26 | CONFIG_GENERIC_TIME_VSYSCALL=y | ||
27 | CONFIG_GENERIC_CLOCKEVENTS=y | ||
28 | CONFIG_GENERIC_HARDIRQS=y | ||
29 | # CONFIG_HAVE_SETUP_PER_CPU_AREA is not set | ||
30 | CONFIG_IRQ_PER_CPU=y | ||
31 | CONFIG_STACKTRACE_SUPPORT=y | ||
32 | CONFIG_HAVE_LATENCYTOP_SUPPORT=y | ||
33 | CONFIG_LOCKDEP_SUPPORT=y | ||
34 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y | ||
35 | CONFIG_ARCH_HAS_ILOG2_U32=y | ||
36 | CONFIG_GENERIC_HWEIGHT=y | ||
37 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
38 | CONFIG_GENERIC_FIND_NEXT_BIT=y | ||
39 | CONFIG_GENERIC_GPIO=y | ||
40 | # CONFIG_ARCH_NO_VIRT_TO_BUS is not set | ||
41 | CONFIG_PPC=y | ||
42 | CONFIG_EARLY_PRINTK=y | ||
43 | CONFIG_GENERIC_NVRAM=y | ||
44 | CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y | ||
45 | CONFIG_ARCH_MAY_HAVE_PC_FDC=y | ||
46 | CONFIG_PPC_OF=y | ||
47 | CONFIG_OF=y | ||
48 | CONFIG_PPC_UDBG_16550=y | ||
49 | # CONFIG_GENERIC_TBSYNC is not set | ||
50 | CONFIG_AUDIT_ARCH=y | ||
51 | CONFIG_GENERIC_BUG=y | ||
52 | # CONFIG_DEFAULT_UIMAGE is not set | ||
53 | CONFIG_PPC_DCR_NATIVE=y | ||
54 | # CONFIG_PPC_DCR_MMIO is not set | ||
55 | CONFIG_PPC_DCR=y | ||
56 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | ||
57 | |||
58 | # | ||
59 | # General setup | ||
60 | # | ||
61 | CONFIG_EXPERIMENTAL=y | ||
62 | CONFIG_BROKEN_ON_SMP=y | ||
63 | CONFIG_LOCK_KERNEL=y | ||
64 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
65 | CONFIG_LOCALVERSION="" | ||
66 | # CONFIG_LOCALVERSION_AUTO is not set | ||
67 | CONFIG_SWAP=y | ||
68 | CONFIG_SYSVIPC=y | ||
69 | CONFIG_SYSVIPC_SYSCTL=y | ||
70 | CONFIG_POSIX_MQUEUE=y | ||
71 | # CONFIG_BSD_PROCESS_ACCT is not set | ||
72 | # CONFIG_TASKSTATS is not set | ||
73 | # CONFIG_AUDIT is not set | ||
74 | CONFIG_IKCONFIG=y | ||
75 | CONFIG_IKCONFIG_PROC=y | ||
76 | CONFIG_LOG_BUF_SHIFT=14 | ||
77 | # CONFIG_CGROUPS is not set | ||
78 | # CONFIG_GROUP_SCHED is not set | ||
79 | CONFIG_SYSFS_DEPRECATED=y | ||
80 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
81 | # CONFIG_RELAY is not set | ||
82 | CONFIG_NAMESPACES=y | ||
83 | # CONFIG_UTS_NS is not set | ||
84 | # CONFIG_IPC_NS is not set | ||
85 | # CONFIG_USER_NS is not set | ||
86 | # CONFIG_PID_NS is not set | ||
87 | CONFIG_BLK_DEV_INITRD=y | ||
88 | CONFIG_INITRAMFS_SOURCE="" | ||
89 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
90 | CONFIG_SYSCTL=y | ||
91 | # CONFIG_EMBEDDED is not set | ||
92 | CONFIG_SYSCTL_SYSCALL=y | ||
93 | CONFIG_KALLSYMS=y | ||
94 | # CONFIG_KALLSYMS_ALL is not set | ||
95 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | ||
96 | CONFIG_HOTPLUG=y | ||
97 | CONFIG_PRINTK=y | ||
98 | CONFIG_BUG=y | ||
99 | CONFIG_ELF_CORE=y | ||
100 | CONFIG_COMPAT_BRK=y | ||
101 | CONFIG_BASE_FULL=y | ||
102 | CONFIG_FUTEX=y | ||
103 | CONFIG_ANON_INODES=y | ||
104 | CONFIG_EPOLL=y | ||
105 | CONFIG_SIGNALFD=y | ||
106 | CONFIG_TIMERFD=y | ||
107 | CONFIG_EVENTFD=y | ||
108 | CONFIG_SHMEM=y | ||
109 | CONFIG_AIO=y | ||
110 | CONFIG_VM_EVENT_COUNTERS=y | ||
111 | CONFIG_PCI_QUIRKS=y | ||
112 | CONFIG_SLAB=y | ||
113 | # CONFIG_SLUB is not set | ||
114 | # CONFIG_SLOB is not set | ||
115 | # CONFIG_PROFILING is not set | ||
116 | # CONFIG_MARKERS is not set | ||
117 | CONFIG_HAVE_OPROFILE=y | ||
118 | # CONFIG_KPROBES is not set | ||
119 | CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y | ||
120 | CONFIG_HAVE_IOREMAP_PROT=y | ||
121 | CONFIG_HAVE_KPROBES=y | ||
122 | CONFIG_HAVE_KRETPROBES=y | ||
123 | CONFIG_HAVE_ARCH_TRACEHOOK=y | ||
124 | # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set | ||
125 | CONFIG_SLABINFO=y | ||
126 | CONFIG_RT_MUTEXES=y | ||
127 | # CONFIG_TINY_SHMEM is not set | ||
128 | CONFIG_BASE_SMALL=0 | ||
129 | CONFIG_MODULES=y | ||
130 | # CONFIG_MODULE_FORCE_LOAD is not set | ||
131 | CONFIG_MODULE_UNLOAD=y | ||
132 | CONFIG_MODULE_FORCE_UNLOAD=y | ||
133 | CONFIG_MODVERSIONS=y | ||
134 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
135 | CONFIG_KMOD=y | ||
136 | CONFIG_BLOCK=y | ||
137 | # CONFIG_LBD is not set | ||
138 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
139 | # CONFIG_LSF is not set | ||
140 | # CONFIG_BLK_DEV_BSG is not set | ||
141 | # CONFIG_BLK_DEV_INTEGRITY is not set | ||
142 | |||
143 | # | ||
144 | # IO Schedulers | ||
145 | # | ||
146 | CONFIG_IOSCHED_NOOP=y | ||
147 | CONFIG_IOSCHED_AS=y | ||
148 | CONFIG_IOSCHED_DEADLINE=y | ||
149 | CONFIG_IOSCHED_CFQ=y | ||
150 | # CONFIG_DEFAULT_AS is not set | ||
151 | # CONFIG_DEFAULT_DEADLINE is not set | ||
152 | CONFIG_DEFAULT_CFQ=y | ||
153 | # CONFIG_DEFAULT_NOOP is not set | ||
154 | CONFIG_DEFAULT_IOSCHED="cfq" | ||
155 | CONFIG_CLASSIC_RCU=y | ||
156 | # CONFIG_FREEZER is not set | ||
157 | # CONFIG_PPC4xx_PCI_EXPRESS is not set | ||
158 | |||
159 | # | ||
160 | # Platform support | ||
161 | # | ||
162 | # CONFIG_PPC_CELL is not set | ||
163 | # CONFIG_PPC_CELL_NATIVE is not set | ||
164 | # CONFIG_PQ2ADS is not set | ||
165 | # CONFIG_PPC4xx_GPIO is not set | ||
166 | CONFIG_XILINX_VIRTEX=y | ||
167 | # CONFIG_ACADIA is not set | ||
168 | # CONFIG_EP405 is not set | ||
169 | # CONFIG_HCU4 is not set | ||
170 | # CONFIG_KILAUEA is not set | ||
171 | # CONFIG_MAKALU is not set | ||
172 | # CONFIG_WALNUT is not set | ||
173 | CONFIG_XILINX_VIRTEX_GENERIC_BOARD=y | ||
174 | # CONFIG_PPC40x_SIMPLE is not set | ||
175 | CONFIG_XILINX_VIRTEX_II_PRO=y | ||
176 | CONFIG_XILINX_VIRTEX_4_FX=y | ||
177 | CONFIG_IBM405_ERR77=y | ||
178 | CONFIG_IBM405_ERR51=y | ||
179 | # CONFIG_IPIC is not set | ||
180 | # CONFIG_MPIC is not set | ||
181 | # CONFIG_MPIC_WEIRD is not set | ||
182 | # CONFIG_PPC_I8259 is not set | ||
183 | # CONFIG_PPC_RTAS is not set | ||
184 | # CONFIG_MMIO_NVRAM is not set | ||
185 | # CONFIG_PPC_MPC106 is not set | ||
186 | # CONFIG_PPC_970_NAP is not set | ||
187 | # CONFIG_PPC_INDIRECT_IO is not set | ||
188 | # CONFIG_GENERIC_IOMAP is not set | ||
189 | # CONFIG_CPU_FREQ is not set | ||
190 | # CONFIG_FSL_ULI1575 is not set | ||
191 | |||
192 | # | ||
193 | # Kernel options | ||
194 | # | ||
195 | # CONFIG_HIGHMEM is not set | ||
196 | # CONFIG_NO_HZ is not set | ||
197 | # CONFIG_HIGH_RES_TIMERS is not set | ||
198 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y | ||
199 | # CONFIG_HZ_100 is not set | ||
200 | CONFIG_HZ_250=y | ||
201 | # CONFIG_HZ_300 is not set | ||
202 | # CONFIG_HZ_1000 is not set | ||
203 | CONFIG_HZ=250 | ||
204 | # CONFIG_SCHED_HRTICK is not set | ||
205 | # CONFIG_PREEMPT_NONE is not set | ||
206 | # CONFIG_PREEMPT_VOLUNTARY is not set | ||
207 | CONFIG_PREEMPT=y | ||
208 | # CONFIG_PREEMPT_RCU is not set | ||
209 | CONFIG_BINFMT_ELF=y | ||
210 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set | ||
211 | # CONFIG_HAVE_AOUT is not set | ||
212 | # CONFIG_BINFMT_MISC is not set | ||
213 | CONFIG_MATH_EMULATION=y | ||
214 | # CONFIG_IOMMU_HELPER is not set | ||
215 | CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y | ||
216 | CONFIG_ARCH_HAS_WALK_MEMORY=y | ||
217 | CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y | ||
218 | CONFIG_ARCH_FLATMEM_ENABLE=y | ||
219 | CONFIG_ARCH_POPULATES_NODE_MAP=y | ||
220 | CONFIG_SELECT_MEMORY_MODEL=y | ||
221 | CONFIG_FLATMEM_MANUAL=y | ||
222 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
223 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
224 | CONFIG_FLATMEM=y | ||
225 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
226 | CONFIG_PAGEFLAGS_EXTENDED=y | ||
227 | CONFIG_SPLIT_PTLOCK_CPUS=4 | ||
228 | CONFIG_MIGRATION=y | ||
229 | CONFIG_RESOURCES_64BIT=y | ||
230 | # CONFIG_PHYS_ADDR_T_64BIT is not set | ||
231 | CONFIG_ZONE_DMA_FLAG=1 | ||
232 | CONFIG_BOUNCE=y | ||
233 | CONFIG_VIRT_TO_BUS=y | ||
234 | CONFIG_UNEVICTABLE_LRU=y | ||
235 | CONFIG_FORCE_MAX_ZONEORDER=11 | ||
236 | CONFIG_PROC_DEVICETREE=y | ||
237 | CONFIG_CMDLINE_BOOL=y | ||
238 | CONFIG_CMDLINE="" | ||
239 | CONFIG_EXTRA_TARGETS="" | ||
240 | # CONFIG_PM is not set | ||
241 | CONFIG_SECCOMP=y | ||
242 | CONFIG_ISA_DMA_API=y | ||
243 | |||
244 | # | ||
245 | # Bus options | ||
246 | # | ||
247 | CONFIG_ZONE_DMA=y | ||
248 | CONFIG_PPC_INDIRECT_PCI=y | ||
249 | CONFIG_4xx_SOC=y | ||
250 | CONFIG_PPC_PCI_CHOICE=y | ||
251 | CONFIG_PCI=y | ||
252 | CONFIG_PCI_DOMAINS=y | ||
253 | CONFIG_PCI_SYSCALL=y | ||
254 | # CONFIG_PCIEPORTBUS is not set | ||
255 | CONFIG_ARCH_SUPPORTS_MSI=y | ||
256 | # CONFIG_PCI_MSI is not set | ||
257 | CONFIG_PCI_LEGACY=y | ||
258 | # CONFIG_PCI_DEBUG is not set | ||
259 | # CONFIG_PCCARD is not set | ||
260 | # CONFIG_HOTPLUG_PCI is not set | ||
261 | # CONFIG_HAS_RAPIDIO is not set | ||
262 | |||
263 | # | ||
264 | # Advanced setup | ||
265 | # | ||
266 | # CONFIG_ADVANCED_OPTIONS is not set | ||
267 | |||
268 | # | ||
269 | # Default settings for advanced configuration options are used | ||
270 | # | ||
271 | CONFIG_LOWMEM_SIZE=0x30000000 | ||
272 | CONFIG_PAGE_OFFSET=0xc0000000 | ||
273 | CONFIG_KERNEL_START=0xc0000000 | ||
274 | CONFIG_PHYSICAL_START=0x00000000 | ||
275 | CONFIG_TASK_SIZE=0xc0000000 | ||
276 | CONFIG_CONSISTENT_START=0xff100000 | ||
277 | CONFIG_CONSISTENT_SIZE=0x00200000 | ||
278 | CONFIG_NET=y | ||
279 | |||
280 | # | ||
281 | # Networking options | ||
282 | # | ||
283 | CONFIG_PACKET=y | ||
284 | # CONFIG_PACKET_MMAP is not set | ||
285 | CONFIG_UNIX=y | ||
286 | CONFIG_XFRM=y | ||
287 | # CONFIG_XFRM_USER is not set | ||
288 | # CONFIG_XFRM_SUB_POLICY is not set | ||
289 | # CONFIG_XFRM_MIGRATE is not set | ||
290 | # CONFIG_XFRM_STATISTICS is not set | ||
291 | # CONFIG_NET_KEY is not set | ||
292 | CONFIG_INET=y | ||
293 | CONFIG_IP_MULTICAST=y | ||
294 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
295 | CONFIG_IP_FIB_HASH=y | ||
296 | CONFIG_IP_PNP=y | ||
297 | CONFIG_IP_PNP_DHCP=y | ||
298 | CONFIG_IP_PNP_BOOTP=y | ||
299 | # CONFIG_IP_PNP_RARP is not set | ||
300 | # CONFIG_NET_IPIP is not set | ||
301 | # CONFIG_NET_IPGRE is not set | ||
302 | # CONFIG_IP_MROUTE is not set | ||
303 | # CONFIG_ARPD is not set | ||
304 | # CONFIG_SYN_COOKIES is not set | ||
305 | # CONFIG_INET_AH is not set | ||
306 | # CONFIG_INET_ESP is not set | ||
307 | # CONFIG_INET_IPCOMP is not set | ||
308 | # CONFIG_INET_XFRM_TUNNEL is not set | ||
309 | CONFIG_INET_TUNNEL=m | ||
310 | CONFIG_INET_XFRM_MODE_TRANSPORT=y | ||
311 | CONFIG_INET_XFRM_MODE_TUNNEL=y | ||
312 | CONFIG_INET_XFRM_MODE_BEET=y | ||
313 | # CONFIG_INET_LRO is not set | ||
314 | CONFIG_INET_DIAG=y | ||
315 | CONFIG_INET_TCP_DIAG=y | ||
316 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
317 | CONFIG_TCP_CONG_CUBIC=y | ||
318 | CONFIG_DEFAULT_TCP_CONG="cubic" | ||
319 | # CONFIG_TCP_MD5SIG is not set | ||
320 | CONFIG_IPV6=m | ||
321 | # CONFIG_IPV6_PRIVACY is not set | ||
322 | # CONFIG_IPV6_ROUTER_PREF is not set | ||
323 | # CONFIG_IPV6_OPTIMISTIC_DAD is not set | ||
324 | # CONFIG_INET6_AH is not set | ||
325 | # CONFIG_INET6_ESP is not set | ||
326 | # CONFIG_INET6_IPCOMP is not set | ||
327 | # CONFIG_IPV6_MIP6 is not set | ||
328 | # CONFIG_INET6_XFRM_TUNNEL is not set | ||
329 | # CONFIG_INET6_TUNNEL is not set | ||
330 | CONFIG_INET6_XFRM_MODE_TRANSPORT=m | ||
331 | CONFIG_INET6_XFRM_MODE_TUNNEL=m | ||
332 | CONFIG_INET6_XFRM_MODE_BEET=m | ||
333 | # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set | ||
334 | CONFIG_IPV6_SIT=m | ||
335 | CONFIG_IPV6_NDISC_NODETYPE=y | ||
336 | # CONFIG_IPV6_TUNNEL is not set | ||
337 | # CONFIG_IPV6_MULTIPLE_TABLES is not set | ||
338 | # CONFIG_IPV6_MROUTE is not set | ||
339 | # CONFIG_NETWORK_SECMARK is not set | ||
340 | CONFIG_NETFILTER=y | ||
341 | # CONFIG_NETFILTER_DEBUG is not set | ||
342 | CONFIG_NETFILTER_ADVANCED=y | ||
343 | |||
344 | # | ||
345 | # Core Netfilter Configuration | ||
346 | # | ||
347 | # CONFIG_NETFILTER_NETLINK_QUEUE is not set | ||
348 | # CONFIG_NETFILTER_NETLINK_LOG is not set | ||
349 | # CONFIG_NF_CONNTRACK is not set | ||
350 | CONFIG_NETFILTER_XTABLES=m | ||
351 | # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set | ||
352 | # CONFIG_NETFILTER_XT_TARGET_DSCP is not set | ||
353 | # CONFIG_NETFILTER_XT_TARGET_MARK is not set | ||
354 | # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set | ||
355 | # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set | ||
356 | # CONFIG_NETFILTER_XT_TARGET_RATEEST is not set | ||
357 | # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set | ||
358 | # CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set | ||
359 | # CONFIG_NETFILTER_XT_MATCH_COMMENT is not set | ||
360 | # CONFIG_NETFILTER_XT_MATCH_DCCP is not set | ||
361 | # CONFIG_NETFILTER_XT_MATCH_DSCP is not set | ||
362 | # CONFIG_NETFILTER_XT_MATCH_ESP is not set | ||
363 | # CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set | ||
364 | # CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set | ||
365 | # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set | ||
366 | # CONFIG_NETFILTER_XT_MATCH_LIMIT is not set | ||
367 | # CONFIG_NETFILTER_XT_MATCH_MAC is not set | ||
368 | # CONFIG_NETFILTER_XT_MATCH_MARK is not set | ||
369 | # CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set | ||
370 | # CONFIG_NETFILTER_XT_MATCH_OWNER is not set | ||
371 | # CONFIG_NETFILTER_XT_MATCH_POLICY is not set | ||
372 | # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set | ||
373 | # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set | ||
374 | # CONFIG_NETFILTER_XT_MATCH_RATEEST is not set | ||
375 | # CONFIG_NETFILTER_XT_MATCH_REALM is not set | ||
376 | # CONFIG_NETFILTER_XT_MATCH_RECENT is not set | ||
377 | # CONFIG_NETFILTER_XT_MATCH_SCTP is not set | ||
378 | # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set | ||
379 | # CONFIG_NETFILTER_XT_MATCH_STRING is not set | ||
380 | # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set | ||
381 | # CONFIG_NETFILTER_XT_MATCH_TIME is not set | ||
382 | # CONFIG_NETFILTER_XT_MATCH_U32 is not set | ||
383 | # CONFIG_IP_VS is not set | ||
384 | |||
385 | # | ||
386 | # IP: Netfilter Configuration | ||
387 | # | ||
388 | # CONFIG_NF_DEFRAG_IPV4 is not set | ||
389 | # CONFIG_IP_NF_QUEUE is not set | ||
390 | CONFIG_IP_NF_IPTABLES=m | ||
391 | # CONFIG_IP_NF_MATCH_ADDRTYPE is not set | ||
392 | # CONFIG_IP_NF_MATCH_AH is not set | ||
393 | # CONFIG_IP_NF_MATCH_ECN is not set | ||
394 | # CONFIG_IP_NF_MATCH_TTL is not set | ||
395 | CONFIG_IP_NF_FILTER=m | ||
396 | # CONFIG_IP_NF_TARGET_REJECT is not set | ||
397 | # CONFIG_IP_NF_TARGET_LOG is not set | ||
398 | # CONFIG_IP_NF_TARGET_ULOG is not set | ||
399 | CONFIG_IP_NF_MANGLE=m | ||
400 | # CONFIG_IP_NF_TARGET_ECN is not set | ||
401 | # CONFIG_IP_NF_TARGET_TTL is not set | ||
402 | # CONFIG_IP_NF_RAW is not set | ||
403 | # CONFIG_IP_NF_ARPTABLES is not set | ||
404 | |||
405 | # | ||
406 | # IPv6: Netfilter Configuration | ||
407 | # | ||
408 | # CONFIG_IP6_NF_QUEUE is not set | ||
409 | # CONFIG_IP6_NF_IPTABLES is not set | ||
410 | # CONFIG_IP_DCCP is not set | ||
411 | # CONFIG_IP_SCTP is not set | ||
412 | # CONFIG_TIPC is not set | ||
413 | # CONFIG_ATM is not set | ||
414 | # CONFIG_BRIDGE is not set | ||
415 | # CONFIG_NET_DSA is not set | ||
416 | # CONFIG_VLAN_8021Q is not set | ||
417 | # CONFIG_DECNET is not set | ||
418 | # CONFIG_LLC2 is not set | ||
419 | # CONFIG_IPX is not set | ||
420 | # CONFIG_ATALK is not set | ||
421 | # CONFIG_X25 is not set | ||
422 | # CONFIG_LAPB is not set | ||
423 | # CONFIG_ECONET is not set | ||
424 | # CONFIG_WAN_ROUTER is not set | ||
425 | # CONFIG_NET_SCHED is not set | ||
426 | |||
427 | # | ||
428 | # Network testing | ||
429 | # | ||
430 | # CONFIG_NET_PKTGEN is not set | ||
431 | # CONFIG_HAMRADIO is not set | ||
432 | # CONFIG_CAN is not set | ||
433 | # CONFIG_IRDA is not set | ||
434 | # CONFIG_BT is not set | ||
435 | # CONFIG_AF_RXRPC is not set | ||
436 | # CONFIG_PHONET is not set | ||
437 | CONFIG_WIRELESS=y | ||
438 | # CONFIG_CFG80211 is not set | ||
439 | CONFIG_WIRELESS_OLD_REGULATORY=y | ||
440 | # CONFIG_WIRELESS_EXT is not set | ||
441 | # CONFIG_MAC80211 is not set | ||
442 | # CONFIG_IEEE80211 is not set | ||
443 | # CONFIG_RFKILL is not set | ||
444 | # CONFIG_NET_9P is not set | ||
445 | |||
446 | # | ||
447 | # Device Drivers | ||
448 | # | ||
449 | |||
450 | # | ||
451 | # Generic Driver Options | ||
452 | # | ||
453 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
454 | CONFIG_STANDALONE=y | ||
455 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
456 | CONFIG_FW_LOADER=y | ||
457 | CONFIG_FIRMWARE_IN_KERNEL=y | ||
458 | CONFIG_EXTRA_FIRMWARE="" | ||
459 | # CONFIG_DEBUG_DRIVER is not set | ||
460 | # CONFIG_DEBUG_DEVRES is not set | ||
461 | # CONFIG_SYS_HYPERVISOR is not set | ||
462 | # CONFIG_CONNECTOR is not set | ||
463 | # CONFIG_MTD is not set | ||
464 | CONFIG_OF_DEVICE=y | ||
465 | CONFIG_OF_GPIO=y | ||
466 | # CONFIG_PARPORT is not set | ||
467 | CONFIG_BLK_DEV=y | ||
468 | # CONFIG_BLK_DEV_FD is not set | ||
469 | # CONFIG_BLK_CPQ_DA is not set | ||
470 | # CONFIG_BLK_CPQ_CISS_DA is not set | ||
471 | # CONFIG_BLK_DEV_DAC960 is not set | ||
472 | # CONFIG_BLK_DEV_UMEM is not set | ||
473 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
474 | CONFIG_BLK_DEV_LOOP=y | ||
475 | # CONFIG_BLK_DEV_CRYPTOLOOP is not set | ||
476 | # CONFIG_BLK_DEV_NBD is not set | ||
477 | # CONFIG_BLK_DEV_SX8 is not set | ||
478 | CONFIG_BLK_DEV_RAM=y | ||
479 | CONFIG_BLK_DEV_RAM_COUNT=16 | ||
480 | CONFIG_BLK_DEV_RAM_SIZE=8192 | ||
481 | # CONFIG_BLK_DEV_XIP is not set | ||
482 | # CONFIG_CDROM_PKTCDVD is not set | ||
483 | # CONFIG_ATA_OVER_ETH is not set | ||
484 | CONFIG_XILINX_SYSACE=y | ||
485 | # CONFIG_BLK_DEV_HD is not set | ||
486 | CONFIG_MISC_DEVICES=y | ||
487 | # CONFIG_PHANTOM is not set | ||
488 | # CONFIG_EEPROM_93CX6 is not set | ||
489 | # CONFIG_SGI_IOC4 is not set | ||
490 | # CONFIG_TIFM_CORE is not set | ||
491 | # CONFIG_ENCLOSURE_SERVICES is not set | ||
492 | # CONFIG_HP_ILO is not set | ||
493 | # CONFIG_C2PORT is not set | ||
494 | CONFIG_HAVE_IDE=y | ||
495 | # CONFIG_IDE is not set | ||
496 | |||
497 | # | ||
498 | # SCSI device support | ||
499 | # | ||
500 | # CONFIG_RAID_ATTRS is not set | ||
501 | # CONFIG_SCSI is not set | ||
502 | # CONFIG_SCSI_DMA is not set | ||
503 | # CONFIG_SCSI_NETLINK is not set | ||
504 | # CONFIG_ATA is not set | ||
505 | # CONFIG_MD is not set | ||
506 | # CONFIG_FUSION is not set | ||
507 | |||
508 | # | ||
509 | # IEEE 1394 (FireWire) support | ||
510 | # | ||
511 | |||
512 | # | ||
513 | # Enable only one of the two stacks, unless you know what you are doing | ||
514 | # | ||
515 | # CONFIG_FIREWIRE is not set | ||
516 | # CONFIG_IEEE1394 is not set | ||
517 | # CONFIG_I2O is not set | ||
518 | # CONFIG_MACINTOSH_DRIVERS is not set | ||
519 | CONFIG_NETDEVICES=y | ||
520 | # CONFIG_DUMMY is not set | ||
521 | # CONFIG_BONDING is not set | ||
522 | # CONFIG_MACVLAN is not set | ||
523 | # CONFIG_EQUALIZER is not set | ||
524 | # CONFIG_TUN is not set | ||
525 | # CONFIG_VETH is not set | ||
526 | # CONFIG_ARCNET is not set | ||
527 | # CONFIG_PHYLIB is not set | ||
528 | CONFIG_NET_ETHERNET=y | ||
529 | CONFIG_MII=y | ||
530 | # CONFIG_HAPPYMEAL is not set | ||
531 | # CONFIG_SUNGEM is not set | ||
532 | # CONFIG_CASSINI is not set | ||
533 | # CONFIG_NET_VENDOR_3COM is not set | ||
534 | # CONFIG_NET_TULIP is not set | ||
535 | # CONFIG_HP100 is not set | ||
536 | # CONFIG_IBM_NEW_EMAC is not set | ||
537 | # CONFIG_IBM_NEW_EMAC_ZMII is not set | ||
538 | # CONFIG_IBM_NEW_EMAC_RGMII is not set | ||
539 | # CONFIG_IBM_NEW_EMAC_TAH is not set | ||
540 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set | ||
541 | # CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set | ||
542 | # CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set | ||
543 | # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set | ||
544 | # CONFIG_NET_PCI is not set | ||
545 | # CONFIG_B44 is not set | ||
546 | # CONFIG_ATL2 is not set | ||
547 | CONFIG_NETDEV_1000=y | ||
548 | # CONFIG_ACENIC is not set | ||
549 | # CONFIG_DL2K is not set | ||
550 | # CONFIG_E1000 is not set | ||
551 | # CONFIG_E1000E is not set | ||
552 | # CONFIG_IP1000 is not set | ||
553 | # CONFIG_IGB is not set | ||
554 | # CONFIG_NS83820 is not set | ||
555 | # CONFIG_HAMACHI is not set | ||
556 | # CONFIG_YELLOWFIN is not set | ||
557 | # CONFIG_R8169 is not set | ||
558 | # CONFIG_SIS190 is not set | ||
559 | # CONFIG_SKGE is not set | ||
560 | # CONFIG_SKY2 is not set | ||
561 | # CONFIG_VIA_VELOCITY is not set | ||
562 | # CONFIG_TIGON3 is not set | ||
563 | # CONFIG_BNX2 is not set | ||
564 | # CONFIG_QLA3XXX is not set | ||
565 | # CONFIG_ATL1 is not set | ||
566 | # CONFIG_ATL1E is not set | ||
567 | # CONFIG_JME is not set | ||
568 | # CONFIG_NETDEV_10000 is not set | ||
569 | # CONFIG_TR is not set | ||
570 | |||
571 | # | ||
572 | # Wireless LAN | ||
573 | # | ||
574 | # CONFIG_WLAN_PRE80211 is not set | ||
575 | # CONFIG_WLAN_80211 is not set | ||
576 | # CONFIG_IWLWIFI_LEDS is not set | ||
577 | # CONFIG_WAN is not set | ||
578 | # CONFIG_FDDI is not set | ||
579 | # CONFIG_HIPPI is not set | ||
580 | # CONFIG_PPP is not set | ||
581 | # CONFIG_SLIP is not set | ||
582 | # CONFIG_NETCONSOLE is not set | ||
583 | # CONFIG_NETPOLL is not set | ||
584 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
585 | # CONFIG_ISDN is not set | ||
586 | # CONFIG_PHONE is not set | ||
587 | |||
588 | # | ||
589 | # Input device support | ||
590 | # | ||
591 | CONFIG_INPUT=y | ||
592 | # CONFIG_INPUT_FF_MEMLESS is not set | ||
593 | # CONFIG_INPUT_POLLDEV is not set | ||
594 | |||
595 | # | ||
596 | # Userland interfaces | ||
597 | # | ||
598 | CONFIG_INPUT_MOUSEDEV=y | ||
599 | CONFIG_INPUT_MOUSEDEV_PSAUX=y | ||
600 | CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 | ||
601 | CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 | ||
602 | # CONFIG_INPUT_JOYDEV is not set | ||
603 | # CONFIG_INPUT_EVDEV is not set | ||
604 | # CONFIG_INPUT_EVBUG is not set | ||
605 | |||
606 | # | ||
607 | # Input Device Drivers | ||
608 | # | ||
609 | CONFIG_INPUT_KEYBOARD=y | ||
610 | CONFIG_KEYBOARD_ATKBD=y | ||
611 | # CONFIG_KEYBOARD_SUNKBD is not set | ||
612 | # CONFIG_KEYBOARD_LKKBD is not set | ||
613 | # CONFIG_KEYBOARD_XTKBD is not set | ||
614 | # CONFIG_KEYBOARD_NEWTON is not set | ||
615 | # CONFIG_KEYBOARD_STOWAWAY is not set | ||
616 | # CONFIG_KEYBOARD_GPIO is not set | ||
617 | CONFIG_INPUT_MOUSE=y | ||
618 | CONFIG_MOUSE_PS2=y | ||
619 | CONFIG_MOUSE_PS2_ALPS=y | ||
620 | CONFIG_MOUSE_PS2_LOGIPS2PP=y | ||
621 | CONFIG_MOUSE_PS2_SYNAPTICS=y | ||
622 | CONFIG_MOUSE_PS2_LIFEBOOK=y | ||
623 | CONFIG_MOUSE_PS2_TRACKPOINT=y | ||
624 | # CONFIG_MOUSE_PS2_ELANTECH is not set | ||
625 | # CONFIG_MOUSE_PS2_TOUCHKIT is not set | ||
626 | # CONFIG_MOUSE_SERIAL is not set | ||
627 | # CONFIG_MOUSE_VSXXXAA is not set | ||
628 | # CONFIG_MOUSE_GPIO is not set | ||
629 | # CONFIG_INPUT_JOYSTICK is not set | ||
630 | # CONFIG_INPUT_TABLET is not set | ||
631 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
632 | # CONFIG_INPUT_MISC is not set | ||
633 | |||
634 | # | ||
635 | # Hardware I/O ports | ||
636 | # | ||
637 | CONFIG_SERIO=y | ||
638 | # CONFIG_SERIO_I8042 is not set | ||
639 | # CONFIG_SERIO_SERPORT is not set | ||
640 | # CONFIG_SERIO_PCIPS2 is not set | ||
641 | CONFIG_SERIO_LIBPS2=y | ||
642 | # CONFIG_SERIO_RAW is not set | ||
643 | CONFIG_SERIO_XILINX_XPS_PS2=y | ||
644 | # CONFIG_GAMEPORT is not set | ||
645 | |||
646 | # | ||
647 | # Character devices | ||
648 | # | ||
649 | CONFIG_VT=y | ||
650 | CONFIG_CONSOLE_TRANSLATIONS=y | ||
651 | CONFIG_VT_CONSOLE=y | ||
652 | CONFIG_HW_CONSOLE=y | ||
653 | # CONFIG_VT_HW_CONSOLE_BINDING is not set | ||
654 | CONFIG_DEVKMEM=y | ||
655 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
656 | # CONFIG_NOZOMI is not set | ||
657 | |||
658 | # | ||
659 | # Serial drivers | ||
660 | # | ||
661 | CONFIG_SERIAL_8250=y | ||
662 | CONFIG_SERIAL_8250_CONSOLE=y | ||
663 | CONFIG_SERIAL_8250_PCI=y | ||
664 | CONFIG_SERIAL_8250_NR_UARTS=4 | ||
665 | CONFIG_SERIAL_8250_RUNTIME_UARTS=4 | ||
666 | # CONFIG_SERIAL_8250_EXTENDED is not set | ||
667 | |||
668 | # | ||
669 | # Non-8250 serial port support | ||
670 | # | ||
671 | CONFIG_SERIAL_UARTLITE=y | ||
672 | CONFIG_SERIAL_UARTLITE_CONSOLE=y | ||
673 | CONFIG_SERIAL_CORE=y | ||
674 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
675 | # CONFIG_SERIAL_JSM is not set | ||
676 | # CONFIG_SERIAL_OF_PLATFORM is not set | ||
677 | CONFIG_UNIX98_PTYS=y | ||
678 | CONFIG_LEGACY_PTYS=y | ||
679 | CONFIG_LEGACY_PTY_COUNT=256 | ||
680 | # CONFIG_IPMI_HANDLER is not set | ||
681 | CONFIG_HW_RANDOM=m | ||
682 | # CONFIG_NVRAM is not set | ||
683 | # CONFIG_GEN_RTC is not set | ||
684 | CONFIG_XILINX_HWICAP=y | ||
685 | # CONFIG_R3964 is not set | ||
686 | # CONFIG_APPLICOM is not set | ||
687 | # CONFIG_RAW_DRIVER is not set | ||
688 | # CONFIG_TCG_TPM is not set | ||
689 | CONFIG_DEVPORT=y | ||
690 | # CONFIG_I2C is not set | ||
691 | # CONFIG_SPI is not set | ||
692 | CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y | ||
693 | CONFIG_GPIOLIB=y | ||
694 | # CONFIG_DEBUG_GPIO is not set | ||
695 | CONFIG_GPIO_SYSFS=y | ||
696 | |||
697 | # | ||
698 | # Memory mapped GPIO expanders: | ||
699 | # | ||
700 | CONFIG_GPIO_XILINX=y | ||
701 | |||
702 | # | ||
703 | # I2C GPIO expanders: | ||
704 | # | ||
705 | |||
706 | # | ||
707 | # PCI GPIO expanders: | ||
708 | # | ||
709 | # CONFIG_GPIO_BT8XX is not set | ||
710 | |||
711 | # | ||
712 | # SPI GPIO expanders: | ||
713 | # | ||
714 | # CONFIG_W1 is not set | ||
715 | # CONFIG_POWER_SUPPLY is not set | ||
716 | # CONFIG_HWMON is not set | ||
717 | # CONFIG_THERMAL is not set | ||
718 | # CONFIG_THERMAL_HWMON is not set | ||
719 | # CONFIG_WATCHDOG is not set | ||
720 | CONFIG_SSB_POSSIBLE=y | ||
721 | |||
722 | # | ||
723 | # Sonics Silicon Backplane | ||
724 | # | ||
725 | # CONFIG_SSB is not set | ||
726 | |||
727 | # | ||
728 | # Multifunction device drivers | ||
729 | # | ||
730 | # CONFIG_MFD_CORE is not set | ||
731 | # CONFIG_MFD_SM501 is not set | ||
732 | # CONFIG_HTC_PASIC3 is not set | ||
733 | # CONFIG_MFD_TMIO is not set | ||
734 | # CONFIG_REGULATOR is not set | ||
735 | |||
736 | # | ||
737 | # Multimedia devices | ||
738 | # | ||
739 | |||
740 | # | ||
741 | # Multimedia core support | ||
742 | # | ||
743 | # CONFIG_VIDEO_DEV is not set | ||
744 | # CONFIG_DVB_CORE is not set | ||
745 | # CONFIG_VIDEO_MEDIA is not set | ||
746 | |||
747 | # | ||
748 | # Multimedia drivers | ||
749 | # | ||
750 | # CONFIG_DAB is not set | ||
751 | |||
752 | # | ||
753 | # Graphics support | ||
754 | # | ||
755 | # CONFIG_AGP is not set | ||
756 | # CONFIG_DRM is not set | ||
757 | # CONFIG_VGASTATE is not set | ||
758 | # CONFIG_VIDEO_OUTPUT_CONTROL is not set | ||
759 | CONFIG_FB=y | ||
760 | # CONFIG_FIRMWARE_EDID is not set | ||
761 | # CONFIG_FB_DDC is not set | ||
762 | # CONFIG_FB_BOOT_VESA_SUPPORT is not set | ||
763 | CONFIG_FB_CFB_FILLRECT=y | ||
764 | CONFIG_FB_CFB_COPYAREA=y | ||
765 | CONFIG_FB_CFB_IMAGEBLIT=y | ||
766 | # CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set | ||
767 | # CONFIG_FB_SYS_FILLRECT is not set | ||
768 | # CONFIG_FB_SYS_COPYAREA is not set | ||
769 | # CONFIG_FB_SYS_IMAGEBLIT is not set | ||
770 | # CONFIG_FB_FOREIGN_ENDIAN is not set | ||
771 | # CONFIG_FB_SYS_FOPS is not set | ||
772 | # CONFIG_FB_SVGALIB is not set | ||
773 | # CONFIG_FB_MACMODES is not set | ||
774 | # CONFIG_FB_BACKLIGHT is not set | ||
775 | # CONFIG_FB_MODE_HELPERS is not set | ||
776 | # CONFIG_FB_TILEBLITTING is not set | ||
777 | |||
778 | # | ||
779 | # Frame buffer hardware drivers | ||
780 | # | ||
781 | # CONFIG_FB_CIRRUS is not set | ||
782 | # CONFIG_FB_PM2 is not set | ||
783 | # CONFIG_FB_CYBER2000 is not set | ||
784 | # CONFIG_FB_OF is not set | ||
785 | # CONFIG_FB_CT65550 is not set | ||
786 | # CONFIG_FB_ASILIANT is not set | ||
787 | # CONFIG_FB_IMSTT is not set | ||
788 | # CONFIG_FB_VGA16 is not set | ||
789 | # CONFIG_FB_S1D13XXX is not set | ||
790 | # CONFIG_FB_NVIDIA is not set | ||
791 | # CONFIG_FB_RIVA is not set | ||
792 | # CONFIG_FB_MATROX is not set | ||
793 | # CONFIG_FB_RADEON is not set | ||
794 | # CONFIG_FB_ATY128 is not set | ||
795 | # CONFIG_FB_ATY is not set | ||
796 | # CONFIG_FB_S3 is not set | ||
797 | # CONFIG_FB_SAVAGE is not set | ||
798 | # CONFIG_FB_SIS is not set | ||
799 | # CONFIG_FB_VIA is not set | ||
800 | # CONFIG_FB_NEOMAGIC is not set | ||
801 | # CONFIG_FB_KYRO is not set | ||
802 | # CONFIG_FB_3DFX is not set | ||
803 | # CONFIG_FB_VOODOO1 is not set | ||
804 | # CONFIG_FB_VT8623 is not set | ||
805 | # CONFIG_FB_TRIDENT is not set | ||
806 | # CONFIG_FB_ARK is not set | ||
807 | # CONFIG_FB_PM3 is not set | ||
808 | # CONFIG_FB_CARMINE is not set | ||
809 | # CONFIG_FB_IBM_GXT4500 is not set | ||
810 | CONFIG_FB_XILINX=y | ||
811 | # CONFIG_FB_VIRTUAL is not set | ||
812 | # CONFIG_FB_METRONOME is not set | ||
813 | # CONFIG_FB_MB862XX is not set | ||
814 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | ||
815 | |||
816 | # | ||
817 | # Display device support | ||
818 | # | ||
819 | # CONFIG_DISPLAY_SUPPORT is not set | ||
820 | |||
821 | # | ||
822 | # Console display driver support | ||
823 | # | ||
824 | CONFIG_DUMMY_CONSOLE=y | ||
825 | CONFIG_FRAMEBUFFER_CONSOLE=y | ||
826 | # CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set | ||
827 | # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set | ||
828 | CONFIG_FONTS=y | ||
829 | CONFIG_FONT_8x8=y | ||
830 | CONFIG_FONT_8x16=y | ||
831 | # CONFIG_FONT_6x11 is not set | ||
832 | # CONFIG_FONT_7x14 is not set | ||
833 | # CONFIG_FONT_PEARL_8x8 is not set | ||
834 | # CONFIG_FONT_ACORN_8x8 is not set | ||
835 | # CONFIG_FONT_MINI_4x6 is not set | ||
836 | # CONFIG_FONT_SUN8x16 is not set | ||
837 | # CONFIG_FONT_SUN12x22 is not set | ||
838 | # CONFIG_FONT_10x18 is not set | ||
839 | CONFIG_LOGO=y | ||
840 | CONFIG_LOGO_LINUX_MONO=y | ||
841 | CONFIG_LOGO_LINUX_VGA16=y | ||
842 | CONFIG_LOGO_LINUX_CLUT224=y | ||
843 | # CONFIG_SOUND is not set | ||
844 | # CONFIG_HID_SUPPORT is not set | ||
845 | # CONFIG_USB_SUPPORT is not set | ||
846 | # CONFIG_UWB is not set | ||
847 | # CONFIG_MMC is not set | ||
848 | # CONFIG_MEMSTICK is not set | ||
849 | # CONFIG_NEW_LEDS is not set | ||
850 | # CONFIG_ACCESSIBILITY is not set | ||
851 | # CONFIG_INFINIBAND is not set | ||
852 | # CONFIG_EDAC is not set | ||
853 | # CONFIG_RTC_CLASS is not set | ||
854 | # CONFIG_DMADEVICES is not set | ||
855 | # CONFIG_UIO is not set | ||
856 | # CONFIG_STAGING is not set | ||
857 | CONFIG_STAGING_EXCLUDE_BUILD=y | ||
858 | |||
859 | # | ||
860 | # File systems | ||
861 | # | ||
862 | CONFIG_EXT2_FS=y | ||
863 | # CONFIG_EXT2_FS_XATTR is not set | ||
864 | # CONFIG_EXT2_FS_XIP is not set | ||
865 | # CONFIG_EXT3_FS is not set | ||
866 | # CONFIG_EXT4_FS is not set | ||
867 | # CONFIG_REISERFS_FS is not set | ||
868 | # CONFIG_JFS_FS is not set | ||
869 | # CONFIG_FS_POSIX_ACL is not set | ||
870 | CONFIG_FILE_LOCKING=y | ||
871 | # CONFIG_XFS_FS is not set | ||
872 | # CONFIG_OCFS2_FS is not set | ||
873 | CONFIG_DNOTIFY=y | ||
874 | CONFIG_INOTIFY=y | ||
875 | CONFIG_INOTIFY_USER=y | ||
876 | # CONFIG_QUOTA is not set | ||
877 | CONFIG_AUTOFS_FS=y | ||
878 | CONFIG_AUTOFS4_FS=y | ||
879 | # CONFIG_FUSE_FS is not set | ||
880 | |||
881 | # | ||
882 | # CD-ROM/DVD Filesystems | ||
883 | # | ||
884 | # CONFIG_ISO9660_FS is not set | ||
885 | # CONFIG_UDF_FS is not set | ||
886 | |||
887 | # | ||
888 | # DOS/FAT/NT Filesystems | ||
889 | # | ||
890 | CONFIG_FAT_FS=y | ||
891 | CONFIG_MSDOS_FS=y | ||
892 | CONFIG_VFAT_FS=y | ||
893 | CONFIG_FAT_DEFAULT_CODEPAGE=437 | ||
894 | CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | ||
895 | # CONFIG_NTFS_FS is not set | ||
896 | |||
897 | # | ||
898 | # Pseudo filesystems | ||
899 | # | ||
900 | CONFIG_PROC_FS=y | ||
901 | # CONFIG_PROC_KCORE is not set | ||
902 | CONFIG_PROC_SYSCTL=y | ||
903 | CONFIG_PROC_PAGE_MONITOR=y | ||
904 | CONFIG_SYSFS=y | ||
905 | CONFIG_TMPFS=y | ||
906 | # CONFIG_TMPFS_POSIX_ACL is not set | ||
907 | # CONFIG_HUGETLB_PAGE is not set | ||
908 | # CONFIG_CONFIGFS_FS is not set | ||
909 | |||
910 | # | ||
911 | # Miscellaneous filesystems | ||
912 | # | ||
913 | # CONFIG_ADFS_FS is not set | ||
914 | # CONFIG_AFFS_FS is not set | ||
915 | # CONFIG_HFS_FS is not set | ||
916 | # CONFIG_HFSPLUS_FS is not set | ||
917 | # CONFIG_BEFS_FS is not set | ||
918 | # CONFIG_BFS_FS is not set | ||
919 | # CONFIG_EFS_FS is not set | ||
920 | CONFIG_CRAMFS=y | ||
921 | # CONFIG_VXFS_FS is not set | ||
922 | # CONFIG_MINIX_FS is not set | ||
923 | # CONFIG_OMFS_FS is not set | ||
924 | # CONFIG_HPFS_FS is not set | ||
925 | # CONFIG_QNX4FS_FS is not set | ||
926 | CONFIG_ROMFS_FS=y | ||
927 | # CONFIG_SYSV_FS is not set | ||
928 | # CONFIG_UFS_FS is not set | ||
929 | CONFIG_NETWORK_FILESYSTEMS=y | ||
930 | CONFIG_NFS_FS=y | ||
931 | CONFIG_NFS_V3=y | ||
932 | # CONFIG_NFS_V3_ACL is not set | ||
933 | # CONFIG_NFS_V4 is not set | ||
934 | CONFIG_ROOT_NFS=y | ||
935 | # CONFIG_NFSD is not set | ||
936 | CONFIG_LOCKD=y | ||
937 | CONFIG_LOCKD_V4=y | ||
938 | CONFIG_NFS_COMMON=y | ||
939 | CONFIG_SUNRPC=y | ||
940 | # CONFIG_SUNRPC_REGISTER_V4 is not set | ||
941 | # CONFIG_RPCSEC_GSS_KRB5 is not set | ||
942 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
943 | # CONFIG_SMB_FS is not set | ||
944 | # CONFIG_CIFS is not set | ||
945 | # CONFIG_NCP_FS is not set | ||
946 | # CONFIG_CODA_FS is not set | ||
947 | # CONFIG_AFS_FS is not set | ||
948 | |||
949 | # | ||
950 | # Partition Types | ||
951 | # | ||
952 | # CONFIG_PARTITION_ADVANCED is not set | ||
953 | CONFIG_MSDOS_PARTITION=y | ||
954 | CONFIG_NLS=y | ||
955 | CONFIG_NLS_DEFAULT="iso8859-1" | ||
956 | CONFIG_NLS_CODEPAGE_437=y | ||
957 | # CONFIG_NLS_CODEPAGE_737 is not set | ||
958 | # CONFIG_NLS_CODEPAGE_775 is not set | ||
959 | # CONFIG_NLS_CODEPAGE_850 is not set | ||
960 | # CONFIG_NLS_CODEPAGE_852 is not set | ||
961 | # CONFIG_NLS_CODEPAGE_855 is not set | ||
962 | # CONFIG_NLS_CODEPAGE_857 is not set | ||
963 | # CONFIG_NLS_CODEPAGE_860 is not set | ||
964 | # CONFIG_NLS_CODEPAGE_861 is not set | ||
965 | # CONFIG_NLS_CODEPAGE_862 is not set | ||
966 | # CONFIG_NLS_CODEPAGE_863 is not set | ||
967 | # CONFIG_NLS_CODEPAGE_864 is not set | ||
968 | # CONFIG_NLS_CODEPAGE_865 is not set | ||
969 | # CONFIG_NLS_CODEPAGE_866 is not set | ||
970 | # CONFIG_NLS_CODEPAGE_869 is not set | ||
971 | # CONFIG_NLS_CODEPAGE_936 is not set | ||
972 | # CONFIG_NLS_CODEPAGE_950 is not set | ||
973 | # CONFIG_NLS_CODEPAGE_932 is not set | ||
974 | # CONFIG_NLS_CODEPAGE_949 is not set | ||
975 | # CONFIG_NLS_CODEPAGE_874 is not set | ||
976 | # CONFIG_NLS_ISO8859_8 is not set | ||
977 | # CONFIG_NLS_CODEPAGE_1250 is not set | ||
978 | # CONFIG_NLS_CODEPAGE_1251 is not set | ||
979 | CONFIG_NLS_ASCII=m | ||
980 | CONFIG_NLS_ISO8859_1=m | ||
981 | # CONFIG_NLS_ISO8859_2 is not set | ||
982 | # CONFIG_NLS_ISO8859_3 is not set | ||
983 | # CONFIG_NLS_ISO8859_4 is not set | ||
984 | # CONFIG_NLS_ISO8859_5 is not set | ||
985 | # CONFIG_NLS_ISO8859_6 is not set | ||
986 | # CONFIG_NLS_ISO8859_7 is not set | ||
987 | # CONFIG_NLS_ISO8859_9 is not set | ||
988 | # CONFIG_NLS_ISO8859_13 is not set | ||
989 | # CONFIG_NLS_ISO8859_14 is not set | ||
990 | # CONFIG_NLS_ISO8859_15 is not set | ||
991 | # CONFIG_NLS_KOI8_R is not set | ||
992 | # CONFIG_NLS_KOI8_U is not set | ||
993 | CONFIG_NLS_UTF8=m | ||
994 | # CONFIG_DLM is not set | ||
995 | |||
996 | # | ||
997 | # Library routines | ||
998 | # | ||
999 | CONFIG_BITREVERSE=y | ||
1000 | CONFIG_CRC_CCITT=y | ||
1001 | # CONFIG_CRC16 is not set | ||
1002 | # CONFIG_CRC_T10DIF is not set | ||
1003 | # CONFIG_CRC_ITU_T is not set | ||
1004 | CONFIG_CRC32=y | ||
1005 | # CONFIG_CRC7 is not set | ||
1006 | # CONFIG_LIBCRC32C is not set | ||
1007 | CONFIG_ZLIB_INFLATE=y | ||
1008 | CONFIG_PLIST=y | ||
1009 | CONFIG_HAS_IOMEM=y | ||
1010 | CONFIG_HAS_IOPORT=y | ||
1011 | CONFIG_HAS_DMA=y | ||
1012 | CONFIG_HAVE_LMB=y | ||
1013 | |||
1014 | # | ||
1015 | # Kernel hacking | ||
1016 | # | ||
1017 | CONFIG_PRINTK_TIME=y | ||
1018 | CONFIG_ENABLE_WARN_DEPRECATED=y | ||
1019 | CONFIG_ENABLE_MUST_CHECK=y | ||
1020 | CONFIG_FRAME_WARN=1024 | ||
1021 | # CONFIG_MAGIC_SYSRQ is not set | ||
1022 | # CONFIG_UNUSED_SYMBOLS is not set | ||
1023 | # CONFIG_DEBUG_FS is not set | ||
1024 | # CONFIG_HEADERS_CHECK is not set | ||
1025 | CONFIG_DEBUG_KERNEL=y | ||
1026 | # CONFIG_DEBUG_SHIRQ is not set | ||
1027 | CONFIG_DETECT_SOFTLOCKUP=y | ||
1028 | # CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set | ||
1029 | CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 | ||
1030 | CONFIG_SCHED_DEBUG=y | ||
1031 | # CONFIG_SCHEDSTATS is not set | ||
1032 | # CONFIG_TIMER_STATS is not set | ||
1033 | # CONFIG_DEBUG_OBJECTS is not set | ||
1034 | # CONFIG_DEBUG_SLAB is not set | ||
1035 | # CONFIG_DEBUG_RT_MUTEXES is not set | ||
1036 | # CONFIG_RT_MUTEX_TESTER is not set | ||
1037 | # CONFIG_DEBUG_SPINLOCK is not set | ||
1038 | # CONFIG_DEBUG_MUTEXES is not set | ||
1039 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | ||
1040 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set | ||
1041 | # CONFIG_DEBUG_KOBJECT is not set | ||
1042 | CONFIG_DEBUG_BUGVERBOSE=y | ||
1043 | CONFIG_DEBUG_INFO=y | ||
1044 | # CONFIG_DEBUG_VM is not set | ||
1045 | # CONFIG_DEBUG_WRITECOUNT is not set | ||
1046 | CONFIG_DEBUG_MEMORY_INIT=y | ||
1047 | # CONFIG_DEBUG_LIST is not set | ||
1048 | # CONFIG_DEBUG_SG is not set | ||
1049 | # CONFIG_BOOT_PRINTK_DELAY is not set | ||
1050 | # CONFIG_RCU_TORTURE_TEST is not set | ||
1051 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | ||
1052 | # CONFIG_BACKTRACE_SELF_TEST is not set | ||
1053 | # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set | ||
1054 | # CONFIG_FAULT_INJECTION is not set | ||
1055 | # CONFIG_LATENCYTOP is not set | ||
1056 | CONFIG_SYSCTL_SYSCALL_CHECK=y | ||
1057 | CONFIG_HAVE_FUNCTION_TRACER=y | ||
1058 | |||
1059 | # | ||
1060 | # Tracers | ||
1061 | # | ||
1062 | # CONFIG_FUNCTION_TRACER is not set | ||
1063 | # CONFIG_PREEMPT_TRACER is not set | ||
1064 | # CONFIG_SCHED_TRACER is not set | ||
1065 | # CONFIG_CONTEXT_SWITCH_TRACER is not set | ||
1066 | # CONFIG_BOOT_TRACER is not set | ||
1067 | # CONFIG_STACK_TRACER is not set | ||
1068 | # CONFIG_DYNAMIC_PRINTK_DEBUG is not set | ||
1069 | # CONFIG_SAMPLES is not set | ||
1070 | CONFIG_HAVE_ARCH_KGDB=y | ||
1071 | # CONFIG_KGDB is not set | ||
1072 | # CONFIG_DEBUG_STACKOVERFLOW is not set | ||
1073 | # CONFIG_DEBUG_STACK_USAGE is not set | ||
1074 | # CONFIG_DEBUG_PAGEALLOC is not set | ||
1075 | # CONFIG_CODE_PATCHING_SELFTEST is not set | ||
1076 | # CONFIG_FTR_FIXUP_SELFTEST is not set | ||
1077 | # CONFIG_MSI_BITMAP_SELFTEST is not set | ||
1078 | # CONFIG_XMON is not set | ||
1079 | # CONFIG_IRQSTACKS is not set | ||
1080 | # CONFIG_BDI_SWITCH is not set | ||
1081 | # CONFIG_PPC_EARLY_DEBUG is not set | ||
1082 | |||
1083 | # | ||
1084 | # Security options | ||
1085 | # | ||
1086 | # CONFIG_KEYS is not set | ||
1087 | # CONFIG_SECURITY is not set | ||
1088 | # CONFIG_SECURITYFS is not set | ||
1089 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | ||
1090 | CONFIG_CRYPTO=y | ||
1091 | |||
1092 | # | ||
1093 | # Crypto core or helper | ||
1094 | # | ||
1095 | # CONFIG_CRYPTO_FIPS is not set | ||
1096 | # CONFIG_CRYPTO_MANAGER is not set | ||
1097 | # CONFIG_CRYPTO_GF128MUL is not set | ||
1098 | # CONFIG_CRYPTO_NULL is not set | ||
1099 | # CONFIG_CRYPTO_CRYPTD is not set | ||
1100 | # CONFIG_CRYPTO_AUTHENC is not set | ||
1101 | # CONFIG_CRYPTO_TEST is not set | ||
1102 | |||
1103 | # | ||
1104 | # Authenticated Encryption with Associated Data | ||
1105 | # | ||
1106 | # CONFIG_CRYPTO_CCM is not set | ||
1107 | # CONFIG_CRYPTO_GCM is not set | ||
1108 | # CONFIG_CRYPTO_SEQIV is not set | ||
1109 | |||
1110 | # | ||
1111 | # Block modes | ||
1112 | # | ||
1113 | # CONFIG_CRYPTO_CBC is not set | ||
1114 | # CONFIG_CRYPTO_CTR is not set | ||
1115 | # CONFIG_CRYPTO_CTS is not set | ||
1116 | # CONFIG_CRYPTO_ECB is not set | ||
1117 | # CONFIG_CRYPTO_LRW is not set | ||
1118 | # CONFIG_CRYPTO_PCBC is not set | ||
1119 | # CONFIG_CRYPTO_XTS is not set | ||
1120 | |||
1121 | # | ||
1122 | # Hash modes | ||
1123 | # | ||
1124 | # CONFIG_CRYPTO_HMAC is not set | ||
1125 | # CONFIG_CRYPTO_XCBC is not set | ||
1126 | |||
1127 | # | ||
1128 | # Digest | ||
1129 | # | ||
1130 | # CONFIG_CRYPTO_CRC32C is not set | ||
1131 | # CONFIG_CRYPTO_MD4 is not set | ||
1132 | # CONFIG_CRYPTO_MD5 is not set | ||
1133 | # CONFIG_CRYPTO_MICHAEL_MIC is not set | ||
1134 | # CONFIG_CRYPTO_RMD128 is not set | ||
1135 | # CONFIG_CRYPTO_RMD160 is not set | ||
1136 | # CONFIG_CRYPTO_RMD256 is not set | ||
1137 | # CONFIG_CRYPTO_RMD320 is not set | ||
1138 | # CONFIG_CRYPTO_SHA1 is not set | ||
1139 | # CONFIG_CRYPTO_SHA256 is not set | ||
1140 | # CONFIG_CRYPTO_SHA512 is not set | ||
1141 | # CONFIG_CRYPTO_TGR192 is not set | ||
1142 | # CONFIG_CRYPTO_WP512 is not set | ||
1143 | |||
1144 | # | ||
1145 | # Ciphers | ||
1146 | # | ||
1147 | # CONFIG_CRYPTO_AES is not set | ||
1148 | # CONFIG_CRYPTO_ANUBIS is not set | ||
1149 | # CONFIG_CRYPTO_ARC4 is not set | ||
1150 | # CONFIG_CRYPTO_BLOWFISH is not set | ||
1151 | # CONFIG_CRYPTO_CAMELLIA is not set | ||
1152 | # CONFIG_CRYPTO_CAST5 is not set | ||
1153 | # CONFIG_CRYPTO_CAST6 is not set | ||
1154 | # CONFIG_CRYPTO_DES is not set | ||
1155 | # CONFIG_CRYPTO_FCRYPT is not set | ||
1156 | # CONFIG_CRYPTO_KHAZAD is not set | ||
1157 | # CONFIG_CRYPTO_SALSA20 is not set | ||
1158 | # CONFIG_CRYPTO_SEED is not set | ||
1159 | # CONFIG_CRYPTO_SERPENT is not set | ||
1160 | # CONFIG_CRYPTO_TEA is not set | ||
1161 | # CONFIG_CRYPTO_TWOFISH is not set | ||
1162 | |||
1163 | # | ||
1164 | # Compression | ||
1165 | # | ||
1166 | # CONFIG_CRYPTO_DEFLATE is not set | ||
1167 | # CONFIG_CRYPTO_LZO is not set | ||
1168 | |||
1169 | # | ||
1170 | # Random Number Generation | ||
1171 | # | ||
1172 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | ||
1173 | CONFIG_CRYPTO_HW=y | ||
1174 | # CONFIG_CRYPTO_DEV_HIFN_795X is not set | ||
1175 | # CONFIG_PPC_CLOCK is not set | ||
1176 | # CONFIG_VIRTUALIZATION is not set | ||
diff --git a/arch/powerpc/configs/44x/virtex5_defconfig b/arch/powerpc/configs/44x/virtex5_defconfig index 663ec512b33b..7513d360e0b0 100644 --- a/arch/powerpc/configs/44x/virtex5_defconfig +++ b/arch/powerpc/configs/44x/virtex5_defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.27-rc1 | 3 | # Linux kernel version: 2.6.28-rc4 |
4 | # Tue Aug 5 09:20:16 2008 | 4 | # Fri Nov 14 10:31:16 2008 |
5 | # | 5 | # |
6 | # CONFIG_PPC64 is not set | 6 | # CONFIG_PPC64 is not set |
7 | 7 | ||
@@ -22,14 +22,13 @@ CONFIG_PHYS_64BIT=y | |||
22 | CONFIG_NOT_COHERENT_CACHE=y | 22 | CONFIG_NOT_COHERENT_CACHE=y |
23 | CONFIG_PPC32=y | 23 | CONFIG_PPC32=y |
24 | CONFIG_WORD_SIZE=32 | 24 | CONFIG_WORD_SIZE=32 |
25 | CONFIG_PPC_MERGE=y | 25 | CONFIG_ARCH_PHYS_ADDR_T_64BIT=y |
26 | CONFIG_MMU=y | 26 | CONFIG_MMU=y |
27 | CONFIG_GENERIC_CMOS_UPDATE=y | 27 | CONFIG_GENERIC_CMOS_UPDATE=y |
28 | CONFIG_GENERIC_TIME=y | 28 | CONFIG_GENERIC_TIME=y |
29 | CONFIG_GENERIC_TIME_VSYSCALL=y | 29 | CONFIG_GENERIC_TIME_VSYSCALL=y |
30 | CONFIG_GENERIC_CLOCKEVENTS=y | 30 | CONFIG_GENERIC_CLOCKEVENTS=y |
31 | CONFIG_GENERIC_HARDIRQS=y | 31 | CONFIG_GENERIC_HARDIRQS=y |
32 | # CONFIG_HAVE_GET_USER_PAGES_FAST is not set | ||
33 | # CONFIG_HAVE_SETUP_PER_CPU_AREA is not set | 32 | # CONFIG_HAVE_SETUP_PER_CPU_AREA is not set |
34 | CONFIG_IRQ_PER_CPU=y | 33 | CONFIG_IRQ_PER_CPU=y |
35 | CONFIG_STACKTRACE_SUPPORT=y | 34 | CONFIG_STACKTRACE_SUPPORT=y |
@@ -40,6 +39,7 @@ CONFIG_ARCH_HAS_ILOG2_U32=y | |||
40 | CONFIG_GENERIC_HWEIGHT=y | 39 | CONFIG_GENERIC_HWEIGHT=y |
41 | CONFIG_GENERIC_CALIBRATE_DELAY=y | 40 | CONFIG_GENERIC_CALIBRATE_DELAY=y |
42 | CONFIG_GENERIC_FIND_NEXT_BIT=y | 41 | CONFIG_GENERIC_FIND_NEXT_BIT=y |
42 | CONFIG_GENERIC_GPIO=y | ||
43 | # CONFIG_ARCH_NO_VIRT_TO_BUS is not set | 43 | # CONFIG_ARCH_NO_VIRT_TO_BUS is not set |
44 | CONFIG_PPC=y | 44 | CONFIG_PPC=y |
45 | CONFIG_EARLY_PRINTK=y | 45 | CONFIG_EARLY_PRINTK=y |
@@ -93,8 +93,8 @@ CONFIG_INITRAMFS_SOURCE="" | |||
93 | CONFIG_SYSCTL=y | 93 | CONFIG_SYSCTL=y |
94 | # CONFIG_EMBEDDED is not set | 94 | # CONFIG_EMBEDDED is not set |
95 | CONFIG_SYSCTL_SYSCALL=y | 95 | CONFIG_SYSCTL_SYSCALL=y |
96 | CONFIG_SYSCTL_SYSCALL_CHECK=y | ||
97 | CONFIG_KALLSYMS=y | 96 | CONFIG_KALLSYMS=y |
97 | # CONFIG_KALLSYMS_ALL is not set | ||
98 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | 98 | # CONFIG_KALLSYMS_EXTRA_PASS is not set |
99 | CONFIG_HOTPLUG=y | 99 | CONFIG_HOTPLUG=y |
100 | CONFIG_PRINTK=y | 100 | CONFIG_PRINTK=y |
@@ -109,7 +109,9 @@ CONFIG_SIGNALFD=y | |||
109 | CONFIG_TIMERFD=y | 109 | CONFIG_TIMERFD=y |
110 | CONFIG_EVENTFD=y | 110 | CONFIG_EVENTFD=y |
111 | CONFIG_SHMEM=y | 111 | CONFIG_SHMEM=y |
112 | CONFIG_AIO=y | ||
112 | CONFIG_VM_EVENT_COUNTERS=y | 113 | CONFIG_VM_EVENT_COUNTERS=y |
114 | CONFIG_PCI_QUIRKS=y | ||
113 | CONFIG_SLAB=y | 115 | CONFIG_SLAB=y |
114 | # CONFIG_SLUB is not set | 116 | # CONFIG_SLUB is not set |
115 | # CONFIG_SLOB is not set | 117 | # CONFIG_SLOB is not set |
@@ -122,10 +124,6 @@ CONFIG_HAVE_IOREMAP_PROT=y | |||
122 | CONFIG_HAVE_KPROBES=y | 124 | CONFIG_HAVE_KPROBES=y |
123 | CONFIG_HAVE_KRETPROBES=y | 125 | CONFIG_HAVE_KRETPROBES=y |
124 | CONFIG_HAVE_ARCH_TRACEHOOK=y | 126 | CONFIG_HAVE_ARCH_TRACEHOOK=y |
125 | # CONFIG_HAVE_DMA_ATTRS is not set | ||
126 | # CONFIG_USE_GENERIC_SMP_HELPERS is not set | ||
127 | # CONFIG_HAVE_CLK is not set | ||
128 | CONFIG_PROC_PAGE_MONITOR=y | ||
129 | # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set | 127 | # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set |
130 | CONFIG_SLABINFO=y | 128 | CONFIG_SLABINFO=y |
131 | CONFIG_RT_MUTEXES=y | 129 | CONFIG_RT_MUTEXES=y |
@@ -158,6 +156,7 @@ CONFIG_DEFAULT_CFQ=y | |||
158 | # CONFIG_DEFAULT_NOOP is not set | 156 | # CONFIG_DEFAULT_NOOP is not set |
159 | CONFIG_DEFAULT_IOSCHED="cfq" | 157 | CONFIG_DEFAULT_IOSCHED="cfq" |
160 | CONFIG_CLASSIC_RCU=y | 158 | CONFIG_CLASSIC_RCU=y |
159 | # CONFIG_FREEZER is not set | ||
161 | # CONFIG_PPC4xx_PCI_EXPRESS is not set | 160 | # CONFIG_PPC4xx_PCI_EXPRESS is not set |
162 | 161 | ||
163 | # | 162 | # |
@@ -174,9 +173,13 @@ CONFIG_CLASSIC_RCU=y | |||
174 | # CONFIG_KATMAI is not set | 173 | # CONFIG_KATMAI is not set |
175 | # CONFIG_RAINIER is not set | 174 | # CONFIG_RAINIER is not set |
176 | # CONFIG_WARP is not set | 175 | # CONFIG_WARP is not set |
176 | # CONFIG_ARCHES is not set | ||
177 | # CONFIG_CANYONLANDS is not set | 177 | # CONFIG_CANYONLANDS is not set |
178 | # CONFIG_GLACIER is not set | ||
178 | # CONFIG_YOSEMITE is not set | 179 | # CONFIG_YOSEMITE is not set |
179 | CONFIG_XILINX_VIRTEX440_GENERIC_BOARD=y | 180 | CONFIG_XILINX_VIRTEX440_GENERIC_BOARD=y |
181 | # CONFIG_PPC44x_SIMPLE is not set | ||
182 | # CONFIG_PPC4xx_GPIO is not set | ||
180 | CONFIG_XILINX_VIRTEX=y | 183 | CONFIG_XILINX_VIRTEX=y |
181 | CONFIG_XILINX_VIRTEX_5_FXT=y | 184 | CONFIG_XILINX_VIRTEX_5_FXT=y |
182 | # CONFIG_IPIC is not set | 185 | # CONFIG_IPIC is not set |
@@ -196,7 +199,6 @@ CONFIG_XILINX_VIRTEX_5_FXT=y | |||
196 | # Kernel options | 199 | # Kernel options |
197 | # | 200 | # |
198 | # CONFIG_HIGHMEM is not set | 201 | # CONFIG_HIGHMEM is not set |
199 | # CONFIG_TICK_ONESHOT is not set | ||
200 | # CONFIG_NO_HZ is not set | 202 | # CONFIG_NO_HZ is not set |
201 | # CONFIG_HIGH_RES_TIMERS is not set | 203 | # CONFIG_HIGH_RES_TIMERS is not set |
202 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y | 204 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y |
@@ -211,6 +213,8 @@ CONFIG_HZ=250 | |||
211 | CONFIG_PREEMPT=y | 213 | CONFIG_PREEMPT=y |
212 | # CONFIG_PREEMPT_RCU is not set | 214 | # CONFIG_PREEMPT_RCU is not set |
213 | CONFIG_BINFMT_ELF=y | 215 | CONFIG_BINFMT_ELF=y |
216 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set | ||
217 | # CONFIG_HAVE_AOUT is not set | ||
214 | # CONFIG_BINFMT_MISC is not set | 218 | # CONFIG_BINFMT_MISC is not set |
215 | CONFIG_MATH_EMULATION=y | 219 | CONFIG_MATH_EMULATION=y |
216 | # CONFIG_IOMMU_HELPER is not set | 220 | # CONFIG_IOMMU_HELPER is not set |
@@ -225,15 +229,15 @@ CONFIG_FLATMEM_MANUAL=y | |||
225 | # CONFIG_SPARSEMEM_MANUAL is not set | 229 | # CONFIG_SPARSEMEM_MANUAL is not set |
226 | CONFIG_FLATMEM=y | 230 | CONFIG_FLATMEM=y |
227 | CONFIG_FLAT_NODE_MEM_MAP=y | 231 | CONFIG_FLAT_NODE_MEM_MAP=y |
228 | # CONFIG_SPARSEMEM_STATIC is not set | ||
229 | # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set | ||
230 | CONFIG_PAGEFLAGS_EXTENDED=y | 232 | CONFIG_PAGEFLAGS_EXTENDED=y |
231 | CONFIG_SPLIT_PTLOCK_CPUS=4 | 233 | CONFIG_SPLIT_PTLOCK_CPUS=4 |
232 | CONFIG_MIGRATION=y | 234 | CONFIG_MIGRATION=y |
233 | CONFIG_RESOURCES_64BIT=y | 235 | CONFIG_RESOURCES_64BIT=y |
236 | CONFIG_PHYS_ADDR_T_64BIT=y | ||
234 | CONFIG_ZONE_DMA_FLAG=1 | 237 | CONFIG_ZONE_DMA_FLAG=1 |
235 | CONFIG_BOUNCE=y | 238 | CONFIG_BOUNCE=y |
236 | CONFIG_VIRT_TO_BUS=y | 239 | CONFIG_VIRT_TO_BUS=y |
240 | CONFIG_UNEVICTABLE_LRU=y | ||
237 | CONFIG_FORCE_MAX_ZONEORDER=11 | 241 | CONFIG_FORCE_MAX_ZONEORDER=11 |
238 | CONFIG_PROC_DEVICETREE=y | 242 | CONFIG_PROC_DEVICETREE=y |
239 | CONFIG_CMDLINE_BOOL=y | 243 | CONFIG_CMDLINE_BOOL=y |
@@ -256,6 +260,7 @@ CONFIG_PCI_SYSCALL=y | |||
256 | CONFIG_ARCH_SUPPORTS_MSI=y | 260 | CONFIG_ARCH_SUPPORTS_MSI=y |
257 | # CONFIG_PCI_MSI is not set | 261 | # CONFIG_PCI_MSI is not set |
258 | CONFIG_PCI_LEGACY=y | 262 | CONFIG_PCI_LEGACY=y |
263 | # CONFIG_PCI_DEBUG is not set | ||
259 | # CONFIG_PCCARD is not set | 264 | # CONFIG_PCCARD is not set |
260 | # CONFIG_HOTPLUG_PCI is not set | 265 | # CONFIG_HOTPLUG_PCI is not set |
261 | # CONFIG_HAS_RAPIDIO is not set | 266 | # CONFIG_HAS_RAPIDIO is not set |
@@ -317,7 +322,6 @@ CONFIG_INET_TCP_DIAG=y | |||
317 | CONFIG_TCP_CONG_CUBIC=y | 322 | CONFIG_TCP_CONG_CUBIC=y |
318 | CONFIG_DEFAULT_TCP_CONG="cubic" | 323 | CONFIG_DEFAULT_TCP_CONG="cubic" |
319 | # CONFIG_TCP_MD5SIG is not set | 324 | # CONFIG_TCP_MD5SIG is not set |
320 | # CONFIG_IP_VS is not set | ||
321 | CONFIG_IPV6=m | 325 | CONFIG_IPV6=m |
322 | # CONFIG_IPV6_PRIVACY is not set | 326 | # CONFIG_IPV6_PRIVACY is not set |
323 | # CONFIG_IPV6_ROUTER_PREF is not set | 327 | # CONFIG_IPV6_ROUTER_PREF is not set |
@@ -352,8 +356,8 @@ CONFIG_NETFILTER_XTABLES=m | |||
352 | # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set | 356 | # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set |
353 | # CONFIG_NETFILTER_XT_TARGET_DSCP is not set | 357 | # CONFIG_NETFILTER_XT_TARGET_DSCP is not set |
354 | # CONFIG_NETFILTER_XT_TARGET_MARK is not set | 358 | # CONFIG_NETFILTER_XT_TARGET_MARK is not set |
355 | # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set | ||
356 | # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set | 359 | # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set |
360 | # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set | ||
357 | # CONFIG_NETFILTER_XT_TARGET_RATEEST is not set | 361 | # CONFIG_NETFILTER_XT_TARGET_RATEEST is not set |
358 | # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set | 362 | # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set |
359 | # CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set | 363 | # CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set |
@@ -361,36 +365,38 @@ CONFIG_NETFILTER_XTABLES=m | |||
361 | # CONFIG_NETFILTER_XT_MATCH_DCCP is not set | 365 | # CONFIG_NETFILTER_XT_MATCH_DCCP is not set |
362 | # CONFIG_NETFILTER_XT_MATCH_DSCP is not set | 366 | # CONFIG_NETFILTER_XT_MATCH_DSCP is not set |
363 | # CONFIG_NETFILTER_XT_MATCH_ESP is not set | 367 | # CONFIG_NETFILTER_XT_MATCH_ESP is not set |
368 | # CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set | ||
364 | # CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set | 369 | # CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set |
365 | # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set | 370 | # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set |
366 | # CONFIG_NETFILTER_XT_MATCH_LIMIT is not set | 371 | # CONFIG_NETFILTER_XT_MATCH_LIMIT is not set |
367 | # CONFIG_NETFILTER_XT_MATCH_MAC is not set | 372 | # CONFIG_NETFILTER_XT_MATCH_MAC is not set |
368 | # CONFIG_NETFILTER_XT_MATCH_MARK is not set | 373 | # CONFIG_NETFILTER_XT_MATCH_MARK is not set |
374 | # CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set | ||
369 | # CONFIG_NETFILTER_XT_MATCH_OWNER is not set | 375 | # CONFIG_NETFILTER_XT_MATCH_OWNER is not set |
370 | # CONFIG_NETFILTER_XT_MATCH_POLICY is not set | 376 | # CONFIG_NETFILTER_XT_MATCH_POLICY is not set |
371 | # CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set | ||
372 | # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set | 377 | # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set |
373 | # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set | 378 | # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set |
374 | # CONFIG_NETFILTER_XT_MATCH_RATEEST is not set | 379 | # CONFIG_NETFILTER_XT_MATCH_RATEEST is not set |
375 | # CONFIG_NETFILTER_XT_MATCH_REALM is not set | 380 | # CONFIG_NETFILTER_XT_MATCH_REALM is not set |
381 | # CONFIG_NETFILTER_XT_MATCH_RECENT is not set | ||
376 | # CONFIG_NETFILTER_XT_MATCH_SCTP is not set | 382 | # CONFIG_NETFILTER_XT_MATCH_SCTP is not set |
377 | # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set | 383 | # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set |
378 | # CONFIG_NETFILTER_XT_MATCH_STRING is not set | 384 | # CONFIG_NETFILTER_XT_MATCH_STRING is not set |
379 | # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set | 385 | # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set |
380 | # CONFIG_NETFILTER_XT_MATCH_TIME is not set | 386 | # CONFIG_NETFILTER_XT_MATCH_TIME is not set |
381 | # CONFIG_NETFILTER_XT_MATCH_U32 is not set | 387 | # CONFIG_NETFILTER_XT_MATCH_U32 is not set |
382 | # CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set | 388 | # CONFIG_IP_VS is not set |
383 | 389 | ||
384 | # | 390 | # |
385 | # IP: Netfilter Configuration | 391 | # IP: Netfilter Configuration |
386 | # | 392 | # |
393 | # CONFIG_NF_DEFRAG_IPV4 is not set | ||
387 | # CONFIG_IP_NF_QUEUE is not set | 394 | # CONFIG_IP_NF_QUEUE is not set |
388 | CONFIG_IP_NF_IPTABLES=m | 395 | CONFIG_IP_NF_IPTABLES=m |
389 | # CONFIG_IP_NF_MATCH_RECENT is not set | 396 | # CONFIG_IP_NF_MATCH_ADDRTYPE is not set |
390 | # CONFIG_IP_NF_MATCH_ECN is not set | ||
391 | # CONFIG_IP_NF_MATCH_AH is not set | 397 | # CONFIG_IP_NF_MATCH_AH is not set |
398 | # CONFIG_IP_NF_MATCH_ECN is not set | ||
392 | # CONFIG_IP_NF_MATCH_TTL is not set | 399 | # CONFIG_IP_NF_MATCH_TTL is not set |
393 | # CONFIG_IP_NF_MATCH_ADDRTYPE is not set | ||
394 | CONFIG_IP_NF_FILTER=m | 400 | CONFIG_IP_NF_FILTER=m |
395 | # CONFIG_IP_NF_TARGET_REJECT is not set | 401 | # CONFIG_IP_NF_TARGET_REJECT is not set |
396 | # CONFIG_IP_NF_TARGET_LOG is not set | 402 | # CONFIG_IP_NF_TARGET_LOG is not set |
@@ -411,6 +417,7 @@ CONFIG_IP_NF_MANGLE=m | |||
411 | # CONFIG_TIPC is not set | 417 | # CONFIG_TIPC is not set |
412 | # CONFIG_ATM is not set | 418 | # CONFIG_ATM is not set |
413 | # CONFIG_BRIDGE is not set | 419 | # CONFIG_BRIDGE is not set |
420 | # CONFIG_NET_DSA is not set | ||
414 | # CONFIG_VLAN_8021Q is not set | 421 | # CONFIG_VLAN_8021Q is not set |
415 | # CONFIG_DECNET is not set | 422 | # CONFIG_DECNET is not set |
416 | # CONFIG_LLC2 is not set | 423 | # CONFIG_LLC2 is not set |
@@ -431,11 +438,10 @@ CONFIG_IP_NF_MANGLE=m | |||
431 | # CONFIG_IRDA is not set | 438 | # CONFIG_IRDA is not set |
432 | # CONFIG_BT is not set | 439 | # CONFIG_BT is not set |
433 | # CONFIG_AF_RXRPC is not set | 440 | # CONFIG_AF_RXRPC is not set |
434 | 441 | # CONFIG_PHONET is not set | |
435 | # | 442 | CONFIG_WIRELESS=y |
436 | # Wireless | ||
437 | # | ||
438 | # CONFIG_CFG80211 is not set | 443 | # CONFIG_CFG80211 is not set |
444 | CONFIG_WIRELESS_OLD_REGULATORY=y | ||
439 | # CONFIG_WIRELESS_EXT is not set | 445 | # CONFIG_WIRELESS_EXT is not set |
440 | # CONFIG_MAC80211 is not set | 446 | # CONFIG_MAC80211 is not set |
441 | # CONFIG_IEEE80211 is not set | 447 | # CONFIG_IEEE80211 is not set |
@@ -455,11 +461,13 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y | |||
455 | CONFIG_FW_LOADER=y | 461 | CONFIG_FW_LOADER=y |
456 | CONFIG_FIRMWARE_IN_KERNEL=y | 462 | CONFIG_FIRMWARE_IN_KERNEL=y |
457 | CONFIG_EXTRA_FIRMWARE="" | 463 | CONFIG_EXTRA_FIRMWARE="" |
464 | # CONFIG_DEBUG_DRIVER is not set | ||
465 | # CONFIG_DEBUG_DEVRES is not set | ||
458 | # CONFIG_SYS_HYPERVISOR is not set | 466 | # CONFIG_SYS_HYPERVISOR is not set |
459 | # CONFIG_CONNECTOR is not set | 467 | # CONFIG_CONNECTOR is not set |
460 | # CONFIG_MTD is not set | 468 | # CONFIG_MTD is not set |
461 | CONFIG_OF_DEVICE=y | 469 | CONFIG_OF_DEVICE=y |
462 | CONFIG_OF_I2C=y | 470 | CONFIG_OF_GPIO=y |
463 | # CONFIG_PARPORT is not set | 471 | # CONFIG_PARPORT is not set |
464 | CONFIG_BLK_DEV=y | 472 | CONFIG_BLK_DEV=y |
465 | # CONFIG_BLK_DEV_FD is not set | 473 | # CONFIG_BLK_DEV_FD is not set |
@@ -478,7 +486,7 @@ CONFIG_BLK_DEV_RAM_SIZE=8192 | |||
478 | # CONFIG_BLK_DEV_XIP is not set | 486 | # CONFIG_BLK_DEV_XIP is not set |
479 | # CONFIG_CDROM_PKTCDVD is not set | 487 | # CONFIG_CDROM_PKTCDVD is not set |
480 | # CONFIG_ATA_OVER_ETH is not set | 488 | # CONFIG_ATA_OVER_ETH is not set |
481 | # CONFIG_XILINX_SYSACE is not set | 489 | CONFIG_XILINX_SYSACE=y |
482 | # CONFIG_BLK_DEV_HD is not set | 490 | # CONFIG_BLK_DEV_HD is not set |
483 | CONFIG_MISC_DEVICES=y | 491 | CONFIG_MISC_DEVICES=y |
484 | # CONFIG_PHANTOM is not set | 492 | # CONFIG_PHANTOM is not set |
@@ -487,6 +495,7 @@ CONFIG_MISC_DEVICES=y | |||
487 | # CONFIG_TIFM_CORE is not set | 495 | # CONFIG_TIFM_CORE is not set |
488 | # CONFIG_ENCLOSURE_SERVICES is not set | 496 | # CONFIG_ENCLOSURE_SERVICES is not set |
489 | # CONFIG_HP_ILO is not set | 497 | # CONFIG_HP_ILO is not set |
498 | # CONFIG_C2PORT is not set | ||
490 | CONFIG_HAVE_IDE=y | 499 | CONFIG_HAVE_IDE=y |
491 | # CONFIG_IDE is not set | 500 | # CONFIG_IDE is not set |
492 | 501 | ||
@@ -534,8 +543,12 @@ CONFIG_MII=y | |||
534 | # CONFIG_IBM_NEW_EMAC_RGMII is not set | 543 | # CONFIG_IBM_NEW_EMAC_RGMII is not set |
535 | # CONFIG_IBM_NEW_EMAC_TAH is not set | 544 | # CONFIG_IBM_NEW_EMAC_TAH is not set |
536 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set | 545 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set |
546 | # CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set | ||
547 | # CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set | ||
548 | # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set | ||
537 | # CONFIG_NET_PCI is not set | 549 | # CONFIG_NET_PCI is not set |
538 | # CONFIG_B44 is not set | 550 | # CONFIG_B44 is not set |
551 | # CONFIG_ATL2 is not set | ||
539 | CONFIG_NETDEV_1000=y | 552 | CONFIG_NETDEV_1000=y |
540 | # CONFIG_ACENIC is not set | 553 | # CONFIG_ACENIC is not set |
541 | # CONFIG_DL2K is not set | 554 | # CONFIG_DL2K is not set |
@@ -556,6 +569,7 @@ CONFIG_NETDEV_1000=y | |||
556 | # CONFIG_QLA3XXX is not set | 569 | # CONFIG_QLA3XXX is not set |
557 | # CONFIG_ATL1 is not set | 570 | # CONFIG_ATL1 is not set |
558 | # CONFIG_ATL1E is not set | 571 | # CONFIG_ATL1E is not set |
572 | # CONFIG_JME is not set | ||
559 | # CONFIG_NETDEV_10000 is not set | 573 | # CONFIG_NETDEV_10000 is not set |
560 | # CONFIG_TR is not set | 574 | # CONFIG_TR is not set |
561 | 575 | ||
@@ -604,6 +618,7 @@ CONFIG_KEYBOARD_ATKBD=y | |||
604 | # CONFIG_KEYBOARD_XTKBD is not set | 618 | # CONFIG_KEYBOARD_XTKBD is not set |
605 | # CONFIG_KEYBOARD_NEWTON is not set | 619 | # CONFIG_KEYBOARD_NEWTON is not set |
606 | # CONFIG_KEYBOARD_STOWAWAY is not set | 620 | # CONFIG_KEYBOARD_STOWAWAY is not set |
621 | # CONFIG_KEYBOARD_GPIO is not set | ||
607 | CONFIG_INPUT_MOUSE=y | 622 | CONFIG_INPUT_MOUSE=y |
608 | CONFIG_MOUSE_PS2=y | 623 | CONFIG_MOUSE_PS2=y |
609 | CONFIG_MOUSE_PS2_ALPS=y | 624 | CONFIG_MOUSE_PS2_ALPS=y |
@@ -611,9 +626,11 @@ CONFIG_MOUSE_PS2_LOGIPS2PP=y | |||
611 | CONFIG_MOUSE_PS2_SYNAPTICS=y | 626 | CONFIG_MOUSE_PS2_SYNAPTICS=y |
612 | CONFIG_MOUSE_PS2_LIFEBOOK=y | 627 | CONFIG_MOUSE_PS2_LIFEBOOK=y |
613 | CONFIG_MOUSE_PS2_TRACKPOINT=y | 628 | CONFIG_MOUSE_PS2_TRACKPOINT=y |
629 | # CONFIG_MOUSE_PS2_ELANTECH is not set | ||
614 | # CONFIG_MOUSE_PS2_TOUCHKIT is not set | 630 | # CONFIG_MOUSE_PS2_TOUCHKIT is not set |
615 | # CONFIG_MOUSE_SERIAL is not set | 631 | # CONFIG_MOUSE_SERIAL is not set |
616 | # CONFIG_MOUSE_VSXXXAA is not set | 632 | # CONFIG_MOUSE_VSXXXAA is not set |
633 | # CONFIG_MOUSE_GPIO is not set | ||
617 | # CONFIG_INPUT_JOYSTICK is not set | 634 | # CONFIG_INPUT_JOYSTICK is not set |
618 | # CONFIG_INPUT_TABLET is not set | 635 | # CONFIG_INPUT_TABLET is not set |
619 | # CONFIG_INPUT_TOUCHSCREEN is not set | 636 | # CONFIG_INPUT_TOUCHSCREEN is not set |
@@ -624,11 +641,11 @@ CONFIG_MOUSE_PS2_TRACKPOINT=y | |||
624 | # | 641 | # |
625 | CONFIG_SERIO=y | 642 | CONFIG_SERIO=y |
626 | # CONFIG_SERIO_I8042 is not set | 643 | # CONFIG_SERIO_I8042 is not set |
627 | CONFIG_SERIO_SERPORT=y | 644 | # CONFIG_SERIO_SERPORT is not set |
628 | # CONFIG_SERIO_PCIPS2 is not set | 645 | # CONFIG_SERIO_PCIPS2 is not set |
629 | CONFIG_SERIO_LIBPS2=y | 646 | CONFIG_SERIO_LIBPS2=y |
630 | # CONFIG_SERIO_RAW is not set | 647 | # CONFIG_SERIO_RAW is not set |
631 | # CONFIG_SERIO_XILINX_XPS_PS2 is not set | 648 | CONFIG_SERIO_XILINX_XPS_PS2=y |
632 | # CONFIG_GAMEPORT is not set | 649 | # CONFIG_GAMEPORT is not set |
633 | 650 | ||
634 | # | 651 | # |
@@ -656,11 +673,12 @@ CONFIG_SERIAL_8250_RUNTIME_UARTS=4 | |||
656 | # | 673 | # |
657 | # Non-8250 serial port support | 674 | # Non-8250 serial port support |
658 | # | 675 | # |
659 | # CONFIG_SERIAL_UARTLITE is not set | 676 | CONFIG_SERIAL_UARTLITE=y |
677 | CONFIG_SERIAL_UARTLITE_CONSOLE=y | ||
660 | CONFIG_SERIAL_CORE=y | 678 | CONFIG_SERIAL_CORE=y |
661 | CONFIG_SERIAL_CORE_CONSOLE=y | 679 | CONFIG_SERIAL_CORE_CONSOLE=y |
662 | # CONFIG_SERIAL_JSM is not set | 680 | # CONFIG_SERIAL_JSM is not set |
663 | CONFIG_SERIAL_OF_PLATFORM=y | 681 | # CONFIG_SERIAL_OF_PLATFORM is not set |
664 | CONFIG_UNIX98_PTYS=y | 682 | CONFIG_UNIX98_PTYS=y |
665 | CONFIG_LEGACY_PTYS=y | 683 | CONFIG_LEGACY_PTYS=y |
666 | CONFIG_LEGACY_PTY_COUNT=256 | 684 | CONFIG_LEGACY_PTY_COUNT=256 |
@@ -674,87 +692,41 @@ CONFIG_XILINX_HWICAP=y | |||
674 | # CONFIG_RAW_DRIVER is not set | 692 | # CONFIG_RAW_DRIVER is not set |
675 | # CONFIG_TCG_TPM is not set | 693 | # CONFIG_TCG_TPM is not set |
676 | CONFIG_DEVPORT=y | 694 | CONFIG_DEVPORT=y |
677 | CONFIG_I2C=y | 695 | # CONFIG_I2C is not set |
678 | CONFIG_I2C_BOARDINFO=y | 696 | # CONFIG_SPI is not set |
679 | CONFIG_I2C_CHARDEV=y | 697 | CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y |
680 | 698 | CONFIG_GPIOLIB=y | |
681 | # | 699 | # CONFIG_DEBUG_GPIO is not set |
682 | # I2C Hardware Bus support | 700 | CONFIG_GPIO_SYSFS=y |
683 | # | ||
684 | |||
685 | # | ||
686 | # PC SMBus host controller drivers | ||
687 | # | ||
688 | # CONFIG_I2C_ALI1535 is not set | ||
689 | # CONFIG_I2C_ALI1563 is not set | ||
690 | # CONFIG_I2C_ALI15X3 is not set | ||
691 | # CONFIG_I2C_AMD756 is not set | ||
692 | # CONFIG_I2C_AMD8111 is not set | ||
693 | # CONFIG_I2C_I801 is not set | ||
694 | # CONFIG_I2C_ISCH is not set | ||
695 | # CONFIG_I2C_PIIX4 is not set | ||
696 | # CONFIG_I2C_NFORCE2 is not set | ||
697 | # CONFIG_I2C_SIS5595 is not set | ||
698 | # CONFIG_I2C_SIS630 is not set | ||
699 | # CONFIG_I2C_SIS96X is not set | ||
700 | # CONFIG_I2C_VIA is not set | ||
701 | # CONFIG_I2C_VIAPRO is not set | ||
702 | 701 | ||
703 | # | 702 | # |
704 | # I2C system bus drivers (mostly embedded / system-on-chip) | 703 | # Memory mapped GPIO expanders: |
705 | # | 704 | # |
706 | # CONFIG_I2C_IBM_IIC is not set | 705 | CONFIG_GPIO_XILINX=y |
707 | # CONFIG_I2C_MPC is not set | ||
708 | # CONFIG_I2C_OCORES is not set | ||
709 | # CONFIG_I2C_SIMTEC is not set | ||
710 | 706 | ||
711 | # | 707 | # |
712 | # External I2C/SMBus adapter drivers | 708 | # I2C GPIO expanders: |
713 | # | 709 | # |
714 | # CONFIG_I2C_PARPORT_LIGHT is not set | ||
715 | # CONFIG_I2C_TAOS_EVM is not set | ||
716 | 710 | ||
717 | # | 711 | # |
718 | # Graphics adapter I2C/DDC channel drivers | 712 | # PCI GPIO expanders: |
719 | # | 713 | # |
720 | # CONFIG_I2C_VOODOO3 is not set | 714 | # CONFIG_GPIO_BT8XX is not set |
721 | 715 | ||
722 | # | 716 | # |
723 | # Other I2C/SMBus bus drivers | 717 | # SPI GPIO expanders: |
724 | # | 718 | # |
725 | # CONFIG_I2C_PCA_PLATFORM is not set | ||
726 | # CONFIG_I2C_STUB is not set | ||
727 | |||
728 | # | ||
729 | # Miscellaneous I2C Chip support | ||
730 | # | ||
731 | # CONFIG_DS1682 is not set | ||
732 | # CONFIG_AT24 is not set | ||
733 | # CONFIG_SENSORS_EEPROM is not set | ||
734 | # CONFIG_SENSORS_PCF8574 is not set | ||
735 | # CONFIG_PCF8575 is not set | ||
736 | # CONFIG_SENSORS_PCA9539 is not set | ||
737 | # CONFIG_SENSORS_PCF8591 is not set | ||
738 | # CONFIG_SENSORS_MAX6875 is not set | ||
739 | # CONFIG_SENSORS_TSL2550 is not set | ||
740 | CONFIG_I2C_DEBUG_CORE=y | ||
741 | CONFIG_I2C_DEBUG_ALGO=y | ||
742 | # CONFIG_I2C_DEBUG_BUS is not set | ||
743 | # CONFIG_I2C_DEBUG_CHIP is not set | ||
744 | # CONFIG_SPI is not set | ||
745 | CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y | ||
746 | # CONFIG_GPIOLIB is not set | ||
747 | # CONFIG_W1 is not set | 719 | # CONFIG_W1 is not set |
748 | # CONFIG_POWER_SUPPLY is not set | 720 | # CONFIG_POWER_SUPPLY is not set |
749 | # CONFIG_HWMON is not set | 721 | # CONFIG_HWMON is not set |
750 | # CONFIG_THERMAL is not set | 722 | # CONFIG_THERMAL is not set |
751 | # CONFIG_THERMAL_HWMON is not set | 723 | # CONFIG_THERMAL_HWMON is not set |
752 | # CONFIG_WATCHDOG is not set | 724 | # CONFIG_WATCHDOG is not set |
725 | CONFIG_SSB_POSSIBLE=y | ||
753 | 726 | ||
754 | # | 727 | # |
755 | # Sonics Silicon Backplane | 728 | # Sonics Silicon Backplane |
756 | # | 729 | # |
757 | CONFIG_SSB_POSSIBLE=y | ||
758 | # CONFIG_SSB is not set | 730 | # CONFIG_SSB is not set |
759 | 731 | ||
760 | # | 732 | # |
@@ -763,6 +735,8 @@ CONFIG_SSB_POSSIBLE=y | |||
763 | # CONFIG_MFD_CORE is not set | 735 | # CONFIG_MFD_CORE is not set |
764 | # CONFIG_MFD_SM501 is not set | 736 | # CONFIG_MFD_SM501 is not set |
765 | # CONFIG_HTC_PASIC3 is not set | 737 | # CONFIG_HTC_PASIC3 is not set |
738 | # CONFIG_MFD_TMIO is not set | ||
739 | # CONFIG_REGULATOR is not set | ||
766 | 740 | ||
767 | # | 741 | # |
768 | # Multimedia devices | 742 | # Multimedia devices |
@@ -790,6 +764,7 @@ CONFIG_SSB_POSSIBLE=y | |||
790 | CONFIG_FB=y | 764 | CONFIG_FB=y |
791 | # CONFIG_FIRMWARE_EDID is not set | 765 | # CONFIG_FIRMWARE_EDID is not set |
792 | # CONFIG_FB_DDC is not set | 766 | # CONFIG_FB_DDC is not set |
767 | # CONFIG_FB_BOOT_VESA_SUPPORT is not set | ||
793 | CONFIG_FB_CFB_FILLRECT=y | 768 | CONFIG_FB_CFB_FILLRECT=y |
794 | CONFIG_FB_CFB_COPYAREA=y | 769 | CONFIG_FB_CFB_COPYAREA=y |
795 | CONFIG_FB_CFB_IMAGEBLIT=y | 770 | CONFIG_FB_CFB_IMAGEBLIT=y |
@@ -826,6 +801,7 @@ CONFIG_FB_CFB_IMAGEBLIT=y | |||
826 | # CONFIG_FB_S3 is not set | 801 | # CONFIG_FB_S3 is not set |
827 | # CONFIG_FB_SAVAGE is not set | 802 | # CONFIG_FB_SAVAGE is not set |
828 | # CONFIG_FB_SIS is not set | 803 | # CONFIG_FB_SIS is not set |
804 | # CONFIG_FB_VIA is not set | ||
829 | # CONFIG_FB_NEOMAGIC is not set | 805 | # CONFIG_FB_NEOMAGIC is not set |
830 | # CONFIG_FB_KYRO is not set | 806 | # CONFIG_FB_KYRO is not set |
831 | # CONFIG_FB_3DFX is not set | 807 | # CONFIG_FB_3DFX is not set |
@@ -838,6 +814,8 @@ CONFIG_FB_CFB_IMAGEBLIT=y | |||
838 | # CONFIG_FB_IBM_GXT4500 is not set | 814 | # CONFIG_FB_IBM_GXT4500 is not set |
839 | CONFIG_FB_XILINX=y | 815 | CONFIG_FB_XILINX=y |
840 | # CONFIG_FB_VIRTUAL is not set | 816 | # CONFIG_FB_VIRTUAL is not set |
817 | # CONFIG_FB_METRONOME is not set | ||
818 | # CONFIG_FB_MB862XX is not set | ||
841 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | 819 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set |
842 | 820 | ||
843 | # | 821 | # |
@@ -870,6 +848,7 @@ CONFIG_LOGO_LINUX_CLUT224=y | |||
870 | # CONFIG_SOUND is not set | 848 | # CONFIG_SOUND is not set |
871 | # CONFIG_HID_SUPPORT is not set | 849 | # CONFIG_HID_SUPPORT is not set |
872 | # CONFIG_USB_SUPPORT is not set | 850 | # CONFIG_USB_SUPPORT is not set |
851 | # CONFIG_UWB is not set | ||
873 | # CONFIG_MMC is not set | 852 | # CONFIG_MMC is not set |
874 | # CONFIG_MEMSTICK is not set | 853 | # CONFIG_MEMSTICK is not set |
875 | # CONFIG_NEW_LEDS is not set | 854 | # CONFIG_NEW_LEDS is not set |
@@ -879,6 +858,8 @@ CONFIG_LOGO_LINUX_CLUT224=y | |||
879 | # CONFIG_RTC_CLASS is not set | 858 | # CONFIG_RTC_CLASS is not set |
880 | # CONFIG_DMADEVICES is not set | 859 | # CONFIG_DMADEVICES is not set |
881 | # CONFIG_UIO is not set | 860 | # CONFIG_UIO is not set |
861 | # CONFIG_STAGING is not set | ||
862 | CONFIG_STAGING_EXCLUDE_BUILD=y | ||
882 | 863 | ||
883 | # | 864 | # |
884 | # File systems | 865 | # File systems |
@@ -887,10 +868,11 @@ CONFIG_EXT2_FS=y | |||
887 | # CONFIG_EXT2_FS_XATTR is not set | 868 | # CONFIG_EXT2_FS_XATTR is not set |
888 | # CONFIG_EXT2_FS_XIP is not set | 869 | # CONFIG_EXT2_FS_XIP is not set |
889 | # CONFIG_EXT3_FS is not set | 870 | # CONFIG_EXT3_FS is not set |
890 | # CONFIG_EXT4DEV_FS is not set | 871 | # CONFIG_EXT4_FS is not set |
891 | # CONFIG_REISERFS_FS is not set | 872 | # CONFIG_REISERFS_FS is not set |
892 | # CONFIG_JFS_FS is not set | 873 | # CONFIG_JFS_FS is not set |
893 | # CONFIG_FS_POSIX_ACL is not set | 874 | # CONFIG_FS_POSIX_ACL is not set |
875 | CONFIG_FILE_LOCKING=y | ||
894 | # CONFIG_XFS_FS is not set | 876 | # CONFIG_XFS_FS is not set |
895 | # CONFIG_OCFS2_FS is not set | 877 | # CONFIG_OCFS2_FS is not set |
896 | CONFIG_DNOTIFY=y | 878 | CONFIG_DNOTIFY=y |
@@ -899,7 +881,7 @@ CONFIG_INOTIFY_USER=y | |||
899 | # CONFIG_QUOTA is not set | 881 | # CONFIG_QUOTA is not set |
900 | CONFIG_AUTOFS_FS=y | 882 | CONFIG_AUTOFS_FS=y |
901 | CONFIG_AUTOFS4_FS=y | 883 | CONFIG_AUTOFS4_FS=y |
902 | CONFIG_FUSE_FS=m | 884 | # CONFIG_FUSE_FS is not set |
903 | 885 | ||
904 | # | 886 | # |
905 | # CD-ROM/DVD Filesystems | 887 | # CD-ROM/DVD Filesystems |
@@ -923,6 +905,7 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | |||
923 | CONFIG_PROC_FS=y | 905 | CONFIG_PROC_FS=y |
924 | # CONFIG_PROC_KCORE is not set | 906 | # CONFIG_PROC_KCORE is not set |
925 | CONFIG_PROC_SYSCTL=y | 907 | CONFIG_PROC_SYSCTL=y |
908 | CONFIG_PROC_PAGE_MONITOR=y | ||
926 | CONFIG_SYSFS=y | 909 | CONFIG_SYSFS=y |
927 | CONFIG_TMPFS=y | 910 | CONFIG_TMPFS=y |
928 | # CONFIG_TMPFS_POSIX_ACL is not set | 911 | # CONFIG_TMPFS_POSIX_ACL is not set |
@@ -954,19 +937,15 @@ CONFIG_NFS_V3=y | |||
954 | # CONFIG_NFS_V3_ACL is not set | 937 | # CONFIG_NFS_V3_ACL is not set |
955 | # CONFIG_NFS_V4 is not set | 938 | # CONFIG_NFS_V4 is not set |
956 | CONFIG_ROOT_NFS=y | 939 | CONFIG_ROOT_NFS=y |
957 | CONFIG_NFSD=y | 940 | # CONFIG_NFSD is not set |
958 | CONFIG_NFSD_V3=y | ||
959 | # CONFIG_NFSD_V3_ACL is not set | ||
960 | # CONFIG_NFSD_V4 is not set | ||
961 | CONFIG_LOCKD=y | 941 | CONFIG_LOCKD=y |
962 | CONFIG_LOCKD_V4=y | 942 | CONFIG_LOCKD_V4=y |
963 | CONFIG_EXPORTFS=y | ||
964 | CONFIG_NFS_COMMON=y | 943 | CONFIG_NFS_COMMON=y |
965 | CONFIG_SUNRPC=y | 944 | CONFIG_SUNRPC=y |
945 | # CONFIG_SUNRPC_REGISTER_V4 is not set | ||
966 | # CONFIG_RPCSEC_GSS_KRB5 is not set | 946 | # CONFIG_RPCSEC_GSS_KRB5 is not set |
967 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | 947 | # CONFIG_RPCSEC_GSS_SPKM3 is not set |
968 | CONFIG_SMB_FS=y | 948 | # CONFIG_SMB_FS is not set |
969 | # CONFIG_SMB_NLS_DEFAULT is not set | ||
970 | # CONFIG_CIFS is not set | 949 | # CONFIG_CIFS is not set |
971 | # CONFIG_NCP_FS is not set | 950 | # CONFIG_NCP_FS is not set |
972 | # CONFIG_CODA_FS is not set | 951 | # CONFIG_CODA_FS is not set |
@@ -1023,7 +1002,6 @@ CONFIG_NLS_UTF8=m | |||
1023 | # Library routines | 1002 | # Library routines |
1024 | # | 1003 | # |
1025 | CONFIG_BITREVERSE=y | 1004 | CONFIG_BITREVERSE=y |
1026 | # CONFIG_GENERIC_FIND_FIRST_BIT is not set | ||
1027 | CONFIG_CRC_CCITT=y | 1005 | CONFIG_CRC_CCITT=y |
1028 | # CONFIG_CRC16 is not set | 1006 | # CONFIG_CRC16 is not set |
1029 | # CONFIG_CRC_T10DIF is not set | 1007 | # CONFIG_CRC_T10DIF is not set |
@@ -1041,7 +1019,7 @@ CONFIG_HAVE_LMB=y | |||
1041 | # | 1019 | # |
1042 | # Kernel hacking | 1020 | # Kernel hacking |
1043 | # | 1021 | # |
1044 | # CONFIG_PRINTK_TIME is not set | 1022 | CONFIG_PRINTK_TIME=y |
1045 | CONFIG_ENABLE_WARN_DEPRECATED=y | 1023 | CONFIG_ENABLE_WARN_DEPRECATED=y |
1046 | CONFIG_ENABLE_MUST_CHECK=y | 1024 | CONFIG_ENABLE_MUST_CHECK=y |
1047 | CONFIG_FRAME_WARN=1024 | 1025 | CONFIG_FRAME_WARN=1024 |
@@ -1049,19 +1027,62 @@ CONFIG_FRAME_WARN=1024 | |||
1049 | # CONFIG_UNUSED_SYMBOLS is not set | 1027 | # CONFIG_UNUSED_SYMBOLS is not set |
1050 | # CONFIG_DEBUG_FS is not set | 1028 | # CONFIG_DEBUG_FS is not set |
1051 | # CONFIG_HEADERS_CHECK is not set | 1029 | # CONFIG_HEADERS_CHECK is not set |
1052 | # CONFIG_DEBUG_KERNEL is not set | 1030 | CONFIG_DEBUG_KERNEL=y |
1031 | # CONFIG_DEBUG_SHIRQ is not set | ||
1032 | CONFIG_DETECT_SOFTLOCKUP=y | ||
1033 | # CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set | ||
1034 | CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 | ||
1035 | CONFIG_SCHED_DEBUG=y | ||
1036 | # CONFIG_SCHEDSTATS is not set | ||
1037 | # CONFIG_TIMER_STATS is not set | ||
1038 | # CONFIG_DEBUG_OBJECTS is not set | ||
1039 | # CONFIG_DEBUG_SLAB is not set | ||
1040 | # CONFIG_DEBUG_RT_MUTEXES is not set | ||
1041 | # CONFIG_RT_MUTEX_TESTER is not set | ||
1042 | # CONFIG_DEBUG_SPINLOCK is not set | ||
1043 | # CONFIG_DEBUG_MUTEXES is not set | ||
1044 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | ||
1045 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set | ||
1046 | # CONFIG_DEBUG_KOBJECT is not set | ||
1053 | CONFIG_DEBUG_BUGVERBOSE=y | 1047 | CONFIG_DEBUG_BUGVERBOSE=y |
1048 | CONFIG_DEBUG_INFO=y | ||
1049 | # CONFIG_DEBUG_VM is not set | ||
1050 | # CONFIG_DEBUG_WRITECOUNT is not set | ||
1054 | CONFIG_DEBUG_MEMORY_INIT=y | 1051 | CONFIG_DEBUG_MEMORY_INIT=y |
1052 | # CONFIG_DEBUG_LIST is not set | ||
1053 | # CONFIG_DEBUG_SG is not set | ||
1054 | # CONFIG_BOOT_PRINTK_DELAY is not set | ||
1055 | # CONFIG_RCU_TORTURE_TEST is not set | ||
1056 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | ||
1057 | # CONFIG_BACKTRACE_SELF_TEST is not set | ||
1058 | # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set | ||
1059 | # CONFIG_FAULT_INJECTION is not set | ||
1055 | # CONFIG_LATENCYTOP is not set | 1060 | # CONFIG_LATENCYTOP is not set |
1056 | CONFIG_HAVE_FTRACE=y | 1061 | CONFIG_SYSCTL_SYSCALL_CHECK=y |
1057 | CONFIG_HAVE_DYNAMIC_FTRACE=y | 1062 | CONFIG_HAVE_FUNCTION_TRACER=y |
1058 | # CONFIG_FTRACE is not set | 1063 | |
1064 | # | ||
1065 | # Tracers | ||
1066 | # | ||
1067 | # CONFIG_FUNCTION_TRACER is not set | ||
1059 | # CONFIG_PREEMPT_TRACER is not set | 1068 | # CONFIG_PREEMPT_TRACER is not set |
1060 | # CONFIG_SCHED_TRACER is not set | 1069 | # CONFIG_SCHED_TRACER is not set |
1061 | # CONFIG_CONTEXT_SWITCH_TRACER is not set | 1070 | # CONFIG_CONTEXT_SWITCH_TRACER is not set |
1071 | # CONFIG_BOOT_TRACER is not set | ||
1072 | # CONFIG_STACK_TRACER is not set | ||
1073 | # CONFIG_DYNAMIC_PRINTK_DEBUG is not set | ||
1062 | # CONFIG_SAMPLES is not set | 1074 | # CONFIG_SAMPLES is not set |
1063 | CONFIG_HAVE_ARCH_KGDB=y | 1075 | CONFIG_HAVE_ARCH_KGDB=y |
1076 | # CONFIG_KGDB is not set | ||
1077 | # CONFIG_DEBUG_STACKOVERFLOW is not set | ||
1078 | # CONFIG_DEBUG_STACK_USAGE is not set | ||
1079 | # CONFIG_DEBUG_PAGEALLOC is not set | ||
1080 | # CONFIG_CODE_PATCHING_SELFTEST is not set | ||
1081 | # CONFIG_FTR_FIXUP_SELFTEST is not set | ||
1082 | # CONFIG_MSI_BITMAP_SELFTEST is not set | ||
1083 | # CONFIG_XMON is not set | ||
1064 | # CONFIG_IRQSTACKS is not set | 1084 | # CONFIG_IRQSTACKS is not set |
1085 | # CONFIG_BDI_SWITCH is not set | ||
1065 | # CONFIG_PPC_EARLY_DEBUG is not set | 1086 | # CONFIG_PPC_EARLY_DEBUG is not set |
1066 | 1087 | ||
1067 | # | 1088 | # |
@@ -1069,12 +1090,14 @@ CONFIG_HAVE_ARCH_KGDB=y | |||
1069 | # | 1090 | # |
1070 | # CONFIG_KEYS is not set | 1091 | # CONFIG_KEYS is not set |
1071 | # CONFIG_SECURITY is not set | 1092 | # CONFIG_SECURITY is not set |
1093 | # CONFIG_SECURITYFS is not set | ||
1072 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | 1094 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set |
1073 | CONFIG_CRYPTO=y | 1095 | CONFIG_CRYPTO=y |
1074 | 1096 | ||
1075 | # | 1097 | # |
1076 | # Crypto core or helper | 1098 | # Crypto core or helper |
1077 | # | 1099 | # |
1100 | # CONFIG_CRYPTO_FIPS is not set | ||
1078 | # CONFIG_CRYPTO_MANAGER is not set | 1101 | # CONFIG_CRYPTO_MANAGER is not set |
1079 | # CONFIG_CRYPTO_GF128MUL is not set | 1102 | # CONFIG_CRYPTO_GF128MUL is not set |
1080 | # CONFIG_CRYPTO_NULL is not set | 1103 | # CONFIG_CRYPTO_NULL is not set |
@@ -1147,6 +1170,11 @@ CONFIG_CRYPTO=y | |||
1147 | # | 1170 | # |
1148 | # CONFIG_CRYPTO_DEFLATE is not set | 1171 | # CONFIG_CRYPTO_DEFLATE is not set |
1149 | # CONFIG_CRYPTO_LZO is not set | 1172 | # CONFIG_CRYPTO_LZO is not set |
1173 | |||
1174 | # | ||
1175 | # Random Number Generation | ||
1176 | # | ||
1177 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | ||
1150 | CONFIG_CRYPTO_HW=y | 1178 | CONFIG_CRYPTO_HW=y |
1151 | # CONFIG_CRYPTO_DEV_HIFN_795X is not set | 1179 | # CONFIG_CRYPTO_DEV_HIFN_795X is not set |
1152 | # CONFIG_PPC_CLOCK is not set | 1180 | # CONFIG_PPC_CLOCK is not set |
diff --git a/arch/powerpc/configs/52xx/cm5200_defconfig b/arch/powerpc/configs/52xx/cm5200_defconfig index c10f7395aa1b..3df627494b65 100644 --- a/arch/powerpc/configs/52xx/cm5200_defconfig +++ b/arch/powerpc/configs/52xx/cm5200_defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.25 | 3 | # Linux kernel version: 2.6.28-rc4 |
4 | # Tue Apr 29 07:11:37 2008 | 4 | # Thu Nov 13 02:12:40 2008 |
5 | # | 5 | # |
6 | # CONFIG_PPC64 is not set | 6 | # CONFIG_PPC64 is not set |
7 | 7 | ||
@@ -22,7 +22,7 @@ CONFIG_PPC_STD_MMU_32=y | |||
22 | # CONFIG_SMP is not set | 22 | # CONFIG_SMP is not set |
23 | CONFIG_PPC32=y | 23 | CONFIG_PPC32=y |
24 | CONFIG_WORD_SIZE=32 | 24 | CONFIG_WORD_SIZE=32 |
25 | CONFIG_PPC_MERGE=y | 25 | # CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set |
26 | CONFIG_MMU=y | 26 | CONFIG_MMU=y |
27 | CONFIG_GENERIC_CMOS_UPDATE=y | 27 | CONFIG_GENERIC_CMOS_UPDATE=y |
28 | CONFIG_GENERIC_TIME=y | 28 | CONFIG_GENERIC_TIME=y |
@@ -32,6 +32,7 @@ CONFIG_GENERIC_HARDIRQS=y | |||
32 | # CONFIG_HAVE_SETUP_PER_CPU_AREA is not set | 32 | # CONFIG_HAVE_SETUP_PER_CPU_AREA is not set |
33 | CONFIG_IRQ_PER_CPU=y | 33 | CONFIG_IRQ_PER_CPU=y |
34 | CONFIG_STACKTRACE_SUPPORT=y | 34 | CONFIG_STACKTRACE_SUPPORT=y |
35 | CONFIG_HAVE_LATENCYTOP_SUPPORT=y | ||
35 | CONFIG_LOCKDEP_SUPPORT=y | 36 | CONFIG_LOCKDEP_SUPPORT=y |
36 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y | 37 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y |
37 | CONFIG_ARCH_HAS_ILOG2_U32=y | 38 | CONFIG_ARCH_HAS_ILOG2_U32=y |
@@ -102,6 +103,7 @@ CONFIG_SIGNALFD=y | |||
102 | CONFIG_TIMERFD=y | 103 | CONFIG_TIMERFD=y |
103 | CONFIG_EVENTFD=y | 104 | CONFIG_EVENTFD=y |
104 | CONFIG_SHMEM=y | 105 | CONFIG_SHMEM=y |
106 | CONFIG_AIO=y | ||
105 | CONFIG_VM_EVENT_COUNTERS=y | 107 | CONFIG_VM_EVENT_COUNTERS=y |
106 | CONFIG_SLUB_DEBUG=y | 108 | CONFIG_SLUB_DEBUG=y |
107 | # CONFIG_SLAB is not set | 109 | # CONFIG_SLAB is not set |
@@ -110,9 +112,13 @@ CONFIG_SLUB=y | |||
110 | # CONFIG_PROFILING is not set | 112 | # CONFIG_PROFILING is not set |
111 | # CONFIG_MARKERS is not set | 113 | # CONFIG_MARKERS is not set |
112 | CONFIG_HAVE_OPROFILE=y | 114 | CONFIG_HAVE_OPROFILE=y |
115 | CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y | ||
116 | CONFIG_HAVE_IOREMAP_PROT=y | ||
113 | CONFIG_HAVE_KPROBES=y | 117 | CONFIG_HAVE_KPROBES=y |
114 | CONFIG_HAVE_KRETPROBES=y | 118 | CONFIG_HAVE_KRETPROBES=y |
115 | CONFIG_PROC_PAGE_MONITOR=y | 119 | CONFIG_HAVE_ARCH_TRACEHOOK=y |
120 | CONFIG_HAVE_CLK=y | ||
121 | # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set | ||
116 | CONFIG_SLABINFO=y | 122 | CONFIG_SLABINFO=y |
117 | CONFIG_RT_MUTEXES=y | 123 | CONFIG_RT_MUTEXES=y |
118 | # CONFIG_TINY_SHMEM is not set | 124 | # CONFIG_TINY_SHMEM is not set |
@@ -123,6 +129,7 @@ CONFIG_BLOCK=y | |||
123 | # CONFIG_BLK_DEV_IO_TRACE is not set | 129 | # CONFIG_BLK_DEV_IO_TRACE is not set |
124 | # CONFIG_LSF is not set | 130 | # CONFIG_LSF is not set |
125 | # CONFIG_BLK_DEV_BSG is not set | 131 | # CONFIG_BLK_DEV_BSG is not set |
132 | # CONFIG_BLK_DEV_INTEGRITY is not set | ||
126 | 133 | ||
127 | # | 134 | # |
128 | # IO Schedulers | 135 | # IO Schedulers |
@@ -137,19 +144,16 @@ CONFIG_DEFAULT_AS=y | |||
137 | # CONFIG_DEFAULT_NOOP is not set | 144 | # CONFIG_DEFAULT_NOOP is not set |
138 | CONFIG_DEFAULT_IOSCHED="anticipatory" | 145 | CONFIG_DEFAULT_IOSCHED="anticipatory" |
139 | CONFIG_CLASSIC_RCU=y | 146 | CONFIG_CLASSIC_RCU=y |
147 | # CONFIG_FREEZER is not set | ||
140 | 148 | ||
141 | # | 149 | # |
142 | # Platform support | 150 | # Platform support |
143 | # | 151 | # |
144 | CONFIG_PPC_MULTIPLATFORM=y | 152 | CONFIG_PPC_MULTIPLATFORM=y |
145 | # CONFIG_PPC_82xx is not set | ||
146 | # CONFIG_PPC_83xx is not set | ||
147 | # CONFIG_PPC_86xx is not set | ||
148 | CONFIG_CLASSIC32=y | 153 | CONFIG_CLASSIC32=y |
149 | # CONFIG_PPC_CHRP is not set | 154 | # CONFIG_PPC_CHRP is not set |
150 | # CONFIG_PPC_MPC512x is not set | ||
151 | # CONFIG_PPC_MPC5121 is not set | ||
152 | # CONFIG_MPC5121_ADS is not set | 155 | # CONFIG_MPC5121_ADS is not set |
156 | # CONFIG_MPC5121_GENERIC is not set | ||
153 | CONFIG_PPC_MPC52xx=y | 157 | CONFIG_PPC_MPC52xx=y |
154 | CONFIG_PPC_MPC5200_SIMPLE=y | 158 | CONFIG_PPC_MPC5200_SIMPLE=y |
155 | # CONFIG_PPC_EFIKA is not set | 159 | # CONFIG_PPC_EFIKA is not set |
@@ -159,7 +163,10 @@ CONFIG_PPC_MPC5200_SIMPLE=y | |||
159 | # CONFIG_PPC_PMAC is not set | 163 | # CONFIG_PPC_PMAC is not set |
160 | # CONFIG_PPC_CELL is not set | 164 | # CONFIG_PPC_CELL is not set |
161 | # CONFIG_PPC_CELL_NATIVE is not set | 165 | # CONFIG_PPC_CELL_NATIVE is not set |
166 | # CONFIG_PPC_82xx is not set | ||
162 | # CONFIG_PQ2ADS is not set | 167 | # CONFIG_PQ2ADS is not set |
168 | # CONFIG_PPC_83xx is not set | ||
169 | # CONFIG_PPC_86xx is not set | ||
163 | # CONFIG_EMBEDDED6xx is not set | 170 | # CONFIG_EMBEDDED6xx is not set |
164 | # CONFIG_IPIC is not set | 171 | # CONFIG_IPIC is not set |
165 | # CONFIG_MPIC is not set | 172 | # CONFIG_MPIC is not set |
@@ -183,7 +190,6 @@ CONFIG_PPC_BESTCOMM_FEC=y | |||
183 | # Kernel options | 190 | # Kernel options |
184 | # | 191 | # |
185 | # CONFIG_HIGHMEM is not set | 192 | # CONFIG_HIGHMEM is not set |
186 | # CONFIG_TICK_ONESHOT is not set | ||
187 | # CONFIG_NO_HZ is not set | 193 | # CONFIG_NO_HZ is not set |
188 | # CONFIG_HIGH_RES_TIMERS is not set | 194 | # CONFIG_HIGH_RES_TIMERS is not set |
189 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y | 195 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y |
@@ -197,6 +203,8 @@ CONFIG_PREEMPT_NONE=y | |||
197 | # CONFIG_PREEMPT_VOLUNTARY is not set | 203 | # CONFIG_PREEMPT_VOLUNTARY is not set |
198 | # CONFIG_PREEMPT is not set | 204 | # CONFIG_PREEMPT is not set |
199 | CONFIG_BINFMT_ELF=y | 205 | CONFIG_BINFMT_ELF=y |
206 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set | ||
207 | # CONFIG_HAVE_AOUT is not set | ||
200 | # CONFIG_BINFMT_MISC is not set | 208 | # CONFIG_BINFMT_MISC is not set |
201 | # CONFIG_IOMMU_HELPER is not set | 209 | # CONFIG_IOMMU_HELPER is not set |
202 | CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y | 210 | CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y |
@@ -211,19 +219,20 @@ CONFIG_FLATMEM_MANUAL=y | |||
211 | # CONFIG_SPARSEMEM_MANUAL is not set | 219 | # CONFIG_SPARSEMEM_MANUAL is not set |
212 | CONFIG_FLATMEM=y | 220 | CONFIG_FLATMEM=y |
213 | CONFIG_FLAT_NODE_MEM_MAP=y | 221 | CONFIG_FLAT_NODE_MEM_MAP=y |
214 | # CONFIG_SPARSEMEM_STATIC is not set | ||
215 | # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set | ||
216 | CONFIG_PAGEFLAGS_EXTENDED=y | 222 | CONFIG_PAGEFLAGS_EXTENDED=y |
217 | CONFIG_SPLIT_PTLOCK_CPUS=4 | 223 | CONFIG_SPLIT_PTLOCK_CPUS=4 |
224 | CONFIG_MIGRATION=y | ||
218 | # CONFIG_RESOURCES_64BIT is not set | 225 | # CONFIG_RESOURCES_64BIT is not set |
226 | # CONFIG_PHYS_ADDR_T_64BIT is not set | ||
219 | CONFIG_ZONE_DMA_FLAG=1 | 227 | CONFIG_ZONE_DMA_FLAG=1 |
220 | CONFIG_BOUNCE=y | 228 | CONFIG_BOUNCE=y |
221 | CONFIG_VIRT_TO_BUS=y | 229 | CONFIG_VIRT_TO_BUS=y |
230 | CONFIG_UNEVICTABLE_LRU=y | ||
222 | CONFIG_FORCE_MAX_ZONEORDER=11 | 231 | CONFIG_FORCE_MAX_ZONEORDER=11 |
223 | CONFIG_PROC_DEVICETREE=y | 232 | CONFIG_PROC_DEVICETREE=y |
224 | # CONFIG_CMDLINE_BOOL is not set | 233 | # CONFIG_CMDLINE_BOOL is not set |
234 | CONFIG_EXTRA_TARGETS="" | ||
225 | CONFIG_PM=y | 235 | CONFIG_PM=y |
226 | # CONFIG_PM_LEGACY is not set | ||
227 | # CONFIG_PM_DEBUG is not set | 236 | # CONFIG_PM_DEBUG is not set |
228 | CONFIG_SECCOMP=y | 237 | CONFIG_SECCOMP=y |
229 | CONFIG_ISA_DMA_API=y | 238 | CONFIG_ISA_DMA_API=y |
@@ -233,7 +242,7 @@ CONFIG_ISA_DMA_API=y | |||
233 | # | 242 | # |
234 | CONFIG_ZONE_DMA=y | 243 | CONFIG_ZONE_DMA=y |
235 | CONFIG_GENERIC_ISA_DMA=y | 244 | CONFIG_GENERIC_ISA_DMA=y |
236 | CONFIG_FSL_SOC=y | 245 | CONFIG_PPC_PCI_CHOICE=y |
237 | # CONFIG_PCI is not set | 246 | # CONFIG_PCI is not set |
238 | # CONFIG_PCI_DOMAINS is not set | 247 | # CONFIG_PCI_DOMAINS is not set |
239 | # CONFIG_PCI_SYSCALL is not set | 248 | # CONFIG_PCI_SYSCALL is not set |
@@ -254,10 +263,6 @@ CONFIG_PAGE_OFFSET=0xc0000000 | |||
254 | CONFIG_KERNEL_START=0xc0000000 | 263 | CONFIG_KERNEL_START=0xc0000000 |
255 | CONFIG_PHYSICAL_START=0x00000000 | 264 | CONFIG_PHYSICAL_START=0x00000000 |
256 | CONFIG_TASK_SIZE=0xc0000000 | 265 | CONFIG_TASK_SIZE=0xc0000000 |
257 | |||
258 | # | ||
259 | # Networking | ||
260 | # | ||
261 | CONFIG_NET=y | 266 | CONFIG_NET=y |
262 | 267 | ||
263 | # | 268 | # |
@@ -308,6 +313,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic" | |||
308 | # CONFIG_TIPC is not set | 313 | # CONFIG_TIPC is not set |
309 | # CONFIG_ATM is not set | 314 | # CONFIG_ATM is not set |
310 | # CONFIG_BRIDGE is not set | 315 | # CONFIG_BRIDGE is not set |
316 | # CONFIG_NET_DSA is not set | ||
311 | # CONFIG_VLAN_8021Q is not set | 317 | # CONFIG_VLAN_8021Q is not set |
312 | # CONFIG_DECNET is not set | 318 | # CONFIG_DECNET is not set |
313 | # CONFIG_LLC2 is not set | 319 | # CONFIG_LLC2 is not set |
@@ -328,14 +334,8 @@ CONFIG_DEFAULT_TCP_CONG="cubic" | |||
328 | # CONFIG_IRDA is not set | 334 | # CONFIG_IRDA is not set |
329 | # CONFIG_BT is not set | 335 | # CONFIG_BT is not set |
330 | # CONFIG_AF_RXRPC is not set | 336 | # CONFIG_AF_RXRPC is not set |
331 | 337 | # CONFIG_PHONET is not set | |
332 | # | 338 | # CONFIG_WIRELESS is not set |
333 | # Wireless | ||
334 | # | ||
335 | # CONFIG_CFG80211 is not set | ||
336 | # CONFIG_WIRELESS_EXT is not set | ||
337 | # CONFIG_MAC80211 is not set | ||
338 | # CONFIG_IEEE80211 is not set | ||
339 | # CONFIG_RFKILL is not set | 339 | # CONFIG_RFKILL is not set |
340 | # CONFIG_NET_9P is not set | 340 | # CONFIG_NET_9P is not set |
341 | 341 | ||
@@ -446,6 +446,7 @@ CONFIG_BLK_DEV_RAM_SIZE=32768 | |||
446 | # CONFIG_BLK_DEV_XIP is not set | 446 | # CONFIG_BLK_DEV_XIP is not set |
447 | # CONFIG_CDROM_PKTCDVD is not set | 447 | # CONFIG_CDROM_PKTCDVD is not set |
448 | # CONFIG_ATA_OVER_ETH is not set | 448 | # CONFIG_ATA_OVER_ETH is not set |
449 | # CONFIG_BLK_DEV_HD is not set | ||
449 | # CONFIG_MISC_DEVICES is not set | 450 | # CONFIG_MISC_DEVICES is not set |
450 | CONFIG_HAVE_IDE=y | 451 | CONFIG_HAVE_IDE=y |
451 | # CONFIG_IDE is not set | 452 | # CONFIG_IDE is not set |
@@ -487,11 +488,11 @@ CONFIG_CHR_DEV_SG=y | |||
487 | # CONFIG_SCSI_SAS_LIBSAS is not set | 488 | # CONFIG_SCSI_SAS_LIBSAS is not set |
488 | # CONFIG_SCSI_SRP_ATTRS is not set | 489 | # CONFIG_SCSI_SRP_ATTRS is not set |
489 | # CONFIG_SCSI_LOWLEVEL is not set | 490 | # CONFIG_SCSI_LOWLEVEL is not set |
491 | # CONFIG_SCSI_DH is not set | ||
490 | # CONFIG_ATA is not set | 492 | # CONFIG_ATA is not set |
491 | # CONFIG_MD is not set | 493 | # CONFIG_MD is not set |
492 | # CONFIG_MACINTOSH_DRIVERS is not set | 494 | # CONFIG_MACINTOSH_DRIVERS is not set |
493 | CONFIG_NETDEVICES=y | 495 | CONFIG_NETDEVICES=y |
494 | # CONFIG_NETDEVICES_MULTIQUEUE is not set | ||
495 | # CONFIG_DUMMY is not set | 496 | # CONFIG_DUMMY is not set |
496 | # CONFIG_BONDING is not set | 497 | # CONFIG_BONDING is not set |
497 | # CONFIG_MACVLAN is not set | 498 | # CONFIG_MACVLAN is not set |
@@ -521,6 +522,9 @@ CONFIG_NET_ETHERNET=y | |||
521 | # CONFIG_IBM_NEW_EMAC_RGMII is not set | 522 | # CONFIG_IBM_NEW_EMAC_RGMII is not set |
522 | # CONFIG_IBM_NEW_EMAC_TAH is not set | 523 | # CONFIG_IBM_NEW_EMAC_TAH is not set |
523 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set | 524 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set |
525 | # CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set | ||
526 | # CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set | ||
527 | # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set | ||
524 | # CONFIG_B44 is not set | 528 | # CONFIG_B44 is not set |
525 | CONFIG_FEC_MPC52xx=y | 529 | CONFIG_FEC_MPC52xx=y |
526 | CONFIG_FEC_MPC52xx_MDIO=y | 530 | CONFIG_FEC_MPC52xx_MDIO=y |
@@ -532,7 +536,6 @@ CONFIG_FEC_MPC52xx_MDIO=y | |||
532 | # | 536 | # |
533 | # CONFIG_WLAN_PRE80211 is not set | 537 | # CONFIG_WLAN_PRE80211 is not set |
534 | # CONFIG_WLAN_80211 is not set | 538 | # CONFIG_WLAN_80211 is not set |
535 | # CONFIG_IWLWIFI is not set | ||
536 | # CONFIG_IWLWIFI_LEDS is not set | 539 | # CONFIG_IWLWIFI_LEDS is not set |
537 | 540 | ||
538 | # | 541 | # |
@@ -567,6 +570,7 @@ CONFIG_FEC_MPC52xx_MDIO=y | |||
567 | # Character devices | 570 | # Character devices |
568 | # | 571 | # |
569 | # CONFIG_VT is not set | 572 | # CONFIG_VT is not set |
573 | CONFIG_DEVKMEM=y | ||
570 | # CONFIG_SERIAL_NONSTANDARD is not set | 574 | # CONFIG_SERIAL_NONSTANDARD is not set |
571 | 575 | ||
572 | # | 576 | # |
@@ -596,25 +600,40 @@ CONFIG_LEGACY_PTY_COUNT=256 | |||
596 | CONFIG_I2C=y | 600 | CONFIG_I2C=y |
597 | CONFIG_I2C_BOARDINFO=y | 601 | CONFIG_I2C_BOARDINFO=y |
598 | CONFIG_I2C_CHARDEV=y | 602 | CONFIG_I2C_CHARDEV=y |
603 | CONFIG_I2C_HELPER_AUTO=y | ||
599 | 604 | ||
600 | # | 605 | # |
601 | # I2C Hardware Bus support | 606 | # I2C Hardware Bus support |
602 | # | 607 | # |
608 | |||
609 | # | ||
610 | # I2C system bus drivers (mostly embedded / system-on-chip) | ||
611 | # | ||
603 | CONFIG_I2C_MPC=y | 612 | CONFIG_I2C_MPC=y |
604 | # CONFIG_I2C_OCORES is not set | 613 | # CONFIG_I2C_OCORES is not set |
605 | # CONFIG_I2C_PARPORT_LIGHT is not set | ||
606 | # CONFIG_I2C_SIMTEC is not set | 614 | # CONFIG_I2C_SIMTEC is not set |
615 | |||
616 | # | ||
617 | # External I2C/SMBus adapter drivers | ||
618 | # | ||
619 | # CONFIG_I2C_PARPORT_LIGHT is not set | ||
607 | # CONFIG_I2C_TAOS_EVM is not set | 620 | # CONFIG_I2C_TAOS_EVM is not set |
608 | # CONFIG_I2C_TINY_USB is not set | 621 | # CONFIG_I2C_TINY_USB is not set |
622 | |||
623 | # | ||
624 | # Other I2C/SMBus bus drivers | ||
625 | # | ||
609 | # CONFIG_I2C_PCA_PLATFORM is not set | 626 | # CONFIG_I2C_PCA_PLATFORM is not set |
610 | 627 | ||
611 | # | 628 | # |
612 | # Miscellaneous I2C Chip support | 629 | # Miscellaneous I2C Chip support |
613 | # | 630 | # |
614 | # CONFIG_DS1682 is not set | 631 | # CONFIG_DS1682 is not set |
632 | # CONFIG_AT24 is not set | ||
615 | # CONFIG_SENSORS_EEPROM is not set | 633 | # CONFIG_SENSORS_EEPROM is not set |
616 | # CONFIG_SENSORS_PCF8574 is not set | 634 | # CONFIG_SENSORS_PCF8574 is not set |
617 | # CONFIG_PCF8575 is not set | 635 | # CONFIG_PCF8575 is not set |
636 | # CONFIG_SENSORS_PCA9539 is not set | ||
618 | # CONFIG_SENSORS_PCF8591 is not set | 637 | # CONFIG_SENSORS_PCF8591 is not set |
619 | # CONFIG_SENSORS_MAX6875 is not set | 638 | # CONFIG_SENSORS_MAX6875 is not set |
620 | # CONFIG_SENSORS_TSL2550 is not set | 639 | # CONFIG_SENSORS_TSL2550 is not set |
@@ -623,10 +642,13 @@ CONFIG_I2C_MPC=y | |||
623 | # CONFIG_I2C_DEBUG_BUS is not set | 642 | # CONFIG_I2C_DEBUG_BUS is not set |
624 | # CONFIG_I2C_DEBUG_CHIP is not set | 643 | # CONFIG_I2C_DEBUG_CHIP is not set |
625 | # CONFIG_SPI is not set | 644 | # CONFIG_SPI is not set |
645 | CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y | ||
646 | # CONFIG_GPIOLIB is not set | ||
626 | # CONFIG_W1 is not set | 647 | # CONFIG_W1 is not set |
627 | # CONFIG_POWER_SUPPLY is not set | 648 | # CONFIG_POWER_SUPPLY is not set |
628 | # CONFIG_HWMON is not set | 649 | # CONFIG_HWMON is not set |
629 | # CONFIG_THERMAL is not set | 650 | # CONFIG_THERMAL is not set |
651 | # CONFIG_THERMAL_HWMON is not set | ||
630 | CONFIG_WATCHDOG=y | 652 | CONFIG_WATCHDOG=y |
631 | # CONFIG_WATCHDOG_NOWAYOUT is not set | 653 | # CONFIG_WATCHDOG_NOWAYOUT is not set |
632 | 654 | ||
@@ -640,24 +662,39 @@ CONFIG_WATCHDOG=y | |||
640 | # USB-based Watchdog Cards | 662 | # USB-based Watchdog Cards |
641 | # | 663 | # |
642 | # CONFIG_USBPCWATCHDOG is not set | 664 | # CONFIG_USBPCWATCHDOG is not set |
665 | CONFIG_SSB_POSSIBLE=y | ||
643 | 666 | ||
644 | # | 667 | # |
645 | # Sonics Silicon Backplane | 668 | # Sonics Silicon Backplane |
646 | # | 669 | # |
647 | CONFIG_SSB_POSSIBLE=y | ||
648 | # CONFIG_SSB is not set | 670 | # CONFIG_SSB is not set |
649 | 671 | ||
650 | # | 672 | # |
651 | # Multifunction device drivers | 673 | # Multifunction device drivers |
652 | # | 674 | # |
675 | # CONFIG_MFD_CORE is not set | ||
653 | # CONFIG_MFD_SM501 is not set | 676 | # CONFIG_MFD_SM501 is not set |
654 | # CONFIG_HTC_PASIC3 is not set | 677 | # CONFIG_HTC_PASIC3 is not set |
678 | # CONFIG_MFD_TMIO is not set | ||
679 | # CONFIG_PMIC_DA903X is not set | ||
680 | # CONFIG_MFD_WM8400 is not set | ||
681 | # CONFIG_MFD_WM8350_I2C is not set | ||
682 | # CONFIG_REGULATOR is not set | ||
655 | 683 | ||
656 | # | 684 | # |
657 | # Multimedia devices | 685 | # Multimedia devices |
658 | # | 686 | # |
687 | |||
688 | # | ||
689 | # Multimedia core support | ||
690 | # | ||
659 | # CONFIG_VIDEO_DEV is not set | 691 | # CONFIG_VIDEO_DEV is not set |
660 | # CONFIG_DVB_CORE is not set | 692 | # CONFIG_DVB_CORE is not set |
693 | # CONFIG_VIDEO_MEDIA is not set | ||
694 | |||
695 | # | ||
696 | # Multimedia drivers | ||
697 | # | ||
661 | # CONFIG_DAB is not set | 698 | # CONFIG_DAB is not set |
662 | 699 | ||
663 | # | 700 | # |
@@ -672,10 +709,6 @@ CONFIG_SSB_POSSIBLE=y | |||
672 | # Display device support | 709 | # Display device support |
673 | # | 710 | # |
674 | # CONFIG_DISPLAY_SUPPORT is not set | 711 | # CONFIG_DISPLAY_SUPPORT is not set |
675 | |||
676 | # | ||
677 | # Sound | ||
678 | # | ||
679 | # CONFIG_SOUND is not set | 712 | # CONFIG_SOUND is not set |
680 | CONFIG_USB_SUPPORT=y | 713 | CONFIG_USB_SUPPORT=y |
681 | CONFIG_USB_ARCH_HAS_HCD=y | 714 | CONFIG_USB_ARCH_HAS_HCD=y |
@@ -695,11 +728,16 @@ CONFIG_USB_DEVICEFS=y | |||
695 | # CONFIG_USB_OTG is not set | 728 | # CONFIG_USB_OTG is not set |
696 | # CONFIG_USB_OTG_WHITELIST is not set | 729 | # CONFIG_USB_OTG_WHITELIST is not set |
697 | # CONFIG_USB_OTG_BLACKLIST_HUB is not set | 730 | # CONFIG_USB_OTG_BLACKLIST_HUB is not set |
731 | # CONFIG_USB_MON is not set | ||
732 | # CONFIG_USB_WUSB is not set | ||
733 | # CONFIG_USB_WUSB_CBAF is not set | ||
698 | 734 | ||
699 | # | 735 | # |
700 | # USB Host Controller Drivers | 736 | # USB Host Controller Drivers |
701 | # | 737 | # |
738 | # CONFIG_USB_C67X00_HCD is not set | ||
702 | # CONFIG_USB_ISP116X_HCD is not set | 739 | # CONFIG_USB_ISP116X_HCD is not set |
740 | # CONFIG_USB_ISP1760_HCD is not set | ||
703 | CONFIG_USB_OHCI_HCD=y | 741 | CONFIG_USB_OHCI_HCD=y |
704 | CONFIG_USB_OHCI_HCD_PPC_SOC=y | 742 | CONFIG_USB_OHCI_HCD_PPC_SOC=y |
705 | CONFIG_USB_OHCI_HCD_PPC_OF=y | 743 | CONFIG_USB_OHCI_HCD_PPC_OF=y |
@@ -710,12 +748,16 @@ CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y | |||
710 | # CONFIG_USB_OHCI_LITTLE_ENDIAN is not set | 748 | # CONFIG_USB_OHCI_LITTLE_ENDIAN is not set |
711 | # CONFIG_USB_SL811_HCD is not set | 749 | # CONFIG_USB_SL811_HCD is not set |
712 | # CONFIG_USB_R8A66597_HCD is not set | 750 | # CONFIG_USB_R8A66597_HCD is not set |
751 | # CONFIG_USB_HWA_HCD is not set | ||
752 | # CONFIG_USB_MUSB_HDRC is not set | ||
713 | 753 | ||
714 | # | 754 | # |
715 | # USB Device Class drivers | 755 | # USB Device Class drivers |
716 | # | 756 | # |
717 | # CONFIG_USB_ACM is not set | 757 | # CONFIG_USB_ACM is not set |
718 | # CONFIG_USB_PRINTER is not set | 758 | # CONFIG_USB_PRINTER is not set |
759 | # CONFIG_USB_WDM is not set | ||
760 | # CONFIG_USB_TMC is not set | ||
719 | 761 | ||
720 | # | 762 | # |
721 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | 763 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' |
@@ -744,7 +786,6 @@ CONFIG_USB_STORAGE=y | |||
744 | # | 786 | # |
745 | # CONFIG_USB_MDC800 is not set | 787 | # CONFIG_USB_MDC800 is not set |
746 | # CONFIG_USB_MICROTEK is not set | 788 | # CONFIG_USB_MICROTEK is not set |
747 | # CONFIG_USB_MON is not set | ||
748 | 789 | ||
749 | # | 790 | # |
750 | # USB port drivers | 791 | # USB port drivers |
@@ -757,7 +798,7 @@ CONFIG_USB_STORAGE=y | |||
757 | # CONFIG_USB_EMI62 is not set | 798 | # CONFIG_USB_EMI62 is not set |
758 | # CONFIG_USB_EMI26 is not set | 799 | # CONFIG_USB_EMI26 is not set |
759 | # CONFIG_USB_ADUTUX is not set | 800 | # CONFIG_USB_ADUTUX is not set |
760 | # CONFIG_USB_AUERSWALD is not set | 801 | # CONFIG_USB_SEVSEG is not set |
761 | # CONFIG_USB_RIO500 is not set | 802 | # CONFIG_USB_RIO500 is not set |
762 | # CONFIG_USB_LEGOTOWER is not set | 803 | # CONFIG_USB_LEGOTOWER is not set |
763 | # CONFIG_USB_LCD is not set | 804 | # CONFIG_USB_LCD is not set |
@@ -773,14 +814,19 @@ CONFIG_USB_STORAGE=y | |||
773 | # CONFIG_USB_TRANCEVIBRATOR is not set | 814 | # CONFIG_USB_TRANCEVIBRATOR is not set |
774 | # CONFIG_USB_IOWARRIOR is not set | 815 | # CONFIG_USB_IOWARRIOR is not set |
775 | # CONFIG_USB_TEST is not set | 816 | # CONFIG_USB_TEST is not set |
817 | # CONFIG_USB_ISIGHTFW is not set | ||
818 | # CONFIG_USB_VST is not set | ||
776 | # CONFIG_USB_GADGET is not set | 819 | # CONFIG_USB_GADGET is not set |
777 | # CONFIG_MMC is not set | 820 | # CONFIG_MMC is not set |
778 | # CONFIG_MEMSTICK is not set | 821 | # CONFIG_MEMSTICK is not set |
779 | # CONFIG_NEW_LEDS is not set | 822 | # CONFIG_NEW_LEDS is not set |
823 | # CONFIG_ACCESSIBILITY is not set | ||
780 | # CONFIG_EDAC is not set | 824 | # CONFIG_EDAC is not set |
781 | # CONFIG_RTC_CLASS is not set | 825 | # CONFIG_RTC_CLASS is not set |
782 | # CONFIG_DMADEVICES is not set | 826 | # CONFIG_DMADEVICES is not set |
783 | # CONFIG_UIO is not set | 827 | # CONFIG_UIO is not set |
828 | # CONFIG_STAGING is not set | ||
829 | CONFIG_STAGING_EXCLUDE_BUILD=y | ||
784 | 830 | ||
785 | # | 831 | # |
786 | # File systems | 832 | # File systems |
@@ -792,12 +838,13 @@ CONFIG_EXT3_FS=y | |||
792 | CONFIG_EXT3_FS_XATTR=y | 838 | CONFIG_EXT3_FS_XATTR=y |
793 | # CONFIG_EXT3_FS_POSIX_ACL is not set | 839 | # CONFIG_EXT3_FS_POSIX_ACL is not set |
794 | # CONFIG_EXT3_FS_SECURITY is not set | 840 | # CONFIG_EXT3_FS_SECURITY is not set |
795 | # CONFIG_EXT4DEV_FS is not set | 841 | # CONFIG_EXT4_FS is not set |
796 | CONFIG_JBD=y | 842 | CONFIG_JBD=y |
797 | CONFIG_FS_MBCACHE=y | 843 | CONFIG_FS_MBCACHE=y |
798 | # CONFIG_REISERFS_FS is not set | 844 | # CONFIG_REISERFS_FS is not set |
799 | # CONFIG_JFS_FS is not set | 845 | # CONFIG_JFS_FS is not set |
800 | # CONFIG_FS_POSIX_ACL is not set | 846 | # CONFIG_FS_POSIX_ACL is not set |
847 | CONFIG_FILE_LOCKING=y | ||
801 | # CONFIG_XFS_FS is not set | 848 | # CONFIG_XFS_FS is not set |
802 | # CONFIG_OCFS2_FS is not set | 849 | # CONFIG_OCFS2_FS is not set |
803 | CONFIG_DNOTIFY=y | 850 | CONFIG_DNOTIFY=y |
@@ -830,6 +877,7 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | |||
830 | CONFIG_PROC_FS=y | 877 | CONFIG_PROC_FS=y |
831 | CONFIG_PROC_KCORE=y | 878 | CONFIG_PROC_KCORE=y |
832 | CONFIG_PROC_SYSCTL=y | 879 | CONFIG_PROC_SYSCTL=y |
880 | CONFIG_PROC_PAGE_MONITOR=y | ||
833 | CONFIG_SYSFS=y | 881 | CONFIG_SYSFS=y |
834 | CONFIG_TMPFS=y | 882 | CONFIG_TMPFS=y |
835 | # CONFIG_TMPFS_POSIX_ACL is not set | 883 | # CONFIG_TMPFS_POSIX_ACL is not set |
@@ -860,6 +908,7 @@ CONFIG_JFFS2_RTIME=y | |||
860 | CONFIG_CRAMFS=y | 908 | CONFIG_CRAMFS=y |
861 | # CONFIG_VXFS_FS is not set | 909 | # CONFIG_VXFS_FS is not set |
862 | # CONFIG_MINIX_FS is not set | 910 | # CONFIG_MINIX_FS is not set |
911 | # CONFIG_OMFS_FS is not set | ||
863 | # CONFIG_HPFS_FS is not set | 912 | # CONFIG_HPFS_FS is not set |
864 | # CONFIG_QNX4FS_FS is not set | 913 | # CONFIG_QNX4FS_FS is not set |
865 | # CONFIG_ROMFS_FS is not set | 914 | # CONFIG_ROMFS_FS is not set |
@@ -870,14 +919,14 @@ CONFIG_NFS_FS=y | |||
870 | CONFIG_NFS_V3=y | 919 | CONFIG_NFS_V3=y |
871 | # CONFIG_NFS_V3_ACL is not set | 920 | # CONFIG_NFS_V3_ACL is not set |
872 | CONFIG_NFS_V4=y | 921 | CONFIG_NFS_V4=y |
873 | # CONFIG_NFSD is not set | ||
874 | CONFIG_ROOT_NFS=y | 922 | CONFIG_ROOT_NFS=y |
923 | # CONFIG_NFSD is not set | ||
875 | CONFIG_LOCKD=y | 924 | CONFIG_LOCKD=y |
876 | CONFIG_LOCKD_V4=y | 925 | CONFIG_LOCKD_V4=y |
877 | CONFIG_NFS_COMMON=y | 926 | CONFIG_NFS_COMMON=y |
878 | CONFIG_SUNRPC=y | 927 | CONFIG_SUNRPC=y |
879 | CONFIG_SUNRPC_GSS=y | 928 | CONFIG_SUNRPC_GSS=y |
880 | # CONFIG_SUNRPC_BIND34 is not set | 929 | # CONFIG_SUNRPC_REGISTER_V4 is not set |
881 | CONFIG_RPCSEC_GSS_KRB5=y | 930 | CONFIG_RPCSEC_GSS_KRB5=y |
882 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | 931 | # CONFIG_RPCSEC_GSS_SPKM3 is not set |
883 | # CONFIG_SMB_FS is not set | 932 | # CONFIG_SMB_FS is not set |
@@ -953,9 +1002,9 @@ CONFIG_NLS_ISO8859_1=y | |||
953 | # Library routines | 1002 | # Library routines |
954 | # | 1003 | # |
955 | CONFIG_BITREVERSE=y | 1004 | CONFIG_BITREVERSE=y |
956 | # CONFIG_GENERIC_FIND_FIRST_BIT is not set | ||
957 | # CONFIG_CRC_CCITT is not set | 1005 | # CONFIG_CRC_CCITT is not set |
958 | # CONFIG_CRC16 is not set | 1006 | # CONFIG_CRC16 is not set |
1007 | # CONFIG_CRC_T10DIF is not set | ||
959 | # CONFIG_CRC_ITU_T is not set | 1008 | # CONFIG_CRC_ITU_T is not set |
960 | CONFIG_CRC32=y | 1009 | CONFIG_CRC32=y |
961 | # CONFIG_CRC7 is not set | 1010 | # CONFIG_CRC7 is not set |
@@ -982,9 +1031,12 @@ CONFIG_FRAME_WARN=1024 | |||
982 | CONFIG_DEBUG_KERNEL=y | 1031 | CONFIG_DEBUG_KERNEL=y |
983 | # CONFIG_DEBUG_SHIRQ is not set | 1032 | # CONFIG_DEBUG_SHIRQ is not set |
984 | CONFIG_DETECT_SOFTLOCKUP=y | 1033 | CONFIG_DETECT_SOFTLOCKUP=y |
1034 | # CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set | ||
1035 | CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 | ||
985 | CONFIG_SCHED_DEBUG=y | 1036 | CONFIG_SCHED_DEBUG=y |
986 | # CONFIG_SCHEDSTATS is not set | 1037 | # CONFIG_SCHEDSTATS is not set |
987 | # CONFIG_TIMER_STATS is not set | 1038 | # CONFIG_TIMER_STATS is not set |
1039 | # CONFIG_DEBUG_OBJECTS is not set | ||
988 | # CONFIG_SLUB_DEBUG_ON is not set | 1040 | # CONFIG_SLUB_DEBUG_ON is not set |
989 | # CONFIG_SLUB_STATS is not set | 1041 | # CONFIG_SLUB_STATS is not set |
990 | # CONFIG_DEBUG_RT_MUTEXES is not set | 1042 | # CONFIG_DEBUG_RT_MUTEXES is not set |
@@ -998,16 +1050,37 @@ CONFIG_SCHED_DEBUG=y | |||
998 | # CONFIG_DEBUG_INFO is not set | 1050 | # CONFIG_DEBUG_INFO is not set |
999 | # CONFIG_DEBUG_VM is not set | 1051 | # CONFIG_DEBUG_VM is not set |
1000 | # CONFIG_DEBUG_WRITECOUNT is not set | 1052 | # CONFIG_DEBUG_WRITECOUNT is not set |
1053 | # CONFIG_DEBUG_MEMORY_INIT is not set | ||
1001 | # CONFIG_DEBUG_LIST is not set | 1054 | # CONFIG_DEBUG_LIST is not set |
1002 | # CONFIG_DEBUG_SG is not set | 1055 | # CONFIG_DEBUG_SG is not set |
1003 | # CONFIG_BOOT_PRINTK_DELAY is not set | 1056 | # CONFIG_BOOT_PRINTK_DELAY is not set |
1057 | # CONFIG_RCU_TORTURE_TEST is not set | ||
1058 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | ||
1004 | # CONFIG_BACKTRACE_SELF_TEST is not set | 1059 | # CONFIG_BACKTRACE_SELF_TEST is not set |
1060 | # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set | ||
1005 | # CONFIG_FAULT_INJECTION is not set | 1061 | # CONFIG_FAULT_INJECTION is not set |
1062 | # CONFIG_LATENCYTOP is not set | ||
1063 | CONFIG_HAVE_FUNCTION_TRACER=y | ||
1064 | |||
1065 | # | ||
1066 | # Tracers | ||
1067 | # | ||
1068 | # CONFIG_FUNCTION_TRACER is not set | ||
1069 | # CONFIG_SCHED_TRACER is not set | ||
1070 | # CONFIG_CONTEXT_SWITCH_TRACER is not set | ||
1071 | # CONFIG_BOOT_TRACER is not set | ||
1072 | # CONFIG_STACK_TRACER is not set | ||
1073 | # CONFIG_DYNAMIC_PRINTK_DEBUG is not set | ||
1006 | # CONFIG_SAMPLES is not set | 1074 | # CONFIG_SAMPLES is not set |
1075 | CONFIG_HAVE_ARCH_KGDB=y | ||
1076 | # CONFIG_KGDB is not set | ||
1007 | # CONFIG_DEBUG_STACKOVERFLOW is not set | 1077 | # CONFIG_DEBUG_STACKOVERFLOW is not set |
1008 | # CONFIG_DEBUG_STACK_USAGE is not set | 1078 | # CONFIG_DEBUG_STACK_USAGE is not set |
1009 | # CONFIG_DEBUG_PAGEALLOC is not set | 1079 | # CONFIG_DEBUG_PAGEALLOC is not set |
1010 | # CONFIG_DEBUGGER is not set | 1080 | # CONFIG_CODE_PATCHING_SELFTEST is not set |
1081 | # CONFIG_FTR_FIXUP_SELFTEST is not set | ||
1082 | # CONFIG_MSI_BITMAP_SELFTEST is not set | ||
1083 | # CONFIG_XMON is not set | ||
1011 | # CONFIG_IRQSTACKS is not set | 1084 | # CONFIG_IRQSTACKS is not set |
1012 | # CONFIG_BDI_SWITCH is not set | 1085 | # CONFIG_BDI_SWITCH is not set |
1013 | # CONFIG_BOOTX_TEXT is not set | 1086 | # CONFIG_BOOTX_TEXT is not set |
@@ -1018,14 +1091,19 @@ CONFIG_SCHED_DEBUG=y | |||
1018 | # | 1091 | # |
1019 | # CONFIG_KEYS is not set | 1092 | # CONFIG_KEYS is not set |
1020 | # CONFIG_SECURITY is not set | 1093 | # CONFIG_SECURITY is not set |
1094 | # CONFIG_SECURITYFS is not set | ||
1021 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | 1095 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set |
1022 | CONFIG_CRYPTO=y | 1096 | CONFIG_CRYPTO=y |
1023 | 1097 | ||
1024 | # | 1098 | # |
1025 | # Crypto core or helper | 1099 | # Crypto core or helper |
1026 | # | 1100 | # |
1101 | # CONFIG_CRYPTO_FIPS is not set | ||
1027 | CONFIG_CRYPTO_ALGAPI=y | 1102 | CONFIG_CRYPTO_ALGAPI=y |
1103 | CONFIG_CRYPTO_AEAD=y | ||
1028 | CONFIG_CRYPTO_BLKCIPHER=y | 1104 | CONFIG_CRYPTO_BLKCIPHER=y |
1105 | CONFIG_CRYPTO_HASH=y | ||
1106 | CONFIG_CRYPTO_RNG=y | ||
1029 | CONFIG_CRYPTO_MANAGER=y | 1107 | CONFIG_CRYPTO_MANAGER=y |
1030 | # CONFIG_CRYPTO_GF128MUL is not set | 1108 | # CONFIG_CRYPTO_GF128MUL is not set |
1031 | # CONFIG_CRYPTO_NULL is not set | 1109 | # CONFIG_CRYPTO_NULL is not set |
@@ -1063,6 +1141,10 @@ CONFIG_CRYPTO_PCBC=y | |||
1063 | # CONFIG_CRYPTO_MD4 is not set | 1141 | # CONFIG_CRYPTO_MD4 is not set |
1064 | CONFIG_CRYPTO_MD5=y | 1142 | CONFIG_CRYPTO_MD5=y |
1065 | # CONFIG_CRYPTO_MICHAEL_MIC is not set | 1143 | # CONFIG_CRYPTO_MICHAEL_MIC is not set |
1144 | # CONFIG_CRYPTO_RMD128 is not set | ||
1145 | # CONFIG_CRYPTO_RMD160 is not set | ||
1146 | # CONFIG_CRYPTO_RMD256 is not set | ||
1147 | # CONFIG_CRYPTO_RMD320 is not set | ||
1066 | # CONFIG_CRYPTO_SHA1 is not set | 1148 | # CONFIG_CRYPTO_SHA1 is not set |
1067 | # CONFIG_CRYPTO_SHA256 is not set | 1149 | # CONFIG_CRYPTO_SHA256 is not set |
1068 | # CONFIG_CRYPTO_SHA512 is not set | 1150 | # CONFIG_CRYPTO_SHA512 is not set |
@@ -1093,6 +1175,11 @@ CONFIG_CRYPTO_DES=y | |||
1093 | # | 1175 | # |
1094 | # CONFIG_CRYPTO_DEFLATE is not set | 1176 | # CONFIG_CRYPTO_DEFLATE is not set |
1095 | # CONFIG_CRYPTO_LZO is not set | 1177 | # CONFIG_CRYPTO_LZO is not set |
1178 | |||
1179 | # | ||
1180 | # Random Number Generation | ||
1181 | # | ||
1182 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | ||
1096 | CONFIG_CRYPTO_HW=y | 1183 | CONFIG_CRYPTO_HW=y |
1097 | CONFIG_PPC_CLOCK=y | 1184 | CONFIG_PPC_CLOCK=y |
1098 | CONFIG_PPC_LIB_RHEAP=y | 1185 | CONFIG_PPC_LIB_RHEAP=y |
diff --git a/arch/powerpc/configs/52xx/lite5200b_defconfig b/arch/powerpc/configs/52xx/lite5200b_defconfig index 1a8a250fa11b..5b969f9c925e 100644 --- a/arch/powerpc/configs/52xx/lite5200b_defconfig +++ b/arch/powerpc/configs/52xx/lite5200b_defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.25 | 3 | # Linux kernel version: 2.6.28-rc4 |
4 | # Tue Apr 29 07:12:56 2008 | 4 | # Thu Nov 13 02:10:16 2008 |
5 | # | 5 | # |
6 | # CONFIG_PPC64 is not set | 6 | # CONFIG_PPC64 is not set |
7 | 7 | ||
@@ -22,7 +22,7 @@ CONFIG_PPC_STD_MMU_32=y | |||
22 | # CONFIG_SMP is not set | 22 | # CONFIG_SMP is not set |
23 | CONFIG_PPC32=y | 23 | CONFIG_PPC32=y |
24 | CONFIG_WORD_SIZE=32 | 24 | CONFIG_WORD_SIZE=32 |
25 | CONFIG_PPC_MERGE=y | 25 | # CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set |
26 | CONFIG_MMU=y | 26 | CONFIG_MMU=y |
27 | CONFIG_GENERIC_CMOS_UPDATE=y | 27 | CONFIG_GENERIC_CMOS_UPDATE=y |
28 | CONFIG_GENERIC_TIME=y | 28 | CONFIG_GENERIC_TIME=y |
@@ -32,6 +32,7 @@ CONFIG_GENERIC_HARDIRQS=y | |||
32 | # CONFIG_HAVE_SETUP_PER_CPU_AREA is not set | 32 | # CONFIG_HAVE_SETUP_PER_CPU_AREA is not set |
33 | CONFIG_IRQ_PER_CPU=y | 33 | CONFIG_IRQ_PER_CPU=y |
34 | CONFIG_STACKTRACE_SUPPORT=y | 34 | CONFIG_STACKTRACE_SUPPORT=y |
35 | CONFIG_HAVE_LATENCYTOP_SUPPORT=y | ||
35 | CONFIG_LOCKDEP_SUPPORT=y | 36 | CONFIG_LOCKDEP_SUPPORT=y |
36 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y | 37 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y |
37 | CONFIG_ARCH_HAS_ILOG2_U32=y | 38 | CONFIG_ARCH_HAS_ILOG2_U32=y |
@@ -103,7 +104,9 @@ CONFIG_SIGNALFD=y | |||
103 | CONFIG_TIMERFD=y | 104 | CONFIG_TIMERFD=y |
104 | CONFIG_EVENTFD=y | 105 | CONFIG_EVENTFD=y |
105 | CONFIG_SHMEM=y | 106 | CONFIG_SHMEM=y |
107 | CONFIG_AIO=y | ||
106 | CONFIG_VM_EVENT_COUNTERS=y | 108 | CONFIG_VM_EVENT_COUNTERS=y |
109 | CONFIG_PCI_QUIRKS=y | ||
107 | CONFIG_SLUB_DEBUG=y | 110 | CONFIG_SLUB_DEBUG=y |
108 | # CONFIG_SLAB is not set | 111 | # CONFIG_SLAB is not set |
109 | CONFIG_SLUB=y | 112 | CONFIG_SLUB=y |
@@ -111,24 +114,30 @@ CONFIG_SLUB=y | |||
111 | # CONFIG_PROFILING is not set | 114 | # CONFIG_PROFILING is not set |
112 | # CONFIG_MARKERS is not set | 115 | # CONFIG_MARKERS is not set |
113 | CONFIG_HAVE_OPROFILE=y | 116 | CONFIG_HAVE_OPROFILE=y |
117 | CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y | ||
118 | CONFIG_HAVE_IOREMAP_PROT=y | ||
114 | CONFIG_HAVE_KPROBES=y | 119 | CONFIG_HAVE_KPROBES=y |
115 | CONFIG_HAVE_KRETPROBES=y | 120 | CONFIG_HAVE_KRETPROBES=y |
116 | CONFIG_PROC_PAGE_MONITOR=y | 121 | CONFIG_HAVE_ARCH_TRACEHOOK=y |
122 | CONFIG_HAVE_CLK=y | ||
123 | # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set | ||
117 | CONFIG_SLABINFO=y | 124 | CONFIG_SLABINFO=y |
118 | CONFIG_RT_MUTEXES=y | 125 | CONFIG_RT_MUTEXES=y |
119 | # CONFIG_TINY_SHMEM is not set | 126 | # CONFIG_TINY_SHMEM is not set |
120 | CONFIG_BASE_SMALL=0 | 127 | CONFIG_BASE_SMALL=0 |
121 | CONFIG_MODULES=y | 128 | CONFIG_MODULES=y |
129 | # CONFIG_MODULE_FORCE_LOAD is not set | ||
122 | CONFIG_MODULE_UNLOAD=y | 130 | CONFIG_MODULE_UNLOAD=y |
123 | # CONFIG_MODULE_FORCE_UNLOAD is not set | 131 | # CONFIG_MODULE_FORCE_UNLOAD is not set |
124 | # CONFIG_MODVERSIONS is not set | 132 | # CONFIG_MODVERSIONS is not set |
125 | # CONFIG_MODULE_SRCVERSION_ALL is not set | 133 | # CONFIG_MODULE_SRCVERSION_ALL is not set |
126 | # CONFIG_KMOD is not set | 134 | CONFIG_KMOD=y |
127 | CONFIG_BLOCK=y | 135 | CONFIG_BLOCK=y |
128 | # CONFIG_LBD is not set | 136 | # CONFIG_LBD is not set |
129 | # CONFIG_BLK_DEV_IO_TRACE is not set | 137 | # CONFIG_BLK_DEV_IO_TRACE is not set |
130 | # CONFIG_LSF is not set | 138 | # CONFIG_LSF is not set |
131 | # CONFIG_BLK_DEV_BSG is not set | 139 | # CONFIG_BLK_DEV_BSG is not set |
140 | # CONFIG_BLK_DEV_INTEGRITY is not set | ||
132 | 141 | ||
133 | # | 142 | # |
134 | # IO Schedulers | 143 | # IO Schedulers |
@@ -143,19 +152,16 @@ CONFIG_DEFAULT_AS=y | |||
143 | # CONFIG_DEFAULT_NOOP is not set | 152 | # CONFIG_DEFAULT_NOOP is not set |
144 | CONFIG_DEFAULT_IOSCHED="anticipatory" | 153 | CONFIG_DEFAULT_IOSCHED="anticipatory" |
145 | CONFIG_CLASSIC_RCU=y | 154 | CONFIG_CLASSIC_RCU=y |
155 | CONFIG_FREEZER=y | ||
146 | 156 | ||
147 | # | 157 | # |
148 | # Platform support | 158 | # Platform support |
149 | # | 159 | # |
150 | CONFIG_PPC_MULTIPLATFORM=y | 160 | CONFIG_PPC_MULTIPLATFORM=y |
151 | # CONFIG_PPC_82xx is not set | ||
152 | # CONFIG_PPC_83xx is not set | ||
153 | # CONFIG_PPC_86xx is not set | ||
154 | CONFIG_CLASSIC32=y | 161 | CONFIG_CLASSIC32=y |
155 | # CONFIG_PPC_CHRP is not set | 162 | # CONFIG_PPC_CHRP is not set |
156 | # CONFIG_PPC_MPC512x is not set | ||
157 | # CONFIG_PPC_MPC5121 is not set | ||
158 | # CONFIG_MPC5121_ADS is not set | 163 | # CONFIG_MPC5121_ADS is not set |
164 | # CONFIG_MPC5121_GENERIC is not set | ||
159 | CONFIG_PPC_MPC52xx=y | 165 | CONFIG_PPC_MPC52xx=y |
160 | CONFIG_PPC_MPC5200_SIMPLE=y | 166 | CONFIG_PPC_MPC5200_SIMPLE=y |
161 | # CONFIG_PPC_EFIKA is not set | 167 | # CONFIG_PPC_EFIKA is not set |
@@ -165,7 +171,10 @@ CONFIG_PPC_LITE5200=y | |||
165 | # CONFIG_PPC_PMAC is not set | 171 | # CONFIG_PPC_PMAC is not set |
166 | # CONFIG_PPC_CELL is not set | 172 | # CONFIG_PPC_CELL is not set |
167 | # CONFIG_PPC_CELL_NATIVE is not set | 173 | # CONFIG_PPC_CELL_NATIVE is not set |
174 | # CONFIG_PPC_82xx is not set | ||
168 | # CONFIG_PQ2ADS is not set | 175 | # CONFIG_PQ2ADS is not set |
176 | # CONFIG_PPC_83xx is not set | ||
177 | # CONFIG_PPC_86xx is not set | ||
169 | # CONFIG_EMBEDDED6xx is not set | 178 | # CONFIG_EMBEDDED6xx is not set |
170 | # CONFIG_IPIC is not set | 179 | # CONFIG_IPIC is not set |
171 | # CONFIG_MPIC is not set | 180 | # CONFIG_MPIC is not set |
@@ -198,11 +207,13 @@ CONFIG_HZ_250=y | |||
198 | # CONFIG_HZ_300 is not set | 207 | # CONFIG_HZ_300 is not set |
199 | # CONFIG_HZ_1000 is not set | 208 | # CONFIG_HZ_1000 is not set |
200 | CONFIG_HZ=250 | 209 | CONFIG_HZ=250 |
201 | # CONFIG_SCHED_HRTICK is not set | 210 | CONFIG_SCHED_HRTICK=y |
202 | CONFIG_PREEMPT_NONE=y | 211 | CONFIG_PREEMPT_NONE=y |
203 | # CONFIG_PREEMPT_VOLUNTARY is not set | 212 | # CONFIG_PREEMPT_VOLUNTARY is not set |
204 | # CONFIG_PREEMPT is not set | 213 | # CONFIG_PREEMPT is not set |
205 | CONFIG_BINFMT_ELF=y | 214 | CONFIG_BINFMT_ELF=y |
215 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set | ||
216 | # CONFIG_HAVE_AOUT is not set | ||
206 | # CONFIG_BINFMT_MISC is not set | 217 | # CONFIG_BINFMT_MISC is not set |
207 | # CONFIG_IOMMU_HELPER is not set | 218 | # CONFIG_IOMMU_HELPER is not set |
208 | CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y | 219 | CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y |
@@ -217,19 +228,20 @@ CONFIG_FLATMEM_MANUAL=y | |||
217 | # CONFIG_SPARSEMEM_MANUAL is not set | 228 | # CONFIG_SPARSEMEM_MANUAL is not set |
218 | CONFIG_FLATMEM=y | 229 | CONFIG_FLATMEM=y |
219 | CONFIG_FLAT_NODE_MEM_MAP=y | 230 | CONFIG_FLAT_NODE_MEM_MAP=y |
220 | # CONFIG_SPARSEMEM_STATIC is not set | ||
221 | # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set | ||
222 | CONFIG_PAGEFLAGS_EXTENDED=y | 231 | CONFIG_PAGEFLAGS_EXTENDED=y |
223 | CONFIG_SPLIT_PTLOCK_CPUS=4 | 232 | CONFIG_SPLIT_PTLOCK_CPUS=4 |
233 | CONFIG_MIGRATION=y | ||
224 | # CONFIG_RESOURCES_64BIT is not set | 234 | # CONFIG_RESOURCES_64BIT is not set |
235 | # CONFIG_PHYS_ADDR_T_64BIT is not set | ||
225 | CONFIG_ZONE_DMA_FLAG=1 | 236 | CONFIG_ZONE_DMA_FLAG=1 |
226 | CONFIG_BOUNCE=y | 237 | CONFIG_BOUNCE=y |
227 | CONFIG_VIRT_TO_BUS=y | 238 | CONFIG_VIRT_TO_BUS=y |
239 | CONFIG_UNEVICTABLE_LRU=y | ||
228 | CONFIG_FORCE_MAX_ZONEORDER=11 | 240 | CONFIG_FORCE_MAX_ZONEORDER=11 |
229 | CONFIG_PROC_DEVICETREE=y | 241 | CONFIG_PROC_DEVICETREE=y |
230 | # CONFIG_CMDLINE_BOOL is not set | 242 | # CONFIG_CMDLINE_BOOL is not set |
243 | CONFIG_EXTRA_TARGETS="" | ||
231 | CONFIG_PM=y | 244 | CONFIG_PM=y |
232 | # CONFIG_PM_LEGACY is not set | ||
233 | # CONFIG_PM_DEBUG is not set | 245 | # CONFIG_PM_DEBUG is not set |
234 | CONFIG_PM_SLEEP=y | 246 | CONFIG_PM_SLEEP=y |
235 | CONFIG_SUSPEND=y | 247 | CONFIG_SUSPEND=y |
@@ -243,7 +255,7 @@ CONFIG_ISA_DMA_API=y | |||
243 | CONFIG_ZONE_DMA=y | 255 | CONFIG_ZONE_DMA=y |
244 | CONFIG_GENERIC_ISA_DMA=y | 256 | CONFIG_GENERIC_ISA_DMA=y |
245 | # CONFIG_PPC_INDIRECT_PCI is not set | 257 | # CONFIG_PPC_INDIRECT_PCI is not set |
246 | CONFIG_FSL_SOC=y | 258 | CONFIG_PPC_PCI_CHOICE=y |
247 | CONFIG_PCI=y | 259 | CONFIG_PCI=y |
248 | CONFIG_PCI_DOMAINS=y | 260 | CONFIG_PCI_DOMAINS=y |
249 | CONFIG_PCI_SYSCALL=y | 261 | CONFIG_PCI_SYSCALL=y |
@@ -269,10 +281,6 @@ CONFIG_PAGE_OFFSET=0xc0000000 | |||
269 | CONFIG_KERNEL_START=0xc0000000 | 281 | CONFIG_KERNEL_START=0xc0000000 |
270 | CONFIG_PHYSICAL_START=0x00000000 | 282 | CONFIG_PHYSICAL_START=0x00000000 |
271 | CONFIG_TASK_SIZE=0xc0000000 | 283 | CONFIG_TASK_SIZE=0xc0000000 |
272 | |||
273 | # | ||
274 | # Networking | ||
275 | # | ||
276 | CONFIG_NET=y | 284 | CONFIG_NET=y |
277 | 285 | ||
278 | # | 286 | # |
@@ -323,6 +331,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic" | |||
323 | # CONFIG_TIPC is not set | 331 | # CONFIG_TIPC is not set |
324 | # CONFIG_ATM is not set | 332 | # CONFIG_ATM is not set |
325 | # CONFIG_BRIDGE is not set | 333 | # CONFIG_BRIDGE is not set |
334 | # CONFIG_NET_DSA is not set | ||
326 | # CONFIG_VLAN_8021Q is not set | 335 | # CONFIG_VLAN_8021Q is not set |
327 | # CONFIG_DECNET is not set | 336 | # CONFIG_DECNET is not set |
328 | # CONFIG_LLC2 is not set | 337 | # CONFIG_LLC2 is not set |
@@ -343,14 +352,8 @@ CONFIG_DEFAULT_TCP_CONG="cubic" | |||
343 | # CONFIG_IRDA is not set | 352 | # CONFIG_IRDA is not set |
344 | # CONFIG_BT is not set | 353 | # CONFIG_BT is not set |
345 | # CONFIG_AF_RXRPC is not set | 354 | # CONFIG_AF_RXRPC is not set |
346 | 355 | # CONFIG_PHONET is not set | |
347 | # | 356 | # CONFIG_WIRELESS is not set |
348 | # Wireless | ||
349 | # | ||
350 | # CONFIG_CFG80211 is not set | ||
351 | # CONFIG_WIRELESS_EXT is not set | ||
352 | # CONFIG_MAC80211 is not set | ||
353 | # CONFIG_IEEE80211 is not set | ||
354 | # CONFIG_RFKILL is not set | 357 | # CONFIG_RFKILL is not set |
355 | # CONFIG_NET_9P is not set | 358 | # CONFIG_NET_9P is not set |
356 | 359 | ||
@@ -390,12 +393,16 @@ CONFIG_BLK_DEV_RAM_SIZE=32768 | |||
390 | # CONFIG_BLK_DEV_XIP is not set | 393 | # CONFIG_BLK_DEV_XIP is not set |
391 | # CONFIG_CDROM_PKTCDVD is not set | 394 | # CONFIG_CDROM_PKTCDVD is not set |
392 | # CONFIG_ATA_OVER_ETH is not set | 395 | # CONFIG_ATA_OVER_ETH is not set |
396 | # CONFIG_BLK_DEV_HD is not set | ||
393 | CONFIG_MISC_DEVICES=y | 397 | CONFIG_MISC_DEVICES=y |
394 | # CONFIG_PHANTOM is not set | 398 | # CONFIG_PHANTOM is not set |
395 | # CONFIG_EEPROM_93CX6 is not set | 399 | # CONFIG_EEPROM_93CX6 is not set |
396 | # CONFIG_SGI_IOC4 is not set | 400 | # CONFIG_SGI_IOC4 is not set |
397 | # CONFIG_TIFM_CORE is not set | 401 | # CONFIG_TIFM_CORE is not set |
402 | # CONFIG_ICS932S401 is not set | ||
398 | # CONFIG_ENCLOSURE_SERVICES is not set | 403 | # CONFIG_ENCLOSURE_SERVICES is not set |
404 | # CONFIG_HP_ILO is not set | ||
405 | # CONFIG_C2PORT is not set | ||
399 | CONFIG_HAVE_IDE=y | 406 | CONFIG_HAVE_IDE=y |
400 | # CONFIG_IDE is not set | 407 | # CONFIG_IDE is not set |
401 | 408 | ||
@@ -412,7 +419,7 @@ CONFIG_SCSI_DMA=y | |||
412 | # | 419 | # |
413 | # SCSI support type (disk, tape, CD-ROM) | 420 | # SCSI support type (disk, tape, CD-ROM) |
414 | # | 421 | # |
415 | # CONFIG_BLK_DEV_SD is not set | 422 | CONFIG_BLK_DEV_SD=y |
416 | # CONFIG_CHR_DEV_ST is not set | 423 | # CONFIG_CHR_DEV_ST is not set |
417 | # CONFIG_CHR_DEV_OSST is not set | 424 | # CONFIG_CHR_DEV_OSST is not set |
418 | # CONFIG_BLK_DEV_SR is not set | 425 | # CONFIG_BLK_DEV_SR is not set |
@@ -474,12 +481,12 @@ CONFIG_SCSI_LOWLEVEL=y | |||
474 | # CONFIG_SCSI_NSP32 is not set | 481 | # CONFIG_SCSI_NSP32 is not set |
475 | # CONFIG_SCSI_DEBUG is not set | 482 | # CONFIG_SCSI_DEBUG is not set |
476 | # CONFIG_SCSI_SRP is not set | 483 | # CONFIG_SCSI_SRP is not set |
484 | # CONFIG_SCSI_DH is not set | ||
477 | CONFIG_ATA=y | 485 | CONFIG_ATA=y |
478 | # CONFIG_ATA_NONSTANDARD is not set | 486 | # CONFIG_ATA_NONSTANDARD is not set |
479 | CONFIG_SATA_PMP=y | 487 | CONFIG_SATA_PMP=y |
480 | # CONFIG_SATA_AHCI is not set | 488 | # CONFIG_SATA_AHCI is not set |
481 | # CONFIG_SATA_SIL24 is not set | 489 | # CONFIG_SATA_SIL24 is not set |
482 | # CONFIG_SATA_FSL is not set | ||
483 | CONFIG_ATA_SFF=y | 490 | CONFIG_ATA_SFF=y |
484 | # CONFIG_SATA_SVW is not set | 491 | # CONFIG_SATA_SVW is not set |
485 | # CONFIG_ATA_PIIX is not set | 492 | # CONFIG_ATA_PIIX is not set |
@@ -535,18 +542,22 @@ CONFIG_PATA_MPC52xx=y | |||
535 | # CONFIG_PATA_VIA is not set | 542 | # CONFIG_PATA_VIA is not set |
536 | # CONFIG_PATA_WINBOND is not set | 543 | # CONFIG_PATA_WINBOND is not set |
537 | # CONFIG_PATA_PLATFORM is not set | 544 | # CONFIG_PATA_PLATFORM is not set |
545 | # CONFIG_PATA_SCH is not set | ||
538 | # CONFIG_MD is not set | 546 | # CONFIG_MD is not set |
539 | # CONFIG_FUSION is not set | 547 | # CONFIG_FUSION is not set |
540 | 548 | ||
541 | # | 549 | # |
542 | # IEEE 1394 (FireWire) support | 550 | # IEEE 1394 (FireWire) support |
543 | # | 551 | # |
552 | |||
553 | # | ||
554 | # Enable only one of the two stacks, unless you know what you are doing | ||
555 | # | ||
544 | # CONFIG_FIREWIRE is not set | 556 | # CONFIG_FIREWIRE is not set |
545 | # CONFIG_IEEE1394 is not set | 557 | # CONFIG_IEEE1394 is not set |
546 | # CONFIG_I2O is not set | 558 | # CONFIG_I2O is not set |
547 | # CONFIG_MACINTOSH_DRIVERS is not set | 559 | # CONFIG_MACINTOSH_DRIVERS is not set |
548 | CONFIG_NETDEVICES=y | 560 | CONFIG_NETDEVICES=y |
549 | # CONFIG_NETDEVICES_MULTIQUEUE is not set | ||
550 | # CONFIG_DUMMY is not set | 561 | # CONFIG_DUMMY is not set |
551 | # CONFIG_BONDING is not set | 562 | # CONFIG_BONDING is not set |
552 | # CONFIG_MACVLAN is not set | 563 | # CONFIG_MACVLAN is not set |
@@ -583,16 +594,19 @@ CONFIG_NET_ETHERNET=y | |||
583 | # CONFIG_IBM_NEW_EMAC_RGMII is not set | 594 | # CONFIG_IBM_NEW_EMAC_RGMII is not set |
584 | # CONFIG_IBM_NEW_EMAC_TAH is not set | 595 | # CONFIG_IBM_NEW_EMAC_TAH is not set |
585 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set | 596 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set |
597 | # CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set | ||
598 | # CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set | ||
599 | # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set | ||
586 | # CONFIG_NET_PCI is not set | 600 | # CONFIG_NET_PCI is not set |
587 | # CONFIG_B44 is not set | 601 | # CONFIG_B44 is not set |
588 | CONFIG_FEC_MPC52xx=y | 602 | CONFIG_FEC_MPC52xx=y |
589 | CONFIG_FEC_MPC52xx_MDIO=y | 603 | CONFIG_FEC_MPC52xx_MDIO=y |
604 | # CONFIG_ATL2 is not set | ||
590 | CONFIG_NETDEV_1000=y | 605 | CONFIG_NETDEV_1000=y |
591 | # CONFIG_ACENIC is not set | 606 | # CONFIG_ACENIC is not set |
592 | # CONFIG_DL2K is not set | 607 | # CONFIG_DL2K is not set |
593 | # CONFIG_E1000 is not set | 608 | # CONFIG_E1000 is not set |
594 | # CONFIG_E1000E is not set | 609 | # CONFIG_E1000E is not set |
595 | # CONFIG_E1000E_ENABLED is not set | ||
596 | # CONFIG_IP1000 is not set | 610 | # CONFIG_IP1000 is not set |
597 | # CONFIG_IGB is not set | 611 | # CONFIG_IGB is not set |
598 | # CONFIG_NS83820 is not set | 612 | # CONFIG_NS83820 is not set |
@@ -605,22 +619,27 @@ CONFIG_NETDEV_1000=y | |||
605 | # CONFIG_VIA_VELOCITY is not set | 619 | # CONFIG_VIA_VELOCITY is not set |
606 | # CONFIG_TIGON3 is not set | 620 | # CONFIG_TIGON3 is not set |
607 | # CONFIG_BNX2 is not set | 621 | # CONFIG_BNX2 is not set |
608 | # CONFIG_GIANFAR is not set | ||
609 | # CONFIG_MV643XX_ETH is not set | 622 | # CONFIG_MV643XX_ETH is not set |
610 | # CONFIG_QLA3XXX is not set | 623 | # CONFIG_QLA3XXX is not set |
611 | # CONFIG_ATL1 is not set | 624 | # CONFIG_ATL1 is not set |
625 | # CONFIG_ATL1E is not set | ||
626 | # CONFIG_JME is not set | ||
612 | CONFIG_NETDEV_10000=y | 627 | CONFIG_NETDEV_10000=y |
613 | # CONFIG_CHELSIO_T1 is not set | 628 | # CONFIG_CHELSIO_T1 is not set |
614 | # CONFIG_CHELSIO_T3 is not set | 629 | # CONFIG_CHELSIO_T3 is not set |
630 | # CONFIG_ENIC is not set | ||
615 | # CONFIG_IXGBE is not set | 631 | # CONFIG_IXGBE is not set |
616 | # CONFIG_IXGB is not set | 632 | # CONFIG_IXGB is not set |
617 | # CONFIG_S2IO is not set | 633 | # CONFIG_S2IO is not set |
618 | # CONFIG_MYRI10GE is not set | 634 | # CONFIG_MYRI10GE is not set |
619 | # CONFIG_NETXEN_NIC is not set | 635 | # CONFIG_NETXEN_NIC is not set |
620 | # CONFIG_NIU is not set | 636 | # CONFIG_NIU is not set |
637 | # CONFIG_MLX4_EN is not set | ||
621 | # CONFIG_MLX4_CORE is not set | 638 | # CONFIG_MLX4_CORE is not set |
622 | # CONFIG_TEHUTI is not set | 639 | # CONFIG_TEHUTI is not set |
623 | # CONFIG_BNX2X is not set | 640 | # CONFIG_BNX2X is not set |
641 | # CONFIG_QLGE is not set | ||
642 | # CONFIG_SFC is not set | ||
624 | # CONFIG_TR is not set | 643 | # CONFIG_TR is not set |
625 | 644 | ||
626 | # | 645 | # |
@@ -628,7 +647,6 @@ CONFIG_NETDEV_10000=y | |||
628 | # | 647 | # |
629 | # CONFIG_WLAN_PRE80211 is not set | 648 | # CONFIG_WLAN_PRE80211 is not set |
630 | # CONFIG_WLAN_80211 is not set | 649 | # CONFIG_WLAN_80211 is not set |
631 | # CONFIG_IWLWIFI is not set | ||
632 | # CONFIG_IWLWIFI_LEDS is not set | 650 | # CONFIG_IWLWIFI_LEDS is not set |
633 | # CONFIG_WAN is not set | 651 | # CONFIG_WAN is not set |
634 | # CONFIG_FDDI is not set | 652 | # CONFIG_FDDI is not set |
@@ -657,6 +675,7 @@ CONFIG_NETDEV_10000=y | |||
657 | # Character devices | 675 | # Character devices |
658 | # | 676 | # |
659 | # CONFIG_VT is not set | 677 | # CONFIG_VT is not set |
678 | CONFIG_DEVKMEM=y | ||
660 | # CONFIG_SERIAL_NONSTANDARD is not set | 679 | # CONFIG_SERIAL_NONSTANDARD is not set |
661 | # CONFIG_NOZOMI is not set | 680 | # CONFIG_NOZOMI is not set |
662 | 681 | ||
@@ -691,42 +710,63 @@ CONFIG_DEVPORT=y | |||
691 | CONFIG_I2C=y | 710 | CONFIG_I2C=y |
692 | CONFIG_I2C_BOARDINFO=y | 711 | CONFIG_I2C_BOARDINFO=y |
693 | CONFIG_I2C_CHARDEV=y | 712 | CONFIG_I2C_CHARDEV=y |
713 | CONFIG_I2C_HELPER_AUTO=y | ||
694 | 714 | ||
695 | # | 715 | # |
696 | # I2C Hardware Bus support | 716 | # I2C Hardware Bus support |
697 | # | 717 | # |
718 | |||
719 | # | ||
720 | # PC SMBus host controller drivers | ||
721 | # | ||
698 | # CONFIG_I2C_ALI1535 is not set | 722 | # CONFIG_I2C_ALI1535 is not set |
699 | # CONFIG_I2C_ALI1563 is not set | 723 | # CONFIG_I2C_ALI1563 is not set |
700 | # CONFIG_I2C_ALI15X3 is not set | 724 | # CONFIG_I2C_ALI15X3 is not set |
701 | # CONFIG_I2C_AMD756 is not set | 725 | # CONFIG_I2C_AMD756 is not set |
702 | # CONFIG_I2C_AMD8111 is not set | 726 | # CONFIG_I2C_AMD8111 is not set |
703 | # CONFIG_I2C_I801 is not set | 727 | # CONFIG_I2C_I801 is not set |
704 | # CONFIG_I2C_I810 is not set | 728 | # CONFIG_I2C_ISCH is not set |
705 | # CONFIG_I2C_PIIX4 is not set | 729 | # CONFIG_I2C_PIIX4 is not set |
706 | CONFIG_I2C_MPC=y | ||
707 | # CONFIG_I2C_NFORCE2 is not set | 730 | # CONFIG_I2C_NFORCE2 is not set |
708 | # CONFIG_I2C_OCORES is not set | ||
709 | # CONFIG_I2C_PARPORT_LIGHT is not set | ||
710 | # CONFIG_I2C_PROSAVAGE is not set | ||
711 | # CONFIG_I2C_SAVAGE4 is not set | ||
712 | # CONFIG_I2C_SIMTEC is not set | ||
713 | # CONFIG_I2C_SIS5595 is not set | 731 | # CONFIG_I2C_SIS5595 is not set |
714 | # CONFIG_I2C_SIS630 is not set | 732 | # CONFIG_I2C_SIS630 is not set |
715 | # CONFIG_I2C_SIS96X is not set | 733 | # CONFIG_I2C_SIS96X is not set |
716 | # CONFIG_I2C_TAOS_EVM is not set | ||
717 | # CONFIG_I2C_STUB is not set | ||
718 | # CONFIG_I2C_VIA is not set | 734 | # CONFIG_I2C_VIA is not set |
719 | # CONFIG_I2C_VIAPRO is not set | 735 | # CONFIG_I2C_VIAPRO is not set |
736 | |||
737 | # | ||
738 | # I2C system bus drivers (mostly embedded / system-on-chip) | ||
739 | # | ||
740 | CONFIG_I2C_MPC=y | ||
741 | # CONFIG_I2C_OCORES is not set | ||
742 | # CONFIG_I2C_SIMTEC is not set | ||
743 | |||
744 | # | ||
745 | # External I2C/SMBus adapter drivers | ||
746 | # | ||
747 | # CONFIG_I2C_PARPORT_LIGHT is not set | ||
748 | # CONFIG_I2C_TAOS_EVM is not set | ||
749 | |||
750 | # | ||
751 | # Graphics adapter I2C/DDC channel drivers | ||
752 | # | ||
720 | # CONFIG_I2C_VOODOO3 is not set | 753 | # CONFIG_I2C_VOODOO3 is not set |
754 | |||
755 | # | ||
756 | # Other I2C/SMBus bus drivers | ||
757 | # | ||
721 | # CONFIG_I2C_PCA_PLATFORM is not set | 758 | # CONFIG_I2C_PCA_PLATFORM is not set |
759 | # CONFIG_I2C_STUB is not set | ||
722 | 760 | ||
723 | # | 761 | # |
724 | # Miscellaneous I2C Chip support | 762 | # Miscellaneous I2C Chip support |
725 | # | 763 | # |
726 | # CONFIG_DS1682 is not set | 764 | # CONFIG_DS1682 is not set |
765 | # CONFIG_AT24 is not set | ||
727 | # CONFIG_SENSORS_EEPROM is not set | 766 | # CONFIG_SENSORS_EEPROM is not set |
728 | # CONFIG_SENSORS_PCF8574 is not set | 767 | # CONFIG_SENSORS_PCF8574 is not set |
729 | # CONFIG_PCF8575 is not set | 768 | # CONFIG_PCF8575 is not set |
769 | # CONFIG_SENSORS_PCA9539 is not set | ||
730 | # CONFIG_SENSORS_PCF8591 is not set | 770 | # CONFIG_SENSORS_PCF8591 is not set |
731 | # CONFIG_SENSORS_MAX6875 is not set | 771 | # CONFIG_SENSORS_MAX6875 is not set |
732 | # CONFIG_SENSORS_TSL2550 is not set | 772 | # CONFIG_SENSORS_TSL2550 is not set |
@@ -735,29 +775,47 @@ CONFIG_I2C_MPC=y | |||
735 | # CONFIG_I2C_DEBUG_BUS is not set | 775 | # CONFIG_I2C_DEBUG_BUS is not set |
736 | # CONFIG_I2C_DEBUG_CHIP is not set | 776 | # CONFIG_I2C_DEBUG_CHIP is not set |
737 | # CONFIG_SPI is not set | 777 | # CONFIG_SPI is not set |
778 | CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y | ||
779 | # CONFIG_GPIOLIB is not set | ||
738 | # CONFIG_W1 is not set | 780 | # CONFIG_W1 is not set |
739 | # CONFIG_POWER_SUPPLY is not set | 781 | # CONFIG_POWER_SUPPLY is not set |
740 | # CONFIG_HWMON is not set | 782 | # CONFIG_HWMON is not set |
741 | # CONFIG_THERMAL is not set | 783 | # CONFIG_THERMAL is not set |
784 | # CONFIG_THERMAL_HWMON is not set | ||
742 | # CONFIG_WATCHDOG is not set | 785 | # CONFIG_WATCHDOG is not set |
786 | CONFIG_SSB_POSSIBLE=y | ||
743 | 787 | ||
744 | # | 788 | # |
745 | # Sonics Silicon Backplane | 789 | # Sonics Silicon Backplane |
746 | # | 790 | # |
747 | CONFIG_SSB_POSSIBLE=y | ||
748 | # CONFIG_SSB is not set | 791 | # CONFIG_SSB is not set |
749 | 792 | ||
750 | # | 793 | # |
751 | # Multifunction device drivers | 794 | # Multifunction device drivers |
752 | # | 795 | # |
796 | # CONFIG_MFD_CORE is not set | ||
753 | # CONFIG_MFD_SM501 is not set | 797 | # CONFIG_MFD_SM501 is not set |
754 | # CONFIG_HTC_PASIC3 is not set | 798 | # CONFIG_HTC_PASIC3 is not set |
799 | # CONFIG_MFD_TMIO is not set | ||
800 | # CONFIG_PMIC_DA903X is not set | ||
801 | # CONFIG_MFD_WM8400 is not set | ||
802 | # CONFIG_MFD_WM8350_I2C is not set | ||
803 | # CONFIG_REGULATOR is not set | ||
755 | 804 | ||
756 | # | 805 | # |
757 | # Multimedia devices | 806 | # Multimedia devices |
758 | # | 807 | # |
808 | |||
809 | # | ||
810 | # Multimedia core support | ||
811 | # | ||
759 | # CONFIG_VIDEO_DEV is not set | 812 | # CONFIG_VIDEO_DEV is not set |
760 | # CONFIG_DVB_CORE is not set | 813 | # CONFIG_DVB_CORE is not set |
814 | # CONFIG_VIDEO_MEDIA is not set | ||
815 | |||
816 | # | ||
817 | # Multimedia drivers | ||
818 | # | ||
761 | # CONFIG_DAB is not set | 819 | # CONFIG_DAB is not set |
762 | 820 | ||
763 | # | 821 | # |
@@ -774,10 +832,6 @@ CONFIG_VIDEO_OUTPUT_CONTROL=m | |||
774 | # Display device support | 832 | # Display device support |
775 | # | 833 | # |
776 | # CONFIG_DISPLAY_SUPPORT is not set | 834 | # CONFIG_DISPLAY_SUPPORT is not set |
777 | |||
778 | # | ||
779 | # Sound | ||
780 | # | ||
781 | # CONFIG_SOUND is not set | 835 | # CONFIG_SOUND is not set |
782 | CONFIG_USB_SUPPORT=y | 836 | CONFIG_USB_SUPPORT=y |
783 | CONFIG_USB_ARCH_HAS_HCD=y | 837 | CONFIG_USB_ARCH_HAS_HCD=y |
@@ -788,17 +842,25 @@ CONFIG_USB_ARCH_HAS_EHCI=y | |||
788 | # CONFIG_USB_OTG_BLACKLIST_HUB is not set | 842 | # CONFIG_USB_OTG_BLACKLIST_HUB is not set |
789 | 843 | ||
790 | # | 844 | # |
845 | # Enable Host or Gadget support to see Inventra options | ||
846 | # | ||
847 | |||
848 | # | ||
791 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | 849 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' |
792 | # | 850 | # |
793 | # CONFIG_USB_GADGET is not set | 851 | # CONFIG_USB_GADGET is not set |
852 | # CONFIG_UWB is not set | ||
794 | # CONFIG_MMC is not set | 853 | # CONFIG_MMC is not set |
795 | # CONFIG_MEMSTICK is not set | 854 | # CONFIG_MEMSTICK is not set |
796 | # CONFIG_NEW_LEDS is not set | 855 | # CONFIG_NEW_LEDS is not set |
856 | # CONFIG_ACCESSIBILITY is not set | ||
797 | # CONFIG_INFINIBAND is not set | 857 | # CONFIG_INFINIBAND is not set |
798 | # CONFIG_EDAC is not set | 858 | # CONFIG_EDAC is not set |
799 | # CONFIG_RTC_CLASS is not set | 859 | # CONFIG_RTC_CLASS is not set |
800 | # CONFIG_DMADEVICES is not set | 860 | # CONFIG_DMADEVICES is not set |
801 | # CONFIG_UIO is not set | 861 | # CONFIG_UIO is not set |
862 | # CONFIG_STAGING is not set | ||
863 | CONFIG_STAGING_EXCLUDE_BUILD=y | ||
802 | 864 | ||
803 | # | 865 | # |
804 | # File systems | 866 | # File systems |
@@ -810,12 +872,13 @@ CONFIG_EXT3_FS=y | |||
810 | CONFIG_EXT3_FS_XATTR=y | 872 | CONFIG_EXT3_FS_XATTR=y |
811 | # CONFIG_EXT3_FS_POSIX_ACL is not set | 873 | # CONFIG_EXT3_FS_POSIX_ACL is not set |
812 | # CONFIG_EXT3_FS_SECURITY is not set | 874 | # CONFIG_EXT3_FS_SECURITY is not set |
813 | # CONFIG_EXT4DEV_FS is not set | 875 | # CONFIG_EXT4_FS is not set |
814 | CONFIG_JBD=y | 876 | CONFIG_JBD=y |
815 | CONFIG_FS_MBCACHE=y | 877 | CONFIG_FS_MBCACHE=y |
816 | # CONFIG_REISERFS_FS is not set | 878 | # CONFIG_REISERFS_FS is not set |
817 | # CONFIG_JFS_FS is not set | 879 | # CONFIG_JFS_FS is not set |
818 | # CONFIG_FS_POSIX_ACL is not set | 880 | # CONFIG_FS_POSIX_ACL is not set |
881 | CONFIG_FILE_LOCKING=y | ||
819 | # CONFIG_XFS_FS is not set | 882 | # CONFIG_XFS_FS is not set |
820 | # CONFIG_OCFS2_FS is not set | 883 | # CONFIG_OCFS2_FS is not set |
821 | CONFIG_DNOTIFY=y | 884 | CONFIG_DNOTIFY=y |
@@ -845,6 +908,7 @@ CONFIG_INOTIFY_USER=y | |||
845 | CONFIG_PROC_FS=y | 908 | CONFIG_PROC_FS=y |
846 | CONFIG_PROC_KCORE=y | 909 | CONFIG_PROC_KCORE=y |
847 | CONFIG_PROC_SYSCTL=y | 910 | CONFIG_PROC_SYSCTL=y |
911 | CONFIG_PROC_PAGE_MONITOR=y | ||
848 | CONFIG_SYSFS=y | 912 | CONFIG_SYSFS=y |
849 | CONFIG_TMPFS=y | 913 | CONFIG_TMPFS=y |
850 | # CONFIG_TMPFS_POSIX_ACL is not set | 914 | # CONFIG_TMPFS_POSIX_ACL is not set |
@@ -864,6 +928,7 @@ CONFIG_TMPFS=y | |||
864 | # CONFIG_CRAMFS is not set | 928 | # CONFIG_CRAMFS is not set |
865 | # CONFIG_VXFS_FS is not set | 929 | # CONFIG_VXFS_FS is not set |
866 | # CONFIG_MINIX_FS is not set | 930 | # CONFIG_MINIX_FS is not set |
931 | # CONFIG_OMFS_FS is not set | ||
867 | # CONFIG_HPFS_FS is not set | 932 | # CONFIG_HPFS_FS is not set |
868 | # CONFIG_QNX4FS_FS is not set | 933 | # CONFIG_QNX4FS_FS is not set |
869 | # CONFIG_ROMFS_FS is not set | 934 | # CONFIG_ROMFS_FS is not set |
@@ -874,14 +939,14 @@ CONFIG_NFS_FS=y | |||
874 | CONFIG_NFS_V3=y | 939 | CONFIG_NFS_V3=y |
875 | # CONFIG_NFS_V3_ACL is not set | 940 | # CONFIG_NFS_V3_ACL is not set |
876 | CONFIG_NFS_V4=y | 941 | CONFIG_NFS_V4=y |
877 | # CONFIG_NFSD is not set | ||
878 | CONFIG_ROOT_NFS=y | 942 | CONFIG_ROOT_NFS=y |
943 | # CONFIG_NFSD is not set | ||
879 | CONFIG_LOCKD=y | 944 | CONFIG_LOCKD=y |
880 | CONFIG_LOCKD_V4=y | 945 | CONFIG_LOCKD_V4=y |
881 | CONFIG_NFS_COMMON=y | 946 | CONFIG_NFS_COMMON=y |
882 | CONFIG_SUNRPC=y | 947 | CONFIG_SUNRPC=y |
883 | CONFIG_SUNRPC_GSS=y | 948 | CONFIG_SUNRPC_GSS=y |
884 | # CONFIG_SUNRPC_BIND34 is not set | 949 | # CONFIG_SUNRPC_REGISTER_V4 is not set |
885 | CONFIG_RPCSEC_GSS_KRB5=y | 950 | CONFIG_RPCSEC_GSS_KRB5=y |
886 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | 951 | # CONFIG_RPCSEC_GSS_SPKM3 is not set |
887 | # CONFIG_SMB_FS is not set | 952 | # CONFIG_SMB_FS is not set |
@@ -902,9 +967,9 @@ CONFIG_MSDOS_PARTITION=y | |||
902 | # Library routines | 967 | # Library routines |
903 | # | 968 | # |
904 | CONFIG_BITREVERSE=y | 969 | CONFIG_BITREVERSE=y |
905 | # CONFIG_GENERIC_FIND_FIRST_BIT is not set | ||
906 | # CONFIG_CRC_CCITT is not set | 970 | # CONFIG_CRC_CCITT is not set |
907 | # CONFIG_CRC16 is not set | 971 | # CONFIG_CRC16 is not set |
972 | # CONFIG_CRC_T10DIF is not set | ||
908 | # CONFIG_CRC_ITU_T is not set | 973 | # CONFIG_CRC_ITU_T is not set |
909 | CONFIG_CRC32=y | 974 | CONFIG_CRC32=y |
910 | # CONFIG_CRC7 is not set | 975 | # CONFIG_CRC7 is not set |
@@ -929,9 +994,12 @@ CONFIG_FRAME_WARN=1024 | |||
929 | CONFIG_DEBUG_KERNEL=y | 994 | CONFIG_DEBUG_KERNEL=y |
930 | # CONFIG_DEBUG_SHIRQ is not set | 995 | # CONFIG_DEBUG_SHIRQ is not set |
931 | CONFIG_DETECT_SOFTLOCKUP=y | 996 | CONFIG_DETECT_SOFTLOCKUP=y |
997 | # CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set | ||
998 | CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 | ||
932 | CONFIG_SCHED_DEBUG=y | 999 | CONFIG_SCHED_DEBUG=y |
933 | # CONFIG_SCHEDSTATS is not set | 1000 | # CONFIG_SCHEDSTATS is not set |
934 | # CONFIG_TIMER_STATS is not set | 1001 | # CONFIG_TIMER_STATS is not set |
1002 | # CONFIG_DEBUG_OBJECTS is not set | ||
935 | # CONFIG_SLUB_DEBUG_ON is not set | 1003 | # CONFIG_SLUB_DEBUG_ON is not set |
936 | # CONFIG_SLUB_STATS is not set | 1004 | # CONFIG_SLUB_STATS is not set |
937 | # CONFIG_DEBUG_RT_MUTEXES is not set | 1005 | # CONFIG_DEBUG_RT_MUTEXES is not set |
@@ -945,17 +1013,37 @@ CONFIG_SCHED_DEBUG=y | |||
945 | CONFIG_DEBUG_INFO=y | 1013 | CONFIG_DEBUG_INFO=y |
946 | # CONFIG_DEBUG_VM is not set | 1014 | # CONFIG_DEBUG_VM is not set |
947 | # CONFIG_DEBUG_WRITECOUNT is not set | 1015 | # CONFIG_DEBUG_WRITECOUNT is not set |
1016 | # CONFIG_DEBUG_MEMORY_INIT is not set | ||
948 | # CONFIG_DEBUG_LIST is not set | 1017 | # CONFIG_DEBUG_LIST is not set |
949 | # CONFIG_DEBUG_SG is not set | 1018 | # CONFIG_DEBUG_SG is not set |
950 | # CONFIG_BOOT_PRINTK_DELAY is not set | 1019 | # CONFIG_BOOT_PRINTK_DELAY is not set |
951 | # CONFIG_RCU_TORTURE_TEST is not set | 1020 | # CONFIG_RCU_TORTURE_TEST is not set |
1021 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | ||
952 | # CONFIG_BACKTRACE_SELF_TEST is not set | 1022 | # CONFIG_BACKTRACE_SELF_TEST is not set |
1023 | # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set | ||
953 | # CONFIG_FAULT_INJECTION is not set | 1024 | # CONFIG_FAULT_INJECTION is not set |
1025 | # CONFIG_LATENCYTOP is not set | ||
1026 | CONFIG_HAVE_FUNCTION_TRACER=y | ||
1027 | |||
1028 | # | ||
1029 | # Tracers | ||
1030 | # | ||
1031 | # CONFIG_FUNCTION_TRACER is not set | ||
1032 | # CONFIG_SCHED_TRACER is not set | ||
1033 | # CONFIG_CONTEXT_SWITCH_TRACER is not set | ||
1034 | # CONFIG_BOOT_TRACER is not set | ||
1035 | # CONFIG_STACK_TRACER is not set | ||
1036 | # CONFIG_DYNAMIC_PRINTK_DEBUG is not set | ||
954 | # CONFIG_SAMPLES is not set | 1037 | # CONFIG_SAMPLES is not set |
1038 | CONFIG_HAVE_ARCH_KGDB=y | ||
1039 | # CONFIG_KGDB is not set | ||
955 | # CONFIG_DEBUG_STACKOVERFLOW is not set | 1040 | # CONFIG_DEBUG_STACKOVERFLOW is not set |
956 | # CONFIG_DEBUG_STACK_USAGE is not set | 1041 | # CONFIG_DEBUG_STACK_USAGE is not set |
957 | # CONFIG_DEBUG_PAGEALLOC is not set | 1042 | # CONFIG_DEBUG_PAGEALLOC is not set |
958 | # CONFIG_DEBUGGER is not set | 1043 | # CONFIG_CODE_PATCHING_SELFTEST is not set |
1044 | # CONFIG_FTR_FIXUP_SELFTEST is not set | ||
1045 | # CONFIG_MSI_BITMAP_SELFTEST is not set | ||
1046 | # CONFIG_XMON is not set | ||
959 | # CONFIG_IRQSTACKS is not set | 1047 | # CONFIG_IRQSTACKS is not set |
960 | # CONFIG_BDI_SWITCH is not set | 1048 | # CONFIG_BDI_SWITCH is not set |
961 | # CONFIG_BOOTX_TEXT is not set | 1049 | # CONFIG_BOOTX_TEXT is not set |
@@ -966,14 +1054,19 @@ CONFIG_DEBUG_INFO=y | |||
966 | # | 1054 | # |
967 | # CONFIG_KEYS is not set | 1055 | # CONFIG_KEYS is not set |
968 | # CONFIG_SECURITY is not set | 1056 | # CONFIG_SECURITY is not set |
1057 | # CONFIG_SECURITYFS is not set | ||
969 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | 1058 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set |
970 | CONFIG_CRYPTO=y | 1059 | CONFIG_CRYPTO=y |
971 | 1060 | ||
972 | # | 1061 | # |
973 | # Crypto core or helper | 1062 | # Crypto core or helper |
974 | # | 1063 | # |
1064 | # CONFIG_CRYPTO_FIPS is not set | ||
975 | CONFIG_CRYPTO_ALGAPI=y | 1065 | CONFIG_CRYPTO_ALGAPI=y |
1066 | CONFIG_CRYPTO_AEAD=y | ||
976 | CONFIG_CRYPTO_BLKCIPHER=y | 1067 | CONFIG_CRYPTO_BLKCIPHER=y |
1068 | CONFIG_CRYPTO_HASH=y | ||
1069 | CONFIG_CRYPTO_RNG=y | ||
977 | CONFIG_CRYPTO_MANAGER=y | 1070 | CONFIG_CRYPTO_MANAGER=y |
978 | # CONFIG_CRYPTO_GF128MUL is not set | 1071 | # CONFIG_CRYPTO_GF128MUL is not set |
979 | # CONFIG_CRYPTO_NULL is not set | 1072 | # CONFIG_CRYPTO_NULL is not set |
@@ -1012,6 +1105,10 @@ CONFIG_CRYPTO_CBC=y | |||
1012 | # CONFIG_CRYPTO_MD4 is not set | 1105 | # CONFIG_CRYPTO_MD4 is not set |
1013 | CONFIG_CRYPTO_MD5=y | 1106 | CONFIG_CRYPTO_MD5=y |
1014 | # CONFIG_CRYPTO_MICHAEL_MIC is not set | 1107 | # CONFIG_CRYPTO_MICHAEL_MIC is not set |
1108 | # CONFIG_CRYPTO_RMD128 is not set | ||
1109 | # CONFIG_CRYPTO_RMD160 is not set | ||
1110 | # CONFIG_CRYPTO_RMD256 is not set | ||
1111 | # CONFIG_CRYPTO_RMD320 is not set | ||
1015 | # CONFIG_CRYPTO_SHA1 is not set | 1112 | # CONFIG_CRYPTO_SHA1 is not set |
1016 | # CONFIG_CRYPTO_SHA256 is not set | 1113 | # CONFIG_CRYPTO_SHA256 is not set |
1017 | # CONFIG_CRYPTO_SHA512 is not set | 1114 | # CONFIG_CRYPTO_SHA512 is not set |
@@ -1042,6 +1139,11 @@ CONFIG_CRYPTO_DES=y | |||
1042 | # | 1139 | # |
1043 | # CONFIG_CRYPTO_DEFLATE is not set | 1140 | # CONFIG_CRYPTO_DEFLATE is not set |
1044 | # CONFIG_CRYPTO_LZO is not set | 1141 | # CONFIG_CRYPTO_LZO is not set |
1142 | |||
1143 | # | ||
1144 | # Random Number Generation | ||
1145 | # | ||
1146 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | ||
1045 | CONFIG_CRYPTO_HW=y | 1147 | CONFIG_CRYPTO_HW=y |
1046 | # CONFIG_CRYPTO_DEV_HIFN_795X is not set | 1148 | # CONFIG_CRYPTO_DEV_HIFN_795X is not set |
1047 | CONFIG_PPC_CLOCK=y | 1149 | CONFIG_PPC_CLOCK=y |
diff --git a/arch/powerpc/configs/52xx/motionpro_defconfig b/arch/powerpc/configs/52xx/motionpro_defconfig index 8c7ba7c6ba49..3c0d4e561726 100644 --- a/arch/powerpc/configs/52xx/motionpro_defconfig +++ b/arch/powerpc/configs/52xx/motionpro_defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.25 | 3 | # Linux kernel version: 2.6.28-rc4 |
4 | # Tue Apr 29 07:12:22 2008 | 4 | # Thu Nov 13 02:11:02 2008 |
5 | # | 5 | # |
6 | # CONFIG_PPC64 is not set | 6 | # CONFIG_PPC64 is not set |
7 | 7 | ||
@@ -22,7 +22,7 @@ CONFIG_PPC_STD_MMU_32=y | |||
22 | # CONFIG_SMP is not set | 22 | # CONFIG_SMP is not set |
23 | CONFIG_PPC32=y | 23 | CONFIG_PPC32=y |
24 | CONFIG_WORD_SIZE=32 | 24 | CONFIG_WORD_SIZE=32 |
25 | CONFIG_PPC_MERGE=y | 25 | # CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set |
26 | CONFIG_MMU=y | 26 | CONFIG_MMU=y |
27 | CONFIG_GENERIC_CMOS_UPDATE=y | 27 | CONFIG_GENERIC_CMOS_UPDATE=y |
28 | CONFIG_GENERIC_TIME=y | 28 | CONFIG_GENERIC_TIME=y |
@@ -32,6 +32,7 @@ CONFIG_GENERIC_HARDIRQS=y | |||
32 | # CONFIG_HAVE_SETUP_PER_CPU_AREA is not set | 32 | # CONFIG_HAVE_SETUP_PER_CPU_AREA is not set |
33 | CONFIG_IRQ_PER_CPU=y | 33 | CONFIG_IRQ_PER_CPU=y |
34 | CONFIG_STACKTRACE_SUPPORT=y | 34 | CONFIG_STACKTRACE_SUPPORT=y |
35 | CONFIG_HAVE_LATENCYTOP_SUPPORT=y | ||
35 | CONFIG_LOCKDEP_SUPPORT=y | 36 | CONFIG_LOCKDEP_SUPPORT=y |
36 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y | 37 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y |
37 | CONFIG_ARCH_HAS_ILOG2_U32=y | 38 | CONFIG_ARCH_HAS_ILOG2_U32=y |
@@ -102,6 +103,7 @@ CONFIG_SIGNALFD=y | |||
102 | CONFIG_TIMERFD=y | 103 | CONFIG_TIMERFD=y |
103 | CONFIG_EVENTFD=y | 104 | CONFIG_EVENTFD=y |
104 | CONFIG_SHMEM=y | 105 | CONFIG_SHMEM=y |
106 | CONFIG_AIO=y | ||
105 | CONFIG_VM_EVENT_COUNTERS=y | 107 | CONFIG_VM_EVENT_COUNTERS=y |
106 | CONFIG_SLUB_DEBUG=y | 108 | CONFIG_SLUB_DEBUG=y |
107 | # CONFIG_SLAB is not set | 109 | # CONFIG_SLAB is not set |
@@ -110,9 +112,13 @@ CONFIG_SLUB=y | |||
110 | # CONFIG_PROFILING is not set | 112 | # CONFIG_PROFILING is not set |
111 | # CONFIG_MARKERS is not set | 113 | # CONFIG_MARKERS is not set |
112 | CONFIG_HAVE_OPROFILE=y | 114 | CONFIG_HAVE_OPROFILE=y |
115 | CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y | ||
116 | CONFIG_HAVE_IOREMAP_PROT=y | ||
113 | CONFIG_HAVE_KPROBES=y | 117 | CONFIG_HAVE_KPROBES=y |
114 | CONFIG_HAVE_KRETPROBES=y | 118 | CONFIG_HAVE_KRETPROBES=y |
115 | CONFIG_PROC_PAGE_MONITOR=y | 119 | CONFIG_HAVE_ARCH_TRACEHOOK=y |
120 | CONFIG_HAVE_CLK=y | ||
121 | # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set | ||
116 | CONFIG_SLABINFO=y | 122 | CONFIG_SLABINFO=y |
117 | CONFIG_RT_MUTEXES=y | 123 | CONFIG_RT_MUTEXES=y |
118 | # CONFIG_TINY_SHMEM is not set | 124 | # CONFIG_TINY_SHMEM is not set |
@@ -123,6 +129,7 @@ CONFIG_BLOCK=y | |||
123 | # CONFIG_BLK_DEV_IO_TRACE is not set | 129 | # CONFIG_BLK_DEV_IO_TRACE is not set |
124 | # CONFIG_LSF is not set | 130 | # CONFIG_LSF is not set |
125 | # CONFIG_BLK_DEV_BSG is not set | 131 | # CONFIG_BLK_DEV_BSG is not set |
132 | # CONFIG_BLK_DEV_INTEGRITY is not set | ||
126 | 133 | ||
127 | # | 134 | # |
128 | # IO Schedulers | 135 | # IO Schedulers |
@@ -137,19 +144,16 @@ CONFIG_DEFAULT_AS=y | |||
137 | # CONFIG_DEFAULT_NOOP is not set | 144 | # CONFIG_DEFAULT_NOOP is not set |
138 | CONFIG_DEFAULT_IOSCHED="anticipatory" | 145 | CONFIG_DEFAULT_IOSCHED="anticipatory" |
139 | CONFIG_CLASSIC_RCU=y | 146 | CONFIG_CLASSIC_RCU=y |
147 | # CONFIG_FREEZER is not set | ||
140 | 148 | ||
141 | # | 149 | # |
142 | # Platform support | 150 | # Platform support |
143 | # | 151 | # |
144 | CONFIG_PPC_MULTIPLATFORM=y | 152 | CONFIG_PPC_MULTIPLATFORM=y |
145 | # CONFIG_PPC_82xx is not set | ||
146 | # CONFIG_PPC_83xx is not set | ||
147 | # CONFIG_PPC_86xx is not set | ||
148 | CONFIG_CLASSIC32=y | 153 | CONFIG_CLASSIC32=y |
149 | # CONFIG_PPC_CHRP is not set | 154 | # CONFIG_PPC_CHRP is not set |
150 | # CONFIG_PPC_MPC512x is not set | ||
151 | # CONFIG_PPC_MPC5121 is not set | ||
152 | # CONFIG_MPC5121_ADS is not set | 155 | # CONFIG_MPC5121_ADS is not set |
156 | # CONFIG_MPC5121_GENERIC is not set | ||
153 | CONFIG_PPC_MPC52xx=y | 157 | CONFIG_PPC_MPC52xx=y |
154 | CONFIG_PPC_MPC5200_SIMPLE=y | 158 | CONFIG_PPC_MPC5200_SIMPLE=y |
155 | # CONFIG_PPC_EFIKA is not set | 159 | # CONFIG_PPC_EFIKA is not set |
@@ -159,7 +163,10 @@ CONFIG_PPC_MPC5200_SIMPLE=y | |||
159 | # CONFIG_PPC_PMAC is not set | 163 | # CONFIG_PPC_PMAC is not set |
160 | # CONFIG_PPC_CELL is not set | 164 | # CONFIG_PPC_CELL is not set |
161 | # CONFIG_PPC_CELL_NATIVE is not set | 165 | # CONFIG_PPC_CELL_NATIVE is not set |
166 | # CONFIG_PPC_82xx is not set | ||
162 | # CONFIG_PQ2ADS is not set | 167 | # CONFIG_PQ2ADS is not set |
168 | # CONFIG_PPC_83xx is not set | ||
169 | # CONFIG_PPC_86xx is not set | ||
163 | # CONFIG_EMBEDDED6xx is not set | 170 | # CONFIG_EMBEDDED6xx is not set |
164 | # CONFIG_IPIC is not set | 171 | # CONFIG_IPIC is not set |
165 | # CONFIG_MPIC is not set | 172 | # CONFIG_MPIC is not set |
@@ -183,7 +190,6 @@ CONFIG_PPC_BESTCOMM_FEC=y | |||
183 | # Kernel options | 190 | # Kernel options |
184 | # | 191 | # |
185 | # CONFIG_HIGHMEM is not set | 192 | # CONFIG_HIGHMEM is not set |
186 | # CONFIG_TICK_ONESHOT is not set | ||
187 | # CONFIG_NO_HZ is not set | 193 | # CONFIG_NO_HZ is not set |
188 | # CONFIG_HIGH_RES_TIMERS is not set | 194 | # CONFIG_HIGH_RES_TIMERS is not set |
189 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y | 195 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y |
@@ -197,6 +203,8 @@ CONFIG_PREEMPT_NONE=y | |||
197 | # CONFIG_PREEMPT_VOLUNTARY is not set | 203 | # CONFIG_PREEMPT_VOLUNTARY is not set |
198 | # CONFIG_PREEMPT is not set | 204 | # CONFIG_PREEMPT is not set |
199 | CONFIG_BINFMT_ELF=y | 205 | CONFIG_BINFMT_ELF=y |
206 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set | ||
207 | # CONFIG_HAVE_AOUT is not set | ||
200 | # CONFIG_BINFMT_MISC is not set | 208 | # CONFIG_BINFMT_MISC is not set |
201 | # CONFIG_IOMMU_HELPER is not set | 209 | # CONFIG_IOMMU_HELPER is not set |
202 | CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y | 210 | CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y |
@@ -211,19 +219,20 @@ CONFIG_FLATMEM_MANUAL=y | |||
211 | # CONFIG_SPARSEMEM_MANUAL is not set | 219 | # CONFIG_SPARSEMEM_MANUAL is not set |
212 | CONFIG_FLATMEM=y | 220 | CONFIG_FLATMEM=y |
213 | CONFIG_FLAT_NODE_MEM_MAP=y | 221 | CONFIG_FLAT_NODE_MEM_MAP=y |
214 | # CONFIG_SPARSEMEM_STATIC is not set | ||
215 | # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set | ||
216 | CONFIG_PAGEFLAGS_EXTENDED=y | 222 | CONFIG_PAGEFLAGS_EXTENDED=y |
217 | CONFIG_SPLIT_PTLOCK_CPUS=4 | 223 | CONFIG_SPLIT_PTLOCK_CPUS=4 |
224 | CONFIG_MIGRATION=y | ||
218 | # CONFIG_RESOURCES_64BIT is not set | 225 | # CONFIG_RESOURCES_64BIT is not set |
226 | # CONFIG_PHYS_ADDR_T_64BIT is not set | ||
219 | CONFIG_ZONE_DMA_FLAG=1 | 227 | CONFIG_ZONE_DMA_FLAG=1 |
220 | CONFIG_BOUNCE=y | 228 | CONFIG_BOUNCE=y |
221 | CONFIG_VIRT_TO_BUS=y | 229 | CONFIG_VIRT_TO_BUS=y |
230 | CONFIG_UNEVICTABLE_LRU=y | ||
222 | CONFIG_FORCE_MAX_ZONEORDER=11 | 231 | CONFIG_FORCE_MAX_ZONEORDER=11 |
223 | CONFIG_PROC_DEVICETREE=y | 232 | CONFIG_PROC_DEVICETREE=y |
224 | # CONFIG_CMDLINE_BOOL is not set | 233 | # CONFIG_CMDLINE_BOOL is not set |
234 | CONFIG_EXTRA_TARGETS="" | ||
225 | CONFIG_PM=y | 235 | CONFIG_PM=y |
226 | # CONFIG_PM_LEGACY is not set | ||
227 | # CONFIG_PM_DEBUG is not set | 236 | # CONFIG_PM_DEBUG is not set |
228 | CONFIG_SECCOMP=y | 237 | CONFIG_SECCOMP=y |
229 | CONFIG_ISA_DMA_API=y | 238 | CONFIG_ISA_DMA_API=y |
@@ -233,7 +242,7 @@ CONFIG_ISA_DMA_API=y | |||
233 | # | 242 | # |
234 | CONFIG_ZONE_DMA=y | 243 | CONFIG_ZONE_DMA=y |
235 | CONFIG_GENERIC_ISA_DMA=y | 244 | CONFIG_GENERIC_ISA_DMA=y |
236 | CONFIG_FSL_SOC=y | 245 | CONFIG_PPC_PCI_CHOICE=y |
237 | # CONFIG_PCI is not set | 246 | # CONFIG_PCI is not set |
238 | # CONFIG_PCI_DOMAINS is not set | 247 | # CONFIG_PCI_DOMAINS is not set |
239 | # CONFIG_PCI_SYSCALL is not set | 248 | # CONFIG_PCI_SYSCALL is not set |
@@ -254,10 +263,6 @@ CONFIG_PAGE_OFFSET=0xc0000000 | |||
254 | CONFIG_KERNEL_START=0xc0000000 | 263 | CONFIG_KERNEL_START=0xc0000000 |
255 | CONFIG_PHYSICAL_START=0x00000000 | 264 | CONFIG_PHYSICAL_START=0x00000000 |
256 | CONFIG_TASK_SIZE=0xc0000000 | 265 | CONFIG_TASK_SIZE=0xc0000000 |
257 | |||
258 | # | ||
259 | # Networking | ||
260 | # | ||
261 | CONFIG_NET=y | 266 | CONFIG_NET=y |
262 | 267 | ||
263 | # | 268 | # |
@@ -308,6 +313,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic" | |||
308 | # CONFIG_TIPC is not set | 313 | # CONFIG_TIPC is not set |
309 | # CONFIG_ATM is not set | 314 | # CONFIG_ATM is not set |
310 | # CONFIG_BRIDGE is not set | 315 | # CONFIG_BRIDGE is not set |
316 | # CONFIG_NET_DSA is not set | ||
311 | # CONFIG_VLAN_8021Q is not set | 317 | # CONFIG_VLAN_8021Q is not set |
312 | # CONFIG_DECNET is not set | 318 | # CONFIG_DECNET is not set |
313 | # CONFIG_LLC2 is not set | 319 | # CONFIG_LLC2 is not set |
@@ -328,14 +334,8 @@ CONFIG_DEFAULT_TCP_CONG="cubic" | |||
328 | # CONFIG_IRDA is not set | 334 | # CONFIG_IRDA is not set |
329 | # CONFIG_BT is not set | 335 | # CONFIG_BT is not set |
330 | # CONFIG_AF_RXRPC is not set | 336 | # CONFIG_AF_RXRPC is not set |
331 | 337 | # CONFIG_PHONET is not set | |
332 | # | 338 | # CONFIG_WIRELESS is not set |
333 | # Wireless | ||
334 | # | ||
335 | # CONFIG_CFG80211 is not set | ||
336 | # CONFIG_WIRELESS_EXT is not set | ||
337 | # CONFIG_MAC80211 is not set | ||
338 | # CONFIG_IEEE80211 is not set | ||
339 | # CONFIG_RFKILL is not set | 339 | # CONFIG_RFKILL is not set |
340 | # CONFIG_NET_9P is not set | 340 | # CONFIG_NET_9P is not set |
341 | 341 | ||
@@ -445,9 +445,12 @@ CONFIG_BLK_DEV_RAM_SIZE=32768 | |||
445 | # CONFIG_BLK_DEV_XIP is not set | 445 | # CONFIG_BLK_DEV_XIP is not set |
446 | # CONFIG_CDROM_PKTCDVD is not set | 446 | # CONFIG_CDROM_PKTCDVD is not set |
447 | # CONFIG_ATA_OVER_ETH is not set | 447 | # CONFIG_ATA_OVER_ETH is not set |
448 | # CONFIG_BLK_DEV_HD is not set | ||
448 | CONFIG_MISC_DEVICES=y | 449 | CONFIG_MISC_DEVICES=y |
449 | # CONFIG_EEPROM_93CX6 is not set | 450 | # CONFIG_EEPROM_93CX6 is not set |
451 | # CONFIG_ICS932S401 is not set | ||
450 | # CONFIG_ENCLOSURE_SERVICES is not set | 452 | # CONFIG_ENCLOSURE_SERVICES is not set |
453 | # CONFIG_C2PORT is not set | ||
451 | CONFIG_HAVE_IDE=y | 454 | CONFIG_HAVE_IDE=y |
452 | # CONFIG_IDE is not set | 455 | # CONFIG_IDE is not set |
453 | 456 | ||
@@ -490,10 +493,10 @@ CONFIG_CHR_DEV_SG=y | |||
490 | CONFIG_SCSI_LOWLEVEL=y | 493 | CONFIG_SCSI_LOWLEVEL=y |
491 | # CONFIG_ISCSI_TCP is not set | 494 | # CONFIG_ISCSI_TCP is not set |
492 | # CONFIG_SCSI_DEBUG is not set | 495 | # CONFIG_SCSI_DEBUG is not set |
496 | # CONFIG_SCSI_DH is not set | ||
493 | CONFIG_ATA=y | 497 | CONFIG_ATA=y |
494 | # CONFIG_ATA_NONSTANDARD is not set | 498 | # CONFIG_ATA_NONSTANDARD is not set |
495 | CONFIG_SATA_PMP=y | 499 | CONFIG_SATA_PMP=y |
496 | # CONFIG_SATA_FSL is not set | ||
497 | CONFIG_ATA_SFF=y | 500 | CONFIG_ATA_SFF=y |
498 | # CONFIG_SATA_MV is not set | 501 | # CONFIG_SATA_MV is not set |
499 | CONFIG_PATA_MPC52xx=y | 502 | CONFIG_PATA_MPC52xx=y |
@@ -501,7 +504,6 @@ CONFIG_PATA_MPC52xx=y | |||
501 | # CONFIG_MD is not set | 504 | # CONFIG_MD is not set |
502 | # CONFIG_MACINTOSH_DRIVERS is not set | 505 | # CONFIG_MACINTOSH_DRIVERS is not set |
503 | CONFIG_NETDEVICES=y | 506 | CONFIG_NETDEVICES=y |
504 | # CONFIG_NETDEVICES_MULTIQUEUE is not set | ||
505 | # CONFIG_DUMMY is not set | 507 | # CONFIG_DUMMY is not set |
506 | # CONFIG_BONDING is not set | 508 | # CONFIG_BONDING is not set |
507 | # CONFIG_MACVLAN is not set | 509 | # CONFIG_MACVLAN is not set |
@@ -531,6 +533,9 @@ CONFIG_MII=y | |||
531 | # CONFIG_IBM_NEW_EMAC_RGMII is not set | 533 | # CONFIG_IBM_NEW_EMAC_RGMII is not set |
532 | # CONFIG_IBM_NEW_EMAC_TAH is not set | 534 | # CONFIG_IBM_NEW_EMAC_TAH is not set |
533 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set | 535 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set |
536 | # CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set | ||
537 | # CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set | ||
538 | # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set | ||
534 | # CONFIG_B44 is not set | 539 | # CONFIG_B44 is not set |
535 | CONFIG_FEC_MPC52xx=y | 540 | CONFIG_FEC_MPC52xx=y |
536 | CONFIG_FEC_MPC52xx_MDIO=y | 541 | CONFIG_FEC_MPC52xx_MDIO=y |
@@ -542,7 +547,6 @@ CONFIG_FEC_MPC52xx_MDIO=y | |||
542 | # | 547 | # |
543 | # CONFIG_WLAN_PRE80211 is not set | 548 | # CONFIG_WLAN_PRE80211 is not set |
544 | # CONFIG_WLAN_80211 is not set | 549 | # CONFIG_WLAN_80211 is not set |
545 | # CONFIG_IWLWIFI is not set | ||
546 | # CONFIG_IWLWIFI_LEDS is not set | 550 | # CONFIG_IWLWIFI_LEDS is not set |
547 | # CONFIG_WAN is not set | 551 | # CONFIG_WAN is not set |
548 | # CONFIG_PPP is not set | 552 | # CONFIG_PPP is not set |
@@ -568,6 +572,7 @@ CONFIG_FEC_MPC52xx_MDIO=y | |||
568 | # Character devices | 572 | # Character devices |
569 | # | 573 | # |
570 | # CONFIG_VT is not set | 574 | # CONFIG_VT is not set |
575 | CONFIG_DEVKMEM=y | ||
571 | # CONFIG_SERIAL_NONSTANDARD is not set | 576 | # CONFIG_SERIAL_NONSTANDARD is not set |
572 | 577 | ||
573 | # | 578 | # |
@@ -596,24 +601,39 @@ CONFIG_LEGACY_PTY_COUNT=256 | |||
596 | CONFIG_I2C=y | 601 | CONFIG_I2C=y |
597 | CONFIG_I2C_BOARDINFO=y | 602 | CONFIG_I2C_BOARDINFO=y |
598 | CONFIG_I2C_CHARDEV=y | 603 | CONFIG_I2C_CHARDEV=y |
604 | CONFIG_I2C_HELPER_AUTO=y | ||
599 | 605 | ||
600 | # | 606 | # |
601 | # I2C Hardware Bus support | 607 | # I2C Hardware Bus support |
602 | # | 608 | # |
609 | |||
610 | # | ||
611 | # I2C system bus drivers (mostly embedded / system-on-chip) | ||
612 | # | ||
603 | CONFIG_I2C_MPC=y | 613 | CONFIG_I2C_MPC=y |
604 | # CONFIG_I2C_OCORES is not set | 614 | # CONFIG_I2C_OCORES is not set |
605 | # CONFIG_I2C_PARPORT_LIGHT is not set | ||
606 | # CONFIG_I2C_SIMTEC is not set | 615 | # CONFIG_I2C_SIMTEC is not set |
616 | |||
617 | # | ||
618 | # External I2C/SMBus adapter drivers | ||
619 | # | ||
620 | # CONFIG_I2C_PARPORT_LIGHT is not set | ||
607 | # CONFIG_I2C_TAOS_EVM is not set | 621 | # CONFIG_I2C_TAOS_EVM is not set |
622 | |||
623 | # | ||
624 | # Other I2C/SMBus bus drivers | ||
625 | # | ||
608 | # CONFIG_I2C_PCA_PLATFORM is not set | 626 | # CONFIG_I2C_PCA_PLATFORM is not set |
609 | 627 | ||
610 | # | 628 | # |
611 | # Miscellaneous I2C Chip support | 629 | # Miscellaneous I2C Chip support |
612 | # | 630 | # |
613 | # CONFIG_DS1682 is not set | 631 | # CONFIG_DS1682 is not set |
632 | # CONFIG_AT24 is not set | ||
614 | CONFIG_SENSORS_EEPROM=y | 633 | CONFIG_SENSORS_EEPROM=y |
615 | # CONFIG_SENSORS_PCF8574 is not set | 634 | # CONFIG_SENSORS_PCF8574 is not set |
616 | # CONFIG_PCF8575 is not set | 635 | # CONFIG_PCF8575 is not set |
636 | # CONFIG_SENSORS_PCA9539 is not set | ||
617 | # CONFIG_SENSORS_PCF8591 is not set | 637 | # CONFIG_SENSORS_PCF8591 is not set |
618 | # CONFIG_SENSORS_MAX6875 is not set | 638 | # CONFIG_SENSORS_MAX6875 is not set |
619 | # CONFIG_SENSORS_TSL2550 is not set | 639 | # CONFIG_SENSORS_TSL2550 is not set |
@@ -622,10 +642,13 @@ CONFIG_SENSORS_EEPROM=y | |||
622 | # CONFIG_I2C_DEBUG_BUS is not set | 642 | # CONFIG_I2C_DEBUG_BUS is not set |
623 | # CONFIG_I2C_DEBUG_CHIP is not set | 643 | # CONFIG_I2C_DEBUG_CHIP is not set |
624 | # CONFIG_SPI is not set | 644 | # CONFIG_SPI is not set |
645 | CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y | ||
646 | # CONFIG_GPIOLIB is not set | ||
625 | # CONFIG_W1 is not set | 647 | # CONFIG_W1 is not set |
626 | # CONFIG_POWER_SUPPLY is not set | 648 | # CONFIG_POWER_SUPPLY is not set |
627 | CONFIG_HWMON=y | 649 | CONFIG_HWMON=y |
628 | # CONFIG_HWMON_VID is not set | 650 | # CONFIG_HWMON_VID is not set |
651 | # CONFIG_SENSORS_AD7414 is not set | ||
629 | # CONFIG_SENSORS_AD7418 is not set | 652 | # CONFIG_SENSORS_AD7418 is not set |
630 | # CONFIG_SENSORS_ADM1021 is not set | 653 | # CONFIG_SENSORS_ADM1021 is not set |
631 | # CONFIG_SENSORS_ADM1025 is not set | 654 | # CONFIG_SENSORS_ADM1025 is not set |
@@ -633,6 +656,7 @@ CONFIG_HWMON=y | |||
633 | # CONFIG_SENSORS_ADM1029 is not set | 656 | # CONFIG_SENSORS_ADM1029 is not set |
634 | # CONFIG_SENSORS_ADM1031 is not set | 657 | # CONFIG_SENSORS_ADM1031 is not set |
635 | # CONFIG_SENSORS_ADM9240 is not set | 658 | # CONFIG_SENSORS_ADM9240 is not set |
659 | # CONFIG_SENSORS_ADT7462 is not set | ||
636 | # CONFIG_SENSORS_ADT7470 is not set | 660 | # CONFIG_SENSORS_ADT7470 is not set |
637 | # CONFIG_SENSORS_ADT7473 is not set | 661 | # CONFIG_SENSORS_ADT7473 is not set |
638 | # CONFIG_SENSORS_ATXP1 is not set | 662 | # CONFIG_SENSORS_ATXP1 is not set |
@@ -675,6 +699,7 @@ CONFIG_HWMON=y | |||
675 | # CONFIG_SENSORS_W83627EHF is not set | 699 | # CONFIG_SENSORS_W83627EHF is not set |
676 | # CONFIG_HWMON_DEBUG_CHIP is not set | 700 | # CONFIG_HWMON_DEBUG_CHIP is not set |
677 | # CONFIG_THERMAL is not set | 701 | # CONFIG_THERMAL is not set |
702 | # CONFIG_THERMAL_HWMON is not set | ||
678 | CONFIG_WATCHDOG=y | 703 | CONFIG_WATCHDOG=y |
679 | # CONFIG_WATCHDOG_NOWAYOUT is not set | 704 | # CONFIG_WATCHDOG_NOWAYOUT is not set |
680 | 705 | ||
@@ -683,24 +708,39 @@ CONFIG_WATCHDOG=y | |||
683 | # | 708 | # |
684 | # CONFIG_SOFT_WATCHDOG is not set | 709 | # CONFIG_SOFT_WATCHDOG is not set |
685 | # CONFIG_MPC5200_WDT is not set | 710 | # CONFIG_MPC5200_WDT is not set |
711 | CONFIG_SSB_POSSIBLE=y | ||
686 | 712 | ||
687 | # | 713 | # |
688 | # Sonics Silicon Backplane | 714 | # Sonics Silicon Backplane |
689 | # | 715 | # |
690 | CONFIG_SSB_POSSIBLE=y | ||
691 | # CONFIG_SSB is not set | 716 | # CONFIG_SSB is not set |
692 | 717 | ||
693 | # | 718 | # |
694 | # Multifunction device drivers | 719 | # Multifunction device drivers |
695 | # | 720 | # |
721 | # CONFIG_MFD_CORE is not set | ||
696 | # CONFIG_MFD_SM501 is not set | 722 | # CONFIG_MFD_SM501 is not set |
697 | # CONFIG_HTC_PASIC3 is not set | 723 | # CONFIG_HTC_PASIC3 is not set |
724 | # CONFIG_MFD_TMIO is not set | ||
725 | # CONFIG_PMIC_DA903X is not set | ||
726 | # CONFIG_MFD_WM8400 is not set | ||
727 | # CONFIG_MFD_WM8350_I2C is not set | ||
728 | # CONFIG_REGULATOR is not set | ||
698 | 729 | ||
699 | # | 730 | # |
700 | # Multimedia devices | 731 | # Multimedia devices |
701 | # | 732 | # |
733 | |||
734 | # | ||
735 | # Multimedia core support | ||
736 | # | ||
702 | # CONFIG_VIDEO_DEV is not set | 737 | # CONFIG_VIDEO_DEV is not set |
703 | # CONFIG_DVB_CORE is not set | 738 | # CONFIG_DVB_CORE is not set |
739 | # CONFIG_VIDEO_MEDIA is not set | ||
740 | |||
741 | # | ||
742 | # Multimedia drivers | ||
743 | # | ||
704 | CONFIG_DAB=y | 744 | CONFIG_DAB=y |
705 | 745 | ||
706 | # | 746 | # |
@@ -715,10 +755,6 @@ CONFIG_DAB=y | |||
715 | # Display device support | 755 | # Display device support |
716 | # | 756 | # |
717 | # CONFIG_DISPLAY_SUPPORT is not set | 757 | # CONFIG_DISPLAY_SUPPORT is not set |
718 | |||
719 | # | ||
720 | # Sound | ||
721 | # | ||
722 | # CONFIG_SOUND is not set | 758 | # CONFIG_SOUND is not set |
723 | # CONFIG_USB_SUPPORT is not set | 759 | # CONFIG_USB_SUPPORT is not set |
724 | # CONFIG_MMC is not set | 760 | # CONFIG_MMC is not set |
@@ -729,6 +765,7 @@ CONFIG_LEDS_CLASS=y | |||
729 | # | 765 | # |
730 | # LED drivers | 766 | # LED drivers |
731 | # | 767 | # |
768 | # CONFIG_LEDS_PCA955X is not set | ||
732 | 769 | ||
733 | # | 770 | # |
734 | # LED Triggers | 771 | # LED Triggers |
@@ -736,7 +773,9 @@ CONFIG_LEDS_CLASS=y | |||
736 | CONFIG_LEDS_TRIGGERS=y | 773 | CONFIG_LEDS_TRIGGERS=y |
737 | CONFIG_LEDS_TRIGGER_TIMER=y | 774 | CONFIG_LEDS_TRIGGER_TIMER=y |
738 | # CONFIG_LEDS_TRIGGER_HEARTBEAT is not set | 775 | # CONFIG_LEDS_TRIGGER_HEARTBEAT is not set |
776 | # CONFIG_LEDS_TRIGGER_BACKLIGHT is not set | ||
739 | # CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set | 777 | # CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set |
778 | # CONFIG_ACCESSIBILITY is not set | ||
740 | # CONFIG_EDAC is not set | 779 | # CONFIG_EDAC is not set |
741 | CONFIG_RTC_LIB=y | 780 | CONFIG_RTC_LIB=y |
742 | CONFIG_RTC_CLASS=y | 781 | CONFIG_RTC_CLASS=y |
@@ -767,6 +806,8 @@ CONFIG_RTC_DRV_DS1307=y | |||
767 | # CONFIG_RTC_DRV_PCF8583 is not set | 806 | # CONFIG_RTC_DRV_PCF8583 is not set |
768 | # CONFIG_RTC_DRV_M41T80 is not set | 807 | # CONFIG_RTC_DRV_M41T80 is not set |
769 | # CONFIG_RTC_DRV_S35390A is not set | 808 | # CONFIG_RTC_DRV_S35390A is not set |
809 | # CONFIG_RTC_DRV_FM3130 is not set | ||
810 | # CONFIG_RTC_DRV_RX8581 is not set | ||
770 | 811 | ||
771 | # | 812 | # |
772 | # SPI RTC drivers | 813 | # SPI RTC drivers |
@@ -776,19 +817,25 @@ CONFIG_RTC_DRV_DS1307=y | |||
776 | # Platform RTC drivers | 817 | # Platform RTC drivers |
777 | # | 818 | # |
778 | # CONFIG_RTC_DRV_CMOS is not set | 819 | # CONFIG_RTC_DRV_CMOS is not set |
820 | # CONFIG_RTC_DRV_DS1286 is not set | ||
779 | # CONFIG_RTC_DRV_DS1511 is not set | 821 | # CONFIG_RTC_DRV_DS1511 is not set |
780 | # CONFIG_RTC_DRV_DS1553 is not set | 822 | # CONFIG_RTC_DRV_DS1553 is not set |
781 | # CONFIG_RTC_DRV_DS1742 is not set | 823 | # CONFIG_RTC_DRV_DS1742 is not set |
782 | # CONFIG_RTC_DRV_STK17TA8 is not set | 824 | # CONFIG_RTC_DRV_STK17TA8 is not set |
783 | # CONFIG_RTC_DRV_M48T86 is not set | 825 | # CONFIG_RTC_DRV_M48T86 is not set |
826 | # CONFIG_RTC_DRV_M48T35 is not set | ||
784 | # CONFIG_RTC_DRV_M48T59 is not set | 827 | # CONFIG_RTC_DRV_M48T59 is not set |
828 | # CONFIG_RTC_DRV_BQ4802 is not set | ||
785 | # CONFIG_RTC_DRV_V3020 is not set | 829 | # CONFIG_RTC_DRV_V3020 is not set |
786 | 830 | ||
787 | # | 831 | # |
788 | # on-CPU RTC drivers | 832 | # on-CPU RTC drivers |
789 | # | 833 | # |
834 | # CONFIG_RTC_DRV_PPC is not set | ||
790 | # CONFIG_DMADEVICES is not set | 835 | # CONFIG_DMADEVICES is not set |
791 | # CONFIG_UIO is not set | 836 | # CONFIG_UIO is not set |
837 | # CONFIG_STAGING is not set | ||
838 | CONFIG_STAGING_EXCLUDE_BUILD=y | ||
792 | 839 | ||
793 | # | 840 | # |
794 | # File systems | 841 | # File systems |
@@ -800,12 +847,13 @@ CONFIG_EXT3_FS=y | |||
800 | CONFIG_EXT3_FS_XATTR=y | 847 | CONFIG_EXT3_FS_XATTR=y |
801 | # CONFIG_EXT3_FS_POSIX_ACL is not set | 848 | # CONFIG_EXT3_FS_POSIX_ACL is not set |
802 | # CONFIG_EXT3_FS_SECURITY is not set | 849 | # CONFIG_EXT3_FS_SECURITY is not set |
803 | # CONFIG_EXT4DEV_FS is not set | 850 | # CONFIG_EXT4_FS is not set |
804 | CONFIG_JBD=y | 851 | CONFIG_JBD=y |
805 | CONFIG_FS_MBCACHE=y | 852 | CONFIG_FS_MBCACHE=y |
806 | # CONFIG_REISERFS_FS is not set | 853 | # CONFIG_REISERFS_FS is not set |
807 | # CONFIG_JFS_FS is not set | 854 | # CONFIG_JFS_FS is not set |
808 | # CONFIG_FS_POSIX_ACL is not set | 855 | # CONFIG_FS_POSIX_ACL is not set |
856 | CONFIG_FILE_LOCKING=y | ||
809 | # CONFIG_XFS_FS is not set | 857 | # CONFIG_XFS_FS is not set |
810 | # CONFIG_OCFS2_FS is not set | 858 | # CONFIG_OCFS2_FS is not set |
811 | CONFIG_DNOTIFY=y | 859 | CONFIG_DNOTIFY=y |
@@ -838,6 +886,7 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | |||
838 | CONFIG_PROC_FS=y | 886 | CONFIG_PROC_FS=y |
839 | CONFIG_PROC_KCORE=y | 887 | CONFIG_PROC_KCORE=y |
840 | CONFIG_PROC_SYSCTL=y | 888 | CONFIG_PROC_SYSCTL=y |
889 | CONFIG_PROC_PAGE_MONITOR=y | ||
841 | CONFIG_SYSFS=y | 890 | CONFIG_SYSFS=y |
842 | CONFIG_TMPFS=y | 891 | CONFIG_TMPFS=y |
843 | # CONFIG_TMPFS_POSIX_ACL is not set | 892 | # CONFIG_TMPFS_POSIX_ACL is not set |
@@ -868,6 +917,7 @@ CONFIG_JFFS2_RTIME=y | |||
868 | CONFIG_CRAMFS=y | 917 | CONFIG_CRAMFS=y |
869 | # CONFIG_VXFS_FS is not set | 918 | # CONFIG_VXFS_FS is not set |
870 | # CONFIG_MINIX_FS is not set | 919 | # CONFIG_MINIX_FS is not set |
920 | # CONFIG_OMFS_FS is not set | ||
871 | # CONFIG_HPFS_FS is not set | 921 | # CONFIG_HPFS_FS is not set |
872 | # CONFIG_QNX4FS_FS is not set | 922 | # CONFIG_QNX4FS_FS is not set |
873 | # CONFIG_ROMFS_FS is not set | 923 | # CONFIG_ROMFS_FS is not set |
@@ -878,14 +928,14 @@ CONFIG_NFS_FS=y | |||
878 | CONFIG_NFS_V3=y | 928 | CONFIG_NFS_V3=y |
879 | # CONFIG_NFS_V3_ACL is not set | 929 | # CONFIG_NFS_V3_ACL is not set |
880 | CONFIG_NFS_V4=y | 930 | CONFIG_NFS_V4=y |
881 | # CONFIG_NFSD is not set | ||
882 | CONFIG_ROOT_NFS=y | 931 | CONFIG_ROOT_NFS=y |
932 | # CONFIG_NFSD is not set | ||
883 | CONFIG_LOCKD=y | 933 | CONFIG_LOCKD=y |
884 | CONFIG_LOCKD_V4=y | 934 | CONFIG_LOCKD_V4=y |
885 | CONFIG_NFS_COMMON=y | 935 | CONFIG_NFS_COMMON=y |
886 | CONFIG_SUNRPC=y | 936 | CONFIG_SUNRPC=y |
887 | CONFIG_SUNRPC_GSS=y | 937 | CONFIG_SUNRPC_GSS=y |
888 | # CONFIG_SUNRPC_BIND34 is not set | 938 | # CONFIG_SUNRPC_REGISTER_V4 is not set |
889 | CONFIG_RPCSEC_GSS_KRB5=y | 939 | CONFIG_RPCSEC_GSS_KRB5=y |
890 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | 940 | # CONFIG_RPCSEC_GSS_SPKM3 is not set |
891 | # CONFIG_SMB_FS is not set | 941 | # CONFIG_SMB_FS is not set |
@@ -961,9 +1011,9 @@ CONFIG_NLS_ISO8859_1=y | |||
961 | # Library routines | 1011 | # Library routines |
962 | # | 1012 | # |
963 | CONFIG_BITREVERSE=y | 1013 | CONFIG_BITREVERSE=y |
964 | # CONFIG_GENERIC_FIND_FIRST_BIT is not set | ||
965 | # CONFIG_CRC_CCITT is not set | 1014 | # CONFIG_CRC_CCITT is not set |
966 | # CONFIG_CRC16 is not set | 1015 | # CONFIG_CRC16 is not set |
1016 | # CONFIG_CRC_T10DIF is not set | ||
967 | # CONFIG_CRC_ITU_T is not set | 1017 | # CONFIG_CRC_ITU_T is not set |
968 | CONFIG_CRC32=y | 1018 | CONFIG_CRC32=y |
969 | # CONFIG_CRC7 is not set | 1019 | # CONFIG_CRC7 is not set |
@@ -990,9 +1040,12 @@ CONFIG_FRAME_WARN=1024 | |||
990 | CONFIG_DEBUG_KERNEL=y | 1040 | CONFIG_DEBUG_KERNEL=y |
991 | # CONFIG_DEBUG_SHIRQ is not set | 1041 | # CONFIG_DEBUG_SHIRQ is not set |
992 | CONFIG_DETECT_SOFTLOCKUP=y | 1042 | CONFIG_DETECT_SOFTLOCKUP=y |
1043 | # CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set | ||
1044 | CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 | ||
993 | CONFIG_SCHED_DEBUG=y | 1045 | CONFIG_SCHED_DEBUG=y |
994 | # CONFIG_SCHEDSTATS is not set | 1046 | # CONFIG_SCHEDSTATS is not set |
995 | # CONFIG_TIMER_STATS is not set | 1047 | # CONFIG_TIMER_STATS is not set |
1048 | # CONFIG_DEBUG_OBJECTS is not set | ||
996 | # CONFIG_SLUB_DEBUG_ON is not set | 1049 | # CONFIG_SLUB_DEBUG_ON is not set |
997 | # CONFIG_SLUB_STATS is not set | 1050 | # CONFIG_SLUB_STATS is not set |
998 | # CONFIG_DEBUG_RT_MUTEXES is not set | 1051 | # CONFIG_DEBUG_RT_MUTEXES is not set |
@@ -1006,16 +1059,37 @@ CONFIG_SCHED_DEBUG=y | |||
1006 | CONFIG_DEBUG_INFO=y | 1059 | CONFIG_DEBUG_INFO=y |
1007 | # CONFIG_DEBUG_VM is not set | 1060 | # CONFIG_DEBUG_VM is not set |
1008 | # CONFIG_DEBUG_WRITECOUNT is not set | 1061 | # CONFIG_DEBUG_WRITECOUNT is not set |
1062 | # CONFIG_DEBUG_MEMORY_INIT is not set | ||
1009 | # CONFIG_DEBUG_LIST is not set | 1063 | # CONFIG_DEBUG_LIST is not set |
1010 | # CONFIG_DEBUG_SG is not set | 1064 | # CONFIG_DEBUG_SG is not set |
1011 | # CONFIG_BOOT_PRINTK_DELAY is not set | 1065 | # CONFIG_BOOT_PRINTK_DELAY is not set |
1066 | # CONFIG_RCU_TORTURE_TEST is not set | ||
1067 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | ||
1012 | # CONFIG_BACKTRACE_SELF_TEST is not set | 1068 | # CONFIG_BACKTRACE_SELF_TEST is not set |
1069 | # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set | ||
1013 | # CONFIG_FAULT_INJECTION is not set | 1070 | # CONFIG_FAULT_INJECTION is not set |
1071 | # CONFIG_LATENCYTOP is not set | ||
1072 | CONFIG_HAVE_FUNCTION_TRACER=y | ||
1073 | |||
1074 | # | ||
1075 | # Tracers | ||
1076 | # | ||
1077 | # CONFIG_FUNCTION_TRACER is not set | ||
1078 | # CONFIG_SCHED_TRACER is not set | ||
1079 | # CONFIG_CONTEXT_SWITCH_TRACER is not set | ||
1080 | # CONFIG_BOOT_TRACER is not set | ||
1081 | # CONFIG_STACK_TRACER is not set | ||
1082 | # CONFIG_DYNAMIC_PRINTK_DEBUG is not set | ||
1014 | # CONFIG_SAMPLES is not set | 1083 | # CONFIG_SAMPLES is not set |
1084 | CONFIG_HAVE_ARCH_KGDB=y | ||
1085 | # CONFIG_KGDB is not set | ||
1015 | # CONFIG_DEBUG_STACKOVERFLOW is not set | 1086 | # CONFIG_DEBUG_STACKOVERFLOW is not set |
1016 | # CONFIG_DEBUG_STACK_USAGE is not set | 1087 | # CONFIG_DEBUG_STACK_USAGE is not set |
1017 | # CONFIG_DEBUG_PAGEALLOC is not set | 1088 | # CONFIG_DEBUG_PAGEALLOC is not set |
1018 | # CONFIG_DEBUGGER is not set | 1089 | # CONFIG_CODE_PATCHING_SELFTEST is not set |
1090 | # CONFIG_FTR_FIXUP_SELFTEST is not set | ||
1091 | # CONFIG_MSI_BITMAP_SELFTEST is not set | ||
1092 | # CONFIG_XMON is not set | ||
1019 | # CONFIG_IRQSTACKS is not set | 1093 | # CONFIG_IRQSTACKS is not set |
1020 | # CONFIG_BDI_SWITCH is not set | 1094 | # CONFIG_BDI_SWITCH is not set |
1021 | # CONFIG_BOOTX_TEXT is not set | 1095 | # CONFIG_BOOTX_TEXT is not set |
@@ -1026,14 +1100,19 @@ CONFIG_DEBUG_INFO=y | |||
1026 | # | 1100 | # |
1027 | # CONFIG_KEYS is not set | 1101 | # CONFIG_KEYS is not set |
1028 | # CONFIG_SECURITY is not set | 1102 | # CONFIG_SECURITY is not set |
1103 | # CONFIG_SECURITYFS is not set | ||
1029 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | 1104 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set |
1030 | CONFIG_CRYPTO=y | 1105 | CONFIG_CRYPTO=y |
1031 | 1106 | ||
1032 | # | 1107 | # |
1033 | # Crypto core or helper | 1108 | # Crypto core or helper |
1034 | # | 1109 | # |
1110 | # CONFIG_CRYPTO_FIPS is not set | ||
1035 | CONFIG_CRYPTO_ALGAPI=y | 1111 | CONFIG_CRYPTO_ALGAPI=y |
1112 | CONFIG_CRYPTO_AEAD=y | ||
1036 | CONFIG_CRYPTO_BLKCIPHER=y | 1113 | CONFIG_CRYPTO_BLKCIPHER=y |
1114 | CONFIG_CRYPTO_HASH=y | ||
1115 | CONFIG_CRYPTO_RNG=y | ||
1037 | CONFIG_CRYPTO_MANAGER=y | 1116 | CONFIG_CRYPTO_MANAGER=y |
1038 | # CONFIG_CRYPTO_GF128MUL is not set | 1117 | # CONFIG_CRYPTO_GF128MUL is not set |
1039 | # CONFIG_CRYPTO_NULL is not set | 1118 | # CONFIG_CRYPTO_NULL is not set |
@@ -1071,6 +1150,10 @@ CONFIG_CRYPTO_PCBC=y | |||
1071 | # CONFIG_CRYPTO_MD4 is not set | 1150 | # CONFIG_CRYPTO_MD4 is not set |
1072 | CONFIG_CRYPTO_MD5=y | 1151 | CONFIG_CRYPTO_MD5=y |
1073 | # CONFIG_CRYPTO_MICHAEL_MIC is not set | 1152 | # CONFIG_CRYPTO_MICHAEL_MIC is not set |
1153 | # CONFIG_CRYPTO_RMD128 is not set | ||
1154 | # CONFIG_CRYPTO_RMD160 is not set | ||
1155 | # CONFIG_CRYPTO_RMD256 is not set | ||
1156 | # CONFIG_CRYPTO_RMD320 is not set | ||
1074 | # CONFIG_CRYPTO_SHA1 is not set | 1157 | # CONFIG_CRYPTO_SHA1 is not set |
1075 | # CONFIG_CRYPTO_SHA256 is not set | 1158 | # CONFIG_CRYPTO_SHA256 is not set |
1076 | # CONFIG_CRYPTO_SHA512 is not set | 1159 | # CONFIG_CRYPTO_SHA512 is not set |
@@ -1101,6 +1184,11 @@ CONFIG_CRYPTO_DES=y | |||
1101 | # | 1184 | # |
1102 | # CONFIG_CRYPTO_DEFLATE is not set | 1185 | # CONFIG_CRYPTO_DEFLATE is not set |
1103 | # CONFIG_CRYPTO_LZO is not set | 1186 | # CONFIG_CRYPTO_LZO is not set |
1187 | |||
1188 | # | ||
1189 | # Random Number Generation | ||
1190 | # | ||
1191 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | ||
1104 | CONFIG_CRYPTO_HW=y | 1192 | CONFIG_CRYPTO_HW=y |
1105 | CONFIG_PPC_CLOCK=y | 1193 | CONFIG_PPC_CLOCK=y |
1106 | CONFIG_PPC_LIB_RHEAP=y | 1194 | CONFIG_PPC_LIB_RHEAP=y |
diff --git a/arch/powerpc/configs/52xx/pcm030_defconfig b/arch/powerpc/configs/52xx/pcm030_defconfig index 9c0caa488b2e..9d0207783d60 100644 --- a/arch/powerpc/configs/52xx/pcm030_defconfig +++ b/arch/powerpc/configs/52xx/pcm030_defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.25 | 3 | # Linux kernel version: 2.6.28-rc4 |
4 | # Tue Apr 29 07:13:19 2008 | 4 | # Thu Nov 13 02:13:16 2008 |
5 | # | 5 | # |
6 | # CONFIG_PPC64 is not set | 6 | # CONFIG_PPC64 is not set |
7 | 7 | ||
@@ -22,7 +22,7 @@ CONFIG_PPC_STD_MMU_32=y | |||
22 | # CONFIG_SMP is not set | 22 | # CONFIG_SMP is not set |
23 | CONFIG_PPC32=y | 23 | CONFIG_PPC32=y |
24 | CONFIG_WORD_SIZE=32 | 24 | CONFIG_WORD_SIZE=32 |
25 | CONFIG_PPC_MERGE=y | 25 | # CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set |
26 | CONFIG_MMU=y | 26 | CONFIG_MMU=y |
27 | CONFIG_GENERIC_CMOS_UPDATE=y | 27 | CONFIG_GENERIC_CMOS_UPDATE=y |
28 | CONFIG_GENERIC_TIME=y | 28 | CONFIG_GENERIC_TIME=y |
@@ -32,6 +32,7 @@ CONFIG_GENERIC_HARDIRQS=y | |||
32 | # CONFIG_HAVE_SETUP_PER_CPU_AREA is not set | 32 | # CONFIG_HAVE_SETUP_PER_CPU_AREA is not set |
33 | CONFIG_IRQ_PER_CPU=y | 33 | CONFIG_IRQ_PER_CPU=y |
34 | CONFIG_STACKTRACE_SUPPORT=y | 34 | CONFIG_STACKTRACE_SUPPORT=y |
35 | CONFIG_HAVE_LATENCYTOP_SUPPORT=y | ||
35 | CONFIG_LOCKDEP_SUPPORT=y | 36 | CONFIG_LOCKDEP_SUPPORT=y |
36 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y | 37 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y |
37 | CONFIG_ARCH_HAS_ILOG2_U32=y | 38 | CONFIG_ARCH_HAS_ILOG2_U32=y |
@@ -104,7 +105,9 @@ CONFIG_SIGNALFD=y | |||
104 | CONFIG_TIMERFD=y | 105 | CONFIG_TIMERFD=y |
105 | CONFIG_EVENTFD=y | 106 | CONFIG_EVENTFD=y |
106 | CONFIG_SHMEM=y | 107 | CONFIG_SHMEM=y |
108 | CONFIG_AIO=y | ||
107 | # CONFIG_VM_EVENT_COUNTERS is not set | 109 | # CONFIG_VM_EVENT_COUNTERS is not set |
110 | CONFIG_PCI_QUIRKS=y | ||
108 | CONFIG_SLAB=y | 111 | CONFIG_SLAB=y |
109 | # CONFIG_SLUB is not set | 112 | # CONFIG_SLUB is not set |
110 | # CONFIG_SLOB is not set | 113 | # CONFIG_SLOB is not set |
@@ -112,24 +115,30 @@ CONFIG_SLAB=y | |||
112 | # CONFIG_MARKERS is not set | 115 | # CONFIG_MARKERS is not set |
113 | CONFIG_HAVE_OPROFILE=y | 116 | CONFIG_HAVE_OPROFILE=y |
114 | # CONFIG_KPROBES is not set | 117 | # CONFIG_KPROBES is not set |
118 | CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y | ||
119 | CONFIG_HAVE_IOREMAP_PROT=y | ||
115 | CONFIG_HAVE_KPROBES=y | 120 | CONFIG_HAVE_KPROBES=y |
116 | CONFIG_HAVE_KRETPROBES=y | 121 | CONFIG_HAVE_KRETPROBES=y |
117 | CONFIG_PROC_PAGE_MONITOR=y | 122 | CONFIG_HAVE_ARCH_TRACEHOOK=y |
123 | CONFIG_HAVE_CLK=y | ||
124 | # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set | ||
118 | CONFIG_SLABINFO=y | 125 | CONFIG_SLABINFO=y |
119 | CONFIG_RT_MUTEXES=y | 126 | CONFIG_RT_MUTEXES=y |
120 | # CONFIG_TINY_SHMEM is not set | 127 | # CONFIG_TINY_SHMEM is not set |
121 | CONFIG_BASE_SMALL=0 | 128 | CONFIG_BASE_SMALL=0 |
122 | CONFIG_MODULES=y | 129 | CONFIG_MODULES=y |
130 | # CONFIG_MODULE_FORCE_LOAD is not set | ||
123 | CONFIG_MODULE_UNLOAD=y | 131 | CONFIG_MODULE_UNLOAD=y |
124 | # CONFIG_MODULE_FORCE_UNLOAD is not set | 132 | # CONFIG_MODULE_FORCE_UNLOAD is not set |
125 | # CONFIG_MODVERSIONS is not set | 133 | # CONFIG_MODVERSIONS is not set |
126 | # CONFIG_MODULE_SRCVERSION_ALL is not set | 134 | # CONFIG_MODULE_SRCVERSION_ALL is not set |
127 | # CONFIG_KMOD is not set | 135 | CONFIG_KMOD=y |
128 | CONFIG_BLOCK=y | 136 | CONFIG_BLOCK=y |
129 | # CONFIG_LBD is not set | 137 | # CONFIG_LBD is not set |
130 | # CONFIG_BLK_DEV_IO_TRACE is not set | 138 | # CONFIG_BLK_DEV_IO_TRACE is not set |
131 | # CONFIG_LSF is not set | 139 | # CONFIG_LSF is not set |
132 | # CONFIG_BLK_DEV_BSG is not set | 140 | # CONFIG_BLK_DEV_BSG is not set |
141 | # CONFIG_BLK_DEV_INTEGRITY is not set | ||
133 | 142 | ||
134 | # | 143 | # |
135 | # IO Schedulers | 144 | # IO Schedulers |
@@ -144,19 +153,16 @@ CONFIG_IOSCHED_NOOP=y | |||
144 | CONFIG_DEFAULT_NOOP=y | 153 | CONFIG_DEFAULT_NOOP=y |
145 | CONFIG_DEFAULT_IOSCHED="noop" | 154 | CONFIG_DEFAULT_IOSCHED="noop" |
146 | CONFIG_CLASSIC_RCU=y | 155 | CONFIG_CLASSIC_RCU=y |
156 | # CONFIG_FREEZER is not set | ||
147 | 157 | ||
148 | # | 158 | # |
149 | # Platform support | 159 | # Platform support |
150 | # | 160 | # |
151 | CONFIG_PPC_MULTIPLATFORM=y | 161 | CONFIG_PPC_MULTIPLATFORM=y |
152 | # CONFIG_PPC_82xx is not set | ||
153 | # CONFIG_PPC_83xx is not set | ||
154 | # CONFIG_PPC_86xx is not set | ||
155 | CONFIG_CLASSIC32=y | 162 | CONFIG_CLASSIC32=y |
156 | # CONFIG_PPC_CHRP is not set | 163 | # CONFIG_PPC_CHRP is not set |
157 | # CONFIG_PPC_MPC512x is not set | ||
158 | # CONFIG_PPC_MPC5121 is not set | ||
159 | # CONFIG_MPC5121_ADS is not set | 164 | # CONFIG_MPC5121_ADS is not set |
165 | # CONFIG_MPC5121_GENERIC is not set | ||
160 | CONFIG_PPC_MPC52xx=y | 166 | CONFIG_PPC_MPC52xx=y |
161 | CONFIG_PPC_MPC5200_SIMPLE=y | 167 | CONFIG_PPC_MPC5200_SIMPLE=y |
162 | # CONFIG_PPC_EFIKA is not set | 168 | # CONFIG_PPC_EFIKA is not set |
@@ -166,7 +172,10 @@ CONFIG_PPC_MPC5200_SIMPLE=y | |||
166 | # CONFIG_PPC_PMAC is not set | 172 | # CONFIG_PPC_PMAC is not set |
167 | # CONFIG_PPC_CELL is not set | 173 | # CONFIG_PPC_CELL is not set |
168 | # CONFIG_PPC_CELL_NATIVE is not set | 174 | # CONFIG_PPC_CELL_NATIVE is not set |
175 | # CONFIG_PPC_82xx is not set | ||
169 | # CONFIG_PQ2ADS is not set | 176 | # CONFIG_PQ2ADS is not set |
177 | # CONFIG_PPC_83xx is not set | ||
178 | # CONFIG_PPC_86xx is not set | ||
170 | # CONFIG_EMBEDDED6xx is not set | 179 | # CONFIG_EMBEDDED6xx is not set |
171 | # CONFIG_IPIC is not set | 180 | # CONFIG_IPIC is not set |
172 | # CONFIG_MPIC is not set | 181 | # CONFIG_MPIC is not set |
@@ -199,12 +208,14 @@ CONFIG_HZ_100=y | |||
199 | # CONFIG_HZ_300 is not set | 208 | # CONFIG_HZ_300 is not set |
200 | # CONFIG_HZ_1000 is not set | 209 | # CONFIG_HZ_1000 is not set |
201 | CONFIG_HZ=100 | 210 | CONFIG_HZ=100 |
202 | # CONFIG_SCHED_HRTICK is not set | 211 | CONFIG_SCHED_HRTICK=y |
203 | # CONFIG_PREEMPT_NONE is not set | 212 | # CONFIG_PREEMPT_NONE is not set |
204 | # CONFIG_PREEMPT_VOLUNTARY is not set | 213 | # CONFIG_PREEMPT_VOLUNTARY is not set |
205 | CONFIG_PREEMPT=y | 214 | CONFIG_PREEMPT=y |
206 | # CONFIG_PREEMPT_RCU is not set | 215 | # CONFIG_PREEMPT_RCU is not set |
207 | CONFIG_BINFMT_ELF=y | 216 | CONFIG_BINFMT_ELF=y |
217 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set | ||
218 | # CONFIG_HAVE_AOUT is not set | ||
208 | # CONFIG_BINFMT_MISC is not set | 219 | # CONFIG_BINFMT_MISC is not set |
209 | # CONFIG_IOMMU_HELPER is not set | 220 | # CONFIG_IOMMU_HELPER is not set |
210 | CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y | 221 | CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y |
@@ -219,17 +230,19 @@ CONFIG_FLATMEM_MANUAL=y | |||
219 | # CONFIG_SPARSEMEM_MANUAL is not set | 230 | # CONFIG_SPARSEMEM_MANUAL is not set |
220 | CONFIG_FLATMEM=y | 231 | CONFIG_FLATMEM=y |
221 | CONFIG_FLAT_NODE_MEM_MAP=y | 232 | CONFIG_FLAT_NODE_MEM_MAP=y |
222 | # CONFIG_SPARSEMEM_STATIC is not set | ||
223 | # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set | ||
224 | CONFIG_PAGEFLAGS_EXTENDED=y | 233 | CONFIG_PAGEFLAGS_EXTENDED=y |
225 | CONFIG_SPLIT_PTLOCK_CPUS=4 | 234 | CONFIG_SPLIT_PTLOCK_CPUS=4 |
235 | CONFIG_MIGRATION=y | ||
226 | # CONFIG_RESOURCES_64BIT is not set | 236 | # CONFIG_RESOURCES_64BIT is not set |
237 | # CONFIG_PHYS_ADDR_T_64BIT is not set | ||
227 | CONFIG_ZONE_DMA_FLAG=1 | 238 | CONFIG_ZONE_DMA_FLAG=1 |
228 | CONFIG_BOUNCE=y | 239 | CONFIG_BOUNCE=y |
229 | CONFIG_VIRT_TO_BUS=y | 240 | CONFIG_VIRT_TO_BUS=y |
241 | CONFIG_UNEVICTABLE_LRU=y | ||
230 | CONFIG_FORCE_MAX_ZONEORDER=11 | 242 | CONFIG_FORCE_MAX_ZONEORDER=11 |
231 | CONFIG_PROC_DEVICETREE=y | 243 | CONFIG_PROC_DEVICETREE=y |
232 | # CONFIG_CMDLINE_BOOL is not set | 244 | # CONFIG_CMDLINE_BOOL is not set |
245 | CONFIG_EXTRA_TARGETS="" | ||
233 | # CONFIG_PM is not set | 246 | # CONFIG_PM is not set |
234 | # CONFIG_SECCOMP is not set | 247 | # CONFIG_SECCOMP is not set |
235 | CONFIG_ISA_DMA_API=y | 248 | CONFIG_ISA_DMA_API=y |
@@ -240,7 +253,7 @@ CONFIG_ISA_DMA_API=y | |||
240 | CONFIG_ZONE_DMA=y | 253 | CONFIG_ZONE_DMA=y |
241 | CONFIG_GENERIC_ISA_DMA=y | 254 | CONFIG_GENERIC_ISA_DMA=y |
242 | # CONFIG_PPC_INDIRECT_PCI is not set | 255 | # CONFIG_PPC_INDIRECT_PCI is not set |
243 | CONFIG_FSL_SOC=y | 256 | CONFIG_PPC_PCI_CHOICE=y |
244 | CONFIG_PCI=y | 257 | CONFIG_PCI=y |
245 | CONFIG_PCI_DOMAINS=y | 258 | CONFIG_PCI_DOMAINS=y |
246 | CONFIG_PCI_SYSCALL=y | 259 | CONFIG_PCI_SYSCALL=y |
@@ -265,10 +278,6 @@ CONFIG_PAGE_OFFSET=0xc0000000 | |||
265 | CONFIG_KERNEL_START=0xc0000000 | 278 | CONFIG_KERNEL_START=0xc0000000 |
266 | CONFIG_PHYSICAL_START=0x00000000 | 279 | CONFIG_PHYSICAL_START=0x00000000 |
267 | CONFIG_TASK_SIZE=0xc0000000 | 280 | CONFIG_TASK_SIZE=0xc0000000 |
268 | |||
269 | # | ||
270 | # Networking | ||
271 | # | ||
272 | CONFIG_NET=y | 281 | CONFIG_NET=y |
273 | 282 | ||
274 | # | 283 | # |
@@ -313,6 +322,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic" | |||
313 | # CONFIG_TIPC is not set | 322 | # CONFIG_TIPC is not set |
314 | # CONFIG_ATM is not set | 323 | # CONFIG_ATM is not set |
315 | # CONFIG_BRIDGE is not set | 324 | # CONFIG_BRIDGE is not set |
325 | # CONFIG_NET_DSA is not set | ||
316 | # CONFIG_VLAN_8021Q is not set | 326 | # CONFIG_VLAN_8021Q is not set |
317 | # CONFIG_DECNET is not set | 327 | # CONFIG_DECNET is not set |
318 | # CONFIG_LLC2 is not set | 328 | # CONFIG_LLC2 is not set |
@@ -333,14 +343,8 @@ CONFIG_DEFAULT_TCP_CONG="cubic" | |||
333 | # CONFIG_IRDA is not set | 343 | # CONFIG_IRDA is not set |
334 | # CONFIG_BT is not set | 344 | # CONFIG_BT is not set |
335 | # CONFIG_AF_RXRPC is not set | 345 | # CONFIG_AF_RXRPC is not set |
336 | 346 | # CONFIG_PHONET is not set | |
337 | # | 347 | # CONFIG_WIRELESS is not set |
338 | # Wireless | ||
339 | # | ||
340 | # CONFIG_CFG80211 is not set | ||
341 | # CONFIG_WIRELESS_EXT is not set | ||
342 | # CONFIG_MAC80211 is not set | ||
343 | # CONFIG_IEEE80211 is not set | ||
344 | # CONFIG_RFKILL is not set | 348 | # CONFIG_RFKILL is not set |
345 | # CONFIG_NET_9P is not set | 349 | # CONFIG_NET_9P is not set |
346 | 350 | ||
@@ -484,12 +488,12 @@ CONFIG_SCSI_WAIT_SCAN=m | |||
484 | # CONFIG_SCSI_SAS_LIBSAS is not set | 488 | # CONFIG_SCSI_SAS_LIBSAS is not set |
485 | # CONFIG_SCSI_SRP_ATTRS is not set | 489 | # CONFIG_SCSI_SRP_ATTRS is not set |
486 | # CONFIG_SCSI_LOWLEVEL is not set | 490 | # CONFIG_SCSI_LOWLEVEL is not set |
491 | # CONFIG_SCSI_DH is not set | ||
487 | CONFIG_ATA=m | 492 | CONFIG_ATA=m |
488 | # CONFIG_ATA_NONSTANDARD is not set | 493 | # CONFIG_ATA_NONSTANDARD is not set |
489 | CONFIG_SATA_PMP=y | 494 | CONFIG_SATA_PMP=y |
490 | # CONFIG_SATA_AHCI is not set | 495 | # CONFIG_SATA_AHCI is not set |
491 | # CONFIG_SATA_SIL24 is not set | 496 | # CONFIG_SATA_SIL24 is not set |
492 | # CONFIG_SATA_FSL is not set | ||
493 | CONFIG_ATA_SFF=y | 497 | CONFIG_ATA_SFF=y |
494 | # CONFIG_SATA_SVW is not set | 498 | # CONFIG_SATA_SVW is not set |
495 | # CONFIG_ATA_PIIX is not set | 499 | # CONFIG_ATA_PIIX is not set |
@@ -545,18 +549,22 @@ CONFIG_PATA_MPC52xx=m | |||
545 | # CONFIG_PATA_VIA is not set | 549 | # CONFIG_PATA_VIA is not set |
546 | # CONFIG_PATA_WINBOND is not set | 550 | # CONFIG_PATA_WINBOND is not set |
547 | # CONFIG_PATA_PLATFORM is not set | 551 | # CONFIG_PATA_PLATFORM is not set |
552 | # CONFIG_PATA_SCH is not set | ||
548 | # CONFIG_MD is not set | 553 | # CONFIG_MD is not set |
549 | # CONFIG_FUSION is not set | 554 | # CONFIG_FUSION is not set |
550 | 555 | ||
551 | # | 556 | # |
552 | # IEEE 1394 (FireWire) support | 557 | # IEEE 1394 (FireWire) support |
553 | # | 558 | # |
559 | |||
560 | # | ||
561 | # Enable only one of the two stacks, unless you know what you are doing | ||
562 | # | ||
554 | # CONFIG_FIREWIRE is not set | 563 | # CONFIG_FIREWIRE is not set |
555 | # CONFIG_IEEE1394 is not set | 564 | # CONFIG_IEEE1394 is not set |
556 | # CONFIG_I2O is not set | 565 | # CONFIG_I2O is not set |
557 | # CONFIG_MACINTOSH_DRIVERS is not set | 566 | # CONFIG_MACINTOSH_DRIVERS is not set |
558 | CONFIG_NETDEVICES=y | 567 | CONFIG_NETDEVICES=y |
559 | # CONFIG_NETDEVICES_MULTIQUEUE is not set | ||
560 | # CONFIG_DUMMY is not set | 568 | # CONFIG_DUMMY is not set |
561 | # CONFIG_BONDING is not set | 569 | # CONFIG_BONDING is not set |
562 | # CONFIG_MACVLAN is not set | 570 | # CONFIG_MACVLAN is not set |
@@ -593,10 +601,14 @@ CONFIG_MII=y | |||
593 | # CONFIG_IBM_NEW_EMAC_RGMII is not set | 601 | # CONFIG_IBM_NEW_EMAC_RGMII is not set |
594 | # CONFIG_IBM_NEW_EMAC_TAH is not set | 602 | # CONFIG_IBM_NEW_EMAC_TAH is not set |
595 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set | 603 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set |
604 | # CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set | ||
605 | # CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set | ||
606 | # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set | ||
596 | # CONFIG_NET_PCI is not set | 607 | # CONFIG_NET_PCI is not set |
597 | # CONFIG_B44 is not set | 608 | # CONFIG_B44 is not set |
598 | CONFIG_FEC_MPC52xx=y | 609 | CONFIG_FEC_MPC52xx=y |
599 | CONFIG_FEC_MPC52xx_MDIO=y | 610 | CONFIG_FEC_MPC52xx_MDIO=y |
611 | # CONFIG_ATL2 is not set | ||
600 | # CONFIG_NETDEV_1000 is not set | 612 | # CONFIG_NETDEV_1000 is not set |
601 | # CONFIG_NETDEV_10000 is not set | 613 | # CONFIG_NETDEV_10000 is not set |
602 | # CONFIG_TR is not set | 614 | # CONFIG_TR is not set |
@@ -606,7 +618,6 @@ CONFIG_FEC_MPC52xx_MDIO=y | |||
606 | # | 618 | # |
607 | # CONFIG_WLAN_PRE80211 is not set | 619 | # CONFIG_WLAN_PRE80211 is not set |
608 | # CONFIG_WLAN_80211 is not set | 620 | # CONFIG_WLAN_80211 is not set |
609 | # CONFIG_IWLWIFI is not set | ||
610 | # CONFIG_IWLWIFI_LEDS is not set | 621 | # CONFIG_IWLWIFI_LEDS is not set |
611 | 622 | ||
612 | # | 623 | # |
@@ -644,6 +655,7 @@ CONFIG_FEC_MPC52xx_MDIO=y | |||
644 | # Character devices | 655 | # Character devices |
645 | # | 656 | # |
646 | # CONFIG_VT is not set | 657 | # CONFIG_VT is not set |
658 | CONFIG_DEVKMEM=y | ||
647 | # CONFIG_SERIAL_NONSTANDARD is not set | 659 | # CONFIG_SERIAL_NONSTANDARD is not set |
648 | # CONFIG_NOZOMI is not set | 660 | # CONFIG_NOZOMI is not set |
649 | 661 | ||
@@ -675,43 +687,64 @@ CONFIG_DEVPORT=y | |||
675 | CONFIG_I2C=y | 687 | CONFIG_I2C=y |
676 | CONFIG_I2C_BOARDINFO=y | 688 | CONFIG_I2C_BOARDINFO=y |
677 | CONFIG_I2C_CHARDEV=y | 689 | CONFIG_I2C_CHARDEV=y |
690 | CONFIG_I2C_HELPER_AUTO=y | ||
678 | 691 | ||
679 | # | 692 | # |
680 | # I2C Hardware Bus support | 693 | # I2C Hardware Bus support |
681 | # | 694 | # |
695 | |||
696 | # | ||
697 | # PC SMBus host controller drivers | ||
698 | # | ||
682 | # CONFIG_I2C_ALI1535 is not set | 699 | # CONFIG_I2C_ALI1535 is not set |
683 | # CONFIG_I2C_ALI1563 is not set | 700 | # CONFIG_I2C_ALI1563 is not set |
684 | # CONFIG_I2C_ALI15X3 is not set | 701 | # CONFIG_I2C_ALI15X3 is not set |
685 | # CONFIG_I2C_AMD756 is not set | 702 | # CONFIG_I2C_AMD756 is not set |
686 | # CONFIG_I2C_AMD8111 is not set | 703 | # CONFIG_I2C_AMD8111 is not set |
687 | # CONFIG_I2C_I801 is not set | 704 | # CONFIG_I2C_I801 is not set |
688 | # CONFIG_I2C_I810 is not set | 705 | # CONFIG_I2C_ISCH is not set |
689 | # CONFIG_I2C_PIIX4 is not set | 706 | # CONFIG_I2C_PIIX4 is not set |
690 | CONFIG_I2C_MPC=y | ||
691 | # CONFIG_I2C_NFORCE2 is not set | 707 | # CONFIG_I2C_NFORCE2 is not set |
692 | # CONFIG_I2C_OCORES is not set | ||
693 | # CONFIG_I2C_PARPORT_LIGHT is not set | ||
694 | # CONFIG_I2C_PROSAVAGE is not set | ||
695 | # CONFIG_I2C_SAVAGE4 is not set | ||
696 | # CONFIG_I2C_SIMTEC is not set | ||
697 | # CONFIG_I2C_SIS5595 is not set | 708 | # CONFIG_I2C_SIS5595 is not set |
698 | # CONFIG_I2C_SIS630 is not set | 709 | # CONFIG_I2C_SIS630 is not set |
699 | # CONFIG_I2C_SIS96X is not set | 710 | # CONFIG_I2C_SIS96X is not set |
700 | # CONFIG_I2C_TAOS_EVM is not set | ||
701 | # CONFIG_I2C_STUB is not set | ||
702 | # CONFIG_I2C_TINY_USB is not set | ||
703 | # CONFIG_I2C_VIA is not set | 711 | # CONFIG_I2C_VIA is not set |
704 | # CONFIG_I2C_VIAPRO is not set | 712 | # CONFIG_I2C_VIAPRO is not set |
713 | |||
714 | # | ||
715 | # I2C system bus drivers (mostly embedded / system-on-chip) | ||
716 | # | ||
717 | CONFIG_I2C_MPC=y | ||
718 | # CONFIG_I2C_OCORES is not set | ||
719 | # CONFIG_I2C_SIMTEC is not set | ||
720 | |||
721 | # | ||
722 | # External I2C/SMBus adapter drivers | ||
723 | # | ||
724 | # CONFIG_I2C_PARPORT_LIGHT is not set | ||
725 | # CONFIG_I2C_TAOS_EVM is not set | ||
726 | # CONFIG_I2C_TINY_USB is not set | ||
727 | |||
728 | # | ||
729 | # Graphics adapter I2C/DDC channel drivers | ||
730 | # | ||
705 | # CONFIG_I2C_VOODOO3 is not set | 731 | # CONFIG_I2C_VOODOO3 is not set |
732 | |||
733 | # | ||
734 | # Other I2C/SMBus bus drivers | ||
735 | # | ||
706 | # CONFIG_I2C_PCA_PLATFORM is not set | 736 | # CONFIG_I2C_PCA_PLATFORM is not set |
737 | # CONFIG_I2C_STUB is not set | ||
707 | 738 | ||
708 | # | 739 | # |
709 | # Miscellaneous I2C Chip support | 740 | # Miscellaneous I2C Chip support |
710 | # | 741 | # |
711 | # CONFIG_DS1682 is not set | 742 | # CONFIG_DS1682 is not set |
743 | # CONFIG_AT24 is not set | ||
712 | CONFIG_SENSORS_EEPROM=m | 744 | CONFIG_SENSORS_EEPROM=m |
713 | # CONFIG_SENSORS_PCF8574 is not set | 745 | # CONFIG_SENSORS_PCF8574 is not set |
714 | # CONFIG_PCF8575 is not set | 746 | # CONFIG_PCF8575 is not set |
747 | # CONFIG_SENSORS_PCA9539 is not set | ||
715 | # CONFIG_SENSORS_PCF8591 is not set | 748 | # CONFIG_SENSORS_PCF8591 is not set |
716 | # CONFIG_SENSORS_MAX6875 is not set | 749 | # CONFIG_SENSORS_MAX6875 is not set |
717 | # CONFIG_SENSORS_TSL2550 is not set | 750 | # CONFIG_SENSORS_TSL2550 is not set |
@@ -720,29 +753,47 @@ CONFIG_SENSORS_EEPROM=m | |||
720 | # CONFIG_I2C_DEBUG_BUS is not set | 753 | # CONFIG_I2C_DEBUG_BUS is not set |
721 | # CONFIG_I2C_DEBUG_CHIP is not set | 754 | # CONFIG_I2C_DEBUG_CHIP is not set |
722 | # CONFIG_SPI is not set | 755 | # CONFIG_SPI is not set |
756 | CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y | ||
757 | # CONFIG_GPIOLIB is not set | ||
723 | # CONFIG_W1 is not set | 758 | # CONFIG_W1 is not set |
724 | # CONFIG_POWER_SUPPLY is not set | 759 | # CONFIG_POWER_SUPPLY is not set |
725 | # CONFIG_HWMON is not set | 760 | # CONFIG_HWMON is not set |
726 | # CONFIG_THERMAL is not set | 761 | # CONFIG_THERMAL is not set |
762 | # CONFIG_THERMAL_HWMON is not set | ||
727 | # CONFIG_WATCHDOG is not set | 763 | # CONFIG_WATCHDOG is not set |
764 | CONFIG_SSB_POSSIBLE=y | ||
728 | 765 | ||
729 | # | 766 | # |
730 | # Sonics Silicon Backplane | 767 | # Sonics Silicon Backplane |
731 | # | 768 | # |
732 | CONFIG_SSB_POSSIBLE=y | ||
733 | # CONFIG_SSB is not set | 769 | # CONFIG_SSB is not set |
734 | 770 | ||
735 | # | 771 | # |
736 | # Multifunction device drivers | 772 | # Multifunction device drivers |
737 | # | 773 | # |
774 | # CONFIG_MFD_CORE is not set | ||
738 | # CONFIG_MFD_SM501 is not set | 775 | # CONFIG_MFD_SM501 is not set |
739 | # CONFIG_HTC_PASIC3 is not set | 776 | # CONFIG_HTC_PASIC3 is not set |
777 | # CONFIG_MFD_TMIO is not set | ||
778 | # CONFIG_PMIC_DA903X is not set | ||
779 | # CONFIG_MFD_WM8400 is not set | ||
780 | # CONFIG_MFD_WM8350_I2C is not set | ||
781 | # CONFIG_REGULATOR is not set | ||
740 | 782 | ||
741 | # | 783 | # |
742 | # Multimedia devices | 784 | # Multimedia devices |
743 | # | 785 | # |
786 | |||
787 | # | ||
788 | # Multimedia core support | ||
789 | # | ||
744 | # CONFIG_VIDEO_DEV is not set | 790 | # CONFIG_VIDEO_DEV is not set |
745 | # CONFIG_DVB_CORE is not set | 791 | # CONFIG_DVB_CORE is not set |
792 | # CONFIG_VIDEO_MEDIA is not set | ||
793 | |||
794 | # | ||
795 | # Multimedia drivers | ||
796 | # | ||
746 | # CONFIG_DAB is not set | 797 | # CONFIG_DAB is not set |
747 | 798 | ||
748 | # | 799 | # |
@@ -759,10 +810,6 @@ CONFIG_SSB_POSSIBLE=y | |||
759 | # Display device support | 810 | # Display device support |
760 | # | 811 | # |
761 | # CONFIG_DISPLAY_SUPPORT is not set | 812 | # CONFIG_DISPLAY_SUPPORT is not set |
762 | |||
763 | # | ||
764 | # Sound | ||
765 | # | ||
766 | # CONFIG_SOUND is not set | 813 | # CONFIG_SOUND is not set |
767 | CONFIG_USB_SUPPORT=y | 814 | CONFIG_USB_SUPPORT=y |
768 | CONFIG_USB_ARCH_HAS_HCD=y | 815 | CONFIG_USB_ARCH_HAS_HCD=y |
@@ -781,12 +828,17 @@ CONFIG_USB_DEVICEFS=y | |||
781 | # CONFIG_USB_OTG is not set | 828 | # CONFIG_USB_OTG is not set |
782 | # CONFIG_USB_OTG_WHITELIST is not set | 829 | # CONFIG_USB_OTG_WHITELIST is not set |
783 | # CONFIG_USB_OTG_BLACKLIST_HUB is not set | 830 | # CONFIG_USB_OTG_BLACKLIST_HUB is not set |
831 | # CONFIG_USB_MON is not set | ||
832 | # CONFIG_USB_WUSB is not set | ||
833 | # CONFIG_USB_WUSB_CBAF is not set | ||
784 | 834 | ||
785 | # | 835 | # |
786 | # USB Host Controller Drivers | 836 | # USB Host Controller Drivers |
787 | # | 837 | # |
838 | # CONFIG_USB_C67X00_HCD is not set | ||
788 | # CONFIG_USB_EHCI_HCD is not set | 839 | # CONFIG_USB_EHCI_HCD is not set |
789 | # CONFIG_USB_ISP116X_HCD is not set | 840 | # CONFIG_USB_ISP116X_HCD is not set |
841 | # CONFIG_USB_ISP1760_HCD is not set | ||
790 | CONFIG_USB_OHCI_HCD=m | 842 | CONFIG_USB_OHCI_HCD=m |
791 | # CONFIG_USB_OHCI_HCD_PPC_SOC is not set | 843 | # CONFIG_USB_OHCI_HCD_PPC_SOC is not set |
792 | CONFIG_USB_OHCI_HCD_PPC_OF=y | 844 | CONFIG_USB_OHCI_HCD_PPC_OF=y |
@@ -799,12 +851,17 @@ CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y | |||
799 | # CONFIG_USB_UHCI_HCD is not set | 851 | # CONFIG_USB_UHCI_HCD is not set |
800 | # CONFIG_USB_SL811_HCD is not set | 852 | # CONFIG_USB_SL811_HCD is not set |
801 | # CONFIG_USB_R8A66597_HCD is not set | 853 | # CONFIG_USB_R8A66597_HCD is not set |
854 | # CONFIG_USB_WHCI_HCD is not set | ||
855 | # CONFIG_USB_HWA_HCD is not set | ||
856 | # CONFIG_USB_MUSB_HDRC is not set | ||
802 | 857 | ||
803 | # | 858 | # |
804 | # USB Device Class drivers | 859 | # USB Device Class drivers |
805 | # | 860 | # |
806 | # CONFIG_USB_ACM is not set | 861 | # CONFIG_USB_ACM is not set |
807 | # CONFIG_USB_PRINTER is not set | 862 | # CONFIG_USB_PRINTER is not set |
863 | # CONFIG_USB_WDM is not set | ||
864 | # CONFIG_USB_TMC is not set | ||
808 | 865 | ||
809 | # | 866 | # |
810 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | 867 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' |
@@ -833,7 +890,6 @@ CONFIG_USB_STORAGE=m | |||
833 | # | 890 | # |
834 | # CONFIG_USB_MDC800 is not set | 891 | # CONFIG_USB_MDC800 is not set |
835 | # CONFIG_USB_MICROTEK is not set | 892 | # CONFIG_USB_MICROTEK is not set |
836 | # CONFIG_USB_MON is not set | ||
837 | 893 | ||
838 | # | 894 | # |
839 | # USB port drivers | 895 | # USB port drivers |
@@ -846,7 +902,7 @@ CONFIG_USB_STORAGE=m | |||
846 | # CONFIG_USB_EMI62 is not set | 902 | # CONFIG_USB_EMI62 is not set |
847 | # CONFIG_USB_EMI26 is not set | 903 | # CONFIG_USB_EMI26 is not set |
848 | # CONFIG_USB_ADUTUX is not set | 904 | # CONFIG_USB_ADUTUX is not set |
849 | # CONFIG_USB_AUERSWALD is not set | 905 | # CONFIG_USB_SEVSEG is not set |
850 | # CONFIG_USB_RIO500 is not set | 906 | # CONFIG_USB_RIO500 is not set |
851 | # CONFIG_USB_LEGOTOWER is not set | 907 | # CONFIG_USB_LEGOTOWER is not set |
852 | # CONFIG_USB_LCD is not set | 908 | # CONFIG_USB_LCD is not set |
@@ -862,10 +918,14 @@ CONFIG_USB_STORAGE=m | |||
862 | # CONFIG_USB_TRANCEVIBRATOR is not set | 918 | # CONFIG_USB_TRANCEVIBRATOR is not set |
863 | # CONFIG_USB_IOWARRIOR is not set | 919 | # CONFIG_USB_IOWARRIOR is not set |
864 | # CONFIG_USB_TEST is not set | 920 | # CONFIG_USB_TEST is not set |
921 | # CONFIG_USB_ISIGHTFW is not set | ||
922 | # CONFIG_USB_VST is not set | ||
865 | # CONFIG_USB_GADGET is not set | 923 | # CONFIG_USB_GADGET is not set |
924 | # CONFIG_UWB is not set | ||
866 | # CONFIG_MMC is not set | 925 | # CONFIG_MMC is not set |
867 | # CONFIG_MEMSTICK is not set | 926 | # CONFIG_MEMSTICK is not set |
868 | # CONFIG_NEW_LEDS is not set | 927 | # CONFIG_NEW_LEDS is not set |
928 | # CONFIG_ACCESSIBILITY is not set | ||
869 | # CONFIG_INFINIBAND is not set | 929 | # CONFIG_INFINIBAND is not set |
870 | # CONFIG_EDAC is not set | 930 | # CONFIG_EDAC is not set |
871 | CONFIG_RTC_LIB=m | 931 | CONFIG_RTC_LIB=m |
@@ -894,6 +954,8 @@ CONFIG_RTC_DRV_PCF8563=m | |||
894 | # CONFIG_RTC_DRV_PCF8583 is not set | 954 | # CONFIG_RTC_DRV_PCF8583 is not set |
895 | # CONFIG_RTC_DRV_M41T80 is not set | 955 | # CONFIG_RTC_DRV_M41T80 is not set |
896 | # CONFIG_RTC_DRV_S35390A is not set | 956 | # CONFIG_RTC_DRV_S35390A is not set |
957 | # CONFIG_RTC_DRV_FM3130 is not set | ||
958 | # CONFIG_RTC_DRV_RX8581 is not set | ||
897 | 959 | ||
898 | # | 960 | # |
899 | # SPI RTC drivers | 961 | # SPI RTC drivers |
@@ -903,19 +965,25 @@ CONFIG_RTC_DRV_PCF8563=m | |||
903 | # Platform RTC drivers | 965 | # Platform RTC drivers |
904 | # | 966 | # |
905 | # CONFIG_RTC_DRV_CMOS is not set | 967 | # CONFIG_RTC_DRV_CMOS is not set |
968 | # CONFIG_RTC_DRV_DS1286 is not set | ||
906 | # CONFIG_RTC_DRV_DS1511 is not set | 969 | # CONFIG_RTC_DRV_DS1511 is not set |
907 | # CONFIG_RTC_DRV_DS1553 is not set | 970 | # CONFIG_RTC_DRV_DS1553 is not set |
908 | # CONFIG_RTC_DRV_DS1742 is not set | 971 | # CONFIG_RTC_DRV_DS1742 is not set |
909 | # CONFIG_RTC_DRV_STK17TA8 is not set | 972 | # CONFIG_RTC_DRV_STK17TA8 is not set |
910 | # CONFIG_RTC_DRV_M48T86 is not set | 973 | # CONFIG_RTC_DRV_M48T86 is not set |
974 | # CONFIG_RTC_DRV_M48T35 is not set | ||
911 | # CONFIG_RTC_DRV_M48T59 is not set | 975 | # CONFIG_RTC_DRV_M48T59 is not set |
976 | # CONFIG_RTC_DRV_BQ4802 is not set | ||
912 | # CONFIG_RTC_DRV_V3020 is not set | 977 | # CONFIG_RTC_DRV_V3020 is not set |
913 | 978 | ||
914 | # | 979 | # |
915 | # on-CPU RTC drivers | 980 | # on-CPU RTC drivers |
916 | # | 981 | # |
982 | # CONFIG_RTC_DRV_PPC is not set | ||
917 | # CONFIG_DMADEVICES is not set | 983 | # CONFIG_DMADEVICES is not set |
918 | # CONFIG_UIO is not set | 984 | # CONFIG_UIO is not set |
985 | # CONFIG_STAGING is not set | ||
986 | CONFIG_STAGING_EXCLUDE_BUILD=y | ||
919 | 987 | ||
920 | # | 988 | # |
921 | # File systems | 989 | # File systems |
@@ -927,12 +995,13 @@ CONFIG_EXT3_FS=m | |||
927 | CONFIG_EXT3_FS_XATTR=y | 995 | CONFIG_EXT3_FS_XATTR=y |
928 | # CONFIG_EXT3_FS_POSIX_ACL is not set | 996 | # CONFIG_EXT3_FS_POSIX_ACL is not set |
929 | # CONFIG_EXT3_FS_SECURITY is not set | 997 | # CONFIG_EXT3_FS_SECURITY is not set |
930 | # CONFIG_EXT4DEV_FS is not set | 998 | # CONFIG_EXT4_FS is not set |
931 | CONFIG_JBD=m | 999 | CONFIG_JBD=m |
932 | CONFIG_FS_MBCACHE=m | 1000 | CONFIG_FS_MBCACHE=m |
933 | # CONFIG_REISERFS_FS is not set | 1001 | # CONFIG_REISERFS_FS is not set |
934 | # CONFIG_JFS_FS is not set | 1002 | # CONFIG_JFS_FS is not set |
935 | # CONFIG_FS_POSIX_ACL is not set | 1003 | # CONFIG_FS_POSIX_ACL is not set |
1004 | CONFIG_FILE_LOCKING=y | ||
936 | # CONFIG_XFS_FS is not set | 1005 | # CONFIG_XFS_FS is not set |
937 | # CONFIG_OCFS2_FS is not set | 1006 | # CONFIG_OCFS2_FS is not set |
938 | # CONFIG_DNOTIFY is not set | 1007 | # CONFIG_DNOTIFY is not set |
@@ -964,6 +1033,7 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | |||
964 | CONFIG_PROC_FS=y | 1033 | CONFIG_PROC_FS=y |
965 | # CONFIG_PROC_KCORE is not set | 1034 | # CONFIG_PROC_KCORE is not set |
966 | CONFIG_PROC_SYSCTL=y | 1035 | CONFIG_PROC_SYSCTL=y |
1036 | CONFIG_PROC_PAGE_MONITOR=y | ||
967 | CONFIG_SYSFS=y | 1037 | CONFIG_SYSFS=y |
968 | CONFIG_TMPFS=y | 1038 | CONFIG_TMPFS=y |
969 | # CONFIG_TMPFS_POSIX_ACL is not set | 1039 | # CONFIG_TMPFS_POSIX_ACL is not set |
@@ -994,6 +1064,7 @@ CONFIG_JFFS2_RTIME=y | |||
994 | # CONFIG_CRAMFS is not set | 1064 | # CONFIG_CRAMFS is not set |
995 | # CONFIG_VXFS_FS is not set | 1065 | # CONFIG_VXFS_FS is not set |
996 | # CONFIG_MINIX_FS is not set | 1066 | # CONFIG_MINIX_FS is not set |
1067 | # CONFIG_OMFS_FS is not set | ||
997 | # CONFIG_HPFS_FS is not set | 1068 | # CONFIG_HPFS_FS is not set |
998 | # CONFIG_QNX4FS_FS is not set | 1069 | # CONFIG_QNX4FS_FS is not set |
999 | # CONFIG_ROMFS_FS is not set | 1070 | # CONFIG_ROMFS_FS is not set |
@@ -1004,13 +1075,13 @@ CONFIG_NFS_FS=y | |||
1004 | CONFIG_NFS_V3=y | 1075 | CONFIG_NFS_V3=y |
1005 | # CONFIG_NFS_V3_ACL is not set | 1076 | # CONFIG_NFS_V3_ACL is not set |
1006 | # CONFIG_NFS_V4 is not set | 1077 | # CONFIG_NFS_V4 is not set |
1007 | # CONFIG_NFSD is not set | ||
1008 | CONFIG_ROOT_NFS=y | 1078 | CONFIG_ROOT_NFS=y |
1079 | # CONFIG_NFSD is not set | ||
1009 | CONFIG_LOCKD=y | 1080 | CONFIG_LOCKD=y |
1010 | CONFIG_LOCKD_V4=y | 1081 | CONFIG_LOCKD_V4=y |
1011 | CONFIG_NFS_COMMON=y | 1082 | CONFIG_NFS_COMMON=y |
1012 | CONFIG_SUNRPC=y | 1083 | CONFIG_SUNRPC=y |
1013 | # CONFIG_SUNRPC_BIND34 is not set | 1084 | # CONFIG_SUNRPC_REGISTER_V4 is not set |
1014 | # CONFIG_RPCSEC_GSS_KRB5 is not set | 1085 | # CONFIG_RPCSEC_GSS_KRB5 is not set |
1015 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | 1086 | # CONFIG_RPCSEC_GSS_SPKM3 is not set |
1016 | # CONFIG_SMB_FS is not set | 1087 | # CONFIG_SMB_FS is not set |
@@ -1070,9 +1141,9 @@ CONFIG_NLS_ISO8859_1=y | |||
1070 | # Library routines | 1141 | # Library routines |
1071 | # | 1142 | # |
1072 | CONFIG_BITREVERSE=y | 1143 | CONFIG_BITREVERSE=y |
1073 | # CONFIG_GENERIC_FIND_FIRST_BIT is not set | ||
1074 | # CONFIG_CRC_CCITT is not set | 1144 | # CONFIG_CRC_CCITT is not set |
1075 | # CONFIG_CRC16 is not set | 1145 | # CONFIG_CRC16 is not set |
1146 | # CONFIG_CRC_T10DIF is not set | ||
1076 | # CONFIG_CRC_ITU_T is not set | 1147 | # CONFIG_CRC_ITU_T is not set |
1077 | CONFIG_CRC32=y | 1148 | CONFIG_CRC32=y |
1078 | # CONFIG_CRC7 is not set | 1149 | # CONFIG_CRC7 is not set |
@@ -1098,7 +1169,17 @@ CONFIG_FRAME_WARN=1024 | |||
1098 | # CONFIG_HEADERS_CHECK is not set | 1169 | # CONFIG_HEADERS_CHECK is not set |
1099 | # CONFIG_DEBUG_KERNEL is not set | 1170 | # CONFIG_DEBUG_KERNEL is not set |
1100 | # CONFIG_DEBUG_BUGVERBOSE is not set | 1171 | # CONFIG_DEBUG_BUGVERBOSE is not set |
1172 | # CONFIG_DEBUG_MEMORY_INIT is not set | ||
1173 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | ||
1174 | # CONFIG_LATENCYTOP is not set | ||
1175 | CONFIG_HAVE_FUNCTION_TRACER=y | ||
1176 | |||
1177 | # | ||
1178 | # Tracers | ||
1179 | # | ||
1180 | # CONFIG_DYNAMIC_PRINTK_DEBUG is not set | ||
1101 | # CONFIG_SAMPLES is not set | 1181 | # CONFIG_SAMPLES is not set |
1182 | CONFIG_HAVE_ARCH_KGDB=y | ||
1102 | # CONFIG_IRQSTACKS is not set | 1183 | # CONFIG_IRQSTACKS is not set |
1103 | # CONFIG_BOOTX_TEXT is not set | 1184 | # CONFIG_BOOTX_TEXT is not set |
1104 | # CONFIG_PPC_EARLY_DEBUG is not set | 1185 | # CONFIG_PPC_EARLY_DEBUG is not set |
@@ -1108,6 +1189,7 @@ CONFIG_FRAME_WARN=1024 | |||
1108 | # | 1189 | # |
1109 | # CONFIG_KEYS is not set | 1190 | # CONFIG_KEYS is not set |
1110 | # CONFIG_SECURITY is not set | 1191 | # CONFIG_SECURITY is not set |
1192 | # CONFIG_SECURITYFS is not set | ||
1111 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | 1193 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set |
1112 | # CONFIG_CRYPTO is not set | 1194 | # CONFIG_CRYPTO is not set |
1113 | CONFIG_PPC_CLOCK=y | 1195 | CONFIG_PPC_CLOCK=y |
diff --git a/arch/powerpc/configs/52xx/tqm5200_defconfig b/arch/powerpc/configs/52xx/tqm5200_defconfig index 7672bfba3566..bc190051e8d5 100644 --- a/arch/powerpc/configs/52xx/tqm5200_defconfig +++ b/arch/powerpc/configs/52xx/tqm5200_defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.25 | 3 | # Linux kernel version: 2.6.28-rc4 |
4 | # Tue Apr 29 07:12:39 2008 | 4 | # Thu Nov 13 02:09:30 2008 |
5 | # | 5 | # |
6 | # CONFIG_PPC64 is not set | 6 | # CONFIG_PPC64 is not set |
7 | 7 | ||
@@ -22,7 +22,7 @@ CONFIG_PPC_STD_MMU_32=y | |||
22 | # CONFIG_SMP is not set | 22 | # CONFIG_SMP is not set |
23 | CONFIG_PPC32=y | 23 | CONFIG_PPC32=y |
24 | CONFIG_WORD_SIZE=32 | 24 | CONFIG_WORD_SIZE=32 |
25 | CONFIG_PPC_MERGE=y | 25 | # CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set |
26 | CONFIG_MMU=y | 26 | CONFIG_MMU=y |
27 | CONFIG_GENERIC_CMOS_UPDATE=y | 27 | CONFIG_GENERIC_CMOS_UPDATE=y |
28 | CONFIG_GENERIC_TIME=y | 28 | CONFIG_GENERIC_TIME=y |
@@ -32,6 +32,7 @@ CONFIG_GENERIC_HARDIRQS=y | |||
32 | # CONFIG_HAVE_SETUP_PER_CPU_AREA is not set | 32 | # CONFIG_HAVE_SETUP_PER_CPU_AREA is not set |
33 | CONFIG_IRQ_PER_CPU=y | 33 | CONFIG_IRQ_PER_CPU=y |
34 | CONFIG_STACKTRACE_SUPPORT=y | 34 | CONFIG_STACKTRACE_SUPPORT=y |
35 | CONFIG_HAVE_LATENCYTOP_SUPPORT=y | ||
35 | CONFIG_LOCKDEP_SUPPORT=y | 36 | CONFIG_LOCKDEP_SUPPORT=y |
36 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y | 37 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y |
37 | CONFIG_ARCH_HAS_ILOG2_U32=y | 38 | CONFIG_ARCH_HAS_ILOG2_U32=y |
@@ -102,6 +103,7 @@ CONFIG_SIGNALFD=y | |||
102 | CONFIG_TIMERFD=y | 103 | CONFIG_TIMERFD=y |
103 | CONFIG_EVENTFD=y | 104 | CONFIG_EVENTFD=y |
104 | CONFIG_SHMEM=y | 105 | CONFIG_SHMEM=y |
106 | CONFIG_AIO=y | ||
105 | CONFIG_VM_EVENT_COUNTERS=y | 107 | CONFIG_VM_EVENT_COUNTERS=y |
106 | CONFIG_SLUB_DEBUG=y | 108 | CONFIG_SLUB_DEBUG=y |
107 | # CONFIG_SLAB is not set | 109 | # CONFIG_SLAB is not set |
@@ -110,14 +112,19 @@ CONFIG_SLUB=y | |||
110 | # CONFIG_PROFILING is not set | 112 | # CONFIG_PROFILING is not set |
111 | # CONFIG_MARKERS is not set | 113 | # CONFIG_MARKERS is not set |
112 | CONFIG_HAVE_OPROFILE=y | 114 | CONFIG_HAVE_OPROFILE=y |
115 | CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y | ||
116 | CONFIG_HAVE_IOREMAP_PROT=y | ||
113 | CONFIG_HAVE_KPROBES=y | 117 | CONFIG_HAVE_KPROBES=y |
114 | CONFIG_HAVE_KRETPROBES=y | 118 | CONFIG_HAVE_KRETPROBES=y |
115 | CONFIG_PROC_PAGE_MONITOR=y | 119 | CONFIG_HAVE_ARCH_TRACEHOOK=y |
120 | CONFIG_HAVE_CLK=y | ||
121 | # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set | ||
116 | CONFIG_SLABINFO=y | 122 | CONFIG_SLABINFO=y |
117 | CONFIG_RT_MUTEXES=y | 123 | CONFIG_RT_MUTEXES=y |
118 | # CONFIG_TINY_SHMEM is not set | 124 | # CONFIG_TINY_SHMEM is not set |
119 | CONFIG_BASE_SMALL=0 | 125 | CONFIG_BASE_SMALL=0 |
120 | CONFIG_MODULES=y | 126 | CONFIG_MODULES=y |
127 | # CONFIG_MODULE_FORCE_LOAD is not set | ||
121 | CONFIG_MODULE_UNLOAD=y | 128 | CONFIG_MODULE_UNLOAD=y |
122 | # CONFIG_MODULE_FORCE_UNLOAD is not set | 129 | # CONFIG_MODULE_FORCE_UNLOAD is not set |
123 | CONFIG_MODVERSIONS=y | 130 | CONFIG_MODVERSIONS=y |
@@ -128,6 +135,7 @@ CONFIG_BLOCK=y | |||
128 | # CONFIG_BLK_DEV_IO_TRACE is not set | 135 | # CONFIG_BLK_DEV_IO_TRACE is not set |
129 | # CONFIG_LSF is not set | 136 | # CONFIG_LSF is not set |
130 | # CONFIG_BLK_DEV_BSG is not set | 137 | # CONFIG_BLK_DEV_BSG is not set |
138 | # CONFIG_BLK_DEV_INTEGRITY is not set | ||
131 | 139 | ||
132 | # | 140 | # |
133 | # IO Schedulers | 141 | # IO Schedulers |
@@ -142,19 +150,16 @@ CONFIG_DEFAULT_AS=y | |||
142 | # CONFIG_DEFAULT_NOOP is not set | 150 | # CONFIG_DEFAULT_NOOP is not set |
143 | CONFIG_DEFAULT_IOSCHED="anticipatory" | 151 | CONFIG_DEFAULT_IOSCHED="anticipatory" |
144 | CONFIG_CLASSIC_RCU=y | 152 | CONFIG_CLASSIC_RCU=y |
153 | # CONFIG_FREEZER is not set | ||
145 | 154 | ||
146 | # | 155 | # |
147 | # Platform support | 156 | # Platform support |
148 | # | 157 | # |
149 | CONFIG_PPC_MULTIPLATFORM=y | 158 | CONFIG_PPC_MULTIPLATFORM=y |
150 | # CONFIG_PPC_82xx is not set | ||
151 | # CONFIG_PPC_83xx is not set | ||
152 | # CONFIG_PPC_86xx is not set | ||
153 | CONFIG_CLASSIC32=y | 159 | CONFIG_CLASSIC32=y |
154 | # CONFIG_PPC_CHRP is not set | 160 | # CONFIG_PPC_CHRP is not set |
155 | # CONFIG_PPC_MPC512x is not set | ||
156 | # CONFIG_PPC_MPC5121 is not set | ||
157 | # CONFIG_MPC5121_ADS is not set | 161 | # CONFIG_MPC5121_ADS is not set |
162 | # CONFIG_MPC5121_GENERIC is not set | ||
158 | CONFIG_PPC_MPC52xx=y | 163 | CONFIG_PPC_MPC52xx=y |
159 | CONFIG_PPC_MPC5200_SIMPLE=y | 164 | CONFIG_PPC_MPC5200_SIMPLE=y |
160 | # CONFIG_PPC_EFIKA is not set | 165 | # CONFIG_PPC_EFIKA is not set |
@@ -164,7 +169,10 @@ CONFIG_PPC_MPC5200_BUGFIX=y | |||
164 | # CONFIG_PPC_PMAC is not set | 169 | # CONFIG_PPC_PMAC is not set |
165 | # CONFIG_PPC_CELL is not set | 170 | # CONFIG_PPC_CELL is not set |
166 | # CONFIG_PPC_CELL_NATIVE is not set | 171 | # CONFIG_PPC_CELL_NATIVE is not set |
172 | # CONFIG_PPC_82xx is not set | ||
167 | # CONFIG_PQ2ADS is not set | 173 | # CONFIG_PQ2ADS is not set |
174 | # CONFIG_PPC_83xx is not set | ||
175 | # CONFIG_PPC_86xx is not set | ||
168 | # CONFIG_EMBEDDED6xx is not set | 176 | # CONFIG_EMBEDDED6xx is not set |
169 | # CONFIG_IPIC is not set | 177 | # CONFIG_IPIC is not set |
170 | # CONFIG_MPIC is not set | 178 | # CONFIG_MPIC is not set |
@@ -188,7 +196,6 @@ CONFIG_PPC_BESTCOMM_FEC=y | |||
188 | # Kernel options | 196 | # Kernel options |
189 | # | 197 | # |
190 | # CONFIG_HIGHMEM is not set | 198 | # CONFIG_HIGHMEM is not set |
191 | # CONFIG_TICK_ONESHOT is not set | ||
192 | # CONFIG_NO_HZ is not set | 199 | # CONFIG_NO_HZ is not set |
193 | # CONFIG_HIGH_RES_TIMERS is not set | 200 | # CONFIG_HIGH_RES_TIMERS is not set |
194 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y | 201 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y |
@@ -202,6 +209,8 @@ CONFIG_PREEMPT_NONE=y | |||
202 | # CONFIG_PREEMPT_VOLUNTARY is not set | 209 | # CONFIG_PREEMPT_VOLUNTARY is not set |
203 | # CONFIG_PREEMPT is not set | 210 | # CONFIG_PREEMPT is not set |
204 | CONFIG_BINFMT_ELF=y | 211 | CONFIG_BINFMT_ELF=y |
212 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set | ||
213 | # CONFIG_HAVE_AOUT is not set | ||
205 | # CONFIG_BINFMT_MISC is not set | 214 | # CONFIG_BINFMT_MISC is not set |
206 | # CONFIG_IOMMU_HELPER is not set | 215 | # CONFIG_IOMMU_HELPER is not set |
207 | CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y | 216 | CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y |
@@ -216,19 +225,20 @@ CONFIG_FLATMEM_MANUAL=y | |||
216 | # CONFIG_SPARSEMEM_MANUAL is not set | 225 | # CONFIG_SPARSEMEM_MANUAL is not set |
217 | CONFIG_FLATMEM=y | 226 | CONFIG_FLATMEM=y |
218 | CONFIG_FLAT_NODE_MEM_MAP=y | 227 | CONFIG_FLAT_NODE_MEM_MAP=y |
219 | # CONFIG_SPARSEMEM_STATIC is not set | ||
220 | # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set | ||
221 | CONFIG_PAGEFLAGS_EXTENDED=y | 228 | CONFIG_PAGEFLAGS_EXTENDED=y |
222 | CONFIG_SPLIT_PTLOCK_CPUS=4 | 229 | CONFIG_SPLIT_PTLOCK_CPUS=4 |
230 | CONFIG_MIGRATION=y | ||
223 | # CONFIG_RESOURCES_64BIT is not set | 231 | # CONFIG_RESOURCES_64BIT is not set |
232 | # CONFIG_PHYS_ADDR_T_64BIT is not set | ||
224 | CONFIG_ZONE_DMA_FLAG=1 | 233 | CONFIG_ZONE_DMA_FLAG=1 |
225 | CONFIG_BOUNCE=y | 234 | CONFIG_BOUNCE=y |
226 | CONFIG_VIRT_TO_BUS=y | 235 | CONFIG_VIRT_TO_BUS=y |
236 | CONFIG_UNEVICTABLE_LRU=y | ||
227 | CONFIG_FORCE_MAX_ZONEORDER=11 | 237 | CONFIG_FORCE_MAX_ZONEORDER=11 |
228 | CONFIG_PROC_DEVICETREE=y | 238 | CONFIG_PROC_DEVICETREE=y |
229 | # CONFIG_CMDLINE_BOOL is not set | 239 | # CONFIG_CMDLINE_BOOL is not set |
240 | CONFIG_EXTRA_TARGETS="" | ||
230 | CONFIG_PM=y | 241 | CONFIG_PM=y |
231 | # CONFIG_PM_LEGACY is not set | ||
232 | # CONFIG_PM_DEBUG is not set | 242 | # CONFIG_PM_DEBUG is not set |
233 | CONFIG_SECCOMP=y | 243 | CONFIG_SECCOMP=y |
234 | CONFIG_ISA_DMA_API=y | 244 | CONFIG_ISA_DMA_API=y |
@@ -238,7 +248,7 @@ CONFIG_ISA_DMA_API=y | |||
238 | # | 248 | # |
239 | CONFIG_ZONE_DMA=y | 249 | CONFIG_ZONE_DMA=y |
240 | CONFIG_GENERIC_ISA_DMA=y | 250 | CONFIG_GENERIC_ISA_DMA=y |
241 | CONFIG_FSL_SOC=y | 251 | CONFIG_PPC_PCI_CHOICE=y |
242 | # CONFIG_PCI is not set | 252 | # CONFIG_PCI is not set |
243 | # CONFIG_PCI_DOMAINS is not set | 253 | # CONFIG_PCI_DOMAINS is not set |
244 | # CONFIG_PCI_SYSCALL is not set | 254 | # CONFIG_PCI_SYSCALL is not set |
@@ -259,10 +269,6 @@ CONFIG_PAGE_OFFSET=0xc0000000 | |||
259 | CONFIG_KERNEL_START=0xc0000000 | 269 | CONFIG_KERNEL_START=0xc0000000 |
260 | CONFIG_PHYSICAL_START=0x00000000 | 270 | CONFIG_PHYSICAL_START=0x00000000 |
261 | CONFIG_TASK_SIZE=0xc0000000 | 271 | CONFIG_TASK_SIZE=0xc0000000 |
262 | |||
263 | # | ||
264 | # Networking | ||
265 | # | ||
266 | CONFIG_NET=y | 272 | CONFIG_NET=y |
267 | 273 | ||
268 | # | 274 | # |
@@ -313,6 +319,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic" | |||
313 | # CONFIG_TIPC is not set | 319 | # CONFIG_TIPC is not set |
314 | # CONFIG_ATM is not set | 320 | # CONFIG_ATM is not set |
315 | # CONFIG_BRIDGE is not set | 321 | # CONFIG_BRIDGE is not set |
322 | # CONFIG_NET_DSA is not set | ||
316 | # CONFIG_VLAN_8021Q is not set | 323 | # CONFIG_VLAN_8021Q is not set |
317 | # CONFIG_DECNET is not set | 324 | # CONFIG_DECNET is not set |
318 | # CONFIG_LLC2 is not set | 325 | # CONFIG_LLC2 is not set |
@@ -333,14 +340,8 @@ CONFIG_DEFAULT_TCP_CONG="cubic" | |||
333 | # CONFIG_IRDA is not set | 340 | # CONFIG_IRDA is not set |
334 | # CONFIG_BT is not set | 341 | # CONFIG_BT is not set |
335 | # CONFIG_AF_RXRPC is not set | 342 | # CONFIG_AF_RXRPC is not set |
336 | 343 | # CONFIG_PHONET is not set | |
337 | # | 344 | # CONFIG_WIRELESS is not set |
338 | # Wireless | ||
339 | # | ||
340 | # CONFIG_CFG80211 is not set | ||
341 | # CONFIG_WIRELESS_EXT is not set | ||
342 | # CONFIG_MAC80211 is not set | ||
343 | # CONFIG_IEEE80211 is not set | ||
344 | # CONFIG_RFKILL is not set | 345 | # CONFIG_RFKILL is not set |
345 | # CONFIG_NET_9P is not set | 346 | # CONFIG_NET_9P is not set |
346 | 347 | ||
@@ -451,6 +452,7 @@ CONFIG_BLK_DEV_RAM_SIZE=32768 | |||
451 | # CONFIG_BLK_DEV_XIP is not set | 452 | # CONFIG_BLK_DEV_XIP is not set |
452 | # CONFIG_CDROM_PKTCDVD is not set | 453 | # CONFIG_CDROM_PKTCDVD is not set |
453 | # CONFIG_ATA_OVER_ETH is not set | 454 | # CONFIG_ATA_OVER_ETH is not set |
455 | # CONFIG_BLK_DEV_HD is not set | ||
454 | # CONFIG_MISC_DEVICES is not set | 456 | # CONFIG_MISC_DEVICES is not set |
455 | CONFIG_HAVE_IDE=y | 457 | CONFIG_HAVE_IDE=y |
456 | # CONFIG_IDE is not set | 458 | # CONFIG_IDE is not set |
@@ -495,10 +497,10 @@ CONFIG_SCSI_WAIT_SCAN=m | |||
495 | CONFIG_SCSI_LOWLEVEL=y | 497 | CONFIG_SCSI_LOWLEVEL=y |
496 | # CONFIG_ISCSI_TCP is not set | 498 | # CONFIG_ISCSI_TCP is not set |
497 | # CONFIG_SCSI_DEBUG is not set | 499 | # CONFIG_SCSI_DEBUG is not set |
500 | # CONFIG_SCSI_DH is not set | ||
498 | CONFIG_ATA=y | 501 | CONFIG_ATA=y |
499 | # CONFIG_ATA_NONSTANDARD is not set | 502 | # CONFIG_ATA_NONSTANDARD is not set |
500 | CONFIG_SATA_PMP=y | 503 | CONFIG_SATA_PMP=y |
501 | # CONFIG_SATA_FSL is not set | ||
502 | CONFIG_ATA_SFF=y | 504 | CONFIG_ATA_SFF=y |
503 | # CONFIG_SATA_MV is not set | 505 | # CONFIG_SATA_MV is not set |
504 | CONFIG_PATA_MPC52xx=y | 506 | CONFIG_PATA_MPC52xx=y |
@@ -507,7 +509,6 @@ CONFIG_PATA_PLATFORM=y | |||
507 | # CONFIG_MD is not set | 509 | # CONFIG_MD is not set |
508 | # CONFIG_MACINTOSH_DRIVERS is not set | 510 | # CONFIG_MACINTOSH_DRIVERS is not set |
509 | CONFIG_NETDEVICES=y | 511 | CONFIG_NETDEVICES=y |
510 | # CONFIG_NETDEVICES_MULTIQUEUE is not set | ||
511 | # CONFIG_DUMMY is not set | 512 | # CONFIG_DUMMY is not set |
512 | # CONFIG_BONDING is not set | 513 | # CONFIG_BONDING is not set |
513 | # CONFIG_MACVLAN is not set | 514 | # CONFIG_MACVLAN is not set |
@@ -537,6 +538,9 @@ CONFIG_NET_ETHERNET=y | |||
537 | # CONFIG_IBM_NEW_EMAC_RGMII is not set | 538 | # CONFIG_IBM_NEW_EMAC_RGMII is not set |
538 | # CONFIG_IBM_NEW_EMAC_TAH is not set | 539 | # CONFIG_IBM_NEW_EMAC_TAH is not set |
539 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set | 540 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set |
541 | # CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set | ||
542 | # CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set | ||
543 | # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set | ||
540 | # CONFIG_B44 is not set | 544 | # CONFIG_B44 is not set |
541 | CONFIG_FEC_MPC52xx=y | 545 | CONFIG_FEC_MPC52xx=y |
542 | CONFIG_FEC_MPC52xx_MDIO=y | 546 | CONFIG_FEC_MPC52xx_MDIO=y |
@@ -548,7 +552,6 @@ CONFIG_FEC_MPC52xx_MDIO=y | |||
548 | # | 552 | # |
549 | # CONFIG_WLAN_PRE80211 is not set | 553 | # CONFIG_WLAN_PRE80211 is not set |
550 | # CONFIG_WLAN_80211 is not set | 554 | # CONFIG_WLAN_80211 is not set |
551 | # CONFIG_IWLWIFI is not set | ||
552 | # CONFIG_IWLWIFI_LEDS is not set | 555 | # CONFIG_IWLWIFI_LEDS is not set |
553 | 556 | ||
554 | # | 557 | # |
@@ -583,6 +586,7 @@ CONFIG_FEC_MPC52xx_MDIO=y | |||
583 | # Character devices | 586 | # Character devices |
584 | # | 587 | # |
585 | # CONFIG_VT is not set | 588 | # CONFIG_VT is not set |
589 | CONFIG_DEVKMEM=y | ||
586 | # CONFIG_SERIAL_NONSTANDARD is not set | 590 | # CONFIG_SERIAL_NONSTANDARD is not set |
587 | 591 | ||
588 | # | 592 | # |
@@ -611,26 +615,41 @@ CONFIG_LEGACY_PTY_COUNT=256 | |||
611 | CONFIG_I2C=y | 615 | CONFIG_I2C=y |
612 | CONFIG_I2C_BOARDINFO=y | 616 | CONFIG_I2C_BOARDINFO=y |
613 | CONFIG_I2C_CHARDEV=y | 617 | CONFIG_I2C_CHARDEV=y |
618 | CONFIG_I2C_HELPER_AUTO=y | ||
614 | 619 | ||
615 | # | 620 | # |
616 | # I2C Hardware Bus support | 621 | # I2C Hardware Bus support |
617 | # | 622 | # |
623 | |||
624 | # | ||
625 | # I2C system bus drivers (mostly embedded / system-on-chip) | ||
626 | # | ||
618 | CONFIG_I2C_MPC=y | 627 | CONFIG_I2C_MPC=y |
619 | # CONFIG_I2C_OCORES is not set | 628 | # CONFIG_I2C_OCORES is not set |
620 | # CONFIG_I2C_PARPORT_LIGHT is not set | ||
621 | # CONFIG_I2C_SIMTEC is not set | 629 | # CONFIG_I2C_SIMTEC is not set |
630 | |||
631 | # | ||
632 | # External I2C/SMBus adapter drivers | ||
633 | # | ||
634 | # CONFIG_I2C_PARPORT_LIGHT is not set | ||
622 | # CONFIG_I2C_TAOS_EVM is not set | 635 | # CONFIG_I2C_TAOS_EVM is not set |
623 | # CONFIG_I2C_STUB is not set | ||
624 | # CONFIG_I2C_TINY_USB is not set | 636 | # CONFIG_I2C_TINY_USB is not set |
637 | |||
638 | # | ||
639 | # Other I2C/SMBus bus drivers | ||
640 | # | ||
625 | # CONFIG_I2C_PCA_PLATFORM is not set | 641 | # CONFIG_I2C_PCA_PLATFORM is not set |
642 | # CONFIG_I2C_STUB is not set | ||
626 | 643 | ||
627 | # | 644 | # |
628 | # Miscellaneous I2C Chip support | 645 | # Miscellaneous I2C Chip support |
629 | # | 646 | # |
630 | # CONFIG_DS1682 is not set | 647 | # CONFIG_DS1682 is not set |
648 | # CONFIG_AT24 is not set | ||
631 | # CONFIG_SENSORS_EEPROM is not set | 649 | # CONFIG_SENSORS_EEPROM is not set |
632 | # CONFIG_SENSORS_PCF8574 is not set | 650 | # CONFIG_SENSORS_PCF8574 is not set |
633 | # CONFIG_PCF8575 is not set | 651 | # CONFIG_PCF8575 is not set |
652 | # CONFIG_SENSORS_PCA9539 is not set | ||
634 | # CONFIG_SENSORS_PCF8591 is not set | 653 | # CONFIG_SENSORS_PCF8591 is not set |
635 | # CONFIG_SENSORS_MAX6875 is not set | 654 | # CONFIG_SENSORS_MAX6875 is not set |
636 | # CONFIG_SENSORS_TSL2550 is not set | 655 | # CONFIG_SENSORS_TSL2550 is not set |
@@ -639,10 +658,13 @@ CONFIG_I2C_MPC=y | |||
639 | # CONFIG_I2C_DEBUG_BUS is not set | 658 | # CONFIG_I2C_DEBUG_BUS is not set |
640 | # CONFIG_I2C_DEBUG_CHIP is not set | 659 | # CONFIG_I2C_DEBUG_CHIP is not set |
641 | # CONFIG_SPI is not set | 660 | # CONFIG_SPI is not set |
661 | CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y | ||
662 | # CONFIG_GPIOLIB is not set | ||
642 | # CONFIG_W1 is not set | 663 | # CONFIG_W1 is not set |
643 | # CONFIG_POWER_SUPPLY is not set | 664 | # CONFIG_POWER_SUPPLY is not set |
644 | CONFIG_HWMON=y | 665 | CONFIG_HWMON=y |
645 | # CONFIG_HWMON_VID is not set | 666 | # CONFIG_HWMON_VID is not set |
667 | # CONFIG_SENSORS_AD7414 is not set | ||
646 | # CONFIG_SENSORS_AD7418 is not set | 668 | # CONFIG_SENSORS_AD7418 is not set |
647 | # CONFIG_SENSORS_ADM1021 is not set | 669 | # CONFIG_SENSORS_ADM1021 is not set |
648 | # CONFIG_SENSORS_ADM1025 is not set | 670 | # CONFIG_SENSORS_ADM1025 is not set |
@@ -650,6 +672,7 @@ CONFIG_HWMON=y | |||
650 | # CONFIG_SENSORS_ADM1029 is not set | 672 | # CONFIG_SENSORS_ADM1029 is not set |
651 | # CONFIG_SENSORS_ADM1031 is not set | 673 | # CONFIG_SENSORS_ADM1031 is not set |
652 | # CONFIG_SENSORS_ADM9240 is not set | 674 | # CONFIG_SENSORS_ADM9240 is not set |
675 | # CONFIG_SENSORS_ADT7462 is not set | ||
653 | # CONFIG_SENSORS_ADT7470 is not set | 676 | # CONFIG_SENSORS_ADT7470 is not set |
654 | # CONFIG_SENSORS_ADT7473 is not set | 677 | # CONFIG_SENSORS_ADT7473 is not set |
655 | # CONFIG_SENSORS_ATXP1 is not set | 678 | # CONFIG_SENSORS_ATXP1 is not set |
@@ -692,6 +715,7 @@ CONFIG_HWMON=y | |||
692 | # CONFIG_SENSORS_W83627EHF is not set | 715 | # CONFIG_SENSORS_W83627EHF is not set |
693 | # CONFIG_HWMON_DEBUG_CHIP is not set | 716 | # CONFIG_HWMON_DEBUG_CHIP is not set |
694 | # CONFIG_THERMAL is not set | 717 | # CONFIG_THERMAL is not set |
718 | # CONFIG_THERMAL_HWMON is not set | ||
695 | CONFIG_WATCHDOG=y | 719 | CONFIG_WATCHDOG=y |
696 | # CONFIG_WATCHDOG_NOWAYOUT is not set | 720 | # CONFIG_WATCHDOG_NOWAYOUT is not set |
697 | 721 | ||
@@ -705,24 +729,39 @@ CONFIG_WATCHDOG=y | |||
705 | # USB-based Watchdog Cards | 729 | # USB-based Watchdog Cards |
706 | # | 730 | # |
707 | # CONFIG_USBPCWATCHDOG is not set | 731 | # CONFIG_USBPCWATCHDOG is not set |
732 | CONFIG_SSB_POSSIBLE=y | ||
708 | 733 | ||
709 | # | 734 | # |
710 | # Sonics Silicon Backplane | 735 | # Sonics Silicon Backplane |
711 | # | 736 | # |
712 | CONFIG_SSB_POSSIBLE=y | ||
713 | # CONFIG_SSB is not set | 737 | # CONFIG_SSB is not set |
714 | 738 | ||
715 | # | 739 | # |
716 | # Multifunction device drivers | 740 | # Multifunction device drivers |
717 | # | 741 | # |
742 | # CONFIG_MFD_CORE is not set | ||
718 | # CONFIG_MFD_SM501 is not set | 743 | # CONFIG_MFD_SM501 is not set |
719 | # CONFIG_HTC_PASIC3 is not set | 744 | # CONFIG_HTC_PASIC3 is not set |
745 | # CONFIG_MFD_TMIO is not set | ||
746 | # CONFIG_PMIC_DA903X is not set | ||
747 | # CONFIG_MFD_WM8400 is not set | ||
748 | # CONFIG_MFD_WM8350_I2C is not set | ||
749 | # CONFIG_REGULATOR is not set | ||
720 | 750 | ||
721 | # | 751 | # |
722 | # Multimedia devices | 752 | # Multimedia devices |
723 | # | 753 | # |
754 | |||
755 | # | ||
756 | # Multimedia core support | ||
757 | # | ||
724 | # CONFIG_VIDEO_DEV is not set | 758 | # CONFIG_VIDEO_DEV is not set |
725 | # CONFIG_DVB_CORE is not set | 759 | # CONFIG_DVB_CORE is not set |
760 | # CONFIG_VIDEO_MEDIA is not set | ||
761 | |||
762 | # | ||
763 | # Multimedia drivers | ||
764 | # | ||
726 | # CONFIG_DAB is not set | 765 | # CONFIG_DAB is not set |
727 | 766 | ||
728 | # | 767 | # |
@@ -737,10 +776,6 @@ CONFIG_SSB_POSSIBLE=y | |||
737 | # Display device support | 776 | # Display device support |
738 | # | 777 | # |
739 | # CONFIG_DISPLAY_SUPPORT is not set | 778 | # CONFIG_DISPLAY_SUPPORT is not set |
740 | |||
741 | # | ||
742 | # Sound | ||
743 | # | ||
744 | # CONFIG_SOUND is not set | 779 | # CONFIG_SOUND is not set |
745 | CONFIG_USB_SUPPORT=y | 780 | CONFIG_USB_SUPPORT=y |
746 | CONFIG_USB_ARCH_HAS_HCD=y | 781 | CONFIG_USB_ARCH_HAS_HCD=y |
@@ -760,11 +795,16 @@ CONFIG_USB_DEVICEFS=y | |||
760 | # CONFIG_USB_OTG is not set | 795 | # CONFIG_USB_OTG is not set |
761 | # CONFIG_USB_OTG_WHITELIST is not set | 796 | # CONFIG_USB_OTG_WHITELIST is not set |
762 | # CONFIG_USB_OTG_BLACKLIST_HUB is not set | 797 | # CONFIG_USB_OTG_BLACKLIST_HUB is not set |
798 | CONFIG_USB_MON=y | ||
799 | # CONFIG_USB_WUSB is not set | ||
800 | # CONFIG_USB_WUSB_CBAF is not set | ||
763 | 801 | ||
764 | # | 802 | # |
765 | # USB Host Controller Drivers | 803 | # USB Host Controller Drivers |
766 | # | 804 | # |
805 | # CONFIG_USB_C67X00_HCD is not set | ||
767 | # CONFIG_USB_ISP116X_HCD is not set | 806 | # CONFIG_USB_ISP116X_HCD is not set |
807 | # CONFIG_USB_ISP1760_HCD is not set | ||
768 | CONFIG_USB_OHCI_HCD=y | 808 | CONFIG_USB_OHCI_HCD=y |
769 | CONFIG_USB_OHCI_HCD_PPC_SOC=y | 809 | CONFIG_USB_OHCI_HCD_PPC_SOC=y |
770 | CONFIG_USB_OHCI_HCD_PPC_OF=y | 810 | CONFIG_USB_OHCI_HCD_PPC_OF=y |
@@ -775,12 +815,16 @@ CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y | |||
775 | # CONFIG_USB_OHCI_LITTLE_ENDIAN is not set | 815 | # CONFIG_USB_OHCI_LITTLE_ENDIAN is not set |
776 | # CONFIG_USB_SL811_HCD is not set | 816 | # CONFIG_USB_SL811_HCD is not set |
777 | # CONFIG_USB_R8A66597_HCD is not set | 817 | # CONFIG_USB_R8A66597_HCD is not set |
818 | # CONFIG_USB_HWA_HCD is not set | ||
819 | # CONFIG_USB_MUSB_HDRC is not set | ||
778 | 820 | ||
779 | # | 821 | # |
780 | # USB Device Class drivers | 822 | # USB Device Class drivers |
781 | # | 823 | # |
782 | # CONFIG_USB_ACM is not set | 824 | # CONFIG_USB_ACM is not set |
783 | # CONFIG_USB_PRINTER is not set | 825 | # CONFIG_USB_PRINTER is not set |
826 | # CONFIG_USB_WDM is not set | ||
827 | # CONFIG_USB_TMC is not set | ||
784 | 828 | ||
785 | # | 829 | # |
786 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | 830 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' |
@@ -809,7 +853,6 @@ CONFIG_USB_STORAGE=y | |||
809 | # | 853 | # |
810 | # CONFIG_USB_MDC800 is not set | 854 | # CONFIG_USB_MDC800 is not set |
811 | # CONFIG_USB_MICROTEK is not set | 855 | # CONFIG_USB_MICROTEK is not set |
812 | CONFIG_USB_MON=y | ||
813 | 856 | ||
814 | # | 857 | # |
815 | # USB port drivers | 858 | # USB port drivers |
@@ -822,7 +865,7 @@ CONFIG_USB_MON=y | |||
822 | # CONFIG_USB_EMI62 is not set | 865 | # CONFIG_USB_EMI62 is not set |
823 | # CONFIG_USB_EMI26 is not set | 866 | # CONFIG_USB_EMI26 is not set |
824 | # CONFIG_USB_ADUTUX is not set | 867 | # CONFIG_USB_ADUTUX is not set |
825 | # CONFIG_USB_AUERSWALD is not set | 868 | # CONFIG_USB_SEVSEG is not set |
826 | # CONFIG_USB_RIO500 is not set | 869 | # CONFIG_USB_RIO500 is not set |
827 | # CONFIG_USB_LEGOTOWER is not set | 870 | # CONFIG_USB_LEGOTOWER is not set |
828 | # CONFIG_USB_LCD is not set | 871 | # CONFIG_USB_LCD is not set |
@@ -838,10 +881,13 @@ CONFIG_USB_MON=y | |||
838 | # CONFIG_USB_TRANCEVIBRATOR is not set | 881 | # CONFIG_USB_TRANCEVIBRATOR is not set |
839 | # CONFIG_USB_IOWARRIOR is not set | 882 | # CONFIG_USB_IOWARRIOR is not set |
840 | # CONFIG_USB_TEST is not set | 883 | # CONFIG_USB_TEST is not set |
884 | # CONFIG_USB_ISIGHTFW is not set | ||
885 | # CONFIG_USB_VST is not set | ||
841 | # CONFIG_USB_GADGET is not set | 886 | # CONFIG_USB_GADGET is not set |
842 | # CONFIG_MMC is not set | 887 | # CONFIG_MMC is not set |
843 | # CONFIG_MEMSTICK is not set | 888 | # CONFIG_MEMSTICK is not set |
844 | # CONFIG_NEW_LEDS is not set | 889 | # CONFIG_NEW_LEDS is not set |
890 | # CONFIG_ACCESSIBILITY is not set | ||
845 | # CONFIG_EDAC is not set | 891 | # CONFIG_EDAC is not set |
846 | CONFIG_RTC_LIB=y | 892 | CONFIG_RTC_LIB=y |
847 | CONFIG_RTC_CLASS=y | 893 | CONFIG_RTC_CLASS=y |
@@ -872,6 +918,8 @@ CONFIG_RTC_DRV_DS1307=y | |||
872 | # CONFIG_RTC_DRV_PCF8583 is not set | 918 | # CONFIG_RTC_DRV_PCF8583 is not set |
873 | # CONFIG_RTC_DRV_M41T80 is not set | 919 | # CONFIG_RTC_DRV_M41T80 is not set |
874 | # CONFIG_RTC_DRV_S35390A is not set | 920 | # CONFIG_RTC_DRV_S35390A is not set |
921 | # CONFIG_RTC_DRV_FM3130 is not set | ||
922 | # CONFIG_RTC_DRV_RX8581 is not set | ||
875 | 923 | ||
876 | # | 924 | # |
877 | # SPI RTC drivers | 925 | # SPI RTC drivers |
@@ -881,19 +929,25 @@ CONFIG_RTC_DRV_DS1307=y | |||
881 | # Platform RTC drivers | 929 | # Platform RTC drivers |
882 | # | 930 | # |
883 | # CONFIG_RTC_DRV_CMOS is not set | 931 | # CONFIG_RTC_DRV_CMOS is not set |
932 | # CONFIG_RTC_DRV_DS1286 is not set | ||
884 | # CONFIG_RTC_DRV_DS1511 is not set | 933 | # CONFIG_RTC_DRV_DS1511 is not set |
885 | # CONFIG_RTC_DRV_DS1553 is not set | 934 | # CONFIG_RTC_DRV_DS1553 is not set |
886 | # CONFIG_RTC_DRV_DS1742 is not set | 935 | # CONFIG_RTC_DRV_DS1742 is not set |
887 | # CONFIG_RTC_DRV_STK17TA8 is not set | 936 | # CONFIG_RTC_DRV_STK17TA8 is not set |
888 | # CONFIG_RTC_DRV_M48T86 is not set | 937 | # CONFIG_RTC_DRV_M48T86 is not set |
938 | # CONFIG_RTC_DRV_M48T35 is not set | ||
889 | # CONFIG_RTC_DRV_M48T59 is not set | 939 | # CONFIG_RTC_DRV_M48T59 is not set |
940 | # CONFIG_RTC_DRV_BQ4802 is not set | ||
890 | # CONFIG_RTC_DRV_V3020 is not set | 941 | # CONFIG_RTC_DRV_V3020 is not set |
891 | 942 | ||
892 | # | 943 | # |
893 | # on-CPU RTC drivers | 944 | # on-CPU RTC drivers |
894 | # | 945 | # |
946 | # CONFIG_RTC_DRV_PPC is not set | ||
895 | # CONFIG_DMADEVICES is not set | 947 | # CONFIG_DMADEVICES is not set |
896 | # CONFIG_UIO is not set | 948 | # CONFIG_UIO is not set |
949 | # CONFIG_STAGING is not set | ||
950 | CONFIG_STAGING_EXCLUDE_BUILD=y | ||
897 | 951 | ||
898 | # | 952 | # |
899 | # File systems | 953 | # File systems |
@@ -905,12 +959,13 @@ CONFIG_EXT3_FS=y | |||
905 | CONFIG_EXT3_FS_XATTR=y | 959 | CONFIG_EXT3_FS_XATTR=y |
906 | # CONFIG_EXT3_FS_POSIX_ACL is not set | 960 | # CONFIG_EXT3_FS_POSIX_ACL is not set |
907 | # CONFIG_EXT3_FS_SECURITY is not set | 961 | # CONFIG_EXT3_FS_SECURITY is not set |
908 | # CONFIG_EXT4DEV_FS is not set | 962 | # CONFIG_EXT4_FS is not set |
909 | CONFIG_JBD=y | 963 | CONFIG_JBD=y |
910 | CONFIG_FS_MBCACHE=y | 964 | CONFIG_FS_MBCACHE=y |
911 | # CONFIG_REISERFS_FS is not set | 965 | # CONFIG_REISERFS_FS is not set |
912 | # CONFIG_JFS_FS is not set | 966 | # CONFIG_JFS_FS is not set |
913 | # CONFIG_FS_POSIX_ACL is not set | 967 | # CONFIG_FS_POSIX_ACL is not set |
968 | CONFIG_FILE_LOCKING=y | ||
914 | # CONFIG_XFS_FS is not set | 969 | # CONFIG_XFS_FS is not set |
915 | # CONFIG_OCFS2_FS is not set | 970 | # CONFIG_OCFS2_FS is not set |
916 | CONFIG_DNOTIFY=y | 971 | CONFIG_DNOTIFY=y |
@@ -943,6 +998,7 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | |||
943 | CONFIG_PROC_FS=y | 998 | CONFIG_PROC_FS=y |
944 | CONFIG_PROC_KCORE=y | 999 | CONFIG_PROC_KCORE=y |
945 | CONFIG_PROC_SYSCTL=y | 1000 | CONFIG_PROC_SYSCTL=y |
1001 | CONFIG_PROC_PAGE_MONITOR=y | ||
946 | CONFIG_SYSFS=y | 1002 | CONFIG_SYSFS=y |
947 | CONFIG_TMPFS=y | 1003 | CONFIG_TMPFS=y |
948 | # CONFIG_TMPFS_POSIX_ACL is not set | 1004 | # CONFIG_TMPFS_POSIX_ACL is not set |
@@ -973,6 +1029,7 @@ CONFIG_JFFS2_RTIME=y | |||
973 | CONFIG_CRAMFS=y | 1029 | CONFIG_CRAMFS=y |
974 | # CONFIG_VXFS_FS is not set | 1030 | # CONFIG_VXFS_FS is not set |
975 | # CONFIG_MINIX_FS is not set | 1031 | # CONFIG_MINIX_FS is not set |
1032 | # CONFIG_OMFS_FS is not set | ||
976 | # CONFIG_HPFS_FS is not set | 1033 | # CONFIG_HPFS_FS is not set |
977 | # CONFIG_QNX4FS_FS is not set | 1034 | # CONFIG_QNX4FS_FS is not set |
978 | # CONFIG_ROMFS_FS is not set | 1035 | # CONFIG_ROMFS_FS is not set |
@@ -983,14 +1040,14 @@ CONFIG_NFS_FS=y | |||
983 | CONFIG_NFS_V3=y | 1040 | CONFIG_NFS_V3=y |
984 | # CONFIG_NFS_V3_ACL is not set | 1041 | # CONFIG_NFS_V3_ACL is not set |
985 | CONFIG_NFS_V4=y | 1042 | CONFIG_NFS_V4=y |
986 | # CONFIG_NFSD is not set | ||
987 | CONFIG_ROOT_NFS=y | 1043 | CONFIG_ROOT_NFS=y |
1044 | # CONFIG_NFSD is not set | ||
988 | CONFIG_LOCKD=y | 1045 | CONFIG_LOCKD=y |
989 | CONFIG_LOCKD_V4=y | 1046 | CONFIG_LOCKD_V4=y |
990 | CONFIG_NFS_COMMON=y | 1047 | CONFIG_NFS_COMMON=y |
991 | CONFIG_SUNRPC=y | 1048 | CONFIG_SUNRPC=y |
992 | CONFIG_SUNRPC_GSS=y | 1049 | CONFIG_SUNRPC_GSS=y |
993 | # CONFIG_SUNRPC_BIND34 is not set | 1050 | # CONFIG_SUNRPC_REGISTER_V4 is not set |
994 | CONFIG_RPCSEC_GSS_KRB5=y | 1051 | CONFIG_RPCSEC_GSS_KRB5=y |
995 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | 1052 | # CONFIG_RPCSEC_GSS_SPKM3 is not set |
996 | # CONFIG_SMB_FS is not set | 1053 | # CONFIG_SMB_FS is not set |
@@ -1066,9 +1123,9 @@ CONFIG_NLS_ISO8859_1=y | |||
1066 | # Library routines | 1123 | # Library routines |
1067 | # | 1124 | # |
1068 | CONFIG_BITREVERSE=y | 1125 | CONFIG_BITREVERSE=y |
1069 | # CONFIG_GENERIC_FIND_FIRST_BIT is not set | ||
1070 | # CONFIG_CRC_CCITT is not set | 1126 | # CONFIG_CRC_CCITT is not set |
1071 | # CONFIG_CRC16 is not set | 1127 | # CONFIG_CRC16 is not set |
1128 | # CONFIG_CRC_T10DIF is not set | ||
1072 | # CONFIG_CRC_ITU_T is not set | 1129 | # CONFIG_CRC_ITU_T is not set |
1073 | CONFIG_CRC32=y | 1130 | CONFIG_CRC32=y |
1074 | # CONFIG_CRC7 is not set | 1131 | # CONFIG_CRC7 is not set |
@@ -1095,9 +1152,12 @@ CONFIG_FRAME_WARN=1024 | |||
1095 | CONFIG_DEBUG_KERNEL=y | 1152 | CONFIG_DEBUG_KERNEL=y |
1096 | # CONFIG_DEBUG_SHIRQ is not set | 1153 | # CONFIG_DEBUG_SHIRQ is not set |
1097 | CONFIG_DETECT_SOFTLOCKUP=y | 1154 | CONFIG_DETECT_SOFTLOCKUP=y |
1155 | # CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set | ||
1156 | CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 | ||
1098 | CONFIG_SCHED_DEBUG=y | 1157 | CONFIG_SCHED_DEBUG=y |
1099 | # CONFIG_SCHEDSTATS is not set | 1158 | # CONFIG_SCHEDSTATS is not set |
1100 | # CONFIG_TIMER_STATS is not set | 1159 | # CONFIG_TIMER_STATS is not set |
1160 | # CONFIG_DEBUG_OBJECTS is not set | ||
1101 | # CONFIG_SLUB_DEBUG_ON is not set | 1161 | # CONFIG_SLUB_DEBUG_ON is not set |
1102 | # CONFIG_SLUB_STATS is not set | 1162 | # CONFIG_SLUB_STATS is not set |
1103 | # CONFIG_DEBUG_RT_MUTEXES is not set | 1163 | # CONFIG_DEBUG_RT_MUTEXES is not set |
@@ -1111,17 +1171,37 @@ CONFIG_SCHED_DEBUG=y | |||
1111 | CONFIG_DEBUG_INFO=y | 1171 | CONFIG_DEBUG_INFO=y |
1112 | # CONFIG_DEBUG_VM is not set | 1172 | # CONFIG_DEBUG_VM is not set |
1113 | # CONFIG_DEBUG_WRITECOUNT is not set | 1173 | # CONFIG_DEBUG_WRITECOUNT is not set |
1174 | # CONFIG_DEBUG_MEMORY_INIT is not set | ||
1114 | # CONFIG_DEBUG_LIST is not set | 1175 | # CONFIG_DEBUG_LIST is not set |
1115 | # CONFIG_DEBUG_SG is not set | 1176 | # CONFIG_DEBUG_SG is not set |
1116 | # CONFIG_BOOT_PRINTK_DELAY is not set | 1177 | # CONFIG_BOOT_PRINTK_DELAY is not set |
1117 | # CONFIG_RCU_TORTURE_TEST is not set | 1178 | # CONFIG_RCU_TORTURE_TEST is not set |
1179 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | ||
1118 | # CONFIG_BACKTRACE_SELF_TEST is not set | 1180 | # CONFIG_BACKTRACE_SELF_TEST is not set |
1181 | # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set | ||
1119 | # CONFIG_FAULT_INJECTION is not set | 1182 | # CONFIG_FAULT_INJECTION is not set |
1183 | # CONFIG_LATENCYTOP is not set | ||
1184 | CONFIG_HAVE_FUNCTION_TRACER=y | ||
1185 | |||
1186 | # | ||
1187 | # Tracers | ||
1188 | # | ||
1189 | # CONFIG_FUNCTION_TRACER is not set | ||
1190 | # CONFIG_SCHED_TRACER is not set | ||
1191 | # CONFIG_CONTEXT_SWITCH_TRACER is not set | ||
1192 | # CONFIG_BOOT_TRACER is not set | ||
1193 | # CONFIG_STACK_TRACER is not set | ||
1194 | # CONFIG_DYNAMIC_PRINTK_DEBUG is not set | ||
1120 | # CONFIG_SAMPLES is not set | 1195 | # CONFIG_SAMPLES is not set |
1196 | CONFIG_HAVE_ARCH_KGDB=y | ||
1197 | # CONFIG_KGDB is not set | ||
1121 | # CONFIG_DEBUG_STACKOVERFLOW is not set | 1198 | # CONFIG_DEBUG_STACKOVERFLOW is not set |
1122 | # CONFIG_DEBUG_STACK_USAGE is not set | 1199 | # CONFIG_DEBUG_STACK_USAGE is not set |
1123 | # CONFIG_DEBUG_PAGEALLOC is not set | 1200 | # CONFIG_DEBUG_PAGEALLOC is not set |
1124 | # CONFIG_DEBUGGER is not set | 1201 | # CONFIG_CODE_PATCHING_SELFTEST is not set |
1202 | # CONFIG_FTR_FIXUP_SELFTEST is not set | ||
1203 | # CONFIG_MSI_BITMAP_SELFTEST is not set | ||
1204 | # CONFIG_XMON is not set | ||
1125 | # CONFIG_IRQSTACKS is not set | 1205 | # CONFIG_IRQSTACKS is not set |
1126 | # CONFIG_BDI_SWITCH is not set | 1206 | # CONFIG_BDI_SWITCH is not set |
1127 | # CONFIG_BOOTX_TEXT is not set | 1207 | # CONFIG_BOOTX_TEXT is not set |
@@ -1132,14 +1212,19 @@ CONFIG_DEBUG_INFO=y | |||
1132 | # | 1212 | # |
1133 | # CONFIG_KEYS is not set | 1213 | # CONFIG_KEYS is not set |
1134 | # CONFIG_SECURITY is not set | 1214 | # CONFIG_SECURITY is not set |
1215 | # CONFIG_SECURITYFS is not set | ||
1135 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | 1216 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set |
1136 | CONFIG_CRYPTO=y | 1217 | CONFIG_CRYPTO=y |
1137 | 1218 | ||
1138 | # | 1219 | # |
1139 | # Crypto core or helper | 1220 | # Crypto core or helper |
1140 | # | 1221 | # |
1222 | # CONFIG_CRYPTO_FIPS is not set | ||
1141 | CONFIG_CRYPTO_ALGAPI=y | 1223 | CONFIG_CRYPTO_ALGAPI=y |
1224 | CONFIG_CRYPTO_AEAD=y | ||
1142 | CONFIG_CRYPTO_BLKCIPHER=y | 1225 | CONFIG_CRYPTO_BLKCIPHER=y |
1226 | CONFIG_CRYPTO_HASH=y | ||
1227 | CONFIG_CRYPTO_RNG=y | ||
1143 | CONFIG_CRYPTO_MANAGER=y | 1228 | CONFIG_CRYPTO_MANAGER=y |
1144 | # CONFIG_CRYPTO_GF128MUL is not set | 1229 | # CONFIG_CRYPTO_GF128MUL is not set |
1145 | # CONFIG_CRYPTO_NULL is not set | 1230 | # CONFIG_CRYPTO_NULL is not set |
@@ -1178,6 +1263,10 @@ CONFIG_CRYPTO_PCBC=y | |||
1178 | # CONFIG_CRYPTO_MD4 is not set | 1263 | # CONFIG_CRYPTO_MD4 is not set |
1179 | CONFIG_CRYPTO_MD5=y | 1264 | CONFIG_CRYPTO_MD5=y |
1180 | # CONFIG_CRYPTO_MICHAEL_MIC is not set | 1265 | # CONFIG_CRYPTO_MICHAEL_MIC is not set |
1266 | # CONFIG_CRYPTO_RMD128 is not set | ||
1267 | # CONFIG_CRYPTO_RMD160 is not set | ||
1268 | # CONFIG_CRYPTO_RMD256 is not set | ||
1269 | # CONFIG_CRYPTO_RMD320 is not set | ||
1181 | # CONFIG_CRYPTO_SHA1 is not set | 1270 | # CONFIG_CRYPTO_SHA1 is not set |
1182 | # CONFIG_CRYPTO_SHA256 is not set | 1271 | # CONFIG_CRYPTO_SHA256 is not set |
1183 | # CONFIG_CRYPTO_SHA512 is not set | 1272 | # CONFIG_CRYPTO_SHA512 is not set |
@@ -1208,6 +1297,11 @@ CONFIG_CRYPTO_DES=y | |||
1208 | # | 1297 | # |
1209 | # CONFIG_CRYPTO_DEFLATE is not set | 1298 | # CONFIG_CRYPTO_DEFLATE is not set |
1210 | # CONFIG_CRYPTO_LZO is not set | 1299 | # CONFIG_CRYPTO_LZO is not set |
1300 | |||
1301 | # | ||
1302 | # Random Number Generation | ||
1303 | # | ||
1304 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | ||
1211 | CONFIG_CRYPTO_HW=y | 1305 | CONFIG_CRYPTO_HW=y |
1212 | CONFIG_PPC_CLOCK=y | 1306 | CONFIG_PPC_CLOCK=y |
1213 | CONFIG_PPC_LIB_RHEAP=y | 1307 | CONFIG_PPC_LIB_RHEAP=y |
diff --git a/arch/powerpc/configs/86xx/gef_sbc610_defconfig b/arch/powerpc/configs/86xx/gef_sbc610_defconfig index 2da13e00a807..07ccaf89f379 100644 --- a/arch/powerpc/configs/86xx/gef_sbc610_defconfig +++ b/arch/powerpc/configs/86xx/gef_sbc610_defconfig | |||
@@ -838,7 +838,7 @@ CONFIG_PHYLIB=y | |||
838 | # | 838 | # |
839 | # MII PHY device drivers | 839 | # MII PHY device drivers |
840 | # | 840 | # |
841 | CONFIG_MARVELL_PHY=y | 841 | # CONFIG_MARVELL_PHY is not set |
842 | # CONFIG_DAVICOM_PHY is not set | 842 | # CONFIG_DAVICOM_PHY is not set |
843 | # CONFIG_QSEMI_PHY is not set | 843 | # CONFIG_QSEMI_PHY is not set |
844 | # CONFIG_LXT_PHY is not set | 844 | # CONFIG_LXT_PHY is not set |
diff --git a/arch/powerpc/configs/mpc5200_defconfig b/arch/powerpc/configs/mpc5200_defconfig index 740c9f2b7de6..15c5604d0b26 100644 --- a/arch/powerpc/configs/mpc5200_defconfig +++ b/arch/powerpc/configs/mpc5200_defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.24-rc6 | 3 | # Linux kernel version: 2.6.28-rc4 |
4 | # Fri Jan 18 14:19:54 2008 | 4 | # Thu Nov 13 02:09:07 2008 |
5 | # | 5 | # |
6 | # CONFIG_PPC64 is not set | 6 | # CONFIG_PPC64 is not set |
7 | 7 | ||
@@ -22,14 +22,18 @@ CONFIG_PPC_STD_MMU_32=y | |||
22 | # CONFIG_SMP is not set | 22 | # CONFIG_SMP is not set |
23 | CONFIG_PPC32=y | 23 | CONFIG_PPC32=y |
24 | CONFIG_WORD_SIZE=32 | 24 | CONFIG_WORD_SIZE=32 |
25 | CONFIG_PPC_MERGE=y | 25 | # CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set |
26 | CONFIG_MMU=y | 26 | CONFIG_MMU=y |
27 | CONFIG_GENERIC_CMOS_UPDATE=y | 27 | CONFIG_GENERIC_CMOS_UPDATE=y |
28 | CONFIG_GENERIC_TIME=y | 28 | CONFIG_GENERIC_TIME=y |
29 | CONFIG_GENERIC_TIME_VSYSCALL=y | 29 | CONFIG_GENERIC_TIME_VSYSCALL=y |
30 | CONFIG_GENERIC_CLOCKEVENTS=y | 30 | CONFIG_GENERIC_CLOCKEVENTS=y |
31 | CONFIG_GENERIC_HARDIRQS=y | 31 | CONFIG_GENERIC_HARDIRQS=y |
32 | # CONFIG_HAVE_SETUP_PER_CPU_AREA is not set | ||
32 | CONFIG_IRQ_PER_CPU=y | 33 | CONFIG_IRQ_PER_CPU=y |
34 | CONFIG_STACKTRACE_SUPPORT=y | ||
35 | CONFIG_HAVE_LATENCYTOP_SUPPORT=y | ||
36 | CONFIG_LOCKDEP_SUPPORT=y | ||
33 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y | 37 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y |
34 | CONFIG_ARCH_HAS_ILOG2_U32=y | 38 | CONFIG_ARCH_HAS_ILOG2_U32=y |
35 | CONFIG_GENERIC_HWEIGHT=y | 39 | CONFIG_GENERIC_HWEIGHT=y |
@@ -47,7 +51,8 @@ CONFIG_OF=y | |||
47 | # CONFIG_GENERIC_TBSYNC is not set | 51 | # CONFIG_GENERIC_TBSYNC is not set |
48 | CONFIG_AUDIT_ARCH=y | 52 | CONFIG_AUDIT_ARCH=y |
49 | CONFIG_GENERIC_BUG=y | 53 | CONFIG_GENERIC_BUG=y |
50 | # CONFIG_DEFAULT_UIMAGE is not set | 54 | CONFIG_DEFAULT_UIMAGE=y |
55 | CONFIG_ARCH_SUSPEND_POSSIBLE=y | ||
51 | # CONFIG_PPC_DCR_NATIVE is not set | 56 | # CONFIG_PPC_DCR_NATIVE is not set |
52 | # CONFIG_PPC_DCR_MMIO is not set | 57 | # CONFIG_PPC_DCR_MMIO is not set |
53 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | 58 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" |
@@ -66,17 +71,15 @@ CONFIG_SYSVIPC_SYSCTL=y | |||
66 | # CONFIG_POSIX_MQUEUE is not set | 71 | # CONFIG_POSIX_MQUEUE is not set |
67 | # CONFIG_BSD_PROCESS_ACCT is not set | 72 | # CONFIG_BSD_PROCESS_ACCT is not set |
68 | # CONFIG_TASKSTATS is not set | 73 | # CONFIG_TASKSTATS is not set |
69 | # CONFIG_USER_NS is not set | ||
70 | # CONFIG_PID_NS is not set | ||
71 | # CONFIG_AUDIT is not set | 74 | # CONFIG_AUDIT is not set |
72 | # CONFIG_IKCONFIG is not set | 75 | # CONFIG_IKCONFIG is not set |
73 | CONFIG_LOG_BUF_SHIFT=14 | 76 | CONFIG_LOG_BUF_SHIFT=14 |
74 | # CONFIG_CGROUPS is not set | 77 | # CONFIG_CGROUPS is not set |
75 | CONFIG_FAIR_GROUP_SCHED=y | 78 | # CONFIG_GROUP_SCHED is not set |
76 | CONFIG_FAIR_USER_SCHED=y | ||
77 | # CONFIG_FAIR_CGROUP_SCHED is not set | ||
78 | CONFIG_SYSFS_DEPRECATED=y | 79 | CONFIG_SYSFS_DEPRECATED=y |
80 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
79 | # CONFIG_RELAY is not set | 81 | # CONFIG_RELAY is not set |
82 | # CONFIG_NAMESPACES is not set | ||
80 | CONFIG_BLK_DEV_INITRD=y | 83 | CONFIG_BLK_DEV_INITRD=y |
81 | CONFIG_INITRAMFS_SOURCE="" | 84 | CONFIG_INITRAMFS_SOURCE="" |
82 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | 85 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set |
@@ -88,32 +91,49 @@ CONFIG_HOTPLUG=y | |||
88 | CONFIG_PRINTK=y | 91 | CONFIG_PRINTK=y |
89 | CONFIG_BUG=y | 92 | CONFIG_BUG=y |
90 | CONFIG_ELF_CORE=y | 93 | CONFIG_ELF_CORE=y |
94 | CONFIG_COMPAT_BRK=y | ||
91 | CONFIG_BASE_FULL=y | 95 | CONFIG_BASE_FULL=y |
92 | CONFIG_FUTEX=y | 96 | CONFIG_FUTEX=y |
93 | CONFIG_ANON_INODES=y | 97 | CONFIG_ANON_INODES=y |
94 | # CONFIG_EPOLL is not set | 98 | # CONFIG_EPOLL is not set |
95 | CONFIG_SIGNALFD=y | 99 | CONFIG_SIGNALFD=y |
100 | CONFIG_TIMERFD=y | ||
96 | CONFIG_EVENTFD=y | 101 | CONFIG_EVENTFD=y |
97 | CONFIG_SHMEM=y | 102 | CONFIG_SHMEM=y |
103 | CONFIG_AIO=y | ||
98 | CONFIG_VM_EVENT_COUNTERS=y | 104 | CONFIG_VM_EVENT_COUNTERS=y |
105 | CONFIG_PCI_QUIRKS=y | ||
99 | CONFIG_SLUB_DEBUG=y | 106 | CONFIG_SLUB_DEBUG=y |
100 | # CONFIG_SLAB is not set | 107 | # CONFIG_SLAB is not set |
101 | CONFIG_SLUB=y | 108 | CONFIG_SLUB=y |
102 | # CONFIG_SLOB is not set | 109 | # CONFIG_SLOB is not set |
110 | # CONFIG_PROFILING is not set | ||
111 | # CONFIG_MARKERS is not set | ||
112 | CONFIG_HAVE_OPROFILE=y | ||
113 | CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y | ||
114 | CONFIG_HAVE_IOREMAP_PROT=y | ||
115 | CONFIG_HAVE_KPROBES=y | ||
116 | CONFIG_HAVE_KRETPROBES=y | ||
117 | CONFIG_HAVE_ARCH_TRACEHOOK=y | ||
118 | CONFIG_HAVE_CLK=y | ||
119 | # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set | ||
120 | CONFIG_SLABINFO=y | ||
103 | CONFIG_RT_MUTEXES=y | 121 | CONFIG_RT_MUTEXES=y |
104 | # CONFIG_TINY_SHMEM is not set | 122 | # CONFIG_TINY_SHMEM is not set |
105 | CONFIG_BASE_SMALL=0 | 123 | CONFIG_BASE_SMALL=0 |
106 | CONFIG_MODULES=y | 124 | CONFIG_MODULES=y |
125 | # CONFIG_MODULE_FORCE_LOAD is not set | ||
107 | CONFIG_MODULE_UNLOAD=y | 126 | CONFIG_MODULE_UNLOAD=y |
108 | # CONFIG_MODULE_FORCE_UNLOAD is not set | 127 | # CONFIG_MODULE_FORCE_UNLOAD is not set |
109 | # CONFIG_MODVERSIONS is not set | 128 | # CONFIG_MODVERSIONS is not set |
110 | # CONFIG_MODULE_SRCVERSION_ALL is not set | 129 | # CONFIG_MODULE_SRCVERSION_ALL is not set |
111 | # CONFIG_KMOD is not set | 130 | CONFIG_KMOD=y |
112 | CONFIG_BLOCK=y | 131 | CONFIG_BLOCK=y |
113 | # CONFIG_LBD is not set | 132 | # CONFIG_LBD is not set |
114 | # CONFIG_BLK_DEV_IO_TRACE is not set | 133 | # CONFIG_BLK_DEV_IO_TRACE is not set |
115 | # CONFIG_LSF is not set | 134 | # CONFIG_LSF is not set |
116 | # CONFIG_BLK_DEV_BSG is not set | 135 | # CONFIG_BLK_DEV_BSG is not set |
136 | # CONFIG_BLK_DEV_INTEGRITY is not set | ||
117 | 137 | ||
118 | # | 138 | # |
119 | # IO Schedulers | 139 | # IO Schedulers |
@@ -127,29 +147,34 @@ CONFIG_DEFAULT_AS=y | |||
127 | # CONFIG_DEFAULT_CFQ is not set | 147 | # CONFIG_DEFAULT_CFQ is not set |
128 | # CONFIG_DEFAULT_NOOP is not set | 148 | # CONFIG_DEFAULT_NOOP is not set |
129 | CONFIG_DEFAULT_IOSCHED="anticipatory" | 149 | CONFIG_DEFAULT_IOSCHED="anticipatory" |
150 | CONFIG_CLASSIC_RCU=y | ||
151 | CONFIG_FREEZER=y | ||
130 | 152 | ||
131 | # | 153 | # |
132 | # Platform support | 154 | # Platform support |
133 | # | 155 | # |
134 | CONFIG_PPC_MULTIPLATFORM=y | 156 | CONFIG_PPC_MULTIPLATFORM=y |
135 | # CONFIG_PPC_82xx is not set | ||
136 | # CONFIG_PPC_83xx is not set | ||
137 | # CONFIG_PPC_86xx is not set | ||
138 | CONFIG_CLASSIC32=y | 157 | CONFIG_CLASSIC32=y |
139 | # CONFIG_PPC_CHRP is not set | 158 | # CONFIG_PPC_CHRP is not set |
159 | # CONFIG_MPC5121_ADS is not set | ||
160 | # CONFIG_MPC5121_GENERIC is not set | ||
140 | CONFIG_PPC_MPC52xx=y | 161 | CONFIG_PPC_MPC52xx=y |
141 | CONFIG_PPC_MPC5200=y | ||
142 | CONFIG_PPC_MPC5200_BUGFIX=y | ||
143 | CONFIG_PPC_MPC5200_SIMPLE=y | 162 | CONFIG_PPC_MPC5200_SIMPLE=y |
144 | CONFIG_PPC_EFIKA=y | 163 | CONFIG_PPC_EFIKA=y |
145 | CONFIG_PPC_LITE5200=y | 164 | CONFIG_PPC_LITE5200=y |
165 | CONFIG_PPC_MPC5200_BUGFIX=y | ||
166 | # CONFIG_PPC_MPC5200_GPIO is not set | ||
146 | # CONFIG_PPC_PMAC is not set | 167 | # CONFIG_PPC_PMAC is not set |
147 | # CONFIG_PPC_CELL is not set | 168 | # CONFIG_PPC_CELL is not set |
148 | # CONFIG_PPC_CELL_NATIVE is not set | 169 | # CONFIG_PPC_CELL_NATIVE is not set |
170 | # CONFIG_PPC_82xx is not set | ||
149 | # CONFIG_PQ2ADS is not set | 171 | # CONFIG_PQ2ADS is not set |
172 | # CONFIG_PPC_83xx is not set | ||
173 | # CONFIG_PPC_86xx is not set | ||
150 | # CONFIG_EMBEDDED6xx is not set | 174 | # CONFIG_EMBEDDED6xx is not set |
151 | CONFIG_PPC_NATIVE=y | 175 | CONFIG_PPC_NATIVE=y |
152 | # CONFIG_UDBG_RTAS_CONSOLE is not set | 176 | # CONFIG_UDBG_RTAS_CONSOLE is not set |
177 | # CONFIG_IPIC is not set | ||
153 | # CONFIG_MPIC is not set | 178 | # CONFIG_MPIC is not set |
154 | # CONFIG_MPIC_WEIRD is not set | 179 | # CONFIG_MPIC_WEIRD is not set |
155 | # CONFIG_PPC_I8259 is not set | 180 | # CONFIG_PPC_I8259 is not set |
@@ -163,7 +188,6 @@ CONFIG_RTAS_PROC=y | |||
163 | # CONFIG_GENERIC_IOMAP is not set | 188 | # CONFIG_GENERIC_IOMAP is not set |
164 | # CONFIG_CPU_FREQ is not set | 189 | # CONFIG_CPU_FREQ is not set |
165 | # CONFIG_TAU is not set | 190 | # CONFIG_TAU is not set |
166 | # CONFIG_CPM2 is not set | ||
167 | # CONFIG_FSL_ULI1575 is not set | 191 | # CONFIG_FSL_ULI1575 is not set |
168 | CONFIG_PPC_BESTCOMM=y | 192 | CONFIG_PPC_BESTCOMM=y |
169 | CONFIG_PPC_BESTCOMM_ATA=y | 193 | CONFIG_PPC_BESTCOMM_ATA=y |
@@ -183,12 +207,18 @@ CONFIG_HZ_250=y | |||
183 | # CONFIG_HZ_300 is not set | 207 | # CONFIG_HZ_300 is not set |
184 | # CONFIG_HZ_1000 is not set | 208 | # CONFIG_HZ_1000 is not set |
185 | CONFIG_HZ=250 | 209 | CONFIG_HZ=250 |
210 | CONFIG_SCHED_HRTICK=y | ||
186 | CONFIG_PREEMPT_NONE=y | 211 | CONFIG_PREEMPT_NONE=y |
187 | # CONFIG_PREEMPT_VOLUNTARY is not set | 212 | # CONFIG_PREEMPT_VOLUNTARY is not set |
188 | # CONFIG_PREEMPT is not set | 213 | # CONFIG_PREEMPT is not set |
189 | CONFIG_BINFMT_ELF=y | 214 | CONFIG_BINFMT_ELF=y |
215 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set | ||
216 | # CONFIG_HAVE_AOUT is not set | ||
190 | # CONFIG_BINFMT_MISC is not set | 217 | # CONFIG_BINFMT_MISC is not set |
218 | # CONFIG_IOMMU_HELPER is not set | ||
191 | CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y | 219 | CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y |
220 | CONFIG_ARCH_HAS_WALK_MEMORY=y | ||
221 | CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y | ||
192 | # CONFIG_KEXEC is not set | 222 | # CONFIG_KEXEC is not set |
193 | CONFIG_ARCH_FLATMEM_ENABLE=y | 223 | CONFIG_ARCH_FLATMEM_ENABLE=y |
194 | CONFIG_ARCH_POPULATES_NODE_MAP=y | 224 | CONFIG_ARCH_POPULATES_NODE_MAP=y |
@@ -198,26 +228,25 @@ CONFIG_FLATMEM_MANUAL=y | |||
198 | # CONFIG_SPARSEMEM_MANUAL is not set | 228 | # CONFIG_SPARSEMEM_MANUAL is not set |
199 | CONFIG_FLATMEM=y | 229 | CONFIG_FLATMEM=y |
200 | CONFIG_FLAT_NODE_MEM_MAP=y | 230 | CONFIG_FLAT_NODE_MEM_MAP=y |
201 | # CONFIG_SPARSEMEM_STATIC is not set | 231 | CONFIG_PAGEFLAGS_EXTENDED=y |
202 | # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set | ||
203 | CONFIG_SPLIT_PTLOCK_CPUS=4 | 232 | CONFIG_SPLIT_PTLOCK_CPUS=4 |
233 | CONFIG_MIGRATION=y | ||
204 | # CONFIG_RESOURCES_64BIT is not set | 234 | # CONFIG_RESOURCES_64BIT is not set |
235 | # CONFIG_PHYS_ADDR_T_64BIT is not set | ||
205 | CONFIG_ZONE_DMA_FLAG=1 | 236 | CONFIG_ZONE_DMA_FLAG=1 |
206 | CONFIG_BOUNCE=y | 237 | CONFIG_BOUNCE=y |
207 | CONFIG_VIRT_TO_BUS=y | 238 | CONFIG_VIRT_TO_BUS=y |
239 | CONFIG_UNEVICTABLE_LRU=y | ||
240 | CONFIG_FORCE_MAX_ZONEORDER=11 | ||
208 | CONFIG_PROC_DEVICETREE=y | 241 | CONFIG_PROC_DEVICETREE=y |
209 | # CONFIG_CMDLINE_BOOL is not set | 242 | # CONFIG_CMDLINE_BOOL is not set |
243 | CONFIG_EXTRA_TARGETS="" | ||
210 | CONFIG_PM=y | 244 | CONFIG_PM=y |
211 | # CONFIG_PM_LEGACY is not set | ||
212 | # CONFIG_PM_DEBUG is not set | 245 | # CONFIG_PM_DEBUG is not set |
213 | CONFIG_PM_SLEEP=y | 246 | CONFIG_PM_SLEEP=y |
214 | CONFIG_SUSPEND_UP_POSSIBLE=y | ||
215 | CONFIG_SUSPEND=y | 247 | CONFIG_SUSPEND=y |
216 | CONFIG_HIBERNATION_UP_POSSIBLE=y | 248 | CONFIG_SUSPEND_FREEZER=y |
217 | # CONFIG_HIBERNATION is not set | ||
218 | CONFIG_SECCOMP=y | 249 | CONFIG_SECCOMP=y |
219 | CONFIG_WANT_DEVICE_TREE=y | ||
220 | CONFIG_DEVICE_TREE="" | ||
221 | CONFIG_ISA_DMA_API=y | 250 | CONFIG_ISA_DMA_API=y |
222 | 251 | ||
223 | # | 252 | # |
@@ -226,7 +255,7 @@ CONFIG_ISA_DMA_API=y | |||
226 | CONFIG_ZONE_DMA=y | 255 | CONFIG_ZONE_DMA=y |
227 | CONFIG_GENERIC_ISA_DMA=y | 256 | CONFIG_GENERIC_ISA_DMA=y |
228 | # CONFIG_PPC_INDIRECT_PCI is not set | 257 | # CONFIG_PPC_INDIRECT_PCI is not set |
229 | CONFIG_FSL_SOC=y | 258 | CONFIG_PPC_PCI_CHOICE=y |
230 | CONFIG_PCI=y | 259 | CONFIG_PCI=y |
231 | CONFIG_PCI_DOMAINS=y | 260 | CONFIG_PCI_DOMAINS=y |
232 | CONFIG_PCI_SYSCALL=y | 261 | CONFIG_PCI_SYSCALL=y |
@@ -237,6 +266,7 @@ CONFIG_PCI_LEGACY=y | |||
237 | # CONFIG_PCI_DEBUG is not set | 266 | # CONFIG_PCI_DEBUG is not set |
238 | # CONFIG_PCCARD is not set | 267 | # CONFIG_PCCARD is not set |
239 | # CONFIG_HOTPLUG_PCI is not set | 268 | # CONFIG_HOTPLUG_PCI is not set |
269 | # CONFIG_HAS_RAPIDIO is not set | ||
240 | 270 | ||
241 | # | 271 | # |
242 | # Advanced setup | 272 | # Advanced setup |
@@ -246,15 +276,11 @@ CONFIG_PCI_LEGACY=y | |||
246 | # | 276 | # |
247 | # Default settings for advanced configuration options are used | 277 | # Default settings for advanced configuration options are used |
248 | # | 278 | # |
249 | CONFIG_HIGHMEM_START=0xfe000000 | ||
250 | CONFIG_LOWMEM_SIZE=0x30000000 | 279 | CONFIG_LOWMEM_SIZE=0x30000000 |
280 | CONFIG_PAGE_OFFSET=0xc0000000 | ||
251 | CONFIG_KERNEL_START=0xc0000000 | 281 | CONFIG_KERNEL_START=0xc0000000 |
282 | CONFIG_PHYSICAL_START=0x00000000 | ||
252 | CONFIG_TASK_SIZE=0xc0000000 | 283 | CONFIG_TASK_SIZE=0xc0000000 |
253 | CONFIG_BOOT_LOAD=0x00800000 | ||
254 | |||
255 | # | ||
256 | # Networking | ||
257 | # | ||
258 | CONFIG_NET=y | 284 | CONFIG_NET=y |
259 | 285 | ||
260 | # | 286 | # |
@@ -267,6 +293,7 @@ CONFIG_XFRM=y | |||
267 | CONFIG_XFRM_USER=m | 293 | CONFIG_XFRM_USER=m |
268 | # CONFIG_XFRM_SUB_POLICY is not set | 294 | # CONFIG_XFRM_SUB_POLICY is not set |
269 | # CONFIG_XFRM_MIGRATE is not set | 295 | # CONFIG_XFRM_MIGRATE is not set |
296 | # CONFIG_XFRM_STATISTICS is not set | ||
270 | # CONFIG_NET_KEY is not set | 297 | # CONFIG_NET_KEY is not set |
271 | CONFIG_INET=y | 298 | CONFIG_INET=y |
272 | CONFIG_IP_MULTICAST=y | 299 | CONFIG_IP_MULTICAST=y |
@@ -297,8 +324,6 @@ CONFIG_TCP_CONG_CUBIC=y | |||
297 | CONFIG_DEFAULT_TCP_CONG="cubic" | 324 | CONFIG_DEFAULT_TCP_CONG="cubic" |
298 | # CONFIG_TCP_MD5SIG is not set | 325 | # CONFIG_TCP_MD5SIG is not set |
299 | # CONFIG_IPV6 is not set | 326 | # CONFIG_IPV6 is not set |
300 | # CONFIG_INET6_XFRM_TUNNEL is not set | ||
301 | # CONFIG_INET6_TUNNEL is not set | ||
302 | # CONFIG_NETWORK_SECMARK is not set | 327 | # CONFIG_NETWORK_SECMARK is not set |
303 | # CONFIG_NETFILTER is not set | 328 | # CONFIG_NETFILTER is not set |
304 | # CONFIG_IP_DCCP is not set | 329 | # CONFIG_IP_DCCP is not set |
@@ -306,6 +331,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic" | |||
306 | # CONFIG_TIPC is not set | 331 | # CONFIG_TIPC is not set |
307 | # CONFIG_ATM is not set | 332 | # CONFIG_ATM is not set |
308 | # CONFIG_BRIDGE is not set | 333 | # CONFIG_BRIDGE is not set |
334 | # CONFIG_NET_DSA is not set | ||
309 | # CONFIG_VLAN_8021Q is not set | 335 | # CONFIG_VLAN_8021Q is not set |
310 | # CONFIG_DECNET is not set | 336 | # CONFIG_DECNET is not set |
311 | # CONFIG_LLC2 is not set | 337 | # CONFIG_LLC2 is not set |
@@ -322,17 +348,12 @@ CONFIG_DEFAULT_TCP_CONG="cubic" | |||
322 | # | 348 | # |
323 | # CONFIG_NET_PKTGEN is not set | 349 | # CONFIG_NET_PKTGEN is not set |
324 | # CONFIG_HAMRADIO is not set | 350 | # CONFIG_HAMRADIO is not set |
351 | # CONFIG_CAN is not set | ||
325 | # CONFIG_IRDA is not set | 352 | # CONFIG_IRDA is not set |
326 | # CONFIG_BT is not set | 353 | # CONFIG_BT is not set |
327 | # CONFIG_AF_RXRPC is not set | 354 | # CONFIG_AF_RXRPC is not set |
328 | 355 | # CONFIG_PHONET is not set | |
329 | # | 356 | # CONFIG_WIRELESS is not set |
330 | # Wireless | ||
331 | # | ||
332 | # CONFIG_CFG80211 is not set | ||
333 | # CONFIG_WIRELESS_EXT is not set | ||
334 | # CONFIG_MAC80211 is not set | ||
335 | # CONFIG_IEEE80211 is not set | ||
336 | # CONFIG_RFKILL is not set | 357 | # CONFIG_RFKILL is not set |
337 | # CONFIG_NET_9P is not set | 358 | # CONFIG_NET_9P is not set |
338 | 359 | ||
@@ -357,6 +378,8 @@ CONFIG_MTD_CONCAT=y | |||
357 | CONFIG_MTD_PARTITIONS=y | 378 | CONFIG_MTD_PARTITIONS=y |
358 | # CONFIG_MTD_REDBOOT_PARTS is not set | 379 | # CONFIG_MTD_REDBOOT_PARTS is not set |
359 | CONFIG_MTD_CMDLINE_PARTS=y | 380 | CONFIG_MTD_CMDLINE_PARTS=y |
381 | # CONFIG_MTD_OF_PARTS is not set | ||
382 | # CONFIG_MTD_AR7_PARTS is not set | ||
360 | 383 | ||
361 | # | 384 | # |
362 | # User Modules And Translation Layers | 385 | # User Modules And Translation Layers |
@@ -428,6 +451,7 @@ CONFIG_MTD_PHYSMAP_OF=y | |||
428 | # | 451 | # |
429 | # CONFIG_MTD_UBI is not set | 452 | # CONFIG_MTD_UBI is not set |
430 | CONFIG_OF_DEVICE=y | 453 | CONFIG_OF_DEVICE=y |
454 | CONFIG_OF_I2C=y | ||
431 | # CONFIG_PARPORT is not set | 455 | # CONFIG_PARPORT is not set |
432 | CONFIG_BLK_DEV=y | 456 | CONFIG_BLK_DEV=y |
433 | # CONFIG_BLK_DEV_FD is not set | 457 | # CONFIG_BLK_DEV_FD is not set |
@@ -444,14 +468,20 @@ CONFIG_BLK_DEV_LOOP=y | |||
444 | CONFIG_BLK_DEV_RAM=y | 468 | CONFIG_BLK_DEV_RAM=y |
445 | CONFIG_BLK_DEV_RAM_COUNT=16 | 469 | CONFIG_BLK_DEV_RAM_COUNT=16 |
446 | CONFIG_BLK_DEV_RAM_SIZE=32768 | 470 | CONFIG_BLK_DEV_RAM_SIZE=32768 |
447 | CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 | 471 | # CONFIG_BLK_DEV_XIP is not set |
448 | # CONFIG_CDROM_PKTCDVD is not set | 472 | # CONFIG_CDROM_PKTCDVD is not set |
449 | # CONFIG_ATA_OVER_ETH is not set | 473 | # CONFIG_ATA_OVER_ETH is not set |
474 | # CONFIG_BLK_DEV_HD is not set | ||
450 | CONFIG_MISC_DEVICES=y | 475 | CONFIG_MISC_DEVICES=y |
451 | # CONFIG_PHANTOM is not set | 476 | # CONFIG_PHANTOM is not set |
452 | # CONFIG_EEPROM_93CX6 is not set | 477 | # CONFIG_EEPROM_93CX6 is not set |
453 | # CONFIG_SGI_IOC4 is not set | 478 | # CONFIG_SGI_IOC4 is not set |
454 | # CONFIG_TIFM_CORE is not set | 479 | # CONFIG_TIFM_CORE is not set |
480 | # CONFIG_ICS932S401 is not set | ||
481 | # CONFIG_ENCLOSURE_SERVICES is not set | ||
482 | # CONFIG_HP_ILO is not set | ||
483 | # CONFIG_C2PORT is not set | ||
484 | CONFIG_HAVE_IDE=y | ||
455 | # CONFIG_IDE is not set | 485 | # CONFIG_IDE is not set |
456 | 486 | ||
457 | # | 487 | # |
@@ -516,6 +546,7 @@ CONFIG_SCSI_LOWLEVEL=y | |||
516 | # CONFIG_SCSI_IPS is not set | 546 | # CONFIG_SCSI_IPS is not set |
517 | # CONFIG_SCSI_INITIO is not set | 547 | # CONFIG_SCSI_INITIO is not set |
518 | # CONFIG_SCSI_INIA100 is not set | 548 | # CONFIG_SCSI_INIA100 is not set |
549 | # CONFIG_SCSI_MVSAS is not set | ||
519 | # CONFIG_SCSI_STEX is not set | 550 | # CONFIG_SCSI_STEX is not set |
520 | # CONFIG_SCSI_SYM53C8XX_2 is not set | 551 | # CONFIG_SCSI_SYM53C8XX_2 is not set |
521 | # CONFIG_SCSI_IPR is not set | 552 | # CONFIG_SCSI_IPR is not set |
@@ -528,9 +559,13 @@ CONFIG_SCSI_LOWLEVEL=y | |||
528 | # CONFIG_SCSI_NSP32 is not set | 559 | # CONFIG_SCSI_NSP32 is not set |
529 | # CONFIG_SCSI_DEBUG is not set | 560 | # CONFIG_SCSI_DEBUG is not set |
530 | # CONFIG_SCSI_SRP is not set | 561 | # CONFIG_SCSI_SRP is not set |
562 | # CONFIG_SCSI_DH is not set | ||
531 | CONFIG_ATA=y | 563 | CONFIG_ATA=y |
532 | # CONFIG_ATA_NONSTANDARD is not set | 564 | # CONFIG_ATA_NONSTANDARD is not set |
565 | CONFIG_SATA_PMP=y | ||
533 | # CONFIG_SATA_AHCI is not set | 566 | # CONFIG_SATA_AHCI is not set |
567 | # CONFIG_SATA_SIL24 is not set | ||
568 | CONFIG_ATA_SFF=y | ||
534 | # CONFIG_SATA_SVW is not set | 569 | # CONFIG_SATA_SVW is not set |
535 | # CONFIG_ATA_PIIX is not set | 570 | # CONFIG_ATA_PIIX is not set |
536 | # CONFIG_SATA_MV is not set | 571 | # CONFIG_SATA_MV is not set |
@@ -540,7 +575,6 @@ CONFIG_ATA=y | |||
540 | # CONFIG_SATA_PROMISE is not set | 575 | # CONFIG_SATA_PROMISE is not set |
541 | # CONFIG_SATA_SX4 is not set | 576 | # CONFIG_SATA_SX4 is not set |
542 | # CONFIG_SATA_SIL is not set | 577 | # CONFIG_SATA_SIL is not set |
543 | # CONFIG_SATA_SIL24 is not set | ||
544 | # CONFIG_SATA_SIS is not set | 578 | # CONFIG_SATA_SIS is not set |
545 | # CONFIG_SATA_ULI is not set | 579 | # CONFIG_SATA_ULI is not set |
546 | # CONFIG_SATA_VIA is not set | 580 | # CONFIG_SATA_VIA is not set |
@@ -570,6 +604,7 @@ CONFIG_PATA_MPC52xx=y | |||
570 | # CONFIG_PATA_MPIIX is not set | 604 | # CONFIG_PATA_MPIIX is not set |
571 | # CONFIG_PATA_OLDPIIX is not set | 605 | # CONFIG_PATA_OLDPIIX is not set |
572 | # CONFIG_PATA_NETCELL is not set | 606 | # CONFIG_PATA_NETCELL is not set |
607 | # CONFIG_PATA_NINJA32 is not set | ||
573 | # CONFIG_PATA_NS87410 is not set | 608 | # CONFIG_PATA_NS87410 is not set |
574 | # CONFIG_PATA_NS87415 is not set | 609 | # CONFIG_PATA_NS87415 is not set |
575 | # CONFIG_PATA_OPTI is not set | 610 | # CONFIG_PATA_OPTI is not set |
@@ -586,25 +621,28 @@ CONFIG_PATA_MPC52xx=y | |||
586 | # CONFIG_PATA_WINBOND is not set | 621 | # CONFIG_PATA_WINBOND is not set |
587 | CONFIG_PATA_PLATFORM=y | 622 | CONFIG_PATA_PLATFORM=y |
588 | # CONFIG_PATA_OF_PLATFORM is not set | 623 | # CONFIG_PATA_OF_PLATFORM is not set |
624 | # CONFIG_PATA_SCH is not set | ||
589 | # CONFIG_MD is not set | 625 | # CONFIG_MD is not set |
590 | # CONFIG_FUSION is not set | 626 | # CONFIG_FUSION is not set |
591 | 627 | ||
592 | # | 628 | # |
593 | # IEEE 1394 (FireWire) support | 629 | # IEEE 1394 (FireWire) support |
594 | # | 630 | # |
631 | |||
632 | # | ||
633 | # Enable only one of the two stacks, unless you know what you are doing | ||
634 | # | ||
595 | # CONFIG_FIREWIRE is not set | 635 | # CONFIG_FIREWIRE is not set |
596 | # CONFIG_IEEE1394 is not set | 636 | # CONFIG_IEEE1394 is not set |
597 | # CONFIG_I2O is not set | 637 | # CONFIG_I2O is not set |
598 | # CONFIG_MACINTOSH_DRIVERS is not set | 638 | # CONFIG_MACINTOSH_DRIVERS is not set |
599 | CONFIG_NETDEVICES=y | 639 | CONFIG_NETDEVICES=y |
600 | # CONFIG_NETDEVICES_MULTIQUEUE is not set | ||
601 | # CONFIG_DUMMY is not set | 640 | # CONFIG_DUMMY is not set |
602 | # CONFIG_BONDING is not set | 641 | # CONFIG_BONDING is not set |
603 | # CONFIG_MACVLAN is not set | 642 | # CONFIG_MACVLAN is not set |
604 | # CONFIG_EQUALIZER is not set | 643 | # CONFIG_EQUALIZER is not set |
605 | # CONFIG_TUN is not set | 644 | # CONFIG_TUN is not set |
606 | # CONFIG_VETH is not set | 645 | # CONFIG_VETH is not set |
607 | # CONFIG_IP1000 is not set | ||
608 | # CONFIG_ARCNET is not set | 646 | # CONFIG_ARCNET is not set |
609 | CONFIG_PHYLIB=y | 647 | CONFIG_PHYLIB=y |
610 | 648 | ||
@@ -620,6 +658,7 @@ CONFIG_PHYLIB=y | |||
620 | # CONFIG_SMSC_PHY is not set | 658 | # CONFIG_SMSC_PHY is not set |
621 | # CONFIG_BROADCOM_PHY is not set | 659 | # CONFIG_BROADCOM_PHY is not set |
622 | # CONFIG_ICPLUS_PHY is not set | 660 | # CONFIG_ICPLUS_PHY is not set |
661 | # CONFIG_REALTEK_PHY is not set | ||
623 | # CONFIG_FIXED_PHY is not set | 662 | # CONFIG_FIXED_PHY is not set |
624 | # CONFIG_MDIO_BITBANG is not set | 663 | # CONFIG_MDIO_BITBANG is not set |
625 | CONFIG_NET_ETHERNET=y | 664 | CONFIG_NET_ETHERNET=y |
@@ -634,10 +673,14 @@ CONFIG_NET_ETHERNET=y | |||
634 | # CONFIG_IBM_NEW_EMAC_RGMII is not set | 673 | # CONFIG_IBM_NEW_EMAC_RGMII is not set |
635 | # CONFIG_IBM_NEW_EMAC_TAH is not set | 674 | # CONFIG_IBM_NEW_EMAC_TAH is not set |
636 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set | 675 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set |
676 | # CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set | ||
677 | # CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set | ||
678 | # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set | ||
637 | # CONFIG_NET_PCI is not set | 679 | # CONFIG_NET_PCI is not set |
638 | # CONFIG_B44 is not set | 680 | # CONFIG_B44 is not set |
639 | CONFIG_FEC_MPC52xx=y | 681 | CONFIG_FEC_MPC52xx=y |
640 | CONFIG_FEC_MPC52xx_MDIO=y | 682 | CONFIG_FEC_MPC52xx_MDIO=y |
683 | # CONFIG_ATL2 is not set | ||
641 | # CONFIG_NETDEV_1000 is not set | 684 | # CONFIG_NETDEV_1000 is not set |
642 | # CONFIG_NETDEV_10000 is not set | 685 | # CONFIG_NETDEV_10000 is not set |
643 | # CONFIG_TR is not set | 686 | # CONFIG_TR is not set |
@@ -647,6 +690,7 @@ CONFIG_FEC_MPC52xx_MDIO=y | |||
647 | # | 690 | # |
648 | # CONFIG_WLAN_PRE80211 is not set | 691 | # CONFIG_WLAN_PRE80211 is not set |
649 | # CONFIG_WLAN_80211 is not set | 692 | # CONFIG_WLAN_80211 is not set |
693 | # CONFIG_IWLWIFI_LEDS is not set | ||
650 | 694 | ||
651 | # | 695 | # |
652 | # USB Network Adapters | 696 | # USB Network Adapters |
@@ -662,7 +706,6 @@ CONFIG_FEC_MPC52xx_MDIO=y | |||
662 | # CONFIG_PPP is not set | 706 | # CONFIG_PPP is not set |
663 | # CONFIG_SLIP is not set | 707 | # CONFIG_SLIP is not set |
664 | # CONFIG_NET_FC is not set | 708 | # CONFIG_NET_FC is not set |
665 | # CONFIG_SHAPER is not set | ||
666 | # CONFIG_NETCONSOLE is not set | 709 | # CONFIG_NETCONSOLE is not set |
667 | # CONFIG_NETPOLL is not set | 710 | # CONFIG_NETPOLL is not set |
668 | # CONFIG_NET_POLL_CONTROLLER is not set | 711 | # CONFIG_NET_POLL_CONTROLLER is not set |
@@ -672,7 +715,30 @@ CONFIG_FEC_MPC52xx_MDIO=y | |||
672 | # | 715 | # |
673 | # Input device support | 716 | # Input device support |
674 | # | 717 | # |
675 | # CONFIG_INPUT is not set | 718 | CONFIG_INPUT=y |
719 | # CONFIG_INPUT_FF_MEMLESS is not set | ||
720 | # CONFIG_INPUT_POLLDEV is not set | ||
721 | |||
722 | # | ||
723 | # Userland interfaces | ||
724 | # | ||
725 | CONFIG_INPUT_MOUSEDEV=y | ||
726 | CONFIG_INPUT_MOUSEDEV_PSAUX=y | ||
727 | CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 | ||
728 | CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 | ||
729 | # CONFIG_INPUT_JOYDEV is not set | ||
730 | # CONFIG_INPUT_EVDEV is not set | ||
731 | # CONFIG_INPUT_EVBUG is not set | ||
732 | |||
733 | # | ||
734 | # Input Device Drivers | ||
735 | # | ||
736 | # CONFIG_INPUT_KEYBOARD is not set | ||
737 | # CONFIG_INPUT_MOUSE is not set | ||
738 | # CONFIG_INPUT_JOYSTICK is not set | ||
739 | # CONFIG_INPUT_TABLET is not set | ||
740 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
741 | # CONFIG_INPUT_MISC is not set | ||
676 | 742 | ||
677 | # | 743 | # |
678 | # Hardware I/O ports | 744 | # Hardware I/O ports |
@@ -683,8 +749,14 @@ CONFIG_FEC_MPC52xx_MDIO=y | |||
683 | # | 749 | # |
684 | # Character devices | 750 | # Character devices |
685 | # | 751 | # |
686 | # CONFIG_VT is not set | 752 | CONFIG_VT=y |
753 | CONFIG_CONSOLE_TRANSLATIONS=y | ||
754 | CONFIG_VT_CONSOLE=y | ||
755 | CONFIG_HW_CONSOLE=y | ||
756 | # CONFIG_VT_HW_CONSOLE_BINDING is not set | ||
757 | CONFIG_DEVKMEM=y | ||
687 | # CONFIG_SERIAL_NONSTANDARD is not set | 758 | # CONFIG_SERIAL_NONSTANDARD is not set |
759 | # CONFIG_NOZOMI is not set | ||
688 | 760 | ||
689 | # | 761 | # |
690 | # Serial drivers | 762 | # Serial drivers |
@@ -718,16 +790,15 @@ CONFIG_DEVPORT=y | |||
718 | CONFIG_I2C=y | 790 | CONFIG_I2C=y |
719 | CONFIG_I2C_BOARDINFO=y | 791 | CONFIG_I2C_BOARDINFO=y |
720 | CONFIG_I2C_CHARDEV=y | 792 | CONFIG_I2C_CHARDEV=y |
793 | CONFIG_I2C_HELPER_AUTO=y | ||
794 | CONFIG_I2C_ALGOBIT=y | ||
721 | 795 | ||
722 | # | 796 | # |
723 | # I2C Algorithms | 797 | # I2C Hardware Bus support |
724 | # | 798 | # |
725 | # CONFIG_I2C_ALGOBIT is not set | ||
726 | # CONFIG_I2C_ALGOPCF is not set | ||
727 | # CONFIG_I2C_ALGOPCA is not set | ||
728 | 799 | ||
729 | # | 800 | # |
730 | # I2C Hardware Bus support | 801 | # PC SMBus host controller drivers |
731 | # | 802 | # |
732 | # CONFIG_I2C_ALI1535 is not set | 803 | # CONFIG_I2C_ALI1535 is not set |
733 | # CONFIG_I2C_ALI1563 is not set | 804 | # CONFIG_I2C_ALI1563 is not set |
@@ -735,52 +806,64 @@ CONFIG_I2C_CHARDEV=y | |||
735 | # CONFIG_I2C_AMD756 is not set | 806 | # CONFIG_I2C_AMD756 is not set |
736 | # CONFIG_I2C_AMD8111 is not set | 807 | # CONFIG_I2C_AMD8111 is not set |
737 | # CONFIG_I2C_I801 is not set | 808 | # CONFIG_I2C_I801 is not set |
738 | # CONFIG_I2C_I810 is not set | 809 | # CONFIG_I2C_ISCH is not set |
739 | # CONFIG_I2C_PIIX4 is not set | 810 | # CONFIG_I2C_PIIX4 is not set |
740 | CONFIG_I2C_MPC=y | ||
741 | # CONFIG_I2C_NFORCE2 is not set | 811 | # CONFIG_I2C_NFORCE2 is not set |
742 | # CONFIG_I2C_OCORES is not set | ||
743 | # CONFIG_I2C_PARPORT_LIGHT is not set | ||
744 | # CONFIG_I2C_PROSAVAGE is not set | ||
745 | # CONFIG_I2C_SAVAGE4 is not set | ||
746 | # CONFIG_I2C_SIMTEC is not set | ||
747 | # CONFIG_I2C_SIS5595 is not set | 812 | # CONFIG_I2C_SIS5595 is not set |
748 | # CONFIG_I2C_SIS630 is not set | 813 | # CONFIG_I2C_SIS630 is not set |
749 | # CONFIG_I2C_SIS96X is not set | 814 | # CONFIG_I2C_SIS96X is not set |
750 | # CONFIG_I2C_TAOS_EVM is not set | ||
751 | # CONFIG_I2C_STUB is not set | ||
752 | # CONFIG_I2C_TINY_USB is not set | ||
753 | # CONFIG_I2C_VIA is not set | 815 | # CONFIG_I2C_VIA is not set |
754 | # CONFIG_I2C_VIAPRO is not set | 816 | # CONFIG_I2C_VIAPRO is not set |
817 | |||
818 | # | ||
819 | # I2C system bus drivers (mostly embedded / system-on-chip) | ||
820 | # | ||
821 | CONFIG_I2C_MPC=y | ||
822 | # CONFIG_I2C_OCORES is not set | ||
823 | # CONFIG_I2C_SIMTEC is not set | ||
824 | |||
825 | # | ||
826 | # External I2C/SMBus adapter drivers | ||
827 | # | ||
828 | # CONFIG_I2C_PARPORT_LIGHT is not set | ||
829 | # CONFIG_I2C_TAOS_EVM is not set | ||
830 | # CONFIG_I2C_TINY_USB is not set | ||
831 | |||
832 | # | ||
833 | # Graphics adapter I2C/DDC channel drivers | ||
834 | # | ||
755 | # CONFIG_I2C_VOODOO3 is not set | 835 | # CONFIG_I2C_VOODOO3 is not set |
756 | 836 | ||
757 | # | 837 | # |
838 | # Other I2C/SMBus bus drivers | ||
839 | # | ||
840 | # CONFIG_I2C_PCA_PLATFORM is not set | ||
841 | # CONFIG_I2C_STUB is not set | ||
842 | |||
843 | # | ||
758 | # Miscellaneous I2C Chip support | 844 | # Miscellaneous I2C Chip support |
759 | # | 845 | # |
760 | # CONFIG_SENSORS_DS1337 is not set | ||
761 | # CONFIG_SENSORS_DS1374 is not set | ||
762 | # CONFIG_DS1682 is not set | 846 | # CONFIG_DS1682 is not set |
847 | # CONFIG_AT24 is not set | ||
763 | # CONFIG_SENSORS_EEPROM is not set | 848 | # CONFIG_SENSORS_EEPROM is not set |
764 | # CONFIG_SENSORS_PCF8574 is not set | 849 | # CONFIG_SENSORS_PCF8574 is not set |
850 | # CONFIG_PCF8575 is not set | ||
765 | # CONFIG_SENSORS_PCA9539 is not set | 851 | # CONFIG_SENSORS_PCA9539 is not set |
766 | # CONFIG_SENSORS_PCF8591 is not set | 852 | # CONFIG_SENSORS_PCF8591 is not set |
767 | # CONFIG_SENSORS_M41T00 is not set | ||
768 | # CONFIG_SENSORS_MAX6875 is not set | 853 | # CONFIG_SENSORS_MAX6875 is not set |
769 | # CONFIG_SENSORS_TSL2550 is not set | 854 | # CONFIG_SENSORS_TSL2550 is not set |
770 | # CONFIG_I2C_DEBUG_CORE is not set | 855 | # CONFIG_I2C_DEBUG_CORE is not set |
771 | # CONFIG_I2C_DEBUG_ALGO is not set | 856 | # CONFIG_I2C_DEBUG_ALGO is not set |
772 | # CONFIG_I2C_DEBUG_BUS is not set | 857 | # CONFIG_I2C_DEBUG_BUS is not set |
773 | # CONFIG_I2C_DEBUG_CHIP is not set | 858 | # CONFIG_I2C_DEBUG_CHIP is not set |
774 | |||
775 | # | ||
776 | # SPI support | ||
777 | # | ||
778 | # CONFIG_SPI is not set | 859 | # CONFIG_SPI is not set |
779 | # CONFIG_SPI_MASTER is not set | 860 | CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y |
861 | # CONFIG_GPIOLIB is not set | ||
780 | # CONFIG_W1 is not set | 862 | # CONFIG_W1 is not set |
781 | # CONFIG_POWER_SUPPLY is not set | 863 | # CONFIG_POWER_SUPPLY is not set |
782 | CONFIG_HWMON=y | 864 | CONFIG_HWMON=y |
783 | # CONFIG_HWMON_VID is not set | 865 | # CONFIG_HWMON_VID is not set |
866 | # CONFIG_SENSORS_AD7414 is not set | ||
784 | # CONFIG_SENSORS_AD7418 is not set | 867 | # CONFIG_SENSORS_AD7418 is not set |
785 | # CONFIG_SENSORS_ADM1021 is not set | 868 | # CONFIG_SENSORS_ADM1021 is not set |
786 | # CONFIG_SENSORS_ADM1025 is not set | 869 | # CONFIG_SENSORS_ADM1025 is not set |
@@ -788,7 +871,9 @@ CONFIG_HWMON=y | |||
788 | # CONFIG_SENSORS_ADM1029 is not set | 871 | # CONFIG_SENSORS_ADM1029 is not set |
789 | # CONFIG_SENSORS_ADM1031 is not set | 872 | # CONFIG_SENSORS_ADM1031 is not set |
790 | # CONFIG_SENSORS_ADM9240 is not set | 873 | # CONFIG_SENSORS_ADM9240 is not set |
874 | # CONFIG_SENSORS_ADT7462 is not set | ||
791 | # CONFIG_SENSORS_ADT7470 is not set | 875 | # CONFIG_SENSORS_ADT7470 is not set |
876 | # CONFIG_SENSORS_ADT7473 is not set | ||
792 | # CONFIG_SENSORS_ATXP1 is not set | 877 | # CONFIG_SENSORS_ATXP1 is not set |
793 | # CONFIG_SENSORS_DS1621 is not set | 878 | # CONFIG_SENSORS_DS1621 is not set |
794 | # CONFIG_SENSORS_I5K_AMB is not set | 879 | # CONFIG_SENSORS_I5K_AMB is not set |
@@ -818,6 +903,7 @@ CONFIG_HWMON=y | |||
818 | # CONFIG_SENSORS_SMSC47M1 is not set | 903 | # CONFIG_SENSORS_SMSC47M1 is not set |
819 | # CONFIG_SENSORS_SMSC47M192 is not set | 904 | # CONFIG_SENSORS_SMSC47M192 is not set |
820 | # CONFIG_SENSORS_SMSC47B397 is not set | 905 | # CONFIG_SENSORS_SMSC47B397 is not set |
906 | # CONFIG_SENSORS_ADS7828 is not set | ||
821 | # CONFIG_SENSORS_THMC50 is not set | 907 | # CONFIG_SENSORS_THMC50 is not set |
822 | # CONFIG_SENSORS_VIA686A is not set | 908 | # CONFIG_SENSORS_VIA686A is not set |
823 | # CONFIG_SENSORS_VT1211 is not set | 909 | # CONFIG_SENSORS_VT1211 is not set |
@@ -827,9 +913,12 @@ CONFIG_HWMON=y | |||
827 | # CONFIG_SENSORS_W83792D is not set | 913 | # CONFIG_SENSORS_W83792D is not set |
828 | # CONFIG_SENSORS_W83793 is not set | 914 | # CONFIG_SENSORS_W83793 is not set |
829 | # CONFIG_SENSORS_W83L785TS is not set | 915 | # CONFIG_SENSORS_W83L785TS is not set |
916 | # CONFIG_SENSORS_W83L786NG is not set | ||
830 | # CONFIG_SENSORS_W83627HF is not set | 917 | # CONFIG_SENSORS_W83627HF is not set |
831 | # CONFIG_SENSORS_W83627EHF is not set | 918 | # CONFIG_SENSORS_W83627EHF is not set |
832 | # CONFIG_HWMON_DEBUG_CHIP is not set | 919 | # CONFIG_HWMON_DEBUG_CHIP is not set |
920 | # CONFIG_THERMAL is not set | ||
921 | # CONFIG_THERMAL_HWMON is not set | ||
833 | CONFIG_WATCHDOG=y | 922 | CONFIG_WATCHDOG=y |
834 | # CONFIG_WATCHDOG_NOWAYOUT is not set | 923 | # CONFIG_WATCHDOG_NOWAYOUT is not set |
835 | 924 | ||
@@ -837,6 +926,7 @@ CONFIG_WATCHDOG=y | |||
837 | # Watchdog Device Drivers | 926 | # Watchdog Device Drivers |
838 | # | 927 | # |
839 | # CONFIG_SOFT_WATCHDOG is not set | 928 | # CONFIG_SOFT_WATCHDOG is not set |
929 | # CONFIG_ALIM7101_WDT is not set | ||
840 | # CONFIG_MPC5200_WDT is not set | 930 | # CONFIG_MPC5200_WDT is not set |
841 | # CONFIG_WATCHDOG_RTAS is not set | 931 | # CONFIG_WATCHDOG_RTAS is not set |
842 | 932 | ||
@@ -850,23 +940,39 @@ CONFIG_WATCHDOG=y | |||
850 | # USB-based Watchdog Cards | 940 | # USB-based Watchdog Cards |
851 | # | 941 | # |
852 | # CONFIG_USBPCWATCHDOG is not set | 942 | # CONFIG_USBPCWATCHDOG is not set |
943 | CONFIG_SSB_POSSIBLE=y | ||
853 | 944 | ||
854 | # | 945 | # |
855 | # Sonics Silicon Backplane | 946 | # Sonics Silicon Backplane |
856 | # | 947 | # |
857 | CONFIG_SSB_POSSIBLE=y | ||
858 | # CONFIG_SSB is not set | 948 | # CONFIG_SSB is not set |
859 | 949 | ||
860 | # | 950 | # |
861 | # Multifunction device drivers | 951 | # Multifunction device drivers |
862 | # | 952 | # |
953 | # CONFIG_MFD_CORE is not set | ||
863 | # CONFIG_MFD_SM501 is not set | 954 | # CONFIG_MFD_SM501 is not set |
955 | # CONFIG_HTC_PASIC3 is not set | ||
956 | # CONFIG_MFD_TMIO is not set | ||
957 | # CONFIG_PMIC_DA903X is not set | ||
958 | # CONFIG_MFD_WM8400 is not set | ||
959 | # CONFIG_MFD_WM8350_I2C is not set | ||
960 | # CONFIG_REGULATOR is not set | ||
864 | 961 | ||
865 | # | 962 | # |
866 | # Multimedia devices | 963 | # Multimedia devices |
867 | # | 964 | # |
965 | |||
966 | # | ||
967 | # Multimedia core support | ||
968 | # | ||
868 | # CONFIG_VIDEO_DEV is not set | 969 | # CONFIG_VIDEO_DEV is not set |
869 | # CONFIG_DVB_CORE is not set | 970 | # CONFIG_DVB_CORE is not set |
971 | # CONFIG_VIDEO_MEDIA is not set | ||
972 | |||
973 | # | ||
974 | # Multimedia drivers | ||
975 | # | ||
870 | CONFIG_DAB=y | 976 | CONFIG_DAB=y |
871 | # CONFIG_USB_DABUSB is not set | 977 | # CONFIG_USB_DABUSB is not set |
872 | 978 | ||
@@ -874,11 +980,78 @@ CONFIG_DAB=y | |||
874 | # Graphics support | 980 | # Graphics support |
875 | # | 981 | # |
876 | # CONFIG_AGP is not set | 982 | # CONFIG_AGP is not set |
877 | # CONFIG_DRM is not set | 983 | CONFIG_DRM=y |
984 | # CONFIG_DRM_TDFX is not set | ||
985 | # CONFIG_DRM_R128 is not set | ||
986 | # CONFIG_DRM_RADEON is not set | ||
987 | # CONFIG_DRM_MGA is not set | ||
988 | # CONFIG_DRM_VIA is not set | ||
989 | # CONFIG_DRM_SAVAGE is not set | ||
878 | # CONFIG_VGASTATE is not set | 990 | # CONFIG_VGASTATE is not set |
879 | CONFIG_VIDEO_OUTPUT_CONTROL=m | 991 | CONFIG_VIDEO_OUTPUT_CONTROL=y |
880 | # CONFIG_FB is not set | 992 | CONFIG_FB=y |
881 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | 993 | # CONFIG_FIRMWARE_EDID is not set |
994 | CONFIG_FB_DDC=y | ||
995 | # CONFIG_FB_BOOT_VESA_SUPPORT is not set | ||
996 | CONFIG_FB_CFB_FILLRECT=y | ||
997 | CONFIG_FB_CFB_COPYAREA=y | ||
998 | CONFIG_FB_CFB_IMAGEBLIT=y | ||
999 | # CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set | ||
1000 | # CONFIG_FB_SYS_FILLRECT is not set | ||
1001 | # CONFIG_FB_SYS_COPYAREA is not set | ||
1002 | # CONFIG_FB_SYS_IMAGEBLIT is not set | ||
1003 | # CONFIG_FB_FOREIGN_ENDIAN is not set | ||
1004 | # CONFIG_FB_SYS_FOPS is not set | ||
1005 | # CONFIG_FB_SVGALIB is not set | ||
1006 | CONFIG_FB_MACMODES=y | ||
1007 | CONFIG_FB_BACKLIGHT=y | ||
1008 | CONFIG_FB_MODE_HELPERS=y | ||
1009 | # CONFIG_FB_TILEBLITTING is not set | ||
1010 | |||
1011 | # | ||
1012 | # Frame buffer hardware drivers | ||
1013 | # | ||
1014 | # CONFIG_FB_CIRRUS is not set | ||
1015 | # CONFIG_FB_PM2 is not set | ||
1016 | # CONFIG_FB_CYBER2000 is not set | ||
1017 | # CONFIG_FB_OF is not set | ||
1018 | # CONFIG_FB_CT65550 is not set | ||
1019 | # CONFIG_FB_ASILIANT is not set | ||
1020 | # CONFIG_FB_IMSTT is not set | ||
1021 | # CONFIG_FB_VGA16 is not set | ||
1022 | # CONFIG_FB_S1D13XXX is not set | ||
1023 | # CONFIG_FB_NVIDIA is not set | ||
1024 | # CONFIG_FB_RIVA is not set | ||
1025 | # CONFIG_FB_MATROX is not set | ||
1026 | CONFIG_FB_RADEON=y | ||
1027 | CONFIG_FB_RADEON_I2C=y | ||
1028 | CONFIG_FB_RADEON_BACKLIGHT=y | ||
1029 | # CONFIG_FB_RADEON_DEBUG is not set | ||
1030 | # CONFIG_FB_ATY128 is not set | ||
1031 | # CONFIG_FB_ATY is not set | ||
1032 | # CONFIG_FB_S3 is not set | ||
1033 | # CONFIG_FB_SAVAGE is not set | ||
1034 | # CONFIG_FB_SIS is not set | ||
1035 | # CONFIG_FB_VIA is not set | ||
1036 | # CONFIG_FB_NEOMAGIC is not set | ||
1037 | # CONFIG_FB_KYRO is not set | ||
1038 | # CONFIG_FB_3DFX is not set | ||
1039 | # CONFIG_FB_VOODOO1 is not set | ||
1040 | # CONFIG_FB_VT8623 is not set | ||
1041 | # CONFIG_FB_TRIDENT is not set | ||
1042 | # CONFIG_FB_ARK is not set | ||
1043 | # CONFIG_FB_PM3 is not set | ||
1044 | # CONFIG_FB_CARMINE is not set | ||
1045 | # CONFIG_FB_IBM_GXT4500 is not set | ||
1046 | # CONFIG_FB_VIRTUAL is not set | ||
1047 | # CONFIG_FB_METRONOME is not set | ||
1048 | # CONFIG_FB_MB862XX is not set | ||
1049 | CONFIG_BACKLIGHT_LCD_SUPPORT=y | ||
1050 | CONFIG_LCD_CLASS_DEVICE=m | ||
1051 | # CONFIG_LCD_ILI9320 is not set | ||
1052 | # CONFIG_LCD_PLATFORM is not set | ||
1053 | CONFIG_BACKLIGHT_CLASS_DEVICE=y | ||
1054 | # CONFIG_BACKLIGHT_CORGI is not set | ||
882 | 1055 | ||
883 | # | 1056 | # |
884 | # Display device support | 1057 | # Display device support |
@@ -886,15 +1059,64 @@ CONFIG_VIDEO_OUTPUT_CONTROL=m | |||
886 | # CONFIG_DISPLAY_SUPPORT is not set | 1059 | # CONFIG_DISPLAY_SUPPORT is not set |
887 | 1060 | ||
888 | # | 1061 | # |
889 | # Sound | 1062 | # Console display driver support |
890 | # | 1063 | # |
1064 | # CONFIG_VGA_CONSOLE is not set | ||
1065 | CONFIG_DUMMY_CONSOLE=y | ||
1066 | CONFIG_FRAMEBUFFER_CONSOLE=y | ||
1067 | # CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set | ||
1068 | # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set | ||
1069 | # CONFIG_FONTS is not set | ||
1070 | CONFIG_FONT_8x8=y | ||
1071 | CONFIG_FONT_8x16=y | ||
1072 | CONFIG_LOGO=y | ||
1073 | CONFIG_LOGO_LINUX_MONO=y | ||
1074 | CONFIG_LOGO_LINUX_VGA16=y | ||
1075 | CONFIG_LOGO_LINUX_CLUT224=y | ||
891 | # CONFIG_SOUND is not set | 1076 | # CONFIG_SOUND is not set |
1077 | CONFIG_HID_SUPPORT=y | ||
1078 | CONFIG_HID=y | ||
1079 | # CONFIG_HID_DEBUG is not set | ||
1080 | # CONFIG_HIDRAW is not set | ||
1081 | |||
1082 | # | ||
1083 | # USB Input Devices | ||
1084 | # | ||
1085 | CONFIG_USB_HID=y | ||
1086 | # CONFIG_HID_PID is not set | ||
1087 | # CONFIG_USB_HIDDEV is not set | ||
1088 | |||
1089 | # | ||
1090 | # Special HID drivers | ||
1091 | # | ||
1092 | CONFIG_HID_COMPAT=y | ||
1093 | CONFIG_HID_A4TECH=y | ||
1094 | # CONFIG_HID_APPLE is not set | ||
1095 | CONFIG_HID_BELKIN=y | ||
1096 | CONFIG_HID_BRIGHT=y | ||
1097 | CONFIG_HID_CHERRY=y | ||
1098 | # CONFIG_HID_CHICONY is not set | ||
1099 | CONFIG_HID_CYPRESS=y | ||
1100 | CONFIG_HID_DELL=y | ||
1101 | CONFIG_HID_EZKEY=y | ||
1102 | # CONFIG_HID_GYRATION is not set | ||
1103 | # CONFIG_HID_LOGITECH is not set | ||
1104 | # CONFIG_HID_MICROSOFT is not set | ||
1105 | # CONFIG_HID_MONTEREY is not set | ||
1106 | # CONFIG_HID_PANTHERLORD is not set | ||
1107 | # CONFIG_HID_PETALYNX is not set | ||
1108 | # CONFIG_HID_SAMSUNG is not set | ||
1109 | # CONFIG_HID_SONY is not set | ||
1110 | # CONFIG_HID_SUNPLUS is not set | ||
1111 | # CONFIG_THRUSTMASTER_FF is not set | ||
1112 | # CONFIG_ZEROPLUS_FF is not set | ||
892 | CONFIG_USB_SUPPORT=y | 1113 | CONFIG_USB_SUPPORT=y |
893 | CONFIG_USB_ARCH_HAS_HCD=y | 1114 | CONFIG_USB_ARCH_HAS_HCD=y |
894 | CONFIG_USB_ARCH_HAS_OHCI=y | 1115 | CONFIG_USB_ARCH_HAS_OHCI=y |
895 | CONFIG_USB_ARCH_HAS_EHCI=y | 1116 | CONFIG_USB_ARCH_HAS_EHCI=y |
896 | CONFIG_USB=y | 1117 | CONFIG_USB=y |
897 | # CONFIG_USB_DEBUG is not set | 1118 | # CONFIG_USB_DEBUG is not set |
1119 | # CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set | ||
898 | 1120 | ||
899 | # | 1121 | # |
900 | # Miscellaneous USB options | 1122 | # Miscellaneous USB options |
@@ -903,14 +1125,20 @@ CONFIG_USB_DEVICEFS=y | |||
903 | # CONFIG_USB_DEVICE_CLASS is not set | 1125 | # CONFIG_USB_DEVICE_CLASS is not set |
904 | # CONFIG_USB_DYNAMIC_MINORS is not set | 1126 | # CONFIG_USB_DYNAMIC_MINORS is not set |
905 | # CONFIG_USB_SUSPEND is not set | 1127 | # CONFIG_USB_SUSPEND is not set |
906 | # CONFIG_USB_PERSIST is not set | ||
907 | # CONFIG_USB_OTG is not set | 1128 | # CONFIG_USB_OTG is not set |
1129 | # CONFIG_USB_OTG_WHITELIST is not set | ||
1130 | # CONFIG_USB_OTG_BLACKLIST_HUB is not set | ||
1131 | CONFIG_USB_MON=y | ||
1132 | # CONFIG_USB_WUSB is not set | ||
1133 | # CONFIG_USB_WUSB_CBAF is not set | ||
908 | 1134 | ||
909 | # | 1135 | # |
910 | # USB Host Controller Drivers | 1136 | # USB Host Controller Drivers |
911 | # | 1137 | # |
1138 | # CONFIG_USB_C67X00_HCD is not set | ||
912 | # CONFIG_USB_EHCI_HCD is not set | 1139 | # CONFIG_USB_EHCI_HCD is not set |
913 | # CONFIG_USB_ISP116X_HCD is not set | 1140 | # CONFIG_USB_ISP116X_HCD is not set |
1141 | # CONFIG_USB_ISP1760_HCD is not set | ||
914 | CONFIG_USB_OHCI_HCD=y | 1142 | CONFIG_USB_OHCI_HCD=y |
915 | CONFIG_USB_OHCI_HCD_PPC_SOC=y | 1143 | CONFIG_USB_OHCI_HCD_PPC_SOC=y |
916 | CONFIG_USB_OHCI_HCD_PPC_OF=y | 1144 | CONFIG_USB_OHCI_HCD_PPC_OF=y |
@@ -923,12 +1151,17 @@ CONFIG_USB_OHCI_LITTLE_ENDIAN=y | |||
923 | # CONFIG_USB_UHCI_HCD is not set | 1151 | # CONFIG_USB_UHCI_HCD is not set |
924 | # CONFIG_USB_SL811_HCD is not set | 1152 | # CONFIG_USB_SL811_HCD is not set |
925 | # CONFIG_USB_R8A66597_HCD is not set | 1153 | # CONFIG_USB_R8A66597_HCD is not set |
1154 | # CONFIG_USB_WHCI_HCD is not set | ||
1155 | # CONFIG_USB_HWA_HCD is not set | ||
1156 | # CONFIG_USB_MUSB_HDRC is not set | ||
926 | 1157 | ||
927 | # | 1158 | # |
928 | # USB Device Class drivers | 1159 | # USB Device Class drivers |
929 | # | 1160 | # |
930 | # CONFIG_USB_ACM is not set | 1161 | # CONFIG_USB_ACM is not set |
931 | # CONFIG_USB_PRINTER is not set | 1162 | # CONFIG_USB_PRINTER is not set |
1163 | # CONFIG_USB_WDM is not set | ||
1164 | # CONFIG_USB_TMC is not set | ||
932 | 1165 | ||
933 | # | 1166 | # |
934 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | 1167 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' |
@@ -948,7 +1181,9 @@ CONFIG_USB_STORAGE=y | |||
948 | # CONFIG_USB_STORAGE_SDDR55 is not set | 1181 | # CONFIG_USB_STORAGE_SDDR55 is not set |
949 | # CONFIG_USB_STORAGE_JUMPSHOT is not set | 1182 | # CONFIG_USB_STORAGE_JUMPSHOT is not set |
950 | # CONFIG_USB_STORAGE_ALAUDA is not set | 1183 | # CONFIG_USB_STORAGE_ALAUDA is not set |
1184 | # CONFIG_USB_STORAGE_ONETOUCH is not set | ||
951 | # CONFIG_USB_STORAGE_KARMA is not set | 1185 | # CONFIG_USB_STORAGE_KARMA is not set |
1186 | # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set | ||
952 | # CONFIG_USB_LIBUSUAL is not set | 1187 | # CONFIG_USB_LIBUSUAL is not set |
953 | 1188 | ||
954 | # | 1189 | # |
@@ -956,15 +1191,10 @@ CONFIG_USB_STORAGE=y | |||
956 | # | 1191 | # |
957 | # CONFIG_USB_MDC800 is not set | 1192 | # CONFIG_USB_MDC800 is not set |
958 | # CONFIG_USB_MICROTEK is not set | 1193 | # CONFIG_USB_MICROTEK is not set |
959 | CONFIG_USB_MON=y | ||
960 | 1194 | ||
961 | # | 1195 | # |
962 | # USB port drivers | 1196 | # USB port drivers |
963 | # | 1197 | # |
964 | |||
965 | # | ||
966 | # USB Serial Converter support | ||
967 | # | ||
968 | # CONFIG_USB_SERIAL is not set | 1198 | # CONFIG_USB_SERIAL is not set |
969 | 1199 | ||
970 | # | 1200 | # |
@@ -973,7 +1203,7 @@ CONFIG_USB_MON=y | |||
973 | # CONFIG_USB_EMI62 is not set | 1203 | # CONFIG_USB_EMI62 is not set |
974 | # CONFIG_USB_EMI26 is not set | 1204 | # CONFIG_USB_EMI26 is not set |
975 | # CONFIG_USB_ADUTUX is not set | 1205 | # CONFIG_USB_ADUTUX is not set |
976 | # CONFIG_USB_AUERSWALD is not set | 1206 | # CONFIG_USB_SEVSEG is not set |
977 | # CONFIG_USB_RIO500 is not set | 1207 | # CONFIG_USB_RIO500 is not set |
978 | # CONFIG_USB_LEGOTOWER is not set | 1208 | # CONFIG_USB_LEGOTOWER is not set |
979 | # CONFIG_USB_LCD is not set | 1209 | # CONFIG_USB_LCD is not set |
@@ -989,18 +1219,14 @@ CONFIG_USB_MON=y | |||
989 | # CONFIG_USB_TRANCEVIBRATOR is not set | 1219 | # CONFIG_USB_TRANCEVIBRATOR is not set |
990 | # CONFIG_USB_IOWARRIOR is not set | 1220 | # CONFIG_USB_IOWARRIOR is not set |
991 | # CONFIG_USB_TEST is not set | 1221 | # CONFIG_USB_TEST is not set |
992 | 1222 | # CONFIG_USB_ISIGHTFW is not set | |
993 | # | 1223 | # CONFIG_USB_VST is not set |
994 | # USB DSL modem support | ||
995 | # | ||
996 | |||
997 | # | ||
998 | # USB Gadget Support | ||
999 | # | ||
1000 | # CONFIG_USB_GADGET is not set | 1224 | # CONFIG_USB_GADGET is not set |
1225 | # CONFIG_UWB is not set | ||
1001 | # CONFIG_MMC is not set | 1226 | # CONFIG_MMC is not set |
1227 | # CONFIG_MEMSTICK is not set | ||
1002 | CONFIG_NEW_LEDS=y | 1228 | CONFIG_NEW_LEDS=y |
1003 | CONFIG_LEDS_CLASS=y | 1229 | # CONFIG_LEDS_CLASS is not set |
1004 | 1230 | ||
1005 | # | 1231 | # |
1006 | # LED drivers | 1232 | # LED drivers |
@@ -1009,17 +1235,15 @@ CONFIG_LEDS_CLASS=y | |||
1009 | # | 1235 | # |
1010 | # LED Triggers | 1236 | # LED Triggers |
1011 | # | 1237 | # |
1012 | CONFIG_LEDS_TRIGGERS=y | 1238 | # CONFIG_LEDS_TRIGGERS is not set |
1013 | CONFIG_LEDS_TRIGGER_TIMER=y | 1239 | # CONFIG_ACCESSIBILITY is not set |
1014 | # CONFIG_LEDS_TRIGGER_HEARTBEAT is not set | ||
1015 | # CONFIG_INFINIBAND is not set | 1240 | # CONFIG_INFINIBAND is not set |
1016 | # CONFIG_EDAC is not set | 1241 | # CONFIG_EDAC is not set |
1017 | # CONFIG_RTC_CLASS is not set | 1242 | # CONFIG_RTC_CLASS is not set |
1018 | 1243 | # CONFIG_DMADEVICES is not set | |
1019 | # | ||
1020 | # Userspace I/O | ||
1021 | # | ||
1022 | # CONFIG_UIO is not set | 1244 | # CONFIG_UIO is not set |
1245 | # CONFIG_STAGING is not set | ||
1246 | CONFIG_STAGING_EXCLUDE_BUILD=y | ||
1023 | 1247 | ||
1024 | # | 1248 | # |
1025 | # File systems | 1249 | # File systems |
@@ -1031,21 +1255,19 @@ CONFIG_EXT3_FS=y | |||
1031 | CONFIG_EXT3_FS_XATTR=y | 1255 | CONFIG_EXT3_FS_XATTR=y |
1032 | # CONFIG_EXT3_FS_POSIX_ACL is not set | 1256 | # CONFIG_EXT3_FS_POSIX_ACL is not set |
1033 | # CONFIG_EXT3_FS_SECURITY is not set | 1257 | # CONFIG_EXT3_FS_SECURITY is not set |
1034 | # CONFIG_EXT4DEV_FS is not set | 1258 | # CONFIG_EXT4_FS is not set |
1035 | CONFIG_JBD=y | 1259 | CONFIG_JBD=y |
1036 | CONFIG_FS_MBCACHE=y | 1260 | CONFIG_FS_MBCACHE=y |
1037 | # CONFIG_REISERFS_FS is not set | 1261 | # CONFIG_REISERFS_FS is not set |
1038 | # CONFIG_JFS_FS is not set | 1262 | # CONFIG_JFS_FS is not set |
1039 | # CONFIG_FS_POSIX_ACL is not set | 1263 | # CONFIG_FS_POSIX_ACL is not set |
1264 | CONFIG_FILE_LOCKING=y | ||
1040 | # CONFIG_XFS_FS is not set | 1265 | # CONFIG_XFS_FS is not set |
1041 | # CONFIG_GFS2_FS is not set | ||
1042 | # CONFIG_OCFS2_FS is not set | 1266 | # CONFIG_OCFS2_FS is not set |
1043 | # CONFIG_MINIX_FS is not set | 1267 | CONFIG_DNOTIFY=y |
1044 | # CONFIG_ROMFS_FS is not set | ||
1045 | CONFIG_INOTIFY=y | 1268 | CONFIG_INOTIFY=y |
1046 | CONFIG_INOTIFY_USER=y | 1269 | CONFIG_INOTIFY_USER=y |
1047 | # CONFIG_QUOTA is not set | 1270 | # CONFIG_QUOTA is not set |
1048 | CONFIG_DNOTIFY=y | ||
1049 | # CONFIG_AUTOFS_FS is not set | 1271 | # CONFIG_AUTOFS_FS is not set |
1050 | # CONFIG_AUTOFS4_FS is not set | 1272 | # CONFIG_AUTOFS4_FS is not set |
1051 | # CONFIG_FUSE_FS is not set | 1273 | # CONFIG_FUSE_FS is not set |
@@ -1072,6 +1294,7 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | |||
1072 | CONFIG_PROC_FS=y | 1294 | CONFIG_PROC_FS=y |
1073 | CONFIG_PROC_KCORE=y | 1295 | CONFIG_PROC_KCORE=y |
1074 | CONFIG_PROC_SYSCTL=y | 1296 | CONFIG_PROC_SYSCTL=y |
1297 | CONFIG_PROC_PAGE_MONITOR=y | ||
1075 | CONFIG_SYSFS=y | 1298 | CONFIG_SYSFS=y |
1076 | CONFIG_TMPFS=y | 1299 | CONFIG_TMPFS=y |
1077 | # CONFIG_TMPFS_POSIX_ACL is not set | 1300 | # CONFIG_TMPFS_POSIX_ACL is not set |
@@ -1101,8 +1324,11 @@ CONFIG_JFFS2_RTIME=y | |||
1101 | # CONFIG_JFFS2_RUBIN is not set | 1324 | # CONFIG_JFFS2_RUBIN is not set |
1102 | CONFIG_CRAMFS=y | 1325 | CONFIG_CRAMFS=y |
1103 | # CONFIG_VXFS_FS is not set | 1326 | # CONFIG_VXFS_FS is not set |
1327 | # CONFIG_MINIX_FS is not set | ||
1328 | # CONFIG_OMFS_FS is not set | ||
1104 | # CONFIG_HPFS_FS is not set | 1329 | # CONFIG_HPFS_FS is not set |
1105 | # CONFIG_QNX4FS_FS is not set | 1330 | # CONFIG_QNX4FS_FS is not set |
1331 | # CONFIG_ROMFS_FS is not set | ||
1106 | # CONFIG_SYSV_FS is not set | 1332 | # CONFIG_SYSV_FS is not set |
1107 | # CONFIG_UFS_FS is not set | 1333 | # CONFIG_UFS_FS is not set |
1108 | CONFIG_NETWORK_FILESYSTEMS=y | 1334 | CONFIG_NETWORK_FILESYSTEMS=y |
@@ -1110,15 +1336,14 @@ CONFIG_NFS_FS=y | |||
1110 | CONFIG_NFS_V3=y | 1336 | CONFIG_NFS_V3=y |
1111 | # CONFIG_NFS_V3_ACL is not set | 1337 | # CONFIG_NFS_V3_ACL is not set |
1112 | CONFIG_NFS_V4=y | 1338 | CONFIG_NFS_V4=y |
1113 | # CONFIG_NFS_DIRECTIO is not set | ||
1114 | # CONFIG_NFSD is not set | ||
1115 | CONFIG_ROOT_NFS=y | 1339 | CONFIG_ROOT_NFS=y |
1340 | # CONFIG_NFSD is not set | ||
1116 | CONFIG_LOCKD=y | 1341 | CONFIG_LOCKD=y |
1117 | CONFIG_LOCKD_V4=y | 1342 | CONFIG_LOCKD_V4=y |
1118 | CONFIG_NFS_COMMON=y | 1343 | CONFIG_NFS_COMMON=y |
1119 | CONFIG_SUNRPC=y | 1344 | CONFIG_SUNRPC=y |
1120 | CONFIG_SUNRPC_GSS=y | 1345 | CONFIG_SUNRPC_GSS=y |
1121 | # CONFIG_SUNRPC_BIND34 is not set | 1346 | # CONFIG_SUNRPC_REGISTER_V4 is not set |
1122 | CONFIG_RPCSEC_GSS_KRB5=y | 1347 | CONFIG_RPCSEC_GSS_KRB5=y |
1123 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | 1348 | # CONFIG_RPCSEC_GSS_SPKM3 is not set |
1124 | # CONFIG_SMB_FS is not set | 1349 | # CONFIG_SMB_FS is not set |
@@ -1173,7 +1398,6 @@ CONFIG_NLS_ISO8859_1=y | |||
1173 | # CONFIG_NLS_KOI8_U is not set | 1398 | # CONFIG_NLS_KOI8_U is not set |
1174 | # CONFIG_NLS_UTF8 is not set | 1399 | # CONFIG_NLS_UTF8 is not set |
1175 | # CONFIG_DLM is not set | 1400 | # CONFIG_DLM is not set |
1176 | # CONFIG_UCC_SLOW is not set | ||
1177 | 1401 | ||
1178 | # | 1402 | # |
1179 | # Library routines | 1403 | # Library routines |
@@ -1181,6 +1405,7 @@ CONFIG_NLS_ISO8859_1=y | |||
1181 | CONFIG_BITREVERSE=y | 1405 | CONFIG_BITREVERSE=y |
1182 | # CONFIG_CRC_CCITT is not set | 1406 | # CONFIG_CRC_CCITT is not set |
1183 | # CONFIG_CRC16 is not set | 1407 | # CONFIG_CRC16 is not set |
1408 | # CONFIG_CRC_T10DIF is not set | ||
1184 | # CONFIG_CRC_ITU_T is not set | 1409 | # CONFIG_CRC_ITU_T is not set |
1185 | CONFIG_CRC32=y | 1410 | CONFIG_CRC32=y |
1186 | # CONFIG_CRC7 is not set | 1411 | # CONFIG_CRC7 is not set |
@@ -1191,7 +1416,7 @@ CONFIG_PLIST=y | |||
1191 | CONFIG_HAS_IOMEM=y | 1416 | CONFIG_HAS_IOMEM=y |
1192 | CONFIG_HAS_IOPORT=y | 1417 | CONFIG_HAS_IOPORT=y |
1193 | CONFIG_HAS_DMA=y | 1418 | CONFIG_HAS_DMA=y |
1194 | # CONFIG_INSTRUMENTATION is not set | 1419 | CONFIG_HAVE_LMB=y |
1195 | 1420 | ||
1196 | # | 1421 | # |
1197 | # Kernel hacking | 1422 | # Kernel hacking |
@@ -1199,6 +1424,7 @@ CONFIG_HAS_DMA=y | |||
1199 | CONFIG_PRINTK_TIME=y | 1424 | CONFIG_PRINTK_TIME=y |
1200 | CONFIG_ENABLE_WARN_DEPRECATED=y | 1425 | CONFIG_ENABLE_WARN_DEPRECATED=y |
1201 | CONFIG_ENABLE_MUST_CHECK=y | 1426 | CONFIG_ENABLE_MUST_CHECK=y |
1427 | CONFIG_FRAME_WARN=1024 | ||
1202 | # CONFIG_MAGIC_SYSRQ is not set | 1428 | # CONFIG_MAGIC_SYSRQ is not set |
1203 | # CONFIG_UNUSED_SYMBOLS is not set | 1429 | # CONFIG_UNUSED_SYMBOLS is not set |
1204 | # CONFIG_DEBUG_FS is not set | 1430 | # CONFIG_DEBUG_FS is not set |
@@ -1206,10 +1432,14 @@ CONFIG_ENABLE_MUST_CHECK=y | |||
1206 | CONFIG_DEBUG_KERNEL=y | 1432 | CONFIG_DEBUG_KERNEL=y |
1207 | # CONFIG_DEBUG_SHIRQ is not set | 1433 | # CONFIG_DEBUG_SHIRQ is not set |
1208 | CONFIG_DETECT_SOFTLOCKUP=y | 1434 | CONFIG_DETECT_SOFTLOCKUP=y |
1435 | # CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set | ||
1436 | CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 | ||
1209 | CONFIG_SCHED_DEBUG=y | 1437 | CONFIG_SCHED_DEBUG=y |
1210 | # CONFIG_SCHEDSTATS is not set | 1438 | # CONFIG_SCHEDSTATS is not set |
1211 | # CONFIG_TIMER_STATS is not set | 1439 | # CONFIG_TIMER_STATS is not set |
1440 | # CONFIG_DEBUG_OBJECTS is not set | ||
1212 | # CONFIG_SLUB_DEBUG_ON is not set | 1441 | # CONFIG_SLUB_DEBUG_ON is not set |
1442 | # CONFIG_SLUB_STATS is not set | ||
1213 | # CONFIG_DEBUG_RT_MUTEXES is not set | 1443 | # CONFIG_DEBUG_RT_MUTEXES is not set |
1214 | # CONFIG_RT_MUTEX_TESTER is not set | 1444 | # CONFIG_RT_MUTEX_TESTER is not set |
1215 | # CONFIG_DEBUG_SPINLOCK is not set | 1445 | # CONFIG_DEBUG_SPINLOCK is not set |
@@ -1220,17 +1450,39 @@ CONFIG_SCHED_DEBUG=y | |||
1220 | # CONFIG_DEBUG_BUGVERBOSE is not set | 1450 | # CONFIG_DEBUG_BUGVERBOSE is not set |
1221 | CONFIG_DEBUG_INFO=y | 1451 | CONFIG_DEBUG_INFO=y |
1222 | # CONFIG_DEBUG_VM is not set | 1452 | # CONFIG_DEBUG_VM is not set |
1453 | # CONFIG_DEBUG_WRITECOUNT is not set | ||
1454 | # CONFIG_DEBUG_MEMORY_INIT is not set | ||
1223 | # CONFIG_DEBUG_LIST is not set | 1455 | # CONFIG_DEBUG_LIST is not set |
1224 | # CONFIG_DEBUG_SG is not set | 1456 | # CONFIG_DEBUG_SG is not set |
1225 | CONFIG_FORCED_INLINING=y | ||
1226 | # CONFIG_BOOT_PRINTK_DELAY is not set | 1457 | # CONFIG_BOOT_PRINTK_DELAY is not set |
1227 | # CONFIG_RCU_TORTURE_TEST is not set | 1458 | # CONFIG_RCU_TORTURE_TEST is not set |
1459 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | ||
1460 | # CONFIG_BACKTRACE_SELF_TEST is not set | ||
1461 | # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set | ||
1228 | # CONFIG_FAULT_INJECTION is not set | 1462 | # CONFIG_FAULT_INJECTION is not set |
1463 | # CONFIG_LATENCYTOP is not set | ||
1464 | CONFIG_HAVE_FUNCTION_TRACER=y | ||
1465 | |||
1466 | # | ||
1467 | # Tracers | ||
1468 | # | ||
1469 | # CONFIG_FUNCTION_TRACER is not set | ||
1470 | # CONFIG_SCHED_TRACER is not set | ||
1471 | # CONFIG_CONTEXT_SWITCH_TRACER is not set | ||
1472 | # CONFIG_BOOT_TRACER is not set | ||
1473 | # CONFIG_STACK_TRACER is not set | ||
1474 | # CONFIG_DYNAMIC_PRINTK_DEBUG is not set | ||
1229 | # CONFIG_SAMPLES is not set | 1475 | # CONFIG_SAMPLES is not set |
1476 | CONFIG_HAVE_ARCH_KGDB=y | ||
1477 | # CONFIG_KGDB is not set | ||
1230 | # CONFIG_DEBUG_STACKOVERFLOW is not set | 1478 | # CONFIG_DEBUG_STACKOVERFLOW is not set |
1231 | # CONFIG_DEBUG_STACK_USAGE is not set | 1479 | # CONFIG_DEBUG_STACK_USAGE is not set |
1232 | # CONFIG_DEBUG_PAGEALLOC is not set | 1480 | # CONFIG_DEBUG_PAGEALLOC is not set |
1233 | # CONFIG_DEBUGGER is not set | 1481 | # CONFIG_CODE_PATCHING_SELFTEST is not set |
1482 | # CONFIG_FTR_FIXUP_SELFTEST is not set | ||
1483 | # CONFIG_MSI_BITMAP_SELFTEST is not set | ||
1484 | # CONFIG_XMON is not set | ||
1485 | # CONFIG_IRQSTACKS is not set | ||
1234 | # CONFIG_BDI_SWITCH is not set | 1486 | # CONFIG_BDI_SWITCH is not set |
1235 | # CONFIG_BOOTX_TEXT is not set | 1487 | # CONFIG_BOOTX_TEXT is not set |
1236 | # CONFIG_PPC_EARLY_DEBUG is not set | 1488 | # CONFIG_PPC_EARLY_DEBUG is not set |
@@ -1240,47 +1492,98 @@ CONFIG_FORCED_INLINING=y | |||
1240 | # | 1492 | # |
1241 | # CONFIG_KEYS is not set | 1493 | # CONFIG_KEYS is not set |
1242 | # CONFIG_SECURITY is not set | 1494 | # CONFIG_SECURITY is not set |
1495 | # CONFIG_SECURITYFS is not set | ||
1243 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | 1496 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set |
1244 | CONFIG_CRYPTO=y | 1497 | CONFIG_CRYPTO=y |
1498 | |||
1499 | # | ||
1500 | # Crypto core or helper | ||
1501 | # | ||
1502 | # CONFIG_CRYPTO_FIPS is not set | ||
1245 | CONFIG_CRYPTO_ALGAPI=y | 1503 | CONFIG_CRYPTO_ALGAPI=y |
1504 | CONFIG_CRYPTO_AEAD=y | ||
1246 | CONFIG_CRYPTO_BLKCIPHER=y | 1505 | CONFIG_CRYPTO_BLKCIPHER=y |
1506 | CONFIG_CRYPTO_HASH=y | ||
1507 | CONFIG_CRYPTO_RNG=y | ||
1247 | CONFIG_CRYPTO_MANAGER=y | 1508 | CONFIG_CRYPTO_MANAGER=y |
1509 | # CONFIG_CRYPTO_GF128MUL is not set | ||
1510 | # CONFIG_CRYPTO_NULL is not set | ||
1511 | # CONFIG_CRYPTO_CRYPTD is not set | ||
1512 | # CONFIG_CRYPTO_AUTHENC is not set | ||
1513 | # CONFIG_CRYPTO_TEST is not set | ||
1514 | |||
1515 | # | ||
1516 | # Authenticated Encryption with Associated Data | ||
1517 | # | ||
1518 | # CONFIG_CRYPTO_CCM is not set | ||
1519 | # CONFIG_CRYPTO_GCM is not set | ||
1520 | # CONFIG_CRYPTO_SEQIV is not set | ||
1521 | |||
1522 | # | ||
1523 | # Block modes | ||
1524 | # | ||
1525 | CONFIG_CRYPTO_CBC=y | ||
1526 | # CONFIG_CRYPTO_CTR is not set | ||
1527 | # CONFIG_CRYPTO_CTS is not set | ||
1528 | # CONFIG_CRYPTO_ECB is not set | ||
1529 | # CONFIG_CRYPTO_LRW is not set | ||
1530 | # CONFIG_CRYPTO_PCBC is not set | ||
1531 | # CONFIG_CRYPTO_XTS is not set | ||
1532 | |||
1533 | # | ||
1534 | # Hash modes | ||
1535 | # | ||
1248 | # CONFIG_CRYPTO_HMAC is not set | 1536 | # CONFIG_CRYPTO_HMAC is not set |
1249 | # CONFIG_CRYPTO_XCBC is not set | 1537 | # CONFIG_CRYPTO_XCBC is not set |
1250 | # CONFIG_CRYPTO_NULL is not set | 1538 | |
1539 | # | ||
1540 | # Digest | ||
1541 | # | ||
1542 | # CONFIG_CRYPTO_CRC32C is not set | ||
1251 | # CONFIG_CRYPTO_MD4 is not set | 1543 | # CONFIG_CRYPTO_MD4 is not set |
1252 | CONFIG_CRYPTO_MD5=y | 1544 | CONFIG_CRYPTO_MD5=y |
1545 | # CONFIG_CRYPTO_MICHAEL_MIC is not set | ||
1546 | # CONFIG_CRYPTO_RMD128 is not set | ||
1547 | # CONFIG_CRYPTO_RMD160 is not set | ||
1548 | # CONFIG_CRYPTO_RMD256 is not set | ||
1549 | # CONFIG_CRYPTO_RMD320 is not set | ||
1253 | # CONFIG_CRYPTO_SHA1 is not set | 1550 | # CONFIG_CRYPTO_SHA1 is not set |
1254 | # CONFIG_CRYPTO_SHA256 is not set | 1551 | # CONFIG_CRYPTO_SHA256 is not set |
1255 | # CONFIG_CRYPTO_SHA512 is not set | 1552 | # CONFIG_CRYPTO_SHA512 is not set |
1256 | # CONFIG_CRYPTO_WP512 is not set | ||
1257 | # CONFIG_CRYPTO_TGR192 is not set | 1553 | # CONFIG_CRYPTO_TGR192 is not set |
1258 | # CONFIG_CRYPTO_GF128MUL is not set | 1554 | # CONFIG_CRYPTO_WP512 is not set |
1259 | # CONFIG_CRYPTO_ECB is not set | 1555 | |
1260 | CONFIG_CRYPTO_CBC=y | 1556 | # |
1261 | # CONFIG_CRYPTO_PCBC is not set | 1557 | # Ciphers |
1262 | # CONFIG_CRYPTO_LRW is not set | 1558 | # |
1263 | # CONFIG_CRYPTO_XTS is not set | ||
1264 | # CONFIG_CRYPTO_CRYPTD is not set | ||
1265 | CONFIG_CRYPTO_DES=y | ||
1266 | # CONFIG_CRYPTO_FCRYPT is not set | ||
1267 | # CONFIG_CRYPTO_BLOWFISH is not set | ||
1268 | # CONFIG_CRYPTO_TWOFISH is not set | ||
1269 | # CONFIG_CRYPTO_SERPENT is not set | ||
1270 | # CONFIG_CRYPTO_AES is not set | 1559 | # CONFIG_CRYPTO_AES is not set |
1560 | # CONFIG_CRYPTO_ANUBIS is not set | ||
1561 | # CONFIG_CRYPTO_ARC4 is not set | ||
1562 | # CONFIG_CRYPTO_BLOWFISH is not set | ||
1563 | # CONFIG_CRYPTO_CAMELLIA is not set | ||
1271 | # CONFIG_CRYPTO_CAST5 is not set | 1564 | # CONFIG_CRYPTO_CAST5 is not set |
1272 | # CONFIG_CRYPTO_CAST6 is not set | 1565 | # CONFIG_CRYPTO_CAST6 is not set |
1273 | # CONFIG_CRYPTO_TEA is not set | 1566 | CONFIG_CRYPTO_DES=y |
1274 | # CONFIG_CRYPTO_ARC4 is not set | 1567 | # CONFIG_CRYPTO_FCRYPT is not set |
1275 | # CONFIG_CRYPTO_KHAZAD is not set | 1568 | # CONFIG_CRYPTO_KHAZAD is not set |
1276 | # CONFIG_CRYPTO_ANUBIS is not set | 1569 | # CONFIG_CRYPTO_SALSA20 is not set |
1277 | # CONFIG_CRYPTO_SEED is not set | 1570 | # CONFIG_CRYPTO_SEED is not set |
1571 | # CONFIG_CRYPTO_SERPENT is not set | ||
1572 | # CONFIG_CRYPTO_TEA is not set | ||
1573 | # CONFIG_CRYPTO_TWOFISH is not set | ||
1574 | |||
1575 | # | ||
1576 | # Compression | ||
1577 | # | ||
1278 | # CONFIG_CRYPTO_DEFLATE is not set | 1578 | # CONFIG_CRYPTO_DEFLATE is not set |
1279 | # CONFIG_CRYPTO_MICHAEL_MIC is not set | 1579 | # CONFIG_CRYPTO_LZO is not set |
1280 | # CONFIG_CRYPTO_CRC32C is not set | 1580 | |
1281 | # CONFIG_CRYPTO_CAMELLIA is not set | 1581 | # |
1282 | # CONFIG_CRYPTO_TEST is not set | 1582 | # Random Number Generation |
1283 | # CONFIG_CRYPTO_AUTHENC is not set | 1583 | # |
1584 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | ||
1284 | CONFIG_CRYPTO_HW=y | 1585 | CONFIG_CRYPTO_HW=y |
1586 | # CONFIG_CRYPTO_DEV_HIFN_795X is not set | ||
1285 | CONFIG_PPC_CLOCK=y | 1587 | CONFIG_PPC_CLOCK=y |
1286 | CONFIG_PPC_LIB_RHEAP=y | 1588 | CONFIG_PPC_LIB_RHEAP=y |
1589 | # CONFIG_VIRTUALIZATION is not set | ||
diff --git a/arch/powerpc/configs/ppc40x_defconfig b/arch/powerpc/configs/ppc40x_defconfig index c15c91deb2ab..4256e2c4534b 100644 --- a/arch/powerpc/configs/ppc40x_defconfig +++ b/arch/powerpc/configs/ppc40x_defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.28-rc2 | 3 | # Linux kernel version: 2.6.28-rc4 |
4 | # Tue Oct 28 08:56:44 2008 | 4 | # Fri Nov 14 09:54:44 2008 |
5 | # | 5 | # |
6 | # CONFIG_PPC64 is not set | 6 | # CONFIG_PPC64 is not set |
7 | 7 | ||
@@ -500,15 +500,17 @@ CONFIG_BLK_DEV_RAM_SIZE=35000 | |||
500 | # CONFIG_BLK_DEV_XIP is not set | 500 | # CONFIG_BLK_DEV_XIP is not set |
501 | # CONFIG_CDROM_PKTCDVD is not set | 501 | # CONFIG_CDROM_PKTCDVD is not set |
502 | # CONFIG_ATA_OVER_ETH is not set | 502 | # CONFIG_ATA_OVER_ETH is not set |
503 | # CONFIG_XILINX_SYSACE is not set | 503 | CONFIG_XILINX_SYSACE=m |
504 | # CONFIG_BLK_DEV_HD is not set | 504 | # CONFIG_BLK_DEV_HD is not set |
505 | CONFIG_MISC_DEVICES=y | 505 | CONFIG_MISC_DEVICES=y |
506 | # CONFIG_PHANTOM is not set | 506 | # CONFIG_PHANTOM is not set |
507 | # CONFIG_EEPROM_93CX6 is not set | 507 | # CONFIG_EEPROM_93CX6 is not set |
508 | # CONFIG_SGI_IOC4 is not set | 508 | # CONFIG_SGI_IOC4 is not set |
509 | # CONFIG_TIFM_CORE is not set | 509 | # CONFIG_TIFM_CORE is not set |
510 | # CONFIG_ICS932S401 is not set | ||
510 | # CONFIG_ENCLOSURE_SERVICES is not set | 511 | # CONFIG_ENCLOSURE_SERVICES is not set |
511 | # CONFIG_HP_ILO is not set | 512 | # CONFIG_HP_ILO is not set |
513 | # CONFIG_C2PORT is not set | ||
512 | CONFIG_HAVE_IDE=y | 514 | CONFIG_HAVE_IDE=y |
513 | # CONFIG_IDE is not set | 515 | # CONFIG_IDE is not set |
514 | 516 | ||
@@ -632,7 +634,13 @@ CONFIG_NETDEV_10000=y | |||
632 | # | 634 | # |
633 | # Hardware I/O ports | 635 | # Hardware I/O ports |
634 | # | 636 | # |
635 | # CONFIG_SERIO is not set | 637 | CONFIG_SERIO=m |
638 | # CONFIG_SERIO_I8042 is not set | ||
639 | # CONFIG_SERIO_SERPORT is not set | ||
640 | # CONFIG_SERIO_PCIPS2 is not set | ||
641 | # CONFIG_SERIO_LIBPS2 is not set | ||
642 | # CONFIG_SERIO_RAW is not set | ||
643 | CONFIG_SERIO_XILINX_XPS_PS2=m | ||
636 | # CONFIG_GAMEPORT is not set | 644 | # CONFIG_GAMEPORT is not set |
637 | 645 | ||
638 | # | 646 | # |
@@ -660,7 +668,8 @@ CONFIG_SERIAL_8250_SHARE_IRQ=y | |||
660 | # | 668 | # |
661 | # Non-8250 serial port support | 669 | # Non-8250 serial port support |
662 | # | 670 | # |
663 | # CONFIG_SERIAL_UARTLITE is not set | 671 | CONFIG_SERIAL_UARTLITE=y |
672 | CONFIG_SERIAL_UARTLITE_CONSOLE=y | ||
664 | CONFIG_SERIAL_CORE=y | 673 | CONFIG_SERIAL_CORE=y |
665 | CONFIG_SERIAL_CORE_CONSOLE=y | 674 | CONFIG_SERIAL_CORE_CONSOLE=y |
666 | # CONFIG_SERIAL_JSM is not set | 675 | # CONFIG_SERIAL_JSM is not set |
@@ -757,6 +766,11 @@ CONFIG_GPIOLIB=y | |||
757 | # CONFIG_GPIO_SYSFS is not set | 766 | # CONFIG_GPIO_SYSFS is not set |
758 | 767 | ||
759 | # | 768 | # |
769 | # Memory mapped GPIO expanders: | ||
770 | # | ||
771 | CONFIG_GPIO_XILINX=y | ||
772 | |||
773 | # | ||
760 | # I2C GPIO expanders: | 774 | # I2C GPIO expanders: |
761 | # | 775 | # |
762 | # CONFIG_GPIO_MAX732X is not set | 776 | # CONFIG_GPIO_MAX732X is not set |
@@ -776,11 +790,11 @@ CONFIG_GPIOLIB=y | |||
776 | # CONFIG_HWMON is not set | 790 | # CONFIG_HWMON is not set |
777 | CONFIG_THERMAL=y | 791 | CONFIG_THERMAL=y |
778 | # CONFIG_WATCHDOG is not set | 792 | # CONFIG_WATCHDOG is not set |
793 | CONFIG_SSB_POSSIBLE=y | ||
779 | 794 | ||
780 | # | 795 | # |
781 | # Sonics Silicon Backplane | 796 | # Sonics Silicon Backplane |
782 | # | 797 | # |
783 | CONFIG_SSB_POSSIBLE=y | ||
784 | # CONFIG_SSB is not set | 798 | # CONFIG_SSB is not set |
785 | 799 | ||
786 | # | 800 | # |
@@ -792,6 +806,7 @@ CONFIG_SSB_POSSIBLE=y | |||
792 | # CONFIG_MFD_TMIO is not set | 806 | # CONFIG_MFD_TMIO is not set |
793 | # CONFIG_MFD_WM8400 is not set | 807 | # CONFIG_MFD_WM8400 is not set |
794 | # CONFIG_MFD_WM8350_I2C is not set | 808 | # CONFIG_MFD_WM8350_I2C is not set |
809 | # CONFIG_REGULATOR is not set | ||
795 | 810 | ||
796 | # | 811 | # |
797 | # Multimedia devices | 812 | # Multimedia devices |
@@ -816,13 +831,65 @@ CONFIG_SSB_POSSIBLE=y | |||
816 | # CONFIG_DRM is not set | 831 | # CONFIG_DRM is not set |
817 | # CONFIG_VGASTATE is not set | 832 | # CONFIG_VGASTATE is not set |
818 | CONFIG_VIDEO_OUTPUT_CONTROL=m | 833 | CONFIG_VIDEO_OUTPUT_CONTROL=m |
819 | # CONFIG_FB is not set | 834 | CONFIG_FB=m |
835 | # CONFIG_FIRMWARE_EDID is not set | ||
836 | # CONFIG_FB_DDC is not set | ||
837 | # CONFIG_FB_BOOT_VESA_SUPPORT is not set | ||
838 | CONFIG_FB_CFB_FILLRECT=m | ||
839 | CONFIG_FB_CFB_COPYAREA=m | ||
840 | CONFIG_FB_CFB_IMAGEBLIT=m | ||
841 | # CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set | ||
842 | # CONFIG_FB_SYS_FILLRECT is not set | ||
843 | # CONFIG_FB_SYS_COPYAREA is not set | ||
844 | # CONFIG_FB_SYS_IMAGEBLIT is not set | ||
845 | # CONFIG_FB_FOREIGN_ENDIAN is not set | ||
846 | # CONFIG_FB_SYS_FOPS is not set | ||
847 | # CONFIG_FB_SVGALIB is not set | ||
848 | # CONFIG_FB_MACMODES is not set | ||
849 | # CONFIG_FB_BACKLIGHT is not set | ||
850 | # CONFIG_FB_MODE_HELPERS is not set | ||
851 | # CONFIG_FB_TILEBLITTING is not set | ||
852 | |||
853 | # | ||
854 | # Frame buffer hardware drivers | ||
855 | # | ||
856 | # CONFIG_FB_CIRRUS is not set | ||
857 | # CONFIG_FB_PM2 is not set | ||
858 | # CONFIG_FB_CYBER2000 is not set | ||
859 | # CONFIG_FB_VGA16 is not set | ||
860 | # CONFIG_FB_UVESA is not set | ||
861 | # CONFIG_FB_S1D13XXX is not set | ||
862 | # CONFIG_FB_NVIDIA is not set | ||
863 | # CONFIG_FB_RIVA is not set | ||
864 | # CONFIG_FB_MATROX is not set | ||
865 | # CONFIG_FB_RADEON is not set | ||
866 | # CONFIG_FB_ATY128 is not set | ||
867 | # CONFIG_FB_ATY is not set | ||
868 | # CONFIG_FB_S3 is not set | ||
869 | # CONFIG_FB_SAVAGE is not set | ||
870 | # CONFIG_FB_SIS is not set | ||
871 | # CONFIG_FB_VIA is not set | ||
872 | # CONFIG_FB_NEOMAGIC is not set | ||
873 | # CONFIG_FB_KYRO is not set | ||
874 | # CONFIG_FB_3DFX is not set | ||
875 | # CONFIG_FB_VOODOO1 is not set | ||
876 | # CONFIG_FB_VT8623 is not set | ||
877 | # CONFIG_FB_TRIDENT is not set | ||
878 | # CONFIG_FB_ARK is not set | ||
879 | # CONFIG_FB_PM3 is not set | ||
880 | # CONFIG_FB_CARMINE is not set | ||
881 | # CONFIG_FB_IBM_GXT4500 is not set | ||
882 | CONFIG_FB_XILINX=m | ||
883 | # CONFIG_FB_VIRTUAL is not set | ||
884 | # CONFIG_FB_METRONOME is not set | ||
885 | # CONFIG_FB_MB862XX is not set | ||
820 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | 886 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set |
821 | 887 | ||
822 | # | 888 | # |
823 | # Display device support | 889 | # Display device support |
824 | # | 890 | # |
825 | # CONFIG_DISPLAY_SUPPORT is not set | 891 | # CONFIG_DISPLAY_SUPPORT is not set |
892 | # CONFIG_LOGO is not set | ||
826 | # CONFIG_SOUND is not set | 893 | # CONFIG_SOUND is not set |
827 | CONFIG_USB_SUPPORT=y | 894 | CONFIG_USB_SUPPORT=y |
828 | CONFIG_USB_ARCH_HAS_HCD=y | 895 | CONFIG_USB_ARCH_HAS_HCD=y |
@@ -851,6 +918,7 @@ CONFIG_USB_ARCH_HAS_EHCI=y | |||
851 | # CONFIG_DMADEVICES is not set | 918 | # CONFIG_DMADEVICES is not set |
852 | # CONFIG_UIO is not set | 919 | # CONFIG_UIO is not set |
853 | # CONFIG_STAGING is not set | 920 | # CONFIG_STAGING is not set |
921 | CONFIG_STAGING_EXCLUDE_BUILD=y | ||
854 | 922 | ||
855 | # | 923 | # |
856 | # File systems | 924 | # File systems |
@@ -1077,10 +1145,12 @@ CONFIG_DEBUG_BUGVERBOSE=y | |||
1077 | # CONFIG_FAULT_INJECTION is not set | 1145 | # CONFIG_FAULT_INJECTION is not set |
1078 | # CONFIG_LATENCYTOP is not set | 1146 | # CONFIG_LATENCYTOP is not set |
1079 | CONFIG_SYSCTL_SYSCALL_CHECK=y | 1147 | CONFIG_SYSCTL_SYSCALL_CHECK=y |
1080 | CONFIG_NOP_TRACER=y | 1148 | CONFIG_HAVE_FUNCTION_TRACER=y |
1081 | CONFIG_HAVE_FTRACE=y | 1149 | |
1082 | CONFIG_HAVE_DYNAMIC_FTRACE=y | 1150 | # |
1083 | # CONFIG_FTRACE is not set | 1151 | # Tracers |
1152 | # | ||
1153 | # CONFIG_FUNCTION_TRACER is not set | ||
1084 | # CONFIG_SCHED_TRACER is not set | 1154 | # CONFIG_SCHED_TRACER is not set |
1085 | # CONFIG_CONTEXT_SWITCH_TRACER is not set | 1155 | # CONFIG_CONTEXT_SWITCH_TRACER is not set |
1086 | # CONFIG_BOOT_TRACER is not set | 1156 | # CONFIG_BOOT_TRACER is not set |
diff --git a/arch/powerpc/configs/ppc44x_defconfig b/arch/powerpc/configs/ppc44x_defconfig index 55edbd545b61..cfc94cfcf4cb 100644 --- a/arch/powerpc/configs/ppc44x_defconfig +++ b/arch/powerpc/configs/ppc44x_defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.28-rc2 | 3 | # Linux kernel version: 2.6.28-rc4 |
4 | # Tue Oct 28 09:28:58 2008 | 4 | # Fri Nov 14 10:06:19 2008 |
5 | # | 5 | # |
6 | # CONFIG_PPC64 is not set | 6 | # CONFIG_PPC64 is not set |
7 | 7 | ||
@@ -506,15 +506,17 @@ CONFIG_BLK_DEV_RAM_SIZE=35000 | |||
506 | # CONFIG_BLK_DEV_XIP is not set | 506 | # CONFIG_BLK_DEV_XIP is not set |
507 | # CONFIG_CDROM_PKTCDVD is not set | 507 | # CONFIG_CDROM_PKTCDVD is not set |
508 | # CONFIG_ATA_OVER_ETH is not set | 508 | # CONFIG_ATA_OVER_ETH is not set |
509 | # CONFIG_XILINX_SYSACE is not set | 509 | CONFIG_XILINX_SYSACE=m |
510 | # CONFIG_BLK_DEV_HD is not set | 510 | # CONFIG_BLK_DEV_HD is not set |
511 | CONFIG_MISC_DEVICES=y | 511 | CONFIG_MISC_DEVICES=y |
512 | # CONFIG_PHANTOM is not set | 512 | # CONFIG_PHANTOM is not set |
513 | # CONFIG_EEPROM_93CX6 is not set | 513 | # CONFIG_EEPROM_93CX6 is not set |
514 | # CONFIG_SGI_IOC4 is not set | 514 | # CONFIG_SGI_IOC4 is not set |
515 | # CONFIG_TIFM_CORE is not set | 515 | # CONFIG_TIFM_CORE is not set |
516 | # CONFIG_ICS932S401 is not set | ||
516 | # CONFIG_ENCLOSURE_SERVICES is not set | 517 | # CONFIG_ENCLOSURE_SERVICES is not set |
517 | # CONFIG_HP_ILO is not set | 518 | # CONFIG_HP_ILO is not set |
519 | # CONFIG_C2PORT is not set | ||
518 | CONFIG_HAVE_IDE=y | 520 | CONFIG_HAVE_IDE=y |
519 | # CONFIG_IDE is not set | 521 | # CONFIG_IDE is not set |
520 | 522 | ||
@@ -680,7 +682,13 @@ CONFIG_NETDEV_10000=y | |||
680 | # | 682 | # |
681 | # Hardware I/O ports | 683 | # Hardware I/O ports |
682 | # | 684 | # |
683 | # CONFIG_SERIO is not set | 685 | CONFIG_SERIO=m |
686 | # CONFIG_SERIO_I8042 is not set | ||
687 | # CONFIG_SERIO_SERPORT is not set | ||
688 | # CONFIG_SERIO_PCIPS2 is not set | ||
689 | # CONFIG_SERIO_LIBPS2 is not set | ||
690 | # CONFIG_SERIO_RAW is not set | ||
691 | CONFIG_SERIO_XILINX_XPS_PS2=m | ||
684 | # CONFIG_GAMEPORT is not set | 692 | # CONFIG_GAMEPORT is not set |
685 | 693 | ||
686 | # | 694 | # |
@@ -708,7 +716,8 @@ CONFIG_SERIAL_8250_SHARE_IRQ=y | |||
708 | # | 716 | # |
709 | # Non-8250 serial port support | 717 | # Non-8250 serial port support |
710 | # | 718 | # |
711 | # CONFIG_SERIAL_UARTLITE is not set | 719 | CONFIG_SERIAL_UARTLITE=y |
720 | CONFIG_SERIAL_UARTLITE_CONSOLE=y | ||
712 | CONFIG_SERIAL_CORE=y | 721 | CONFIG_SERIAL_CORE=y |
713 | CONFIG_SERIAL_CORE_CONSOLE=y | 722 | CONFIG_SERIAL_CORE_CONSOLE=y |
714 | # CONFIG_SERIAL_JSM is not set | 723 | # CONFIG_SERIAL_JSM is not set |
@@ -806,6 +815,11 @@ CONFIG_GPIOLIB=y | |||
806 | # CONFIG_GPIO_SYSFS is not set | 815 | # CONFIG_GPIO_SYSFS is not set |
807 | 816 | ||
808 | # | 817 | # |
818 | # Memory mapped GPIO expanders: | ||
819 | # | ||
820 | CONFIG_GPIO_XILINX=y | ||
821 | |||
822 | # | ||
809 | # I2C GPIO expanders: | 823 | # I2C GPIO expanders: |
810 | # | 824 | # |
811 | # CONFIG_GPIO_MAX732X is not set | 825 | # CONFIG_GPIO_MAX732X is not set |
@@ -826,11 +840,11 @@ CONFIG_GPIOLIB=y | |||
826 | # CONFIG_THERMAL is not set | 840 | # CONFIG_THERMAL is not set |
827 | # CONFIG_THERMAL_HWMON is not set | 841 | # CONFIG_THERMAL_HWMON is not set |
828 | # CONFIG_WATCHDOG is not set | 842 | # CONFIG_WATCHDOG is not set |
843 | CONFIG_SSB_POSSIBLE=y | ||
829 | 844 | ||
830 | # | 845 | # |
831 | # Sonics Silicon Backplane | 846 | # Sonics Silicon Backplane |
832 | # | 847 | # |
833 | CONFIG_SSB_POSSIBLE=y | ||
834 | # CONFIG_SSB is not set | 848 | # CONFIG_SSB is not set |
835 | 849 | ||
836 | # | 850 | # |
@@ -842,6 +856,7 @@ CONFIG_SSB_POSSIBLE=y | |||
842 | # CONFIG_MFD_TMIO is not set | 856 | # CONFIG_MFD_TMIO is not set |
843 | # CONFIG_MFD_WM8400 is not set | 857 | # CONFIG_MFD_WM8400 is not set |
844 | # CONFIG_MFD_WM8350_I2C is not set | 858 | # CONFIG_MFD_WM8350_I2C is not set |
859 | # CONFIG_REGULATOR is not set | ||
845 | 860 | ||
846 | # | 861 | # |
847 | # Multimedia devices | 862 | # Multimedia devices |
@@ -866,13 +881,65 @@ CONFIG_SSB_POSSIBLE=y | |||
866 | # CONFIG_DRM is not set | 881 | # CONFIG_DRM is not set |
867 | # CONFIG_VGASTATE is not set | 882 | # CONFIG_VGASTATE is not set |
868 | # CONFIG_VIDEO_OUTPUT_CONTROL is not set | 883 | # CONFIG_VIDEO_OUTPUT_CONTROL is not set |
869 | # CONFIG_FB is not set | 884 | CONFIG_FB=m |
885 | # CONFIG_FIRMWARE_EDID is not set | ||
886 | # CONFIG_FB_DDC is not set | ||
887 | # CONFIG_FB_BOOT_VESA_SUPPORT is not set | ||
888 | CONFIG_FB_CFB_FILLRECT=m | ||
889 | CONFIG_FB_CFB_COPYAREA=m | ||
890 | CONFIG_FB_CFB_IMAGEBLIT=m | ||
891 | # CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set | ||
892 | # CONFIG_FB_SYS_FILLRECT is not set | ||
893 | # CONFIG_FB_SYS_COPYAREA is not set | ||
894 | # CONFIG_FB_SYS_IMAGEBLIT is not set | ||
895 | # CONFIG_FB_FOREIGN_ENDIAN is not set | ||
896 | # CONFIG_FB_SYS_FOPS is not set | ||
897 | # CONFIG_FB_SVGALIB is not set | ||
898 | # CONFIG_FB_MACMODES is not set | ||
899 | # CONFIG_FB_BACKLIGHT is not set | ||
900 | # CONFIG_FB_MODE_HELPERS is not set | ||
901 | # CONFIG_FB_TILEBLITTING is not set | ||
902 | |||
903 | # | ||
904 | # Frame buffer hardware drivers | ||
905 | # | ||
906 | # CONFIG_FB_CIRRUS is not set | ||
907 | # CONFIG_FB_PM2 is not set | ||
908 | # CONFIG_FB_CYBER2000 is not set | ||
909 | # CONFIG_FB_VGA16 is not set | ||
910 | # CONFIG_FB_UVESA is not set | ||
911 | # CONFIG_FB_S1D13XXX is not set | ||
912 | # CONFIG_FB_NVIDIA is not set | ||
913 | # CONFIG_FB_RIVA is not set | ||
914 | # CONFIG_FB_MATROX is not set | ||
915 | # CONFIG_FB_RADEON is not set | ||
916 | # CONFIG_FB_ATY128 is not set | ||
917 | # CONFIG_FB_ATY is not set | ||
918 | # CONFIG_FB_S3 is not set | ||
919 | # CONFIG_FB_SAVAGE is not set | ||
920 | # CONFIG_FB_SIS is not set | ||
921 | # CONFIG_FB_VIA is not set | ||
922 | # CONFIG_FB_NEOMAGIC is not set | ||
923 | # CONFIG_FB_KYRO is not set | ||
924 | # CONFIG_FB_3DFX is not set | ||
925 | # CONFIG_FB_VOODOO1 is not set | ||
926 | # CONFIG_FB_VT8623 is not set | ||
927 | # CONFIG_FB_TRIDENT is not set | ||
928 | # CONFIG_FB_ARK is not set | ||
929 | # CONFIG_FB_PM3 is not set | ||
930 | # CONFIG_FB_CARMINE is not set | ||
931 | # CONFIG_FB_IBM_GXT4500 is not set | ||
932 | CONFIG_FB_XILINX=m | ||
933 | # CONFIG_FB_VIRTUAL is not set | ||
934 | # CONFIG_FB_METRONOME is not set | ||
935 | # CONFIG_FB_MB862XX is not set | ||
870 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | 936 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set |
871 | 937 | ||
872 | # | 938 | # |
873 | # Display device support | 939 | # Display device support |
874 | # | 940 | # |
875 | # CONFIG_DISPLAY_SUPPORT is not set | 941 | # CONFIG_DISPLAY_SUPPORT is not set |
942 | # CONFIG_LOGO is not set | ||
876 | # CONFIG_SOUND is not set | 943 | # CONFIG_SOUND is not set |
877 | CONFIG_USB_SUPPORT=y | 944 | CONFIG_USB_SUPPORT=y |
878 | CONFIG_USB_ARCH_HAS_HCD=y | 945 | CONFIG_USB_ARCH_HAS_HCD=y |
@@ -1002,6 +1069,7 @@ CONFIG_USB_STORAGE=m | |||
1002 | # CONFIG_DMADEVICES is not set | 1069 | # CONFIG_DMADEVICES is not set |
1003 | # CONFIG_UIO is not set | 1070 | # CONFIG_UIO is not set |
1004 | # CONFIG_STAGING is not set | 1071 | # CONFIG_STAGING is not set |
1072 | CONFIG_STAGING_EXCLUDE_BUILD=y | ||
1005 | 1073 | ||
1006 | # | 1074 | # |
1007 | # File systems | 1075 | # File systems |
@@ -1227,10 +1295,12 @@ CONFIG_DEBUG_BUGVERBOSE=y | |||
1227 | # CONFIG_FAULT_INJECTION is not set | 1295 | # CONFIG_FAULT_INJECTION is not set |
1228 | # CONFIG_LATENCYTOP is not set | 1296 | # CONFIG_LATENCYTOP is not set |
1229 | CONFIG_SYSCTL_SYSCALL_CHECK=y | 1297 | CONFIG_SYSCTL_SYSCALL_CHECK=y |
1230 | CONFIG_NOP_TRACER=y | 1298 | CONFIG_HAVE_FUNCTION_TRACER=y |
1231 | CONFIG_HAVE_FTRACE=y | 1299 | |
1232 | CONFIG_HAVE_DYNAMIC_FTRACE=y | 1300 | # |
1233 | # CONFIG_FTRACE is not set | 1301 | # Tracers |
1302 | # | ||
1303 | # CONFIG_FUNCTION_TRACER is not set | ||
1234 | # CONFIG_SCHED_TRACER is not set | 1304 | # CONFIG_SCHED_TRACER is not set |
1235 | # CONFIG_CONTEXT_SWITCH_TRACER is not set | 1305 | # CONFIG_CONTEXT_SWITCH_TRACER is not set |
1236 | # CONFIG_BOOT_TRACER is not set | 1306 | # CONFIG_BOOT_TRACER is not set |
diff --git a/arch/powerpc/include/asm/mmu-hash64.h b/arch/powerpc/include/asm/mmu-hash64.h index 5a441742ffba..68b752626808 100644 --- a/arch/powerpc/include/asm/mmu-hash64.h +++ b/arch/powerpc/include/asm/mmu-hash64.h | |||
@@ -280,7 +280,6 @@ extern int hash_huge_page(struct mm_struct *mm, unsigned long access, | |||
280 | extern int htab_bolt_mapping(unsigned long vstart, unsigned long vend, | 280 | extern int htab_bolt_mapping(unsigned long vstart, unsigned long vend, |
281 | unsigned long pstart, unsigned long prot, | 281 | unsigned long pstart, unsigned long prot, |
282 | int psize, int ssize); | 282 | int psize, int ssize); |
283 | extern void set_huge_psize(int psize); | ||
284 | extern void add_gpage(unsigned long addr, unsigned long page_size, | 283 | extern void add_gpage(unsigned long addr, unsigned long page_size, |
285 | unsigned long number_of_pages); | 284 | unsigned long number_of_pages); |
286 | extern void demote_segment_4k(struct mm_struct *mm, unsigned long addr); | 285 | extern void demote_segment_4k(struct mm_struct *mm, unsigned long addr); |
diff --git a/arch/powerpc/include/asm/ptrace.h b/arch/powerpc/include/asm/ptrace.h index 280a90cc9894..c9c678fb2538 100644 --- a/arch/powerpc/include/asm/ptrace.h +++ b/arch/powerpc/include/asm/ptrace.h | |||
@@ -55,8 +55,6 @@ struct pt_regs { | |||
55 | 55 | ||
56 | #ifdef __powerpc64__ | 56 | #ifdef __powerpc64__ |
57 | 57 | ||
58 | #define __ARCH_WANT_COMPAT_SYS_PTRACE | ||
59 | |||
60 | #define STACK_FRAME_OVERHEAD 112 /* size of minimum stack frame */ | 58 | #define STACK_FRAME_OVERHEAD 112 /* size of minimum stack frame */ |
61 | #define STACK_FRAME_LR_SAVE 2 /* Location of LR in stack frame */ | 59 | #define STACK_FRAME_LR_SAVE 2 /* Location of LR in stack frame */ |
62 | #define STACK_FRAME_REGS_MARKER ASM_CONST(0x7265677368657265) | 60 | #define STACK_FRAME_REGS_MARKER ASM_CONST(0x7265677368657265) |
diff --git a/arch/powerpc/kernel/cpu_setup_44x.S b/arch/powerpc/kernel/cpu_setup_44x.S index 80cac984d85d..31c18b52affb 100644 --- a/arch/powerpc/kernel/cpu_setup_44x.S +++ b/arch/powerpc/kernel/cpu_setup_44x.S | |||
@@ -34,7 +34,12 @@ _GLOBAL(__setup_cpu_440grx) | |||
34 | blr | 34 | blr |
35 | _GLOBAL(__setup_cpu_460ex) | 35 | _GLOBAL(__setup_cpu_460ex) |
36 | _GLOBAL(__setup_cpu_460gt) | 36 | _GLOBAL(__setup_cpu_460gt) |
37 | b __init_fpu_44x | 37 | mflr r4 |
38 | bl __init_fpu_44x | ||
39 | bl __fixup_440A_mcheck | ||
40 | mtlr r4 | ||
41 | blr | ||
42 | |||
38 | _GLOBAL(__setup_cpu_440gx) | 43 | _GLOBAL(__setup_cpu_440gx) |
39 | _GLOBAL(__setup_cpu_440spe) | 44 | _GLOBAL(__setup_cpu_440spe) |
40 | b __fixup_440A_mcheck | 45 | b __fixup_440A_mcheck |
diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S index e6d52845854f..e0bcf9354286 100644 --- a/arch/powerpc/kernel/entry_64.S +++ b/arch/powerpc/kernel/entry_64.S | |||
@@ -57,12 +57,18 @@ system_call_common: | |||
57 | beq- 1f | 57 | beq- 1f |
58 | ld r1,PACAKSAVE(r13) | 58 | ld r1,PACAKSAVE(r13) |
59 | 1: std r10,0(r1) | 59 | 1: std r10,0(r1) |
60 | crclr so | ||
61 | std r11,_NIP(r1) | 60 | std r11,_NIP(r1) |
62 | std r12,_MSR(r1) | 61 | std r12,_MSR(r1) |
63 | std r0,GPR0(r1) | 62 | std r0,GPR0(r1) |
64 | std r10,GPR1(r1) | 63 | std r10,GPR1(r1) |
65 | ACCOUNT_CPU_USER_ENTRY(r10, r11) | 64 | ACCOUNT_CPU_USER_ENTRY(r10, r11) |
65 | /* | ||
66 | * This "crclr so" clears CR0.SO, which is the error indication on | ||
67 | * return from this system call. There must be no cmp instruction | ||
68 | * between it and the "mfcr r9" below, otherwise if XER.SO is set, | ||
69 | * CR0.SO will get set, causing all system calls to appear to fail. | ||
70 | */ | ||
71 | crclr so | ||
66 | std r2,GPR2(r1) | 72 | std r2,GPR2(r1) |
67 | std r3,GPR3(r1) | 73 | std r3,GPR3(r1) |
68 | std r4,GPR4(r1) | 74 | std r4,GPR4(r1) |
diff --git a/arch/powerpc/kernel/prom_parse.c b/arch/powerpc/kernel/prom_parse.c index bc1fb27368af..a11d68976dc8 100644 --- a/arch/powerpc/kernel/prom_parse.c +++ b/arch/powerpc/kernel/prom_parse.c | |||
@@ -250,8 +250,11 @@ int of_irq_map_pci(struct pci_dev *pdev, struct of_irq *out_irq) | |||
250 | * parsing | 250 | * parsing |
251 | */ | 251 | */ |
252 | dn = pci_device_to_OF_node(pdev); | 252 | dn = pci_device_to_OF_node(pdev); |
253 | if (dn) | 253 | if (dn) { |
254 | return of_irq_map_one(dn, 0, out_irq); | 254 | rc = of_irq_map_one(dn, 0, out_irq); |
255 | if (!rc) | ||
256 | return rc; | ||
257 | } | ||
255 | 258 | ||
256 | /* Ok, we don't, time to have fun. Let's start by building up an | 259 | /* Ok, we don't, time to have fun. Let's start by building up an |
257 | * interrupt spec. we assume #interrupt-cells is 1, which is standard | 260 | * interrupt spec. we assume #interrupt-cells is 1, which is standard |
diff --git a/arch/powerpc/kernel/sysfs.c b/arch/powerpc/kernel/sysfs.c index 86a2ffccef25..20885a38237a 100644 --- a/arch/powerpc/kernel/sysfs.c +++ b/arch/powerpc/kernel/sysfs.c | |||
@@ -717,9 +717,11 @@ static void unregister_cpu_online(unsigned int cpu) | |||
717 | 717 | ||
718 | BUG_ON(!c->hotpluggable); | 718 | BUG_ON(!c->hotpluggable); |
719 | 719 | ||
720 | #ifdef CONFIG_PPC64 | ||
720 | if (!firmware_has_feature(FW_FEATURE_ISERIES) && | 721 | if (!firmware_has_feature(FW_FEATURE_ISERIES) && |
721 | cpu_has_feature(CPU_FTR_SMT)) | 722 | cpu_has_feature(CPU_FTR_SMT)) |
722 | sysdev_remove_file(s, &attr_smt_snooze_delay); | 723 | sysdev_remove_file(s, &attr_smt_snooze_delay); |
724 | #endif | ||
723 | 725 | ||
724 | /* PMC stuff */ | 726 | /* PMC stuff */ |
725 | switch (cur_cpu_spec->pmc_type) { | 727 | switch (cur_cpu_spec->pmc_type) { |
diff --git a/arch/powerpc/mm/40x_mmu.c b/arch/powerpc/mm/40x_mmu.c index cecbbc76f624..29954dc28942 100644 --- a/arch/powerpc/mm/40x_mmu.c +++ b/arch/powerpc/mm/40x_mmu.c | |||
@@ -93,7 +93,7 @@ void __init MMU_init_hw(void) | |||
93 | 93 | ||
94 | unsigned long __init mmu_mapin_ram(void) | 94 | unsigned long __init mmu_mapin_ram(void) |
95 | { | 95 | { |
96 | unsigned long v, s; | 96 | unsigned long v, s, mapped; |
97 | phys_addr_t p; | 97 | phys_addr_t p; |
98 | 98 | ||
99 | v = KERNELBASE; | 99 | v = KERNELBASE; |
@@ -130,5 +130,17 @@ unsigned long __init mmu_mapin_ram(void) | |||
130 | s -= LARGE_PAGE_SIZE_4M; | 130 | s -= LARGE_PAGE_SIZE_4M; |
131 | } | 131 | } |
132 | 132 | ||
133 | return total_lowmem - s; | 133 | mapped = total_lowmem - s; |
134 | |||
135 | /* If the size of RAM is not an exact power of two, we may not | ||
136 | * have covered RAM in its entirety with 16 and 4 MiB | ||
137 | * pages. Consequently, restrict the top end of RAM currently | ||
138 | * allocable so that calls to the LMB to allocate PTEs for "tail" | ||
139 | * coverage with normal-sized pages (or other reasons) do not | ||
140 | * attempt to allocate outside the allowed range. | ||
141 | */ | ||
142 | |||
143 | __initial_memory_limit_addr = memstart_addr + mapped; | ||
144 | |||
145 | return mapped; | ||
134 | } | 146 | } |
diff --git a/arch/powerpc/mm/hugetlbpage.c b/arch/powerpc/mm/hugetlbpage.c index a117024ab8cd..7bbf4e4ed430 100644 --- a/arch/powerpc/mm/hugetlbpage.c +++ b/arch/powerpc/mm/hugetlbpage.c | |||
@@ -677,7 +677,7 @@ repeat: | |||
677 | return err; | 677 | return err; |
678 | } | 678 | } |
679 | 679 | ||
680 | void set_huge_psize(int psize) | 680 | static void __init set_huge_psize(int psize) |
681 | { | 681 | { |
682 | /* Check that it is a page size supported by the hardware and | 682 | /* Check that it is a page size supported by the hardware and |
683 | * that it fits within pagetable limits. */ | 683 | * that it fits within pagetable limits. */ |
diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c index eb505ad34a85..a8397bbad3d4 100644 --- a/arch/powerpc/mm/numa.c +++ b/arch/powerpc/mm/numa.c | |||
@@ -865,6 +865,67 @@ static struct notifier_block __cpuinitdata ppc64_numa_nb = { | |||
865 | .priority = 1 /* Must run before sched domains notifier. */ | 865 | .priority = 1 /* Must run before sched domains notifier. */ |
866 | }; | 866 | }; |
867 | 867 | ||
868 | static void mark_reserved_regions_for_nid(int nid) | ||
869 | { | ||
870 | struct pglist_data *node = NODE_DATA(nid); | ||
871 | int i; | ||
872 | |||
873 | for (i = 0; i < lmb.reserved.cnt; i++) { | ||
874 | unsigned long physbase = lmb.reserved.region[i].base; | ||
875 | unsigned long size = lmb.reserved.region[i].size; | ||
876 | unsigned long start_pfn = physbase >> PAGE_SHIFT; | ||
877 | unsigned long end_pfn = ((physbase + size) >> PAGE_SHIFT); | ||
878 | struct node_active_region node_ar; | ||
879 | unsigned long node_end_pfn = node->node_start_pfn + | ||
880 | node->node_spanned_pages; | ||
881 | |||
882 | /* | ||
883 | * Check to make sure that this lmb.reserved area is | ||
884 | * within the bounds of the node that we care about. | ||
885 | * Checking the nid of the start and end points is not | ||
886 | * sufficient because the reserved area could span the | ||
887 | * entire node. | ||
888 | */ | ||
889 | if (end_pfn <= node->node_start_pfn || | ||
890 | start_pfn >= node_end_pfn) | ||
891 | continue; | ||
892 | |||
893 | get_node_active_region(start_pfn, &node_ar); | ||
894 | while (start_pfn < end_pfn && | ||
895 | node_ar.start_pfn < node_ar.end_pfn) { | ||
896 | unsigned long reserve_size = size; | ||
897 | /* | ||
898 | * if reserved region extends past active region | ||
899 | * then trim size to active region | ||
900 | */ | ||
901 | if (end_pfn > node_ar.end_pfn) | ||
902 | reserve_size = (node_ar.end_pfn << PAGE_SHIFT) | ||
903 | - (start_pfn << PAGE_SHIFT); | ||
904 | dbg("reserve_bootmem %lx %lx nid=%d\n", physbase, | ||
905 | reserve_size, node_ar.nid); | ||
906 | reserve_bootmem_node(NODE_DATA(node_ar.nid), physbase, | ||
907 | reserve_size, BOOTMEM_DEFAULT); | ||
908 | /* | ||
909 | * if reserved region is contained in the active region | ||
910 | * then done. | ||
911 | */ | ||
912 | if (end_pfn <= node_ar.end_pfn) | ||
913 | break; | ||
914 | |||
915 | /* | ||
916 | * reserved region extends past the active region | ||
917 | * get next active region that contains this | ||
918 | * reserved region | ||
919 | */ | ||
920 | start_pfn = node_ar.end_pfn; | ||
921 | physbase = start_pfn << PAGE_SHIFT; | ||
922 | size = size - reserve_size; | ||
923 | get_node_active_region(start_pfn, &node_ar); | ||
924 | } | ||
925 | } | ||
926 | } | ||
927 | |||
928 | |||
868 | void __init do_init_bootmem(void) | 929 | void __init do_init_bootmem(void) |
869 | { | 930 | { |
870 | int nid; | 931 | int nid; |
@@ -890,7 +951,13 @@ void __init do_init_bootmem(void) | |||
890 | 951 | ||
891 | get_pfn_range_for_nid(nid, &start_pfn, &end_pfn); | 952 | get_pfn_range_for_nid(nid, &start_pfn, &end_pfn); |
892 | 953 | ||
893 | /* Allocate the node structure node local if possible */ | 954 | /* |
955 | * Allocate the node structure node local if possible | ||
956 | * | ||
957 | * Be careful moving this around, as it relies on all | ||
958 | * previous nodes' bootmem to be initialized and have | ||
959 | * all reserved areas marked. | ||
960 | */ | ||
894 | NODE_DATA(nid) = careful_allocation(nid, | 961 | NODE_DATA(nid) = careful_allocation(nid, |
895 | sizeof(struct pglist_data), | 962 | sizeof(struct pglist_data), |
896 | SMP_CACHE_BYTES, end_pfn); | 963 | SMP_CACHE_BYTES, end_pfn); |
@@ -922,53 +989,14 @@ void __init do_init_bootmem(void) | |||
922 | start_pfn, end_pfn); | 989 | start_pfn, end_pfn); |
923 | 990 | ||
924 | free_bootmem_with_active_regions(nid, end_pfn); | 991 | free_bootmem_with_active_regions(nid, end_pfn); |
925 | } | 992 | /* |
926 | 993 | * Be very careful about moving this around. Future | |
927 | /* Mark reserved regions */ | 994 | * calls to careful_allocation() depend on this getting |
928 | for (i = 0; i < lmb.reserved.cnt; i++) { | 995 | * done correctly. |
929 | unsigned long physbase = lmb.reserved.region[i].base; | 996 | */ |
930 | unsigned long size = lmb.reserved.region[i].size; | 997 | mark_reserved_regions_for_nid(nid); |
931 | unsigned long start_pfn = physbase >> PAGE_SHIFT; | ||
932 | unsigned long end_pfn = ((physbase + size) >> PAGE_SHIFT); | ||
933 | struct node_active_region node_ar; | ||
934 | |||
935 | get_node_active_region(start_pfn, &node_ar); | ||
936 | while (start_pfn < end_pfn && | ||
937 | node_ar.start_pfn < node_ar.end_pfn) { | ||
938 | unsigned long reserve_size = size; | ||
939 | /* | ||
940 | * if reserved region extends past active region | ||
941 | * then trim size to active region | ||
942 | */ | ||
943 | if (end_pfn > node_ar.end_pfn) | ||
944 | reserve_size = (node_ar.end_pfn << PAGE_SHIFT) | ||
945 | - (start_pfn << PAGE_SHIFT); | ||
946 | dbg("reserve_bootmem %lx %lx nid=%d\n", physbase, | ||
947 | reserve_size, node_ar.nid); | ||
948 | reserve_bootmem_node(NODE_DATA(node_ar.nid), physbase, | ||
949 | reserve_size, BOOTMEM_DEFAULT); | ||
950 | /* | ||
951 | * if reserved region is contained in the active region | ||
952 | * then done. | ||
953 | */ | ||
954 | if (end_pfn <= node_ar.end_pfn) | ||
955 | break; | ||
956 | |||
957 | /* | ||
958 | * reserved region extends past the active region | ||
959 | * get next active region that contains this | ||
960 | * reserved region | ||
961 | */ | ||
962 | start_pfn = node_ar.end_pfn; | ||
963 | physbase = start_pfn << PAGE_SHIFT; | ||
964 | size = size - reserve_size; | ||
965 | get_node_active_region(start_pfn, &node_ar); | ||
966 | } | ||
967 | |||
968 | } | ||
969 | |||
970 | for_each_online_node(nid) | ||
971 | sparse_memory_present_with_active_regions(nid); | 998 | sparse_memory_present_with_active_regions(nid); |
999 | } | ||
972 | } | 1000 | } |
973 | 1001 | ||
974 | void __init paging_init(void) | 1002 | void __init paging_init(void) |
diff --git a/arch/powerpc/platforms/cell/axon_msi.c b/arch/powerpc/platforms/cell/axon_msi.c index 896548ba1ca1..442cf36aa172 100644 --- a/arch/powerpc/platforms/cell/axon_msi.c +++ b/arch/powerpc/platforms/cell/axon_msi.c | |||
@@ -95,6 +95,7 @@ static void axon_msi_cascade(unsigned int irq, struct irq_desc *desc) | |||
95 | struct axon_msic *msic = get_irq_data(irq); | 95 | struct axon_msic *msic = get_irq_data(irq); |
96 | u32 write_offset, msi; | 96 | u32 write_offset, msi; |
97 | int idx; | 97 | int idx; |
98 | int retry = 0; | ||
98 | 99 | ||
99 | write_offset = dcr_read(msic->dcr_host, MSIC_WRITE_OFFSET_REG); | 100 | write_offset = dcr_read(msic->dcr_host, MSIC_WRITE_OFFSET_REG); |
100 | pr_debug("axon_msi: original write_offset 0x%x\n", write_offset); | 101 | pr_debug("axon_msi: original write_offset 0x%x\n", write_offset); |
@@ -102,7 +103,7 @@ static void axon_msi_cascade(unsigned int irq, struct irq_desc *desc) | |||
102 | /* write_offset doesn't wrap properly, so we have to mask it */ | 103 | /* write_offset doesn't wrap properly, so we have to mask it */ |
103 | write_offset &= MSIC_FIFO_SIZE_MASK; | 104 | write_offset &= MSIC_FIFO_SIZE_MASK; |
104 | 105 | ||
105 | while (msic->read_offset != write_offset) { | 106 | while (msic->read_offset != write_offset && retry < 100) { |
106 | idx = msic->read_offset / sizeof(__le32); | 107 | idx = msic->read_offset / sizeof(__le32); |
107 | msi = le32_to_cpu(msic->fifo_virt[idx]); | 108 | msi = le32_to_cpu(msic->fifo_virt[idx]); |
108 | msi &= 0xFFFF; | 109 | msi &= 0xFFFF; |
@@ -110,13 +111,37 @@ static void axon_msi_cascade(unsigned int irq, struct irq_desc *desc) | |||
110 | pr_debug("axon_msi: woff %x roff %x msi %x\n", | 111 | pr_debug("axon_msi: woff %x roff %x msi %x\n", |
111 | write_offset, msic->read_offset, msi); | 112 | write_offset, msic->read_offset, msi); |
112 | 113 | ||
114 | if (msi < NR_IRQS && irq_map[msi].host == msic->irq_host) { | ||
115 | generic_handle_irq(msi); | ||
116 | msic->fifo_virt[idx] = cpu_to_le32(0xffffffff); | ||
117 | } else { | ||
118 | /* | ||
119 | * Reading the MSIC_WRITE_OFFSET_REG does not | ||
120 | * reliably flush the outstanding DMA to the | ||
121 | * FIFO buffer. Here we were reading stale | ||
122 | * data, so we need to retry. | ||
123 | */ | ||
124 | udelay(1); | ||
125 | retry++; | ||
126 | pr_debug("axon_msi: invalid irq 0x%x!\n", msi); | ||
127 | continue; | ||
128 | } | ||
129 | |||
130 | if (retry) { | ||
131 | pr_debug("axon_msi: late irq 0x%x, retry %d\n", | ||
132 | msi, retry); | ||
133 | retry = 0; | ||
134 | } | ||
135 | |||
113 | msic->read_offset += MSIC_FIFO_ENTRY_SIZE; | 136 | msic->read_offset += MSIC_FIFO_ENTRY_SIZE; |
114 | msic->read_offset &= MSIC_FIFO_SIZE_MASK; | 137 | msic->read_offset &= MSIC_FIFO_SIZE_MASK; |
138 | } | ||
115 | 139 | ||
116 | if (msi < NR_IRQS && irq_map[msi].host == msic->irq_host) | 140 | if (retry) { |
117 | generic_handle_irq(msi); | 141 | printk(KERN_WARNING "axon_msi: irq timed out\n"); |
118 | else | 142 | |
119 | pr_debug("axon_msi: invalid irq 0x%x!\n", msi); | 143 | msic->read_offset += MSIC_FIFO_ENTRY_SIZE; |
144 | msic->read_offset &= MSIC_FIFO_SIZE_MASK; | ||
120 | } | 145 | } |
121 | 146 | ||
122 | desc->chip->eoi(irq); | 147 | desc->chip->eoi(irq); |
@@ -364,6 +389,7 @@ static int axon_msi_probe(struct of_device *device, | |||
364 | dn->full_name); | 389 | dn->full_name); |
365 | goto out_free_fifo; | 390 | goto out_free_fifo; |
366 | } | 391 | } |
392 | memset(msic->fifo_virt, 0xff, MSIC_FIFO_SIZE_BYTES); | ||
367 | 393 | ||
368 | msic->irq_host = irq_alloc_host(dn, IRQ_HOST_MAP_NOMAP, | 394 | msic->irq_host = irq_alloc_host(dn, IRQ_HOST_MAP_NOMAP, |
369 | NR_IRQS, &msic_host_ops, 0); | 395 | NR_IRQS, &msic_host_ops, 0); |
diff --git a/arch/powerpc/platforms/cell/smp.c b/arch/powerpc/platforms/cell/smp.c index c0d86e1f56ea..9046803c8276 100644 --- a/arch/powerpc/platforms/cell/smp.c +++ b/arch/powerpc/platforms/cell/smp.c | |||
@@ -129,10 +129,15 @@ static int __init smp_iic_probe(void) | |||
129 | return cpus_weight(cpu_possible_map); | 129 | return cpus_weight(cpu_possible_map); |
130 | } | 130 | } |
131 | 131 | ||
132 | static void __devinit smp_iic_setup_cpu(int cpu) | 132 | static void __devinit smp_cell_setup_cpu(int cpu) |
133 | { | 133 | { |
134 | if (cpu != boot_cpuid) | 134 | if (cpu != boot_cpuid) |
135 | iic_setup_cpu(); | 135 | iic_setup_cpu(); |
136 | |||
137 | /* | ||
138 | * change default DABRX to allow user watchpoints | ||
139 | */ | ||
140 | mtspr(SPRN_DABRX, DABRX_KERNEL | DABRX_USER); | ||
136 | } | 141 | } |
137 | 142 | ||
138 | static DEFINE_SPINLOCK(timebase_lock); | 143 | static DEFINE_SPINLOCK(timebase_lock); |
@@ -192,7 +197,7 @@ static struct smp_ops_t bpa_iic_smp_ops = { | |||
192 | .message_pass = smp_iic_message_pass, | 197 | .message_pass = smp_iic_message_pass, |
193 | .probe = smp_iic_probe, | 198 | .probe = smp_iic_probe, |
194 | .kick_cpu = smp_cell_kick_cpu, | 199 | .kick_cpu = smp_cell_kick_cpu, |
195 | .setup_cpu = smp_iic_setup_cpu, | 200 | .setup_cpu = smp_cell_setup_cpu, |
196 | .cpu_bootable = smp_cell_cpu_bootable, | 201 | .cpu_bootable = smp_cell_cpu_bootable, |
197 | }; | 202 | }; |
198 | 203 | ||
diff --git a/arch/powerpc/platforms/cell/spufs/file.c b/arch/powerpc/platforms/cell/spufs/file.c index b73c369cc6f1..1b26071a86ca 100644 --- a/arch/powerpc/platforms/cell/spufs/file.c +++ b/arch/powerpc/platforms/cell/spufs/file.c | |||
@@ -390,6 +390,9 @@ static int spufs_ps_fault(struct vm_area_struct *vma, | |||
390 | if (offset >= ps_size) | 390 | if (offset >= ps_size) |
391 | return VM_FAULT_SIGBUS; | 391 | return VM_FAULT_SIGBUS; |
392 | 392 | ||
393 | if (fatal_signal_pending(current)) | ||
394 | return VM_FAULT_SIGBUS; | ||
395 | |||
393 | /* | 396 | /* |
394 | * Because we release the mmap_sem, the context may be destroyed while | 397 | * Because we release the mmap_sem, the context may be destroyed while |
395 | * we're in spu_wait. Grab an extra reference so it isn't destroyed | 398 | * we're in spu_wait. Grab an extra reference so it isn't destroyed |
diff --git a/arch/powerpc/sysdev/bestcomm/Kconfig b/arch/powerpc/sysdev/bestcomm/Kconfig index 57cc56562567..0b192a1c429d 100644 --- a/arch/powerpc/sysdev/bestcomm/Kconfig +++ b/arch/powerpc/sysdev/bestcomm/Kconfig | |||
@@ -17,23 +17,20 @@ config PPC_BESTCOMM | |||
17 | answer Y or M. Otherwise say N. | 17 | answer Y or M. Otherwise say N. |
18 | 18 | ||
19 | config PPC_BESTCOMM_ATA | 19 | config PPC_BESTCOMM_ATA |
20 | tristate "Bestcomm ATA task support" | 20 | tristate |
21 | depends on PPC_BESTCOMM | 21 | depends on PPC_BESTCOMM |
22 | default n | ||
23 | help | 22 | help |
24 | This option enables the support for the ATA task. | 23 | This option enables the support for the ATA task. |
25 | 24 | ||
26 | config PPC_BESTCOMM_FEC | 25 | config PPC_BESTCOMM_FEC |
27 | tristate "Bestcomm FEC tasks support" | 26 | tristate |
28 | depends on PPC_BESTCOMM | 27 | depends on PPC_BESTCOMM |
29 | default n | ||
30 | help | 28 | help |
31 | This option enables the support for the FEC tasks. | 29 | This option enables the support for the FEC tasks. |
32 | 30 | ||
33 | config PPC_BESTCOMM_GEN_BD | 31 | config PPC_BESTCOMM_GEN_BD |
34 | tristate "Bestcomm GenBD tasks support" | 32 | tristate |
35 | depends on PPC_BESTCOMM | 33 | depends on PPC_BESTCOMM |
36 | default n | ||
37 | help | 34 | help |
38 | This option enables the support for the GenBD tasks. | 35 | This option enables the support for the GenBD tasks. |
39 | 36 | ||
diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c index f6299cca7814..b24e1d085557 100644 --- a/arch/powerpc/sysdev/mpic.c +++ b/arch/powerpc/sysdev/mpic.c | |||
@@ -1271,6 +1271,7 @@ void __init mpic_set_default_senses(struct mpic *mpic, u8 *senses, int count) | |||
1271 | void __init mpic_init(struct mpic *mpic) | 1271 | void __init mpic_init(struct mpic *mpic) |
1272 | { | 1272 | { |
1273 | int i; | 1273 | int i; |
1274 | int cpu; | ||
1274 | 1275 | ||
1275 | BUG_ON(mpic->num_sources == 0); | 1276 | BUG_ON(mpic->num_sources == 0); |
1276 | 1277 | ||
@@ -1313,6 +1314,11 @@ void __init mpic_init(struct mpic *mpic) | |||
1313 | 1314 | ||
1314 | mpic_pasemi_msi_init(mpic); | 1315 | mpic_pasemi_msi_init(mpic); |
1315 | 1316 | ||
1317 | if (mpic->flags & MPIC_PRIMARY) | ||
1318 | cpu = hard_smp_processor_id(); | ||
1319 | else | ||
1320 | cpu = 0; | ||
1321 | |||
1316 | for (i = 0; i < mpic->num_sources; i++) { | 1322 | for (i = 0; i < mpic->num_sources; i++) { |
1317 | /* start with vector = source number, and masked */ | 1323 | /* start with vector = source number, and masked */ |
1318 | u32 vecpri = MPIC_VECPRI_MASK | i | | 1324 | u32 vecpri = MPIC_VECPRI_MASK | i | |
@@ -1323,8 +1329,7 @@ void __init mpic_init(struct mpic *mpic) | |||
1323 | continue; | 1329 | continue; |
1324 | /* init hw */ | 1330 | /* init hw */ |
1325 | mpic_irq_write(i, MPIC_INFO(IRQ_VECTOR_PRI), vecpri); | 1331 | mpic_irq_write(i, MPIC_INFO(IRQ_VECTOR_PRI), vecpri); |
1326 | mpic_irq_write(i, MPIC_INFO(IRQ_DESTINATION), | 1332 | mpic_irq_write(i, MPIC_INFO(IRQ_DESTINATION), 1 << cpu); |
1327 | 1 << hard_smp_processor_id()); | ||
1328 | } | 1333 | } |
1329 | 1334 | ||
1330 | /* Init spurious vector */ | 1335 | /* Init spurious vector */ |
diff --git a/arch/powerpc/sysdev/xilinx_intc.c b/arch/powerpc/sysdev/xilinx_intc.c index b7aefd0d45cb..a22e1a2df1af 100644 --- a/arch/powerpc/sysdev/xilinx_intc.c +++ b/arch/powerpc/sysdev/xilinx_intc.c | |||
@@ -107,8 +107,8 @@ xilinx_intc_init(struct device_node *np) | |||
107 | } | 107 | } |
108 | regs = ioremap(res.start, 32); | 108 | regs = ioremap(res.start, 32); |
109 | 109 | ||
110 | printk(KERN_INFO "Xilinx intc at 0x%08LX mapped to 0x%p\n", | 110 | printk(KERN_INFO "Xilinx intc at 0x%08llx mapped to 0x%p\n", |
111 | res.start, regs); | 111 | (unsigned long long) res.start, regs); |
112 | 112 | ||
113 | /* Setup interrupt controller */ | 113 | /* Setup interrupt controller */ |
114 | out_be32(regs + XINTC_IER, 0); /* disable all irqs */ | 114 | out_be32(regs + XINTC_IER, 0); /* disable all irqs */ |
diff --git a/arch/s390/defconfig b/arch/s390/defconfig index 9b0bc2c9fba0..a0e748da9909 100644 --- a/arch/s390/defconfig +++ b/arch/s390/defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.27-rc4 | 3 | # Linux kernel version: 2.6.28-rc6 |
4 | # Thu Aug 21 19:43:29 2008 | 4 | # Thu Nov 27 11:00:49 2008 |
5 | # | 5 | # |
6 | CONFIG_SCHED_MC=y | 6 | CONFIG_SCHED_MC=y |
7 | CONFIG_MMU=y | 7 | CONFIG_MMU=y |
@@ -45,6 +45,7 @@ CONFIG_LOG_BUF_SHIFT=17 | |||
45 | CONFIG_CGROUPS=y | 45 | CONFIG_CGROUPS=y |
46 | # CONFIG_CGROUP_DEBUG is not set | 46 | # CONFIG_CGROUP_DEBUG is not set |
47 | CONFIG_CGROUP_NS=y | 47 | CONFIG_CGROUP_NS=y |
48 | # CONFIG_CGROUP_FREEZER is not set | ||
48 | # CONFIG_CGROUP_DEVICE is not set | 49 | # CONFIG_CGROUP_DEVICE is not set |
49 | # CONFIG_CPUSETS is not set | 50 | # CONFIG_CPUSETS is not set |
50 | CONFIG_GROUP_SCHED=y | 51 | CONFIG_GROUP_SCHED=y |
@@ -84,6 +85,7 @@ CONFIG_SIGNALFD=y | |||
84 | CONFIG_TIMERFD=y | 85 | CONFIG_TIMERFD=y |
85 | CONFIG_EVENTFD=y | 86 | CONFIG_EVENTFD=y |
86 | CONFIG_SHMEM=y | 87 | CONFIG_SHMEM=y |
88 | CONFIG_AIO=y | ||
87 | CONFIG_VM_EVENT_COUNTERS=y | 89 | CONFIG_VM_EVENT_COUNTERS=y |
88 | CONFIG_SLAB=y | 90 | CONFIG_SLAB=y |
89 | # CONFIG_SLUB is not set | 91 | # CONFIG_SLUB is not set |
@@ -92,16 +94,10 @@ CONFIG_SLAB=y | |||
92 | # CONFIG_MARKERS is not set | 94 | # CONFIG_MARKERS is not set |
93 | CONFIG_HAVE_OPROFILE=y | 95 | CONFIG_HAVE_OPROFILE=y |
94 | CONFIG_KPROBES=y | 96 | CONFIG_KPROBES=y |
95 | # CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS is not set | ||
96 | CONFIG_KRETPROBES=y | 97 | CONFIG_KRETPROBES=y |
97 | # CONFIG_HAVE_IOREMAP_PROT is not set | ||
98 | CONFIG_HAVE_KPROBES=y | 98 | CONFIG_HAVE_KPROBES=y |
99 | CONFIG_HAVE_KRETPROBES=y | 99 | CONFIG_HAVE_KRETPROBES=y |
100 | # CONFIG_HAVE_ARCH_TRACEHOOK is not set | 100 | CONFIG_HAVE_ARCH_TRACEHOOK=y |
101 | # CONFIG_HAVE_DMA_ATTRS is not set | ||
102 | # CONFIG_USE_GENERIC_SMP_HELPERS is not set | ||
103 | # CONFIG_HAVE_CLK is not set | ||
104 | CONFIG_PROC_PAGE_MONITOR=y | ||
105 | # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set | 101 | # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set |
106 | CONFIG_SLABINFO=y | 102 | CONFIG_SLABINFO=y |
107 | CONFIG_RT_MUTEXES=y | 103 | CONFIG_RT_MUTEXES=y |
@@ -135,6 +131,7 @@ CONFIG_DEFAULT_DEADLINE=y | |||
135 | CONFIG_DEFAULT_IOSCHED="deadline" | 131 | CONFIG_DEFAULT_IOSCHED="deadline" |
136 | CONFIG_PREEMPT_NOTIFIERS=y | 132 | CONFIG_PREEMPT_NOTIFIERS=y |
137 | CONFIG_CLASSIC_RCU=y | 133 | CONFIG_CLASSIC_RCU=y |
134 | # CONFIG_FREEZER is not set | ||
138 | 135 | ||
139 | # | 136 | # |
140 | # Base setup | 137 | # Base setup |
@@ -189,7 +186,6 @@ CONFIG_SELECT_MEMORY_MODEL=y | |||
189 | CONFIG_SPARSEMEM_MANUAL=y | 186 | CONFIG_SPARSEMEM_MANUAL=y |
190 | CONFIG_SPARSEMEM=y | 187 | CONFIG_SPARSEMEM=y |
191 | CONFIG_HAVE_MEMORY_PRESENT=y | 188 | CONFIG_HAVE_MEMORY_PRESENT=y |
192 | # CONFIG_SPARSEMEM_STATIC is not set | ||
193 | CONFIG_SPARSEMEM_EXTREME=y | 189 | CONFIG_SPARSEMEM_EXTREME=y |
194 | CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y | 190 | CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y |
195 | CONFIG_SPARSEMEM_VMEMMAP=y | 191 | CONFIG_SPARSEMEM_VMEMMAP=y |
@@ -200,9 +196,11 @@ CONFIG_PAGEFLAGS_EXTENDED=y | |||
200 | CONFIG_SPLIT_PTLOCK_CPUS=4 | 196 | CONFIG_SPLIT_PTLOCK_CPUS=4 |
201 | CONFIG_MIGRATION=y | 197 | CONFIG_MIGRATION=y |
202 | CONFIG_RESOURCES_64BIT=y | 198 | CONFIG_RESOURCES_64BIT=y |
199 | CONFIG_PHYS_ADDR_T_64BIT=y | ||
203 | CONFIG_ZONE_DMA_FLAG=1 | 200 | CONFIG_ZONE_DMA_FLAG=1 |
204 | CONFIG_BOUNCE=y | 201 | CONFIG_BOUNCE=y |
205 | CONFIG_VIRT_TO_BUS=y | 202 | CONFIG_VIRT_TO_BUS=y |
203 | CONFIG_UNEVICTABLE_LRU=y | ||
206 | 204 | ||
207 | # | 205 | # |
208 | # I/O subsystem configuration | 206 | # I/O subsystem configuration |
@@ -220,6 +218,8 @@ CONFIG_IPL=y | |||
220 | CONFIG_IPL_VM=y | 218 | CONFIG_IPL_VM=y |
221 | CONFIG_BINFMT_ELF=y | 219 | CONFIG_BINFMT_ELF=y |
222 | CONFIG_COMPAT_BINFMT_ELF=y | 220 | CONFIG_COMPAT_BINFMT_ELF=y |
221 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set | ||
222 | # CONFIG_HAVE_AOUT is not set | ||
223 | CONFIG_BINFMT_MISC=m | 223 | CONFIG_BINFMT_MISC=m |
224 | CONFIG_FORCE_MAX_ZONEORDER=9 | 224 | CONFIG_FORCE_MAX_ZONEORDER=9 |
225 | # CONFIG_PROCESS_DEBUG is not set | 225 | # CONFIG_PROCESS_DEBUG is not set |
@@ -255,7 +255,7 @@ CONFIG_XFRM=y | |||
255 | # CONFIG_XFRM_STATISTICS is not set | 255 | # CONFIG_XFRM_STATISTICS is not set |
256 | CONFIG_NET_KEY=y | 256 | CONFIG_NET_KEY=y |
257 | # CONFIG_NET_KEY_MIGRATE is not set | 257 | # CONFIG_NET_KEY_MIGRATE is not set |
258 | CONFIG_IUCV=m | 258 | CONFIG_IUCV=y |
259 | CONFIG_AFIUCV=m | 259 | CONFIG_AFIUCV=m |
260 | CONFIG_INET=y | 260 | CONFIG_INET=y |
261 | CONFIG_IP_MULTICAST=y | 261 | CONFIG_IP_MULTICAST=y |
@@ -282,7 +282,6 @@ CONFIG_INET_TCP_DIAG=y | |||
282 | CONFIG_TCP_CONG_CUBIC=y | 282 | CONFIG_TCP_CONG_CUBIC=y |
283 | CONFIG_DEFAULT_TCP_CONG="cubic" | 283 | CONFIG_DEFAULT_TCP_CONG="cubic" |
284 | # CONFIG_TCP_MD5SIG is not set | 284 | # CONFIG_TCP_MD5SIG is not set |
285 | # CONFIG_IP_VS is not set | ||
286 | CONFIG_IPV6=y | 285 | CONFIG_IPV6=y |
287 | # CONFIG_IPV6_PRIVACY is not set | 286 | # CONFIG_IPV6_PRIVACY is not set |
288 | # CONFIG_IPV6_ROUTER_PREF is not set | 287 | # CONFIG_IPV6_ROUTER_PREF is not set |
@@ -331,10 +330,12 @@ CONFIG_NF_CONNTRACK=m | |||
331 | # CONFIG_NF_CONNTRACK_TFTP is not set | 330 | # CONFIG_NF_CONNTRACK_TFTP is not set |
332 | # CONFIG_NF_CT_NETLINK is not set | 331 | # CONFIG_NF_CT_NETLINK is not set |
333 | # CONFIG_NETFILTER_XTABLES is not set | 332 | # CONFIG_NETFILTER_XTABLES is not set |
333 | # CONFIG_IP_VS is not set | ||
334 | 334 | ||
335 | # | 335 | # |
336 | # IP: Netfilter Configuration | 336 | # IP: Netfilter Configuration |
337 | # | 337 | # |
338 | # CONFIG_NF_DEFRAG_IPV4 is not set | ||
338 | # CONFIG_NF_CONNTRACK_IPV4 is not set | 339 | # CONFIG_NF_CONNTRACK_IPV4 is not set |
339 | # CONFIG_IP_NF_QUEUE is not set | 340 | # CONFIG_IP_NF_QUEUE is not set |
340 | # CONFIG_IP_NF_IPTABLES is not set | 341 | # CONFIG_IP_NF_IPTABLES is not set |
@@ -374,6 +375,7 @@ CONFIG_NET_SCH_CBQ=m | |||
374 | # CONFIG_NET_SCH_HTB is not set | 375 | # CONFIG_NET_SCH_HTB is not set |
375 | # CONFIG_NET_SCH_HFSC is not set | 376 | # CONFIG_NET_SCH_HFSC is not set |
376 | CONFIG_NET_SCH_PRIO=m | 377 | CONFIG_NET_SCH_PRIO=m |
378 | CONFIG_NET_SCH_MULTIQ=y | ||
377 | CONFIG_NET_SCH_RED=m | 379 | CONFIG_NET_SCH_RED=m |
378 | CONFIG_NET_SCH_SFQ=m | 380 | CONFIG_NET_SCH_SFQ=m |
379 | CONFIG_NET_SCH_TEQL=m | 381 | CONFIG_NET_SCH_TEQL=m |
@@ -406,6 +408,7 @@ CONFIG_NET_ACT_POLICE=y | |||
406 | CONFIG_NET_ACT_NAT=m | 408 | CONFIG_NET_ACT_NAT=m |
407 | # CONFIG_NET_ACT_PEDIT is not set | 409 | # CONFIG_NET_ACT_PEDIT is not set |
408 | # CONFIG_NET_ACT_SIMP is not set | 410 | # CONFIG_NET_ACT_SIMP is not set |
411 | # CONFIG_NET_ACT_SKBEDIT is not set | ||
409 | # CONFIG_NET_CLS_IND is not set | 412 | # CONFIG_NET_CLS_IND is not set |
410 | CONFIG_NET_SCH_FIFO=y | 413 | CONFIG_NET_SCH_FIFO=y |
411 | 414 | ||
@@ -424,6 +427,7 @@ CONFIG_CAN_BCM=m | |||
424 | CONFIG_CAN_VCAN=m | 427 | CONFIG_CAN_VCAN=m |
425 | # CONFIG_CAN_DEBUG_DEVICES is not set | 428 | # CONFIG_CAN_DEBUG_DEVICES is not set |
426 | # CONFIG_AF_RXRPC is not set | 429 | # CONFIG_AF_RXRPC is not set |
430 | # CONFIG_PHONET is not set | ||
427 | # CONFIG_RFKILL is not set | 431 | # CONFIG_RFKILL is not set |
428 | # CONFIG_NET_9P is not set | 432 | # CONFIG_NET_9P is not set |
429 | # CONFIG_PCMCIA is not set | 433 | # CONFIG_PCMCIA is not set |
@@ -473,7 +477,7 @@ CONFIG_VIRTIO_BLK=m | |||
473 | CONFIG_MISC_DEVICES=y | 477 | CONFIG_MISC_DEVICES=y |
474 | # CONFIG_EEPROM_93CX6 is not set | 478 | # CONFIG_EEPROM_93CX6 is not set |
475 | # CONFIG_ENCLOSURE_SERVICES is not set | 479 | # CONFIG_ENCLOSURE_SERVICES is not set |
476 | # CONFIG_HAVE_IDE is not set | 480 | # CONFIG_C2PORT is not set |
477 | 481 | ||
478 | # | 482 | # |
479 | # SCSI device support | 483 | # SCSI device support |
@@ -525,6 +529,7 @@ CONFIG_SCSI_DH_EMC=m | |||
525 | CONFIG_SCSI_DH_ALUA=m | 529 | CONFIG_SCSI_DH_ALUA=m |
526 | CONFIG_MD=y | 530 | CONFIG_MD=y |
527 | CONFIG_BLK_DEV_MD=y | 531 | CONFIG_BLK_DEV_MD=y |
532 | CONFIG_MD_AUTODETECT=y | ||
528 | CONFIG_MD_LINEAR=m | 533 | CONFIG_MD_LINEAR=m |
529 | CONFIG_MD_RAID0=m | 534 | CONFIG_MD_RAID0=m |
530 | CONFIG_MD_RAID1=m | 535 | CONFIG_MD_RAID1=m |
@@ -555,6 +560,9 @@ CONFIG_NET_ETHERNET=y | |||
555 | # CONFIG_IBM_NEW_EMAC_RGMII is not set | 560 | # CONFIG_IBM_NEW_EMAC_RGMII is not set |
556 | # CONFIG_IBM_NEW_EMAC_TAH is not set | 561 | # CONFIG_IBM_NEW_EMAC_TAH is not set |
557 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set | 562 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set |
563 | # CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set | ||
564 | # CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set | ||
565 | # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set | ||
558 | CONFIG_NETDEV_1000=y | 566 | CONFIG_NETDEV_1000=y |
559 | CONFIG_NETDEV_10000=y | 567 | CONFIG_NETDEV_10000=y |
560 | # CONFIG_TR is not set | 568 | # CONFIG_TR is not set |
@@ -632,13 +640,12 @@ CONFIG_S390_VMUR=m | |||
632 | # CONFIG_THERMAL is not set | 640 | # CONFIG_THERMAL is not set |
633 | # CONFIG_THERMAL_HWMON is not set | 641 | # CONFIG_THERMAL_HWMON is not set |
634 | # CONFIG_WATCHDOG is not set | 642 | # CONFIG_WATCHDOG is not set |
635 | 643 | # CONFIG_REGULATOR is not set | |
636 | # | ||
637 | # Sonics Silicon Backplane | ||
638 | # | ||
639 | # CONFIG_MEMSTICK is not set | 644 | # CONFIG_MEMSTICK is not set |
640 | # CONFIG_NEW_LEDS is not set | 645 | # CONFIG_NEW_LEDS is not set |
641 | CONFIG_ACCESSIBILITY=y | 646 | CONFIG_ACCESSIBILITY=y |
647 | # CONFIG_STAGING is not set | ||
648 | CONFIG_STAGING_EXCLUDE_BUILD=y | ||
642 | 649 | ||
643 | # | 650 | # |
644 | # File systems | 651 | # File systems |
@@ -650,13 +657,14 @@ CONFIG_EXT3_FS=y | |||
650 | CONFIG_EXT3_FS_XATTR=y | 657 | CONFIG_EXT3_FS_XATTR=y |
651 | # CONFIG_EXT3_FS_POSIX_ACL is not set | 658 | # CONFIG_EXT3_FS_POSIX_ACL is not set |
652 | # CONFIG_EXT3_FS_SECURITY is not set | 659 | # CONFIG_EXT3_FS_SECURITY is not set |
653 | # CONFIG_EXT4DEV_FS is not set | 660 | # CONFIG_EXT4_FS is not set |
654 | CONFIG_JBD=y | 661 | CONFIG_JBD=y |
655 | # CONFIG_JBD_DEBUG is not set | 662 | # CONFIG_JBD_DEBUG is not set |
656 | CONFIG_FS_MBCACHE=y | 663 | CONFIG_FS_MBCACHE=y |
657 | # CONFIG_REISERFS_FS is not set | 664 | # CONFIG_REISERFS_FS is not set |
658 | # CONFIG_JFS_FS is not set | 665 | # CONFIG_JFS_FS is not set |
659 | CONFIG_FS_POSIX_ACL=y | 666 | CONFIG_FS_POSIX_ACL=y |
667 | CONFIG_FILE_LOCKING=y | ||
660 | # CONFIG_XFS_FS is not set | 668 | # CONFIG_XFS_FS is not set |
661 | # CONFIG_GFS2_FS is not set | 669 | # CONFIG_GFS2_FS is not set |
662 | # CONFIG_OCFS2_FS is not set | 670 | # CONFIG_OCFS2_FS is not set |
@@ -688,6 +696,7 @@ CONFIG_GENERIC_ACL=y | |||
688 | CONFIG_PROC_FS=y | 696 | CONFIG_PROC_FS=y |
689 | CONFIG_PROC_KCORE=y | 697 | CONFIG_PROC_KCORE=y |
690 | CONFIG_PROC_SYSCTL=y | 698 | CONFIG_PROC_SYSCTL=y |
699 | CONFIG_PROC_PAGE_MONITOR=y | ||
691 | CONFIG_SYSFS=y | 700 | CONFIG_SYSFS=y |
692 | CONFIG_TMPFS=y | 701 | CONFIG_TMPFS=y |
693 | CONFIG_TMPFS_POSIX_ACL=y | 702 | CONFIG_TMPFS_POSIX_ACL=y |
@@ -728,6 +737,7 @@ CONFIG_LOCKD_V4=y | |||
728 | CONFIG_EXPORTFS=y | 737 | CONFIG_EXPORTFS=y |
729 | CONFIG_NFS_COMMON=y | 738 | CONFIG_NFS_COMMON=y |
730 | CONFIG_SUNRPC=y | 739 | CONFIG_SUNRPC=y |
740 | # CONFIG_SUNRPC_REGISTER_V4 is not set | ||
731 | # CONFIG_RPCSEC_GSS_KRB5 is not set | 741 | # CONFIG_RPCSEC_GSS_KRB5 is not set |
732 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | 742 | # CONFIG_RPCSEC_GSS_SPKM3 is not set |
733 | # CONFIG_SMB_FS is not set | 743 | # CONFIG_SMB_FS is not set |
@@ -800,12 +810,24 @@ CONFIG_DEBUG_MEMORY_INIT=y | |||
800 | # CONFIG_DEBUG_SG is not set | 810 | # CONFIG_DEBUG_SG is not set |
801 | # CONFIG_FRAME_POINTER is not set | 811 | # CONFIG_FRAME_POINTER is not set |
802 | # CONFIG_RCU_TORTURE_TEST is not set | 812 | # CONFIG_RCU_TORTURE_TEST is not set |
813 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | ||
803 | # CONFIG_KPROBES_SANITY_TEST is not set | 814 | # CONFIG_KPROBES_SANITY_TEST is not set |
804 | # CONFIG_BACKTRACE_SELF_TEST is not set | 815 | # CONFIG_BACKTRACE_SELF_TEST is not set |
816 | # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set | ||
805 | # CONFIG_LKDTM is not set | 817 | # CONFIG_LKDTM is not set |
806 | # CONFIG_FAULT_INJECTION is not set | 818 | # CONFIG_FAULT_INJECTION is not set |
807 | # CONFIG_LATENCYTOP is not set | 819 | # CONFIG_LATENCYTOP is not set |
808 | CONFIG_SYSCTL_SYSCALL_CHECK=y | 820 | CONFIG_SYSCTL_SYSCALL_CHECK=y |
821 | |||
822 | # | ||
823 | # Tracers | ||
824 | # | ||
825 | # CONFIG_IRQSOFF_TRACER is not set | ||
826 | # CONFIG_PREEMPT_TRACER is not set | ||
827 | # CONFIG_SCHED_TRACER is not set | ||
828 | # CONFIG_CONTEXT_SWITCH_TRACER is not set | ||
829 | # CONFIG_BOOT_TRACER is not set | ||
830 | # CONFIG_DYNAMIC_PRINTK_DEBUG is not set | ||
809 | CONFIG_SAMPLES=y | 831 | CONFIG_SAMPLES=y |
810 | # CONFIG_SAMPLE_KOBJECT is not set | 832 | # CONFIG_SAMPLE_KOBJECT is not set |
811 | # CONFIG_SAMPLE_KPROBES is not set | 833 | # CONFIG_SAMPLE_KPROBES is not set |
@@ -816,16 +838,19 @@ CONFIG_SAMPLES=y | |||
816 | # | 838 | # |
817 | # CONFIG_KEYS is not set | 839 | # CONFIG_KEYS is not set |
818 | # CONFIG_SECURITY is not set | 840 | # CONFIG_SECURITY is not set |
841 | # CONFIG_SECURITYFS is not set | ||
819 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | 842 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set |
820 | CONFIG_CRYPTO=y | 843 | CONFIG_CRYPTO=y |
821 | 844 | ||
822 | # | 845 | # |
823 | # Crypto core or helper | 846 | # Crypto core or helper |
824 | # | 847 | # |
848 | CONFIG_CRYPTO_FIPS=y | ||
825 | CONFIG_CRYPTO_ALGAPI=y | 849 | CONFIG_CRYPTO_ALGAPI=y |
826 | CONFIG_CRYPTO_AEAD=m | 850 | CONFIG_CRYPTO_AEAD=y |
827 | CONFIG_CRYPTO_BLKCIPHER=y | 851 | CONFIG_CRYPTO_BLKCIPHER=y |
828 | CONFIG_CRYPTO_HASH=m | 852 | CONFIG_CRYPTO_HASH=y |
853 | CONFIG_CRYPTO_RNG=y | ||
829 | CONFIG_CRYPTO_MANAGER=y | 854 | CONFIG_CRYPTO_MANAGER=y |
830 | CONFIG_CRYPTO_GF128MUL=m | 855 | CONFIG_CRYPTO_GF128MUL=m |
831 | # CONFIG_CRYPTO_NULL is not set | 856 | # CONFIG_CRYPTO_NULL is not set |
@@ -877,7 +902,7 @@ CONFIG_CRYPTO_SHA1=m | |||
877 | # | 902 | # |
878 | # Ciphers | 903 | # Ciphers |
879 | # | 904 | # |
880 | # CONFIG_CRYPTO_AES is not set | 905 | CONFIG_CRYPTO_AES=m |
881 | # CONFIG_CRYPTO_ANUBIS is not set | 906 | # CONFIG_CRYPTO_ANUBIS is not set |
882 | # CONFIG_CRYPTO_ARC4 is not set | 907 | # CONFIG_CRYPTO_ARC4 is not set |
883 | # CONFIG_CRYPTO_BLOWFISH is not set | 908 | # CONFIG_CRYPTO_BLOWFISH is not set |
@@ -898,6 +923,11 @@ CONFIG_CRYPTO_SEED=m | |||
898 | # | 923 | # |
899 | # CONFIG_CRYPTO_DEFLATE is not set | 924 | # CONFIG_CRYPTO_DEFLATE is not set |
900 | CONFIG_CRYPTO_LZO=m | 925 | CONFIG_CRYPTO_LZO=m |
926 | |||
927 | # | ||
928 | # Random Number Generation | ||
929 | # | ||
930 | CONFIG_CRYPTO_ANSI_CPRNG=m | ||
901 | CONFIG_CRYPTO_HW=y | 931 | CONFIG_CRYPTO_HW=y |
902 | CONFIG_ZCRYPT=m | 932 | CONFIG_ZCRYPT=m |
903 | # CONFIG_ZCRYPT_MONOLITHIC is not set | 933 | # CONFIG_ZCRYPT_MONOLITHIC is not set |
@@ -912,8 +942,6 @@ CONFIG_S390_PRNG=m | |||
912 | # Library routines | 942 | # Library routines |
913 | # | 943 | # |
914 | CONFIG_BITREVERSE=m | 944 | CONFIG_BITREVERSE=m |
915 | # CONFIG_GENERIC_FIND_FIRST_BIT is not set | ||
916 | # CONFIG_GENERIC_FIND_NEXT_BIT is not set | ||
917 | # CONFIG_CRC_CCITT is not set | 945 | # CONFIG_CRC_CCITT is not set |
918 | # CONFIG_CRC16 is not set | 946 | # CONFIG_CRC16 is not set |
919 | CONFIG_CRC_T10DIF=y | 947 | CONFIG_CRC_T10DIF=y |
diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h index 7fc76133b3e4..5caddd4f7bed 100644 --- a/arch/s390/include/asm/pgtable.h +++ b/arch/s390/include/asm/pgtable.h | |||
@@ -679,8 +679,6 @@ static inline void pmd_clear(pmd_t *pmd) | |||
679 | 679 | ||
680 | static inline void pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep) | 680 | static inline void pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep) |
681 | { | 681 | { |
682 | if (mm->context.has_pgste) | ||
683 | ptep_rcp_copy(ptep); | ||
684 | pte_val(*ptep) = _PAGE_TYPE_EMPTY; | 682 | pte_val(*ptep) = _PAGE_TYPE_EMPTY; |
685 | if (mm->context.noexec) | 683 | if (mm->context.noexec) |
686 | pte_val(ptep[PTRS_PER_PTE]) = _PAGE_TYPE_EMPTY; | 684 | pte_val(ptep[PTRS_PER_PTE]) = _PAGE_TYPE_EMPTY; |
diff --git a/arch/s390/include/asm/ptrace.h b/arch/s390/include/asm/ptrace.h index a7226f8143fb..5396f9f12263 100644 --- a/arch/s390/include/asm/ptrace.h +++ b/arch/s390/include/asm/ptrace.h | |||
@@ -321,8 +321,8 @@ struct pt_regs | |||
321 | psw_t psw; | 321 | psw_t psw; |
322 | unsigned long gprs[NUM_GPRS]; | 322 | unsigned long gprs[NUM_GPRS]; |
323 | unsigned long orig_gpr2; | 323 | unsigned long orig_gpr2; |
324 | unsigned short svcnr; | ||
324 | unsigned short ilc; | 325 | unsigned short ilc; |
325 | unsigned short trap; | ||
326 | }; | 326 | }; |
327 | #endif | 327 | #endif |
328 | 328 | ||
@@ -486,8 +486,6 @@ struct task_struct; | |||
486 | extern void user_enable_single_step(struct task_struct *); | 486 | extern void user_enable_single_step(struct task_struct *); |
487 | extern void user_disable_single_step(struct task_struct *); | 487 | extern void user_disable_single_step(struct task_struct *); |
488 | 488 | ||
489 | #define __ARCH_WANT_COMPAT_SYS_PTRACE | ||
490 | |||
491 | #define user_mode(regs) (((regs)->psw.mask & PSW_MASK_PSTATE) != 0) | 489 | #define user_mode(regs) (((regs)->psw.mask & PSW_MASK_PSTATE) != 0) |
492 | #define instruction_pointer(regs) ((regs)->psw.addr & PSW_ADDR_INSN) | 490 | #define instruction_pointer(regs) ((regs)->psw.addr & PSW_ADDR_INSN) |
493 | #define user_stack_pointer(regs)((regs)->gprs[15]) | 491 | #define user_stack_pointer(regs)((regs)->gprs[15]) |
diff --git a/arch/s390/include/asm/syscall.h b/arch/s390/include/asm/syscall.h index 6e623971fbb9..2429b87eb28d 100644 --- a/arch/s390/include/asm/syscall.h +++ b/arch/s390/include/asm/syscall.h | |||
@@ -17,9 +17,7 @@ | |||
17 | static inline long syscall_get_nr(struct task_struct *task, | 17 | static inline long syscall_get_nr(struct task_struct *task, |
18 | struct pt_regs *regs) | 18 | struct pt_regs *regs) |
19 | { | 19 | { |
20 | if (regs->trap != __LC_SVC_OLD_PSW) | 20 | return regs->svcnr ? regs->svcnr : -1; |
21 | return -1; | ||
22 | return regs->gprs[2]; | ||
23 | } | 21 | } |
24 | 22 | ||
25 | static inline void syscall_rollback(struct task_struct *task, | 23 | static inline void syscall_rollback(struct task_struct *task, |
@@ -52,18 +50,20 @@ static inline void syscall_get_arguments(struct task_struct *task, | |||
52 | unsigned int i, unsigned int n, | 50 | unsigned int i, unsigned int n, |
53 | unsigned long *args) | 51 | unsigned long *args) |
54 | { | 52 | { |
53 | unsigned long mask = -1UL; | ||
54 | |||
55 | BUG_ON(i + n > 6); | 55 | BUG_ON(i + n > 6); |
56 | #ifdef CONFIG_COMPAT | 56 | #ifdef CONFIG_COMPAT |
57 | if (test_tsk_thread_flag(task, TIF_31BIT)) { | 57 | if (test_tsk_thread_flag(task, TIF_31BIT)) |
58 | if (i + n == 6) | 58 | mask = 0xffffffff; |
59 | args[--n] = (u32) regs->args[0]; | ||
60 | while (n-- > 0) | ||
61 | args[n] = (u32) regs->gprs[2 + i + n]; | ||
62 | } | ||
63 | #endif | 59 | #endif |
64 | if (i + n == 6) | 60 | if (i + n == 6) |
65 | args[--n] = regs->args[0]; | 61 | args[--n] = regs->args[0] & mask; |
66 | memcpy(args, ®s->gprs[2 + i], n * sizeof(args[0])); | 62 | while (n-- > 0) |
63 | if (i + n > 0) | ||
64 | args[n] = regs->gprs[2 + i + n] & mask; | ||
65 | if (i == 0) | ||
66 | args[0] = regs->orig_gpr2 & mask; | ||
67 | } | 67 | } |
68 | 68 | ||
69 | static inline void syscall_set_arguments(struct task_struct *task, | 69 | static inline void syscall_set_arguments(struct task_struct *task, |
@@ -74,7 +74,11 @@ static inline void syscall_set_arguments(struct task_struct *task, | |||
74 | BUG_ON(i + n > 6); | 74 | BUG_ON(i + n > 6); |
75 | if (i + n == 6) | 75 | if (i + n == 6) |
76 | regs->args[0] = args[--n]; | 76 | regs->args[0] = args[--n]; |
77 | memcpy(®s->gprs[2 + i], args, n * sizeof(args[0])); | 77 | while (n-- > 0) |
78 | if (i + n > 0) | ||
79 | regs->gprs[2 + i + n] = args[n]; | ||
80 | if (i == 0) | ||
81 | regs->orig_gpr2 = args[0]; | ||
78 | } | 82 | } |
79 | 83 | ||
80 | #endif /* _ASM_SYSCALL_H */ | 84 | #endif /* _ASM_SYSCALL_H */ |
diff --git a/arch/s390/kernel/asm-offsets.c b/arch/s390/kernel/asm-offsets.c index fa28ecae636b..3d144e6020c6 100644 --- a/arch/s390/kernel/asm-offsets.c +++ b/arch/s390/kernel/asm-offsets.c | |||
@@ -32,7 +32,7 @@ int main(void) | |||
32 | DEFINE(__PT_GPRS, offsetof(struct pt_regs, gprs)); | 32 | DEFINE(__PT_GPRS, offsetof(struct pt_regs, gprs)); |
33 | DEFINE(__PT_ORIG_GPR2, offsetof(struct pt_regs, orig_gpr2)); | 33 | DEFINE(__PT_ORIG_GPR2, offsetof(struct pt_regs, orig_gpr2)); |
34 | DEFINE(__PT_ILC, offsetof(struct pt_regs, ilc)); | 34 | DEFINE(__PT_ILC, offsetof(struct pt_regs, ilc)); |
35 | DEFINE(__PT_TRAP, offsetof(struct pt_regs, trap)); | 35 | DEFINE(__PT_SVCNR, offsetof(struct pt_regs, svcnr)); |
36 | DEFINE(__PT_SIZE, sizeof(struct pt_regs)); | 36 | DEFINE(__PT_SIZE, sizeof(struct pt_regs)); |
37 | BLANK(); | 37 | BLANK(); |
38 | DEFINE(__SF_BACKCHAIN, offsetof(struct stack_frame, back_chain)); | 38 | DEFINE(__SF_BACKCHAIN, offsetof(struct stack_frame, back_chain)); |
diff --git a/arch/s390/kernel/compat_signal.c b/arch/s390/kernel/compat_signal.c index c7f02e777af2..b537cb0e9b55 100644 --- a/arch/s390/kernel/compat_signal.c +++ b/arch/s390/kernel/compat_signal.c | |||
@@ -340,7 +340,7 @@ static int restore_sigregs32(struct pt_regs *regs,_sigregs32 __user *sregs) | |||
340 | return err; | 340 | return err; |
341 | 341 | ||
342 | restore_fp_regs(¤t->thread.fp_regs); | 342 | restore_fp_regs(¤t->thread.fp_regs); |
343 | regs->trap = -1; /* disable syscall checks */ | 343 | regs->svcnr = 0; /* disable syscall checks */ |
344 | return 0; | 344 | return 0; |
345 | } | 345 | } |
346 | 346 | ||
diff --git a/arch/s390/kernel/entry.S b/arch/s390/kernel/entry.S index ed500ef799b7..198ea18a534d 100644 --- a/arch/s390/kernel/entry.S +++ b/arch/s390/kernel/entry.S | |||
@@ -46,7 +46,7 @@ SP_R14 = STACK_FRAME_OVERHEAD + __PT_GPRS + 56 | |||
46 | SP_R15 = STACK_FRAME_OVERHEAD + __PT_GPRS + 60 | 46 | SP_R15 = STACK_FRAME_OVERHEAD + __PT_GPRS + 60 |
47 | SP_ORIG_R2 = STACK_FRAME_OVERHEAD + __PT_ORIG_GPR2 | 47 | SP_ORIG_R2 = STACK_FRAME_OVERHEAD + __PT_ORIG_GPR2 |
48 | SP_ILC = STACK_FRAME_OVERHEAD + __PT_ILC | 48 | SP_ILC = STACK_FRAME_OVERHEAD + __PT_ILC |
49 | SP_TRAP = STACK_FRAME_OVERHEAD + __PT_TRAP | 49 | SP_SVCNR = STACK_FRAME_OVERHEAD + __PT_SVCNR |
50 | SP_SIZE = STACK_FRAME_OVERHEAD + __PT_SIZE | 50 | SP_SIZE = STACK_FRAME_OVERHEAD + __PT_SIZE |
51 | 51 | ||
52 | _TIF_WORK_SVC = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \ | 52 | _TIF_WORK_SVC = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \ |
@@ -61,22 +61,25 @@ STACK_SIZE = 1 << STACK_SHIFT | |||
61 | 61 | ||
62 | #ifdef CONFIG_TRACE_IRQFLAGS | 62 | #ifdef CONFIG_TRACE_IRQFLAGS |
63 | .macro TRACE_IRQS_ON | 63 | .macro TRACE_IRQS_ON |
64 | l %r1,BASED(.Ltrace_irq_on) | 64 | basr %r2,%r0 |
65 | l %r1,BASED(.Ltrace_irq_on_caller) | ||
65 | basr %r14,%r1 | 66 | basr %r14,%r1 |
66 | .endm | 67 | .endm |
67 | 68 | ||
68 | .macro TRACE_IRQS_OFF | 69 | .macro TRACE_IRQS_OFF |
69 | l %r1,BASED(.Ltrace_irq_off) | 70 | basr %r2,%r0 |
71 | l %r1,BASED(.Ltrace_irq_off_caller) | ||
70 | basr %r14,%r1 | 72 | basr %r14,%r1 |
71 | .endm | 73 | .endm |
72 | 74 | ||
73 | .macro TRACE_IRQS_CHECK | 75 | .macro TRACE_IRQS_CHECK |
76 | basr %r2,%r0 | ||
74 | tm SP_PSW(%r15),0x03 # irqs enabled? | 77 | tm SP_PSW(%r15),0x03 # irqs enabled? |
75 | jz 0f | 78 | jz 0f |
76 | l %r1,BASED(.Ltrace_irq_on) | 79 | l %r1,BASED(.Ltrace_irq_on_caller) |
77 | basr %r14,%r1 | 80 | basr %r14,%r1 |
78 | j 1f | 81 | j 1f |
79 | 0: l %r1,BASED(.Ltrace_irq_off) | 82 | 0: l %r1,BASED(.Ltrace_irq_off_caller) |
80 | basr %r14,%r1 | 83 | basr %r14,%r1 |
81 | 1: | 84 | 1: |
82 | .endm | 85 | .endm |
@@ -180,11 +183,10 @@ STACK_SIZE = 1 << STACK_SHIFT | |||
180 | .macro CREATE_STACK_FRAME psworg,savearea | 183 | .macro CREATE_STACK_FRAME psworg,savearea |
181 | s %r15,BASED(.Lc_spsize) # make room for registers & psw | 184 | s %r15,BASED(.Lc_spsize) # make room for registers & psw |
182 | mvc SP_PSW(8,%r15),0(%r12) # move user PSW to stack | 185 | mvc SP_PSW(8,%r15),0(%r12) # move user PSW to stack |
183 | la %r12,\psworg | ||
184 | st %r2,SP_ORIG_R2(%r15) # store original content of gpr 2 | 186 | st %r2,SP_ORIG_R2(%r15) # store original content of gpr 2 |
185 | icm %r12,12,__LC_SVC_ILC | 187 | icm %r12,3,__LC_SVC_ILC |
186 | stm %r0,%r11,SP_R0(%r15) # store gprs %r0-%r11 to kernel stack | 188 | stm %r0,%r11,SP_R0(%r15) # store gprs %r0-%r11 to kernel stack |
187 | st %r12,SP_ILC(%r15) | 189 | st %r12,SP_SVCNR(%r15) |
188 | mvc SP_R12(16,%r15),\savearea # move %r12-%r15 to stack | 190 | mvc SP_R12(16,%r15),\savearea # move %r12-%r15 to stack |
189 | la %r12,0 | 191 | la %r12,0 |
190 | st %r12,__SF_BACKCHAIN(%r15) # clear back chain | 192 | st %r12,__SF_BACKCHAIN(%r15) # clear back chain |
@@ -261,16 +263,17 @@ sysc_update: | |||
261 | #endif | 263 | #endif |
262 | sysc_do_svc: | 264 | sysc_do_svc: |
263 | l %r9,__LC_THREAD_INFO # load pointer to thread_info struct | 265 | l %r9,__LC_THREAD_INFO # load pointer to thread_info struct |
264 | sla %r7,2 # *4 and test for svc 0 | 266 | ltr %r7,%r7 # test for svc 0 |
265 | bnz BASED(sysc_nr_ok) # svc number > 0 | 267 | bnz BASED(sysc_nr_ok) # svc number > 0 |
266 | # svc 0: system call number in %r1 | 268 | # svc 0: system call number in %r1 |
267 | cl %r1,BASED(.Lnr_syscalls) | 269 | cl %r1,BASED(.Lnr_syscalls) |
268 | bnl BASED(sysc_nr_ok) | 270 | bnl BASED(sysc_nr_ok) |
269 | lr %r7,%r1 # copy svc number to %r7 | 271 | lr %r7,%r1 # copy svc number to %r7 |
270 | sla %r7,2 # *4 | ||
271 | sysc_nr_ok: | 272 | sysc_nr_ok: |
272 | mvc SP_ARGS(4,%r15),SP_R7(%r15) | 273 | mvc SP_ARGS(4,%r15),SP_R7(%r15) |
273 | sysc_do_restart: | 274 | sysc_do_restart: |
275 | sth %r7,SP_SVCNR(%r15) | ||
276 | sll %r7,2 # svc number *4 | ||
274 | l %r8,BASED(.Lsysc_table) | 277 | l %r8,BASED(.Lsysc_table) |
275 | tm __TI_flags+3(%r9),(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT) | 278 | tm __TI_flags+3(%r9),(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT) |
276 | l %r8,0(%r7,%r8) # get system call addr. | 279 | l %r8,0(%r7,%r8) # get system call addr. |
@@ -373,7 +376,6 @@ sysc_notify_resume: | |||
373 | sysc_restart: | 376 | sysc_restart: |
374 | ni __TI_flags+3(%r9),255-_TIF_RESTART_SVC # clear TIF_RESTART_SVC | 377 | ni __TI_flags+3(%r9),255-_TIF_RESTART_SVC # clear TIF_RESTART_SVC |
375 | l %r7,SP_R2(%r15) # load new svc number | 378 | l %r7,SP_R2(%r15) # load new svc number |
376 | sla %r7,2 | ||
377 | mvc SP_R2(4,%r15),SP_ORIG_R2(%r15) # restore first argument | 379 | mvc SP_R2(4,%r15),SP_ORIG_R2(%r15) # restore first argument |
378 | lm %r2,%r6,SP_R2(%r15) # load svc arguments | 380 | lm %r2,%r6,SP_R2(%r15) # load svc arguments |
379 | b BASED(sysc_do_restart) # restart svc | 381 | b BASED(sysc_do_restart) # restart svc |
@@ -383,7 +385,8 @@ sysc_restart: | |||
383 | # | 385 | # |
384 | sysc_singlestep: | 386 | sysc_singlestep: |
385 | ni __TI_flags+3(%r9),255-_TIF_SINGLE_STEP # clear TIF_SINGLE_STEP | 387 | ni __TI_flags+3(%r9),255-_TIF_SINGLE_STEP # clear TIF_SINGLE_STEP |
386 | mvi SP_TRAP+1(%r15),0x28 # set trap indication to pgm check | 388 | mvi SP_SVCNR(%r15),0xff # set trap indication to pgm check |
389 | mvi SP_SVCNR+1(%r15),0xff | ||
387 | la %r2,SP_PTREGS(%r15) # address of register-save area | 390 | la %r2,SP_PTREGS(%r15) # address of register-save area |
388 | l %r1,BASED(.Lhandle_per) # load adr. of per handler | 391 | l %r1,BASED(.Lhandle_per) # load adr. of per handler |
389 | la %r14,BASED(sysc_return) # load adr. of system return | 392 | la %r14,BASED(sysc_return) # load adr. of system return |
@@ -404,7 +407,7 @@ sysc_tracesys: | |||
404 | bnl BASED(sysc_tracenogo) | 407 | bnl BASED(sysc_tracenogo) |
405 | l %r8,BASED(.Lsysc_table) | 408 | l %r8,BASED(.Lsysc_table) |
406 | lr %r7,%r2 | 409 | lr %r7,%r2 |
407 | sll %r7,2 # *4 | 410 | sll %r7,2 # svc number *4 |
408 | l %r8,0(%r7,%r8) | 411 | l %r8,0(%r7,%r8) |
409 | sysc_tracego: | 412 | sysc_tracego: |
410 | lm %r3,%r6,SP_R3(%r15) | 413 | lm %r3,%r6,SP_R3(%r15) |
@@ -583,7 +586,8 @@ pgm_svcper: | |||
583 | # per was called from kernel, must be kprobes | 586 | # per was called from kernel, must be kprobes |
584 | # | 587 | # |
585 | kernel_per: | 588 | kernel_per: |
586 | mvi SP_TRAP+1(%r15),0x28 # set trap indication to pgm check | 589 | mvi SP_SVCNR(%r15),0xff # set trap indication to pgm check |
590 | mvi SP_SVCNR+1(%r15),0xff | ||
587 | la %r2,SP_PTREGS(%r15) # address of register-save area | 591 | la %r2,SP_PTREGS(%r15) # address of register-save area |
588 | l %r1,BASED(.Lhandle_per) # load adr. of per handler | 592 | l %r1,BASED(.Lhandle_per) # load adr. of per handler |
589 | la %r14,BASED(sysc_restore)# load adr. of system return | 593 | la %r14,BASED(sysc_restore)# load adr. of system return |
@@ -1113,9 +1117,12 @@ cleanup_io_leave_insn: | |||
1113 | .Lschedtail: .long schedule_tail | 1117 | .Lschedtail: .long schedule_tail |
1114 | .Lsysc_table: .long sys_call_table | 1118 | .Lsysc_table: .long sys_call_table |
1115 | #ifdef CONFIG_TRACE_IRQFLAGS | 1119 | #ifdef CONFIG_TRACE_IRQFLAGS |
1116 | .Ltrace_irq_on: .long trace_hardirqs_on | 1120 | .Ltrace_irq_on_caller: |
1117 | .Ltrace_irq_off: | 1121 | .long trace_hardirqs_on_caller |
1118 | .long trace_hardirqs_off | 1122 | .Ltrace_irq_off_caller: |
1123 | .long trace_hardirqs_off_caller | ||
1124 | #endif | ||
1125 | #ifdef CONFIG_LOCKDEP | ||
1119 | .Llockdep_sys_exit: | 1126 | .Llockdep_sys_exit: |
1120 | .long lockdep_sys_exit | 1127 | .long lockdep_sys_exit |
1121 | #endif | 1128 | #endif |
diff --git a/arch/s390/kernel/entry64.S b/arch/s390/kernel/entry64.S index d7ce150453f2..89c121ae6339 100644 --- a/arch/s390/kernel/entry64.S +++ b/arch/s390/kernel/entry64.S | |||
@@ -46,7 +46,7 @@ SP_R14 = STACK_FRAME_OVERHEAD + __PT_GPRS + 112 | |||
46 | SP_R15 = STACK_FRAME_OVERHEAD + __PT_GPRS + 120 | 46 | SP_R15 = STACK_FRAME_OVERHEAD + __PT_GPRS + 120 |
47 | SP_ORIG_R2 = STACK_FRAME_OVERHEAD + __PT_ORIG_GPR2 | 47 | SP_ORIG_R2 = STACK_FRAME_OVERHEAD + __PT_ORIG_GPR2 |
48 | SP_ILC = STACK_FRAME_OVERHEAD + __PT_ILC | 48 | SP_ILC = STACK_FRAME_OVERHEAD + __PT_ILC |
49 | SP_TRAP = STACK_FRAME_OVERHEAD + __PT_TRAP | 49 | SP_SVCNR = STACK_FRAME_OVERHEAD + __PT_SVCNR |
50 | SP_SIZE = STACK_FRAME_OVERHEAD + __PT_SIZE | 50 | SP_SIZE = STACK_FRAME_OVERHEAD + __PT_SIZE |
51 | 51 | ||
52 | STACK_SHIFT = PAGE_SHIFT + THREAD_ORDER | 52 | STACK_SHIFT = PAGE_SHIFT + THREAD_ORDER |
@@ -61,19 +61,22 @@ _TIF_WORK_INT = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \ | |||
61 | 61 | ||
62 | #ifdef CONFIG_TRACE_IRQFLAGS | 62 | #ifdef CONFIG_TRACE_IRQFLAGS |
63 | .macro TRACE_IRQS_ON | 63 | .macro TRACE_IRQS_ON |
64 | brasl %r14,trace_hardirqs_on | 64 | basr %r2,%r0 |
65 | brasl %r14,trace_hardirqs_on_caller | ||
65 | .endm | 66 | .endm |
66 | 67 | ||
67 | .macro TRACE_IRQS_OFF | 68 | .macro TRACE_IRQS_OFF |
68 | brasl %r14,trace_hardirqs_off | 69 | basr %r2,%r0 |
70 | brasl %r14,trace_hardirqs_off_caller | ||
69 | .endm | 71 | .endm |
70 | 72 | ||
71 | .macro TRACE_IRQS_CHECK | 73 | .macro TRACE_IRQS_CHECK |
74 | basr %r2,%r0 | ||
72 | tm SP_PSW(%r15),0x03 # irqs enabled? | 75 | tm SP_PSW(%r15),0x03 # irqs enabled? |
73 | jz 0f | 76 | jz 0f |
74 | brasl %r14,trace_hardirqs_on | 77 | brasl %r14,trace_hardirqs_on_caller |
75 | j 1f | 78 | j 1f |
76 | 0: brasl %r14,trace_hardirqs_off | 79 | 0: brasl %r14,trace_hardirqs_off_caller |
77 | 1: | 80 | 1: |
78 | .endm | 81 | .endm |
79 | #else | 82 | #else |
@@ -168,11 +171,10 @@ _TIF_WORK_INT = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \ | |||
168 | .macro CREATE_STACK_FRAME psworg,savearea | 171 | .macro CREATE_STACK_FRAME psworg,savearea |
169 | aghi %r15,-SP_SIZE # make room for registers & psw | 172 | aghi %r15,-SP_SIZE # make room for registers & psw |
170 | mvc SP_PSW(16,%r15),0(%r12) # move user PSW to stack | 173 | mvc SP_PSW(16,%r15),0(%r12) # move user PSW to stack |
171 | la %r12,\psworg | ||
172 | stg %r2,SP_ORIG_R2(%r15) # store original content of gpr 2 | 174 | stg %r2,SP_ORIG_R2(%r15) # store original content of gpr 2 |
173 | icm %r12,12,__LC_SVC_ILC | 175 | icm %r12,3,__LC_SVC_ILC |
174 | stmg %r0,%r11,SP_R0(%r15) # store gprs %r0-%r11 to kernel stack | 176 | stmg %r0,%r11,SP_R0(%r15) # store gprs %r0-%r11 to kernel stack |
175 | st %r12,SP_ILC(%r15) | 177 | st %r12,SP_SVCNR(%r15) |
176 | mvc SP_R12(32,%r15),\savearea # move %r12-%r15 to stack | 178 | mvc SP_R12(32,%r15),\savearea # move %r12-%r15 to stack |
177 | la %r12,0 | 179 | la %r12,0 |
178 | stg %r12,__SF_BACKCHAIN(%r15) | 180 | stg %r12,__SF_BACKCHAIN(%r15) |
@@ -247,16 +249,17 @@ sysc_update: | |||
247 | #endif | 249 | #endif |
248 | sysc_do_svc: | 250 | sysc_do_svc: |
249 | lg %r9,__LC_THREAD_INFO # load pointer to thread_info struct | 251 | lg %r9,__LC_THREAD_INFO # load pointer to thread_info struct |
250 | slag %r7,%r7,2 # *4 and test for svc 0 | 252 | ltgr %r7,%r7 # test for svc 0 |
251 | jnz sysc_nr_ok | 253 | jnz sysc_nr_ok |
252 | # svc 0: system call number in %r1 | 254 | # svc 0: system call number in %r1 |
253 | cl %r1,BASED(.Lnr_syscalls) | 255 | cl %r1,BASED(.Lnr_syscalls) |
254 | jnl sysc_nr_ok | 256 | jnl sysc_nr_ok |
255 | lgfr %r7,%r1 # clear high word in r1 | 257 | lgfr %r7,%r1 # clear high word in r1 |
256 | slag %r7,%r7,2 # svc 0: system call number in %r1 | ||
257 | sysc_nr_ok: | 258 | sysc_nr_ok: |
258 | mvc SP_ARGS(8,%r15),SP_R7(%r15) | 259 | mvc SP_ARGS(8,%r15),SP_R7(%r15) |
259 | sysc_do_restart: | 260 | sysc_do_restart: |
261 | sth %r7,SP_SVCNR(%r15) | ||
262 | sllg %r7,%r7,2 # svc number * 4 | ||
260 | larl %r10,sys_call_table | 263 | larl %r10,sys_call_table |
261 | #ifdef CONFIG_COMPAT | 264 | #ifdef CONFIG_COMPAT |
262 | tm __TI_flags+5(%r9),(_TIF_31BIT>>16) # running in 31 bit mode ? | 265 | tm __TI_flags+5(%r9),(_TIF_31BIT>>16) # running in 31 bit mode ? |
@@ -360,7 +363,6 @@ sysc_notify_resume: | |||
360 | sysc_restart: | 363 | sysc_restart: |
361 | ni __TI_flags+7(%r9),255-_TIF_RESTART_SVC # clear TIF_RESTART_SVC | 364 | ni __TI_flags+7(%r9),255-_TIF_RESTART_SVC # clear TIF_RESTART_SVC |
362 | lg %r7,SP_R2(%r15) # load new svc number | 365 | lg %r7,SP_R2(%r15) # load new svc number |
363 | slag %r7,%r7,2 # *4 | ||
364 | mvc SP_R2(8,%r15),SP_ORIG_R2(%r15) # restore first argument | 366 | mvc SP_R2(8,%r15),SP_ORIG_R2(%r15) # restore first argument |
365 | lmg %r2,%r6,SP_R2(%r15) # load svc arguments | 367 | lmg %r2,%r6,SP_R2(%r15) # load svc arguments |
366 | j sysc_do_restart # restart svc | 368 | j sysc_do_restart # restart svc |
@@ -369,9 +371,8 @@ sysc_restart: | |||
369 | # _TIF_SINGLE_STEP is set, call do_single_step | 371 | # _TIF_SINGLE_STEP is set, call do_single_step |
370 | # | 372 | # |
371 | sysc_singlestep: | 373 | sysc_singlestep: |
372 | ni __TI_flags+7(%r9),255-_TIF_SINGLE_STEP # clear TIF_SINGLE_STEP | 374 | ni __TI_flags+7(%r9),255-_TIF_SINGLE_STEP # clear TIF_SINGLE_STEP |
373 | lhi %r0,__LC_PGM_OLD_PSW | 375 | xc SP_SVCNR(2,%r15),SP_SVCNR(%r15) # clear svc number |
374 | sth %r0,SP_TRAP(%r15) # set trap indication to pgm check | ||
375 | la %r2,SP_PTREGS(%r15) # address of register-save area | 376 | la %r2,SP_PTREGS(%r15) # address of register-save area |
376 | larl %r14,sysc_return # load adr. of system return | 377 | larl %r14,sysc_return # load adr. of system return |
377 | jg do_single_step # branch to do_sigtrap | 378 | jg do_single_step # branch to do_sigtrap |
@@ -389,7 +390,7 @@ sysc_tracesys: | |||
389 | lghi %r0,NR_syscalls | 390 | lghi %r0,NR_syscalls |
390 | clgr %r0,%r2 | 391 | clgr %r0,%r2 |
391 | jnh sysc_tracenogo | 392 | jnh sysc_tracenogo |
392 | slag %r7,%r2,2 # *4 | 393 | sllg %r7,%r2,2 # svc number *4 |
393 | lgf %r8,0(%r7,%r10) | 394 | lgf %r8,0(%r7,%r10) |
394 | sysc_tracego: | 395 | sysc_tracego: |
395 | lmg %r3,%r6,SP_R3(%r15) | 396 | lmg %r3,%r6,SP_R3(%r15) |
@@ -564,8 +565,7 @@ pgm_svcper: | |||
564 | # per was called from kernel, must be kprobes | 565 | # per was called from kernel, must be kprobes |
565 | # | 566 | # |
566 | kernel_per: | 567 | kernel_per: |
567 | lhi %r0,__LC_PGM_OLD_PSW | 568 | xc SP_SVCNR(2,%r15),SP_SVCNR(%r15) # clear svc number |
568 | sth %r0,SP_TRAP(%r15) # set trap indication to pgm check | ||
569 | la %r2,SP_PTREGS(%r15) # address of register-save area | 569 | la %r2,SP_PTREGS(%r15) # address of register-save area |
570 | larl %r14,sysc_restore # load adr. of system ret, no work | 570 | larl %r14,sysc_restore # load adr. of system ret, no work |
571 | jg do_single_step # branch to do_single_step | 571 | jg do_single_step # branch to do_single_step |
diff --git a/arch/s390/kernel/init_task.c b/arch/s390/kernel/init_task.c index 7ad003969251..e80716843619 100644 --- a/arch/s390/kernel/init_task.c +++ b/arch/s390/kernel/init_task.c | |||
@@ -26,7 +26,7 @@ EXPORT_SYMBOL(init_mm); | |||
26 | /* | 26 | /* |
27 | * Initial thread structure. | 27 | * Initial thread structure. |
28 | * | 28 | * |
29 | * We need to make sure that this is 8192-byte aligned due to the | 29 | * We need to make sure that this is THREAD_SIZE aligned due to the |
30 | * way process stacks are handled. This is done by having a special | 30 | * way process stacks are handled. This is done by having a special |
31 | * "init_task" linker map entry.. | 31 | * "init_task" linker map entry.. |
32 | */ | 32 | */ |
diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c index 3e2c05cb6a87..04f8c67a6101 100644 --- a/arch/s390/kernel/process.c +++ b/arch/s390/kernel/process.c | |||
@@ -136,9 +136,12 @@ static void default_idle(void) | |||
136 | return; | 136 | return; |
137 | } | 137 | } |
138 | trace_hardirqs_on(); | 138 | trace_hardirqs_on(); |
139 | /* Don't trace preempt off for idle. */ | ||
140 | stop_critical_timings(); | ||
139 | /* Wait for external, I/O or machine check interrupt. */ | 141 | /* Wait for external, I/O or machine check interrupt. */ |
140 | __load_psw_mask(psw_kernel_bits | PSW_MASK_WAIT | | 142 | __load_psw_mask(psw_kernel_bits | PSW_MASK_WAIT | |
141 | PSW_MASK_IO | PSW_MASK_EXT); | 143 | PSW_MASK_IO | PSW_MASK_EXT); |
144 | start_critical_timings(); | ||
142 | } | 145 | } |
143 | 146 | ||
144 | void cpu_idle(void) | 147 | void cpu_idle(void) |
diff --git a/arch/s390/kernel/ptrace.c b/arch/s390/kernel/ptrace.c index 1f31be1ecc4b..38ff2bce1203 100644 --- a/arch/s390/kernel/ptrace.c +++ b/arch/s390/kernel/ptrace.c | |||
@@ -657,7 +657,7 @@ asmlinkage long do_syscall_trace_enter(struct pt_regs *regs) | |||
657 | * debugger stored an invalid system call number. Skip | 657 | * debugger stored an invalid system call number. Skip |
658 | * the system call and the system call restart handling. | 658 | * the system call and the system call restart handling. |
659 | */ | 659 | */ |
660 | regs->trap = -1; | 660 | regs->svcnr = 0; |
661 | ret = -1; | 661 | ret = -1; |
662 | } | 662 | } |
663 | 663 | ||
diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c index 62122bad1e33..400b040df7fa 100644 --- a/arch/s390/kernel/setup.c +++ b/arch/s390/kernel/setup.c | |||
@@ -604,13 +604,13 @@ setup_memory(void) | |||
604 | if (memory_chunk[i].type != CHUNK_READ_WRITE) | 604 | if (memory_chunk[i].type != CHUNK_READ_WRITE) |
605 | continue; | 605 | continue; |
606 | start_chunk = PFN_DOWN(memory_chunk[i].addr); | 606 | start_chunk = PFN_DOWN(memory_chunk[i].addr); |
607 | end_chunk = start_chunk + PFN_DOWN(memory_chunk[i].size) - 1; | 607 | end_chunk = start_chunk + PFN_DOWN(memory_chunk[i].size); |
608 | end_chunk = min(end_chunk, end_pfn); | 608 | end_chunk = min(end_chunk, end_pfn); |
609 | if (start_chunk >= end_chunk) | 609 | if (start_chunk >= end_chunk) |
610 | continue; | 610 | continue; |
611 | add_active_range(0, start_chunk, end_chunk); | 611 | add_active_range(0, start_chunk, end_chunk); |
612 | pfn = max(start_chunk, start_pfn); | 612 | pfn = max(start_chunk, start_pfn); |
613 | for (; pfn <= end_chunk; pfn++) | 613 | for (; pfn < end_chunk; pfn++) |
614 | page_set_storage_key(PFN_PHYS(pfn), PAGE_DEFAULT_KEY); | 614 | page_set_storage_key(PFN_PHYS(pfn), PAGE_DEFAULT_KEY); |
615 | } | 615 | } |
616 | 616 | ||
diff --git a/arch/s390/kernel/signal.c b/arch/s390/kernel/signal.c index 4f7fc3059a8e..8e6812a22670 100644 --- a/arch/s390/kernel/signal.c +++ b/arch/s390/kernel/signal.c | |||
@@ -160,7 +160,7 @@ static int restore_sigregs(struct pt_regs *regs, _sigregs __user *sregs) | |||
160 | current->thread.fp_regs.fpc &= FPC_VALID_MASK; | 160 | current->thread.fp_regs.fpc &= FPC_VALID_MASK; |
161 | 161 | ||
162 | restore_fp_regs(¤t->thread.fp_regs); | 162 | restore_fp_regs(¤t->thread.fp_regs); |
163 | regs->trap = -1; /* disable syscall checks */ | 163 | regs->svcnr = 0; /* disable syscall checks */ |
164 | return 0; | 164 | return 0; |
165 | } | 165 | } |
166 | 166 | ||
@@ -445,7 +445,7 @@ void do_signal(struct pt_regs *regs) | |||
445 | oldset = ¤t->blocked; | 445 | oldset = ¤t->blocked; |
446 | 446 | ||
447 | /* Are we from a system call? */ | 447 | /* Are we from a system call? */ |
448 | if (regs->trap == __LC_SVC_OLD_PSW) { | 448 | if (regs->svcnr) { |
449 | continue_addr = regs->psw.addr; | 449 | continue_addr = regs->psw.addr; |
450 | restart_addr = continue_addr - regs->ilc; | 450 | restart_addr = continue_addr - regs->ilc; |
451 | retval = regs->gprs[2]; | 451 | retval = regs->gprs[2]; |
@@ -462,7 +462,7 @@ void do_signal(struct pt_regs *regs) | |||
462 | case -ERESTART_RESTARTBLOCK: | 462 | case -ERESTART_RESTARTBLOCK: |
463 | regs->gprs[2] = -EINTR; | 463 | regs->gprs[2] = -EINTR; |
464 | } | 464 | } |
465 | regs->trap = -1; /* Don't deal with this again. */ | 465 | regs->svcnr = 0; /* Don't deal with this again. */ |
466 | } | 466 | } |
467 | 467 | ||
468 | /* Get signal to deliver. When running under ptrace, at this point | 468 | /* Get signal to deliver. When running under ptrace, at this point |
diff --git a/arch/s390/kernel/sys_s390.c b/arch/s390/kernel/sys_s390.c index 5fdb799062b7..4fe952e557ac 100644 --- a/arch/s390/kernel/sys_s390.c +++ b/arch/s390/kernel/sys_s390.c | |||
@@ -198,7 +198,7 @@ asmlinkage long s390x_newuname(struct new_utsname __user *name) | |||
198 | { | 198 | { |
199 | int ret = sys_newuname(name); | 199 | int ret = sys_newuname(name); |
200 | 200 | ||
201 | if (current->personality == PER_LINUX32 && !ret) { | 201 | if (personality(current->personality) == PER_LINUX32 && !ret) { |
202 | ret = copy_to_user(name->machine, "s390\0\0\0\0", 8); | 202 | ret = copy_to_user(name->machine, "s390\0\0\0\0", 8); |
203 | if (ret) ret = -EFAULT; | 203 | if (ret) ret = -EFAULT; |
204 | } | 204 | } |
diff --git a/arch/s390/kernel/time.c b/arch/s390/kernel/time.c index b94e9e3b694a..eccefbbff887 100644 --- a/arch/s390/kernel/time.c +++ b/arch/s390/kernel/time.c | |||
@@ -59,7 +59,7 @@ | |||
59 | 59 | ||
60 | static ext_int_info_t ext_int_info_cc; | 60 | static ext_int_info_t ext_int_info_cc; |
61 | static ext_int_info_t ext_int_etr_cc; | 61 | static ext_int_info_t ext_int_etr_cc; |
62 | static u64 jiffies_timer_cc; | 62 | static u64 sched_clock_base_cc; |
63 | 63 | ||
64 | static DEFINE_PER_CPU(struct clock_event_device, comparators); | 64 | static DEFINE_PER_CPU(struct clock_event_device, comparators); |
65 | 65 | ||
@@ -68,7 +68,7 @@ static DEFINE_PER_CPU(struct clock_event_device, comparators); | |||
68 | */ | 68 | */ |
69 | unsigned long long sched_clock(void) | 69 | unsigned long long sched_clock(void) |
70 | { | 70 | { |
71 | return ((get_clock_xt() - jiffies_timer_cc) * 125) >> 9; | 71 | return ((get_clock_xt() - sched_clock_base_cc) * 125) >> 9; |
72 | } | 72 | } |
73 | 73 | ||
74 | /* | 74 | /* |
@@ -229,13 +229,10 @@ static struct clocksource clocksource_tod = { | |||
229 | */ | 229 | */ |
230 | void __init time_init(void) | 230 | void __init time_init(void) |
231 | { | 231 | { |
232 | u64 init_timer_cc; | 232 | sched_clock_base_cc = reset_tod_clock(); |
233 | |||
234 | init_timer_cc = reset_tod_clock(); | ||
235 | jiffies_timer_cc = init_timer_cc - jiffies_64 * CLK_TICKS_PER_JIFFY; | ||
236 | 233 | ||
237 | /* set xtime */ | 234 | /* set xtime */ |
238 | tod_to_timeval(init_timer_cc - TOD_UNIX_EPOCH, &xtime); | 235 | tod_to_timeval(sched_clock_base_cc - TOD_UNIX_EPOCH, &xtime); |
239 | set_normalized_timespec(&wall_to_monotonic, | 236 | set_normalized_timespec(&wall_to_monotonic, |
240 | -xtime.tv_sec, -xtime.tv_nsec); | 237 | -xtime.tv_sec, -xtime.tv_nsec); |
241 | 238 | ||
@@ -289,7 +286,7 @@ static unsigned long long adjust_time(unsigned long long old, | |||
289 | delta = -delta; | 286 | delta = -delta; |
290 | adjust.offset = -ticks * (1000000 / HZ); | 287 | adjust.offset = -ticks * (1000000 / HZ); |
291 | } | 288 | } |
292 | jiffies_timer_cc += delta; | 289 | sched_clock_base_cc += delta; |
293 | if (adjust.offset != 0) { | 290 | if (adjust.offset != 0) { |
294 | printk(KERN_NOTICE "etr: time adjusted by %li micro-seconds\n", | 291 | printk(KERN_NOTICE "etr: time adjusted by %li micro-seconds\n", |
295 | adjust.offset); | 292 | adjust.offset); |
diff --git a/arch/s390/kernel/topology.c b/arch/s390/kernel/topology.c index 632b13e10053..a947899dcba1 100644 --- a/arch/s390/kernel/topology.c +++ b/arch/s390/kernel/topology.c | |||
@@ -65,18 +65,21 @@ static int machine_has_topology_irq; | |||
65 | static struct timer_list topology_timer; | 65 | static struct timer_list topology_timer; |
66 | static void set_topology_timer(void); | 66 | static void set_topology_timer(void); |
67 | static DECLARE_WORK(topology_work, topology_work_fn); | 67 | static DECLARE_WORK(topology_work, topology_work_fn); |
68 | /* topology_lock protects the core linked list */ | ||
69 | static DEFINE_SPINLOCK(topology_lock); | ||
68 | 70 | ||
69 | cpumask_t cpu_core_map[NR_CPUS]; | 71 | cpumask_t cpu_core_map[NR_CPUS]; |
70 | 72 | ||
71 | cpumask_t cpu_coregroup_map(unsigned int cpu) | 73 | cpumask_t cpu_coregroup_map(unsigned int cpu) |
72 | { | 74 | { |
73 | struct core_info *core = &core_info; | 75 | struct core_info *core = &core_info; |
76 | unsigned long flags; | ||
74 | cpumask_t mask; | 77 | cpumask_t mask; |
75 | 78 | ||
76 | cpus_clear(mask); | 79 | cpus_clear(mask); |
77 | if (!machine_has_topology) | 80 | if (!machine_has_topology) |
78 | return cpu_present_map; | 81 | return cpu_present_map; |
79 | mutex_lock(&smp_cpu_state_mutex); | 82 | spin_lock_irqsave(&topology_lock, flags); |
80 | while (core) { | 83 | while (core) { |
81 | if (cpu_isset(cpu, core->mask)) { | 84 | if (cpu_isset(cpu, core->mask)) { |
82 | mask = core->mask; | 85 | mask = core->mask; |
@@ -84,7 +87,7 @@ cpumask_t cpu_coregroup_map(unsigned int cpu) | |||
84 | } | 87 | } |
85 | core = core->next; | 88 | core = core->next; |
86 | } | 89 | } |
87 | mutex_unlock(&smp_cpu_state_mutex); | 90 | spin_unlock_irqrestore(&topology_lock, flags); |
88 | if (cpus_empty(mask)) | 91 | if (cpus_empty(mask)) |
89 | mask = cpumask_of_cpu(cpu); | 92 | mask = cpumask_of_cpu(cpu); |
90 | return mask; | 93 | return mask; |
@@ -133,7 +136,7 @@ static void tl_to_cores(struct tl_info *info) | |||
133 | union tl_entry *tle, *end; | 136 | union tl_entry *tle, *end; |
134 | struct core_info *core = &core_info; | 137 | struct core_info *core = &core_info; |
135 | 138 | ||
136 | mutex_lock(&smp_cpu_state_mutex); | 139 | spin_lock_irq(&topology_lock); |
137 | clear_cores(); | 140 | clear_cores(); |
138 | tle = info->tle; | 141 | tle = info->tle; |
139 | end = (union tl_entry *)((unsigned long)info + info->length); | 142 | end = (union tl_entry *)((unsigned long)info + info->length); |
@@ -157,7 +160,7 @@ static void tl_to_cores(struct tl_info *info) | |||
157 | } | 160 | } |
158 | tle = next_tle(tle); | 161 | tle = next_tle(tle); |
159 | } | 162 | } |
160 | mutex_unlock(&smp_cpu_state_mutex); | 163 | spin_unlock_irq(&topology_lock); |
161 | } | 164 | } |
162 | 165 | ||
163 | static void topology_update_polarization_simple(void) | 166 | static void topology_update_polarization_simple(void) |
diff --git a/arch/s390/kernel/vmlinux.lds.S b/arch/s390/kernel/vmlinux.lds.S index 607bd67a18ce..d796d05c9c01 100644 --- a/arch/s390/kernel/vmlinux.lds.S +++ b/arch/s390/kernel/vmlinux.lds.S | |||
@@ -2,6 +2,7 @@ | |||
2 | * Written by Martin Schwidefsky (schwidefsky@de.ibm.com) | 2 | * Written by Martin Schwidefsky (schwidefsky@de.ibm.com) |
3 | */ | 3 | */ |
4 | 4 | ||
5 | #include <asm/thread_info.h> | ||
5 | #include <asm/page.h> | 6 | #include <asm/page.h> |
6 | #include <asm-generic/vmlinux.lds.h> | 7 | #include <asm-generic/vmlinux.lds.h> |
7 | 8 | ||
@@ -86,7 +87,7 @@ SECTIONS | |||
86 | } | 87 | } |
87 | _edata = .; /* End of data section */ | 88 | _edata = .; /* End of data section */ |
88 | 89 | ||
89 | . = ALIGN(2 * PAGE_SIZE); /* init_task */ | 90 | . = ALIGN(THREAD_SIZE); /* init_task */ |
90 | .data.init_task : { | 91 | .data.init_task : { |
91 | *(.data.init_task) | 92 | *(.data.init_task) |
92 | } | 93 | } |
diff --git a/arch/sh/include/asm/io.h b/arch/sh/include/asm/io.h index 436c28539577..65eaae34e753 100644 --- a/arch/sh/include/asm/io.h +++ b/arch/sh/include/asm/io.h | |||
@@ -293,6 +293,10 @@ __ioremap_mode(unsigned long offset, unsigned long size, unsigned long flags) | |||
293 | */ | 293 | */ |
294 | #define xlate_dev_kmem_ptr(p) p | 294 | #define xlate_dev_kmem_ptr(p) p |
295 | 295 | ||
296 | #define ARCH_HAS_VALID_PHYS_ADDR_RANGE | ||
297 | int valid_phys_addr_range(unsigned long addr, size_t size); | ||
298 | int valid_mmap_phys_addr_range(unsigned long pfn, size_t size); | ||
299 | |||
296 | #endif /* __KERNEL__ */ | 300 | #endif /* __KERNEL__ */ |
297 | 301 | ||
298 | #endif /* __ASM_SH_IO_H */ | 302 | #endif /* __ASM_SH_IO_H */ |
diff --git a/arch/sh/include/asm/pgtable.h b/arch/sh/include/asm/pgtable.h index 52220d70a096..b517ae08b9c0 100644 --- a/arch/sh/include/asm/pgtable.h +++ b/arch/sh/include/asm/pgtable.h | |||
@@ -148,6 +148,12 @@ extern void paging_init(void); | |||
148 | extern void page_table_range_init(unsigned long start, unsigned long end, | 148 | extern void page_table_range_init(unsigned long start, unsigned long end, |
149 | pgd_t *pgd); | 149 | pgd_t *pgd); |
150 | 150 | ||
151 | #if !defined(CONFIG_CACHE_OFF) && defined(CONFIG_CPU_SH4) && defined(CONFIG_MMU) | ||
152 | extern void kmap_coherent_init(void); | ||
153 | #else | ||
154 | #define kmap_coherent_init() do { } while (0) | ||
155 | #endif | ||
156 | |||
151 | #include <asm-generic/pgtable.h> | 157 | #include <asm-generic/pgtable.h> |
152 | 158 | ||
153 | #endif /* __ASM_SH_PGTABLE_H */ | 159 | #endif /* __ASM_SH_PGTABLE_H */ |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7723.c b/arch/sh/kernel/cpu/sh4a/setup-sh7723.c index a7412cede534..6d9e6972cfc9 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7723.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7723.c | |||
@@ -119,17 +119,17 @@ static struct plat_sci_port sci_platform_data[] = { | |||
119 | },{ | 119 | },{ |
120 | .mapbase = 0xa4e30000, | 120 | .mapbase = 0xa4e30000, |
121 | .flags = UPF_BOOT_AUTOCONF, | 121 | .flags = UPF_BOOT_AUTOCONF, |
122 | .type = PORT_SCI, | 122 | .type = PORT_SCIFA, |
123 | .irqs = { 56, 56, 56, 56 }, | 123 | .irqs = { 56, 56, 56, 56 }, |
124 | },{ | 124 | },{ |
125 | .mapbase = 0xa4e40000, | 125 | .mapbase = 0xa4e40000, |
126 | .flags = UPF_BOOT_AUTOCONF, | 126 | .flags = UPF_BOOT_AUTOCONF, |
127 | .type = PORT_SCI, | 127 | .type = PORT_SCIFA, |
128 | .irqs = { 88, 88, 88, 88 }, | 128 | .irqs = { 88, 88, 88, 88 }, |
129 | },{ | 129 | },{ |
130 | .mapbase = 0xa4e50000, | 130 | .mapbase = 0xa4e50000, |
131 | .flags = UPF_BOOT_AUTOCONF, | 131 | .flags = UPF_BOOT_AUTOCONF, |
132 | .type = PORT_SCI, | 132 | .type = PORT_SCIFA, |
133 | .irqs = { 109, 109, 109, 109 }, | 133 | .irqs = { 109, 109, 109, 109 }, |
134 | }, { | 134 | }, { |
135 | .flags = 0, | 135 | .flags = 0, |
diff --git a/arch/sh/kernel/early_printk.c b/arch/sh/kernel/early_printk.c index 6b7d166694e2..a952dcf9999d 100644 --- a/arch/sh/kernel/early_printk.c +++ b/arch/sh/kernel/early_printk.c | |||
@@ -75,6 +75,7 @@ static struct console bios_console = { | |||
75 | #endif | 75 | #endif |
76 | 76 | ||
77 | static struct uart_port scif_port = { | 77 | static struct uart_port scif_port = { |
78 | .type = PORT_SCIF, | ||
78 | .mapbase = CONFIG_EARLY_SCIF_CONSOLE_PORT, | 79 | .mapbase = CONFIG_EARLY_SCIF_CONSOLE_PORT, |
79 | .membase = (char __iomem *)CONFIG_EARLY_SCIF_CONSOLE_PORT, | 80 | .membase = (char __iomem *)CONFIG_EARLY_SCIF_CONSOLE_PORT, |
80 | }; | 81 | }; |
@@ -84,9 +85,9 @@ static void scif_sercon_putc(int c) | |||
84 | while (((sci_in(&scif_port, SCFDR) & EPK_FIFO_BITS) >= EPK_FIFO_SIZE)) | 85 | while (((sci_in(&scif_port, SCFDR) & EPK_FIFO_BITS) >= EPK_FIFO_SIZE)) |
85 | ; | 86 | ; |
86 | 87 | ||
87 | sci_out(&scif_port, SCxTDR, c); | ||
88 | sci_in(&scif_port, SCxSR); | 88 | sci_in(&scif_port, SCxSR); |
89 | sci_out(&scif_port, SCxSR, 0xf3 & ~(0x20 | 0x40)); | 89 | sci_out(&scif_port, SCxSR, 0xf3 & ~(0x20 | 0x40)); |
90 | sci_out(&scif_port, SCxTDR, c); | ||
90 | 91 | ||
91 | while ((sci_in(&scif_port, SCxSR) & 0x40) == 0) | 92 | while ((sci_in(&scif_port, SCxSR) & 0x40) == 0) |
92 | ; | 93 | ; |
diff --git a/arch/sh/kernel/timers/timer-tmu.c b/arch/sh/kernel/timers/timer-tmu.c index aaaf90d06b85..3c61ddd4d43e 100644 --- a/arch/sh/kernel/timers/timer-tmu.c +++ b/arch/sh/kernel/timers/timer-tmu.c | |||
@@ -120,7 +120,7 @@ static void tmu_set_mode(enum clock_event_mode mode, | |||
120 | { | 120 | { |
121 | switch (mode) { | 121 | switch (mode) { |
122 | case CLOCK_EVT_MODE_PERIODIC: | 122 | case CLOCK_EVT_MODE_PERIODIC: |
123 | ctrl_outl(ctrl_inl(TMU0_TCNT), TMU0_TCOR); | 123 | ctrl_outl(tmu_latest_interval[TMU0], TMU0_TCOR); |
124 | break; | 124 | break; |
125 | case CLOCK_EVT_MODE_ONESHOT: | 125 | case CLOCK_EVT_MODE_ONESHOT: |
126 | ctrl_outl(0, TMU0_TCOR); | 126 | ctrl_outl(0, TMU0_TCOR); |
diff --git a/arch/sh/lib/copy_page.S b/arch/sh/lib/copy_page.S index 5d12e657be34..43de7e8e4e17 100644 --- a/arch/sh/lib/copy_page.S +++ b/arch/sh/lib/copy_page.S | |||
@@ -80,6 +80,11 @@ ENTRY(copy_page) | |||
80 | .section __ex_table, "a"; \ | 80 | .section __ex_table, "a"; \ |
81 | .long 9999b, 6000f ; \ | 81 | .long 9999b, 6000f ; \ |
82 | .previous | 82 | .previous |
83 | #define EX_NO_POP(...) \ | ||
84 | 9999: __VA_ARGS__ ; \ | ||
85 | .section __ex_table, "a"; \ | ||
86 | .long 9999b, 6005f ; \ | ||
87 | .previous | ||
83 | ENTRY(__copy_user) | 88 | ENTRY(__copy_user) |
84 | ! Check if small number of bytes | 89 | ! Check if small number of bytes |
85 | mov #11,r0 | 90 | mov #11,r0 |
@@ -139,9 +144,9 @@ EX( mov.b r1,@r4 ) | |||
139 | bt 1f | 144 | bt 1f |
140 | 145 | ||
141 | 2: | 146 | 2: |
142 | EX( mov.b @r5+,r0 ) | 147 | EX_NO_POP( mov.b @r5+,r0 ) |
143 | dt r6 | 148 | dt r6 |
144 | EX( mov.b r0,@r4 ) | 149 | EX_NO_POP( mov.b r0,@r4 ) |
145 | bf/s 2b | 150 | bf/s 2b |
146 | add #1,r4 | 151 | add #1,r4 |
147 | 152 | ||
@@ -150,7 +155,7 @@ EX( mov.b r0,@r4 ) | |||
150 | 155 | ||
151 | # Exception handler: | 156 | # Exception handler: |
152 | .section .fixup, "ax" | 157 | .section .fixup, "ax" |
153 | 6000: | 158 | 6005: |
154 | mov.l 8000f,r1 | 159 | mov.l 8000f,r1 |
155 | mov r3,r0 | 160 | mov r3,r0 |
156 | jmp @r1 | 161 | jmp @r1 |
diff --git a/arch/sh/mm/Makefile_32 b/arch/sh/mm/Makefile_32 index 70e0906023cc..f066e76da204 100644 --- a/arch/sh/mm/Makefile_32 +++ b/arch/sh/mm/Makefile_32 | |||
@@ -2,7 +2,7 @@ | |||
2 | # Makefile for the Linux SuperH-specific parts of the memory manager. | 2 | # Makefile for the Linux SuperH-specific parts of the memory manager. |
3 | # | 3 | # |
4 | 4 | ||
5 | obj-y := init.o extable_32.o consistent.o | 5 | obj-y := init.o extable_32.o consistent.o mmap.o |
6 | 6 | ||
7 | ifndef CONFIG_CACHE_OFF | 7 | ifndef CONFIG_CACHE_OFF |
8 | cache-$(CONFIG_CPU_SH2) := cache-sh2.o | 8 | cache-$(CONFIG_CPU_SH2) := cache-sh2.o |
diff --git a/arch/sh/mm/Makefile_64 b/arch/sh/mm/Makefile_64 index 0d92a8a3ac9a..9481d0f54efd 100644 --- a/arch/sh/mm/Makefile_64 +++ b/arch/sh/mm/Makefile_64 | |||
@@ -2,7 +2,7 @@ | |||
2 | # Makefile for the Linux SuperH-specific parts of the memory manager. | 2 | # Makefile for the Linux SuperH-specific parts of the memory manager. |
3 | # | 3 | # |
4 | 4 | ||
5 | obj-y := init.o consistent.o | 5 | obj-y := init.o consistent.o mmap.o |
6 | 6 | ||
7 | mmu-y := tlb-nommu.o pg-nommu.o extable_32.o | 7 | mmu-y := tlb-nommu.o pg-nommu.o extable_32.o |
8 | mmu-$(CONFIG_MMU) := fault_64.o ioremap_64.o tlbflush_64.o tlb-sh5.o \ | 8 | mmu-$(CONFIG_MMU) := fault_64.o ioremap_64.o tlbflush_64.o tlb-sh5.o \ |
diff --git a/arch/sh/mm/init.c b/arch/sh/mm/init.c index 4abf00031dae..6cbef8caeb56 100644 --- a/arch/sh/mm/init.c +++ b/arch/sh/mm/init.c | |||
@@ -137,6 +137,7 @@ void __init page_table_range_init(unsigned long start, unsigned long end, | |||
137 | void __init paging_init(void) | 137 | void __init paging_init(void) |
138 | { | 138 | { |
139 | unsigned long max_zone_pfns[MAX_NR_ZONES]; | 139 | unsigned long max_zone_pfns[MAX_NR_ZONES]; |
140 | unsigned long vaddr; | ||
140 | int nid; | 141 | int nid; |
141 | 142 | ||
142 | /* We don't need to map the kernel through the TLB, as | 143 | /* We don't need to map the kernel through the TLB, as |
@@ -148,10 +149,15 @@ void __init paging_init(void) | |||
148 | * check for a null value. */ | 149 | * check for a null value. */ |
149 | set_TTB(swapper_pg_dir); | 150 | set_TTB(swapper_pg_dir); |
150 | 151 | ||
151 | /* Populate the relevant portions of swapper_pg_dir so that | 152 | /* |
153 | * Populate the relevant portions of swapper_pg_dir so that | ||
152 | * we can use the fixmap entries without calling kmalloc. | 154 | * we can use the fixmap entries without calling kmalloc. |
153 | * pte's will be filled in by __set_fixmap(). */ | 155 | * pte's will be filled in by __set_fixmap(). |
154 | page_table_range_init(FIXADDR_START, FIXADDR_TOP, swapper_pg_dir); | 156 | */ |
157 | vaddr = __fix_to_virt(__end_of_fixed_addresses - 1) & PMD_MASK; | ||
158 | page_table_range_init(vaddr, 0, swapper_pg_dir); | ||
159 | |||
160 | kmap_coherent_init(); | ||
155 | 161 | ||
156 | memset(max_zone_pfns, 0, sizeof(max_zone_pfns)); | 162 | memset(max_zone_pfns, 0, sizeof(max_zone_pfns)); |
157 | 163 | ||
diff --git a/arch/sh/mm/mmap.c b/arch/sh/mm/mmap.c new file mode 100644 index 000000000000..8837d511710a --- /dev/null +++ b/arch/sh/mm/mmap.c | |||
@@ -0,0 +1,31 @@ | |||
1 | /* | ||
2 | * arch/sh/mm/mmap.c | ||
3 | * | ||
4 | * Copyright (C) 2008 Paul Mundt | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of the GNU General Public | ||
7 | * License. See the file "COPYING" in the main directory of this archive | ||
8 | * for more details. | ||
9 | */ | ||
10 | #include <linux/io.h> | ||
11 | #include <linux/mm.h> | ||
12 | #include <asm/page.h> | ||
13 | |||
14 | /* | ||
15 | * You really shouldn't be using read() or write() on /dev/mem. This | ||
16 | * might go away in the future. | ||
17 | */ | ||
18 | int valid_phys_addr_range(unsigned long addr, size_t count) | ||
19 | { | ||
20 | if (addr < __MEMORY_START) | ||
21 | return 0; | ||
22 | if (addr + count > __pa(high_memory)) | ||
23 | return 0; | ||
24 | |||
25 | return 1; | ||
26 | } | ||
27 | |||
28 | int valid_mmap_phys_addr_range(unsigned long pfn, size_t size) | ||
29 | { | ||
30 | return 1; | ||
31 | } | ||
diff --git a/arch/sh/mm/pg-sh4.c b/arch/sh/mm/pg-sh4.c index 38870e0fc182..2fe14da1f839 100644 --- a/arch/sh/mm/pg-sh4.c +++ b/arch/sh/mm/pg-sh4.c | |||
@@ -7,6 +7,7 @@ | |||
7 | * Released under the terms of the GNU GPL v2.0. | 7 | * Released under the terms of the GNU GPL v2.0. |
8 | */ | 8 | */ |
9 | #include <linux/mm.h> | 9 | #include <linux/mm.h> |
10 | #include <linux/init.h> | ||
10 | #include <linux/mutex.h> | 11 | #include <linux/mutex.h> |
11 | #include <linux/fs.h> | 12 | #include <linux/fs.h> |
12 | #include <linux/highmem.h> | 13 | #include <linux/highmem.h> |
@@ -16,6 +17,20 @@ | |||
16 | 17 | ||
17 | #define CACHE_ALIAS (current_cpu_data.dcache.alias_mask) | 18 | #define CACHE_ALIAS (current_cpu_data.dcache.alias_mask) |
18 | 19 | ||
20 | #define kmap_get_fixmap_pte(vaddr) \ | ||
21 | pte_offset_kernel(pmd_offset(pud_offset(pgd_offset_k(vaddr), (vaddr)), (vaddr)), (vaddr)) | ||
22 | |||
23 | static pte_t *kmap_coherent_pte; | ||
24 | |||
25 | void __init kmap_coherent_init(void) | ||
26 | { | ||
27 | unsigned long vaddr; | ||
28 | |||
29 | /* cache the first coherent kmap pte */ | ||
30 | vaddr = __fix_to_virt(FIX_CMAP_BEGIN); | ||
31 | kmap_coherent_pte = kmap_get_fixmap_pte(vaddr); | ||
32 | } | ||
33 | |||
19 | static inline void *kmap_coherent(struct page *page, unsigned long addr) | 34 | static inline void *kmap_coherent(struct page *page, unsigned long addr) |
20 | { | 35 | { |
21 | enum fixed_addresses idx; | 36 | enum fixed_addresses idx; |
@@ -34,6 +49,8 @@ static inline void *kmap_coherent(struct page *page, unsigned long addr) | |||
34 | 49 | ||
35 | update_mmu_cache(NULL, vaddr, pte); | 50 | update_mmu_cache(NULL, vaddr, pte); |
36 | 51 | ||
52 | set_pte(kmap_coherent_pte - (FIX_CMAP_END - idx), pte); | ||
53 | |||
37 | return (void *)vaddr; | 54 | return (void *)vaddr; |
38 | } | 55 | } |
39 | 56 | ||
diff --git a/arch/sparc/include/asm/ptrace_64.h b/arch/sparc/include/asm/ptrace_64.h index 3d3e9c161d8b..84e969f06afe 100644 --- a/arch/sparc/include/asm/ptrace_64.h +++ b/arch/sparc/include/asm/ptrace_64.h | |||
@@ -142,8 +142,6 @@ struct global_reg_snapshot { | |||
142 | }; | 142 | }; |
143 | extern struct global_reg_snapshot global_reg_snapshot[NR_CPUS]; | 143 | extern struct global_reg_snapshot global_reg_snapshot[NR_CPUS]; |
144 | 144 | ||
145 | #define __ARCH_WANT_COMPAT_SYS_PTRACE | ||
146 | |||
147 | #define force_successful_syscall_return() \ | 145 | #define force_successful_syscall_return() \ |
148 | do { current_thread_info()->syscall_noerror = 1; \ | 146 | do { current_thread_info()->syscall_noerror = 1; \ |
149 | } while (0) | 147 | } while (0) |
diff --git a/arch/sparc/include/asm/termbits.h b/arch/sparc/include/asm/termbits.h index d6ca3e2754f5..d72dfed1f9d7 100644 --- a/arch/sparc/include/asm/termbits.h +++ b/arch/sparc/include/asm/termbits.h | |||
@@ -29,10 +29,11 @@ struct termios { | |||
29 | tcflag_t c_cflag; /* control mode flags */ | 29 | tcflag_t c_cflag; /* control mode flags */ |
30 | tcflag_t c_lflag; /* local mode flags */ | 30 | tcflag_t c_lflag; /* local mode flags */ |
31 | cc_t c_line; /* line discipline */ | 31 | cc_t c_line; /* line discipline */ |
32 | #ifndef __KERNEL__ | ||
32 | cc_t c_cc[NCCS]; /* control characters */ | 33 | cc_t c_cc[NCCS]; /* control characters */ |
33 | #ifdef __KERNEL__ | 34 | #else |
35 | cc_t c_cc[NCCS+2]; /* kernel needs 2 more to hold vmin/vtime */ | ||
34 | #define SIZEOF_USER_TERMIOS sizeof (struct termios) - (2*sizeof (cc_t)) | 36 | #define SIZEOF_USER_TERMIOS sizeof (struct termios) - (2*sizeof (cc_t)) |
35 | cc_t _x_cc[2]; /* We need them to hold vmin/vtime */ | ||
36 | #endif | 37 | #endif |
37 | }; | 38 | }; |
38 | 39 | ||
@@ -42,8 +43,7 @@ struct termios2 { | |||
42 | tcflag_t c_cflag; /* control mode flags */ | 43 | tcflag_t c_cflag; /* control mode flags */ |
43 | tcflag_t c_lflag; /* local mode flags */ | 44 | tcflag_t c_lflag; /* local mode flags */ |
44 | cc_t c_line; /* line discipline */ | 45 | cc_t c_line; /* line discipline */ |
45 | cc_t c_cc[NCCS]; /* control characters */ | 46 | cc_t c_cc[NCCS+2]; /* control characters */ |
46 | cc_t _x_cc[2]; /* padding to match ktermios */ | ||
47 | speed_t c_ispeed; /* input speed */ | 47 | speed_t c_ispeed; /* input speed */ |
48 | speed_t c_ospeed; /* output speed */ | 48 | speed_t c_ospeed; /* output speed */ |
49 | }; | 49 | }; |
@@ -54,8 +54,7 @@ struct ktermios { | |||
54 | tcflag_t c_cflag; /* control mode flags */ | 54 | tcflag_t c_cflag; /* control mode flags */ |
55 | tcflag_t c_lflag; /* local mode flags */ | 55 | tcflag_t c_lflag; /* local mode flags */ |
56 | cc_t c_line; /* line discipline */ | 56 | cc_t c_line; /* line discipline */ |
57 | cc_t c_cc[NCCS]; /* control characters */ | 57 | cc_t c_cc[NCCS+2]; /* control characters */ |
58 | cc_t _x_cc[2]; /* We need them to hold vmin/vtime */ | ||
59 | speed_t c_ispeed; /* input speed */ | 58 | speed_t c_ispeed; /* input speed */ |
60 | speed_t c_ospeed; /* output speed */ | 59 | speed_t c_ospeed; /* output speed */ |
61 | }; | 60 | }; |
diff --git a/arch/sparc/include/asm/unistd_32.h b/arch/sparc/include/asm/unistd_32.h index 648643a9f139..0d13d2a4c76f 100644 --- a/arch/sparc/include/asm/unistd_32.h +++ b/arch/sparc/include/asm/unistd_32.h | |||
@@ -338,8 +338,9 @@ | |||
338 | #define __NR_dup3 320 | 338 | #define __NR_dup3 320 |
339 | #define __NR_pipe2 321 | 339 | #define __NR_pipe2 321 |
340 | #define __NR_inotify_init1 322 | 340 | #define __NR_inotify_init1 322 |
341 | #define __NR_accept4 323 | ||
341 | 342 | ||
342 | #define NR_SYSCALLS 323 | 343 | #define NR_SYSCALLS 324 |
343 | 344 | ||
344 | /* Sparc 32-bit only has the "setresuid32", "getresuid32" variants, | 345 | /* Sparc 32-bit only has the "setresuid32", "getresuid32" variants, |
345 | * it never had the plain ones and there is no value to adding those | 346 | * it never had the plain ones and there is no value to adding those |
diff --git a/arch/sparc/include/asm/unistd_64.h b/arch/sparc/include/asm/unistd_64.h index c5cc0e052321..fa5d3c0343c7 100644 --- a/arch/sparc/include/asm/unistd_64.h +++ b/arch/sparc/include/asm/unistd_64.h | |||
@@ -340,8 +340,9 @@ | |||
340 | #define __NR_dup3 320 | 340 | #define __NR_dup3 320 |
341 | #define __NR_pipe2 321 | 341 | #define __NR_pipe2 321 |
342 | #define __NR_inotify_init1 322 | 342 | #define __NR_inotify_init1 322 |
343 | #define __NR_accept4 323 | ||
343 | 344 | ||
344 | #define NR_SYSCALLS 323 | 345 | #define NR_SYSCALLS 324 |
345 | 346 | ||
346 | #ifdef __KERNEL__ | 347 | #ifdef __KERNEL__ |
347 | #define __ARCH_WANT_IPC_PARSE_VERSION | 348 | #define __ARCH_WANT_IPC_PARSE_VERSION |
diff --git a/arch/sparc/kernel/cpu.c b/arch/sparc/kernel/cpu.c index e7a0edfc1a32..1fc17f59c6bf 100644 --- a/arch/sparc/kernel/cpu.c +++ b/arch/sparc/kernel/cpu.c | |||
@@ -126,7 +126,7 @@ char *sparc_fpu_type; | |||
126 | 126 | ||
127 | unsigned int fsr_storage; | 127 | unsigned int fsr_storage; |
128 | 128 | ||
129 | void __init cpu_probe(void) | 129 | void __cpuinit cpu_probe(void) |
130 | { | 130 | { |
131 | int psr_impl, psr_vers, fpu_vers; | 131 | int psr_impl, psr_vers, fpu_vers; |
132 | int i, psr; | 132 | int i, psr; |
diff --git a/arch/sparc/kernel/head.S b/arch/sparc/kernel/head.S index 2d325fd84579..51b40426f9c6 100644 --- a/arch/sparc/kernel/head.S +++ b/arch/sparc/kernel/head.S | |||
@@ -72,7 +72,7 @@ sun4e_notsup: | |||
72 | .align 4 | 72 | .align 4 |
73 | 73 | ||
74 | /* The Sparc trap table, bootloader gives us control at _start. */ | 74 | /* The Sparc trap table, bootloader gives us control at _start. */ |
75 | .text | 75 | .section .text.head,"ax" |
76 | .globl start, _stext, _start, __stext | 76 | .globl start, _stext, _start, __stext |
77 | .globl trapbase | 77 | .globl trapbase |
78 | _start: /* danger danger */ | 78 | _start: /* danger danger */ |
diff --git a/arch/sparc/kernel/of_device.c b/arch/sparc/kernel/of_device.c index 0837bd52e28f..0a83bd737654 100644 --- a/arch/sparc/kernel/of_device.c +++ b/arch/sparc/kernel/of_device.c | |||
@@ -563,9 +563,9 @@ build_resources: | |||
563 | op->dev.parent = parent; | 563 | op->dev.parent = parent; |
564 | op->dev.bus = &of_platform_bus_type; | 564 | op->dev.bus = &of_platform_bus_type; |
565 | if (!parent) | 565 | if (!parent) |
566 | strcpy(op->dev.bus_id, "root"); | 566 | dev_set_name(&op->dev, "root"); |
567 | else | 567 | else |
568 | sprintf(op->dev.bus_id, "%08x", dp->node); | 568 | dev_set_name(&op->dev, "%08x", dp->node); |
569 | 569 | ||
570 | if (of_device_register(op)) { | 570 | if (of_device_register(op)) { |
571 | printk("%s: Could not register of device.\n", | 571 | printk("%s: Could not register of device.\n", |
diff --git a/arch/sparc/kernel/smp.c b/arch/sparc/kernel/smp.c index 1619ec15c099..e396c1f17a92 100644 --- a/arch/sparc/kernel/smp.c +++ b/arch/sparc/kernel/smp.c | |||
@@ -35,7 +35,7 @@ | |||
35 | 35 | ||
36 | #include "irq.h" | 36 | #include "irq.h" |
37 | 37 | ||
38 | volatile unsigned long cpu_callin_map[NR_CPUS] __initdata = {0,}; | 38 | volatile unsigned long cpu_callin_map[NR_CPUS] __cpuinitdata = {0,}; |
39 | unsigned char boot_cpu_id = 0; | 39 | unsigned char boot_cpu_id = 0; |
40 | unsigned char boot_cpu_id4 = 0; /* boot_cpu_id << 2 */ | 40 | unsigned char boot_cpu_id4 = 0; /* boot_cpu_id << 2 */ |
41 | 41 | ||
@@ -120,7 +120,7 @@ void cpu_panic(void) | |||
120 | panic("SMP bolixed\n"); | 120 | panic("SMP bolixed\n"); |
121 | } | 121 | } |
122 | 122 | ||
123 | struct linux_prom_registers smp_penguin_ctable __initdata = { 0 }; | 123 | struct linux_prom_registers smp_penguin_ctable __cpuinitdata = { 0 }; |
124 | 124 | ||
125 | void smp_send_reschedule(int cpu) | 125 | void smp_send_reschedule(int cpu) |
126 | { | 126 | { |
diff --git a/arch/sparc/kernel/sun4d_smp.c b/arch/sparc/kernel/sun4d_smp.c index 7a6a5e795928..16ab0cb731c5 100644 --- a/arch/sparc/kernel/sun4d_smp.c +++ b/arch/sparc/kernel/sun4d_smp.c | |||
@@ -83,7 +83,7 @@ static inline void show_leds(int cpuid) | |||
83 | "i" (ASI_M_CTL)); | 83 | "i" (ASI_M_CTL)); |
84 | } | 84 | } |
85 | 85 | ||
86 | void __init smp4d_callin(void) | 86 | void __cpuinit smp4d_callin(void) |
87 | { | 87 | { |
88 | int cpuid = hard_smp4d_processor_id(); | 88 | int cpuid = hard_smp4d_processor_id(); |
89 | extern spinlock_t sun4d_imsk_lock; | 89 | extern spinlock_t sun4d_imsk_lock; |
@@ -386,7 +386,7 @@ void smp4d_percpu_timer_interrupt(struct pt_regs *regs) | |||
386 | 386 | ||
387 | extern unsigned int lvl14_resolution; | 387 | extern unsigned int lvl14_resolution; |
388 | 388 | ||
389 | static void __init smp_setup_percpu_timer(void) | 389 | static void __cpuinit smp_setup_percpu_timer(void) |
390 | { | 390 | { |
391 | int cpu = hard_smp4d_processor_id(); | 391 | int cpu = hard_smp4d_processor_id(); |
392 | 392 | ||
diff --git a/arch/sparc/kernel/sun4m_smp.c b/arch/sparc/kernel/sun4m_smp.c index 5fc386d08c47..4f8d60586b07 100644 --- a/arch/sparc/kernel/sun4m_smp.c +++ b/arch/sparc/kernel/sun4m_smp.c | |||
@@ -343,7 +343,7 @@ void smp4m_percpu_timer_interrupt(struct pt_regs *regs) | |||
343 | 343 | ||
344 | extern unsigned int lvl14_resolution; | 344 | extern unsigned int lvl14_resolution; |
345 | 345 | ||
346 | static void __init smp_setup_percpu_timer(void) | 346 | static void __cpuinit smp_setup_percpu_timer(void) |
347 | { | 347 | { |
348 | int cpu = smp_processor_id(); | 348 | int cpu = smp_processor_id(); |
349 | 349 | ||
diff --git a/arch/sparc/kernel/systbls.S b/arch/sparc/kernel/systbls.S index e1b9233b90ab..7d0807586442 100644 --- a/arch/sparc/kernel/systbls.S +++ b/arch/sparc/kernel/systbls.S | |||
@@ -81,4 +81,4 @@ sys_call_table: | |||
81 | /*305*/ .long sys_set_mempolicy, sys_kexec_load, sys_move_pages, sys_getcpu, sys_epoll_pwait | 81 | /*305*/ .long sys_set_mempolicy, sys_kexec_load, sys_move_pages, sys_getcpu, sys_epoll_pwait |
82 | /*310*/ .long sys_utimensat, sys_signalfd, sys_timerfd_create, sys_eventfd, sys_fallocate | 82 | /*310*/ .long sys_utimensat, sys_signalfd, sys_timerfd_create, sys_eventfd, sys_fallocate |
83 | /*315*/ .long sys_timerfd_settime, sys_timerfd_gettime, sys_signalfd4, sys_eventfd2, sys_epoll_create1 | 83 | /*315*/ .long sys_timerfd_settime, sys_timerfd_gettime, sys_signalfd4, sys_eventfd2, sys_epoll_create1 |
84 | /*320*/ .long sys_dup3, sys_pipe2, sys_inotify_init1 | 84 | /*320*/ .long sys_dup3, sys_pipe2, sys_inotify_init1, sys_accept4 |
diff --git a/arch/sparc/kernel/trampoline.S b/arch/sparc/kernel/trampoline.S index 356c56aebc62..5e235c52d667 100644 --- a/arch/sparc/kernel/trampoline.S +++ b/arch/sparc/kernel/trampoline.S | |||
@@ -18,7 +18,7 @@ | |||
18 | .globl sun4m_cpu_startup, __smp4m_processor_id | 18 | .globl sun4m_cpu_startup, __smp4m_processor_id |
19 | .globl sun4d_cpu_startup, __smp4d_processor_id | 19 | .globl sun4d_cpu_startup, __smp4d_processor_id |
20 | 20 | ||
21 | __INIT | 21 | __CPUINIT |
22 | .align 4 | 22 | .align 4 |
23 | 23 | ||
24 | /* When we start up a cpu for the first time it enters this routine. | 24 | /* When we start up a cpu for the first time it enters this routine. |
@@ -109,7 +109,7 @@ __smp4d_processor_id: | |||
109 | /* CPUID in bootbus can be found at PA 0xff0140000 */ | 109 | /* CPUID in bootbus can be found at PA 0xff0140000 */ |
110 | #define SUN4D_BOOTBUS_CPUID 0xf0140000 | 110 | #define SUN4D_BOOTBUS_CPUID 0xf0140000 |
111 | 111 | ||
112 | __INIT | 112 | __CPUINIT |
113 | .align 4 | 113 | .align 4 |
114 | 114 | ||
115 | sun4d_cpu_startup: | 115 | sun4d_cpu_startup: |
diff --git a/arch/sparc/kernel/vmlinux.lds.S b/arch/sparc/kernel/vmlinux.lds.S index b1002c607196..5b7e69a8c32f 100644 --- a/arch/sparc/kernel/vmlinux.lds.S +++ b/arch/sparc/kernel/vmlinux.lds.S | |||
@@ -13,6 +13,7 @@ SECTIONS | |||
13 | .text 0xf0004000 : | 13 | .text 0xf0004000 : |
14 | { | 14 | { |
15 | _text = .; | 15 | _text = .; |
16 | *(.text.head) | ||
16 | TEXT_TEXT | 17 | TEXT_TEXT |
17 | SCHED_TEXT | 18 | SCHED_TEXT |
18 | LOCK_TEXT | 19 | LOCK_TEXT |
diff --git a/arch/sparc/mm/srmmu.c b/arch/sparc/mm/srmmu.c index 6a5d7cabc044..dd8aa36f366c 100644 --- a/arch/sparc/mm/srmmu.c +++ b/arch/sparc/mm/srmmu.c | |||
@@ -1251,7 +1251,7 @@ static inline void map_kernel(void) | |||
1251 | /* Paging initialization on the Sparc Reference MMU. */ | 1251 | /* Paging initialization on the Sparc Reference MMU. */ |
1252 | extern void sparc_context_init(int); | 1252 | extern void sparc_context_init(int); |
1253 | 1253 | ||
1254 | void (*poke_srmmu)(void) __initdata = NULL; | 1254 | void (*poke_srmmu)(void) __cpuinitdata = NULL; |
1255 | 1255 | ||
1256 | extern unsigned long bootmem_init(unsigned long *pages_avail); | 1256 | extern unsigned long bootmem_init(unsigned long *pages_avail); |
1257 | 1257 | ||
@@ -1446,7 +1446,7 @@ static void __init init_vac_layout(void) | |||
1446 | (int)vac_cache_size, (int)vac_line_size); | 1446 | (int)vac_cache_size, (int)vac_line_size); |
1447 | } | 1447 | } |
1448 | 1448 | ||
1449 | static void __init poke_hypersparc(void) | 1449 | static void __cpuinit poke_hypersparc(void) |
1450 | { | 1450 | { |
1451 | volatile unsigned long clear; | 1451 | volatile unsigned long clear; |
1452 | unsigned long mreg = srmmu_get_mmureg(); | 1452 | unsigned long mreg = srmmu_get_mmureg(); |
@@ -1501,7 +1501,7 @@ static void __init init_hypersparc(void) | |||
1501 | hypersparc_setup_blockops(); | 1501 | hypersparc_setup_blockops(); |
1502 | } | 1502 | } |
1503 | 1503 | ||
1504 | static void __init poke_cypress(void) | 1504 | static void __cpuinit poke_cypress(void) |
1505 | { | 1505 | { |
1506 | unsigned long mreg = srmmu_get_mmureg(); | 1506 | unsigned long mreg = srmmu_get_mmureg(); |
1507 | unsigned long faddr, tagval; | 1507 | unsigned long faddr, tagval; |
@@ -1589,7 +1589,7 @@ static void __init init_cypress_605(unsigned long mrev) | |||
1589 | init_cypress_common(); | 1589 | init_cypress_common(); |
1590 | } | 1590 | } |
1591 | 1591 | ||
1592 | static void __init poke_swift(void) | 1592 | static void __cpuinit poke_swift(void) |
1593 | { | 1593 | { |
1594 | unsigned long mreg; | 1594 | unsigned long mreg; |
1595 | 1595 | ||
@@ -1771,7 +1771,7 @@ static void turbosparc_flush_tlb_page(struct vm_area_struct *vma, unsigned long | |||
1771 | } | 1771 | } |
1772 | 1772 | ||
1773 | 1773 | ||
1774 | static void __init poke_turbosparc(void) | 1774 | static void __cpuinit poke_turbosparc(void) |
1775 | { | 1775 | { |
1776 | unsigned long mreg = srmmu_get_mmureg(); | 1776 | unsigned long mreg = srmmu_get_mmureg(); |
1777 | unsigned long ccreg; | 1777 | unsigned long ccreg; |
@@ -1834,7 +1834,7 @@ static void __init init_turbosparc(void) | |||
1834 | poke_srmmu = poke_turbosparc; | 1834 | poke_srmmu = poke_turbosparc; |
1835 | } | 1835 | } |
1836 | 1836 | ||
1837 | static void __init poke_tsunami(void) | 1837 | static void __cpuinit poke_tsunami(void) |
1838 | { | 1838 | { |
1839 | unsigned long mreg = srmmu_get_mmureg(); | 1839 | unsigned long mreg = srmmu_get_mmureg(); |
1840 | 1840 | ||
@@ -1876,7 +1876,7 @@ static void __init init_tsunami(void) | |||
1876 | tsunami_setup_blockops(); | 1876 | tsunami_setup_blockops(); |
1877 | } | 1877 | } |
1878 | 1878 | ||
1879 | static void __init poke_viking(void) | 1879 | static void __cpuinit poke_viking(void) |
1880 | { | 1880 | { |
1881 | unsigned long mreg = srmmu_get_mmureg(); | 1881 | unsigned long mreg = srmmu_get_mmureg(); |
1882 | static int smp_catch; | 1882 | static int smp_catch; |
diff --git a/arch/sparc64/kernel/smp.c b/arch/sparc64/kernel/smp.c index e5627118e613..f500b0618bb0 100644 --- a/arch/sparc64/kernel/smp.c +++ b/arch/sparc64/kernel/smp.c | |||
@@ -282,7 +282,7 @@ static unsigned long kimage_addr_to_ra(void *p) | |||
282 | return kern_base + (val - KERNBASE); | 282 | return kern_base + (val - KERNBASE); |
283 | } | 283 | } |
284 | 284 | ||
285 | static void ldom_startcpu_cpuid(unsigned int cpu, unsigned long thread_reg) | 285 | static void __cpuinit ldom_startcpu_cpuid(unsigned int cpu, unsigned long thread_reg) |
286 | { | 286 | { |
287 | extern unsigned long sparc64_ttable_tl0; | 287 | extern unsigned long sparc64_ttable_tl0; |
288 | extern unsigned long kern_locked_tte_data; | 288 | extern unsigned long kern_locked_tte_data; |
@@ -343,7 +343,7 @@ extern unsigned long sparc64_cpu_startup; | |||
343 | */ | 343 | */ |
344 | static struct thread_info *cpu_new_thread = NULL; | 344 | static struct thread_info *cpu_new_thread = NULL; |
345 | 345 | ||
346 | static int __devinit smp_boot_one_cpu(unsigned int cpu) | 346 | static int __cpuinit smp_boot_one_cpu(unsigned int cpu) |
347 | { | 347 | { |
348 | struct trap_per_cpu *tb = &trap_block[cpu]; | 348 | struct trap_per_cpu *tb = &trap_block[cpu]; |
349 | unsigned long entry = | 349 | unsigned long entry = |
diff --git a/arch/sparc64/kernel/sys32.S b/arch/sparc64/kernel/sys32.S index ade18ba0c686..f061c4dda9ef 100644 --- a/arch/sparc64/kernel/sys32.S +++ b/arch/sparc64/kernel/sys32.S | |||
@@ -150,7 +150,7 @@ sys32_mmap2: | |||
150 | sys32_socketcall: /* %o0=call, %o1=args */ | 150 | sys32_socketcall: /* %o0=call, %o1=args */ |
151 | cmp %o0, 1 | 151 | cmp %o0, 1 |
152 | bl,pn %xcc, do_einval | 152 | bl,pn %xcc, do_einval |
153 | cmp %o0, 17 | 153 | cmp %o0, 18 |
154 | bg,pn %xcc, do_einval | 154 | bg,pn %xcc, do_einval |
155 | sub %o0, 1, %o0 | 155 | sub %o0, 1, %o0 |
156 | sllx %o0, 5, %o0 | 156 | sllx %o0, 5, %o0 |
@@ -319,6 +319,15 @@ do_sys_recvmsg: /* compat_sys_recvmsg(int, struct compat_msghdr *, unsigned int) | |||
319 | nop | 319 | nop |
320 | nop | 320 | nop |
321 | nop | 321 | nop |
322 | do_sys_accept4: /* sys_accept4(int, struct sockaddr *, int *, int) */ | ||
323 | 63: ldswa [%o1 + 0x0] %asi, %o0 | ||
324 | sethi %hi(sys_accept4), %g1 | ||
325 | 64: lduwa [%o1 + 0x8] %asi, %o2 | ||
326 | 65: ldswa [%o1 + 0xc] %asi, %o3 | ||
327 | jmpl %g1 + %lo(sys_accept4), %g0 | ||
328 | 66: lduwa [%o1 + 0x4] %asi, %o1 | ||
329 | nop | ||
330 | nop | ||
322 | 331 | ||
323 | .section __ex_table,"a" | 332 | .section __ex_table,"a" |
324 | .align 4 | 333 | .align 4 |
@@ -353,4 +362,6 @@ do_sys_recvmsg: /* compat_sys_recvmsg(int, struct compat_msghdr *, unsigned int) | |||
353 | .word 57b, __retl_efault, 58b, __retl_efault | 362 | .word 57b, __retl_efault, 58b, __retl_efault |
354 | .word 59b, __retl_efault, 60b, __retl_efault | 363 | .word 59b, __retl_efault, 60b, __retl_efault |
355 | .word 61b, __retl_efault, 62b, __retl_efault | 364 | .word 61b, __retl_efault, 62b, __retl_efault |
365 | .word 63b, __retl_efault, 64b, __retl_efault | ||
366 | .word 65b, __retl_efault, 66b, __retl_efault | ||
356 | .previous | 367 | .previous |
diff --git a/arch/sparc64/kernel/systbls.S b/arch/sparc64/kernel/systbls.S index b2fa4c163638..9fc78cf354bd 100644 --- a/arch/sparc64/kernel/systbls.S +++ b/arch/sparc64/kernel/systbls.S | |||
@@ -82,7 +82,7 @@ sys_call_table32: | |||
82 | .word compat_sys_set_mempolicy, compat_sys_kexec_load, compat_sys_move_pages, sys_getcpu, compat_sys_epoll_pwait | 82 | .word compat_sys_set_mempolicy, compat_sys_kexec_load, compat_sys_move_pages, sys_getcpu, compat_sys_epoll_pwait |
83 | /*310*/ .word compat_sys_utimensat, compat_sys_signalfd, sys_timerfd_create, sys_eventfd, compat_sys_fallocate | 83 | /*310*/ .word compat_sys_utimensat, compat_sys_signalfd, sys_timerfd_create, sys_eventfd, compat_sys_fallocate |
84 | .word compat_sys_timerfd_settime, compat_sys_timerfd_gettime, compat_sys_signalfd4, sys_eventfd2, sys_epoll_create1 | 84 | .word compat_sys_timerfd_settime, compat_sys_timerfd_gettime, compat_sys_signalfd4, sys_eventfd2, sys_epoll_create1 |
85 | /*320*/ .word sys_dup3, sys_pipe2, sys_inotify_init1 | 85 | /*320*/ .word sys_dup3, sys_pipe2, sys_inotify_init1, sys_accept4 |
86 | 86 | ||
87 | #endif /* CONFIG_COMPAT */ | 87 | #endif /* CONFIG_COMPAT */ |
88 | 88 | ||
@@ -156,4 +156,4 @@ sys_call_table: | |||
156 | .word sys_set_mempolicy, sys_kexec_load, sys_move_pages, sys_getcpu, sys_epoll_pwait | 156 | .word sys_set_mempolicy, sys_kexec_load, sys_move_pages, sys_getcpu, sys_epoll_pwait |
157 | /*310*/ .word sys_utimensat, sys_signalfd, sys_timerfd_create, sys_eventfd, sys_fallocate | 157 | /*310*/ .word sys_utimensat, sys_signalfd, sys_timerfd_create, sys_eventfd, sys_fallocate |
158 | .word sys_timerfd_settime, sys_timerfd_gettime, sys_signalfd4, sys_eventfd2, sys_epoll_create1 | 158 | .word sys_timerfd_settime, sys_timerfd_gettime, sys_signalfd4, sys_eventfd2, sys_epoll_create1 |
159 | /*320*/ .word sys_dup3, sys_pipe2, sys_inotify_init1 | 159 | /*320*/ .word sys_dup3, sys_pipe2, sys_inotify_init1, sys_accept4 |
diff --git a/arch/sparc64/mm/init.c b/arch/sparc64/mm/init.c index 3c10daf8fc01..185f34679110 100644 --- a/arch/sparc64/mm/init.c +++ b/arch/sparc64/mm/init.c | |||
@@ -956,7 +956,7 @@ int of_node_to_nid(struct device_node *dp) | |||
956 | return nid; | 956 | return nid; |
957 | } | 957 | } |
958 | 958 | ||
959 | static void add_node_ranges(void) | 959 | static void __init add_node_ranges(void) |
960 | { | 960 | { |
961 | int i; | 961 | int i; |
962 | 962 | ||
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 93224b569187..ac22bb7719f7 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
@@ -167,9 +167,12 @@ config GENERIC_PENDING_IRQ | |||
167 | config X86_SMP | 167 | config X86_SMP |
168 | bool | 168 | bool |
169 | depends on SMP && ((X86_32 && !X86_VOYAGER) || X86_64) | 169 | depends on SMP && ((X86_32 && !X86_VOYAGER) || X86_64) |
170 | select USE_GENERIC_SMP_HELPERS | ||
171 | default y | 170 | default y |
172 | 171 | ||
172 | config USE_GENERIC_SMP_HELPERS | ||
173 | def_bool y | ||
174 | depends on SMP | ||
175 | |||
173 | config X86_32_SMP | 176 | config X86_32_SMP |
174 | def_bool y | 177 | def_bool y |
175 | depends on X86_32 && SMP | 178 | depends on X86_32 && SMP |
@@ -957,7 +960,7 @@ config ARCH_PHYS_ADDR_T_64BIT | |||
957 | config NUMA | 960 | config NUMA |
958 | bool "Numa Memory Allocation and Scheduler Support (EXPERIMENTAL)" | 961 | bool "Numa Memory Allocation and Scheduler Support (EXPERIMENTAL)" |
959 | depends on SMP | 962 | depends on SMP |
960 | depends on X86_64 || (X86_32 && HIGHMEM64G && (X86_NUMAQ || X86_BIGSMP || X86_SUMMIT && ACPI) && BROKEN) | 963 | depends on X86_64 || (X86_32 && HIGHMEM64G && (X86_NUMAQ || X86_BIGSMP || X86_SUMMIT && ACPI) && EXPERIMENTAL) |
961 | default n if X86_PC | 964 | default n if X86_PC |
962 | default y if (X86_NUMAQ || X86_SUMMIT || X86_BIGSMP) | 965 | default y if (X86_NUMAQ || X86_SUMMIT || X86_BIGSMP) |
963 | help | 966 | help |
diff --git a/arch/x86/boot/tty.c b/arch/x86/boot/tty.c index 0be77b39328a..7e8e8b25f5f6 100644 --- a/arch/x86/boot/tty.c +++ b/arch/x86/boot/tty.c | |||
@@ -74,7 +74,7 @@ static int kbd_pending(void) | |||
74 | { | 74 | { |
75 | u8 pending; | 75 | u8 pending; |
76 | asm volatile("int $0x16; setnz %0" | 76 | asm volatile("int $0x16; setnz %0" |
77 | : "=rm" (pending) | 77 | : "=qm" (pending) |
78 | : "a" (0x0100)); | 78 | : "a" (0x0100)); |
79 | return pending; | 79 | return pending; |
80 | } | 80 | } |
diff --git a/arch/x86/include/asm/acpi.h b/arch/x86/include/asm/acpi.h index 8d676d8ecde9..9830681446ad 100644 --- a/arch/x86/include/asm/acpi.h +++ b/arch/x86/include/asm/acpi.h | |||
@@ -113,7 +113,6 @@ static inline void acpi_disable_pci(void) | |||
113 | acpi_pci_disabled = 1; | 113 | acpi_pci_disabled = 1; |
114 | acpi_noirq_set(); | 114 | acpi_noirq_set(); |
115 | } | 115 | } |
116 | extern int acpi_irq_balance_set(char *str); | ||
117 | 116 | ||
118 | /* routines for saving/restoring kernel state */ | 117 | /* routines for saving/restoring kernel state */ |
119 | extern int acpi_save_state_mem(void); | 118 | extern int acpi_save_state_mem(void); |
diff --git a/arch/x86/include/asm/ds.h b/arch/x86/include/asm/ds.h index 72c5a190bf48..a95008457ea4 100644 --- a/arch/x86/include/asm/ds.h +++ b/arch/x86/include/asm/ds.h | |||
@@ -23,12 +23,13 @@ | |||
23 | #ifndef _ASM_X86_DS_H | 23 | #ifndef _ASM_X86_DS_H |
24 | #define _ASM_X86_DS_H | 24 | #define _ASM_X86_DS_H |
25 | 25 | ||
26 | #ifdef CONFIG_X86_DS | ||
27 | 26 | ||
28 | #include <linux/types.h> | 27 | #include <linux/types.h> |
29 | #include <linux/init.h> | 28 | #include <linux/init.h> |
30 | 29 | ||
31 | 30 | ||
31 | #ifdef CONFIG_X86_DS | ||
32 | |||
32 | struct task_struct; | 33 | struct task_struct; |
33 | 34 | ||
34 | /* | 35 | /* |
@@ -232,7 +233,8 @@ extern void ds_free(struct ds_context *context); | |||
232 | 233 | ||
233 | #else /* CONFIG_X86_DS */ | 234 | #else /* CONFIG_X86_DS */ |
234 | 235 | ||
235 | #define ds_init_intel(config) do {} while (0) | 236 | struct cpuinfo_x86; |
237 | static inline void __cpuinit ds_init_intel(struct cpuinfo_x86 *ignored) {} | ||
236 | 238 | ||
237 | #endif /* CONFIG_X86_DS */ | 239 | #endif /* CONFIG_X86_DS */ |
238 | #endif /* _ASM_X86_DS_H */ | 240 | #endif /* _ASM_X86_DS_H */ |
diff --git a/include/asm-x86/iomap.h b/arch/x86/include/asm/iomap.h index c1f06289b14b..c1f06289b14b 100644 --- a/include/asm-x86/iomap.h +++ b/arch/x86/include/asm/iomap.h | |||
diff --git a/arch/x86/include/asm/iommu.h b/arch/x86/include/asm/iommu.h index e4a552d44465..0b500c5b6446 100644 --- a/arch/x86/include/asm/iommu.h +++ b/arch/x86/include/asm/iommu.h | |||
@@ -6,7 +6,6 @@ extern void no_iommu_init(void); | |||
6 | extern struct dma_mapping_ops nommu_dma_ops; | 6 | extern struct dma_mapping_ops nommu_dma_ops; |
7 | extern int force_iommu, no_iommu; | 7 | extern int force_iommu, no_iommu; |
8 | extern int iommu_detected; | 8 | extern int iommu_detected; |
9 | extern int dmar_disabled; | ||
10 | 9 | ||
11 | extern unsigned long iommu_nr_pages(unsigned long addr, unsigned long len); | 10 | extern unsigned long iommu_nr_pages(unsigned long addr, unsigned long len); |
12 | 11 | ||
diff --git a/arch/x86/include/asm/mmzone_32.h b/arch/x86/include/asm/mmzone_32.h index 485bdf059ffb..07f1af494ca5 100644 --- a/arch/x86/include/asm/mmzone_32.h +++ b/arch/x86/include/asm/mmzone_32.h | |||
@@ -34,10 +34,14 @@ static inline void get_memcfg_numa(void) | |||
34 | 34 | ||
35 | extern int early_pfn_to_nid(unsigned long pfn); | 35 | extern int early_pfn_to_nid(unsigned long pfn); |
36 | 36 | ||
37 | extern void resume_map_numa_kva(pgd_t *pgd); | ||
38 | |||
37 | #else /* !CONFIG_NUMA */ | 39 | #else /* !CONFIG_NUMA */ |
38 | 40 | ||
39 | #define get_memcfg_numa get_memcfg_numa_flat | 41 | #define get_memcfg_numa get_memcfg_numa_flat |
40 | 42 | ||
43 | static inline void resume_map_numa_kva(pgd_t *pgd) {} | ||
44 | |||
41 | #endif /* CONFIG_NUMA */ | 45 | #endif /* CONFIG_NUMA */ |
42 | 46 | ||
43 | #ifdef CONFIG_DISCONTIGMEM | 47 | #ifdef CONFIG_DISCONTIGMEM |
diff --git a/arch/x86/include/asm/pci_64.h b/arch/x86/include/asm/pci_64.h index 5b28995d664e..d02d936840a3 100644 --- a/arch/x86/include/asm/pci_64.h +++ b/arch/x86/include/asm/pci_64.h | |||
@@ -34,8 +34,6 @@ extern void pci_iommu_alloc(void); | |||
34 | */ | 34 | */ |
35 | #define PCI_DMA_BUS_IS_PHYS (dma_ops->is_phys) | 35 | #define PCI_DMA_BUS_IS_PHYS (dma_ops->is_phys) |
36 | 36 | ||
37 | #if defined(CONFIG_GART_IOMMU) || defined(CONFIG_CALGARY_IOMMU) | ||
38 | |||
39 | #define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) \ | 37 | #define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) \ |
40 | dma_addr_t ADDR_NAME; | 38 | dma_addr_t ADDR_NAME; |
41 | #define DECLARE_PCI_UNMAP_LEN(LEN_NAME) \ | 39 | #define DECLARE_PCI_UNMAP_LEN(LEN_NAME) \ |
@@ -49,18 +47,6 @@ extern void pci_iommu_alloc(void); | |||
49 | #define pci_unmap_len_set(PTR, LEN_NAME, VAL) \ | 47 | #define pci_unmap_len_set(PTR, LEN_NAME, VAL) \ |
50 | (((PTR)->LEN_NAME) = (VAL)) | 48 | (((PTR)->LEN_NAME) = (VAL)) |
51 | 49 | ||
52 | #else | ||
53 | /* No IOMMU */ | ||
54 | |||
55 | #define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) | ||
56 | #define DECLARE_PCI_UNMAP_LEN(LEN_NAME) | ||
57 | #define pci_unmap_addr(PTR, ADDR_NAME) (0) | ||
58 | #define pci_unmap_addr_set(PTR, ADDR_NAME, VAL) do { } while (0) | ||
59 | #define pci_unmap_len(PTR, LEN_NAME) (0) | ||
60 | #define pci_unmap_len_set(PTR, LEN_NAME, VAL) do { } while (0) | ||
61 | |||
62 | #endif | ||
63 | |||
64 | #endif /* __KERNEL__ */ | 50 | #endif /* __KERNEL__ */ |
65 | 51 | ||
66 | #endif /* _ASM_X86_PCI_64_H */ | 52 | #endif /* _ASM_X86_PCI_64_H */ |
diff --git a/arch/x86/include/asm/ptrace.h b/arch/x86/include/asm/ptrace.h index d1531c8480b7..eefb0594b058 100644 --- a/arch/x86/include/asm/ptrace.h +++ b/arch/x86/include/asm/ptrace.h | |||
@@ -271,8 +271,6 @@ extern int do_get_thread_area(struct task_struct *p, int idx, | |||
271 | extern int do_set_thread_area(struct task_struct *p, int idx, | 271 | extern int do_set_thread_area(struct task_struct *p, int idx, |
272 | struct user_desc __user *info, int can_allocate); | 272 | struct user_desc __user *info, int can_allocate); |
273 | 273 | ||
274 | #define __ARCH_WANT_COMPAT_SYS_PTRACE | ||
275 | |||
276 | #endif /* __KERNEL__ */ | 274 | #endif /* __KERNEL__ */ |
277 | 275 | ||
278 | #endif /* !__ASSEMBLY__ */ | 276 | #endif /* !__ASSEMBLY__ */ |
diff --git a/arch/x86/include/asm/uaccess_64.h b/arch/x86/include/asm/uaccess_64.h index 543ba883cc66..84210c479fca 100644 --- a/arch/x86/include/asm/uaccess_64.h +++ b/arch/x86/include/asm/uaccess_64.h | |||
@@ -48,7 +48,7 @@ int __copy_from_user(void *dst, const void __user *src, unsigned size) | |||
48 | return ret; | 48 | return ret; |
49 | case 10: | 49 | case 10: |
50 | __get_user_asm(*(u64 *)dst, (u64 __user *)src, | 50 | __get_user_asm(*(u64 *)dst, (u64 __user *)src, |
51 | ret, "q", "", "=r", 16); | 51 | ret, "q", "", "=r", 10); |
52 | if (unlikely(ret)) | 52 | if (unlikely(ret)) |
53 | return ret; | 53 | return ret; |
54 | __get_user_asm(*(u16 *)(8 + (char *)dst), | 54 | __get_user_asm(*(u16 *)(8 + (char *)dst), |
diff --git a/arch/x86/include/asm/unistd_64.h b/arch/x86/include/asm/unistd_64.h index 834b2c1d89fb..d2e415e6666f 100644 --- a/arch/x86/include/asm/unistd_64.h +++ b/arch/x86/include/asm/unistd_64.h | |||
@@ -639,8 +639,8 @@ __SYSCALL(__NR_fallocate, sys_fallocate) | |||
639 | __SYSCALL(__NR_timerfd_settime, sys_timerfd_settime) | 639 | __SYSCALL(__NR_timerfd_settime, sys_timerfd_settime) |
640 | #define __NR_timerfd_gettime 287 | 640 | #define __NR_timerfd_gettime 287 |
641 | __SYSCALL(__NR_timerfd_gettime, sys_timerfd_gettime) | 641 | __SYSCALL(__NR_timerfd_gettime, sys_timerfd_gettime) |
642 | #define __NR_paccept 288 | 642 | #define __NR_accept4 288 |
643 | __SYSCALL(__NR_paccept, sys_paccept) | 643 | __SYSCALL(__NR_accept4, sys_accept4) |
644 | #define __NR_signalfd4 289 | 644 | #define __NR_signalfd4 289 |
645 | __SYSCALL(__NR_signalfd4, sys_signalfd4) | 645 | __SYSCALL(__NR_signalfd4, sys_signalfd4) |
646 | #define __NR_eventfd2 290 | 646 | #define __NR_eventfd2 290 |
diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile index e489ff9cb3e2..b62a7667828e 100644 --- a/arch/x86/kernel/Makefile +++ b/arch/x86/kernel/Makefile | |||
@@ -41,7 +41,7 @@ obj-$(CONFIG_X86_TRAMPOLINE) += trampoline.o | |||
41 | obj-y += process.o | 41 | obj-y += process.o |
42 | obj-y += i387.o xsave.o | 42 | obj-y += i387.o xsave.o |
43 | obj-y += ptrace.o | 43 | obj-y += ptrace.o |
44 | obj-y += ds.o | 44 | obj-$(CONFIG_X86_DS) += ds.o |
45 | obj-$(CONFIG_X86_32) += tls.o | 45 | obj-$(CONFIG_X86_32) += tls.o |
46 | obj-$(CONFIG_IA32_EMULATION) += tls.o | 46 | obj-$(CONFIG_IA32_EMULATION) += tls.o |
47 | obj-y += step.o | 47 | obj-y += step.o |
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index 8c1f76abae9e..4c51a2f8fd31 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c | |||
@@ -1343,7 +1343,6 @@ static void __init acpi_process_madt(void) | |||
1343 | error = acpi_parse_madt_ioapic_entries(); | 1343 | error = acpi_parse_madt_ioapic_entries(); |
1344 | if (!error) { | 1344 | if (!error) { |
1345 | acpi_irq_model = ACPI_IRQ_MODEL_IOAPIC; | 1345 | acpi_irq_model = ACPI_IRQ_MODEL_IOAPIC; |
1346 | acpi_irq_balance_set(NULL); | ||
1347 | acpi_ioapic = 1; | 1346 | acpi_ioapic = 1; |
1348 | 1347 | ||
1349 | smp_found_config = 1; | 1348 | smp_found_config = 1; |
diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c index 331b318304eb..e4899e0e8787 100644 --- a/arch/x86/kernel/amd_iommu.c +++ b/arch/x86/kernel/amd_iommu.c | |||
@@ -537,7 +537,7 @@ static void dma_ops_free_addresses(struct dma_ops_domain *dom, | |||
537 | address >>= PAGE_SHIFT; | 537 | address >>= PAGE_SHIFT; |
538 | iommu_area_free(dom->bitmap, address, pages); | 538 | iommu_area_free(dom->bitmap, address, pages); |
539 | 539 | ||
540 | if (address + pages >= dom->next_bit) | 540 | if (address >= dom->next_bit) |
541 | dom->need_flush = true; | 541 | dom->need_flush = true; |
542 | } | 542 | } |
543 | 543 | ||
diff --git a/arch/x86/kernel/amd_iommu_init.c b/arch/x86/kernel/amd_iommu_init.c index 0cdcda35a05f..30ae2701b3df 100644 --- a/arch/x86/kernel/amd_iommu_init.c +++ b/arch/x86/kernel/amd_iommu_init.c | |||
@@ -121,7 +121,7 @@ u16 amd_iommu_last_bdf; /* largest PCI device id we have | |||
121 | LIST_HEAD(amd_iommu_unity_map); /* a list of required unity mappings | 121 | LIST_HEAD(amd_iommu_unity_map); /* a list of required unity mappings |
122 | we find in ACPI */ | 122 | we find in ACPI */ |
123 | unsigned amd_iommu_aperture_order = 26; /* size of aperture in power of 2 */ | 123 | unsigned amd_iommu_aperture_order = 26; /* size of aperture in power of 2 */ |
124 | int amd_iommu_isolate; /* if 1, device isolation is enabled */ | 124 | int amd_iommu_isolate = 1; /* if 1, device isolation is enabled */ |
125 | bool amd_iommu_unmap_flush; /* if true, flush on every unmap */ | 125 | bool amd_iommu_unmap_flush; /* if true, flush on every unmap */ |
126 | 126 | ||
127 | LIST_HEAD(amd_iommu_list); /* list of all AMD IOMMUs in the | 127 | LIST_HEAD(amd_iommu_list); /* list of all AMD IOMMUs in the |
@@ -1213,7 +1213,9 @@ static int __init parse_amd_iommu_options(char *str) | |||
1213 | for (; *str; ++str) { | 1213 | for (; *str; ++str) { |
1214 | if (strncmp(str, "isolate", 7) == 0) | 1214 | if (strncmp(str, "isolate", 7) == 0) |
1215 | amd_iommu_isolate = 1; | 1215 | amd_iommu_isolate = 1; |
1216 | if (strncmp(str, "fullflush", 11) == 0) | 1216 | if (strncmp(str, "share", 5) == 0) |
1217 | amd_iommu_isolate = 0; | ||
1218 | if (strncmp(str, "fullflush", 9) == 0) | ||
1217 | amd_iommu_unmap_flush = true; | 1219 | amd_iommu_unmap_flush = true; |
1218 | } | 1220 | } |
1219 | 1221 | ||
diff --git a/arch/x86/kernel/apic.c b/arch/x86/kernel/apic.c index 04a7f960bbc0..16f94879b525 100644 --- a/arch/x86/kernel/apic.c +++ b/arch/x86/kernel/apic.c | |||
@@ -1315,7 +1315,7 @@ void enable_x2apic(void) | |||
1315 | } | 1315 | } |
1316 | } | 1316 | } |
1317 | 1317 | ||
1318 | void enable_IR_x2apic(void) | 1318 | void __init enable_IR_x2apic(void) |
1319 | { | 1319 | { |
1320 | #ifdef CONFIG_INTR_REMAP | 1320 | #ifdef CONFIG_INTR_REMAP |
1321 | int ret; | 1321 | int ret; |
diff --git a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c index d3dcd58b87cd..7f05f44b97e9 100644 --- a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c +++ b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c | |||
@@ -115,9 +115,20 @@ static int query_current_values_with_pending_wait(struct powernow_k8_data *data) | |||
115 | u32 i = 0; | 115 | u32 i = 0; |
116 | 116 | ||
117 | if (cpu_family == CPU_HW_PSTATE) { | 117 | if (cpu_family == CPU_HW_PSTATE) { |
118 | rdmsr(MSR_PSTATE_STATUS, lo, hi); | 118 | if (data->currpstate == HW_PSTATE_INVALID) { |
119 | i = lo & HW_PSTATE_MASK; | 119 | /* read (initial) hw pstate if not yet set */ |
120 | data->currpstate = i; | 120 | rdmsr(MSR_PSTATE_STATUS, lo, hi); |
121 | i = lo & HW_PSTATE_MASK; | ||
122 | |||
123 | /* | ||
124 | * a workaround for family 11h erratum 311 might cause | ||
125 | * an "out-of-range Pstate if the core is in Pstate-0 | ||
126 | */ | ||
127 | if (i >= data->numps) | ||
128 | data->currpstate = HW_PSTATE_0; | ||
129 | else | ||
130 | data->currpstate = i; | ||
131 | } | ||
121 | return 0; | 132 | return 0; |
122 | } | 133 | } |
123 | do { | 134 | do { |
@@ -1121,6 +1132,7 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol) | |||
1121 | } | 1132 | } |
1122 | 1133 | ||
1123 | data->cpu = pol->cpu; | 1134 | data->cpu = pol->cpu; |
1135 | data->currpstate = HW_PSTATE_INVALID; | ||
1124 | 1136 | ||
1125 | if (powernow_k8_cpu_init_acpi(data)) { | 1137 | if (powernow_k8_cpu_init_acpi(data)) { |
1126 | /* | 1138 | /* |
diff --git a/arch/x86/kernel/cpu/cpufreq/powernow-k8.h b/arch/x86/kernel/cpu/cpufreq/powernow-k8.h index ab48cfed4d96..65cfb5d7f77f 100644 --- a/arch/x86/kernel/cpu/cpufreq/powernow-k8.h +++ b/arch/x86/kernel/cpu/cpufreq/powernow-k8.h | |||
@@ -5,6 +5,19 @@ | |||
5 | * http://www.gnu.org/licenses/gpl.html | 5 | * http://www.gnu.org/licenses/gpl.html |
6 | */ | 6 | */ |
7 | 7 | ||
8 | |||
9 | enum pstate { | ||
10 | HW_PSTATE_INVALID = 0xff, | ||
11 | HW_PSTATE_0 = 0, | ||
12 | HW_PSTATE_1 = 1, | ||
13 | HW_PSTATE_2 = 2, | ||
14 | HW_PSTATE_3 = 3, | ||
15 | HW_PSTATE_4 = 4, | ||
16 | HW_PSTATE_5 = 5, | ||
17 | HW_PSTATE_6 = 6, | ||
18 | HW_PSTATE_7 = 7, | ||
19 | }; | ||
20 | |||
8 | struct powernow_k8_data { | 21 | struct powernow_k8_data { |
9 | unsigned int cpu; | 22 | unsigned int cpu; |
10 | 23 | ||
@@ -23,7 +36,9 @@ struct powernow_k8_data { | |||
23 | u32 exttype; /* extended interface = 1 */ | 36 | u32 exttype; /* extended interface = 1 */ |
24 | 37 | ||
25 | /* keep track of the current fid / vid or pstate */ | 38 | /* keep track of the current fid / vid or pstate */ |
26 | u32 currvid, currfid, currpstate; | 39 | u32 currvid; |
40 | u32 currfid; | ||
41 | enum pstate currpstate; | ||
27 | 42 | ||
28 | /* the powernow_table includes all frequency and vid/fid pairings: | 43 | /* the powernow_table includes all frequency and vid/fid pairings: |
29 | * fid are the lower 8 bits of the index, vid are the upper 8 bits. | 44 | * fid are the lower 8 bits of the index, vid are the upper 8 bits. |
diff --git a/arch/x86/kernel/ds.c b/arch/x86/kernel/ds.c index 2b69994fd3a8..a2d1176c38ee 100644 --- a/arch/x86/kernel/ds.c +++ b/arch/x86/kernel/ds.c | |||
@@ -21,8 +21,6 @@ | |||
21 | */ | 21 | */ |
22 | 22 | ||
23 | 23 | ||
24 | #ifdef CONFIG_X86_DS | ||
25 | |||
26 | #include <asm/ds.h> | 24 | #include <asm/ds.h> |
27 | 25 | ||
28 | #include <linux/errno.h> | 26 | #include <linux/errno.h> |
@@ -211,14 +209,15 @@ static DEFINE_PER_CPU(struct ds_context *, system_context); | |||
211 | static inline struct ds_context *ds_get_context(struct task_struct *task) | 209 | static inline struct ds_context *ds_get_context(struct task_struct *task) |
212 | { | 210 | { |
213 | struct ds_context *context; | 211 | struct ds_context *context; |
212 | unsigned long irq; | ||
214 | 213 | ||
215 | spin_lock(&ds_lock); | 214 | spin_lock_irqsave(&ds_lock, irq); |
216 | 215 | ||
217 | context = (task ? task->thread.ds_ctx : this_system_context); | 216 | context = (task ? task->thread.ds_ctx : this_system_context); |
218 | if (context) | 217 | if (context) |
219 | context->count++; | 218 | context->count++; |
220 | 219 | ||
221 | spin_unlock(&ds_lock); | 220 | spin_unlock_irqrestore(&ds_lock, irq); |
222 | 221 | ||
223 | return context; | 222 | return context; |
224 | } | 223 | } |
@@ -226,18 +225,16 @@ static inline struct ds_context *ds_get_context(struct task_struct *task) | |||
226 | /* | 225 | /* |
227 | * Same as ds_get_context, but allocates the context and it's DS | 226 | * Same as ds_get_context, but allocates the context and it's DS |
228 | * structure, if necessary; returns NULL; if out of memory. | 227 | * structure, if necessary; returns NULL; if out of memory. |
229 | * | ||
230 | * pre: requires ds_lock to be held | ||
231 | */ | 228 | */ |
232 | static inline struct ds_context *ds_alloc_context(struct task_struct *task) | 229 | static inline struct ds_context *ds_alloc_context(struct task_struct *task) |
233 | { | 230 | { |
234 | struct ds_context **p_context = | 231 | struct ds_context **p_context = |
235 | (task ? &task->thread.ds_ctx : &this_system_context); | 232 | (task ? &task->thread.ds_ctx : &this_system_context); |
236 | struct ds_context *context = *p_context; | 233 | struct ds_context *context = *p_context; |
234 | unsigned long irq; | ||
237 | 235 | ||
238 | if (!context) { | 236 | if (!context) { |
239 | context = kzalloc(sizeof(*context), GFP_KERNEL); | 237 | context = kzalloc(sizeof(*context), GFP_KERNEL); |
240 | |||
241 | if (!context) | 238 | if (!context) |
242 | return NULL; | 239 | return NULL; |
243 | 240 | ||
@@ -247,18 +244,27 @@ static inline struct ds_context *ds_alloc_context(struct task_struct *task) | |||
247 | return NULL; | 244 | return NULL; |
248 | } | 245 | } |
249 | 246 | ||
250 | *p_context = context; | 247 | spin_lock_irqsave(&ds_lock, irq); |
251 | 248 | ||
252 | context->this = p_context; | 249 | if (*p_context) { |
253 | context->task = task; | 250 | kfree(context->ds); |
251 | kfree(context); | ||
252 | |||
253 | context = *p_context; | ||
254 | } else { | ||
255 | *p_context = context; | ||
254 | 256 | ||
255 | if (task) | 257 | context->this = p_context; |
256 | set_tsk_thread_flag(task, TIF_DS_AREA_MSR); | 258 | context->task = task; |
257 | 259 | ||
258 | if (!task || (task == current)) | 260 | if (task) |
259 | wrmsr(MSR_IA32_DS_AREA, (unsigned long)context->ds, 0); | 261 | set_tsk_thread_flag(task, TIF_DS_AREA_MSR); |
260 | 262 | ||
261 | get_tracer(task); | 263 | if (!task || (task == current)) |
264 | wrmsrl(MSR_IA32_DS_AREA, | ||
265 | (unsigned long)context->ds); | ||
266 | } | ||
267 | spin_unlock_irqrestore(&ds_lock, irq); | ||
262 | } | 268 | } |
263 | 269 | ||
264 | context->count++; | 270 | context->count++; |
@@ -272,10 +278,12 @@ static inline struct ds_context *ds_alloc_context(struct task_struct *task) | |||
272 | */ | 278 | */ |
273 | static inline void ds_put_context(struct ds_context *context) | 279 | static inline void ds_put_context(struct ds_context *context) |
274 | { | 280 | { |
281 | unsigned long irq; | ||
282 | |||
275 | if (!context) | 283 | if (!context) |
276 | return; | 284 | return; |
277 | 285 | ||
278 | spin_lock(&ds_lock); | 286 | spin_lock_irqsave(&ds_lock, irq); |
279 | 287 | ||
280 | if (--context->count) | 288 | if (--context->count) |
281 | goto out; | 289 | goto out; |
@@ -297,7 +305,7 @@ static inline void ds_put_context(struct ds_context *context) | |||
297 | kfree(context->ds); | 305 | kfree(context->ds); |
298 | kfree(context); | 306 | kfree(context); |
299 | out: | 307 | out: |
300 | spin_unlock(&ds_lock); | 308 | spin_unlock_irqrestore(&ds_lock, irq); |
301 | } | 309 | } |
302 | 310 | ||
303 | 311 | ||
@@ -368,6 +376,7 @@ static int ds_request(struct task_struct *task, void *base, size_t size, | |||
368 | struct ds_context *context; | 376 | struct ds_context *context; |
369 | unsigned long buffer, adj; | 377 | unsigned long buffer, adj; |
370 | const unsigned long alignment = (1 << 3); | 378 | const unsigned long alignment = (1 << 3); |
379 | unsigned long irq; | ||
371 | int error = 0; | 380 | int error = 0; |
372 | 381 | ||
373 | if (!ds_cfg.sizeof_ds) | 382 | if (!ds_cfg.sizeof_ds) |
@@ -382,25 +391,27 @@ static int ds_request(struct task_struct *task, void *base, size_t size, | |||
382 | return -EOPNOTSUPP; | 391 | return -EOPNOTSUPP; |
383 | 392 | ||
384 | 393 | ||
385 | spin_lock(&ds_lock); | ||
386 | |||
387 | if (!check_tracer(task)) | ||
388 | return -EPERM; | ||
389 | |||
390 | error = -ENOMEM; | ||
391 | context = ds_alloc_context(task); | 394 | context = ds_alloc_context(task); |
392 | if (!context) | 395 | if (!context) |
396 | return -ENOMEM; | ||
397 | |||
398 | spin_lock_irqsave(&ds_lock, irq); | ||
399 | |||
400 | error = -EPERM; | ||
401 | if (!check_tracer(task)) | ||
393 | goto out_unlock; | 402 | goto out_unlock; |
394 | 403 | ||
404 | get_tracer(task); | ||
405 | |||
395 | error = -EALREADY; | 406 | error = -EALREADY; |
396 | if (context->owner[qual] == current) | 407 | if (context->owner[qual] == current) |
397 | goto out_unlock; | 408 | goto out_put_tracer; |
398 | error = -EPERM; | 409 | error = -EPERM; |
399 | if (context->owner[qual] != NULL) | 410 | if (context->owner[qual] != NULL) |
400 | goto out_unlock; | 411 | goto out_put_tracer; |
401 | context->owner[qual] = current; | 412 | context->owner[qual] = current; |
402 | 413 | ||
403 | spin_unlock(&ds_lock); | 414 | spin_unlock_irqrestore(&ds_lock, irq); |
404 | 415 | ||
405 | 416 | ||
406 | error = -ENOMEM; | 417 | error = -ENOMEM; |
@@ -448,10 +459,17 @@ static int ds_request(struct task_struct *task, void *base, size_t size, | |||
448 | out_release: | 459 | out_release: |
449 | context->owner[qual] = NULL; | 460 | context->owner[qual] = NULL; |
450 | ds_put_context(context); | 461 | ds_put_context(context); |
462 | put_tracer(task); | ||
463 | return error; | ||
464 | |||
465 | out_put_tracer: | ||
466 | spin_unlock_irqrestore(&ds_lock, irq); | ||
467 | ds_put_context(context); | ||
468 | put_tracer(task); | ||
451 | return error; | 469 | return error; |
452 | 470 | ||
453 | out_unlock: | 471 | out_unlock: |
454 | spin_unlock(&ds_lock); | 472 | spin_unlock_irqrestore(&ds_lock, irq); |
455 | ds_put_context(context); | 473 | ds_put_context(context); |
456 | return error; | 474 | return error; |
457 | } | 475 | } |
@@ -801,13 +819,21 @@ static const struct ds_configuration ds_cfg_var = { | |||
801 | .sizeof_ds = sizeof(long) * 12, | 819 | .sizeof_ds = sizeof(long) * 12, |
802 | .sizeof_field = sizeof(long), | 820 | .sizeof_field = sizeof(long), |
803 | .sizeof_rec[ds_bts] = sizeof(long) * 3, | 821 | .sizeof_rec[ds_bts] = sizeof(long) * 3, |
822 | #ifdef __i386__ | ||
804 | .sizeof_rec[ds_pebs] = sizeof(long) * 10 | 823 | .sizeof_rec[ds_pebs] = sizeof(long) * 10 |
824 | #else | ||
825 | .sizeof_rec[ds_pebs] = sizeof(long) * 18 | ||
826 | #endif | ||
805 | }; | 827 | }; |
806 | static const struct ds_configuration ds_cfg_64 = { | 828 | static const struct ds_configuration ds_cfg_64 = { |
807 | .sizeof_ds = 8 * 12, | 829 | .sizeof_ds = 8 * 12, |
808 | .sizeof_field = 8, | 830 | .sizeof_field = 8, |
809 | .sizeof_rec[ds_bts] = 8 * 3, | 831 | .sizeof_rec[ds_bts] = 8 * 3, |
832 | #ifdef __i386__ | ||
810 | .sizeof_rec[ds_pebs] = 8 * 10 | 833 | .sizeof_rec[ds_pebs] = 8 * 10 |
834 | #else | ||
835 | .sizeof_rec[ds_pebs] = 8 * 18 | ||
836 | #endif | ||
811 | }; | 837 | }; |
812 | 838 | ||
813 | static inline void | 839 | static inline void |
@@ -861,4 +887,3 @@ void ds_free(struct ds_context *context) | |||
861 | while (leftovers--) | 887 | while (leftovers--) |
862 | ds_put_context(context); | 888 | ds_put_context(context); |
863 | } | 889 | } |
864 | #endif /* CONFIG_X86_DS */ | ||
diff --git a/arch/x86/kernel/early-quirks.c b/arch/x86/kernel/early-quirks.c index 3ce029ffaa55..1b894b72c0f5 100644 --- a/arch/x86/kernel/early-quirks.c +++ b/arch/x86/kernel/early-quirks.c | |||
@@ -188,20 +188,6 @@ static void __init ati_bugs_contd(int num, int slot, int func) | |||
188 | } | 188 | } |
189 | #endif | 189 | #endif |
190 | 190 | ||
191 | #ifdef CONFIG_DMAR | ||
192 | static void __init intel_g33_dmar(int num, int slot, int func) | ||
193 | { | ||
194 | struct acpi_table_header *dmar_tbl; | ||
195 | acpi_status status; | ||
196 | |||
197 | status = acpi_get_table(ACPI_SIG_DMAR, 0, &dmar_tbl); | ||
198 | if (ACPI_SUCCESS(status)) { | ||
199 | printk(KERN_INFO "BIOS BUG: DMAR advertised on Intel G31/G33 chipset -- ignoring\n"); | ||
200 | dmar_disabled = 1; | ||
201 | } | ||
202 | } | ||
203 | #endif | ||
204 | |||
205 | #define QFLAG_APPLY_ONCE 0x1 | 191 | #define QFLAG_APPLY_ONCE 0x1 |
206 | #define QFLAG_APPLIED 0x2 | 192 | #define QFLAG_APPLIED 0x2 |
207 | #define QFLAG_DONE (QFLAG_APPLY_ONCE|QFLAG_APPLIED) | 193 | #define QFLAG_DONE (QFLAG_APPLY_ONCE|QFLAG_APPLIED) |
@@ -225,10 +211,6 @@ static struct chipset early_qrk[] __initdata = { | |||
225 | PCI_CLASS_SERIAL_SMBUS, PCI_ANY_ID, 0, ati_bugs }, | 211 | PCI_CLASS_SERIAL_SMBUS, PCI_ANY_ID, 0, ati_bugs }, |
226 | { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_SBX00_SMBUS, | 212 | { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_SBX00_SMBUS, |
227 | PCI_CLASS_SERIAL_SMBUS, PCI_ANY_ID, 0, ati_bugs_contd }, | 213 | PCI_CLASS_SERIAL_SMBUS, PCI_ANY_ID, 0, ati_bugs_contd }, |
228 | #ifdef CONFIG_DMAR | ||
229 | { PCI_VENDOR_ID_INTEL, 0x29c0, | ||
230 | PCI_CLASS_BRIDGE_HOST, PCI_ANY_ID, 0, intel_g33_dmar }, | ||
231 | #endif | ||
232 | {} | 214 | {} |
233 | }; | 215 | }; |
234 | 216 | ||
diff --git a/arch/x86/kernel/es7000_32.c b/arch/x86/kernel/es7000_32.c index f454c78fcef6..0aa2c443d600 100644 --- a/arch/x86/kernel/es7000_32.c +++ b/arch/x86/kernel/es7000_32.c | |||
@@ -250,31 +250,24 @@ int __init find_unisys_acpi_oem_table(unsigned long *oem_addr) | |||
250 | { | 250 | { |
251 | struct acpi_table_header *header = NULL; | 251 | struct acpi_table_header *header = NULL; |
252 | int i = 0; | 252 | int i = 0; |
253 | acpi_size tbl_size; | ||
254 | 253 | ||
255 | while (ACPI_SUCCESS(acpi_get_table_with_size("OEM1", i++, &header, &tbl_size))) { | 254 | while (ACPI_SUCCESS(acpi_get_table("OEM1", i++, &header))) { |
256 | if (!memcmp((char *) &header->oem_id, "UNISYS", 6)) { | 255 | if (!memcmp((char *) &header->oem_id, "UNISYS", 6)) { |
257 | struct oem_table *t = (struct oem_table *)header; | 256 | struct oem_table *t = (struct oem_table *)header; |
258 | 257 | ||
259 | oem_addrX = t->OEMTableAddr; | 258 | oem_addrX = t->OEMTableAddr; |
260 | oem_size = t->OEMTableSize; | 259 | oem_size = t->OEMTableSize; |
261 | early_acpi_os_unmap_memory(header, tbl_size); | ||
262 | 260 | ||
263 | *oem_addr = (unsigned long)__acpi_map_table(oem_addrX, | 261 | *oem_addr = (unsigned long)__acpi_map_table(oem_addrX, |
264 | oem_size); | 262 | oem_size); |
265 | return 0; | 263 | return 0; |
266 | } | 264 | } |
267 | early_acpi_os_unmap_memory(header, tbl_size); | ||
268 | } | 265 | } |
269 | return -1; | 266 | return -1; |
270 | } | 267 | } |
271 | 268 | ||
272 | void __init unmap_unisys_acpi_oem_table(unsigned long oem_addr) | 269 | void __init unmap_unisys_acpi_oem_table(unsigned long oem_addr) |
273 | { | 270 | { |
274 | if (!oem_addr) | ||
275 | return; | ||
276 | |||
277 | __acpi_unmap_table((char *)oem_addr, oem_size); | ||
278 | } | 271 | } |
279 | #endif | 272 | #endif |
280 | 273 | ||
diff --git a/arch/x86/kernel/i387.c b/arch/x86/kernel/i387.c index 1f20608d4ca8..b0f61f0dcd0a 100644 --- a/arch/x86/kernel/i387.c +++ b/arch/x86/kernel/i387.c | |||
@@ -58,7 +58,7 @@ void __cpuinit mxcsr_feature_mask_init(void) | |||
58 | stts(); | 58 | stts(); |
59 | } | 59 | } |
60 | 60 | ||
61 | void __init init_thread_xstate(void) | 61 | void __cpuinit init_thread_xstate(void) |
62 | { | 62 | { |
63 | if (!HAVE_HWFP) { | 63 | if (!HAVE_HWFP) { |
64 | xstate_size = sizeof(struct i387_soft_struct); | 64 | xstate_size = sizeof(struct i387_soft_struct); |
diff --git a/arch/x86/kernel/io_apic.c b/arch/x86/kernel/io_apic.c index 7a3f2028e2eb..9043251210fb 100644 --- a/arch/x86/kernel/io_apic.c +++ b/arch/x86/kernel/io_apic.c | |||
@@ -1140,6 +1140,20 @@ static void __clear_irq_vector(int irq) | |||
1140 | 1140 | ||
1141 | cfg->vector = 0; | 1141 | cfg->vector = 0; |
1142 | cpus_clear(cfg->domain); | 1142 | cpus_clear(cfg->domain); |
1143 | |||
1144 | if (likely(!cfg->move_in_progress)) | ||
1145 | return; | ||
1146 | cpus_and(mask, cfg->old_domain, cpu_online_map); | ||
1147 | for_each_cpu_mask_nr(cpu, mask) { | ||
1148 | for (vector = FIRST_EXTERNAL_VECTOR; vector < NR_VECTORS; | ||
1149 | vector++) { | ||
1150 | if (per_cpu(vector_irq, cpu)[vector] != irq) | ||
1151 | continue; | ||
1152 | per_cpu(vector_irq, cpu)[vector] = -1; | ||
1153 | break; | ||
1154 | } | ||
1155 | } | ||
1156 | cfg->move_in_progress = 0; | ||
1143 | } | 1157 | } |
1144 | 1158 | ||
1145 | void __setup_vector_irq(int cpu) | 1159 | void __setup_vector_irq(int cpu) |
@@ -3594,27 +3608,7 @@ int __init io_apic_get_redir_entries (int ioapic) | |||
3594 | 3608 | ||
3595 | int __init probe_nr_irqs(void) | 3609 | int __init probe_nr_irqs(void) |
3596 | { | 3610 | { |
3597 | int idx; | 3611 | return NR_IRQS; |
3598 | int nr = 0; | ||
3599 | #ifndef CONFIG_XEN | ||
3600 | int nr_min = 32; | ||
3601 | #else | ||
3602 | int nr_min = NR_IRQS; | ||
3603 | #endif | ||
3604 | |||
3605 | for (idx = 0; idx < nr_ioapics; idx++) | ||
3606 | nr += io_apic_get_redir_entries(idx) + 1; | ||
3607 | |||
3608 | /* double it for hotplug and msi and nmi */ | ||
3609 | nr <<= 1; | ||
3610 | |||
3611 | /* something wrong ? */ | ||
3612 | if (nr < nr_min) | ||
3613 | nr = nr_min; | ||
3614 | if (WARN_ON(nr > NR_IRQS)) | ||
3615 | nr = NR_IRQS; | ||
3616 | |||
3617 | return nr; | ||
3618 | } | 3612 | } |
3619 | 3613 | ||
3620 | /* -------------------------------------------------------------------------- | 3614 | /* -------------------------------------------------------------------------- |
@@ -3761,7 +3755,9 @@ int acpi_get_override_irq(int bus_irq, int *trigger, int *polarity) | |||
3761 | void __init setup_ioapic_dest(void) | 3755 | void __init setup_ioapic_dest(void) |
3762 | { | 3756 | { |
3763 | int pin, ioapic, irq, irq_entry; | 3757 | int pin, ioapic, irq, irq_entry; |
3758 | struct irq_desc *desc; | ||
3764 | struct irq_cfg *cfg; | 3759 | struct irq_cfg *cfg; |
3760 | cpumask_t mask; | ||
3765 | 3761 | ||
3766 | if (skip_ioapic_setup == 1) | 3762 | if (skip_ioapic_setup == 1) |
3767 | return; | 3763 | return; |
@@ -3778,16 +3774,30 @@ void __init setup_ioapic_dest(void) | |||
3778 | * cpu is online. | 3774 | * cpu is online. |
3779 | */ | 3775 | */ |
3780 | cfg = irq_cfg(irq); | 3776 | cfg = irq_cfg(irq); |
3781 | if (!cfg->vector) | 3777 | if (!cfg->vector) { |
3782 | setup_IO_APIC_irq(ioapic, pin, irq, | 3778 | setup_IO_APIC_irq(ioapic, pin, irq, |
3783 | irq_trigger(irq_entry), | 3779 | irq_trigger(irq_entry), |
3784 | irq_polarity(irq_entry)); | 3780 | irq_polarity(irq_entry)); |
3781 | continue; | ||
3782 | |||
3783 | } | ||
3784 | |||
3785 | /* | ||
3786 | * Honour affinities which have been set in early boot | ||
3787 | */ | ||
3788 | desc = irq_to_desc(irq); | ||
3789 | if (desc->status & | ||
3790 | (IRQ_NO_BALANCING | IRQ_AFFINITY_SET)) | ||
3791 | mask = desc->affinity; | ||
3792 | else | ||
3793 | mask = TARGET_CPUS; | ||
3794 | |||
3785 | #ifdef CONFIG_INTR_REMAP | 3795 | #ifdef CONFIG_INTR_REMAP |
3786 | else if (intr_remapping_enabled) | 3796 | if (intr_remapping_enabled) |
3787 | set_ir_ioapic_affinity_irq(irq, TARGET_CPUS); | 3797 | set_ir_ioapic_affinity_irq(irq, mask); |
3788 | #endif | ||
3789 | else | 3798 | else |
3790 | set_ioapic_affinity_irq(irq, TARGET_CPUS); | 3799 | #endif |
3800 | set_ioapic_affinity_irq(irq, mask); | ||
3791 | } | 3801 | } |
3792 | 3802 | ||
3793 | } | 3803 | } |
diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c index 774ac4991568..e169ae9b6a62 100644 --- a/arch/x86/kernel/kvmclock.c +++ b/arch/x86/kernel/kvmclock.c | |||
@@ -128,7 +128,7 @@ static int kvm_register_clock(char *txt) | |||
128 | } | 128 | } |
129 | 129 | ||
130 | #ifdef CONFIG_X86_LOCAL_APIC | 130 | #ifdef CONFIG_X86_LOCAL_APIC |
131 | static void kvm_setup_secondary_clock(void) | 131 | static void __cpuinit kvm_setup_secondary_clock(void) |
132 | { | 132 | { |
133 | /* | 133 | /* |
134 | * Now that the first cpu already had this clocksource initialized, | 134 | * Now that the first cpu already had this clocksource initialized, |
diff --git a/arch/x86/kernel/pci-calgary_64.c b/arch/x86/kernel/pci-calgary_64.c index e1e731d78f38..d28bbdc35e4e 100644 --- a/arch/x86/kernel/pci-calgary_64.c +++ b/arch/x86/kernel/pci-calgary_64.c | |||
@@ -1567,7 +1567,7 @@ static int __init calgary_parse_options(char *p) | |||
1567 | ++p; | 1567 | ++p; |
1568 | if (*p == '\0') | 1568 | if (*p == '\0') |
1569 | break; | 1569 | break; |
1570 | bridge = simple_strtol(p, &endp, 0); | 1570 | bridge = simple_strtoul(p, &endp, 0); |
1571 | if (p == endp) | 1571 | if (p == endp) |
1572 | break; | 1572 | break; |
1573 | 1573 | ||
diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c index 724adfc63cb9..cc5a2545dd41 100644 --- a/arch/x86/kernel/reboot.c +++ b/arch/x86/kernel/reboot.c | |||
@@ -169,6 +169,15 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = { | |||
169 | DMI_MATCH(DMI_BOARD_NAME, "0KW626"), | 169 | DMI_MATCH(DMI_BOARD_NAME, "0KW626"), |
170 | }, | 170 | }, |
171 | }, | 171 | }, |
172 | { /* Handle problems with rebooting on Dell Optiplex 330 with 0KP561 */ | ||
173 | .callback = set_bios_reboot, | ||
174 | .ident = "Dell OptiPlex 330", | ||
175 | .matches = { | ||
176 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
177 | DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 330"), | ||
178 | DMI_MATCH(DMI_BOARD_NAME, "0KP561"), | ||
179 | }, | ||
180 | }, | ||
172 | { /* Handle problems with rebooting on Dell 2400's */ | 181 | { /* Handle problems with rebooting on Dell 2400's */ |
173 | .callback = set_bios_reboot, | 182 | .callback = set_bios_reboot, |
174 | .ident = "Dell PowerEdge 2400", | 183 | .ident = "Dell PowerEdge 2400", |
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index 0fa6790c1dd3..9d5674f7b6cc 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
@@ -764,7 +764,7 @@ static struct dmi_system_id __initdata bad_bios_dmi_table[] = { | |||
764 | .callback = dmi_low_memory_corruption, | 764 | .callback = dmi_low_memory_corruption, |
765 | .ident = "Phoenix BIOS", | 765 | .ident = "Phoenix BIOS", |
766 | .matches = { | 766 | .matches = { |
767 | DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies, LTD"), | 767 | DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies"), |
768 | }, | 768 | }, |
769 | }, | 769 | }, |
770 | #endif | 770 | #endif |
diff --git a/arch/x86/kernel/tsc_sync.c b/arch/x86/kernel/tsc_sync.c index 9ffb01c31c40..1c0dfbca87c1 100644 --- a/arch/x86/kernel/tsc_sync.c +++ b/arch/x86/kernel/tsc_sync.c | |||
@@ -46,7 +46,9 @@ static __cpuinit void check_tsc_warp(void) | |||
46 | cycles_t start, now, prev, end; | 46 | cycles_t start, now, prev, end; |
47 | int i; | 47 | int i; |
48 | 48 | ||
49 | rdtsc_barrier(); | ||
49 | start = get_cycles(); | 50 | start = get_cycles(); |
51 | rdtsc_barrier(); | ||
50 | /* | 52 | /* |
51 | * The measurement runs for 20 msecs: | 53 | * The measurement runs for 20 msecs: |
52 | */ | 54 | */ |
@@ -61,7 +63,9 @@ static __cpuinit void check_tsc_warp(void) | |||
61 | */ | 63 | */ |
62 | __raw_spin_lock(&sync_lock); | 64 | __raw_spin_lock(&sync_lock); |
63 | prev = last_tsc; | 65 | prev = last_tsc; |
66 | rdtsc_barrier(); | ||
64 | now = get_cycles(); | 67 | now = get_cycles(); |
68 | rdtsc_barrier(); | ||
65 | last_tsc = now; | 69 | last_tsc = now; |
66 | __raw_spin_unlock(&sync_lock); | 70 | __raw_spin_unlock(&sync_lock); |
67 | 71 | ||
diff --git a/arch/x86/kernel/xsave.c b/arch/x86/kernel/xsave.c index b13acb75e822..15c3e6999182 100644 --- a/arch/x86/kernel/xsave.c +++ b/arch/x86/kernel/xsave.c | |||
@@ -310,7 +310,7 @@ static void __init setup_xstate_init(void) | |||
310 | /* | 310 | /* |
311 | * Enable and initialize the xsave feature. | 311 | * Enable and initialize the xsave feature. |
312 | */ | 312 | */ |
313 | void __init xsave_cntxt_init(void) | 313 | void __ref xsave_cntxt_init(void) |
314 | { | 314 | { |
315 | unsigned int eax, ebx, ecx, edx; | 315 | unsigned int eax, ebx, ecx, edx; |
316 | 316 | ||
diff --git a/arch/x86/kvm/Kconfig b/arch/x86/kvm/Kconfig index ce3251ce5504..b81125f0bdee 100644 --- a/arch/x86/kvm/Kconfig +++ b/arch/x86/kvm/Kconfig | |||
@@ -20,6 +20,8 @@ if VIRTUALIZATION | |||
20 | config KVM | 20 | config KVM |
21 | tristate "Kernel-based Virtual Machine (KVM) support" | 21 | tristate "Kernel-based Virtual Machine (KVM) support" |
22 | depends on HAVE_KVM | 22 | depends on HAVE_KVM |
23 | # for device assignment: | ||
24 | depends on PCI | ||
23 | select PREEMPT_NOTIFIERS | 25 | select PREEMPT_NOTIFIERS |
24 | select MMU_NOTIFIER | 26 | select MMU_NOTIFIER |
25 | select ANON_INODES | 27 | select ANON_INODES |
diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c index 8772dc946823..59ebd37ad79e 100644 --- a/arch/x86/kvm/i8254.c +++ b/arch/x86/kvm/i8254.c | |||
@@ -548,8 +548,10 @@ struct kvm_pit *kvm_create_pit(struct kvm *kvm) | |||
548 | mutex_lock(&kvm->lock); | 548 | mutex_lock(&kvm->lock); |
549 | pit->irq_source_id = kvm_request_irq_source_id(kvm); | 549 | pit->irq_source_id = kvm_request_irq_source_id(kvm); |
550 | mutex_unlock(&kvm->lock); | 550 | mutex_unlock(&kvm->lock); |
551 | if (pit->irq_source_id < 0) | 551 | if (pit->irq_source_id < 0) { |
552 | kfree(pit); | ||
552 | return NULL; | 553 | return NULL; |
554 | } | ||
553 | 555 | ||
554 | mutex_init(&pit->pit_state.lock); | 556 | mutex_init(&pit->pit_state.lock); |
555 | mutex_lock(&pit->pit_state.lock); | 557 | mutex_lock(&pit->pit_state.lock); |
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 2a5e64881d9b..f1983d9477cd 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c | |||
@@ -314,7 +314,7 @@ static int mmu_topup_memory_caches(struct kvm_vcpu *vcpu) | |||
314 | if (r) | 314 | if (r) |
315 | goto out; | 315 | goto out; |
316 | r = mmu_topup_memory_cache(&vcpu->arch.mmu_rmap_desc_cache, | 316 | r = mmu_topup_memory_cache(&vcpu->arch.mmu_rmap_desc_cache, |
317 | rmap_desc_cache, 1); | 317 | rmap_desc_cache, 4); |
318 | if (r) | 318 | if (r) |
319 | goto out; | 319 | goto out; |
320 | r = mmu_topup_memory_cache_page(&vcpu->arch.mmu_page_cache, 8); | 320 | r = mmu_topup_memory_cache_page(&vcpu->arch.mmu_page_cache, 8); |
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index 2643b430d83a..d06b4dc0e2ea 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c | |||
@@ -3564,7 +3564,8 @@ static int __init vmx_init(void) | |||
3564 | bypass_guest_pf = 0; | 3564 | bypass_guest_pf = 0; |
3565 | kvm_mmu_set_base_ptes(VMX_EPT_READABLE_MASK | | 3565 | kvm_mmu_set_base_ptes(VMX_EPT_READABLE_MASK | |
3566 | VMX_EPT_WRITABLE_MASK | | 3566 | VMX_EPT_WRITABLE_MASK | |
3567 | VMX_EPT_DEFAULT_MT << VMX_EPT_MT_EPTE_SHIFT); | 3567 | VMX_EPT_DEFAULT_MT << VMX_EPT_MT_EPTE_SHIFT | |
3568 | VMX_EPT_IGMT_BIT); | ||
3568 | kvm_mmu_set_mask_ptes(0ull, 0ull, 0ull, 0ull, | 3569 | kvm_mmu_set_mask_ptes(0ull, 0ull, 0ull, 0ull, |
3569 | VMX_EPT_EXECUTABLE_MASK); | 3570 | VMX_EPT_EXECUTABLE_MASK); |
3570 | kvm_enable_tdp(); | 3571 | kvm_enable_tdp(); |
diff --git a/arch/x86/kvm/vmx.h b/arch/x86/kvm/vmx.h index 3e010d21fdd7..ec5edc339da6 100644 --- a/arch/x86/kvm/vmx.h +++ b/arch/x86/kvm/vmx.h | |||
@@ -352,6 +352,7 @@ enum vmcs_field { | |||
352 | #define VMX_EPT_READABLE_MASK 0x1ull | 352 | #define VMX_EPT_READABLE_MASK 0x1ull |
353 | #define VMX_EPT_WRITABLE_MASK 0x2ull | 353 | #define VMX_EPT_WRITABLE_MASK 0x2ull |
354 | #define VMX_EPT_EXECUTABLE_MASK 0x4ull | 354 | #define VMX_EPT_EXECUTABLE_MASK 0x4ull |
355 | #define VMX_EPT_IGMT_BIT (1ull << 6) | ||
355 | 356 | ||
356 | #define VMX_EPT_IDENTITY_PAGETABLE_ADDR 0xfffbc000ul | 357 | #define VMX_EPT_IDENTITY_PAGETABLE_ADDR 0xfffbc000ul |
357 | 358 | ||
diff --git a/arch/x86/mach-voyager/voyager_smp.c b/arch/x86/mach-voyager/voyager_smp.c index 0e331652681e..52145007bd7e 100644 --- a/arch/x86/mach-voyager/voyager_smp.c +++ b/arch/x86/mach-voyager/voyager_smp.c | |||
@@ -7,6 +7,7 @@ | |||
7 | * This file provides all the same external entries as smp.c but uses | 7 | * This file provides all the same external entries as smp.c but uses |
8 | * the voyager hal to provide the functionality | 8 | * the voyager hal to provide the functionality |
9 | */ | 9 | */ |
10 | #include <linux/cpu.h> | ||
10 | #include <linux/module.h> | 11 | #include <linux/module.h> |
11 | #include <linux/mm.h> | 12 | #include <linux/mm.h> |
12 | #include <linux/kernel_stat.h> | 13 | #include <linux/kernel_stat.h> |
@@ -1790,6 +1791,17 @@ void __init smp_setup_processor_id(void) | |||
1790 | x86_write_percpu(cpu_number, hard_smp_processor_id()); | 1791 | x86_write_percpu(cpu_number, hard_smp_processor_id()); |
1791 | } | 1792 | } |
1792 | 1793 | ||
1794 | static void voyager_send_call_func(cpumask_t callmask) | ||
1795 | { | ||
1796 | __u32 mask = cpus_addr(callmask)[0] & ~(1 << smp_processor_id()); | ||
1797 | send_CPI(mask, VIC_CALL_FUNCTION_CPI); | ||
1798 | } | ||
1799 | |||
1800 | static void voyager_send_call_func_single(int cpu) | ||
1801 | { | ||
1802 | send_CPI(1 << cpu, VIC_CALL_FUNCTION_SINGLE_CPI); | ||
1803 | } | ||
1804 | |||
1793 | struct smp_ops smp_ops = { | 1805 | struct smp_ops smp_ops = { |
1794 | .smp_prepare_boot_cpu = voyager_smp_prepare_boot_cpu, | 1806 | .smp_prepare_boot_cpu = voyager_smp_prepare_boot_cpu, |
1795 | .smp_prepare_cpus = voyager_smp_prepare_cpus, | 1807 | .smp_prepare_cpus = voyager_smp_prepare_cpus, |
@@ -1799,6 +1811,6 @@ struct smp_ops smp_ops = { | |||
1799 | .smp_send_stop = voyager_smp_send_stop, | 1811 | .smp_send_stop = voyager_smp_send_stop, |
1800 | .smp_send_reschedule = voyager_smp_send_reschedule, | 1812 | .smp_send_reschedule = voyager_smp_send_reschedule, |
1801 | 1813 | ||
1802 | .send_call_func_ipi = native_send_call_func_ipi, | 1814 | .send_call_func_ipi = voyager_send_call_func, |
1803 | .send_call_func_single_ipi = native_send_call_func_single_ipi, | 1815 | .send_call_func_single_ipi = voyager_send_call_func_single, |
1804 | }; | 1816 | }; |
diff --git a/arch/x86/mm/numa_32.c b/arch/x86/mm/numa_32.c index 847c164725f4..8518c678d83f 100644 --- a/arch/x86/mm/numa_32.c +++ b/arch/x86/mm/numa_32.c | |||
@@ -222,6 +222,41 @@ static void __init remap_numa_kva(void) | |||
222 | } | 222 | } |
223 | } | 223 | } |
224 | 224 | ||
225 | #ifdef CONFIG_HIBERNATION | ||
226 | /** | ||
227 | * resume_map_numa_kva - add KVA mapping to the temporary page tables created | ||
228 | * during resume from hibernation | ||
229 | * @pgd_base - temporary resume page directory | ||
230 | */ | ||
231 | void resume_map_numa_kva(pgd_t *pgd_base) | ||
232 | { | ||
233 | int node; | ||
234 | |||
235 | for_each_online_node(node) { | ||
236 | unsigned long start_va, start_pfn, size, pfn; | ||
237 | |||
238 | start_va = (unsigned long)node_remap_start_vaddr[node]; | ||
239 | start_pfn = node_remap_start_pfn[node]; | ||
240 | size = node_remap_size[node]; | ||
241 | |||
242 | printk(KERN_DEBUG "%s: node %d\n", __FUNCTION__, node); | ||
243 | |||
244 | for (pfn = 0; pfn < size; pfn += PTRS_PER_PTE) { | ||
245 | unsigned long vaddr = start_va + (pfn << PAGE_SHIFT); | ||
246 | pgd_t *pgd = pgd_base + pgd_index(vaddr); | ||
247 | pud_t *pud = pud_offset(pgd, vaddr); | ||
248 | pmd_t *pmd = pmd_offset(pud, vaddr); | ||
249 | |||
250 | set_pmd(pmd, pfn_pmd(start_pfn + pfn, | ||
251 | PAGE_KERNEL_LARGE_EXEC)); | ||
252 | |||
253 | printk(KERN_DEBUG "%s: %08lx -> pfn %08lx\n", | ||
254 | __FUNCTION__, vaddr, start_pfn + pfn); | ||
255 | } | ||
256 | } | ||
257 | } | ||
258 | #endif | ||
259 | |||
225 | static unsigned long calculate_numa_remap_pages(void) | 260 | static unsigned long calculate_numa_remap_pages(void) |
226 | { | 261 | { |
227 | int nid; | 262 | int nid; |
diff --git a/arch/x86/oprofile/op_model_ppro.c b/arch/x86/oprofile/op_model_ppro.c index 3f1b81a83e2e..716d26f0e5d4 100644 --- a/arch/x86/oprofile/op_model_ppro.c +++ b/arch/x86/oprofile/op_model_ppro.c | |||
@@ -69,7 +69,7 @@ static void ppro_setup_ctrs(struct op_msrs const * const msrs) | |||
69 | int i; | 69 | int i; |
70 | 70 | ||
71 | if (!reset_value) { | 71 | if (!reset_value) { |
72 | reset_value = kmalloc(sizeof(unsigned) * num_counters, | 72 | reset_value = kmalloc(sizeof(reset_value[0]) * num_counters, |
73 | GFP_ATOMIC); | 73 | GFP_ATOMIC); |
74 | if (!reset_value) | 74 | if (!reset_value) |
75 | return; | 75 | return; |
diff --git a/arch/x86/pci/fixup.c b/arch/x86/pci/fixup.c index 3c27a809393b..2051dc96b8e9 100644 --- a/arch/x86/pci/fixup.c +++ b/arch/x86/pci/fixup.c | |||
@@ -496,21 +496,24 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SIEMENS, 0x0015, | |||
496 | pci_siemens_interrupt_controller); | 496 | pci_siemens_interrupt_controller); |
497 | 497 | ||
498 | /* | 498 | /* |
499 | * Regular PCI devices have 256 bytes, but AMD Family 10h Opteron ext config | 499 | * Regular PCI devices have 256 bytes, but AMD Family 10h/11h CPUs have |
500 | * have 4096 bytes. Even if the device is capable, that doesn't mean we can | 500 | * 4096 bytes configuration space for each function of their processor |
501 | * access it. Maybe we don't have a way to generate extended config space | 501 | * configuration space. |
502 | * accesses. So check it | ||
503 | */ | 502 | */ |
504 | static void fam10h_pci_cfg_space_size(struct pci_dev *dev) | 503 | static void amd_cpu_pci_cfg_space_size(struct pci_dev *dev) |
505 | { | 504 | { |
506 | dev->cfg_size = pci_cfg_space_size_ext(dev); | 505 | dev->cfg_size = pci_cfg_space_size_ext(dev); |
507 | } | 506 | } |
508 | 507 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1200, amd_cpu_pci_cfg_space_size); | |
509 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1200, fam10h_pci_cfg_space_size); | 508 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1201, amd_cpu_pci_cfg_space_size); |
510 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1201, fam10h_pci_cfg_space_size); | 509 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1202, amd_cpu_pci_cfg_space_size); |
511 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1202, fam10h_pci_cfg_space_size); | 510 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1203, amd_cpu_pci_cfg_space_size); |
512 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1203, fam10h_pci_cfg_space_size); | 511 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1204, amd_cpu_pci_cfg_space_size); |
513 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1204, fam10h_pci_cfg_space_size); | 512 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1300, amd_cpu_pci_cfg_space_size); |
513 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1301, amd_cpu_pci_cfg_space_size); | ||
514 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1302, amd_cpu_pci_cfg_space_size); | ||
515 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1303, amd_cpu_pci_cfg_space_size); | ||
516 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1304, amd_cpu_pci_cfg_space_size); | ||
514 | 517 | ||
515 | /* | 518 | /* |
516 | * SB600: Disable BAR1 on device 14.0 to avoid HPET resources from | 519 | * SB600: Disable BAR1 on device 14.0 to avoid HPET resources from |
diff --git a/arch/x86/power/hibernate_32.c b/arch/x86/power/hibernate_32.c index f2b6e3f11bfc..81197c62d5b3 100644 --- a/arch/x86/power/hibernate_32.c +++ b/arch/x86/power/hibernate_32.c | |||
@@ -12,6 +12,7 @@ | |||
12 | #include <asm/system.h> | 12 | #include <asm/system.h> |
13 | #include <asm/page.h> | 13 | #include <asm/page.h> |
14 | #include <asm/pgtable.h> | 14 | #include <asm/pgtable.h> |
15 | #include <asm/mmzone.h> | ||
15 | 16 | ||
16 | /* Defined in hibernate_asm_32.S */ | 17 | /* Defined in hibernate_asm_32.S */ |
17 | extern int restore_image(void); | 18 | extern int restore_image(void); |
@@ -127,6 +128,9 @@ static int resume_physical_mapping_init(pgd_t *pgd_base) | |||
127 | } | 128 | } |
128 | } | 129 | } |
129 | } | 130 | } |
131 | |||
132 | resume_map_numa_kva(pgd_base); | ||
133 | |||
130 | return 0; | 134 | return 0; |
131 | } | 135 | } |
132 | 136 | ||
diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c index 688936044dc9..636ef4caa52d 100644 --- a/arch/x86/xen/mmu.c +++ b/arch/x86/xen/mmu.c | |||
@@ -661,12 +661,11 @@ void xen_set_pgd(pgd_t *ptr, pgd_t val) | |||
661 | * For 64-bit, we must skip the Xen hole in the middle of the address | 661 | * For 64-bit, we must skip the Xen hole in the middle of the address |
662 | * space, just after the big x86-64 virtual hole. | 662 | * space, just after the big x86-64 virtual hole. |
663 | */ | 663 | */ |
664 | static int xen_pgd_walk(struct mm_struct *mm, | 664 | static int __xen_pgd_walk(struct mm_struct *mm, pgd_t *pgd, |
665 | int (*func)(struct mm_struct *mm, struct page *, | 665 | int (*func)(struct mm_struct *mm, struct page *, |
666 | enum pt_level), | 666 | enum pt_level), |
667 | unsigned long limit) | 667 | unsigned long limit) |
668 | { | 668 | { |
669 | pgd_t *pgd = mm->pgd; | ||
670 | int flush = 0; | 669 | int flush = 0; |
671 | unsigned hole_low, hole_high; | 670 | unsigned hole_low, hole_high; |
672 | unsigned pgdidx_limit, pudidx_limit, pmdidx_limit; | 671 | unsigned pgdidx_limit, pudidx_limit, pmdidx_limit; |
@@ -753,6 +752,14 @@ out: | |||
753 | return flush; | 752 | return flush; |
754 | } | 753 | } |
755 | 754 | ||
755 | static int xen_pgd_walk(struct mm_struct *mm, | ||
756 | int (*func)(struct mm_struct *mm, struct page *, | ||
757 | enum pt_level), | ||
758 | unsigned long limit) | ||
759 | { | ||
760 | return __xen_pgd_walk(mm, mm->pgd, func, limit); | ||
761 | } | ||
762 | |||
756 | /* If we're using split pte locks, then take the page's lock and | 763 | /* If we're using split pte locks, then take the page's lock and |
757 | return a pointer to it. Otherwise return NULL. */ | 764 | return a pointer to it. Otherwise return NULL. */ |
758 | static spinlock_t *xen_pte_lock(struct page *page, struct mm_struct *mm) | 765 | static spinlock_t *xen_pte_lock(struct page *page, struct mm_struct *mm) |
@@ -854,7 +861,7 @@ static void __xen_pgd_pin(struct mm_struct *mm, pgd_t *pgd) | |||
854 | 861 | ||
855 | xen_mc_batch(); | 862 | xen_mc_batch(); |
856 | 863 | ||
857 | if (xen_pgd_walk(mm, xen_pin_page, USER_LIMIT)) { | 864 | if (__xen_pgd_walk(mm, pgd, xen_pin_page, USER_LIMIT)) { |
858 | /* re-enable interrupts for flushing */ | 865 | /* re-enable interrupts for flushing */ |
859 | xen_mc_issue(0); | 866 | xen_mc_issue(0); |
860 | 867 | ||
@@ -998,7 +1005,7 @@ static void __xen_pgd_unpin(struct mm_struct *mm, pgd_t *pgd) | |||
998 | PT_PMD); | 1005 | PT_PMD); |
999 | #endif | 1006 | #endif |
1000 | 1007 | ||
1001 | xen_pgd_walk(mm, xen_unpin_page, USER_LIMIT); | 1008 | __xen_pgd_walk(mm, pgd, xen_unpin_page, USER_LIMIT); |
1002 | 1009 | ||
1003 | xen_mc_issue(0); | 1010 | xen_mc_issue(0); |
1004 | } | 1011 | } |
diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c index d77da613b1d2..acd9b6705e02 100644 --- a/arch/x86/xen/smp.c +++ b/arch/x86/xen/smp.c | |||
@@ -362,7 +362,7 @@ static void xen_cpu_die(unsigned int cpu) | |||
362 | alternatives_smp_switch(0); | 362 | alternatives_smp_switch(0); |
363 | } | 363 | } |
364 | 364 | ||
365 | static void xen_play_dead(void) | 365 | static void __cpuinit xen_play_dead(void) /* used only with CPU_HOTPLUG */ |
366 | { | 366 | { |
367 | play_dead_common(); | 367 | play_dead_common(); |
368 | HYPERVISOR_vcpu_op(VCPUOP_down, smp_processor_id(), NULL); | 368 | HYPERVISOR_vcpu_op(VCPUOP_down, smp_processor_id(), NULL); |
diff --git a/arch/x86/xen/xen-ops.h b/arch/x86/xen/xen-ops.h index d7422dc2a55c..9e1afae8461f 100644 --- a/arch/x86/xen/xen-ops.h +++ b/arch/x86/xen/xen-ops.h | |||
@@ -49,7 +49,7 @@ bool xen_vcpu_stolen(int vcpu); | |||
49 | 49 | ||
50 | void xen_mark_init_mm_pinned(void); | 50 | void xen_mark_init_mm_pinned(void); |
51 | 51 | ||
52 | void __init xen_setup_vcpu_info_placement(void); | 52 | void xen_setup_vcpu_info_placement(void); |
53 | 53 | ||
54 | #ifdef CONFIG_SMP | 54 | #ifdef CONFIG_SMP |
55 | void xen_smp_init(void); | 55 | void xen_smp_init(void); |
diff --git a/block/blk-map.c b/block/blk-map.c index 4849fa36161e..0f4b4b881811 100644 --- a/block/blk-map.c +++ b/block/blk-map.c | |||
@@ -217,6 +217,12 @@ int blk_rq_map_user_iov(struct request_queue *q, struct request *rq, | |||
217 | return PTR_ERR(bio); | 217 | return PTR_ERR(bio); |
218 | 218 | ||
219 | if (bio->bi_size != len) { | 219 | if (bio->bi_size != len) { |
220 | /* | ||
221 | * Grab an extra reference to this bio, as bio_unmap_user() | ||
222 | * expects to be able to drop it twice as it happens on the | ||
223 | * normal IO completion path | ||
224 | */ | ||
225 | bio_get(bio); | ||
220 | bio_endio(bio, 0); | 226 | bio_endio(bio, 0); |
221 | bio_unmap_user(bio); | 227 | bio_unmap_user(bio); |
222 | return -EINVAL; | 228 | return -EINVAL; |
diff --git a/block/genhd.c b/block/genhd.c index 4e5e7493f676..27549e470da5 100644 --- a/block/genhd.c +++ b/block/genhd.c | |||
@@ -768,6 +768,8 @@ static int __init genhd_device_init(void) | |||
768 | bdev_map = kobj_map_init(base_probe, &block_class_lock); | 768 | bdev_map = kobj_map_init(base_probe, &block_class_lock); |
769 | blk_dev_init(); | 769 | blk_dev_init(); |
770 | 770 | ||
771 | register_blkdev(BLOCK_EXT_MAJOR, "blkext"); | ||
772 | |||
771 | #ifndef CONFIG_SYSFS_DEPRECATED | 773 | #ifndef CONFIG_SYSFS_DEPRECATED |
772 | /* create top-level block dir */ | 774 | /* create top-level block dir */ |
773 | block_depr = kobject_create_and_add("block", NULL); | 775 | block_depr = kobject_create_and_add("block", NULL); |
diff --git a/block/ioctl.c b/block/ioctl.c index c832d639b6e2..d03985b04d67 100644 --- a/block/ioctl.c +++ b/block/ioctl.c | |||
@@ -18,7 +18,6 @@ static int blkpg_ioctl(struct block_device *bdev, struct blkpg_ioctl_arg __user | |||
18 | struct disk_part_iter piter; | 18 | struct disk_part_iter piter; |
19 | long long start, length; | 19 | long long start, length; |
20 | int partno; | 20 | int partno; |
21 | int err; | ||
22 | 21 | ||
23 | if (!capable(CAP_SYS_ADMIN)) | 22 | if (!capable(CAP_SYS_ADMIN)) |
24 | return -EACCES; | 23 | return -EACCES; |
@@ -61,10 +60,10 @@ static int blkpg_ioctl(struct block_device *bdev, struct blkpg_ioctl_arg __user | |||
61 | disk_part_iter_exit(&piter); | 60 | disk_part_iter_exit(&piter); |
62 | 61 | ||
63 | /* all seems OK */ | 62 | /* all seems OK */ |
64 | err = add_partition(disk, partno, start, length, | 63 | part = add_partition(disk, partno, start, length, |
65 | ADDPART_FLAG_NONE); | 64 | ADDPART_FLAG_NONE); |
66 | mutex_unlock(&bdev->bd_mutex); | 65 | mutex_unlock(&bdev->bd_mutex); |
67 | return err; | 66 | return IS_ERR(part) ? PTR_ERR(part) : 0; |
68 | case BLKPG_DEL_PARTITION: | 67 | case BLKPG_DEL_PARTITION: |
69 | part = disk_get_part(disk, partno); | 68 | part = disk_get_part(disk, partno); |
70 | if (!part) | 69 | if (!part) |
diff --git a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig index f4f632917509..b0243fd55ac0 100644 --- a/drivers/acpi/Kconfig +++ b/drivers/acpi/Kconfig | |||
@@ -312,9 +312,13 @@ config ACPI_DEBUG | |||
312 | bool "Debug Statements" | 312 | bool "Debug Statements" |
313 | default n | 313 | default n |
314 | help | 314 | help |
315 | The ACPI driver can optionally report errors with a great deal | 315 | The ACPI subsystem can produce debug output. Saying Y enables this |
316 | of verbosity. Saying Y enables these statements. This will increase | 316 | output and increases the kernel size by around 50K. |
317 | your kernel size by around 50K. | 317 | |
318 | Use the acpi.debug_layer and acpi.debug_level kernel command-line | ||
319 | parameters documented in Documentation/acpi/debug.txt and | ||
320 | Documentation/kernel-parameters.txt to control the type and | ||
321 | amount of debug output. | ||
318 | 322 | ||
319 | config ACPI_DEBUG_FUNC_TRACE | 323 | config ACPI_DEBUG_FUNC_TRACE |
320 | bool "Additionally enable ACPI function tracing" | 324 | bool "Additionally enable ACPI function tracing" |
@@ -324,14 +328,6 @@ config ACPI_DEBUG_FUNC_TRACE | |||
324 | ACPI Debug Statements slow down ACPI processing. Function trace | 328 | ACPI Debug Statements slow down ACPI processing. Function trace |
325 | is about half of the penalty and is rarely useful. | 329 | is about half of the penalty and is rarely useful. |
326 | 330 | ||
327 | config ACPI_EC | ||
328 | bool | ||
329 | default y | ||
330 | help | ||
331 | This driver is required on some systems for the proper operation of | ||
332 | the battery and thermal drivers. If you are compiling for a | ||
333 | mobile system, say Y. | ||
334 | |||
335 | config ACPI_PCI_SLOT | 331 | config ACPI_PCI_SLOT |
336 | tristate "PCI slot detection driver" | 332 | tristate "PCI slot detection driver" |
337 | default n | 333 | default n |
@@ -341,10 +337,6 @@ config ACPI_PCI_SLOT | |||
341 | help you correlate PCI bus addresses with the physical geography | 337 | help you correlate PCI bus addresses with the physical geography |
342 | of your slots. If you are unsure, say N. | 338 | of your slots. If you are unsure, say N. |
343 | 339 | ||
344 | config ACPI_POWER | ||
345 | bool | ||
346 | default y | ||
347 | |||
348 | config ACPI_SYSTEM | 340 | config ACPI_SYSTEM |
349 | bool | 341 | bool |
350 | default y | 342 | default y |
diff --git a/drivers/acpi/Makefile b/drivers/acpi/Makefile index d91c027ece8f..3c0c93300f12 100644 --- a/drivers/acpi/Makefile +++ b/drivers/acpi/Makefile | |||
@@ -39,19 +39,23 @@ obj-y += sleep/ | |||
39 | obj-y += bus.o glue.o | 39 | obj-y += bus.o glue.o |
40 | obj-y += scan.o | 40 | obj-y += scan.o |
41 | # Keep EC driver first. Initialization of others depend on it. | 41 | # Keep EC driver first. Initialization of others depend on it. |
42 | obj-$(CONFIG_ACPI_EC) += ec.o | 42 | obj-y += ec.o |
43 | obj-$(CONFIG_ACPI_AC) += ac.o | 43 | obj-$(CONFIG_ACPI_AC) += ac.o |
44 | obj-$(CONFIG_ACPI_BATTERY) += battery.o | 44 | obj-$(CONFIG_ACPI_BATTERY) += battery.o |
45 | obj-$(CONFIG_ACPI_BUTTON) += button.o | 45 | obj-$(CONFIG_ACPI_BUTTON) += button.o |
46 | obj-$(CONFIG_ACPI_FAN) += fan.o | 46 | obj-$(CONFIG_ACPI_FAN) += fan.o |
47 | obj-$(CONFIG_ACPI_DOCK) += dock.o | 47 | obj-$(CONFIG_ACPI_DOCK) += dock.o |
48 | obj-$(CONFIG_ACPI_VIDEO) += video.o | 48 | obj-$(CONFIG_ACPI_VIDEO) += video.o |
49 | ifdef CONFIG_ACPI_VIDEO | ||
50 | obj-y += video_detect.o | ||
51 | endif | ||
52 | |||
49 | obj-y += pci_root.o pci_link.o pci_irq.o pci_bind.o | 53 | obj-y += pci_root.o pci_link.o pci_irq.o pci_bind.o |
50 | obj-$(CONFIG_ACPI_PCI_SLOT) += pci_slot.o | 54 | obj-$(CONFIG_ACPI_PCI_SLOT) += pci_slot.o |
51 | obj-$(CONFIG_ACPI_PROCESSOR) += processor.o | 55 | obj-$(CONFIG_ACPI_PROCESSOR) += processor.o |
52 | obj-$(CONFIG_ACPI_CONTAINER) += container.o | 56 | obj-$(CONFIG_ACPI_CONTAINER) += container.o |
53 | obj-$(CONFIG_ACPI_THERMAL) += thermal.o | 57 | obj-$(CONFIG_ACPI_THERMAL) += thermal.o |
54 | obj-$(CONFIG_ACPI_POWER) += power.o | 58 | obj-y += power.o |
55 | obj-$(CONFIG_ACPI_SYSTEM) += system.o event.o | 59 | obj-$(CONFIG_ACPI_SYSTEM) += system.o event.o |
56 | obj-$(CONFIG_ACPI_DEBUG) += debug.o | 60 | obj-$(CONFIG_ACPI_DEBUG) += debug.o |
57 | obj-$(CONFIG_ACPI_NUMA) += numa.o | 61 | obj-$(CONFIG_ACPI_NUMA) += numa.o |
diff --git a/drivers/acpi/ac.c b/drivers/acpi/ac.c index d72a1b6c8a94..9b917dac7732 100644 --- a/drivers/acpi/ac.c +++ b/drivers/acpi/ac.c | |||
@@ -37,7 +37,6 @@ | |||
37 | #include <acpi/acpi_bus.h> | 37 | #include <acpi/acpi_bus.h> |
38 | #include <acpi/acpi_drivers.h> | 38 | #include <acpi/acpi_drivers.h> |
39 | 39 | ||
40 | #define ACPI_AC_COMPONENT 0x00020000 | ||
41 | #define ACPI_AC_CLASS "ac_adapter" | 40 | #define ACPI_AC_CLASS "ac_adapter" |
42 | #define ACPI_AC_DEVICE_NAME "AC Adapter" | 41 | #define ACPI_AC_DEVICE_NAME "AC Adapter" |
43 | #define ACPI_AC_FILE_STATE "state" | 42 | #define ACPI_AC_FILE_STATE "state" |
@@ -242,7 +241,7 @@ static void acpi_ac_notify(acpi_handle handle, u32 event, void *data) | |||
242 | acpi_ac_get_state(ac); | 241 | acpi_ac_get_state(ac); |
243 | acpi_bus_generate_proc_event(device, event, (u32) ac->state); | 242 | acpi_bus_generate_proc_event(device, event, (u32) ac->state); |
244 | acpi_bus_generate_netlink_event(device->pnp.device_class, | 243 | acpi_bus_generate_netlink_event(device->pnp.device_class, |
245 | device->dev.bus_id, event, | 244 | dev_name(&device->dev), event, |
246 | (u32) ac->state); | 245 | (u32) ac->state); |
247 | #ifdef CONFIG_ACPI_SYSFS_POWER | 246 | #ifdef CONFIG_ACPI_SYSFS_POWER |
248 | kobject_uevent(&ac->charger.dev->kobj, KOBJ_CHANGE); | 247 | kobject_uevent(&ac->charger.dev->kobj, KOBJ_CHANGE); |
diff --git a/drivers/acpi/acpi_memhotplug.c b/drivers/acpi/acpi_memhotplug.c index 71d21c51c45f..63a17b55b39b 100644 --- a/drivers/acpi/acpi_memhotplug.c +++ b/drivers/acpi/acpi_memhotplug.c | |||
@@ -32,7 +32,6 @@ | |||
32 | #include <linux/memory_hotplug.h> | 32 | #include <linux/memory_hotplug.h> |
33 | #include <acpi/acpi_drivers.h> | 33 | #include <acpi/acpi_drivers.h> |
34 | 34 | ||
35 | #define ACPI_MEMORY_DEVICE_COMPONENT 0x08000000UL | ||
36 | #define ACPI_MEMORY_DEVICE_CLASS "memory" | 35 | #define ACPI_MEMORY_DEVICE_CLASS "memory" |
37 | #define ACPI_MEMORY_DEVICE_HID "PNP0C80" | 36 | #define ACPI_MEMORY_DEVICE_HID "PNP0C80" |
38 | #define ACPI_MEMORY_DEVICE_NAME "Hotplug Mem Device" | 37 | #define ACPI_MEMORY_DEVICE_NAME "Hotplug Mem Device" |
diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c index b2133e89ad9a..a0a178dd189c 100644 --- a/drivers/acpi/battery.c +++ b/drivers/acpi/battery.c | |||
@@ -46,7 +46,6 @@ | |||
46 | 46 | ||
47 | #define ACPI_BATTERY_VALUE_UNKNOWN 0xFFFFFFFF | 47 | #define ACPI_BATTERY_VALUE_UNKNOWN 0xFFFFFFFF |
48 | 48 | ||
49 | #define ACPI_BATTERY_COMPONENT 0x00040000 | ||
50 | #define ACPI_BATTERY_CLASS "battery" | 49 | #define ACPI_BATTERY_CLASS "battery" |
51 | #define ACPI_BATTERY_DEVICE_NAME "Battery" | 50 | #define ACPI_BATTERY_DEVICE_NAME "Battery" |
52 | #define ACPI_BATTERY_NOTIFY_STATUS 0x80 | 51 | #define ACPI_BATTERY_NOTIFY_STATUS 0x80 |
@@ -175,6 +174,15 @@ static int acpi_battery_get_property(struct power_supply *psy, | |||
175 | break; | 174 | break; |
176 | case POWER_SUPPLY_PROP_CURRENT_NOW: | 175 | case POWER_SUPPLY_PROP_CURRENT_NOW: |
177 | val->intval = battery->current_now * 1000; | 176 | val->intval = battery->current_now * 1000; |
177 | /* if power units are mW, convert to mA by | ||
178 | dividing by current voltage (mV/1000) */ | ||
179 | if (!battery->power_unit) { | ||
180 | if (battery->voltage_now) { | ||
181 | val->intval /= battery->voltage_now; | ||
182 | val->intval *= 1000; | ||
183 | } else | ||
184 | val->intval = -1; | ||
185 | } | ||
178 | break; | 186 | break; |
179 | case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN: | 187 | case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN: |
180 | case POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN: | 188 | case POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN: |
@@ -782,7 +790,7 @@ static void acpi_battery_notify(acpi_handle handle, u32 event, void *data) | |||
782 | acpi_bus_generate_proc_event(device, event, | 790 | acpi_bus_generate_proc_event(device, event, |
783 | acpi_battery_present(battery)); | 791 | acpi_battery_present(battery)); |
784 | acpi_bus_generate_netlink_event(device->pnp.device_class, | 792 | acpi_bus_generate_netlink_event(device->pnp.device_class, |
785 | device->dev.bus_id, event, | 793 | dev_name(&device->dev), event, |
786 | acpi_battery_present(battery)); | 794 | acpi_battery_present(battery)); |
787 | #ifdef CONFIG_ACPI_SYSFS_POWER | 795 | #ifdef CONFIG_ACPI_SYSFS_POWER |
788 | /* acpi_batter_update could remove power_supply object */ | 796 | /* acpi_batter_update could remove power_supply object */ |
diff --git a/drivers/acpi/blacklist.c b/drivers/acpi/blacklist.c index ea92bac42c53..09c69806c1fc 100644 --- a/drivers/acpi/blacklist.c +++ b/drivers/acpi/blacklist.c | |||
@@ -176,16 +176,6 @@ static int __init dmi_enable_osi_linux(const struct dmi_system_id *d) | |||
176 | acpi_dmi_osi_linux(1, d); /* enable */ | 176 | acpi_dmi_osi_linux(1, d); /* enable */ |
177 | return 0; | 177 | return 0; |
178 | } | 178 | } |
179 | static int __init dmi_disable_osi_linux(const struct dmi_system_id *d) | ||
180 | { | ||
181 | acpi_dmi_osi_linux(0, d); /* disable */ | ||
182 | return 0; | ||
183 | } | ||
184 | static int __init dmi_unknown_osi_linux(const struct dmi_system_id *d) | ||
185 | { | ||
186 | acpi_dmi_osi_linux(-1, d); /* unknown */ | ||
187 | return 0; | ||
188 | } | ||
189 | static int __init dmi_disable_osi_vista(const struct dmi_system_id *d) | 179 | static int __init dmi_disable_osi_vista(const struct dmi_system_id *d) |
190 | { | 180 | { |
191 | printk(KERN_NOTICE PREFIX "DMI detected: %s\n", d->ident); | 181 | printk(KERN_NOTICE PREFIX "DMI detected: %s\n", d->ident); |
@@ -193,295 +183,21 @@ static int __init dmi_disable_osi_vista(const struct dmi_system_id *d) | |||
193 | return 0; | 183 | return 0; |
194 | } | 184 | } |
195 | 185 | ||
196 | /* | ||
197 | * Most BIOS that invoke OSI(Linux) do nothing with it. | ||
198 | * But some cause Linux to break. | ||
199 | * Only a couple use it to make Linux run better. | ||
200 | * | ||
201 | * Thus, Linux should continue to disable OSI(Linux) by default, | ||
202 | * should continue to discourage BIOS writers from using it, and | ||
203 | * should whitelist the few existing systems that require it. | ||
204 | * | ||
205 | * If it appears clear a vendor isn't using OSI(Linux) | ||
206 | * for anything constructive, blacklist them by name to disable | ||
207 | * unnecessary dmesg warnings on all of their products. | ||
208 | */ | ||
209 | |||
210 | static struct dmi_system_id acpi_osi_dmi_table[] __initdata = { | 186 | static struct dmi_system_id acpi_osi_dmi_table[] __initdata = { |
211 | /* | ||
212 | * Disable OSI(Linux) warnings on all "Acer, inc." | ||
213 | * | ||
214 | * _OSI(Linux) disables the latest Windows BIOS code: | ||
215 | * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 3100"), | ||
216 | * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5050"), | ||
217 | * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5100"), | ||
218 | * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5580"), | ||
219 | * DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 3010"), | ||
220 | * _OSI(Linux) effect unknown: | ||
221 | * DMI_MATCH(DMI_PRODUCT_NAME, "Ferrari 5000"), | ||
222 | */ | ||
223 | /* | ||
224 | * note that dmi_check_system() uses strstr() | ||
225 | * to match sub-strings rather than !strcmp(), | ||
226 | * so "Acer" below matches "Acer, inc." above. | ||
227 | */ | ||
228 | /* | ||
229 | * Disable OSI(Linux) warnings on all "Acer" | ||
230 | * | ||
231 | * _OSI(Linux) effect unknown: | ||
232 | * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5610"), | ||
233 | * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 7720Z"), | ||
234 | * DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 5520"), | ||
235 | * DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 6460"), | ||
236 | * DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 7510"), | ||
237 | * | ||
238 | * _OSI(Linux) is a NOP: | ||
239 | * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5315"), | ||
240 | * DMI_MATCH(DMI_PRODUCT_NAME, "Extensa 5220"), | ||
241 | */ | ||
242 | { | ||
243 | .callback = dmi_disable_osi_linux, | ||
244 | .ident = "Acer", | ||
245 | .matches = { | ||
246 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
247 | }, | ||
248 | }, | ||
249 | /* | ||
250 | * Disable OSI(Linux) warnings on all "Apple Computer, Inc." | ||
251 | * Disable OSI(Linux) warnings on all "Apple Inc." | ||
252 | * | ||
253 | * _OSI(Linux) confirmed to be a NOP: | ||
254 | * DMI_MATCH(DMI_PRODUCT_NAME, "MacBook1,1"), | ||
255 | * DMI_MATCH(DMI_PRODUCT_NAME, "MacBook2,1"), | ||
256 | * DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro2,2"), | ||
257 | * DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro3,1"), | ||
258 | * _OSI(Linux) effect unknown: | ||
259 | * DMI_MATCH(DMI_PRODUCT_NAME, "MacPro2,1"), | ||
260 | * DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro1,1"), | ||
261 | */ | ||
262 | { | ||
263 | .callback = dmi_disable_osi_linux, | ||
264 | .ident = "Apple", | ||
265 | .matches = { | ||
266 | DMI_MATCH(DMI_SYS_VENDOR, "Apple"), | ||
267 | }, | ||
268 | }, | ||
269 | /* | ||
270 | * Disable OSI(Linux) warnings on all "BenQ" | ||
271 | * | ||
272 | * _OSI(Linux) confirmed to be a NOP: | ||
273 | * DMI_MATCH(DMI_PRODUCT_NAME, "Joybook S31"), | ||
274 | */ | ||
275 | { | ||
276 | .callback = dmi_disable_osi_linux, | ||
277 | .ident = "BenQ", | ||
278 | .matches = { | ||
279 | DMI_MATCH(DMI_SYS_VENDOR, "BenQ"), | ||
280 | }, | ||
281 | }, | ||
282 | /* | ||
283 | * Disable OSI(Linux) warnings on all "Clevo Co." | ||
284 | * | ||
285 | * _OSI(Linux) confirmed to be a NOP: | ||
286 | * DMI_MATCH(DMI_PRODUCT_NAME, "M570RU"), | ||
287 | */ | ||
288 | { | ||
289 | .callback = dmi_disable_osi_linux, | ||
290 | .ident = "Clevo", | ||
291 | .matches = { | ||
292 | DMI_MATCH(DMI_SYS_VENDOR, "Clevo Co."), | ||
293 | }, | ||
294 | }, | ||
295 | /* | ||
296 | * Disable OSI(Linux) warnings on all "COMPAL" | ||
297 | * | ||
298 | * _OSI(Linux) confirmed to be a NOP: | ||
299 | * DMI_MATCH(DMI_BOARD_NAME, "HEL8X"), | ||
300 | * _OSI(Linux) unknown effect: | ||
301 | * DMI_MATCH(DMI_BOARD_NAME, "IFL91"), | ||
302 | */ | ||
303 | { | ||
304 | .callback = dmi_disable_osi_linux, | ||
305 | .ident = "Compal", | ||
306 | .matches = { | ||
307 | DMI_MATCH(DMI_BIOS_VENDOR, "COMPAL"), | ||
308 | }, | ||
309 | }, | ||
310 | { /* OSI(Linux) touches USB, unknown side-effect */ | ||
311 | .callback = dmi_disable_osi_linux, | ||
312 | .ident = "Dell Dimension 5150", | ||
313 | .matches = { | ||
314 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
315 | DMI_MATCH(DMI_PRODUCT_NAME, "Dell DM051"), | ||
316 | }, | ||
317 | }, | ||
318 | { /* OSI(Linux) is a NOP */ | ||
319 | .callback = dmi_disable_osi_linux, | ||
320 | .ident = "Dell i1501", | ||
321 | .matches = { | ||
322 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
323 | DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 1501"), | ||
324 | }, | ||
325 | }, | ||
326 | { /* OSI(Linux) effect unknown */ | ||
327 | .callback = dmi_unknown_osi_linux, | ||
328 | .ident = "Dell Latitude D830", | ||
329 | .matches = { | ||
330 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
331 | DMI_MATCH(DMI_PRODUCT_NAME, "Latitude D830"), | ||
332 | }, | ||
333 | }, | ||
334 | { /* OSI(Linux) effect unknown */ | ||
335 | .callback = dmi_unknown_osi_linux, | ||
336 | .ident = "Dell OptiPlex GX620", | ||
337 | .matches = { | ||
338 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
339 | DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex GX620"), | ||
340 | }, | ||
341 | }, | ||
342 | { /* OSI(Linux) causes some USB initialization to not run */ | ||
343 | .callback = dmi_unknown_osi_linux, | ||
344 | .ident = "Dell OptiPlex 755", | ||
345 | .matches = { | ||
346 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
347 | DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 755"), | ||
348 | }, | ||
349 | }, | ||
350 | { /* OSI(Linux) effect unknown */ | ||
351 | .callback = dmi_unknown_osi_linux, | ||
352 | .ident = "Dell PE 1900", | ||
353 | .matches = { | ||
354 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
355 | DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge 1900"), | ||
356 | }, | ||
357 | }, | ||
358 | { /* OSI(Linux) is a NOP */ | ||
359 | .callback = dmi_unknown_osi_linux, | ||
360 | .ident = "Dell PE 1950", | ||
361 | .matches = { | ||
362 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
363 | DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge 1950"), | ||
364 | }, | ||
365 | }, | ||
366 | { /* OSI(Linux) is a NOP */ | ||
367 | .callback = dmi_disable_osi_linux, | ||
368 | .ident = "Dell PE R200", | ||
369 | .matches = { | ||
370 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
371 | DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge R200"), | ||
372 | }, | ||
373 | }, | ||
374 | { /* OSI(Linux) touches USB */ | ||
375 | .callback = dmi_disable_osi_linux, | ||
376 | .ident = "Dell PR 390", | ||
377 | .matches = { | ||
378 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
379 | DMI_MATCH(DMI_PRODUCT_NAME, "Precision WorkStation 390"), | ||
380 | }, | ||
381 | }, | ||
382 | { /* OSI(Linux) touches USB */ | ||
383 | .callback = dmi_unknown_osi_linux, | ||
384 | .ident = "Dell PR 390", | ||
385 | .matches = { | ||
386 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
387 | DMI_MATCH(DMI_PRODUCT_NAME, "Precision WorkStation 690"), | ||
388 | }, | ||
389 | }, | ||
390 | { /* OSI(Linux) unknown - ASL looks benign, but may effect dock/SMM */ | ||
391 | .callback = dmi_unknown_osi_linux, | ||
392 | .ident = "Dell PR M4300", | ||
393 | .matches = { | ||
394 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
395 | DMI_MATCH(DMI_PRODUCT_NAME, "Precision M4300"), | ||
396 | }, | ||
397 | }, | ||
398 | { /* OSI(Linux) is a NOP */ | ||
399 | .callback = dmi_disable_osi_linux, | ||
400 | .ident = "Dell Vostro 1000", | ||
401 | .matches = { | ||
402 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
403 | DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1000"), | ||
404 | }, | ||
405 | }, | ||
406 | { /* OSI(Linux) effect unknown */ | ||
407 | .callback = dmi_unknown_osi_linux, | ||
408 | .ident = "Dell PE SC440", | ||
409 | .matches = { | ||
410 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
411 | DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge SC440"), | ||
412 | }, | ||
413 | }, | ||
414 | { /* OSI(Linux) effect unknown */ | ||
415 | .callback = dmi_unknown_osi_linux, | ||
416 | .ident = "Dialogue Flybook V5", | ||
417 | .matches = { | ||
418 | DMI_MATCH(DMI_SYS_VENDOR, "Dialogue Technology Corporation"), | ||
419 | DMI_MATCH(DMI_PRODUCT_NAME, "Flybook V5"), | ||
420 | }, | ||
421 | }, | ||
422 | /* | ||
423 | * Disable OSI(Linux) warnings on all "FUJITSU SIEMENS" | ||
424 | * | ||
425 | * _OSI(Linux) disables latest Windows BIOS code: | ||
426 | * DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pa 2510"), | ||
427 | * _OSI(Linux) confirmed to be a NOP: | ||
428 | * DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pi 1536"), | ||
429 | * DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pi 1556"), | ||
430 | * DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Xi 1546"), | ||
431 | * DMI_MATCH(DMI_PRODUCT_NAME, "ESPRIMO Mobile V5505"), | ||
432 | * _OSI(Linux) unknown effect: | ||
433 | * DMI_MATCH(DMI_PRODUCT_NAME, "Amilo M1425"), | ||
434 | * DMI_MATCH(DMI_PRODUCT_NAME, "Amilo Si 1520"), | ||
435 | */ | ||
436 | { | ||
437 | .callback = dmi_disable_osi_linux, | ||
438 | .ident = "Fujitsu Siemens", | ||
439 | .matches = { | ||
440 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), | ||
441 | }, | ||
442 | }, | ||
443 | { | 187 | { |
444 | .callback = dmi_disable_osi_vista, | 188 | .callback = dmi_disable_osi_vista, |
445 | .ident = "Fujitsu Siemens", | 189 | .ident = "Fujitsu Siemens", |
446 | .matches = { | 190 | .matches = { |
447 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), | 191 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), |
448 | DMI_MATCH(DMI_PRODUCT_NAME, "ESPRIMO Mobile V5505"), | 192 | DMI_MATCH(DMI_PRODUCT_NAME, "ESPRIMO Mobile V5505"), |
449 | }, | 193 | }, |
450 | }, | 194 | }, |
195 | |||
451 | /* | 196 | /* |
452 | * Disable OSI(Linux) warnings on all "Hewlett-Packard" | 197 | * BIOS invocation of _OSI(Linux) is almost always a BIOS bug. |
453 | * | 198 | * Linux ignores it, except for the machines enumerated below. |
454 | * _OSI(Linux) confirmed to be a NOP: | ||
455 | * .ident = "HP Pavilion tx 1000" | ||
456 | * DMI_MATCH(DMI_BOARD_NAME, "30BF"), | ||
457 | * .ident = "HP Pavilion dv2000" | ||
458 | * DMI_MATCH(DMI_BOARD_NAME, "30B5"), | ||
459 | * .ident = "HP Pavilion dv5000", | ||
460 | * DMI_MATCH(DMI_BOARD_NAME, "30A7"), | ||
461 | * .ident = "HP Pavilion dv6300 30BC", | ||
462 | * DMI_MATCH(DMI_BOARD_NAME, "30BC"), | ||
463 | * .ident = "HP Pavilion dv6000", | ||
464 | * DMI_MATCH(DMI_BOARD_NAME, "30B7"), | ||
465 | * DMI_MATCH(DMI_BOARD_NAME, "30B8"), | ||
466 | * .ident = "HP Pavilion dv9000", | ||
467 | * DMI_MATCH(DMI_BOARD_NAME, "30B9"), | ||
468 | * .ident = "HP Pavilion dv9500", | ||
469 | * DMI_MATCH(DMI_BOARD_NAME, "30CB"), | ||
470 | * .ident = "HP/Compaq Presario C500", | ||
471 | * DMI_MATCH(DMI_BOARD_NAME, "30C6"), | ||
472 | * .ident = "HP/Compaq Presario F500", | ||
473 | * DMI_MATCH(DMI_BOARD_NAME, "30D3"), | ||
474 | * _OSI(Linux) unknown effect: | ||
475 | * .ident = "HP Pavilion dv6500", | ||
476 | * DMI_MATCH(DMI_BOARD_NAME, "30D0"), | ||
477 | */ | 199 | */ |
478 | { | 200 | |
479 | .callback = dmi_disable_osi_linux, | ||
480 | .ident = "Hewlett-Packard", | ||
481 | .matches = { | ||
482 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
483 | }, | ||
484 | }, | ||
485 | /* | 201 | /* |
486 | * Lenovo has a mix of systems OSI(Linux) situations | 202 | * Lenovo has a mix of systems OSI(Linux) situations |
487 | * and thus we can not wildcard the vendor. | 203 | * and thus we can not wildcard the vendor. |
@@ -519,113 +235,6 @@ static struct dmi_system_id acpi_osi_dmi_table[] __initdata = { | |||
519 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X61"), | 235 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X61"), |
520 | }, | 236 | }, |
521 | }, | 237 | }, |
522 | { | ||
523 | .callback = dmi_disable_osi_linux, | ||
524 | .ident = "Lenovo 3000 V100", | ||
525 | .matches = { | ||
526 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
527 | DMI_MATCH(DMI_PRODUCT_VERSION, "LENOVO3000 V100"), | ||
528 | }, | ||
529 | }, | ||
530 | { | ||
531 | .callback = dmi_disable_osi_linux, | ||
532 | .ident = "Lenovo 3000 N100", | ||
533 | .matches = { | ||
534 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
535 | DMI_MATCH(DMI_PRODUCT_VERSION, "3000 N100"), | ||
536 | }, | ||
537 | }, | ||
538 | /* | ||
539 | * Disable OSI(Linux) warnings on all "LG Electronics" | ||
540 | * | ||
541 | * _OSI(Linux) confirmed to be a NOP: | ||
542 | * DMI_MATCH(DMI_PRODUCT_NAME, "P1-J150B"), | ||
543 | * with DMI_MATCH(DMI_BOARD_NAME, "ROCKY"), | ||
544 | * | ||
545 | * unknown: | ||
546 | * DMI_MATCH(DMI_PRODUCT_NAME, "S1-MDGDG"), | ||
547 | * with DMI_MATCH(DMI_BOARD_NAME, "ROCKY"), | ||
548 | */ | ||
549 | { | ||
550 | .callback = dmi_disable_osi_linux, | ||
551 | .ident = "LG", | ||
552 | .matches = { | ||
553 | DMI_MATCH(DMI_SYS_VENDOR, "LG Electronics"), | ||
554 | }, | ||
555 | }, | ||
556 | /* NEC - OSI(Linux) effect unknown */ | ||
557 | { | ||
558 | .callback = dmi_unknown_osi_linux, | ||
559 | .ident = "NEC VERSA M360", | ||
560 | .matches = { | ||
561 | DMI_MATCH(DMI_SYS_VENDOR, "NEC Computers SAS"), | ||
562 | DMI_MATCH(DMI_PRODUCT_NAME, "NEC VERSA M360"), | ||
563 | }, | ||
564 | }, | ||
565 | /* Panasonic */ | ||
566 | { | ||
567 | .callback = dmi_unknown_osi_linux, | ||
568 | .ident = "Panasonic", | ||
569 | .matches = { | ||
570 | DMI_MATCH(DMI_SYS_VENDOR, "Matsushita"), | ||
571 | /* Toughbook CF-52 */ | ||
572 | DMI_MATCH(DMI_PRODUCT_NAME, "CF-52CCABVBG"), | ||
573 | }, | ||
574 | }, | ||
575 | /* | ||
576 | * Disable OSI(Linux) warnings on all "Samsung Electronics" | ||
577 | * | ||
578 | * OSI(Linux) disables PNP0C32 and other BIOS code for Windows: | ||
579 | * DMI_MATCH(DMI_PRODUCT_NAME, "R40P/R41P"), | ||
580 | * DMI_MATCH(DMI_PRODUCT_NAME, "R59P/R60P/R61P"), | ||
581 | */ | ||
582 | { | ||
583 | .callback = dmi_disable_osi_linux, | ||
584 | .ident = "Samsung", | ||
585 | .matches = { | ||
586 | DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."), | ||
587 | }, | ||
588 | }, | ||
589 | /* | ||
590 | * Disable OSI(Linux) warnings on all "Sony Corporation" | ||
591 | * | ||
592 | * _OSI(Linux) is a NOP: | ||
593 | * DMI_MATCH(DMI_PRODUCT_NAME, "VGN-NR11S_S"), | ||
594 | * DMI_MATCH(DMI_PRODUCT_NAME, "VGN-SZ38GP_C"), | ||
595 | * DMI_MATCH(DMI_PRODUCT_NAME, "VGN-SZ650N"), | ||
596 | * DMI_MATCH(DMI_PRODUCT_NAME, "VGN-TZ21MN_N"), | ||
597 | * _OSI(Linux) unknown effect: | ||
598 | * DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FZ11M"), | ||
599 | */ | ||
600 | { | ||
601 | .callback = dmi_disable_osi_linux, | ||
602 | .ident = "Sony", | ||
603 | .matches = { | ||
604 | DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), | ||
605 | }, | ||
606 | }, | ||
607 | /* | ||
608 | * Disable OSI(Linux) warnings on all "TOSHIBA" | ||
609 | * | ||
610 | * _OSI(Linux) breaks sound (bugzilla 7787): | ||
611 | * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P100"), | ||
612 | * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P105"), | ||
613 | * _OSI(Linux) is a NOP: | ||
614 | * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite A100"), | ||
615 | * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite A210"), | ||
616 | * _OSI(Linux) unknown effect: | ||
617 | * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite A135"), | ||
618 | * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite A200"), | ||
619 | * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P205"), | ||
620 | * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite U305"), | ||
621 | */ | ||
622 | { | ||
623 | .callback = dmi_disable_osi_linux, | ||
624 | .ident = "Toshiba", | ||
625 | .matches = { | ||
626 | DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), | ||
627 | }, | ||
628 | }, | ||
629 | {} | 238 | {} |
630 | }; | 239 | }; |
631 | 240 | ||
diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c index c797c6473f31..7edf6d913c13 100644 --- a/drivers/acpi/bus.c +++ b/drivers/acpi/bus.c | |||
@@ -688,6 +688,14 @@ void __init acpi_early_init(void) | |||
688 | if (acpi_disabled) | 688 | if (acpi_disabled) |
689 | return; | 689 | return; |
690 | 690 | ||
691 | /* | ||
692 | * ACPI CA initializes acpi_dbg_level to non-zero, which means | ||
693 | * we get debug output merely by turning on CONFIG_ACPI_DEBUG. | ||
694 | * Turn it off so we don't get output unless the user specifies | ||
695 | * acpi.debug_level. | ||
696 | */ | ||
697 | acpi_dbg_level = 0; | ||
698 | |||
691 | printk(KERN_INFO PREFIX "Core revision %08x\n", ACPI_CA_VERSION); | 699 | printk(KERN_INFO PREFIX "Core revision %08x\n", ACPI_CA_VERSION); |
692 | 700 | ||
693 | /* enable workarounds, unless strict ACPI spec. compliance */ | 701 | /* enable workarounds, unless strict ACPI spec. compliance */ |
@@ -774,7 +782,7 @@ static int __init acpi_bus_init(void) | |||
774 | "Unable to initialize ACPI OS objects\n"); | 782 | "Unable to initialize ACPI OS objects\n"); |
775 | goto error1; | 783 | goto error1; |
776 | } | 784 | } |
777 | #ifdef CONFIG_ACPI_EC | 785 | |
778 | /* | 786 | /* |
779 | * ACPI 2.0 requires the EC driver to be loaded and work before | 787 | * ACPI 2.0 requires the EC driver to be loaded and work before |
780 | * the EC device is found in the namespace (i.e. before acpi_initialize_objects() | 788 | * the EC device is found in the namespace (i.e. before acpi_initialize_objects() |
@@ -785,7 +793,6 @@ static int __init acpi_bus_init(void) | |||
785 | */ | 793 | */ |
786 | status = acpi_ec_ecdt_probe(); | 794 | status = acpi_ec_ecdt_probe(); |
787 | /* Ignore result. Not having an ECDT is not fatal. */ | 795 | /* Ignore result. Not having an ECDT is not fatal. */ |
788 | #endif | ||
789 | 796 | ||
790 | status = acpi_initialize_objects(ACPI_FULL_INITIALIZATION); | 797 | status = acpi_initialize_objects(ACPI_FULL_INITIALIZATION); |
791 | if (ACPI_FAILURE(status)) { | 798 | if (ACPI_FAILURE(status)) { |
diff --git a/drivers/acpi/button.c b/drivers/acpi/button.c index cb046c3fc3f2..171fd914f435 100644 --- a/drivers/acpi/button.c +++ b/drivers/acpi/button.c | |||
@@ -33,7 +33,6 @@ | |||
33 | #include <acpi/acpi_bus.h> | 33 | #include <acpi/acpi_bus.h> |
34 | #include <acpi/acpi_drivers.h> | 34 | #include <acpi/acpi_drivers.h> |
35 | 35 | ||
36 | #define ACPI_BUTTON_COMPONENT 0x00080000 | ||
37 | #define ACPI_BUTTON_CLASS "button" | 36 | #define ACPI_BUTTON_CLASS "button" |
38 | #define ACPI_BUTTON_FILE_INFO "info" | 37 | #define ACPI_BUTTON_FILE_INFO "info" |
39 | #define ACPI_BUTTON_FILE_STATE "state" | 38 | #define ACPI_BUTTON_FILE_STATE "state" |
@@ -479,7 +478,7 @@ static int acpi_button_add(struct acpi_device *device) | |||
479 | device->wakeup.gpe_number, | 478 | device->wakeup.gpe_number, |
480 | ACPI_GPE_TYPE_WAKE_RUN); | 479 | ACPI_GPE_TYPE_WAKE_RUN); |
481 | acpi_enable_gpe(device->wakeup.gpe_device, | 480 | acpi_enable_gpe(device->wakeup.gpe_device, |
482 | device->wakeup.gpe_number, ACPI_NOT_ISR); | 481 | device->wakeup.gpe_number); |
483 | device->wakeup.state.enabled = 1; | 482 | device->wakeup.state.enabled = 1; |
484 | } | 483 | } |
485 | 484 | ||
diff --git a/drivers/acpi/cm_sbs.c b/drivers/acpi/cm_sbs.c index 4441e84b28a9..307963bd1043 100644 --- a/drivers/acpi/cm_sbs.c +++ b/drivers/acpi/cm_sbs.c | |||
@@ -34,7 +34,6 @@ | |||
34 | ACPI_MODULE_NAME("cm_sbs"); | 34 | ACPI_MODULE_NAME("cm_sbs"); |
35 | #define ACPI_AC_CLASS "ac_adapter" | 35 | #define ACPI_AC_CLASS "ac_adapter" |
36 | #define ACPI_BATTERY_CLASS "battery" | 36 | #define ACPI_BATTERY_CLASS "battery" |
37 | #define ACPI_SBS_COMPONENT 0x00080000 | ||
38 | #define _COMPONENT ACPI_SBS_COMPONENT | 37 | #define _COMPONENT ACPI_SBS_COMPONENT |
39 | static struct proc_dir_entry *acpi_ac_dir; | 38 | static struct proc_dir_entry *acpi_ac_dir; |
40 | static struct proc_dir_entry *acpi_battery_dir; | 39 | static struct proc_dir_entry *acpi_battery_dir; |
@@ -105,9 +104,3 @@ void acpi_unlock_battery_dir(struct proc_dir_entry *acpi_battery_dir_param) | |||
105 | return; | 104 | return; |
106 | } | 105 | } |
107 | EXPORT_SYMBOL(acpi_unlock_battery_dir); | 106 | EXPORT_SYMBOL(acpi_unlock_battery_dir); |
108 | |||
109 | static int __init acpi_cm_sbs_init(void) | ||
110 | { | ||
111 | return 0; | ||
112 | } | ||
113 | subsys_initcall(acpi_cm_sbs_init); | ||
diff --git a/drivers/acpi/container.c b/drivers/acpi/container.c index 134818b265a9..17020c12623c 100644 --- a/drivers/acpi/container.c +++ b/drivers/acpi/container.c | |||
@@ -41,7 +41,6 @@ | |||
41 | #define INSTALL_NOTIFY_HANDLER 1 | 41 | #define INSTALL_NOTIFY_HANDLER 1 |
42 | #define UNINSTALL_NOTIFY_HANDLER 2 | 42 | #define UNINSTALL_NOTIFY_HANDLER 2 |
43 | 43 | ||
44 | #define ACPI_CONTAINER_COMPONENT 0x01000000 | ||
45 | #define _COMPONENT ACPI_CONTAINER_COMPONENT | 44 | #define _COMPONENT ACPI_CONTAINER_COMPONENT |
46 | ACPI_MODULE_NAME("container"); | 45 | ACPI_MODULE_NAME("container"); |
47 | 46 | ||
diff --git a/drivers/acpi/debug.c b/drivers/acpi/debug.c index abf36b4b1d1d..c48396892008 100644 --- a/drivers/acpi/debug.c +++ b/drivers/acpi/debug.c | |||
@@ -44,6 +44,21 @@ static const struct acpi_dlayer acpi_debug_layers[] = { | |||
44 | ACPI_DEBUG_INIT(ACPI_CA_DISASSEMBLER), | 44 | ACPI_DEBUG_INIT(ACPI_CA_DISASSEMBLER), |
45 | ACPI_DEBUG_INIT(ACPI_COMPILER), | 45 | ACPI_DEBUG_INIT(ACPI_COMPILER), |
46 | ACPI_DEBUG_INIT(ACPI_TOOLS), | 46 | ACPI_DEBUG_INIT(ACPI_TOOLS), |
47 | |||
48 | ACPI_DEBUG_INIT(ACPI_BUS_COMPONENT), | ||
49 | ACPI_DEBUG_INIT(ACPI_AC_COMPONENT), | ||
50 | ACPI_DEBUG_INIT(ACPI_BATTERY_COMPONENT), | ||
51 | ACPI_DEBUG_INIT(ACPI_BUTTON_COMPONENT), | ||
52 | ACPI_DEBUG_INIT(ACPI_SBS_COMPONENT), | ||
53 | ACPI_DEBUG_INIT(ACPI_FAN_COMPONENT), | ||
54 | ACPI_DEBUG_INIT(ACPI_PCI_COMPONENT), | ||
55 | ACPI_DEBUG_INIT(ACPI_POWER_COMPONENT), | ||
56 | ACPI_DEBUG_INIT(ACPI_CONTAINER_COMPONENT), | ||
57 | ACPI_DEBUG_INIT(ACPI_SYSTEM_COMPONENT), | ||
58 | ACPI_DEBUG_INIT(ACPI_THERMAL_COMPONENT), | ||
59 | ACPI_DEBUG_INIT(ACPI_MEMORY_DEVICE_COMPONENT), | ||
60 | ACPI_DEBUG_INIT(ACPI_VIDEO_COMPONENT), | ||
61 | ACPI_DEBUG_INIT(ACPI_PROCESSOR_COMPONENT), | ||
47 | }; | 62 | }; |
48 | 63 | ||
49 | static const struct acpi_dlevel acpi_debug_levels[] = { | 64 | static const struct acpi_dlevel acpi_debug_levels[] = { |
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c index ef42316f89f5..30f3ef236ecb 100644 --- a/drivers/acpi/ec.c +++ b/drivers/acpi/ec.c | |||
@@ -70,7 +70,7 @@ enum ec_command { | |||
70 | #define ACPI_EC_UDELAY_GLK 1000 /* Wait 1ms max. to get global lock */ | 70 | #define ACPI_EC_UDELAY_GLK 1000 /* Wait 1ms max. to get global lock */ |
71 | #define ACPI_EC_UDELAY 100 /* Wait 100us before polling EC again */ | 71 | #define ACPI_EC_UDELAY 100 /* Wait 100us before polling EC again */ |
72 | 72 | ||
73 | #define ACPI_EC_STORM_THRESHOLD 20 /* number of false interrupts | 73 | #define ACPI_EC_STORM_THRESHOLD 8 /* number of false interrupts |
74 | per one transaction */ | 74 | per one transaction */ |
75 | 75 | ||
76 | enum { | 76 | enum { |
@@ -100,8 +100,11 @@ struct transaction { | |||
100 | u8 *rdata; | 100 | u8 *rdata; |
101 | unsigned short irq_count; | 101 | unsigned short irq_count; |
102 | u8 command; | 102 | u8 command; |
103 | u8 wi; | ||
104 | u8 ri; | ||
103 | u8 wlen; | 105 | u8 wlen; |
104 | u8 rlen; | 106 | u8 rlen; |
107 | bool done; | ||
105 | }; | 108 | }; |
106 | 109 | ||
107 | static struct acpi_ec { | 110 | static struct acpi_ec { |
@@ -178,34 +181,46 @@ static int ec_transaction_done(struct acpi_ec *ec) | |||
178 | unsigned long flags; | 181 | unsigned long flags; |
179 | int ret = 0; | 182 | int ret = 0; |
180 | spin_lock_irqsave(&ec->curr_lock, flags); | 183 | spin_lock_irqsave(&ec->curr_lock, flags); |
181 | if (!ec->curr || (!ec->curr->wlen && !ec->curr->rlen)) | 184 | if (!ec->curr || ec->curr->done) |
182 | ret = 1; | 185 | ret = 1; |
183 | spin_unlock_irqrestore(&ec->curr_lock, flags); | 186 | spin_unlock_irqrestore(&ec->curr_lock, flags); |
184 | return ret; | 187 | return ret; |
185 | } | 188 | } |
186 | 189 | ||
190 | static void start_transaction(struct acpi_ec *ec) | ||
191 | { | ||
192 | ec->curr->irq_count = ec->curr->wi = ec->curr->ri = 0; | ||
193 | ec->curr->done = false; | ||
194 | acpi_ec_write_cmd(ec, ec->curr->command); | ||
195 | } | ||
196 | |||
187 | static void gpe_transaction(struct acpi_ec *ec, u8 status) | 197 | static void gpe_transaction(struct acpi_ec *ec, u8 status) |
188 | { | 198 | { |
189 | unsigned long flags; | 199 | unsigned long flags; |
190 | spin_lock_irqsave(&ec->curr_lock, flags); | 200 | spin_lock_irqsave(&ec->curr_lock, flags); |
191 | if (!ec->curr) | 201 | if (!ec->curr) |
192 | goto unlock; | 202 | goto unlock; |
193 | if (ec->curr->wlen > 0) { | 203 | if (ec->curr->wlen > ec->curr->wi) { |
194 | if ((status & ACPI_EC_FLAG_IBF) == 0) { | 204 | if ((status & ACPI_EC_FLAG_IBF) == 0) |
195 | acpi_ec_write_data(ec, *(ec->curr->wdata++)); | 205 | acpi_ec_write_data(ec, |
196 | --ec->curr->wlen; | 206 | ec->curr->wdata[ec->curr->wi++]); |
197 | } else | 207 | else |
198 | /* false interrupt, state didn't change */ | 208 | goto err; |
199 | ++ec->curr->irq_count; | 209 | } else if (ec->curr->rlen > ec->curr->ri) { |
200 | |||
201 | } else if (ec->curr->rlen > 0) { | ||
202 | if ((status & ACPI_EC_FLAG_OBF) == 1) { | 210 | if ((status & ACPI_EC_FLAG_OBF) == 1) { |
203 | *(ec->curr->rdata++) = acpi_ec_read_data(ec); | 211 | ec->curr->rdata[ec->curr->ri++] = acpi_ec_read_data(ec); |
204 | --ec->curr->rlen; | 212 | if (ec->curr->rlen == ec->curr->ri) |
213 | ec->curr->done = true; | ||
205 | } else | 214 | } else |
206 | /* false interrupt, state didn't change */ | 215 | goto err; |
207 | ++ec->curr->irq_count; | 216 | } else if (ec->curr->wlen == ec->curr->wi && |
208 | } | 217 | (status & ACPI_EC_FLAG_IBF) == 0) |
218 | ec->curr->done = true; | ||
219 | goto unlock; | ||
220 | err: | ||
221 | /* false interrupt, state didn't change */ | ||
222 | if (in_interrupt()) | ||
223 | ++ec->curr->irq_count; | ||
209 | unlock: | 224 | unlock: |
210 | spin_unlock_irqrestore(&ec->curr_lock, flags); | 225 | spin_unlock_irqrestore(&ec->curr_lock, flags); |
211 | } | 226 | } |
@@ -215,6 +230,15 @@ static int acpi_ec_wait(struct acpi_ec *ec) | |||
215 | if (wait_event_timeout(ec->wait, ec_transaction_done(ec), | 230 | if (wait_event_timeout(ec->wait, ec_transaction_done(ec), |
216 | msecs_to_jiffies(ACPI_EC_DELAY))) | 231 | msecs_to_jiffies(ACPI_EC_DELAY))) |
217 | return 0; | 232 | return 0; |
233 | /* try restart command if we get any false interrupts */ | ||
234 | if (ec->curr->irq_count && | ||
235 | (acpi_ec_read_status(ec) & ACPI_EC_FLAG_IBF) == 0) { | ||
236 | pr_debug(PREFIX "controller reset, restart transaction\n"); | ||
237 | start_transaction(ec); | ||
238 | if (wait_event_timeout(ec->wait, ec_transaction_done(ec), | ||
239 | msecs_to_jiffies(ACPI_EC_DELAY))) | ||
240 | return 0; | ||
241 | } | ||
218 | /* missing GPEs, switch back to poll mode */ | 242 | /* missing GPEs, switch back to poll mode */ |
219 | if (printk_ratelimit()) | 243 | if (printk_ratelimit()) |
220 | pr_info(PREFIX "missing confirmations, " | 244 | pr_info(PREFIX "missing confirmations, " |
@@ -239,10 +263,10 @@ static int ec_check_sci(struct acpi_ec *ec, u8 state) | |||
239 | static int ec_poll(struct acpi_ec *ec) | 263 | static int ec_poll(struct acpi_ec *ec) |
240 | { | 264 | { |
241 | unsigned long delay = jiffies + msecs_to_jiffies(ACPI_EC_DELAY); | 265 | unsigned long delay = jiffies + msecs_to_jiffies(ACPI_EC_DELAY); |
242 | msleep(1); | 266 | udelay(ACPI_EC_UDELAY); |
243 | while (time_before(jiffies, delay)) { | 267 | while (time_before(jiffies, delay)) { |
244 | gpe_transaction(ec, acpi_ec_read_status(ec)); | 268 | gpe_transaction(ec, acpi_ec_read_status(ec)); |
245 | msleep(1); | 269 | udelay(ACPI_EC_UDELAY); |
246 | if (ec_transaction_done(ec)) | 270 | if (ec_transaction_done(ec)) |
247 | return 0; | 271 | return 0; |
248 | } | 272 | } |
@@ -259,14 +283,13 @@ static int acpi_ec_transaction_unlocked(struct acpi_ec *ec, | |||
259 | /* disable GPE during transaction if storm is detected */ | 283 | /* disable GPE during transaction if storm is detected */ |
260 | if (test_bit(EC_FLAGS_GPE_STORM, &ec->flags)) { | 284 | if (test_bit(EC_FLAGS_GPE_STORM, &ec->flags)) { |
261 | clear_bit(EC_FLAGS_GPE_MODE, &ec->flags); | 285 | clear_bit(EC_FLAGS_GPE_MODE, &ec->flags); |
262 | acpi_disable_gpe(NULL, ec->gpe, ACPI_NOT_ISR); | 286 | acpi_disable_gpe(NULL, ec->gpe); |
263 | } | 287 | } |
264 | /* start transaction */ | 288 | /* start transaction */ |
265 | spin_lock_irqsave(&ec->curr_lock, tmp); | 289 | spin_lock_irqsave(&ec->curr_lock, tmp); |
266 | /* following two actions should be kept atomic */ | 290 | /* following two actions should be kept atomic */ |
267 | t->irq_count = 0; | ||
268 | ec->curr = t; | 291 | ec->curr = t; |
269 | acpi_ec_write_cmd(ec, ec->curr->command); | 292 | start_transaction(ec); |
270 | if (ec->curr->command == ACPI_EC_COMMAND_QUERY) | 293 | if (ec->curr->command == ACPI_EC_COMMAND_QUERY) |
271 | clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags); | 294 | clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags); |
272 | spin_unlock_irqrestore(&ec->curr_lock, tmp); | 295 | spin_unlock_irqrestore(&ec->curr_lock, tmp); |
@@ -283,10 +306,11 @@ static int acpi_ec_transaction_unlocked(struct acpi_ec *ec, | |||
283 | /* check if we received SCI during transaction */ | 306 | /* check if we received SCI during transaction */ |
284 | ec_check_sci(ec, acpi_ec_read_status(ec)); | 307 | ec_check_sci(ec, acpi_ec_read_status(ec)); |
285 | /* it is safe to enable GPE outside of transaction */ | 308 | /* it is safe to enable GPE outside of transaction */ |
286 | acpi_enable_gpe(NULL, ec->gpe, ACPI_NOT_ISR); | 309 | acpi_enable_gpe(NULL, ec->gpe); |
287 | } else if (test_bit(EC_FLAGS_GPE_MODE, &ec->flags) && | 310 | } else if (test_bit(EC_FLAGS_GPE_MODE, &ec->flags) && |
288 | t->irq_count > ACPI_EC_STORM_THRESHOLD) { | 311 | t->irq_count > ACPI_EC_STORM_THRESHOLD) { |
289 | pr_debug(PREFIX "GPE storm detected\n"); | 312 | pr_info(PREFIX "GPE storm detected, " |
313 | "transactions will use polling mode\n"); | ||
290 | set_bit(EC_FLAGS_GPE_STORM, &ec->flags); | 314 | set_bit(EC_FLAGS_GPE_STORM, &ec->flags); |
291 | } | 315 | } |
292 | return ret; | 316 | return ret; |
@@ -558,17 +582,26 @@ static u32 acpi_ec_gpe_handler(void *data) | |||
558 | pr_debug(PREFIX "~~~> interrupt\n"); | 582 | pr_debug(PREFIX "~~~> interrupt\n"); |
559 | status = acpi_ec_read_status(ec); | 583 | status = acpi_ec_read_status(ec); |
560 | 584 | ||
561 | gpe_transaction(ec, status); | 585 | if (test_bit(EC_FLAGS_GPE_MODE, &ec->flags)) { |
562 | if (ec_transaction_done(ec) && (status & ACPI_EC_FLAG_IBF) == 0) | 586 | gpe_transaction(ec, status); |
563 | wake_up(&ec->wait); | 587 | if (ec_transaction_done(ec) && |
588 | (status & ACPI_EC_FLAG_IBF) == 0) | ||
589 | wake_up(&ec->wait); | ||
590 | } | ||
564 | 591 | ||
565 | ec_check_sci(ec, status); | 592 | ec_check_sci(ec, status); |
566 | if (!test_bit(EC_FLAGS_GPE_MODE, &ec->flags) && | 593 | if (!test_bit(EC_FLAGS_GPE_MODE, &ec->flags) && |
567 | !test_bit(EC_FLAGS_NO_GPE, &ec->flags)) { | 594 | !test_bit(EC_FLAGS_NO_GPE, &ec->flags)) { |
568 | /* this is non-query, must be confirmation */ | 595 | /* this is non-query, must be confirmation */ |
569 | if (printk_ratelimit()) | 596 | if (!test_bit(EC_FLAGS_GPE_STORM, &ec->flags)) { |
570 | pr_info(PREFIX "non-query interrupt received," | 597 | if (printk_ratelimit()) |
598 | pr_info(PREFIX "non-query interrupt received," | ||
599 | " switching to interrupt mode\n"); | ||
600 | } else { | ||
601 | /* hush, STORM switches the mode every transaction */ | ||
602 | pr_debug(PREFIX "non-query interrupt received," | ||
571 | " switching to interrupt mode\n"); | 603 | " switching to interrupt mode\n"); |
604 | } | ||
572 | set_bit(EC_FLAGS_GPE_MODE, &ec->flags); | 605 | set_bit(EC_FLAGS_GPE_MODE, &ec->flags); |
573 | } | 606 | } |
574 | return ACPI_INTERRUPT_HANDLED; | 607 | return ACPI_INTERRUPT_HANDLED; |
@@ -736,7 +769,7 @@ static acpi_status | |||
736 | ec_parse_device(acpi_handle handle, u32 Level, void *context, void **retval) | 769 | ec_parse_device(acpi_handle handle, u32 Level, void *context, void **retval) |
737 | { | 770 | { |
738 | acpi_status status; | 771 | acpi_status status; |
739 | unsigned long long tmp; | 772 | unsigned long long tmp = 0; |
740 | 773 | ||
741 | struct acpi_ec *ec = context; | 774 | struct acpi_ec *ec = context; |
742 | status = acpi_walk_resources(handle, METHOD_NAME__CRS, | 775 | status = acpi_walk_resources(handle, METHOD_NAME__CRS, |
@@ -751,6 +784,7 @@ ec_parse_device(acpi_handle handle, u32 Level, void *context, void **retval) | |||
751 | return status; | 784 | return status; |
752 | ec->gpe = tmp; | 785 | ec->gpe = tmp; |
753 | /* Use the global lock for all EC transactions? */ | 786 | /* Use the global lock for all EC transactions? */ |
787 | tmp = 0; | ||
754 | acpi_evaluate_integer(handle, "_GLK", NULL, &tmp); | 788 | acpi_evaluate_integer(handle, "_GLK", NULL, &tmp); |
755 | ec->global_lock = tmp; | 789 | ec->global_lock = tmp; |
756 | ec->handle = handle; | 790 | ec->handle = handle; |
@@ -868,7 +902,7 @@ static int ec_install_handlers(struct acpi_ec *ec) | |||
868 | if (ACPI_FAILURE(status)) | 902 | if (ACPI_FAILURE(status)) |
869 | return -ENODEV; | 903 | return -ENODEV; |
870 | acpi_set_gpe_type(NULL, ec->gpe, ACPI_GPE_TYPE_RUNTIME); | 904 | acpi_set_gpe_type(NULL, ec->gpe, ACPI_GPE_TYPE_RUNTIME); |
871 | acpi_enable_gpe(NULL, ec->gpe, ACPI_NOT_ISR); | 905 | acpi_enable_gpe(NULL, ec->gpe); |
872 | status = acpi_install_address_space_handler(ec->handle, | 906 | status = acpi_install_address_space_handler(ec->handle, |
873 | ACPI_ADR_SPACE_EC, | 907 | ACPI_ADR_SPACE_EC, |
874 | &acpi_ec_space_handler, | 908 | &acpi_ec_space_handler, |
@@ -1007,7 +1041,7 @@ static int acpi_ec_suspend(struct acpi_device *device, pm_message_t state) | |||
1007 | /* Stop using GPE */ | 1041 | /* Stop using GPE */ |
1008 | set_bit(EC_FLAGS_NO_GPE, &ec->flags); | 1042 | set_bit(EC_FLAGS_NO_GPE, &ec->flags); |
1009 | clear_bit(EC_FLAGS_GPE_MODE, &ec->flags); | 1043 | clear_bit(EC_FLAGS_GPE_MODE, &ec->flags); |
1010 | acpi_disable_gpe(NULL, ec->gpe, ACPI_NOT_ISR); | 1044 | acpi_disable_gpe(NULL, ec->gpe); |
1011 | return 0; | 1045 | return 0; |
1012 | } | 1046 | } |
1013 | 1047 | ||
@@ -1016,7 +1050,7 @@ static int acpi_ec_resume(struct acpi_device *device) | |||
1016 | struct acpi_ec *ec = acpi_driver_data(device); | 1050 | struct acpi_ec *ec = acpi_driver_data(device); |
1017 | /* Enable use of GPE back */ | 1051 | /* Enable use of GPE back */ |
1018 | clear_bit(EC_FLAGS_NO_GPE, &ec->flags); | 1052 | clear_bit(EC_FLAGS_NO_GPE, &ec->flags); |
1019 | acpi_enable_gpe(NULL, ec->gpe, ACPI_NOT_ISR); | 1053 | acpi_enable_gpe(NULL, ec->gpe); |
1020 | return 0; | 1054 | return 0; |
1021 | } | 1055 | } |
1022 | 1056 | ||
diff --git a/drivers/acpi/events/evgpe.c b/drivers/acpi/events/evgpe.c index c5e53aae86f7..f45c74fe745e 100644 --- a/drivers/acpi/events/evgpe.c +++ b/drivers/acpi/events/evgpe.c | |||
@@ -289,8 +289,6 @@ acpi_status acpi_ev_disable_gpe(struct acpi_gpe_event_info *gpe_event_info) | |||
289 | */ | 289 | */ |
290 | status = acpi_hw_low_disable_gpe(gpe_event_info); | 290 | status = acpi_hw_low_disable_gpe(gpe_event_info); |
291 | return_ACPI_STATUS(status); | 291 | return_ACPI_STATUS(status); |
292 | |||
293 | return_ACPI_STATUS(AE_OK); | ||
294 | } | 292 | } |
295 | 293 | ||
296 | /******************************************************************************* | 294 | /******************************************************************************* |
diff --git a/drivers/acpi/events/evxfevnt.c b/drivers/acpi/events/evxfevnt.c index 73bfd6bf962f..41554f736b68 100644 --- a/drivers/acpi/events/evxfevnt.c +++ b/drivers/acpi/events/evxfevnt.c | |||
@@ -248,21 +248,15 @@ ACPI_EXPORT_SYMBOL(acpi_set_gpe_type) | |||
248 | * DESCRIPTION: Enable an ACPI event (general purpose) | 248 | * DESCRIPTION: Enable an ACPI event (general purpose) |
249 | * | 249 | * |
250 | ******************************************************************************/ | 250 | ******************************************************************************/ |
251 | acpi_status acpi_enable_gpe(acpi_handle gpe_device, u32 gpe_number, u32 flags) | 251 | acpi_status acpi_enable_gpe(acpi_handle gpe_device, u32 gpe_number) |
252 | { | 252 | { |
253 | acpi_status status = AE_OK; | 253 | acpi_status status = AE_OK; |
254 | acpi_cpu_flags flags; | ||
254 | struct acpi_gpe_event_info *gpe_event_info; | 255 | struct acpi_gpe_event_info *gpe_event_info; |
255 | 256 | ||
256 | ACPI_FUNCTION_TRACE(acpi_enable_gpe); | 257 | ACPI_FUNCTION_TRACE(acpi_enable_gpe); |
257 | 258 | ||
258 | /* Use semaphore lock if not executing at interrupt level */ | 259 | flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock); |
259 | |||
260 | if (flags & ACPI_NOT_ISR) { | ||
261 | status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS); | ||
262 | if (ACPI_FAILURE(status)) { | ||
263 | return_ACPI_STATUS(status); | ||
264 | } | ||
265 | } | ||
266 | 260 | ||
267 | /* Ensure that we have a valid GPE number */ | 261 | /* Ensure that we have a valid GPE number */ |
268 | 262 | ||
@@ -277,9 +271,7 @@ acpi_status acpi_enable_gpe(acpi_handle gpe_device, u32 gpe_number, u32 flags) | |||
277 | status = acpi_ev_enable_gpe(gpe_event_info, TRUE); | 271 | status = acpi_ev_enable_gpe(gpe_event_info, TRUE); |
278 | 272 | ||
279 | unlock_and_exit: | 273 | unlock_and_exit: |
280 | if (flags & ACPI_NOT_ISR) { | 274 | acpi_os_release_lock(acpi_gbl_gpe_lock, flags); |
281 | (void)acpi_ut_release_mutex(ACPI_MTX_EVENTS); | ||
282 | } | ||
283 | return_ACPI_STATUS(status); | 275 | return_ACPI_STATUS(status); |
284 | } | 276 | } |
285 | 277 | ||
@@ -299,22 +291,15 @@ ACPI_EXPORT_SYMBOL(acpi_enable_gpe) | |||
299 | * DESCRIPTION: Disable an ACPI event (general purpose) | 291 | * DESCRIPTION: Disable an ACPI event (general purpose) |
300 | * | 292 | * |
301 | ******************************************************************************/ | 293 | ******************************************************************************/ |
302 | acpi_status acpi_disable_gpe(acpi_handle gpe_device, u32 gpe_number, u32 flags) | 294 | acpi_status acpi_disable_gpe(acpi_handle gpe_device, u32 gpe_number) |
303 | { | 295 | { |
304 | acpi_status status = AE_OK; | 296 | acpi_status status = AE_OK; |
297 | acpi_cpu_flags flags; | ||
305 | struct acpi_gpe_event_info *gpe_event_info; | 298 | struct acpi_gpe_event_info *gpe_event_info; |
306 | 299 | ||
307 | ACPI_FUNCTION_TRACE(acpi_disable_gpe); | 300 | ACPI_FUNCTION_TRACE(acpi_disable_gpe); |
308 | 301 | ||
309 | /* Use semaphore lock if not executing at interrupt level */ | 302 | flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock); |
310 | |||
311 | if (flags & ACPI_NOT_ISR) { | ||
312 | status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS); | ||
313 | if (ACPI_FAILURE(status)) { | ||
314 | return_ACPI_STATUS(status); | ||
315 | } | ||
316 | } | ||
317 | |||
318 | /* Ensure that we have a valid GPE number */ | 303 | /* Ensure that we have a valid GPE number */ |
319 | 304 | ||
320 | gpe_event_info = acpi_ev_get_gpe_event_info(gpe_device, gpe_number); | 305 | gpe_event_info = acpi_ev_get_gpe_event_info(gpe_device, gpe_number); |
@@ -325,10 +310,8 @@ acpi_status acpi_disable_gpe(acpi_handle gpe_device, u32 gpe_number, u32 flags) | |||
325 | 310 | ||
326 | status = acpi_ev_disable_gpe(gpe_event_info); | 311 | status = acpi_ev_disable_gpe(gpe_event_info); |
327 | 312 | ||
328 | unlock_and_exit: | 313 | unlock_and_exit: |
329 | if (flags & ACPI_NOT_ISR) { | 314 | acpi_os_release_lock(acpi_gbl_gpe_lock, flags); |
330 | (void)acpi_ut_release_mutex(ACPI_MTX_EVENTS); | ||
331 | } | ||
332 | return_ACPI_STATUS(status); | 315 | return_ACPI_STATUS(status); |
333 | } | 316 | } |
334 | 317 | ||
@@ -521,6 +504,9 @@ acpi_status acpi_get_event_status(u32 event, acpi_event_status * event_status) | |||
521 | if (value) | 504 | if (value) |
522 | *event_status |= ACPI_EVENT_FLAG_SET; | 505 | *event_status |= ACPI_EVENT_FLAG_SET; |
523 | 506 | ||
507 | if (acpi_gbl_fixed_event_handlers[event].handler) | ||
508 | *event_status |= ACPI_EVENT_FLAG_HANDLE; | ||
509 | |||
524 | return_ACPI_STATUS(status); | 510 | return_ACPI_STATUS(status); |
525 | } | 511 | } |
526 | 512 | ||
@@ -571,6 +557,9 @@ acpi_get_gpe_status(acpi_handle gpe_device, | |||
571 | 557 | ||
572 | status = acpi_hw_get_gpe_status(gpe_event_info, event_status); | 558 | status = acpi_hw_get_gpe_status(gpe_event_info, event_status); |
573 | 559 | ||
560 | if (gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) | ||
561 | *event_status |= ACPI_EVENT_FLAG_HANDLE; | ||
562 | |||
574 | unlock_and_exit: | 563 | unlock_and_exit: |
575 | if (flags & ACPI_NOT_ISR) { | 564 | if (flags & ACPI_NOT_ISR) { |
576 | (void)acpi_ut_release_mutex(ACPI_MTX_EVENTS); | 565 | (void)acpi_ut_release_mutex(ACPI_MTX_EVENTS); |
diff --git a/drivers/acpi/fan.c b/drivers/acpi/fan.c index 60d54d1f6b19..eaaee1660bdf 100644 --- a/drivers/acpi/fan.c +++ b/drivers/acpi/fan.c | |||
@@ -34,7 +34,6 @@ | |||
34 | #include <acpi/acpi_bus.h> | 34 | #include <acpi/acpi_bus.h> |
35 | #include <acpi/acpi_drivers.h> | 35 | #include <acpi/acpi_drivers.h> |
36 | 36 | ||
37 | #define ACPI_FAN_COMPONENT 0x00200000 | ||
38 | #define ACPI_FAN_CLASS "fan" | 37 | #define ACPI_FAN_CLASS "fan" |
39 | #define ACPI_FAN_FILE_STATE "state" | 38 | #define ACPI_FAN_FILE_STATE "state" |
40 | 39 | ||
diff --git a/drivers/acpi/glue.c b/drivers/acpi/glue.c index 24649ada08df..adec3d15810a 100644 --- a/drivers/acpi/glue.c +++ b/drivers/acpi/glue.c | |||
@@ -140,6 +140,46 @@ struct device *acpi_get_physical_device(acpi_handle handle) | |||
140 | 140 | ||
141 | EXPORT_SYMBOL(acpi_get_physical_device); | 141 | EXPORT_SYMBOL(acpi_get_physical_device); |
142 | 142 | ||
143 | /* ToDo: When a PCI bridge is found, return the PCI device behind the bridge | ||
144 | * This should work in general, but did not on a Lenovo T61 for the | ||
145 | * graphics card. But this must be fixed when the PCI device is | ||
146 | * bound and the kernel device struct is attached to the acpi device | ||
147 | * Note: A success call will increase reference count by one | ||
148 | * Do call put_device(dev) on the returned device then | ||
149 | */ | ||
150 | struct device *acpi_get_physical_pci_device(acpi_handle handle) | ||
151 | { | ||
152 | struct device *dev; | ||
153 | long long device_id; | ||
154 | acpi_status status; | ||
155 | |||
156 | status = | ||
157 | acpi_evaluate_integer(handle, "_ADR", NULL, &device_id); | ||
158 | |||
159 | if (ACPI_FAILURE(status)) | ||
160 | return NULL; | ||
161 | |||
162 | /* We need to attempt to determine whether the _ADR refers to a | ||
163 | PCI device or not. There's no terribly good way to do this, | ||
164 | so the best we can hope for is to assume that there'll never | ||
165 | be a device in the host bridge */ | ||
166 | if (device_id >= 0x10000) { | ||
167 | /* It looks like a PCI device. Does it exist? */ | ||
168 | dev = acpi_get_physical_device(handle); | ||
169 | } else { | ||
170 | /* It doesn't look like a PCI device. Does its parent | ||
171 | exist? */ | ||
172 | acpi_handle phandle; | ||
173 | if (acpi_get_parent(handle, &phandle)) | ||
174 | return NULL; | ||
175 | dev = acpi_get_physical_device(phandle); | ||
176 | } | ||
177 | if (!dev) | ||
178 | return NULL; | ||
179 | return dev; | ||
180 | } | ||
181 | EXPORT_SYMBOL(acpi_get_physical_pci_device); | ||
182 | |||
143 | static int acpi_bind_one(struct device *dev, acpi_handle handle) | 183 | static int acpi_bind_one(struct device *dev, acpi_handle handle) |
144 | { | 184 | { |
145 | struct acpi_device *acpi_dev; | 185 | struct acpi_device *acpi_dev; |
diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c index 4be252145cb4..c8111424dcb8 100644 --- a/drivers/acpi/osl.c +++ b/drivers/acpi/osl.c | |||
@@ -35,7 +35,6 @@ | |||
35 | #include <linux/interrupt.h> | 35 | #include <linux/interrupt.h> |
36 | #include <linux/kmod.h> | 36 | #include <linux/kmod.h> |
37 | #include <linux/delay.h> | 37 | #include <linux/delay.h> |
38 | #include <linux/dmi.h> | ||
39 | #include <linux/workqueue.h> | 38 | #include <linux/workqueue.h> |
40 | #include <linux/nmi.h> | 39 | #include <linux/nmi.h> |
41 | #include <linux/acpi.h> | 40 | #include <linux/acpi.h> |
@@ -97,54 +96,44 @@ static DEFINE_SPINLOCK(acpi_res_lock); | |||
97 | static char osi_additional_string[OSI_STRING_LENGTH_MAX]; | 96 | static char osi_additional_string[OSI_STRING_LENGTH_MAX]; |
98 | 97 | ||
99 | /* | 98 | /* |
100 | * "Ode to _OSI(Linux)" | 99 | * The story of _OSI(Linux) |
101 | * | 100 | * |
102 | * osi_linux -- Control response to BIOS _OSI(Linux) query. | 101 | * From pre-history through Linux-2.6.22, |
102 | * Linux responded TRUE upon a BIOS OSI(Linux) query. | ||
103 | * | 103 | * |
104 | * As Linux evolves, the features that it supports change. | 104 | * Unfortunately, reference BIOS writers got wind of this |
105 | * So an OSI string such as "Linux" is not specific enough | 105 | * and put OSI(Linux) in their example code, quickly exposing |
106 | * to be useful across multiple versions of Linux. It | 106 | * this string as ill-conceived and opening the door to |
107 | * doesn't identify any particular feature, interface, | 107 | * an un-bounded number of BIOS incompatibilities. |
108 | * or even any particular version of Linux... | ||
109 | * | 108 | * |
110 | * Unfortunately, Linux-2.6.22 and earlier responded "yes" | 109 | * For example, OSI(Linux) was used on resume to re-POST a |
111 | * to a BIOS _OSI(Linux) query. When | 110 | * video card on one system, because Linux at that time |
112 | * a reference mobile BIOS started using it, its use | 111 | * could not do a speedy restore in its native driver. |
113 | * started to spread to many vendor platforms. | 112 | * But then upon gaining quick native restore capability, |
114 | * As it is not supportable, we need to halt that spread. | 113 | * Linux has no way to tell the BIOS to skip the time-consuming |
114 | * POST -- putting Linux at a permanent performance disadvantage. | ||
115 | * On another system, the BIOS writer used OSI(Linux) | ||
116 | * to infer native OS support for IPMI! On other systems, | ||
117 | * OSI(Linux) simply got in the way of Linux claiming to | ||
118 | * be compatible with other operating systems, exposing | ||
119 | * BIOS issues such as skipped device initialization. | ||
115 | * | 120 | * |
116 | * Today, most BIOS references to _OSI(Linux) are noise -- | 121 | * So "Linux" turned out to be a really poor chose of |
117 | * they have no functional effect and are just dead code | 122 | * OSI string, and from Linux-2.6.23 onward we respond FALSE. |
118 | * carried over from the reference BIOS. | ||
119 | * | ||
120 | * The next most common case is that _OSI(Linux) harms Linux, | ||
121 | * usually by causing the BIOS to follow paths that are | ||
122 | * not tested during Windows validation. | ||
123 | * | ||
124 | * Finally, there is a short list of platforms | ||
125 | * where OSI(Linux) benefits Linux. | ||
126 | * | ||
127 | * In Linux-2.6.23, OSI(Linux) is first disabled by default. | ||
128 | * DMI is used to disable the dmesg warning about OSI(Linux) | ||
129 | * on platforms where it is known to have no effect. | ||
130 | * But a dmesg warning remains for systems where | ||
131 | * we do not know if OSI(Linux) is good or bad for the system. | ||
132 | * DMI is also used to enable OSI(Linux) for the machines | ||
133 | * that are known to need it. | ||
134 | * | 123 | * |
135 | * BIOS writers should NOT query _OSI(Linux) on future systems. | 124 | * BIOS writers should NOT query _OSI(Linux) on future systems. |
136 | * It will be ignored by default, and to get Linux to | 125 | * Linux will complain on the console when it sees it, and return FALSE. |
137 | * not ignore it will require a kernel source update to | 126 | * To get Linux to return TRUE for your system will require |
138 | * add a DMI entry, or a boot-time "acpi_osi=Linux" invocation. | 127 | * a kernel source update to add a DMI entry, |
128 | * or boot with "acpi_osi=Linux" | ||
139 | */ | 129 | */ |
140 | #define OSI_LINUX_ENABLE 0 | ||
141 | 130 | ||
142 | static struct osi_linux { | 131 | static struct osi_linux { |
143 | unsigned int enable:1; | 132 | unsigned int enable:1; |
144 | unsigned int dmi:1; | 133 | unsigned int dmi:1; |
145 | unsigned int cmdline:1; | 134 | unsigned int cmdline:1; |
146 | unsigned int known:1; | 135 | unsigned int known:1; |
147 | } osi_linux = { OSI_LINUX_ENABLE, 0, 0, 0}; | 136 | } osi_linux = { 0, 0, 0, 0}; |
148 | 137 | ||
149 | static void __init acpi_request_region (struct acpi_generic_address *addr, | 138 | static void __init acpi_request_region (struct acpi_generic_address *addr, |
150 | unsigned int length, char *desc) | 139 | unsigned int length, char *desc) |
@@ -1296,34 +1285,6 @@ acpi_status acpi_os_release_object(acpi_cache_t * cache, void *object) | |||
1296 | return (AE_OK); | 1285 | return (AE_OK); |
1297 | } | 1286 | } |
1298 | 1287 | ||
1299 | /** | ||
1300 | * acpi_dmi_dump - dump DMI slots needed for blacklist entry | ||
1301 | * | ||
1302 | * Returns 0 on success | ||
1303 | */ | ||
1304 | static int acpi_dmi_dump(void) | ||
1305 | { | ||
1306 | |||
1307 | if (!dmi_available) | ||
1308 | return -1; | ||
1309 | |||
1310 | printk(KERN_NOTICE PREFIX "DMI System Vendor: %s\n", | ||
1311 | dmi_get_system_info(DMI_SYS_VENDOR)); | ||
1312 | printk(KERN_NOTICE PREFIX "DMI Product Name: %s\n", | ||
1313 | dmi_get_system_info(DMI_PRODUCT_NAME)); | ||
1314 | printk(KERN_NOTICE PREFIX "DMI Product Version: %s\n", | ||
1315 | dmi_get_system_info(DMI_PRODUCT_VERSION)); | ||
1316 | printk(KERN_NOTICE PREFIX "DMI Board Name: %s\n", | ||
1317 | dmi_get_system_info(DMI_BOARD_NAME)); | ||
1318 | printk(KERN_NOTICE PREFIX "DMI BIOS Vendor: %s\n", | ||
1319 | dmi_get_system_info(DMI_BIOS_VENDOR)); | ||
1320 | printk(KERN_NOTICE PREFIX "DMI BIOS Date: %s\n", | ||
1321 | dmi_get_system_info(DMI_BIOS_DATE)); | ||
1322 | |||
1323 | return 0; | ||
1324 | } | ||
1325 | |||
1326 | |||
1327 | /****************************************************************************** | 1288 | /****************************************************************************** |
1328 | * | 1289 | * |
1329 | * FUNCTION: acpi_os_validate_interface | 1290 | * FUNCTION: acpi_os_validate_interface |
@@ -1350,21 +1311,6 @@ acpi_os_validate_interface (char *interface) | |||
1350 | osi_linux.cmdline ? " via cmdline" : | 1311 | osi_linux.cmdline ? " via cmdline" : |
1351 | osi_linux.dmi ? " via DMI" : ""); | 1312 | osi_linux.dmi ? " via DMI" : ""); |
1352 | 1313 | ||
1353 | if (!osi_linux.dmi) { | ||
1354 | if (acpi_dmi_dump()) | ||
1355 | printk(KERN_NOTICE PREFIX | ||
1356 | "[please extract dmidecode output]\n"); | ||
1357 | printk(KERN_NOTICE PREFIX | ||
1358 | "Please send DMI info above to " | ||
1359 | "linux-acpi@vger.kernel.org\n"); | ||
1360 | } | ||
1361 | if (!osi_linux.known && !osi_linux.cmdline) { | ||
1362 | printk(KERN_NOTICE PREFIX | ||
1363 | "If \"acpi_osi=%sLinux\" works better, " | ||
1364 | "please notify linux-acpi@vger.kernel.org\n", | ||
1365 | osi_linux.enable ? "!" : ""); | ||
1366 | } | ||
1367 | |||
1368 | if (osi_linux.enable) | 1314 | if (osi_linux.enable) |
1369 | return AE_OK; | 1315 | return AE_OK; |
1370 | } | 1316 | } |
diff --git a/drivers/acpi/pci_link.c b/drivers/acpi/pci_link.c index fcfdef7b4fdd..e52ad91ce2dc 100644 --- a/drivers/acpi/pci_link.c +++ b/drivers/acpi/pci_link.c | |||
@@ -531,7 +531,7 @@ int __init acpi_irq_penalty_init(void) | |||
531 | return 0; | 531 | return 0; |
532 | } | 532 | } |
533 | 533 | ||
534 | static int acpi_irq_balance; /* 0: static, 1: balance */ | 534 | static int acpi_irq_balance = -1; /* 0: static, 1: balance */ |
535 | 535 | ||
536 | static int acpi_pci_link_allocate(struct acpi_pci_link *link) | 536 | static int acpi_pci_link_allocate(struct acpi_pci_link *link) |
537 | { | 537 | { |
@@ -950,10 +950,17 @@ device_initcall(irqrouter_init_sysfs); | |||
950 | 950 | ||
951 | static int __init acpi_pci_link_init(void) | 951 | static int __init acpi_pci_link_init(void) |
952 | { | 952 | { |
953 | |||
954 | if (acpi_noirq) | 953 | if (acpi_noirq) |
955 | return 0; | 954 | return 0; |
956 | 955 | ||
956 | if (acpi_irq_balance == -1) { | ||
957 | /* no command line switch: enable balancing in IOAPIC mode */ | ||
958 | if (acpi_irq_model == ACPI_IRQ_MODEL_IOAPIC) | ||
959 | acpi_irq_balance = 1; | ||
960 | else | ||
961 | acpi_irq_balance = 0; | ||
962 | } | ||
963 | |||
957 | acpi_link.count = 0; | 964 | acpi_link.count = 0; |
958 | INIT_LIST_HEAD(&acpi_link.entries); | 965 | INIT_LIST_HEAD(&acpi_link.entries); |
959 | 966 | ||
diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c index 1b8f67d21d53..642554b1b60c 100644 --- a/drivers/acpi/pci_root.c +++ b/drivers/acpi/pci_root.c | |||
@@ -376,15 +376,9 @@ static int acpi_pci_root_remove(struct acpi_device *device, int type) | |||
376 | 376 | ||
377 | static int __init acpi_pci_root_init(void) | 377 | static int __init acpi_pci_root_init(void) |
378 | { | 378 | { |
379 | |||
380 | if (acpi_pci_disabled) | 379 | if (acpi_pci_disabled) |
381 | return 0; | 380 | return 0; |
382 | 381 | ||
383 | /* DEBUG: | ||
384 | acpi_dbg_layer = ACPI_PCI_COMPONENT; | ||
385 | acpi_dbg_level = 0xFFFFFFFF; | ||
386 | */ | ||
387 | |||
388 | if (acpi_bus_register_driver(&acpi_pci_root_driver) < 0) | 382 | if (acpi_bus_register_driver(&acpi_pci_root_driver) < 0) |
389 | return -ENODEV; | 383 | return -ENODEV; |
390 | 384 | ||
diff --git a/drivers/acpi/power.c b/drivers/acpi/power.c index a1718e56103b..bb7d50dd2818 100644 --- a/drivers/acpi/power.c +++ b/drivers/acpi/power.c | |||
@@ -44,9 +44,8 @@ | |||
44 | #include <acpi/acpi_bus.h> | 44 | #include <acpi/acpi_bus.h> |
45 | #include <acpi/acpi_drivers.h> | 45 | #include <acpi/acpi_drivers.h> |
46 | 46 | ||
47 | #define _COMPONENT ACPI_POWER_COMPONENT | 47 | #define _COMPONENT ACPI_POWER_COMPONENT |
48 | ACPI_MODULE_NAME("power"); | 48 | ACPI_MODULE_NAME("power"); |
49 | #define ACPI_POWER_COMPONENT 0x00800000 | ||
50 | #define ACPI_POWER_CLASS "power_resource" | 49 | #define ACPI_POWER_CLASS "power_resource" |
51 | #define ACPI_POWER_DEVICE_NAME "Power Resource" | 50 | #define ACPI_POWER_DEVICE_NAME "Power Resource" |
52 | #define ACPI_POWER_FILE_INFO "info" | 51 | #define ACPI_POWER_FILE_INFO "info" |
@@ -153,7 +152,8 @@ static int acpi_power_get_state(acpi_handle handle, int *state) | |||
153 | ACPI_POWER_RESOURCE_STATE_OFF; | 152 | ACPI_POWER_RESOURCE_STATE_OFF; |
154 | 153 | ||
155 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Resource [%s] is %s\n", | 154 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Resource [%s] is %s\n", |
156 | acpi_ut_get_node_name(handle), state ? "on" : "off")); | 155 | acpi_ut_get_node_name(handle), |
156 | *state ? "on" : "off")); | ||
157 | 157 | ||
158 | return 0; | 158 | return 0; |
159 | } | 159 | } |
@@ -516,11 +516,6 @@ int acpi_power_transition(struct acpi_device *device, int state) | |||
516 | cl = &device->power.states[device->power.state].resources; | 516 | cl = &device->power.states[device->power.state].resources; |
517 | tl = &device->power.states[state].resources; | 517 | tl = &device->power.states[state].resources; |
518 | 518 | ||
519 | if (!cl->count && !tl->count) { | ||
520 | result = -ENODEV; | ||
521 | goto end; | ||
522 | } | ||
523 | |||
524 | /* TBD: Resources must be ordered. */ | 519 | /* TBD: Resources must be ordered. */ |
525 | 520 | ||
526 | /* | 521 | /* |
diff --git a/drivers/acpi/processor_core.c b/drivers/acpi/processor_core.c index 24a362f8034c..34948362f41d 100644 --- a/drivers/acpi/processor_core.c +++ b/drivers/acpi/processor_core.c | |||
@@ -59,7 +59,6 @@ | |||
59 | #include <acpi/acpi_drivers.h> | 59 | #include <acpi/acpi_drivers.h> |
60 | #include <acpi/processor.h> | 60 | #include <acpi/processor.h> |
61 | 61 | ||
62 | #define ACPI_PROCESSOR_COMPONENT 0x01000000 | ||
63 | #define ACPI_PROCESSOR_CLASS "processor" | 62 | #define ACPI_PROCESSOR_CLASS "processor" |
64 | #define ACPI_PROCESSOR_DEVICE_NAME "Processor" | 63 | #define ACPI_PROCESSOR_DEVICE_NAME "Processor" |
65 | #define ACPI_PROCESSOR_FILE_INFO "info" | 64 | #define ACPI_PROCESSOR_FILE_INFO "info" |
@@ -89,6 +88,7 @@ static int acpi_processor_handle_eject(struct acpi_processor *pr); | |||
89 | 88 | ||
90 | 89 | ||
91 | static const struct acpi_device_id processor_device_ids[] = { | 90 | static const struct acpi_device_id processor_device_ids[] = { |
91 | {ACPI_PROCESSOR_OBJECT_HID, 0}, | ||
92 | {ACPI_PROCESSOR_HID, 0}, | 92 | {ACPI_PROCESSOR_HID, 0}, |
93 | {"", 0}, | 93 | {"", 0}, |
94 | }; | 94 | }; |
@@ -409,7 +409,7 @@ static int acpi_processor_remove_fs(struct acpi_device *device) | |||
409 | /* Use the acpiid in MADT to map cpus in case of SMP */ | 409 | /* Use the acpiid in MADT to map cpus in case of SMP */ |
410 | 410 | ||
411 | #ifndef CONFIG_SMP | 411 | #ifndef CONFIG_SMP |
412 | static int get_cpu_id(acpi_handle handle, u32 acpi_id) {return -1;} | 412 | static int get_cpu_id(acpi_handle handle, int type, u32 acpi_id) { return -1; } |
413 | #else | 413 | #else |
414 | 414 | ||
415 | static struct acpi_table_madt *madt; | 415 | static struct acpi_table_madt *madt; |
@@ -428,27 +428,35 @@ static int map_lapic_id(struct acpi_subtable_header *entry, | |||
428 | } | 428 | } |
429 | 429 | ||
430 | static int map_lsapic_id(struct acpi_subtable_header *entry, | 430 | static int map_lsapic_id(struct acpi_subtable_header *entry, |
431 | u32 acpi_id, int *apic_id) | 431 | int device_declaration, u32 acpi_id, int *apic_id) |
432 | { | 432 | { |
433 | struct acpi_madt_local_sapic *lsapic = | 433 | struct acpi_madt_local_sapic *lsapic = |
434 | (struct acpi_madt_local_sapic *)entry; | 434 | (struct acpi_madt_local_sapic *)entry; |
435 | u32 tmp = (lsapic->id << 8) | lsapic->eid; | ||
436 | |||
435 | /* Only check enabled APICs*/ | 437 | /* Only check enabled APICs*/ |
436 | if (lsapic->lapic_flags & ACPI_MADT_ENABLED) { | 438 | if (!(lsapic->lapic_flags & ACPI_MADT_ENABLED)) |
437 | /* First check against id */ | 439 | return 0; |
438 | if (lsapic->processor_id == acpi_id) { | 440 | |
439 | *apic_id = (lsapic->id << 8) | lsapic->eid; | 441 | /* Device statement declaration type */ |
440 | return 1; | 442 | if (device_declaration) { |
441 | /* Check against optional uid */ | 443 | if (entry->length < 16) |
442 | } else if (entry->length >= 16 && | 444 | printk(KERN_ERR PREFIX |
443 | lsapic->uid == acpi_id) { | 445 | "Invalid LSAPIC with Device type processor (SAPIC ID %#x)\n", |
444 | *apic_id = lsapic->uid; | 446 | tmp); |
445 | return 1; | 447 | else if (lsapic->uid == acpi_id) |
446 | } | 448 | goto found; |
447 | } | 449 | /* Processor statement declaration type */ |
450 | } else if (lsapic->processor_id == acpi_id) | ||
451 | goto found; | ||
452 | |||
448 | return 0; | 453 | return 0; |
454 | found: | ||
455 | *apic_id = tmp; | ||
456 | return 1; | ||
449 | } | 457 | } |
450 | 458 | ||
451 | static int map_madt_entry(u32 acpi_id) | 459 | static int map_madt_entry(int type, u32 acpi_id) |
452 | { | 460 | { |
453 | unsigned long madt_end, entry; | 461 | unsigned long madt_end, entry; |
454 | int apic_id = -1; | 462 | int apic_id = -1; |
@@ -469,7 +477,7 @@ static int map_madt_entry(u32 acpi_id) | |||
469 | if (map_lapic_id(header, acpi_id, &apic_id)) | 477 | if (map_lapic_id(header, acpi_id, &apic_id)) |
470 | break; | 478 | break; |
471 | } else if (header->type == ACPI_MADT_TYPE_LOCAL_SAPIC) { | 479 | } else if (header->type == ACPI_MADT_TYPE_LOCAL_SAPIC) { |
472 | if (map_lsapic_id(header, acpi_id, &apic_id)) | 480 | if (map_lsapic_id(header, type, acpi_id, &apic_id)) |
473 | break; | 481 | break; |
474 | } | 482 | } |
475 | entry += header->length; | 483 | entry += header->length; |
@@ -477,7 +485,7 @@ static int map_madt_entry(u32 acpi_id) | |||
477 | return apic_id; | 485 | return apic_id; |
478 | } | 486 | } |
479 | 487 | ||
480 | static int map_mat_entry(acpi_handle handle, u32 acpi_id) | 488 | static int map_mat_entry(acpi_handle handle, int type, u32 acpi_id) |
481 | { | 489 | { |
482 | struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; | 490 | struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; |
483 | union acpi_object *obj; | 491 | union acpi_object *obj; |
@@ -500,7 +508,7 @@ static int map_mat_entry(acpi_handle handle, u32 acpi_id) | |||
500 | if (header->type == ACPI_MADT_TYPE_LOCAL_APIC) { | 508 | if (header->type == ACPI_MADT_TYPE_LOCAL_APIC) { |
501 | map_lapic_id(header, acpi_id, &apic_id); | 509 | map_lapic_id(header, acpi_id, &apic_id); |
502 | } else if (header->type == ACPI_MADT_TYPE_LOCAL_SAPIC) { | 510 | } else if (header->type == ACPI_MADT_TYPE_LOCAL_SAPIC) { |
503 | map_lsapic_id(header, acpi_id, &apic_id); | 511 | map_lsapic_id(header, type, acpi_id, &apic_id); |
504 | } | 512 | } |
505 | 513 | ||
506 | exit: | 514 | exit: |
@@ -509,14 +517,14 @@ exit: | |||
509 | return apic_id; | 517 | return apic_id; |
510 | } | 518 | } |
511 | 519 | ||
512 | static int get_cpu_id(acpi_handle handle, u32 acpi_id) | 520 | static int get_cpu_id(acpi_handle handle, int type, u32 acpi_id) |
513 | { | 521 | { |
514 | int i; | 522 | int i; |
515 | int apic_id = -1; | 523 | int apic_id = -1; |
516 | 524 | ||
517 | apic_id = map_mat_entry(handle, acpi_id); | 525 | apic_id = map_mat_entry(handle, type, acpi_id); |
518 | if (apic_id == -1) | 526 | if (apic_id == -1) |
519 | apic_id = map_madt_entry(acpi_id); | 527 | apic_id = map_madt_entry(type, acpi_id); |
520 | if (apic_id == -1) | 528 | if (apic_id == -1) |
521 | return apic_id; | 529 | return apic_id; |
522 | 530 | ||
@@ -532,15 +540,16 @@ static int get_cpu_id(acpi_handle handle, u32 acpi_id) | |||
532 | Driver Interface | 540 | Driver Interface |
533 | -------------------------------------------------------------------------- */ | 541 | -------------------------------------------------------------------------- */ |
534 | 542 | ||
535 | static int acpi_processor_get_info(struct acpi_processor *pr, unsigned has_uid) | 543 | static int acpi_processor_get_info(struct acpi_device *device) |
536 | { | 544 | { |
537 | acpi_status status = 0; | 545 | acpi_status status = 0; |
538 | union acpi_object object = { 0 }; | 546 | union acpi_object object = { 0 }; |
539 | struct acpi_buffer buffer = { sizeof(union acpi_object), &object }; | 547 | struct acpi_buffer buffer = { sizeof(union acpi_object), &object }; |
540 | int cpu_index; | 548 | struct acpi_processor *pr; |
549 | int cpu_index, device_declaration = 0; | ||
541 | static int cpu0_initialized; | 550 | static int cpu0_initialized; |
542 | 551 | ||
543 | 552 | pr = acpi_driver_data(device); | |
544 | if (!pr) | 553 | if (!pr) |
545 | return -EINVAL; | 554 | return -EINVAL; |
546 | 555 | ||
@@ -561,22 +570,23 @@ static int acpi_processor_get_info(struct acpi_processor *pr, unsigned has_uid) | |||
561 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | 570 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, |
562 | "No bus mastering arbitration control\n")); | 571 | "No bus mastering arbitration control\n")); |
563 | 572 | ||
564 | /* Check if it is a Device with HID and UID */ | 573 | if (!strcmp(acpi_device_hid(device), ACPI_PROCESSOR_HID)) { |
565 | if (has_uid) { | 574 | /* |
575 | * Declared with "Device" statement; match _UID. | ||
576 | * Note that we don't handle string _UIDs yet. | ||
577 | */ | ||
566 | unsigned long long value; | 578 | unsigned long long value; |
567 | status = acpi_evaluate_integer(pr->handle, METHOD_NAME__UID, | 579 | status = acpi_evaluate_integer(pr->handle, METHOD_NAME__UID, |
568 | NULL, &value); | 580 | NULL, &value); |
569 | if (ACPI_FAILURE(status)) { | 581 | if (ACPI_FAILURE(status)) { |
570 | printk(KERN_ERR PREFIX "Evaluating processor _UID\n"); | 582 | printk(KERN_ERR PREFIX |
583 | "Evaluating processor _UID [%#x]\n", status); | ||
571 | return -ENODEV; | 584 | return -ENODEV; |
572 | } | 585 | } |
586 | device_declaration = 1; | ||
573 | pr->acpi_id = value; | 587 | pr->acpi_id = value; |
574 | } else { | 588 | } else { |
575 | /* | 589 | /* Declared with "Processor" statement; match ProcessorID */ |
576 | * Evalute the processor object. Note that it is common on SMP to | ||
577 | * have the first (boot) processor with a valid PBLK address while | ||
578 | * all others have a NULL address. | ||
579 | */ | ||
580 | status = acpi_evaluate_object(pr->handle, NULL, NULL, &buffer); | 590 | status = acpi_evaluate_object(pr->handle, NULL, NULL, &buffer); |
581 | if (ACPI_FAILURE(status)) { | 591 | if (ACPI_FAILURE(status)) { |
582 | printk(KERN_ERR PREFIX "Evaluating processor object\n"); | 592 | printk(KERN_ERR PREFIX "Evaluating processor object\n"); |
@@ -584,12 +594,13 @@ static int acpi_processor_get_info(struct acpi_processor *pr, unsigned has_uid) | |||
584 | } | 594 | } |
585 | 595 | ||
586 | /* | 596 | /* |
587 | * TBD: Synch processor ID (via LAPIC/LSAPIC structures) on SMP. | 597 | * TBD: Synch processor ID (via LAPIC/LSAPIC structures) on SMP. |
588 | * >>> 'acpi_get_processor_id(acpi_id, &id)' in arch/xxx/acpi.c | 598 | * >>> 'acpi_get_processor_id(acpi_id, &id)' in |
589 | */ | 599 | * arch/xxx/acpi.c |
600 | */ | ||
590 | pr->acpi_id = object.processor.proc_id; | 601 | pr->acpi_id = object.processor.proc_id; |
591 | } | 602 | } |
592 | cpu_index = get_cpu_id(pr->handle, pr->acpi_id); | 603 | cpu_index = get_cpu_id(pr->handle, device_declaration, pr->acpi_id); |
593 | 604 | ||
594 | /* Handle UP system running SMP kernel, with no LAPIC in MADT */ | 605 | /* Handle UP system running SMP kernel, with no LAPIC in MADT */ |
595 | if (!cpu0_initialized && (cpu_index == -1) && | 606 | if (!cpu0_initialized && (cpu_index == -1) && |
@@ -661,7 +672,7 @@ static int __cpuinit acpi_processor_start(struct acpi_device *device) | |||
661 | 672 | ||
662 | pr = acpi_driver_data(device); | 673 | pr = acpi_driver_data(device); |
663 | 674 | ||
664 | result = acpi_processor_get_info(pr, device->flags.unique_id); | 675 | result = acpi_processor_get_info(device); |
665 | if (result) { | 676 | if (result) { |
666 | /* Processor is physically not present */ | 677 | /* Processor is physically not present */ |
667 | return 0; | 678 | return 0; |
@@ -761,20 +772,20 @@ static void acpi_processor_notify(acpi_handle handle, u32 event, void *data) | |||
761 | acpi_bus_generate_proc_event(device, event, | 772 | acpi_bus_generate_proc_event(device, event, |
762 | pr->performance_platform_limit); | 773 | pr->performance_platform_limit); |
763 | acpi_bus_generate_netlink_event(device->pnp.device_class, | 774 | acpi_bus_generate_netlink_event(device->pnp.device_class, |
764 | device->dev.bus_id, event, | 775 | dev_name(&device->dev), event, |
765 | pr->performance_platform_limit); | 776 | pr->performance_platform_limit); |
766 | break; | 777 | break; |
767 | case ACPI_PROCESSOR_NOTIFY_POWER: | 778 | case ACPI_PROCESSOR_NOTIFY_POWER: |
768 | acpi_processor_cst_has_changed(pr); | 779 | acpi_processor_cst_has_changed(pr); |
769 | acpi_bus_generate_proc_event(device, event, 0); | 780 | acpi_bus_generate_proc_event(device, event, 0); |
770 | acpi_bus_generate_netlink_event(device->pnp.device_class, | 781 | acpi_bus_generate_netlink_event(device->pnp.device_class, |
771 | device->dev.bus_id, event, 0); | 782 | dev_name(&device->dev), event, 0); |
772 | break; | 783 | break; |
773 | case ACPI_PROCESSOR_NOTIFY_THROTTLING: | 784 | case ACPI_PROCESSOR_NOTIFY_THROTTLING: |
774 | acpi_processor_tstate_has_changed(pr); | 785 | acpi_processor_tstate_has_changed(pr); |
775 | acpi_bus_generate_proc_event(device, event, 0); | 786 | acpi_bus_generate_proc_event(device, event, 0); |
776 | acpi_bus_generate_netlink_event(device->pnp.device_class, | 787 | acpi_bus_generate_netlink_event(device->pnp.device_class, |
777 | device->dev.bus_id, event, 0); | 788 | dev_name(&device->dev), event, 0); |
778 | default: | 789 | default: |
779 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | 790 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, |
780 | "Unsupported event [0x%x]\n", event)); | 791 | "Unsupported event [0x%x]\n", event)); |
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c index 81b40ed5379e..5f8d746a9b81 100644 --- a/drivers/acpi/processor_idle.c +++ b/drivers/acpi/processor_idle.c | |||
@@ -59,7 +59,6 @@ | |||
59 | #include <acpi/processor.h> | 59 | #include <acpi/processor.h> |
60 | #include <asm/processor.h> | 60 | #include <asm/processor.h> |
61 | 61 | ||
62 | #define ACPI_PROCESSOR_COMPONENT 0x01000000 | ||
63 | #define ACPI_PROCESSOR_CLASS "processor" | 62 | #define ACPI_PROCESSOR_CLASS "processor" |
64 | #define _COMPONENT ACPI_PROCESSOR_COMPONENT | 63 | #define _COMPONENT ACPI_PROCESSOR_COMPONENT |
65 | ACPI_MODULE_NAME("processor_idle"); | 64 | ACPI_MODULE_NAME("processor_idle"); |
diff --git a/drivers/acpi/processor_perflib.c b/drivers/acpi/processor_perflib.c index dbcf260ea93f..0d7b772bef50 100644 --- a/drivers/acpi/processor_perflib.c +++ b/drivers/acpi/processor_perflib.c | |||
@@ -44,9 +44,9 @@ | |||
44 | #endif | 44 | #endif |
45 | 45 | ||
46 | #include <acpi/acpi_bus.h> | 46 | #include <acpi/acpi_bus.h> |
47 | #include <acpi/acpi_drivers.h> | ||
47 | #include <acpi/processor.h> | 48 | #include <acpi/processor.h> |
48 | 49 | ||
49 | #define ACPI_PROCESSOR_COMPONENT 0x01000000 | ||
50 | #define ACPI_PROCESSOR_CLASS "processor" | 50 | #define ACPI_PROCESSOR_CLASS "processor" |
51 | #define ACPI_PROCESSOR_FILE_PERFORMANCE "performance" | 51 | #define ACPI_PROCESSOR_FILE_PERFORMANCE "performance" |
52 | #define _COMPONENT ACPI_PROCESSOR_COMPONENT | 52 | #define _COMPONENT ACPI_PROCESSOR_COMPONENT |
diff --git a/drivers/acpi/processor_thermal.c b/drivers/acpi/processor_thermal.c index ef34b18f95ca..b1eb376fae45 100644 --- a/drivers/acpi/processor_thermal.c +++ b/drivers/acpi/processor_thermal.c | |||
@@ -40,7 +40,6 @@ | |||
40 | #include <acpi/processor.h> | 40 | #include <acpi/processor.h> |
41 | #include <acpi/acpi_drivers.h> | 41 | #include <acpi/acpi_drivers.h> |
42 | 42 | ||
43 | #define ACPI_PROCESSOR_COMPONENT 0x01000000 | ||
44 | #define ACPI_PROCESSOR_CLASS "processor" | 43 | #define ACPI_PROCESSOR_CLASS "processor" |
45 | #define _COMPONENT ACPI_PROCESSOR_COMPONENT | 44 | #define _COMPONENT ACPI_PROCESSOR_COMPONENT |
46 | ACPI_MODULE_NAME("processor_thermal"); | 45 | ACPI_MODULE_NAME("processor_thermal"); |
diff --git a/drivers/acpi/processor_throttling.c b/drivers/acpi/processor_throttling.c index 3da2df93d924..a0c38c94a8a0 100644 --- a/drivers/acpi/processor_throttling.c +++ b/drivers/acpi/processor_throttling.c | |||
@@ -38,9 +38,9 @@ | |||
38 | #include <asm/uaccess.h> | 38 | #include <asm/uaccess.h> |
39 | 39 | ||
40 | #include <acpi/acpi_bus.h> | 40 | #include <acpi/acpi_bus.h> |
41 | #include <acpi/acpi_drivers.h> | ||
41 | #include <acpi/processor.h> | 42 | #include <acpi/processor.h> |
42 | 43 | ||
43 | #define ACPI_PROCESSOR_COMPONENT 0x01000000 | ||
44 | #define ACPI_PROCESSOR_CLASS "processor" | 44 | #define ACPI_PROCESSOR_CLASS "processor" |
45 | #define _COMPONENT ACPI_PROCESSOR_COMPONENT | 45 | #define _COMPONENT ACPI_PROCESSOR_COMPONENT |
46 | ACPI_MODULE_NAME("processor_throttling"); | 46 | ACPI_MODULE_NAME("processor_throttling"); |
diff --git a/drivers/acpi/reboot.c b/drivers/acpi/reboot.c index 755baf2ca70a..a6b662c00b67 100644 --- a/drivers/acpi/reboot.c +++ b/drivers/acpi/reboot.c | |||
@@ -15,28 +15,9 @@ void acpi_reboot(void) | |||
15 | 15 | ||
16 | rr = &acpi_gbl_FADT.reset_register; | 16 | rr = &acpi_gbl_FADT.reset_register; |
17 | 17 | ||
18 | /* | 18 | /* Is the reset register supported? */ |
19 | * Is the ACPI reset register supported? | 19 | if (!(acpi_gbl_FADT.flags & ACPI_FADT_RESET_REGISTER) || |
20 | * | 20 | rr->bit_width != 8 || rr->bit_offset != 0) |
21 | * According to ACPI 3.0, FADT.flags.RESET_REG_SUP indicates | ||
22 | * whether the ACPI reset mechanism is supported. | ||
23 | * | ||
24 | * However, some boxes have this bit clear, yet a valid | ||
25 | * ACPI_RESET_REG & RESET_VALUE, and ACPI reboot is the only | ||
26 | * mechanism that works for them after S3. | ||
27 | * | ||
28 | * This suggests that other operating systems may not be checking | ||
29 | * the RESET_REG_SUP bit, and are using other means to decide | ||
30 | * whether to use the ACPI reboot mechanism or not. | ||
31 | * | ||
32 | * So when acpi reboot is requested, | ||
33 | * only the reset_register is checked. If the following | ||
34 | * conditions are met, it indicates that the reset register is supported. | ||
35 | * a. reset_register is not zero | ||
36 | * b. the access width is eight | ||
37 | * c. the bit_offset is zero | ||
38 | */ | ||
39 | if (!(rr->address) || rr->bit_width != 8 || rr->bit_offset != 0) | ||
40 | return; | 21 | return; |
41 | 22 | ||
42 | reset_value = acpi_gbl_FADT.reset_value; | 23 | reset_value = acpi_gbl_FADT.reset_value; |
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index a9dda8e0f9f9..39b7233c3485 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c | |||
@@ -109,8 +109,7 @@ static int acpi_bus_hot_remove_device(void *context) | |||
109 | return 0; | 109 | return 0; |
110 | 110 | ||
111 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | 111 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, |
112 | "Hot-removing device %s...\n", device->dev.bus_id)); | 112 | "Hot-removing device %s...\n", dev_name(&device->dev))); |
113 | |||
114 | 113 | ||
115 | if (acpi_bus_trim(device, 1)) { | 114 | if (acpi_bus_trim(device, 1)) { |
116 | printk(KERN_ERR PREFIX | 115 | printk(KERN_ERR PREFIX |
@@ -460,7 +459,7 @@ static int acpi_device_register(struct acpi_device *device, | |||
460 | acpi_device_bus_id->instance_no = 0; | 459 | acpi_device_bus_id->instance_no = 0; |
461 | list_add_tail(&acpi_device_bus_id->node, &acpi_bus_id_list); | 460 | list_add_tail(&acpi_device_bus_id->node, &acpi_bus_id_list); |
462 | } | 461 | } |
463 | sprintf(device->dev.bus_id, "%s:%02x", acpi_device_bus_id->bus_id, acpi_device_bus_id->instance_no); | 462 | dev_set_name(&device->dev, "%s:%02x", acpi_device_bus_id->bus_id, acpi_device_bus_id->instance_no); |
464 | 463 | ||
465 | if (device->parent) { | 464 | if (device->parent) { |
466 | list_add_tail(&device->node, &device->parent->children); | 465 | list_add_tail(&device->node, &device->parent->children); |
@@ -484,7 +483,8 @@ static int acpi_device_register(struct acpi_device *device, | |||
484 | 483 | ||
485 | result = acpi_device_setup_files(device); | 484 | result = acpi_device_setup_files(device); |
486 | if(result) | 485 | if(result) |
487 | printk(KERN_ERR PREFIX "Error creating sysfs interface for device %s\n", device->dev.bus_id); | 486 | printk(KERN_ERR PREFIX "Error creating sysfs interface for device %s\n", |
487 | dev_name(&device->dev)); | ||
488 | 488 | ||
489 | device->removal_type = ACPI_BUS_REMOVAL_NORMAL; | 489 | device->removal_type = ACPI_BUS_REMOVAL_NORMAL; |
490 | return 0; | 490 | return 0; |
@@ -751,16 +751,6 @@ static int acpi_bus_get_wakeup_device_flags(struct acpi_device *device) | |||
751 | if (!acpi_match_device_ids(device, button_device_ids)) | 751 | if (!acpi_match_device_ids(device, button_device_ids)) |
752 | device->wakeup.flags.run_wake = 1; | 752 | device->wakeup.flags.run_wake = 1; |
753 | 753 | ||
754 | /* | ||
755 | * Don't set Power button GPE as run_wake | ||
756 | * if Fixed Power button is used | ||
757 | */ | ||
758 | if (!strcmp(device->pnp.hardware_id, "PNP0C0C") && | ||
759 | !(acpi_gbl_FADT.flags & ACPI_FADT_POWER_BUTTON)) { | ||
760 | device->wakeup.flags.run_wake = 0; | ||
761 | device->wakeup.flags.valid = 0; | ||
762 | } | ||
763 | |||
764 | end: | 754 | end: |
765 | if (ACPI_FAILURE(status)) | 755 | if (ACPI_FAILURE(status)) |
766 | device->flags.wake_capable = 0; | 756 | device->flags.wake_capable = 0; |
@@ -919,36 +909,6 @@ static void acpi_device_get_busid(struct acpi_device *device, | |||
919 | } | 909 | } |
920 | } | 910 | } |
921 | 911 | ||
922 | static int | ||
923 | acpi_video_bus_match(struct acpi_device *device) | ||
924 | { | ||
925 | acpi_handle h_dummy; | ||
926 | |||
927 | if (!device) | ||
928 | return -EINVAL; | ||
929 | |||
930 | /* Since there is no HID, CID for ACPI Video drivers, we have | ||
931 | * to check well known required nodes for each feature we support. | ||
932 | */ | ||
933 | |||
934 | /* Does this device able to support video switching ? */ | ||
935 | if (ACPI_SUCCESS(acpi_get_handle(device->handle, "_DOD", &h_dummy)) && | ||
936 | ACPI_SUCCESS(acpi_get_handle(device->handle, "_DOS", &h_dummy))) | ||
937 | return 0; | ||
938 | |||
939 | /* Does this device able to retrieve a video ROM ? */ | ||
940 | if (ACPI_SUCCESS(acpi_get_handle(device->handle, "_ROM", &h_dummy))) | ||
941 | return 0; | ||
942 | |||
943 | /* Does this device able to configure which video head to be POSTed ? */ | ||
944 | if (ACPI_SUCCESS(acpi_get_handle(device->handle, "_VPO", &h_dummy)) && | ||
945 | ACPI_SUCCESS(acpi_get_handle(device->handle, "_GPD", &h_dummy)) && | ||
946 | ACPI_SUCCESS(acpi_get_handle(device->handle, "_SPD", &h_dummy))) | ||
947 | return 0; | ||
948 | |||
949 | return -ENODEV; | ||
950 | } | ||
951 | |||
952 | /* | 912 | /* |
953 | * acpi_bay_match - see if a device is an ejectable driver bay | 913 | * acpi_bay_match - see if a device is an ejectable driver bay |
954 | * | 914 | * |
@@ -1031,7 +991,7 @@ static void acpi_device_set_id(struct acpi_device *device, | |||
1031 | will get autoloaded and the device might still match | 991 | will get autoloaded and the device might still match |
1032 | against another driver. | 992 | against another driver. |
1033 | */ | 993 | */ |
1034 | if (ACPI_SUCCESS(acpi_video_bus_match(device))) | 994 | if (acpi_is_video_device(device)) |
1035 | cid_add = ACPI_VIDEO_HID; | 995 | cid_add = ACPI_VIDEO_HID; |
1036 | else if (ACPI_SUCCESS(acpi_bay_match(device))) | 996 | else if (ACPI_SUCCESS(acpi_bay_match(device))) |
1037 | cid_add = ACPI_BAY_HID; | 997 | cid_add = ACPI_BAY_HID; |
@@ -1043,7 +1003,7 @@ static void acpi_device_set_id(struct acpi_device *device, | |||
1043 | hid = ACPI_POWER_HID; | 1003 | hid = ACPI_POWER_HID; |
1044 | break; | 1004 | break; |
1045 | case ACPI_BUS_TYPE_PROCESSOR: | 1005 | case ACPI_BUS_TYPE_PROCESSOR: |
1046 | hid = ACPI_PROCESSOR_HID; | 1006 | hid = ACPI_PROCESSOR_OBJECT_HID; |
1047 | break; | 1007 | break; |
1048 | case ACPI_BUS_TYPE_SYSTEM: | 1008 | case ACPI_BUS_TYPE_SYSTEM: |
1049 | hid = ACPI_SYSTEM_HID; | 1009 | hid = ACPI_SYSTEM_HID; |
diff --git a/drivers/acpi/sleep/main.c b/drivers/acpi/sleep/main.c index 80c0868d0480..28a691cc625e 100644 --- a/drivers/acpi/sleep/main.c +++ b/drivers/acpi/sleep/main.c | |||
@@ -90,6 +90,18 @@ void __init acpi_old_suspend_ordering(void) | |||
90 | old_suspend_ordering = true; | 90 | old_suspend_ordering = true; |
91 | } | 91 | } |
92 | 92 | ||
93 | /* | ||
94 | * According to the ACPI specification the BIOS should make sure that ACPI is | ||
95 | * enabled and SCI_EN bit is set on wake-up from S1 - S3 sleep states. Still, | ||
96 | * some BIOSes don't do that and therefore we use acpi_enable() to enable ACPI | ||
97 | * on such systems during resume. Unfortunately that doesn't help in | ||
98 | * particularly pathological cases in which SCI_EN has to be set directly on | ||
99 | * resume, although the specification states very clearly that this flag is | ||
100 | * owned by the hardware. The set_sci_en_on_resume variable will be set in such | ||
101 | * cases. | ||
102 | */ | ||
103 | static bool set_sci_en_on_resume; | ||
104 | |||
93 | /** | 105 | /** |
94 | * acpi_pm_disable_gpes - Disable the GPEs. | 106 | * acpi_pm_disable_gpes - Disable the GPEs. |
95 | */ | 107 | */ |
@@ -235,7 +247,11 @@ static int acpi_suspend_enter(suspend_state_t pm_state) | |||
235 | } | 247 | } |
236 | 248 | ||
237 | /* If ACPI is not enabled by the BIOS, we need to enable it here. */ | 249 | /* If ACPI is not enabled by the BIOS, we need to enable it here. */ |
238 | acpi_enable(); | 250 | if (set_sci_en_on_resume) |
251 | acpi_set_register(ACPI_BITREG_SCI_ENABLE, 1); | ||
252 | else | ||
253 | acpi_enable(); | ||
254 | |||
239 | /* Reprogram control registers and execute _BFS */ | 255 | /* Reprogram control registers and execute _BFS */ |
240 | acpi_leave_sleep_state_prep(acpi_state); | 256 | acpi_leave_sleep_state_prep(acpi_state); |
241 | 257 | ||
@@ -323,6 +339,12 @@ static int __init init_old_suspend_ordering(const struct dmi_system_id *d) | |||
323 | return 0; | 339 | return 0; |
324 | } | 340 | } |
325 | 341 | ||
342 | static int __init init_set_sci_en_on_resume(const struct dmi_system_id *d) | ||
343 | { | ||
344 | set_sci_en_on_resume = true; | ||
345 | return 0; | ||
346 | } | ||
347 | |||
326 | static struct dmi_system_id __initdata acpisleep_dmi_table[] = { | 348 | static struct dmi_system_id __initdata acpisleep_dmi_table[] = { |
327 | { | 349 | { |
328 | .callback = init_old_suspend_ordering, | 350 | .callback = init_old_suspend_ordering, |
@@ -340,6 +362,22 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = { | |||
340 | DMI_MATCH(DMI_PRODUCT_NAME, "HP xw4600 Workstation"), | 362 | DMI_MATCH(DMI_PRODUCT_NAME, "HP xw4600 Workstation"), |
341 | }, | 363 | }, |
342 | }, | 364 | }, |
365 | { | ||
366 | .callback = init_set_sci_en_on_resume, | ||
367 | .ident = "Apple MacBook 1,1", | ||
368 | .matches = { | ||
369 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Computer, Inc."), | ||
370 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBook1,1"), | ||
371 | }, | ||
372 | }, | ||
373 | { | ||
374 | .callback = init_set_sci_en_on_resume, | ||
375 | .ident = "Apple MacMini 1,1", | ||
376 | .matches = { | ||
377 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Computer, Inc."), | ||
378 | DMI_MATCH(DMI_PRODUCT_NAME, "Macmini1,1"), | ||
379 | }, | ||
380 | }, | ||
343 | {}, | 381 | {}, |
344 | }; | 382 | }; |
345 | #endif /* CONFIG_SUSPEND */ | 383 | #endif /* CONFIG_SUSPEND */ |
diff --git a/drivers/acpi/sleep/proc.c b/drivers/acpi/sleep/proc.c index 631ee2ee2ca0..4dbc2271acf5 100644 --- a/drivers/acpi/sleep/proc.c +++ b/drivers/acpi/sleep/proc.c | |||
@@ -367,7 +367,7 @@ acpi_system_wakeup_device_seq_show(struct seq_file *seq, void *offset) | |||
367 | if (ldev) | 367 | if (ldev) |
368 | seq_printf(seq, "%s:%s", | 368 | seq_printf(seq, "%s:%s", |
369 | ldev->bus ? ldev->bus->name : "no-bus", | 369 | ldev->bus ? ldev->bus->name : "no-bus", |
370 | ldev->bus_id); | 370 | dev_name(ldev)); |
371 | seq_printf(seq, "\n"); | 371 | seq_printf(seq, "\n"); |
372 | put_device(ldev); | 372 | put_device(ldev); |
373 | 373 | ||
diff --git a/drivers/acpi/sleep/wakeup.c b/drivers/acpi/sleep/wakeup.c index 38655eb132dc..dea4c23df764 100644 --- a/drivers/acpi/sleep/wakeup.c +++ b/drivers/acpi/sleep/wakeup.c | |||
@@ -88,7 +88,7 @@ void acpi_enable_wakeup_device(u8 sleep_state) | |||
88 | spin_unlock(&acpi_device_lock); | 88 | spin_unlock(&acpi_device_lock); |
89 | if (!dev->wakeup.flags.run_wake) | 89 | if (!dev->wakeup.flags.run_wake) |
90 | acpi_enable_gpe(dev->wakeup.gpe_device, | 90 | acpi_enable_gpe(dev->wakeup.gpe_device, |
91 | dev->wakeup.gpe_number, ACPI_ISR); | 91 | dev->wakeup.gpe_number); |
92 | spin_lock(&acpi_device_lock); | 92 | spin_lock(&acpi_device_lock); |
93 | } | 93 | } |
94 | spin_unlock(&acpi_device_lock); | 94 | spin_unlock(&acpi_device_lock); |
@@ -122,7 +122,7 @@ void acpi_disable_wakeup_device(u8 sleep_state) | |||
122 | ACPI_GPE_TYPE_WAKE_RUN); | 122 | ACPI_GPE_TYPE_WAKE_RUN); |
123 | /* Re-enable it, since set_gpe_type will disable it */ | 123 | /* Re-enable it, since set_gpe_type will disable it */ |
124 | acpi_enable_gpe(dev->wakeup.gpe_device, | 124 | acpi_enable_gpe(dev->wakeup.gpe_device, |
125 | dev->wakeup.gpe_number, ACPI_NOT_ISR); | 125 | dev->wakeup.gpe_number); |
126 | spin_lock(&acpi_device_lock); | 126 | spin_lock(&acpi_device_lock); |
127 | } | 127 | } |
128 | continue; | 128 | continue; |
@@ -133,7 +133,7 @@ void acpi_disable_wakeup_device(u8 sleep_state) | |||
133 | /* Never disable run-wake GPE */ | 133 | /* Never disable run-wake GPE */ |
134 | if (!dev->wakeup.flags.run_wake) { | 134 | if (!dev->wakeup.flags.run_wake) { |
135 | acpi_disable_gpe(dev->wakeup.gpe_device, | 135 | acpi_disable_gpe(dev->wakeup.gpe_device, |
136 | dev->wakeup.gpe_number, ACPI_NOT_ISR); | 136 | dev->wakeup.gpe_number); |
137 | acpi_clear_gpe(dev->wakeup.gpe_device, | 137 | acpi_clear_gpe(dev->wakeup.gpe_device, |
138 | dev->wakeup.gpe_number, ACPI_NOT_ISR); | 138 | dev->wakeup.gpe_number, ACPI_NOT_ISR); |
139 | } | 139 | } |
@@ -162,7 +162,7 @@ static int __init acpi_wakeup_device_init(void) | |||
162 | dev->wakeup.gpe_number, | 162 | dev->wakeup.gpe_number, |
163 | ACPI_GPE_TYPE_WAKE_RUN); | 163 | ACPI_GPE_TYPE_WAKE_RUN); |
164 | acpi_enable_gpe(dev->wakeup.gpe_device, | 164 | acpi_enable_gpe(dev->wakeup.gpe_device, |
165 | dev->wakeup.gpe_number, ACPI_NOT_ISR); | 165 | dev->wakeup.gpe_number); |
166 | dev->wakeup.state.enabled = 1; | 166 | dev->wakeup.state.enabled = 1; |
167 | spin_lock(&acpi_device_lock); | 167 | spin_lock(&acpi_device_lock); |
168 | } | 168 | } |
diff --git a/drivers/acpi/system.c b/drivers/acpi/system.c index 1d74171b7940..6e4107f82403 100644 --- a/drivers/acpi/system.c +++ b/drivers/acpi/system.c | |||
@@ -78,9 +78,15 @@ static ssize_t acpi_table_show(struct kobject *kobj, | |||
78 | container_of(bin_attr, struct acpi_table_attr, attr); | 78 | container_of(bin_attr, struct acpi_table_attr, attr); |
79 | struct acpi_table_header *table_header = NULL; | 79 | struct acpi_table_header *table_header = NULL; |
80 | acpi_status status; | 80 | acpi_status status; |
81 | char name[ACPI_NAME_SIZE]; | ||
82 | |||
83 | if (strncmp(table_attr->name, "NULL", 4)) | ||
84 | memcpy(name, table_attr->name, ACPI_NAME_SIZE); | ||
85 | else | ||
86 | memcpy(name, "\0\0\0\0", 4); | ||
81 | 87 | ||
82 | status = | 88 | status = |
83 | acpi_get_table(table_attr->name, table_attr->instance, | 89 | acpi_get_table(name, table_attr->instance, |
84 | &table_header); | 90 | &table_header); |
85 | if (ACPI_FAILURE(status)) | 91 | if (ACPI_FAILURE(status)) |
86 | return -ENODEV; | 92 | return -ENODEV; |
@@ -95,21 +101,24 @@ static void acpi_table_attr_init(struct acpi_table_attr *table_attr, | |||
95 | struct acpi_table_header *header = NULL; | 101 | struct acpi_table_header *header = NULL; |
96 | struct acpi_table_attr *attr = NULL; | 102 | struct acpi_table_attr *attr = NULL; |
97 | 103 | ||
98 | memcpy(table_attr->name, table_header->signature, ACPI_NAME_SIZE); | 104 | if (table_header->signature[0] != '\0') |
105 | memcpy(table_attr->name, table_header->signature, | ||
106 | ACPI_NAME_SIZE); | ||
107 | else | ||
108 | memcpy(table_attr->name, "NULL", 4); | ||
99 | 109 | ||
100 | list_for_each_entry(attr, &acpi_table_attr_list, node) { | 110 | list_for_each_entry(attr, &acpi_table_attr_list, node) { |
101 | if (!memcmp(table_header->signature, attr->name, | 111 | if (!memcmp(table_attr->name, attr->name, ACPI_NAME_SIZE)) |
102 | ACPI_NAME_SIZE)) | ||
103 | if (table_attr->instance < attr->instance) | 112 | if (table_attr->instance < attr->instance) |
104 | table_attr->instance = attr->instance; | 113 | table_attr->instance = attr->instance; |
105 | } | 114 | } |
106 | table_attr->instance++; | 115 | table_attr->instance++; |
107 | 116 | ||
108 | if (table_attr->instance > 1 || (table_attr->instance == 1 && | 117 | if (table_attr->instance > 1 || (table_attr->instance == 1 && |
109 | !acpi_get_table(table_header-> | 118 | !acpi_get_table |
110 | signature, 2, | 119 | (table_header->signature, 2, &header))) |
111 | &header))) | 120 | sprintf(table_attr->name + ACPI_NAME_SIZE, "%d", |
112 | sprintf(table_attr->name + 4, "%d", table_attr->instance); | 121 | table_attr->instance); |
113 | 122 | ||
114 | table_attr->attr.size = 0; | 123 | table_attr->attr.size = 0; |
115 | table_attr->attr.read = acpi_table_show; | 124 | table_attr->attr.read = acpi_table_show; |
@@ -167,7 +176,6 @@ static int acpi_system_sysfs_init(void) | |||
167 | #define COUNT_ERROR 2 /* other */ | 176 | #define COUNT_ERROR 2 /* other */ |
168 | #define NUM_COUNTERS_EXTRA 3 | 177 | #define NUM_COUNTERS_EXTRA 3 |
169 | 178 | ||
170 | #define ACPI_EVENT_VALID 0x01 | ||
171 | struct event_counter { | 179 | struct event_counter { |
172 | u32 count; | 180 | u32 count; |
173 | u32 flags; | 181 | u32 flags; |
@@ -312,12 +320,6 @@ static int get_status(u32 index, acpi_event_status *status, acpi_handle *handle) | |||
312 | } else if (index < (num_gpes + ACPI_NUM_FIXED_EVENTS)) | 320 | } else if (index < (num_gpes + ACPI_NUM_FIXED_EVENTS)) |
313 | result = acpi_get_event_status(index - num_gpes, status); | 321 | result = acpi_get_event_status(index - num_gpes, status); |
314 | 322 | ||
315 | /* | ||
316 | * sleep/power button GPE/Fixed Event is enabled after acpi_system_init, | ||
317 | * check the status at runtime and mark it as valid once it's enabled | ||
318 | */ | ||
319 | if (!result && (*status & ACPI_EVENT_FLAG_ENABLED)) | ||
320 | all_counters[index].flags |= ACPI_EVENT_VALID; | ||
321 | end: | 323 | end: |
322 | return result; | 324 | return result; |
323 | } | 325 | } |
@@ -346,12 +348,14 @@ static ssize_t counter_show(struct kobject *kobj, | |||
346 | if (result) | 348 | if (result) |
347 | goto end; | 349 | goto end; |
348 | 350 | ||
349 | if (!(all_counters[index].flags & ACPI_EVENT_VALID)) | 351 | if (!(status & ACPI_EVENT_FLAG_HANDLE)) |
350 | size += sprintf(buf + size, " invalid"); | 352 | size += sprintf(buf + size, " invalid"); |
351 | else if (status & ACPI_EVENT_FLAG_ENABLED) | 353 | else if (status & ACPI_EVENT_FLAG_ENABLED) |
352 | size += sprintf(buf + size, " enable"); | 354 | size += sprintf(buf + size, " enabled"); |
355 | else if (status & ACPI_EVENT_FLAG_WAKE_ENABLED) | ||
356 | size += sprintf(buf + size, " wake_enabled"); | ||
353 | else | 357 | else |
354 | size += sprintf(buf + size, " disable"); | 358 | size += sprintf(buf + size, " disabled"); |
355 | 359 | ||
356 | end: | 360 | end: |
357 | size += sprintf(buf + size, "\n"); | 361 | size += sprintf(buf + size, "\n"); |
@@ -385,7 +389,7 @@ static ssize_t counter_set(struct kobject *kobj, | |||
385 | if (result) | 389 | if (result) |
386 | goto end; | 390 | goto end; |
387 | 391 | ||
388 | if (!(all_counters[index].flags & ACPI_EVENT_VALID)) { | 392 | if (!(status & ACPI_EVENT_FLAG_HANDLE)) { |
389 | printk(KERN_WARNING PREFIX | 393 | printk(KERN_WARNING PREFIX |
390 | "Can not change Invalid GPE/Fixed Event status\n"); | 394 | "Can not change Invalid GPE/Fixed Event status\n"); |
391 | return -EINVAL; | 395 | return -EINVAL; |
@@ -394,10 +398,10 @@ static ssize_t counter_set(struct kobject *kobj, | |||
394 | if (index < num_gpes) { | 398 | if (index < num_gpes) { |
395 | if (!strcmp(buf, "disable\n") && | 399 | if (!strcmp(buf, "disable\n") && |
396 | (status & ACPI_EVENT_FLAG_ENABLED)) | 400 | (status & ACPI_EVENT_FLAG_ENABLED)) |
397 | result = acpi_disable_gpe(handle, index, ACPI_NOT_ISR); | 401 | result = acpi_disable_gpe(handle, index); |
398 | else if (!strcmp(buf, "enable\n") && | 402 | else if (!strcmp(buf, "enable\n") && |
399 | !(status & ACPI_EVENT_FLAG_ENABLED)) | 403 | !(status & ACPI_EVENT_FLAG_ENABLED)) |
400 | result = acpi_enable_gpe(handle, index, ACPI_NOT_ISR); | 404 | result = acpi_enable_gpe(handle, index); |
401 | else if (!strcmp(buf, "clear\n") && | 405 | else if (!strcmp(buf, "clear\n") && |
402 | (status & ACPI_EVENT_FLAG_SET)) | 406 | (status & ACPI_EVENT_FLAG_SET)) |
403 | result = acpi_clear_gpe(handle, index, ACPI_NOT_ISR); | 407 | result = acpi_clear_gpe(handle, index, ACPI_NOT_ISR); |
diff --git a/drivers/acpi/tables/tbfadt.c b/drivers/acpi/tables/tbfadt.c index 2c7885e7ffba..2817158fb6a1 100644 --- a/drivers/acpi/tables/tbfadt.c +++ b/drivers/acpi/tables/tbfadt.c | |||
@@ -304,7 +304,7 @@ static void acpi_tb_convert_fadt(void) | |||
304 | * The ACPI 1.0 reserved fields that will be zeroed are the bytes located at | 304 | * The ACPI 1.0 reserved fields that will be zeroed are the bytes located at |
305 | * offset 45, 55, 95, and the word located at offset 109, 110. | 305 | * offset 45, 55, 95, and the word located at offset 109, 110. |
306 | */ | 306 | */ |
307 | if (acpi_gbl_FADT.header.revision < 3) { | 307 | if (acpi_gbl_FADT.header.revision < FADT2_REVISION_ID) { |
308 | acpi_gbl_FADT.preferred_profile = 0; | 308 | acpi_gbl_FADT.preferred_profile = 0; |
309 | acpi_gbl_FADT.pstate_control = 0; | 309 | acpi_gbl_FADT.pstate_control = 0; |
310 | acpi_gbl_FADT.cst_control = 0; | 310 | acpi_gbl_FADT.cst_control = 0; |
diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c index ad6cae938f0b..073ff09218a9 100644 --- a/drivers/acpi/thermal.c +++ b/drivers/acpi/thermal.c | |||
@@ -47,7 +47,6 @@ | |||
47 | #include <acpi/acpi_bus.h> | 47 | #include <acpi/acpi_bus.h> |
48 | #include <acpi/acpi_drivers.h> | 48 | #include <acpi/acpi_drivers.h> |
49 | 49 | ||
50 | #define ACPI_THERMAL_COMPONENT 0x04000000 | ||
51 | #define ACPI_THERMAL_CLASS "thermal_zone" | 50 | #define ACPI_THERMAL_CLASS "thermal_zone" |
52 | #define ACPI_THERMAL_DEVICE_NAME "Thermal Zone" | 51 | #define ACPI_THERMAL_DEVICE_NAME "Thermal Zone" |
53 | #define ACPI_THERMAL_FILE_STATE "state" | 52 | #define ACPI_THERMAL_FILE_STATE "state" |
@@ -576,7 +575,7 @@ static int acpi_thermal_critical(struct acpi_thermal *tz) | |||
576 | acpi_bus_generate_proc_event(tz->device, ACPI_THERMAL_NOTIFY_CRITICAL, | 575 | acpi_bus_generate_proc_event(tz->device, ACPI_THERMAL_NOTIFY_CRITICAL, |
577 | tz->trips.critical.flags.enabled); | 576 | tz->trips.critical.flags.enabled); |
578 | acpi_bus_generate_netlink_event(tz->device->pnp.device_class, | 577 | acpi_bus_generate_netlink_event(tz->device->pnp.device_class, |
579 | tz->device->dev.bus_id, | 578 | dev_name(&tz->device->dev), |
580 | ACPI_THERMAL_NOTIFY_CRITICAL, | 579 | ACPI_THERMAL_NOTIFY_CRITICAL, |
581 | tz->trips.critical.flags.enabled); | 580 | tz->trips.critical.flags.enabled); |
582 | 581 | ||
@@ -605,7 +604,7 @@ static int acpi_thermal_hot(struct acpi_thermal *tz) | |||
605 | acpi_bus_generate_proc_event(tz->device, ACPI_THERMAL_NOTIFY_HOT, | 604 | acpi_bus_generate_proc_event(tz->device, ACPI_THERMAL_NOTIFY_HOT, |
606 | tz->trips.hot.flags.enabled); | 605 | tz->trips.hot.flags.enabled); |
607 | acpi_bus_generate_netlink_event(tz->device->pnp.device_class, | 606 | acpi_bus_generate_netlink_event(tz->device->pnp.device_class, |
608 | tz->device->dev.bus_id, | 607 | dev_name(&tz->device->dev), |
609 | ACPI_THERMAL_NOTIFY_HOT, | 608 | ACPI_THERMAL_NOTIFY_HOT, |
610 | tz->trips.hot.flags.enabled); | 609 | tz->trips.hot.flags.enabled); |
611 | 610 | ||
@@ -1592,14 +1591,14 @@ static void acpi_thermal_notify(acpi_handle handle, u32 event, void *data) | |||
1592 | acpi_thermal_check(tz); | 1591 | acpi_thermal_check(tz); |
1593 | acpi_bus_generate_proc_event(device, event, 0); | 1592 | acpi_bus_generate_proc_event(device, event, 0); |
1594 | acpi_bus_generate_netlink_event(device->pnp.device_class, | 1593 | acpi_bus_generate_netlink_event(device->pnp.device_class, |
1595 | device->dev.bus_id, event, 0); | 1594 | dev_name(&device->dev), event, 0); |
1596 | break; | 1595 | break; |
1597 | case ACPI_THERMAL_NOTIFY_DEVICES: | 1596 | case ACPI_THERMAL_NOTIFY_DEVICES: |
1598 | acpi_thermal_trips_update(tz, ACPI_TRIPS_REFRESH_DEVICES); | 1597 | acpi_thermal_trips_update(tz, ACPI_TRIPS_REFRESH_DEVICES); |
1599 | acpi_thermal_check(tz); | 1598 | acpi_thermal_check(tz); |
1600 | acpi_bus_generate_proc_event(device, event, 0); | 1599 | acpi_bus_generate_proc_event(device, event, 0); |
1601 | acpi_bus_generate_netlink_event(device->pnp.device_class, | 1600 | acpi_bus_generate_netlink_event(device->pnp.device_class, |
1602 | device->dev.bus_id, event, 0); | 1601 | dev_name(&device->dev), event, 0); |
1603 | break; | 1602 | break; |
1604 | default: | 1603 | default: |
1605 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | 1604 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, |
diff --git a/drivers/acpi/toshiba_acpi.c b/drivers/acpi/toshiba_acpi.c index 66aac06f2ac5..25f531d892de 100644 --- a/drivers/acpi/toshiba_acpi.c +++ b/drivers/acpi/toshiba_acpi.c | |||
@@ -848,8 +848,6 @@ static int __init toshiba_acpi_init(void) | |||
848 | ret = input_register_polled_device(toshiba_acpi.poll_dev); | 848 | ret = input_register_polled_device(toshiba_acpi.poll_dev); |
849 | if (ret) { | 849 | if (ret) { |
850 | printk(MY_ERR "unable to register kill-switch input device\n"); | 850 | printk(MY_ERR "unable to register kill-switch input device\n"); |
851 | rfkill_free(toshiba_acpi.rfk_dev); | ||
852 | toshiba_acpi.rfk_dev = NULL; | ||
853 | toshiba_acpi_exit(); | 851 | toshiba_acpi_exit(); |
854 | return ret; | 852 | return ret; |
855 | } | 853 | } |
diff --git a/drivers/acpi/utils.c b/drivers/acpi/utils.c index e827be36ee8d..f844941089bb 100644 --- a/drivers/acpi/utils.c +++ b/drivers/acpi/utils.c | |||
@@ -259,34 +259,26 @@ acpi_evaluate_integer(acpi_handle handle, | |||
259 | struct acpi_object_list *arguments, unsigned long long *data) | 259 | struct acpi_object_list *arguments, unsigned long long *data) |
260 | { | 260 | { |
261 | acpi_status status = AE_OK; | 261 | acpi_status status = AE_OK; |
262 | union acpi_object *element; | 262 | union acpi_object element; |
263 | struct acpi_buffer buffer = { 0, NULL }; | 263 | struct acpi_buffer buffer = { 0, NULL }; |
264 | 264 | ||
265 | |||
266 | if (!data) | 265 | if (!data) |
267 | return AE_BAD_PARAMETER; | 266 | return AE_BAD_PARAMETER; |
268 | 267 | ||
269 | element = kzalloc(sizeof(union acpi_object), irqs_disabled() ? GFP_ATOMIC: GFP_KERNEL); | ||
270 | if (!element) | ||
271 | return AE_NO_MEMORY; | ||
272 | |||
273 | buffer.length = sizeof(union acpi_object); | 268 | buffer.length = sizeof(union acpi_object); |
274 | buffer.pointer = element; | 269 | buffer.pointer = &element; |
275 | status = acpi_evaluate_object(handle, pathname, arguments, &buffer); | 270 | status = acpi_evaluate_object(handle, pathname, arguments, &buffer); |
276 | if (ACPI_FAILURE(status)) { | 271 | if (ACPI_FAILURE(status)) { |
277 | acpi_util_eval_error(handle, pathname, status); | 272 | acpi_util_eval_error(handle, pathname, status); |
278 | kfree(element); | ||
279 | return status; | 273 | return status; |
280 | } | 274 | } |
281 | 275 | ||
282 | if (element->type != ACPI_TYPE_INTEGER) { | 276 | if (element.type != ACPI_TYPE_INTEGER) { |
283 | acpi_util_eval_error(handle, pathname, AE_BAD_DATA); | 277 | acpi_util_eval_error(handle, pathname, AE_BAD_DATA); |
284 | kfree(element); | ||
285 | return AE_BAD_DATA; | 278 | return AE_BAD_DATA; |
286 | } | 279 | } |
287 | 280 | ||
288 | *data = element->integer.value; | 281 | *data = element.integer.value; |
289 | kfree(element); | ||
290 | 282 | ||
291 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Return value [%llu]\n", *data)); | 283 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Return value [%llu]\n", *data)); |
292 | 284 | ||
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c index a29b0ccac65a..baa441929720 100644 --- a/drivers/acpi/video.c +++ b/drivers/acpi/video.c | |||
@@ -41,7 +41,6 @@ | |||
41 | #include <acpi/acpi_bus.h> | 41 | #include <acpi/acpi_bus.h> |
42 | #include <acpi/acpi_drivers.h> | 42 | #include <acpi/acpi_drivers.h> |
43 | 43 | ||
44 | #define ACPI_VIDEO_COMPONENT 0x08000000 | ||
45 | #define ACPI_VIDEO_CLASS "video" | 44 | #define ACPI_VIDEO_CLASS "video" |
46 | #define ACPI_VIDEO_BUS_NAME "Video Bus" | 45 | #define ACPI_VIDEO_BUS_NAME "Video Bus" |
47 | #define ACPI_VIDEO_DEVICE_NAME "Video Device" | 46 | #define ACPI_VIDEO_DEVICE_NAME "Video Device" |
@@ -739,7 +738,8 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device) | |||
739 | device->cap._DSS = 1; | 738 | device->cap._DSS = 1; |
740 | } | 739 | } |
741 | 740 | ||
742 | max_level = acpi_video_init_brightness(device); | 741 | if (acpi_video_backlight_support()) |
742 | max_level = acpi_video_init_brightness(device); | ||
743 | 743 | ||
744 | if (device->cap._BCL && device->cap._BCM && max_level > 0) { | 744 | if (device->cap._BCL && device->cap._BCM && max_level > 0) { |
745 | int result; | 745 | int result; |
@@ -785,18 +785,21 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device) | |||
785 | printk(KERN_ERR PREFIX "Create sysfs link\n"); | 785 | printk(KERN_ERR PREFIX "Create sysfs link\n"); |
786 | 786 | ||
787 | } | 787 | } |
788 | if (device->cap._DCS && device->cap._DSS){ | 788 | |
789 | static int count = 0; | 789 | if (acpi_video_display_switch_support()) { |
790 | char *name; | 790 | |
791 | name = kzalloc(MAX_NAME_LEN, GFP_KERNEL); | 791 | if (device->cap._DCS && device->cap._DSS) { |
792 | if (!name) | 792 | static int count; |
793 | return; | 793 | char *name; |
794 | sprintf(name, "acpi_video%d", count++); | 794 | name = kzalloc(MAX_NAME_LEN, GFP_KERNEL); |
795 | device->output_dev = video_output_register(name, | 795 | if (!name) |
796 | NULL, device, &acpi_output_properties); | 796 | return; |
797 | kfree(name); | 797 | sprintf(name, "acpi_video%d", count++); |
798 | device->output_dev = video_output_register(name, | ||
799 | NULL, device, &acpi_output_properties); | ||
800 | kfree(name); | ||
801 | } | ||
798 | } | 802 | } |
799 | return; | ||
800 | } | 803 | } |
801 | 804 | ||
802 | /* | 805 | /* |
@@ -842,11 +845,16 @@ static void acpi_video_bus_find_cap(struct acpi_video_bus *video) | |||
842 | static int acpi_video_bus_check(struct acpi_video_bus *video) | 845 | static int acpi_video_bus_check(struct acpi_video_bus *video) |
843 | { | 846 | { |
844 | acpi_status status = -ENOENT; | 847 | acpi_status status = -ENOENT; |
845 | 848 | struct device *dev; | |
846 | 849 | ||
847 | if (!video) | 850 | if (!video) |
848 | return -EINVAL; | 851 | return -EINVAL; |
849 | 852 | ||
853 | dev = acpi_get_physical_pci_device(video->device->handle); | ||
854 | if (!dev) | ||
855 | return -ENODEV; | ||
856 | put_device(dev); | ||
857 | |||
850 | /* Since there is no HID, CID and so on for VGA driver, we have | 858 | /* Since there is no HID, CID and so on for VGA driver, we have |
851 | * to check well known required nodes. | 859 | * to check well known required nodes. |
852 | */ | 860 | */ |
@@ -2094,12 +2102,6 @@ static int __init acpi_video_init(void) | |||
2094 | { | 2102 | { |
2095 | int result = 0; | 2103 | int result = 0; |
2096 | 2104 | ||
2097 | |||
2098 | /* | ||
2099 | acpi_dbg_level = 0xFFFFFFFF; | ||
2100 | acpi_dbg_layer = 0x08000000; | ||
2101 | */ | ||
2102 | |||
2103 | acpi_video_dir = proc_mkdir(ACPI_VIDEO_CLASS, acpi_root_dir); | 2105 | acpi_video_dir = proc_mkdir(ACPI_VIDEO_CLASS, acpi_root_dir); |
2104 | if (!acpi_video_dir) | 2106 | if (!acpi_video_dir) |
2105 | return -ENODEV; | 2107 | return -ENODEV; |
diff --git a/drivers/acpi/video_detect.c b/drivers/acpi/video_detect.c new file mode 100644 index 000000000000..f022eb6f5637 --- /dev/null +++ b/drivers/acpi/video_detect.c | |||
@@ -0,0 +1,267 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2008 SuSE Linux Products GmbH | ||
3 | * Thomas Renninger <trenn@suse.de> | ||
4 | * | ||
5 | * May be copied or modified under the terms of the GNU General Public License | ||
6 | * | ||
7 | * video_detect.c: | ||
8 | * Provides acpi_is_video_device() for early scanning of ACPI devices in scan.c | ||
9 | * There a Linux specific (Spec does not provide a HID for video devices) is | ||
10 | * assinged | ||
11 | * | ||
12 | * After PCI devices are glued with ACPI devices | ||
13 | * acpi_get_physical_pci_device() can be called to identify ACPI graphics | ||
14 | * devices for which a real graphics card is plugged in | ||
15 | * | ||
16 | * Now acpi_video_get_capabilities() can be called to check which | ||
17 | * capabilities the graphics cards plugged in support. The check for general | ||
18 | * video capabilities will be triggered by the first caller of | ||
19 | * acpi_video_get_capabilities(NULL); which will happen when the first | ||
20 | * backlight (or display output) switching supporting driver calls: | ||
21 | * acpi_video_backlight_support(); | ||
22 | * | ||
23 | * Depending on whether ACPI graphics extensions (cmp. ACPI spec Appendix B) | ||
24 | * are available, video.ko should be used to handle the device. | ||
25 | * | ||
26 | * Otherwise vendor specific drivers like thinkpad_acpi, asus_acpi, | ||
27 | * sony_acpi,... can take care about backlight brightness and display output | ||
28 | * switching. | ||
29 | * | ||
30 | * If CONFIG_ACPI_VIDEO is neither set as "compiled in" (y) nor as a module (m) | ||
31 | * this file will not be compiled, acpi_video_get_capabilities() and | ||
32 | * acpi_video_backlight_support() will always return 0 and vendor specific | ||
33 | * drivers always can handle backlight. | ||
34 | * | ||
35 | */ | ||
36 | |||
37 | #include <linux/acpi.h> | ||
38 | #include <linux/dmi.h> | ||
39 | |||
40 | ACPI_MODULE_NAME("video"); | ||
41 | #define _COMPONENT ACPI_VIDEO_COMPONENT | ||
42 | |||
43 | static long acpi_video_support; | ||
44 | static bool acpi_video_caps_checked; | ||
45 | |||
46 | static acpi_status | ||
47 | acpi_backlight_cap_match(acpi_handle handle, u32 level, void *context, | ||
48 | void **retyurn_value) | ||
49 | { | ||
50 | long *cap = context; | ||
51 | acpi_handle h_dummy; | ||
52 | |||
53 | if (ACPI_SUCCESS(acpi_get_handle(handle, "_BCM", &h_dummy)) && | ||
54 | ACPI_SUCCESS(acpi_get_handle(handle, "_BCL", &h_dummy))) { | ||
55 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found generic backlight " | ||
56 | "support\n")); | ||
57 | *cap |= ACPI_VIDEO_BACKLIGHT; | ||
58 | /* We have backlight support, no need to scan further */ | ||
59 | return AE_CTRL_TERMINATE; | ||
60 | } | ||
61 | return 0; | ||
62 | } | ||
63 | |||
64 | /* Returns true if the device is a video device which can be handled by | ||
65 | * video.ko. | ||
66 | * The device will get a Linux specific CID added in scan.c to | ||
67 | * identify the device as an ACPI graphics device | ||
68 | * Be aware that the graphics device may not be physically present | ||
69 | * Use acpi_video_get_capabilities() to detect general ACPI video | ||
70 | * capabilities of present cards | ||
71 | */ | ||
72 | long acpi_is_video_device(struct acpi_device *device) | ||
73 | { | ||
74 | acpi_handle h_dummy; | ||
75 | long video_caps = 0; | ||
76 | |||
77 | if (!device) | ||
78 | return 0; | ||
79 | |||
80 | /* Does this device able to support video switching ? */ | ||
81 | if (ACPI_SUCCESS(acpi_get_handle(device->handle, "_DOD", &h_dummy)) && | ||
82 | ACPI_SUCCESS(acpi_get_handle(device->handle, "_DOS", &h_dummy))) | ||
83 | video_caps |= ACPI_VIDEO_OUTPUT_SWITCHING; | ||
84 | |||
85 | /* Does this device able to retrieve a video ROM ? */ | ||
86 | if (ACPI_SUCCESS(acpi_get_handle(device->handle, "_ROM", &h_dummy))) | ||
87 | video_caps |= ACPI_VIDEO_ROM_AVAILABLE; | ||
88 | |||
89 | /* Does this device able to configure which video head to be POSTed ? */ | ||
90 | if (ACPI_SUCCESS(acpi_get_handle(device->handle, "_VPO", &h_dummy)) && | ||
91 | ACPI_SUCCESS(acpi_get_handle(device->handle, "_GPD", &h_dummy)) && | ||
92 | ACPI_SUCCESS(acpi_get_handle(device->handle, "_SPD", &h_dummy))) | ||
93 | video_caps |= ACPI_VIDEO_DEVICE_POSTING; | ||
94 | |||
95 | /* Only check for backlight functionality if one of the above hit. */ | ||
96 | if (video_caps) | ||
97 | acpi_walk_namespace(ACPI_TYPE_DEVICE, device->handle, | ||
98 | ACPI_UINT32_MAX, acpi_backlight_cap_match, | ||
99 | &video_caps, NULL); | ||
100 | |||
101 | return video_caps; | ||
102 | } | ||
103 | EXPORT_SYMBOL(acpi_is_video_device); | ||
104 | |||
105 | static acpi_status | ||
106 | find_video(acpi_handle handle, u32 lvl, void *context, void **rv) | ||
107 | { | ||
108 | long *cap = context; | ||
109 | struct device *dev; | ||
110 | struct acpi_device *acpi_dev; | ||
111 | |||
112 | const struct acpi_device_id video_ids[] = { | ||
113 | {ACPI_VIDEO_HID, 0}, | ||
114 | {"", 0}, | ||
115 | }; | ||
116 | if (acpi_bus_get_device(handle, &acpi_dev)) | ||
117 | return AE_OK; | ||
118 | |||
119 | if (!acpi_match_device_ids(acpi_dev, video_ids)) { | ||
120 | dev = acpi_get_physical_pci_device(handle); | ||
121 | if (!dev) | ||
122 | return AE_OK; | ||
123 | put_device(dev); | ||
124 | *cap |= acpi_is_video_device(acpi_dev); | ||
125 | } | ||
126 | return AE_OK; | ||
127 | } | ||
128 | |||
129 | /* | ||
130 | * Returns the video capabilities of a specific ACPI graphics device | ||
131 | * | ||
132 | * if NULL is passed as argument all ACPI devices are enumerated and | ||
133 | * all graphics capabilities of physically present devices are | ||
134 | * summerized and returned. This is cached and done only once. | ||
135 | */ | ||
136 | long acpi_video_get_capabilities(acpi_handle graphics_handle) | ||
137 | { | ||
138 | long caps = 0; | ||
139 | struct acpi_device *tmp_dev; | ||
140 | acpi_status status; | ||
141 | |||
142 | if (acpi_video_caps_checked && graphics_handle == NULL) | ||
143 | return acpi_video_support; | ||
144 | |||
145 | if (!graphics_handle) { | ||
146 | /* Only do the global walk through all graphics devices once */ | ||
147 | acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, | ||
148 | ACPI_UINT32_MAX, find_video, | ||
149 | &caps, NULL); | ||
150 | /* There might be boot param flags set already... */ | ||
151 | acpi_video_support |= caps; | ||
152 | acpi_video_caps_checked = 1; | ||
153 | /* Add blacklists here. Be careful to use the right *DMI* bits | ||
154 | * to still be able to override logic via boot params, e.g.: | ||
155 | * | ||
156 | * if (dmi_name_in_vendors("XY")) { | ||
157 | * acpi_video_support |= | ||
158 | * ACPI_VIDEO_OUTPUT_SWITCHING_DMI_VENDOR; | ||
159 | * acpi_video_support |= | ||
160 | * ACPI_VIDEO_BACKLIGHT_DMI_VENDOR; | ||
161 | *} | ||
162 | */ | ||
163 | } else { | ||
164 | status = acpi_bus_get_device(graphics_handle, &tmp_dev); | ||
165 | if (ACPI_FAILURE(status)) { | ||
166 | ACPI_EXCEPTION((AE_INFO, status, "Invalid device")); | ||
167 | return 0; | ||
168 | } | ||
169 | acpi_walk_namespace(ACPI_TYPE_DEVICE, graphics_handle, | ||
170 | ACPI_UINT32_MAX, find_video, | ||
171 | &caps, NULL); | ||
172 | } | ||
173 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "We have 0x%lX video support %s %s\n", | ||
174 | graphics_handle ? caps : acpi_video_support, | ||
175 | graphics_handle ? "on device " : "in general", | ||
176 | graphics_handle ? acpi_device_bid(tmp_dev) : "")); | ||
177 | return caps; | ||
178 | } | ||
179 | EXPORT_SYMBOL(acpi_video_get_capabilities); | ||
180 | |||
181 | /* Returns true if video.ko can do backlight switching */ | ||
182 | int acpi_video_backlight_support(void) | ||
183 | { | ||
184 | /* | ||
185 | * We must check whether the ACPI graphics device is physically plugged | ||
186 | * in. Therefore this must be called after binding PCI and ACPI devices | ||
187 | */ | ||
188 | if (!acpi_video_caps_checked) | ||
189 | acpi_video_get_capabilities(NULL); | ||
190 | |||
191 | /* First check for boot param -> highest prio */ | ||
192 | if (acpi_video_support & ACPI_VIDEO_BACKLIGHT_FORCE_VENDOR) | ||
193 | return 0; | ||
194 | else if (acpi_video_support & ACPI_VIDEO_BACKLIGHT_FORCE_VIDEO) | ||
195 | return 1; | ||
196 | |||
197 | /* Then check for DMI blacklist -> second highest prio */ | ||
198 | if (acpi_video_support & ACPI_VIDEO_BACKLIGHT_DMI_VENDOR) | ||
199 | return 0; | ||
200 | else if (acpi_video_support & ACPI_VIDEO_BACKLIGHT_DMI_VIDEO) | ||
201 | return 1; | ||
202 | |||
203 | /* Then go the default way */ | ||
204 | return acpi_video_support & ACPI_VIDEO_BACKLIGHT; | ||
205 | } | ||
206 | EXPORT_SYMBOL(acpi_video_backlight_support); | ||
207 | |||
208 | /* | ||
209 | * Returns true if video.ko can do display output switching. | ||
210 | * This does not work well/at all with binary graphics drivers | ||
211 | * which disable system io ranges and do it on their own. | ||
212 | */ | ||
213 | int acpi_video_display_switch_support(void) | ||
214 | { | ||
215 | if (!acpi_video_caps_checked) | ||
216 | acpi_video_get_capabilities(NULL); | ||
217 | |||
218 | if (acpi_video_support & ACPI_VIDEO_OUTPUT_SWITCHING_FORCE_VENDOR) | ||
219 | return 0; | ||
220 | else if (acpi_video_support & ACPI_VIDEO_OUTPUT_SWITCHING_FORCE_VIDEO) | ||
221 | return 1; | ||
222 | |||
223 | if (acpi_video_support & ACPI_VIDEO_OUTPUT_SWITCHING_DMI_VENDOR) | ||
224 | return 0; | ||
225 | else if (acpi_video_support & ACPI_VIDEO_OUTPUT_SWITCHING_DMI_VIDEO) | ||
226 | return 1; | ||
227 | |||
228 | return acpi_video_support & ACPI_VIDEO_OUTPUT_SWITCHING; | ||
229 | } | ||
230 | EXPORT_SYMBOL(acpi_video_display_switch_support); | ||
231 | |||
232 | /* | ||
233 | * Use acpi_display_output=vendor/video or acpi_backlight=vendor/video | ||
234 | * To force that backlight or display output switching is processed by vendor | ||
235 | * specific acpi drivers or video.ko driver. | ||
236 | */ | ||
237 | int __init acpi_backlight(char *str) | ||
238 | { | ||
239 | if (str == NULL || *str == '\0') | ||
240 | return 1; | ||
241 | else { | ||
242 | if (!strcmp("vendor", str)) | ||
243 | acpi_video_support |= | ||
244 | ACPI_VIDEO_BACKLIGHT_FORCE_VENDOR; | ||
245 | if (!strcmp("video", str)) | ||
246 | acpi_video_support |= | ||
247 | ACPI_VIDEO_OUTPUT_SWITCHING_FORCE_VIDEO; | ||
248 | } | ||
249 | return 1; | ||
250 | } | ||
251 | __setup("acpi_backlight=", acpi_backlight); | ||
252 | |||
253 | int __init acpi_display_output(char *str) | ||
254 | { | ||
255 | if (str == NULL || *str == '\0') | ||
256 | return 1; | ||
257 | else { | ||
258 | if (!strcmp("vendor", str)) | ||
259 | acpi_video_support |= | ||
260 | ACPI_VIDEO_OUTPUT_SWITCHING_FORCE_VENDOR; | ||
261 | if (!strcmp("video", str)) | ||
262 | acpi_video_support |= | ||
263 | ACPI_VIDEO_OUTPUT_SWITCHING_FORCE_VIDEO; | ||
264 | } | ||
265 | return 1; | ||
266 | } | ||
267 | __setup("acpi_display_output=", acpi_display_output); | ||
diff --git a/drivers/acpi/wmi.c b/drivers/acpi/wmi.c index 47cd7baf9b1b..8a8b377712c9 100644 --- a/drivers/acpi/wmi.c +++ b/drivers/acpi/wmi.c | |||
@@ -660,7 +660,7 @@ static void acpi_wmi_notify(acpi_handle handle, u32 event, void *data) | |||
660 | wblock->handler(event, wblock->handler_data); | 660 | wblock->handler(event, wblock->handler_data); |
661 | 661 | ||
662 | acpi_bus_generate_netlink_event( | 662 | acpi_bus_generate_netlink_event( |
663 | device->pnp.device_class, device->dev.bus_id, | 663 | device->pnp.device_class, dev_name(&device->dev), |
664 | event, 0); | 664 | event, 0); |
665 | break; | 665 | break; |
666 | } | 666 | } |
diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c index 8e37be19bbf5..d6d97d8f3fa4 100644 --- a/drivers/ata/ata_piix.c +++ b/drivers/ata/ata_piix.c | |||
@@ -1066,6 +1066,21 @@ static int piix_broken_suspend(void) | |||
1066 | if (dmi_find_device(DMI_DEV_TYPE_OEM_STRING, oemstrs[i], NULL)) | 1066 | if (dmi_find_device(DMI_DEV_TYPE_OEM_STRING, oemstrs[i], NULL)) |
1067 | return 1; | 1067 | return 1; |
1068 | 1068 | ||
1069 | /* TECRA M4 sometimes forgets its identify and reports bogus | ||
1070 | * DMI information. As the bogus information is a bit | ||
1071 | * generic, match as many entries as possible. This manual | ||
1072 | * matching is necessary because dmi_system_id.matches is | ||
1073 | * limited to four entries. | ||
1074 | */ | ||
1075 | if (!strcmp(dmi_get_system_info(DMI_SYS_VENDOR), "TOSHIBA") && | ||
1076 | !strcmp(dmi_get_system_info(DMI_PRODUCT_NAME), "000000") && | ||
1077 | !strcmp(dmi_get_system_info(DMI_PRODUCT_VERSION), "000000") && | ||
1078 | !strcmp(dmi_get_system_info(DMI_PRODUCT_SERIAL), "000000") && | ||
1079 | !strcmp(dmi_get_system_info(DMI_BOARD_VENDOR), "TOSHIBA") && | ||
1080 | !strcmp(dmi_get_system_info(DMI_BOARD_NAME), "Portable PC") && | ||
1081 | !strcmp(dmi_get_system_info(DMI_BOARD_VERSION), "Version A0")) | ||
1082 | return 1; | ||
1083 | |||
1069 | return 0; | 1084 | return 0; |
1070 | } | 1085 | } |
1071 | 1086 | ||
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 4214bfb13bbd..5e2eb740df46 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
@@ -2492,6 +2492,13 @@ int ata_dev_configure(struct ata_device *dev) | |||
2492 | } | 2492 | } |
2493 | } | 2493 | } |
2494 | 2494 | ||
2495 | if ((dev->horkage & ATA_HORKAGE_FIRMWARE_WARN) && print_info) { | ||
2496 | ata_dev_printk(dev, KERN_WARNING, "WARNING: device requires " | ||
2497 | "firmware update to be fully functional.\n"); | ||
2498 | ata_dev_printk(dev, KERN_WARNING, " contact the vendor " | ||
2499 | "or visit http://ata.wiki.kernel.org.\n"); | ||
2500 | } | ||
2501 | |||
2495 | return 0; | 2502 | return 0; |
2496 | 2503 | ||
2497 | err_out_nosup: | 2504 | err_out_nosup: |
@@ -4042,6 +4049,20 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { | |||
4042 | { "ST380817AS", "3.42", ATA_HORKAGE_NONCQ }, | 4049 | { "ST380817AS", "3.42", ATA_HORKAGE_NONCQ }, |
4043 | { "ST3160023AS", "3.42", ATA_HORKAGE_NONCQ }, | 4050 | { "ST3160023AS", "3.42", ATA_HORKAGE_NONCQ }, |
4044 | 4051 | ||
4052 | /* Seagate NCQ + FLUSH CACHE firmware bug */ | ||
4053 | { "ST31500341AS", "9JU138", ATA_HORKAGE_NONCQ | | ||
4054 | ATA_HORKAGE_FIRMWARE_WARN }, | ||
4055 | { "ST31000333AS", "9FZ136", ATA_HORKAGE_NONCQ | | ||
4056 | ATA_HORKAGE_FIRMWARE_WARN }, | ||
4057 | { "ST3640623AS", "9FZ164", ATA_HORKAGE_NONCQ | | ||
4058 | ATA_HORKAGE_FIRMWARE_WARN }, | ||
4059 | { "ST3640323AS", "9FZ134", ATA_HORKAGE_NONCQ | | ||
4060 | ATA_HORKAGE_FIRMWARE_WARN }, | ||
4061 | { "ST3320813AS", "9FZ182", ATA_HORKAGE_NONCQ | | ||
4062 | ATA_HORKAGE_FIRMWARE_WARN }, | ||
4063 | { "ST3320613AS", "9FZ162", ATA_HORKAGE_NONCQ | | ||
4064 | ATA_HORKAGE_FIRMWARE_WARN }, | ||
4065 | |||
4045 | /* Blacklist entries taken from Silicon Image 3124/3132 | 4066 | /* Blacklist entries taken from Silicon Image 3124/3132 |
4046 | Windows driver .inf file - also several Linux problem reports */ | 4067 | Windows driver .inf file - also several Linux problem reports */ |
4047 | { "HTS541060G9SA00", "MB3OC60D", ATA_HORKAGE_NONCQ, }, | 4068 | { "HTS541060G9SA00", "MB3OC60D", ATA_HORKAGE_NONCQ, }, |
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c index 4b4739486327..9033d164c4ec 100644 --- a/drivers/ata/libata-sff.c +++ b/drivers/ata/libata-sff.c | |||
@@ -1227,10 +1227,19 @@ fsm_start: | |||
1227 | /* ATA PIO protocol */ | 1227 | /* ATA PIO protocol */ |
1228 | if (unlikely((status & ATA_DRQ) == 0)) { | 1228 | if (unlikely((status & ATA_DRQ) == 0)) { |
1229 | /* handle BSY=0, DRQ=0 as error */ | 1229 | /* handle BSY=0, DRQ=0 as error */ |
1230 | if (likely(status & (ATA_ERR | ATA_DF))) | 1230 | if (likely(status & (ATA_ERR | ATA_DF))) { |
1231 | /* device stops HSM for abort/error */ | 1231 | /* device stops HSM for abort/error */ |
1232 | qc->err_mask |= AC_ERR_DEV; | 1232 | qc->err_mask |= AC_ERR_DEV; |
1233 | else { | 1233 | |
1234 | /* If diagnostic failed and this is | ||
1235 | * IDENTIFY, it's likely a phantom | ||
1236 | * device. Mark hint. | ||
1237 | */ | ||
1238 | if (qc->dev->horkage & | ||
1239 | ATA_HORKAGE_DIAGNOSTIC) | ||
1240 | qc->err_mask |= | ||
1241 | AC_ERR_NODEV_HINT; | ||
1242 | } else { | ||
1234 | /* HSM violation. Let EH handle this. | 1243 | /* HSM violation. Let EH handle this. |
1235 | * Phantom devices also trigger this | 1244 | * Phantom devices also trigger this |
1236 | * condition. Mark hint. | 1245 | * condition. Mark hint. |
diff --git a/drivers/ata/pata_rb532_cf.c b/drivers/ata/pata_rb532_cf.c index f8b3ffc8ae9e..c2e6fb9f2ef9 100644 --- a/drivers/ata/pata_rb532_cf.c +++ b/drivers/ata/pata_rb532_cf.c | |||
@@ -39,9 +39,11 @@ | |||
39 | #define RB500_CF_MAXPORTS 1 | 39 | #define RB500_CF_MAXPORTS 1 |
40 | #define RB500_CF_IO_DELAY 400 | 40 | #define RB500_CF_IO_DELAY 400 |
41 | 41 | ||
42 | #define RB500_CF_REG_CMD 0x0800 | 42 | #define RB500_CF_REG_BASE 0x0800 |
43 | #define RB500_CF_REG_ERR 0x080D | ||
43 | #define RB500_CF_REG_CTRL 0x080E | 44 | #define RB500_CF_REG_CTRL 0x080E |
44 | #define RB500_CF_REG_DATA 0x0C00 | 45 | /* 32bit buffered data register offset */ |
46 | #define RB500_CF_REG_DBUF32 0x0C00 | ||
45 | 47 | ||
46 | struct rb532_cf_info { | 48 | struct rb532_cf_info { |
47 | void __iomem *iobase; | 49 | void __iomem *iobase; |
@@ -72,11 +74,12 @@ static void rb532_pata_exec_command(struct ata_port *ap, | |||
72 | rb532_pata_finish_io(ap); | 74 | rb532_pata_finish_io(ap); |
73 | } | 75 | } |
74 | 76 | ||
75 | static void rb532_pata_data_xfer(struct ata_device *adev, unsigned char *buf, | 77 | static unsigned int rb532_pata_data_xfer(struct ata_device *adev, unsigned char *buf, |
76 | unsigned int buflen, int write_data) | 78 | unsigned int buflen, int write_data) |
77 | { | 79 | { |
78 | struct ata_port *ap = adev->link->ap; | 80 | struct ata_port *ap = adev->link->ap; |
79 | void __iomem *ioaddr = ap->ioaddr.data_addr; | 81 | void __iomem *ioaddr = ap->ioaddr.data_addr; |
82 | int retlen = buflen; | ||
80 | 83 | ||
81 | if (write_data) { | 84 | if (write_data) { |
82 | for (; buflen > 0; buflen--, buf++) | 85 | for (; buflen > 0; buflen--, buf++) |
@@ -87,6 +90,7 @@ static void rb532_pata_data_xfer(struct ata_device *adev, unsigned char *buf, | |||
87 | } | 90 | } |
88 | 91 | ||
89 | rb532_pata_finish_io(adev->link->ap); | 92 | rb532_pata_finish_io(adev->link->ap); |
93 | return retlen; | ||
90 | } | 94 | } |
91 | 95 | ||
92 | static void rb532_pata_freeze(struct ata_port *ap) | 96 | static void rb532_pata_freeze(struct ata_port *ap) |
@@ -146,13 +150,14 @@ static void rb532_pata_setup_ports(struct ata_host *ah) | |||
146 | ap->pio_mask = 0x1f; /* PIO4 */ | 150 | ap->pio_mask = 0x1f; /* PIO4 */ |
147 | ap->flags = ATA_FLAG_NO_LEGACY | ATA_FLAG_MMIO; | 151 | ap->flags = ATA_FLAG_NO_LEGACY | ATA_FLAG_MMIO; |
148 | 152 | ||
149 | ap->ioaddr.cmd_addr = info->iobase + RB500_CF_REG_CMD; | 153 | ap->ioaddr.cmd_addr = info->iobase + RB500_CF_REG_BASE; |
150 | ap->ioaddr.ctl_addr = info->iobase + RB500_CF_REG_CTRL; | 154 | ap->ioaddr.ctl_addr = info->iobase + RB500_CF_REG_CTRL; |
151 | ap->ioaddr.altstatus_addr = info->iobase + RB500_CF_REG_CTRL; | 155 | ap->ioaddr.altstatus_addr = info->iobase + RB500_CF_REG_CTRL; |
152 | 156 | ||
153 | ata_sff_std_ports(&ap->ioaddr); | 157 | ata_sff_std_ports(&ap->ioaddr); |
154 | 158 | ||
155 | ap->ioaddr.data_addr = info->iobase + RB500_CF_REG_DATA; | 159 | ap->ioaddr.data_addr = info->iobase + RB500_CF_REG_DBUF32; |
160 | ap->ioaddr.error_addr = info->iobase + RB500_CF_REG_ERR; | ||
156 | } | 161 | } |
157 | 162 | ||
158 | static __devinit int rb532_pata_driver_probe(struct platform_device *pdev) | 163 | static __devinit int rb532_pata_driver_probe(struct platform_device *pdev) |
diff --git a/drivers/block/Kconfig b/drivers/block/Kconfig index 61ad8d639ba3..0344a8a8321d 100644 --- a/drivers/block/Kconfig +++ b/drivers/block/Kconfig | |||
@@ -21,7 +21,8 @@ config BLK_DEV_FD | |||
21 | ---help--- | 21 | ---help--- |
22 | If you want to use the floppy disk drive(s) of your PC under Linux, | 22 | If you want to use the floppy disk drive(s) of your PC under Linux, |
23 | say Y. Information about this driver, especially important for IBM | 23 | say Y. Information about this driver, especially important for IBM |
24 | Thinkpad users, is contained in <file:Documentation/floppy.txt>. | 24 | Thinkpad users, is contained in |
25 | <file:Documentation/blockdev/floppy.txt>. | ||
25 | That file also contains the location of the Floppy driver FAQ as | 26 | That file also contains the location of the Floppy driver FAQ as |
26 | well as location of the fdutils package used to configure additional | 27 | well as location of the fdutils package used to configure additional |
27 | parameters of the driver at run time. | 28 | parameters of the driver at run time. |
@@ -76,7 +77,7 @@ config PARIDE | |||
76 | your computer's parallel port. Most of them are actually IDE devices | 77 | your computer's parallel port. Most of them are actually IDE devices |
77 | using a parallel port IDE adapter. This option enables the PARIDE | 78 | using a parallel port IDE adapter. This option enables the PARIDE |
78 | subsystem which contains drivers for many of these external drives. | 79 | subsystem which contains drivers for many of these external drives. |
79 | Read <file:Documentation/paride.txt> for more information. | 80 | Read <file:Documentation/blockdev/paride.txt> for more information. |
80 | 81 | ||
81 | If you have said Y to the "Parallel-port support" configuration | 82 | If you have said Y to the "Parallel-port support" configuration |
82 | option, you may share a single port between your printer and other | 83 | option, you may share a single port between your printer and other |
@@ -114,9 +115,9 @@ config BLK_CPQ_DA | |||
114 | help | 115 | help |
115 | This is the driver for Compaq Smart Array controllers. Everyone | 116 | This is the driver for Compaq Smart Array controllers. Everyone |
116 | using these boards should say Y here. See the file | 117 | using these boards should say Y here. See the file |
117 | <file:Documentation/cpqarray.txt> for the current list of boards | 118 | <file:Documentation/blockdev/cpqarray.txt> for the current list of |
118 | supported by this driver, and for further information on the use of | 119 | boards supported by this driver, and for further information on the |
119 | this driver. | 120 | use of this driver. |
120 | 121 | ||
121 | config BLK_CPQ_CISS_DA | 122 | config BLK_CPQ_CISS_DA |
122 | tristate "Compaq Smart Array 5xxx support" | 123 | tristate "Compaq Smart Array 5xxx support" |
@@ -124,7 +125,7 @@ config BLK_CPQ_CISS_DA | |||
124 | help | 125 | help |
125 | This is the driver for Compaq Smart Array 5xxx controllers. | 126 | This is the driver for Compaq Smart Array 5xxx controllers. |
126 | Everyone using these boards should say Y here. | 127 | Everyone using these boards should say Y here. |
127 | See <file:Documentation/cciss.txt> for the current list of | 128 | See <file:Documentation/blockdev/cciss.txt> for the current list of |
128 | boards supported by this driver, and for further information | 129 | boards supported by this driver, and for further information |
129 | on the use of this driver. | 130 | on the use of this driver. |
130 | 131 | ||
@@ -135,7 +136,7 @@ config CISS_SCSI_TAPE | |||
135 | help | 136 | help |
136 | When enabled (Y), this option allows SCSI tape drives and SCSI medium | 137 | When enabled (Y), this option allows SCSI tape drives and SCSI medium |
137 | changers (tape robots) to be accessed via a Compaq 5xxx array | 138 | changers (tape robots) to be accessed via a Compaq 5xxx array |
138 | controller. (See <file:Documentation/cciss.txt> for more details.) | 139 | controller. (See <file:Documentation/blockdev/cciss.txt> for more details.) |
139 | 140 | ||
140 | "SCSI support" and "SCSI tape support" must also be enabled for this | 141 | "SCSI support" and "SCSI tape support" must also be enabled for this |
141 | option to work. | 142 | option to work. |
@@ -149,8 +150,8 @@ config BLK_DEV_DAC960 | |||
149 | help | 150 | help |
150 | This driver adds support for the Mylex DAC960, AcceleRAID, and | 151 | This driver adds support for the Mylex DAC960, AcceleRAID, and |
151 | eXtremeRAID PCI RAID controllers. See the file | 152 | eXtremeRAID PCI RAID controllers. See the file |
152 | <file:Documentation/README.DAC960> for further information about | 153 | <file:Documentation/blockdev/README.DAC960> for further information |
153 | this driver. | 154 | about this driver. |
154 | 155 | ||
155 | To compile this driver as a module, choose M here: the | 156 | To compile this driver as a module, choose M here: the |
156 | module will be called DAC960. | 157 | module will be called DAC960. |
@@ -278,9 +279,9 @@ config BLK_DEV_NBD | |||
278 | userland (making server and client physically the same computer, | 279 | userland (making server and client physically the same computer, |
279 | communicating using the loopback network device). | 280 | communicating using the loopback network device). |
280 | 281 | ||
281 | Read <file:Documentation/nbd.txt> for more information, especially | 282 | Read <file:Documentation/blockdev/nbd.txt> for more information, |
282 | about where to find the server code, which runs in user space and | 283 | especially about where to find the server code, which runs in user |
283 | does not need special kernel support. | 284 | space and does not need special kernel support. |
284 | 285 | ||
285 | Note that this has nothing to do with the network file systems NFS | 286 | Note that this has nothing to do with the network file systems NFS |
286 | or Coda; you can say N here even if you intend to use NFS or Coda. | 287 | or Coda; you can say N here even if you intend to use NFS or Coda. |
@@ -321,8 +322,8 @@ config BLK_DEV_RAM | |||
321 | store a copy of a minimal root file system off of a floppy into RAM | 322 | store a copy of a minimal root file system off of a floppy into RAM |
322 | during the initial install of Linux. | 323 | during the initial install of Linux. |
323 | 324 | ||
324 | Note that the kernel command line option "ramdisk=XX" is now | 325 | Note that the kernel command line option "ramdisk=XX" is now obsolete. |
325 | obsolete. For details, read <file:Documentation/ramdisk.txt>. | 326 | For details, read <file:Documentation/blockdev/ramdisk.txt>. |
326 | 327 | ||
327 | To compile this driver as a module, choose M here: the | 328 | To compile this driver as a module, choose M here: the |
328 | module will be called rd. | 329 | module will be called rd. |
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index 12de1fdaa6c6..9364dc554257 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c | |||
@@ -2847,7 +2847,7 @@ static void do_cciss_request(struct request_queue *q) | |||
2847 | h->maxSG = seg; | 2847 | h->maxSG = seg; |
2848 | 2848 | ||
2849 | #ifdef CCISS_DEBUG | 2849 | #ifdef CCISS_DEBUG |
2850 | printk(KERN_DEBUG "cciss: Submitting %d sectors in %d segments\n", | 2850 | printk(KERN_DEBUG "cciss: Submitting %lu sectors in %d segments\n", |
2851 | creq->nr_sectors, seg); | 2851 | creq->nr_sectors, seg); |
2852 | #endif /* CCISS_DEBUG */ | 2852 | #endif /* CCISS_DEBUG */ |
2853 | 2853 | ||
@@ -3197,7 +3197,7 @@ static int __devinit cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev) | |||
3197 | 3197 | ||
3198 | c->paddr = pci_resource_start(pdev, 0); /* addressing mode bits already removed */ | 3198 | c->paddr = pci_resource_start(pdev, 0); /* addressing mode bits already removed */ |
3199 | #ifdef CCISS_DEBUG | 3199 | #ifdef CCISS_DEBUG |
3200 | printk("address 0 = %x\n", c->paddr); | 3200 | printk("address 0 = %lx\n", c->paddr); |
3201 | #endif /* CCISS_DEBUG */ | 3201 | #endif /* CCISS_DEBUG */ |
3202 | c->vaddr = remap_pci_mem(c->paddr, 0x250); | 3202 | c->vaddr = remap_pci_mem(c->paddr, 0x250); |
3203 | 3203 | ||
@@ -3224,7 +3224,8 @@ static int __devinit cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev) | |||
3224 | #endif /* CCISS_DEBUG */ | 3224 | #endif /* CCISS_DEBUG */ |
3225 | cfg_base_addr_index = find_PCI_BAR_index(pdev, cfg_base_addr); | 3225 | cfg_base_addr_index = find_PCI_BAR_index(pdev, cfg_base_addr); |
3226 | #ifdef CCISS_DEBUG | 3226 | #ifdef CCISS_DEBUG |
3227 | printk("cfg base address index = %x\n", cfg_base_addr_index); | 3227 | printk("cfg base address index = %llx\n", |
3228 | (unsigned long long)cfg_base_addr_index); | ||
3228 | #endif /* CCISS_DEBUG */ | 3229 | #endif /* CCISS_DEBUG */ |
3229 | if (cfg_base_addr_index == -1) { | 3230 | if (cfg_base_addr_index == -1) { |
3230 | printk(KERN_WARNING "cciss: Cannot find cfg_base_addr_index\n"); | 3231 | printk(KERN_WARNING "cciss: Cannot find cfg_base_addr_index\n"); |
@@ -3234,7 +3235,7 @@ static int __devinit cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev) | |||
3234 | 3235 | ||
3235 | cfg_offset = readl(c->vaddr + SA5_CTMEM_OFFSET); | 3236 | cfg_offset = readl(c->vaddr + SA5_CTMEM_OFFSET); |
3236 | #ifdef CCISS_DEBUG | 3237 | #ifdef CCISS_DEBUG |
3237 | printk("cfg offset = %x\n", cfg_offset); | 3238 | printk("cfg offset = %llx\n", (unsigned long long)cfg_offset); |
3238 | #endif /* CCISS_DEBUG */ | 3239 | #endif /* CCISS_DEBUG */ |
3239 | c->cfgtable = remap_pci_mem(pci_resource_start(pdev, | 3240 | c->cfgtable = remap_pci_mem(pci_resource_start(pdev, |
3240 | cfg_base_addr_index) + | 3241 | cfg_base_addr_index) + |
diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c index 14db747a636e..cf29cc4e6ab7 100644 --- a/drivers/block/floppy.c +++ b/drivers/block/floppy.c | |||
@@ -4124,7 +4124,7 @@ static int __init floppy_setup(char *str) | |||
4124 | printk("\n"); | 4124 | printk("\n"); |
4125 | } else | 4125 | } else |
4126 | DPRINT("botched floppy option\n"); | 4126 | DPRINT("botched floppy option\n"); |
4127 | DPRINT("Read Documentation/floppy.txt\n"); | 4127 | DPRINT("Read Documentation/blockdev/floppy.txt\n"); |
4128 | return 0; | 4128 | return 0; |
4129 | } | 4129 | } |
4130 | 4130 | ||
diff --git a/drivers/block/ub.c b/drivers/block/ub.c index fccac18d3111..048d71d244d7 100644 --- a/drivers/block/ub.c +++ b/drivers/block/ub.c | |||
@@ -1546,8 +1546,6 @@ static void ub_top_sense_done(struct ub_dev *sc, struct ub_scsi_cmd *scmd) | |||
1546 | 1546 | ||
1547 | /* | 1547 | /* |
1548 | * Reset management | 1548 | * Reset management |
1549 | * XXX Move usb_reset_device to khubd. Hogging kevent is not a good thing. | ||
1550 | * XXX Make usb_sync_reset asynchronous. | ||
1551 | */ | 1549 | */ |
1552 | 1550 | ||
1553 | static void ub_reset_enter(struct ub_dev *sc, int try) | 1551 | static void ub_reset_enter(struct ub_dev *sc, int try) |
@@ -1633,6 +1631,22 @@ static void ub_reset_task(struct work_struct *work) | |||
1633 | } | 1631 | } |
1634 | 1632 | ||
1635 | /* | 1633 | /* |
1634 | * XXX Reset brackets are too much hassle to implement, so just stub them | ||
1635 | * in order to prevent forced unbinding (which deadlocks solid when our | ||
1636 | * ->disconnect method waits for the reset to complete and this kills keventd). | ||
1637 | * | ||
1638 | * XXX Tell Alan to move usb_unlock_device inside of usb_reset_device, | ||
1639 | * or else the post_reset is invoked, and restats I/O on a locked device. | ||
1640 | */ | ||
1641 | static int ub_pre_reset(struct usb_interface *iface) { | ||
1642 | return 0; | ||
1643 | } | ||
1644 | |||
1645 | static int ub_post_reset(struct usb_interface *iface) { | ||
1646 | return 0; | ||
1647 | } | ||
1648 | |||
1649 | /* | ||
1636 | * This is called from a process context. | 1650 | * This is called from a process context. |
1637 | */ | 1651 | */ |
1638 | static void ub_revalidate(struct ub_dev *sc, struct ub_lun *lun) | 1652 | static void ub_revalidate(struct ub_dev *sc, struct ub_lun *lun) |
@@ -2446,6 +2460,8 @@ static struct usb_driver ub_driver = { | |||
2446 | .probe = ub_probe, | 2460 | .probe = ub_probe, |
2447 | .disconnect = ub_disconnect, | 2461 | .disconnect = ub_disconnect, |
2448 | .id_table = ub_usb_ids, | 2462 | .id_table = ub_usb_ids, |
2463 | .pre_reset = ub_pre_reset, | ||
2464 | .post_reset = ub_post_reset, | ||
2449 | }; | 2465 | }; |
2450 | 2466 | ||
2451 | static int __init ub_init(void) | 2467 | static int __init ub_init(void) |
diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c index b220c686089d..2d19f0cc47f2 100644 --- a/drivers/block/xen-blkfront.c +++ b/drivers/block/xen-blkfront.c | |||
@@ -338,12 +338,18 @@ wait: | |||
338 | static int xlvbd_init_blk_queue(struct gendisk *gd, u16 sector_size) | 338 | static int xlvbd_init_blk_queue(struct gendisk *gd, u16 sector_size) |
339 | { | 339 | { |
340 | struct request_queue *rq; | 340 | struct request_queue *rq; |
341 | elevator_t *old_e; | ||
341 | 342 | ||
342 | rq = blk_init_queue(do_blkif_request, &blkif_io_lock); | 343 | rq = blk_init_queue(do_blkif_request, &blkif_io_lock); |
343 | if (rq == NULL) | 344 | if (rq == NULL) |
344 | return -1; | 345 | return -1; |
345 | 346 | ||
346 | elevator_init(rq, "noop"); | 347 | old_e = rq->elevator; |
348 | if (IS_ERR_VALUE(elevator_init(rq, "noop"))) | ||
349 | printk(KERN_WARNING | ||
350 | "blkfront: Switch elevator failed, use default\n"); | ||
351 | else | ||
352 | elevator_exit(old_e); | ||
347 | 353 | ||
348 | /* Hard sector size and max sectors impersonate the equiv. hardware. */ | 354 | /* Hard sector size and max sectors impersonate the equiv. hardware. */ |
349 | blk_queue_hardsect_size(rq, sector_size); | 355 | blk_queue_hardsect_size(rq, sector_size); |
diff --git a/drivers/block/xsysace.c b/drivers/block/xsysace.c index ecab9e67d47a..29e1dfafb7c6 100644 --- a/drivers/block/xsysace.c +++ b/drivers/block/xsysace.c | |||
@@ -194,7 +194,7 @@ struct ace_device { | |||
194 | int in_irq; | 194 | int in_irq; |
195 | 195 | ||
196 | /* Details of hardware device */ | 196 | /* Details of hardware device */ |
197 | unsigned long physaddr; | 197 | resource_size_t physaddr; |
198 | void __iomem *baseaddr; | 198 | void __iomem *baseaddr; |
199 | int irq; | 199 | int irq; |
200 | int bus_width; /* 0 := 8 bit; 1 := 16 bit */ | 200 | int bus_width; /* 0 := 8 bit; 1 := 16 bit */ |
@@ -628,8 +628,8 @@ static void ace_fsm_dostate(struct ace_device *ace) | |||
628 | 628 | ||
629 | /* Okay, it's a data request, set it up for transfer */ | 629 | /* Okay, it's a data request, set it up for transfer */ |
630 | dev_dbg(ace->dev, | 630 | dev_dbg(ace->dev, |
631 | "request: sec=%lx hcnt=%lx, ccnt=%x, dir=%i\n", | 631 | "request: sec=%llx hcnt=%lx, ccnt=%x, dir=%i\n", |
632 | req->sector, req->hard_nr_sectors, | 632 | (unsigned long long) req->sector, req->hard_nr_sectors, |
633 | req->current_nr_sectors, rq_data_dir(req)); | 633 | req->current_nr_sectors, rq_data_dir(req)); |
634 | 634 | ||
635 | ace->req = req; | 635 | ace->req = req; |
@@ -935,7 +935,8 @@ static int __devinit ace_setup(struct ace_device *ace) | |||
935 | int rc; | 935 | int rc; |
936 | 936 | ||
937 | dev_dbg(ace->dev, "ace_setup(ace=0x%p)\n", ace); | 937 | dev_dbg(ace->dev, "ace_setup(ace=0x%p)\n", ace); |
938 | dev_dbg(ace->dev, "physaddr=0x%lx irq=%i\n", ace->physaddr, ace->irq); | 938 | dev_dbg(ace->dev, "physaddr=0x%llx irq=%i\n", |
939 | (unsigned long long)ace->physaddr, ace->irq); | ||
939 | 940 | ||
940 | spin_lock_init(&ace->lock); | 941 | spin_lock_init(&ace->lock); |
941 | init_completion(&ace->id_completion); | 942 | init_completion(&ace->id_completion); |
@@ -1017,8 +1018,8 @@ static int __devinit ace_setup(struct ace_device *ace) | |||
1017 | /* Print the identification */ | 1018 | /* Print the identification */ |
1018 | dev_info(ace->dev, "Xilinx SystemACE revision %i.%i.%i\n", | 1019 | dev_info(ace->dev, "Xilinx SystemACE revision %i.%i.%i\n", |
1019 | (version >> 12) & 0xf, (version >> 8) & 0x0f, version & 0xff); | 1020 | (version >> 12) & 0xf, (version >> 8) & 0x0f, version & 0xff); |
1020 | dev_dbg(ace->dev, "physaddr 0x%lx, mapped to 0x%p, irq=%i\n", | 1021 | dev_dbg(ace->dev, "physaddr 0x%llx, mapped to 0x%p, irq=%i\n", |
1021 | ace->physaddr, ace->baseaddr, ace->irq); | 1022 | (unsigned long long) ace->physaddr, ace->baseaddr, ace->irq); |
1022 | 1023 | ||
1023 | ace->media_change = 1; | 1024 | ace->media_change = 1; |
1024 | ace_revalidate_disk(ace->gd); | 1025 | ace_revalidate_disk(ace->gd); |
@@ -1035,8 +1036,8 @@ err_alloc_disk: | |||
1035 | err_blk_initq: | 1036 | err_blk_initq: |
1036 | iounmap(ace->baseaddr); | 1037 | iounmap(ace->baseaddr); |
1037 | err_ioremap: | 1038 | err_ioremap: |
1038 | dev_info(ace->dev, "xsysace: error initializing device at 0x%lx\n", | 1039 | dev_info(ace->dev, "xsysace: error initializing device at 0x%llx\n", |
1039 | ace->physaddr); | 1040 | (unsigned long long) ace->physaddr); |
1040 | return -ENOMEM; | 1041 | return -ENOMEM; |
1041 | } | 1042 | } |
1042 | 1043 | ||
@@ -1059,7 +1060,7 @@ static void __devexit ace_teardown(struct ace_device *ace) | |||
1059 | } | 1060 | } |
1060 | 1061 | ||
1061 | static int __devinit | 1062 | static int __devinit |
1062 | ace_alloc(struct device *dev, int id, unsigned long physaddr, | 1063 | ace_alloc(struct device *dev, int id, resource_size_t physaddr, |
1063 | int irq, int bus_width) | 1064 | int irq, int bus_width) |
1064 | { | 1065 | { |
1065 | struct ace_device *ace; | 1066 | struct ace_device *ace; |
@@ -1119,7 +1120,7 @@ static void __devexit ace_free(struct device *dev) | |||
1119 | 1120 | ||
1120 | static int __devinit ace_probe(struct platform_device *dev) | 1121 | static int __devinit ace_probe(struct platform_device *dev) |
1121 | { | 1122 | { |
1122 | unsigned long physaddr = 0; | 1123 | resource_size_t physaddr = 0; |
1123 | int bus_width = ACE_BUS_WIDTH_16; /* FIXME: should not be hard coded */ | 1124 | int bus_width = ACE_BUS_WIDTH_16; /* FIXME: should not be hard coded */ |
1124 | int id = dev->id; | 1125 | int id = dev->id; |
1125 | int irq = NO_IRQ; | 1126 | int irq = NO_IRQ; |
@@ -1165,7 +1166,7 @@ static int __devinit | |||
1165 | ace_of_probe(struct of_device *op, const struct of_device_id *match) | 1166 | ace_of_probe(struct of_device *op, const struct of_device_id *match) |
1166 | { | 1167 | { |
1167 | struct resource res; | 1168 | struct resource res; |
1168 | unsigned long physaddr; | 1169 | resource_size_t physaddr; |
1169 | const u32 *id; | 1170 | const u32 *id; |
1170 | int irq, bus_width, rc; | 1171 | int irq, bus_width, rc; |
1171 | 1172 | ||
diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig index 43b35d0369d6..43d6ba83a191 100644 --- a/drivers/char/Kconfig +++ b/drivers/char/Kconfig | |||
@@ -124,7 +124,7 @@ config COMPUTONE | |||
124 | which give you many serial ports. You would need something like this | 124 | which give you many serial ports. You would need something like this |
125 | to connect more than two modems to your Linux box, for instance in | 125 | to connect more than two modems to your Linux box, for instance in |
126 | order to become a dial-in server. If you have a card like that, say | 126 | order to become a dial-in server. If you have a card like that, say |
127 | Y here and read <file:Documentation/computone.txt>. | 127 | Y here and read <file:Documentation/serial/computone.txt>. |
128 | 128 | ||
129 | To compile this driver as module, choose M here: the | 129 | To compile this driver as module, choose M here: the |
130 | module will be called ip2. | 130 | module will be called ip2. |
@@ -136,7 +136,7 @@ config ROCKETPORT | |||
136 | This driver supports Comtrol RocketPort and RocketModem PCI boards. | 136 | This driver supports Comtrol RocketPort and RocketModem PCI boards. |
137 | These boards provide 2, 4, 8, 16, or 32 high-speed serial ports or | 137 | These boards provide 2, 4, 8, 16, or 32 high-speed serial ports or |
138 | modems. For information about the RocketPort/RocketModem boards | 138 | modems. For information about the RocketPort/RocketModem boards |
139 | and this driver read <file:Documentation/rocket.txt>. | 139 | and this driver read <file:Documentation/serial/rocket.txt>. |
140 | 140 | ||
141 | To compile this driver as a module, choose M here: the | 141 | To compile this driver as a module, choose M here: the |
142 | module will be called rocket. | 142 | module will be called rocket. |
@@ -154,7 +154,7 @@ config CYCLADES | |||
154 | your Linux box, for instance in order to become a dial-in server. | 154 | your Linux box, for instance in order to become a dial-in server. |
155 | 155 | ||
156 | For information about the Cyclades-Z card, read | 156 | For information about the Cyclades-Z card, read |
157 | <file:Documentation/README.cycladesZ>. | 157 | <file:Documentation/serial/README.cycladesZ>. |
158 | 158 | ||
159 | To compile this driver as a module, choose M here: the | 159 | To compile this driver as a module, choose M here: the |
160 | module will be called cyclades. | 160 | module will be called cyclades. |
@@ -183,7 +183,7 @@ config DIGIEPCA | |||
183 | box, for instance in order to become a dial-in server. This driver | 183 | box, for instance in order to become a dial-in server. This driver |
184 | supports the original PC (ISA) boards as well as PCI, and EISA. If | 184 | supports the original PC (ISA) boards as well as PCI, and EISA. If |
185 | you have a card like this, say Y here and read the file | 185 | you have a card like this, say Y here and read the file |
186 | <file:Documentation/digiepca.txt>. | 186 | <file:Documentation/serial/digiepca.txt>. |
187 | 187 | ||
188 | To compile this driver as a module, choose M here: the | 188 | To compile this driver as a module, choose M here: the |
189 | module will be called epca. | 189 | module will be called epca. |
@@ -289,7 +289,7 @@ config RISCOM8 | |||
289 | which gives you many serial ports. You would need something like | 289 | which gives you many serial ports. You would need something like |
290 | this to connect more than two modems to your Linux box, for instance | 290 | this to connect more than two modems to your Linux box, for instance |
291 | in order to become a dial-in server. If you have a card like that, | 291 | in order to become a dial-in server. If you have a card like that, |
292 | say Y here and read the file <file:Documentation/riscom8.txt>. | 292 | say Y here and read the file <file:Documentation/serial/riscom8.txt>. |
293 | 293 | ||
294 | Also it's possible to say M here and compile this driver as kernel | 294 | Also it's possible to say M here and compile this driver as kernel |
295 | loadable module; the module will be called riscom8. | 295 | loadable module; the module will be called riscom8. |
@@ -304,8 +304,8 @@ config SPECIALIX | |||
304 | your Linux box, for instance in order to become a dial-in server. | 304 | your Linux box, for instance in order to become a dial-in server. |
305 | 305 | ||
306 | If you have a card like that, say Y here and read the file | 306 | If you have a card like that, say Y here and read the file |
307 | <file:Documentation/specialix.txt>. Also it's possible to say M here | 307 | <file:Documentation/serial/specialix.txt>. Also it's possible to say |
308 | and compile this driver as kernel loadable module which will be | 308 | M here and compile this driver as kernel loadable module which will be |
309 | called specialix. | 309 | called specialix. |
310 | 310 | ||
311 | config SX | 311 | config SX |
@@ -313,7 +313,7 @@ config SX | |||
313 | depends on SERIAL_NONSTANDARD && (PCI || EISA || ISA) | 313 | depends on SERIAL_NONSTANDARD && (PCI || EISA || ISA) |
314 | help | 314 | help |
315 | This is a driver for the SX and SI multiport serial cards. | 315 | This is a driver for the SX and SI multiport serial cards. |
316 | Please read the file <file:Documentation/sx.txt> for details. | 316 | Please read the file <file:Documentation/serial/sx.txt> for details. |
317 | 317 | ||
318 | This driver can only be built as a module ( = code which can be | 318 | This driver can only be built as a module ( = code which can be |
319 | inserted in and removed from the running kernel whenever you want). | 319 | inserted in and removed from the running kernel whenever you want). |
@@ -344,8 +344,8 @@ config STALDRV | |||
344 | like this to connect more than two modems to your Linux box, for | 344 | like this to connect more than two modems to your Linux box, for |
345 | instance in order to become a dial-in server. If you say Y here, | 345 | instance in order to become a dial-in server. If you say Y here, |
346 | you will be asked for your specific card model in the next | 346 | you will be asked for your specific card model in the next |
347 | questions. Make sure to read <file:Documentation/stallion.txt> in | 347 | questions. Make sure to read <file:Documentation/serial/stallion.txt> |
348 | this case. If you have never heard about all this, it's safe to | 348 | in this case. If you have never heard about all this, it's safe to |
349 | say N. | 349 | say N. |
350 | 350 | ||
351 | config STALLION | 351 | config STALLION |
@@ -354,7 +354,7 @@ config STALLION | |||
354 | help | 354 | help |
355 | If you have an EasyIO or EasyConnection 8/32 multiport Stallion | 355 | If you have an EasyIO or EasyConnection 8/32 multiport Stallion |
356 | card, then this is for you; say Y. Make sure to read | 356 | card, then this is for you; say Y. Make sure to read |
357 | <file:Documentation/stallion.txt>. | 357 | <file:Documentation/serial/stallion.txt>. |
358 | 358 | ||
359 | To compile this driver as a module, choose M here: the | 359 | To compile this driver as a module, choose M here: the |
360 | module will be called stallion. | 360 | module will be called stallion. |
@@ -365,7 +365,7 @@ config ISTALLION | |||
365 | help | 365 | help |
366 | If you have an EasyConnection 8/64, ONboard, Brumby or Stallion | 366 | If you have an EasyConnection 8/64, ONboard, Brumby or Stallion |
367 | serial multiport card, say Y here. Make sure to read | 367 | serial multiport card, say Y here. Make sure to read |
368 | <file:Documentation/stallion.txt>. | 368 | <file:Documentation/serial/stallion.txt>. |
369 | 369 | ||
370 | To compile this driver as a module, choose M here: the | 370 | To compile this driver as a module, choose M here: the |
371 | module will be called istallion. | 371 | module will be called istallion. |
diff --git a/drivers/char/agp/uninorth-agp.c b/drivers/char/agp/uninorth-agp.c index 0f004b65ec03..03f95ec08f59 100644 --- a/drivers/char/agp/uninorth-agp.c +++ b/drivers/char/agp/uninorth-agp.c | |||
@@ -27,7 +27,7 @@ | |||
27 | static int uninorth_rev; | 27 | static int uninorth_rev; |
28 | static int is_u3; | 28 | static int is_u3; |
29 | 29 | ||
30 | static char __devinitdata *aperture = NULL; | 30 | static char *aperture = NULL; |
31 | 31 | ||
32 | static int uninorth_fetch_size(void) | 32 | static int uninorth_fetch_size(void) |
33 | { | 33 | { |
diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c index 8a59aaa21be5..7a88dfd4427b 100644 --- a/drivers/char/ipmi/ipmi_msghandler.c +++ b/drivers/char/ipmi/ipmi_msghandler.c | |||
@@ -422,9 +422,11 @@ struct ipmi_smi { | |||
422 | /** | 422 | /** |
423 | * The driver model view of the IPMI messaging driver. | 423 | * The driver model view of the IPMI messaging driver. |
424 | */ | 424 | */ |
425 | static struct device_driver ipmidriver = { | 425 | static struct platform_driver ipmidriver = { |
426 | .name = "ipmi", | 426 | .driver = { |
427 | .bus = &platform_bus_type | 427 | .name = "ipmi", |
428 | .bus = &platform_bus_type | ||
429 | } | ||
428 | }; | 430 | }; |
429 | static DEFINE_MUTEX(ipmidriver_mutex); | 431 | static DEFINE_MUTEX(ipmidriver_mutex); |
430 | 432 | ||
@@ -2384,9 +2386,9 @@ static int ipmi_bmc_register(ipmi_smi_t intf, int ifnum, | |||
2384 | * representing the interfaced BMC already | 2386 | * representing the interfaced BMC already |
2385 | */ | 2387 | */ |
2386 | if (bmc->guid_set) | 2388 | if (bmc->guid_set) |
2387 | old_bmc = ipmi_find_bmc_guid(&ipmidriver, bmc->guid); | 2389 | old_bmc = ipmi_find_bmc_guid(&ipmidriver.driver, bmc->guid); |
2388 | else | 2390 | else |
2389 | old_bmc = ipmi_find_bmc_prod_dev_id(&ipmidriver, | 2391 | old_bmc = ipmi_find_bmc_prod_dev_id(&ipmidriver.driver, |
2390 | bmc->id.product_id, | 2392 | bmc->id.product_id, |
2391 | bmc->id.device_id); | 2393 | bmc->id.device_id); |
2392 | 2394 | ||
@@ -2416,7 +2418,7 @@ static int ipmi_bmc_register(ipmi_smi_t intf, int ifnum, | |||
2416 | snprintf(name, sizeof(name), | 2418 | snprintf(name, sizeof(name), |
2417 | "ipmi_bmc.%4.4x", bmc->id.product_id); | 2419 | "ipmi_bmc.%4.4x", bmc->id.product_id); |
2418 | 2420 | ||
2419 | while (ipmi_find_bmc_prod_dev_id(&ipmidriver, | 2421 | while (ipmi_find_bmc_prod_dev_id(&ipmidriver.driver, |
2420 | bmc->id.product_id, | 2422 | bmc->id.product_id, |
2421 | bmc->id.device_id)) { | 2423 | bmc->id.device_id)) { |
2422 | if (!warn_printed) { | 2424 | if (!warn_printed) { |
@@ -2446,7 +2448,7 @@ static int ipmi_bmc_register(ipmi_smi_t intf, int ifnum, | |||
2446 | " Unable to allocate platform device\n"); | 2448 | " Unable to allocate platform device\n"); |
2447 | return -ENOMEM; | 2449 | return -ENOMEM; |
2448 | } | 2450 | } |
2449 | bmc->dev->dev.driver = &ipmidriver; | 2451 | bmc->dev->dev.driver = &ipmidriver.driver; |
2450 | dev_set_drvdata(&bmc->dev->dev, bmc); | 2452 | dev_set_drvdata(&bmc->dev->dev, bmc); |
2451 | kref_init(&bmc->refcount); | 2453 | kref_init(&bmc->refcount); |
2452 | 2454 | ||
@@ -4247,7 +4249,7 @@ static int ipmi_init_msghandler(void) | |||
4247 | if (initialized) | 4249 | if (initialized) |
4248 | return 0; | 4250 | return 0; |
4249 | 4251 | ||
4250 | rv = driver_register(&ipmidriver); | 4252 | rv = driver_register(&ipmidriver.driver); |
4251 | if (rv) { | 4253 | if (rv) { |
4252 | printk(KERN_ERR PFX "Could not register IPMI driver\n"); | 4254 | printk(KERN_ERR PFX "Could not register IPMI driver\n"); |
4253 | return rv; | 4255 | return rv; |
@@ -4308,7 +4310,7 @@ static __exit void cleanup_ipmi(void) | |||
4308 | remove_proc_entry(proc_ipmi_root->name, NULL); | 4310 | remove_proc_entry(proc_ipmi_root->name, NULL); |
4309 | #endif /* CONFIG_PROC_FS */ | 4311 | #endif /* CONFIG_PROC_FS */ |
4310 | 4312 | ||
4311 | driver_unregister(&ipmidriver); | 4313 | driver_unregister(&ipmidriver.driver); |
4312 | 4314 | ||
4313 | initialized = 0; | 4315 | initialized = 0; |
4314 | 4316 | ||
diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c index 3123bf57ad91..3000135f2ead 100644 --- a/drivers/char/ipmi/ipmi_si_intf.c +++ b/drivers/char/ipmi/ipmi_si_intf.c | |||
@@ -114,9 +114,11 @@ static char *si_to_str[] = { "kcs", "smic", "bt" }; | |||
114 | 114 | ||
115 | #define DEVICE_NAME "ipmi_si" | 115 | #define DEVICE_NAME "ipmi_si" |
116 | 116 | ||
117 | static struct device_driver ipmi_driver = { | 117 | static struct platform_driver ipmi_driver = { |
118 | .name = DEVICE_NAME, | 118 | .driver = { |
119 | .bus = &platform_bus_type | 119 | .name = DEVICE_NAME, |
120 | .bus = &platform_bus_type | ||
121 | } | ||
120 | }; | 122 | }; |
121 | 123 | ||
122 | 124 | ||
@@ -2868,7 +2870,7 @@ static int try_smi_init(struct smi_info *new_smi) | |||
2868 | goto out_err; | 2870 | goto out_err; |
2869 | } | 2871 | } |
2870 | new_smi->dev = &new_smi->pdev->dev; | 2872 | new_smi->dev = &new_smi->pdev->dev; |
2871 | new_smi->dev->driver = &ipmi_driver; | 2873 | new_smi->dev->driver = &ipmi_driver.driver; |
2872 | 2874 | ||
2873 | rv = platform_device_add(new_smi->pdev); | 2875 | rv = platform_device_add(new_smi->pdev); |
2874 | if (rv) { | 2876 | if (rv) { |
@@ -2983,7 +2985,7 @@ static __devinit int init_ipmi_si(void) | |||
2983 | initialized = 1; | 2985 | initialized = 1; |
2984 | 2986 | ||
2985 | /* Register the device drivers. */ | 2987 | /* Register the device drivers. */ |
2986 | rv = driver_register(&ipmi_driver); | 2988 | rv = driver_register(&ipmi_driver.driver); |
2987 | if (rv) { | 2989 | if (rv) { |
2988 | printk(KERN_ERR | 2990 | printk(KERN_ERR |
2989 | "init_ipmi_si: Unable to register driver: %d\n", | 2991 | "init_ipmi_si: Unable to register driver: %d\n", |
@@ -3052,7 +3054,7 @@ static __devinit int init_ipmi_si(void) | |||
3052 | #ifdef CONFIG_PPC_OF | 3054 | #ifdef CONFIG_PPC_OF |
3053 | of_unregister_platform_driver(&ipmi_of_platform_driver); | 3055 | of_unregister_platform_driver(&ipmi_of_platform_driver); |
3054 | #endif | 3056 | #endif |
3055 | driver_unregister(&ipmi_driver); | 3057 | driver_unregister(&ipmi_driver.driver); |
3056 | printk(KERN_WARNING | 3058 | printk(KERN_WARNING |
3057 | "ipmi_si: Unable to find any System Interface(s)\n"); | 3059 | "ipmi_si: Unable to find any System Interface(s)\n"); |
3058 | return -ENODEV; | 3060 | return -ENODEV; |
@@ -3151,7 +3153,7 @@ static __exit void cleanup_ipmi_si(void) | |||
3151 | cleanup_one_si(e); | 3153 | cleanup_one_si(e); |
3152 | mutex_unlock(&smi_infos_lock); | 3154 | mutex_unlock(&smi_infos_lock); |
3153 | 3155 | ||
3154 | driver_unregister(&ipmi_driver); | 3156 | driver_unregister(&ipmi_driver.driver); |
3155 | } | 3157 | } |
3156 | module_exit(cleanup_ipmi_si); | 3158 | module_exit(cleanup_ipmi_si); |
3157 | 3159 | ||
diff --git a/drivers/char/istallion.c b/drivers/char/istallion.c index 44e5d60f517e..4b10770fa937 100644 --- a/drivers/char/istallion.c +++ b/drivers/char/istallion.c | |||
@@ -3739,7 +3739,7 @@ static int stli_getbrdnr(void) | |||
3739 | * do is go probing around in the usual places hoping we can find it. | 3739 | * do is go probing around in the usual places hoping we can find it. |
3740 | */ | 3740 | */ |
3741 | 3741 | ||
3742 | static int stli_findeisabrds(void) | 3742 | static int __init stli_findeisabrds(void) |
3743 | { | 3743 | { |
3744 | struct stlibrd *brdp; | 3744 | struct stlibrd *brdp; |
3745 | unsigned int iobase, eid, i; | 3745 | unsigned int iobase, eid, i; |
@@ -3935,7 +3935,7 @@ static struct stlibrd *stli_allocbrd(void) | |||
3935 | * can find. | 3935 | * can find. |
3936 | */ | 3936 | */ |
3937 | 3937 | ||
3938 | static int stli_initbrds(void) | 3938 | static int __init stli_initbrds(void) |
3939 | { | 3939 | { |
3940 | struct stlibrd *brdp, *nxtbrdp; | 3940 | struct stlibrd *brdp, *nxtbrdp; |
3941 | struct stlconf conf; | 3941 | struct stlconf conf; |
diff --git a/drivers/char/sonypi.c b/drivers/char/sonypi.c index 2457b07dabd6..f4374437a033 100644 --- a/drivers/char/sonypi.c +++ b/drivers/char/sonypi.c | |||
@@ -523,7 +523,7 @@ static int acpi_driver_registered; | |||
523 | 523 | ||
524 | static int sonypi_ec_write(u8 addr, u8 value) | 524 | static int sonypi_ec_write(u8 addr, u8 value) |
525 | { | 525 | { |
526 | #ifdef CONFIG_ACPI_EC | 526 | #ifdef CONFIG_ACPI |
527 | if (SONYPI_ACPI_ACTIVE) | 527 | if (SONYPI_ACPI_ACTIVE) |
528 | return ec_write(addr, value); | 528 | return ec_write(addr, value); |
529 | #endif | 529 | #endif |
@@ -539,7 +539,7 @@ static int sonypi_ec_write(u8 addr, u8 value) | |||
539 | 539 | ||
540 | static int sonypi_ec_read(u8 addr, u8 *value) | 540 | static int sonypi_ec_read(u8 addr, u8 *value) |
541 | { | 541 | { |
542 | #ifdef CONFIG_ACPI_EC | 542 | #ifdef CONFIG_ACPI |
543 | if (SONYPI_ACPI_ACTIVE) | 543 | if (SONYPI_ACPI_ACTIVE) |
544 | return ec_read(addr, value); | 544 | return ec_read(addr, value); |
545 | #endif | 545 | #endif |
diff --git a/drivers/char/specialix.c b/drivers/char/specialix.c index 242fd46fda22..a16b94f12eb2 100644 --- a/drivers/char/specialix.c +++ b/drivers/char/specialix.c | |||
@@ -72,7 +72,7 @@ | |||
72 | /* | 72 | /* |
73 | * There is a bunch of documentation about the card, jumpers, config | 73 | * There is a bunch of documentation about the card, jumpers, config |
74 | * settings, restrictions, cables, device names and numbers in | 74 | * settings, restrictions, cables, device names and numbers in |
75 | * Documentation/specialix.txt | 75 | * Documentation/serial/specialix.txt |
76 | */ | 76 | */ |
77 | 77 | ||
78 | #include <linux/module.h> | 78 | #include <linux/module.h> |
diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c index 59f472143f08..1412a8d1e58d 100644 --- a/drivers/char/tty_io.c +++ b/drivers/char/tty_io.c | |||
@@ -1795,12 +1795,15 @@ retry_open: | |||
1795 | } | 1795 | } |
1796 | #endif | 1796 | #endif |
1797 | if (device == MKDEV(TTYAUX_MAJOR, 1)) { | 1797 | if (device == MKDEV(TTYAUX_MAJOR, 1)) { |
1798 | driver = tty_driver_kref_get(console_device(&index)); | 1798 | struct tty_driver *console_driver = console_device(&index); |
1799 | if (driver) { | 1799 | if (console_driver) { |
1800 | /* Don't let /dev/console block */ | 1800 | driver = tty_driver_kref_get(console_driver); |
1801 | filp->f_flags |= O_NONBLOCK; | 1801 | if (driver) { |
1802 | noctty = 1; | 1802 | /* Don't let /dev/console block */ |
1803 | goto got_driver; | 1803 | filp->f_flags |= O_NONBLOCK; |
1804 | noctty = 1; | ||
1805 | goto got_driver; | ||
1806 | } | ||
1804 | } | 1807 | } |
1805 | mutex_unlock(&tty_mutex); | 1808 | mutex_unlock(&tty_mutex); |
1806 | return -ENODEV; | 1809 | return -ENODEV; |
diff --git a/drivers/char/xilinx_hwicap/xilinx_hwicap.c b/drivers/char/xilinx_hwicap/xilinx_hwicap.c index ed132fe55d3d..d16131949097 100644 --- a/drivers/char/xilinx_hwicap/xilinx_hwicap.c +++ b/drivers/char/xilinx_hwicap/xilinx_hwicap.c | |||
@@ -626,7 +626,7 @@ static int __devinit hwicap_setup(struct device *dev, int id, | |||
626 | if (!request_mem_region(drvdata->mem_start, | 626 | if (!request_mem_region(drvdata->mem_start, |
627 | drvdata->mem_size, DRIVER_NAME)) { | 627 | drvdata->mem_size, DRIVER_NAME)) { |
628 | dev_err(dev, "Couldn't lock memory region at %Lx\n", | 628 | dev_err(dev, "Couldn't lock memory region at %Lx\n", |
629 | regs_res->start); | 629 | (unsigned long long) regs_res->start); |
630 | retval = -EBUSY; | 630 | retval = -EBUSY; |
631 | goto failed1; | 631 | goto failed1; |
632 | } | 632 | } |
@@ -645,9 +645,10 @@ static int __devinit hwicap_setup(struct device *dev, int id, | |||
645 | mutex_init(&drvdata->sem); | 645 | mutex_init(&drvdata->sem); |
646 | drvdata->is_open = 0; | 646 | drvdata->is_open = 0; |
647 | 647 | ||
648 | dev_info(dev, "ioremap %lx to %p with size %Lx\n", | 648 | dev_info(dev, "ioremap %llx to %p with size %llx\n", |
649 | (unsigned long int)drvdata->mem_start, | 649 | (unsigned long long) drvdata->mem_start, |
650 | drvdata->base_address, drvdata->mem_size); | 650 | drvdata->base_address, |
651 | (unsigned long long) drvdata->mem_size); | ||
651 | 652 | ||
652 | cdev_init(&drvdata->cdev, &hwicap_fops); | 653 | cdev_init(&drvdata->cdev, &hwicap_fops); |
653 | drvdata->cdev.owner = THIS_MODULE; | 654 | drvdata->cdev.owner = THIS_MODULE; |
diff --git a/drivers/crypto/talitos.c b/drivers/crypto/talitos.c index b6ad3ac5916e..24607669a52b 100644 --- a/drivers/crypto/talitos.c +++ b/drivers/crypto/talitos.c | |||
@@ -1357,7 +1357,7 @@ static int hw_supports(struct device *dev, __be32 desc_hdr_template) | |||
1357 | return ret; | 1357 | return ret; |
1358 | } | 1358 | } |
1359 | 1359 | ||
1360 | static int __devexit talitos_remove(struct of_device *ofdev) | 1360 | static int talitos_remove(struct of_device *ofdev) |
1361 | { | 1361 | { |
1362 | struct device *dev = &ofdev->dev; | 1362 | struct device *dev = &ofdev->dev; |
1363 | struct talitos_private *priv = dev_get_drvdata(dev); | 1363 | struct talitos_private *priv = dev_get_drvdata(dev); |
@@ -1622,7 +1622,7 @@ static struct of_platform_driver talitos_driver = { | |||
1622 | .name = "talitos", | 1622 | .name = "talitos", |
1623 | .match_table = talitos_match, | 1623 | .match_table = talitos_match, |
1624 | .probe = talitos_probe, | 1624 | .probe = talitos_probe, |
1625 | .remove = __devexit_p(talitos_remove), | 1625 | .remove = talitos_remove, |
1626 | }; | 1626 | }; |
1627 | 1627 | ||
1628 | static int __init talitos_init(void) | 1628 | static int __init talitos_init(void) |
diff --git a/drivers/dma/dmaengine.c b/drivers/dma/dmaengine.c index dc003a3a787d..5317e08221ec 100644 --- a/drivers/dma/dmaengine.c +++ b/drivers/dma/dmaengine.c | |||
@@ -399,8 +399,8 @@ int dma_async_device_register(struct dma_device *device) | |||
399 | chan->chan_id = chancnt++; | 399 | chan->chan_id = chancnt++; |
400 | chan->dev.class = &dma_devclass; | 400 | chan->dev.class = &dma_devclass; |
401 | chan->dev.parent = device->dev; | 401 | chan->dev.parent = device->dev; |
402 | snprintf(chan->dev.bus_id, BUS_ID_SIZE, "dma%dchan%d", | 402 | dev_set_name(&chan->dev, "dma%dchan%d", |
403 | device->dev_id, chan->chan_id); | 403 | device->dev_id, chan->chan_id); |
404 | 404 | ||
405 | rc = device_register(&chan->dev); | 405 | rc = device_register(&chan->dev); |
406 | if (rc) { | 406 | if (rc) { |
diff --git a/drivers/dma/dmatest.c b/drivers/dma/dmatest.c index d1e381e35a9e..ed9636bfb54a 100644 --- a/drivers/dma/dmatest.c +++ b/drivers/dma/dmatest.c | |||
@@ -20,11 +20,11 @@ static unsigned int test_buf_size = 16384; | |||
20 | module_param(test_buf_size, uint, S_IRUGO); | 20 | module_param(test_buf_size, uint, S_IRUGO); |
21 | MODULE_PARM_DESC(test_buf_size, "Size of the memcpy test buffer"); | 21 | MODULE_PARM_DESC(test_buf_size, "Size of the memcpy test buffer"); |
22 | 22 | ||
23 | static char test_channel[BUS_ID_SIZE]; | 23 | static char test_channel[20]; |
24 | module_param_string(channel, test_channel, sizeof(test_channel), S_IRUGO); | 24 | module_param_string(channel, test_channel, sizeof(test_channel), S_IRUGO); |
25 | MODULE_PARM_DESC(channel, "Bus ID of the channel to test (default: any)"); | 25 | MODULE_PARM_DESC(channel, "Bus ID of the channel to test (default: any)"); |
26 | 26 | ||
27 | static char test_device[BUS_ID_SIZE]; | 27 | static char test_device[20]; |
28 | module_param_string(device, test_device, sizeof(test_device), S_IRUGO); | 28 | module_param_string(device, test_device, sizeof(test_device), S_IRUGO); |
29 | MODULE_PARM_DESC(device, "Bus ID of the DMA Engine to test (default: any)"); | 29 | MODULE_PARM_DESC(device, "Bus ID of the DMA Engine to test (default: any)"); |
30 | 30 | ||
@@ -80,14 +80,14 @@ static bool dmatest_match_channel(struct dma_chan *chan) | |||
80 | { | 80 | { |
81 | if (test_channel[0] == '\0') | 81 | if (test_channel[0] == '\0') |
82 | return true; | 82 | return true; |
83 | return strcmp(chan->dev.bus_id, test_channel) == 0; | 83 | return strcmp(dev_name(&chan->dev), test_channel) == 0; |
84 | } | 84 | } |
85 | 85 | ||
86 | static bool dmatest_match_device(struct dma_device *device) | 86 | static bool dmatest_match_device(struct dma_device *device) |
87 | { | 87 | { |
88 | if (test_device[0] == '\0') | 88 | if (test_device[0] == '\0') |
89 | return true; | 89 | return true; |
90 | return strcmp(device->dev->bus_id, test_device) == 0; | 90 | return strcmp(dev_name(device->dev), test_device) == 0; |
91 | } | 91 | } |
92 | 92 | ||
93 | static unsigned long dmatest_random(void) | 93 | static unsigned long dmatest_random(void) |
@@ -332,7 +332,7 @@ static enum dma_state_client dmatest_add_channel(struct dma_chan *chan) | |||
332 | 332 | ||
333 | dtc = kmalloc(sizeof(struct dmatest_chan), GFP_KERNEL); | 333 | dtc = kmalloc(sizeof(struct dmatest_chan), GFP_KERNEL); |
334 | if (!dtc) { | 334 | if (!dtc) { |
335 | pr_warning("dmatest: No memory for %s\n", chan->dev.bus_id); | 335 | pr_warning("dmatest: No memory for %s\n", dev_name(&chan->dev)); |
336 | return DMA_NAK; | 336 | return DMA_NAK; |
337 | } | 337 | } |
338 | 338 | ||
@@ -343,16 +343,16 @@ static enum dma_state_client dmatest_add_channel(struct dma_chan *chan) | |||
343 | thread = kzalloc(sizeof(struct dmatest_thread), GFP_KERNEL); | 343 | thread = kzalloc(sizeof(struct dmatest_thread), GFP_KERNEL); |
344 | if (!thread) { | 344 | if (!thread) { |
345 | pr_warning("dmatest: No memory for %s-test%u\n", | 345 | pr_warning("dmatest: No memory for %s-test%u\n", |
346 | chan->dev.bus_id, i); | 346 | dev_name(&chan->dev), i); |
347 | break; | 347 | break; |
348 | } | 348 | } |
349 | thread->chan = dtc->chan; | 349 | thread->chan = dtc->chan; |
350 | smp_wmb(); | 350 | smp_wmb(); |
351 | thread->task = kthread_run(dmatest_func, thread, "%s-test%u", | 351 | thread->task = kthread_run(dmatest_func, thread, "%s-test%u", |
352 | chan->dev.bus_id, i); | 352 | dev_name(&chan->dev), i); |
353 | if (IS_ERR(thread->task)) { | 353 | if (IS_ERR(thread->task)) { |
354 | pr_warning("dmatest: Failed to run thread %s-test%u\n", | 354 | pr_warning("dmatest: Failed to run thread %s-test%u\n", |
355 | chan->dev.bus_id, i); | 355 | dev_name(&chan->dev), i); |
356 | kfree(thread); | 356 | kfree(thread); |
357 | break; | 357 | break; |
358 | } | 358 | } |
@@ -362,7 +362,7 @@ static enum dma_state_client dmatest_add_channel(struct dma_chan *chan) | |||
362 | list_add_tail(&thread->node, &dtc->threads); | 362 | list_add_tail(&thread->node, &dtc->threads); |
363 | } | 363 | } |
364 | 364 | ||
365 | pr_info("dmatest: Started %u threads using %s\n", i, chan->dev.bus_id); | 365 | pr_info("dmatest: Started %u threads using %s\n", i, dev_name(&chan->dev)); |
366 | 366 | ||
367 | list_add_tail(&dtc->node, &dmatest_channels); | 367 | list_add_tail(&dtc->node, &dmatest_channels); |
368 | nr_channels++; | 368 | nr_channels++; |
@@ -379,7 +379,7 @@ static enum dma_state_client dmatest_remove_channel(struct dma_chan *chan) | |||
379 | list_del(&dtc->node); | 379 | list_del(&dtc->node); |
380 | dmatest_cleanup_channel(dtc); | 380 | dmatest_cleanup_channel(dtc); |
381 | pr_debug("dmatest: lost channel %s\n", | 381 | pr_debug("dmatest: lost channel %s\n", |
382 | chan->dev.bus_id); | 382 | dev_name(&chan->dev)); |
383 | return DMA_ACK; | 383 | return DMA_ACK; |
384 | } | 384 | } |
385 | } | 385 | } |
@@ -418,7 +418,7 @@ dmatest_event(struct dma_client *client, struct dma_chan *chan, | |||
418 | 418 | ||
419 | default: | 419 | default: |
420 | pr_info("dmatest: Unhandled event %u (%s)\n", | 420 | pr_info("dmatest: Unhandled event %u (%s)\n", |
421 | state, chan->dev.bus_id); | 421 | state, dev_name(&chan->dev)); |
422 | break; | 422 | break; |
423 | } | 423 | } |
424 | 424 | ||
diff --git a/drivers/dma/iop-adma.c b/drivers/dma/iop-adma.c index 71fba82462cb..c7a9306d951d 100644 --- a/drivers/dma/iop-adma.c +++ b/drivers/dma/iop-adma.c | |||
@@ -411,6 +411,7 @@ iop_adma_tx_submit(struct dma_async_tx_descriptor *tx) | |||
411 | int slot_cnt; | 411 | int slot_cnt; |
412 | int slots_per_op; | 412 | int slots_per_op; |
413 | dma_cookie_t cookie; | 413 | dma_cookie_t cookie; |
414 | dma_addr_t next_dma; | ||
414 | 415 | ||
415 | grp_start = sw_desc->group_head; | 416 | grp_start = sw_desc->group_head; |
416 | slot_cnt = grp_start->slot_cnt; | 417 | slot_cnt = grp_start->slot_cnt; |
@@ -425,12 +426,12 @@ iop_adma_tx_submit(struct dma_async_tx_descriptor *tx) | |||
425 | &old_chain_tail->chain_node); | 426 | &old_chain_tail->chain_node); |
426 | 427 | ||
427 | /* fix up the hardware chain */ | 428 | /* fix up the hardware chain */ |
428 | iop_desc_set_next_desc(old_chain_tail, grp_start->async_tx.phys); | 429 | next_dma = grp_start->async_tx.phys; |
430 | iop_desc_set_next_desc(old_chain_tail, next_dma); | ||
431 | BUG_ON(iop_desc_get_next_desc(old_chain_tail) != next_dma); /* flush */ | ||
429 | 432 | ||
430 | /* 1/ don't add pre-chained descriptors | 433 | /* check for pre-chained descriptors */ |
431 | * 2/ dummy read to flush next_desc write | 434 | iop_paranoia(iop_desc_get_next_desc(sw_desc)); |
432 | */ | ||
433 | BUG_ON(iop_desc_get_next_desc(sw_desc)); | ||
434 | 435 | ||
435 | /* increment the pending count by the number of slots | 436 | /* increment the pending count by the number of slots |
436 | * memcpy operations have a 1:1 (slot:operation) relation | 437 | * memcpy operations have a 1:1 (slot:operation) relation |
diff --git a/drivers/edac/i5000_edac.c b/drivers/edac/i5000_edac.c index f0d9b415db50..d335086f4a26 100644 --- a/drivers/edac/i5000_edac.c +++ b/drivers/edac/i5000_edac.c | |||
@@ -1381,6 +1381,7 @@ static int i5000_probe1(struct pci_dev *pdev, int dev_idx) | |||
1381 | if (mci == NULL) | 1381 | if (mci == NULL) |
1382 | return -ENOMEM; | 1382 | return -ENOMEM; |
1383 | 1383 | ||
1384 | kobject_get(&mci->edac_mci_kobj); | ||
1384 | debugf0("MC: " __FILE__ ": %s(): mci = %p\n", __func__, mci); | 1385 | debugf0("MC: " __FILE__ ": %s(): mci = %p\n", __func__, mci); |
1385 | 1386 | ||
1386 | mci->dev = &pdev->dev; /* record ptr to the generic device */ | 1387 | mci->dev = &pdev->dev; /* record ptr to the generic device */ |
@@ -1453,6 +1454,7 @@ fail1: | |||
1453 | i5000_put_devices(mci); | 1454 | i5000_put_devices(mci); |
1454 | 1455 | ||
1455 | fail0: | 1456 | fail0: |
1457 | kobject_put(&mci->edac_mci_kobj); | ||
1456 | edac_mc_free(mci); | 1458 | edac_mc_free(mci); |
1457 | return -ENODEV; | 1459 | return -ENODEV; |
1458 | } | 1460 | } |
@@ -1498,7 +1500,7 @@ static void __devexit i5000_remove_one(struct pci_dev *pdev) | |||
1498 | 1500 | ||
1499 | /* retrieve references to resources, and free those resources */ | 1501 | /* retrieve references to resources, and free those resources */ |
1500 | i5000_put_devices(mci); | 1502 | i5000_put_devices(mci); |
1501 | 1503 | kobject_put(&mci->edac_mci_kobj); | |
1502 | edac_mc_free(mci); | 1504 | edac_mc_free(mci); |
1503 | } | 1505 | } |
1504 | 1506 | ||
diff --git a/drivers/edac/i82875p_edac.c b/drivers/edac/i82875p_edac.c index e43bdc43a1bf..ebb037b78758 100644 --- a/drivers/edac/i82875p_edac.c +++ b/drivers/edac/i82875p_edac.c | |||
@@ -182,8 +182,6 @@ static struct pci_dev *mci_pdev; /* init dev: in case that AGP code has | |||
182 | * already registered driver | 182 | * already registered driver |
183 | */ | 183 | */ |
184 | 184 | ||
185 | static int i82875p_registered = 1; | ||
186 | |||
187 | static struct edac_pci_ctl_info *i82875p_pci; | 185 | static struct edac_pci_ctl_info *i82875p_pci; |
188 | 186 | ||
189 | static void i82875p_get_error_info(struct mem_ctl_info *mci, | 187 | static void i82875p_get_error_info(struct mem_ctl_info *mci, |
@@ -295,6 +293,7 @@ static int i82875p_setup_overfl_dev(struct pci_dev *pdev, | |||
295 | "%s(): pci_bus_add_device() Failed\n", | 293 | "%s(): pci_bus_add_device() Failed\n", |
296 | __func__); | 294 | __func__); |
297 | } | 295 | } |
296 | pci_bus_assign_resources(dev->bus); | ||
298 | } | 297 | } |
299 | 298 | ||
300 | *ovrfl_pdev = dev; | 299 | *ovrfl_pdev = dev; |
@@ -409,6 +408,9 @@ static int i82875p_probe1(struct pci_dev *pdev, int dev_idx) | |||
409 | goto fail0; | 408 | goto fail0; |
410 | } | 409 | } |
411 | 410 | ||
411 | /* Keeps mci available after edac_mc_del_mc() till edac_mc_free() */ | ||
412 | kobject_get(&mci->edac_mci_kobj); | ||
413 | |||
412 | debugf3("%s(): init mci\n", __func__); | 414 | debugf3("%s(): init mci\n", __func__); |
413 | mci->dev = &pdev->dev; | 415 | mci->dev = &pdev->dev; |
414 | mci->mtype_cap = MEM_FLAG_DDR; | 416 | mci->mtype_cap = MEM_FLAG_DDR; |
@@ -451,6 +453,7 @@ static int i82875p_probe1(struct pci_dev *pdev, int dev_idx) | |||
451 | return 0; | 453 | return 0; |
452 | 454 | ||
453 | fail1: | 455 | fail1: |
456 | kobject_put(&mci->edac_mci_kobj); | ||
454 | edac_mc_free(mci); | 457 | edac_mc_free(mci); |
455 | 458 | ||
456 | fail0: | 459 | fail0: |
@@ -578,12 +581,11 @@ static void __exit i82875p_exit(void) | |||
578 | { | 581 | { |
579 | debugf3("%s()\n", __func__); | 582 | debugf3("%s()\n", __func__); |
580 | 583 | ||
584 | i82875p_remove_one(mci_pdev); | ||
585 | pci_dev_put(mci_pdev); | ||
586 | |||
581 | pci_unregister_driver(&i82875p_driver); | 587 | pci_unregister_driver(&i82875p_driver); |
582 | 588 | ||
583 | if (!i82875p_registered) { | ||
584 | i82875p_remove_one(mci_pdev); | ||
585 | pci_dev_put(mci_pdev); | ||
586 | } | ||
587 | } | 589 | } |
588 | 590 | ||
589 | module_init(i82875p_init); | 591 | module_init(i82875p_init); |
diff --git a/drivers/firewire/fw-sbp2.c b/drivers/firewire/fw-sbp2.c index 97df6dac3a82..e54403ee59e7 100644 --- a/drivers/firewire/fw-sbp2.c +++ b/drivers/firewire/fw-sbp2.c | |||
@@ -372,6 +372,11 @@ static const struct { | |||
372 | }, | 372 | }, |
373 | /* iPod mini */ { | 373 | /* iPod mini */ { |
374 | .firmware_revision = 0x0a2700, | 374 | .firmware_revision = 0x0a2700, |
375 | .model = 0x000022, | ||
376 | .workarounds = SBP2_WORKAROUND_FIX_CAPACITY, | ||
377 | }, | ||
378 | /* iPod mini */ { | ||
379 | .firmware_revision = 0x0a2700, | ||
375 | .model = 0x000023, | 380 | .model = 0x000023, |
376 | .workarounds = SBP2_WORKAROUND_FIX_CAPACITY, | 381 | .workarounds = SBP2_WORKAROUND_FIX_CAPACITY, |
377 | }, | 382 | }, |
diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig index 7f2ee27fe76b..48f49d93d249 100644 --- a/drivers/gpio/Kconfig +++ b/drivers/gpio/Kconfig | |||
@@ -65,6 +65,14 @@ config GPIO_SYSFS | |||
65 | 65 | ||
66 | # put expanders in the right section, in alphabetical order | 66 | # put expanders in the right section, in alphabetical order |
67 | 67 | ||
68 | comment "Memory mapped GPIO expanders:" | ||
69 | |||
70 | config GPIO_XILINX | ||
71 | bool "Xilinx GPIO support" | ||
72 | depends on PPC_OF | ||
73 | help | ||
74 | Say yes here to support the Xilinx FPGA GPIO device | ||
75 | |||
68 | comment "I2C GPIO expanders:" | 76 | comment "I2C GPIO expanders:" |
69 | 77 | ||
70 | config GPIO_MAX732X | 78 | config GPIO_MAX732X |
diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile index 6aafdeb9ad03..49ac64e515e6 100644 --- a/drivers/gpio/Makefile +++ b/drivers/gpio/Makefile | |||
@@ -10,4 +10,5 @@ obj-$(CONFIG_GPIO_MCP23S08) += mcp23s08.o | |||
10 | obj-$(CONFIG_GPIO_PCA953X) += pca953x.o | 10 | obj-$(CONFIG_GPIO_PCA953X) += pca953x.o |
11 | obj-$(CONFIG_GPIO_PCF857X) += pcf857x.o | 11 | obj-$(CONFIG_GPIO_PCF857X) += pcf857x.o |
12 | obj-$(CONFIG_GPIO_TWL4030) += twl4030-gpio.o | 12 | obj-$(CONFIG_GPIO_TWL4030) += twl4030-gpio.o |
13 | obj-$(CONFIG_GPIO_XILINX) += xilinx_gpio.o | ||
13 | obj-$(CONFIG_GPIO_BT8XX) += bt8xxgpio.o | 14 | obj-$(CONFIG_GPIO_BT8XX) += bt8xxgpio.o |
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index faa1cc66e9cf..82020abc329e 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c | |||
@@ -1134,7 +1134,7 @@ static void gpiolib_dbg_show(struct seq_file *s, struct gpio_chip *chip) | |||
1134 | continue; | 1134 | continue; |
1135 | 1135 | ||
1136 | is_out = test_bit(FLAG_IS_OUT, &gdesc->flags); | 1136 | is_out = test_bit(FLAG_IS_OUT, &gdesc->flags); |
1137 | seq_printf(s, " gpio-%-3d (%-12s) %s %s", | 1137 | seq_printf(s, " gpio-%-3d (%-20.20s) %s %s", |
1138 | gpio, gdesc->label, | 1138 | gpio, gdesc->label, |
1139 | is_out ? "out" : "in ", | 1139 | is_out ? "out" : "in ", |
1140 | chip->get | 1140 | chip->get |
diff --git a/drivers/gpio/xilinx_gpio.c b/drivers/gpio/xilinx_gpio.c new file mode 100644 index 000000000000..3c1177abebd3 --- /dev/null +++ b/drivers/gpio/xilinx_gpio.c | |||
@@ -0,0 +1,235 @@ | |||
1 | /* | ||
2 | * Xilinx gpio driver | ||
3 | * | ||
4 | * Copyright 2008 Xilinx, Inc. | ||
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 version 2 | ||
8 | * as published by the Free Software Foundation. | ||
9 | * | ||
10 | * You should have received a copy of the GNU General Public License | ||
11 | * along with this program; if not, write to the Free Software | ||
12 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
13 | */ | ||
14 | |||
15 | #include <linux/init.h> | ||
16 | #include <linux/errno.h> | ||
17 | #include <linux/of_device.h> | ||
18 | #include <linux/of_platform.h> | ||
19 | #include <linux/of_gpio.h> | ||
20 | #include <linux/io.h> | ||
21 | #include <linux/gpio.h> | ||
22 | |||
23 | /* Register Offset Definitions */ | ||
24 | #define XGPIO_DATA_OFFSET (0x0) /* Data register */ | ||
25 | #define XGPIO_TRI_OFFSET (0x4) /* I/O direction register */ | ||
26 | |||
27 | struct xgpio_instance { | ||
28 | struct of_mm_gpio_chip mmchip; | ||
29 | u32 gpio_state; /* GPIO state shadow register */ | ||
30 | u32 gpio_dir; /* GPIO direction shadow register */ | ||
31 | spinlock_t gpio_lock; /* Lock used for synchronization */ | ||
32 | }; | ||
33 | |||
34 | /** | ||
35 | * xgpio_get - Read the specified signal of the GPIO device. | ||
36 | * @gc: Pointer to gpio_chip device structure. | ||
37 | * @gpio: GPIO signal number. | ||
38 | * | ||
39 | * This function reads the specified signal of the GPIO device. It returns 0 if | ||
40 | * the signal clear, 1 if signal is set or negative value on error. | ||
41 | */ | ||
42 | static int xgpio_get(struct gpio_chip *gc, unsigned int gpio) | ||
43 | { | ||
44 | struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc); | ||
45 | |||
46 | return (in_be32(mm_gc->regs + XGPIO_DATA_OFFSET) >> gpio) & 1; | ||
47 | } | ||
48 | |||
49 | /** | ||
50 | * xgpio_set - Write the specified signal of the GPIO device. | ||
51 | * @gc: Pointer to gpio_chip device structure. | ||
52 | * @gpio: GPIO signal number. | ||
53 | * @val: Value to be written to specified signal. | ||
54 | * | ||
55 | * This function writes the specified value in to the specified signal of the | ||
56 | * GPIO device. | ||
57 | */ | ||
58 | static void xgpio_set(struct gpio_chip *gc, unsigned int gpio, int val) | ||
59 | { | ||
60 | unsigned long flags; | ||
61 | struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc); | ||
62 | struct xgpio_instance *chip = | ||
63 | container_of(mm_gc, struct xgpio_instance, mmchip); | ||
64 | |||
65 | spin_lock_irqsave(&chip->gpio_lock, flags); | ||
66 | |||
67 | /* Write to GPIO signal and set its direction to output */ | ||
68 | if (val) | ||
69 | chip->gpio_state |= 1 << gpio; | ||
70 | else | ||
71 | chip->gpio_state &= ~(1 << gpio); | ||
72 | out_be32(mm_gc->regs + XGPIO_DATA_OFFSET, chip->gpio_state); | ||
73 | |||
74 | spin_unlock_irqrestore(&chip->gpio_lock, flags); | ||
75 | } | ||
76 | |||
77 | /** | ||
78 | * xgpio_dir_in - Set the direction of the specified GPIO signal as input. | ||
79 | * @gc: Pointer to gpio_chip device structure. | ||
80 | * @gpio: GPIO signal number. | ||
81 | * | ||
82 | * This function sets the direction of specified GPIO signal as input. | ||
83 | * It returns 0 if direction of GPIO signals is set as input otherwise it | ||
84 | * returns negative error value. | ||
85 | */ | ||
86 | static int xgpio_dir_in(struct gpio_chip *gc, unsigned int gpio) | ||
87 | { | ||
88 | unsigned long flags; | ||
89 | struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc); | ||
90 | struct xgpio_instance *chip = | ||
91 | container_of(mm_gc, struct xgpio_instance, mmchip); | ||
92 | |||
93 | spin_lock_irqsave(&chip->gpio_lock, flags); | ||
94 | |||
95 | /* Set the GPIO bit in shadow register and set direction as input */ | ||
96 | chip->gpio_dir |= (1 << gpio); | ||
97 | out_be32(mm_gc->regs + XGPIO_TRI_OFFSET, chip->gpio_dir); | ||
98 | |||
99 | spin_unlock_irqrestore(&chip->gpio_lock, flags); | ||
100 | |||
101 | return 0; | ||
102 | } | ||
103 | |||
104 | /** | ||
105 | * xgpio_dir_out - Set the direction of the specified GPIO signal as output. | ||
106 | * @gc: Pointer to gpio_chip device structure. | ||
107 | * @gpio: GPIO signal number. | ||
108 | * @val: Value to be written to specified signal. | ||
109 | * | ||
110 | * This function sets the direction of specified GPIO signal as output. If all | ||
111 | * GPIO signals of GPIO chip is configured as input then it returns | ||
112 | * error otherwise it returns 0. | ||
113 | */ | ||
114 | static int xgpio_dir_out(struct gpio_chip *gc, unsigned int gpio, int val) | ||
115 | { | ||
116 | unsigned long flags; | ||
117 | struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc); | ||
118 | struct xgpio_instance *chip = | ||
119 | container_of(mm_gc, struct xgpio_instance, mmchip); | ||
120 | |||
121 | spin_lock_irqsave(&chip->gpio_lock, flags); | ||
122 | |||
123 | /* Write state of GPIO signal */ | ||
124 | if (val) | ||
125 | chip->gpio_state |= 1 << gpio; | ||
126 | else | ||
127 | chip->gpio_state &= ~(1 << gpio); | ||
128 | out_be32(mm_gc->regs + XGPIO_DATA_OFFSET, chip->gpio_state); | ||
129 | |||
130 | /* Clear the GPIO bit in shadow register and set direction as output */ | ||
131 | chip->gpio_dir &= (~(1 << gpio)); | ||
132 | out_be32(mm_gc->regs + XGPIO_TRI_OFFSET, chip->gpio_dir); | ||
133 | |||
134 | spin_unlock_irqrestore(&chip->gpio_lock, flags); | ||
135 | |||
136 | return 0; | ||
137 | } | ||
138 | |||
139 | /** | ||
140 | * xgpio_save_regs - Set initial values of GPIO pins | ||
141 | * @mm_gc: pointer to memory mapped GPIO chip structure | ||
142 | */ | ||
143 | static void xgpio_save_regs(struct of_mm_gpio_chip *mm_gc) | ||
144 | { | ||
145 | struct xgpio_instance *chip = | ||
146 | container_of(mm_gc, struct xgpio_instance, mmchip); | ||
147 | |||
148 | out_be32(mm_gc->regs + XGPIO_DATA_OFFSET, chip->gpio_state); | ||
149 | out_be32(mm_gc->regs + XGPIO_TRI_OFFSET, chip->gpio_dir); | ||
150 | } | ||
151 | |||
152 | /** | ||
153 | * xgpio_of_probe - Probe method for the GPIO device. | ||
154 | * @np: pointer to device tree node | ||
155 | * | ||
156 | * This function probes the GPIO device in the device tree. It initializes the | ||
157 | * driver data structure. It returns 0, if the driver is bound to the GPIO | ||
158 | * device, or a negative value if there is an error. | ||
159 | */ | ||
160 | static int __devinit xgpio_of_probe(struct device_node *np) | ||
161 | { | ||
162 | struct xgpio_instance *chip; | ||
163 | struct of_gpio_chip *ofchip; | ||
164 | int status = 0; | ||
165 | const u32 *tree_info; | ||
166 | |||
167 | chip = kzalloc(sizeof(*chip), GFP_KERNEL); | ||
168 | if (!chip) | ||
169 | return -ENOMEM; | ||
170 | ofchip = &chip->mmchip.of_gc; | ||
171 | |||
172 | /* Update GPIO state shadow register with default value */ | ||
173 | tree_info = of_get_property(np, "xlnx,dout-default", NULL); | ||
174 | if (tree_info) | ||
175 | chip->gpio_state = *tree_info; | ||
176 | |||
177 | /* Update GPIO direction shadow register with default value */ | ||
178 | chip->gpio_dir = 0xFFFFFFFF; /* By default, all pins are inputs */ | ||
179 | tree_info = of_get_property(np, "xlnx,tri-default", NULL); | ||
180 | if (tree_info) | ||
181 | chip->gpio_dir = *tree_info; | ||
182 | |||
183 | /* Check device node and parent device node for device width */ | ||
184 | ofchip->gc.ngpio = 32; /* By default assume full GPIO controller */ | ||
185 | tree_info = of_get_property(np, "xlnx,gpio-width", NULL); | ||
186 | if (!tree_info) | ||
187 | tree_info = of_get_property(np->parent, | ||
188 | "xlnx,gpio-width", NULL); | ||
189 | if (tree_info) | ||
190 | ofchip->gc.ngpio = *tree_info; | ||
191 | |||
192 | spin_lock_init(&chip->gpio_lock); | ||
193 | |||
194 | ofchip->gpio_cells = 2; | ||
195 | ofchip->gc.direction_input = xgpio_dir_in; | ||
196 | ofchip->gc.direction_output = xgpio_dir_out; | ||
197 | ofchip->gc.get = xgpio_get; | ||
198 | ofchip->gc.set = xgpio_set; | ||
199 | |||
200 | chip->mmchip.save_regs = xgpio_save_regs; | ||
201 | |||
202 | /* Call the OF gpio helper to setup and register the GPIO device */ | ||
203 | status = of_mm_gpiochip_add(np, &chip->mmchip); | ||
204 | if (status) { | ||
205 | kfree(chip); | ||
206 | pr_err("%s: error in probe function with status %d\n", | ||
207 | np->full_name, status); | ||
208 | return status; | ||
209 | } | ||
210 | pr_info("XGpio: %s: registered\n", np->full_name); | ||
211 | return 0; | ||
212 | } | ||
213 | |||
214 | static struct of_device_id xgpio_of_match[] __devinitdata = { | ||
215 | { .compatible = "xlnx,xps-gpio-1.00.a", }, | ||
216 | { /* end of list */ }, | ||
217 | }; | ||
218 | |||
219 | static int __init xgpio_init(void) | ||
220 | { | ||
221 | struct device_node *np; | ||
222 | |||
223 | for_each_matching_node(np, xgpio_of_match) | ||
224 | xgpio_of_probe(np); | ||
225 | |||
226 | return 0; | ||
227 | } | ||
228 | |||
229 | /* Make sure we get initialized before anyone else tries to use us */ | ||
230 | subsys_initcall(xgpio_init); | ||
231 | /* No exit call at the moment as we cannot unregister of GPIO chips */ | ||
232 | |||
233 | MODULE_AUTHOR("Xilinx, Inc."); | ||
234 | MODULE_DESCRIPTION("Xilinx GPIO driver"); | ||
235 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c index 3ab1e9cc4692..996097acb5e7 100644 --- a/drivers/gpu/drm/drm_drv.c +++ b/drivers/gpu/drm/drm_drv.c | |||
@@ -305,6 +305,8 @@ static void drm_cleanup(struct drm_device * dev) | |||
305 | return; | 305 | return; |
306 | } | 306 | } |
307 | 307 | ||
308 | drm_vblank_cleanup(dev); | ||
309 | |||
308 | drm_lastclose(dev); | 310 | drm_lastclose(dev); |
309 | 311 | ||
310 | if (drm_core_has_MTRR(dev) && drm_core_has_AGP(dev) && | 312 | if (drm_core_has_MTRR(dev) && drm_core_has_AGP(dev) && |
diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c index 15c8dabc3e97..1e787f894b3c 100644 --- a/drivers/gpu/drm/drm_irq.c +++ b/drivers/gpu/drm/drm_irq.c | |||
@@ -94,7 +94,7 @@ static void vblank_disable_fn(unsigned long arg) | |||
94 | } | 94 | } |
95 | } | 95 | } |
96 | 96 | ||
97 | static void drm_vblank_cleanup(struct drm_device *dev) | 97 | void drm_vblank_cleanup(struct drm_device *dev) |
98 | { | 98 | { |
99 | /* Bail if the driver didn't call drm_vblank_init() */ | 99 | /* Bail if the driver didn't call drm_vblank_init() */ |
100 | if (dev->num_crtcs == 0) | 100 | if (dev->num_crtcs == 0) |
@@ -278,8 +278,6 @@ int drm_irq_uninstall(struct drm_device * dev) | |||
278 | 278 | ||
279 | free_irq(dev->pdev->irq, dev); | 279 | free_irq(dev->pdev->irq, dev); |
280 | 280 | ||
281 | drm_vblank_cleanup(dev); | ||
282 | |||
283 | return 0; | 281 | return 0; |
284 | } | 282 | } |
285 | EXPORT_SYMBOL(drm_irq_uninstall); | 283 | EXPORT_SYMBOL(drm_irq_uninstall); |
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index 0d215e38606a..ba89b42f790a 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c | |||
@@ -856,6 +856,13 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) | |||
856 | 856 | ||
857 | spin_lock_init(&dev_priv->user_irq_lock); | 857 | spin_lock_init(&dev_priv->user_irq_lock); |
858 | 858 | ||
859 | ret = drm_vblank_init(dev, I915_NUM_PIPE); | ||
860 | |||
861 | if (ret) { | ||
862 | (void) i915_driver_unload(dev); | ||
863 | return ret; | ||
864 | } | ||
865 | |||
859 | return ret; | 866 | return ret; |
860 | } | 867 | } |
861 | 868 | ||
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index ef1c0b8f8d07..0a4f39b9a0ec 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
@@ -47,6 +47,8 @@ enum pipe { | |||
47 | PIPE_B, | 47 | PIPE_B, |
48 | }; | 48 | }; |
49 | 49 | ||
50 | #define I915_NUM_PIPE 2 | ||
51 | |||
50 | /* Interface history: | 52 | /* Interface history: |
51 | * | 53 | * |
52 | * 1.1: Original. | 54 | * 1.1: Original. |
@@ -132,6 +134,7 @@ typedef struct drm_i915_private { | |||
132 | int user_irq_refcount; | 134 | int user_irq_refcount; |
133 | /** Cached value of IMR to avoid reads in updating the bitfield */ | 135 | /** Cached value of IMR to avoid reads in updating the bitfield */ |
134 | u32 irq_mask_reg; | 136 | u32 irq_mask_reg; |
137 | u32 pipestat[2]; | ||
135 | 138 | ||
136 | int tex_lru_log_granularity; | 139 | int tex_lru_log_granularity; |
137 | int allow_batchbuffer; | 140 | int allow_batchbuffer; |
@@ -147,6 +150,7 @@ typedef struct drm_i915_private { | |||
147 | u32 saveDSPBCNTR; | 150 | u32 saveDSPBCNTR; |
148 | u32 saveDSPARB; | 151 | u32 saveDSPARB; |
149 | u32 saveRENDERSTANDBY; | 152 | u32 saveRENDERSTANDBY; |
153 | u32 saveHWS; | ||
150 | u32 savePIPEACONF; | 154 | u32 savePIPEACONF; |
151 | u32 savePIPEBCONF; | 155 | u32 savePIPEBCONF; |
152 | u32 savePIPEASRC; | 156 | u32 savePIPEASRC; |
@@ -446,6 +450,13 @@ extern int i915_vblank_swap(struct drm_device *dev, void *data, | |||
446 | struct drm_file *file_priv); | 450 | struct drm_file *file_priv); |
447 | extern void i915_enable_irq(drm_i915_private_t *dev_priv, u32 mask); | 451 | extern void i915_enable_irq(drm_i915_private_t *dev_priv, u32 mask); |
448 | 452 | ||
453 | void | ||
454 | i915_enable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask); | ||
455 | |||
456 | void | ||
457 | i915_disable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask); | ||
458 | |||
459 | |||
449 | /* i915_mem.c */ | 460 | /* i915_mem.c */ |
450 | extern int i915_mem_alloc(struct drm_device *dev, void *data, | 461 | extern int i915_mem_alloc(struct drm_device *dev, void *data, |
451 | struct drm_file *file_priv); | 462 | struct drm_file *file_priv); |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 6b4a2bd20640..d58ddef468f8 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
@@ -31,6 +31,8 @@ | |||
31 | #include "i915_drv.h" | 31 | #include "i915_drv.h" |
32 | #include <linux/swap.h> | 32 | #include <linux/swap.h> |
33 | 33 | ||
34 | #define I915_GEM_GPU_DOMAINS (~(I915_GEM_DOMAIN_CPU | I915_GEM_DOMAIN_GTT)) | ||
35 | |||
34 | static int | 36 | static int |
35 | i915_gem_object_set_domain(struct drm_gem_object *obj, | 37 | i915_gem_object_set_domain(struct drm_gem_object *obj, |
36 | uint32_t read_domains, | 38 | uint32_t read_domains, |
@@ -83,20 +85,14 @@ int | |||
83 | i915_gem_get_aperture_ioctl(struct drm_device *dev, void *data, | 85 | i915_gem_get_aperture_ioctl(struct drm_device *dev, void *data, |
84 | struct drm_file *file_priv) | 86 | struct drm_file *file_priv) |
85 | { | 87 | { |
86 | drm_i915_private_t *dev_priv = dev->dev_private; | ||
87 | struct drm_i915_gem_get_aperture *args = data; | 88 | struct drm_i915_gem_get_aperture *args = data; |
88 | struct drm_i915_gem_object *obj_priv; | ||
89 | 89 | ||
90 | if (!(dev->driver->driver_features & DRIVER_GEM)) | 90 | if (!(dev->driver->driver_features & DRIVER_GEM)) |
91 | return -ENODEV; | 91 | return -ENODEV; |
92 | 92 | ||
93 | args->aper_size = dev->gtt_total; | 93 | args->aper_size = dev->gtt_total; |
94 | args->aper_available_size = args->aper_size; | 94 | args->aper_available_size = (args->aper_size - |
95 | 95 | atomic_read(&dev->pin_memory)); | |
96 | list_for_each_entry(obj_priv, &dev_priv->mm.active_list, list) { | ||
97 | if (obj_priv->pin_count > 0) | ||
98 | args->aper_available_size -= obj_priv->obj->size; | ||
99 | } | ||
100 | 96 | ||
101 | return 0; | 97 | return 0; |
102 | } | 98 | } |
@@ -1870,17 +1866,6 @@ i915_gem_execbuffer(struct drm_device *dev, void *data, | |||
1870 | 1866 | ||
1871 | for (i = 0; i < args->buffer_count; i++) { | 1867 | for (i = 0; i < args->buffer_count; i++) { |
1872 | struct drm_gem_object *obj = object_list[i]; | 1868 | struct drm_gem_object *obj = object_list[i]; |
1873 | struct drm_i915_gem_object *obj_priv = obj->driver_private; | ||
1874 | |||
1875 | if (obj_priv->gtt_space == NULL) { | ||
1876 | /* We evicted the buffer in the process of validating | ||
1877 | * our set of buffers in. We could try to recover by | ||
1878 | * kicking them everything out and trying again from | ||
1879 | * the start. | ||
1880 | */ | ||
1881 | ret = -ENOMEM; | ||
1882 | goto err; | ||
1883 | } | ||
1884 | 1869 | ||
1885 | /* make sure all previous memory operations have passed */ | 1870 | /* make sure all previous memory operations have passed */ |
1886 | ret = i915_gem_object_set_domain(obj, | 1871 | ret = i915_gem_object_set_domain(obj, |
@@ -2299,29 +2284,52 @@ i915_gem_idle(struct drm_device *dev) | |||
2299 | 2284 | ||
2300 | i915_gem_retire_requests(dev); | 2285 | i915_gem_retire_requests(dev); |
2301 | 2286 | ||
2302 | /* Active and flushing should now be empty as we've | 2287 | if (!dev_priv->mm.wedged) { |
2303 | * waited for a sequence higher than any pending execbuffer | 2288 | /* Active and flushing should now be empty as we've |
2304 | */ | 2289 | * waited for a sequence higher than any pending execbuffer |
2305 | BUG_ON(!list_empty(&dev_priv->mm.active_list)); | 2290 | */ |
2306 | BUG_ON(!list_empty(&dev_priv->mm.flushing_list)); | 2291 | WARN_ON(!list_empty(&dev_priv->mm.active_list)); |
2292 | WARN_ON(!list_empty(&dev_priv->mm.flushing_list)); | ||
2293 | /* Request should now be empty as we've also waited | ||
2294 | * for the last request in the list | ||
2295 | */ | ||
2296 | WARN_ON(!list_empty(&dev_priv->mm.request_list)); | ||
2297 | } | ||
2307 | 2298 | ||
2308 | /* Request should now be empty as we've also waited | 2299 | /* Empty the active and flushing lists to inactive. If there's |
2309 | * for the last request in the list | 2300 | * anything left at this point, it means that we're wedged and |
2301 | * nothing good's going to happen by leaving them there. So strip | ||
2302 | * the GPU domains and just stuff them onto inactive. | ||
2310 | */ | 2303 | */ |
2311 | BUG_ON(!list_empty(&dev_priv->mm.request_list)); | 2304 | while (!list_empty(&dev_priv->mm.active_list)) { |
2305 | struct drm_i915_gem_object *obj_priv; | ||
2306 | |||
2307 | obj_priv = list_first_entry(&dev_priv->mm.active_list, | ||
2308 | struct drm_i915_gem_object, | ||
2309 | list); | ||
2310 | obj_priv->obj->write_domain &= ~I915_GEM_GPU_DOMAINS; | ||
2311 | i915_gem_object_move_to_inactive(obj_priv->obj); | ||
2312 | } | ||
2313 | |||
2314 | while (!list_empty(&dev_priv->mm.flushing_list)) { | ||
2315 | struct drm_i915_gem_object *obj_priv; | ||
2316 | |||
2317 | obj_priv = list_first_entry(&dev_priv->mm.flushing_list, | ||
2318 | struct drm_i915_gem_object, | ||
2319 | list); | ||
2320 | obj_priv->obj->write_domain &= ~I915_GEM_GPU_DOMAINS; | ||
2321 | i915_gem_object_move_to_inactive(obj_priv->obj); | ||
2322 | } | ||
2312 | 2323 | ||
2313 | /* Move all buffers out of the GTT. */ | 2324 | |
2325 | /* Move all inactive buffers out of the GTT. */ | ||
2314 | ret = i915_gem_evict_from_list(dev, &dev_priv->mm.inactive_list); | 2326 | ret = i915_gem_evict_from_list(dev, &dev_priv->mm.inactive_list); |
2327 | WARN_ON(!list_empty(&dev_priv->mm.inactive_list)); | ||
2315 | if (ret) { | 2328 | if (ret) { |
2316 | mutex_unlock(&dev->struct_mutex); | 2329 | mutex_unlock(&dev->struct_mutex); |
2317 | return ret; | 2330 | return ret; |
2318 | } | 2331 | } |
2319 | 2332 | ||
2320 | BUG_ON(!list_empty(&dev_priv->mm.active_list)); | ||
2321 | BUG_ON(!list_empty(&dev_priv->mm.flushing_list)); | ||
2322 | BUG_ON(!list_empty(&dev_priv->mm.inactive_list)); | ||
2323 | BUG_ON(!list_empty(&dev_priv->mm.request_list)); | ||
2324 | |||
2325 | i915_gem_cleanup_ringbuffer(dev); | 2333 | i915_gem_cleanup_ringbuffer(dev); |
2326 | mutex_unlock(&dev->struct_mutex); | 2334 | mutex_unlock(&dev->struct_mutex); |
2327 | 2335 | ||
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 82752d6177a4..69b9a42da95e 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
@@ -33,11 +33,23 @@ | |||
33 | 33 | ||
34 | #define MAX_NOPID ((u32)~0) | 34 | #define MAX_NOPID ((u32)~0) |
35 | 35 | ||
36 | /** These are the interrupts used by the driver */ | 36 | /** |
37 | #define I915_INTERRUPT_ENABLE_MASK (I915_USER_INTERRUPT | \ | 37 | * Interrupts that are always left unmasked. |
38 | I915_ASLE_INTERRUPT | \ | 38 | * |
39 | I915_DISPLAY_PIPE_A_EVENT_INTERRUPT | \ | 39 | * Since pipe events are edge-triggered from the PIPESTAT register to IIR, |
40 | I915_DISPLAY_PIPE_B_EVENT_INTERRUPT) | 40 | * we leave them always unmasked in IMR and then control enabling them through |
41 | * PIPESTAT alone. | ||
42 | */ | ||
43 | #define I915_INTERRUPT_ENABLE_FIX (I915_ASLE_INTERRUPT | \ | ||
44 | I915_DISPLAY_PIPE_A_EVENT_INTERRUPT | \ | ||
45 | I915_DISPLAY_PIPE_B_EVENT_INTERRUPT) | ||
46 | |||
47 | /** Interrupts that we mask and unmask at runtime. */ | ||
48 | #define I915_INTERRUPT_ENABLE_VAR (I915_USER_INTERRUPT) | ||
49 | |||
50 | /** These are all of the interrupts used by the driver */ | ||
51 | #define I915_INTERRUPT_ENABLE_MASK (I915_INTERRUPT_ENABLE_FIX | \ | ||
52 | I915_INTERRUPT_ENABLE_VAR) | ||
41 | 53 | ||
42 | void | 54 | void |
43 | i915_enable_irq(drm_i915_private_t *dev_priv, u32 mask) | 55 | i915_enable_irq(drm_i915_private_t *dev_priv, u32 mask) |
@@ -59,6 +71,41 @@ i915_disable_irq(drm_i915_private_t *dev_priv, u32 mask) | |||
59 | } | 71 | } |
60 | } | 72 | } |
61 | 73 | ||
74 | static inline u32 | ||
75 | i915_pipestat(int pipe) | ||
76 | { | ||
77 | if (pipe == 0) | ||
78 | return PIPEASTAT; | ||
79 | if (pipe == 1) | ||
80 | return PIPEBSTAT; | ||
81 | BUG(); | ||
82 | } | ||
83 | |||
84 | void | ||
85 | i915_enable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask) | ||
86 | { | ||
87 | if ((dev_priv->pipestat[pipe] & mask) != mask) { | ||
88 | u32 reg = i915_pipestat(pipe); | ||
89 | |||
90 | dev_priv->pipestat[pipe] |= mask; | ||
91 | /* Enable the interrupt, clear any pending status */ | ||
92 | I915_WRITE(reg, dev_priv->pipestat[pipe] | (mask >> 16)); | ||
93 | (void) I915_READ(reg); | ||
94 | } | ||
95 | } | ||
96 | |||
97 | void | ||
98 | i915_disable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask) | ||
99 | { | ||
100 | if ((dev_priv->pipestat[pipe] & mask) != 0) { | ||
101 | u32 reg = i915_pipestat(pipe); | ||
102 | |||
103 | dev_priv->pipestat[pipe] &= ~mask; | ||
104 | I915_WRITE(reg, dev_priv->pipestat[pipe]); | ||
105 | (void) I915_READ(reg); | ||
106 | } | ||
107 | } | ||
108 | |||
62 | /** | 109 | /** |
63 | * i915_pipe_enabled - check if a pipe is enabled | 110 | * i915_pipe_enabled - check if a pipe is enabled |
64 | * @dev: DRM device | 111 | * @dev: DRM device |
@@ -121,80 +168,102 @@ irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS) | |||
121 | { | 168 | { |
122 | struct drm_device *dev = (struct drm_device *) arg; | 169 | struct drm_device *dev = (struct drm_device *) arg; |
123 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 170 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
124 | u32 iir; | 171 | u32 iir, new_iir; |
125 | u32 pipea_stats, pipeb_stats; | 172 | u32 pipea_stats, pipeb_stats; |
173 | u32 vblank_status; | ||
174 | u32 vblank_enable; | ||
126 | int vblank = 0; | 175 | int vblank = 0; |
176 | unsigned long irqflags; | ||
177 | int irq_received; | ||
178 | int ret = IRQ_NONE; | ||
127 | 179 | ||
128 | atomic_inc(&dev_priv->irq_received); | 180 | atomic_inc(&dev_priv->irq_received); |
129 | 181 | ||
130 | if (dev->pdev->msi_enabled) | ||
131 | I915_WRITE(IMR, ~0); | ||
132 | iir = I915_READ(IIR); | 182 | iir = I915_READ(IIR); |
133 | 183 | ||
134 | if (iir == 0) { | 184 | if (IS_I965G(dev)) { |
135 | if (dev->pdev->msi_enabled) { | 185 | vblank_status = I915_START_VBLANK_INTERRUPT_STATUS; |
136 | I915_WRITE(IMR, dev_priv->irq_mask_reg); | 186 | vblank_enable = PIPE_START_VBLANK_INTERRUPT_ENABLE; |
137 | (void) I915_READ(IMR); | 187 | } else { |
138 | } | 188 | vblank_status = I915_VBLANK_INTERRUPT_STATUS; |
139 | return IRQ_NONE; | 189 | vblank_enable = I915_VBLANK_INTERRUPT_ENABLE; |
140 | } | 190 | } |
141 | 191 | ||
142 | /* | 192 | for (;;) { |
143 | * Clear the PIPE(A|B)STAT regs before the IIR otherwise | 193 | irq_received = iir != 0; |
144 | * we may get extra interrupts. | 194 | |
145 | */ | 195 | /* Can't rely on pipestat interrupt bit in iir as it might |
146 | if (iir & I915_DISPLAY_PIPE_A_EVENT_INTERRUPT) { | 196 | * have been cleared after the pipestat interrupt was received. |
197 | * It doesn't set the bit in iir again, but it still produces | ||
198 | * interrupts (for non-MSI). | ||
199 | */ | ||
200 | spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); | ||
147 | pipea_stats = I915_READ(PIPEASTAT); | 201 | pipea_stats = I915_READ(PIPEASTAT); |
148 | if (!(dev_priv->vblank_pipe & DRM_I915_VBLANK_PIPE_A)) | 202 | pipeb_stats = I915_READ(PIPEBSTAT); |
149 | pipea_stats &= ~(PIPE_START_VBLANK_INTERRUPT_ENABLE | | 203 | /* |
150 | PIPE_VBLANK_INTERRUPT_ENABLE); | 204 | * Clear the PIPE(A|B)STAT regs before the IIR |
151 | else if (pipea_stats & (PIPE_START_VBLANK_INTERRUPT_STATUS| | 205 | */ |
152 | PIPE_VBLANK_INTERRUPT_STATUS)) { | 206 | if (pipea_stats & 0x8000ffff) { |
207 | I915_WRITE(PIPEASTAT, pipea_stats); | ||
208 | irq_received = 1; | ||
209 | } | ||
210 | |||
211 | if (pipeb_stats & 0x8000ffff) { | ||
212 | I915_WRITE(PIPEBSTAT, pipeb_stats); | ||
213 | irq_received = 1; | ||
214 | } | ||
215 | spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags); | ||
216 | |||
217 | if (!irq_received) | ||
218 | break; | ||
219 | |||
220 | ret = IRQ_HANDLED; | ||
221 | |||
222 | I915_WRITE(IIR, iir); | ||
223 | new_iir = I915_READ(IIR); /* Flush posted writes */ | ||
224 | |||
225 | if (dev_priv->sarea_priv) | ||
226 | dev_priv->sarea_priv->last_dispatch = | ||
227 | READ_BREADCRUMB(dev_priv); | ||
228 | |||
229 | if (iir & I915_USER_INTERRUPT) { | ||
230 | dev_priv->mm.irq_gem_seqno = i915_get_gem_seqno(dev); | ||
231 | DRM_WAKEUP(&dev_priv->irq_queue); | ||
232 | } | ||
233 | |||
234 | if (pipea_stats & vblank_status) { | ||
153 | vblank++; | 235 | vblank++; |
154 | drm_handle_vblank(dev, 0); | 236 | drm_handle_vblank(dev, 0); |
155 | } | 237 | } |
156 | 238 | ||
157 | I915_WRITE(PIPEASTAT, pipea_stats); | 239 | if (pipeb_stats & vblank_status) { |
158 | } | ||
159 | if (iir & I915_DISPLAY_PIPE_B_EVENT_INTERRUPT) { | ||
160 | pipeb_stats = I915_READ(PIPEBSTAT); | ||
161 | /* Ack the event */ | ||
162 | I915_WRITE(PIPEBSTAT, pipeb_stats); | ||
163 | |||
164 | /* The vblank interrupt gets enabled even if we didn't ask for | ||
165 | it, so make sure it's shut down again */ | ||
166 | if (!(dev_priv->vblank_pipe & DRM_I915_VBLANK_PIPE_B)) | ||
167 | pipeb_stats &= ~(PIPE_START_VBLANK_INTERRUPT_ENABLE | | ||
168 | PIPE_VBLANK_INTERRUPT_ENABLE); | ||
169 | else if (pipeb_stats & (PIPE_START_VBLANK_INTERRUPT_STATUS| | ||
170 | PIPE_VBLANK_INTERRUPT_STATUS)) { | ||
171 | vblank++; | 240 | vblank++; |
172 | drm_handle_vblank(dev, 1); | 241 | drm_handle_vblank(dev, 1); |
173 | } | 242 | } |
174 | 243 | ||
175 | if (pipeb_stats & I915_LEGACY_BLC_EVENT_STATUS) | 244 | if ((pipeb_stats & I915_LEGACY_BLC_EVENT_STATUS) || |
245 | (iir & I915_ASLE_INTERRUPT)) | ||
176 | opregion_asle_intr(dev); | 246 | opregion_asle_intr(dev); |
177 | I915_WRITE(PIPEBSTAT, pipeb_stats); | ||
178 | } | ||
179 | |||
180 | I915_WRITE(IIR, iir); | ||
181 | if (dev->pdev->msi_enabled) | ||
182 | I915_WRITE(IMR, dev_priv->irq_mask_reg); | ||
183 | (void) I915_READ(IIR); /* Flush posted writes */ | ||
184 | |||
185 | if (dev_priv->sarea_priv) | ||
186 | dev_priv->sarea_priv->last_dispatch = | ||
187 | READ_BREADCRUMB(dev_priv); | ||
188 | 247 | ||
189 | if (iir & I915_USER_INTERRUPT) { | 248 | /* With MSI, interrupts are only generated when iir |
190 | dev_priv->mm.irq_gem_seqno = i915_get_gem_seqno(dev); | 249 | * transitions from zero to nonzero. If another bit got |
191 | DRM_WAKEUP(&dev_priv->irq_queue); | 250 | * set while we were handling the existing iir bits, then |
251 | * we would never get another interrupt. | ||
252 | * | ||
253 | * This is fine on non-MSI as well, as if we hit this path | ||
254 | * we avoid exiting the interrupt handler only to generate | ||
255 | * another one. | ||
256 | * | ||
257 | * Note that for MSI this could cause a stray interrupt report | ||
258 | * if an interrupt landed in the time between writing IIR and | ||
259 | * the posting read. This should be rare enough to never | ||
260 | * trigger the 99% of 100,000 interrupts test for disabling | ||
261 | * stray interrupts. | ||
262 | */ | ||
263 | iir = new_iir; | ||
192 | } | 264 | } |
193 | 265 | ||
194 | if (iir & I915_ASLE_INTERRUPT) | 266 | return ret; |
195 | opregion_asle_intr(dev); | ||
196 | |||
197 | return IRQ_HANDLED; | ||
198 | } | 267 | } |
199 | 268 | ||
200 | static int i915_emit_irq(struct drm_device * dev) | 269 | static int i915_emit_irq(struct drm_device * dev) |
@@ -330,48 +399,16 @@ int i915_irq_wait(struct drm_device *dev, void *data, | |||
330 | int i915_enable_vblank(struct drm_device *dev, int pipe) | 399 | int i915_enable_vblank(struct drm_device *dev, int pipe) |
331 | { | 400 | { |
332 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 401 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
333 | u32 pipestat_reg = 0; | ||
334 | u32 pipestat; | ||
335 | u32 interrupt = 0; | ||
336 | unsigned long irqflags; | 402 | unsigned long irqflags; |
337 | 403 | ||
338 | switch (pipe) { | ||
339 | case 0: | ||
340 | pipestat_reg = PIPEASTAT; | ||
341 | interrupt = I915_DISPLAY_PIPE_A_EVENT_INTERRUPT; | ||
342 | break; | ||
343 | case 1: | ||
344 | pipestat_reg = PIPEBSTAT; | ||
345 | interrupt = I915_DISPLAY_PIPE_B_EVENT_INTERRUPT; | ||
346 | break; | ||
347 | default: | ||
348 | DRM_ERROR("tried to enable vblank on non-existent pipe %d\n", | ||
349 | pipe); | ||
350 | return 0; | ||
351 | } | ||
352 | |||
353 | spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); | 404 | spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); |
354 | /* Enabling vblank events in IMR comes before PIPESTAT write, or | ||
355 | * there's a race where the PIPESTAT vblank bit gets set to 1, so | ||
356 | * the OR of enabled PIPESTAT bits goes to 1, so the PIPExEVENT in | ||
357 | * ISR flashes to 1, but the IIR bit doesn't get set to 1 because | ||
358 | * IMR masks it. It doesn't ever get set after we clear the masking | ||
359 | * in IMR because the ISR bit is edge, not level-triggered, on the | ||
360 | * OR of PIPESTAT bits. | ||
361 | */ | ||
362 | i915_enable_irq(dev_priv, interrupt); | ||
363 | pipestat = I915_READ(pipestat_reg); | ||
364 | if (IS_I965G(dev)) | 405 | if (IS_I965G(dev)) |
365 | pipestat |= PIPE_START_VBLANK_INTERRUPT_ENABLE; | 406 | i915_enable_pipestat(dev_priv, pipe, |
407 | PIPE_START_VBLANK_INTERRUPT_ENABLE); | ||
366 | else | 408 | else |
367 | pipestat |= PIPE_VBLANK_INTERRUPT_ENABLE; | 409 | i915_enable_pipestat(dev_priv, pipe, |
368 | /* Clear any stale interrupt status */ | 410 | PIPE_VBLANK_INTERRUPT_ENABLE); |
369 | pipestat |= (PIPE_START_VBLANK_INTERRUPT_STATUS | | ||
370 | PIPE_VBLANK_INTERRUPT_STATUS); | ||
371 | I915_WRITE(pipestat_reg, pipestat); | ||
372 | (void) I915_READ(pipestat_reg); /* Posting read */ | ||
373 | spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags); | 411 | spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags); |
374 | |||
375 | return 0; | 412 | return 0; |
376 | } | 413 | } |
377 | 414 | ||
@@ -381,37 +418,12 @@ int i915_enable_vblank(struct drm_device *dev, int pipe) | |||
381 | void i915_disable_vblank(struct drm_device *dev, int pipe) | 418 | void i915_disable_vblank(struct drm_device *dev, int pipe) |
382 | { | 419 | { |
383 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 420 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
384 | u32 pipestat_reg = 0; | ||
385 | u32 pipestat; | ||
386 | u32 interrupt = 0; | ||
387 | unsigned long irqflags; | 421 | unsigned long irqflags; |
388 | 422 | ||
389 | switch (pipe) { | ||
390 | case 0: | ||
391 | pipestat_reg = PIPEASTAT; | ||
392 | interrupt = I915_DISPLAY_PIPE_A_EVENT_INTERRUPT; | ||
393 | break; | ||
394 | case 1: | ||
395 | pipestat_reg = PIPEBSTAT; | ||
396 | interrupt = I915_DISPLAY_PIPE_B_EVENT_INTERRUPT; | ||
397 | break; | ||
398 | default: | ||
399 | DRM_ERROR("tried to disable vblank on non-existent pipe %d\n", | ||
400 | pipe); | ||
401 | return; | ||
402 | break; | ||
403 | } | ||
404 | |||
405 | spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); | 423 | spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); |
406 | i915_disable_irq(dev_priv, interrupt); | 424 | i915_disable_pipestat(dev_priv, pipe, |
407 | pipestat = I915_READ(pipestat_reg); | 425 | PIPE_VBLANK_INTERRUPT_ENABLE | |
408 | pipestat &= ~(PIPE_START_VBLANK_INTERRUPT_ENABLE | | 426 | PIPE_START_VBLANK_INTERRUPT_ENABLE); |
409 | PIPE_VBLANK_INTERRUPT_ENABLE); | ||
410 | /* Clear any stale interrupt status */ | ||
411 | pipestat |= (PIPE_START_VBLANK_INTERRUPT_STATUS | | ||
412 | PIPE_VBLANK_INTERRUPT_STATUS); | ||
413 | I915_WRITE(pipestat_reg, pipestat); | ||
414 | (void) I915_READ(pipestat_reg); /* Posting read */ | ||
415 | spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags); | 427 | spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags); |
416 | } | 428 | } |
417 | 429 | ||
@@ -476,32 +488,35 @@ void i915_driver_irq_preinstall(struct drm_device * dev) | |||
476 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 488 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
477 | 489 | ||
478 | I915_WRITE(HWSTAM, 0xeffe); | 490 | I915_WRITE(HWSTAM, 0xeffe); |
491 | I915_WRITE(PIPEASTAT, 0); | ||
492 | I915_WRITE(PIPEBSTAT, 0); | ||
479 | I915_WRITE(IMR, 0xffffffff); | 493 | I915_WRITE(IMR, 0xffffffff); |
480 | I915_WRITE(IER, 0x0); | 494 | I915_WRITE(IER, 0x0); |
495 | (void) I915_READ(IER); | ||
481 | } | 496 | } |
482 | 497 | ||
483 | int i915_driver_irq_postinstall(struct drm_device *dev) | 498 | int i915_driver_irq_postinstall(struct drm_device *dev) |
484 | { | 499 | { |
485 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 500 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
486 | int ret, num_pipes = 2; | ||
487 | |||
488 | /* Set initial unmasked IRQs to just the selected vblank pipes. */ | ||
489 | dev_priv->irq_mask_reg = ~0; | ||
490 | |||
491 | ret = drm_vblank_init(dev, num_pipes); | ||
492 | if (ret) | ||
493 | return ret; | ||
494 | 501 | ||
495 | dev_priv->vblank_pipe = DRM_I915_VBLANK_PIPE_A | DRM_I915_VBLANK_PIPE_B; | 502 | dev_priv->vblank_pipe = DRM_I915_VBLANK_PIPE_A | DRM_I915_VBLANK_PIPE_B; |
496 | dev_priv->irq_mask_reg &= ~I915_DISPLAY_PIPE_A_VBLANK_INTERRUPT; | ||
497 | dev_priv->irq_mask_reg &= ~I915_DISPLAY_PIPE_B_VBLANK_INTERRUPT; | ||
498 | 503 | ||
499 | dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */ | 504 | dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */ |
500 | 505 | ||
501 | dev_priv->irq_mask_reg &= I915_INTERRUPT_ENABLE_MASK; | 506 | /* Unmask the interrupts that we always want on. */ |
507 | dev_priv->irq_mask_reg = ~I915_INTERRUPT_ENABLE_FIX; | ||
508 | |||
509 | dev_priv->pipestat[0] = 0; | ||
510 | dev_priv->pipestat[1] = 0; | ||
511 | |||
512 | /* Disable pipe interrupt enables, clear pending pipe status */ | ||
513 | I915_WRITE(PIPEASTAT, I915_READ(PIPEASTAT) & 0x8000ffff); | ||
514 | I915_WRITE(PIPEBSTAT, I915_READ(PIPEBSTAT) & 0x8000ffff); | ||
515 | /* Clear pending interrupt status */ | ||
516 | I915_WRITE(IIR, I915_READ(IIR)); | ||
502 | 517 | ||
503 | I915_WRITE(IMR, dev_priv->irq_mask_reg); | ||
504 | I915_WRITE(IER, I915_INTERRUPT_ENABLE_MASK); | 518 | I915_WRITE(IER, I915_INTERRUPT_ENABLE_MASK); |
519 | I915_WRITE(IMR, dev_priv->irq_mask_reg); | ||
505 | (void) I915_READ(IER); | 520 | (void) I915_READ(IER); |
506 | 521 | ||
507 | opregion_enable_asle(dev); | 522 | opregion_enable_asle(dev); |
@@ -513,7 +528,6 @@ int i915_driver_irq_postinstall(struct drm_device *dev) | |||
513 | void i915_driver_irq_uninstall(struct drm_device * dev) | 528 | void i915_driver_irq_uninstall(struct drm_device * dev) |
514 | { | 529 | { |
515 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 530 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
516 | u32 temp; | ||
517 | 531 | ||
518 | if (!dev_priv) | 532 | if (!dev_priv) |
519 | return; | 533 | return; |
@@ -521,13 +535,12 @@ void i915_driver_irq_uninstall(struct drm_device * dev) | |||
521 | dev_priv->vblank_pipe = 0; | 535 | dev_priv->vblank_pipe = 0; |
522 | 536 | ||
523 | I915_WRITE(HWSTAM, 0xffffffff); | 537 | I915_WRITE(HWSTAM, 0xffffffff); |
538 | I915_WRITE(PIPEASTAT, 0); | ||
539 | I915_WRITE(PIPEBSTAT, 0); | ||
524 | I915_WRITE(IMR, 0xffffffff); | 540 | I915_WRITE(IMR, 0xffffffff); |
525 | I915_WRITE(IER, 0x0); | 541 | I915_WRITE(IER, 0x0); |
526 | 542 | ||
527 | temp = I915_READ(PIPEASTAT); | 543 | I915_WRITE(PIPEASTAT, I915_READ(PIPEASTAT) & 0x8000ffff); |
528 | I915_WRITE(PIPEASTAT, temp); | 544 | I915_WRITE(PIPEBSTAT, I915_READ(PIPEBSTAT) & 0x8000ffff); |
529 | temp = I915_READ(PIPEBSTAT); | 545 | I915_WRITE(IIR, I915_READ(IIR)); |
530 | I915_WRITE(PIPEBSTAT, temp); | ||
531 | temp = I915_READ(IIR); | ||
532 | I915_WRITE(IIR, temp); | ||
533 | } | 546 | } |
diff --git a/drivers/gpu/drm/i915/i915_opregion.c b/drivers/gpu/drm/i915/i915_opregion.c index 1787a0c7e3ab..13ae731a33db 100644 --- a/drivers/gpu/drm/i915/i915_opregion.c +++ b/drivers/gpu/drm/i915/i915_opregion.c | |||
@@ -235,17 +235,15 @@ void opregion_enable_asle(struct drm_device *dev) | |||
235 | struct opregion_asle *asle = dev_priv->opregion.asle; | 235 | struct opregion_asle *asle = dev_priv->opregion.asle; |
236 | 236 | ||
237 | if (asle) { | 237 | if (asle) { |
238 | u32 pipeb_stats = I915_READ(PIPEBSTAT); | ||
239 | if (IS_MOBILE(dev)) { | 238 | if (IS_MOBILE(dev)) { |
240 | /* Many devices trigger events with a write to the | 239 | unsigned long irqflags; |
241 | legacy backlight controller, so we need to ensure | 240 | |
242 | that it's able to generate interrupts */ | 241 | spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); |
243 | I915_WRITE(PIPEBSTAT, pipeb_stats |= | 242 | i915_enable_pipestat(dev_priv, 1, |
244 | I915_LEGACY_BLC_EVENT_ENABLE); | 243 | I915_LEGACY_BLC_EVENT_ENABLE); |
245 | i915_enable_irq(dev_priv, I915_ASLE_INTERRUPT | | 244 | spin_unlock_irqrestore(&dev_priv->user_irq_lock, |
246 | I915_DISPLAY_PIPE_B_EVENT_INTERRUPT); | 245 | irqflags); |
247 | } else | 246 | } |
248 | i915_enable_irq(dev_priv, I915_ASLE_INTERRUPT); | ||
249 | 247 | ||
250 | asle->tche = ASLE_ALS_EN | ASLE_BLC_EN | ASLE_PFIT_EN | | 248 | asle->tche = ASLE_ALS_EN | ASLE_BLC_EN | ASLE_PFIT_EN | |
251 | ASLE_PFMB_EN; | 249 | ASLE_PFMB_EN; |
diff --git a/drivers/gpu/drm/i915/i915_suspend.c b/drivers/gpu/drm/i915/i915_suspend.c index 5ddc6e595c0c..5d84027ee8f3 100644 --- a/drivers/gpu/drm/i915/i915_suspend.c +++ b/drivers/gpu/drm/i915/i915_suspend.c | |||
@@ -244,6 +244,9 @@ int i915_save_state(struct drm_device *dev) | |||
244 | if (IS_I965G(dev) && IS_MOBILE(dev)) | 244 | if (IS_I965G(dev) && IS_MOBILE(dev)) |
245 | dev_priv->saveRENDERSTANDBY = I915_READ(MCHBAR_RENDER_STANDBY); | 245 | dev_priv->saveRENDERSTANDBY = I915_READ(MCHBAR_RENDER_STANDBY); |
246 | 246 | ||
247 | /* Hardware status page */ | ||
248 | dev_priv->saveHWS = I915_READ(HWS_PGA); | ||
249 | |||
247 | /* Display arbitration control */ | 250 | /* Display arbitration control */ |
248 | dev_priv->saveDSPARB = I915_READ(DSPARB); | 251 | dev_priv->saveDSPARB = I915_READ(DSPARB); |
249 | 252 | ||
@@ -373,6 +376,9 @@ int i915_restore_state(struct drm_device *dev) | |||
373 | if (IS_I965G(dev) && IS_MOBILE(dev)) | 376 | if (IS_I965G(dev) && IS_MOBILE(dev)) |
374 | I915_WRITE(MCHBAR_RENDER_STANDBY, dev_priv->saveRENDERSTANDBY); | 377 | I915_WRITE(MCHBAR_RENDER_STANDBY, dev_priv->saveRENDERSTANDBY); |
375 | 378 | ||
379 | /* Hardware status page */ | ||
380 | I915_WRITE(HWS_PGA, dev_priv->saveHWS); | ||
381 | |||
376 | /* Display arbitration */ | 382 | /* Display arbitration */ |
377 | I915_WRITE(DSPARB, dev_priv->saveDSPARB); | 383 | I915_WRITE(DSPARB, dev_priv->saveDSPARB); |
378 | 384 | ||
diff --git a/drivers/gpu/drm/mga/mga_dma.c b/drivers/gpu/drm/mga/mga_dma.c index c1d12dbfa8d8..b49c5ff29585 100644 --- a/drivers/gpu/drm/mga/mga_dma.c +++ b/drivers/gpu/drm/mga/mga_dma.c | |||
@@ -396,6 +396,7 @@ int mga_freelist_put(struct drm_device * dev, struct drm_buf * buf) | |||
396 | int mga_driver_load(struct drm_device * dev, unsigned long flags) | 396 | int mga_driver_load(struct drm_device * dev, unsigned long flags) |
397 | { | 397 | { |
398 | drm_mga_private_t *dev_priv; | 398 | drm_mga_private_t *dev_priv; |
399 | int ret; | ||
399 | 400 | ||
400 | dev_priv = drm_alloc(sizeof(drm_mga_private_t), DRM_MEM_DRIVER); | 401 | dev_priv = drm_alloc(sizeof(drm_mga_private_t), DRM_MEM_DRIVER); |
401 | if (!dev_priv) | 402 | if (!dev_priv) |
@@ -415,6 +416,13 @@ int mga_driver_load(struct drm_device * dev, unsigned long flags) | |||
415 | dev->types[7] = _DRM_STAT_PRIMARY; | 416 | dev->types[7] = _DRM_STAT_PRIMARY; |
416 | dev->types[8] = _DRM_STAT_SECONDARY; | 417 | dev->types[8] = _DRM_STAT_SECONDARY; |
417 | 418 | ||
419 | ret = drm_vblank_init(dev, 1); | ||
420 | |||
421 | if (ret) { | ||
422 | (void) mga_driver_unload(dev); | ||
423 | return ret; | ||
424 | } | ||
425 | |||
418 | return 0; | 426 | return 0; |
419 | } | 427 | } |
420 | 428 | ||
diff --git a/drivers/gpu/drm/mga/mga_irq.c b/drivers/gpu/drm/mga/mga_irq.c index bab42f41188b..daa6041a483a 100644 --- a/drivers/gpu/drm/mga/mga_irq.c +++ b/drivers/gpu/drm/mga/mga_irq.c | |||
@@ -152,11 +152,6 @@ void mga_driver_irq_preinstall(struct drm_device * dev) | |||
152 | int mga_driver_irq_postinstall(struct drm_device *dev) | 152 | int mga_driver_irq_postinstall(struct drm_device *dev) |
153 | { | 153 | { |
154 | drm_mga_private_t *dev_priv = (drm_mga_private_t *) dev->dev_private; | 154 | drm_mga_private_t *dev_priv = (drm_mga_private_t *) dev->dev_private; |
155 | int ret; | ||
156 | |||
157 | ret = drm_vblank_init(dev, 1); | ||
158 | if (ret) | ||
159 | return ret; | ||
160 | 155 | ||
161 | DRM_INIT_WAITQUEUE(&dev_priv->fence_queue); | 156 | DRM_INIT_WAITQUEUE(&dev_priv->fence_queue); |
162 | 157 | ||
diff --git a/drivers/gpu/drm/r128/r128_drv.c b/drivers/gpu/drm/r128/r128_drv.c index 3265d53ba91f..601f4c0e5da5 100644 --- a/drivers/gpu/drm/r128/r128_drv.c +++ b/drivers/gpu/drm/r128/r128_drv.c | |||
@@ -45,6 +45,7 @@ static struct drm_driver driver = { | |||
45 | DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_PCI_DMA | DRIVER_SG | | 45 | DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_PCI_DMA | DRIVER_SG | |
46 | DRIVER_HAVE_DMA | DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED, | 46 | DRIVER_HAVE_DMA | DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED, |
47 | .dev_priv_size = sizeof(drm_r128_buf_priv_t), | 47 | .dev_priv_size = sizeof(drm_r128_buf_priv_t), |
48 | .load = r128_driver_load, | ||
48 | .preclose = r128_driver_preclose, | 49 | .preclose = r128_driver_preclose, |
49 | .lastclose = r128_driver_lastclose, | 50 | .lastclose = r128_driver_lastclose, |
50 | .get_vblank_counter = r128_get_vblank_counter, | 51 | .get_vblank_counter = r128_get_vblank_counter, |
@@ -84,6 +85,11 @@ static struct drm_driver driver = { | |||
84 | .patchlevel = DRIVER_PATCHLEVEL, | 85 | .patchlevel = DRIVER_PATCHLEVEL, |
85 | }; | 86 | }; |
86 | 87 | ||
88 | int r128_driver_load(struct drm_device * dev, unsigned long flags) | ||
89 | { | ||
90 | return drm_vblank_init(dev, 1); | ||
91 | } | ||
92 | |||
87 | static int __init r128_init(void) | 93 | static int __init r128_init(void) |
88 | { | 94 | { |
89 | driver.num_ioctls = r128_max_ioctl; | 95 | driver.num_ioctls = r128_max_ioctl; |
diff --git a/drivers/gpu/drm/r128/r128_drv.h b/drivers/gpu/drm/r128/r128_drv.h index 5898b274279d..797a26c42dab 100644 --- a/drivers/gpu/drm/r128/r128_drv.h +++ b/drivers/gpu/drm/r128/r128_drv.h | |||
@@ -159,6 +159,7 @@ extern void r128_driver_irq_preinstall(struct drm_device * dev); | |||
159 | extern int r128_driver_irq_postinstall(struct drm_device *dev); | 159 | extern int r128_driver_irq_postinstall(struct drm_device *dev); |
160 | extern void r128_driver_irq_uninstall(struct drm_device * dev); | 160 | extern void r128_driver_irq_uninstall(struct drm_device * dev); |
161 | extern void r128_driver_lastclose(struct drm_device * dev); | 161 | extern void r128_driver_lastclose(struct drm_device * dev); |
162 | extern int r128_driver_load(struct drm_device * dev, unsigned long flags); | ||
162 | extern void r128_driver_preclose(struct drm_device * dev, | 163 | extern void r128_driver_preclose(struct drm_device * dev, |
163 | struct drm_file *file_priv); | 164 | struct drm_file *file_priv); |
164 | 165 | ||
diff --git a/drivers/gpu/drm/r128/r128_irq.c b/drivers/gpu/drm/r128/r128_irq.c index d7349012a680..69810fb8ac49 100644 --- a/drivers/gpu/drm/r128/r128_irq.c +++ b/drivers/gpu/drm/r128/r128_irq.c | |||
@@ -102,7 +102,7 @@ void r128_driver_irq_preinstall(struct drm_device * dev) | |||
102 | 102 | ||
103 | int r128_driver_irq_postinstall(struct drm_device *dev) | 103 | int r128_driver_irq_postinstall(struct drm_device *dev) |
104 | { | 104 | { |
105 | return drm_vblank_init(dev, 1); | 105 | return 0; |
106 | } | 106 | } |
107 | 107 | ||
108 | void r128_driver_irq_uninstall(struct drm_device * dev) | 108 | void r128_driver_irq_uninstall(struct drm_device * dev) |
diff --git a/drivers/gpu/drm/radeon/radeon_cp.c b/drivers/gpu/drm/radeon/radeon_cp.c index abdc1ae38467..dcebb4bee7aa 100644 --- a/drivers/gpu/drm/radeon/radeon_cp.c +++ b/drivers/gpu/drm/radeon/radeon_cp.c | |||
@@ -1757,6 +1757,12 @@ int radeon_driver_load(struct drm_device *dev, unsigned long flags) | |||
1757 | if (ret != 0) | 1757 | if (ret != 0) |
1758 | return ret; | 1758 | return ret; |
1759 | 1759 | ||
1760 | ret = drm_vblank_init(dev, 2); | ||
1761 | if (ret) { | ||
1762 | radeon_driver_unload(dev); | ||
1763 | return ret; | ||
1764 | } | ||
1765 | |||
1760 | DRM_DEBUG("%s card detected\n", | 1766 | DRM_DEBUG("%s card detected\n", |
1761 | ((dev_priv->flags & RADEON_IS_AGP) ? "AGP" : (((dev_priv->flags & RADEON_IS_PCIE) ? "PCIE" : "PCI")))); | 1767 | ((dev_priv->flags & RADEON_IS_AGP) ? "AGP" : (((dev_priv->flags & RADEON_IS_PCIE) ? "PCIE" : "PCI")))); |
1762 | return ret; | 1768 | return ret; |
diff --git a/drivers/gpu/drm/radeon/radeon_irq.c b/drivers/gpu/drm/radeon/radeon_irq.c index 5079f7054a2f..97c0599fdb1e 100644 --- a/drivers/gpu/drm/radeon/radeon_irq.c +++ b/drivers/gpu/drm/radeon/radeon_irq.c | |||
@@ -337,15 +337,10 @@ int radeon_driver_irq_postinstall(struct drm_device *dev) | |||
337 | { | 337 | { |
338 | drm_radeon_private_t *dev_priv = | 338 | drm_radeon_private_t *dev_priv = |
339 | (drm_radeon_private_t *) dev->dev_private; | 339 | (drm_radeon_private_t *) dev->dev_private; |
340 | int ret; | ||
341 | 340 | ||
342 | atomic_set(&dev_priv->swi_emitted, 0); | 341 | atomic_set(&dev_priv->swi_emitted, 0); |
343 | DRM_INIT_WAITQUEUE(&dev_priv->swi_queue); | 342 | DRM_INIT_WAITQUEUE(&dev_priv->swi_queue); |
344 | 343 | ||
345 | ret = drm_vblank_init(dev, 2); | ||
346 | if (ret) | ||
347 | return ret; | ||
348 | |||
349 | dev->max_vblank_count = 0x001fffff; | 344 | dev->max_vblank_count = 0x001fffff; |
350 | 345 | ||
351 | radeon_irq_set_state(dev, RADEON_SW_INT_ENABLE, 1); | 346 | radeon_irq_set_state(dev, RADEON_SW_INT_ENABLE, 1); |
diff --git a/drivers/gpu/drm/via/via_irq.c b/drivers/gpu/drm/via/via_irq.c index 665d319b927b..c248c1d37268 100644 --- a/drivers/gpu/drm/via/via_irq.c +++ b/drivers/gpu/drm/via/via_irq.c | |||
@@ -314,7 +314,6 @@ int via_driver_irq_postinstall(struct drm_device *dev) | |||
314 | if (!dev_priv) | 314 | if (!dev_priv) |
315 | return -EINVAL; | 315 | return -EINVAL; |
316 | 316 | ||
317 | drm_vblank_init(dev, 1); | ||
318 | status = VIA_READ(VIA_REG_INTERRUPT); | 317 | status = VIA_READ(VIA_REG_INTERRUPT); |
319 | VIA_WRITE(VIA_REG_INTERRUPT, status | VIA_IRQ_GLOBAL | 318 | VIA_WRITE(VIA_REG_INTERRUPT, status | VIA_IRQ_GLOBAL |
320 | | dev_priv->irq_enable_mask); | 319 | | dev_priv->irq_enable_mask); |
diff --git a/drivers/gpu/drm/via/via_map.c b/drivers/gpu/drm/via/via_map.c index a967556be014..2c4f0b485792 100644 --- a/drivers/gpu/drm/via/via_map.c +++ b/drivers/gpu/drm/via/via_map.c | |||
@@ -107,8 +107,17 @@ int via_driver_load(struct drm_device *dev, unsigned long chipset) | |||
107 | ret = drm_sman_init(&dev_priv->sman, 2, 12, 8); | 107 | ret = drm_sman_init(&dev_priv->sman, 2, 12, 8); |
108 | if (ret) { | 108 | if (ret) { |
109 | drm_free(dev_priv, sizeof(*dev_priv), DRM_MEM_DRIVER); | 109 | drm_free(dev_priv, sizeof(*dev_priv), DRM_MEM_DRIVER); |
110 | return ret; | ||
110 | } | 111 | } |
111 | return ret; | 112 | |
113 | ret = drm_vblank_init(dev, 1); | ||
114 | if (ret) { | ||
115 | drm_sman_takedown(&dev_priv->sman); | ||
116 | drm_free(dev_priv, sizeof(drm_via_private_t), DRM_MEM_DRIVER); | ||
117 | return ret; | ||
118 | } | ||
119 | |||
120 | return 0; | ||
112 | } | 121 | } |
113 | 122 | ||
114 | int via_driver_unload(struct drm_device *dev) | 123 | int via_driver_unload(struct drm_device *dev) |
diff --git a/drivers/hid/hid-apple.c b/drivers/hid/hid-apple.c index c6ab4ba60c52..aa28aed0e46c 100644 --- a/drivers/hid/hid-apple.c +++ b/drivers/hid/hid-apple.c | |||
@@ -55,10 +55,11 @@ struct apple_key_translation { | |||
55 | 55 | ||
56 | static struct apple_key_translation apple_fn_keys[] = { | 56 | static struct apple_key_translation apple_fn_keys[] = { |
57 | { KEY_BACKSPACE, KEY_DELETE }, | 57 | { KEY_BACKSPACE, KEY_DELETE }, |
58 | { KEY_ENTER, KEY_INSERT }, | ||
58 | { KEY_F1, KEY_BRIGHTNESSDOWN, APPLE_FLAG_FKEY }, | 59 | { KEY_F1, KEY_BRIGHTNESSDOWN, APPLE_FLAG_FKEY }, |
59 | { KEY_F2, KEY_BRIGHTNESSUP, APPLE_FLAG_FKEY }, | 60 | { KEY_F2, KEY_BRIGHTNESSUP, APPLE_FLAG_FKEY }, |
60 | { KEY_F3, KEY_FN_F5, APPLE_FLAG_FKEY }, /* Exposé */ | 61 | { KEY_F3, KEY_SCALE, APPLE_FLAG_FKEY }, |
61 | { KEY_F4, KEY_FN_F4, APPLE_FLAG_FKEY }, /* Dashboard */ | 62 | { KEY_F4, KEY_DASHBOARD, APPLE_FLAG_FKEY }, |
62 | { KEY_F5, KEY_KBDILLUMDOWN, APPLE_FLAG_FKEY }, | 63 | { KEY_F5, KEY_KBDILLUMDOWN, APPLE_FLAG_FKEY }, |
63 | { KEY_F6, KEY_KBDILLUMUP, APPLE_FLAG_FKEY }, | 64 | { KEY_F6, KEY_KBDILLUMUP, APPLE_FLAG_FKEY }, |
64 | { KEY_F7, KEY_PREVIOUSSONG, APPLE_FLAG_FKEY }, | 65 | { KEY_F7, KEY_PREVIOUSSONG, APPLE_FLAG_FKEY }, |
@@ -399,12 +400,12 @@ static const struct hid_device_id apple_devices[] = { | |||
399 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS), | 400 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS), |
400 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | | 401 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | |
401 | APPLE_RDESC_JIS }, | 402 | APPLE_RDESC_JIS }, |
402 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI), | 403 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI), |
403 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, | 404 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, |
404 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO), | 405 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO), |
405 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | | 406 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | |
406 | APPLE_ISO_KEYBOARD }, | 407 | APPLE_ISO_KEYBOARD }, |
407 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS), | 408 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS), |
408 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, | 409 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, |
409 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ANSI), | 410 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ANSI), |
410 | .driver_data = APPLE_HAS_FN }, | 411 | .driver_data = APPLE_HAS_FN }, |
@@ -418,6 +419,12 @@ static const struct hid_device_id apple_devices[] = { | |||
418 | .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD }, | 419 | .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD }, |
419 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_JIS), | 420 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_JIS), |
420 | .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, | 421 | .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, |
422 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI), | ||
423 | .driver_data = APPLE_HAS_FN }, | ||
424 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ISO), | ||
425 | .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD }, | ||
426 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_JIS), | ||
427 | .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, | ||
421 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY), | 428 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY), |
422 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, | 429 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, |
423 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY), | 430 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY), |
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index d3671b4049c0..40df3e1b4bd1 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c | |||
@@ -1241,18 +1241,20 @@ static const struct hid_device_id hid_blacklist[] = { | |||
1241 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI) }, | 1241 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI) }, |
1242 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO) }, | 1242 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO) }, |
1243 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS) }, | 1243 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS) }, |
1244 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI) }, | 1244 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI) }, |
1245 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO) }, | 1245 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO) }, |
1246 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS) }, | 1246 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS) }, |
1247 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ANSI) }, | 1247 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ANSI) }, |
1248 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ISO) }, | 1248 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ISO) }, |
1249 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_JIS) }, | 1249 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_JIS) }, |
1250 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI) }, | 1250 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI) }, |
1251 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ISO) }, | 1251 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ISO) }, |
1252 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_JIS) }, | 1252 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_JIS) }, |
1253 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI) }, | ||
1254 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ISO) }, | ||
1255 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_JIS) }, | ||
1253 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) }, | 1256 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) }, |
1254 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) }, | 1257 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) }, |
1255 | { HID_USB_DEVICE(USB_VENDOR_ID_AVERMEDIA, USB_DEVICE_ID_AVER_FM_MR800) }, | ||
1256 | { HID_USB_DEVICE(USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM) }, | 1258 | { HID_USB_DEVICE(USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM) }, |
1257 | { HID_USB_DEVICE(USB_VENDOR_ID_BRIGHT, USB_DEVICE_ID_BRIGHT_ABNT2) }, | 1259 | { HID_USB_DEVICE(USB_VENDOR_ID_BRIGHT, USB_DEVICE_ID_BRIGHT_ABNT2) }, |
1258 | { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION) }, | 1260 | { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION) }, |
@@ -1264,8 +1266,10 @@ static const struct hid_device_id hid_blacklist[] = { | |||
1264 | { HID_USB_DEVICE(USB_VENDOR_ID_DELL, USB_DEVICE_ID_DELL_SK8115) }, | 1266 | { HID_USB_DEVICE(USB_VENDOR_ID_DELL, USB_DEVICE_ID_DELL_SK8115) }, |
1265 | { HID_USB_DEVICE(USB_VENDOR_ID_EZKEY, USB_DEVICE_ID_BTC_8193) }, | 1267 | { HID_USB_DEVICE(USB_VENDOR_ID_EZKEY, USB_DEVICE_ID_BTC_8193) }, |
1266 | { HID_USB_DEVICE(USB_VENDOR_ID_GENERIC_13BA, USB_DEVICE_ID_GENERIC_13BA_KBD_MOUSE) }, | 1268 | { HID_USB_DEVICE(USB_VENDOR_ID_GENERIC_13BA, USB_DEVICE_ID_GENERIC_13BA_KBD_MOUSE) }, |
1269 | { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR) }, | ||
1270 | { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PCS_ADAPTOR) }, | ||
1271 | { HID_USB_DEVICE(USB_VENDOR_ID_GREENASIA, 0x0003) }, | ||
1267 | { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE) }, | 1272 | { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE) }, |
1268 | { HID_USB_DEVICE(USB_VENDOR_ID_KWORLD, USB_DEVICE_ID_KWORLD_RADIO_FM700) }, | ||
1269 | { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE_2) }, | 1273 | { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE_2) }, |
1270 | { HID_USB_DEVICE(USB_VENDOR_ID_LABTEC, USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD) }, | 1274 | { HID_USB_DEVICE(USB_VENDOR_ID_LABTEC, USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD) }, |
1271 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_MX3000_RECEIVER) }, | 1275 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_MX3000_RECEIVER) }, |
@@ -1409,6 +1413,7 @@ static const struct hid_device_id hid_ignore_list[] = { | |||
1409 | { HID_USB_DEVICE(USB_VENDOR_ID_ALCOR, USB_DEVICE_ID_ALCOR_USBRS232) }, | 1413 | { HID_USB_DEVICE(USB_VENDOR_ID_ALCOR, USB_DEVICE_ID_ALCOR_USBRS232) }, |
1410 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUS, USB_DEVICE_ID_ASUS_LCM)}, | 1414 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUS, USB_DEVICE_ID_ASUS_LCM)}, |
1411 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUS, USB_DEVICE_ID_ASUS_LCM2)}, | 1415 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUS, USB_DEVICE_ID_ASUS_LCM2)}, |
1416 | { HID_USB_DEVICE(USB_VENDOR_ID_AVERMEDIA, USB_DEVICE_ID_AVER_FM_MR800) }, | ||
1412 | { HID_USB_DEVICE(USB_VENDOR_ID_BERKSHIRE, USB_DEVICE_ID_BERKSHIRE_PCWD) }, | 1417 | { HID_USB_DEVICE(USB_VENDOR_ID_BERKSHIRE, USB_DEVICE_ID_BERKSHIRE_PCWD) }, |
1413 | { HID_USB_DEVICE(USB_VENDOR_ID_CIDC, 0x0103) }, | 1418 | { HID_USB_DEVICE(USB_VENDOR_ID_CIDC, 0x0103) }, |
1414 | { HID_USB_DEVICE(USB_VENDOR_ID_CYGNAL, USB_DEVICE_ID_CYGNAL_RADIO_SI470X) }, | 1419 | { HID_USB_DEVICE(USB_VENDOR_ID_CYGNAL, USB_DEVICE_ID_CYGNAL_RADIO_SI470X) }, |
@@ -1418,7 +1423,6 @@ static const struct hid_device_id hid_ignore_list[] = { | |||
1418 | { HID_USB_DEVICE(USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EARTHMATE) }, | 1423 | { HID_USB_DEVICE(USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EARTHMATE) }, |
1419 | { HID_USB_DEVICE(USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EM_LT20) }, | 1424 | { HID_USB_DEVICE(USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EM_LT20) }, |
1420 | { HID_USB_DEVICE(USB_VENDOR_ID_ESSENTIAL_REALITY, USB_DEVICE_ID_ESSENTIAL_REALITY_P5) }, | 1425 | { HID_USB_DEVICE(USB_VENDOR_ID_ESSENTIAL_REALITY, USB_DEVICE_ID_ESSENTIAL_REALITY_P5) }, |
1421 | { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR) }, | ||
1422 | { HID_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH, 0x0001) }, | 1426 | { HID_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH, 0x0001) }, |
1423 | { HID_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH, 0x0002) }, | 1427 | { HID_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH, 0x0002) }, |
1424 | { HID_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH, 0x0003) }, | 1428 | { HID_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH, 0x0003) }, |
@@ -1434,7 +1438,6 @@ static const struct hid_device_id hid_ignore_list[] = { | |||
1434 | { HID_USB_DEVICE(USB_VENDOR_ID_GOTOP, USB_DEVICE_ID_SUPER_Q2) }, | 1438 | { HID_USB_DEVICE(USB_VENDOR_ID_GOTOP, USB_DEVICE_ID_SUPER_Q2) }, |
1435 | { HID_USB_DEVICE(USB_VENDOR_ID_GOTOP, USB_DEVICE_ID_GOGOPEN) }, | 1439 | { HID_USB_DEVICE(USB_VENDOR_ID_GOTOP, USB_DEVICE_ID_GOGOPEN) }, |
1436 | { HID_USB_DEVICE(USB_VENDOR_ID_GOTOP, USB_DEVICE_ID_PENPOWER) }, | 1440 | { HID_USB_DEVICE(USB_VENDOR_ID_GOTOP, USB_DEVICE_ID_PENPOWER) }, |
1437 | { HID_USB_DEVICE(USB_VENDOR_ID_GREENASIA, 0x0003) }, | ||
1438 | { HID_USB_DEVICE(USB_VENDOR_ID_GRETAGMACBETH, USB_DEVICE_ID_GRETAGMACBETH_HUEY) }, | 1441 | { HID_USB_DEVICE(USB_VENDOR_ID_GRETAGMACBETH, USB_DEVICE_ID_GRETAGMACBETH_HUEY) }, |
1439 | { HID_USB_DEVICE(USB_VENDOR_ID_GRIFFIN, USB_DEVICE_ID_POWERMATE) }, | 1442 | { HID_USB_DEVICE(USB_VENDOR_ID_GRIFFIN, USB_DEVICE_ID_POWERMATE) }, |
1440 | { HID_USB_DEVICE(USB_VENDOR_ID_GRIFFIN, USB_DEVICE_ID_SOUNDKNOB) }, | 1443 | { HID_USB_DEVICE(USB_VENDOR_ID_GRIFFIN, USB_DEVICE_ID_SOUNDKNOB) }, |
@@ -1486,6 +1489,7 @@ static const struct hid_device_id hid_ignore_list[] = { | |||
1486 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1007) }, | 1489 | { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1007) }, |
1487 | { HID_USB_DEVICE(USB_VENDOR_ID_IMATION, USB_DEVICE_ID_DISC_STAKKA) }, | 1490 | { HID_USB_DEVICE(USB_VENDOR_ID_IMATION, USB_DEVICE_ID_DISC_STAKKA) }, |
1488 | { HID_USB_DEVICE(USB_VENDOR_ID_KBGEAR, USB_DEVICE_ID_KBGEAR_JAMSTUDIO) }, | 1491 | { HID_USB_DEVICE(USB_VENDOR_ID_KBGEAR, USB_DEVICE_ID_KBGEAR_JAMSTUDIO) }, |
1492 | { HID_USB_DEVICE(USB_VENDOR_ID_KWORLD, USB_DEVICE_ID_KWORLD_RADIO_FM700) }, | ||
1489 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_GPEN_560) }, | 1493 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_GPEN_560) }, |
1490 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CASSY) }, | 1494 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CASSY) }, |
1491 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POCKETCASSY) }, | 1495 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POCKETCASSY) }, |
@@ -1730,7 +1734,7 @@ static int __init hid_init(void) | |||
1730 | goto err_bus; | 1734 | goto err_bus; |
1731 | 1735 | ||
1732 | #ifdef CONFIG_HID_COMPAT | 1736 | #ifdef CONFIG_HID_COMPAT |
1733 | hid_compat_wq = create_workqueue("hid_compat"); | 1737 | hid_compat_wq = create_singlethread_workqueue("hid_compat"); |
1734 | if (!hid_compat_wq) { | 1738 | if (!hid_compat_wq) { |
1735 | hidraw_exit(); | 1739 | hidraw_exit(); |
1736 | goto err; | 1740 | goto err; |
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index f05bcbbbb0d5..39289699c32f 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h | |||
@@ -82,6 +82,9 @@ | |||
82 | #define USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI 0x0230 | 82 | #define USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI 0x0230 |
83 | #define USB_DEVICE_ID_APPLE_WELLSPRING2_ISO 0x0231 | 83 | #define USB_DEVICE_ID_APPLE_WELLSPRING2_ISO 0x0231 |
84 | #define USB_DEVICE_ID_APPLE_WELLSPRING2_JIS 0x0232 | 84 | #define USB_DEVICE_ID_APPLE_WELLSPRING2_JIS 0x0232 |
85 | #define USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI 0x0236 | ||
86 | #define USB_DEVICE_ID_APPLE_WELLSPRING3_ISO 0x0237 | ||
87 | #define USB_DEVICE_ID_APPLE_WELLSPRING3_JIS 0x0238 | ||
85 | #define USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY 0x030a | 88 | #define USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY 0x030a |
86 | #define USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY 0x030b | 89 | #define USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY 0x030b |
87 | #define USB_DEVICE_ID_APPLE_ATV_IRCONTROL 0x8241 | 90 | #define USB_DEVICE_ID_APPLE_ATV_IRCONTROL 0x8241 |
@@ -160,6 +163,7 @@ | |||
160 | 163 | ||
161 | #define USB_VENDOR_ID_GAMERON 0x0810 | 164 | #define USB_VENDOR_ID_GAMERON 0x0810 |
162 | #define USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR 0x0001 | 165 | #define USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR 0x0001 |
166 | #define USB_DEVICE_ID_GAMERON_DUAL_PCS_ADAPTOR 0x0002 | ||
163 | 167 | ||
164 | #define USB_VENDOR_ID_GENERAL_TOUCH 0x0dfc | 168 | #define USB_VENDOR_ID_GENERAL_TOUCH 0x0dfc |
165 | 169 | ||
diff --git a/drivers/hid/hid-pl.c b/drivers/hid/hid-pl.c index acd815586182..46941f979b9d 100644 --- a/drivers/hid/hid-pl.c +++ b/drivers/hid/hid-pl.c | |||
@@ -178,6 +178,8 @@ err: | |||
178 | static const struct hid_device_id pl_devices[] = { | 178 | static const struct hid_device_id pl_devices[] = { |
179 | { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR), | 179 | { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR), |
180 | .driver_data = 1 }, /* Twin USB Joystick */ | 180 | .driver_data = 1 }, /* Twin USB Joystick */ |
181 | { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PCS_ADAPTOR), | ||
182 | .driver_data = 1 }, /* Twin USB Joystick */ | ||
181 | { HID_USB_DEVICE(USB_VENDOR_ID_GREENASIA, 0x0003), }, /* GreenAsia Inc. USB Joystick */ | 183 | { HID_USB_DEVICE(USB_VENDOR_ID_GREENASIA, 0x0003), }, /* GreenAsia Inc. USB Joystick */ |
182 | { } | 184 | { } |
183 | }; | 185 | }; |
diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c index 894d52e05bf9..7685ae6808c4 100644 --- a/drivers/hid/hidraw.c +++ b/drivers/hid/hidraw.c | |||
@@ -38,7 +38,7 @@ static int hidraw_major; | |||
38 | static struct cdev hidraw_cdev; | 38 | static struct cdev hidraw_cdev; |
39 | static struct class *hidraw_class; | 39 | static struct class *hidraw_class; |
40 | static struct hidraw *hidraw_table[HIDRAW_MAX_DEVICES]; | 40 | static struct hidraw *hidraw_table[HIDRAW_MAX_DEVICES]; |
41 | static DEFINE_SPINLOCK(minors_lock); | 41 | static DEFINE_MUTEX(minors_lock); |
42 | 42 | ||
43 | static ssize_t hidraw_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos) | 43 | static ssize_t hidraw_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos) |
44 | { | 44 | { |
@@ -159,13 +159,13 @@ static int hidraw_open(struct inode *inode, struct file *file) | |||
159 | struct hidraw_list *list; | 159 | struct hidraw_list *list; |
160 | int err = 0; | 160 | int err = 0; |
161 | 161 | ||
162 | lock_kernel(); | ||
163 | if (!(list = kzalloc(sizeof(struct hidraw_list), GFP_KERNEL))) { | 162 | if (!(list = kzalloc(sizeof(struct hidraw_list), GFP_KERNEL))) { |
164 | err = -ENOMEM; | 163 | err = -ENOMEM; |
165 | goto out; | 164 | goto out; |
166 | } | 165 | } |
167 | 166 | ||
168 | spin_lock(&minors_lock); | 167 | lock_kernel(); |
168 | mutex_lock(&minors_lock); | ||
169 | if (!hidraw_table[minor]) { | 169 | if (!hidraw_table[minor]) { |
170 | printk(KERN_EMERG "hidraw device with minor %d doesn't exist\n", | 170 | printk(KERN_EMERG "hidraw device with minor %d doesn't exist\n", |
171 | minor); | 171 | minor); |
@@ -180,13 +180,16 @@ static int hidraw_open(struct inode *inode, struct file *file) | |||
180 | file->private_data = list; | 180 | file->private_data = list; |
181 | 181 | ||
182 | dev = hidraw_table[minor]; | 182 | dev = hidraw_table[minor]; |
183 | if (!dev->open++) | 183 | if (!dev->open++) { |
184 | dev->hid->ll_driver->open(dev->hid); | 184 | err = dev->hid->ll_driver->open(dev->hid); |
185 | if (err < 0) | ||
186 | dev->open--; | ||
187 | } | ||
185 | 188 | ||
186 | out_unlock: | 189 | out_unlock: |
187 | spin_unlock(&minors_lock); | 190 | mutex_unlock(&minors_lock); |
188 | out: | ||
189 | unlock_kernel(); | 191 | unlock_kernel(); |
192 | out: | ||
190 | return err; | 193 | return err; |
191 | 194 | ||
192 | } | 195 | } |
@@ -310,7 +313,7 @@ int hidraw_connect(struct hid_device *hid) | |||
310 | 313 | ||
311 | result = -EINVAL; | 314 | result = -EINVAL; |
312 | 315 | ||
313 | spin_lock(&minors_lock); | 316 | mutex_lock(&minors_lock); |
314 | 317 | ||
315 | for (minor = 0; minor < HIDRAW_MAX_DEVICES; minor++) { | 318 | for (minor = 0; minor < HIDRAW_MAX_DEVICES; minor++) { |
316 | if (hidraw_table[minor]) | 319 | if (hidraw_table[minor]) |
@@ -320,9 +323,8 @@ int hidraw_connect(struct hid_device *hid) | |||
320 | break; | 323 | break; |
321 | } | 324 | } |
322 | 325 | ||
323 | spin_unlock(&minors_lock); | ||
324 | |||
325 | if (result) { | 326 | if (result) { |
327 | mutex_unlock(&minors_lock); | ||
326 | kfree(dev); | 328 | kfree(dev); |
327 | goto out; | 329 | goto out; |
328 | } | 330 | } |
@@ -331,14 +333,14 @@ int hidraw_connect(struct hid_device *hid) | |||
331 | NULL, "%s%d", "hidraw", minor); | 333 | NULL, "%s%d", "hidraw", minor); |
332 | 334 | ||
333 | if (IS_ERR(dev->dev)) { | 335 | if (IS_ERR(dev->dev)) { |
334 | spin_lock(&minors_lock); | ||
335 | hidraw_table[minor] = NULL; | 336 | hidraw_table[minor] = NULL; |
336 | spin_unlock(&minors_lock); | 337 | mutex_unlock(&minors_lock); |
337 | result = PTR_ERR(dev->dev); | 338 | result = PTR_ERR(dev->dev); |
338 | kfree(dev); | 339 | kfree(dev); |
339 | goto out; | 340 | goto out; |
340 | } | 341 | } |
341 | 342 | ||
343 | mutex_unlock(&minors_lock); | ||
342 | init_waitqueue_head(&dev->wait); | 344 | init_waitqueue_head(&dev->wait); |
343 | INIT_LIST_HEAD(&dev->list); | 345 | INIT_LIST_HEAD(&dev->list); |
344 | 346 | ||
@@ -360,9 +362,9 @@ void hidraw_disconnect(struct hid_device *hid) | |||
360 | 362 | ||
361 | hidraw->exist = 0; | 363 | hidraw->exist = 0; |
362 | 364 | ||
363 | spin_lock(&minors_lock); | 365 | mutex_lock(&minors_lock); |
364 | hidraw_table[hidraw->minor] = NULL; | 366 | hidraw_table[hidraw->minor] = NULL; |
365 | spin_unlock(&minors_lock); | 367 | mutex_unlock(&minors_lock); |
366 | 368 | ||
367 | device_destroy(hidraw_class, MKDEV(hidraw_major, hidraw->minor)); | 369 | device_destroy(hidraw_class, MKDEV(hidraw_major, hidraw->minor)); |
368 | 370 | ||
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c index 18e5ddd722cd..606369ea24ca 100644 --- a/drivers/hid/usbhid/hid-core.c +++ b/drivers/hid/usbhid/hid-core.c | |||
@@ -781,6 +781,8 @@ static int usbhid_start(struct hid_device *hid) | |||
781 | unsigned int n, insize = 0; | 781 | unsigned int n, insize = 0; |
782 | int ret; | 782 | int ret; |
783 | 783 | ||
784 | clear_bit(HID_DISCONNECTED, &usbhid->iofl); | ||
785 | |||
784 | usbhid->bufsize = HID_MIN_BUFFER_SIZE; | 786 | usbhid->bufsize = HID_MIN_BUFFER_SIZE; |
785 | hid_find_max_report(hid, HID_INPUT_REPORT, &usbhid->bufsize); | 787 | hid_find_max_report(hid, HID_INPUT_REPORT, &usbhid->bufsize); |
786 | hid_find_max_report(hid, HID_OUTPUT_REPORT, &usbhid->bufsize); | 788 | hid_find_max_report(hid, HID_OUTPUT_REPORT, &usbhid->bufsize); |
@@ -794,7 +796,6 @@ static int usbhid_start(struct hid_device *hid) | |||
794 | if (insize > HID_MAX_BUFFER_SIZE) | 796 | if (insize > HID_MAX_BUFFER_SIZE) |
795 | insize = HID_MAX_BUFFER_SIZE; | 797 | insize = HID_MAX_BUFFER_SIZE; |
796 | 798 | ||
797 | mutex_lock(&usbhid->setup); | ||
798 | if (hid_alloc_buffers(dev, hid)) { | 799 | if (hid_alloc_buffers(dev, hid)) { |
799 | ret = -ENOMEM; | 800 | ret = -ENOMEM; |
800 | goto fail; | 801 | goto fail; |
@@ -847,12 +848,6 @@ static int usbhid_start(struct hid_device *hid) | |||
847 | } | 848 | } |
848 | } | 849 | } |
849 | 850 | ||
850 | if (!usbhid->urbin) { | ||
851 | err_hid("couldn't find an input interrupt endpoint"); | ||
852 | ret = -ENODEV; | ||
853 | goto fail; | ||
854 | } | ||
855 | |||
856 | init_waitqueue_head(&usbhid->wait); | 851 | init_waitqueue_head(&usbhid->wait); |
857 | INIT_WORK(&usbhid->reset_work, hid_reset); | 852 | INIT_WORK(&usbhid->reset_work, hid_reset); |
858 | setup_timer(&usbhid->io_retry, hid_retry_timeout, (unsigned long) hid); | 853 | setup_timer(&usbhid->io_retry, hid_retry_timeout, (unsigned long) hid); |
@@ -880,7 +875,6 @@ static int usbhid_start(struct hid_device *hid) | |||
880 | hid_dump_device(hid); | 875 | hid_dump_device(hid); |
881 | 876 | ||
882 | set_bit(HID_STARTED, &usbhid->iofl); | 877 | set_bit(HID_STARTED, &usbhid->iofl); |
883 | mutex_unlock(&usbhid->setup); | ||
884 | 878 | ||
885 | return 0; | 879 | return 0; |
886 | 880 | ||
@@ -888,8 +882,10 @@ fail: | |||
888 | usb_free_urb(usbhid->urbin); | 882 | usb_free_urb(usbhid->urbin); |
889 | usb_free_urb(usbhid->urbout); | 883 | usb_free_urb(usbhid->urbout); |
890 | usb_free_urb(usbhid->urbctrl); | 884 | usb_free_urb(usbhid->urbctrl); |
885 | usbhid->urbin = NULL; | ||
886 | usbhid->urbout = NULL; | ||
887 | usbhid->urbctrl = NULL; | ||
891 | hid_free_buffers(dev, hid); | 888 | hid_free_buffers(dev, hid); |
892 | mutex_unlock(&usbhid->setup); | ||
893 | return ret; | 889 | return ret; |
894 | } | 890 | } |
895 | 891 | ||
@@ -900,7 +896,6 @@ static void usbhid_stop(struct hid_device *hid) | |||
900 | if (WARN_ON(!usbhid)) | 896 | if (WARN_ON(!usbhid)) |
901 | return; | 897 | return; |
902 | 898 | ||
903 | mutex_lock(&usbhid->setup); | ||
904 | clear_bit(HID_STARTED, &usbhid->iofl); | 899 | clear_bit(HID_STARTED, &usbhid->iofl); |
905 | spin_lock_irq(&usbhid->inlock); /* Sync with error handler */ | 900 | spin_lock_irq(&usbhid->inlock); /* Sync with error handler */ |
906 | set_bit(HID_DISCONNECTED, &usbhid->iofl); | 901 | set_bit(HID_DISCONNECTED, &usbhid->iofl); |
@@ -924,9 +919,11 @@ static void usbhid_stop(struct hid_device *hid) | |||
924 | usb_free_urb(usbhid->urbin); | 919 | usb_free_urb(usbhid->urbin); |
925 | usb_free_urb(usbhid->urbctrl); | 920 | usb_free_urb(usbhid->urbctrl); |
926 | usb_free_urb(usbhid->urbout); | 921 | usb_free_urb(usbhid->urbout); |
922 | usbhid->urbin = NULL; /* don't mess up next start */ | ||
923 | usbhid->urbctrl = NULL; | ||
924 | usbhid->urbout = NULL; | ||
927 | 925 | ||
928 | hid_free_buffers(hid_to_usb_dev(hid), hid); | 926 | hid_free_buffers(hid_to_usb_dev(hid), hid); |
929 | mutex_unlock(&usbhid->setup); | ||
930 | } | 927 | } |
931 | 928 | ||
932 | static struct hid_ll_driver usb_hid_driver = { | 929 | static struct hid_ll_driver usb_hid_driver = { |
@@ -940,15 +937,26 @@ static struct hid_ll_driver usb_hid_driver = { | |||
940 | 937 | ||
941 | static int hid_probe(struct usb_interface *intf, const struct usb_device_id *id) | 938 | static int hid_probe(struct usb_interface *intf, const struct usb_device_id *id) |
942 | { | 939 | { |
940 | struct usb_host_interface *interface = intf->cur_altsetting; | ||
943 | struct usb_device *dev = interface_to_usbdev(intf); | 941 | struct usb_device *dev = interface_to_usbdev(intf); |
944 | struct usbhid_device *usbhid; | 942 | struct usbhid_device *usbhid; |
945 | struct hid_device *hid; | 943 | struct hid_device *hid; |
944 | unsigned int n, has_in = 0; | ||
946 | size_t len; | 945 | size_t len; |
947 | int ret; | 946 | int ret; |
948 | 947 | ||
949 | dbg_hid("HID probe called for ifnum %d\n", | 948 | dbg_hid("HID probe called for ifnum %d\n", |
950 | intf->altsetting->desc.bInterfaceNumber); | 949 | intf->altsetting->desc.bInterfaceNumber); |
951 | 950 | ||
951 | for (n = 0; n < interface->desc.bNumEndpoints; n++) | ||
952 | if (usb_endpoint_is_int_in(&interface->endpoint[n].desc)) | ||
953 | has_in++; | ||
954 | if (!has_in) { | ||
955 | dev_err(&intf->dev, "couldn't find an input interrupt " | ||
956 | "endpoint\n"); | ||
957 | return -ENODEV; | ||
958 | } | ||
959 | |||
952 | hid = hid_allocate_device(); | 960 | hid = hid_allocate_device(); |
953 | if (IS_ERR(hid)) | 961 | if (IS_ERR(hid)) |
954 | return PTR_ERR(hid); | 962 | return PTR_ERR(hid); |
@@ -1003,7 +1011,6 @@ static int hid_probe(struct usb_interface *intf, const struct usb_device_id *id) | |||
1003 | 1011 | ||
1004 | hid->driver_data = usbhid; | 1012 | hid->driver_data = usbhid; |
1005 | usbhid->hid = hid; | 1013 | usbhid->hid = hid; |
1006 | mutex_init(&usbhid->setup); /* needed on suspend/resume */ | ||
1007 | 1014 | ||
1008 | ret = hid_add_device(hid); | 1015 | ret = hid_add_device(hid); |
1009 | if (ret) { | 1016 | if (ret) { |
@@ -1038,18 +1045,14 @@ static int hid_suspend(struct usb_interface *intf, pm_message_t message) | |||
1038 | struct hid_device *hid = usb_get_intfdata (intf); | 1045 | struct hid_device *hid = usb_get_intfdata (intf); |
1039 | struct usbhid_device *usbhid = hid->driver_data; | 1046 | struct usbhid_device *usbhid = hid->driver_data; |
1040 | 1047 | ||
1041 | mutex_lock(&usbhid->setup); | 1048 | if (!test_bit(HID_STARTED, &usbhid->iofl)) |
1042 | if (!test_bit(HID_STARTED, &usbhid->iofl)) { | ||
1043 | mutex_unlock(&usbhid->setup); | ||
1044 | return 0; | 1049 | return 0; |
1045 | } | ||
1046 | 1050 | ||
1047 | spin_lock_irq(&usbhid->inlock); /* Sync with error handler */ | 1051 | spin_lock_irq(&usbhid->inlock); /* Sync with error handler */ |
1048 | set_bit(HID_SUSPENDED, &usbhid->iofl); | 1052 | set_bit(HID_SUSPENDED, &usbhid->iofl); |
1049 | spin_unlock_irq(&usbhid->inlock); | 1053 | spin_unlock_irq(&usbhid->inlock); |
1050 | del_timer_sync(&usbhid->io_retry); | 1054 | del_timer_sync(&usbhid->io_retry); |
1051 | usb_kill_urb(usbhid->urbin); | 1055 | usb_kill_urb(usbhid->urbin); |
1052 | mutex_unlock(&usbhid->setup); | ||
1053 | dev_dbg(&intf->dev, "suspend\n"); | 1056 | dev_dbg(&intf->dev, "suspend\n"); |
1054 | return 0; | 1057 | return 0; |
1055 | } | 1058 | } |
@@ -1060,16 +1063,12 @@ static int hid_resume(struct usb_interface *intf) | |||
1060 | struct usbhid_device *usbhid = hid->driver_data; | 1063 | struct usbhid_device *usbhid = hid->driver_data; |
1061 | int status; | 1064 | int status; |
1062 | 1065 | ||
1063 | mutex_lock(&usbhid->setup); | 1066 | if (!test_bit(HID_STARTED, &usbhid->iofl)) |
1064 | if (!test_bit(HID_STARTED, &usbhid->iofl)) { | ||
1065 | mutex_unlock(&usbhid->setup); | ||
1066 | return 0; | 1067 | return 0; |
1067 | } | ||
1068 | 1068 | ||
1069 | clear_bit(HID_SUSPENDED, &usbhid->iofl); | 1069 | clear_bit(HID_SUSPENDED, &usbhid->iofl); |
1070 | usbhid->retry_delay = 0; | 1070 | usbhid->retry_delay = 0; |
1071 | status = hid_start_in(hid); | 1071 | status = hid_start_in(hid); |
1072 | mutex_unlock(&usbhid->setup); | ||
1073 | dev_dbg(&intf->dev, "resume status %d\n", status); | 1072 | dev_dbg(&intf->dev, "resume status %d\n", status); |
1074 | return status; | 1073 | return status; |
1075 | } | 1074 | } |
diff --git a/drivers/hid/usbhid/usbhid.h b/drivers/hid/usbhid/usbhid.h index 55973ff54008..332abcdf9956 100644 --- a/drivers/hid/usbhid/usbhid.h +++ b/drivers/hid/usbhid/usbhid.h | |||
@@ -74,7 +74,6 @@ struct usbhid_device { | |||
74 | dma_addr_t outbuf_dma; /* Output buffer dma */ | 74 | dma_addr_t outbuf_dma; /* Output buffer dma */ |
75 | spinlock_t outlock; /* Output fifo spinlock */ | 75 | spinlock_t outlock; /* Output fifo spinlock */ |
76 | 76 | ||
77 | struct mutex setup; | ||
78 | unsigned long iofl; /* I/O flags (CTRL_RUNNING, OUT_RUNNING) */ | 77 | unsigned long iofl; /* I/O flags (CTRL_RUNNING, OUT_RUNNING) */ |
79 | struct timer_list io_retry; /* Retry timer */ | 78 | struct timer_list io_retry; /* Retry timer */ |
80 | unsigned long stop_retry; /* Time to give up, in jiffies */ | 79 | unsigned long stop_retry; /* Time to give up, in jiffies */ |
diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig index 6de1e0ffd391..c709e821f04b 100644 --- a/drivers/hwmon/Kconfig +++ b/drivers/hwmon/Kconfig | |||
@@ -159,6 +159,16 @@ config SENSORS_ADM9240 | |||
159 | This driver can also be built as a module. If so, the module | 159 | This driver can also be built as a module. If so, the module |
160 | will be called adm9240. | 160 | will be called adm9240. |
161 | 161 | ||
162 | config SENSORS_ADT7462 | ||
163 | tristate "Analog Devices ADT7462" | ||
164 | depends on I2C && EXPERIMENTAL | ||
165 | help | ||
166 | If you say yes here you get support for the Analog Devices | ||
167 | ADT7462 temperature monitoring chips. | ||
168 | |||
169 | This driver can also be built as a module. If so, the module | ||
170 | will be called adt7462. | ||
171 | |||
162 | config SENSORS_ADT7470 | 172 | config SENSORS_ADT7470 |
163 | tristate "Analog Devices ADT7470" | 173 | tristate "Analog Devices ADT7470" |
164 | depends on I2C && EXPERIMENTAL | 174 | depends on I2C && EXPERIMENTAL |
@@ -825,6 +835,25 @@ config SENSORS_HDAPS | |||
825 | Say Y here if you have an applicable laptop and want to experience | 835 | Say Y here if you have an applicable laptop and want to experience |
826 | the awesome power of hdaps. | 836 | the awesome power of hdaps. |
827 | 837 | ||
838 | config SENSORS_LIS3LV02D | ||
839 | tristate "STMicroeletronics LIS3LV02Dx three-axis digital accelerometer" | ||
840 | depends on ACPI && INPUT | ||
841 | default n | ||
842 | help | ||
843 | This driver provides support for the LIS3LV02Dx accelerometer. In | ||
844 | particular, it can be found in a number of HP laptops, which have the | ||
845 | "Mobile Data Protection System 3D" or "3D DriveGuard" feature. On such | ||
846 | systems the driver should load automatically (via ACPI). The | ||
847 | accelerometer might also be found in other systems, connected via SPI | ||
848 | or I2C. The accelerometer data is readable via | ||
849 | /sys/devices/platform/lis3lv02d. | ||
850 | |||
851 | This driver also provides an absolute input class device, allowing | ||
852 | the laptop to act as a pinball machine-esque joystick. | ||
853 | |||
854 | This driver can also be built as a module. If so, the module | ||
855 | will be called lis3lv02d. | ||
856 | |||
828 | config SENSORS_APPLESMC | 857 | config SENSORS_APPLESMC |
829 | tristate "Apple SMC (Motion sensor, light sensor, keyboard backlight)" | 858 | tristate "Apple SMC (Motion sensor, light sensor, keyboard backlight)" |
830 | depends on INPUT && X86 | 859 | depends on INPUT && X86 |
diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile index 042d5a78622e..58fc5be5355d 100644 --- a/drivers/hwmon/Makefile +++ b/drivers/hwmon/Makefile | |||
@@ -25,6 +25,7 @@ obj-$(CONFIG_SENSORS_ADM1029) += adm1029.o | |||
25 | obj-$(CONFIG_SENSORS_ADM1031) += adm1031.o | 25 | obj-$(CONFIG_SENSORS_ADM1031) += adm1031.o |
26 | obj-$(CONFIG_SENSORS_ADM9240) += adm9240.o | 26 | obj-$(CONFIG_SENSORS_ADM9240) += adm9240.o |
27 | obj-$(CONFIG_SENSORS_ADS7828) += ads7828.o | 27 | obj-$(CONFIG_SENSORS_ADS7828) += ads7828.o |
28 | obj-$(CONFIG_SENSORS_ADT7462) += adt7462.o | ||
28 | obj-$(CONFIG_SENSORS_ADT7470) += adt7470.o | 29 | obj-$(CONFIG_SENSORS_ADT7470) += adt7470.o |
29 | obj-$(CONFIG_SENSORS_ADT7473) += adt7473.o | 30 | obj-$(CONFIG_SENSORS_ADT7473) += adt7473.o |
30 | obj-$(CONFIG_SENSORS_APPLESMC) += applesmc.o | 31 | obj-$(CONFIG_SENSORS_APPLESMC) += applesmc.o |
@@ -48,6 +49,7 @@ obj-$(CONFIG_SENSORS_IBMAEM) += ibmaem.o | |||
48 | obj-$(CONFIG_SENSORS_IBMPEX) += ibmpex.o | 49 | obj-$(CONFIG_SENSORS_IBMPEX) += ibmpex.o |
49 | obj-$(CONFIG_SENSORS_IT87) += it87.o | 50 | obj-$(CONFIG_SENSORS_IT87) += it87.o |
50 | obj-$(CONFIG_SENSORS_K8TEMP) += k8temp.o | 51 | obj-$(CONFIG_SENSORS_K8TEMP) += k8temp.o |
52 | obj-$(CONFIG_SENSORS_LIS3LV02D) += lis3lv02d.o | ||
51 | obj-$(CONFIG_SENSORS_LM63) += lm63.o | 53 | obj-$(CONFIG_SENSORS_LM63) += lm63.o |
52 | obj-$(CONFIG_SENSORS_LM70) += lm70.o | 54 | obj-$(CONFIG_SENSORS_LM70) += lm70.o |
53 | obj-$(CONFIG_SENSORS_LM75) += lm75.o | 55 | obj-$(CONFIG_SENSORS_LM75) += lm75.o |
diff --git a/drivers/hwmon/adt7462.c b/drivers/hwmon/adt7462.c new file mode 100644 index 000000000000..66107b4dc12a --- /dev/null +++ b/drivers/hwmon/adt7462.c | |||
@@ -0,0 +1,2002 @@ | |||
1 | /* | ||
2 | * A hwmon driver for the Analog Devices ADT7462 | ||
3 | * Copyright (C) 2008 IBM | ||
4 | * | ||
5 | * Author: Darrick J. Wong <djwong@us.ibm.com> | ||
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 as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
20 | */ | ||
21 | |||
22 | #include <linux/module.h> | ||
23 | #include <linux/jiffies.h> | ||
24 | #include <linux/i2c.h> | ||
25 | #include <linux/hwmon.h> | ||
26 | #include <linux/hwmon-sysfs.h> | ||
27 | #include <linux/err.h> | ||
28 | #include <linux/mutex.h> | ||
29 | #include <linux/delay.h> | ||
30 | #include <linux/log2.h> | ||
31 | |||
32 | /* Addresses to scan */ | ||
33 | static const unsigned short normal_i2c[] = { 0x58, 0x5C, I2C_CLIENT_END }; | ||
34 | |||
35 | /* Insmod parameters */ | ||
36 | I2C_CLIENT_INSMOD_1(adt7462); | ||
37 | |||
38 | /* ADT7462 registers */ | ||
39 | #define ADT7462_REG_DEVICE 0x3D | ||
40 | #define ADT7462_REG_VENDOR 0x3E | ||
41 | #define ADT7462_REG_REVISION 0x3F | ||
42 | |||
43 | #define ADT7462_REG_MIN_TEMP_BASE_ADDR 0x44 | ||
44 | #define ADT7462_REG_MIN_TEMP_MAX_ADDR 0x47 | ||
45 | #define ADT7462_REG_MAX_TEMP_BASE_ADDR 0x48 | ||
46 | #define ADT7462_REG_MAX_TEMP_MAX_ADDR 0x4B | ||
47 | #define ADT7462_REG_TEMP_BASE_ADDR 0x88 | ||
48 | #define ADT7462_REG_TEMP_MAX_ADDR 0x8F | ||
49 | |||
50 | #define ADT7462_REG_FAN_BASE_ADDR 0x98 | ||
51 | #define ADT7462_REG_FAN_MAX_ADDR 0x9F | ||
52 | #define ADT7462_REG_FAN2_BASE_ADDR 0xA2 | ||
53 | #define ADT7462_REG_FAN2_MAX_ADDR 0xA9 | ||
54 | #define ADT7462_REG_FAN_ENABLE 0x07 | ||
55 | #define ADT7462_REG_FAN_MIN_BASE_ADDR 0x78 | ||
56 | #define ADT7462_REG_FAN_MIN_MAX_ADDR 0x7F | ||
57 | |||
58 | #define ADT7462_REG_CFG2 0x02 | ||
59 | #define ADT7462_FSPD_MASK 0x20 | ||
60 | |||
61 | #define ADT7462_REG_PWM_BASE_ADDR 0xAA | ||
62 | #define ADT7462_REG_PWM_MAX_ADDR 0xAD | ||
63 | #define ADT7462_REG_PWM_MIN_BASE_ADDR 0x28 | ||
64 | #define ADT7462_REG_PWM_MIN_MAX_ADDR 0x2B | ||
65 | #define ADT7462_REG_PWM_MAX 0x2C | ||
66 | #define ADT7462_REG_PWM_TEMP_MIN_BASE_ADDR 0x5C | ||
67 | #define ADT7462_REG_PWM_TEMP_MIN_MAX_ADDR 0x5F | ||
68 | #define ADT7462_REG_PWM_TEMP_RANGE_BASE_ADDR 0x60 | ||
69 | #define ADT7462_REG_PWM_TEMP_RANGE_MAX_ADDR 0x63 | ||
70 | #define ADT7462_PWM_HYST_MASK 0x0F | ||
71 | #define ADT7462_PWM_RANGE_MASK 0xF0 | ||
72 | #define ADT7462_PWM_RANGE_SHIFT 4 | ||
73 | #define ADT7462_REG_PWM_CFG_BASE_ADDR 0x21 | ||
74 | #define ADT7462_REG_PWM_CFG_MAX_ADDR 0x24 | ||
75 | #define ADT7462_PWM_CHANNEL_MASK 0xE0 | ||
76 | #define ADT7462_PWM_CHANNEL_SHIFT 5 | ||
77 | |||
78 | #define ADT7462_REG_PIN_CFG_BASE_ADDR 0x10 | ||
79 | #define ADT7462_REG_PIN_CFG_MAX_ADDR 0x13 | ||
80 | #define ADT7462_PIN7_INPUT 0x01 /* cfg0 */ | ||
81 | #define ADT7462_DIODE3_INPUT 0x20 | ||
82 | #define ADT7462_DIODE1_INPUT 0x40 | ||
83 | #define ADT7462_VID_INPUT 0x80 | ||
84 | #define ADT7462_PIN22_INPUT 0x04 /* cfg1 */ | ||
85 | #define ADT7462_PIN21_INPUT 0x08 | ||
86 | #define ADT7462_PIN19_INPUT 0x10 | ||
87 | #define ADT7462_PIN15_INPUT 0x20 | ||
88 | #define ADT7462_PIN13_INPUT 0x40 | ||
89 | #define ADT7462_PIN8_INPUT 0x80 | ||
90 | #define ADT7462_PIN23_MASK 0x03 | ||
91 | #define ADT7462_PIN23_SHIFT 0 | ||
92 | #define ADT7462_PIN26_MASK 0x0C /* cfg2 */ | ||
93 | #define ADT7462_PIN26_SHIFT 2 | ||
94 | #define ADT7462_PIN25_MASK 0x30 | ||
95 | #define ADT7462_PIN25_SHIFT 4 | ||
96 | #define ADT7462_PIN24_MASK 0xC0 | ||
97 | #define ADT7462_PIN24_SHIFT 6 | ||
98 | #define ADT7462_PIN26_VOLT_INPUT 0x08 | ||
99 | #define ADT7462_PIN25_VOLT_INPUT 0x20 | ||
100 | #define ADT7462_PIN28_SHIFT 6 /* cfg3 */ | ||
101 | #define ADT7462_PIN28_VOLT 0x5 | ||
102 | |||
103 | #define ADT7462_REG_ALARM1 0xB8 | ||
104 | #define ADT7462_LT_ALARM 0x02 | ||
105 | #define ADT7462_R1T_ALARM 0x04 | ||
106 | #define ADT7462_R2T_ALARM 0x08 | ||
107 | #define ADT7462_R3T_ALARM 0x10 | ||
108 | #define ADT7462_REG_ALARM2 0xBB | ||
109 | #define ADT7462_V0_ALARM 0x01 | ||
110 | #define ADT7462_V1_ALARM 0x02 | ||
111 | #define ADT7462_V2_ALARM 0x04 | ||
112 | #define ADT7462_V3_ALARM 0x08 | ||
113 | #define ADT7462_V4_ALARM 0x10 | ||
114 | #define ADT7462_V5_ALARM 0x20 | ||
115 | #define ADT7462_V6_ALARM 0x40 | ||
116 | #define ADT7462_V7_ALARM 0x80 | ||
117 | #define ADT7462_REG_ALARM3 0xBC | ||
118 | #define ADT7462_V8_ALARM 0x08 | ||
119 | #define ADT7462_V9_ALARM 0x10 | ||
120 | #define ADT7462_V10_ALARM 0x20 | ||
121 | #define ADT7462_V11_ALARM 0x40 | ||
122 | #define ADT7462_V12_ALARM 0x80 | ||
123 | #define ADT7462_REG_ALARM4 0xBD | ||
124 | #define ADT7462_F0_ALARM 0x01 | ||
125 | #define ADT7462_F1_ALARM 0x02 | ||
126 | #define ADT7462_F2_ALARM 0x04 | ||
127 | #define ADT7462_F3_ALARM 0x08 | ||
128 | #define ADT7462_F4_ALARM 0x10 | ||
129 | #define ADT7462_F5_ALARM 0x20 | ||
130 | #define ADT7462_F6_ALARM 0x40 | ||
131 | #define ADT7462_F7_ALARM 0x80 | ||
132 | #define ADT7462_ALARM1 0x0000 | ||
133 | #define ADT7462_ALARM2 0x0100 | ||
134 | #define ADT7462_ALARM3 0x0200 | ||
135 | #define ADT7462_ALARM4 0x0300 | ||
136 | #define ADT7462_ALARM_REG_SHIFT 8 | ||
137 | #define ADT7462_ALARM_FLAG_MASK 0x0F | ||
138 | |||
139 | #define ADT7462_TEMP_COUNT 4 | ||
140 | #define ADT7462_TEMP_REG(x) (ADT7462_REG_TEMP_BASE_ADDR + (x * 2)) | ||
141 | #define ADT7462_TEMP_MIN_REG(x) (ADT7462_REG_MIN_TEMP_BASE_ADDR + (x)) | ||
142 | #define ADT7462_TEMP_MAX_REG(x) (ADT7462_REG_MAX_TEMP_BASE_ADDR + (x)) | ||
143 | #define TEMP_FRAC_OFFSET 6 | ||
144 | |||
145 | #define ADT7462_FAN_COUNT 8 | ||
146 | #define ADT7462_REG_FAN_MIN(x) (ADT7462_REG_FAN_MIN_BASE_ADDR + (x)) | ||
147 | |||
148 | #define ADT7462_PWM_COUNT 4 | ||
149 | #define ADT7462_REG_PWM(x) (ADT7462_REG_PWM_BASE_ADDR + (x)) | ||
150 | #define ADT7462_REG_PWM_MIN(x) (ADT7462_REG_PWM_MIN_BASE_ADDR + (x)) | ||
151 | #define ADT7462_REG_PWM_TMIN(x) \ | ||
152 | (ADT7462_REG_PWM_TEMP_MIN_BASE_ADDR + (x)) | ||
153 | #define ADT7462_REG_PWM_TRANGE(x) \ | ||
154 | (ADT7462_REG_PWM_TEMP_RANGE_BASE_ADDR + (x)) | ||
155 | |||
156 | #define ADT7462_PIN_CFG_REG_COUNT 4 | ||
157 | #define ADT7462_REG_PIN_CFG(x) (ADT7462_REG_PIN_CFG_BASE_ADDR + (x)) | ||
158 | #define ADT7462_REG_PWM_CFG(x) (ADT7462_REG_PWM_CFG_BASE_ADDR + (x)) | ||
159 | |||
160 | #define ADT7462_ALARM_REG_COUNT 4 | ||
161 | |||
162 | /* | ||
163 | * The chip can measure 13 different voltage sources: | ||
164 | * | ||
165 | * 1. +12V1 (pin 7) | ||
166 | * 2. Vccp1/+2.5V/+1.8V/+1.5V (pin 23) | ||
167 | * 3. +12V3 (pin 22) | ||
168 | * 4. +5V (pin 21) | ||
169 | * 5. +1.25V/+0.9V (pin 19) | ||
170 | * 6. +2.5V/+1.8V (pin 15) | ||
171 | * 7. +3.3v (pin 13) | ||
172 | * 8. +12V2 (pin 8) | ||
173 | * 9. Vbatt/FSB_Vtt (pin 26) | ||
174 | * A. +3.3V/+1.2V1 (pin 25) | ||
175 | * B. Vccp2/+2.5V/+1.8V/+1.5V (pin 24) | ||
176 | * C. +1.5V ICH (only if BOTH pin 28/29 are set to +1.5V) | ||
177 | * D. +1.5V 3GPIO (only if BOTH pin 28/29 are set to +1.5V) | ||
178 | * | ||
179 | * Each of these 13 has a factor to convert raw to voltage. Even better, | ||
180 | * the pins can be connected to other sensors (tach/gpio/hot/etc), which | ||
181 | * makes the bookkeeping tricky. | ||
182 | * | ||
183 | * Some, but not all, of these voltages have low/high limits. | ||
184 | */ | ||
185 | #define ADT7462_VOLT_COUNT 12 | ||
186 | |||
187 | #define ADT7462_VENDOR 0x41 | ||
188 | #define ADT7462_DEVICE 0x62 | ||
189 | /* datasheet only mentions a revision 4 */ | ||
190 | #define ADT7462_REVISION 0x04 | ||
191 | |||
192 | /* How often do we reread sensors values? (In jiffies) */ | ||
193 | #define SENSOR_REFRESH_INTERVAL (2 * HZ) | ||
194 | |||
195 | /* How often do we reread sensor limit values? (In jiffies) */ | ||
196 | #define LIMIT_REFRESH_INTERVAL (60 * HZ) | ||
197 | |||
198 | /* datasheet says to divide this number by the fan reading to get fan rpm */ | ||
199 | #define FAN_PERIOD_TO_RPM(x) ((90000 * 60) / (x)) | ||
200 | #define FAN_RPM_TO_PERIOD FAN_PERIOD_TO_RPM | ||
201 | #define FAN_PERIOD_INVALID 65535 | ||
202 | #define FAN_DATA_VALID(x) ((x) && (x) != FAN_PERIOD_INVALID) | ||
203 | |||
204 | #define MASK_AND_SHIFT(value, prefix) \ | ||
205 | (((value) & prefix##_MASK) >> prefix##_SHIFT) | ||
206 | |||
207 | #define ROUND_DIV(x, divisor) (((x) + ((divisor) / 2)) / (divisor)) | ||
208 | |||
209 | struct adt7462_data { | ||
210 | struct device *hwmon_dev; | ||
211 | struct attribute_group attrs; | ||
212 | struct mutex lock; | ||
213 | char sensors_valid; | ||
214 | char limits_valid; | ||
215 | unsigned long sensors_last_updated; /* In jiffies */ | ||
216 | unsigned long limits_last_updated; /* In jiffies */ | ||
217 | |||
218 | u8 temp[ADT7462_TEMP_COUNT]; | ||
219 | /* bits 6-7 are quarter pieces of temp */ | ||
220 | u8 temp_frac[ADT7462_TEMP_COUNT]; | ||
221 | u8 temp_min[ADT7462_TEMP_COUNT]; | ||
222 | u8 temp_max[ADT7462_TEMP_COUNT]; | ||
223 | u16 fan[ADT7462_FAN_COUNT]; | ||
224 | u8 fan_enabled; | ||
225 | u8 fan_min[ADT7462_FAN_COUNT]; | ||
226 | u8 cfg2; | ||
227 | u8 pwm[ADT7462_PWM_COUNT]; | ||
228 | u8 pin_cfg[ADT7462_PIN_CFG_REG_COUNT]; | ||
229 | u8 voltages[ADT7462_VOLT_COUNT]; | ||
230 | u8 volt_max[ADT7462_VOLT_COUNT]; | ||
231 | u8 volt_min[ADT7462_VOLT_COUNT]; | ||
232 | u8 pwm_min[ADT7462_PWM_COUNT]; | ||
233 | u8 pwm_tmin[ADT7462_PWM_COUNT]; | ||
234 | u8 pwm_trange[ADT7462_PWM_COUNT]; | ||
235 | u8 pwm_max; /* only one per chip */ | ||
236 | u8 pwm_cfg[ADT7462_PWM_COUNT]; | ||
237 | u8 alarms[ADT7462_ALARM_REG_COUNT]; | ||
238 | }; | ||
239 | |||
240 | static int adt7462_probe(struct i2c_client *client, | ||
241 | const struct i2c_device_id *id); | ||
242 | static int adt7462_detect(struct i2c_client *client, int kind, | ||
243 | struct i2c_board_info *info); | ||
244 | static int adt7462_remove(struct i2c_client *client); | ||
245 | |||
246 | static const struct i2c_device_id adt7462_id[] = { | ||
247 | { "adt7462", adt7462 }, | ||
248 | { } | ||
249 | }; | ||
250 | MODULE_DEVICE_TABLE(i2c, adt7462_id); | ||
251 | |||
252 | static struct i2c_driver adt7462_driver = { | ||
253 | .class = I2C_CLASS_HWMON, | ||
254 | .driver = { | ||
255 | .name = "adt7462", | ||
256 | }, | ||
257 | .probe = adt7462_probe, | ||
258 | .remove = adt7462_remove, | ||
259 | .id_table = adt7462_id, | ||
260 | .detect = adt7462_detect, | ||
261 | .address_data = &addr_data, | ||
262 | }; | ||
263 | |||
264 | /* | ||
265 | * 16-bit registers on the ADT7462 are low-byte first. The data sheet says | ||
266 | * that the low byte must be read before the high byte. | ||
267 | */ | ||
268 | static inline int adt7462_read_word_data(struct i2c_client *client, u8 reg) | ||
269 | { | ||
270 | u16 foo; | ||
271 | foo = i2c_smbus_read_byte_data(client, reg); | ||
272 | foo |= ((u16)i2c_smbus_read_byte_data(client, reg + 1) << 8); | ||
273 | return foo; | ||
274 | } | ||
275 | |||
276 | /* For some reason these registers are not contiguous. */ | ||
277 | static int ADT7462_REG_FAN(int fan) | ||
278 | { | ||
279 | if (fan < 4) | ||
280 | return ADT7462_REG_FAN_BASE_ADDR + (2 * fan); | ||
281 | return ADT7462_REG_FAN2_BASE_ADDR + (2 * (fan - 4)); | ||
282 | } | ||
283 | |||
284 | /* Voltage registers are scattered everywhere */ | ||
285 | static int ADT7462_REG_VOLT_MAX(struct adt7462_data *data, int which) | ||
286 | { | ||
287 | switch (which) { | ||
288 | case 0: | ||
289 | if (!(data->pin_cfg[0] & ADT7462_PIN7_INPUT)) | ||
290 | return 0x7C; | ||
291 | break; | ||
292 | case 1: | ||
293 | return 0x69; | ||
294 | case 2: | ||
295 | if (!(data->pin_cfg[1] & ADT7462_PIN22_INPUT)) | ||
296 | return 0x7F; | ||
297 | break; | ||
298 | case 3: | ||
299 | if (!(data->pin_cfg[1] & ADT7462_PIN21_INPUT)) | ||
300 | return 0x7E; | ||
301 | break; | ||
302 | case 4: | ||
303 | if (!(data->pin_cfg[0] & ADT7462_DIODE3_INPUT)) | ||
304 | return 0x4B; | ||
305 | break; | ||
306 | case 5: | ||
307 | if (!(data->pin_cfg[0] & ADT7462_DIODE1_INPUT)) | ||
308 | return 0x49; | ||
309 | break; | ||
310 | case 6: | ||
311 | if (!(data->pin_cfg[1] & ADT7462_PIN13_INPUT)) | ||
312 | return 0x68; | ||
313 | break; | ||
314 | case 7: | ||
315 | if (!(data->pin_cfg[1] & ADT7462_PIN8_INPUT)) | ||
316 | return 0x7D; | ||
317 | break; | ||
318 | case 8: | ||
319 | if (!(data->pin_cfg[2] & ADT7462_PIN26_VOLT_INPUT)) | ||
320 | return 0x6C; | ||
321 | break; | ||
322 | case 9: | ||
323 | if (!(data->pin_cfg[2] & ADT7462_PIN25_VOLT_INPUT)) | ||
324 | return 0x6B; | ||
325 | break; | ||
326 | case 10: | ||
327 | return 0x6A; | ||
328 | case 11: | ||
329 | if (data->pin_cfg[3] >> ADT7462_PIN28_SHIFT == | ||
330 | ADT7462_PIN28_VOLT && | ||
331 | !(data->pin_cfg[0] & ADT7462_VID_INPUT)) | ||
332 | return 0x50; | ||
333 | break; | ||
334 | case 12: | ||
335 | if (data->pin_cfg[3] >> ADT7462_PIN28_SHIFT == | ||
336 | ADT7462_PIN28_VOLT && | ||
337 | !(data->pin_cfg[0] & ADT7462_VID_INPUT)) | ||
338 | return 0x4C; | ||
339 | break; | ||
340 | } | ||
341 | return -ENODEV; | ||
342 | } | ||
343 | |||
344 | static int ADT7462_REG_VOLT_MIN(struct adt7462_data *data, int which) | ||
345 | { | ||
346 | switch (which) { | ||
347 | case 0: | ||
348 | if (!(data->pin_cfg[0] & ADT7462_PIN7_INPUT)) | ||
349 | return 0x6D; | ||
350 | break; | ||
351 | case 1: | ||
352 | return 0x72; | ||
353 | case 2: | ||
354 | if (!(data->pin_cfg[1] & ADT7462_PIN22_INPUT)) | ||
355 | return 0x6F; | ||
356 | break; | ||
357 | case 3: | ||
358 | if (!(data->pin_cfg[1] & ADT7462_PIN21_INPUT)) | ||
359 | return 0x71; | ||
360 | break; | ||
361 | case 4: | ||
362 | if (!(data->pin_cfg[0] & ADT7462_DIODE3_INPUT)) | ||
363 | return 0x47; | ||
364 | break; | ||
365 | case 5: | ||
366 | if (!(data->pin_cfg[0] & ADT7462_DIODE1_INPUT)) | ||
367 | return 0x45; | ||
368 | break; | ||
369 | case 6: | ||
370 | if (!(data->pin_cfg[1] & ADT7462_PIN13_INPUT)) | ||
371 | return 0x70; | ||
372 | break; | ||
373 | case 7: | ||
374 | if (!(data->pin_cfg[1] & ADT7462_PIN8_INPUT)) | ||
375 | return 0x6E; | ||
376 | break; | ||
377 | case 8: | ||
378 | if (!(data->pin_cfg[2] & ADT7462_PIN26_VOLT_INPUT)) | ||
379 | return 0x75; | ||
380 | break; | ||
381 | case 9: | ||
382 | if (!(data->pin_cfg[2] & ADT7462_PIN25_VOLT_INPUT)) | ||
383 | return 0x74; | ||
384 | break; | ||
385 | case 10: | ||
386 | return 0x73; | ||
387 | case 11: | ||
388 | if (data->pin_cfg[3] >> ADT7462_PIN28_SHIFT == | ||
389 | ADT7462_PIN28_VOLT && | ||
390 | !(data->pin_cfg[0] & ADT7462_VID_INPUT)) | ||
391 | return 0x76; | ||
392 | break; | ||
393 | case 12: | ||
394 | if (data->pin_cfg[3] >> ADT7462_PIN28_SHIFT == | ||
395 | ADT7462_PIN28_VOLT && | ||
396 | !(data->pin_cfg[0] & ADT7462_VID_INPUT)) | ||
397 | return 0x77; | ||
398 | break; | ||
399 | } | ||
400 | return -ENODEV; | ||
401 | } | ||
402 | |||
403 | static int ADT7462_REG_VOLT(struct adt7462_data *data, int which) | ||
404 | { | ||
405 | switch (which) { | ||
406 | case 0: | ||
407 | if (!(data->pin_cfg[0] & ADT7462_PIN7_INPUT)) | ||
408 | return 0xA3; | ||
409 | break; | ||
410 | case 1: | ||
411 | return 0x90; | ||
412 | case 2: | ||
413 | if (!(data->pin_cfg[1] & ADT7462_PIN22_INPUT)) | ||
414 | return 0xA9; | ||
415 | break; | ||
416 | case 3: | ||
417 | if (!(data->pin_cfg[1] & ADT7462_PIN21_INPUT)) | ||
418 | return 0xA7; | ||
419 | break; | ||
420 | case 4: | ||
421 | if (!(data->pin_cfg[0] & ADT7462_DIODE3_INPUT)) | ||
422 | return 0x8F; | ||
423 | break; | ||
424 | case 5: | ||
425 | if (!(data->pin_cfg[0] & ADT7462_DIODE1_INPUT)) | ||
426 | return 0x8B; | ||
427 | break; | ||
428 | case 6: | ||
429 | if (!(data->pin_cfg[1] & ADT7462_PIN13_INPUT)) | ||
430 | return 0x96; | ||
431 | break; | ||
432 | case 7: | ||
433 | if (!(data->pin_cfg[1] & ADT7462_PIN8_INPUT)) | ||
434 | return 0xA5; | ||
435 | break; | ||
436 | case 8: | ||
437 | if (!(data->pin_cfg[2] & ADT7462_PIN26_VOLT_INPUT)) | ||
438 | return 0x93; | ||
439 | break; | ||
440 | case 9: | ||
441 | if (!(data->pin_cfg[2] & ADT7462_PIN25_VOLT_INPUT)) | ||
442 | return 0x92; | ||
443 | break; | ||
444 | case 10: | ||
445 | return 0x91; | ||
446 | case 11: | ||
447 | if (data->pin_cfg[3] >> ADT7462_PIN28_SHIFT == | ||
448 | ADT7462_PIN28_VOLT && | ||
449 | !(data->pin_cfg[0] & ADT7462_VID_INPUT)) | ||
450 | return 0x94; | ||
451 | break; | ||
452 | case 12: | ||
453 | if (data->pin_cfg[3] >> ADT7462_PIN28_SHIFT == | ||
454 | ADT7462_PIN28_VOLT && | ||
455 | !(data->pin_cfg[0] & ADT7462_VID_INPUT)) | ||
456 | return 0x95; | ||
457 | break; | ||
458 | } | ||
459 | return -ENODEV; | ||
460 | } | ||
461 | |||
462 | /* Provide labels for sysfs */ | ||
463 | static const char *voltage_label(struct adt7462_data *data, int which) | ||
464 | { | ||
465 | switch (which) { | ||
466 | case 0: | ||
467 | if (!(data->pin_cfg[0] & ADT7462_PIN7_INPUT)) | ||
468 | return "+12V1"; | ||
469 | break; | ||
470 | case 1: | ||
471 | switch (MASK_AND_SHIFT(data->pin_cfg[1], ADT7462_PIN23)) { | ||
472 | case 0: | ||
473 | return "Vccp1"; | ||
474 | case 1: | ||
475 | return "+2.5V"; | ||
476 | case 2: | ||
477 | return "+1.8V"; | ||
478 | case 3: | ||
479 | return "+1.5V"; | ||
480 | } | ||
481 | case 2: | ||
482 | if (!(data->pin_cfg[1] & ADT7462_PIN22_INPUT)) | ||
483 | return "+12V3"; | ||
484 | break; | ||
485 | case 3: | ||
486 | if (!(data->pin_cfg[1] & ADT7462_PIN21_INPUT)) | ||
487 | return "+5V"; | ||
488 | break; | ||
489 | case 4: | ||
490 | if (!(data->pin_cfg[0] & ADT7462_DIODE3_INPUT)) { | ||
491 | if (data->pin_cfg[1] & ADT7462_PIN19_INPUT) | ||
492 | return "+0.9V"; | ||
493 | return "+1.25V"; | ||
494 | } | ||
495 | break; | ||
496 | case 5: | ||
497 | if (!(data->pin_cfg[0] & ADT7462_DIODE1_INPUT)) { | ||
498 | if (data->pin_cfg[1] & ADT7462_PIN19_INPUT) | ||
499 | return "+1.8V"; | ||
500 | return "+2.5V"; | ||
501 | } | ||
502 | break; | ||
503 | case 6: | ||
504 | if (!(data->pin_cfg[1] & ADT7462_PIN13_INPUT)) | ||
505 | return "+3.3V"; | ||
506 | break; | ||
507 | case 7: | ||
508 | if (!(data->pin_cfg[1] & ADT7462_PIN8_INPUT)) | ||
509 | return "+12V2"; | ||
510 | break; | ||
511 | case 8: | ||
512 | switch (MASK_AND_SHIFT(data->pin_cfg[2], ADT7462_PIN26)) { | ||
513 | case 0: | ||
514 | return "Vbatt"; | ||
515 | case 1: | ||
516 | return "FSB_Vtt"; | ||
517 | } | ||
518 | break; | ||
519 | case 9: | ||
520 | switch (MASK_AND_SHIFT(data->pin_cfg[2], ADT7462_PIN25)) { | ||
521 | case 0: | ||
522 | return "+3.3V"; | ||
523 | case 1: | ||
524 | return "+1.2V1"; | ||
525 | } | ||
526 | break; | ||
527 | case 10: | ||
528 | switch (MASK_AND_SHIFT(data->pin_cfg[2], ADT7462_PIN24)) { | ||
529 | case 0: | ||
530 | return "Vccp2"; | ||
531 | case 1: | ||
532 | return "+2.5V"; | ||
533 | case 2: | ||
534 | return "+1.8V"; | ||
535 | case 3: | ||
536 | return "+1.5"; | ||
537 | } | ||
538 | case 11: | ||
539 | if (data->pin_cfg[3] >> ADT7462_PIN28_SHIFT == | ||
540 | ADT7462_PIN28_VOLT && | ||
541 | !(data->pin_cfg[0] & ADT7462_VID_INPUT)) | ||
542 | return "+1.5V ICH"; | ||
543 | break; | ||
544 | case 12: | ||
545 | if (data->pin_cfg[3] >> ADT7462_PIN28_SHIFT == | ||
546 | ADT7462_PIN28_VOLT && | ||
547 | !(data->pin_cfg[0] & ADT7462_VID_INPUT)) | ||
548 | return "+1.5V 3GPIO"; | ||
549 | break; | ||
550 | } | ||
551 | return "N/A"; | ||
552 | } | ||
553 | |||
554 | /* Multipliers are actually in uV, not mV. */ | ||
555 | static int voltage_multiplier(struct adt7462_data *data, int which) | ||
556 | { | ||
557 | switch (which) { | ||
558 | case 0: | ||
559 | if (!(data->pin_cfg[0] & ADT7462_PIN7_INPUT)) | ||
560 | return 62500; | ||
561 | break; | ||
562 | case 1: | ||
563 | switch (MASK_AND_SHIFT(data->pin_cfg[1], ADT7462_PIN23)) { | ||
564 | case 0: | ||
565 | if (data->pin_cfg[0] & ADT7462_VID_INPUT) | ||
566 | return 12500; | ||
567 | return 6250; | ||
568 | case 1: | ||
569 | return 13000; | ||
570 | case 2: | ||
571 | return 9400; | ||
572 | case 3: | ||
573 | return 7800; | ||
574 | } | ||
575 | case 2: | ||
576 | if (!(data->pin_cfg[1] & ADT7462_PIN22_INPUT)) | ||
577 | return 62500; | ||
578 | break; | ||
579 | case 3: | ||
580 | if (!(data->pin_cfg[1] & ADT7462_PIN21_INPUT)) | ||
581 | return 26000; | ||
582 | break; | ||
583 | case 4: | ||
584 | if (!(data->pin_cfg[0] & ADT7462_DIODE3_INPUT)) { | ||
585 | if (data->pin_cfg[1] & ADT7462_PIN19_INPUT) | ||
586 | return 4690; | ||
587 | return 6500; | ||
588 | } | ||
589 | break; | ||
590 | case 5: | ||
591 | if (!(data->pin_cfg[0] & ADT7462_DIODE1_INPUT)) { | ||
592 | if (data->pin_cfg[1] & ADT7462_PIN15_INPUT) | ||
593 | return 9400; | ||
594 | return 13000; | ||
595 | } | ||
596 | break; | ||
597 | case 6: | ||
598 | if (!(data->pin_cfg[1] & ADT7462_PIN13_INPUT)) | ||
599 | return 17200; | ||
600 | break; | ||
601 | case 7: | ||
602 | if (!(data->pin_cfg[1] & ADT7462_PIN8_INPUT)) | ||
603 | return 62500; | ||
604 | break; | ||
605 | case 8: | ||
606 | switch (MASK_AND_SHIFT(data->pin_cfg[2], ADT7462_PIN26)) { | ||
607 | case 0: | ||
608 | return 15600; | ||
609 | case 1: | ||
610 | return 6250; | ||
611 | } | ||
612 | break; | ||
613 | case 9: | ||
614 | switch (MASK_AND_SHIFT(data->pin_cfg[2], ADT7462_PIN25)) { | ||
615 | case 0: | ||
616 | return 17200; | ||
617 | case 1: | ||
618 | return 6250; | ||
619 | } | ||
620 | break; | ||
621 | case 10: | ||
622 | switch (MASK_AND_SHIFT(data->pin_cfg[2], ADT7462_PIN24)) { | ||
623 | case 0: | ||
624 | return 6250; | ||
625 | case 1: | ||
626 | return 13000; | ||
627 | case 2: | ||
628 | return 9400; | ||
629 | case 3: | ||
630 | return 7800; | ||
631 | } | ||
632 | case 11: | ||
633 | case 12: | ||
634 | if (data->pin_cfg[3] >> ADT7462_PIN28_SHIFT == | ||
635 | ADT7462_PIN28_VOLT && | ||
636 | !(data->pin_cfg[0] & ADT7462_VID_INPUT)) | ||
637 | return 7800; | ||
638 | } | ||
639 | return 0; | ||
640 | } | ||
641 | |||
642 | static int temp_enabled(struct adt7462_data *data, int which) | ||
643 | { | ||
644 | switch (which) { | ||
645 | case 0: | ||
646 | case 2: | ||
647 | return 1; | ||
648 | case 1: | ||
649 | if (data->pin_cfg[0] & ADT7462_DIODE1_INPUT) | ||
650 | return 1; | ||
651 | break; | ||
652 | case 3: | ||
653 | if (data->pin_cfg[0] & ADT7462_DIODE3_INPUT) | ||
654 | return 1; | ||
655 | break; | ||
656 | } | ||
657 | return 0; | ||
658 | } | ||
659 | |||
660 | static const char *temp_label(struct adt7462_data *data, int which) | ||
661 | { | ||
662 | switch (which) { | ||
663 | case 0: | ||
664 | return "local"; | ||
665 | case 1: | ||
666 | if (data->pin_cfg[0] & ADT7462_DIODE1_INPUT) | ||
667 | return "remote1"; | ||
668 | break; | ||
669 | case 2: | ||
670 | return "remote2"; | ||
671 | case 3: | ||
672 | if (data->pin_cfg[0] & ADT7462_DIODE3_INPUT) | ||
673 | return "remote3"; | ||
674 | break; | ||
675 | } | ||
676 | return "N/A"; | ||
677 | } | ||
678 | |||
679 | /* Map Trange register values to mC */ | ||
680 | #define NUM_TRANGE_VALUES 16 | ||
681 | static const int trange_values[NUM_TRANGE_VALUES] = { | ||
682 | 2000, | ||
683 | 2500, | ||
684 | 3300, | ||
685 | 4000, | ||
686 | 5000, | ||
687 | 6700, | ||
688 | 8000, | ||
689 | 10000, | ||
690 | 13300, | ||
691 | 16000, | ||
692 | 20000, | ||
693 | 26700, | ||
694 | 32000, | ||
695 | 40000, | ||
696 | 53300, | ||
697 | 80000 | ||
698 | }; | ||
699 | |||
700 | static int find_trange_value(int trange) | ||
701 | { | ||
702 | int i; | ||
703 | |||
704 | for (i = 0; i < NUM_TRANGE_VALUES; i++) | ||
705 | if (trange_values[i] == trange) | ||
706 | return i; | ||
707 | |||
708 | return -ENODEV; | ||
709 | } | ||
710 | |||
711 | static struct adt7462_data *adt7462_update_device(struct device *dev) | ||
712 | { | ||
713 | struct i2c_client *client = to_i2c_client(dev); | ||
714 | struct adt7462_data *data = i2c_get_clientdata(client); | ||
715 | unsigned long local_jiffies = jiffies; | ||
716 | int i; | ||
717 | |||
718 | mutex_lock(&data->lock); | ||
719 | if (time_before(local_jiffies, data->sensors_last_updated + | ||
720 | SENSOR_REFRESH_INTERVAL) | ||
721 | && data->sensors_valid) | ||
722 | goto no_sensor_update; | ||
723 | |||
724 | for (i = 0; i < ADT7462_TEMP_COUNT; i++) { | ||
725 | /* | ||
726 | * Reading the fractional register locks the integral | ||
727 | * register until both have been read. | ||
728 | */ | ||
729 | data->temp_frac[i] = i2c_smbus_read_byte_data(client, | ||
730 | ADT7462_TEMP_REG(i)); | ||
731 | data->temp[i] = i2c_smbus_read_byte_data(client, | ||
732 | ADT7462_TEMP_REG(i) + 1); | ||
733 | } | ||
734 | |||
735 | for (i = 0; i < ADT7462_FAN_COUNT; i++) | ||
736 | data->fan[i] = adt7462_read_word_data(client, | ||
737 | ADT7462_REG_FAN(i)); | ||
738 | |||
739 | data->fan_enabled = i2c_smbus_read_byte_data(client, | ||
740 | ADT7462_REG_FAN_ENABLE); | ||
741 | |||
742 | for (i = 0; i < ADT7462_PWM_COUNT; i++) | ||
743 | data->pwm[i] = i2c_smbus_read_byte_data(client, | ||
744 | ADT7462_REG_PWM(i)); | ||
745 | |||
746 | for (i = 0; i < ADT7462_PIN_CFG_REG_COUNT; i++) | ||
747 | data->pin_cfg[i] = i2c_smbus_read_byte_data(client, | ||
748 | ADT7462_REG_PIN_CFG(i)); | ||
749 | |||
750 | for (i = 0; i < ADT7462_VOLT_COUNT; i++) { | ||
751 | int reg = ADT7462_REG_VOLT(data, i); | ||
752 | if (!reg) | ||
753 | data->voltages[i] = 0; | ||
754 | else | ||
755 | data->voltages[i] = i2c_smbus_read_byte_data(client, | ||
756 | reg); | ||
757 | } | ||
758 | |||
759 | data->alarms[0] = i2c_smbus_read_byte_data(client, ADT7462_REG_ALARM1); | ||
760 | data->alarms[1] = i2c_smbus_read_byte_data(client, ADT7462_REG_ALARM2); | ||
761 | data->alarms[2] = i2c_smbus_read_byte_data(client, ADT7462_REG_ALARM3); | ||
762 | data->alarms[3] = i2c_smbus_read_byte_data(client, ADT7462_REG_ALARM4); | ||
763 | |||
764 | data->sensors_last_updated = local_jiffies; | ||
765 | data->sensors_valid = 1; | ||
766 | |||
767 | no_sensor_update: | ||
768 | if (time_before(local_jiffies, data->limits_last_updated + | ||
769 | LIMIT_REFRESH_INTERVAL) | ||
770 | && data->limits_valid) | ||
771 | goto out; | ||
772 | |||
773 | for (i = 0; i < ADT7462_TEMP_COUNT; i++) { | ||
774 | data->temp_min[i] = i2c_smbus_read_byte_data(client, | ||
775 | ADT7462_TEMP_MIN_REG(i)); | ||
776 | data->temp_max[i] = i2c_smbus_read_byte_data(client, | ||
777 | ADT7462_TEMP_MAX_REG(i)); | ||
778 | } | ||
779 | |||
780 | for (i = 0; i < ADT7462_FAN_COUNT; i++) | ||
781 | data->fan_min[i] = i2c_smbus_read_byte_data(client, | ||
782 | ADT7462_REG_FAN_MIN(i)); | ||
783 | |||
784 | for (i = 0; i < ADT7462_VOLT_COUNT; i++) { | ||
785 | int reg = ADT7462_REG_VOLT_MAX(data, i); | ||
786 | data->volt_max[i] = | ||
787 | (reg ? i2c_smbus_read_byte_data(client, reg) : 0); | ||
788 | |||
789 | reg = ADT7462_REG_VOLT_MIN(data, i); | ||
790 | data->volt_min[i] = | ||
791 | (reg ? i2c_smbus_read_byte_data(client, reg) : 0); | ||
792 | } | ||
793 | |||
794 | for (i = 0; i < ADT7462_PWM_COUNT; i++) { | ||
795 | data->pwm_min[i] = i2c_smbus_read_byte_data(client, | ||
796 | ADT7462_REG_PWM_MIN(i)); | ||
797 | data->pwm_tmin[i] = i2c_smbus_read_byte_data(client, | ||
798 | ADT7462_REG_PWM_TMIN(i)); | ||
799 | data->pwm_trange[i] = i2c_smbus_read_byte_data(client, | ||
800 | ADT7462_REG_PWM_TRANGE(i)); | ||
801 | data->pwm_cfg[i] = i2c_smbus_read_byte_data(client, | ||
802 | ADT7462_REG_PWM_CFG(i)); | ||
803 | } | ||
804 | |||
805 | data->pwm_max = i2c_smbus_read_byte_data(client, ADT7462_REG_PWM_MAX); | ||
806 | |||
807 | data->cfg2 = i2c_smbus_read_byte_data(client, ADT7462_REG_CFG2); | ||
808 | |||
809 | data->limits_last_updated = local_jiffies; | ||
810 | data->limits_valid = 1; | ||
811 | |||
812 | out: | ||
813 | mutex_unlock(&data->lock); | ||
814 | return data; | ||
815 | } | ||
816 | |||
817 | static ssize_t show_temp_min(struct device *dev, | ||
818 | struct device_attribute *devattr, | ||
819 | char *buf) | ||
820 | { | ||
821 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | ||
822 | struct adt7462_data *data = adt7462_update_device(dev); | ||
823 | |||
824 | if (!temp_enabled(data, attr->index)) | ||
825 | return sprintf(buf, "0\n"); | ||
826 | |||
827 | return sprintf(buf, "%d\n", 1000 * (data->temp_min[attr->index] - 64)); | ||
828 | } | ||
829 | |||
830 | static ssize_t set_temp_min(struct device *dev, | ||
831 | struct device_attribute *devattr, | ||
832 | const char *buf, | ||
833 | size_t count) | ||
834 | { | ||
835 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | ||
836 | struct i2c_client *client = to_i2c_client(dev); | ||
837 | struct adt7462_data *data = i2c_get_clientdata(client); | ||
838 | long temp; | ||
839 | |||
840 | if (strict_strtol(buf, 10, &temp) || !temp_enabled(data, attr->index)) | ||
841 | return -EINVAL; | ||
842 | |||
843 | temp = ROUND_DIV(temp, 1000) + 64; | ||
844 | temp = SENSORS_LIMIT(temp, 0, 255); | ||
845 | |||
846 | mutex_lock(&data->lock); | ||
847 | data->temp_min[attr->index] = temp; | ||
848 | i2c_smbus_write_byte_data(client, ADT7462_TEMP_MIN_REG(attr->index), | ||
849 | temp); | ||
850 | mutex_unlock(&data->lock); | ||
851 | |||
852 | return count; | ||
853 | } | ||
854 | |||
855 | static ssize_t show_temp_max(struct device *dev, | ||
856 | struct device_attribute *devattr, | ||
857 | char *buf) | ||
858 | { | ||
859 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | ||
860 | struct adt7462_data *data = adt7462_update_device(dev); | ||
861 | |||
862 | if (!temp_enabled(data, attr->index)) | ||
863 | return sprintf(buf, "0\n"); | ||
864 | |||
865 | return sprintf(buf, "%d\n", 1000 * (data->temp_max[attr->index] - 64)); | ||
866 | } | ||
867 | |||
868 | static ssize_t set_temp_max(struct device *dev, | ||
869 | struct device_attribute *devattr, | ||
870 | const char *buf, | ||
871 | size_t count) | ||
872 | { | ||
873 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | ||
874 | struct i2c_client *client = to_i2c_client(dev); | ||
875 | struct adt7462_data *data = i2c_get_clientdata(client); | ||
876 | long temp; | ||
877 | |||
878 | if (strict_strtol(buf, 10, &temp) || !temp_enabled(data, attr->index)) | ||
879 | return -EINVAL; | ||
880 | |||
881 | temp = ROUND_DIV(temp, 1000) + 64; | ||
882 | temp = SENSORS_LIMIT(temp, 0, 255); | ||
883 | |||
884 | mutex_lock(&data->lock); | ||
885 | data->temp_max[attr->index] = temp; | ||
886 | i2c_smbus_write_byte_data(client, ADT7462_TEMP_MAX_REG(attr->index), | ||
887 | temp); | ||
888 | mutex_unlock(&data->lock); | ||
889 | |||
890 | return count; | ||
891 | } | ||
892 | |||
893 | static ssize_t show_temp(struct device *dev, struct device_attribute *devattr, | ||
894 | char *buf) | ||
895 | { | ||
896 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | ||
897 | struct adt7462_data *data = adt7462_update_device(dev); | ||
898 | u8 frac = data->temp_frac[attr->index] >> TEMP_FRAC_OFFSET; | ||
899 | |||
900 | if (!temp_enabled(data, attr->index)) | ||
901 | return sprintf(buf, "0\n"); | ||
902 | |||
903 | return sprintf(buf, "%d\n", 1000 * (data->temp[attr->index] - 64) + | ||
904 | 250 * frac); | ||
905 | } | ||
906 | |||
907 | static ssize_t show_temp_label(struct device *dev, | ||
908 | struct device_attribute *devattr, | ||
909 | char *buf) | ||
910 | { | ||
911 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | ||
912 | struct adt7462_data *data = adt7462_update_device(dev); | ||
913 | |||
914 | return sprintf(buf, "%s\n", temp_label(data, attr->index)); | ||
915 | } | ||
916 | |||
917 | static ssize_t show_volt_max(struct device *dev, | ||
918 | struct device_attribute *devattr, | ||
919 | char *buf) | ||
920 | { | ||
921 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | ||
922 | struct adt7462_data *data = adt7462_update_device(dev); | ||
923 | int x = voltage_multiplier(data, attr->index); | ||
924 | |||
925 | x *= data->volt_max[attr->index]; | ||
926 | x /= 1000; /* convert from uV to mV */ | ||
927 | |||
928 | return sprintf(buf, "%d\n", x); | ||
929 | } | ||
930 | |||
931 | static ssize_t set_volt_max(struct device *dev, | ||
932 | struct device_attribute *devattr, | ||
933 | const char *buf, | ||
934 | size_t count) | ||
935 | { | ||
936 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | ||
937 | struct i2c_client *client = to_i2c_client(dev); | ||
938 | struct adt7462_data *data = i2c_get_clientdata(client); | ||
939 | int x = voltage_multiplier(data, attr->index); | ||
940 | long temp; | ||
941 | |||
942 | if (strict_strtol(buf, 10, &temp) || !x) | ||
943 | return -EINVAL; | ||
944 | |||
945 | temp *= 1000; /* convert mV to uV */ | ||
946 | temp = ROUND_DIV(temp, x); | ||
947 | temp = SENSORS_LIMIT(temp, 0, 255); | ||
948 | |||
949 | mutex_lock(&data->lock); | ||
950 | data->volt_max[attr->index] = temp; | ||
951 | i2c_smbus_write_byte_data(client, | ||
952 | ADT7462_REG_VOLT_MAX(data, attr->index), | ||
953 | temp); | ||
954 | mutex_unlock(&data->lock); | ||
955 | |||
956 | return count; | ||
957 | } | ||
958 | |||
959 | static ssize_t show_volt_min(struct device *dev, | ||
960 | struct device_attribute *devattr, | ||
961 | char *buf) | ||
962 | { | ||
963 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | ||
964 | struct adt7462_data *data = adt7462_update_device(dev); | ||
965 | int x = voltage_multiplier(data, attr->index); | ||
966 | |||
967 | x *= data->volt_min[attr->index]; | ||
968 | x /= 1000; /* convert from uV to mV */ | ||
969 | |||
970 | return sprintf(buf, "%d\n", x); | ||
971 | } | ||
972 | |||
973 | static ssize_t set_volt_min(struct device *dev, | ||
974 | struct device_attribute *devattr, | ||
975 | const char *buf, | ||
976 | size_t count) | ||
977 | { | ||
978 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | ||
979 | struct i2c_client *client = to_i2c_client(dev); | ||
980 | struct adt7462_data *data = i2c_get_clientdata(client); | ||
981 | int x = voltage_multiplier(data, attr->index); | ||
982 | long temp; | ||
983 | |||
984 | if (strict_strtol(buf, 10, &temp) || !x) | ||
985 | return -EINVAL; | ||
986 | |||
987 | temp *= 1000; /* convert mV to uV */ | ||
988 | temp = ROUND_DIV(temp, x); | ||
989 | temp = SENSORS_LIMIT(temp, 0, 255); | ||
990 | |||
991 | mutex_lock(&data->lock); | ||
992 | data->volt_min[attr->index] = temp; | ||
993 | i2c_smbus_write_byte_data(client, | ||
994 | ADT7462_REG_VOLT_MIN(data, attr->index), | ||
995 | temp); | ||
996 | mutex_unlock(&data->lock); | ||
997 | |||
998 | return count; | ||
999 | } | ||
1000 | |||
1001 | static ssize_t show_voltage(struct device *dev, | ||
1002 | struct device_attribute *devattr, | ||
1003 | char *buf) | ||
1004 | { | ||
1005 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | ||
1006 | struct adt7462_data *data = adt7462_update_device(dev); | ||
1007 | int x = voltage_multiplier(data, attr->index); | ||
1008 | |||
1009 | x *= data->voltages[attr->index]; | ||
1010 | x /= 1000; /* convert from uV to mV */ | ||
1011 | |||
1012 | return sprintf(buf, "%d\n", x); | ||
1013 | } | ||
1014 | |||
1015 | static ssize_t show_voltage_label(struct device *dev, | ||
1016 | struct device_attribute *devattr, | ||
1017 | char *buf) | ||
1018 | { | ||
1019 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | ||
1020 | struct adt7462_data *data = adt7462_update_device(dev); | ||
1021 | |||
1022 | return sprintf(buf, "%s\n", voltage_label(data, attr->index)); | ||
1023 | } | ||
1024 | |||
1025 | static ssize_t show_alarm(struct device *dev, | ||
1026 | struct device_attribute *devattr, | ||
1027 | char *buf) | ||
1028 | { | ||
1029 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | ||
1030 | struct adt7462_data *data = adt7462_update_device(dev); | ||
1031 | int reg = attr->index >> ADT7462_ALARM_REG_SHIFT; | ||
1032 | int mask = attr->index & ADT7462_ALARM_FLAG_MASK; | ||
1033 | |||
1034 | if (data->alarms[reg] & mask) | ||
1035 | return sprintf(buf, "1\n"); | ||
1036 | else | ||
1037 | return sprintf(buf, "0\n"); | ||
1038 | } | ||
1039 | |||
1040 | static int fan_enabled(struct adt7462_data *data, int fan) | ||
1041 | { | ||
1042 | return data->fan_enabled & (1 << fan); | ||
1043 | } | ||
1044 | |||
1045 | static ssize_t show_fan_min(struct device *dev, | ||
1046 | struct device_attribute *devattr, | ||
1047 | char *buf) | ||
1048 | { | ||
1049 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | ||
1050 | struct adt7462_data *data = adt7462_update_device(dev); | ||
1051 | u16 temp; | ||
1052 | |||
1053 | /* Only the MSB of the min fan period is stored... */ | ||
1054 | temp = data->fan_min[attr->index]; | ||
1055 | temp <<= 8; | ||
1056 | |||
1057 | if (!fan_enabled(data, attr->index) || | ||
1058 | !FAN_DATA_VALID(temp)) | ||
1059 | return sprintf(buf, "0\n"); | ||
1060 | |||
1061 | return sprintf(buf, "%d\n", FAN_PERIOD_TO_RPM(temp)); | ||
1062 | } | ||
1063 | |||
1064 | static ssize_t set_fan_min(struct device *dev, | ||
1065 | struct device_attribute *devattr, | ||
1066 | const char *buf, size_t count) | ||
1067 | { | ||
1068 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | ||
1069 | struct i2c_client *client = to_i2c_client(dev); | ||
1070 | struct adt7462_data *data = i2c_get_clientdata(client); | ||
1071 | long temp; | ||
1072 | |||
1073 | if (strict_strtol(buf, 10, &temp) || !temp || | ||
1074 | !fan_enabled(data, attr->index)) | ||
1075 | return -EINVAL; | ||
1076 | |||
1077 | temp = FAN_RPM_TO_PERIOD(temp); | ||
1078 | temp >>= 8; | ||
1079 | temp = SENSORS_LIMIT(temp, 1, 255); | ||
1080 | |||
1081 | mutex_lock(&data->lock); | ||
1082 | data->fan_min[attr->index] = temp; | ||
1083 | i2c_smbus_write_byte_data(client, ADT7462_REG_FAN_MIN(attr->index), | ||
1084 | temp); | ||
1085 | mutex_unlock(&data->lock); | ||
1086 | |||
1087 | return count; | ||
1088 | } | ||
1089 | |||
1090 | static ssize_t show_fan(struct device *dev, struct device_attribute *devattr, | ||
1091 | char *buf) | ||
1092 | { | ||
1093 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | ||
1094 | struct adt7462_data *data = adt7462_update_device(dev); | ||
1095 | |||
1096 | if (!fan_enabled(data, attr->index) || | ||
1097 | !FAN_DATA_VALID(data->fan[attr->index])) | ||
1098 | return sprintf(buf, "0\n"); | ||
1099 | |||
1100 | return sprintf(buf, "%d\n", | ||
1101 | FAN_PERIOD_TO_RPM(data->fan[attr->index])); | ||
1102 | } | ||
1103 | |||
1104 | static ssize_t show_force_pwm_max(struct device *dev, | ||
1105 | struct device_attribute *devattr, | ||
1106 | char *buf) | ||
1107 | { | ||
1108 | struct adt7462_data *data = adt7462_update_device(dev); | ||
1109 | return sprintf(buf, "%d\n", (data->cfg2 & ADT7462_FSPD_MASK ? 1 : 0)); | ||
1110 | } | ||
1111 | |||
1112 | static ssize_t set_force_pwm_max(struct device *dev, | ||
1113 | struct device_attribute *devattr, | ||
1114 | const char *buf, | ||
1115 | size_t count) | ||
1116 | { | ||
1117 | struct i2c_client *client = to_i2c_client(dev); | ||
1118 | struct adt7462_data *data = i2c_get_clientdata(client); | ||
1119 | long temp; | ||
1120 | u8 reg; | ||
1121 | |||
1122 | if (strict_strtol(buf, 10, &temp)) | ||
1123 | return -EINVAL; | ||
1124 | |||
1125 | mutex_lock(&data->lock); | ||
1126 | reg = i2c_smbus_read_byte_data(client, ADT7462_REG_CFG2); | ||
1127 | if (temp) | ||
1128 | reg |= ADT7462_FSPD_MASK; | ||
1129 | else | ||
1130 | reg &= ~ADT7462_FSPD_MASK; | ||
1131 | data->cfg2 = reg; | ||
1132 | i2c_smbus_write_byte_data(client, ADT7462_REG_CFG2, reg); | ||
1133 | mutex_unlock(&data->lock); | ||
1134 | |||
1135 | return count; | ||
1136 | } | ||
1137 | |||
1138 | static ssize_t show_pwm(struct device *dev, struct device_attribute *devattr, | ||
1139 | char *buf) | ||
1140 | { | ||
1141 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | ||
1142 | struct adt7462_data *data = adt7462_update_device(dev); | ||
1143 | return sprintf(buf, "%d\n", data->pwm[attr->index]); | ||
1144 | } | ||
1145 | |||
1146 | static ssize_t set_pwm(struct device *dev, struct device_attribute *devattr, | ||
1147 | const char *buf, size_t count) | ||
1148 | { | ||
1149 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | ||
1150 | struct i2c_client *client = to_i2c_client(dev); | ||
1151 | struct adt7462_data *data = i2c_get_clientdata(client); | ||
1152 | long temp; | ||
1153 | |||
1154 | if (strict_strtol(buf, 10, &temp)) | ||
1155 | return -EINVAL; | ||
1156 | |||
1157 | temp = SENSORS_LIMIT(temp, 0, 255); | ||
1158 | |||
1159 | mutex_lock(&data->lock); | ||
1160 | data->pwm[attr->index] = temp; | ||
1161 | i2c_smbus_write_byte_data(client, ADT7462_REG_PWM(attr->index), temp); | ||
1162 | mutex_unlock(&data->lock); | ||
1163 | |||
1164 | return count; | ||
1165 | } | ||
1166 | |||
1167 | static ssize_t show_pwm_max(struct device *dev, | ||
1168 | struct device_attribute *devattr, | ||
1169 | char *buf) | ||
1170 | { | ||
1171 | struct adt7462_data *data = adt7462_update_device(dev); | ||
1172 | return sprintf(buf, "%d\n", data->pwm_max); | ||
1173 | } | ||
1174 | |||
1175 | static ssize_t set_pwm_max(struct device *dev, | ||
1176 | struct device_attribute *devattr, | ||
1177 | const char *buf, | ||
1178 | size_t count) | ||
1179 | { | ||
1180 | struct i2c_client *client = to_i2c_client(dev); | ||
1181 | struct adt7462_data *data = i2c_get_clientdata(client); | ||
1182 | long temp; | ||
1183 | |||
1184 | if (strict_strtol(buf, 10, &temp)) | ||
1185 | return -EINVAL; | ||
1186 | |||
1187 | temp = SENSORS_LIMIT(temp, 0, 255); | ||
1188 | |||
1189 | mutex_lock(&data->lock); | ||
1190 | data->pwm_max = temp; | ||
1191 | i2c_smbus_write_byte_data(client, ADT7462_REG_PWM_MAX, temp); | ||
1192 | mutex_unlock(&data->lock); | ||
1193 | |||
1194 | return count; | ||
1195 | } | ||
1196 | |||
1197 | static ssize_t show_pwm_min(struct device *dev, | ||
1198 | struct device_attribute *devattr, | ||
1199 | char *buf) | ||
1200 | { | ||
1201 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | ||
1202 | struct adt7462_data *data = adt7462_update_device(dev); | ||
1203 | return sprintf(buf, "%d\n", data->pwm_min[attr->index]); | ||
1204 | } | ||
1205 | |||
1206 | static ssize_t set_pwm_min(struct device *dev, | ||
1207 | struct device_attribute *devattr, | ||
1208 | const char *buf, | ||
1209 | size_t count) | ||
1210 | { | ||
1211 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | ||
1212 | struct i2c_client *client = to_i2c_client(dev); | ||
1213 | struct adt7462_data *data = i2c_get_clientdata(client); | ||
1214 | long temp; | ||
1215 | |||
1216 | if (strict_strtol(buf, 10, &temp)) | ||
1217 | return -EINVAL; | ||
1218 | |||
1219 | temp = SENSORS_LIMIT(temp, 0, 255); | ||
1220 | |||
1221 | mutex_lock(&data->lock); | ||
1222 | data->pwm_min[attr->index] = temp; | ||
1223 | i2c_smbus_write_byte_data(client, ADT7462_REG_PWM_MIN(attr->index), | ||
1224 | temp); | ||
1225 | mutex_unlock(&data->lock); | ||
1226 | |||
1227 | return count; | ||
1228 | } | ||
1229 | |||
1230 | static ssize_t show_pwm_hyst(struct device *dev, | ||
1231 | struct device_attribute *devattr, | ||
1232 | char *buf) | ||
1233 | { | ||
1234 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | ||
1235 | struct adt7462_data *data = adt7462_update_device(dev); | ||
1236 | return sprintf(buf, "%d\n", 1000 * | ||
1237 | (data->pwm_trange[attr->index] & ADT7462_PWM_HYST_MASK)); | ||
1238 | } | ||
1239 | |||
1240 | static ssize_t set_pwm_hyst(struct device *dev, | ||
1241 | struct device_attribute *devattr, | ||
1242 | const char *buf, | ||
1243 | size_t count) | ||
1244 | { | ||
1245 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | ||
1246 | struct i2c_client *client = to_i2c_client(dev); | ||
1247 | struct adt7462_data *data = i2c_get_clientdata(client); | ||
1248 | long temp; | ||
1249 | |||
1250 | if (strict_strtol(buf, 10, &temp)) | ||
1251 | return -EINVAL; | ||
1252 | |||
1253 | temp = ROUND_DIV(temp, 1000); | ||
1254 | temp = SENSORS_LIMIT(temp, 0, 15); | ||
1255 | |||
1256 | /* package things up */ | ||
1257 | temp &= ADT7462_PWM_HYST_MASK; | ||
1258 | temp |= data->pwm_trange[attr->index] & ADT7462_PWM_RANGE_MASK; | ||
1259 | |||
1260 | mutex_lock(&data->lock); | ||
1261 | data->pwm_trange[attr->index] = temp; | ||
1262 | i2c_smbus_write_byte_data(client, ADT7462_REG_PWM_TRANGE(attr->index), | ||
1263 | temp); | ||
1264 | mutex_unlock(&data->lock); | ||
1265 | |||
1266 | return count; | ||
1267 | } | ||
1268 | |||
1269 | static ssize_t show_pwm_tmax(struct device *dev, | ||
1270 | struct device_attribute *devattr, | ||
1271 | char *buf) | ||
1272 | { | ||
1273 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | ||
1274 | struct adt7462_data *data = adt7462_update_device(dev); | ||
1275 | |||
1276 | /* tmax = tmin + trange */ | ||
1277 | int trange = trange_values[data->pwm_trange[attr->index] >> | ||
1278 | ADT7462_PWM_RANGE_SHIFT]; | ||
1279 | int tmin = (data->pwm_tmin[attr->index] - 64) * 1000; | ||
1280 | |||
1281 | return sprintf(buf, "%d\n", tmin + trange); | ||
1282 | } | ||
1283 | |||
1284 | static ssize_t set_pwm_tmax(struct device *dev, | ||
1285 | struct device_attribute *devattr, | ||
1286 | const char *buf, | ||
1287 | size_t count) | ||
1288 | { | ||
1289 | int temp; | ||
1290 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | ||
1291 | struct i2c_client *client = to_i2c_client(dev); | ||
1292 | struct adt7462_data *data = i2c_get_clientdata(client); | ||
1293 | int tmin, trange_value; | ||
1294 | long trange; | ||
1295 | |||
1296 | if (strict_strtol(buf, 10, &trange)) | ||
1297 | return -EINVAL; | ||
1298 | |||
1299 | /* trange = tmax - tmin */ | ||
1300 | tmin = (data->pwm_tmin[attr->index] - 64) * 1000; | ||
1301 | trange_value = find_trange_value(trange - tmin); | ||
1302 | |||
1303 | if (trange_value < 0) | ||
1304 | return -EINVAL; | ||
1305 | |||
1306 | temp = trange_value << ADT7462_PWM_RANGE_SHIFT; | ||
1307 | temp |= data->pwm_trange[attr->index] & ADT7462_PWM_HYST_MASK; | ||
1308 | |||
1309 | mutex_lock(&data->lock); | ||
1310 | data->pwm_trange[attr->index] = temp; | ||
1311 | i2c_smbus_write_byte_data(client, ADT7462_REG_PWM_TRANGE(attr->index), | ||
1312 | temp); | ||
1313 | mutex_unlock(&data->lock); | ||
1314 | |||
1315 | return count; | ||
1316 | } | ||
1317 | |||
1318 | static ssize_t show_pwm_tmin(struct device *dev, | ||
1319 | struct device_attribute *devattr, | ||
1320 | char *buf) | ||
1321 | { | ||
1322 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | ||
1323 | struct adt7462_data *data = adt7462_update_device(dev); | ||
1324 | return sprintf(buf, "%d\n", 1000 * (data->pwm_tmin[attr->index] - 64)); | ||
1325 | } | ||
1326 | |||
1327 | static ssize_t set_pwm_tmin(struct device *dev, | ||
1328 | struct device_attribute *devattr, | ||
1329 | const char *buf, | ||
1330 | size_t count) | ||
1331 | { | ||
1332 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | ||
1333 | struct i2c_client *client = to_i2c_client(dev); | ||
1334 | struct adt7462_data *data = i2c_get_clientdata(client); | ||
1335 | long temp; | ||
1336 | |||
1337 | if (strict_strtol(buf, 10, &temp)) | ||
1338 | return -EINVAL; | ||
1339 | |||
1340 | temp = ROUND_DIV(temp, 1000) + 64; | ||
1341 | temp = SENSORS_LIMIT(temp, 0, 255); | ||
1342 | |||
1343 | mutex_lock(&data->lock); | ||
1344 | data->pwm_tmin[attr->index] = temp; | ||
1345 | i2c_smbus_write_byte_data(client, ADT7462_REG_PWM_TMIN(attr->index), | ||
1346 | temp); | ||
1347 | mutex_unlock(&data->lock); | ||
1348 | |||
1349 | return count; | ||
1350 | } | ||
1351 | |||
1352 | static ssize_t show_pwm_auto(struct device *dev, | ||
1353 | struct device_attribute *devattr, | ||
1354 | char *buf) | ||
1355 | { | ||
1356 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | ||
1357 | struct adt7462_data *data = adt7462_update_device(dev); | ||
1358 | int cfg = data->pwm_cfg[attr->index] >> ADT7462_PWM_CHANNEL_SHIFT; | ||
1359 | |||
1360 | switch (cfg) { | ||
1361 | case 4: /* off */ | ||
1362 | return sprintf(buf, "0\n"); | ||
1363 | case 7: /* manual */ | ||
1364 | return sprintf(buf, "1\n"); | ||
1365 | default: /* automatic */ | ||
1366 | return sprintf(buf, "2\n"); | ||
1367 | } | ||
1368 | } | ||
1369 | |||
1370 | static void set_pwm_channel(struct i2c_client *client, | ||
1371 | struct adt7462_data *data, | ||
1372 | int which, | ||
1373 | int value) | ||
1374 | { | ||
1375 | int temp = data->pwm_cfg[which] & ~ADT7462_PWM_CHANNEL_MASK; | ||
1376 | temp |= value << ADT7462_PWM_CHANNEL_SHIFT; | ||
1377 | |||
1378 | mutex_lock(&data->lock); | ||
1379 | data->pwm_cfg[which] = temp; | ||
1380 | i2c_smbus_write_byte_data(client, ADT7462_REG_PWM_CFG(which), temp); | ||
1381 | mutex_unlock(&data->lock); | ||
1382 | } | ||
1383 | |||
1384 | static ssize_t set_pwm_auto(struct device *dev, | ||
1385 | struct device_attribute *devattr, | ||
1386 | const char *buf, | ||
1387 | size_t count) | ||
1388 | { | ||
1389 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | ||
1390 | struct i2c_client *client = to_i2c_client(dev); | ||
1391 | struct adt7462_data *data = i2c_get_clientdata(client); | ||
1392 | long temp; | ||
1393 | |||
1394 | if (strict_strtol(buf, 10, &temp)) | ||
1395 | return -EINVAL; | ||
1396 | |||
1397 | switch (temp) { | ||
1398 | case 0: /* off */ | ||
1399 | set_pwm_channel(client, data, attr->index, 4); | ||
1400 | return count; | ||
1401 | case 1: /* manual */ | ||
1402 | set_pwm_channel(client, data, attr->index, 7); | ||
1403 | return count; | ||
1404 | default: | ||
1405 | return -EINVAL; | ||
1406 | } | ||
1407 | } | ||
1408 | |||
1409 | static ssize_t show_pwm_auto_temp(struct device *dev, | ||
1410 | struct device_attribute *devattr, | ||
1411 | char *buf) | ||
1412 | { | ||
1413 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | ||
1414 | struct adt7462_data *data = adt7462_update_device(dev); | ||
1415 | int channel = data->pwm_cfg[attr->index] >> ADT7462_PWM_CHANNEL_SHIFT; | ||
1416 | |||
1417 | switch (channel) { | ||
1418 | case 0: /* temp[1234] only */ | ||
1419 | case 1: | ||
1420 | case 2: | ||
1421 | case 3: | ||
1422 | return sprintf(buf, "%d\n", (1 << channel)); | ||
1423 | case 5: /* temp1 & temp4 */ | ||
1424 | return sprintf(buf, "9\n"); | ||
1425 | case 6: | ||
1426 | return sprintf(buf, "15\n"); | ||
1427 | default: | ||
1428 | return sprintf(buf, "0\n"); | ||
1429 | } | ||
1430 | } | ||
1431 | |||
1432 | static int cvt_auto_temp(int input) | ||
1433 | { | ||
1434 | if (input == 0xF) | ||
1435 | return 6; | ||
1436 | if (input == 0x9) | ||
1437 | return 5; | ||
1438 | if (input < 1 || !is_power_of_2(input)) | ||
1439 | return -EINVAL; | ||
1440 | return ilog2(input); | ||
1441 | } | ||
1442 | |||
1443 | static ssize_t set_pwm_auto_temp(struct device *dev, | ||
1444 | struct device_attribute *devattr, | ||
1445 | const char *buf, | ||
1446 | size_t count) | ||
1447 | { | ||
1448 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | ||
1449 | struct i2c_client *client = to_i2c_client(dev); | ||
1450 | struct adt7462_data *data = i2c_get_clientdata(client); | ||
1451 | long temp; | ||
1452 | |||
1453 | if (strict_strtol(buf, 10, &temp)) | ||
1454 | return -EINVAL; | ||
1455 | |||
1456 | temp = cvt_auto_temp(temp); | ||
1457 | if (temp < 0) | ||
1458 | return temp; | ||
1459 | |||
1460 | set_pwm_channel(client, data, attr->index, temp); | ||
1461 | |||
1462 | return count; | ||
1463 | } | ||
1464 | |||
1465 | static SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, show_temp_max, | ||
1466 | set_temp_max, 0); | ||
1467 | static SENSOR_DEVICE_ATTR(temp2_max, S_IWUSR | S_IRUGO, show_temp_max, | ||
1468 | set_temp_max, 1); | ||
1469 | static SENSOR_DEVICE_ATTR(temp3_max, S_IWUSR | S_IRUGO, show_temp_max, | ||
1470 | set_temp_max, 2); | ||
1471 | static SENSOR_DEVICE_ATTR(temp4_max, S_IWUSR | S_IRUGO, show_temp_max, | ||
1472 | set_temp_max, 3); | ||
1473 | |||
1474 | static SENSOR_DEVICE_ATTR(temp1_min, S_IWUSR | S_IRUGO, show_temp_min, | ||
1475 | set_temp_min, 0); | ||
1476 | static SENSOR_DEVICE_ATTR(temp2_min, S_IWUSR | S_IRUGO, show_temp_min, | ||
1477 | set_temp_min, 1); | ||
1478 | static SENSOR_DEVICE_ATTR(temp3_min, S_IWUSR | S_IRUGO, show_temp_min, | ||
1479 | set_temp_min, 2); | ||
1480 | static SENSOR_DEVICE_ATTR(temp4_min, S_IWUSR | S_IRUGO, show_temp_min, | ||
1481 | set_temp_min, 3); | ||
1482 | |||
1483 | static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL, 0); | ||
1484 | static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, show_temp, NULL, 1); | ||
1485 | static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, show_temp, NULL, 2); | ||
1486 | static SENSOR_DEVICE_ATTR(temp4_input, S_IRUGO, show_temp, NULL, 3); | ||
1487 | |||
1488 | static SENSOR_DEVICE_ATTR(temp1_label, S_IRUGO, show_temp_label, NULL, 0); | ||
1489 | static SENSOR_DEVICE_ATTR(temp2_label, S_IRUGO, show_temp_label, NULL, 1); | ||
1490 | static SENSOR_DEVICE_ATTR(temp3_label, S_IRUGO, show_temp_label, NULL, 2); | ||
1491 | static SENSOR_DEVICE_ATTR(temp4_label, S_IRUGO, show_temp_label, NULL, 3); | ||
1492 | |||
1493 | static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, | ||
1494 | ADT7462_ALARM1 | ADT7462_LT_ALARM); | ||
1495 | static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, | ||
1496 | ADT7462_ALARM1 | ADT7462_R1T_ALARM); | ||
1497 | static SENSOR_DEVICE_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, | ||
1498 | ADT7462_ALARM1 | ADT7462_R2T_ALARM); | ||
1499 | static SENSOR_DEVICE_ATTR(temp4_alarm, S_IRUGO, show_alarm, NULL, | ||
1500 | ADT7462_ALARM1 | ADT7462_R3T_ALARM); | ||
1501 | |||
1502 | static SENSOR_DEVICE_ATTR(in1_max, S_IWUSR | S_IRUGO, show_volt_max, | ||
1503 | set_volt_max, 0); | ||
1504 | static SENSOR_DEVICE_ATTR(in2_max, S_IWUSR | S_IRUGO, show_volt_max, | ||
1505 | set_volt_max, 1); | ||
1506 | static SENSOR_DEVICE_ATTR(in3_max, S_IWUSR | S_IRUGO, show_volt_max, | ||
1507 | set_volt_max, 2); | ||
1508 | static SENSOR_DEVICE_ATTR(in4_max, S_IWUSR | S_IRUGO, show_volt_max, | ||
1509 | set_volt_max, 3); | ||
1510 | static SENSOR_DEVICE_ATTR(in5_max, S_IWUSR | S_IRUGO, show_volt_max, | ||
1511 | set_volt_max, 4); | ||
1512 | static SENSOR_DEVICE_ATTR(in6_max, S_IWUSR | S_IRUGO, show_volt_max, | ||
1513 | set_volt_max, 5); | ||
1514 | static SENSOR_DEVICE_ATTR(in7_max, S_IWUSR | S_IRUGO, show_volt_max, | ||
1515 | set_volt_max, 6); | ||
1516 | static SENSOR_DEVICE_ATTR(in8_max, S_IWUSR | S_IRUGO, show_volt_max, | ||
1517 | set_volt_max, 7); | ||
1518 | static SENSOR_DEVICE_ATTR(in9_max, S_IWUSR | S_IRUGO, show_volt_max, | ||
1519 | set_volt_max, 8); | ||
1520 | static SENSOR_DEVICE_ATTR(in10_max, S_IWUSR | S_IRUGO, show_volt_max, | ||
1521 | set_volt_max, 9); | ||
1522 | static SENSOR_DEVICE_ATTR(in11_max, S_IWUSR | S_IRUGO, show_volt_max, | ||
1523 | set_volt_max, 10); | ||
1524 | static SENSOR_DEVICE_ATTR(in12_max, S_IWUSR | S_IRUGO, show_volt_max, | ||
1525 | set_volt_max, 11); | ||
1526 | static SENSOR_DEVICE_ATTR(in13_max, S_IWUSR | S_IRUGO, show_volt_max, | ||
1527 | set_volt_max, 12); | ||
1528 | |||
1529 | static SENSOR_DEVICE_ATTR(in1_min, S_IWUSR | S_IRUGO, show_volt_min, | ||
1530 | set_volt_min, 0); | ||
1531 | static SENSOR_DEVICE_ATTR(in2_min, S_IWUSR | S_IRUGO, show_volt_min, | ||
1532 | set_volt_min, 1); | ||
1533 | static SENSOR_DEVICE_ATTR(in3_min, S_IWUSR | S_IRUGO, show_volt_min, | ||
1534 | set_volt_min, 2); | ||
1535 | static SENSOR_DEVICE_ATTR(in4_min, S_IWUSR | S_IRUGO, show_volt_min, | ||
1536 | set_volt_min, 3); | ||
1537 | static SENSOR_DEVICE_ATTR(in5_min, S_IWUSR | S_IRUGO, show_volt_min, | ||
1538 | set_volt_min, 4); | ||
1539 | static SENSOR_DEVICE_ATTR(in6_min, S_IWUSR | S_IRUGO, show_volt_min, | ||
1540 | set_volt_min, 5); | ||
1541 | static SENSOR_DEVICE_ATTR(in7_min, S_IWUSR | S_IRUGO, show_volt_min, | ||
1542 | set_volt_min, 6); | ||
1543 | static SENSOR_DEVICE_ATTR(in8_min, S_IWUSR | S_IRUGO, show_volt_min, | ||
1544 | set_volt_min, 7); | ||
1545 | static SENSOR_DEVICE_ATTR(in9_min, S_IWUSR | S_IRUGO, show_volt_min, | ||
1546 | set_volt_min, 8); | ||
1547 | static SENSOR_DEVICE_ATTR(in10_min, S_IWUSR | S_IRUGO, show_volt_min, | ||
1548 | set_volt_min, 9); | ||
1549 | static SENSOR_DEVICE_ATTR(in11_min, S_IWUSR | S_IRUGO, show_volt_min, | ||
1550 | set_volt_min, 10); | ||
1551 | static SENSOR_DEVICE_ATTR(in12_min, S_IWUSR | S_IRUGO, show_volt_min, | ||
1552 | set_volt_min, 11); | ||
1553 | static SENSOR_DEVICE_ATTR(in13_min, S_IWUSR | S_IRUGO, show_volt_min, | ||
1554 | set_volt_min, 12); | ||
1555 | |||
1556 | static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO, show_voltage, NULL, 0); | ||
1557 | static SENSOR_DEVICE_ATTR(in2_input, S_IRUGO, show_voltage, NULL, 1); | ||
1558 | static SENSOR_DEVICE_ATTR(in3_input, S_IRUGO, show_voltage, NULL, 2); | ||
1559 | static SENSOR_DEVICE_ATTR(in4_input, S_IRUGO, show_voltage, NULL, 3); | ||
1560 | static SENSOR_DEVICE_ATTR(in5_input, S_IRUGO, show_voltage, NULL, 4); | ||
1561 | static SENSOR_DEVICE_ATTR(in6_input, S_IRUGO, show_voltage, NULL, 5); | ||
1562 | static SENSOR_DEVICE_ATTR(in7_input, S_IRUGO, show_voltage, NULL, 6); | ||
1563 | static SENSOR_DEVICE_ATTR(in8_input, S_IRUGO, show_voltage, NULL, 7); | ||
1564 | static SENSOR_DEVICE_ATTR(in9_input, S_IRUGO, show_voltage, NULL, 8); | ||
1565 | static SENSOR_DEVICE_ATTR(in10_input, S_IRUGO, show_voltage, NULL, 9); | ||
1566 | static SENSOR_DEVICE_ATTR(in11_input, S_IRUGO, show_voltage, NULL, 10); | ||
1567 | static SENSOR_DEVICE_ATTR(in12_input, S_IRUGO, show_voltage, NULL, 11); | ||
1568 | static SENSOR_DEVICE_ATTR(in13_input, S_IRUGO, show_voltage, NULL, 12); | ||
1569 | |||
1570 | static SENSOR_DEVICE_ATTR(in1_label, S_IRUGO, show_voltage_label, NULL, 0); | ||
1571 | static SENSOR_DEVICE_ATTR(in2_label, S_IRUGO, show_voltage_label, NULL, 1); | ||
1572 | static SENSOR_DEVICE_ATTR(in3_label, S_IRUGO, show_voltage_label, NULL, 2); | ||
1573 | static SENSOR_DEVICE_ATTR(in4_label, S_IRUGO, show_voltage_label, NULL, 3); | ||
1574 | static SENSOR_DEVICE_ATTR(in5_label, S_IRUGO, show_voltage_label, NULL, 4); | ||
1575 | static SENSOR_DEVICE_ATTR(in6_label, S_IRUGO, show_voltage_label, NULL, 5); | ||
1576 | static SENSOR_DEVICE_ATTR(in7_label, S_IRUGO, show_voltage_label, NULL, 6); | ||
1577 | static SENSOR_DEVICE_ATTR(in8_label, S_IRUGO, show_voltage_label, NULL, 7); | ||
1578 | static SENSOR_DEVICE_ATTR(in9_label, S_IRUGO, show_voltage_label, NULL, 8); | ||
1579 | static SENSOR_DEVICE_ATTR(in10_label, S_IRUGO, show_voltage_label, NULL, 9); | ||
1580 | static SENSOR_DEVICE_ATTR(in11_label, S_IRUGO, show_voltage_label, NULL, 10); | ||
1581 | static SENSOR_DEVICE_ATTR(in12_label, S_IRUGO, show_voltage_label, NULL, 11); | ||
1582 | static SENSOR_DEVICE_ATTR(in13_label, S_IRUGO, show_voltage_label, NULL, 12); | ||
1583 | |||
1584 | static SENSOR_DEVICE_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, | ||
1585 | ADT7462_ALARM2 | ADT7462_V0_ALARM); | ||
1586 | static SENSOR_DEVICE_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, | ||
1587 | ADT7462_ALARM2 | ADT7462_V7_ALARM); | ||
1588 | static SENSOR_DEVICE_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, | ||
1589 | ADT7462_ALARM2 | ADT7462_V2_ALARM); | ||
1590 | static SENSOR_DEVICE_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, | ||
1591 | ADT7462_ALARM2 | ADT7462_V6_ALARM); | ||
1592 | static SENSOR_DEVICE_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, | ||
1593 | ADT7462_ALARM2 | ADT7462_V5_ALARM); | ||
1594 | static SENSOR_DEVICE_ATTR(in6_alarm, S_IRUGO, show_alarm, NULL, | ||
1595 | ADT7462_ALARM2 | ADT7462_V4_ALARM); | ||
1596 | static SENSOR_DEVICE_ATTR(in7_alarm, S_IRUGO, show_alarm, NULL, | ||
1597 | ADT7462_ALARM2 | ADT7462_V3_ALARM); | ||
1598 | static SENSOR_DEVICE_ATTR(in8_alarm, S_IRUGO, show_alarm, NULL, | ||
1599 | ADT7462_ALARM2 | ADT7462_V1_ALARM); | ||
1600 | static SENSOR_DEVICE_ATTR(in9_alarm, S_IRUGO, show_alarm, NULL, | ||
1601 | ADT7462_ALARM3 | ADT7462_V10_ALARM); | ||
1602 | static SENSOR_DEVICE_ATTR(in10_alarm, S_IRUGO, show_alarm, NULL, | ||
1603 | ADT7462_ALARM3 | ADT7462_V9_ALARM); | ||
1604 | static SENSOR_DEVICE_ATTR(in11_alarm, S_IRUGO, show_alarm, NULL, | ||
1605 | ADT7462_ALARM3 | ADT7462_V8_ALARM); | ||
1606 | static SENSOR_DEVICE_ATTR(in12_alarm, S_IRUGO, show_alarm, NULL, | ||
1607 | ADT7462_ALARM3 | ADT7462_V11_ALARM); | ||
1608 | static SENSOR_DEVICE_ATTR(in13_alarm, S_IRUGO, show_alarm, NULL, | ||
1609 | ADT7462_ALARM3 | ADT7462_V12_ALARM); | ||
1610 | |||
1611 | static SENSOR_DEVICE_ATTR(fan1_min, S_IWUSR | S_IRUGO, show_fan_min, | ||
1612 | set_fan_min, 0); | ||
1613 | static SENSOR_DEVICE_ATTR(fan2_min, S_IWUSR | S_IRUGO, show_fan_min, | ||
1614 | set_fan_min, 1); | ||
1615 | static SENSOR_DEVICE_ATTR(fan3_min, S_IWUSR | S_IRUGO, show_fan_min, | ||
1616 | set_fan_min, 2); | ||
1617 | static SENSOR_DEVICE_ATTR(fan4_min, S_IWUSR | S_IRUGO, show_fan_min, | ||
1618 | set_fan_min, 3); | ||
1619 | static SENSOR_DEVICE_ATTR(fan5_min, S_IWUSR | S_IRUGO, show_fan_min, | ||
1620 | set_fan_min, 4); | ||
1621 | static SENSOR_DEVICE_ATTR(fan6_min, S_IWUSR | S_IRUGO, show_fan_min, | ||
1622 | set_fan_min, 5); | ||
1623 | static SENSOR_DEVICE_ATTR(fan7_min, S_IWUSR | S_IRUGO, show_fan_min, | ||
1624 | set_fan_min, 6); | ||
1625 | static SENSOR_DEVICE_ATTR(fan8_min, S_IWUSR | S_IRUGO, show_fan_min, | ||
1626 | set_fan_min, 7); | ||
1627 | |||
1628 | static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, show_fan, NULL, 0); | ||
1629 | static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, show_fan, NULL, 1); | ||
1630 | static SENSOR_DEVICE_ATTR(fan3_input, S_IRUGO, show_fan, NULL, 2); | ||
1631 | static SENSOR_DEVICE_ATTR(fan4_input, S_IRUGO, show_fan, NULL, 3); | ||
1632 | static SENSOR_DEVICE_ATTR(fan5_input, S_IRUGO, show_fan, NULL, 4); | ||
1633 | static SENSOR_DEVICE_ATTR(fan6_input, S_IRUGO, show_fan, NULL, 5); | ||
1634 | static SENSOR_DEVICE_ATTR(fan7_input, S_IRUGO, show_fan, NULL, 6); | ||
1635 | static SENSOR_DEVICE_ATTR(fan8_input, S_IRUGO, show_fan, NULL, 7); | ||
1636 | |||
1637 | static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, | ||
1638 | ADT7462_ALARM4 | ADT7462_F0_ALARM); | ||
1639 | static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, | ||
1640 | ADT7462_ALARM4 | ADT7462_F1_ALARM); | ||
1641 | static SENSOR_DEVICE_ATTR(fan3_alarm, S_IRUGO, show_alarm, NULL, | ||
1642 | ADT7462_ALARM4 | ADT7462_F2_ALARM); | ||
1643 | static SENSOR_DEVICE_ATTR(fan4_alarm, S_IRUGO, show_alarm, NULL, | ||
1644 | ADT7462_ALARM4 | ADT7462_F3_ALARM); | ||
1645 | static SENSOR_DEVICE_ATTR(fan5_alarm, S_IRUGO, show_alarm, NULL, | ||
1646 | ADT7462_ALARM4 | ADT7462_F4_ALARM); | ||
1647 | static SENSOR_DEVICE_ATTR(fan6_alarm, S_IRUGO, show_alarm, NULL, | ||
1648 | ADT7462_ALARM4 | ADT7462_F5_ALARM); | ||
1649 | static SENSOR_DEVICE_ATTR(fan7_alarm, S_IRUGO, show_alarm, NULL, | ||
1650 | ADT7462_ALARM4 | ADT7462_F6_ALARM); | ||
1651 | static SENSOR_DEVICE_ATTR(fan8_alarm, S_IRUGO, show_alarm, NULL, | ||
1652 | ADT7462_ALARM4 | ADT7462_F7_ALARM); | ||
1653 | |||
1654 | static SENSOR_DEVICE_ATTR(force_pwm_max, S_IWUSR | S_IRUGO, | ||
1655 | show_force_pwm_max, set_force_pwm_max, 0); | ||
1656 | |||
1657 | static SENSOR_DEVICE_ATTR(pwm1, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 0); | ||
1658 | static SENSOR_DEVICE_ATTR(pwm2, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 1); | ||
1659 | static SENSOR_DEVICE_ATTR(pwm3, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 2); | ||
1660 | static SENSOR_DEVICE_ATTR(pwm4, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 3); | ||
1661 | |||
1662 | static SENSOR_DEVICE_ATTR(pwm1_auto_point1_pwm, S_IWUSR | S_IRUGO, | ||
1663 | show_pwm_min, set_pwm_min, 0); | ||
1664 | static SENSOR_DEVICE_ATTR(pwm2_auto_point1_pwm, S_IWUSR | S_IRUGO, | ||
1665 | show_pwm_min, set_pwm_min, 1); | ||
1666 | static SENSOR_DEVICE_ATTR(pwm3_auto_point1_pwm, S_IWUSR | S_IRUGO, | ||
1667 | show_pwm_min, set_pwm_min, 2); | ||
1668 | static SENSOR_DEVICE_ATTR(pwm4_auto_point1_pwm, S_IWUSR | S_IRUGO, | ||
1669 | show_pwm_min, set_pwm_min, 3); | ||
1670 | |||
1671 | static SENSOR_DEVICE_ATTR(pwm1_auto_point2_pwm, S_IWUSR | S_IRUGO, | ||
1672 | show_pwm_max, set_pwm_max, 0); | ||
1673 | static SENSOR_DEVICE_ATTR(pwm2_auto_point2_pwm, S_IWUSR | S_IRUGO, | ||
1674 | show_pwm_max, set_pwm_max, 1); | ||
1675 | static SENSOR_DEVICE_ATTR(pwm3_auto_point2_pwm, S_IWUSR | S_IRUGO, | ||
1676 | show_pwm_max, set_pwm_max, 2); | ||
1677 | static SENSOR_DEVICE_ATTR(pwm4_auto_point2_pwm, S_IWUSR | S_IRUGO, | ||
1678 | show_pwm_max, set_pwm_max, 3); | ||
1679 | |||
1680 | static SENSOR_DEVICE_ATTR(temp1_auto_point1_hyst, S_IWUSR | S_IRUGO, | ||
1681 | show_pwm_hyst, set_pwm_hyst, 0); | ||
1682 | static SENSOR_DEVICE_ATTR(temp2_auto_point1_hyst, S_IWUSR | S_IRUGO, | ||
1683 | show_pwm_hyst, set_pwm_hyst, 1); | ||
1684 | static SENSOR_DEVICE_ATTR(temp3_auto_point1_hyst, S_IWUSR | S_IRUGO, | ||
1685 | show_pwm_hyst, set_pwm_hyst, 2); | ||
1686 | static SENSOR_DEVICE_ATTR(temp4_auto_point1_hyst, S_IWUSR | S_IRUGO, | ||
1687 | show_pwm_hyst, set_pwm_hyst, 3); | ||
1688 | |||
1689 | static SENSOR_DEVICE_ATTR(temp1_auto_point2_hyst, S_IWUSR | S_IRUGO, | ||
1690 | show_pwm_hyst, set_pwm_hyst, 0); | ||
1691 | static SENSOR_DEVICE_ATTR(temp2_auto_point2_hyst, S_IWUSR | S_IRUGO, | ||
1692 | show_pwm_hyst, set_pwm_hyst, 1); | ||
1693 | static SENSOR_DEVICE_ATTR(temp3_auto_point2_hyst, S_IWUSR | S_IRUGO, | ||
1694 | show_pwm_hyst, set_pwm_hyst, 2); | ||
1695 | static SENSOR_DEVICE_ATTR(temp4_auto_point2_hyst, S_IWUSR | S_IRUGO, | ||
1696 | show_pwm_hyst, set_pwm_hyst, 3); | ||
1697 | |||
1698 | static SENSOR_DEVICE_ATTR(temp1_auto_point1_temp, S_IWUSR | S_IRUGO, | ||
1699 | show_pwm_tmin, set_pwm_tmin, 0); | ||
1700 | static SENSOR_DEVICE_ATTR(temp2_auto_point1_temp, S_IWUSR | S_IRUGO, | ||
1701 | show_pwm_tmin, set_pwm_tmin, 1); | ||
1702 | static SENSOR_DEVICE_ATTR(temp3_auto_point1_temp, S_IWUSR | S_IRUGO, | ||
1703 | show_pwm_tmin, set_pwm_tmin, 2); | ||
1704 | static SENSOR_DEVICE_ATTR(temp4_auto_point1_temp, S_IWUSR | S_IRUGO, | ||
1705 | show_pwm_tmin, set_pwm_tmin, 3); | ||
1706 | |||
1707 | static SENSOR_DEVICE_ATTR(temp1_auto_point2_temp, S_IWUSR | S_IRUGO, | ||
1708 | show_pwm_tmax, set_pwm_tmax, 0); | ||
1709 | static SENSOR_DEVICE_ATTR(temp2_auto_point2_temp, S_IWUSR | S_IRUGO, | ||
1710 | show_pwm_tmax, set_pwm_tmax, 1); | ||
1711 | static SENSOR_DEVICE_ATTR(temp3_auto_point2_temp, S_IWUSR | S_IRUGO, | ||
1712 | show_pwm_tmax, set_pwm_tmax, 2); | ||
1713 | static SENSOR_DEVICE_ATTR(temp4_auto_point2_temp, S_IWUSR | S_IRUGO, | ||
1714 | show_pwm_tmax, set_pwm_tmax, 3); | ||
1715 | |||
1716 | static SENSOR_DEVICE_ATTR(pwm1_enable, S_IWUSR | S_IRUGO, show_pwm_auto, | ||
1717 | set_pwm_auto, 0); | ||
1718 | static SENSOR_DEVICE_ATTR(pwm2_enable, S_IWUSR | S_IRUGO, show_pwm_auto, | ||
1719 | set_pwm_auto, 1); | ||
1720 | static SENSOR_DEVICE_ATTR(pwm3_enable, S_IWUSR | S_IRUGO, show_pwm_auto, | ||
1721 | set_pwm_auto, 2); | ||
1722 | static SENSOR_DEVICE_ATTR(pwm4_enable, S_IWUSR | S_IRUGO, show_pwm_auto, | ||
1723 | set_pwm_auto, 3); | ||
1724 | |||
1725 | static SENSOR_DEVICE_ATTR(pwm1_auto_channels_temp, S_IWUSR | S_IRUGO, | ||
1726 | show_pwm_auto_temp, set_pwm_auto_temp, 0); | ||
1727 | static SENSOR_DEVICE_ATTR(pwm2_auto_channels_temp, S_IWUSR | S_IRUGO, | ||
1728 | show_pwm_auto_temp, set_pwm_auto_temp, 1); | ||
1729 | static SENSOR_DEVICE_ATTR(pwm3_auto_channels_temp, S_IWUSR | S_IRUGO, | ||
1730 | show_pwm_auto_temp, set_pwm_auto_temp, 2); | ||
1731 | static SENSOR_DEVICE_ATTR(pwm4_auto_channels_temp, S_IWUSR | S_IRUGO, | ||
1732 | show_pwm_auto_temp, set_pwm_auto_temp, 3); | ||
1733 | |||
1734 | static struct attribute *adt7462_attr[] = | ||
1735 | { | ||
1736 | &sensor_dev_attr_temp1_max.dev_attr.attr, | ||
1737 | &sensor_dev_attr_temp2_max.dev_attr.attr, | ||
1738 | &sensor_dev_attr_temp3_max.dev_attr.attr, | ||
1739 | &sensor_dev_attr_temp4_max.dev_attr.attr, | ||
1740 | |||
1741 | &sensor_dev_attr_temp1_min.dev_attr.attr, | ||
1742 | &sensor_dev_attr_temp2_min.dev_attr.attr, | ||
1743 | &sensor_dev_attr_temp3_min.dev_attr.attr, | ||
1744 | &sensor_dev_attr_temp4_min.dev_attr.attr, | ||
1745 | |||
1746 | &sensor_dev_attr_temp1_input.dev_attr.attr, | ||
1747 | &sensor_dev_attr_temp2_input.dev_attr.attr, | ||
1748 | &sensor_dev_attr_temp3_input.dev_attr.attr, | ||
1749 | &sensor_dev_attr_temp4_input.dev_attr.attr, | ||
1750 | |||
1751 | &sensor_dev_attr_temp1_label.dev_attr.attr, | ||
1752 | &sensor_dev_attr_temp2_label.dev_attr.attr, | ||
1753 | &sensor_dev_attr_temp3_label.dev_attr.attr, | ||
1754 | &sensor_dev_attr_temp4_label.dev_attr.attr, | ||
1755 | |||
1756 | &sensor_dev_attr_temp1_alarm.dev_attr.attr, | ||
1757 | &sensor_dev_attr_temp2_alarm.dev_attr.attr, | ||
1758 | &sensor_dev_attr_temp3_alarm.dev_attr.attr, | ||
1759 | &sensor_dev_attr_temp4_alarm.dev_attr.attr, | ||
1760 | |||
1761 | &sensor_dev_attr_in1_max.dev_attr.attr, | ||
1762 | &sensor_dev_attr_in2_max.dev_attr.attr, | ||
1763 | &sensor_dev_attr_in3_max.dev_attr.attr, | ||
1764 | &sensor_dev_attr_in4_max.dev_attr.attr, | ||
1765 | &sensor_dev_attr_in5_max.dev_attr.attr, | ||
1766 | &sensor_dev_attr_in6_max.dev_attr.attr, | ||
1767 | &sensor_dev_attr_in7_max.dev_attr.attr, | ||
1768 | &sensor_dev_attr_in8_max.dev_attr.attr, | ||
1769 | &sensor_dev_attr_in9_max.dev_attr.attr, | ||
1770 | &sensor_dev_attr_in10_max.dev_attr.attr, | ||
1771 | &sensor_dev_attr_in11_max.dev_attr.attr, | ||
1772 | &sensor_dev_attr_in12_max.dev_attr.attr, | ||
1773 | &sensor_dev_attr_in13_max.dev_attr.attr, | ||
1774 | |||
1775 | &sensor_dev_attr_in1_min.dev_attr.attr, | ||
1776 | &sensor_dev_attr_in2_min.dev_attr.attr, | ||
1777 | &sensor_dev_attr_in3_min.dev_attr.attr, | ||
1778 | &sensor_dev_attr_in4_min.dev_attr.attr, | ||
1779 | &sensor_dev_attr_in5_min.dev_attr.attr, | ||
1780 | &sensor_dev_attr_in6_min.dev_attr.attr, | ||
1781 | &sensor_dev_attr_in7_min.dev_attr.attr, | ||
1782 | &sensor_dev_attr_in8_min.dev_attr.attr, | ||
1783 | &sensor_dev_attr_in9_min.dev_attr.attr, | ||
1784 | &sensor_dev_attr_in10_min.dev_attr.attr, | ||
1785 | &sensor_dev_attr_in11_min.dev_attr.attr, | ||
1786 | &sensor_dev_attr_in12_min.dev_attr.attr, | ||
1787 | &sensor_dev_attr_in13_min.dev_attr.attr, | ||
1788 | |||
1789 | &sensor_dev_attr_in1_input.dev_attr.attr, | ||
1790 | &sensor_dev_attr_in2_input.dev_attr.attr, | ||
1791 | &sensor_dev_attr_in3_input.dev_attr.attr, | ||
1792 | &sensor_dev_attr_in4_input.dev_attr.attr, | ||
1793 | &sensor_dev_attr_in5_input.dev_attr.attr, | ||
1794 | &sensor_dev_attr_in6_input.dev_attr.attr, | ||
1795 | &sensor_dev_attr_in7_input.dev_attr.attr, | ||
1796 | &sensor_dev_attr_in8_input.dev_attr.attr, | ||
1797 | &sensor_dev_attr_in9_input.dev_attr.attr, | ||
1798 | &sensor_dev_attr_in10_input.dev_attr.attr, | ||
1799 | &sensor_dev_attr_in11_input.dev_attr.attr, | ||
1800 | &sensor_dev_attr_in12_input.dev_attr.attr, | ||
1801 | &sensor_dev_attr_in13_input.dev_attr.attr, | ||
1802 | |||
1803 | &sensor_dev_attr_in1_label.dev_attr.attr, | ||
1804 | &sensor_dev_attr_in2_label.dev_attr.attr, | ||
1805 | &sensor_dev_attr_in3_label.dev_attr.attr, | ||
1806 | &sensor_dev_attr_in4_label.dev_attr.attr, | ||
1807 | &sensor_dev_attr_in5_label.dev_attr.attr, | ||
1808 | &sensor_dev_attr_in6_label.dev_attr.attr, | ||
1809 | &sensor_dev_attr_in7_label.dev_attr.attr, | ||
1810 | &sensor_dev_attr_in8_label.dev_attr.attr, | ||
1811 | &sensor_dev_attr_in9_label.dev_attr.attr, | ||
1812 | &sensor_dev_attr_in10_label.dev_attr.attr, | ||
1813 | &sensor_dev_attr_in11_label.dev_attr.attr, | ||
1814 | &sensor_dev_attr_in12_label.dev_attr.attr, | ||
1815 | &sensor_dev_attr_in13_label.dev_attr.attr, | ||
1816 | |||
1817 | &sensor_dev_attr_in1_alarm.dev_attr.attr, | ||
1818 | &sensor_dev_attr_in2_alarm.dev_attr.attr, | ||
1819 | &sensor_dev_attr_in3_alarm.dev_attr.attr, | ||
1820 | &sensor_dev_attr_in4_alarm.dev_attr.attr, | ||
1821 | &sensor_dev_attr_in5_alarm.dev_attr.attr, | ||
1822 | &sensor_dev_attr_in6_alarm.dev_attr.attr, | ||
1823 | &sensor_dev_attr_in7_alarm.dev_attr.attr, | ||
1824 | &sensor_dev_attr_in8_alarm.dev_attr.attr, | ||
1825 | &sensor_dev_attr_in9_alarm.dev_attr.attr, | ||
1826 | &sensor_dev_attr_in10_alarm.dev_attr.attr, | ||
1827 | &sensor_dev_attr_in11_alarm.dev_attr.attr, | ||
1828 | &sensor_dev_attr_in12_alarm.dev_attr.attr, | ||
1829 | &sensor_dev_attr_in13_alarm.dev_attr.attr, | ||
1830 | |||
1831 | &sensor_dev_attr_fan1_min.dev_attr.attr, | ||
1832 | &sensor_dev_attr_fan2_min.dev_attr.attr, | ||
1833 | &sensor_dev_attr_fan3_min.dev_attr.attr, | ||
1834 | &sensor_dev_attr_fan4_min.dev_attr.attr, | ||
1835 | &sensor_dev_attr_fan5_min.dev_attr.attr, | ||
1836 | &sensor_dev_attr_fan6_min.dev_attr.attr, | ||
1837 | &sensor_dev_attr_fan7_min.dev_attr.attr, | ||
1838 | &sensor_dev_attr_fan8_min.dev_attr.attr, | ||
1839 | |||
1840 | &sensor_dev_attr_fan1_input.dev_attr.attr, | ||
1841 | &sensor_dev_attr_fan2_input.dev_attr.attr, | ||
1842 | &sensor_dev_attr_fan3_input.dev_attr.attr, | ||
1843 | &sensor_dev_attr_fan4_input.dev_attr.attr, | ||
1844 | &sensor_dev_attr_fan5_input.dev_attr.attr, | ||
1845 | &sensor_dev_attr_fan6_input.dev_attr.attr, | ||
1846 | &sensor_dev_attr_fan7_input.dev_attr.attr, | ||
1847 | &sensor_dev_attr_fan8_input.dev_attr.attr, | ||
1848 | |||
1849 | &sensor_dev_attr_fan1_alarm.dev_attr.attr, | ||
1850 | &sensor_dev_attr_fan2_alarm.dev_attr.attr, | ||
1851 | &sensor_dev_attr_fan3_alarm.dev_attr.attr, | ||
1852 | &sensor_dev_attr_fan4_alarm.dev_attr.attr, | ||
1853 | &sensor_dev_attr_fan5_alarm.dev_attr.attr, | ||
1854 | &sensor_dev_attr_fan6_alarm.dev_attr.attr, | ||
1855 | &sensor_dev_attr_fan7_alarm.dev_attr.attr, | ||
1856 | &sensor_dev_attr_fan8_alarm.dev_attr.attr, | ||
1857 | |||
1858 | &sensor_dev_attr_force_pwm_max.dev_attr.attr, | ||
1859 | &sensor_dev_attr_pwm1.dev_attr.attr, | ||
1860 | &sensor_dev_attr_pwm2.dev_attr.attr, | ||
1861 | &sensor_dev_attr_pwm3.dev_attr.attr, | ||
1862 | &sensor_dev_attr_pwm4.dev_attr.attr, | ||
1863 | |||
1864 | &sensor_dev_attr_pwm1_auto_point1_pwm.dev_attr.attr, | ||
1865 | &sensor_dev_attr_pwm2_auto_point1_pwm.dev_attr.attr, | ||
1866 | &sensor_dev_attr_pwm3_auto_point1_pwm.dev_attr.attr, | ||
1867 | &sensor_dev_attr_pwm4_auto_point1_pwm.dev_attr.attr, | ||
1868 | |||
1869 | &sensor_dev_attr_pwm1_auto_point2_pwm.dev_attr.attr, | ||
1870 | &sensor_dev_attr_pwm2_auto_point2_pwm.dev_attr.attr, | ||
1871 | &sensor_dev_attr_pwm3_auto_point2_pwm.dev_attr.attr, | ||
1872 | &sensor_dev_attr_pwm4_auto_point2_pwm.dev_attr.attr, | ||
1873 | |||
1874 | &sensor_dev_attr_temp1_auto_point1_hyst.dev_attr.attr, | ||
1875 | &sensor_dev_attr_temp2_auto_point1_hyst.dev_attr.attr, | ||
1876 | &sensor_dev_attr_temp3_auto_point1_hyst.dev_attr.attr, | ||
1877 | &sensor_dev_attr_temp4_auto_point1_hyst.dev_attr.attr, | ||
1878 | |||
1879 | &sensor_dev_attr_temp1_auto_point2_hyst.dev_attr.attr, | ||
1880 | &sensor_dev_attr_temp2_auto_point2_hyst.dev_attr.attr, | ||
1881 | &sensor_dev_attr_temp3_auto_point2_hyst.dev_attr.attr, | ||
1882 | &sensor_dev_attr_temp4_auto_point2_hyst.dev_attr.attr, | ||
1883 | |||
1884 | &sensor_dev_attr_temp1_auto_point1_temp.dev_attr.attr, | ||
1885 | &sensor_dev_attr_temp2_auto_point1_temp.dev_attr.attr, | ||
1886 | &sensor_dev_attr_temp3_auto_point1_temp.dev_attr.attr, | ||
1887 | &sensor_dev_attr_temp4_auto_point1_temp.dev_attr.attr, | ||
1888 | |||
1889 | &sensor_dev_attr_temp1_auto_point2_temp.dev_attr.attr, | ||
1890 | &sensor_dev_attr_temp2_auto_point2_temp.dev_attr.attr, | ||
1891 | &sensor_dev_attr_temp3_auto_point2_temp.dev_attr.attr, | ||
1892 | &sensor_dev_attr_temp4_auto_point2_temp.dev_attr.attr, | ||
1893 | |||
1894 | &sensor_dev_attr_pwm1_enable.dev_attr.attr, | ||
1895 | &sensor_dev_attr_pwm2_enable.dev_attr.attr, | ||
1896 | &sensor_dev_attr_pwm3_enable.dev_attr.attr, | ||
1897 | &sensor_dev_attr_pwm4_enable.dev_attr.attr, | ||
1898 | |||
1899 | &sensor_dev_attr_pwm1_auto_channels_temp.dev_attr.attr, | ||
1900 | &sensor_dev_attr_pwm2_auto_channels_temp.dev_attr.attr, | ||
1901 | &sensor_dev_attr_pwm3_auto_channels_temp.dev_attr.attr, | ||
1902 | &sensor_dev_attr_pwm4_auto_channels_temp.dev_attr.attr, | ||
1903 | NULL | ||
1904 | }; | ||
1905 | |||
1906 | /* Return 0 if detection is successful, -ENODEV otherwise */ | ||
1907 | static int adt7462_detect(struct i2c_client *client, int kind, | ||
1908 | struct i2c_board_info *info) | ||
1909 | { | ||
1910 | struct i2c_adapter *adapter = client->adapter; | ||
1911 | |||
1912 | if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) | ||
1913 | return -ENODEV; | ||
1914 | |||
1915 | if (kind <= 0) { | ||
1916 | int vendor, device, revision; | ||
1917 | |||
1918 | vendor = i2c_smbus_read_byte_data(client, ADT7462_REG_VENDOR); | ||
1919 | if (vendor != ADT7462_VENDOR) | ||
1920 | return -ENODEV; | ||
1921 | |||
1922 | device = i2c_smbus_read_byte_data(client, ADT7462_REG_DEVICE); | ||
1923 | if (device != ADT7462_DEVICE) | ||
1924 | return -ENODEV; | ||
1925 | |||
1926 | revision = i2c_smbus_read_byte_data(client, | ||
1927 | ADT7462_REG_REVISION); | ||
1928 | if (revision != ADT7462_REVISION) | ||
1929 | return -ENODEV; | ||
1930 | } else | ||
1931 | dev_dbg(&adapter->dev, "detection forced\n"); | ||
1932 | |||
1933 | strlcpy(info->type, "adt7462", I2C_NAME_SIZE); | ||
1934 | |||
1935 | return 0; | ||
1936 | } | ||
1937 | |||
1938 | static int adt7462_probe(struct i2c_client *client, | ||
1939 | const struct i2c_device_id *id) | ||
1940 | { | ||
1941 | struct adt7462_data *data; | ||
1942 | int err; | ||
1943 | |||
1944 | data = kzalloc(sizeof(struct adt7462_data), GFP_KERNEL); | ||
1945 | if (!data) { | ||
1946 | err = -ENOMEM; | ||
1947 | goto exit; | ||
1948 | } | ||
1949 | |||
1950 | i2c_set_clientdata(client, data); | ||
1951 | mutex_init(&data->lock); | ||
1952 | |||
1953 | dev_info(&client->dev, "%s chip found\n", client->name); | ||
1954 | |||
1955 | /* Register sysfs hooks */ | ||
1956 | data->attrs.attrs = adt7462_attr; | ||
1957 | err = sysfs_create_group(&client->dev.kobj, &data->attrs); | ||
1958 | if (err) | ||
1959 | goto exit_free; | ||
1960 | |||
1961 | data->hwmon_dev = hwmon_device_register(&client->dev); | ||
1962 | if (IS_ERR(data->hwmon_dev)) { | ||
1963 | err = PTR_ERR(data->hwmon_dev); | ||
1964 | goto exit_remove; | ||
1965 | } | ||
1966 | |||
1967 | return 0; | ||
1968 | |||
1969 | exit_remove: | ||
1970 | sysfs_remove_group(&client->dev.kobj, &data->attrs); | ||
1971 | exit_free: | ||
1972 | kfree(data); | ||
1973 | exit: | ||
1974 | return err; | ||
1975 | } | ||
1976 | |||
1977 | static int adt7462_remove(struct i2c_client *client) | ||
1978 | { | ||
1979 | struct adt7462_data *data = i2c_get_clientdata(client); | ||
1980 | |||
1981 | hwmon_device_unregister(data->hwmon_dev); | ||
1982 | sysfs_remove_group(&client->dev.kobj, &data->attrs); | ||
1983 | kfree(data); | ||
1984 | return 0; | ||
1985 | } | ||
1986 | |||
1987 | static int __init adt7462_init(void) | ||
1988 | { | ||
1989 | return i2c_add_driver(&adt7462_driver); | ||
1990 | } | ||
1991 | |||
1992 | static void __exit adt7462_exit(void) | ||
1993 | { | ||
1994 | i2c_del_driver(&adt7462_driver); | ||
1995 | } | ||
1996 | |||
1997 | MODULE_AUTHOR("Darrick J. Wong <djwong@us.ibm.com>"); | ||
1998 | MODULE_DESCRIPTION("ADT7462 driver"); | ||
1999 | MODULE_LICENSE("GPL"); | ||
2000 | |||
2001 | module_init(adt7462_init); | ||
2002 | module_exit(adt7462_exit); | ||
diff --git a/drivers/hwmon/adt7470.c b/drivers/hwmon/adt7470.c index d368d8f845e1..1311a595147e 100644 --- a/drivers/hwmon/adt7470.c +++ b/drivers/hwmon/adt7470.c | |||
@@ -137,6 +137,8 @@ I2C_CLIENT_INSMOD_1(adt7470); | |||
137 | #define FAN_PERIOD_INVALID 65535 | 137 | #define FAN_PERIOD_INVALID 65535 |
138 | #define FAN_DATA_VALID(x) ((x) && (x) != FAN_PERIOD_INVALID) | 138 | #define FAN_DATA_VALID(x) ((x) && (x) != FAN_PERIOD_INVALID) |
139 | 139 | ||
140 | #define ROUND_DIV(x, divisor) (((x) + ((divisor) / 2)) / (divisor)) | ||
141 | |||
140 | struct adt7470_data { | 142 | struct adt7470_data { |
141 | struct device *hwmon_dev; | 143 | struct device *hwmon_dev; |
142 | struct attribute_group attrs; | 144 | struct attribute_group attrs; |
@@ -353,7 +355,13 @@ static ssize_t set_temp_min(struct device *dev, | |||
353 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 355 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
354 | struct i2c_client *client = to_i2c_client(dev); | 356 | struct i2c_client *client = to_i2c_client(dev); |
355 | struct adt7470_data *data = i2c_get_clientdata(client); | 357 | struct adt7470_data *data = i2c_get_clientdata(client); |
356 | int temp = simple_strtol(buf, NULL, 10) / 1000; | 358 | long temp; |
359 | |||
360 | if (strict_strtol(buf, 10, &temp)) | ||
361 | return -EINVAL; | ||
362 | |||
363 | temp = ROUND_DIV(temp, 1000); | ||
364 | temp = SENSORS_LIMIT(temp, 0, 255); | ||
357 | 365 | ||
358 | mutex_lock(&data->lock); | 366 | mutex_lock(&data->lock); |
359 | data->temp_min[attr->index] = temp; | 367 | data->temp_min[attr->index] = temp; |
@@ -381,7 +389,13 @@ static ssize_t set_temp_max(struct device *dev, | |||
381 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 389 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
382 | struct i2c_client *client = to_i2c_client(dev); | 390 | struct i2c_client *client = to_i2c_client(dev); |
383 | struct adt7470_data *data = i2c_get_clientdata(client); | 391 | struct adt7470_data *data = i2c_get_clientdata(client); |
384 | int temp = simple_strtol(buf, NULL, 10) / 1000; | 392 | long temp; |
393 | |||
394 | if (strict_strtol(buf, 10, &temp)) | ||
395 | return -EINVAL; | ||
396 | |||
397 | temp = ROUND_DIV(temp, 1000); | ||
398 | temp = SENSORS_LIMIT(temp, 0, 255); | ||
385 | 399 | ||
386 | mutex_lock(&data->lock); | 400 | mutex_lock(&data->lock); |
387 | data->temp_max[attr->index] = temp; | 401 | data->temp_max[attr->index] = temp; |
@@ -430,11 +444,13 @@ static ssize_t set_fan_max(struct device *dev, | |||
430 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 444 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
431 | struct i2c_client *client = to_i2c_client(dev); | 445 | struct i2c_client *client = to_i2c_client(dev); |
432 | struct adt7470_data *data = i2c_get_clientdata(client); | 446 | struct adt7470_data *data = i2c_get_clientdata(client); |
433 | int temp = simple_strtol(buf, NULL, 10); | 447 | long temp; |
434 | 448 | ||
435 | if (!temp) | 449 | if (strict_strtol(buf, 10, &temp) || !temp) |
436 | return -EINVAL; | 450 | return -EINVAL; |
451 | |||
437 | temp = FAN_RPM_TO_PERIOD(temp); | 452 | temp = FAN_RPM_TO_PERIOD(temp); |
453 | temp = SENSORS_LIMIT(temp, 1, 65534); | ||
438 | 454 | ||
439 | mutex_lock(&data->lock); | 455 | mutex_lock(&data->lock); |
440 | data->fan_max[attr->index] = temp; | 456 | data->fan_max[attr->index] = temp; |
@@ -465,11 +481,13 @@ static ssize_t set_fan_min(struct device *dev, | |||
465 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 481 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
466 | struct i2c_client *client = to_i2c_client(dev); | 482 | struct i2c_client *client = to_i2c_client(dev); |
467 | struct adt7470_data *data = i2c_get_clientdata(client); | 483 | struct adt7470_data *data = i2c_get_clientdata(client); |
468 | int temp = simple_strtol(buf, NULL, 10); | 484 | long temp; |
469 | 485 | ||
470 | if (!temp) | 486 | if (strict_strtol(buf, 10, &temp) || !temp) |
471 | return -EINVAL; | 487 | return -EINVAL; |
488 | |||
472 | temp = FAN_RPM_TO_PERIOD(temp); | 489 | temp = FAN_RPM_TO_PERIOD(temp); |
490 | temp = SENSORS_LIMIT(temp, 1, 65534); | ||
473 | 491 | ||
474 | mutex_lock(&data->lock); | 492 | mutex_lock(&data->lock); |
475 | data->fan_min[attr->index] = temp; | 493 | data->fan_min[attr->index] = temp; |
@@ -507,9 +525,12 @@ static ssize_t set_force_pwm_max(struct device *dev, | |||
507 | { | 525 | { |
508 | struct i2c_client *client = to_i2c_client(dev); | 526 | struct i2c_client *client = to_i2c_client(dev); |
509 | struct adt7470_data *data = i2c_get_clientdata(client); | 527 | struct adt7470_data *data = i2c_get_clientdata(client); |
510 | int temp = simple_strtol(buf, NULL, 10); | 528 | long temp; |
511 | u8 reg; | 529 | u8 reg; |
512 | 530 | ||
531 | if (strict_strtol(buf, 10, &temp)) | ||
532 | return -EINVAL; | ||
533 | |||
513 | mutex_lock(&data->lock); | 534 | mutex_lock(&data->lock); |
514 | data->force_pwm_max = temp; | 535 | data->force_pwm_max = temp; |
515 | reg = i2c_smbus_read_byte_data(client, ADT7470_REG_CFG); | 536 | reg = i2c_smbus_read_byte_data(client, ADT7470_REG_CFG); |
@@ -537,7 +558,12 @@ static ssize_t set_pwm(struct device *dev, struct device_attribute *devattr, | |||
537 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 558 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
538 | struct i2c_client *client = to_i2c_client(dev); | 559 | struct i2c_client *client = to_i2c_client(dev); |
539 | struct adt7470_data *data = i2c_get_clientdata(client); | 560 | struct adt7470_data *data = i2c_get_clientdata(client); |
540 | int temp = simple_strtol(buf, NULL, 10); | 561 | long temp; |
562 | |||
563 | if (strict_strtol(buf, 10, &temp)) | ||
564 | return -EINVAL; | ||
565 | |||
566 | temp = SENSORS_LIMIT(temp, 0, 255); | ||
541 | 567 | ||
542 | mutex_lock(&data->lock); | 568 | mutex_lock(&data->lock); |
543 | data->pwm[attr->index] = temp; | 569 | data->pwm[attr->index] = temp; |
@@ -564,7 +590,12 @@ static ssize_t set_pwm_max(struct device *dev, | |||
564 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 590 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
565 | struct i2c_client *client = to_i2c_client(dev); | 591 | struct i2c_client *client = to_i2c_client(dev); |
566 | struct adt7470_data *data = i2c_get_clientdata(client); | 592 | struct adt7470_data *data = i2c_get_clientdata(client); |
567 | int temp = simple_strtol(buf, NULL, 10); | 593 | long temp; |
594 | |||
595 | if (strict_strtol(buf, 10, &temp)) | ||
596 | return -EINVAL; | ||
597 | |||
598 | temp = SENSORS_LIMIT(temp, 0, 255); | ||
568 | 599 | ||
569 | mutex_lock(&data->lock); | 600 | mutex_lock(&data->lock); |
570 | data->pwm_max[attr->index] = temp; | 601 | data->pwm_max[attr->index] = temp; |
@@ -592,7 +623,12 @@ static ssize_t set_pwm_min(struct device *dev, | |||
592 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 623 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
593 | struct i2c_client *client = to_i2c_client(dev); | 624 | struct i2c_client *client = to_i2c_client(dev); |
594 | struct adt7470_data *data = i2c_get_clientdata(client); | 625 | struct adt7470_data *data = i2c_get_clientdata(client); |
595 | int temp = simple_strtol(buf, NULL, 10); | 626 | long temp; |
627 | |||
628 | if (strict_strtol(buf, 10, &temp)) | ||
629 | return -EINVAL; | ||
630 | |||
631 | temp = SENSORS_LIMIT(temp, 0, 255); | ||
596 | 632 | ||
597 | mutex_lock(&data->lock); | 633 | mutex_lock(&data->lock); |
598 | data->pwm_min[attr->index] = temp; | 634 | data->pwm_min[attr->index] = temp; |
@@ -630,7 +666,13 @@ static ssize_t set_pwm_tmin(struct device *dev, | |||
630 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 666 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
631 | struct i2c_client *client = to_i2c_client(dev); | 667 | struct i2c_client *client = to_i2c_client(dev); |
632 | struct adt7470_data *data = i2c_get_clientdata(client); | 668 | struct adt7470_data *data = i2c_get_clientdata(client); |
633 | int temp = simple_strtol(buf, NULL, 10) / 1000; | 669 | long temp; |
670 | |||
671 | if (strict_strtol(buf, 10, &temp)) | ||
672 | return -EINVAL; | ||
673 | |||
674 | temp = ROUND_DIV(temp, 1000); | ||
675 | temp = SENSORS_LIMIT(temp, 0, 255); | ||
634 | 676 | ||
635 | mutex_lock(&data->lock); | 677 | mutex_lock(&data->lock); |
636 | data->pwm_tmin[attr->index] = temp; | 678 | data->pwm_tmin[attr->index] = temp; |
@@ -658,11 +700,14 @@ static ssize_t set_pwm_auto(struct device *dev, | |||
658 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 700 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
659 | struct i2c_client *client = to_i2c_client(dev); | 701 | struct i2c_client *client = to_i2c_client(dev); |
660 | struct adt7470_data *data = i2c_get_clientdata(client); | 702 | struct adt7470_data *data = i2c_get_clientdata(client); |
661 | int temp = simple_strtol(buf, NULL, 10); | ||
662 | int pwm_auto_reg = ADT7470_REG_PWM_CFG(attr->index); | 703 | int pwm_auto_reg = ADT7470_REG_PWM_CFG(attr->index); |
663 | int pwm_auto_reg_mask; | 704 | int pwm_auto_reg_mask; |
705 | long temp; | ||
664 | u8 reg; | 706 | u8 reg; |
665 | 707 | ||
708 | if (strict_strtol(buf, 10, &temp)) | ||
709 | return -EINVAL; | ||
710 | |||
666 | if (attr->index % 2) | 711 | if (attr->index % 2) |
667 | pwm_auto_reg_mask = ADT7470_PWM2_AUTO_MASK; | 712 | pwm_auto_reg_mask = ADT7470_PWM2_AUTO_MASK; |
668 | else | 713 | else |
@@ -716,10 +761,14 @@ static ssize_t set_pwm_auto_temp(struct device *dev, | |||
716 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 761 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
717 | struct i2c_client *client = to_i2c_client(dev); | 762 | struct i2c_client *client = to_i2c_client(dev); |
718 | struct adt7470_data *data = i2c_get_clientdata(client); | 763 | struct adt7470_data *data = i2c_get_clientdata(client); |
719 | int temp = cvt_auto_temp(simple_strtol(buf, NULL, 10)); | ||
720 | int pwm_auto_reg = ADT7470_REG_PWM_AUTO_TEMP(attr->index); | 764 | int pwm_auto_reg = ADT7470_REG_PWM_AUTO_TEMP(attr->index); |
765 | long temp; | ||
721 | u8 reg; | 766 | u8 reg; |
722 | 767 | ||
768 | if (strict_strtol(buf, 10, &temp)) | ||
769 | return -EINVAL; | ||
770 | |||
771 | temp = cvt_auto_temp(temp); | ||
723 | if (temp < 0) | 772 | if (temp < 0) |
724 | return temp; | 773 | return temp; |
725 | 774 | ||
diff --git a/drivers/hwmon/adt7473.c b/drivers/hwmon/adt7473.c index b9a8ea30c99c..18aa30866a6c 100644 --- a/drivers/hwmon/adt7473.c +++ b/drivers/hwmon/adt7473.c | |||
@@ -129,6 +129,8 @@ I2C_CLIENT_INSMOD_1(adt7473); | |||
129 | #define FAN_PERIOD_INVALID 65535 | 129 | #define FAN_PERIOD_INVALID 65535 |
130 | #define FAN_DATA_VALID(x) ((x) && (x) != FAN_PERIOD_INVALID) | 130 | #define FAN_DATA_VALID(x) ((x) && (x) != FAN_PERIOD_INVALID) |
131 | 131 | ||
132 | #define ROUND_DIV(x, divisor) (((x) + ((divisor) / 2)) / (divisor)) | ||
133 | |||
132 | struct adt7473_data { | 134 | struct adt7473_data { |
133 | struct device *hwmon_dev; | 135 | struct device *hwmon_dev; |
134 | struct attribute_group attrs; | 136 | struct attribute_group attrs; |
@@ -357,7 +359,12 @@ static ssize_t set_volt_min(struct device *dev, | |||
357 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 359 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
358 | struct i2c_client *client = to_i2c_client(dev); | 360 | struct i2c_client *client = to_i2c_client(dev); |
359 | struct adt7473_data *data = i2c_get_clientdata(client); | 361 | struct adt7473_data *data = i2c_get_clientdata(client); |
360 | int volt = encode_volt(attr->index, simple_strtol(buf, NULL, 10)); | 362 | long volt; |
363 | |||
364 | if (strict_strtol(buf, 10, &volt)) | ||
365 | return -EINVAL; | ||
366 | |||
367 | volt = encode_volt(attr->index, volt); | ||
361 | 368 | ||
362 | mutex_lock(&data->lock); | 369 | mutex_lock(&data->lock); |
363 | data->volt_min[attr->index] = volt; | 370 | data->volt_min[attr->index] = volt; |
@@ -386,7 +393,12 @@ static ssize_t set_volt_max(struct device *dev, | |||
386 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 393 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
387 | struct i2c_client *client = to_i2c_client(dev); | 394 | struct i2c_client *client = to_i2c_client(dev); |
388 | struct adt7473_data *data = i2c_get_clientdata(client); | 395 | struct adt7473_data *data = i2c_get_clientdata(client); |
389 | int volt = encode_volt(attr->index, simple_strtol(buf, NULL, 10)); | 396 | long volt; |
397 | |||
398 | if (strict_strtol(buf, 10, &volt)) | ||
399 | return -EINVAL; | ||
400 | |||
401 | volt = encode_volt(attr->index, volt); | ||
390 | 402 | ||
391 | mutex_lock(&data->lock); | 403 | mutex_lock(&data->lock); |
392 | data->volt_max[attr->index] = volt; | 404 | data->volt_max[attr->index] = volt; |
@@ -419,7 +431,8 @@ static int decode_temp(u8 twos_complement, u8 raw) | |||
419 | 431 | ||
420 | static u8 encode_temp(u8 twos_complement, int cooked) | 432 | static u8 encode_temp(u8 twos_complement, int cooked) |
421 | { | 433 | { |
422 | return twos_complement ? cooked & 0xFF : cooked + 64; | 434 | u8 ret = twos_complement ? cooked & 0xFF : cooked + 64; |
435 | return SENSORS_LIMIT(ret, 0, 255); | ||
423 | } | 436 | } |
424 | 437 | ||
425 | static ssize_t show_temp_min(struct device *dev, | 438 | static ssize_t show_temp_min(struct device *dev, |
@@ -441,7 +454,12 @@ static ssize_t set_temp_min(struct device *dev, | |||
441 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 454 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
442 | struct i2c_client *client = to_i2c_client(dev); | 455 | struct i2c_client *client = to_i2c_client(dev); |
443 | struct adt7473_data *data = i2c_get_clientdata(client); | 456 | struct adt7473_data *data = i2c_get_clientdata(client); |
444 | int temp = simple_strtol(buf, NULL, 10) / 1000; | 457 | long temp; |
458 | |||
459 | if (strict_strtol(buf, 10, &temp)) | ||
460 | return -EINVAL; | ||
461 | |||
462 | temp = ROUND_DIV(temp, 1000); | ||
445 | temp = encode_temp(data->temp_twos_complement, temp); | 463 | temp = encode_temp(data->temp_twos_complement, temp); |
446 | 464 | ||
447 | mutex_lock(&data->lock); | 465 | mutex_lock(&data->lock); |
@@ -472,7 +490,12 @@ static ssize_t set_temp_max(struct device *dev, | |||
472 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 490 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
473 | struct i2c_client *client = to_i2c_client(dev); | 491 | struct i2c_client *client = to_i2c_client(dev); |
474 | struct adt7473_data *data = i2c_get_clientdata(client); | 492 | struct adt7473_data *data = i2c_get_clientdata(client); |
475 | int temp = simple_strtol(buf, NULL, 10) / 1000; | 493 | long temp; |
494 | |||
495 | if (strict_strtol(buf, 10, &temp)) | ||
496 | return -EINVAL; | ||
497 | |||
498 | temp = ROUND_DIV(temp, 1000); | ||
476 | temp = encode_temp(data->temp_twos_complement, temp); | 499 | temp = encode_temp(data->temp_twos_complement, temp); |
477 | 500 | ||
478 | mutex_lock(&data->lock); | 501 | mutex_lock(&data->lock); |
@@ -515,11 +538,13 @@ static ssize_t set_fan_min(struct device *dev, | |||
515 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 538 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
516 | struct i2c_client *client = to_i2c_client(dev); | 539 | struct i2c_client *client = to_i2c_client(dev); |
517 | struct adt7473_data *data = i2c_get_clientdata(client); | 540 | struct adt7473_data *data = i2c_get_clientdata(client); |
518 | int temp = simple_strtol(buf, NULL, 10); | 541 | long temp; |
519 | 542 | ||
520 | if (!temp) | 543 | if (strict_strtol(buf, 10, &temp) || !temp) |
521 | return -EINVAL; | 544 | return -EINVAL; |
545 | |||
522 | temp = FAN_RPM_TO_PERIOD(temp); | 546 | temp = FAN_RPM_TO_PERIOD(temp); |
547 | temp = SENSORS_LIMIT(temp, 1, 65534); | ||
523 | 548 | ||
524 | mutex_lock(&data->lock); | 549 | mutex_lock(&data->lock); |
525 | data->fan_min[attr->index] = temp; | 550 | data->fan_min[attr->index] = temp; |
@@ -558,7 +583,10 @@ static ssize_t set_max_duty_at_crit(struct device *dev, | |||
558 | u8 reg; | 583 | u8 reg; |
559 | struct i2c_client *client = to_i2c_client(dev); | 584 | struct i2c_client *client = to_i2c_client(dev); |
560 | struct adt7473_data *data = i2c_get_clientdata(client); | 585 | struct adt7473_data *data = i2c_get_clientdata(client); |
561 | int temp = simple_strtol(buf, NULL, 10); | 586 | long temp; |
587 | |||
588 | if (strict_strtol(buf, 10, &temp)) | ||
589 | return -EINVAL; | ||
562 | 590 | ||
563 | mutex_lock(&data->lock); | 591 | mutex_lock(&data->lock); |
564 | data->max_duty_at_overheat = !!temp; | 592 | data->max_duty_at_overheat = !!temp; |
@@ -587,7 +615,12 @@ static ssize_t set_pwm(struct device *dev, struct device_attribute *devattr, | |||
587 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 615 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
588 | struct i2c_client *client = to_i2c_client(dev); | 616 | struct i2c_client *client = to_i2c_client(dev); |
589 | struct adt7473_data *data = i2c_get_clientdata(client); | 617 | struct adt7473_data *data = i2c_get_clientdata(client); |
590 | int temp = simple_strtol(buf, NULL, 10); | 618 | long temp; |
619 | |||
620 | if (strict_strtol(buf, 10, &temp)) | ||
621 | return -EINVAL; | ||
622 | |||
623 | temp = SENSORS_LIMIT(temp, 0, 255); | ||
591 | 624 | ||
592 | mutex_lock(&data->lock); | 625 | mutex_lock(&data->lock); |
593 | data->pwm[attr->index] = temp; | 626 | data->pwm[attr->index] = temp; |
@@ -614,7 +647,12 @@ static ssize_t set_pwm_max(struct device *dev, | |||
614 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 647 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
615 | struct i2c_client *client = to_i2c_client(dev); | 648 | struct i2c_client *client = to_i2c_client(dev); |
616 | struct adt7473_data *data = i2c_get_clientdata(client); | 649 | struct adt7473_data *data = i2c_get_clientdata(client); |
617 | int temp = simple_strtol(buf, NULL, 10); | 650 | long temp; |
651 | |||
652 | if (strict_strtol(buf, 10, &temp)) | ||
653 | return -EINVAL; | ||
654 | |||
655 | temp = SENSORS_LIMIT(temp, 0, 255); | ||
618 | 656 | ||
619 | mutex_lock(&data->lock); | 657 | mutex_lock(&data->lock); |
620 | data->pwm_max[attr->index] = temp; | 658 | data->pwm_max[attr->index] = temp; |
@@ -642,7 +680,12 @@ static ssize_t set_pwm_min(struct device *dev, | |||
642 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 680 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
643 | struct i2c_client *client = to_i2c_client(dev); | 681 | struct i2c_client *client = to_i2c_client(dev); |
644 | struct adt7473_data *data = i2c_get_clientdata(client); | 682 | struct adt7473_data *data = i2c_get_clientdata(client); |
645 | int temp = simple_strtol(buf, NULL, 10); | 683 | long temp; |
684 | |||
685 | if (strict_strtol(buf, 10, &temp)) | ||
686 | return -EINVAL; | ||
687 | |||
688 | temp = SENSORS_LIMIT(temp, 0, 255); | ||
646 | 689 | ||
647 | mutex_lock(&data->lock); | 690 | mutex_lock(&data->lock); |
648 | data->pwm_min[attr->index] = temp; | 691 | data->pwm_min[attr->index] = temp; |
@@ -672,7 +715,12 @@ static ssize_t set_temp_tmax(struct device *dev, | |||
672 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 715 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
673 | struct i2c_client *client = to_i2c_client(dev); | 716 | struct i2c_client *client = to_i2c_client(dev); |
674 | struct adt7473_data *data = i2c_get_clientdata(client); | 717 | struct adt7473_data *data = i2c_get_clientdata(client); |
675 | int temp = simple_strtol(buf, NULL, 10) / 1000; | 718 | long temp; |
719 | |||
720 | if (strict_strtol(buf, 10, &temp)) | ||
721 | return -EINVAL; | ||
722 | |||
723 | temp = ROUND_DIV(temp, 1000); | ||
676 | temp = encode_temp(data->temp_twos_complement, temp); | 724 | temp = encode_temp(data->temp_twos_complement, temp); |
677 | 725 | ||
678 | mutex_lock(&data->lock); | 726 | mutex_lock(&data->lock); |
@@ -703,7 +751,12 @@ static ssize_t set_temp_tmin(struct device *dev, | |||
703 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 751 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
704 | struct i2c_client *client = to_i2c_client(dev); | 752 | struct i2c_client *client = to_i2c_client(dev); |
705 | struct adt7473_data *data = i2c_get_clientdata(client); | 753 | struct adt7473_data *data = i2c_get_clientdata(client); |
706 | int temp = simple_strtol(buf, NULL, 10) / 1000; | 754 | long temp; |
755 | |||
756 | if (strict_strtol(buf, 10, &temp)) | ||
757 | return -EINVAL; | ||
758 | |||
759 | temp = ROUND_DIV(temp, 1000); | ||
707 | temp = encode_temp(data->temp_twos_complement, temp); | 760 | temp = encode_temp(data->temp_twos_complement, temp); |
708 | 761 | ||
709 | mutex_lock(&data->lock); | 762 | mutex_lock(&data->lock); |
@@ -741,7 +794,10 @@ static ssize_t set_pwm_enable(struct device *dev, | |||
741 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 794 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
742 | struct i2c_client *client = to_i2c_client(dev); | 795 | struct i2c_client *client = to_i2c_client(dev); |
743 | struct adt7473_data *data = i2c_get_clientdata(client); | 796 | struct adt7473_data *data = i2c_get_clientdata(client); |
744 | int temp = simple_strtol(buf, NULL, 10); | 797 | long temp; |
798 | |||
799 | if (strict_strtol(buf, 10, &temp)) | ||
800 | return -EINVAL; | ||
745 | 801 | ||
746 | switch (temp) { | 802 | switch (temp) { |
747 | case 0: | 803 | case 0: |
@@ -805,7 +861,10 @@ static ssize_t set_pwm_auto_temp(struct device *dev, | |||
805 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 861 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
806 | struct i2c_client *client = to_i2c_client(dev); | 862 | struct i2c_client *client = to_i2c_client(dev); |
807 | struct adt7473_data *data = i2c_get_clientdata(client); | 863 | struct adt7473_data *data = i2c_get_clientdata(client); |
808 | int temp = simple_strtol(buf, NULL, 10); | 864 | long temp; |
865 | |||
866 | if (strict_strtol(buf, 10, &temp)) | ||
867 | return -EINVAL; | ||
809 | 868 | ||
810 | switch (temp) { | 869 | switch (temp) { |
811 | case 1: | 870 | case 1: |
diff --git a/drivers/hwmon/applesmc.c b/drivers/hwmon/applesmc.c index be3285912cb7..086c2a5cef0b 100644 --- a/drivers/hwmon/applesmc.c +++ b/drivers/hwmon/applesmc.c | |||
@@ -128,6 +128,9 @@ static const char* temperature_sensors_sets[][36] = { | |||
128 | /* Set 13: iMac 8,1 */ | 128 | /* Set 13: iMac 8,1 */ |
129 | { "TA0P", "TC0D", "TC0H", "TC0P", "TG0D", "TG0H", "TG0P", "TH0P", | 129 | { "TA0P", "TC0D", "TC0H", "TC0P", "TG0D", "TG0H", "TG0P", "TH0P", |
130 | "TL0P", "TO0P", "TW0P", "Tm0P", "Tp0P", NULL }, | 130 | "TL0P", "TO0P", "TW0P", "Tm0P", "Tp0P", NULL }, |
131 | /* Set 14: iMac 6,1 */ | ||
132 | { "TA0P", "TC0D", "TC0H", "TC0P", "TG0D", "TG0H", "TG0P", "TH0P", | ||
133 | "TO0P", "Tp0P", NULL }, | ||
131 | }; | 134 | }; |
132 | 135 | ||
133 | /* List of keys used to read/write fan speeds */ | 136 | /* List of keys used to read/write fan speeds */ |
@@ -1280,7 +1283,7 @@ static __initdata struct dmi_match_data applesmc_dmi_data[] = { | |||
1280 | { .accelerometer = 0, .light = 0, .temperature_set = 4 }, | 1283 | { .accelerometer = 0, .light = 0, .temperature_set = 4 }, |
1281 | /* iMac: temperature set 5 */ | 1284 | /* iMac: temperature set 5 */ |
1282 | { .accelerometer = 0, .light = 0, .temperature_set = 5 }, | 1285 | { .accelerometer = 0, .light = 0, .temperature_set = 5 }, |
1283 | /* MacBook3: accelerometer and temperature set 6 */ | 1286 | /* MacBook3, MacBook4: accelerometer and temperature set 6 */ |
1284 | { .accelerometer = 1, .light = 0, .temperature_set = 6 }, | 1287 | { .accelerometer = 1, .light = 0, .temperature_set = 6 }, |
1285 | /* MacBook Air: accelerometer, backlight and temperature set 7 */ | 1288 | /* MacBook Air: accelerometer, backlight and temperature set 7 */ |
1286 | { .accelerometer = 1, .light = 1, .temperature_set = 7 }, | 1289 | { .accelerometer = 1, .light = 1, .temperature_set = 7 }, |
@@ -1296,6 +1299,8 @@ static __initdata struct dmi_match_data applesmc_dmi_data[] = { | |||
1296 | { .accelerometer = 1, .light = 1, .temperature_set = 12 }, | 1299 | { .accelerometer = 1, .light = 1, .temperature_set = 12 }, |
1297 | /* iMac 8: light sensor only, temperature set 13 */ | 1300 | /* iMac 8: light sensor only, temperature set 13 */ |
1298 | { .accelerometer = 0, .light = 0, .temperature_set = 13 }, | 1301 | { .accelerometer = 0, .light = 0, .temperature_set = 13 }, |
1302 | /* iMac 6: light sensor only, temperature set 14 */ | ||
1303 | { .accelerometer = 0, .light = 0, .temperature_set = 14 }, | ||
1299 | }; | 1304 | }; |
1300 | 1305 | ||
1301 | /* Note that DMI_MATCH(...,"MacBook") will match "MacBookPro1,1". | 1306 | /* Note that DMI_MATCH(...,"MacBook") will match "MacBookPro1,1". |
@@ -1329,6 +1334,10 @@ static __initdata struct dmi_system_id applesmc_whitelist[] = { | |||
1329 | DMI_MATCH(DMI_BOARD_VENDOR,"Apple"), | 1334 | DMI_MATCH(DMI_BOARD_VENDOR,"Apple"), |
1330 | DMI_MATCH(DMI_PRODUCT_NAME,"MacBook3") }, | 1335 | DMI_MATCH(DMI_PRODUCT_NAME,"MacBook3") }, |
1331 | &applesmc_dmi_data[6]}, | 1336 | &applesmc_dmi_data[6]}, |
1337 | { applesmc_dmi_match, "Apple MacBook 4", { | ||
1338 | DMI_MATCH(DMI_BOARD_VENDOR, "Apple"), | ||
1339 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBook4") }, | ||
1340 | &applesmc_dmi_data[6]}, | ||
1332 | { applesmc_dmi_match, "Apple MacBook 5", { | 1341 | { applesmc_dmi_match, "Apple MacBook 5", { |
1333 | DMI_MATCH(DMI_BOARD_VENDOR, "Apple"), | 1342 | DMI_MATCH(DMI_BOARD_VENDOR, "Apple"), |
1334 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBook5") }, | 1343 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBook5") }, |
@@ -1345,10 +1354,18 @@ static __initdata struct dmi_system_id applesmc_whitelist[] = { | |||
1345 | DMI_MATCH(DMI_BOARD_VENDOR,"Apple"), | 1354 | DMI_MATCH(DMI_BOARD_VENDOR,"Apple"), |
1346 | DMI_MATCH(DMI_PRODUCT_NAME,"MacPro2") }, | 1355 | DMI_MATCH(DMI_PRODUCT_NAME,"MacPro2") }, |
1347 | &applesmc_dmi_data[4]}, | 1356 | &applesmc_dmi_data[4]}, |
1357 | { applesmc_dmi_match, "Apple MacPro", { | ||
1358 | DMI_MATCH(DMI_BOARD_VENDOR, "Apple"), | ||
1359 | DMI_MATCH(DMI_PRODUCT_NAME, "MacPro") }, | ||
1360 | &applesmc_dmi_data[4]}, | ||
1348 | { applesmc_dmi_match, "Apple iMac 8", { | 1361 | { applesmc_dmi_match, "Apple iMac 8", { |
1349 | DMI_MATCH(DMI_BOARD_VENDOR, "Apple"), | 1362 | DMI_MATCH(DMI_BOARD_VENDOR, "Apple"), |
1350 | DMI_MATCH(DMI_PRODUCT_NAME, "iMac8") }, | 1363 | DMI_MATCH(DMI_PRODUCT_NAME, "iMac8") }, |
1351 | &applesmc_dmi_data[13]}, | 1364 | &applesmc_dmi_data[13]}, |
1365 | { applesmc_dmi_match, "Apple iMac 6", { | ||
1366 | DMI_MATCH(DMI_BOARD_VENDOR, "Apple"), | ||
1367 | DMI_MATCH(DMI_PRODUCT_NAME, "iMac6") }, | ||
1368 | &applesmc_dmi_data[14]}, | ||
1352 | { applesmc_dmi_match, "Apple iMac 5", { | 1369 | { applesmc_dmi_match, "Apple iMac 5", { |
1353 | DMI_MATCH(DMI_BOARD_VENDOR, "Apple"), | 1370 | DMI_MATCH(DMI_BOARD_VENDOR, "Apple"), |
1354 | DMI_MATCH(DMI_PRODUCT_NAME, "iMac5") }, | 1371 | DMI_MATCH(DMI_PRODUCT_NAME, "iMac5") }, |
@@ -1547,3 +1564,4 @@ module_exit(applesmc_exit); | |||
1547 | MODULE_AUTHOR("Nicolas Boichat"); | 1564 | MODULE_AUTHOR("Nicolas Boichat"); |
1548 | MODULE_DESCRIPTION("Apple SMC"); | 1565 | MODULE_DESCRIPTION("Apple SMC"); |
1549 | MODULE_LICENSE("GPL v2"); | 1566 | MODULE_LICENSE("GPL v2"); |
1567 | MODULE_DEVICE_TABLE(dmi, applesmc_whitelist); | ||
diff --git a/drivers/hwmon/ibmaem.c b/drivers/hwmon/ibmaem.c index 7b0ed5dea399..fe74609a7feb 100644 --- a/drivers/hwmon/ibmaem.c +++ b/drivers/hwmon/ibmaem.c | |||
@@ -88,9 +88,11 @@ | |||
88 | static DEFINE_IDR(aem_idr); | 88 | static DEFINE_IDR(aem_idr); |
89 | static DEFINE_SPINLOCK(aem_idr_lock); | 89 | static DEFINE_SPINLOCK(aem_idr_lock); |
90 | 90 | ||
91 | static struct device_driver aem_driver = { | 91 | static struct platform_driver aem_driver = { |
92 | .name = DRVNAME, | 92 | .driver = { |
93 | .bus = &platform_bus_type, | 93 | .name = DRVNAME, |
94 | .bus = &platform_bus_type, | ||
95 | } | ||
94 | }; | 96 | }; |
95 | 97 | ||
96 | struct aem_ipmi_data { | 98 | struct aem_ipmi_data { |
@@ -583,7 +585,7 @@ static int aem_init_aem1_inst(struct aem_ipmi_data *probe, u8 module_handle) | |||
583 | data->pdev = platform_device_alloc(DRVNAME, data->id); | 585 | data->pdev = platform_device_alloc(DRVNAME, data->id); |
584 | if (!data->pdev) | 586 | if (!data->pdev) |
585 | goto dev_err; | 587 | goto dev_err; |
586 | data->pdev->dev.driver = &aem_driver; | 588 | data->pdev->dev.driver = &aem_driver.driver; |
587 | 589 | ||
588 | res = platform_device_add(data->pdev); | 590 | res = platform_device_add(data->pdev); |
589 | if (res) | 591 | if (res) |
@@ -716,7 +718,7 @@ static int aem_init_aem2_inst(struct aem_ipmi_data *probe, | |||
716 | data->pdev = platform_device_alloc(DRVNAME, data->id); | 718 | data->pdev = platform_device_alloc(DRVNAME, data->id); |
717 | if (!data->pdev) | 719 | if (!data->pdev) |
718 | goto dev_err; | 720 | goto dev_err; |
719 | data->pdev->dev.driver = &aem_driver; | 721 | data->pdev->dev.driver = &aem_driver.driver; |
720 | 722 | ||
721 | res = platform_device_add(data->pdev); | 723 | res = platform_device_add(data->pdev); |
722 | if (res) | 724 | if (res) |
@@ -1085,7 +1087,7 @@ static int __init aem_init(void) | |||
1085 | { | 1087 | { |
1086 | int res; | 1088 | int res; |
1087 | 1089 | ||
1088 | res = driver_register(&aem_driver); | 1090 | res = driver_register(&aem_driver.driver); |
1089 | if (res) { | 1091 | if (res) { |
1090 | printk(KERN_ERR "Can't register aem driver\n"); | 1092 | printk(KERN_ERR "Can't register aem driver\n"); |
1091 | return res; | 1093 | return res; |
@@ -1097,7 +1099,7 @@ static int __init aem_init(void) | |||
1097 | return 0; | 1099 | return 0; |
1098 | 1100 | ||
1099 | ipmi_reg_err: | 1101 | ipmi_reg_err: |
1100 | driver_unregister(&aem_driver); | 1102 | driver_unregister(&aem_driver.driver); |
1101 | return res; | 1103 | return res; |
1102 | 1104 | ||
1103 | } | 1105 | } |
@@ -1107,7 +1109,7 @@ static void __exit aem_exit(void) | |||
1107 | struct aem_data *p1, *next1; | 1109 | struct aem_data *p1, *next1; |
1108 | 1110 | ||
1109 | ipmi_smi_watcher_unregister(&driver_data.bmc_events); | 1111 | ipmi_smi_watcher_unregister(&driver_data.bmc_events); |
1110 | driver_unregister(&aem_driver); | 1112 | driver_unregister(&aem_driver.driver); |
1111 | list_for_each_entry_safe(p1, next1, &driver_data.aem_devices, list) | 1113 | list_for_each_entry_safe(p1, next1, &driver_data.aem_devices, list) |
1112 | aem_delete(p1); | 1114 | aem_delete(p1); |
1113 | } | 1115 | } |
diff --git a/drivers/hwmon/lis3lv02d.c b/drivers/hwmon/lis3lv02d.c new file mode 100644 index 000000000000..c002144c76bc --- /dev/null +++ b/drivers/hwmon/lis3lv02d.c | |||
@@ -0,0 +1,581 @@ | |||
1 | /* | ||
2 | * lis3lv02d.c - ST LIS3LV02DL accelerometer driver | ||
3 | * | ||
4 | * Copyright (C) 2007-2008 Yan Burman | ||
5 | * Copyright (C) 2008 Eric Piel | ||
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 as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
20 | */ | ||
21 | |||
22 | #include <linux/kernel.h> | ||
23 | #include <linux/init.h> | ||
24 | #include <linux/dmi.h> | ||
25 | #include <linux/module.h> | ||
26 | #include <linux/types.h> | ||
27 | #include <linux/platform_device.h> | ||
28 | #include <linux/interrupt.h> | ||
29 | #include <linux/input.h> | ||
30 | #include <linux/kthread.h> | ||
31 | #include <linux/semaphore.h> | ||
32 | #include <linux/delay.h> | ||
33 | #include <linux/wait.h> | ||
34 | #include <linux/poll.h> | ||
35 | #include <linux/freezer.h> | ||
36 | #include <linux/uaccess.h> | ||
37 | #include <acpi/acpi_drivers.h> | ||
38 | #include <asm/atomic.h> | ||
39 | #include "lis3lv02d.h" | ||
40 | |||
41 | #define DRIVER_NAME "lis3lv02d" | ||
42 | #define ACPI_MDPS_CLASS "accelerometer" | ||
43 | |||
44 | /* joystick device poll interval in milliseconds */ | ||
45 | #define MDPS_POLL_INTERVAL 50 | ||
46 | /* | ||
47 | * The sensor can also generate interrupts (DRDY) but it's pretty pointless | ||
48 | * because their are generated even if the data do not change. So it's better | ||
49 | * to keep the interrupt for the free-fall event. The values are updated at | ||
50 | * 40Hz (at the lowest frequency), but as it can be pretty time consuming on | ||
51 | * some low processor, we poll the sensor only at 20Hz... enough for the | ||
52 | * joystick. | ||
53 | */ | ||
54 | |||
55 | /* Maximum value our axis may get for the input device (signed 12 bits) */ | ||
56 | #define MDPS_MAX_VAL 2048 | ||
57 | |||
58 | struct axis_conversion { | ||
59 | s8 x; | ||
60 | s8 y; | ||
61 | s8 z; | ||
62 | }; | ||
63 | |||
64 | struct acpi_lis3lv02d { | ||
65 | struct acpi_device *device; /* The ACPI device */ | ||
66 | struct input_dev *idev; /* input device */ | ||
67 | struct task_struct *kthread; /* kthread for input */ | ||
68 | struct mutex lock; | ||
69 | struct platform_device *pdev; /* platform device */ | ||
70 | atomic_t count; /* interrupt count after last read */ | ||
71 | int xcalib; /* calibrated null value for x */ | ||
72 | int ycalib; /* calibrated null value for y */ | ||
73 | int zcalib; /* calibrated null value for z */ | ||
74 | unsigned char is_on; /* whether the device is on or off */ | ||
75 | unsigned char usage; /* usage counter */ | ||
76 | struct axis_conversion ac; /* hw -> logical axis */ | ||
77 | }; | ||
78 | |||
79 | static struct acpi_lis3lv02d adev; | ||
80 | |||
81 | static int lis3lv02d_remove_fs(void); | ||
82 | static int lis3lv02d_add_fs(struct acpi_device *device); | ||
83 | |||
84 | /* For automatic insertion of the module */ | ||
85 | static struct acpi_device_id lis3lv02d_device_ids[] = { | ||
86 | {"HPQ0004", 0}, /* HP Mobile Data Protection System PNP */ | ||
87 | {"", 0}, | ||
88 | }; | ||
89 | MODULE_DEVICE_TABLE(acpi, lis3lv02d_device_ids); | ||
90 | |||
91 | /** | ||
92 | * lis3lv02d_acpi_init - ACPI _INI method: initialize the device. | ||
93 | * @handle: the handle of the device | ||
94 | * | ||
95 | * Returns AE_OK on success. | ||
96 | */ | ||
97 | static inline acpi_status lis3lv02d_acpi_init(acpi_handle handle) | ||
98 | { | ||
99 | return acpi_evaluate_object(handle, METHOD_NAME__INI, NULL, NULL); | ||
100 | } | ||
101 | |||
102 | /** | ||
103 | * lis3lv02d_acpi_read - ACPI ALRD method: read a register | ||
104 | * @handle: the handle of the device | ||
105 | * @reg: the register to read | ||
106 | * @ret: result of the operation | ||
107 | * | ||
108 | * Returns AE_OK on success. | ||
109 | */ | ||
110 | static acpi_status lis3lv02d_acpi_read(acpi_handle handle, int reg, u8 *ret) | ||
111 | { | ||
112 | union acpi_object arg0 = { ACPI_TYPE_INTEGER }; | ||
113 | struct acpi_object_list args = { 1, &arg0 }; | ||
114 | unsigned long long lret; | ||
115 | acpi_status status; | ||
116 | |||
117 | arg0.integer.value = reg; | ||
118 | |||
119 | status = acpi_evaluate_integer(handle, "ALRD", &args, &lret); | ||
120 | *ret = lret; | ||
121 | return status; | ||
122 | } | ||
123 | |||
124 | /** | ||
125 | * lis3lv02d_acpi_write - ACPI ALWR method: write to a register | ||
126 | * @handle: the handle of the device | ||
127 | * @reg: the register to write to | ||
128 | * @val: the value to write | ||
129 | * | ||
130 | * Returns AE_OK on success. | ||
131 | */ | ||
132 | static acpi_status lis3lv02d_acpi_write(acpi_handle handle, int reg, u8 val) | ||
133 | { | ||
134 | unsigned long long ret; /* Not used when writting */ | ||
135 | union acpi_object in_obj[2]; | ||
136 | struct acpi_object_list args = { 2, in_obj }; | ||
137 | |||
138 | in_obj[0].type = ACPI_TYPE_INTEGER; | ||
139 | in_obj[0].integer.value = reg; | ||
140 | in_obj[1].type = ACPI_TYPE_INTEGER; | ||
141 | in_obj[1].integer.value = val; | ||
142 | |||
143 | return acpi_evaluate_integer(handle, "ALWR", &args, &ret); | ||
144 | } | ||
145 | |||
146 | static s16 lis3lv02d_read_16(acpi_handle handle, int reg) | ||
147 | { | ||
148 | u8 lo, hi; | ||
149 | |||
150 | lis3lv02d_acpi_read(handle, reg, &lo); | ||
151 | lis3lv02d_acpi_read(handle, reg + 1, &hi); | ||
152 | /* In "12 bit right justified" mode, bit 6, bit 7, bit 8 = bit 5 */ | ||
153 | return (s16)((hi << 8) | lo); | ||
154 | } | ||
155 | |||
156 | /** | ||
157 | * lis3lv02d_get_axis - For the given axis, give the value converted | ||
158 | * @axis: 1,2,3 - can also be negative | ||
159 | * @hw_values: raw values returned by the hardware | ||
160 | * | ||
161 | * Returns the converted value. | ||
162 | */ | ||
163 | static inline int lis3lv02d_get_axis(s8 axis, int hw_values[3]) | ||
164 | { | ||
165 | if (axis > 0) | ||
166 | return hw_values[axis - 1]; | ||
167 | else | ||
168 | return -hw_values[-axis - 1]; | ||
169 | } | ||
170 | |||
171 | /** | ||
172 | * lis3lv02d_get_xyz - Get X, Y and Z axis values from the accelerometer | ||
173 | * @handle: the handle to the device | ||
174 | * @x: where to store the X axis value | ||
175 | * @y: where to store the Y axis value | ||
176 | * @z: where to store the Z axis value | ||
177 | * | ||
178 | * Note that 40Hz input device can eat up about 10% CPU at 800MHZ | ||
179 | */ | ||
180 | static void lis3lv02d_get_xyz(acpi_handle handle, int *x, int *y, int *z) | ||
181 | { | ||
182 | int position[3]; | ||
183 | |||
184 | position[0] = lis3lv02d_read_16(handle, OUTX_L); | ||
185 | position[1] = lis3lv02d_read_16(handle, OUTY_L); | ||
186 | position[2] = lis3lv02d_read_16(handle, OUTZ_L); | ||
187 | |||
188 | *x = lis3lv02d_get_axis(adev.ac.x, position); | ||
189 | *y = lis3lv02d_get_axis(adev.ac.y, position); | ||
190 | *z = lis3lv02d_get_axis(adev.ac.z, position); | ||
191 | } | ||
192 | |||
193 | static inline void lis3lv02d_poweroff(acpi_handle handle) | ||
194 | { | ||
195 | adev.is_on = 0; | ||
196 | /* disable X,Y,Z axis and power down */ | ||
197 | lis3lv02d_acpi_write(handle, CTRL_REG1, 0x00); | ||
198 | } | ||
199 | |||
200 | static void lis3lv02d_poweron(acpi_handle handle) | ||
201 | { | ||
202 | u8 val; | ||
203 | |||
204 | adev.is_on = 1; | ||
205 | lis3lv02d_acpi_init(handle); | ||
206 | lis3lv02d_acpi_write(handle, FF_WU_CFG, 0); | ||
207 | /* | ||
208 | * BDU: LSB and MSB values are not updated until both have been read. | ||
209 | * So the value read will always be correct. | ||
210 | * IEN: Interrupt for free-fall and DD, not for data-ready. | ||
211 | */ | ||
212 | lis3lv02d_acpi_read(handle, CTRL_REG2, &val); | ||
213 | val |= CTRL2_BDU | CTRL2_IEN; | ||
214 | lis3lv02d_acpi_write(handle, CTRL_REG2, val); | ||
215 | } | ||
216 | |||
217 | #ifdef CONFIG_PM | ||
218 | static int lis3lv02d_suspend(struct acpi_device *device, pm_message_t state) | ||
219 | { | ||
220 | /* make sure the device is off when we suspend */ | ||
221 | lis3lv02d_poweroff(device->handle); | ||
222 | return 0; | ||
223 | } | ||
224 | |||
225 | static int lis3lv02d_resume(struct acpi_device *device) | ||
226 | { | ||
227 | /* put back the device in the right state (ACPI might turn it on) */ | ||
228 | mutex_lock(&adev.lock); | ||
229 | if (adev.usage > 0) | ||
230 | lis3lv02d_poweron(device->handle); | ||
231 | else | ||
232 | lis3lv02d_poweroff(device->handle); | ||
233 | mutex_unlock(&adev.lock); | ||
234 | return 0; | ||
235 | } | ||
236 | #else | ||
237 | #define lis3lv02d_suspend NULL | ||
238 | #define lis3lv02d_resume NULL | ||
239 | #endif | ||
240 | |||
241 | |||
242 | /* | ||
243 | * To be called before starting to use the device. It makes sure that the | ||
244 | * device will always be on until a call to lis3lv02d_decrease_use(). Not to be | ||
245 | * used from interrupt context. | ||
246 | */ | ||
247 | static void lis3lv02d_increase_use(struct acpi_lis3lv02d *dev) | ||
248 | { | ||
249 | mutex_lock(&dev->lock); | ||
250 | dev->usage++; | ||
251 | if (dev->usage == 1) { | ||
252 | if (!dev->is_on) | ||
253 | lis3lv02d_poweron(dev->device->handle); | ||
254 | } | ||
255 | mutex_unlock(&dev->lock); | ||
256 | } | ||
257 | |||
258 | /* | ||
259 | * To be called whenever a usage of the device is stopped. | ||
260 | * It will make sure to turn off the device when there is not usage. | ||
261 | */ | ||
262 | static void lis3lv02d_decrease_use(struct acpi_lis3lv02d *dev) | ||
263 | { | ||
264 | mutex_lock(&dev->lock); | ||
265 | dev->usage--; | ||
266 | if (dev->usage == 0) | ||
267 | lis3lv02d_poweroff(dev->device->handle); | ||
268 | mutex_unlock(&dev->lock); | ||
269 | } | ||
270 | |||
271 | /** | ||
272 | * lis3lv02d_joystick_kthread - Kthread polling function | ||
273 | * @data: unused - here to conform to threadfn prototype | ||
274 | */ | ||
275 | static int lis3lv02d_joystick_kthread(void *data) | ||
276 | { | ||
277 | int x, y, z; | ||
278 | |||
279 | while (!kthread_should_stop()) { | ||
280 | lis3lv02d_get_xyz(adev.device->handle, &x, &y, &z); | ||
281 | input_report_abs(adev.idev, ABS_X, x - adev.xcalib); | ||
282 | input_report_abs(adev.idev, ABS_Y, y - adev.ycalib); | ||
283 | input_report_abs(adev.idev, ABS_Z, z - adev.zcalib); | ||
284 | |||
285 | input_sync(adev.idev); | ||
286 | |||
287 | try_to_freeze(); | ||
288 | msleep_interruptible(MDPS_POLL_INTERVAL); | ||
289 | } | ||
290 | |||
291 | return 0; | ||
292 | } | ||
293 | |||
294 | static int lis3lv02d_joystick_open(struct input_dev *input) | ||
295 | { | ||
296 | lis3lv02d_increase_use(&adev); | ||
297 | adev.kthread = kthread_run(lis3lv02d_joystick_kthread, NULL, "klis3lv02d"); | ||
298 | if (IS_ERR(adev.kthread)) { | ||
299 | lis3lv02d_decrease_use(&adev); | ||
300 | return PTR_ERR(adev.kthread); | ||
301 | } | ||
302 | |||
303 | return 0; | ||
304 | } | ||
305 | |||
306 | static void lis3lv02d_joystick_close(struct input_dev *input) | ||
307 | { | ||
308 | kthread_stop(adev.kthread); | ||
309 | lis3lv02d_decrease_use(&adev); | ||
310 | } | ||
311 | |||
312 | |||
313 | static inline void lis3lv02d_calibrate_joystick(void) | ||
314 | { | ||
315 | lis3lv02d_get_xyz(adev.device->handle, &adev.xcalib, &adev.ycalib, &adev.zcalib); | ||
316 | } | ||
317 | |||
318 | static int lis3lv02d_joystick_enable(void) | ||
319 | { | ||
320 | int err; | ||
321 | |||
322 | if (adev.idev) | ||
323 | return -EINVAL; | ||
324 | |||
325 | adev.idev = input_allocate_device(); | ||
326 | if (!adev.idev) | ||
327 | return -ENOMEM; | ||
328 | |||
329 | lis3lv02d_calibrate_joystick(); | ||
330 | |||
331 | adev.idev->name = "ST LIS3LV02DL Accelerometer"; | ||
332 | adev.idev->phys = DRIVER_NAME "/input0"; | ||
333 | adev.idev->id.bustype = BUS_HOST; | ||
334 | adev.idev->id.vendor = 0; | ||
335 | adev.idev->dev.parent = &adev.pdev->dev; | ||
336 | adev.idev->open = lis3lv02d_joystick_open; | ||
337 | adev.idev->close = lis3lv02d_joystick_close; | ||
338 | |||
339 | set_bit(EV_ABS, adev.idev->evbit); | ||
340 | input_set_abs_params(adev.idev, ABS_X, -MDPS_MAX_VAL, MDPS_MAX_VAL, 3, 3); | ||
341 | input_set_abs_params(adev.idev, ABS_Y, -MDPS_MAX_VAL, MDPS_MAX_VAL, 3, 3); | ||
342 | input_set_abs_params(adev.idev, ABS_Z, -MDPS_MAX_VAL, MDPS_MAX_VAL, 3, 3); | ||
343 | |||
344 | err = input_register_device(adev.idev); | ||
345 | if (err) { | ||
346 | input_free_device(adev.idev); | ||
347 | adev.idev = NULL; | ||
348 | } | ||
349 | |||
350 | return err; | ||
351 | } | ||
352 | |||
353 | static void lis3lv02d_joystick_disable(void) | ||
354 | { | ||
355 | if (!adev.idev) | ||
356 | return; | ||
357 | |||
358 | input_unregister_device(adev.idev); | ||
359 | adev.idev = NULL; | ||
360 | } | ||
361 | |||
362 | |||
363 | /* | ||
364 | * Initialise the accelerometer and the various subsystems. | ||
365 | * Should be rather independant of the bus system. | ||
366 | */ | ||
367 | static int lis3lv02d_init_device(struct acpi_lis3lv02d *dev) | ||
368 | { | ||
369 | mutex_init(&dev->lock); | ||
370 | lis3lv02d_add_fs(dev->device); | ||
371 | lis3lv02d_increase_use(dev); | ||
372 | |||
373 | if (lis3lv02d_joystick_enable()) | ||
374 | printk(KERN_ERR DRIVER_NAME ": joystick initialization failed\n"); | ||
375 | |||
376 | lis3lv02d_decrease_use(dev); | ||
377 | return 0; | ||
378 | } | ||
379 | |||
380 | static int lis3lv02d_dmi_matched(const struct dmi_system_id *dmi) | ||
381 | { | ||
382 | adev.ac = *((struct axis_conversion *)dmi->driver_data); | ||
383 | printk(KERN_INFO DRIVER_NAME ": hardware type %s found.\n", dmi->ident); | ||
384 | |||
385 | return 1; | ||
386 | } | ||
387 | |||
388 | /* Represents, for each axis seen by userspace, the corresponding hw axis (+1). | ||
389 | * If the value is negative, the opposite of the hw value is used. */ | ||
390 | static struct axis_conversion lis3lv02d_axis_normal = {1, 2, 3}; | ||
391 | static struct axis_conversion lis3lv02d_axis_y_inverted = {1, -2, 3}; | ||
392 | static struct axis_conversion lis3lv02d_axis_x_inverted = {-1, 2, 3}; | ||
393 | static struct axis_conversion lis3lv02d_axis_z_inverted = {1, 2, -3}; | ||
394 | static struct axis_conversion lis3lv02d_axis_xy_rotated_left = {-2, 1, 3}; | ||
395 | static struct axis_conversion lis3lv02d_axis_xy_swap_inverted = {-2, -1, 3}; | ||
396 | |||
397 | #define AXIS_DMI_MATCH(_ident, _name, _axis) { \ | ||
398 | .ident = _ident, \ | ||
399 | .callback = lis3lv02d_dmi_matched, \ | ||
400 | .matches = { \ | ||
401 | DMI_MATCH(DMI_PRODUCT_NAME, _name) \ | ||
402 | }, \ | ||
403 | .driver_data = &lis3lv02d_axis_##_axis \ | ||
404 | } | ||
405 | static struct dmi_system_id lis3lv02d_dmi_ids[] = { | ||
406 | /* product names are truncated to match all kinds of a same model */ | ||
407 | AXIS_DMI_MATCH("NC64x0", "HP Compaq nc64", x_inverted), | ||
408 | AXIS_DMI_MATCH("NC84x0", "HP Compaq nc84", z_inverted), | ||
409 | AXIS_DMI_MATCH("NX9420", "HP Compaq nx9420", x_inverted), | ||
410 | AXIS_DMI_MATCH("NW9440", "HP Compaq nw9440", x_inverted), | ||
411 | AXIS_DMI_MATCH("NC2510", "HP Compaq 2510", y_inverted), | ||
412 | AXIS_DMI_MATCH("NC8510", "HP Compaq 8510", xy_swap_inverted), | ||
413 | AXIS_DMI_MATCH("HP2133", "HP 2133", xy_rotated_left), | ||
414 | { NULL, } | ||
415 | /* Laptop models without axis info (yet): | ||
416 | * "NC651xx" "HP Compaq 651" | ||
417 | * "NC671xx" "HP Compaq 671" | ||
418 | * "NC6910" "HP Compaq 6910" | ||
419 | * HP Compaq 8710x Notebook PC / Mobile Workstation | ||
420 | * "NC2400" "HP Compaq nc2400" | ||
421 | * "NX74x0" "HP Compaq nx74" | ||
422 | * "NX6325" "HP Compaq nx6325" | ||
423 | * "NC4400" "HP Compaq nc4400" | ||
424 | */ | ||
425 | }; | ||
426 | |||
427 | static int lis3lv02d_add(struct acpi_device *device) | ||
428 | { | ||
429 | u8 val; | ||
430 | |||
431 | if (!device) | ||
432 | return -EINVAL; | ||
433 | |||
434 | adev.device = device; | ||
435 | strcpy(acpi_device_name(device), DRIVER_NAME); | ||
436 | strcpy(acpi_device_class(device), ACPI_MDPS_CLASS); | ||
437 | device->driver_data = &adev; | ||
438 | |||
439 | lis3lv02d_acpi_read(device->handle, WHO_AM_I, &val); | ||
440 | if ((val != LIS3LV02DL_ID) && (val != LIS302DL_ID)) { | ||
441 | printk(KERN_ERR DRIVER_NAME | ||
442 | ": Accelerometer chip not LIS3LV02D{L,Q}\n"); | ||
443 | } | ||
444 | |||
445 | /* If possible use a "standard" axes order */ | ||
446 | if (dmi_check_system(lis3lv02d_dmi_ids) == 0) { | ||
447 | printk(KERN_INFO DRIVER_NAME ": laptop model unknown, " | ||
448 | "using default axes configuration\n"); | ||
449 | adev.ac = lis3lv02d_axis_normal; | ||
450 | } | ||
451 | |||
452 | return lis3lv02d_init_device(&adev); | ||
453 | } | ||
454 | |||
455 | static int lis3lv02d_remove(struct acpi_device *device, int type) | ||
456 | { | ||
457 | if (!device) | ||
458 | return -EINVAL; | ||
459 | |||
460 | lis3lv02d_joystick_disable(); | ||
461 | lis3lv02d_poweroff(device->handle); | ||
462 | |||
463 | return lis3lv02d_remove_fs(); | ||
464 | } | ||
465 | |||
466 | |||
467 | /* Sysfs stuff */ | ||
468 | static ssize_t lis3lv02d_position_show(struct device *dev, | ||
469 | struct device_attribute *attr, char *buf) | ||
470 | { | ||
471 | int x, y, z; | ||
472 | |||
473 | lis3lv02d_increase_use(&adev); | ||
474 | lis3lv02d_get_xyz(adev.device->handle, &x, &y, &z); | ||
475 | lis3lv02d_decrease_use(&adev); | ||
476 | return sprintf(buf, "(%d,%d,%d)\n", x, y, z); | ||
477 | } | ||
478 | |||
479 | static ssize_t lis3lv02d_calibrate_show(struct device *dev, | ||
480 | struct device_attribute *attr, char *buf) | ||
481 | { | ||
482 | return sprintf(buf, "(%d,%d,%d)\n", adev.xcalib, adev.ycalib, adev.zcalib); | ||
483 | } | ||
484 | |||
485 | static ssize_t lis3lv02d_calibrate_store(struct device *dev, | ||
486 | struct device_attribute *attr, | ||
487 | const char *buf, size_t count) | ||
488 | { | ||
489 | lis3lv02d_increase_use(&adev); | ||
490 | lis3lv02d_calibrate_joystick(); | ||
491 | lis3lv02d_decrease_use(&adev); | ||
492 | return count; | ||
493 | } | ||
494 | |||
495 | /* conversion btw sampling rate and the register values */ | ||
496 | static int lis3lv02dl_df_val[4] = {40, 160, 640, 2560}; | ||
497 | static ssize_t lis3lv02d_rate_show(struct device *dev, | ||
498 | struct device_attribute *attr, char *buf) | ||
499 | { | ||
500 | u8 ctrl; | ||
501 | int val; | ||
502 | |||
503 | lis3lv02d_increase_use(&adev); | ||
504 | lis3lv02d_acpi_read(adev.device->handle, CTRL_REG1, &ctrl); | ||
505 | lis3lv02d_decrease_use(&adev); | ||
506 | val = (ctrl & (CTRL1_DF0 | CTRL1_DF1)) >> 4; | ||
507 | return sprintf(buf, "%d\n", lis3lv02dl_df_val[val]); | ||
508 | } | ||
509 | |||
510 | static DEVICE_ATTR(position, S_IRUGO, lis3lv02d_position_show, NULL); | ||
511 | static DEVICE_ATTR(calibrate, S_IRUGO|S_IWUSR, lis3lv02d_calibrate_show, | ||
512 | lis3lv02d_calibrate_store); | ||
513 | static DEVICE_ATTR(rate, S_IRUGO, lis3lv02d_rate_show, NULL); | ||
514 | |||
515 | static struct attribute *lis3lv02d_attributes[] = { | ||
516 | &dev_attr_position.attr, | ||
517 | &dev_attr_calibrate.attr, | ||
518 | &dev_attr_rate.attr, | ||
519 | NULL | ||
520 | }; | ||
521 | |||
522 | static struct attribute_group lis3lv02d_attribute_group = { | ||
523 | .attrs = lis3lv02d_attributes | ||
524 | }; | ||
525 | |||
526 | static int lis3lv02d_add_fs(struct acpi_device *device) | ||
527 | { | ||
528 | adev.pdev = platform_device_register_simple(DRIVER_NAME, -1, NULL, 0); | ||
529 | if (IS_ERR(adev.pdev)) | ||
530 | return PTR_ERR(adev.pdev); | ||
531 | |||
532 | return sysfs_create_group(&adev.pdev->dev.kobj, &lis3lv02d_attribute_group); | ||
533 | } | ||
534 | |||
535 | static int lis3lv02d_remove_fs(void) | ||
536 | { | ||
537 | sysfs_remove_group(&adev.pdev->dev.kobj, &lis3lv02d_attribute_group); | ||
538 | platform_device_unregister(adev.pdev); | ||
539 | return 0; | ||
540 | } | ||
541 | |||
542 | /* For the HP MDPS aka 3D Driveguard */ | ||
543 | static struct acpi_driver lis3lv02d_driver = { | ||
544 | .name = DRIVER_NAME, | ||
545 | .class = ACPI_MDPS_CLASS, | ||
546 | .ids = lis3lv02d_device_ids, | ||
547 | .ops = { | ||
548 | .add = lis3lv02d_add, | ||
549 | .remove = lis3lv02d_remove, | ||
550 | .suspend = lis3lv02d_suspend, | ||
551 | .resume = lis3lv02d_resume, | ||
552 | } | ||
553 | }; | ||
554 | |||
555 | static int __init lis3lv02d_init_module(void) | ||
556 | { | ||
557 | int ret; | ||
558 | |||
559 | if (acpi_disabled) | ||
560 | return -ENODEV; | ||
561 | |||
562 | ret = acpi_bus_register_driver(&lis3lv02d_driver); | ||
563 | if (ret < 0) | ||
564 | return ret; | ||
565 | |||
566 | printk(KERN_INFO DRIVER_NAME " driver loaded.\n"); | ||
567 | |||
568 | return 0; | ||
569 | } | ||
570 | |||
571 | static void __exit lis3lv02d_exit_module(void) | ||
572 | { | ||
573 | acpi_bus_unregister_driver(&lis3lv02d_driver); | ||
574 | } | ||
575 | |||
576 | MODULE_DESCRIPTION("ST LIS3LV02Dx three-axis digital accelerometer driver"); | ||
577 | MODULE_AUTHOR("Yan Burman and Eric Piel"); | ||
578 | MODULE_LICENSE("GPL"); | ||
579 | |||
580 | module_init(lis3lv02d_init_module); | ||
581 | module_exit(lis3lv02d_exit_module); | ||
diff --git a/drivers/hwmon/lis3lv02d.h b/drivers/hwmon/lis3lv02d.h new file mode 100644 index 000000000000..330cfc60e948 --- /dev/null +++ b/drivers/hwmon/lis3lv02d.h | |||
@@ -0,0 +1,149 @@ | |||
1 | /* | ||
2 | * lis3lv02d.h - ST LIS3LV02DL accelerometer driver | ||
3 | * | ||
4 | * Copyright (C) 2007-2008 Yan Burman | ||
5 | * Copyright (C) 2008 Eric Piel | ||
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 as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
20 | */ | ||
21 | |||
22 | /* | ||
23 | * The actual chip is STMicroelectronics LIS3LV02DL or LIS3LV02DQ that seems to | ||
24 | * be connected via SPI. There exists also several similar chips (such as LIS302DL or | ||
25 | * LIS3L02DQ) but not in the HP laptops and they have slightly different registers. | ||
26 | * They can also be connected via I²C. | ||
27 | */ | ||
28 | |||
29 | #define LIS3LV02DL_ID 0x3A /* Also the LIS3LV02DQ */ | ||
30 | #define LIS302DL_ID 0x3B /* Also the LIS202DL! */ | ||
31 | |||
32 | enum lis3lv02d_reg { | ||
33 | WHO_AM_I = 0x0F, | ||
34 | OFFSET_X = 0x16, | ||
35 | OFFSET_Y = 0x17, | ||
36 | OFFSET_Z = 0x18, | ||
37 | GAIN_X = 0x19, | ||
38 | GAIN_Y = 0x1A, | ||
39 | GAIN_Z = 0x1B, | ||
40 | CTRL_REG1 = 0x20, | ||
41 | CTRL_REG2 = 0x21, | ||
42 | CTRL_REG3 = 0x22, | ||
43 | HP_FILTER_RESET = 0x23, | ||
44 | STATUS_REG = 0x27, | ||
45 | OUTX_L = 0x28, | ||
46 | OUTX_H = 0x29, | ||
47 | OUTY_L = 0x2A, | ||
48 | OUTY_H = 0x2B, | ||
49 | OUTZ_L = 0x2C, | ||
50 | OUTZ_H = 0x2D, | ||
51 | FF_WU_CFG = 0x30, | ||
52 | FF_WU_SRC = 0x31, | ||
53 | FF_WU_ACK = 0x32, | ||
54 | FF_WU_THS_L = 0x34, | ||
55 | FF_WU_THS_H = 0x35, | ||
56 | FF_WU_DURATION = 0x36, | ||
57 | DD_CFG = 0x38, | ||
58 | DD_SRC = 0x39, | ||
59 | DD_ACK = 0x3A, | ||
60 | DD_THSI_L = 0x3C, | ||
61 | DD_THSI_H = 0x3D, | ||
62 | DD_THSE_L = 0x3E, | ||
63 | DD_THSE_H = 0x3F, | ||
64 | }; | ||
65 | |||
66 | enum lis3lv02d_ctrl1 { | ||
67 | CTRL1_Xen = 0x01, | ||
68 | CTRL1_Yen = 0x02, | ||
69 | CTRL1_Zen = 0x04, | ||
70 | CTRL1_ST = 0x08, | ||
71 | CTRL1_DF0 = 0x10, | ||
72 | CTRL1_DF1 = 0x20, | ||
73 | CTRL1_PD0 = 0x40, | ||
74 | CTRL1_PD1 = 0x80, | ||
75 | }; | ||
76 | enum lis3lv02d_ctrl2 { | ||
77 | CTRL2_DAS = 0x01, | ||
78 | CTRL2_SIM = 0x02, | ||
79 | CTRL2_DRDY = 0x04, | ||
80 | CTRL2_IEN = 0x08, | ||
81 | CTRL2_BOOT = 0x10, | ||
82 | CTRL2_BLE = 0x20, | ||
83 | CTRL2_BDU = 0x40, /* Block Data Update */ | ||
84 | CTRL2_FS = 0x80, /* Full Scale selection */ | ||
85 | }; | ||
86 | |||
87 | |||
88 | enum lis3lv02d_ctrl3 { | ||
89 | CTRL3_CFS0 = 0x01, | ||
90 | CTRL3_CFS1 = 0x02, | ||
91 | CTRL3_FDS = 0x10, | ||
92 | CTRL3_HPFF = 0x20, | ||
93 | CTRL3_HPDD = 0x40, | ||
94 | CTRL3_ECK = 0x80, | ||
95 | }; | ||
96 | |||
97 | enum lis3lv02d_status_reg { | ||
98 | STATUS_XDA = 0x01, | ||
99 | STATUS_YDA = 0x02, | ||
100 | STATUS_ZDA = 0x04, | ||
101 | STATUS_XYZDA = 0x08, | ||
102 | STATUS_XOR = 0x10, | ||
103 | STATUS_YOR = 0x20, | ||
104 | STATUS_ZOR = 0x40, | ||
105 | STATUS_XYZOR = 0x80, | ||
106 | }; | ||
107 | |||
108 | enum lis3lv02d_ff_wu_cfg { | ||
109 | FF_WU_CFG_XLIE = 0x01, | ||
110 | FF_WU_CFG_XHIE = 0x02, | ||
111 | FF_WU_CFG_YLIE = 0x04, | ||
112 | FF_WU_CFG_YHIE = 0x08, | ||
113 | FF_WU_CFG_ZLIE = 0x10, | ||
114 | FF_WU_CFG_ZHIE = 0x20, | ||
115 | FF_WU_CFG_LIR = 0x40, | ||
116 | FF_WU_CFG_AOI = 0x80, | ||
117 | }; | ||
118 | |||
119 | enum lis3lv02d_ff_wu_src { | ||
120 | FF_WU_SRC_XL = 0x01, | ||
121 | FF_WU_SRC_XH = 0x02, | ||
122 | FF_WU_SRC_YL = 0x04, | ||
123 | FF_WU_SRC_YH = 0x08, | ||
124 | FF_WU_SRC_ZL = 0x10, | ||
125 | FF_WU_SRC_ZH = 0x20, | ||
126 | FF_WU_SRC_IA = 0x40, | ||
127 | }; | ||
128 | |||
129 | enum lis3lv02d_dd_cfg { | ||
130 | DD_CFG_XLIE = 0x01, | ||
131 | DD_CFG_XHIE = 0x02, | ||
132 | DD_CFG_YLIE = 0x04, | ||
133 | DD_CFG_YHIE = 0x08, | ||
134 | DD_CFG_ZLIE = 0x10, | ||
135 | DD_CFG_ZHIE = 0x20, | ||
136 | DD_CFG_LIR = 0x40, | ||
137 | DD_CFG_IEND = 0x80, | ||
138 | }; | ||
139 | |||
140 | enum lis3lv02d_dd_src { | ||
141 | DD_SRC_XL = 0x01, | ||
142 | DD_SRC_XH = 0x02, | ||
143 | DD_SRC_YL = 0x04, | ||
144 | DD_SRC_YH = 0x08, | ||
145 | DD_SRC_ZL = 0x10, | ||
146 | DD_SRC_ZH = 0x20, | ||
147 | DD_SRC_IA = 0x40, | ||
148 | }; | ||
149 | |||
diff --git a/drivers/hwmon/lm85.c b/drivers/hwmon/lm85.c index 3ff0285396fa..cfc1ee90f5a3 100644 --- a/drivers/hwmon/lm85.c +++ b/drivers/hwmon/lm85.c | |||
@@ -39,7 +39,8 @@ | |||
39 | static const unsigned short normal_i2c[] = { 0x2c, 0x2d, 0x2e, I2C_CLIENT_END }; | 39 | static const unsigned short normal_i2c[] = { 0x2c, 0x2d, 0x2e, I2C_CLIENT_END }; |
40 | 40 | ||
41 | /* Insmod parameters */ | 41 | /* Insmod parameters */ |
42 | I2C_CLIENT_INSMOD_6(lm85b, lm85c, adm1027, adt7463, emc6d100, emc6d102); | 42 | I2C_CLIENT_INSMOD_7(lm85b, lm85c, adm1027, adt7463, adt7468, emc6d100, |
43 | emc6d102); | ||
43 | 44 | ||
44 | /* The LM85 registers */ | 45 | /* The LM85 registers */ |
45 | 46 | ||
@@ -59,6 +60,12 @@ I2C_CLIENT_INSMOD_6(lm85b, lm85c, adm1027, adt7463, emc6d100, emc6d102); | |||
59 | 60 | ||
60 | #define LM85_REG_COMPANY 0x3e | 61 | #define LM85_REG_COMPANY 0x3e |
61 | #define LM85_REG_VERSTEP 0x3f | 62 | #define LM85_REG_VERSTEP 0x3f |
63 | |||
64 | #define ADT7468_REG_CFG5 0x7c | ||
65 | #define ADT7468_OFF64 0x01 | ||
66 | #define IS_ADT7468_OFF64(data) \ | ||
67 | ((data)->type == adt7468 && !((data)->cfg5 & ADT7468_OFF64)) | ||
68 | |||
62 | /* These are the recognized values for the above regs */ | 69 | /* These are the recognized values for the above regs */ |
63 | #define LM85_COMPANY_NATIONAL 0x01 | 70 | #define LM85_COMPANY_NATIONAL 0x01 |
64 | #define LM85_COMPANY_ANALOG_DEV 0x41 | 71 | #define LM85_COMPANY_ANALOG_DEV 0x41 |
@@ -70,6 +77,8 @@ I2C_CLIENT_INSMOD_6(lm85b, lm85c, adm1027, adt7463, emc6d100, emc6d102); | |||
70 | #define LM85_VERSTEP_ADM1027 0x60 | 77 | #define LM85_VERSTEP_ADM1027 0x60 |
71 | #define LM85_VERSTEP_ADT7463 0x62 | 78 | #define LM85_VERSTEP_ADT7463 0x62 |
72 | #define LM85_VERSTEP_ADT7463C 0x6A | 79 | #define LM85_VERSTEP_ADT7463C 0x6A |
80 | #define LM85_VERSTEP_ADT7468_1 0x71 | ||
81 | #define LM85_VERSTEP_ADT7468_2 0x72 | ||
73 | #define LM85_VERSTEP_EMC6D100_A0 0x60 | 82 | #define LM85_VERSTEP_EMC6D100_A0 0x60 |
74 | #define LM85_VERSTEP_EMC6D100_A1 0x61 | 83 | #define LM85_VERSTEP_EMC6D100_A1 0x61 |
75 | #define LM85_VERSTEP_EMC6D102 0x65 | 84 | #define LM85_VERSTEP_EMC6D102 0x65 |
@@ -306,6 +315,7 @@ struct lm85_data { | |||
306 | u8 vid; /* Register value */ | 315 | u8 vid; /* Register value */ |
307 | u8 vrm; /* VRM version */ | 316 | u8 vrm; /* VRM version */ |
308 | u32 alarms; /* Register encoding, combined */ | 317 | u32 alarms; /* Register encoding, combined */ |
318 | u8 cfg5; /* Config Register 5 on ADT7468 */ | ||
309 | struct lm85_autofan autofan[3]; | 319 | struct lm85_autofan autofan[3]; |
310 | struct lm85_zone zone[3]; | 320 | struct lm85_zone zone[3]; |
311 | }; | 321 | }; |
@@ -685,6 +695,9 @@ static ssize_t set_temp_min(struct device *dev, struct device_attribute *attr, | |||
685 | struct lm85_data *data = i2c_get_clientdata(client); | 695 | struct lm85_data *data = i2c_get_clientdata(client); |
686 | long val = simple_strtol(buf, NULL, 10); | 696 | long val = simple_strtol(buf, NULL, 10); |
687 | 697 | ||
698 | if (IS_ADT7468_OFF64(data)) | ||
699 | val += 64; | ||
700 | |||
688 | mutex_lock(&data->update_lock); | 701 | mutex_lock(&data->update_lock); |
689 | data->temp_min[nr] = TEMP_TO_REG(val); | 702 | data->temp_min[nr] = TEMP_TO_REG(val); |
690 | lm85_write_value(client, LM85_REG_TEMP_MIN(nr), data->temp_min[nr]); | 703 | lm85_write_value(client, LM85_REG_TEMP_MIN(nr), data->temp_min[nr]); |
@@ -708,6 +721,9 @@ static ssize_t set_temp_max(struct device *dev, struct device_attribute *attr, | |||
708 | struct lm85_data *data = i2c_get_clientdata(client); | 721 | struct lm85_data *data = i2c_get_clientdata(client); |
709 | long val = simple_strtol(buf, NULL, 10); | 722 | long val = simple_strtol(buf, NULL, 10); |
710 | 723 | ||
724 | if (IS_ADT7468_OFF64(data)) | ||
725 | val += 64; | ||
726 | |||
711 | mutex_lock(&data->update_lock); | 727 | mutex_lock(&data->update_lock); |
712 | data->temp_max[nr] = TEMP_TO_REG(val); | 728 | data->temp_max[nr] = TEMP_TO_REG(val); |
713 | lm85_write_value(client, LM85_REG_TEMP_MAX(nr), data->temp_max[nr]); | 729 | lm85_write_value(client, LM85_REG_TEMP_MAX(nr), data->temp_max[nr]); |
@@ -1163,6 +1179,10 @@ static int lm85_detect(struct i2c_client *client, int kind, | |||
1163 | case LM85_VERSTEP_ADT7463C: | 1179 | case LM85_VERSTEP_ADT7463C: |
1164 | kind = adt7463; | 1180 | kind = adt7463; |
1165 | break; | 1181 | break; |
1182 | case LM85_VERSTEP_ADT7468_1: | ||
1183 | case LM85_VERSTEP_ADT7468_2: | ||
1184 | kind = adt7468; | ||
1185 | break; | ||
1166 | } | 1186 | } |
1167 | } else if (company == LM85_COMPANY_SMSC) { | 1187 | } else if (company == LM85_COMPANY_SMSC) { |
1168 | switch (verstep) { | 1188 | switch (verstep) { |
@@ -1195,6 +1215,9 @@ static int lm85_detect(struct i2c_client *client, int kind, | |||
1195 | case adt7463: | 1215 | case adt7463: |
1196 | type_name = "adt7463"; | 1216 | type_name = "adt7463"; |
1197 | break; | 1217 | break; |
1218 | case adt7468: | ||
1219 | type_name = "adt7468"; | ||
1220 | break; | ||
1198 | case emc6d100: | 1221 | case emc6d100: |
1199 | type_name = "emc6d100"; | 1222 | type_name = "emc6d100"; |
1200 | break; | 1223 | break; |
@@ -1246,10 +1269,11 @@ static int lm85_probe(struct i2c_client *client, | |||
1246 | if (err) | 1269 | if (err) |
1247 | goto err_kfree; | 1270 | goto err_kfree; |
1248 | 1271 | ||
1249 | /* The ADT7463 has an optional VRM 10 mode where pin 21 is used | 1272 | /* The ADT7463/68 have an optional VRM 10 mode where pin 21 is used |
1250 | as a sixth digital VID input rather than an analog input. */ | 1273 | as a sixth digital VID input rather than an analog input. */ |
1251 | data->vid = lm85_read_value(client, LM85_REG_VID); | 1274 | data->vid = lm85_read_value(client, LM85_REG_VID); |
1252 | if (!(data->type == adt7463 && (data->vid & 0x80))) | 1275 | if (!((data->type == adt7463 || data->type == adt7468) && |
1276 | (data->vid & 0x80))) | ||
1253 | if ((err = sysfs_create_group(&client->dev.kobj, | 1277 | if ((err = sysfs_create_group(&client->dev.kobj, |
1254 | &lm85_group_in4))) | 1278 | &lm85_group_in4))) |
1255 | goto err_remove_files; | 1279 | goto err_remove_files; |
@@ -1357,7 +1381,8 @@ static struct lm85_data *lm85_update_device(struct device *dev) | |||
1357 | * There are 2 additional resolution bits per channel and we | 1381 | * There are 2 additional resolution bits per channel and we |
1358 | * have room for 4, so we shift them to the left. | 1382 | * have room for 4, so we shift them to the left. |
1359 | */ | 1383 | */ |
1360 | if (data->type == adm1027 || data->type == adt7463) { | 1384 | if (data->type == adm1027 || data->type == adt7463 || |
1385 | data->type == adt7468) { | ||
1361 | int ext1 = lm85_read_value(client, | 1386 | int ext1 = lm85_read_value(client, |
1362 | ADM1027_REG_EXTEND_ADC1); | 1387 | ADM1027_REG_EXTEND_ADC1); |
1363 | int ext2 = lm85_read_value(client, | 1388 | int ext2 = lm85_read_value(client, |
@@ -1382,16 +1407,23 @@ static struct lm85_data *lm85_update_device(struct device *dev) | |||
1382 | lm85_read_value(client, LM85_REG_FAN(i)); | 1407 | lm85_read_value(client, LM85_REG_FAN(i)); |
1383 | } | 1408 | } |
1384 | 1409 | ||
1385 | if (!(data->type == adt7463 && (data->vid & 0x80))) { | 1410 | if (!((data->type == adt7463 || data->type == adt7468) && |
1411 | (data->vid & 0x80))) { | ||
1386 | data->in[4] = lm85_read_value(client, | 1412 | data->in[4] = lm85_read_value(client, |
1387 | LM85_REG_IN(4)); | 1413 | LM85_REG_IN(4)); |
1388 | } | 1414 | } |
1389 | 1415 | ||
1416 | if (data->type == adt7468) | ||
1417 | data->cfg5 = lm85_read_value(client, ADT7468_REG_CFG5); | ||
1418 | |||
1390 | for (i = 0; i <= 2; ++i) { | 1419 | for (i = 0; i <= 2; ++i) { |
1391 | data->temp[i] = | 1420 | data->temp[i] = |
1392 | lm85_read_value(client, LM85_REG_TEMP(i)); | 1421 | lm85_read_value(client, LM85_REG_TEMP(i)); |
1393 | data->pwm[i] = | 1422 | data->pwm[i] = |
1394 | lm85_read_value(client, LM85_REG_PWM(i)); | 1423 | lm85_read_value(client, LM85_REG_PWM(i)); |
1424 | |||
1425 | if (IS_ADT7468_OFF64(data)) | ||
1426 | data->temp[i] -= 64; | ||
1395 | } | 1427 | } |
1396 | 1428 | ||
1397 | data->alarms = lm85_read_value(client, LM85_REG_ALARM1); | 1429 | data->alarms = lm85_read_value(client, LM85_REG_ALARM1); |
@@ -1446,7 +1478,8 @@ static struct lm85_data *lm85_update_device(struct device *dev) | |||
1446 | lm85_read_value(client, LM85_REG_FAN_MIN(i)); | 1478 | lm85_read_value(client, LM85_REG_FAN_MIN(i)); |
1447 | } | 1479 | } |
1448 | 1480 | ||
1449 | if (!(data->type == adt7463 && (data->vid & 0x80))) { | 1481 | if (!((data->type == adt7463 || data->type == adt7468) && |
1482 | (data->vid & 0x80))) { | ||
1450 | data->in_min[4] = lm85_read_value(client, | 1483 | data->in_min[4] = lm85_read_value(client, |
1451 | LM85_REG_IN_MIN(4)); | 1484 | LM85_REG_IN_MIN(4)); |
1452 | data->in_max[4] = lm85_read_value(client, | 1485 | data->in_max[4] = lm85_read_value(client, |
@@ -1481,6 +1514,13 @@ static struct lm85_data *lm85_update_device(struct device *dev) | |||
1481 | lm85_read_value(client, LM85_REG_AFAN_LIMIT(i)); | 1514 | lm85_read_value(client, LM85_REG_AFAN_LIMIT(i)); |
1482 | data->zone[i].critical = | 1515 | data->zone[i].critical = |
1483 | lm85_read_value(client, LM85_REG_AFAN_CRITICAL(i)); | 1516 | lm85_read_value(client, LM85_REG_AFAN_CRITICAL(i)); |
1517 | |||
1518 | if (IS_ADT7468_OFF64(data)) { | ||
1519 | data->temp_min[i] -= 64; | ||
1520 | data->temp_max[i] -= 64; | ||
1521 | data->zone[i].limit -= 64; | ||
1522 | data->zone[i].critical -= 64; | ||
1523 | } | ||
1484 | } | 1524 | } |
1485 | 1525 | ||
1486 | i = lm85_read_value(client, LM85_REG_AFAN_SPIKE1); | 1526 | i = lm85_read_value(client, LM85_REG_AFAN_SPIKE1); |
diff --git a/drivers/i2c/busses/i2c-parport.c b/drivers/i2c/busses/i2c-parport.c index 59ba2086d2f9..a257cd5cd134 100644 --- a/drivers/i2c/busses/i2c-parport.c +++ b/drivers/i2c/busses/i2c-parport.c | |||
@@ -189,8 +189,6 @@ static void i2c_parport_attach (struct parport *port) | |||
189 | if (adapter_parm[type].init.val) | 189 | if (adapter_parm[type].init.val) |
190 | line_set(port, 1, &adapter_parm[type].init); | 190 | line_set(port, 1, &adapter_parm[type].init); |
191 | 191 | ||
192 | parport_release(adapter->pdev); | ||
193 | |||
194 | if (i2c_bit_add_bus(&adapter->adapter) < 0) { | 192 | if (i2c_bit_add_bus(&adapter->adapter) < 0) { |
195 | printk(KERN_ERR "i2c-parport: Unable to register with I2C\n"); | 193 | printk(KERN_ERR "i2c-parport: Unable to register with I2C\n"); |
196 | goto ERROR1; | 194 | goto ERROR1; |
@@ -202,6 +200,7 @@ static void i2c_parport_attach (struct parport *port) | |||
202 | return; | 200 | return; |
203 | 201 | ||
204 | ERROR1: | 202 | ERROR1: |
203 | parport_release(adapter->pdev); | ||
205 | parport_unregister_device(adapter->pdev); | 204 | parport_unregister_device(adapter->pdev); |
206 | ERROR0: | 205 | ERROR0: |
207 | kfree(adapter); | 206 | kfree(adapter); |
@@ -221,6 +220,7 @@ static void i2c_parport_detach (struct parport *port) | |||
221 | if (adapter_parm[type].init.val) | 220 | if (adapter_parm[type].init.val) |
222 | line_set(port, 0, &adapter_parm[type].init); | 221 | line_set(port, 0, &adapter_parm[type].init); |
223 | 222 | ||
223 | parport_release(adapter->pdev); | ||
224 | parport_unregister_device(adapter->pdev); | 224 | parport_unregister_device(adapter->pdev); |
225 | if (prev) | 225 | if (prev) |
226 | prev->next = adapter->next; | 226 | prev->next = adapter->next; |
diff --git a/drivers/i2c/busses/i2c-sh_mobile.c b/drivers/i2c/busses/i2c-sh_mobile.c index 640cbb237328..3384a717fec0 100644 --- a/drivers/i2c/busses/i2c-sh_mobile.c +++ b/drivers/i2c/busses/i2c-sh_mobile.c | |||
@@ -318,7 +318,8 @@ static int sh_mobile_i2c_isr_rx(struct sh_mobile_i2c_data *pd) | |||
318 | } else | 318 | } else |
319 | data = i2c_op(pd, OP_RX, 0); | 319 | data = i2c_op(pd, OP_RX, 0); |
320 | 320 | ||
321 | pd->msg->buf[real_pos] = data; | 321 | if (real_pos >= 0) |
322 | pd->msg->buf[real_pos] = data; | ||
322 | } while (0); | 323 | } while (0); |
323 | 324 | ||
324 | pd->pos++; | 325 | pd->pos++; |
diff --git a/drivers/i2c/chips/isp1301_omap.c b/drivers/i2c/chips/isp1301_omap.c index 28902ebd5539..e0d56ef2bcb0 100644 --- a/drivers/i2c/chips/isp1301_omap.c +++ b/drivers/i2c/chips/isp1301_omap.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <linux/slab.h> | 25 | #include <linux/slab.h> |
26 | #include <linux/interrupt.h> | 26 | #include <linux/interrupt.h> |
27 | #include <linux/platform_device.h> | 27 | #include <linux/platform_device.h> |
28 | #include <linux/gpio.h> | ||
28 | #include <linux/usb/ch9.h> | 29 | #include <linux/usb/ch9.h> |
29 | #include <linux/usb/gadget.h> | 30 | #include <linux/usb/gadget.h> |
30 | #include <linux/usb.h> | 31 | #include <linux/usb.h> |
@@ -33,7 +34,10 @@ | |||
33 | #include <linux/workqueue.h> | 34 | #include <linux/workqueue.h> |
34 | 35 | ||
35 | #include <asm/irq.h> | 36 | #include <asm/irq.h> |
37 | #include <asm/mach-types.h> | ||
38 | |||
36 | #include <mach/usb.h> | 39 | #include <mach/usb.h> |
40 | #include <mach/mux.h> | ||
37 | 41 | ||
38 | 42 | ||
39 | #ifndef DEBUG | 43 | #ifndef DEBUG |
@@ -88,14 +92,9 @@ struct isp1301 { | |||
88 | 92 | ||
89 | /*-------------------------------------------------------------------------*/ | 93 | /*-------------------------------------------------------------------------*/ |
90 | 94 | ||
91 | #ifdef CONFIG_MACH_OMAP_H2 | ||
92 | |||
93 | /* board-specific PM hooks */ | 95 | /* board-specific PM hooks */ |
94 | 96 | ||
95 | #include <asm/gpio.h> | 97 | #if defined(CONFIG_MACH_OMAP_H2) || defined(CONFIG_MACH_OMAP_H3) |
96 | #include <mach/mux.h> | ||
97 | #include <asm/mach-types.h> | ||
98 | |||
99 | 98 | ||
100 | #if defined(CONFIG_TPS65010) || defined(CONFIG_TPS65010_MODULE) | 99 | #if defined(CONFIG_TPS65010) || defined(CONFIG_TPS65010_MODULE) |
101 | 100 | ||
@@ -135,6 +134,33 @@ static inline void notresponding(struct isp1301 *isp) | |||
135 | 134 | ||
136 | #endif | 135 | #endif |
137 | 136 | ||
137 | #if defined(CONFIG_MACH_OMAP_H4) | ||
138 | |||
139 | static void enable_vbus_draw(struct isp1301 *isp, unsigned mA) | ||
140 | { | ||
141 | /* H4 controls this by DIP switch S2.4; no soft control. | ||
142 | * ON means the charger is always enabled. Leave it OFF | ||
143 | * unless the OTG port is used only in B-peripheral mode. | ||
144 | */ | ||
145 | } | ||
146 | |||
147 | static void enable_vbus_source(struct isp1301 *isp) | ||
148 | { | ||
149 | /* this board won't supply more than 8mA vbus power. | ||
150 | * some boards can switch a 100ma "unit load" (or more). | ||
151 | */ | ||
152 | } | ||
153 | |||
154 | |||
155 | /* products will deliver OTG messages with LEDs, GUI, etc */ | ||
156 | static inline void notresponding(struct isp1301 *isp) | ||
157 | { | ||
158 | printk(KERN_NOTICE "OTG device not responding.\n"); | ||
159 | } | ||
160 | |||
161 | |||
162 | #endif | ||
163 | |||
138 | /*-------------------------------------------------------------------------*/ | 164 | /*-------------------------------------------------------------------------*/ |
139 | 165 | ||
140 | static struct i2c_driver isp1301_driver; | 166 | static struct i2c_driver isp1301_driver; |
@@ -334,8 +360,7 @@ static int gadget_suspend(struct isp1301 *isp) | |||
334 | * NOTE: guaranteeing certain response times might mean we shouldn't | 360 | * NOTE: guaranteeing certain response times might mean we shouldn't |
335 | * share keventd's work queue; a realtime task might be safest. | 361 | * share keventd's work queue; a realtime task might be safest. |
336 | */ | 362 | */ |
337 | void | 363 | static void isp1301_defer_work(struct isp1301 *isp, int work) |
338 | isp1301_defer_work(struct isp1301 *isp, int work) | ||
339 | { | 364 | { |
340 | int status; | 365 | int status; |
341 | 366 | ||
@@ -512,7 +537,6 @@ static void update_otg1(struct isp1301 *isp, u8 int_src) | |||
512 | otg_ctrl &= ~OTG_XCEIV_INPUTS; | 537 | otg_ctrl &= ~OTG_XCEIV_INPUTS; |
513 | otg_ctrl &= ~(OTG_ID|OTG_ASESSVLD|OTG_VBUSVLD); | 538 | otg_ctrl &= ~(OTG_ID|OTG_ASESSVLD|OTG_VBUSVLD); |
514 | 539 | ||
515 | |||
516 | if (int_src & INTR_SESS_VLD) | 540 | if (int_src & INTR_SESS_VLD) |
517 | otg_ctrl |= OTG_ASESSVLD; | 541 | otg_ctrl |= OTG_ASESSVLD; |
518 | else if (isp->otg.state == OTG_STATE_A_WAIT_VFALL) { | 542 | else if (isp->otg.state == OTG_STATE_A_WAIT_VFALL) { |
@@ -886,11 +910,11 @@ static int otg_probe(struct platform_device *dev) | |||
886 | 910 | ||
887 | static int otg_remove(struct platform_device *dev) | 911 | static int otg_remove(struct platform_device *dev) |
888 | { | 912 | { |
889 | otg_dev = 0; | 913 | otg_dev = NULL; |
890 | return 0; | 914 | return 0; |
891 | } | 915 | } |
892 | 916 | ||
893 | struct platform_driver omap_otg_driver = { | 917 | static struct platform_driver omap_otg_driver = { |
894 | .probe = otg_probe, | 918 | .probe = otg_probe, |
895 | .remove = otg_remove, | 919 | .remove = otg_remove, |
896 | .driver = { | 920 | .driver = { |
@@ -1212,6 +1236,8 @@ static void isp1301_release(struct device *dev) | |||
1212 | 1236 | ||
1213 | isp = dev_get_drvdata(dev); | 1237 | isp = dev_get_drvdata(dev); |
1214 | 1238 | ||
1239 | /* FIXME -- not with a "new style" driver, it doesn't!! */ | ||
1240 | |||
1215 | /* ugly -- i2c hijacks our memory hook to wait_for_completion() */ | 1241 | /* ugly -- i2c hijacks our memory hook to wait_for_completion() */ |
1216 | if (isp->i2c_release) | 1242 | if (isp->i2c_release) |
1217 | isp->i2c_release(dev); | 1243 | isp->i2c_release(dev); |
@@ -1233,7 +1259,7 @@ static int __exit isp1301_remove(struct i2c_client *i2c) | |||
1233 | otg_unbind(isp); | 1259 | otg_unbind(isp); |
1234 | #endif | 1260 | #endif |
1235 | if (machine_is_omap_h2()) | 1261 | if (machine_is_omap_h2()) |
1236 | omap_free_gpio(2); | 1262 | gpio_free(2); |
1237 | 1263 | ||
1238 | isp->timer.data = 0; | 1264 | isp->timer.data = 0; |
1239 | set_bit(WORK_STOP, &isp->todo); | 1265 | set_bit(WORK_STOP, &isp->todo); |
@@ -1241,7 +1267,7 @@ static int __exit isp1301_remove(struct i2c_client *i2c) | |||
1241 | flush_scheduled_work(); | 1267 | flush_scheduled_work(); |
1242 | 1268 | ||
1243 | put_device(&i2c->dev); | 1269 | put_device(&i2c->dev); |
1244 | the_transceiver = 0; | 1270 | the_transceiver = NULL; |
1245 | 1271 | ||
1246 | return 0; | 1272 | return 0; |
1247 | } | 1273 | } |
@@ -1295,7 +1321,7 @@ isp1301_set_host(struct otg_transceiver *otg, struct usb_bus *host) | |||
1295 | if (!host) { | 1321 | if (!host) { |
1296 | omap_writew(0, OTG_IRQ_EN); | 1322 | omap_writew(0, OTG_IRQ_EN); |
1297 | power_down(isp); | 1323 | power_down(isp); |
1298 | isp->otg.host = 0; | 1324 | isp->otg.host = NULL; |
1299 | return 0; | 1325 | return 0; |
1300 | } | 1326 | } |
1301 | 1327 | ||
@@ -1344,7 +1370,9 @@ static int | |||
1344 | isp1301_set_peripheral(struct otg_transceiver *otg, struct usb_gadget *gadget) | 1370 | isp1301_set_peripheral(struct otg_transceiver *otg, struct usb_gadget *gadget) |
1345 | { | 1371 | { |
1346 | struct isp1301 *isp = container_of(otg, struct isp1301, otg); | 1372 | struct isp1301 *isp = container_of(otg, struct isp1301, otg); |
1373 | #ifndef CONFIG_USB_OTG | ||
1347 | u32 l; | 1374 | u32 l; |
1375 | #endif | ||
1348 | 1376 | ||
1349 | if (!otg || isp != the_transceiver) | 1377 | if (!otg || isp != the_transceiver) |
1350 | return -ENODEV; | 1378 | return -ENODEV; |
@@ -1354,7 +1382,7 @@ isp1301_set_peripheral(struct otg_transceiver *otg, struct usb_gadget *gadget) | |||
1354 | if (!isp->otg.default_a) | 1382 | if (!isp->otg.default_a) |
1355 | enable_vbus_draw(isp, 0); | 1383 | enable_vbus_draw(isp, 0); |
1356 | usb_gadget_vbus_disconnect(isp->otg.gadget); | 1384 | usb_gadget_vbus_disconnect(isp->otg.gadget); |
1357 | isp->otg.gadget = 0; | 1385 | isp->otg.gadget = NULL; |
1358 | power_down(isp); | 1386 | power_down(isp); |
1359 | return 0; | 1387 | return 0; |
1360 | } | 1388 | } |
@@ -1379,7 +1407,7 @@ isp1301_set_peripheral(struct otg_transceiver *otg, struct usb_gadget *gadget) | |||
1379 | power_up(isp); | 1407 | power_up(isp); |
1380 | isp->otg.state = OTG_STATE_B_IDLE; | 1408 | isp->otg.state = OTG_STATE_B_IDLE; |
1381 | 1409 | ||
1382 | if (machine_is_omap_h2()) | 1410 | if (machine_is_omap_h2() || machine_is_omap_h3()) |
1383 | isp1301_set_bits(isp, ISP1301_MODE_CONTROL_1, MC1_DAT_SE0); | 1411 | isp1301_set_bits(isp, ISP1301_MODE_CONTROL_1, MC1_DAT_SE0); |
1384 | 1412 | ||
1385 | isp1301_set_bits(isp, ISP1301_INTERRUPT_RISING, | 1413 | isp1301_set_bits(isp, ISP1301_INTERRUPT_RISING, |
@@ -1499,7 +1527,8 @@ isp1301_start_hnp(struct otg_transceiver *dev) | |||
1499 | 1527 | ||
1500 | /*-------------------------------------------------------------------------*/ | 1528 | /*-------------------------------------------------------------------------*/ |
1501 | 1529 | ||
1502 | static int __init isp1301_probe(struct i2c_client *i2c) | 1530 | static int __init |
1531 | isp1301_probe(struct i2c_client *i2c, const struct i2c_device_id *id) | ||
1503 | { | 1532 | { |
1504 | int status; | 1533 | int status; |
1505 | struct isp1301 *isp; | 1534 | struct isp1301 *isp; |
@@ -1647,7 +1676,7 @@ module_init(isp_init); | |||
1647 | static void __exit isp_exit(void) | 1676 | static void __exit isp_exit(void) |
1648 | { | 1677 | { |
1649 | if (the_transceiver) | 1678 | if (the_transceiver) |
1650 | otg_set_transceiver(0); | 1679 | otg_set_transceiver(NULL); |
1651 | i2c_del_driver(&isp1301_driver); | 1680 | i2c_del_driver(&isp1301_driver); |
1652 | } | 1681 | } |
1653 | module_exit(isp_exit); | 1682 | module_exit(isp_exit); |
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index 5a485c22660a..c6a63f46bc15 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c | |||
@@ -631,7 +631,7 @@ int i2c_del_adapter(struct i2c_adapter *adap) | |||
631 | 631 | ||
632 | /* detach any active clients. This must be done first, because | 632 | /* detach any active clients. This must be done first, because |
633 | * it can fail; in which case we give up. */ | 633 | * it can fail; in which case we give up. */ |
634 | list_for_each_entry_safe(client, _n, &adap->clients, list) { | 634 | list_for_each_entry_safe_reverse(client, _n, &adap->clients, list) { |
635 | struct i2c_driver *driver; | 635 | struct i2c_driver *driver; |
636 | 636 | ||
637 | driver = client->driver; | 637 | driver = client->driver; |
diff --git a/drivers/ide/icside.c b/drivers/ide/icside.c index 2d848010499d..81f70caeb40f 100644 --- a/drivers/ide/icside.c +++ b/drivers/ide/icside.c | |||
@@ -419,7 +419,7 @@ static void icside_setup_ports(hw_regs_t *hw, void __iomem *base, | |||
419 | hw->chipset = ide_acorn; | 419 | hw->chipset = ide_acorn; |
420 | } | 420 | } |
421 | 421 | ||
422 | static int __init | 422 | static int __devinit |
423 | icside_register_v5(struct icside_state *state, struct expansion_card *ec) | 423 | icside_register_v5(struct icside_state *state, struct expansion_card *ec) |
424 | { | 424 | { |
425 | void __iomem *base; | 425 | void __iomem *base; |
@@ -473,7 +473,7 @@ static const struct ide_port_info icside_v6_port_info __initdata = { | |||
473 | .swdma_mask = ATA_SWDMA2, | 473 | .swdma_mask = ATA_SWDMA2, |
474 | }; | 474 | }; |
475 | 475 | ||
476 | static int __init | 476 | static int __devinit |
477 | icside_register_v6(struct icside_state *state, struct expansion_card *ec) | 477 | icside_register_v6(struct icside_state *state, struct expansion_card *ec) |
478 | { | 478 | { |
479 | void __iomem *ioc_base, *easi_base; | 479 | void __iomem *ioc_base, *easi_base; |
diff --git a/drivers/ide/ide-cs.c b/drivers/ide/ide-cs.c index cb199c815b53..f50210fe558f 100644 --- a/drivers/ide/ide-cs.c +++ b/drivers/ide/ide-cs.c | |||
@@ -444,6 +444,7 @@ static struct pcmcia_device_id ide_ids[] = { | |||
444 | PCMCIA_DEVICE_PROD_ID1("STI Flash", 0xe4a13209), | 444 | PCMCIA_DEVICE_PROD_ID1("STI Flash", 0xe4a13209), |
445 | PCMCIA_DEVICE_PROD_ID12("STI", "Flash 5.0", 0xbf2df18d, 0x8cb57a0e), | 445 | PCMCIA_DEVICE_PROD_ID12("STI", "Flash 5.0", 0xbf2df18d, 0x8cb57a0e), |
446 | PCMCIA_MFC_DEVICE_PROD_ID12(1, "SanDisk", "ConnectPlus", 0x7a954bd9, 0x74be00c6), | 446 | PCMCIA_MFC_DEVICE_PROD_ID12(1, "SanDisk", "ConnectPlus", 0x7a954bd9, 0x74be00c6), |
447 | PCMCIA_DEVICE_PROD_ID2("Flash Card", 0x5a362506), | ||
447 | PCMCIA_DEVICE_NULL, | 448 | PCMCIA_DEVICE_NULL, |
448 | }; | 449 | }; |
449 | MODULE_DEVICE_TABLE(pcmcia, ide_ids); | 450 | MODULE_DEVICE_TABLE(pcmcia, ide_ids); |
diff --git a/drivers/idle/Kconfig b/drivers/idle/Kconfig index 108264de0ac9..f15e90a453d1 100644 --- a/drivers/idle/Kconfig +++ b/drivers/idle/Kconfig | |||
@@ -1,5 +1,6 @@ | |||
1 | 1 | ||
2 | menu "Memory power savings" | 2 | menu "Memory power savings" |
3 | depends on X86_64 | ||
3 | 4 | ||
4 | config I7300_IDLE_IOAT_CHANNEL | 5 | config I7300_IDLE_IOAT_CHANNEL |
5 | bool | 6 | bool |
@@ -7,7 +8,7 @@ config I7300_IDLE_IOAT_CHANNEL | |||
7 | config I7300_IDLE | 8 | config I7300_IDLE |
8 | tristate "Intel chipset idle memory power saving driver" | 9 | tristate "Intel chipset idle memory power saving driver" |
9 | select I7300_IDLE_IOAT_CHANNEL | 10 | select I7300_IDLE_IOAT_CHANNEL |
10 | depends on X86_64 && EXPERIMENTAL | 11 | depends on EXPERIMENTAL |
11 | help | 12 | help |
12 | Enable memory power savings when idle with certain Intel server | 13 | Enable memory power savings when idle with certain Intel server |
13 | chipsets. The chipset must have I/O AT support, such as the | 14 | chipsets. The chipset must have I/O AT support, such as the |
diff --git a/drivers/ieee1394/highlevel.c b/drivers/ieee1394/highlevel.c index 918ffc4fc8ac..272543a42a43 100644 --- a/drivers/ieee1394/highlevel.c +++ b/drivers/ieee1394/highlevel.c | |||
@@ -46,10 +46,6 @@ static DEFINE_RWLOCK(hl_irqs_lock); | |||
46 | 46 | ||
47 | static DEFINE_RWLOCK(addr_space_lock); | 47 | static DEFINE_RWLOCK(addr_space_lock); |
48 | 48 | ||
49 | /* addr_space list will have zero and max already included as bounds */ | ||
50 | static struct hpsb_address_ops dummy_ops = { NULL, NULL, NULL, NULL }; | ||
51 | static struct hpsb_address_serve dummy_zero_addr, dummy_max_addr; | ||
52 | |||
53 | 49 | ||
54 | static struct hl_host_info *hl_get_hostinfo(struct hpsb_highlevel *hl, | 50 | static struct hl_host_info *hl_get_hostinfo(struct hpsb_highlevel *hl, |
55 | struct hpsb_host *host) | 51 | struct hpsb_host *host) |
@@ -481,20 +477,23 @@ int hpsb_unregister_addrspace(struct hpsb_highlevel *hl, struct hpsb_host *host, | |||
481 | return retval; | 477 | return retval; |
482 | } | 478 | } |
483 | 479 | ||
480 | static struct hpsb_address_ops dummy_ops; | ||
481 | |||
482 | /* dummy address spaces as lower and upper bounds of the host's a.s. list */ | ||
484 | static void init_hpsb_highlevel(struct hpsb_host *host) | 483 | static void init_hpsb_highlevel(struct hpsb_host *host) |
485 | { | 484 | { |
486 | INIT_LIST_HEAD(&dummy_zero_addr.host_list); | 485 | INIT_LIST_HEAD(&host->dummy_zero_addr.host_list); |
487 | INIT_LIST_HEAD(&dummy_zero_addr.hl_list); | 486 | INIT_LIST_HEAD(&host->dummy_zero_addr.hl_list); |
488 | INIT_LIST_HEAD(&dummy_max_addr.host_list); | 487 | INIT_LIST_HEAD(&host->dummy_max_addr.host_list); |
489 | INIT_LIST_HEAD(&dummy_max_addr.hl_list); | 488 | INIT_LIST_HEAD(&host->dummy_max_addr.hl_list); |
490 | 489 | ||
491 | dummy_zero_addr.op = dummy_max_addr.op = &dummy_ops; | 490 | host->dummy_zero_addr.op = host->dummy_max_addr.op = &dummy_ops; |
492 | 491 | ||
493 | dummy_zero_addr.start = dummy_zero_addr.end = 0; | 492 | host->dummy_zero_addr.start = host->dummy_zero_addr.end = 0; |
494 | dummy_max_addr.start = dummy_max_addr.end = ((u64) 1) << 48; | 493 | host->dummy_max_addr.start = host->dummy_max_addr.end = ((u64) 1) << 48; |
495 | 494 | ||
496 | list_add_tail(&dummy_zero_addr.host_list, &host->addr_space); | 495 | list_add_tail(&host->dummy_zero_addr.host_list, &host->addr_space); |
497 | list_add_tail(&dummy_max_addr.host_list, &host->addr_space); | 496 | list_add_tail(&host->dummy_max_addr.host_list, &host->addr_space); |
498 | } | 497 | } |
499 | 498 | ||
500 | void highlevel_add_host(struct hpsb_host *host) | 499 | void highlevel_add_host(struct hpsb_host *host) |
diff --git a/drivers/ieee1394/hosts.h b/drivers/ieee1394/hosts.h index e4e8aeb4d778..dd229950acca 100644 --- a/drivers/ieee1394/hosts.h +++ b/drivers/ieee1394/hosts.h | |||
@@ -13,6 +13,7 @@ struct module; | |||
13 | 13 | ||
14 | #include "ieee1394_types.h" | 14 | #include "ieee1394_types.h" |
15 | #include "csr.h" | 15 | #include "csr.h" |
16 | #include "highlevel.h" | ||
16 | 17 | ||
17 | struct hpsb_packet; | 18 | struct hpsb_packet; |
18 | struct hpsb_iso; | 19 | struct hpsb_iso; |
@@ -72,6 +73,9 @@ struct hpsb_host { | |||
72 | struct { DECLARE_BITMAP(map, 64); } tl_pool[ALL_NODES]; | 73 | struct { DECLARE_BITMAP(map, 64); } tl_pool[ALL_NODES]; |
73 | 74 | ||
74 | struct csr_control csr; | 75 | struct csr_control csr; |
76 | |||
77 | struct hpsb_address_serve dummy_zero_addr; | ||
78 | struct hpsb_address_serve dummy_max_addr; | ||
75 | }; | 79 | }; |
76 | 80 | ||
77 | enum devctl_cmd { | 81 | enum devctl_cmd { |
diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c index c52f6e6e8af2..a373c18cf7b8 100644 --- a/drivers/ieee1394/sbp2.c +++ b/drivers/ieee1394/sbp2.c | |||
@@ -402,6 +402,11 @@ static const struct { | |||
402 | }, | 402 | }, |
403 | /* iPod mini */ { | 403 | /* iPod mini */ { |
404 | .firmware_revision = 0x0a2700, | 404 | .firmware_revision = 0x0a2700, |
405 | .model_id = 0x000022, | ||
406 | .workarounds = SBP2_WORKAROUND_FIX_CAPACITY, | ||
407 | }, | ||
408 | /* iPod mini */ { | ||
409 | .firmware_revision = 0x0a2700, | ||
405 | .model_id = 0x000023, | 410 | .model_id = 0x000023, |
406 | .workarounds = SBP2_WORKAROUND_FIX_CAPACITY, | 411 | .workarounds = SBP2_WORKAROUND_FIX_CAPACITY, |
407 | }, | 412 | }, |
@@ -890,12 +895,13 @@ static void sbp2_host_reset(struct hpsb_host *host) | |||
890 | return; | 895 | return; |
891 | 896 | ||
892 | read_lock_irqsave(&sbp2_hi_logical_units_lock, flags); | 897 | read_lock_irqsave(&sbp2_hi_logical_units_lock, flags); |
898 | |||
893 | list_for_each_entry(lu, &hi->logical_units, lu_list) | 899 | list_for_each_entry(lu, &hi->logical_units, lu_list) |
894 | if (likely(atomic_read(&lu->state) != | 900 | if (atomic_cmpxchg(&lu->state, |
895 | SBP2LU_STATE_IN_SHUTDOWN)) { | 901 | SBP2LU_STATE_RUNNING, SBP2LU_STATE_IN_RESET) |
896 | atomic_set(&lu->state, SBP2LU_STATE_IN_RESET); | 902 | == SBP2LU_STATE_RUNNING) |
897 | scsi_block_requests(lu->shost); | 903 | scsi_block_requests(lu->shost); |
898 | } | 904 | |
899 | read_unlock_irqrestore(&sbp2_hi_logical_units_lock, flags); | 905 | read_unlock_irqrestore(&sbp2_hi_logical_units_lock, flags); |
900 | } | 906 | } |
901 | 907 | ||
diff --git a/drivers/infiniband/hw/cxgb3/iwch_provider.c b/drivers/infiniband/hw/cxgb3/iwch_provider.c index ecff98043589..160ef482712d 100644 --- a/drivers/infiniband/hw/cxgb3/iwch_provider.c +++ b/drivers/infiniband/hw/cxgb3/iwch_provider.c | |||
@@ -1102,9 +1102,7 @@ static u64 fw_vers_string_to_u64(struct iwch_dev *iwch_dev) | |||
1102 | char *cp, *next; | 1102 | char *cp, *next; |
1103 | unsigned fw_maj, fw_min, fw_mic; | 1103 | unsigned fw_maj, fw_min, fw_mic; |
1104 | 1104 | ||
1105 | rtnl_lock(); | ||
1106 | lldev->ethtool_ops->get_drvinfo(lldev, &info); | 1105 | lldev->ethtool_ops->get_drvinfo(lldev, &info); |
1107 | rtnl_unlock(); | ||
1108 | 1106 | ||
1109 | next = info.fw_version + 1; | 1107 | next = info.fw_version + 1; |
1110 | cp = strsep(&next, "."); | 1108 | cp = strsep(&next, "."); |
@@ -1192,9 +1190,7 @@ static ssize_t show_fw_ver(struct device *dev, struct device_attribute *attr, ch | |||
1192 | struct net_device *lldev = iwch_dev->rdev.t3cdev_p->lldev; | 1190 | struct net_device *lldev = iwch_dev->rdev.t3cdev_p->lldev; |
1193 | 1191 | ||
1194 | PDBG("%s dev 0x%p\n", __func__, dev); | 1192 | PDBG("%s dev 0x%p\n", __func__, dev); |
1195 | rtnl_lock(); | ||
1196 | lldev->ethtool_ops->get_drvinfo(lldev, &info); | 1193 | lldev->ethtool_ops->get_drvinfo(lldev, &info); |
1197 | rtnl_unlock(); | ||
1198 | return sprintf(buf, "%s\n", info.fw_version); | 1194 | return sprintf(buf, "%s\n", info.fw_version); |
1199 | } | 1195 | } |
1200 | 1196 | ||
@@ -1207,9 +1203,7 @@ static ssize_t show_hca(struct device *dev, struct device_attribute *attr, | |||
1207 | struct net_device *lldev = iwch_dev->rdev.t3cdev_p->lldev; | 1203 | struct net_device *lldev = iwch_dev->rdev.t3cdev_p->lldev; |
1208 | 1204 | ||
1209 | PDBG("%s dev 0x%p\n", __func__, dev); | 1205 | PDBG("%s dev 0x%p\n", __func__, dev); |
1210 | rtnl_lock(); | ||
1211 | lldev->ethtool_ops->get_drvinfo(lldev, &info); | 1206 | lldev->ethtool_ops->get_drvinfo(lldev, &info); |
1212 | rtnl_unlock(); | ||
1213 | return sprintf(buf, "%s\n", info.driver); | 1207 | return sprintf(buf, "%s\n", info.driver); |
1214 | } | 1208 | } |
1215 | 1209 | ||
diff --git a/drivers/infiniband/hw/cxgb3/iwch_qp.c b/drivers/infiniband/hw/cxgb3/iwch_qp.c index 3e4585c2318a..19661b2f0406 100644 --- a/drivers/infiniband/hw/cxgb3/iwch_qp.c +++ b/drivers/infiniband/hw/cxgb3/iwch_qp.c | |||
@@ -745,7 +745,6 @@ int iwch_post_zb_read(struct iwch_qp *qhp) | |||
745 | wqe->read.rdmaop = T3_READ_REQ; | 745 | wqe->read.rdmaop = T3_READ_REQ; |
746 | wqe->read.reserved[0] = 0; | 746 | wqe->read.reserved[0] = 0; |
747 | wqe->read.reserved[1] = 0; | 747 | wqe->read.reserved[1] = 0; |
748 | wqe->read.reserved[2] = 0; | ||
749 | wqe->read.rem_stag = cpu_to_be32(1); | 748 | wqe->read.rem_stag = cpu_to_be32(1); |
750 | wqe->read.rem_to = cpu_to_be64(1); | 749 | wqe->read.rem_to = cpu_to_be64(1); |
751 | wqe->read.local_stag = cpu_to_be32(1); | 750 | wqe->read.local_stag = cpu_to_be32(1); |
diff --git a/drivers/infiniband/hw/ehca/ehca_classes.h b/drivers/infiniband/hw/ehca/ehca_classes.h index 4df887af66a5..7fc35cf0cddf 100644 --- a/drivers/infiniband/hw/ehca/ehca_classes.h +++ b/drivers/infiniband/hw/ehca/ehca_classes.h | |||
@@ -163,7 +163,8 @@ struct ehca_mod_qp_parm { | |||
163 | /* struct for tracking if cqes have been reported to the application */ | 163 | /* struct for tracking if cqes have been reported to the application */ |
164 | struct ehca_qmap_entry { | 164 | struct ehca_qmap_entry { |
165 | u16 app_wr_id; | 165 | u16 app_wr_id; |
166 | u16 reported; | 166 | u8 reported; |
167 | u8 cqe_req; | ||
167 | }; | 168 | }; |
168 | 169 | ||
169 | struct ehca_queue_map { | 170 | struct ehca_queue_map { |
@@ -171,6 +172,7 @@ struct ehca_queue_map { | |||
171 | unsigned int entries; | 172 | unsigned int entries; |
172 | unsigned int tail; | 173 | unsigned int tail; |
173 | unsigned int left_to_poll; | 174 | unsigned int left_to_poll; |
175 | unsigned int next_wqe_idx; /* Idx to first wqe to be flushed */ | ||
174 | }; | 176 | }; |
175 | 177 | ||
176 | struct ehca_qp { | 178 | struct ehca_qp { |
diff --git a/drivers/infiniband/hw/ehca/ehca_irq.c b/drivers/infiniband/hw/ehca/ehca_irq.c index cb55be04442c..757035ea246f 100644 --- a/drivers/infiniband/hw/ehca/ehca_irq.c +++ b/drivers/infiniband/hw/ehca/ehca_irq.c | |||
@@ -359,36 +359,48 @@ static void notify_port_conf_change(struct ehca_shca *shca, int port_num) | |||
359 | *old_attr = new_attr; | 359 | *old_attr = new_attr; |
360 | } | 360 | } |
361 | 361 | ||
362 | /* replay modify_qp for sqps -- return 0 if all is well, 1 if AQP1 destroyed */ | ||
363 | static int replay_modify_qp(struct ehca_sport *sport) | ||
364 | { | ||
365 | int aqp1_destroyed; | ||
366 | unsigned long flags; | ||
367 | |||
368 | spin_lock_irqsave(&sport->mod_sqp_lock, flags); | ||
369 | |||
370 | aqp1_destroyed = !sport->ibqp_sqp[IB_QPT_GSI]; | ||
371 | |||
372 | if (sport->ibqp_sqp[IB_QPT_SMI]) | ||
373 | ehca_recover_sqp(sport->ibqp_sqp[IB_QPT_SMI]); | ||
374 | if (!aqp1_destroyed) | ||
375 | ehca_recover_sqp(sport->ibqp_sqp[IB_QPT_GSI]); | ||
376 | |||
377 | spin_unlock_irqrestore(&sport->mod_sqp_lock, flags); | ||
378 | |||
379 | return aqp1_destroyed; | ||
380 | } | ||
381 | |||
362 | static void parse_ec(struct ehca_shca *shca, u64 eqe) | 382 | static void parse_ec(struct ehca_shca *shca, u64 eqe) |
363 | { | 383 | { |
364 | u8 ec = EHCA_BMASK_GET(NEQE_EVENT_CODE, eqe); | 384 | u8 ec = EHCA_BMASK_GET(NEQE_EVENT_CODE, eqe); |
365 | u8 port = EHCA_BMASK_GET(NEQE_PORT_NUMBER, eqe); | 385 | u8 port = EHCA_BMASK_GET(NEQE_PORT_NUMBER, eqe); |
366 | u8 spec_event; | 386 | u8 spec_event; |
367 | struct ehca_sport *sport = &shca->sport[port - 1]; | 387 | struct ehca_sport *sport = &shca->sport[port - 1]; |
368 | unsigned long flags; | ||
369 | 388 | ||
370 | switch (ec) { | 389 | switch (ec) { |
371 | case 0x30: /* port availability change */ | 390 | case 0x30: /* port availability change */ |
372 | if (EHCA_BMASK_GET(NEQE_PORT_AVAILABILITY, eqe)) { | 391 | if (EHCA_BMASK_GET(NEQE_PORT_AVAILABILITY, eqe)) { |
373 | int suppress_event; | 392 | /* only replay modify_qp calls in autodetect mode; |
374 | /* replay modify_qp for sqps */ | 393 | * if AQP1 was destroyed, the port is already down |
375 | spin_lock_irqsave(&sport->mod_sqp_lock, flags); | 394 | * again and we can drop the event. |
376 | suppress_event = !sport->ibqp_sqp[IB_QPT_GSI]; | 395 | */ |
377 | if (sport->ibqp_sqp[IB_QPT_SMI]) | 396 | if (ehca_nr_ports < 0) |
378 | ehca_recover_sqp(sport->ibqp_sqp[IB_QPT_SMI]); | 397 | if (replay_modify_qp(sport)) |
379 | if (!suppress_event) | 398 | break; |
380 | ehca_recover_sqp(sport->ibqp_sqp[IB_QPT_GSI]); | ||
381 | spin_unlock_irqrestore(&sport->mod_sqp_lock, flags); | ||
382 | |||
383 | /* AQP1 was destroyed, ignore this event */ | ||
384 | if (suppress_event) | ||
385 | break; | ||
386 | 399 | ||
387 | sport->port_state = IB_PORT_ACTIVE; | 400 | sport->port_state = IB_PORT_ACTIVE; |
388 | dispatch_port_event(shca, port, IB_EVENT_PORT_ACTIVE, | 401 | dispatch_port_event(shca, port, IB_EVENT_PORT_ACTIVE, |
389 | "is active"); | 402 | "is active"); |
390 | ehca_query_sma_attr(shca, port, | 403 | ehca_query_sma_attr(shca, port, &sport->saved_attr); |
391 | &sport->saved_attr); | ||
392 | } else { | 404 | } else { |
393 | sport->port_state = IB_PORT_DOWN; | 405 | sport->port_state = IB_PORT_DOWN; |
394 | dispatch_port_event(shca, port, IB_EVENT_PORT_ERR, | 406 | dispatch_port_event(shca, port, IB_EVENT_PORT_ERR, |
diff --git a/drivers/infiniband/hw/ehca/ehca_main.c b/drivers/infiniband/hw/ehca/ehca_main.c index bb02a86aa526..bec7e0249358 100644 --- a/drivers/infiniband/hw/ehca/ehca_main.c +++ b/drivers/infiniband/hw/ehca/ehca_main.c | |||
@@ -994,8 +994,7 @@ static int ehca_mem_notifier(struct notifier_block *nb, | |||
994 | if (printk_timed_ratelimit(&ehca_dmem_warn_time, | 994 | if (printk_timed_ratelimit(&ehca_dmem_warn_time, |
995 | 30 * 1000)) | 995 | 30 * 1000)) |
996 | ehca_gen_err("DMEM operations are not allowed" | 996 | ehca_gen_err("DMEM operations are not allowed" |
997 | "as long as an ehca adapter is" | 997 | "in conjunction with eHCA"); |
998 | "attached to the LPAR"); | ||
999 | return NOTIFY_BAD; | 998 | return NOTIFY_BAD; |
1000 | } | 999 | } |
1001 | } | 1000 | } |
diff --git a/drivers/infiniband/hw/ehca/ehca_qp.c b/drivers/infiniband/hw/ehca/ehca_qp.c index 4d54b9f64567..cadbf0cdd910 100644 --- a/drivers/infiniband/hw/ehca/ehca_qp.c +++ b/drivers/infiniband/hw/ehca/ehca_qp.c | |||
@@ -435,9 +435,13 @@ static void reset_queue_map(struct ehca_queue_map *qmap) | |||
435 | { | 435 | { |
436 | int i; | 436 | int i; |
437 | 437 | ||
438 | qmap->tail = 0; | 438 | qmap->tail = qmap->entries - 1; |
439 | for (i = 0; i < qmap->entries; i++) | 439 | qmap->left_to_poll = 0; |
440 | qmap->next_wqe_idx = 0; | ||
441 | for (i = 0; i < qmap->entries; i++) { | ||
440 | qmap->map[i].reported = 1; | 442 | qmap->map[i].reported = 1; |
443 | qmap->map[i].cqe_req = 0; | ||
444 | } | ||
441 | } | 445 | } |
442 | 446 | ||
443 | /* | 447 | /* |
@@ -860,6 +864,11 @@ static struct ehca_qp *internal_create_qp( | |||
860 | if (qp_type == IB_QPT_GSI) { | 864 | if (qp_type == IB_QPT_GSI) { |
861 | h_ret = ehca_define_sqp(shca, my_qp, init_attr); | 865 | h_ret = ehca_define_sqp(shca, my_qp, init_attr); |
862 | if (h_ret != H_SUCCESS) { | 866 | if (h_ret != H_SUCCESS) { |
867 | kfree(my_qp->mod_qp_parm); | ||
868 | my_qp->mod_qp_parm = NULL; | ||
869 | /* the QP pointer is no longer valid */ | ||
870 | shca->sport[init_attr->port_num - 1].ibqp_sqp[qp_type] = | ||
871 | NULL; | ||
863 | ret = ehca2ib_return_code(h_ret); | 872 | ret = ehca2ib_return_code(h_ret); |
864 | goto create_qp_exit6; | 873 | goto create_qp_exit6; |
865 | } | 874 | } |
@@ -1116,6 +1125,7 @@ static int calc_left_cqes(u64 wqe_p, struct ipz_queue *ipz_queue, | |||
1116 | void *wqe_v; | 1125 | void *wqe_v; |
1117 | u64 q_ofs; | 1126 | u64 q_ofs; |
1118 | u32 wqe_idx; | 1127 | u32 wqe_idx; |
1128 | unsigned int tail_idx; | ||
1119 | 1129 | ||
1120 | /* convert real to abs address */ | 1130 | /* convert real to abs address */ |
1121 | wqe_p = wqe_p & (~(1UL << 63)); | 1131 | wqe_p = wqe_p & (~(1UL << 63)); |
@@ -1128,12 +1138,17 @@ static int calc_left_cqes(u64 wqe_p, struct ipz_queue *ipz_queue, | |||
1128 | return -EFAULT; | 1138 | return -EFAULT; |
1129 | } | 1139 | } |
1130 | 1140 | ||
1141 | tail_idx = (qmap->tail + 1) % qmap->entries; | ||
1131 | wqe_idx = q_ofs / ipz_queue->qe_size; | 1142 | wqe_idx = q_ofs / ipz_queue->qe_size; |
1132 | if (wqe_idx < qmap->tail) | ||
1133 | qmap->left_to_poll = (qmap->entries - qmap->tail) + wqe_idx; | ||
1134 | else | ||
1135 | qmap->left_to_poll = wqe_idx - qmap->tail; | ||
1136 | 1143 | ||
1144 | /* check all processed wqes, whether a cqe is requested or not */ | ||
1145 | while (tail_idx != wqe_idx) { | ||
1146 | if (qmap->map[tail_idx].cqe_req) | ||
1147 | qmap->left_to_poll++; | ||
1148 | tail_idx = (tail_idx + 1) % qmap->entries; | ||
1149 | } | ||
1150 | /* save index in queue, where we have to start flushing */ | ||
1151 | qmap->next_wqe_idx = wqe_idx; | ||
1137 | return 0; | 1152 | return 0; |
1138 | } | 1153 | } |
1139 | 1154 | ||
@@ -1180,10 +1195,14 @@ static int check_for_left_cqes(struct ehca_qp *my_qp, struct ehca_shca *shca) | |||
1180 | } else { | 1195 | } else { |
1181 | spin_lock_irqsave(&my_qp->send_cq->spinlock, flags); | 1196 | spin_lock_irqsave(&my_qp->send_cq->spinlock, flags); |
1182 | my_qp->sq_map.left_to_poll = 0; | 1197 | my_qp->sq_map.left_to_poll = 0; |
1198 | my_qp->sq_map.next_wqe_idx = (my_qp->sq_map.tail + 1) % | ||
1199 | my_qp->sq_map.entries; | ||
1183 | spin_unlock_irqrestore(&my_qp->send_cq->spinlock, flags); | 1200 | spin_unlock_irqrestore(&my_qp->send_cq->spinlock, flags); |
1184 | 1201 | ||
1185 | spin_lock_irqsave(&my_qp->recv_cq->spinlock, flags); | 1202 | spin_lock_irqsave(&my_qp->recv_cq->spinlock, flags); |
1186 | my_qp->rq_map.left_to_poll = 0; | 1203 | my_qp->rq_map.left_to_poll = 0; |
1204 | my_qp->rq_map.next_wqe_idx = (my_qp->rq_map.tail + 1) % | ||
1205 | my_qp->rq_map.entries; | ||
1187 | spin_unlock_irqrestore(&my_qp->recv_cq->spinlock, flags); | 1206 | spin_unlock_irqrestore(&my_qp->recv_cq->spinlock, flags); |
1188 | } | 1207 | } |
1189 | 1208 | ||
diff --git a/drivers/infiniband/hw/ehca/ehca_reqs.c b/drivers/infiniband/hw/ehca/ehca_reqs.c index 64928079eafa..00a648f4316c 100644 --- a/drivers/infiniband/hw/ehca/ehca_reqs.c +++ b/drivers/infiniband/hw/ehca/ehca_reqs.c | |||
@@ -179,6 +179,7 @@ static inline int ehca_write_swqe(struct ehca_qp *qp, | |||
179 | 179 | ||
180 | qmap_entry->app_wr_id = get_app_wr_id(send_wr->wr_id); | 180 | qmap_entry->app_wr_id = get_app_wr_id(send_wr->wr_id); |
181 | qmap_entry->reported = 0; | 181 | qmap_entry->reported = 0; |
182 | qmap_entry->cqe_req = 0; | ||
182 | 183 | ||
183 | switch (send_wr->opcode) { | 184 | switch (send_wr->opcode) { |
184 | case IB_WR_SEND: | 185 | case IB_WR_SEND: |
@@ -203,8 +204,10 @@ static inline int ehca_write_swqe(struct ehca_qp *qp, | |||
203 | 204 | ||
204 | if ((send_wr->send_flags & IB_SEND_SIGNALED || | 205 | if ((send_wr->send_flags & IB_SEND_SIGNALED || |
205 | qp->init_attr.sq_sig_type == IB_SIGNAL_ALL_WR) | 206 | qp->init_attr.sq_sig_type == IB_SIGNAL_ALL_WR) |
206 | && !hidden) | 207 | && !hidden) { |
207 | wqe_p->wr_flag |= WQE_WRFLAG_REQ_SIGNAL_COM; | 208 | wqe_p->wr_flag |= WQE_WRFLAG_REQ_SIGNAL_COM; |
209 | qmap_entry->cqe_req = 1; | ||
210 | } | ||
208 | 211 | ||
209 | if (send_wr->opcode == IB_WR_SEND_WITH_IMM || | 212 | if (send_wr->opcode == IB_WR_SEND_WITH_IMM || |
210 | send_wr->opcode == IB_WR_RDMA_WRITE_WITH_IMM) { | 213 | send_wr->opcode == IB_WR_RDMA_WRITE_WITH_IMM) { |
@@ -569,6 +572,7 @@ static int internal_post_recv(struct ehca_qp *my_qp, | |||
569 | qmap_entry = &my_qp->rq_map.map[rq_map_idx]; | 572 | qmap_entry = &my_qp->rq_map.map[rq_map_idx]; |
570 | qmap_entry->app_wr_id = get_app_wr_id(cur_recv_wr->wr_id); | 573 | qmap_entry->app_wr_id = get_app_wr_id(cur_recv_wr->wr_id); |
571 | qmap_entry->reported = 0; | 574 | qmap_entry->reported = 0; |
575 | qmap_entry->cqe_req = 1; | ||
572 | 576 | ||
573 | wqe_cnt++; | 577 | wqe_cnt++; |
574 | } /* eof for cur_recv_wr */ | 578 | } /* eof for cur_recv_wr */ |
@@ -706,27 +710,34 @@ repoll: | |||
706 | goto repoll; | 710 | goto repoll; |
707 | wc->qp = &my_qp->ib_qp; | 711 | wc->qp = &my_qp->ib_qp; |
708 | 712 | ||
713 | qmap_tail_idx = get_app_wr_id(cqe->work_request_id); | ||
714 | if (!(cqe->w_completion_flags & WC_SEND_RECEIVE_BIT)) | ||
715 | /* We got a send completion. */ | ||
716 | qmap = &my_qp->sq_map; | ||
717 | else | ||
718 | /* We got a receive completion. */ | ||
719 | qmap = &my_qp->rq_map; | ||
720 | |||
721 | /* advance the tail pointer */ | ||
722 | qmap->tail = qmap_tail_idx; | ||
723 | |||
709 | if (is_error) { | 724 | if (is_error) { |
710 | /* | 725 | /* |
711 | * set left_to_poll to 0 because in error state, we will not | 726 | * set left_to_poll to 0 because in error state, we will not |
712 | * get any additional CQEs | 727 | * get any additional CQEs |
713 | */ | 728 | */ |
714 | ehca_add_to_err_list(my_qp, 1); | 729 | my_qp->sq_map.next_wqe_idx = (my_qp->sq_map.tail + 1) % |
730 | my_qp->sq_map.entries; | ||
715 | my_qp->sq_map.left_to_poll = 0; | 731 | my_qp->sq_map.left_to_poll = 0; |
732 | ehca_add_to_err_list(my_qp, 1); | ||
716 | 733 | ||
734 | my_qp->rq_map.next_wqe_idx = (my_qp->rq_map.tail + 1) % | ||
735 | my_qp->rq_map.entries; | ||
736 | my_qp->rq_map.left_to_poll = 0; | ||
717 | if (HAS_RQ(my_qp)) | 737 | if (HAS_RQ(my_qp)) |
718 | ehca_add_to_err_list(my_qp, 0); | 738 | ehca_add_to_err_list(my_qp, 0); |
719 | my_qp->rq_map.left_to_poll = 0; | ||
720 | } | 739 | } |
721 | 740 | ||
722 | qmap_tail_idx = get_app_wr_id(cqe->work_request_id); | ||
723 | if (!(cqe->w_completion_flags & WC_SEND_RECEIVE_BIT)) | ||
724 | /* We got a send completion. */ | ||
725 | qmap = &my_qp->sq_map; | ||
726 | else | ||
727 | /* We got a receive completion. */ | ||
728 | qmap = &my_qp->rq_map; | ||
729 | |||
730 | qmap_entry = &qmap->map[qmap_tail_idx]; | 741 | qmap_entry = &qmap->map[qmap_tail_idx]; |
731 | if (qmap_entry->reported) { | 742 | if (qmap_entry->reported) { |
732 | ehca_warn(cq->device, "Double cqe on qp_num=%#x", | 743 | ehca_warn(cq->device, "Double cqe on qp_num=%#x", |
@@ -738,10 +749,6 @@ repoll: | |||
738 | wc->wr_id = replace_wr_id(cqe->work_request_id, qmap_entry->app_wr_id); | 749 | wc->wr_id = replace_wr_id(cqe->work_request_id, qmap_entry->app_wr_id); |
739 | qmap_entry->reported = 1; | 750 | qmap_entry->reported = 1; |
740 | 751 | ||
741 | /* this is a proper completion, we need to advance the tail pointer */ | ||
742 | if (++qmap->tail == qmap->entries) | ||
743 | qmap->tail = 0; | ||
744 | |||
745 | /* if left_to_poll is decremented to 0, add the QP to the error list */ | 752 | /* if left_to_poll is decremented to 0, add the QP to the error list */ |
746 | if (qmap->left_to_poll > 0) { | 753 | if (qmap->left_to_poll > 0) { |
747 | qmap->left_to_poll--; | 754 | qmap->left_to_poll--; |
@@ -805,13 +812,14 @@ static int generate_flush_cqes(struct ehca_qp *my_qp, struct ib_cq *cq, | |||
805 | else | 812 | else |
806 | qmap = &my_qp->rq_map; | 813 | qmap = &my_qp->rq_map; |
807 | 814 | ||
808 | qmap_entry = &qmap->map[qmap->tail]; | 815 | qmap_entry = &qmap->map[qmap->next_wqe_idx]; |
809 | 816 | ||
810 | while ((nr < num_entries) && (qmap_entry->reported == 0)) { | 817 | while ((nr < num_entries) && (qmap_entry->reported == 0)) { |
811 | /* generate flush CQE */ | 818 | /* generate flush CQE */ |
819 | |||
812 | memset(wc, 0, sizeof(*wc)); | 820 | memset(wc, 0, sizeof(*wc)); |
813 | 821 | ||
814 | offset = qmap->tail * ipz_queue->qe_size; | 822 | offset = qmap->next_wqe_idx * ipz_queue->qe_size; |
815 | wqe = (struct ehca_wqe *)ipz_qeit_calc(ipz_queue, offset); | 823 | wqe = (struct ehca_wqe *)ipz_qeit_calc(ipz_queue, offset); |
816 | if (!wqe) { | 824 | if (!wqe) { |
817 | ehca_err(cq->device, "Invalid wqe offset=%#lx on " | 825 | ehca_err(cq->device, "Invalid wqe offset=%#lx on " |
@@ -850,11 +858,12 @@ static int generate_flush_cqes(struct ehca_qp *my_qp, struct ib_cq *cq, | |||
850 | 858 | ||
851 | wc->qp = &my_qp->ib_qp; | 859 | wc->qp = &my_qp->ib_qp; |
852 | 860 | ||
853 | /* mark as reported and advance tail pointer */ | 861 | /* mark as reported and advance next_wqe pointer */ |
854 | qmap_entry->reported = 1; | 862 | qmap_entry->reported = 1; |
855 | if (++qmap->tail == qmap->entries) | 863 | qmap->next_wqe_idx++; |
856 | qmap->tail = 0; | 864 | if (qmap->next_wqe_idx == qmap->entries) |
857 | qmap_entry = &qmap->map[qmap->tail]; | 865 | qmap->next_wqe_idx = 0; |
866 | qmap_entry = &qmap->map[qmap->next_wqe_idx]; | ||
858 | 867 | ||
859 | wc++; nr++; | 868 | wc++; nr++; |
860 | } | 869 | } |
diff --git a/drivers/infiniband/hw/ipath/ipath_ruc.c b/drivers/infiniband/hw/ipath/ipath_ruc.c index fc0f6d9e6030..2296832f94da 100644 --- a/drivers/infiniband/hw/ipath/ipath_ruc.c +++ b/drivers/infiniband/hw/ipath/ipath_ruc.c | |||
@@ -156,7 +156,7 @@ bail: | |||
156 | /** | 156 | /** |
157 | * ipath_get_rwqe - copy the next RWQE into the QP's RWQE | 157 | * ipath_get_rwqe - copy the next RWQE into the QP's RWQE |
158 | * @qp: the QP | 158 | * @qp: the QP |
159 | * @wr_id_only: update wr_id only, not SGEs | 159 | * @wr_id_only: update qp->r_wr_id only, not qp->r_sge |
160 | * | 160 | * |
161 | * Return 0 if no RWQE is available, otherwise return 1. | 161 | * Return 0 if no RWQE is available, otherwise return 1. |
162 | * | 162 | * |
@@ -173,8 +173,6 @@ int ipath_get_rwqe(struct ipath_qp *qp, int wr_id_only) | |||
173 | u32 tail; | 173 | u32 tail; |
174 | int ret; | 174 | int ret; |
175 | 175 | ||
176 | qp->r_sge.sg_list = qp->r_sg_list; | ||
177 | |||
178 | if (qp->ibqp.srq) { | 176 | if (qp->ibqp.srq) { |
179 | srq = to_isrq(qp->ibqp.srq); | 177 | srq = to_isrq(qp->ibqp.srq); |
180 | handler = srq->ibsrq.event_handler; | 178 | handler = srq->ibsrq.event_handler; |
@@ -206,8 +204,10 @@ int ipath_get_rwqe(struct ipath_qp *qp, int wr_id_only) | |||
206 | wqe = get_rwqe_ptr(rq, tail); | 204 | wqe = get_rwqe_ptr(rq, tail); |
207 | if (++tail >= rq->size) | 205 | if (++tail >= rq->size) |
208 | tail = 0; | 206 | tail = 0; |
209 | } while (!wr_id_only && !ipath_init_sge(qp, wqe, &qp->r_len, | 207 | if (wr_id_only) |
210 | &qp->r_sge)); | 208 | break; |
209 | qp->r_sge.sg_list = qp->r_sg_list; | ||
210 | } while (!ipath_init_sge(qp, wqe, &qp->r_len, &qp->r_sge)); | ||
211 | qp->r_wr_id = wqe->wr_id; | 211 | qp->r_wr_id = wqe->wr_id; |
212 | wq->tail = tail; | 212 | wq->tail = tail; |
213 | 213 | ||
diff --git a/drivers/infiniband/hw/mlx4/cq.c b/drivers/infiniband/hw/mlx4/cq.c index d0866a3636e2..18308494a195 100644 --- a/drivers/infiniband/hw/mlx4/cq.c +++ b/drivers/infiniband/hw/mlx4/cq.c | |||
@@ -343,6 +343,7 @@ int mlx4_ib_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *udata) | |||
343 | { | 343 | { |
344 | struct mlx4_ib_dev *dev = to_mdev(ibcq->device); | 344 | struct mlx4_ib_dev *dev = to_mdev(ibcq->device); |
345 | struct mlx4_ib_cq *cq = to_mcq(ibcq); | 345 | struct mlx4_ib_cq *cq = to_mcq(ibcq); |
346 | struct mlx4_mtt mtt; | ||
346 | int outst_cqe; | 347 | int outst_cqe; |
347 | int err; | 348 | int err; |
348 | 349 | ||
@@ -376,10 +377,13 @@ int mlx4_ib_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *udata) | |||
376 | goto out; | 377 | goto out; |
377 | } | 378 | } |
378 | 379 | ||
380 | mtt = cq->buf.mtt; | ||
381 | |||
379 | err = mlx4_cq_resize(dev->dev, &cq->mcq, entries, &cq->resize_buf->buf.mtt); | 382 | err = mlx4_cq_resize(dev->dev, &cq->mcq, entries, &cq->resize_buf->buf.mtt); |
380 | if (err) | 383 | if (err) |
381 | goto err_buf; | 384 | goto err_buf; |
382 | 385 | ||
386 | mlx4_mtt_cleanup(dev->dev, &mtt); | ||
383 | if (ibcq->uobject) { | 387 | if (ibcq->uobject) { |
384 | cq->buf = cq->resize_buf->buf; | 388 | cq->buf = cq->resize_buf->buf; |
385 | cq->ibcq.cqe = cq->resize_buf->cqe; | 389 | cq->ibcq.cqe = cq->resize_buf->cqe; |
@@ -406,6 +410,7 @@ int mlx4_ib_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *udata) | |||
406 | goto out; | 410 | goto out; |
407 | 411 | ||
408 | err_buf: | 412 | err_buf: |
413 | mlx4_mtt_cleanup(dev->dev, &cq->resize_buf->buf.mtt); | ||
409 | if (!ibcq->uobject) | 414 | if (!ibcq->uobject) |
410 | mlx4_ib_free_cq_buf(dev, &cq->resize_buf->buf, | 415 | mlx4_ib_free_cq_buf(dev, &cq->resize_buf->buf, |
411 | cq->resize_buf->cqe); | 416 | cq->resize_buf->cqe); |
diff --git a/drivers/infiniband/hw/mlx4/mr.c b/drivers/infiniband/hw/mlx4/mr.c index 87f5c5a87b98..8e4d26d56a95 100644 --- a/drivers/infiniband/hw/mlx4/mr.c +++ b/drivers/infiniband/hw/mlx4/mr.c | |||
@@ -205,6 +205,7 @@ struct ib_mr *mlx4_ib_alloc_fast_reg_mr(struct ib_pd *pd, | |||
205 | goto err_mr; | 205 | goto err_mr; |
206 | 206 | ||
207 | mr->ibmr.rkey = mr->ibmr.lkey = mr->mmr.key; | 207 | mr->ibmr.rkey = mr->ibmr.lkey = mr->mmr.key; |
208 | mr->umem = NULL; | ||
208 | 209 | ||
209 | return &mr->ibmr; | 210 | return &mr->ibmr; |
210 | 211 | ||
diff --git a/drivers/infiniband/hw/nes/nes.c b/drivers/infiniband/hw/nes/nes.c index a2b04d62b1a4..aa1dc41f04c8 100644 --- a/drivers/infiniband/hw/nes/nes.c +++ b/drivers/infiniband/hw/nes/nes.c | |||
@@ -95,6 +95,10 @@ unsigned int wqm_quanta = 0x10000; | |||
95 | module_param(wqm_quanta, int, 0644); | 95 | module_param(wqm_quanta, int, 0644); |
96 | MODULE_PARM_DESC(wqm_quanta, "WQM quanta"); | 96 | MODULE_PARM_DESC(wqm_quanta, "WQM quanta"); |
97 | 97 | ||
98 | static unsigned int limit_maxrdreqsz; | ||
99 | module_param(limit_maxrdreqsz, bool, 0644); | ||
100 | MODULE_PARM_DESC(limit_maxrdreqsz, "Limit max read request size to 256 Bytes"); | ||
101 | |||
98 | LIST_HEAD(nes_adapter_list); | 102 | LIST_HEAD(nes_adapter_list); |
99 | static LIST_HEAD(nes_dev_list); | 103 | static LIST_HEAD(nes_dev_list); |
100 | 104 | ||
@@ -588,6 +592,18 @@ static int __devinit nes_probe(struct pci_dev *pcidev, const struct pci_device_i | |||
588 | nesdev->nesadapter->port_count; | 592 | nesdev->nesadapter->port_count; |
589 | } | 593 | } |
590 | 594 | ||
595 | if ((limit_maxrdreqsz || | ||
596 | ((nesdev->nesadapter->phy_type[0] == NES_PHY_TYPE_GLADIUS) && | ||
597 | (hw_rev == NE020_REV1))) && | ||
598 | (pcie_get_readrq(pcidev) > 256)) { | ||
599 | if (pcie_set_readrq(pcidev, 256)) | ||
600 | printk(KERN_ERR PFX "Unable to set max read request" | ||
601 | " to 256 bytes\n"); | ||
602 | else | ||
603 | nes_debug(NES_DBG_INIT, "Max read request size set" | ||
604 | " to 256 bytes\n"); | ||
605 | } | ||
606 | |||
591 | tasklet_init(&nesdev->dpc_tasklet, nes_dpc, (unsigned long)nesdev); | 607 | tasklet_init(&nesdev->dpc_tasklet, nes_dpc, (unsigned long)nesdev); |
592 | 608 | ||
593 | /* bring up the Control QP */ | 609 | /* bring up the Control QP */ |
diff --git a/drivers/infiniband/hw/nes/nes_hw.h b/drivers/infiniband/hw/nes/nes_hw.h index 610b9d859597..bc0b4de04450 100644 --- a/drivers/infiniband/hw/nes/nes_hw.h +++ b/drivers/infiniband/hw/nes/nes_hw.h | |||
@@ -40,6 +40,7 @@ | |||
40 | #define NES_PHY_TYPE_ARGUS 4 | 40 | #define NES_PHY_TYPE_ARGUS 4 |
41 | #define NES_PHY_TYPE_PUMA_1G 5 | 41 | #define NES_PHY_TYPE_PUMA_1G 5 |
42 | #define NES_PHY_TYPE_PUMA_10G 6 | 42 | #define NES_PHY_TYPE_PUMA_10G 6 |
43 | #define NES_PHY_TYPE_GLADIUS 7 | ||
43 | 44 | ||
44 | #define NES_MULTICAST_PF_MAX 8 | 45 | #define NES_MULTICAST_PF_MAX 8 |
45 | 46 | ||
diff --git a/drivers/infiniband/hw/nes/nes_verbs.c b/drivers/infiniband/hw/nes/nes_verbs.c index 932e56fcf774..d36c9a0bf1bb 100644 --- a/drivers/infiniband/hw/nes/nes_verbs.c +++ b/drivers/infiniband/hw/nes/nes_verbs.c | |||
@@ -220,14 +220,14 @@ static int nes_bind_mw(struct ib_qp *ibqp, struct ib_mw *ibmw, | |||
220 | if (nesqp->ibqp_state > IB_QPS_RTS) | 220 | if (nesqp->ibqp_state > IB_QPS_RTS) |
221 | return -EINVAL; | 221 | return -EINVAL; |
222 | 222 | ||
223 | spin_lock_irqsave(&nesqp->lock, flags); | 223 | spin_lock_irqsave(&nesqp->lock, flags); |
224 | 224 | ||
225 | head = nesqp->hwqp.sq_head; | 225 | head = nesqp->hwqp.sq_head; |
226 | qsize = nesqp->hwqp.sq_tail; | 226 | qsize = nesqp->hwqp.sq_tail; |
227 | 227 | ||
228 | /* Check for SQ overflow */ | 228 | /* Check for SQ overflow */ |
229 | if (((head + (2 * qsize) - nesqp->hwqp.sq_tail) % qsize) == (qsize - 1)) { | 229 | if (((head + (2 * qsize) - nesqp->hwqp.sq_tail) % qsize) == (qsize - 1)) { |
230 | spin_unlock_irqrestore(&nesqp->lock, flags); | 230 | spin_unlock_irqrestore(&nesqp->lock, flags); |
231 | return -EINVAL; | 231 | return -EINVAL; |
232 | } | 232 | } |
233 | 233 | ||
@@ -269,7 +269,7 @@ static int nes_bind_mw(struct ib_qp *ibqp, struct ib_mw *ibmw, | |||
269 | nes_write32(nesdev->regs+NES_WQE_ALLOC, | 269 | nes_write32(nesdev->regs+NES_WQE_ALLOC, |
270 | (1 << 24) | 0x00800000 | nesqp->hwqp.qp_id); | 270 | (1 << 24) | 0x00800000 | nesqp->hwqp.qp_id); |
271 | 271 | ||
272 | spin_unlock_irqrestore(&nesqp->lock, flags); | 272 | spin_unlock_irqrestore(&nesqp->lock, flags); |
273 | 273 | ||
274 | return 0; | 274 | return 0; |
275 | } | 275 | } |
@@ -349,7 +349,7 @@ static struct ib_fmr *nes_alloc_fmr(struct ib_pd *ibpd, | |||
349 | if (nesfmr->nesmr.pbls_used > nesadapter->free_4kpbl) { | 349 | if (nesfmr->nesmr.pbls_used > nesadapter->free_4kpbl) { |
350 | spin_unlock_irqrestore(&nesadapter->pbl_lock, flags); | 350 | spin_unlock_irqrestore(&nesadapter->pbl_lock, flags); |
351 | ret = -ENOMEM; | 351 | ret = -ENOMEM; |
352 | goto failed_vpbl_alloc; | 352 | goto failed_vpbl_avail; |
353 | } else { | 353 | } else { |
354 | nesadapter->free_4kpbl -= nesfmr->nesmr.pbls_used; | 354 | nesadapter->free_4kpbl -= nesfmr->nesmr.pbls_used; |
355 | } | 355 | } |
@@ -357,7 +357,7 @@ static struct ib_fmr *nes_alloc_fmr(struct ib_pd *ibpd, | |||
357 | if (nesfmr->nesmr.pbls_used > nesadapter->free_256pbl) { | 357 | if (nesfmr->nesmr.pbls_used > nesadapter->free_256pbl) { |
358 | spin_unlock_irqrestore(&nesadapter->pbl_lock, flags); | 358 | spin_unlock_irqrestore(&nesadapter->pbl_lock, flags); |
359 | ret = -ENOMEM; | 359 | ret = -ENOMEM; |
360 | goto failed_vpbl_alloc; | 360 | goto failed_vpbl_avail; |
361 | } else { | 361 | } else { |
362 | nesadapter->free_256pbl -= nesfmr->nesmr.pbls_used; | 362 | nesadapter->free_256pbl -= nesfmr->nesmr.pbls_used; |
363 | } | 363 | } |
@@ -391,14 +391,14 @@ static struct ib_fmr *nes_alloc_fmr(struct ib_pd *ibpd, | |||
391 | goto failed_vpbl_alloc; | 391 | goto failed_vpbl_alloc; |
392 | } | 392 | } |
393 | 393 | ||
394 | nesfmr->root_vpbl.leaf_vpbl = kzalloc(sizeof(*nesfmr->root_vpbl.leaf_vpbl)*1024, GFP_KERNEL); | 394 | nesfmr->leaf_pbl_cnt = nesfmr->nesmr.pbls_used-1; |
395 | nesfmr->root_vpbl.leaf_vpbl = kzalloc(sizeof(*nesfmr->root_vpbl.leaf_vpbl)*1024, GFP_ATOMIC); | ||
395 | if (!nesfmr->root_vpbl.leaf_vpbl) { | 396 | if (!nesfmr->root_vpbl.leaf_vpbl) { |
396 | spin_unlock_irqrestore(&nesadapter->pbl_lock, flags); | 397 | spin_unlock_irqrestore(&nesadapter->pbl_lock, flags); |
397 | ret = -ENOMEM; | 398 | ret = -ENOMEM; |
398 | goto failed_leaf_vpbl_alloc; | 399 | goto failed_leaf_vpbl_alloc; |
399 | } | 400 | } |
400 | 401 | ||
401 | nesfmr->leaf_pbl_cnt = nesfmr->nesmr.pbls_used-1; | ||
402 | nes_debug(NES_DBG_MR, "two level pbl, root_vpbl.pbl_vbase=%p" | 402 | nes_debug(NES_DBG_MR, "two level pbl, root_vpbl.pbl_vbase=%p" |
403 | " leaf_pbl_cnt=%d root_vpbl.leaf_vpbl=%p\n", | 403 | " leaf_pbl_cnt=%d root_vpbl.leaf_vpbl=%p\n", |
404 | nesfmr->root_vpbl.pbl_vbase, nesfmr->leaf_pbl_cnt, nesfmr->root_vpbl.leaf_vpbl); | 404 | nesfmr->root_vpbl.pbl_vbase, nesfmr->leaf_pbl_cnt, nesfmr->root_vpbl.leaf_vpbl); |
@@ -519,6 +519,16 @@ static struct ib_fmr *nes_alloc_fmr(struct ib_pd *ibpd, | |||
519 | nesfmr->root_vpbl.pbl_pbase); | 519 | nesfmr->root_vpbl.pbl_pbase); |
520 | 520 | ||
521 | failed_vpbl_alloc: | 521 | failed_vpbl_alloc: |
522 | if (nesfmr->nesmr.pbls_used != 0) { | ||
523 | spin_lock_irqsave(&nesadapter->pbl_lock, flags); | ||
524 | if (nesfmr->nesmr.pbl_4k) | ||
525 | nesadapter->free_4kpbl += nesfmr->nesmr.pbls_used; | ||
526 | else | ||
527 | nesadapter->free_256pbl += nesfmr->nesmr.pbls_used; | ||
528 | spin_unlock_irqrestore(&nesadapter->pbl_lock, flags); | ||
529 | } | ||
530 | |||
531 | failed_vpbl_avail: | ||
522 | kfree(nesfmr); | 532 | kfree(nesfmr); |
523 | 533 | ||
524 | failed_fmr_alloc: | 534 | failed_fmr_alloc: |
@@ -534,18 +544,14 @@ static struct ib_fmr *nes_alloc_fmr(struct ib_pd *ibpd, | |||
534 | */ | 544 | */ |
535 | static int nes_dealloc_fmr(struct ib_fmr *ibfmr) | 545 | static int nes_dealloc_fmr(struct ib_fmr *ibfmr) |
536 | { | 546 | { |
547 | unsigned long flags; | ||
537 | struct nes_mr *nesmr = to_nesmr_from_ibfmr(ibfmr); | 548 | struct nes_mr *nesmr = to_nesmr_from_ibfmr(ibfmr); |
538 | struct nes_fmr *nesfmr = to_nesfmr(nesmr); | 549 | struct nes_fmr *nesfmr = to_nesfmr(nesmr); |
539 | struct nes_vnic *nesvnic = to_nesvnic(ibfmr->device); | 550 | struct nes_vnic *nesvnic = to_nesvnic(ibfmr->device); |
540 | struct nes_device *nesdev = nesvnic->nesdev; | 551 | struct nes_device *nesdev = nesvnic->nesdev; |
541 | struct nes_mr temp_nesmr = *nesmr; | 552 | struct nes_adapter *nesadapter = nesdev->nesadapter; |
542 | int i = 0; | 553 | int i = 0; |
543 | 554 | ||
544 | temp_nesmr.ibmw.device = ibfmr->device; | ||
545 | temp_nesmr.ibmw.pd = ibfmr->pd; | ||
546 | temp_nesmr.ibmw.rkey = ibfmr->rkey; | ||
547 | temp_nesmr.ibmw.uobject = NULL; | ||
548 | |||
549 | /* free the resources */ | 555 | /* free the resources */ |
550 | if (nesfmr->leaf_pbl_cnt == 0) { | 556 | if (nesfmr->leaf_pbl_cnt == 0) { |
551 | /* single PBL case */ | 557 | /* single PBL case */ |
@@ -561,8 +567,24 @@ static int nes_dealloc_fmr(struct ib_fmr *ibfmr) | |||
561 | pci_free_consistent(nesdev->pcidev, 8192, nesfmr->root_vpbl.pbl_vbase, | 567 | pci_free_consistent(nesdev->pcidev, 8192, nesfmr->root_vpbl.pbl_vbase, |
562 | nesfmr->root_vpbl.pbl_pbase); | 568 | nesfmr->root_vpbl.pbl_pbase); |
563 | } | 569 | } |
570 | nesmr->ibmw.device = ibfmr->device; | ||
571 | nesmr->ibmw.pd = ibfmr->pd; | ||
572 | nesmr->ibmw.rkey = ibfmr->rkey; | ||
573 | nesmr->ibmw.uobject = NULL; | ||
564 | 574 | ||
565 | return nes_dealloc_mw(&temp_nesmr.ibmw); | 575 | if (nesfmr->nesmr.pbls_used != 0) { |
576 | spin_lock_irqsave(&nesadapter->pbl_lock, flags); | ||
577 | if (nesfmr->nesmr.pbl_4k) { | ||
578 | nesadapter->free_4kpbl += nesfmr->nesmr.pbls_used; | ||
579 | WARN_ON(nesadapter->free_4kpbl > nesadapter->max_4kpbl); | ||
580 | } else { | ||
581 | nesadapter->free_256pbl += nesfmr->nesmr.pbls_used; | ||
582 | WARN_ON(nesadapter->free_256pbl > nesadapter->max_256pbl); | ||
583 | } | ||
584 | spin_unlock_irqrestore(&nesadapter->pbl_lock, flags); | ||
585 | } | ||
586 | |||
587 | return nes_dealloc_mw(&nesmr->ibmw); | ||
566 | } | 588 | } |
567 | 589 | ||
568 | 590 | ||
@@ -1595,7 +1617,7 @@ static struct ib_cq *nes_create_cq(struct ib_device *ibdev, int entries, | |||
1595 | nes_ucontext->mcrqf = req.mcrqf; | 1617 | nes_ucontext->mcrqf = req.mcrqf; |
1596 | if (nes_ucontext->mcrqf) { | 1618 | if (nes_ucontext->mcrqf) { |
1597 | if (nes_ucontext->mcrqf & 0x80000000) | 1619 | if (nes_ucontext->mcrqf & 0x80000000) |
1598 | nescq->hw_cq.cq_number = nesvnic->nic.qp_id + 12 + (nes_ucontext->mcrqf & 0xf) - 1; | 1620 | nescq->hw_cq.cq_number = nesvnic->nic.qp_id + 28 + 2 * ((nes_ucontext->mcrqf & 0xf) - 1); |
1599 | else if (nes_ucontext->mcrqf & 0x40000000) | 1621 | else if (nes_ucontext->mcrqf & 0x40000000) |
1600 | nescq->hw_cq.cq_number = nes_ucontext->mcrqf & 0xffff; | 1622 | nescq->hw_cq.cq_number = nes_ucontext->mcrqf & 0xffff; |
1601 | else | 1623 | else |
@@ -3212,7 +3234,7 @@ static int nes_post_send(struct ib_qp *ibqp, struct ib_send_wr *ib_wr, | |||
3212 | if (nesqp->ibqp_state > IB_QPS_RTS) | 3234 | if (nesqp->ibqp_state > IB_QPS_RTS) |
3213 | return -EINVAL; | 3235 | return -EINVAL; |
3214 | 3236 | ||
3215 | spin_lock_irqsave(&nesqp->lock, flags); | 3237 | spin_lock_irqsave(&nesqp->lock, flags); |
3216 | 3238 | ||
3217 | head = nesqp->hwqp.sq_head; | 3239 | head = nesqp->hwqp.sq_head; |
3218 | 3240 | ||
@@ -3337,7 +3359,7 @@ static int nes_post_send(struct ib_qp *ibqp, struct ib_send_wr *ib_wr, | |||
3337 | (counter << 24) | 0x00800000 | nesqp->hwqp.qp_id); | 3359 | (counter << 24) | 0x00800000 | nesqp->hwqp.qp_id); |
3338 | } | 3360 | } |
3339 | 3361 | ||
3340 | spin_unlock_irqrestore(&nesqp->lock, flags); | 3362 | spin_unlock_irqrestore(&nesqp->lock, flags); |
3341 | 3363 | ||
3342 | if (err) | 3364 | if (err) |
3343 | *bad_wr = ib_wr; | 3365 | *bad_wr = ib_wr; |
@@ -3368,7 +3390,7 @@ static int nes_post_recv(struct ib_qp *ibqp, struct ib_recv_wr *ib_wr, | |||
3368 | if (nesqp->ibqp_state > IB_QPS_RTS) | 3390 | if (nesqp->ibqp_state > IB_QPS_RTS) |
3369 | return -EINVAL; | 3391 | return -EINVAL; |
3370 | 3392 | ||
3371 | spin_lock_irqsave(&nesqp->lock, flags); | 3393 | spin_lock_irqsave(&nesqp->lock, flags); |
3372 | 3394 | ||
3373 | head = nesqp->hwqp.rq_head; | 3395 | head = nesqp->hwqp.rq_head; |
3374 | 3396 | ||
@@ -3421,7 +3443,7 @@ static int nes_post_recv(struct ib_qp *ibqp, struct ib_recv_wr *ib_wr, | |||
3421 | nes_write32(nesdev->regs+NES_WQE_ALLOC, (counter<<24) | nesqp->hwqp.qp_id); | 3443 | nes_write32(nesdev->regs+NES_WQE_ALLOC, (counter<<24) | nesqp->hwqp.qp_id); |
3422 | } | 3444 | } |
3423 | 3445 | ||
3424 | spin_unlock_irqrestore(&nesqp->lock, flags); | 3446 | spin_unlock_irqrestore(&nesqp->lock, flags); |
3425 | 3447 | ||
3426 | if (err) | 3448 | if (err) |
3427 | *bad_wr = ib_wr; | 3449 | *bad_wr = ib_wr; |
@@ -3453,7 +3475,7 @@ static int nes_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *entry) | |||
3453 | 3475 | ||
3454 | nes_debug(NES_DBG_CQ, "\n"); | 3476 | nes_debug(NES_DBG_CQ, "\n"); |
3455 | 3477 | ||
3456 | spin_lock_irqsave(&nescq->lock, flags); | 3478 | spin_lock_irqsave(&nescq->lock, flags); |
3457 | 3479 | ||
3458 | head = nescq->hw_cq.cq_head; | 3480 | head = nescq->hw_cq.cq_head; |
3459 | cq_size = nescq->hw_cq.cq_size; | 3481 | cq_size = nescq->hw_cq.cq_size; |
@@ -3562,7 +3584,7 @@ static int nes_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *entry) | |||
3562 | nes_debug(NES_DBG_CQ, "Reporting %u completions for CQ%u.\n", | 3584 | nes_debug(NES_DBG_CQ, "Reporting %u completions for CQ%u.\n", |
3563 | cqe_count, nescq->hw_cq.cq_number); | 3585 | cqe_count, nescq->hw_cq.cq_number); |
3564 | 3586 | ||
3565 | spin_unlock_irqrestore(&nescq->lock, flags); | 3587 | spin_unlock_irqrestore(&nescq->lock, flags); |
3566 | 3588 | ||
3567 | return cqe_count; | 3589 | return cqe_count; |
3568 | } | 3590 | } |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c index fddded7900d1..85257f6b9576 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_main.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c | |||
@@ -106,12 +106,13 @@ int ipoib_open(struct net_device *dev) | |||
106 | 106 | ||
107 | ipoib_dbg(priv, "bringing up interface\n"); | 107 | ipoib_dbg(priv, "bringing up interface\n"); |
108 | 108 | ||
109 | napi_enable(&priv->napi); | ||
110 | set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags); | 109 | set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags); |
111 | 110 | ||
112 | if (ipoib_pkey_dev_delay_open(dev)) | 111 | if (ipoib_pkey_dev_delay_open(dev)) |
113 | return 0; | 112 | return 0; |
114 | 113 | ||
114 | napi_enable(&priv->napi); | ||
115 | |||
115 | if (ipoib_ib_dev_open(dev)) { | 116 | if (ipoib_ib_dev_open(dev)) { |
116 | napi_disable(&priv->napi); | 117 | napi_disable(&priv->napi); |
117 | return -EINVAL; | 118 | return -EINVAL; |
@@ -546,6 +547,7 @@ static int path_rec_start(struct net_device *dev, | |||
546 | if (path->query_id < 0) { | 547 | if (path->query_id < 0) { |
547 | ipoib_warn(priv, "ib_sa_path_rec_get failed: %d\n", path->query_id); | 548 | ipoib_warn(priv, "ib_sa_path_rec_get failed: %d\n", path->query_id); |
548 | path->query = NULL; | 549 | path->query = NULL; |
550 | complete(&path->done); | ||
549 | return path->query_id; | 551 | return path->query_id; |
550 | } | 552 | } |
551 | 553 | ||
@@ -662,7 +664,7 @@ static void unicast_arp_send(struct sk_buff *skb, struct net_device *dev, | |||
662 | skb_push(skb, sizeof *phdr); | 664 | skb_push(skb, sizeof *phdr); |
663 | __skb_queue_tail(&path->queue, skb); | 665 | __skb_queue_tail(&path->queue, skb); |
664 | 666 | ||
665 | if (path_rec_start(dev, path)) { | 667 | if (!path->query && path_rec_start(dev, path)) { |
666 | spin_unlock_irqrestore(&priv->lock, flags); | 668 | spin_unlock_irqrestore(&priv->lock, flags); |
667 | path_free(dev, path); | 669 | path_free(dev, path); |
668 | return; | 670 | return; |
diff --git a/drivers/input/ff-memless.c b/drivers/input/ff-memless.c index 6790e975a98c..bc4e40f3ede7 100644 --- a/drivers/input/ff-memless.c +++ b/drivers/input/ff-memless.c | |||
@@ -397,8 +397,9 @@ static int ml_ff_playback(struct input_dev *dev, int effect_id, int value) | |||
397 | { | 397 | { |
398 | struct ml_device *ml = dev->ff->private; | 398 | struct ml_device *ml = dev->ff->private; |
399 | struct ml_effect_state *state = &ml->states[effect_id]; | 399 | struct ml_effect_state *state = &ml->states[effect_id]; |
400 | unsigned long flags; | ||
400 | 401 | ||
401 | spin_lock_bh(&ml->timer_lock); | 402 | spin_lock_irqsave(&ml->timer_lock, flags); |
402 | 403 | ||
403 | if (value > 0) { | 404 | if (value > 0) { |
404 | debug("initiated play"); | 405 | debug("initiated play"); |
@@ -424,7 +425,7 @@ static int ml_ff_playback(struct input_dev *dev, int effect_id, int value) | |||
424 | ml_play_effects(ml); | 425 | ml_play_effects(ml); |
425 | } | 426 | } |
426 | 427 | ||
427 | spin_unlock_bh(&ml->timer_lock); | 428 | spin_unlock_irqrestore(&ml->timer_lock, flags); |
428 | 429 | ||
429 | return 0; | 430 | return 0; |
430 | } | 431 | } |
diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c index 22016ca15351..379b7ff354ec 100644 --- a/drivers/input/keyboard/atkbd.c +++ b/drivers/input/keyboard/atkbd.c | |||
@@ -824,7 +824,7 @@ static void atkbd_disconnect(struct serio *serio) | |||
824 | atkbd_disable(atkbd); | 824 | atkbd_disable(atkbd); |
825 | 825 | ||
826 | /* make sure we don't have a command in flight */ | 826 | /* make sure we don't have a command in flight */ |
827 | flush_scheduled_work(); | 827 | cancel_delayed_work_sync(&atkbd->event_work); |
828 | 828 | ||
829 | sysfs_remove_group(&serio->dev.kobj, &atkbd_attribute_group); | 829 | sysfs_remove_group(&serio->dev.kobj, &atkbd_attribute_group); |
830 | input_unregister_device(atkbd->dev); | 830 | input_unregister_device(atkbd->dev); |
@@ -868,6 +868,22 @@ static void atkbd_hp_keymap_fixup(struct atkbd *atkbd) | |||
868 | } | 868 | } |
869 | 869 | ||
870 | /* | 870 | /* |
871 | * Inventec system with broken key release on volume keys | ||
872 | */ | ||
873 | static void atkbd_inventec_keymap_fixup(struct atkbd *atkbd) | ||
874 | { | ||
875 | const unsigned int forced_release_keys[] = { | ||
876 | 0xae, 0xb0, | ||
877 | }; | ||
878 | int i; | ||
879 | |||
880 | if (atkbd->set == 2) | ||
881 | for (i = 0; i < ARRAY_SIZE(forced_release_keys); i++) | ||
882 | __set_bit(forced_release_keys[i], | ||
883 | atkbd->force_release_mask); | ||
884 | } | ||
885 | |||
886 | /* | ||
871 | * atkbd_set_keycode_table() initializes keyboard's keycode table | 887 | * atkbd_set_keycode_table() initializes keyboard's keycode table |
872 | * according to the selected scancode set | 888 | * according to the selected scancode set |
873 | */ | 889 | */ |
@@ -1468,6 +1484,15 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = { | |||
1468 | .callback = atkbd_setup_fixup, | 1484 | .callback = atkbd_setup_fixup, |
1469 | .driver_data = atkbd_hp_keymap_fixup, | 1485 | .driver_data = atkbd_hp_keymap_fixup, |
1470 | }, | 1486 | }, |
1487 | { | ||
1488 | .ident = "Inventec Symphony", | ||
1489 | .matches = { | ||
1490 | DMI_MATCH(DMI_SYS_VENDOR, "INVENTEC"), | ||
1491 | DMI_MATCH(DMI_PRODUCT_NAME, "SYMPHONY 6.0/7.0"), | ||
1492 | }, | ||
1493 | .callback = atkbd_setup_fixup, | ||
1494 | .driver_data = atkbd_inventec_keymap_fixup, | ||
1495 | }, | ||
1471 | { } | 1496 | { } |
1472 | }; | 1497 | }; |
1473 | 1498 | ||
diff --git a/drivers/input/misc/cm109.c b/drivers/input/misc/cm109.c index bce160f4349b..86457feccfc4 100644 --- a/drivers/input/misc/cm109.c +++ b/drivers/input/misc/cm109.c | |||
@@ -42,7 +42,7 @@ | |||
42 | 42 | ||
43 | static char *phone = "kip1000"; | 43 | static char *phone = "kip1000"; |
44 | module_param(phone, charp, S_IRUSR); | 44 | module_param(phone, charp, S_IRUSR); |
45 | MODULE_PARM_DESC(phone, "Phone name {kip1000, gtalk, usbph01}"); | 45 | MODULE_PARM_DESC(phone, "Phone name {kip1000, gtalk, usbph01, atcom}"); |
46 | 46 | ||
47 | enum { | 47 | enum { |
48 | /* HID Registers */ | 48 | /* HID Registers */ |
@@ -258,6 +258,37 @@ static unsigned short keymap_usbph01(int scancode) | |||
258 | } | 258 | } |
259 | } | 259 | } |
260 | 260 | ||
261 | /* | ||
262 | * Keymap for ATCom AU-100 | ||
263 | * http://www.atcom.cn/En_products_AU100.html | ||
264 | * http://www.packetizer.com/products/au100/ | ||
265 | * http://www.voip-info.org/wiki/view/AU-100 | ||
266 | * | ||
267 | * Contributed by daniel@gimpelevich.san-francisco.ca.us | ||
268 | */ | ||
269 | static unsigned short keymap_atcom(int scancode) | ||
270 | { | ||
271 | switch (scancode) { /* phone key: */ | ||
272 | case 0x82: return KEY_NUMERIC_0; /* 0 */ | ||
273 | case 0x11: return KEY_NUMERIC_1; /* 1 */ | ||
274 | case 0x12: return KEY_NUMERIC_2; /* 2 */ | ||
275 | case 0x14: return KEY_NUMERIC_3; /* 3 */ | ||
276 | case 0x21: return KEY_NUMERIC_4; /* 4 */ | ||
277 | case 0x22: return KEY_NUMERIC_5; /* 5 */ | ||
278 | case 0x24: return KEY_NUMERIC_6; /* 6 */ | ||
279 | case 0x41: return KEY_NUMERIC_7; /* 7 */ | ||
280 | case 0x42: return KEY_NUMERIC_8; /* 8 */ | ||
281 | case 0x44: return KEY_NUMERIC_9; /* 9 */ | ||
282 | case 0x84: return KEY_NUMERIC_POUND; /* # */ | ||
283 | case 0x81: return KEY_NUMERIC_STAR; /* * */ | ||
284 | case 0x18: return KEY_ENTER; /* pickup */ | ||
285 | case 0x28: return KEY_ESC; /* hangup */ | ||
286 | case 0x48: return KEY_LEFT; /* left arrow */ | ||
287 | case 0x88: return KEY_RIGHT; /* right arrow */ | ||
288 | default: return special_keymap(scancode); | ||
289 | } | ||
290 | } | ||
291 | |||
261 | static unsigned short (*keymap)(int) = keymap_kip1000; | 292 | static unsigned short (*keymap)(int) = keymap_kip1000; |
262 | 293 | ||
263 | /* | 294 | /* |
@@ -840,6 +871,10 @@ static int __init cm109_select_keymap(void) | |||
840 | keymap = keymap_usbph01; | 871 | keymap = keymap_usbph01; |
841 | printk(KERN_INFO KBUILD_MODNAME ": " | 872 | printk(KERN_INFO KBUILD_MODNAME ": " |
842 | "Keymap for Allied-Telesis Corega USBPH01 phone loaded\n"); | 873 | "Keymap for Allied-Telesis Corega USBPH01 phone loaded\n"); |
874 | } else if (!strcasecmp(phone, "atcom")) { | ||
875 | keymap = keymap_atcom; | ||
876 | printk(KERN_INFO KBUILD_MODNAME ": " | ||
877 | "Keymap for ATCom AU-100 phone loaded\n"); | ||
843 | } else { | 878 | } else { |
844 | printk(KERN_ERR KBUILD_MODNAME ": " | 879 | printk(KERN_ERR KBUILD_MODNAME ": " |
845 | "Unsupported phone: %s\n", phone); | 880 | "Unsupported phone: %s\n", phone); |
diff --git a/drivers/input/mouse/hgpk.c b/drivers/input/mouse/hgpk.c index e82d34201e97..88f04bf2ad6c 100644 --- a/drivers/input/mouse/hgpk.c +++ b/drivers/input/mouse/hgpk.c | |||
@@ -125,7 +125,7 @@ static void hgpk_spewing_hack(struct psmouse *psmouse, | |||
125 | */ | 125 | */ |
126 | static int hgpk_validate_byte(unsigned char *packet) | 126 | static int hgpk_validate_byte(unsigned char *packet) |
127 | { | 127 | { |
128 | return (packet[0] & 0x0C) == 0x08; | 128 | return (packet[0] & 0x0C) != 0x08; |
129 | } | 129 | } |
130 | 130 | ||
131 | static void hgpk_process_packet(struct psmouse *psmouse) | 131 | static void hgpk_process_packet(struct psmouse *psmouse) |
diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h index eec375cd10e6..29e686388a2c 100644 --- a/drivers/input/serio/i8042-x86ia64io.h +++ b/drivers/input/serio/i8042-x86ia64io.h | |||
@@ -337,6 +337,20 @@ static struct dmi_system_id __initdata i8042_dmi_nomux_table[] = { | |||
337 | DMI_MATCH(DMI_PRODUCT_NAME, "2656"), | 337 | DMI_MATCH(DMI_PRODUCT_NAME, "2656"), |
338 | }, | 338 | }, |
339 | }, | 339 | }, |
340 | { | ||
341 | .ident = "Dell XPS M1530", | ||
342 | .matches = { | ||
343 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
344 | DMI_MATCH(DMI_PRODUCT_NAME, "XPS M1530"), | ||
345 | }, | ||
346 | }, | ||
347 | { | ||
348 | .ident = "Compal HEL80I", | ||
349 | .matches = { | ||
350 | DMI_MATCH(DMI_SYS_VENDOR, "COMPAL"), | ||
351 | DMI_MATCH(DMI_PRODUCT_NAME, "HEL80I"), | ||
352 | }, | ||
353 | }, | ||
340 | { } | 354 | { } |
341 | }; | 355 | }; |
342 | 356 | ||
diff --git a/drivers/input/tablet/wacom.h b/drivers/input/tablet/wacom.h index ca62ec639f8f..677680e9f54f 100644 --- a/drivers/input/tablet/wacom.h +++ b/drivers/input/tablet/wacom.h | |||
@@ -66,6 +66,7 @@ | |||
66 | * - Support Intuos3 4x6 | 66 | * - Support Intuos3 4x6 |
67 | * v1.47 (pc) - Added support for Bamboo | 67 | * v1.47 (pc) - Added support for Bamboo |
68 | * v1.48 (pc) - Added support for Bamboo1, BambooFun, and Cintiq 12WX | 68 | * v1.48 (pc) - Added support for Bamboo1, BambooFun, and Cintiq 12WX |
69 | * v1.49 (pc) - Added support for USB Tablet PC (0x90, 0x93, and 0x9A) | ||
69 | */ | 70 | */ |
70 | 71 | ||
71 | /* | 72 | /* |
@@ -86,7 +87,7 @@ | |||
86 | /* | 87 | /* |
87 | * Version Information | 88 | * Version Information |
88 | */ | 89 | */ |
89 | #define DRIVER_VERSION "v1.48" | 90 | #define DRIVER_VERSION "v1.49" |
90 | #define DRIVER_AUTHOR "Vojtech Pavlik <vojtech@ucw.cz>" | 91 | #define DRIVER_AUTHOR "Vojtech Pavlik <vojtech@ucw.cz>" |
91 | #define DRIVER_DESC "USB Wacom Graphire and Wacom Intuos tablet driver" | 92 | #define DRIVER_DESC "USB Wacom Graphire and Wacom Intuos tablet driver" |
92 | #define DRIVER_LICENSE "GPL" | 93 | #define DRIVER_LICENSE "GPL" |
@@ -103,15 +104,15 @@ struct wacom { | |||
103 | struct usb_device *usbdev; | 104 | struct usb_device *usbdev; |
104 | struct usb_interface *intf; | 105 | struct usb_interface *intf; |
105 | struct urb *irq; | 106 | struct urb *irq; |
106 | struct wacom_wac * wacom_wac; | 107 | struct wacom_wac *wacom_wac; |
107 | struct mutex lock; | 108 | struct mutex lock; |
108 | unsigned int open:1; | 109 | unsigned int open:1; |
109 | char phys[32]; | 110 | char phys[32]; |
110 | }; | 111 | }; |
111 | 112 | ||
112 | struct wacom_combo { | 113 | struct wacom_combo { |
113 | struct wacom * wacom; | 114 | struct wacom *wacom; |
114 | struct urb * urb; | 115 | struct urb *urb; |
115 | }; | 116 | }; |
116 | 117 | ||
117 | extern int wacom_wac_irq(struct wacom_wac * wacom_wac, void * wcombo); | 118 | extern int wacom_wac_irq(struct wacom_wac * wacom_wac, void * wcombo); |
@@ -132,7 +133,7 @@ extern void input_dev_mo(struct input_dev *input_dev, struct wacom_wac *wacom_wa | |||
132 | extern void input_dev_bee(struct input_dev *input_dev, struct wacom_wac *wacom_wac); | 133 | extern void input_dev_bee(struct input_dev *input_dev, struct wacom_wac *wacom_wac); |
133 | extern __u16 wacom_le16_to_cpu(unsigned char *data); | 134 | extern __u16 wacom_le16_to_cpu(unsigned char *data); |
134 | extern __u16 wacom_be16_to_cpu(unsigned char *data); | 135 | extern __u16 wacom_be16_to_cpu(unsigned char *data); |
135 | extern struct wacom_features * get_wacom_feature(const struct usb_device_id *id); | 136 | extern struct wacom_features *get_wacom_feature(const struct usb_device_id *id); |
136 | extern const struct usb_device_id * get_device_table(void); | 137 | extern const struct usb_device_id *get_device_table(void); |
137 | 138 | ||
138 | #endif | 139 | #endif |
diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c index 09e227aa0d49..484496daa0f3 100644 --- a/drivers/input/tablet/wacom_sys.c +++ b/drivers/input/tablet/wacom_sys.c | |||
@@ -14,8 +14,41 @@ | |||
14 | #include "wacom.h" | 14 | #include "wacom.h" |
15 | #include "wacom_wac.h" | 15 | #include "wacom_wac.h" |
16 | 16 | ||
17 | /* defines to get HID report descriptor */ | ||
18 | #define HID_DEVICET_HID (USB_TYPE_CLASS | 0x01) | ||
19 | #define HID_DEVICET_REPORT (USB_TYPE_CLASS | 0x02) | ||
20 | #define HID_USAGE_UNDEFINED 0x00 | ||
21 | #define HID_USAGE_PAGE 0x05 | ||
22 | #define HID_USAGE_PAGE_DIGITIZER 0x0d | ||
23 | #define HID_USAGE_PAGE_DESKTOP 0x01 | ||
24 | #define HID_USAGE 0x09 | ||
25 | #define HID_USAGE_X 0x30 | ||
26 | #define HID_USAGE_Y 0x31 | ||
27 | #define HID_USAGE_X_TILT 0x3d | ||
28 | #define HID_USAGE_Y_TILT 0x3e | ||
29 | #define HID_USAGE_FINGER 0x22 | ||
30 | #define HID_USAGE_STYLUS 0x20 | ||
31 | #define HID_COLLECTION 0xc0 | ||
32 | |||
33 | enum { | ||
34 | WCM_UNDEFINED = 0, | ||
35 | WCM_DESKTOP, | ||
36 | WCM_DIGITIZER, | ||
37 | }; | ||
38 | |||
39 | struct hid_descriptor { | ||
40 | struct usb_descriptor_header header; | ||
41 | __le16 bcdHID; | ||
42 | u8 bCountryCode; | ||
43 | u8 bNumDescriptors; | ||
44 | u8 bDescriptorType; | ||
45 | __le16 wDescriptorLength; | ||
46 | } __attribute__ ((packed)); | ||
47 | |||
48 | /* defines to get/set USB message */ | ||
17 | #define USB_REQ_GET_REPORT 0x01 | 49 | #define USB_REQ_GET_REPORT 0x01 |
18 | #define USB_REQ_SET_REPORT 0x09 | 50 | #define USB_REQ_SET_REPORT 0x09 |
51 | #define WAC_HID_FEATURE_REPORT 0x03 | ||
19 | 52 | ||
20 | static int usb_get_report(struct usb_interface *intf, unsigned char type, | 53 | static int usb_get_report(struct usb_interface *intf, unsigned char type, |
21 | unsigned char id, void *buf, int size) | 54 | unsigned char id, void *buf, int size) |
@@ -80,25 +113,21 @@ static void wacom_sys_irq(struct urb *urb) | |||
80 | void wacom_report_key(void *wcombo, unsigned int key_type, int key_data) | 113 | void wacom_report_key(void *wcombo, unsigned int key_type, int key_data) |
81 | { | 114 | { |
82 | input_report_key(get_input_dev((struct wacom_combo *)wcombo), key_type, key_data); | 115 | input_report_key(get_input_dev((struct wacom_combo *)wcombo), key_type, key_data); |
83 | return; | ||
84 | } | 116 | } |
85 | 117 | ||
86 | void wacom_report_abs(void *wcombo, unsigned int abs_type, int abs_data) | 118 | void wacom_report_abs(void *wcombo, unsigned int abs_type, int abs_data) |
87 | { | 119 | { |
88 | input_report_abs(get_input_dev((struct wacom_combo *)wcombo), abs_type, abs_data); | 120 | input_report_abs(get_input_dev((struct wacom_combo *)wcombo), abs_type, abs_data); |
89 | return; | ||
90 | } | 121 | } |
91 | 122 | ||
92 | void wacom_report_rel(void *wcombo, unsigned int rel_type, int rel_data) | 123 | void wacom_report_rel(void *wcombo, unsigned int rel_type, int rel_data) |
93 | { | 124 | { |
94 | input_report_rel(get_input_dev((struct wacom_combo *)wcombo), rel_type, rel_data); | 125 | input_report_rel(get_input_dev((struct wacom_combo *)wcombo), rel_type, rel_data); |
95 | return; | ||
96 | } | 126 | } |
97 | 127 | ||
98 | void wacom_input_event(void *wcombo, unsigned int type, unsigned int code, int value) | 128 | void wacom_input_event(void *wcombo, unsigned int type, unsigned int code, int value) |
99 | { | 129 | { |
100 | input_event(get_input_dev((struct wacom_combo *)wcombo), type, code, value); | 130 | input_event(get_input_dev((struct wacom_combo *)wcombo), type, code, value); |
101 | return; | ||
102 | } | 131 | } |
103 | 132 | ||
104 | __u16 wacom_be16_to_cpu(unsigned char *data) | 133 | __u16 wacom_be16_to_cpu(unsigned char *data) |
@@ -118,7 +147,6 @@ __u16 wacom_le16_to_cpu(unsigned char *data) | |||
118 | void wacom_input_sync(void *wcombo) | 147 | void wacom_input_sync(void *wcombo) |
119 | { | 148 | { |
120 | input_sync(get_input_dev((struct wacom_combo *)wcombo)); | 149 | input_sync(get_input_dev((struct wacom_combo *)wcombo)); |
121 | return; | ||
122 | } | 150 | } |
123 | 151 | ||
124 | static int wacom_open(struct input_dev *dev) | 152 | static int wacom_open(struct input_dev *dev) |
@@ -160,7 +188,7 @@ static void wacom_close(struct input_dev *dev) | |||
160 | 188 | ||
161 | void input_dev_mo(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | 189 | void input_dev_mo(struct input_dev *input_dev, struct wacom_wac *wacom_wac) |
162 | { | 190 | { |
163 | input_dev->keybit[BIT_WORD(BTN_LEFT)] |= BIT_MASK(BTN_1) | | 191 | input_dev->keybit[BIT_WORD(BTN_MISC)] |= BIT_MASK(BTN_1) | |
164 | BIT_MASK(BTN_5); | 192 | BIT_MASK(BTN_5); |
165 | input_set_abs_params(input_dev, ABS_WHEEL, 0, 71, 0, 0); | 193 | input_set_abs_params(input_dev, ABS_WHEEL, 0, 71, 0, 0); |
166 | } | 194 | } |
@@ -170,7 +198,7 @@ void input_dev_g4(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | |||
170 | input_dev->evbit[0] |= BIT_MASK(EV_MSC); | 198 | input_dev->evbit[0] |= BIT_MASK(EV_MSC); |
171 | input_dev->mscbit[0] |= BIT_MASK(MSC_SERIAL); | 199 | input_dev->mscbit[0] |= BIT_MASK(MSC_SERIAL); |
172 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_FINGER); | 200 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_FINGER); |
173 | input_dev->keybit[BIT_WORD(BTN_LEFT)] |= BIT_MASK(BTN_0) | | 201 | input_dev->keybit[BIT_WORD(BTN_MISC)] |= BIT_MASK(BTN_0) | |
174 | BIT_MASK(BTN_4); | 202 | BIT_MASK(BTN_4); |
175 | } | 203 | } |
176 | 204 | ||
@@ -178,7 +206,7 @@ void input_dev_g(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | |||
178 | { | 206 | { |
179 | input_dev->evbit[0] |= BIT_MASK(EV_REL); | 207 | input_dev->evbit[0] |= BIT_MASK(EV_REL); |
180 | input_dev->relbit[0] |= BIT_MASK(REL_WHEEL); | 208 | input_dev->relbit[0] |= BIT_MASK(REL_WHEEL); |
181 | input_dev->keybit[BIT_WORD(BTN_LEFT)] |= BIT_MASK(BTN_LEFT) | | 209 | input_dev->keybit[BIT_WORD(BTN_MOUSE)] |= BIT_MASK(BTN_LEFT) | |
182 | BIT_MASK(BTN_RIGHT) | BIT_MASK(BTN_MIDDLE); | 210 | BIT_MASK(BTN_RIGHT) | BIT_MASK(BTN_MIDDLE); |
183 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_RUBBER) | | 211 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_RUBBER) | |
184 | BIT_MASK(BTN_TOOL_MOUSE) | BIT_MASK(BTN_STYLUS2); | 212 | BIT_MASK(BTN_TOOL_MOUSE) | BIT_MASK(BTN_STYLUS2); |
@@ -188,7 +216,7 @@ void input_dev_g(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | |||
188 | void input_dev_i3s(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | 216 | void input_dev_i3s(struct input_dev *input_dev, struct wacom_wac *wacom_wac) |
189 | { | 217 | { |
190 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_FINGER); | 218 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_FINGER); |
191 | input_dev->keybit[BIT_WORD(BTN_LEFT)] |= BIT_MASK(BTN_0) | | 219 | input_dev->keybit[BIT_WORD(BTN_MISC)] |= BIT_MASK(BTN_0) | |
192 | BIT_MASK(BTN_1) | BIT_MASK(BTN_2) | BIT_MASK(BTN_3); | 220 | BIT_MASK(BTN_1) | BIT_MASK(BTN_2) | BIT_MASK(BTN_3); |
193 | input_set_abs_params(input_dev, ABS_RX, 0, 4096, 0, 0); | 221 | input_set_abs_params(input_dev, ABS_RX, 0, 4096, 0, 0); |
194 | input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0); | 222 | input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0); |
@@ -196,14 +224,14 @@ void input_dev_i3s(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | |||
196 | 224 | ||
197 | void input_dev_i3(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | 225 | void input_dev_i3(struct input_dev *input_dev, struct wacom_wac *wacom_wac) |
198 | { | 226 | { |
199 | input_dev->keybit[BIT_WORD(BTN_LEFT)] |= BIT_MASK(BTN_4) | | 227 | input_dev->keybit[BIT_WORD(BTN_MISC)] |= BIT_MASK(BTN_4) | |
200 | BIT_MASK(BTN_5) | BIT_MASK(BTN_6) | BIT_MASK(BTN_7); | 228 | BIT_MASK(BTN_5) | BIT_MASK(BTN_6) | BIT_MASK(BTN_7); |
201 | input_set_abs_params(input_dev, ABS_RY, 0, 4096, 0, 0); | 229 | input_set_abs_params(input_dev, ABS_RY, 0, 4096, 0, 0); |
202 | } | 230 | } |
203 | 231 | ||
204 | void input_dev_bee(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | 232 | void input_dev_bee(struct input_dev *input_dev, struct wacom_wac *wacom_wac) |
205 | { | 233 | { |
206 | input_dev->keybit[BIT_WORD(BTN_LEFT)] |= BIT_MASK(BTN_8) | BIT_MASK(BTN_9); | 234 | input_dev->keybit[BIT_WORD(BTN_MISC)] |= BIT_MASK(BTN_8) | BIT_MASK(BTN_9); |
207 | } | 235 | } |
208 | 236 | ||
209 | void input_dev_i(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | 237 | void input_dev_i(struct input_dev *input_dev, struct wacom_wac *wacom_wac) |
@@ -211,7 +239,7 @@ void input_dev_i(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | |||
211 | input_dev->evbit[0] |= BIT_MASK(EV_MSC) | BIT_MASK(EV_REL); | 239 | input_dev->evbit[0] |= BIT_MASK(EV_MSC) | BIT_MASK(EV_REL); |
212 | input_dev->mscbit[0] |= BIT_MASK(MSC_SERIAL); | 240 | input_dev->mscbit[0] |= BIT_MASK(MSC_SERIAL); |
213 | input_dev->relbit[0] |= BIT_MASK(REL_WHEEL); | 241 | input_dev->relbit[0] |= BIT_MASK(REL_WHEEL); |
214 | input_dev->keybit[BIT_WORD(BTN_LEFT)] |= BIT_MASK(BTN_LEFT) | | 242 | input_dev->keybit[BIT_WORD(BTN_MOUSE)] |= BIT_MASK(BTN_LEFT) | |
215 | BIT_MASK(BTN_RIGHT) | BIT_MASK(BTN_MIDDLE) | | 243 | BIT_MASK(BTN_RIGHT) | BIT_MASK(BTN_MIDDLE) | |
216 | BIT_MASK(BTN_SIDE) | BIT_MASK(BTN_EXTRA); | 244 | BIT_MASK(BTN_SIDE) | BIT_MASK(BTN_EXTRA); |
217 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_RUBBER) | | 245 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_RUBBER) | |
@@ -228,8 +256,7 @@ void input_dev_i(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | |||
228 | 256 | ||
229 | void input_dev_pl(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | 257 | void input_dev_pl(struct input_dev *input_dev, struct wacom_wac *wacom_wac) |
230 | { | 258 | { |
231 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_STYLUS2) | | 259 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_STYLUS2); |
232 | BIT_MASK(BTN_TOOL_RUBBER); | ||
233 | } | 260 | } |
234 | 261 | ||
235 | void input_dev_pt(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | 262 | void input_dev_pt(struct input_dev *input_dev, struct wacom_wac *wacom_wac) |
@@ -237,15 +264,129 @@ void input_dev_pt(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | |||
237 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_RUBBER); | 264 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_RUBBER); |
238 | } | 265 | } |
239 | 266 | ||
267 | static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hid_desc, | ||
268 | struct wacom_wac *wacom_wac) | ||
269 | { | ||
270 | struct usb_device *dev = interface_to_usbdev(intf); | ||
271 | struct wacom_features *features = wacom_wac->features; | ||
272 | char limit = 0, result = 0; | ||
273 | int i = 0, usage = WCM_UNDEFINED, finger = 0, pen = 0; | ||
274 | unsigned char *report; | ||
275 | |||
276 | report = kzalloc(hid_desc->wDescriptorLength, GFP_KERNEL); | ||
277 | if (!report) | ||
278 | return -ENOMEM; | ||
279 | |||
280 | /* retrive report descriptors */ | ||
281 | do { | ||
282 | result = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), | ||
283 | USB_REQ_GET_DESCRIPTOR, | ||
284 | USB_RECIP_INTERFACE | USB_DIR_IN, | ||
285 | HID_DEVICET_REPORT << 8, | ||
286 | intf->altsetting[0].desc.bInterfaceNumber, /* interface */ | ||
287 | report, | ||
288 | hid_desc->wDescriptorLength, | ||
289 | 5000); /* 5 secs */ | ||
290 | } while (result < 0 && limit++ < 5); | ||
291 | |||
292 | if (result < 0) | ||
293 | goto out; | ||
294 | |||
295 | for (i = 0; i < hid_desc->wDescriptorLength; i++) { | ||
296 | |||
297 | switch (report[i]) { | ||
298 | case HID_USAGE_PAGE: | ||
299 | switch (report[i + 1]) { | ||
300 | case HID_USAGE_PAGE_DIGITIZER: | ||
301 | usage = WCM_DIGITIZER; | ||
302 | i++; | ||
303 | break; | ||
304 | |||
305 | case HID_USAGE_PAGE_DESKTOP: | ||
306 | usage = WCM_DESKTOP; | ||
307 | i++; | ||
308 | break; | ||
309 | } | ||
310 | break; | ||
311 | |||
312 | case HID_USAGE: | ||
313 | switch (report[i + 1]) { | ||
314 | case HID_USAGE_X: | ||
315 | if (usage == WCM_DESKTOP) { | ||
316 | if (finger) { | ||
317 | features->touch_x_max = | ||
318 | features->touch_y_max = | ||
319 | wacom_le16_to_cpu(&report[i + 3]); | ||
320 | features->x_max = | ||
321 | wacom_le16_to_cpu(&report[i + 6]); | ||
322 | i += 7; | ||
323 | } else if (pen) { | ||
324 | features->x_max = | ||
325 | wacom_le16_to_cpu(&report[i + 3]); | ||
326 | i += 4; | ||
327 | } | ||
328 | } else if (usage == WCM_DIGITIZER) { | ||
329 | /* max pressure isn't reported | ||
330 | features->pressure_max = (unsigned short) | ||
331 | (report[i+4] << 8 | report[i + 3]); | ||
332 | */ | ||
333 | features->pressure_max = 255; | ||
334 | i += 4; | ||
335 | } | ||
336 | break; | ||
337 | |||
338 | case HID_USAGE_Y: | ||
339 | if (usage == WCM_DESKTOP) | ||
340 | features->y_max = | ||
341 | wacom_le16_to_cpu(&report[i + 3]); | ||
342 | i += 4; | ||
343 | break; | ||
344 | |||
345 | case HID_USAGE_FINGER: | ||
346 | finger = 1; | ||
347 | i++; | ||
348 | break; | ||
349 | |||
350 | case HID_USAGE_STYLUS: | ||
351 | pen = 1; | ||
352 | i++; | ||
353 | break; | ||
354 | |||
355 | case HID_USAGE_UNDEFINED: | ||
356 | if (usage == WCM_DESKTOP && finger) /* capacity */ | ||
357 | features->pressure_max = | ||
358 | wacom_le16_to_cpu(&report[i + 3]); | ||
359 | i += 4; | ||
360 | break; | ||
361 | } | ||
362 | break; | ||
363 | |||
364 | case HID_COLLECTION: | ||
365 | /* reset UsagePage ans Finger */ | ||
366 | finger = usage = 0; | ||
367 | break; | ||
368 | } | ||
369 | } | ||
370 | |||
371 | result = 0; | ||
372 | |||
373 | out: | ||
374 | kfree(report); | ||
375 | return result; | ||
376 | } | ||
377 | |||
240 | static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *id) | 378 | static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *id) |
241 | { | 379 | { |
242 | struct usb_device *dev = interface_to_usbdev(intf); | 380 | struct usb_device *dev = interface_to_usbdev(intf); |
381 | struct usb_host_interface *interface = intf->cur_altsetting; | ||
243 | struct usb_endpoint_descriptor *endpoint; | 382 | struct usb_endpoint_descriptor *endpoint; |
244 | struct wacom *wacom; | 383 | struct wacom *wacom; |
245 | struct wacom_wac *wacom_wac; | 384 | struct wacom_wac *wacom_wac; |
385 | struct wacom_features *features; | ||
246 | struct input_dev *input_dev; | 386 | struct input_dev *input_dev; |
247 | int error = -ENOMEM; | 387 | int error = -ENOMEM; |
248 | char rep_data[2], limit = 0; | 388 | char rep_data[2], limit = 0; |
389 | struct hid_descriptor *hid_desc; | ||
249 | 390 | ||
250 | wacom = kzalloc(sizeof(struct wacom), GFP_KERNEL); | 391 | wacom = kzalloc(sizeof(struct wacom), GFP_KERNEL); |
251 | wacom_wac = kzalloc(sizeof(struct wacom_wac), GFP_KERNEL); | 392 | wacom_wac = kzalloc(sizeof(struct wacom_wac), GFP_KERNEL); |
@@ -268,8 +409,8 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i | |||
268 | usb_make_path(dev, wacom->phys, sizeof(wacom->phys)); | 409 | usb_make_path(dev, wacom->phys, sizeof(wacom->phys)); |
269 | strlcat(wacom->phys, "/input0", sizeof(wacom->phys)); | 410 | strlcat(wacom->phys, "/input0", sizeof(wacom->phys)); |
270 | 411 | ||
271 | wacom_wac->features = get_wacom_feature(id); | 412 | wacom_wac->features = features = get_wacom_feature(id); |
272 | BUG_ON(wacom_wac->features->pktlen > 10); | 413 | BUG_ON(features->pktlen > 10); |
273 | 414 | ||
274 | input_dev->name = wacom_wac->features->name; | 415 | input_dev->name = wacom_wac->features->name; |
275 | wacom->wacom_wac = wacom_wac; | 416 | wacom->wacom_wac = wacom_wac; |
@@ -282,18 +423,37 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i | |||
282 | input_dev->open = wacom_open; | 423 | input_dev->open = wacom_open; |
283 | input_dev->close = wacom_close; | 424 | input_dev->close = wacom_close; |
284 | 425 | ||
426 | endpoint = &intf->cur_altsetting->endpoint[0].desc; | ||
427 | |||
428 | /* TabletPC need to retrieve the physical and logical maximum from report descriptor */ | ||
429 | if (wacom_wac->features->type == TABLETPC) { | ||
430 | if (usb_get_extra_descriptor(interface, HID_DEVICET_HID, &hid_desc)) { | ||
431 | if (usb_get_extra_descriptor(&interface->endpoint[0], | ||
432 | HID_DEVICET_REPORT, &hid_desc)) { | ||
433 | printk("wacom: can not retrive extra class descriptor\n"); | ||
434 | goto fail2; | ||
435 | } | ||
436 | } | ||
437 | error = wacom_parse_hid(intf, hid_desc, wacom_wac); | ||
438 | if (error) | ||
439 | goto fail2; | ||
440 | } | ||
441 | |||
285 | input_dev->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); | 442 | input_dev->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); |
286 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_PEN) | | 443 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_PEN) | |
287 | BIT_MASK(BTN_TOUCH) | BIT_MASK(BTN_STYLUS); | 444 | BIT_MASK(BTN_TOUCH) | BIT_MASK(BTN_STYLUS); |
288 | input_set_abs_params(input_dev, ABS_X, 0, wacom_wac->features->x_max, 4, 0); | 445 | input_set_abs_params(input_dev, ABS_X, 0, features->x_max, 4, 0); |
289 | input_set_abs_params(input_dev, ABS_Y, 0, wacom_wac->features->y_max, 4, 0); | 446 | input_set_abs_params(input_dev, ABS_Y, 0, features->y_max, 4, 0); |
290 | input_set_abs_params(input_dev, ABS_PRESSURE, 0, wacom_wac->features->pressure_max, 0, 0); | 447 | input_set_abs_params(input_dev, ABS_PRESSURE, 0, features->pressure_max, 0, 0); |
448 | if (features->type == TABLETPC) { | ||
449 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_DOUBLETAP); | ||
450 | input_set_abs_params(input_dev, ABS_RX, 0, features->touch_x_max, 4, 0); | ||
451 | input_set_abs_params(input_dev, ABS_RY, 0, features->touch_y_max, 4, 0); | ||
452 | } | ||
291 | input_dev->absbit[BIT_WORD(ABS_MISC)] |= BIT_MASK(ABS_MISC); | 453 | input_dev->absbit[BIT_WORD(ABS_MISC)] |= BIT_MASK(ABS_MISC); |
292 | 454 | ||
293 | wacom_init_input_dev(input_dev, wacom_wac); | 455 | wacom_init_input_dev(input_dev, wacom_wac); |
294 | 456 | ||
295 | endpoint = &intf->cur_altsetting->endpoint[0].desc; | ||
296 | |||
297 | usb_fill_int_urb(wacom->irq, dev, | 457 | usb_fill_int_urb(wacom->irq, dev, |
298 | usb_rcvintpipe(dev, endpoint->bEndpointAddress), | 458 | usb_rcvintpipe(dev, endpoint->bEndpointAddress), |
299 | wacom_wac->data, wacom_wac->features->pktlen, | 459 | wacom_wac->data, wacom_wac->features->pktlen, |
@@ -305,13 +465,22 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i | |||
305 | if (error) | 465 | if (error) |
306 | goto fail3; | 466 | goto fail3; |
307 | 467 | ||
308 | /* Ask the tablet to report tablet data. Repeat until it succeeds */ | 468 | /* |
309 | do { | 469 | * Ask the tablet to report tablet data if it is not a Tablet PC. |
310 | rep_data[0] = 2; | 470 | * Repeat until it succeeds |
311 | rep_data[1] = 2; | 471 | */ |
312 | usb_set_report(intf, 3, 2, rep_data, 2); | 472 | if (wacom_wac->features->type != TABLETPC) { |
313 | usb_get_report(intf, 3, 2, rep_data, 2); | 473 | do { |
314 | } while (rep_data[1] != 2 && limit++ < 5); | 474 | rep_data[0] = 2; |
475 | rep_data[1] = 2; | ||
476 | error = usb_set_report(intf, WAC_HID_FEATURE_REPORT, | ||
477 | 2, rep_data, 2); | ||
478 | if (error >= 0) | ||
479 | error = usb_get_report(intf, | ||
480 | WAC_HID_FEATURE_REPORT, 2, | ||
481 | rep_data, 2); | ||
482 | } while ((error < 0 || rep_data[1] != 2) && limit++ < 5); | ||
483 | } | ||
315 | 484 | ||
316 | usb_set_intfdata(intf, wacom); | 485 | usb_set_intfdata(intf, wacom); |
317 | return 0; | 486 | return 0; |
@@ -333,7 +502,8 @@ static void wacom_disconnect(struct usb_interface *intf) | |||
333 | usb_kill_urb(wacom->irq); | 502 | usb_kill_urb(wacom->irq); |
334 | input_unregister_device(wacom->dev); | 503 | input_unregister_device(wacom->dev); |
335 | usb_free_urb(wacom->irq); | 504 | usb_free_urb(wacom->irq); |
336 | usb_buffer_free(interface_to_usbdev(intf), 10, wacom->wacom_wac->data, wacom->data_dma); | 505 | usb_buffer_free(interface_to_usbdev(intf), 10, |
506 | wacom->wacom_wac->data, wacom->data_dma); | ||
337 | kfree(wacom->wacom_wac); | 507 | kfree(wacom->wacom_wac); |
338 | kfree(wacom); | 508 | kfree(wacom); |
339 | } | 509 | } |
diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c index bf3d9a8b2c1b..8dc8d1e59bea 100644 --- a/drivers/input/tablet/wacom_wac.c +++ b/drivers/input/tablet/wacom_wac.c | |||
@@ -535,31 +535,147 @@ static int wacom_intuos_irq(struct wacom_wac *wacom, void *wcombo) | |||
535 | return 1; | 535 | return 1; |
536 | } | 536 | } |
537 | 537 | ||
538 | int wacom_tpc_irq(struct wacom_wac *wacom, void *wcombo) | ||
539 | { | ||
540 | char *data = wacom->data; | ||
541 | int prox = 0, pressure; | ||
542 | static int stylusInProx, touchInProx = 1, touchOut; | ||
543 | struct urb *urb = ((struct wacom_combo *)wcombo)->urb; | ||
544 | |||
545 | dbg("wacom_tpc_irq: received report #%d", data[0]); | ||
546 | |||
547 | if (urb->actual_length == 5 || data[0] == 6) { /* Touch data */ | ||
548 | if (urb->actual_length == 5) { /* with touch */ | ||
549 | prox = data[0] & 0x03; | ||
550 | } else { /* with capacity */ | ||
551 | prox = data[1] & 0x03; | ||
552 | } | ||
553 | |||
554 | if (!stylusInProx) { /* stylus not in prox */ | ||
555 | if (prox) { | ||
556 | if (touchInProx) { | ||
557 | wacom->tool[1] = BTN_TOOL_DOUBLETAP; | ||
558 | wacom->id[0] = TOUCH_DEVICE_ID; | ||
559 | if (urb->actual_length != 5) { | ||
560 | wacom_report_abs(wcombo, ABS_X, wacom_le16_to_cpu(&data[2])); | ||
561 | wacom_report_abs(wcombo, ABS_Y, wacom_le16_to_cpu(&data[4])); | ||
562 | wacom_report_abs(wcombo, ABS_PRESSURE, wacom_le16_to_cpu(&data[6])); | ||
563 | wacom_report_key(wcombo, BTN_TOUCH, wacom_le16_to_cpu(&data[6])); | ||
564 | } else { | ||
565 | wacom_report_abs(wcombo, ABS_X, wacom_le16_to_cpu(&data[1])); | ||
566 | wacom_report_abs(wcombo, ABS_Y, wacom_le16_to_cpu(&data[3])); | ||
567 | wacom_report_key(wcombo, BTN_TOUCH, 1); | ||
568 | } | ||
569 | wacom_report_abs(wcombo, ABS_MISC, wacom->id[0]); | ||
570 | wacom_report_key(wcombo, wacom->tool[1], prox & 0x01); | ||
571 | touchOut = 1; | ||
572 | return 1; | ||
573 | } | ||
574 | } else { | ||
575 | wacom_report_abs(wcombo, ABS_MISC, wacom->id[0]); | ||
576 | wacom_report_key(wcombo, wacom->tool[1], prox & 0x01); | ||
577 | wacom_report_key(wcombo, BTN_TOUCH, 0); | ||
578 | touchOut = 0; | ||
579 | touchInProx = 1; | ||
580 | return 1; | ||
581 | } | ||
582 | } else if (touchOut || !prox) { /* force touch out-prox */ | ||
583 | wacom_report_abs(wcombo, ABS_MISC, TOUCH_DEVICE_ID); | ||
584 | wacom_report_key(wcombo, BTN_TOUCH, 0); | ||
585 | touchOut = 0; | ||
586 | touchInProx = 1; | ||
587 | return 1; | ||
588 | } | ||
589 | } else if (data[0] == 2) { /* Penabled */ | ||
590 | prox = data[1] & 0x20; | ||
591 | |||
592 | touchInProx = 0; | ||
593 | |||
594 | wacom->id[0] = ERASER_DEVICE_ID; | ||
595 | |||
596 | /* | ||
597 | * if going from out of proximity into proximity select between the eraser | ||
598 | * and the pen based on the state of the stylus2 button, choose eraser if | ||
599 | * pressed else choose pen. if not a proximity change from out to in, send | ||
600 | * an out of proximity for previous tool then a in for new tool. | ||
601 | */ | ||
602 | if (prox) { /* in prox */ | ||
603 | if (!wacom->tool[0]) { | ||
604 | /* Going into proximity select tool */ | ||
605 | wacom->tool[1] = (data[1] & 0x08) ? BTN_TOOL_RUBBER : BTN_TOOL_PEN; | ||
606 | if (wacom->tool[1] == BTN_TOOL_PEN) | ||
607 | wacom->id[0] = STYLUS_DEVICE_ID; | ||
608 | } else if (wacom->tool[1] == BTN_TOOL_RUBBER && !(data[1] & 0x08)) { | ||
609 | /* | ||
610 | * was entered with stylus2 pressed | ||
611 | * report out proximity for previous tool | ||
612 | */ | ||
613 | wacom_report_abs(wcombo, ABS_MISC, wacom->id[0]); | ||
614 | wacom_report_key(wcombo, wacom->tool[1], 0); | ||
615 | wacom_input_sync(wcombo); | ||
616 | |||
617 | /* set new tool */ | ||
618 | wacom->tool[1] = BTN_TOOL_PEN; | ||
619 | wacom->id[0] = STYLUS_DEVICE_ID; | ||
620 | return 0; | ||
621 | } | ||
622 | if (wacom->tool[1] != BTN_TOOL_RUBBER) { | ||
623 | /* Unknown tool selected default to pen tool */ | ||
624 | wacom->tool[1] = BTN_TOOL_PEN; | ||
625 | wacom->id[0] = STYLUS_DEVICE_ID; | ||
626 | } | ||
627 | wacom_report_key(wcombo, BTN_STYLUS, data[1] & 0x02); | ||
628 | wacom_report_key(wcombo, BTN_STYLUS2, data[1] & 0x10); | ||
629 | wacom_report_abs(wcombo, ABS_X, wacom_le16_to_cpu(&data[2])); | ||
630 | wacom_report_abs(wcombo, ABS_Y, wacom_le16_to_cpu(&data[4])); | ||
631 | pressure = ((data[7] & 0x01) << 8) | data[6]; | ||
632 | if (pressure < 0) | ||
633 | pressure = wacom->features->pressure_max + pressure + 1; | ||
634 | wacom_report_abs(wcombo, ABS_PRESSURE, pressure); | ||
635 | wacom_report_key(wcombo, BTN_TOUCH, pressure); | ||
636 | } else { | ||
637 | wacom_report_abs(wcombo, ABS_PRESSURE, 0); | ||
638 | wacom_report_key(wcombo, BTN_STYLUS, 0); | ||
639 | wacom_report_key(wcombo, BTN_STYLUS2, 0); | ||
640 | wacom_report_key(wcombo, BTN_TOUCH, 0); | ||
641 | } | ||
642 | wacom_report_key(wcombo, wacom->tool[1], prox); | ||
643 | wacom_report_abs(wcombo, ABS_MISC, wacom->id[0]); | ||
644 | stylusInProx = prox; | ||
645 | wacom->tool[0] = prox; | ||
646 | return 1; | ||
647 | } | ||
648 | return 0; | ||
649 | } | ||
650 | |||
538 | int wacom_wac_irq(struct wacom_wac *wacom_wac, void *wcombo) | 651 | int wacom_wac_irq(struct wacom_wac *wacom_wac, void *wcombo) |
539 | { | 652 | { |
540 | switch (wacom_wac->features->type) { | 653 | switch (wacom_wac->features->type) { |
541 | case PENPARTNER: | 654 | case PENPARTNER: |
542 | return (wacom_penpartner_irq(wacom_wac, wcombo)); | 655 | return wacom_penpartner_irq(wacom_wac, wcombo); |
543 | break; | 656 | |
544 | case PL: | 657 | case PL: |
545 | return (wacom_pl_irq(wacom_wac, wcombo)); | 658 | return wacom_pl_irq(wacom_wac, wcombo); |
546 | break; | 659 | |
547 | case WACOM_G4: | 660 | case WACOM_G4: |
548 | case GRAPHIRE: | 661 | case GRAPHIRE: |
549 | case WACOM_MO: | 662 | case WACOM_MO: |
550 | return (wacom_graphire_irq(wacom_wac, wcombo)); | 663 | return wacom_graphire_irq(wacom_wac, wcombo); |
551 | break; | 664 | |
552 | case PTU: | 665 | case PTU: |
553 | return (wacom_ptu_irq(wacom_wac, wcombo)); | 666 | return wacom_ptu_irq(wacom_wac, wcombo); |
554 | break; | 667 | |
555 | case INTUOS: | 668 | case INTUOS: |
556 | case INTUOS3S: | 669 | case INTUOS3S: |
557 | case INTUOS3: | 670 | case INTUOS3: |
558 | case INTUOS3L: | 671 | case INTUOS3L: |
559 | case CINTIQ: | 672 | case CINTIQ: |
560 | case WACOM_BEE: | 673 | case WACOM_BEE: |
561 | return (wacom_intuos_irq(wacom_wac, wcombo)); | 674 | return wacom_intuos_irq(wacom_wac, wcombo); |
562 | break; | 675 | |
676 | case TABLETPC: | ||
677 | return wacom_tpc_irq(wacom_wac, wcombo); | ||
678 | |||
563 | default: | 679 | default: |
564 | return 0; | 680 | return 0; |
565 | } | 681 | } |
@@ -586,13 +702,15 @@ void wacom_init_input_dev(struct input_dev *input_dev, struct wacom_wac *wacom_w | |||
586 | /* fall through */ | 702 | /* fall through */ |
587 | case INTUOS3S: | 703 | case INTUOS3S: |
588 | input_dev_i3s(input_dev, wacom_wac); | 704 | input_dev_i3s(input_dev, wacom_wac); |
705 | /* fall through */ | ||
589 | case INTUOS: | 706 | case INTUOS: |
590 | input_dev_i(input_dev, wacom_wac); | 707 | input_dev_i(input_dev, wacom_wac); |
591 | break; | 708 | break; |
592 | case PL: | 709 | case PL: |
593 | case PTU: | 710 | case PTU: |
711 | case TABLETPC: | ||
594 | input_dev_pl(input_dev, wacom_wac); | 712 | input_dev_pl(input_dev, wacom_wac); |
595 | break; | 713 | /* fall through */ |
596 | case PENPARTNER: | 714 | case PENPARTNER: |
597 | input_dev_pt(input_dev, wacom_wac); | 715 | input_dev_pt(input_dev, wacom_wac); |
598 | break; | 716 | break; |
@@ -611,6 +729,7 @@ static struct wacom_features wacom_features[] = { | |||
611 | { "Wacom Graphire4 6x8", 8, 16704, 12064, 511, 63, WACOM_G4 }, | 729 | { "Wacom Graphire4 6x8", 8, 16704, 12064, 511, 63, WACOM_G4 }, |
612 | { "Wacom BambooFun 4x5", 9, 14760, 9225, 511, 63, WACOM_MO }, | 730 | { "Wacom BambooFun 4x5", 9, 14760, 9225, 511, 63, WACOM_MO }, |
613 | { "Wacom BambooFun 6x8", 9, 21648, 13530, 511, 63, WACOM_MO }, | 731 | { "Wacom BambooFun 6x8", 9, 21648, 13530, 511, 63, WACOM_MO }, |
732 | { "Wacom Bamboo1 Medium",8, 16704, 12064, 511, 63, GRAPHIRE }, | ||
614 | { "Wacom Volito", 8, 5104, 3712, 511, 63, GRAPHIRE }, | 733 | { "Wacom Volito", 8, 5104, 3712, 511, 63, GRAPHIRE }, |
615 | { "Wacom PenStation2", 8, 3250, 2320, 255, 63, GRAPHIRE }, | 734 | { "Wacom PenStation2", 8, 3250, 2320, 255, 63, GRAPHIRE }, |
616 | { "Wacom Volito2 4x5", 8, 5104, 3712, 511, 63, GRAPHIRE }, | 735 | { "Wacom Volito2 4x5", 8, 5104, 3712, 511, 63, GRAPHIRE }, |
@@ -650,6 +769,10 @@ static struct wacom_features wacom_features[] = { | |||
650 | { "Wacom Cintiq 21UX", 10, 87200, 65600, 1023, 63, CINTIQ }, | 769 | { "Wacom Cintiq 21UX", 10, 87200, 65600, 1023, 63, CINTIQ }, |
651 | { "Wacom Cintiq 20WSX", 10, 86680, 54180, 1023, 63, WACOM_BEE }, | 770 | { "Wacom Cintiq 20WSX", 10, 86680, 54180, 1023, 63, WACOM_BEE }, |
652 | { "Wacom Cintiq 12WX", 10, 53020, 33440, 1023, 63, WACOM_BEE }, | 771 | { "Wacom Cintiq 12WX", 10, 53020, 33440, 1023, 63, WACOM_BEE }, |
772 | { "Wacom DTU1931", 8, 37832, 30305, 511, 0, PL }, | ||
773 | { "Wacom ISDv4 90", 8, 26202, 16325, 255, 0, TABLETPC }, | ||
774 | { "Wacom ISDv4 93", 8, 26202, 16325, 255, 0, TABLETPC }, | ||
775 | { "Wacom ISDv4 9A", 8, 26202, 16325, 255, 0, TABLETPC }, | ||
653 | { "Wacom Intuos2 6x8", 10, 20320, 16240, 1023, 31, INTUOS }, | 776 | { "Wacom Intuos2 6x8", 10, 20320, 16240, 1023, 31, INTUOS }, |
654 | { } | 777 | { } |
655 | }; | 778 | }; |
@@ -665,6 +788,7 @@ static struct usb_device_id wacom_ids[] = { | |||
665 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x16) }, | 788 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x16) }, |
666 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x17) }, | 789 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x17) }, |
667 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x18) }, | 790 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x18) }, |
791 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x19) }, | ||
668 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x60) }, | 792 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x60) }, |
669 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x61) }, | 793 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x61) }, |
670 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x62) }, | 794 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x62) }, |
@@ -704,18 +828,26 @@ static struct usb_device_id wacom_ids[] = { | |||
704 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x3F) }, | 828 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x3F) }, |
705 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xC5) }, | 829 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xC5) }, |
706 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xC6) }, | 830 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xC6) }, |
831 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xC7) }, | ||
832 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x90) }, | ||
833 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x93) }, | ||
834 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x9A) }, | ||
707 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x47) }, | 835 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x47) }, |
708 | { } | 836 | { } |
709 | }; | 837 | }; |
710 | 838 | ||
711 | const struct usb_device_id * get_device_table(void) { | 839 | const struct usb_device_id *get_device_table(void) |
712 | const struct usb_device_id * id_table = wacom_ids; | 840 | { |
841 | const struct usb_device_id *id_table = wacom_ids; | ||
842 | |||
713 | return id_table; | 843 | return id_table; |
714 | } | 844 | } |
715 | 845 | ||
716 | struct wacom_features * get_wacom_feature(const struct usb_device_id * id) { | 846 | struct wacom_features * get_wacom_feature(const struct usb_device_id *id) |
847 | { | ||
717 | int index = id - wacom_ids; | 848 | int index = id - wacom_ids; |
718 | struct wacom_features *wf = &wacom_features[index]; | 849 | struct wacom_features *wf = &wacom_features[index]; |
850 | |||
719 | return wf; | 851 | return wf; |
720 | } | 852 | } |
721 | 853 | ||
diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h index 3342bc05847d..f9c8b69673b7 100644 --- a/drivers/input/tablet/wacom_wac.h +++ b/drivers/input/tablet/wacom_wac.h | |||
@@ -10,6 +10,7 @@ | |||
10 | #define WACOM_WAC_H | 10 | #define WACOM_WAC_H |
11 | 11 | ||
12 | #define STYLUS_DEVICE_ID 0x02 | 12 | #define STYLUS_DEVICE_ID 0x02 |
13 | #define TOUCH_DEVICE_ID 0x03 | ||
13 | #define CURSOR_DEVICE_ID 0x06 | 14 | #define CURSOR_DEVICE_ID 0x06 |
14 | #define ERASER_DEVICE_ID 0x0A | 15 | #define ERASER_DEVICE_ID 0x0A |
15 | #define PAD_DEVICE_ID 0x0F | 16 | #define PAD_DEVICE_ID 0x0F |
@@ -27,6 +28,7 @@ enum { | |||
27 | CINTIQ, | 28 | CINTIQ, |
28 | WACOM_BEE, | 29 | WACOM_BEE, |
29 | WACOM_MO, | 30 | WACOM_MO, |
31 | TABLETPC, | ||
30 | MAX_TYPE | 32 | MAX_TYPE |
31 | }; | 33 | }; |
32 | 34 | ||
@@ -38,6 +40,8 @@ struct wacom_features { | |||
38 | int pressure_max; | 40 | int pressure_max; |
39 | int distance_max; | 41 | int distance_max; |
40 | int type; | 42 | int type; |
43 | int touch_x_max; | ||
44 | int touch_y_max; | ||
41 | }; | 45 | }; |
42 | 46 | ||
43 | struct wacom_wac { | 47 | struct wacom_wac { |
diff --git a/drivers/input/touchscreen/elo.c b/drivers/input/touchscreen/elo.c index d20689cdbd5d..8f38c5e55ce6 100644 --- a/drivers/input/touchscreen/elo.c +++ b/drivers/input/touchscreen/elo.c | |||
@@ -262,7 +262,7 @@ static int elo_setup_10(struct elo *elo) | |||
262 | input_set_abs_params(dev, ABS_PRESSURE, 0, 255, 0, 0); | 262 | input_set_abs_params(dev, ABS_PRESSURE, 0, 255, 0, 0); |
263 | 263 | ||
264 | printk(KERN_INFO "elo: %sTouch touchscreen, fw: %02x.%02x, " | 264 | printk(KERN_INFO "elo: %sTouch touchscreen, fw: %02x.%02x, " |
265 | "features: %x02x, controller: 0x%02x\n", | 265 | "features: 0x%02x, controller: 0x%02x\n", |
266 | elo_types[(packet[1] -'0') & 0x03], | 266 | elo_types[(packet[1] -'0') & 0x03], |
267 | packet[5], packet[4], packet[3], packet[7]); | 267 | packet[5], packet[4], packet[3], packet[7]); |
268 | 268 | ||
diff --git a/drivers/input/xen-kbdfront.c b/drivers/input/xen-kbdfront.c index 3ab6362f043c..928d2ed8865f 100644 --- a/drivers/input/xen-kbdfront.c +++ b/drivers/input/xen-kbdfront.c | |||
@@ -323,7 +323,7 @@ static struct xenbus_device_id xenkbd_ids[] = { | |||
323 | { "" } | 323 | { "" } |
324 | }; | 324 | }; |
325 | 325 | ||
326 | static struct xenbus_driver xenkbd = { | 326 | static struct xenbus_driver xenkbd_driver = { |
327 | .name = "vkbd", | 327 | .name = "vkbd", |
328 | .owner = THIS_MODULE, | 328 | .owner = THIS_MODULE, |
329 | .ids = xenkbd_ids, | 329 | .ids = xenkbd_ids, |
@@ -342,12 +342,12 @@ static int __init xenkbd_init(void) | |||
342 | if (xen_initial_domain()) | 342 | if (xen_initial_domain()) |
343 | return -ENODEV; | 343 | return -ENODEV; |
344 | 344 | ||
345 | return xenbus_register_frontend(&xenkbd); | 345 | return xenbus_register_frontend(&xenkbd_driver); |
346 | } | 346 | } |
347 | 347 | ||
348 | static void __exit xenkbd_cleanup(void) | 348 | static void __exit xenkbd_cleanup(void) |
349 | { | 349 | { |
350 | xenbus_unregister_driver(&xenkbd); | 350 | xenbus_unregister_driver(&xenkbd_driver); |
351 | } | 351 | } |
352 | 352 | ||
353 | module_init(xenkbd_init); | 353 | module_init(xenkbd_init); |
diff --git a/drivers/isdn/hisax/config.c b/drivers/isdn/hisax/config.c index 84d75a3f5d17..ded9d0baf607 100644 --- a/drivers/isdn/hisax/config.c +++ b/drivers/isdn/hisax/config.c | |||
@@ -1213,7 +1213,7 @@ static void HiSax_shiftcards(int idx) | |||
1213 | memcpy(&cards[i], &cards[i + 1], sizeof(cards[i])); | 1213 | memcpy(&cards[i], &cards[i + 1], sizeof(cards[i])); |
1214 | } | 1214 | } |
1215 | 1215 | ||
1216 | static int HiSax_inithardware(int *busy_flag) | 1216 | static int __init HiSax_inithardware(int *busy_flag) |
1217 | { | 1217 | { |
1218 | int foundcards = 0; | 1218 | int foundcards = 0; |
1219 | int i = 0; | 1219 | int i = 0; |
@@ -1542,7 +1542,9 @@ static void __exit HiSax_exit(void) | |||
1542 | printk(KERN_INFO "HiSax module removed\n"); | 1542 | printk(KERN_INFO "HiSax module removed\n"); |
1543 | } | 1543 | } |
1544 | 1544 | ||
1545 | int hisax_init_pcmcia(void *pcm_iob, int *busy_flag, struct IsdnCard *card) | 1545 | #ifdef CONFIG_HOTPLUG |
1546 | |||
1547 | int __devinit hisax_init_pcmcia(void *pcm_iob, int *busy_flag, struct IsdnCard *card) | ||
1546 | { | 1548 | { |
1547 | u_char ids[16]; | 1549 | u_char ids[16]; |
1548 | int ret = -1; | 1550 | int ret = -1; |
@@ -1563,6 +1565,8 @@ error: | |||
1563 | } | 1565 | } |
1564 | 1566 | ||
1565 | EXPORT_SYMBOL(hisax_init_pcmcia); | 1567 | EXPORT_SYMBOL(hisax_init_pcmcia); |
1568 | #endif | ||
1569 | |||
1566 | EXPORT_SYMBOL(HiSax_closecard); | 1570 | EXPORT_SYMBOL(HiSax_closecard); |
1567 | 1571 | ||
1568 | #include "hisax_if.h" | 1572 | #include "hisax_if.h" |
@@ -1580,6 +1584,11 @@ static void hisax_bc_close(struct BCState *bcs); | |||
1580 | static void hisax_bh(struct work_struct *work); | 1584 | static void hisax_bh(struct work_struct *work); |
1581 | static void EChannel_proc_rcv(struct hisax_d_if *d_if); | 1585 | static void EChannel_proc_rcv(struct hisax_d_if *d_if); |
1582 | 1586 | ||
1587 | static int hisax_setup_card_dynamic(struct IsdnCard *card) | ||
1588 | { | ||
1589 | return 2; | ||
1590 | } | ||
1591 | |||
1583 | int hisax_register(struct hisax_d_if *hisax_d_if, struct hisax_b_if *b_if[], | 1592 | int hisax_register(struct hisax_d_if *hisax_d_if, struct hisax_b_if *b_if[], |
1584 | char *name, int protocol) | 1593 | char *name, int protocol) |
1585 | { | 1594 | { |
@@ -1599,7 +1608,8 @@ int hisax_register(struct hisax_d_if *hisax_d_if, struct hisax_b_if *b_if[], | |||
1599 | cards[i].protocol = protocol; | 1608 | cards[i].protocol = protocol; |
1600 | sprintf(id, "%s%d", name, i); | 1609 | sprintf(id, "%s%d", name, i); |
1601 | nrcards++; | 1610 | nrcards++; |
1602 | retval = checkcard(i, id, NULL, hisax_d_if->owner, hisax_cs_setup_card); | 1611 | retval = checkcard(i, id, NULL, hisax_d_if->owner, |
1612 | hisax_setup_card_dynamic); | ||
1603 | if (retval == 0) { // yuck | 1613 | if (retval == 0) { // yuck |
1604 | cards[i].typ = 0; | 1614 | cards[i].typ = 0; |
1605 | nrcards--; | 1615 | nrcards--; |
diff --git a/drivers/isdn/i4l/isdn_net.c b/drivers/isdn/i4l/isdn_net.c index bb904a0a98bd..1bfc55d7a26c 100644 --- a/drivers/isdn/i4l/isdn_net.c +++ b/drivers/isdn/i4l/isdn_net.c | |||
@@ -1641,8 +1641,10 @@ isdn_net_ciscohdlck_slarp_send_reply(isdn_net_local *lp) | |||
1641 | /* slarp reply, send own ip/netmask; if values are nonsense remote | 1641 | /* slarp reply, send own ip/netmask; if values are nonsense remote |
1642 | * should think we are unable to provide it with an address via SLARP */ | 1642 | * should think we are unable to provide it with an address via SLARP */ |
1643 | p += put_u32(p, CISCO_SLARP_REPLY); | 1643 | p += put_u32(p, CISCO_SLARP_REPLY); |
1644 | p += put_u32(p, addr); // address | 1644 | *(__be32 *)p = addr; // address |
1645 | p += put_u32(p, mask); // netmask | 1645 | p += 4; |
1646 | *(__be32 *)p = mask; // netmask | ||
1647 | p += 4; | ||
1646 | p += put_u16(p, 0); // unused | 1648 | p += put_u16(p, 0); // unused |
1647 | 1649 | ||
1648 | isdn_net_write_super(lp, skb); | 1650 | isdn_net_write_super(lp, skb); |
diff --git a/drivers/macintosh/rack-meter.c b/drivers/macintosh/rack-meter.c index 2c21d4f25cc8..a98ab72adf95 100644 --- a/drivers/macintosh/rack-meter.c +++ b/drivers/macintosh/rack-meter.c | |||
@@ -288,7 +288,7 @@ static void __devexit rackmeter_stop_cpu_sniffer(struct rackmeter *rm) | |||
288 | cancel_rearming_delayed_work(&rm->cpu[1].sniffer); | 288 | cancel_rearming_delayed_work(&rm->cpu[1].sniffer); |
289 | } | 289 | } |
290 | 290 | ||
291 | static int rackmeter_setup(struct rackmeter *rm) | 291 | static int __devinit rackmeter_setup(struct rackmeter *rm) |
292 | { | 292 | { |
293 | pr_debug("rackmeter: setting up i2s..\n"); | 293 | pr_debug("rackmeter: setting up i2s..\n"); |
294 | rackmeter_setup_i2s(rm); | 294 | rackmeter_setup_i2s(rm); |
@@ -582,12 +582,12 @@ static struct of_device_id rackmeter_match[] = { | |||
582 | { } | 582 | { } |
583 | }; | 583 | }; |
584 | 584 | ||
585 | static struct macio_driver rackmeter_drv = { | 585 | static struct macio_driver rackmeter_driver = { |
586 | .name = "rackmeter", | 586 | .name = "rackmeter", |
587 | .owner = THIS_MODULE, | 587 | .owner = THIS_MODULE, |
588 | .match_table = rackmeter_match, | 588 | .match_table = rackmeter_match, |
589 | .probe = rackmeter_probe, | 589 | .probe = rackmeter_probe, |
590 | .remove = rackmeter_remove, | 590 | .remove = __devexit_p(rackmeter_remove), |
591 | .shutdown = rackmeter_shutdown, | 591 | .shutdown = rackmeter_shutdown, |
592 | }; | 592 | }; |
593 | 593 | ||
@@ -596,14 +596,14 @@ static int __init rackmeter_init(void) | |||
596 | { | 596 | { |
597 | pr_debug("rackmeter_init()\n"); | 597 | pr_debug("rackmeter_init()\n"); |
598 | 598 | ||
599 | return macio_register_driver(&rackmeter_drv); | 599 | return macio_register_driver(&rackmeter_driver); |
600 | } | 600 | } |
601 | 601 | ||
602 | static void __exit rackmeter_exit(void) | 602 | static void __exit rackmeter_exit(void) |
603 | { | 603 | { |
604 | pr_debug("rackmeter_exit()\n"); | 604 | pr_debug("rackmeter_exit()\n"); |
605 | 605 | ||
606 | macio_unregister_driver(&rackmeter_drv); | 606 | macio_unregister_driver(&rackmeter_driver); |
607 | } | 607 | } |
608 | 608 | ||
609 | module_init(rackmeter_init); | 609 | module_init(rackmeter_init); |
diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c index 4840733cd903..3d7f4923cd13 100644 --- a/drivers/md/dm-mpath.c +++ b/drivers/md/dm-mpath.c | |||
@@ -441,13 +441,13 @@ static void process_queued_ios(struct work_struct *work) | |||
441 | __choose_pgpath(m); | 441 | __choose_pgpath(m); |
442 | 442 | ||
443 | pgpath = m->current_pgpath; | 443 | pgpath = m->current_pgpath; |
444 | m->pgpath_to_activate = m->current_pgpath; | ||
445 | 444 | ||
446 | if ((pgpath && !m->queue_io) || | 445 | if ((pgpath && !m->queue_io) || |
447 | (!pgpath && !m->queue_if_no_path)) | 446 | (!pgpath && !m->queue_if_no_path)) |
448 | must_queue = 0; | 447 | must_queue = 0; |
449 | 448 | ||
450 | if (m->pg_init_required && !m->pg_init_in_progress) { | 449 | if (m->pg_init_required && !m->pg_init_in_progress && pgpath) { |
450 | m->pgpath_to_activate = pgpath; | ||
451 | m->pg_init_count++; | 451 | m->pg_init_count++; |
452 | m->pg_init_required = 0; | 452 | m->pg_init_required = 0; |
453 | m->pg_init_in_progress = 1; | 453 | m->pg_init_in_progress = 1; |
@@ -708,6 +708,10 @@ static int parse_hw_handler(struct arg_set *as, struct multipath *m) | |||
708 | m->hw_handler_name = NULL; | 708 | m->hw_handler_name = NULL; |
709 | return -EINVAL; | 709 | return -EINVAL; |
710 | } | 710 | } |
711 | |||
712 | if (hw_argc > 1) | ||
713 | DMWARN("Ignoring user-specified arguments for " | ||
714 | "hardware handler \"%s\"", m->hw_handler_name); | ||
711 | consume(as, hw_argc - 1); | 715 | consume(as, hw_argc - 1); |
712 | 716 | ||
713 | return 0; | 717 | return 0; |
diff --git a/drivers/md/dm-raid1.c b/drivers/md/dm-raid1.c index 9d7b53ed75b2..ec43f9fa4b2a 100644 --- a/drivers/md/dm-raid1.c +++ b/drivers/md/dm-raid1.c | |||
@@ -1032,6 +1032,7 @@ static void mirror_dtr(struct dm_target *ti) | |||
1032 | 1032 | ||
1033 | del_timer_sync(&ms->timer); | 1033 | del_timer_sync(&ms->timer); |
1034 | flush_workqueue(ms->kmirrord_wq); | 1034 | flush_workqueue(ms->kmirrord_wq); |
1035 | flush_scheduled_work(); | ||
1035 | dm_kcopyd_client_destroy(ms->kcopyd_client); | 1036 | dm_kcopyd_client_destroy(ms->kcopyd_client); |
1036 | destroy_workqueue(ms->kmirrord_wq); | 1037 | destroy_workqueue(ms->kmirrord_wq); |
1037 | free_context(ms, ti, ms->nr_mirrors); | 1038 | free_context(ms, ti, ms->nr_mirrors); |
diff --git a/drivers/md/dm-stripe.c b/drivers/md/dm-stripe.c index a2d068dbe9e2..9e4ef88d421e 100644 --- a/drivers/md/dm-stripe.c +++ b/drivers/md/dm-stripe.c | |||
@@ -320,8 +320,10 @@ int __init dm_stripe_init(void) | |||
320 | int r; | 320 | int r; |
321 | 321 | ||
322 | r = dm_register_target(&stripe_target); | 322 | r = dm_register_target(&stripe_target); |
323 | if (r < 0) | 323 | if (r < 0) { |
324 | DMWARN("target registration failed"); | 324 | DMWARN("target registration failed"); |
325 | return r; | ||
326 | } | ||
325 | 327 | ||
326 | kstriped = create_singlethread_workqueue("kstriped"); | 328 | kstriped = create_singlethread_workqueue("kstriped"); |
327 | if (!kstriped) { | 329 | if (!kstriped) { |
diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 6963ad148408..c99e4728ff41 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c | |||
@@ -375,7 +375,7 @@ static void start_io_acct(struct dm_io *io) | |||
375 | dm_disk(md)->part0.in_flight = atomic_inc_return(&md->pending); | 375 | dm_disk(md)->part0.in_flight = atomic_inc_return(&md->pending); |
376 | } | 376 | } |
377 | 377 | ||
378 | static int end_io_acct(struct dm_io *io) | 378 | static void end_io_acct(struct dm_io *io) |
379 | { | 379 | { |
380 | struct mapped_device *md = io->md; | 380 | struct mapped_device *md = io->md; |
381 | struct bio *bio = io->bio; | 381 | struct bio *bio = io->bio; |
@@ -391,7 +391,9 @@ static int end_io_acct(struct dm_io *io) | |||
391 | dm_disk(md)->part0.in_flight = pending = | 391 | dm_disk(md)->part0.in_flight = pending = |
392 | atomic_dec_return(&md->pending); | 392 | atomic_dec_return(&md->pending); |
393 | 393 | ||
394 | return !pending; | 394 | /* nudge anyone waiting on suspend queue */ |
395 | if (!pending) | ||
396 | wake_up(&md->wait); | ||
395 | } | 397 | } |
396 | 398 | ||
397 | /* | 399 | /* |
@@ -499,9 +501,7 @@ static void dec_pending(struct dm_io *io, int error) | |||
499 | spin_unlock_irqrestore(&io->md->pushback_lock, flags); | 501 | spin_unlock_irqrestore(&io->md->pushback_lock, flags); |
500 | } | 502 | } |
501 | 503 | ||
502 | if (end_io_acct(io)) | 504 | end_io_acct(io); |
503 | /* nudge anyone waiting on suspend queue */ | ||
504 | wake_up(&io->md->wait); | ||
505 | 505 | ||
506 | if (io->error != DM_ENDIO_REQUEUE) { | 506 | if (io->error != DM_ENDIO_REQUEUE) { |
507 | blk_add_trace_bio(io->md->queue, io->bio, | 507 | blk_add_trace_bio(io->md->queue, io->bio, |
@@ -937,16 +937,24 @@ static void dm_unplug_all(struct request_queue *q) | |||
937 | 937 | ||
938 | static int dm_any_congested(void *congested_data, int bdi_bits) | 938 | static int dm_any_congested(void *congested_data, int bdi_bits) |
939 | { | 939 | { |
940 | int r; | 940 | int r = bdi_bits; |
941 | struct mapped_device *md = (struct mapped_device *) congested_data; | 941 | struct mapped_device *md = congested_data; |
942 | struct dm_table *map = dm_get_table(md); | 942 | struct dm_table *map; |
943 | 943 | ||
944 | if (!map || test_bit(DMF_BLOCK_IO, &md->flags)) | 944 | atomic_inc(&md->pending); |
945 | r = bdi_bits; | 945 | |
946 | else | 946 | if (!test_bit(DMF_BLOCK_IO, &md->flags)) { |
947 | r = dm_table_any_congested(map, bdi_bits); | 947 | map = dm_get_table(md); |
948 | if (map) { | ||
949 | r = dm_table_any_congested(map, bdi_bits); | ||
950 | dm_table_put(map); | ||
951 | } | ||
952 | } | ||
953 | |||
954 | if (!atomic_dec_return(&md->pending)) | ||
955 | /* nudge anyone waiting on suspend queue */ | ||
956 | wake_up(&md->wait); | ||
948 | 957 | ||
949 | dm_table_put(map); | ||
950 | return r; | 958 | return r; |
951 | } | 959 | } |
952 | 960 | ||
diff --git a/drivers/media/dvb/dm1105/dm1105.c b/drivers/media/dvb/dm1105/dm1105.c index 14e627ef6465..c1d92f838ca8 100644 --- a/drivers/media/dvb/dm1105/dm1105.c +++ b/drivers/media/dvb/dm1105/dm1105.c | |||
@@ -376,7 +376,7 @@ static void dm1105dvb_dma_unmap(struct dm1105dvb *dm1105dvb) | |||
376 | pci_free_consistent(dm1105dvb->pdev, 6*DM1105_DMA_BYTES, dm1105dvb->ts_buf, dm1105dvb->dma_addr); | 376 | pci_free_consistent(dm1105dvb->pdev, 6*DM1105_DMA_BYTES, dm1105dvb->ts_buf, dm1105dvb->dma_addr); |
377 | } | 377 | } |
378 | 378 | ||
379 | static void __devinit dm1105dvb_enable_irqs(struct dm1105dvb *dm1105dvb) | 379 | static void dm1105dvb_enable_irqs(struct dm1105dvb *dm1105dvb) |
380 | { | 380 | { |
381 | outb(INTMAK_ALLMASK, dm_io_mem(DM1105_INTMAK)); | 381 | outb(INTMAK_ALLMASK, dm_io_mem(DM1105_INTMAK)); |
382 | outb(1, dm_io_mem(DM1105_CR)); | 382 | outb(1, dm_io_mem(DM1105_CR)); |
diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c index 8557bf12cfb4..7a421e9dba5a 100644 --- a/drivers/media/dvb/dvb-core/dvb_frontend.c +++ b/drivers/media/dvb/dvb-core/dvb_frontend.c | |||
@@ -585,6 +585,8 @@ restart: | |||
585 | if (fe->ops.set_voltage) | 585 | if (fe->ops.set_voltage) |
586 | fe->ops.set_voltage(fe, SEC_VOLTAGE_OFF); | 586 | fe->ops.set_voltage(fe, SEC_VOLTAGE_OFF); |
587 | if (fe->ops.tuner_ops.sleep) { | 587 | if (fe->ops.tuner_ops.sleep) { |
588 | if (fe->ops.i2c_gate_ctrl) | ||
589 | fe->ops.i2c_gate_ctrl(fe, 1); | ||
588 | fe->ops.tuner_ops.sleep(fe); | 590 | fe->ops.tuner_ops.sleep(fe); |
589 | if (fe->ops.i2c_gate_ctrl) | 591 | if (fe->ops.i2c_gate_ctrl) |
590 | fe->ops.i2c_gate_ctrl(fe, 0); | 592 | fe->ops.i2c_gate_ctrl(fe, 0); |
@@ -934,7 +936,8 @@ void dtv_property_dump(struct dtv_property *tvp) | |||
934 | int is_legacy_delivery_system(fe_delivery_system_t s) | 936 | int is_legacy_delivery_system(fe_delivery_system_t s) |
935 | { | 937 | { |
936 | if((s == SYS_UNDEFINED) || (s == SYS_DVBC_ANNEX_AC) || | 938 | if((s == SYS_UNDEFINED) || (s == SYS_DVBC_ANNEX_AC) || |
937 | (s == SYS_DVBC_ANNEX_B) || (s == SYS_DVBT) || (s == SYS_DVBS)) | 939 | (s == SYS_DVBC_ANNEX_B) || (s == SYS_DVBT) || (s == SYS_DVBS) || |
940 | (s == SYS_ATSC)) | ||
938 | return 1; | 941 | return 1; |
939 | 942 | ||
940 | return 0; | 943 | return 0; |
diff --git a/drivers/media/dvb/dvb-usb/af9015.c b/drivers/media/dvb/dvb-usb/af9015.c index 847d8fdd9ec4..e9ab0249d133 100644 --- a/drivers/media/dvb/dvb-usb/af9015.c +++ b/drivers/media/dvb/dvb-usb/af9015.c | |||
@@ -681,12 +681,6 @@ static int af9015_download_firmware(struct usb_device *udev, | |||
681 | goto error; | 681 | goto error; |
682 | } | 682 | } |
683 | 683 | ||
684 | /* firmware is running, reconnect device in the usb bus */ | ||
685 | req.cmd = RECONNECT_USB; | ||
686 | ret = af9015_rw_udev(udev, &req); | ||
687 | if (ret) | ||
688 | err("reconnect failed: %d", ret); | ||
689 | |||
690 | error: | 684 | error: |
691 | return ret; | 685 | return ret; |
692 | } | 686 | } |
@@ -1208,6 +1202,7 @@ static struct dvb_usb_device_properties af9015_properties[] = { | |||
1208 | .usb_ctrl = DEVICE_SPECIFIC, | 1202 | .usb_ctrl = DEVICE_SPECIFIC, |
1209 | .download_firmware = af9015_download_firmware, | 1203 | .download_firmware = af9015_download_firmware, |
1210 | .firmware = "dvb-usb-af9015.fw", | 1204 | .firmware = "dvb-usb-af9015.fw", |
1205 | .no_reconnect = 1, | ||
1211 | 1206 | ||
1212 | .size_of_priv = sizeof(struct af9015_state), \ | 1207 | .size_of_priv = sizeof(struct af9015_state), \ |
1213 | 1208 | ||
@@ -1306,6 +1301,7 @@ static struct dvb_usb_device_properties af9015_properties[] = { | |||
1306 | .usb_ctrl = DEVICE_SPECIFIC, | 1301 | .usb_ctrl = DEVICE_SPECIFIC, |
1307 | .download_firmware = af9015_download_firmware, | 1302 | .download_firmware = af9015_download_firmware, |
1308 | .firmware = "dvb-usb-af9015.fw", | 1303 | .firmware = "dvb-usb-af9015.fw", |
1304 | .no_reconnect = 1, | ||
1309 | 1305 | ||
1310 | .size_of_priv = sizeof(struct af9015_state), \ | 1306 | .size_of_priv = sizeof(struct af9015_state), \ |
1311 | 1307 | ||
diff --git a/drivers/media/dvb/dvb-usb/dib0700.h b/drivers/media/dvb/dvb-usb/dib0700.h index 739193943c17..8b544fe79b0d 100644 --- a/drivers/media/dvb/dvb-usb/dib0700.h +++ b/drivers/media/dvb/dvb-usb/dib0700.h | |||
@@ -22,7 +22,7 @@ extern int dvb_usb_dib0700_debug; | |||
22 | 22 | ||
23 | #define REQUEST_I2C_READ 0x2 | 23 | #define REQUEST_I2C_READ 0x2 |
24 | #define REQUEST_I2C_WRITE 0x3 | 24 | #define REQUEST_I2C_WRITE 0x3 |
25 | #define REQUEST_POLL_RC 0x4 | 25 | #define REQUEST_POLL_RC 0x4 /* deprecated in firmware v1.20 */ |
26 | #define REQUEST_JUMPRAM 0x8 | 26 | #define REQUEST_JUMPRAM 0x8 |
27 | #define REQUEST_SET_CLOCK 0xB | 27 | #define REQUEST_SET_CLOCK 0xB |
28 | #define REQUEST_SET_GPIO 0xC | 28 | #define REQUEST_SET_GPIO 0xC |
@@ -40,11 +40,14 @@ struct dib0700_state { | |||
40 | u16 mt2060_if1[2]; | 40 | u16 mt2060_if1[2]; |
41 | u8 rc_toggle; | 41 | u8 rc_toggle; |
42 | u8 rc_counter; | 42 | u8 rc_counter; |
43 | u8 rc_func_version; | ||
43 | u8 is_dib7000pc; | 44 | u8 is_dib7000pc; |
44 | u8 fw_use_new_i2c_api; | 45 | u8 fw_use_new_i2c_api; |
45 | u8 disable_streaming_master_mode; | 46 | u8 disable_streaming_master_mode; |
46 | }; | 47 | }; |
47 | 48 | ||
49 | extern int dib0700_get_version(struct dvb_usb_device *d, u32 *hwversion, | ||
50 | u32 *romversion, u32 *ramversion, u32 *fwtype); | ||
48 | extern int dib0700_set_gpio(struct dvb_usb_device *, enum dib07x0_gpios gpio, u8 gpio_dir, u8 gpio_val); | 51 | extern int dib0700_set_gpio(struct dvb_usb_device *, enum dib07x0_gpios gpio, u8 gpio_dir, u8 gpio_val); |
49 | extern int dib0700_ctrl_clock(struct dvb_usb_device *d, u32 clk_MHz, u8 clock_out_gp3); | 52 | extern int dib0700_ctrl_clock(struct dvb_usb_device *d, u32 clk_MHz, u8 clock_out_gp3); |
50 | extern int dib0700_ctrl_rd(struct dvb_usb_device *d, u8 *tx, u8 txlen, u8 *rx, u8 rxlen); | 53 | extern int dib0700_ctrl_rd(struct dvb_usb_device *d, u8 *tx, u8 txlen, u8 *rx, u8 rxlen); |
diff --git a/drivers/media/dvb/dvb-usb/dib0700_core.c b/drivers/media/dvb/dvb-usb/dib0700_core.c index dd53cee3896d..200b215f4d8b 100644 --- a/drivers/media/dvb/dvb-usb/dib0700_core.c +++ b/drivers/media/dvb/dvb-usb/dib0700_core.c | |||
@@ -19,6 +19,22 @@ MODULE_PARM_DESC(dvb_usb_dib0700_ir_proto, "set ir protocol (0=NEC, 1=RC5 (defau | |||
19 | 19 | ||
20 | DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); | 20 | DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); |
21 | 21 | ||
22 | |||
23 | int dib0700_get_version(struct dvb_usb_device *d, u32 *hwversion, | ||
24 | u32 *romversion, u32 *ramversion, u32 *fwtype) | ||
25 | { | ||
26 | u8 b[16]; | ||
27 | int ret = usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev, 0), | ||
28 | REQUEST_GET_VERSION, | ||
29 | USB_TYPE_VENDOR | USB_DIR_IN, 0, 0, | ||
30 | b, sizeof(b), USB_CTRL_GET_TIMEOUT); | ||
31 | *hwversion = (b[0] << 24) | (b[1] << 16) | (b[2] << 8) | b[3]; | ||
32 | *romversion = (b[4] << 24) | (b[5] << 16) | (b[6] << 8) | b[7]; | ||
33 | *ramversion = (b[8] << 24) | (b[9] << 16) | (b[10] << 8) | b[11]; | ||
34 | *fwtype = (b[12] << 24) | (b[13] << 16) | (b[14] << 8) | b[15]; | ||
35 | return ret; | ||
36 | } | ||
37 | |||
22 | /* expecting rx buffer: request data[0] data[1] ... data[2] */ | 38 | /* expecting rx buffer: request data[0] data[1] ... data[2] */ |
23 | static int dib0700_ctrl_wr(struct dvb_usb_device *d, u8 *tx, u8 txlen) | 39 | static int dib0700_ctrl_wr(struct dvb_usb_device *d, u8 *tx, u8 txlen) |
24 | { | 40 | { |
diff --git a/drivers/media/dvb/dvb-usb/dib0700_devices.c b/drivers/media/dvb/dvb-usb/dib0700_devices.c index 0cfccc24b190..f28d3ae59e04 100644 --- a/drivers/media/dvb/dvb-usb/dib0700_devices.c +++ b/drivers/media/dvb/dvb-usb/dib0700_devices.c | |||
@@ -38,6 +38,7 @@ static struct mt2060_config bristol_mt2060_config[2] = { | |||
38 | } | 38 | } |
39 | }; | 39 | }; |
40 | 40 | ||
41 | |||
41 | static struct dibx000_agc_config bristol_dib3000p_mt2060_agc_config = { | 42 | static struct dibx000_agc_config bristol_dib3000p_mt2060_agc_config = { |
42 | .band_caps = BAND_VHF | BAND_UHF, | 43 | .band_caps = BAND_VHF | BAND_UHF, |
43 | .setup = (1 << 8) | (5 << 5) | (0 << 4) | (0 << 3) | (0 << 2) | (2 << 0), | 44 | .setup = (1 << 8) | (5 << 5) | (0 << 4) | (0 << 3) | (0 << 2) | (2 << 0), |
@@ -451,8 +452,13 @@ static u8 rc_request[] = { REQUEST_POLL_RC, 0 }; | |||
451 | 452 | ||
452 | /* Number of keypresses to ignore before start repeating */ | 453 | /* Number of keypresses to ignore before start repeating */ |
453 | #define RC_REPEAT_DELAY 2 | 454 | #define RC_REPEAT_DELAY 2 |
455 | #define RC_REPEAT_DELAY_V1_20 5 | ||
454 | 456 | ||
455 | static int dib0700_rc_query(struct dvb_usb_device *d, u32 *event, int *state) | 457 | |
458 | |||
459 | /* Used by firmware versions < 1.20 (deprecated) */ | ||
460 | static int dib0700_rc_query_legacy(struct dvb_usb_device *d, u32 *event, | ||
461 | int *state) | ||
456 | { | 462 | { |
457 | u8 key[4]; | 463 | u8 key[4]; |
458 | int i; | 464 | int i; |
@@ -529,6 +535,137 @@ static int dib0700_rc_query(struct dvb_usb_device *d, u32 *event, int *state) | |||
529 | return 0; | 535 | return 0; |
530 | } | 536 | } |
531 | 537 | ||
538 | /* This is the structure of the RC response packet starting in firmware 1.20 */ | ||
539 | struct dib0700_rc_response { | ||
540 | u8 report_id; | ||
541 | u8 data_state; | ||
542 | u8 system_msb; | ||
543 | u8 system_lsb; | ||
544 | u8 data; | ||
545 | u8 not_data; | ||
546 | }; | ||
547 | |||
548 | /* This supports the new IR response format for firmware v1.20 */ | ||
549 | static int dib0700_rc_query_v1_20(struct dvb_usb_device *d, u32 *event, | ||
550 | int *state) | ||
551 | { | ||
552 | struct dvb_usb_rc_key *keymap = d->props.rc_key_map; | ||
553 | struct dib0700_state *st = d->priv; | ||
554 | struct dib0700_rc_response poll_reply; | ||
555 | u8 buf[6]; | ||
556 | int i; | ||
557 | int status; | ||
558 | int actlen; | ||
559 | int found = 0; | ||
560 | |||
561 | /* Set initial results in case we exit the function early */ | ||
562 | *event = 0; | ||
563 | *state = REMOTE_NO_KEY_PRESSED; | ||
564 | |||
565 | /* Firmware v1.20 provides RC data via bulk endpoint 1 */ | ||
566 | status = usb_bulk_msg(d->udev, usb_rcvbulkpipe(d->udev, 1), buf, | ||
567 | sizeof(buf), &actlen, 50); | ||
568 | if (status < 0) { | ||
569 | /* No data available (meaning no key press) */ | ||
570 | return 0; | ||
571 | } | ||
572 | |||
573 | if (actlen != sizeof(buf)) { | ||
574 | /* We didn't get back the 6 byte message we expected */ | ||
575 | err("Unexpected RC response size [%d]", actlen); | ||
576 | return -1; | ||
577 | } | ||
578 | |||
579 | poll_reply.report_id = buf[0]; | ||
580 | poll_reply.data_state = buf[1]; | ||
581 | poll_reply.system_msb = buf[2]; | ||
582 | poll_reply.system_lsb = buf[3]; | ||
583 | poll_reply.data = buf[4]; | ||
584 | poll_reply.not_data = buf[5]; | ||
585 | |||
586 | /* | ||
587 | info("rid=%02x ds=%02x sm=%02x sl=%02x d=%02x nd=%02x\n", | ||
588 | poll_reply.report_id, poll_reply.data_state, | ||
589 | poll_reply.system_msb, poll_reply.system_lsb, | ||
590 | poll_reply.data, poll_reply.not_data); | ||
591 | */ | ||
592 | |||
593 | if ((poll_reply.data + poll_reply.not_data) != 0xff) { | ||
594 | /* Key failed integrity check */ | ||
595 | err("key failed integrity check: %02x %02x %02x %02x", | ||
596 | poll_reply.system_msb, poll_reply.system_lsb, | ||
597 | poll_reply.data, poll_reply.not_data); | ||
598 | return -1; | ||
599 | } | ||
600 | |||
601 | /* Find the key in the map */ | ||
602 | for (i = 0; i < d->props.rc_key_map_size; i++) { | ||
603 | if (keymap[i].custom == poll_reply.system_lsb && | ||
604 | keymap[i].data == poll_reply.data) { | ||
605 | *event = keymap[i].event; | ||
606 | found = 1; | ||
607 | break; | ||
608 | } | ||
609 | } | ||
610 | |||
611 | if (found == 0) { | ||
612 | err("Unknown remote controller key: %02x %02x %02x %02x", | ||
613 | poll_reply.system_msb, poll_reply.system_lsb, | ||
614 | poll_reply.data, poll_reply.not_data); | ||
615 | d->last_event = 0; | ||
616 | return 0; | ||
617 | } | ||
618 | |||
619 | if (poll_reply.data_state == 1) { | ||
620 | /* New key hit */ | ||
621 | st->rc_counter = 0; | ||
622 | *event = keymap[i].event; | ||
623 | *state = REMOTE_KEY_PRESSED; | ||
624 | d->last_event = keymap[i].event; | ||
625 | } else if (poll_reply.data_state == 2) { | ||
626 | /* Key repeated */ | ||
627 | st->rc_counter++; | ||
628 | |||
629 | /* prevents unwanted double hits */ | ||
630 | if (st->rc_counter > RC_REPEAT_DELAY_V1_20) { | ||
631 | *event = d->last_event; | ||
632 | *state = REMOTE_KEY_PRESSED; | ||
633 | st->rc_counter = RC_REPEAT_DELAY_V1_20; | ||
634 | } | ||
635 | } else { | ||
636 | err("Unknown data state [%d]", poll_reply.data_state); | ||
637 | } | ||
638 | |||
639 | return 0; | ||
640 | } | ||
641 | |||
642 | static int dib0700_rc_query(struct dvb_usb_device *d, u32 *event, int *state) | ||
643 | { | ||
644 | struct dib0700_state *st = d->priv; | ||
645 | |||
646 | /* Because some people may have improperly named firmware files, | ||
647 | let's figure out whether to use the new firmware call or the legacy | ||
648 | call based on the firmware version embedded in the file */ | ||
649 | if (st->rc_func_version == 0) { | ||
650 | u32 hwver, romver, ramver, fwtype; | ||
651 | int ret = dib0700_get_version(d, &hwver, &romver, &ramver, | ||
652 | &fwtype); | ||
653 | if (ret < 0) { | ||
654 | err("Could not determine version info"); | ||
655 | return -1; | ||
656 | } | ||
657 | if (ramver < 0x10200) | ||
658 | st->rc_func_version = 1; | ||
659 | else | ||
660 | st->rc_func_version = 2; | ||
661 | } | ||
662 | |||
663 | if (st->rc_func_version == 2) | ||
664 | return dib0700_rc_query_v1_20(d, event, state); | ||
665 | else | ||
666 | return dib0700_rc_query_legacy(d, event, state); | ||
667 | } | ||
668 | |||
532 | static struct dvb_usb_rc_key dib0700_rc_keys[] = { | 669 | static struct dvb_usb_rc_key dib0700_rc_keys[] = { |
533 | /* Key codes for the tiny Pinnacle remote*/ | 670 | /* Key codes for the tiny Pinnacle remote*/ |
534 | { 0x07, 0x00, KEY_MUTE }, | 671 | { 0x07, 0x00, KEY_MUTE }, |
diff --git a/drivers/media/dvb/dvb-usb/usb-urb.c b/drivers/media/dvb/dvb-usb/usb-urb.c index 397f51a7b2ad..da93b9e982c0 100644 --- a/drivers/media/dvb/dvb-usb/usb-urb.c +++ b/drivers/media/dvb/dvb-usb/usb-urb.c | |||
@@ -135,7 +135,7 @@ stream->buf_list[stream->buf_num], (long long)stream->dma_addr[stream->buf_num]) | |||
135 | 135 | ||
136 | static int usb_bulk_urb_init(struct usb_data_stream *stream) | 136 | static int usb_bulk_urb_init(struct usb_data_stream *stream) |
137 | { | 137 | { |
138 | int i; | 138 | int i, j; |
139 | 139 | ||
140 | if ((i = usb_allocate_stream_buffers(stream,stream->props.count, | 140 | if ((i = usb_allocate_stream_buffers(stream,stream->props.count, |
141 | stream->props.u.bulk.buffersize)) < 0) | 141 | stream->props.u.bulk.buffersize)) < 0) |
@@ -143,9 +143,13 @@ static int usb_bulk_urb_init(struct usb_data_stream *stream) | |||
143 | 143 | ||
144 | /* allocate the URBs */ | 144 | /* allocate the URBs */ |
145 | for (i = 0; i < stream->props.count; i++) { | 145 | for (i = 0; i < stream->props.count; i++) { |
146 | if ((stream->urb_list[i] = usb_alloc_urb(0,GFP_ATOMIC)) == NULL) | 146 | stream->urb_list[i] = usb_alloc_urb(0, GFP_ATOMIC); |
147 | if (!stream->urb_list[i]) { | ||
148 | deb_mem("not enough memory for urb_alloc_urb!.\n"); | ||
149 | for (j = 0; j < i; j++) | ||
150 | usb_free_urb(stream->urb_list[i]); | ||
147 | return -ENOMEM; | 151 | return -ENOMEM; |
148 | 152 | } | |
149 | usb_fill_bulk_urb( stream->urb_list[i], stream->udev, | 153 | usb_fill_bulk_urb( stream->urb_list[i], stream->udev, |
150 | usb_rcvbulkpipe(stream->udev,stream->props.endpoint), | 154 | usb_rcvbulkpipe(stream->udev,stream->props.endpoint), |
151 | stream->buf_list[i], | 155 | stream->buf_list[i], |
@@ -170,9 +174,14 @@ static int usb_isoc_urb_init(struct usb_data_stream *stream) | |||
170 | for (i = 0; i < stream->props.count; i++) { | 174 | for (i = 0; i < stream->props.count; i++) { |
171 | struct urb *urb; | 175 | struct urb *urb; |
172 | int frame_offset = 0; | 176 | int frame_offset = 0; |
173 | if ((stream->urb_list[i] = | 177 | |
174 | usb_alloc_urb(stream->props.u.isoc.framesperurb,GFP_ATOMIC)) == NULL) | 178 | stream->urb_list[i] = usb_alloc_urb(stream->props.u.isoc.framesperurb, GFP_ATOMIC); |
179 | if (!stream->urb_list[i]) { | ||
180 | deb_mem("not enough memory for urb_alloc_urb!\n"); | ||
181 | for (j = 0; j < i; j++) | ||
182 | usb_free_urb(stream->urb_list[i]); | ||
175 | return -ENOMEM; | 183 | return -ENOMEM; |
184 | } | ||
176 | 185 | ||
177 | urb = stream->urb_list[i]; | 186 | urb = stream->urb_list[i]; |
178 | 187 | ||
diff --git a/drivers/media/dvb/siano/sms-cards.c b/drivers/media/dvb/siano/sms-cards.c index 6f9b77360440..e98d6caf2c23 100644 --- a/drivers/media/dvb/siano/sms-cards.c +++ b/drivers/media/dvb/siano/sms-cards.c | |||
@@ -95,7 +95,7 @@ static struct sms_board sms_boards[] = { | |||
95 | [SMS1XXX_BOARD_HAUPPAUGE_WINDHAM] = { | 95 | [SMS1XXX_BOARD_HAUPPAUGE_WINDHAM] = { |
96 | .name = "Hauppauge WinTV MiniStick", | 96 | .name = "Hauppauge WinTV MiniStick", |
97 | .type = SMS_NOVA_B0, | 97 | .type = SMS_NOVA_B0, |
98 | .fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-hcw-55xxx-dvbt-01.fw", | 98 | .fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-hcw-55xxx-dvbt-02.fw", |
99 | }, | 99 | }, |
100 | }; | 100 | }; |
101 | 101 | ||
diff --git a/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c b/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c index 66ab0c6e9783..4a3f2b8ea37d 100644 --- a/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c +++ b/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c | |||
@@ -808,6 +808,12 @@ static int ttusb_alloc_iso_urbs(struct ttusb *ttusb) | |||
808 | ISO_BUF_COUNT, | 808 | ISO_BUF_COUNT, |
809 | &ttusb->iso_dma_handle); | 809 | &ttusb->iso_dma_handle); |
810 | 810 | ||
811 | if (!ttusb->iso_buffer) { | ||
812 | dprintk("%s: pci_alloc_consistent - not enough memory\n", | ||
813 | __func__); | ||
814 | return -ENOMEM; | ||
815 | } | ||
816 | |||
811 | memset(ttusb->iso_buffer, 0, | 817 | memset(ttusb->iso_buffer, 0, |
812 | ISO_FRAME_SIZE * FRAMES_PER_ISO_BUF * ISO_BUF_COUNT); | 818 | ISO_FRAME_SIZE * FRAMES_PER_ISO_BUF * ISO_BUF_COUNT); |
813 | 819 | ||
@@ -1659,7 +1665,14 @@ static int ttusb_probe(struct usb_interface *intf, const struct usb_device_id *i | |||
1659 | 1665 | ||
1660 | ttusb_setup_interfaces(ttusb); | 1666 | ttusb_setup_interfaces(ttusb); |
1661 | 1667 | ||
1662 | ttusb_alloc_iso_urbs(ttusb); | 1668 | result = ttusb_alloc_iso_urbs(ttusb); |
1669 | if (result < 0) { | ||
1670 | dprintk("%s: ttusb_alloc_iso_urbs - failed\n", __func__); | ||
1671 | mutex_unlock(&ttusb->semi2c); | ||
1672 | kfree(ttusb); | ||
1673 | return result; | ||
1674 | } | ||
1675 | |||
1663 | if (ttusb_init_controller(ttusb)) | 1676 | if (ttusb_init_controller(ttusb)) |
1664 | printk("ttusb_init_controller: error\n"); | 1677 | printk("ttusb_init_controller: error\n"); |
1665 | 1678 | ||
diff --git a/drivers/media/dvb/ttusb-dec/ttusb_dec.c b/drivers/media/dvb/ttusb-dec/ttusb_dec.c index ab33fec8a19f..0aa96df80fc2 100644 --- a/drivers/media/dvb/ttusb-dec/ttusb_dec.c +++ b/drivers/media/dvb/ttusb-dec/ttusb_dec.c | |||
@@ -1157,6 +1157,12 @@ static int ttusb_dec_alloc_iso_urbs(struct ttusb_dec *dec) | |||
1157 | ISO_BUF_COUNT), | 1157 | ISO_BUF_COUNT), |
1158 | &dec->iso_dma_handle); | 1158 | &dec->iso_dma_handle); |
1159 | 1159 | ||
1160 | if (!dec->iso_buffer) { | ||
1161 | dprintk("%s: pci_alloc_consistent - not enough memory\n", | ||
1162 | __func__); | ||
1163 | return -ENOMEM; | ||
1164 | } | ||
1165 | |||
1160 | memset(dec->iso_buffer, 0, | 1166 | memset(dec->iso_buffer, 0, |
1161 | ISO_FRAME_SIZE * (FRAMES_PER_ISO_BUF * ISO_BUF_COUNT)); | 1167 | ISO_FRAME_SIZE * (FRAMES_PER_ISO_BUF * ISO_BUF_COUNT)); |
1162 | 1168 | ||
@@ -1254,6 +1260,7 @@ static int ttusb_dec_init_usb(struct ttusb_dec *dec) | |||
1254 | dec->irq_buffer = usb_buffer_alloc(dec->udev,IRQ_PACKET_SIZE, | 1260 | dec->irq_buffer = usb_buffer_alloc(dec->udev,IRQ_PACKET_SIZE, |
1255 | GFP_ATOMIC, &dec->irq_dma_handle); | 1261 | GFP_ATOMIC, &dec->irq_dma_handle); |
1256 | if(!dec->irq_buffer) { | 1262 | if(!dec->irq_buffer) { |
1263 | usb_free_urb(dec->irq_urb); | ||
1257 | return -ENOMEM; | 1264 | return -ENOMEM; |
1258 | } | 1265 | } |
1259 | usb_fill_int_urb(dec->irq_urb, dec->udev,dec->irq_pipe, | 1266 | usb_fill_int_urb(dec->irq_urb, dec->udev,dec->irq_pipe, |
diff --git a/drivers/media/video/em28xx/em28xx-audio.c b/drivers/media/video/em28xx/em28xx-audio.c index ac3292d7646c..7a8d49ef646e 100644 --- a/drivers/media/video/em28xx/em28xx-audio.c +++ b/drivers/media/video/em28xx/em28xx-audio.c | |||
@@ -62,7 +62,7 @@ static int em28xx_isoc_audio_deinit(struct em28xx *dev) | |||
62 | 62 | ||
63 | dprintk("Stopping isoc\n"); | 63 | dprintk("Stopping isoc\n"); |
64 | for (i = 0; i < EM28XX_AUDIO_BUFS; i++) { | 64 | for (i = 0; i < EM28XX_AUDIO_BUFS; i++) { |
65 | usb_kill_urb(dev->adev->urb[i]); | 65 | usb_unlink_urb(dev->adev->urb[i]); |
66 | usb_free_urb(dev->adev->urb[i]); | 66 | usb_free_urb(dev->adev->urb[i]); |
67 | dev->adev->urb[i] = NULL; | 67 | dev->adev->urb[i] = NULL; |
68 | } | 68 | } |
@@ -75,7 +75,6 @@ static void em28xx_audio_isocirq(struct urb *urb) | |||
75 | struct em28xx *dev = urb->context; | 75 | struct em28xx *dev = urb->context; |
76 | int i; | 76 | int i; |
77 | unsigned int oldptr; | 77 | unsigned int oldptr; |
78 | unsigned long flags; | ||
79 | int period_elapsed = 0; | 78 | int period_elapsed = 0; |
80 | int status; | 79 | int status; |
81 | unsigned char *cp; | 80 | unsigned char *cp; |
@@ -96,9 +95,21 @@ static void em28xx_audio_isocirq(struct urb *urb) | |||
96 | if (!length) | 95 | if (!length) |
97 | continue; | 96 | continue; |
98 | 97 | ||
99 | spin_lock_irqsave(&dev->adev->slock, flags); | ||
100 | |||
101 | oldptr = dev->adev->hwptr_done_capture; | 98 | oldptr = dev->adev->hwptr_done_capture; |
99 | if (oldptr + length >= runtime->buffer_size) { | ||
100 | unsigned int cnt = | ||
101 | runtime->buffer_size - oldptr; | ||
102 | memcpy(runtime->dma_area + oldptr * stride, cp, | ||
103 | cnt * stride); | ||
104 | memcpy(runtime->dma_area, cp + cnt * stride, | ||
105 | length * stride - cnt * stride); | ||
106 | } else { | ||
107 | memcpy(runtime->dma_area + oldptr * stride, cp, | ||
108 | length * stride); | ||
109 | } | ||
110 | |||
111 | snd_pcm_stream_lock(substream); | ||
112 | |||
102 | dev->adev->hwptr_done_capture += length; | 113 | dev->adev->hwptr_done_capture += length; |
103 | if (dev->adev->hwptr_done_capture >= | 114 | if (dev->adev->hwptr_done_capture >= |
104 | runtime->buffer_size) | 115 | runtime->buffer_size) |
@@ -113,19 +124,7 @@ static void em28xx_audio_isocirq(struct urb *urb) | |||
113 | period_elapsed = 1; | 124 | period_elapsed = 1; |
114 | } | 125 | } |
115 | 126 | ||
116 | spin_unlock_irqrestore(&dev->adev->slock, flags); | 127 | snd_pcm_stream_unlock(substream); |
117 | |||
118 | if (oldptr + length >= runtime->buffer_size) { | ||
119 | unsigned int cnt = | ||
120 | runtime->buffer_size - oldptr; | ||
121 | memcpy(runtime->dma_area + oldptr * stride, cp, | ||
122 | cnt * stride); | ||
123 | memcpy(runtime->dma_area, cp + cnt * stride, | ||
124 | length * stride - cnt * stride); | ||
125 | } else { | ||
126 | memcpy(runtime->dma_area + oldptr * stride, cp, | ||
127 | length * stride); | ||
128 | } | ||
129 | } | 128 | } |
130 | if (period_elapsed) | 129 | if (period_elapsed) |
131 | snd_pcm_period_elapsed(substream); | 130 | snd_pcm_period_elapsed(substream); |
diff --git a/drivers/media/video/em28xx/em28xx-core.c b/drivers/media/video/em28xx/em28xx-core.c index 5d837c16ee22..15e2b525310d 100644 --- a/drivers/media/video/em28xx/em28xx-core.c +++ b/drivers/media/video/em28xx/em28xx-core.c | |||
@@ -69,19 +69,33 @@ int em28xx_read_reg_req_len(struct em28xx *dev, u8 req, u16 reg, | |||
69 | int ret, byte; | 69 | int ret, byte; |
70 | 70 | ||
71 | if (dev->state & DEV_DISCONNECTED) | 71 | if (dev->state & DEV_DISCONNECTED) |
72 | return(-ENODEV); | 72 | return -ENODEV; |
73 | |||
74 | if (len > URB_MAX_CTRL_SIZE) | ||
75 | return -EINVAL; | ||
73 | 76 | ||
74 | em28xx_regdbg("req=%02x, reg=%02x ", req, reg); | 77 | em28xx_regdbg("req=%02x, reg=%02x ", req, reg); |
75 | 78 | ||
79 | mutex_lock(&dev->ctrl_urb_lock); | ||
76 | ret = usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev, 0), req, | 80 | ret = usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev, 0), req, |
77 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 81 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
78 | 0x0000, reg, buf, len, HZ); | 82 | 0x0000, reg, dev->urb_buf, len, HZ); |
83 | if (ret < 0) { | ||
84 | if (reg_debug) | ||
85 | printk(" failed!\n"); | ||
86 | mutex_unlock(&dev->ctrl_urb_lock); | ||
87 | return ret; | ||
88 | } | ||
89 | |||
90 | if (len) | ||
91 | memcpy(buf, dev->urb_buf, len); | ||
92 | |||
93 | mutex_unlock(&dev->ctrl_urb_lock); | ||
79 | 94 | ||
80 | if (reg_debug) { | 95 | if (reg_debug) { |
81 | printk(ret < 0 ? " failed!\n" : "%02x values: ", ret); | 96 | printk("%02x values: ", ret); |
82 | for (byte = 0; byte < len; byte++) | 97 | for (byte = 0; byte < len; byte++) |
83 | printk(" %02x", (unsigned char)buf[byte]); | 98 | printk(" %02x", (unsigned char)buf[byte]); |
84 | |||
85 | printk("\n"); | 99 | printk("\n"); |
86 | } | 100 | } |
87 | 101 | ||
@@ -102,16 +116,20 @@ int em28xx_read_reg_req(struct em28xx *dev, u8 req, u16 reg) | |||
102 | 116 | ||
103 | em28xx_regdbg("req=%02x, reg=%02x:", req, reg); | 117 | em28xx_regdbg("req=%02x, reg=%02x:", req, reg); |
104 | 118 | ||
119 | mutex_lock(&dev->ctrl_urb_lock); | ||
105 | ret = usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev, 0), req, | 120 | ret = usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev, 0), req, |
106 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 121 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
107 | 0x0000, reg, &val, 1, HZ); | 122 | 0x0000, reg, dev->urb_buf, 1, HZ); |
108 | 123 | val = dev->urb_buf[0]; | |
109 | if (reg_debug) | 124 | mutex_unlock(&dev->ctrl_urb_lock); |
110 | printk(ret < 0 ? " failed!\n" : | ||
111 | "%02x\n", (unsigned char) val); | ||
112 | 125 | ||
113 | if (ret < 0) | 126 | if (ret < 0) { |
127 | printk(" failed!\n"); | ||
114 | return ret; | 128 | return ret; |
129 | } | ||
130 | |||
131 | if (reg_debug) | ||
132 | printk("%02x\n", (unsigned char) val); | ||
115 | 133 | ||
116 | return val; | 134 | return val; |
117 | } | 135 | } |
@@ -130,19 +148,13 @@ int em28xx_write_regs_req(struct em28xx *dev, u8 req, u16 reg, char *buf, | |||
130 | { | 148 | { |
131 | int ret; | 149 | int ret; |
132 | 150 | ||
133 | /*usb_control_msg seems to expect a kmalloced buffer */ | ||
134 | unsigned char *bufs; | ||
135 | |||
136 | if (dev->state & DEV_DISCONNECTED) | 151 | if (dev->state & DEV_DISCONNECTED) |
137 | return -ENODEV; | 152 | return -ENODEV; |
138 | 153 | ||
139 | if (len < 1) | 154 | if ((len < 1) || (len > URB_MAX_CTRL_SIZE)) |
140 | return -EINVAL; | 155 | return -EINVAL; |
141 | 156 | ||
142 | bufs = kmalloc(len, GFP_KERNEL); | ||
143 | |||
144 | em28xx_regdbg("req=%02x reg=%02x:", req, reg); | 157 | em28xx_regdbg("req=%02x reg=%02x:", req, reg); |
145 | |||
146 | if (reg_debug) { | 158 | if (reg_debug) { |
147 | int i; | 159 | int i; |
148 | for (i = 0; i < len; ++i) | 160 | for (i = 0; i < len; ++i) |
@@ -150,16 +162,16 @@ int em28xx_write_regs_req(struct em28xx *dev, u8 req, u16 reg, char *buf, | |||
150 | printk("\n"); | 162 | printk("\n"); |
151 | } | 163 | } |
152 | 164 | ||
153 | if (!bufs) | 165 | mutex_lock(&dev->ctrl_urb_lock); |
154 | return -ENOMEM; | 166 | memcpy(dev->urb_buf, buf, len); |
155 | memcpy(bufs, buf, len); | ||
156 | ret = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0), req, | 167 | ret = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0), req, |
157 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 168 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
158 | 0x0000, reg, bufs, len, HZ); | 169 | 0x0000, reg, dev->urb_buf, len, HZ); |
170 | mutex_unlock(&dev->ctrl_urb_lock); | ||
171 | |||
159 | if (dev->wait_after_write) | 172 | if (dev->wait_after_write) |
160 | msleep(dev->wait_after_write); | 173 | msleep(dev->wait_after_write); |
161 | 174 | ||
162 | kfree(bufs); | ||
163 | return ret; | 175 | return ret; |
164 | } | 176 | } |
165 | 177 | ||
@@ -270,6 +282,8 @@ static int em28xx_set_audio_source(struct em28xx *dev) | |||
270 | break; | 282 | break; |
271 | case EM28XX_AMUX_LINE_IN: | 283 | case EM28XX_AMUX_LINE_IN: |
272 | input = EM28XX_AUDIO_SRC_LINE; | 284 | input = EM28XX_AUDIO_SRC_LINE; |
285 | video = disable; | ||
286 | line = enable; | ||
273 | break; | 287 | break; |
274 | case EM28XX_AMUX_AC97_VIDEO: | 288 | case EM28XX_AMUX_AC97_VIDEO: |
275 | input = EM28XX_AUDIO_SRC_LINE; | 289 | input = EM28XX_AUDIO_SRC_LINE; |
diff --git a/drivers/media/video/em28xx/em28xx-i2c.c b/drivers/media/video/em28xx/em28xx-i2c.c index 3bab56b997fc..2360c61ddca9 100644 --- a/drivers/media/video/em28xx/em28xx-i2c.c +++ b/drivers/media/video/em28xx/em28xx-i2c.c | |||
@@ -337,9 +337,9 @@ static int em28xx_i2c_eeprom(struct em28xx *dev, unsigned char *eedata, int len) | |||
337 | /* Check if board has eeprom */ | 337 | /* Check if board has eeprom */ |
338 | err = i2c_master_recv(&dev->i2c_client, &buf, 0); | 338 | err = i2c_master_recv(&dev->i2c_client, &buf, 0); |
339 | if (err < 0) { | 339 | if (err < 0) { |
340 | em28xx_errdev("%s: i2c_master_recv failed! err [%d]\n", | 340 | em28xx_errdev("board has no eeprom\n"); |
341 | __func__, err); | 341 | memset(eedata, 0, len); |
342 | return err; | 342 | return -ENODEV; |
343 | } | 343 | } |
344 | 344 | ||
345 | buf = 0; | 345 | buf = 0; |
@@ -609,14 +609,16 @@ int em28xx_i2c_register(struct em28xx *dev) | |||
609 | dev->i2c_client.adapter = &dev->i2c_adap; | 609 | dev->i2c_client.adapter = &dev->i2c_adap; |
610 | 610 | ||
611 | retval = em28xx_i2c_eeprom(dev, dev->eedata, sizeof(dev->eedata)); | 611 | retval = em28xx_i2c_eeprom(dev, dev->eedata, sizeof(dev->eedata)); |
612 | if (retval < 0) { | 612 | if ((retval < 0) && (retval != -ENODEV)) { |
613 | em28xx_errdev("%s: em28xx_i2_eeprom failed! retval [%d]\n", | 613 | em28xx_errdev("%s: em28xx_i2_eeprom failed! retval [%d]\n", |
614 | __func__, retval); | 614 | __func__, retval); |
615 | |||
615 | return retval; | 616 | return retval; |
616 | } | 617 | } |
617 | 618 | ||
618 | if (i2c_scan) | 619 | if (i2c_scan) |
619 | em28xx_do_i2c_scan(dev); | 620 | em28xx_do_i2c_scan(dev); |
621 | |||
620 | return 0; | 622 | return 0; |
621 | } | 623 | } |
622 | 624 | ||
diff --git a/drivers/media/video/em28xx/em28xx-video.c b/drivers/media/video/em28xx/em28xx-video.c index a1ab2ef45578..610f535a257c 100644 --- a/drivers/media/video/em28xx/em28xx-video.c +++ b/drivers/media/video/em28xx/em28xx-video.c | |||
@@ -73,6 +73,7 @@ MODULE_DESCRIPTION(DRIVER_DESC); | |||
73 | MODULE_LICENSE("GPL"); | 73 | MODULE_LICENSE("GPL"); |
74 | 74 | ||
75 | static LIST_HEAD(em28xx_devlist); | 75 | static LIST_HEAD(em28xx_devlist); |
76 | static DEFINE_MUTEX(em28xx_devlist_mutex); | ||
76 | 77 | ||
77 | static unsigned int card[] = {[0 ... (EM28XX_MAXBOARDS - 1)] = UNSET }; | 78 | static unsigned int card[] = {[0 ... (EM28XX_MAXBOARDS - 1)] = UNSET }; |
78 | static unsigned int video_nr[] = {[0 ... (EM28XX_MAXBOARDS - 1)] = UNSET }; | 79 | static unsigned int video_nr[] = {[0 ... (EM28XX_MAXBOARDS - 1)] = UNSET }; |
@@ -1519,7 +1520,7 @@ static int em28xx_v4l2_open(struct inode *inode, struct file *filp) | |||
1519 | struct em28xx_fh *fh; | 1520 | struct em28xx_fh *fh; |
1520 | enum v4l2_buf_type fh_type = 0; | 1521 | enum v4l2_buf_type fh_type = 0; |
1521 | 1522 | ||
1522 | lock_kernel(); | 1523 | mutex_lock(&em28xx_devlist_mutex); |
1523 | list_for_each_entry(h, &em28xx_devlist, devlist) { | 1524 | list_for_each_entry(h, &em28xx_devlist, devlist) { |
1524 | if (h->vdev->minor == minor) { | 1525 | if (h->vdev->minor == minor) { |
1525 | dev = h; | 1526 | dev = h; |
@@ -1535,10 +1536,11 @@ static int em28xx_v4l2_open(struct inode *inode, struct file *filp) | |||
1535 | dev = h; | 1536 | dev = h; |
1536 | } | 1537 | } |
1537 | } | 1538 | } |
1538 | if (NULL == dev) { | 1539 | mutex_unlock(&em28xx_devlist_mutex); |
1539 | unlock_kernel(); | 1540 | if (NULL == dev) |
1540 | return -ENODEV; | 1541 | return -ENODEV; |
1541 | } | 1542 | |
1543 | mutex_lock(&dev->lock); | ||
1542 | 1544 | ||
1543 | em28xx_videodbg("open minor=%d type=%s users=%d\n", | 1545 | em28xx_videodbg("open minor=%d type=%s users=%d\n", |
1544 | minor, v4l2_type_names[fh_type], dev->users); | 1546 | minor, v4l2_type_names[fh_type], dev->users); |
@@ -1547,10 +1549,9 @@ static int em28xx_v4l2_open(struct inode *inode, struct file *filp) | |||
1547 | fh = kzalloc(sizeof(struct em28xx_fh), GFP_KERNEL); | 1549 | fh = kzalloc(sizeof(struct em28xx_fh), GFP_KERNEL); |
1548 | if (!fh) { | 1550 | if (!fh) { |
1549 | em28xx_errdev("em28xx-video.c: Out of memory?!\n"); | 1551 | em28xx_errdev("em28xx-video.c: Out of memory?!\n"); |
1550 | unlock_kernel(); | 1552 | mutex_unlock(&dev->lock); |
1551 | return -ENOMEM; | 1553 | return -ENOMEM; |
1552 | } | 1554 | } |
1553 | mutex_lock(&dev->lock); | ||
1554 | fh->dev = dev; | 1555 | fh->dev = dev; |
1555 | fh->radio = radio; | 1556 | fh->radio = radio; |
1556 | fh->type = fh_type; | 1557 | fh->type = fh_type; |
@@ -1584,7 +1585,6 @@ static int em28xx_v4l2_open(struct inode *inode, struct file *filp) | |||
1584 | sizeof(struct em28xx_buffer), fh); | 1585 | sizeof(struct em28xx_buffer), fh); |
1585 | 1586 | ||
1586 | mutex_unlock(&dev->lock); | 1587 | mutex_unlock(&dev->lock); |
1587 | unlock_kernel(); | ||
1588 | 1588 | ||
1589 | return errCode; | 1589 | return errCode; |
1590 | } | 1590 | } |
@@ -1871,6 +1871,7 @@ int em28xx_register_extension(struct em28xx_ops *ops) | |||
1871 | { | 1871 | { |
1872 | struct em28xx *dev = NULL; | 1872 | struct em28xx *dev = NULL; |
1873 | 1873 | ||
1874 | mutex_lock(&em28xx_devlist_mutex); | ||
1874 | mutex_lock(&em28xx_extension_devlist_lock); | 1875 | mutex_lock(&em28xx_extension_devlist_lock); |
1875 | list_add_tail(&ops->next, &em28xx_extension_devlist); | 1876 | list_add_tail(&ops->next, &em28xx_extension_devlist); |
1876 | list_for_each_entry(dev, &em28xx_devlist, devlist) { | 1877 | list_for_each_entry(dev, &em28xx_devlist, devlist) { |
@@ -1879,6 +1880,7 @@ int em28xx_register_extension(struct em28xx_ops *ops) | |||
1879 | } | 1880 | } |
1880 | printk(KERN_INFO "Em28xx: Initialized (%s) extension\n", ops->name); | 1881 | printk(KERN_INFO "Em28xx: Initialized (%s) extension\n", ops->name); |
1881 | mutex_unlock(&em28xx_extension_devlist_lock); | 1882 | mutex_unlock(&em28xx_extension_devlist_lock); |
1883 | mutex_unlock(&em28xx_devlist_mutex); | ||
1882 | return 0; | 1884 | return 0; |
1883 | } | 1885 | } |
1884 | EXPORT_SYMBOL(em28xx_register_extension); | 1886 | EXPORT_SYMBOL(em28xx_register_extension); |
@@ -1887,6 +1889,7 @@ void em28xx_unregister_extension(struct em28xx_ops *ops) | |||
1887 | { | 1889 | { |
1888 | struct em28xx *dev = NULL; | 1890 | struct em28xx *dev = NULL; |
1889 | 1891 | ||
1892 | mutex_lock(&em28xx_devlist_mutex); | ||
1890 | list_for_each_entry(dev, &em28xx_devlist, devlist) { | 1893 | list_for_each_entry(dev, &em28xx_devlist, devlist) { |
1891 | if (dev) | 1894 | if (dev) |
1892 | ops->fini(dev); | 1895 | ops->fini(dev); |
@@ -1896,6 +1899,7 @@ void em28xx_unregister_extension(struct em28xx_ops *ops) | |||
1896 | printk(KERN_INFO "Em28xx: Removed (%s) extension\n", ops->name); | 1899 | printk(KERN_INFO "Em28xx: Removed (%s) extension\n", ops->name); |
1897 | list_del(&ops->next); | 1900 | list_del(&ops->next); |
1898 | mutex_unlock(&em28xx_extension_devlist_lock); | 1901 | mutex_unlock(&em28xx_extension_devlist_lock); |
1902 | mutex_unlock(&em28xx_devlist_mutex); | ||
1899 | } | 1903 | } |
1900 | EXPORT_SYMBOL(em28xx_unregister_extension); | 1904 | EXPORT_SYMBOL(em28xx_unregister_extension); |
1901 | 1905 | ||
@@ -1921,6 +1925,60 @@ static struct video_device *em28xx_vdev_init(struct em28xx *dev, | |||
1921 | } | 1925 | } |
1922 | 1926 | ||
1923 | 1927 | ||
1928 | static int register_analog_devices(struct em28xx *dev) | ||
1929 | { | ||
1930 | int ret; | ||
1931 | |||
1932 | /* allocate and fill video video_device struct */ | ||
1933 | dev->vdev = em28xx_vdev_init(dev, &em28xx_video_template, "video"); | ||
1934 | if (!dev->vdev) { | ||
1935 | em28xx_errdev("cannot allocate video_device.\n"); | ||
1936 | return -ENODEV; | ||
1937 | } | ||
1938 | |||
1939 | /* register v4l2 video video_device */ | ||
1940 | ret = video_register_device(dev->vdev, VFL_TYPE_GRABBER, | ||
1941 | video_nr[dev->devno]); | ||
1942 | if (ret) { | ||
1943 | em28xx_errdev("unable to register video device (error=%i).\n", | ||
1944 | ret); | ||
1945 | return ret; | ||
1946 | } | ||
1947 | |||
1948 | /* Allocate and fill vbi video_device struct */ | ||
1949 | dev->vbi_dev = em28xx_vdev_init(dev, &em28xx_video_template, "vbi"); | ||
1950 | |||
1951 | /* register v4l2 vbi video_device */ | ||
1952 | ret = video_register_device(dev->vbi_dev, VFL_TYPE_VBI, | ||
1953 | vbi_nr[dev->devno]); | ||
1954 | if (ret < 0) { | ||
1955 | em28xx_errdev("unable to register vbi device\n"); | ||
1956 | return ret; | ||
1957 | } | ||
1958 | |||
1959 | if (em28xx_boards[dev->model].radio.type == EM28XX_RADIO) { | ||
1960 | dev->radio_dev = em28xx_vdev_init(dev, &em28xx_radio_template, "radio"); | ||
1961 | if (!dev->radio_dev) { | ||
1962 | em28xx_errdev("cannot allocate video_device.\n"); | ||
1963 | return -ENODEV; | ||
1964 | } | ||
1965 | ret = video_register_device(dev->radio_dev, VFL_TYPE_RADIO, | ||
1966 | radio_nr[dev->devno]); | ||
1967 | if (ret < 0) { | ||
1968 | em28xx_errdev("can't register radio device\n"); | ||
1969 | return ret; | ||
1970 | } | ||
1971 | em28xx_info("Registered radio device as /dev/radio%d\n", | ||
1972 | dev->radio_dev->num); | ||
1973 | } | ||
1974 | |||
1975 | em28xx_info("V4L2 device registered as /dev/video%d and /dev/vbi%d\n", | ||
1976 | dev->vdev->num, dev->vbi_dev->num); | ||
1977 | |||
1978 | return 0; | ||
1979 | } | ||
1980 | |||
1981 | |||
1924 | /* | 1982 | /* |
1925 | * em28xx_init_dev() | 1983 | * em28xx_init_dev() |
1926 | * allocates and inits the device structs, registers i2c bus and v4l device | 1984 | * allocates and inits the device structs, registers i2c bus and v4l device |
@@ -1936,6 +1994,7 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev, | |||
1936 | 1994 | ||
1937 | dev->udev = udev; | 1995 | dev->udev = udev; |
1938 | mutex_init(&dev->lock); | 1996 | mutex_init(&dev->lock); |
1997 | mutex_init(&dev->ctrl_urb_lock); | ||
1939 | spin_lock_init(&dev->slock); | 1998 | spin_lock_init(&dev->slock); |
1940 | init_waitqueue_head(&dev->open); | 1999 | init_waitqueue_head(&dev->open); |
1941 | init_waitqueue_head(&dev->wait_frame); | 2000 | init_waitqueue_head(&dev->wait_frame); |
@@ -1953,8 +2012,6 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev, | |||
1953 | errCode = em28xx_config(dev); | 2012 | errCode = em28xx_config(dev); |
1954 | if (errCode) { | 2013 | if (errCode) { |
1955 | em28xx_errdev("error configuring device\n"); | 2014 | em28xx_errdev("error configuring device\n"); |
1956 | em28xx_devused &= ~(1<<dev->devno); | ||
1957 | kfree(dev); | ||
1958 | return -ENOMEM; | 2015 | return -ENOMEM; |
1959 | } | 2016 | } |
1960 | 2017 | ||
@@ -2001,50 +2058,6 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev, | |||
2001 | return errCode; | 2058 | return errCode; |
2002 | } | 2059 | } |
2003 | 2060 | ||
2004 | list_add_tail(&dev->devlist, &em28xx_devlist); | ||
2005 | |||
2006 | /* allocate and fill video video_device struct */ | ||
2007 | dev->vdev = em28xx_vdev_init(dev, &em28xx_video_template, "video"); | ||
2008 | if (NULL == dev->vdev) { | ||
2009 | em28xx_errdev("cannot allocate video_device.\n"); | ||
2010 | goto fail_unreg; | ||
2011 | } | ||
2012 | |||
2013 | /* register v4l2 video video_device */ | ||
2014 | retval = video_register_device(dev->vdev, VFL_TYPE_GRABBER, | ||
2015 | video_nr[dev->devno]); | ||
2016 | if (retval) { | ||
2017 | em28xx_errdev("unable to register video device (error=%i).\n", | ||
2018 | retval); | ||
2019 | goto fail_unreg; | ||
2020 | } | ||
2021 | |||
2022 | /* Allocate and fill vbi video_device struct */ | ||
2023 | dev->vbi_dev = em28xx_vdev_init(dev, &em28xx_video_template, "vbi"); | ||
2024 | /* register v4l2 vbi video_device */ | ||
2025 | if (video_register_device(dev->vbi_dev, VFL_TYPE_VBI, | ||
2026 | vbi_nr[dev->devno]) < 0) { | ||
2027 | em28xx_errdev("unable to register vbi device\n"); | ||
2028 | retval = -ENODEV; | ||
2029 | goto fail_unreg; | ||
2030 | } | ||
2031 | |||
2032 | if (em28xx_boards[dev->model].radio.type == EM28XX_RADIO) { | ||
2033 | dev->radio_dev = em28xx_vdev_init(dev, &em28xx_radio_template, "radio"); | ||
2034 | if (NULL == dev->radio_dev) { | ||
2035 | em28xx_errdev("cannot allocate video_device.\n"); | ||
2036 | goto fail_unreg; | ||
2037 | } | ||
2038 | retval = video_register_device(dev->radio_dev, VFL_TYPE_RADIO, | ||
2039 | radio_nr[dev->devno]); | ||
2040 | if (retval < 0) { | ||
2041 | em28xx_errdev("can't register radio device\n"); | ||
2042 | goto fail_unreg; | ||
2043 | } | ||
2044 | em28xx_info("Registered radio device as /dev/radio%d\n", | ||
2045 | dev->radio_dev->num); | ||
2046 | } | ||
2047 | |||
2048 | /* init video dma queues */ | 2061 | /* init video dma queues */ |
2049 | INIT_LIST_HEAD(&dev->vidq.active); | 2062 | INIT_LIST_HEAD(&dev->vidq.active); |
2050 | INIT_LIST_HEAD(&dev->vidq.queued); | 2063 | INIT_LIST_HEAD(&dev->vidq.queued); |
@@ -2071,8 +2084,14 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev, | |||
2071 | 2084 | ||
2072 | video_mux(dev, 0); | 2085 | video_mux(dev, 0); |
2073 | 2086 | ||
2074 | em28xx_info("V4L2 device registered as /dev/video%d and /dev/vbi%d\n", | 2087 | mutex_lock(&em28xx_devlist_mutex); |
2075 | dev->vdev->num, dev->vbi_dev->num); | 2088 | list_add_tail(&dev->devlist, &em28xx_devlist); |
2089 | retval = register_analog_devices(dev); | ||
2090 | if (retval < 0) { | ||
2091 | em28xx_release_resources(dev); | ||
2092 | mutex_unlock(&em28xx_devlist_mutex); | ||
2093 | goto fail_reg_devices; | ||
2094 | } | ||
2076 | 2095 | ||
2077 | mutex_lock(&em28xx_extension_devlist_lock); | 2096 | mutex_lock(&em28xx_extension_devlist_lock); |
2078 | if (!list_empty(&em28xx_extension_devlist)) { | 2097 | if (!list_empty(&em28xx_extension_devlist)) { |
@@ -2082,13 +2101,12 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev, | |||
2082 | } | 2101 | } |
2083 | } | 2102 | } |
2084 | mutex_unlock(&em28xx_extension_devlist_lock); | 2103 | mutex_unlock(&em28xx_extension_devlist_lock); |
2104 | mutex_unlock(&em28xx_devlist_mutex); | ||
2085 | 2105 | ||
2086 | return 0; | 2106 | return 0; |
2087 | 2107 | ||
2088 | fail_unreg: | 2108 | fail_reg_devices: |
2089 | em28xx_release_resources(dev); | ||
2090 | mutex_unlock(&dev->lock); | 2109 | mutex_unlock(&dev->lock); |
2091 | kfree(dev); | ||
2092 | return retval; | 2110 | return retval; |
2093 | } | 2111 | } |
2094 | 2112 | ||
@@ -2231,8 +2249,12 @@ static int em28xx_usb_probe(struct usb_interface *interface, | |||
2231 | 2249 | ||
2232 | /* allocate device struct */ | 2250 | /* allocate device struct */ |
2233 | retval = em28xx_init_dev(&dev, udev, nr); | 2251 | retval = em28xx_init_dev(&dev, udev, nr); |
2234 | if (retval) | 2252 | if (retval) { |
2253 | em28xx_devused &= ~(1<<dev->devno); | ||
2254 | kfree(dev); | ||
2255 | |||
2235 | return retval; | 2256 | return retval; |
2257 | } | ||
2236 | 2258 | ||
2237 | em28xx_info("Found %s\n", em28xx_boards[dev->model].name); | 2259 | em28xx_info("Found %s\n", em28xx_boards[dev->model].name); |
2238 | 2260 | ||
diff --git a/drivers/media/video/em28xx/em28xx.h b/drivers/media/video/em28xx/em28xx.h index 82781178e0a3..5956e9b3062f 100644 --- a/drivers/media/video/em28xx/em28xx.h +++ b/drivers/media/video/em28xx/em28xx.h | |||
@@ -102,6 +102,9 @@ | |||
102 | #define EM28XX_MIN_BUF 4 | 102 | #define EM28XX_MIN_BUF 4 |
103 | #define EM28XX_DEF_BUF 8 | 103 | #define EM28XX_DEF_BUF 8 |
104 | 104 | ||
105 | /*Limits the max URB message size */ | ||
106 | #define URB_MAX_CTRL_SIZE 80 | ||
107 | |||
105 | /* Params for validated field */ | 108 | /* Params for validated field */ |
106 | #define EM28XX_BOARD_NOT_VALIDATED 1 | 109 | #define EM28XX_BOARD_NOT_VALIDATED 1 |
107 | #define EM28XX_BOARD_VALIDATED 0 | 110 | #define EM28XX_BOARD_VALIDATED 0 |
@@ -430,6 +433,7 @@ struct em28xx { | |||
430 | 433 | ||
431 | /* locks */ | 434 | /* locks */ |
432 | struct mutex lock; | 435 | struct mutex lock; |
436 | struct mutex ctrl_urb_lock; /* protects urb_buf */ | ||
433 | /* spinlock_t queue_lock; */ | 437 | /* spinlock_t queue_lock; */ |
434 | struct list_head inqueue, outqueue; | 438 | struct list_head inqueue, outqueue; |
435 | wait_queue_head_t open, wait_frame, wait_stream; | 439 | wait_queue_head_t open, wait_frame, wait_stream; |
@@ -451,6 +455,8 @@ struct em28xx { | |||
451 | unsigned int *alt_max_pkt_size; /* array of wMaxPacketSize */ | 455 | unsigned int *alt_max_pkt_size; /* array of wMaxPacketSize */ |
452 | struct urb *urb[EM28XX_NUM_BUFS]; /* urb for isoc transfers */ | 456 | struct urb *urb[EM28XX_NUM_BUFS]; /* urb for isoc transfers */ |
453 | char *transfer_buffer[EM28XX_NUM_BUFS]; /* transfer buffers for isoc transfer */ | 457 | char *transfer_buffer[EM28XX_NUM_BUFS]; /* transfer buffers for isoc transfer */ |
458 | char urb_buf[URB_MAX_CTRL_SIZE]; /* urb control msg buffer */ | ||
459 | |||
454 | /* helper funcs that call usb_control_msg */ | 460 | /* helper funcs that call usb_control_msg */ |
455 | int (*em28xx_write_regs) (struct em28xx *dev, u16 reg, | 461 | int (*em28xx_write_regs) (struct em28xx *dev, u16 reg, |
456 | char *buf, int len); | 462 | char *buf, int len); |
diff --git a/drivers/media/video/gspca/conex.c b/drivers/media/video/gspca/conex.c index a9d51ba7c57c..de28354ea5ba 100644 --- a/drivers/media/video/gspca/conex.c +++ b/drivers/media/video/gspca/conex.c | |||
@@ -846,10 +846,13 @@ static int sd_start(struct gspca_dev *gspca_dev) | |||
846 | return 0; | 846 | return 0; |
847 | } | 847 | } |
848 | 848 | ||
849 | /* called on streamoff with alt 0 and on disconnect */ | ||
849 | static void sd_stop0(struct gspca_dev *gspca_dev) | 850 | static void sd_stop0(struct gspca_dev *gspca_dev) |
850 | { | 851 | { |
851 | int retry = 50; | 852 | int retry = 50; |
852 | 853 | ||
854 | if (!gspca_dev->present) | ||
855 | return; | ||
853 | reg_w_val(gspca_dev, 0x0000, 0x00); | 856 | reg_w_val(gspca_dev, 0x0000, 0x00); |
854 | reg_r(gspca_dev, 0x0002, 1); | 857 | reg_r(gspca_dev, 0x0002, 1); |
855 | reg_w_val(gspca_dev, 0x0053, 0x00); | 858 | reg_w_val(gspca_dev, 0x0053, 0x00); |
diff --git a/drivers/media/video/gspca/finepix.c b/drivers/media/video/gspca/finepix.c index 65d3cbfe6b27..607942fd7970 100644 --- a/drivers/media/video/gspca/finepix.c +++ b/drivers/media/video/gspca/finepix.c | |||
@@ -276,6 +276,12 @@ static void sd_stopN(struct gspca_dev *gspca_dev) | |||
276 | /* Stop the state machine */ | 276 | /* Stop the state machine */ |
277 | if (dev->state != FPIX_NOP) | 277 | if (dev->state != FPIX_NOP) |
278 | wait_for_completion(&dev->can_close); | 278 | wait_for_completion(&dev->can_close); |
279 | } | ||
280 | |||
281 | /* called on streamoff with alt 0 and disconnect */ | ||
282 | static void sd_stop0(struct gspca_dev *gspca_dev) | ||
283 | { | ||
284 | struct usb_fpix *dev = (struct usb_fpix *) gspca_dev; | ||
279 | 285 | ||
280 | usb_free_urb(dev->control_urb); | 286 | usb_free_urb(dev->control_urb); |
281 | dev->control_urb = NULL; | 287 | dev->control_urb = NULL; |
@@ -385,6 +391,7 @@ static int sd_start(struct gspca_dev *gspca_dev) | |||
385 | error: | 391 | error: |
386 | /* Free the ressources */ | 392 | /* Free the ressources */ |
387 | sd_stopN(gspca_dev); | 393 | sd_stopN(gspca_dev); |
394 | sd_stop0(gspca_dev); | ||
388 | return ret; | 395 | return ret; |
389 | } | 396 | } |
390 | 397 | ||
@@ -425,6 +432,7 @@ static const struct sd_desc sd_desc = { | |||
425 | .init = sd_init, | 432 | .init = sd_init, |
426 | .start = sd_start, | 433 | .start = sd_start, |
427 | .stopN = sd_stopN, | 434 | .stopN = sd_stopN, |
435 | .stop0 = sd_stop0, | ||
428 | }; | 436 | }; |
429 | 437 | ||
430 | /* -- device connect -- */ | 438 | /* -- device connect -- */ |
diff --git a/drivers/media/video/gspca/gspca.c b/drivers/media/video/gspca/gspca.c index e48fbfc8ad05..748a87e82e44 100644 --- a/drivers/media/video/gspca/gspca.c +++ b/drivers/media/video/gspca/gspca.c | |||
@@ -646,15 +646,14 @@ static void gspca_stream_off(struct gspca_dev *gspca_dev) | |||
646 | { | 646 | { |
647 | gspca_dev->streaming = 0; | 647 | gspca_dev->streaming = 0; |
648 | atomic_set(&gspca_dev->nevent, 0); | 648 | atomic_set(&gspca_dev->nevent, 0); |
649 | if (gspca_dev->present) { | 649 | if (gspca_dev->present |
650 | if (gspca_dev->sd_desc->stopN) | 650 | && gspca_dev->sd_desc->stopN) |
651 | gspca_dev->sd_desc->stopN(gspca_dev); | 651 | gspca_dev->sd_desc->stopN(gspca_dev); |
652 | destroy_urbs(gspca_dev); | 652 | destroy_urbs(gspca_dev); |
653 | gspca_set_alt0(gspca_dev); | 653 | gspca_set_alt0(gspca_dev); |
654 | if (gspca_dev->sd_desc->stop0) | 654 | if (gspca_dev->sd_desc->stop0) |
655 | gspca_dev->sd_desc->stop0(gspca_dev); | 655 | gspca_dev->sd_desc->stop0(gspca_dev); |
656 | PDEBUG(D_STREAM, "stream off OK"); | 656 | PDEBUG(D_STREAM, "stream off OK"); |
657 | } | ||
658 | } | 657 | } |
659 | 658 | ||
660 | static void gspca_set_default_mode(struct gspca_dev *gspca_dev) | 659 | static void gspca_set_default_mode(struct gspca_dev *gspca_dev) |
@@ -863,7 +862,7 @@ static int dev_open(struct inode *inode, struct file *file) | |||
863 | int ret; | 862 | int ret; |
864 | 863 | ||
865 | PDEBUG(D_STREAM, "%s open", current->comm); | 864 | PDEBUG(D_STREAM, "%s open", current->comm); |
866 | gspca_dev = (struct gspca_dev *) video_devdata(file); | 865 | gspca_dev = video_drvdata(file); |
867 | if (mutex_lock_interruptible(&gspca_dev->queue_lock)) | 866 | if (mutex_lock_interruptible(&gspca_dev->queue_lock)) |
868 | return -ERESTARTSYS; | 867 | return -ERESTARTSYS; |
869 | if (!gspca_dev->present) { | 868 | if (!gspca_dev->present) { |
@@ -875,6 +874,13 @@ static int dev_open(struct inode *inode, struct file *file) | |||
875 | ret = -EBUSY; | 874 | ret = -EBUSY; |
876 | goto out; | 875 | goto out; |
877 | } | 876 | } |
877 | |||
878 | /* protect the subdriver against rmmod */ | ||
879 | if (!try_module_get(gspca_dev->module)) { | ||
880 | ret = -ENODEV; | ||
881 | goto out; | ||
882 | } | ||
883 | |||
878 | gspca_dev->users++; | 884 | gspca_dev->users++; |
879 | 885 | ||
880 | /* one more user */ | 886 | /* one more user */ |
@@ -884,10 +890,10 @@ static int dev_open(struct inode *inode, struct file *file) | |||
884 | #ifdef GSPCA_DEBUG | 890 | #ifdef GSPCA_DEBUG |
885 | /* activate the v4l2 debug */ | 891 | /* activate the v4l2 debug */ |
886 | if (gspca_debug & D_V4L2) | 892 | if (gspca_debug & D_V4L2) |
887 | gspca_dev->vdev.debug |= V4L2_DEBUG_IOCTL | 893 | gspca_dev->vdev->debug |= V4L2_DEBUG_IOCTL |
888 | | V4L2_DEBUG_IOCTL_ARG; | 894 | | V4L2_DEBUG_IOCTL_ARG; |
889 | else | 895 | else |
890 | gspca_dev->vdev.debug &= ~(V4L2_DEBUG_IOCTL | 896 | gspca_dev->vdev->debug &= ~(V4L2_DEBUG_IOCTL |
891 | | V4L2_DEBUG_IOCTL_ARG); | 897 | | V4L2_DEBUG_IOCTL_ARG); |
892 | #endif | 898 | #endif |
893 | ret = 0; | 899 | ret = 0; |
@@ -921,6 +927,7 @@ static int dev_close(struct inode *inode, struct file *file) | |||
921 | gspca_dev->memory = GSPCA_MEMORY_NO; | 927 | gspca_dev->memory = GSPCA_MEMORY_NO; |
922 | } | 928 | } |
923 | file->private_data = NULL; | 929 | file->private_data = NULL; |
930 | module_put(gspca_dev->module); | ||
924 | mutex_unlock(&gspca_dev->queue_lock); | 931 | mutex_unlock(&gspca_dev->queue_lock); |
925 | 932 | ||
926 | PDEBUG(D_STREAM, "close done"); | 933 | PDEBUG(D_STREAM, "close done"); |
@@ -1748,11 +1755,6 @@ out: | |||
1748 | return ret; | 1755 | return ret; |
1749 | } | 1756 | } |
1750 | 1757 | ||
1751 | static void dev_release(struct video_device *vfd) | ||
1752 | { | ||
1753 | /* nothing */ | ||
1754 | } | ||
1755 | |||
1756 | static struct file_operations dev_fops = { | 1758 | static struct file_operations dev_fops = { |
1757 | .owner = THIS_MODULE, | 1759 | .owner = THIS_MODULE, |
1758 | .open = dev_open, | 1760 | .open = dev_open, |
@@ -1800,7 +1802,7 @@ static struct video_device gspca_template = { | |||
1800 | .name = "gspca main driver", | 1802 | .name = "gspca main driver", |
1801 | .fops = &dev_fops, | 1803 | .fops = &dev_fops, |
1802 | .ioctl_ops = &dev_ioctl_ops, | 1804 | .ioctl_ops = &dev_ioctl_ops, |
1803 | .release = dev_release, /* mandatory */ | 1805 | .release = video_device_release, |
1804 | .minor = -1, | 1806 | .minor = -1, |
1805 | }; | 1807 | }; |
1806 | 1808 | ||
@@ -1869,17 +1871,18 @@ int gspca_dev_probe(struct usb_interface *intf, | |||
1869 | init_waitqueue_head(&gspca_dev->wq); | 1871 | init_waitqueue_head(&gspca_dev->wq); |
1870 | 1872 | ||
1871 | /* init video stuff */ | 1873 | /* init video stuff */ |
1872 | memcpy(&gspca_dev->vdev, &gspca_template, sizeof gspca_template); | 1874 | gspca_dev->vdev = video_device_alloc(); |
1873 | gspca_dev->vdev.parent = &dev->dev; | 1875 | memcpy(gspca_dev->vdev, &gspca_template, sizeof gspca_template); |
1874 | memcpy(&gspca_dev->fops, &dev_fops, sizeof gspca_dev->fops); | 1876 | gspca_dev->vdev->parent = &dev->dev; |
1875 | gspca_dev->vdev.fops = &gspca_dev->fops; | 1877 | gspca_dev->module = module; |
1876 | gspca_dev->fops.owner = module; /* module protection */ | ||
1877 | gspca_dev->present = 1; | 1878 | gspca_dev->present = 1; |
1878 | ret = video_register_device(&gspca_dev->vdev, | 1879 | video_set_drvdata(gspca_dev->vdev, gspca_dev); |
1880 | ret = video_register_device(gspca_dev->vdev, | ||
1879 | VFL_TYPE_GRABBER, | 1881 | VFL_TYPE_GRABBER, |
1880 | video_nr); | 1882 | video_nr); |
1881 | if (ret < 0) { | 1883 | if (ret < 0) { |
1882 | err("video_register_device err %d", ret); | 1884 | err("video_register_device err %d", ret); |
1885 | video_device_release(gspca_dev->vdev); | ||
1883 | goto out; | 1886 | goto out; |
1884 | } | 1887 | } |
1885 | 1888 | ||
@@ -1887,7 +1890,8 @@ int gspca_dev_probe(struct usb_interface *intf, | |||
1887 | PDEBUG(D_PROBE, "probe ok"); | 1890 | PDEBUG(D_PROBE, "probe ok"); |
1888 | return 0; | 1891 | return 0; |
1889 | out: | 1892 | out: |
1890 | kref_put(&gspca_dev->kref, gspca_delete); | 1893 | kfree(gspca_dev->usb_buf); |
1894 | kfree(gspca_dev); | ||
1891 | return ret; | 1895 | return ret; |
1892 | } | 1896 | } |
1893 | EXPORT_SYMBOL(gspca_dev_probe); | 1897 | EXPORT_SYMBOL(gspca_dev_probe); |
@@ -1905,7 +1909,7 @@ void gspca_disconnect(struct usb_interface *intf) | |||
1905 | usb_set_intfdata(intf, NULL); | 1909 | usb_set_intfdata(intf, NULL); |
1906 | 1910 | ||
1907 | /* We don't want people trying to open up the device */ | 1911 | /* We don't want people trying to open up the device */ |
1908 | video_unregister_device(&gspca_dev->vdev); | 1912 | video_unregister_device(gspca_dev->vdev); |
1909 | 1913 | ||
1910 | gspca_dev->present = 0; | 1914 | gspca_dev->present = 0; |
1911 | gspca_dev->streaming = 0; | 1915 | gspca_dev->streaming = 0; |
diff --git a/drivers/media/video/gspca/gspca.h b/drivers/media/video/gspca/gspca.h index 1d9dc90b4791..d25e8d69373b 100644 --- a/drivers/media/video/gspca/gspca.h +++ b/drivers/media/video/gspca/gspca.h | |||
@@ -97,7 +97,7 @@ struct sd_desc { | |||
97 | cam_pkt_op pkt_scan; | 97 | cam_pkt_op pkt_scan; |
98 | /* optional operations */ | 98 | /* optional operations */ |
99 | cam_v_op stopN; /* called on stream off - main alt */ | 99 | cam_v_op stopN; /* called on stream off - main alt */ |
100 | cam_v_op stop0; /* called on stream off - alt 0 */ | 100 | cam_v_op stop0; /* called on stream off & disconnect - alt 0 */ |
101 | cam_v_op dq_callback; /* called when a frame has been dequeued */ | 101 | cam_v_op dq_callback; /* called when a frame has been dequeued */ |
102 | cam_jpg_op get_jcomp; | 102 | cam_jpg_op get_jcomp; |
103 | cam_jpg_op set_jcomp; | 103 | cam_jpg_op set_jcomp; |
@@ -120,8 +120,8 @@ struct gspca_frame { | |||
120 | }; | 120 | }; |
121 | 121 | ||
122 | struct gspca_dev { | 122 | struct gspca_dev { |
123 | struct video_device vdev; /* !! must be the first item */ | 123 | struct video_device *vdev; |
124 | struct file_operations fops; | 124 | struct module *module; /* subdriver handling the device */ |
125 | struct usb_device *dev; | 125 | struct usb_device *dev; |
126 | struct kref kref; | 126 | struct kref kref; |
127 | struct file *capt_file; /* file doing video capture */ | 127 | struct file *capt_file; /* file doing video capture */ |
diff --git a/drivers/media/video/gspca/pac7311.c b/drivers/media/video/gspca/pac7311.c index e5ff9a6199ef..fbd45e235d97 100644 --- a/drivers/media/video/gspca/pac7311.c +++ b/drivers/media/video/gspca/pac7311.c | |||
@@ -749,10 +749,13 @@ static void sd_stopN(struct gspca_dev *gspca_dev) | |||
749 | reg_w(gspca_dev, 0x78, 0x44); /* Bit_0=start stream, Bit_6=LED */ | 749 | reg_w(gspca_dev, 0x78, 0x44); /* Bit_0=start stream, Bit_6=LED */ |
750 | } | 750 | } |
751 | 751 | ||
752 | /* called on streamoff with alt 0 and on disconnect */ | ||
752 | static void sd_stop0(struct gspca_dev *gspca_dev) | 753 | static void sd_stop0(struct gspca_dev *gspca_dev) |
753 | { | 754 | { |
754 | struct sd *sd = (struct sd *) gspca_dev; | 755 | struct sd *sd = (struct sd *) gspca_dev; |
755 | 756 | ||
757 | if (!gspca_dev->present) | ||
758 | return; | ||
756 | if (sd->sensor == SENSOR_PAC7302) { | 759 | if (sd->sensor == SENSOR_PAC7302) { |
757 | reg_w(gspca_dev, 0xff, 0x01); | 760 | reg_w(gspca_dev, 0xff, 0x01); |
758 | reg_w(gspca_dev, 0x78, 0x40); | 761 | reg_w(gspca_dev, 0x78, 0x40); |
diff --git a/drivers/media/video/gspca/spca501.c b/drivers/media/video/gspca/spca501.c index b742f260c7ca..e29954c1c38c 100644 --- a/drivers/media/video/gspca/spca501.c +++ b/drivers/media/video/gspca/spca501.c | |||
@@ -2022,8 +2022,11 @@ static void sd_stopN(struct gspca_dev *gspca_dev) | |||
2022 | reg_write(gspca_dev->dev, SPCA501_REG_CTLRL, 0x01, 0x00); | 2022 | reg_write(gspca_dev->dev, SPCA501_REG_CTLRL, 0x01, 0x00); |
2023 | } | 2023 | } |
2024 | 2024 | ||
2025 | /* called on streamoff with alt 0 and on disconnect */ | ||
2025 | static void sd_stop0(struct gspca_dev *gspca_dev) | 2026 | static void sd_stop0(struct gspca_dev *gspca_dev) |
2026 | { | 2027 | { |
2028 | if (!gspca_dev->present) | ||
2029 | return; | ||
2027 | reg_write(gspca_dev->dev, SPCA501_REG_CTLRL, 0x05, 0x00); | 2030 | reg_write(gspca_dev->dev, SPCA501_REG_CTLRL, 0x05, 0x00); |
2028 | } | 2031 | } |
2029 | 2032 | ||
diff --git a/drivers/media/video/gspca/spca505.c b/drivers/media/video/gspca/spca505.c index b345749213cf..895b9fe4018c 100644 --- a/drivers/media/video/gspca/spca505.c +++ b/drivers/media/video/gspca/spca505.c | |||
@@ -742,8 +742,12 @@ static void sd_stopN(struct gspca_dev *gspca_dev) | |||
742 | reg_write(gspca_dev->dev, 0x02, 0x00, 0x00); | 742 | reg_write(gspca_dev->dev, 0x02, 0x00, 0x00); |
743 | } | 743 | } |
744 | 744 | ||
745 | /* called on streamoff with alt 0 and on disconnect */ | ||
745 | static void sd_stop0(struct gspca_dev *gspca_dev) | 746 | static void sd_stop0(struct gspca_dev *gspca_dev) |
746 | { | 747 | { |
748 | if (!gspca_dev->present) | ||
749 | return; | ||
750 | |||
747 | /* This maybe reset or power control */ | 751 | /* This maybe reset or power control */ |
748 | reg_write(gspca_dev->dev, 0x03, 0x03, 0x20); | 752 | reg_write(gspca_dev->dev, 0x03, 0x03, 0x20); |
749 | reg_write(gspca_dev->dev, 0x03, 0x01, 0x0); | 753 | reg_write(gspca_dev->dev, 0x03, 0x01, 0x0); |
diff --git a/drivers/media/video/gspca/spca561.c b/drivers/media/video/gspca/spca561.c index 020a03c466c1..c3de4e44123d 100644 --- a/drivers/media/video/gspca/spca561.c +++ b/drivers/media/video/gspca/spca561.c | |||
@@ -766,10 +766,13 @@ static void sd_stopN(struct gspca_dev *gspca_dev) | |||
766 | } | 766 | } |
767 | } | 767 | } |
768 | 768 | ||
769 | /* called on streamoff with alt 0 and on disconnect */ | ||
769 | static void sd_stop0(struct gspca_dev *gspca_dev) | 770 | static void sd_stop0(struct gspca_dev *gspca_dev) |
770 | { | 771 | { |
771 | struct sd *sd = (struct sd *) gspca_dev; | 772 | struct sd *sd = (struct sd *) gspca_dev; |
772 | 773 | ||
774 | if (!gspca_dev->present) | ||
775 | return; | ||
773 | if (sd->chip_revision == Rev012A) { | 776 | if (sd->chip_revision == Rev012A) { |
774 | reg_w_val(gspca_dev->dev, 0x8118, 0x29); | 777 | reg_w_val(gspca_dev->dev, 0x8118, 0x29); |
775 | reg_w_val(gspca_dev->dev, 0x8114, 0x08); | 778 | reg_w_val(gspca_dev->dev, 0x8114, 0x08); |
diff --git a/drivers/media/video/gspca/vc032x.c b/drivers/media/video/gspca/vc032x.c index be46d9232540..17af353ddd1c 100644 --- a/drivers/media/video/gspca/vc032x.c +++ b/drivers/media/video/gspca/vc032x.c | |||
@@ -1633,10 +1633,13 @@ static void sd_stopN(struct gspca_dev *gspca_dev) | |||
1633 | reg_w(dev, 0xa0, 0x09, 0xb003); | 1633 | reg_w(dev, 0xa0, 0x09, 0xb003); |
1634 | } | 1634 | } |
1635 | 1635 | ||
1636 | /* called on streamoff with alt 0 and on disconnect */ | ||
1636 | static void sd_stop0(struct gspca_dev *gspca_dev) | 1637 | static void sd_stop0(struct gspca_dev *gspca_dev) |
1637 | { | 1638 | { |
1638 | struct usb_device *dev = gspca_dev->dev; | 1639 | struct usb_device *dev = gspca_dev->dev; |
1639 | 1640 | ||
1641 | if (!gspca_dev->present) | ||
1642 | return; | ||
1640 | reg_w(dev, 0x89, 0xffff, 0xffff); | 1643 | reg_w(dev, 0x89, 0xffff, 0xffff); |
1641 | } | 1644 | } |
1642 | 1645 | ||
diff --git a/drivers/media/video/gspca/zc3xx.c b/drivers/media/video/gspca/zc3xx.c index 8b3101d347c3..0befacf49855 100644 --- a/drivers/media/video/gspca/zc3xx.c +++ b/drivers/media/video/gspca/zc3xx.c | |||
@@ -7336,10 +7336,13 @@ static int sd_start(struct gspca_dev *gspca_dev) | |||
7336 | return 0; | 7336 | return 0; |
7337 | } | 7337 | } |
7338 | 7338 | ||
7339 | /* called on streamoff with alt 0 and on disconnect */ | ||
7339 | static void sd_stop0(struct gspca_dev *gspca_dev) | 7340 | static void sd_stop0(struct gspca_dev *gspca_dev) |
7340 | { | 7341 | { |
7341 | struct sd *sd = (struct sd *) gspca_dev; | 7342 | struct sd *sd = (struct sd *) gspca_dev; |
7342 | 7343 | ||
7344 | if (!gspca_dev->present) | ||
7345 | return; | ||
7343 | send_unknown(gspca_dev->dev, sd->sensor); | 7346 | send_unknown(gspca_dev->dev, sd->sensor); |
7344 | } | 7347 | } |
7345 | 7348 | ||
diff --git a/drivers/media/video/s2255drv.c b/drivers/media/video/s2255drv.c index 5272926db73e..3c3f8cf73108 100644 --- a/drivers/media/video/s2255drv.c +++ b/drivers/media/video/s2255drv.c | |||
@@ -192,7 +192,7 @@ struct s2255_dmaqueue { | |||
192 | #define S2255_FW_FAILED 3 | 192 | #define S2255_FW_FAILED 3 |
193 | #define S2255_FW_DISCONNECTING 4 | 193 | #define S2255_FW_DISCONNECTING 4 |
194 | 194 | ||
195 | #define S2255_FW_MARKER 0x22552f2f | 195 | #define S2255_FW_MARKER cpu_to_le32(0x22552f2f) |
196 | /* 2255 read states */ | 196 | /* 2255 read states */ |
197 | #define S2255_READ_IDLE 0 | 197 | #define S2255_READ_IDLE 0 |
198 | #define S2255_READ_FRAME 1 | 198 | #define S2255_READ_FRAME 1 |
diff --git a/drivers/media/video/tvaudio.c b/drivers/media/video/tvaudio.c index b59e47272abf..3720f0e03a16 100644 --- a/drivers/media/video/tvaudio.c +++ b/drivers/media/video/tvaudio.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * experimental driver for simple i2c audio chips. | 2 | * Driver for simple i2c audio chips. |
3 | * | 3 | * |
4 | * Copyright (c) 2000 Gerd Knorr | 4 | * Copyright (c) 2000 Gerd Knorr |
5 | * based on code by: | 5 | * based on code by: |
@@ -7,6 +7,10 @@ | |||
7 | * Steve VanDeBogart (vandebo@uclink.berkeley.edu) | 7 | * Steve VanDeBogart (vandebo@uclink.berkeley.edu) |
8 | * Greg Alexander (galexand@acm.org) | 8 | * Greg Alexander (galexand@acm.org) |
9 | * | 9 | * |
10 | * Copyright(c) 2005-2008 Mauro Carvalho Chehab | ||
11 | * - Some cleanups, code fixes, etc | ||
12 | * - Convert it to V4L2 API | ||
13 | * | ||
10 | * This code is placed under the terms of the GNU General Public License | 14 | * This code is placed under the terms of the GNU General Public License |
11 | * | 15 | * |
12 | * OPTIONS: | 16 | * OPTIONS: |
@@ -30,6 +34,7 @@ | |||
30 | 34 | ||
31 | #include <media/tvaudio.h> | 35 | #include <media/tvaudio.h> |
32 | #include <media/v4l2-common.h> | 36 | #include <media/v4l2-common.h> |
37 | #include <media/v4l2-ioctl.h> | ||
33 | #include <media/v4l2-chip-ident.h> | 38 | #include <media/v4l2-chip-ident.h> |
34 | #include <media/v4l2-i2c-drv-legacy.h> | 39 | #include <media/v4l2-i2c-drv-legacy.h> |
35 | 40 | ||
@@ -58,7 +63,6 @@ typedef int (*checkit)(struct CHIPSTATE*); | |||
58 | typedef int (*initialize)(struct CHIPSTATE*); | 63 | typedef int (*initialize)(struct CHIPSTATE*); |
59 | typedef int (*getmode)(struct CHIPSTATE*); | 64 | typedef int (*getmode)(struct CHIPSTATE*); |
60 | typedef void (*setmode)(struct CHIPSTATE*, int mode); | 65 | typedef void (*setmode)(struct CHIPSTATE*, int mode); |
61 | typedef void (*checkmode)(struct CHIPSTATE*); | ||
62 | 66 | ||
63 | /* i2c command */ | 67 | /* i2c command */ |
64 | typedef struct AUDIOCMD { | 68 | typedef struct AUDIOCMD { |
@@ -79,6 +83,7 @@ struct CHIPDESC { | |||
79 | #define CHIP_HAS_VOLUME 1 | 83 | #define CHIP_HAS_VOLUME 1 |
80 | #define CHIP_HAS_BASSTREBLE 2 | 84 | #define CHIP_HAS_BASSTREBLE 2 |
81 | #define CHIP_HAS_INPUTSEL 4 | 85 | #define CHIP_HAS_INPUTSEL 4 |
86 | #define CHIP_NEED_CHECKMODE 8 | ||
82 | 87 | ||
83 | /* various i2c command sequences */ | 88 | /* various i2c command sequences */ |
84 | audiocmd init; | 89 | audiocmd init; |
@@ -96,23 +101,20 @@ struct CHIPDESC { | |||
96 | getmode getmode; | 101 | getmode getmode; |
97 | setmode setmode; | 102 | setmode setmode; |
98 | 103 | ||
99 | /* check / autoswitch audio after channel switches */ | ||
100 | checkmode checkmode; | ||
101 | |||
102 | /* input switch register + values for v4l inputs */ | 104 | /* input switch register + values for v4l inputs */ |
103 | int inputreg; | 105 | int inputreg; |
104 | int inputmap[4]; | 106 | int inputmap[4]; |
105 | int inputmute; | 107 | int inputmute; |
106 | int inputmask; | 108 | int inputmask; |
107 | }; | 109 | }; |
108 | static struct CHIPDESC chiplist[]; | ||
109 | 110 | ||
110 | /* current state of the chip */ | 111 | /* current state of the chip */ |
111 | struct CHIPSTATE { | 112 | struct CHIPSTATE { |
112 | struct i2c_client *c; | 113 | struct i2c_client *c; |
113 | 114 | ||
114 | /* index into CHIPDESC array */ | 115 | /* chip-specific description - should point to |
115 | int type; | 116 | an entry at CHIPDESC table */ |
117 | struct CHIPDESC *desc; | ||
116 | 118 | ||
117 | /* shadow register set */ | 119 | /* shadow register set */ |
118 | audiocmd shadow; | 120 | audiocmd shadow; |
@@ -152,7 +154,7 @@ static int chip_write(struct CHIPSTATE *chip, int subaddr, int val) | |||
152 | { | 154 | { |
153 | unsigned char buffer[2]; | 155 | unsigned char buffer[2]; |
154 | 156 | ||
155 | if (-1 == subaddr) { | 157 | if (subaddr < 0) { |
156 | v4l_dbg(1, debug, chip->c, "%s: chip_write: 0x%x\n", | 158 | v4l_dbg(1, debug, chip->c, "%s: chip_write: 0x%x\n", |
157 | chip->c->name, val); | 159 | chip->c->name, val); |
158 | chip->shadow.bytes[1] = val; | 160 | chip->shadow.bytes[1] = val; |
@@ -163,6 +165,13 @@ static int chip_write(struct CHIPSTATE *chip, int subaddr, int val) | |||
163 | return -1; | 165 | return -1; |
164 | } | 166 | } |
165 | } else { | 167 | } else { |
168 | if (subaddr + 1 >= ARRAY_SIZE(chip->shadow.bytes)) { | ||
169 | v4l_info(chip->c, | ||
170 | "Tried to access a non-existent register: %d\n", | ||
171 | subaddr); | ||
172 | return -EINVAL; | ||
173 | } | ||
174 | |||
166 | v4l_dbg(1, debug, chip->c, "%s: chip_write: reg%d=0x%x\n", | 175 | v4l_dbg(1, debug, chip->c, "%s: chip_write: reg%d=0x%x\n", |
167 | chip->c->name, subaddr, val); | 176 | chip->c->name, subaddr, val); |
168 | chip->shadow.bytes[subaddr+1] = val; | 177 | chip->shadow.bytes[subaddr+1] = val; |
@@ -177,12 +186,20 @@ static int chip_write(struct CHIPSTATE *chip, int subaddr, int val) | |||
177 | return 0; | 186 | return 0; |
178 | } | 187 | } |
179 | 188 | ||
180 | static int chip_write_masked(struct CHIPSTATE *chip, int subaddr, int val, int mask) | 189 | static int chip_write_masked(struct CHIPSTATE *chip, |
190 | int subaddr, int val, int mask) | ||
181 | { | 191 | { |
182 | if (mask != 0) { | 192 | if (mask != 0) { |
183 | if (-1 == subaddr) { | 193 | if (subaddr < 0) { |
184 | val = (chip->shadow.bytes[1] & ~mask) | (val & mask); | 194 | val = (chip->shadow.bytes[1] & ~mask) | (val & mask); |
185 | } else { | 195 | } else { |
196 | if (subaddr + 1 >= ARRAY_SIZE(chip->shadow.bytes)) { | ||
197 | v4l_info(chip->c, | ||
198 | "Tried to access a non-existent register: %d\n", | ||
199 | subaddr); | ||
200 | return -EINVAL; | ||
201 | } | ||
202 | |||
186 | val = (chip->shadow.bytes[subaddr+1] & ~mask) | (val & mask); | 203 | val = (chip->shadow.bytes[subaddr+1] & ~mask) | (val & mask); |
187 | } | 204 | } |
188 | } | 205 | } |
@@ -228,6 +245,15 @@ static int chip_cmd(struct CHIPSTATE *chip, char *name, audiocmd *cmd) | |||
228 | if (0 == cmd->count) | 245 | if (0 == cmd->count) |
229 | return 0; | 246 | return 0; |
230 | 247 | ||
248 | if (cmd->count + cmd->bytes[0] - 1 >= ARRAY_SIZE(chip->shadow.bytes)) { | ||
249 | v4l_info(chip->c, | ||
250 | "Tried to access a non-existent register range: %d to %d\n", | ||
251 | cmd->bytes[0] + 1, cmd->bytes[0] + cmd->count - 1); | ||
252 | return -EINVAL; | ||
253 | } | ||
254 | |||
255 | /* FIXME: it seems that the shadow bytes are wrong bellow !*/ | ||
256 | |||
231 | /* update our shadow register set; print bytes if (debug > 0) */ | 257 | /* update our shadow register set; print bytes if (debug > 0) */ |
232 | v4l_dbg(1, debug, chip->c, "%s: chip_cmd(%s): reg=%d, data:", | 258 | v4l_dbg(1, debug, chip->c, "%s: chip_cmd(%s): reg=%d, data:", |
233 | chip->c->name, name,cmd->bytes[0]); | 259 | chip->c->name, name,cmd->bytes[0]); |
@@ -263,7 +289,8 @@ static void chip_thread_wake(unsigned long data) | |||
263 | static int chip_thread(void *data) | 289 | static int chip_thread(void *data) |
264 | { | 290 | { |
265 | struct CHIPSTATE *chip = data; | 291 | struct CHIPSTATE *chip = data; |
266 | struct CHIPDESC *desc = chiplist + chip->type; | 292 | struct CHIPDESC *desc = chip->desc; |
293 | int mode; | ||
267 | 294 | ||
268 | v4l_dbg(1, debug, chip->c, "%s: thread started\n", chip->c->name); | 295 | v4l_dbg(1, debug, chip->c, "%s: thread started\n", chip->c->name); |
269 | set_freezable(); | 296 | set_freezable(); |
@@ -282,7 +309,26 @@ static int chip_thread(void *data) | |||
282 | continue; | 309 | continue; |
283 | 310 | ||
284 | /* have a look what's going on */ | 311 | /* have a look what's going on */ |
285 | desc->checkmode(chip); | 312 | mode = desc->getmode(chip); |
313 | if (mode == chip->prevmode) | ||
314 | continue; | ||
315 | |||
316 | /* chip detected a new audio mode - set it */ | ||
317 | v4l_dbg(1, debug, chip->c, "%s: thread checkmode\n", | ||
318 | chip->c->name); | ||
319 | |||
320 | chip->prevmode = mode; | ||
321 | |||
322 | if (mode & V4L2_TUNER_MODE_STEREO) | ||
323 | desc->setmode(chip, V4L2_TUNER_MODE_STEREO); | ||
324 | if (mode & V4L2_TUNER_MODE_LANG1_LANG2) | ||
325 | desc->setmode(chip, V4L2_TUNER_MODE_STEREO); | ||
326 | else if (mode & V4L2_TUNER_MODE_LANG1) | ||
327 | desc->setmode(chip, V4L2_TUNER_MODE_LANG1); | ||
328 | else if (mode & V4L2_TUNER_MODE_LANG2) | ||
329 | desc->setmode(chip, V4L2_TUNER_MODE_LANG2); | ||
330 | else | ||
331 | desc->setmode(chip, V4L2_TUNER_MODE_MONO); | ||
286 | 332 | ||
287 | /* schedule next check */ | 333 | /* schedule next check */ |
288 | mod_timer(&chip->wt, jiffies+msecs_to_jiffies(2000)); | 334 | mod_timer(&chip->wt, jiffies+msecs_to_jiffies(2000)); |
@@ -292,29 +338,6 @@ static int chip_thread(void *data) | |||
292 | return 0; | 338 | return 0; |
293 | } | 339 | } |
294 | 340 | ||
295 | static void generic_checkmode(struct CHIPSTATE *chip) | ||
296 | { | ||
297 | struct CHIPDESC *desc = chiplist + chip->type; | ||
298 | int mode = desc->getmode(chip); | ||
299 | |||
300 | if (mode == chip->prevmode) | ||
301 | return; | ||
302 | |||
303 | v4l_dbg(1, debug, chip->c, "%s: thread checkmode\n", chip->c->name); | ||
304 | chip->prevmode = mode; | ||
305 | |||
306 | if (mode & V4L2_TUNER_MODE_STEREO) | ||
307 | desc->setmode(chip,V4L2_TUNER_MODE_STEREO); | ||
308 | if (mode & V4L2_TUNER_MODE_LANG1_LANG2) | ||
309 | desc->setmode(chip,V4L2_TUNER_MODE_STEREO); | ||
310 | else if (mode & V4L2_TUNER_MODE_LANG1) | ||
311 | desc->setmode(chip,V4L2_TUNER_MODE_LANG1); | ||
312 | else if (mode & V4L2_TUNER_MODE_LANG2) | ||
313 | desc->setmode(chip,V4L2_TUNER_MODE_LANG2); | ||
314 | else | ||
315 | desc->setmode(chip,V4L2_TUNER_MODE_MONO); | ||
316 | } | ||
317 | |||
318 | /* ---------------------------------------------------------------------- */ | 341 | /* ---------------------------------------------------------------------- */ |
319 | /* audio chip descriptions - defines+functions for tda9840 */ | 342 | /* audio chip descriptions - defines+functions for tda9840 */ |
320 | 343 | ||
@@ -777,7 +800,7 @@ static struct tda9874a_MODES { | |||
777 | char *name; | 800 | char *name; |
778 | audiocmd cmd; | 801 | audiocmd cmd; |
779 | } tda9874a_modelist[9] = { | 802 | } tda9874a_modelist[9] = { |
780 | { "A2, B/G", | 803 | { "A2, B/G", /* default */ |
781 | { 9, { TDA9874A_C1FRA, 0x72,0x95,0x55, 0x77,0xA0,0x00, 0x00,0x00 }} }, | 804 | { 9, { TDA9874A_C1FRA, 0x72,0x95,0x55, 0x77,0xA0,0x00, 0x00,0x00 }} }, |
782 | { "A2, M (Korea)", | 805 | { "A2, M (Korea)", |
783 | { 9, { TDA9874A_C1FRA, 0x5D,0xC0,0x00, 0x62,0x6A,0xAA, 0x20,0x22 }} }, | 806 | { 9, { TDA9874A_C1FRA, 0x5D,0xC0,0x00, 0x62,0x6A,0xAA, 0x20,0x22 }} }, |
@@ -791,7 +814,7 @@ static struct tda9874a_MODES { | |||
791 | { 9, { TDA9874A_C1FRA, 0x7D,0x00,0x00, 0x88,0x8A,0xAA, 0x08,0x33 }} }, | 814 | { 9, { TDA9874A_C1FRA, 0x7D,0x00,0x00, 0x88,0x8A,0xAA, 0x08,0x33 }} }, |
792 | { "NICAM, B/G", | 815 | { "NICAM, B/G", |
793 | { 9, { TDA9874A_C1FRA, 0x72,0x95,0x55, 0x79,0xEA,0xAA, 0x08,0x33 }} }, | 816 | { 9, { TDA9874A_C1FRA, 0x72,0x95,0x55, 0x79,0xEA,0xAA, 0x08,0x33 }} }, |
794 | { "NICAM, D/K", /* default */ | 817 | { "NICAM, D/K", |
795 | { 9, { TDA9874A_C1FRA, 0x87,0x6A,0xAA, 0x79,0xEA,0xAA, 0x08,0x33 }} }, | 818 | { 9, { TDA9874A_C1FRA, 0x87,0x6A,0xAA, 0x79,0xEA,0xAA, 0x08,0x33 }} }, |
796 | { "NICAM, L", | 819 | { "NICAM, L", |
797 | { 9, { TDA9874A_C1FRA, 0x87,0x6A,0xAA, 0x79,0xEA,0xAA, 0x09,0x33 }} } | 820 | { 9, { TDA9874A_C1FRA, 0x87,0x6A,0xAA, 0x79,0xEA,0xAA, 0x09,0x33 }} } |
@@ -981,7 +1004,7 @@ static int tda9874a_initialize(struct CHIPSTATE *chip) | |||
981 | { | 1004 | { |
982 | if (tda9874a_SIF > 2) | 1005 | if (tda9874a_SIF > 2) |
983 | tda9874a_SIF = 1; | 1006 | tda9874a_SIF = 1; |
984 | if (tda9874a_STD > 8) | 1007 | if (tda9874a_STD >= ARRAY_SIZE(tda9874a_modelist)) |
985 | tda9874a_STD = 0; | 1008 | tda9874a_STD = 0; |
986 | if(tda9874a_AMSEL > 1) | 1009 | if(tda9874a_AMSEL > 1) |
987 | tda9874a_AMSEL = 0; | 1010 | tda9874a_AMSEL = 0; |
@@ -1089,7 +1112,7 @@ static int tda8425_shift12(int val) { return (val >> 12) | 0xf0; } | |||
1089 | 1112 | ||
1090 | static int tda8425_initialize(struct CHIPSTATE *chip) | 1113 | static int tda8425_initialize(struct CHIPSTATE *chip) |
1091 | { | 1114 | { |
1092 | struct CHIPDESC *desc = chiplist + chip->type; | 1115 | struct CHIPDESC *desc = chip->desc; |
1093 | int inputmap[4] = { /* tuner */ TDA8425_S1_CH2, /* radio */ TDA8425_S1_CH1, | 1116 | int inputmap[4] = { /* tuner */ TDA8425_S1_CH2, /* radio */ TDA8425_S1_CH1, |
1094 | /* extern */ TDA8425_S1_CH1, /* intern */ TDA8425_S1_OFF}; | 1117 | /* extern */ TDA8425_S1_CH1, /* intern */ TDA8425_S1_OFF}; |
1095 | 1118 | ||
@@ -1259,27 +1282,28 @@ static struct CHIPDESC chiplist[] = { | |||
1259 | .addr_lo = I2C_ADDR_TDA9840 >> 1, | 1282 | .addr_lo = I2C_ADDR_TDA9840 >> 1, |
1260 | .addr_hi = I2C_ADDR_TDA9840 >> 1, | 1283 | .addr_hi = I2C_ADDR_TDA9840 >> 1, |
1261 | .registers = 5, | 1284 | .registers = 5, |
1285 | .flags = CHIP_NEED_CHECKMODE, | ||
1262 | 1286 | ||
1287 | /* callbacks */ | ||
1263 | .checkit = tda9840_checkit, | 1288 | .checkit = tda9840_checkit, |
1264 | .getmode = tda9840_getmode, | 1289 | .getmode = tda9840_getmode, |
1265 | .setmode = tda9840_setmode, | 1290 | .setmode = tda9840_setmode, |
1266 | .checkmode = generic_checkmode, | ||
1267 | 1291 | ||
1268 | .init = { 2, { TDA9840_TEST, TDA9840_TEST_INT1SN | 1292 | .init = { 2, { TDA9840_TEST, TDA9840_TEST_INT1SN |
1269 | /* ,TDA9840_SW, TDA9840_MONO */} } | 1293 | /* ,TDA9840_SW, TDA9840_MONO */} } |
1270 | }, | 1294 | }, |
1271 | { | 1295 | { |
1272 | .name = "tda9873h", | 1296 | .name = "tda9873h", |
1273 | .checkit = tda9873_checkit, | ||
1274 | .insmodopt = &tda9873, | 1297 | .insmodopt = &tda9873, |
1275 | .addr_lo = I2C_ADDR_TDA985x_L >> 1, | 1298 | .addr_lo = I2C_ADDR_TDA985x_L >> 1, |
1276 | .addr_hi = I2C_ADDR_TDA985x_H >> 1, | 1299 | .addr_hi = I2C_ADDR_TDA985x_H >> 1, |
1277 | .registers = 3, | 1300 | .registers = 3, |
1278 | .flags = CHIP_HAS_INPUTSEL, | 1301 | .flags = CHIP_HAS_INPUTSEL | CHIP_NEED_CHECKMODE, |
1279 | 1302 | ||
1303 | /* callbacks */ | ||
1304 | .checkit = tda9873_checkit, | ||
1280 | .getmode = tda9873_getmode, | 1305 | .getmode = tda9873_getmode, |
1281 | .setmode = tda9873_setmode, | 1306 | .setmode = tda9873_setmode, |
1282 | .checkmode = generic_checkmode, | ||
1283 | 1307 | ||
1284 | .init = { 4, { TDA9873_SW, 0xa4, 0x06, 0x03 } }, | 1308 | .init = { 4, { TDA9873_SW, 0xa4, 0x06, 0x03 } }, |
1285 | .inputreg = TDA9873_SW, | 1309 | .inputreg = TDA9873_SW, |
@@ -1290,15 +1314,16 @@ static struct CHIPDESC chiplist[] = { | |||
1290 | }, | 1314 | }, |
1291 | { | 1315 | { |
1292 | .name = "tda9874h/a", | 1316 | .name = "tda9874h/a", |
1293 | .checkit = tda9874a_checkit, | ||
1294 | .initialize = tda9874a_initialize, | ||
1295 | .insmodopt = &tda9874a, | 1317 | .insmodopt = &tda9874a, |
1296 | .addr_lo = I2C_ADDR_TDA9874 >> 1, | 1318 | .addr_lo = I2C_ADDR_TDA9874 >> 1, |
1297 | .addr_hi = I2C_ADDR_TDA9874 >> 1, | 1319 | .addr_hi = I2C_ADDR_TDA9874 >> 1, |
1320 | .flags = CHIP_NEED_CHECKMODE, | ||
1298 | 1321 | ||
1322 | /* callbacks */ | ||
1323 | .initialize = tda9874a_initialize, | ||
1324 | .checkit = tda9874a_checkit, | ||
1299 | .getmode = tda9874a_getmode, | 1325 | .getmode = tda9874a_getmode, |
1300 | .setmode = tda9874a_setmode, | 1326 | .setmode = tda9874a_setmode, |
1301 | .checkmode = generic_checkmode, | ||
1302 | }, | 1327 | }, |
1303 | { | 1328 | { |
1304 | .name = "tda9850", | 1329 | .name = "tda9850", |
@@ -1324,10 +1349,11 @@ static struct CHIPDESC chiplist[] = { | |||
1324 | .rightreg = TDA9855_VR, | 1349 | .rightreg = TDA9855_VR, |
1325 | .bassreg = TDA9855_BA, | 1350 | .bassreg = TDA9855_BA, |
1326 | .treblereg = TDA9855_TR, | 1351 | .treblereg = TDA9855_TR, |
1352 | |||
1353 | /* callbacks */ | ||
1327 | .volfunc = tda9855_volume, | 1354 | .volfunc = tda9855_volume, |
1328 | .bassfunc = tda9855_bass, | 1355 | .bassfunc = tda9855_bass, |
1329 | .treblefunc = tda9855_treble, | 1356 | .treblefunc = tda9855_treble, |
1330 | |||
1331 | .getmode = tda985x_getmode, | 1357 | .getmode = tda985x_getmode, |
1332 | .setmode = tda985x_setmode, | 1358 | .setmode = tda985x_setmode, |
1333 | 1359 | ||
@@ -1348,6 +1374,8 @@ static struct CHIPDESC chiplist[] = { | |||
1348 | .rightreg = TEA6300_VL, | 1374 | .rightreg = TEA6300_VL, |
1349 | .bassreg = TEA6300_BA, | 1375 | .bassreg = TEA6300_BA, |
1350 | .treblereg = TEA6300_TR, | 1376 | .treblereg = TEA6300_TR, |
1377 | |||
1378 | /* callbacks */ | ||
1351 | .volfunc = tea6300_shift10, | 1379 | .volfunc = tea6300_shift10, |
1352 | .bassfunc = tea6300_shift12, | 1380 | .bassfunc = tea6300_shift12, |
1353 | .treblefunc = tea6300_shift12, | 1381 | .treblefunc = tea6300_shift12, |
@@ -1358,7 +1386,6 @@ static struct CHIPDESC chiplist[] = { | |||
1358 | }, | 1386 | }, |
1359 | { | 1387 | { |
1360 | .name = "tea6320", | 1388 | .name = "tea6320", |
1361 | .initialize = tea6320_initialize, | ||
1362 | .insmodopt = &tea6320, | 1389 | .insmodopt = &tea6320, |
1363 | .addr_lo = I2C_ADDR_TEA6300 >> 1, | 1390 | .addr_lo = I2C_ADDR_TEA6300 >> 1, |
1364 | .addr_hi = I2C_ADDR_TEA6300 >> 1, | 1391 | .addr_hi = I2C_ADDR_TEA6300 >> 1, |
@@ -1369,6 +1396,9 @@ static struct CHIPDESC chiplist[] = { | |||
1369 | .rightreg = TEA6320_V, | 1396 | .rightreg = TEA6320_V, |
1370 | .bassreg = TEA6320_BA, | 1397 | .bassreg = TEA6320_BA, |
1371 | .treblereg = TEA6320_TR, | 1398 | .treblereg = TEA6320_TR, |
1399 | |||
1400 | /* callbacks */ | ||
1401 | .initialize = tea6320_initialize, | ||
1372 | .volfunc = tea6320_volume, | 1402 | .volfunc = tea6320_volume, |
1373 | .bassfunc = tea6320_shift11, | 1403 | .bassfunc = tea6320_shift11, |
1374 | .treblefunc = tea6320_shift11, | 1404 | .treblefunc = tea6320_shift11, |
@@ -1401,16 +1431,18 @@ static struct CHIPDESC chiplist[] = { | |||
1401 | .rightreg = TDA8425_VR, | 1431 | .rightreg = TDA8425_VR, |
1402 | .bassreg = TDA8425_BA, | 1432 | .bassreg = TDA8425_BA, |
1403 | .treblereg = TDA8425_TR, | 1433 | .treblereg = TDA8425_TR, |
1434 | |||
1435 | /* callbacks */ | ||
1436 | .initialize = tda8425_initialize, | ||
1404 | .volfunc = tda8425_shift10, | 1437 | .volfunc = tda8425_shift10, |
1405 | .bassfunc = tda8425_shift12, | 1438 | .bassfunc = tda8425_shift12, |
1406 | .treblefunc = tda8425_shift12, | 1439 | .treblefunc = tda8425_shift12, |
1440 | .setmode = tda8425_setmode, | ||
1407 | 1441 | ||
1408 | .inputreg = TDA8425_S1, | 1442 | .inputreg = TDA8425_S1, |
1409 | .inputmap = { TDA8425_S1_CH1, TDA8425_S1_CH1, TDA8425_S1_CH1 }, | 1443 | .inputmap = { TDA8425_S1_CH1, TDA8425_S1_CH1, TDA8425_S1_CH1 }, |
1410 | .inputmute = TDA8425_S1_OFF, | 1444 | .inputmute = TDA8425_S1_OFF, |
1411 | 1445 | ||
1412 | .setmode = tda8425_setmode, | ||
1413 | .initialize = tda8425_initialize, | ||
1414 | }, | 1446 | }, |
1415 | { | 1447 | { |
1416 | .name = "pic16c54 (PV951)", | 1448 | .name = "pic16c54 (PV951)", |
@@ -1434,10 +1466,11 @@ static struct CHIPDESC chiplist[] = { | |||
1434 | .addr_lo = I2C_ADDR_TDA9840 >> 1, | 1466 | .addr_lo = I2C_ADDR_TDA9840 >> 1, |
1435 | .addr_hi = I2C_ADDR_TDA9840 >> 1, | 1467 | .addr_hi = I2C_ADDR_TDA9840 >> 1, |
1436 | .registers = 2, | 1468 | .registers = 2, |
1469 | .flags = CHIP_NEED_CHECKMODE, | ||
1437 | 1470 | ||
1471 | /* callbacks */ | ||
1438 | .getmode = ta8874z_getmode, | 1472 | .getmode = ta8874z_getmode, |
1439 | .setmode = ta8874z_setmode, | 1473 | .setmode = ta8874z_setmode, |
1440 | .checkmode = generic_checkmode, | ||
1441 | 1474 | ||
1442 | .init = {2, { TA8874Z_MONO_SET, TA8874Z_SEPARATION_DEFAULT}}, | 1475 | .init = {2, { TA8874Z_MONO_SET, TA8874Z_SEPARATION_DEFAULT}}, |
1443 | }, | 1476 | }, |
@@ -1481,6 +1514,7 @@ static int chip_probe(struct i2c_client *client, const struct i2c_device_id *id) | |||
1481 | } | 1514 | } |
1482 | if (desc->name == NULL) { | 1515 | if (desc->name == NULL) { |
1483 | v4l_dbg(1, debug, client, "no matching chip description found\n"); | 1516 | v4l_dbg(1, debug, client, "no matching chip description found\n"); |
1517 | kfree(chip); | ||
1484 | return -EIO; | 1518 | return -EIO; |
1485 | } | 1519 | } |
1486 | v4l_info(client, "%s found @ 0x%x (%s)\n", desc->name, client->addr<<1, client->adapter->name); | 1520 | v4l_info(client, "%s found @ 0x%x (%s)\n", desc->name, client->addr<<1, client->adapter->name); |
@@ -1494,7 +1528,7 @@ static int chip_probe(struct i2c_client *client, const struct i2c_device_id *id) | |||
1494 | /* fill required data structures */ | 1528 | /* fill required data structures */ |
1495 | if (!id) | 1529 | if (!id) |
1496 | strlcpy(client->name, desc->name, I2C_NAME_SIZE); | 1530 | strlcpy(client->name, desc->name, I2C_NAME_SIZE); |
1497 | chip->type = desc-chiplist; | 1531 | chip->desc = desc; |
1498 | chip->shadow.count = desc->registers+1; | 1532 | chip->shadow.count = desc->registers+1; |
1499 | chip->prevmode = -1; | 1533 | chip->prevmode = -1; |
1500 | chip->audmode = V4L2_TUNER_MODE_LANG1; | 1534 | chip->audmode = V4L2_TUNER_MODE_LANG1; |
@@ -1506,20 +1540,49 @@ static int chip_probe(struct i2c_client *client, const struct i2c_device_id *id) | |||
1506 | chip_cmd(chip,"init",&desc->init); | 1540 | chip_cmd(chip,"init",&desc->init); |
1507 | 1541 | ||
1508 | if (desc->flags & CHIP_HAS_VOLUME) { | 1542 | if (desc->flags & CHIP_HAS_VOLUME) { |
1509 | chip->left = desc->leftinit ? desc->leftinit : 65535; | 1543 | if (!desc->volfunc) { |
1510 | chip->right = desc->rightinit ? desc->rightinit : 65535; | 1544 | /* This shouldn't be happen. Warn user, but keep working |
1511 | chip_write(chip,desc->leftreg,desc->volfunc(chip->left)); | 1545 | without volume controls |
1512 | chip_write(chip,desc->rightreg,desc->volfunc(chip->right)); | 1546 | */ |
1547 | v4l_info(chip->c, "volume callback undefined!\n"); | ||
1548 | desc->flags &= ~CHIP_HAS_VOLUME; | ||
1549 | } else { | ||
1550 | chip->left = desc->leftinit ? desc->leftinit : 65535; | ||
1551 | chip->right = desc->rightinit ? desc->rightinit : 65535; | ||
1552 | chip_write(chip, desc->leftreg, | ||
1553 | desc->volfunc(chip->left)); | ||
1554 | chip_write(chip, desc->rightreg, | ||
1555 | desc->volfunc(chip->right)); | ||
1556 | } | ||
1513 | } | 1557 | } |
1514 | if (desc->flags & CHIP_HAS_BASSTREBLE) { | 1558 | if (desc->flags & CHIP_HAS_BASSTREBLE) { |
1515 | chip->treble = desc->trebleinit ? desc->trebleinit : 32768; | 1559 | if (!desc->bassfunc || !desc->treblefunc) { |
1516 | chip->bass = desc->bassinit ? desc->bassinit : 32768; | 1560 | /* This shouldn't be happen. Warn user, but keep working |
1517 | chip_write(chip,desc->bassreg,desc->bassfunc(chip->bass)); | 1561 | without bass/treble controls |
1518 | chip_write(chip,desc->treblereg,desc->treblefunc(chip->treble)); | 1562 | */ |
1563 | v4l_info(chip->c, "bass/treble callbacks undefined!\n"); | ||
1564 | desc->flags &= ~CHIP_HAS_BASSTREBLE; | ||
1565 | } else { | ||
1566 | chip->treble = desc->trebleinit ? | ||
1567 | desc->trebleinit : 32768; | ||
1568 | chip->bass = desc->bassinit ? | ||
1569 | desc->bassinit : 32768; | ||
1570 | chip_write(chip, desc->bassreg, | ||
1571 | desc->bassfunc(chip->bass)); | ||
1572 | chip_write(chip, desc->treblereg, | ||
1573 | desc->treblefunc(chip->treble)); | ||
1574 | } | ||
1519 | } | 1575 | } |
1520 | 1576 | ||
1521 | chip->thread = NULL; | 1577 | chip->thread = NULL; |
1522 | if (desc->checkmode) { | 1578 | if (desc->flags & CHIP_NEED_CHECKMODE) { |
1579 | if (!desc->getmode || !desc->setmode) { | ||
1580 | /* This shouldn't be happen. Warn user, but keep working | ||
1581 | without kthread | ||
1582 | */ | ||
1583 | v4l_info(chip->c, "set/get mode callbacks undefined!\n"); | ||
1584 | return 0; | ||
1585 | } | ||
1523 | /* start async thread */ | 1586 | /* start async thread */ |
1524 | init_timer(&chip->wt); | 1587 | init_timer(&chip->wt); |
1525 | chip->wt.function = chip_thread_wake; | 1588 | chip->wt.function = chip_thread_wake; |
@@ -1552,7 +1615,7 @@ static int chip_remove(struct i2c_client *client) | |||
1552 | static int tvaudio_get_ctrl(struct CHIPSTATE *chip, | 1615 | static int tvaudio_get_ctrl(struct CHIPSTATE *chip, |
1553 | struct v4l2_control *ctrl) | 1616 | struct v4l2_control *ctrl) |
1554 | { | 1617 | { |
1555 | struct CHIPDESC *desc = chiplist + chip->type; | 1618 | struct CHIPDESC *desc = chip->desc; |
1556 | 1619 | ||
1557 | switch (ctrl->id) { | 1620 | switch (ctrl->id) { |
1558 | case V4L2_CID_AUDIO_MUTE: | 1621 | case V4L2_CID_AUDIO_MUTE: |
@@ -1576,13 +1639,13 @@ static int tvaudio_get_ctrl(struct CHIPSTATE *chip, | |||
1576 | return 0; | 1639 | return 0; |
1577 | } | 1640 | } |
1578 | case V4L2_CID_AUDIO_BASS: | 1641 | case V4L2_CID_AUDIO_BASS: |
1579 | if (desc->flags & CHIP_HAS_BASSTREBLE) | 1642 | if (!(desc->flags & CHIP_HAS_BASSTREBLE)) |
1580 | break; | 1643 | break; |
1581 | ctrl->value = chip->bass; | 1644 | ctrl->value = chip->bass; |
1582 | return 0; | 1645 | return 0; |
1583 | case V4L2_CID_AUDIO_TREBLE: | 1646 | case V4L2_CID_AUDIO_TREBLE: |
1584 | if (desc->flags & CHIP_HAS_BASSTREBLE) | 1647 | if (!(desc->flags & CHIP_HAS_BASSTREBLE)) |
1585 | return -EINVAL; | 1648 | break; |
1586 | ctrl->value = chip->treble; | 1649 | ctrl->value = chip->treble; |
1587 | return 0; | 1650 | return 0; |
1588 | } | 1651 | } |
@@ -1592,7 +1655,7 @@ static int tvaudio_get_ctrl(struct CHIPSTATE *chip, | |||
1592 | static int tvaudio_set_ctrl(struct CHIPSTATE *chip, | 1655 | static int tvaudio_set_ctrl(struct CHIPSTATE *chip, |
1593 | struct v4l2_control *ctrl) | 1656 | struct v4l2_control *ctrl) |
1594 | { | 1657 | { |
1595 | struct CHIPDESC *desc = chiplist + chip->type; | 1658 | struct CHIPDESC *desc = chip->desc; |
1596 | 1659 | ||
1597 | switch (ctrl->id) { | 1660 | switch (ctrl->id) { |
1598 | case V4L2_CID_AUDIO_MUTE: | 1661 | case V4L2_CID_AUDIO_MUTE: |
@@ -1642,16 +1705,15 @@ static int tvaudio_set_ctrl(struct CHIPSTATE *chip, | |||
1642 | return 0; | 1705 | return 0; |
1643 | } | 1706 | } |
1644 | case V4L2_CID_AUDIO_BASS: | 1707 | case V4L2_CID_AUDIO_BASS: |
1645 | if (desc->flags & CHIP_HAS_BASSTREBLE) | 1708 | if (!(desc->flags & CHIP_HAS_BASSTREBLE)) |
1646 | break; | 1709 | break; |
1647 | chip->bass = ctrl->value; | 1710 | chip->bass = ctrl->value; |
1648 | chip_write(chip,desc->bassreg,desc->bassfunc(chip->bass)); | 1711 | chip_write(chip,desc->bassreg,desc->bassfunc(chip->bass)); |
1649 | 1712 | ||
1650 | return 0; | 1713 | return 0; |
1651 | case V4L2_CID_AUDIO_TREBLE: | 1714 | case V4L2_CID_AUDIO_TREBLE: |
1652 | if (desc->flags & CHIP_HAS_BASSTREBLE) | 1715 | if (!(desc->flags & CHIP_HAS_BASSTREBLE)) |
1653 | return -EINVAL; | 1716 | break; |
1654 | |||
1655 | chip->treble = ctrl->value; | 1717 | chip->treble = ctrl->value; |
1656 | chip_write(chip,desc->treblereg,desc->treblefunc(chip->treble)); | 1718 | chip_write(chip,desc->treblereg,desc->treblefunc(chip->treble)); |
1657 | 1719 | ||
@@ -1668,9 +1730,12 @@ static int chip_command(struct i2c_client *client, | |||
1668 | unsigned int cmd, void *arg) | 1730 | unsigned int cmd, void *arg) |
1669 | { | 1731 | { |
1670 | struct CHIPSTATE *chip = i2c_get_clientdata(client); | 1732 | struct CHIPSTATE *chip = i2c_get_clientdata(client); |
1671 | struct CHIPDESC *desc = chiplist + chip->type; | 1733 | struct CHIPDESC *desc = chip->desc; |
1672 | 1734 | ||
1673 | v4l_dbg(1, debug, chip->c, "%s: chip_command 0x%x\n", chip->c->name, cmd); | 1735 | if (debug > 0) { |
1736 | v4l_i2c_print_ioctl(chip->c, cmd); | ||
1737 | printk("\n"); | ||
1738 | } | ||
1674 | 1739 | ||
1675 | switch (cmd) { | 1740 | switch (cmd) { |
1676 | case AUDC_SET_RADIO: | 1741 | case AUDC_SET_RADIO: |
@@ -1695,7 +1760,7 @@ static int chip_command(struct i2c_client *client, | |||
1695 | break; | 1760 | break; |
1696 | case V4L2_CID_AUDIO_BASS: | 1761 | case V4L2_CID_AUDIO_BASS: |
1697 | case V4L2_CID_AUDIO_TREBLE: | 1762 | case V4L2_CID_AUDIO_TREBLE: |
1698 | if (desc->flags & CHIP_HAS_BASSTREBLE) | 1763 | if (!(desc->flags & CHIP_HAS_BASSTREBLE)) |
1699 | return -EINVAL; | 1764 | return -EINVAL; |
1700 | break; | 1765 | break; |
1701 | default: | 1766 | default: |
@@ -1792,12 +1857,20 @@ static int chip_command(struct i2c_client *client, | |||
1792 | break; | 1857 | break; |
1793 | case VIDIOC_S_FREQUENCY: | 1858 | case VIDIOC_S_FREQUENCY: |
1794 | chip->mode = 0; /* automatic */ | 1859 | chip->mode = 0; /* automatic */ |
1795 | if (desc->checkmode && desc->setmode) { | 1860 | |
1861 | /* For chips that provide getmode and setmode, and doesn't | ||
1862 | automatically follows the stereo carrier, a kthread is | ||
1863 | created to set the audio standard. In this case, when then | ||
1864 | the video channel is changed, tvaudio starts on MONO mode. | ||
1865 | After waiting for 2 seconds, the kernel thread is called, | ||
1866 | to follow whatever audio standard is pointed by the | ||
1867 | audio carrier. | ||
1868 | */ | ||
1869 | if (chip->thread) { | ||
1796 | desc->setmode(chip,V4L2_TUNER_MODE_MONO); | 1870 | desc->setmode(chip,V4L2_TUNER_MODE_MONO); |
1797 | if (chip->prevmode != V4L2_TUNER_MODE_MONO) | 1871 | if (chip->prevmode != V4L2_TUNER_MODE_MONO) |
1798 | chip->prevmode = -1; /* reset previous mode */ | 1872 | chip->prevmode = -1; /* reset previous mode */ |
1799 | mod_timer(&chip->wt, jiffies+msecs_to_jiffies(2000)); | 1873 | mod_timer(&chip->wt, jiffies+msecs_to_jiffies(2000)); |
1800 | /* the thread will call checkmode() later */ | ||
1801 | } | 1874 | } |
1802 | break; | 1875 | break; |
1803 | 1876 | ||
@@ -1836,9 +1909,3 @@ static struct v4l2_i2c_driver_data v4l2_i2c_data = { | |||
1836 | .legacy_probe = chip_legacy_probe, | 1909 | .legacy_probe = chip_legacy_probe, |
1837 | .id_table = chip_id, | 1910 | .id_table = chip_id, |
1838 | }; | 1911 | }; |
1839 | |||
1840 | /* | ||
1841 | * Local variables: | ||
1842 | * c-basic-offset: 8 | ||
1843 | * End: | ||
1844 | */ | ||
diff --git a/drivers/mfd/da903x.c b/drivers/mfd/da903x.c index b57326ae464d..0b5bd85dfcec 100644 --- a/drivers/mfd/da903x.c +++ b/drivers/mfd/da903x.c | |||
@@ -267,7 +267,7 @@ static int da9030_mask_events(struct da903x_chip *chip, unsigned int events) | |||
267 | { | 267 | { |
268 | uint8_t v[3]; | 268 | uint8_t v[3]; |
269 | 269 | ||
270 | chip->events_mask &= ~events; | 270 | chip->events_mask |= events; |
271 | 271 | ||
272 | v[0] = (chip->events_mask & 0xff); | 272 | v[0] = (chip->events_mask & 0xff); |
273 | v[1] = (chip->events_mask >> 8) & 0xff; | 273 | v[1] = (chip->events_mask >> 8) & 0xff; |
diff --git a/drivers/mfd/wm8350-i2c.c b/drivers/mfd/wm8350-i2c.c index 8dfe21bb3bd1..3e0ce0e50ea2 100644 --- a/drivers/mfd/wm8350-i2c.c +++ b/drivers/mfd/wm8350-i2c.c | |||
@@ -30,7 +30,12 @@ static int wm8350_i2c_read_device(struct wm8350 *wm8350, char reg, | |||
30 | ret = i2c_master_send(wm8350->i2c_client, ®, 1); | 30 | ret = i2c_master_send(wm8350->i2c_client, ®, 1); |
31 | if (ret < 0) | 31 | if (ret < 0) |
32 | return ret; | 32 | return ret; |
33 | return i2c_master_recv(wm8350->i2c_client, dest, bytes); | 33 | ret = i2c_master_recv(wm8350->i2c_client, dest, bytes); |
34 | if (ret < 0) | ||
35 | return ret; | ||
36 | if (ret != bytes) | ||
37 | return -EIO; | ||
38 | return 0; | ||
34 | } | 39 | } |
35 | 40 | ||
36 | static int wm8350_i2c_write_device(struct wm8350 *wm8350, char reg, | 41 | static int wm8350_i2c_write_device(struct wm8350 *wm8350, char reg, |
@@ -38,13 +43,19 @@ static int wm8350_i2c_write_device(struct wm8350 *wm8350, char reg, | |||
38 | { | 43 | { |
39 | /* we add 1 byte for device register */ | 44 | /* we add 1 byte for device register */ |
40 | u8 msg[(WM8350_MAX_REGISTER << 1) + 1]; | 45 | u8 msg[(WM8350_MAX_REGISTER << 1) + 1]; |
46 | int ret; | ||
41 | 47 | ||
42 | if (bytes > ((WM8350_MAX_REGISTER << 1) + 1)) | 48 | if (bytes > ((WM8350_MAX_REGISTER << 1) + 1)) |
43 | return -EINVAL; | 49 | return -EINVAL; |
44 | 50 | ||
45 | msg[0] = reg; | 51 | msg[0] = reg; |
46 | memcpy(&msg[1], src, bytes); | 52 | memcpy(&msg[1], src, bytes); |
47 | return i2c_master_send(wm8350->i2c_client, msg, bytes + 1); | 53 | ret = i2c_master_send(wm8350->i2c_client, msg, bytes + 1); |
54 | if (ret < 0) | ||
55 | return ret; | ||
56 | if (ret != bytes + 1) | ||
57 | return -EIO; | ||
58 | return 0; | ||
48 | } | 59 | } |
49 | 60 | ||
50 | static int wm8350_i2c_probe(struct i2c_client *i2c, | 61 | static int wm8350_i2c_probe(struct i2c_client *i2c, |
diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig index 9494400e8fd0..fee7304102af 100644 --- a/drivers/misc/Kconfig +++ b/drivers/misc/Kconfig | |||
@@ -227,10 +227,20 @@ config HP_WMI | |||
227 | To compile this driver as a module, choose M here: the module will | 227 | To compile this driver as a module, choose M here: the module will |
228 | be called hp-wmi. | 228 | be called hp-wmi. |
229 | 229 | ||
230 | config ICS932S401 | ||
231 | tristate "Integrated Circuits ICS932S401" | ||
232 | depends on I2C && EXPERIMENTAL | ||
233 | help | ||
234 | If you say yes here you get support for the Integrated Circuits | ||
235 | ICS932S401 clock control chips. | ||
236 | |||
237 | This driver can also be built as a module. If so, the module | ||
238 | will be called ics932s401. | ||
239 | |||
230 | config MSI_LAPTOP | 240 | config MSI_LAPTOP |
231 | tristate "MSI Laptop Extras" | 241 | tristate "MSI Laptop Extras" |
232 | depends on X86 | 242 | depends on X86 |
233 | depends on ACPI_EC | 243 | depends on ACPI |
234 | depends on BACKLIGHT_CLASS_DEVICE | 244 | depends on BACKLIGHT_CLASS_DEVICE |
235 | ---help--- | 245 | ---help--- |
236 | This is a driver for laptops built by MSI (MICRO-STAR | 246 | This is a driver for laptops built by MSI (MICRO-STAR |
@@ -260,7 +270,7 @@ config PANASONIC_LAPTOP | |||
260 | config COMPAL_LAPTOP | 270 | config COMPAL_LAPTOP |
261 | tristate "Compal Laptop Extras" | 271 | tristate "Compal Laptop Extras" |
262 | depends on X86 | 272 | depends on X86 |
263 | depends on ACPI_EC | 273 | depends on ACPI |
264 | depends on BACKLIGHT_CLASS_DEVICE | 274 | depends on BACKLIGHT_CLASS_DEVICE |
265 | ---help--- | 275 | ---help--- |
266 | This is a driver for laptops built by Compal: | 276 | This is a driver for laptops built by Compal: |
@@ -488,4 +498,6 @@ config SGI_GRU_DEBUG | |||
488 | This option enables addition debugging code for the SGI GRU driver. If | 498 | This option enables addition debugging code for the SGI GRU driver. If |
489 | you are unsure, say N. | 499 | you are unsure, say N. |
490 | 500 | ||
501 | source "drivers/misc/c2port/Kconfig" | ||
502 | |||
491 | endif # MISC_DEVICES | 503 | endif # MISC_DEVICES |
diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile index 909e2468cdc9..817f7f5ab3bd 100644 --- a/drivers/misc/Makefile +++ b/drivers/misc/Makefile | |||
@@ -14,6 +14,7 @@ obj-$(CONFIG_ATMEL_PWM) += atmel_pwm.o | |||
14 | obj-$(CONFIG_ATMEL_SSC) += atmel-ssc.o | 14 | obj-$(CONFIG_ATMEL_SSC) += atmel-ssc.o |
15 | obj-$(CONFIG_ATMEL_TCLIB) += atmel_tclib.o | 15 | obj-$(CONFIG_ATMEL_TCLIB) += atmel_tclib.o |
16 | obj-$(CONFIG_HP_WMI) += hp-wmi.o | 16 | obj-$(CONFIG_HP_WMI) += hp-wmi.o |
17 | obj-$(CONFIG_ICS932S401) += ics932s401.o | ||
17 | obj-$(CONFIG_TC1100_WMI) += tc1100-wmi.o | 18 | obj-$(CONFIG_TC1100_WMI) += tc1100-wmi.o |
18 | obj-$(CONFIG_LKDTM) += lkdtm.o | 19 | obj-$(CONFIG_LKDTM) += lkdtm.o |
19 | obj-$(CONFIG_TIFM_CORE) += tifm_core.o | 20 | obj-$(CONFIG_TIFM_CORE) += tifm_core.o |
@@ -31,3 +32,4 @@ obj-$(CONFIG_KGDB_TESTS) += kgdbts.o | |||
31 | obj-$(CONFIG_SGI_XP) += sgi-xp/ | 32 | obj-$(CONFIG_SGI_XP) += sgi-xp/ |
32 | obj-$(CONFIG_SGI_GRU) += sgi-gru/ | 33 | obj-$(CONFIG_SGI_GRU) += sgi-gru/ |
33 | obj-$(CONFIG_HP_ILO) += hpilo.o | 34 | obj-$(CONFIG_HP_ILO) += hpilo.o |
35 | obj-$(CONFIG_C2PORT) += c2port/ | ||
diff --git a/drivers/misc/acer-wmi.c b/drivers/misc/acer-wmi.c index 0532a2de2ce4..94c9f911824e 100644 --- a/drivers/misc/acer-wmi.c +++ b/drivers/misc/acer-wmi.c | |||
@@ -1297,6 +1297,12 @@ static int __init acer_wmi_init(void) | |||
1297 | 1297 | ||
1298 | set_quirks(); | 1298 | set_quirks(); |
1299 | 1299 | ||
1300 | if (!acpi_video_backlight_support() && has_cap(ACER_CAP_BRIGHTNESS)) { | ||
1301 | interface->capability &= ~ACER_CAP_BRIGHTNESS; | ||
1302 | printk(ACER_INFO "Brightness must be controlled by " | ||
1303 | "generic video driver\n"); | ||
1304 | } | ||
1305 | |||
1300 | if (platform_driver_register(&acer_platform_driver)) { | 1306 | if (platform_driver_register(&acer_platform_driver)) { |
1301 | printk(ACER_ERR "Unable to register platform driver.\n"); | 1307 | printk(ACER_ERR "Unable to register platform driver.\n"); |
1302 | goto error_platform_register; | 1308 | goto error_platform_register; |
diff --git a/drivers/misc/asus-laptop.c b/drivers/misc/asus-laptop.c index a9d5228724a6..8fb8b3591048 100644 --- a/drivers/misc/asus-laptop.c +++ b/drivers/misc/asus-laptop.c | |||
@@ -1208,9 +1208,13 @@ static int __init asus_laptop_init(void) | |||
1208 | 1208 | ||
1209 | dev = acpi_get_physical_device(hotk->device->handle); | 1209 | dev = acpi_get_physical_device(hotk->device->handle); |
1210 | 1210 | ||
1211 | result = asus_backlight_init(dev); | 1211 | if (!acpi_video_backlight_support()) { |
1212 | if (result) | 1212 | result = asus_backlight_init(dev); |
1213 | goto fail_backlight; | 1213 | if (result) |
1214 | goto fail_backlight; | ||
1215 | } else | ||
1216 | printk(ASUS_INFO "Brightness ignored, must be controlled by " | ||
1217 | "ACPI video driver\n"); | ||
1214 | 1218 | ||
1215 | result = asus_led_init(dev); | 1219 | result = asus_led_init(dev); |
1216 | if (result) | 1220 | if (result) |
diff --git a/drivers/misc/c2port/Kconfig b/drivers/misc/c2port/Kconfig new file mode 100644 index 000000000000..e46af9a5810d --- /dev/null +++ b/drivers/misc/c2port/Kconfig | |||
@@ -0,0 +1,35 @@ | |||
1 | # | ||
2 | # C2 port devices | ||
3 | # | ||
4 | |||
5 | menuconfig C2PORT | ||
6 | tristate "Silicon Labs C2 port support (EXPERIMENTAL)" | ||
7 | depends on EXPERIMENTAL | ||
8 | default no | ||
9 | help | ||
10 | This option enables support for Silicon Labs C2 port used to | ||
11 | program Silicon micro controller chips (and other 8051 compatible). | ||
12 | |||
13 | If your board have no such micro controllers you don't need this | ||
14 | interface at all. | ||
15 | |||
16 | To compile this driver as a module, choose M here: the module will | ||
17 | be called c2port_core. Note that you also need a client module | ||
18 | usually called c2port-*. | ||
19 | |||
20 | If you are not sure, say N here. | ||
21 | |||
22 | if C2PORT | ||
23 | |||
24 | config C2PORT_DURAMAR_2150 | ||
25 | tristate "C2 port support for Eurotech's Duramar 2150 (EXPERIMENTAL)" | ||
26 | depends on X86 && C2PORT | ||
27 | default no | ||
28 | help | ||
29 | This option enables C2 support for the Eurotech's Duramar 2150 | ||
30 | on board micro controller. | ||
31 | |||
32 | To compile this driver as a module, choose M here: the module will | ||
33 | be called c2port-duramar2150. | ||
34 | |||
35 | endif # C2PORT | ||
diff --git a/drivers/misc/c2port/Makefile b/drivers/misc/c2port/Makefile new file mode 100644 index 000000000000..3b2cf43d60f5 --- /dev/null +++ b/drivers/misc/c2port/Makefile | |||
@@ -0,0 +1,3 @@ | |||
1 | obj-$(CONFIG_C2PORT) += core.o | ||
2 | |||
3 | obj-$(CONFIG_C2PORT_DURAMAR_2150) += c2port-duramar2150.o | ||
diff --git a/drivers/misc/c2port/c2port-duramar2150.c b/drivers/misc/c2port/c2port-duramar2150.c new file mode 100644 index 000000000000..338dcc121507 --- /dev/null +++ b/drivers/misc/c2port/c2port-duramar2150.c | |||
@@ -0,0 +1,158 @@ | |||
1 | /* | ||
2 | * Silicon Labs C2 port Linux support for Eurotech Duramar 2150 | ||
3 | * | ||
4 | * Copyright (c) 2008 Rodolfo Giometti <giometti@linux.it> | ||
5 | * Copyright (c) 2008 Eurotech S.p.A. <info@eurotech.it> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify it | ||
8 | * under the terms of the GNU General Public License version 2 as published by | ||
9 | * the Free Software Foundation | ||
10 | */ | ||
11 | |||
12 | #include <linux/errno.h> | ||
13 | #include <linux/init.h> | ||
14 | #include <linux/kernel.h> | ||
15 | #include <linux/module.h> | ||
16 | #include <linux/delay.h> | ||
17 | #include <linux/io.h> | ||
18 | #include <linux/c2port.h> | ||
19 | |||
20 | #define DATA_PORT 0x325 | ||
21 | #define DIR_PORT 0x326 | ||
22 | #define C2D (1 << 0) | ||
23 | #define C2CK (1 << 1) | ||
24 | |||
25 | static DEFINE_MUTEX(update_lock); | ||
26 | |||
27 | /* | ||
28 | * C2 port operations | ||
29 | */ | ||
30 | |||
31 | static void duramar2150_c2port_access(struct c2port_device *dev, int status) | ||
32 | { | ||
33 | u8 v; | ||
34 | |||
35 | mutex_lock(&update_lock); | ||
36 | |||
37 | v = inb(DIR_PORT); | ||
38 | |||
39 | /* 0 = input, 1 = output */ | ||
40 | if (status) | ||
41 | outb(v | (C2D | C2CK), DIR_PORT); | ||
42 | else | ||
43 | /* When access is "off" is important that both lines are set | ||
44 | * as inputs or hi-impedence */ | ||
45 | outb(v & ~(C2D | C2CK), DIR_PORT); | ||
46 | |||
47 | mutex_unlock(&update_lock); | ||
48 | } | ||
49 | |||
50 | static void duramar2150_c2port_c2d_dir(struct c2port_device *dev, int dir) | ||
51 | { | ||
52 | u8 v; | ||
53 | |||
54 | mutex_lock(&update_lock); | ||
55 | |||
56 | v = inb(DIR_PORT); | ||
57 | |||
58 | if (dir) | ||
59 | outb(v & ~C2D, DIR_PORT); | ||
60 | else | ||
61 | outb(v | C2D, DIR_PORT); | ||
62 | |||
63 | mutex_unlock(&update_lock); | ||
64 | } | ||
65 | |||
66 | static int duramar2150_c2port_c2d_get(struct c2port_device *dev) | ||
67 | { | ||
68 | return inb(DATA_PORT) & C2D; | ||
69 | } | ||
70 | |||
71 | static void duramar2150_c2port_c2d_set(struct c2port_device *dev, int status) | ||
72 | { | ||
73 | u8 v; | ||
74 | |||
75 | mutex_lock(&update_lock); | ||
76 | |||
77 | v = inb(DATA_PORT); | ||
78 | |||
79 | if (status) | ||
80 | outb(v | C2D, DATA_PORT); | ||
81 | else | ||
82 | outb(v & ~C2D, DATA_PORT); | ||
83 | |||
84 | mutex_unlock(&update_lock); | ||
85 | } | ||
86 | |||
87 | static void duramar2150_c2port_c2ck_set(struct c2port_device *dev, int status) | ||
88 | { | ||
89 | u8 v; | ||
90 | |||
91 | mutex_lock(&update_lock); | ||
92 | |||
93 | v = inb(DATA_PORT); | ||
94 | |||
95 | if (status) | ||
96 | outb(v | C2CK, DATA_PORT); | ||
97 | else | ||
98 | outb(v & ~C2CK, DATA_PORT); | ||
99 | |||
100 | mutex_unlock(&update_lock); | ||
101 | } | ||
102 | |||
103 | static struct c2port_ops duramar2150_c2port_ops = { | ||
104 | .block_size = 512, /* bytes */ | ||
105 | .blocks_num = 30, /* total flash size: 15360 bytes */ | ||
106 | |||
107 | .access = duramar2150_c2port_access, | ||
108 | .c2d_dir = duramar2150_c2port_c2d_dir, | ||
109 | .c2d_get = duramar2150_c2port_c2d_get, | ||
110 | .c2d_set = duramar2150_c2port_c2d_set, | ||
111 | .c2ck_set = duramar2150_c2port_c2ck_set, | ||
112 | }; | ||
113 | |||
114 | static struct c2port_device *duramar2150_c2port_dev; | ||
115 | |||
116 | /* | ||
117 | * Module stuff | ||
118 | */ | ||
119 | |||
120 | static int __init duramar2150_c2port_init(void) | ||
121 | { | ||
122 | struct resource *res; | ||
123 | int ret = 0; | ||
124 | |||
125 | res = request_region(0x325, 2, "c2port"); | ||
126 | if (!res) | ||
127 | return -EBUSY; | ||
128 | |||
129 | duramar2150_c2port_dev = c2port_device_register("uc", | ||
130 | &duramar2150_c2port_ops, NULL); | ||
131 | if (!duramar2150_c2port_dev) { | ||
132 | ret = -ENODEV; | ||
133 | goto free_region; | ||
134 | } | ||
135 | |||
136 | return 0; | ||
137 | |||
138 | free_region: | ||
139 | release_region(0x325, 2); | ||
140 | return ret; | ||
141 | } | ||
142 | |||
143 | static void __exit duramar2150_c2port_exit(void) | ||
144 | { | ||
145 | /* Setup the GPIOs as input by default (access = 0) */ | ||
146 | duramar2150_c2port_access(duramar2150_c2port_dev, 0); | ||
147 | |||
148 | c2port_device_unregister(duramar2150_c2port_dev); | ||
149 | |||
150 | release_region(0x325, 2); | ||
151 | } | ||
152 | |||
153 | module_init(duramar2150_c2port_init); | ||
154 | module_exit(duramar2150_c2port_exit); | ||
155 | |||
156 | MODULE_AUTHOR("Rodolfo Giometti <giometti@linux.it>"); | ||
157 | MODULE_DESCRIPTION("Silicon Labs C2 port Linux support for Duramar 2150"); | ||
158 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/misc/c2port/core.c b/drivers/misc/c2port/core.c new file mode 100644 index 000000000000..0207dd59090d --- /dev/null +++ b/drivers/misc/c2port/core.c | |||
@@ -0,0 +1,1003 @@ | |||
1 | /* | ||
2 | * Silicon Labs C2 port core Linux support | ||
3 | * | ||
4 | * Copyright (c) 2007 Rodolfo Giometti <giometti@linux.it> | ||
5 | * Copyright (c) 2007 Eurotech S.p.A. <info@eurotech.it> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify it | ||
8 | * under the terms of the GNU General Public License version 2 as published by | ||
9 | * the Free Software Foundation | ||
10 | */ | ||
11 | |||
12 | #include <linux/module.h> | ||
13 | #include <linux/init.h> | ||
14 | #include <linux/device.h> | ||
15 | #include <linux/errno.h> | ||
16 | #include <linux/err.h> | ||
17 | #include <linux/kernel.h> | ||
18 | #include <linux/ctype.h> | ||
19 | #include <linux/delay.h> | ||
20 | #include <linux/idr.h> | ||
21 | #include <linux/sched.h> | ||
22 | |||
23 | #include <linux/c2port.h> | ||
24 | |||
25 | #define DRIVER_NAME "c2port" | ||
26 | #define DRIVER_VERSION "0.51.0" | ||
27 | |||
28 | static DEFINE_SPINLOCK(c2port_idr_lock); | ||
29 | static DEFINE_IDR(c2port_idr); | ||
30 | |||
31 | /* | ||
32 | * Local variables | ||
33 | */ | ||
34 | |||
35 | static struct class *c2port_class; | ||
36 | |||
37 | /* | ||
38 | * C2 registers & commands defines | ||
39 | */ | ||
40 | |||
41 | /* C2 registers */ | ||
42 | #define C2PORT_DEVICEID 0x00 | ||
43 | #define C2PORT_REVID 0x01 | ||
44 | #define C2PORT_FPCTL 0x02 | ||
45 | #define C2PORT_FPDAT 0xB4 | ||
46 | |||
47 | /* C2 interface commands */ | ||
48 | #define C2PORT_GET_VERSION 0x01 | ||
49 | #define C2PORT_DEVICE_ERASE 0x03 | ||
50 | #define C2PORT_BLOCK_READ 0x06 | ||
51 | #define C2PORT_BLOCK_WRITE 0x07 | ||
52 | #define C2PORT_PAGE_ERASE 0x08 | ||
53 | |||
54 | /* C2 status return codes */ | ||
55 | #define C2PORT_INVALID_COMMAND 0x00 | ||
56 | #define C2PORT_COMMAND_FAILED 0x02 | ||
57 | #define C2PORT_COMMAND_OK 0x0d | ||
58 | |||
59 | /* | ||
60 | * C2 port low level signal managements | ||
61 | */ | ||
62 | |||
63 | static void c2port_reset(struct c2port_device *dev) | ||
64 | { | ||
65 | struct c2port_ops *ops = dev->ops; | ||
66 | |||
67 | /* To reset the device we have to keep clock line low for at least | ||
68 | * 20us. | ||
69 | */ | ||
70 | local_irq_disable(); | ||
71 | ops->c2ck_set(dev, 0); | ||
72 | udelay(25); | ||
73 | ops->c2ck_set(dev, 1); | ||
74 | local_irq_enable(); | ||
75 | |||
76 | udelay(1); | ||
77 | } | ||
78 | |||
79 | static void c2port_strobe_ck(struct c2port_device *dev) | ||
80 | { | ||
81 | struct c2port_ops *ops = dev->ops; | ||
82 | |||
83 | /* During hi-low-hi transition we disable local IRQs to avoid | ||
84 | * interructions since C2 port specification says that it must be | ||
85 | * shorter than 5us, otherwise the microcontroller may consider | ||
86 | * it as a reset signal! | ||
87 | */ | ||
88 | local_irq_disable(); | ||
89 | ops->c2ck_set(dev, 0); | ||
90 | udelay(1); | ||
91 | ops->c2ck_set(dev, 1); | ||
92 | local_irq_enable(); | ||
93 | |||
94 | udelay(1); | ||
95 | } | ||
96 | |||
97 | /* | ||
98 | * C2 port basic functions | ||
99 | */ | ||
100 | |||
101 | static void c2port_write_ar(struct c2port_device *dev, u8 addr) | ||
102 | { | ||
103 | struct c2port_ops *ops = dev->ops; | ||
104 | int i; | ||
105 | |||
106 | /* START field */ | ||
107 | c2port_strobe_ck(dev); | ||
108 | |||
109 | /* INS field (11b, LSB first) */ | ||
110 | ops->c2d_dir(dev, 0); | ||
111 | ops->c2d_set(dev, 1); | ||
112 | c2port_strobe_ck(dev); | ||
113 | ops->c2d_set(dev, 1); | ||
114 | c2port_strobe_ck(dev); | ||
115 | |||
116 | /* ADDRESS field */ | ||
117 | for (i = 0; i < 8; i++) { | ||
118 | ops->c2d_set(dev, addr & 0x01); | ||
119 | c2port_strobe_ck(dev); | ||
120 | |||
121 | addr >>= 1; | ||
122 | } | ||
123 | |||
124 | /* STOP field */ | ||
125 | ops->c2d_dir(dev, 1); | ||
126 | c2port_strobe_ck(dev); | ||
127 | } | ||
128 | |||
129 | static int c2port_read_ar(struct c2port_device *dev, u8 *addr) | ||
130 | { | ||
131 | struct c2port_ops *ops = dev->ops; | ||
132 | int i; | ||
133 | |||
134 | /* START field */ | ||
135 | c2port_strobe_ck(dev); | ||
136 | |||
137 | /* INS field (10b, LSB first) */ | ||
138 | ops->c2d_dir(dev, 0); | ||
139 | ops->c2d_set(dev, 0); | ||
140 | c2port_strobe_ck(dev); | ||
141 | ops->c2d_set(dev, 1); | ||
142 | c2port_strobe_ck(dev); | ||
143 | |||
144 | /* ADDRESS field */ | ||
145 | ops->c2d_dir(dev, 1); | ||
146 | *addr = 0; | ||
147 | for (i = 0; i < 8; i++) { | ||
148 | *addr >>= 1; /* shift in 8-bit ADDRESS field LSB first */ | ||
149 | |||
150 | c2port_strobe_ck(dev); | ||
151 | if (ops->c2d_get(dev)) | ||
152 | *addr |= 0x80; | ||
153 | } | ||
154 | |||
155 | /* STOP field */ | ||
156 | c2port_strobe_ck(dev); | ||
157 | |||
158 | return 0; | ||
159 | } | ||
160 | |||
161 | static int c2port_write_dr(struct c2port_device *dev, u8 data) | ||
162 | { | ||
163 | struct c2port_ops *ops = dev->ops; | ||
164 | int timeout, i; | ||
165 | |||
166 | /* START field */ | ||
167 | c2port_strobe_ck(dev); | ||
168 | |||
169 | /* INS field (01b, LSB first) */ | ||
170 | ops->c2d_dir(dev, 0); | ||
171 | ops->c2d_set(dev, 1); | ||
172 | c2port_strobe_ck(dev); | ||
173 | ops->c2d_set(dev, 0); | ||
174 | c2port_strobe_ck(dev); | ||
175 | |||
176 | /* LENGTH field (00b, LSB first -> 1 byte) */ | ||
177 | ops->c2d_set(dev, 0); | ||
178 | c2port_strobe_ck(dev); | ||
179 | ops->c2d_set(dev, 0); | ||
180 | c2port_strobe_ck(dev); | ||
181 | |||
182 | /* DATA field */ | ||
183 | for (i = 0; i < 8; i++) { | ||
184 | ops->c2d_set(dev, data & 0x01); | ||
185 | c2port_strobe_ck(dev); | ||
186 | |||
187 | data >>= 1; | ||
188 | } | ||
189 | |||
190 | /* WAIT field */ | ||
191 | ops->c2d_dir(dev, 1); | ||
192 | timeout = 20; | ||
193 | do { | ||
194 | c2port_strobe_ck(dev); | ||
195 | if (ops->c2d_get(dev)) | ||
196 | break; | ||
197 | |||
198 | udelay(1); | ||
199 | } while (--timeout > 0); | ||
200 | if (timeout == 0) | ||
201 | return -EIO; | ||
202 | |||
203 | /* STOP field */ | ||
204 | c2port_strobe_ck(dev); | ||
205 | |||
206 | return 0; | ||
207 | } | ||
208 | |||
209 | static int c2port_read_dr(struct c2port_device *dev, u8 *data) | ||
210 | { | ||
211 | struct c2port_ops *ops = dev->ops; | ||
212 | int timeout, i; | ||
213 | |||
214 | /* START field */ | ||
215 | c2port_strobe_ck(dev); | ||
216 | |||
217 | /* INS field (00b, LSB first) */ | ||
218 | ops->c2d_dir(dev, 0); | ||
219 | ops->c2d_set(dev, 0); | ||
220 | c2port_strobe_ck(dev); | ||
221 | ops->c2d_set(dev, 0); | ||
222 | c2port_strobe_ck(dev); | ||
223 | |||
224 | /* LENGTH field (00b, LSB first -> 1 byte) */ | ||
225 | ops->c2d_set(dev, 0); | ||
226 | c2port_strobe_ck(dev); | ||
227 | ops->c2d_set(dev, 0); | ||
228 | c2port_strobe_ck(dev); | ||
229 | |||
230 | /* WAIT field */ | ||
231 | ops->c2d_dir(dev, 1); | ||
232 | timeout = 20; | ||
233 | do { | ||
234 | c2port_strobe_ck(dev); | ||
235 | if (ops->c2d_get(dev)) | ||
236 | break; | ||
237 | |||
238 | udelay(1); | ||
239 | } while (--timeout > 0); | ||
240 | if (timeout == 0) | ||
241 | return -EIO; | ||
242 | |||
243 | /* DATA field */ | ||
244 | *data = 0; | ||
245 | for (i = 0; i < 8; i++) { | ||
246 | *data >>= 1; /* shift in 8-bit DATA field LSB first */ | ||
247 | |||
248 | c2port_strobe_ck(dev); | ||
249 | if (ops->c2d_get(dev)) | ||
250 | *data |= 0x80; | ||
251 | } | ||
252 | |||
253 | /* STOP field */ | ||
254 | c2port_strobe_ck(dev); | ||
255 | |||
256 | return 0; | ||
257 | } | ||
258 | |||
259 | static int c2port_poll_in_busy(struct c2port_device *dev) | ||
260 | { | ||
261 | u8 addr; | ||
262 | int ret, timeout = 20; | ||
263 | |||
264 | do { | ||
265 | ret = (c2port_read_ar(dev, &addr)); | ||
266 | if (ret < 0) | ||
267 | return -EIO; | ||
268 | |||
269 | if (!(addr & 0x02)) | ||
270 | break; | ||
271 | |||
272 | udelay(1); | ||
273 | } while (--timeout > 0); | ||
274 | if (timeout == 0) | ||
275 | return -EIO; | ||
276 | |||
277 | return 0; | ||
278 | } | ||
279 | |||
280 | static int c2port_poll_out_ready(struct c2port_device *dev) | ||
281 | { | ||
282 | u8 addr; | ||
283 | int ret, timeout = 10000; /* erase flash needs long time... */ | ||
284 | |||
285 | do { | ||
286 | ret = (c2port_read_ar(dev, &addr)); | ||
287 | if (ret < 0) | ||
288 | return -EIO; | ||
289 | |||
290 | if (addr & 0x01) | ||
291 | break; | ||
292 | |||
293 | udelay(1); | ||
294 | } while (--timeout > 0); | ||
295 | if (timeout == 0) | ||
296 | return -EIO; | ||
297 | |||
298 | return 0; | ||
299 | } | ||
300 | |||
301 | /* | ||
302 | * sysfs methods | ||
303 | */ | ||
304 | |||
305 | static ssize_t c2port_show_name(struct device *dev, | ||
306 | struct device_attribute *attr, char *buf) | ||
307 | { | ||
308 | struct c2port_device *c2dev = dev_get_drvdata(dev); | ||
309 | |||
310 | return sprintf(buf, "%s\n", c2dev->name); | ||
311 | } | ||
312 | |||
313 | static ssize_t c2port_show_flash_blocks_num(struct device *dev, | ||
314 | struct device_attribute *attr, char *buf) | ||
315 | { | ||
316 | struct c2port_device *c2dev = dev_get_drvdata(dev); | ||
317 | struct c2port_ops *ops = c2dev->ops; | ||
318 | |||
319 | return sprintf(buf, "%d\n", ops->blocks_num); | ||
320 | } | ||
321 | |||
322 | static ssize_t c2port_show_flash_block_size(struct device *dev, | ||
323 | struct device_attribute *attr, char *buf) | ||
324 | { | ||
325 | struct c2port_device *c2dev = dev_get_drvdata(dev); | ||
326 | struct c2port_ops *ops = c2dev->ops; | ||
327 | |||
328 | return sprintf(buf, "%d\n", ops->block_size); | ||
329 | } | ||
330 | |||
331 | static ssize_t c2port_show_flash_size(struct device *dev, | ||
332 | struct device_attribute *attr, char *buf) | ||
333 | { | ||
334 | struct c2port_device *c2dev = dev_get_drvdata(dev); | ||
335 | struct c2port_ops *ops = c2dev->ops; | ||
336 | |||
337 | return sprintf(buf, "%d\n", ops->blocks_num * ops->block_size); | ||
338 | } | ||
339 | |||
340 | static ssize_t c2port_show_access(struct device *dev, | ||
341 | struct device_attribute *attr, char *buf) | ||
342 | { | ||
343 | struct c2port_device *c2dev = dev_get_drvdata(dev); | ||
344 | |||
345 | return sprintf(buf, "%d\n", c2dev->access); | ||
346 | } | ||
347 | |||
348 | static ssize_t c2port_store_access(struct device *dev, | ||
349 | struct device_attribute *attr, | ||
350 | const char *buf, size_t count) | ||
351 | { | ||
352 | struct c2port_device *c2dev = dev_get_drvdata(dev); | ||
353 | struct c2port_ops *ops = c2dev->ops; | ||
354 | int status, ret; | ||
355 | |||
356 | ret = sscanf(buf, "%d", &status); | ||
357 | if (ret != 1) | ||
358 | return -EINVAL; | ||
359 | |||
360 | mutex_lock(&c2dev->mutex); | ||
361 | |||
362 | c2dev->access = !!status; | ||
363 | |||
364 | /* If access is "on" clock should be HIGH _before_ setting the line | ||
365 | * as output and data line should be set as INPUT anyway */ | ||
366 | if (c2dev->access) | ||
367 | ops->c2ck_set(c2dev, 1); | ||
368 | ops->access(c2dev, c2dev->access); | ||
369 | if (c2dev->access) | ||
370 | ops->c2d_dir(c2dev, 1); | ||
371 | |||
372 | mutex_unlock(&c2dev->mutex); | ||
373 | |||
374 | return count; | ||
375 | } | ||
376 | |||
377 | static ssize_t c2port_store_reset(struct device *dev, | ||
378 | struct device_attribute *attr, | ||
379 | const char *buf, size_t count) | ||
380 | { | ||
381 | struct c2port_device *c2dev = dev_get_drvdata(dev); | ||
382 | |||
383 | /* Check the device access status */ | ||
384 | if (!c2dev->access) | ||
385 | return -EBUSY; | ||
386 | |||
387 | mutex_lock(&c2dev->mutex); | ||
388 | |||
389 | c2port_reset(c2dev); | ||
390 | c2dev->flash_access = 0; | ||
391 | |||
392 | mutex_unlock(&c2dev->mutex); | ||
393 | |||
394 | return count; | ||
395 | } | ||
396 | |||
397 | static ssize_t __c2port_show_dev_id(struct c2port_device *dev, char *buf) | ||
398 | { | ||
399 | u8 data; | ||
400 | int ret; | ||
401 | |||
402 | /* Select DEVICEID register for C2 data register accesses */ | ||
403 | c2port_write_ar(dev, C2PORT_DEVICEID); | ||
404 | |||
405 | /* Read and return the device ID register */ | ||
406 | ret = c2port_read_dr(dev, &data); | ||
407 | if (ret < 0) | ||
408 | return ret; | ||
409 | |||
410 | return sprintf(buf, "%d\n", data); | ||
411 | } | ||
412 | |||
413 | static ssize_t c2port_show_dev_id(struct device *dev, | ||
414 | struct device_attribute *attr, char *buf) | ||
415 | { | ||
416 | struct c2port_device *c2dev = dev_get_drvdata(dev); | ||
417 | ssize_t ret; | ||
418 | |||
419 | /* Check the device access status */ | ||
420 | if (!c2dev->access) | ||
421 | return -EBUSY; | ||
422 | |||
423 | mutex_lock(&c2dev->mutex); | ||
424 | ret = __c2port_show_dev_id(c2dev, buf); | ||
425 | mutex_unlock(&c2dev->mutex); | ||
426 | |||
427 | if (ret < 0) | ||
428 | dev_err(dev, "cannot read from %s\n", c2dev->name); | ||
429 | |||
430 | return ret; | ||
431 | } | ||
432 | |||
433 | static ssize_t __c2port_show_rev_id(struct c2port_device *dev, char *buf) | ||
434 | { | ||
435 | u8 data; | ||
436 | int ret; | ||
437 | |||
438 | /* Select REVID register for C2 data register accesses */ | ||
439 | c2port_write_ar(dev, C2PORT_REVID); | ||
440 | |||
441 | /* Read and return the revision ID register */ | ||
442 | ret = c2port_read_dr(dev, &data); | ||
443 | if (ret < 0) | ||
444 | return ret; | ||
445 | |||
446 | return sprintf(buf, "%d\n", data); | ||
447 | } | ||
448 | |||
449 | static ssize_t c2port_show_rev_id(struct device *dev, | ||
450 | struct device_attribute *attr, char *buf) | ||
451 | { | ||
452 | struct c2port_device *c2dev = dev_get_drvdata(dev); | ||
453 | ssize_t ret; | ||
454 | |||
455 | /* Check the device access status */ | ||
456 | if (!c2dev->access) | ||
457 | return -EBUSY; | ||
458 | |||
459 | mutex_lock(&c2dev->mutex); | ||
460 | ret = __c2port_show_rev_id(c2dev, buf); | ||
461 | mutex_unlock(&c2dev->mutex); | ||
462 | |||
463 | if (ret < 0) | ||
464 | dev_err(c2dev->dev, "cannot read from %s\n", c2dev->name); | ||
465 | |||
466 | return ret; | ||
467 | } | ||
468 | |||
469 | static ssize_t c2port_show_flash_access(struct device *dev, | ||
470 | struct device_attribute *attr, char *buf) | ||
471 | { | ||
472 | struct c2port_device *c2dev = dev_get_drvdata(dev); | ||
473 | |||
474 | return sprintf(buf, "%d\n", c2dev->flash_access); | ||
475 | } | ||
476 | |||
477 | static ssize_t __c2port_store_flash_access(struct c2port_device *dev, | ||
478 | int status) | ||
479 | { | ||
480 | int ret; | ||
481 | |||
482 | /* Check the device access status */ | ||
483 | if (!dev->access) | ||
484 | return -EBUSY; | ||
485 | |||
486 | dev->flash_access = !!status; | ||
487 | |||
488 | /* If flash_access is off we have nothing to do... */ | ||
489 | if (dev->flash_access == 0) | ||
490 | return 0; | ||
491 | |||
492 | /* Target the C2 flash programming control register for C2 data | ||
493 | * register access */ | ||
494 | c2port_write_ar(dev, C2PORT_FPCTL); | ||
495 | |||
496 | /* Write the first keycode to enable C2 Flash programming */ | ||
497 | ret = c2port_write_dr(dev, 0x02); | ||
498 | if (ret < 0) | ||
499 | return ret; | ||
500 | |||
501 | /* Write the second keycode to enable C2 Flash programming */ | ||
502 | ret = c2port_write_dr(dev, 0x01); | ||
503 | if (ret < 0) | ||
504 | return ret; | ||
505 | |||
506 | /* Delay for at least 20ms to ensure the target is ready for | ||
507 | * C2 flash programming */ | ||
508 | mdelay(25); | ||
509 | |||
510 | return 0; | ||
511 | } | ||
512 | |||
513 | static ssize_t c2port_store_flash_access(struct device *dev, | ||
514 | struct device_attribute *attr, | ||
515 | const char *buf, size_t count) | ||
516 | { | ||
517 | struct c2port_device *c2dev = dev_get_drvdata(dev); | ||
518 | int status; | ||
519 | ssize_t ret; | ||
520 | |||
521 | ret = sscanf(buf, "%d", &status); | ||
522 | if (ret != 1) | ||
523 | return -EINVAL; | ||
524 | |||
525 | mutex_lock(&c2dev->mutex); | ||
526 | ret = __c2port_store_flash_access(c2dev, status); | ||
527 | mutex_unlock(&c2dev->mutex); | ||
528 | |||
529 | if (ret < 0) { | ||
530 | dev_err(c2dev->dev, "cannot enable %s flash programming\n", | ||
531 | c2dev->name); | ||
532 | return ret; | ||
533 | } | ||
534 | |||
535 | return count; | ||
536 | } | ||
537 | |||
538 | static ssize_t __c2port_write_flash_erase(struct c2port_device *dev) | ||
539 | { | ||
540 | u8 status; | ||
541 | int ret; | ||
542 | |||
543 | /* Target the C2 flash programming data register for C2 data register | ||
544 | * access. | ||
545 | */ | ||
546 | c2port_write_ar(dev, C2PORT_FPDAT); | ||
547 | |||
548 | /* Send device erase command */ | ||
549 | c2port_write_dr(dev, C2PORT_DEVICE_ERASE); | ||
550 | |||
551 | /* Wait for input acknowledge */ | ||
552 | ret = c2port_poll_in_busy(dev); | ||
553 | if (ret < 0) | ||
554 | return ret; | ||
555 | |||
556 | /* Should check status before starting FLASH access sequence */ | ||
557 | |||
558 | /* Wait for status information */ | ||
559 | ret = c2port_poll_out_ready(dev); | ||
560 | if (ret < 0) | ||
561 | return ret; | ||
562 | |||
563 | /* Read flash programming interface status */ | ||
564 | ret = c2port_read_dr(dev, &status); | ||
565 | if (ret < 0) | ||
566 | return ret; | ||
567 | if (status != C2PORT_COMMAND_OK) | ||
568 | return -EBUSY; | ||
569 | |||
570 | /* Send a three-byte arming sequence to enable the device erase. | ||
571 | * If the sequence is not received correctly, the command will be | ||
572 | * ignored. | ||
573 | * Sequence is: 0xde, 0xad, 0xa5. | ||
574 | */ | ||
575 | c2port_write_dr(dev, 0xde); | ||
576 | ret = c2port_poll_in_busy(dev); | ||
577 | if (ret < 0) | ||
578 | return ret; | ||
579 | c2port_write_dr(dev, 0xad); | ||
580 | ret = c2port_poll_in_busy(dev); | ||
581 | if (ret < 0) | ||
582 | return ret; | ||
583 | c2port_write_dr(dev, 0xa5); | ||
584 | ret = c2port_poll_in_busy(dev); | ||
585 | if (ret < 0) | ||
586 | return ret; | ||
587 | |||
588 | ret = c2port_poll_out_ready(dev); | ||
589 | if (ret < 0) | ||
590 | return ret; | ||
591 | |||
592 | return 0; | ||
593 | } | ||
594 | |||
595 | static ssize_t c2port_store_flash_erase(struct device *dev, | ||
596 | struct device_attribute *attr, | ||
597 | const char *buf, size_t count) | ||
598 | { | ||
599 | struct c2port_device *c2dev = dev_get_drvdata(dev); | ||
600 | int ret; | ||
601 | |||
602 | /* Check the device and flash access status */ | ||
603 | if (!c2dev->access || !c2dev->flash_access) | ||
604 | return -EBUSY; | ||
605 | |||
606 | mutex_lock(&c2dev->mutex); | ||
607 | ret = __c2port_write_flash_erase(c2dev); | ||
608 | mutex_unlock(&c2dev->mutex); | ||
609 | |||
610 | if (ret < 0) { | ||
611 | dev_err(c2dev->dev, "cannot erase %s flash\n", c2dev->name); | ||
612 | return ret; | ||
613 | } | ||
614 | |||
615 | return count; | ||
616 | } | ||
617 | |||
618 | static ssize_t __c2port_read_flash_data(struct c2port_device *dev, | ||
619 | char *buffer, loff_t offset, size_t count) | ||
620 | { | ||
621 | struct c2port_ops *ops = dev->ops; | ||
622 | u8 status, nread = 128; | ||
623 | int i, ret; | ||
624 | |||
625 | /* Check for flash end */ | ||
626 | if (offset >= ops->block_size * ops->blocks_num) | ||
627 | return 0; | ||
628 | |||
629 | if (ops->block_size * ops->blocks_num - offset < nread) | ||
630 | nread = ops->block_size * ops->blocks_num - offset; | ||
631 | if (count < nread) | ||
632 | nread = count; | ||
633 | if (nread == 0) | ||
634 | return nread; | ||
635 | |||
636 | /* Target the C2 flash programming data register for C2 data register | ||
637 | * access */ | ||
638 | c2port_write_ar(dev, C2PORT_FPDAT); | ||
639 | |||
640 | /* Send flash block read command */ | ||
641 | c2port_write_dr(dev, C2PORT_BLOCK_READ); | ||
642 | |||
643 | /* Wait for input acknowledge */ | ||
644 | ret = c2port_poll_in_busy(dev); | ||
645 | if (ret < 0) | ||
646 | return ret; | ||
647 | |||
648 | /* Should check status before starting FLASH access sequence */ | ||
649 | |||
650 | /* Wait for status information */ | ||
651 | ret = c2port_poll_out_ready(dev); | ||
652 | if (ret < 0) | ||
653 | return ret; | ||
654 | |||
655 | /* Read flash programming interface status */ | ||
656 | ret = c2port_read_dr(dev, &status); | ||
657 | if (ret < 0) | ||
658 | return ret; | ||
659 | if (status != C2PORT_COMMAND_OK) | ||
660 | return -EBUSY; | ||
661 | |||
662 | /* Send address high byte */ | ||
663 | c2port_write_dr(dev, offset >> 8); | ||
664 | ret = c2port_poll_in_busy(dev); | ||
665 | if (ret < 0) | ||
666 | return ret; | ||
667 | |||
668 | /* Send address low byte */ | ||
669 | c2port_write_dr(dev, offset & 0x00ff); | ||
670 | ret = c2port_poll_in_busy(dev); | ||
671 | if (ret < 0) | ||
672 | return ret; | ||
673 | |||
674 | /* Send address block size */ | ||
675 | c2port_write_dr(dev, nread); | ||
676 | ret = c2port_poll_in_busy(dev); | ||
677 | if (ret < 0) | ||
678 | return ret; | ||
679 | |||
680 | /* Should check status before reading FLASH block */ | ||
681 | |||
682 | /* Wait for status information */ | ||
683 | ret = c2port_poll_out_ready(dev); | ||
684 | if (ret < 0) | ||
685 | return ret; | ||
686 | |||
687 | /* Read flash programming interface status */ | ||
688 | ret = c2port_read_dr(dev, &status); | ||
689 | if (ret < 0) | ||
690 | return ret; | ||
691 | if (status != C2PORT_COMMAND_OK) | ||
692 | return -EBUSY; | ||
693 | |||
694 | /* Read flash block */ | ||
695 | for (i = 0; i < nread; i++) { | ||
696 | ret = c2port_poll_out_ready(dev); | ||
697 | if (ret < 0) | ||
698 | return ret; | ||
699 | |||
700 | ret = c2port_read_dr(dev, buffer+i); | ||
701 | if (ret < 0) | ||
702 | return ret; | ||
703 | } | ||
704 | |||
705 | return nread; | ||
706 | } | ||
707 | |||
708 | static ssize_t c2port_read_flash_data(struct kobject *kobj, | ||
709 | struct bin_attribute *attr, | ||
710 | char *buffer, loff_t offset, size_t count) | ||
711 | { | ||
712 | struct c2port_device *c2dev = | ||
713 | dev_get_drvdata(container_of(kobj, | ||
714 | struct device, kobj)); | ||
715 | ssize_t ret; | ||
716 | |||
717 | /* Check the device and flash access status */ | ||
718 | if (!c2dev->access || !c2dev->flash_access) | ||
719 | return -EBUSY; | ||
720 | |||
721 | mutex_lock(&c2dev->mutex); | ||
722 | ret = __c2port_read_flash_data(c2dev, buffer, offset, count); | ||
723 | mutex_unlock(&c2dev->mutex); | ||
724 | |||
725 | if (ret < 0) | ||
726 | dev_err(c2dev->dev, "cannot read %s flash\n", c2dev->name); | ||
727 | |||
728 | return ret; | ||
729 | } | ||
730 | |||
731 | static ssize_t __c2port_write_flash_data(struct c2port_device *dev, | ||
732 | char *buffer, loff_t offset, size_t count) | ||
733 | { | ||
734 | struct c2port_ops *ops = dev->ops; | ||
735 | u8 status, nwrite = 128; | ||
736 | int i, ret; | ||
737 | |||
738 | if (nwrite > count) | ||
739 | nwrite = count; | ||
740 | if (ops->block_size * ops->blocks_num - offset < nwrite) | ||
741 | nwrite = ops->block_size * ops->blocks_num - offset; | ||
742 | |||
743 | /* Check for flash end */ | ||
744 | if (offset >= ops->block_size * ops->blocks_num) | ||
745 | return -EINVAL; | ||
746 | |||
747 | /* Target the C2 flash programming data register for C2 data register | ||
748 | * access */ | ||
749 | c2port_write_ar(dev, C2PORT_FPDAT); | ||
750 | |||
751 | /* Send flash block write command */ | ||
752 | c2port_write_dr(dev, C2PORT_BLOCK_WRITE); | ||
753 | |||
754 | /* Wait for input acknowledge */ | ||
755 | ret = c2port_poll_in_busy(dev); | ||
756 | if (ret < 0) | ||
757 | return ret; | ||
758 | |||
759 | /* Should check status before starting FLASH access sequence */ | ||
760 | |||
761 | /* Wait for status information */ | ||
762 | ret = c2port_poll_out_ready(dev); | ||
763 | if (ret < 0) | ||
764 | return ret; | ||
765 | |||
766 | /* Read flash programming interface status */ | ||
767 | ret = c2port_read_dr(dev, &status); | ||
768 | if (ret < 0) | ||
769 | return ret; | ||
770 | if (status != C2PORT_COMMAND_OK) | ||
771 | return -EBUSY; | ||
772 | |||
773 | /* Send address high byte */ | ||
774 | c2port_write_dr(dev, offset >> 8); | ||
775 | ret = c2port_poll_in_busy(dev); | ||
776 | if (ret < 0) | ||
777 | return ret; | ||
778 | |||
779 | /* Send address low byte */ | ||
780 | c2port_write_dr(dev, offset & 0x00ff); | ||
781 | ret = c2port_poll_in_busy(dev); | ||
782 | if (ret < 0) | ||
783 | return ret; | ||
784 | |||
785 | /* Send address block size */ | ||
786 | c2port_write_dr(dev, nwrite); | ||
787 | ret = c2port_poll_in_busy(dev); | ||
788 | if (ret < 0) | ||
789 | return ret; | ||
790 | |||
791 | /* Should check status before writing FLASH block */ | ||
792 | |||
793 | /* Wait for status information */ | ||
794 | ret = c2port_poll_out_ready(dev); | ||
795 | if (ret < 0) | ||
796 | return ret; | ||
797 | |||
798 | /* Read flash programming interface status */ | ||
799 | ret = c2port_read_dr(dev, &status); | ||
800 | if (ret < 0) | ||
801 | return ret; | ||
802 | if (status != C2PORT_COMMAND_OK) | ||
803 | return -EBUSY; | ||
804 | |||
805 | /* Write flash block */ | ||
806 | for (i = 0; i < nwrite; i++) { | ||
807 | ret = c2port_write_dr(dev, *(buffer+i)); | ||
808 | if (ret < 0) | ||
809 | return ret; | ||
810 | |||
811 | ret = c2port_poll_in_busy(dev); | ||
812 | if (ret < 0) | ||
813 | return ret; | ||
814 | |||
815 | } | ||
816 | |||
817 | /* Wait for last flash write to complete */ | ||
818 | ret = c2port_poll_out_ready(dev); | ||
819 | if (ret < 0) | ||
820 | return ret; | ||
821 | |||
822 | return nwrite; | ||
823 | } | ||
824 | |||
825 | static ssize_t c2port_write_flash_data(struct kobject *kobj, | ||
826 | struct bin_attribute *attr, | ||
827 | char *buffer, loff_t offset, size_t count) | ||
828 | { | ||
829 | struct c2port_device *c2dev = | ||
830 | dev_get_drvdata(container_of(kobj, | ||
831 | struct device, kobj)); | ||
832 | int ret; | ||
833 | |||
834 | /* Check the device access status */ | ||
835 | if (!c2dev->access || !c2dev->flash_access) | ||
836 | return -EBUSY; | ||
837 | |||
838 | mutex_lock(&c2dev->mutex); | ||
839 | ret = __c2port_write_flash_data(c2dev, buffer, offset, count); | ||
840 | mutex_unlock(&c2dev->mutex); | ||
841 | |||
842 | if (ret < 0) | ||
843 | dev_err(c2dev->dev, "cannot write %s flash\n", c2dev->name); | ||
844 | |||
845 | return ret; | ||
846 | } | ||
847 | |||
848 | /* | ||
849 | * Class attributes | ||
850 | */ | ||
851 | |||
852 | static struct device_attribute c2port_attrs[] = { | ||
853 | __ATTR(name, 0444, c2port_show_name, NULL), | ||
854 | __ATTR(flash_blocks_num, 0444, c2port_show_flash_blocks_num, NULL), | ||
855 | __ATTR(flash_block_size, 0444, c2port_show_flash_block_size, NULL), | ||
856 | __ATTR(flash_size, 0444, c2port_show_flash_size, NULL), | ||
857 | __ATTR(access, 0644, c2port_show_access, c2port_store_access), | ||
858 | __ATTR(reset, 0200, NULL, c2port_store_reset), | ||
859 | __ATTR(dev_id, 0444, c2port_show_dev_id, NULL), | ||
860 | __ATTR(rev_id, 0444, c2port_show_rev_id, NULL), | ||
861 | |||
862 | __ATTR(flash_access, 0644, c2port_show_flash_access, | ||
863 | c2port_store_flash_access), | ||
864 | __ATTR(flash_erase, 0200, NULL, c2port_store_flash_erase), | ||
865 | __ATTR_NULL, | ||
866 | }; | ||
867 | |||
868 | static struct bin_attribute c2port_bin_attrs = { | ||
869 | .attr = { | ||
870 | .name = "flash_data", | ||
871 | .mode = 0644 | ||
872 | }, | ||
873 | .read = c2port_read_flash_data, | ||
874 | .write = c2port_write_flash_data, | ||
875 | /* .size is computed at run-time */ | ||
876 | }; | ||
877 | |||
878 | /* | ||
879 | * Exported functions | ||
880 | */ | ||
881 | |||
882 | struct c2port_device *c2port_device_register(char *name, | ||
883 | struct c2port_ops *ops, void *devdata) | ||
884 | { | ||
885 | struct c2port_device *c2dev; | ||
886 | int id, ret; | ||
887 | |||
888 | if (unlikely(!ops) || unlikely(!ops->access) || \ | ||
889 | unlikely(!ops->c2d_dir) || unlikely(!ops->c2ck_set) || \ | ||
890 | unlikely(!ops->c2d_get) || unlikely(!ops->c2d_set)) | ||
891 | return ERR_PTR(-EINVAL); | ||
892 | |||
893 | c2dev = kmalloc(sizeof(struct c2port_device), GFP_KERNEL); | ||
894 | if (unlikely(!c2dev)) | ||
895 | return ERR_PTR(-ENOMEM); | ||
896 | |||
897 | ret = idr_pre_get(&c2port_idr, GFP_KERNEL); | ||
898 | if (!ret) { | ||
899 | ret = -ENOMEM; | ||
900 | goto error_idr_get_new; | ||
901 | } | ||
902 | |||
903 | spin_lock_irq(&c2port_idr_lock); | ||
904 | ret = idr_get_new(&c2port_idr, c2dev, &id); | ||
905 | spin_unlock_irq(&c2port_idr_lock); | ||
906 | |||
907 | if (ret < 0) | ||
908 | goto error_idr_get_new; | ||
909 | c2dev->id = id; | ||
910 | |||
911 | c2dev->dev = device_create(c2port_class, NULL, 0, c2dev, | ||
912 | "c2port%d", id); | ||
913 | if (unlikely(!c2dev->dev)) { | ||
914 | ret = -ENOMEM; | ||
915 | goto error_device_create; | ||
916 | } | ||
917 | dev_set_drvdata(c2dev->dev, c2dev); | ||
918 | |||
919 | strncpy(c2dev->name, name, C2PORT_NAME_LEN); | ||
920 | c2dev->ops = ops; | ||
921 | mutex_init(&c2dev->mutex); | ||
922 | |||
923 | /* Create binary file */ | ||
924 | c2port_bin_attrs.size = ops->blocks_num * ops->block_size; | ||
925 | ret = device_create_bin_file(c2dev->dev, &c2port_bin_attrs); | ||
926 | if (unlikely(ret)) | ||
927 | goto error_device_create_bin_file; | ||
928 | |||
929 | /* By default C2 port access is off */ | ||
930 | c2dev->access = c2dev->flash_access = 0; | ||
931 | ops->access(c2dev, 0); | ||
932 | |||
933 | dev_info(c2dev->dev, "C2 port %s added\n", name); | ||
934 | dev_info(c2dev->dev, "%s flash has %d blocks x %d bytes " | ||
935 | "(%d bytes total)\n", | ||
936 | name, ops->blocks_num, ops->block_size, | ||
937 | ops->blocks_num * ops->block_size); | ||
938 | |||
939 | return c2dev; | ||
940 | |||
941 | error_device_create_bin_file: | ||
942 | device_destroy(c2port_class, 0); | ||
943 | |||
944 | error_device_create: | ||
945 | spin_lock_irq(&c2port_idr_lock); | ||
946 | idr_remove(&c2port_idr, id); | ||
947 | spin_unlock_irq(&c2port_idr_lock); | ||
948 | |||
949 | error_idr_get_new: | ||
950 | kfree(c2dev); | ||
951 | |||
952 | return ERR_PTR(ret); | ||
953 | } | ||
954 | EXPORT_SYMBOL(c2port_device_register); | ||
955 | |||
956 | void c2port_device_unregister(struct c2port_device *c2dev) | ||
957 | { | ||
958 | if (!c2dev) | ||
959 | return; | ||
960 | |||
961 | dev_info(c2dev->dev, "C2 port %s removed\n", c2dev->name); | ||
962 | |||
963 | device_remove_bin_file(c2dev->dev, &c2port_bin_attrs); | ||
964 | spin_lock_irq(&c2port_idr_lock); | ||
965 | idr_remove(&c2port_idr, c2dev->id); | ||
966 | spin_unlock_irq(&c2port_idr_lock); | ||
967 | |||
968 | device_destroy(c2port_class, c2dev->id); | ||
969 | |||
970 | kfree(c2dev); | ||
971 | } | ||
972 | EXPORT_SYMBOL(c2port_device_unregister); | ||
973 | |||
974 | /* | ||
975 | * Module stuff | ||
976 | */ | ||
977 | |||
978 | static int __init c2port_init(void) | ||
979 | { | ||
980 | printk(KERN_INFO "Silicon Labs C2 port support v. " DRIVER_VERSION | ||
981 | " - (C) 2007 Rodolfo Giometti\n"); | ||
982 | |||
983 | c2port_class = class_create(THIS_MODULE, "c2port"); | ||
984 | if (!c2port_class) { | ||
985 | printk(KERN_ERR "c2port: failed to allocate class\n"); | ||
986 | return -ENOMEM; | ||
987 | } | ||
988 | c2port_class->dev_attrs = c2port_attrs; | ||
989 | |||
990 | return 0; | ||
991 | } | ||
992 | |||
993 | static void __exit c2port_exit(void) | ||
994 | { | ||
995 | class_destroy(c2port_class); | ||
996 | } | ||
997 | |||
998 | module_init(c2port_init); | ||
999 | module_exit(c2port_exit); | ||
1000 | |||
1001 | MODULE_AUTHOR("Rodolfo Giometti <giometti@linux.it>"); | ||
1002 | MODULE_DESCRIPTION("Silicon Labs C2 port support v. " DRIVER_VERSION); | ||
1003 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/misc/compal-laptop.c b/drivers/misc/compal-laptop.c index 344b790a6253..11003bba10d3 100644 --- a/drivers/misc/compal-laptop.c +++ b/drivers/misc/compal-laptop.c | |||
@@ -326,12 +326,14 @@ static int __init compal_init(void) | |||
326 | 326 | ||
327 | /* Register backlight stuff */ | 327 | /* Register backlight stuff */ |
328 | 328 | ||
329 | compalbl_device = backlight_device_register("compal-laptop", NULL, NULL, | 329 | if (!acpi_video_backlight_support()) { |
330 | &compalbl_ops); | 330 | compalbl_device = backlight_device_register("compal-laptop", NULL, NULL, |
331 | if (IS_ERR(compalbl_device)) | 331 | &compalbl_ops); |
332 | return PTR_ERR(compalbl_device); | 332 | if (IS_ERR(compalbl_device)) |
333 | return PTR_ERR(compalbl_device); | ||
333 | 334 | ||
334 | compalbl_device->props.max_brightness = COMPAL_LCD_LEVEL_MAX-1; | 335 | compalbl_device->props.max_brightness = COMPAL_LCD_LEVEL_MAX-1; |
336 | } | ||
335 | 337 | ||
336 | ret = platform_driver_register(&compal_driver); | 338 | ret = platform_driver_register(&compal_driver); |
337 | if (ret) | 339 | if (ret) |
diff --git a/drivers/misc/eeepc-laptop.c b/drivers/misc/eeepc-laptop.c index 9ef98b2d5039..02fe2b8b8939 100644 --- a/drivers/misc/eeepc-laptop.c +++ b/drivers/misc/eeepc-laptop.c | |||
@@ -825,9 +825,15 @@ static int __init eeepc_laptop_init(void) | |||
825 | return -ENODEV; | 825 | return -ENODEV; |
826 | } | 826 | } |
827 | dev = acpi_get_physical_device(ehotk->device->handle); | 827 | dev = acpi_get_physical_device(ehotk->device->handle); |
828 | result = eeepc_backlight_init(dev); | 828 | |
829 | if (result) | 829 | if (!acpi_video_backlight_support()) { |
830 | goto fail_backlight; | 830 | result = eeepc_backlight_init(dev); |
831 | if (result) | ||
832 | goto fail_backlight; | ||
833 | } else | ||
834 | printk(EEEPC_INFO "Backlight controlled by ACPI video " | ||
835 | "driver\n"); | ||
836 | |||
831 | result = eeepc_hwmon_init(dev); | 837 | result = eeepc_hwmon_init(dev); |
832 | if (result) | 838 | if (result) |
833 | goto fail_hwmon; | 839 | goto fail_hwmon; |
diff --git a/drivers/misc/fujitsu-laptop.c b/drivers/misc/fujitsu-laptop.c index d2cf0bfe3163..a7dd3e9fb79d 100644 --- a/drivers/misc/fujitsu-laptop.c +++ b/drivers/misc/fujitsu-laptop.c | |||
@@ -464,6 +464,14 @@ static int dmi_check_cb_s6410(const struct dmi_system_id *id) | |||
464 | return 0; | 464 | return 0; |
465 | } | 465 | } |
466 | 466 | ||
467 | static int dmi_check_cb_s6420(const struct dmi_system_id *id) | ||
468 | { | ||
469 | dmi_check_cb_common(id); | ||
470 | fujitsu->keycode1 = KEY_SCREENLOCK; /* "Lock" */ | ||
471 | fujitsu->keycode2 = KEY_HELP; /* "Mobility Center" */ | ||
472 | return 0; | ||
473 | } | ||
474 | |||
467 | static int dmi_check_cb_p8010(const struct dmi_system_id *id) | 475 | static int dmi_check_cb_p8010(const struct dmi_system_id *id) |
468 | { | 476 | { |
469 | dmi_check_cb_common(id); | 477 | dmi_check_cb_common(id); |
@@ -473,7 +481,7 @@ static int dmi_check_cb_p8010(const struct dmi_system_id *id) | |||
473 | return 0; | 481 | return 0; |
474 | } | 482 | } |
475 | 483 | ||
476 | static struct dmi_system_id __initdata fujitsu_dmi_table[] = { | 484 | static struct dmi_system_id fujitsu_dmi_table[] = { |
477 | { | 485 | { |
478 | .ident = "Fujitsu Siemens S6410", | 486 | .ident = "Fujitsu Siemens S6410", |
479 | .matches = { | 487 | .matches = { |
@@ -482,6 +490,13 @@ static struct dmi_system_id __initdata fujitsu_dmi_table[] = { | |||
482 | }, | 490 | }, |
483 | .callback = dmi_check_cb_s6410}, | 491 | .callback = dmi_check_cb_s6410}, |
484 | { | 492 | { |
493 | .ident = "Fujitsu Siemens S6420", | ||
494 | .matches = { | ||
495 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), | ||
496 | DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK S6420"), | ||
497 | }, | ||
498 | .callback = dmi_check_cb_s6420}, | ||
499 | { | ||
485 | .ident = "Fujitsu LifeBook P8010", | 500 | .ident = "Fujitsu LifeBook P8010", |
486 | .matches = { | 501 | .matches = { |
487 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | 502 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), |
@@ -990,16 +1005,16 @@ static int __init fujitsu_init(void) | |||
990 | 1005 | ||
991 | /* Register backlight stuff */ | 1006 | /* Register backlight stuff */ |
992 | 1007 | ||
993 | fujitsu->bl_device = | 1008 | if (!acpi_video_backlight_support()) { |
994 | backlight_device_register("fujitsu-laptop", NULL, NULL, | 1009 | fujitsu->bl_device = |
995 | &fujitsubl_ops); | 1010 | backlight_device_register("fujitsu-laptop", NULL, NULL, |
996 | if (IS_ERR(fujitsu->bl_device)) | 1011 | &fujitsubl_ops); |
997 | return PTR_ERR(fujitsu->bl_device); | 1012 | if (IS_ERR(fujitsu->bl_device)) |
998 | 1013 | return PTR_ERR(fujitsu->bl_device); | |
999 | max_brightness = fujitsu->max_brightness; | 1014 | max_brightness = fujitsu->max_brightness; |
1000 | 1015 | fujitsu->bl_device->props.max_brightness = max_brightness - 1; | |
1001 | fujitsu->bl_device->props.max_brightness = max_brightness - 1; | 1016 | fujitsu->bl_device->props.brightness = fujitsu->brightness_level; |
1002 | fujitsu->bl_device->props.brightness = fujitsu->brightness_level; | 1017 | } |
1003 | 1018 | ||
1004 | ret = platform_driver_register(&fujitsupf_driver); | 1019 | ret = platform_driver_register(&fujitsupf_driver); |
1005 | if (ret) | 1020 | if (ret) |
@@ -1035,7 +1050,8 @@ fail_hotkey: | |||
1035 | 1050 | ||
1036 | fail_backlight: | 1051 | fail_backlight: |
1037 | 1052 | ||
1038 | backlight_device_unregister(fujitsu->bl_device); | 1053 | if (fujitsu->bl_device) |
1054 | backlight_device_unregister(fujitsu->bl_device); | ||
1039 | 1055 | ||
1040 | fail_platform_device2: | 1056 | fail_platform_device2: |
1041 | 1057 | ||
@@ -1062,7 +1078,8 @@ static void __exit fujitsu_cleanup(void) | |||
1062 | &fujitsupf_attribute_group); | 1078 | &fujitsupf_attribute_group); |
1063 | platform_device_unregister(fujitsu->pf_device); | 1079 | platform_device_unregister(fujitsu->pf_device); |
1064 | platform_driver_unregister(&fujitsupf_driver); | 1080 | platform_driver_unregister(&fujitsupf_driver); |
1065 | backlight_device_unregister(fujitsu->bl_device); | 1081 | if (fujitsu->bl_device) |
1082 | backlight_device_unregister(fujitsu->bl_device); | ||
1066 | 1083 | ||
1067 | acpi_bus_unregister_driver(&acpi_fujitsu_driver); | 1084 | acpi_bus_unregister_driver(&acpi_fujitsu_driver); |
1068 | 1085 | ||
diff --git a/drivers/misc/ics932s401.c b/drivers/misc/ics932s401.c new file mode 100644 index 000000000000..6e43ab4231ae --- /dev/null +++ b/drivers/misc/ics932s401.c | |||
@@ -0,0 +1,515 @@ | |||
1 | /* | ||
2 | * A driver for the Integrated Circuits ICS932S401 | ||
3 | * Copyright (C) 2008 IBM | ||
4 | * | ||
5 | * Author: Darrick J. Wong <djwong@us.ibm.com> | ||
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 as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
20 | */ | ||
21 | |||
22 | #include <linux/module.h> | ||
23 | #include <linux/jiffies.h> | ||
24 | #include <linux/i2c.h> | ||
25 | #include <linux/err.h> | ||
26 | #include <linux/mutex.h> | ||
27 | #include <linux/delay.h> | ||
28 | #include <linux/log2.h> | ||
29 | |||
30 | /* Addresses to scan */ | ||
31 | static const unsigned short normal_i2c[] = { 0x69, I2C_CLIENT_END }; | ||
32 | |||
33 | /* Insmod parameters */ | ||
34 | I2C_CLIENT_INSMOD_1(ics932s401); | ||
35 | |||
36 | /* ICS932S401 registers */ | ||
37 | #define ICS932S401_REG_CFG2 0x01 | ||
38 | #define ICS932S401_CFG1_SPREAD 0x01 | ||
39 | #define ICS932S401_REG_CFG7 0x06 | ||
40 | #define ICS932S401_FS_MASK 0x07 | ||
41 | #define ICS932S401_REG_VENDOR_REV 0x07 | ||
42 | #define ICS932S401_VENDOR 1 | ||
43 | #define ICS932S401_VENDOR_MASK 0x0F | ||
44 | #define ICS932S401_REV 4 | ||
45 | #define ICS932S401_REV_SHIFT 4 | ||
46 | #define ICS932S401_REG_DEVICE 0x09 | ||
47 | #define ICS932S401_DEVICE 11 | ||
48 | #define ICS932S401_REG_CTRL 0x0A | ||
49 | #define ICS932S401_MN_ENABLED 0x80 | ||
50 | #define ICS932S401_CPU_ALT 0x04 | ||
51 | #define ICS932S401_SRC_ALT 0x08 | ||
52 | #define ICS932S401_REG_CPU_M_CTRL 0x0B | ||
53 | #define ICS932S401_M_MASK 0x3F | ||
54 | #define ICS932S401_REG_CPU_N_CTRL 0x0C | ||
55 | #define ICS932S401_REG_CPU_SPREAD1 0x0D | ||
56 | #define ICS932S401_REG_CPU_SPREAD2 0x0E | ||
57 | #define ICS932S401_SPREAD_MASK 0x7FFF | ||
58 | #define ICS932S401_REG_SRC_M_CTRL 0x0F | ||
59 | #define ICS932S401_REG_SRC_N_CTRL 0x10 | ||
60 | #define ICS932S401_REG_SRC_SPREAD1 0x11 | ||
61 | #define ICS932S401_REG_SRC_SPREAD2 0x12 | ||
62 | #define ICS932S401_REG_CPU_DIVISOR 0x13 | ||
63 | #define ICS932S401_CPU_DIVISOR_SHIFT 4 | ||
64 | #define ICS932S401_REG_PCISRC_DIVISOR 0x14 | ||
65 | #define ICS932S401_SRC_DIVISOR_MASK 0x0F | ||
66 | #define ICS932S401_PCI_DIVISOR_SHIFT 4 | ||
67 | |||
68 | /* Base clock is 14.318MHz */ | ||
69 | #define BASE_CLOCK 14318 | ||
70 | |||
71 | #define NUM_REGS 21 | ||
72 | #define NUM_MIRRORED_REGS 15 | ||
73 | |||
74 | static int regs_to_copy[NUM_MIRRORED_REGS] = { | ||
75 | ICS932S401_REG_CFG2, | ||
76 | ICS932S401_REG_CFG7, | ||
77 | ICS932S401_REG_VENDOR_REV, | ||
78 | ICS932S401_REG_DEVICE, | ||
79 | ICS932S401_REG_CTRL, | ||
80 | ICS932S401_REG_CPU_M_CTRL, | ||
81 | ICS932S401_REG_CPU_N_CTRL, | ||
82 | ICS932S401_REG_CPU_SPREAD1, | ||
83 | ICS932S401_REG_CPU_SPREAD2, | ||
84 | ICS932S401_REG_SRC_M_CTRL, | ||
85 | ICS932S401_REG_SRC_N_CTRL, | ||
86 | ICS932S401_REG_SRC_SPREAD1, | ||
87 | ICS932S401_REG_SRC_SPREAD2, | ||
88 | ICS932S401_REG_CPU_DIVISOR, | ||
89 | ICS932S401_REG_PCISRC_DIVISOR, | ||
90 | }; | ||
91 | |||
92 | /* How often do we reread sensors values? (In jiffies) */ | ||
93 | #define SENSOR_REFRESH_INTERVAL (2 * HZ) | ||
94 | |||
95 | /* How often do we reread sensor limit values? (In jiffies) */ | ||
96 | #define LIMIT_REFRESH_INTERVAL (60 * HZ) | ||
97 | |||
98 | struct ics932s401_data { | ||
99 | struct attribute_group attrs; | ||
100 | struct mutex lock; | ||
101 | char sensors_valid; | ||
102 | unsigned long sensors_last_updated; /* In jiffies */ | ||
103 | |||
104 | u8 regs[NUM_REGS]; | ||
105 | }; | ||
106 | |||
107 | static int ics932s401_probe(struct i2c_client *client, | ||
108 | const struct i2c_device_id *id); | ||
109 | static int ics932s401_detect(struct i2c_client *client, int kind, | ||
110 | struct i2c_board_info *info); | ||
111 | static int ics932s401_remove(struct i2c_client *client); | ||
112 | |||
113 | static const struct i2c_device_id ics932s401_id[] = { | ||
114 | { "ics932s401", ics932s401 }, | ||
115 | { } | ||
116 | }; | ||
117 | MODULE_DEVICE_TABLE(i2c, ics932s401_id); | ||
118 | |||
119 | static struct i2c_driver ics932s401_driver = { | ||
120 | .class = I2C_CLASS_HWMON, | ||
121 | .driver = { | ||
122 | .name = "ics932s401", | ||
123 | }, | ||
124 | .probe = ics932s401_probe, | ||
125 | .remove = ics932s401_remove, | ||
126 | .id_table = ics932s401_id, | ||
127 | .detect = ics932s401_detect, | ||
128 | .address_data = &addr_data, | ||
129 | }; | ||
130 | |||
131 | static struct ics932s401_data *ics932s401_update_device(struct device *dev) | ||
132 | { | ||
133 | struct i2c_client *client = to_i2c_client(dev); | ||
134 | struct ics932s401_data *data = i2c_get_clientdata(client); | ||
135 | unsigned long local_jiffies = jiffies; | ||
136 | int i, temp; | ||
137 | |||
138 | mutex_lock(&data->lock); | ||
139 | if (time_before(local_jiffies, data->sensors_last_updated + | ||
140 | SENSOR_REFRESH_INTERVAL) | ||
141 | && data->sensors_valid) | ||
142 | goto out; | ||
143 | |||
144 | /* | ||
145 | * Each register must be read as a word and then right shifted 8 bits. | ||
146 | * Not really sure why this is; setting the "byte count programming" | ||
147 | * register to 1 does not fix this problem. | ||
148 | */ | ||
149 | for (i = 0; i < NUM_MIRRORED_REGS; i++) { | ||
150 | temp = i2c_smbus_read_word_data(client, regs_to_copy[i]); | ||
151 | data->regs[regs_to_copy[i]] = temp >> 8; | ||
152 | } | ||
153 | |||
154 | data->sensors_last_updated = local_jiffies; | ||
155 | data->sensors_valid = 1; | ||
156 | |||
157 | out: | ||
158 | mutex_unlock(&data->lock); | ||
159 | return data; | ||
160 | } | ||
161 | |||
162 | static ssize_t show_spread_enabled(struct device *dev, | ||
163 | struct device_attribute *devattr, | ||
164 | char *buf) | ||
165 | { | ||
166 | struct ics932s401_data *data = ics932s401_update_device(dev); | ||
167 | |||
168 | if (data->regs[ICS932S401_REG_CFG2] & ICS932S401_CFG1_SPREAD) | ||
169 | return sprintf(buf, "1\n"); | ||
170 | |||
171 | return sprintf(buf, "0\n"); | ||
172 | } | ||
173 | |||
174 | /* bit to cpu khz map */ | ||
175 | static const int fs_speeds[] = { | ||
176 | 266666, | ||
177 | 133333, | ||
178 | 200000, | ||
179 | 166666, | ||
180 | 333333, | ||
181 | 100000, | ||
182 | 400000, | ||
183 | 0, | ||
184 | }; | ||
185 | |||
186 | /* clock divisor map */ | ||
187 | static const int divisors[] = {2, 3, 5, 15, 4, 6, 10, 30, 8, 12, 20, 60, 16, | ||
188 | 24, 40, 120}; | ||
189 | |||
190 | /* Calculate CPU frequency from the M/N registers. */ | ||
191 | static int calculate_cpu_freq(struct ics932s401_data *data) | ||
192 | { | ||
193 | int m, n, freq; | ||
194 | |||
195 | m = data->regs[ICS932S401_REG_CPU_M_CTRL] & ICS932S401_M_MASK; | ||
196 | n = data->regs[ICS932S401_REG_CPU_N_CTRL]; | ||
197 | |||
198 | /* Pull in bits 8 & 9 from the M register */ | ||
199 | n |= ((int)data->regs[ICS932S401_REG_CPU_M_CTRL] & 0x80) << 1; | ||
200 | n |= ((int)data->regs[ICS932S401_REG_CPU_M_CTRL] & 0x40) << 3; | ||
201 | |||
202 | freq = BASE_CLOCK * (n + 8) / (m + 2); | ||
203 | freq /= divisors[data->regs[ICS932S401_REG_CPU_DIVISOR] >> | ||
204 | ICS932S401_CPU_DIVISOR_SHIFT]; | ||
205 | |||
206 | return freq; | ||
207 | } | ||
208 | |||
209 | static ssize_t show_cpu_clock(struct device *dev, | ||
210 | struct device_attribute *devattr, | ||
211 | char *buf) | ||
212 | { | ||
213 | struct ics932s401_data *data = ics932s401_update_device(dev); | ||
214 | |||
215 | return sprintf(buf, "%d\n", calculate_cpu_freq(data)); | ||
216 | } | ||
217 | |||
218 | static ssize_t show_cpu_clock_sel(struct device *dev, | ||
219 | struct device_attribute *devattr, | ||
220 | char *buf) | ||
221 | { | ||
222 | struct ics932s401_data *data = ics932s401_update_device(dev); | ||
223 | int freq; | ||
224 | |||
225 | if (data->regs[ICS932S401_REG_CTRL] & ICS932S401_MN_ENABLED) | ||
226 | freq = calculate_cpu_freq(data); | ||
227 | else { | ||
228 | /* Freq is neatly wrapped up for us */ | ||
229 | int fid = data->regs[ICS932S401_REG_CFG7] & ICS932S401_FS_MASK; | ||
230 | freq = fs_speeds[fid]; | ||
231 | if (data->regs[ICS932S401_REG_CTRL] & ICS932S401_CPU_ALT) { | ||
232 | switch (freq) { | ||
233 | case 166666: | ||
234 | freq = 160000; | ||
235 | break; | ||
236 | case 333333: | ||
237 | freq = 320000; | ||
238 | break; | ||
239 | } | ||
240 | } | ||
241 | } | ||
242 | |||
243 | return sprintf(buf, "%d\n", freq); | ||
244 | } | ||
245 | |||
246 | /* Calculate SRC frequency from the M/N registers. */ | ||
247 | static int calculate_src_freq(struct ics932s401_data *data) | ||
248 | { | ||
249 | int m, n, freq; | ||
250 | |||
251 | m = data->regs[ICS932S401_REG_SRC_M_CTRL] & ICS932S401_M_MASK; | ||
252 | n = data->regs[ICS932S401_REG_SRC_N_CTRL]; | ||
253 | |||
254 | /* Pull in bits 8 & 9 from the M register */ | ||
255 | n |= ((int)data->regs[ICS932S401_REG_SRC_M_CTRL] & 0x80) << 1; | ||
256 | n |= ((int)data->regs[ICS932S401_REG_SRC_M_CTRL] & 0x40) << 3; | ||
257 | |||
258 | freq = BASE_CLOCK * (n + 8) / (m + 2); | ||
259 | freq /= divisors[data->regs[ICS932S401_REG_PCISRC_DIVISOR] & | ||
260 | ICS932S401_SRC_DIVISOR_MASK]; | ||
261 | |||
262 | return freq; | ||
263 | } | ||
264 | |||
265 | static ssize_t show_src_clock(struct device *dev, | ||
266 | struct device_attribute *devattr, | ||
267 | char *buf) | ||
268 | { | ||
269 | struct ics932s401_data *data = ics932s401_update_device(dev); | ||
270 | |||
271 | return sprintf(buf, "%d\n", calculate_src_freq(data)); | ||
272 | } | ||
273 | |||
274 | static ssize_t show_src_clock_sel(struct device *dev, | ||
275 | struct device_attribute *devattr, | ||
276 | char *buf) | ||
277 | { | ||
278 | struct ics932s401_data *data = ics932s401_update_device(dev); | ||
279 | int freq; | ||
280 | |||
281 | if (data->regs[ICS932S401_REG_CTRL] & ICS932S401_MN_ENABLED) | ||
282 | freq = calculate_src_freq(data); | ||
283 | else | ||
284 | /* Freq is neatly wrapped up for us */ | ||
285 | if (data->regs[ICS932S401_REG_CTRL] & ICS932S401_CPU_ALT && | ||
286 | data->regs[ICS932S401_REG_CTRL] & ICS932S401_SRC_ALT) | ||
287 | freq = 96000; | ||
288 | else | ||
289 | freq = 100000; | ||
290 | |||
291 | return sprintf(buf, "%d\n", freq); | ||
292 | } | ||
293 | |||
294 | /* Calculate PCI frequency from the SRC M/N registers. */ | ||
295 | static int calculate_pci_freq(struct ics932s401_data *data) | ||
296 | { | ||
297 | int m, n, freq; | ||
298 | |||
299 | m = data->regs[ICS932S401_REG_SRC_M_CTRL] & ICS932S401_M_MASK; | ||
300 | n = data->regs[ICS932S401_REG_SRC_N_CTRL]; | ||
301 | |||
302 | /* Pull in bits 8 & 9 from the M register */ | ||
303 | n |= ((int)data->regs[ICS932S401_REG_SRC_M_CTRL] & 0x80) << 1; | ||
304 | n |= ((int)data->regs[ICS932S401_REG_SRC_M_CTRL] & 0x40) << 3; | ||
305 | |||
306 | freq = BASE_CLOCK * (n + 8) / (m + 2); | ||
307 | freq /= divisors[data->regs[ICS932S401_REG_PCISRC_DIVISOR] >> | ||
308 | ICS932S401_PCI_DIVISOR_SHIFT]; | ||
309 | |||
310 | return freq; | ||
311 | } | ||
312 | |||
313 | static ssize_t show_pci_clock(struct device *dev, | ||
314 | struct device_attribute *devattr, | ||
315 | char *buf) | ||
316 | { | ||
317 | struct ics932s401_data *data = ics932s401_update_device(dev); | ||
318 | |||
319 | return sprintf(buf, "%d\n", calculate_pci_freq(data)); | ||
320 | } | ||
321 | |||
322 | static ssize_t show_pci_clock_sel(struct device *dev, | ||
323 | struct device_attribute *devattr, | ||
324 | char *buf) | ||
325 | { | ||
326 | struct ics932s401_data *data = ics932s401_update_device(dev); | ||
327 | int freq; | ||
328 | |||
329 | if (data->regs[ICS932S401_REG_CTRL] & ICS932S401_MN_ENABLED) | ||
330 | freq = calculate_pci_freq(data); | ||
331 | else | ||
332 | freq = 33333; | ||
333 | |||
334 | return sprintf(buf, "%d\n", freq); | ||
335 | } | ||
336 | |||
337 | static ssize_t show_value(struct device *dev, | ||
338 | struct device_attribute *devattr, | ||
339 | char *buf); | ||
340 | |||
341 | static ssize_t show_spread(struct device *dev, | ||
342 | struct device_attribute *devattr, | ||
343 | char *buf); | ||
344 | |||
345 | static DEVICE_ATTR(spread_enabled, S_IRUGO, show_spread_enabled, NULL); | ||
346 | static DEVICE_ATTR(cpu_clock_selection, S_IRUGO, show_cpu_clock_sel, NULL); | ||
347 | static DEVICE_ATTR(cpu_clock, S_IRUGO, show_cpu_clock, NULL); | ||
348 | static DEVICE_ATTR(src_clock_selection, S_IRUGO, show_src_clock_sel, NULL); | ||
349 | static DEVICE_ATTR(src_clock, S_IRUGO, show_src_clock, NULL); | ||
350 | static DEVICE_ATTR(pci_clock_selection, S_IRUGO, show_pci_clock_sel, NULL); | ||
351 | static DEVICE_ATTR(pci_clock, S_IRUGO, show_pci_clock, NULL); | ||
352 | static DEVICE_ATTR(usb_clock, S_IRUGO, show_value, NULL); | ||
353 | static DEVICE_ATTR(ref_clock, S_IRUGO, show_value, NULL); | ||
354 | static DEVICE_ATTR(cpu_spread, S_IRUGO, show_spread, NULL); | ||
355 | static DEVICE_ATTR(src_spread, S_IRUGO, show_spread, NULL); | ||
356 | |||
357 | static struct attribute *ics932s401_attr[] = | ||
358 | { | ||
359 | &dev_attr_spread_enabled.attr, | ||
360 | &dev_attr_cpu_clock_selection.attr, | ||
361 | &dev_attr_cpu_clock.attr, | ||
362 | &dev_attr_src_clock_selection.attr, | ||
363 | &dev_attr_src_clock.attr, | ||
364 | &dev_attr_pci_clock_selection.attr, | ||
365 | &dev_attr_pci_clock.attr, | ||
366 | &dev_attr_usb_clock.attr, | ||
367 | &dev_attr_ref_clock.attr, | ||
368 | &dev_attr_cpu_spread.attr, | ||
369 | &dev_attr_src_spread.attr, | ||
370 | NULL | ||
371 | }; | ||
372 | |||
373 | static ssize_t show_value(struct device *dev, | ||
374 | struct device_attribute *devattr, | ||
375 | char *buf) | ||
376 | { | ||
377 | int x; | ||
378 | |||
379 | if (devattr == &dev_attr_usb_clock) | ||
380 | x = 48000; | ||
381 | else if (devattr == &dev_attr_ref_clock) | ||
382 | x = BASE_CLOCK; | ||
383 | else | ||
384 | BUG(); | ||
385 | |||
386 | return sprintf(buf, "%d\n", x); | ||
387 | } | ||
388 | |||
389 | static ssize_t show_spread(struct device *dev, | ||
390 | struct device_attribute *devattr, | ||
391 | char *buf) | ||
392 | { | ||
393 | struct ics932s401_data *data = ics932s401_update_device(dev); | ||
394 | int reg; | ||
395 | unsigned long val; | ||
396 | |||
397 | if (!(data->regs[ICS932S401_REG_CFG2] & ICS932S401_CFG1_SPREAD)) | ||
398 | return sprintf(buf, "0%%\n"); | ||
399 | |||
400 | if (devattr == &dev_attr_src_spread) | ||
401 | reg = ICS932S401_REG_SRC_SPREAD1; | ||
402 | else if (devattr == &dev_attr_cpu_spread) | ||
403 | reg = ICS932S401_REG_CPU_SPREAD1; | ||
404 | else | ||
405 | BUG(); | ||
406 | |||
407 | val = data->regs[reg] | (data->regs[reg + 1] << 8); | ||
408 | val &= ICS932S401_SPREAD_MASK; | ||
409 | |||
410 | /* Scale 0..2^14 to -0.5. */ | ||
411 | val = 500000 * val / 16384; | ||
412 | return sprintf(buf, "-0.%lu%%\n", val); | ||
413 | } | ||
414 | |||
415 | /* Return 0 if detection is successful, -ENODEV otherwise */ | ||
416 | static int ics932s401_detect(struct i2c_client *client, int kind, | ||
417 | struct i2c_board_info *info) | ||
418 | { | ||
419 | struct i2c_adapter *adapter = client->adapter; | ||
420 | |||
421 | if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) | ||
422 | return -ENODEV; | ||
423 | |||
424 | if (kind <= 0) { | ||
425 | int vendor, device, revision; | ||
426 | |||
427 | vendor = i2c_smbus_read_word_data(client, | ||
428 | ICS932S401_REG_VENDOR_REV); | ||
429 | vendor >>= 8; | ||
430 | revision = vendor >> ICS932S401_REV_SHIFT; | ||
431 | vendor &= ICS932S401_VENDOR_MASK; | ||
432 | if (vendor != ICS932S401_VENDOR) | ||
433 | return -ENODEV; | ||
434 | |||
435 | device = i2c_smbus_read_word_data(client, | ||
436 | ICS932S401_REG_DEVICE); | ||
437 | device >>= 8; | ||
438 | if (device != ICS932S401_DEVICE) | ||
439 | return -ENODEV; | ||
440 | |||
441 | if (revision != ICS932S401_REV) | ||
442 | dev_info(&adapter->dev, "Unknown revision %d\n", | ||
443 | revision); | ||
444 | } else | ||
445 | dev_dbg(&adapter->dev, "detection forced\n"); | ||
446 | |||
447 | strlcpy(info->type, "ics932s401", I2C_NAME_SIZE); | ||
448 | |||
449 | return 0; | ||
450 | } | ||
451 | |||
452 | static int ics932s401_probe(struct i2c_client *client, | ||
453 | const struct i2c_device_id *id) | ||
454 | { | ||
455 | struct ics932s401_data *data; | ||
456 | int err; | ||
457 | |||
458 | data = kzalloc(sizeof(struct ics932s401_data), GFP_KERNEL); | ||
459 | if (!data) { | ||
460 | err = -ENOMEM; | ||
461 | goto exit; | ||
462 | } | ||
463 | |||
464 | i2c_set_clientdata(client, data); | ||
465 | mutex_init(&data->lock); | ||
466 | |||
467 | dev_info(&client->dev, "%s chip found\n", client->name); | ||
468 | |||
469 | /* Register sysfs hooks */ | ||
470 | data->attrs.attrs = ics932s401_attr; | ||
471 | err = sysfs_create_group(&client->dev.kobj, &data->attrs); | ||
472 | if (err) | ||
473 | goto exit_free; | ||
474 | |||
475 | return 0; | ||
476 | |||
477 | exit_free: | ||
478 | kfree(data); | ||
479 | exit: | ||
480 | return err; | ||
481 | } | ||
482 | |||
483 | static int ics932s401_remove(struct i2c_client *client) | ||
484 | { | ||
485 | struct ics932s401_data *data = i2c_get_clientdata(client); | ||
486 | |||
487 | sysfs_remove_group(&client->dev.kobj, &data->attrs); | ||
488 | kfree(data); | ||
489 | return 0; | ||
490 | } | ||
491 | |||
492 | static int __init ics932s401_init(void) | ||
493 | { | ||
494 | return i2c_add_driver(&ics932s401_driver); | ||
495 | } | ||
496 | |||
497 | static void __exit ics932s401_exit(void) | ||
498 | { | ||
499 | i2c_del_driver(&ics932s401_driver); | ||
500 | } | ||
501 | |||
502 | MODULE_AUTHOR("Darrick J. Wong <djwong@us.ibm.com>"); | ||
503 | MODULE_DESCRIPTION("ICS932S401 driver"); | ||
504 | MODULE_LICENSE("GPL"); | ||
505 | |||
506 | module_init(ics932s401_init); | ||
507 | module_exit(ics932s401_exit); | ||
508 | |||
509 | /* IBM IntelliStation Z30 */ | ||
510 | MODULE_ALIAS("dmi:bvnIBM:*:rn9228:*"); | ||
511 | MODULE_ALIAS("dmi:bvnIBM:*:rn9232:*"); | ||
512 | |||
513 | /* IBM x3650/x3550 */ | ||
514 | MODULE_ALIAS("dmi:bvnIBM:*:pnIBMSystemx3650*"); | ||
515 | MODULE_ALIAS("dmi:bvnIBM:*:pnIBMSystemx3550*"); | ||
diff --git a/drivers/misc/intel_menlow.c b/drivers/misc/intel_menlow.c index e00a2756e97e..27b7662955bb 100644 --- a/drivers/misc/intel_menlow.c +++ b/drivers/misc/intel_menlow.c | |||
@@ -52,6 +52,11 @@ MODULE_LICENSE("GPL"); | |||
52 | #define MEMORY_ARG_CUR_BANDWIDTH 1 | 52 | #define MEMORY_ARG_CUR_BANDWIDTH 1 |
53 | #define MEMORY_ARG_MAX_BANDWIDTH 0 | 53 | #define MEMORY_ARG_MAX_BANDWIDTH 0 |
54 | 54 | ||
55 | /* | ||
56 | * GTHS returning 'n' would mean that [0,n-1] states are supported | ||
57 | * In that case max_cstate would be n-1 | ||
58 | * GTHS returning '0' would mean that no bandwidth control states are supported | ||
59 | */ | ||
55 | static int memory_get_int_max_bandwidth(struct thermal_cooling_device *cdev, | 60 | static int memory_get_int_max_bandwidth(struct thermal_cooling_device *cdev, |
56 | unsigned long *max_state) | 61 | unsigned long *max_state) |
57 | { | 62 | { |
@@ -71,6 +76,9 @@ static int memory_get_int_max_bandwidth(struct thermal_cooling_device *cdev, | |||
71 | if (ACPI_FAILURE(status)) | 76 | if (ACPI_FAILURE(status)) |
72 | return -EFAULT; | 77 | return -EFAULT; |
73 | 78 | ||
79 | if (!value) | ||
80 | return -EINVAL; | ||
81 | |||
74 | *max_state = value - 1; | 82 | *max_state = value - 1; |
75 | return 0; | 83 | return 0; |
76 | } | 84 | } |
@@ -121,7 +129,7 @@ static int memory_set_cur_bandwidth(struct thermal_cooling_device *cdev, | |||
121 | if (memory_get_int_max_bandwidth(cdev, &max_state)) | 129 | if (memory_get_int_max_bandwidth(cdev, &max_state)) |
122 | return -EFAULT; | 130 | return -EFAULT; |
123 | 131 | ||
124 | if (max_state < 0 || state > max_state) | 132 | if (state > max_state) |
125 | return -EINVAL; | 133 | return -EINVAL; |
126 | 134 | ||
127 | arg_list.count = 1; | 135 | arg_list.count = 1; |
diff --git a/drivers/misc/msi-laptop.c b/drivers/misc/msi-laptop.c index de898c6938f3..759763d18e4c 100644 --- a/drivers/misc/msi-laptop.c +++ b/drivers/misc/msi-laptop.c | |||
@@ -347,12 +347,16 @@ static int __init msi_init(void) | |||
347 | 347 | ||
348 | /* Register backlight stuff */ | 348 | /* Register backlight stuff */ |
349 | 349 | ||
350 | msibl_device = backlight_device_register("msi-laptop-bl", NULL, NULL, | 350 | if (acpi_video_backlight_support()) { |
351 | &msibl_ops); | 351 | printk(KERN_INFO "MSI: Brightness ignored, must be controlled " |
352 | if (IS_ERR(msibl_device)) | 352 | "by ACPI video driver\n"); |
353 | return PTR_ERR(msibl_device); | 353 | } else { |
354 | 354 | msibl_device = backlight_device_register("msi-laptop-bl", NULL, | |
355 | msibl_device->props.max_brightness = MSI_LCD_LEVEL_MAX-1; | 355 | NULL, &msibl_ops); |
356 | if (IS_ERR(msibl_device)) | ||
357 | return PTR_ERR(msibl_device); | ||
358 | msibl_device->props.max_brightness = MSI_LCD_LEVEL_MAX-1; | ||
359 | } | ||
356 | 360 | ||
357 | ret = platform_driver_register(&msipf_driver); | 361 | ret = platform_driver_register(&msipf_driver); |
358 | if (ret) | 362 | if (ret) |
diff --git a/drivers/misc/sgi-gru/Makefile b/drivers/misc/sgi-gru/Makefile index d03597a521b0..9e9170b3599a 100644 --- a/drivers/misc/sgi-gru/Makefile +++ b/drivers/misc/sgi-gru/Makefile | |||
@@ -1,3 +1,7 @@ | |||
1 | ifdef CONFIG_SGI_GRU_DEBUG | ||
2 | EXTRA_CFLAGS += -DDEBUG | ||
3 | endif | ||
4 | |||
1 | obj-$(CONFIG_SGI_GRU) := gru.o | 5 | obj-$(CONFIG_SGI_GRU) := gru.o |
2 | gru-y := grufile.o grumain.o grufault.o grutlbpurge.o gruprocfs.o grukservices.o | 6 | gru-y := grufile.o grumain.o grufault.o grutlbpurge.o gruprocfs.o grukservices.o |
3 | 7 | ||
diff --git a/drivers/misc/sony-laptop.c b/drivers/misc/sony-laptop.c index 06f07e19dc70..571b211608d1 100644 --- a/drivers/misc/sony-laptop.c +++ b/drivers/misc/sony-laptop.c | |||
@@ -1038,7 +1038,11 @@ static int sony_nc_add(struct acpi_device *device) | |||
1038 | goto outinput; | 1038 | goto outinput; |
1039 | } | 1039 | } |
1040 | 1040 | ||
1041 | if (ACPI_SUCCESS(acpi_get_handle(sony_nc_acpi_handle, "GBRT", &handle))) { | 1041 | if (acpi_video_backlight_support()) { |
1042 | printk(KERN_INFO DRV_PFX "brightness ignored, must be " | ||
1043 | "controlled by ACPI video driver\n"); | ||
1044 | } else if (ACPI_SUCCESS(acpi_get_handle(sony_nc_acpi_handle, "GBRT", | ||
1045 | &handle))) { | ||
1042 | sony_backlight_device = backlight_device_register("sony", NULL, | 1046 | sony_backlight_device = backlight_device_register("sony", NULL, |
1043 | NULL, | 1047 | NULL, |
1044 | &sony_backlight_ops); | 1048 | &sony_backlight_ops); |
diff --git a/drivers/misc/thinkpad_acpi.c b/drivers/misc/thinkpad_acpi.c index 4db1cf9078d9..899766e16fa8 100644 --- a/drivers/misc/thinkpad_acpi.c +++ b/drivers/misc/thinkpad_acpi.c | |||
@@ -4932,16 +4932,25 @@ static int __init brightness_init(struct ibm_init_struct *iibm) | |||
4932 | */ | 4932 | */ |
4933 | b = tpacpi_check_std_acpi_brightness_support(); | 4933 | b = tpacpi_check_std_acpi_brightness_support(); |
4934 | if (b > 0) { | 4934 | if (b > 0) { |
4935 | if (thinkpad_id.vendor == PCI_VENDOR_ID_LENOVO) { | 4935 | |
4936 | printk(TPACPI_NOTICE | 4936 | if (acpi_video_backlight_support()) { |
4937 | "Lenovo BIOS switched to ACPI backlight " | 4937 | if (brightness_enable > 1) { |
4938 | "control mode\n"); | 4938 | printk(TPACPI_NOTICE |
4939 | } | 4939 | "Standard ACPI backlight interface " |
4940 | if (brightness_enable > 1) { | 4940 | "available, not loading native one.\n"); |
4941 | printk(TPACPI_NOTICE | 4941 | return 1; |
4942 | "standard ACPI backlight interface " | 4942 | } else if (brightness_enable == 1) { |
4943 | "available, not loading native one...\n"); | 4943 | printk(TPACPI_NOTICE |
4944 | return 1; | 4944 | "Backlight control force enabled, even if standard " |
4945 | "ACPI backlight interface is available\n"); | ||
4946 | } | ||
4947 | } else { | ||
4948 | if (brightness_enable > 1) { | ||
4949 | printk(TPACPI_NOTICE | ||
4950 | "Standard ACPI backlight interface not " | ||
4951 | "available, thinkpad_acpi native " | ||
4952 | "brightness control enabled\n"); | ||
4953 | } | ||
4945 | } | 4954 | } |
4946 | } | 4955 | } |
4947 | 4956 | ||
@@ -5309,6 +5318,7 @@ static enum fan_control_commands fan_control_commands; | |||
5309 | 5318 | ||
5310 | static u8 fan_control_initial_status; | 5319 | static u8 fan_control_initial_status; |
5311 | static u8 fan_control_desired_level; | 5320 | static u8 fan_control_desired_level; |
5321 | static u8 fan_control_resume_level; | ||
5312 | static int fan_watchdog_maxinterval; | 5322 | static int fan_watchdog_maxinterval; |
5313 | 5323 | ||
5314 | static struct mutex fan_mutex; | 5324 | static struct mutex fan_mutex; |
@@ -5431,8 +5441,8 @@ static int fan_set_level(int level) | |||
5431 | 5441 | ||
5432 | case TPACPI_FAN_WR_ACPI_FANS: | 5442 | case TPACPI_FAN_WR_ACPI_FANS: |
5433 | case TPACPI_FAN_WR_TPEC: | 5443 | case TPACPI_FAN_WR_TPEC: |
5434 | if ((level != TP_EC_FAN_AUTO) && | 5444 | if (!(level & TP_EC_FAN_AUTO) && |
5435 | (level != TP_EC_FAN_FULLSPEED) && | 5445 | !(level & TP_EC_FAN_FULLSPEED) && |
5436 | ((level < 0) || (level > 7))) | 5446 | ((level < 0) || (level > 7))) |
5437 | return -EINVAL; | 5447 | return -EINVAL; |
5438 | 5448 | ||
@@ -5996,38 +6006,67 @@ static void fan_exit(void) | |||
5996 | 6006 | ||
5997 | static void fan_suspend(pm_message_t state) | 6007 | static void fan_suspend(pm_message_t state) |
5998 | { | 6008 | { |
6009 | int rc; | ||
6010 | |||
5999 | if (!fan_control_allowed) | 6011 | if (!fan_control_allowed) |
6000 | return; | 6012 | return; |
6001 | 6013 | ||
6002 | /* Store fan status in cache */ | 6014 | /* Store fan status in cache */ |
6003 | fan_get_status_safe(NULL); | 6015 | fan_control_resume_level = 0; |
6016 | rc = fan_get_status_safe(&fan_control_resume_level); | ||
6017 | if (rc < 0) | ||
6018 | printk(TPACPI_NOTICE | ||
6019 | "failed to read fan level for later " | ||
6020 | "restore during resume: %d\n", rc); | ||
6021 | |||
6022 | /* if it is undefined, don't attempt to restore it. | ||
6023 | * KEEP THIS LAST */ | ||
6004 | if (tp_features.fan_ctrl_status_undef) | 6024 | if (tp_features.fan_ctrl_status_undef) |
6005 | fan_control_desired_level = TP_EC_FAN_AUTO; | 6025 | fan_control_resume_level = 0; |
6006 | } | 6026 | } |
6007 | 6027 | ||
6008 | static void fan_resume(void) | 6028 | static void fan_resume(void) |
6009 | { | 6029 | { |
6010 | u8 saved_fan_level; | ||
6011 | u8 current_level = 7; | 6030 | u8 current_level = 7; |
6012 | bool do_set = false; | 6031 | bool do_set = false; |
6032 | int rc; | ||
6013 | 6033 | ||
6014 | /* DSDT *always* updates status on resume */ | 6034 | /* DSDT *always* updates status on resume */ |
6015 | tp_features.fan_ctrl_status_undef = 0; | 6035 | tp_features.fan_ctrl_status_undef = 0; |
6016 | 6036 | ||
6017 | saved_fan_level = fan_control_desired_level; | ||
6018 | if (!fan_control_allowed || | 6037 | if (!fan_control_allowed || |
6038 | !fan_control_resume_level || | ||
6019 | (fan_get_status_safe(¤t_level) < 0)) | 6039 | (fan_get_status_safe(¤t_level) < 0)) |
6020 | return; | 6040 | return; |
6021 | 6041 | ||
6022 | switch (fan_control_access_mode) { | 6042 | switch (fan_control_access_mode) { |
6023 | case TPACPI_FAN_WR_ACPI_SFAN: | 6043 | case TPACPI_FAN_WR_ACPI_SFAN: |
6024 | do_set = (saved_fan_level > current_level); | 6044 | /* never decrease fan level */ |
6045 | do_set = (fan_control_resume_level > current_level); | ||
6025 | break; | 6046 | break; |
6026 | case TPACPI_FAN_WR_ACPI_FANS: | 6047 | case TPACPI_FAN_WR_ACPI_FANS: |
6027 | case TPACPI_FAN_WR_TPEC: | 6048 | case TPACPI_FAN_WR_TPEC: |
6028 | do_set = ((saved_fan_level & TP_EC_FAN_FULLSPEED) || | 6049 | /* never decrease fan level, scale is: |
6029 | (saved_fan_level == 7 && | 6050 | * TP_EC_FAN_FULLSPEED > 7 >= TP_EC_FAN_AUTO |
6030 | !(current_level & TP_EC_FAN_FULLSPEED))); | 6051 | * |
6052 | * We expect the firmware to set either 7 or AUTO, but we | ||
6053 | * handle FULLSPEED out of paranoia. | ||
6054 | * | ||
6055 | * So, we can safely only restore FULLSPEED or 7, anything | ||
6056 | * else could slow the fan. Restoring AUTO is useless, at | ||
6057 | * best that's exactly what the DSDT already set (it is the | ||
6058 | * slower it uses). | ||
6059 | * | ||
6060 | * Always keep in mind that the DSDT *will* have set the | ||
6061 | * fans to what the vendor supposes is the best level. We | ||
6062 | * muck with it only to speed the fan up. | ||
6063 | */ | ||
6064 | if (fan_control_resume_level != 7 && | ||
6065 | !(fan_control_resume_level & TP_EC_FAN_FULLSPEED)) | ||
6066 | return; | ||
6067 | else | ||
6068 | do_set = !(current_level & TP_EC_FAN_FULLSPEED) && | ||
6069 | (current_level != fan_control_resume_level); | ||
6031 | break; | 6070 | break; |
6032 | default: | 6071 | default: |
6033 | return; | 6072 | return; |
@@ -6035,8 +6074,11 @@ static void fan_resume(void) | |||
6035 | if (do_set) { | 6074 | if (do_set) { |
6036 | printk(TPACPI_NOTICE | 6075 | printk(TPACPI_NOTICE |
6037 | "restoring fan level to 0x%02x\n", | 6076 | "restoring fan level to 0x%02x\n", |
6038 | saved_fan_level); | 6077 | fan_control_resume_level); |
6039 | fan_set_level_safe(saved_fan_level); | 6078 | rc = fan_set_level_safe(fan_control_resume_level); |
6079 | if (rc < 0) | ||
6080 | printk(TPACPI_NOTICE | ||
6081 | "failed to restore fan level: %d\n", rc); | ||
6040 | } | 6082 | } |
6041 | } | 6083 | } |
6042 | 6084 | ||
diff --git a/drivers/mtd/maps/cdb89712.c b/drivers/mtd/maps/cdb89712.c index e5059aa3c724..8d92d8db9a98 100644 --- a/drivers/mtd/maps/cdb89712.c +++ b/drivers/mtd/maps/cdb89712.c | |||
@@ -14,7 +14,18 @@ | |||
14 | #include <linux/mtd/map.h> | 14 | #include <linux/mtd/map.h> |
15 | #include <linux/mtd/partitions.h> | 15 | #include <linux/mtd/partitions.h> |
16 | 16 | ||
17 | 17 | /* dynamic ioremap() areas */ | |
18 | #define FLASH_START 0x00000000 | ||
19 | #define FLASH_SIZE 0x800000 | ||
20 | #define FLASH_WIDTH 4 | ||
21 | |||
22 | #define SRAM_START 0x60000000 | ||
23 | #define SRAM_SIZE 0xc000 | ||
24 | #define SRAM_WIDTH 4 | ||
25 | |||
26 | #define BOOTROM_START 0x70000000 | ||
27 | #define BOOTROM_SIZE 0x80 | ||
28 | #define BOOTROM_WIDTH 4 | ||
18 | 29 | ||
19 | 30 | ||
20 | static struct mtd_info *flash_mtd; | 31 | static struct mtd_info *flash_mtd; |
diff --git a/drivers/mtd/maps/h720x-flash.c b/drivers/mtd/maps/h720x-flash.c index 35fef655ccc4..3b959fad1c4e 100644 --- a/drivers/mtd/maps/h720x-flash.c +++ b/drivers/mtd/maps/h720x-flash.c | |||
@@ -24,8 +24,8 @@ static struct mtd_info *mymtd; | |||
24 | static struct map_info h720x_map = { | 24 | static struct map_info h720x_map = { |
25 | .name = "H720X", | 25 | .name = "H720X", |
26 | .bankwidth = 4, | 26 | .bankwidth = 4, |
27 | .size = FLASH_SIZE, | 27 | .size = H720X_FLASH_SIZE, |
28 | .phys = FLASH_PHYS, | 28 | .phys = H720X_FLASH_PHYS, |
29 | }; | 29 | }; |
30 | 30 | ||
31 | static struct mtd_partition h720x_partitions[] = { | 31 | static struct mtd_partition h720x_partitions[] = { |
@@ -70,7 +70,7 @@ int __init h720x_mtd_init(void) | |||
70 | 70 | ||
71 | char *part_type = NULL; | 71 | char *part_type = NULL; |
72 | 72 | ||
73 | h720x_map.virt = ioremap(FLASH_PHYS, FLASH_SIZE); | 73 | h720x_map.virt = ioremap(h720x_map.phys, h720x_map.size); |
74 | 74 | ||
75 | if (!h720x_map.virt) { | 75 | if (!h720x_map.virt) { |
76 | printk(KERN_ERR "H720x-MTD: ioremap failed\n"); | 76 | printk(KERN_ERR "H720x-MTD: ioremap failed\n"); |
diff --git a/drivers/mtd/ubi/eba.c b/drivers/mtd/ubi/eba.c index e04bcf1dff87..d8966bae0e0b 100644 --- a/drivers/mtd/ubi/eba.c +++ b/drivers/mtd/ubi/eba.c | |||
@@ -1022,7 +1022,7 @@ int ubi_eba_copy_leb(struct ubi_device *ubi, int from, int to, | |||
1022 | } | 1022 | } |
1023 | 1023 | ||
1024 | /* | 1024 | /* |
1025 | * OK, now the LEB is locked and we can safely start moving iy. Since | 1025 | * OK, now the LEB is locked and we can safely start moving it. Since |
1026 | * this function utilizes thie @ubi->peb1_buf buffer which is shared | 1026 | * this function utilizes thie @ubi->peb1_buf buffer which is shared |
1027 | * with some other functions, so lock the buffer by taking the | 1027 | * with some other functions, so lock the buffer by taking the |
1028 | * @ubi->buf_mutex. | 1028 | * @ubi->buf_mutex. |
diff --git a/drivers/mtd/ubi/scan.c b/drivers/mtd/ubi/scan.c index 4f2daa5bbecf..41d47e1cf15c 100644 --- a/drivers/mtd/ubi/scan.c +++ b/drivers/mtd/ubi/scan.c | |||
@@ -320,7 +320,7 @@ static int compare_lebs(struct ubi_device *ubi, const struct ubi_scan_leb *seb, | |||
320 | } | 320 | } |
321 | 321 | ||
322 | err = ubi_io_read_data(ubi, buf, pnum, 0, len); | 322 | err = ubi_io_read_data(ubi, buf, pnum, 0, len); |
323 | if (err && err != UBI_IO_BITFLIPS) | 323 | if (err && err != UBI_IO_BITFLIPS && err != -EBADMSG) |
324 | goto out_free_buf; | 324 | goto out_free_buf; |
325 | 325 | ||
326 | data_crc = be32_to_cpu(vid_hdr->data_crc); | 326 | data_crc = be32_to_cpu(vid_hdr->data_crc); |
diff --git a/drivers/mtd/ubi/wl.c b/drivers/mtd/ubi/wl.c index 05d70937b543..dcb6dac1dc54 100644 --- a/drivers/mtd/ubi/wl.c +++ b/drivers/mtd/ubi/wl.c | |||
@@ -1396,7 +1396,8 @@ int ubi_thread(void *u) | |||
1396 | ubi_msg("%s: %d consecutive failures", | 1396 | ubi_msg("%s: %d consecutive failures", |
1397 | ubi->bgt_name, WL_MAX_FAILURES); | 1397 | ubi->bgt_name, WL_MAX_FAILURES); |
1398 | ubi_ro_mode(ubi); | 1398 | ubi_ro_mode(ubi); |
1399 | break; | 1399 | ubi->thread_enabled = 0; |
1400 | continue; | ||
1400 | } | 1401 | } |
1401 | } else | 1402 | } else |
1402 | failures = 0; | 1403 | failures = 0; |
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index 11f143f4adf6..231eeaf1d552 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig | |||
@@ -1825,9 +1825,10 @@ config FEC2 | |||
1825 | 1825 | ||
1826 | config FEC_MPC52xx | 1826 | config FEC_MPC52xx |
1827 | tristate "MPC52xx FEC driver" | 1827 | tristate "MPC52xx FEC driver" |
1828 | depends on PPC_MPC52xx && PPC_BESTCOMM_FEC | 1828 | depends on PPC_MPC52xx && PPC_BESTCOMM |
1829 | select CRC32 | 1829 | select CRC32 |
1830 | select PHYLIB | 1830 | select PHYLIB |
1831 | select PPC_BESTCOMM_FEC | ||
1831 | ---help--- | 1832 | ---help--- |
1832 | This option enables support for the MPC5200's on-chip | 1833 | This option enables support for the MPC5200's on-chip |
1833 | Fast Ethernet Controller | 1834 | Fast Ethernet Controller |
diff --git a/drivers/net/atl1e/atl1e_hw.c b/drivers/net/atl1e/atl1e_hw.c index 8cbc1b59bd62..4a7700620119 100644 --- a/drivers/net/atl1e/atl1e_hw.c +++ b/drivers/net/atl1e/atl1e_hw.c | |||
@@ -163,9 +163,6 @@ int atl1e_read_mac_addr(struct atl1e_hw *hw) | |||
163 | * atl1e_hash_mc_addr | 163 | * atl1e_hash_mc_addr |
164 | * purpose | 164 | * purpose |
165 | * set hash value for a multicast address | 165 | * set hash value for a multicast address |
166 | * hash calcu processing : | ||
167 | * 1. calcu 32bit CRC for multicast address | ||
168 | * 2. reverse crc with MSB to LSB | ||
169 | */ | 166 | */ |
170 | u32 atl1e_hash_mc_addr(struct atl1e_hw *hw, u8 *mc_addr) | 167 | u32 atl1e_hash_mc_addr(struct atl1e_hw *hw, u8 *mc_addr) |
171 | { | 168 | { |
@@ -174,7 +171,6 @@ u32 atl1e_hash_mc_addr(struct atl1e_hw *hw, u8 *mc_addr) | |||
174 | int i; | 171 | int i; |
175 | 172 | ||
176 | crc32 = ether_crc_le(6, mc_addr); | 173 | crc32 = ether_crc_le(6, mc_addr); |
177 | crc32 = ~crc32; | ||
178 | for (i = 0; i < 32; i++) | 174 | for (i = 0; i < 32; i++) |
179 | value |= (((crc32 >> i) & 1) << (31 - i)); | 175 | value |= (((crc32 >> i) & 1) << (31 - i)); |
180 | 176 | ||
diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c index 246d92b42636..aef403d299ee 100644 --- a/drivers/net/atlx/atl1.c +++ b/drivers/net/atlx/atl1.c | |||
@@ -3404,14 +3404,8 @@ static void atl1_get_wol(struct net_device *netdev, | |||
3404 | { | 3404 | { |
3405 | struct atl1_adapter *adapter = netdev_priv(netdev); | 3405 | struct atl1_adapter *adapter = netdev_priv(netdev); |
3406 | 3406 | ||
3407 | wol->supported = WAKE_UCAST | WAKE_MCAST | WAKE_BCAST | WAKE_MAGIC; | 3407 | wol->supported = WAKE_MAGIC; |
3408 | wol->wolopts = 0; | 3408 | wol->wolopts = 0; |
3409 | if (adapter->wol & ATLX_WUFC_EX) | ||
3410 | wol->wolopts |= WAKE_UCAST; | ||
3411 | if (adapter->wol & ATLX_WUFC_MC) | ||
3412 | wol->wolopts |= WAKE_MCAST; | ||
3413 | if (adapter->wol & ATLX_WUFC_BC) | ||
3414 | wol->wolopts |= WAKE_BCAST; | ||
3415 | if (adapter->wol & ATLX_WUFC_MAG) | 3409 | if (adapter->wol & ATLX_WUFC_MAG) |
3416 | wol->wolopts |= WAKE_MAGIC; | 3410 | wol->wolopts |= WAKE_MAGIC; |
3417 | return; | 3411 | return; |
@@ -3422,15 +3416,10 @@ static int atl1_set_wol(struct net_device *netdev, | |||
3422 | { | 3416 | { |
3423 | struct atl1_adapter *adapter = netdev_priv(netdev); | 3417 | struct atl1_adapter *adapter = netdev_priv(netdev); |
3424 | 3418 | ||
3425 | if (wol->wolopts & (WAKE_PHY | WAKE_ARP | WAKE_MAGICSECURE)) | 3419 | if (wol->wolopts & (WAKE_PHY | WAKE_UCAST | WAKE_MCAST | WAKE_BCAST | |
3420 | WAKE_ARP | WAKE_MAGICSECURE)) | ||
3426 | return -EOPNOTSUPP; | 3421 | return -EOPNOTSUPP; |
3427 | adapter->wol = 0; | 3422 | adapter->wol = 0; |
3428 | if (wol->wolopts & WAKE_UCAST) | ||
3429 | adapter->wol |= ATLX_WUFC_EX; | ||
3430 | if (wol->wolopts & WAKE_MCAST) | ||
3431 | adapter->wol |= ATLX_WUFC_MC; | ||
3432 | if (wol->wolopts & WAKE_BCAST) | ||
3433 | adapter->wol |= ATLX_WUFC_BC; | ||
3434 | if (wol->wolopts & WAKE_MAGIC) | 3423 | if (wol->wolopts & WAKE_MAGIC) |
3435 | adapter->wol |= ATLX_WUFC_MAG; | 3424 | adapter->wol |= ATLX_WUFC_MAG; |
3436 | return 0; | 3425 | return 0; |
diff --git a/drivers/net/atlx/atl2.c b/drivers/net/atlx/atl2.c index f5bdc92c1a65..8571e8c0bc67 100644 --- a/drivers/net/atlx/atl2.c +++ b/drivers/net/atlx/atl2.c | |||
@@ -1690,9 +1690,11 @@ static int atl2_resume(struct pci_dev *pdev) | |||
1690 | 1690 | ||
1691 | ATL2_WRITE_REG(&adapter->hw, REG_WOL_CTRL, 0); | 1691 | ATL2_WRITE_REG(&adapter->hw, REG_WOL_CTRL, 0); |
1692 | 1692 | ||
1693 | err = atl2_request_irq(adapter); | 1693 | if (netif_running(netdev)) { |
1694 | if (netif_running(netdev) && err) | 1694 | err = atl2_request_irq(adapter); |
1695 | return err; | 1695 | if (err) |
1696 | return err; | ||
1697 | } | ||
1696 | 1698 | ||
1697 | atl2_reset_hw(&adapter->hw); | 1699 | atl2_reset_hw(&adapter->hw); |
1698 | 1700 | ||
diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c index 430d430bce29..d07e3f148951 100644 --- a/drivers/net/bnx2.c +++ b/drivers/net/bnx2.c | |||
@@ -7204,10 +7204,13 @@ static void | |||
7204 | poll_bnx2(struct net_device *dev) | 7204 | poll_bnx2(struct net_device *dev) |
7205 | { | 7205 | { |
7206 | struct bnx2 *bp = netdev_priv(dev); | 7206 | struct bnx2 *bp = netdev_priv(dev); |
7207 | int i; | ||
7207 | 7208 | ||
7208 | disable_irq(bp->pdev->irq); | 7209 | for (i = 0; i < bp->irq_nvecs; i++) { |
7209 | bnx2_interrupt(bp->pdev->irq, dev); | 7210 | disable_irq(bp->irq_tbl[i].vector); |
7210 | enable_irq(bp->pdev->irq); | 7211 | bnx2_interrupt(bp->irq_tbl[i].vector, &bp->bnx2_napi[i]); |
7212 | enable_irq(bp->irq_tbl[i].vector); | ||
7213 | } | ||
7211 | } | 7214 | } |
7212 | #endif | 7215 | #endif |
7213 | 7216 | ||
diff --git a/drivers/net/cxgb3/cxgb3_main.c b/drivers/net/cxgb3/cxgb3_main.c index 1ace41a13ac3..2c341f83d327 100644 --- a/drivers/net/cxgb3/cxgb3_main.c +++ b/drivers/net/cxgb3/cxgb3_main.c | |||
@@ -1307,8 +1307,10 @@ static void get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) | |||
1307 | u32 fw_vers = 0; | 1307 | u32 fw_vers = 0; |
1308 | u32 tp_vers = 0; | 1308 | u32 tp_vers = 0; |
1309 | 1309 | ||
1310 | spin_lock(&adapter->stats_lock); | ||
1310 | t3_get_fw_version(adapter, &fw_vers); | 1311 | t3_get_fw_version(adapter, &fw_vers); |
1311 | t3_get_tp_version(adapter, &tp_vers); | 1312 | t3_get_tp_version(adapter, &tp_vers); |
1313 | spin_unlock(&adapter->stats_lock); | ||
1312 | 1314 | ||
1313 | strcpy(info->driver, DRV_NAME); | 1315 | strcpy(info->driver, DRV_NAME); |
1314 | strcpy(info->version, DRV_VERSION); | 1316 | strcpy(info->version, DRV_VERSION); |
@@ -2699,7 +2701,7 @@ static void set_nqsets(struct adapter *adap) | |||
2699 | int hwports = adap->params.nports; | 2701 | int hwports = adap->params.nports; |
2700 | int nqsets = SGE_QSETS; | 2702 | int nqsets = SGE_QSETS; |
2701 | 2703 | ||
2702 | if (adap->params.rev > 0) { | 2704 | if (adap->params.rev > 0 && adap->flags & USING_MSIX) { |
2703 | if (hwports == 2 && | 2705 | if (hwports == 2 && |
2704 | (hwports * nqsets > SGE_QSETS || | 2706 | (hwports * nqsets > SGE_QSETS || |
2705 | num_cpus >= nqsets / hwports)) | 2707 | num_cpus >= nqsets / hwports)) |
diff --git a/drivers/net/cxgb3/t3_hw.c b/drivers/net/cxgb3/t3_hw.c index 968f64be3743..9a0898b0dbce 100644 --- a/drivers/net/cxgb3/t3_hw.c +++ b/drivers/net/cxgb3/t3_hw.c | |||
@@ -572,7 +572,7 @@ struct t3_vpd { | |||
572 | u32 pad; /* for multiple-of-4 sizing and alignment */ | 572 | u32 pad; /* for multiple-of-4 sizing and alignment */ |
573 | }; | 573 | }; |
574 | 574 | ||
575 | #define EEPROM_MAX_POLL 4 | 575 | #define EEPROM_MAX_POLL 40 |
576 | #define EEPROM_STAT_ADDR 0x4000 | 576 | #define EEPROM_STAT_ADDR 0x4000 |
577 | #define VPD_BASE 0xc00 | 577 | #define VPD_BASE 0xc00 |
578 | 578 | ||
@@ -3690,6 +3690,12 @@ int t3_prep_adapter(struct adapter *adapter, const struct adapter_info *ai, | |||
3690 | ; | 3690 | ; |
3691 | 3691 | ||
3692 | pti = &port_types[adapter->params.vpd.port_type[j]]; | 3692 | pti = &port_types[adapter->params.vpd.port_type[j]]; |
3693 | if (!pti->phy_prep) { | ||
3694 | CH_ALERT(adapter, "Invalid port type index %d\n", | ||
3695 | adapter->params.vpd.port_type[j]); | ||
3696 | return -EINVAL; | ||
3697 | } | ||
3698 | |||
3693 | ret = pti->phy_prep(&p->phy, adapter, ai->phy_base_addr + j, | 3699 | ret = pti->phy_prep(&p->phy, adapter, ai->phy_base_addr + j, |
3694 | ai->mdio_ops); | 3700 | ai->mdio_ops); |
3695 | if (ret) | 3701 | if (ret) |
diff --git a/drivers/net/e100.c b/drivers/net/e100.c index 3d69fae781cf..e8bfcce6b319 100644 --- a/drivers/net/e100.c +++ b/drivers/net/e100.c | |||
@@ -166,7 +166,7 @@ | |||
166 | 166 | ||
167 | #define DRV_NAME "e100" | 167 | #define DRV_NAME "e100" |
168 | #define DRV_EXT "-NAPI" | 168 | #define DRV_EXT "-NAPI" |
169 | #define DRV_VERSION "3.5.23-k4"DRV_EXT | 169 | #define DRV_VERSION "3.5.23-k6"DRV_EXT |
170 | #define DRV_DESCRIPTION "Intel(R) PRO/100 Network Driver" | 170 | #define DRV_DESCRIPTION "Intel(R) PRO/100 Network Driver" |
171 | #define DRV_COPYRIGHT "Copyright(c) 1999-2006 Intel Corporation" | 171 | #define DRV_COPYRIGHT "Copyright(c) 1999-2006 Intel Corporation" |
172 | #define PFX DRV_NAME ": " | 172 | #define PFX DRV_NAME ": " |
@@ -1804,7 +1804,7 @@ static int e100_rx_alloc_skb(struct nic *nic, struct rx *rx) | |||
1804 | struct rfd *prev_rfd = (struct rfd *)rx->prev->skb->data; | 1804 | struct rfd *prev_rfd = (struct rfd *)rx->prev->skb->data; |
1805 | put_unaligned_le32(rx->dma_addr, &prev_rfd->link); | 1805 | put_unaligned_le32(rx->dma_addr, &prev_rfd->link); |
1806 | pci_dma_sync_single_for_device(nic->pdev, rx->prev->dma_addr, | 1806 | pci_dma_sync_single_for_device(nic->pdev, rx->prev->dma_addr, |
1807 | sizeof(struct rfd), PCI_DMA_TODEVICE); | 1807 | sizeof(struct rfd), PCI_DMA_BIDIRECTIONAL); |
1808 | } | 1808 | } |
1809 | 1809 | ||
1810 | return 0; | 1810 | return 0; |
@@ -1823,7 +1823,7 @@ static int e100_rx_indicate(struct nic *nic, struct rx *rx, | |||
1823 | 1823 | ||
1824 | /* Need to sync before taking a peek at cb_complete bit */ | 1824 | /* Need to sync before taking a peek at cb_complete bit */ |
1825 | pci_dma_sync_single_for_cpu(nic->pdev, rx->dma_addr, | 1825 | pci_dma_sync_single_for_cpu(nic->pdev, rx->dma_addr, |
1826 | sizeof(struct rfd), PCI_DMA_FROMDEVICE); | 1826 | sizeof(struct rfd), PCI_DMA_BIDIRECTIONAL); |
1827 | rfd_status = le16_to_cpu(rfd->status); | 1827 | rfd_status = le16_to_cpu(rfd->status); |
1828 | 1828 | ||
1829 | DPRINTK(RX_STATUS, DEBUG, "status=0x%04X\n", rfd_status); | 1829 | DPRINTK(RX_STATUS, DEBUG, "status=0x%04X\n", rfd_status); |
@@ -1850,7 +1850,7 @@ static int e100_rx_indicate(struct nic *nic, struct rx *rx, | |||
1850 | 1850 | ||
1851 | /* Get data */ | 1851 | /* Get data */ |
1852 | pci_unmap_single(nic->pdev, rx->dma_addr, | 1852 | pci_unmap_single(nic->pdev, rx->dma_addr, |
1853 | RFD_BUF_LEN, PCI_DMA_FROMDEVICE); | 1853 | RFD_BUF_LEN, PCI_DMA_BIDIRECTIONAL); |
1854 | 1854 | ||
1855 | /* If this buffer has the el bit, but we think the receiver | 1855 | /* If this buffer has the el bit, but we think the receiver |
1856 | * is still running, check to see if it really stopped while | 1856 | * is still running, check to see if it really stopped while |
@@ -1943,7 +1943,7 @@ static void e100_rx_clean(struct nic *nic, unsigned int *work_done, | |||
1943 | new_before_last_rfd->command |= cpu_to_le16(cb_el); | 1943 | new_before_last_rfd->command |= cpu_to_le16(cb_el); |
1944 | pci_dma_sync_single_for_device(nic->pdev, | 1944 | pci_dma_sync_single_for_device(nic->pdev, |
1945 | new_before_last_rx->dma_addr, sizeof(struct rfd), | 1945 | new_before_last_rx->dma_addr, sizeof(struct rfd), |
1946 | PCI_DMA_TODEVICE); | 1946 | PCI_DMA_BIDIRECTIONAL); |
1947 | 1947 | ||
1948 | /* Now that we have a new stopping point, we can clear the old | 1948 | /* Now that we have a new stopping point, we can clear the old |
1949 | * stopping point. We must sync twice to get the proper | 1949 | * stopping point. We must sync twice to get the proper |
@@ -1951,11 +1951,11 @@ static void e100_rx_clean(struct nic *nic, unsigned int *work_done, | |||
1951 | old_before_last_rfd->command &= ~cpu_to_le16(cb_el); | 1951 | old_before_last_rfd->command &= ~cpu_to_le16(cb_el); |
1952 | pci_dma_sync_single_for_device(nic->pdev, | 1952 | pci_dma_sync_single_for_device(nic->pdev, |
1953 | old_before_last_rx->dma_addr, sizeof(struct rfd), | 1953 | old_before_last_rx->dma_addr, sizeof(struct rfd), |
1954 | PCI_DMA_TODEVICE); | 1954 | PCI_DMA_BIDIRECTIONAL); |
1955 | old_before_last_rfd->size = cpu_to_le16(VLAN_ETH_FRAME_LEN); | 1955 | old_before_last_rfd->size = cpu_to_le16(VLAN_ETH_FRAME_LEN); |
1956 | pci_dma_sync_single_for_device(nic->pdev, | 1956 | pci_dma_sync_single_for_device(nic->pdev, |
1957 | old_before_last_rx->dma_addr, sizeof(struct rfd), | 1957 | old_before_last_rx->dma_addr, sizeof(struct rfd), |
1958 | PCI_DMA_TODEVICE); | 1958 | PCI_DMA_BIDIRECTIONAL); |
1959 | } | 1959 | } |
1960 | 1960 | ||
1961 | if(restart_required) { | 1961 | if(restart_required) { |
@@ -1978,7 +1978,7 @@ static void e100_rx_clean_list(struct nic *nic) | |||
1978 | for(rx = nic->rxs, i = 0; i < count; rx++, i++) { | 1978 | for(rx = nic->rxs, i = 0; i < count; rx++, i++) { |
1979 | if(rx->skb) { | 1979 | if(rx->skb) { |
1980 | pci_unmap_single(nic->pdev, rx->dma_addr, | 1980 | pci_unmap_single(nic->pdev, rx->dma_addr, |
1981 | RFD_BUF_LEN, PCI_DMA_FROMDEVICE); | 1981 | RFD_BUF_LEN, PCI_DMA_BIDIRECTIONAL); |
1982 | dev_kfree_skb(rx->skb); | 1982 | dev_kfree_skb(rx->skb); |
1983 | } | 1983 | } |
1984 | } | 1984 | } |
@@ -2021,7 +2021,7 @@ static int e100_rx_alloc_list(struct nic *nic) | |||
2021 | before_last->command |= cpu_to_le16(cb_el); | 2021 | before_last->command |= cpu_to_le16(cb_el); |
2022 | before_last->size = 0; | 2022 | before_last->size = 0; |
2023 | pci_dma_sync_single_for_device(nic->pdev, rx->dma_addr, | 2023 | pci_dma_sync_single_for_device(nic->pdev, rx->dma_addr, |
2024 | sizeof(struct rfd), PCI_DMA_TODEVICE); | 2024 | sizeof(struct rfd), PCI_DMA_BIDIRECTIONAL); |
2025 | 2025 | ||
2026 | nic->rx_to_use = nic->rx_to_clean = nic->rxs; | 2026 | nic->rx_to_use = nic->rx_to_clean = nic->rxs; |
2027 | nic->ru_running = RU_SUSPENDED; | 2027 | nic->ru_running = RU_SUSPENDED; |
@@ -2222,7 +2222,7 @@ static int e100_loopback_test(struct nic *nic, enum loopback loopback_mode) | |||
2222 | msleep(10); | 2222 | msleep(10); |
2223 | 2223 | ||
2224 | pci_dma_sync_single_for_cpu(nic->pdev, nic->rx_to_clean->dma_addr, | 2224 | pci_dma_sync_single_for_cpu(nic->pdev, nic->rx_to_clean->dma_addr, |
2225 | RFD_BUF_LEN, PCI_DMA_FROMDEVICE); | 2225 | RFD_BUF_LEN, PCI_DMA_BIDIRECTIONAL); |
2226 | 2226 | ||
2227 | if(memcmp(nic->rx_to_clean->skb->data + sizeof(struct rfd), | 2227 | if(memcmp(nic->rx_to_clean->skb->data + sizeof(struct rfd), |
2228 | skb->data, ETH_DATA_LEN)) | 2228 | skb->data, ETH_DATA_LEN)) |
diff --git a/drivers/net/e1000/e1000_ethtool.c b/drivers/net/e1000/e1000_ethtool.c index 6a3893acfe04..c854c96f5ab3 100644 --- a/drivers/net/e1000/e1000_ethtool.c +++ b/drivers/net/e1000/e1000_ethtool.c | |||
@@ -1774,7 +1774,8 @@ static void e1000_get_wol(struct net_device *netdev, | |||
1774 | 1774 | ||
1775 | /* this function will set ->supported = 0 and return 1 if wol is not | 1775 | /* this function will set ->supported = 0 and return 1 if wol is not |
1776 | * supported by this hardware */ | 1776 | * supported by this hardware */ |
1777 | if (e1000_wol_exclusion(adapter, wol)) | 1777 | if (e1000_wol_exclusion(adapter, wol) || |
1778 | !device_can_wakeup(&adapter->pdev->dev)) | ||
1778 | return; | 1779 | return; |
1779 | 1780 | ||
1780 | /* apply any specific unsupported masks here */ | 1781 | /* apply any specific unsupported masks here */ |
@@ -1811,7 +1812,8 @@ static int e1000_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) | |||
1811 | if (wol->wolopts & (WAKE_PHY | WAKE_ARP | WAKE_MAGICSECURE)) | 1812 | if (wol->wolopts & (WAKE_PHY | WAKE_ARP | WAKE_MAGICSECURE)) |
1812 | return -EOPNOTSUPP; | 1813 | return -EOPNOTSUPP; |
1813 | 1814 | ||
1814 | if (e1000_wol_exclusion(adapter, wol)) | 1815 | if (e1000_wol_exclusion(adapter, wol) || |
1816 | !device_can_wakeup(&adapter->pdev->dev)) | ||
1815 | return wol->wolopts ? -EOPNOTSUPP : 0; | 1817 | return wol->wolopts ? -EOPNOTSUPP : 0; |
1816 | 1818 | ||
1817 | switch (hw->device_id) { | 1819 | switch (hw->device_id) { |
@@ -1838,6 +1840,8 @@ static int e1000_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) | |||
1838 | if (wol->wolopts & WAKE_MAGIC) | 1840 | if (wol->wolopts & WAKE_MAGIC) |
1839 | adapter->wol |= E1000_WUFC_MAG; | 1841 | adapter->wol |= E1000_WUFC_MAG; |
1840 | 1842 | ||
1843 | device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol); | ||
1844 | |||
1841 | return 0; | 1845 | return 0; |
1842 | } | 1846 | } |
1843 | 1847 | ||
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c index fac82152e4c8..872799b746f5 100644 --- a/drivers/net/e1000/e1000_main.c +++ b/drivers/net/e1000/e1000_main.c | |||
@@ -1179,6 +1179,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev, | |||
1179 | 1179 | ||
1180 | /* initialize the wol settings based on the eeprom settings */ | 1180 | /* initialize the wol settings based on the eeprom settings */ |
1181 | adapter->wol = adapter->eeprom_wol; | 1181 | adapter->wol = adapter->eeprom_wol; |
1182 | device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol); | ||
1182 | 1183 | ||
1183 | /* print bus type/speed/width info */ | 1184 | /* print bus type/speed/width info */ |
1184 | DPRINTK(PROBE, INFO, "(PCI%s:%s:%s) ", | 1185 | DPRINTK(PROBE, INFO, "(PCI%s:%s:%s) ", |
diff --git a/drivers/net/e1000e/e1000.h b/drivers/net/e1000e/e1000.h index c55de1c027af..c55fd6fdb91c 100644 --- a/drivers/net/e1000e/e1000.h +++ b/drivers/net/e1000e/e1000.h | |||
@@ -299,6 +299,7 @@ struct e1000_adapter { | |||
299 | unsigned long led_status; | 299 | unsigned long led_status; |
300 | 300 | ||
301 | unsigned int flags; | 301 | unsigned int flags; |
302 | unsigned int flags2; | ||
302 | struct work_struct downshift_task; | 303 | struct work_struct downshift_task; |
303 | struct work_struct update_phy_task; | 304 | struct work_struct update_phy_task; |
304 | }; | 305 | }; |
@@ -306,6 +307,7 @@ struct e1000_adapter { | |||
306 | struct e1000_info { | 307 | struct e1000_info { |
307 | enum e1000_mac_type mac; | 308 | enum e1000_mac_type mac; |
308 | unsigned int flags; | 309 | unsigned int flags; |
310 | unsigned int flags2; | ||
309 | u32 pba; | 311 | u32 pba; |
310 | s32 (*get_variants)(struct e1000_adapter *); | 312 | s32 (*get_variants)(struct e1000_adapter *); |
311 | struct e1000_mac_operations *mac_ops; | 313 | struct e1000_mac_operations *mac_ops; |
@@ -347,6 +349,9 @@ struct e1000_info { | |||
347 | #define FLAG_RX_RESTART_NOW (1 << 30) | 349 | #define FLAG_RX_RESTART_NOW (1 << 30) |
348 | #define FLAG_MSI_TEST_FAILED (1 << 31) | 350 | #define FLAG_MSI_TEST_FAILED (1 << 31) |
349 | 351 | ||
352 | /* CRC Stripping defines */ | ||
353 | #define FLAG2_CRC_STRIPPING (1 << 0) | ||
354 | |||
350 | #define E1000_RX_DESC_PS(R, i) \ | 355 | #define E1000_RX_DESC_PS(R, i) \ |
351 | (&(((union e1000_rx_desc_packet_split *)((R).desc))[i])) | 356 | (&(((union e1000_rx_desc_packet_split *)((R).desc))[i])) |
352 | #define E1000_GET_DESC(R, i, type) (&(((struct type *)((R).desc))[i])) | 357 | #define E1000_GET_DESC(R, i, type) (&(((struct type *)((R).desc))[i])) |
diff --git a/drivers/net/e1000e/ethtool.c b/drivers/net/e1000e/ethtool.c index 70c11c811a08..62421ce96311 100644 --- a/drivers/net/e1000e/ethtool.c +++ b/drivers/net/e1000e/ethtool.c | |||
@@ -1713,7 +1713,8 @@ static void e1000_get_wol(struct net_device *netdev, | |||
1713 | wol->supported = 0; | 1713 | wol->supported = 0; |
1714 | wol->wolopts = 0; | 1714 | wol->wolopts = 0; |
1715 | 1715 | ||
1716 | if (!(adapter->flags & FLAG_HAS_WOL)) | 1716 | if (!(adapter->flags & FLAG_HAS_WOL) || |
1717 | !device_can_wakeup(&adapter->pdev->dev)) | ||
1717 | return; | 1718 | return; |
1718 | 1719 | ||
1719 | wol->supported = WAKE_UCAST | WAKE_MCAST | | 1720 | wol->supported = WAKE_UCAST | WAKE_MCAST | |
@@ -1751,7 +1752,8 @@ static int e1000_set_wol(struct net_device *netdev, | |||
1751 | if (wol->wolopts & WAKE_MAGICSECURE) | 1752 | if (wol->wolopts & WAKE_MAGICSECURE) |
1752 | return -EOPNOTSUPP; | 1753 | return -EOPNOTSUPP; |
1753 | 1754 | ||
1754 | if (!(adapter->flags & FLAG_HAS_WOL)) | 1755 | if (!(adapter->flags & FLAG_HAS_WOL) || |
1756 | !device_can_wakeup(&adapter->pdev->dev)) | ||
1755 | return wol->wolopts ? -EOPNOTSUPP : 0; | 1757 | return wol->wolopts ? -EOPNOTSUPP : 0; |
1756 | 1758 | ||
1757 | /* these settings will always override what we currently have */ | 1759 | /* these settings will always override what we currently have */ |
@@ -1770,6 +1772,8 @@ static int e1000_set_wol(struct net_device *netdev, | |||
1770 | if (wol->wolopts & WAKE_ARP) | 1772 | if (wol->wolopts & WAKE_ARP) |
1771 | adapter->wol |= E1000_WUFC_ARP; | 1773 | adapter->wol |= E1000_WUFC_ARP; |
1772 | 1774 | ||
1775 | device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol); | ||
1776 | |||
1773 | return 0; | 1777 | return 0; |
1774 | } | 1778 | } |
1775 | 1779 | ||
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c index abd492b7336d..91795f78c3e4 100644 --- a/drivers/net/e1000e/netdev.c +++ b/drivers/net/e1000e/netdev.c | |||
@@ -499,6 +499,10 @@ static bool e1000_clean_rx_irq(struct e1000_adapter *adapter, | |||
499 | goto next_desc; | 499 | goto next_desc; |
500 | } | 500 | } |
501 | 501 | ||
502 | /* adjust length to remove Ethernet CRC */ | ||
503 | if (!(adapter->flags2 & FLAG2_CRC_STRIPPING)) | ||
504 | length -= 4; | ||
505 | |||
502 | total_rx_bytes += length; | 506 | total_rx_bytes += length; |
503 | total_rx_packets++; | 507 | total_rx_packets++; |
504 | 508 | ||
@@ -804,6 +808,10 @@ static bool e1000_clean_rx_irq_ps(struct e1000_adapter *adapter, | |||
804 | pci_dma_sync_single_for_device(pdev, ps_page->dma, | 808 | pci_dma_sync_single_for_device(pdev, ps_page->dma, |
805 | PAGE_SIZE, PCI_DMA_FROMDEVICE); | 809 | PAGE_SIZE, PCI_DMA_FROMDEVICE); |
806 | 810 | ||
811 | /* remove the CRC */ | ||
812 | if (!(adapter->flags2 & FLAG2_CRC_STRIPPING)) | ||
813 | l1 -= 4; | ||
814 | |||
807 | skb_put(skb, l1); | 815 | skb_put(skb, l1); |
808 | goto copydone; | 816 | goto copydone; |
809 | } /* if */ | 817 | } /* if */ |
@@ -825,6 +833,12 @@ static bool e1000_clean_rx_irq_ps(struct e1000_adapter *adapter, | |||
825 | skb->truesize += length; | 833 | skb->truesize += length; |
826 | } | 834 | } |
827 | 835 | ||
836 | /* strip the ethernet crc, problem is we're using pages now so | ||
837 | * this whole operation can get a little cpu intensive | ||
838 | */ | ||
839 | if (!(adapter->flags2 & FLAG2_CRC_STRIPPING)) | ||
840 | pskb_trim(skb, skb->len - 4); | ||
841 | |||
828 | copydone: | 842 | copydone: |
829 | total_rx_bytes += skb->len; | 843 | total_rx_bytes += skb->len; |
830 | total_rx_packets++; | 844 | total_rx_packets++; |
@@ -2301,8 +2315,12 @@ static void e1000_setup_rctl(struct e1000_adapter *adapter) | |||
2301 | else | 2315 | else |
2302 | rctl |= E1000_RCTL_LPE; | 2316 | rctl |= E1000_RCTL_LPE; |
2303 | 2317 | ||
2304 | /* Enable hardware CRC frame stripping */ | 2318 | /* Some systems expect that the CRC is included in SMBUS traffic. The |
2305 | rctl |= E1000_RCTL_SECRC; | 2319 | * hardware strips the CRC before sending to both SMBUS (BMC) and to |
2320 | * host memory when this is enabled | ||
2321 | */ | ||
2322 | if (adapter->flags2 & FLAG2_CRC_STRIPPING) | ||
2323 | rctl |= E1000_RCTL_SECRC; | ||
2306 | 2324 | ||
2307 | /* Setup buffer sizes */ | 2325 | /* Setup buffer sizes */ |
2308 | rctl &= ~E1000_RCTL_SZ_4096; | 2326 | rctl &= ~E1000_RCTL_SZ_4096; |
@@ -4766,6 +4784,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev, | |||
4766 | adapter->ei = ei; | 4784 | adapter->ei = ei; |
4767 | adapter->pba = ei->pba; | 4785 | adapter->pba = ei->pba; |
4768 | adapter->flags = ei->flags; | 4786 | adapter->flags = ei->flags; |
4787 | adapter->flags2 = ei->flags2; | ||
4769 | adapter->hw.adapter = adapter; | 4788 | adapter->hw.adapter = adapter; |
4770 | adapter->hw.mac.type = ei->mac; | 4789 | adapter->hw.mac.type = ei->mac; |
4771 | adapter->msg_enable = (1 << NETIF_MSG_DRV | NETIF_MSG_PROBE) - 1; | 4790 | adapter->msg_enable = (1 << NETIF_MSG_DRV | NETIF_MSG_PROBE) - 1; |
@@ -4970,6 +4989,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev, | |||
4970 | 4989 | ||
4971 | /* initialize the wol settings based on the eeprom settings */ | 4990 | /* initialize the wol settings based on the eeprom settings */ |
4972 | adapter->wol = adapter->eeprom_wol; | 4991 | adapter->wol = adapter->eeprom_wol; |
4992 | device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol); | ||
4973 | 4993 | ||
4974 | /* reset the hardware with the new settings */ | 4994 | /* reset the hardware with the new settings */ |
4975 | e1000e_reset(adapter); | 4995 | e1000e_reset(adapter); |
@@ -5008,6 +5028,7 @@ err_hw_init: | |||
5008 | err_sw_init: | 5028 | err_sw_init: |
5009 | if (adapter->hw.flash_address) | 5029 | if (adapter->hw.flash_address) |
5010 | iounmap(adapter->hw.flash_address); | 5030 | iounmap(adapter->hw.flash_address); |
5031 | e1000e_reset_interrupt_capability(adapter); | ||
5011 | err_flashmap: | 5032 | err_flashmap: |
5012 | iounmap(adapter->hw.hw_addr); | 5033 | iounmap(adapter->hw.hw_addr); |
5013 | err_ioremap: | 5034 | err_ioremap: |
diff --git a/drivers/net/e1000e/param.c b/drivers/net/e1000e/param.c index 77a3d7207a5f..e909f96698e8 100644 --- a/drivers/net/e1000e/param.c +++ b/drivers/net/e1000e/param.c | |||
@@ -151,6 +151,16 @@ E1000_PARAM(KumeranLockLoss, "Enable Kumeran lock loss workaround"); | |||
151 | */ | 151 | */ |
152 | E1000_PARAM(WriteProtectNVM, "Write-protect NVM [WARNING: disabling this can lead to corrupted NVM]"); | 152 | E1000_PARAM(WriteProtectNVM, "Write-protect NVM [WARNING: disabling this can lead to corrupted NVM]"); |
153 | 153 | ||
154 | /* | ||
155 | * Enable CRC Stripping | ||
156 | * | ||
157 | * Valid Range: 0, 1 | ||
158 | * | ||
159 | * Default Value: 1 (enabled) | ||
160 | */ | ||
161 | E1000_PARAM(CrcStripping, "Enable CRC Stripping, disable if your BMC needs " \ | ||
162 | "the CRC"); | ||
163 | |||
154 | struct e1000_option { | 164 | struct e1000_option { |
155 | enum { enable_option, range_option, list_option } type; | 165 | enum { enable_option, range_option, list_option } type; |
156 | const char *name; | 166 | const char *name; |
@@ -404,6 +414,21 @@ void __devinit e1000e_check_options(struct e1000_adapter *adapter) | |||
404 | adapter->flags |= FLAG_SMART_POWER_DOWN; | 414 | adapter->flags |= FLAG_SMART_POWER_DOWN; |
405 | } | 415 | } |
406 | } | 416 | } |
417 | { /* CRC Stripping */ | ||
418 | const struct e1000_option opt = { | ||
419 | .type = enable_option, | ||
420 | .name = "CRC Stripping", | ||
421 | .err = "defaulting to enabled", | ||
422 | .def = OPTION_ENABLED | ||
423 | }; | ||
424 | |||
425 | if (num_CrcStripping > bd) { | ||
426 | unsigned int crc_stripping = CrcStripping[bd]; | ||
427 | e1000_validate_option(&crc_stripping, &opt, adapter); | ||
428 | if (crc_stripping == OPTION_ENABLED) | ||
429 | adapter->flags2 |= FLAG2_CRC_STRIPPING; | ||
430 | } | ||
431 | } | ||
407 | { /* Kumeran Lock Loss Workaround */ | 432 | { /* Kumeran Lock Loss Workaround */ |
408 | const struct e1000_option opt = { | 433 | const struct e1000_option opt = { |
409 | .type = enable_option, | 434 | .type = enable_option, |
diff --git a/drivers/net/gianfar.c b/drivers/net/gianfar.c index 83a5cb6aa23b..c4af949bf860 100644 --- a/drivers/net/gianfar.c +++ b/drivers/net/gianfar.c | |||
@@ -1407,6 +1407,10 @@ static int gfar_clean_tx_ring(struct net_device *dev) | |||
1407 | if (bdp->status & TXBD_DEF) | 1407 | if (bdp->status & TXBD_DEF) |
1408 | dev->stats.collisions++; | 1408 | dev->stats.collisions++; |
1409 | 1409 | ||
1410 | /* Unmap the DMA memory */ | ||
1411 | dma_unmap_single(&priv->dev->dev, bdp->bufPtr, | ||
1412 | bdp->length, DMA_TO_DEVICE); | ||
1413 | |||
1410 | /* Free the sk buffer associated with this TxBD */ | 1414 | /* Free the sk buffer associated with this TxBD */ |
1411 | dev_kfree_skb_irq(priv->tx_skbuff[priv->skb_dirtytx]); | 1415 | dev_kfree_skb_irq(priv->tx_skbuff[priv->skb_dirtytx]); |
1412 | 1416 | ||
@@ -1666,6 +1670,9 @@ int gfar_clean_rx_ring(struct net_device *dev, int rx_work_limit) | |||
1666 | 1670 | ||
1667 | skb = priv->rx_skbuff[priv->skb_currx]; | 1671 | skb = priv->rx_skbuff[priv->skb_currx]; |
1668 | 1672 | ||
1673 | dma_unmap_single(&priv->dev->dev, bdp->bufPtr, | ||
1674 | priv->rx_buffer_size, DMA_FROM_DEVICE); | ||
1675 | |||
1669 | /* We drop the frame if we failed to allocate a new buffer */ | 1676 | /* We drop the frame if we failed to allocate a new buffer */ |
1670 | if (unlikely(!newskb || !(bdp->status & RXBD_LAST) || | 1677 | if (unlikely(!newskb || !(bdp->status & RXBD_LAST) || |
1671 | bdp->status & RXBD_ERR)) { | 1678 | bdp->status & RXBD_ERR)) { |
@@ -1674,14 +1681,8 @@ int gfar_clean_rx_ring(struct net_device *dev, int rx_work_limit) | |||
1674 | if (unlikely(!newskb)) | 1681 | if (unlikely(!newskb)) |
1675 | newskb = skb; | 1682 | newskb = skb; |
1676 | 1683 | ||
1677 | if (skb) { | 1684 | if (skb) |
1678 | dma_unmap_single(&priv->dev->dev, | ||
1679 | bdp->bufPtr, | ||
1680 | priv->rx_buffer_size, | ||
1681 | DMA_FROM_DEVICE); | ||
1682 | |||
1683 | dev_kfree_skb_any(skb); | 1685 | dev_kfree_skb_any(skb); |
1684 | } | ||
1685 | } else { | 1686 | } else { |
1686 | /* Increment the number of packets */ | 1687 | /* Increment the number of packets */ |
1687 | dev->stats.rx_packets++; | 1688 | dev->stats.rx_packets++; |
diff --git a/drivers/net/igb/igb_ethtool.c b/drivers/net/igb/igb_ethtool.c index 58906c984be9..89964fa739a0 100644 --- a/drivers/net/igb/igb_ethtool.c +++ b/drivers/net/igb/igb_ethtool.c | |||
@@ -1776,7 +1776,8 @@ static void igb_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) | |||
1776 | 1776 | ||
1777 | /* this function will set ->supported = 0 and return 1 if wol is not | 1777 | /* this function will set ->supported = 0 and return 1 if wol is not |
1778 | * supported by this hardware */ | 1778 | * supported by this hardware */ |
1779 | if (igb_wol_exclusion(adapter, wol)) | 1779 | if (igb_wol_exclusion(adapter, wol) || |
1780 | !device_can_wakeup(&adapter->pdev->dev)) | ||
1780 | return; | 1781 | return; |
1781 | 1782 | ||
1782 | /* apply any specific unsupported masks here */ | 1783 | /* apply any specific unsupported masks here */ |
@@ -1805,7 +1806,8 @@ static int igb_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) | |||
1805 | if (wol->wolopts & (WAKE_PHY | WAKE_ARP | WAKE_MAGICSECURE)) | 1806 | if (wol->wolopts & (WAKE_PHY | WAKE_ARP | WAKE_MAGICSECURE)) |
1806 | return -EOPNOTSUPP; | 1807 | return -EOPNOTSUPP; |
1807 | 1808 | ||
1808 | if (igb_wol_exclusion(adapter, wol)) | 1809 | if (igb_wol_exclusion(adapter, wol) || |
1810 | !device_can_wakeup(&adapter->pdev->dev)) | ||
1809 | return wol->wolopts ? -EOPNOTSUPP : 0; | 1811 | return wol->wolopts ? -EOPNOTSUPP : 0; |
1810 | 1812 | ||
1811 | switch (hw->device_id) { | 1813 | switch (hw->device_id) { |
@@ -1825,6 +1827,8 @@ static int igb_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) | |||
1825 | if (wol->wolopts & WAKE_MAGIC) | 1827 | if (wol->wolopts & WAKE_MAGIC) |
1826 | adapter->wol |= E1000_WUFC_MAG; | 1828 | adapter->wol |= E1000_WUFC_MAG; |
1827 | 1829 | ||
1830 | device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol); | ||
1831 | |||
1828 | return 0; | 1832 | return 0; |
1829 | } | 1833 | } |
1830 | 1834 | ||
diff --git a/drivers/net/igb/igb_main.c b/drivers/net/igb/igb_main.c index 1f397cd99414..1cbae85b1426 100644 --- a/drivers/net/igb/igb_main.c +++ b/drivers/net/igb/igb_main.c | |||
@@ -1019,10 +1019,9 @@ static int __devinit igb_probe(struct pci_dev *pdev, | |||
1019 | state &= ~PCIE_LINK_STATE_L0S; | 1019 | state &= ~PCIE_LINK_STATE_L0S; |
1020 | pci_write_config_word(us_dev, pos + PCI_EXP_LNKCTL, | 1020 | pci_write_config_word(us_dev, pos + PCI_EXP_LNKCTL, |
1021 | state); | 1021 | state); |
1022 | printk(KERN_INFO "Disabling ASPM L0s upstream switch " | 1022 | dev_info(&pdev->dev, |
1023 | "port %x:%x.%x\n", us_dev->bus->number, | 1023 | "Disabling ASPM L0s upstream switch port %s\n", |
1024 | PCI_SLOT(us_dev->devfn), | 1024 | pci_name(us_dev)); |
1025 | PCI_FUNC(us_dev->devfn)); | ||
1026 | } | 1025 | } |
1027 | default: | 1026 | default: |
1028 | break; | 1027 | break; |
@@ -1244,6 +1243,7 @@ static int __devinit igb_probe(struct pci_dev *pdev, | |||
1244 | 1243 | ||
1245 | /* initialize the wol settings based on the eeprom settings */ | 1244 | /* initialize the wol settings based on the eeprom settings */ |
1246 | adapter->wol = adapter->eeprom_wol; | 1245 | adapter->wol = adapter->eeprom_wol; |
1246 | device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol); | ||
1247 | 1247 | ||
1248 | /* reset the hardware with the new settings */ | 1248 | /* reset the hardware with the new settings */ |
1249 | igb_reset(adapter); | 1249 | igb_reset(adapter); |
diff --git a/drivers/net/ipg.c b/drivers/net/ipg.c index 7373dafbb3f7..059369885be1 100644 --- a/drivers/net/ipg.c +++ b/drivers/net/ipg.c | |||
@@ -1112,7 +1112,7 @@ static void ipg_nic_rx_free_skb(struct net_device *dev) | |||
1112 | struct ipg_rx *rxfd = sp->rxd + entry; | 1112 | struct ipg_rx *rxfd = sp->rxd + entry; |
1113 | 1113 | ||
1114 | pci_unmap_single(sp->pdev, | 1114 | pci_unmap_single(sp->pdev, |
1115 | le64_to_cpu(rxfd->frag_info & ~IPG_RFI_FRAGLEN), | 1115 | le64_to_cpu(rxfd->frag_info) & ~IPG_RFI_FRAGLEN, |
1116 | sp->rx_buf_sz, PCI_DMA_FROMDEVICE); | 1116 | sp->rx_buf_sz, PCI_DMA_FROMDEVICE); |
1117 | dev_kfree_skb_irq(sp->rx_buff[entry]); | 1117 | dev_kfree_skb_irq(sp->rx_buff[entry]); |
1118 | sp->rx_buff[entry] = NULL; | 1118 | sp->rx_buff[entry] = NULL; |
@@ -1179,7 +1179,7 @@ static int ipg_nic_rx_check_error(struct net_device *dev) | |||
1179 | */ | 1179 | */ |
1180 | if (sp->rx_buff[entry]) { | 1180 | if (sp->rx_buff[entry]) { |
1181 | pci_unmap_single(sp->pdev, | 1181 | pci_unmap_single(sp->pdev, |
1182 | le64_to_cpu(rxfd->frag_info & ~IPG_RFI_FRAGLEN), | 1182 | le64_to_cpu(rxfd->frag_info) & ~IPG_RFI_FRAGLEN, |
1183 | sp->rx_buf_sz, PCI_DMA_FROMDEVICE); | 1183 | sp->rx_buf_sz, PCI_DMA_FROMDEVICE); |
1184 | 1184 | ||
1185 | dev_kfree_skb_irq(sp->rx_buff[entry]); | 1185 | dev_kfree_skb_irq(sp->rx_buff[entry]); |
@@ -1246,7 +1246,7 @@ static void ipg_nic_rx_with_start(struct net_device *dev, | |||
1246 | if (jumbo->found_start) | 1246 | if (jumbo->found_start) |
1247 | dev_kfree_skb_irq(jumbo->skb); | 1247 | dev_kfree_skb_irq(jumbo->skb); |
1248 | 1248 | ||
1249 | pci_unmap_single(pdev, le64_to_cpu(rxfd->frag_info & ~IPG_RFI_FRAGLEN), | 1249 | pci_unmap_single(pdev, le64_to_cpu(rxfd->frag_info) & ~IPG_RFI_FRAGLEN, |
1250 | sp->rx_buf_sz, PCI_DMA_FROMDEVICE); | 1250 | sp->rx_buf_sz, PCI_DMA_FROMDEVICE); |
1251 | 1251 | ||
1252 | skb_put(skb, sp->rxfrag_size); | 1252 | skb_put(skb, sp->rxfrag_size); |
@@ -1349,7 +1349,7 @@ static int ipg_nic_rx_jumbo(struct net_device *dev) | |||
1349 | unsigned int entry = curr % IPG_RFDLIST_LENGTH; | 1349 | unsigned int entry = curr % IPG_RFDLIST_LENGTH; |
1350 | struct ipg_rx *rxfd = sp->rxd + entry; | 1350 | struct ipg_rx *rxfd = sp->rxd + entry; |
1351 | 1351 | ||
1352 | if (!(rxfd->rfs & le64_to_cpu(IPG_RFS_RFDDONE))) | 1352 | if (!(rxfd->rfs & cpu_to_le64(IPG_RFS_RFDDONE))) |
1353 | break; | 1353 | break; |
1354 | 1354 | ||
1355 | switch (ipg_nic_rx_check_frame_type(dev)) { | 1355 | switch (ipg_nic_rx_check_frame_type(dev)) { |
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index 7548fb7360d9..8ed823ae639e 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c | |||
@@ -1287,7 +1287,34 @@ static void ixgbe_set_itr(struct ixgbe_adapter *adapter) | |||
1287 | return; | 1287 | return; |
1288 | } | 1288 | } |
1289 | 1289 | ||
1290 | static inline void ixgbe_irq_enable(struct ixgbe_adapter *adapter); | 1290 | /** |
1291 | * ixgbe_irq_disable - Mask off interrupt generation on the NIC | ||
1292 | * @adapter: board private structure | ||
1293 | **/ | ||
1294 | static inline void ixgbe_irq_disable(struct ixgbe_adapter *adapter) | ||
1295 | { | ||
1296 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, ~0); | ||
1297 | IXGBE_WRITE_FLUSH(&adapter->hw); | ||
1298 | if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) { | ||
1299 | int i; | ||
1300 | for (i = 0; i < adapter->num_msix_vectors; i++) | ||
1301 | synchronize_irq(adapter->msix_entries[i].vector); | ||
1302 | } else { | ||
1303 | synchronize_irq(adapter->pdev->irq); | ||
1304 | } | ||
1305 | } | ||
1306 | |||
1307 | /** | ||
1308 | * ixgbe_irq_enable - Enable default interrupt generation settings | ||
1309 | * @adapter: board private structure | ||
1310 | **/ | ||
1311 | static inline void ixgbe_irq_enable(struct ixgbe_adapter *adapter) | ||
1312 | { | ||
1313 | u32 mask; | ||
1314 | mask = IXGBE_EIMS_ENABLE_MASK; | ||
1315 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMS, mask); | ||
1316 | IXGBE_WRITE_FLUSH(&adapter->hw); | ||
1317 | } | ||
1291 | 1318 | ||
1292 | /** | 1319 | /** |
1293 | * ixgbe_intr - legacy mode Interrupt Handler | 1320 | * ixgbe_intr - legacy mode Interrupt Handler |
@@ -1394,35 +1421,6 @@ static void ixgbe_free_irq(struct ixgbe_adapter *adapter) | |||
1394 | } | 1421 | } |
1395 | 1422 | ||
1396 | /** | 1423 | /** |
1397 | * ixgbe_irq_disable - Mask off interrupt generation on the NIC | ||
1398 | * @adapter: board private structure | ||
1399 | **/ | ||
1400 | static inline void ixgbe_irq_disable(struct ixgbe_adapter *adapter) | ||
1401 | { | ||
1402 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, ~0); | ||
1403 | IXGBE_WRITE_FLUSH(&adapter->hw); | ||
1404 | if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) { | ||
1405 | int i; | ||
1406 | for (i = 0; i < adapter->num_msix_vectors; i++) | ||
1407 | synchronize_irq(adapter->msix_entries[i].vector); | ||
1408 | } else { | ||
1409 | synchronize_irq(adapter->pdev->irq); | ||
1410 | } | ||
1411 | } | ||
1412 | |||
1413 | /** | ||
1414 | * ixgbe_irq_enable - Enable default interrupt generation settings | ||
1415 | * @adapter: board private structure | ||
1416 | **/ | ||
1417 | static inline void ixgbe_irq_enable(struct ixgbe_adapter *adapter) | ||
1418 | { | ||
1419 | u32 mask; | ||
1420 | mask = IXGBE_EIMS_ENABLE_MASK; | ||
1421 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMS, mask); | ||
1422 | IXGBE_WRITE_FLUSH(&adapter->hw); | ||
1423 | } | ||
1424 | |||
1425 | /** | ||
1426 | * ixgbe_configure_msi_and_legacy - Initialize PIN (INTA...) and MSI interrupts | 1424 | * ixgbe_configure_msi_and_legacy - Initialize PIN (INTA...) and MSI interrupts |
1427 | * | 1425 | * |
1428 | **/ | 1426 | **/ |
@@ -2332,7 +2330,7 @@ static void ixgbe_acquire_msix_vectors(struct ixgbe_adapter *adapter, | |||
2332 | * Once we know the feature-set enabled for the device, we'll cache | 2330 | * Once we know the feature-set enabled for the device, we'll cache |
2333 | * the register offset the descriptor ring is assigned to. | 2331 | * the register offset the descriptor ring is assigned to. |
2334 | **/ | 2332 | **/ |
2335 | static void __devinit ixgbe_cache_ring_register(struct ixgbe_adapter *adapter) | 2333 | static void ixgbe_cache_ring_register(struct ixgbe_adapter *adapter) |
2336 | { | 2334 | { |
2337 | int feature_mask = 0, rss_i; | 2335 | int feature_mask = 0, rss_i; |
2338 | int i, txr_idx, rxr_idx; | 2336 | int i, txr_idx, rxr_idx; |
@@ -2369,7 +2367,7 @@ static void __devinit ixgbe_cache_ring_register(struct ixgbe_adapter *adapter) | |||
2369 | * number of queues at compile-time. The polling_netdev array is | 2367 | * number of queues at compile-time. The polling_netdev array is |
2370 | * intended for Multiqueue, but should work fine with a single queue. | 2368 | * intended for Multiqueue, but should work fine with a single queue. |
2371 | **/ | 2369 | **/ |
2372 | static int __devinit ixgbe_alloc_queues(struct ixgbe_adapter *adapter) | 2370 | static int ixgbe_alloc_queues(struct ixgbe_adapter *adapter) |
2373 | { | 2371 | { |
2374 | int i; | 2372 | int i; |
2375 | 2373 | ||
@@ -2410,8 +2408,7 @@ err_tx_ring_allocation: | |||
2410 | * Attempt to configure the interrupts using the best available | 2408 | * Attempt to configure the interrupts using the best available |
2411 | * capabilities of the hardware and the kernel. | 2409 | * capabilities of the hardware and the kernel. |
2412 | **/ | 2410 | **/ |
2413 | static int __devinit ixgbe_set_interrupt_capability(struct ixgbe_adapter | 2411 | static int ixgbe_set_interrupt_capability(struct ixgbe_adapter *adapter) |
2414 | *adapter) | ||
2415 | { | 2412 | { |
2416 | int err = 0; | 2413 | int err = 0; |
2417 | int vector, v_budget; | 2414 | int vector, v_budget; |
@@ -2503,7 +2500,7 @@ static void ixgbe_reset_interrupt_capability(struct ixgbe_adapter *adapter) | |||
2503 | * - Hardware queue count (num_*_queues) | 2500 | * - Hardware queue count (num_*_queues) |
2504 | * - defined by miscellaneous hardware support/features (RSS, etc.) | 2501 | * - defined by miscellaneous hardware support/features (RSS, etc.) |
2505 | **/ | 2502 | **/ |
2506 | static int __devinit ixgbe_init_interrupt_scheme(struct ixgbe_adapter *adapter) | 2503 | static int ixgbe_init_interrupt_scheme(struct ixgbe_adapter *adapter) |
2507 | { | 2504 | { |
2508 | int err; | 2505 | int err; |
2509 | 2506 | ||
diff --git a/drivers/net/jme.c b/drivers/net/jme.c index 81c6cdc3851f..665e70d620fc 100644 --- a/drivers/net/jme.c +++ b/drivers/net/jme.c | |||
@@ -912,23 +912,23 @@ jme_alloc_and_feed_skb(struct jme_adapter *jme, int idx) | |||
912 | skb_put(skb, framesize); | 912 | skb_put(skb, framesize); |
913 | skb->protocol = eth_type_trans(skb, jme->dev); | 913 | skb->protocol = eth_type_trans(skb, jme->dev); |
914 | 914 | ||
915 | if (jme_rxsum_ok(jme, rxdesc->descwb.flags)) | 915 | if (jme_rxsum_ok(jme, le16_to_cpu(rxdesc->descwb.flags))) |
916 | skb->ip_summed = CHECKSUM_UNNECESSARY; | 916 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
917 | else | 917 | else |
918 | skb->ip_summed = CHECKSUM_NONE; | 918 | skb->ip_summed = CHECKSUM_NONE; |
919 | 919 | ||
920 | if (rxdesc->descwb.flags & RXWBFLAG_TAGON) { | 920 | if (rxdesc->descwb.flags & cpu_to_le16(RXWBFLAG_TAGON)) { |
921 | if (jme->vlgrp) { | 921 | if (jme->vlgrp) { |
922 | jme->jme_vlan_rx(skb, jme->vlgrp, | 922 | jme->jme_vlan_rx(skb, jme->vlgrp, |
923 | le32_to_cpu(rxdesc->descwb.vlan)); | 923 | le16_to_cpu(rxdesc->descwb.vlan)); |
924 | NET_STAT(jme).rx_bytes += 4; | 924 | NET_STAT(jme).rx_bytes += 4; |
925 | } | 925 | } |
926 | } else { | 926 | } else { |
927 | jme->jme_rx(skb); | 927 | jme->jme_rx(skb); |
928 | } | 928 | } |
929 | 929 | ||
930 | if ((le16_to_cpu(rxdesc->descwb.flags) & RXWBFLAG_DEST) == | 930 | if ((rxdesc->descwb.flags & cpu_to_le16(RXWBFLAG_DEST)) == |
931 | RXWBFLAG_DEST_MUL) | 931 | cpu_to_le16(RXWBFLAG_DEST_MUL)) |
932 | ++(NET_STAT(jme).multicast); | 932 | ++(NET_STAT(jme).multicast); |
933 | 933 | ||
934 | jme->dev->last_rx = jiffies; | 934 | jme->dev->last_rx = jiffies; |
@@ -961,7 +961,7 @@ jme_process_receive(struct jme_adapter *jme, int limit) | |||
961 | rxdesc = rxring->desc; | 961 | rxdesc = rxring->desc; |
962 | rxdesc += i; | 962 | rxdesc += i; |
963 | 963 | ||
964 | if ((rxdesc->descwb.flags & RXWBFLAG_OWN) || | 964 | if ((rxdesc->descwb.flags & cpu_to_le16(RXWBFLAG_OWN)) || |
965 | !(rxdesc->descwb.desccnt & RXWBDCNT_WBCPL)) | 965 | !(rxdesc->descwb.desccnt & RXWBDCNT_WBCPL)) |
966 | goto out; | 966 | goto out; |
967 | 967 | ||
@@ -1763,10 +1763,9 @@ jme_expand_header(struct jme_adapter *jme, struct sk_buff *skb) | |||
1763 | } | 1763 | } |
1764 | 1764 | ||
1765 | static int | 1765 | static int |
1766 | jme_tx_tso(struct sk_buff *skb, | 1766 | jme_tx_tso(struct sk_buff *skb, __le16 *mss, u8 *flags) |
1767 | u16 *mss, u8 *flags) | ||
1768 | { | 1767 | { |
1769 | *mss = skb_shinfo(skb)->gso_size << TXDESC_MSS_SHIFT; | 1768 | *mss = cpu_to_le16(skb_shinfo(skb)->gso_size << TXDESC_MSS_SHIFT); |
1770 | if (*mss) { | 1769 | if (*mss) { |
1771 | *flags |= TXFLAG_LSEN; | 1770 | *flags |= TXFLAG_LSEN; |
1772 | 1771 | ||
@@ -1826,11 +1825,11 @@ jme_tx_csum(struct jme_adapter *jme, struct sk_buff *skb, u8 *flags) | |||
1826 | } | 1825 | } |
1827 | 1826 | ||
1828 | static inline void | 1827 | static inline void |
1829 | jme_tx_vlan(struct sk_buff *skb, u16 *vlan, u8 *flags) | 1828 | jme_tx_vlan(struct sk_buff *skb, __le16 *vlan, u8 *flags) |
1830 | { | 1829 | { |
1831 | if (vlan_tx_tag_present(skb)) { | 1830 | if (vlan_tx_tag_present(skb)) { |
1832 | *flags |= TXFLAG_TAGON; | 1831 | *flags |= TXFLAG_TAGON; |
1833 | *vlan = vlan_tx_tag_get(skb); | 1832 | *vlan = cpu_to_le16(vlan_tx_tag_get(skb)); |
1834 | } | 1833 | } |
1835 | } | 1834 | } |
1836 | 1835 | ||
diff --git a/drivers/net/mlx4/en_netdev.c b/drivers/net/mlx4/en_netdev.c index a3f732418c49..96e709d6440a 100644 --- a/drivers/net/mlx4/en_netdev.c +++ b/drivers/net/mlx4/en_netdev.c | |||
@@ -656,10 +656,10 @@ static int mlx4_en_start_port(struct net_device *dev) | |||
656 | /* Configure port */ | 656 | /* Configure port */ |
657 | err = mlx4_SET_PORT_general(mdev->dev, priv->port, | 657 | err = mlx4_SET_PORT_general(mdev->dev, priv->port, |
658 | priv->rx_skb_size + ETH_FCS_LEN, | 658 | priv->rx_skb_size + ETH_FCS_LEN, |
659 | mdev->profile.tx_pause, | 659 | priv->prof->tx_pause, |
660 | mdev->profile.tx_ppp, | 660 | priv->prof->tx_ppp, |
661 | mdev->profile.rx_pause, | 661 | priv->prof->rx_pause, |
662 | mdev->profile.rx_ppp); | 662 | priv->prof->rx_ppp); |
663 | if (err) { | 663 | if (err) { |
664 | mlx4_err(mdev, "Failed setting port general configurations" | 664 | mlx4_err(mdev, "Failed setting port general configurations" |
665 | " for port %d, with error %d\n", priv->port, err); | 665 | " for port %d, with error %d\n", priv->port, err); |
diff --git a/drivers/net/mlx4/en_params.c b/drivers/net/mlx4/en_params.c index c2e69b1bcd0a..95706ee1c019 100644 --- a/drivers/net/mlx4/en_params.c +++ b/drivers/net/mlx4/en_params.c | |||
@@ -90,6 +90,7 @@ MLX4_EN_PARM_INT(rx_ring_size2, MLX4_EN_AUTO_CONF, "Rx ring size for port 2"); | |||
90 | int mlx4_en_get_profile(struct mlx4_en_dev *mdev) | 90 | int mlx4_en_get_profile(struct mlx4_en_dev *mdev) |
91 | { | 91 | { |
92 | struct mlx4_en_profile *params = &mdev->profile; | 92 | struct mlx4_en_profile *params = &mdev->profile; |
93 | int i; | ||
93 | 94 | ||
94 | params->rx_moder_cnt = min_t(int, rx_moder_cnt, MLX4_EN_AUTO_CONF); | 95 | params->rx_moder_cnt = min_t(int, rx_moder_cnt, MLX4_EN_AUTO_CONF); |
95 | params->rx_moder_time = min_t(int, rx_moder_time, MLX4_EN_AUTO_CONF); | 96 | params->rx_moder_time = min_t(int, rx_moder_time, MLX4_EN_AUTO_CONF); |
@@ -97,11 +98,13 @@ int mlx4_en_get_profile(struct mlx4_en_dev *mdev) | |||
97 | params->rss_xor = (rss_xor != 0); | 98 | params->rss_xor = (rss_xor != 0); |
98 | params->rss_mask = rss_mask & 0x1f; | 99 | params->rss_mask = rss_mask & 0x1f; |
99 | params->num_lro = min_t(int, num_lro , MLX4_EN_MAX_LRO_DESCRIPTORS); | 100 | params->num_lro = min_t(int, num_lro , MLX4_EN_MAX_LRO_DESCRIPTORS); |
100 | params->rx_pause = pprx; | 101 | for (i = 1; i <= MLX4_MAX_PORTS; i++) { |
101 | params->rx_ppp = pfcrx; | 102 | params->prof[i].rx_pause = pprx; |
102 | params->tx_pause = pptx; | 103 | params->prof[i].rx_ppp = pfcrx; |
103 | params->tx_ppp = pfctx; | 104 | params->prof[i].tx_pause = pptx; |
104 | if (params->rx_ppp || params->tx_ppp) { | 105 | params->prof[i].tx_ppp = pfctx; |
106 | } | ||
107 | if (pfcrx || pfctx) { | ||
105 | params->prof[1].tx_ring_num = MLX4_EN_TX_RING_NUM; | 108 | params->prof[1].tx_ring_num = MLX4_EN_TX_RING_NUM; |
106 | params->prof[2].tx_ring_num = MLX4_EN_TX_RING_NUM; | 109 | params->prof[2].tx_ring_num = MLX4_EN_TX_RING_NUM; |
107 | } else { | 110 | } else { |
@@ -407,14 +410,14 @@ static int mlx4_en_set_pauseparam(struct net_device *dev, | |||
407 | struct mlx4_en_dev *mdev = priv->mdev; | 410 | struct mlx4_en_dev *mdev = priv->mdev; |
408 | int err; | 411 | int err; |
409 | 412 | ||
410 | mdev->profile.tx_pause = pause->tx_pause != 0; | 413 | priv->prof->tx_pause = pause->tx_pause != 0; |
411 | mdev->profile.rx_pause = pause->rx_pause != 0; | 414 | priv->prof->rx_pause = pause->rx_pause != 0; |
412 | err = mlx4_SET_PORT_general(mdev->dev, priv->port, | 415 | err = mlx4_SET_PORT_general(mdev->dev, priv->port, |
413 | priv->rx_skb_size + ETH_FCS_LEN, | 416 | priv->rx_skb_size + ETH_FCS_LEN, |
414 | mdev->profile.tx_pause, | 417 | priv->prof->tx_pause, |
415 | mdev->profile.tx_ppp, | 418 | priv->prof->tx_ppp, |
416 | mdev->profile.rx_pause, | 419 | priv->prof->rx_pause, |
417 | mdev->profile.rx_ppp); | 420 | priv->prof->rx_ppp); |
418 | if (err) | 421 | if (err) |
419 | mlx4_err(mdev, "Failed setting pause params to\n"); | 422 | mlx4_err(mdev, "Failed setting pause params to\n"); |
420 | 423 | ||
@@ -425,10 +428,9 @@ static void mlx4_en_get_pauseparam(struct net_device *dev, | |||
425 | struct ethtool_pauseparam *pause) | 428 | struct ethtool_pauseparam *pause) |
426 | { | 429 | { |
427 | struct mlx4_en_priv *priv = netdev_priv(dev); | 430 | struct mlx4_en_priv *priv = netdev_priv(dev); |
428 | struct mlx4_en_dev *mdev = priv->mdev; | ||
429 | 431 | ||
430 | pause->tx_pause = mdev->profile.tx_pause; | 432 | pause->tx_pause = priv->prof->tx_pause; |
431 | pause->rx_pause = mdev->profile.rx_pause; | 433 | pause->rx_pause = priv->prof->rx_pause; |
432 | } | 434 | } |
433 | 435 | ||
434 | static void mlx4_en_get_ringparam(struct net_device *dev, | 436 | static void mlx4_en_get_ringparam(struct net_device *dev, |
diff --git a/drivers/net/mlx4/main.c b/drivers/net/mlx4/main.c index 468921b8f4b6..90a0281d15ea 100644 --- a/drivers/net/mlx4/main.c +++ b/drivers/net/mlx4/main.c | |||
@@ -753,6 +753,7 @@ static int mlx4_setup_hca(struct mlx4_dev *dev) | |||
753 | struct mlx4_priv *priv = mlx4_priv(dev); | 753 | struct mlx4_priv *priv = mlx4_priv(dev); |
754 | int err; | 754 | int err; |
755 | int port; | 755 | int port; |
756 | __be32 ib_port_default_caps; | ||
756 | 757 | ||
757 | err = mlx4_init_uar_table(dev); | 758 | err = mlx4_init_uar_table(dev); |
758 | if (err) { | 759 | if (err) { |
@@ -852,6 +853,13 @@ static int mlx4_setup_hca(struct mlx4_dev *dev) | |||
852 | } | 853 | } |
853 | 854 | ||
854 | for (port = 1; port <= dev->caps.num_ports; port++) { | 855 | for (port = 1; port <= dev->caps.num_ports; port++) { |
856 | ib_port_default_caps = 0; | ||
857 | err = mlx4_get_port_ib_caps(dev, port, &ib_port_default_caps); | ||
858 | if (err) | ||
859 | mlx4_warn(dev, "failed to get port %d default " | ||
860 | "ib capabilities (%d). Continuing with " | ||
861 | "caps = 0\n", port, err); | ||
862 | dev->caps.ib_port_def_cap[port] = ib_port_default_caps; | ||
855 | err = mlx4_SET_PORT(dev, port); | 863 | err = mlx4_SET_PORT(dev, port); |
856 | if (err) { | 864 | if (err) { |
857 | mlx4_err(dev, "Failed to set port %d, aborting\n", | 865 | mlx4_err(dev, "Failed to set port %d, aborting\n", |
diff --git a/drivers/net/mlx4/mlx4.h b/drivers/net/mlx4/mlx4.h index fa431fad0eec..34c909deaff3 100644 --- a/drivers/net/mlx4/mlx4.h +++ b/drivers/net/mlx4/mlx4.h | |||
@@ -87,6 +87,9 @@ enum { | |||
87 | 87 | ||
88 | #ifdef CONFIG_MLX4_DEBUG | 88 | #ifdef CONFIG_MLX4_DEBUG |
89 | extern int mlx4_debug_level; | 89 | extern int mlx4_debug_level; |
90 | #else /* CONFIG_MLX4_DEBUG */ | ||
91 | #define mlx4_debug_level (0) | ||
92 | #endif /* CONFIG_MLX4_DEBUG */ | ||
90 | 93 | ||
91 | #define mlx4_dbg(mdev, format, arg...) \ | 94 | #define mlx4_dbg(mdev, format, arg...) \ |
92 | do { \ | 95 | do { \ |
@@ -94,12 +97,6 @@ extern int mlx4_debug_level; | |||
94 | dev_printk(KERN_DEBUG, &mdev->pdev->dev, format, ## arg); \ | 97 | dev_printk(KERN_DEBUG, &mdev->pdev->dev, format, ## arg); \ |
95 | } while (0) | 98 | } while (0) |
96 | 99 | ||
97 | #else /* CONFIG_MLX4_DEBUG */ | ||
98 | |||
99 | #define mlx4_dbg(mdev, format, arg...) do { (void) mdev; } while (0) | ||
100 | |||
101 | #endif /* CONFIG_MLX4_DEBUG */ | ||
102 | |||
103 | #define mlx4_err(mdev, format, arg...) \ | 100 | #define mlx4_err(mdev, format, arg...) \ |
104 | dev_err(&mdev->pdev->dev, format, ## arg) | 101 | dev_err(&mdev->pdev->dev, format, ## arg) |
105 | #define mlx4_info(mdev, format, arg...) \ | 102 | #define mlx4_info(mdev, format, arg...) \ |
@@ -388,5 +385,6 @@ void mlx4_init_mac_table(struct mlx4_dev *dev, struct mlx4_mac_table *table); | |||
388 | void mlx4_init_vlan_table(struct mlx4_dev *dev, struct mlx4_vlan_table *table); | 385 | void mlx4_init_vlan_table(struct mlx4_dev *dev, struct mlx4_vlan_table *table); |
389 | 386 | ||
390 | int mlx4_SET_PORT(struct mlx4_dev *dev, u8 port); | 387 | int mlx4_SET_PORT(struct mlx4_dev *dev, u8 port); |
388 | int mlx4_get_port_ib_caps(struct mlx4_dev *dev, u8 port, __be32 *caps); | ||
391 | 389 | ||
392 | #endif /* MLX4_H */ | 390 | #endif /* MLX4_H */ |
diff --git a/drivers/net/mlx4/mlx4_en.h b/drivers/net/mlx4/mlx4_en.h index 11fb17c6e97b..98ddc0811f93 100644 --- a/drivers/net/mlx4/mlx4_en.h +++ b/drivers/net/mlx4/mlx4_en.h | |||
@@ -322,6 +322,10 @@ struct mlx4_en_port_profile { | |||
322 | u32 rx_ring_num; | 322 | u32 rx_ring_num; |
323 | u32 tx_ring_size; | 323 | u32 tx_ring_size; |
324 | u32 rx_ring_size; | 324 | u32 rx_ring_size; |
325 | u8 rx_pause; | ||
326 | u8 rx_ppp; | ||
327 | u8 tx_pause; | ||
328 | u8 tx_ppp; | ||
325 | }; | 329 | }; |
326 | 330 | ||
327 | struct mlx4_en_profile { | 331 | struct mlx4_en_profile { |
@@ -333,10 +337,6 @@ struct mlx4_en_profile { | |||
333 | int rx_moder_cnt; | 337 | int rx_moder_cnt; |
334 | int rx_moder_time; | 338 | int rx_moder_time; |
335 | int auto_moder; | 339 | int auto_moder; |
336 | u8 rx_pause; | ||
337 | u8 rx_ppp; | ||
338 | u8 tx_pause; | ||
339 | u8 tx_ppp; | ||
340 | u8 no_reset; | 340 | u8 no_reset; |
341 | struct mlx4_en_port_profile prof[MLX4_MAX_PORTS + 1]; | 341 | struct mlx4_en_port_profile prof[MLX4_MAX_PORTS + 1]; |
342 | }; | 342 | }; |
diff --git a/drivers/net/mlx4/port.c b/drivers/net/mlx4/port.c index e2fdab42c4ce..0a057e5dc63b 100644 --- a/drivers/net/mlx4/port.c +++ b/drivers/net/mlx4/port.c | |||
@@ -258,6 +258,42 @@ out: | |||
258 | } | 258 | } |
259 | EXPORT_SYMBOL_GPL(mlx4_unregister_vlan); | 259 | EXPORT_SYMBOL_GPL(mlx4_unregister_vlan); |
260 | 260 | ||
261 | int mlx4_get_port_ib_caps(struct mlx4_dev *dev, u8 port, __be32 *caps) | ||
262 | { | ||
263 | struct mlx4_cmd_mailbox *inmailbox, *outmailbox; | ||
264 | u8 *inbuf, *outbuf; | ||
265 | int err; | ||
266 | |||
267 | inmailbox = mlx4_alloc_cmd_mailbox(dev); | ||
268 | if (IS_ERR(inmailbox)) | ||
269 | return PTR_ERR(inmailbox); | ||
270 | |||
271 | outmailbox = mlx4_alloc_cmd_mailbox(dev); | ||
272 | if (IS_ERR(outmailbox)) { | ||
273 | mlx4_free_cmd_mailbox(dev, inmailbox); | ||
274 | return PTR_ERR(outmailbox); | ||
275 | } | ||
276 | |||
277 | inbuf = inmailbox->buf; | ||
278 | outbuf = outmailbox->buf; | ||
279 | memset(inbuf, 0, 256); | ||
280 | memset(outbuf, 0, 256); | ||
281 | inbuf[0] = 1; | ||
282 | inbuf[1] = 1; | ||
283 | inbuf[2] = 1; | ||
284 | inbuf[3] = 1; | ||
285 | *(__be16 *) (&inbuf[16]) = cpu_to_be16(0x0015); | ||
286 | *(__be32 *) (&inbuf[20]) = cpu_to_be32(port); | ||
287 | |||
288 | err = mlx4_cmd_box(dev, inmailbox->dma, outmailbox->dma, port, 3, | ||
289 | MLX4_CMD_MAD_IFC, MLX4_CMD_TIME_CLASS_C); | ||
290 | if (!err) | ||
291 | *caps = *(__be32 *) (outbuf + 84); | ||
292 | mlx4_free_cmd_mailbox(dev, inmailbox); | ||
293 | mlx4_free_cmd_mailbox(dev, outmailbox); | ||
294 | return err; | ||
295 | } | ||
296 | |||
261 | int mlx4_SET_PORT(struct mlx4_dev *dev, u8 port) | 297 | int mlx4_SET_PORT(struct mlx4_dev *dev, u8 port) |
262 | { | 298 | { |
263 | struct mlx4_cmd_mailbox *mailbox; | 299 | struct mlx4_cmd_mailbox *mailbox; |
@@ -273,7 +309,8 @@ int mlx4_SET_PORT(struct mlx4_dev *dev, u8 port) | |||
273 | ((u8 *) mailbox->buf)[3] = 6; | 309 | ((u8 *) mailbox->buf)[3] = 6; |
274 | ((__be16 *) mailbox->buf)[4] = cpu_to_be16(1 << 15); | 310 | ((__be16 *) mailbox->buf)[4] = cpu_to_be16(1 << 15); |
275 | ((__be16 *) mailbox->buf)[6] = cpu_to_be16(1 << 15); | 311 | ((__be16 *) mailbox->buf)[6] = cpu_to_be16(1 << 15); |
276 | } | 312 | } else |
313 | ((__be32 *) mailbox->buf)[1] = dev->caps.ib_port_def_cap[port]; | ||
277 | err = mlx4_cmd(dev, mailbox->dma, port, is_eth, MLX4_CMD_SET_PORT, | 314 | err = mlx4_cmd(dev, mailbox->dma, port, is_eth, MLX4_CMD_SET_PORT, |
278 | MLX4_CMD_TIME_CLASS_B); | 315 | MLX4_CMD_TIME_CLASS_B); |
279 | 316 | ||
diff --git a/drivers/net/mv643xx_eth.c b/drivers/net/mv643xx_eth.c index b9dcdbd369f8..e513f76f2a9f 100644 --- a/drivers/net/mv643xx_eth.c +++ b/drivers/net/mv643xx_eth.c | |||
@@ -899,7 +899,8 @@ static int txq_reclaim(struct tx_queue *txq, int budget, int force) | |||
899 | if (skb != NULL) { | 899 | if (skb != NULL) { |
900 | if (skb_queue_len(&mp->rx_recycle) < | 900 | if (skb_queue_len(&mp->rx_recycle) < |
901 | mp->default_rx_ring_size && | 901 | mp->default_rx_ring_size && |
902 | skb_recycle_check(skb, mp->skb_size)) | 902 | skb_recycle_check(skb, mp->skb_size + |
903 | dma_get_cache_alignment() - 1)) | ||
903 | __skb_queue_head(&mp->rx_recycle, skb); | 904 | __skb_queue_head(&mp->rx_recycle, skb); |
904 | else | 905 | else |
905 | dev_kfree_skb(skb); | 906 | dev_kfree_skb(skb); |
@@ -2435,8 +2436,8 @@ static int mv643xx_eth_shared_remove(struct platform_device *pdev) | |||
2435 | struct mv643xx_eth_shared_platform_data *pd = pdev->dev.platform_data; | 2436 | struct mv643xx_eth_shared_platform_data *pd = pdev->dev.platform_data; |
2436 | 2437 | ||
2437 | if (pd == NULL || pd->shared_smi == NULL) { | 2438 | if (pd == NULL || pd->shared_smi == NULL) { |
2438 | mdiobus_free(msp->smi_bus); | ||
2439 | mdiobus_unregister(msp->smi_bus); | 2439 | mdiobus_unregister(msp->smi_bus); |
2440 | mdiobus_free(msp->smi_bus); | ||
2440 | } | 2441 | } |
2441 | if (msp->err_interrupt != NO_IRQ) | 2442 | if (msp->err_interrupt != NO_IRQ) |
2442 | free_irq(msp->err_interrupt, msp); | 2443 | free_irq(msp->err_interrupt, msp); |
diff --git a/drivers/net/myri10ge/myri10ge.c b/drivers/net/myri10ge/myri10ge.c index a5f428bcc0eb..b37867097308 100644 --- a/drivers/net/myri10ge/myri10ge.c +++ b/drivers/net/myri10ge/myri10ge.c | |||
@@ -75,7 +75,7 @@ | |||
75 | #include "myri10ge_mcp.h" | 75 | #include "myri10ge_mcp.h" |
76 | #include "myri10ge_mcp_gen_header.h" | 76 | #include "myri10ge_mcp_gen_header.h" |
77 | 77 | ||
78 | #define MYRI10GE_VERSION_STR "1.4.3-1.375" | 78 | #define MYRI10GE_VERSION_STR "1.4.3-1.378" |
79 | 79 | ||
80 | MODULE_DESCRIPTION("Myricom 10G driver (10GbE)"); | 80 | MODULE_DESCRIPTION("Myricom 10G driver (10GbE)"); |
81 | MODULE_AUTHOR("Maintainer: help@myri.com"); | 81 | MODULE_AUTHOR("Maintainer: help@myri.com"); |
@@ -1393,6 +1393,7 @@ myri10ge_tx_done(struct myri10ge_slice_state *ss, int mcp_index) | |||
1393 | if (tx->req == tx->done) { | 1393 | if (tx->req == tx->done) { |
1394 | tx->queue_active = 0; | 1394 | tx->queue_active = 0; |
1395 | put_be32(htonl(1), tx->send_stop); | 1395 | put_be32(htonl(1), tx->send_stop); |
1396 | mb(); | ||
1396 | mmiowb(); | 1397 | mmiowb(); |
1397 | } | 1398 | } |
1398 | __netif_tx_unlock(dev_queue); | 1399 | __netif_tx_unlock(dev_queue); |
@@ -2865,6 +2866,7 @@ again: | |||
2865 | if ((mgp->dev->real_num_tx_queues > 1) && tx->queue_active == 0) { | 2866 | if ((mgp->dev->real_num_tx_queues > 1) && tx->queue_active == 0) { |
2866 | tx->queue_active = 1; | 2867 | tx->queue_active = 1; |
2867 | put_be32(htonl(1), tx->send_go); | 2868 | put_be32(htonl(1), tx->send_go); |
2869 | mb(); | ||
2868 | mmiowb(); | 2870 | mmiowb(); |
2869 | } | 2871 | } |
2870 | tx->pkt_start++; | 2872 | tx->pkt_start++; |
diff --git a/drivers/net/niu.c b/drivers/net/niu.c index 9acb5d70a3ae..1b6f548c4411 100644 --- a/drivers/net/niu.c +++ b/drivers/net/niu.c | |||
@@ -33,8 +33,8 @@ | |||
33 | 33 | ||
34 | #define DRV_MODULE_NAME "niu" | 34 | #define DRV_MODULE_NAME "niu" |
35 | #define PFX DRV_MODULE_NAME ": " | 35 | #define PFX DRV_MODULE_NAME ": " |
36 | #define DRV_MODULE_VERSION "0.9" | 36 | #define DRV_MODULE_VERSION "1.0" |
37 | #define DRV_MODULE_RELDATE "May 4, 2008" | 37 | #define DRV_MODULE_RELDATE "Nov 14, 2008" |
38 | 38 | ||
39 | static char version[] __devinitdata = | 39 | static char version[] __devinitdata = |
40 | DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n"; | 40 | DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n"; |
@@ -51,8 +51,7 @@ MODULE_VERSION(DRV_MODULE_VERSION); | |||
51 | #ifndef readq | 51 | #ifndef readq |
52 | static u64 readq(void __iomem *reg) | 52 | static u64 readq(void __iomem *reg) |
53 | { | 53 | { |
54 | return (((u64)readl(reg + 0x4UL) << 32) | | 54 | return ((u64) readl(reg)) | (((u64) readl(reg + 4UL)) << 32); |
55 | (u64)readl(reg)); | ||
56 | } | 55 | } |
57 | 56 | ||
58 | static void writeq(u64 val, void __iomem *reg) | 57 | static void writeq(u64 val, void __iomem *reg) |
@@ -407,7 +406,7 @@ static int esr2_set_rx_cfg(struct niu *np, unsigned long channel, u32 val) | |||
407 | } | 406 | } |
408 | 407 | ||
409 | /* Mode is always 10G fiber. */ | 408 | /* Mode is always 10G fiber. */ |
410 | static int serdes_init_niu(struct niu *np) | 409 | static int serdes_init_niu_10g_fiber(struct niu *np) |
411 | { | 410 | { |
412 | struct niu_link_config *lp = &np->link_config; | 411 | struct niu_link_config *lp = &np->link_config; |
413 | u32 tx_cfg, rx_cfg; | 412 | u32 tx_cfg, rx_cfg; |
@@ -444,6 +443,223 @@ static int serdes_init_niu(struct niu *np) | |||
444 | return 0; | 443 | return 0; |
445 | } | 444 | } |
446 | 445 | ||
446 | static int serdes_init_niu_1g_serdes(struct niu *np) | ||
447 | { | ||
448 | struct niu_link_config *lp = &np->link_config; | ||
449 | u16 pll_cfg, pll_sts; | ||
450 | int max_retry = 100; | ||
451 | u64 sig, mask, val; | ||
452 | u32 tx_cfg, rx_cfg; | ||
453 | unsigned long i; | ||
454 | int err; | ||
455 | |||
456 | tx_cfg = (PLL_TX_CFG_ENTX | PLL_TX_CFG_SWING_1375MV | | ||
457 | PLL_TX_CFG_RATE_HALF); | ||
458 | rx_cfg = (PLL_RX_CFG_ENRX | PLL_RX_CFG_TERM_0P8VDDT | | ||
459 | PLL_RX_CFG_ALIGN_ENA | PLL_RX_CFG_LOS_LTHRESH | | ||
460 | PLL_RX_CFG_RATE_HALF); | ||
461 | |||
462 | if (np->port == 0) | ||
463 | rx_cfg |= PLL_RX_CFG_EQ_LP_ADAPTIVE; | ||
464 | |||
465 | if (lp->loopback_mode == LOOPBACK_PHY) { | ||
466 | u16 test_cfg = PLL_TEST_CFG_LOOPBACK_CML_DIS; | ||
467 | |||
468 | mdio_write(np, np->port, NIU_ESR2_DEV_ADDR, | ||
469 | ESR2_TI_PLL_TEST_CFG_L, test_cfg); | ||
470 | |||
471 | tx_cfg |= PLL_TX_CFG_ENTEST; | ||
472 | rx_cfg |= PLL_RX_CFG_ENTEST; | ||
473 | } | ||
474 | |||
475 | /* Initialize PLL for 1G */ | ||
476 | pll_cfg = (PLL_CFG_ENPLL | PLL_CFG_MPY_8X); | ||
477 | |||
478 | err = mdio_write(np, np->port, NIU_ESR2_DEV_ADDR, | ||
479 | ESR2_TI_PLL_CFG_L, pll_cfg); | ||
480 | if (err) { | ||
481 | dev_err(np->device, PFX "NIU Port %d " | ||
482 | "serdes_init_niu_1g_serdes: " | ||
483 | "mdio write to ESR2_TI_PLL_CFG_L failed", np->port); | ||
484 | return err; | ||
485 | } | ||
486 | |||
487 | pll_sts = PLL_CFG_ENPLL; | ||
488 | |||
489 | err = mdio_write(np, np->port, NIU_ESR2_DEV_ADDR, | ||
490 | ESR2_TI_PLL_STS_L, pll_sts); | ||
491 | if (err) { | ||
492 | dev_err(np->device, PFX "NIU Port %d " | ||
493 | "serdes_init_niu_1g_serdes: " | ||
494 | "mdio write to ESR2_TI_PLL_STS_L failed", np->port); | ||
495 | return err; | ||
496 | } | ||
497 | |||
498 | udelay(200); | ||
499 | |||
500 | /* Initialize all 4 lanes of the SERDES. */ | ||
501 | for (i = 0; i < 4; i++) { | ||
502 | err = esr2_set_tx_cfg(np, i, tx_cfg); | ||
503 | if (err) | ||
504 | return err; | ||
505 | } | ||
506 | |||
507 | for (i = 0; i < 4; i++) { | ||
508 | err = esr2_set_rx_cfg(np, i, rx_cfg); | ||
509 | if (err) | ||
510 | return err; | ||
511 | } | ||
512 | |||
513 | switch (np->port) { | ||
514 | case 0: | ||
515 | val = (ESR_INT_SRDY0_P0 | ESR_INT_DET0_P0); | ||
516 | mask = val; | ||
517 | break; | ||
518 | |||
519 | case 1: | ||
520 | val = (ESR_INT_SRDY0_P1 | ESR_INT_DET0_P1); | ||
521 | mask = val; | ||
522 | break; | ||
523 | |||
524 | default: | ||
525 | return -EINVAL; | ||
526 | } | ||
527 | |||
528 | while (max_retry--) { | ||
529 | sig = nr64(ESR_INT_SIGNALS); | ||
530 | if ((sig & mask) == val) | ||
531 | break; | ||
532 | |||
533 | mdelay(500); | ||
534 | } | ||
535 | |||
536 | if ((sig & mask) != val) { | ||
537 | dev_err(np->device, PFX "Port %u signal bits [%08x] are not " | ||
538 | "[%08x]\n", np->port, (int) (sig & mask), (int) val); | ||
539 | return -ENODEV; | ||
540 | } | ||
541 | |||
542 | return 0; | ||
543 | } | ||
544 | |||
545 | static int serdes_init_niu_10g_serdes(struct niu *np) | ||
546 | { | ||
547 | struct niu_link_config *lp = &np->link_config; | ||
548 | u32 tx_cfg, rx_cfg, pll_cfg, pll_sts; | ||
549 | int max_retry = 100; | ||
550 | u64 sig, mask, val; | ||
551 | unsigned long i; | ||
552 | int err; | ||
553 | |||
554 | tx_cfg = (PLL_TX_CFG_ENTX | PLL_TX_CFG_SWING_1375MV); | ||
555 | rx_cfg = (PLL_RX_CFG_ENRX | PLL_RX_CFG_TERM_0P8VDDT | | ||
556 | PLL_RX_CFG_ALIGN_ENA | PLL_RX_CFG_LOS_LTHRESH | | ||
557 | PLL_RX_CFG_EQ_LP_ADAPTIVE); | ||
558 | |||
559 | if (lp->loopback_mode == LOOPBACK_PHY) { | ||
560 | u16 test_cfg = PLL_TEST_CFG_LOOPBACK_CML_DIS; | ||
561 | |||
562 | mdio_write(np, np->port, NIU_ESR2_DEV_ADDR, | ||
563 | ESR2_TI_PLL_TEST_CFG_L, test_cfg); | ||
564 | |||
565 | tx_cfg |= PLL_TX_CFG_ENTEST; | ||
566 | rx_cfg |= PLL_RX_CFG_ENTEST; | ||
567 | } | ||
568 | |||
569 | /* Initialize PLL for 10G */ | ||
570 | pll_cfg = (PLL_CFG_ENPLL | PLL_CFG_MPY_10X); | ||
571 | |||
572 | err = mdio_write(np, np->port, NIU_ESR2_DEV_ADDR, | ||
573 | ESR2_TI_PLL_CFG_L, pll_cfg & 0xffff); | ||
574 | if (err) { | ||
575 | dev_err(np->device, PFX "NIU Port %d " | ||
576 | "serdes_init_niu_10g_serdes: " | ||
577 | "mdio write to ESR2_TI_PLL_CFG_L failed", np->port); | ||
578 | return err; | ||
579 | } | ||
580 | |||
581 | pll_sts = PLL_CFG_ENPLL; | ||
582 | |||
583 | err = mdio_write(np, np->port, NIU_ESR2_DEV_ADDR, | ||
584 | ESR2_TI_PLL_STS_L, pll_sts & 0xffff); | ||
585 | if (err) { | ||
586 | dev_err(np->device, PFX "NIU Port %d " | ||
587 | "serdes_init_niu_10g_serdes: " | ||
588 | "mdio write to ESR2_TI_PLL_STS_L failed", np->port); | ||
589 | return err; | ||
590 | } | ||
591 | |||
592 | udelay(200); | ||
593 | |||
594 | /* Initialize all 4 lanes of the SERDES. */ | ||
595 | for (i = 0; i < 4; i++) { | ||
596 | err = esr2_set_tx_cfg(np, i, tx_cfg); | ||
597 | if (err) | ||
598 | return err; | ||
599 | } | ||
600 | |||
601 | for (i = 0; i < 4; i++) { | ||
602 | err = esr2_set_rx_cfg(np, i, rx_cfg); | ||
603 | if (err) | ||
604 | return err; | ||
605 | } | ||
606 | |||
607 | /* check if serdes is ready */ | ||
608 | |||
609 | switch (np->port) { | ||
610 | case 0: | ||
611 | mask = ESR_INT_SIGNALS_P0_BITS; | ||
612 | val = (ESR_INT_SRDY0_P0 | | ||
613 | ESR_INT_DET0_P0 | | ||
614 | ESR_INT_XSRDY_P0 | | ||
615 | ESR_INT_XDP_P0_CH3 | | ||
616 | ESR_INT_XDP_P0_CH2 | | ||
617 | ESR_INT_XDP_P0_CH1 | | ||
618 | ESR_INT_XDP_P0_CH0); | ||
619 | break; | ||
620 | |||
621 | case 1: | ||
622 | mask = ESR_INT_SIGNALS_P1_BITS; | ||
623 | val = (ESR_INT_SRDY0_P1 | | ||
624 | ESR_INT_DET0_P1 | | ||
625 | ESR_INT_XSRDY_P1 | | ||
626 | ESR_INT_XDP_P1_CH3 | | ||
627 | ESR_INT_XDP_P1_CH2 | | ||
628 | ESR_INT_XDP_P1_CH1 | | ||
629 | ESR_INT_XDP_P1_CH0); | ||
630 | break; | ||
631 | |||
632 | default: | ||
633 | return -EINVAL; | ||
634 | } | ||
635 | |||
636 | while (max_retry--) { | ||
637 | sig = nr64(ESR_INT_SIGNALS); | ||
638 | if ((sig & mask) == val) | ||
639 | break; | ||
640 | |||
641 | mdelay(500); | ||
642 | } | ||
643 | |||
644 | if ((sig & mask) != val) { | ||
645 | pr_info(PFX "NIU Port %u signal bits [%08x] are not " | ||
646 | "[%08x] for 10G...trying 1G\n", | ||
647 | np->port, (int) (sig & mask), (int) val); | ||
648 | |||
649 | /* 10G failed, try initializing at 1G */ | ||
650 | err = serdes_init_niu_1g_serdes(np); | ||
651 | if (!err) { | ||
652 | np->flags &= ~NIU_FLAGS_10G; | ||
653 | np->mac_xcvr = MAC_XCVR_PCS; | ||
654 | } else { | ||
655 | dev_err(np->device, PFX "Port %u 10G/1G SERDES " | ||
656 | "Link Failed \n", np->port); | ||
657 | return -ENODEV; | ||
658 | } | ||
659 | } | ||
660 | return 0; | ||
661 | } | ||
662 | |||
447 | static int esr_read_rxtx_ctrl(struct niu *np, unsigned long chan, u32 *val) | 663 | static int esr_read_rxtx_ctrl(struct niu *np, unsigned long chan, u32 *val) |
448 | { | 664 | { |
449 | int err; | 665 | int err; |
@@ -1955,13 +2171,23 @@ static const struct niu_phy_ops phy_ops_10g_serdes = { | |||
1955 | .link_status = link_status_10g_serdes, | 2171 | .link_status = link_status_10g_serdes, |
1956 | }; | 2172 | }; |
1957 | 2173 | ||
2174 | static const struct niu_phy_ops phy_ops_10g_serdes_niu = { | ||
2175 | .serdes_init = serdes_init_niu_10g_serdes, | ||
2176 | .link_status = link_status_10g_serdes, | ||
2177 | }; | ||
2178 | |||
2179 | static const struct niu_phy_ops phy_ops_1g_serdes_niu = { | ||
2180 | .serdes_init = serdes_init_niu_1g_serdes, | ||
2181 | .link_status = link_status_1g_serdes, | ||
2182 | }; | ||
2183 | |||
1958 | static const struct niu_phy_ops phy_ops_1g_rgmii = { | 2184 | static const struct niu_phy_ops phy_ops_1g_rgmii = { |
1959 | .xcvr_init = xcvr_init_1g_rgmii, | 2185 | .xcvr_init = xcvr_init_1g_rgmii, |
1960 | .link_status = link_status_1g_rgmii, | 2186 | .link_status = link_status_1g_rgmii, |
1961 | }; | 2187 | }; |
1962 | 2188 | ||
1963 | static const struct niu_phy_ops phy_ops_10g_fiber_niu = { | 2189 | static const struct niu_phy_ops phy_ops_10g_fiber_niu = { |
1964 | .serdes_init = serdes_init_niu, | 2190 | .serdes_init = serdes_init_niu_10g_fiber, |
1965 | .xcvr_init = xcvr_init_10g, | 2191 | .xcvr_init = xcvr_init_10g, |
1966 | .link_status = link_status_10g, | 2192 | .link_status = link_status_10g, |
1967 | }; | 2193 | }; |
@@ -1999,11 +2225,21 @@ struct niu_phy_template { | |||
1999 | u32 phy_addr_base; | 2225 | u32 phy_addr_base; |
2000 | }; | 2226 | }; |
2001 | 2227 | ||
2002 | static const struct niu_phy_template phy_template_niu = { | 2228 | static const struct niu_phy_template phy_template_niu_10g_fiber = { |
2003 | .ops = &phy_ops_10g_fiber_niu, | 2229 | .ops = &phy_ops_10g_fiber_niu, |
2004 | .phy_addr_base = 16, | 2230 | .phy_addr_base = 16, |
2005 | }; | 2231 | }; |
2006 | 2232 | ||
2233 | static const struct niu_phy_template phy_template_niu_10g_serdes = { | ||
2234 | .ops = &phy_ops_10g_serdes_niu, | ||
2235 | .phy_addr_base = 0, | ||
2236 | }; | ||
2237 | |||
2238 | static const struct niu_phy_template phy_template_niu_1g_serdes = { | ||
2239 | .ops = &phy_ops_1g_serdes_niu, | ||
2240 | .phy_addr_base = 0, | ||
2241 | }; | ||
2242 | |||
2007 | static const struct niu_phy_template phy_template_10g_fiber = { | 2243 | static const struct niu_phy_template phy_template_10g_fiber = { |
2008 | .ops = &phy_ops_10g_fiber, | 2244 | .ops = &phy_ops_10g_fiber, |
2009 | .phy_addr_base = 8, | 2245 | .phy_addr_base = 8, |
@@ -2183,8 +2419,25 @@ static int niu_determine_phy_disposition(struct niu *np) | |||
2183 | u32 phy_addr_off = 0; | 2419 | u32 phy_addr_off = 0; |
2184 | 2420 | ||
2185 | if (plat_type == PLAT_TYPE_NIU) { | 2421 | if (plat_type == PLAT_TYPE_NIU) { |
2186 | tp = &phy_template_niu; | 2422 | switch (np->flags & |
2187 | phy_addr_off += np->port; | 2423 | (NIU_FLAGS_10G | |
2424 | NIU_FLAGS_FIBER | | ||
2425 | NIU_FLAGS_XCVR_SERDES)) { | ||
2426 | case NIU_FLAGS_10G | NIU_FLAGS_XCVR_SERDES: | ||
2427 | /* 10G Serdes */ | ||
2428 | tp = &phy_template_niu_10g_serdes; | ||
2429 | break; | ||
2430 | case NIU_FLAGS_XCVR_SERDES: | ||
2431 | /* 1G Serdes */ | ||
2432 | tp = &phy_template_niu_1g_serdes; | ||
2433 | break; | ||
2434 | case NIU_FLAGS_10G | NIU_FLAGS_FIBER: | ||
2435 | /* 10G Fiber */ | ||
2436 | default: | ||
2437 | tp = &phy_template_niu_10g_fiber; | ||
2438 | phy_addr_off += np->port; | ||
2439 | break; | ||
2440 | } | ||
2188 | } else { | 2441 | } else { |
2189 | switch (np->flags & | 2442 | switch (np->flags & |
2190 | (NIU_FLAGS_10G | | 2443 | (NIU_FLAGS_10G | |
@@ -7214,6 +7467,12 @@ static int __devinit niu_phy_type_prop_decode(struct niu *np, | |||
7214 | np->flags |= NIU_FLAGS_10G; | 7467 | np->flags |= NIU_FLAGS_10G; |
7215 | np->flags &= ~NIU_FLAGS_FIBER; | 7468 | np->flags &= ~NIU_FLAGS_FIBER; |
7216 | np->mac_xcvr = MAC_XCVR_XPCS; | 7469 | np->mac_xcvr = MAC_XCVR_XPCS; |
7470 | } else if (!strcmp(phy_prop, "xgsd") || !strcmp(phy_prop, "gsd")) { | ||
7471 | /* 10G Serdes or 1G Serdes, default to 10G */ | ||
7472 | np->flags |= NIU_FLAGS_10G; | ||
7473 | np->flags &= ~NIU_FLAGS_FIBER; | ||
7474 | np->flags |= NIU_FLAGS_XCVR_SERDES; | ||
7475 | np->mac_xcvr = MAC_XCVR_XPCS; | ||
7217 | } else { | 7476 | } else { |
7218 | return -EINVAL; | 7477 | return -EINVAL; |
7219 | } | 7478 | } |
@@ -7742,6 +8001,8 @@ static int __devinit walk_phys(struct niu *np, struct niu_parent *parent) | |||
7742 | u32 val; | 8001 | u32 val; |
7743 | int err; | 8002 | int err; |
7744 | 8003 | ||
8004 | num_10g = num_1g = 0; | ||
8005 | |||
7745 | if (!strcmp(np->vpd.model, NIU_ALONSO_MDL_STR) || | 8006 | if (!strcmp(np->vpd.model, NIU_ALONSO_MDL_STR) || |
7746 | !strcmp(np->vpd.model, NIU_KIMI_MDL_STR)) { | 8007 | !strcmp(np->vpd.model, NIU_KIMI_MDL_STR)) { |
7747 | num_10g = 0; | 8008 | num_10g = 0; |
@@ -7758,6 +8019,16 @@ static int __devinit walk_phys(struct niu *np, struct niu_parent *parent) | |||
7758 | parent->num_ports = 2; | 8019 | parent->num_ports = 2; |
7759 | val = (phy_encode(PORT_TYPE_10G, 0) | | 8020 | val = (phy_encode(PORT_TYPE_10G, 0) | |
7760 | phy_encode(PORT_TYPE_10G, 1)); | 8021 | phy_encode(PORT_TYPE_10G, 1)); |
8022 | } else if ((np->flags & NIU_FLAGS_XCVR_SERDES) && | ||
8023 | (parent->plat_type == PLAT_TYPE_NIU)) { | ||
8024 | /* this is the Monza case */ | ||
8025 | if (np->flags & NIU_FLAGS_10G) { | ||
8026 | val = (phy_encode(PORT_TYPE_10G, 0) | | ||
8027 | phy_encode(PORT_TYPE_10G, 1)); | ||
8028 | } else { | ||
8029 | val = (phy_encode(PORT_TYPE_1G, 0) | | ||
8030 | phy_encode(PORT_TYPE_1G, 1)); | ||
8031 | } | ||
7761 | } else { | 8032 | } else { |
7762 | err = fill_phy_probe_info(np, parent, info); | 8033 | err = fill_phy_probe_info(np, parent, info); |
7763 | if (err) | 8034 | if (err) |
@@ -8657,7 +8928,9 @@ static void __devinit niu_device_announce(struct niu *np) | |||
8657 | dev->name, | 8928 | dev->name, |
8658 | (np->flags & NIU_FLAGS_XMAC ? "XMAC" : "BMAC"), | 8929 | (np->flags & NIU_FLAGS_XMAC ? "XMAC" : "BMAC"), |
8659 | (np->flags & NIU_FLAGS_10G ? "10G" : "1G"), | 8930 | (np->flags & NIU_FLAGS_10G ? "10G" : "1G"), |
8660 | (np->flags & NIU_FLAGS_FIBER ? "FIBER" : "COPPER"), | 8931 | (np->flags & NIU_FLAGS_FIBER ? "FIBER" : |
8932 | (np->flags & NIU_FLAGS_XCVR_SERDES ? "SERDES" : | ||
8933 | "COPPER")), | ||
8661 | (np->mac_xcvr == MAC_XCVR_MII ? "MII" : | 8934 | (np->mac_xcvr == MAC_XCVR_MII ? "MII" : |
8662 | (np->mac_xcvr == MAC_XCVR_PCS ? "PCS" : "XPCS")), | 8935 | (np->mac_xcvr == MAC_XCVR_PCS ? "PCS" : "XPCS")), |
8663 | np->vpd.phy_type); | 8936 | np->vpd.phy_type); |
diff --git a/drivers/net/niu.h b/drivers/net/niu.h index c6fa883daa22..180ca8ae93de 100644 --- a/drivers/net/niu.h +++ b/drivers/net/niu.h | |||
@@ -1048,6 +1048,13 @@ | |||
1048 | #define PLL_CFG_LD_SHIFT 8 | 1048 | #define PLL_CFG_LD_SHIFT 8 |
1049 | #define PLL_CFG_MPY 0x0000001e | 1049 | #define PLL_CFG_MPY 0x0000001e |
1050 | #define PLL_CFG_MPY_SHIFT 1 | 1050 | #define PLL_CFG_MPY_SHIFT 1 |
1051 | #define PLL_CFG_MPY_4X 0x0 | ||
1052 | #define PLL_CFG_MPY_5X 0x00000002 | ||
1053 | #define PLL_CFG_MPY_6X 0x00000004 | ||
1054 | #define PLL_CFG_MPY_8X 0x00000008 | ||
1055 | #define PLL_CFG_MPY_10X 0x0000000a | ||
1056 | #define PLL_CFG_MPY_12X 0x0000000c | ||
1057 | #define PLL_CFG_MPY_12P5X 0x0000000e | ||
1051 | #define PLL_CFG_ENPLL 0x00000001 | 1058 | #define PLL_CFG_ENPLL 0x00000001 |
1052 | 1059 | ||
1053 | #define ESR2_TI_PLL_STS_L (ESR2_BASE + 0x002) | 1060 | #define ESR2_TI_PLL_STS_L (ESR2_BASE + 0x002) |
@@ -1093,6 +1100,9 @@ | |||
1093 | #define PLL_TX_CFG_INVPAIR 0x00000080 | 1100 | #define PLL_TX_CFG_INVPAIR 0x00000080 |
1094 | #define PLL_TX_CFG_RATE 0x00000060 | 1101 | #define PLL_TX_CFG_RATE 0x00000060 |
1095 | #define PLL_TX_CFG_RATE_SHIFT 5 | 1102 | #define PLL_TX_CFG_RATE_SHIFT 5 |
1103 | #define PLL_TX_CFG_RATE_FULL 0x0 | ||
1104 | #define PLL_TX_CFG_RATE_HALF 0x20 | ||
1105 | #define PLL_TX_CFG_RATE_QUAD 0x40 | ||
1096 | #define PLL_TX_CFG_BUSWIDTH 0x0000001c | 1106 | #define PLL_TX_CFG_BUSWIDTH 0x0000001c |
1097 | #define PLL_TX_CFG_BUSWIDTH_SHIFT 2 | 1107 | #define PLL_TX_CFG_BUSWIDTH_SHIFT 2 |
1098 | #define PLL_TX_CFG_ENTEST 0x00000002 | 1108 | #define PLL_TX_CFG_ENTEST 0x00000002 |
@@ -1132,6 +1142,9 @@ | |||
1132 | #define PLL_RX_CFG_INVPAIR 0x00000080 | 1142 | #define PLL_RX_CFG_INVPAIR 0x00000080 |
1133 | #define PLL_RX_CFG_RATE 0x00000060 | 1143 | #define PLL_RX_CFG_RATE 0x00000060 |
1134 | #define PLL_RX_CFG_RATE_SHIFT 5 | 1144 | #define PLL_RX_CFG_RATE_SHIFT 5 |
1145 | #define PLL_RX_CFG_RATE_FULL 0x0 | ||
1146 | #define PLL_RX_CFG_RATE_HALF 0x20 | ||
1147 | #define PLL_RX_CFG_RATE_QUAD 0x40 | ||
1135 | #define PLL_RX_CFG_BUSWIDTH 0x0000001c | 1148 | #define PLL_RX_CFG_BUSWIDTH 0x0000001c |
1136 | #define PLL_RX_CFG_BUSWIDTH_SHIFT 2 | 1149 | #define PLL_RX_CFG_BUSWIDTH_SHIFT 2 |
1137 | #define PLL_RX_CFG_ENTEST 0x00000002 | 1150 | #define PLL_RX_CFG_ENTEST 0x00000002 |
diff --git a/drivers/net/pcmcia/ibmtr_cs.c b/drivers/net/pcmcia/ibmtr_cs.c index cf3cca4642f2..f51944b28cfa 100644 --- a/drivers/net/pcmcia/ibmtr_cs.c +++ b/drivers/net/pcmcia/ibmtr_cs.c | |||
@@ -349,7 +349,7 @@ static int ibmtr_suspend(struct pcmcia_device *link) | |||
349 | return 0; | 349 | return 0; |
350 | } | 350 | } |
351 | 351 | ||
352 | static int ibmtr_resume(struct pcmcia_device *link) | 352 | static int __devinit ibmtr_resume(struct pcmcia_device *link) |
353 | { | 353 | { |
354 | ibmtr_dev_t *info = link->priv; | 354 | ibmtr_dev_t *info = link->priv; |
355 | struct net_device *dev = info->dev; | 355 | struct net_device *dev = info->dev; |
diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c index 4aa547947040..eb6411c4694f 100644 --- a/drivers/net/phy/marvell.c +++ b/drivers/net/phy/marvell.c | |||
@@ -227,6 +227,59 @@ static int m88e1111_config_init(struct phy_device *phydev) | |||
227 | return 0; | 227 | return 0; |
228 | } | 228 | } |
229 | 229 | ||
230 | static int m88e1118_config_aneg(struct phy_device *phydev) | ||
231 | { | ||
232 | int err; | ||
233 | |||
234 | err = phy_write(phydev, MII_BMCR, BMCR_RESET); | ||
235 | if (err < 0) | ||
236 | return err; | ||
237 | |||
238 | err = phy_write(phydev, MII_M1011_PHY_SCR, | ||
239 | MII_M1011_PHY_SCR_AUTO_CROSS); | ||
240 | if (err < 0) | ||
241 | return err; | ||
242 | |||
243 | err = genphy_config_aneg(phydev); | ||
244 | return 0; | ||
245 | } | ||
246 | |||
247 | static int m88e1118_config_init(struct phy_device *phydev) | ||
248 | { | ||
249 | int err; | ||
250 | |||
251 | /* Change address */ | ||
252 | err = phy_write(phydev, 0x16, 0x0002); | ||
253 | if (err < 0) | ||
254 | return err; | ||
255 | |||
256 | /* Enable 1000 Mbit */ | ||
257 | err = phy_write(phydev, 0x15, 0x1070); | ||
258 | if (err < 0) | ||
259 | return err; | ||
260 | |||
261 | /* Change address */ | ||
262 | err = phy_write(phydev, 0x16, 0x0003); | ||
263 | if (err < 0) | ||
264 | return err; | ||
265 | |||
266 | /* Adjust LED Control */ | ||
267 | err = phy_write(phydev, 0x10, 0x021e); | ||
268 | if (err < 0) | ||
269 | return err; | ||
270 | |||
271 | /* Reset address */ | ||
272 | err = phy_write(phydev, 0x16, 0x0); | ||
273 | if (err < 0) | ||
274 | return err; | ||
275 | |||
276 | err = phy_write(phydev, MII_BMCR, BMCR_RESET); | ||
277 | if (err < 0) | ||
278 | return err; | ||
279 | |||
280 | return 0; | ||
281 | } | ||
282 | |||
230 | static int m88e1145_config_init(struct phy_device *phydev) | 283 | static int m88e1145_config_init(struct phy_device *phydev) |
231 | { | 284 | { |
232 | int err; | 285 | int err; |
@@ -416,6 +469,19 @@ static struct phy_driver marvell_drivers[] = { | |||
416 | .driver = { .owner = THIS_MODULE }, | 469 | .driver = { .owner = THIS_MODULE }, |
417 | }, | 470 | }, |
418 | { | 471 | { |
472 | .phy_id = 0x01410e10, | ||
473 | .phy_id_mask = 0xfffffff0, | ||
474 | .name = "Marvell 88E1118", | ||
475 | .features = PHY_GBIT_FEATURES, | ||
476 | .flags = PHY_HAS_INTERRUPT, | ||
477 | .config_init = &m88e1118_config_init, | ||
478 | .config_aneg = &m88e1118_config_aneg, | ||
479 | .read_status = &genphy_read_status, | ||
480 | .ack_interrupt = &marvell_ack_interrupt, | ||
481 | .config_intr = &marvell_config_intr, | ||
482 | .driver = {.owner = THIS_MODULE,}, | ||
483 | }, | ||
484 | { | ||
419 | .phy_id = 0x01410cd0, | 485 | .phy_id = 0x01410cd0, |
420 | .phy_id_mask = 0xfffffff0, | 486 | .phy_id_mask = 0xfffffff0, |
421 | .name = "Marvell 88E1145", | 487 | .name = "Marvell 88E1145", |
diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c index d0ed1ef284a8..536bda1f428b 100644 --- a/drivers/net/phy/mdio_bus.c +++ b/drivers/net/phy/mdio_bus.c | |||
@@ -136,7 +136,7 @@ void mdiobus_unregister(struct mii_bus *bus) | |||
136 | BUG_ON(bus->state != MDIOBUS_REGISTERED); | 136 | BUG_ON(bus->state != MDIOBUS_REGISTERED); |
137 | bus->state = MDIOBUS_UNREGISTERED; | 137 | bus->state = MDIOBUS_UNREGISTERED; |
138 | 138 | ||
139 | device_unregister(&bus->dev); | 139 | device_del(&bus->dev); |
140 | for (i = 0; i < PHY_MAX_ADDR; i++) { | 140 | for (i = 0; i < PHY_MAX_ADDR; i++) { |
141 | if (bus->phy_map[i]) | 141 | if (bus->phy_map[i]) |
142 | device_unregister(&bus->phy_map[i]->dev); | 142 | device_unregister(&bus->phy_map[i]->dev); |
diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c index e11b03b2b25a..55bc24b234e3 100644 --- a/drivers/net/phy/phy_device.c +++ b/drivers/net/phy/phy_device.c | |||
@@ -227,8 +227,8 @@ struct phy_device * get_phy_device(struct mii_bus *bus, int addr) | |||
227 | if (r) | 227 | if (r) |
228 | return ERR_PTR(r); | 228 | return ERR_PTR(r); |
229 | 229 | ||
230 | /* If the phy_id is all Fs, there is no device there */ | 230 | /* If the phy_id is all Fs or all 0s, there is no device there */ |
231 | if (0xffffffff == phy_id) | 231 | if ((0xffff == phy_id) || (0x00 == phy_id)) |
232 | return NULL; | 232 | return NULL; |
233 | 233 | ||
234 | dev = phy_device_create(bus, addr, phy_id); | 234 | dev = phy_device_create(bus, addr, phy_id); |
@@ -564,20 +564,32 @@ EXPORT_SYMBOL(genphy_restart_aneg); | |||
564 | */ | 564 | */ |
565 | int genphy_config_aneg(struct phy_device *phydev) | 565 | int genphy_config_aneg(struct phy_device *phydev) |
566 | { | 566 | { |
567 | int result = 0; | 567 | int result; |
568 | 568 | ||
569 | if (AUTONEG_ENABLE == phydev->autoneg) { | 569 | if (AUTONEG_ENABLE != phydev->autoneg) |
570 | int result = genphy_config_advert(phydev); | 570 | return genphy_setup_forced(phydev); |
571 | |||
572 | result = genphy_config_advert(phydev); | ||
573 | |||
574 | if (result < 0) /* error */ | ||
575 | return result; | ||
571 | 576 | ||
572 | if (result < 0) /* error */ | 577 | if (result == 0) { |
573 | return result; | 578 | /* Advertisment hasn't changed, but maybe aneg was never on to |
579 | * begin with? Or maybe phy was isolated? */ | ||
580 | int ctl = phy_read(phydev, MII_BMCR); | ||
581 | |||
582 | if (ctl < 0) | ||
583 | return ctl; | ||
584 | |||
585 | if (!(ctl & BMCR_ANENABLE) || (ctl & BMCR_ISOLATE)) | ||
586 | result = 1; /* do restart aneg */ | ||
587 | } | ||
574 | 588 | ||
575 | /* Only restart aneg if we are advertising something different | 589 | /* Only restart aneg if we are advertising something different |
576 | * than we were before. */ | 590 | * than we were before. */ |
577 | if (result > 0) | 591 | if (result > 0) |
578 | result = genphy_restart_aneg(phydev); | 592 | result = genphy_restart_aneg(phydev); |
579 | } else | ||
580 | result = genphy_setup_forced(phydev); | ||
581 | 593 | ||
582 | return result; | 594 | return result; |
583 | } | 595 | } |
diff --git a/drivers/net/qla3xxx.c b/drivers/net/qla3xxx.c index 3cdd07c45b6d..508452c02151 100644 --- a/drivers/net/qla3xxx.c +++ b/drivers/net/qla3xxx.c | |||
@@ -1515,9 +1515,6 @@ static u32 ql_get_link_state(struct ql3_adapter *qdev) | |||
1515 | linkState = LS_UP; | 1515 | linkState = LS_UP; |
1516 | } else { | 1516 | } else { |
1517 | linkState = LS_DOWN; | 1517 | linkState = LS_DOWN; |
1518 | if (netif_msg_link(qdev)) | ||
1519 | printk(KERN_WARNING PFX | ||
1520 | "%s: Link is down.\n", qdev->ndev->name); | ||
1521 | } | 1518 | } |
1522 | return linkState; | 1519 | return linkState; |
1523 | } | 1520 | } |
@@ -1581,10 +1578,6 @@ static int ql_finish_auto_neg(struct ql3_adapter *qdev) | |||
1581 | ql_mac_enable(qdev, 1); | 1578 | ql_mac_enable(qdev, 1); |
1582 | } | 1579 | } |
1583 | 1580 | ||
1584 | if (netif_msg_link(qdev)) | ||
1585 | printk(KERN_DEBUG PFX | ||
1586 | "%s: Change port_link_state LS_DOWN to LS_UP.\n", | ||
1587 | qdev->ndev->name); | ||
1588 | qdev->port_link_state = LS_UP; | 1581 | qdev->port_link_state = LS_UP; |
1589 | netif_start_queue(qdev->ndev); | 1582 | netif_start_queue(qdev->ndev); |
1590 | netif_carrier_on(qdev->ndev); | 1583 | netif_carrier_on(qdev->ndev); |
@@ -1655,14 +1648,9 @@ static void ql_link_state_machine_work(struct work_struct *work) | |||
1655 | /* Fall Through */ | 1648 | /* Fall Through */ |
1656 | 1649 | ||
1657 | case LS_DOWN: | 1650 | case LS_DOWN: |
1658 | if (netif_msg_link(qdev)) | ||
1659 | printk(KERN_DEBUG PFX | ||
1660 | "%s: port_link_state = LS_DOWN.\n", | ||
1661 | qdev->ndev->name); | ||
1662 | if (curr_link_state == LS_UP) { | 1651 | if (curr_link_state == LS_UP) { |
1663 | if (netif_msg_link(qdev)) | 1652 | if (netif_msg_link(qdev)) |
1664 | printk(KERN_DEBUG PFX | 1653 | printk(KERN_INFO PFX "%s: Link is up.\n", |
1665 | "%s: curr_link_state = LS_UP.\n", | ||
1666 | qdev->ndev->name); | 1654 | qdev->ndev->name); |
1667 | if (ql_is_auto_neg_complete(qdev)) | 1655 | if (ql_is_auto_neg_complete(qdev)) |
1668 | ql_finish_auto_neg(qdev); | 1656 | ql_finish_auto_neg(qdev); |
@@ -1670,6 +1658,7 @@ static void ql_link_state_machine_work(struct work_struct *work) | |||
1670 | if (qdev->port_link_state == LS_UP) | 1658 | if (qdev->port_link_state == LS_UP) |
1671 | ql_link_down_detect_clear(qdev); | 1659 | ql_link_down_detect_clear(qdev); |
1672 | 1660 | ||
1661 | qdev->port_link_state = LS_UP; | ||
1673 | } | 1662 | } |
1674 | break; | 1663 | break; |
1675 | 1664 | ||
@@ -1678,12 +1667,14 @@ static void ql_link_state_machine_work(struct work_struct *work) | |||
1678 | * See if the link is currently down or went down and came | 1667 | * See if the link is currently down or went down and came |
1679 | * back up | 1668 | * back up |
1680 | */ | 1669 | */ |
1681 | if ((curr_link_state == LS_DOWN) || ql_link_down_detect(qdev)) { | 1670 | if (curr_link_state == LS_DOWN) { |
1682 | if (netif_msg_link(qdev)) | 1671 | if (netif_msg_link(qdev)) |
1683 | printk(KERN_INFO PFX "%s: Link is down.\n", | 1672 | printk(KERN_INFO PFX "%s: Link is down.\n", |
1684 | qdev->ndev->name); | 1673 | qdev->ndev->name); |
1685 | qdev->port_link_state = LS_DOWN; | 1674 | qdev->port_link_state = LS_DOWN; |
1686 | } | 1675 | } |
1676 | if (ql_link_down_detect(qdev)) | ||
1677 | qdev->port_link_state = LS_DOWN; | ||
1687 | break; | 1678 | break; |
1688 | } | 1679 | } |
1689 | spin_unlock_irqrestore(&qdev->hw_lock, hw_flags); | 1680 | spin_unlock_irqrestore(&qdev->hw_lock, hw_flags); |
diff --git a/drivers/net/sh_eth.c b/drivers/net/sh_eth.c index a24bb68887ab..59f242a67714 100644 --- a/drivers/net/sh_eth.c +++ b/drivers/net/sh_eth.c | |||
@@ -927,7 +927,7 @@ static int sh_eth_start_xmit(struct sk_buff *skb, struct net_device *ndev) | |||
927 | struct sh_eth_private *mdp = netdev_priv(ndev); | 927 | struct sh_eth_private *mdp = netdev_priv(ndev); |
928 | struct sh_eth_txdesc *txdesc; | 928 | struct sh_eth_txdesc *txdesc; |
929 | u32 entry; | 929 | u32 entry; |
930 | int flags; | 930 | unsigned long flags; |
931 | 931 | ||
932 | spin_lock_irqsave(&mdp->lock, flags); | 932 | spin_lock_irqsave(&mdp->lock, flags); |
933 | if ((mdp->cur_tx - mdp->dirty_tx) >= (TX_RING_SIZE - 4)) { | 933 | if ((mdp->cur_tx - mdp->dirty_tx) >= (TX_RING_SIZE - 4)) { |
@@ -1141,7 +1141,7 @@ static int sh_mdio_init(struct net_device *ndev, int id) | |||
1141 | /* Hook up MII support for ethtool */ | 1141 | /* Hook up MII support for ethtool */ |
1142 | mdp->mii_bus->name = "sh_mii"; | 1142 | mdp->mii_bus->name = "sh_mii"; |
1143 | mdp->mii_bus->parent = &ndev->dev; | 1143 | mdp->mii_bus->parent = &ndev->dev; |
1144 | mdp->mii_bus->id[0] = id; | 1144 | snprintf(mdp->mii_bus->id, MII_BUS_ID_SIZE, "%x", id); |
1145 | 1145 | ||
1146 | /* PHY IRQ */ | 1146 | /* PHY IRQ */ |
1147 | mdp->mii_bus->irq = kmalloc(sizeof(int)*PHY_MAX_ADDR, GFP_KERNEL); | 1147 | mdp->mii_bus->irq = kmalloc(sizeof(int)*PHY_MAX_ADDR, GFP_KERNEL); |
diff --git a/drivers/net/smc911x.c b/drivers/net/smc911x.c index 5051554ff05b..9a16a79b67d0 100644 --- a/drivers/net/smc911x.c +++ b/drivers/net/smc911x.c | |||
@@ -1735,7 +1735,7 @@ static const struct ethtool_ops smc911x_ethtool_ops = { | |||
1735 | * This routine has a simple purpose -- make the SMC chip generate an | 1735 | * This routine has a simple purpose -- make the SMC chip generate an |
1736 | * interrupt, so an auto-detect routine can detect it, and find the IRQ, | 1736 | * interrupt, so an auto-detect routine can detect it, and find the IRQ, |
1737 | */ | 1737 | */ |
1738 | static int __init smc911x_findirq(struct net_device *dev) | 1738 | static int __devinit smc911x_findirq(struct net_device *dev) |
1739 | { | 1739 | { |
1740 | struct smc911x_local *lp = netdev_priv(dev); | 1740 | struct smc911x_local *lp = netdev_priv(dev); |
1741 | int timeout = 20; | 1741 | int timeout = 20; |
@@ -1799,7 +1799,7 @@ static int __init smc911x_findirq(struct net_device *dev) | |||
1799 | * o actually GRAB the irq. | 1799 | * o actually GRAB the irq. |
1800 | * o GRAB the region | 1800 | * o GRAB the region |
1801 | */ | 1801 | */ |
1802 | static int __init smc911x_probe(struct net_device *dev) | 1802 | static int __devinit smc911x_probe(struct net_device *dev) |
1803 | { | 1803 | { |
1804 | struct smc911x_local *lp = netdev_priv(dev); | 1804 | struct smc911x_local *lp = netdev_priv(dev); |
1805 | int i, retval; | 1805 | int i, retval; |
@@ -1813,7 +1813,7 @@ static int __init smc911x_probe(struct net_device *dev) | |||
1813 | val = SMC_GET_BYTE_TEST(lp); | 1813 | val = SMC_GET_BYTE_TEST(lp); |
1814 | DBG(SMC_DEBUG_MISC, "%s: endian probe returned 0x%04x\n", CARDNAME, val); | 1814 | DBG(SMC_DEBUG_MISC, "%s: endian probe returned 0x%04x\n", CARDNAME, val); |
1815 | if (val != 0x87654321) { | 1815 | if (val != 0x87654321) { |
1816 | printk(KERN_ERR "Invalid chip endian 0x08%x\n",val); | 1816 | printk(KERN_ERR "Invalid chip endian 0x%08x\n",val); |
1817 | retval = -ENODEV; | 1817 | retval = -ENODEV; |
1818 | goto err_out; | 1818 | goto err_out; |
1819 | } | 1819 | } |
@@ -2048,9 +2048,11 @@ err_out: | |||
2048 | * 0 --> there is a device | 2048 | * 0 --> there is a device |
2049 | * anything else, error | 2049 | * anything else, error |
2050 | */ | 2050 | */ |
2051 | static int smc911x_drv_probe(struct platform_device *pdev) | 2051 | static int __devinit smc911x_drv_probe(struct platform_device *pdev) |
2052 | { | 2052 | { |
2053 | #ifdef SMC_DYNAMIC_BUS_CONFIG | ||
2053 | struct smc911x_platdata *pd = pdev->dev.platform_data; | 2054 | struct smc911x_platdata *pd = pdev->dev.platform_data; |
2055 | #endif | ||
2054 | struct net_device *ndev; | 2056 | struct net_device *ndev; |
2055 | struct resource *res; | 2057 | struct resource *res; |
2056 | struct smc911x_local *lp; | 2058 | struct smc911x_local *lp; |
@@ -2122,7 +2124,7 @@ out: | |||
2122 | return ret; | 2124 | return ret; |
2123 | } | 2125 | } |
2124 | 2126 | ||
2125 | static int smc911x_drv_remove(struct platform_device *pdev) | 2127 | static int __devexit smc911x_drv_remove(struct platform_device *pdev) |
2126 | { | 2128 | { |
2127 | struct net_device *ndev = platform_get_drvdata(pdev); | 2129 | struct net_device *ndev = platform_get_drvdata(pdev); |
2128 | struct smc911x_local *lp = netdev_priv(ndev); | 2130 | struct smc911x_local *lp = netdev_priv(ndev); |
@@ -2182,9 +2184,9 @@ static int smc911x_drv_resume(struct platform_device *dev) | |||
2182 | 2184 | ||
2183 | if (netif_running(ndev)) { | 2185 | if (netif_running(ndev)) { |
2184 | smc911x_reset(ndev); | 2186 | smc911x_reset(ndev); |
2185 | smc911x_enable(ndev); | ||
2186 | if (lp->phy_type != 0) | 2187 | if (lp->phy_type != 0) |
2187 | smc911x_phy_configure(&lp->phy_configure); | 2188 | smc911x_phy_configure(&lp->phy_configure); |
2189 | smc911x_enable(ndev); | ||
2188 | netif_device_attach(ndev); | 2190 | netif_device_attach(ndev); |
2189 | } | 2191 | } |
2190 | } | 2192 | } |
@@ -2193,7 +2195,7 @@ static int smc911x_drv_resume(struct platform_device *dev) | |||
2193 | 2195 | ||
2194 | static struct platform_driver smc911x_driver = { | 2196 | static struct platform_driver smc911x_driver = { |
2195 | .probe = smc911x_drv_probe, | 2197 | .probe = smc911x_drv_probe, |
2196 | .remove = smc911x_drv_remove, | 2198 | .remove = __devexit_p(smc911x_drv_remove), |
2197 | .suspend = smc911x_drv_suspend, | 2199 | .suspend = smc911x_drv_suspend, |
2198 | .resume = smc911x_drv_resume, | 2200 | .resume = smc911x_drv_resume, |
2199 | .driver = { | 2201 | .driver = { |
diff --git a/drivers/net/smc91x.c b/drivers/net/smc91x.c index fc80f250da31..35c56abf4113 100644 --- a/drivers/net/smc91x.c +++ b/drivers/net/smc91x.c | |||
@@ -1696,7 +1696,7 @@ static const struct ethtool_ops smc_ethtool_ops = { | |||
1696 | * I just deleted auto_irq.c, since it was never built... | 1696 | * I just deleted auto_irq.c, since it was never built... |
1697 | * --jgarzik | 1697 | * --jgarzik |
1698 | */ | 1698 | */ |
1699 | static int __init smc_findirq(struct smc_local *lp) | 1699 | static int __devinit smc_findirq(struct smc_local *lp) |
1700 | { | 1700 | { |
1701 | void __iomem *ioaddr = lp->base; | 1701 | void __iomem *ioaddr = lp->base; |
1702 | int timeout = 20; | 1702 | int timeout = 20; |
@@ -1770,7 +1770,7 @@ static int __init smc_findirq(struct smc_local *lp) | |||
1770 | * o actually GRAB the irq. | 1770 | * o actually GRAB the irq. |
1771 | * o GRAB the region | 1771 | * o GRAB the region |
1772 | */ | 1772 | */ |
1773 | static int __init smc_probe(struct net_device *dev, void __iomem *ioaddr, | 1773 | static int __devinit smc_probe(struct net_device *dev, void __iomem *ioaddr, |
1774 | unsigned long irq_flags) | 1774 | unsigned long irq_flags) |
1775 | { | 1775 | { |
1776 | struct smc_local *lp = netdev_priv(dev); | 1776 | struct smc_local *lp = netdev_priv(dev); |
@@ -2126,7 +2126,7 @@ static void smc_release_datacs(struct platform_device *pdev, struct net_device * | |||
2126 | * 0 --> there is a device | 2126 | * 0 --> there is a device |
2127 | * anything else, error | 2127 | * anything else, error |
2128 | */ | 2128 | */ |
2129 | static int smc_drv_probe(struct platform_device *pdev) | 2129 | static int __devinit smc_drv_probe(struct platform_device *pdev) |
2130 | { | 2130 | { |
2131 | struct smc91x_platdata *pd = pdev->dev.platform_data; | 2131 | struct smc91x_platdata *pd = pdev->dev.platform_data; |
2132 | struct smc_local *lp; | 2132 | struct smc_local *lp; |
@@ -2240,7 +2240,7 @@ static int smc_drv_probe(struct platform_device *pdev) | |||
2240 | return ret; | 2240 | return ret; |
2241 | } | 2241 | } |
2242 | 2242 | ||
2243 | static int smc_drv_remove(struct platform_device *pdev) | 2243 | static int __devexit smc_drv_remove(struct platform_device *pdev) |
2244 | { | 2244 | { |
2245 | struct net_device *ndev = platform_get_drvdata(pdev); | 2245 | struct net_device *ndev = platform_get_drvdata(pdev); |
2246 | struct smc_local *lp = netdev_priv(ndev); | 2246 | struct smc_local *lp = netdev_priv(ndev); |
@@ -2305,7 +2305,7 @@ static int smc_drv_resume(struct platform_device *dev) | |||
2305 | 2305 | ||
2306 | static struct platform_driver smc_driver = { | 2306 | static struct platform_driver smc_driver = { |
2307 | .probe = smc_drv_probe, | 2307 | .probe = smc_drv_probe, |
2308 | .remove = smc_drv_remove, | 2308 | .remove = __devexit_p(smc_drv_remove), |
2309 | .suspend = smc_drv_suspend, | 2309 | .suspend = smc_drv_suspend, |
2310 | .resume = smc_drv_resume, | 2310 | .resume = smc_drv_resume, |
2311 | .driver = { | 2311 | .driver = { |
diff --git a/drivers/net/ucc_geth_ethtool.c b/drivers/net/ucc_geth_ethtool.c index 85f38a6b6a49..68a7f5414133 100644 --- a/drivers/net/ucc_geth_ethtool.c +++ b/drivers/net/ucc_geth_ethtool.c | |||
@@ -323,17 +323,17 @@ static void uec_get_ethtool_stats(struct net_device *netdev, | |||
323 | if (stats_mode & UCC_GETH_STATISTICS_GATHERING_MODE_HARDWARE) { | 323 | if (stats_mode & UCC_GETH_STATISTICS_GATHERING_MODE_HARDWARE) { |
324 | base = (u32 __iomem *)&ugeth->ug_regs->tx64; | 324 | base = (u32 __iomem *)&ugeth->ug_regs->tx64; |
325 | for (i = 0; i < UEC_HW_STATS_LEN; i++) | 325 | for (i = 0; i < UEC_HW_STATS_LEN; i++) |
326 | data[j++] = (u64)in_be32(&base[i]); | 326 | data[j++] = in_be32(&base[i]); |
327 | } | 327 | } |
328 | if (stats_mode & UCC_GETH_STATISTICS_GATHERING_MODE_FIRMWARE_TX) { | 328 | if (stats_mode & UCC_GETH_STATISTICS_GATHERING_MODE_FIRMWARE_TX) { |
329 | base = (u32 __iomem *)ugeth->p_tx_fw_statistics_pram; | 329 | base = (u32 __iomem *)ugeth->p_tx_fw_statistics_pram; |
330 | for (i = 0; i < UEC_TX_FW_STATS_LEN; i++) | 330 | for (i = 0; i < UEC_TX_FW_STATS_LEN; i++) |
331 | data[j++] = (u64)in_be32(&base[i]); | 331 | data[j++] = base ? in_be32(&base[i]) : 0; |
332 | } | 332 | } |
333 | if (stats_mode & UCC_GETH_STATISTICS_GATHERING_MODE_FIRMWARE_RX) { | 333 | if (stats_mode & UCC_GETH_STATISTICS_GATHERING_MODE_FIRMWARE_RX) { |
334 | base = (u32 __iomem *)ugeth->p_rx_fw_statistics_pram; | 334 | base = (u32 __iomem *)ugeth->p_rx_fw_statistics_pram; |
335 | for (i = 0; i < UEC_RX_FW_STATS_LEN; i++) | 335 | for (i = 0; i < UEC_RX_FW_STATS_LEN; i++) |
336 | data[j++] = (u64)in_be32(&base[i]); | 336 | data[j++] = base ? in_be32(&base[i]) : 0; |
337 | } | 337 | } |
338 | } | 338 | } |
339 | 339 | ||
diff --git a/drivers/net/usb/asix.c b/drivers/net/usb/asix.c index 37ecf845edfe..de57490103fc 100644 --- a/drivers/net/usb/asix.c +++ b/drivers/net/usb/asix.c | |||
@@ -1102,12 +1102,14 @@ static int ax88178_link_reset(struct usbnet *dev) | |||
1102 | mode = AX88178_MEDIUM_DEFAULT; | 1102 | mode = AX88178_MEDIUM_DEFAULT; |
1103 | 1103 | ||
1104 | if (ecmd.speed == SPEED_1000) | 1104 | if (ecmd.speed == SPEED_1000) |
1105 | mode |= AX_MEDIUM_GM | AX_MEDIUM_ENCK; | 1105 | mode |= AX_MEDIUM_GM; |
1106 | else if (ecmd.speed == SPEED_100) | 1106 | else if (ecmd.speed == SPEED_100) |
1107 | mode |= AX_MEDIUM_PS; | 1107 | mode |= AX_MEDIUM_PS; |
1108 | else | 1108 | else |
1109 | mode &= ~(AX_MEDIUM_PS | AX_MEDIUM_GM); | 1109 | mode &= ~(AX_MEDIUM_PS | AX_MEDIUM_GM); |
1110 | 1110 | ||
1111 | mode |= AX_MEDIUM_ENCK; | ||
1112 | |||
1111 | if (ecmd.duplex == DUPLEX_FULL) | 1113 | if (ecmd.duplex == DUPLEX_FULL) |
1112 | mode |= AX_MEDIUM_FD; | 1114 | mode |= AX_MEDIUM_FD; |
1113 | else | 1115 | else |
@@ -1444,6 +1446,10 @@ static const struct usb_device_id products [] = { | |||
1444 | // Apple USB Ethernet Adapter | 1446 | // Apple USB Ethernet Adapter |
1445 | USB_DEVICE(0x05ac, 0x1402), | 1447 | USB_DEVICE(0x05ac, 0x1402), |
1446 | .driver_info = (unsigned long) &ax88772_info, | 1448 | .driver_info = (unsigned long) &ax88772_info, |
1449 | }, { | ||
1450 | // Cables-to-Go USB Ethernet Adapter | ||
1451 | USB_DEVICE(0x0b95, 0x772a), | ||
1452 | .driver_info = (unsigned long) &ax88772_info, | ||
1447 | }, | 1453 | }, |
1448 | { }, // END | 1454 | { }, // END |
1449 | }; | 1455 | }; |
diff --git a/drivers/net/via-velocity.c b/drivers/net/via-velocity.c index 3590ea5a902d..11cb3e504e1c 100644 --- a/drivers/net/via-velocity.c +++ b/drivers/net/via-velocity.c | |||
@@ -2296,7 +2296,7 @@ static void velocity_set_multi(struct net_device *dev) | |||
2296 | } | 2296 | } |
2297 | 2297 | ||
2298 | mac_set_cam_mask(regs, vptr->mCAMmask); | 2298 | mac_set_cam_mask(regs, vptr->mCAMmask); |
2299 | rx_mode = (RCR_AM | RCR_AB); | 2299 | rx_mode = RCR_AM | RCR_AB | RCR_AP; |
2300 | } | 2300 | } |
2301 | if (dev->mtu > 1500) | 2301 | if (dev->mtu > 1500) |
2302 | rx_mode |= RCR_AL; | 2302 | rx_mode |= RCR_AL; |
diff --git a/drivers/net/wireless/hostap/hostap_wlan.h b/drivers/net/wireless/hostap/hostap_wlan.h index ffdf4876121b..a68f97c39359 100644 --- a/drivers/net/wireless/hostap/hostap_wlan.h +++ b/drivers/net/wireless/hostap/hostap_wlan.h | |||
@@ -918,9 +918,12 @@ struct hostap_interface { | |||
918 | 918 | ||
919 | /* | 919 | /* |
920 | * TX meta data - stored in skb->cb buffer, so this must not be increased over | 920 | * TX meta data - stored in skb->cb buffer, so this must not be increased over |
921 | * the 40-byte limit | 921 | * the 48-byte limit. |
922 | * THE PADDING THIS STARTS WITH IS A HORRIBLE HACK THAT SHOULD NOT LIVE | ||
923 | * TO SEE THE DAY. | ||
922 | */ | 924 | */ |
923 | struct hostap_skb_tx_data { | 925 | struct hostap_skb_tx_data { |
926 | unsigned int __padding_for_default_qdiscs; | ||
924 | u32 magic; /* HOSTAP_SKB_TX_DATA_MAGIC */ | 927 | u32 magic; /* HOSTAP_SKB_TX_DATA_MAGIC */ |
925 | u8 rate; /* transmit rate */ | 928 | u8 rate; /* transmit rate */ |
926 | #define HOSTAP_TX_FLAGS_WDS BIT(0) | 929 | #define HOSTAP_TX_FLAGS_WDS BIT(0) |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c index 8d690a0eb1a9..444c5cc05f03 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c | |||
@@ -1384,7 +1384,7 @@ void iwl_rx_handle(struct iwl_priv *priv) | |||
1384 | 1384 | ||
1385 | rxq->queue[i] = NULL; | 1385 | rxq->queue[i] = NULL; |
1386 | 1386 | ||
1387 | pci_dma_sync_single_for_cpu(priv->pci_dev, rxb->dma_addr, | 1387 | pci_dma_sync_single_for_cpu(priv->pci_dev, rxb->aligned_dma_addr, |
1388 | priv->hw_params.rx_buf_size, | 1388 | priv->hw_params.rx_buf_size, |
1389 | PCI_DMA_FROMDEVICE); | 1389 | PCI_DMA_FROMDEVICE); |
1390 | pkt = (struct iwl_rx_packet *)rxb->skb->data; | 1390 | pkt = (struct iwl_rx_packet *)rxb->skb->data; |
@@ -1436,8 +1436,8 @@ void iwl_rx_handle(struct iwl_priv *priv) | |||
1436 | rxb->skb = NULL; | 1436 | rxb->skb = NULL; |
1437 | } | 1437 | } |
1438 | 1438 | ||
1439 | pci_unmap_single(priv->pci_dev, rxb->dma_addr, | 1439 | pci_unmap_single(priv->pci_dev, rxb->real_dma_addr, |
1440 | priv->hw_params.rx_buf_size, | 1440 | priv->hw_params.rx_buf_size + 256, |
1441 | PCI_DMA_FROMDEVICE); | 1441 | PCI_DMA_FROMDEVICE); |
1442 | spin_lock_irqsave(&rxq->lock, flags); | 1442 | spin_lock_irqsave(&rxq->lock, flags); |
1443 | list_add_tail(&rxb->list, &priv->rxq.rx_used); | 1443 | list_add_tail(&rxb->list, &priv->rxq.rx_used); |
@@ -2341,7 +2341,6 @@ static void iwl_bg_alive_start(struct work_struct *data) | |||
2341 | mutex_lock(&priv->mutex); | 2341 | mutex_lock(&priv->mutex); |
2342 | iwl_alive_start(priv); | 2342 | iwl_alive_start(priv); |
2343 | mutex_unlock(&priv->mutex); | 2343 | mutex_unlock(&priv->mutex); |
2344 | ieee80211_notify_mac(priv->hw, IEEE80211_NOTIFY_RE_ASSOC); | ||
2345 | } | 2344 | } |
2346 | 2345 | ||
2347 | static void iwl4965_bg_rf_kill(struct work_struct *work) | 2346 | static void iwl4965_bg_rf_kill(struct work_struct *work) |
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h index c018121085e9..9966d4e384ce 100644 --- a/drivers/net/wireless/iwlwifi/iwl-dev.h +++ b/drivers/net/wireless/iwlwifi/iwl-dev.h | |||
@@ -89,7 +89,8 @@ extern struct iwl_cfg iwl5100_abg_cfg; | |||
89 | #define DEFAULT_LONG_RETRY_LIMIT 4U | 89 | #define DEFAULT_LONG_RETRY_LIMIT 4U |
90 | 90 | ||
91 | struct iwl_rx_mem_buffer { | 91 | struct iwl_rx_mem_buffer { |
92 | dma_addr_t dma_addr; | 92 | dma_addr_t real_dma_addr; |
93 | dma_addr_t aligned_dma_addr; | ||
93 | struct sk_buff *skb; | 94 | struct sk_buff *skb; |
94 | struct list_head list; | 95 | struct list_head list; |
95 | }; | 96 | }; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-rx.c b/drivers/net/wireless/iwlwifi/iwl-rx.c index 7cde9d76ff5d..0509c16dbe75 100644 --- a/drivers/net/wireless/iwlwifi/iwl-rx.c +++ b/drivers/net/wireless/iwlwifi/iwl-rx.c | |||
@@ -204,7 +204,7 @@ int iwl_rx_queue_restock(struct iwl_priv *priv) | |||
204 | list_del(element); | 204 | list_del(element); |
205 | 205 | ||
206 | /* Point to Rx buffer via next RBD in circular buffer */ | 206 | /* Point to Rx buffer via next RBD in circular buffer */ |
207 | rxq->bd[rxq->write] = iwl_dma_addr2rbd_ptr(priv, rxb->dma_addr); | 207 | rxq->bd[rxq->write] = iwl_dma_addr2rbd_ptr(priv, rxb->aligned_dma_addr); |
208 | rxq->queue[rxq->write] = rxb; | 208 | rxq->queue[rxq->write] = rxb; |
209 | rxq->write = (rxq->write + 1) & RX_QUEUE_MASK; | 209 | rxq->write = (rxq->write + 1) & RX_QUEUE_MASK; |
210 | rxq->free_count--; | 210 | rxq->free_count--; |
@@ -251,7 +251,7 @@ void iwl_rx_allocate(struct iwl_priv *priv) | |||
251 | rxb = list_entry(element, struct iwl_rx_mem_buffer, list); | 251 | rxb = list_entry(element, struct iwl_rx_mem_buffer, list); |
252 | 252 | ||
253 | /* Alloc a new receive buffer */ | 253 | /* Alloc a new receive buffer */ |
254 | rxb->skb = alloc_skb(priv->hw_params.rx_buf_size, | 254 | rxb->skb = alloc_skb(priv->hw_params.rx_buf_size + 256, |
255 | __GFP_NOWARN | GFP_ATOMIC); | 255 | __GFP_NOWARN | GFP_ATOMIC); |
256 | if (!rxb->skb) { | 256 | if (!rxb->skb) { |
257 | if (net_ratelimit()) | 257 | if (net_ratelimit()) |
@@ -266,9 +266,17 @@ void iwl_rx_allocate(struct iwl_priv *priv) | |||
266 | list_del(element); | 266 | list_del(element); |
267 | 267 | ||
268 | /* Get physical address of RB/SKB */ | 268 | /* Get physical address of RB/SKB */ |
269 | rxb->dma_addr = | 269 | rxb->real_dma_addr = pci_map_single( |
270 | pci_map_single(priv->pci_dev, rxb->skb->data, | 270 | priv->pci_dev, |
271 | priv->hw_params.rx_buf_size, PCI_DMA_FROMDEVICE); | 271 | rxb->skb->data, |
272 | priv->hw_params.rx_buf_size + 256, | ||
273 | PCI_DMA_FROMDEVICE); | ||
274 | /* dma address must be no more than 36 bits */ | ||
275 | BUG_ON(rxb->real_dma_addr & ~DMA_BIT_MASK(36)); | ||
276 | /* and also 256 byte aligned! */ | ||
277 | rxb->aligned_dma_addr = ALIGN(rxb->real_dma_addr, 256); | ||
278 | skb_reserve(rxb->skb, rxb->aligned_dma_addr - rxb->real_dma_addr); | ||
279 | |||
272 | list_add_tail(&rxb->list, &rxq->rx_free); | 280 | list_add_tail(&rxb->list, &rxq->rx_free); |
273 | rxq->free_count++; | 281 | rxq->free_count++; |
274 | } | 282 | } |
@@ -300,8 +308,8 @@ void iwl_rx_queue_free(struct iwl_priv *priv, struct iwl_rx_queue *rxq) | |||
300 | for (i = 0; i < RX_QUEUE_SIZE + RX_FREE_BUFFERS; i++) { | 308 | for (i = 0; i < RX_QUEUE_SIZE + RX_FREE_BUFFERS; i++) { |
301 | if (rxq->pool[i].skb != NULL) { | 309 | if (rxq->pool[i].skb != NULL) { |
302 | pci_unmap_single(priv->pci_dev, | 310 | pci_unmap_single(priv->pci_dev, |
303 | rxq->pool[i].dma_addr, | 311 | rxq->pool[i].real_dma_addr, |
304 | priv->hw_params.rx_buf_size, | 312 | priv->hw_params.rx_buf_size + 256, |
305 | PCI_DMA_FROMDEVICE); | 313 | PCI_DMA_FROMDEVICE); |
306 | dev_kfree_skb(rxq->pool[i].skb); | 314 | dev_kfree_skb(rxq->pool[i].skb); |
307 | } | 315 | } |
@@ -354,8 +362,8 @@ void iwl_rx_queue_reset(struct iwl_priv *priv, struct iwl_rx_queue *rxq) | |||
354 | * to an SKB, so we need to unmap and free potential storage */ | 362 | * to an SKB, so we need to unmap and free potential storage */ |
355 | if (rxq->pool[i].skb != NULL) { | 363 | if (rxq->pool[i].skb != NULL) { |
356 | pci_unmap_single(priv->pci_dev, | 364 | pci_unmap_single(priv->pci_dev, |
357 | rxq->pool[i].dma_addr, | 365 | rxq->pool[i].real_dma_addr, |
358 | priv->hw_params.rx_buf_size, | 366 | priv->hw_params.rx_buf_size + 256, |
359 | PCI_DMA_FROMDEVICE); | 367 | PCI_DMA_FROMDEVICE); |
360 | priv->alloc_rxb_skb--; | 368 | priv->alloc_rxb_skb--; |
361 | dev_kfree_skb(rxq->pool[i].skb); | 369 | dev_kfree_skb(rxq->pool[i].skb); |
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index 285b53e7e261..45a6b0c35695 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |||
@@ -6012,7 +6012,6 @@ static void iwl3945_bg_alive_start(struct work_struct *data) | |||
6012 | mutex_lock(&priv->mutex); | 6012 | mutex_lock(&priv->mutex); |
6013 | iwl3945_alive_start(priv); | 6013 | iwl3945_alive_start(priv); |
6014 | mutex_unlock(&priv->mutex); | 6014 | mutex_unlock(&priv->mutex); |
6015 | ieee80211_notify_mac(priv->hw, IEEE80211_NOTIFY_RE_ASSOC); | ||
6016 | } | 6015 | } |
6017 | 6016 | ||
6018 | static void iwl3945_bg_rf_kill(struct work_struct *work) | 6017 | static void iwl3945_bg_rf_kill(struct work_struct *work) |
diff --git a/drivers/net/wireless/libertas_tf/if_usb.c b/drivers/net/wireless/libertas_tf/if_usb.c index 1cc03a8dd67a..59634c33b1f9 100644 --- a/drivers/net/wireless/libertas_tf/if_usb.c +++ b/drivers/net/wireless/libertas_tf/if_usb.c | |||
@@ -331,7 +331,7 @@ static int __if_usb_submit_rx_urb(struct if_usb_card *cardp, | |||
331 | /* Fill the receive configuration URB and initialise the Rx call back */ | 331 | /* Fill the receive configuration URB and initialise the Rx call back */ |
332 | usb_fill_bulk_urb(cardp->rx_urb, cardp->udev, | 332 | usb_fill_bulk_urb(cardp->rx_urb, cardp->udev, |
333 | usb_rcvbulkpipe(cardp->udev, cardp->ep_in), | 333 | usb_rcvbulkpipe(cardp->udev, cardp->ep_in), |
334 | (void *) (skb->tail), | 334 | skb_tail_pointer(skb), |
335 | MRVDRV_ETH_RX_PACKET_BUFFER_SIZE, callbackfn, cardp); | 335 | MRVDRV_ETH_RX_PACKET_BUFFER_SIZE, callbackfn, cardp); |
336 | 336 | ||
337 | cardp->rx_urb->transfer_flags |= URB_ZERO_PACKET; | 337 | cardp->rx_urb->transfer_flags |= URB_ZERO_PACKET; |
diff --git a/drivers/net/wireless/rtl8187_dev.c b/drivers/net/wireless/rtl8187_dev.c index 431e3c78bf27..69eb0132593b 100644 --- a/drivers/net/wireless/rtl8187_dev.c +++ b/drivers/net/wireless/rtl8187_dev.c | |||
@@ -48,6 +48,9 @@ static struct usb_device_id rtl8187_table[] __devinitdata = { | |||
48 | {USB_DEVICE(0x03f0, 0xca02), .driver_info = DEVICE_RTL8187}, | 48 | {USB_DEVICE(0x03f0, 0xca02), .driver_info = DEVICE_RTL8187}, |
49 | /* Sitecom */ | 49 | /* Sitecom */ |
50 | {USB_DEVICE(0x0df6, 0x000d), .driver_info = DEVICE_RTL8187}, | 50 | {USB_DEVICE(0x0df6, 0x000d), .driver_info = DEVICE_RTL8187}, |
51 | {USB_DEVICE(0x0df6, 0x0028), .driver_info = DEVICE_RTL8187B}, | ||
52 | /* Abocom */ | ||
53 | {USB_DEVICE(0x13d1, 0xabe6), .driver_info = DEVICE_RTL8187}, | ||
51 | {} | 54 | {} |
52 | }; | 55 | }; |
53 | 56 | ||
diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c index c6948d8f53f6..6d017adc914a 100644 --- a/drivers/net/xen-netfront.c +++ b/drivers/net/xen-netfront.c | |||
@@ -1785,7 +1785,7 @@ static int __devexit xennet_remove(struct xenbus_device *dev) | |||
1785 | return 0; | 1785 | return 0; |
1786 | } | 1786 | } |
1787 | 1787 | ||
1788 | static struct xenbus_driver netfront = { | 1788 | static struct xenbus_driver netfront_driver = { |
1789 | .name = "vif", | 1789 | .name = "vif", |
1790 | .owner = THIS_MODULE, | 1790 | .owner = THIS_MODULE, |
1791 | .ids = netfront_ids, | 1791 | .ids = netfront_ids, |
@@ -1805,7 +1805,7 @@ static int __init netif_init(void) | |||
1805 | 1805 | ||
1806 | printk(KERN_INFO "Initialising Xen virtual ethernet driver.\n"); | 1806 | printk(KERN_INFO "Initialising Xen virtual ethernet driver.\n"); |
1807 | 1807 | ||
1808 | return xenbus_register_frontend(&netfront); | 1808 | return xenbus_register_frontend(&netfront_driver); |
1809 | } | 1809 | } |
1810 | module_init(netif_init); | 1810 | module_init(netif_init); |
1811 | 1811 | ||
@@ -1815,7 +1815,7 @@ static void __exit netif_exit(void) | |||
1815 | if (xen_initial_domain()) | 1815 | if (xen_initial_domain()) |
1816 | return; | 1816 | return; |
1817 | 1817 | ||
1818 | xenbus_unregister_driver(&netfront); | 1818 | xenbus_unregister_driver(&netfront_driver); |
1819 | } | 1819 | } |
1820 | module_exit(netif_exit); | 1820 | module_exit(netif_exit); |
1821 | 1821 | ||
diff --git a/drivers/parport/Kconfig b/drivers/parport/Kconfig index 209b4a464bcf..855f389eea40 100644 --- a/drivers/parport/Kconfig +++ b/drivers/parport/Kconfig | |||
@@ -36,7 +36,7 @@ if PARPORT | |||
36 | config PARPORT_PC | 36 | config PARPORT_PC |
37 | tristate "PC-style hardware" | 37 | tristate "PC-style hardware" |
38 | depends on (!SPARC64 || PCI) && !SPARC32 && !M32R && !FRV && \ | 38 | depends on (!SPARC64 || PCI) && !SPARC32 && !M32R && !FRV && \ |
39 | (!M68K || ISA) && !MN10300 && !AVR32 | 39 | (!M68K || ISA) && !MN10300 && !AVR32 && !BLACKFIN |
40 | ---help--- | 40 | ---help--- |
41 | You should say Y here if you have a PC-style parallel port. All | 41 | You should say Y here if you have a PC-style parallel port. All |
42 | IBM PC compatible computers and some Alphas have PC-style | 42 | IBM PC compatible computers and some Alphas have PC-style |
diff --git a/drivers/parport/parport_serial.c b/drivers/parport/parport_serial.c index e2e95b36a603..101ed49a2d15 100644 --- a/drivers/parport/parport_serial.c +++ b/drivers/parport/parport_serial.c | |||
@@ -70,6 +70,8 @@ static int __devinit netmos_parallel_init(struct pci_dev *dev, struct parport_pc | |||
70 | * parallel ports and <S> is the number of serial ports. | 70 | * parallel ports and <S> is the number of serial ports. |
71 | */ | 71 | */ |
72 | card->numports = (dev->subsystem_device & 0xf0) >> 4; | 72 | card->numports = (dev->subsystem_device & 0xf0) >> 4; |
73 | if (card->numports > ARRAY_SIZE(card->addr)) | ||
74 | card->numports = ARRAY_SIZE(card->addr); | ||
73 | return 0; | 75 | return 0; |
74 | } | 76 | } |
75 | 77 | ||
diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c index a2692724b68f..5c8baa43ac9c 100644 --- a/drivers/pci/intel-iommu.c +++ b/drivers/pci/intel-iommu.c | |||
@@ -1655,12 +1655,14 @@ int __init init_dmars(void) | |||
1655 | iommu->flush.flush_context = __iommu_flush_context; | 1655 | iommu->flush.flush_context = __iommu_flush_context; |
1656 | iommu->flush.flush_iotlb = __iommu_flush_iotlb; | 1656 | iommu->flush.flush_iotlb = __iommu_flush_iotlb; |
1657 | printk(KERN_INFO "IOMMU 0x%Lx: using Register based " | 1657 | printk(KERN_INFO "IOMMU 0x%Lx: using Register based " |
1658 | "invalidation\n", drhd->reg_base_addr); | 1658 | "invalidation\n", |
1659 | (unsigned long long)drhd->reg_base_addr); | ||
1659 | } else { | 1660 | } else { |
1660 | iommu->flush.flush_context = qi_flush_context; | 1661 | iommu->flush.flush_context = qi_flush_context; |
1661 | iommu->flush.flush_iotlb = qi_flush_iotlb; | 1662 | iommu->flush.flush_iotlb = qi_flush_iotlb; |
1662 | printk(KERN_INFO "IOMMU 0x%Lx: using Queued " | 1663 | printk(KERN_INFO "IOMMU 0x%Lx: using Queued " |
1663 | "invalidation\n", drhd->reg_base_addr); | 1664 | "invalidation\n", |
1665 | (unsigned long long)drhd->reg_base_addr); | ||
1664 | } | 1666 | } |
1665 | } | 1667 | } |
1666 | 1668 | ||
diff --git a/drivers/pci/pci-acpi.c b/drivers/pci/pci-acpi.c index b3a63edb6901..ae5ec76dca77 100644 --- a/drivers/pci/pci-acpi.c +++ b/drivers/pci/pci-acpi.c | |||
@@ -63,7 +63,7 @@ static acpi_status acpi_run_osc(acpi_handle handle, | |||
63 | union acpi_object in_params[4]; | 63 | union acpi_object in_params[4]; |
64 | struct acpi_buffer output = {ACPI_ALLOCATE_BUFFER, NULL}; | 64 | struct acpi_buffer output = {ACPI_ALLOCATE_BUFFER, NULL}; |
65 | union acpi_object *out_obj; | 65 | union acpi_object *out_obj; |
66 | u32 osc_dw0, flags = osc_args->capbuf[OSC_QUERY_TYPE]; | 66 | u32 errors, flags = osc_args->capbuf[OSC_QUERY_TYPE]; |
67 | 67 | ||
68 | /* Setting up input parameters */ | 68 | /* Setting up input parameters */ |
69 | input.count = 4; | 69 | input.count = 4; |
@@ -92,15 +92,16 @@ static acpi_status acpi_run_osc(acpi_handle handle, | |||
92 | status = AE_TYPE; | 92 | status = AE_TYPE; |
93 | goto out_kfree; | 93 | goto out_kfree; |
94 | } | 94 | } |
95 | osc_dw0 = *((u32 *)out_obj->buffer.pointer); | 95 | /* Need to ignore the bit0 in result code */ |
96 | if (osc_dw0) { | 96 | errors = *((u32 *)out_obj->buffer.pointer) & ~(1 << 0); |
97 | if (osc_dw0 & OSC_REQUEST_ERROR) | 97 | if (errors) { |
98 | if (errors & OSC_REQUEST_ERROR) | ||
98 | printk(KERN_DEBUG "_OSC request fails\n"); | 99 | printk(KERN_DEBUG "_OSC request fails\n"); |
99 | if (osc_dw0 & OSC_INVALID_UUID_ERROR) | 100 | if (errors & OSC_INVALID_UUID_ERROR) |
100 | printk(KERN_DEBUG "_OSC invalid UUID\n"); | 101 | printk(KERN_DEBUG "_OSC invalid UUID\n"); |
101 | if (osc_dw0 & OSC_INVALID_REVISION_ERROR) | 102 | if (errors & OSC_INVALID_REVISION_ERROR) |
102 | printk(KERN_DEBUG "_OSC invalid revision\n"); | 103 | printk(KERN_DEBUG "_OSC invalid revision\n"); |
103 | if (osc_dw0 & OSC_CAPABILITIES_MASK_ERROR) { | 104 | if (errors & OSC_CAPABILITIES_MASK_ERROR) { |
104 | if (flags & OSC_QUERY_ENABLE) | 105 | if (flags & OSC_QUERY_ENABLE) |
105 | goto out_success; | 106 | goto out_success; |
106 | printk(KERN_DEBUG "_OSC FW not grant req. control\n"); | 107 | printk(KERN_DEBUG "_OSC FW not grant req. control\n"); |
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 21f2ac639cab..061d1ee0046a 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
@@ -1832,7 +1832,7 @@ int pci_reset_function(struct pci_dev *dev) | |||
1832 | if (!(cap & PCI_EXP_DEVCAP_FLR)) | 1832 | if (!(cap & PCI_EXP_DEVCAP_FLR)) |
1833 | return -ENOTTY; | 1833 | return -ENOTTY; |
1834 | 1834 | ||
1835 | if (!dev->msi_enabled && !dev->msix_enabled) | 1835 | if (!dev->msi_enabled && !dev->msix_enabled && dev->irq != 0) |
1836 | disable_irq(dev->irq); | 1836 | disable_irq(dev->irq); |
1837 | pci_save_state(dev); | 1837 | pci_save_state(dev); |
1838 | 1838 | ||
@@ -1841,7 +1841,7 @@ int pci_reset_function(struct pci_dev *dev) | |||
1841 | r = pci_execute_reset_function(dev); | 1841 | r = pci_execute_reset_function(dev); |
1842 | 1842 | ||
1843 | pci_restore_state(dev); | 1843 | pci_restore_state(dev); |
1844 | if (!dev->msi_enabled && !dev->msix_enabled) | 1844 | if (!dev->msi_enabled && !dev->msix_enabled && dev->irq != 0) |
1845 | enable_irq(dev->irq); | 1845 | enable_irq(dev->irq); |
1846 | 1846 | ||
1847 | return r; | 1847 | return r; |
@@ -2042,7 +2042,7 @@ static int __devinit pci_init(void) | |||
2042 | return 0; | 2042 | return 0; |
2043 | } | 2043 | } |
2044 | 2044 | ||
2045 | static int __devinit pci_setup(char *str) | 2045 | static int __init pci_setup(char *str) |
2046 | { | 2046 | { |
2047 | while (str) { | 2047 | while (str) { |
2048 | char *k = strchr(str, ','); | 2048 | char *k = strchr(str, ','); |
diff --git a/drivers/pcmcia/cistpl.c b/drivers/pcmcia/cistpl.c index dcce9f5d8465..4a110b7b2673 100644 --- a/drivers/pcmcia/cistpl.c +++ b/drivers/pcmcia/cistpl.c | |||
@@ -351,10 +351,11 @@ int verify_cis_cache(struct pcmcia_socket *s) | |||
351 | char *buf; | 351 | char *buf; |
352 | 352 | ||
353 | buf = kmalloc(256, GFP_KERNEL); | 353 | buf = kmalloc(256, GFP_KERNEL); |
354 | if (buf == NULL) | 354 | if (buf == NULL) { |
355 | dev_printk(KERN_WARNING, &s->dev, | 355 | dev_printk(KERN_WARNING, &s->dev, |
356 | "no memory for verifying CIS\n"); | 356 | "no memory for verifying CIS\n"); |
357 | return -ENOMEM; | 357 | return -ENOMEM; |
358 | } | ||
358 | list_for_each_entry(cis, &s->cis_cache, node) { | 359 | list_for_each_entry(cis, &s->cis_cache, node) { |
359 | int len = cis->len; | 360 | int len = cis->len; |
360 | 361 | ||
diff --git a/drivers/pcmcia/cs.c b/drivers/pcmcia/cs.c index c68c5d338285..0660ad182589 100644 --- a/drivers/pcmcia/cs.c +++ b/drivers/pcmcia/cs.c | |||
@@ -186,12 +186,6 @@ int pcmcia_register_socket(struct pcmcia_socket *socket) | |||
186 | 186 | ||
187 | spin_lock_init(&socket->lock); | 187 | spin_lock_init(&socket->lock); |
188 | 188 | ||
189 | if (socket->resource_ops->init) { | ||
190 | ret = socket->resource_ops->init(socket); | ||
191 | if (ret) | ||
192 | return (ret); | ||
193 | } | ||
194 | |||
195 | /* try to obtain a socket number [yes, it gets ugly if we | 189 | /* try to obtain a socket number [yes, it gets ugly if we |
196 | * register more than 2^sizeof(unsigned int) pcmcia | 190 | * register more than 2^sizeof(unsigned int) pcmcia |
197 | * sockets... but the socket number is deprecated | 191 | * sockets... but the socket number is deprecated |
@@ -226,7 +220,7 @@ int pcmcia_register_socket(struct pcmcia_socket *socket) | |||
226 | /* set proper values in socket->dev */ | 220 | /* set proper values in socket->dev */ |
227 | dev_set_drvdata(&socket->dev, socket); | 221 | dev_set_drvdata(&socket->dev, socket); |
228 | socket->dev.class = &pcmcia_socket_class; | 222 | socket->dev.class = &pcmcia_socket_class; |
229 | snprintf(socket->dev.bus_id, BUS_ID_SIZE, "pcmcia_socket%u", socket->sock); | 223 | dev_set_name(&socket->dev, "pcmcia_socket%u", socket->sock); |
230 | 224 | ||
231 | /* base address = 0, map = 0 */ | 225 | /* base address = 0, map = 0 */ |
232 | socket->cis_mem.flags = 0; | 226 | socket->cis_mem.flags = 0; |
@@ -239,6 +233,12 @@ int pcmcia_register_socket(struct pcmcia_socket *socket) | |||
239 | mutex_init(&socket->skt_mutex); | 233 | mutex_init(&socket->skt_mutex); |
240 | spin_lock_init(&socket->thread_lock); | 234 | spin_lock_init(&socket->thread_lock); |
241 | 235 | ||
236 | if (socket->resource_ops->init) { | ||
237 | ret = socket->resource_ops->init(socket); | ||
238 | if (ret) | ||
239 | goto err; | ||
240 | } | ||
241 | |||
242 | tsk = kthread_run(pccardd, socket, "pccardd"); | 242 | tsk = kthread_run(pccardd, socket, "pccardd"); |
243 | if (IS_ERR(tsk)) { | 243 | if (IS_ERR(tsk)) { |
244 | ret = PTR_ERR(tsk); | 244 | ret = PTR_ERR(tsk); |
diff --git a/drivers/pcmcia/ds.c b/drivers/pcmcia/ds.c index 795660255490..47cab31ff6e4 100644 --- a/drivers/pcmcia/ds.c +++ b/drivers/pcmcia/ds.c | |||
@@ -622,7 +622,6 @@ struct pcmcia_device * pcmcia_device_add(struct pcmcia_socket *s, unsigned int f | |||
622 | { | 622 | { |
623 | struct pcmcia_device *p_dev, *tmp_dev; | 623 | struct pcmcia_device *p_dev, *tmp_dev; |
624 | unsigned long flags; | 624 | unsigned long flags; |
625 | int bus_id_len; | ||
626 | 625 | ||
627 | s = pcmcia_get_socket(s); | 626 | s = pcmcia_get_socket(s); |
628 | if (!s) | 627 | if (!s) |
@@ -650,12 +649,12 @@ struct pcmcia_device * pcmcia_device_add(struct pcmcia_socket *s, unsigned int f | |||
650 | /* by default don't allow DMA */ | 649 | /* by default don't allow DMA */ |
651 | p_dev->dma_mask = DMA_MASK_NONE; | 650 | p_dev->dma_mask = DMA_MASK_NONE; |
652 | p_dev->dev.dma_mask = &p_dev->dma_mask; | 651 | p_dev->dev.dma_mask = &p_dev->dma_mask; |
653 | bus_id_len = sprintf (p_dev->dev.bus_id, "%d.%d", p_dev->socket->sock, p_dev->device_no); | 652 | dev_set_name(&p_dev->dev, "%d.%d", p_dev->socket->sock, p_dev->device_no); |
654 | 653 | if (!dev_name(&p_dev->dev)) | |
655 | p_dev->devname = kmalloc(6 + bus_id_len + 1, GFP_KERNEL); | 654 | goto err_free; |
655 | p_dev->devname = kasprintf(GFP_KERNEL, "pcmcia%s", dev_name(&p_dev->dev)); | ||
656 | if (!p_dev->devname) | 656 | if (!p_dev->devname) |
657 | goto err_free; | 657 | goto err_free; |
658 | sprintf (p_dev->devname, "pcmcia%s", p_dev->dev.bus_id); | ||
659 | ds_dev_dbg(3, &p_dev->dev, "devname is %s\n", p_dev->devname); | 658 | ds_dev_dbg(3, &p_dev->dev, "devname is %s\n", p_dev->devname); |
660 | 659 | ||
661 | spin_lock_irqsave(&pcmcia_dev_list_lock, flags); | 660 | spin_lock_irqsave(&pcmcia_dev_list_lock, flags); |
@@ -668,6 +667,8 @@ struct pcmcia_device * pcmcia_device_add(struct pcmcia_socket *s, unsigned int f | |||
668 | list_for_each_entry(tmp_dev, &s->devices_list, socket_device_list) | 667 | list_for_each_entry(tmp_dev, &s->devices_list, socket_device_list) |
669 | if (p_dev->func == tmp_dev->func) { | 668 | if (p_dev->func == tmp_dev->func) { |
670 | p_dev->function_config = tmp_dev->function_config; | 669 | p_dev->function_config = tmp_dev->function_config; |
670 | p_dev->io = tmp_dev->io; | ||
671 | p_dev->irq = tmp_dev->irq; | ||
671 | kref_get(&p_dev->function_config->ref); | 672 | kref_get(&p_dev->function_config->ref); |
672 | } | 673 | } |
673 | 674 | ||
diff --git a/drivers/pcmcia/pcmcia_resource.c b/drivers/pcmcia/pcmcia_resource.c index 76d4a98f0955..f5d0ba8e22d5 100644 --- a/drivers/pcmcia/pcmcia_resource.c +++ b/drivers/pcmcia/pcmcia_resource.c | |||
@@ -302,9 +302,10 @@ int pcmcia_modify_configuration(struct pcmcia_device *p_dev, | |||
302 | /* We only allow changing Vpp1 and Vpp2 to the same value */ | 302 | /* We only allow changing Vpp1 and Vpp2 to the same value */ |
303 | if ((mod->Attributes & CONF_VPP1_CHANGE_VALID) && | 303 | if ((mod->Attributes & CONF_VPP1_CHANGE_VALID) && |
304 | (mod->Attributes & CONF_VPP2_CHANGE_VALID)) { | 304 | (mod->Attributes & CONF_VPP2_CHANGE_VALID)) { |
305 | if (mod->Vpp1 != mod->Vpp2) | 305 | if (mod->Vpp1 != mod->Vpp2) { |
306 | ds_dbg(s, 0, "Vpp1 and Vpp2 must be the same\n"); | 306 | ds_dbg(s, 0, "Vpp1 and Vpp2 must be the same\n"); |
307 | return -EINVAL; | 307 | return -EINVAL; |
308 | } | ||
308 | s->socket.Vpp = mod->Vpp1; | 309 | s->socket.Vpp = mod->Vpp1; |
309 | if (s->ops->set_socket(s, &s->socket)) { | 310 | if (s->ops->set_socket(s, &s->socket)) { |
310 | dev_printk(KERN_WARNING, &s->dev, | 311 | dev_printk(KERN_WARNING, &s->dev, |
diff --git a/drivers/pcmcia/rsrc_nonstatic.c b/drivers/pcmcia/rsrc_nonstatic.c index 17f4ecf1c0c5..9ca22c7aafb2 100644 --- a/drivers/pcmcia/rsrc_nonstatic.c +++ b/drivers/pcmcia/rsrc_nonstatic.c | |||
@@ -71,7 +71,7 @@ static DEFINE_MUTEX(rsrc_mutex); | |||
71 | ======================================================================*/ | 71 | ======================================================================*/ |
72 | 72 | ||
73 | static struct resource * | 73 | static struct resource * |
74 | make_resource(resource_size_t b, resource_size_t n, int flags, char *name) | 74 | make_resource(resource_size_t b, resource_size_t n, int flags, const char *name) |
75 | { | 75 | { |
76 | struct resource *res = kzalloc(sizeof(*res), GFP_KERNEL); | 76 | struct resource *res = kzalloc(sizeof(*res), GFP_KERNEL); |
77 | 77 | ||
@@ -624,7 +624,7 @@ static int nonstatic_adjust_io_region(struct resource *res, unsigned long r_star | |||
624 | static struct resource *nonstatic_find_io_region(unsigned long base, int num, | 624 | static struct resource *nonstatic_find_io_region(unsigned long base, int num, |
625 | unsigned long align, struct pcmcia_socket *s) | 625 | unsigned long align, struct pcmcia_socket *s) |
626 | { | 626 | { |
627 | struct resource *res = make_resource(0, num, IORESOURCE_IO, s->dev.bus_id); | 627 | struct resource *res = make_resource(0, num, IORESOURCE_IO, dev_name(&s->dev)); |
628 | struct socket_data *s_data = s->resource_data; | 628 | struct socket_data *s_data = s->resource_data; |
629 | struct pcmcia_align_data data; | 629 | struct pcmcia_align_data data; |
630 | unsigned long min = base; | 630 | unsigned long min = base; |
@@ -658,7 +658,7 @@ static struct resource *nonstatic_find_io_region(unsigned long base, int num, | |||
658 | static struct resource * nonstatic_find_mem_region(u_long base, u_long num, | 658 | static struct resource * nonstatic_find_mem_region(u_long base, u_long num, |
659 | u_long align, int low, struct pcmcia_socket *s) | 659 | u_long align, int low, struct pcmcia_socket *s) |
660 | { | 660 | { |
661 | struct resource *res = make_resource(0, num, IORESOURCE_MEM, s->dev.bus_id); | 661 | struct resource *res = make_resource(0, num, IORESOURCE_MEM, dev_name(&s->dev)); |
662 | struct socket_data *s_data = s->resource_data; | 662 | struct socket_data *s_data = s->resource_data; |
663 | struct pcmcia_align_data data; | 663 | struct pcmcia_align_data data; |
664 | unsigned long min, max; | 664 | unsigned long min, max; |
diff --git a/drivers/rapidio/rio-scan.c b/drivers/rapidio/rio-scan.c index a926c896475e..643a6b98462b 100644 --- a/drivers/rapidio/rio-scan.c +++ b/drivers/rapidio/rio-scan.c | |||
@@ -879,7 +879,7 @@ static void rio_update_route_tables(struct rio_mport *port) | |||
879 | * link, then start recursive peer enumeration. Returns %0 if | 879 | * link, then start recursive peer enumeration. Returns %0 if |
880 | * enumeration succeeds or %-EBUSY if enumeration fails. | 880 | * enumeration succeeds or %-EBUSY if enumeration fails. |
881 | */ | 881 | */ |
882 | int rio_enum_mport(struct rio_mport *mport) | 882 | int __devinit rio_enum_mport(struct rio_mport *mport) |
883 | { | 883 | { |
884 | struct rio_net *net = NULL; | 884 | struct rio_net *net = NULL; |
885 | int rc = 0; | 885 | int rc = 0; |
@@ -972,7 +972,7 @@ static void rio_enum_timeout(unsigned long data) | |||
972 | * peer discovery. Returns %0 if discovery succeeds or %-EBUSY | 972 | * peer discovery. Returns %0 if discovery succeeds or %-EBUSY |
973 | * on failure. | 973 | * on failure. |
974 | */ | 974 | */ |
975 | int rio_disc_mport(struct rio_mport *mport) | 975 | int __devinit rio_disc_mport(struct rio_mport *mport) |
976 | { | 976 | { |
977 | struct rio_net *net = NULL; | 977 | struct rio_net *net = NULL; |
978 | int enum_timeout_flag = 0; | 978 | int enum_timeout_flag = 0; |
diff --git a/drivers/rapidio/rio.c b/drivers/rapidio/rio.c index 680661abbc4b..6395c780008b 100644 --- a/drivers/rapidio/rio.c +++ b/drivers/rapidio/rio.c | |||
@@ -467,7 +467,7 @@ static int __devinit rio_init(void) | |||
467 | 467 | ||
468 | device_initcall(rio_init); | 468 | device_initcall(rio_init); |
469 | 469 | ||
470 | int rio_init_mports(void) | 470 | int __devinit rio_init_mports(void) |
471 | { | 471 | { |
472 | int rc = 0; | 472 | int rc = 0; |
473 | struct rio_mport *port; | 473 | struct rio_mport *port; |
diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index 8abbb2020af9..123092d8a984 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig | |||
@@ -277,6 +277,14 @@ config RTC_DRV_FM3130 | |||
277 | This driver can also be built as a module. If so the module | 277 | This driver can also be built as a module. If so the module |
278 | will be called rtc-fm3130. | 278 | will be called rtc-fm3130. |
279 | 279 | ||
280 | config RTC_DRV_RX8581 | ||
281 | tristate "Epson RX-8581" | ||
282 | help | ||
283 | If you say yes here you will get support for the Epson RX-8581. | ||
284 | |||
285 | This driver can also be built as a module. If so the module | ||
286 | will be called rtc-rx8581. | ||
287 | |||
280 | endif # I2C | 288 | endif # I2C |
281 | 289 | ||
282 | comment "SPI RTC drivers" | 290 | comment "SPI RTC drivers" |
@@ -302,6 +310,17 @@ config RTC_DRV_DS1305 | |||
302 | This driver can also be built as a module. If so, the module | 310 | This driver can also be built as a module. If so, the module |
303 | will be called rtc-ds1305. | 311 | will be called rtc-ds1305. |
304 | 312 | ||
313 | config RTC_DRV_DS1390 | ||
314 | tristate "Dallas/Maxim DS1390/93/94" | ||
315 | help | ||
316 | If you say yes here you get support for the DS1390/93/94 chips. | ||
317 | |||
318 | This driver only supports the RTC feature, and not other chip | ||
319 | features such as alarms and trickle charging. | ||
320 | |||
321 | This driver can also be built as a module. If so, the module | ||
322 | will be called rtc-ds1390. | ||
323 | |||
305 | config RTC_DRV_MAX6902 | 324 | config RTC_DRV_MAX6902 |
306 | tristate "Maxim MAX6902" | 325 | tristate "Maxim MAX6902" |
307 | help | 326 | help |
@@ -468,6 +487,16 @@ config RTC_DRV_V3020 | |||
468 | This driver can also be built as a module. If so, the module | 487 | This driver can also be built as a module. If so, the module |
469 | will be called rtc-v3020. | 488 | will be called rtc-v3020. |
470 | 489 | ||
490 | config RTC_DRV_WM8350 | ||
491 | tristate "Wolfson Microelectronics WM8350 RTC" | ||
492 | depends on MFD_WM8350 | ||
493 | help | ||
494 | If you say yes here you will get support for the RTC subsystem | ||
495 | of the Wolfson Microelectronics WM8350. | ||
496 | |||
497 | This driver can also be built as a module. If so, the module | ||
498 | will be called "rtc-wm8350". | ||
499 | |||
471 | comment "on-CPU RTC drivers" | 500 | comment "on-CPU RTC drivers" |
472 | 501 | ||
473 | config RTC_DRV_OMAP | 502 | config RTC_DRV_OMAP |
diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile index e9e8474cc8fe..6e79c912bf9e 100644 --- a/drivers/rtc/Makefile +++ b/drivers/rtc/Makefile | |||
@@ -28,6 +28,7 @@ obj-$(CONFIG_RTC_DRV_DS1302) += rtc-ds1302.o | |||
28 | obj-$(CONFIG_RTC_DRV_DS1305) += rtc-ds1305.o | 28 | obj-$(CONFIG_RTC_DRV_DS1305) += rtc-ds1305.o |
29 | obj-$(CONFIG_RTC_DRV_DS1307) += rtc-ds1307.o | 29 | obj-$(CONFIG_RTC_DRV_DS1307) += rtc-ds1307.o |
30 | obj-$(CONFIG_RTC_DRV_DS1374) += rtc-ds1374.o | 30 | obj-$(CONFIG_RTC_DRV_DS1374) += rtc-ds1374.o |
31 | obj-$(CONFIG_RTC_DRV_DS1390) += rtc-ds1390.o | ||
31 | obj-$(CONFIG_RTC_DRV_DS1511) += rtc-ds1511.o | 32 | obj-$(CONFIG_RTC_DRV_DS1511) += rtc-ds1511.o |
32 | obj-$(CONFIG_RTC_DRV_DS1553) += rtc-ds1553.o | 33 | obj-$(CONFIG_RTC_DRV_DS1553) += rtc-ds1553.o |
33 | obj-$(CONFIG_RTC_DRV_DS1672) += rtc-ds1672.o | 34 | obj-$(CONFIG_RTC_DRV_DS1672) += rtc-ds1672.o |
@@ -57,6 +58,7 @@ obj-$(CONFIG_RTC_DRV_R9701) += rtc-r9701.o | |||
57 | obj-$(CONFIG_RTC_DRV_RS5C313) += rtc-rs5c313.o | 58 | obj-$(CONFIG_RTC_DRV_RS5C313) += rtc-rs5c313.o |
58 | obj-$(CONFIG_RTC_DRV_RS5C348) += rtc-rs5c348.o | 59 | obj-$(CONFIG_RTC_DRV_RS5C348) += rtc-rs5c348.o |
59 | obj-$(CONFIG_RTC_DRV_RS5C372) += rtc-rs5c372.o | 60 | obj-$(CONFIG_RTC_DRV_RS5C372) += rtc-rs5c372.o |
61 | obj-$(CONFIG_RTC_DRV_RX8581) += rtc-rx8581.o | ||
60 | obj-$(CONFIG_RTC_DRV_S35390A) += rtc-s35390a.o | 62 | obj-$(CONFIG_RTC_DRV_S35390A) += rtc-s35390a.o |
61 | obj-$(CONFIG_RTC_DRV_S3C) += rtc-s3c.o | 63 | obj-$(CONFIG_RTC_DRV_S3C) += rtc-s3c.o |
62 | obj-$(CONFIG_RTC_DRV_SA1100) += rtc-sa1100.o | 64 | obj-$(CONFIG_RTC_DRV_SA1100) += rtc-sa1100.o |
@@ -66,4 +68,5 @@ obj-$(CONFIG_RTC_DRV_TEST) += rtc-test.o | |||
66 | obj-$(CONFIG_RTC_DRV_TWL4030) += rtc-twl4030.o | 68 | obj-$(CONFIG_RTC_DRV_TWL4030) += rtc-twl4030.o |
67 | obj-$(CONFIG_RTC_DRV_V3020) += rtc-v3020.o | 69 | obj-$(CONFIG_RTC_DRV_V3020) += rtc-v3020.o |
68 | obj-$(CONFIG_RTC_DRV_VR41XX) += rtc-vr41xx.o | 70 | obj-$(CONFIG_RTC_DRV_VR41XX) += rtc-vr41xx.o |
71 | obj-$(CONFIG_RTC_DRV_WM8350) += rtc-wm8350.o | ||
69 | obj-$(CONFIG_RTC_DRV_X1205) += rtc-x1205.o | 72 | obj-$(CONFIG_RTC_DRV_X1205) += rtc-x1205.o |
diff --git a/drivers/rtc/rtc-ds1390.c b/drivers/rtc/rtc-ds1390.c new file mode 100644 index 000000000000..599e976bf014 --- /dev/null +++ b/drivers/rtc/rtc-ds1390.c | |||
@@ -0,0 +1,220 @@ | |||
1 | /* | ||
2 | * rtc-ds1390.c -- driver for DS1390/93/94 | ||
3 | * | ||
4 | * Copyright (C) 2008 Mercury IMC Ltd | ||
5 | * Written by Mark Jackson <mpfj@mimc.co.uk> | ||
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 | * NOTE : Currently this driver only supports the bare minimum for read | ||
12 | * and write the RTC. The extra features provided by the chip family | ||
13 | * (alarms, trickle charger, different control registers) are unavailable. | ||
14 | */ | ||
15 | |||
16 | #include <linux/platform_device.h> | ||
17 | #include <linux/rtc.h> | ||
18 | #include <linux/spi/spi.h> | ||
19 | #include <linux/bcd.h> | ||
20 | |||
21 | #define DS1390_REG_100THS 0x00 | ||
22 | #define DS1390_REG_SECONDS 0x01 | ||
23 | #define DS1390_REG_MINUTES 0x02 | ||
24 | #define DS1390_REG_HOURS 0x03 | ||
25 | #define DS1390_REG_DAY 0x04 | ||
26 | #define DS1390_REG_DATE 0x05 | ||
27 | #define DS1390_REG_MONTH_CENT 0x06 | ||
28 | #define DS1390_REG_YEAR 0x07 | ||
29 | |||
30 | #define DS1390_REG_ALARM_100THS 0x08 | ||
31 | #define DS1390_REG_ALARM_SECONDS 0x09 | ||
32 | #define DS1390_REG_ALARM_MINUTES 0x0A | ||
33 | #define DS1390_REG_ALARM_HOURS 0x0B | ||
34 | #define DS1390_REG_ALARM_DAY_DATE 0x0C | ||
35 | |||
36 | #define DS1390_REG_CONTROL 0x0D | ||
37 | #define DS1390_REG_STATUS 0x0E | ||
38 | #define DS1390_REG_TRICKLE 0x0F | ||
39 | |||
40 | struct ds1390 { | ||
41 | struct rtc_device *rtc; | ||
42 | u8 txrx_buf[9]; /* cmd + 8 registers */ | ||
43 | }; | ||
44 | |||
45 | static void ds1390_set_reg(struct device *dev, unsigned char address, | ||
46 | unsigned char data) | ||
47 | { | ||
48 | struct spi_device *spi = to_spi_device(dev); | ||
49 | struct ds1390 *chip = dev_get_drvdata(dev); | ||
50 | |||
51 | /* Set MSB to indicate write */ | ||
52 | chip->txrx_buf[0] = address | 0x80; | ||
53 | chip->txrx_buf[1] = data; | ||
54 | |||
55 | /* do the i/o */ | ||
56 | spi_write_then_read(spi, chip->txrx_buf, 2, NULL, 0); | ||
57 | } | ||
58 | |||
59 | static int ds1390_get_reg(struct device *dev, unsigned char address, | ||
60 | unsigned char *data) | ||
61 | { | ||
62 | struct spi_device *spi = to_spi_device(dev); | ||
63 | struct ds1390 *chip = dev_get_drvdata(dev); | ||
64 | int status; | ||
65 | |||
66 | if (!data) | ||
67 | return -EINVAL; | ||
68 | |||
69 | /* Clear MSB to indicate read */ | ||
70 | chip->txrx_buf[0] = address & 0x7f; | ||
71 | /* do the i/o */ | ||
72 | status = spi_write_then_read(spi, chip->txrx_buf, 1, chip->txrx_buf, 1); | ||
73 | if (status != 0) | ||
74 | return status; | ||
75 | |||
76 | *data = chip->txrx_buf[1]; | ||
77 | |||
78 | return 0; | ||
79 | } | ||
80 | |||
81 | static int ds1390_get_datetime(struct device *dev, struct rtc_time *dt) | ||
82 | { | ||
83 | struct spi_device *spi = to_spi_device(dev); | ||
84 | struct ds1390 *chip = dev_get_drvdata(dev); | ||
85 | int status; | ||
86 | |||
87 | /* build the message */ | ||
88 | chip->txrx_buf[0] = DS1390_REG_SECONDS; | ||
89 | |||
90 | /* do the i/o */ | ||
91 | status = spi_write_then_read(spi, chip->txrx_buf, 1, chip->txrx_buf, 8); | ||
92 | if (status != 0) | ||
93 | return status; | ||
94 | |||
95 | /* The chip sends data in this order: | ||
96 | * Seconds, Minutes, Hours, Day, Date, Month / Century, Year */ | ||
97 | dt->tm_sec = bcd2bin(chip->txrx_buf[0]); | ||
98 | dt->tm_min = bcd2bin(chip->txrx_buf[1]); | ||
99 | dt->tm_hour = bcd2bin(chip->txrx_buf[2]); | ||
100 | dt->tm_wday = bcd2bin(chip->txrx_buf[3]); | ||
101 | dt->tm_mday = bcd2bin(chip->txrx_buf[4]); | ||
102 | /* mask off century bit */ | ||
103 | dt->tm_mon = bcd2bin(chip->txrx_buf[5] & 0x7f) - 1; | ||
104 | /* adjust for century bit */ | ||
105 | dt->tm_year = bcd2bin(chip->txrx_buf[6]) + ((chip->txrx_buf[5] & 0x80) ? 100 : 0); | ||
106 | |||
107 | return rtc_valid_tm(dt); | ||
108 | } | ||
109 | |||
110 | static int ds1390_set_datetime(struct device *dev, struct rtc_time *dt) | ||
111 | { | ||
112 | struct spi_device *spi = to_spi_device(dev); | ||
113 | struct ds1390 *chip = dev_get_drvdata(dev); | ||
114 | |||
115 | /* build the message */ | ||
116 | chip->txrx_buf[0] = DS1390_REG_SECONDS | 0x80; | ||
117 | chip->txrx_buf[1] = bin2bcd(dt->tm_sec); | ||
118 | chip->txrx_buf[2] = bin2bcd(dt->tm_min); | ||
119 | chip->txrx_buf[3] = bin2bcd(dt->tm_hour); | ||
120 | chip->txrx_buf[4] = bin2bcd(dt->tm_wday); | ||
121 | chip->txrx_buf[5] = bin2bcd(dt->tm_mday); | ||
122 | chip->txrx_buf[6] = bin2bcd(dt->tm_mon + 1) | | ||
123 | ((dt->tm_year > 99) ? 0x80 : 0x00); | ||
124 | chip->txrx_buf[7] = bin2bcd(dt->tm_year % 100); | ||
125 | |||
126 | /* do the i/o */ | ||
127 | return spi_write_then_read(spi, chip->txrx_buf, 8, NULL, 0); | ||
128 | } | ||
129 | |||
130 | static int ds1390_read_time(struct device *dev, struct rtc_time *tm) | ||
131 | { | ||
132 | return ds1390_get_datetime(dev, tm); | ||
133 | } | ||
134 | |||
135 | static int ds1390_set_time(struct device *dev, struct rtc_time *tm) | ||
136 | { | ||
137 | return ds1390_set_datetime(dev, tm); | ||
138 | } | ||
139 | |||
140 | static const struct rtc_class_ops ds1390_rtc_ops = { | ||
141 | .read_time = ds1390_read_time, | ||
142 | .set_time = ds1390_set_time, | ||
143 | }; | ||
144 | |||
145 | static int __devinit ds1390_probe(struct spi_device *spi) | ||
146 | { | ||
147 | struct rtc_device *rtc; | ||
148 | unsigned char tmp; | ||
149 | struct ds1390 *chip; | ||
150 | int res; | ||
151 | |||
152 | printk(KERN_DEBUG "DS1390 SPI RTC driver\n"); | ||
153 | |||
154 | rtc = rtc_device_register("ds1390", | ||
155 | &spi->dev, &ds1390_rtc_ops, THIS_MODULE); | ||
156 | if (IS_ERR(rtc)) { | ||
157 | printk(KERN_ALERT "RTC : unable to register device\n"); | ||
158 | return PTR_ERR(rtc); | ||
159 | } | ||
160 | |||
161 | spi->mode = SPI_MODE_3; | ||
162 | spi->bits_per_word = 8; | ||
163 | spi_setup(spi); | ||
164 | |||
165 | chip = kzalloc(sizeof *chip, GFP_KERNEL); | ||
166 | if (!chip) { | ||
167 | printk(KERN_ALERT "RTC : unable to allocate device memory\n"); | ||
168 | rtc_device_unregister(rtc); | ||
169 | return -ENOMEM; | ||
170 | } | ||
171 | chip->rtc = rtc; | ||
172 | dev_set_drvdata(&spi->dev, chip); | ||
173 | |||
174 | res = ds1390_get_reg(&spi->dev, DS1390_REG_SECONDS, &tmp); | ||
175 | if (res) { | ||
176 | printk(KERN_ALERT "RTC : unable to read device\n"); | ||
177 | rtc_device_unregister(rtc); | ||
178 | return res; | ||
179 | } | ||
180 | |||
181 | return 0; | ||
182 | } | ||
183 | |||
184 | static int __devexit ds1390_remove(struct spi_device *spi) | ||
185 | { | ||
186 | struct ds1390 *chip = platform_get_drvdata(spi); | ||
187 | struct rtc_device *rtc = chip->rtc; | ||
188 | |||
189 | if (rtc) | ||
190 | rtc_device_unregister(rtc); | ||
191 | |||
192 | kfree(chip); | ||
193 | |||
194 | return 0; | ||
195 | } | ||
196 | |||
197 | static struct spi_driver ds1390_driver = { | ||
198 | .driver = { | ||
199 | .name = "rtc-ds1390", | ||
200 | .owner = THIS_MODULE, | ||
201 | }, | ||
202 | .probe = ds1390_probe, | ||
203 | .remove = __devexit_p(ds1390_remove), | ||
204 | }; | ||
205 | |||
206 | static __init int ds1390_init(void) | ||
207 | { | ||
208 | return spi_register_driver(&ds1390_driver); | ||
209 | } | ||
210 | module_init(ds1390_init); | ||
211 | |||
212 | static __exit void ds1390_exit(void) | ||
213 | { | ||
214 | spi_unregister_driver(&ds1390_driver); | ||
215 | } | ||
216 | module_exit(ds1390_exit); | ||
217 | |||
218 | MODULE_DESCRIPTION("DS1390/93/94 SPI RTC driver"); | ||
219 | MODULE_AUTHOR("Mark Jackson <mpfj@mimc.co.uk>"); | ||
220 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/rtc/rtc-rx8581.c b/drivers/rtc/rtc-rx8581.c new file mode 100644 index 000000000000..c9522f3bc21c --- /dev/null +++ b/drivers/rtc/rtc-rx8581.c | |||
@@ -0,0 +1,281 @@ | |||
1 | /* | ||
2 | * An I2C driver for the Epson RX8581 RTC | ||
3 | * | ||
4 | * Author: Martyn Welch <martyn.welch@gefanuc.com> | ||
5 | * Copyright 2008 GE Fanuc Intelligent Platforms Embedded Systems, Inc. | ||
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 | * Based on: rtc-pcf8563.c (An I2C driver for the Philips PCF8563 RTC) | ||
12 | * Copyright 2005-06 Tower Technologies | ||
13 | */ | ||
14 | |||
15 | #include <linux/module.h> | ||
16 | #include <linux/i2c.h> | ||
17 | #include <linux/bcd.h> | ||
18 | #include <linux/rtc.h> | ||
19 | #include <linux/log2.h> | ||
20 | |||
21 | #define DRV_VERSION "0.1" | ||
22 | |||
23 | #define RX8581_REG_SC 0x00 /* Second in BCD */ | ||
24 | #define RX8581_REG_MN 0x01 /* Minute in BCD */ | ||
25 | #define RX8581_REG_HR 0x02 /* Hour in BCD */ | ||
26 | #define RX8581_REG_DW 0x03 /* Day of Week */ | ||
27 | #define RX8581_REG_DM 0x04 /* Day of Month in BCD */ | ||
28 | #define RX8581_REG_MO 0x05 /* Month in BCD */ | ||
29 | #define RX8581_REG_YR 0x06 /* Year in BCD */ | ||
30 | #define RX8581_REG_RAM 0x07 /* RAM */ | ||
31 | #define RX8581_REG_AMN 0x08 /* Alarm Min in BCD*/ | ||
32 | #define RX8581_REG_AHR 0x09 /* Alarm Hour in BCD */ | ||
33 | #define RX8581_REG_ADM 0x0A | ||
34 | #define RX8581_REG_ADW 0x0A | ||
35 | #define RX8581_REG_TMR0 0x0B | ||
36 | #define RX8581_REG_TMR1 0x0C | ||
37 | #define RX8581_REG_EXT 0x0D /* Extension Register */ | ||
38 | #define RX8581_REG_FLAG 0x0E /* Flag Register */ | ||
39 | #define RX8581_REG_CTRL 0x0F /* Control Register */ | ||
40 | |||
41 | |||
42 | /* Flag Register bit definitions */ | ||
43 | #define RX8581_FLAG_UF 0x20 /* Update */ | ||
44 | #define RX8581_FLAG_TF 0x10 /* Timer */ | ||
45 | #define RX8581_FLAG_AF 0x08 /* Alarm */ | ||
46 | #define RX8581_FLAG_VLF 0x02 /* Voltage Low */ | ||
47 | |||
48 | /* Control Register bit definitions */ | ||
49 | #define RX8581_CTRL_UIE 0x20 /* Update Interrupt Enable */ | ||
50 | #define RX8581_CTRL_TIE 0x10 /* Timer Interrupt Enable */ | ||
51 | #define RX8581_CTRL_AIE 0x08 /* Alarm Interrupt Enable */ | ||
52 | #define RX8581_CTRL_STOP 0x02 /* STOP bit */ | ||
53 | #define RX8581_CTRL_RESET 0x01 /* RESET bit */ | ||
54 | |||
55 | static struct i2c_driver rx8581_driver; | ||
56 | |||
57 | /* | ||
58 | * In the routines that deal directly with the rx8581 hardware, we use | ||
59 | * rtc_time -- month 0-11, hour 0-23, yr = calendar year-epoch. | ||
60 | */ | ||
61 | static int rx8581_get_datetime(struct i2c_client *client, struct rtc_time *tm) | ||
62 | { | ||
63 | unsigned char date[7]; | ||
64 | int data, err; | ||
65 | |||
66 | /* First we ensure that the "update flag" is not set, we read the | ||
67 | * time and date then re-read the "update flag". If the update flag | ||
68 | * has been set, we know that the time has changed during the read so | ||
69 | * we repeat the whole process again. | ||
70 | */ | ||
71 | data = i2c_smbus_read_byte_data(client, RX8581_REG_FLAG); | ||
72 | if (data < 0) { | ||
73 | dev_err(&client->dev, "Unable to read device flags\n"); | ||
74 | return -EIO; | ||
75 | } | ||
76 | |||
77 | do { | ||
78 | /* If update flag set, clear it */ | ||
79 | if (data & RX8581_FLAG_UF) { | ||
80 | err = i2c_smbus_write_byte_data(client, | ||
81 | RX8581_REG_FLAG, (data & ~RX8581_FLAG_UF)); | ||
82 | if (err != 0) { | ||
83 | dev_err(&client->dev, "Unable to write device " | ||
84 | "flags\n"); | ||
85 | return -EIO; | ||
86 | } | ||
87 | } | ||
88 | |||
89 | /* Now read time and date */ | ||
90 | err = i2c_smbus_read_i2c_block_data(client, RX8581_REG_SC, | ||
91 | 7, date); | ||
92 | if (err < 0) { | ||
93 | dev_err(&client->dev, "Unable to read date\n"); | ||
94 | return -EIO; | ||
95 | } | ||
96 | |||
97 | /* Check flag register */ | ||
98 | data = i2c_smbus_read_byte_data(client, RX8581_REG_FLAG); | ||
99 | if (data < 0) { | ||
100 | dev_err(&client->dev, "Unable to read device flags\n"); | ||
101 | return -EIO; | ||
102 | } | ||
103 | } while (data & RX8581_FLAG_UF); | ||
104 | |||
105 | if (data & RX8581_FLAG_VLF) | ||
106 | dev_info(&client->dev, | ||
107 | "low voltage detected, date/time is not reliable.\n"); | ||
108 | |||
109 | dev_dbg(&client->dev, | ||
110 | "%s: raw data is sec=%02x, min=%02x, hr=%02x, " | ||
111 | "wday=%02x, mday=%02x, mon=%02x, year=%02x\n", | ||
112 | __func__, | ||
113 | date[0], date[1], date[2], date[3], date[4], date[5], date[6]); | ||
114 | |||
115 | tm->tm_sec = bcd2bin(date[RX8581_REG_SC] & 0x7F); | ||
116 | tm->tm_min = bcd2bin(date[RX8581_REG_MN] & 0x7F); | ||
117 | tm->tm_hour = bcd2bin(date[RX8581_REG_HR] & 0x3F); /* rtc hr 0-23 */ | ||
118 | tm->tm_wday = ilog2(date[RX8581_REG_DW] & 0x7F); | ||
119 | tm->tm_mday = bcd2bin(date[RX8581_REG_DM] & 0x3F); | ||
120 | tm->tm_mon = bcd2bin(date[RX8581_REG_MO] & 0x1F) - 1; /* rtc mn 1-12 */ | ||
121 | tm->tm_year = bcd2bin(date[RX8581_REG_YR]); | ||
122 | if (tm->tm_year < 70) | ||
123 | tm->tm_year += 100; /* assume we are in 1970...2069 */ | ||
124 | |||
125 | |||
126 | dev_dbg(&client->dev, "%s: tm is secs=%d, mins=%d, hours=%d, " | ||
127 | "mday=%d, mon=%d, year=%d, wday=%d\n", | ||
128 | __func__, | ||
129 | tm->tm_sec, tm->tm_min, tm->tm_hour, | ||
130 | tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday); | ||
131 | |||
132 | err = rtc_valid_tm(tm); | ||
133 | if (err < 0) | ||
134 | dev_err(&client->dev, "retrieved date/time is not valid.\n"); | ||
135 | |||
136 | return err; | ||
137 | } | ||
138 | |||
139 | static int rx8581_set_datetime(struct i2c_client *client, struct rtc_time *tm) | ||
140 | { | ||
141 | int data, err; | ||
142 | unsigned char buf[7]; | ||
143 | |||
144 | dev_dbg(&client->dev, "%s: secs=%d, mins=%d, hours=%d, " | ||
145 | "mday=%d, mon=%d, year=%d, wday=%d\n", | ||
146 | __func__, | ||
147 | tm->tm_sec, tm->tm_min, tm->tm_hour, | ||
148 | tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday); | ||
149 | |||
150 | /* hours, minutes and seconds */ | ||
151 | buf[RX8581_REG_SC] = bin2bcd(tm->tm_sec); | ||
152 | buf[RX8581_REG_MN] = bin2bcd(tm->tm_min); | ||
153 | buf[RX8581_REG_HR] = bin2bcd(tm->tm_hour); | ||
154 | |||
155 | buf[RX8581_REG_DM] = bin2bcd(tm->tm_mday); | ||
156 | |||
157 | /* month, 1 - 12 */ | ||
158 | buf[RX8581_REG_MO] = bin2bcd(tm->tm_mon + 1); | ||
159 | |||
160 | /* year and century */ | ||
161 | buf[RX8581_REG_YR] = bin2bcd(tm->tm_year % 100); | ||
162 | buf[RX8581_REG_DW] = (0x1 << tm->tm_wday); | ||
163 | |||
164 | /* Stop the clock */ | ||
165 | data = i2c_smbus_read_byte_data(client, RX8581_REG_CTRL); | ||
166 | if (data < 0) { | ||
167 | dev_err(&client->dev, "Unable to read control register\n"); | ||
168 | return -EIO; | ||
169 | } | ||
170 | |||
171 | err = i2c_smbus_write_byte_data(client, RX8581_REG_FLAG, | ||
172 | (data | RX8581_CTRL_STOP)); | ||
173 | if (err < 0) { | ||
174 | dev_err(&client->dev, "Unable to write control register\n"); | ||
175 | return -EIO; | ||
176 | } | ||
177 | |||
178 | /* write register's data */ | ||
179 | err = i2c_smbus_write_i2c_block_data(client, RX8581_REG_SC, 7, buf); | ||
180 | if (err < 0) { | ||
181 | dev_err(&client->dev, "Unable to write to date registers\n"); | ||
182 | return -EIO; | ||
183 | } | ||
184 | |||
185 | /* Restart the clock */ | ||
186 | data = i2c_smbus_read_byte_data(client, RX8581_REG_CTRL); | ||
187 | if (data < 0) { | ||
188 | dev_err(&client->dev, "Unable to read control register\n"); | ||
189 | return -EIO; | ||
190 | } | ||
191 | |||
192 | err = i2c_smbus_write_byte_data(client, RX8581_REG_FLAG, | ||
193 | (data | ~(RX8581_CTRL_STOP))); | ||
194 | if (err != 0) { | ||
195 | dev_err(&client->dev, "Unable to write control register\n"); | ||
196 | return -EIO; | ||
197 | } | ||
198 | |||
199 | return 0; | ||
200 | } | ||
201 | |||
202 | static int rx8581_rtc_read_time(struct device *dev, struct rtc_time *tm) | ||
203 | { | ||
204 | return rx8581_get_datetime(to_i2c_client(dev), tm); | ||
205 | } | ||
206 | |||
207 | static int rx8581_rtc_set_time(struct device *dev, struct rtc_time *tm) | ||
208 | { | ||
209 | return rx8581_set_datetime(to_i2c_client(dev), tm); | ||
210 | } | ||
211 | |||
212 | static const struct rtc_class_ops rx8581_rtc_ops = { | ||
213 | .read_time = rx8581_rtc_read_time, | ||
214 | .set_time = rx8581_rtc_set_time, | ||
215 | }; | ||
216 | |||
217 | static int __devinit rx8581_probe(struct i2c_client *client, | ||
218 | const struct i2c_device_id *id) | ||
219 | { | ||
220 | struct rtc_device *rtc; | ||
221 | |||
222 | dev_dbg(&client->dev, "%s\n", __func__); | ||
223 | |||
224 | if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) | ||
225 | return -ENODEV; | ||
226 | |||
227 | dev_info(&client->dev, "chip found, driver version " DRV_VERSION "\n"); | ||
228 | |||
229 | rtc = rtc_device_register(rx8581_driver.driver.name, | ||
230 | &client->dev, &rx8581_rtc_ops, THIS_MODULE); | ||
231 | |||
232 | if (IS_ERR(rtc)) | ||
233 | return PTR_ERR(rtc); | ||
234 | |||
235 | i2c_set_clientdata(client, rtc); | ||
236 | |||
237 | return 0; | ||
238 | } | ||
239 | |||
240 | static int __devexit rx8581_remove(struct i2c_client *client) | ||
241 | { | ||
242 | struct rtc_device *rtc = i2c_get_clientdata(client); | ||
243 | |||
244 | rtc_device_unregister(rtc); | ||
245 | |||
246 | return 0; | ||
247 | } | ||
248 | |||
249 | static const struct i2c_device_id rx8581_id[] = { | ||
250 | { "rx8581", 0 }, | ||
251 | { } | ||
252 | }; | ||
253 | MODULE_DEVICE_TABLE(i2c, rx8581_id); | ||
254 | |||
255 | static struct i2c_driver rx8581_driver = { | ||
256 | .driver = { | ||
257 | .name = "rtc-rx8581", | ||
258 | .owner = THIS_MODULE, | ||
259 | }, | ||
260 | .probe = rx8581_probe, | ||
261 | .remove = __devexit_p(rx8581_remove), | ||
262 | .id_table = rx8581_id, | ||
263 | }; | ||
264 | |||
265 | static int __init rx8581_init(void) | ||
266 | { | ||
267 | return i2c_add_driver(&rx8581_driver); | ||
268 | } | ||
269 | |||
270 | static void __exit rx8581_exit(void) | ||
271 | { | ||
272 | i2c_del_driver(&rx8581_driver); | ||
273 | } | ||
274 | |||
275 | MODULE_AUTHOR("Martyn Welch <martyn.welch@gefanuc.com>"); | ||
276 | MODULE_DESCRIPTION("Epson RX-8581 RTC driver"); | ||
277 | MODULE_LICENSE("GPL"); | ||
278 | MODULE_VERSION(DRV_VERSION); | ||
279 | |||
280 | module_init(rx8581_init); | ||
281 | module_exit(rx8581_exit); | ||
diff --git a/drivers/rtc/rtc-sun4v.c b/drivers/rtc/rtc-sun4v.c index 2012ccbb4a53..5b2261052a65 100644 --- a/drivers/rtc/rtc-sun4v.c +++ b/drivers/rtc/rtc-sun4v.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* rtc-sun4c.c: Hypervisor based RTC for SUN4V systems. | 1 | /* rtc-sun4v.c: Hypervisor based RTC for SUN4V systems. |
2 | * | 2 | * |
3 | * Copyright (C) 2008 David S. Miller <davem@davemloft.net> | 3 | * Copyright (C) 2008 David S. Miller <davem@davemloft.net> |
4 | */ | 4 | */ |
@@ -7,21 +7,11 @@ | |||
7 | #include <linux/module.h> | 7 | #include <linux/module.h> |
8 | #include <linux/delay.h> | 8 | #include <linux/delay.h> |
9 | #include <linux/init.h> | 9 | #include <linux/init.h> |
10 | #include <linux/time.h> | ||
11 | #include <linux/rtc.h> | 10 | #include <linux/rtc.h> |
12 | #include <linux/platform_device.h> | 11 | #include <linux/platform_device.h> |
13 | 12 | ||
14 | #include <asm/hypervisor.h> | 13 | #include <asm/hypervisor.h> |
15 | 14 | ||
16 | MODULE_AUTHOR("David S. Miller <davem@davemloft.net>"); | ||
17 | MODULE_DESCRIPTION("SUN4V RTC driver"); | ||
18 | MODULE_LICENSE("GPL"); | ||
19 | |||
20 | struct sun4v_rtc { | ||
21 | struct rtc_device *rtc; | ||
22 | spinlock_t lock; | ||
23 | }; | ||
24 | |||
25 | static unsigned long hypervisor_get_time(void) | 15 | static unsigned long hypervisor_get_time(void) |
26 | { | 16 | { |
27 | unsigned long ret, time; | 17 | unsigned long ret, time; |
@@ -45,15 +35,7 @@ retry: | |||
45 | 35 | ||
46 | static int sun4v_read_time(struct device *dev, struct rtc_time *tm) | 36 | static int sun4v_read_time(struct device *dev, struct rtc_time *tm) |
47 | { | 37 | { |
48 | struct sun4v_rtc *p = dev_get_drvdata(dev); | 38 | rtc_time_to_tm(hypervisor_get_time(), tm); |
49 | unsigned long flags, secs; | ||
50 | |||
51 | spin_lock_irqsave(&p->lock, flags); | ||
52 | secs = hypervisor_get_time(); | ||
53 | spin_unlock_irqrestore(&p->lock, flags); | ||
54 | |||
55 | rtc_time_to_tm(secs, tm); | ||
56 | |||
57 | return 0; | 39 | return 0; |
58 | } | 40 | } |
59 | 41 | ||
@@ -80,19 +62,14 @@ retry: | |||
80 | 62 | ||
81 | static int sun4v_set_time(struct device *dev, struct rtc_time *tm) | 63 | static int sun4v_set_time(struct device *dev, struct rtc_time *tm) |
82 | { | 64 | { |
83 | struct sun4v_rtc *p = dev_get_drvdata(dev); | 65 | unsigned long secs; |
84 | unsigned long flags, secs; | ||
85 | int err; | 66 | int err; |
86 | 67 | ||
87 | err = rtc_tm_to_time(tm, &secs); | 68 | err = rtc_tm_to_time(tm, &secs); |
88 | if (err) | 69 | if (err) |
89 | return err; | 70 | return err; |
90 | 71 | ||
91 | spin_lock_irqsave(&p->lock, flags); | 72 | return hypervisor_set_time(secs); |
92 | err = hypervisor_set_time(secs); | ||
93 | spin_unlock_irqrestore(&p->lock, flags); | ||
94 | |||
95 | return err; | ||
96 | } | 73 | } |
97 | 74 | ||
98 | static const struct rtc_class_ops sun4v_rtc_ops = { | 75 | static const struct rtc_class_ops sun4v_rtc_ops = { |
@@ -100,33 +77,22 @@ static const struct rtc_class_ops sun4v_rtc_ops = { | |||
100 | .set_time = sun4v_set_time, | 77 | .set_time = sun4v_set_time, |
101 | }; | 78 | }; |
102 | 79 | ||
103 | static int __devinit sun4v_rtc_probe(struct platform_device *pdev) | 80 | static int __init sun4v_rtc_probe(struct platform_device *pdev) |
104 | { | 81 | { |
105 | struct sun4v_rtc *p = kzalloc(sizeof(*p), GFP_KERNEL); | 82 | struct rtc_device *rtc = rtc_device_register("sun4v", &pdev->dev, |
106 | |||
107 | if (!p) | ||
108 | return -ENOMEM; | ||
109 | |||
110 | spin_lock_init(&p->lock); | ||
111 | |||
112 | p->rtc = rtc_device_register("sun4v", &pdev->dev, | ||
113 | &sun4v_rtc_ops, THIS_MODULE); | 83 | &sun4v_rtc_ops, THIS_MODULE); |
114 | if (IS_ERR(p->rtc)) { | 84 | if (IS_ERR(rtc)) |
115 | int err = PTR_ERR(p->rtc); | 85 | return PTR_ERR(rtc); |
116 | kfree(p); | 86 | |
117 | return err; | 87 | platform_set_drvdata(pdev, rtc); |
118 | } | ||
119 | platform_set_drvdata(pdev, p); | ||
120 | return 0; | 88 | return 0; |
121 | } | 89 | } |
122 | 90 | ||
123 | static int __devexit sun4v_rtc_remove(struct platform_device *pdev) | 91 | static int __exit sun4v_rtc_remove(struct platform_device *pdev) |
124 | { | 92 | { |
125 | struct sun4v_rtc *p = platform_get_drvdata(pdev); | 93 | struct rtc_device *rtc = platform_get_drvdata(pdev); |
126 | |||
127 | rtc_device_unregister(p->rtc); | ||
128 | kfree(p); | ||
129 | 94 | ||
95 | rtc_device_unregister(rtc); | ||
130 | return 0; | 96 | return 0; |
131 | } | 97 | } |
132 | 98 | ||
@@ -135,13 +101,12 @@ static struct platform_driver sun4v_rtc_driver = { | |||
135 | .name = "rtc-sun4v", | 101 | .name = "rtc-sun4v", |
136 | .owner = THIS_MODULE, | 102 | .owner = THIS_MODULE, |
137 | }, | 103 | }, |
138 | .probe = sun4v_rtc_probe, | 104 | .remove = __exit_p(sun4v_rtc_remove), |
139 | .remove = __devexit_p(sun4v_rtc_remove), | ||
140 | }; | 105 | }; |
141 | 106 | ||
142 | static int __init sun4v_rtc_init(void) | 107 | static int __init sun4v_rtc_init(void) |
143 | { | 108 | { |
144 | return platform_driver_register(&sun4v_rtc_driver); | 109 | return platform_driver_probe(&sun4v_rtc_driver, sun4v_rtc_probe); |
145 | } | 110 | } |
146 | 111 | ||
147 | static void __exit sun4v_rtc_exit(void) | 112 | static void __exit sun4v_rtc_exit(void) |
@@ -151,3 +116,7 @@ static void __exit sun4v_rtc_exit(void) | |||
151 | 116 | ||
152 | module_init(sun4v_rtc_init); | 117 | module_init(sun4v_rtc_init); |
153 | module_exit(sun4v_rtc_exit); | 118 | module_exit(sun4v_rtc_exit); |
119 | |||
120 | MODULE_AUTHOR("David S. Miller <davem@davemloft.net>"); | ||
121 | MODULE_DESCRIPTION("SUN4V RTC driver"); | ||
122 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/rtc/rtc-wm8350.c b/drivers/rtc/rtc-wm8350.c new file mode 100644 index 000000000000..5c5e3aa91385 --- /dev/null +++ b/drivers/rtc/rtc-wm8350.c | |||
@@ -0,0 +1,514 @@ | |||
1 | /* | ||
2 | * Real Time Clock driver for Wolfson Microelectronics WM8350 | ||
3 | * | ||
4 | * Copyright (C) 2007, 2008 Wolfson Microelectronics PLC. | ||
5 | * | ||
6 | * Author: Liam Girdwood | ||
7 | * linux@wolfsonmicro.com | ||
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 | */ | ||
15 | |||
16 | #include <linux/module.h> | ||
17 | #include <linux/kernel.h> | ||
18 | #include <linux/time.h> | ||
19 | #include <linux/rtc.h> | ||
20 | #include <linux/bcd.h> | ||
21 | #include <linux/interrupt.h> | ||
22 | #include <linux/ioctl.h> | ||
23 | #include <linux/completion.h> | ||
24 | #include <linux/mfd/wm8350/rtc.h> | ||
25 | #include <linux/mfd/wm8350/core.h> | ||
26 | #include <linux/delay.h> | ||
27 | #include <linux/platform_device.h> | ||
28 | |||
29 | #define WM8350_SET_ALM_RETRIES 5 | ||
30 | #define WM8350_SET_TIME_RETRIES 5 | ||
31 | #define WM8350_GET_TIME_RETRIES 5 | ||
32 | |||
33 | #define to_wm8350_from_rtc_dev(d) container_of(d, struct wm8350, rtc.pdev.dev) | ||
34 | |||
35 | /* | ||
36 | * Read current time and date in RTC | ||
37 | */ | ||
38 | static int wm8350_rtc_readtime(struct device *dev, struct rtc_time *tm) | ||
39 | { | ||
40 | struct wm8350 *wm8350 = dev_get_drvdata(dev); | ||
41 | u16 time1[4], time2[4]; | ||
42 | int retries = WM8350_GET_TIME_RETRIES, ret; | ||
43 | |||
44 | /* | ||
45 | * Read the time twice and compare. | ||
46 | * If time1 == time2, then time is valid else retry. | ||
47 | */ | ||
48 | do { | ||
49 | ret = wm8350_block_read(wm8350, WM8350_RTC_SECONDS_MINUTES, | ||
50 | 4, time1); | ||
51 | if (ret < 0) | ||
52 | return ret; | ||
53 | ret = wm8350_block_read(wm8350, WM8350_RTC_SECONDS_MINUTES, | ||
54 | 4, time2); | ||
55 | if (ret < 0) | ||
56 | return ret; | ||
57 | |||
58 | if (memcmp(time1, time2, sizeof(time1)) == 0) { | ||
59 | tm->tm_sec = time1[0] & WM8350_RTC_SECS_MASK; | ||
60 | |||
61 | tm->tm_min = (time1[0] & WM8350_RTC_MINS_MASK) | ||
62 | >> WM8350_RTC_MINS_SHIFT; | ||
63 | |||
64 | tm->tm_hour = time1[1] & WM8350_RTC_HRS_MASK; | ||
65 | |||
66 | tm->tm_wday = ((time1[1] >> WM8350_RTC_DAY_SHIFT) | ||
67 | & 0x7) - 1; | ||
68 | |||
69 | tm->tm_mon = ((time1[2] & WM8350_RTC_MTH_MASK) | ||
70 | >> WM8350_RTC_MTH_SHIFT) - 1; | ||
71 | |||
72 | tm->tm_mday = (time1[2] & WM8350_RTC_DATE_MASK); | ||
73 | |||
74 | tm->tm_year = ((time1[3] & WM8350_RTC_YHUNDREDS_MASK) | ||
75 | >> WM8350_RTC_YHUNDREDS_SHIFT) * 100; | ||
76 | tm->tm_year += time1[3] & WM8350_RTC_YUNITS_MASK; | ||
77 | |||
78 | tm->tm_yday = rtc_year_days(tm->tm_mday, tm->tm_mon, | ||
79 | tm->tm_year); | ||
80 | tm->tm_year -= 1900; | ||
81 | |||
82 | dev_dbg(dev, "Read (%d left): %04x %04x %04x %04x\n", | ||
83 | retries, | ||
84 | time1[0], time1[1], time1[2], time1[3]); | ||
85 | |||
86 | return 0; | ||
87 | } | ||
88 | } while (retries--); | ||
89 | |||
90 | dev_err(dev, "timed out reading RTC time\n"); | ||
91 | return -EIO; | ||
92 | } | ||
93 | |||
94 | /* | ||
95 | * Set current time and date in RTC | ||
96 | */ | ||
97 | static int wm8350_rtc_settime(struct device *dev, struct rtc_time *tm) | ||
98 | { | ||
99 | struct wm8350 *wm8350 = dev_get_drvdata(dev); | ||
100 | u16 time[4]; | ||
101 | u16 rtc_ctrl; | ||
102 | int ret, retries = WM8350_SET_TIME_RETRIES; | ||
103 | |||
104 | time[0] = tm->tm_sec; | ||
105 | time[0] |= tm->tm_min << WM8350_RTC_MINS_SHIFT; | ||
106 | time[1] = tm->tm_hour; | ||
107 | time[1] |= (tm->tm_wday + 1) << WM8350_RTC_DAY_SHIFT; | ||
108 | time[2] = tm->tm_mday; | ||
109 | time[2] |= (tm->tm_mon + 1) << WM8350_RTC_MTH_SHIFT; | ||
110 | time[3] = ((tm->tm_year + 1900) / 100) << WM8350_RTC_YHUNDREDS_SHIFT; | ||
111 | time[3] |= (tm->tm_year + 1900) % 100; | ||
112 | |||
113 | dev_dbg(dev, "Setting: %04x %04x %04x %04x\n", | ||
114 | time[0], time[1], time[2], time[3]); | ||
115 | |||
116 | /* Set RTC_SET to stop the clock */ | ||
117 | ret = wm8350_set_bits(wm8350, WM8350_RTC_TIME_CONTROL, WM8350_RTC_SET); | ||
118 | if (ret < 0) | ||
119 | return ret; | ||
120 | |||
121 | /* Wait until confirmation of stopping */ | ||
122 | do { | ||
123 | rtc_ctrl = wm8350_reg_read(wm8350, WM8350_RTC_TIME_CONTROL); | ||
124 | schedule_timeout_uninterruptible(msecs_to_jiffies(1)); | ||
125 | } while (retries-- && !(rtc_ctrl & WM8350_RTC_STS)); | ||
126 | |||
127 | if (!retries) { | ||
128 | dev_err(dev, "timed out on set confirmation\n"); | ||
129 | return -EIO; | ||
130 | } | ||
131 | |||
132 | /* Write time to RTC */ | ||
133 | ret = wm8350_block_write(wm8350, WM8350_RTC_SECONDS_MINUTES, 4, time); | ||
134 | if (ret < 0) | ||
135 | return ret; | ||
136 | |||
137 | /* Clear RTC_SET to start the clock */ | ||
138 | ret = wm8350_clear_bits(wm8350, WM8350_RTC_TIME_CONTROL, | ||
139 | WM8350_RTC_SET); | ||
140 | return ret; | ||
141 | } | ||
142 | |||
143 | /* | ||
144 | * Read alarm time and date in RTC | ||
145 | */ | ||
146 | static int wm8350_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm) | ||
147 | { | ||
148 | struct wm8350 *wm8350 = dev_get_drvdata(dev); | ||
149 | struct rtc_time *tm = &alrm->time; | ||
150 | u16 time[4]; | ||
151 | int ret; | ||
152 | |||
153 | ret = wm8350_block_read(wm8350, WM8350_ALARM_SECONDS_MINUTES, 4, time); | ||
154 | if (ret < 0) | ||
155 | return ret; | ||
156 | |||
157 | tm->tm_sec = time[0] & WM8350_RTC_ALMSECS_MASK; | ||
158 | if (tm->tm_sec == WM8350_RTC_ALMSECS_MASK) | ||
159 | tm->tm_sec = -1; | ||
160 | |||
161 | tm->tm_min = time[0] & WM8350_RTC_ALMMINS_MASK; | ||
162 | if (tm->tm_min == WM8350_RTC_ALMMINS_MASK) | ||
163 | tm->tm_min = -1; | ||
164 | else | ||
165 | tm->tm_min >>= WM8350_RTC_ALMMINS_SHIFT; | ||
166 | |||
167 | tm->tm_hour = time[1] & WM8350_RTC_ALMHRS_MASK; | ||
168 | if (tm->tm_hour == WM8350_RTC_ALMHRS_MASK) | ||
169 | tm->tm_hour = -1; | ||
170 | |||
171 | tm->tm_wday = ((time[1] >> WM8350_RTC_ALMDAY_SHIFT) & 0x7) - 1; | ||
172 | if (tm->tm_wday > 7) | ||
173 | tm->tm_wday = -1; | ||
174 | |||
175 | tm->tm_mon = time[2] & WM8350_RTC_ALMMTH_MASK; | ||
176 | if (tm->tm_mon == WM8350_RTC_ALMMTH_MASK) | ||
177 | tm->tm_mon = -1; | ||
178 | else | ||
179 | tm->tm_mon = (tm->tm_mon >> WM8350_RTC_ALMMTH_SHIFT) - 1; | ||
180 | |||
181 | tm->tm_mday = (time[2] & WM8350_RTC_ALMDATE_MASK); | ||
182 | if (tm->tm_mday == WM8350_RTC_ALMDATE_MASK) | ||
183 | tm->tm_mday = -1; | ||
184 | |||
185 | tm->tm_year = -1; | ||
186 | |||
187 | alrm->enabled = !(time[3] & WM8350_RTC_ALMSTS); | ||
188 | |||
189 | return 0; | ||
190 | } | ||
191 | |||
192 | static int wm8350_rtc_stop_alarm(struct wm8350 *wm8350) | ||
193 | { | ||
194 | int retries = WM8350_SET_ALM_RETRIES; | ||
195 | u16 rtc_ctrl; | ||
196 | int ret; | ||
197 | |||
198 | /* Set RTC_SET to stop the clock */ | ||
199 | ret = wm8350_set_bits(wm8350, WM8350_RTC_TIME_CONTROL, | ||
200 | WM8350_RTC_ALMSET); | ||
201 | if (ret < 0) | ||
202 | return ret; | ||
203 | |||
204 | /* Wait until confirmation of stopping */ | ||
205 | do { | ||
206 | rtc_ctrl = wm8350_reg_read(wm8350, WM8350_RTC_TIME_CONTROL); | ||
207 | schedule_timeout_uninterruptible(msecs_to_jiffies(1)); | ||
208 | } while (retries-- && !(rtc_ctrl & WM8350_RTC_ALMSTS)); | ||
209 | |||
210 | if (!(rtc_ctrl & WM8350_RTC_ALMSTS)) | ||
211 | return -ETIMEDOUT; | ||
212 | |||
213 | return 0; | ||
214 | } | ||
215 | |||
216 | static int wm8350_rtc_start_alarm(struct wm8350 *wm8350) | ||
217 | { | ||
218 | int ret; | ||
219 | int retries = WM8350_SET_ALM_RETRIES; | ||
220 | u16 rtc_ctrl; | ||
221 | |||
222 | ret = wm8350_clear_bits(wm8350, WM8350_RTC_TIME_CONTROL, | ||
223 | WM8350_RTC_ALMSET); | ||
224 | if (ret < 0) | ||
225 | return ret; | ||
226 | |||
227 | /* Wait until confirmation */ | ||
228 | do { | ||
229 | rtc_ctrl = wm8350_reg_read(wm8350, WM8350_RTC_TIME_CONTROL); | ||
230 | schedule_timeout_uninterruptible(msecs_to_jiffies(1)); | ||
231 | } while (retries-- && rtc_ctrl & WM8350_RTC_ALMSTS); | ||
232 | |||
233 | if (rtc_ctrl & WM8350_RTC_ALMSTS) | ||
234 | return -ETIMEDOUT; | ||
235 | |||
236 | return 0; | ||
237 | } | ||
238 | |||
239 | static int wm8350_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) | ||
240 | { | ||
241 | struct wm8350 *wm8350 = dev_get_drvdata(dev); | ||
242 | struct rtc_time *tm = &alrm->time; | ||
243 | u16 time[3]; | ||
244 | int ret; | ||
245 | |||
246 | memset(time, 0, sizeof(time)); | ||
247 | |||
248 | if (tm->tm_sec != -1) | ||
249 | time[0] |= tm->tm_sec; | ||
250 | else | ||
251 | time[0] |= WM8350_RTC_ALMSECS_MASK; | ||
252 | |||
253 | if (tm->tm_min != -1) | ||
254 | time[0] |= tm->tm_min << WM8350_RTC_ALMMINS_SHIFT; | ||
255 | else | ||
256 | time[0] |= WM8350_RTC_ALMMINS_MASK; | ||
257 | |||
258 | if (tm->tm_hour != -1) | ||
259 | time[1] |= tm->tm_hour; | ||
260 | else | ||
261 | time[1] |= WM8350_RTC_ALMHRS_MASK; | ||
262 | |||
263 | if (tm->tm_wday != -1) | ||
264 | time[1] |= (tm->tm_wday + 1) << WM8350_RTC_ALMDAY_SHIFT; | ||
265 | else | ||
266 | time[1] |= WM8350_RTC_ALMDAY_MASK; | ||
267 | |||
268 | if (tm->tm_mday != -1) | ||
269 | time[2] |= tm->tm_mday; | ||
270 | else | ||
271 | time[2] |= WM8350_RTC_ALMDATE_MASK; | ||
272 | |||
273 | if (tm->tm_mon != -1) | ||
274 | time[2] |= (tm->tm_mon + 1) << WM8350_RTC_ALMMTH_SHIFT; | ||
275 | else | ||
276 | time[2] |= WM8350_RTC_ALMMTH_MASK; | ||
277 | |||
278 | ret = wm8350_rtc_stop_alarm(wm8350); | ||
279 | if (ret < 0) | ||
280 | return ret; | ||
281 | |||
282 | /* Write time to RTC */ | ||
283 | ret = wm8350_block_write(wm8350, WM8350_ALARM_SECONDS_MINUTES, | ||
284 | 3, time); | ||
285 | if (ret < 0) | ||
286 | return ret; | ||
287 | |||
288 | if (alrm->enabled) | ||
289 | ret = wm8350_rtc_start_alarm(wm8350); | ||
290 | |||
291 | return ret; | ||
292 | } | ||
293 | |||
294 | /* | ||
295 | * Handle commands from user-space | ||
296 | */ | ||
297 | static int wm8350_rtc_ioctl(struct device *dev, unsigned int cmd, | ||
298 | unsigned long arg) | ||
299 | { | ||
300 | struct wm8350 *wm8350 = dev_get_drvdata(dev); | ||
301 | |||
302 | switch (cmd) { | ||
303 | case RTC_AIE_OFF: | ||
304 | return wm8350_rtc_stop_alarm(wm8350); | ||
305 | case RTC_AIE_ON: | ||
306 | return wm8350_rtc_start_alarm(wm8350); | ||
307 | |||
308 | case RTC_UIE_OFF: | ||
309 | wm8350_mask_irq(wm8350, WM8350_IRQ_RTC_SEC); | ||
310 | break; | ||
311 | case RTC_UIE_ON: | ||
312 | wm8350_unmask_irq(wm8350, WM8350_IRQ_RTC_SEC); | ||
313 | break; | ||
314 | |||
315 | default: | ||
316 | return -ENOIOCTLCMD; | ||
317 | } | ||
318 | |||
319 | return 0; | ||
320 | } | ||
321 | |||
322 | static void wm8350_rtc_alarm_handler(struct wm8350 *wm8350, int irq, | ||
323 | void *data) | ||
324 | { | ||
325 | struct rtc_device *rtc = wm8350->rtc.rtc; | ||
326 | int ret; | ||
327 | |||
328 | rtc_update_irq(rtc, 1, RTC_IRQF | RTC_AF); | ||
329 | |||
330 | /* Make it one shot */ | ||
331 | ret = wm8350_set_bits(wm8350, WM8350_RTC_TIME_CONTROL, | ||
332 | WM8350_RTC_ALMSET); | ||
333 | if (ret != 0) { | ||
334 | dev_err(&(wm8350->rtc.pdev->dev), | ||
335 | "Failed to disable alarm: %d\n", ret); | ||
336 | } | ||
337 | } | ||
338 | |||
339 | static void wm8350_rtc_update_handler(struct wm8350 *wm8350, int irq, | ||
340 | void *data) | ||
341 | { | ||
342 | struct rtc_device *rtc = wm8350->rtc.rtc; | ||
343 | |||
344 | rtc_update_irq(rtc, 1, RTC_IRQF | RTC_UF); | ||
345 | } | ||
346 | |||
347 | static const struct rtc_class_ops wm8350_rtc_ops = { | ||
348 | .ioctl = wm8350_rtc_ioctl, | ||
349 | .read_time = wm8350_rtc_readtime, | ||
350 | .set_time = wm8350_rtc_settime, | ||
351 | .read_alarm = wm8350_rtc_readalarm, | ||
352 | .set_alarm = wm8350_rtc_setalarm, | ||
353 | }; | ||
354 | |||
355 | #ifdef CONFIG_PM | ||
356 | static int wm8350_rtc_suspend(struct platform_device *pdev, pm_message_t state) | ||
357 | { | ||
358 | struct wm8350 *wm8350 = dev_get_drvdata(&pdev->dev); | ||
359 | int ret = 0; | ||
360 | u16 reg; | ||
361 | |||
362 | reg = wm8350_reg_read(wm8350, WM8350_RTC_TIME_CONTROL); | ||
363 | |||
364 | if (device_may_wakeup(&wm8350->rtc.pdev->dev) && | ||
365 | reg & WM8350_RTC_ALMSTS) { | ||
366 | ret = wm8350_rtc_stop_alarm(wm8350); | ||
367 | if (ret != 0) | ||
368 | dev_err(&pdev->dev, "Failed to stop RTC alarm: %d\n", | ||
369 | ret); | ||
370 | } | ||
371 | |||
372 | return ret; | ||
373 | } | ||
374 | |||
375 | static int wm8350_rtc_resume(struct platform_device *pdev) | ||
376 | { | ||
377 | struct wm8350 *wm8350 = dev_get_drvdata(&pdev->dev); | ||
378 | int ret; | ||
379 | |||
380 | if (wm8350->rtc.alarm_enabled) { | ||
381 | ret = wm8350_rtc_start_alarm(wm8350); | ||
382 | if (ret != 0) | ||
383 | dev_err(&pdev->dev, | ||
384 | "Failed to restart RTC alarm: %d\n", ret); | ||
385 | } | ||
386 | |||
387 | return 0; | ||
388 | } | ||
389 | |||
390 | #else | ||
391 | #define wm8350_rtc_suspend NULL | ||
392 | #define wm8350_rtc_resume NULL | ||
393 | #endif | ||
394 | |||
395 | static int wm8350_rtc_probe(struct platform_device *pdev) | ||
396 | { | ||
397 | struct wm8350 *wm8350 = platform_get_drvdata(pdev); | ||
398 | struct wm8350_rtc *wm_rtc = &wm8350->rtc; | ||
399 | int ret = 0; | ||
400 | u16 timectl, power5; | ||
401 | |||
402 | timectl = wm8350_reg_read(wm8350, WM8350_RTC_TIME_CONTROL); | ||
403 | if (timectl & WM8350_RTC_BCD) { | ||
404 | dev_err(&pdev->dev, "RTC BCD mode not supported\n"); | ||
405 | return -EINVAL; | ||
406 | } | ||
407 | if (timectl & WM8350_RTC_12HR) { | ||
408 | dev_err(&pdev->dev, "RTC 12 hour mode not supported\n"); | ||
409 | return -EINVAL; | ||
410 | } | ||
411 | |||
412 | /* enable the RTC if it's not already enabled */ | ||
413 | power5 = wm8350_reg_read(wm8350, WM8350_POWER_MGMT_5); | ||
414 | if (!(power5 & WM8350_RTC_TICK_ENA)) { | ||
415 | dev_info(wm8350->dev, "Starting RTC\n"); | ||
416 | |||
417 | wm8350_reg_unlock(wm8350); | ||
418 | |||
419 | ret = wm8350_set_bits(wm8350, WM8350_POWER_MGMT_5, | ||
420 | WM8350_RTC_TICK_ENA); | ||
421 | if (ret < 0) { | ||
422 | dev_err(&pdev->dev, "failed to enable RTC: %d\n", ret); | ||
423 | return ret; | ||
424 | } | ||
425 | |||
426 | wm8350_reg_lock(wm8350); | ||
427 | } | ||
428 | |||
429 | if (timectl & WM8350_RTC_STS) { | ||
430 | int retries; | ||
431 | |||
432 | ret = wm8350_clear_bits(wm8350, WM8350_RTC_TIME_CONTROL, | ||
433 | WM8350_RTC_SET); | ||
434 | if (ret < 0) { | ||
435 | dev_err(&pdev->dev, "failed to start: %d\n", ret); | ||
436 | return ret; | ||
437 | } | ||
438 | |||
439 | retries = WM8350_SET_TIME_RETRIES; | ||
440 | do { | ||
441 | timectl = wm8350_reg_read(wm8350, | ||
442 | WM8350_RTC_TIME_CONTROL); | ||
443 | } while (timectl & WM8350_RTC_STS && retries--); | ||
444 | |||
445 | if (retries == 0) { | ||
446 | dev_err(&pdev->dev, "failed to start: timeout\n"); | ||
447 | return -ENODEV; | ||
448 | } | ||
449 | } | ||
450 | |||
451 | device_init_wakeup(&pdev->dev, 1); | ||
452 | |||
453 | wm_rtc->rtc = rtc_device_register("wm8350", &pdev->dev, | ||
454 | &wm8350_rtc_ops, THIS_MODULE); | ||
455 | if (IS_ERR(wm_rtc->rtc)) { | ||
456 | ret = PTR_ERR(wm_rtc->rtc); | ||
457 | dev_err(&pdev->dev, "failed to register RTC: %d\n", ret); | ||
458 | return ret; | ||
459 | } | ||
460 | |||
461 | wm8350_mask_irq(wm8350, WM8350_IRQ_RTC_SEC); | ||
462 | wm8350_mask_irq(wm8350, WM8350_IRQ_RTC_PER); | ||
463 | |||
464 | wm8350_register_irq(wm8350, WM8350_IRQ_RTC_SEC, | ||
465 | wm8350_rtc_update_handler, NULL); | ||
466 | |||
467 | wm8350_register_irq(wm8350, WM8350_IRQ_RTC_ALM, | ||
468 | wm8350_rtc_alarm_handler, NULL); | ||
469 | wm8350_unmask_irq(wm8350, WM8350_IRQ_RTC_ALM); | ||
470 | |||
471 | return 0; | ||
472 | } | ||
473 | |||
474 | static int __devexit wm8350_rtc_remove(struct platform_device *pdev) | ||
475 | { | ||
476 | struct wm8350 *wm8350 = platform_get_drvdata(pdev); | ||
477 | struct wm8350_rtc *wm_rtc = &wm8350->rtc; | ||
478 | |||
479 | wm8350_mask_irq(wm8350, WM8350_IRQ_RTC_SEC); | ||
480 | |||
481 | wm8350_free_irq(wm8350, WM8350_IRQ_RTC_SEC); | ||
482 | wm8350_free_irq(wm8350, WM8350_IRQ_RTC_ALM); | ||
483 | |||
484 | rtc_device_unregister(wm_rtc->rtc); | ||
485 | |||
486 | return 0; | ||
487 | } | ||
488 | |||
489 | static struct platform_driver wm8350_rtc_driver = { | ||
490 | .probe = wm8350_rtc_probe, | ||
491 | .remove = __devexit_p(wm8350_rtc_remove), | ||
492 | .suspend = wm8350_rtc_suspend, | ||
493 | .resume = wm8350_rtc_resume, | ||
494 | .driver = { | ||
495 | .name = "wm8350-rtc", | ||
496 | }, | ||
497 | }; | ||
498 | |||
499 | static int __init wm8350_rtc_init(void) | ||
500 | { | ||
501 | return platform_driver_register(&wm8350_rtc_driver); | ||
502 | } | ||
503 | module_init(wm8350_rtc_init); | ||
504 | |||
505 | static void __exit wm8350_rtc_exit(void) | ||
506 | { | ||
507 | platform_driver_unregister(&wm8350_rtc_driver); | ||
508 | } | ||
509 | module_exit(wm8350_rtc_exit); | ||
510 | |||
511 | MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>"); | ||
512 | MODULE_DESCRIPTION("RTC driver for the WM8350"); | ||
513 | MODULE_LICENSE("GPL"); | ||
514 | MODULE_ALIAS("platform:wm8350-rtc"); | ||
diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c index 4b76fca64a6f..363bd1303d21 100644 --- a/drivers/s390/block/dasd.c +++ b/drivers/s390/block/dasd.c | |||
@@ -1746,6 +1746,11 @@ restart: | |||
1746 | goto restart; | 1746 | goto restart; |
1747 | } | 1747 | } |
1748 | 1748 | ||
1749 | /* log sense for fatal error */ | ||
1750 | if (cqr->status == DASD_CQR_FAILED) { | ||
1751 | dasd_log_sense(cqr, &cqr->irb); | ||
1752 | } | ||
1753 | |||
1749 | /* First of all call extended error reporting. */ | 1754 | /* First of all call extended error reporting. */ |
1750 | if (dasd_eer_enabled(base) && | 1755 | if (dasd_eer_enabled(base) && |
1751 | cqr->status == DASD_CQR_FAILED) { | 1756 | cqr->status == DASD_CQR_FAILED) { |
diff --git a/drivers/s390/char/sclp_cmd.c b/drivers/s390/char/sclp_cmd.c index eb5f1b8bc57f..ec9c0bcf66ee 100644 --- a/drivers/s390/char/sclp_cmd.c +++ b/drivers/s390/char/sclp_cmd.c | |||
@@ -324,6 +324,9 @@ static int do_assign_storage(sclp_cmdw_t cmd, u16 rn) | |||
324 | case 0x0120: | 324 | case 0x0120: |
325 | break; | 325 | break; |
326 | default: | 326 | default: |
327 | pr_warning("assign storage failed (cmd=0x%08x, " | ||
328 | "response=0x%04x, rn=0x%04x)\n", cmd, | ||
329 | sccb->header.response_code, rn); | ||
327 | rc = -EIO; | 330 | rc = -EIO; |
328 | break; | 331 | break; |
329 | } | 332 | } |
diff --git a/drivers/s390/cio/device.c b/drivers/s390/cio/device.c index 4e78c82194b4..4e4008325e28 100644 --- a/drivers/s390/cio/device.c +++ b/drivers/s390/cio/device.c | |||
@@ -874,11 +874,15 @@ void ccw_device_move_to_orphanage(struct work_struct *work) | |||
874 | replacing_cdev = get_disc_ccwdev_by_dev_id(&dev_id, cdev); | 874 | replacing_cdev = get_disc_ccwdev_by_dev_id(&dev_id, cdev); |
875 | if (replacing_cdev) { | 875 | if (replacing_cdev) { |
876 | sch_attach_disconnected_device(sch, replacing_cdev); | 876 | sch_attach_disconnected_device(sch, replacing_cdev); |
877 | /* Release reference from get_disc_ccwdev_by_dev_id() */ | ||
878 | put_device(&cdev->dev); | ||
877 | return; | 879 | return; |
878 | } | 880 | } |
879 | replacing_cdev = get_orphaned_ccwdev_by_dev_id(css, &dev_id); | 881 | replacing_cdev = get_orphaned_ccwdev_by_dev_id(css, &dev_id); |
880 | if (replacing_cdev) { | 882 | if (replacing_cdev) { |
881 | sch_attach_orphaned_device(sch, replacing_cdev); | 883 | sch_attach_orphaned_device(sch, replacing_cdev); |
884 | /* Release reference from get_orphaned_ccwdev_by_dev_id() */ | ||
885 | put_device(&cdev->dev); | ||
882 | return; | 886 | return; |
883 | } | 887 | } |
884 | sch_create_and_recog_new_device(sch); | 888 | sch_create_and_recog_new_device(sch); |
diff --git a/drivers/s390/kvm/kvm_virtio.c b/drivers/s390/kvm/kvm_virtio.c index ff4a6931bb8e..3d442444c618 100644 --- a/drivers/s390/kvm/kvm_virtio.c +++ b/drivers/s390/kvm/kvm_virtio.c | |||
@@ -322,13 +322,13 @@ static int __init kvm_devices_init(void) | |||
322 | return rc; | 322 | return rc; |
323 | } | 323 | } |
324 | 324 | ||
325 | rc = vmem_add_mapping(PFN_PHYS(max_pfn), PAGE_SIZE); | 325 | rc = vmem_add_mapping(real_memory_size, PAGE_SIZE); |
326 | if (rc) { | 326 | if (rc) { |
327 | s390_root_dev_unregister(kvm_root); | 327 | s390_root_dev_unregister(kvm_root); |
328 | return rc; | 328 | return rc; |
329 | } | 329 | } |
330 | 330 | ||
331 | kvm_devices = (void *) PFN_PHYS(max_pfn); | 331 | kvm_devices = (void *) real_memory_size; |
332 | 332 | ||
333 | ctl_set_bit(0, 9); | 333 | ctl_set_bit(0, 9); |
334 | register_external_interrupt(0x2603, kvm_extint_handler); | 334 | register_external_interrupt(0x2603, kvm_extint_handler); |
diff --git a/drivers/s390/scsi/zfcp_aux.c b/drivers/s390/scsi/zfcp_aux.c index 3b56220fb900..3d4e3e3f3fc0 100644 --- a/drivers/s390/scsi/zfcp_aux.c +++ b/drivers/s390/scsi/zfcp_aux.c | |||
@@ -610,7 +610,8 @@ struct zfcp_port *zfcp_port_enqueue(struct zfcp_adapter *adapter, u64 wwpn, | |||
610 | atomic_set_mask(status | ZFCP_STATUS_COMMON_REMOVE, &port->status); | 610 | atomic_set_mask(status | ZFCP_STATUS_COMMON_REMOVE, &port->status); |
611 | atomic_set(&port->refcount, 0); | 611 | atomic_set(&port->refcount, 0); |
612 | 612 | ||
613 | dev_set_name(&port->sysfs_device, "0x%016llx", wwpn); | 613 | dev_set_name(&port->sysfs_device, "0x%016llx", |
614 | (unsigned long long)wwpn); | ||
614 | port->sysfs_device.parent = &adapter->ccw_device->dev; | 615 | port->sysfs_device.parent = &adapter->ccw_device->dev; |
615 | 616 | ||
616 | port->sysfs_device.release = zfcp_sysfs_port_release; | 617 | port->sysfs_device.release = zfcp_sysfs_port_release; |
diff --git a/drivers/s390/scsi/zfcp_ccw.c b/drivers/s390/scsi/zfcp_ccw.c index b04038c74786..951a8d409d1d 100644 --- a/drivers/s390/scsi/zfcp_ccw.c +++ b/drivers/s390/scsi/zfcp_ccw.c | |||
@@ -116,7 +116,9 @@ static int zfcp_ccw_set_online(struct ccw_device *ccw_device) | |||
116 | zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED, 85, | 116 | zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED, 85, |
117 | NULL); | 117 | NULL); |
118 | zfcp_erp_wait(adapter); | 118 | zfcp_erp_wait(adapter); |
119 | goto out; | 119 | up(&zfcp_data.config_sema); |
120 | flush_work(&adapter->scan_work); | ||
121 | return 0; | ||
120 | 122 | ||
121 | out_scsi_register: | 123 | out_scsi_register: |
122 | zfcp_erp_thread_kill(adapter); | 124 | zfcp_erp_thread_kill(adapter); |
diff --git a/drivers/s390/scsi/zfcp_dbf.c b/drivers/s390/scsi/zfcp_dbf.c index 060f5f2352ec..31012d58cfb7 100644 --- a/drivers/s390/scsi/zfcp_dbf.c +++ b/drivers/s390/scsi/zfcp_dbf.c | |||
@@ -30,7 +30,7 @@ static void zfcp_dbf_hexdump(debug_info_t *dbf, void *to, int to_len, | |||
30 | dump->offset = offset; | 30 | dump->offset = offset; |
31 | dump->size = min(from_len - offset, room); | 31 | dump->size = min(from_len - offset, room); |
32 | memcpy(dump->data, from + offset, dump->size); | 32 | memcpy(dump->data, from + offset, dump->size); |
33 | debug_event(dbf, level, dump, dump->size); | 33 | debug_event(dbf, level, dump, dump->size + sizeof(*dump)); |
34 | } | 34 | } |
35 | } | 35 | } |
36 | 36 | ||
@@ -108,7 +108,7 @@ static int zfcp_dbf_view_header(debug_info_t *id, struct debug_view *view, | |||
108 | t.tv_sec, t.tv_nsec); | 108 | t.tv_sec, t.tv_nsec); |
109 | zfcp_dbf_out(&p, "cpu", "%02i", entry->id.fields.cpuid); | 109 | zfcp_dbf_out(&p, "cpu", "%02i", entry->id.fields.cpuid); |
110 | } else { | 110 | } else { |
111 | zfcp_dbf_outd(&p, NULL, dump->data, dump->size, dump->offset, | 111 | zfcp_dbf_outd(&p, "", dump->data, dump->size, dump->offset, |
112 | dump->total_size); | 112 | dump->total_size); |
113 | if ((dump->offset + dump->size) == dump->total_size) | 113 | if ((dump->offset + dump->size) == dump->total_size) |
114 | p += sprintf(p, "\n"); | 114 | p += sprintf(p, "\n"); |
@@ -366,6 +366,7 @@ static void zfcp_hba_dbf_view_response(char **p, | |||
366 | break; | 366 | break; |
367 | zfcp_dbf_out(p, "scsi_cmnd", "0x%0Lx", r->u.fcp.cmnd); | 367 | zfcp_dbf_out(p, "scsi_cmnd", "0x%0Lx", r->u.fcp.cmnd); |
368 | zfcp_dbf_out(p, "scsi_serial", "0x%016Lx", r->u.fcp.serial); | 368 | zfcp_dbf_out(p, "scsi_serial", "0x%016Lx", r->u.fcp.serial); |
369 | p += sprintf(*p, "\n"); | ||
369 | break; | 370 | break; |
370 | 371 | ||
371 | case FSF_QTCB_OPEN_PORT_WITH_DID: | 372 | case FSF_QTCB_OPEN_PORT_WITH_DID: |
@@ -465,7 +466,8 @@ static int zfcp_hba_dbf_view_format(debug_info_t *id, struct debug_view *view, | |||
465 | else if (strncmp(r->tag, "berr", ZFCP_DBF_TAG_SIZE) == 0) | 466 | else if (strncmp(r->tag, "berr", ZFCP_DBF_TAG_SIZE) == 0) |
466 | zfcp_hba_dbf_view_berr(&p, &r->u.berr); | 467 | zfcp_hba_dbf_view_berr(&p, &r->u.berr); |
467 | 468 | ||
468 | p += sprintf(p, "\n"); | 469 | if (strncmp(r->tag, "resp", ZFCP_DBF_TAG_SIZE) != 0) |
470 | p += sprintf(p, "\n"); | ||
469 | return p - out_buf; | 471 | return p - out_buf; |
470 | } | 472 | } |
471 | 473 | ||
@@ -880,6 +882,7 @@ void zfcp_san_dbf_event_ct_request(struct zfcp_fsf_req *fsf_req) | |||
880 | struct ct_hdr *hdr = sg_virt(ct->req); | 882 | struct ct_hdr *hdr = sg_virt(ct->req); |
881 | struct zfcp_san_dbf_record *r = &adapter->san_dbf_buf; | 883 | struct zfcp_san_dbf_record *r = &adapter->san_dbf_buf; |
882 | struct zfcp_san_dbf_record_ct_request *oct = &r->u.ct_req; | 884 | struct zfcp_san_dbf_record_ct_request *oct = &r->u.ct_req; |
885 | int level = 3; | ||
883 | unsigned long flags; | 886 | unsigned long flags; |
884 | 887 | ||
885 | spin_lock_irqsave(&adapter->san_dbf_lock, flags); | 888 | spin_lock_irqsave(&adapter->san_dbf_lock, flags); |
@@ -896,9 +899,10 @@ void zfcp_san_dbf_event_ct_request(struct zfcp_fsf_req *fsf_req) | |||
896 | oct->options = hdr->options; | 899 | oct->options = hdr->options; |
897 | oct->max_res_size = hdr->max_res_size; | 900 | oct->max_res_size = hdr->max_res_size; |
898 | oct->len = min((int)ct->req->length - (int)sizeof(struct ct_hdr), | 901 | oct->len = min((int)ct->req->length - (int)sizeof(struct ct_hdr), |
899 | ZFCP_DBF_CT_PAYLOAD); | 902 | ZFCP_DBF_SAN_MAX_PAYLOAD); |
900 | memcpy(oct->payload, (void *)hdr + sizeof(struct ct_hdr), oct->len); | 903 | debug_event(adapter->san_dbf, level, r, sizeof(*r)); |
901 | debug_event(adapter->san_dbf, 3, r, sizeof(*r)); | 904 | zfcp_dbf_hexdump(adapter->san_dbf, r, sizeof(*r), level, |
905 | (void *)hdr + sizeof(struct ct_hdr), oct->len); | ||
902 | spin_unlock_irqrestore(&adapter->san_dbf_lock, flags); | 906 | spin_unlock_irqrestore(&adapter->san_dbf_lock, flags); |
903 | } | 907 | } |
904 | 908 | ||
@@ -914,6 +918,7 @@ void zfcp_san_dbf_event_ct_response(struct zfcp_fsf_req *fsf_req) | |||
914 | struct ct_hdr *hdr = sg_virt(ct->resp); | 918 | struct ct_hdr *hdr = sg_virt(ct->resp); |
915 | struct zfcp_san_dbf_record *r = &adapter->san_dbf_buf; | 919 | struct zfcp_san_dbf_record *r = &adapter->san_dbf_buf; |
916 | struct zfcp_san_dbf_record_ct_response *rct = &r->u.ct_resp; | 920 | struct zfcp_san_dbf_record_ct_response *rct = &r->u.ct_resp; |
921 | int level = 3; | ||
917 | unsigned long flags; | 922 | unsigned long flags; |
918 | 923 | ||
919 | spin_lock_irqsave(&adapter->san_dbf_lock, flags); | 924 | spin_lock_irqsave(&adapter->san_dbf_lock, flags); |
@@ -929,9 +934,10 @@ void zfcp_san_dbf_event_ct_response(struct zfcp_fsf_req *fsf_req) | |||
929 | rct->expl = hdr->reason_code_expl; | 934 | rct->expl = hdr->reason_code_expl; |
930 | rct->vendor_unique = hdr->vendor_unique; | 935 | rct->vendor_unique = hdr->vendor_unique; |
931 | rct->len = min((int)ct->resp->length - (int)sizeof(struct ct_hdr), | 936 | rct->len = min((int)ct->resp->length - (int)sizeof(struct ct_hdr), |
932 | ZFCP_DBF_CT_PAYLOAD); | 937 | ZFCP_DBF_SAN_MAX_PAYLOAD); |
933 | memcpy(rct->payload, (void *)hdr + sizeof(struct ct_hdr), rct->len); | 938 | debug_event(adapter->san_dbf, level, r, sizeof(*r)); |
934 | debug_event(adapter->san_dbf, 3, r, sizeof(*r)); | 939 | zfcp_dbf_hexdump(adapter->san_dbf, r, sizeof(*r), level, |
940 | (void *)hdr + sizeof(struct ct_hdr), rct->len); | ||
935 | spin_unlock_irqrestore(&adapter->san_dbf_lock, flags); | 941 | spin_unlock_irqrestore(&adapter->san_dbf_lock, flags); |
936 | } | 942 | } |
937 | 943 | ||
@@ -954,7 +960,7 @@ static void zfcp_san_dbf_event_els(const char *tag, int level, | |||
954 | rec->u.els.ls_code = ls_code; | 960 | rec->u.els.ls_code = ls_code; |
955 | debug_event(adapter->san_dbf, level, rec, sizeof(*rec)); | 961 | debug_event(adapter->san_dbf, level, rec, sizeof(*rec)); |
956 | zfcp_dbf_hexdump(adapter->san_dbf, rec, sizeof(*rec), level, | 962 | zfcp_dbf_hexdump(adapter->san_dbf, rec, sizeof(*rec), level, |
957 | buffer, min(buflen, ZFCP_DBF_ELS_MAX_PAYLOAD)); | 963 | buffer, min(buflen, ZFCP_DBF_SAN_MAX_PAYLOAD)); |
958 | spin_unlock_irqrestore(&adapter->san_dbf_lock, flags); | 964 | spin_unlock_irqrestore(&adapter->san_dbf_lock, flags); |
959 | } | 965 | } |
960 | 966 | ||
@@ -1008,8 +1014,6 @@ static int zfcp_san_dbf_view_format(debug_info_t *id, struct debug_view *view, | |||
1008 | char *out_buf, const char *in_buf) | 1014 | char *out_buf, const char *in_buf) |
1009 | { | 1015 | { |
1010 | struct zfcp_san_dbf_record *r = (struct zfcp_san_dbf_record *)in_buf; | 1016 | struct zfcp_san_dbf_record *r = (struct zfcp_san_dbf_record *)in_buf; |
1011 | char *buffer = NULL; | ||
1012 | int buflen = 0, total = 0; | ||
1013 | char *p = out_buf; | 1017 | char *p = out_buf; |
1014 | 1018 | ||
1015 | if (strncmp(r->tag, "dump", ZFCP_DBF_TAG_SIZE) == 0) | 1019 | if (strncmp(r->tag, "dump", ZFCP_DBF_TAG_SIZE) == 0) |
@@ -1029,9 +1033,6 @@ static int zfcp_san_dbf_view_format(debug_info_t *id, struct debug_view *view, | |||
1029 | zfcp_dbf_out(&p, "gs_subtype", "0x%02x", ct->gs_subtype); | 1033 | zfcp_dbf_out(&p, "gs_subtype", "0x%02x", ct->gs_subtype); |
1030 | zfcp_dbf_out(&p, "options", "0x%02x", ct->options); | 1034 | zfcp_dbf_out(&p, "options", "0x%02x", ct->options); |
1031 | zfcp_dbf_out(&p, "max_res_size", "0x%04x", ct->max_res_size); | 1035 | zfcp_dbf_out(&p, "max_res_size", "0x%04x", ct->max_res_size); |
1032 | total = ct->len; | ||
1033 | buffer = ct->payload; | ||
1034 | buflen = min(total, ZFCP_DBF_CT_PAYLOAD); | ||
1035 | } else if (strncmp(r->tag, "rctc", ZFCP_DBF_TAG_SIZE) == 0) { | 1036 | } else if (strncmp(r->tag, "rctc", ZFCP_DBF_TAG_SIZE) == 0) { |
1036 | struct zfcp_san_dbf_record_ct_response *ct = &r->u.ct_resp; | 1037 | struct zfcp_san_dbf_record_ct_response *ct = &r->u.ct_resp; |
1037 | zfcp_dbf_out(&p, "cmd_rsp_code", "0x%04x", ct->cmd_rsp_code); | 1038 | zfcp_dbf_out(&p, "cmd_rsp_code", "0x%04x", ct->cmd_rsp_code); |
@@ -1039,23 +1040,12 @@ static int zfcp_san_dbf_view_format(debug_info_t *id, struct debug_view *view, | |||
1039 | zfcp_dbf_out(&p, "reason_code", "0x%02x", ct->reason_code); | 1040 | zfcp_dbf_out(&p, "reason_code", "0x%02x", ct->reason_code); |
1040 | zfcp_dbf_out(&p, "reason_code_expl", "0x%02x", ct->expl); | 1041 | zfcp_dbf_out(&p, "reason_code_expl", "0x%02x", ct->expl); |
1041 | zfcp_dbf_out(&p, "vendor_unique", "0x%02x", ct->vendor_unique); | 1042 | zfcp_dbf_out(&p, "vendor_unique", "0x%02x", ct->vendor_unique); |
1042 | total = ct->len; | ||
1043 | buffer = ct->payload; | ||
1044 | buflen = min(total, ZFCP_DBF_CT_PAYLOAD); | ||
1045 | } else if (strncmp(r->tag, "oels", ZFCP_DBF_TAG_SIZE) == 0 || | 1043 | } else if (strncmp(r->tag, "oels", ZFCP_DBF_TAG_SIZE) == 0 || |
1046 | strncmp(r->tag, "rels", ZFCP_DBF_TAG_SIZE) == 0 || | 1044 | strncmp(r->tag, "rels", ZFCP_DBF_TAG_SIZE) == 0 || |
1047 | strncmp(r->tag, "iels", ZFCP_DBF_TAG_SIZE) == 0) { | 1045 | strncmp(r->tag, "iels", ZFCP_DBF_TAG_SIZE) == 0) { |
1048 | struct zfcp_san_dbf_record_els *els = &r->u.els; | 1046 | struct zfcp_san_dbf_record_els *els = &r->u.els; |
1049 | zfcp_dbf_out(&p, "ls_code", "0x%02x", els->ls_code); | 1047 | zfcp_dbf_out(&p, "ls_code", "0x%02x", els->ls_code); |
1050 | total = els->len; | ||
1051 | buffer = els->payload; | ||
1052 | buflen = min(total, ZFCP_DBF_ELS_PAYLOAD); | ||
1053 | } | 1048 | } |
1054 | |||
1055 | zfcp_dbf_outd(&p, "payload", buffer, buflen, 0, total); | ||
1056 | if (buflen == total) | ||
1057 | p += sprintf(p, "\n"); | ||
1058 | |||
1059 | return p - out_buf; | 1049 | return p - out_buf; |
1060 | } | 1050 | } |
1061 | 1051 | ||
diff --git a/drivers/s390/scsi/zfcp_dbf.h b/drivers/s390/scsi/zfcp_dbf.h index e8f450801fea..5d6b2dff855b 100644 --- a/drivers/s390/scsi/zfcp_dbf.h +++ b/drivers/s390/scsi/zfcp_dbf.h | |||
@@ -163,8 +163,6 @@ struct zfcp_san_dbf_record_ct_request { | |||
163 | u8 options; | 163 | u8 options; |
164 | u16 max_res_size; | 164 | u16 max_res_size; |
165 | u32 len; | 165 | u32 len; |
166 | #define ZFCP_DBF_CT_PAYLOAD 24 | ||
167 | u8 payload[ZFCP_DBF_CT_PAYLOAD]; | ||
168 | } __attribute__ ((packed)); | 166 | } __attribute__ ((packed)); |
169 | 167 | ||
170 | struct zfcp_san_dbf_record_ct_response { | 168 | struct zfcp_san_dbf_record_ct_response { |
@@ -174,15 +172,11 @@ struct zfcp_san_dbf_record_ct_response { | |||
174 | u8 expl; | 172 | u8 expl; |
175 | u8 vendor_unique; | 173 | u8 vendor_unique; |
176 | u32 len; | 174 | u32 len; |
177 | u8 payload[ZFCP_DBF_CT_PAYLOAD]; | ||
178 | } __attribute__ ((packed)); | 175 | } __attribute__ ((packed)); |
179 | 176 | ||
180 | struct zfcp_san_dbf_record_els { | 177 | struct zfcp_san_dbf_record_els { |
181 | u8 ls_code; | 178 | u8 ls_code; |
182 | u32 len; | 179 | u32 len; |
183 | #define ZFCP_DBF_ELS_PAYLOAD 32 | ||
184 | #define ZFCP_DBF_ELS_MAX_PAYLOAD 1024 | ||
185 | u8 payload[ZFCP_DBF_ELS_PAYLOAD]; | ||
186 | } __attribute__ ((packed)); | 180 | } __attribute__ ((packed)); |
187 | 181 | ||
188 | struct zfcp_san_dbf_record { | 182 | struct zfcp_san_dbf_record { |
@@ -196,6 +190,8 @@ struct zfcp_san_dbf_record { | |||
196 | struct zfcp_san_dbf_record_ct_response ct_resp; | 190 | struct zfcp_san_dbf_record_ct_response ct_resp; |
197 | struct zfcp_san_dbf_record_els els; | 191 | struct zfcp_san_dbf_record_els els; |
198 | } u; | 192 | } u; |
193 | #define ZFCP_DBF_SAN_MAX_PAYLOAD 1024 | ||
194 | u8 payload[32]; | ||
199 | } __attribute__ ((packed)); | 195 | } __attribute__ ((packed)); |
200 | 196 | ||
201 | struct zfcp_scsi_dbf_record { | 197 | struct zfcp_scsi_dbf_record { |
diff --git a/drivers/s390/scsi/zfcp_erp.c b/drivers/s390/scsi/zfcp_erp.c index 9040f738ff33..35364f64da7f 100644 --- a/drivers/s390/scsi/zfcp_erp.c +++ b/drivers/s390/scsi/zfcp_erp.c | |||
@@ -472,6 +472,7 @@ static void zfcp_erp_strategy_check_fsfreq(struct zfcp_erp_action *act) | |||
472 | ZFCP_STATUS_ERP_TIMEDOUT)) { | 472 | ZFCP_STATUS_ERP_TIMEDOUT)) { |
473 | act->fsf_req->status |= ZFCP_STATUS_FSFREQ_DISMISSED; | 473 | act->fsf_req->status |= ZFCP_STATUS_FSFREQ_DISMISSED; |
474 | zfcp_rec_dbf_event_action(142, act); | 474 | zfcp_rec_dbf_event_action(142, act); |
475 | act->fsf_req->erp_action = NULL; | ||
475 | } | 476 | } |
476 | if (act->status & ZFCP_STATUS_ERP_TIMEDOUT) | 477 | if (act->status & ZFCP_STATUS_ERP_TIMEDOUT) |
477 | zfcp_rec_dbf_event_action(143, act); | 478 | zfcp_rec_dbf_event_action(143, act); |
diff --git a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c index 5ae1d497e5ed..d024442ee128 100644 --- a/drivers/s390/scsi/zfcp_fsf.c +++ b/drivers/s390/scsi/zfcp_fsf.c | |||
@@ -683,6 +683,7 @@ static struct zfcp_fsf_req *zfcp_fsf_alloc_noqtcb(mempool_t *pool) | |||
683 | if (!req) | 683 | if (!req) |
684 | return NULL; | 684 | return NULL; |
685 | memset(req, 0, sizeof(*req)); | 685 | memset(req, 0, sizeof(*req)); |
686 | req->pool = pool; | ||
686 | return req; | 687 | return req; |
687 | } | 688 | } |
688 | 689 | ||
@@ -769,28 +770,24 @@ static struct zfcp_fsf_req *zfcp_fsf_req_create(struct zfcp_adapter *adapter, | |||
769 | static int zfcp_fsf_req_send(struct zfcp_fsf_req *req) | 770 | static int zfcp_fsf_req_send(struct zfcp_fsf_req *req) |
770 | { | 771 | { |
771 | struct zfcp_adapter *adapter = req->adapter; | 772 | struct zfcp_adapter *adapter = req->adapter; |
772 | struct zfcp_qdio_queue *req_q = &adapter->req_q; | 773 | unsigned long flags; |
773 | int idx; | 774 | int idx; |
774 | 775 | ||
775 | /* put allocated FSF request into hash table */ | 776 | /* put allocated FSF request into hash table */ |
776 | spin_lock(&adapter->req_list_lock); | 777 | spin_lock_irqsave(&adapter->req_list_lock, flags); |
777 | idx = zfcp_reqlist_hash(req->req_id); | 778 | idx = zfcp_reqlist_hash(req->req_id); |
778 | list_add_tail(&req->list, &adapter->req_list[idx]); | 779 | list_add_tail(&req->list, &adapter->req_list[idx]); |
779 | spin_unlock(&adapter->req_list_lock); | 780 | spin_unlock_irqrestore(&adapter->req_list_lock, flags); |
780 | 781 | ||
781 | req->qdio_outb_usage = atomic_read(&req_q->count); | 782 | req->qdio_outb_usage = atomic_read(&adapter->req_q.count); |
782 | req->issued = get_clock(); | 783 | req->issued = get_clock(); |
783 | if (zfcp_qdio_send(req)) { | 784 | if (zfcp_qdio_send(req)) { |
784 | /* Queues are down..... */ | ||
785 | del_timer(&req->timer); | 785 | del_timer(&req->timer); |
786 | spin_lock(&adapter->req_list_lock); | 786 | spin_lock_irqsave(&adapter->req_list_lock, flags); |
787 | zfcp_reqlist_remove(adapter, req); | 787 | /* lookup request again, list might have changed */ |
788 | spin_unlock(&adapter->req_list_lock); | 788 | if (zfcp_reqlist_find_safe(adapter, req)) |
789 | /* undo changes in request queue made for this request */ | 789 | zfcp_reqlist_remove(adapter, req); |
790 | atomic_add(req->sbal_number, &req_q->count); | 790 | spin_unlock_irqrestore(&adapter->req_list_lock, flags); |
791 | req_q->first -= req->sbal_number; | ||
792 | req_q->first += QDIO_MAX_BUFFERS_PER_Q; | ||
793 | req_q->first %= QDIO_MAX_BUFFERS_PER_Q; /* wrap */ | ||
794 | zfcp_erp_adapter_reopen(adapter, 0, 116, req); | 791 | zfcp_erp_adapter_reopen(adapter, 0, 116, req); |
795 | return -EIO; | 792 | return -EIO; |
796 | } | 793 | } |
diff --git a/drivers/s390/scsi/zfcp_scsi.c b/drivers/s390/scsi/zfcp_scsi.c index ca8f85f3dad4..e46fd3e9f68f 100644 --- a/drivers/s390/scsi/zfcp_scsi.c +++ b/drivers/s390/scsi/zfcp_scsi.c | |||
@@ -24,14 +24,10 @@ char *zfcp_get_fcp_sns_info_ptr(struct fcp_rsp_iu *fcp_rsp_iu) | |||
24 | static void zfcp_scsi_slave_destroy(struct scsi_device *sdpnt) | 24 | static void zfcp_scsi_slave_destroy(struct scsi_device *sdpnt) |
25 | { | 25 | { |
26 | struct zfcp_unit *unit = (struct zfcp_unit *) sdpnt->hostdata; | 26 | struct zfcp_unit *unit = (struct zfcp_unit *) sdpnt->hostdata; |
27 | WARN_ON(!unit); | 27 | atomic_clear_mask(ZFCP_STATUS_UNIT_REGISTERED, &unit->status); |
28 | if (unit) { | 28 | unit->device = NULL; |
29 | atomic_clear_mask(ZFCP_STATUS_UNIT_REGISTERED, &unit->status); | 29 | zfcp_erp_unit_failed(unit, 12, NULL); |
30 | sdpnt->hostdata = NULL; | 30 | zfcp_unit_put(unit); |
31 | unit->device = NULL; | ||
32 | zfcp_erp_unit_failed(unit, 12, NULL); | ||
33 | zfcp_unit_put(unit); | ||
34 | } | ||
35 | } | 31 | } |
36 | 32 | ||
37 | static int zfcp_scsi_slave_configure(struct scsi_device *sdp) | 33 | static int zfcp_scsi_slave_configure(struct scsi_device *sdp) |
diff --git a/drivers/scsi/advansys.c b/drivers/scsi/advansys.c index 218777bfc143..399fe559e4de 100644 --- a/drivers/scsi/advansys.c +++ b/drivers/scsi/advansys.c | |||
@@ -13872,8 +13872,10 @@ static int __devinit advansys_board_found(struct Scsi_Host *shost, | |||
13872 | advansys_wide_free_mem(boardp); | 13872 | advansys_wide_free_mem(boardp); |
13873 | free_irq(boardp->irq, shost); | 13873 | free_irq(boardp->irq, shost); |
13874 | err_free_dma: | 13874 | err_free_dma: |
13875 | #ifdef CONFIG_ISA | ||
13875 | if (shost->dma_channel != NO_ISA_DMA) | 13876 | if (shost->dma_channel != NO_ISA_DMA) |
13876 | free_dma(shost->dma_channel); | 13877 | free_dma(shost->dma_channel); |
13878 | #endif | ||
13877 | err_free_proc: | 13879 | err_free_proc: |
13878 | kfree(boardp->prtbuf); | 13880 | kfree(boardp->prtbuf); |
13879 | err_unmap: | 13881 | err_unmap: |
@@ -13894,10 +13896,12 @@ static int advansys_release(struct Scsi_Host *shost) | |||
13894 | ASC_DBG(1, "begin\n"); | 13896 | ASC_DBG(1, "begin\n"); |
13895 | scsi_remove_host(shost); | 13897 | scsi_remove_host(shost); |
13896 | free_irq(board->irq, shost); | 13898 | free_irq(board->irq, shost); |
13899 | #ifdef CONFIG_ISA | ||
13897 | if (shost->dma_channel != NO_ISA_DMA) { | 13900 | if (shost->dma_channel != NO_ISA_DMA) { |
13898 | ASC_DBG(1, "free_dma()\n"); | 13901 | ASC_DBG(1, "free_dma()\n"); |
13899 | free_dma(shost->dma_channel); | 13902 | free_dma(shost->dma_channel); |
13900 | } | 13903 | } |
13904 | #endif | ||
13901 | if (ASC_NARROW_BOARD(board)) { | 13905 | if (ASC_NARROW_BOARD(board)) { |
13902 | dma_unmap_single(board->dev, | 13906 | dma_unmap_single(board->dev, |
13903 | board->dvc_var.asc_dvc_var.overrun_dma, | 13907 | board->dvc_var.asc_dvc_var.overrun_dma, |
diff --git a/drivers/scsi/dpt_i2o.c b/drivers/scsi/dpt_i2o.c index 8aba4fdfb522..6194ed5d02c4 100644 --- a/drivers/scsi/dpt_i2o.c +++ b/drivers/scsi/dpt_i2o.c | |||
@@ -2445,7 +2445,7 @@ static s32 adpt_i2o_to_scsi(void __iomem *reply, struct scsi_cmnd* cmd) | |||
2445 | hba_status = detailed_status >> 8; | 2445 | hba_status = detailed_status >> 8; |
2446 | 2446 | ||
2447 | // calculate resid for sg | 2447 | // calculate resid for sg |
2448 | scsi_set_resid(cmd, scsi_bufflen(cmd) - readl(reply+5)); | 2448 | scsi_set_resid(cmd, scsi_bufflen(cmd) - readl(reply+20)); |
2449 | 2449 | ||
2450 | pHba = (adpt_hba*) cmd->device->host->hostdata[0]; | 2450 | pHba = (adpt_hba*) cmd->device->host->hostdata[0]; |
2451 | 2451 | ||
@@ -2456,7 +2456,7 @@ static s32 adpt_i2o_to_scsi(void __iomem *reply, struct scsi_cmnd* cmd) | |||
2456 | case I2O_SCSI_DSC_SUCCESS: | 2456 | case I2O_SCSI_DSC_SUCCESS: |
2457 | cmd->result = (DID_OK << 16); | 2457 | cmd->result = (DID_OK << 16); |
2458 | // handle underflow | 2458 | // handle underflow |
2459 | if(readl(reply+5) < cmd->underflow ) { | 2459 | if (readl(reply+20) < cmd->underflow) { |
2460 | cmd->result = (DID_ERROR <<16); | 2460 | cmd->result = (DID_ERROR <<16); |
2461 | printk(KERN_WARNING"%s: SCSI CMD underflow\n",pHba->name); | 2461 | printk(KERN_WARNING"%s: SCSI CMD underflow\n",pHba->name); |
2462 | } | 2462 | } |
diff --git a/drivers/scsi/gdth.c b/drivers/scsi/gdth.c index c387c15a2128..fb247fdfa2bd 100644 --- a/drivers/scsi/gdth.c +++ b/drivers/scsi/gdth.c | |||
@@ -588,7 +588,7 @@ static struct pci_driver gdth_pci_driver = { | |||
588 | .remove = gdth_pci_remove_one, | 588 | .remove = gdth_pci_remove_one, |
589 | }; | 589 | }; |
590 | 590 | ||
591 | static void gdth_pci_remove_one(struct pci_dev *pdev) | 591 | static void __devexit gdth_pci_remove_one(struct pci_dev *pdev) |
592 | { | 592 | { |
593 | gdth_ha_str *ha = pci_get_drvdata(pdev); | 593 | gdth_ha_str *ha = pci_get_drvdata(pdev); |
594 | 594 | ||
@@ -600,7 +600,7 @@ static void gdth_pci_remove_one(struct pci_dev *pdev) | |||
600 | pci_disable_device(pdev); | 600 | pci_disable_device(pdev); |
601 | } | 601 | } |
602 | 602 | ||
603 | static int gdth_pci_init_one(struct pci_dev *pdev, | 603 | static int __devinit gdth_pci_init_one(struct pci_dev *pdev, |
604 | const struct pci_device_id *ent) | 604 | const struct pci_device_id *ent) |
605 | { | 605 | { |
606 | ushort vendor = pdev->vendor; | 606 | ushort vendor = pdev->vendor; |
@@ -853,7 +853,7 @@ static int __init gdth_init_isa(ulong32 bios_adr,gdth_ha_str *ha) | |||
853 | #endif /* CONFIG_ISA */ | 853 | #endif /* CONFIG_ISA */ |
854 | 854 | ||
855 | #ifdef CONFIG_PCI | 855 | #ifdef CONFIG_PCI |
856 | static int gdth_init_pci(struct pci_dev *pdev, gdth_pci_str *pcistr, | 856 | static int __devinit gdth_init_pci(struct pci_dev *pdev, gdth_pci_str *pcistr, |
857 | gdth_ha_str *ha) | 857 | gdth_ha_str *ha) |
858 | { | 858 | { |
859 | register gdt6_dpram_str __iomem *dp6_ptr; | 859 | register gdt6_dpram_str __iomem *dp6_ptr; |
@@ -1237,7 +1237,7 @@ static int gdth_init_pci(struct pci_dev *pdev, gdth_pci_str *pcistr, | |||
1237 | 1237 | ||
1238 | /* controller protocol functions */ | 1238 | /* controller protocol functions */ |
1239 | 1239 | ||
1240 | static void __init gdth_enable_int(gdth_ha_str *ha) | 1240 | static void __devinit gdth_enable_int(gdth_ha_str *ha) |
1241 | { | 1241 | { |
1242 | ulong flags; | 1242 | ulong flags; |
1243 | gdt2_dpram_str __iomem *dp2_ptr; | 1243 | gdt2_dpram_str __iomem *dp2_ptr; |
@@ -1553,7 +1553,7 @@ static int gdth_internal_cmd(gdth_ha_str *ha, unchar service, ushort opcode, | |||
1553 | 1553 | ||
1554 | /* search for devices */ | 1554 | /* search for devices */ |
1555 | 1555 | ||
1556 | static int __init gdth_search_drives(gdth_ha_str *ha) | 1556 | static int __devinit gdth_search_drives(gdth_ha_str *ha) |
1557 | { | 1557 | { |
1558 | ushort cdev_cnt, i; | 1558 | ushort cdev_cnt, i; |
1559 | int ok; | 1559 | int ok; |
@@ -4935,7 +4935,7 @@ static int __init gdth_eisa_probe_one(ushort eisa_slot) | |||
4935 | #endif /* CONFIG_EISA */ | 4935 | #endif /* CONFIG_EISA */ |
4936 | 4936 | ||
4937 | #ifdef CONFIG_PCI | 4937 | #ifdef CONFIG_PCI |
4938 | static int gdth_pci_probe_one(gdth_pci_str *pcistr, | 4938 | static int __devinit gdth_pci_probe_one(gdth_pci_str *pcistr, |
4939 | gdth_ha_str **ha_out) | 4939 | gdth_ha_str **ha_out) |
4940 | { | 4940 | { |
4941 | struct Scsi_Host *shp; | 4941 | struct Scsi_Host *shp; |
diff --git a/drivers/scsi/megaraid.c b/drivers/scsi/megaraid.c index 28c9da7d4a5c..7dc62deb4087 100644 --- a/drivers/scsi/megaraid.c +++ b/drivers/scsi/megaraid.c | |||
@@ -4402,6 +4402,10 @@ mega_internal_command(adapter_t *adapter, megacmd_t *mc, mega_passthru *pthru) | |||
4402 | scb_t *scb; | 4402 | scb_t *scb; |
4403 | int rval; | 4403 | int rval; |
4404 | 4404 | ||
4405 | scmd = scsi_allocate_command(GFP_KERNEL); | ||
4406 | if (!scmd) | ||
4407 | return -ENOMEM; | ||
4408 | |||
4405 | /* | 4409 | /* |
4406 | * The internal commands share one command id and hence are | 4410 | * The internal commands share one command id and hence are |
4407 | * serialized. This is so because we want to reserve maximum number of | 4411 | * serialized. This is so because we want to reserve maximum number of |
@@ -4412,12 +4416,11 @@ mega_internal_command(adapter_t *adapter, megacmd_t *mc, mega_passthru *pthru) | |||
4412 | scb = &adapter->int_scb; | 4416 | scb = &adapter->int_scb; |
4413 | memset(scb, 0, sizeof(scb_t)); | 4417 | memset(scb, 0, sizeof(scb_t)); |
4414 | 4418 | ||
4415 | scmd = &adapter->int_scmd; | ||
4416 | memset(scmd, 0, sizeof(Scsi_Cmnd)); | ||
4417 | |||
4418 | sdev = kzalloc(sizeof(struct scsi_device), GFP_KERNEL); | 4419 | sdev = kzalloc(sizeof(struct scsi_device), GFP_KERNEL); |
4419 | scmd->device = sdev; | 4420 | scmd->device = sdev; |
4420 | 4421 | ||
4422 | memset(adapter->int_cdb, 0, sizeof(adapter->int_cdb)); | ||
4423 | scmd->cmnd = adapter->int_cdb; | ||
4421 | scmd->device->host = adapter->host; | 4424 | scmd->device->host = adapter->host; |
4422 | scmd->host_scribble = (void *)scb; | 4425 | scmd->host_scribble = (void *)scb; |
4423 | scmd->cmnd[0] = MEGA_INTERNAL_CMD; | 4426 | scmd->cmnd[0] = MEGA_INTERNAL_CMD; |
@@ -4456,6 +4459,8 @@ mega_internal_command(adapter_t *adapter, megacmd_t *mc, mega_passthru *pthru) | |||
4456 | 4459 | ||
4457 | mutex_unlock(&adapter->int_mtx); | 4460 | mutex_unlock(&adapter->int_mtx); |
4458 | 4461 | ||
4462 | scsi_free_command(GFP_KERNEL, scmd); | ||
4463 | |||
4459 | return rval; | 4464 | return rval; |
4460 | } | 4465 | } |
4461 | 4466 | ||
diff --git a/drivers/scsi/megaraid.h b/drivers/scsi/megaraid.h index ee70bd4ae4ba..795201fa0b48 100644 --- a/drivers/scsi/megaraid.h +++ b/drivers/scsi/megaraid.h | |||
@@ -888,8 +888,8 @@ typedef struct { | |||
888 | 888 | ||
889 | u8 sglen; /* f/w supported scatter-gather list length */ | 889 | u8 sglen; /* f/w supported scatter-gather list length */ |
890 | 890 | ||
891 | unsigned char int_cdb[MAX_COMMAND_SIZE]; | ||
891 | scb_t int_scb; | 892 | scb_t int_scb; |
892 | Scsi_Cmnd int_scmd; | ||
893 | struct mutex int_mtx; /* To synchronize the internal | 893 | struct mutex int_mtx; /* To synchronize the internal |
894 | commands */ | 894 | commands */ |
895 | struct completion int_waitq; /* wait queue for internal | 895 | struct completion int_waitq; /* wait queue for internal |
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h index f25f41a499e5..b97194096d8e 100644 --- a/drivers/scsi/qla2xxx/qla_def.h +++ b/drivers/scsi/qla2xxx/qla_def.h | |||
@@ -2547,7 +2547,6 @@ typedef struct scsi_qla_host { | |||
2547 | uint8_t fcode_revision[16]; | 2547 | uint8_t fcode_revision[16]; |
2548 | uint32_t fw_revision[4]; | 2548 | uint32_t fw_revision[4]; |
2549 | 2549 | ||
2550 | uint16_t fdt_odd_index; | ||
2551 | uint32_t fdt_wrt_disable; | 2550 | uint32_t fdt_wrt_disable; |
2552 | uint32_t fdt_erase_cmd; | 2551 | uint32_t fdt_erase_cmd; |
2553 | uint32_t fdt_block_size; | 2552 | uint32_t fdt_block_size; |
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index a470f2d3270d..4218f20f5ed5 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c | |||
@@ -140,7 +140,6 @@ int | |||
140 | qla2100_pci_config(scsi_qla_host_t *ha) | 140 | qla2100_pci_config(scsi_qla_host_t *ha) |
141 | { | 141 | { |
142 | uint16_t w; | 142 | uint16_t w; |
143 | uint32_t d; | ||
144 | unsigned long flags; | 143 | unsigned long flags; |
145 | struct device_reg_2xxx __iomem *reg = &ha->iobase->isp; | 144 | struct device_reg_2xxx __iomem *reg = &ha->iobase->isp; |
146 | 145 | ||
@@ -151,10 +150,7 @@ qla2100_pci_config(scsi_qla_host_t *ha) | |||
151 | w |= (PCI_COMMAND_PARITY | PCI_COMMAND_SERR); | 150 | w |= (PCI_COMMAND_PARITY | PCI_COMMAND_SERR); |
152 | pci_write_config_word(ha->pdev, PCI_COMMAND, w); | 151 | pci_write_config_word(ha->pdev, PCI_COMMAND, w); |
153 | 152 | ||
154 | /* Reset expansion ROM address decode enable */ | 153 | pci_disable_rom(ha->pdev); |
155 | pci_read_config_dword(ha->pdev, PCI_ROM_ADDRESS, &d); | ||
156 | d &= ~PCI_ROM_ADDRESS_ENABLE; | ||
157 | pci_write_config_dword(ha->pdev, PCI_ROM_ADDRESS, d); | ||
158 | 154 | ||
159 | /* Get PCI bus information. */ | 155 | /* Get PCI bus information. */ |
160 | spin_lock_irqsave(&ha->hardware_lock, flags); | 156 | spin_lock_irqsave(&ha->hardware_lock, flags); |
@@ -174,7 +170,6 @@ int | |||
174 | qla2300_pci_config(scsi_qla_host_t *ha) | 170 | qla2300_pci_config(scsi_qla_host_t *ha) |
175 | { | 171 | { |
176 | uint16_t w; | 172 | uint16_t w; |
177 | uint32_t d; | ||
178 | unsigned long flags = 0; | 173 | unsigned long flags = 0; |
179 | uint32_t cnt; | 174 | uint32_t cnt; |
180 | struct device_reg_2xxx __iomem *reg = &ha->iobase->isp; | 175 | struct device_reg_2xxx __iomem *reg = &ha->iobase->isp; |
@@ -236,10 +231,7 @@ qla2300_pci_config(scsi_qla_host_t *ha) | |||
236 | 231 | ||
237 | pci_write_config_byte(ha->pdev, PCI_LATENCY_TIMER, 0x80); | 232 | pci_write_config_byte(ha->pdev, PCI_LATENCY_TIMER, 0x80); |
238 | 233 | ||
239 | /* Reset expansion ROM address decode enable */ | 234 | pci_disable_rom(ha->pdev); |
240 | pci_read_config_dword(ha->pdev, PCI_ROM_ADDRESS, &d); | ||
241 | d &= ~PCI_ROM_ADDRESS_ENABLE; | ||
242 | pci_write_config_dword(ha->pdev, PCI_ROM_ADDRESS, d); | ||
243 | 235 | ||
244 | /* Get PCI bus information. */ | 236 | /* Get PCI bus information. */ |
245 | spin_lock_irqsave(&ha->hardware_lock, flags); | 237 | spin_lock_irqsave(&ha->hardware_lock, flags); |
@@ -259,7 +251,6 @@ int | |||
259 | qla24xx_pci_config(scsi_qla_host_t *ha) | 251 | qla24xx_pci_config(scsi_qla_host_t *ha) |
260 | { | 252 | { |
261 | uint16_t w; | 253 | uint16_t w; |
262 | uint32_t d; | ||
263 | unsigned long flags = 0; | 254 | unsigned long flags = 0; |
264 | struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; | 255 | struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; |
265 | 256 | ||
@@ -281,10 +272,7 @@ qla24xx_pci_config(scsi_qla_host_t *ha) | |||
281 | if (pci_find_capability(ha->pdev, PCI_CAP_ID_EXP)) | 272 | if (pci_find_capability(ha->pdev, PCI_CAP_ID_EXP)) |
282 | pcie_set_readrq(ha->pdev, 2048); | 273 | pcie_set_readrq(ha->pdev, 2048); |
283 | 274 | ||
284 | /* Reset expansion ROM address decode enable */ | 275 | pci_disable_rom(ha->pdev); |
285 | pci_read_config_dword(ha->pdev, PCI_ROM_ADDRESS, &d); | ||
286 | d &= ~PCI_ROM_ADDRESS_ENABLE; | ||
287 | pci_write_config_dword(ha->pdev, PCI_ROM_ADDRESS, d); | ||
288 | 276 | ||
289 | ha->chip_revision = ha->pdev->revision; | 277 | ha->chip_revision = ha->pdev->revision; |
290 | 278 | ||
@@ -306,7 +294,6 @@ int | |||
306 | qla25xx_pci_config(scsi_qla_host_t *ha) | 294 | qla25xx_pci_config(scsi_qla_host_t *ha) |
307 | { | 295 | { |
308 | uint16_t w; | 296 | uint16_t w; |
309 | uint32_t d; | ||
310 | 297 | ||
311 | pci_set_master(ha->pdev); | 298 | pci_set_master(ha->pdev); |
312 | pci_try_set_mwi(ha->pdev); | 299 | pci_try_set_mwi(ha->pdev); |
@@ -320,10 +307,7 @@ qla25xx_pci_config(scsi_qla_host_t *ha) | |||
320 | if (pci_find_capability(ha->pdev, PCI_CAP_ID_EXP)) | 307 | if (pci_find_capability(ha->pdev, PCI_CAP_ID_EXP)) |
321 | pcie_set_readrq(ha->pdev, 2048); | 308 | pcie_set_readrq(ha->pdev, 2048); |
322 | 309 | ||
323 | /* Reset expansion ROM address decode enable */ | 310 | pci_disable_rom(ha->pdev); |
324 | pci_read_config_dword(ha->pdev, PCI_ROM_ADDRESS, &d); | ||
325 | d &= ~PCI_ROM_ADDRESS_ENABLE; | ||
326 | pci_write_config_dword(ha->pdev, PCI_ROM_ADDRESS, d); | ||
327 | 311 | ||
328 | ha->chip_revision = ha->pdev->revision; | 312 | ha->chip_revision = ha->pdev->revision; |
329 | 313 | ||
@@ -980,7 +964,6 @@ qla2x00_setup_chip(scsi_qla_host_t *ha) | |||
980 | &ha->fw_minor_version, | 964 | &ha->fw_minor_version, |
981 | &ha->fw_subminor_version, | 965 | &ha->fw_subminor_version, |
982 | &ha->fw_attributes, &ha->fw_memory_size); | 966 | &ha->fw_attributes, &ha->fw_memory_size); |
983 | qla2x00_resize_request_q(ha); | ||
984 | ha->flags.npiv_supported = 0; | 967 | ha->flags.npiv_supported = 0; |
985 | if ((IS_QLA24XX(ha) || IS_QLA25XX(ha) || | 968 | if ((IS_QLA24XX(ha) || IS_QLA25XX(ha) || |
986 | IS_QLA84XX(ha)) && | 969 | IS_QLA84XX(ha)) && |
@@ -992,6 +975,7 @@ qla2x00_setup_chip(scsi_qla_host_t *ha) | |||
992 | ha->max_npiv_vports = | 975 | ha->max_npiv_vports = |
993 | MIN_MULTI_ID_FABRIC - 1; | 976 | MIN_MULTI_ID_FABRIC - 1; |
994 | } | 977 | } |
978 | qla2x00_resize_request_q(ha); | ||
995 | 979 | ||
996 | if (ql2xallocfwdump) | 980 | if (ql2xallocfwdump) |
997 | qla2x00_alloc_fw_dump(ha); | 981 | qla2x00_alloc_fw_dump(ha); |
diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c index 36bc6851e23d..3402746ec128 100644 --- a/drivers/scsi/qla2xxx/qla_mbx.c +++ b/drivers/scsi/qla2xxx/qla_mbx.c | |||
@@ -1964,7 +1964,7 @@ qla2x00_get_resource_cnts(scsi_qla_host_t *ha, uint16_t *cur_xchg_cnt, | |||
1964 | *cur_iocb_cnt = mcp->mb[7]; | 1964 | *cur_iocb_cnt = mcp->mb[7]; |
1965 | if (orig_iocb_cnt) | 1965 | if (orig_iocb_cnt) |
1966 | *orig_iocb_cnt = mcp->mb[10]; | 1966 | *orig_iocb_cnt = mcp->mb[10]; |
1967 | if (max_npiv_vports) | 1967 | if (ha->flags.npiv_supported && max_npiv_vports) |
1968 | *max_npiv_vports = mcp->mb[11]; | 1968 | *max_npiv_vports = mcp->mb[11]; |
1969 | } | 1969 | } |
1970 | 1970 | ||
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index 21dd182ad512..35567203ef61 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c | |||
@@ -728,6 +728,7 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd) | |||
728 | if (ha->isp_ops->abort_command(ha, sp)) { | 728 | if (ha->isp_ops->abort_command(ha, sp)) { |
729 | DEBUG2(printk("%s(%ld): abort_command " | 729 | DEBUG2(printk("%s(%ld): abort_command " |
730 | "mbx failed.\n", __func__, ha->host_no)); | 730 | "mbx failed.\n", __func__, ha->host_no)); |
731 | ret = FAILED; | ||
731 | } else { | 732 | } else { |
732 | DEBUG3(printk("%s(%ld): abort_command " | 733 | DEBUG3(printk("%s(%ld): abort_command " |
733 | "mbx success.\n", __func__, ha->host_no)); | 734 | "mbx success.\n", __func__, ha->host_no)); |
diff --git a/drivers/scsi/qla2xxx/qla_sup.c b/drivers/scsi/qla2xxx/qla_sup.c index 90a13211717f..e4af678eb2d6 100644 --- a/drivers/scsi/qla2xxx/qla_sup.c +++ b/drivers/scsi/qla2xxx/qla_sup.c | |||
@@ -722,6 +722,7 @@ done: | |||
722 | static void | 722 | static void |
723 | qla2xxx_get_fdt_info(scsi_qla_host_t *ha) | 723 | qla2xxx_get_fdt_info(scsi_qla_host_t *ha) |
724 | { | 724 | { |
725 | #define FLASH_BLK_SIZE_4K 0x1000 | ||
725 | #define FLASH_BLK_SIZE_32K 0x8000 | 726 | #define FLASH_BLK_SIZE_32K 0x8000 |
726 | #define FLASH_BLK_SIZE_64K 0x10000 | 727 | #define FLASH_BLK_SIZE_64K 0x10000 |
727 | const char *loc, *locations[] = { "MID", "FDT" }; | 728 | const char *loc, *locations[] = { "MID", "FDT" }; |
@@ -755,7 +756,6 @@ qla2xxx_get_fdt_info(scsi_qla_host_t *ha) | |||
755 | loc = locations[1]; | 756 | loc = locations[1]; |
756 | mid = le16_to_cpu(fdt->man_id); | 757 | mid = le16_to_cpu(fdt->man_id); |
757 | fid = le16_to_cpu(fdt->id); | 758 | fid = le16_to_cpu(fdt->id); |
758 | ha->fdt_odd_index = mid == 0x1f; | ||
759 | ha->fdt_wrt_disable = fdt->wrt_disable_bits; | 759 | ha->fdt_wrt_disable = fdt->wrt_disable_bits; |
760 | ha->fdt_erase_cmd = flash_conf_to_access_addr(0x0300 | fdt->erase_cmd); | 760 | ha->fdt_erase_cmd = flash_conf_to_access_addr(0x0300 | fdt->erase_cmd); |
761 | ha->fdt_block_size = le32_to_cpu(fdt->block_size); | 761 | ha->fdt_block_size = le32_to_cpu(fdt->block_size); |
@@ -788,8 +788,7 @@ no_flash_data: | |||
788 | ha->fdt_block_size = FLASH_BLK_SIZE_64K; | 788 | ha->fdt_block_size = FLASH_BLK_SIZE_64K; |
789 | break; | 789 | break; |
790 | case 0x1f: /* Atmel 26DF081A. */ | 790 | case 0x1f: /* Atmel 26DF081A. */ |
791 | ha->fdt_odd_index = 1; | 791 | ha->fdt_block_size = FLASH_BLK_SIZE_4K; |
792 | ha->fdt_block_size = FLASH_BLK_SIZE_64K; | ||
793 | ha->fdt_erase_cmd = flash_conf_to_access_addr(0x0320); | 792 | ha->fdt_erase_cmd = flash_conf_to_access_addr(0x0320); |
794 | ha->fdt_unprotect_sec_cmd = flash_conf_to_access_addr(0x0339); | 793 | ha->fdt_unprotect_sec_cmd = flash_conf_to_access_addr(0x0339); |
795 | ha->fdt_protect_sec_cmd = flash_conf_to_access_addr(0x0336); | 794 | ha->fdt_protect_sec_cmd = flash_conf_to_access_addr(0x0336); |
@@ -801,9 +800,9 @@ no_flash_data: | |||
801 | } | 800 | } |
802 | done: | 801 | done: |
803 | DEBUG2(qla_printk(KERN_DEBUG, ha, "FDT[%s]: (0x%x/0x%x) erase=0x%x " | 802 | DEBUG2(qla_printk(KERN_DEBUG, ha, "FDT[%s]: (0x%x/0x%x) erase=0x%x " |
804 | "pro=%x upro=%x idx=%d wrtd=0x%x blk=0x%x.\n", loc, mid, fid, | 803 | "pro=%x upro=%x wrtd=0x%x blk=0x%x.\n", loc, mid, fid, |
805 | ha->fdt_erase_cmd, ha->fdt_protect_sec_cmd, | 804 | ha->fdt_erase_cmd, ha->fdt_protect_sec_cmd, |
806 | ha->fdt_unprotect_sec_cmd, ha->fdt_odd_index, ha->fdt_wrt_disable, | 805 | ha->fdt_unprotect_sec_cmd, ha->fdt_wrt_disable, |
807 | ha->fdt_block_size)); | 806 | ha->fdt_block_size)); |
808 | } | 807 | } |
809 | 808 | ||
@@ -987,13 +986,9 @@ qla24xx_write_flash_data(scsi_qla_host_t *ha, uint32_t *dwptr, uint32_t faddr, | |||
987 | qla24xx_unprotect_flash(ha); | 986 | qla24xx_unprotect_flash(ha); |
988 | 987 | ||
989 | for (liter = 0; liter < dwords; liter++, faddr++, dwptr++) { | 988 | for (liter = 0; liter < dwords; liter++, faddr++, dwptr++) { |
990 | if (ha->fdt_odd_index) { | 989 | |
991 | findex = faddr << 2; | 990 | findex = faddr; |
992 | fdata = findex & sec_mask; | 991 | fdata = (findex & sec_mask) << 2; |
993 | } else { | ||
994 | findex = faddr; | ||
995 | fdata = (findex & sec_mask) << 2; | ||
996 | } | ||
997 | 992 | ||
998 | /* Are we at the beginning of a sector? */ | 993 | /* Are we at the beginning of a sector? */ |
999 | if ((findex & rest_addr) == 0) { | 994 | if ((findex & rest_addr) == 0) { |
diff --git a/drivers/scsi/qla2xxx/qla_version.h b/drivers/scsi/qla2xxx/qla_version.h index be5e299df528..eea6720adf16 100644 --- a/drivers/scsi/qla2xxx/qla_version.h +++ b/drivers/scsi/qla2xxx/qla_version.h | |||
@@ -7,7 +7,7 @@ | |||
7 | /* | 7 | /* |
8 | * Driver version | 8 | * Driver version |
9 | */ | 9 | */ |
10 | #define QLA2XXX_VERSION "8.02.01-k8" | 10 | #define QLA2XXX_VERSION "8.02.01-k9" |
11 | 11 | ||
12 | #define QLA_DRIVER_MAJOR_VER 8 | 12 | #define QLA_DRIVER_MAJOR_VER 8 |
13 | #define QLA_DRIVER_MINOR_VER 2 | 13 | #define QLA_DRIVER_MINOR_VER 2 |
diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c index 94ed262bdf0c..386361778ebb 100644 --- a/drivers/scsi/scsi_error.c +++ b/drivers/scsi/scsi_error.c | |||
@@ -1340,9 +1340,10 @@ int scsi_decide_disposition(struct scsi_cmnd *scmd) | |||
1340 | * LLD/transport was disrupted during processing of the IO. | 1340 | * LLD/transport was disrupted during processing of the IO. |
1341 | * The transport class is now blocked/blocking, | 1341 | * The transport class is now blocked/blocking, |
1342 | * and the transport will decide what to do with the IO | 1342 | * and the transport will decide what to do with the IO |
1343 | * based on its timers and recovery capablilities. | 1343 | * based on its timers and recovery capablilities if |
1344 | * there are enough retries. | ||
1344 | */ | 1345 | */ |
1345 | return ADD_TO_MLQUEUE; | 1346 | goto maybe_retry; |
1346 | case DID_TRANSPORT_FAILFAST: | 1347 | case DID_TRANSPORT_FAILFAST: |
1347 | /* | 1348 | /* |
1348 | * The transport decided to failfast the IO (most likely | 1349 | * The transport decided to failfast the IO (most likely |
diff --git a/drivers/serial/sh-sci.c b/drivers/serial/sh-sci.c index 5c0f32c7fbf6..165fc010978c 100644 --- a/drivers/serial/sh-sci.c +++ b/drivers/serial/sh-sci.c | |||
@@ -144,9 +144,9 @@ static void put_char(struct uart_port *port, char c) | |||
144 | status = sci_in(port, SCxSR); | 144 | status = sci_in(port, SCxSR); |
145 | } while (!(status & SCxSR_TDxE(port))); | 145 | } while (!(status & SCxSR_TDxE(port))); |
146 | 146 | ||
147 | sci_out(port, SCxTDR, c); | ||
148 | sci_in(port, SCxSR); /* Dummy read */ | 147 | sci_in(port, SCxSR); /* Dummy read */ |
149 | sci_out(port, SCxSR, SCxSR_TDxE_CLEAR(port)); | 148 | sci_out(port, SCxSR, SCxSR_TDxE_CLEAR(port)); |
149 | sci_out(port, SCxTDR, c); | ||
150 | 150 | ||
151 | spin_unlock_irqrestore(&port->lock, flags); | 151 | spin_unlock_irqrestore(&port->lock, flags); |
152 | } | 152 | } |
@@ -478,10 +478,10 @@ static void sci_transmit_chars(struct uart_port *port) | |||
478 | return; | 478 | return; |
479 | } | 479 | } |
480 | 480 | ||
481 | if (port->type == PORT_SCIF) | 481 | if (port->type == PORT_SCI) |
482 | count = scif_txroom(port); | ||
483 | else | ||
484 | count = sci_txroom(port); | 482 | count = sci_txroom(port); |
483 | else | ||
484 | count = scif_txroom(port); | ||
485 | 485 | ||
486 | do { | 486 | do { |
487 | unsigned char c; | 487 | unsigned char c; |
@@ -510,7 +510,7 @@ static void sci_transmit_chars(struct uart_port *port) | |||
510 | } else { | 510 | } else { |
511 | ctrl = sci_in(port, SCSCR); | 511 | ctrl = sci_in(port, SCSCR); |
512 | 512 | ||
513 | if (port->type == PORT_SCIF) { | 513 | if (port->type != PORT_SCI) { |
514 | sci_in(port, SCxSR); /* Dummy read */ | 514 | sci_in(port, SCxSR); /* Dummy read */ |
515 | sci_out(port, SCxSR, SCxSR_TDxE_CLEAR(port)); | 515 | sci_out(port, SCxSR, SCxSR_TDxE_CLEAR(port)); |
516 | } | 516 | } |
@@ -536,10 +536,10 @@ static inline void sci_receive_chars(struct uart_port *port) | |||
536 | return; | 536 | return; |
537 | 537 | ||
538 | while (1) { | 538 | while (1) { |
539 | if (port->type == PORT_SCIF) | 539 | if (port->type == PORT_SCI) |
540 | count = scif_rxroom(port); | ||
541 | else | ||
542 | count = sci_rxroom(port); | 540 | count = sci_rxroom(port); |
541 | else | ||
542 | count = scif_rxroom(port); | ||
543 | 543 | ||
544 | /* Don't copy more bytes than there is room for in the buffer */ | 544 | /* Don't copy more bytes than there is room for in the buffer */ |
545 | count = tty_buffer_request_room(tty, count); | 545 | count = tty_buffer_request_room(tty, count); |
@@ -714,7 +714,7 @@ static inline int sci_handle_breaks(struct uart_port *port) | |||
714 | 714 | ||
715 | #if defined(SCIF_ORER) | 715 | #if defined(SCIF_ORER) |
716 | /* XXX: Handle SCIF overrun error */ | 716 | /* XXX: Handle SCIF overrun error */ |
717 | if (port->type == PORT_SCIF && (sci_in(port, SCLSR) & SCIF_ORER) != 0) { | 717 | if (port->type != PORT_SCI && (sci_in(port, SCLSR) & SCIF_ORER) != 0) { |
718 | sci_out(port, SCLSR, 0); | 718 | sci_out(port, SCLSR, 0); |
719 | if (tty_insert_flip_char(tty, 0, TTY_OVERRUN)) { | 719 | if (tty_insert_flip_char(tty, 0, TTY_OVERRUN)) { |
720 | copied++; | 720 | copied++; |
@@ -1042,7 +1042,7 @@ static void sci_set_termios(struct uart_port *port, struct ktermios *termios, | |||
1042 | 1042 | ||
1043 | sci_out(port, SCSCR, 0x00); /* TE=0, RE=0, CKE1=0 */ | 1043 | sci_out(port, SCSCR, 0x00); /* TE=0, RE=0, CKE1=0 */ |
1044 | 1044 | ||
1045 | if (port->type == PORT_SCIF) | 1045 | if (port->type != PORT_SCI) |
1046 | sci_out(port, SCFCR, SCFCR_RFRST | SCFCR_TFRST); | 1046 | sci_out(port, SCFCR, SCFCR_RFRST | SCFCR_TFRST); |
1047 | 1047 | ||
1048 | smr_val = sci_in(port, SCSMR) & 3; | 1048 | smr_val = sci_in(port, SCSMR) & 3; |
@@ -1085,6 +1085,7 @@ static const char *sci_type(struct uart_port *port) | |||
1085 | case PORT_SCI: return "sci"; | 1085 | case PORT_SCI: return "sci"; |
1086 | case PORT_SCIF: return "scif"; | 1086 | case PORT_SCIF: return "scif"; |
1087 | case PORT_IRDA: return "irda"; | 1087 | case PORT_IRDA: return "irda"; |
1088 | case PORT_SCIFA: return "scifa"; | ||
1088 | } | 1089 | } |
1089 | 1090 | ||
1090 | return NULL; | 1091 | return NULL; |
@@ -1112,6 +1113,7 @@ static void sci_config_port(struct uart_port *port, int flags) | |||
1112 | s->init_pins = sci_init_pins_sci; | 1113 | s->init_pins = sci_init_pins_sci; |
1113 | break; | 1114 | break; |
1114 | case PORT_SCIF: | 1115 | case PORT_SCIF: |
1116 | case PORT_SCIFA: | ||
1115 | s->init_pins = sci_init_pins_scif; | 1117 | s->init_pins = sci_init_pins_scif; |
1116 | break; | 1118 | break; |
1117 | case PORT_IRDA: | 1119 | case PORT_IRDA: |
diff --git a/drivers/serial/sh-sci.h b/drivers/serial/sh-sci.h index 6163a45f968f..9f33b064172e 100644 --- a/drivers/serial/sh-sci.h +++ b/drivers/serial/sh-sci.h | |||
@@ -289,18 +289,18 @@ | |||
289 | #define CPU_SCIx_FNS(name, sci_offset, sci_size, scif_offset, scif_size)\ | 289 | #define CPU_SCIx_FNS(name, sci_offset, sci_size, scif_offset, scif_size)\ |
290 | static inline unsigned int sci_##name##_in(struct uart_port *port) \ | 290 | static inline unsigned int sci_##name##_in(struct uart_port *port) \ |
291 | { \ | 291 | { \ |
292 | if (port->type == PORT_SCI) { \ | 292 | if (port->type == PORT_SCIF) { \ |
293 | SCI_IN(sci_size, sci_offset) \ | 293 | SCI_IN(scif_size, scif_offset) \ |
294 | } else { \ | 294 | } else { /* PORT_SCI or PORT_SCIFA */ \ |
295 | SCI_IN(scif_size, scif_offset); \ | 295 | SCI_IN(sci_size, sci_offset); \ |
296 | } \ | 296 | } \ |
297 | } \ | 297 | } \ |
298 | static inline void sci_##name##_out(struct uart_port *port, unsigned int value) \ | 298 | static inline void sci_##name##_out(struct uart_port *port, unsigned int value) \ |
299 | { \ | 299 | { \ |
300 | if (port->type == PORT_SCI) { \ | 300 | if (port->type == PORT_SCIF) { \ |
301 | SCI_OUT(sci_size, sci_offset, value) \ | 301 | SCI_OUT(scif_size, scif_offset, value) \ |
302 | } else { \ | 302 | } else { /* PORT_SCI or PORT_SCIFA */ \ |
303 | SCI_OUT(scif_size, scif_offset, value); \ | 303 | SCI_OUT(sci_size, sci_offset, value); \ |
304 | } \ | 304 | } \ |
305 | } | 305 | } |
306 | 306 | ||
diff --git a/drivers/serial/uartlite.c b/drivers/serial/uartlite.c index 6a3f8fb0c9dd..3317148a4b93 100644 --- a/drivers/serial/uartlite.c +++ b/drivers/serial/uartlite.c | |||
@@ -286,8 +286,8 @@ static void ulite_release_port(struct uart_port *port) | |||
286 | 286 | ||
287 | static int ulite_request_port(struct uart_port *port) | 287 | static int ulite_request_port(struct uart_port *port) |
288 | { | 288 | { |
289 | pr_debug("ulite console: port=%p; port->mapbase=%x\n", | 289 | pr_debug("ulite console: port=%p; port->mapbase=%llx\n", |
290 | port, port->mapbase); | 290 | port, (unsigned long long) port->mapbase); |
291 | 291 | ||
292 | if (!request_mem_region(port->mapbase, ULITE_REGION, "uartlite")) { | 292 | if (!request_mem_region(port->mapbase, ULITE_REGION, "uartlite")) { |
293 | dev_err(port->dev, "Memory region busy\n"); | 293 | dev_err(port->dev, "Memory region busy\n"); |
diff --git a/drivers/spi/atmel_spi.c b/drivers/spi/atmel_spi.c index 02f9320f3efc..8abae4ad0fa5 100644 --- a/drivers/spi/atmel_spi.c +++ b/drivers/spi/atmel_spi.c | |||
@@ -766,6 +766,7 @@ static int __init atmel_spi_probe(struct platform_device *pdev) | |||
766 | /* Initialize the hardware */ | 766 | /* Initialize the hardware */ |
767 | clk_enable(clk); | 767 | clk_enable(clk); |
768 | spi_writel(as, CR, SPI_BIT(SWRST)); | 768 | spi_writel(as, CR, SPI_BIT(SWRST)); |
769 | spi_writel(as, CR, SPI_BIT(SWRST)); /* AT91SAM9263 Rev B workaround */ | ||
769 | spi_writel(as, MR, SPI_BIT(MSTR) | SPI_BIT(MODFDIS)); | 770 | spi_writel(as, MR, SPI_BIT(MSTR) | SPI_BIT(MODFDIS)); |
770 | spi_writel(as, PTCR, SPI_BIT(RXTDIS) | SPI_BIT(TXTDIS)); | 771 | spi_writel(as, PTCR, SPI_BIT(RXTDIS) | SPI_BIT(TXTDIS)); |
771 | spi_writel(as, CR, SPI_BIT(SPIEN)); | 772 | spi_writel(as, CR, SPI_BIT(SPIEN)); |
@@ -782,6 +783,7 @@ static int __init atmel_spi_probe(struct platform_device *pdev) | |||
782 | 783 | ||
783 | out_reset_hw: | 784 | out_reset_hw: |
784 | spi_writel(as, CR, SPI_BIT(SWRST)); | 785 | spi_writel(as, CR, SPI_BIT(SWRST)); |
786 | spi_writel(as, CR, SPI_BIT(SWRST)); /* AT91SAM9263 Rev B workaround */ | ||
785 | clk_disable(clk); | 787 | clk_disable(clk); |
786 | free_irq(irq, master); | 788 | free_irq(irq, master); |
787 | out_unmap_regs: | 789 | out_unmap_regs: |
@@ -805,6 +807,7 @@ static int __exit atmel_spi_remove(struct platform_device *pdev) | |||
805 | spin_lock_irq(&as->lock); | 807 | spin_lock_irq(&as->lock); |
806 | as->stopping = 1; | 808 | as->stopping = 1; |
807 | spi_writel(as, CR, SPI_BIT(SWRST)); | 809 | spi_writel(as, CR, SPI_BIT(SWRST)); |
810 | spi_writel(as, CR, SPI_BIT(SWRST)); /* AT91SAM9263 Rev B workaround */ | ||
808 | spi_readl(as, SR); | 811 | spi_readl(as, SR); |
809 | spin_unlock_irq(&as->lock); | 812 | spin_unlock_irq(&as->lock); |
810 | 813 | ||
diff --git a/drivers/spi/au1550_spi.c b/drivers/spi/au1550_spi.c index 87b73e0169c5..b02f25c702fd 100644 --- a/drivers/spi/au1550_spi.c +++ b/drivers/spi/au1550_spi.c | |||
@@ -369,10 +369,23 @@ static int au1550_spi_dma_txrxb(struct spi_device *spi, struct spi_transfer *t) | |||
369 | dma_rx_addr = t->rx_dma; | 369 | dma_rx_addr = t->rx_dma; |
370 | 370 | ||
371 | /* | 371 | /* |
372 | * check if buffers are already dma mapped, map them otherwise | 372 | * check if buffers are already dma mapped, map them otherwise: |
373 | * - first map the TX buffer, so cache data gets written to memory | ||
374 | * - then map the RX buffer, so that cache entries (with | ||
375 | * soon-to-be-stale data) get removed | ||
373 | * use rx buffer in place of tx if tx buffer was not provided | 376 | * use rx buffer in place of tx if tx buffer was not provided |
374 | * use temp rx buffer (preallocated or realloc to fit) for rx dma | 377 | * use temp rx buffer (preallocated or realloc to fit) for rx dma |
375 | */ | 378 | */ |
379 | if (t->tx_buf) { | ||
380 | if (t->tx_dma == 0) { /* if DMA_ADDR_INVALID, map it */ | ||
381 | dma_tx_addr = dma_map_single(hw->dev, | ||
382 | (void *)t->tx_buf, | ||
383 | t->len, DMA_TO_DEVICE); | ||
384 | if (dma_mapping_error(hw->dev, dma_tx_addr)) | ||
385 | dev_err(hw->dev, "tx dma map error\n"); | ||
386 | } | ||
387 | } | ||
388 | |||
376 | if (t->rx_buf) { | 389 | if (t->rx_buf) { |
377 | if (t->rx_dma == 0) { /* if DMA_ADDR_INVALID, map it */ | 390 | if (t->rx_dma == 0) { /* if DMA_ADDR_INVALID, map it */ |
378 | dma_rx_addr = dma_map_single(hw->dev, | 391 | dma_rx_addr = dma_map_single(hw->dev, |
@@ -396,15 +409,8 @@ static int au1550_spi_dma_txrxb(struct spi_device *spi, struct spi_transfer *t) | |||
396 | dma_sync_single_for_device(hw->dev, dma_rx_addr, | 409 | dma_sync_single_for_device(hw->dev, dma_rx_addr, |
397 | t->len, DMA_FROM_DEVICE); | 410 | t->len, DMA_FROM_DEVICE); |
398 | } | 411 | } |
399 | if (t->tx_buf) { | 412 | |
400 | if (t->tx_dma == 0) { /* if DMA_ADDR_INVALID, map it */ | 413 | if (!t->tx_buf) { |
401 | dma_tx_addr = dma_map_single(hw->dev, | ||
402 | (void *)t->tx_buf, | ||
403 | t->len, DMA_TO_DEVICE); | ||
404 | if (dma_mapping_error(hw->dev, dma_tx_addr)) | ||
405 | dev_err(hw->dev, "tx dma map error\n"); | ||
406 | } | ||
407 | } else { | ||
408 | dma_sync_single_for_device(hw->dev, dma_rx_addr, | 414 | dma_sync_single_for_device(hw->dev, dma_rx_addr, |
409 | t->len, DMA_BIDIRECTIONAL); | 415 | t->len, DMA_BIDIRECTIONAL); |
410 | hw->tx = hw->rx; | 416 | hw->tx = hw->rx; |
diff --git a/drivers/spi/mpc52xx_psc_spi.c b/drivers/spi/mpc52xx_psc_spi.c index 0debe11b67b4..3b97803e1d11 100644 --- a/drivers/spi/mpc52xx_psc_spi.c +++ b/drivers/spi/mpc52xx_psc_spi.c | |||
@@ -142,6 +142,7 @@ static int mpc52xx_psc_spi_transfer_rxtx(struct spi_device *spi, | |||
142 | unsigned rfalarm; | 142 | unsigned rfalarm; |
143 | unsigned send_at_once = MPC52xx_PSC_BUFSIZE; | 143 | unsigned send_at_once = MPC52xx_PSC_BUFSIZE; |
144 | unsigned recv_at_once; | 144 | unsigned recv_at_once; |
145 | int last_block = 0; | ||
145 | 146 | ||
146 | if (!t->tx_buf && !t->rx_buf && t->len) | 147 | if (!t->tx_buf && !t->rx_buf && t->len) |
147 | return -EINVAL; | 148 | return -EINVAL; |
@@ -151,15 +152,17 @@ static int mpc52xx_psc_spi_transfer_rxtx(struct spi_device *spi, | |||
151 | while (rb < t->len) { | 152 | while (rb < t->len) { |
152 | if (t->len - rb > MPC52xx_PSC_BUFSIZE) { | 153 | if (t->len - rb > MPC52xx_PSC_BUFSIZE) { |
153 | rfalarm = MPC52xx_PSC_RFALARM; | 154 | rfalarm = MPC52xx_PSC_RFALARM; |
155 | last_block = 0; | ||
154 | } else { | 156 | } else { |
155 | send_at_once = t->len - sb; | 157 | send_at_once = t->len - sb; |
156 | rfalarm = MPC52xx_PSC_BUFSIZE - (t->len - rb); | 158 | rfalarm = MPC52xx_PSC_BUFSIZE - (t->len - rb); |
159 | last_block = 1; | ||
157 | } | 160 | } |
158 | 161 | ||
159 | dev_dbg(&spi->dev, "send %d bytes...\n", send_at_once); | 162 | dev_dbg(&spi->dev, "send %d bytes...\n", send_at_once); |
160 | for (; send_at_once; sb++, send_at_once--) { | 163 | for (; send_at_once; sb++, send_at_once--) { |
161 | /* set EOF flag before the last word is sent */ | 164 | /* set EOF flag before the last word is sent */ |
162 | if (send_at_once == 1) | 165 | if (send_at_once == 1 && last_block) |
163 | out_8(&psc->ircr2, 0x01); | 166 | out_8(&psc->ircr2, 0x01); |
164 | 167 | ||
165 | if (tx_buf) | 168 | if (tx_buf) |
diff --git a/drivers/spi/pxa2xx_spi.c b/drivers/spi/pxa2xx_spi.c index dae87b1a4c6e..cf12f2d84be2 100644 --- a/drivers/spi/pxa2xx_spi.c +++ b/drivers/spi/pxa2xx_spi.c | |||
@@ -352,21 +352,21 @@ static int map_dma_buffers(struct driver_data *drv_data) | |||
352 | } else | 352 | } else |
353 | drv_data->tx_map_len = drv_data->len; | 353 | drv_data->tx_map_len = drv_data->len; |
354 | 354 | ||
355 | /* Stream map the rx buffer */ | 355 | /* Stream map the tx buffer. Always do DMA_TO_DEVICE first |
356 | drv_data->rx_dma = dma_map_single(dev, drv_data->rx, | 356 | * so we flush the cache *before* invalidating it, in case |
357 | drv_data->rx_map_len, | 357 | * the tx and rx buffers overlap. |
358 | DMA_FROM_DEVICE); | 358 | */ |
359 | if (dma_mapping_error(dev, drv_data->rx_dma)) | ||
360 | return 0; | ||
361 | |||
362 | /* Stream map the tx buffer */ | ||
363 | drv_data->tx_dma = dma_map_single(dev, drv_data->tx, | 359 | drv_data->tx_dma = dma_map_single(dev, drv_data->tx, |
364 | drv_data->tx_map_len, | 360 | drv_data->tx_map_len, DMA_TO_DEVICE); |
365 | DMA_TO_DEVICE); | 361 | if (dma_mapping_error(dev, drv_data->tx_dma)) |
362 | return 0; | ||
366 | 363 | ||
367 | if (dma_mapping_error(dev, drv_data->tx_dma)) { | 364 | /* Stream map the rx buffer */ |
368 | dma_unmap_single(dev, drv_data->rx_dma, | 365 | drv_data->rx_dma = dma_map_single(dev, drv_data->rx, |
369 | drv_data->rx_map_len, DMA_FROM_DEVICE); | 366 | drv_data->rx_map_len, DMA_FROM_DEVICE); |
367 | if (dma_mapping_error(dev, drv_data->rx_dma)) { | ||
368 | dma_unmap_single(dev, drv_data->tx_dma, | ||
369 | drv_data->tx_map_len, DMA_TO_DEVICE); | ||
370 | return 0; | 370 | return 0; |
371 | } | 371 | } |
372 | 372 | ||
diff --git a/drivers/spi/spi_imx.c b/drivers/spi/spi_imx.c index 61ba147e384d..269a55ec52ef 100644 --- a/drivers/spi/spi_imx.c +++ b/drivers/spi/spi_imx.c | |||
@@ -506,20 +506,6 @@ static int map_dma_buffers(struct driver_data *drv_data) | |||
506 | if (!IS_DMA_ALIGNED(drv_data->rx) || !IS_DMA_ALIGNED(drv_data->tx)) | 506 | if (!IS_DMA_ALIGNED(drv_data->rx) || !IS_DMA_ALIGNED(drv_data->tx)) |
507 | return -1; | 507 | return -1; |
508 | 508 | ||
509 | /* NULL rx means write-only transfer and no map needed | ||
510 | since rx DMA will not be used */ | ||
511 | if (drv_data->rx) { | ||
512 | buf = drv_data->rx; | ||
513 | drv_data->rx_dma = dma_map_single( | ||
514 | dev, | ||
515 | buf, | ||
516 | drv_data->len, | ||
517 | DMA_FROM_DEVICE); | ||
518 | if (dma_mapping_error(dev, drv_data->rx_dma)) | ||
519 | return -1; | ||
520 | drv_data->rx_dma_needs_unmap = 1; | ||
521 | } | ||
522 | |||
523 | if (drv_data->tx == NULL) { | 509 | if (drv_data->tx == NULL) { |
524 | /* Read only message --> use drv_data->dummy_dma_buf for dummy | 510 | /* Read only message --> use drv_data->dummy_dma_buf for dummy |
525 | writes to achive reads */ | 511 | writes to achive reads */ |
@@ -533,18 +519,31 @@ static int map_dma_buffers(struct driver_data *drv_data) | |||
533 | buf, | 519 | buf, |
534 | drv_data->tx_map_len, | 520 | drv_data->tx_map_len, |
535 | DMA_TO_DEVICE); | 521 | DMA_TO_DEVICE); |
536 | if (dma_mapping_error(dev, drv_data->tx_dma)) { | 522 | if (dma_mapping_error(dev, drv_data->tx_dma)) |
537 | if (drv_data->rx_dma) { | ||
538 | dma_unmap_single(dev, | ||
539 | drv_data->rx_dma, | ||
540 | drv_data->len, | ||
541 | DMA_FROM_DEVICE); | ||
542 | drv_data->rx_dma_needs_unmap = 0; | ||
543 | } | ||
544 | return -1; | 523 | return -1; |
545 | } | ||
546 | drv_data->tx_dma_needs_unmap = 1; | 524 | drv_data->tx_dma_needs_unmap = 1; |
547 | 525 | ||
526 | /* NULL rx means write-only transfer and no map needed | ||
527 | * since rx DMA will not be used */ | ||
528 | if (drv_data->rx) { | ||
529 | buf = drv_data->rx; | ||
530 | drv_data->rx_dma = dma_map_single(dev, | ||
531 | buf, | ||
532 | drv_data->len, | ||
533 | DMA_FROM_DEVICE); | ||
534 | if (dma_mapping_error(dev, drv_data->rx_dma)) { | ||
535 | if (drv_data->tx_dma) { | ||
536 | dma_unmap_single(dev, | ||
537 | drv_data->tx_dma, | ||
538 | drv_data->tx_map_len, | ||
539 | DMA_TO_DEVICE); | ||
540 | drv_data->tx_dma_needs_unmap = 0; | ||
541 | } | ||
542 | return -1; | ||
543 | } | ||
544 | drv_data->rx_dma_needs_unmap = 1; | ||
545 | } | ||
546 | |||
548 | return 0; | 547 | return 0; |
549 | } | 548 | } |
550 | 549 | ||
@@ -1457,7 +1456,7 @@ static int __init spi_imx_probe(struct platform_device *pdev) | |||
1457 | struct device *dev = &pdev->dev; | 1456 | struct device *dev = &pdev->dev; |
1458 | struct spi_imx_master *platform_info; | 1457 | struct spi_imx_master *platform_info; |
1459 | struct spi_master *master; | 1458 | struct spi_master *master; |
1460 | struct driver_data *drv_data = NULL; | 1459 | struct driver_data *drv_data; |
1461 | struct resource *res; | 1460 | struct resource *res; |
1462 | int irq, status = 0; | 1461 | int irq, status = 0; |
1463 | 1462 | ||
@@ -1468,14 +1467,6 @@ static int __init spi_imx_probe(struct platform_device *pdev) | |||
1468 | goto err_no_pdata; | 1467 | goto err_no_pdata; |
1469 | } | 1468 | } |
1470 | 1469 | ||
1471 | drv_data->clk = clk_get(&pdev->dev, "perclk2"); | ||
1472 | if (IS_ERR(drv_data->clk)) { | ||
1473 | dev_err(&pdev->dev, "probe - cannot get get\n"); | ||
1474 | status = PTR_ERR(drv_data->clk); | ||
1475 | goto err_no_clk; | ||
1476 | } | ||
1477 | clk_enable(drv_data->clk); | ||
1478 | |||
1479 | /* Allocate master with space for drv_data */ | 1470 | /* Allocate master with space for drv_data */ |
1480 | master = spi_alloc_master(dev, sizeof(struct driver_data)); | 1471 | master = spi_alloc_master(dev, sizeof(struct driver_data)); |
1481 | if (!master) { | 1472 | if (!master) { |
@@ -1496,6 +1487,14 @@ static int __init spi_imx_probe(struct platform_device *pdev) | |||
1496 | 1487 | ||
1497 | drv_data->dummy_dma_buf = SPI_DUMMY_u32; | 1488 | drv_data->dummy_dma_buf = SPI_DUMMY_u32; |
1498 | 1489 | ||
1490 | drv_data->clk = clk_get(&pdev->dev, "perclk2"); | ||
1491 | if (IS_ERR(drv_data->clk)) { | ||
1492 | dev_err(&pdev->dev, "probe - cannot get clock\n"); | ||
1493 | status = PTR_ERR(drv_data->clk); | ||
1494 | goto err_no_clk; | ||
1495 | } | ||
1496 | clk_enable(drv_data->clk); | ||
1497 | |||
1499 | /* Find and map resources */ | 1498 | /* Find and map resources */ |
1500 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 1499 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
1501 | if (!res) { | 1500 | if (!res) { |
@@ -1631,12 +1630,13 @@ err_no_iomap: | |||
1631 | kfree(drv_data->ioarea); | 1630 | kfree(drv_data->ioarea); |
1632 | 1631 | ||
1633 | err_no_iores: | 1632 | err_no_iores: |
1634 | spi_master_put(master); | ||
1635 | |||
1636 | err_no_pdata: | ||
1637 | clk_disable(drv_data->clk); | 1633 | clk_disable(drv_data->clk); |
1638 | clk_put(drv_data->clk); | 1634 | clk_put(drv_data->clk); |
1635 | |||
1639 | err_no_clk: | 1636 | err_no_clk: |
1637 | spi_master_put(master); | ||
1638 | |||
1639 | err_no_pdata: | ||
1640 | err_no_mem: | 1640 | err_no_mem: |
1641 | return status; | 1641 | return status; |
1642 | } | 1642 | } |
diff --git a/drivers/spi/spi_s3c24xx_gpio.c b/drivers/spi/spi_s3c24xx_gpio.c index cc1f647f579b..f2447a5476bb 100644 --- a/drivers/spi/spi_s3c24xx_gpio.c +++ b/drivers/spi/spi_s3c24xx_gpio.c | |||
@@ -34,7 +34,7 @@ struct s3c2410_spigpio { | |||
34 | 34 | ||
35 | static inline struct s3c2410_spigpio *spidev_to_sg(struct spi_device *spi) | 35 | static inline struct s3c2410_spigpio *spidev_to_sg(struct spi_device *spi) |
36 | { | 36 | { |
37 | return spi->controller_data; | 37 | return spi_master_get_devdata(spi->master); |
38 | } | 38 | } |
39 | 39 | ||
40 | static inline void setsck(struct spi_device *dev, int on) | 40 | static inline void setsck(struct spi_device *dev, int on) |
@@ -118,6 +118,7 @@ static int s3c2410_spigpio_probe(struct platform_device *dev) | |||
118 | /* setup spi bitbang adaptor */ | 118 | /* setup spi bitbang adaptor */ |
119 | sp->bitbang.master = spi_master_get(master); | 119 | sp->bitbang.master = spi_master_get(master); |
120 | sp->bitbang.master->bus_num = info->bus_num; | 120 | sp->bitbang.master->bus_num = info->bus_num; |
121 | sp->bitbang.master->num_chipselect = info->num_chipselect; | ||
121 | sp->bitbang.chipselect = s3c2410_spigpio_chipselect; | 122 | sp->bitbang.chipselect = s3c2410_spigpio_chipselect; |
122 | 123 | ||
123 | sp->bitbang.txrx_word[SPI_MODE_0] = s3c2410_spigpio_txrx_mode0; | 124 | sp->bitbang.txrx_word[SPI_MODE_0] = s3c2410_spigpio_txrx_mode0; |
diff --git a/drivers/spi/spidev.c b/drivers/spi/spidev.c index 89a43755a453..5d869c4d3eb2 100644 --- a/drivers/spi/spidev.c +++ b/drivers/spi/spidev.c | |||
@@ -597,7 +597,9 @@ static int spidev_probe(struct spi_device *spi) | |||
597 | } | 597 | } |
598 | mutex_unlock(&device_list_lock); | 598 | mutex_unlock(&device_list_lock); |
599 | 599 | ||
600 | if (status != 0) | 600 | if (status == 0) |
601 | spi_set_drvdata(spi, spidev); | ||
602 | else | ||
601 | kfree(spidev); | 603 | kfree(spidev); |
602 | 604 | ||
603 | return status; | 605 | return status; |
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index 20104443081a..d50a99f70aee 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c | |||
@@ -158,16 +158,12 @@ static int acm_wb_is_avail(struct acm *acm) | |||
158 | } | 158 | } |
159 | 159 | ||
160 | /* | 160 | /* |
161 | * Finish write. | 161 | * Finish write. Caller must hold acm->write_lock |
162 | */ | 162 | */ |
163 | static void acm_write_done(struct acm *acm, struct acm_wb *wb) | 163 | static void acm_write_done(struct acm *acm, struct acm_wb *wb) |
164 | { | 164 | { |
165 | unsigned long flags; | ||
166 | |||
167 | spin_lock_irqsave(&acm->write_lock, flags); | ||
168 | wb->use = 0; | 165 | wb->use = 0; |
169 | acm->transmitting--; | 166 | acm->transmitting--; |
170 | spin_unlock_irqrestore(&acm->write_lock, flags); | ||
171 | } | 167 | } |
172 | 168 | ||
173 | /* | 169 | /* |
@@ -482,6 +478,7 @@ static void acm_write_bulk(struct urb *urb) | |||
482 | { | 478 | { |
483 | struct acm_wb *wb = urb->context; | 479 | struct acm_wb *wb = urb->context; |
484 | struct acm *acm = wb->instance; | 480 | struct acm *acm = wb->instance; |
481 | unsigned long flags; | ||
485 | 482 | ||
486 | if (verbose || urb->status | 483 | if (verbose || urb->status |
487 | || (urb->actual_length != urb->transfer_buffer_length)) | 484 | || (urb->actual_length != urb->transfer_buffer_length)) |
@@ -490,7 +487,9 @@ static void acm_write_bulk(struct urb *urb) | |||
490 | urb->transfer_buffer_length, | 487 | urb->transfer_buffer_length, |
491 | urb->status); | 488 | urb->status); |
492 | 489 | ||
490 | spin_lock_irqsave(&acm->write_lock, flags); | ||
493 | acm_write_done(acm, wb); | 491 | acm_write_done(acm, wb); |
492 | spin_unlock_irqrestore(&acm->write_lock, flags); | ||
494 | if (ACM_READY(acm)) | 493 | if (ACM_READY(acm)) |
495 | schedule_work(&acm->work); | 494 | schedule_work(&acm->work); |
496 | else | 495 | else |
diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c index 887738577b28..6d1048faf08e 100644 --- a/drivers/usb/core/message.c +++ b/drivers/usb/core/message.c | |||
@@ -1091,6 +1091,7 @@ void usb_disable_device(struct usb_device *dev, int skip_ep0) | |||
1091 | continue; | 1091 | continue; |
1092 | dev_dbg(&dev->dev, "unregistering interface %s\n", | 1092 | dev_dbg(&dev->dev, "unregistering interface %s\n", |
1093 | dev_name(&interface->dev)); | 1093 | dev_name(&interface->dev)); |
1094 | interface->unregistering = 1; | ||
1094 | usb_remove_sysfs_intf_files(interface); | 1095 | usb_remove_sysfs_intf_files(interface); |
1095 | device_del(&interface->dev); | 1096 | device_del(&interface->dev); |
1096 | } | 1097 | } |
diff --git a/drivers/usb/core/sysfs.c b/drivers/usb/core/sysfs.c index f66fba11fbd5..4fb65fdc9dc3 100644 --- a/drivers/usb/core/sysfs.c +++ b/drivers/usb/core/sysfs.c | |||
@@ -840,7 +840,7 @@ int usb_create_sysfs_intf_files(struct usb_interface *intf) | |||
840 | struct usb_host_interface *alt = intf->cur_altsetting; | 840 | struct usb_host_interface *alt = intf->cur_altsetting; |
841 | int retval; | 841 | int retval; |
842 | 842 | ||
843 | if (intf->sysfs_files_created) | 843 | if (intf->sysfs_files_created || intf->unregistering) |
844 | return 0; | 844 | return 0; |
845 | 845 | ||
846 | /* The interface string may be present in some altsettings | 846 | /* The interface string may be present in some altsettings |
diff --git a/drivers/usb/core/urb.c b/drivers/usb/core/urb.c index 4342bd9c3bb6..1f68af9db3f7 100644 --- a/drivers/usb/core/urb.c +++ b/drivers/usb/core/urb.c | |||
@@ -85,8 +85,8 @@ EXPORT_SYMBOL_GPL(usb_alloc_urb); | |||
85 | * Must be called when a user of a urb is finished with it. When the last user | 85 | * Must be called when a user of a urb is finished with it. When the last user |
86 | * of the urb calls this function, the memory of the urb is freed. | 86 | * of the urb calls this function, the memory of the urb is freed. |
87 | * | 87 | * |
88 | * Note: The transfer buffer associated with the urb is not freed, that must be | 88 | * Note: The transfer buffer associated with the urb is not freed unless the |
89 | * done elsewhere. | 89 | * URB_FREE_BUFFER transfer flag is set. |
90 | */ | 90 | */ |
91 | void usb_free_urb(struct urb *urb) | 91 | void usb_free_urb(struct urb *urb) |
92 | { | 92 | { |
diff --git a/drivers/usb/gadget/f_acm.c b/drivers/usb/gadget/f_acm.c index 5ee1590b8e9c..c1d34df0b157 100644 --- a/drivers/usb/gadget/f_acm.c +++ b/drivers/usb/gadget/f_acm.c | |||
@@ -463,7 +463,11 @@ static int acm_cdc_notify(struct f_acm *acm, u8 type, u16 value, | |||
463 | notify->wLength = cpu_to_le16(length); | 463 | notify->wLength = cpu_to_le16(length); |
464 | memcpy(buf, data, length); | 464 | memcpy(buf, data, length); |
465 | 465 | ||
466 | /* ep_queue() can complete immediately if it fills the fifo... */ | ||
467 | spin_unlock(&acm->lock); | ||
466 | status = usb_ep_queue(ep, req, GFP_ATOMIC); | 468 | status = usb_ep_queue(ep, req, GFP_ATOMIC); |
469 | spin_lock(&acm->lock); | ||
470 | |||
467 | if (status < 0) { | 471 | if (status < 0) { |
468 | ERROR(acm->port.func.config->cdev, | 472 | ERROR(acm->port.func.config->cdev, |
469 | "acm ttyGS%d can't notify serial state, %d\n", | 473 | "acm ttyGS%d can't notify serial state, %d\n", |
diff --git a/drivers/usb/gadget/f_rndis.c b/drivers/usb/gadget/f_rndis.c index 659b3d9671c4..428b5993575a 100644 --- a/drivers/usb/gadget/f_rndis.c +++ b/drivers/usb/gadget/f_rndis.c | |||
@@ -172,7 +172,6 @@ static struct usb_interface_descriptor rndis_data_intf __initdata = { | |||
172 | .bDescriptorType = USB_DT_INTERFACE, | 172 | .bDescriptorType = USB_DT_INTERFACE, |
173 | 173 | ||
174 | /* .bInterfaceNumber = DYNAMIC */ | 174 | /* .bInterfaceNumber = DYNAMIC */ |
175 | .bAlternateSetting = 1, | ||
176 | .bNumEndpoints = 2, | 175 | .bNumEndpoints = 2, |
177 | .bInterfaceClass = USB_CLASS_CDC_DATA, | 176 | .bInterfaceClass = USB_CLASS_CDC_DATA, |
178 | .bInterfaceSubClass = 0, | 177 | .bInterfaceSubClass = 0, |
@@ -303,7 +302,7 @@ static void rndis_response_available(void *_rndis) | |||
303 | __le32 *data = req->buf; | 302 | __le32 *data = req->buf; |
304 | int status; | 303 | int status; |
305 | 304 | ||
306 | if (atomic_inc_return(&rndis->notify_count)) | 305 | if (atomic_inc_return(&rndis->notify_count) != 1) |
307 | return; | 306 | return; |
308 | 307 | ||
309 | /* Send RNDIS RESPONSE_AVAILABLE notification; a | 308 | /* Send RNDIS RESPONSE_AVAILABLE notification; a |
diff --git a/drivers/usb/gadget/fsl_qe_udc.c b/drivers/usb/gadget/fsl_qe_udc.c index 1fe8b44787b3..b3408ff39fba 100644 --- a/drivers/usb/gadget/fsl_qe_udc.c +++ b/drivers/usb/gadget/fsl_qe_udc.c | |||
@@ -2363,6 +2363,9 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver) | |||
2363 | nuke(loop_ep, -ESHUTDOWN); | 2363 | nuke(loop_ep, -ESHUTDOWN); |
2364 | spin_unlock_irqrestore(&udc_controller->lock, flags); | 2364 | spin_unlock_irqrestore(&udc_controller->lock, flags); |
2365 | 2365 | ||
2366 | /* report disconnect; the controller is already quiesced */ | ||
2367 | driver->disconnect(&udc_controller->gadget); | ||
2368 | |||
2366 | /* unbind gadget and unhook driver. */ | 2369 | /* unbind gadget and unhook driver. */ |
2367 | driver->unbind(&udc_controller->gadget); | 2370 | driver->unbind(&udc_controller->gadget); |
2368 | udc_controller->gadget.dev.driver = NULL; | 2371 | udc_controller->gadget.dev.driver = NULL; |
diff --git a/drivers/usb/gadget/fsl_usb2_udc.c b/drivers/usb/gadget/fsl_usb2_udc.c index 091bb55c9aa7..f3c6703cffda 100644 --- a/drivers/usb/gadget/fsl_usb2_udc.c +++ b/drivers/usb/gadget/fsl_usb2_udc.c | |||
@@ -1836,6 +1836,9 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver) | |||
1836 | nuke(loop_ep, -ESHUTDOWN); | 1836 | nuke(loop_ep, -ESHUTDOWN); |
1837 | spin_unlock_irqrestore(&udc_controller->lock, flags); | 1837 | spin_unlock_irqrestore(&udc_controller->lock, flags); |
1838 | 1838 | ||
1839 | /* report disconnect; the controller is already quiesced */ | ||
1840 | driver->disconnect(&udc_controller->gadget); | ||
1841 | |||
1839 | /* unbind gadget and unhook driver. */ | 1842 | /* unbind gadget and unhook driver. */ |
1840 | driver->unbind(&udc_controller->gadget); | 1843 | driver->unbind(&udc_controller->gadget); |
1841 | udc_controller->gadget.dev.driver = NULL; | 1844 | udc_controller->gadget.dev.driver = NULL; |
diff --git a/drivers/usb/gadget/pxa25x_udc.c b/drivers/usb/gadget/pxa25x_udc.c index da6e93c201d2..2dbc0db0b46c 100644 --- a/drivers/usb/gadget/pxa25x_udc.c +++ b/drivers/usb/gadget/pxa25x_udc.c | |||
@@ -141,7 +141,11 @@ static int is_vbus_present(void) | |||
141 | 141 | ||
142 | if (mach->gpio_vbus) { | 142 | if (mach->gpio_vbus) { |
143 | int value = gpio_get_value(mach->gpio_vbus); | 143 | int value = gpio_get_value(mach->gpio_vbus); |
144 | return mach->gpio_vbus_inverted ? !value : value; | 144 | |
145 | if (mach->gpio_vbus_inverted) | ||
146 | return !value; | ||
147 | else | ||
148 | return !!value; | ||
145 | } | 149 | } |
146 | if (mach->udc_is_connected) | 150 | if (mach->udc_is_connected) |
147 | return mach->udc_is_connected(); | 151 | return mach->udc_is_connected(); |
@@ -982,7 +986,7 @@ static int pxa25x_udc_vbus_session(struct usb_gadget *_gadget, int is_active) | |||
982 | struct pxa25x_udc *udc; | 986 | struct pxa25x_udc *udc; |
983 | 987 | ||
984 | udc = container_of(_gadget, struct pxa25x_udc, gadget); | 988 | udc = container_of(_gadget, struct pxa25x_udc, gadget); |
985 | udc->vbus = (is_active != 0); | 989 | udc->vbus = is_active; |
986 | DMSG("vbus %s\n", is_active ? "supplied" : "inactive"); | 990 | DMSG("vbus %s\n", is_active ? "supplied" : "inactive"); |
987 | pullup(udc); | 991 | pullup(udc); |
988 | return 0; | 992 | return 0; |
@@ -1399,12 +1403,8 @@ lubbock_vbus_irq(int irq, void *_dev) | |||
1399 | static irqreturn_t udc_vbus_irq(int irq, void *_dev) | 1403 | static irqreturn_t udc_vbus_irq(int irq, void *_dev) |
1400 | { | 1404 | { |
1401 | struct pxa25x_udc *dev = _dev; | 1405 | struct pxa25x_udc *dev = _dev; |
1402 | int vbus = gpio_get_value(dev->mach->gpio_vbus); | ||
1403 | 1406 | ||
1404 | if (dev->mach->gpio_vbus_inverted) | 1407 | pxa25x_udc_vbus_session(&dev->gadget, is_vbus_present()); |
1405 | vbus = !vbus; | ||
1406 | |||
1407 | pxa25x_udc_vbus_session(&dev->gadget, vbus); | ||
1408 | return IRQ_HANDLED; | 1408 | return IRQ_HANDLED; |
1409 | } | 1409 | } |
1410 | 1410 | ||
diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig index 56f592dc0b36..f3a75a929e0a 100644 --- a/drivers/usb/host/Kconfig +++ b/drivers/usb/host/Kconfig | |||
@@ -110,29 +110,18 @@ config USB_ISP116X_HCD | |||
110 | 110 | ||
111 | config USB_ISP1760_HCD | 111 | config USB_ISP1760_HCD |
112 | tristate "ISP 1760 HCD support" | 112 | tristate "ISP 1760 HCD support" |
113 | depends on USB && EXPERIMENTAL | 113 | depends on USB && EXPERIMENTAL && (PCI || PPC_OF) |
114 | ---help--- | 114 | ---help--- |
115 | The ISP1760 chip is a USB 2.0 host controller. | 115 | The ISP1760 chip is a USB 2.0 host controller. |
116 | 116 | ||
117 | This driver does not support isochronous transfers or OTG. | 117 | This driver does not support isochronous transfers or OTG. |
118 | This USB controller is usually attached to a non-DMA-Master | ||
119 | capable bus. NXP's eval kit brings this chip on PCI card | ||
120 | where the chip itself is behind a PLB to simulate such | ||
121 | a bus. | ||
118 | 122 | ||
119 | To compile this driver as a module, choose M here: the | 123 | To compile this driver as a module, choose M here: the |
120 | module will be called isp1760-hcd. | 124 | module will be called isp1760. |
121 | |||
122 | config USB_ISP1760_PCI | ||
123 | bool "Support for the PCI bus" | ||
124 | depends on USB_ISP1760_HCD && PCI | ||
125 | ---help--- | ||
126 | Enables support for the device present on the PCI bus. | ||
127 | This should only be required if you happen to have the eval kit from | ||
128 | NXP and you are going to test it. | ||
129 | |||
130 | config USB_ISP1760_OF | ||
131 | bool "Support for the OF platform bus" | ||
132 | depends on USB_ISP1760_HCD && PPC_OF | ||
133 | ---help--- | ||
134 | Enables support for the device present on the PowerPC | ||
135 | OpenFirmware platform bus. | ||
136 | 125 | ||
137 | config USB_OHCI_HCD | 126 | config USB_OHCI_HCD |
138 | tristate "OHCI HCD support" | 127 | tristate "OHCI HCD support" |
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index 15a803b206b8..4725d15d096f 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c | |||
@@ -643,7 +643,7 @@ static int ehci_run (struct usb_hcd *hcd) | |||
643 | static irqreturn_t ehci_irq (struct usb_hcd *hcd) | 643 | static irqreturn_t ehci_irq (struct usb_hcd *hcd) |
644 | { | 644 | { |
645 | struct ehci_hcd *ehci = hcd_to_ehci (hcd); | 645 | struct ehci_hcd *ehci = hcd_to_ehci (hcd); |
646 | u32 status, pcd_status = 0, cmd; | 646 | u32 status, masked_status, pcd_status = 0, cmd; |
647 | int bh; | 647 | int bh; |
648 | 648 | ||
649 | spin_lock (&ehci->lock); | 649 | spin_lock (&ehci->lock); |
@@ -656,14 +656,14 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd) | |||
656 | goto dead; | 656 | goto dead; |
657 | } | 657 | } |
658 | 658 | ||
659 | status &= INTR_MASK; | 659 | masked_status = status & INTR_MASK; |
660 | if (!status) { /* irq sharing? */ | 660 | if (!masked_status) { /* irq sharing? */ |
661 | spin_unlock(&ehci->lock); | 661 | spin_unlock(&ehci->lock); |
662 | return IRQ_NONE; | 662 | return IRQ_NONE; |
663 | } | 663 | } |
664 | 664 | ||
665 | /* clear (just) interrupts */ | 665 | /* clear (just) interrupts */ |
666 | ehci_writel(ehci, status, &ehci->regs->status); | 666 | ehci_writel(ehci, masked_status, &ehci->regs->status); |
667 | cmd = ehci_readl(ehci, &ehci->regs->command); | 667 | cmd = ehci_readl(ehci, &ehci->regs->command); |
668 | bh = 0; | 668 | bh = 0; |
669 | 669 | ||
@@ -734,18 +734,17 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd) | |||
734 | 734 | ||
735 | /* PCI errors [4.15.2.4] */ | 735 | /* PCI errors [4.15.2.4] */ |
736 | if (unlikely ((status & STS_FATAL) != 0)) { | 736 | if (unlikely ((status & STS_FATAL) != 0)) { |
737 | ehci_err(ehci, "fatal error\n"); | ||
737 | dbg_cmd(ehci, "fatal", cmd); | 738 | dbg_cmd(ehci, "fatal", cmd); |
738 | dbg_status(ehci, "fatal", status); | 739 | dbg_status(ehci, "fatal", status); |
739 | if (status & STS_HALT) { | 740 | ehci_halt(ehci); |
740 | ehci_err (ehci, "fatal error\n"); | ||
741 | dead: | 741 | dead: |
742 | ehci_reset (ehci); | 742 | ehci_reset(ehci); |
743 | ehci_writel(ehci, 0, &ehci->regs->configured_flag); | 743 | ehci_writel(ehci, 0, &ehci->regs->configured_flag); |
744 | /* generic layer kills/unlinks all urbs, then | 744 | /* generic layer kills/unlinks all urbs, then |
745 | * uses ehci_stop to clean up the rest | 745 | * uses ehci_stop to clean up the rest |
746 | */ | 746 | */ |
747 | bh = 1; | 747 | bh = 1; |
748 | } | ||
749 | } | 748 | } |
750 | 749 | ||
751 | if (bh) | 750 | if (bh) |
diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c index c46a58f9181d..36864f958444 100644 --- a/drivers/usb/host/ehci-pci.c +++ b/drivers/usb/host/ehci-pci.c | |||
@@ -66,6 +66,8 @@ static int ehci_pci_setup(struct usb_hcd *hcd) | |||
66 | { | 66 | { |
67 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | 67 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); |
68 | struct pci_dev *pdev = to_pci_dev(hcd->self.controller); | 68 | struct pci_dev *pdev = to_pci_dev(hcd->self.controller); |
69 | struct pci_dev *p_smbus; | ||
70 | u8 rev; | ||
69 | u32 temp; | 71 | u32 temp; |
70 | int retval; | 72 | int retval; |
71 | 73 | ||
@@ -166,6 +168,28 @@ static int ehci_pci_setup(struct usb_hcd *hcd) | |||
166 | pci_write_config_byte(pdev, 0x4b, tmp | 0x20); | 168 | pci_write_config_byte(pdev, 0x4b, tmp | 0x20); |
167 | } | 169 | } |
168 | break; | 170 | break; |
171 | case PCI_VENDOR_ID_ATI: | ||
172 | /* SB600 and old version of SB700 have a bug in EHCI controller, | ||
173 | * which causes usb devices lose response in some cases. | ||
174 | */ | ||
175 | if ((pdev->device == 0x4386) || (pdev->device == 0x4396)) { | ||
176 | p_smbus = pci_get_device(PCI_VENDOR_ID_ATI, | ||
177 | PCI_DEVICE_ID_ATI_SBX00_SMBUS, | ||
178 | NULL); | ||
179 | if (!p_smbus) | ||
180 | break; | ||
181 | rev = p_smbus->revision; | ||
182 | if ((pdev->device == 0x4386) || (rev == 0x3a) | ||
183 | || (rev == 0x3b)) { | ||
184 | u8 tmp; | ||
185 | ehci_info(ehci, "applying AMD SB600/SB700 USB " | ||
186 | "freeze workaround\n"); | ||
187 | pci_read_config_byte(pdev, 0x53, &tmp); | ||
188 | pci_write_config_byte(pdev, 0x53, tmp | (1<<3)); | ||
189 | } | ||
190 | pci_dev_put(p_smbus); | ||
191 | } | ||
192 | break; | ||
169 | } | 193 | } |
170 | 194 | ||
171 | ehci_reset(ehci); | 195 | ehci_reset(ehci); |
diff --git a/drivers/usb/host/ehci-ps3.c b/drivers/usb/host/ehci-ps3.c index 0eba894bcb01..9c9da35abc6c 100644 --- a/drivers/usb/host/ehci-ps3.c +++ b/drivers/usb/host/ehci-ps3.c | |||
@@ -205,6 +205,7 @@ static int ps3_ehci_remove(struct ps3_system_bus_device *dev) | |||
205 | 205 | ||
206 | tmp = hcd->irq; | 206 | tmp = hcd->irq; |
207 | 207 | ||
208 | ehci_shutdown(hcd); | ||
208 | usb_remove_hcd(hcd); | 209 | usb_remove_hcd(hcd); |
209 | 210 | ||
210 | ps3_system_bus_set_driver_data(dev, NULL); | 211 | ps3_system_bus_set_driver_data(dev, NULL); |
diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c index 4a0c5a78b2ed..a081ee65bde6 100644 --- a/drivers/usb/host/ehci-sched.c +++ b/drivers/usb/host/ehci-sched.c | |||
@@ -918,7 +918,7 @@ iso_stream_init ( | |||
918 | */ | 918 | */ |
919 | stream->usecs = HS_USECS_ISO (maxp); | 919 | stream->usecs = HS_USECS_ISO (maxp); |
920 | bandwidth = stream->usecs * 8; | 920 | bandwidth = stream->usecs * 8; |
921 | bandwidth /= 1 << (interval - 1); | 921 | bandwidth /= interval; |
922 | 922 | ||
923 | } else { | 923 | } else { |
924 | u32 addr; | 924 | u32 addr; |
@@ -951,7 +951,7 @@ iso_stream_init ( | |||
951 | } else | 951 | } else |
952 | stream->raw_mask = smask_out [hs_transfers - 1]; | 952 | stream->raw_mask = smask_out [hs_transfers - 1]; |
953 | bandwidth = stream->usecs + stream->c_usecs; | 953 | bandwidth = stream->usecs + stream->c_usecs; |
954 | bandwidth /= 1 << (interval + 2); | 954 | bandwidth /= interval << 3; |
955 | 955 | ||
956 | /* stream->splits gets created from raw_mask later */ | 956 | /* stream->splits gets created from raw_mask later */ |
957 | stream->address = cpu_to_hc32(ehci, addr); | 957 | stream->address = cpu_to_hc32(ehci, addr); |
diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h index b11798d17ae5..c7d4b5a06bdb 100644 --- a/drivers/usb/host/ehci.h +++ b/drivers/usb/host/ehci.h | |||
@@ -183,16 +183,14 @@ timer_action (struct ehci_hcd *ehci, enum ehci_timer_action action) | |||
183 | * the async ring; just the I/O watchdog. Note that if a | 183 | * the async ring; just the I/O watchdog. Note that if a |
184 | * SHRINK were pending, OFF would never be requested. | 184 | * SHRINK were pending, OFF would never be requested. |
185 | */ | 185 | */ |
186 | enum ehci_timer_action oldactions = ehci->actions; | 186 | if (timer_pending(&ehci->watchdog) |
187 | && ((BIT(TIMER_ASYNC_SHRINK) | BIT(TIMER_ASYNC_OFF)) | ||
188 | & ehci->actions)) | ||
189 | return; | ||
187 | 190 | ||
188 | if (!test_and_set_bit (action, &ehci->actions)) { | 191 | if (!test_and_set_bit (action, &ehci->actions)) { |
189 | unsigned long t; | 192 | unsigned long t; |
190 | 193 | ||
191 | if (timer_pending(&ehci->watchdog) | ||
192 | && ((BIT(TIMER_ASYNC_SHRINK) | BIT(TIMER_ASYNC_OFF)) | ||
193 | & oldactions)) | ||
194 | return; | ||
195 | |||
196 | switch (action) { | 194 | switch (action) { |
197 | case TIMER_IO_WATCHDOG: | 195 | case TIMER_IO_WATCHDOG: |
198 | t = EHCI_IO_JIFFIES; | 196 | t = EHCI_IO_JIFFIES; |
@@ -208,7 +206,7 @@ timer_action (struct ehci_hcd *ehci, enum ehci_timer_action action) | |||
208 | t = DIV_ROUND_UP(EHCI_SHRINK_FRAMES * HZ, 1000) + 1; | 206 | t = DIV_ROUND_UP(EHCI_SHRINK_FRAMES * HZ, 1000) + 1; |
209 | break; | 207 | break; |
210 | } | 208 | } |
211 | mod_timer(&ehci->watchdog, round_jiffies(t + jiffies)); | 209 | mod_timer(&ehci->watchdog, t + jiffies); |
212 | } | 210 | } |
213 | } | 211 | } |
214 | 212 | ||
diff --git a/drivers/usb/host/isp1760-if.c b/drivers/usb/host/isp1760-if.c index af849f596135..b87ca7cf4b37 100644 --- a/drivers/usb/host/isp1760-if.c +++ b/drivers/usb/host/isp1760-if.c | |||
@@ -14,16 +14,16 @@ | |||
14 | #include "../core/hcd.h" | 14 | #include "../core/hcd.h" |
15 | #include "isp1760-hcd.h" | 15 | #include "isp1760-hcd.h" |
16 | 16 | ||
17 | #ifdef CONFIG_USB_ISP1760_OF | 17 | #ifdef CONFIG_PPC_OF |
18 | #include <linux/of.h> | 18 | #include <linux/of.h> |
19 | #include <linux/of_platform.h> | 19 | #include <linux/of_platform.h> |
20 | #endif | 20 | #endif |
21 | 21 | ||
22 | #ifdef CONFIG_USB_ISP1760_PCI | 22 | #ifdef CONFIG_PCI |
23 | #include <linux/pci.h> | 23 | #include <linux/pci.h> |
24 | #endif | 24 | #endif |
25 | 25 | ||
26 | #ifdef CONFIG_USB_ISP1760_OF | 26 | #ifdef CONFIG_PPC_OF |
27 | static int of_isp1760_probe(struct of_device *dev, | 27 | static int of_isp1760_probe(struct of_device *dev, |
28 | const struct of_device_id *match) | 28 | const struct of_device_id *match) |
29 | { | 29 | { |
@@ -128,7 +128,7 @@ static struct of_platform_driver isp1760_of_driver = { | |||
128 | }; | 128 | }; |
129 | #endif | 129 | #endif |
130 | 130 | ||
131 | #ifdef CONFIG_USB_ISP1760_PCI | 131 | #ifdef CONFIG_PCI |
132 | static u32 nxp_pci_io_base; | 132 | static u32 nxp_pci_io_base; |
133 | static u32 iolength; | 133 | static u32 iolength; |
134 | static u32 pci_mem_phy0; | 134 | static u32 pci_mem_phy0; |
@@ -288,28 +288,28 @@ static struct pci_driver isp1761_pci_driver = { | |||
288 | 288 | ||
289 | static int __init isp1760_init(void) | 289 | static int __init isp1760_init(void) |
290 | { | 290 | { |
291 | int ret = -ENODEV; | 291 | int ret; |
292 | 292 | ||
293 | init_kmem_once(); | 293 | init_kmem_once(); |
294 | 294 | ||
295 | #ifdef CONFIG_USB_ISP1760_OF | 295 | #ifdef CONFIG_PPC_OF |
296 | ret = of_register_platform_driver(&isp1760_of_driver); | 296 | ret = of_register_platform_driver(&isp1760_of_driver); |
297 | if (ret) { | 297 | if (ret) { |
298 | deinit_kmem_cache(); | 298 | deinit_kmem_cache(); |
299 | return ret; | 299 | return ret; |
300 | } | 300 | } |
301 | #endif | 301 | #endif |
302 | #ifdef CONFIG_USB_ISP1760_PCI | 302 | #ifdef CONFIG_PCI |
303 | ret = pci_register_driver(&isp1761_pci_driver); | 303 | ret = pci_register_driver(&isp1761_pci_driver); |
304 | if (ret) | 304 | if (ret) |
305 | goto unreg_of; | 305 | goto unreg_of; |
306 | #endif | 306 | #endif |
307 | return ret; | 307 | return ret; |
308 | 308 | ||
309 | #ifdef CONFIG_USB_ISP1760_PCI | 309 | #ifdef CONFIG_PCI |
310 | unreg_of: | 310 | unreg_of: |
311 | #endif | 311 | #endif |
312 | #ifdef CONFIG_USB_ISP1760_OF | 312 | #ifdef CONFIG_PPC_OF |
313 | of_unregister_platform_driver(&isp1760_of_driver); | 313 | of_unregister_platform_driver(&isp1760_of_driver); |
314 | #endif | 314 | #endif |
315 | deinit_kmem_cache(); | 315 | deinit_kmem_cache(); |
@@ -319,10 +319,10 @@ module_init(isp1760_init); | |||
319 | 319 | ||
320 | static void __exit isp1760_exit(void) | 320 | static void __exit isp1760_exit(void) |
321 | { | 321 | { |
322 | #ifdef CONFIG_USB_ISP1760_OF | 322 | #ifdef CONFIG_PPC_OF |
323 | of_unregister_platform_driver(&isp1760_of_driver); | 323 | of_unregister_platform_driver(&isp1760_of_driver); |
324 | #endif | 324 | #endif |
325 | #ifdef CONFIG_USB_ISP1760_PCI | 325 | #ifdef CONFIG_PCI |
326 | pci_unregister_driver(&isp1761_pci_driver); | 326 | pci_unregister_driver(&isp1761_pci_driver); |
327 | #endif | 327 | #endif |
328 | deinit_kmem_cache(); | 328 | deinit_kmem_cache(); |
diff --git a/drivers/usb/host/ohci-ps3.c b/drivers/usb/host/ohci-ps3.c index 2089d8a46c4b..3c1a3b5f89f1 100644 --- a/drivers/usb/host/ohci-ps3.c +++ b/drivers/usb/host/ohci-ps3.c | |||
@@ -192,7 +192,7 @@ fail_start: | |||
192 | return result; | 192 | return result; |
193 | } | 193 | } |
194 | 194 | ||
195 | static int ps3_ohci_remove (struct ps3_system_bus_device *dev) | 195 | static int ps3_ohci_remove(struct ps3_system_bus_device *dev) |
196 | { | 196 | { |
197 | unsigned int tmp; | 197 | unsigned int tmp; |
198 | struct usb_hcd *hcd = | 198 | struct usb_hcd *hcd = |
@@ -205,6 +205,7 @@ static int ps3_ohci_remove (struct ps3_system_bus_device *dev) | |||
205 | 205 | ||
206 | tmp = hcd->irq; | 206 | tmp = hcd->irq; |
207 | 207 | ||
208 | ohci_shutdown(hcd); | ||
208 | usb_remove_hcd(hcd); | 209 | usb_remove_hcd(hcd); |
209 | 210 | ||
210 | ps3_system_bus_set_driver_data(dev, NULL); | 211 | ps3_system_bus_set_driver_data(dev, NULL); |
diff --git a/drivers/usb/host/r8a66597-hcd.c b/drivers/usb/host/r8a66597-hcd.c index c18d8790c410..2376f24f3c83 100644 --- a/drivers/usb/host/r8a66597-hcd.c +++ b/drivers/usb/host/r8a66597-hcd.c | |||
@@ -1763,11 +1763,12 @@ static void r8a66597_timer(unsigned long _r8a66597) | |||
1763 | { | 1763 | { |
1764 | struct r8a66597 *r8a66597 = (struct r8a66597 *)_r8a66597; | 1764 | struct r8a66597 *r8a66597 = (struct r8a66597 *)_r8a66597; |
1765 | unsigned long flags; | 1765 | unsigned long flags; |
1766 | int port; | ||
1766 | 1767 | ||
1767 | spin_lock_irqsave(&r8a66597->lock, flags); | 1768 | spin_lock_irqsave(&r8a66597->lock, flags); |
1768 | 1769 | ||
1769 | r8a66597_root_hub_control(r8a66597, 0); | 1770 | for (port = 0; port < R8A66597_MAX_ROOT_HUB; port++) |
1770 | r8a66597_root_hub_control(r8a66597, 1); | 1771 | r8a66597_root_hub_control(r8a66597, port); |
1771 | 1772 | ||
1772 | spin_unlock_irqrestore(&r8a66597->lock, flags); | 1773 | spin_unlock_irqrestore(&r8a66597->lock, flags); |
1773 | } | 1774 | } |
diff --git a/drivers/usb/misc/sisusbvga/sisusb.c b/drivers/usb/misc/sisusbvga/sisusb.c index 69c34a58e205..b4ec716de7da 100644 --- a/drivers/usb/misc/sisusbvga/sisusb.c +++ b/drivers/usb/misc/sisusbvga/sisusb.c | |||
@@ -3270,6 +3270,7 @@ static struct usb_device_id sisusb_table [] = { | |||
3270 | { USB_DEVICE(0x0711, 0x0900) }, | 3270 | { USB_DEVICE(0x0711, 0x0900) }, |
3271 | { USB_DEVICE(0x0711, 0x0901) }, | 3271 | { USB_DEVICE(0x0711, 0x0901) }, |
3272 | { USB_DEVICE(0x0711, 0x0902) }, | 3272 | { USB_DEVICE(0x0711, 0x0902) }, |
3273 | { USB_DEVICE(0x0711, 0x0903) }, | ||
3273 | { USB_DEVICE(0x0711, 0x0918) }, | 3274 | { USB_DEVICE(0x0711, 0x0918) }, |
3274 | { USB_DEVICE(0x182d, 0x021c) }, | 3275 | { USB_DEVICE(0x182d, 0x021c) }, |
3275 | { USB_DEVICE(0x182d, 0x0269) }, | 3276 | { USB_DEVICE(0x182d, 0x0269) }, |
diff --git a/drivers/usb/misc/vstusb.c b/drivers/usb/misc/vstusb.c index 8648470c81ca..63dff9ba73c5 100644 --- a/drivers/usb/misc/vstusb.c +++ b/drivers/usb/misc/vstusb.c | |||
@@ -620,7 +620,7 @@ static long vstusb_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | |||
620 | __func__); | 620 | __func__); |
621 | retval = -EFAULT; | 621 | retval = -EFAULT; |
622 | } else { | 622 | } else { |
623 | dev_dbg(&dev->dev, "%s: recv %d bytes from pipe %d\n", | 623 | dev_dbg(&dev->dev, "%s: recv %zd bytes from pipe %d\n", |
624 | __func__, usb_data.count, usb_data.pipe); | 624 | __func__, usb_data.count, usb_data.pipe); |
625 | } | 625 | } |
626 | 626 | ||
diff --git a/drivers/usb/mon/mon_bin.c b/drivers/usb/mon/mon_bin.c index c9de3f027aab..e06810aef2df 100644 --- a/drivers/usb/mon/mon_bin.c +++ b/drivers/usb/mon/mon_bin.c | |||
@@ -687,7 +687,10 @@ static ssize_t mon_bin_read(struct file *file, char __user *buf, | |||
687 | } | 687 | } |
688 | 688 | ||
689 | if (rp->b_read >= sizeof(struct mon_bin_hdr)) { | 689 | if (rp->b_read >= sizeof(struct mon_bin_hdr)) { |
690 | step_len = min(nbytes, (size_t)ep->len_cap); | 690 | step_len = ep->len_cap; |
691 | step_len -= rp->b_read - sizeof(struct mon_bin_hdr); | ||
692 | if (step_len > nbytes) | ||
693 | step_len = nbytes; | ||
691 | offset = rp->b_out + PKT_SIZE; | 694 | offset = rp->b_out + PKT_SIZE; |
692 | offset += rp->b_read - sizeof(struct mon_bin_hdr); | 695 | offset += rp->b_read - sizeof(struct mon_bin_hdr); |
693 | if (offset >= rp->b_size) | 696 | if (offset >= rp->b_size) |
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c index 4a35745b30be..5280dba9b1fb 100644 --- a/drivers/usb/musb/musb_core.c +++ b/drivers/usb/musb/musb_core.c | |||
@@ -114,8 +114,8 @@ | |||
114 | 114 | ||
115 | 115 | ||
116 | 116 | ||
117 | unsigned debug; | 117 | unsigned musb_debug; |
118 | module_param(debug, uint, S_IRUGO | S_IWUSR); | 118 | module_param(musb_debug, uint, S_IRUGO | S_IWUSR); |
119 | MODULE_PARM_DESC(debug, "Debug message level. Default = 0"); | 119 | MODULE_PARM_DESC(debug, "Debug message level. Default = 0"); |
120 | 120 | ||
121 | #define DRIVER_AUTHOR "Mentor Graphics, Texas Instruments, Nokia" | 121 | #define DRIVER_AUTHOR "Mentor Graphics, Texas Instruments, Nokia" |
@@ -2248,7 +2248,7 @@ static int __init musb_init(void) | |||
2248 | "host" | 2248 | "host" |
2249 | #endif | 2249 | #endif |
2250 | ", debug=%d\n", | 2250 | ", debug=%d\n", |
2251 | musb_driver_name, debug); | 2251 | musb_driver_name, musb_debug); |
2252 | return platform_driver_probe(&musb_driver, musb_probe); | 2252 | return platform_driver_probe(&musb_driver, musb_probe); |
2253 | } | 2253 | } |
2254 | 2254 | ||
diff --git a/drivers/usb/musb/musb_debug.h b/drivers/usb/musb/musb_debug.h index 4d2794441b15..9fc1db44c72c 100644 --- a/drivers/usb/musb/musb_debug.h +++ b/drivers/usb/musb/musb_debug.h | |||
@@ -48,11 +48,11 @@ | |||
48 | __func__, __LINE__ , ## args); \ | 48 | __func__, __LINE__ , ## args); \ |
49 | } } while (0) | 49 | } } while (0) |
50 | 50 | ||
51 | extern unsigned debug; | 51 | extern unsigned musb_debug; |
52 | 52 | ||
53 | static inline int _dbg_level(unsigned l) | 53 | static inline int _dbg_level(unsigned l) |
54 | { | 54 | { |
55 | return debug >= l; | 55 | return musb_debug >= l; |
56 | } | 56 | } |
57 | 57 | ||
58 | #define DBG(level, fmt, args...) xprintk(level, KERN_DEBUG, fmt, ## args) | 58 | #define DBG(level, fmt, args...) xprintk(level, KERN_DEBUG, fmt, ## args) |
diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c index 3133990f04ec..cc64462d4c4e 100644 --- a/drivers/usb/musb/musb_host.c +++ b/drivers/usb/musb/musb_host.c | |||
@@ -378,6 +378,19 @@ musb_giveback(struct musb_qh *qh, struct urb *urb, int status) | |||
378 | 378 | ||
379 | switch (qh->type) { | 379 | switch (qh->type) { |
380 | 380 | ||
381 | case USB_ENDPOINT_XFER_CONTROL: | ||
382 | case USB_ENDPOINT_XFER_BULK: | ||
383 | /* fifo policy for these lists, except that NAKing | ||
384 | * should rotate a qh to the end (for fairness). | ||
385 | */ | ||
386 | if (qh->mux == 1) { | ||
387 | head = qh->ring.prev; | ||
388 | list_del(&qh->ring); | ||
389 | kfree(qh); | ||
390 | qh = first_qh(head); | ||
391 | break; | ||
392 | } | ||
393 | |||
381 | case USB_ENDPOINT_XFER_ISOC: | 394 | case USB_ENDPOINT_XFER_ISOC: |
382 | case USB_ENDPOINT_XFER_INT: | 395 | case USB_ENDPOINT_XFER_INT: |
383 | /* this is where periodic bandwidth should be | 396 | /* this is where periodic bandwidth should be |
@@ -388,17 +401,6 @@ musb_giveback(struct musb_qh *qh, struct urb *urb, int status) | |||
388 | kfree(qh); | 401 | kfree(qh); |
389 | qh = NULL; | 402 | qh = NULL; |
390 | break; | 403 | break; |
391 | |||
392 | case USB_ENDPOINT_XFER_CONTROL: | ||
393 | case USB_ENDPOINT_XFER_BULK: | ||
394 | /* fifo policy for these lists, except that NAKing | ||
395 | * should rotate a qh to the end (for fairness). | ||
396 | */ | ||
397 | head = qh->ring.prev; | ||
398 | list_del(&qh->ring); | ||
399 | kfree(qh); | ||
400 | qh = first_qh(head); | ||
401 | break; | ||
402 | } | 404 | } |
403 | } | 405 | } |
404 | return qh; | 406 | return qh; |
@@ -1507,10 +1509,29 @@ void musb_host_rx(struct musb *musb, u8 epnum) | |||
1507 | musb_writew(hw_ep->regs, MUSB_RXCSR, val); | 1509 | musb_writew(hw_ep->regs, MUSB_RXCSR, val); |
1508 | 1510 | ||
1509 | #ifdef CONFIG_USB_INVENTRA_DMA | 1511 | #ifdef CONFIG_USB_INVENTRA_DMA |
1512 | if (usb_pipeisoc(pipe)) { | ||
1513 | struct usb_iso_packet_descriptor *d; | ||
1514 | |||
1515 | d = urb->iso_frame_desc + qh->iso_idx; | ||
1516 | d->actual_length = xfer_len; | ||
1517 | |||
1518 | /* even if there was an error, we did the dma | ||
1519 | * for iso_frame_desc->length | ||
1520 | */ | ||
1521 | if (d->status != EILSEQ && d->status != -EOVERFLOW) | ||
1522 | d->status = 0; | ||
1523 | |||
1524 | if (++qh->iso_idx >= urb->number_of_packets) | ||
1525 | done = true; | ||
1526 | else | ||
1527 | done = false; | ||
1528 | |||
1529 | } else { | ||
1510 | /* done if urb buffer is full or short packet is recd */ | 1530 | /* done if urb buffer is full or short packet is recd */ |
1511 | done = (urb->actual_length + xfer_len >= | 1531 | done = (urb->actual_length + xfer_len >= |
1512 | urb->transfer_buffer_length | 1532 | urb->transfer_buffer_length |
1513 | || dma->actual_len < qh->maxpacket); | 1533 | || dma->actual_len < qh->maxpacket); |
1534 | } | ||
1514 | 1535 | ||
1515 | /* send IN token for next packet, without AUTOREQ */ | 1536 | /* send IN token for next packet, without AUTOREQ */ |
1516 | if (!done) { | 1537 | if (!done) { |
@@ -1547,7 +1568,8 @@ void musb_host_rx(struct musb *musb, u8 epnum) | |||
1547 | if (dma) { | 1568 | if (dma) { |
1548 | struct dma_controller *c; | 1569 | struct dma_controller *c; |
1549 | u16 rx_count; | 1570 | u16 rx_count; |
1550 | int ret; | 1571 | int ret, length; |
1572 | dma_addr_t buf; | ||
1551 | 1573 | ||
1552 | rx_count = musb_readw(epio, MUSB_RXCOUNT); | 1574 | rx_count = musb_readw(epio, MUSB_RXCOUNT); |
1553 | 1575 | ||
@@ -1560,6 +1582,35 @@ void musb_host_rx(struct musb *musb, u8 epnum) | |||
1560 | 1582 | ||
1561 | c = musb->dma_controller; | 1583 | c = musb->dma_controller; |
1562 | 1584 | ||
1585 | if (usb_pipeisoc(pipe)) { | ||
1586 | int status = 0; | ||
1587 | struct usb_iso_packet_descriptor *d; | ||
1588 | |||
1589 | d = urb->iso_frame_desc + qh->iso_idx; | ||
1590 | |||
1591 | if (iso_err) { | ||
1592 | status = -EILSEQ; | ||
1593 | urb->error_count++; | ||
1594 | } | ||
1595 | if (rx_count > d->length) { | ||
1596 | if (status == 0) { | ||
1597 | status = -EOVERFLOW; | ||
1598 | urb->error_count++; | ||
1599 | } | ||
1600 | DBG(2, "** OVERFLOW %d into %d\n",\ | ||
1601 | rx_count, d->length); | ||
1602 | |||
1603 | length = d->length; | ||
1604 | } else | ||
1605 | length = rx_count; | ||
1606 | d->status = status; | ||
1607 | buf = urb->transfer_dma + d->offset; | ||
1608 | } else { | ||
1609 | length = rx_count; | ||
1610 | buf = urb->transfer_dma + | ||
1611 | urb->actual_length; | ||
1612 | } | ||
1613 | |||
1563 | dma->desired_mode = 0; | 1614 | dma->desired_mode = 0; |
1564 | #ifdef USE_MODE1 | 1615 | #ifdef USE_MODE1 |
1565 | /* because of the issue below, mode 1 will | 1616 | /* because of the issue below, mode 1 will |
@@ -1571,6 +1622,12 @@ void musb_host_rx(struct musb *musb, u8 epnum) | |||
1571 | urb->actual_length) | 1622 | urb->actual_length) |
1572 | > qh->maxpacket) | 1623 | > qh->maxpacket) |
1573 | dma->desired_mode = 1; | 1624 | dma->desired_mode = 1; |
1625 | if (rx_count < hw_ep->max_packet_sz_rx) { | ||
1626 | length = rx_count; | ||
1627 | dma->bDesiredMode = 0; | ||
1628 | } else { | ||
1629 | length = urb->transfer_buffer_length; | ||
1630 | } | ||
1574 | #endif | 1631 | #endif |
1575 | 1632 | ||
1576 | /* Disadvantage of using mode 1: | 1633 | /* Disadvantage of using mode 1: |
@@ -1608,12 +1665,7 @@ void musb_host_rx(struct musb *musb, u8 epnum) | |||
1608 | */ | 1665 | */ |
1609 | ret = c->channel_program( | 1666 | ret = c->channel_program( |
1610 | dma, qh->maxpacket, | 1667 | dma, qh->maxpacket, |
1611 | dma->desired_mode, | 1668 | dma->desired_mode, buf, length); |
1612 | urb->transfer_dma | ||
1613 | + urb->actual_length, | ||
1614 | (dma->desired_mode == 0) | ||
1615 | ? rx_count | ||
1616 | : urb->transfer_buffer_length); | ||
1617 | 1669 | ||
1618 | if (!ret) { | 1670 | if (!ret) { |
1619 | c->channel_release(dma); | 1671 | c->channel_release(dma); |
@@ -1631,19 +1683,6 @@ void musb_host_rx(struct musb *musb, u8 epnum) | |||
1631 | } | 1683 | } |
1632 | } | 1684 | } |
1633 | 1685 | ||
1634 | if (dma && usb_pipeisoc(pipe)) { | ||
1635 | struct usb_iso_packet_descriptor *d; | ||
1636 | int iso_stat = status; | ||
1637 | |||
1638 | d = urb->iso_frame_desc + qh->iso_idx; | ||
1639 | d->actual_length += xfer_len; | ||
1640 | if (iso_err) { | ||
1641 | iso_stat = -EILSEQ; | ||
1642 | urb->error_count++; | ||
1643 | } | ||
1644 | d->status = iso_stat; | ||
1645 | } | ||
1646 | |||
1647 | finish: | 1686 | finish: |
1648 | urb->actual_length += xfer_len; | 1687 | urb->actual_length += xfer_len; |
1649 | qh->offset += xfer_len; | 1688 | qh->offset += xfer_len; |
@@ -1671,22 +1710,9 @@ static int musb_schedule( | |||
1671 | struct list_head *head = NULL; | 1710 | struct list_head *head = NULL; |
1672 | 1711 | ||
1673 | /* use fixed hardware for control and bulk */ | 1712 | /* use fixed hardware for control and bulk */ |
1674 | switch (qh->type) { | 1713 | if (qh->type == USB_ENDPOINT_XFER_CONTROL) { |
1675 | case USB_ENDPOINT_XFER_CONTROL: | ||
1676 | head = &musb->control; | 1714 | head = &musb->control; |
1677 | hw_ep = musb->control_ep; | 1715 | hw_ep = musb->control_ep; |
1678 | break; | ||
1679 | case USB_ENDPOINT_XFER_BULK: | ||
1680 | hw_ep = musb->bulk_ep; | ||
1681 | if (is_in) | ||
1682 | head = &musb->in_bulk; | ||
1683 | else | ||
1684 | head = &musb->out_bulk; | ||
1685 | break; | ||
1686 | } | ||
1687 | if (head) { | ||
1688 | idle = list_empty(head); | ||
1689 | list_add_tail(&qh->ring, head); | ||
1690 | goto success; | 1716 | goto success; |
1691 | } | 1717 | } |
1692 | 1718 | ||
@@ -1725,19 +1751,34 @@ static int musb_schedule( | |||
1725 | else | 1751 | else |
1726 | diff = hw_ep->max_packet_sz_tx - qh->maxpacket; | 1752 | diff = hw_ep->max_packet_sz_tx - qh->maxpacket; |
1727 | 1753 | ||
1728 | if (diff > 0 && best_diff > diff) { | 1754 | if (diff >= 0 && best_diff > diff) { |
1729 | best_diff = diff; | 1755 | best_diff = diff; |
1730 | best_end = epnum; | 1756 | best_end = epnum; |
1731 | } | 1757 | } |
1732 | } | 1758 | } |
1733 | if (best_end < 0) | 1759 | /* use bulk reserved ep1 if no other ep is free */ |
1760 | if (best_end < 0 && qh->type == USB_ENDPOINT_XFER_BULK) { | ||
1761 | hw_ep = musb->bulk_ep; | ||
1762 | if (is_in) | ||
1763 | head = &musb->in_bulk; | ||
1764 | else | ||
1765 | head = &musb->out_bulk; | ||
1766 | goto success; | ||
1767 | } else if (best_end < 0) { | ||
1734 | return -ENOSPC; | 1768 | return -ENOSPC; |
1769 | } | ||
1735 | 1770 | ||
1736 | idle = 1; | 1771 | idle = 1; |
1772 | qh->mux = 0; | ||
1737 | hw_ep = musb->endpoints + best_end; | 1773 | hw_ep = musb->endpoints + best_end; |
1738 | musb->periodic[best_end] = qh; | 1774 | musb->periodic[best_end] = qh; |
1739 | DBG(4, "qh %p periodic slot %d\n", qh, best_end); | 1775 | DBG(4, "qh %p periodic slot %d\n", qh, best_end); |
1740 | success: | 1776 | success: |
1777 | if (head) { | ||
1778 | idle = list_empty(head); | ||
1779 | list_add_tail(&qh->ring, head); | ||
1780 | qh->mux = 1; | ||
1781 | } | ||
1741 | qh->hw_ep = hw_ep; | 1782 | qh->hw_ep = hw_ep; |
1742 | qh->hep->hcpriv = qh; | 1783 | qh->hep->hcpriv = qh; |
1743 | if (idle) | 1784 | if (idle) |
@@ -2015,11 +2056,13 @@ static int musb_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) | |||
2015 | sched = &musb->control; | 2056 | sched = &musb->control; |
2016 | break; | 2057 | break; |
2017 | case USB_ENDPOINT_XFER_BULK: | 2058 | case USB_ENDPOINT_XFER_BULK: |
2018 | if (usb_pipein(urb->pipe)) | 2059 | if (qh->mux == 1) { |
2019 | sched = &musb->in_bulk; | 2060 | if (usb_pipein(urb->pipe)) |
2020 | else | 2061 | sched = &musb->in_bulk; |
2021 | sched = &musb->out_bulk; | 2062 | else |
2022 | break; | 2063 | sched = &musb->out_bulk; |
2064 | break; | ||
2065 | } | ||
2023 | default: | 2066 | default: |
2024 | /* REVISIT when we get a schedule tree, periodic | 2067 | /* REVISIT when we get a schedule tree, periodic |
2025 | * transfers won't always be at the head of a | 2068 | * transfers won't always be at the head of a |
@@ -2067,11 +2110,13 @@ musb_h_disable(struct usb_hcd *hcd, struct usb_host_endpoint *hep) | |||
2067 | sched = &musb->control; | 2110 | sched = &musb->control; |
2068 | break; | 2111 | break; |
2069 | case USB_ENDPOINT_XFER_BULK: | 2112 | case USB_ENDPOINT_XFER_BULK: |
2070 | if (is_in) | 2113 | if (qh->mux == 1) { |
2071 | sched = &musb->in_bulk; | 2114 | if (is_in) |
2072 | else | 2115 | sched = &musb->in_bulk; |
2073 | sched = &musb->out_bulk; | 2116 | else |
2074 | break; | 2117 | sched = &musb->out_bulk; |
2118 | break; | ||
2119 | } | ||
2075 | default: | 2120 | default: |
2076 | /* REVISIT when we get a schedule tree, periodic transfers | 2121 | /* REVISIT when we get a schedule tree, periodic transfers |
2077 | * won't always be at the head of a singleton queue... | 2122 | * won't always be at the head of a singleton queue... |
diff --git a/drivers/usb/musb/musb_host.h b/drivers/usb/musb/musb_host.h index 77bcdb9d5b32..0b7fbcd21963 100644 --- a/drivers/usb/musb/musb_host.h +++ b/drivers/usb/musb/musb_host.h | |||
@@ -53,6 +53,7 @@ struct musb_qh { | |||
53 | 53 | ||
54 | struct list_head ring; /* of musb_qh */ | 54 | struct list_head ring; /* of musb_qh */ |
55 | /* struct musb_qh *next; */ /* for periodic tree */ | 55 | /* struct musb_qh *next; */ /* for periodic tree */ |
56 | u8 mux; /* qh multiplexed to hw_ep */ | ||
56 | 57 | ||
57 | unsigned offset; /* in urb->transfer_buffer */ | 58 | unsigned offset; /* in urb->transfer_buffer */ |
58 | unsigned segsize; /* current xfer fragment */ | 59 | unsigned segsize; /* current xfer fragment */ |
diff --git a/drivers/usb/musb/omap2430.c b/drivers/usb/musb/omap2430.c index 9d2dcb121c5e..ce6c162920f7 100644 --- a/drivers/usb/musb/omap2430.c +++ b/drivers/usb/musb/omap2430.c | |||
@@ -53,7 +53,9 @@ static void musb_do_idle(unsigned long _musb) | |||
53 | { | 53 | { |
54 | struct musb *musb = (void *)_musb; | 54 | struct musb *musb = (void *)_musb; |
55 | unsigned long flags; | 55 | unsigned long flags; |
56 | #ifdef CONFIG_USB_MUSB_HDRC_HCD | ||
56 | u8 power; | 57 | u8 power; |
58 | #endif | ||
57 | u8 devctl; | 59 | u8 devctl; |
58 | 60 | ||
59 | devctl = musb_readb(musb->mregs, MUSB_DEVCTL); | 61 | devctl = musb_readb(musb->mregs, MUSB_DEVCTL); |
diff --git a/drivers/usb/musb/tusb6010.c b/drivers/usb/musb/tusb6010.c index b73b036f3d77..ee8fca92a4ac 100644 --- a/drivers/usb/musb/tusb6010.c +++ b/drivers/usb/musb/tusb6010.c | |||
@@ -605,7 +605,7 @@ void musb_platform_set_mode(struct musb *musb, u8 musb_mode) | |||
605 | 605 | ||
606 | if (musb->board_mode != MUSB_OTG) { | 606 | if (musb->board_mode != MUSB_OTG) { |
607 | ERR("Changing mode currently only supported in OTG mode\n"); | 607 | ERR("Changing mode currently only supported in OTG mode\n"); |
608 | return; | 608 | return -EINVAL; |
609 | } | 609 | } |
610 | 610 | ||
611 | otg_stat = musb_readl(tbase, TUSB_DEV_OTG_STAT); | 611 | otg_stat = musb_readl(tbase, TUSB_DEV_OTG_STAT); |
diff --git a/drivers/usb/serial/console.c b/drivers/usb/serial/console.c index 5b20de130e08..5b95009d2fbb 100644 --- a/drivers/usb/serial/console.c +++ b/drivers/usb/serial/console.c | |||
@@ -135,6 +135,7 @@ static int usb_console_setup(struct console *co, char *options) | |||
135 | err("no more memory"); | 135 | err("no more memory"); |
136 | goto reset_open_count; | 136 | goto reset_open_count; |
137 | } | 137 | } |
138 | kref_init(&tty->kref); | ||
138 | termios = kzalloc(sizeof(*termios), GFP_KERNEL); | 139 | termios = kzalloc(sizeof(*termios), GFP_KERNEL); |
139 | if (!termios) { | 140 | if (!termios) { |
140 | retval = -ENOMEM; | 141 | retval = -ENOMEM; |
diff --git a/drivers/usb/serial/cp2101.c b/drivers/usb/serial/cp2101.c index 8008d0bc80ad..cfaf1f085535 100644 --- a/drivers/usb/serial/cp2101.c +++ b/drivers/usb/serial/cp2101.c | |||
@@ -56,6 +56,7 @@ static void cp2101_shutdown(struct usb_serial *); | |||
56 | static int debug; | 56 | static int debug; |
57 | 57 | ||
58 | static struct usb_device_id id_table [] = { | 58 | static struct usb_device_id id_table [] = { |
59 | { USB_DEVICE(0x0471, 0x066A) }, /* AKTAKOM ACE-1001 cable */ | ||
59 | { USB_DEVICE(0x0489, 0xE000) }, /* Pirelli Broadband S.p.A, DP-L10 SIP/GSM Mobile */ | 60 | { USB_DEVICE(0x0489, 0xE000) }, /* Pirelli Broadband S.p.A, DP-L10 SIP/GSM Mobile */ |
60 | { USB_DEVICE(0x08e6, 0x5501) }, /* Gemalto Prox-PU/CU contactless smartcard reader */ | 61 | { USB_DEVICE(0x08e6, 0x5501) }, /* Gemalto Prox-PU/CU contactless smartcard reader */ |
61 | { USB_DEVICE(0x0FCF, 0x1003) }, /* Dynastream ANT development board */ | 62 | { USB_DEVICE(0x0FCF, 0x1003) }, /* Dynastream ANT development board */ |
@@ -67,6 +68,7 @@ static struct usb_device_id id_table [] = { | |||
67 | { USB_DEVICE(0x10C4, 0x800A) }, /* SPORTident BSM7-D-USB main station */ | 68 | { USB_DEVICE(0x10C4, 0x800A) }, /* SPORTident BSM7-D-USB main station */ |
68 | { USB_DEVICE(0x10C4, 0x803B) }, /* Pololu USB-serial converter */ | 69 | { USB_DEVICE(0x10C4, 0x803B) }, /* Pololu USB-serial converter */ |
69 | { USB_DEVICE(0x10C4, 0x8053) }, /* Enfora EDG1228 */ | 70 | { USB_DEVICE(0x10C4, 0x8053) }, /* Enfora EDG1228 */ |
71 | { USB_DEVICE(0x10C4, 0x8054) }, /* Enfora GSM2228 */ | ||
70 | { USB_DEVICE(0x10C4, 0x8066) }, /* Argussoft In-System Programmer */ | 72 | { USB_DEVICE(0x10C4, 0x8066) }, /* Argussoft In-System Programmer */ |
71 | { USB_DEVICE(0x10C4, 0x807A) }, /* Crumb128 board */ | 73 | { USB_DEVICE(0x10C4, 0x807A) }, /* Crumb128 board */ |
72 | { USB_DEVICE(0x10C4, 0x80CA) }, /* Degree Controls Inc */ | 74 | { USB_DEVICE(0x10C4, 0x80CA) }, /* Degree Controls Inc */ |
@@ -85,6 +87,7 @@ static struct usb_device_id id_table [] = { | |||
85 | { USB_DEVICE(0x10C4, 0x8218) }, /* Lipowsky Industrie Elektronik GmbH, HARP-1 */ | 87 | { USB_DEVICE(0x10C4, 0x8218) }, /* Lipowsky Industrie Elektronik GmbH, HARP-1 */ |
86 | { USB_DEVICE(0x10c4, 0x8293) }, /* Telegesys ETRX2USB */ | 88 | { USB_DEVICE(0x10c4, 0x8293) }, /* Telegesys ETRX2USB */ |
87 | { USB_DEVICE(0x10C4, 0x8341) }, /* Siemens MC35PU GPRS Modem */ | 89 | { USB_DEVICE(0x10C4, 0x8341) }, /* Siemens MC35PU GPRS Modem */ |
90 | { USB_DEVICE(0x10C4, 0x83A8) }, /* Amber Wireless AMB2560 */ | ||
88 | { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */ | 91 | { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */ |
89 | { USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */ | 92 | { USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */ |
90 | { USB_DEVICE(0x10C4, 0xF001) }, /* Elan Digital Systems USBscope50 */ | 93 | { USB_DEVICE(0x10C4, 0xF001) }, /* Elan Digital Systems USBscope50 */ |
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index bd07eaa300b9..809697b3c7fc 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
@@ -160,6 +160,11 @@ static int option_send_setup(struct tty_struct *tty, struct usb_serial_port *po | |||
160 | 160 | ||
161 | #define NOVATELWIRELESS_VENDOR_ID 0x1410 | 161 | #define NOVATELWIRELESS_VENDOR_ID 0x1410 |
162 | 162 | ||
163 | /* YISO PRODUCTS */ | ||
164 | |||
165 | #define YISO_VENDOR_ID 0x0EAB | ||
166 | #define YISO_PRODUCT_U893 0xC893 | ||
167 | |||
163 | /* MERLIN EVDO PRODUCTS */ | 168 | /* MERLIN EVDO PRODUCTS */ |
164 | #define NOVATELWIRELESS_PRODUCT_V640 0x1100 | 169 | #define NOVATELWIRELESS_PRODUCT_V640 0x1100 |
165 | #define NOVATELWIRELESS_PRODUCT_V620 0x1110 | 170 | #define NOVATELWIRELESS_PRODUCT_V620 0x1110 |
@@ -219,6 +224,7 @@ static int option_send_setup(struct tty_struct *tty, struct usb_serial_port *po | |||
219 | #define ONDA_VENDOR_ID 0x19d2 | 224 | #define ONDA_VENDOR_ID 0x19d2 |
220 | #define ONDA_PRODUCT_MSA501HS 0x0001 | 225 | #define ONDA_PRODUCT_MSA501HS 0x0001 |
221 | #define ONDA_PRODUCT_ET502HS 0x0002 | 226 | #define ONDA_PRODUCT_ET502HS 0x0002 |
227 | #define ONDA_PRODUCT_MT503HS 0x0200 | ||
222 | 228 | ||
223 | #define BANDRICH_VENDOR_ID 0x1A8D | 229 | #define BANDRICH_VENDOR_ID 0x1A8D |
224 | #define BANDRICH_PRODUCT_C100_1 0x1002 | 230 | #define BANDRICH_PRODUCT_C100_1 0x1002 |
@@ -408,6 +414,41 @@ static struct usb_device_id option_ids[] = { | |||
408 | { USB_DEVICE(AXESSTEL_VENDOR_ID, AXESSTEL_PRODUCT_MV110H) }, | 414 | { USB_DEVICE(AXESSTEL_VENDOR_ID, AXESSTEL_PRODUCT_MV110H) }, |
409 | { USB_DEVICE(ONDA_VENDOR_ID, ONDA_PRODUCT_MSA501HS) }, | 415 | { USB_DEVICE(ONDA_VENDOR_ID, ONDA_PRODUCT_MSA501HS) }, |
410 | { USB_DEVICE(ONDA_VENDOR_ID, ONDA_PRODUCT_ET502HS) }, | 416 | { USB_DEVICE(ONDA_VENDOR_ID, ONDA_PRODUCT_ET502HS) }, |
417 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0003) }, | ||
418 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0004) }, | ||
419 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0005) }, | ||
420 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0006) }, | ||
421 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0007) }, | ||
422 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0008) }, | ||
423 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0009) }, | ||
424 | { USB_DEVICE(ONDA_VENDOR_ID, 0x000a) }, | ||
425 | { USB_DEVICE(ONDA_VENDOR_ID, 0x000b) }, | ||
426 | { USB_DEVICE(ONDA_VENDOR_ID, 0x000c) }, | ||
427 | { USB_DEVICE(ONDA_VENDOR_ID, 0x000d) }, | ||
428 | { USB_DEVICE(ONDA_VENDOR_ID, 0x000e) }, | ||
429 | { USB_DEVICE(ONDA_VENDOR_ID, 0x000f) }, | ||
430 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0010) }, | ||
431 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0011) }, | ||
432 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0012) }, | ||
433 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0013) }, | ||
434 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0014) }, | ||
435 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0015) }, | ||
436 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0016) }, | ||
437 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0017) }, | ||
438 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0018) }, | ||
439 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0019) }, | ||
440 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0020) }, | ||
441 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0021) }, | ||
442 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0022) }, | ||
443 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0023) }, | ||
444 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0024) }, | ||
445 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0025) }, | ||
446 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0026) }, | ||
447 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0027) }, | ||
448 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0028) }, | ||
449 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0029) }, | ||
450 | { USB_DEVICE(ONDA_VENDOR_ID, ONDA_PRODUCT_MT503HS) }, | ||
451 | { USB_DEVICE(YISO_VENDOR_ID, YISO_PRODUCT_U893) }, | ||
411 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_1) }, | 452 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_1) }, |
412 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_2) }, | 453 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_2) }, |
413 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1004) }, | 454 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1004) }, |
diff --git a/drivers/usb/storage/Kconfig b/drivers/usb/storage/Kconfig index 3d9249632ae1..c68b738900bd 100644 --- a/drivers/usb/storage/Kconfig +++ b/drivers/usb/storage/Kconfig | |||
@@ -2,8 +2,8 @@ | |||
2 | # USB Storage driver configuration | 2 | # USB Storage driver configuration |
3 | # | 3 | # |
4 | 4 | ||
5 | comment "NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'" | 5 | comment "NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed;" |
6 | comment "may also be needed; see USB_STORAGE Help for more information" | 6 | comment "see USB_STORAGE Help for more information" |
7 | depends on USB | 7 | depends on USB |
8 | 8 | ||
9 | config USB_STORAGE | 9 | config USB_STORAGE |
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index fb9e20e624c1..e61f2bfc64ad 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h | |||
@@ -167,6 +167,13 @@ UNUSUAL_DEV( 0x0421, 0x005d, 0x0001, 0x0600, | |||
167 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 167 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
168 | US_FL_FIX_CAPACITY ), | 168 | US_FL_FIX_CAPACITY ), |
169 | 169 | ||
170 | /* Patch for Nokia 5310 capacity */ | ||
171 | UNUSUAL_DEV( 0x0421, 0x006a, 0x0000, 0x0591, | ||
172 | "Nokia", | ||
173 | "5310", | ||
174 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
175 | US_FL_FIX_CAPACITY ), | ||
176 | |||
170 | /* Reported by Mario Rettig <mariorettig@web.de> */ | 177 | /* Reported by Mario Rettig <mariorettig@web.de> */ |
171 | UNUSUAL_DEV( 0x0421, 0x042e, 0x0100, 0x0100, | 178 | UNUSUAL_DEV( 0x0421, 0x042e, 0x0100, 0x0100, |
172 | "Nokia", | 179 | "Nokia", |
@@ -233,14 +240,14 @@ UNUSUAL_DEV( 0x0421, 0x0495, 0x0370, 0x0370, | |||
233 | US_FL_MAX_SECTORS_64 ), | 240 | US_FL_MAX_SECTORS_64 ), |
234 | 241 | ||
235 | /* Reported by Cedric Godin <cedric@belbone.be> */ | 242 | /* Reported by Cedric Godin <cedric@belbone.be> */ |
236 | UNUSUAL_DEV( 0x0421, 0x04b9, 0x0551, 0x0551, | 243 | UNUSUAL_DEV( 0x0421, 0x04b9, 0x0500, 0x0551, |
237 | "Nokia", | 244 | "Nokia", |
238 | "5300", | 245 | "5300", |
239 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 246 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
240 | US_FL_FIX_CAPACITY ), | 247 | US_FL_FIX_CAPACITY ), |
241 | 248 | ||
242 | /* Reported by Richard Nauber <RichardNauber@web.de> */ | 249 | /* Reported by Richard Nauber <RichardNauber@web.de> */ |
243 | UNUSUAL_DEV( 0x0421, 0x04fa, 0x0601, 0x0601, | 250 | UNUSUAL_DEV( 0x0421, 0x04fa, 0x0550, 0x0660, |
244 | "Nokia", | 251 | "Nokia", |
245 | "6300", | 252 | "6300", |
246 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 253 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
@@ -253,6 +260,14 @@ UNUSUAL_DEV( 0x0421, 0x006a, 0x0000, 0x0591, | |||
253 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 260 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
254 | US_FL_FIX_CAPACITY ), | 261 | US_FL_FIX_CAPACITY ), |
255 | 262 | ||
263 | /* Submitted by Ricky Wong Yung Fei <evilbladewarrior@gmail.com> */ | ||
264 | /* Nokia 7610 Supernova - Too many sectors reported in usb storage mode */ | ||
265 | UNUSUAL_DEV( 0x0421, 0x00f5, 0x0000, 0x0470, | ||
266 | "Nokia", | ||
267 | "7610 Supernova", | ||
268 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
269 | US_FL_FIX_CAPACITY ), | ||
270 | |||
256 | /* Reported by Olaf Hering <olh@suse.de> from novell bug #105878 */ | 271 | /* Reported by Olaf Hering <olh@suse.de> from novell bug #105878 */ |
257 | UNUSUAL_DEV( 0x0424, 0x0fdc, 0x0210, 0x0210, | 272 | UNUSUAL_DEV( 0x0424, 0x0fdc, 0x0210, 0x0210, |
258 | "SMSC", | 273 | "SMSC", |
@@ -303,6 +318,18 @@ UNUSUAL_DEV( 0x045a, 0x5210, 0x0101, 0x0101, | |||
303 | US_SC_SCSI, US_PR_KARMA, rio_karma_init, 0), | 318 | US_SC_SCSI, US_PR_KARMA, rio_karma_init, 0), |
304 | #endif | 319 | #endif |
305 | 320 | ||
321 | /* Reported by Tamas Kerecsen <kerecsen@bigfoot.com> | ||
322 | * Obviously the PROM has not been customized by the VAR; | ||
323 | * the Vendor and Product string descriptors are: | ||
324 | * Generic Mass Storage (PROTOTYPE--Remember to change idVendor) | ||
325 | * Generic Manufacturer (PROTOTYPE--Remember to change idVendor) | ||
326 | */ | ||
327 | UNUSUAL_DEV( 0x045e, 0xffff, 0x0000, 0x0000, | ||
328 | "Mitac", | ||
329 | "GPS", | ||
330 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
331 | US_FL_MAX_SECTORS_64 ), | ||
332 | |||
306 | /* | 333 | /* |
307 | * This virtual floppy is found in Sun equipment (x4600, x4200m2, etc.) | 334 | * This virtual floppy is found in Sun equipment (x4600, x4200m2, etc.) |
308 | * Reported by Pete Zaitcev <zaitcev@redhat.com> | 335 | * Reported by Pete Zaitcev <zaitcev@redhat.com> |
@@ -362,6 +389,13 @@ UNUSUAL_DEV( 0x04b0, 0x0401, 0x0200, 0x0200, | |||
362 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 389 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
363 | US_FL_FIX_CAPACITY), | 390 | US_FL_FIX_CAPACITY), |
364 | 391 | ||
392 | /* Reported by Tobias Kunze Briseno <t-linux@fictive.com> */ | ||
393 | UNUSUAL_DEV( 0x04b0, 0x0403, 0x0200, 0x0200, | ||
394 | "NIKON", | ||
395 | "NIKON DSC D2H", | ||
396 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
397 | US_FL_FIX_CAPACITY), | ||
398 | |||
365 | /* Reported by Milinevsky Dmitry <niam.niam@gmail.com> */ | 399 | /* Reported by Milinevsky Dmitry <niam.niam@gmail.com> */ |
366 | UNUSUAL_DEV( 0x04b0, 0x0409, 0x0100, 0x0100, | 400 | UNUSUAL_DEV( 0x04b0, 0x0409, 0x0100, 0x0100, |
367 | "NIKON", | 401 | "NIKON", |
@@ -418,6 +452,13 @@ UNUSUAL_DEV( 0x04b0, 0x0417, 0x0100, 0x0100, | |||
418 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 452 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
419 | US_FL_FIX_CAPACITY), | 453 | US_FL_FIX_CAPACITY), |
420 | 454 | ||
455 | /* Reported by paul ready <lxtwin@homecall.co.uk> */ | ||
456 | UNUSUAL_DEV( 0x04b0, 0x0419, 0x0100, 0x0200, | ||
457 | "NIKON", | ||
458 | "NIKON DSC D300", | ||
459 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
460 | US_FL_FIX_CAPACITY), | ||
461 | |||
421 | /* Reported by Doug Maxey (dwm@austin.ibm.com) */ | 462 | /* Reported by Doug Maxey (dwm@austin.ibm.com) */ |
422 | UNUSUAL_DEV( 0x04b3, 0x4001, 0x0110, 0x0110, | 463 | UNUSUAL_DEV( 0x04b3, 0x4001, 0x0110, 0x0110, |
423 | "IBM", | 464 | "IBM", |
@@ -1258,6 +1299,13 @@ UNUSUAL_DEV( 0x0839, 0x000a, 0x0001, 0x0001, | |||
1258 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 1299 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
1259 | US_FL_FIX_INQUIRY), | 1300 | US_FL_FIX_INQUIRY), |
1260 | 1301 | ||
1302 | /* Reported by Luciano Rocha <luciano@eurotux.com> */ | ||
1303 | UNUSUAL_DEV( 0x0840, 0x0082, 0x0001, 0x0001, | ||
1304 | "Argosy", | ||
1305 | "Storage", | ||
1306 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
1307 | US_FL_FIX_CAPACITY), | ||
1308 | |||
1261 | /* Entry and supporting patch by Theodore Kilgore <kilgota@auburn.edu>. | 1309 | /* Entry and supporting patch by Theodore Kilgore <kilgota@auburn.edu>. |
1262 | * Flag will support Bulk devices which use a standards-violating 32-byte | 1310 | * Flag will support Bulk devices which use a standards-violating 32-byte |
1263 | * Command Block Wrapper. Here, the "DC2MEGA" cameras (several brands) with | 1311 | * Command Block Wrapper. Here, the "DC2MEGA" cameras (several brands) with |
diff --git a/drivers/video/atmel_lcdfb.c b/drivers/video/atmel_lcdfb.c index f8d0a57a07cb..9a577a800db5 100644 --- a/drivers/video/atmel_lcdfb.c +++ b/drivers/video/atmel_lcdfb.c | |||
@@ -132,7 +132,7 @@ static void init_backlight(struct atmel_lcdfb_info *sinfo) | |||
132 | 132 | ||
133 | bl = backlight_device_register("backlight", &sinfo->pdev->dev, | 133 | bl = backlight_device_register("backlight", &sinfo->pdev->dev, |
134 | sinfo, &atmel_lcdc_bl_ops); | 134 | sinfo, &atmel_lcdc_bl_ops); |
135 | if (IS_ERR(sinfo->backlight)) { | 135 | if (IS_ERR(bl)) { |
136 | dev_err(&sinfo->pdev->dev, "error %ld on backlight register\n", | 136 | dev_err(&sinfo->pdev->dev, "error %ld on backlight register\n", |
137 | PTR_ERR(bl)); | 137 | PTR_ERR(bl)); |
138 | return; | 138 | return; |
diff --git a/drivers/video/aty/radeon_accel.c b/drivers/video/aty/radeon_accel.c index 8718f7349d6b..a547e5d4c8bf 100644 --- a/drivers/video/aty/radeon_accel.c +++ b/drivers/video/aty/radeon_accel.c | |||
@@ -174,12 +174,12 @@ static void radeonfb_prim_imageblit(struct radeonfb_info *rinfo, | |||
174 | const struct fb_image *image, | 174 | const struct fb_image *image, |
175 | u32 fg, u32 bg) | 175 | u32 fg, u32 bg) |
176 | { | 176 | { |
177 | unsigned int src_bytes, dwords; | 177 | unsigned int dwords; |
178 | u32 *bits; | 178 | u32 *bits; |
179 | 179 | ||
180 | radeonfb_set_creg(rinfo, DP_GUI_MASTER_CNTL, &rinfo->dp_gui_mc_cache, | 180 | radeonfb_set_creg(rinfo, DP_GUI_MASTER_CNTL, &rinfo->dp_gui_mc_cache, |
181 | rinfo->dp_gui_mc_base | | 181 | rinfo->dp_gui_mc_base | |
182 | GMC_BRUSH_NONE | | 182 | GMC_BRUSH_NONE | GMC_DST_CLIP_LEAVE | |
183 | GMC_SRC_DATATYPE_MONO_FG_BG | | 183 | GMC_SRC_DATATYPE_MONO_FG_BG | |
184 | ROP3_S | | 184 | ROP3_S | |
185 | GMC_BYTE_ORDER_MSB_TO_LSB | | 185 | GMC_BYTE_ORDER_MSB_TO_LSB | |
@@ -189,9 +189,6 @@ static void radeonfb_prim_imageblit(struct radeonfb_info *rinfo, | |||
189 | radeonfb_set_creg(rinfo, DP_SRC_FRGD_CLR, &rinfo->dp_src_fg_cache, fg); | 189 | radeonfb_set_creg(rinfo, DP_SRC_FRGD_CLR, &rinfo->dp_src_fg_cache, fg); |
190 | radeonfb_set_creg(rinfo, DP_SRC_BKGD_CLR, &rinfo->dp_src_bg_cache, bg); | 190 | radeonfb_set_creg(rinfo, DP_SRC_BKGD_CLR, &rinfo->dp_src_bg_cache, bg); |
191 | 191 | ||
192 | radeon_fifo_wait(rinfo, 1); | ||
193 | OUTREG(DST_Y_X, (image->dy << 16) | image->dx); | ||
194 | |||
195 | /* Ensure the dst cache is flushed and the engine idle before | 192 | /* Ensure the dst cache is flushed and the engine idle before |
196 | * issuing the operation. | 193 | * issuing the operation. |
197 | * | 194 | * |
@@ -205,13 +202,19 @@ static void radeonfb_prim_imageblit(struct radeonfb_info *rinfo, | |||
205 | 202 | ||
206 | /* X here pads width to a multiple of 32 and uses the clipper to | 203 | /* X here pads width to a multiple of 32 and uses the clipper to |
207 | * adjust the result. Is that really necessary ? Things seem to | 204 | * adjust the result. Is that really necessary ? Things seem to |
208 | * work ok for me without that and the doco doesn't seem to imply | 205 | * work ok for me without that and the doco doesn't seem to imply] |
209 | * there is such a restriction. | 206 | * there is such a restriction. |
210 | */ | 207 | */ |
211 | OUTREG(DST_WIDTH_HEIGHT, (image->width << 16) | image->height); | 208 | radeon_fifo_wait(rinfo, 4); |
209 | OUTREG(SC_TOP_LEFT, (image->dy << 16) | image->dx); | ||
210 | OUTREG(SC_BOTTOM_RIGHT, ((image->dy + image->height) << 16) | | ||
211 | (image->dx + image->width)); | ||
212 | OUTREG(DST_Y_X, (image->dy << 16) | image->dx); | ||
213 | |||
214 | OUTREG(DST_HEIGHT_WIDTH, (image->height << 16) | ((image->width + 31) & ~31)); | ||
212 | 215 | ||
213 | src_bytes = (((image->width * image->depth) + 7) / 8) * image->height; | 216 | dwords = (image->width + 31) >> 5; |
214 | dwords = (src_bytes + 3) / 4; | 217 | dwords *= image->height; |
215 | bits = (u32*)(image->data); | 218 | bits = (u32*)(image->data); |
216 | 219 | ||
217 | while(dwords >= 8) { | 220 | while(dwords >= 8) { |
diff --git a/drivers/video/aty/radeon_base.c b/drivers/video/aty/radeon_base.c index 9a5821c65ebf..b3ffe8205d2b 100644 --- a/drivers/video/aty/radeon_base.c +++ b/drivers/video/aty/radeon_base.c | |||
@@ -1875,6 +1875,7 @@ static int __devinit radeon_set_fbinfo (struct radeonfb_info *rinfo) | |||
1875 | info->fbops = &radeonfb_ops; | 1875 | info->fbops = &radeonfb_ops; |
1876 | info->screen_base = rinfo->fb_base; | 1876 | info->screen_base = rinfo->fb_base; |
1877 | info->screen_size = rinfo->mapped_vram; | 1877 | info->screen_size = rinfo->mapped_vram; |
1878 | |||
1878 | /* Fill fix common fields */ | 1879 | /* Fill fix common fields */ |
1879 | strlcpy(info->fix.id, rinfo->name, sizeof(info->fix.id)); | 1880 | strlcpy(info->fix.id, rinfo->name, sizeof(info->fix.id)); |
1880 | info->fix.smem_start = rinfo->fb_base_phys; | 1881 | info->fix.smem_start = rinfo->fb_base_phys; |
@@ -1889,8 +1890,25 @@ static int __devinit radeon_set_fbinfo (struct radeonfb_info *rinfo) | |||
1889 | info->fix.mmio_len = RADEON_REGSIZE; | 1890 | info->fix.mmio_len = RADEON_REGSIZE; |
1890 | info->fix.accel = FB_ACCEL_ATI_RADEON; | 1891 | info->fix.accel = FB_ACCEL_ATI_RADEON; |
1891 | 1892 | ||
1893 | /* Allocate colormap */ | ||
1892 | fb_alloc_cmap(&info->cmap, 256, 0); | 1894 | fb_alloc_cmap(&info->cmap, 256, 0); |
1893 | 1895 | ||
1896 | /* Setup pixmap used for acceleration */ | ||
1897 | #define PIXMAP_SIZE (2048 * 4) | ||
1898 | |||
1899 | info->pixmap.addr = kmalloc(PIXMAP_SIZE, GFP_KERNEL); | ||
1900 | if (!info->pixmap.addr) { | ||
1901 | printk(KERN_ERR "radeonfb: Failed to allocate pixmap !\n"); | ||
1902 | noaccel = 1; | ||
1903 | goto bail; | ||
1904 | } | ||
1905 | info->pixmap.size = PIXMAP_SIZE; | ||
1906 | info->pixmap.flags = FB_PIXMAP_SYSTEM; | ||
1907 | info->pixmap.scan_align = 4; | ||
1908 | info->pixmap.buf_align = 4; | ||
1909 | info->pixmap.access_align = 32; | ||
1910 | |||
1911 | bail: | ||
1894 | if (noaccel) | 1912 | if (noaccel) |
1895 | info->flags |= FBINFO_HWACCEL_DISABLED; | 1913 | info->flags |= FBINFO_HWACCEL_DISABLED; |
1896 | 1914 | ||
diff --git a/drivers/video/backlight/da903x.c b/drivers/video/backlight/da903x.c index 242c38250166..93bb4340cc64 100644 --- a/drivers/video/backlight/da903x.c +++ b/drivers/video/backlight/da903x.c | |||
@@ -119,6 +119,7 @@ static int da903x_backlight_probe(struct platform_device *pdev) | |||
119 | default: | 119 | default: |
120 | dev_err(&pdev->dev, "invalid backlight device ID(%d)\n", | 120 | dev_err(&pdev->dev, "invalid backlight device ID(%d)\n", |
121 | pdev->id); | 121 | pdev->id); |
122 | kfree(data); | ||
122 | return -EINVAL; | 123 | return -EINVAL; |
123 | } | 124 | } |
124 | 125 | ||
@@ -130,6 +131,7 @@ static int da903x_backlight_probe(struct platform_device *pdev) | |||
130 | data, &da903x_backlight_ops); | 131 | data, &da903x_backlight_ops); |
131 | if (IS_ERR(bl)) { | 132 | if (IS_ERR(bl)) { |
132 | dev_err(&pdev->dev, "failed to register backlight\n"); | 133 | dev_err(&pdev->dev, "failed to register backlight\n"); |
134 | kfree(data); | ||
133 | return PTR_ERR(bl); | 135 | return PTR_ERR(bl); |
134 | } | 136 | } |
135 | 137 | ||
diff --git a/drivers/video/backlight/lcd.c b/drivers/video/backlight/lcd.c index 8e1731d3b228..680e57b616cd 100644 --- a/drivers/video/backlight/lcd.c +++ b/drivers/video/backlight/lcd.c | |||
@@ -42,10 +42,13 @@ static int fb_notifier_callback(struct notifier_block *self, | |||
42 | 42 | ||
43 | mutex_lock(&ld->ops_lock); | 43 | mutex_lock(&ld->ops_lock); |
44 | if (!ld->ops->check_fb || ld->ops->check_fb(ld, evdata->info)) { | 44 | if (!ld->ops->check_fb || ld->ops->check_fb(ld, evdata->info)) { |
45 | if (event == FB_EVENT_BLANK) | 45 | if (event == FB_EVENT_BLANK) { |
46 | ld->ops->set_power(ld, *(int *)evdata->data); | 46 | if (ld->ops->set_power) |
47 | else | 47 | ld->ops->set_power(ld, *(int *)evdata->data); |
48 | ld->ops->set_mode(ld, evdata->data); | 48 | } else { |
49 | if (ld->ops->set_mode) | ||
50 | ld->ops->set_mode(ld, evdata->data); | ||
51 | } | ||
49 | } | 52 | } |
50 | mutex_unlock(&ld->ops_lock); | 53 | mutex_unlock(&ld->ops_lock); |
51 | return 0; | 54 | return 0; |
diff --git a/drivers/video/cirrusfb.c b/drivers/video/cirrusfb.c index 8a8760230bc7..a2aa6ddffbe2 100644 --- a/drivers/video/cirrusfb.c +++ b/drivers/video/cirrusfb.c | |||
@@ -2462,8 +2462,7 @@ static int __init cirrusfb_init(void) | |||
2462 | 2462 | ||
2463 | #ifndef MODULE | 2463 | #ifndef MODULE |
2464 | static int __init cirrusfb_setup(char *options) { | 2464 | static int __init cirrusfb_setup(char *options) { |
2465 | char *this_opt, s[32]; | 2465 | char *this_opt; |
2466 | int i; | ||
2467 | 2466 | ||
2468 | DPRINTK("ENTER\n"); | 2467 | DPRINTK("ENTER\n"); |
2469 | 2468 | ||
diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c index b92947d62ad6..67ff370d80af 100644 --- a/drivers/video/console/fbcon.c +++ b/drivers/video/console/fbcon.c | |||
@@ -2389,16 +2389,13 @@ static int fbcon_blank(struct vc_data *vc, int blank, int mode_switch) | |||
2389 | 2389 | ||
2390 | if (!fbcon_is_inactive(vc, info)) { | 2390 | if (!fbcon_is_inactive(vc, info)) { |
2391 | if (ops->blank_state != blank) { | 2391 | if (ops->blank_state != blank) { |
2392 | int ret = 1; | ||
2393 | |||
2394 | ops->blank_state = blank; | 2392 | ops->blank_state = blank; |
2395 | fbcon_cursor(vc, blank ? CM_ERASE : CM_DRAW); | 2393 | fbcon_cursor(vc, blank ? CM_ERASE : CM_DRAW); |
2396 | ops->cursor_flash = (!blank); | 2394 | ops->cursor_flash = (!blank); |
2397 | 2395 | ||
2398 | if (info->fbops->fb_blank) | 2396 | if (!(info->flags & FBINFO_MISC_USEREVENT)) |
2399 | ret = info->fbops->fb_blank(blank, info); | 2397 | if (fb_blank(info, blank)) |
2400 | if (ret) | 2398 | fbcon_generic_blank(vc, info, blank); |
2401 | fbcon_generic_blank(vc, info, blank); | ||
2402 | } | 2399 | } |
2403 | 2400 | ||
2404 | if (!blank) | 2401 | if (!blank) |
diff --git a/drivers/video/fbmem.c b/drivers/video/fbmem.c index 1d5ae39cb271..3c65b0d67617 100644 --- a/drivers/video/fbmem.c +++ b/drivers/video/fbmem.c | |||
@@ -230,7 +230,7 @@ static void fb_set_logo_directpalette(struct fb_info *info, | |||
230 | greenshift = info->var.green.offset; | 230 | greenshift = info->var.green.offset; |
231 | blueshift = info->var.blue.offset; | 231 | blueshift = info->var.blue.offset; |
232 | 232 | ||
233 | for (i = 32; i < logo->clutsize; i++) | 233 | for (i = 32; i < 32 + logo->clutsize; i++) |
234 | palette[i] = i << redshift | i << greenshift | i << blueshift; | 234 | palette[i] = i << redshift | i << greenshift | i << blueshift; |
235 | } | 235 | } |
236 | 236 | ||
diff --git a/drivers/video/omap/Makefile b/drivers/video/omap/Makefile index 99da8b6d2c36..ed13889c1162 100644 --- a/drivers/video/omap/Makefile +++ b/drivers/video/omap/Makefile | |||
@@ -23,7 +23,6 @@ objs-y$(CONFIG_MACH_OMAP_PALMZ71) += lcd_palmz71.o | |||
23 | objs-$(CONFIG_ARCH_OMAP16XX)$(CONFIG_MACH_OMAP_INNOVATOR) += lcd_inn1610.o | 23 | objs-$(CONFIG_ARCH_OMAP16XX)$(CONFIG_MACH_OMAP_INNOVATOR) += lcd_inn1610.o |
24 | objs-$(CONFIG_ARCH_OMAP15XX)$(CONFIG_MACH_OMAP_INNOVATOR) += lcd_inn1510.o | 24 | objs-$(CONFIG_ARCH_OMAP15XX)$(CONFIG_MACH_OMAP_INNOVATOR) += lcd_inn1510.o |
25 | objs-y$(CONFIG_MACH_OMAP_OSK) += lcd_osk.o | 25 | objs-y$(CONFIG_MACH_OMAP_OSK) += lcd_osk.o |
26 | objs-y$(CONFIG_MACH_SX1) += lcd_sx1.o | ||
27 | 26 | ||
28 | omapfb-objs := $(objs-yy) | 27 | omapfb-objs := $(objs-yy) |
29 | 28 | ||
diff --git a/drivers/video/omap/lcd_sx1.c b/drivers/video/omap/lcd_sx1.c deleted file mode 100644 index e55de201b8ff..000000000000 --- a/drivers/video/omap/lcd_sx1.c +++ /dev/null | |||
@@ -1,327 +0,0 @@ | |||
1 | /* | ||
2 | * LCD panel support for the Siemens SX1 mobile phone | ||
3 | * | ||
4 | * Current version : Vovan888@gmail.com, great help from FCA00000 | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms of the GNU General Public License as published by the | ||
8 | * Free Software Foundation; either version 2 of the License, or (at your | ||
9 | * option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, but | ||
12 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
14 | * General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License along | ||
17 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
18 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
19 | */ | ||
20 | |||
21 | #include <linux/module.h> | ||
22 | #include <linux/platform_device.h> | ||
23 | #include <linux/delay.h> | ||
24 | #include <linux/io.h> | ||
25 | |||
26 | #include <mach/gpio.h> | ||
27 | #include <mach/omapfb.h> | ||
28 | #include <mach/mcbsp.h> | ||
29 | #include <mach/mux.h> | ||
30 | |||
31 | /* | ||
32 | * OMAP310 GPIO registers | ||
33 | */ | ||
34 | #define GPIO_DATA_INPUT 0xfffce000 | ||
35 | #define GPIO_DATA_OUTPUT 0xfffce004 | ||
36 | #define GPIO_DIR_CONTROL 0xfffce008 | ||
37 | #define GPIO_INT_CONTROL 0xfffce00c | ||
38 | #define GPIO_INT_MASK 0xfffce010 | ||
39 | #define GPIO_INT_STATUS 0xfffce014 | ||
40 | #define GPIO_PIN_CONTROL 0xfffce018 | ||
41 | |||
42 | |||
43 | #define A_LCD_SSC_RD 3 | ||
44 | #define A_LCD_SSC_SD 7 | ||
45 | #define _A_LCD_RESET 9 | ||
46 | #define _A_LCD_SSC_CS 12 | ||
47 | #define _A_LCD_SSC_A0 13 | ||
48 | |||
49 | #define DSP_REG 0xE1017024 | ||
50 | |||
51 | const unsigned char INIT_1[12] = { | ||
52 | 0x1C, 0x02, 0x88, 0x00, 0x1E, 0xE0, 0x00, 0xDC, 0x00, 0x02, 0x00 | ||
53 | }; | ||
54 | |||
55 | const unsigned char INIT_2[127] = { | ||
56 | 0x15, 0x00, 0x29, 0x00, 0x3E, 0x00, 0x51, 0x00, | ||
57 | 0x65, 0x00, 0x7A, 0x00, 0x8D, 0x00, 0xA1, 0x00, | ||
58 | 0xB6, 0x00, 0xC7, 0x00, 0xD8, 0x00, 0xEB, 0x00, | ||
59 | 0xFB, 0x00, 0x0B, 0x01, 0x1B, 0x01, 0x27, 0x01, | ||
60 | 0x34, 0x01, 0x41, 0x01, 0x4C, 0x01, 0x55, 0x01, | ||
61 | 0x5F, 0x01, 0x68, 0x01, 0x70, 0x01, 0x78, 0x01, | ||
62 | 0x7E, 0x01, 0x86, 0x01, 0x8C, 0x01, 0x94, 0x01, | ||
63 | 0x9B, 0x01, 0xA1, 0x01, 0xA4, 0x01, 0xA9, 0x01, | ||
64 | 0xAD, 0x01, 0xB2, 0x01, 0xB7, 0x01, 0xBC, 0x01, | ||
65 | 0xC0, 0x01, 0xC4, 0x01, 0xC8, 0x01, 0xCB, 0x01, | ||
66 | 0xCF, 0x01, 0xD2, 0x01, 0xD5, 0x01, 0xD8, 0x01, | ||
67 | 0xDB, 0x01, 0xE0, 0x01, 0xE3, 0x01, 0xE6, 0x01, | ||
68 | 0xE8, 0x01, 0xEB, 0x01, 0xEE, 0x01, 0xF1, 0x01, | ||
69 | 0xF3, 0x01, 0xF8, 0x01, 0xF9, 0x01, 0xFC, 0x01, | ||
70 | 0x00, 0x02, 0x03, 0x02, 0x07, 0x02, 0x09, 0x02, | ||
71 | 0x0E, 0x02, 0x13, 0x02, 0x1C, 0x02, 0x00 | ||
72 | }; | ||
73 | |||
74 | const unsigned char INIT_3[15] = { | ||
75 | 0x14, 0x26, 0x33, 0x3D, 0x45, 0x4D, 0x53, 0x59, | ||
76 | 0x5E, 0x63, 0x67, 0x6D, 0x71, 0x78, 0xFF | ||
77 | }; | ||
78 | |||
79 | static void epson_sendbyte(int flag, unsigned char byte) | ||
80 | { | ||
81 | int i, shifter = 0x80; | ||
82 | |||
83 | if (!flag) | ||
84 | gpio_set_value(_A_LCD_SSC_A0, 0); | ||
85 | mdelay(2); | ||
86 | gpio_set_value(A_LCD_SSC_RD, 1); | ||
87 | |||
88 | gpio_set_value(A_LCD_SSC_SD, flag); | ||
89 | |||
90 | OMAP_MCBSP_WRITE(OMAP1510_MCBSP3_BASE, PCR0, 0x2200); | ||
91 | OMAP_MCBSP_WRITE(OMAP1510_MCBSP3_BASE, PCR0, 0x2202); | ||
92 | for (i = 0; i < 8; i++) { | ||
93 | OMAP_MCBSP_WRITE(OMAP1510_MCBSP3_BASE, PCR0, 0x2200); | ||
94 | gpio_set_value(A_LCD_SSC_SD, shifter & byte); | ||
95 | OMAP_MCBSP_WRITE(OMAP1510_MCBSP3_BASE, PCR0, 0x2202); | ||
96 | shifter >>= 1; | ||
97 | } | ||
98 | gpio_set_value(_A_LCD_SSC_A0, 1); | ||
99 | } | ||
100 | |||
101 | static void init_system(void) | ||
102 | { | ||
103 | omap_mcbsp_request(OMAP_MCBSP3); | ||
104 | omap_mcbsp_stop(OMAP_MCBSP3); | ||
105 | } | ||
106 | |||
107 | static void setup_GPIO(void) | ||
108 | { | ||
109 | /* new wave */ | ||
110 | gpio_request(A_LCD_SSC_RD, "lcd_ssc_rd"); | ||
111 | gpio_request(A_LCD_SSC_SD, "lcd_ssc_sd"); | ||
112 | gpio_request(_A_LCD_RESET, "lcd_reset"); | ||
113 | gpio_request(_A_LCD_SSC_CS, "lcd_ssc_cs"); | ||
114 | gpio_request(_A_LCD_SSC_A0, "lcd_ssc_a0"); | ||
115 | |||
116 | /* set GPIOs to output, with initial data */ | ||
117 | gpio_direction_output(A_LCD_SSC_RD, 1); | ||
118 | gpio_direction_output(A_LCD_SSC_SD, 0); | ||
119 | gpio_direction_output(_A_LCD_RESET, 0); | ||
120 | gpio_direction_output(_A_LCD_SSC_CS, 1); | ||
121 | gpio_direction_output(_A_LCD_SSC_A0, 1); | ||
122 | } | ||
123 | |||
124 | static void display_init(void) | ||
125 | { | ||
126 | int i; | ||
127 | |||
128 | omap_cfg_reg(MCBSP3_CLKX); | ||
129 | |||
130 | mdelay(2); | ||
131 | setup_GPIO(); | ||
132 | mdelay(2); | ||
133 | |||
134 | /* reset LCD */ | ||
135 | gpio_set_value(A_LCD_SSC_SD, 1); | ||
136 | epson_sendbyte(0, 0x25); | ||
137 | |||
138 | gpio_set_value(_A_LCD_RESET, 0); | ||
139 | mdelay(10); | ||
140 | gpio_set_value(_A_LCD_RESET, 1); | ||
141 | |||
142 | gpio_set_value(_A_LCD_SSC_CS, 1); | ||
143 | mdelay(2); | ||
144 | gpio_set_value(_A_LCD_SSC_CS, 0); | ||
145 | |||
146 | /* init LCD, phase 1 */ | ||
147 | epson_sendbyte(0, 0xCA); | ||
148 | for (i = 0; i < 10; i++) | ||
149 | epson_sendbyte(1, INIT_1[i]); | ||
150 | gpio_set_value(_A_LCD_SSC_CS, 1); | ||
151 | gpio_set_value(_A_LCD_SSC_CS, 0); | ||
152 | |||
153 | /* init LCD phase 2 */ | ||
154 | epson_sendbyte(0, 0xCB); | ||
155 | for (i = 0; i < 125; i++) | ||
156 | epson_sendbyte(1, INIT_2[i]); | ||
157 | gpio_set_value(_A_LCD_SSC_CS, 1); | ||
158 | gpio_set_value(_A_LCD_SSC_CS, 0); | ||
159 | |||
160 | /* init LCD phase 2a */ | ||
161 | epson_sendbyte(0, 0xCC); | ||
162 | for (i = 0; i < 14; i++) | ||
163 | epson_sendbyte(1, INIT_3[i]); | ||
164 | gpio_set_value(_A_LCD_SSC_CS, 1); | ||
165 | gpio_set_value(_A_LCD_SSC_CS, 0); | ||
166 | |||
167 | /* init LCD phase 3 */ | ||
168 | epson_sendbyte(0, 0xBC); | ||
169 | epson_sendbyte(1, 0x08); | ||
170 | gpio_set_value(_A_LCD_SSC_CS, 1); | ||
171 | gpio_set_value(_A_LCD_SSC_CS, 0); | ||
172 | |||
173 | /* init LCD phase 4 */ | ||
174 | epson_sendbyte(0, 0x07); | ||
175 | epson_sendbyte(1, 0x05); | ||
176 | gpio_set_value(_A_LCD_SSC_CS, 1); | ||
177 | gpio_set_value(_A_LCD_SSC_CS, 0); | ||
178 | |||
179 | /* init LCD phase 5 */ | ||
180 | epson_sendbyte(0, 0x94); | ||
181 | gpio_set_value(_A_LCD_SSC_CS, 1); | ||
182 | gpio_set_value(_A_LCD_SSC_CS, 0); | ||
183 | |||
184 | /* init LCD phase 6 */ | ||
185 | epson_sendbyte(0, 0xC6); | ||
186 | epson_sendbyte(1, 0x80); | ||
187 | gpio_set_value(_A_LCD_SSC_CS, 1); | ||
188 | mdelay(100); /* used to be 1000 */ | ||
189 | gpio_set_value(_A_LCD_SSC_CS, 0); | ||
190 | |||
191 | /* init LCD phase 7 */ | ||
192 | epson_sendbyte(0, 0x16); | ||
193 | epson_sendbyte(1, 0x02); | ||
194 | epson_sendbyte(1, 0x00); | ||
195 | epson_sendbyte(1, 0xB1); | ||
196 | epson_sendbyte(1, 0x00); | ||
197 | gpio_set_value(_A_LCD_SSC_CS, 1); | ||
198 | gpio_set_value(_A_LCD_SSC_CS, 0); | ||
199 | |||
200 | /* init LCD phase 8 */ | ||
201 | epson_sendbyte(0, 0x76); | ||
202 | epson_sendbyte(1, 0x00); | ||
203 | epson_sendbyte(1, 0x00); | ||
204 | epson_sendbyte(1, 0xDB); | ||
205 | epson_sendbyte(1, 0x00); | ||
206 | gpio_set_value(_A_LCD_SSC_CS, 1); | ||
207 | gpio_set_value(_A_LCD_SSC_CS, 0); | ||
208 | |||
209 | /* init LCD phase 9 */ | ||
210 | epson_sendbyte(0, 0xAF); | ||
211 | gpio_set_value(_A_LCD_SSC_CS, 1); | ||
212 | } | ||
213 | |||
214 | static int sx1_panel_init(struct lcd_panel *panel, struct omapfb_device *fbdev) | ||
215 | { | ||
216 | return 0; | ||
217 | } | ||
218 | |||
219 | static void sx1_panel_cleanup(struct lcd_panel *panel) | ||
220 | { | ||
221 | } | ||
222 | |||
223 | static void sx1_panel_disable(struct lcd_panel *panel) | ||
224 | { | ||
225 | printk(KERN_INFO "SX1: LCD panel disable\n"); | ||
226 | sx1_setmmipower(0); | ||
227 | gpio_set_value(_A_LCD_SSC_CS, 1); | ||
228 | |||
229 | epson_sendbyte(0, 0x25); | ||
230 | gpio_set_value(_A_LCD_SSC_CS, 0); | ||
231 | |||
232 | epson_sendbyte(0, 0xAE); | ||
233 | gpio_set_value(_A_LCD_SSC_CS, 1); | ||
234 | mdelay(100); | ||
235 | gpio_set_value(_A_LCD_SSC_CS, 0); | ||
236 | |||
237 | epson_sendbyte(0, 0x95); | ||
238 | gpio_set_value(_A_LCD_SSC_CS, 1); | ||
239 | } | ||
240 | |||
241 | static int sx1_panel_enable(struct lcd_panel *panel) | ||
242 | { | ||
243 | printk(KERN_INFO "lcd_sx1: LCD panel enable\n"); | ||
244 | init_system(); | ||
245 | display_init(); | ||
246 | |||
247 | sx1_setmmipower(1); | ||
248 | sx1_setbacklight(0x18); | ||
249 | sx1_setkeylight (0x06); | ||
250 | return 0; | ||
251 | } | ||
252 | |||
253 | |||
254 | static unsigned long sx1_panel_get_caps(struct lcd_panel *panel) | ||
255 | { | ||
256 | return 0; | ||
257 | } | ||
258 | |||
259 | struct lcd_panel sx1_panel = { | ||
260 | .name = "sx1", | ||
261 | .config = OMAP_LCDC_PANEL_TFT | OMAP_LCDC_INV_VSYNC | | ||
262 | OMAP_LCDC_INV_HSYNC | OMAP_LCDC_INV_PIX_CLOCK | | ||
263 | OMAP_LCDC_INV_OUTPUT_EN, | ||
264 | |||
265 | .x_res = 176, | ||
266 | .y_res = 220, | ||
267 | .data_lines = 16, | ||
268 | .bpp = 16, | ||
269 | .hsw = 5, | ||
270 | .hfp = 5, | ||
271 | .hbp = 5, | ||
272 | .vsw = 2, | ||
273 | .vfp = 1, | ||
274 | .vbp = 1, | ||
275 | .pixel_clock = 1500, | ||
276 | |||
277 | .init = sx1_panel_init, | ||
278 | .cleanup = sx1_panel_cleanup, | ||
279 | .enable = sx1_panel_enable, | ||
280 | .disable = sx1_panel_disable, | ||
281 | .get_caps = sx1_panel_get_caps, | ||
282 | }; | ||
283 | |||
284 | static int sx1_panel_probe(struct platform_device *pdev) | ||
285 | { | ||
286 | omapfb_register_panel(&sx1_panel); | ||
287 | return 0; | ||
288 | } | ||
289 | |||
290 | static int sx1_panel_remove(struct platform_device *pdev) | ||
291 | { | ||
292 | return 0; | ||
293 | } | ||
294 | |||
295 | static int sx1_panel_suspend(struct platform_device *pdev, pm_message_t mesg) | ||
296 | { | ||
297 | return 0; | ||
298 | } | ||
299 | |||
300 | static int sx1_panel_resume(struct platform_device *pdev) | ||
301 | { | ||
302 | return 0; | ||
303 | } | ||
304 | |||
305 | struct platform_driver sx1_panel_driver = { | ||
306 | .probe = sx1_panel_probe, | ||
307 | .remove = sx1_panel_remove, | ||
308 | .suspend = sx1_panel_suspend, | ||
309 | .resume = sx1_panel_resume, | ||
310 | .driver = { | ||
311 | .name = "lcd_sx1", | ||
312 | .owner = THIS_MODULE, | ||
313 | }, | ||
314 | }; | ||
315 | |||
316 | static int sx1_panel_drv_init(void) | ||
317 | { | ||
318 | return platform_driver_register(&sx1_panel_driver); | ||
319 | } | ||
320 | |||
321 | static void sx1_panel_drv_cleanup(void) | ||
322 | { | ||
323 | platform_driver_unregister(&sx1_panel_driver); | ||
324 | } | ||
325 | |||
326 | module_init(sx1_panel_drv_init); | ||
327 | module_exit(sx1_panel_drv_cleanup); | ||
diff --git a/drivers/video/pxafb.c b/drivers/video/pxafb.c index 97204497d9f7..cc59c52e1103 100644 --- a/drivers/video/pxafb.c +++ b/drivers/video/pxafb.c | |||
@@ -804,6 +804,9 @@ static int pxafb_smart_thread(void *arg) | |||
804 | 804 | ||
805 | static int pxafb_smart_init(struct pxafb_info *fbi) | 805 | static int pxafb_smart_init(struct pxafb_info *fbi) |
806 | { | 806 | { |
807 | if (!(fbi->lccr0 | LCCR0_LCDT)) | ||
808 | return 0; | ||
809 | |||
807 | fbi->smart_thread = kthread_run(pxafb_smart_thread, fbi, | 810 | fbi->smart_thread = kthread_run(pxafb_smart_thread, fbi, |
808 | "lcd_refresh"); | 811 | "lcd_refresh"); |
809 | if (IS_ERR(fbi->smart_thread)) { | 812 | if (IS_ERR(fbi->smart_thread)) { |
@@ -1372,7 +1375,7 @@ static void pxafb_decode_mach_info(struct pxafb_info *fbi, | |||
1372 | fbi->cmap_inverse = inf->cmap_inverse; | 1375 | fbi->cmap_inverse = inf->cmap_inverse; |
1373 | fbi->cmap_static = inf->cmap_static; | 1376 | fbi->cmap_static = inf->cmap_static; |
1374 | 1377 | ||
1375 | switch (lcd_conn & 0xf) { | 1378 | switch (lcd_conn & LCD_TYPE_MASK) { |
1376 | case LCD_TYPE_MONO_STN: | 1379 | case LCD_TYPE_MONO_STN: |
1377 | fbi->lccr0 = LCCR0_CMS; | 1380 | fbi->lccr0 = LCCR0_CMS; |
1378 | break; | 1381 | break; |
diff --git a/drivers/video/tmiofb.c b/drivers/video/tmiofb.c index 2a380011e9ba..7baf2dd12d50 100644 --- a/drivers/video/tmiofb.c +++ b/drivers/video/tmiofb.c | |||
@@ -222,6 +222,9 @@ static irqreturn_t tmiofb_irq(int irq, void *__info) | |||
222 | unsigned int bbisc = tmio_ioread16(par->lcr + LCR_BBISC); | 222 | unsigned int bbisc = tmio_ioread16(par->lcr + LCR_BBISC); |
223 | 223 | ||
224 | 224 | ||
225 | tmio_iowrite16(bbisc, par->lcr + LCR_BBISC); | ||
226 | |||
227 | #ifdef CONFIG_FB_TMIO_ACCELL | ||
225 | /* | 228 | /* |
226 | * We were in polling mode and now we got correct irq. | 229 | * We were in polling mode and now we got correct irq. |
227 | * Switch back to IRQ-based sync of command FIFO | 230 | * Switch back to IRQ-based sync of command FIFO |
@@ -231,9 +234,6 @@ static irqreturn_t tmiofb_irq(int irq, void *__info) | |||
231 | par->use_polling = false; | 234 | par->use_polling = false; |
232 | } | 235 | } |
233 | 236 | ||
234 | tmio_iowrite16(bbisc, par->lcr + LCR_BBISC); | ||
235 | |||
236 | #ifdef CONFIG_FB_TMIO_ACCELL | ||
237 | if (bbisc & 1) | 237 | if (bbisc & 1) |
238 | wake_up(&par->wait_acc); | 238 | wake_up(&par->wait_acc); |
239 | #endif | 239 | #endif |
@@ -938,7 +938,9 @@ static void tmiofb_dump_regs(struct platform_device *dev) | |||
938 | static int tmiofb_suspend(struct platform_device *dev, pm_message_t state) | 938 | static int tmiofb_suspend(struct platform_device *dev, pm_message_t state) |
939 | { | 939 | { |
940 | struct fb_info *info = platform_get_drvdata(dev); | 940 | struct fb_info *info = platform_get_drvdata(dev); |
941 | #ifdef CONFIG_FB_TMIO_ACCELL | ||
941 | struct tmiofb_par *par = info->par; | 942 | struct tmiofb_par *par = info->par; |
943 | #endif | ||
942 | struct mfd_cell *cell = dev->dev.platform_data; | 944 | struct mfd_cell *cell = dev->dev.platform_data; |
943 | int retval = 0; | 945 | int retval = 0; |
944 | 946 | ||
@@ -950,12 +952,14 @@ static int tmiofb_suspend(struct platform_device *dev, pm_message_t state) | |||
950 | info->fbops->fb_sync(info); | 952 | info->fbops->fb_sync(info); |
951 | 953 | ||
952 | 954 | ||
955 | #ifdef CONFIG_FB_TMIO_ACCELL | ||
953 | /* | 956 | /* |
954 | * The fb should be usable even if interrupts are disabled (and they are | 957 | * The fb should be usable even if interrupts are disabled (and they are |
955 | * during suspend/resume). Switch temporary to forced polling. | 958 | * during suspend/resume). Switch temporary to forced polling. |
956 | */ | 959 | */ |
957 | printk(KERN_INFO "tmiofb: switching to polling\n"); | 960 | printk(KERN_INFO "tmiofb: switching to polling\n"); |
958 | par->use_polling = true; | 961 | par->use_polling = true; |
962 | #endif | ||
959 | tmiofb_hw_stop(dev); | 963 | tmiofb_hw_stop(dev); |
960 | 964 | ||
961 | if (cell->suspend) | 965 | if (cell->suspend) |
diff --git a/drivers/video/via/viafbdev.c b/drivers/video/via/viafbdev.c index 0132eae06f55..73ac754ad801 100644 --- a/drivers/video/via/viafbdev.c +++ b/drivers/video/via/viafbdev.c | |||
@@ -2036,30 +2036,30 @@ static int viafb_vt1636_proc_write(struct file *file, | |||
2036 | return count; | 2036 | return count; |
2037 | } | 2037 | } |
2038 | 2038 | ||
2039 | static void viafb_init_proc(struct proc_dir_entry *viafb_entry) | 2039 | static void viafb_init_proc(struct proc_dir_entry **viafb_entry) |
2040 | { | 2040 | { |
2041 | struct proc_dir_entry *entry; | 2041 | struct proc_dir_entry *entry; |
2042 | viafb_entry = proc_mkdir("viafb", NULL); | 2042 | *viafb_entry = proc_mkdir("viafb", NULL); |
2043 | if (viafb_entry) { | 2043 | if (viafb_entry) { |
2044 | entry = create_proc_entry("dvp0", 0, viafb_entry); | 2044 | entry = create_proc_entry("dvp0", 0, *viafb_entry); |
2045 | if (entry) { | 2045 | if (entry) { |
2046 | entry->owner = THIS_MODULE; | 2046 | entry->owner = THIS_MODULE; |
2047 | entry->read_proc = viafb_dvp0_proc_read; | 2047 | entry->read_proc = viafb_dvp0_proc_read; |
2048 | entry->write_proc = viafb_dvp0_proc_write; | 2048 | entry->write_proc = viafb_dvp0_proc_write; |
2049 | } | 2049 | } |
2050 | entry = create_proc_entry("dvp1", 0, viafb_entry); | 2050 | entry = create_proc_entry("dvp1", 0, *viafb_entry); |
2051 | if (entry) { | 2051 | if (entry) { |
2052 | entry->owner = THIS_MODULE; | 2052 | entry->owner = THIS_MODULE; |
2053 | entry->read_proc = viafb_dvp1_proc_read; | 2053 | entry->read_proc = viafb_dvp1_proc_read; |
2054 | entry->write_proc = viafb_dvp1_proc_write; | 2054 | entry->write_proc = viafb_dvp1_proc_write; |
2055 | } | 2055 | } |
2056 | entry = create_proc_entry("dfph", 0, viafb_entry); | 2056 | entry = create_proc_entry("dfph", 0, *viafb_entry); |
2057 | if (entry) { | 2057 | if (entry) { |
2058 | entry->owner = THIS_MODULE; | 2058 | entry->owner = THIS_MODULE; |
2059 | entry->read_proc = viafb_dfph_proc_read; | 2059 | entry->read_proc = viafb_dfph_proc_read; |
2060 | entry->write_proc = viafb_dfph_proc_write; | 2060 | entry->write_proc = viafb_dfph_proc_write; |
2061 | } | 2061 | } |
2062 | entry = create_proc_entry("dfpl", 0, viafb_entry); | 2062 | entry = create_proc_entry("dfpl", 0, *viafb_entry); |
2063 | if (entry) { | 2063 | if (entry) { |
2064 | entry->owner = THIS_MODULE; | 2064 | entry->owner = THIS_MODULE; |
2065 | entry->read_proc = viafb_dfpl_proc_read; | 2065 | entry->read_proc = viafb_dfpl_proc_read; |
@@ -2068,7 +2068,7 @@ static void viafb_init_proc(struct proc_dir_entry *viafb_entry) | |||
2068 | if (VT1636_LVDS == viaparinfo->chip_info->lvds_chip_info. | 2068 | if (VT1636_LVDS == viaparinfo->chip_info->lvds_chip_info. |
2069 | lvds_chip_name || VT1636_LVDS == | 2069 | lvds_chip_name || VT1636_LVDS == |
2070 | viaparinfo->chip_info->lvds_chip_info2.lvds_chip_name) { | 2070 | viaparinfo->chip_info->lvds_chip_info2.lvds_chip_name) { |
2071 | entry = create_proc_entry("vt1636", 0, viafb_entry); | 2071 | entry = create_proc_entry("vt1636", 0, *viafb_entry); |
2072 | if (entry) { | 2072 | if (entry) { |
2073 | entry->owner = THIS_MODULE; | 2073 | entry->owner = THIS_MODULE; |
2074 | entry->read_proc = viafb_vt1636_proc_read; | 2074 | entry->read_proc = viafb_vt1636_proc_read; |
@@ -2087,6 +2087,7 @@ static void viafb_remove_proc(struct proc_dir_entry *viafb_entry) | |||
2087 | remove_proc_entry("dfpl", viafb_entry); | 2087 | remove_proc_entry("dfpl", viafb_entry); |
2088 | remove_proc_entry("vt1636", viafb_entry); | 2088 | remove_proc_entry("vt1636", viafb_entry); |
2089 | remove_proc_entry("vt1625", viafb_entry); | 2089 | remove_proc_entry("vt1625", viafb_entry); |
2090 | remove_proc_entry("viafb", NULL); | ||
2090 | } | 2091 | } |
2091 | 2092 | ||
2092 | static int __devinit via_pci_probe(void) | 2093 | static int __devinit via_pci_probe(void) |
@@ -2348,7 +2349,7 @@ static int __devinit via_pci_probe(void) | |||
2348 | viafbinfo->node, viafbinfo->fix.id, default_var.xres, | 2349 | viafbinfo->node, viafbinfo->fix.id, default_var.xres, |
2349 | default_var.yres, default_var.bits_per_pixel); | 2350 | default_var.yres, default_var.bits_per_pixel); |
2350 | 2351 | ||
2351 | viafb_init_proc(viaparinfo->proc_entry); | 2352 | viafb_init_proc(&viaparinfo->proc_entry); |
2352 | viafb_init_dac(IGA2); | 2353 | viafb_init_dac(IGA2); |
2353 | return 0; | 2354 | return 0; |
2354 | } | 2355 | } |
diff --git a/drivers/video/xen-fbfront.c b/drivers/video/xen-fbfront.c index a463b3dd837b..2493f05e9f61 100644 --- a/drivers/video/xen-fbfront.c +++ b/drivers/video/xen-fbfront.c | |||
@@ -668,7 +668,7 @@ static struct xenbus_device_id xenfb_ids[] = { | |||
668 | { "" } | 668 | { "" } |
669 | }; | 669 | }; |
670 | 670 | ||
671 | static struct xenbus_driver xenfb = { | 671 | static struct xenbus_driver xenfb_driver = { |
672 | .name = "vfb", | 672 | .name = "vfb", |
673 | .owner = THIS_MODULE, | 673 | .owner = THIS_MODULE, |
674 | .ids = xenfb_ids, | 674 | .ids = xenfb_ids, |
@@ -687,12 +687,12 @@ static int __init xenfb_init(void) | |||
687 | if (xen_initial_domain()) | 687 | if (xen_initial_domain()) |
688 | return -ENODEV; | 688 | return -ENODEV; |
689 | 689 | ||
690 | return xenbus_register_frontend(&xenfb); | 690 | return xenbus_register_frontend(&xenfb_driver); |
691 | } | 691 | } |
692 | 692 | ||
693 | static void __exit xenfb_cleanup(void) | 693 | static void __exit xenfb_cleanup(void) |
694 | { | 694 | { |
695 | xenbus_unregister_driver(&xenfb); | 695 | xenbus_unregister_driver(&xenfb_driver); |
696 | } | 696 | } |
697 | 697 | ||
698 | module_init(xenfb_init); | 698 | module_init(xenfb_init); |
diff --git a/drivers/video/xilinxfb.c b/drivers/video/xilinxfb.c index 5da3d2423cc0..40a3a2afbfe7 100644 --- a/drivers/video/xilinxfb.c +++ b/drivers/video/xilinxfb.c | |||
@@ -298,8 +298,9 @@ static int xilinxfb_assign(struct device *dev, unsigned long physaddr, | |||
298 | 298 | ||
299 | /* Put a banner in the log (for DEBUG) */ | 299 | /* Put a banner in the log (for DEBUG) */ |
300 | dev_dbg(dev, "regs: phys=%lx, virt=%p\n", physaddr, drvdata->regs); | 300 | dev_dbg(dev, "regs: phys=%lx, virt=%p\n", physaddr, drvdata->regs); |
301 | dev_dbg(dev, "fb: phys=%p, virt=%p, size=%x\n", | 301 | dev_dbg(dev, "fb: phys=%llx, virt=%p, size=%x\n", |
302 | (void*)drvdata->fb_phys, drvdata->fb_virt, fbsize); | 302 | (unsigned long long) drvdata->fb_phys, drvdata->fb_virt, |
303 | fbsize); | ||
303 | 304 | ||
304 | return 0; /* success */ | 305 | return 0; /* success */ |
305 | 306 | ||
diff --git a/drivers/w1/masters/Kconfig b/drivers/w1/masters/Kconfig index c4493091c655..90616822cd20 100644 --- a/drivers/w1/masters/Kconfig +++ b/drivers/w1/masters/Kconfig | |||
@@ -36,7 +36,7 @@ config W1_MASTER_DS2482 | |||
36 | 36 | ||
37 | config W1_MASTER_DS1WM | 37 | config W1_MASTER_DS1WM |
38 | tristate "Maxim DS1WM 1-wire busmaster" | 38 | tristate "Maxim DS1WM 1-wire busmaster" |
39 | depends on W1 && ARM | 39 | depends on W1 && ARM && HAVE_CLK |
40 | help | 40 | help |
41 | Say Y here to enable the DS1WM 1-wire driver, such as that | 41 | Say Y here to enable the DS1WM 1-wire driver, such as that |
42 | in HP iPAQ devices like h5xxx, h2200, and ASIC3-based like | 42 | in HP iPAQ devices like h5xxx, h2200, and ASIC3-based like |
@@ -52,5 +52,12 @@ config W1_MASTER_GPIO | |||
52 | This support is also available as a module. If so, the module | 52 | This support is also available as a module. If so, the module |
53 | will be called w1-gpio.ko. | 53 | will be called w1-gpio.ko. |
54 | 54 | ||
55 | config HDQ_MASTER_OMAP | ||
56 | tristate "OMAP HDQ driver" | ||
57 | depends on ARCH_OMAP2430 || ARCH_OMAP34XX | ||
58 | help | ||
59 | Say Y here if you want support for the 1-wire or HDQ Interface | ||
60 | on an OMAP processor. | ||
61 | |||
55 | endmenu | 62 | endmenu |
56 | 63 | ||
diff --git a/drivers/w1/masters/Makefile b/drivers/w1/masters/Makefile index 1420b5bbdda8..bc4714a75f3a 100644 --- a/drivers/w1/masters/Makefile +++ b/drivers/w1/masters/Makefile | |||
@@ -7,3 +7,4 @@ obj-$(CONFIG_W1_MASTER_DS2490) += ds2490.o | |||
7 | obj-$(CONFIG_W1_MASTER_DS2482) += ds2482.o | 7 | obj-$(CONFIG_W1_MASTER_DS2482) += ds2482.o |
8 | obj-$(CONFIG_W1_MASTER_DS1WM) += ds1wm.o | 8 | obj-$(CONFIG_W1_MASTER_DS1WM) += ds1wm.o |
9 | obj-$(CONFIG_W1_MASTER_GPIO) += w1-gpio.o | 9 | obj-$(CONFIG_W1_MASTER_GPIO) += w1-gpio.o |
10 | obj-$(CONFIG_HDQ_MASTER_OMAP) += omap_hdq.o | ||
diff --git a/drivers/w1/masters/omap_hdq.c b/drivers/w1/masters/omap_hdq.c new file mode 100644 index 000000000000..c973889110c8 --- /dev/null +++ b/drivers/w1/masters/omap_hdq.c | |||
@@ -0,0 +1,725 @@ | |||
1 | /* | ||
2 | * drivers/w1/masters/omap_hdq.c | ||
3 | * | ||
4 | * Copyright (C) 2007 Texas Instruments, Inc. | ||
5 | * | ||
6 | * This file is licensed under the terms of the GNU General Public License | ||
7 | * version 2. This program is licensed "as is" without any warranty of any | ||
8 | * kind, whether express or implied. | ||
9 | * | ||
10 | */ | ||
11 | #include <linux/kernel.h> | ||
12 | #include <linux/module.h> | ||
13 | #include <linux/platform_device.h> | ||
14 | #include <linux/interrupt.h> | ||
15 | #include <linux/err.h> | ||
16 | #include <linux/clk.h> | ||
17 | #include <linux/io.h> | ||
18 | |||
19 | #include <asm/irq.h> | ||
20 | #include <mach/hardware.h> | ||
21 | |||
22 | #include "../w1.h" | ||
23 | #include "../w1_int.h" | ||
24 | |||
25 | #define MOD_NAME "OMAP_HDQ:" | ||
26 | |||
27 | #define OMAP_HDQ_REVISION 0x00 | ||
28 | #define OMAP_HDQ_TX_DATA 0x04 | ||
29 | #define OMAP_HDQ_RX_DATA 0x08 | ||
30 | #define OMAP_HDQ_CTRL_STATUS 0x0c | ||
31 | #define OMAP_HDQ_CTRL_STATUS_INTERRUPTMASK (1<<6) | ||
32 | #define OMAP_HDQ_CTRL_STATUS_CLOCKENABLE (1<<5) | ||
33 | #define OMAP_HDQ_CTRL_STATUS_GO (1<<4) | ||
34 | #define OMAP_HDQ_CTRL_STATUS_INITIALIZATION (1<<2) | ||
35 | #define OMAP_HDQ_CTRL_STATUS_DIR (1<<1) | ||
36 | #define OMAP_HDQ_CTRL_STATUS_MODE (1<<0) | ||
37 | #define OMAP_HDQ_INT_STATUS 0x10 | ||
38 | #define OMAP_HDQ_INT_STATUS_TXCOMPLETE (1<<2) | ||
39 | #define OMAP_HDQ_INT_STATUS_RXCOMPLETE (1<<1) | ||
40 | #define OMAP_HDQ_INT_STATUS_TIMEOUT (1<<0) | ||
41 | #define OMAP_HDQ_SYSCONFIG 0x14 | ||
42 | #define OMAP_HDQ_SYSCONFIG_SOFTRESET (1<<1) | ||
43 | #define OMAP_HDQ_SYSCONFIG_AUTOIDLE (1<<0) | ||
44 | #define OMAP_HDQ_SYSSTATUS 0x18 | ||
45 | #define OMAP_HDQ_SYSSTATUS_RESETDONE (1<<0) | ||
46 | |||
47 | #define OMAP_HDQ_FLAG_CLEAR 0 | ||
48 | #define OMAP_HDQ_FLAG_SET 1 | ||
49 | #define OMAP_HDQ_TIMEOUT (HZ/5) | ||
50 | |||
51 | #define OMAP_HDQ_MAX_USER 4 | ||
52 | |||
53 | static DECLARE_WAIT_QUEUE_HEAD(hdq_wait_queue); | ||
54 | static int w1_id; | ||
55 | |||
56 | struct hdq_data { | ||
57 | struct device *dev; | ||
58 | void __iomem *hdq_base; | ||
59 | /* lock status update */ | ||
60 | struct mutex hdq_mutex; | ||
61 | int hdq_usecount; | ||
62 | struct clk *hdq_ick; | ||
63 | struct clk *hdq_fck; | ||
64 | u8 hdq_irqstatus; | ||
65 | /* device lock */ | ||
66 | spinlock_t hdq_spinlock; | ||
67 | /* | ||
68 | * Used to control the call to omap_hdq_get and omap_hdq_put. | ||
69 | * HDQ Protocol: Write the CMD|REG_address first, followed by | ||
70 | * the data wrire or read. | ||
71 | */ | ||
72 | int init_trans; | ||
73 | }; | ||
74 | |||
75 | static int __init omap_hdq_probe(struct platform_device *pdev); | ||
76 | static int omap_hdq_remove(struct platform_device *pdev); | ||
77 | |||
78 | static struct platform_driver omap_hdq_driver = { | ||
79 | .probe = omap_hdq_probe, | ||
80 | .remove = omap_hdq_remove, | ||
81 | .driver = { | ||
82 | .name = "omap_hdq", | ||
83 | }, | ||
84 | }; | ||
85 | |||
86 | static u8 omap_w1_read_byte(void *_hdq); | ||
87 | static void omap_w1_write_byte(void *_hdq, u8 byte); | ||
88 | static u8 omap_w1_reset_bus(void *_hdq); | ||
89 | static void omap_w1_search_bus(void *_hdq, struct w1_master *master_dev, | ||
90 | u8 search_type, w1_slave_found_callback slave_found); | ||
91 | |||
92 | |||
93 | static struct w1_bus_master omap_w1_master = { | ||
94 | .read_byte = omap_w1_read_byte, | ||
95 | .write_byte = omap_w1_write_byte, | ||
96 | .reset_bus = omap_w1_reset_bus, | ||
97 | .search = omap_w1_search_bus, | ||
98 | }; | ||
99 | |||
100 | /* HDQ register I/O routines */ | ||
101 | static inline u8 hdq_reg_in(struct hdq_data *hdq_data, u32 offset) | ||
102 | { | ||
103 | return __raw_readb(hdq_data->hdq_base + offset); | ||
104 | } | ||
105 | |||
106 | static inline void hdq_reg_out(struct hdq_data *hdq_data, u32 offset, u8 val) | ||
107 | { | ||
108 | __raw_writeb(val, hdq_data->hdq_base + offset); | ||
109 | } | ||
110 | |||
111 | static inline u8 hdq_reg_merge(struct hdq_data *hdq_data, u32 offset, | ||
112 | u8 val, u8 mask) | ||
113 | { | ||
114 | u8 new_val = (__raw_readb(hdq_data->hdq_base + offset) & ~mask) | ||
115 | | (val & mask); | ||
116 | __raw_writeb(new_val, hdq_data->hdq_base + offset); | ||
117 | |||
118 | return new_val; | ||
119 | } | ||
120 | |||
121 | /* | ||
122 | * Wait for one or more bits in flag change. | ||
123 | * HDQ_FLAG_SET: wait until any bit in the flag is set. | ||
124 | * HDQ_FLAG_CLEAR: wait until all bits in the flag are cleared. | ||
125 | * return 0 on success and -ETIMEDOUT in the case of timeout. | ||
126 | */ | ||
127 | static int hdq_wait_for_flag(struct hdq_data *hdq_data, u32 offset, | ||
128 | u8 flag, u8 flag_set, u8 *status) | ||
129 | { | ||
130 | int ret = 0; | ||
131 | unsigned long timeout = jiffies + OMAP_HDQ_TIMEOUT; | ||
132 | |||
133 | if (flag_set == OMAP_HDQ_FLAG_CLEAR) { | ||
134 | /* wait for the flag clear */ | ||
135 | while (((*status = hdq_reg_in(hdq_data, offset)) & flag) | ||
136 | && time_before(jiffies, timeout)) { | ||
137 | schedule_timeout_uninterruptible(1); | ||
138 | } | ||
139 | if (*status & flag) | ||
140 | ret = -ETIMEDOUT; | ||
141 | } else if (flag_set == OMAP_HDQ_FLAG_SET) { | ||
142 | /* wait for the flag set */ | ||
143 | while (!((*status = hdq_reg_in(hdq_data, offset)) & flag) | ||
144 | && time_before(jiffies, timeout)) { | ||
145 | schedule_timeout_uninterruptible(1); | ||
146 | } | ||
147 | if (!(*status & flag)) | ||
148 | ret = -ETIMEDOUT; | ||
149 | } else | ||
150 | return -EINVAL; | ||
151 | |||
152 | return ret; | ||
153 | } | ||
154 | |||
155 | /* write out a byte and fill *status with HDQ_INT_STATUS */ | ||
156 | static int hdq_write_byte(struct hdq_data *hdq_data, u8 val, u8 *status) | ||
157 | { | ||
158 | int ret; | ||
159 | u8 tmp_status; | ||
160 | unsigned long irqflags; | ||
161 | |||
162 | *status = 0; | ||
163 | |||
164 | spin_lock_irqsave(&hdq_data->hdq_spinlock, irqflags); | ||
165 | /* clear interrupt flags via a dummy read */ | ||
166 | hdq_reg_in(hdq_data, OMAP_HDQ_INT_STATUS); | ||
167 | /* ISR loads it with new INT_STATUS */ | ||
168 | hdq_data->hdq_irqstatus = 0; | ||
169 | spin_unlock_irqrestore(&hdq_data->hdq_spinlock, irqflags); | ||
170 | |||
171 | hdq_reg_out(hdq_data, OMAP_HDQ_TX_DATA, val); | ||
172 | |||
173 | /* set the GO bit */ | ||
174 | hdq_reg_merge(hdq_data, OMAP_HDQ_CTRL_STATUS, OMAP_HDQ_CTRL_STATUS_GO, | ||
175 | OMAP_HDQ_CTRL_STATUS_DIR | OMAP_HDQ_CTRL_STATUS_GO); | ||
176 | /* wait for the TXCOMPLETE bit */ | ||
177 | ret = wait_event_timeout(hdq_wait_queue, | ||
178 | hdq_data->hdq_irqstatus, OMAP_HDQ_TIMEOUT); | ||
179 | if (ret == 0) { | ||
180 | dev_dbg(hdq_data->dev, "TX wait elapsed\n"); | ||
181 | goto out; | ||
182 | } | ||
183 | |||
184 | *status = hdq_data->hdq_irqstatus; | ||
185 | /* check irqstatus */ | ||
186 | if (!(*status & OMAP_HDQ_INT_STATUS_TXCOMPLETE)) { | ||
187 | dev_dbg(hdq_data->dev, "timeout waiting for" | ||
188 | "TXCOMPLETE/RXCOMPLETE, %x", *status); | ||
189 | ret = -ETIMEDOUT; | ||
190 | goto out; | ||
191 | } | ||
192 | |||
193 | /* wait for the GO bit return to zero */ | ||
194 | ret = hdq_wait_for_flag(hdq_data, OMAP_HDQ_CTRL_STATUS, | ||
195 | OMAP_HDQ_CTRL_STATUS_GO, | ||
196 | OMAP_HDQ_FLAG_CLEAR, &tmp_status); | ||
197 | if (ret) { | ||
198 | dev_dbg(hdq_data->dev, "timeout waiting GO bit" | ||
199 | "return to zero, %x", tmp_status); | ||
200 | } | ||
201 | |||
202 | out: | ||
203 | return ret; | ||
204 | } | ||
205 | |||
206 | /* HDQ Interrupt service routine */ | ||
207 | static irqreturn_t hdq_isr(int irq, void *_hdq) | ||
208 | { | ||
209 | struct hdq_data *hdq_data = _hdq; | ||
210 | unsigned long irqflags; | ||
211 | |||
212 | spin_lock_irqsave(&hdq_data->hdq_spinlock, irqflags); | ||
213 | hdq_data->hdq_irqstatus = hdq_reg_in(hdq_data, OMAP_HDQ_INT_STATUS); | ||
214 | spin_unlock_irqrestore(&hdq_data->hdq_spinlock, irqflags); | ||
215 | dev_dbg(hdq_data->dev, "hdq_isr: %x", hdq_data->hdq_irqstatus); | ||
216 | |||
217 | if (hdq_data->hdq_irqstatus & | ||
218 | (OMAP_HDQ_INT_STATUS_TXCOMPLETE | OMAP_HDQ_INT_STATUS_RXCOMPLETE | ||
219 | | OMAP_HDQ_INT_STATUS_TIMEOUT)) { | ||
220 | /* wake up sleeping process */ | ||
221 | wake_up(&hdq_wait_queue); | ||
222 | } | ||
223 | |||
224 | return IRQ_HANDLED; | ||
225 | } | ||
226 | |||
227 | /* HDQ Mode: always return success */ | ||
228 | static u8 omap_w1_reset_bus(void *_hdq) | ||
229 | { | ||
230 | return 0; | ||
231 | } | ||
232 | |||
233 | /* W1 search callback function */ | ||
234 | static void omap_w1_search_bus(void *_hdq, struct w1_master *master_dev, | ||
235 | u8 search_type, w1_slave_found_callback slave_found) | ||
236 | { | ||
237 | u64 module_id, rn_le, cs, id; | ||
238 | |||
239 | if (w1_id) | ||
240 | module_id = w1_id; | ||
241 | else | ||
242 | module_id = 0x1; | ||
243 | |||
244 | rn_le = cpu_to_le64(module_id); | ||
245 | /* | ||
246 | * HDQ might not obey truly the 1-wire spec. | ||
247 | * So calculate CRC based on module parameter. | ||
248 | */ | ||
249 | cs = w1_calc_crc8((u8 *)&rn_le, 7); | ||
250 | id = (cs << 56) | module_id; | ||
251 | |||
252 | slave_found(master_dev, id); | ||
253 | } | ||
254 | |||
255 | static int _omap_hdq_reset(struct hdq_data *hdq_data) | ||
256 | { | ||
257 | int ret; | ||
258 | u8 tmp_status; | ||
259 | |||
260 | hdq_reg_out(hdq_data, OMAP_HDQ_SYSCONFIG, OMAP_HDQ_SYSCONFIG_SOFTRESET); | ||
261 | /* | ||
262 | * Select HDQ mode & enable clocks. | ||
263 | * It is observed that INT flags can't be cleared via a read and GO/INIT | ||
264 | * won't return to zero if interrupt is disabled. So we always enable | ||
265 | * interrupt. | ||
266 | */ | ||
267 | hdq_reg_out(hdq_data, OMAP_HDQ_CTRL_STATUS, | ||
268 | OMAP_HDQ_CTRL_STATUS_CLOCKENABLE | | ||
269 | OMAP_HDQ_CTRL_STATUS_INTERRUPTMASK); | ||
270 | |||
271 | /* wait for reset to complete */ | ||
272 | ret = hdq_wait_for_flag(hdq_data, OMAP_HDQ_SYSSTATUS, | ||
273 | OMAP_HDQ_SYSSTATUS_RESETDONE, OMAP_HDQ_FLAG_SET, &tmp_status); | ||
274 | if (ret) | ||
275 | dev_dbg(hdq_data->dev, "timeout waiting HDQ reset, %x", | ||
276 | tmp_status); | ||
277 | else { | ||
278 | hdq_reg_out(hdq_data, OMAP_HDQ_CTRL_STATUS, | ||
279 | OMAP_HDQ_CTRL_STATUS_CLOCKENABLE | | ||
280 | OMAP_HDQ_CTRL_STATUS_INTERRUPTMASK); | ||
281 | hdq_reg_out(hdq_data, OMAP_HDQ_SYSCONFIG, | ||
282 | OMAP_HDQ_SYSCONFIG_AUTOIDLE); | ||
283 | } | ||
284 | |||
285 | return ret; | ||
286 | } | ||
287 | |||
288 | /* Issue break pulse to the device */ | ||
289 | static int omap_hdq_break(struct hdq_data *hdq_data) | ||
290 | { | ||
291 | int ret = 0; | ||
292 | u8 tmp_status; | ||
293 | unsigned long irqflags; | ||
294 | |||
295 | ret = mutex_lock_interruptible(&hdq_data->hdq_mutex); | ||
296 | if (ret < 0) { | ||
297 | dev_dbg(hdq_data->dev, "Could not acquire mutex\n"); | ||
298 | ret = -EINTR; | ||
299 | goto rtn; | ||
300 | } | ||
301 | |||
302 | spin_lock_irqsave(&hdq_data->hdq_spinlock, irqflags); | ||
303 | /* clear interrupt flags via a dummy read */ | ||
304 | hdq_reg_in(hdq_data, OMAP_HDQ_INT_STATUS); | ||
305 | /* ISR loads it with new INT_STATUS */ | ||
306 | hdq_data->hdq_irqstatus = 0; | ||
307 | spin_unlock_irqrestore(&hdq_data->hdq_spinlock, irqflags); | ||
308 | |||
309 | /* set the INIT and GO bit */ | ||
310 | hdq_reg_merge(hdq_data, OMAP_HDQ_CTRL_STATUS, | ||
311 | OMAP_HDQ_CTRL_STATUS_INITIALIZATION | OMAP_HDQ_CTRL_STATUS_GO, | ||
312 | OMAP_HDQ_CTRL_STATUS_DIR | OMAP_HDQ_CTRL_STATUS_INITIALIZATION | | ||
313 | OMAP_HDQ_CTRL_STATUS_GO); | ||
314 | |||
315 | /* wait for the TIMEOUT bit */ | ||
316 | ret = wait_event_timeout(hdq_wait_queue, | ||
317 | hdq_data->hdq_irqstatus, OMAP_HDQ_TIMEOUT); | ||
318 | if (ret == 0) { | ||
319 | dev_dbg(hdq_data->dev, "break wait elapsed\n"); | ||
320 | ret = -EINTR; | ||
321 | goto out; | ||
322 | } | ||
323 | |||
324 | tmp_status = hdq_data->hdq_irqstatus; | ||
325 | /* check irqstatus */ | ||
326 | if (!(tmp_status & OMAP_HDQ_INT_STATUS_TIMEOUT)) { | ||
327 | dev_dbg(hdq_data->dev, "timeout waiting for TIMEOUT, %x", | ||
328 | tmp_status); | ||
329 | ret = -ETIMEDOUT; | ||
330 | goto out; | ||
331 | } | ||
332 | /* | ||
333 | * wait for both INIT and GO bits rerurn to zero. | ||
334 | * zero wait time expected for interrupt mode. | ||
335 | */ | ||
336 | ret = hdq_wait_for_flag(hdq_data, OMAP_HDQ_CTRL_STATUS, | ||
337 | OMAP_HDQ_CTRL_STATUS_INITIALIZATION | | ||
338 | OMAP_HDQ_CTRL_STATUS_GO, OMAP_HDQ_FLAG_CLEAR, | ||
339 | &tmp_status); | ||
340 | if (ret) | ||
341 | dev_dbg(hdq_data->dev, "timeout waiting INIT&GO bits" | ||
342 | "return to zero, %x", tmp_status); | ||
343 | |||
344 | out: | ||
345 | mutex_unlock(&hdq_data->hdq_mutex); | ||
346 | rtn: | ||
347 | return ret; | ||
348 | } | ||
349 | |||
350 | static int hdq_read_byte(struct hdq_data *hdq_data, u8 *val) | ||
351 | { | ||
352 | int ret = 0; | ||
353 | u8 status; | ||
354 | unsigned long timeout = jiffies + OMAP_HDQ_TIMEOUT; | ||
355 | |||
356 | ret = mutex_lock_interruptible(&hdq_data->hdq_mutex); | ||
357 | if (ret < 0) { | ||
358 | ret = -EINTR; | ||
359 | goto rtn; | ||
360 | } | ||
361 | |||
362 | if (!hdq_data->hdq_usecount) { | ||
363 | ret = -EINVAL; | ||
364 | goto out; | ||
365 | } | ||
366 | |||
367 | if (!(hdq_data->hdq_irqstatus & OMAP_HDQ_INT_STATUS_RXCOMPLETE)) { | ||
368 | hdq_reg_merge(hdq_data, OMAP_HDQ_CTRL_STATUS, | ||
369 | OMAP_HDQ_CTRL_STATUS_DIR | OMAP_HDQ_CTRL_STATUS_GO, | ||
370 | OMAP_HDQ_CTRL_STATUS_DIR | OMAP_HDQ_CTRL_STATUS_GO); | ||
371 | /* | ||
372 | * The RX comes immediately after TX. It | ||
373 | * triggers another interrupt before we | ||
374 | * sleep. So we have to wait for RXCOMPLETE bit. | ||
375 | */ | ||
376 | while (!(hdq_data->hdq_irqstatus | ||
377 | & OMAP_HDQ_INT_STATUS_RXCOMPLETE) | ||
378 | && time_before(jiffies, timeout)) { | ||
379 | schedule_timeout_uninterruptible(1); | ||
380 | } | ||
381 | hdq_reg_merge(hdq_data, OMAP_HDQ_CTRL_STATUS, 0, | ||
382 | OMAP_HDQ_CTRL_STATUS_DIR); | ||
383 | status = hdq_data->hdq_irqstatus; | ||
384 | /* check irqstatus */ | ||
385 | if (!(status & OMAP_HDQ_INT_STATUS_RXCOMPLETE)) { | ||
386 | dev_dbg(hdq_data->dev, "timeout waiting for" | ||
387 | "RXCOMPLETE, %x", status); | ||
388 | ret = -ETIMEDOUT; | ||
389 | goto out; | ||
390 | } | ||
391 | } | ||
392 | /* the data is ready. Read it in! */ | ||
393 | *val = hdq_reg_in(hdq_data, OMAP_HDQ_RX_DATA); | ||
394 | out: | ||
395 | mutex_unlock(&hdq_data->hdq_mutex); | ||
396 | rtn: | ||
397 | return 0; | ||
398 | |||
399 | } | ||
400 | |||
401 | /* Enable clocks and set the controller to HDQ mode */ | ||
402 | static int omap_hdq_get(struct hdq_data *hdq_data) | ||
403 | { | ||
404 | int ret = 0; | ||
405 | |||
406 | ret = mutex_lock_interruptible(&hdq_data->hdq_mutex); | ||
407 | if (ret < 0) { | ||
408 | ret = -EINTR; | ||
409 | goto rtn; | ||
410 | } | ||
411 | |||
412 | if (OMAP_HDQ_MAX_USER == hdq_data->hdq_usecount) { | ||
413 | dev_dbg(hdq_data->dev, "attempt to exceed the max use count"); | ||
414 | ret = -EINVAL; | ||
415 | goto out; | ||
416 | } else { | ||
417 | hdq_data->hdq_usecount++; | ||
418 | try_module_get(THIS_MODULE); | ||
419 | if (1 == hdq_data->hdq_usecount) { | ||
420 | if (clk_enable(hdq_data->hdq_ick)) { | ||
421 | dev_dbg(hdq_data->dev, "Can not enable ick\n"); | ||
422 | ret = -ENODEV; | ||
423 | goto clk_err; | ||
424 | } | ||
425 | if (clk_enable(hdq_data->hdq_fck)) { | ||
426 | dev_dbg(hdq_data->dev, "Can not enable fck\n"); | ||
427 | clk_disable(hdq_data->hdq_ick); | ||
428 | ret = -ENODEV; | ||
429 | goto clk_err; | ||
430 | } | ||
431 | |||
432 | /* make sure HDQ is out of reset */ | ||
433 | if (!(hdq_reg_in(hdq_data, OMAP_HDQ_SYSSTATUS) & | ||
434 | OMAP_HDQ_SYSSTATUS_RESETDONE)) { | ||
435 | ret = _omap_hdq_reset(hdq_data); | ||
436 | if (ret) | ||
437 | /* back up the count */ | ||
438 | hdq_data->hdq_usecount--; | ||
439 | } else { | ||
440 | /* select HDQ mode & enable clocks */ | ||
441 | hdq_reg_out(hdq_data, OMAP_HDQ_CTRL_STATUS, | ||
442 | OMAP_HDQ_CTRL_STATUS_CLOCKENABLE | | ||
443 | OMAP_HDQ_CTRL_STATUS_INTERRUPTMASK); | ||
444 | hdq_reg_out(hdq_data, OMAP_HDQ_SYSCONFIG, | ||
445 | OMAP_HDQ_SYSCONFIG_AUTOIDLE); | ||
446 | hdq_reg_in(hdq_data, OMAP_HDQ_INT_STATUS); | ||
447 | } | ||
448 | } | ||
449 | } | ||
450 | |||
451 | clk_err: | ||
452 | clk_put(hdq_data->hdq_ick); | ||
453 | clk_put(hdq_data->hdq_fck); | ||
454 | out: | ||
455 | mutex_unlock(&hdq_data->hdq_mutex); | ||
456 | rtn: | ||
457 | return ret; | ||
458 | } | ||
459 | |||
460 | /* Disable clocks to the module */ | ||
461 | static int omap_hdq_put(struct hdq_data *hdq_data) | ||
462 | { | ||
463 | int ret = 0; | ||
464 | |||
465 | ret = mutex_lock_interruptible(&hdq_data->hdq_mutex); | ||
466 | if (ret < 0) | ||
467 | return -EINTR; | ||
468 | |||
469 | if (0 == hdq_data->hdq_usecount) { | ||
470 | dev_dbg(hdq_data->dev, "attempt to decrement use count" | ||
471 | "when it is zero"); | ||
472 | ret = -EINVAL; | ||
473 | } else { | ||
474 | hdq_data->hdq_usecount--; | ||
475 | module_put(THIS_MODULE); | ||
476 | if (0 == hdq_data->hdq_usecount) { | ||
477 | clk_disable(hdq_data->hdq_ick); | ||
478 | clk_disable(hdq_data->hdq_fck); | ||
479 | } | ||
480 | } | ||
481 | mutex_unlock(&hdq_data->hdq_mutex); | ||
482 | |||
483 | return ret; | ||
484 | } | ||
485 | |||
486 | /* Read a byte of data from the device */ | ||
487 | static u8 omap_w1_read_byte(void *_hdq) | ||
488 | { | ||
489 | struct hdq_data *hdq_data = _hdq; | ||
490 | u8 val = 0; | ||
491 | int ret; | ||
492 | |||
493 | ret = hdq_read_byte(hdq_data, &val); | ||
494 | if (ret) { | ||
495 | ret = mutex_lock_interruptible(&hdq_data->hdq_mutex); | ||
496 | if (ret < 0) { | ||
497 | dev_dbg(hdq_data->dev, "Could not acquire mutex\n"); | ||
498 | return -EINTR; | ||
499 | } | ||
500 | hdq_data->init_trans = 0; | ||
501 | mutex_unlock(&hdq_data->hdq_mutex); | ||
502 | omap_hdq_put(hdq_data); | ||
503 | return -1; | ||
504 | } | ||
505 | |||
506 | /* Write followed by a read, release the module */ | ||
507 | if (hdq_data->init_trans) { | ||
508 | ret = mutex_lock_interruptible(&hdq_data->hdq_mutex); | ||
509 | if (ret < 0) { | ||
510 | dev_dbg(hdq_data->dev, "Could not acquire mutex\n"); | ||
511 | return -EINTR; | ||
512 | } | ||
513 | hdq_data->init_trans = 0; | ||
514 | mutex_unlock(&hdq_data->hdq_mutex); | ||
515 | omap_hdq_put(hdq_data); | ||
516 | } | ||
517 | |||
518 | return val; | ||
519 | } | ||
520 | |||
521 | /* Write a byte of data to the device */ | ||
522 | static void omap_w1_write_byte(void *_hdq, u8 byte) | ||
523 | { | ||
524 | struct hdq_data *hdq_data = _hdq; | ||
525 | int ret; | ||
526 | u8 status; | ||
527 | |||
528 | /* First write to initialize the transfer */ | ||
529 | if (hdq_data->init_trans == 0) | ||
530 | omap_hdq_get(hdq_data); | ||
531 | |||
532 | ret = mutex_lock_interruptible(&hdq_data->hdq_mutex); | ||
533 | if (ret < 0) { | ||
534 | dev_dbg(hdq_data->dev, "Could not acquire mutex\n"); | ||
535 | return; | ||
536 | } | ||
537 | hdq_data->init_trans++; | ||
538 | mutex_unlock(&hdq_data->hdq_mutex); | ||
539 | |||
540 | ret = hdq_write_byte(hdq_data, byte, &status); | ||
541 | if (ret == 0) { | ||
542 | dev_dbg(hdq_data->dev, "TX failure:Ctrl status %x\n", status); | ||
543 | return; | ||
544 | } | ||
545 | |||
546 | /* Second write, data transfered. Release the module */ | ||
547 | if (hdq_data->init_trans > 1) { | ||
548 | omap_hdq_put(hdq_data); | ||
549 | ret = mutex_lock_interruptible(&hdq_data->hdq_mutex); | ||
550 | if (ret < 0) { | ||
551 | dev_dbg(hdq_data->dev, "Could not acquire mutex\n"); | ||
552 | return; | ||
553 | } | ||
554 | hdq_data->init_trans = 0; | ||
555 | mutex_unlock(&hdq_data->hdq_mutex); | ||
556 | } | ||
557 | |||
558 | return; | ||
559 | } | ||
560 | |||
561 | static int __init omap_hdq_probe(struct platform_device *pdev) | ||
562 | { | ||
563 | struct hdq_data *hdq_data; | ||
564 | struct resource *res; | ||
565 | int ret, irq; | ||
566 | u8 rev; | ||
567 | |||
568 | hdq_data = kmalloc(sizeof(*hdq_data), GFP_KERNEL); | ||
569 | if (!hdq_data) { | ||
570 | dev_dbg(&pdev->dev, "unable to allocate memory\n"); | ||
571 | ret = -ENOMEM; | ||
572 | goto err_kmalloc; | ||
573 | } | ||
574 | |||
575 | hdq_data->dev = &pdev->dev; | ||
576 | platform_set_drvdata(pdev, hdq_data); | ||
577 | |||
578 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
579 | if (!res) { | ||
580 | dev_dbg(&pdev->dev, "unable to get resource\n"); | ||
581 | ret = -ENXIO; | ||
582 | goto err_resource; | ||
583 | } | ||
584 | |||
585 | hdq_data->hdq_base = ioremap(res->start, SZ_4K); | ||
586 | if (!hdq_data->hdq_base) { | ||
587 | dev_dbg(&pdev->dev, "ioremap failed\n"); | ||
588 | ret = -EINVAL; | ||
589 | goto err_ioremap; | ||
590 | } | ||
591 | |||
592 | /* get interface & functional clock objects */ | ||
593 | hdq_data->hdq_ick = clk_get(&pdev->dev, "hdq_ick"); | ||
594 | hdq_data->hdq_fck = clk_get(&pdev->dev, "hdq_fck"); | ||
595 | |||
596 | if (IS_ERR(hdq_data->hdq_ick) || IS_ERR(hdq_data->hdq_fck)) { | ||
597 | dev_dbg(&pdev->dev, "Can't get HDQ clock objects\n"); | ||
598 | if (IS_ERR(hdq_data->hdq_ick)) { | ||
599 | ret = PTR_ERR(hdq_data->hdq_ick); | ||
600 | goto err_clk; | ||
601 | } | ||
602 | if (IS_ERR(hdq_data->hdq_fck)) { | ||
603 | ret = PTR_ERR(hdq_data->hdq_fck); | ||
604 | clk_put(hdq_data->hdq_ick); | ||
605 | goto err_clk; | ||
606 | } | ||
607 | } | ||
608 | |||
609 | hdq_data->hdq_usecount = 0; | ||
610 | mutex_init(&hdq_data->hdq_mutex); | ||
611 | |||
612 | if (clk_enable(hdq_data->hdq_ick)) { | ||
613 | dev_dbg(&pdev->dev, "Can not enable ick\n"); | ||
614 | ret = -ENODEV; | ||
615 | goto err_intfclk; | ||
616 | } | ||
617 | |||
618 | if (clk_enable(hdq_data->hdq_fck)) { | ||
619 | dev_dbg(&pdev->dev, "Can not enable fck\n"); | ||
620 | ret = -ENODEV; | ||
621 | goto err_fnclk; | ||
622 | } | ||
623 | |||
624 | rev = hdq_reg_in(hdq_data, OMAP_HDQ_REVISION); | ||
625 | dev_info(&pdev->dev, "OMAP HDQ Hardware Rev %c.%c. Driver in %s mode\n", | ||
626 | (rev >> 4) + '0', (rev & 0x0f) + '0', "Interrupt"); | ||
627 | |||
628 | spin_lock_init(&hdq_data->hdq_spinlock); | ||
629 | |||
630 | irq = platform_get_irq(pdev, 0); | ||
631 | if (irq < 0) { | ||
632 | ret = -ENXIO; | ||
633 | goto err_irq; | ||
634 | } | ||
635 | |||
636 | ret = request_irq(irq, hdq_isr, IRQF_DISABLED, "omap_hdq", hdq_data); | ||
637 | if (ret < 0) { | ||
638 | dev_dbg(&pdev->dev, "could not request irq\n"); | ||
639 | goto err_irq; | ||
640 | } | ||
641 | |||
642 | omap_hdq_break(hdq_data); | ||
643 | |||
644 | /* don't clock the HDQ until it is needed */ | ||
645 | clk_disable(hdq_data->hdq_ick); | ||
646 | clk_disable(hdq_data->hdq_fck); | ||
647 | |||
648 | omap_w1_master.data = hdq_data; | ||
649 | |||
650 | ret = w1_add_master_device(&omap_w1_master); | ||
651 | if (ret) { | ||
652 | dev_dbg(&pdev->dev, "Failure in registering w1 master\n"); | ||
653 | goto err_w1; | ||
654 | } | ||
655 | |||
656 | return 0; | ||
657 | |||
658 | err_w1: | ||
659 | err_irq: | ||
660 | clk_disable(hdq_data->hdq_fck); | ||
661 | |||
662 | err_fnclk: | ||
663 | clk_disable(hdq_data->hdq_ick); | ||
664 | |||
665 | err_intfclk: | ||
666 | clk_put(hdq_data->hdq_ick); | ||
667 | clk_put(hdq_data->hdq_fck); | ||
668 | |||
669 | err_clk: | ||
670 | iounmap(hdq_data->hdq_base); | ||
671 | |||
672 | err_ioremap: | ||
673 | err_resource: | ||
674 | platform_set_drvdata(pdev, NULL); | ||
675 | kfree(hdq_data); | ||
676 | |||
677 | err_kmalloc: | ||
678 | return ret; | ||
679 | |||
680 | } | ||
681 | |||
682 | static int omap_hdq_remove(struct platform_device *pdev) | ||
683 | { | ||
684 | struct hdq_data *hdq_data = platform_get_drvdata(pdev); | ||
685 | |||
686 | mutex_lock(&hdq_data->hdq_mutex); | ||
687 | |||
688 | if (hdq_data->hdq_usecount) { | ||
689 | dev_dbg(&pdev->dev, "removed when use count is not zero\n"); | ||
690 | return -EBUSY; | ||
691 | } | ||
692 | |||
693 | mutex_unlock(&hdq_data->hdq_mutex); | ||
694 | |||
695 | /* remove module dependency */ | ||
696 | clk_put(hdq_data->hdq_ick); | ||
697 | clk_put(hdq_data->hdq_fck); | ||
698 | free_irq(INT_24XX_HDQ_IRQ, hdq_data); | ||
699 | platform_set_drvdata(pdev, NULL); | ||
700 | iounmap(hdq_data->hdq_base); | ||
701 | kfree(hdq_data); | ||
702 | |||
703 | return 0; | ||
704 | } | ||
705 | |||
706 | static int __init | ||
707 | omap_hdq_init(void) | ||
708 | { | ||
709 | return platform_driver_register(&omap_hdq_driver); | ||
710 | } | ||
711 | module_init(omap_hdq_init); | ||
712 | |||
713 | static void __exit | ||
714 | omap_hdq_exit(void) | ||
715 | { | ||
716 | platform_driver_unregister(&omap_hdq_driver); | ||
717 | } | ||
718 | module_exit(omap_hdq_exit); | ||
719 | |||
720 | module_param(w1_id, int, S_IRUSR); | ||
721 | MODULE_PARM_DESC(w1_id, "1-wire id for the slave detection"); | ||
722 | |||
723 | MODULE_AUTHOR("Texas Instruments"); | ||
724 | MODULE_DESCRIPTION("HDQ driver Library"); | ||
725 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/w1/slaves/Kconfig b/drivers/w1/slaves/Kconfig index 3df29a122f84..8d0b1fb1e52e 100644 --- a/drivers/w1/slaves/Kconfig +++ b/drivers/w1/slaves/Kconfig | |||
@@ -44,4 +44,11 @@ config W1_SLAVE_DS2760 | |||
44 | 44 | ||
45 | If you are unsure, say N. | 45 | If you are unsure, say N. |
46 | 46 | ||
47 | config W1_SLAVE_BQ27000 | ||
48 | tristate "BQ27000 slave support" | ||
49 | depends on W1 | ||
50 | help | ||
51 | Say Y here if you want to use a hdq | ||
52 | bq27000 slave support. | ||
53 | |||
47 | endmenu | 54 | endmenu |
diff --git a/drivers/w1/slaves/Makefile b/drivers/w1/slaves/Makefile index a8eb7524df1d..990f400b6d22 100644 --- a/drivers/w1/slaves/Makefile +++ b/drivers/w1/slaves/Makefile | |||
@@ -6,4 +6,4 @@ obj-$(CONFIG_W1_SLAVE_THERM) += w1_therm.o | |||
6 | obj-$(CONFIG_W1_SLAVE_SMEM) += w1_smem.o | 6 | obj-$(CONFIG_W1_SLAVE_SMEM) += w1_smem.o |
7 | obj-$(CONFIG_W1_SLAVE_DS2433) += w1_ds2433.o | 7 | obj-$(CONFIG_W1_SLAVE_DS2433) += w1_ds2433.o |
8 | obj-$(CONFIG_W1_SLAVE_DS2760) += w1_ds2760.o | 8 | obj-$(CONFIG_W1_SLAVE_DS2760) += w1_ds2760.o |
9 | 9 | obj-$(CONFIG_W1_SLAVE_BQ27000) += w1_bq27000.o | |
diff --git a/drivers/w1/slaves/w1_bq27000.c b/drivers/w1/slaves/w1_bq27000.c new file mode 100644 index 000000000000..8f4c91f6c680 --- /dev/null +++ b/drivers/w1/slaves/w1_bq27000.c | |||
@@ -0,0 +1,123 @@ | |||
1 | /* | ||
2 | * drivers/w1/slaves/w1_bq27000.c | ||
3 | * | ||
4 | * Copyright (C) 2007 Texas Instruments, Inc. | ||
5 | * | ||
6 | * This file is licensed under the terms of the GNU General Public License | ||
7 | * version 2. This program is licensed "as is" without any warranty of any | ||
8 | * kind, whether express or implied. | ||
9 | * | ||
10 | */ | ||
11 | |||
12 | #include <linux/kernel.h> | ||
13 | #include <linux/module.h> | ||
14 | #include <linux/device.h> | ||
15 | #include <linux/types.h> | ||
16 | #include <linux/platform_device.h> | ||
17 | #include <linux/mutex.h> | ||
18 | |||
19 | #include "../w1.h" | ||
20 | #include "../w1_int.h" | ||
21 | #include "../w1_family.h" | ||
22 | |||
23 | #define HDQ_CMD_READ (0) | ||
24 | #define HDQ_CMD_WRITE (1<<7) | ||
25 | |||
26 | static int F_ID; | ||
27 | |||
28 | void w1_bq27000_write(struct device *dev, u8 buf, u8 reg) | ||
29 | { | ||
30 | struct w1_slave *sl = container_of(dev, struct w1_slave, dev); | ||
31 | |||
32 | if (!dev) { | ||
33 | pr_info("Could not obtain slave dev ptr\n"); | ||
34 | return; | ||
35 | } | ||
36 | |||
37 | w1_write_8(sl->master, HDQ_CMD_WRITE | reg); | ||
38 | w1_write_8(sl->master, buf); | ||
39 | } | ||
40 | EXPORT_SYMBOL(w1_bq27000_write); | ||
41 | |||
42 | int w1_bq27000_read(struct device *dev, u8 reg) | ||
43 | { | ||
44 | u8 val; | ||
45 | struct w1_slave *sl = container_of(dev, struct w1_slave, dev); | ||
46 | |||
47 | if (!dev) | ||
48 | return 0; | ||
49 | |||
50 | w1_write_8(sl->master, HDQ_CMD_READ | reg); | ||
51 | val = w1_read_8(sl->master); | ||
52 | |||
53 | return val; | ||
54 | } | ||
55 | EXPORT_SYMBOL(w1_bq27000_read); | ||
56 | |||
57 | static int w1_bq27000_add_slave(struct w1_slave *sl) | ||
58 | { | ||
59 | int ret; | ||
60 | int id = 1; | ||
61 | struct platform_device *pdev; | ||
62 | |||
63 | pdev = platform_device_alloc("bq27000-battery", id); | ||
64 | if (!pdev) { | ||
65 | ret = -ENOMEM; | ||
66 | return ret; | ||
67 | } | ||
68 | pdev->dev.parent = &sl->dev; | ||
69 | |||
70 | ret = platform_device_add(pdev); | ||
71 | if (ret) | ||
72 | goto pdev_add_failed; | ||
73 | |||
74 | dev_set_drvdata(&sl->dev, pdev); | ||
75 | |||
76 | goto success; | ||
77 | |||
78 | pdev_add_failed: | ||
79 | platform_device_unregister(pdev); | ||
80 | success: | ||
81 | return ret; | ||
82 | } | ||
83 | |||
84 | static void w1_bq27000_remove_slave(struct w1_slave *sl) | ||
85 | { | ||
86 | struct platform_device *pdev = dev_get_drvdata(&sl->dev); | ||
87 | |||
88 | platform_device_unregister(pdev); | ||
89 | } | ||
90 | |||
91 | static struct w1_family_ops w1_bq27000_fops = { | ||
92 | .add_slave = w1_bq27000_add_slave, | ||
93 | .remove_slave = w1_bq27000_remove_slave, | ||
94 | }; | ||
95 | |||
96 | static struct w1_family w1_bq27000_family = { | ||
97 | .fid = 1, | ||
98 | .fops = &w1_bq27000_fops, | ||
99 | }; | ||
100 | |||
101 | static int __init w1_bq27000_init(void) | ||
102 | { | ||
103 | if (F_ID) | ||
104 | w1_bq27000_family.fid = F_ID; | ||
105 | |||
106 | return w1_register_family(&w1_bq27000_family); | ||
107 | } | ||
108 | |||
109 | static void __exit w1_bq27000_exit(void) | ||
110 | { | ||
111 | w1_unregister_family(&w1_bq27000_family); | ||
112 | } | ||
113 | |||
114 | |||
115 | module_init(w1_bq27000_init); | ||
116 | module_exit(w1_bq27000_exit); | ||
117 | |||
118 | module_param(F_ID, int, S_IRUSR); | ||
119 | MODULE_PARM_DESC(F_ID, "1-wire slave FID for BQ device"); | ||
120 | |||
121 | MODULE_LICENSE("GPL"); | ||
122 | MODULE_AUTHOR("Texas Instruments Ltd"); | ||
123 | MODULE_DESCRIPTION("HDQ/1-wire slave driver bq27000 battery monitor chip"); | ||
diff --git a/drivers/w1/w1.h b/drivers/w1/w1.h index cdaa6fffbfc7..97304bd83ec9 100644 --- a/drivers/w1/w1.h +++ b/drivers/w1/w1.h | |||
@@ -206,6 +206,7 @@ void w1_slave_detach(struct w1_slave *sl); | |||
206 | 206 | ||
207 | u8 w1_triplet(struct w1_master *dev, int bdir); | 207 | u8 w1_triplet(struct w1_master *dev, int bdir); |
208 | void w1_write_8(struct w1_master *, u8); | 208 | void w1_write_8(struct w1_master *, u8); |
209 | u8 w1_read_8(struct w1_master *); | ||
209 | int w1_reset_bus(struct w1_master *); | 210 | int w1_reset_bus(struct w1_master *); |
210 | u8 w1_calc_crc8(u8 *, int); | 211 | u8 w1_calc_crc8(u8 *, int); |
211 | void w1_write_block(struct w1_master *, const u8 *, int); | 212 | void w1_write_block(struct w1_master *, const u8 *, int); |
diff --git a/drivers/w1/w1_io.c b/drivers/w1/w1_io.c index f4f82f1f486e..0d15b0eaf79a 100644 --- a/drivers/w1/w1_io.c +++ b/drivers/w1/w1_io.c | |||
@@ -217,7 +217,7 @@ u8 w1_triplet(struct w1_master *dev, int bdir) | |||
217 | * @param dev the master device | 217 | * @param dev the master device |
218 | * @return the byte read | 218 | * @return the byte read |
219 | */ | 219 | */ |
220 | static u8 w1_read_8(struct w1_master * dev) | 220 | u8 w1_read_8(struct w1_master *dev) |
221 | { | 221 | { |
222 | int i; | 222 | int i; |
223 | u8 res = 0; | 223 | u8 res = 0; |
@@ -230,6 +230,7 @@ static u8 w1_read_8(struct w1_master * dev) | |||
230 | 230 | ||
231 | return res; | 231 | return res; |
232 | } | 232 | } |
233 | EXPORT_SYMBOL_GPL(w1_read_8); | ||
233 | 234 | ||
234 | /** | 235 | /** |
235 | * Writes a series of bytes. | 236 | * Writes a series of bytes. |
diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c index a0fb5eac407c..526c191e84ea 100644 --- a/drivers/xen/balloon.c +++ b/drivers/xen/balloon.c | |||
@@ -122,14 +122,7 @@ static struct timer_list balloon_timer; | |||
122 | static void scrub_page(struct page *page) | 122 | static void scrub_page(struct page *page) |
123 | { | 123 | { |
124 | #ifdef CONFIG_XEN_SCRUB_PAGES | 124 | #ifdef CONFIG_XEN_SCRUB_PAGES |
125 | if (PageHighMem(page)) { | 125 | clear_highpage(page); |
126 | void *v = kmap(page); | ||
127 | clear_page(v); | ||
128 | kunmap(v); | ||
129 | } else { | ||
130 | void *v = page_address(page); | ||
131 | clear_page(v); | ||
132 | } | ||
133 | #endif | 126 | #endif |
134 | } | 127 | } |
135 | 128 | ||
diff --git a/fs/buffer.c b/fs/buffer.c index 6569fda5cfed..10179cfa1152 100644 --- a/fs/buffer.c +++ b/fs/buffer.c | |||
@@ -878,6 +878,7 @@ void invalidate_inode_buffers(struct inode *inode) | |||
878 | spin_unlock(&buffer_mapping->private_lock); | 878 | spin_unlock(&buffer_mapping->private_lock); |
879 | } | 879 | } |
880 | } | 880 | } |
881 | EXPORT_SYMBOL(invalidate_inode_buffers); | ||
881 | 882 | ||
882 | /* | 883 | /* |
883 | * Remove any clean buffers from the inode's buffer list. This is called | 884 | * Remove any clean buffers from the inode's buffer list. This is called |
diff --git a/fs/cifs/CHANGES b/fs/cifs/CHANGES index 8855331b2fba..e078b7aea143 100644 --- a/fs/cifs/CHANGES +++ b/fs/cifs/CHANGES | |||
@@ -8,7 +8,11 @@ handling fcntl(F_SETLEASE). Convert cifs to using blocking tcp | |||
8 | sends, and also let tcp autotune the socket send and receive buffers. | 8 | sends, and also let tcp autotune the socket send and receive buffers. |
9 | This reduces the number of EAGAIN errors returned by TCP/IP in | 9 | This reduces the number of EAGAIN errors returned by TCP/IP in |
10 | high stress workloads (and the number of retries on socket writes | 10 | high stress workloads (and the number of retries on socket writes |
11 | when sending large SMBWriteX requests). | 11 | when sending large SMBWriteX requests). Fix case in which a portion of |
12 | data can in some cases not get written to the file on the server before the | ||
13 | file is closed. Fix DFS parsing to properly handle path consumed field, | ||
14 | and to handle certain codepage conversions better. Fix mount and | ||
15 | umount race that can cause oops in mount or umount or reconnect. | ||
12 | 16 | ||
13 | Version 1.54 | 17 | Version 1.54 |
14 | ------------ | 18 | ------------ |
diff --git a/fs/cifs/cifs_debug.c b/fs/cifs/cifs_debug.c index 69a12aae91d3..490e34bbf27a 100644 --- a/fs/cifs/cifs_debug.c +++ b/fs/cifs/cifs_debug.c | |||
@@ -107,12 +107,13 @@ void cifs_dump_mids(struct TCP_Server_Info *server) | |||
107 | #ifdef CONFIG_PROC_FS | 107 | #ifdef CONFIG_PROC_FS |
108 | static int cifs_debug_data_proc_show(struct seq_file *m, void *v) | 108 | static int cifs_debug_data_proc_show(struct seq_file *m, void *v) |
109 | { | 109 | { |
110 | struct list_head *tmp; | 110 | struct list_head *tmp1, *tmp2, *tmp3; |
111 | struct list_head *tmp1; | ||
112 | struct mid_q_entry *mid_entry; | 111 | struct mid_q_entry *mid_entry; |
112 | struct TCP_Server_Info *server; | ||
113 | struct cifsSesInfo *ses; | 113 | struct cifsSesInfo *ses; |
114 | struct cifsTconInfo *tcon; | 114 | struct cifsTconInfo *tcon; |
115 | int i; | 115 | int i, j; |
116 | __u32 dev_type; | ||
116 | 117 | ||
117 | seq_puts(m, | 118 | seq_puts(m, |
118 | "Display Internal CIFS Data Structures for Debugging\n" | 119 | "Display Internal CIFS Data Structures for Debugging\n" |
@@ -122,46 +123,78 @@ static int cifs_debug_data_proc_show(struct seq_file *m, void *v) | |||
122 | seq_printf(m, "Servers:"); | 123 | seq_printf(m, "Servers:"); |
123 | 124 | ||
124 | i = 0; | 125 | i = 0; |
125 | read_lock(&GlobalSMBSeslock); | 126 | read_lock(&cifs_tcp_ses_lock); |
126 | list_for_each(tmp, &GlobalSMBSessionList) { | 127 | list_for_each(tmp1, &cifs_tcp_ses_list) { |
128 | server = list_entry(tmp1, struct TCP_Server_Info, | ||
129 | tcp_ses_list); | ||
127 | i++; | 130 | i++; |
128 | ses = list_entry(tmp, struct cifsSesInfo, cifsSessionList); | 131 | list_for_each(tmp2, &server->smb_ses_list) { |
129 | if ((ses->serverDomain == NULL) || (ses->serverOS == NULL) || | 132 | ses = list_entry(tmp2, struct cifsSesInfo, |
130 | (ses->serverNOS == NULL)) { | 133 | smb_ses_list); |
131 | seq_printf(m, "\nentry for %s not fully " | 134 | if ((ses->serverDomain == NULL) || |
132 | "displayed\n\t", ses->serverName); | 135 | (ses->serverOS == NULL) || |
133 | } else { | 136 | (ses->serverNOS == NULL)) { |
134 | seq_printf(m, | 137 | seq_printf(m, "\n%d) entry for %s not fully " |
135 | "\n%d) Name: %s Domain: %s Mounts: %d OS:" | 138 | "displayed\n\t", i, ses->serverName); |
136 | " %s \n\tNOS: %s\tCapability: 0x%x\n\tSMB" | 139 | } else { |
140 | seq_printf(m, | ||
141 | "\n%d) Name: %s Domain: %s Uses: %d OS:" | ||
142 | " %s\n\tNOS: %s\tCapability: 0x%x\n\tSMB" | ||
137 | " session status: %d\t", | 143 | " session status: %d\t", |
138 | i, ses->serverName, ses->serverDomain, | 144 | i, ses->serverName, ses->serverDomain, |
139 | atomic_read(&ses->inUse), | 145 | ses->ses_count, ses->serverOS, ses->serverNOS, |
140 | ses->serverOS, ses->serverNOS, | ||
141 | ses->capabilities, ses->status); | 146 | ses->capabilities, ses->status); |
142 | } | 147 | } |
143 | if (ses->server) { | ||
144 | seq_printf(m, "TCP status: %d\n\tLocal Users To " | 148 | seq_printf(m, "TCP status: %d\n\tLocal Users To " |
145 | "Server: %d SecMode: 0x%x Req On Wire: %d", | 149 | "Server: %d SecMode: 0x%x Req On Wire: %d", |
146 | ses->server->tcpStatus, | 150 | server->tcpStatus, server->srv_count, |
147 | atomic_read(&ses->server->socketUseCount), | 151 | server->secMode, |
148 | ses->server->secMode, | 152 | atomic_read(&server->inFlight)); |
149 | atomic_read(&ses->server->inFlight)); | ||
150 | 153 | ||
151 | #ifdef CONFIG_CIFS_STATS2 | 154 | #ifdef CONFIG_CIFS_STATS2 |
152 | seq_printf(m, " In Send: %d In MaxReq Wait: %d", | 155 | seq_printf(m, " In Send: %d In MaxReq Wait: %d", |
153 | atomic_read(&ses->server->inSend), | 156 | atomic_read(&server->inSend), |
154 | atomic_read(&ses->server->num_waiters)); | 157 | atomic_read(&server->num_waiters)); |
155 | #endif | 158 | #endif |
156 | 159 | ||
157 | seq_puts(m, "\nMIDs:\n"); | 160 | seq_puts(m, "\n\tShares:"); |
161 | j = 0; | ||
162 | list_for_each(tmp3, &ses->tcon_list) { | ||
163 | tcon = list_entry(tmp3, struct cifsTconInfo, | ||
164 | tcon_list); | ||
165 | ++j; | ||
166 | dev_type = le32_to_cpu(tcon->fsDevInfo.DeviceType); | ||
167 | seq_printf(m, "\n\t%d) %s Mounts: %d ", j, | ||
168 | tcon->treeName, tcon->tc_count); | ||
169 | if (tcon->nativeFileSystem) { | ||
170 | seq_printf(m, "Type: %s ", | ||
171 | tcon->nativeFileSystem); | ||
172 | } | ||
173 | seq_printf(m, "DevInfo: 0x%x Attributes: 0x%x" | ||
174 | "\nPathComponentMax: %d Status: 0x%d", | ||
175 | le32_to_cpu(tcon->fsDevInfo.DeviceCharacteristics), | ||
176 | le32_to_cpu(tcon->fsAttrInfo.Attributes), | ||
177 | le32_to_cpu(tcon->fsAttrInfo.MaxPathNameComponentLength), | ||
178 | tcon->tidStatus); | ||
179 | if (dev_type == FILE_DEVICE_DISK) | ||
180 | seq_puts(m, " type: DISK "); | ||
181 | else if (dev_type == FILE_DEVICE_CD_ROM) | ||
182 | seq_puts(m, " type: CDROM "); | ||
183 | else | ||
184 | seq_printf(m, " type: %d ", dev_type); | ||
185 | |||
186 | if (tcon->need_reconnect) | ||
187 | seq_puts(m, "\tDISCONNECTED "); | ||
188 | seq_putc(m, '\n'); | ||
189 | } | ||
190 | |||
191 | seq_puts(m, "\n\tMIDs:\n"); | ||
158 | 192 | ||
159 | spin_lock(&GlobalMid_Lock); | 193 | spin_lock(&GlobalMid_Lock); |
160 | list_for_each(tmp1, &ses->server->pending_mid_q) { | 194 | list_for_each(tmp3, &server->pending_mid_q) { |
161 | mid_entry = list_entry(tmp1, struct | 195 | mid_entry = list_entry(tmp3, struct mid_q_entry, |
162 | mid_q_entry, | ||
163 | qhead); | 196 | qhead); |
164 | seq_printf(m, "State: %d com: %d pid:" | 197 | seq_printf(m, "\tState: %d com: %d pid:" |
165 | " %d tsk: %p mid %d\n", | 198 | " %d tsk: %p mid %d\n", |
166 | mid_entry->midState, | 199 | mid_entry->midState, |
167 | (int)mid_entry->command, | 200 | (int)mid_entry->command, |
@@ -171,44 +204,8 @@ static int cifs_debug_data_proc_show(struct seq_file *m, void *v) | |||
171 | } | 204 | } |
172 | spin_unlock(&GlobalMid_Lock); | 205 | spin_unlock(&GlobalMid_Lock); |
173 | } | 206 | } |
174 | |||
175 | } | ||
176 | read_unlock(&GlobalSMBSeslock); | ||
177 | seq_putc(m, '\n'); | ||
178 | |||
179 | seq_puts(m, "Shares:"); | ||
180 | |||
181 | i = 0; | ||
182 | read_lock(&GlobalSMBSeslock); | ||
183 | list_for_each(tmp, &GlobalTreeConnectionList) { | ||
184 | __u32 dev_type; | ||
185 | i++; | ||
186 | tcon = list_entry(tmp, struct cifsTconInfo, cifsConnectionList); | ||
187 | dev_type = le32_to_cpu(tcon->fsDevInfo.DeviceType); | ||
188 | seq_printf(m, "\n%d) %s Uses: %d ", i, | ||
189 | tcon->treeName, atomic_read(&tcon->useCount)); | ||
190 | if (tcon->nativeFileSystem) { | ||
191 | seq_printf(m, "Type: %s ", | ||
192 | tcon->nativeFileSystem); | ||
193 | } | ||
194 | seq_printf(m, "DevInfo: 0x%x Attributes: 0x%x" | ||
195 | "\nPathComponentMax: %d Status: %d", | ||
196 | le32_to_cpu(tcon->fsDevInfo.DeviceCharacteristics), | ||
197 | le32_to_cpu(tcon->fsAttrInfo.Attributes), | ||
198 | le32_to_cpu(tcon->fsAttrInfo.MaxPathNameComponentLength), | ||
199 | tcon->tidStatus); | ||
200 | if (dev_type == FILE_DEVICE_DISK) | ||
201 | seq_puts(m, " type: DISK "); | ||
202 | else if (dev_type == FILE_DEVICE_CD_ROM) | ||
203 | seq_puts(m, " type: CDROM "); | ||
204 | else | ||
205 | seq_printf(m, " type: %d ", dev_type); | ||
206 | |||
207 | if (tcon->tidStatus == CifsNeedReconnect) | ||
208 | seq_puts(m, "\tDISCONNECTED "); | ||
209 | } | 207 | } |
210 | read_unlock(&GlobalSMBSeslock); | 208 | read_unlock(&cifs_tcp_ses_lock); |
211 | |||
212 | seq_putc(m, '\n'); | 209 | seq_putc(m, '\n'); |
213 | 210 | ||
214 | /* BB add code to dump additional info such as TCP session info now */ | 211 | /* BB add code to dump additional info such as TCP session info now */ |
@@ -234,7 +231,9 @@ static ssize_t cifs_stats_proc_write(struct file *file, | |||
234 | { | 231 | { |
235 | char c; | 232 | char c; |
236 | int rc; | 233 | int rc; |
237 | struct list_head *tmp; | 234 | struct list_head *tmp1, *tmp2, *tmp3; |
235 | struct TCP_Server_Info *server; | ||
236 | struct cifsSesInfo *ses; | ||
238 | struct cifsTconInfo *tcon; | 237 | struct cifsTconInfo *tcon; |
239 | 238 | ||
240 | rc = get_user(c, buffer); | 239 | rc = get_user(c, buffer); |
@@ -242,33 +241,42 @@ static ssize_t cifs_stats_proc_write(struct file *file, | |||
242 | return rc; | 241 | return rc; |
243 | 242 | ||
244 | if (c == '1' || c == 'y' || c == 'Y' || c == '0') { | 243 | if (c == '1' || c == 'y' || c == 'Y' || c == '0') { |
245 | read_lock(&GlobalSMBSeslock); | ||
246 | #ifdef CONFIG_CIFS_STATS2 | 244 | #ifdef CONFIG_CIFS_STATS2 |
247 | atomic_set(&totBufAllocCount, 0); | 245 | atomic_set(&totBufAllocCount, 0); |
248 | atomic_set(&totSmBufAllocCount, 0); | 246 | atomic_set(&totSmBufAllocCount, 0); |
249 | #endif /* CONFIG_CIFS_STATS2 */ | 247 | #endif /* CONFIG_CIFS_STATS2 */ |
250 | list_for_each(tmp, &GlobalTreeConnectionList) { | 248 | read_lock(&cifs_tcp_ses_lock); |
251 | tcon = list_entry(tmp, struct cifsTconInfo, | 249 | list_for_each(tmp1, &cifs_tcp_ses_list) { |
252 | cifsConnectionList); | 250 | server = list_entry(tmp1, struct TCP_Server_Info, |
253 | atomic_set(&tcon->num_smbs_sent, 0); | 251 | tcp_ses_list); |
254 | atomic_set(&tcon->num_writes, 0); | 252 | list_for_each(tmp2, &server->smb_ses_list) { |
255 | atomic_set(&tcon->num_reads, 0); | 253 | ses = list_entry(tmp2, struct cifsSesInfo, |
256 | atomic_set(&tcon->num_oplock_brks, 0); | 254 | smb_ses_list); |
257 | atomic_set(&tcon->num_opens, 0); | 255 | list_for_each(tmp3, &ses->tcon_list) { |
258 | atomic_set(&tcon->num_closes, 0); | 256 | tcon = list_entry(tmp3, |
259 | atomic_set(&tcon->num_deletes, 0); | 257 | struct cifsTconInfo, |
260 | atomic_set(&tcon->num_mkdirs, 0); | 258 | tcon_list); |
261 | atomic_set(&tcon->num_rmdirs, 0); | 259 | atomic_set(&tcon->num_smbs_sent, 0); |
262 | atomic_set(&tcon->num_renames, 0); | 260 | atomic_set(&tcon->num_writes, 0); |
263 | atomic_set(&tcon->num_t2renames, 0); | 261 | atomic_set(&tcon->num_reads, 0); |
264 | atomic_set(&tcon->num_ffirst, 0); | 262 | atomic_set(&tcon->num_oplock_brks, 0); |
265 | atomic_set(&tcon->num_fnext, 0); | 263 | atomic_set(&tcon->num_opens, 0); |
266 | atomic_set(&tcon->num_fclose, 0); | 264 | atomic_set(&tcon->num_closes, 0); |
267 | atomic_set(&tcon->num_hardlinks, 0); | 265 | atomic_set(&tcon->num_deletes, 0); |
268 | atomic_set(&tcon->num_symlinks, 0); | 266 | atomic_set(&tcon->num_mkdirs, 0); |
269 | atomic_set(&tcon->num_locks, 0); | 267 | atomic_set(&tcon->num_rmdirs, 0); |
268 | atomic_set(&tcon->num_renames, 0); | ||
269 | atomic_set(&tcon->num_t2renames, 0); | ||
270 | atomic_set(&tcon->num_ffirst, 0); | ||
271 | atomic_set(&tcon->num_fnext, 0); | ||
272 | atomic_set(&tcon->num_fclose, 0); | ||
273 | atomic_set(&tcon->num_hardlinks, 0); | ||
274 | atomic_set(&tcon->num_symlinks, 0); | ||
275 | atomic_set(&tcon->num_locks, 0); | ||
276 | } | ||
277 | } | ||
270 | } | 278 | } |
271 | read_unlock(&GlobalSMBSeslock); | 279 | read_unlock(&cifs_tcp_ses_lock); |
272 | } | 280 | } |
273 | 281 | ||
274 | return count; | 282 | return count; |
@@ -277,7 +285,9 @@ static ssize_t cifs_stats_proc_write(struct file *file, | |||
277 | static int cifs_stats_proc_show(struct seq_file *m, void *v) | 285 | static int cifs_stats_proc_show(struct seq_file *m, void *v) |
278 | { | 286 | { |
279 | int i; | 287 | int i; |
280 | struct list_head *tmp; | 288 | struct list_head *tmp1, *tmp2, *tmp3; |
289 | struct TCP_Server_Info *server; | ||
290 | struct cifsSesInfo *ses; | ||
281 | struct cifsTconInfo *tcon; | 291 | struct cifsTconInfo *tcon; |
282 | 292 | ||
283 | seq_printf(m, | 293 | seq_printf(m, |
@@ -306,44 +316,55 @@ static int cifs_stats_proc_show(struct seq_file *m, void *v) | |||
306 | GlobalCurrentXid, GlobalMaxActiveXid); | 316 | GlobalCurrentXid, GlobalMaxActiveXid); |
307 | 317 | ||
308 | i = 0; | 318 | i = 0; |
309 | read_lock(&GlobalSMBSeslock); | 319 | read_lock(&cifs_tcp_ses_lock); |
310 | list_for_each(tmp, &GlobalTreeConnectionList) { | 320 | list_for_each(tmp1, &cifs_tcp_ses_list) { |
311 | i++; | 321 | server = list_entry(tmp1, struct TCP_Server_Info, |
312 | tcon = list_entry(tmp, struct cifsTconInfo, cifsConnectionList); | 322 | tcp_ses_list); |
313 | seq_printf(m, "\n%d) %s", i, tcon->treeName); | 323 | list_for_each(tmp2, &server->smb_ses_list) { |
314 | if (tcon->tidStatus == CifsNeedReconnect) | 324 | ses = list_entry(tmp2, struct cifsSesInfo, |
315 | seq_puts(m, "\tDISCONNECTED "); | 325 | smb_ses_list); |
316 | seq_printf(m, "\nSMBs: %d Oplock Breaks: %d", | 326 | list_for_each(tmp3, &ses->tcon_list) { |
317 | atomic_read(&tcon->num_smbs_sent), | 327 | tcon = list_entry(tmp3, |
318 | atomic_read(&tcon->num_oplock_brks)); | 328 | struct cifsTconInfo, |
319 | seq_printf(m, "\nReads: %d Bytes: %lld", | 329 | tcon_list); |
320 | atomic_read(&tcon->num_reads), | 330 | i++; |
321 | (long long)(tcon->bytes_read)); | 331 | seq_printf(m, "\n%d) %s", i, tcon->treeName); |
322 | seq_printf(m, "\nWrites: %d Bytes: %lld", | 332 | if (tcon->need_reconnect) |
323 | atomic_read(&tcon->num_writes), | 333 | seq_puts(m, "\tDISCONNECTED "); |
324 | (long long)(tcon->bytes_written)); | 334 | seq_printf(m, "\nSMBs: %d Oplock Breaks: %d", |
325 | seq_printf(m, | 335 | atomic_read(&tcon->num_smbs_sent), |
326 | "\nLocks: %d HardLinks: %d Symlinks: %d", | 336 | atomic_read(&tcon->num_oplock_brks)); |
327 | atomic_read(&tcon->num_locks), | 337 | seq_printf(m, "\nReads: %d Bytes: %lld", |
328 | atomic_read(&tcon->num_hardlinks), | 338 | atomic_read(&tcon->num_reads), |
329 | atomic_read(&tcon->num_symlinks)); | 339 | (long long)(tcon->bytes_read)); |
330 | 340 | seq_printf(m, "\nWrites: %d Bytes: %lld", | |
331 | seq_printf(m, "\nOpens: %d Closes: %d Deletes: %d", | 341 | atomic_read(&tcon->num_writes), |
332 | atomic_read(&tcon->num_opens), | 342 | (long long)(tcon->bytes_written)); |
333 | atomic_read(&tcon->num_closes), | 343 | seq_printf(m, "\nLocks: %d HardLinks: %d " |
334 | atomic_read(&tcon->num_deletes)); | 344 | "Symlinks: %d", |
335 | seq_printf(m, "\nMkdirs: %d Rmdirs: %d", | 345 | atomic_read(&tcon->num_locks), |
336 | atomic_read(&tcon->num_mkdirs), | 346 | atomic_read(&tcon->num_hardlinks), |
337 | atomic_read(&tcon->num_rmdirs)); | 347 | atomic_read(&tcon->num_symlinks)); |
338 | seq_printf(m, "\nRenames: %d T2 Renames %d", | 348 | seq_printf(m, "\nOpens: %d Closes: %d" |
339 | atomic_read(&tcon->num_renames), | 349 | "Deletes: %d", |
340 | atomic_read(&tcon->num_t2renames)); | 350 | atomic_read(&tcon->num_opens), |
341 | seq_printf(m, "\nFindFirst: %d FNext %d FClose %d", | 351 | atomic_read(&tcon->num_closes), |
342 | atomic_read(&tcon->num_ffirst), | 352 | atomic_read(&tcon->num_deletes)); |
343 | atomic_read(&tcon->num_fnext), | 353 | seq_printf(m, "\nMkdirs: %d Rmdirs: %d", |
344 | atomic_read(&tcon->num_fclose)); | 354 | atomic_read(&tcon->num_mkdirs), |
355 | atomic_read(&tcon->num_rmdirs)); | ||
356 | seq_printf(m, "\nRenames: %d T2 Renames %d", | ||
357 | atomic_read(&tcon->num_renames), | ||
358 | atomic_read(&tcon->num_t2renames)); | ||
359 | seq_printf(m, "\nFindFirst: %d FNext %d " | ||
360 | "FClose %d", | ||
361 | atomic_read(&tcon->num_ffirst), | ||
362 | atomic_read(&tcon->num_fnext), | ||
363 | atomic_read(&tcon->num_fclose)); | ||
364 | } | ||
365 | } | ||
345 | } | 366 | } |
346 | read_unlock(&GlobalSMBSeslock); | 367 | read_unlock(&cifs_tcp_ses_lock); |
347 | 368 | ||
348 | seq_putc(m, '\n'); | 369 | seq_putc(m, '\n'); |
349 | return 0; | 370 | return 0; |
diff --git a/fs/cifs/cifs_dfs_ref.c b/fs/cifs/cifs_dfs_ref.c index d2c8eef84f3c..e1c18362ba46 100644 --- a/fs/cifs/cifs_dfs_ref.c +++ b/fs/cifs/cifs_dfs_ref.c | |||
@@ -106,7 +106,8 @@ static char *cifs_get_share_name(const char *node_name) | |||
106 | /** | 106 | /** |
107 | * compose_mount_options - creates mount options for refferral | 107 | * compose_mount_options - creates mount options for refferral |
108 | * @sb_mountdata: parent/root DFS mount options (template) | 108 | * @sb_mountdata: parent/root DFS mount options (template) |
109 | * @ref_unc: refferral server UNC | 109 | * @dentry: point where we are going to mount |
110 | * @ref: server's referral | ||
110 | * @devname: pointer for saving device name | 111 | * @devname: pointer for saving device name |
111 | * | 112 | * |
112 | * creates mount options for submount based on template options sb_mountdata | 113 | * creates mount options for submount based on template options sb_mountdata |
@@ -116,7 +117,8 @@ static char *cifs_get_share_name(const char *node_name) | |||
116 | * Caller is responcible for freeing retunrned value if it is not error. | 117 | * Caller is responcible for freeing retunrned value if it is not error. |
117 | */ | 118 | */ |
118 | static char *compose_mount_options(const char *sb_mountdata, | 119 | static char *compose_mount_options(const char *sb_mountdata, |
119 | const char *ref_unc, | 120 | struct dentry *dentry, |
121 | const struct dfs_info3_param *ref, | ||
120 | char **devname) | 122 | char **devname) |
121 | { | 123 | { |
122 | int rc; | 124 | int rc; |
@@ -126,11 +128,12 @@ static char *compose_mount_options(const char *sb_mountdata, | |||
126 | char *srvIP = NULL; | 128 | char *srvIP = NULL; |
127 | char sep = ','; | 129 | char sep = ','; |
128 | int off, noff; | 130 | int off, noff; |
131 | char *fullpath; | ||
129 | 132 | ||
130 | if (sb_mountdata == NULL) | 133 | if (sb_mountdata == NULL) |
131 | return ERR_PTR(-EINVAL); | 134 | return ERR_PTR(-EINVAL); |
132 | 135 | ||
133 | *devname = cifs_get_share_name(ref_unc); | 136 | *devname = cifs_get_share_name(ref->node_name); |
134 | rc = dns_resolve_server_name_to_ip(*devname, &srvIP); | 137 | rc = dns_resolve_server_name_to_ip(*devname, &srvIP); |
135 | if (rc != 0) { | 138 | if (rc != 0) { |
136 | cERROR(1, ("%s: Failed to resolve server part of %s to IP", | 139 | cERROR(1, ("%s: Failed to resolve server part of %s to IP", |
@@ -138,7 +141,12 @@ static char *compose_mount_options(const char *sb_mountdata, | |||
138 | mountdata = ERR_PTR(rc); | 141 | mountdata = ERR_PTR(rc); |
139 | goto compose_mount_options_out; | 142 | goto compose_mount_options_out; |
140 | } | 143 | } |
141 | md_len = strlen(sb_mountdata) + strlen(srvIP) + strlen(ref_unc) + 3; | 144 | /* md_len = strlen(...) + 12 for 'sep+prefixpath=' |
145 | * assuming that we have 'unc=' and 'ip=' in | ||
146 | * the original sb_mountdata | ||
147 | */ | ||
148 | md_len = strlen(sb_mountdata) + strlen(srvIP) + | ||
149 | strlen(ref->node_name) + 12; | ||
142 | mountdata = kzalloc(md_len+1, GFP_KERNEL); | 150 | mountdata = kzalloc(md_len+1, GFP_KERNEL); |
143 | if (mountdata == NULL) { | 151 | if (mountdata == NULL) { |
144 | mountdata = ERR_PTR(-ENOMEM); | 152 | mountdata = ERR_PTR(-ENOMEM); |
@@ -152,41 +160,56 @@ static char *compose_mount_options(const char *sb_mountdata, | |||
152 | strncpy(mountdata, sb_mountdata, 5); | 160 | strncpy(mountdata, sb_mountdata, 5); |
153 | off += 5; | 161 | off += 5; |
154 | } | 162 | } |
155 | while ((tkn_e = strchr(sb_mountdata+off, sep))) { | 163 | |
156 | noff = (tkn_e - (sb_mountdata+off)) + 1; | 164 | do { |
157 | if (strnicmp(sb_mountdata+off, "unc=", 4) == 0) { | 165 | tkn_e = strchr(sb_mountdata + off, sep); |
166 | if (tkn_e == NULL) | ||
167 | noff = strlen(sb_mountdata + off); | ||
168 | else | ||
169 | noff = tkn_e - (sb_mountdata + off) + 1; | ||
170 | |||
171 | if (strnicmp(sb_mountdata + off, "unc=", 4) == 0) { | ||
158 | off += noff; | 172 | off += noff; |
159 | continue; | 173 | continue; |
160 | } | 174 | } |
161 | if (strnicmp(sb_mountdata+off, "ip=", 3) == 0) { | 175 | if (strnicmp(sb_mountdata + off, "ip=", 3) == 0) { |
162 | off += noff; | 176 | off += noff; |
163 | continue; | 177 | continue; |
164 | } | 178 | } |
165 | if (strnicmp(sb_mountdata+off, "prefixpath=", 3) == 0) { | 179 | if (strnicmp(sb_mountdata + off, "prefixpath=", 11) == 0) { |
166 | off += noff; | 180 | off += noff; |
167 | continue; | 181 | continue; |
168 | } | 182 | } |
169 | strncat(mountdata, sb_mountdata+off, noff); | 183 | strncat(mountdata, sb_mountdata + off, noff); |
170 | off += noff; | 184 | off += noff; |
171 | } | 185 | } while (tkn_e); |
172 | strcat(mountdata, sb_mountdata+off); | 186 | strcat(mountdata, sb_mountdata + off); |
173 | mountdata[md_len] = '\0'; | 187 | mountdata[md_len] = '\0'; |
174 | 188 | ||
175 | /* copy new IP and ref share name */ | 189 | /* copy new IP and ref share name */ |
176 | strcat(mountdata, ",ip="); | 190 | if (mountdata[strlen(mountdata) - 1] != sep) |
191 | strncat(mountdata, &sep, 1); | ||
192 | strcat(mountdata, "ip="); | ||
177 | strcat(mountdata, srvIP); | 193 | strcat(mountdata, srvIP); |
178 | strcat(mountdata, ",unc="); | 194 | strncat(mountdata, &sep, 1); |
195 | strcat(mountdata, "unc="); | ||
179 | strcat(mountdata, *devname); | 196 | strcat(mountdata, *devname); |
180 | 197 | ||
181 | /* find & copy prefixpath */ | 198 | /* find & copy prefixpath */ |
182 | tkn_e = strchr(ref_unc+2, '\\'); | 199 | tkn_e = strchr(ref->node_name + 2, '\\'); |
183 | if (tkn_e) { | 200 | if (tkn_e == NULL) /* invalid unc, missing share name*/ |
184 | tkn_e = strchr(tkn_e+1, '\\'); | 201 | goto compose_mount_options_out; |
185 | if (tkn_e) { | 202 | |
186 | strcat(mountdata, ",prefixpath="); | 203 | fullpath = build_path_from_dentry(dentry); |
187 | strcat(mountdata, tkn_e+1); | 204 | tkn_e = strchr(tkn_e + 1, '\\'); |
188 | } | 205 | if (tkn_e || strlen(fullpath) - (ref->path_consumed)) { |
206 | strncat(mountdata, &sep, 1); | ||
207 | strcat(mountdata, "prefixpath="); | ||
208 | if (tkn_e) | ||
209 | strcat(mountdata, tkn_e + 1); | ||
210 | strcat(mountdata, fullpath + (ref->path_consumed)); | ||
189 | } | 211 | } |
212 | kfree(fullpath); | ||
190 | 213 | ||
191 | /*cFYI(1,("%s: parent mountdata: %s", __func__,sb_mountdata));*/ | 214 | /*cFYI(1,("%s: parent mountdata: %s", __func__,sb_mountdata));*/ |
192 | /*cFYI(1, ("%s: submount mountdata: %s", __func__, mountdata ));*/ | 215 | /*cFYI(1, ("%s: submount mountdata: %s", __func__, mountdata ));*/ |
@@ -198,7 +221,7 @@ compose_mount_options_out: | |||
198 | 221 | ||
199 | 222 | ||
200 | static struct vfsmount *cifs_dfs_do_refmount(const struct vfsmount *mnt_parent, | 223 | static struct vfsmount *cifs_dfs_do_refmount(const struct vfsmount *mnt_parent, |
201 | struct dentry *dentry, char *ref_unc) | 224 | struct dentry *dentry, const struct dfs_info3_param *ref) |
202 | { | 225 | { |
203 | struct cifs_sb_info *cifs_sb; | 226 | struct cifs_sb_info *cifs_sb; |
204 | struct vfsmount *mnt; | 227 | struct vfsmount *mnt; |
@@ -207,7 +230,7 @@ static struct vfsmount *cifs_dfs_do_refmount(const struct vfsmount *mnt_parent, | |||
207 | 230 | ||
208 | cifs_sb = CIFS_SB(dentry->d_inode->i_sb); | 231 | cifs_sb = CIFS_SB(dentry->d_inode->i_sb); |
209 | mountdata = compose_mount_options(cifs_sb->mountdata, | 232 | mountdata = compose_mount_options(cifs_sb->mountdata, |
210 | ref_unc, &devname); | 233 | dentry, ref, &devname); |
211 | 234 | ||
212 | if (IS_ERR(mountdata)) | 235 | if (IS_ERR(mountdata)) |
213 | return (struct vfsmount *)mountdata; | 236 | return (struct vfsmount *)mountdata; |
@@ -310,7 +333,7 @@ cifs_dfs_follow_mountpoint(struct dentry *dentry, struct nameidata *nd) | |||
310 | } | 333 | } |
311 | mnt = cifs_dfs_do_refmount(nd->path.mnt, | 334 | mnt = cifs_dfs_do_refmount(nd->path.mnt, |
312 | nd->path.dentry, | 335 | nd->path.dentry, |
313 | referrals[i].node_name); | 336 | referrals + i); |
314 | cFYI(1, ("%s: cifs_dfs_do_refmount:%s , mnt:%p", | 337 | cFYI(1, ("%s: cifs_dfs_do_refmount:%s , mnt:%p", |
315 | __func__, | 338 | __func__, |
316 | referrals[i].node_name, mnt)); | 339 | referrals[i].node_name, mnt)); |
diff --git a/fs/cifs/cifs_spnego.c b/fs/cifs/cifs_spnego.c index fcee9298b620..0ab2fb5afef1 100644 --- a/fs/cifs/cifs_spnego.c +++ b/fs/cifs/cifs_spnego.c | |||
@@ -73,8 +73,8 @@ struct key_type cifs_spnego_key_type = { | |||
73 | * strlen(";sec=ntlmsspi") */ | 73 | * strlen(";sec=ntlmsspi") */ |
74 | #define MAX_MECH_STR_LEN 13 | 74 | #define MAX_MECH_STR_LEN 13 |
75 | 75 | ||
76 | /* max possible addr len eg FEDC:BA98:7654:3210:FEDC:BA98:7654:3210/60 */ | 76 | /* max possible addr len eg FEDC:BA98:7654:3210:FEDC:BA98:7654:3210/128 */ |
77 | #define MAX_IPV6_ADDR_LEN 42 | 77 | #define MAX_IPV6_ADDR_LEN 43 |
78 | 78 | ||
79 | /* strlen of "host=" */ | 79 | /* strlen of "host=" */ |
80 | #define HOST_KEY_LEN 5 | 80 | #define HOST_KEY_LEN 5 |
diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c index ac5915d61dca..d9cf467309e8 100644 --- a/fs/cifs/cifsfs.c +++ b/fs/cifs/cifsfs.c | |||
@@ -514,10 +514,11 @@ static void cifs_umount_begin(struct super_block *sb) | |||
514 | tcon = cifs_sb->tcon; | 514 | tcon = cifs_sb->tcon; |
515 | if (tcon == NULL) | 515 | if (tcon == NULL) |
516 | return; | 516 | return; |
517 | down(&tcon->tconSem); | 517 | |
518 | if (atomic_read(&tcon->useCount) == 1) | 518 | read_lock(&cifs_tcp_ses_lock); |
519 | if (tcon->tc_count == 1) | ||
519 | tcon->tidStatus = CifsExiting; | 520 | tcon->tidStatus = CifsExiting; |
520 | up(&tcon->tconSem); | 521 | read_unlock(&cifs_tcp_ses_lock); |
521 | 522 | ||
522 | /* cancel_brl_requests(tcon); */ /* BB mark all brl mids as exiting */ | 523 | /* cancel_brl_requests(tcon); */ /* BB mark all brl mids as exiting */ |
523 | /* cancel_notify_requests(tcon); */ | 524 | /* cancel_notify_requests(tcon); */ |
@@ -1013,7 +1014,7 @@ static int cifs_oplock_thread(void *dummyarg) | |||
1013 | not bother sending an oplock release if session | 1014 | not bother sending an oplock release if session |
1014 | to server still is disconnected since oplock | 1015 | to server still is disconnected since oplock |
1015 | already released by the server in that case */ | 1016 | already released by the server in that case */ |
1016 | if (pTcon->tidStatus != CifsNeedReconnect) { | 1017 | if (!pTcon->need_reconnect) { |
1017 | rc = CIFSSMBLock(0, pTcon, netfid, | 1018 | rc = CIFSSMBLock(0, pTcon, netfid, |
1018 | 0 /* len */ , 0 /* offset */, 0, | 1019 | 0 /* len */ , 0 /* offset */, 0, |
1019 | 0, LOCKING_ANDX_OPLOCK_RELEASE, | 1020 | 0, LOCKING_ANDX_OPLOCK_RELEASE, |
@@ -1031,24 +1032,24 @@ static int cifs_oplock_thread(void *dummyarg) | |||
1031 | static int cifs_dnotify_thread(void *dummyarg) | 1032 | static int cifs_dnotify_thread(void *dummyarg) |
1032 | { | 1033 | { |
1033 | struct list_head *tmp; | 1034 | struct list_head *tmp; |
1034 | struct cifsSesInfo *ses; | 1035 | struct TCP_Server_Info *server; |
1035 | 1036 | ||
1036 | do { | 1037 | do { |
1037 | if (try_to_freeze()) | 1038 | if (try_to_freeze()) |
1038 | continue; | 1039 | continue; |
1039 | set_current_state(TASK_INTERRUPTIBLE); | 1040 | set_current_state(TASK_INTERRUPTIBLE); |
1040 | schedule_timeout(15*HZ); | 1041 | schedule_timeout(15*HZ); |
1041 | read_lock(&GlobalSMBSeslock); | ||
1042 | /* check if any stuck requests that need | 1042 | /* check if any stuck requests that need |
1043 | to be woken up and wakeq so the | 1043 | to be woken up and wakeq so the |
1044 | thread can wake up and error out */ | 1044 | thread can wake up and error out */ |
1045 | list_for_each(tmp, &GlobalSMBSessionList) { | 1045 | read_lock(&cifs_tcp_ses_lock); |
1046 | ses = list_entry(tmp, struct cifsSesInfo, | 1046 | list_for_each(tmp, &cifs_tcp_ses_list) { |
1047 | cifsSessionList); | 1047 | server = list_entry(tmp, struct TCP_Server_Info, |
1048 | if (ses->server && atomic_read(&ses->server->inFlight)) | 1048 | tcp_ses_list); |
1049 | wake_up_all(&ses->server->response_q); | 1049 | if (atomic_read(&server->inFlight)) |
1050 | wake_up_all(&server->response_q); | ||
1050 | } | 1051 | } |
1051 | read_unlock(&GlobalSMBSeslock); | 1052 | read_unlock(&cifs_tcp_ses_lock); |
1052 | } while (!kthread_should_stop()); | 1053 | } while (!kthread_should_stop()); |
1053 | 1054 | ||
1054 | return 0; | 1055 | return 0; |
@@ -1059,9 +1060,7 @@ init_cifs(void) | |||
1059 | { | 1060 | { |
1060 | int rc = 0; | 1061 | int rc = 0; |
1061 | cifs_proc_init(); | 1062 | cifs_proc_init(); |
1062 | /* INIT_LIST_HEAD(&GlobalServerList);*/ /* BB not implemented yet */ | 1063 | INIT_LIST_HEAD(&cifs_tcp_ses_list); |
1063 | INIT_LIST_HEAD(&GlobalSMBSessionList); | ||
1064 | INIT_LIST_HEAD(&GlobalTreeConnectionList); | ||
1065 | INIT_LIST_HEAD(&GlobalOplock_Q); | 1064 | INIT_LIST_HEAD(&GlobalOplock_Q); |
1066 | #ifdef CONFIG_CIFS_EXPERIMENTAL | 1065 | #ifdef CONFIG_CIFS_EXPERIMENTAL |
1067 | INIT_LIST_HEAD(&GlobalDnotifyReqList); | 1066 | INIT_LIST_HEAD(&GlobalDnotifyReqList); |
@@ -1089,6 +1088,7 @@ init_cifs(void) | |||
1089 | GlobalMaxActiveXid = 0; | 1088 | GlobalMaxActiveXid = 0; |
1090 | memset(Local_System_Name, 0, 15); | 1089 | memset(Local_System_Name, 0, 15); |
1091 | rwlock_init(&GlobalSMBSeslock); | 1090 | rwlock_init(&GlobalSMBSeslock); |
1091 | rwlock_init(&cifs_tcp_ses_lock); | ||
1092 | spin_lock_init(&GlobalMid_Lock); | 1092 | spin_lock_init(&GlobalMid_Lock); |
1093 | 1093 | ||
1094 | if (cifs_max_pending < 2) { | 1094 | if (cifs_max_pending < 2) { |
diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h index 1cb1189f24e0..c57c0565547f 100644 --- a/fs/cifs/cifsglob.h +++ b/fs/cifs/cifsglob.h | |||
@@ -85,8 +85,7 @@ enum securityEnum { | |||
85 | }; | 85 | }; |
86 | 86 | ||
87 | enum protocolEnum { | 87 | enum protocolEnum { |
88 | IPV4 = 0, | 88 | TCP = 0, |
89 | IPV6, | ||
90 | SCTP | 89 | SCTP |
91 | /* Netbios frames protocol not supported at this time */ | 90 | /* Netbios frames protocol not supported at this time */ |
92 | }; | 91 | }; |
@@ -122,6 +121,9 @@ struct cifs_cred { | |||
122 | */ | 121 | */ |
123 | 122 | ||
124 | struct TCP_Server_Info { | 123 | struct TCP_Server_Info { |
124 | struct list_head tcp_ses_list; | ||
125 | struct list_head smb_ses_list; | ||
126 | int srv_count; /* reference counter */ | ||
125 | /* 15 character server name + 0x20 16th byte indicating type = srv */ | 127 | /* 15 character server name + 0x20 16th byte indicating type = srv */ |
126 | char server_RFC1001_name[SERVER_NAME_LEN_WITH_NULL]; | 128 | char server_RFC1001_name[SERVER_NAME_LEN_WITH_NULL]; |
127 | char unicode_server_Name[SERVER_NAME_LEN_WITH_NULL * 2]; | 129 | char unicode_server_Name[SERVER_NAME_LEN_WITH_NULL * 2]; |
@@ -143,7 +145,6 @@ struct TCP_Server_Info { | |||
143 | bool svlocal:1; /* local server or remote */ | 145 | bool svlocal:1; /* local server or remote */ |
144 | bool noblocksnd; /* use blocking sendmsg */ | 146 | bool noblocksnd; /* use blocking sendmsg */ |
145 | bool noautotune; /* do not autotune send buf sizes */ | 147 | bool noautotune; /* do not autotune send buf sizes */ |
146 | atomic_t socketUseCount; /* number of open cifs sessions on socket */ | ||
147 | atomic_t inFlight; /* number of requests on the wire to server */ | 148 | atomic_t inFlight; /* number of requests on the wire to server */ |
148 | #ifdef CONFIG_CIFS_STATS2 | 149 | #ifdef CONFIG_CIFS_STATS2 |
149 | atomic_t inSend; /* requests trying to send */ | 150 | atomic_t inSend; /* requests trying to send */ |
@@ -194,13 +195,14 @@ struct cifsUidInfo { | |||
194 | * Session structure. One of these for each uid session with a particular host | 195 | * Session structure. One of these for each uid session with a particular host |
195 | */ | 196 | */ |
196 | struct cifsSesInfo { | 197 | struct cifsSesInfo { |
197 | struct list_head cifsSessionList; | 198 | struct list_head smb_ses_list; |
199 | struct list_head tcon_list; | ||
198 | struct semaphore sesSem; | 200 | struct semaphore sesSem; |
199 | #if 0 | 201 | #if 0 |
200 | struct cifsUidInfo *uidInfo; /* pointer to user info */ | 202 | struct cifsUidInfo *uidInfo; /* pointer to user info */ |
201 | #endif | 203 | #endif |
202 | struct TCP_Server_Info *server; /* pointer to server info */ | 204 | struct TCP_Server_Info *server; /* pointer to server info */ |
203 | atomic_t inUse; /* # of mounts (tree connections) on this ses */ | 205 | int ses_count; /* reference counter */ |
204 | enum statusEnum status; | 206 | enum statusEnum status; |
205 | unsigned overrideSecFlg; /* if non-zero override global sec flags */ | 207 | unsigned overrideSecFlg; /* if non-zero override global sec flags */ |
206 | __u16 ipc_tid; /* special tid for connection to IPC share */ | 208 | __u16 ipc_tid; /* special tid for connection to IPC share */ |
@@ -216,6 +218,7 @@ struct cifsSesInfo { | |||
216 | char userName[MAX_USERNAME_SIZE + 1]; | 218 | char userName[MAX_USERNAME_SIZE + 1]; |
217 | char *domainName; | 219 | char *domainName; |
218 | char *password; | 220 | char *password; |
221 | bool need_reconnect:1; /* connection reset, uid now invalid */ | ||
219 | }; | 222 | }; |
220 | /* no more than one of the following three session flags may be set */ | 223 | /* no more than one of the following three session flags may be set */ |
221 | #define CIFS_SES_NT4 1 | 224 | #define CIFS_SES_NT4 1 |
@@ -230,16 +233,15 @@ struct cifsSesInfo { | |||
230 | * session | 233 | * session |
231 | */ | 234 | */ |
232 | struct cifsTconInfo { | 235 | struct cifsTconInfo { |
233 | struct list_head cifsConnectionList; | 236 | struct list_head tcon_list; |
237 | int tc_count; | ||
234 | struct list_head openFileList; | 238 | struct list_head openFileList; |
235 | struct semaphore tconSem; | ||
236 | struct cifsSesInfo *ses; /* pointer to session associated with */ | 239 | struct cifsSesInfo *ses; /* pointer to session associated with */ |
237 | char treeName[MAX_TREE_SIZE + 1]; /* UNC name of resource in ASCII */ | 240 | char treeName[MAX_TREE_SIZE + 1]; /* UNC name of resource in ASCII */ |
238 | char *nativeFileSystem; | 241 | char *nativeFileSystem; |
239 | __u16 tid; /* The 2 byte tree id */ | 242 | __u16 tid; /* The 2 byte tree id */ |
240 | __u16 Flags; /* optional support bits */ | 243 | __u16 Flags; /* optional support bits */ |
241 | enum statusEnum tidStatus; | 244 | enum statusEnum tidStatus; |
242 | atomic_t useCount; /* how many explicit/implicit mounts to share */ | ||
243 | #ifdef CONFIG_CIFS_STATS | 245 | #ifdef CONFIG_CIFS_STATS |
244 | atomic_t num_smbs_sent; | 246 | atomic_t num_smbs_sent; |
245 | atomic_t num_writes; | 247 | atomic_t num_writes; |
@@ -288,6 +290,7 @@ struct cifsTconInfo { | |||
288 | bool unix_ext:1; /* if false disable Linux extensions to CIFS protocol | 290 | bool unix_ext:1; /* if false disable Linux extensions to CIFS protocol |
289 | for this mount even if server would support */ | 291 | for this mount even if server would support */ |
290 | bool local_lease:1; /* check leases (only) on local system not remote */ | 292 | bool local_lease:1; /* check leases (only) on local system not remote */ |
293 | bool need_reconnect:1; /* connection reset, tid now invalid */ | ||
291 | /* BB add field for back pointer to sb struct(s)? */ | 294 | /* BB add field for back pointer to sb struct(s)? */ |
292 | }; | 295 | }; |
293 | 296 | ||
@@ -588,22 +591,30 @@ require use of the stronger protocol */ | |||
588 | #endif | 591 | #endif |
589 | 592 | ||
590 | /* | 593 | /* |
591 | * The list of servers that did not respond with NT LM 0.12. | 594 | * the list of TCP_Server_Info structures, ie each of the sockets |
592 | * This list helps improve performance and eliminate the messages indicating | 595 | * connecting our client to a distinct server (ip address), is |
593 | * that we had a communications error talking to the server in this list. | 596 | * chained together by cifs_tcp_ses_list. The list of all our SMB |
597 | * sessions (and from that the tree connections) can be found | ||
598 | * by iterating over cifs_tcp_ses_list | ||
594 | */ | 599 | */ |
595 | /* Feature not supported */ | 600 | GLOBAL_EXTERN struct list_head cifs_tcp_ses_list; |
596 | /* GLOBAL_EXTERN struct servers_not_supported *NotSuppList; */ | ||
597 | 601 | ||
598 | /* | 602 | /* |
599 | * The following is a hash table of all the users we know about. | 603 | * This lock protects the cifs_tcp_ses_list, the list of smb sessions per |
604 | * tcp session, and the list of tcon's per smb session. It also protects | ||
605 | * the reference counters for the server, smb session, and tcon. Finally, | ||
606 | * changes to the tcon->tidStatus should be done while holding this lock. | ||
600 | */ | 607 | */ |
601 | GLOBAL_EXTERN struct smbUidInfo *GlobalUidList[UID_HASH]; | 608 | GLOBAL_EXTERN rwlock_t cifs_tcp_ses_lock; |
602 | 609 | ||
603 | /* GLOBAL_EXTERN struct list_head GlobalServerList; BB not implemented yet */ | 610 | /* |
604 | GLOBAL_EXTERN struct list_head GlobalSMBSessionList; | 611 | * This lock protects the cifs_file->llist and cifs_file->flist |
605 | GLOBAL_EXTERN struct list_head GlobalTreeConnectionList; | 612 | * list operations, and updates to some flags (cifs_file->invalidHandle) |
606 | GLOBAL_EXTERN rwlock_t GlobalSMBSeslock; /* protects list inserts on 3 above */ | 613 | * It will be moved to either use the tcon->stat_lock or equivalent later. |
614 | * If cifs_tcp_ses_lock and the lock below are both needed to be held, then | ||
615 | * the cifs_tcp_ses_lock must be grabbed first and released last. | ||
616 | */ | ||
617 | GLOBAL_EXTERN rwlock_t GlobalSMBSeslock; | ||
607 | 618 | ||
608 | GLOBAL_EXTERN struct list_head GlobalOplock_Q; | 619 | GLOBAL_EXTERN struct list_head GlobalOplock_Q; |
609 | 620 | ||
diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c index d5eac48fc415..2af8626ced43 100644 --- a/fs/cifs/cifssmb.c +++ b/fs/cifs/cifssmb.c | |||
@@ -190,10 +190,10 @@ small_smb_init(int smb_command, int wct, struct cifsTconInfo *tcon, | |||
190 | /* need to prevent multiple threads trying to | 190 | /* need to prevent multiple threads trying to |
191 | simultaneously reconnect the same SMB session */ | 191 | simultaneously reconnect the same SMB session */ |
192 | down(&tcon->ses->sesSem); | 192 | down(&tcon->ses->sesSem); |
193 | if (tcon->ses->status == CifsNeedReconnect) | 193 | if (tcon->ses->need_reconnect) |
194 | rc = cifs_setup_session(0, tcon->ses, | 194 | rc = cifs_setup_session(0, tcon->ses, |
195 | nls_codepage); | 195 | nls_codepage); |
196 | if (!rc && (tcon->tidStatus == CifsNeedReconnect)) { | 196 | if (!rc && (tcon->need_reconnect)) { |
197 | mark_open_files_invalid(tcon); | 197 | mark_open_files_invalid(tcon); |
198 | rc = CIFSTCon(0, tcon->ses, tcon->treeName, | 198 | rc = CIFSTCon(0, tcon->ses, tcon->treeName, |
199 | tcon, nls_codepage); | 199 | tcon, nls_codepage); |
@@ -337,10 +337,10 @@ smb_init(int smb_command, int wct, struct cifsTconInfo *tcon, | |||
337 | /* need to prevent multiple threads trying to | 337 | /* need to prevent multiple threads trying to |
338 | simultaneously reconnect the same SMB session */ | 338 | simultaneously reconnect the same SMB session */ |
339 | down(&tcon->ses->sesSem); | 339 | down(&tcon->ses->sesSem); |
340 | if (tcon->ses->status == CifsNeedReconnect) | 340 | if (tcon->ses->need_reconnect) |
341 | rc = cifs_setup_session(0, tcon->ses, | 341 | rc = cifs_setup_session(0, tcon->ses, |
342 | nls_codepage); | 342 | nls_codepage); |
343 | if (!rc && (tcon->tidStatus == CifsNeedReconnect)) { | 343 | if (!rc && (tcon->need_reconnect)) { |
344 | mark_open_files_invalid(tcon); | 344 | mark_open_files_invalid(tcon); |
345 | rc = CIFSTCon(0, tcon->ses, tcon->treeName, | 345 | rc = CIFSTCon(0, tcon->ses, tcon->treeName, |
346 | tcon, nls_codepage); | 346 | tcon, nls_codepage); |
@@ -664,8 +664,9 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses) | |||
664 | rc = -EIO; | 664 | rc = -EIO; |
665 | goto neg_err_exit; | 665 | goto neg_err_exit; |
666 | } | 666 | } |
667 | 667 | read_lock(&cifs_tcp_ses_lock); | |
668 | if (server->socketUseCount.counter > 1) { | 668 | if (server->srv_count > 1) { |
669 | read_unlock(&cifs_tcp_ses_lock); | ||
669 | if (memcmp(server->server_GUID, | 670 | if (memcmp(server->server_GUID, |
670 | pSMBr->u.extended_response. | 671 | pSMBr->u.extended_response. |
671 | GUID, 16) != 0) { | 672 | GUID, 16) != 0) { |
@@ -674,9 +675,11 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses) | |||
674 | pSMBr->u.extended_response.GUID, | 675 | pSMBr->u.extended_response.GUID, |
675 | 16); | 676 | 16); |
676 | } | 677 | } |
677 | } else | 678 | } else { |
679 | read_unlock(&cifs_tcp_ses_lock); | ||
678 | memcpy(server->server_GUID, | 680 | memcpy(server->server_GUID, |
679 | pSMBr->u.extended_response.GUID, 16); | 681 | pSMBr->u.extended_response.GUID, 16); |
682 | } | ||
680 | 683 | ||
681 | if (count == 16) { | 684 | if (count == 16) { |
682 | server->secType = RawNTLMSSP; | 685 | server->secType = RawNTLMSSP; |
@@ -739,50 +742,31 @@ CIFSSMBTDis(const int xid, struct cifsTconInfo *tcon) | |||
739 | int rc = 0; | 742 | int rc = 0; |
740 | 743 | ||
741 | cFYI(1, ("In tree disconnect")); | 744 | cFYI(1, ("In tree disconnect")); |
742 | /* | ||
743 | * If last user of the connection and | ||
744 | * connection alive - disconnect it | ||
745 | * If this is the last connection on the server session disconnect it | ||
746 | * (and inside session disconnect we should check if tcp socket needs | ||
747 | * to be freed and kernel thread woken up). | ||
748 | */ | ||
749 | if (tcon) | ||
750 | down(&tcon->tconSem); | ||
751 | else | ||
752 | return -EIO; | ||
753 | 745 | ||
754 | atomic_dec(&tcon->useCount); | 746 | /* BB: do we need to check this? These should never be NULL. */ |
755 | if (atomic_read(&tcon->useCount) > 0) { | 747 | if ((tcon->ses == NULL) || (tcon->ses->server == NULL)) |
756 | up(&tcon->tconSem); | 748 | return -EIO; |
757 | return -EBUSY; | ||
758 | } | ||
759 | 749 | ||
760 | /* No need to return error on this operation if tid invalidated and | 750 | /* |
761 | closed on server already e.g. due to tcp session crashing */ | 751 | * No need to return error on this operation if tid invalidated and |
762 | if (tcon->tidStatus == CifsNeedReconnect) { | 752 | * closed on server already e.g. due to tcp session crashing. Also, |
763 | up(&tcon->tconSem); | 753 | * the tcon is no longer on the list, so no need to take lock before |
754 | * checking this. | ||
755 | */ | ||
756 | if (tcon->need_reconnect) | ||
764 | return 0; | 757 | return 0; |
765 | } | ||
766 | 758 | ||
767 | if ((tcon->ses == NULL) || (tcon->ses->server == NULL)) { | ||
768 | up(&tcon->tconSem); | ||
769 | return -EIO; | ||
770 | } | ||
771 | rc = small_smb_init(SMB_COM_TREE_DISCONNECT, 0, tcon, | 759 | rc = small_smb_init(SMB_COM_TREE_DISCONNECT, 0, tcon, |
772 | (void **)&smb_buffer); | 760 | (void **)&smb_buffer); |
773 | if (rc) { | 761 | if (rc) |
774 | up(&tcon->tconSem); | ||
775 | return rc; | 762 | return rc; |
776 | } | ||
777 | 763 | ||
778 | rc = SendReceiveNoRsp(xid, tcon->ses, smb_buffer, 0); | 764 | rc = SendReceiveNoRsp(xid, tcon->ses, smb_buffer, 0); |
779 | if (rc) | 765 | if (rc) |
780 | cFYI(1, ("Tree disconnect failed %d", rc)); | 766 | cFYI(1, ("Tree disconnect failed %d", rc)); |
781 | 767 | ||
782 | up(&tcon->tconSem); | ||
783 | |||
784 | /* No need to return error on this operation if tid invalidated and | 768 | /* No need to return error on this operation if tid invalidated and |
785 | closed on server already e.g. due to tcp session crashing */ | 769 | closed on server already e.g. due to tcp session crashing */ |
786 | if (rc == -EAGAIN) | 770 | if (rc == -EAGAIN) |
787 | rc = 0; | 771 | rc = 0; |
788 | 772 | ||
@@ -796,43 +780,36 @@ CIFSSMBLogoff(const int xid, struct cifsSesInfo *ses) | |||
796 | int rc = 0; | 780 | int rc = 0; |
797 | 781 | ||
798 | cFYI(1, ("In SMBLogoff for session disconnect")); | 782 | cFYI(1, ("In SMBLogoff for session disconnect")); |
799 | if (ses) | 783 | |
800 | down(&ses->sesSem); | 784 | /* |
801 | else | 785 | * BB: do we need to check validity of ses and server? They should |
786 | * always be valid since we have an active reference. If not, that | ||
787 | * should probably be a BUG() | ||
788 | */ | ||
789 | if (!ses || !ses->server) | ||
802 | return -EIO; | 790 | return -EIO; |
803 | 791 | ||
804 | atomic_dec(&ses->inUse); | 792 | down(&ses->sesSem); |
805 | if (atomic_read(&ses->inUse) > 0) { | 793 | if (ses->need_reconnect) |
806 | up(&ses->sesSem); | 794 | goto session_already_dead; /* no need to send SMBlogoff if uid |
807 | return -EBUSY; | 795 | already closed due to reconnect */ |
808 | } | ||
809 | rc = small_smb_init(SMB_COM_LOGOFF_ANDX, 2, NULL, (void **)&pSMB); | 796 | rc = small_smb_init(SMB_COM_LOGOFF_ANDX, 2, NULL, (void **)&pSMB); |
810 | if (rc) { | 797 | if (rc) { |
811 | up(&ses->sesSem); | 798 | up(&ses->sesSem); |
812 | return rc; | 799 | return rc; |
813 | } | 800 | } |
814 | 801 | ||
815 | if (ses->server) { | 802 | pSMB->hdr.Mid = GetNextMid(ses->server); |
816 | pSMB->hdr.Mid = GetNextMid(ses->server); | ||
817 | 803 | ||
818 | if (ses->server->secMode & | 804 | if (ses->server->secMode & |
819 | (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED)) | 805 | (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED)) |
820 | pSMB->hdr.Flags2 |= SMBFLG2_SECURITY_SIGNATURE; | 806 | pSMB->hdr.Flags2 |= SMBFLG2_SECURITY_SIGNATURE; |
821 | } | ||
822 | 807 | ||
823 | pSMB->hdr.Uid = ses->Suid; | 808 | pSMB->hdr.Uid = ses->Suid; |
824 | 809 | ||
825 | pSMB->AndXCommand = 0xFF; | 810 | pSMB->AndXCommand = 0xFF; |
826 | rc = SendReceiveNoRsp(xid, ses, (struct smb_hdr *) pSMB, 0); | 811 | rc = SendReceiveNoRsp(xid, ses, (struct smb_hdr *) pSMB, 0); |
827 | if (ses->server) { | 812 | session_already_dead: |
828 | atomic_dec(&ses->server->socketUseCount); | ||
829 | if (atomic_read(&ses->server->socketUseCount) == 0) { | ||
830 | spin_lock(&GlobalMid_Lock); | ||
831 | ses->server->tcpStatus = CifsExiting; | ||
832 | spin_unlock(&GlobalMid_Lock); | ||
833 | rc = -ESHUTDOWN; | ||
834 | } | ||
835 | } | ||
836 | up(&ses->sesSem); | 813 | up(&ses->sesSem); |
837 | 814 | ||
838 | /* if session dead then we do not need to do ulogoff, | 815 | /* if session dead then we do not need to do ulogoff, |
@@ -3922,6 +3899,27 @@ GetInodeNumOut: | |||
3922 | return rc; | 3899 | return rc; |
3923 | } | 3900 | } |
3924 | 3901 | ||
3902 | /* computes length of UCS string converted to host codepage | ||
3903 | * @src: UCS string | ||
3904 | * @maxlen: length of the input string in UCS characters | ||
3905 | * (not in bytes) | ||
3906 | * | ||
3907 | * return: size of input string in host codepage | ||
3908 | */ | ||
3909 | static int hostlen_fromUCS(const __le16 *src, const int maxlen, | ||
3910 | const struct nls_table *nls_codepage) { | ||
3911 | int i; | ||
3912 | int hostlen = 0; | ||
3913 | char to[4]; | ||
3914 | int charlen; | ||
3915 | for (i = 0; (i < maxlen) && src[i]; ++i) { | ||
3916 | charlen = nls_codepage->uni2char(le16_to_cpu(src[i]), | ||
3917 | to, NLS_MAX_CHARSET_SIZE); | ||
3918 | hostlen += charlen > 0 ? charlen : 1; | ||
3919 | } | ||
3920 | return hostlen; | ||
3921 | } | ||
3922 | |||
3925 | /* parses DFS refferal V3 structure | 3923 | /* parses DFS refferal V3 structure |
3926 | * caller is responsible for freeing target_nodes | 3924 | * caller is responsible for freeing target_nodes |
3927 | * returns: | 3925 | * returns: |
@@ -3932,7 +3930,8 @@ static int | |||
3932 | parse_DFS_referrals(TRANSACTION2_GET_DFS_REFER_RSP *pSMBr, | 3930 | parse_DFS_referrals(TRANSACTION2_GET_DFS_REFER_RSP *pSMBr, |
3933 | unsigned int *num_of_nodes, | 3931 | unsigned int *num_of_nodes, |
3934 | struct dfs_info3_param **target_nodes, | 3932 | struct dfs_info3_param **target_nodes, |
3935 | const struct nls_table *nls_codepage) | 3933 | const struct nls_table *nls_codepage, int remap, |
3934 | const char *searchName) | ||
3936 | { | 3935 | { |
3937 | int i, rc = 0; | 3936 | int i, rc = 0; |
3938 | char *data_end; | 3937 | char *data_end; |
@@ -3983,7 +3982,17 @@ parse_DFS_referrals(TRANSACTION2_GET_DFS_REFER_RSP *pSMBr, | |||
3983 | struct dfs_info3_param *node = (*target_nodes)+i; | 3982 | struct dfs_info3_param *node = (*target_nodes)+i; |
3984 | 3983 | ||
3985 | node->flags = le16_to_cpu(pSMBr->DFSFlags); | 3984 | node->flags = le16_to_cpu(pSMBr->DFSFlags); |
3986 | node->path_consumed = le16_to_cpu(pSMBr->PathConsumed); | 3985 | if (is_unicode) { |
3986 | __le16 *tmp = kmalloc(strlen(searchName)*2, GFP_KERNEL); | ||
3987 | cifsConvertToUCS((__le16 *) tmp, searchName, | ||
3988 | PATH_MAX, nls_codepage, remap); | ||
3989 | node->path_consumed = hostlen_fromUCS(tmp, | ||
3990 | le16_to_cpu(pSMBr->PathConsumed)/2, | ||
3991 | nls_codepage); | ||
3992 | kfree(tmp); | ||
3993 | } else | ||
3994 | node->path_consumed = le16_to_cpu(pSMBr->PathConsumed); | ||
3995 | |||
3987 | node->server_type = le16_to_cpu(ref->ServerType); | 3996 | node->server_type = le16_to_cpu(ref->ServerType); |
3988 | node->ref_flag = le16_to_cpu(ref->ReferralEntryFlags); | 3997 | node->ref_flag = le16_to_cpu(ref->ReferralEntryFlags); |
3989 | 3998 | ||
@@ -4116,7 +4125,8 @@ getDFSRetry: | |||
4116 | 4125 | ||
4117 | /* parse returned result into more usable form */ | 4126 | /* parse returned result into more usable form */ |
4118 | rc = parse_DFS_referrals(pSMBr, num_of_nodes, | 4127 | rc = parse_DFS_referrals(pSMBr, num_of_nodes, |
4119 | target_nodes, nls_codepage); | 4128 | target_nodes, nls_codepage, remap, |
4129 | searchName); | ||
4120 | 4130 | ||
4121 | GetDFSRefExit: | 4131 | GetDFSRefExit: |
4122 | cifs_buf_release(pSMB); | 4132 | cifs_buf_release(pSMB); |
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index e9f9248cb3fe..c7d341714586 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c | |||
@@ -124,7 +124,7 @@ static int | |||
124 | cifs_reconnect(struct TCP_Server_Info *server) | 124 | cifs_reconnect(struct TCP_Server_Info *server) |
125 | { | 125 | { |
126 | int rc = 0; | 126 | int rc = 0; |
127 | struct list_head *tmp; | 127 | struct list_head *tmp, *tmp2; |
128 | struct cifsSesInfo *ses; | 128 | struct cifsSesInfo *ses; |
129 | struct cifsTconInfo *tcon; | 129 | struct cifsTconInfo *tcon; |
130 | struct mid_q_entry *mid_entry; | 130 | struct mid_q_entry *mid_entry; |
@@ -144,23 +144,17 @@ cifs_reconnect(struct TCP_Server_Info *server) | |||
144 | 144 | ||
145 | /* before reconnecting the tcp session, mark the smb session (uid) | 145 | /* before reconnecting the tcp session, mark the smb session (uid) |
146 | and the tid bad so they are not used until reconnected */ | 146 | and the tid bad so they are not used until reconnected */ |
147 | read_lock(&GlobalSMBSeslock); | 147 | read_lock(&cifs_tcp_ses_lock); |
148 | list_for_each(tmp, &GlobalSMBSessionList) { | 148 | list_for_each(tmp, &server->smb_ses_list) { |
149 | ses = list_entry(tmp, struct cifsSesInfo, cifsSessionList); | 149 | ses = list_entry(tmp, struct cifsSesInfo, smb_ses_list); |
150 | if (ses->server) { | 150 | ses->need_reconnect = true; |
151 | if (ses->server == server) { | 151 | ses->ipc_tid = 0; |
152 | ses->status = CifsNeedReconnect; | 152 | list_for_each(tmp2, &ses->tcon_list) { |
153 | ses->ipc_tid = 0; | 153 | tcon = list_entry(tmp2, struct cifsTconInfo, tcon_list); |
154 | } | 154 | tcon->need_reconnect = true; |
155 | } | 155 | } |
156 | /* else tcp and smb sessions need reconnection */ | ||
157 | } | ||
158 | list_for_each(tmp, &GlobalTreeConnectionList) { | ||
159 | tcon = list_entry(tmp, struct cifsTconInfo, cifsConnectionList); | ||
160 | if ((tcon->ses) && (tcon->ses->server == server)) | ||
161 | tcon->tidStatus = CifsNeedReconnect; | ||
162 | } | 156 | } |
163 | read_unlock(&GlobalSMBSeslock); | 157 | read_unlock(&cifs_tcp_ses_lock); |
164 | /* do not want to be sending data on a socket we are freeing */ | 158 | /* do not want to be sending data on a socket we are freeing */ |
165 | down(&server->tcpSem); | 159 | down(&server->tcpSem); |
166 | if (server->ssocket) { | 160 | if (server->ssocket) { |
@@ -193,7 +187,7 @@ cifs_reconnect(struct TCP_Server_Info *server) | |||
193 | while ((server->tcpStatus != CifsExiting) && | 187 | while ((server->tcpStatus != CifsExiting) && |
194 | (server->tcpStatus != CifsGood)) { | 188 | (server->tcpStatus != CifsGood)) { |
195 | try_to_freeze(); | 189 | try_to_freeze(); |
196 | if (server->protocolType == IPV6) { | 190 | if (server->addr.sockAddr6.sin6_family == AF_INET6) { |
197 | rc = ipv6_connect(&server->addr.sockAddr6, | 191 | rc = ipv6_connect(&server->addr.sockAddr6, |
198 | &server->ssocket, server->noautotune); | 192 | &server->ssocket, server->noautotune); |
199 | } else { | 193 | } else { |
@@ -417,9 +411,14 @@ incomplete_rcv: | |||
417 | msleep(1); /* minimum sleep to prevent looping | 411 | msleep(1); /* minimum sleep to prevent looping |
418 | allowing socket to clear and app threads to set | 412 | allowing socket to clear and app threads to set |
419 | tcpStatus CifsNeedReconnect if server hung */ | 413 | tcpStatus CifsNeedReconnect if server hung */ |
420 | if (pdu_length < 4) | 414 | if (pdu_length < 4) { |
415 | iov.iov_base = (4 - pdu_length) + | ||
416 | (char *)smb_buffer; | ||
417 | iov.iov_len = pdu_length; | ||
418 | smb_msg.msg_control = NULL; | ||
419 | smb_msg.msg_controllen = 0; | ||
421 | goto incomplete_rcv; | 420 | goto incomplete_rcv; |
422 | else | 421 | } else |
423 | continue; | 422 | continue; |
424 | } else if (length <= 0) { | 423 | } else if (length <= 0) { |
425 | if (server->tcpStatus == CifsNew) { | 424 | if (server->tcpStatus == CifsNew) { |
@@ -654,6 +653,11 @@ multi_t2_fnd: | |||
654 | } | 653 | } |
655 | } /* end while !EXITING */ | 654 | } /* end while !EXITING */ |
656 | 655 | ||
656 | /* take it off the list, if it's not already */ | ||
657 | write_lock(&cifs_tcp_ses_lock); | ||
658 | list_del_init(&server->tcp_ses_list); | ||
659 | write_unlock(&cifs_tcp_ses_lock); | ||
660 | |||
657 | spin_lock(&GlobalMid_Lock); | 661 | spin_lock(&GlobalMid_Lock); |
658 | server->tcpStatus = CifsExiting; | 662 | server->tcpStatus = CifsExiting; |
659 | spin_unlock(&GlobalMid_Lock); | 663 | spin_unlock(&GlobalMid_Lock); |
@@ -686,29 +690,29 @@ multi_t2_fnd: | |||
686 | if (smallbuf) /* no sense logging a debug message if NULL */ | 690 | if (smallbuf) /* no sense logging a debug message if NULL */ |
687 | cifs_small_buf_release(smallbuf); | 691 | cifs_small_buf_release(smallbuf); |
688 | 692 | ||
689 | read_lock(&GlobalSMBSeslock); | 693 | /* |
694 | * BB: we shouldn't have to do any of this. It shouldn't be | ||
695 | * possible to exit from the thread with active SMB sessions | ||
696 | */ | ||
697 | read_lock(&cifs_tcp_ses_lock); | ||
690 | if (list_empty(&server->pending_mid_q)) { | 698 | if (list_empty(&server->pending_mid_q)) { |
691 | /* loop through server session structures attached to this and | 699 | /* loop through server session structures attached to this and |
692 | mark them dead */ | 700 | mark them dead */ |
693 | list_for_each(tmp, &GlobalSMBSessionList) { | 701 | list_for_each(tmp, &server->smb_ses_list) { |
694 | ses = | 702 | ses = list_entry(tmp, struct cifsSesInfo, |
695 | list_entry(tmp, struct cifsSesInfo, | 703 | smb_ses_list); |
696 | cifsSessionList); | 704 | ses->status = CifsExiting; |
697 | if (ses->server == server) { | 705 | ses->server = NULL; |
698 | ses->status = CifsExiting; | ||
699 | ses->server = NULL; | ||
700 | } | ||
701 | } | 706 | } |
702 | read_unlock(&GlobalSMBSeslock); | 707 | read_unlock(&cifs_tcp_ses_lock); |
703 | } else { | 708 | } else { |
704 | /* although we can not zero the server struct pointer yet, | 709 | /* although we can not zero the server struct pointer yet, |
705 | since there are active requests which may depnd on them, | 710 | since there are active requests which may depnd on them, |
706 | mark the corresponding SMB sessions as exiting too */ | 711 | mark the corresponding SMB sessions as exiting too */ |
707 | list_for_each(tmp, &GlobalSMBSessionList) { | 712 | list_for_each(tmp, &server->smb_ses_list) { |
708 | ses = list_entry(tmp, struct cifsSesInfo, | 713 | ses = list_entry(tmp, struct cifsSesInfo, |
709 | cifsSessionList); | 714 | smb_ses_list); |
710 | if (ses->server == server) | 715 | ses->status = CifsExiting; |
711 | ses->status = CifsExiting; | ||
712 | } | 716 | } |
713 | 717 | ||
714 | spin_lock(&GlobalMid_Lock); | 718 | spin_lock(&GlobalMid_Lock); |
@@ -723,7 +727,7 @@ multi_t2_fnd: | |||
723 | } | 727 | } |
724 | } | 728 | } |
725 | spin_unlock(&GlobalMid_Lock); | 729 | spin_unlock(&GlobalMid_Lock); |
726 | read_unlock(&GlobalSMBSeslock); | 730 | read_unlock(&cifs_tcp_ses_lock); |
727 | /* 1/8th of sec is more than enough time for them to exit */ | 731 | /* 1/8th of sec is more than enough time for them to exit */ |
728 | msleep(125); | 732 | msleep(125); |
729 | } | 733 | } |
@@ -745,14 +749,13 @@ multi_t2_fnd: | |||
745 | if there are any pointing to this (e.g | 749 | if there are any pointing to this (e.g |
746 | if a crazy root user tried to kill cifsd | 750 | if a crazy root user tried to kill cifsd |
747 | kernel thread explicitly this might happen) */ | 751 | kernel thread explicitly this might happen) */ |
748 | write_lock(&GlobalSMBSeslock); | 752 | /* BB: This shouldn't be necessary, see above */ |
749 | list_for_each(tmp, &GlobalSMBSessionList) { | 753 | read_lock(&cifs_tcp_ses_lock); |
750 | ses = list_entry(tmp, struct cifsSesInfo, | 754 | list_for_each(tmp, &server->smb_ses_list) { |
751 | cifsSessionList); | 755 | ses = list_entry(tmp, struct cifsSesInfo, smb_ses_list); |
752 | if (ses->server == server) | 756 | ses->server = NULL; |
753 | ses->server = NULL; | ||
754 | } | 757 | } |
755 | write_unlock(&GlobalSMBSeslock); | 758 | read_unlock(&cifs_tcp_ses_lock); |
756 | 759 | ||
757 | kfree(server->hostname); | 760 | kfree(server->hostname); |
758 | task_to_wake = xchg(&server->tsk, NULL); | 761 | task_to_wake = xchg(&server->tsk, NULL); |
@@ -1352,94 +1355,158 @@ cifs_parse_mount_options(char *options, const char *devname, | |||
1352 | return 0; | 1355 | return 0; |
1353 | } | 1356 | } |
1354 | 1357 | ||
1355 | static struct cifsSesInfo * | 1358 | static struct TCP_Server_Info * |
1356 | cifs_find_tcp_session(struct in_addr *target_ip_addr, | 1359 | cifs_find_tcp_session(struct sockaddr *addr) |
1357 | struct in6_addr *target_ip6_addr, | ||
1358 | char *userName, struct TCP_Server_Info **psrvTcp) | ||
1359 | { | 1360 | { |
1360 | struct list_head *tmp; | 1361 | struct list_head *tmp; |
1361 | struct cifsSesInfo *ses; | 1362 | struct TCP_Server_Info *server; |
1362 | 1363 | struct sockaddr_in *addr4 = (struct sockaddr_in *) addr; | |
1363 | *psrvTcp = NULL; | 1364 | struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *) addr; |
1365 | |||
1366 | write_lock(&cifs_tcp_ses_lock); | ||
1367 | list_for_each(tmp, &cifs_tcp_ses_list) { | ||
1368 | server = list_entry(tmp, struct TCP_Server_Info, | ||
1369 | tcp_ses_list); | ||
1370 | /* | ||
1371 | * the demux thread can exit on its own while still in CifsNew | ||
1372 | * so don't accept any sockets in that state. Since the | ||
1373 | * tcpStatus never changes back to CifsNew it's safe to check | ||
1374 | * for this without a lock. | ||
1375 | */ | ||
1376 | if (server->tcpStatus == CifsNew) | ||
1377 | continue; | ||
1364 | 1378 | ||
1365 | read_lock(&GlobalSMBSeslock); | 1379 | if (addr->sa_family == AF_INET && |
1366 | list_for_each(tmp, &GlobalSMBSessionList) { | 1380 | (addr4->sin_addr.s_addr != |
1367 | ses = list_entry(tmp, struct cifsSesInfo, cifsSessionList); | 1381 | server->addr.sockAddr.sin_addr.s_addr)) |
1368 | if (!ses->server) | 1382 | continue; |
1383 | else if (addr->sa_family == AF_INET6 && | ||
1384 | memcmp(&server->addr.sockAddr6.sin6_addr, | ||
1385 | &addr6->sin6_addr, sizeof(addr6->sin6_addr))) | ||
1369 | continue; | 1386 | continue; |
1370 | 1387 | ||
1371 | if (target_ip_addr && | 1388 | ++server->srv_count; |
1372 | ses->server->addr.sockAddr.sin_addr.s_addr != target_ip_addr->s_addr) | 1389 | write_unlock(&cifs_tcp_ses_lock); |
1373 | continue; | 1390 | cFYI(1, ("Existing tcp session with server found")); |
1374 | else if (target_ip6_addr && | 1391 | return server; |
1375 | memcmp(&ses->server->addr.sockAddr6.sin6_addr, | 1392 | } |
1376 | target_ip6_addr, sizeof(*target_ip6_addr))) | 1393 | write_unlock(&cifs_tcp_ses_lock); |
1377 | continue; | 1394 | return NULL; |
1378 | /* BB lock server and tcp session; increment use count here?? */ | 1395 | } |
1379 | 1396 | ||
1380 | /* found a match on the TCP session */ | 1397 | static void |
1381 | *psrvTcp = ses->server; | 1398 | cifs_put_tcp_session(struct TCP_Server_Info *server) |
1399 | { | ||
1400 | struct task_struct *task; | ||
1382 | 1401 | ||
1383 | /* BB check if reconnection needed */ | 1402 | write_lock(&cifs_tcp_ses_lock); |
1384 | if (strncmp(ses->userName, userName, MAX_USERNAME_SIZE) == 0) { | 1403 | if (--server->srv_count > 0) { |
1385 | read_unlock(&GlobalSMBSeslock); | 1404 | write_unlock(&cifs_tcp_ses_lock); |
1386 | /* Found exact match on both TCP and | 1405 | return; |
1387 | SMB sessions */ | ||
1388 | return ses; | ||
1389 | } | ||
1390 | /* else tcp and smb sessions need reconnection */ | ||
1391 | } | 1406 | } |
1392 | read_unlock(&GlobalSMBSeslock); | ||
1393 | 1407 | ||
1394 | return NULL; | 1408 | list_del_init(&server->tcp_ses_list); |
1409 | write_unlock(&cifs_tcp_ses_lock); | ||
1410 | |||
1411 | spin_lock(&GlobalMid_Lock); | ||
1412 | server->tcpStatus = CifsExiting; | ||
1413 | spin_unlock(&GlobalMid_Lock); | ||
1414 | |||
1415 | task = xchg(&server->tsk, NULL); | ||
1416 | if (task) | ||
1417 | force_sig(SIGKILL, task); | ||
1395 | } | 1418 | } |
1396 | 1419 | ||
1397 | static struct cifsTconInfo * | 1420 | static struct cifsSesInfo * |
1398 | find_unc(__be32 new_target_ip_addr, char *uncName, char *userName) | 1421 | cifs_find_smb_ses(struct TCP_Server_Info *server, char *username) |
1399 | { | 1422 | { |
1400 | struct list_head *tmp; | 1423 | struct list_head *tmp; |
1401 | struct cifsTconInfo *tcon; | 1424 | struct cifsSesInfo *ses; |
1402 | __be32 old_ip; | ||
1403 | |||
1404 | read_lock(&GlobalSMBSeslock); | ||
1405 | 1425 | ||
1406 | list_for_each(tmp, &GlobalTreeConnectionList) { | 1426 | write_lock(&cifs_tcp_ses_lock); |
1407 | cFYI(1, ("Next tcon")); | 1427 | list_for_each(tmp, &server->smb_ses_list) { |
1408 | tcon = list_entry(tmp, struct cifsTconInfo, cifsConnectionList); | 1428 | ses = list_entry(tmp, struct cifsSesInfo, smb_ses_list); |
1409 | if (!tcon->ses || !tcon->ses->server) | 1429 | if (strncmp(ses->userName, username, MAX_USERNAME_SIZE)) |
1410 | continue; | 1430 | continue; |
1411 | 1431 | ||
1412 | old_ip = tcon->ses->server->addr.sockAddr.sin_addr.s_addr; | 1432 | ++ses->ses_count; |
1413 | cFYI(1, ("old ip addr: %x == new ip %x ?", | 1433 | write_unlock(&cifs_tcp_ses_lock); |
1414 | old_ip, new_target_ip_addr)); | 1434 | return ses; |
1435 | } | ||
1436 | write_unlock(&cifs_tcp_ses_lock); | ||
1437 | return NULL; | ||
1438 | } | ||
1415 | 1439 | ||
1416 | if (old_ip != new_target_ip_addr) | 1440 | static void |
1417 | continue; | 1441 | cifs_put_smb_ses(struct cifsSesInfo *ses) |
1442 | { | ||
1443 | int xid; | ||
1444 | struct TCP_Server_Info *server = ses->server; | ||
1418 | 1445 | ||
1419 | /* BB lock tcon, server, tcp session and increment use count? */ | 1446 | write_lock(&cifs_tcp_ses_lock); |
1420 | /* found a match on the TCP session */ | 1447 | if (--ses->ses_count > 0) { |
1421 | /* BB check if reconnection needed */ | 1448 | write_unlock(&cifs_tcp_ses_lock); |
1422 | cFYI(1, ("IP match, old UNC: %s new: %s", | 1449 | return; |
1423 | tcon->treeName, uncName)); | 1450 | } |
1424 | 1451 | ||
1425 | if (strncmp(tcon->treeName, uncName, MAX_TREE_SIZE)) | 1452 | list_del_init(&ses->smb_ses_list); |
1426 | continue; | 1453 | write_unlock(&cifs_tcp_ses_lock); |
1427 | 1454 | ||
1428 | cFYI(1, ("and old usr: %s new: %s", | 1455 | if (ses->status == CifsGood) { |
1429 | tcon->treeName, uncName)); | 1456 | xid = GetXid(); |
1457 | CIFSSMBLogoff(xid, ses); | ||
1458 | _FreeXid(xid); | ||
1459 | } | ||
1460 | sesInfoFree(ses); | ||
1461 | cifs_put_tcp_session(server); | ||
1462 | } | ||
1430 | 1463 | ||
1431 | if (strncmp(tcon->ses->userName, userName, MAX_USERNAME_SIZE)) | 1464 | static struct cifsTconInfo * |
1465 | cifs_find_tcon(struct cifsSesInfo *ses, const char *unc) | ||
1466 | { | ||
1467 | struct list_head *tmp; | ||
1468 | struct cifsTconInfo *tcon; | ||
1469 | |||
1470 | write_lock(&cifs_tcp_ses_lock); | ||
1471 | list_for_each(tmp, &ses->tcon_list) { | ||
1472 | tcon = list_entry(tmp, struct cifsTconInfo, tcon_list); | ||
1473 | if (tcon->tidStatus == CifsExiting) | ||
1474 | continue; | ||
1475 | if (strncmp(tcon->treeName, unc, MAX_TREE_SIZE)) | ||
1432 | continue; | 1476 | continue; |
1433 | 1477 | ||
1434 | /* matched smb session (user name) */ | 1478 | ++tcon->tc_count; |
1435 | read_unlock(&GlobalSMBSeslock); | 1479 | write_unlock(&cifs_tcp_ses_lock); |
1436 | return tcon; | 1480 | return tcon; |
1437 | } | 1481 | } |
1438 | 1482 | write_unlock(&cifs_tcp_ses_lock); | |
1439 | read_unlock(&GlobalSMBSeslock); | ||
1440 | return NULL; | 1483 | return NULL; |
1441 | } | 1484 | } |
1442 | 1485 | ||
1486 | static void | ||
1487 | cifs_put_tcon(struct cifsTconInfo *tcon) | ||
1488 | { | ||
1489 | int xid; | ||
1490 | struct cifsSesInfo *ses = tcon->ses; | ||
1491 | |||
1492 | write_lock(&cifs_tcp_ses_lock); | ||
1493 | if (--tcon->tc_count > 0) { | ||
1494 | write_unlock(&cifs_tcp_ses_lock); | ||
1495 | return; | ||
1496 | } | ||
1497 | |||
1498 | list_del_init(&tcon->tcon_list); | ||
1499 | write_unlock(&cifs_tcp_ses_lock); | ||
1500 | |||
1501 | xid = GetXid(); | ||
1502 | CIFSSMBTDis(xid, tcon); | ||
1503 | _FreeXid(xid); | ||
1504 | |||
1505 | DeleteTconOplockQEntries(tcon); | ||
1506 | tconInfoFree(tcon); | ||
1507 | cifs_put_smb_ses(ses); | ||
1508 | } | ||
1509 | |||
1443 | int | 1510 | int |
1444 | get_dfs_path(int xid, struct cifsSesInfo *pSesInfo, const char *old_path, | 1511 | get_dfs_path(int xid, struct cifsSesInfo *pSesInfo, const char *old_path, |
1445 | const struct nls_table *nls_codepage, unsigned int *pnum_referrals, | 1512 | const struct nls_table *nls_codepage, unsigned int *pnum_referrals, |
@@ -1876,14 +1943,90 @@ convert_delimiter(char *path, char delim) | |||
1876 | } | 1943 | } |
1877 | } | 1944 | } |
1878 | 1945 | ||
1879 | static void | 1946 | static void setup_cifs_sb(struct smb_vol *pvolume_info, |
1880 | kill_cifsd(struct TCP_Server_Info *server) | 1947 | struct cifs_sb_info *cifs_sb) |
1881 | { | 1948 | { |
1882 | struct task_struct *task; | 1949 | if (pvolume_info->rsize > CIFSMaxBufSize) { |
1883 | 1950 | cERROR(1, ("rsize %d too large, using MaxBufSize", | |
1884 | task = xchg(&server->tsk, NULL); | 1951 | pvolume_info->rsize)); |
1885 | if (task) | 1952 | cifs_sb->rsize = CIFSMaxBufSize; |
1886 | force_sig(SIGKILL, task); | 1953 | } else if ((pvolume_info->rsize) && |
1954 | (pvolume_info->rsize <= CIFSMaxBufSize)) | ||
1955 | cifs_sb->rsize = pvolume_info->rsize; | ||
1956 | else /* default */ | ||
1957 | cifs_sb->rsize = CIFSMaxBufSize; | ||
1958 | |||
1959 | if (pvolume_info->wsize > PAGEVEC_SIZE * PAGE_CACHE_SIZE) { | ||
1960 | cERROR(1, ("wsize %d too large, using 4096 instead", | ||
1961 | pvolume_info->wsize)); | ||
1962 | cifs_sb->wsize = 4096; | ||
1963 | } else if (pvolume_info->wsize) | ||
1964 | cifs_sb->wsize = pvolume_info->wsize; | ||
1965 | else | ||
1966 | cifs_sb->wsize = min_t(const int, | ||
1967 | PAGEVEC_SIZE * PAGE_CACHE_SIZE, | ||
1968 | 127*1024); | ||
1969 | /* old default of CIFSMaxBufSize was too small now | ||
1970 | that SMB Write2 can send multiple pages in kvec. | ||
1971 | RFC1001 does not describe what happens when frame | ||
1972 | bigger than 128K is sent so use that as max in | ||
1973 | conjunction with 52K kvec constraint on arch with 4K | ||
1974 | page size */ | ||
1975 | |||
1976 | if (cifs_sb->rsize < 2048) { | ||
1977 | cifs_sb->rsize = 2048; | ||
1978 | /* Windows ME may prefer this */ | ||
1979 | cFYI(1, ("readsize set to minimum: 2048")); | ||
1980 | } | ||
1981 | /* calculate prepath */ | ||
1982 | cifs_sb->prepath = pvolume_info->prepath; | ||
1983 | if (cifs_sb->prepath) { | ||
1984 | cifs_sb->prepathlen = strlen(cifs_sb->prepath); | ||
1985 | /* we can not convert the / to \ in the path | ||
1986 | separators in the prefixpath yet because we do not | ||
1987 | know (until reset_cifs_unix_caps is called later) | ||
1988 | whether POSIX PATH CAP is available. We normalize | ||
1989 | the / to \ after reset_cifs_unix_caps is called */ | ||
1990 | pvolume_info->prepath = NULL; | ||
1991 | } else | ||
1992 | cifs_sb->prepathlen = 0; | ||
1993 | cifs_sb->mnt_uid = pvolume_info->linux_uid; | ||
1994 | cifs_sb->mnt_gid = pvolume_info->linux_gid; | ||
1995 | cifs_sb->mnt_file_mode = pvolume_info->file_mode; | ||
1996 | cifs_sb->mnt_dir_mode = pvolume_info->dir_mode; | ||
1997 | cFYI(1, ("file mode: 0x%x dir mode: 0x%x", | ||
1998 | cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode)); | ||
1999 | |||
2000 | if (pvolume_info->noperm) | ||
2001 | cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM; | ||
2002 | if (pvolume_info->setuids) | ||
2003 | cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID; | ||
2004 | if (pvolume_info->server_ino) | ||
2005 | cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM; | ||
2006 | if (pvolume_info->remap) | ||
2007 | cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SPECIAL_CHR; | ||
2008 | if (pvolume_info->no_xattr) | ||
2009 | cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR; | ||
2010 | if (pvolume_info->sfu_emul) | ||
2011 | cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL; | ||
2012 | if (pvolume_info->nobrl) | ||
2013 | cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL; | ||
2014 | if (pvolume_info->cifs_acl) | ||
2015 | cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL; | ||
2016 | if (pvolume_info->override_uid) | ||
2017 | cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_UID; | ||
2018 | if (pvolume_info->override_gid) | ||
2019 | cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_GID; | ||
2020 | if (pvolume_info->dynperm) | ||
2021 | cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM; | ||
2022 | if (pvolume_info->direct_io) { | ||
2023 | cFYI(1, ("mounting share using direct i/o")); | ||
2024 | cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO; | ||
2025 | } | ||
2026 | |||
2027 | if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm)) | ||
2028 | cERROR(1, ("mount option dynperm ignored if cifsacl " | ||
2029 | "mount option supported")); | ||
1887 | } | 2030 | } |
1888 | 2031 | ||
1889 | int | 2032 | int |
@@ -1892,13 +2035,12 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, | |||
1892 | { | 2035 | { |
1893 | int rc = 0; | 2036 | int rc = 0; |
1894 | int xid; | 2037 | int xid; |
1895 | int address_type = AF_INET; | ||
1896 | struct socket *csocket = NULL; | 2038 | struct socket *csocket = NULL; |
1897 | struct sockaddr_in sin_server; | 2039 | struct sockaddr addr; |
1898 | struct sockaddr_in6 sin_server6; | 2040 | struct sockaddr_in *sin_server = (struct sockaddr_in *) &addr; |
2041 | struct sockaddr_in6 *sin_server6 = (struct sockaddr_in6 *) &addr; | ||
1899 | struct smb_vol volume_info; | 2042 | struct smb_vol volume_info; |
1900 | struct cifsSesInfo *pSesInfo = NULL; | 2043 | struct cifsSesInfo *pSesInfo = NULL; |
1901 | struct cifsSesInfo *existingCifsSes = NULL; | ||
1902 | struct cifsTconInfo *tcon = NULL; | 2044 | struct cifsTconInfo *tcon = NULL; |
1903 | struct TCP_Server_Info *srvTcp = NULL; | 2045 | struct TCP_Server_Info *srvTcp = NULL; |
1904 | 2046 | ||
@@ -1906,6 +2048,7 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, | |||
1906 | 2048 | ||
1907 | /* cFYI(1, ("Entering cifs_mount. Xid: %d with: %s", xid, mount_data)); */ | 2049 | /* cFYI(1, ("Entering cifs_mount. Xid: %d with: %s", xid, mount_data)); */ |
1908 | 2050 | ||
2051 | memset(&addr, 0, sizeof(struct sockaddr)); | ||
1909 | memset(&volume_info, 0, sizeof(struct smb_vol)); | 2052 | memset(&volume_info, 0, sizeof(struct smb_vol)); |
1910 | if (cifs_parse_mount_options(mount_data, devname, &volume_info)) { | 2053 | if (cifs_parse_mount_options(mount_data, devname, &volume_info)) { |
1911 | rc = -EINVAL; | 2054 | rc = -EINVAL; |
@@ -1928,16 +2071,16 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, | |||
1928 | 2071 | ||
1929 | if (volume_info.UNCip && volume_info.UNC) { | 2072 | if (volume_info.UNCip && volume_info.UNC) { |
1930 | rc = cifs_inet_pton(AF_INET, volume_info.UNCip, | 2073 | rc = cifs_inet_pton(AF_INET, volume_info.UNCip, |
1931 | &sin_server.sin_addr.s_addr); | 2074 | &sin_server->sin_addr.s_addr); |
1932 | 2075 | ||
1933 | if (rc <= 0) { | 2076 | if (rc <= 0) { |
1934 | /* not ipv4 address, try ipv6 */ | 2077 | /* not ipv4 address, try ipv6 */ |
1935 | rc = cifs_inet_pton(AF_INET6, volume_info.UNCip, | 2078 | rc = cifs_inet_pton(AF_INET6, volume_info.UNCip, |
1936 | &sin_server6.sin6_addr.in6_u); | 2079 | &sin_server6->sin6_addr.in6_u); |
1937 | if (rc > 0) | 2080 | if (rc > 0) |
1938 | address_type = AF_INET6; | 2081 | addr.sa_family = AF_INET6; |
1939 | } else { | 2082 | } else { |
1940 | address_type = AF_INET; | 2083 | addr.sa_family = AF_INET; |
1941 | } | 2084 | } |
1942 | 2085 | ||
1943 | if (rc <= 0) { | 2086 | if (rc <= 0) { |
@@ -1977,41 +2120,25 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, | |||
1977 | } | 2120 | } |
1978 | } | 2121 | } |
1979 | 2122 | ||
1980 | if (address_type == AF_INET) | 2123 | srvTcp = cifs_find_tcp_session(&addr); |
1981 | existingCifsSes = cifs_find_tcp_session(&sin_server.sin_addr, | 2124 | if (!srvTcp) { /* create socket */ |
1982 | NULL /* no ipv6 addr */, | 2125 | if (addr.sa_family == AF_INET6) { |
1983 | volume_info.username, &srvTcp); | ||
1984 | else if (address_type == AF_INET6) { | ||
1985 | cFYI(1, ("looking for ipv6 address")); | ||
1986 | existingCifsSes = cifs_find_tcp_session(NULL /* no ipv4 addr */, | ||
1987 | &sin_server6.sin6_addr, | ||
1988 | volume_info.username, &srvTcp); | ||
1989 | } else { | ||
1990 | rc = -EINVAL; | ||
1991 | goto out; | ||
1992 | } | ||
1993 | |||
1994 | if (srvTcp) { | ||
1995 | cFYI(1, ("Existing tcp session with server found")); | ||
1996 | } else { /* create socket */ | ||
1997 | if (volume_info.port) | ||
1998 | sin_server.sin_port = htons(volume_info.port); | ||
1999 | else | ||
2000 | sin_server.sin_port = 0; | ||
2001 | if (address_type == AF_INET6) { | ||
2002 | cFYI(1, ("attempting ipv6 connect")); | 2126 | cFYI(1, ("attempting ipv6 connect")); |
2003 | /* BB should we allow ipv6 on port 139? */ | 2127 | /* BB should we allow ipv6 on port 139? */ |
2004 | /* other OS never observed in Wild doing 139 with v6 */ | 2128 | /* other OS never observed in Wild doing 139 with v6 */ |
2005 | rc = ipv6_connect(&sin_server6, &csocket, | 2129 | sin_server6->sin6_port = htons(volume_info.port); |
2130 | rc = ipv6_connect(sin_server6, &csocket, | ||
2006 | volume_info.noblocksnd); | 2131 | volume_info.noblocksnd); |
2007 | } else | 2132 | } else { |
2008 | rc = ipv4_connect(&sin_server, &csocket, | 2133 | sin_server->sin_port = htons(volume_info.port); |
2134 | rc = ipv4_connect(sin_server, &csocket, | ||
2009 | volume_info.source_rfc1001_name, | 2135 | volume_info.source_rfc1001_name, |
2010 | volume_info.target_rfc1001_name, | 2136 | volume_info.target_rfc1001_name, |
2011 | volume_info.noblocksnd, | 2137 | volume_info.noblocksnd, |
2012 | volume_info.noautotune); | 2138 | volume_info.noautotune); |
2139 | } | ||
2013 | if (rc < 0) { | 2140 | if (rc < 0) { |
2014 | cERROR(1, ("Error connecting to IPv4 socket. " | 2141 | cERROR(1, ("Error connecting to socket. " |
2015 | "Aborting operation")); | 2142 | "Aborting operation")); |
2016 | if (csocket != NULL) | 2143 | if (csocket != NULL) |
2017 | sock_release(csocket); | 2144 | sock_release(csocket); |
@@ -2026,12 +2153,15 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, | |||
2026 | } else { | 2153 | } else { |
2027 | srvTcp->noblocksnd = volume_info.noblocksnd; | 2154 | srvTcp->noblocksnd = volume_info.noblocksnd; |
2028 | srvTcp->noautotune = volume_info.noautotune; | 2155 | srvTcp->noautotune = volume_info.noautotune; |
2029 | memcpy(&srvTcp->addr.sockAddr, &sin_server, | 2156 | if (addr.sa_family == AF_INET6) |
2030 | sizeof(struct sockaddr_in)); | 2157 | memcpy(&srvTcp->addr.sockAddr6, sin_server6, |
2158 | sizeof(struct sockaddr_in6)); | ||
2159 | else | ||
2160 | memcpy(&srvTcp->addr.sockAddr, sin_server, | ||
2161 | sizeof(struct sockaddr_in)); | ||
2031 | atomic_set(&srvTcp->inFlight, 0); | 2162 | atomic_set(&srvTcp->inFlight, 0); |
2032 | /* BB Add code for ipv6 case too */ | 2163 | /* BB Add code for ipv6 case too */ |
2033 | srvTcp->ssocket = csocket; | 2164 | srvTcp->ssocket = csocket; |
2034 | srvTcp->protocolType = IPV4; | ||
2035 | srvTcp->hostname = extract_hostname(volume_info.UNC); | 2165 | srvTcp->hostname = extract_hostname(volume_info.UNC); |
2036 | if (IS_ERR(srvTcp->hostname)) { | 2166 | if (IS_ERR(srvTcp->hostname)) { |
2037 | rc = PTR_ERR(srvTcp->hostname); | 2167 | rc = PTR_ERR(srvTcp->hostname); |
@@ -2061,15 +2191,28 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, | |||
2061 | memcpy(srvTcp->server_RFC1001_name, | 2191 | memcpy(srvTcp->server_RFC1001_name, |
2062 | volume_info.target_rfc1001_name, 16); | 2192 | volume_info.target_rfc1001_name, 16); |
2063 | srvTcp->sequence_number = 0; | 2193 | srvTcp->sequence_number = 0; |
2194 | INIT_LIST_HEAD(&srvTcp->tcp_ses_list); | ||
2195 | INIT_LIST_HEAD(&srvTcp->smb_ses_list); | ||
2196 | ++srvTcp->srv_count; | ||
2197 | write_lock(&cifs_tcp_ses_lock); | ||
2198 | list_add(&srvTcp->tcp_ses_list, | ||
2199 | &cifs_tcp_ses_list); | ||
2200 | write_unlock(&cifs_tcp_ses_lock); | ||
2064 | } | 2201 | } |
2065 | } | 2202 | } |
2066 | 2203 | ||
2067 | if (existingCifsSes) { | 2204 | pSesInfo = cifs_find_smb_ses(srvTcp, volume_info.username); |
2068 | pSesInfo = existingCifsSes; | 2205 | if (pSesInfo) { |
2069 | cFYI(1, ("Existing smb sess found (status=%d)", | 2206 | cFYI(1, ("Existing smb sess found (status=%d)", |
2070 | pSesInfo->status)); | 2207 | pSesInfo->status)); |
2208 | /* | ||
2209 | * The existing SMB session already has a reference to srvTcp, | ||
2210 | * so we can put back the extra one we got before | ||
2211 | */ | ||
2212 | cifs_put_tcp_session(srvTcp); | ||
2213 | |||
2071 | down(&pSesInfo->sesSem); | 2214 | down(&pSesInfo->sesSem); |
2072 | if (pSesInfo->status == CifsNeedReconnect) { | 2215 | if (pSesInfo->need_reconnect) { |
2073 | cFYI(1, ("Session needs reconnect")); | 2216 | cFYI(1, ("Session needs reconnect")); |
2074 | rc = cifs_setup_session(xid, pSesInfo, | 2217 | rc = cifs_setup_session(xid, pSesInfo, |
2075 | cifs_sb->local_nls); | 2218 | cifs_sb->local_nls); |
@@ -2078,187 +2221,101 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, | |||
2078 | } else if (!rc) { | 2221 | } else if (!rc) { |
2079 | cFYI(1, ("Existing smb sess not found")); | 2222 | cFYI(1, ("Existing smb sess not found")); |
2080 | pSesInfo = sesInfoAlloc(); | 2223 | pSesInfo = sesInfoAlloc(); |
2081 | if (pSesInfo == NULL) | 2224 | if (pSesInfo == NULL) { |
2082 | rc = -ENOMEM; | 2225 | rc = -ENOMEM; |
2083 | else { | 2226 | goto mount_fail_check; |
2084 | pSesInfo->server = srvTcp; | 2227 | } |
2085 | sprintf(pSesInfo->serverName, "%u.%u.%u.%u", | 2228 | |
2086 | NIPQUAD(sin_server.sin_addr.s_addr)); | 2229 | /* new SMB session uses our srvTcp ref */ |
2087 | } | 2230 | pSesInfo->server = srvTcp; |
2231 | sprintf(pSesInfo->serverName, "%u.%u.%u.%u", | ||
2232 | NIPQUAD(sin_server->sin_addr.s_addr)); | ||
2233 | |||
2234 | write_lock(&cifs_tcp_ses_lock); | ||
2235 | list_add(&pSesInfo->smb_ses_list, &srvTcp->smb_ses_list); | ||
2236 | write_unlock(&cifs_tcp_ses_lock); | ||
2237 | |||
2238 | /* volume_info.password freed at unmount */ | ||
2239 | if (volume_info.password) { | ||
2240 | pSesInfo->password = volume_info.password; | ||
2241 | /* set to NULL to prevent freeing on exit */ | ||
2242 | volume_info.password = NULL; | ||
2243 | } | ||
2244 | if (volume_info.username) | ||
2245 | strncpy(pSesInfo->userName, volume_info.username, | ||
2246 | MAX_USERNAME_SIZE); | ||
2247 | if (volume_info.domainname) { | ||
2248 | int len = strlen(volume_info.domainname); | ||
2249 | pSesInfo->domainName = kmalloc(len + 1, GFP_KERNEL); | ||
2250 | if (pSesInfo->domainName) | ||
2251 | strcpy(pSesInfo->domainName, | ||
2252 | volume_info.domainname); | ||
2253 | } | ||
2254 | pSesInfo->linux_uid = volume_info.linux_uid; | ||
2255 | pSesInfo->overrideSecFlg = volume_info.secFlg; | ||
2256 | down(&pSesInfo->sesSem); | ||
2088 | 2257 | ||
2089 | if (!rc) { | 2258 | /* BB FIXME need to pass vol->secFlgs BB */ |
2090 | /* volume_info.password freed at unmount */ | 2259 | rc = cifs_setup_session(xid, pSesInfo, |
2091 | if (volume_info.password) { | 2260 | cifs_sb->local_nls); |
2092 | pSesInfo->password = volume_info.password; | 2261 | up(&pSesInfo->sesSem); |
2093 | /* set to NULL to prevent freeing on exit */ | ||
2094 | volume_info.password = NULL; | ||
2095 | } | ||
2096 | if (volume_info.username) | ||
2097 | strncpy(pSesInfo->userName, | ||
2098 | volume_info.username, | ||
2099 | MAX_USERNAME_SIZE); | ||
2100 | if (volume_info.domainname) { | ||
2101 | int len = strlen(volume_info.domainname); | ||
2102 | pSesInfo->domainName = | ||
2103 | kmalloc(len + 1, GFP_KERNEL); | ||
2104 | if (pSesInfo->domainName) | ||
2105 | strcpy(pSesInfo->domainName, | ||
2106 | volume_info.domainname); | ||
2107 | } | ||
2108 | pSesInfo->linux_uid = volume_info.linux_uid; | ||
2109 | pSesInfo->overrideSecFlg = volume_info.secFlg; | ||
2110 | down(&pSesInfo->sesSem); | ||
2111 | /* BB FIXME need to pass vol->secFlgs BB */ | ||
2112 | rc = cifs_setup_session(xid, pSesInfo, | ||
2113 | cifs_sb->local_nls); | ||
2114 | up(&pSesInfo->sesSem); | ||
2115 | if (!rc) | ||
2116 | atomic_inc(&srvTcp->socketUseCount); | ||
2117 | } | ||
2118 | } | 2262 | } |
2119 | 2263 | ||
2120 | /* search for existing tcon to this server share */ | 2264 | /* search for existing tcon to this server share */ |
2121 | if (!rc) { | 2265 | if (!rc) { |
2122 | if (volume_info.rsize > CIFSMaxBufSize) { | 2266 | setup_cifs_sb(&volume_info, cifs_sb); |
2123 | cERROR(1, ("rsize %d too large, using MaxBufSize", | ||
2124 | volume_info.rsize)); | ||
2125 | cifs_sb->rsize = CIFSMaxBufSize; | ||
2126 | } else if ((volume_info.rsize) && | ||
2127 | (volume_info.rsize <= CIFSMaxBufSize)) | ||
2128 | cifs_sb->rsize = volume_info.rsize; | ||
2129 | else /* default */ | ||
2130 | cifs_sb->rsize = CIFSMaxBufSize; | ||
2131 | |||
2132 | if (volume_info.wsize > PAGEVEC_SIZE * PAGE_CACHE_SIZE) { | ||
2133 | cERROR(1, ("wsize %d too large, using 4096 instead", | ||
2134 | volume_info.wsize)); | ||
2135 | cifs_sb->wsize = 4096; | ||
2136 | } else if (volume_info.wsize) | ||
2137 | cifs_sb->wsize = volume_info.wsize; | ||
2138 | else | ||
2139 | cifs_sb->wsize = | ||
2140 | min_t(const int, PAGEVEC_SIZE * PAGE_CACHE_SIZE, | ||
2141 | 127*1024); | ||
2142 | /* old default of CIFSMaxBufSize was too small now | ||
2143 | that SMB Write2 can send multiple pages in kvec. | ||
2144 | RFC1001 does not describe what happens when frame | ||
2145 | bigger than 128K is sent so use that as max in | ||
2146 | conjunction with 52K kvec constraint on arch with 4K | ||
2147 | page size */ | ||
2148 | |||
2149 | if (cifs_sb->rsize < 2048) { | ||
2150 | cifs_sb->rsize = 2048; | ||
2151 | /* Windows ME may prefer this */ | ||
2152 | cFYI(1, ("readsize set to minimum: 2048")); | ||
2153 | } | ||
2154 | /* calculate prepath */ | ||
2155 | cifs_sb->prepath = volume_info.prepath; | ||
2156 | if (cifs_sb->prepath) { | ||
2157 | cifs_sb->prepathlen = strlen(cifs_sb->prepath); | ||
2158 | /* we can not convert the / to \ in the path | ||
2159 | separators in the prefixpath yet because we do not | ||
2160 | know (until reset_cifs_unix_caps is called later) | ||
2161 | whether POSIX PATH CAP is available. We normalize | ||
2162 | the / to \ after reset_cifs_unix_caps is called */ | ||
2163 | volume_info.prepath = NULL; | ||
2164 | } else | ||
2165 | cifs_sb->prepathlen = 0; | ||
2166 | cifs_sb->mnt_uid = volume_info.linux_uid; | ||
2167 | cifs_sb->mnt_gid = volume_info.linux_gid; | ||
2168 | cifs_sb->mnt_file_mode = volume_info.file_mode; | ||
2169 | cifs_sb->mnt_dir_mode = volume_info.dir_mode; | ||
2170 | cFYI(1, ("file mode: 0x%x dir mode: 0x%x", | ||
2171 | cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode)); | ||
2172 | |||
2173 | if (volume_info.noperm) | ||
2174 | cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM; | ||
2175 | if (volume_info.setuids) | ||
2176 | cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID; | ||
2177 | if (volume_info.server_ino) | ||
2178 | cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM; | ||
2179 | if (volume_info.remap) | ||
2180 | cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SPECIAL_CHR; | ||
2181 | if (volume_info.no_xattr) | ||
2182 | cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR; | ||
2183 | if (volume_info.sfu_emul) | ||
2184 | cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL; | ||
2185 | if (volume_info.nobrl) | ||
2186 | cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL; | ||
2187 | if (volume_info.cifs_acl) | ||
2188 | cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL; | ||
2189 | if (volume_info.override_uid) | ||
2190 | cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_UID; | ||
2191 | if (volume_info.override_gid) | ||
2192 | cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_GID; | ||
2193 | if (volume_info.dynperm) | ||
2194 | cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM; | ||
2195 | if (volume_info.direct_io) { | ||
2196 | cFYI(1, ("mounting share using direct i/o")); | ||
2197 | cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO; | ||
2198 | } | ||
2199 | 2267 | ||
2200 | if ((volume_info.cifs_acl) && (volume_info.dynperm)) | 2268 | tcon = cifs_find_tcon(pSesInfo, volume_info.UNC); |
2201 | cERROR(1, ("mount option dynperm ignored if cifsacl " | ||
2202 | "mount option supported")); | ||
2203 | |||
2204 | tcon = | ||
2205 | find_unc(sin_server.sin_addr.s_addr, volume_info.UNC, | ||
2206 | volume_info.username); | ||
2207 | if (tcon) { | 2269 | if (tcon) { |
2208 | cFYI(1, ("Found match on UNC path")); | 2270 | cFYI(1, ("Found match on UNC path")); |
2209 | /* we can have only one retry value for a connection | 2271 | /* existing tcon already has a reference */ |
2210 | to a share so for resources mounted more than once | 2272 | cifs_put_smb_ses(pSesInfo); |
2211 | to the same server share the last value passed in | ||
2212 | for the retry flag is used */ | ||
2213 | tcon->retry = volume_info.retry; | ||
2214 | tcon->nocase = volume_info.nocase; | ||
2215 | tcon->local_lease = volume_info.local_lease; | ||
2216 | if (tcon->seal != volume_info.seal) | 2273 | if (tcon->seal != volume_info.seal) |
2217 | cERROR(1, ("transport encryption setting " | 2274 | cERROR(1, ("transport encryption setting " |
2218 | "conflicts with existing tid")); | 2275 | "conflicts with existing tid")); |
2219 | } else { | 2276 | } else { |
2220 | tcon = tconInfoAlloc(); | 2277 | tcon = tconInfoAlloc(); |
2221 | if (tcon == NULL) | 2278 | if (tcon == NULL) { |
2222 | rc = -ENOMEM; | 2279 | rc = -ENOMEM; |
2223 | else { | 2280 | goto mount_fail_check; |
2224 | /* check for null share name ie connecting to | 2281 | } |
2225 | * dfs root */ | 2282 | tcon->ses = pSesInfo; |
2226 | 2283 | ||
2227 | /* BB check if this works for exactly length | 2284 | /* check for null share name ie connect to dfs root */ |
2228 | * three strings */ | 2285 | if ((strchr(volume_info.UNC + 3, '\\') == NULL) |
2229 | if ((strchr(volume_info.UNC + 3, '\\') == NULL) | 2286 | && (strchr(volume_info.UNC + 3, '/') == NULL)) { |
2230 | && (strchr(volume_info.UNC + 3, '/') == | 2287 | /* rc = connect_to_dfs_path(...) */ |
2231 | NULL)) { | 2288 | cFYI(1, ("DFS root not supported")); |
2232 | /* rc = connect_to_dfs_path(xid, pSesInfo, | 2289 | rc = -ENODEV; |
2233 | "", cifs_sb->local_nls, | 2290 | goto mount_fail_check; |
2234 | cifs_sb->mnt_cifs_flags & | 2291 | } else { |
2235 | CIFS_MOUNT_MAP_SPECIAL_CHR);*/ | 2292 | /* BB Do we need to wrap sesSem around |
2236 | cFYI(1, ("DFS root not supported")); | 2293 | * this TCon call and Unix SetFS as |
2237 | rc = -ENODEV; | 2294 | * we do on SessSetup and reconnect? */ |
2238 | goto out; | 2295 | rc = CIFSTCon(xid, pSesInfo, volume_info.UNC, |
2239 | } else { | 2296 | tcon, cifs_sb->local_nls); |
2240 | /* BB Do we need to wrap sesSem around | 2297 | cFYI(1, ("CIFS Tcon rc = %d", rc)); |
2241 | * this TCon call and Unix SetFS as | 2298 | if (volume_info.nodfs) { |
2242 | * we do on SessSetup and reconnect? */ | 2299 | tcon->Flags &= ~SMB_SHARE_IS_IN_DFS; |
2243 | rc = CIFSTCon(xid, pSesInfo, | 2300 | cFYI(1, ("DFS disabled (%d)", |
2244 | volume_info.UNC, | 2301 | tcon->Flags)); |
2245 | tcon, cifs_sb->local_nls); | ||
2246 | cFYI(1, ("CIFS Tcon rc = %d", rc)); | ||
2247 | if (volume_info.nodfs) { | ||
2248 | tcon->Flags &= | ||
2249 | ~SMB_SHARE_IS_IN_DFS; | ||
2250 | cFYI(1, ("DFS disabled (%d)", | ||
2251 | tcon->Flags)); | ||
2252 | } | ||
2253 | } | ||
2254 | if (!rc) { | ||
2255 | atomic_inc(&pSesInfo->inUse); | ||
2256 | tcon->retry = volume_info.retry; | ||
2257 | tcon->nocase = volume_info.nocase; | ||
2258 | tcon->seal = volume_info.seal; | ||
2259 | } | 2302 | } |
2260 | } | 2303 | } |
2261 | } | 2304 | if (rc) |
2305 | goto mount_fail_check; | ||
2306 | tcon->seal = volume_info.seal; | ||
2307 | write_lock(&cifs_tcp_ses_lock); | ||
2308 | list_add(&tcon->tcon_list, &pSesInfo->tcon_list); | ||
2309 | write_unlock(&cifs_tcp_ses_lock); | ||
2310 | } | ||
2311 | |||
2312 | /* we can have only one retry value for a connection | ||
2313 | to a share so for resources mounted more than once | ||
2314 | to the same server share the last value passed in | ||
2315 | for the retry flag is used */ | ||
2316 | tcon->retry = volume_info.retry; | ||
2317 | tcon->nocase = volume_info.nocase; | ||
2318 | tcon->local_lease = volume_info.local_lease; | ||
2262 | } | 2319 | } |
2263 | if (pSesInfo) { | 2320 | if (pSesInfo) { |
2264 | if (pSesInfo->capabilities & CAP_LARGE_FILES) { | 2321 | if (pSesInfo->capabilities & CAP_LARGE_FILES) { |
@@ -2270,80 +2327,49 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, | |||
2270 | /* BB FIXME fix time_gran to be larger for LANMAN sessions */ | 2327 | /* BB FIXME fix time_gran to be larger for LANMAN sessions */ |
2271 | sb->s_time_gran = 100; | 2328 | sb->s_time_gran = 100; |
2272 | 2329 | ||
2273 | /* on error free sesinfo and tcon struct if needed */ | 2330 | mount_fail_check: |
2331 | /* on error free sesinfo and tcon struct if needed */ | ||
2274 | if (rc) { | 2332 | if (rc) { |
2275 | /* if session setup failed, use count is zero but | 2333 | /* If find_unc succeeded then rc == 0 so we can not end */ |
2276 | we still need to free cifsd thread */ | 2334 | /* up accidently freeing someone elses tcon struct */ |
2277 | if (atomic_read(&srvTcp->socketUseCount) == 0) { | 2335 | if (tcon) |
2278 | spin_lock(&GlobalMid_Lock); | 2336 | cifs_put_tcon(tcon); |
2279 | srvTcp->tcpStatus = CifsExiting; | 2337 | else if (pSesInfo) |
2280 | spin_unlock(&GlobalMid_Lock); | 2338 | cifs_put_smb_ses(pSesInfo); |
2281 | kill_cifsd(srvTcp); | ||
2282 | } | ||
2283 | /* If find_unc succeeded then rc == 0 so we can not end */ | ||
2284 | if (tcon) /* up accidently freeing someone elses tcon struct */ | ||
2285 | tconInfoFree(tcon); | ||
2286 | if (existingCifsSes == NULL) { | ||
2287 | if (pSesInfo) { | ||
2288 | if ((pSesInfo->server) && | ||
2289 | (pSesInfo->status == CifsGood)) { | ||
2290 | int temp_rc; | ||
2291 | temp_rc = CIFSSMBLogoff(xid, pSesInfo); | ||
2292 | /* if the socketUseCount is now zero */ | ||
2293 | if ((temp_rc == -ESHUTDOWN) && | ||
2294 | (pSesInfo->server)) | ||
2295 | kill_cifsd(pSesInfo->server); | ||
2296 | } else { | ||
2297 | cFYI(1, ("No session or bad tcon")); | ||
2298 | if (pSesInfo->server) { | ||
2299 | spin_lock(&GlobalMid_Lock); | ||
2300 | srvTcp->tcpStatus = CifsExiting; | ||
2301 | spin_unlock(&GlobalMid_Lock); | ||
2302 | kill_cifsd(pSesInfo->server); | ||
2303 | } | ||
2304 | } | ||
2305 | sesInfoFree(pSesInfo); | ||
2306 | /* pSesInfo = NULL; */ | ||
2307 | } | ||
2308 | } | ||
2309 | } else { | ||
2310 | atomic_inc(&tcon->useCount); | ||
2311 | cifs_sb->tcon = tcon; | ||
2312 | tcon->ses = pSesInfo; | ||
2313 | |||
2314 | /* do not care if following two calls succeed - informational */ | ||
2315 | if (!tcon->ipc) { | ||
2316 | CIFSSMBQFSDeviceInfo(xid, tcon); | ||
2317 | CIFSSMBQFSAttributeInfo(xid, tcon); | ||
2318 | } | ||
2319 | |||
2320 | /* tell server which Unix caps we support */ | ||
2321 | if (tcon->ses->capabilities & CAP_UNIX) | ||
2322 | /* reset of caps checks mount to see if unix extensions | ||
2323 | disabled for just this mount */ | ||
2324 | reset_cifs_unix_caps(xid, tcon, sb, &volume_info); | ||
2325 | else | 2339 | else |
2326 | tcon->unix_ext = 0; /* server does not support them */ | 2340 | cifs_put_tcp_session(srvTcp); |
2341 | goto out; | ||
2342 | } | ||
2343 | cifs_sb->tcon = tcon; | ||
2327 | 2344 | ||
2328 | /* convert forward to back slashes in prepath here if needed */ | 2345 | /* do not care if following two calls succeed - informational */ |
2329 | if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS) == 0) | 2346 | if (!tcon->ipc) { |
2330 | convert_delimiter(cifs_sb->prepath, | 2347 | CIFSSMBQFSDeviceInfo(xid, tcon); |
2331 | CIFS_DIR_SEP(cifs_sb)); | 2348 | CIFSSMBQFSAttributeInfo(xid, tcon); |
2349 | } | ||
2332 | 2350 | ||
2333 | if ((tcon->unix_ext == 0) && (cifs_sb->rsize > (1024 * 127))) { | 2351 | /* tell server which Unix caps we support */ |
2334 | cifs_sb->rsize = 1024 * 127; | 2352 | if (tcon->ses->capabilities & CAP_UNIX) |
2335 | cFYI(DBG2, | 2353 | /* reset of caps checks mount to see if unix extensions |
2336 | ("no very large read support, rsize now 127K")); | 2354 | disabled for just this mount */ |
2337 | } | 2355 | reset_cifs_unix_caps(xid, tcon, sb, &volume_info); |
2338 | if (!(tcon->ses->capabilities & CAP_LARGE_WRITE_X)) | 2356 | else |
2339 | cifs_sb->wsize = min(cifs_sb->wsize, | 2357 | tcon->unix_ext = 0; /* server does not support them */ |
2340 | (tcon->ses->server->maxBuf - | 2358 | |
2341 | MAX_CIFS_HDR_SIZE)); | 2359 | /* convert forward to back slashes in prepath here if needed */ |
2342 | if (!(tcon->ses->capabilities & CAP_LARGE_READ_X)) | 2360 | if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS) == 0) |
2343 | cifs_sb->rsize = min(cifs_sb->rsize, | 2361 | convert_delimiter(cifs_sb->prepath, CIFS_DIR_SEP(cifs_sb)); |
2344 | (tcon->ses->server->maxBuf - | 2362 | |
2345 | MAX_CIFS_HDR_SIZE)); | 2363 | if ((tcon->unix_ext == 0) && (cifs_sb->rsize > (1024 * 127))) { |
2364 | cifs_sb->rsize = 1024 * 127; | ||
2365 | cFYI(DBG2, ("no very large read support, rsize now 127K")); | ||
2346 | } | 2366 | } |
2367 | if (!(tcon->ses->capabilities & CAP_LARGE_WRITE_X)) | ||
2368 | cifs_sb->wsize = min(cifs_sb->wsize, | ||
2369 | (tcon->ses->server->maxBuf - MAX_CIFS_HDR_SIZE)); | ||
2370 | if (!(tcon->ses->capabilities & CAP_LARGE_READ_X)) | ||
2371 | cifs_sb->rsize = min(cifs_sb->rsize, | ||
2372 | (tcon->ses->server->maxBuf - MAX_CIFS_HDR_SIZE)); | ||
2347 | 2373 | ||
2348 | /* volume_info.password is freed above when existing session found | 2374 | /* volume_info.password is freed above when existing session found |
2349 | (in which case it is not needed anymore) but when new sesion is created | 2375 | (in which case it is not needed anymore) but when new sesion is created |
@@ -3513,6 +3539,7 @@ CIFSTCon(unsigned int xid, struct cifsSesInfo *ses, | |||
3513 | /* above now done in SendReceive */ | 3539 | /* above now done in SendReceive */ |
3514 | if ((rc == 0) && (tcon != NULL)) { | 3540 | if ((rc == 0) && (tcon != NULL)) { |
3515 | tcon->tidStatus = CifsGood; | 3541 | tcon->tidStatus = CifsGood; |
3542 | tcon->need_reconnect = false; | ||
3516 | tcon->tid = smb_buffer_response->Tid; | 3543 | tcon->tid = smb_buffer_response->Tid; |
3517 | bcc_ptr = pByteArea(smb_buffer_response); | 3544 | bcc_ptr = pByteArea(smb_buffer_response); |
3518 | length = strnlen(bcc_ptr, BCC(smb_buffer_response) - 2); | 3545 | length = strnlen(bcc_ptr, BCC(smb_buffer_response) - 2); |
@@ -3584,48 +3611,17 @@ int | |||
3584 | cifs_umount(struct super_block *sb, struct cifs_sb_info *cifs_sb) | 3611 | cifs_umount(struct super_block *sb, struct cifs_sb_info *cifs_sb) |
3585 | { | 3612 | { |
3586 | int rc = 0; | 3613 | int rc = 0; |
3587 | int xid; | ||
3588 | struct cifsSesInfo *ses = NULL; | ||
3589 | char *tmp; | 3614 | char *tmp; |
3590 | 3615 | ||
3591 | xid = GetXid(); | 3616 | if (cifs_sb->tcon) |
3592 | 3617 | cifs_put_tcon(cifs_sb->tcon); | |
3593 | if (cifs_sb->tcon) { | ||
3594 | ses = cifs_sb->tcon->ses; /* save ptr to ses before delete tcon!*/ | ||
3595 | rc = CIFSSMBTDis(xid, cifs_sb->tcon); | ||
3596 | if (rc == -EBUSY) { | ||
3597 | FreeXid(xid); | ||
3598 | return 0; | ||
3599 | } | ||
3600 | DeleteTconOplockQEntries(cifs_sb->tcon); | ||
3601 | tconInfoFree(cifs_sb->tcon); | ||
3602 | if ((ses) && (ses->server)) { | ||
3603 | /* save off task so we do not refer to ses later */ | ||
3604 | cFYI(1, ("About to do SMBLogoff ")); | ||
3605 | rc = CIFSSMBLogoff(xid, ses); | ||
3606 | if (rc == -EBUSY) { | ||
3607 | FreeXid(xid); | ||
3608 | return 0; | ||
3609 | } else if (rc == -ESHUTDOWN) { | ||
3610 | cFYI(1, ("Waking up socket by sending signal")); | ||
3611 | if (ses->server) | ||
3612 | kill_cifsd(ses->server); | ||
3613 | rc = 0; | ||
3614 | } /* else - we have an smb session | ||
3615 | left on this socket do not kill cifsd */ | ||
3616 | } else | ||
3617 | cFYI(1, ("No session or bad tcon")); | ||
3618 | } | ||
3619 | 3618 | ||
3620 | cifs_sb->tcon = NULL; | 3619 | cifs_sb->tcon = NULL; |
3621 | tmp = cifs_sb->prepath; | 3620 | tmp = cifs_sb->prepath; |
3622 | cifs_sb->prepathlen = 0; | 3621 | cifs_sb->prepathlen = 0; |
3623 | cifs_sb->prepath = NULL; | 3622 | cifs_sb->prepath = NULL; |
3624 | kfree(tmp); | 3623 | kfree(tmp); |
3625 | if (ses) | ||
3626 | sesInfoFree(ses); | ||
3627 | 3624 | ||
3628 | FreeXid(xid); | ||
3629 | return rc; | 3625 | return rc; |
3630 | } | 3626 | } |
3631 | 3627 | ||
@@ -3741,6 +3737,7 @@ int cifs_setup_session(unsigned int xid, struct cifsSesInfo *pSesInfo, | |||
3741 | cFYI(1, ("CIFS Session Established successfully")); | 3737 | cFYI(1, ("CIFS Session Established successfully")); |
3742 | spin_lock(&GlobalMid_Lock); | 3738 | spin_lock(&GlobalMid_Lock); |
3743 | pSesInfo->status = CifsGood; | 3739 | pSesInfo->status = CifsGood; |
3740 | pSesInfo->need_reconnect = false; | ||
3744 | spin_unlock(&GlobalMid_Lock); | 3741 | spin_unlock(&GlobalMid_Lock); |
3745 | } | 3742 | } |
3746 | 3743 | ||
diff --git a/fs/cifs/file.c b/fs/cifs/file.c index ead1a3bb0256..f0a81e631ae6 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c | |||
@@ -488,12 +488,13 @@ int cifs_close(struct inode *inode, struct file *file) | |||
488 | pTcon = cifs_sb->tcon; | 488 | pTcon = cifs_sb->tcon; |
489 | if (pSMBFile) { | 489 | if (pSMBFile) { |
490 | struct cifsLockInfo *li, *tmp; | 490 | struct cifsLockInfo *li, *tmp; |
491 | 491 | write_lock(&GlobalSMBSeslock); | |
492 | pSMBFile->closePend = true; | 492 | pSMBFile->closePend = true; |
493 | if (pTcon) { | 493 | if (pTcon) { |
494 | /* no sense reconnecting to close a file that is | 494 | /* no sense reconnecting to close a file that is |
495 | already closed */ | 495 | already closed */ |
496 | if (pTcon->tidStatus != CifsNeedReconnect) { | 496 | if (!pTcon->need_reconnect) { |
497 | write_unlock(&GlobalSMBSeslock); | ||
497 | timeout = 2; | 498 | timeout = 2; |
498 | while ((atomic_read(&pSMBFile->wrtPending) != 0) | 499 | while ((atomic_read(&pSMBFile->wrtPending) != 0) |
499 | && (timeout <= 2048)) { | 500 | && (timeout <= 2048)) { |
@@ -510,12 +511,15 @@ int cifs_close(struct inode *inode, struct file *file) | |||
510 | timeout *= 4; | 511 | timeout *= 4; |
511 | } | 512 | } |
512 | if (atomic_read(&pSMBFile->wrtPending)) | 513 | if (atomic_read(&pSMBFile->wrtPending)) |
513 | cERROR(1, | 514 | cERROR(1, ("close with pending write")); |
514 | ("close with pending writes")); | 515 | if (!pTcon->need_reconnect && |
515 | rc = CIFSSMBClose(xid, pTcon, | 516 | !pSMBFile->invalidHandle) |
517 | rc = CIFSSMBClose(xid, pTcon, | ||
516 | pSMBFile->netfid); | 518 | pSMBFile->netfid); |
517 | } | 519 | } else |
518 | } | 520 | write_unlock(&GlobalSMBSeslock); |
521 | } else | ||
522 | write_unlock(&GlobalSMBSeslock); | ||
519 | 523 | ||
520 | /* Delete any outstanding lock records. | 524 | /* Delete any outstanding lock records. |
521 | We'll lose them when the file is closed anyway. */ | 525 | We'll lose them when the file is closed anyway. */ |
@@ -587,15 +591,18 @@ int cifs_closedir(struct inode *inode, struct file *file) | |||
587 | pTcon = cifs_sb->tcon; | 591 | pTcon = cifs_sb->tcon; |
588 | 592 | ||
589 | cFYI(1, ("Freeing private data in close dir")); | 593 | cFYI(1, ("Freeing private data in close dir")); |
594 | write_lock(&GlobalSMBSeslock); | ||
590 | if (!pCFileStruct->srch_inf.endOfSearch && | 595 | if (!pCFileStruct->srch_inf.endOfSearch && |
591 | !pCFileStruct->invalidHandle) { | 596 | !pCFileStruct->invalidHandle) { |
592 | pCFileStruct->invalidHandle = true; | 597 | pCFileStruct->invalidHandle = true; |
598 | write_unlock(&GlobalSMBSeslock); | ||
593 | rc = CIFSFindClose(xid, pTcon, pCFileStruct->netfid); | 599 | rc = CIFSFindClose(xid, pTcon, pCFileStruct->netfid); |
594 | cFYI(1, ("Closing uncompleted readdir with rc %d", | 600 | cFYI(1, ("Closing uncompleted readdir with rc %d", |
595 | rc)); | 601 | rc)); |
596 | /* not much we can do if it fails anyway, ignore rc */ | 602 | /* not much we can do if it fails anyway, ignore rc */ |
597 | rc = 0; | 603 | rc = 0; |
598 | } | 604 | } else |
605 | write_unlock(&GlobalSMBSeslock); | ||
599 | ptmp = pCFileStruct->srch_inf.ntwrk_buf_start; | 606 | ptmp = pCFileStruct->srch_inf.ntwrk_buf_start; |
600 | if (ptmp) { | 607 | if (ptmp) { |
601 | cFYI(1, ("closedir free smb buf in srch struct")); | 608 | cFYI(1, ("closedir free smb buf in srch struct")); |
@@ -1404,7 +1411,10 @@ retry: | |||
1404 | if ((wbc->nr_to_write -= n_iov) <= 0) | 1411 | if ((wbc->nr_to_write -= n_iov) <= 0) |
1405 | done = 1; | 1412 | done = 1; |
1406 | index = next; | 1413 | index = next; |
1407 | } | 1414 | } else |
1415 | /* Need to re-find the pages we skipped */ | ||
1416 | index = pvec.pages[0]->index + 1; | ||
1417 | |||
1408 | pagevec_release(&pvec); | 1418 | pagevec_release(&pvec); |
1409 | } | 1419 | } |
1410 | if (!scanned && !done) { | 1420 | if (!scanned && !done) { |
@@ -1465,7 +1475,11 @@ static int cifs_write_end(struct file *file, struct address_space *mapping, | |||
1465 | cFYI(1, ("write_end for page %p from pos %lld with %d bytes", | 1475 | cFYI(1, ("write_end for page %p from pos %lld with %d bytes", |
1466 | page, pos, copied)); | 1476 | page, pos, copied)); |
1467 | 1477 | ||
1468 | if (!PageUptodate(page) && copied == PAGE_CACHE_SIZE) | 1478 | if (PageChecked(page)) { |
1479 | if (copied == len) | ||
1480 | SetPageUptodate(page); | ||
1481 | ClearPageChecked(page); | ||
1482 | } else if (!PageUptodate(page) && copied == PAGE_CACHE_SIZE) | ||
1469 | SetPageUptodate(page); | 1483 | SetPageUptodate(page); |
1470 | 1484 | ||
1471 | if (!PageUptodate(page)) { | 1485 | if (!PageUptodate(page)) { |
@@ -2052,39 +2066,70 @@ static int cifs_write_begin(struct file *file, struct address_space *mapping, | |||
2052 | { | 2066 | { |
2053 | pgoff_t index = pos >> PAGE_CACHE_SHIFT; | 2067 | pgoff_t index = pos >> PAGE_CACHE_SHIFT; |
2054 | loff_t offset = pos & (PAGE_CACHE_SIZE - 1); | 2068 | loff_t offset = pos & (PAGE_CACHE_SIZE - 1); |
2069 | loff_t page_start = pos & PAGE_MASK; | ||
2070 | loff_t i_size; | ||
2071 | struct page *page; | ||
2072 | int rc = 0; | ||
2055 | 2073 | ||
2056 | cFYI(1, ("write_begin from %lld len %d", (long long)pos, len)); | 2074 | cFYI(1, ("write_begin from %lld len %d", (long long)pos, len)); |
2057 | 2075 | ||
2058 | *pagep = __grab_cache_page(mapping, index); | 2076 | page = __grab_cache_page(mapping, index); |
2059 | if (!*pagep) | 2077 | if (!page) { |
2060 | return -ENOMEM; | 2078 | rc = -ENOMEM; |
2061 | 2079 | goto out; | |
2062 | if (PageUptodate(*pagep)) | 2080 | } |
2063 | return 0; | ||
2064 | 2081 | ||
2065 | /* If we are writing a full page it will be up to date, | 2082 | if (PageUptodate(page)) |
2066 | no need to read from the server */ | 2083 | goto out; |
2067 | if (len == PAGE_CACHE_SIZE && flags & AOP_FLAG_UNINTERRUPTIBLE) | ||
2068 | return 0; | ||
2069 | 2084 | ||
2070 | if ((file->f_flags & O_ACCMODE) != O_WRONLY) { | 2085 | /* |
2071 | int rc; | 2086 | * If we write a full page it will be up to date, no need to read from |
2087 | * the server. If the write is short, we'll end up doing a sync write | ||
2088 | * instead. | ||
2089 | */ | ||
2090 | if (len == PAGE_CACHE_SIZE) | ||
2091 | goto out; | ||
2072 | 2092 | ||
2073 | /* might as well read a page, it is fast enough */ | 2093 | /* |
2074 | rc = cifs_readpage_worker(file, *pagep, &offset); | 2094 | * optimize away the read when we have an oplock, and we're not |
2095 | * expecting to use any of the data we'd be reading in. That | ||
2096 | * is, when the page lies beyond the EOF, or straddles the EOF | ||
2097 | * and the write will cover all of the existing data. | ||
2098 | */ | ||
2099 | if (CIFS_I(mapping->host)->clientCanCacheRead) { | ||
2100 | i_size = i_size_read(mapping->host); | ||
2101 | if (page_start >= i_size || | ||
2102 | (offset == 0 && (pos + len) >= i_size)) { | ||
2103 | zero_user_segments(page, 0, offset, | ||
2104 | offset + len, | ||
2105 | PAGE_CACHE_SIZE); | ||
2106 | /* | ||
2107 | * PageChecked means that the parts of the page | ||
2108 | * to which we're not writing are considered up | ||
2109 | * to date. Once the data is copied to the | ||
2110 | * page, it can be set uptodate. | ||
2111 | */ | ||
2112 | SetPageChecked(page); | ||
2113 | goto out; | ||
2114 | } | ||
2115 | } | ||
2075 | 2116 | ||
2076 | /* we do not need to pass errors back | 2117 | if ((file->f_flags & O_ACCMODE) != O_WRONLY) { |
2077 | e.g. if we do not have read access to the file | 2118 | /* |
2078 | because cifs_write_end will attempt synchronous writes | 2119 | * might as well read a page, it is fast enough. If we get |
2079 | -- shaggy */ | 2120 | * an error, we don't need to return it. cifs_write_end will |
2121 | * do a sync write instead since PG_uptodate isn't set. | ||
2122 | */ | ||
2123 | cifs_readpage_worker(file, page, &page_start); | ||
2080 | } else { | 2124 | } else { |
2081 | /* we could try using another file handle if there is one - | 2125 | /* we could try using another file handle if there is one - |
2082 | but how would we lock it to prevent close of that handle | 2126 | but how would we lock it to prevent close of that handle |
2083 | racing with this read? In any case | 2127 | racing with this read? In any case |
2084 | this will be written out by write_end so is fine */ | 2128 | this will be written out by write_end so is fine */ |
2085 | } | 2129 | } |
2086 | 2130 | out: | |
2087 | return 0; | 2131 | *pagep = page; |
2132 | return rc; | ||
2088 | } | 2133 | } |
2089 | 2134 | ||
2090 | const struct address_space_operations cifs_addr_ops = { | 2135 | const struct address_space_operations cifs_addr_ops = { |
diff --git a/fs/cifs/misc.c b/fs/cifs/misc.c index 88786ba02d27..9ee3f689c2b0 100644 --- a/fs/cifs/misc.c +++ b/fs/cifs/misc.c | |||
@@ -75,12 +75,12 @@ sesInfoAlloc(void) | |||
75 | 75 | ||
76 | ret_buf = kzalloc(sizeof(struct cifsSesInfo), GFP_KERNEL); | 76 | ret_buf = kzalloc(sizeof(struct cifsSesInfo), GFP_KERNEL); |
77 | if (ret_buf) { | 77 | if (ret_buf) { |
78 | write_lock(&GlobalSMBSeslock); | ||
79 | atomic_inc(&sesInfoAllocCount); | 78 | atomic_inc(&sesInfoAllocCount); |
80 | ret_buf->status = CifsNew; | 79 | ret_buf->status = CifsNew; |
81 | list_add(&ret_buf->cifsSessionList, &GlobalSMBSessionList); | 80 | ++ret_buf->ses_count; |
81 | INIT_LIST_HEAD(&ret_buf->smb_ses_list); | ||
82 | INIT_LIST_HEAD(&ret_buf->tcon_list); | ||
82 | init_MUTEX(&ret_buf->sesSem); | 83 | init_MUTEX(&ret_buf->sesSem); |
83 | write_unlock(&GlobalSMBSeslock); | ||
84 | } | 84 | } |
85 | return ret_buf; | 85 | return ret_buf; |
86 | } | 86 | } |
@@ -93,10 +93,7 @@ sesInfoFree(struct cifsSesInfo *buf_to_free) | |||
93 | return; | 93 | return; |
94 | } | 94 | } |
95 | 95 | ||
96 | write_lock(&GlobalSMBSeslock); | ||
97 | atomic_dec(&sesInfoAllocCount); | 96 | atomic_dec(&sesInfoAllocCount); |
98 | list_del(&buf_to_free->cifsSessionList); | ||
99 | write_unlock(&GlobalSMBSeslock); | ||
100 | kfree(buf_to_free->serverOS); | 97 | kfree(buf_to_free->serverOS); |
101 | kfree(buf_to_free->serverDomain); | 98 | kfree(buf_to_free->serverDomain); |
102 | kfree(buf_to_free->serverNOS); | 99 | kfree(buf_to_free->serverNOS); |
@@ -111,17 +108,14 @@ tconInfoAlloc(void) | |||
111 | struct cifsTconInfo *ret_buf; | 108 | struct cifsTconInfo *ret_buf; |
112 | ret_buf = kzalloc(sizeof(struct cifsTconInfo), GFP_KERNEL); | 109 | ret_buf = kzalloc(sizeof(struct cifsTconInfo), GFP_KERNEL); |
113 | if (ret_buf) { | 110 | if (ret_buf) { |
114 | write_lock(&GlobalSMBSeslock); | ||
115 | atomic_inc(&tconInfoAllocCount); | 111 | atomic_inc(&tconInfoAllocCount); |
116 | list_add(&ret_buf->cifsConnectionList, | ||
117 | &GlobalTreeConnectionList); | ||
118 | ret_buf->tidStatus = CifsNew; | 112 | ret_buf->tidStatus = CifsNew; |
113 | ++ret_buf->tc_count; | ||
119 | INIT_LIST_HEAD(&ret_buf->openFileList); | 114 | INIT_LIST_HEAD(&ret_buf->openFileList); |
120 | init_MUTEX(&ret_buf->tconSem); | 115 | INIT_LIST_HEAD(&ret_buf->tcon_list); |
121 | #ifdef CONFIG_CIFS_STATS | 116 | #ifdef CONFIG_CIFS_STATS |
122 | spin_lock_init(&ret_buf->stat_lock); | 117 | spin_lock_init(&ret_buf->stat_lock); |
123 | #endif | 118 | #endif |
124 | write_unlock(&GlobalSMBSeslock); | ||
125 | } | 119 | } |
126 | return ret_buf; | 120 | return ret_buf; |
127 | } | 121 | } |
@@ -133,10 +127,7 @@ tconInfoFree(struct cifsTconInfo *buf_to_free) | |||
133 | cFYI(1, ("Null buffer passed to tconInfoFree")); | 127 | cFYI(1, ("Null buffer passed to tconInfoFree")); |
134 | return; | 128 | return; |
135 | } | 129 | } |
136 | write_lock(&GlobalSMBSeslock); | ||
137 | atomic_dec(&tconInfoAllocCount); | 130 | atomic_dec(&tconInfoAllocCount); |
138 | list_del(&buf_to_free->cifsConnectionList); | ||
139 | write_unlock(&GlobalSMBSeslock); | ||
140 | kfree(buf_to_free->nativeFileSystem); | 131 | kfree(buf_to_free->nativeFileSystem); |
141 | kfree(buf_to_free); | 132 | kfree(buf_to_free); |
142 | } | 133 | } |
@@ -350,9 +341,9 @@ header_assemble(struct smb_hdr *buffer, char smb_command /* command */ , | |||
350 | if (current->fsuid != treeCon->ses->linux_uid) { | 341 | if (current->fsuid != treeCon->ses->linux_uid) { |
351 | cFYI(1, ("Multiuser mode and UID " | 342 | cFYI(1, ("Multiuser mode and UID " |
352 | "did not match tcon uid")); | 343 | "did not match tcon uid")); |
353 | read_lock(&GlobalSMBSeslock); | 344 | read_lock(&cifs_tcp_ses_lock); |
354 | list_for_each(temp_item, &GlobalSMBSessionList) { | 345 | list_for_each(temp_item, &treeCon->ses->server->smb_ses_list) { |
355 | ses = list_entry(temp_item, struct cifsSesInfo, cifsSessionList); | 346 | ses = list_entry(temp_item, struct cifsSesInfo, smb_ses_list); |
356 | if (ses->linux_uid == current->fsuid) { | 347 | if (ses->linux_uid == current->fsuid) { |
357 | if (ses->server == treeCon->ses->server) { | 348 | if (ses->server == treeCon->ses->server) { |
358 | cFYI(1, ("found matching uid substitute right smb_uid")); | 349 | cFYI(1, ("found matching uid substitute right smb_uid")); |
@@ -364,7 +355,7 @@ header_assemble(struct smb_hdr *buffer, char smb_command /* command */ , | |||
364 | } | 355 | } |
365 | } | 356 | } |
366 | } | 357 | } |
367 | read_unlock(&GlobalSMBSeslock); | 358 | read_unlock(&cifs_tcp_ses_lock); |
368 | } | 359 | } |
369 | } | 360 | } |
370 | } | 361 | } |
@@ -497,9 +488,10 @@ bool | |||
497 | is_valid_oplock_break(struct smb_hdr *buf, struct TCP_Server_Info *srv) | 488 | is_valid_oplock_break(struct smb_hdr *buf, struct TCP_Server_Info *srv) |
498 | { | 489 | { |
499 | struct smb_com_lock_req *pSMB = (struct smb_com_lock_req *)buf; | 490 | struct smb_com_lock_req *pSMB = (struct smb_com_lock_req *)buf; |
500 | struct list_head *tmp; | 491 | struct list_head *tmp, *tmp1, *tmp2; |
501 | struct list_head *tmp1; | 492 | struct cifsSesInfo *ses; |
502 | struct cifsTconInfo *tcon; | 493 | struct cifsTconInfo *tcon; |
494 | struct cifsInodeInfo *pCifsInode; | ||
503 | struct cifsFileInfo *netfile; | 495 | struct cifsFileInfo *netfile; |
504 | 496 | ||
505 | cFYI(1, ("Checking for oplock break or dnotify response")); | 497 | cFYI(1, ("Checking for oplock break or dnotify response")); |
@@ -554,42 +546,45 @@ is_valid_oplock_break(struct smb_hdr *buf, struct TCP_Server_Info *srv) | |||
554 | return false; | 546 | return false; |
555 | 547 | ||
556 | /* look up tcon based on tid & uid */ | 548 | /* look up tcon based on tid & uid */ |
557 | read_lock(&GlobalSMBSeslock); | 549 | read_lock(&cifs_tcp_ses_lock); |
558 | list_for_each(tmp, &GlobalTreeConnectionList) { | 550 | list_for_each(tmp, &srv->smb_ses_list) { |
559 | tcon = list_entry(tmp, struct cifsTconInfo, cifsConnectionList); | 551 | ses = list_entry(tmp, struct cifsSesInfo, smb_ses_list); |
560 | if ((tcon->tid == buf->Tid) && (srv == tcon->ses->server)) { | 552 | list_for_each(tmp1, &ses->tcon_list) { |
553 | tcon = list_entry(tmp1, struct cifsTconInfo, tcon_list); | ||
554 | if (tcon->tid != buf->Tid) | ||
555 | continue; | ||
556 | |||
561 | cifs_stats_inc(&tcon->num_oplock_brks); | 557 | cifs_stats_inc(&tcon->num_oplock_brks); |
562 | list_for_each(tmp1, &tcon->openFileList) { | 558 | write_lock(&GlobalSMBSeslock); |
563 | netfile = list_entry(tmp1, struct cifsFileInfo, | 559 | list_for_each(tmp2, &tcon->openFileList) { |
560 | netfile = list_entry(tmp2, struct cifsFileInfo, | ||
564 | tlist); | 561 | tlist); |
565 | if (pSMB->Fid == netfile->netfid) { | 562 | if (pSMB->Fid != netfile->netfid) |
566 | struct cifsInodeInfo *pCifsInode; | 563 | continue; |
567 | read_unlock(&GlobalSMBSeslock); | 564 | |
568 | cFYI(1, | 565 | write_unlock(&GlobalSMBSeslock); |
569 | ("file id match, oplock break")); | 566 | read_unlock(&cifs_tcp_ses_lock); |
570 | pCifsInode = | 567 | cFYI(1, ("file id match, oplock break")); |
571 | CIFS_I(netfile->pInode); | 568 | pCifsInode = CIFS_I(netfile->pInode); |
572 | pCifsInode->clientCanCacheAll = false; | 569 | pCifsInode->clientCanCacheAll = false; |
573 | if (pSMB->OplockLevel == 0) | 570 | if (pSMB->OplockLevel == 0) |
574 | pCifsInode->clientCanCacheRead | 571 | pCifsInode->clientCanCacheRead = false; |
575 | = false; | 572 | pCifsInode->oplockPending = true; |
576 | pCifsInode->oplockPending = true; | 573 | AllocOplockQEntry(netfile->pInode, |
577 | AllocOplockQEntry(netfile->pInode, | 574 | netfile->netfid, tcon); |
578 | netfile->netfid, | 575 | cFYI(1, ("about to wake up oplock thread")); |
579 | tcon); | 576 | if (oplockThread) |
580 | cFYI(1, | 577 | wake_up_process(oplockThread); |
581 | ("about to wake up oplock thread")); | 578 | |
582 | if (oplockThread) | 579 | return true; |
583 | wake_up_process(oplockThread); | ||
584 | return true; | ||
585 | } | ||
586 | } | 580 | } |
587 | read_unlock(&GlobalSMBSeslock); | 581 | write_unlock(&GlobalSMBSeslock); |
582 | read_unlock(&cifs_tcp_ses_lock); | ||
588 | cFYI(1, ("No matching file for oplock break")); | 583 | cFYI(1, ("No matching file for oplock break")); |
589 | return true; | 584 | return true; |
590 | } | 585 | } |
591 | } | 586 | } |
592 | read_unlock(&GlobalSMBSeslock); | 587 | read_unlock(&cifs_tcp_ses_lock); |
593 | cFYI(1, ("Can not process oplock break for non-existent connection")); | 588 | cFYI(1, ("Can not process oplock break for non-existent connection")); |
594 | return true; | 589 | return true; |
595 | } | 590 | } |
diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c index 58d57299f2a0..9f51f9bf0292 100644 --- a/fs/cifs/readdir.c +++ b/fs/cifs/readdir.c | |||
@@ -741,11 +741,14 @@ static int find_cifs_entry(const int xid, struct cifsTconInfo *pTcon, | |||
741 | (index_to_find < first_entry_in_buffer)) { | 741 | (index_to_find < first_entry_in_buffer)) { |
742 | /* close and restart search */ | 742 | /* close and restart search */ |
743 | cFYI(1, ("search backing up - close and restart search")); | 743 | cFYI(1, ("search backing up - close and restart search")); |
744 | write_lock(&GlobalSMBSeslock); | ||
744 | if (!cifsFile->srch_inf.endOfSearch && | 745 | if (!cifsFile->srch_inf.endOfSearch && |
745 | !cifsFile->invalidHandle) { | 746 | !cifsFile->invalidHandle) { |
746 | cifsFile->invalidHandle = true; | 747 | cifsFile->invalidHandle = true; |
748 | write_unlock(&GlobalSMBSeslock); | ||
747 | CIFSFindClose(xid, pTcon, cifsFile->netfid); | 749 | CIFSFindClose(xid, pTcon, cifsFile->netfid); |
748 | } | 750 | } else |
751 | write_unlock(&GlobalSMBSeslock); | ||
749 | if (cifsFile->srch_inf.ntwrk_buf_start) { | 752 | if (cifsFile->srch_inf.ntwrk_buf_start) { |
750 | cFYI(1, ("freeing SMB ff cache buf on search rewind")); | 753 | cFYI(1, ("freeing SMB ff cache buf on search rewind")); |
751 | if (cifsFile->srch_inf.smallBuf) | 754 | if (cifsFile->srch_inf.smallBuf) |
diff --git a/fs/dlm/lockspace.c b/fs/dlm/lockspace.c index d910501de6d2..8d86b7960f0d 100644 --- a/fs/dlm/lockspace.c +++ b/fs/dlm/lockspace.c | |||
@@ -812,7 +812,7 @@ int dlm_release_lockspace(void *lockspace, int force) | |||
812 | error = release_lockspace(ls, force); | 812 | error = release_lockspace(ls, force); |
813 | if (!error) | 813 | if (!error) |
814 | ls_count--; | 814 | ls_count--; |
815 | else if (!ls_count) | 815 | if (!ls_count) |
816 | threads_stop(); | 816 | threads_stop(); |
817 | mutex_unlock(&ls_lock); | 817 | mutex_unlock(&ls_lock); |
818 | 818 | ||
diff --git a/fs/ecryptfs/keystore.c b/fs/ecryptfs/keystore.c index e22bc3961345..0d713b691941 100644 --- a/fs/ecryptfs/keystore.c +++ b/fs/ecryptfs/keystore.c | |||
@@ -1037,17 +1037,14 @@ static int | |||
1037 | decrypt_passphrase_encrypted_session_key(struct ecryptfs_auth_tok *auth_tok, | 1037 | decrypt_passphrase_encrypted_session_key(struct ecryptfs_auth_tok *auth_tok, |
1038 | struct ecryptfs_crypt_stat *crypt_stat) | 1038 | struct ecryptfs_crypt_stat *crypt_stat) |
1039 | { | 1039 | { |
1040 | struct scatterlist dst_sg; | 1040 | struct scatterlist dst_sg[2]; |
1041 | struct scatterlist src_sg; | 1041 | struct scatterlist src_sg[2]; |
1042 | struct mutex *tfm_mutex; | 1042 | struct mutex *tfm_mutex; |
1043 | struct blkcipher_desc desc = { | 1043 | struct blkcipher_desc desc = { |
1044 | .flags = CRYPTO_TFM_REQ_MAY_SLEEP | 1044 | .flags = CRYPTO_TFM_REQ_MAY_SLEEP |
1045 | }; | 1045 | }; |
1046 | int rc = 0; | 1046 | int rc = 0; |
1047 | 1047 | ||
1048 | sg_init_table(&dst_sg, 1); | ||
1049 | sg_init_table(&src_sg, 1); | ||
1050 | |||
1051 | if (unlikely(ecryptfs_verbosity > 0)) { | 1048 | if (unlikely(ecryptfs_verbosity > 0)) { |
1052 | ecryptfs_printk( | 1049 | ecryptfs_printk( |
1053 | KERN_DEBUG, "Session key encryption key (size [%d]):\n", | 1050 | KERN_DEBUG, "Session key encryption key (size [%d]):\n", |
@@ -1066,8 +1063,8 @@ decrypt_passphrase_encrypted_session_key(struct ecryptfs_auth_tok *auth_tok, | |||
1066 | } | 1063 | } |
1067 | rc = virt_to_scatterlist(auth_tok->session_key.encrypted_key, | 1064 | rc = virt_to_scatterlist(auth_tok->session_key.encrypted_key, |
1068 | auth_tok->session_key.encrypted_key_size, | 1065 | auth_tok->session_key.encrypted_key_size, |
1069 | &src_sg, 1); | 1066 | src_sg, 2); |
1070 | if (rc != 1) { | 1067 | if (rc < 1 || rc > 2) { |
1071 | printk(KERN_ERR "Internal error whilst attempting to convert " | 1068 | printk(KERN_ERR "Internal error whilst attempting to convert " |
1072 | "auth_tok->session_key.encrypted_key to scatterlist; " | 1069 | "auth_tok->session_key.encrypted_key to scatterlist; " |
1073 | "expected rc = 1; got rc = [%d]. " | 1070 | "expected rc = 1; got rc = [%d]. " |
@@ -1079,8 +1076,8 @@ decrypt_passphrase_encrypted_session_key(struct ecryptfs_auth_tok *auth_tok, | |||
1079 | auth_tok->session_key.encrypted_key_size; | 1076 | auth_tok->session_key.encrypted_key_size; |
1080 | rc = virt_to_scatterlist(auth_tok->session_key.decrypted_key, | 1077 | rc = virt_to_scatterlist(auth_tok->session_key.decrypted_key, |
1081 | auth_tok->session_key.decrypted_key_size, | 1078 | auth_tok->session_key.decrypted_key_size, |
1082 | &dst_sg, 1); | 1079 | dst_sg, 2); |
1083 | if (rc != 1) { | 1080 | if (rc < 1 || rc > 2) { |
1084 | printk(KERN_ERR "Internal error whilst attempting to convert " | 1081 | printk(KERN_ERR "Internal error whilst attempting to convert " |
1085 | "auth_tok->session_key.decrypted_key to scatterlist; " | 1082 | "auth_tok->session_key.decrypted_key to scatterlist; " |
1086 | "expected rc = 1; got rc = [%d]\n", rc); | 1083 | "expected rc = 1; got rc = [%d]\n", rc); |
@@ -1096,7 +1093,7 @@ decrypt_passphrase_encrypted_session_key(struct ecryptfs_auth_tok *auth_tok, | |||
1096 | rc = -EINVAL; | 1093 | rc = -EINVAL; |
1097 | goto out; | 1094 | goto out; |
1098 | } | 1095 | } |
1099 | rc = crypto_blkcipher_decrypt(&desc, &dst_sg, &src_sg, | 1096 | rc = crypto_blkcipher_decrypt(&desc, dst_sg, src_sg, |
1100 | auth_tok->session_key.encrypted_key_size); | 1097 | auth_tok->session_key.encrypted_key_size); |
1101 | mutex_unlock(tfm_mutex); | 1098 | mutex_unlock(tfm_mutex); |
1102 | if (unlikely(rc)) { | 1099 | if (unlikely(rc)) { |
@@ -1539,8 +1536,8 @@ write_tag_3_packet(char *dest, size_t *remaining_bytes, | |||
1539 | size_t i; | 1536 | size_t i; |
1540 | size_t encrypted_session_key_valid = 0; | 1537 | size_t encrypted_session_key_valid = 0; |
1541 | char session_key_encryption_key[ECRYPTFS_MAX_KEY_BYTES]; | 1538 | char session_key_encryption_key[ECRYPTFS_MAX_KEY_BYTES]; |
1542 | struct scatterlist dst_sg; | 1539 | struct scatterlist dst_sg[2]; |
1543 | struct scatterlist src_sg; | 1540 | struct scatterlist src_sg[2]; |
1544 | struct mutex *tfm_mutex = NULL; | 1541 | struct mutex *tfm_mutex = NULL; |
1545 | u8 cipher_code; | 1542 | u8 cipher_code; |
1546 | size_t packet_size_length; | 1543 | size_t packet_size_length; |
@@ -1619,8 +1616,8 @@ write_tag_3_packet(char *dest, size_t *remaining_bytes, | |||
1619 | ecryptfs_dump_hex(session_key_encryption_key, 16); | 1616 | ecryptfs_dump_hex(session_key_encryption_key, 16); |
1620 | } | 1617 | } |
1621 | rc = virt_to_scatterlist(crypt_stat->key, key_rec->enc_key_size, | 1618 | rc = virt_to_scatterlist(crypt_stat->key, key_rec->enc_key_size, |
1622 | &src_sg, 1); | 1619 | src_sg, 2); |
1623 | if (rc != 1) { | 1620 | if (rc < 1 || rc > 2) { |
1624 | ecryptfs_printk(KERN_ERR, "Error generating scatterlist " | 1621 | ecryptfs_printk(KERN_ERR, "Error generating scatterlist " |
1625 | "for crypt_stat session key; expected rc = 1; " | 1622 | "for crypt_stat session key; expected rc = 1; " |
1626 | "got rc = [%d]. key_rec->enc_key_size = [%d]\n", | 1623 | "got rc = [%d]. key_rec->enc_key_size = [%d]\n", |
@@ -1629,8 +1626,8 @@ write_tag_3_packet(char *dest, size_t *remaining_bytes, | |||
1629 | goto out; | 1626 | goto out; |
1630 | } | 1627 | } |
1631 | rc = virt_to_scatterlist(key_rec->enc_key, key_rec->enc_key_size, | 1628 | rc = virt_to_scatterlist(key_rec->enc_key, key_rec->enc_key_size, |
1632 | &dst_sg, 1); | 1629 | dst_sg, 2); |
1633 | if (rc != 1) { | 1630 | if (rc < 1 || rc > 2) { |
1634 | ecryptfs_printk(KERN_ERR, "Error generating scatterlist " | 1631 | ecryptfs_printk(KERN_ERR, "Error generating scatterlist " |
1635 | "for crypt_stat encrypted session key; " | 1632 | "for crypt_stat encrypted session key; " |
1636 | "expected rc = 1; got rc = [%d]. " | 1633 | "expected rc = 1; got rc = [%d]. " |
@@ -1651,7 +1648,7 @@ write_tag_3_packet(char *dest, size_t *remaining_bytes, | |||
1651 | rc = 0; | 1648 | rc = 0; |
1652 | ecryptfs_printk(KERN_DEBUG, "Encrypting [%d] bytes of the key\n", | 1649 | ecryptfs_printk(KERN_DEBUG, "Encrypting [%d] bytes of the key\n", |
1653 | crypt_stat->key_size); | 1650 | crypt_stat->key_size); |
1654 | rc = crypto_blkcipher_encrypt(&desc, &dst_sg, &src_sg, | 1651 | rc = crypto_blkcipher_encrypt(&desc, dst_sg, src_sg, |
1655 | (*key_rec).enc_key_size); | 1652 | (*key_rec).enc_key_size); |
1656 | mutex_unlock(tfm_mutex); | 1653 | mutex_unlock(tfm_mutex); |
1657 | if (rc) { | 1654 | if (rc) { |
diff --git a/fs/eventpoll.c b/fs/eventpoll.c index aec5c13f6341..96355d505347 100644 --- a/fs/eventpoll.c +++ b/fs/eventpoll.c | |||
@@ -102,6 +102,8 @@ | |||
102 | 102 | ||
103 | #define EP_UNACTIVE_PTR ((void *) -1L) | 103 | #define EP_UNACTIVE_PTR ((void *) -1L) |
104 | 104 | ||
105 | #define EP_ITEM_COST (sizeof(struct epitem) + sizeof(struct eppoll_entry)) | ||
106 | |||
105 | struct epoll_filefd { | 107 | struct epoll_filefd { |
106 | struct file *file; | 108 | struct file *file; |
107 | int fd; | 109 | int fd; |
@@ -200,6 +202,9 @@ struct eventpoll { | |||
200 | * holding ->lock. | 202 | * holding ->lock. |
201 | */ | 203 | */ |
202 | struct epitem *ovflist; | 204 | struct epitem *ovflist; |
205 | |||
206 | /* The user that created the eventpoll descriptor */ | ||
207 | struct user_struct *user; | ||
203 | }; | 208 | }; |
204 | 209 | ||
205 | /* Wait structure used by the poll hooks */ | 210 | /* Wait structure used by the poll hooks */ |
@@ -227,9 +232,17 @@ struct ep_pqueue { | |||
227 | }; | 232 | }; |
228 | 233 | ||
229 | /* | 234 | /* |
235 | * Configuration options available inside /proc/sys/fs/epoll/ | ||
236 | */ | ||
237 | /* Maximum number of epoll devices, per user */ | ||
238 | static int max_user_instances __read_mostly; | ||
239 | /* Maximum number of epoll watched descriptors, per user */ | ||
240 | static int max_user_watches __read_mostly; | ||
241 | |||
242 | /* | ||
230 | * This mutex is used to serialize ep_free() and eventpoll_release_file(). | 243 | * This mutex is used to serialize ep_free() and eventpoll_release_file(). |
231 | */ | 244 | */ |
232 | static struct mutex epmutex; | 245 | static DEFINE_MUTEX(epmutex); |
233 | 246 | ||
234 | /* Safe wake up implementation */ | 247 | /* Safe wake up implementation */ |
235 | static struct poll_safewake psw; | 248 | static struct poll_safewake psw; |
@@ -240,6 +253,33 @@ static struct kmem_cache *epi_cache __read_mostly; | |||
240 | /* Slab cache used to allocate "struct eppoll_entry" */ | 253 | /* Slab cache used to allocate "struct eppoll_entry" */ |
241 | static struct kmem_cache *pwq_cache __read_mostly; | 254 | static struct kmem_cache *pwq_cache __read_mostly; |
242 | 255 | ||
256 | #ifdef CONFIG_SYSCTL | ||
257 | |||
258 | #include <linux/sysctl.h> | ||
259 | |||
260 | static int zero; | ||
261 | |||
262 | ctl_table epoll_table[] = { | ||
263 | { | ||
264 | .procname = "max_user_instances", | ||
265 | .data = &max_user_instances, | ||
266 | .maxlen = sizeof(int), | ||
267 | .mode = 0644, | ||
268 | .proc_handler = &proc_dointvec_minmax, | ||
269 | .extra1 = &zero, | ||
270 | }, | ||
271 | { | ||
272 | .procname = "max_user_watches", | ||
273 | .data = &max_user_watches, | ||
274 | .maxlen = sizeof(int), | ||
275 | .mode = 0644, | ||
276 | .proc_handler = &proc_dointvec_minmax, | ||
277 | .extra1 = &zero, | ||
278 | }, | ||
279 | { .ctl_name = 0 } | ||
280 | }; | ||
281 | #endif /* CONFIG_SYSCTL */ | ||
282 | |||
243 | 283 | ||
244 | /* Setup the structure that is used as key for the RB tree */ | 284 | /* Setup the structure that is used as key for the RB tree */ |
245 | static inline void ep_set_ffd(struct epoll_filefd *ffd, | 285 | static inline void ep_set_ffd(struct epoll_filefd *ffd, |
@@ -402,6 +442,8 @@ static int ep_remove(struct eventpoll *ep, struct epitem *epi) | |||
402 | /* At this point it is safe to free the eventpoll item */ | 442 | /* At this point it is safe to free the eventpoll item */ |
403 | kmem_cache_free(epi_cache, epi); | 443 | kmem_cache_free(epi_cache, epi); |
404 | 444 | ||
445 | atomic_dec(&ep->user->epoll_watches); | ||
446 | |||
405 | DNPRINTK(3, (KERN_INFO "[%p] eventpoll: ep_remove(%p, %p)\n", | 447 | DNPRINTK(3, (KERN_INFO "[%p] eventpoll: ep_remove(%p, %p)\n", |
406 | current, ep, file)); | 448 | current, ep, file)); |
407 | 449 | ||
@@ -449,6 +491,8 @@ static void ep_free(struct eventpoll *ep) | |||
449 | 491 | ||
450 | mutex_unlock(&epmutex); | 492 | mutex_unlock(&epmutex); |
451 | mutex_destroy(&ep->mtx); | 493 | mutex_destroy(&ep->mtx); |
494 | atomic_dec(&ep->user->epoll_devs); | ||
495 | free_uid(ep->user); | ||
452 | kfree(ep); | 496 | kfree(ep); |
453 | } | 497 | } |
454 | 498 | ||
@@ -532,10 +576,19 @@ void eventpoll_release_file(struct file *file) | |||
532 | 576 | ||
533 | static int ep_alloc(struct eventpoll **pep) | 577 | static int ep_alloc(struct eventpoll **pep) |
534 | { | 578 | { |
535 | struct eventpoll *ep = kzalloc(sizeof(*ep), GFP_KERNEL); | 579 | int error; |
580 | struct user_struct *user; | ||
581 | struct eventpoll *ep; | ||
536 | 582 | ||
537 | if (!ep) | 583 | user = get_current_user(); |
538 | return -ENOMEM; | 584 | error = -EMFILE; |
585 | if (unlikely(atomic_read(&user->epoll_devs) >= | ||
586 | max_user_instances)) | ||
587 | goto free_uid; | ||
588 | error = -ENOMEM; | ||
589 | ep = kzalloc(sizeof(*ep), GFP_KERNEL); | ||
590 | if (unlikely(!ep)) | ||
591 | goto free_uid; | ||
539 | 592 | ||
540 | spin_lock_init(&ep->lock); | 593 | spin_lock_init(&ep->lock); |
541 | mutex_init(&ep->mtx); | 594 | mutex_init(&ep->mtx); |
@@ -544,12 +597,17 @@ static int ep_alloc(struct eventpoll **pep) | |||
544 | INIT_LIST_HEAD(&ep->rdllist); | 597 | INIT_LIST_HEAD(&ep->rdllist); |
545 | ep->rbr = RB_ROOT; | 598 | ep->rbr = RB_ROOT; |
546 | ep->ovflist = EP_UNACTIVE_PTR; | 599 | ep->ovflist = EP_UNACTIVE_PTR; |
600 | ep->user = user; | ||
547 | 601 | ||
548 | *pep = ep; | 602 | *pep = ep; |
549 | 603 | ||
550 | DNPRINTK(3, (KERN_INFO "[%p] eventpoll: ep_alloc() ep=%p\n", | 604 | DNPRINTK(3, (KERN_INFO "[%p] eventpoll: ep_alloc() ep=%p\n", |
551 | current, ep)); | 605 | current, ep)); |
552 | return 0; | 606 | return 0; |
607 | |||
608 | free_uid: | ||
609 | free_uid(user); | ||
610 | return error; | ||
553 | } | 611 | } |
554 | 612 | ||
555 | /* | 613 | /* |
@@ -703,9 +761,11 @@ static int ep_insert(struct eventpoll *ep, struct epoll_event *event, | |||
703 | struct epitem *epi; | 761 | struct epitem *epi; |
704 | struct ep_pqueue epq; | 762 | struct ep_pqueue epq; |
705 | 763 | ||
706 | error = -ENOMEM; | 764 | if (unlikely(atomic_read(&ep->user->epoll_watches) >= |
765 | max_user_watches)) | ||
766 | return -ENOSPC; | ||
707 | if (!(epi = kmem_cache_alloc(epi_cache, GFP_KERNEL))) | 767 | if (!(epi = kmem_cache_alloc(epi_cache, GFP_KERNEL))) |
708 | goto error_return; | 768 | return -ENOMEM; |
709 | 769 | ||
710 | /* Item initialization follow here ... */ | 770 | /* Item initialization follow here ... */ |
711 | INIT_LIST_HEAD(&epi->rdllink); | 771 | INIT_LIST_HEAD(&epi->rdllink); |
@@ -735,6 +795,7 @@ static int ep_insert(struct eventpoll *ep, struct epoll_event *event, | |||
735 | * install process. Namely an allocation for a wait queue failed due | 795 | * install process. Namely an allocation for a wait queue failed due |
736 | * high memory pressure. | 796 | * high memory pressure. |
737 | */ | 797 | */ |
798 | error = -ENOMEM; | ||
738 | if (epi->nwait < 0) | 799 | if (epi->nwait < 0) |
739 | goto error_unregister; | 800 | goto error_unregister; |
740 | 801 | ||
@@ -765,6 +826,8 @@ static int ep_insert(struct eventpoll *ep, struct epoll_event *event, | |||
765 | 826 | ||
766 | spin_unlock_irqrestore(&ep->lock, flags); | 827 | spin_unlock_irqrestore(&ep->lock, flags); |
767 | 828 | ||
829 | atomic_inc(&ep->user->epoll_watches); | ||
830 | |||
768 | /* We have to call this outside the lock */ | 831 | /* We have to call this outside the lock */ |
769 | if (pwake) | 832 | if (pwake) |
770 | ep_poll_safewake(&psw, &ep->poll_wait); | 833 | ep_poll_safewake(&psw, &ep->poll_wait); |
@@ -789,7 +852,7 @@ error_unregister: | |||
789 | spin_unlock_irqrestore(&ep->lock, flags); | 852 | spin_unlock_irqrestore(&ep->lock, flags); |
790 | 853 | ||
791 | kmem_cache_free(epi_cache, epi); | 854 | kmem_cache_free(epi_cache, epi); |
792 | error_return: | 855 | |
793 | return error; | 856 | return error; |
794 | } | 857 | } |
795 | 858 | ||
@@ -1078,6 +1141,7 @@ asmlinkage long sys_epoll_create1(int flags) | |||
1078 | flags & O_CLOEXEC); | 1141 | flags & O_CLOEXEC); |
1079 | if (fd < 0) | 1142 | if (fd < 0) |
1080 | ep_free(ep); | 1143 | ep_free(ep); |
1144 | atomic_inc(&ep->user->epoll_devs); | ||
1081 | 1145 | ||
1082 | error_return: | 1146 | error_return: |
1083 | DNPRINTK(3, (KERN_INFO "[%p] eventpoll: sys_epoll_create(%d) = %d\n", | 1147 | DNPRINTK(3, (KERN_INFO "[%p] eventpoll: sys_epoll_create(%d) = %d\n", |
@@ -1299,7 +1363,12 @@ asmlinkage long sys_epoll_pwait(int epfd, struct epoll_event __user *events, | |||
1299 | 1363 | ||
1300 | static int __init eventpoll_init(void) | 1364 | static int __init eventpoll_init(void) |
1301 | { | 1365 | { |
1302 | mutex_init(&epmutex); | 1366 | struct sysinfo si; |
1367 | |||
1368 | si_meminfo(&si); | ||
1369 | max_user_instances = 128; | ||
1370 | max_user_watches = (((si.totalram - si.totalhigh) / 32) << PAGE_SHIFT) / | ||
1371 | EP_ITEM_COST; | ||
1303 | 1372 | ||
1304 | /* Initialize the structure used to perform safe poll wait head wake ups */ | 1373 | /* Initialize the structure used to perform safe poll wait head wake ups */ |
1305 | ep_poll_safewake_init(&psw); | 1374 | ep_poll_safewake_init(&psw); |
diff --git a/fs/ext3/super.c b/fs/ext3/super.c index 5dec6d1356c4..f6c94f232ec1 100644 --- a/fs/ext3/super.c +++ b/fs/ext3/super.c | |||
@@ -2375,12 +2375,9 @@ int ext3_force_commit(struct super_block *sb) | |||
2375 | /* | 2375 | /* |
2376 | * Ext3 always journals updates to the superblock itself, so we don't | 2376 | * Ext3 always journals updates to the superblock itself, so we don't |
2377 | * have to propagate any other updates to the superblock on disk at this | 2377 | * have to propagate any other updates to the superblock on disk at this |
2378 | * point. Just start an async writeback to get the buffers on their way | 2378 | * point. (We can probably nuke this function altogether, and remove |
2379 | * to the disk. | 2379 | * any mention to sb->s_dirt in all of fs/ext3; eventual cleanup...) |
2380 | * | ||
2381 | * This implicitly triggers the writebehind on sync(). | ||
2382 | */ | 2380 | */ |
2383 | |||
2384 | static void ext3_write_super (struct super_block * sb) | 2381 | static void ext3_write_super (struct super_block * sb) |
2385 | { | 2382 | { |
2386 | if (mutex_trylock(&sb->s_lock) != 0) | 2383 | if (mutex_trylock(&sb->s_lock) != 0) |
diff --git a/fs/hostfs/hostfs.h b/fs/hostfs/hostfs.h index 6ae9011b95eb..2f34f8f2134b 100644 --- a/fs/hostfs/hostfs.h +++ b/fs/hostfs/hostfs.h | |||
@@ -81,7 +81,7 @@ extern int do_rmdir(const char *file); | |||
81 | extern int do_mknod(const char *file, int mode, unsigned int major, | 81 | extern int do_mknod(const char *file, int mode, unsigned int major, |
82 | unsigned int minor); | 82 | unsigned int minor); |
83 | extern int link_file(const char *from, const char *to); | 83 | extern int link_file(const char *from, const char *to); |
84 | extern int do_readlink(char *file, char *buf, int size); | 84 | extern int hostfs_do_readlink(char *file, char *buf, int size); |
85 | extern int rename_file(char *from, char *to); | 85 | extern int rename_file(char *from, char *to); |
86 | extern int do_statfs(char *root, long *bsize_out, long long *blocks_out, | 86 | extern int do_statfs(char *root, long *bsize_out, long long *blocks_out, |
87 | long long *bfree_out, long long *bavail_out, | 87 | long long *bfree_out, long long *bavail_out, |
diff --git a/fs/hostfs/hostfs_kern.c b/fs/hostfs/hostfs_kern.c index 7f34f4385de0..3a31451ac170 100644 --- a/fs/hostfs/hostfs_kern.c +++ b/fs/hostfs/hostfs_kern.c | |||
@@ -168,7 +168,7 @@ static char *follow_link(char *link) | |||
168 | if (name == NULL) | 168 | if (name == NULL) |
169 | goto out; | 169 | goto out; |
170 | 170 | ||
171 | n = do_readlink(link, name, len); | 171 | n = hostfs_do_readlink(link, name, len); |
172 | if (n < len) | 172 | if (n < len) |
173 | break; | 173 | break; |
174 | len *= 2; | 174 | len *= 2; |
@@ -943,7 +943,7 @@ int hostfs_link_readpage(struct file *file, struct page *page) | |||
943 | name = inode_name(page->mapping->host, 0); | 943 | name = inode_name(page->mapping->host, 0); |
944 | if (name == NULL) | 944 | if (name == NULL) |
945 | return -ENOMEM; | 945 | return -ENOMEM; |
946 | err = do_readlink(name, buffer, PAGE_CACHE_SIZE); | 946 | err = hostfs_do_readlink(name, buffer, PAGE_CACHE_SIZE); |
947 | kfree(name); | 947 | kfree(name); |
948 | if (err == PAGE_CACHE_SIZE) | 948 | if (err == PAGE_CACHE_SIZE) |
949 | err = -E2BIG; | 949 | err = -E2BIG; |
diff --git a/fs/hostfs/hostfs_user.c b/fs/hostfs/hostfs_user.c index 53fd0a67c11a..b79424f93282 100644 --- a/fs/hostfs/hostfs_user.c +++ b/fs/hostfs/hostfs_user.c | |||
@@ -377,7 +377,7 @@ int link_file(const char *to, const char *from) | |||
377 | return 0; | 377 | return 0; |
378 | } | 378 | } |
379 | 379 | ||
380 | int do_readlink(char *file, char *buf, int size) | 380 | int hostfs_do_readlink(char *file, char *buf, int size) |
381 | { | 381 | { |
382 | int n; | 382 | int n; |
383 | 383 | ||
diff --git a/fs/inotify.c b/fs/inotify.c index 690e72595e6e..7bbed1b89825 100644 --- a/fs/inotify.c +++ b/fs/inotify.c | |||
@@ -106,6 +106,20 @@ void get_inotify_watch(struct inotify_watch *watch) | |||
106 | } | 106 | } |
107 | EXPORT_SYMBOL_GPL(get_inotify_watch); | 107 | EXPORT_SYMBOL_GPL(get_inotify_watch); |
108 | 108 | ||
109 | int pin_inotify_watch(struct inotify_watch *watch) | ||
110 | { | ||
111 | struct super_block *sb = watch->inode->i_sb; | ||
112 | spin_lock(&sb_lock); | ||
113 | if (sb->s_count >= S_BIAS) { | ||
114 | atomic_inc(&sb->s_active); | ||
115 | spin_unlock(&sb_lock); | ||
116 | atomic_inc(&watch->count); | ||
117 | return 1; | ||
118 | } | ||
119 | spin_unlock(&sb_lock); | ||
120 | return 0; | ||
121 | } | ||
122 | |||
109 | /** | 123 | /** |
110 | * put_inotify_watch - decrements the ref count on a given watch. cleans up | 124 | * put_inotify_watch - decrements the ref count on a given watch. cleans up |
111 | * watch references if the count reaches zero. inotify_watch is freed by | 125 | * watch references if the count reaches zero. inotify_watch is freed by |
@@ -124,6 +138,13 @@ void put_inotify_watch(struct inotify_watch *watch) | |||
124 | } | 138 | } |
125 | EXPORT_SYMBOL_GPL(put_inotify_watch); | 139 | EXPORT_SYMBOL_GPL(put_inotify_watch); |
126 | 140 | ||
141 | void unpin_inotify_watch(struct inotify_watch *watch) | ||
142 | { | ||
143 | struct super_block *sb = watch->inode->i_sb; | ||
144 | put_inotify_watch(watch); | ||
145 | deactivate_super(sb); | ||
146 | } | ||
147 | |||
127 | /* | 148 | /* |
128 | * inotify_handle_get_wd - returns the next WD for use by the given handle | 149 | * inotify_handle_get_wd - returns the next WD for use by the given handle |
129 | * | 150 | * |
@@ -479,6 +500,112 @@ void inotify_init_watch(struct inotify_watch *watch) | |||
479 | } | 500 | } |
480 | EXPORT_SYMBOL_GPL(inotify_init_watch); | 501 | EXPORT_SYMBOL_GPL(inotify_init_watch); |
481 | 502 | ||
503 | /* | ||
504 | * Watch removals suck violently. To kick the watch out we need (in this | ||
505 | * order) inode->inotify_mutex and ih->mutex. That's fine if we have | ||
506 | * a hold on inode; however, for all other cases we need to make damn sure | ||
507 | * we don't race with umount. We can *NOT* just grab a reference to a | ||
508 | * watch - inotify_unmount_inodes() will happily sail past it and we'll end | ||
509 | * with reference to inode potentially outliving its superblock. Ideally | ||
510 | * we just want to grab an active reference to superblock if we can; that | ||
511 | * will make sure we won't go into inotify_umount_inodes() until we are | ||
512 | * done. Cleanup is just deactivate_super(). However, that leaves a messy | ||
513 | * case - what if we *are* racing with umount() and active references to | ||
514 | * superblock can't be acquired anymore? We can bump ->s_count, grab | ||
515 | * ->s_umount, which will almost certainly wait until the superblock is shut | ||
516 | * down and the watch in question is pining for fjords. That's fine, but | ||
517 | * there is a problem - we might have hit the window between ->s_active | ||
518 | * getting to 0 / ->s_count - below S_BIAS (i.e. the moment when superblock | ||
519 | * is past the point of no return and is heading for shutdown) and the | ||
520 | * moment when deactivate_super() acquires ->s_umount. We could just do | ||
521 | * drop_super() yield() and retry, but that's rather antisocial and this | ||
522 | * stuff is luser-triggerable. OTOH, having grabbed ->s_umount and having | ||
523 | * found that we'd got there first (i.e. that ->s_root is non-NULL) we know | ||
524 | * that we won't race with inotify_umount_inodes(). So we could grab a | ||
525 | * reference to watch and do the rest as above, just with drop_super() instead | ||
526 | * of deactivate_super(), right? Wrong. We had to drop ih->mutex before we | ||
527 | * could grab ->s_umount. So the watch could've been gone already. | ||
528 | * | ||
529 | * That still can be dealt with - we need to save watch->wd, do idr_find() | ||
530 | * and compare its result with our pointer. If they match, we either have | ||
531 | * the damn thing still alive or we'd lost not one but two races at once, | ||
532 | * the watch had been killed and a new one got created with the same ->wd | ||
533 | * at the same address. That couldn't have happened in inotify_destroy(), | ||
534 | * but inotify_rm_wd() could run into that. Still, "new one got created" | ||
535 | * is not a problem - we have every right to kill it or leave it alone, | ||
536 | * whatever's more convenient. | ||
537 | * | ||
538 | * So we can use idr_find(...) == watch && watch->inode->i_sb == sb as | ||
539 | * "grab it and kill it" check. If it's been our original watch, we are | ||
540 | * fine, if it's a newcomer - nevermind, just pretend that we'd won the | ||
541 | * race and kill the fscker anyway; we are safe since we know that its | ||
542 | * superblock won't be going away. | ||
543 | * | ||
544 | * And yes, this is far beyond mere "not very pretty"; so's the entire | ||
545 | * concept of inotify to start with. | ||
546 | */ | ||
547 | |||
548 | /** | ||
549 | * pin_to_kill - pin the watch down for removal | ||
550 | * @ih: inotify handle | ||
551 | * @watch: watch to kill | ||
552 | * | ||
553 | * Called with ih->mutex held, drops it. Possible return values: | ||
554 | * 0 - nothing to do, it has died | ||
555 | * 1 - remove it, drop the reference and deactivate_super() | ||
556 | * 2 - remove it, drop the reference and drop_super(); we tried hard to avoid | ||
557 | * that variant, since it involved a lot of PITA, but that's the best that | ||
558 | * could've been done. | ||
559 | */ | ||
560 | static int pin_to_kill(struct inotify_handle *ih, struct inotify_watch *watch) | ||
561 | { | ||
562 | struct super_block *sb = watch->inode->i_sb; | ||
563 | s32 wd = watch->wd; | ||
564 | |||
565 | spin_lock(&sb_lock); | ||
566 | if (sb->s_count >= S_BIAS) { | ||
567 | atomic_inc(&sb->s_active); | ||
568 | spin_unlock(&sb_lock); | ||
569 | get_inotify_watch(watch); | ||
570 | mutex_unlock(&ih->mutex); | ||
571 | return 1; /* the best outcome */ | ||
572 | } | ||
573 | sb->s_count++; | ||
574 | spin_unlock(&sb_lock); | ||
575 | mutex_unlock(&ih->mutex); /* can't grab ->s_umount under it */ | ||
576 | down_read(&sb->s_umount); | ||
577 | if (likely(!sb->s_root)) { | ||
578 | /* fs is already shut down; the watch is dead */ | ||
579 | drop_super(sb); | ||
580 | return 0; | ||
581 | } | ||
582 | /* raced with the final deactivate_super() */ | ||
583 | mutex_lock(&ih->mutex); | ||
584 | if (idr_find(&ih->idr, wd) != watch || watch->inode->i_sb != sb) { | ||
585 | /* the watch is dead */ | ||
586 | mutex_unlock(&ih->mutex); | ||
587 | drop_super(sb); | ||
588 | return 0; | ||
589 | } | ||
590 | /* still alive or freed and reused with the same sb and wd; kill */ | ||
591 | get_inotify_watch(watch); | ||
592 | mutex_unlock(&ih->mutex); | ||
593 | return 2; | ||
594 | } | ||
595 | |||
596 | static void unpin_and_kill(struct inotify_watch *watch, int how) | ||
597 | { | ||
598 | struct super_block *sb = watch->inode->i_sb; | ||
599 | put_inotify_watch(watch); | ||
600 | switch (how) { | ||
601 | case 1: | ||
602 | deactivate_super(sb); | ||
603 | break; | ||
604 | case 2: | ||
605 | drop_super(sb); | ||
606 | } | ||
607 | } | ||
608 | |||
482 | /** | 609 | /** |
483 | * inotify_destroy - clean up and destroy an inotify instance | 610 | * inotify_destroy - clean up and destroy an inotify instance |
484 | * @ih: inotify handle | 611 | * @ih: inotify handle |
@@ -490,11 +617,15 @@ void inotify_destroy(struct inotify_handle *ih) | |||
490 | * pretty. We cannot do a simple iteration over the list, because we | 617 | * pretty. We cannot do a simple iteration over the list, because we |
491 | * do not know the inode until we iterate to the watch. But we need to | 618 | * do not know the inode until we iterate to the watch. But we need to |
492 | * hold inode->inotify_mutex before ih->mutex. The following works. | 619 | * hold inode->inotify_mutex before ih->mutex. The following works. |
620 | * | ||
621 | * AV: it had to become even uglier to start working ;-/ | ||
493 | */ | 622 | */ |
494 | while (1) { | 623 | while (1) { |
495 | struct inotify_watch *watch; | 624 | struct inotify_watch *watch; |
496 | struct list_head *watches; | 625 | struct list_head *watches; |
626 | struct super_block *sb; | ||
497 | struct inode *inode; | 627 | struct inode *inode; |
628 | int how; | ||
498 | 629 | ||
499 | mutex_lock(&ih->mutex); | 630 | mutex_lock(&ih->mutex); |
500 | watches = &ih->watches; | 631 | watches = &ih->watches; |
@@ -503,8 +634,10 @@ void inotify_destroy(struct inotify_handle *ih) | |||
503 | break; | 634 | break; |
504 | } | 635 | } |
505 | watch = list_first_entry(watches, struct inotify_watch, h_list); | 636 | watch = list_first_entry(watches, struct inotify_watch, h_list); |
506 | get_inotify_watch(watch); | 637 | sb = watch->inode->i_sb; |
507 | mutex_unlock(&ih->mutex); | 638 | how = pin_to_kill(ih, watch); |
639 | if (!how) | ||
640 | continue; | ||
508 | 641 | ||
509 | inode = watch->inode; | 642 | inode = watch->inode; |
510 | mutex_lock(&inode->inotify_mutex); | 643 | mutex_lock(&inode->inotify_mutex); |
@@ -518,7 +651,7 @@ void inotify_destroy(struct inotify_handle *ih) | |||
518 | 651 | ||
519 | mutex_unlock(&ih->mutex); | 652 | mutex_unlock(&ih->mutex); |
520 | mutex_unlock(&inode->inotify_mutex); | 653 | mutex_unlock(&inode->inotify_mutex); |
521 | put_inotify_watch(watch); | 654 | unpin_and_kill(watch, how); |
522 | } | 655 | } |
523 | 656 | ||
524 | /* free this handle: the put matching the get in inotify_init() */ | 657 | /* free this handle: the put matching the get in inotify_init() */ |
@@ -719,7 +852,9 @@ void inotify_evict_watch(struct inotify_watch *watch) | |||
719 | int inotify_rm_wd(struct inotify_handle *ih, u32 wd) | 852 | int inotify_rm_wd(struct inotify_handle *ih, u32 wd) |
720 | { | 853 | { |
721 | struct inotify_watch *watch; | 854 | struct inotify_watch *watch; |
855 | struct super_block *sb; | ||
722 | struct inode *inode; | 856 | struct inode *inode; |
857 | int how; | ||
723 | 858 | ||
724 | mutex_lock(&ih->mutex); | 859 | mutex_lock(&ih->mutex); |
725 | watch = idr_find(&ih->idr, wd); | 860 | watch = idr_find(&ih->idr, wd); |
@@ -727,9 +862,12 @@ int inotify_rm_wd(struct inotify_handle *ih, u32 wd) | |||
727 | mutex_unlock(&ih->mutex); | 862 | mutex_unlock(&ih->mutex); |
728 | return -EINVAL; | 863 | return -EINVAL; |
729 | } | 864 | } |
730 | get_inotify_watch(watch); | 865 | sb = watch->inode->i_sb; |
866 | how = pin_to_kill(ih, watch); | ||
867 | if (!how) | ||
868 | return 0; | ||
869 | |||
731 | inode = watch->inode; | 870 | inode = watch->inode; |
732 | mutex_unlock(&ih->mutex); | ||
733 | 871 | ||
734 | mutex_lock(&inode->inotify_mutex); | 872 | mutex_lock(&inode->inotify_mutex); |
735 | mutex_lock(&ih->mutex); | 873 | mutex_lock(&ih->mutex); |
@@ -740,7 +878,7 @@ int inotify_rm_wd(struct inotify_handle *ih, u32 wd) | |||
740 | 878 | ||
741 | mutex_unlock(&ih->mutex); | 879 | mutex_unlock(&ih->mutex); |
742 | mutex_unlock(&inode->inotify_mutex); | 880 | mutex_unlock(&inode->inotify_mutex); |
743 | put_inotify_watch(watch); | 881 | unpin_and_kill(watch, how); |
744 | 882 | ||
745 | return 0; | 883 | return 0; |
746 | } | 884 | } |
diff --git a/fs/namei.c b/fs/namei.c index 09ce58e49e72..d34e0f9681c6 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
@@ -1378,7 +1378,7 @@ static int may_delete(struct inode *dir,struct dentry *victim,int isdir) | |||
1378 | if (IS_APPEND(dir)) | 1378 | if (IS_APPEND(dir)) |
1379 | return -EPERM; | 1379 | return -EPERM; |
1380 | if (check_sticky(dir, victim->d_inode)||IS_APPEND(victim->d_inode)|| | 1380 | if (check_sticky(dir, victim->d_inode)||IS_APPEND(victim->d_inode)|| |
1381 | IS_IMMUTABLE(victim->d_inode)) | 1381 | IS_IMMUTABLE(victim->d_inode) || IS_SWAPFILE(victim->d_inode)) |
1382 | return -EPERM; | 1382 | return -EPERM; |
1383 | if (isdir) { | 1383 | if (isdir) { |
1384 | if (!S_ISDIR(victim->d_inode->i_mode)) | 1384 | if (!S_ISDIR(victim->d_inode->i_mode)) |
diff --git a/fs/namespace.c b/fs/namespace.c index cce46702d33c..65b3dc844c87 100644 --- a/fs/namespace.c +++ b/fs/namespace.c | |||
@@ -1815,8 +1815,8 @@ static void shrink_submounts(struct vfsmount *mnt, struct list_head *umounts) | |||
1815 | while (!list_empty(&graveyard)) { | 1815 | while (!list_empty(&graveyard)) { |
1816 | m = list_first_entry(&graveyard, struct vfsmount, | 1816 | m = list_first_entry(&graveyard, struct vfsmount, |
1817 | mnt_expire); | 1817 | mnt_expire); |
1818 | touch_mnt_namespace(mnt->mnt_ns); | 1818 | touch_mnt_namespace(m->mnt_ns); |
1819 | umount_tree(mnt, 1, umounts); | 1819 | umount_tree(m, 1, umounts); |
1820 | } | 1820 | } |
1821 | } | 1821 | } |
1822 | } | 1822 | } |
diff --git a/fs/ntfs/debug.h b/fs/ntfs/debug.h index 5e6724c1afd1..2142b1c68b61 100644 --- a/fs/ntfs/debug.h +++ b/fs/ntfs/debug.h | |||
@@ -30,7 +30,8 @@ | |||
30 | 30 | ||
31 | extern int debug_msgs; | 31 | extern int debug_msgs; |
32 | 32 | ||
33 | #if 0 /* Fool kernel-doc since it doesn't do macros yet */ | 33 | extern void __ntfs_debug(const char *file, int line, const char *function, |
34 | const char *format, ...) __attribute__ ((format (printf, 4, 5))); | ||
34 | /** | 35 | /** |
35 | * ntfs_debug - write a debug level message to syslog | 36 | * ntfs_debug - write a debug level message to syslog |
36 | * @f: a printf format string containing the message | 37 | * @f: a printf format string containing the message |
@@ -39,11 +40,6 @@ extern int debug_msgs; | |||
39 | * ntfs_debug() writes a DEBUG level message to the syslog but only if the | 40 | * ntfs_debug() writes a DEBUG level message to the syslog but only if the |
40 | * driver was compiled with -DDEBUG. Otherwise, the call turns into a NOP. | 41 | * driver was compiled with -DDEBUG. Otherwise, the call turns into a NOP. |
41 | */ | 42 | */ |
42 | static void ntfs_debug(const char *f, ...); | ||
43 | #endif | ||
44 | |||
45 | extern void __ntfs_debug (const char *file, int line, const char *function, | ||
46 | const char *format, ...) __attribute__ ((format (printf, 4, 5))); | ||
47 | #define ntfs_debug(f, a...) \ | 43 | #define ntfs_debug(f, a...) \ |
48 | __ntfs_debug(__FILE__, __LINE__, __func__, f, ##a) | 44 | __ntfs_debug(__FILE__, __LINE__, __func__, f, ##a) |
49 | 45 | ||
diff --git a/fs/ocfs2/buffer_head_io.c b/fs/ocfs2/buffer_head_io.c index 7e947c672469..3a178ec48d7c 100644 --- a/fs/ocfs2/buffer_head_io.c +++ b/fs/ocfs2/buffer_head_io.c | |||
@@ -112,7 +112,7 @@ int ocfs2_read_blocks_sync(struct ocfs2_super *osb, u64 block, | |||
112 | bh = bhs[i]; | 112 | bh = bhs[i]; |
113 | 113 | ||
114 | if (buffer_jbd(bh)) { | 114 | if (buffer_jbd(bh)) { |
115 | mlog(ML_ERROR, | 115 | mlog(ML_BH_IO, |
116 | "trying to sync read a jbd " | 116 | "trying to sync read a jbd " |
117 | "managed bh (blocknr = %llu), skipping\n", | 117 | "managed bh (blocknr = %llu), skipping\n", |
118 | (unsigned long long)bh->b_blocknr); | 118 | (unsigned long long)bh->b_blocknr); |
@@ -147,15 +147,10 @@ int ocfs2_read_blocks_sync(struct ocfs2_super *osb, u64 block, | |||
147 | for (i = nr; i > 0; i--) { | 147 | for (i = nr; i > 0; i--) { |
148 | bh = bhs[i - 1]; | 148 | bh = bhs[i - 1]; |
149 | 149 | ||
150 | if (buffer_jbd(bh)) { | 150 | /* No need to wait on the buffer if it's managed by JBD. */ |
151 | mlog(ML_ERROR, | 151 | if (!buffer_jbd(bh)) |
152 | "the journal got the buffer while it was " | 152 | wait_on_buffer(bh); |
153 | "locked for io! (blocknr = %llu)\n", | ||
154 | (unsigned long long)bh->b_blocknr); | ||
155 | BUG(); | ||
156 | } | ||
157 | 153 | ||
158 | wait_on_buffer(bh); | ||
159 | if (!buffer_uptodate(bh)) { | 154 | if (!buffer_uptodate(bh)) { |
160 | /* Status won't be cleared from here on out, | 155 | /* Status won't be cleared from here on out, |
161 | * so we can safely record this and loop back | 156 | * so we can safely record this and loop back |
@@ -251,8 +246,6 @@ int ocfs2_read_blocks(struct inode *inode, u64 block, int nr, | |||
251 | ignore_cache = 1; | 246 | ignore_cache = 1; |
252 | } | 247 | } |
253 | 248 | ||
254 | /* XXX: Can we ever get this and *not* have the cached | ||
255 | * flag set? */ | ||
256 | if (buffer_jbd(bh)) { | 249 | if (buffer_jbd(bh)) { |
257 | if (ignore_cache) | 250 | if (ignore_cache) |
258 | mlog(ML_BH_IO, "trying to sync read a jbd " | 251 | mlog(ML_BH_IO, "trying to sync read a jbd " |
diff --git a/fs/ocfs2/dlm/dlmfs.c b/fs/ocfs2/dlm/dlmfs.c index 533a789c3ef8..ba962d71b34d 100644 --- a/fs/ocfs2/dlm/dlmfs.c +++ b/fs/ocfs2/dlm/dlmfs.c | |||
@@ -608,8 +608,10 @@ static int __init init_dlmfs_fs(void) | |||
608 | 0, (SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT| | 608 | 0, (SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT| |
609 | SLAB_MEM_SPREAD), | 609 | SLAB_MEM_SPREAD), |
610 | dlmfs_init_once); | 610 | dlmfs_init_once); |
611 | if (!dlmfs_inode_cache) | 611 | if (!dlmfs_inode_cache) { |
612 | status = -ENOMEM; | ||
612 | goto bail; | 613 | goto bail; |
614 | } | ||
613 | cleanup_inode = 1; | 615 | cleanup_inode = 1; |
614 | 616 | ||
615 | user_dlm_worker = create_singlethread_workqueue("user_dlm"); | 617 | user_dlm_worker = create_singlethread_workqueue("user_dlm"); |
diff --git a/fs/ocfs2/dlm/userdlm.h b/fs/ocfs2/dlm/userdlm.h index 39ec27738499..0c3cc03c61fa 100644 --- a/fs/ocfs2/dlm/userdlm.h +++ b/fs/ocfs2/dlm/userdlm.h | |||
@@ -33,7 +33,7 @@ | |||
33 | #include <linux/workqueue.h> | 33 | #include <linux/workqueue.h> |
34 | 34 | ||
35 | /* user_lock_res->l_flags flags. */ | 35 | /* user_lock_res->l_flags flags. */ |
36 | #define USER_LOCK_ATTACHED (0x00000001) /* have we initialized | 36 | #define USER_LOCK_ATTACHED (0x00000001) /* we have initialized |
37 | * the lvb */ | 37 | * the lvb */ |
38 | #define USER_LOCK_BUSY (0x00000002) /* we are currently in | 38 | #define USER_LOCK_BUSY (0x00000002) /* we are currently in |
39 | * dlm_lock */ | 39 | * dlm_lock */ |
diff --git a/fs/ocfs2/dlmglue.c b/fs/ocfs2/dlmglue.c index ec684426034b..6e6cc0a2e5f7 100644 --- a/fs/ocfs2/dlmglue.c +++ b/fs/ocfs2/dlmglue.c | |||
@@ -2841,9 +2841,8 @@ static void ocfs2_unlock_ast(void *opaque, int error) | |||
2841 | 2841 | ||
2842 | lockres_clear_flags(lockres, OCFS2_LOCK_BUSY); | 2842 | lockres_clear_flags(lockres, OCFS2_LOCK_BUSY); |
2843 | lockres->l_unlock_action = OCFS2_UNLOCK_INVALID; | 2843 | lockres->l_unlock_action = OCFS2_UNLOCK_INVALID; |
2844 | spin_unlock_irqrestore(&lockres->l_lock, flags); | ||
2845 | |||
2846 | wake_up(&lockres->l_event); | 2844 | wake_up(&lockres->l_event); |
2845 | spin_unlock_irqrestore(&lockres->l_lock, flags); | ||
2847 | 2846 | ||
2848 | mlog_exit_void(); | 2847 | mlog_exit_void(); |
2849 | } | 2848 | } |
diff --git a/fs/ocfs2/ocfs2.h b/fs/ocfs2/ocfs2.h index fef7ece32376..3fed9e3d8992 100644 --- a/fs/ocfs2/ocfs2.h +++ b/fs/ocfs2/ocfs2.h | |||
@@ -85,7 +85,7 @@ enum ocfs2_unlock_action { | |||
85 | }; | 85 | }; |
86 | 86 | ||
87 | /* ocfs2_lock_res->l_flags flags. */ | 87 | /* ocfs2_lock_res->l_flags flags. */ |
88 | #define OCFS2_LOCK_ATTACHED (0x00000001) /* have we initialized | 88 | #define OCFS2_LOCK_ATTACHED (0x00000001) /* we have initialized |
89 | * the lvb */ | 89 | * the lvb */ |
90 | #define OCFS2_LOCK_BUSY (0x00000002) /* we are currently in | 90 | #define OCFS2_LOCK_BUSY (0x00000002) /* we are currently in |
91 | * dlm_lock */ | 91 | * dlm_lock */ |
diff --git a/fs/ocfs2/stack_user.c b/fs/ocfs2/stack_user.c index faec2d879357..9b76d41a8ac6 100644 --- a/fs/ocfs2/stack_user.c +++ b/fs/ocfs2/stack_user.c | |||
@@ -740,6 +740,9 @@ static int user_dlm_lock_status(union ocfs2_dlm_lksb *lksb) | |||
740 | 740 | ||
741 | static void *user_dlm_lvb(union ocfs2_dlm_lksb *lksb) | 741 | static void *user_dlm_lvb(union ocfs2_dlm_lksb *lksb) |
742 | { | 742 | { |
743 | if (!lksb->lksb_fsdlm.sb_lvbptr) | ||
744 | lksb->lksb_fsdlm.sb_lvbptr = (char *)lksb + | ||
745 | sizeof(struct dlm_lksb); | ||
743 | return (void *)(lksb->lksb_fsdlm.sb_lvbptr); | 746 | return (void *)(lksb->lksb_fsdlm.sb_lvbptr); |
744 | } | 747 | } |
745 | 748 | ||
diff --git a/fs/partitions/check.c b/fs/partitions/check.c index 633f7a0ebb2c..6d5b213b8a9b 100644 --- a/fs/partitions/check.c +++ b/fs/partitions/check.c | |||
@@ -348,8 +348,8 @@ static ssize_t whole_disk_show(struct device *dev, | |||
348 | static DEVICE_ATTR(whole_disk, S_IRUSR | S_IRGRP | S_IROTH, | 348 | static DEVICE_ATTR(whole_disk, S_IRUSR | S_IRGRP | S_IROTH, |
349 | whole_disk_show, NULL); | 349 | whole_disk_show, NULL); |
350 | 350 | ||
351 | int add_partition(struct gendisk *disk, int partno, | 351 | struct hd_struct *add_partition(struct gendisk *disk, int partno, |
352 | sector_t start, sector_t len, int flags) | 352 | sector_t start, sector_t len, int flags) |
353 | { | 353 | { |
354 | struct hd_struct *p; | 354 | struct hd_struct *p; |
355 | dev_t devt = MKDEV(0, 0); | 355 | dev_t devt = MKDEV(0, 0); |
@@ -361,15 +361,15 @@ int add_partition(struct gendisk *disk, int partno, | |||
361 | 361 | ||
362 | err = disk_expand_part_tbl(disk, partno); | 362 | err = disk_expand_part_tbl(disk, partno); |
363 | if (err) | 363 | if (err) |
364 | return err; | 364 | return ERR_PTR(err); |
365 | ptbl = disk->part_tbl; | 365 | ptbl = disk->part_tbl; |
366 | 366 | ||
367 | if (ptbl->part[partno]) | 367 | if (ptbl->part[partno]) |
368 | return -EBUSY; | 368 | return ERR_PTR(-EBUSY); |
369 | 369 | ||
370 | p = kzalloc(sizeof(*p), GFP_KERNEL); | 370 | p = kzalloc(sizeof(*p), GFP_KERNEL); |
371 | if (!p) | 371 | if (!p) |
372 | return -ENOMEM; | 372 | return ERR_PTR(-EBUSY); |
373 | 373 | ||
374 | if (!init_part_stats(p)) { | 374 | if (!init_part_stats(p)) { |
375 | err = -ENOMEM; | 375 | err = -ENOMEM; |
@@ -395,7 +395,7 @@ int add_partition(struct gendisk *disk, int partno, | |||
395 | 395 | ||
396 | err = blk_alloc_devt(p, &devt); | 396 | err = blk_alloc_devt(p, &devt); |
397 | if (err) | 397 | if (err) |
398 | goto out_free; | 398 | goto out_free_stats; |
399 | pdev->devt = devt; | 399 | pdev->devt = devt; |
400 | 400 | ||
401 | /* delay uevent until 'holders' subdir is created */ | 401 | /* delay uevent until 'holders' subdir is created */ |
@@ -424,18 +424,20 @@ int add_partition(struct gendisk *disk, int partno, | |||
424 | if (!ddev->uevent_suppress) | 424 | if (!ddev->uevent_suppress) |
425 | kobject_uevent(&pdev->kobj, KOBJ_ADD); | 425 | kobject_uevent(&pdev->kobj, KOBJ_ADD); |
426 | 426 | ||
427 | return 0; | 427 | return p; |
428 | 428 | ||
429 | out_free_stats: | ||
430 | free_part_stats(p); | ||
429 | out_free: | 431 | out_free: |
430 | kfree(p); | 432 | kfree(p); |
431 | return err; | 433 | return ERR_PTR(err); |
432 | out_del: | 434 | out_del: |
433 | kobject_put(p->holder_dir); | 435 | kobject_put(p->holder_dir); |
434 | device_del(pdev); | 436 | device_del(pdev); |
435 | out_put: | 437 | out_put: |
436 | put_device(pdev); | 438 | put_device(pdev); |
437 | blk_free_devt(devt); | 439 | blk_free_devt(devt); |
438 | return err; | 440 | return ERR_PTR(err); |
439 | } | 441 | } |
440 | 442 | ||
441 | /* Not exported, helper to add_disk(). */ | 443 | /* Not exported, helper to add_disk(). */ |
@@ -566,15 +568,16 @@ int rescan_partitions(struct gendisk *disk, struct block_device *bdev) | |||
566 | disk->disk_name, p, (unsigned long long) size); | 568 | disk->disk_name, p, (unsigned long long) size); |
567 | size = get_capacity(disk) - from; | 569 | size = get_capacity(disk) - from; |
568 | } | 570 | } |
569 | res = add_partition(disk, p, from, size, state->parts[p].flags); | 571 | part = add_partition(disk, p, from, size, |
570 | if (res) { | 572 | state->parts[p].flags); |
571 | printk(KERN_ERR " %s: p%d could not be added: %d\n", | 573 | if (IS_ERR(part)) { |
572 | disk->disk_name, p, -res); | 574 | printk(KERN_ERR " %s: p%d could not be added: %ld\n", |
575 | disk->disk_name, p, -PTR_ERR(part)); | ||
573 | continue; | 576 | continue; |
574 | } | 577 | } |
575 | #ifdef CONFIG_BLK_DEV_MD | 578 | #ifdef CONFIG_BLK_DEV_MD |
576 | if (state->parts[p].flags & ADDPART_FLAG_RAID) | 579 | if (state->parts[p].flags & ADDPART_FLAG_RAID) |
577 | md_autodetect_dev(bdev->bd_dev+p); | 580 | md_autodetect_dev(part_to_dev(part)->devt); |
578 | #endif | 581 | #endif |
579 | } | 582 | } |
580 | kfree(state); | 583 | kfree(state); |
diff --git a/fs/proc/proc_sysctl.c b/fs/proc/proc_sysctl.c index 94fcfff6863a..06ed10b7da9e 100644 --- a/fs/proc/proc_sysctl.c +++ b/fs/proc/proc_sysctl.c | |||
@@ -31,6 +31,7 @@ static struct inode *proc_sys_make_inode(struct super_block *sb, | |||
31 | inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; | 31 | inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; |
32 | inode->i_flags |= S_PRIVATE; /* tell selinux to ignore this inode */ | 32 | inode->i_flags |= S_PRIVATE; /* tell selinux to ignore this inode */ |
33 | inode->i_mode = table->mode; | 33 | inode->i_mode = table->mode; |
34 | inode->i_uid = inode->i_gid = 0; | ||
34 | if (!table->child) { | 35 | if (!table->child) { |
35 | inode->i_mode |= S_IFREG; | 36 | inode->i_mode |= S_IFREG; |
36 | inode->i_op = &proc_sys_inode_operations; | 37 | inode->i_op = &proc_sys_inode_operations; |
diff --git a/fs/udf/inode.c b/fs/udf/inode.c index 6e74b117aaf0..30ebde490f7f 100644 --- a/fs/udf/inode.c +++ b/fs/udf/inode.c | |||
@@ -106,6 +106,7 @@ void udf_clear_inode(struct inode *inode) | |||
106 | udf_truncate_tail_extent(inode); | 106 | udf_truncate_tail_extent(inode); |
107 | unlock_kernel(); | 107 | unlock_kernel(); |
108 | write_inode_now(inode, 0); | 108 | write_inode_now(inode, 0); |
109 | invalidate_inode_buffers(inode); | ||
109 | } | 110 | } |
110 | iinfo = UDF_I(inode); | 111 | iinfo = UDF_I(inode); |
111 | kfree(iinfo->i_ext.i_data); | 112 | kfree(iinfo->i_ext.i_data); |
diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h index 54a279e44c9a..e9f6574930ef 100644 --- a/include/acpi/acpi_bus.h +++ b/include/acpi/acpi_bus.h | |||
@@ -380,6 +380,8 @@ struct acpi_bus_type { | |||
380 | int register_acpi_bus_type(struct acpi_bus_type *); | 380 | int register_acpi_bus_type(struct acpi_bus_type *); |
381 | int unregister_acpi_bus_type(struct acpi_bus_type *); | 381 | int unregister_acpi_bus_type(struct acpi_bus_type *); |
382 | struct device *acpi_get_physical_device(acpi_handle); | 382 | struct device *acpi_get_physical_device(acpi_handle); |
383 | struct device *acpi_get_physical_pci_device(acpi_handle); | ||
384 | |||
383 | /* helper */ | 385 | /* helper */ |
384 | acpi_handle acpi_get_child(acpi_handle, acpi_integer); | 386 | acpi_handle acpi_get_child(acpi_handle, acpi_integer); |
385 | acpi_handle acpi_get_pci_rootbridge_handle(unsigned int, unsigned int); | 387 | acpi_handle acpi_get_pci_rootbridge_handle(unsigned int, unsigned int); |
diff --git a/include/acpi/acpi_drivers.h b/include/acpi/acpi_drivers.h index cf04c6011c2a..5fc1bb0f4a90 100644 --- a/include/acpi/acpi_drivers.h +++ b/include/acpi/acpi_drivers.h | |||
@@ -31,8 +31,24 @@ | |||
31 | 31 | ||
32 | #define ACPI_MAX_STRING 80 | 32 | #define ACPI_MAX_STRING 80 |
33 | 33 | ||
34 | /* | ||
35 | * Please update drivers/acpi/debug.c and Documentation/acpi/debug.txt | ||
36 | * if you add to this list. | ||
37 | */ | ||
34 | #define ACPI_BUS_COMPONENT 0x00010000 | 38 | #define ACPI_BUS_COMPONENT 0x00010000 |
39 | #define ACPI_AC_COMPONENT 0x00020000 | ||
40 | #define ACPI_BATTERY_COMPONENT 0x00040000 | ||
41 | #define ACPI_BUTTON_COMPONENT 0x00080000 | ||
42 | #define ACPI_SBS_COMPONENT 0x00100000 | ||
43 | #define ACPI_FAN_COMPONENT 0x00200000 | ||
44 | #define ACPI_PCI_COMPONENT 0x00400000 | ||
45 | #define ACPI_POWER_COMPONENT 0x00800000 | ||
46 | #define ACPI_CONTAINER_COMPONENT 0x01000000 | ||
35 | #define ACPI_SYSTEM_COMPONENT 0x02000000 | 47 | #define ACPI_SYSTEM_COMPONENT 0x02000000 |
48 | #define ACPI_THERMAL_COMPONENT 0x04000000 | ||
49 | #define ACPI_MEMORY_DEVICE_COMPONENT 0x08000000 | ||
50 | #define ACPI_VIDEO_COMPONENT 0x10000000 | ||
51 | #define ACPI_PROCESSOR_COMPONENT 0x20000000 | ||
36 | 52 | ||
37 | /* | 53 | /* |
38 | * _HID definitions | 54 | * _HID definitions |
@@ -41,6 +57,7 @@ | |||
41 | */ | 57 | */ |
42 | 58 | ||
43 | #define ACPI_POWER_HID "LNXPOWER" | 59 | #define ACPI_POWER_HID "LNXPOWER" |
60 | #define ACPI_PROCESSOR_OBJECT_HID "ACPI_CPU" | ||
44 | #define ACPI_PROCESSOR_HID "ACPI0007" | 61 | #define ACPI_PROCESSOR_HID "ACPI0007" |
45 | #define ACPI_SYSTEM_HID "LNXSYSTM" | 62 | #define ACPI_SYSTEM_HID "LNXSYSTM" |
46 | #define ACPI_THERMAL_HID "LNXTHERM" | 63 | #define ACPI_THERMAL_HID "LNXTHERM" |
@@ -54,7 +71,6 @@ | |||
54 | PCI | 71 | PCI |
55 | -------------------------------------------------------------------------- */ | 72 | -------------------------------------------------------------------------- */ |
56 | 73 | ||
57 | #define ACPI_PCI_COMPONENT 0x00400000 | ||
58 | 74 | ||
59 | /* ACPI PCI Interrupt Link (pci_link.c) */ | 75 | /* ACPI PCI Interrupt Link (pci_link.c) */ |
60 | 76 | ||
@@ -86,7 +102,6 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_device *device, int domain, | |||
86 | Power Resource | 102 | Power Resource |
87 | -------------------------------------------------------------------------- */ | 103 | -------------------------------------------------------------------------- */ |
88 | 104 | ||
89 | #ifdef CONFIG_ACPI_POWER | ||
90 | int acpi_device_sleep_wake(struct acpi_device *dev, | 105 | int acpi_device_sleep_wake(struct acpi_device *dev, |
91 | int enable, int sleep_state, int dev_state); | 106 | int enable, int sleep_state, int dev_state); |
92 | int acpi_enable_wakeup_device_power(struct acpi_device *dev, int sleep_state); | 107 | int acpi_enable_wakeup_device_power(struct acpi_device *dev, int sleep_state); |
@@ -94,15 +109,12 @@ int acpi_disable_wakeup_device_power(struct acpi_device *dev); | |||
94 | int acpi_power_get_inferred_state(struct acpi_device *device); | 109 | int acpi_power_get_inferred_state(struct acpi_device *device); |
95 | int acpi_power_transition(struct acpi_device *device, int state); | 110 | int acpi_power_transition(struct acpi_device *device, int state); |
96 | extern int acpi_power_nocheck; | 111 | extern int acpi_power_nocheck; |
97 | #endif | ||
98 | 112 | ||
99 | /* -------------------------------------------------------------------------- | 113 | /* -------------------------------------------------------------------------- |
100 | Embedded Controller | 114 | Embedded Controller |
101 | -------------------------------------------------------------------------- */ | 115 | -------------------------------------------------------------------------- */ |
102 | #ifdef CONFIG_ACPI_EC | ||
103 | int acpi_ec_ecdt_probe(void); | 116 | int acpi_ec_ecdt_probe(void); |
104 | int acpi_boot_ec_enable(void); | 117 | int acpi_boot_ec_enable(void); |
105 | #endif | ||
106 | 118 | ||
107 | /* -------------------------------------------------------------------------- | 119 | /* -------------------------------------------------------------------------- |
108 | Processor | 120 | Processor |
diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h index 94d94e126e9f..33bc0e3b1954 100644 --- a/include/acpi/acpixf.h +++ b/include/acpi/acpixf.h | |||
@@ -252,9 +252,9 @@ acpi_status acpi_get_event_status(u32 event, acpi_event_status * event_status); | |||
252 | 252 | ||
253 | acpi_status acpi_set_gpe_type(acpi_handle gpe_device, u32 gpe_number, u8 type); | 253 | acpi_status acpi_set_gpe_type(acpi_handle gpe_device, u32 gpe_number, u8 type); |
254 | 254 | ||
255 | acpi_status acpi_enable_gpe(acpi_handle gpe_device, u32 gpe_number, u32 flags); | 255 | acpi_status acpi_enable_gpe(acpi_handle gpe_device, u32 gpe_number); |
256 | 256 | ||
257 | acpi_status acpi_disable_gpe(acpi_handle gpe_device, u32 gpe_number, u32 flags); | 257 | acpi_status acpi_disable_gpe(acpi_handle gpe_device, u32 gpe_number); |
258 | 258 | ||
259 | acpi_status acpi_clear_gpe(acpi_handle gpe_device, u32 gpe_number, u32 flags); | 259 | acpi_status acpi_clear_gpe(acpi_handle gpe_device, u32 gpe_number, u32 flags); |
260 | 260 | ||
diff --git a/include/acpi/acpredef.h b/include/acpi/acpredef.h index 619fb75f8861..16a9ca9a66e4 100644 --- a/include/acpi/acpredef.h +++ b/include/acpi/acpredef.h | |||
@@ -167,7 +167,7 @@ static const union acpi_predefined_info predefined_names[] = { | |||
167 | {.info = {"_BFS", 1, 0}}, | 167 | {.info = {"_BFS", 1, 0}}, |
168 | {.info = {"_BIF", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER, | 168 | {.info = {"_BIF", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER, |
169 | 9, | 169 | 9, |
170 | ACPI_RTYPE_STRING, 4, 0}}, /* fixed (9 Int),(4 Str) */ | 170 | ACPI_RTYPE_STRING | ACPI_RTYPE_BUFFER, 4, 0}}, /* fixed (9 Int),(4 Str) */ |
171 | {.info = {"_BLT", 3, 0}}, | 171 | {.info = {"_BLT", 3, 0}}, |
172 | {.info = {"_BMC", 1, 0}}, | 172 | {.info = {"_BMC", 1, 0}}, |
173 | {.info = {"_BMD", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER, 5, 0, 0, 0}}, /* fixed (5 Int) */ | 173 | {.info = {"_BMD", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER, 5, 0, 0, 0}}, /* fixed (5 Int) */ |
@@ -346,7 +346,7 @@ static const union acpi_predefined_info predefined_names[] = { | |||
346 | 346 | ||
347 | /* Acpi 1.0 defined _WAK with no return value. Later, it was changed to return a package */ | 347 | /* Acpi 1.0 defined _WAK with no return value. Later, it was changed to return a package */ |
348 | 348 | ||
349 | {.info = {"_WAK", 1, ACPI_RTYPE_NONE | ACPI_RTYPE_PACKAGE}}, | 349 | {.info = {"_WAK", 1, ACPI_RTYPE_NONE | ACPI_RTYPE_INTEGER | ACPI_RTYPE_PACKAGE}}, |
350 | {.ret_info = {ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER, 2, 0, 0, 0}}, /* fixed (2 Int), but is optional */ | 350 | {.ret_info = {ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER, 2, 0, 0, 0}}, /* fixed (2 Int), but is optional */ |
351 | {.ret_info = {0, 0, 0, 0, 0, 0}} /* Table terminator */ | 351 | {.ret_info = {0, 0, 0, 0, 0, 0}} /* Table terminator */ |
352 | }; | 352 | }; |
diff --git a/include/acpi/actypes.h b/include/acpi/actypes.h index e8936ab59627..7220361790b3 100644 --- a/include/acpi/actypes.h +++ b/include/acpi/actypes.h | |||
@@ -525,6 +525,7 @@ typedef u32 acpi_event_status; | |||
525 | #define ACPI_EVENT_FLAG_ENABLED (acpi_event_status) 0x01 | 525 | #define ACPI_EVENT_FLAG_ENABLED (acpi_event_status) 0x01 |
526 | #define ACPI_EVENT_FLAG_WAKE_ENABLED (acpi_event_status) 0x02 | 526 | #define ACPI_EVENT_FLAG_WAKE_ENABLED (acpi_event_status) 0x02 |
527 | #define ACPI_EVENT_FLAG_SET (acpi_event_status) 0x04 | 527 | #define ACPI_EVENT_FLAG_SET (acpi_event_status) 0x04 |
528 | #define ACPI_EVENT_FLAG_HANDLE (acpi_event_status) 0x08 | ||
528 | 529 | ||
529 | /* | 530 | /* |
530 | * General Purpose Events (GPE) | 531 | * General Purpose Events (GPE) |
diff --git a/include/drm/drmP.h b/include/drm/drmP.h index 28c7f1679d49..d5e8e5c89548 100644 --- a/include/drm/drmP.h +++ b/include/drm/drmP.h | |||
@@ -1151,6 +1151,7 @@ extern u32 drm_vblank_count(struct drm_device *dev, int crtc); | |||
1151 | extern void drm_handle_vblank(struct drm_device *dev, int crtc); | 1151 | extern void drm_handle_vblank(struct drm_device *dev, int crtc); |
1152 | extern int drm_vblank_get(struct drm_device *dev, int crtc); | 1152 | extern int drm_vblank_get(struct drm_device *dev, int crtc); |
1153 | extern void drm_vblank_put(struct drm_device *dev, int crtc); | 1153 | extern void drm_vblank_put(struct drm_device *dev, int crtc); |
1154 | extern void drm_vblank_cleanup(struct drm_device *dev); | ||
1154 | /* Modesetting support */ | 1155 | /* Modesetting support */ |
1155 | extern int drm_modeset_ctl(struct drm_device *dev, void *data, | 1156 | extern int drm_modeset_ctl(struct drm_device *dev, void *data, |
1156 | struct drm_file *file_priv); | 1157 | struct drm_file *file_priv); |
diff --git a/include/linux/acpi.h b/include/linux/acpi.h index fd6a452b0ceb..fba8051fb297 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h | |||
@@ -163,8 +163,6 @@ struct acpi_pci_driver { | |||
163 | int acpi_pci_register_driver(struct acpi_pci_driver *driver); | 163 | int acpi_pci_register_driver(struct acpi_pci_driver *driver); |
164 | void acpi_pci_unregister_driver(struct acpi_pci_driver *driver); | 164 | void acpi_pci_unregister_driver(struct acpi_pci_driver *driver); |
165 | 165 | ||
166 | #ifdef CONFIG_ACPI_EC | ||
167 | |||
168 | extern int ec_read(u8 addr, u8 *val); | 166 | extern int ec_read(u8 addr, u8 *val); |
169 | extern int ec_write(u8 addr, u8 val); | 167 | extern int ec_write(u8 addr, u8 val); |
170 | extern int ec_transaction(u8 command, | 168 | extern int ec_transaction(u8 command, |
@@ -172,8 +170,6 @@ extern int ec_transaction(u8 command, | |||
172 | u8 *rdata, unsigned rdata_len, | 170 | u8 *rdata, unsigned rdata_len, |
173 | int force_poll); | 171 | int force_poll); |
174 | 172 | ||
175 | #endif /*CONFIG_ACPI_EC*/ | ||
176 | |||
177 | #if defined(CONFIG_ACPI_WMI) || defined(CONFIG_ACPI_WMI_MODULE) | 173 | #if defined(CONFIG_ACPI_WMI) || defined(CONFIG_ACPI_WMI_MODULE) |
178 | 174 | ||
179 | typedef void (*wmi_notify_handler) (u32 value, void *context); | 175 | typedef void (*wmi_notify_handler) (u32 value, void *context); |
@@ -194,6 +190,50 @@ extern bool wmi_has_guid(const char *guid); | |||
194 | 190 | ||
195 | #endif /* CONFIG_ACPI_WMI */ | 191 | #endif /* CONFIG_ACPI_WMI */ |
196 | 192 | ||
193 | #define ACPI_VIDEO_OUTPUT_SWITCHING 0x0001 | ||
194 | #define ACPI_VIDEO_DEVICE_POSTING 0x0002 | ||
195 | #define ACPI_VIDEO_ROM_AVAILABLE 0x0004 | ||
196 | #define ACPI_VIDEO_BACKLIGHT 0x0008 | ||
197 | #define ACPI_VIDEO_BACKLIGHT_FORCE_VENDOR 0x0010 | ||
198 | #define ACPI_VIDEO_BACKLIGHT_FORCE_VIDEO 0x0020 | ||
199 | #define ACPI_VIDEO_OUTPUT_SWITCHING_FORCE_VENDOR 0x0040 | ||
200 | #define ACPI_VIDEO_OUTPUT_SWITCHING_FORCE_VIDEO 0x0080 | ||
201 | #define ACPI_VIDEO_BACKLIGHT_DMI_VENDOR 0x0100 | ||
202 | #define ACPI_VIDEO_BACKLIGHT_DMI_VIDEO 0x0200 | ||
203 | #define ACPI_VIDEO_OUTPUT_SWITCHING_DMI_VENDOR 0x0400 | ||
204 | #define ACPI_VIDEO_OUTPUT_SWITCHING_DMI_VIDEO 0x0800 | ||
205 | |||
206 | #if defined(CONFIG_ACPI_VIDEO) || defined(CONFIG_ACPI_VIDEO_MODULE) | ||
207 | |||
208 | extern long acpi_video_get_capabilities(acpi_handle graphics_dev_handle); | ||
209 | extern long acpi_is_video_device(struct acpi_device *device); | ||
210 | extern int acpi_video_backlight_support(void); | ||
211 | extern int acpi_video_display_switch_support(void); | ||
212 | |||
213 | #else | ||
214 | |||
215 | static inline long acpi_video_get_capabilities(acpi_handle graphics_dev_handle) | ||
216 | { | ||
217 | return 0; | ||
218 | } | ||
219 | |||
220 | static inline long acpi_is_video_device(struct acpi_device *device) | ||
221 | { | ||
222 | return 0; | ||
223 | } | ||
224 | |||
225 | static inline int acpi_video_backlight_support(void) | ||
226 | { | ||
227 | return 0; | ||
228 | } | ||
229 | |||
230 | static inline int acpi_video_display_switch_support(void) | ||
231 | { | ||
232 | return 0; | ||
233 | } | ||
234 | |||
235 | #endif /* defined(CONFIG_ACPI_VIDEO) || defined(CONFIG_ACPI_VIDEO_MODULE) */ | ||
236 | |||
197 | extern int acpi_blacklisted(void); | 237 | extern int acpi_blacklisted(void); |
198 | #ifdef CONFIG_DMI | 238 | #ifdef CONFIG_DMI |
199 | extern void acpi_dmi_osi_linux(int enable, const struct dmi_system_id *d); | 239 | extern void acpi_dmi_osi_linux(int enable, const struct dmi_system_id *d); |
diff --git a/include/linux/c2port.h b/include/linux/c2port.h new file mode 100644 index 000000000000..7b5a2388ba67 --- /dev/null +++ b/include/linux/c2port.h | |||
@@ -0,0 +1,65 @@ | |||
1 | /* | ||
2 | * Silicon Labs C2 port Linux support | ||
3 | * | ||
4 | * Copyright (c) 2007 Rodolfo Giometti <giometti@linux.it> | ||
5 | * Copyright (c) 2007 Eurotech S.p.A. <info@eurotech.it> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify it | ||
8 | * under the terms of the GNU General Public License version 2 as published by | ||
9 | * the Free Software Foundation | ||
10 | */ | ||
11 | |||
12 | #include <linux/device.h> | ||
13 | |||
14 | #define C2PORT_NAME_LEN 32 | ||
15 | |||
16 | /* | ||
17 | * C2 port basic structs | ||
18 | */ | ||
19 | |||
20 | /* Main struct */ | ||
21 | struct c2port_ops; | ||
22 | struct c2port_device { | ||
23 | unsigned int access:1; | ||
24 | unsigned int flash_access:1; | ||
25 | |||
26 | int id; | ||
27 | char name[C2PORT_NAME_LEN]; | ||
28 | struct c2port_ops *ops; | ||
29 | struct mutex mutex; /* prevent races during read/write */ | ||
30 | |||
31 | struct device *dev; | ||
32 | |||
33 | void *private_data; | ||
34 | }; | ||
35 | |||
36 | /* Basic operations */ | ||
37 | struct c2port_ops { | ||
38 | /* Flash layout */ | ||
39 | unsigned short block_size; /* flash block size in bytes */ | ||
40 | unsigned short blocks_num; /* flash blocks number */ | ||
41 | |||
42 | /* Enable or disable the access to C2 port */ | ||
43 | void (*access)(struct c2port_device *dev, int status); | ||
44 | |||
45 | /* Set C2D data line as input/output */ | ||
46 | void (*c2d_dir)(struct c2port_device *dev, int dir); | ||
47 | |||
48 | /* Read/write C2D data line */ | ||
49 | int (*c2d_get)(struct c2port_device *dev); | ||
50 | void (*c2d_set)(struct c2port_device *dev, int status); | ||
51 | |||
52 | /* Write C2CK clock line */ | ||
53 | void (*c2ck_set)(struct c2port_device *dev, int status); | ||
54 | }; | ||
55 | |||
56 | /* | ||
57 | * Exported functions | ||
58 | */ | ||
59 | |||
60 | #define to_class_dev(obj) container_of((obj), struct class_device, kobj) | ||
61 | #define to_c2port_device(obj) container_of((obj), struct c2port_device, class) | ||
62 | |||
63 | extern struct c2port_device *c2port_device_register(char *name, | ||
64 | struct c2port_ops *ops, void *devdata); | ||
65 | extern void c2port_device_unregister(struct c2port_device *dev); | ||
diff --git a/include/linux/compat.h b/include/linux/compat.h index f061a1ea1b74..e88f3ecf38b4 100644 --- a/include/linux/compat.h +++ b/include/linux/compat.h | |||
@@ -252,12 +252,10 @@ extern int compat_ptrace_request(struct task_struct *child, | |||
252 | compat_long_t request, | 252 | compat_long_t request, |
253 | compat_ulong_t addr, compat_ulong_t data); | 253 | compat_ulong_t addr, compat_ulong_t data); |
254 | 254 | ||
255 | #ifdef __ARCH_WANT_COMPAT_SYS_PTRACE | ||
256 | extern long compat_arch_ptrace(struct task_struct *child, compat_long_t request, | 255 | extern long compat_arch_ptrace(struct task_struct *child, compat_long_t request, |
257 | compat_ulong_t addr, compat_ulong_t data); | 256 | compat_ulong_t addr, compat_ulong_t data); |
258 | asmlinkage long compat_sys_ptrace(compat_long_t request, compat_long_t pid, | 257 | asmlinkage long compat_sys_ptrace(compat_long_t request, compat_long_t pid, |
259 | compat_long_t addr, compat_long_t data); | 258 | compat_long_t addr, compat_long_t data); |
260 | #endif /* __ARCH_WANT_COMPAT_SYS_PTRACE */ | ||
261 | 259 | ||
262 | /* | 260 | /* |
263 | * epoll (fs/eventpoll.c) compat bits follow ... | 261 | * epoll (fs/eventpoll.c) compat bits follow ... |
diff --git a/include/linux/cpuset.h b/include/linux/cpuset.h index 2691926fb506..8e540d32c9fe 100644 --- a/include/linux/cpuset.h +++ b/include/linux/cpuset.h | |||
@@ -74,8 +74,6 @@ static inline int cpuset_do_slab_mem_spread(void) | |||
74 | return current->flags & PF_SPREAD_SLAB; | 74 | return current->flags & PF_SPREAD_SLAB; |
75 | } | 75 | } |
76 | 76 | ||
77 | extern void cpuset_track_online_nodes(void); | ||
78 | |||
79 | extern int current_cpuset_is_being_rebound(void); | 77 | extern int current_cpuset_is_being_rebound(void); |
80 | 78 | ||
81 | extern void rebuild_sched_domains(void); | 79 | extern void rebuild_sched_domains(void); |
@@ -151,8 +149,6 @@ static inline int cpuset_do_slab_mem_spread(void) | |||
151 | return 0; | 149 | return 0; |
152 | } | 150 | } |
153 | 151 | ||
154 | static inline void cpuset_track_online_nodes(void) {} | ||
155 | |||
156 | static inline int current_cpuset_is_being_rebound(void) | 152 | static inline int current_cpuset_is_being_rebound(void) |
157 | { | 153 | { |
158 | return 0; | 154 | return 0; |
diff --git a/include/linux/genhd.h b/include/linux/genhd.h index e439e6aed832..3df7742ce246 100644 --- a/include/linux/genhd.h +++ b/include/linux/genhd.h | |||
@@ -522,7 +522,9 @@ extern char *disk_name (struct gendisk *hd, int partno, char *buf); | |||
522 | 522 | ||
523 | extern int disk_expand_part_tbl(struct gendisk *disk, int target); | 523 | extern int disk_expand_part_tbl(struct gendisk *disk, int target); |
524 | extern int rescan_partitions(struct gendisk *disk, struct block_device *bdev); | 524 | extern int rescan_partitions(struct gendisk *disk, struct block_device *bdev); |
525 | extern int __must_check add_partition(struct gendisk *, int, sector_t, sector_t, int); | 525 | extern struct hd_struct * __must_check add_partition(struct gendisk *disk, |
526 | int partno, sector_t start, | ||
527 | sector_t len, int flags); | ||
526 | extern void delete_partition(struct gendisk *, int); | 528 | extern void delete_partition(struct gendisk *, int); |
527 | extern void printk_all_partitions(void); | 529 | extern void printk_all_partitions(void); |
528 | 530 | ||
diff --git a/include/linux/highmem.h b/include/linux/highmem.h index 7dcbc82f3b7b..13875ce9112a 100644 --- a/include/linux/highmem.h +++ b/include/linux/highmem.h | |||
@@ -63,12 +63,14 @@ static inline void *kmap_atomic(struct page *page, enum km_type idx) | |||
63 | #endif /* CONFIG_HIGHMEM */ | 63 | #endif /* CONFIG_HIGHMEM */ |
64 | 64 | ||
65 | /* when CONFIG_HIGHMEM is not set these will be plain clear/copy_page */ | 65 | /* when CONFIG_HIGHMEM is not set these will be plain clear/copy_page */ |
66 | #ifndef clear_user_highpage | ||
66 | static inline void clear_user_highpage(struct page *page, unsigned long vaddr) | 67 | static inline void clear_user_highpage(struct page *page, unsigned long vaddr) |
67 | { | 68 | { |
68 | void *addr = kmap_atomic(page, KM_USER0); | 69 | void *addr = kmap_atomic(page, KM_USER0); |
69 | clear_user_page(addr, vaddr, page); | 70 | clear_user_page(addr, vaddr, page); |
70 | kunmap_atomic(addr, KM_USER0); | 71 | kunmap_atomic(addr, KM_USER0); |
71 | } | 72 | } |
73 | #endif | ||
72 | 74 | ||
73 | #ifndef __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE | 75 | #ifndef __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE |
74 | /** | 76 | /** |
diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h index 07e510a3b00a..3eba43878dcb 100644 --- a/include/linux/hrtimer.h +++ b/include/linux/hrtimer.h | |||
@@ -46,9 +46,6 @@ enum hrtimer_restart { | |||
46 | * hrtimer callback modes: | 46 | * hrtimer callback modes: |
47 | * | 47 | * |
48 | * HRTIMER_CB_SOFTIRQ: Callback must run in softirq context | 48 | * HRTIMER_CB_SOFTIRQ: Callback must run in softirq context |
49 | * HRTIMER_CB_IRQSAFE: Callback may run in hardirq context | ||
50 | * HRTIMER_CB_IRQSAFE_NO_RESTART: Callback may run in hardirq context and | ||
51 | * does not restart the timer | ||
52 | * HRTIMER_CB_IRQSAFE_PERCPU: Callback must run in hardirq context | 49 | * HRTIMER_CB_IRQSAFE_PERCPU: Callback must run in hardirq context |
53 | * Special mode for tick emulation and | 50 | * Special mode for tick emulation and |
54 | * scheduler timer. Such timers are per | 51 | * scheduler timer. Such timers are per |
@@ -61,8 +58,6 @@ enum hrtimer_restart { | |||
61 | */ | 58 | */ |
62 | enum hrtimer_cb_mode { | 59 | enum hrtimer_cb_mode { |
63 | HRTIMER_CB_SOFTIRQ, | 60 | HRTIMER_CB_SOFTIRQ, |
64 | HRTIMER_CB_IRQSAFE, | ||
65 | HRTIMER_CB_IRQSAFE_NO_RESTART, | ||
66 | HRTIMER_CB_IRQSAFE_PERCPU, | 61 | HRTIMER_CB_IRQSAFE_PERCPU, |
67 | HRTIMER_CB_IRQSAFE_UNLOCKED, | 62 | HRTIMER_CB_IRQSAFE_UNLOCKED, |
68 | }; | 63 | }; |
diff --git a/include/linux/idr.h b/include/linux/idr.h index fa035f96f2a3..dd846df8cd32 100644 --- a/include/linux/idr.h +++ b/include/linux/idr.h | |||
@@ -52,13 +52,14 @@ struct idr_layer { | |||
52 | unsigned long bitmap; /* A zero bit means "space here" */ | 52 | unsigned long bitmap; /* A zero bit means "space here" */ |
53 | struct idr_layer *ary[1<<IDR_BITS]; | 53 | struct idr_layer *ary[1<<IDR_BITS]; |
54 | int count; /* When zero, we can release it */ | 54 | int count; /* When zero, we can release it */ |
55 | int layer; /* distance from leaf */ | ||
55 | struct rcu_head rcu_head; | 56 | struct rcu_head rcu_head; |
56 | }; | 57 | }; |
57 | 58 | ||
58 | struct idr { | 59 | struct idr { |
59 | struct idr_layer *top; | 60 | struct idr_layer *top; |
60 | struct idr_layer *id_free; | 61 | struct idr_layer *id_free; |
61 | int layers; | 62 | int layers; /* only valid without concurrent changes */ |
62 | int id_free_cnt; | 63 | int id_free_cnt; |
63 | spinlock_t lock; | 64 | spinlock_t lock; |
64 | }; | 65 | }; |
diff --git a/include/linux/inotify.h b/include/linux/inotify.h index bd578578a8b9..37ea2894b3c0 100644 --- a/include/linux/inotify.h +++ b/include/linux/inotify.h | |||
@@ -134,6 +134,8 @@ extern void inotify_remove_watch_locked(struct inotify_handle *, | |||
134 | struct inotify_watch *); | 134 | struct inotify_watch *); |
135 | extern void get_inotify_watch(struct inotify_watch *); | 135 | extern void get_inotify_watch(struct inotify_watch *); |
136 | extern void put_inotify_watch(struct inotify_watch *); | 136 | extern void put_inotify_watch(struct inotify_watch *); |
137 | extern int pin_inotify_watch(struct inotify_watch *); | ||
138 | extern void unpin_inotify_watch(struct inotify_watch *); | ||
137 | 139 | ||
138 | #else | 140 | #else |
139 | 141 | ||
@@ -228,6 +230,15 @@ static inline void put_inotify_watch(struct inotify_watch *watch) | |||
228 | { | 230 | { |
229 | } | 231 | } |
230 | 232 | ||
233 | extern inline int pin_inotify_watch(struct inotify_watch *watch) | ||
234 | { | ||
235 | return 0; | ||
236 | } | ||
237 | |||
238 | extern inline void unpin_inotify_watch(struct inotify_watch *watch) | ||
239 | { | ||
240 | } | ||
241 | |||
231 | #endif /* CONFIG_INOTIFY */ | 242 | #endif /* CONFIG_INOTIFY */ |
232 | 243 | ||
233 | #endif /* __KERNEL __ */ | 244 | #endif /* __KERNEL __ */ |
diff --git a/include/linux/input.h b/include/linux/input.h index b86fb5581ce6..5341e8251f8c 100644 --- a/include/linux/input.h +++ b/include/linux/input.h | |||
@@ -238,6 +238,7 @@ struct input_absinfo { | |||
238 | #define KEY_KPEQUAL 117 | 238 | #define KEY_KPEQUAL 117 |
239 | #define KEY_KPPLUSMINUS 118 | 239 | #define KEY_KPPLUSMINUS 118 |
240 | #define KEY_PAUSE 119 | 240 | #define KEY_PAUSE 119 |
241 | #define KEY_SCALE 120 /* AL Compiz Scale (Expose) */ | ||
241 | 242 | ||
242 | #define KEY_KPCOMMA 121 | 243 | #define KEY_KPCOMMA 121 |
243 | #define KEY_HANGEUL 122 | 244 | #define KEY_HANGEUL 122 |
@@ -322,6 +323,7 @@ struct input_absinfo { | |||
322 | #define KEY_PAUSECD 201 | 323 | #define KEY_PAUSECD 201 |
323 | #define KEY_PROG3 202 | 324 | #define KEY_PROG3 202 |
324 | #define KEY_PROG4 203 | 325 | #define KEY_PROG4 203 |
326 | #define KEY_DASHBOARD 204 /* AL Dashboard */ | ||
325 | #define KEY_SUSPEND 205 | 327 | #define KEY_SUSPEND 205 |
326 | #define KEY_CLOSE 206 /* AC Close */ | 328 | #define KEY_CLOSE 206 /* AC Close */ |
327 | #define KEY_PLAY 207 | 329 | #define KEY_PLAY 207 |
diff --git a/include/linux/irq.h b/include/linux/irq.h index d058c57be02d..3dddfa703ebd 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h | |||
@@ -63,7 +63,8 @@ typedef void (*irq_flow_handler_t)(unsigned int irq, | |||
63 | #define IRQ_MOVE_PENDING 0x00200000 /* need to re-target IRQ destination */ | 63 | #define IRQ_MOVE_PENDING 0x00200000 /* need to re-target IRQ destination */ |
64 | #define IRQ_NO_BALANCING 0x00400000 /* IRQ is excluded from balancing */ | 64 | #define IRQ_NO_BALANCING 0x00400000 /* IRQ is excluded from balancing */ |
65 | #define IRQ_SPURIOUS_DISABLED 0x00800000 /* IRQ was disabled by the spurious trap */ | 65 | #define IRQ_SPURIOUS_DISABLED 0x00800000 /* IRQ was disabled by the spurious trap */ |
66 | #define IRQ_MOVE_PCNTXT 0x01000000 /* IRQ migration from process context */ | 66 | #define IRQ_MOVE_PCNTXT 0x01000000 /* IRQ migration from process context */ |
67 | #define IRQ_AFFINITY_SET 0x02000000 /* IRQ affinity was set from userspace*/ | ||
67 | 68 | ||
68 | #ifdef CONFIG_IRQ_PER_CPU | 69 | #ifdef CONFIG_IRQ_PER_CPU |
69 | # define CHECK_IRQ_PER_CPU(var) ((var) & IRQ_PER_CPU) | 70 | # define CHECK_IRQ_PER_CPU(var) ((var) & IRQ_PER_CPU) |
@@ -130,7 +131,7 @@ struct irq_chip { | |||
130 | 131 | ||
131 | /** | 132 | /** |
132 | * struct irq_desc - interrupt descriptor | 133 | * struct irq_desc - interrupt descriptor |
133 | * | 134 | * @irq: interrupt number for this descriptor |
134 | * @handle_irq: highlevel irq-events handler [if NULL, __do_IRQ()] | 135 | * @handle_irq: highlevel irq-events handler [if NULL, __do_IRQ()] |
135 | * @chip: low level interrupt hardware access | 136 | * @chip: low level interrupt hardware access |
136 | * @msi_desc: MSI descriptor | 137 | * @msi_desc: MSI descriptor |
@@ -149,7 +150,6 @@ struct irq_chip { | |||
149 | * @cpu: cpu index useful for balancing | 150 | * @cpu: cpu index useful for balancing |
150 | * @pending_mask: pending rebalanced interrupts | 151 | * @pending_mask: pending rebalanced interrupts |
151 | * @dir: /proc/irq/ procfs entry | 152 | * @dir: /proc/irq/ procfs entry |
152 | * @affinity_entry: /proc/irq/smp_affinity procfs entry on SMP | ||
153 | * @name: flow handler name for /proc/interrupts output | 153 | * @name: flow handler name for /proc/interrupts output |
154 | */ | 154 | */ |
155 | struct irq_desc { | 155 | struct irq_desc { |
@@ -210,7 +210,6 @@ extern int setup_irq(unsigned int irq, struct irqaction *new); | |||
210 | 210 | ||
211 | #ifdef CONFIG_GENERIC_PENDING_IRQ | 211 | #ifdef CONFIG_GENERIC_PENDING_IRQ |
212 | 212 | ||
213 | void set_pending_irq(unsigned int irq, cpumask_t mask); | ||
214 | void move_native_irq(int irq); | 213 | void move_native_irq(int irq); |
215 | void move_masked_irq(int irq); | 214 | void move_masked_irq(int irq); |
216 | 215 | ||
@@ -228,10 +227,6 @@ static inline void move_masked_irq(int irq) | |||
228 | { | 227 | { |
229 | } | 228 | } |
230 | 229 | ||
231 | static inline void set_pending_irq(unsigned int irq, cpumask_t mask) | ||
232 | { | ||
233 | } | ||
234 | |||
235 | #endif /* CONFIG_GENERIC_PENDING_IRQ */ | 230 | #endif /* CONFIG_GENERIC_PENDING_IRQ */ |
236 | 231 | ||
237 | #else /* CONFIG_SMP */ | 232 | #else /* CONFIG_SMP */ |
diff --git a/include/linux/kernel.h b/include/linux/kernel.h index 69a9bfdf9c86..6a5c75cee5bc 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h | |||
@@ -327,32 +327,36 @@ static inline char *pack_hex_byte(char *buf, u8 byte) | |||
327 | return buf; | 327 | return buf; |
328 | } | 328 | } |
329 | 329 | ||
330 | #define pr_emerg(fmt, arg...) \ | 330 | #ifndef pr_fmt |
331 | printk(KERN_EMERG fmt, ##arg) | 331 | #define pr_fmt(fmt) fmt |
332 | #define pr_alert(fmt, arg...) \ | 332 | #endif |
333 | printk(KERN_ALERT fmt, ##arg) | 333 | |
334 | #define pr_crit(fmt, arg...) \ | 334 | #define pr_emerg(fmt, ...) \ |
335 | printk(KERN_CRIT fmt, ##arg) | 335 | printk(KERN_EMERG pr_fmt(fmt), ##__VA_ARGS__) |
336 | #define pr_err(fmt, arg...) \ | 336 | #define pr_alert(fmt, ...) \ |
337 | printk(KERN_ERR fmt, ##arg) | 337 | printk(KERN_ALERT pr_fmt(fmt), ##__VA_ARGS__) |
338 | #define pr_warning(fmt, arg...) \ | 338 | #define pr_crit(fmt, ...) \ |
339 | printk(KERN_WARNING fmt, ##arg) | 339 | printk(KERN_CRIT pr_fmt(fmt), ##__VA_ARGS__) |
340 | #define pr_notice(fmt, arg...) \ | 340 | #define pr_err(fmt, ...) \ |
341 | printk(KERN_NOTICE fmt, ##arg) | 341 | printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__) |
342 | #define pr_info(fmt, arg...) \ | 342 | #define pr_warning(fmt, ...) \ |
343 | printk(KERN_INFO fmt, ##arg) | 343 | printk(KERN_WARNING pr_fmt(fmt), ##__VA_ARGS__) |
344 | #define pr_notice(fmt, ...) \ | ||
345 | printk(KERN_NOTICE pr_fmt(fmt), ##__VA_ARGS__) | ||
346 | #define pr_info(fmt, ...) \ | ||
347 | printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__) | ||
344 | 348 | ||
345 | /* If you are writing a driver, please use dev_dbg instead */ | 349 | /* If you are writing a driver, please use dev_dbg instead */ |
346 | #if defined(CONFIG_DYNAMIC_PRINTK_DEBUG) | 350 | #if defined(CONFIG_DYNAMIC_PRINTK_DEBUG) |
347 | #define pr_debug(fmt, ...) do { \ | 351 | #define pr_debug(fmt, ...) do { \ |
348 | dynamic_pr_debug(fmt, ##__VA_ARGS__); \ | 352 | dynamic_pr_debug(pr_fmt(fmt), ##__VA_ARGS__); \ |
349 | } while (0) | 353 | } while (0) |
350 | #elif defined(DEBUG) | 354 | #elif defined(DEBUG) |
351 | #define pr_debug(fmt, arg...) \ | 355 | #define pr_debug(fmt, ...) \ |
352 | printk(KERN_DEBUG fmt, ##arg) | 356 | printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__) |
353 | #else | 357 | #else |
354 | #define pr_debug(fmt, arg...) \ | 358 | #define pr_debug(fmt, ...) \ |
355 | ({ if (0) printk(KERN_DEBUG fmt, ##arg); 0; }) | 359 | ({ if (0) printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); 0; }) |
356 | #endif | 360 | #endif |
357 | 361 | ||
358 | /* | 362 | /* |
diff --git a/include/linux/libata.h b/include/linux/libata.h index 59b0f1c807b5..ed3f26eb5df1 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
@@ -375,6 +375,7 @@ enum { | |||
375 | ATA_HORKAGE_BRIDGE_OK = (1 << 10), /* no bridge limits */ | 375 | ATA_HORKAGE_BRIDGE_OK = (1 << 10), /* no bridge limits */ |
376 | ATA_HORKAGE_ATAPI_MOD16_DMA = (1 << 11), /* use ATAPI DMA for commands | 376 | ATA_HORKAGE_ATAPI_MOD16_DMA = (1 << 11), /* use ATAPI DMA for commands |
377 | not multiple of 16 bytes */ | 377 | not multiple of 16 bytes */ |
378 | ATA_HORKAGE_FIRMWARE_WARN = (1 << 12), /* firwmare update warning */ | ||
378 | 379 | ||
379 | /* DMA mask for user DMA control: User visible values; DO NOT | 380 | /* DMA mask for user DMA control: User visible values; DO NOT |
380 | renumber */ | 381 | renumber */ |
diff --git a/include/linux/memory.h b/include/linux/memory.h index 2f5f8a5ef2a0..36c82c9e6ea7 100644 --- a/include/linux/memory.h +++ b/include/linux/memory.h | |||
@@ -91,7 +91,7 @@ extern int memory_notify(unsigned long val, void *v); | |||
91 | 91 | ||
92 | #ifdef CONFIG_MEMORY_HOTPLUG | 92 | #ifdef CONFIG_MEMORY_HOTPLUG |
93 | #define hotplug_memory_notifier(fn, pri) { \ | 93 | #define hotplug_memory_notifier(fn, pri) { \ |
94 | static struct notifier_block fn##_mem_nb = \ | 94 | static __meminitdata struct notifier_block fn##_mem_nb =\ |
95 | { .notifier_call = fn, .priority = pri }; \ | 95 | { .notifier_call = fn, .priority = pri }; \ |
96 | register_memory_notifier(&fn##_mem_nb); \ | 96 | register_memory_notifier(&fn##_mem_nb); \ |
97 | } | 97 | } |
diff --git a/include/linux/mfd/wm8350/rtc.h b/include/linux/mfd/wm8350/rtc.h index dfda69e9f440..24add2bef6c9 100644 --- a/include/linux/mfd/wm8350/rtc.h +++ b/include/linux/mfd/wm8350/rtc.h | |||
@@ -261,6 +261,8 @@ | |||
261 | 261 | ||
262 | struct wm8350_rtc { | 262 | struct wm8350_rtc { |
263 | struct platform_device *pdev; | 263 | struct platform_device *pdev; |
264 | struct rtc_device *rtc; | ||
265 | int alarm_enabled; /* used over suspend/resume */ | ||
264 | }; | 266 | }; |
265 | 267 | ||
266 | #endif | 268 | #endif |
diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h index bd9977b89490..371086fd946f 100644 --- a/include/linux/mlx4/device.h +++ b/include/linux/mlx4/device.h | |||
@@ -179,6 +179,7 @@ struct mlx4_caps { | |||
179 | int num_ports; | 179 | int num_ports; |
180 | int vl_cap[MLX4_MAX_PORTS + 1]; | 180 | int vl_cap[MLX4_MAX_PORTS + 1]; |
181 | int ib_mtu_cap[MLX4_MAX_PORTS + 1]; | 181 | int ib_mtu_cap[MLX4_MAX_PORTS + 1]; |
182 | __be32 ib_port_def_cap[MLX4_MAX_PORTS + 1]; | ||
182 | u64 def_mac[MLX4_MAX_PORTS + 1]; | 183 | u64 def_mac[MLX4_MAX_PORTS + 1]; |
183 | int eth_mtu_cap[MLX4_MAX_PORTS + 1]; | 184 | int eth_mtu_cap[MLX4_MAX_PORTS + 1]; |
184 | int gid_table_len[MLX4_MAX_PORTS + 1]; | 185 | int gid_table_len[MLX4_MAX_PORTS + 1]; |
diff --git a/include/linux/net.h b/include/linux/net.h index 6dc14a240042..4515efae4c39 100644 --- a/include/linux/net.h +++ b/include/linux/net.h | |||
@@ -40,7 +40,7 @@ | |||
40 | #define SYS_GETSOCKOPT 15 /* sys_getsockopt(2) */ | 40 | #define SYS_GETSOCKOPT 15 /* sys_getsockopt(2) */ |
41 | #define SYS_SENDMSG 16 /* sys_sendmsg(2) */ | 41 | #define SYS_SENDMSG 16 /* sys_sendmsg(2) */ |
42 | #define SYS_RECVMSG 17 /* sys_recvmsg(2) */ | 42 | #define SYS_RECVMSG 17 /* sys_recvmsg(2) */ |
43 | #define SYS_PACCEPT 18 /* sys_paccept(2) */ | 43 | #define SYS_ACCEPT4 18 /* sys_accept4(2) */ |
44 | 44 | ||
45 | typedef enum { | 45 | typedef enum { |
46 | SS_FREE = 0, /* not allocated */ | 46 | SS_FREE = 0, /* not allocated */ |
@@ -100,7 +100,7 @@ enum sock_type { | |||
100 | * remaining bits are used as flags. */ | 100 | * remaining bits are used as flags. */ |
101 | #define SOCK_TYPE_MASK 0xf | 101 | #define SOCK_TYPE_MASK 0xf |
102 | 102 | ||
103 | /* Flags for socket, socketpair, paccept */ | 103 | /* Flags for socket, socketpair, accept4 */ |
104 | #define SOCK_CLOEXEC O_CLOEXEC | 104 | #define SOCK_CLOEXEC O_CLOEXEC |
105 | #ifndef SOCK_NONBLOCK | 105 | #ifndef SOCK_NONBLOCK |
106 | #define SOCK_NONBLOCK O_NONBLOCK | 106 | #define SOCK_NONBLOCK O_NONBLOCK |
@@ -223,8 +223,6 @@ extern int sock_map_fd(struct socket *sock, int flags); | |||
223 | extern struct socket *sockfd_lookup(int fd, int *err); | 223 | extern struct socket *sockfd_lookup(int fd, int *err); |
224 | #define sockfd_put(sock) fput(sock->file) | 224 | #define sockfd_put(sock) fput(sock->file) |
225 | extern int net_ratelimit(void); | 225 | extern int net_ratelimit(void); |
226 | extern long do_accept(int fd, struct sockaddr __user *upeer_sockaddr, | ||
227 | int __user *upeer_addrlen, int flags); | ||
228 | 226 | ||
229 | #define net_random() random32() | 227 | #define net_random() random32() |
230 | #define net_srandom(seed) srandom32((__force u32)seed) | 228 | #define net_srandom(seed) srandom32((__force u32)seed) |
diff --git a/include/linux/page_cgroup.h b/include/linux/page_cgroup.h index f546ad6fc028..1e6d34bfa094 100644 --- a/include/linux/page_cgroup.h +++ b/include/linux/page_cgroup.h | |||
@@ -17,7 +17,7 @@ struct page_cgroup { | |||
17 | struct list_head lru; /* per cgroup LRU list */ | 17 | struct list_head lru; /* per cgroup LRU list */ |
18 | }; | 18 | }; |
19 | 19 | ||
20 | void __init pgdat_page_cgroup_init(struct pglist_data *pgdat); | 20 | void __meminit pgdat_page_cgroup_init(struct pglist_data *pgdat); |
21 | void __init page_cgroup_init(void); | 21 | void __init page_cgroup_init(void); |
22 | struct page_cgroup *lookup_page_cgroup(struct page *page); | 22 | struct page_cgroup *lookup_page_cgroup(struct page *page); |
23 | 23 | ||
@@ -91,7 +91,7 @@ static inline void unlock_page_cgroup(struct page_cgroup *pc) | |||
91 | #else /* CONFIG_CGROUP_MEM_RES_CTLR */ | 91 | #else /* CONFIG_CGROUP_MEM_RES_CTLR */ |
92 | struct page_cgroup; | 92 | struct page_cgroup; |
93 | 93 | ||
94 | static inline void pgdat_page_cgroup_init(struct pglist_data *pgdat) | 94 | static inline void __meminit pgdat_page_cgroup_init(struct pglist_data *pgdat) |
95 | { | 95 | { |
96 | } | 96 | } |
97 | 97 | ||
diff --git a/include/linux/ratelimit.h b/include/linux/ratelimit.h index 18a5b9ba9d40..00044b856453 100644 --- a/include/linux/ratelimit.h +++ b/include/linux/ratelimit.h | |||
@@ -17,11 +17,4 @@ struct ratelimit_state { | |||
17 | struct ratelimit_state name = {interval, burst,} | 17 | struct ratelimit_state name = {interval, burst,} |
18 | 18 | ||
19 | extern int __ratelimit(struct ratelimit_state *rs); | 19 | extern int __ratelimit(struct ratelimit_state *rs); |
20 | |||
21 | static inline int ratelimit(void) | ||
22 | { | ||
23 | static DEFINE_RATELIMIT_STATE(rs, DEFAULT_RATELIMIT_INTERVAL, | ||
24 | DEFAULT_RATELIMIT_BURST); | ||
25 | return __ratelimit(&rs); | ||
26 | } | ||
27 | #endif | 20 | #endif |
diff --git a/include/linux/ring_buffer.h b/include/linux/ring_buffer.h index 536b0ca46a03..e097c2e6b6dc 100644 --- a/include/linux/ring_buffer.h +++ b/include/linux/ring_buffer.h | |||
@@ -120,6 +120,9 @@ unsigned long ring_buffer_overruns(struct ring_buffer *buffer); | |||
120 | u64 ring_buffer_time_stamp(int cpu); | 120 | u64 ring_buffer_time_stamp(int cpu); |
121 | void ring_buffer_normalize_time_stamp(int cpu, u64 *ts); | 121 | void ring_buffer_normalize_time_stamp(int cpu, u64 *ts); |
122 | 122 | ||
123 | void tracing_on(void); | ||
124 | void tracing_off(void); | ||
125 | |||
123 | enum ring_buffer_flags { | 126 | enum ring_buffer_flags { |
124 | RB_FL_OVERWRITE = 1 << 0, | 127 | RB_FL_OVERWRITE = 1 << 0, |
125 | }; | 128 | }; |
diff --git a/include/linux/sched.h b/include/linux/sched.h index 644ffbda17ca..55e30d114477 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
@@ -630,6 +630,10 @@ struct user_struct { | |||
630 | atomic_t inotify_watches; /* How many inotify watches does this user have? */ | 630 | atomic_t inotify_watches; /* How many inotify watches does this user have? */ |
631 | atomic_t inotify_devs; /* How many inotify devs does this user have opened? */ | 631 | atomic_t inotify_devs; /* How many inotify devs does this user have opened? */ |
632 | #endif | 632 | #endif |
633 | #ifdef CONFIG_EPOLL | ||
634 | atomic_t epoll_devs; /* The number of epoll descriptors currently open */ | ||
635 | atomic_t epoll_watches; /* The number of file descriptors currently watched */ | ||
636 | #endif | ||
633 | #ifdef CONFIG_POSIX_MQUEUE | 637 | #ifdef CONFIG_POSIX_MQUEUE |
634 | /* protected by mq_lock */ | 638 | /* protected by mq_lock */ |
635 | unsigned long mq_bytes; /* How many bytes can be allocated to mqueue? */ | 639 | unsigned long mq_bytes; /* How many bytes can be allocated to mqueue? */ |
diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h index e27f216361fc..4e4f1277f3bf 100644 --- a/include/linux/serial_core.h +++ b/include/linux/serial_core.h | |||
@@ -155,6 +155,9 @@ | |||
155 | 155 | ||
156 | #define PORT_SC26XX 82 | 156 | #define PORT_SC26XX 82 |
157 | 157 | ||
158 | /* SH-SCI */ | ||
159 | #define PORT_SCIFA 83 | ||
160 | |||
158 | #ifdef __KERNEL__ | 161 | #ifdef __KERNEL__ |
159 | 162 | ||
160 | #include <linux/compiler.h> | 163 | #include <linux/compiler.h> |
diff --git a/include/linux/slab.h b/include/linux/slab.h index ba965c84ae06..000da12b5cf0 100644 --- a/include/linux/slab.h +++ b/include/linux/slab.h | |||
@@ -23,6 +23,34 @@ | |||
23 | #define SLAB_CACHE_DMA 0x00004000UL /* Use GFP_DMA memory */ | 23 | #define SLAB_CACHE_DMA 0x00004000UL /* Use GFP_DMA memory */ |
24 | #define SLAB_STORE_USER 0x00010000UL /* DEBUG: Store the last owner for bug hunting */ | 24 | #define SLAB_STORE_USER 0x00010000UL /* DEBUG: Store the last owner for bug hunting */ |
25 | #define SLAB_PANIC 0x00040000UL /* Panic if kmem_cache_create() fails */ | 25 | #define SLAB_PANIC 0x00040000UL /* Panic if kmem_cache_create() fails */ |
26 | /* | ||
27 | * SLAB_DESTROY_BY_RCU - **WARNING** READ THIS! | ||
28 | * | ||
29 | * This delays freeing the SLAB page by a grace period, it does _NOT_ | ||
30 | * delay object freeing. This means that if you do kmem_cache_free() | ||
31 | * that memory location is free to be reused at any time. Thus it may | ||
32 | * be possible to see another object there in the same RCU grace period. | ||
33 | * | ||
34 | * This feature only ensures the memory location backing the object | ||
35 | * stays valid, the trick to using this is relying on an independent | ||
36 | * object validation pass. Something like: | ||
37 | * | ||
38 | * rcu_read_lock() | ||
39 | * again: | ||
40 | * obj = lockless_lookup(key); | ||
41 | * if (obj) { | ||
42 | * if (!try_get_ref(obj)) // might fail for free objects | ||
43 | * goto again; | ||
44 | * | ||
45 | * if (obj->key != key) { // not the object we expected | ||
46 | * put_ref(obj); | ||
47 | * goto again; | ||
48 | * } | ||
49 | * } | ||
50 | * rcu_read_unlock(); | ||
51 | * | ||
52 | * See also the comment on struct slab_rcu in mm/slab.c. | ||
53 | */ | ||
26 | #define SLAB_DESTROY_BY_RCU 0x00080000UL /* Defer freeing slabs to RCU */ | 54 | #define SLAB_DESTROY_BY_RCU 0x00080000UL /* Defer freeing slabs to RCU */ |
27 | #define SLAB_MEM_SPREAD 0x00100000UL /* Spread some memory over cpuset */ | 55 | #define SLAB_MEM_SPREAD 0x00100000UL /* Spread some memory over cpuset */ |
28 | #define SLAB_TRACE 0x00200000UL /* Trace allocations and frees */ | 56 | #define SLAB_TRACE 0x00200000UL /* Trace allocations and frees */ |
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index d6ff145919ca..04fb47bfb920 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h | |||
@@ -410,8 +410,7 @@ asmlinkage long sys_getsockopt(int fd, int level, int optname, | |||
410 | asmlinkage long sys_bind(int, struct sockaddr __user *, int); | 410 | asmlinkage long sys_bind(int, struct sockaddr __user *, int); |
411 | asmlinkage long sys_connect(int, struct sockaddr __user *, int); | 411 | asmlinkage long sys_connect(int, struct sockaddr __user *, int); |
412 | asmlinkage long sys_accept(int, struct sockaddr __user *, int __user *); | 412 | asmlinkage long sys_accept(int, struct sockaddr __user *, int __user *); |
413 | asmlinkage long sys_paccept(int, struct sockaddr __user *, int __user *, | 413 | asmlinkage long sys_accept4(int, struct sockaddr __user *, int __user *, int); |
414 | const __user sigset_t *, size_t, int); | ||
415 | asmlinkage long sys_getsockname(int, struct sockaddr __user *, int __user *); | 414 | asmlinkage long sys_getsockname(int, struct sockaddr __user *, int __user *); |
416 | asmlinkage long sys_getpeername(int, struct sockaddr __user *, int __user *); | 415 | asmlinkage long sys_getpeername(int, struct sockaddr __user *, int __user *); |
417 | asmlinkage long sys_send(int, void __user *, size_t, unsigned); | 416 | asmlinkage long sys_send(int, void __user *, size_t, unsigned); |
diff --git a/include/linux/usb.h b/include/linux/usb.h index 8fa973bede5e..f72aa51f7bcd 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h | |||
@@ -108,6 +108,7 @@ enum usb_interface_condition { | |||
108 | * (in probe()), bound to a driver, or unbinding (in disconnect()) | 108 | * (in probe()), bound to a driver, or unbinding (in disconnect()) |
109 | * @is_active: flag set when the interface is bound and not suspended. | 109 | * @is_active: flag set when the interface is bound and not suspended. |
110 | * @sysfs_files_created: sysfs attributes exist | 110 | * @sysfs_files_created: sysfs attributes exist |
111 | * @unregistering: flag set when the interface is being unregistered | ||
111 | * @needs_remote_wakeup: flag set when the driver requires remote-wakeup | 112 | * @needs_remote_wakeup: flag set when the driver requires remote-wakeup |
112 | * capability during autosuspend. | 113 | * capability during autosuspend. |
113 | * @needs_altsetting0: flag set when a set-interface request for altsetting 0 | 114 | * @needs_altsetting0: flag set when a set-interface request for altsetting 0 |
@@ -163,6 +164,7 @@ struct usb_interface { | |||
163 | enum usb_interface_condition condition; /* state of binding */ | 164 | enum usb_interface_condition condition; /* state of binding */ |
164 | unsigned is_active:1; /* the interface is not suspended */ | 165 | unsigned is_active:1; /* the interface is not suspended */ |
165 | unsigned sysfs_files_created:1; /* the sysfs attributes exist */ | 166 | unsigned sysfs_files_created:1; /* the sysfs attributes exist */ |
167 | unsigned unregistering:1; /* unregistration is in progress */ | ||
166 | unsigned needs_remote_wakeup:1; /* driver requires remote wakeup */ | 168 | unsigned needs_remote_wakeup:1; /* driver requires remote wakeup */ |
167 | unsigned needs_altsetting0:1; /* switch to altsetting 0 is pending */ | 169 | unsigned needs_altsetting0:1; /* switch to altsetting 0 is pending */ |
168 | unsigned needs_binding:1; /* needs delayed unbind/rebind */ | 170 | unsigned needs_binding:1; /* needs delayed unbind/rebind */ |
diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 8856e2d60e9f..73d81bc6aa75 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h | |||
@@ -74,14 +74,6 @@ | |||
74 | */ | 74 | */ |
75 | 75 | ||
76 | /** | 76 | /** |
77 | * enum ieee80211_notification_type - Low level driver notification | ||
78 | * @IEEE80211_NOTIFY_RE_ASSOC: start the re-association sequence | ||
79 | */ | ||
80 | enum ieee80211_notification_types { | ||
81 | IEEE80211_NOTIFY_RE_ASSOC, | ||
82 | }; | ||
83 | |||
84 | /** | ||
85 | * struct ieee80211_ht_bss_info - describing BSS's HT characteristics | 77 | * struct ieee80211_ht_bss_info - describing BSS's HT characteristics |
86 | * | 78 | * |
87 | * This structure describes most essential parameters needed | 79 | * This structure describes most essential parameters needed |
@@ -1798,18 +1790,6 @@ void ieee80211_stop_tx_ba_cb_irqsafe(struct ieee80211_hw *hw, const u8 *ra, | |||
1798 | u16 tid); | 1790 | u16 tid); |
1799 | 1791 | ||
1800 | /** | 1792 | /** |
1801 | * ieee80211_notify_mac - low level driver notification | ||
1802 | * @hw: pointer as obtained from ieee80211_alloc_hw(). | ||
1803 | * @notif_type: enum ieee80211_notification_types | ||
1804 | * | ||
1805 | * This function must be called by low level driver to inform mac80211 of | ||
1806 | * low level driver status change or force mac80211 to re-assoc for low | ||
1807 | * level driver internal error that require re-assoc. | ||
1808 | */ | ||
1809 | void ieee80211_notify_mac(struct ieee80211_hw *hw, | ||
1810 | enum ieee80211_notification_types notif_type); | ||
1811 | |||
1812 | /** | ||
1813 | * ieee80211_find_sta - find a station | 1793 | * ieee80211_find_sta - find a station |
1814 | * | 1794 | * |
1815 | * @hw: pointer as obtained from ieee80211_alloc_hw() | 1795 | * @hw: pointer as obtained from ieee80211_alloc_hw() |
diff --git a/include/video/atmel_lcdc.h b/include/video/atmel_lcdc.h index 6ad87f485992..0c864db1a466 100644 --- a/include/video/atmel_lcdc.h +++ b/include/video/atmel_lcdc.h | |||
@@ -38,7 +38,7 @@ struct atmel_lcdfb_info { | |||
38 | spinlock_t lock; | 38 | spinlock_t lock; |
39 | struct fb_info *info; | 39 | struct fb_info *info; |
40 | void __iomem *mmio; | 40 | void __iomem *mmio; |
41 | unsigned long irq_base; | 41 | int irq_base; |
42 | struct work_struct task; | 42 | struct work_struct task; |
43 | 43 | ||
44 | unsigned int guard_time; | 44 | unsigned int guard_time; |
diff --git a/init/Kconfig b/init/Kconfig index 86b00c53fade..f763762d544a 100644 --- a/init/Kconfig +++ b/init/Kconfig | |||
@@ -354,7 +354,7 @@ config RT_GROUP_SCHED | |||
354 | setting below. If enabled, it will also make it impossible to | 354 | setting below. If enabled, it will also make it impossible to |
355 | schedule realtime tasks for non-root users until you allocate | 355 | schedule realtime tasks for non-root users until you allocate |
356 | realtime bandwidth for them. | 356 | realtime bandwidth for them. |
357 | See Documentation/sched-rt-group.txt for more information. | 357 | See Documentation/scheduler/sched-rt-group.txt for more information. |
358 | 358 | ||
359 | choice | 359 | choice |
360 | depends on GROUP_SCHED | 360 | depends on GROUP_SCHED |
@@ -771,8 +771,7 @@ config SLAB | |||
771 | help | 771 | help |
772 | The regular slab allocator that is established and known to work | 772 | The regular slab allocator that is established and known to work |
773 | well in all environments. It organizes cache hot objects in | 773 | well in all environments. It organizes cache hot objects in |
774 | per cpu and per node queues. SLAB is the default choice for | 774 | per cpu and per node queues. |
775 | a slab allocator. | ||
776 | 775 | ||
777 | config SLUB | 776 | config SLUB |
778 | bool "SLUB (Unqueued Allocator)" | 777 | bool "SLUB (Unqueued Allocator)" |
@@ -781,7 +780,8 @@ config SLUB | |||
781 | instead of managing queues of cached objects (SLAB approach). | 780 | instead of managing queues of cached objects (SLAB approach). |
782 | Per cpu caching is realized using slabs of objects instead | 781 | Per cpu caching is realized using slabs of objects instead |
783 | of queues of objects. SLUB can use memory efficiently | 782 | of queues of objects. SLUB can use memory efficiently |
784 | and has enhanced diagnostics. | 783 | and has enhanced diagnostics. SLUB is the default choice for |
784 | a slab allocator. | ||
785 | 785 | ||
786 | config SLOB | 786 | config SLOB |
787 | depends on EMBEDDED | 787 | depends on EMBEDDED |
diff --git a/ipc/util.c b/ipc/util.c index 49b3ea615dc5..361fd1c96fcf 100644 --- a/ipc/util.c +++ b/ipc/util.c | |||
@@ -266,9 +266,17 @@ int ipc_addid(struct ipc_ids* ids, struct kern_ipc_perm* new, int size) | |||
266 | if (ids->in_use >= size) | 266 | if (ids->in_use >= size) |
267 | return -ENOSPC; | 267 | return -ENOSPC; |
268 | 268 | ||
269 | spin_lock_init(&new->lock); | ||
270 | new->deleted = 0; | ||
271 | rcu_read_lock(); | ||
272 | spin_lock(&new->lock); | ||
273 | |||
269 | err = idr_get_new(&ids->ipcs_idr, new, &id); | 274 | err = idr_get_new(&ids->ipcs_idr, new, &id); |
270 | if (err) | 275 | if (err) { |
276 | spin_unlock(&new->lock); | ||
277 | rcu_read_unlock(); | ||
271 | return err; | 278 | return err; |
279 | } | ||
272 | 280 | ||
273 | ids->in_use++; | 281 | ids->in_use++; |
274 | 282 | ||
@@ -280,10 +288,6 @@ int ipc_addid(struct ipc_ids* ids, struct kern_ipc_perm* new, int size) | |||
280 | ids->seq = 0; | 288 | ids->seq = 0; |
281 | 289 | ||
282 | new->id = ipc_buildid(id, new->seq); | 290 | new->id = ipc_buildid(id, new->seq); |
283 | spin_lock_init(&new->lock); | ||
284 | new->deleted = 0; | ||
285 | rcu_read_lock(); | ||
286 | spin_lock(&new->lock); | ||
287 | return id; | 291 | return id; |
288 | } | 292 | } |
289 | 293 | ||
diff --git a/kernel/Makefile b/kernel/Makefile index 9a3ec66a9d84..19fad003b19d 100644 --- a/kernel/Makefile +++ b/kernel/Makefile | |||
@@ -11,8 +11,6 @@ obj-y = sched.o fork.o exec_domain.o panic.o printk.o \ | |||
11 | hrtimer.o rwsem.o nsproxy.o srcu.o semaphore.o \ | 11 | hrtimer.o rwsem.o nsproxy.o srcu.o semaphore.o \ |
12 | notifier.o ksysfs.o pm_qos_params.o sched_clock.o | 12 | notifier.o ksysfs.o pm_qos_params.o sched_clock.o |
13 | 13 | ||
14 | CFLAGS_REMOVE_sched.o = -mno-spe | ||
15 | |||
16 | ifdef CONFIG_FUNCTION_TRACER | 14 | ifdef CONFIG_FUNCTION_TRACER |
17 | # Do not trace debug files and internal ftrace files | 15 | # Do not trace debug files and internal ftrace files |
18 | CFLAGS_REMOVE_lockdep.o = -pg | 16 | CFLAGS_REMOVE_lockdep.o = -pg |
@@ -21,7 +19,7 @@ CFLAGS_REMOVE_mutex-debug.o = -pg | |||
21 | CFLAGS_REMOVE_rtmutex-debug.o = -pg | 19 | CFLAGS_REMOVE_rtmutex-debug.o = -pg |
22 | CFLAGS_REMOVE_cgroup-debug.o = -pg | 20 | CFLAGS_REMOVE_cgroup-debug.o = -pg |
23 | CFLAGS_REMOVE_sched_clock.o = -pg | 21 | CFLAGS_REMOVE_sched_clock.o = -pg |
24 | CFLAGS_REMOVE_sched.o = -mno-spe -pg | 22 | CFLAGS_REMOVE_sched.o = -pg |
25 | endif | 23 | endif |
26 | 24 | ||
27 | obj-$(CONFIG_FREEZER) += freezer.o | 25 | obj-$(CONFIG_FREEZER) += freezer.o |
diff --git a/kernel/audit_tree.c b/kernel/audit_tree.c index 8ba0e0d934f2..8b509441f49a 100644 --- a/kernel/audit_tree.c +++ b/kernel/audit_tree.c | |||
@@ -24,6 +24,7 @@ struct audit_chunk { | |||
24 | struct list_head trees; /* with root here */ | 24 | struct list_head trees; /* with root here */ |
25 | int dead; | 25 | int dead; |
26 | int count; | 26 | int count; |
27 | atomic_long_t refs; | ||
27 | struct rcu_head head; | 28 | struct rcu_head head; |
28 | struct node { | 29 | struct node { |
29 | struct list_head list; | 30 | struct list_head list; |
@@ -56,7 +57,8 @@ static LIST_HEAD(prune_list); | |||
56 | * tree is refcounted; one reference for "some rules on rules_list refer to | 57 | * tree is refcounted; one reference for "some rules on rules_list refer to |
57 | * it", one for each chunk with pointer to it. | 58 | * it", one for each chunk with pointer to it. |
58 | * | 59 | * |
59 | * chunk is refcounted by embedded inotify_watch. | 60 | * chunk is refcounted by embedded inotify_watch + .refs (non-zero refcount |
61 | * of watch contributes 1 to .refs). | ||
60 | * | 62 | * |
61 | * node.index allows to get from node.list to containing chunk. | 63 | * node.index allows to get from node.list to containing chunk. |
62 | * MSB of that sucker is stolen to mark taggings that we might have to | 64 | * MSB of that sucker is stolen to mark taggings that we might have to |
@@ -121,6 +123,7 @@ static struct audit_chunk *alloc_chunk(int count) | |||
121 | INIT_LIST_HEAD(&chunk->hash); | 123 | INIT_LIST_HEAD(&chunk->hash); |
122 | INIT_LIST_HEAD(&chunk->trees); | 124 | INIT_LIST_HEAD(&chunk->trees); |
123 | chunk->count = count; | 125 | chunk->count = count; |
126 | atomic_long_set(&chunk->refs, 1); | ||
124 | for (i = 0; i < count; i++) { | 127 | for (i = 0; i < count; i++) { |
125 | INIT_LIST_HEAD(&chunk->owners[i].list); | 128 | INIT_LIST_HEAD(&chunk->owners[i].list); |
126 | chunk->owners[i].index = i; | 129 | chunk->owners[i].index = i; |
@@ -129,9 +132,8 @@ static struct audit_chunk *alloc_chunk(int count) | |||
129 | return chunk; | 132 | return chunk; |
130 | } | 133 | } |
131 | 134 | ||
132 | static void __free_chunk(struct rcu_head *rcu) | 135 | static void free_chunk(struct audit_chunk *chunk) |
133 | { | 136 | { |
134 | struct audit_chunk *chunk = container_of(rcu, struct audit_chunk, head); | ||
135 | int i; | 137 | int i; |
136 | 138 | ||
137 | for (i = 0; i < chunk->count; i++) { | 139 | for (i = 0; i < chunk->count; i++) { |
@@ -141,14 +143,16 @@ static void __free_chunk(struct rcu_head *rcu) | |||
141 | kfree(chunk); | 143 | kfree(chunk); |
142 | } | 144 | } |
143 | 145 | ||
144 | static inline void free_chunk(struct audit_chunk *chunk) | 146 | void audit_put_chunk(struct audit_chunk *chunk) |
145 | { | 147 | { |
146 | call_rcu(&chunk->head, __free_chunk); | 148 | if (atomic_long_dec_and_test(&chunk->refs)) |
149 | free_chunk(chunk); | ||
147 | } | 150 | } |
148 | 151 | ||
149 | void audit_put_chunk(struct audit_chunk *chunk) | 152 | static void __put_chunk(struct rcu_head *rcu) |
150 | { | 153 | { |
151 | put_inotify_watch(&chunk->watch); | 154 | struct audit_chunk *chunk = container_of(rcu, struct audit_chunk, head); |
155 | audit_put_chunk(chunk); | ||
152 | } | 156 | } |
153 | 157 | ||
154 | enum {HASH_SIZE = 128}; | 158 | enum {HASH_SIZE = 128}; |
@@ -176,7 +180,7 @@ struct audit_chunk *audit_tree_lookup(const struct inode *inode) | |||
176 | 180 | ||
177 | list_for_each_entry_rcu(p, list, hash) { | 181 | list_for_each_entry_rcu(p, list, hash) { |
178 | if (p->watch.inode == inode) { | 182 | if (p->watch.inode == inode) { |
179 | get_inotify_watch(&p->watch); | 183 | atomic_long_inc(&p->refs); |
180 | return p; | 184 | return p; |
181 | } | 185 | } |
182 | } | 186 | } |
@@ -194,17 +198,49 @@ int audit_tree_match(struct audit_chunk *chunk, struct audit_tree *tree) | |||
194 | 198 | ||
195 | /* tagging and untagging inodes with trees */ | 199 | /* tagging and untagging inodes with trees */ |
196 | 200 | ||
197 | static void untag_chunk(struct audit_chunk *chunk, struct node *p) | 201 | static struct audit_chunk *find_chunk(struct node *p) |
202 | { | ||
203 | int index = p->index & ~(1U<<31); | ||
204 | p -= index; | ||
205 | return container_of(p, struct audit_chunk, owners[0]); | ||
206 | } | ||
207 | |||
208 | static void untag_chunk(struct node *p) | ||
198 | { | 209 | { |
210 | struct audit_chunk *chunk = find_chunk(p); | ||
199 | struct audit_chunk *new; | 211 | struct audit_chunk *new; |
200 | struct audit_tree *owner; | 212 | struct audit_tree *owner; |
201 | int size = chunk->count - 1; | 213 | int size = chunk->count - 1; |
202 | int i, j; | 214 | int i, j; |
203 | 215 | ||
216 | if (!pin_inotify_watch(&chunk->watch)) { | ||
217 | /* | ||
218 | * Filesystem is shutting down; all watches are getting | ||
219 | * evicted, just take it off the node list for this | ||
220 | * tree and let the eviction logics take care of the | ||
221 | * rest. | ||
222 | */ | ||
223 | owner = p->owner; | ||
224 | if (owner->root == chunk) { | ||
225 | list_del_init(&owner->same_root); | ||
226 | owner->root = NULL; | ||
227 | } | ||
228 | list_del_init(&p->list); | ||
229 | p->owner = NULL; | ||
230 | put_tree(owner); | ||
231 | return; | ||
232 | } | ||
233 | |||
234 | spin_unlock(&hash_lock); | ||
235 | |||
236 | /* | ||
237 | * pin_inotify_watch() succeeded, so the watch won't go away | ||
238 | * from under us. | ||
239 | */ | ||
204 | mutex_lock(&chunk->watch.inode->inotify_mutex); | 240 | mutex_lock(&chunk->watch.inode->inotify_mutex); |
205 | if (chunk->dead) { | 241 | if (chunk->dead) { |
206 | mutex_unlock(&chunk->watch.inode->inotify_mutex); | 242 | mutex_unlock(&chunk->watch.inode->inotify_mutex); |
207 | return; | 243 | goto out; |
208 | } | 244 | } |
209 | 245 | ||
210 | owner = p->owner; | 246 | owner = p->owner; |
@@ -221,7 +257,7 @@ static void untag_chunk(struct audit_chunk *chunk, struct node *p) | |||
221 | inotify_evict_watch(&chunk->watch); | 257 | inotify_evict_watch(&chunk->watch); |
222 | mutex_unlock(&chunk->watch.inode->inotify_mutex); | 258 | mutex_unlock(&chunk->watch.inode->inotify_mutex); |
223 | put_inotify_watch(&chunk->watch); | 259 | put_inotify_watch(&chunk->watch); |
224 | return; | 260 | goto out; |
225 | } | 261 | } |
226 | 262 | ||
227 | new = alloc_chunk(size); | 263 | new = alloc_chunk(size); |
@@ -263,7 +299,7 @@ static void untag_chunk(struct audit_chunk *chunk, struct node *p) | |||
263 | inotify_evict_watch(&chunk->watch); | 299 | inotify_evict_watch(&chunk->watch); |
264 | mutex_unlock(&chunk->watch.inode->inotify_mutex); | 300 | mutex_unlock(&chunk->watch.inode->inotify_mutex); |
265 | put_inotify_watch(&chunk->watch); | 301 | put_inotify_watch(&chunk->watch); |
266 | return; | 302 | goto out; |
267 | 303 | ||
268 | Fallback: | 304 | Fallback: |
269 | // do the best we can | 305 | // do the best we can |
@@ -277,6 +313,9 @@ Fallback: | |||
277 | put_tree(owner); | 313 | put_tree(owner); |
278 | spin_unlock(&hash_lock); | 314 | spin_unlock(&hash_lock); |
279 | mutex_unlock(&chunk->watch.inode->inotify_mutex); | 315 | mutex_unlock(&chunk->watch.inode->inotify_mutex); |
316 | out: | ||
317 | unpin_inotify_watch(&chunk->watch); | ||
318 | spin_lock(&hash_lock); | ||
280 | } | 319 | } |
281 | 320 | ||
282 | static int create_chunk(struct inode *inode, struct audit_tree *tree) | 321 | static int create_chunk(struct inode *inode, struct audit_tree *tree) |
@@ -387,13 +426,6 @@ static int tag_chunk(struct inode *inode, struct audit_tree *tree) | |||
387 | return 0; | 426 | return 0; |
388 | } | 427 | } |
389 | 428 | ||
390 | static struct audit_chunk *find_chunk(struct node *p) | ||
391 | { | ||
392 | int index = p->index & ~(1U<<31); | ||
393 | p -= index; | ||
394 | return container_of(p, struct audit_chunk, owners[0]); | ||
395 | } | ||
396 | |||
397 | static void kill_rules(struct audit_tree *tree) | 429 | static void kill_rules(struct audit_tree *tree) |
398 | { | 430 | { |
399 | struct audit_krule *rule, *next; | 431 | struct audit_krule *rule, *next; |
@@ -431,17 +463,10 @@ static void prune_one(struct audit_tree *victim) | |||
431 | spin_lock(&hash_lock); | 463 | spin_lock(&hash_lock); |
432 | while (!list_empty(&victim->chunks)) { | 464 | while (!list_empty(&victim->chunks)) { |
433 | struct node *p; | 465 | struct node *p; |
434 | struct audit_chunk *chunk; | ||
435 | 466 | ||
436 | p = list_entry(victim->chunks.next, struct node, list); | 467 | p = list_entry(victim->chunks.next, struct node, list); |
437 | chunk = find_chunk(p); | ||
438 | get_inotify_watch(&chunk->watch); | ||
439 | spin_unlock(&hash_lock); | ||
440 | |||
441 | untag_chunk(chunk, p); | ||
442 | 468 | ||
443 | put_inotify_watch(&chunk->watch); | 469 | untag_chunk(p); |
444 | spin_lock(&hash_lock); | ||
445 | } | 470 | } |
446 | spin_unlock(&hash_lock); | 471 | spin_unlock(&hash_lock); |
447 | put_tree(victim); | 472 | put_tree(victim); |
@@ -469,7 +494,6 @@ static void trim_marked(struct audit_tree *tree) | |||
469 | 494 | ||
470 | while (!list_empty(&tree->chunks)) { | 495 | while (!list_empty(&tree->chunks)) { |
471 | struct node *node; | 496 | struct node *node; |
472 | struct audit_chunk *chunk; | ||
473 | 497 | ||
474 | node = list_entry(tree->chunks.next, struct node, list); | 498 | node = list_entry(tree->chunks.next, struct node, list); |
475 | 499 | ||
@@ -477,14 +501,7 @@ static void trim_marked(struct audit_tree *tree) | |||
477 | if (!(node->index & (1U<<31))) | 501 | if (!(node->index & (1U<<31))) |
478 | break; | 502 | break; |
479 | 503 | ||
480 | chunk = find_chunk(node); | 504 | untag_chunk(node); |
481 | get_inotify_watch(&chunk->watch); | ||
482 | spin_unlock(&hash_lock); | ||
483 | |||
484 | untag_chunk(chunk, node); | ||
485 | |||
486 | put_inotify_watch(&chunk->watch); | ||
487 | spin_lock(&hash_lock); | ||
488 | } | 505 | } |
489 | if (!tree->root && !tree->goner) { | 506 | if (!tree->root && !tree->goner) { |
490 | tree->goner = 1; | 507 | tree->goner = 1; |
@@ -878,7 +895,7 @@ static void handle_event(struct inotify_watch *watch, u32 wd, u32 mask, | |||
878 | static void destroy_watch(struct inotify_watch *watch) | 895 | static void destroy_watch(struct inotify_watch *watch) |
879 | { | 896 | { |
880 | struct audit_chunk *chunk = container_of(watch, struct audit_chunk, watch); | 897 | struct audit_chunk *chunk = container_of(watch, struct audit_chunk, watch); |
881 | free_chunk(chunk); | 898 | call_rcu(&chunk->head, __put_chunk); |
882 | } | 899 | } |
883 | 900 | ||
884 | static const struct inotify_operations rtree_inotify_ops = { | 901 | static const struct inotify_operations rtree_inotify_ops = { |
diff --git a/kernel/auditfilter.c b/kernel/auditfilter.c index b7d354e2b0ef..9fd85a4640a0 100644 --- a/kernel/auditfilter.c +++ b/kernel/auditfilter.c | |||
@@ -1094,8 +1094,8 @@ static void audit_inotify_unregister(struct list_head *in_list) | |||
1094 | list_for_each_entry_safe(p, n, in_list, ilist) { | 1094 | list_for_each_entry_safe(p, n, in_list, ilist) { |
1095 | list_del(&p->ilist); | 1095 | list_del(&p->ilist); |
1096 | inotify_rm_watch(audit_ih, &p->wdata); | 1096 | inotify_rm_watch(audit_ih, &p->wdata); |
1097 | /* the put matching the get in audit_do_del_rule() */ | 1097 | /* the unpin matching the pin in audit_do_del_rule() */ |
1098 | put_inotify_watch(&p->wdata); | 1098 | unpin_inotify_watch(&p->wdata); |
1099 | } | 1099 | } |
1100 | } | 1100 | } |
1101 | 1101 | ||
@@ -1389,9 +1389,13 @@ static inline int audit_del_rule(struct audit_entry *entry, | |||
1389 | /* Put parent on the inotify un-registration | 1389 | /* Put parent on the inotify un-registration |
1390 | * list. Grab a reference before releasing | 1390 | * list. Grab a reference before releasing |
1391 | * audit_filter_mutex, to be released in | 1391 | * audit_filter_mutex, to be released in |
1392 | * audit_inotify_unregister(). */ | 1392 | * audit_inotify_unregister(). |
1393 | list_add(&parent->ilist, &inotify_list); | 1393 | * If filesystem is going away, just leave |
1394 | get_inotify_watch(&parent->wdata); | 1394 | * the sucker alone, eviction will take |
1395 | * care of it. | ||
1396 | */ | ||
1397 | if (pin_inotify_watch(&parent->wdata)) | ||
1398 | list_add(&parent->ilist, &inotify_list); | ||
1395 | } | 1399 | } |
1396 | } | 1400 | } |
1397 | } | 1401 | } |
diff --git a/kernel/cgroup.c b/kernel/cgroup.c index 358e77564e6f..fe00b3b983a8 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c | |||
@@ -2039,10 +2039,13 @@ int cgroupstats_build(struct cgroupstats *stats, struct dentry *dentry) | |||
2039 | struct cgroup *cgrp; | 2039 | struct cgroup *cgrp; |
2040 | struct cgroup_iter it; | 2040 | struct cgroup_iter it; |
2041 | struct task_struct *tsk; | 2041 | struct task_struct *tsk; |
2042 | |||
2042 | /* | 2043 | /* |
2043 | * Validate dentry by checking the superblock operations | 2044 | * Validate dentry by checking the superblock operations, |
2045 | * and make sure it's a directory. | ||
2044 | */ | 2046 | */ |
2045 | if (dentry->d_sb->s_op != &cgroup_ops) | 2047 | if (dentry->d_sb->s_op != &cgroup_ops || |
2048 | !S_ISDIR(dentry->d_inode->i_mode)) | ||
2046 | goto err; | 2049 | goto err; |
2047 | 2050 | ||
2048 | ret = 0; | 2051 | ret = 0; |
@@ -2472,10 +2475,7 @@ static int cgroup_rmdir(struct inode *unused_dir, struct dentry *dentry) | |||
2472 | mutex_unlock(&cgroup_mutex); | 2475 | mutex_unlock(&cgroup_mutex); |
2473 | return -EBUSY; | 2476 | return -EBUSY; |
2474 | } | 2477 | } |
2475 | 2478 | mutex_unlock(&cgroup_mutex); | |
2476 | parent = cgrp->parent; | ||
2477 | root = cgrp->root; | ||
2478 | sb = root->sb; | ||
2479 | 2479 | ||
2480 | /* | 2480 | /* |
2481 | * Call pre_destroy handlers of subsys. Notify subsystems | 2481 | * Call pre_destroy handlers of subsys. Notify subsystems |
@@ -2483,7 +2483,14 @@ static int cgroup_rmdir(struct inode *unused_dir, struct dentry *dentry) | |||
2483 | */ | 2483 | */ |
2484 | cgroup_call_pre_destroy(cgrp); | 2484 | cgroup_call_pre_destroy(cgrp); |
2485 | 2485 | ||
2486 | if (cgroup_has_css_refs(cgrp)) { | 2486 | mutex_lock(&cgroup_mutex); |
2487 | parent = cgrp->parent; | ||
2488 | root = cgrp->root; | ||
2489 | sb = root->sb; | ||
2490 | |||
2491 | if (atomic_read(&cgrp->count) | ||
2492 | || !list_empty(&cgrp->children) | ||
2493 | || cgroup_has_css_refs(cgrp)) { | ||
2487 | mutex_unlock(&cgroup_mutex); | 2494 | mutex_unlock(&cgroup_mutex); |
2488 | return -EBUSY; | 2495 | return -EBUSY; |
2489 | } | 2496 | } |
diff --git a/kernel/cgroup_freezer.c b/kernel/cgroup_freezer.c index 7fa476f01d05..fb249e2bcada 100644 --- a/kernel/cgroup_freezer.c +++ b/kernel/cgroup_freezer.c | |||
@@ -184,9 +184,20 @@ static void freezer_fork(struct cgroup_subsys *ss, struct task_struct *task) | |||
184 | { | 184 | { |
185 | struct freezer *freezer; | 185 | struct freezer *freezer; |
186 | 186 | ||
187 | task_lock(task); | 187 | /* |
188 | * No lock is needed, since the task isn't on tasklist yet, | ||
189 | * so it can't be moved to another cgroup, which means the | ||
190 | * freezer won't be removed and will be valid during this | ||
191 | * function call. | ||
192 | */ | ||
188 | freezer = task_freezer(task); | 193 | freezer = task_freezer(task); |
189 | task_unlock(task); | 194 | |
195 | /* | ||
196 | * The root cgroup is non-freezable, so we can skip the | ||
197 | * following check. | ||
198 | */ | ||
199 | if (!freezer->css.cgroup->parent) | ||
200 | return; | ||
190 | 201 | ||
191 | spin_lock_irq(&freezer->lock); | 202 | spin_lock_irq(&freezer->lock); |
192 | BUG_ON(freezer->state == CGROUP_FROZEN); | 203 | BUG_ON(freezer->state == CGROUP_FROZEN); |
@@ -331,7 +342,7 @@ static int freezer_write(struct cgroup *cgroup, | |||
331 | else if (strcmp(buffer, freezer_state_strs[CGROUP_FROZEN]) == 0) | 342 | else if (strcmp(buffer, freezer_state_strs[CGROUP_FROZEN]) == 0) |
332 | goal_state = CGROUP_FROZEN; | 343 | goal_state = CGROUP_FROZEN; |
333 | else | 344 | else |
334 | return -EIO; | 345 | return -EINVAL; |
335 | 346 | ||
336 | if (!cgroup_lock_live_group(cgroup)) | 347 | if (!cgroup_lock_live_group(cgroup)) |
337 | return -ENODEV; | 348 | return -ENODEV; |
@@ -350,6 +361,8 @@ static struct cftype files[] = { | |||
350 | 361 | ||
351 | static int freezer_populate(struct cgroup_subsys *ss, struct cgroup *cgroup) | 362 | static int freezer_populate(struct cgroup_subsys *ss, struct cgroup *cgroup) |
352 | { | 363 | { |
364 | if (!cgroup->parent) | ||
365 | return 0; | ||
353 | return cgroup_add_files(cgroup, ss, files, ARRAY_SIZE(files)); | 366 | return cgroup_add_files(cgroup, ss, files, ARRAY_SIZE(files)); |
354 | } | 367 | } |
355 | 368 | ||
diff --git a/kernel/cpu.c b/kernel/cpu.c index 5a732c5ef08b..8ea32e8d68b0 100644 --- a/kernel/cpu.c +++ b/kernel/cpu.c | |||
@@ -462,7 +462,7 @@ out: | |||
462 | * It must be called by the arch code on the new cpu, before the new cpu | 462 | * It must be called by the arch code on the new cpu, before the new cpu |
463 | * enables interrupts and before the "boot" cpu returns from __cpu_up(). | 463 | * enables interrupts and before the "boot" cpu returns from __cpu_up(). |
464 | */ | 464 | */ |
465 | void notify_cpu_starting(unsigned int cpu) | 465 | void __cpuinit notify_cpu_starting(unsigned int cpu) |
466 | { | 466 | { |
467 | unsigned long val = CPU_STARTING; | 467 | unsigned long val = CPU_STARTING; |
468 | 468 | ||
diff --git a/kernel/cpuset.c b/kernel/cpuset.c index 3e00526f52ec..96c0ba13b8cd 100644 --- a/kernel/cpuset.c +++ b/kernel/cpuset.c | |||
@@ -36,6 +36,7 @@ | |||
36 | #include <linux/list.h> | 36 | #include <linux/list.h> |
37 | #include <linux/mempolicy.h> | 37 | #include <linux/mempolicy.h> |
38 | #include <linux/mm.h> | 38 | #include <linux/mm.h> |
39 | #include <linux/memory.h> | ||
39 | #include <linux/module.h> | 40 | #include <linux/module.h> |
40 | #include <linux/mount.h> | 41 | #include <linux/mount.h> |
41 | #include <linux/namei.h> | 42 | #include <linux/namei.h> |
@@ -584,10 +585,9 @@ static int generate_sched_domains(cpumask_t **domains, | |||
584 | int i, j, k; /* indices for partition finding loops */ | 585 | int i, j, k; /* indices for partition finding loops */ |
585 | cpumask_t *doms; /* resulting partition; i.e. sched domains */ | 586 | cpumask_t *doms; /* resulting partition; i.e. sched domains */ |
586 | struct sched_domain_attr *dattr; /* attributes for custom domains */ | 587 | struct sched_domain_attr *dattr; /* attributes for custom domains */ |
587 | int ndoms; /* number of sched domains in result */ | 588 | int ndoms = 0; /* number of sched domains in result */ |
588 | int nslot; /* next empty doms[] cpumask_t slot */ | 589 | int nslot; /* next empty doms[] cpumask_t slot */ |
589 | 590 | ||
590 | ndoms = 0; | ||
591 | doms = NULL; | 591 | doms = NULL; |
592 | dattr = NULL; | 592 | dattr = NULL; |
593 | csa = NULL; | 593 | csa = NULL; |
@@ -674,10 +674,8 @@ restart: | |||
674 | * Convert <csn, csa> to <ndoms, doms> and populate cpu masks. | 674 | * Convert <csn, csa> to <ndoms, doms> and populate cpu masks. |
675 | */ | 675 | */ |
676 | doms = kmalloc(ndoms * sizeof(cpumask_t), GFP_KERNEL); | 676 | doms = kmalloc(ndoms * sizeof(cpumask_t), GFP_KERNEL); |
677 | if (!doms) { | 677 | if (!doms) |
678 | ndoms = 0; | ||
679 | goto done; | 678 | goto done; |
680 | } | ||
681 | 679 | ||
682 | /* | 680 | /* |
683 | * The rest of the code, including the scheduler, can deal with | 681 | * The rest of the code, including the scheduler, can deal with |
@@ -732,6 +730,13 @@ restart: | |||
732 | done: | 730 | done: |
733 | kfree(csa); | 731 | kfree(csa); |
734 | 732 | ||
733 | /* | ||
734 | * Fallback to the default domain if kmalloc() failed. | ||
735 | * See comments in partition_sched_domains(). | ||
736 | */ | ||
737 | if (doms == NULL) | ||
738 | ndoms = 1; | ||
739 | |||
735 | *domains = doms; | 740 | *domains = doms; |
736 | *attributes = dattr; | 741 | *attributes = dattr; |
737 | return ndoms; | 742 | return ndoms; |
@@ -2011,12 +2016,23 @@ static int cpuset_track_online_cpus(struct notifier_block *unused_nb, | |||
2011 | * Call this routine anytime after node_states[N_HIGH_MEMORY] changes. | 2016 | * Call this routine anytime after node_states[N_HIGH_MEMORY] changes. |
2012 | * See also the previous routine cpuset_track_online_cpus(). | 2017 | * See also the previous routine cpuset_track_online_cpus(). |
2013 | */ | 2018 | */ |
2014 | void cpuset_track_online_nodes(void) | 2019 | static int cpuset_track_online_nodes(struct notifier_block *self, |
2020 | unsigned long action, void *arg) | ||
2015 | { | 2021 | { |
2016 | cgroup_lock(); | 2022 | cgroup_lock(); |
2017 | top_cpuset.mems_allowed = node_states[N_HIGH_MEMORY]; | 2023 | switch (action) { |
2018 | scan_for_empty_cpusets(&top_cpuset); | 2024 | case MEM_ONLINE: |
2025 | top_cpuset.mems_allowed = node_states[N_HIGH_MEMORY]; | ||
2026 | break; | ||
2027 | case MEM_OFFLINE: | ||
2028 | top_cpuset.mems_allowed = node_states[N_HIGH_MEMORY]; | ||
2029 | scan_for_empty_cpusets(&top_cpuset); | ||
2030 | break; | ||
2031 | default: | ||
2032 | break; | ||
2033 | } | ||
2019 | cgroup_unlock(); | 2034 | cgroup_unlock(); |
2035 | return NOTIFY_OK; | ||
2020 | } | 2036 | } |
2021 | #endif | 2037 | #endif |
2022 | 2038 | ||
@@ -2032,6 +2048,7 @@ void __init cpuset_init_smp(void) | |||
2032 | top_cpuset.mems_allowed = node_states[N_HIGH_MEMORY]; | 2048 | top_cpuset.mems_allowed = node_states[N_HIGH_MEMORY]; |
2033 | 2049 | ||
2034 | hotcpu_notifier(cpuset_track_online_cpus, 0); | 2050 | hotcpu_notifier(cpuset_track_online_cpus, 0); |
2051 | hotplug_memory_notifier(cpuset_track_online_nodes, 10); | ||
2035 | } | 2052 | } |
2036 | 2053 | ||
2037 | /** | 2054 | /** |
diff --git a/kernel/exit.c b/kernel/exit.c index ae2b92be5fae..2d8be7ebb0f7 100644 --- a/kernel/exit.c +++ b/kernel/exit.c | |||
@@ -40,7 +40,6 @@ | |||
40 | #include <linux/cn_proc.h> | 40 | #include <linux/cn_proc.h> |
41 | #include <linux/mutex.h> | 41 | #include <linux/mutex.h> |
42 | #include <linux/futex.h> | 42 | #include <linux/futex.h> |
43 | #include <linux/compat.h> | ||
44 | #include <linux/pipe_fs_i.h> | 43 | #include <linux/pipe_fs_i.h> |
45 | #include <linux/audit.h> /* for audit_free() */ | 44 | #include <linux/audit.h> /* for audit_free() */ |
46 | #include <linux/resource.h> | 45 | #include <linux/resource.h> |
@@ -1059,14 +1058,6 @@ NORET_TYPE void do_exit(long code) | |||
1059 | exit_itimers(tsk->signal); | 1058 | exit_itimers(tsk->signal); |
1060 | } | 1059 | } |
1061 | acct_collect(code, group_dead); | 1060 | acct_collect(code, group_dead); |
1062 | #ifdef CONFIG_FUTEX | ||
1063 | if (unlikely(tsk->robust_list)) | ||
1064 | exit_robust_list(tsk); | ||
1065 | #ifdef CONFIG_COMPAT | ||
1066 | if (unlikely(tsk->compat_robust_list)) | ||
1067 | compat_exit_robust_list(tsk); | ||
1068 | #endif | ||
1069 | #endif | ||
1070 | if (group_dead) | 1061 | if (group_dead) |
1071 | tty_audit_exit(); | 1062 | tty_audit_exit(); |
1072 | if (unlikely(tsk->audit_context)) | 1063 | if (unlikely(tsk->audit_context)) |
diff --git a/kernel/fork.c b/kernel/fork.c index f6083561dfe0..2a372a0e206f 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
@@ -40,6 +40,7 @@ | |||
40 | #include <linux/jiffies.h> | 40 | #include <linux/jiffies.h> |
41 | #include <linux/tracehook.h> | 41 | #include <linux/tracehook.h> |
42 | #include <linux/futex.h> | 42 | #include <linux/futex.h> |
43 | #include <linux/compat.h> | ||
43 | #include <linux/task_io_accounting_ops.h> | 44 | #include <linux/task_io_accounting_ops.h> |
44 | #include <linux/rcupdate.h> | 45 | #include <linux/rcupdate.h> |
45 | #include <linux/ptrace.h> | 46 | #include <linux/ptrace.h> |
@@ -519,6 +520,16 @@ void mm_release(struct task_struct *tsk, struct mm_struct *mm) | |||
519 | { | 520 | { |
520 | struct completion *vfork_done = tsk->vfork_done; | 521 | struct completion *vfork_done = tsk->vfork_done; |
521 | 522 | ||
523 | /* Get rid of any futexes when releasing the mm */ | ||
524 | #ifdef CONFIG_FUTEX | ||
525 | if (unlikely(tsk->robust_list)) | ||
526 | exit_robust_list(tsk); | ||
527 | #ifdef CONFIG_COMPAT | ||
528 | if (unlikely(tsk->compat_robust_list)) | ||
529 | compat_exit_robust_list(tsk); | ||
530 | #endif | ||
531 | #endif | ||
532 | |||
522 | /* Get rid of any cached register state */ | 533 | /* Get rid of any cached register state */ |
523 | deactivate_mm(tsk, mm); | 534 | deactivate_mm(tsk, mm); |
524 | 535 | ||
diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c index 95d3949f2ae5..47e63349d1b2 100644 --- a/kernel/hrtimer.c +++ b/kernel/hrtimer.c | |||
@@ -664,14 +664,6 @@ static inline int hrtimer_enqueue_reprogram(struct hrtimer *timer, | |||
664 | 664 | ||
665 | /* Timer is expired, act upon the callback mode */ | 665 | /* Timer is expired, act upon the callback mode */ |
666 | switch(timer->cb_mode) { | 666 | switch(timer->cb_mode) { |
667 | case HRTIMER_CB_IRQSAFE_NO_RESTART: | ||
668 | debug_hrtimer_deactivate(timer); | ||
669 | /* | ||
670 | * We can call the callback from here. No restart | ||
671 | * happens, so no danger of recursion | ||
672 | */ | ||
673 | BUG_ON(timer->function(timer) != HRTIMER_NORESTART); | ||
674 | return 1; | ||
675 | case HRTIMER_CB_IRQSAFE_PERCPU: | 667 | case HRTIMER_CB_IRQSAFE_PERCPU: |
676 | case HRTIMER_CB_IRQSAFE_UNLOCKED: | 668 | case HRTIMER_CB_IRQSAFE_UNLOCKED: |
677 | /* | 669 | /* |
@@ -683,7 +675,6 @@ static inline int hrtimer_enqueue_reprogram(struct hrtimer *timer, | |||
683 | */ | 675 | */ |
684 | debug_hrtimer_deactivate(timer); | 676 | debug_hrtimer_deactivate(timer); |
685 | return 1; | 677 | return 1; |
686 | case HRTIMER_CB_IRQSAFE: | ||
687 | case HRTIMER_CB_SOFTIRQ: | 678 | case HRTIMER_CB_SOFTIRQ: |
688 | /* | 679 | /* |
689 | * Move everything else into the softirq pending list ! | 680 | * Move everything else into the softirq pending list ! |
diff --git a/kernel/irq/internals.h b/kernel/irq/internals.h index c9767e641980..64c1c7253dae 100644 --- a/kernel/irq/internals.h +++ b/kernel/irq/internals.h | |||
@@ -25,6 +25,8 @@ static inline void unregister_handler_proc(unsigned int irq, | |||
25 | struct irqaction *action) { } | 25 | struct irqaction *action) { } |
26 | #endif | 26 | #endif |
27 | 27 | ||
28 | extern int irq_select_affinity_usr(unsigned int irq); | ||
29 | |||
28 | /* | 30 | /* |
29 | * Debugging printout: | 31 | * Debugging printout: |
30 | */ | 32 | */ |
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 7fd891c3a33d..e9d1c8205a3b 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c | |||
@@ -82,24 +82,27 @@ int irq_can_set_affinity(unsigned int irq) | |||
82 | int irq_set_affinity(unsigned int irq, cpumask_t cpumask) | 82 | int irq_set_affinity(unsigned int irq, cpumask_t cpumask) |
83 | { | 83 | { |
84 | struct irq_desc *desc = irq_to_desc(irq); | 84 | struct irq_desc *desc = irq_to_desc(irq); |
85 | unsigned long flags; | ||
85 | 86 | ||
86 | if (!desc->chip->set_affinity) | 87 | if (!desc->chip->set_affinity) |
87 | return -EINVAL; | 88 | return -EINVAL; |
88 | 89 | ||
90 | spin_lock_irqsave(&desc->lock, flags); | ||
91 | |||
89 | #ifdef CONFIG_GENERIC_PENDING_IRQ | 92 | #ifdef CONFIG_GENERIC_PENDING_IRQ |
90 | if (desc->status & IRQ_MOVE_PCNTXT || desc->status & IRQ_DISABLED) { | 93 | if (desc->status & IRQ_MOVE_PCNTXT || desc->status & IRQ_DISABLED) { |
91 | unsigned long flags; | ||
92 | |||
93 | spin_lock_irqsave(&desc->lock, flags); | ||
94 | desc->affinity = cpumask; | 94 | desc->affinity = cpumask; |
95 | desc->chip->set_affinity(irq, cpumask); | 95 | desc->chip->set_affinity(irq, cpumask); |
96 | spin_unlock_irqrestore(&desc->lock, flags); | 96 | } else { |
97 | } else | 97 | desc->status |= IRQ_MOVE_PENDING; |
98 | set_pending_irq(irq, cpumask); | 98 | desc->pending_mask = cpumask; |
99 | } | ||
99 | #else | 100 | #else |
100 | desc->affinity = cpumask; | 101 | desc->affinity = cpumask; |
101 | desc->chip->set_affinity(irq, cpumask); | 102 | desc->chip->set_affinity(irq, cpumask); |
102 | #endif | 103 | #endif |
104 | desc->status |= IRQ_AFFINITY_SET; | ||
105 | spin_unlock_irqrestore(&desc->lock, flags); | ||
103 | return 0; | 106 | return 0; |
104 | } | 107 | } |
105 | 108 | ||
@@ -107,24 +110,59 @@ int irq_set_affinity(unsigned int irq, cpumask_t cpumask) | |||
107 | /* | 110 | /* |
108 | * Generic version of the affinity autoselector. | 111 | * Generic version of the affinity autoselector. |
109 | */ | 112 | */ |
110 | int irq_select_affinity(unsigned int irq) | 113 | int do_irq_select_affinity(unsigned int irq, struct irq_desc *desc) |
111 | { | 114 | { |
112 | cpumask_t mask; | 115 | cpumask_t mask; |
113 | struct irq_desc *desc; | ||
114 | 116 | ||
115 | if (!irq_can_set_affinity(irq)) | 117 | if (!irq_can_set_affinity(irq)) |
116 | return 0; | 118 | return 0; |
117 | 119 | ||
118 | cpus_and(mask, cpu_online_map, irq_default_affinity); | 120 | cpus_and(mask, cpu_online_map, irq_default_affinity); |
119 | 121 | ||
120 | desc = irq_to_desc(irq); | 122 | /* |
123 | * Preserve an userspace affinity setup, but make sure that | ||
124 | * one of the targets is online. | ||
125 | */ | ||
126 | if (desc->status & (IRQ_AFFINITY_SET | IRQ_NO_BALANCING)) { | ||
127 | if (cpus_intersects(desc->affinity, cpu_online_map)) | ||
128 | mask = desc->affinity; | ||
129 | else | ||
130 | desc->status &= ~IRQ_AFFINITY_SET; | ||
131 | } | ||
132 | |||
121 | desc->affinity = mask; | 133 | desc->affinity = mask; |
122 | desc->chip->set_affinity(irq, mask); | 134 | desc->chip->set_affinity(irq, mask); |
123 | 135 | ||
124 | return 0; | 136 | return 0; |
125 | } | 137 | } |
138 | #else | ||
139 | static inline int do_irq_select_affinity(unsigned int irq, struct irq_desc *d) | ||
140 | { | ||
141 | return irq_select_affinity(irq); | ||
142 | } | ||
126 | #endif | 143 | #endif |
127 | 144 | ||
145 | /* | ||
146 | * Called when affinity is set via /proc/irq | ||
147 | */ | ||
148 | int irq_select_affinity_usr(unsigned int irq) | ||
149 | { | ||
150 | struct irq_desc *desc = irq_to_desc(irq); | ||
151 | unsigned long flags; | ||
152 | int ret; | ||
153 | |||
154 | spin_lock_irqsave(&desc->lock, flags); | ||
155 | ret = do_irq_select_affinity(irq, desc); | ||
156 | spin_unlock_irqrestore(&desc->lock, flags); | ||
157 | |||
158 | return ret; | ||
159 | } | ||
160 | |||
161 | #else | ||
162 | static inline int do_irq_select_affinity(int irq, struct irq_desc *desc) | ||
163 | { | ||
164 | return 0; | ||
165 | } | ||
128 | #endif | 166 | #endif |
129 | 167 | ||
130 | /** | 168 | /** |
@@ -327,7 +365,7 @@ int __irq_set_trigger(struct irq_desc *desc, unsigned int irq, | |||
327 | * IRQF_TRIGGER_* but the PIC does not support multiple | 365 | * IRQF_TRIGGER_* but the PIC does not support multiple |
328 | * flow-types? | 366 | * flow-types? |
329 | */ | 367 | */ |
330 | pr_warning("No set_type function for IRQ %d (%s)\n", irq, | 368 | pr_debug("No set_type function for IRQ %d (%s)\n", irq, |
331 | chip ? (chip->name ? : "unknown") : "unknown"); | 369 | chip ? (chip->name ? : "unknown") : "unknown"); |
332 | return 0; | 370 | return 0; |
333 | } | 371 | } |
@@ -445,8 +483,12 @@ __setup_irq(unsigned int irq, struct irq_desc * desc, struct irqaction *new) | |||
445 | /* Undo nested disables: */ | 483 | /* Undo nested disables: */ |
446 | desc->depth = 1; | 484 | desc->depth = 1; |
447 | 485 | ||
486 | /* Exclude IRQ from balancing if requested */ | ||
487 | if (new->flags & IRQF_NOBALANCING) | ||
488 | desc->status |= IRQ_NO_BALANCING; | ||
489 | |||
448 | /* Set default affinity mask once everything is setup */ | 490 | /* Set default affinity mask once everything is setup */ |
449 | irq_select_affinity(irq); | 491 | do_irq_select_affinity(irq, desc); |
450 | 492 | ||
451 | } else if ((new->flags & IRQF_TRIGGER_MASK) | 493 | } else if ((new->flags & IRQF_TRIGGER_MASK) |
452 | && (new->flags & IRQF_TRIGGER_MASK) | 494 | && (new->flags & IRQF_TRIGGER_MASK) |
@@ -459,10 +501,6 @@ __setup_irq(unsigned int irq, struct irq_desc * desc, struct irqaction *new) | |||
459 | 501 | ||
460 | *p = new; | 502 | *p = new; |
461 | 503 | ||
462 | /* Exclude IRQ from balancing */ | ||
463 | if (new->flags & IRQF_NOBALANCING) | ||
464 | desc->status |= IRQ_NO_BALANCING; | ||
465 | |||
466 | /* Reset broken irq detection when installing new handler */ | 504 | /* Reset broken irq detection when installing new handler */ |
467 | desc->irq_count = 0; | 505 | desc->irq_count = 0; |
468 | desc->irqs_unhandled = 0; | 506 | desc->irqs_unhandled = 0; |
diff --git a/kernel/irq/migration.c b/kernel/irq/migration.c index 90b920d3f52b..9db681d95814 100644 --- a/kernel/irq/migration.c +++ b/kernel/irq/migration.c | |||
@@ -1,17 +1,6 @@ | |||
1 | 1 | ||
2 | #include <linux/irq.h> | 2 | #include <linux/irq.h> |
3 | 3 | ||
4 | void set_pending_irq(unsigned int irq, cpumask_t mask) | ||
5 | { | ||
6 | struct irq_desc *desc = irq_to_desc(irq); | ||
7 | unsigned long flags; | ||
8 | |||
9 | spin_lock_irqsave(&desc->lock, flags); | ||
10 | desc->status |= IRQ_MOVE_PENDING; | ||
11 | desc->pending_mask = mask; | ||
12 | spin_unlock_irqrestore(&desc->lock, flags); | ||
13 | } | ||
14 | |||
15 | void move_masked_irq(int irq) | 4 | void move_masked_irq(int irq) |
16 | { | 5 | { |
17 | struct irq_desc *desc = irq_to_desc(irq); | 6 | struct irq_desc *desc = irq_to_desc(irq); |
diff --git a/kernel/irq/proc.c b/kernel/irq/proc.c index 4d161c70ba55..d257e7d6a8a4 100644 --- a/kernel/irq/proc.c +++ b/kernel/irq/proc.c | |||
@@ -62,7 +62,7 @@ static ssize_t irq_affinity_proc_write(struct file *file, | |||
62 | if (!cpus_intersects(new_value, cpu_online_map)) | 62 | if (!cpus_intersects(new_value, cpu_online_map)) |
63 | /* Special case for empty set - allow the architecture | 63 | /* Special case for empty set - allow the architecture |
64 | code to set default SMP affinity. */ | 64 | code to set default SMP affinity. */ |
65 | return irq_select_affinity(irq) ? -EINVAL : count; | 65 | return irq_select_affinity_usr(irq) ? -EINVAL : count; |
66 | 66 | ||
67 | irq_set_affinity(irq, new_value); | 67 | irq_set_affinity(irq, new_value); |
68 | 68 | ||
diff --git a/kernel/kallsyms.c b/kernel/kallsyms.c index 5072cf1685a2..7b8b0f21a5b1 100644 --- a/kernel/kallsyms.c +++ b/kernel/kallsyms.c | |||
@@ -304,17 +304,24 @@ int sprint_symbol(char *buffer, unsigned long address) | |||
304 | char *modname; | 304 | char *modname; |
305 | const char *name; | 305 | const char *name; |
306 | unsigned long offset, size; | 306 | unsigned long offset, size; |
307 | char namebuf[KSYM_NAME_LEN]; | 307 | int len; |
308 | 308 | ||
309 | name = kallsyms_lookup(address, &size, &offset, &modname, namebuf); | 309 | name = kallsyms_lookup(address, &size, &offset, &modname, buffer); |
310 | if (!name) | 310 | if (!name) |
311 | return sprintf(buffer, "0x%lx", address); | 311 | return sprintf(buffer, "0x%lx", address); |
312 | 312 | ||
313 | if (name != buffer) | ||
314 | strcpy(buffer, name); | ||
315 | len = strlen(buffer); | ||
316 | buffer += len; | ||
317 | |||
313 | if (modname) | 318 | if (modname) |
314 | return sprintf(buffer, "%s+%#lx/%#lx [%s]", name, offset, | 319 | len += sprintf(buffer, "+%#lx/%#lx [%s]", |
315 | size, modname); | 320 | offset, size, modname); |
316 | else | 321 | else |
317 | return sprintf(buffer, "%s+%#lx/%#lx", name, offset, size); | 322 | len += sprintf(buffer, "+%#lx/%#lx", offset, size); |
323 | |||
324 | return len; | ||
318 | } | 325 | } |
319 | 326 | ||
320 | /* Look up a kernel symbol and print it to the kernel messages. */ | 327 | /* Look up a kernel symbol and print it to the kernel messages. */ |
diff --git a/kernel/kprobes.c b/kernel/kprobes.c index 8b57a2597f21..9f8a3f25259a 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c | |||
@@ -72,7 +72,7 @@ static bool kprobe_enabled; | |||
72 | DEFINE_MUTEX(kprobe_mutex); /* Protects kprobe_table */ | 72 | DEFINE_MUTEX(kprobe_mutex); /* Protects kprobe_table */ |
73 | static DEFINE_PER_CPU(struct kprobe *, kprobe_instance) = NULL; | 73 | static DEFINE_PER_CPU(struct kprobe *, kprobe_instance) = NULL; |
74 | static struct { | 74 | static struct { |
75 | spinlock_t lock ____cacheline_aligned; | 75 | spinlock_t lock ____cacheline_aligned_in_smp; |
76 | } kretprobe_table_locks[KPROBE_TABLE_SIZE]; | 76 | } kretprobe_table_locks[KPROBE_TABLE_SIZE]; |
77 | 77 | ||
78 | static spinlock_t *kretprobe_table_lock_ptr(unsigned long hash) | 78 | static spinlock_t *kretprobe_table_lock_ptr(unsigned long hash) |
@@ -613,30 +613,37 @@ static int __kprobes __register_kprobe(struct kprobe *p, | |||
613 | return -EINVAL; | 613 | return -EINVAL; |
614 | p->addr = addr; | 614 | p->addr = addr; |
615 | 615 | ||
616 | if (!kernel_text_address((unsigned long) p->addr) || | 616 | preempt_disable(); |
617 | in_kprobes_functions((unsigned long) p->addr)) | 617 | if (!__kernel_text_address((unsigned long) p->addr) || |
618 | in_kprobes_functions((unsigned long) p->addr)) { | ||
619 | preempt_enable(); | ||
618 | return -EINVAL; | 620 | return -EINVAL; |
621 | } | ||
619 | 622 | ||
620 | p->mod_refcounted = 0; | 623 | p->mod_refcounted = 0; |
621 | 624 | ||
622 | /* | 625 | /* |
623 | * Check if are we probing a module. | 626 | * Check if are we probing a module. |
624 | */ | 627 | */ |
625 | probed_mod = module_text_address((unsigned long) p->addr); | 628 | probed_mod = __module_text_address((unsigned long) p->addr); |
626 | if (probed_mod) { | 629 | if (probed_mod) { |
627 | struct module *calling_mod = module_text_address(called_from); | 630 | struct module *calling_mod; |
631 | calling_mod = __module_text_address(called_from); | ||
628 | /* | 632 | /* |
629 | * We must allow modules to probe themself and in this case | 633 | * We must allow modules to probe themself and in this case |
630 | * avoid incrementing the module refcount, so as to allow | 634 | * avoid incrementing the module refcount, so as to allow |
631 | * unloading of self probing modules. | 635 | * unloading of self probing modules. |
632 | */ | 636 | */ |
633 | if (calling_mod && calling_mod != probed_mod) { | 637 | if (calling_mod && calling_mod != probed_mod) { |
634 | if (unlikely(!try_module_get(probed_mod))) | 638 | if (unlikely(!try_module_get(probed_mod))) { |
639 | preempt_enable(); | ||
635 | return -EINVAL; | 640 | return -EINVAL; |
641 | } | ||
636 | p->mod_refcounted = 1; | 642 | p->mod_refcounted = 1; |
637 | } else | 643 | } else |
638 | probed_mod = NULL; | 644 | probed_mod = NULL; |
639 | } | 645 | } |
646 | preempt_enable(); | ||
640 | 647 | ||
641 | p->nmissed = 0; | 648 | p->nmissed = 0; |
642 | INIT_LIST_HEAD(&p->list); | 649 | INIT_LIST_HEAD(&p->list); |
@@ -718,6 +725,10 @@ static void __kprobes __unregister_kprobe_bottom(struct kprobe *p) | |||
718 | struct kprobe *old_p; | 725 | struct kprobe *old_p; |
719 | 726 | ||
720 | if (p->mod_refcounted) { | 727 | if (p->mod_refcounted) { |
728 | /* | ||
729 | * Since we've already incremented refcount, | ||
730 | * we don't need to disable preemption. | ||
731 | */ | ||
721 | mod = module_text_address((unsigned long)p->addr); | 732 | mod = module_text_address((unsigned long)p->addr); |
722 | if (mod) | 733 | if (mod) |
723 | module_put(mod); | 734 | module_put(mod); |
diff --git a/kernel/lockdep.c b/kernel/lockdep.c index c137953420e0..90f3fb64dbce 100644 --- a/kernel/lockdep.c +++ b/kernel/lockdep.c | |||
@@ -3286,10 +3286,10 @@ void __init lockdep_info(void) | |||
3286 | { | 3286 | { |
3287 | printk("Lock dependency validator: Copyright (c) 2006 Red Hat, Inc., Ingo Molnar\n"); | 3287 | printk("Lock dependency validator: Copyright (c) 2006 Red Hat, Inc., Ingo Molnar\n"); |
3288 | 3288 | ||
3289 | printk("... MAX_LOCKDEP_SUBCLASSES: %lu\n", MAX_LOCKDEP_SUBCLASSES); | 3289 | printk("... MAX_LOCKDEP_SUBCLASSES: %lu\n", MAX_LOCKDEP_SUBCLASSES); |
3290 | printk("... MAX_LOCK_DEPTH: %lu\n", MAX_LOCK_DEPTH); | 3290 | printk("... MAX_LOCK_DEPTH: %lu\n", MAX_LOCK_DEPTH); |
3291 | printk("... MAX_LOCKDEP_KEYS: %lu\n", MAX_LOCKDEP_KEYS); | 3291 | printk("... MAX_LOCKDEP_KEYS: %lu\n", MAX_LOCKDEP_KEYS); |
3292 | printk("... CLASSHASH_SIZE: %lu\n", CLASSHASH_SIZE); | 3292 | printk("... CLASSHASH_SIZE: %lu\n", CLASSHASH_SIZE); |
3293 | printk("... MAX_LOCKDEP_ENTRIES: %lu\n", MAX_LOCKDEP_ENTRIES); | 3293 | printk("... MAX_LOCKDEP_ENTRIES: %lu\n", MAX_LOCKDEP_ENTRIES); |
3294 | printk("... MAX_LOCKDEP_CHAINS: %lu\n", MAX_LOCKDEP_CHAINS); | 3294 | printk("... MAX_LOCKDEP_CHAINS: %lu\n", MAX_LOCKDEP_CHAINS); |
3295 | printk("... CHAINHASH_SIZE: %lu\n", CHAINHASH_SIZE); | 3295 | printk("... CHAINHASH_SIZE: %lu\n", CHAINHASH_SIZE); |
diff --git a/kernel/panic.c b/kernel/panic.c index 6513aac8e992..4d5088355bfe 100644 --- a/kernel/panic.c +++ b/kernel/panic.c | |||
@@ -167,6 +167,7 @@ static const struct tnt tnts[] = { | |||
167 | * 'M' - System experienced a machine check exception. | 167 | * 'M' - System experienced a machine check exception. |
168 | * 'B' - System has hit bad_page. | 168 | * 'B' - System has hit bad_page. |
169 | * 'U' - Userspace-defined naughtiness. | 169 | * 'U' - Userspace-defined naughtiness. |
170 | * 'D' - Kernel has oopsed before | ||
170 | * 'A' - ACPI table overridden. | 171 | * 'A' - ACPI table overridden. |
171 | * 'W' - Taint on warning. | 172 | * 'W' - Taint on warning. |
172 | * 'C' - modules from drivers/staging are loaded. | 173 | * 'C' - modules from drivers/staging are loaded. |
diff --git a/kernel/posix-cpu-timers.c b/kernel/posix-cpu-timers.c index 153dcb2639c3..895337b16a24 100644 --- a/kernel/posix-cpu-timers.c +++ b/kernel/posix-cpu-timers.c | |||
@@ -1308,9 +1308,10 @@ static inline int task_cputime_expired(const struct task_cputime *sample, | |||
1308 | */ | 1308 | */ |
1309 | static inline int fastpath_timer_check(struct task_struct *tsk) | 1309 | static inline int fastpath_timer_check(struct task_struct *tsk) |
1310 | { | 1310 | { |
1311 | struct signal_struct *sig = tsk->signal; | 1311 | struct signal_struct *sig; |
1312 | 1312 | ||
1313 | if (unlikely(!sig)) | 1313 | /* tsk == current, ensure it is safe to use ->signal/sighand */ |
1314 | if (unlikely(tsk->exit_state)) | ||
1314 | return 0; | 1315 | return 0; |
1315 | 1316 | ||
1316 | if (!task_cputime_zero(&tsk->cputime_expires)) { | 1317 | if (!task_cputime_zero(&tsk->cputime_expires)) { |
@@ -1323,6 +1324,8 @@ static inline int fastpath_timer_check(struct task_struct *tsk) | |||
1323 | if (task_cputime_expired(&task_sample, &tsk->cputime_expires)) | 1324 | if (task_cputime_expired(&task_sample, &tsk->cputime_expires)) |
1324 | return 1; | 1325 | return 1; |
1325 | } | 1326 | } |
1327 | |||
1328 | sig = tsk->signal; | ||
1326 | if (!task_cputime_zero(&sig->cputime_expires)) { | 1329 | if (!task_cputime_zero(&sig->cputime_expires)) { |
1327 | struct task_cputime group_sample; | 1330 | struct task_cputime group_sample; |
1328 | 1331 | ||
diff --git a/kernel/power/main.c b/kernel/power/main.c index 19122cf6d827..b8f7ce9473e8 100644 --- a/kernel/power/main.c +++ b/kernel/power/main.c | |||
@@ -174,7 +174,7 @@ static void suspend_test_finish(const char *label) | |||
174 | * has some performance issues. The stack dump of a WARN_ON | 174 | * has some performance issues. The stack dump of a WARN_ON |
175 | * is more likely to get the right attention than a printk... | 175 | * is more likely to get the right attention than a printk... |
176 | */ | 176 | */ |
177 | WARN_ON(msec > (TEST_SUSPEND_SECONDS * 1000)); | 177 | WARN(msec > (TEST_SUSPEND_SECONDS * 1000), "Component: %s\n", label); |
178 | } | 178 | } |
179 | 179 | ||
180 | #else | 180 | #else |
diff --git a/kernel/profile.c b/kernel/profile.c index 9830a037d8db..dc41827fbfee 100644 --- a/kernel/profile.c +++ b/kernel/profile.c | |||
@@ -351,7 +351,7 @@ out: | |||
351 | put_cpu(); | 351 | put_cpu(); |
352 | } | 352 | } |
353 | 353 | ||
354 | static int __devinit profile_cpu_callback(struct notifier_block *info, | 354 | static int __cpuinit profile_cpu_callback(struct notifier_block *info, |
355 | unsigned long action, void *__cpu) | 355 | unsigned long action, void *__cpu) |
356 | { | 356 | { |
357 | int node, cpu = (unsigned long)__cpu; | 357 | int node, cpu = (unsigned long)__cpu; |
@@ -544,7 +544,7 @@ static const struct file_operations proc_profile_operations = { | |||
544 | }; | 544 | }; |
545 | 545 | ||
546 | #ifdef CONFIG_SMP | 546 | #ifdef CONFIG_SMP |
547 | static void __init profile_nop(void *unused) | 547 | static inline void profile_nop(void *unused) |
548 | { | 548 | { |
549 | } | 549 | } |
550 | 550 | ||
@@ -596,7 +596,7 @@ out_cleanup: | |||
596 | #define create_hash_tables() ({ 0; }) | 596 | #define create_hash_tables() ({ 0; }) |
597 | #endif | 597 | #endif |
598 | 598 | ||
599 | int create_proc_profile(void) | 599 | int __ref create_proc_profile(void) /* false positive from hotcpu_notifier */ |
600 | { | 600 | { |
601 | struct proc_dir_entry *entry; | 601 | struct proc_dir_entry *entry; |
602 | 602 | ||
diff --git a/kernel/ptrace.c b/kernel/ptrace.c index 1e68e4c39e2c..4c8bcd7dd8e0 100644 --- a/kernel/ptrace.c +++ b/kernel/ptrace.c | |||
@@ -612,7 +612,7 @@ int generic_ptrace_pokedata(struct task_struct *tsk, long addr, long data) | |||
612 | return (copied == sizeof(data)) ? 0 : -EIO; | 612 | return (copied == sizeof(data)) ? 0 : -EIO; |
613 | } | 613 | } |
614 | 614 | ||
615 | #if defined CONFIG_COMPAT && defined __ARCH_WANT_COMPAT_SYS_PTRACE | 615 | #if defined CONFIG_COMPAT |
616 | #include <linux/compat.h> | 616 | #include <linux/compat.h> |
617 | 617 | ||
618 | int compat_ptrace_request(struct task_struct *child, compat_long_t request, | 618 | int compat_ptrace_request(struct task_struct *child, compat_long_t request, |
@@ -709,4 +709,4 @@ asmlinkage long compat_sys_ptrace(compat_long_t request, compat_long_t pid, | |||
709 | unlock_kernel(); | 709 | unlock_kernel(); |
710 | return ret; | 710 | return ret; |
711 | } | 711 | } |
712 | #endif /* CONFIG_COMPAT && __ARCH_WANT_COMPAT_SYS_PTRACE */ | 712 | #endif /* CONFIG_COMPAT */ |
diff --git a/kernel/relay.c b/kernel/relay.c index 8d13a7855c08..32b0befdcb6a 100644 --- a/kernel/relay.c +++ b/kernel/relay.c | |||
@@ -400,7 +400,7 @@ void relay_reset(struct rchan *chan) | |||
400 | } | 400 | } |
401 | 401 | ||
402 | mutex_lock(&relay_channels_mutex); | 402 | mutex_lock(&relay_channels_mutex); |
403 | for_each_online_cpu(i) | 403 | for_each_possible_cpu(i) |
404 | if (chan->buf[i]) | 404 | if (chan->buf[i]) |
405 | __relay_reset(chan->buf[i], 0); | 405 | __relay_reset(chan->buf[i], 0); |
406 | mutex_unlock(&relay_channels_mutex); | 406 | mutex_unlock(&relay_channels_mutex); |
@@ -611,10 +611,9 @@ struct rchan *relay_open(const char *base_filename, | |||
611 | return chan; | 611 | return chan; |
612 | 612 | ||
613 | free_bufs: | 613 | free_bufs: |
614 | for_each_online_cpu(i) { | 614 | for_each_possible_cpu(i) { |
615 | if (!chan->buf[i]) | 615 | if (chan->buf[i]) |
616 | break; | 616 | relay_close_buf(chan->buf[i]); |
617 | relay_close_buf(chan->buf[i]); | ||
618 | } | 617 | } |
619 | 618 | ||
620 | kref_put(&chan->kref, relay_destroy_channel); | 619 | kref_put(&chan->kref, relay_destroy_channel); |
diff --git a/kernel/sched.c b/kernel/sched.c index 2a106b6b78b0..1b8f8c3aecc4 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
@@ -1453,9 +1453,12 @@ static int task_hot(struct task_struct *p, u64 now, struct sched_domain *sd); | |||
1453 | static unsigned long cpu_avg_load_per_task(int cpu) | 1453 | static unsigned long cpu_avg_load_per_task(int cpu) |
1454 | { | 1454 | { |
1455 | struct rq *rq = cpu_rq(cpu); | 1455 | struct rq *rq = cpu_rq(cpu); |
1456 | unsigned long nr_running = ACCESS_ONCE(rq->nr_running); | ||
1456 | 1457 | ||
1457 | if (rq->nr_running) | 1458 | if (nr_running) |
1458 | rq->avg_load_per_task = rq->load.weight / rq->nr_running; | 1459 | rq->avg_load_per_task = rq->load.weight / nr_running; |
1460 | else | ||
1461 | rq->avg_load_per_task = 0; | ||
1459 | 1462 | ||
1460 | return rq->avg_load_per_task; | 1463 | return rq->avg_load_per_task; |
1461 | } | 1464 | } |
@@ -5868,6 +5871,8 @@ void __cpuinit init_idle(struct task_struct *idle, int cpu) | |||
5868 | struct rq *rq = cpu_rq(cpu); | 5871 | struct rq *rq = cpu_rq(cpu); |
5869 | unsigned long flags; | 5872 | unsigned long flags; |
5870 | 5873 | ||
5874 | spin_lock_irqsave(&rq->lock, flags); | ||
5875 | |||
5871 | __sched_fork(idle); | 5876 | __sched_fork(idle); |
5872 | idle->se.exec_start = sched_clock(); | 5877 | idle->se.exec_start = sched_clock(); |
5873 | 5878 | ||
@@ -5875,7 +5880,6 @@ void __cpuinit init_idle(struct task_struct *idle, int cpu) | |||
5875 | idle->cpus_allowed = cpumask_of_cpu(cpu); | 5880 | idle->cpus_allowed = cpumask_of_cpu(cpu); |
5876 | __set_task_cpu(idle, cpu); | 5881 | __set_task_cpu(idle, cpu); |
5877 | 5882 | ||
5878 | spin_lock_irqsave(&rq->lock, flags); | ||
5879 | rq->curr = rq->idle = idle; | 5883 | rq->curr = rq->idle = idle; |
5880 | #if defined(CONFIG_SMP) && defined(__ARCH_WANT_UNLOCKED_CTXSW) | 5884 | #if defined(CONFIG_SMP) && defined(__ARCH_WANT_UNLOCKED_CTXSW) |
5881 | idle->oncpu = 1; | 5885 | idle->oncpu = 1; |
@@ -7786,13 +7790,14 @@ static int dattrs_equal(struct sched_domain_attr *cur, int idx_cur, | |||
7786 | * | 7790 | * |
7787 | * The passed in 'doms_new' should be kmalloc'd. This routine takes | 7791 | * The passed in 'doms_new' should be kmalloc'd. This routine takes |
7788 | * ownership of it and will kfree it when done with it. If the caller | 7792 | * ownership of it and will kfree it when done with it. If the caller |
7789 | * failed the kmalloc call, then it can pass in doms_new == NULL, | 7793 | * failed the kmalloc call, then it can pass in doms_new == NULL && |
7790 | * and partition_sched_domains() will fallback to the single partition | 7794 | * ndoms_new == 1, and partition_sched_domains() will fallback to |
7791 | * 'fallback_doms', it also forces the domains to be rebuilt. | 7795 | * the single partition 'fallback_doms', it also forces the domains |
7796 | * to be rebuilt. | ||
7792 | * | 7797 | * |
7793 | * If doms_new==NULL it will be replaced with cpu_online_map. | 7798 | * If doms_new == NULL it will be replaced with cpu_online_map. |
7794 | * ndoms_new==0 is a special case for destroying existing domains. | 7799 | * ndoms_new == 0 is a special case for destroying existing domains, |
7795 | * It will not create the default domain. | 7800 | * and it will not create the default domain. |
7796 | * | 7801 | * |
7797 | * Call with hotplug lock held | 7802 | * Call with hotplug lock held |
7798 | */ | 7803 | */ |
diff --git a/kernel/sched_debug.c b/kernel/sched_debug.c index 48ecc51e7701..26ed8e3d1c15 100644 --- a/kernel/sched_debug.c +++ b/kernel/sched_debug.c | |||
@@ -423,10 +423,11 @@ void proc_sched_show_task(struct task_struct *p, struct seq_file *m) | |||
423 | #undef __P | 423 | #undef __P |
424 | 424 | ||
425 | { | 425 | { |
426 | unsigned int this_cpu = raw_smp_processor_id(); | ||
426 | u64 t0, t1; | 427 | u64 t0, t1; |
427 | 428 | ||
428 | t0 = sched_clock(); | 429 | t0 = cpu_clock(this_cpu); |
429 | t1 = sched_clock(); | 430 | t1 = cpu_clock(this_cpu); |
430 | SEQ_printf(m, "%-35s:%21Ld\n", | 431 | SEQ_printf(m, "%-35s:%21Ld\n", |
431 | "clock-delta", (long long)(t1-t0)); | 432 | "clock-delta", (long long)(t1-t0)); |
432 | } | 433 | } |
diff --git a/kernel/sched_stats.h b/kernel/sched_stats.h index ee71bec1da66..7dbf72a2b02c 100644 --- a/kernel/sched_stats.h +++ b/kernel/sched_stats.h | |||
@@ -298,9 +298,11 @@ static inline void account_group_user_time(struct task_struct *tsk, | |||
298 | { | 298 | { |
299 | struct signal_struct *sig; | 299 | struct signal_struct *sig; |
300 | 300 | ||
301 | sig = tsk->signal; | 301 | /* tsk == current, ensure it is safe to use ->signal */ |
302 | if (unlikely(!sig)) | 302 | if (unlikely(tsk->exit_state)) |
303 | return; | 303 | return; |
304 | |||
305 | sig = tsk->signal; | ||
304 | if (sig->cputime.totals) { | 306 | if (sig->cputime.totals) { |
305 | struct task_cputime *times; | 307 | struct task_cputime *times; |
306 | 308 | ||
@@ -325,9 +327,11 @@ static inline void account_group_system_time(struct task_struct *tsk, | |||
325 | { | 327 | { |
326 | struct signal_struct *sig; | 328 | struct signal_struct *sig; |
327 | 329 | ||
328 | sig = tsk->signal; | 330 | /* tsk == current, ensure it is safe to use ->signal */ |
329 | if (unlikely(!sig)) | 331 | if (unlikely(tsk->exit_state)) |
330 | return; | 332 | return; |
333 | |||
334 | sig = tsk->signal; | ||
331 | if (sig->cputime.totals) { | 335 | if (sig->cputime.totals) { |
332 | struct task_cputime *times; | 336 | struct task_cputime *times; |
333 | 337 | ||
@@ -353,8 +357,11 @@ static inline void account_group_exec_runtime(struct task_struct *tsk, | |||
353 | struct signal_struct *sig; | 357 | struct signal_struct *sig; |
354 | 358 | ||
355 | sig = tsk->signal; | 359 | sig = tsk->signal; |
360 | /* see __exit_signal()->task_rq_unlock_wait() */ | ||
361 | barrier(); | ||
356 | if (unlikely(!sig)) | 362 | if (unlikely(!sig)) |
357 | return; | 363 | return; |
364 | |||
358 | if (sig->cputime.totals) { | 365 | if (sig->cputime.totals) { |
359 | struct task_cputime *times; | 366 | struct task_cputime *times; |
360 | 367 | ||
diff --git a/kernel/stop_machine.c b/kernel/stop_machine.c index 9bc4c00872c9..24e8ceacc388 100644 --- a/kernel/stop_machine.c +++ b/kernel/stop_machine.c | |||
@@ -112,7 +112,7 @@ static int chill(void *unused) | |||
112 | int __stop_machine(int (*fn)(void *), void *data, const cpumask_t *cpus) | 112 | int __stop_machine(int (*fn)(void *), void *data, const cpumask_t *cpus) |
113 | { | 113 | { |
114 | struct work_struct *sm_work; | 114 | struct work_struct *sm_work; |
115 | int i; | 115 | int i, ret; |
116 | 116 | ||
117 | /* Set up initial state. */ | 117 | /* Set up initial state. */ |
118 | mutex_lock(&lock); | 118 | mutex_lock(&lock); |
@@ -137,8 +137,9 @@ int __stop_machine(int (*fn)(void *), void *data, const cpumask_t *cpus) | |||
137 | /* This will release the thread on our CPU. */ | 137 | /* This will release the thread on our CPU. */ |
138 | put_cpu(); | 138 | put_cpu(); |
139 | flush_workqueue(stop_machine_wq); | 139 | flush_workqueue(stop_machine_wq); |
140 | ret = active.fnret; | ||
140 | mutex_unlock(&lock); | 141 | mutex_unlock(&lock); |
141 | return active.fnret; | 142 | return ret; |
142 | } | 143 | } |
143 | 144 | ||
144 | int stop_machine(int (*fn)(void *), void *data, const cpumask_t *cpus) | 145 | int stop_machine(int (*fn)(void *), void *data, const cpumask_t *cpus) |
diff --git a/kernel/sys_ni.c b/kernel/sys_ni.c index a77b27b11b04..e14a23281707 100644 --- a/kernel/sys_ni.c +++ b/kernel/sys_ni.c | |||
@@ -31,7 +31,7 @@ cond_syscall(sys_socketpair); | |||
31 | cond_syscall(sys_bind); | 31 | cond_syscall(sys_bind); |
32 | cond_syscall(sys_listen); | 32 | cond_syscall(sys_listen); |
33 | cond_syscall(sys_accept); | 33 | cond_syscall(sys_accept); |
34 | cond_syscall(sys_paccept); | 34 | cond_syscall(sys_accept4); |
35 | cond_syscall(sys_connect); | 35 | cond_syscall(sys_connect); |
36 | cond_syscall(sys_getsockname); | 36 | cond_syscall(sys_getsockname); |
37 | cond_syscall(sys_getpeername); | 37 | cond_syscall(sys_getpeername); |
diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 9d048fa2d902..3d56fe7570da 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c | |||
@@ -176,6 +176,9 @@ extern struct ctl_table random_table[]; | |||
176 | #ifdef CONFIG_INOTIFY_USER | 176 | #ifdef CONFIG_INOTIFY_USER |
177 | extern struct ctl_table inotify_table[]; | 177 | extern struct ctl_table inotify_table[]; |
178 | #endif | 178 | #endif |
179 | #ifdef CONFIG_EPOLL | ||
180 | extern struct ctl_table epoll_table[]; | ||
181 | #endif | ||
179 | 182 | ||
180 | #ifdef HAVE_ARCH_PICK_MMAP_LAYOUT | 183 | #ifdef HAVE_ARCH_PICK_MMAP_LAYOUT |
181 | int sysctl_legacy_va_layout; | 184 | int sysctl_legacy_va_layout; |
@@ -1325,6 +1328,13 @@ static struct ctl_table fs_table[] = { | |||
1325 | .child = inotify_table, | 1328 | .child = inotify_table, |
1326 | }, | 1329 | }, |
1327 | #endif | 1330 | #endif |
1331 | #ifdef CONFIG_EPOLL | ||
1332 | { | ||
1333 | .procname = "epoll", | ||
1334 | .mode = 0555, | ||
1335 | .child = epoll_table, | ||
1336 | }, | ||
1337 | #endif | ||
1328 | #endif | 1338 | #endif |
1329 | { | 1339 | { |
1330 | .ctl_name = KERN_SETUID_DUMPABLE, | 1340 | .ctl_name = KERN_SETUID_DUMPABLE, |
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 4a39d24568c8..78db083390f0 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c | |||
@@ -185,7 +185,6 @@ enum { | |||
185 | }; | 185 | }; |
186 | 186 | ||
187 | static int ftrace_filtered; | 187 | static int ftrace_filtered; |
188 | static int tracing_on; | ||
189 | 188 | ||
190 | static LIST_HEAD(ftrace_new_addrs); | 189 | static LIST_HEAD(ftrace_new_addrs); |
191 | 190 | ||
@@ -327,96 +326,89 @@ ftrace_record_ip(unsigned long ip) | |||
327 | 326 | ||
328 | static int | 327 | static int |
329 | __ftrace_replace_code(struct dyn_ftrace *rec, | 328 | __ftrace_replace_code(struct dyn_ftrace *rec, |
330 | unsigned char *old, unsigned char *new, int enable) | 329 | unsigned char *nop, int enable) |
331 | { | 330 | { |
332 | unsigned long ip, fl; | 331 | unsigned long ip, fl; |
332 | unsigned char *call, *old, *new; | ||
333 | 333 | ||
334 | ip = rec->ip; | 334 | ip = rec->ip; |
335 | 335 | ||
336 | if (ftrace_filtered && enable) { | 336 | /* |
337 | * If this record is not to be traced and | ||
338 | * it is not enabled then do nothing. | ||
339 | * | ||
340 | * If this record is not to be traced and | ||
341 | * it is enabled then disabled it. | ||
342 | * | ||
343 | */ | ||
344 | if (rec->flags & FTRACE_FL_NOTRACE) { | ||
345 | if (rec->flags & FTRACE_FL_ENABLED) | ||
346 | rec->flags &= ~FTRACE_FL_ENABLED; | ||
347 | else | ||
348 | return 0; | ||
349 | |||
350 | } else if (ftrace_filtered && enable) { | ||
337 | /* | 351 | /* |
338 | * If filtering is on: | 352 | * Filtering is on: |
339 | * | ||
340 | * If this record is set to be filtered and | ||
341 | * is enabled then do nothing. | ||
342 | * | ||
343 | * If this record is set to be filtered and | ||
344 | * it is not enabled, enable it. | ||
345 | * | ||
346 | * If this record is not set to be filtered | ||
347 | * and it is not enabled do nothing. | ||
348 | * | ||
349 | * If this record is set not to trace then | ||
350 | * do nothing. | ||
351 | * | ||
352 | * If this record is set not to trace and | ||
353 | * it is enabled then disable it. | ||
354 | * | ||
355 | * If this record is not set to be filtered and | ||
356 | * it is enabled, disable it. | ||
357 | */ | 353 | */ |
358 | 354 | ||
359 | fl = rec->flags & (FTRACE_FL_FILTER | FTRACE_FL_NOTRACE | | 355 | fl = rec->flags & (FTRACE_FL_FILTER | FTRACE_FL_ENABLED); |
360 | FTRACE_FL_ENABLED); | ||
361 | 356 | ||
362 | if ((fl == (FTRACE_FL_FILTER | FTRACE_FL_ENABLED)) || | 357 | /* Record is filtered and enabled, do nothing */ |
363 | (fl == (FTRACE_FL_FILTER | FTRACE_FL_NOTRACE)) || | 358 | if (fl == (FTRACE_FL_FILTER | FTRACE_FL_ENABLED)) |
364 | !fl || (fl == FTRACE_FL_NOTRACE)) | ||
365 | return 0; | 359 | return 0; |
366 | 360 | ||
367 | /* | 361 | /* Record is not filtered and is not enabled do nothing */ |
368 | * If it is enabled disable it, | 362 | if (!fl) |
369 | * otherwise enable it! | 363 | return 0; |
370 | */ | 364 | |
371 | if (fl & FTRACE_FL_ENABLED) { | 365 | /* Record is not filtered but enabled, disable it */ |
372 | /* swap new and old */ | 366 | if (fl == FTRACE_FL_ENABLED) |
373 | new = old; | ||
374 | old = ftrace_call_replace(ip, FTRACE_ADDR); | ||
375 | rec->flags &= ~FTRACE_FL_ENABLED; | 367 | rec->flags &= ~FTRACE_FL_ENABLED; |
376 | } else { | 368 | else |
377 | new = ftrace_call_replace(ip, FTRACE_ADDR); | 369 | /* Otherwise record is filtered but not enabled, enable it */ |
378 | rec->flags |= FTRACE_FL_ENABLED; | 370 | rec->flags |= FTRACE_FL_ENABLED; |
379 | } | ||
380 | } else { | 371 | } else { |
372 | /* Disable or not filtered */ | ||
381 | 373 | ||
382 | if (enable) { | 374 | if (enable) { |
383 | /* | 375 | /* if record is enabled, do nothing */ |
384 | * If this record is set not to trace and is | ||
385 | * not enabled, do nothing. | ||
386 | */ | ||
387 | fl = rec->flags & (FTRACE_FL_NOTRACE | FTRACE_FL_ENABLED); | ||
388 | if (fl == FTRACE_FL_NOTRACE) | ||
389 | return 0; | ||
390 | |||
391 | new = ftrace_call_replace(ip, FTRACE_ADDR); | ||
392 | } else | ||
393 | old = ftrace_call_replace(ip, FTRACE_ADDR); | ||
394 | |||
395 | if (enable) { | ||
396 | if (rec->flags & FTRACE_FL_ENABLED) | 376 | if (rec->flags & FTRACE_FL_ENABLED) |
397 | return 0; | 377 | return 0; |
378 | |||
398 | rec->flags |= FTRACE_FL_ENABLED; | 379 | rec->flags |= FTRACE_FL_ENABLED; |
380 | |||
399 | } else { | 381 | } else { |
382 | |||
383 | /* if record is not enabled do nothing */ | ||
400 | if (!(rec->flags & FTRACE_FL_ENABLED)) | 384 | if (!(rec->flags & FTRACE_FL_ENABLED)) |
401 | return 0; | 385 | return 0; |
386 | |||
402 | rec->flags &= ~FTRACE_FL_ENABLED; | 387 | rec->flags &= ~FTRACE_FL_ENABLED; |
403 | } | 388 | } |
404 | } | 389 | } |
405 | 390 | ||
391 | call = ftrace_call_replace(ip, FTRACE_ADDR); | ||
392 | |||
393 | if (rec->flags & FTRACE_FL_ENABLED) { | ||
394 | old = nop; | ||
395 | new = call; | ||
396 | } else { | ||
397 | old = call; | ||
398 | new = nop; | ||
399 | } | ||
400 | |||
406 | return ftrace_modify_code(ip, old, new); | 401 | return ftrace_modify_code(ip, old, new); |
407 | } | 402 | } |
408 | 403 | ||
409 | static void ftrace_replace_code(int enable) | 404 | static void ftrace_replace_code(int enable) |
410 | { | 405 | { |
411 | int i, failed; | 406 | int i, failed; |
412 | unsigned char *new = NULL, *old = NULL; | 407 | unsigned char *nop = NULL; |
413 | struct dyn_ftrace *rec; | 408 | struct dyn_ftrace *rec; |
414 | struct ftrace_page *pg; | 409 | struct ftrace_page *pg; |
415 | 410 | ||
416 | if (enable) | 411 | nop = ftrace_nop_replace(); |
417 | old = ftrace_nop_replace(); | ||
418 | else | ||
419 | new = ftrace_nop_replace(); | ||
420 | 412 | ||
421 | for (pg = ftrace_pages_start; pg; pg = pg->next) { | 413 | for (pg = ftrace_pages_start; pg; pg = pg->next) { |
422 | for (i = 0; i < pg->index; i++) { | 414 | for (i = 0; i < pg->index; i++) { |
@@ -434,7 +426,7 @@ static void ftrace_replace_code(int enable) | |||
434 | unfreeze_record(rec); | 426 | unfreeze_record(rec); |
435 | } | 427 | } |
436 | 428 | ||
437 | failed = __ftrace_replace_code(rec, old, new, enable); | 429 | failed = __ftrace_replace_code(rec, nop, enable); |
438 | if (failed && (rec->flags & FTRACE_FL_CONVERTED)) { | 430 | if (failed && (rec->flags & FTRACE_FL_CONVERTED)) { |
439 | rec->flags |= FTRACE_FL_FAILED; | 431 | rec->flags |= FTRACE_FL_FAILED; |
440 | if ((system_state == SYSTEM_BOOTING) || | 432 | if ((system_state == SYSTEM_BOOTING) || |
@@ -506,13 +498,10 @@ static int __ftrace_modify_code(void *data) | |||
506 | { | 498 | { |
507 | int *command = data; | 499 | int *command = data; |
508 | 500 | ||
509 | if (*command & FTRACE_ENABLE_CALLS) { | 501 | if (*command & FTRACE_ENABLE_CALLS) |
510 | ftrace_replace_code(1); | 502 | ftrace_replace_code(1); |
511 | tracing_on = 1; | 503 | else if (*command & FTRACE_DISABLE_CALLS) |
512 | } else if (*command & FTRACE_DISABLE_CALLS) { | ||
513 | ftrace_replace_code(0); | 504 | ftrace_replace_code(0); |
514 | tracing_on = 0; | ||
515 | } | ||
516 | 505 | ||
517 | if (*command & FTRACE_UPDATE_TRACE_FUNC) | 506 | if (*command & FTRACE_UPDATE_TRACE_FUNC) |
518 | ftrace_update_ftrace_func(ftrace_trace_function); | 507 | ftrace_update_ftrace_func(ftrace_trace_function); |
@@ -538,8 +527,7 @@ static void ftrace_startup(void) | |||
538 | 527 | ||
539 | mutex_lock(&ftrace_start_lock); | 528 | mutex_lock(&ftrace_start_lock); |
540 | ftrace_start++; | 529 | ftrace_start++; |
541 | if (ftrace_start == 1) | 530 | command |= FTRACE_ENABLE_CALLS; |
542 | command |= FTRACE_ENABLE_CALLS; | ||
543 | 531 | ||
544 | if (saved_ftrace_func != ftrace_trace_function) { | 532 | if (saved_ftrace_func != ftrace_trace_function) { |
545 | saved_ftrace_func = ftrace_trace_function; | 533 | saved_ftrace_func = ftrace_trace_function; |
@@ -677,7 +665,7 @@ static int __init ftrace_dyn_table_alloc(unsigned long num_to_init) | |||
677 | 665 | ||
678 | cnt = num_to_init / ENTRIES_PER_PAGE; | 666 | cnt = num_to_init / ENTRIES_PER_PAGE; |
679 | pr_info("ftrace: allocating %ld entries in %d pages\n", | 667 | pr_info("ftrace: allocating %ld entries in %d pages\n", |
680 | num_to_init, cnt); | 668 | num_to_init, cnt + 1); |
681 | 669 | ||
682 | for (i = 0; i < cnt; i++) { | 670 | for (i = 0; i < cnt; i++) { |
683 | pg->next = (void *)get_zeroed_page(GFP_KERNEL); | 671 | pg->next = (void *)get_zeroed_page(GFP_KERNEL); |
@@ -738,6 +726,9 @@ t_next(struct seq_file *m, void *v, loff_t *pos) | |||
738 | ((iter->flags & FTRACE_ITER_FAILURES) && | 726 | ((iter->flags & FTRACE_ITER_FAILURES) && |
739 | !(rec->flags & FTRACE_FL_FAILED)) || | 727 | !(rec->flags & FTRACE_FL_FAILED)) || |
740 | 728 | ||
729 | ((iter->flags & FTRACE_ITER_FILTER) && | ||
730 | !(rec->flags & FTRACE_FL_FILTER)) || | ||
731 | |||
741 | ((iter->flags & FTRACE_ITER_NOTRACE) && | 732 | ((iter->flags & FTRACE_ITER_NOTRACE) && |
742 | !(rec->flags & FTRACE_FL_NOTRACE))) { | 733 | !(rec->flags & FTRACE_FL_NOTRACE))) { |
743 | rec = NULL; | 734 | rec = NULL; |
@@ -757,13 +748,11 @@ static void *t_start(struct seq_file *m, loff_t *pos) | |||
757 | void *p = NULL; | 748 | void *p = NULL; |
758 | loff_t l = -1; | 749 | loff_t l = -1; |
759 | 750 | ||
760 | if (*pos != iter->pos) { | 751 | if (*pos > iter->pos) |
761 | for (p = t_next(m, p, &l); p && l < *pos; p = t_next(m, p, &l)) | 752 | *pos = iter->pos; |
762 | ; | 753 | |
763 | } else { | 754 | l = *pos; |
764 | l = *pos; | 755 | p = t_next(m, p, &l); |
765 | p = t_next(m, p, &l); | ||
766 | } | ||
767 | 756 | ||
768 | return p; | 757 | return p; |
769 | } | 758 | } |
@@ -774,15 +763,21 @@ static void t_stop(struct seq_file *m, void *p) | |||
774 | 763 | ||
775 | static int t_show(struct seq_file *m, void *v) | 764 | static int t_show(struct seq_file *m, void *v) |
776 | { | 765 | { |
766 | struct ftrace_iterator *iter = m->private; | ||
777 | struct dyn_ftrace *rec = v; | 767 | struct dyn_ftrace *rec = v; |
778 | char str[KSYM_SYMBOL_LEN]; | 768 | char str[KSYM_SYMBOL_LEN]; |
769 | int ret = 0; | ||
779 | 770 | ||
780 | if (!rec) | 771 | if (!rec) |
781 | return 0; | 772 | return 0; |
782 | 773 | ||
783 | kallsyms_lookup(rec->ip, NULL, NULL, NULL, str); | 774 | kallsyms_lookup(rec->ip, NULL, NULL, NULL, str); |
784 | 775 | ||
785 | seq_printf(m, "%s\n", str); | 776 | ret = seq_printf(m, "%s\n", str); |
777 | if (ret < 0) { | ||
778 | iter->pos--; | ||
779 | iter->idx--; | ||
780 | } | ||
786 | 781 | ||
787 | return 0; | 782 | return 0; |
788 | } | 783 | } |
@@ -808,7 +803,7 @@ ftrace_avail_open(struct inode *inode, struct file *file) | |||
808 | return -ENOMEM; | 803 | return -ENOMEM; |
809 | 804 | ||
810 | iter->pg = ftrace_pages_start; | 805 | iter->pg = ftrace_pages_start; |
811 | iter->pos = -1; | 806 | iter->pos = 0; |
812 | 807 | ||
813 | ret = seq_open(file, &show_ftrace_seq_ops); | 808 | ret = seq_open(file, &show_ftrace_seq_ops); |
814 | if (!ret) { | 809 | if (!ret) { |
@@ -895,7 +890,7 @@ ftrace_regex_open(struct inode *inode, struct file *file, int enable) | |||
895 | 890 | ||
896 | if (file->f_mode & FMODE_READ) { | 891 | if (file->f_mode & FMODE_READ) { |
897 | iter->pg = ftrace_pages_start; | 892 | iter->pg = ftrace_pages_start; |
898 | iter->pos = -1; | 893 | iter->pos = 0; |
899 | iter->flags = enable ? FTRACE_ITER_FILTER : | 894 | iter->flags = enable ? FTRACE_ITER_FILTER : |
900 | FTRACE_ITER_NOTRACE; | 895 | FTRACE_ITER_NOTRACE; |
901 | 896 | ||
@@ -1186,7 +1181,7 @@ ftrace_regex_release(struct inode *inode, struct file *file, int enable) | |||
1186 | 1181 | ||
1187 | mutex_lock(&ftrace_sysctl_lock); | 1182 | mutex_lock(&ftrace_sysctl_lock); |
1188 | mutex_lock(&ftrace_start_lock); | 1183 | mutex_lock(&ftrace_start_lock); |
1189 | if (iter->filtered && ftrace_start && ftrace_enabled) | 1184 | if (ftrace_start && ftrace_enabled) |
1190 | ftrace_run_update_code(FTRACE_ENABLE_CALLS); | 1185 | ftrace_run_update_code(FTRACE_ENABLE_CALLS); |
1191 | mutex_unlock(&ftrace_start_lock); | 1186 | mutex_unlock(&ftrace_start_lock); |
1192 | mutex_unlock(&ftrace_sysctl_lock); | 1187 | mutex_unlock(&ftrace_sysctl_lock); |
diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index 2f76193c3489..668bbb5ef2bd 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c | |||
@@ -16,14 +16,49 @@ | |||
16 | #include <linux/list.h> | 16 | #include <linux/list.h> |
17 | #include <linux/fs.h> | 17 | #include <linux/fs.h> |
18 | 18 | ||
19 | #include "trace.h" | ||
20 | |||
21 | /* Global flag to disable all recording to ring buffers */ | ||
22 | static int ring_buffers_off __read_mostly; | ||
23 | |||
24 | /** | ||
25 | * tracing_on - enable all tracing buffers | ||
26 | * | ||
27 | * This function enables all tracing buffers that may have been | ||
28 | * disabled with tracing_off. | ||
29 | */ | ||
30 | void tracing_on(void) | ||
31 | { | ||
32 | ring_buffers_off = 0; | ||
33 | } | ||
34 | |||
35 | /** | ||
36 | * tracing_off - turn off all tracing buffers | ||
37 | * | ||
38 | * This function stops all tracing buffers from recording data. | ||
39 | * It does not disable any overhead the tracers themselves may | ||
40 | * be causing. This function simply causes all recording to | ||
41 | * the ring buffers to fail. | ||
42 | */ | ||
43 | void tracing_off(void) | ||
44 | { | ||
45 | ring_buffers_off = 1; | ||
46 | } | ||
47 | |||
19 | /* Up this if you want to test the TIME_EXTENTS and normalization */ | 48 | /* Up this if you want to test the TIME_EXTENTS and normalization */ |
20 | #define DEBUG_SHIFT 0 | 49 | #define DEBUG_SHIFT 0 |
21 | 50 | ||
22 | /* FIXME!!! */ | 51 | /* FIXME!!! */ |
23 | u64 ring_buffer_time_stamp(int cpu) | 52 | u64 ring_buffer_time_stamp(int cpu) |
24 | { | 53 | { |
54 | u64 time; | ||
55 | |||
56 | preempt_disable_notrace(); | ||
25 | /* shift to debug/test normalization and TIME_EXTENTS */ | 57 | /* shift to debug/test normalization and TIME_EXTENTS */ |
26 | return sched_clock() << DEBUG_SHIFT; | 58 | time = sched_clock() << DEBUG_SHIFT; |
59 | preempt_enable_notrace(); | ||
60 | |||
61 | return time; | ||
27 | } | 62 | } |
28 | 63 | ||
29 | void ring_buffer_normalize_time_stamp(int cpu, u64 *ts) | 64 | void ring_buffer_normalize_time_stamp(int cpu, u64 *ts) |
@@ -503,6 +538,12 @@ int ring_buffer_resize(struct ring_buffer *buffer, unsigned long size) | |||
503 | LIST_HEAD(pages); | 538 | LIST_HEAD(pages); |
504 | int i, cpu; | 539 | int i, cpu; |
505 | 540 | ||
541 | /* | ||
542 | * Always succeed at resizing a non-existent buffer: | ||
543 | */ | ||
544 | if (!buffer) | ||
545 | return size; | ||
546 | |||
506 | size = DIV_ROUND_UP(size, BUF_PAGE_SIZE); | 547 | size = DIV_ROUND_UP(size, BUF_PAGE_SIZE); |
507 | size *= BUF_PAGE_SIZE; | 548 | size *= BUF_PAGE_SIZE; |
508 | buffer_size = buffer->pages * BUF_PAGE_SIZE; | 549 | buffer_size = buffer->pages * BUF_PAGE_SIZE; |
@@ -576,6 +617,7 @@ int ring_buffer_resize(struct ring_buffer *buffer, unsigned long size) | |||
576 | list_del_init(&page->list); | 617 | list_del_init(&page->list); |
577 | free_buffer_page(page); | 618 | free_buffer_page(page); |
578 | } | 619 | } |
620 | mutex_unlock(&buffer->mutex); | ||
579 | return -ENOMEM; | 621 | return -ENOMEM; |
580 | } | 622 | } |
581 | 623 | ||
@@ -1133,6 +1175,9 @@ ring_buffer_lock_reserve(struct ring_buffer *buffer, | |||
1133 | struct ring_buffer_event *event; | 1175 | struct ring_buffer_event *event; |
1134 | int cpu, resched; | 1176 | int cpu, resched; |
1135 | 1177 | ||
1178 | if (ring_buffers_off) | ||
1179 | return NULL; | ||
1180 | |||
1136 | if (atomic_read(&buffer->record_disabled)) | 1181 | if (atomic_read(&buffer->record_disabled)) |
1137 | return NULL; | 1182 | return NULL; |
1138 | 1183 | ||
@@ -1170,7 +1215,7 @@ ring_buffer_lock_reserve(struct ring_buffer *buffer, | |||
1170 | 1215 | ||
1171 | out: | 1216 | out: |
1172 | if (resched) | 1217 | if (resched) |
1173 | preempt_enable_notrace(); | 1218 | preempt_enable_no_resched_notrace(); |
1174 | else | 1219 | else |
1175 | preempt_enable_notrace(); | 1220 | preempt_enable_notrace(); |
1176 | return NULL; | 1221 | return NULL; |
@@ -1249,6 +1294,9 @@ int ring_buffer_write(struct ring_buffer *buffer, | |||
1249 | int ret = -EBUSY; | 1294 | int ret = -EBUSY; |
1250 | int cpu, resched; | 1295 | int cpu, resched; |
1251 | 1296 | ||
1297 | if (ring_buffers_off) | ||
1298 | return -EBUSY; | ||
1299 | |||
1252 | if (atomic_read(&buffer->record_disabled)) | 1300 | if (atomic_read(&buffer->record_disabled)) |
1253 | return -EBUSY; | 1301 | return -EBUSY; |
1254 | 1302 | ||
@@ -2070,3 +2118,69 @@ int ring_buffer_swap_cpu(struct ring_buffer *buffer_a, | |||
2070 | return 0; | 2118 | return 0; |
2071 | } | 2119 | } |
2072 | 2120 | ||
2121 | static ssize_t | ||
2122 | rb_simple_read(struct file *filp, char __user *ubuf, | ||
2123 | size_t cnt, loff_t *ppos) | ||
2124 | { | ||
2125 | int *p = filp->private_data; | ||
2126 | char buf[64]; | ||
2127 | int r; | ||
2128 | |||
2129 | /* !ring_buffers_off == tracing_on */ | ||
2130 | r = sprintf(buf, "%d\n", !*p); | ||
2131 | |||
2132 | return simple_read_from_buffer(ubuf, cnt, ppos, buf, r); | ||
2133 | } | ||
2134 | |||
2135 | static ssize_t | ||
2136 | rb_simple_write(struct file *filp, const char __user *ubuf, | ||
2137 | size_t cnt, loff_t *ppos) | ||
2138 | { | ||
2139 | int *p = filp->private_data; | ||
2140 | char buf[64]; | ||
2141 | long val; | ||
2142 | int ret; | ||
2143 | |||
2144 | if (cnt >= sizeof(buf)) | ||
2145 | return -EINVAL; | ||
2146 | |||
2147 | if (copy_from_user(&buf, ubuf, cnt)) | ||
2148 | return -EFAULT; | ||
2149 | |||
2150 | buf[cnt] = 0; | ||
2151 | |||
2152 | ret = strict_strtoul(buf, 10, &val); | ||
2153 | if (ret < 0) | ||
2154 | return ret; | ||
2155 | |||
2156 | /* !ring_buffers_off == tracing_on */ | ||
2157 | *p = !val; | ||
2158 | |||
2159 | (*ppos)++; | ||
2160 | |||
2161 | return cnt; | ||
2162 | } | ||
2163 | |||
2164 | static struct file_operations rb_simple_fops = { | ||
2165 | .open = tracing_open_generic, | ||
2166 | .read = rb_simple_read, | ||
2167 | .write = rb_simple_write, | ||
2168 | }; | ||
2169 | |||
2170 | |||
2171 | static __init int rb_init_debugfs(void) | ||
2172 | { | ||
2173 | struct dentry *d_tracer; | ||
2174 | struct dentry *entry; | ||
2175 | |||
2176 | d_tracer = tracing_init_dentry(); | ||
2177 | |||
2178 | entry = debugfs_create_file("tracing_on", 0644, d_tracer, | ||
2179 | &ring_buffers_off, &rb_simple_fops); | ||
2180 | if (!entry) | ||
2181 | pr_warning("Could not create debugfs 'tracing_on' entry\n"); | ||
2182 | |||
2183 | return 0; | ||
2184 | } | ||
2185 | |||
2186 | fs_initcall(rb_init_debugfs); | ||
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 697eda36b86a..d86e3252f300 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
@@ -1936,6 +1936,7 @@ __tracing_open(struct inode *inode, struct file *file, int *ret) | |||
1936 | ring_buffer_read_finish(iter->buffer_iter[cpu]); | 1936 | ring_buffer_read_finish(iter->buffer_iter[cpu]); |
1937 | } | 1937 | } |
1938 | mutex_unlock(&trace_types_lock); | 1938 | mutex_unlock(&trace_types_lock); |
1939 | kfree(iter); | ||
1939 | 1940 | ||
1940 | return ERR_PTR(-ENOMEM); | 1941 | return ERR_PTR(-ENOMEM); |
1941 | } | 1942 | } |
diff --git a/kernel/trace/trace_mmiotrace.c b/kernel/trace/trace_mmiotrace.c index f28484618ff0..e62cbf78eab6 100644 --- a/kernel/trace/trace_mmiotrace.c +++ b/kernel/trace/trace_mmiotrace.c | |||
@@ -18,12 +18,14 @@ struct header_iter { | |||
18 | 18 | ||
19 | static struct trace_array *mmio_trace_array; | 19 | static struct trace_array *mmio_trace_array; |
20 | static bool overrun_detected; | 20 | static bool overrun_detected; |
21 | static unsigned long prev_overruns; | ||
21 | 22 | ||
22 | static void mmio_reset_data(struct trace_array *tr) | 23 | static void mmio_reset_data(struct trace_array *tr) |
23 | { | 24 | { |
24 | int cpu; | 25 | int cpu; |
25 | 26 | ||
26 | overrun_detected = false; | 27 | overrun_detected = false; |
28 | prev_overruns = 0; | ||
27 | tr->time_start = ftrace_now(tr->cpu); | 29 | tr->time_start = ftrace_now(tr->cpu); |
28 | 30 | ||
29 | for_each_online_cpu(cpu) | 31 | for_each_online_cpu(cpu) |
@@ -128,16 +130,12 @@ static void mmio_close(struct trace_iterator *iter) | |||
128 | 130 | ||
129 | static unsigned long count_overruns(struct trace_iterator *iter) | 131 | static unsigned long count_overruns(struct trace_iterator *iter) |
130 | { | 132 | { |
131 | int cpu; | ||
132 | unsigned long cnt = 0; | 133 | unsigned long cnt = 0; |
133 | /* FIXME: */ | 134 | unsigned long over = ring_buffer_overruns(iter->tr->buffer); |
134 | #if 0 | 135 | |
135 | for_each_online_cpu(cpu) { | 136 | if (over > prev_overruns) |
136 | cnt += iter->overrun[cpu]; | 137 | cnt = over - prev_overruns; |
137 | iter->overrun[cpu] = 0; | 138 | prev_overruns = over; |
138 | } | ||
139 | #endif | ||
140 | (void)cpu; | ||
141 | return cnt; | 139 | return cnt; |
142 | } | 140 | } |
143 | 141 | ||
diff --git a/kernel/trace/trace_stack.c b/kernel/trace/trace_stack.c index be682b62fe58..3bdb44bde4b7 100644 --- a/kernel/trace/trace_stack.c +++ b/kernel/trace/trace_stack.c | |||
@@ -184,11 +184,16 @@ static struct file_operations stack_max_size_fops = { | |||
184 | static void * | 184 | static void * |
185 | t_next(struct seq_file *m, void *v, loff_t *pos) | 185 | t_next(struct seq_file *m, void *v, loff_t *pos) |
186 | { | 186 | { |
187 | long i = (long)m->private; | 187 | long i; |
188 | 188 | ||
189 | (*pos)++; | 189 | (*pos)++; |
190 | 190 | ||
191 | i++; | 191 | if (v == SEQ_START_TOKEN) |
192 | i = 0; | ||
193 | else { | ||
194 | i = *(long *)v; | ||
195 | i++; | ||
196 | } | ||
192 | 197 | ||
193 | if (i >= max_stack_trace.nr_entries || | 198 | if (i >= max_stack_trace.nr_entries || |
194 | stack_dump_trace[i] == ULONG_MAX) | 199 | stack_dump_trace[i] == ULONG_MAX) |
@@ -201,12 +206,15 @@ t_next(struct seq_file *m, void *v, loff_t *pos) | |||
201 | 206 | ||
202 | static void *t_start(struct seq_file *m, loff_t *pos) | 207 | static void *t_start(struct seq_file *m, loff_t *pos) |
203 | { | 208 | { |
204 | void *t = &m->private; | 209 | void *t = SEQ_START_TOKEN; |
205 | loff_t l = 0; | 210 | loff_t l = 0; |
206 | 211 | ||
207 | local_irq_disable(); | 212 | local_irq_disable(); |
208 | __raw_spin_lock(&max_stack_lock); | 213 | __raw_spin_lock(&max_stack_lock); |
209 | 214 | ||
215 | if (*pos == 0) | ||
216 | return SEQ_START_TOKEN; | ||
217 | |||
210 | for (; t && l < *pos; t = t_next(m, t, &l)) | 218 | for (; t && l < *pos; t = t_next(m, t, &l)) |
211 | ; | 219 | ; |
212 | 220 | ||
@@ -235,10 +243,10 @@ static int trace_lookup_stack(struct seq_file *m, long i) | |||
235 | 243 | ||
236 | static int t_show(struct seq_file *m, void *v) | 244 | static int t_show(struct seq_file *m, void *v) |
237 | { | 245 | { |
238 | long i = *(long *)v; | 246 | long i; |
239 | int size; | 247 | int size; |
240 | 248 | ||
241 | if (i < 0) { | 249 | if (v == SEQ_START_TOKEN) { |
242 | seq_printf(m, " Depth Size Location" | 250 | seq_printf(m, " Depth Size Location" |
243 | " (%d entries)\n" | 251 | " (%d entries)\n" |
244 | " ----- ---- --------\n", | 252 | " ----- ---- --------\n", |
@@ -246,6 +254,8 @@ static int t_show(struct seq_file *m, void *v) | |||
246 | return 0; | 254 | return 0; |
247 | } | 255 | } |
248 | 256 | ||
257 | i = *(long *)v; | ||
258 | |||
249 | if (i >= max_stack_trace.nr_entries || | 259 | if (i >= max_stack_trace.nr_entries || |
250 | stack_dump_trace[i] == ULONG_MAX) | 260 | stack_dump_trace[i] == ULONG_MAX) |
251 | return 0; | 261 | return 0; |
@@ -275,10 +285,6 @@ static int stack_trace_open(struct inode *inode, struct file *file) | |||
275 | int ret; | 285 | int ret; |
276 | 286 | ||
277 | ret = seq_open(file, &stack_trace_seq_ops); | 287 | ret = seq_open(file, &stack_trace_seq_ops); |
278 | if (!ret) { | ||
279 | struct seq_file *m = file->private_data; | ||
280 | m->private = (void *)-1; | ||
281 | } | ||
282 | 288 | ||
283 | return ret; | 289 | return ret; |
284 | } | 290 | } |
@@ -185,6 +185,7 @@ static int sub_alloc(struct idr *idp, int *starting_id, struct idr_layer **pa) | |||
185 | new = get_from_free_list(idp); | 185 | new = get_from_free_list(idp); |
186 | if (!new) | 186 | if (!new) |
187 | return -1; | 187 | return -1; |
188 | new->layer = l-1; | ||
188 | rcu_assign_pointer(p->ary[m], new); | 189 | rcu_assign_pointer(p->ary[m], new); |
189 | p->count++; | 190 | p->count++; |
190 | } | 191 | } |
@@ -210,6 +211,7 @@ build_up: | |||
210 | if (unlikely(!p)) { | 211 | if (unlikely(!p)) { |
211 | if (!(p = get_from_free_list(idp))) | 212 | if (!(p = get_from_free_list(idp))) |
212 | return -1; | 213 | return -1; |
214 | p->layer = 0; | ||
213 | layers = 1; | 215 | layers = 1; |
214 | } | 216 | } |
215 | /* | 217 | /* |
@@ -237,6 +239,7 @@ build_up: | |||
237 | } | 239 | } |
238 | new->ary[0] = p; | 240 | new->ary[0] = p; |
239 | new->count = 1; | 241 | new->count = 1; |
242 | new->layer = layers-1; | ||
240 | if (p->bitmap == IDR_FULL) | 243 | if (p->bitmap == IDR_FULL) |
241 | __set_bit(0, &new->bitmap); | 244 | __set_bit(0, &new->bitmap); |
242 | p = new; | 245 | p = new; |
@@ -493,17 +496,21 @@ void *idr_find(struct idr *idp, int id) | |||
493 | int n; | 496 | int n; |
494 | struct idr_layer *p; | 497 | struct idr_layer *p; |
495 | 498 | ||
496 | n = idp->layers * IDR_BITS; | ||
497 | p = rcu_dereference(idp->top); | 499 | p = rcu_dereference(idp->top); |
500 | if (!p) | ||
501 | return NULL; | ||
502 | n = (p->layer+1) * IDR_BITS; | ||
498 | 503 | ||
499 | /* Mask off upper bits we don't use for the search. */ | 504 | /* Mask off upper bits we don't use for the search. */ |
500 | id &= MAX_ID_MASK; | 505 | id &= MAX_ID_MASK; |
501 | 506 | ||
502 | if (id >= (1 << n)) | 507 | if (id >= (1 << n)) |
503 | return NULL; | 508 | return NULL; |
509 | BUG_ON(n == 0); | ||
504 | 510 | ||
505 | while (n > 0 && p) { | 511 | while (n > 0 && p) { |
506 | n -= IDR_BITS; | 512 | n -= IDR_BITS; |
513 | BUG_ON(n != p->layer*IDR_BITS); | ||
507 | p = rcu_dereference(p->ary[(id >> n) & IDR_MASK]); | 514 | p = rcu_dereference(p->ary[(id >> n) & IDR_MASK]); |
508 | } | 515 | } |
509 | return((void *)p); | 516 | return((void *)p); |
@@ -582,8 +589,11 @@ void *idr_replace(struct idr *idp, void *ptr, int id) | |||
582 | int n; | 589 | int n; |
583 | struct idr_layer *p, *old_p; | 590 | struct idr_layer *p, *old_p; |
584 | 591 | ||
585 | n = idp->layers * IDR_BITS; | ||
586 | p = idp->top; | 592 | p = idp->top; |
593 | if (!p) | ||
594 | return ERR_PTR(-EINVAL); | ||
595 | |||
596 | n = (p->layer+1) * IDR_BITS; | ||
587 | 597 | ||
588 | id &= MAX_ID_MASK; | 598 | id &= MAX_ID_MASK; |
589 | 599 | ||
diff --git a/lib/scatterlist.c b/lib/scatterlist.c index 8d2688ff1352..b7b449dafbe5 100644 --- a/lib/scatterlist.c +++ b/lib/scatterlist.c | |||
@@ -395,7 +395,7 @@ void sg_miter_stop(struct sg_mapping_iter *miter) | |||
395 | WARN_ON(!irqs_disabled()); | 395 | WARN_ON(!irqs_disabled()); |
396 | kunmap_atomic(miter->addr, KM_BIO_SRC_IRQ); | 396 | kunmap_atomic(miter->addr, KM_BIO_SRC_IRQ); |
397 | } else | 397 | } else |
398 | kunmap(miter->addr); | 398 | kunmap(miter->page); |
399 | 399 | ||
400 | miter->page = NULL; | 400 | miter->page = NULL; |
401 | miter->addr = NULL; | 401 | miter->addr = NULL; |
diff --git a/lib/swiotlb.c b/lib/swiotlb.c index 78330c37a61b..5f6c629a924d 100644 --- a/lib/swiotlb.c +++ b/lib/swiotlb.c | |||
@@ -467,9 +467,13 @@ swiotlb_alloc_coherent(struct device *hwdev, size_t size, | |||
467 | dma_addr_t dev_addr; | 467 | dma_addr_t dev_addr; |
468 | void *ret; | 468 | void *ret; |
469 | int order = get_order(size); | 469 | int order = get_order(size); |
470 | u64 dma_mask = DMA_32BIT_MASK; | ||
471 | |||
472 | if (hwdev && hwdev->coherent_dma_mask) | ||
473 | dma_mask = hwdev->coherent_dma_mask; | ||
470 | 474 | ||
471 | ret = (void *)__get_free_pages(flags, order); | 475 | ret = (void *)__get_free_pages(flags, order); |
472 | if (ret && address_needs_mapping(hwdev, virt_to_bus(ret), size)) { | 476 | if (ret && !is_buffer_dma_capable(dma_mask, virt_to_bus(ret), size)) { |
473 | /* | 477 | /* |
474 | * The allocated memory isn't reachable by the device. | 478 | * The allocated memory isn't reachable by the device. |
475 | * Fall back on swiotlb_map_single(). | 479 | * Fall back on swiotlb_map_single(). |
@@ -493,9 +497,9 @@ swiotlb_alloc_coherent(struct device *hwdev, size_t size, | |||
493 | dev_addr = virt_to_bus(ret); | 497 | dev_addr = virt_to_bus(ret); |
494 | 498 | ||
495 | /* Confirm address can be DMA'd by device */ | 499 | /* Confirm address can be DMA'd by device */ |
496 | if (address_needs_mapping(hwdev, dev_addr, size)) { | 500 | if (!is_buffer_dma_capable(dma_mask, dev_addr, size)) { |
497 | printk("hwdev DMA mask = 0x%016Lx, dev_addr = 0x%016Lx\n", | 501 | printk("hwdev DMA mask = 0x%016Lx, dev_addr = 0x%016Lx\n", |
498 | (unsigned long long)*hwdev->dma_mask, | 502 | (unsigned long long)dma_mask, |
499 | (unsigned long long)dev_addr); | 503 | (unsigned long long)dev_addr); |
500 | 504 | ||
501 | /* DMA_TO_DEVICE to avoid memcpy in unmap_single */ | 505 | /* DMA_TO_DEVICE to avoid memcpy in unmap_single */ |
diff --git a/mm/hugetlb.c b/mm/hugetlb.c index d143ab67be44..6058b53dcb89 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c | |||
@@ -1796,6 +1796,7 @@ void unmap_hugepage_range(struct vm_area_struct *vma, unsigned long start, | |||
1796 | static int unmap_ref_private(struct mm_struct *mm, struct vm_area_struct *vma, | 1796 | static int unmap_ref_private(struct mm_struct *mm, struct vm_area_struct *vma, |
1797 | struct page *page, unsigned long address) | 1797 | struct page *page, unsigned long address) |
1798 | { | 1798 | { |
1799 | struct hstate *h = hstate_vma(vma); | ||
1799 | struct vm_area_struct *iter_vma; | 1800 | struct vm_area_struct *iter_vma; |
1800 | struct address_space *mapping; | 1801 | struct address_space *mapping; |
1801 | struct prio_tree_iter iter; | 1802 | struct prio_tree_iter iter; |
@@ -1805,7 +1806,7 @@ static int unmap_ref_private(struct mm_struct *mm, struct vm_area_struct *vma, | |||
1805 | * vm_pgoff is in PAGE_SIZE units, hence the different calculation | 1806 | * vm_pgoff is in PAGE_SIZE units, hence the different calculation |
1806 | * from page cache lookup which is in HPAGE_SIZE units. | 1807 | * from page cache lookup which is in HPAGE_SIZE units. |
1807 | */ | 1808 | */ |
1808 | address = address & huge_page_mask(hstate_vma(vma)); | 1809 | address = address & huge_page_mask(h); |
1809 | pgoff = ((address - vma->vm_start) >> PAGE_SHIFT) | 1810 | pgoff = ((address - vma->vm_start) >> PAGE_SHIFT) |
1810 | + (vma->vm_pgoff >> PAGE_SHIFT); | 1811 | + (vma->vm_pgoff >> PAGE_SHIFT); |
1811 | mapping = (struct address_space *)page_private(page); | 1812 | mapping = (struct address_space *)page_private(page); |
@@ -1824,7 +1825,7 @@ static int unmap_ref_private(struct mm_struct *mm, struct vm_area_struct *vma, | |||
1824 | */ | 1825 | */ |
1825 | if (!is_vma_resv_set(iter_vma, HPAGE_RESV_OWNER)) | 1826 | if (!is_vma_resv_set(iter_vma, HPAGE_RESV_OWNER)) |
1826 | unmap_hugepage_range(iter_vma, | 1827 | unmap_hugepage_range(iter_vma, |
1827 | address, address + HPAGE_SIZE, | 1828 | address, address + huge_page_size(h), |
1828 | page); | 1829 | page); |
1829 | } | 1830 | } |
1830 | 1831 | ||
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index 6837a1014372..b17371185468 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c | |||
@@ -22,7 +22,6 @@ | |||
22 | #include <linux/highmem.h> | 22 | #include <linux/highmem.h> |
23 | #include <linux/vmalloc.h> | 23 | #include <linux/vmalloc.h> |
24 | #include <linux/ioport.h> | 24 | #include <linux/ioport.h> |
25 | #include <linux/cpuset.h> | ||
26 | #include <linux/delay.h> | 25 | #include <linux/delay.h> |
27 | #include <linux/migrate.h> | 26 | #include <linux/migrate.h> |
28 | #include <linux/page-isolation.h> | 27 | #include <linux/page-isolation.h> |
@@ -190,7 +189,7 @@ static void grow_pgdat_span(struct pglist_data *pgdat, unsigned long start_pfn, | |||
190 | pgdat->node_start_pfn; | 189 | pgdat->node_start_pfn; |
191 | } | 190 | } |
192 | 191 | ||
193 | static int __add_zone(struct zone *zone, unsigned long phys_start_pfn) | 192 | static int __meminit __add_zone(struct zone *zone, unsigned long phys_start_pfn) |
194 | { | 193 | { |
195 | struct pglist_data *pgdat = zone->zone_pgdat; | 194 | struct pglist_data *pgdat = zone->zone_pgdat; |
196 | int nr_pages = PAGES_PER_SECTION; | 195 | int nr_pages = PAGES_PER_SECTION; |
@@ -217,7 +216,7 @@ static int __add_zone(struct zone *zone, unsigned long phys_start_pfn) | |||
217 | return 0; | 216 | return 0; |
218 | } | 217 | } |
219 | 218 | ||
220 | static int __add_section(struct zone *zone, unsigned long phys_start_pfn) | 219 | static int __meminit __add_section(struct zone *zone, unsigned long phys_start_pfn) |
221 | { | 220 | { |
222 | int nr_pages = PAGES_PER_SECTION; | 221 | int nr_pages = PAGES_PER_SECTION; |
223 | int ret; | 222 | int ret; |
@@ -274,7 +273,7 @@ static int __remove_section(struct zone *zone, struct mem_section *ms) | |||
274 | * call this function after deciding the zone to which to | 273 | * call this function after deciding the zone to which to |
275 | * add the new pages. | 274 | * add the new pages. |
276 | */ | 275 | */ |
277 | int __add_pages(struct zone *zone, unsigned long phys_start_pfn, | 276 | int __ref __add_pages(struct zone *zone, unsigned long phys_start_pfn, |
278 | unsigned long nr_pages) | 277 | unsigned long nr_pages) |
279 | { | 278 | { |
280 | unsigned long i; | 279 | unsigned long i; |
@@ -471,7 +470,8 @@ static void rollback_node_hotadd(int nid, pg_data_t *pgdat) | |||
471 | } | 470 | } |
472 | 471 | ||
473 | 472 | ||
474 | int add_memory(int nid, u64 start, u64 size) | 473 | /* we are OK calling __meminit stuff here - we have CONFIG_MEMORY_HOTPLUG */ |
474 | int __ref add_memory(int nid, u64 start, u64 size) | ||
475 | { | 475 | { |
476 | pg_data_t *pgdat = NULL; | 476 | pg_data_t *pgdat = NULL; |
477 | int new_pgdat = 0; | 477 | int new_pgdat = 0; |
@@ -498,8 +498,6 @@ int add_memory(int nid, u64 start, u64 size) | |||
498 | /* we online node here. we can't roll back from here. */ | 498 | /* we online node here. we can't roll back from here. */ |
499 | node_set_online(nid); | 499 | node_set_online(nid); |
500 | 500 | ||
501 | cpuset_track_online_nodes(); | ||
502 | |||
503 | if (new_pgdat) { | 501 | if (new_pgdat) { |
504 | ret = register_one_node(nid); | 502 | ret = register_one_node(nid); |
505 | /* | 503 | /* |
diff --git a/mm/migrate.c b/mm/migrate.c index 385db89f0c33..1e0d6b237f44 100644 --- a/mm/migrate.c +++ b/mm/migrate.c | |||
@@ -522,15 +522,12 @@ static int writeout(struct address_space *mapping, struct page *page) | |||
522 | remove_migration_ptes(page, page); | 522 | remove_migration_ptes(page, page); |
523 | 523 | ||
524 | rc = mapping->a_ops->writepage(page, &wbc); | 524 | rc = mapping->a_ops->writepage(page, &wbc); |
525 | if (rc < 0) | ||
526 | /* I/O Error writing */ | ||
527 | return -EIO; | ||
528 | 525 | ||
529 | if (rc != AOP_WRITEPAGE_ACTIVATE) | 526 | if (rc != AOP_WRITEPAGE_ACTIVATE) |
530 | /* unlocked. Relock */ | 527 | /* unlocked. Relock */ |
531 | lock_page(page); | 528 | lock_page(page); |
532 | 529 | ||
533 | return -EAGAIN; | 530 | return (rc < 0) ? -EIO : -EAGAIN; |
534 | } | 531 | } |
535 | 532 | ||
536 | /* | 533 | /* |
diff --git a/mm/mlock.c b/mm/mlock.c index 008ea70b7afa..1ada366570cb 100644 --- a/mm/mlock.c +++ b/mm/mlock.c | |||
@@ -66,14 +66,10 @@ void __clear_page_mlock(struct page *page) | |||
66 | putback_lru_page(page); | 66 | putback_lru_page(page); |
67 | } else { | 67 | } else { |
68 | /* | 68 | /* |
69 | * Page not on the LRU yet. Flush all pagevecs and retry. | 69 | * We lost the race. the page already moved to evictable list. |
70 | */ | 70 | */ |
71 | lru_add_drain_all(); | 71 | if (PageUnevictable(page)) |
72 | if (!isolate_lru_page(page)) | ||
73 | putback_lru_page(page); | ||
74 | else if (PageUnevictable(page)) | ||
75 | count_vm_event(UNEVICTABLE_PGSTRANDED); | 72 | count_vm_event(UNEVICTABLE_PGSTRANDED); |
76 | |||
77 | } | 73 | } |
78 | } | 74 | } |
79 | 75 | ||
@@ -166,7 +162,7 @@ static long __mlock_vma_pages_range(struct vm_area_struct *vma, | |||
166 | unsigned long addr = start; | 162 | unsigned long addr = start; |
167 | struct page *pages[16]; /* 16 gives a reasonable batch */ | 163 | struct page *pages[16]; /* 16 gives a reasonable batch */ |
168 | int nr_pages = (end - start) / PAGE_SIZE; | 164 | int nr_pages = (end - start) / PAGE_SIZE; |
169 | int ret; | 165 | int ret = 0; |
170 | int gup_flags = 0; | 166 | int gup_flags = 0; |
171 | 167 | ||
172 | VM_BUG_ON(start & ~PAGE_MASK); | 168 | VM_BUG_ON(start & ~PAGE_MASK); |
@@ -187,8 +183,6 @@ static long __mlock_vma_pages_range(struct vm_area_struct *vma, | |||
187 | if (vma->vm_flags & VM_WRITE) | 183 | if (vma->vm_flags & VM_WRITE) |
188 | gup_flags |= GUP_FLAGS_WRITE; | 184 | gup_flags |= GUP_FLAGS_WRITE; |
189 | 185 | ||
190 | lru_add_drain_all(); /* push cached pages to LRU */ | ||
191 | |||
192 | while (nr_pages > 0) { | 186 | while (nr_pages > 0) { |
193 | int i; | 187 | int i; |
194 | 188 | ||
@@ -251,8 +245,6 @@ static long __mlock_vma_pages_range(struct vm_area_struct *vma, | |||
251 | ret = 0; | 245 | ret = 0; |
252 | } | 246 | } |
253 | 247 | ||
254 | lru_add_drain_all(); /* to update stats */ | ||
255 | |||
256 | return ret; /* count entire vma as locked_vm */ | 248 | return ret; /* count entire vma as locked_vm */ |
257 | } | 249 | } |
258 | 250 | ||
@@ -546,6 +538,8 @@ asmlinkage long sys_mlock(unsigned long start, size_t len) | |||
546 | if (!can_do_mlock()) | 538 | if (!can_do_mlock()) |
547 | return -EPERM; | 539 | return -EPERM; |
548 | 540 | ||
541 | lru_add_drain_all(); /* flush pagevec */ | ||
542 | |||
549 | down_write(¤t->mm->mmap_sem); | 543 | down_write(¤t->mm->mmap_sem); |
550 | len = PAGE_ALIGN(len + (start & ~PAGE_MASK)); | 544 | len = PAGE_ALIGN(len + (start & ~PAGE_MASK)); |
551 | start &= PAGE_MASK; | 545 | start &= PAGE_MASK; |
@@ -612,6 +606,8 @@ asmlinkage long sys_mlockall(int flags) | |||
612 | if (!can_do_mlock()) | 606 | if (!can_do_mlock()) |
613 | goto out; | 607 | goto out; |
614 | 608 | ||
609 | lru_add_drain_all(); /* flush pagevec */ | ||
610 | |||
615 | down_write(¤t->mm->mmap_sem); | 611 | down_write(¤t->mm->mmap_sem); |
616 | 612 | ||
617 | lock_limit = current->signal->rlim[RLIMIT_MEMLOCK].rlim_cur; | 613 | lock_limit = current->signal->rlim[RLIMIT_MEMLOCK].rlim_cur; |
@@ -1704,7 +1704,7 @@ find_extend_vma(struct mm_struct *mm, unsigned long addr) | |||
1704 | vma = find_vma_prev(mm, addr, &prev); | 1704 | vma = find_vma_prev(mm, addr, &prev); |
1705 | if (vma && (vma->vm_start <= addr)) | 1705 | if (vma && (vma->vm_start <= addr)) |
1706 | return vma; | 1706 | return vma; |
1707 | if (expand_stack(prev, addr)) | 1707 | if (!prev || expand_stack(prev, addr)) |
1708 | return NULL; | 1708 | return NULL; |
1709 | if (prev->vm_flags & VM_LOCKED) { | 1709 | if (prev->vm_flags & VM_LOCKED) { |
1710 | if (mlock_vma_pages_range(prev, addr, prev->vm_end) < 0) | 1710 | if (mlock_vma_pages_range(prev, addr, prev->vm_end) < 0) |
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 54069e64e3a8..d8ac01474563 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -1561,6 +1561,10 @@ nofail_alloc: | |||
1561 | 1561 | ||
1562 | /* We now go into synchronous reclaim */ | 1562 | /* We now go into synchronous reclaim */ |
1563 | cpuset_memory_pressure_bump(); | 1563 | cpuset_memory_pressure_bump(); |
1564 | /* | ||
1565 | * The task's cpuset might have expanded its set of allowable nodes | ||
1566 | */ | ||
1567 | cpuset_update_task_memory_state(); | ||
1564 | p->flags |= PF_MEMALLOC; | 1568 | p->flags |= PF_MEMALLOC; |
1565 | reclaim_state.reclaimed_slab = 0; | 1569 | reclaim_state.reclaimed_slab = 0; |
1566 | p->reclaim_state = &reclaim_state; | 1570 | p->reclaim_state = &reclaim_state; |
diff --git a/mm/page_cgroup.c b/mm/page_cgroup.c index f59d797dc5a9..0b3cbf090a67 100644 --- a/mm/page_cgroup.c +++ b/mm/page_cgroup.c | |||
@@ -21,7 +21,7 @@ static unsigned long total_usage; | |||
21 | #if !defined(CONFIG_SPARSEMEM) | 21 | #if !defined(CONFIG_SPARSEMEM) |
22 | 22 | ||
23 | 23 | ||
24 | void __init pgdat_page_cgroup_init(struct pglist_data *pgdat) | 24 | void __meminit pgdat_page_cgroup_init(struct pglist_data *pgdat) |
25 | { | 25 | { |
26 | pgdat->node_page_cgroup = NULL; | 26 | pgdat->node_page_cgroup = NULL; |
27 | } | 27 | } |
@@ -97,7 +97,8 @@ struct page_cgroup *lookup_page_cgroup(struct page *page) | |||
97 | return section->page_cgroup + pfn; | 97 | return section->page_cgroup + pfn; |
98 | } | 98 | } |
99 | 99 | ||
100 | int __meminit init_section_page_cgroup(unsigned long pfn) | 100 | /* __alloc_bootmem...() is protected by !slab_available() */ |
101 | int __init_refok init_section_page_cgroup(unsigned long pfn) | ||
101 | { | 102 | { |
102 | struct mem_section *section; | 103 | struct mem_section *section; |
103 | struct page_cgroup *base, *pc; | 104 | struct page_cgroup *base, *pc; |
@@ -106,19 +107,29 @@ int __meminit init_section_page_cgroup(unsigned long pfn) | |||
106 | 107 | ||
107 | section = __pfn_to_section(pfn); | 108 | section = __pfn_to_section(pfn); |
108 | 109 | ||
109 | if (section->page_cgroup) | 110 | if (!section->page_cgroup) { |
110 | return 0; | 111 | nid = page_to_nid(pfn_to_page(pfn)); |
111 | 112 | table_size = sizeof(struct page_cgroup) * PAGES_PER_SECTION; | |
112 | nid = page_to_nid(pfn_to_page(pfn)); | 113 | if (slab_is_available()) { |
113 | 114 | base = kmalloc_node(table_size, GFP_KERNEL, nid); | |
114 | table_size = sizeof(struct page_cgroup) * PAGES_PER_SECTION; | 115 | if (!base) |
115 | if (slab_is_available()) { | 116 | base = vmalloc_node(table_size, nid); |
116 | base = kmalloc_node(table_size, GFP_KERNEL, nid); | 117 | } else { |
117 | if (!base) | 118 | base = __alloc_bootmem_node_nopanic(NODE_DATA(nid), |
118 | base = vmalloc_node(table_size, nid); | 119 | table_size, |
119 | } else { | ||
120 | base = __alloc_bootmem_node_nopanic(NODE_DATA(nid), table_size, | ||
121 | PAGE_SIZE, __pa(MAX_DMA_ADDRESS)); | 120 | PAGE_SIZE, __pa(MAX_DMA_ADDRESS)); |
121 | } | ||
122 | } else { | ||
123 | /* | ||
124 | * We don't have to allocate page_cgroup again, but | ||
125 | * address of memmap may be changed. So, we have to initialize | ||
126 | * again. | ||
127 | */ | ||
128 | base = section->page_cgroup + pfn; | ||
129 | table_size = 0; | ||
130 | /* check address of memmap is changed or not. */ | ||
131 | if (base->page == pfn_to_page(pfn)) | ||
132 | return 0; | ||
122 | } | 133 | } |
123 | 134 | ||
124 | if (!base) { | 135 | if (!base) { |
@@ -158,14 +169,14 @@ void __free_page_cgroup(unsigned long pfn) | |||
158 | } | 169 | } |
159 | } | 170 | } |
160 | 171 | ||
161 | int online_page_cgroup(unsigned long start_pfn, | 172 | int __meminit online_page_cgroup(unsigned long start_pfn, |
162 | unsigned long nr_pages, | 173 | unsigned long nr_pages, |
163 | int nid) | 174 | int nid) |
164 | { | 175 | { |
165 | unsigned long start, end, pfn; | 176 | unsigned long start, end, pfn; |
166 | int fail = 0; | 177 | int fail = 0; |
167 | 178 | ||
168 | start = start_pfn & (PAGES_PER_SECTION - 1); | 179 | start = start_pfn & ~(PAGES_PER_SECTION - 1); |
169 | end = ALIGN(start_pfn + nr_pages, PAGES_PER_SECTION); | 180 | end = ALIGN(start_pfn + nr_pages, PAGES_PER_SECTION); |
170 | 181 | ||
171 | for (pfn = start; !fail && pfn < end; pfn += PAGES_PER_SECTION) { | 182 | for (pfn = start; !fail && pfn < end; pfn += PAGES_PER_SECTION) { |
@@ -183,12 +194,12 @@ int online_page_cgroup(unsigned long start_pfn, | |||
183 | return -ENOMEM; | 194 | return -ENOMEM; |
184 | } | 195 | } |
185 | 196 | ||
186 | int offline_page_cgroup(unsigned long start_pfn, | 197 | int __meminit offline_page_cgroup(unsigned long start_pfn, |
187 | unsigned long nr_pages, int nid) | 198 | unsigned long nr_pages, int nid) |
188 | { | 199 | { |
189 | unsigned long start, end, pfn; | 200 | unsigned long start, end, pfn; |
190 | 201 | ||
191 | start = start_pfn & (PAGES_PER_SECTION - 1); | 202 | start = start_pfn & ~(PAGES_PER_SECTION - 1); |
192 | end = ALIGN(start_pfn + nr_pages, PAGES_PER_SECTION); | 203 | end = ALIGN(start_pfn + nr_pages, PAGES_PER_SECTION); |
193 | 204 | ||
194 | for (pfn = start; pfn < end; pfn += PAGES_PER_SECTION) | 205 | for (pfn = start; pfn < end; pfn += PAGES_PER_SECTION) |
@@ -197,7 +208,7 @@ int offline_page_cgroup(unsigned long start_pfn, | |||
197 | 208 | ||
198 | } | 209 | } |
199 | 210 | ||
200 | static int page_cgroup_callback(struct notifier_block *self, | 211 | static int __meminit page_cgroup_callback(struct notifier_block *self, |
201 | unsigned long action, void *arg) | 212 | unsigned long action, void *arg) |
202 | { | 213 | { |
203 | struct memory_notify *mn = arg; | 214 | struct memory_notify *mn = arg; |
@@ -207,18 +218,23 @@ static int page_cgroup_callback(struct notifier_block *self, | |||
207 | ret = online_page_cgroup(mn->start_pfn, | 218 | ret = online_page_cgroup(mn->start_pfn, |
208 | mn->nr_pages, mn->status_change_nid); | 219 | mn->nr_pages, mn->status_change_nid); |
209 | break; | 220 | break; |
210 | case MEM_CANCEL_ONLINE: | ||
211 | case MEM_OFFLINE: | 221 | case MEM_OFFLINE: |
212 | offline_page_cgroup(mn->start_pfn, | 222 | offline_page_cgroup(mn->start_pfn, |
213 | mn->nr_pages, mn->status_change_nid); | 223 | mn->nr_pages, mn->status_change_nid); |
214 | break; | 224 | break; |
225 | case MEM_CANCEL_ONLINE: | ||
215 | case MEM_GOING_OFFLINE: | 226 | case MEM_GOING_OFFLINE: |
216 | break; | 227 | break; |
217 | case MEM_ONLINE: | 228 | case MEM_ONLINE: |
218 | case MEM_CANCEL_OFFLINE: | 229 | case MEM_CANCEL_OFFLINE: |
219 | break; | 230 | break; |
220 | } | 231 | } |
221 | ret = notifier_from_errno(ret); | 232 | |
233 | if (ret) | ||
234 | ret = notifier_from_errno(ret); | ||
235 | else | ||
236 | ret = NOTIFY_OK; | ||
237 | |||
222 | return ret; | 238 | return ret; |
223 | } | 239 | } |
224 | 240 | ||
@@ -248,7 +264,7 @@ void __init page_cgroup_init(void) | |||
248 | " want\n"); | 264 | " want\n"); |
249 | } | 265 | } |
250 | 266 | ||
251 | void __init pgdat_page_cgroup_init(struct pglist_data *pgdat) | 267 | void __meminit pgdat_page_cgroup_init(struct pglist_data *pgdat) |
252 | { | 268 | { |
253 | return; | 269 | return; |
254 | } | 270 | } |
@@ -2931,8 +2931,10 @@ static int slab_memory_callback(struct notifier_block *self, | |||
2931 | case MEM_CANCEL_OFFLINE: | 2931 | case MEM_CANCEL_OFFLINE: |
2932 | break; | 2932 | break; |
2933 | } | 2933 | } |
2934 | 2934 | if (ret) | |
2935 | ret = notifier_from_errno(ret); | 2935 | ret = notifier_from_errno(ret); |
2936 | else | ||
2937 | ret = NOTIFY_OK; | ||
2936 | return ret; | 2938 | return ret; |
2937 | } | 2939 | } |
2938 | 2940 | ||
diff --git a/mm/sparse.c b/mm/sparse.c index 39db301b920d..083f5b63e7a8 100644 --- a/mm/sparse.c +++ b/mm/sparse.c | |||
@@ -570,7 +570,7 @@ static void free_section_usemap(struct page *memmap, unsigned long *usemap) | |||
570 | * set. If this is <=0, then that means that the passed-in | 570 | * set. If this is <=0, then that means that the passed-in |
571 | * map was not consumed and must be freed. | 571 | * map was not consumed and must be freed. |
572 | */ | 572 | */ |
573 | int sparse_add_one_section(struct zone *zone, unsigned long start_pfn, | 573 | int __meminit sparse_add_one_section(struct zone *zone, unsigned long start_pfn, |
574 | int nr_pages) | 574 | int nr_pages) |
575 | { | 575 | { |
576 | unsigned long section_nr = pfn_to_section_nr(start_pfn); | 576 | unsigned long section_nr = pfn_to_section_nr(start_pfn); |
diff --git a/mm/vmalloc.c b/mm/vmalloc.c index ba6b0f5f7fac..f3f6e0758562 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c | |||
@@ -77,7 +77,6 @@ static void vunmap_page_range(unsigned long addr, unsigned long end) | |||
77 | 77 | ||
78 | BUG_ON(addr >= end); | 78 | BUG_ON(addr >= end); |
79 | pgd = pgd_offset_k(addr); | 79 | pgd = pgd_offset_k(addr); |
80 | flush_cache_vunmap(addr, end); | ||
81 | do { | 80 | do { |
82 | next = pgd_addr_end(addr, end); | 81 | next = pgd_addr_end(addr, end); |
83 | if (pgd_none_or_clear_bad(pgd)) | 82 | if (pgd_none_or_clear_bad(pgd)) |
@@ -324,14 +323,14 @@ static struct vmap_area *alloc_vmap_area(unsigned long size, | |||
324 | 323 | ||
325 | BUG_ON(size & ~PAGE_MASK); | 324 | BUG_ON(size & ~PAGE_MASK); |
326 | 325 | ||
327 | addr = ALIGN(vstart, align); | ||
328 | |||
329 | va = kmalloc_node(sizeof(struct vmap_area), | 326 | va = kmalloc_node(sizeof(struct vmap_area), |
330 | gfp_mask & GFP_RECLAIM_MASK, node); | 327 | gfp_mask & GFP_RECLAIM_MASK, node); |
331 | if (unlikely(!va)) | 328 | if (unlikely(!va)) |
332 | return ERR_PTR(-ENOMEM); | 329 | return ERR_PTR(-ENOMEM); |
333 | 330 | ||
334 | retry: | 331 | retry: |
332 | addr = ALIGN(vstart, align); | ||
333 | |||
335 | spin_lock(&vmap_area_lock); | 334 | spin_lock(&vmap_area_lock); |
336 | /* XXX: could have a last_hole cache */ | 335 | /* XXX: could have a last_hole cache */ |
337 | n = vmap_area_root.rb_node; | 336 | n = vmap_area_root.rb_node; |
@@ -362,7 +361,7 @@ retry: | |||
362 | goto found; | 361 | goto found; |
363 | } | 362 | } |
364 | 363 | ||
365 | while (addr + size >= first->va_start && addr + size <= vend) { | 364 | while (addr + size > first->va_start && addr + size <= vend) { |
366 | addr = ALIGN(first->va_end + PAGE_SIZE, align); | 365 | addr = ALIGN(first->va_end + PAGE_SIZE, align); |
367 | 366 | ||
368 | n = rb_next(&first->rb_node); | 367 | n = rb_next(&first->rb_node); |
@@ -522,24 +521,45 @@ static void __purge_vmap_area_lazy(unsigned long *start, unsigned long *end, | |||
522 | } | 521 | } |
523 | 522 | ||
524 | /* | 523 | /* |
524 | * Kick off a purge of the outstanding lazy areas. Don't bother if somebody | ||
525 | * is already purging. | ||
526 | */ | ||
527 | static void try_purge_vmap_area_lazy(void) | ||
528 | { | ||
529 | unsigned long start = ULONG_MAX, end = 0; | ||
530 | |||
531 | __purge_vmap_area_lazy(&start, &end, 0, 0); | ||
532 | } | ||
533 | |||
534 | /* | ||
525 | * Kick off a purge of the outstanding lazy areas. | 535 | * Kick off a purge of the outstanding lazy areas. |
526 | */ | 536 | */ |
527 | static void purge_vmap_area_lazy(void) | 537 | static void purge_vmap_area_lazy(void) |
528 | { | 538 | { |
529 | unsigned long start = ULONG_MAX, end = 0; | 539 | unsigned long start = ULONG_MAX, end = 0; |
530 | 540 | ||
531 | __purge_vmap_area_lazy(&start, &end, 0, 0); | 541 | __purge_vmap_area_lazy(&start, &end, 1, 0); |
532 | } | 542 | } |
533 | 543 | ||
534 | /* | 544 | /* |
535 | * Free and unmap a vmap area | 545 | * Free and unmap a vmap area, caller ensuring flush_cache_vunmap had been |
546 | * called for the correct range previously. | ||
536 | */ | 547 | */ |
537 | static void free_unmap_vmap_area(struct vmap_area *va) | 548 | static void free_unmap_vmap_area_noflush(struct vmap_area *va) |
538 | { | 549 | { |
539 | va->flags |= VM_LAZY_FREE; | 550 | va->flags |= VM_LAZY_FREE; |
540 | atomic_add((va->va_end - va->va_start) >> PAGE_SHIFT, &vmap_lazy_nr); | 551 | atomic_add((va->va_end - va->va_start) >> PAGE_SHIFT, &vmap_lazy_nr); |
541 | if (unlikely(atomic_read(&vmap_lazy_nr) > lazy_max_pages())) | 552 | if (unlikely(atomic_read(&vmap_lazy_nr) > lazy_max_pages())) |
542 | purge_vmap_area_lazy(); | 553 | try_purge_vmap_area_lazy(); |
554 | } | ||
555 | |||
556 | /* | ||
557 | * Free and unmap a vmap area | ||
558 | */ | ||
559 | static void free_unmap_vmap_area(struct vmap_area *va) | ||
560 | { | ||
561 | flush_cache_vunmap(va->va_start, va->va_end); | ||
562 | free_unmap_vmap_area_noflush(va); | ||
543 | } | 563 | } |
544 | 564 | ||
545 | static struct vmap_area *find_vmap_area(unsigned long addr) | 565 | static struct vmap_area *find_vmap_area(unsigned long addr) |
@@ -723,7 +743,7 @@ static void free_vmap_block(struct vmap_block *vb) | |||
723 | spin_unlock(&vmap_block_tree_lock); | 743 | spin_unlock(&vmap_block_tree_lock); |
724 | BUG_ON(tmp != vb); | 744 | BUG_ON(tmp != vb); |
725 | 745 | ||
726 | free_unmap_vmap_area(vb->va); | 746 | free_unmap_vmap_area_noflush(vb->va); |
727 | call_rcu(&vb->rcu_head, rcu_free_vb); | 747 | call_rcu(&vb->rcu_head, rcu_free_vb); |
728 | } | 748 | } |
729 | 749 | ||
@@ -785,6 +805,9 @@ static void vb_free(const void *addr, unsigned long size) | |||
785 | 805 | ||
786 | BUG_ON(size & ~PAGE_MASK); | 806 | BUG_ON(size & ~PAGE_MASK); |
787 | BUG_ON(size > PAGE_SIZE*VMAP_MAX_ALLOC); | 807 | BUG_ON(size > PAGE_SIZE*VMAP_MAX_ALLOC); |
808 | |||
809 | flush_cache_vunmap((unsigned long)addr, (unsigned long)addr + size); | ||
810 | |||
788 | order = get_order(size); | 811 | order = get_order(size); |
789 | 812 | ||
790 | offset = (unsigned long)addr & (VMAP_BLOCK_SIZE - 1); | 813 | offset = (unsigned long)addr & (VMAP_BLOCK_SIZE - 1); |
diff --git a/mm/vmscan.c b/mm/vmscan.c index 3b5860294bb6..62e7f62fb559 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
@@ -623,6 +623,8 @@ static unsigned long shrink_page_list(struct list_head *page_list, | |||
623 | * Try to allocate it some swap space here. | 623 | * Try to allocate it some swap space here. |
624 | */ | 624 | */ |
625 | if (PageAnon(page) && !PageSwapCache(page)) { | 625 | if (PageAnon(page) && !PageSwapCache(page)) { |
626 | if (!(sc->gfp_mask & __GFP_IO)) | ||
627 | goto keep_locked; | ||
626 | switch (try_to_munlock(page)) { | 628 | switch (try_to_munlock(page)) { |
627 | case SWAP_FAIL: /* shouldn't happen */ | 629 | case SWAP_FAIL: /* shouldn't happen */ |
628 | case SWAP_AGAIN: | 630 | case SWAP_AGAIN: |
@@ -634,6 +636,7 @@ static unsigned long shrink_page_list(struct list_head *page_list, | |||
634 | } | 636 | } |
635 | if (!add_to_swap(page, GFP_ATOMIC)) | 637 | if (!add_to_swap(page, GFP_ATOMIC)) |
636 | goto activate_locked; | 638 | goto activate_locked; |
639 | may_enter_fs = 1; | ||
637 | } | 640 | } |
638 | #endif /* CONFIG_SWAP */ | 641 | #endif /* CONFIG_SWAP */ |
639 | 642 | ||
@@ -1245,6 +1248,7 @@ static void shrink_active_list(unsigned long nr_pages, struct zone *zone, | |||
1245 | list_add(&page->lru, &l_inactive); | 1248 | list_add(&page->lru, &l_inactive); |
1246 | } | 1249 | } |
1247 | 1250 | ||
1251 | spin_lock_irq(&zone->lru_lock); | ||
1248 | /* | 1252 | /* |
1249 | * Count referenced pages from currently used mappings as | 1253 | * Count referenced pages from currently used mappings as |
1250 | * rotated, even though they are moved to the inactive list. | 1254 | * rotated, even though they are moved to the inactive list. |
@@ -1260,7 +1264,6 @@ static void shrink_active_list(unsigned long nr_pages, struct zone *zone, | |||
1260 | 1264 | ||
1261 | pgmoved = 0; | 1265 | pgmoved = 0; |
1262 | lru = LRU_BASE + file * LRU_FILE; | 1266 | lru = LRU_BASE + file * LRU_FILE; |
1263 | spin_lock_irq(&zone->lru_lock); | ||
1264 | while (!list_empty(&l_inactive)) { | 1267 | while (!list_empty(&l_inactive)) { |
1265 | page = lru_to_page(&l_inactive); | 1268 | page = lru_to_page(&l_inactive); |
1266 | prefetchw_prev_lru_page(page, &l_inactive, flags); | 1269 | prefetchw_prev_lru_page(page, &l_inactive, flags); |
@@ -1386,9 +1389,9 @@ static void get_scan_ratio(struct zone *zone, struct scan_control *sc, | |||
1386 | file_prio = 200 - sc->swappiness; | 1389 | file_prio = 200 - sc->swappiness; |
1387 | 1390 | ||
1388 | /* | 1391 | /* |
1389 | * anon recent_rotated[0] | 1392 | * The amount of pressure on anon vs file pages is inversely |
1390 | * %anon = 100 * ----------- / ----------------- * IO cost | 1393 | * proportional to the fraction of recently scanned pages on |
1391 | * anon + file rotate_sum | 1394 | * each list that were recently referenced and in active use. |
1392 | */ | 1395 | */ |
1393 | ap = (anon_prio + 1) * (zone->recent_scanned[0] + 1); | 1396 | ap = (anon_prio + 1) * (zone->recent_scanned[0] + 1); |
1394 | ap /= zone->recent_rotated[0] + 1; | 1397 | ap /= zone->recent_rotated[0] + 1; |
@@ -2368,39 +2371,6 @@ int page_evictable(struct page *page, struct vm_area_struct *vma) | |||
2368 | return 1; | 2371 | return 1; |
2369 | } | 2372 | } |
2370 | 2373 | ||
2371 | static void show_page_path(struct page *page) | ||
2372 | { | ||
2373 | char buf[256]; | ||
2374 | if (page_is_file_cache(page)) { | ||
2375 | struct address_space *mapping = page->mapping; | ||
2376 | struct dentry *dentry; | ||
2377 | pgoff_t pgoff = page->index << (PAGE_CACHE_SHIFT - PAGE_SHIFT); | ||
2378 | |||
2379 | spin_lock(&mapping->i_mmap_lock); | ||
2380 | dentry = d_find_alias(mapping->host); | ||
2381 | printk(KERN_INFO "rescued: %s %lu\n", | ||
2382 | dentry_path(dentry, buf, 256), pgoff); | ||
2383 | spin_unlock(&mapping->i_mmap_lock); | ||
2384 | } else { | ||
2385 | #if defined(CONFIG_MM_OWNER) && defined(CONFIG_MMU) | ||
2386 | struct anon_vma *anon_vma; | ||
2387 | struct vm_area_struct *vma; | ||
2388 | |||
2389 | anon_vma = page_lock_anon_vma(page); | ||
2390 | if (!anon_vma) | ||
2391 | return; | ||
2392 | |||
2393 | list_for_each_entry(vma, &anon_vma->head, anon_vma_node) { | ||
2394 | printk(KERN_INFO "rescued: anon %s\n", | ||
2395 | vma->vm_mm->owner->comm); | ||
2396 | break; | ||
2397 | } | ||
2398 | page_unlock_anon_vma(anon_vma); | ||
2399 | #endif | ||
2400 | } | ||
2401 | } | ||
2402 | |||
2403 | |||
2404 | /** | 2374 | /** |
2405 | * check_move_unevictable_page - check page for evictability and move to appropriate zone lru list | 2375 | * check_move_unevictable_page - check page for evictability and move to appropriate zone lru list |
2406 | * @page: page to check evictability and move to appropriate lru list | 2376 | * @page: page to check evictability and move to appropriate lru list |
@@ -2421,8 +2391,6 @@ retry: | |||
2421 | if (page_evictable(page, NULL)) { | 2391 | if (page_evictable(page, NULL)) { |
2422 | enum lru_list l = LRU_INACTIVE_ANON + page_is_file_cache(page); | 2392 | enum lru_list l = LRU_INACTIVE_ANON + page_is_file_cache(page); |
2423 | 2393 | ||
2424 | show_page_path(page); | ||
2425 | |||
2426 | __dec_zone_state(zone, NR_UNEVICTABLE); | 2394 | __dec_zone_state(zone, NR_UNEVICTABLE); |
2427 | list_move(&page->lru, &zone->lru[l].list); | 2395 | list_move(&page->lru, &zone->lru[l].list); |
2428 | __inc_zone_state(zone, NR_INACTIVE_ANON + l); | 2396 | __inc_zone_state(zone, NR_INACTIVE_ANON + l); |
diff --git a/net/9p/Kconfig b/net/9p/Kconfig index c42c0c400bf9..0663f99e977a 100644 --- a/net/9p/Kconfig +++ b/net/9p/Kconfig | |||
@@ -13,22 +13,24 @@ menuconfig NET_9P | |||
13 | 13 | ||
14 | If unsure, say N. | 14 | If unsure, say N. |
15 | 15 | ||
16 | if NET_9P | ||
17 | |||
16 | config NET_9P_VIRTIO | 18 | config NET_9P_VIRTIO |
17 | depends on NET_9P && EXPERIMENTAL && VIRTIO | 19 | depends on EXPERIMENTAL && VIRTIO |
18 | tristate "9P Virtio Transport (Experimental)" | 20 | tristate "9P Virtio Transport (Experimental)" |
19 | help | 21 | help |
20 | This builds support for a transports between | 22 | This builds support for a transports between |
21 | guest partitions and a host partition. | 23 | guest partitions and a host partition. |
22 | 24 | ||
23 | config NET_9P_RDMA | 25 | config NET_9P_RDMA |
24 | depends on NET_9P && INFINIBAND && EXPERIMENTAL | 26 | depends on INET && INFINIBAND && EXPERIMENTAL |
25 | tristate "9P RDMA Transport (Experimental)" | 27 | tristate "9P RDMA Transport (Experimental)" |
26 | help | 28 | help |
27 | This builds support for a RDMA transport. | 29 | This builds support for an RDMA transport. |
28 | 30 | ||
29 | config NET_9P_DEBUG | 31 | config NET_9P_DEBUG |
30 | bool "Debug information" | 32 | bool "Debug information" |
31 | depends on NET_9P | ||
32 | help | 33 | help |
33 | Say Y if you want the 9P subsystem to log debug information. | 34 | Say Y if you want the 9P subsystem to log debug information. |
34 | 35 | ||
36 | endif | ||
diff --git a/net/compat.c b/net/compat.c index 67fb6a3834a3..a3a2ba0fac08 100644 --- a/net/compat.c +++ b/net/compat.c | |||
@@ -226,14 +226,14 @@ int put_cmsg_compat(struct msghdr *kmsg, int level, int type, int len, void *dat | |||
226 | return 0; /* XXX: return error? check spec. */ | 226 | return 0; /* XXX: return error? check spec. */ |
227 | } | 227 | } |
228 | 228 | ||
229 | if (level == SOL_SOCKET && type == SO_TIMESTAMP) { | 229 | if (level == SOL_SOCKET && type == SCM_TIMESTAMP) { |
230 | struct timeval *tv = (struct timeval *)data; | 230 | struct timeval *tv = (struct timeval *)data; |
231 | ctv.tv_sec = tv->tv_sec; | 231 | ctv.tv_sec = tv->tv_sec; |
232 | ctv.tv_usec = tv->tv_usec; | 232 | ctv.tv_usec = tv->tv_usec; |
233 | data = &ctv; | 233 | data = &ctv; |
234 | len = sizeof(ctv); | 234 | len = sizeof(ctv); |
235 | } | 235 | } |
236 | if (level == SOL_SOCKET && type == SO_TIMESTAMPNS) { | 236 | if (level == SOL_SOCKET && type == SCM_TIMESTAMPNS) { |
237 | struct timespec *ts = (struct timespec *)data; | 237 | struct timespec *ts = (struct timespec *)data; |
238 | cts.tv_sec = ts->tv_sec; | 238 | cts.tv_sec = ts->tv_sec; |
239 | cts.tv_nsec = ts->tv_nsec; | 239 | cts.tv_nsec = ts->tv_nsec; |
@@ -725,7 +725,7 @@ EXPORT_SYMBOL(compat_mc_getsockopt); | |||
725 | static unsigned char nas[19]={AL(0),AL(3),AL(3),AL(3),AL(2),AL(3), | 725 | static unsigned char nas[19]={AL(0),AL(3),AL(3),AL(3),AL(2),AL(3), |
726 | AL(3),AL(3),AL(4),AL(4),AL(4),AL(6), | 726 | AL(3),AL(3),AL(4),AL(4),AL(4),AL(6), |
727 | AL(6),AL(2),AL(5),AL(5),AL(3),AL(3), | 727 | AL(6),AL(2),AL(5),AL(5),AL(3),AL(3), |
728 | AL(6)}; | 728 | AL(4)}; |
729 | #undef AL | 729 | #undef AL |
730 | 730 | ||
731 | asmlinkage long compat_sys_sendmsg(int fd, struct compat_msghdr __user *msg, unsigned flags) | 731 | asmlinkage long compat_sys_sendmsg(int fd, struct compat_msghdr __user *msg, unsigned flags) |
@@ -738,52 +738,13 @@ asmlinkage long compat_sys_recvmsg(int fd, struct compat_msghdr __user *msg, uns | |||
738 | return sys_recvmsg(fd, (struct msghdr __user *)msg, flags | MSG_CMSG_COMPAT); | 738 | return sys_recvmsg(fd, (struct msghdr __user *)msg, flags | MSG_CMSG_COMPAT); |
739 | } | 739 | } |
740 | 740 | ||
741 | asmlinkage long compat_sys_paccept(int fd, struct sockaddr __user *upeer_sockaddr, | ||
742 | int __user *upeer_addrlen, | ||
743 | const compat_sigset_t __user *sigmask, | ||
744 | compat_size_t sigsetsize, int flags) | ||
745 | { | ||
746 | compat_sigset_t ss32; | ||
747 | sigset_t ksigmask, sigsaved; | ||
748 | int ret; | ||
749 | |||
750 | if (sigmask) { | ||
751 | if (sigsetsize != sizeof(compat_sigset_t)) | ||
752 | return -EINVAL; | ||
753 | if (copy_from_user(&ss32, sigmask, sizeof(ss32))) | ||
754 | return -EFAULT; | ||
755 | sigset_from_compat(&ksigmask, &ss32); | ||
756 | |||
757 | sigdelsetmask(&ksigmask, sigmask(SIGKILL)|sigmask(SIGSTOP)); | ||
758 | sigprocmask(SIG_SETMASK, &ksigmask, &sigsaved); | ||
759 | } | ||
760 | |||
761 | ret = do_accept(fd, upeer_sockaddr, upeer_addrlen, flags); | ||
762 | |||
763 | if (ret == -ERESTARTNOHAND) { | ||
764 | /* | ||
765 | * Don't restore the signal mask yet. Let do_signal() deliver | ||
766 | * the signal on the way back to userspace, before the signal | ||
767 | * mask is restored. | ||
768 | */ | ||
769 | if (sigmask) { | ||
770 | memcpy(¤t->saved_sigmask, &sigsaved, | ||
771 | sizeof(sigsaved)); | ||
772 | set_restore_sigmask(); | ||
773 | } | ||
774 | } else if (sigmask) | ||
775 | sigprocmask(SIG_SETMASK, &sigsaved, NULL); | ||
776 | |||
777 | return ret; | ||
778 | } | ||
779 | |||
780 | asmlinkage long compat_sys_socketcall(int call, u32 __user *args) | 741 | asmlinkage long compat_sys_socketcall(int call, u32 __user *args) |
781 | { | 742 | { |
782 | int ret; | 743 | int ret; |
783 | u32 a[6]; | 744 | u32 a[6]; |
784 | u32 a0, a1; | 745 | u32 a0, a1; |
785 | 746 | ||
786 | if (call < SYS_SOCKET || call > SYS_PACCEPT) | 747 | if (call < SYS_SOCKET || call > SYS_ACCEPT4) |
787 | return -EINVAL; | 748 | return -EINVAL; |
788 | if (copy_from_user(a, args, nas[call])) | 749 | if (copy_from_user(a, args, nas[call])) |
789 | return -EFAULT; | 750 | return -EFAULT; |
@@ -804,7 +765,7 @@ asmlinkage long compat_sys_socketcall(int call, u32 __user *args) | |||
804 | ret = sys_listen(a0, a1); | 765 | ret = sys_listen(a0, a1); |
805 | break; | 766 | break; |
806 | case SYS_ACCEPT: | 767 | case SYS_ACCEPT: |
807 | ret = do_accept(a0, compat_ptr(a1), compat_ptr(a[2]), 0); | 768 | ret = sys_accept4(a0, compat_ptr(a1), compat_ptr(a[2]), 0); |
808 | break; | 769 | break; |
809 | case SYS_GETSOCKNAME: | 770 | case SYS_GETSOCKNAME: |
810 | ret = sys_getsockname(a0, compat_ptr(a1), compat_ptr(a[2])); | 771 | ret = sys_getsockname(a0, compat_ptr(a1), compat_ptr(a[2])); |
@@ -844,9 +805,8 @@ asmlinkage long compat_sys_socketcall(int call, u32 __user *args) | |||
844 | case SYS_RECVMSG: | 805 | case SYS_RECVMSG: |
845 | ret = compat_sys_recvmsg(a0, compat_ptr(a1), a[2]); | 806 | ret = compat_sys_recvmsg(a0, compat_ptr(a1), a[2]); |
846 | break; | 807 | break; |
847 | case SYS_PACCEPT: | 808 | case SYS_ACCEPT4: |
848 | ret = compat_sys_paccept(a0, compat_ptr(a1), compat_ptr(a[2]), | 809 | ret = sys_accept4(a0, compat_ptr(a1), compat_ptr(a[2]), a[3]); |
849 | compat_ptr(a[3]), a[4], a[5]); | ||
850 | break; | 810 | break; |
851 | default: | 811 | default: |
852 | ret = -EINVAL; | 812 | ret = -EINVAL; |
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index a47f5bad110d..8997e912aaaf 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c | |||
@@ -1973,13 +1973,7 @@ static void pktgen_setup_inject(struct pktgen_dev *pkt_dev) | |||
1973 | 1973 | ||
1974 | /* make sure that we don't pick a non-existing transmit queue */ | 1974 | /* make sure that we don't pick a non-existing transmit queue */ |
1975 | ntxq = pkt_dev->odev->real_num_tx_queues; | 1975 | ntxq = pkt_dev->odev->real_num_tx_queues; |
1976 | if (ntxq > num_online_cpus() && (pkt_dev->flags & F_QUEUE_MAP_CPU)) { | 1976 | |
1977 | printk(KERN_WARNING "pktgen: WARNING: QUEUE_MAP_CPU " | ||
1978 | "disabled because CPU count (%d) exceeds number " | ||
1979 | "of tx queues (%d) on %s\n", num_online_cpus(), ntxq, | ||
1980 | pkt_dev->odev->name); | ||
1981 | pkt_dev->flags &= ~F_QUEUE_MAP_CPU; | ||
1982 | } | ||
1983 | if (ntxq <= pkt_dev->queue_map_min) { | 1977 | if (ntxq <= pkt_dev->queue_map_min) { |
1984 | printk(KERN_WARNING "pktgen: WARNING: Requested " | 1978 | printk(KERN_WARNING "pktgen: WARNING: Requested " |
1985 | "queue_map_min (zero-based) (%d) exceeds valid range " | 1979 | "queue_map_min (zero-based) (%d) exceeds valid range " |
@@ -2202,6 +2196,7 @@ static void set_cur_queue_map(struct pktgen_dev *pkt_dev) | |||
2202 | } | 2196 | } |
2203 | pkt_dev->cur_queue_map = t; | 2197 | pkt_dev->cur_queue_map = t; |
2204 | } | 2198 | } |
2199 | pkt_dev->cur_queue_map = pkt_dev->cur_queue_map % pkt_dev->odev->real_num_tx_queues; | ||
2205 | } | 2200 | } |
2206 | 2201 | ||
2207 | /* Increment/randomize headers according to flags and current values | 2202 | /* Increment/randomize headers according to flags and current values |
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 31f29d2989fd..4dfb6b4d4559 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
@@ -878,7 +878,9 @@ static int do_setlink(struct net_device *dev, struct ifinfomsg *ifm, | |||
878 | if (ifm->ifi_change) | 878 | if (ifm->ifi_change) |
879 | flags = (flags & ifm->ifi_change) | | 879 | flags = (flags & ifm->ifi_change) | |
880 | (dev->flags & ~ifm->ifi_change); | 880 | (dev->flags & ~ifm->ifi_change); |
881 | dev_change_flags(dev, flags); | 881 | err = dev_change_flags(dev, flags); |
882 | if (err < 0) | ||
883 | goto errout; | ||
882 | } | 884 | } |
883 | 885 | ||
884 | if (tb[IFLA_TXQLEN]) | 886 | if (tb[IFLA_TXQLEN]) |
diff --git a/net/core/scm.c b/net/core/scm.c index ab242cc1acca..b12303dd39d9 100644 --- a/net/core/scm.c +++ b/net/core/scm.c | |||
@@ -75,7 +75,6 @@ static int scm_fp_copy(struct cmsghdr *cmsg, struct scm_fp_list **fplp) | |||
75 | if (!fpl) | 75 | if (!fpl) |
76 | return -ENOMEM; | 76 | return -ENOMEM; |
77 | *fplp = fpl; | 77 | *fplp = fpl; |
78 | INIT_LIST_HEAD(&fpl->list); | ||
79 | fpl->count = 0; | 78 | fpl->count = 0; |
80 | } | 79 | } |
81 | fpp = &fpl->fp[fpl->count]; | 80 | fpp = &fpl->fp[fpl->count]; |
@@ -301,7 +300,6 @@ struct scm_fp_list *scm_fp_dup(struct scm_fp_list *fpl) | |||
301 | 300 | ||
302 | new_fpl = kmalloc(sizeof(*fpl), GFP_KERNEL); | 301 | new_fpl = kmalloc(sizeof(*fpl), GFP_KERNEL); |
303 | if (new_fpl) { | 302 | if (new_fpl) { |
304 | INIT_LIST_HEAD(&new_fpl->list); | ||
305 | for (i=fpl->count-1; i>=0; i--) | 303 | for (i=fpl->count-1; i>=0; i--) |
306 | get_file(fpl->fp[i]); | 304 | get_file(fpl->fp[i]); |
307 | memcpy(new_fpl, fpl, sizeof(*fpl)); | 305 | memcpy(new_fpl, fpl, sizeof(*fpl)); |
diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index 1fbff5fa4241..1aa2dc9e380e 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c | |||
@@ -1117,6 +1117,7 @@ int inet_sk_rebuild_header(struct sock *sk) | |||
1117 | }, | 1117 | }, |
1118 | }, | 1118 | }, |
1119 | .proto = sk->sk_protocol, | 1119 | .proto = sk->sk_protocol, |
1120 | .flags = inet_sk_flowi_flags(sk), | ||
1120 | .uli_u = { | 1121 | .uli_u = { |
1121 | .ports = { | 1122 | .ports = { |
1122 | .sport = inet->sport, | 1123 | .sport = inet->sport, |
diff --git a/net/ipv4/ip_input.c b/net/ipv4/ip_input.c index 861978a4f1a8..cfb38ac9d698 100644 --- a/net/ipv4/ip_input.c +++ b/net/ipv4/ip_input.c | |||
@@ -209,9 +209,17 @@ static int ip_local_deliver_finish(struct sk_buff *skb) | |||
209 | 209 | ||
210 | hash = protocol & (MAX_INET_PROTOS - 1); | 210 | hash = protocol & (MAX_INET_PROTOS - 1); |
211 | ipprot = rcu_dereference(inet_protos[hash]); | 211 | ipprot = rcu_dereference(inet_protos[hash]); |
212 | if (ipprot != NULL && (net == &init_net || ipprot->netns_ok)) { | 212 | if (ipprot != NULL) { |
213 | int ret; | 213 | int ret; |
214 | 214 | ||
215 | if (!net_eq(net, &init_net) && !ipprot->netns_ok) { | ||
216 | if (net_ratelimit()) | ||
217 | printk("%s: proto %d isn't netns-ready\n", | ||
218 | __func__, protocol); | ||
219 | kfree_skb(skb); | ||
220 | goto out; | ||
221 | } | ||
222 | |||
215 | if (!ipprot->no_policy) { | 223 | if (!ipprot->no_policy) { |
216 | if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) { | 224 | if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) { |
217 | kfree_skb(skb); | 225 | kfree_skb(skb); |
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c index b42e082cc170..25924b1eb2ef 100644 --- a/net/ipv4/ipmr.c +++ b/net/ipv4/ipmr.c | |||
@@ -1945,13 +1945,14 @@ int __init ip_mr_init(void) | |||
1945 | goto proc_cache_fail; | 1945 | goto proc_cache_fail; |
1946 | #endif | 1946 | #endif |
1947 | return 0; | 1947 | return 0; |
1948 | reg_notif_fail: | ||
1949 | kmem_cache_destroy(mrt_cachep); | ||
1950 | #ifdef CONFIG_PROC_FS | 1948 | #ifdef CONFIG_PROC_FS |
1951 | proc_vif_fail: | ||
1952 | unregister_netdevice_notifier(&ip_mr_notifier); | ||
1953 | proc_cache_fail: | 1949 | proc_cache_fail: |
1954 | proc_net_remove(&init_net, "ip_mr_vif"); | 1950 | proc_net_remove(&init_net, "ip_mr_vif"); |
1951 | proc_vif_fail: | ||
1952 | unregister_netdevice_notifier(&ip_mr_notifier); | ||
1955 | #endif | 1953 | #endif |
1954 | reg_notif_fail: | ||
1955 | del_timer(&ipmr_expire_timer); | ||
1956 | kmem_cache_destroy(mrt_cachep); | ||
1956 | return err; | 1957 | return err; |
1957 | } | 1958 | } |
diff --git a/net/ipv4/tcp_htcp.c b/net/ipv4/tcp_htcp.c index af99776146ff..937549b8a921 100644 --- a/net/ipv4/tcp_htcp.c +++ b/net/ipv4/tcp_htcp.c | |||
@@ -69,9 +69,12 @@ static u32 htcp_cwnd_undo(struct sock *sk) | |||
69 | const struct tcp_sock *tp = tcp_sk(sk); | 69 | const struct tcp_sock *tp = tcp_sk(sk); |
70 | struct htcp *ca = inet_csk_ca(sk); | 70 | struct htcp *ca = inet_csk_ca(sk); |
71 | 71 | ||
72 | ca->last_cong = ca->undo_last_cong; | 72 | if (ca->undo_last_cong) { |
73 | ca->maxRTT = ca->undo_maxRTT; | 73 | ca->last_cong = ca->undo_last_cong; |
74 | ca->old_maxB = ca->undo_old_maxB; | 74 | ca->maxRTT = ca->undo_maxRTT; |
75 | ca->old_maxB = ca->undo_old_maxB; | ||
76 | ca->undo_last_cong = 0; | ||
77 | } | ||
75 | 78 | ||
76 | return max(tp->snd_cwnd, (tp->snd_ssthresh << 7) / ca->beta); | 79 | return max(tp->snd_cwnd, (tp->snd_ssthresh << 7) / ca->beta); |
77 | } | 80 | } |
@@ -268,7 +271,10 @@ static void htcp_state(struct sock *sk, u8 new_state) | |||
268 | case TCP_CA_Open: | 271 | case TCP_CA_Open: |
269 | { | 272 | { |
270 | struct htcp *ca = inet_csk_ca(sk); | 273 | struct htcp *ca = inet_csk_ca(sk); |
271 | ca->last_cong = jiffies; | 274 | if (ca->undo_last_cong) { |
275 | ca->last_cong = jiffies; | ||
276 | ca->undo_last_cong = 0; | ||
277 | } | ||
272 | } | 278 | } |
273 | break; | 279 | break; |
274 | case TCP_CA_CWR: | 280 | case TCP_CA_CWR: |
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index cf02701ced48..98c1fd09be88 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c | |||
@@ -633,6 +633,7 @@ int udp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | |||
633 | .saddr = saddr, | 633 | .saddr = saddr, |
634 | .tos = tos } }, | 634 | .tos = tos } }, |
635 | .proto = sk->sk_protocol, | 635 | .proto = sk->sk_protocol, |
636 | .flags = inet_sk_flowi_flags(sk), | ||
636 | .uli_u = { .ports = | 637 | .uli_u = { .ports = |
637 | { .sport = inet->sport, | 638 | { .sport = inet->sport, |
638 | .dport = dport } } }; | 639 | .dport = dport } } }; |
diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c index 410046a8cc91..e44deb8d4df2 100644 --- a/net/ipv6/datagram.c +++ b/net/ipv6/datagram.c | |||
@@ -661,6 +661,11 @@ int datagram_send_ctl(struct net *net, | |||
661 | switch (rthdr->type) { | 661 | switch (rthdr->type) { |
662 | #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) | 662 | #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) |
663 | case IPV6_SRCRT_TYPE_2: | 663 | case IPV6_SRCRT_TYPE_2: |
664 | if (rthdr->hdrlen != 2 || | ||
665 | rthdr->segments_left != 1) { | ||
666 | err = -EINVAL; | ||
667 | goto exit_f; | ||
668 | } | ||
664 | break; | 669 | break; |
665 | #endif | 670 | #endif |
666 | default: | 671 | default: |
diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c index 52a7eb0e2c2c..0524769632e7 100644 --- a/net/ipv6/ip6mr.c +++ b/net/ipv6/ip6mr.c | |||
@@ -224,7 +224,7 @@ static struct file_operations ip6mr_vif_fops = { | |||
224 | .open = ip6mr_vif_open, | 224 | .open = ip6mr_vif_open, |
225 | .read = seq_read, | 225 | .read = seq_read, |
226 | .llseek = seq_lseek, | 226 | .llseek = seq_lseek, |
227 | .release = seq_release, | 227 | .release = seq_release_private, |
228 | }; | 228 | }; |
229 | 229 | ||
230 | static void *ipmr_mfc_seq_start(struct seq_file *seq, loff_t *pos) | 230 | static void *ipmr_mfc_seq_start(struct seq_file *seq, loff_t *pos) |
@@ -338,7 +338,7 @@ static struct file_operations ip6mr_mfc_fops = { | |||
338 | .open = ipmr_mfc_open, | 338 | .open = ipmr_mfc_open, |
339 | .read = seq_read, | 339 | .read = seq_read, |
340 | .llseek = seq_lseek, | 340 | .llseek = seq_lseek, |
341 | .release = seq_release, | 341 | .release = seq_release_private, |
342 | }; | 342 | }; |
343 | #endif | 343 | #endif |
344 | 344 | ||
diff --git a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c index 4e5eac301f91..2aa294be0c79 100644 --- a/net/ipv6/ipv6_sockglue.c +++ b/net/ipv6/ipv6_sockglue.c | |||
@@ -366,11 +366,16 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname, | |||
366 | } | 366 | } |
367 | 367 | ||
368 | /* routing header option needs extra check */ | 368 | /* routing header option needs extra check */ |
369 | retv = -EINVAL; | ||
369 | if (optname == IPV6_RTHDR && opt && opt->srcrt) { | 370 | if (optname == IPV6_RTHDR && opt && opt->srcrt) { |
370 | struct ipv6_rt_hdr *rthdr = opt->srcrt; | 371 | struct ipv6_rt_hdr *rthdr = opt->srcrt; |
371 | switch (rthdr->type) { | 372 | switch (rthdr->type) { |
372 | #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) | 373 | #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) |
373 | case IPV6_SRCRT_TYPE_2: | 374 | case IPV6_SRCRT_TYPE_2: |
375 | if (rthdr->hdrlen != 2 || | ||
376 | rthdr->segments_left != 1) | ||
377 | goto sticky_done; | ||
378 | |||
374 | break; | 379 | break; |
375 | #endif | 380 | #endif |
376 | default: | 381 | default: |
diff --git a/net/ipv6/proc.c b/net/ipv6/proc.c index 07f0b76e7427..97c17fdd6f75 100644 --- a/net/ipv6/proc.c +++ b/net/ipv6/proc.c | |||
@@ -132,7 +132,7 @@ static struct snmp_mib snmp6_udplite6_list[] = { | |||
132 | 132 | ||
133 | static void snmp6_seq_show_icmpv6msg(struct seq_file *seq, void **mib) | 133 | static void snmp6_seq_show_icmpv6msg(struct seq_file *seq, void **mib) |
134 | { | 134 | { |
135 | static char name[32]; | 135 | char name[32]; |
136 | int i; | 136 | int i; |
137 | 137 | ||
138 | /* print by name -- deprecated items */ | 138 | /* print by name -- deprecated items */ |
@@ -144,7 +144,7 @@ static void snmp6_seq_show_icmpv6msg(struct seq_file *seq, void **mib) | |||
144 | p = icmp6type2name[icmptype]; | 144 | p = icmp6type2name[icmptype]; |
145 | if (!p) /* don't print un-named types here */ | 145 | if (!p) /* don't print un-named types here */ |
146 | continue; | 146 | continue; |
147 | (void) snprintf(name, sizeof(name)-1, "Icmp6%s%s", | 147 | snprintf(name, sizeof(name), "Icmp6%s%s", |
148 | i & 0x100 ? "Out" : "In", p); | 148 | i & 0x100 ? "Out" : "In", p); |
149 | seq_printf(seq, "%-32s\t%lu\n", name, | 149 | seq_printf(seq, "%-32s\t%lu\n", name, |
150 | snmp_fold_field(mib, i)); | 150 | snmp_fold_field(mib, i)); |
@@ -157,7 +157,7 @@ static void snmp6_seq_show_icmpv6msg(struct seq_file *seq, void **mib) | |||
157 | val = snmp_fold_field(mib, i); | 157 | val = snmp_fold_field(mib, i); |
158 | if (!val) | 158 | if (!val) |
159 | continue; | 159 | continue; |
160 | (void) snprintf(name, sizeof(name)-1, "Icmp6%sType%u", | 160 | snprintf(name, sizeof(name), "Icmp6%sType%u", |
161 | i & 0x100 ? "Out" : "In", i & 0xff); | 161 | i & 0x100 ? "Out" : "In", i & 0xff); |
162 | seq_printf(seq, "%-32s\t%lu\n", name, val); | 162 | seq_printf(seq, "%-32s\t%lu\n", name, val); |
163 | } | 163 | } |
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 87665d7bb4f9..409bb7716236 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
@@ -2560,25 +2560,3 @@ void ieee80211_mlme_notify_scan_completed(struct ieee80211_local *local) | |||
2560 | ieee80211_restart_sta_timer(sdata); | 2560 | ieee80211_restart_sta_timer(sdata); |
2561 | rcu_read_unlock(); | 2561 | rcu_read_unlock(); |
2562 | } | 2562 | } |
2563 | |||
2564 | /* driver notification call */ | ||
2565 | void ieee80211_notify_mac(struct ieee80211_hw *hw, | ||
2566 | enum ieee80211_notification_types notif_type) | ||
2567 | { | ||
2568 | struct ieee80211_local *local = hw_to_local(hw); | ||
2569 | struct ieee80211_sub_if_data *sdata; | ||
2570 | |||
2571 | switch (notif_type) { | ||
2572 | case IEEE80211_NOTIFY_RE_ASSOC: | ||
2573 | rcu_read_lock(); | ||
2574 | list_for_each_entry_rcu(sdata, &local->interfaces, list) { | ||
2575 | if (sdata->vif.type != NL80211_IFTYPE_STATION) | ||
2576 | continue; | ||
2577 | |||
2578 | ieee80211_sta_req_auth(sdata, &sdata->u.sta); | ||
2579 | } | ||
2580 | rcu_read_unlock(); | ||
2581 | break; | ||
2582 | } | ||
2583 | } | ||
2584 | EXPORT_SYMBOL(ieee80211_notify_mac); | ||
diff --git a/net/phonet/af_phonet.c b/net/phonet/af_phonet.c index defeb7a0d502..9d211f12582b 100644 --- a/net/phonet/af_phonet.c +++ b/net/phonet/af_phonet.c | |||
@@ -33,9 +33,30 @@ | |||
33 | #include <net/phonet/phonet.h> | 33 | #include <net/phonet/phonet.h> |
34 | #include <net/phonet/pn_dev.h> | 34 | #include <net/phonet/pn_dev.h> |
35 | 35 | ||
36 | static struct net_proto_family phonet_proto_family; | 36 | /* Transport protocol registration */ |
37 | static struct phonet_protocol *phonet_proto_get(int protocol); | 37 | static struct phonet_protocol *proto_tab[PHONET_NPROTO] __read_mostly; |
38 | static inline void phonet_proto_put(struct phonet_protocol *pp); | 38 | static DEFINE_SPINLOCK(proto_tab_lock); |
39 | |||
40 | static struct phonet_protocol *phonet_proto_get(int protocol) | ||
41 | { | ||
42 | struct phonet_protocol *pp; | ||
43 | |||
44 | if (protocol >= PHONET_NPROTO) | ||
45 | return NULL; | ||
46 | |||
47 | spin_lock(&proto_tab_lock); | ||
48 | pp = proto_tab[protocol]; | ||
49 | if (pp && !try_module_get(pp->prot->owner)) | ||
50 | pp = NULL; | ||
51 | spin_unlock(&proto_tab_lock); | ||
52 | |||
53 | return pp; | ||
54 | } | ||
55 | |||
56 | static inline void phonet_proto_put(struct phonet_protocol *pp) | ||
57 | { | ||
58 | module_put(pp->prot->owner); | ||
59 | } | ||
39 | 60 | ||
40 | /* protocol family functions */ | 61 | /* protocol family functions */ |
41 | 62 | ||
@@ -144,8 +165,8 @@ static int pn_send(struct sk_buff *skb, struct net_device *dev, | |||
144 | struct phonethdr *ph; | 165 | struct phonethdr *ph; |
145 | int err; | 166 | int err; |
146 | 167 | ||
147 | if (skb->len + 2 > 0xffff) { | 168 | if (skb->len + 2 > 0xffff /* Phonet length field limit */ || |
148 | /* Phonet length field would overflow */ | 169 | skb->len + sizeof(struct phonethdr) > dev->mtu) { |
149 | err = -EMSGSIZE; | 170 | err = -EMSGSIZE; |
150 | goto drop; | 171 | goto drop; |
151 | } | 172 | } |
@@ -375,10 +396,6 @@ static struct packet_type phonet_packet_type = { | |||
375 | .func = phonet_rcv, | 396 | .func = phonet_rcv, |
376 | }; | 397 | }; |
377 | 398 | ||
378 | /* Transport protocol registration */ | ||
379 | static struct phonet_protocol *proto_tab[PHONET_NPROTO] __read_mostly; | ||
380 | static DEFINE_SPINLOCK(proto_tab_lock); | ||
381 | |||
382 | int __init_or_module phonet_proto_register(int protocol, | 399 | int __init_or_module phonet_proto_register(int protocol, |
383 | struct phonet_protocol *pp) | 400 | struct phonet_protocol *pp) |
384 | { | 401 | { |
@@ -412,27 +429,6 @@ void phonet_proto_unregister(int protocol, struct phonet_protocol *pp) | |||
412 | } | 429 | } |
413 | EXPORT_SYMBOL(phonet_proto_unregister); | 430 | EXPORT_SYMBOL(phonet_proto_unregister); |
414 | 431 | ||
415 | static struct phonet_protocol *phonet_proto_get(int protocol) | ||
416 | { | ||
417 | struct phonet_protocol *pp; | ||
418 | |||
419 | if (protocol >= PHONET_NPROTO) | ||
420 | return NULL; | ||
421 | |||
422 | spin_lock(&proto_tab_lock); | ||
423 | pp = proto_tab[protocol]; | ||
424 | if (pp && !try_module_get(pp->prot->owner)) | ||
425 | pp = NULL; | ||
426 | spin_unlock(&proto_tab_lock); | ||
427 | |||
428 | return pp; | ||
429 | } | ||
430 | |||
431 | static inline void phonet_proto_put(struct phonet_protocol *pp) | ||
432 | { | ||
433 | module_put(pp->prot->owner); | ||
434 | } | ||
435 | |||
436 | /* Module registration */ | 432 | /* Module registration */ |
437 | static int __init phonet_init(void) | 433 | static int __init phonet_init(void) |
438 | { | 434 | { |
diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c index b16ad2972c6b..6ab4a2f92ca0 100644 --- a/net/sched/sch_api.c +++ b/net/sched/sch_api.c | |||
@@ -417,6 +417,8 @@ static int qdisc_dump_stab(struct sk_buff *skb, struct qdisc_size_table *stab) | |||
417 | struct nlattr *nest; | 417 | struct nlattr *nest; |
418 | 418 | ||
419 | nest = nla_nest_start(skb, TCA_STAB); | 419 | nest = nla_nest_start(skb, TCA_STAB); |
420 | if (nest == NULL) | ||
421 | goto nla_put_failure; | ||
420 | NLA_PUT(skb, TCA_STAB_BASE, sizeof(stab->szopts), &stab->szopts); | 422 | NLA_PUT(skb, TCA_STAB_BASE, sizeof(stab->szopts), &stab->szopts); |
421 | nla_nest_end(skb, nest); | 423 | nla_nest_end(skb, nest); |
422 | 424 | ||
diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c index 93cd30ce6501..cdcd16fcfeda 100644 --- a/net/sched/sch_generic.c +++ b/net/sched/sch_generic.c | |||
@@ -270,6 +270,8 @@ static void dev_watchdog_down(struct net_device *dev) | |||
270 | void netif_carrier_on(struct net_device *dev) | 270 | void netif_carrier_on(struct net_device *dev) |
271 | { | 271 | { |
272 | if (test_and_clear_bit(__LINK_STATE_NOCARRIER, &dev->state)) { | 272 | if (test_and_clear_bit(__LINK_STATE_NOCARRIER, &dev->state)) { |
273 | if (dev->reg_state == NETREG_UNINITIALIZED) | ||
274 | return; | ||
273 | linkwatch_fire_event(dev); | 275 | linkwatch_fire_event(dev); |
274 | if (netif_running(dev)) | 276 | if (netif_running(dev)) |
275 | __netdev_watchdog_up(dev); | 277 | __netdev_watchdog_up(dev); |
@@ -285,8 +287,11 @@ EXPORT_SYMBOL(netif_carrier_on); | |||
285 | */ | 287 | */ |
286 | void netif_carrier_off(struct net_device *dev) | 288 | void netif_carrier_off(struct net_device *dev) |
287 | { | 289 | { |
288 | if (!test_and_set_bit(__LINK_STATE_NOCARRIER, &dev->state)) | 290 | if (!test_and_set_bit(__LINK_STATE_NOCARRIER, &dev->state)) { |
291 | if (dev->reg_state == NETREG_UNINITIALIZED) | ||
292 | return; | ||
289 | linkwatch_fire_event(dev); | 293 | linkwatch_fire_event(dev); |
294 | } | ||
290 | } | 295 | } |
291 | EXPORT_SYMBOL(netif_carrier_off); | 296 | EXPORT_SYMBOL(netif_carrier_off); |
292 | 297 | ||
diff --git a/net/socket.c b/net/socket.c index 57550c3bcabe..92764d836891 100644 --- a/net/socket.c +++ b/net/socket.c | |||
@@ -1426,8 +1426,8 @@ asmlinkage long sys_listen(int fd, int backlog) | |||
1426 | * clean when we restucture accept also. | 1426 | * clean when we restucture accept also. |
1427 | */ | 1427 | */ |
1428 | 1428 | ||
1429 | long do_accept(int fd, struct sockaddr __user *upeer_sockaddr, | 1429 | asmlinkage long sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr, |
1430 | int __user *upeer_addrlen, int flags) | 1430 | int __user *upeer_addrlen, int flags) |
1431 | { | 1431 | { |
1432 | struct socket *sock, *newsock; | 1432 | struct socket *sock, *newsock; |
1433 | struct file *newfile; | 1433 | struct file *newfile; |
@@ -1510,66 +1510,10 @@ out_fd: | |||
1510 | goto out_put; | 1510 | goto out_put; |
1511 | } | 1511 | } |
1512 | 1512 | ||
1513 | #if 0 | ||
1514 | #ifdef HAVE_SET_RESTORE_SIGMASK | ||
1515 | asmlinkage long sys_paccept(int fd, struct sockaddr __user *upeer_sockaddr, | ||
1516 | int __user *upeer_addrlen, | ||
1517 | const sigset_t __user *sigmask, | ||
1518 | size_t sigsetsize, int flags) | ||
1519 | { | ||
1520 | sigset_t ksigmask, sigsaved; | ||
1521 | int ret; | ||
1522 | |||
1523 | if (sigmask) { | ||
1524 | /* XXX: Don't preclude handling different sized sigset_t's. */ | ||
1525 | if (sigsetsize != sizeof(sigset_t)) | ||
1526 | return -EINVAL; | ||
1527 | if (copy_from_user(&ksigmask, sigmask, sizeof(ksigmask))) | ||
1528 | return -EFAULT; | ||
1529 | |||
1530 | sigdelsetmask(&ksigmask, sigmask(SIGKILL)|sigmask(SIGSTOP)); | ||
1531 | sigprocmask(SIG_SETMASK, &ksigmask, &sigsaved); | ||
1532 | } | ||
1533 | |||
1534 | ret = do_accept(fd, upeer_sockaddr, upeer_addrlen, flags); | ||
1535 | |||
1536 | if (ret < 0 && signal_pending(current)) { | ||
1537 | /* | ||
1538 | * Don't restore the signal mask yet. Let do_signal() deliver | ||
1539 | * the signal on the way back to userspace, before the signal | ||
1540 | * mask is restored. | ||
1541 | */ | ||
1542 | if (sigmask) { | ||
1543 | memcpy(¤t->saved_sigmask, &sigsaved, | ||
1544 | sizeof(sigsaved)); | ||
1545 | set_restore_sigmask(); | ||
1546 | } | ||
1547 | } else if (sigmask) | ||
1548 | sigprocmask(SIG_SETMASK, &sigsaved, NULL); | ||
1549 | |||
1550 | return ret; | ||
1551 | } | ||
1552 | #else | ||
1553 | asmlinkage long sys_paccept(int fd, struct sockaddr __user *upeer_sockaddr, | ||
1554 | int __user *upeer_addrlen, | ||
1555 | const sigset_t __user *sigmask, | ||
1556 | size_t sigsetsize, int flags) | ||
1557 | { | ||
1558 | /* The platform does not support restoring the signal mask in the | ||
1559 | * return path. So we do not allow using paccept() with a signal | ||
1560 | * mask. */ | ||
1561 | if (sigmask) | ||
1562 | return -EINVAL; | ||
1563 | |||
1564 | return do_accept(fd, upeer_sockaddr, upeer_addrlen, flags); | ||
1565 | } | ||
1566 | #endif | ||
1567 | #endif | ||
1568 | |||
1569 | asmlinkage long sys_accept(int fd, struct sockaddr __user *upeer_sockaddr, | 1513 | asmlinkage long sys_accept(int fd, struct sockaddr __user *upeer_sockaddr, |
1570 | int __user *upeer_addrlen) | 1514 | int __user *upeer_addrlen) |
1571 | { | 1515 | { |
1572 | return do_accept(fd, upeer_sockaddr, upeer_addrlen, 0); | 1516 | return sys_accept4(fd, upeer_sockaddr, upeer_addrlen, 0); |
1573 | } | 1517 | } |
1574 | 1518 | ||
1575 | /* | 1519 | /* |
@@ -2096,7 +2040,7 @@ static const unsigned char nargs[19]={ | |||
2096 | AL(0),AL(3),AL(3),AL(3),AL(2),AL(3), | 2040 | AL(0),AL(3),AL(3),AL(3),AL(2),AL(3), |
2097 | AL(3),AL(3),AL(4),AL(4),AL(4),AL(6), | 2041 | AL(3),AL(3),AL(4),AL(4),AL(4),AL(6), |
2098 | AL(6),AL(2),AL(5),AL(5),AL(3),AL(3), | 2042 | AL(6),AL(2),AL(5),AL(5),AL(3),AL(3), |
2099 | AL(6) | 2043 | AL(4) |
2100 | }; | 2044 | }; |
2101 | 2045 | ||
2102 | #undef AL | 2046 | #undef AL |
@@ -2115,7 +2059,7 @@ asmlinkage long sys_socketcall(int call, unsigned long __user *args) | |||
2115 | unsigned long a0, a1; | 2059 | unsigned long a0, a1; |
2116 | int err; | 2060 | int err; |
2117 | 2061 | ||
2118 | if (call < 1 || call > SYS_PACCEPT) | 2062 | if (call < 1 || call > SYS_ACCEPT4) |
2119 | return -EINVAL; | 2063 | return -EINVAL; |
2120 | 2064 | ||
2121 | /* copy_from_user should be SMP safe. */ | 2065 | /* copy_from_user should be SMP safe. */ |
@@ -2143,9 +2087,8 @@ asmlinkage long sys_socketcall(int call, unsigned long __user *args) | |||
2143 | err = sys_listen(a0, a1); | 2087 | err = sys_listen(a0, a1); |
2144 | break; | 2088 | break; |
2145 | case SYS_ACCEPT: | 2089 | case SYS_ACCEPT: |
2146 | err = | 2090 | err = sys_accept4(a0, (struct sockaddr __user *)a1, |
2147 | do_accept(a0, (struct sockaddr __user *)a1, | 2091 | (int __user *)a[2], 0); |
2148 | (int __user *)a[2], 0); | ||
2149 | break; | 2092 | break; |
2150 | case SYS_GETSOCKNAME: | 2093 | case SYS_GETSOCKNAME: |
2151 | err = | 2094 | err = |
@@ -2192,12 +2135,9 @@ asmlinkage long sys_socketcall(int call, unsigned long __user *args) | |||
2192 | case SYS_RECVMSG: | 2135 | case SYS_RECVMSG: |
2193 | err = sys_recvmsg(a0, (struct msghdr __user *)a1, a[2]); | 2136 | err = sys_recvmsg(a0, (struct msghdr __user *)a1, a[2]); |
2194 | break; | 2137 | break; |
2195 | case SYS_PACCEPT: | 2138 | case SYS_ACCEPT4: |
2196 | err = | 2139 | err = sys_accept4(a0, (struct sockaddr __user *)a1, |
2197 | sys_paccept(a0, (struct sockaddr __user *)a1, | 2140 | (int __user *)a[2], a[3]); |
2198 | (int __user *)a[2], | ||
2199 | (const sigset_t __user *) a[3], | ||
2200 | a[4], a[5]); | ||
2201 | break; | 2141 | break; |
2202 | default: | 2142 | default: |
2203 | err = -EINVAL; | 2143 | err = -EINVAL; |
diff --git a/net/sunrpc/auth_generic.c b/net/sunrpc/auth_generic.c index 744b79fdcb19..4028502f0528 100644 --- a/net/sunrpc/auth_generic.c +++ b/net/sunrpc/auth_generic.c | |||
@@ -133,13 +133,29 @@ static int | |||
133 | generic_match(struct auth_cred *acred, struct rpc_cred *cred, int flags) | 133 | generic_match(struct auth_cred *acred, struct rpc_cred *cred, int flags) |
134 | { | 134 | { |
135 | struct generic_cred *gcred = container_of(cred, struct generic_cred, gc_base); | 135 | struct generic_cred *gcred = container_of(cred, struct generic_cred, gc_base); |
136 | int i; | ||
136 | 137 | ||
137 | if (gcred->acred.uid != acred->uid || | 138 | if (gcred->acred.uid != acred->uid || |
138 | gcred->acred.gid != acred->gid || | 139 | gcred->acred.gid != acred->gid || |
139 | gcred->acred.group_info != acred->group_info || | ||
140 | gcred->acred.machine_cred != acred->machine_cred) | 140 | gcred->acred.machine_cred != acred->machine_cred) |
141 | return 0; | 141 | goto out_nomatch; |
142 | |||
143 | /* Optimisation in the case where pointers are identical... */ | ||
144 | if (gcred->acred.group_info == acred->group_info) | ||
145 | goto out_match; | ||
146 | |||
147 | /* Slow path... */ | ||
148 | if (gcred->acred.group_info->ngroups != acred->group_info->ngroups) | ||
149 | goto out_nomatch; | ||
150 | for (i = 0; i < gcred->acred.group_info->ngroups; i++) { | ||
151 | if (GROUP_AT(gcred->acred.group_info, i) != | ||
152 | GROUP_AT(acred->group_info, i)) | ||
153 | goto out_nomatch; | ||
154 | } | ||
155 | out_match: | ||
142 | return 1; | 156 | return 1; |
157 | out_nomatch: | ||
158 | return 0; | ||
143 | } | 159 | } |
144 | 160 | ||
145 | void __init rpc_init_generic_auth(void) | 161 | void __init rpc_init_generic_auth(void) |
diff --git a/scripts/kernel-doc b/scripts/kernel-doc index a53e2fc8dfb5..d27aad78e1d8 100755 --- a/scripts/kernel-doc +++ b/scripts/kernel-doc | |||
@@ -378,6 +378,10 @@ sub dump_section { | |||
378 | # print STDERR "parameter def '$1' = '$contents'\n"; | 378 | # print STDERR "parameter def '$1' = '$contents'\n"; |
379 | $name = $1; | 379 | $name = $1; |
380 | $parameterdescs{$name} = $contents; | 380 | $parameterdescs{$name} = $contents; |
381 | } elsif ($name eq "@\.\.\.") { | ||
382 | # print STDERR "parameter def '...' = '$contents'\n"; | ||
383 | $name = "..."; | ||
384 | $parameterdescs{$name} = $contents; | ||
381 | } else { | 385 | } else { |
382 | # print STDERR "other section '$name' = '$contents'\n"; | 386 | # print STDERR "other section '$name' = '$contents'\n"; |
383 | if (defined($sections{$name}) && ($sections{$name} ne "")) { | 387 | if (defined($sections{$name}) && ($sections{$name} ne "")) { |
@@ -1588,12 +1592,12 @@ sub push_parameter($$$) { | |||
1588 | 1592 | ||
1589 | if ($type eq "" && $param =~ /\.\.\.$/) | 1593 | if ($type eq "" && $param =~ /\.\.\.$/) |
1590 | { | 1594 | { |
1591 | $type=""; | 1595 | if (!defined $parameterdescs{$param} || $parameterdescs{$param} eq "") { |
1592 | $parameterdescs{$param} = "variable arguments"; | 1596 | $parameterdescs{$param} = "variable arguments"; |
1597 | } | ||
1593 | } | 1598 | } |
1594 | elsif ($type eq "" && ($param eq "" or $param eq "void")) | 1599 | elsif ($type eq "" && ($param eq "" or $param eq "void")) |
1595 | { | 1600 | { |
1596 | $type=""; | ||
1597 | $param="void"; | 1601 | $param="void"; |
1598 | $parameterdescs{void} = "no arguments"; | 1602 | $parameterdescs{void} = "no arguments"; |
1599 | } | 1603 | } |
diff --git a/sound/pci/hda/hda_beep.c b/sound/pci/hda/hda_beep.c index 9b77b3e0fa98..3ecd7e797dee 100644 --- a/sound/pci/hda/hda_beep.c +++ b/sound/pci/hda/hda_beep.c | |||
@@ -37,6 +37,9 @@ static void snd_hda_generate_beep(struct work_struct *work) | |||
37 | container_of(work, struct hda_beep, beep_work); | 37 | container_of(work, struct hda_beep, beep_work); |
38 | struct hda_codec *codec = beep->codec; | 38 | struct hda_codec *codec = beep->codec; |
39 | 39 | ||
40 | if (!beep->enabled) | ||
41 | return; | ||
42 | |||
40 | /* generate tone */ | 43 | /* generate tone */ |
41 | snd_hda_codec_write_cache(codec, beep->nid, 0, | 44 | snd_hda_codec_write_cache(codec, beep->nid, 0, |
42 | AC_VERB_SET_BEEP_CONTROL, beep->tone); | 45 | AC_VERB_SET_BEEP_CONTROL, beep->tone); |
@@ -85,6 +88,10 @@ int snd_hda_attach_beep_device(struct hda_codec *codec, int nid) | |||
85 | snprintf(beep->phys, sizeof(beep->phys), | 88 | snprintf(beep->phys, sizeof(beep->phys), |
86 | "card%d/codec#%d/beep0", codec->bus->card->number, codec->addr); | 89 | "card%d/codec#%d/beep0", codec->bus->card->number, codec->addr); |
87 | input_dev = input_allocate_device(); | 90 | input_dev = input_allocate_device(); |
91 | if (!input_dev) { | ||
92 | kfree(beep); | ||
93 | return -ENOMEM; | ||
94 | } | ||
88 | 95 | ||
89 | /* setup digital beep device */ | 96 | /* setup digital beep device */ |
90 | input_dev->name = "HDA Digital PCBeep"; | 97 | input_dev->name = "HDA Digital PCBeep"; |
@@ -115,6 +122,7 @@ int snd_hda_attach_beep_device(struct hda_codec *codec, int nid) | |||
115 | beep->nid = nid; | 122 | beep->nid = nid; |
116 | beep->dev = input_dev; | 123 | beep->dev = input_dev; |
117 | beep->codec = codec; | 124 | beep->codec = codec; |
125 | beep->enabled = 1; | ||
118 | codec->beep = beep; | 126 | codec->beep = beep; |
119 | 127 | ||
120 | INIT_WORK(&beep->beep_work, &snd_hda_generate_beep); | 128 | INIT_WORK(&beep->beep_work, &snd_hda_generate_beep); |
diff --git a/sound/pci/hda/hda_beep.h b/sound/pci/hda/hda_beep.h index de4036e6e710..b9679f081cae 100644 --- a/sound/pci/hda/hda_beep.h +++ b/sound/pci/hda/hda_beep.h | |||
@@ -31,6 +31,7 @@ struct hda_beep { | |||
31 | char phys[32]; | 31 | char phys[32]; |
32 | int tone; | 32 | int tone; |
33 | int nid; | 33 | int nid; |
34 | int enabled; | ||
34 | struct work_struct beep_work; /* scheduled task for beep event */ | 35 | struct work_struct beep_work; /* scheduled task for beep event */ |
35 | }; | 36 | }; |
36 | 37 | ||
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index ba1ab737b55f..eb9164176dab 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c | |||
@@ -1436,12 +1436,12 @@ static void set_dig_out(struct hda_codec *codec, hda_nid_t nid, | |||
1436 | { | 1436 | { |
1437 | hda_nid_t *d; | 1437 | hda_nid_t *d; |
1438 | 1438 | ||
1439 | snd_hda_codec_write(codec, nid, 0, verb, val); | 1439 | snd_hda_codec_write_cache(codec, nid, 0, verb, val); |
1440 | d = codec->slave_dig_outs; | 1440 | d = codec->slave_dig_outs; |
1441 | if (!d) | 1441 | if (!d) |
1442 | return; | 1442 | return; |
1443 | for (; *d; d++) | 1443 | for (; *d; d++) |
1444 | snd_hda_codec_write(codec, *d, 0, verb, val); | 1444 | snd_hda_codec_write_cache(codec, *d, 0, verb, val); |
1445 | } | 1445 | } |
1446 | 1446 | ||
1447 | static inline void set_dig_out_convert(struct hda_codec *codec, hda_nid_t nid, | 1447 | static inline void set_dig_out_convert(struct hda_codec *codec, hda_nid_t nid, |
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index e6085915d86d..5dd3e89f620a 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
@@ -36,9 +36,11 @@ | |||
36 | #include "hda_beep.h" | 36 | #include "hda_beep.h" |
37 | 37 | ||
38 | #define NUM_CONTROL_ALLOC 32 | 38 | #define NUM_CONTROL_ALLOC 32 |
39 | |||
40 | #define STAC_VREF_EVENT 0x00 | ||
41 | #define STAC_INSERT_EVENT 0x10 | ||
39 | #define STAC_PWR_EVENT 0x20 | 42 | #define STAC_PWR_EVENT 0x20 |
40 | #define STAC_HP_EVENT 0x30 | 43 | #define STAC_HP_EVENT 0x30 |
41 | #define STAC_VREF_EVENT 0x40 | ||
42 | 44 | ||
43 | enum { | 45 | enum { |
44 | STAC_REF, | 46 | STAC_REF, |
@@ -68,7 +70,9 @@ enum { | |||
68 | 70 | ||
69 | enum { | 71 | enum { |
70 | STAC_92HD73XX_REF, | 72 | STAC_92HD73XX_REF, |
71 | STAC_DELL_M6, | 73 | STAC_DELL_M6_AMIC, |
74 | STAC_DELL_M6_DMIC, | ||
75 | STAC_DELL_M6_BOTH, | ||
72 | STAC_DELL_EQ, | 76 | STAC_DELL_EQ, |
73 | STAC_92HD73XX_MODELS | 77 | STAC_92HD73XX_MODELS |
74 | }; | 78 | }; |
@@ -82,6 +86,7 @@ enum { | |||
82 | STAC_92HD71BXX_REF, | 86 | STAC_92HD71BXX_REF, |
83 | STAC_DELL_M4_1, | 87 | STAC_DELL_M4_1, |
84 | STAC_DELL_M4_2, | 88 | STAC_DELL_M4_2, |
89 | STAC_DELL_M4_3, | ||
85 | STAC_HP_M4, | 90 | STAC_HP_M4, |
86 | STAC_92HD71BXX_MODELS | 91 | STAC_92HD71BXX_MODELS |
87 | }; | 92 | }; |
@@ -135,6 +140,7 @@ struct sigmatel_spec { | |||
135 | unsigned int num_mixers; | 140 | unsigned int num_mixers; |
136 | 141 | ||
137 | int board_config; | 142 | int board_config; |
143 | unsigned int eapd_switch: 1; | ||
138 | unsigned int surr_switch: 1; | 144 | unsigned int surr_switch: 1; |
139 | unsigned int line_switch: 1; | 145 | unsigned int line_switch: 1; |
140 | unsigned int mic_switch: 1; | 146 | unsigned int mic_switch: 1; |
@@ -212,7 +218,7 @@ struct sigmatel_spec { | |||
212 | /* i/o switches */ | 218 | /* i/o switches */ |
213 | unsigned int io_switch[2]; | 219 | unsigned int io_switch[2]; |
214 | unsigned int clfe_swap; | 220 | unsigned int clfe_swap; |
215 | unsigned int hp_switch; | 221 | unsigned int hp_switch; /* NID of HP as line-out */ |
216 | unsigned int aloopback; | 222 | unsigned int aloopback; |
217 | 223 | ||
218 | struct hda_pcm pcm_rec[2]; /* PCM information */ | 224 | struct hda_pcm pcm_rec[2]; /* PCM information */ |
@@ -1598,13 +1604,17 @@ static unsigned int dell_m6_pin_configs[13] = { | |||
1598 | 1604 | ||
1599 | static unsigned int *stac92hd73xx_brd_tbl[STAC_92HD73XX_MODELS] = { | 1605 | static unsigned int *stac92hd73xx_brd_tbl[STAC_92HD73XX_MODELS] = { |
1600 | [STAC_92HD73XX_REF] = ref92hd73xx_pin_configs, | 1606 | [STAC_92HD73XX_REF] = ref92hd73xx_pin_configs, |
1601 | [STAC_DELL_M6] = dell_m6_pin_configs, | 1607 | [STAC_DELL_M6_AMIC] = dell_m6_pin_configs, |
1608 | [STAC_DELL_M6_DMIC] = dell_m6_pin_configs, | ||
1609 | [STAC_DELL_M6_BOTH] = dell_m6_pin_configs, | ||
1602 | [STAC_DELL_EQ] = dell_m6_pin_configs, | 1610 | [STAC_DELL_EQ] = dell_m6_pin_configs, |
1603 | }; | 1611 | }; |
1604 | 1612 | ||
1605 | static const char *stac92hd73xx_models[STAC_92HD73XX_MODELS] = { | 1613 | static const char *stac92hd73xx_models[STAC_92HD73XX_MODELS] = { |
1606 | [STAC_92HD73XX_REF] = "ref", | 1614 | [STAC_92HD73XX_REF] = "ref", |
1607 | [STAC_DELL_M6] = "dell-m6", | 1615 | [STAC_DELL_M6_AMIC] = "dell-m6-amic", |
1616 | [STAC_DELL_M6_DMIC] = "dell-m6-dmic", | ||
1617 | [STAC_DELL_M6_BOTH] = "dell-m6", | ||
1608 | [STAC_DELL_EQ] = "dell-eq", | 1618 | [STAC_DELL_EQ] = "dell-eq", |
1609 | }; | 1619 | }; |
1610 | 1620 | ||
@@ -1613,19 +1623,23 @@ static struct snd_pci_quirk stac92hd73xx_cfg_tbl[] = { | |||
1613 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, | 1623 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, |
1614 | "DFI LanParty", STAC_92HD73XX_REF), | 1624 | "DFI LanParty", STAC_92HD73XX_REF), |
1615 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0254, | 1625 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0254, |
1616 | "unknown Dell", STAC_DELL_M6), | 1626 | "Dell Studio 1535", STAC_DELL_M6_DMIC), |
1617 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0255, | 1627 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0255, |
1618 | "unknown Dell", STAC_DELL_M6), | 1628 | "unknown Dell", STAC_DELL_M6_DMIC), |
1619 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0256, | 1629 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0256, |
1620 | "unknown Dell", STAC_DELL_M6), | 1630 | "unknown Dell", STAC_DELL_M6_BOTH), |
1621 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0257, | 1631 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0257, |
1622 | "unknown Dell", STAC_DELL_M6), | 1632 | "unknown Dell", STAC_DELL_M6_BOTH), |
1623 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x025e, | 1633 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x025e, |
1624 | "unknown Dell", STAC_DELL_M6), | 1634 | "unknown Dell", STAC_DELL_M6_AMIC), |
1625 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x025f, | 1635 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x025f, |
1626 | "unknown Dell", STAC_DELL_M6), | 1636 | "unknown Dell", STAC_DELL_M6_AMIC), |
1627 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0271, | 1637 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0271, |
1628 | "unknown Dell", STAC_DELL_M6), | 1638 | "unknown Dell", STAC_DELL_M6_DMIC), |
1639 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0272, | ||
1640 | "unknown Dell", STAC_DELL_M6_DMIC), | ||
1641 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x029f, | ||
1642 | "Dell Studio 1537", STAC_DELL_M6_DMIC), | ||
1629 | {} /* terminator */ | 1643 | {} /* terminator */ |
1630 | }; | 1644 | }; |
1631 | 1645 | ||
@@ -1668,10 +1682,17 @@ static unsigned int dell_m4_2_pin_configs[11] = { | |||
1668 | 0x40f000f0, 0x044413b0, 0x044413b0, | 1682 | 0x40f000f0, 0x044413b0, 0x044413b0, |
1669 | }; | 1683 | }; |
1670 | 1684 | ||
1685 | static unsigned int dell_m4_3_pin_configs[11] = { | ||
1686 | 0x0421101f, 0x04a11221, 0x90a70330, 0x90170110, | ||
1687 | 0x40f000f0, 0x40f000f0, 0x40f000f0, 0x90a000f0, | ||
1688 | 0x40f000f0, 0x044413b0, 0x044413b0, | ||
1689 | }; | ||
1690 | |||
1671 | static unsigned int *stac92hd71bxx_brd_tbl[STAC_92HD71BXX_MODELS] = { | 1691 | static unsigned int *stac92hd71bxx_brd_tbl[STAC_92HD71BXX_MODELS] = { |
1672 | [STAC_92HD71BXX_REF] = ref92hd71bxx_pin_configs, | 1692 | [STAC_92HD71BXX_REF] = ref92hd71bxx_pin_configs, |
1673 | [STAC_DELL_M4_1] = dell_m4_1_pin_configs, | 1693 | [STAC_DELL_M4_1] = dell_m4_1_pin_configs, |
1674 | [STAC_DELL_M4_2] = dell_m4_2_pin_configs, | 1694 | [STAC_DELL_M4_2] = dell_m4_2_pin_configs, |
1695 | [STAC_DELL_M4_3] = dell_m4_3_pin_configs, | ||
1675 | [STAC_HP_M4] = NULL, | 1696 | [STAC_HP_M4] = NULL, |
1676 | }; | 1697 | }; |
1677 | 1698 | ||
@@ -1679,6 +1700,7 @@ static const char *stac92hd71bxx_models[STAC_92HD71BXX_MODELS] = { | |||
1679 | [STAC_92HD71BXX_REF] = "ref", | 1700 | [STAC_92HD71BXX_REF] = "ref", |
1680 | [STAC_DELL_M4_1] = "dell-m4-1", | 1701 | [STAC_DELL_M4_1] = "dell-m4-1", |
1681 | [STAC_DELL_M4_2] = "dell-m4-2", | 1702 | [STAC_DELL_M4_2] = "dell-m4-2", |
1703 | [STAC_DELL_M4_3] = "dell-m4-3", | ||
1682 | [STAC_HP_M4] = "hp-m4", | 1704 | [STAC_HP_M4] = "hp-m4", |
1683 | }; | 1705 | }; |
1684 | 1706 | ||
@@ -1686,6 +1708,10 @@ static struct snd_pci_quirk stac92hd71bxx_cfg_tbl[] = { | |||
1686 | /* SigmaTel reference board */ | 1708 | /* SigmaTel reference board */ |
1687 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, | 1709 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, |
1688 | "DFI LanParty", STAC_92HD71BXX_REF), | 1710 | "DFI LanParty", STAC_92HD71BXX_REF), |
1711 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30f2, | ||
1712 | "HP dv5", STAC_HP_M4), | ||
1713 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30f4, | ||
1714 | "HP dv7", STAC_HP_M4), | ||
1689 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x361a, | 1715 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x361a, |
1690 | "unknown HP", STAC_HP_M4), | 1716 | "unknown HP", STAC_HP_M4), |
1691 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0233, | 1717 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0233, |
@@ -1710,6 +1736,8 @@ static struct snd_pci_quirk stac92hd71bxx_cfg_tbl[] = { | |||
1710 | "unknown Dell", STAC_DELL_M4_2), | 1736 | "unknown Dell", STAC_DELL_M4_2), |
1711 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0264, | 1737 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0264, |
1712 | "unknown Dell", STAC_DELL_M4_2), | 1738 | "unknown Dell", STAC_DELL_M4_2), |
1739 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02aa, | ||
1740 | "unknown Dell", STAC_DELL_M4_3), | ||
1713 | {} /* terminator */ | 1741 | {} /* terminator */ |
1714 | }; | 1742 | }; |
1715 | 1743 | ||
@@ -2443,7 +2471,7 @@ static int stac92xx_hp_switch_get(struct snd_kcontrol *kcontrol, | |||
2443 | struct hda_codec *codec = snd_kcontrol_chip(kcontrol); | 2471 | struct hda_codec *codec = snd_kcontrol_chip(kcontrol); |
2444 | struct sigmatel_spec *spec = codec->spec; | 2472 | struct sigmatel_spec *spec = codec->spec; |
2445 | 2473 | ||
2446 | ucontrol->value.integer.value[0] = spec->hp_switch; | 2474 | ucontrol->value.integer.value[0] = !!spec->hp_switch; |
2447 | return 0; | 2475 | return 0; |
2448 | } | 2476 | } |
2449 | 2477 | ||
@@ -2452,8 +2480,9 @@ static int stac92xx_hp_switch_put(struct snd_kcontrol *kcontrol, | |||
2452 | { | 2480 | { |
2453 | struct hda_codec *codec = snd_kcontrol_chip(kcontrol); | 2481 | struct hda_codec *codec = snd_kcontrol_chip(kcontrol); |
2454 | struct sigmatel_spec *spec = codec->spec; | 2482 | struct sigmatel_spec *spec = codec->spec; |
2455 | 2483 | int nid = kcontrol->private_value; | |
2456 | spec->hp_switch = ucontrol->value.integer.value[0]; | 2484 | |
2485 | spec->hp_switch = ucontrol->value.integer.value[0] ? nid : 0; | ||
2457 | 2486 | ||
2458 | /* check to be sure that the ports are upto date with | 2487 | /* check to be sure that the ports are upto date with |
2459 | * switch changes | 2488 | * switch changes |
@@ -2586,8 +2615,10 @@ static struct snd_kcontrol_new stac92xx_control_templates[] = { | |||
2586 | }; | 2615 | }; |
2587 | 2616 | ||
2588 | /* add dynamic controls */ | 2617 | /* add dynamic controls */ |
2589 | static int stac92xx_add_control_idx(struct sigmatel_spec *spec, int type, | 2618 | static int stac92xx_add_control_temp(struct sigmatel_spec *spec, |
2590 | int idx, const char *name, unsigned long val) | 2619 | struct snd_kcontrol_new *ktemp, |
2620 | int idx, const char *name, | ||
2621 | unsigned long val) | ||
2591 | { | 2622 | { |
2592 | struct snd_kcontrol_new *knew; | 2623 | struct snd_kcontrol_new *knew; |
2593 | 2624 | ||
@@ -2606,20 +2637,29 @@ static int stac92xx_add_control_idx(struct sigmatel_spec *spec, int type, | |||
2606 | } | 2637 | } |
2607 | 2638 | ||
2608 | knew = &spec->kctl_alloc[spec->num_kctl_used]; | 2639 | knew = &spec->kctl_alloc[spec->num_kctl_used]; |
2609 | *knew = stac92xx_control_templates[type]; | 2640 | *knew = *ktemp; |
2610 | knew->index = idx; | 2641 | knew->index = idx; |
2611 | knew->name = kstrdup(name, GFP_KERNEL); | 2642 | knew->name = kstrdup(name, GFP_KERNEL); |
2612 | if (! knew->name) | 2643 | if (!knew->name) |
2613 | return -ENOMEM; | 2644 | return -ENOMEM; |
2614 | knew->private_value = val; | 2645 | knew->private_value = val; |
2615 | spec->num_kctl_used++; | 2646 | spec->num_kctl_used++; |
2616 | return 0; | 2647 | return 0; |
2617 | } | 2648 | } |
2618 | 2649 | ||
2650 | static inline int stac92xx_add_control_idx(struct sigmatel_spec *spec, | ||
2651 | int type, int idx, const char *name, | ||
2652 | unsigned long val) | ||
2653 | { | ||
2654 | return stac92xx_add_control_temp(spec, | ||
2655 | &stac92xx_control_templates[type], | ||
2656 | idx, name, val); | ||
2657 | } | ||
2658 | |||
2619 | 2659 | ||
2620 | /* add dynamic controls */ | 2660 | /* add dynamic controls */ |
2621 | static int stac92xx_add_control(struct sigmatel_spec *spec, int type, | 2661 | static inline int stac92xx_add_control(struct sigmatel_spec *spec, int type, |
2622 | const char *name, unsigned long val) | 2662 | const char *name, unsigned long val) |
2623 | { | 2663 | { |
2624 | return stac92xx_add_control_idx(spec, type, 0, name, val); | 2664 | return stac92xx_add_control_idx(spec, type, 0, name, val); |
2625 | } | 2665 | } |
@@ -2859,10 +2899,11 @@ static int stac92xx_auto_create_multi_out_ctls(struct hda_codec *codec, | |||
2859 | cfg->hp_outs && !spec->multiout.hp_nid) | 2899 | cfg->hp_outs && !spec->multiout.hp_nid) |
2860 | spec->multiout.hp_nid = nid; | 2900 | spec->multiout.hp_nid = nid; |
2861 | 2901 | ||
2862 | if (cfg->hp_outs > 1) { | 2902 | if (cfg->hp_outs > 1 && cfg->line_out_type == AUTO_PIN_LINE_OUT) { |
2863 | err = stac92xx_add_control(spec, | 2903 | err = stac92xx_add_control(spec, |
2864 | STAC_CTL_WIDGET_HP_SWITCH, | 2904 | STAC_CTL_WIDGET_HP_SWITCH, |
2865 | "Headphone as Line Out Switch", 0); | 2905 | "Headphone as Line Out Switch", |
2906 | cfg->hp_pins[cfg->hp_outs - 1]); | ||
2866 | if (err < 0) | 2907 | if (err < 0) |
2867 | return err; | 2908 | return err; |
2868 | } | 2909 | } |
@@ -3060,6 +3101,43 @@ static int stac92xx_auto_create_beep_ctls(struct hda_codec *codec, | |||
3060 | return 0; | 3101 | return 0; |
3061 | } | 3102 | } |
3062 | 3103 | ||
3104 | #ifdef CONFIG_SND_HDA_INPUT_BEEP | ||
3105 | #define stac92xx_dig_beep_switch_info snd_ctl_boolean_mono_info | ||
3106 | |||
3107 | static int stac92xx_dig_beep_switch_get(struct snd_kcontrol *kcontrol, | ||
3108 | struct snd_ctl_elem_value *ucontrol) | ||
3109 | { | ||
3110 | struct hda_codec *codec = snd_kcontrol_chip(kcontrol); | ||
3111 | ucontrol->value.integer.value[0] = codec->beep->enabled; | ||
3112 | return 0; | ||
3113 | } | ||
3114 | |||
3115 | static int stac92xx_dig_beep_switch_put(struct snd_kcontrol *kcontrol, | ||
3116 | struct snd_ctl_elem_value *ucontrol) | ||
3117 | { | ||
3118 | struct hda_codec *codec = snd_kcontrol_chip(kcontrol); | ||
3119 | int enabled = !!ucontrol->value.integer.value[0]; | ||
3120 | if (codec->beep->enabled != enabled) { | ||
3121 | codec->beep->enabled = enabled; | ||
3122 | return 1; | ||
3123 | } | ||
3124 | return 0; | ||
3125 | } | ||
3126 | |||
3127 | static struct snd_kcontrol_new stac92xx_dig_beep_ctrl = { | ||
3128 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | ||
3129 | .info = stac92xx_dig_beep_switch_info, | ||
3130 | .get = stac92xx_dig_beep_switch_get, | ||
3131 | .put = stac92xx_dig_beep_switch_put, | ||
3132 | }; | ||
3133 | |||
3134 | static int stac92xx_beep_switch_ctl(struct hda_codec *codec) | ||
3135 | { | ||
3136 | return stac92xx_add_control_temp(codec->spec, &stac92xx_dig_beep_ctrl, | ||
3137 | 0, "PC Beep Playback Switch", 0); | ||
3138 | } | ||
3139 | #endif | ||
3140 | |||
3063 | static int stac92xx_auto_create_mux_input_ctls(struct hda_codec *codec) | 3141 | static int stac92xx_auto_create_mux_input_ctls(struct hda_codec *codec) |
3064 | { | 3142 | { |
3065 | struct sigmatel_spec *spec = codec->spec; | 3143 | struct sigmatel_spec *spec = codec->spec; |
@@ -3366,6 +3444,7 @@ static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t dig_out | |||
3366 | #ifdef CONFIG_SND_HDA_INPUT_BEEP | 3444 | #ifdef CONFIG_SND_HDA_INPUT_BEEP |
3367 | if (spec->digbeep_nid > 0) { | 3445 | if (spec->digbeep_nid > 0) { |
3368 | hda_nid_t nid = spec->digbeep_nid; | 3446 | hda_nid_t nid = spec->digbeep_nid; |
3447 | unsigned int caps; | ||
3369 | 3448 | ||
3370 | err = stac92xx_auto_create_beep_ctls(codec, nid); | 3449 | err = stac92xx_auto_create_beep_ctls(codec, nid); |
3371 | if (err < 0) | 3450 | if (err < 0) |
@@ -3373,6 +3452,14 @@ static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t dig_out | |||
3373 | err = snd_hda_attach_beep_device(codec, nid); | 3452 | err = snd_hda_attach_beep_device(codec, nid); |
3374 | if (err < 0) | 3453 | if (err < 0) |
3375 | return err; | 3454 | return err; |
3455 | /* if no beep switch is available, make its own one */ | ||
3456 | caps = query_amp_caps(codec, nid, HDA_OUTPUT); | ||
3457 | if (codec->beep && | ||
3458 | !((caps & AC_AMPCAP_MUTE) >> AC_AMPCAP_MUTE_SHIFT)) { | ||
3459 | err = stac92xx_beep_switch_ctl(codec); | ||
3460 | if (err < 0) | ||
3461 | return err; | ||
3462 | } | ||
3376 | } | 3463 | } |
3377 | #endif | 3464 | #endif |
3378 | 3465 | ||
@@ -3530,6 +3617,12 @@ static int stac9200_parse_auto_config(struct hda_codec *codec) | |||
3530 | if ((err = stac9200_auto_create_lfe_ctls(codec, &spec->autocfg)) < 0) | 3617 | if ((err = stac9200_auto_create_lfe_ctls(codec, &spec->autocfg)) < 0) |
3531 | return err; | 3618 | return err; |
3532 | 3619 | ||
3620 | if (spec->num_muxes > 0) { | ||
3621 | err = stac92xx_auto_create_mux_input_ctls(codec); | ||
3622 | if (err < 0) | ||
3623 | return err; | ||
3624 | } | ||
3625 | |||
3533 | if (spec->autocfg.dig_out_pin) | 3626 | if (spec->autocfg.dig_out_pin) |
3534 | spec->multiout.dig_out_nid = 0x05; | 3627 | spec->multiout.dig_out_nid = 0x05; |
3535 | if (spec->autocfg.dig_in_pin) | 3628 | if (spec->autocfg.dig_in_pin) |
@@ -3612,10 +3705,14 @@ static void stac92xx_power_down(struct hda_codec *codec) | |||
3612 | AC_VERB_SET_POWER_STATE, AC_PWRST_D3); | 3705 | AC_VERB_SET_POWER_STATE, AC_PWRST_D3); |
3613 | } | 3706 | } |
3614 | 3707 | ||
3708 | static void stac_toggle_power_map(struct hda_codec *codec, hda_nid_t nid, | ||
3709 | int enable); | ||
3710 | |||
3615 | static int stac92xx_init(struct hda_codec *codec) | 3711 | static int stac92xx_init(struct hda_codec *codec) |
3616 | { | 3712 | { |
3617 | struct sigmatel_spec *spec = codec->spec; | 3713 | struct sigmatel_spec *spec = codec->spec; |
3618 | struct auto_pin_cfg *cfg = &spec->autocfg; | 3714 | struct auto_pin_cfg *cfg = &spec->autocfg; |
3715 | unsigned int gpio; | ||
3619 | int i; | 3716 | int i; |
3620 | 3717 | ||
3621 | snd_hda_sequence_write(codec, spec->init); | 3718 | snd_hda_sequence_write(codec, spec->init); |
@@ -3626,6 +3723,16 @@ static int stac92xx_init(struct hda_codec *codec) | |||
3626 | snd_hda_codec_write_cache(codec, | 3723 | snd_hda_codec_write_cache(codec, |
3627 | spec->adc_nids[i], 0, | 3724 | spec->adc_nids[i], 0, |
3628 | AC_VERB_SET_POWER_STATE, AC_PWRST_D3); | 3725 | AC_VERB_SET_POWER_STATE, AC_PWRST_D3); |
3726 | |||
3727 | /* set up GPIO */ | ||
3728 | gpio = spec->gpio_data; | ||
3729 | /* turn on EAPD statically when spec->eapd_switch isn't set. | ||
3730 | * otherwise, unsol event will turn it on/off dynamically | ||
3731 | */ | ||
3732 | if (!spec->eapd_switch) | ||
3733 | gpio |= spec->eapd_mask; | ||
3734 | stac_gpio_set(codec, spec->gpio_mask, spec->gpio_dir, gpio); | ||
3735 | |||
3629 | /* set up pins */ | 3736 | /* set up pins */ |
3630 | if (spec->hp_detect) { | 3737 | if (spec->hp_detect) { |
3631 | /* Enable unsolicited responses on the HP widget */ | 3738 | /* Enable unsolicited responses on the HP widget */ |
@@ -3647,53 +3754,61 @@ static int stac92xx_init(struct hda_codec *codec) | |||
3647 | for (i = 0; i < AUTO_PIN_LAST; i++) { | 3754 | for (i = 0; i < AUTO_PIN_LAST; i++) { |
3648 | hda_nid_t nid = cfg->input_pins[i]; | 3755 | hda_nid_t nid = cfg->input_pins[i]; |
3649 | if (nid) { | 3756 | if (nid) { |
3650 | unsigned int pinctl = snd_hda_codec_read(codec, nid, | 3757 | unsigned int pinctl; |
3651 | 0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0); | 3758 | if (i == AUTO_PIN_MIC || i == AUTO_PIN_FRONT_MIC) { |
3652 | /* if PINCTL already set then skip */ | 3759 | /* for mic pins, force to initialize */ |
3653 | if (pinctl & AC_PINCAP_IN) | 3760 | pinctl = stac92xx_get_vref(codec, nid); |
3654 | continue; | 3761 | } else { |
3655 | pinctl = AC_PINCTL_IN_EN; | 3762 | pinctl = snd_hda_codec_read(codec, nid, 0, |
3656 | if (i == AUTO_PIN_MIC || i == AUTO_PIN_FRONT_MIC) | 3763 | AC_VERB_GET_PIN_WIDGET_CONTROL, 0); |
3657 | pinctl |= stac92xx_get_vref(codec, nid); | 3764 | /* if PINCTL already set then skip */ |
3765 | if (pinctl & AC_PINCTL_IN_EN) | ||
3766 | continue; | ||
3767 | } | ||
3768 | pinctl |= AC_PINCTL_IN_EN; | ||
3658 | stac92xx_auto_set_pinctl(codec, nid, pinctl); | 3769 | stac92xx_auto_set_pinctl(codec, nid, pinctl); |
3659 | } | 3770 | } |
3660 | } | 3771 | } |
3661 | for (i = 0; i < spec->num_dmics; i++) | 3772 | for (i = 0; i < spec->num_dmics; i++) |
3662 | stac92xx_auto_set_pinctl(codec, spec->dmic_nids[i], | 3773 | stac92xx_auto_set_pinctl(codec, spec->dmic_nids[i], |
3663 | AC_PINCTL_IN_EN); | 3774 | AC_PINCTL_IN_EN); |
3775 | if (cfg->dig_out_pin) | ||
3776 | stac92xx_auto_set_pinctl(codec, cfg->dig_out_pin, | ||
3777 | AC_PINCTL_OUT_EN); | ||
3778 | if (cfg->dig_in_pin) | ||
3779 | stac92xx_auto_set_pinctl(codec, cfg->dig_in_pin, | ||
3780 | AC_PINCTL_IN_EN); | ||
3664 | for (i = 0; i < spec->num_pwrs; i++) { | 3781 | for (i = 0; i < spec->num_pwrs; i++) { |
3665 | int event = is_nid_hp_pin(cfg, spec->pwr_nids[i]) | 3782 | hda_nid_t nid = spec->pwr_nids[i]; |
3666 | ? STAC_HP_EVENT : STAC_PWR_EVENT; | 3783 | int pinctl, def_conf; |
3667 | int pinctl = snd_hda_codec_read(codec, spec->pwr_nids[i], | 3784 | int event = STAC_PWR_EVENT; |
3668 | 0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0); | 3785 | |
3669 | int def_conf = snd_hda_codec_read(codec, spec->pwr_nids[i], | 3786 | if (is_nid_hp_pin(cfg, nid) && spec->hp_detect) |
3670 | 0, AC_VERB_GET_CONFIG_DEFAULT, 0); | 3787 | continue; /* already has an unsol event */ |
3671 | def_conf = get_defcfg_connect(def_conf); | 3788 | |
3789 | pinctl = snd_hda_codec_read(codec, nid, 0, | ||
3790 | AC_VERB_GET_PIN_WIDGET_CONTROL, 0); | ||
3672 | /* outputs are only ports capable of power management | 3791 | /* outputs are only ports capable of power management |
3673 | * any attempts on powering down a input port cause the | 3792 | * any attempts on powering down a input port cause the |
3674 | * referenced VREF to act quirky. | 3793 | * referenced VREF to act quirky. |
3675 | */ | 3794 | */ |
3676 | if (pinctl & AC_PINCTL_IN_EN) | 3795 | if (pinctl & AC_PINCTL_IN_EN) |
3677 | continue; | 3796 | continue; |
3797 | def_conf = snd_hda_codec_read(codec, nid, 0, | ||
3798 | AC_VERB_GET_CONFIG_DEFAULT, 0); | ||
3799 | def_conf = get_defcfg_connect(def_conf); | ||
3678 | /* skip any ports that don't have jacks since presence | 3800 | /* skip any ports that don't have jacks since presence |
3679 | * detection is useless */ | 3801 | * detection is useless */ |
3680 | if (def_conf && def_conf != AC_JACK_PORT_FIXED) | 3802 | if (def_conf != AC_JACK_PORT_COMPLEX) { |
3803 | if (def_conf != AC_JACK_PORT_NONE) | ||
3804 | stac_toggle_power_map(codec, nid, 1); | ||
3681 | continue; | 3805 | continue; |
3806 | } | ||
3682 | enable_pin_detect(codec, spec->pwr_nids[i], event | i); | 3807 | enable_pin_detect(codec, spec->pwr_nids[i], event | i); |
3683 | codec->patch_ops.unsol_event(codec, (event | i) << 26); | 3808 | codec->patch_ops.unsol_event(codec, (event | i) << 26); |
3684 | } | 3809 | } |
3685 | if (spec->dac_list) | 3810 | if (spec->dac_list) |
3686 | stac92xx_power_down(codec); | 3811 | stac92xx_power_down(codec); |
3687 | if (cfg->dig_out_pin) | ||
3688 | stac92xx_auto_set_pinctl(codec, cfg->dig_out_pin, | ||
3689 | AC_PINCTL_OUT_EN); | ||
3690 | if (cfg->dig_in_pin) | ||
3691 | stac92xx_auto_set_pinctl(codec, cfg->dig_in_pin, | ||
3692 | AC_PINCTL_IN_EN); | ||
3693 | |||
3694 | stac_gpio_set(codec, spec->gpio_mask, | ||
3695 | spec->gpio_dir, spec->gpio_data); | ||
3696 | |||
3697 | return 0; | 3812 | return 0; |
3698 | } | 3813 | } |
3699 | 3814 | ||
@@ -3776,11 +3891,30 @@ static int get_hp_pin_presence(struct hda_codec *codec, hda_nid_t nid) | |||
3776 | return 0; | 3891 | return 0; |
3777 | } | 3892 | } |
3778 | 3893 | ||
3894 | /* return non-zero if the hp-pin of the given array index isn't | ||
3895 | * a jack-detection target | ||
3896 | */ | ||
3897 | static int no_hp_sensing(struct sigmatel_spec *spec, int i) | ||
3898 | { | ||
3899 | struct auto_pin_cfg *cfg = &spec->autocfg; | ||
3900 | |||
3901 | /* ignore sensing of shared line and mic jacks */ | ||
3902 | if (spec->line_switch && | ||
3903 | cfg->hp_pins[i] == cfg->input_pins[AUTO_PIN_LINE]) | ||
3904 | return 1; | ||
3905 | if (spec->mic_switch && | ||
3906 | cfg->hp_pins[i] == cfg->input_pins[AUTO_PIN_MIC]) | ||
3907 | return 1; | ||
3908 | /* ignore if the pin is set as line-out */ | ||
3909 | if (cfg->hp_pins[i] == spec->hp_switch) | ||
3910 | return 1; | ||
3911 | return 0; | ||
3912 | } | ||
3913 | |||
3779 | static void stac92xx_hp_detect(struct hda_codec *codec, unsigned int res) | 3914 | static void stac92xx_hp_detect(struct hda_codec *codec, unsigned int res) |
3780 | { | 3915 | { |
3781 | struct sigmatel_spec *spec = codec->spec; | 3916 | struct sigmatel_spec *spec = codec->spec; |
3782 | struct auto_pin_cfg *cfg = &spec->autocfg; | 3917 | struct auto_pin_cfg *cfg = &spec->autocfg; |
3783 | int nid = cfg->hp_pins[cfg->hp_outs - 1]; | ||
3784 | int i, presence; | 3918 | int i, presence; |
3785 | 3919 | ||
3786 | presence = 0; | 3920 | presence = 0; |
@@ -3791,52 +3925,66 @@ static void stac92xx_hp_detect(struct hda_codec *codec, unsigned int res) | |||
3791 | for (i = 0; i < cfg->hp_outs; i++) { | 3925 | for (i = 0; i < cfg->hp_outs; i++) { |
3792 | if (presence) | 3926 | if (presence) |
3793 | break; | 3927 | break; |
3794 | if (spec->hp_switch && cfg->hp_pins[i] == nid) | 3928 | if (no_hp_sensing(spec, i)) |
3795 | break; | 3929 | continue; |
3796 | presence = get_hp_pin_presence(codec, cfg->hp_pins[i]); | 3930 | presence = get_hp_pin_presence(codec, cfg->hp_pins[i]); |
3797 | } | 3931 | } |
3798 | 3932 | ||
3799 | if (presence) { | 3933 | if (presence) { |
3800 | /* disable lineouts, enable hp */ | 3934 | /* disable lineouts */ |
3801 | if (spec->hp_switch) | 3935 | if (spec->hp_switch) |
3802 | stac92xx_reset_pinctl(codec, nid, AC_PINCTL_OUT_EN); | 3936 | stac92xx_reset_pinctl(codec, spec->hp_switch, |
3937 | AC_PINCTL_OUT_EN); | ||
3803 | for (i = 0; i < cfg->line_outs; i++) | 3938 | for (i = 0; i < cfg->line_outs; i++) |
3804 | stac92xx_reset_pinctl(codec, cfg->line_out_pins[i], | 3939 | stac92xx_reset_pinctl(codec, cfg->line_out_pins[i], |
3805 | AC_PINCTL_OUT_EN); | 3940 | AC_PINCTL_OUT_EN); |
3806 | for (i = 0; i < cfg->speaker_outs; i++) | 3941 | for (i = 0; i < cfg->speaker_outs; i++) |
3807 | stac92xx_reset_pinctl(codec, cfg->speaker_pins[i], | 3942 | stac92xx_reset_pinctl(codec, cfg->speaker_pins[i], |
3808 | AC_PINCTL_OUT_EN); | 3943 | AC_PINCTL_OUT_EN); |
3809 | if (spec->eapd_mask) | 3944 | if (spec->eapd_mask && spec->eapd_switch) |
3810 | stac_gpio_set(codec, spec->gpio_mask, | 3945 | stac_gpio_set(codec, spec->gpio_mask, |
3811 | spec->gpio_dir, spec->gpio_data & | 3946 | spec->gpio_dir, spec->gpio_data & |
3812 | ~spec->eapd_mask); | 3947 | ~spec->eapd_mask); |
3813 | } else { | 3948 | } else { |
3814 | /* enable lineouts, disable hp */ | 3949 | /* enable lineouts */ |
3815 | if (spec->hp_switch) | 3950 | if (spec->hp_switch) |
3816 | stac92xx_set_pinctl(codec, nid, AC_PINCTL_OUT_EN); | 3951 | stac92xx_set_pinctl(codec, spec->hp_switch, |
3952 | AC_PINCTL_OUT_EN); | ||
3817 | for (i = 0; i < cfg->line_outs; i++) | 3953 | for (i = 0; i < cfg->line_outs; i++) |
3818 | stac92xx_set_pinctl(codec, cfg->line_out_pins[i], | 3954 | stac92xx_set_pinctl(codec, cfg->line_out_pins[i], |
3819 | AC_PINCTL_OUT_EN); | 3955 | AC_PINCTL_OUT_EN); |
3820 | for (i = 0; i < cfg->speaker_outs; i++) | 3956 | for (i = 0; i < cfg->speaker_outs; i++) |
3821 | stac92xx_set_pinctl(codec, cfg->speaker_pins[i], | 3957 | stac92xx_set_pinctl(codec, cfg->speaker_pins[i], |
3822 | AC_PINCTL_OUT_EN); | 3958 | AC_PINCTL_OUT_EN); |
3823 | if (spec->eapd_mask) | 3959 | if (spec->eapd_mask && spec->eapd_switch) |
3824 | stac_gpio_set(codec, spec->gpio_mask, | 3960 | stac_gpio_set(codec, spec->gpio_mask, |
3825 | spec->gpio_dir, spec->gpio_data | | 3961 | spec->gpio_dir, spec->gpio_data | |
3826 | spec->eapd_mask); | 3962 | spec->eapd_mask); |
3827 | } | 3963 | } |
3828 | if (!spec->hp_switch && cfg->hp_outs > 1 && presence) | 3964 | /* toggle hp outs */ |
3829 | stac92xx_set_pinctl(codec, nid, AC_PINCTL_OUT_EN); | 3965 | for (i = 0; i < cfg->hp_outs; i++) { |
3966 | unsigned int val = AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN; | ||
3967 | if (no_hp_sensing(spec, i)) | ||
3968 | continue; | ||
3969 | if (presence) | ||
3970 | stac92xx_set_pinctl(codec, cfg->hp_pins[i], val); | ||
3971 | else | ||
3972 | stac92xx_reset_pinctl(codec, cfg->hp_pins[i], val); | ||
3973 | } | ||
3830 | } | 3974 | } |
3831 | 3975 | ||
3832 | static void stac92xx_pin_sense(struct hda_codec *codec, int idx) | 3976 | static void stac_toggle_power_map(struct hda_codec *codec, hda_nid_t nid, |
3977 | int enable) | ||
3833 | { | 3978 | { |
3834 | struct sigmatel_spec *spec = codec->spec; | 3979 | struct sigmatel_spec *spec = codec->spec; |
3835 | hda_nid_t nid = spec->pwr_nids[idx]; | 3980 | unsigned int idx, val; |
3836 | int presence, val; | 3981 | |
3837 | val = snd_hda_codec_read(codec, codec->afg, 0, 0x0fec, 0x0) | 3982 | for (idx = 0; idx < spec->num_pwrs; idx++) { |
3838 | & 0x000000ff; | 3983 | if (spec->pwr_nids[idx] == nid) |
3839 | presence = get_hp_pin_presence(codec, nid); | 3984 | break; |
3985 | } | ||
3986 | if (idx >= spec->num_pwrs) | ||
3987 | return; | ||
3840 | 3988 | ||
3841 | /* several codecs have two power down bits */ | 3989 | /* several codecs have two power down bits */ |
3842 | if (spec->pwr_mapping) | 3990 | if (spec->pwr_mapping) |
@@ -3844,14 +3992,20 @@ static void stac92xx_pin_sense(struct hda_codec *codec, int idx) | |||
3844 | else | 3992 | else |
3845 | idx = 1 << idx; | 3993 | idx = 1 << idx; |
3846 | 3994 | ||
3847 | if (presence) | 3995 | val = snd_hda_codec_read(codec, codec->afg, 0, 0x0fec, 0x0) & 0xff; |
3996 | if (enable) | ||
3848 | val &= ~idx; | 3997 | val &= ~idx; |
3849 | else | 3998 | else |
3850 | val |= idx; | 3999 | val |= idx; |
3851 | 4000 | ||
3852 | /* power down unused output ports */ | 4001 | /* power down unused output ports */ |
3853 | snd_hda_codec_write(codec, codec->afg, 0, 0x7ec, val); | 4002 | snd_hda_codec_write(codec, codec->afg, 0, 0x7ec, val); |
3854 | }; | 4003 | } |
4004 | |||
4005 | static void stac92xx_pin_sense(struct hda_codec *codec, hda_nid_t nid) | ||
4006 | { | ||
4007 | stac_toggle_power_map(codec, nid, get_hp_pin_presence(codec, nid)); | ||
4008 | } | ||
3855 | 4009 | ||
3856 | static void stac92xx_unsol_event(struct hda_codec *codec, unsigned int res) | 4010 | static void stac92xx_unsol_event(struct hda_codec *codec, unsigned int res) |
3857 | { | 4011 | { |
@@ -4135,31 +4289,29 @@ again: | |||
4135 | case STAC_DELL_EQ: | 4289 | case STAC_DELL_EQ: |
4136 | spec->init = dell_eq_core_init; | 4290 | spec->init = dell_eq_core_init; |
4137 | /* fallthru */ | 4291 | /* fallthru */ |
4138 | case STAC_DELL_M6: | 4292 | case STAC_DELL_M6_AMIC: |
4293 | case STAC_DELL_M6_DMIC: | ||
4294 | case STAC_DELL_M6_BOTH: | ||
4139 | spec->num_smuxes = 0; | 4295 | spec->num_smuxes = 0; |
4140 | spec->mixer = &stac92hd73xx_6ch_mixer[DELL_M6_MIXER]; | 4296 | spec->mixer = &stac92hd73xx_6ch_mixer[DELL_M6_MIXER]; |
4141 | spec->amp_nids = &stac92hd73xx_amp_nids[DELL_M6_AMP]; | 4297 | spec->amp_nids = &stac92hd73xx_amp_nids[DELL_M6_AMP]; |
4298 | spec->eapd_switch = 0; | ||
4142 | spec->num_amps = 1; | 4299 | spec->num_amps = 1; |
4143 | 4300 | ||
4144 | if (!spec->init) | 4301 | if (!spec->init) |
4145 | spec->init = dell_m6_core_init; | 4302 | spec->init = dell_m6_core_init; |
4146 | switch (codec->subsystem_id) { | 4303 | switch (spec->board_config) { |
4147 | case 0x1028025e: /* Analog Mics */ | 4304 | case STAC_DELL_M6_AMIC: /* Analog Mics */ |
4148 | case 0x1028025f: | ||
4149 | stac92xx_set_config_reg(codec, 0x0b, 0x90A70170); | 4305 | stac92xx_set_config_reg(codec, 0x0b, 0x90A70170); |
4150 | spec->num_dmics = 0; | 4306 | spec->num_dmics = 0; |
4151 | spec->private_dimux.num_items = 1; | 4307 | spec->private_dimux.num_items = 1; |
4152 | break; | 4308 | break; |
4153 | case 0x10280271: /* Digital Mics */ | 4309 | case STAC_DELL_M6_DMIC: /* Digital Mics */ |
4154 | case 0x10280272: | ||
4155 | case 0x10280254: | ||
4156 | case 0x10280255: | ||
4157 | stac92xx_set_config_reg(codec, 0x13, 0x90A60160); | 4310 | stac92xx_set_config_reg(codec, 0x13, 0x90A60160); |
4158 | spec->num_dmics = 1; | 4311 | spec->num_dmics = 1; |
4159 | spec->private_dimux.num_items = 2; | 4312 | spec->private_dimux.num_items = 2; |
4160 | break; | 4313 | break; |
4161 | case 0x10280256: /* Both */ | 4314 | case STAC_DELL_M6_BOTH: /* Both */ |
4162 | case 0x10280057: | ||
4163 | stac92xx_set_config_reg(codec, 0x0b, 0x90A70170); | 4315 | stac92xx_set_config_reg(codec, 0x0b, 0x90A70170); |
4164 | stac92xx_set_config_reg(codec, 0x13, 0x90A60160); | 4316 | stac92xx_set_config_reg(codec, 0x13, 0x90A60160); |
4165 | spec->num_dmics = 1; | 4317 | spec->num_dmics = 1; |
@@ -4170,6 +4322,7 @@ again: | |||
4170 | default: | 4322 | default: |
4171 | spec->num_dmics = STAC92HD73XX_NUM_DMICS; | 4323 | spec->num_dmics = STAC92HD73XX_NUM_DMICS; |
4172 | spec->num_smuxes = ARRAY_SIZE(stac92hd73xx_smux_nids); | 4324 | spec->num_smuxes = ARRAY_SIZE(stac92hd73xx_smux_nids); |
4325 | spec->eapd_switch = 1; | ||
4173 | } | 4326 | } |
4174 | if (spec->board_config > STAC_92HD73XX_REF) { | 4327 | if (spec->board_config > STAC_92HD73XX_REF) { |
4175 | /* GPIO0 High = Enable EAPD */ | 4328 | /* GPIO0 High = Enable EAPD */ |
@@ -4315,7 +4468,13 @@ static int stac92hd71xx_resume(struct hda_codec *codec) | |||
4315 | 4468 | ||
4316 | static int stac92hd71xx_suspend(struct hda_codec *codec, pm_message_t state) | 4469 | static int stac92hd71xx_suspend(struct hda_codec *codec, pm_message_t state) |
4317 | { | 4470 | { |
4471 | struct sigmatel_spec *spec = codec->spec; | ||
4472 | |||
4318 | stac92hd71xx_set_power_state(codec, AC_PWRST_D3); | 4473 | stac92hd71xx_set_power_state(codec, AC_PWRST_D3); |
4474 | if (spec->eapd_mask) | ||
4475 | stac_gpio_set(codec, spec->gpio_mask, | ||
4476 | spec->gpio_dir, spec->gpio_data & | ||
4477 | ~spec->eapd_mask); | ||
4319 | return 0; | 4478 | return 0; |
4320 | }; | 4479 | }; |
4321 | 4480 | ||
@@ -4378,6 +4537,13 @@ again: | |||
4378 | stac92xx_set_config_regs(codec); | 4537 | stac92xx_set_config_regs(codec); |
4379 | } | 4538 | } |
4380 | 4539 | ||
4540 | if (spec->board_config > STAC_92HD71BXX_REF) { | ||
4541 | /* GPIO0 = EAPD */ | ||
4542 | spec->gpio_mask = 0x01; | ||
4543 | spec->gpio_dir = 0x01; | ||
4544 | spec->gpio_data = 0x01; | ||
4545 | } | ||
4546 | |||
4381 | switch (codec->vendor_id) { | 4547 | switch (codec->vendor_id) { |
4382 | case 0x111d76b6: /* 4 Port without Analog Mixer */ | 4548 | case 0x111d76b6: /* 4 Port without Analog Mixer */ |
4383 | case 0x111d76b7: | 4549 | case 0x111d76b7: |
@@ -4388,10 +4554,10 @@ again: | |||
4388 | codec->slave_dig_outs = stac92hd71bxx_slave_dig_outs; | 4554 | codec->slave_dig_outs = stac92hd71bxx_slave_dig_outs; |
4389 | break; | 4555 | break; |
4390 | case 0x111d7608: /* 5 Port with Analog Mixer */ | 4556 | case 0x111d7608: /* 5 Port with Analog Mixer */ |
4391 | switch (codec->subsystem_id) { | 4557 | switch (spec->board_config) { |
4392 | case 0x103c361a: | 4558 | case STAC_HP_M4: |
4393 | /* Enable VREF power saving on GPIO1 detect */ | 4559 | /* Enable VREF power saving on GPIO1 detect */ |
4394 | snd_hda_codec_write(codec, codec->afg, 0, | 4560 | snd_hda_codec_write_cache(codec, codec->afg, 0, |
4395 | AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x02); | 4561 | AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x02); |
4396 | snd_hda_codec_write_cache(codec, codec->afg, 0, | 4562 | snd_hda_codec_write_cache(codec, codec->afg, 0, |
4397 | AC_VERB_SET_UNSOLICITED_ENABLE, | 4563 | AC_VERB_SET_UNSOLICITED_ENABLE, |
@@ -4437,13 +4603,6 @@ again: | |||
4437 | spec->aloopback_mask = 0x50; | 4603 | spec->aloopback_mask = 0x50; |
4438 | spec->aloopback_shift = 0; | 4604 | spec->aloopback_shift = 0; |
4439 | 4605 | ||
4440 | if (spec->board_config > STAC_92HD71BXX_REF) { | ||
4441 | /* GPIO0 = EAPD */ | ||
4442 | spec->gpio_mask = 0x01; | ||
4443 | spec->gpio_dir = 0x01; | ||
4444 | spec->gpio_data = 0x01; | ||
4445 | } | ||
4446 | |||
4447 | spec->powerdown_adcs = 1; | 4606 | spec->powerdown_adcs = 1; |
4448 | spec->digbeep_nid = 0x26; | 4607 | spec->digbeep_nid = 0x26; |
4449 | spec->mux_nids = stac92hd71bxx_mux_nids; | 4608 | spec->mux_nids = stac92hd71bxx_mux_nids; |
@@ -4458,14 +4617,21 @@ again: | |||
4458 | 4617 | ||
4459 | switch (spec->board_config) { | 4618 | switch (spec->board_config) { |
4460 | case STAC_HP_M4: | 4619 | case STAC_HP_M4: |
4461 | spec->num_dmics = 0; | ||
4462 | spec->num_smuxes = 0; | ||
4463 | spec->num_dmuxes = 0; | ||
4464 | |||
4465 | /* enable internal microphone */ | 4620 | /* enable internal microphone */ |
4466 | stac92xx_set_config_reg(codec, 0x0e, 0x01813040); | 4621 | stac92xx_set_config_reg(codec, 0x0e, 0x01813040); |
4467 | stac92xx_auto_set_pinctl(codec, 0x0e, | 4622 | stac92xx_auto_set_pinctl(codec, 0x0e, |
4468 | AC_PINCTL_IN_EN | AC_PINCTL_VREF_80); | 4623 | AC_PINCTL_IN_EN | AC_PINCTL_VREF_80); |
4624 | /* fallthru */ | ||
4625 | case STAC_DELL_M4_2: | ||
4626 | spec->num_dmics = 0; | ||
4627 | spec->num_smuxes = 0; | ||
4628 | spec->num_dmuxes = 0; | ||
4629 | break; | ||
4630 | case STAC_DELL_M4_1: | ||
4631 | case STAC_DELL_M4_3: | ||
4632 | spec->num_dmics = 1; | ||
4633 | spec->num_smuxes = 0; | ||
4634 | spec->num_dmuxes = 0; | ||
4469 | break; | 4635 | break; |
4470 | default: | 4636 | default: |
4471 | spec->num_dmics = STAC92HD71BXX_NUM_DMICS; | 4637 | spec->num_dmics = STAC92HD71BXX_NUM_DMICS; |
@@ -4702,6 +4868,7 @@ static int patch_stac927x(struct hda_codec *codec) | |||
4702 | spec->num_pwrs = 0; | 4868 | spec->num_pwrs = 0; |
4703 | spec->aloopback_mask = 0x40; | 4869 | spec->aloopback_mask = 0x40; |
4704 | spec->aloopback_shift = 0; | 4870 | spec->aloopback_shift = 0; |
4871 | spec->eapd_switch = 1; | ||
4705 | 4872 | ||
4706 | err = stac92xx_parse_auto_config(codec, 0x1e, 0x20); | 4873 | err = stac92xx_parse_auto_config(codec, 0x1e, 0x20); |
4707 | if (!err) { | 4874 | if (!err) { |
@@ -4782,6 +4949,7 @@ static int patch_stac9205(struct hda_codec *codec) | |||
4782 | 4949 | ||
4783 | spec->aloopback_mask = 0x40; | 4950 | spec->aloopback_mask = 0x40; |
4784 | spec->aloopback_shift = 0; | 4951 | spec->aloopback_shift = 0; |
4952 | spec->eapd_switch = 1; | ||
4785 | spec->multiout.dac_nids = spec->dac_nids; | 4953 | spec->multiout.dac_nids = spec->dac_nids; |
4786 | 4954 | ||
4787 | switch (spec->board_config){ | 4955 | switch (spec->board_config){ |
@@ -4791,7 +4959,7 @@ static int patch_stac9205(struct hda_codec *codec) | |||
4791 | stac92xx_set_config_reg(codec, 0x20, 0x1c410030); | 4959 | stac92xx_set_config_reg(codec, 0x20, 0x1c410030); |
4792 | 4960 | ||
4793 | /* Enable unsol response for GPIO4/Dock HP connection */ | 4961 | /* Enable unsol response for GPIO4/Dock HP connection */ |
4794 | snd_hda_codec_write(codec, codec->afg, 0, | 4962 | snd_hda_codec_write_cache(codec, codec->afg, 0, |
4795 | AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x10); | 4963 | AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x10); |
4796 | snd_hda_codec_write_cache(codec, codec->afg, 0, | 4964 | snd_hda_codec_write_cache(codec, codec->afg, 0, |
4797 | AC_VERB_SET_UNSOLICITED_ENABLE, | 4965 | AC_VERB_SET_UNSOLICITED_ENABLE, |
diff --git a/sound/pci/pcxhr/pcxhr.c b/sound/pci/pcxhr/pcxhr.c index 0e06c6c9fcc0..73de6e989b3d 100644 --- a/sound/pci/pcxhr/pcxhr.c +++ b/sound/pci/pcxhr/pcxhr.c | |||
@@ -1229,8 +1229,11 @@ static int __devinit pcxhr_probe(struct pci_dev *pci, const struct pci_device_id | |||
1229 | return -ENOMEM; | 1229 | return -ENOMEM; |
1230 | } | 1230 | } |
1231 | 1231 | ||
1232 | if (snd_BUG_ON(pci_id->driver_data >= PCI_ID_LAST)) | 1232 | if (snd_BUG_ON(pci_id->driver_data >= PCI_ID_LAST)) { |
1233 | kfree(mgr); | ||
1234 | pci_disable_device(pci); | ||
1233 | return -ENODEV; | 1235 | return -ENODEV; |
1236 | } | ||
1234 | card_name = pcxhr_board_params[pci_id->driver_data].board_name; | 1237 | card_name = pcxhr_board_params[pci_id->driver_data].board_name; |
1235 | mgr->playback_chips = pcxhr_board_params[pci_id->driver_data].playback_chips; | 1238 | mgr->playback_chips = pcxhr_board_params[pci_id->driver_data].playback_chips; |
1236 | mgr->capture_chips = pcxhr_board_params[pci_id->driver_data].capture_chips; | 1239 | mgr->capture_chips = pcxhr_board_params[pci_id->driver_data].capture_chips; |
diff --git a/sound/soc/fsl/Kconfig b/sound/soc/fsl/Kconfig index bba9546ba5f5..8d73edc56102 100644 --- a/sound/soc/fsl/Kconfig +++ b/sound/soc/fsl/Kconfig | |||
@@ -20,7 +20,8 @@ config SND_SOC_MPC8610_HPCD | |||
20 | 20 | ||
21 | config SND_SOC_MPC5200_I2S | 21 | config SND_SOC_MPC5200_I2S |
22 | tristate "Freescale MPC5200 PSC in I2S mode driver" | 22 | tristate "Freescale MPC5200 PSC in I2S mode driver" |
23 | depends on SND_SOC && PPC_MPC52xx && PPC_BESTCOMM | ||
23 | select SND_SOC_OF_SIMPLE | 24 | select SND_SOC_OF_SIMPLE |
24 | depends on SND_SOC && PPC_MPC52xx | 25 | select PPC_BESTCOMM_GEN_BD |
25 | help | 26 | help |
26 | Say Y here to support the MPC5200 PSCs in I2S mode. | 27 | Say Y here to support the MPC5200 PSCs in I2S mode. |
diff --git a/sound/sound_core.c b/sound/sound_core.c index a75b289a5d78..10ba4218161b 100644 --- a/sound/sound_core.c +++ b/sound/sound_core.c | |||
@@ -457,7 +457,7 @@ EXPORT_SYMBOL(unregister_sound_mixer); | |||
457 | 457 | ||
458 | void unregister_sound_midi(int unit) | 458 | void unregister_sound_midi(int unit) |
459 | { | 459 | { |
460 | return sound_remove_unit(&chains[2], unit); | 460 | sound_remove_unit(&chains[2], unit); |
461 | } | 461 | } |
462 | 462 | ||
463 | EXPORT_SYMBOL(unregister_sound_midi); | 463 | EXPORT_SYMBOL(unregister_sound_midi); |
@@ -474,7 +474,7 @@ EXPORT_SYMBOL(unregister_sound_midi); | |||
474 | 474 | ||
475 | void unregister_sound_dsp(int unit) | 475 | void unregister_sound_dsp(int unit) |
476 | { | 476 | { |
477 | return sound_remove_unit(&chains[3], unit); | 477 | sound_remove_unit(&chains[3], unit); |
478 | } | 478 | } |
479 | 479 | ||
480 | 480 | ||
@@ -507,7 +507,7 @@ static struct sound_unit *__look_for_unit(int chain, int unit) | |||
507 | return NULL; | 507 | return NULL; |
508 | } | 508 | } |
509 | 509 | ||
510 | int soundcore_open(struct inode *inode, struct file *file) | 510 | static int soundcore_open(struct inode *inode, struct file *file) |
511 | { | 511 | { |
512 | int chain; | 512 | int chain; |
513 | int unit = iminor(inode); | 513 | int unit = iminor(inode); |