Commit 6816383a09b5be8d35f14f4c25dedb64498e4959
Committed by
Greg Kroah-Hartman
1 parent
5a22e30def
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
tty: sparc: rename drivers/tty/serial/suncore.h -> include/linux/sunserialcore.h
There are multiple users of this file from different source paths now, and rather than have ../ paths in include statements, just move the file to the linux header dir. Suggested-by: David S. Miller <davem@davemloft.net> Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> Acked-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Showing 9 changed files with 42 additions and 45 deletions Inline Diff
MAINTAINERS
1 | 1 | ||
2 | 2 | ||
3 | List of maintainers and how to submit kernel changes | 3 | List of maintainers and how to submit kernel changes |
4 | 4 | ||
5 | Please try to follow the guidelines below. This will make things | 5 | Please try to follow the guidelines below. This will make things |
6 | easier on the maintainers. Not all of these guidelines matter for every | 6 | easier on the maintainers. Not all of these guidelines matter for every |
7 | trivial patch so apply some common sense. | 7 | trivial patch so apply some common sense. |
8 | 8 | ||
9 | 1. Always _test_ your changes, however small, on at least 4 or | 9 | 1. Always _test_ your changes, however small, on at least 4 or |
10 | 5 people, preferably many more. | 10 | 5 people, preferably many more. |
11 | 11 | ||
12 | 2. Try to release a few ALPHA test versions to the net. Announce | 12 | 2. Try to release a few ALPHA test versions to the net. Announce |
13 | them onto the kernel channel and await results. This is especially | 13 | them onto the kernel channel and await results. This is especially |
14 | important for device drivers, because often that's the only way | 14 | important for device drivers, because often that's the only way |
15 | you will find things like the fact version 3 firmware needs | 15 | you will find things like the fact version 3 firmware needs |
16 | a magic fix you didn't know about, or some clown changed the | 16 | a magic fix you didn't know about, or some clown changed the |
17 | chips on a board and not its name. (Don't laugh! Look at the | 17 | chips on a board and not its name. (Don't laugh! Look at the |
18 | SMC etherpower for that.) | 18 | SMC etherpower for that.) |
19 | 19 | ||
20 | 3. Make sure your changes compile correctly in multiple | 20 | 3. Make sure your changes compile correctly in multiple |
21 | configurations. In particular check that changes work both as a | 21 | configurations. In particular check that changes work both as a |
22 | module and built into the kernel. | 22 | module and built into the kernel. |
23 | 23 | ||
24 | 4. When you are happy with a change make it generally available for | 24 | 4. When you are happy with a change make it generally available for |
25 | testing and await feedback. | 25 | testing and await feedback. |
26 | 26 | ||
27 | 5. Make a patch available to the relevant maintainer in the list. Use | 27 | 5. Make a patch available to the relevant maintainer in the list. Use |
28 | 'diff -u' to make the patch easy to merge. Be prepared to get your | 28 | 'diff -u' to make the patch easy to merge. Be prepared to get your |
29 | changes sent back with seemingly silly requests about formatting | 29 | changes sent back with seemingly silly requests about formatting |
30 | and variable names. These aren't as silly as they seem. One | 30 | and variable names. These aren't as silly as they seem. One |
31 | job the maintainers (and especially Linus) do is to keep things | 31 | job the maintainers (and especially Linus) do is to keep things |
32 | looking the same. Sometimes this means that the clever hack in | 32 | looking the same. Sometimes this means that the clever hack in |
33 | your driver to get around a problem actually needs to become a | 33 | your driver to get around a problem actually needs to become a |
34 | generalized kernel feature ready for next time. | 34 | generalized kernel feature ready for next time. |
35 | 35 | ||
36 | PLEASE check your patch with the automated style checker | 36 | PLEASE check your patch with the automated style checker |
37 | (scripts/checkpatch.pl) to catch trival style violations. | 37 | (scripts/checkpatch.pl) to catch trival style violations. |
38 | See Documentation/CodingStyle for guidance here. | 38 | See Documentation/CodingStyle for guidance here. |
39 | 39 | ||
40 | PLEASE CC: the maintainers and mailing lists that are generated | 40 | PLEASE CC: the maintainers and mailing lists that are generated |
41 | by scripts/get_maintainer.pl. The results returned by the | 41 | by scripts/get_maintainer.pl. The results returned by the |
42 | script will be best if you have git installed and are making | 42 | script will be best if you have git installed and are making |
43 | your changes in a branch derived from Linus' latest git tree. | 43 | your changes in a branch derived from Linus' latest git tree. |
44 | See Documentation/SubmittingPatches for details. | 44 | See Documentation/SubmittingPatches for details. |
45 | 45 | ||
46 | PLEASE try to include any credit lines you want added with the | 46 | PLEASE try to include any credit lines you want added with the |
47 | patch. It avoids people being missed off by mistake and makes | 47 | patch. It avoids people being missed off by mistake and makes |
48 | it easier to know who wants adding and who doesn't. | 48 | it easier to know who wants adding and who doesn't. |
49 | 49 | ||
50 | PLEASE document known bugs. If it doesn't work for everything | 50 | PLEASE document known bugs. If it doesn't work for everything |
51 | or does something very odd once a month document it. | 51 | or does something very odd once a month document it. |
52 | 52 | ||
53 | PLEASE remember that submissions must be made under the terms | 53 | PLEASE remember that submissions must be made under the terms |
54 | of the OSDL certificate of contribution and should include a | 54 | of the OSDL certificate of contribution and should include a |
55 | Signed-off-by: line. The current version of this "Developer's | 55 | Signed-off-by: line. The current version of this "Developer's |
56 | Certificate of Origin" (DCO) is listed in the file | 56 | Certificate of Origin" (DCO) is listed in the file |
57 | Documentation/SubmittingPatches. | 57 | Documentation/SubmittingPatches. |
58 | 58 | ||
59 | 6. Make sure you have the right to send any changes you make. If you | 59 | 6. Make sure you have the right to send any changes you make. If you |
60 | do changes at work you may find your employer owns the patch | 60 | do changes at work you may find your employer owns the patch |
61 | not you. | 61 | not you. |
62 | 62 | ||
63 | 7. When sending security related changes or reports to a maintainer | 63 | 7. When sending security related changes or reports to a maintainer |
64 | please Cc: security@kernel.org, especially if the maintainer | 64 | please Cc: security@kernel.org, especially if the maintainer |
65 | does not respond. | 65 | does not respond. |
66 | 66 | ||
67 | 8. Happy hacking. | 67 | 8. Happy hacking. |
68 | 68 | ||
69 | Descriptions of section entries: | 69 | Descriptions of section entries: |
70 | 70 | ||
71 | P: Person (obsolete) | 71 | P: Person (obsolete) |
72 | M: Mail patches to: FullName <address@domain> | 72 | M: Mail patches to: FullName <address@domain> |
73 | L: Mailing list that is relevant to this area | 73 | L: Mailing list that is relevant to this area |
74 | W: Web-page with status/info | 74 | W: Web-page with status/info |
75 | Q: Patchwork web based patch tracking system site | 75 | Q: Patchwork web based patch tracking system site |
76 | T: SCM tree type and location. Type is one of: git, hg, quilt, stgit, topgit. | 76 | T: SCM tree type and location. Type is one of: git, hg, quilt, stgit, topgit. |
77 | S: Status, one of the following: | 77 | S: Status, one of the following: |
78 | Supported: Someone is actually paid to look after this. | 78 | Supported: Someone is actually paid to look after this. |
79 | Maintained: Someone actually looks after it. | 79 | Maintained: Someone actually looks after it. |
80 | Odd Fixes: It has a maintainer but they don't have time to do | 80 | Odd Fixes: It has a maintainer but they don't have time to do |
81 | much other than throw the odd patch in. See below.. | 81 | much other than throw the odd patch in. See below.. |
82 | Orphan: No current maintainer [but maybe you could take the | 82 | Orphan: No current maintainer [but maybe you could take the |
83 | role as you write your new code]. | 83 | role as you write your new code]. |
84 | Obsolete: Old code. Something tagged obsolete generally means | 84 | Obsolete: Old code. Something tagged obsolete generally means |
85 | it has been replaced by a better system and you | 85 | it has been replaced by a better system and you |
86 | should be using that. | 86 | should be using that. |
87 | F: Files and directories with wildcard patterns. | 87 | F: Files and directories with wildcard patterns. |
88 | A trailing slash includes all files and subdirectory files. | 88 | A trailing slash includes all files and subdirectory files. |
89 | F: drivers/net/ all files in and below drivers/net | 89 | F: drivers/net/ all files in and below drivers/net |
90 | F: drivers/net/* all files in drivers/net, but not below | 90 | F: drivers/net/* all files in drivers/net, but not below |
91 | F: */net/* all files in "any top level directory"/net | 91 | F: */net/* all files in "any top level directory"/net |
92 | One pattern per line. Multiple F: lines acceptable. | 92 | One pattern per line. Multiple F: lines acceptable. |
93 | X: Files and directories that are NOT maintained, same rules as F: | 93 | X: Files and directories that are NOT maintained, same rules as F: |
94 | Files exclusions are tested before file matches. | 94 | Files exclusions are tested before file matches. |
95 | Can be useful for excluding a specific subdirectory, for instance: | 95 | Can be useful for excluding a specific subdirectory, for instance: |
96 | F: net/ | 96 | F: net/ |
97 | X: net/ipv6/ | 97 | X: net/ipv6/ |
98 | matches all files in and below net excluding net/ipv6/ | 98 | matches all files in and below net excluding net/ipv6/ |
99 | K: Keyword perl extended regex pattern to match content in a | 99 | K: Keyword perl extended regex pattern to match content in a |
100 | patch or file. For instance: | 100 | patch or file. For instance: |
101 | K: of_get_profile | 101 | K: of_get_profile |
102 | matches patches or files that contain "of_get_profile" | 102 | matches patches or files that contain "of_get_profile" |
103 | K: \b(printk|pr_(info|err))\b | 103 | K: \b(printk|pr_(info|err))\b |
104 | matches patches or files that contain one or more of the words | 104 | matches patches or files that contain one or more of the words |
105 | printk, pr_info or pr_err | 105 | printk, pr_info or pr_err |
106 | One regex pattern per line. Multiple K: lines acceptable. | 106 | One regex pattern per line. Multiple K: lines acceptable. |
107 | 107 | ||
108 | Note: For the hard of thinking, this list is meant to remain in alphabetical | 108 | Note: For the hard of thinking, this list is meant to remain in alphabetical |
109 | order. If you could add yourselves to it in alphabetical order that would be | 109 | order. If you could add yourselves to it in alphabetical order that would be |
110 | so much easier [Ed] | 110 | so much easier [Ed] |
111 | 111 | ||
112 | Maintainers List (try to look for most precise areas first) | 112 | Maintainers List (try to look for most precise areas first) |
113 | 113 | ||
114 | ----------------------------------- | 114 | ----------------------------------- |
115 | 115 | ||
116 | 3C505 NETWORK DRIVER | 116 | 3C505 NETWORK DRIVER |
117 | M: Philip Blundell <philb@gnu.org> | 117 | M: Philip Blundell <philb@gnu.org> |
118 | L: netdev@vger.kernel.org | 118 | L: netdev@vger.kernel.org |
119 | S: Maintained | 119 | S: Maintained |
120 | F: drivers/net/ethernet/i825xx/3c505* | 120 | F: drivers/net/ethernet/i825xx/3c505* |
121 | 121 | ||
122 | 3C59X NETWORK DRIVER | 122 | 3C59X NETWORK DRIVER |
123 | M: Steffen Klassert <klassert@mathematik.tu-chemnitz.de> | 123 | M: Steffen Klassert <klassert@mathematik.tu-chemnitz.de> |
124 | L: netdev@vger.kernel.org | 124 | L: netdev@vger.kernel.org |
125 | S: Maintained | 125 | S: Maintained |
126 | F: Documentation/networking/vortex.txt | 126 | F: Documentation/networking/vortex.txt |
127 | F: drivers/net/ethernet/3com/3c59x.c | 127 | F: drivers/net/ethernet/3com/3c59x.c |
128 | 128 | ||
129 | 3CR990 NETWORK DRIVER | 129 | 3CR990 NETWORK DRIVER |
130 | M: David Dillow <dave@thedillows.org> | 130 | M: David Dillow <dave@thedillows.org> |
131 | L: netdev@vger.kernel.org | 131 | L: netdev@vger.kernel.org |
132 | S: Maintained | 132 | S: Maintained |
133 | F: drivers/net/ethernet/3com/typhoon* | 133 | F: drivers/net/ethernet/3com/typhoon* |
134 | 134 | ||
135 | 3WARE SAS/SATA-RAID SCSI DRIVERS (3W-XXXX, 3W-9XXX, 3W-SAS) | 135 | 3WARE SAS/SATA-RAID SCSI DRIVERS (3W-XXXX, 3W-9XXX, 3W-SAS) |
136 | M: Adam Radford <linuxraid@lsi.com> | 136 | M: Adam Radford <linuxraid@lsi.com> |
137 | L: linux-scsi@vger.kernel.org | 137 | L: linux-scsi@vger.kernel.org |
138 | W: http://www.lsi.com | 138 | W: http://www.lsi.com |
139 | S: Supported | 139 | S: Supported |
140 | F: drivers/scsi/3w-* | 140 | F: drivers/scsi/3w-* |
141 | 141 | ||
142 | 53C700 AND 53C700-66 SCSI DRIVER | 142 | 53C700 AND 53C700-66 SCSI DRIVER |
143 | M: "James E.J. Bottomley" <James.Bottomley@HansenPartnership.com> | 143 | M: "James E.J. Bottomley" <James.Bottomley@HansenPartnership.com> |
144 | L: linux-scsi@vger.kernel.org | 144 | L: linux-scsi@vger.kernel.org |
145 | S: Maintained | 145 | S: Maintained |
146 | F: drivers/scsi/53c700* | 146 | F: drivers/scsi/53c700* |
147 | 147 | ||
148 | 6PACK NETWORK DRIVER FOR AX.25 | 148 | 6PACK NETWORK DRIVER FOR AX.25 |
149 | M: Andreas Koensgen <ajk@comnets.uni-bremen.de> | 149 | M: Andreas Koensgen <ajk@comnets.uni-bremen.de> |
150 | L: linux-hams@vger.kernel.org | 150 | L: linux-hams@vger.kernel.org |
151 | S: Maintained | 151 | S: Maintained |
152 | F: drivers/net/hamradio/6pack.c | 152 | F: drivers/net/hamradio/6pack.c |
153 | 153 | ||
154 | 8169 10/100/1000 GIGABIT ETHERNET DRIVER | 154 | 8169 10/100/1000 GIGABIT ETHERNET DRIVER |
155 | M: Realtek linux nic maintainers <nic_swsd@realtek.com> | 155 | M: Realtek linux nic maintainers <nic_swsd@realtek.com> |
156 | M: Francois Romieu <romieu@fr.zoreil.com> | 156 | M: Francois Romieu <romieu@fr.zoreil.com> |
157 | L: netdev@vger.kernel.org | 157 | L: netdev@vger.kernel.org |
158 | S: Maintained | 158 | S: Maintained |
159 | F: drivers/net/ethernet/realtek/r8169.c | 159 | F: drivers/net/ethernet/realtek/r8169.c |
160 | 160 | ||
161 | 8250/16?50 (AND CLONE UARTS) SERIAL DRIVER | 161 | 8250/16?50 (AND CLONE UARTS) SERIAL DRIVER |
162 | M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 162 | M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
163 | L: linux-serial@vger.kernel.org | 163 | L: linux-serial@vger.kernel.org |
164 | W: http://serial.sourceforge.net | 164 | W: http://serial.sourceforge.net |
165 | S: Maintained | 165 | S: Maintained |
166 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty-2.6.git | 166 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty-2.6.git |
167 | F: drivers/tty/serial/8250* | 167 | F: drivers/tty/serial/8250* |
168 | F: include/linux/serial_8250.h | 168 | F: include/linux/serial_8250.h |
169 | 169 | ||
170 | 8390 NETWORK DRIVERS [WD80x3/SMC-ELITE, SMC-ULTRA, NE2000, 3C503, etc.] | 170 | 8390 NETWORK DRIVERS [WD80x3/SMC-ELITE, SMC-ULTRA, NE2000, 3C503, etc.] |
171 | L: netdev@vger.kernel.org | 171 | L: netdev@vger.kernel.org |
172 | S: Orphan / Obsolete | 172 | S: Orphan / Obsolete |
173 | F: drivers/net/ethernet/8390/ | 173 | F: drivers/net/ethernet/8390/ |
174 | 174 | ||
175 | 9P FILE SYSTEM | 175 | 9P FILE SYSTEM |
176 | M: Eric Van Hensbergen <ericvh@gmail.com> | 176 | M: Eric Van Hensbergen <ericvh@gmail.com> |
177 | M: Ron Minnich <rminnich@sandia.gov> | 177 | M: Ron Minnich <rminnich@sandia.gov> |
178 | M: Latchesar Ionkov <lucho@ionkov.net> | 178 | M: Latchesar Ionkov <lucho@ionkov.net> |
179 | L: v9fs-developer@lists.sourceforge.net | 179 | L: v9fs-developer@lists.sourceforge.net |
180 | W: http://swik.net/v9fs | 180 | W: http://swik.net/v9fs |
181 | Q: http://patchwork.kernel.org/project/v9fs-devel/list/ | 181 | Q: http://patchwork.kernel.org/project/v9fs-devel/list/ |
182 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/ericvh/v9fs.git | 182 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/ericvh/v9fs.git |
183 | S: Maintained | 183 | S: Maintained |
184 | F: Documentation/filesystems/9p.txt | 184 | F: Documentation/filesystems/9p.txt |
185 | F: fs/9p/ | 185 | F: fs/9p/ |
186 | 186 | ||
187 | AACRAID SCSI RAID DRIVER | 187 | AACRAID SCSI RAID DRIVER |
188 | M: Adaptec OEM Raid Solutions <aacraid@adaptec.com> | 188 | M: Adaptec OEM Raid Solutions <aacraid@adaptec.com> |
189 | L: linux-scsi@vger.kernel.org | 189 | L: linux-scsi@vger.kernel.org |
190 | W: http://www.adaptec.com/ | 190 | W: http://www.adaptec.com/ |
191 | S: Supported | 191 | S: Supported |
192 | F: Documentation/scsi/aacraid.txt | 192 | F: Documentation/scsi/aacraid.txt |
193 | F: drivers/scsi/aacraid/ | 193 | F: drivers/scsi/aacraid/ |
194 | 194 | ||
195 | ABIT UGURU 1,2 HARDWARE MONITOR DRIVER | 195 | ABIT UGURU 1,2 HARDWARE MONITOR DRIVER |
196 | M: Hans de Goede <hdegoede@redhat.com> | 196 | M: Hans de Goede <hdegoede@redhat.com> |
197 | L: lm-sensors@lm-sensors.org | 197 | L: lm-sensors@lm-sensors.org |
198 | S: Maintained | 198 | S: Maintained |
199 | F: drivers/hwmon/abituguru.c | 199 | F: drivers/hwmon/abituguru.c |
200 | 200 | ||
201 | ABIT UGURU 3 HARDWARE MONITOR DRIVER | 201 | ABIT UGURU 3 HARDWARE MONITOR DRIVER |
202 | M: Alistair John Strachan <alistair@devzero.co.uk> | 202 | M: Alistair John Strachan <alistair@devzero.co.uk> |
203 | L: lm-sensors@lm-sensors.org | 203 | L: lm-sensors@lm-sensors.org |
204 | S: Maintained | 204 | S: Maintained |
205 | F: drivers/hwmon/abituguru3.c | 205 | F: drivers/hwmon/abituguru3.c |
206 | 206 | ||
207 | ACENIC DRIVER | 207 | ACENIC DRIVER |
208 | M: Jes Sorensen <jes@trained-monkey.org> | 208 | M: Jes Sorensen <jes@trained-monkey.org> |
209 | L: linux-acenic@sunsite.dk | 209 | L: linux-acenic@sunsite.dk |
210 | S: Maintained | 210 | S: Maintained |
211 | F: drivers/net/ethernet/alteon/acenic* | 211 | F: drivers/net/ethernet/alteon/acenic* |
212 | 212 | ||
213 | ACER ASPIRE ONE TEMPERATURE AND FAN DRIVER | 213 | ACER ASPIRE ONE TEMPERATURE AND FAN DRIVER |
214 | M: Peter Feuerer <peter@piie.net> | 214 | M: Peter Feuerer <peter@piie.net> |
215 | L: platform-driver-x86@vger.kernel.org | 215 | L: platform-driver-x86@vger.kernel.org |
216 | W: http://piie.net/?section=acerhdf | 216 | W: http://piie.net/?section=acerhdf |
217 | S: Maintained | 217 | S: Maintained |
218 | F: drivers/platform/x86/acerhdf.c | 218 | F: drivers/platform/x86/acerhdf.c |
219 | 219 | ||
220 | ACER WMI LAPTOP EXTRAS | 220 | ACER WMI LAPTOP EXTRAS |
221 | M: Joey Lee <jlee@novell.com> | 221 | M: Joey Lee <jlee@novell.com> |
222 | L: platform-driver-x86@vger.kernel.org | 222 | L: platform-driver-x86@vger.kernel.org |
223 | S: Maintained | 223 | S: Maintained |
224 | F: drivers/platform/x86/acer-wmi.c | 224 | F: drivers/platform/x86/acer-wmi.c |
225 | 225 | ||
226 | ACPI | 226 | ACPI |
227 | M: Len Brown <lenb@kernel.org> | 227 | M: Len Brown <lenb@kernel.org> |
228 | L: linux-acpi@vger.kernel.org | 228 | L: linux-acpi@vger.kernel.org |
229 | W: http://www.lesswatts.org/projects/acpi/ | 229 | W: http://www.lesswatts.org/projects/acpi/ |
230 | Q: http://patchwork.kernel.org/project/linux-acpi/list/ | 230 | Q: http://patchwork.kernel.org/project/linux-acpi/list/ |
231 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6.git | 231 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6.git |
232 | S: Supported | 232 | S: Supported |
233 | F: drivers/acpi/ | 233 | F: drivers/acpi/ |
234 | F: drivers/pnp/pnpacpi/ | 234 | F: drivers/pnp/pnpacpi/ |
235 | F: include/linux/acpi.h | 235 | F: include/linux/acpi.h |
236 | F: include/acpi/ | 236 | F: include/acpi/ |
237 | 237 | ||
238 | ACPI FAN DRIVER | 238 | ACPI FAN DRIVER |
239 | M: Zhang Rui <rui.zhang@intel.com> | 239 | M: Zhang Rui <rui.zhang@intel.com> |
240 | L: linux-acpi@vger.kernel.org | 240 | L: linux-acpi@vger.kernel.org |
241 | W: http://www.lesswatts.org/projects/acpi/ | 241 | W: http://www.lesswatts.org/projects/acpi/ |
242 | S: Supported | 242 | S: Supported |
243 | F: drivers/acpi/fan.c | 243 | F: drivers/acpi/fan.c |
244 | 244 | ||
245 | ACPI PROCESSOR AGGREGATOR DRIVER | 245 | ACPI PROCESSOR AGGREGATOR DRIVER |
246 | M: Shaohua Li <shaohua.li@intel.com> | 246 | M: Shaohua Li <shaohua.li@intel.com> |
247 | L: linux-acpi@vger.kernel.org | 247 | L: linux-acpi@vger.kernel.org |
248 | W: http://www.lesswatts.org/projects/acpi/ | 248 | W: http://www.lesswatts.org/projects/acpi/ |
249 | S: Supported | 249 | S: Supported |
250 | F: drivers/acpi/acpi_pad.c | 250 | F: drivers/acpi/acpi_pad.c |
251 | 251 | ||
252 | ACPI THERMAL DRIVER | 252 | ACPI THERMAL DRIVER |
253 | M: Zhang Rui <rui.zhang@intel.com> | 253 | M: Zhang Rui <rui.zhang@intel.com> |
254 | L: linux-acpi@vger.kernel.org | 254 | L: linux-acpi@vger.kernel.org |
255 | W: http://www.lesswatts.org/projects/acpi/ | 255 | W: http://www.lesswatts.org/projects/acpi/ |
256 | S: Supported | 256 | S: Supported |
257 | F: drivers/acpi/*thermal* | 257 | F: drivers/acpi/*thermal* |
258 | 258 | ||
259 | ACPI VIDEO DRIVER | 259 | ACPI VIDEO DRIVER |
260 | M: Zhang Rui <rui.zhang@intel.com> | 260 | M: Zhang Rui <rui.zhang@intel.com> |
261 | L: linux-acpi@vger.kernel.org | 261 | L: linux-acpi@vger.kernel.org |
262 | W: http://www.lesswatts.org/projects/acpi/ | 262 | W: http://www.lesswatts.org/projects/acpi/ |
263 | S: Supported | 263 | S: Supported |
264 | F: drivers/acpi/video.c | 264 | F: drivers/acpi/video.c |
265 | 265 | ||
266 | ACPI WMI DRIVER | 266 | ACPI WMI DRIVER |
267 | L: platform-driver-x86@vger.kernel.org | 267 | L: platform-driver-x86@vger.kernel.org |
268 | S: Orphan | 268 | S: Orphan |
269 | F: drivers/platform/x86/wmi.c | 269 | F: drivers/platform/x86/wmi.c |
270 | 270 | ||
271 | AD1889 ALSA SOUND DRIVER | 271 | AD1889 ALSA SOUND DRIVER |
272 | M: Kyle McMartin <kyle@mcmartin.ca> | 272 | M: Kyle McMartin <kyle@mcmartin.ca> |
273 | M: Thibaut Varene <T-Bone@parisc-linux.org> | 273 | M: Thibaut Varene <T-Bone@parisc-linux.org> |
274 | W: http://wiki.parisc-linux.org/AD1889 | 274 | W: http://wiki.parisc-linux.org/AD1889 |
275 | L: linux-parisc@vger.kernel.org | 275 | L: linux-parisc@vger.kernel.org |
276 | S: Maintained | 276 | S: Maintained |
277 | F: sound/pci/ad1889.* | 277 | F: sound/pci/ad1889.* |
278 | 278 | ||
279 | AD525X ANALOG DEVICES DIGITAL POTENTIOMETERS DRIVER | 279 | AD525X ANALOG DEVICES DIGITAL POTENTIOMETERS DRIVER |
280 | M: Michael Hennerich <michael.hennerich@analog.com> | 280 | M: Michael Hennerich <michael.hennerich@analog.com> |
281 | L: device-drivers-devel@blackfin.uclinux.org | 281 | L: device-drivers-devel@blackfin.uclinux.org |
282 | W: http://wiki.analog.com/AD5254 | 282 | W: http://wiki.analog.com/AD5254 |
283 | S: Supported | 283 | S: Supported |
284 | F: drivers/misc/ad525x_dpot.c | 284 | F: drivers/misc/ad525x_dpot.c |
285 | 285 | ||
286 | AD5398 CURRENT REGULATOR DRIVER (AD5398/AD5821) | 286 | AD5398 CURRENT REGULATOR DRIVER (AD5398/AD5821) |
287 | M: Michael Hennerich <michael.hennerich@analog.com> | 287 | M: Michael Hennerich <michael.hennerich@analog.com> |
288 | L: device-drivers-devel@blackfin.uclinux.org | 288 | L: device-drivers-devel@blackfin.uclinux.org |
289 | W: http://wiki.analog.com/AD5398 | 289 | W: http://wiki.analog.com/AD5398 |
290 | S: Supported | 290 | S: Supported |
291 | F: drivers/regulator/ad5398.c | 291 | F: drivers/regulator/ad5398.c |
292 | 292 | ||
293 | AD714X CAPACITANCE TOUCH SENSOR DRIVER (AD7142/3/7/8/7A) | 293 | AD714X CAPACITANCE TOUCH SENSOR DRIVER (AD7142/3/7/8/7A) |
294 | M: Michael Hennerich <michael.hennerich@analog.com> | 294 | M: Michael Hennerich <michael.hennerich@analog.com> |
295 | L: device-drivers-devel@blackfin.uclinux.org | 295 | L: device-drivers-devel@blackfin.uclinux.org |
296 | W: http://wiki.analog.com/AD7142 | 296 | W: http://wiki.analog.com/AD7142 |
297 | S: Supported | 297 | S: Supported |
298 | F: drivers/input/misc/ad714x.c | 298 | F: drivers/input/misc/ad714x.c |
299 | 299 | ||
300 | AD7877 TOUCHSCREEN DRIVER | 300 | AD7877 TOUCHSCREEN DRIVER |
301 | M: Michael Hennerich <michael.hennerich@analog.com> | 301 | M: Michael Hennerich <michael.hennerich@analog.com> |
302 | L: device-drivers-devel@blackfin.uclinux.org | 302 | L: device-drivers-devel@blackfin.uclinux.org |
303 | W: http://wiki.analog.com/AD7877 | 303 | W: http://wiki.analog.com/AD7877 |
304 | S: Supported | 304 | S: Supported |
305 | F: drivers/input/touchscreen/ad7877.c | 305 | F: drivers/input/touchscreen/ad7877.c |
306 | 306 | ||
307 | AD7879 TOUCHSCREEN DRIVER (AD7879/AD7889) | 307 | AD7879 TOUCHSCREEN DRIVER (AD7879/AD7889) |
308 | M: Michael Hennerich <michael.hennerich@analog.com> | 308 | M: Michael Hennerich <michael.hennerich@analog.com> |
309 | L: device-drivers-devel@blackfin.uclinux.org | 309 | L: device-drivers-devel@blackfin.uclinux.org |
310 | W: http://wiki.analog.com/AD7879 | 310 | W: http://wiki.analog.com/AD7879 |
311 | S: Supported | 311 | S: Supported |
312 | F: drivers/input/touchscreen/ad7879.c | 312 | F: drivers/input/touchscreen/ad7879.c |
313 | 313 | ||
314 | ADDRESS SPACE LAYOUT RANDOMIZATION (ASLR) | 314 | ADDRESS SPACE LAYOUT RANDOMIZATION (ASLR) |
315 | M: Jiri Kosina <jkosina@suse.cz> | 315 | M: Jiri Kosina <jkosina@suse.cz> |
316 | S: Maintained | 316 | S: Maintained |
317 | 317 | ||
318 | ADM1025 HARDWARE MONITOR DRIVER | 318 | ADM1025 HARDWARE MONITOR DRIVER |
319 | M: Jean Delvare <khali@linux-fr.org> | 319 | M: Jean Delvare <khali@linux-fr.org> |
320 | L: lm-sensors@lm-sensors.org | 320 | L: lm-sensors@lm-sensors.org |
321 | S: Maintained | 321 | S: Maintained |
322 | F: Documentation/hwmon/adm1025 | 322 | F: Documentation/hwmon/adm1025 |
323 | F: drivers/hwmon/adm1025.c | 323 | F: drivers/hwmon/adm1025.c |
324 | 324 | ||
325 | ADM1029 HARDWARE MONITOR DRIVER | 325 | ADM1029 HARDWARE MONITOR DRIVER |
326 | M: Corentin Labbe <corentin.labbe@geomatys.fr> | 326 | M: Corentin Labbe <corentin.labbe@geomatys.fr> |
327 | L: lm-sensors@lm-sensors.org | 327 | L: lm-sensors@lm-sensors.org |
328 | S: Maintained | 328 | S: Maintained |
329 | F: drivers/hwmon/adm1029.c | 329 | F: drivers/hwmon/adm1029.c |
330 | 330 | ||
331 | ADM8211 WIRELESS DRIVER | 331 | ADM8211 WIRELESS DRIVER |
332 | L: linux-wireless@vger.kernel.org | 332 | L: linux-wireless@vger.kernel.org |
333 | W: http://linuxwireless.org/ | 333 | W: http://linuxwireless.org/ |
334 | S: Orphan | 334 | S: Orphan |
335 | F: drivers/net/wireless/adm8211.* | 335 | F: drivers/net/wireless/adm8211.* |
336 | 336 | ||
337 | ADP5520 BACKLIGHT DRIVER WITH IO EXPANDER (ADP5520/ADP5501) | 337 | ADP5520 BACKLIGHT DRIVER WITH IO EXPANDER (ADP5520/ADP5501) |
338 | M: Michael Hennerich <michael.hennerich@analog.com> | 338 | M: Michael Hennerich <michael.hennerich@analog.com> |
339 | L: device-drivers-devel@blackfin.uclinux.org | 339 | L: device-drivers-devel@blackfin.uclinux.org |
340 | W: http://wiki.analog.com/ADP5520 | 340 | W: http://wiki.analog.com/ADP5520 |
341 | S: Supported | 341 | S: Supported |
342 | F: drivers/mfd/adp5520.c | 342 | F: drivers/mfd/adp5520.c |
343 | F: drivers/video/backlight/adp5520_bl.c | 343 | F: drivers/video/backlight/adp5520_bl.c |
344 | F: drivers/leds/leds-adp5520.c | 344 | F: drivers/leds/leds-adp5520.c |
345 | F: drivers/gpio/gpio-adp5520.c | 345 | F: drivers/gpio/gpio-adp5520.c |
346 | F: drivers/input/keyboard/adp5520-keys.c | 346 | F: drivers/input/keyboard/adp5520-keys.c |
347 | 347 | ||
348 | ADP5588 QWERTY KEYPAD AND IO EXPANDER DRIVER (ADP5588/ADP5587) | 348 | ADP5588 QWERTY KEYPAD AND IO EXPANDER DRIVER (ADP5588/ADP5587) |
349 | M: Michael Hennerich <michael.hennerich@analog.com> | 349 | M: Michael Hennerich <michael.hennerich@analog.com> |
350 | L: device-drivers-devel@blackfin.uclinux.org | 350 | L: device-drivers-devel@blackfin.uclinux.org |
351 | W: http://wiki.analog.com/ADP5588 | 351 | W: http://wiki.analog.com/ADP5588 |
352 | S: Supported | 352 | S: Supported |
353 | F: drivers/input/keyboard/adp5588-keys.c | 353 | F: drivers/input/keyboard/adp5588-keys.c |
354 | F: drivers/gpio/gpio-adp5588.c | 354 | F: drivers/gpio/gpio-adp5588.c |
355 | 355 | ||
356 | ADP8860 BACKLIGHT DRIVER (ADP8860/ADP8861/ADP8863) | 356 | ADP8860 BACKLIGHT DRIVER (ADP8860/ADP8861/ADP8863) |
357 | M: Michael Hennerich <michael.hennerich@analog.com> | 357 | M: Michael Hennerich <michael.hennerich@analog.com> |
358 | L: device-drivers-devel@blackfin.uclinux.org | 358 | L: device-drivers-devel@blackfin.uclinux.org |
359 | W: http://wiki.analog.com/ADP8860 | 359 | W: http://wiki.analog.com/ADP8860 |
360 | S: Supported | 360 | S: Supported |
361 | F: drivers/video/backlight/adp8860_bl.c | 361 | F: drivers/video/backlight/adp8860_bl.c |
362 | 362 | ||
363 | ADS1015 HARDWARE MONITOR DRIVER | 363 | ADS1015 HARDWARE MONITOR DRIVER |
364 | M: Dirk Eibach <eibach@gdsys.de> | 364 | M: Dirk Eibach <eibach@gdsys.de> |
365 | L: lm-sensors@lm-sensors.org | 365 | L: lm-sensors@lm-sensors.org |
366 | S: Maintained | 366 | S: Maintained |
367 | F: Documentation/hwmon/ads1015 | 367 | F: Documentation/hwmon/ads1015 |
368 | F: drivers/hwmon/ads1015.c | 368 | F: drivers/hwmon/ads1015.c |
369 | F: include/linux/i2c/ads1015.h | 369 | F: include/linux/i2c/ads1015.h |
370 | 370 | ||
371 | ADT746X FAN DRIVER | 371 | ADT746X FAN DRIVER |
372 | M: Colin Leroy <colin@colino.net> | 372 | M: Colin Leroy <colin@colino.net> |
373 | S: Maintained | 373 | S: Maintained |
374 | F: drivers/macintosh/therm_adt746x.c | 374 | F: drivers/macintosh/therm_adt746x.c |
375 | 375 | ||
376 | ADT7475 HARDWARE MONITOR DRIVER | 376 | ADT7475 HARDWARE MONITOR DRIVER |
377 | M: Jean Delvare <khali@linux-fr.org> | 377 | M: Jean Delvare <khali@linux-fr.org> |
378 | L: lm-sensors@lm-sensors.org | 378 | L: lm-sensors@lm-sensors.org |
379 | S: Maintained | 379 | S: Maintained |
380 | F: Documentation/hwmon/adt7475 | 380 | F: Documentation/hwmon/adt7475 |
381 | F: drivers/hwmon/adt7475.c | 381 | F: drivers/hwmon/adt7475.c |
382 | 382 | ||
383 | ADXL34X THREE-AXIS DIGITAL ACCELEROMETER DRIVER (ADXL345/ADXL346) | 383 | ADXL34X THREE-AXIS DIGITAL ACCELEROMETER DRIVER (ADXL345/ADXL346) |
384 | M: Michael Hennerich <michael.hennerich@analog.com> | 384 | M: Michael Hennerich <michael.hennerich@analog.com> |
385 | L: device-drivers-devel@blackfin.uclinux.org | 385 | L: device-drivers-devel@blackfin.uclinux.org |
386 | W: http://wiki.analog.com/ADXL345 | 386 | W: http://wiki.analog.com/ADXL345 |
387 | S: Supported | 387 | S: Supported |
388 | F: drivers/input/misc/adxl34x.c | 388 | F: drivers/input/misc/adxl34x.c |
389 | 389 | ||
390 | ADVANSYS SCSI DRIVER | 390 | ADVANSYS SCSI DRIVER |
391 | M: Matthew Wilcox <matthew@wil.cx> | 391 | M: Matthew Wilcox <matthew@wil.cx> |
392 | L: linux-scsi@vger.kernel.org | 392 | L: linux-scsi@vger.kernel.org |
393 | S: Maintained | 393 | S: Maintained |
394 | F: Documentation/scsi/advansys.txt | 394 | F: Documentation/scsi/advansys.txt |
395 | F: drivers/scsi/advansys.c | 395 | F: drivers/scsi/advansys.c |
396 | 396 | ||
397 | AEDSP16 DRIVER | 397 | AEDSP16 DRIVER |
398 | M: Riccardo Facchetti <fizban@tin.it> | 398 | M: Riccardo Facchetti <fizban@tin.it> |
399 | S: Maintained | 399 | S: Maintained |
400 | F: sound/oss/aedsp16.c | 400 | F: sound/oss/aedsp16.c |
401 | 401 | ||
402 | AFFS FILE SYSTEM | 402 | AFFS FILE SYSTEM |
403 | L: linux-fsdevel@vger.kernel.org | 403 | L: linux-fsdevel@vger.kernel.org |
404 | S: Orphan | 404 | S: Orphan |
405 | F: Documentation/filesystems/affs.txt | 405 | F: Documentation/filesystems/affs.txt |
406 | F: fs/affs/ | 406 | F: fs/affs/ |
407 | 407 | ||
408 | AFS FILESYSTEM & AF_RXRPC SOCKET DOMAIN | 408 | AFS FILESYSTEM & AF_RXRPC SOCKET DOMAIN |
409 | M: David Howells <dhowells@redhat.com> | 409 | M: David Howells <dhowells@redhat.com> |
410 | L: linux-afs@lists.infradead.org | 410 | L: linux-afs@lists.infradead.org |
411 | S: Supported | 411 | S: Supported |
412 | F: fs/afs/ | 412 | F: fs/afs/ |
413 | F: include/net/af_rxrpc.h | 413 | F: include/net/af_rxrpc.h |
414 | F: net/rxrpc/af_rxrpc.c | 414 | F: net/rxrpc/af_rxrpc.c |
415 | 415 | ||
416 | AGPGART DRIVER | 416 | AGPGART DRIVER |
417 | M: David Airlie <airlied@linux.ie> | 417 | M: David Airlie <airlied@linux.ie> |
418 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6.git | 418 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6.git |
419 | S: Maintained | 419 | S: Maintained |
420 | F: drivers/char/agp/ | 420 | F: drivers/char/agp/ |
421 | F: include/linux/agp* | 421 | F: include/linux/agp* |
422 | 422 | ||
423 | AHA152X SCSI DRIVER | 423 | AHA152X SCSI DRIVER |
424 | M: "Juergen E. Fischer" <fischer@norbit.de> | 424 | M: "Juergen E. Fischer" <fischer@norbit.de> |
425 | L: linux-scsi@vger.kernel.org | 425 | L: linux-scsi@vger.kernel.org |
426 | S: Maintained | 426 | S: Maintained |
427 | F: drivers/scsi/aha152x* | 427 | F: drivers/scsi/aha152x* |
428 | F: drivers/scsi/pcmcia/aha152x* | 428 | F: drivers/scsi/pcmcia/aha152x* |
429 | 429 | ||
430 | AIC7XXX / AIC79XX SCSI DRIVER | 430 | AIC7XXX / AIC79XX SCSI DRIVER |
431 | M: Hannes Reinecke <hare@suse.de> | 431 | M: Hannes Reinecke <hare@suse.de> |
432 | L: linux-scsi@vger.kernel.org | 432 | L: linux-scsi@vger.kernel.org |
433 | S: Maintained | 433 | S: Maintained |
434 | F: drivers/scsi/aic7xxx/ | 434 | F: drivers/scsi/aic7xxx/ |
435 | F: drivers/scsi/aic7xxx_old/ | 435 | F: drivers/scsi/aic7xxx_old/ |
436 | 436 | ||
437 | AIO | 437 | AIO |
438 | M: Benjamin LaHaise <bcrl@kvack.org> | 438 | M: Benjamin LaHaise <bcrl@kvack.org> |
439 | L: linux-aio@kvack.org | 439 | L: linux-aio@kvack.org |
440 | S: Supported | 440 | S: Supported |
441 | F: fs/aio.c | 441 | F: fs/aio.c |
442 | F: include/linux/*aio*.h | 442 | F: include/linux/*aio*.h |
443 | 443 | ||
444 | ALCATEL SPEEDTOUCH USB DRIVER | 444 | ALCATEL SPEEDTOUCH USB DRIVER |
445 | M: Duncan Sands <duncan.sands@free.fr> | 445 | M: Duncan Sands <duncan.sands@free.fr> |
446 | L: linux-usb@vger.kernel.org | 446 | L: linux-usb@vger.kernel.org |
447 | W: http://www.linux-usb.org/SpeedTouch/ | 447 | W: http://www.linux-usb.org/SpeedTouch/ |
448 | S: Maintained | 448 | S: Maintained |
449 | F: drivers/usb/atm/speedtch.c | 449 | F: drivers/usb/atm/speedtch.c |
450 | F: drivers/usb/atm/usbatm.c | 450 | F: drivers/usb/atm/usbatm.c |
451 | 451 | ||
452 | ALCHEMY AU1XX0 MMC DRIVER | 452 | ALCHEMY AU1XX0 MMC DRIVER |
453 | M: Manuel Lauss <manuel.lauss@gmail.com> | 453 | M: Manuel Lauss <manuel.lauss@gmail.com> |
454 | S: Maintained | 454 | S: Maintained |
455 | F: drivers/mmc/host/au1xmmc.c | 455 | F: drivers/mmc/host/au1xmmc.c |
456 | 456 | ||
457 | ALI1563 I2C DRIVER | 457 | ALI1563 I2C DRIVER |
458 | M: Rudolf Marek <r.marek@assembler.cz> | 458 | M: Rudolf Marek <r.marek@assembler.cz> |
459 | L: linux-i2c@vger.kernel.org | 459 | L: linux-i2c@vger.kernel.org |
460 | S: Maintained | 460 | S: Maintained |
461 | F: Documentation/i2c/busses/i2c-ali1563 | 461 | F: Documentation/i2c/busses/i2c-ali1563 |
462 | F: drivers/i2c/busses/i2c-ali1563.c | 462 | F: drivers/i2c/busses/i2c-ali1563.c |
463 | 463 | ||
464 | ALPHA PORT | 464 | ALPHA PORT |
465 | M: Richard Henderson <rth@twiddle.net> | 465 | M: Richard Henderson <rth@twiddle.net> |
466 | M: Ivan Kokshaysky <ink@jurassic.park.msu.ru> | 466 | M: Ivan Kokshaysky <ink@jurassic.park.msu.ru> |
467 | M: Matt Turner <mattst88@gmail.com> | 467 | M: Matt Turner <mattst88@gmail.com> |
468 | L: linux-alpha@vger.kernel.org | 468 | L: linux-alpha@vger.kernel.org |
469 | F: arch/alpha/ | 469 | F: arch/alpha/ |
470 | 470 | ||
471 | ALTERA UART/JTAG UART SERIAL DRIVERS | 471 | ALTERA UART/JTAG UART SERIAL DRIVERS |
472 | M: Tobias Klauser <tklauser@distanz.ch> | 472 | M: Tobias Klauser <tklauser@distanz.ch> |
473 | L: linux-serial@vger.kernel.org | 473 | L: linux-serial@vger.kernel.org |
474 | L: nios2-dev@sopc.et.ntust.edu.tw (moderated for non-subscribers) | 474 | L: nios2-dev@sopc.et.ntust.edu.tw (moderated for non-subscribers) |
475 | S: Maintained | 475 | S: Maintained |
476 | F: drivers/tty/serial/altera_uart.c | 476 | F: drivers/tty/serial/altera_uart.c |
477 | F: drivers/tty/serial/altera_jtaguart.c | 477 | F: drivers/tty/serial/altera_jtaguart.c |
478 | F: include/linux/altera_uart.h | 478 | F: include/linux/altera_uart.h |
479 | F: include/linux/altera_jtaguart.h | 479 | F: include/linux/altera_jtaguart.h |
480 | 480 | ||
481 | AMD FAM15H PROCESSOR POWER MONITORING DRIVER | 481 | AMD FAM15H PROCESSOR POWER MONITORING DRIVER |
482 | M: Andreas Herrmann <andreas.herrmann3@amd.com> | 482 | M: Andreas Herrmann <andreas.herrmann3@amd.com> |
483 | L: lm-sensors@lm-sensors.org | 483 | L: lm-sensors@lm-sensors.org |
484 | S: Maintained | 484 | S: Maintained |
485 | F: Documentation/hwmon/fam15h_power | 485 | F: Documentation/hwmon/fam15h_power |
486 | F: drivers/hwmon/fam15h_power.c | 486 | F: drivers/hwmon/fam15h_power.c |
487 | 487 | ||
488 | AMD GEODE CS5536 USB DEVICE CONTROLLER DRIVER | 488 | AMD GEODE CS5536 USB DEVICE CONTROLLER DRIVER |
489 | M: Thomas Dahlmann <dahlmann.thomas@arcor.de> | 489 | M: Thomas Dahlmann <dahlmann.thomas@arcor.de> |
490 | L: linux-geode@lists.infradead.org (moderated for non-subscribers) | 490 | L: linux-geode@lists.infradead.org (moderated for non-subscribers) |
491 | S: Supported | 491 | S: Supported |
492 | F: drivers/usb/gadget/amd5536udc.* | 492 | F: drivers/usb/gadget/amd5536udc.* |
493 | 493 | ||
494 | AMD GEODE PROCESSOR/CHIPSET SUPPORT | 494 | AMD GEODE PROCESSOR/CHIPSET SUPPORT |
495 | P: Andres Salomon <dilinger@queued.net> | 495 | P: Andres Salomon <dilinger@queued.net> |
496 | L: linux-geode@lists.infradead.org (moderated for non-subscribers) | 496 | L: linux-geode@lists.infradead.org (moderated for non-subscribers) |
497 | W: http://www.amd.com/us-en/ConnectivitySolutions/TechnicalResources/0,,50_2334_2452_11363,00.html | 497 | W: http://www.amd.com/us-en/ConnectivitySolutions/TechnicalResources/0,,50_2334_2452_11363,00.html |
498 | S: Supported | 498 | S: Supported |
499 | F: drivers/char/hw_random/geode-rng.c | 499 | F: drivers/char/hw_random/geode-rng.c |
500 | F: drivers/crypto/geode* | 500 | F: drivers/crypto/geode* |
501 | F: drivers/video/geode/ | 501 | F: drivers/video/geode/ |
502 | F: arch/x86/include/asm/geode.h | 502 | F: arch/x86/include/asm/geode.h |
503 | 503 | ||
504 | AMD IOMMU (AMD-VI) | 504 | AMD IOMMU (AMD-VI) |
505 | M: Joerg Roedel <joerg.roedel@amd.com> | 505 | M: Joerg Roedel <joerg.roedel@amd.com> |
506 | L: iommu@lists.linux-foundation.org | 506 | L: iommu@lists.linux-foundation.org |
507 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/joro/linux-2.6-iommu.git | 507 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/joro/linux-2.6-iommu.git |
508 | S: Supported | 508 | S: Supported |
509 | F: drivers/iommu/amd_iommu*.[ch] | 509 | F: drivers/iommu/amd_iommu*.[ch] |
510 | F: include/linux/amd-iommu.h | 510 | F: include/linux/amd-iommu.h |
511 | 511 | ||
512 | AMD MICROCODE UPDATE SUPPORT | 512 | AMD MICROCODE UPDATE SUPPORT |
513 | M: Andreas Herrmann <andreas.herrmann3@amd.com> | 513 | M: Andreas Herrmann <andreas.herrmann3@amd.com> |
514 | L: amd64-microcode@amd64.org | 514 | L: amd64-microcode@amd64.org |
515 | S: Supported | 515 | S: Supported |
516 | F: arch/x86/kernel/microcode_amd.c | 516 | F: arch/x86/kernel/microcode_amd.c |
517 | 517 | ||
518 | AMS (Apple Motion Sensor) DRIVER | 518 | AMS (Apple Motion Sensor) DRIVER |
519 | M: Michael Hanselmann <linux-kernel@hansmi.ch> | 519 | M: Michael Hanselmann <linux-kernel@hansmi.ch> |
520 | S: Supported | 520 | S: Supported |
521 | F: drivers/macintosh/ams/ | 521 | F: drivers/macintosh/ams/ |
522 | 522 | ||
523 | AMSO1100 RNIC DRIVER | 523 | AMSO1100 RNIC DRIVER |
524 | M: Tom Tucker <tom@opengridcomputing.com> | 524 | M: Tom Tucker <tom@opengridcomputing.com> |
525 | M: Steve Wise <swise@opengridcomputing.com> | 525 | M: Steve Wise <swise@opengridcomputing.com> |
526 | L: linux-rdma@vger.kernel.org | 526 | L: linux-rdma@vger.kernel.org |
527 | S: Maintained | 527 | S: Maintained |
528 | F: drivers/infiniband/hw/amso1100/ | 528 | F: drivers/infiniband/hw/amso1100/ |
529 | 529 | ||
530 | ANALOG DEVICES INC ASOC CODEC DRIVERS | 530 | ANALOG DEVICES INC ASOC CODEC DRIVERS |
531 | M: Lars-Peter Clausen <lars@metafoo.de> | 531 | M: Lars-Peter Clausen <lars@metafoo.de> |
532 | L: device-drivers-devel@blackfin.uclinux.org | 532 | L: device-drivers-devel@blackfin.uclinux.org |
533 | L: alsa-devel@alsa-project.org (moderated for non-subscribers) | 533 | L: alsa-devel@alsa-project.org (moderated for non-subscribers) |
534 | W: http://wiki.analog.com/ | 534 | W: http://wiki.analog.com/ |
535 | S: Supported | 535 | S: Supported |
536 | F: sound/soc/codecs/adau* | 536 | F: sound/soc/codecs/adau* |
537 | F: sound/soc/codecs/adav* | 537 | F: sound/soc/codecs/adav* |
538 | F: sound/soc/codecs/ad1* | 538 | F: sound/soc/codecs/ad1* |
539 | F: sound/soc/codecs/ssm* | 539 | F: sound/soc/codecs/ssm* |
540 | F: sound/soc/codecs/sigmadsp.* | 540 | F: sound/soc/codecs/sigmadsp.* |
541 | 541 | ||
542 | ANALOG DEVICES INC ASOC DRIVERS | 542 | ANALOG DEVICES INC ASOC DRIVERS |
543 | L: uclinux-dist-devel@blackfin.uclinux.org | 543 | L: uclinux-dist-devel@blackfin.uclinux.org |
544 | L: alsa-devel@alsa-project.org (moderated for non-subscribers) | 544 | L: alsa-devel@alsa-project.org (moderated for non-subscribers) |
545 | W: http://blackfin.uclinux.org/ | 545 | W: http://blackfin.uclinux.org/ |
546 | S: Supported | 546 | S: Supported |
547 | F: sound/soc/blackfin/* | 547 | F: sound/soc/blackfin/* |
548 | 548 | ||
549 | AOA (Apple Onboard Audio) ALSA DRIVER | 549 | AOA (Apple Onboard Audio) ALSA DRIVER |
550 | M: Johannes Berg <johannes@sipsolutions.net> | 550 | M: Johannes Berg <johannes@sipsolutions.net> |
551 | L: linuxppc-dev@lists.ozlabs.org | 551 | L: linuxppc-dev@lists.ozlabs.org |
552 | L: alsa-devel@alsa-project.org (moderated for non-subscribers) | 552 | L: alsa-devel@alsa-project.org (moderated for non-subscribers) |
553 | S: Maintained | 553 | S: Maintained |
554 | F: sound/aoa/ | 554 | F: sound/aoa/ |
555 | 555 | ||
556 | APM DRIVER | 556 | APM DRIVER |
557 | M: Jiri Kosina <jkosina@suse.cz> | 557 | M: Jiri Kosina <jkosina@suse.cz> |
558 | S: Odd fixes | 558 | S: Odd fixes |
559 | F: arch/x86/kernel/apm_32.c | 559 | F: arch/x86/kernel/apm_32.c |
560 | F: include/linux/apm_bios.h | 560 | F: include/linux/apm_bios.h |
561 | F: drivers/char/apm-emulation.c | 561 | F: drivers/char/apm-emulation.c |
562 | 562 | ||
563 | APPLE BCM5974 MULTITOUCH DRIVER | 563 | APPLE BCM5974 MULTITOUCH DRIVER |
564 | M: Henrik Rydberg <rydberg@euromail.se> | 564 | M: Henrik Rydberg <rydberg@euromail.se> |
565 | L: linux-input@vger.kernel.org | 565 | L: linux-input@vger.kernel.org |
566 | S: Maintained | 566 | S: Maintained |
567 | F: drivers/input/mouse/bcm5974.c | 567 | F: drivers/input/mouse/bcm5974.c |
568 | 568 | ||
569 | APPLE SMC DRIVER | 569 | APPLE SMC DRIVER |
570 | M: Henrik Rydberg <rydberg@euromail.se> | 570 | M: Henrik Rydberg <rydberg@euromail.se> |
571 | L: lm-sensors@lm-sensors.org | 571 | L: lm-sensors@lm-sensors.org |
572 | S: Maintained | 572 | S: Maintained |
573 | F: drivers/hwmon/applesmc.c | 573 | F: drivers/hwmon/applesmc.c |
574 | 574 | ||
575 | APPLETALK NETWORK LAYER | 575 | APPLETALK NETWORK LAYER |
576 | M: Arnaldo Carvalho de Melo <acme@ghostprotocols.net> | 576 | M: Arnaldo Carvalho de Melo <acme@ghostprotocols.net> |
577 | S: Maintained | 577 | S: Maintained |
578 | F: drivers/net/appletalk/ | 578 | F: drivers/net/appletalk/ |
579 | F: net/appletalk/ | 579 | F: net/appletalk/ |
580 | 580 | ||
581 | ARASAN COMPACT FLASH PATA CONTROLLER | 581 | ARASAN COMPACT FLASH PATA CONTROLLER |
582 | M: Viresh Kumar <viresh.kumar@st.com> | 582 | M: Viresh Kumar <viresh.kumar@st.com> |
583 | L: linux-ide@vger.kernel.org | 583 | L: linux-ide@vger.kernel.org |
584 | S: Maintained | 584 | S: Maintained |
585 | F: include/linux/pata_arasan_cf_data.h | 585 | F: include/linux/pata_arasan_cf_data.h |
586 | F: drivers/ata/pata_arasan_cf.c | 586 | F: drivers/ata/pata_arasan_cf.c |
587 | 587 | ||
588 | ARC FRAMEBUFFER DRIVER | 588 | ARC FRAMEBUFFER DRIVER |
589 | M: Jaya Kumar <jayalk@intworks.biz> | 589 | M: Jaya Kumar <jayalk@intworks.biz> |
590 | S: Maintained | 590 | S: Maintained |
591 | F: drivers/video/arcfb.c | 591 | F: drivers/video/arcfb.c |
592 | F: drivers/video/fb_defio.c | 592 | F: drivers/video/fb_defio.c |
593 | 593 | ||
594 | ARM MFM AND FLOPPY DRIVERS | 594 | ARM MFM AND FLOPPY DRIVERS |
595 | M: Ian Molton <spyro@f2s.com> | 595 | M: Ian Molton <spyro@f2s.com> |
596 | S: Maintained | 596 | S: Maintained |
597 | F: arch/arm/lib/floppydma.S | 597 | F: arch/arm/lib/floppydma.S |
598 | F: arch/arm/include/asm/floppy.h | 598 | F: arch/arm/include/asm/floppy.h |
599 | 599 | ||
600 | ARM PMU PROFILING AND DEBUGGING | 600 | ARM PMU PROFILING AND DEBUGGING |
601 | M: Will Deacon <will.deacon@arm.com> | 601 | M: Will Deacon <will.deacon@arm.com> |
602 | S: Maintained | 602 | S: Maintained |
603 | F: arch/arm/kernel/perf_event* | 603 | F: arch/arm/kernel/perf_event* |
604 | F: arch/arm/oprofile/common.c | 604 | F: arch/arm/oprofile/common.c |
605 | F: arch/arm/kernel/pmu.c | 605 | F: arch/arm/kernel/pmu.c |
606 | F: arch/arm/include/asm/pmu.h | 606 | F: arch/arm/include/asm/pmu.h |
607 | F: arch/arm/kernel/hw_breakpoint.c | 607 | F: arch/arm/kernel/hw_breakpoint.c |
608 | F: arch/arm/include/asm/hw_breakpoint.h | 608 | F: arch/arm/include/asm/hw_breakpoint.h |
609 | 609 | ||
610 | ARM PORT | 610 | ARM PORT |
611 | M: Russell King <linux@arm.linux.org.uk> | 611 | M: Russell King <linux@arm.linux.org.uk> |
612 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 612 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
613 | W: http://www.arm.linux.org.uk/ | 613 | W: http://www.arm.linux.org.uk/ |
614 | S: Maintained | 614 | S: Maintained |
615 | F: arch/arm/ | 615 | F: arch/arm/ |
616 | 616 | ||
617 | ARM PRIMECELL AACI PL041 DRIVER | 617 | ARM PRIMECELL AACI PL041 DRIVER |
618 | M: Russell King <linux@arm.linux.org.uk> | 618 | M: Russell King <linux@arm.linux.org.uk> |
619 | S: Maintained | 619 | S: Maintained |
620 | F: sound/arm/aaci.* | 620 | F: sound/arm/aaci.* |
621 | 621 | ||
622 | ARM PRIMECELL CLCD PL110 DRIVER | 622 | ARM PRIMECELL CLCD PL110 DRIVER |
623 | M: Russell King <linux@arm.linux.org.uk> | 623 | M: Russell King <linux@arm.linux.org.uk> |
624 | S: Maintained | 624 | S: Maintained |
625 | F: drivers/video/amba-clcd.* | 625 | F: drivers/video/amba-clcd.* |
626 | 626 | ||
627 | ARM PRIMECELL KMI PL050 DRIVER | 627 | ARM PRIMECELL KMI PL050 DRIVER |
628 | M: Russell King <linux@arm.linux.org.uk> | 628 | M: Russell King <linux@arm.linux.org.uk> |
629 | S: Maintained | 629 | S: Maintained |
630 | F: drivers/input/serio/ambakmi.* | 630 | F: drivers/input/serio/ambakmi.* |
631 | F: include/linux/amba/kmi.h | 631 | F: include/linux/amba/kmi.h |
632 | 632 | ||
633 | ARM PRIMECELL MMCI PL180/1 DRIVER | 633 | ARM PRIMECELL MMCI PL180/1 DRIVER |
634 | S: Orphan | 634 | S: Orphan |
635 | F: drivers/mmc/host/mmci.* | 635 | F: drivers/mmc/host/mmci.* |
636 | 636 | ||
637 | ARM PRIMECELL BUS SUPPORT | 637 | ARM PRIMECELL BUS SUPPORT |
638 | M: Russell King <linux@arm.linux.org.uk> | 638 | M: Russell King <linux@arm.linux.org.uk> |
639 | S: Maintained | 639 | S: Maintained |
640 | F: drivers/amba/ | 640 | F: drivers/amba/ |
641 | F: include/linux/amba/bus.h | 641 | F: include/linux/amba/bus.h |
642 | 642 | ||
643 | ARM/ADI ROADRUNNER MACHINE SUPPORT | 643 | ARM/ADI ROADRUNNER MACHINE SUPPORT |
644 | M: Lennert Buytenhek <kernel@wantstofly.org> | 644 | M: Lennert Buytenhek <kernel@wantstofly.org> |
645 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 645 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
646 | S: Maintained | 646 | S: Maintained |
647 | F: arch/arm/mach-ixp23xx/ | 647 | F: arch/arm/mach-ixp23xx/ |
648 | F: arch/arm/mach-ixp23xx/include/mach/ | 648 | F: arch/arm/mach-ixp23xx/include/mach/ |
649 | 649 | ||
650 | ARM/ADS SPHERE MACHINE SUPPORT | 650 | ARM/ADS SPHERE MACHINE SUPPORT |
651 | M: Lennert Buytenhek <kernel@wantstofly.org> | 651 | M: Lennert Buytenhek <kernel@wantstofly.org> |
652 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 652 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
653 | S: Maintained | 653 | S: Maintained |
654 | 654 | ||
655 | ARM/AFEB9260 MACHINE SUPPORT | 655 | ARM/AFEB9260 MACHINE SUPPORT |
656 | M: Sergey Lapin <slapin@ossfans.org> | 656 | M: Sergey Lapin <slapin@ossfans.org> |
657 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 657 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
658 | S: Maintained | 658 | S: Maintained |
659 | 659 | ||
660 | ARM/AJECO 1ARM MACHINE SUPPORT | 660 | ARM/AJECO 1ARM MACHINE SUPPORT |
661 | M: Lennert Buytenhek <kernel@wantstofly.org> | 661 | M: Lennert Buytenhek <kernel@wantstofly.org> |
662 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 662 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
663 | S: Maintained | 663 | S: Maintained |
664 | 664 | ||
665 | ARM/ATMEL AT91RM9200 AND AT91SAM ARM ARCHITECTURES | 665 | ARM/ATMEL AT91RM9200 AND AT91SAM ARM ARCHITECTURES |
666 | M: Andrew Victor <linux@maxim.org.za> | 666 | M: Andrew Victor <linux@maxim.org.za> |
667 | M: Nicolas Ferre <nicolas.ferre@atmel.com> | 667 | M: Nicolas Ferre <nicolas.ferre@atmel.com> |
668 | M: Jean-Christophe Plagniol-Villard <plagnioj@jcrosoft.com> | 668 | M: Jean-Christophe Plagniol-Villard <plagnioj@jcrosoft.com> |
669 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 669 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
670 | W: http://maxim.org.za/at91_26.html | 670 | W: http://maxim.org.za/at91_26.html |
671 | W: http://www.linux4sam.org | 671 | W: http://www.linux4sam.org |
672 | S: Supported | 672 | S: Supported |
673 | F: arch/arm/mach-at91/ | 673 | F: arch/arm/mach-at91/ |
674 | 674 | ||
675 | ARM/BCMRING ARM ARCHITECTURE | 675 | ARM/BCMRING ARM ARCHITECTURE |
676 | M: Jiandong Zheng <jdzheng@broadcom.com> | 676 | M: Jiandong Zheng <jdzheng@broadcom.com> |
677 | M: Scott Branden <sbranden@broadcom.com> | 677 | M: Scott Branden <sbranden@broadcom.com> |
678 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 678 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
679 | S: Maintained | 679 | S: Maintained |
680 | F: arch/arm/mach-bcmring | 680 | F: arch/arm/mach-bcmring |
681 | 681 | ||
682 | ARM/BCMRING MTD NAND DRIVER | 682 | ARM/BCMRING MTD NAND DRIVER |
683 | M: Jiandong Zheng <jdzheng@broadcom.com> | 683 | M: Jiandong Zheng <jdzheng@broadcom.com> |
684 | M: Scott Branden <sbranden@broadcom.com> | 684 | M: Scott Branden <sbranden@broadcom.com> |
685 | L: linux-mtd@lists.infradead.org | 685 | L: linux-mtd@lists.infradead.org |
686 | S: Maintained | 686 | S: Maintained |
687 | F: drivers/mtd/nand/bcm_umi_nand.c | 687 | F: drivers/mtd/nand/bcm_umi_nand.c |
688 | F: drivers/mtd/nand/bcm_umi_bch.c | 688 | F: drivers/mtd/nand/bcm_umi_bch.c |
689 | F: drivers/mtd/nand/nand_bcm_umi.h | 689 | F: drivers/mtd/nand/nand_bcm_umi.h |
690 | 690 | ||
691 | ARM/CALXEDA HIGHBANK ARCHITECTURE | 691 | ARM/CALXEDA HIGHBANK ARCHITECTURE |
692 | M: Rob Herring <rob.herring@calxeda.com> | 692 | M: Rob Herring <rob.herring@calxeda.com> |
693 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 693 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
694 | S: Maintained | 694 | S: Maintained |
695 | F: arch/arm/mach-highbank/ | 695 | F: arch/arm/mach-highbank/ |
696 | 696 | ||
697 | ARM/CAVIUM NETWORKS CNS3XXX MACHINE SUPPORT | 697 | ARM/CAVIUM NETWORKS CNS3XXX MACHINE SUPPORT |
698 | M: Anton Vorontsov <avorontsov@mvista.com> | 698 | M: Anton Vorontsov <avorontsov@mvista.com> |
699 | S: Maintained | 699 | S: Maintained |
700 | F: arch/arm/mach-cns3xxx/ | 700 | F: arch/arm/mach-cns3xxx/ |
701 | T: git git://git.infradead.org/users/cbou/linux-cns3xxx.git | 701 | T: git git://git.infradead.org/users/cbou/linux-cns3xxx.git |
702 | 702 | ||
703 | ARM/CIRRUS LOGIC EP93XX ARM ARCHITECTURE | 703 | ARM/CIRRUS LOGIC EP93XX ARM ARCHITECTURE |
704 | M: Hartley Sweeten <hsweeten@visionengravers.com> | 704 | M: Hartley Sweeten <hsweeten@visionengravers.com> |
705 | M: Ryan Mallon <rmallon@gmail.com> | 705 | M: Ryan Mallon <rmallon@gmail.com> |
706 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 706 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
707 | S: Maintained | 707 | S: Maintained |
708 | F: arch/arm/mach-ep93xx/ | 708 | F: arch/arm/mach-ep93xx/ |
709 | F: arch/arm/mach-ep93xx/include/mach/ | 709 | F: arch/arm/mach-ep93xx/include/mach/ |
710 | 710 | ||
711 | ARM/CIRRUS LOGIC EDB9315A MACHINE SUPPORT | 711 | ARM/CIRRUS LOGIC EDB9315A MACHINE SUPPORT |
712 | M: Lennert Buytenhek <kernel@wantstofly.org> | 712 | M: Lennert Buytenhek <kernel@wantstofly.org> |
713 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 713 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
714 | S: Maintained | 714 | S: Maintained |
715 | 715 | ||
716 | ARM/CLKDEV SUPPORT | 716 | ARM/CLKDEV SUPPORT |
717 | M: Russell King <linux@arm.linux.org.uk> | 717 | M: Russell King <linux@arm.linux.org.uk> |
718 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 718 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
719 | F: arch/arm/include/asm/clkdev.h | 719 | F: arch/arm/include/asm/clkdev.h |
720 | F: drivers/clk/clkdev.c | 720 | F: drivers/clk/clkdev.c |
721 | 721 | ||
722 | ARM/COMPULAB CM-X270/EM-X270 and CM-X300 MACHINE SUPPORT | 722 | ARM/COMPULAB CM-X270/EM-X270 and CM-X300 MACHINE SUPPORT |
723 | M: Mike Rapoport <mike@compulab.co.il> | 723 | M: Mike Rapoport <mike@compulab.co.il> |
724 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 724 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
725 | S: Maintained | 725 | S: Maintained |
726 | 726 | ||
727 | ARM/CONTEC MICRO9 MACHINE SUPPORT | 727 | ARM/CONTEC MICRO9 MACHINE SUPPORT |
728 | M: Hubert Feurstein <hubert.feurstein@contec.at> | 728 | M: Hubert Feurstein <hubert.feurstein@contec.at> |
729 | S: Maintained | 729 | S: Maintained |
730 | F: arch/arm/mach-ep93xx/micro9.c | 730 | F: arch/arm/mach-ep93xx/micro9.c |
731 | 731 | ||
732 | ARM/CORGI MACHINE SUPPORT | 732 | ARM/CORGI MACHINE SUPPORT |
733 | M: Richard Purdie <rpurdie@rpsys.net> | 733 | M: Richard Purdie <rpurdie@rpsys.net> |
734 | S: Maintained | 734 | S: Maintained |
735 | 735 | ||
736 | ARM/CORTINA SYSTEMS GEMINI ARM ARCHITECTURE | 736 | ARM/CORTINA SYSTEMS GEMINI ARM ARCHITECTURE |
737 | M: Hans Ulli Kroll <ulli.kroll@googlemail.com> | 737 | M: Hans Ulli Kroll <ulli.kroll@googlemail.com> |
738 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 738 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
739 | T: git git://git.berlios.de/gemini-board | 739 | T: git git://git.berlios.de/gemini-board |
740 | S: Maintained | 740 | S: Maintained |
741 | F: arch/arm/mach-gemini/ | 741 | F: arch/arm/mach-gemini/ |
742 | 742 | ||
743 | ARM/CSR SIRFPRIMA2 MACHINE SUPPORT | 743 | ARM/CSR SIRFPRIMA2 MACHINE SUPPORT |
744 | M: Barry Song <baohua.song@csr.com> | 744 | M: Barry Song <baohua.song@csr.com> |
745 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 745 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
746 | S: Maintained | 746 | S: Maintained |
747 | F: arch/arm/mach-prima2/ | 747 | F: arch/arm/mach-prima2/ |
748 | F: drivers/dma/sirf-dma* | 748 | F: drivers/dma/sirf-dma* |
749 | 749 | ||
750 | ARM/EBSA110 MACHINE SUPPORT | 750 | ARM/EBSA110 MACHINE SUPPORT |
751 | M: Russell King <linux@arm.linux.org.uk> | 751 | M: Russell King <linux@arm.linux.org.uk> |
752 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 752 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
753 | W: http://www.arm.linux.org.uk/ | 753 | W: http://www.arm.linux.org.uk/ |
754 | S: Maintained | 754 | S: Maintained |
755 | F: arch/arm/mach-ebsa110/ | 755 | F: arch/arm/mach-ebsa110/ |
756 | F: drivers/net/ethernet/amd/am79c961a.* | 756 | F: drivers/net/ethernet/amd/am79c961a.* |
757 | 757 | ||
758 | ARM/EZX SMARTPHONES (A780, A910, A1200, E680, ROKR E2 and ROKR E6) | 758 | ARM/EZX SMARTPHONES (A780, A910, A1200, E680, ROKR E2 and ROKR E6) |
759 | M: Daniel Ribeiro <drwyrm@gmail.com> | 759 | M: Daniel Ribeiro <drwyrm@gmail.com> |
760 | M: Stefan Schmidt <stefan@openezx.org> | 760 | M: Stefan Schmidt <stefan@openezx.org> |
761 | M: Harald Welte <laforge@openezx.org> | 761 | M: Harald Welte <laforge@openezx.org> |
762 | L: openezx-devel@lists.openezx.org (moderated for non-subscribers) | 762 | L: openezx-devel@lists.openezx.org (moderated for non-subscribers) |
763 | W: http://www.openezx.org/ | 763 | W: http://www.openezx.org/ |
764 | S: Maintained | 764 | S: Maintained |
765 | T: topgit git://git.openezx.org/openezx.git | 765 | T: topgit git://git.openezx.org/openezx.git |
766 | F: arch/arm/mach-pxa/ezx.c | 766 | F: arch/arm/mach-pxa/ezx.c |
767 | 767 | ||
768 | ARM/FARADAY FA526 PORT | 768 | ARM/FARADAY FA526 PORT |
769 | M: Hans Ulli Kroll <ulli.kroll@googlemail.com> | 769 | M: Hans Ulli Kroll <ulli.kroll@googlemail.com> |
770 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 770 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
771 | S: Maintained | 771 | S: Maintained |
772 | T: git git://git.berlios.de/gemini-board | 772 | T: git git://git.berlios.de/gemini-board |
773 | F: arch/arm/mm/*-fa* | 773 | F: arch/arm/mm/*-fa* |
774 | 774 | ||
775 | ARM/FOOTBRIDGE ARCHITECTURE | 775 | ARM/FOOTBRIDGE ARCHITECTURE |
776 | M: Russell King <linux@arm.linux.org.uk> | 776 | M: Russell King <linux@arm.linux.org.uk> |
777 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 777 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
778 | W: http://www.arm.linux.org.uk/ | 778 | W: http://www.arm.linux.org.uk/ |
779 | S: Maintained | 779 | S: Maintained |
780 | F: arch/arm/include/asm/hardware/dec21285.h | 780 | F: arch/arm/include/asm/hardware/dec21285.h |
781 | F: arch/arm/mach-footbridge/ | 781 | F: arch/arm/mach-footbridge/ |
782 | 782 | ||
783 | ARM/FREESCALE IMX / MXC ARM ARCHITECTURE | 783 | ARM/FREESCALE IMX / MXC ARM ARCHITECTURE |
784 | M: Sascha Hauer <kernel@pengutronix.de> | 784 | M: Sascha Hauer <kernel@pengutronix.de> |
785 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 785 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
786 | S: Maintained | 786 | S: Maintained |
787 | T: git git://git.pengutronix.de/git/imx/linux-2.6.git | 787 | T: git git://git.pengutronix.de/git/imx/linux-2.6.git |
788 | F: arch/arm/mach-mx*/ | 788 | F: arch/arm/mach-mx*/ |
789 | F: arch/arm/mach-imx/ | 789 | F: arch/arm/mach-imx/ |
790 | F: arch/arm/plat-mxc/ | 790 | F: arch/arm/plat-mxc/ |
791 | 791 | ||
792 | ARM/FREESCALE IMX6 | 792 | ARM/FREESCALE IMX6 |
793 | M: Shawn Guo <shawn.guo@linaro.org> | 793 | M: Shawn Guo <shawn.guo@linaro.org> |
794 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 794 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
795 | S: Maintained | 795 | S: Maintained |
796 | T: git git://git.linaro.org/people/shawnguo/linux-2.6.git | 796 | T: git git://git.linaro.org/people/shawnguo/linux-2.6.git |
797 | F: arch/arm/mach-imx/*imx6* | 797 | F: arch/arm/mach-imx/*imx6* |
798 | 798 | ||
799 | ARM/FREESCALE MXS ARM ARCHITECTURE | 799 | ARM/FREESCALE MXS ARM ARCHITECTURE |
800 | M: Shawn Guo <shawn.guo@linaro.org> | 800 | M: Shawn Guo <shawn.guo@linaro.org> |
801 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 801 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
802 | S: Maintained | 802 | S: Maintained |
803 | T: git git://git.linaro.org/people/shawnguo/linux-2.6.git | 803 | T: git git://git.linaro.org/people/shawnguo/linux-2.6.git |
804 | F: arch/arm/mach-mxs/ | 804 | F: arch/arm/mach-mxs/ |
805 | 805 | ||
806 | ARM/GLOMATION GESBC9312SX MACHINE SUPPORT | 806 | ARM/GLOMATION GESBC9312SX MACHINE SUPPORT |
807 | M: Lennert Buytenhek <kernel@wantstofly.org> | 807 | M: Lennert Buytenhek <kernel@wantstofly.org> |
808 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 808 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
809 | S: Maintained | 809 | S: Maintained |
810 | 810 | ||
811 | ARM/GUMSTIX MACHINE SUPPORT | 811 | ARM/GUMSTIX MACHINE SUPPORT |
812 | M: Steve Sakoman <sakoman@gmail.com> | 812 | M: Steve Sakoman <sakoman@gmail.com> |
813 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 813 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
814 | S: Maintained | 814 | S: Maintained |
815 | 815 | ||
816 | ARM/H4700 (HP IPAQ HX4700) MACHINE SUPPORT | 816 | ARM/H4700 (HP IPAQ HX4700) MACHINE SUPPORT |
817 | M: Philipp Zabel <philipp.zabel@gmail.com> | 817 | M: Philipp Zabel <philipp.zabel@gmail.com> |
818 | S: Maintained | 818 | S: Maintained |
819 | F: arch/arm/mach-pxa/hx4700.c | 819 | F: arch/arm/mach-pxa/hx4700.c |
820 | F: arch/arm/mach-pxa/include/mach/hx4700.h | 820 | F: arch/arm/mach-pxa/include/mach/hx4700.h |
821 | 821 | ||
822 | ARM/HP JORNADA 7XX MACHINE SUPPORT | 822 | ARM/HP JORNADA 7XX MACHINE SUPPORT |
823 | M: Kristoffer Ericson <kristoffer.ericson@gmail.com> | 823 | M: Kristoffer Ericson <kristoffer.ericson@gmail.com> |
824 | W: www.jlime.com | 824 | W: www.jlime.com |
825 | S: Maintained | 825 | S: Maintained |
826 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/kristoffer/linux-hpc.git | 826 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/kristoffer/linux-hpc.git |
827 | F: arch/arm/mach-sa1100/jornada720.c | 827 | F: arch/arm/mach-sa1100/jornada720.c |
828 | F: arch/arm/mach-sa1100/include/mach/jornada720.h | 828 | F: arch/arm/mach-sa1100/include/mach/jornada720.h |
829 | 829 | ||
830 | ARM/INCOME PXA270 SUPPORT | 830 | ARM/INCOME PXA270 SUPPORT |
831 | M: Marek Vasut <marek.vasut@gmail.com> | 831 | M: Marek Vasut <marek.vasut@gmail.com> |
832 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 832 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
833 | S: Maintained | 833 | S: Maintained |
834 | F: arch/arm/mach-pxa/colibri-pxa270-income.c | 834 | F: arch/arm/mach-pxa/colibri-pxa270-income.c |
835 | 835 | ||
836 | ARM/INTEL IOP32X ARM ARCHITECTURE | 836 | ARM/INTEL IOP32X ARM ARCHITECTURE |
837 | M: Lennert Buytenhek <kernel@wantstofly.org> | 837 | M: Lennert Buytenhek <kernel@wantstofly.org> |
838 | M: Dan Williams <dan.j.williams@intel.com> | 838 | M: Dan Williams <dan.j.williams@intel.com> |
839 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 839 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
840 | S: Maintained | 840 | S: Maintained |
841 | 841 | ||
842 | ARM/INTEL IOP33X ARM ARCHITECTURE | 842 | ARM/INTEL IOP33X ARM ARCHITECTURE |
843 | M: Dan Williams <dan.j.williams@intel.com> | 843 | M: Dan Williams <dan.j.williams@intel.com> |
844 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 844 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
845 | S: Maintained | 845 | S: Maintained |
846 | 846 | ||
847 | ARM/INTEL IOP13XX ARM ARCHITECTURE | 847 | ARM/INTEL IOP13XX ARM ARCHITECTURE |
848 | M: Lennert Buytenhek <kernel@wantstofly.org> | 848 | M: Lennert Buytenhek <kernel@wantstofly.org> |
849 | M: Dan Williams <dan.j.williams@intel.com> | 849 | M: Dan Williams <dan.j.williams@intel.com> |
850 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 850 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
851 | S: Maintained | 851 | S: Maintained |
852 | 852 | ||
853 | ARM/INTEL IQ81342EX MACHINE SUPPORT | 853 | ARM/INTEL IQ81342EX MACHINE SUPPORT |
854 | M: Lennert Buytenhek <kernel@wantstofly.org> | 854 | M: Lennert Buytenhek <kernel@wantstofly.org> |
855 | M: Dan Williams <dan.j.williams@intel.com> | 855 | M: Dan Williams <dan.j.williams@intel.com> |
856 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 856 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
857 | S: Maintained | 857 | S: Maintained |
858 | 858 | ||
859 | ARM/INTEL IXP2000 ARM ARCHITECTURE | 859 | ARM/INTEL IXP2000 ARM ARCHITECTURE |
860 | M: Lennert Buytenhek <kernel@wantstofly.org> | 860 | M: Lennert Buytenhek <kernel@wantstofly.org> |
861 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 861 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
862 | S: Maintained | 862 | S: Maintained |
863 | 863 | ||
864 | ARM/INTEL IXDP2850 MACHINE SUPPORT | 864 | ARM/INTEL IXDP2850 MACHINE SUPPORT |
865 | M: Lennert Buytenhek <kernel@wantstofly.org> | 865 | M: Lennert Buytenhek <kernel@wantstofly.org> |
866 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 866 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
867 | S: Maintained | 867 | S: Maintained |
868 | 868 | ||
869 | ARM/INTEL IXP23XX ARM ARCHITECTURE | 869 | ARM/INTEL IXP23XX ARM ARCHITECTURE |
870 | M: Lennert Buytenhek <kernel@wantstofly.org> | 870 | M: Lennert Buytenhek <kernel@wantstofly.org> |
871 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 871 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
872 | S: Maintained | 872 | S: Maintained |
873 | 873 | ||
874 | ARM/INTEL IXP4XX ARM ARCHITECTURE | 874 | ARM/INTEL IXP4XX ARM ARCHITECTURE |
875 | M: Imre Kaloz <kaloz@openwrt.org> | 875 | M: Imre Kaloz <kaloz@openwrt.org> |
876 | M: Krzysztof Halasa <khc@pm.waw.pl> | 876 | M: Krzysztof Halasa <khc@pm.waw.pl> |
877 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 877 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
878 | S: Maintained | 878 | S: Maintained |
879 | F: arch/arm/mach-ixp4xx/ | 879 | F: arch/arm/mach-ixp4xx/ |
880 | 880 | ||
881 | ARM/INTEL RESEARCH IMOTE/STARGATE 2 MACHINE SUPPORT | 881 | ARM/INTEL RESEARCH IMOTE/STARGATE 2 MACHINE SUPPORT |
882 | M: Jonathan Cameron <jic23@cam.ac.uk> | 882 | M: Jonathan Cameron <jic23@cam.ac.uk> |
883 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 883 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
884 | S: Maintained | 884 | S: Maintained |
885 | F: arch/arm/mach-pxa/stargate2.c | 885 | F: arch/arm/mach-pxa/stargate2.c |
886 | F: drivers/pcmcia/pxa2xx_stargate2.c | 886 | F: drivers/pcmcia/pxa2xx_stargate2.c |
887 | 887 | ||
888 | ARM/INTEL XSC3 (MANZANO) ARM CORE | 888 | ARM/INTEL XSC3 (MANZANO) ARM CORE |
889 | M: Lennert Buytenhek <kernel@wantstofly.org> | 889 | M: Lennert Buytenhek <kernel@wantstofly.org> |
890 | M: Dan Williams <dan.j.williams@intel.com> | 890 | M: Dan Williams <dan.j.williams@intel.com> |
891 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 891 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
892 | S: Maintained | 892 | S: Maintained |
893 | 893 | ||
894 | ARM/IP FABRICS DOUBLE ESPRESSO MACHINE SUPPORT | 894 | ARM/IP FABRICS DOUBLE ESPRESSO MACHINE SUPPORT |
895 | M: Lennert Buytenhek <kernel@wantstofly.org> | 895 | M: Lennert Buytenhek <kernel@wantstofly.org> |
896 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 896 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
897 | S: Maintained | 897 | S: Maintained |
898 | 898 | ||
899 | ARM/LOGICPD PXA270 MACHINE SUPPORT | 899 | ARM/LOGICPD PXA270 MACHINE SUPPORT |
900 | M: Lennert Buytenhek <kernel@wantstofly.org> | 900 | M: Lennert Buytenhek <kernel@wantstofly.org> |
901 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 901 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
902 | S: Maintained | 902 | S: Maintained |
903 | 903 | ||
904 | ARM/MAGICIAN MACHINE SUPPORT | 904 | ARM/MAGICIAN MACHINE SUPPORT |
905 | M: Philipp Zabel <philipp.zabel@gmail.com> | 905 | M: Philipp Zabel <philipp.zabel@gmail.com> |
906 | S: Maintained | 906 | S: Maintained |
907 | 907 | ||
908 | ARM/Marvell Loki/Kirkwood/MV78xx0/Orion SOC support | 908 | ARM/Marvell Loki/Kirkwood/MV78xx0/Orion SOC support |
909 | M: Lennert Buytenhek <kernel@wantstofly.org> | 909 | M: Lennert Buytenhek <kernel@wantstofly.org> |
910 | M: Nicolas Pitre <nico@fluxnic.net> | 910 | M: Nicolas Pitre <nico@fluxnic.net> |
911 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 911 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
912 | S: Odd Fixes | 912 | S: Odd Fixes |
913 | F: arch/arm/mach-kirkwood/ | 913 | F: arch/arm/mach-kirkwood/ |
914 | F: arch/arm/mach-mv78xx0/ | 914 | F: arch/arm/mach-mv78xx0/ |
915 | F: arch/arm/mach-orion5x/ | 915 | F: arch/arm/mach-orion5x/ |
916 | F: arch/arm/plat-orion/ | 916 | F: arch/arm/plat-orion/ |
917 | 917 | ||
918 | ARM/Orion SoC/Technologic Systems TS-78xx platform support | 918 | ARM/Orion SoC/Technologic Systems TS-78xx platform support |
919 | M: Alexander Clouter <alex@digriz.org.uk> | 919 | M: Alexander Clouter <alex@digriz.org.uk> |
920 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 920 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
921 | W: http://www.digriz.org.uk/ts78xx/kernel | 921 | W: http://www.digriz.org.uk/ts78xx/kernel |
922 | S: Maintained | 922 | S: Maintained |
923 | F: arch/arm/mach-orion5x/ts78xx-* | 923 | F: arch/arm/mach-orion5x/ts78xx-* |
924 | 924 | ||
925 | ARM/MIOA701 MACHINE SUPPORT | 925 | ARM/MIOA701 MACHINE SUPPORT |
926 | M: Robert Jarzmik <robert.jarzmik@free.fr> | 926 | M: Robert Jarzmik <robert.jarzmik@free.fr> |
927 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 927 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
928 | F: arch/arm/mach-pxa/mioa701.c | 928 | F: arch/arm/mach-pxa/mioa701.c |
929 | S: Maintained | 929 | S: Maintained |
930 | 930 | ||
931 | ARM/NEC MOBILEPRO 900/c MACHINE SUPPORT | 931 | ARM/NEC MOBILEPRO 900/c MACHINE SUPPORT |
932 | M: Michael Petchkovsky <mkpetch@internode.on.net> | 932 | M: Michael Petchkovsky <mkpetch@internode.on.net> |
933 | S: Maintained | 933 | S: Maintained |
934 | 934 | ||
935 | ARM/NOMADIK ARCHITECTURE | 935 | ARM/NOMADIK ARCHITECTURE |
936 | M: Alessandro Rubini <rubini@unipv.it> | 936 | M: Alessandro Rubini <rubini@unipv.it> |
937 | M: Linus Walleij <linus.walleij@stericsson.com> | 937 | M: Linus Walleij <linus.walleij@stericsson.com> |
938 | M: STEricsson <STEricsson_nomadik_linux@list.st.com> | 938 | M: STEricsson <STEricsson_nomadik_linux@list.st.com> |
939 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 939 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
940 | S: Maintained | 940 | S: Maintained |
941 | F: arch/arm/mach-nomadik/ | 941 | F: arch/arm/mach-nomadik/ |
942 | F: arch/arm/plat-nomadik/ | 942 | F: arch/arm/plat-nomadik/ |
943 | F: drivers/i2c/busses/i2c-nomadik.c | 943 | F: drivers/i2c/busses/i2c-nomadik.c |
944 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-stericsson.git | 944 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-stericsson.git |
945 | 945 | ||
946 | ARM/OPENMOKO NEO FREERUNNER (GTA02) MACHINE SUPPORT | 946 | ARM/OPENMOKO NEO FREERUNNER (GTA02) MACHINE SUPPORT |
947 | M: Nelson Castillo <arhuaco@freaks-unidos.net> | 947 | M: Nelson Castillo <arhuaco@freaks-unidos.net> |
948 | L: openmoko-kernel@lists.openmoko.org (subscribers-only) | 948 | L: openmoko-kernel@lists.openmoko.org (subscribers-only) |
949 | W: http://wiki.openmoko.org/wiki/Neo_FreeRunner | 949 | W: http://wiki.openmoko.org/wiki/Neo_FreeRunner |
950 | S: Supported | 950 | S: Supported |
951 | 951 | ||
952 | ARM/QUALCOMM MSM MACHINE SUPPORT | 952 | ARM/QUALCOMM MSM MACHINE SUPPORT |
953 | M: David Brown <davidb@codeaurora.org> | 953 | M: David Brown <davidb@codeaurora.org> |
954 | M: Daniel Walker <dwalker@fifo99.com> | 954 | M: Daniel Walker <dwalker@fifo99.com> |
955 | M: Bryan Huntsman <bryanh@codeaurora.org> | 955 | M: Bryan Huntsman <bryanh@codeaurora.org> |
956 | L: linux-arm-msm@vger.kernel.org | 956 | L: linux-arm-msm@vger.kernel.org |
957 | F: arch/arm/mach-msm/ | 957 | F: arch/arm/mach-msm/ |
958 | F: drivers/video/msm/ | 958 | F: drivers/video/msm/ |
959 | F: drivers/mmc/host/msm_sdcc.c | 959 | F: drivers/mmc/host/msm_sdcc.c |
960 | F: drivers/mmc/host/msm_sdcc.h | 960 | F: drivers/mmc/host/msm_sdcc.h |
961 | F: drivers/tty/serial/msm_serial.h | 961 | F: drivers/tty/serial/msm_serial.h |
962 | F: drivers/tty/serial/msm_serial.c | 962 | F: drivers/tty/serial/msm_serial.c |
963 | F: drivers/platform/msm/ | 963 | F: drivers/platform/msm/ |
964 | F: drivers/*/pm8???-* | 964 | F: drivers/*/pm8???-* |
965 | F: include/linux/mfd/pm8xxx/ | 965 | F: include/linux/mfd/pm8xxx/ |
966 | T: git git://codeaurora.org/quic/kernel/davidb/linux-msm.git | 966 | T: git git://codeaurora.org/quic/kernel/davidb/linux-msm.git |
967 | S: Maintained | 967 | S: Maintained |
968 | 968 | ||
969 | ARM/TOSA MACHINE SUPPORT | 969 | ARM/TOSA MACHINE SUPPORT |
970 | M: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com> | 970 | M: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com> |
971 | M: Dirk Opfer <dirk@opfer-online.de> | 971 | M: Dirk Opfer <dirk@opfer-online.de> |
972 | S: Maintained | 972 | S: Maintained |
973 | 973 | ||
974 | ARM/PALMTX,PALMT5,PALMLD,PALMTE2,PALMTC SUPPORT | 974 | ARM/PALMTX,PALMT5,PALMLD,PALMTE2,PALMTC SUPPORT |
975 | M: Marek Vasut <marek.vasut@gmail.com> | 975 | M: Marek Vasut <marek.vasut@gmail.com> |
976 | L: linux-arm-kernel@lists.infradead.org | 976 | L: linux-arm-kernel@lists.infradead.org |
977 | W: http://hackndev.com | 977 | W: http://hackndev.com |
978 | S: Maintained | 978 | S: Maintained |
979 | F: arch/arm/mach-pxa/include/mach/palmtx.h | 979 | F: arch/arm/mach-pxa/include/mach/palmtx.h |
980 | F: arch/arm/mach-pxa/palmtx.c | 980 | F: arch/arm/mach-pxa/palmtx.c |
981 | F: arch/arm/mach-pxa/include/mach/palmt5.h | 981 | F: arch/arm/mach-pxa/include/mach/palmt5.h |
982 | F: arch/arm/mach-pxa/palmt5.c | 982 | F: arch/arm/mach-pxa/palmt5.c |
983 | F: arch/arm/mach-pxa/include/mach/palmld.h | 983 | F: arch/arm/mach-pxa/include/mach/palmld.h |
984 | F: arch/arm/mach-pxa/palmld.c | 984 | F: arch/arm/mach-pxa/palmld.c |
985 | F: arch/arm/mach-pxa/include/mach/palmte2.h | 985 | F: arch/arm/mach-pxa/include/mach/palmte2.h |
986 | F: arch/arm/mach-pxa/palmte2.c | 986 | F: arch/arm/mach-pxa/palmte2.c |
987 | F: arch/arm/mach-pxa/include/mach/palmtc.h | 987 | F: arch/arm/mach-pxa/include/mach/palmtc.h |
988 | F: arch/arm/mach-pxa/palmtc.c | 988 | F: arch/arm/mach-pxa/palmtc.c |
989 | 989 | ||
990 | ARM/PALM TREO SUPPORT | 990 | ARM/PALM TREO SUPPORT |
991 | M: Tomas Cech <sleep_walker@suse.cz> | 991 | M: Tomas Cech <sleep_walker@suse.cz> |
992 | L: linux-arm-kernel@lists.infradead.org | 992 | L: linux-arm-kernel@lists.infradead.org |
993 | W: http://hackndev.com | 993 | W: http://hackndev.com |
994 | S: Maintained | 994 | S: Maintained |
995 | F: arch/arm/mach-pxa/include/mach/palmtreo.h | 995 | F: arch/arm/mach-pxa/include/mach/palmtreo.h |
996 | F: arch/arm/mach-pxa/palmtreo.c | 996 | F: arch/arm/mach-pxa/palmtreo.c |
997 | 997 | ||
998 | ARM/PALMZ72 SUPPORT | 998 | ARM/PALMZ72 SUPPORT |
999 | M: Sergey Lapin <slapin@ossfans.org> | 999 | M: Sergey Lapin <slapin@ossfans.org> |
1000 | L: linux-arm-kernel@lists.infradead.org | 1000 | L: linux-arm-kernel@lists.infradead.org |
1001 | W: http://hackndev.com | 1001 | W: http://hackndev.com |
1002 | S: Maintained | 1002 | S: Maintained |
1003 | F: arch/arm/mach-pxa/include/mach/palmz72.h | 1003 | F: arch/arm/mach-pxa/include/mach/palmz72.h |
1004 | F: arch/arm/mach-pxa/palmz72.c | 1004 | F: arch/arm/mach-pxa/palmz72.c |
1005 | 1005 | ||
1006 | ARM/PLEB SUPPORT | 1006 | ARM/PLEB SUPPORT |
1007 | M: Peter Chubb <pleb@gelato.unsw.edu.au> | 1007 | M: Peter Chubb <pleb@gelato.unsw.edu.au> |
1008 | W: http://www.disy.cse.unsw.edu.au/Hardware/PLEB | 1008 | W: http://www.disy.cse.unsw.edu.au/Hardware/PLEB |
1009 | S: Maintained | 1009 | S: Maintained |
1010 | 1010 | ||
1011 | ARM/PT DIGITAL BOARD PORT | 1011 | ARM/PT DIGITAL BOARD PORT |
1012 | M: Stefan Eletzhofer <stefan.eletzhofer@eletztrick.de> | 1012 | M: Stefan Eletzhofer <stefan.eletzhofer@eletztrick.de> |
1013 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 1013 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
1014 | W: http://www.arm.linux.org.uk/ | 1014 | W: http://www.arm.linux.org.uk/ |
1015 | S: Maintained | 1015 | S: Maintained |
1016 | 1016 | ||
1017 | ARM/RADISYS ENP2611 MACHINE SUPPORT | 1017 | ARM/RADISYS ENP2611 MACHINE SUPPORT |
1018 | M: Lennert Buytenhek <kernel@wantstofly.org> | 1018 | M: Lennert Buytenhek <kernel@wantstofly.org> |
1019 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 1019 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
1020 | S: Maintained | 1020 | S: Maintained |
1021 | 1021 | ||
1022 | ARM/RISCPC ARCHITECTURE | 1022 | ARM/RISCPC ARCHITECTURE |
1023 | M: Russell King <linux@arm.linux.org.uk> | 1023 | M: Russell King <linux@arm.linux.org.uk> |
1024 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 1024 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
1025 | W: http://www.arm.linux.org.uk/ | 1025 | W: http://www.arm.linux.org.uk/ |
1026 | S: Maintained | 1026 | S: Maintained |
1027 | F: arch/arm/common/time-acorn.c | 1027 | F: arch/arm/common/time-acorn.c |
1028 | F: arch/arm/include/asm/hardware/entry-macro-iomd.S | 1028 | F: arch/arm/include/asm/hardware/entry-macro-iomd.S |
1029 | F: arch/arm/include/asm/hardware/ioc.h | 1029 | F: arch/arm/include/asm/hardware/ioc.h |
1030 | F: arch/arm/include/asm/hardware/iomd.h | 1030 | F: arch/arm/include/asm/hardware/iomd.h |
1031 | F: arch/arm/include/asm/hardware/memc.h | 1031 | F: arch/arm/include/asm/hardware/memc.h |
1032 | F: arch/arm/mach-rpc/ | 1032 | F: arch/arm/mach-rpc/ |
1033 | F: drivers/net/ethernet/8390/etherh.c | 1033 | F: drivers/net/ethernet/8390/etherh.c |
1034 | F: drivers/net/ethernet/i825xx/ether1* | 1034 | F: drivers/net/ethernet/i825xx/ether1* |
1035 | F: drivers/net/ethernet/seeq/ether3* | 1035 | F: drivers/net/ethernet/seeq/ether3* |
1036 | F: drivers/scsi/arm/ | 1036 | F: drivers/scsi/arm/ |
1037 | 1037 | ||
1038 | ARM/SHARK MACHINE SUPPORT | 1038 | ARM/SHARK MACHINE SUPPORT |
1039 | M: Alexander Schulz <alex@shark-linux.de> | 1039 | M: Alexander Schulz <alex@shark-linux.de> |
1040 | W: http://www.shark-linux.de/shark.html | 1040 | W: http://www.shark-linux.de/shark.html |
1041 | S: Maintained | 1041 | S: Maintained |
1042 | 1042 | ||
1043 | ARM/SAMSUNG ARM ARCHITECTURES | 1043 | ARM/SAMSUNG ARM ARCHITECTURES |
1044 | M: Ben Dooks <ben-linux@fluff.org> | 1044 | M: Ben Dooks <ben-linux@fluff.org> |
1045 | M: Kukjin Kim <kgene.kim@samsung.com> | 1045 | M: Kukjin Kim <kgene.kim@samsung.com> |
1046 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 1046 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
1047 | L: linux-samsung-soc@vger.kernel.org (moderated for non-subscribers) | 1047 | L: linux-samsung-soc@vger.kernel.org (moderated for non-subscribers) |
1048 | W: http://www.fluff.org/ben/linux/ | 1048 | W: http://www.fluff.org/ben/linux/ |
1049 | S: Maintained | 1049 | S: Maintained |
1050 | F: arch/arm/plat-samsung/ | 1050 | F: arch/arm/plat-samsung/ |
1051 | F: arch/arm/plat-s3c24xx/ | 1051 | F: arch/arm/plat-s3c24xx/ |
1052 | F: arch/arm/plat-s5p/ | 1052 | F: arch/arm/plat-s5p/ |
1053 | F: arch/arm/mach-s3c24*/ | 1053 | F: arch/arm/mach-s3c24*/ |
1054 | F: arch/arm/mach-s3c64xx/ | 1054 | F: arch/arm/mach-s3c64xx/ |
1055 | F: drivers/*/*s3c2410* | 1055 | F: drivers/*/*s3c2410* |
1056 | F: drivers/*/*/*s3c2410* | 1056 | F: drivers/*/*/*s3c2410* |
1057 | F: drivers/spi/spi-s3c* | 1057 | F: drivers/spi/spi-s3c* |
1058 | F: sound/soc/samsung/* | 1058 | F: sound/soc/samsung/* |
1059 | 1059 | ||
1060 | ARM/S5P EXYNOS ARM ARCHITECTURES | 1060 | ARM/S5P EXYNOS ARM ARCHITECTURES |
1061 | M: Kukjin Kim <kgene.kim@samsung.com> | 1061 | M: Kukjin Kim <kgene.kim@samsung.com> |
1062 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 1062 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
1063 | L: linux-samsung-soc@vger.kernel.org (moderated for non-subscribers) | 1063 | L: linux-samsung-soc@vger.kernel.org (moderated for non-subscribers) |
1064 | S: Maintained | 1064 | S: Maintained |
1065 | F: arch/arm/mach-s5p*/ | 1065 | F: arch/arm/mach-s5p*/ |
1066 | F: arch/arm/mach-exynos*/ | 1066 | F: arch/arm/mach-exynos*/ |
1067 | 1067 | ||
1068 | ARM/SAMSUNG MOBILE MACHINE SUPPORT | 1068 | ARM/SAMSUNG MOBILE MACHINE SUPPORT |
1069 | M: Kyungmin Park <kyungmin.park@samsung.com> | 1069 | M: Kyungmin Park <kyungmin.park@samsung.com> |
1070 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 1070 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
1071 | S: Maintained | 1071 | S: Maintained |
1072 | F: arch/arm/mach-s5pv210/mach-aquila.c | 1072 | F: arch/arm/mach-s5pv210/mach-aquila.c |
1073 | F: arch/arm/mach-s5pv210/mach-goni.c | 1073 | F: arch/arm/mach-s5pv210/mach-goni.c |
1074 | F: arch/arm/mach-exynos/mach-universal_c210.c | 1074 | F: arch/arm/mach-exynos/mach-universal_c210.c |
1075 | F: arch/arm/mach-exynos/mach-nuri.c | 1075 | F: arch/arm/mach-exynos/mach-nuri.c |
1076 | 1076 | ||
1077 | ARM/SAMSUNG S5P SERIES FIMC SUPPORT | 1077 | ARM/SAMSUNG S5P SERIES FIMC SUPPORT |
1078 | M: Kyungmin Park <kyungmin.park@samsung.com> | 1078 | M: Kyungmin Park <kyungmin.park@samsung.com> |
1079 | M: Sylwester Nawrocki <s.nawrocki@samsung.com> | 1079 | M: Sylwester Nawrocki <s.nawrocki@samsung.com> |
1080 | L: linux-arm-kernel@lists.infradead.org | 1080 | L: linux-arm-kernel@lists.infradead.org |
1081 | L: linux-media@vger.kernel.org | 1081 | L: linux-media@vger.kernel.org |
1082 | S: Maintained | 1082 | S: Maintained |
1083 | F: arch/arm/plat-s5p/dev-fimc* | 1083 | F: arch/arm/plat-s5p/dev-fimc* |
1084 | F: arch/arm/plat-samsung/include/plat/*fimc* | 1084 | F: arch/arm/plat-samsung/include/plat/*fimc* |
1085 | F: drivers/media/video/s5p-fimc/ | 1085 | F: drivers/media/video/s5p-fimc/ |
1086 | 1086 | ||
1087 | ARM/SAMSUNG S5P SERIES Multi Format Codec (MFC) SUPPORT | 1087 | ARM/SAMSUNG S5P SERIES Multi Format Codec (MFC) SUPPORT |
1088 | M: Kyungmin Park <kyungmin.park@samsung.com> | 1088 | M: Kyungmin Park <kyungmin.park@samsung.com> |
1089 | M: Kamil Debski <k.debski@samsung.com> | 1089 | M: Kamil Debski <k.debski@samsung.com> |
1090 | M: Jeongtae Park <jtp.park@samsung.com> | 1090 | M: Jeongtae Park <jtp.park@samsung.com> |
1091 | L: linux-arm-kernel@lists.infradead.org | 1091 | L: linux-arm-kernel@lists.infradead.org |
1092 | L: linux-media@vger.kernel.org | 1092 | L: linux-media@vger.kernel.org |
1093 | S: Maintained | 1093 | S: Maintained |
1094 | F: arch/arm/plat-s5p/dev-mfc.c | 1094 | F: arch/arm/plat-s5p/dev-mfc.c |
1095 | F: drivers/media/video/s5p-mfc/ | 1095 | F: drivers/media/video/s5p-mfc/ |
1096 | 1096 | ||
1097 | ARM/SAMSUNG S5P SERIES TV SUBSYSTEM SUPPORT | 1097 | ARM/SAMSUNG S5P SERIES TV SUBSYSTEM SUPPORT |
1098 | M: Kyungmin Park <kyungmin.park@samsung.com> | 1098 | M: Kyungmin Park <kyungmin.park@samsung.com> |
1099 | M: Tomasz Stanislawski <t.stanislaws@samsung.com> | 1099 | M: Tomasz Stanislawski <t.stanislaws@samsung.com> |
1100 | L: linux-arm-kernel@lists.infradead.org | 1100 | L: linux-arm-kernel@lists.infradead.org |
1101 | L: linux-media@vger.kernel.org | 1101 | L: linux-media@vger.kernel.org |
1102 | S: Maintained | 1102 | S: Maintained |
1103 | F: drivers/media/video/s5p-tv/ | 1103 | F: drivers/media/video/s5p-tv/ |
1104 | 1104 | ||
1105 | ARM/SHMOBILE ARM ARCHITECTURE | 1105 | ARM/SHMOBILE ARM ARCHITECTURE |
1106 | M: Paul Mundt <lethal@linux-sh.org> | 1106 | M: Paul Mundt <lethal@linux-sh.org> |
1107 | M: Magnus Damm <magnus.damm@gmail.com> | 1107 | M: Magnus Damm <magnus.damm@gmail.com> |
1108 | L: linux-sh@vger.kernel.org | 1108 | L: linux-sh@vger.kernel.org |
1109 | W: http://oss.renesas.com | 1109 | W: http://oss.renesas.com |
1110 | Q: http://patchwork.kernel.org/project/linux-sh/list/ | 1110 | Q: http://patchwork.kernel.org/project/linux-sh/list/ |
1111 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6.git rmobile-latest | 1111 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6.git rmobile-latest |
1112 | S: Supported | 1112 | S: Supported |
1113 | F: arch/arm/mach-shmobile/ | 1113 | F: arch/arm/mach-shmobile/ |
1114 | F: drivers/sh/ | 1114 | F: drivers/sh/ |
1115 | 1115 | ||
1116 | ARM/TECHNOLOGIC SYSTEMS TS7250 MACHINE SUPPORT | 1116 | ARM/TECHNOLOGIC SYSTEMS TS7250 MACHINE SUPPORT |
1117 | M: Lennert Buytenhek <kernel@wantstofly.org> | 1117 | M: Lennert Buytenhek <kernel@wantstofly.org> |
1118 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 1118 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
1119 | S: Maintained | 1119 | S: Maintained |
1120 | 1120 | ||
1121 | ARM/TETON BGA MACHINE SUPPORT | 1121 | ARM/TETON BGA MACHINE SUPPORT |
1122 | M: "Mark F. Brown" <mark.brown314@gmail.com> | 1122 | M: "Mark F. Brown" <mark.brown314@gmail.com> |
1123 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 1123 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
1124 | S: Maintained | 1124 | S: Maintained |
1125 | 1125 | ||
1126 | ARM/THECUS N2100 MACHINE SUPPORT | 1126 | ARM/THECUS N2100 MACHINE SUPPORT |
1127 | M: Lennert Buytenhek <kernel@wantstofly.org> | 1127 | M: Lennert Buytenhek <kernel@wantstofly.org> |
1128 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 1128 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
1129 | S: Maintained | 1129 | S: Maintained |
1130 | 1130 | ||
1131 | ARM/NUVOTON W90X900 ARM ARCHITECTURE | 1131 | ARM/NUVOTON W90X900 ARM ARCHITECTURE |
1132 | M: Wan ZongShun <mcuos.com@gmail.com> | 1132 | M: Wan ZongShun <mcuos.com@gmail.com> |
1133 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 1133 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
1134 | W: http://www.mcuos.com | 1134 | W: http://www.mcuos.com |
1135 | S: Maintained | 1135 | S: Maintained |
1136 | F: arch/arm/mach-w90x900/ | 1136 | F: arch/arm/mach-w90x900/ |
1137 | F: drivers/input/keyboard/w90p910_keypad.c | 1137 | F: drivers/input/keyboard/w90p910_keypad.c |
1138 | F: drivers/input/touchscreen/w90p910_ts.c | 1138 | F: drivers/input/touchscreen/w90p910_ts.c |
1139 | F: drivers/watchdog/nuc900_wdt.c | 1139 | F: drivers/watchdog/nuc900_wdt.c |
1140 | F: drivers/net/ethernet/nuvoton/w90p910_ether.c | 1140 | F: drivers/net/ethernet/nuvoton/w90p910_ether.c |
1141 | F: drivers/mtd/nand/nuc900_nand.c | 1141 | F: drivers/mtd/nand/nuc900_nand.c |
1142 | F: drivers/rtc/rtc-nuc900.c | 1142 | F: drivers/rtc/rtc-nuc900.c |
1143 | F: drivers/spi/spi-nuc900.c | 1143 | F: drivers/spi/spi-nuc900.c |
1144 | F: drivers/usb/host/ehci-w90x900.c | 1144 | F: drivers/usb/host/ehci-w90x900.c |
1145 | F: drivers/video/nuc900fb.c | 1145 | F: drivers/video/nuc900fb.c |
1146 | 1146 | ||
1147 | ARM/U300 MACHINE SUPPORT | 1147 | ARM/U300 MACHINE SUPPORT |
1148 | M: Linus Walleij <linus.walleij@stericsson.com> | 1148 | M: Linus Walleij <linus.walleij@stericsson.com> |
1149 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 1149 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
1150 | S: Supported | 1150 | S: Supported |
1151 | F: arch/arm/mach-u300/ | 1151 | F: arch/arm/mach-u300/ |
1152 | F: drivers/i2c/busses/i2c-stu300.c | 1152 | F: drivers/i2c/busses/i2c-stu300.c |
1153 | F: drivers/rtc/rtc-coh901331.c | 1153 | F: drivers/rtc/rtc-coh901331.c |
1154 | F: drivers/watchdog/coh901327_wdt.c | 1154 | F: drivers/watchdog/coh901327_wdt.c |
1155 | F: drivers/dma/coh901318* | 1155 | F: drivers/dma/coh901318* |
1156 | F: drivers/mfd/ab3100* | 1156 | F: drivers/mfd/ab3100* |
1157 | F: drivers/rtc/rtc-ab3100.c | 1157 | F: drivers/rtc/rtc-ab3100.c |
1158 | F: drivers/rtc/rtc-coh901331.c | 1158 | F: drivers/rtc/rtc-coh901331.c |
1159 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-stericsson.git | 1159 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-stericsson.git |
1160 | 1160 | ||
1161 | ARM/Ux500 ARM ARCHITECTURE | 1161 | ARM/Ux500 ARM ARCHITECTURE |
1162 | M: Srinidhi Kasagar <srinidhi.kasagar@stericsson.com> | 1162 | M: Srinidhi Kasagar <srinidhi.kasagar@stericsson.com> |
1163 | M: Linus Walleij <linus.walleij@stericsson.com> | 1163 | M: Linus Walleij <linus.walleij@stericsson.com> |
1164 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 1164 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
1165 | S: Maintained | 1165 | S: Maintained |
1166 | F: arch/arm/mach-ux500/ | 1166 | F: arch/arm/mach-ux500/ |
1167 | F: drivers/dma/ste_dma40* | 1167 | F: drivers/dma/ste_dma40* |
1168 | F: drivers/mfd/abx500* | 1168 | F: drivers/mfd/abx500* |
1169 | F: drivers/mfd/ab8500* | 1169 | F: drivers/mfd/ab8500* |
1170 | F: drivers/mfd/stmpe* | 1170 | F: drivers/mfd/stmpe* |
1171 | F: drivers/rtc/rtc-ab8500.c | 1171 | F: drivers/rtc/rtc-ab8500.c |
1172 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-stericsson.git | 1172 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-stericsson.git |
1173 | 1173 | ||
1174 | ARM/VFP SUPPORT | 1174 | ARM/VFP SUPPORT |
1175 | M: Russell King <linux@arm.linux.org.uk> | 1175 | M: Russell King <linux@arm.linux.org.uk> |
1176 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 1176 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
1177 | W: http://www.arm.linux.org.uk/ | 1177 | W: http://www.arm.linux.org.uk/ |
1178 | S: Maintained | 1178 | S: Maintained |
1179 | F: arch/arm/vfp/ | 1179 | F: arch/arm/vfp/ |
1180 | 1180 | ||
1181 | ARM/VOIPAC PXA270 SUPPORT | 1181 | ARM/VOIPAC PXA270 SUPPORT |
1182 | M: Marek Vasut <marek.vasut@gmail.com> | 1182 | M: Marek Vasut <marek.vasut@gmail.com> |
1183 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 1183 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
1184 | S: Maintained | 1184 | S: Maintained |
1185 | F: arch/arm/mach-pxa/vpac270.c | 1185 | F: arch/arm/mach-pxa/vpac270.c |
1186 | F: arch/arm/mach-pxa/include/mach/vpac270.h | 1186 | F: arch/arm/mach-pxa/include/mach/vpac270.h |
1187 | 1187 | ||
1188 | ARM/ZIPIT Z2 SUPPORT | 1188 | ARM/ZIPIT Z2 SUPPORT |
1189 | M: Marek Vasut <marek.vasut@gmail.com> | 1189 | M: Marek Vasut <marek.vasut@gmail.com> |
1190 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 1190 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
1191 | S: Maintained | 1191 | S: Maintained |
1192 | F: arch/arm/mach-pxa/z2.c | 1192 | F: arch/arm/mach-pxa/z2.c |
1193 | F: arch/arm/mach-pxa/include/mach/z2.h | 1193 | F: arch/arm/mach-pxa/include/mach/z2.h |
1194 | 1194 | ||
1195 | ASC7621 HARDWARE MONITOR DRIVER | 1195 | ASC7621 HARDWARE MONITOR DRIVER |
1196 | M: George Joseph <george.joseph@fairview5.com> | 1196 | M: George Joseph <george.joseph@fairview5.com> |
1197 | L: lm-sensors@lm-sensors.org | 1197 | L: lm-sensors@lm-sensors.org |
1198 | S: Maintained | 1198 | S: Maintained |
1199 | F: Documentation/hwmon/asc7621 | 1199 | F: Documentation/hwmon/asc7621 |
1200 | F: drivers/hwmon/asc7621.c | 1200 | F: drivers/hwmon/asc7621.c |
1201 | 1201 | ||
1202 | ASUS NOTEBOOKS AND EEEPC ACPI/WMI EXTRAS DRIVERS | 1202 | ASUS NOTEBOOKS AND EEEPC ACPI/WMI EXTRAS DRIVERS |
1203 | M: Corentin Chary <corentincj@iksaif.net> | 1203 | M: Corentin Chary <corentincj@iksaif.net> |
1204 | L: acpi4asus-user@lists.sourceforge.net | 1204 | L: acpi4asus-user@lists.sourceforge.net |
1205 | L: platform-driver-x86@vger.kernel.org | 1205 | L: platform-driver-x86@vger.kernel.org |
1206 | W: http://acpi4asus.sf.net | 1206 | W: http://acpi4asus.sf.net |
1207 | S: Maintained | 1207 | S: Maintained |
1208 | F: drivers/platform/x86/asus*.c | 1208 | F: drivers/platform/x86/asus*.c |
1209 | F: drivers/platform/x86/eeepc*.c | 1209 | F: drivers/platform/x86/eeepc*.c |
1210 | 1210 | ||
1211 | ASUS ASB100 HARDWARE MONITOR DRIVER | 1211 | ASUS ASB100 HARDWARE MONITOR DRIVER |
1212 | M: "Mark M. Hoffman" <mhoffman@lightlink.com> | 1212 | M: "Mark M. Hoffman" <mhoffman@lightlink.com> |
1213 | L: lm-sensors@lm-sensors.org | 1213 | L: lm-sensors@lm-sensors.org |
1214 | S: Maintained | 1214 | S: Maintained |
1215 | F: drivers/hwmon/asb100.c | 1215 | F: drivers/hwmon/asb100.c |
1216 | 1216 | ||
1217 | ASYNCHRONOUS TRANSFERS/TRANSFORMS (IOAT) API | 1217 | ASYNCHRONOUS TRANSFERS/TRANSFORMS (IOAT) API |
1218 | M: Dan Williams <dan.j.williams@intel.com> | 1218 | M: Dan Williams <dan.j.williams@intel.com> |
1219 | W: http://sourceforge.net/projects/xscaleiop | 1219 | W: http://sourceforge.net/projects/xscaleiop |
1220 | S: Supported | 1220 | S: Supported |
1221 | F: Documentation/crypto/async-tx-api.txt | 1221 | F: Documentation/crypto/async-tx-api.txt |
1222 | F: crypto/async_tx/ | 1222 | F: crypto/async_tx/ |
1223 | F: drivers/dma/ | 1223 | F: drivers/dma/ |
1224 | F: include/linux/dmaengine.h | 1224 | F: include/linux/dmaengine.h |
1225 | F: include/linux/async_tx.h | 1225 | F: include/linux/async_tx.h |
1226 | 1226 | ||
1227 | AT24 EEPROM DRIVER | 1227 | AT24 EEPROM DRIVER |
1228 | M: Wolfram Sang <w.sang@pengutronix.de> | 1228 | M: Wolfram Sang <w.sang@pengutronix.de> |
1229 | L: linux-i2c@vger.kernel.org | 1229 | L: linux-i2c@vger.kernel.org |
1230 | S: Maintained | 1230 | S: Maintained |
1231 | F: drivers/misc/eeprom/at24.c | 1231 | F: drivers/misc/eeprom/at24.c |
1232 | F: include/linux/i2c/at24.h | 1232 | F: include/linux/i2c/at24.h |
1233 | 1233 | ||
1234 | ATA OVER ETHERNET (AOE) DRIVER | 1234 | ATA OVER ETHERNET (AOE) DRIVER |
1235 | M: "Ed L. Cashin" <ecashin@coraid.com> | 1235 | M: "Ed L. Cashin" <ecashin@coraid.com> |
1236 | W: http://www.coraid.com/support/linux | 1236 | W: http://www.coraid.com/support/linux |
1237 | S: Supported | 1237 | S: Supported |
1238 | F: Documentation/aoe/ | 1238 | F: Documentation/aoe/ |
1239 | F: drivers/block/aoe/ | 1239 | F: drivers/block/aoe/ |
1240 | 1240 | ||
1241 | ATHEROS ATH GENERIC UTILITIES | 1241 | ATHEROS ATH GENERIC UTILITIES |
1242 | M: "Luis R. Rodriguez" <mcgrof@qca.qualcomm.com> | 1242 | M: "Luis R. Rodriguez" <mcgrof@qca.qualcomm.com> |
1243 | L: linux-wireless@vger.kernel.org | 1243 | L: linux-wireless@vger.kernel.org |
1244 | S: Supported | 1244 | S: Supported |
1245 | F: drivers/net/wireless/ath/* | 1245 | F: drivers/net/wireless/ath/* |
1246 | 1246 | ||
1247 | ATHEROS ATH5K WIRELESS DRIVER | 1247 | ATHEROS ATH5K WIRELESS DRIVER |
1248 | M: Jiri Slaby <jirislaby@gmail.com> | 1248 | M: Jiri Slaby <jirislaby@gmail.com> |
1249 | M: Nick Kossifidis <mickflemm@gmail.com> | 1249 | M: Nick Kossifidis <mickflemm@gmail.com> |
1250 | M: "Luis R. Rodriguez" <mcgrof@qca.qualcomm.com> | 1250 | M: "Luis R. Rodriguez" <mcgrof@qca.qualcomm.com> |
1251 | M: Bob Copeland <me@bobcopeland.com> | 1251 | M: Bob Copeland <me@bobcopeland.com> |
1252 | L: linux-wireless@vger.kernel.org | 1252 | L: linux-wireless@vger.kernel.org |
1253 | L: ath5k-devel@lists.ath5k.org | 1253 | L: ath5k-devel@lists.ath5k.org |
1254 | W: http://wireless.kernel.org/en/users/Drivers/ath5k | 1254 | W: http://wireless.kernel.org/en/users/Drivers/ath5k |
1255 | S: Maintained | 1255 | S: Maintained |
1256 | F: drivers/net/wireless/ath/ath5k/ | 1256 | F: drivers/net/wireless/ath/ath5k/ |
1257 | 1257 | ||
1258 | ATHEROS ATH6KL WIRELESS DRIVER | 1258 | ATHEROS ATH6KL WIRELESS DRIVER |
1259 | M: Kalle Valo <kvalo@qca.qualcomm.com> | 1259 | M: Kalle Valo <kvalo@qca.qualcomm.com> |
1260 | L: linux-wireless@vger.kernel.org | 1260 | L: linux-wireless@vger.kernel.org |
1261 | W: http://wireless.kernel.org/en/users/Drivers/ath6kl | 1261 | W: http://wireless.kernel.org/en/users/Drivers/ath6kl |
1262 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath6kl.git | 1262 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath6kl.git |
1263 | S: Supported | 1263 | S: Supported |
1264 | F: drivers/net/wireless/ath/ath6kl/ | 1264 | F: drivers/net/wireless/ath/ath6kl/ |
1265 | 1265 | ||
1266 | ATHEROS ATH9K WIRELESS DRIVER | 1266 | ATHEROS ATH9K WIRELESS DRIVER |
1267 | M: "Luis R. Rodriguez" <mcgrof@qca.qualcomm.com> | 1267 | M: "Luis R. Rodriguez" <mcgrof@qca.qualcomm.com> |
1268 | M: Jouni Malinen <jouni@qca.qualcomm.com> | 1268 | M: Jouni Malinen <jouni@qca.qualcomm.com> |
1269 | M: Vasanthakumar Thiagarajan <vthiagar@qca.qualcomm.com> | 1269 | M: Vasanthakumar Thiagarajan <vthiagar@qca.qualcomm.com> |
1270 | M: Senthil Balasubramanian <senthilb@qca.qualcomm.com> | 1270 | M: Senthil Balasubramanian <senthilb@qca.qualcomm.com> |
1271 | L: linux-wireless@vger.kernel.org | 1271 | L: linux-wireless@vger.kernel.org |
1272 | L: ath9k-devel@lists.ath9k.org | 1272 | L: ath9k-devel@lists.ath9k.org |
1273 | W: http://wireless.kernel.org/en/users/Drivers/ath9k | 1273 | W: http://wireless.kernel.org/en/users/Drivers/ath9k |
1274 | S: Supported | 1274 | S: Supported |
1275 | F: drivers/net/wireless/ath/ath9k/ | 1275 | F: drivers/net/wireless/ath/ath9k/ |
1276 | 1276 | ||
1277 | CARL9170 LINUX COMMUNITY WIRELESS DRIVER | 1277 | CARL9170 LINUX COMMUNITY WIRELESS DRIVER |
1278 | M: Christian Lamparter <chunkeey@googlemail.com> | 1278 | M: Christian Lamparter <chunkeey@googlemail.com> |
1279 | L: linux-wireless@vger.kernel.org | 1279 | L: linux-wireless@vger.kernel.org |
1280 | W: http://wireless.kernel.org/en/users/Drivers/carl9170 | 1280 | W: http://wireless.kernel.org/en/users/Drivers/carl9170 |
1281 | S: Maintained | 1281 | S: Maintained |
1282 | F: drivers/net/wireless/ath/carl9170/ | 1282 | F: drivers/net/wireless/ath/carl9170/ |
1283 | 1283 | ||
1284 | ATK0110 HWMON DRIVER | 1284 | ATK0110 HWMON DRIVER |
1285 | M: Luca Tettamanti <kronos.it@gmail.com> | 1285 | M: Luca Tettamanti <kronos.it@gmail.com> |
1286 | L: lm-sensors@lm-sensors.org | 1286 | L: lm-sensors@lm-sensors.org |
1287 | S: Maintained | 1287 | S: Maintained |
1288 | F: drivers/hwmon/asus_atk0110.c | 1288 | F: drivers/hwmon/asus_atk0110.c |
1289 | 1289 | ||
1290 | ATI_REMOTE2 DRIVER | 1290 | ATI_REMOTE2 DRIVER |
1291 | M: Ville Syrjala <syrjala@sci.fi> | 1291 | M: Ville Syrjala <syrjala@sci.fi> |
1292 | S: Maintained | 1292 | S: Maintained |
1293 | F: drivers/input/misc/ati_remote2.c | 1293 | F: drivers/input/misc/ati_remote2.c |
1294 | 1294 | ||
1295 | ATLX ETHERNET DRIVERS | 1295 | ATLX ETHERNET DRIVERS |
1296 | M: Jay Cliburn <jcliburn@gmail.com> | 1296 | M: Jay Cliburn <jcliburn@gmail.com> |
1297 | M: Chris Snook <chris.snook@gmail.com> | 1297 | M: Chris Snook <chris.snook@gmail.com> |
1298 | L: netdev@vger.kernel.org | 1298 | L: netdev@vger.kernel.org |
1299 | W: http://sourceforge.net/projects/atl1 | 1299 | W: http://sourceforge.net/projects/atl1 |
1300 | W: http://atl1.sourceforge.net | 1300 | W: http://atl1.sourceforge.net |
1301 | S: Maintained | 1301 | S: Maintained |
1302 | F: drivers/net/ethernet/atheros/ | 1302 | F: drivers/net/ethernet/atheros/ |
1303 | 1303 | ||
1304 | ATM | 1304 | ATM |
1305 | M: Chas Williams <chas@cmf.nrl.navy.mil> | 1305 | M: Chas Williams <chas@cmf.nrl.navy.mil> |
1306 | L: linux-atm-general@lists.sourceforge.net (moderated for non-subscribers) | 1306 | L: linux-atm-general@lists.sourceforge.net (moderated for non-subscribers) |
1307 | L: netdev@vger.kernel.org | 1307 | L: netdev@vger.kernel.org |
1308 | W: http://linux-atm.sourceforge.net | 1308 | W: http://linux-atm.sourceforge.net |
1309 | S: Maintained | 1309 | S: Maintained |
1310 | F: drivers/atm/ | 1310 | F: drivers/atm/ |
1311 | F: include/linux/atm* | 1311 | F: include/linux/atm* |
1312 | 1312 | ||
1313 | ATMEL AT91 MCI DRIVER | 1313 | ATMEL AT91 MCI DRIVER |
1314 | M: Nicolas Ferre <nicolas.ferre@atmel.com> | 1314 | M: Nicolas Ferre <nicolas.ferre@atmel.com> |
1315 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 1315 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
1316 | W: http://www.atmel.com/products/AT91/ | 1316 | W: http://www.atmel.com/products/AT91/ |
1317 | W: http://www.at91.com/ | 1317 | W: http://www.at91.com/ |
1318 | S: Maintained | 1318 | S: Maintained |
1319 | F: drivers/mmc/host/at91_mci.c | 1319 | F: drivers/mmc/host/at91_mci.c |
1320 | 1320 | ||
1321 | ATMEL AT91 / AT32 MCI DRIVER | 1321 | ATMEL AT91 / AT32 MCI DRIVER |
1322 | M: Nicolas Ferre <nicolas.ferre@atmel.com> | 1322 | M: Nicolas Ferre <nicolas.ferre@atmel.com> |
1323 | S: Maintained | 1323 | S: Maintained |
1324 | F: drivers/mmc/host/atmel-mci.c | 1324 | F: drivers/mmc/host/atmel-mci.c |
1325 | F: drivers/mmc/host/atmel-mci-regs.h | 1325 | F: drivers/mmc/host/atmel-mci-regs.h |
1326 | 1326 | ||
1327 | ATMEL AT91 / AT32 SERIAL DRIVER | 1327 | ATMEL AT91 / AT32 SERIAL DRIVER |
1328 | M: Nicolas Ferre <nicolas.ferre@atmel.com> | 1328 | M: Nicolas Ferre <nicolas.ferre@atmel.com> |
1329 | S: Supported | 1329 | S: Supported |
1330 | F: drivers/tty/serial/atmel_serial.c | 1330 | F: drivers/tty/serial/atmel_serial.c |
1331 | 1331 | ||
1332 | ATMEL LCDFB DRIVER | 1332 | ATMEL LCDFB DRIVER |
1333 | M: Nicolas Ferre <nicolas.ferre@atmel.com> | 1333 | M: Nicolas Ferre <nicolas.ferre@atmel.com> |
1334 | L: linux-fbdev@vger.kernel.org | 1334 | L: linux-fbdev@vger.kernel.org |
1335 | S: Maintained | 1335 | S: Maintained |
1336 | F: drivers/video/atmel_lcdfb.c | 1336 | F: drivers/video/atmel_lcdfb.c |
1337 | F: include/video/atmel_lcdc.h | 1337 | F: include/video/atmel_lcdc.h |
1338 | 1338 | ||
1339 | ATMEL MACB ETHERNET DRIVER | 1339 | ATMEL MACB ETHERNET DRIVER |
1340 | M: Nicolas Ferre <nicolas.ferre@atmel.com> | 1340 | M: Nicolas Ferre <nicolas.ferre@atmel.com> |
1341 | S: Supported | 1341 | S: Supported |
1342 | F: drivers/net/ethernet/cadence/ | 1342 | F: drivers/net/ethernet/cadence/ |
1343 | 1343 | ||
1344 | ATMEL SPI DRIVER | 1344 | ATMEL SPI DRIVER |
1345 | M: Nicolas Ferre <nicolas.ferre@atmel.com> | 1345 | M: Nicolas Ferre <nicolas.ferre@atmel.com> |
1346 | S: Supported | 1346 | S: Supported |
1347 | F: drivers/spi/spi-atmel.* | 1347 | F: drivers/spi/spi-atmel.* |
1348 | 1348 | ||
1349 | ATMEL USBA UDC DRIVER | 1349 | ATMEL USBA UDC DRIVER |
1350 | M: Nicolas Ferre <nicolas.ferre@atmel.com> | 1350 | M: Nicolas Ferre <nicolas.ferre@atmel.com> |
1351 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 1351 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
1352 | W: http://avr32linux.org/twiki/bin/view/Main/AtmelUsbDeviceDriver | 1352 | W: http://avr32linux.org/twiki/bin/view/Main/AtmelUsbDeviceDriver |
1353 | S: Supported | 1353 | S: Supported |
1354 | F: drivers/usb/gadget/atmel_usba_udc.* | 1354 | F: drivers/usb/gadget/atmel_usba_udc.* |
1355 | 1355 | ||
1356 | ATMEL WIRELESS DRIVER | 1356 | ATMEL WIRELESS DRIVER |
1357 | M: Simon Kelley <simon@thekelleys.org.uk> | 1357 | M: Simon Kelley <simon@thekelleys.org.uk> |
1358 | L: linux-wireless@vger.kernel.org | 1358 | L: linux-wireless@vger.kernel.org |
1359 | W: http://www.thekelleys.org.uk/atmel | 1359 | W: http://www.thekelleys.org.uk/atmel |
1360 | W: http://atmelwlandriver.sourceforge.net/ | 1360 | W: http://atmelwlandriver.sourceforge.net/ |
1361 | S: Maintained | 1361 | S: Maintained |
1362 | F: drivers/net/wireless/atmel* | 1362 | F: drivers/net/wireless/atmel* |
1363 | 1363 | ||
1364 | AUDIT SUBSYSTEM | 1364 | AUDIT SUBSYSTEM |
1365 | M: Al Viro <viro@zeniv.linux.org.uk> | 1365 | M: Al Viro <viro@zeniv.linux.org.uk> |
1366 | M: Eric Paris <eparis@redhat.com> | 1366 | M: Eric Paris <eparis@redhat.com> |
1367 | L: linux-audit@redhat.com (subscribers-only) | 1367 | L: linux-audit@redhat.com (subscribers-only) |
1368 | W: http://people.redhat.com/sgrubb/audit/ | 1368 | W: http://people.redhat.com/sgrubb/audit/ |
1369 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/viro/audit-current.git | 1369 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/viro/audit-current.git |
1370 | S: Maintained | 1370 | S: Maintained |
1371 | F: include/linux/audit.h | 1371 | F: include/linux/audit.h |
1372 | F: kernel/audit* | 1372 | F: kernel/audit* |
1373 | 1373 | ||
1374 | AUXILIARY DISPLAY DRIVERS | 1374 | AUXILIARY DISPLAY DRIVERS |
1375 | M: Miguel Ojeda Sandonis <miguel.ojeda.sandonis@gmail.com> | 1375 | M: Miguel Ojeda Sandonis <miguel.ojeda.sandonis@gmail.com> |
1376 | W: http://miguelojeda.es/auxdisplay.htm | 1376 | W: http://miguelojeda.es/auxdisplay.htm |
1377 | W: http://jair.lab.fi.uva.es/~migojed/auxdisplay.htm | 1377 | W: http://jair.lab.fi.uva.es/~migojed/auxdisplay.htm |
1378 | S: Maintained | 1378 | S: Maintained |
1379 | F: drivers/auxdisplay/ | 1379 | F: drivers/auxdisplay/ |
1380 | F: include/linux/cfag12864b.h | 1380 | F: include/linux/cfag12864b.h |
1381 | 1381 | ||
1382 | AVR32 ARCHITECTURE | 1382 | AVR32 ARCHITECTURE |
1383 | M: Haavard Skinnemoen <hskinnemoen@gmail.com> | 1383 | M: Haavard Skinnemoen <hskinnemoen@gmail.com> |
1384 | M: Hans-Christian Egtvedt <egtvedt@samfundet.no> | 1384 | M: Hans-Christian Egtvedt <egtvedt@samfundet.no> |
1385 | W: http://www.atmel.com/products/AVR32/ | 1385 | W: http://www.atmel.com/products/AVR32/ |
1386 | W: http://avr32linux.org/ | 1386 | W: http://avr32linux.org/ |
1387 | W: http://avrfreaks.net/ | 1387 | W: http://avrfreaks.net/ |
1388 | S: Maintained | 1388 | S: Maintained |
1389 | F: arch/avr32/ | 1389 | F: arch/avr32/ |
1390 | 1390 | ||
1391 | AVR32/AT32AP MACHINE SUPPORT | 1391 | AVR32/AT32AP MACHINE SUPPORT |
1392 | M: Haavard Skinnemoen <hskinnemoen@gmail.com> | 1392 | M: Haavard Skinnemoen <hskinnemoen@gmail.com> |
1393 | M: Hans-Christian Egtvedt <egtvedt@samfundet.no> | 1393 | M: Hans-Christian Egtvedt <egtvedt@samfundet.no> |
1394 | S: Maintained | 1394 | S: Maintained |
1395 | F: arch/avr32/mach-at32ap/ | 1395 | F: arch/avr32/mach-at32ap/ |
1396 | 1396 | ||
1397 | AX.25 NETWORK LAYER | 1397 | AX.25 NETWORK LAYER |
1398 | M: Ralf Baechle <ralf@linux-mips.org> | 1398 | M: Ralf Baechle <ralf@linux-mips.org> |
1399 | L: linux-hams@vger.kernel.org | 1399 | L: linux-hams@vger.kernel.org |
1400 | W: http://www.linux-ax25.org/ | 1400 | W: http://www.linux-ax25.org/ |
1401 | S: Maintained | 1401 | S: Maintained |
1402 | F: include/linux/ax25.h | 1402 | F: include/linux/ax25.h |
1403 | F: include/net/ax25.h | 1403 | F: include/net/ax25.h |
1404 | F: net/ax25/ | 1404 | F: net/ax25/ |
1405 | 1405 | ||
1406 | B43 WIRELESS DRIVER | 1406 | B43 WIRELESS DRIVER |
1407 | M: Stefano Brivio <stefano.brivio@polimi.it> | 1407 | M: Stefano Brivio <stefano.brivio@polimi.it> |
1408 | L: linux-wireless@vger.kernel.org | 1408 | L: linux-wireless@vger.kernel.org |
1409 | L: b43-dev@lists.infradead.org (moderated for non-subscribers) | 1409 | L: b43-dev@lists.infradead.org (moderated for non-subscribers) |
1410 | W: http://linuxwireless.org/en/users/Drivers/b43 | 1410 | W: http://linuxwireless.org/en/users/Drivers/b43 |
1411 | S: Maintained | 1411 | S: Maintained |
1412 | F: drivers/net/wireless/b43/ | 1412 | F: drivers/net/wireless/b43/ |
1413 | 1413 | ||
1414 | B43LEGACY WIRELESS DRIVER | 1414 | B43LEGACY WIRELESS DRIVER |
1415 | M: Larry Finger <Larry.Finger@lwfinger.net> | 1415 | M: Larry Finger <Larry.Finger@lwfinger.net> |
1416 | M: Stefano Brivio <stefano.brivio@polimi.it> | 1416 | M: Stefano Brivio <stefano.brivio@polimi.it> |
1417 | L: linux-wireless@vger.kernel.org | 1417 | L: linux-wireless@vger.kernel.org |
1418 | W: http://linuxwireless.org/en/users/Drivers/b43 | 1418 | W: http://linuxwireless.org/en/users/Drivers/b43 |
1419 | S: Maintained | 1419 | S: Maintained |
1420 | F: drivers/net/wireless/b43legacy/ | 1420 | F: drivers/net/wireless/b43legacy/ |
1421 | 1421 | ||
1422 | BACKLIGHT CLASS/SUBSYSTEM | 1422 | BACKLIGHT CLASS/SUBSYSTEM |
1423 | M: Richard Purdie <rpurdie@rpsys.net> | 1423 | M: Richard Purdie <rpurdie@rpsys.net> |
1424 | S: Maintained | 1424 | S: Maintained |
1425 | F: drivers/video/backlight/ | 1425 | F: drivers/video/backlight/ |
1426 | F: include/linux/backlight.h | 1426 | F: include/linux/backlight.h |
1427 | 1427 | ||
1428 | BATMAN ADVANCED | 1428 | BATMAN ADVANCED |
1429 | M: Marek Lindner <lindner_marek@yahoo.de> | 1429 | M: Marek Lindner <lindner_marek@yahoo.de> |
1430 | M: Simon Wunderlich <siwu@hrz.tu-chemnitz.de> | 1430 | M: Simon Wunderlich <siwu@hrz.tu-chemnitz.de> |
1431 | L: b.a.t.m.a.n@lists.open-mesh.org | 1431 | L: b.a.t.m.a.n@lists.open-mesh.org |
1432 | W: http://www.open-mesh.org/ | 1432 | W: http://www.open-mesh.org/ |
1433 | S: Maintained | 1433 | S: Maintained |
1434 | F: net/batman-adv/ | 1434 | F: net/batman-adv/ |
1435 | 1435 | ||
1436 | BAYCOM/HDLCDRV DRIVERS FOR AX.25 | 1436 | BAYCOM/HDLCDRV DRIVERS FOR AX.25 |
1437 | M: Thomas Sailer <t.sailer@alumni.ethz.ch> | 1437 | M: Thomas Sailer <t.sailer@alumni.ethz.ch> |
1438 | L: linux-hams@vger.kernel.org | 1438 | L: linux-hams@vger.kernel.org |
1439 | W: http://www.baycom.org/~tom/ham/ham.html | 1439 | W: http://www.baycom.org/~tom/ham/ham.html |
1440 | S: Maintained | 1440 | S: Maintained |
1441 | F: drivers/net/hamradio/baycom* | 1441 | F: drivers/net/hamradio/baycom* |
1442 | 1442 | ||
1443 | BEFS FILE SYSTEM | 1443 | BEFS FILE SYSTEM |
1444 | S: Orphan | 1444 | S: Orphan |
1445 | F: Documentation/filesystems/befs.txt | 1445 | F: Documentation/filesystems/befs.txt |
1446 | F: fs/befs/ | 1446 | F: fs/befs/ |
1447 | 1447 | ||
1448 | BFS FILE SYSTEM | 1448 | BFS FILE SYSTEM |
1449 | M: "Tigran A. Aivazian" <tigran@aivazian.fsnet.co.uk> | 1449 | M: "Tigran A. Aivazian" <tigran@aivazian.fsnet.co.uk> |
1450 | S: Maintained | 1450 | S: Maintained |
1451 | F: Documentation/filesystems/bfs.txt | 1451 | F: Documentation/filesystems/bfs.txt |
1452 | F: fs/bfs/ | 1452 | F: fs/bfs/ |
1453 | F: include/linux/bfs_fs.h | 1453 | F: include/linux/bfs_fs.h |
1454 | 1454 | ||
1455 | BLACKFIN ARCHITECTURE | 1455 | BLACKFIN ARCHITECTURE |
1456 | M: Mike Frysinger <vapier@gentoo.org> | 1456 | M: Mike Frysinger <vapier@gentoo.org> |
1457 | L: uclinux-dist-devel@blackfin.uclinux.org | 1457 | L: uclinux-dist-devel@blackfin.uclinux.org |
1458 | W: http://blackfin.uclinux.org | 1458 | W: http://blackfin.uclinux.org |
1459 | S: Supported | 1459 | S: Supported |
1460 | F: arch/blackfin/ | 1460 | F: arch/blackfin/ |
1461 | 1461 | ||
1462 | BLACKFIN EMAC DRIVER | 1462 | BLACKFIN EMAC DRIVER |
1463 | L: uclinux-dist-devel@blackfin.uclinux.org | 1463 | L: uclinux-dist-devel@blackfin.uclinux.org |
1464 | W: http://blackfin.uclinux.org | 1464 | W: http://blackfin.uclinux.org |
1465 | S: Supported | 1465 | S: Supported |
1466 | F: drivers/net/ethernet/adi/ | 1466 | F: drivers/net/ethernet/adi/ |
1467 | 1467 | ||
1468 | BLACKFIN RTC DRIVER | 1468 | BLACKFIN RTC DRIVER |
1469 | M: Mike Frysinger <vapier.adi@gmail.com> | 1469 | M: Mike Frysinger <vapier.adi@gmail.com> |
1470 | L: uclinux-dist-devel@blackfin.uclinux.org | 1470 | L: uclinux-dist-devel@blackfin.uclinux.org |
1471 | W: http://blackfin.uclinux.org | 1471 | W: http://blackfin.uclinux.org |
1472 | S: Supported | 1472 | S: Supported |
1473 | F: drivers/rtc/rtc-bfin.c | 1473 | F: drivers/rtc/rtc-bfin.c |
1474 | 1474 | ||
1475 | BLACKFIN SDH DRIVER | 1475 | BLACKFIN SDH DRIVER |
1476 | M: Cliff Cai <cliff.cai@analog.com> | 1476 | M: Cliff Cai <cliff.cai@analog.com> |
1477 | L: uclinux-dist-devel@blackfin.uclinux.org | 1477 | L: uclinux-dist-devel@blackfin.uclinux.org |
1478 | W: http://blackfin.uclinux.org | 1478 | W: http://blackfin.uclinux.org |
1479 | S: Supported | 1479 | S: Supported |
1480 | F: drivers/mmc/host/bfin_sdh.c | 1480 | F: drivers/mmc/host/bfin_sdh.c |
1481 | 1481 | ||
1482 | BLACKFIN SERIAL DRIVER | 1482 | BLACKFIN SERIAL DRIVER |
1483 | M: Sonic Zhang <sonic.zhang@analog.com> | 1483 | M: Sonic Zhang <sonic.zhang@analog.com> |
1484 | L: uclinux-dist-devel@blackfin.uclinux.org | 1484 | L: uclinux-dist-devel@blackfin.uclinux.org |
1485 | W: http://blackfin.uclinux.org | 1485 | W: http://blackfin.uclinux.org |
1486 | S: Supported | 1486 | S: Supported |
1487 | F: drivers/tty/serial/bfin_uart.c | 1487 | F: drivers/tty/serial/bfin_uart.c |
1488 | 1488 | ||
1489 | BLACKFIN WATCHDOG DRIVER | 1489 | BLACKFIN WATCHDOG DRIVER |
1490 | M: Mike Frysinger <vapier.adi@gmail.com> | 1490 | M: Mike Frysinger <vapier.adi@gmail.com> |
1491 | L: uclinux-dist-devel@blackfin.uclinux.org | 1491 | L: uclinux-dist-devel@blackfin.uclinux.org |
1492 | W: http://blackfin.uclinux.org | 1492 | W: http://blackfin.uclinux.org |
1493 | S: Supported | 1493 | S: Supported |
1494 | F: drivers/watchdog/bfin_wdt.c | 1494 | F: drivers/watchdog/bfin_wdt.c |
1495 | 1495 | ||
1496 | BLACKFIN I2C TWI DRIVER | 1496 | BLACKFIN I2C TWI DRIVER |
1497 | M: Sonic Zhang <sonic.zhang@analog.com> | 1497 | M: Sonic Zhang <sonic.zhang@analog.com> |
1498 | L: uclinux-dist-devel@blackfin.uclinux.org | 1498 | L: uclinux-dist-devel@blackfin.uclinux.org |
1499 | W: http://blackfin.uclinux.org/ | 1499 | W: http://blackfin.uclinux.org/ |
1500 | S: Supported | 1500 | S: Supported |
1501 | F: drivers/i2c/busses/i2c-bfin-twi.c | 1501 | F: drivers/i2c/busses/i2c-bfin-twi.c |
1502 | 1502 | ||
1503 | BLOCK LAYER | 1503 | BLOCK LAYER |
1504 | M: Jens Axboe <axboe@kernel.dk> | 1504 | M: Jens Axboe <axboe@kernel.dk> |
1505 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-2.6-block.git | 1505 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-2.6-block.git |
1506 | S: Maintained | 1506 | S: Maintained |
1507 | F: block/ | 1507 | F: block/ |
1508 | 1508 | ||
1509 | BLOCK2MTD DRIVER | 1509 | BLOCK2MTD DRIVER |
1510 | M: Joern Engel <joern@lazybastard.org> | 1510 | M: Joern Engel <joern@lazybastard.org> |
1511 | L: linux-mtd@lists.infradead.org | 1511 | L: linux-mtd@lists.infradead.org |
1512 | S: Maintained | 1512 | S: Maintained |
1513 | F: drivers/mtd/devices/block2mtd.c | 1513 | F: drivers/mtd/devices/block2mtd.c |
1514 | 1514 | ||
1515 | BLUETOOTH DRIVERS | 1515 | BLUETOOTH DRIVERS |
1516 | M: Marcel Holtmann <marcel@holtmann.org> | 1516 | M: Marcel Holtmann <marcel@holtmann.org> |
1517 | M: "Gustavo F. Padovan" <padovan@profusion.mobi> | 1517 | M: "Gustavo F. Padovan" <padovan@profusion.mobi> |
1518 | L: linux-bluetooth@vger.kernel.org | 1518 | L: linux-bluetooth@vger.kernel.org |
1519 | W: http://www.bluez.org/ | 1519 | W: http://www.bluez.org/ |
1520 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/padovan/bluetooth-2.6.git | 1520 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/padovan/bluetooth-2.6.git |
1521 | S: Maintained | 1521 | S: Maintained |
1522 | F: drivers/bluetooth/ | 1522 | F: drivers/bluetooth/ |
1523 | 1523 | ||
1524 | BLUETOOTH SUBSYSTEM | 1524 | BLUETOOTH SUBSYSTEM |
1525 | M: Marcel Holtmann <marcel@holtmann.org> | 1525 | M: Marcel Holtmann <marcel@holtmann.org> |
1526 | M: "Gustavo F. Padovan" <padovan@profusion.mobi> | 1526 | M: "Gustavo F. Padovan" <padovan@profusion.mobi> |
1527 | L: linux-bluetooth@vger.kernel.org | 1527 | L: linux-bluetooth@vger.kernel.org |
1528 | W: http://www.bluez.org/ | 1528 | W: http://www.bluez.org/ |
1529 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/padovan/bluetooth-2.6.git | 1529 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/padovan/bluetooth-2.6.git |
1530 | S: Maintained | 1530 | S: Maintained |
1531 | F: net/bluetooth/ | 1531 | F: net/bluetooth/ |
1532 | F: include/net/bluetooth/ | 1532 | F: include/net/bluetooth/ |
1533 | 1533 | ||
1534 | BONDING DRIVER | 1534 | BONDING DRIVER |
1535 | M: Jay Vosburgh <fubar@us.ibm.com> | 1535 | M: Jay Vosburgh <fubar@us.ibm.com> |
1536 | M: Andy Gospodarek <andy@greyhouse.net> | 1536 | M: Andy Gospodarek <andy@greyhouse.net> |
1537 | L: netdev@vger.kernel.org | 1537 | L: netdev@vger.kernel.org |
1538 | W: http://sourceforge.net/projects/bonding/ | 1538 | W: http://sourceforge.net/projects/bonding/ |
1539 | S: Supported | 1539 | S: Supported |
1540 | F: drivers/net/bonding/ | 1540 | F: drivers/net/bonding/ |
1541 | F: include/linux/if_bonding.h | 1541 | F: include/linux/if_bonding.h |
1542 | 1542 | ||
1543 | BROADCOM B44 10/100 ETHERNET DRIVER | 1543 | BROADCOM B44 10/100 ETHERNET DRIVER |
1544 | M: Gary Zambrano <zambrano@broadcom.com> | 1544 | M: Gary Zambrano <zambrano@broadcom.com> |
1545 | L: netdev@vger.kernel.org | 1545 | L: netdev@vger.kernel.org |
1546 | S: Supported | 1546 | S: Supported |
1547 | F: drivers/net/ethernet/broadcom/b44.* | 1547 | F: drivers/net/ethernet/broadcom/b44.* |
1548 | 1548 | ||
1549 | BROADCOM BNX2 GIGABIT ETHERNET DRIVER | 1549 | BROADCOM BNX2 GIGABIT ETHERNET DRIVER |
1550 | M: Michael Chan <mchan@broadcom.com> | 1550 | M: Michael Chan <mchan@broadcom.com> |
1551 | L: netdev@vger.kernel.org | 1551 | L: netdev@vger.kernel.org |
1552 | S: Supported | 1552 | S: Supported |
1553 | F: drivers/net/ethernet/broadcom/bnx2.* | 1553 | F: drivers/net/ethernet/broadcom/bnx2.* |
1554 | F: drivers/net/ethernet/broadcom/bnx2_* | 1554 | F: drivers/net/ethernet/broadcom/bnx2_* |
1555 | 1555 | ||
1556 | BROADCOM BNX2X 10 GIGABIT ETHERNET DRIVER | 1556 | BROADCOM BNX2X 10 GIGABIT ETHERNET DRIVER |
1557 | M: Eilon Greenstein <eilong@broadcom.com> | 1557 | M: Eilon Greenstein <eilong@broadcom.com> |
1558 | L: netdev@vger.kernel.org | 1558 | L: netdev@vger.kernel.org |
1559 | S: Supported | 1559 | S: Supported |
1560 | F: drivers/net/ethernet/broadcom/bnx2x/ | 1560 | F: drivers/net/ethernet/broadcom/bnx2x/ |
1561 | 1561 | ||
1562 | BROADCOM TG3 GIGABIT ETHERNET DRIVER | 1562 | BROADCOM TG3 GIGABIT ETHERNET DRIVER |
1563 | M: Matt Carlson <mcarlson@broadcom.com> | 1563 | M: Matt Carlson <mcarlson@broadcom.com> |
1564 | M: Michael Chan <mchan@broadcom.com> | 1564 | M: Michael Chan <mchan@broadcom.com> |
1565 | L: netdev@vger.kernel.org | 1565 | L: netdev@vger.kernel.org |
1566 | S: Supported | 1566 | S: Supported |
1567 | F: drivers/net/ethernet/broadcom/tg3.* | 1567 | F: drivers/net/ethernet/broadcom/tg3.* |
1568 | 1568 | ||
1569 | BROADCOM BRCM80211 IEEE802.11n WIRELESS DRIVER | 1569 | BROADCOM BRCM80211 IEEE802.11n WIRELESS DRIVER |
1570 | M: Brett Rudley <brudley@broadcom.com> | 1570 | M: Brett Rudley <brudley@broadcom.com> |
1571 | M: Henry Ptasinski <henryp@broadcom.com> | 1571 | M: Henry Ptasinski <henryp@broadcom.com> |
1572 | M: Roland Vossen <rvossen@broadcom.com> | 1572 | M: Roland Vossen <rvossen@broadcom.com> |
1573 | M: Arend van Spriel <arend@broadcom.com> | 1573 | M: Arend van Spriel <arend@broadcom.com> |
1574 | M: Franky (Zhenhui) Lin <frankyl@broadcom.com> | 1574 | M: Franky (Zhenhui) Lin <frankyl@broadcom.com> |
1575 | M: Kan Yan <kanyan@broadcom.com> | 1575 | M: Kan Yan <kanyan@broadcom.com> |
1576 | L: linux-wireless@vger.kernel.org | 1576 | L: linux-wireless@vger.kernel.org |
1577 | S: Supported | 1577 | S: Supported |
1578 | F: drivers/net/wireless/brcm80211/ | 1578 | F: drivers/net/wireless/brcm80211/ |
1579 | 1579 | ||
1580 | BROADCOM BNX2FC 10 GIGABIT FCOE DRIVER | 1580 | BROADCOM BNX2FC 10 GIGABIT FCOE DRIVER |
1581 | M: Bhanu Prakash Gollapudi <bprakash@broadcom.com> | 1581 | M: Bhanu Prakash Gollapudi <bprakash@broadcom.com> |
1582 | L: linux-scsi@vger.kernel.org | 1582 | L: linux-scsi@vger.kernel.org |
1583 | S: Supported | 1583 | S: Supported |
1584 | F: drivers/scsi/bnx2fc/ | 1584 | F: drivers/scsi/bnx2fc/ |
1585 | 1585 | ||
1586 | BROADCOM SPECIFIC AMBA DRIVER (BCMA) | 1586 | BROADCOM SPECIFIC AMBA DRIVER (BCMA) |
1587 | M: Rafaล Miลecki <zajec5@gmail.com> | 1587 | M: Rafaล Miลecki <zajec5@gmail.com> |
1588 | L: linux-wireless@vger.kernel.org | 1588 | L: linux-wireless@vger.kernel.org |
1589 | S: Maintained | 1589 | S: Maintained |
1590 | F: drivers/bcma/ | 1590 | F: drivers/bcma/ |
1591 | F: include/linux/bcma/ | 1591 | F: include/linux/bcma/ |
1592 | 1592 | ||
1593 | BROCADE BFA FC SCSI DRIVER | 1593 | BROCADE BFA FC SCSI DRIVER |
1594 | M: Jing Huang <huangj@brocade.com> | 1594 | M: Jing Huang <huangj@brocade.com> |
1595 | L: linux-scsi@vger.kernel.org | 1595 | L: linux-scsi@vger.kernel.org |
1596 | S: Supported | 1596 | S: Supported |
1597 | F: drivers/scsi/bfa/ | 1597 | F: drivers/scsi/bfa/ |
1598 | 1598 | ||
1599 | BROCADE BNA 10 GIGABIT ETHERNET DRIVER | 1599 | BROCADE BNA 10 GIGABIT ETHERNET DRIVER |
1600 | M: Rasesh Mody <rmody@brocade.com> | 1600 | M: Rasesh Mody <rmody@brocade.com> |
1601 | L: netdev@vger.kernel.org | 1601 | L: netdev@vger.kernel.org |
1602 | S: Supported | 1602 | S: Supported |
1603 | F: drivers/net/ethernet/brocade/bna/ | 1603 | F: drivers/net/ethernet/brocade/bna/ |
1604 | 1604 | ||
1605 | BSG (block layer generic sg v4 driver) | 1605 | BSG (block layer generic sg v4 driver) |
1606 | M: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> | 1606 | M: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> |
1607 | L: linux-scsi@vger.kernel.org | 1607 | L: linux-scsi@vger.kernel.org |
1608 | S: Supported | 1608 | S: Supported |
1609 | F: block/bsg.c | 1609 | F: block/bsg.c |
1610 | F: include/linux/bsg.h | 1610 | F: include/linux/bsg.h |
1611 | 1611 | ||
1612 | BT87X AUDIO DRIVER | 1612 | BT87X AUDIO DRIVER |
1613 | M: Clemens Ladisch <clemens@ladisch.de> | 1613 | M: Clemens Ladisch <clemens@ladisch.de> |
1614 | L: alsa-devel@alsa-project.org (moderated for non-subscribers) | 1614 | L: alsa-devel@alsa-project.org (moderated for non-subscribers) |
1615 | T: git git://git.alsa-project.org/alsa-kernel.git | 1615 | T: git git://git.alsa-project.org/alsa-kernel.git |
1616 | S: Maintained | 1616 | S: Maintained |
1617 | F: Documentation/sound/alsa/Bt87x.txt | 1617 | F: Documentation/sound/alsa/Bt87x.txt |
1618 | F: sound/pci/bt87x.c | 1618 | F: sound/pci/bt87x.c |
1619 | 1619 | ||
1620 | BT8XXGPIO DRIVER | 1620 | BT8XXGPIO DRIVER |
1621 | M: Michael Buesch <m@bues.ch> | 1621 | M: Michael Buesch <m@bues.ch> |
1622 | W: http://bu3sch.de/btgpio.php | 1622 | W: http://bu3sch.de/btgpio.php |
1623 | S: Maintained | 1623 | S: Maintained |
1624 | F: drivers/gpio/gpio-bt8xx.c | 1624 | F: drivers/gpio/gpio-bt8xx.c |
1625 | 1625 | ||
1626 | BTRFS FILE SYSTEM | 1626 | BTRFS FILE SYSTEM |
1627 | M: Chris Mason <chris.mason@oracle.com> | 1627 | M: Chris Mason <chris.mason@oracle.com> |
1628 | L: linux-btrfs@vger.kernel.org | 1628 | L: linux-btrfs@vger.kernel.org |
1629 | W: http://btrfs.wiki.kernel.org/ | 1629 | W: http://btrfs.wiki.kernel.org/ |
1630 | Q: http://patchwork.kernel.org/project/linux-btrfs/list/ | 1630 | Q: http://patchwork.kernel.org/project/linux-btrfs/list/ |
1631 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-unstable.git | 1631 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-unstable.git |
1632 | S: Maintained | 1632 | S: Maintained |
1633 | F: Documentation/filesystems/btrfs.txt | 1633 | F: Documentation/filesystems/btrfs.txt |
1634 | F: fs/btrfs/ | 1634 | F: fs/btrfs/ |
1635 | 1635 | ||
1636 | BTTV VIDEO4LINUX DRIVER | 1636 | BTTV VIDEO4LINUX DRIVER |
1637 | M: Mauro Carvalho Chehab <mchehab@infradead.org> | 1637 | M: Mauro Carvalho Chehab <mchehab@infradead.org> |
1638 | L: linux-media@vger.kernel.org | 1638 | L: linux-media@vger.kernel.org |
1639 | W: http://linuxtv.org | 1639 | W: http://linuxtv.org |
1640 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git | 1640 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git |
1641 | S: Maintained | 1641 | S: Maintained |
1642 | F: Documentation/video4linux/bttv/ | 1642 | F: Documentation/video4linux/bttv/ |
1643 | F: drivers/media/video/bt8xx/bttv* | 1643 | F: drivers/media/video/bt8xx/bttv* |
1644 | 1644 | ||
1645 | C-MEDIA CMI8788 DRIVER | 1645 | C-MEDIA CMI8788 DRIVER |
1646 | M: Clemens Ladisch <clemens@ladisch.de> | 1646 | M: Clemens Ladisch <clemens@ladisch.de> |
1647 | L: alsa-devel@alsa-project.org (moderated for non-subscribers) | 1647 | L: alsa-devel@alsa-project.org (moderated for non-subscribers) |
1648 | T: git git://git.alsa-project.org/alsa-kernel.git | 1648 | T: git git://git.alsa-project.org/alsa-kernel.git |
1649 | S: Maintained | 1649 | S: Maintained |
1650 | F: sound/pci/oxygen/ | 1650 | F: sound/pci/oxygen/ |
1651 | 1651 | ||
1652 | C6X ARCHITECTURE | 1652 | C6X ARCHITECTURE |
1653 | M: Mark Salter <msalter@redhat.com> | 1653 | M: Mark Salter <msalter@redhat.com> |
1654 | M: Aurelien Jacquiot <a-jacquiot@ti.com> | 1654 | M: Aurelien Jacquiot <a-jacquiot@ti.com> |
1655 | L: linux-c6x-dev@linux-c6x.org | 1655 | L: linux-c6x-dev@linux-c6x.org |
1656 | W: http://www.linux-c6x.org/wiki/index.php/Main_Page | 1656 | W: http://www.linux-c6x.org/wiki/index.php/Main_Page |
1657 | S: Maintained | 1657 | S: Maintained |
1658 | F: arch/c6x/ | 1658 | F: arch/c6x/ |
1659 | 1659 | ||
1660 | CACHEFILES: FS-CACHE BACKEND FOR CACHING ON MOUNTED FILESYSTEMS | 1660 | CACHEFILES: FS-CACHE BACKEND FOR CACHING ON MOUNTED FILESYSTEMS |
1661 | M: David Howells <dhowells@redhat.com> | 1661 | M: David Howells <dhowells@redhat.com> |
1662 | L: linux-cachefs@redhat.com | 1662 | L: linux-cachefs@redhat.com |
1663 | S: Supported | 1663 | S: Supported |
1664 | F: Documentation/filesystems/caching/cachefiles.txt | 1664 | F: Documentation/filesystems/caching/cachefiles.txt |
1665 | F: fs/cachefiles/ | 1665 | F: fs/cachefiles/ |
1666 | 1666 | ||
1667 | CAFE CMOS INTEGRATED CAMERA CONTROLLER DRIVER | 1667 | CAFE CMOS INTEGRATED CAMERA CONTROLLER DRIVER |
1668 | M: Jonathan Corbet <corbet@lwn.net> | 1668 | M: Jonathan Corbet <corbet@lwn.net> |
1669 | L: linux-media@vger.kernel.org | 1669 | L: linux-media@vger.kernel.org |
1670 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git | 1670 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git |
1671 | S: Maintained | 1671 | S: Maintained |
1672 | F: Documentation/video4linux/cafe_ccic | 1672 | F: Documentation/video4linux/cafe_ccic |
1673 | F: drivers/media/video/marvell-ccic/ | 1673 | F: drivers/media/video/marvell-ccic/ |
1674 | 1674 | ||
1675 | CAIF NETWORK LAYER | 1675 | CAIF NETWORK LAYER |
1676 | M: Sjur Braendeland <sjur.brandeland@stericsson.com> | 1676 | M: Sjur Braendeland <sjur.brandeland@stericsson.com> |
1677 | L: netdev@vger.kernel.org | 1677 | L: netdev@vger.kernel.org |
1678 | S: Supported | 1678 | S: Supported |
1679 | F: Documentation/networking/caif/ | 1679 | F: Documentation/networking/caif/ |
1680 | F: drivers/net/caif/ | 1680 | F: drivers/net/caif/ |
1681 | F: include/linux/caif/ | 1681 | F: include/linux/caif/ |
1682 | F: include/net/caif/ | 1682 | F: include/net/caif/ |
1683 | F: net/caif/ | 1683 | F: net/caif/ |
1684 | 1684 | ||
1685 | CALGARY x86-64 IOMMU | 1685 | CALGARY x86-64 IOMMU |
1686 | M: Muli Ben-Yehuda <muli@il.ibm.com> | 1686 | M: Muli Ben-Yehuda <muli@il.ibm.com> |
1687 | M: "Jon D. Mason" <jdmason@kudzu.us> | 1687 | M: "Jon D. Mason" <jdmason@kudzu.us> |
1688 | L: discuss@x86-64.org | 1688 | L: discuss@x86-64.org |
1689 | S: Maintained | 1689 | S: Maintained |
1690 | F: arch/x86/kernel/pci-calgary_64.c | 1690 | F: arch/x86/kernel/pci-calgary_64.c |
1691 | F: arch/x86/kernel/tce_64.c | 1691 | F: arch/x86/kernel/tce_64.c |
1692 | F: arch/x86/include/asm/calgary.h | 1692 | F: arch/x86/include/asm/calgary.h |
1693 | F: arch/x86/include/asm/tce.h | 1693 | F: arch/x86/include/asm/tce.h |
1694 | 1694 | ||
1695 | CAN NETWORK LAYER | 1695 | CAN NETWORK LAYER |
1696 | M: Oliver Hartkopp <socketcan@hartkopp.net> | 1696 | M: Oliver Hartkopp <socketcan@hartkopp.net> |
1697 | L: linux-can@vger.kernel.org | 1697 | L: linux-can@vger.kernel.org |
1698 | W: http://gitorious.org/linux-can | 1698 | W: http://gitorious.org/linux-can |
1699 | T: git git://gitorious.org/linux-can/linux-can-next.git | 1699 | T: git git://gitorious.org/linux-can/linux-can-next.git |
1700 | S: Maintained | 1700 | S: Maintained |
1701 | F: net/can/ | 1701 | F: net/can/ |
1702 | F: include/linux/can.h | 1702 | F: include/linux/can.h |
1703 | F: include/linux/can/core.h | 1703 | F: include/linux/can/core.h |
1704 | F: include/linux/can/bcm.h | 1704 | F: include/linux/can/bcm.h |
1705 | F: include/linux/can/raw.h | 1705 | F: include/linux/can/raw.h |
1706 | F: include/linux/can/gw.h | 1706 | F: include/linux/can/gw.h |
1707 | 1707 | ||
1708 | CAN NETWORK DRIVERS | 1708 | CAN NETWORK DRIVERS |
1709 | M: Wolfgang Grandegger <wg@grandegger.com> | 1709 | M: Wolfgang Grandegger <wg@grandegger.com> |
1710 | M: Marc Kleine-Budde <mkl@pengutronix.de> | 1710 | M: Marc Kleine-Budde <mkl@pengutronix.de> |
1711 | L: linux-can@vger.kernel.org | 1711 | L: linux-can@vger.kernel.org |
1712 | W: http://gitorious.org/linux-can | 1712 | W: http://gitorious.org/linux-can |
1713 | T: git git://gitorious.org/linux-can/linux-can-next.git | 1713 | T: git git://gitorious.org/linux-can/linux-can-next.git |
1714 | S: Maintained | 1714 | S: Maintained |
1715 | F: drivers/net/can/ | 1715 | F: drivers/net/can/ |
1716 | F: include/linux/can/dev.h | 1716 | F: include/linux/can/dev.h |
1717 | F: include/linux/can/error.h | 1717 | F: include/linux/can/error.h |
1718 | F: include/linux/can/netlink.h | 1718 | F: include/linux/can/netlink.h |
1719 | F: include/linux/can/platform/ | 1719 | F: include/linux/can/platform/ |
1720 | 1720 | ||
1721 | CELL BROADBAND ENGINE ARCHITECTURE | 1721 | CELL BROADBAND ENGINE ARCHITECTURE |
1722 | M: Arnd Bergmann <arnd@arndb.de> | 1722 | M: Arnd Bergmann <arnd@arndb.de> |
1723 | L: linuxppc-dev@lists.ozlabs.org | 1723 | L: linuxppc-dev@lists.ozlabs.org |
1724 | L: cbe-oss-dev@lists.ozlabs.org | 1724 | L: cbe-oss-dev@lists.ozlabs.org |
1725 | W: http://www.ibm.com/developerworks/power/cell/ | 1725 | W: http://www.ibm.com/developerworks/power/cell/ |
1726 | S: Supported | 1726 | S: Supported |
1727 | F: arch/powerpc/include/asm/cell*.h | 1727 | F: arch/powerpc/include/asm/cell*.h |
1728 | F: arch/powerpc/include/asm/spu*.h | 1728 | F: arch/powerpc/include/asm/spu*.h |
1729 | F: arch/powerpc/oprofile/*cell* | 1729 | F: arch/powerpc/oprofile/*cell* |
1730 | F: arch/powerpc/platforms/cell/ | 1730 | F: arch/powerpc/platforms/cell/ |
1731 | 1731 | ||
1732 | CEPH DISTRIBUTED FILE SYSTEM CLIENT | 1732 | CEPH DISTRIBUTED FILE SYSTEM CLIENT |
1733 | M: Sage Weil <sage@newdream.net> | 1733 | M: Sage Weil <sage@newdream.net> |
1734 | L: ceph-devel@vger.kernel.org | 1734 | L: ceph-devel@vger.kernel.org |
1735 | W: http://ceph.newdream.net/ | 1735 | W: http://ceph.newdream.net/ |
1736 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client.git | 1736 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client.git |
1737 | S: Supported | 1737 | S: Supported |
1738 | F: Documentation/filesystems/ceph.txt | 1738 | F: Documentation/filesystems/ceph.txt |
1739 | F: fs/ceph | 1739 | F: fs/ceph |
1740 | F: net/ceph | 1740 | F: net/ceph |
1741 | F: include/linux/ceph | 1741 | F: include/linux/ceph |
1742 | 1742 | ||
1743 | CERTIFIED WIRELESS USB (WUSB) SUBSYSTEM: | 1743 | CERTIFIED WIRELESS USB (WUSB) SUBSYSTEM: |
1744 | L: linux-usb@vger.kernel.org | 1744 | L: linux-usb@vger.kernel.org |
1745 | S: Orphan | 1745 | S: Orphan |
1746 | F: Documentation/usb/WUSB-Design-overview.txt | 1746 | F: Documentation/usb/WUSB-Design-overview.txt |
1747 | F: Documentation/usb/wusb-cbaf | 1747 | F: Documentation/usb/wusb-cbaf |
1748 | F: drivers/usb/host/hwa-hc.c | 1748 | F: drivers/usb/host/hwa-hc.c |
1749 | F: drivers/usb/host/whci/ | 1749 | F: drivers/usb/host/whci/ |
1750 | F: drivers/usb/wusbcore/ | 1750 | F: drivers/usb/wusbcore/ |
1751 | F: include/linux/usb/wusb* | 1751 | F: include/linux/usb/wusb* |
1752 | 1752 | ||
1753 | CFAG12864B LCD DRIVER | 1753 | CFAG12864B LCD DRIVER |
1754 | M: Miguel Ojeda Sandonis <miguel.ojeda.sandonis@gmail.com> | 1754 | M: Miguel Ojeda Sandonis <miguel.ojeda.sandonis@gmail.com> |
1755 | W: http://miguelojeda.es/auxdisplay.htm | 1755 | W: http://miguelojeda.es/auxdisplay.htm |
1756 | W: http://jair.lab.fi.uva.es/~migojed/auxdisplay.htm | 1756 | W: http://jair.lab.fi.uva.es/~migojed/auxdisplay.htm |
1757 | S: Maintained | 1757 | S: Maintained |
1758 | F: drivers/auxdisplay/cfag12864b.c | 1758 | F: drivers/auxdisplay/cfag12864b.c |
1759 | F: include/linux/cfag12864b.h | 1759 | F: include/linux/cfag12864b.h |
1760 | 1760 | ||
1761 | CFAG12864BFB LCD FRAMEBUFFER DRIVER | 1761 | CFAG12864BFB LCD FRAMEBUFFER DRIVER |
1762 | M: Miguel Ojeda Sandonis <miguel.ojeda.sandonis@gmail.com> | 1762 | M: Miguel Ojeda Sandonis <miguel.ojeda.sandonis@gmail.com> |
1763 | W: http://miguelojeda.es/auxdisplay.htm | 1763 | W: http://miguelojeda.es/auxdisplay.htm |
1764 | W: http://jair.lab.fi.uva.es/~migojed/auxdisplay.htm | 1764 | W: http://jair.lab.fi.uva.es/~migojed/auxdisplay.htm |
1765 | S: Maintained | 1765 | S: Maintained |
1766 | F: drivers/auxdisplay/cfag12864bfb.c | 1766 | F: drivers/auxdisplay/cfag12864bfb.c |
1767 | F: include/linux/cfag12864b.h | 1767 | F: include/linux/cfag12864b.h |
1768 | 1768 | ||
1769 | CFG80211 and NL80211 | 1769 | CFG80211 and NL80211 |
1770 | M: Johannes Berg <johannes@sipsolutions.net> | 1770 | M: Johannes Berg <johannes@sipsolutions.net> |
1771 | L: linux-wireless@vger.kernel.org | 1771 | L: linux-wireless@vger.kernel.org |
1772 | S: Maintained | 1772 | S: Maintained |
1773 | F: include/linux/nl80211.h | 1773 | F: include/linux/nl80211.h |
1774 | F: include/net/cfg80211.h | 1774 | F: include/net/cfg80211.h |
1775 | F: net/wireless/* | 1775 | F: net/wireless/* |
1776 | X: net/wireless/wext* | 1776 | X: net/wireless/wext* |
1777 | 1777 | ||
1778 | CHAR and MISC DRIVERS | 1778 | CHAR and MISC DRIVERS |
1779 | M: Arnd Bergmann <arnd@arndb.de> | 1779 | M: Arnd Bergmann <arnd@arndb.de> |
1780 | M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 1780 | M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
1781 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git | 1781 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git |
1782 | S: Supported | 1782 | S: Supported |
1783 | F: drivers/char/* | 1783 | F: drivers/char/* |
1784 | F: drivers/misc/* | 1784 | F: drivers/misc/* |
1785 | 1785 | ||
1786 | CHECKPATCH | 1786 | CHECKPATCH |
1787 | M: Andy Whitcroft <apw@canonical.com> | 1787 | M: Andy Whitcroft <apw@canonical.com> |
1788 | S: Supported | 1788 | S: Supported |
1789 | F: scripts/checkpatch.pl | 1789 | F: scripts/checkpatch.pl |
1790 | 1790 | ||
1791 | CHINESE DOCUMENTATION | 1791 | CHINESE DOCUMENTATION |
1792 | M: Harry Wei <harryxiyou@gmail.com> | 1792 | M: Harry Wei <harryxiyou@gmail.com> |
1793 | L: xiyoulinuxkernelgroup@googlegroups.com | 1793 | L: xiyoulinuxkernelgroup@googlegroups.com |
1794 | L: linux-kernel@zh-kernel.org (moderated for non-subscribers) | 1794 | L: linux-kernel@zh-kernel.org (moderated for non-subscribers) |
1795 | S: Maintained | 1795 | S: Maintained |
1796 | F: Documentation/zh_CN/ | 1796 | F: Documentation/zh_CN/ |
1797 | 1797 | ||
1798 | CISCO VIC ETHERNET NIC DRIVER | 1798 | CISCO VIC ETHERNET NIC DRIVER |
1799 | M: Christian Benvenuti <benve@cisco.com> | 1799 | M: Christian Benvenuti <benve@cisco.com> |
1800 | M: Roopa Prabhu <roprabhu@cisco.com> | 1800 | M: Roopa Prabhu <roprabhu@cisco.com> |
1801 | M: David Wang <dwang2@cisco.com> | 1801 | M: David Wang <dwang2@cisco.com> |
1802 | S: Supported | 1802 | S: Supported |
1803 | F: drivers/net/ethernet/cisco/enic/ | 1803 | F: drivers/net/ethernet/cisco/enic/ |
1804 | 1804 | ||
1805 | CIRRUS LOGIC EP93XX ETHERNET DRIVER | 1805 | CIRRUS LOGIC EP93XX ETHERNET DRIVER |
1806 | M: Hartley Sweeten <hsweeten@visionengravers.com> | 1806 | M: Hartley Sweeten <hsweeten@visionengravers.com> |
1807 | L: netdev@vger.kernel.org | 1807 | L: netdev@vger.kernel.org |
1808 | S: Maintained | 1808 | S: Maintained |
1809 | F: drivers/net/ethernet/cirrus/ep93xx_eth.c | 1809 | F: drivers/net/ethernet/cirrus/ep93xx_eth.c |
1810 | 1810 | ||
1811 | CIRRUS LOGIC EP93XX OHCI USB HOST DRIVER | 1811 | CIRRUS LOGIC EP93XX OHCI USB HOST DRIVER |
1812 | M: Lennert Buytenhek <kernel@wantstofly.org> | 1812 | M: Lennert Buytenhek <kernel@wantstofly.org> |
1813 | L: linux-usb@vger.kernel.org | 1813 | L: linux-usb@vger.kernel.org |
1814 | S: Maintained | 1814 | S: Maintained |
1815 | F: drivers/usb/host/ohci-ep93xx.c | 1815 | F: drivers/usb/host/ohci-ep93xx.c |
1816 | 1816 | ||
1817 | CIRRUS LOGIC CS4270 SOUND DRIVER | 1817 | CIRRUS LOGIC CS4270 SOUND DRIVER |
1818 | M: Timur Tabi <timur@freescale.com> | 1818 | M: Timur Tabi <timur@freescale.com> |
1819 | L: alsa-devel@alsa-project.org (moderated for non-subscribers) | 1819 | L: alsa-devel@alsa-project.org (moderated for non-subscribers) |
1820 | S: Supported | 1820 | S: Supported |
1821 | F: sound/soc/codecs/cs4270* | 1821 | F: sound/soc/codecs/cs4270* |
1822 | 1822 | ||
1823 | CLK API | 1823 | CLK API |
1824 | M: Russell King <linux@arm.linux.org.uk> | 1824 | M: Russell King <linux@arm.linux.org.uk> |
1825 | F: include/linux/clk.h | 1825 | F: include/linux/clk.h |
1826 | 1826 | ||
1827 | CISCO FCOE HBA DRIVER | 1827 | CISCO FCOE HBA DRIVER |
1828 | M: Abhijeet Joglekar <abjoglek@cisco.com> | 1828 | M: Abhijeet Joglekar <abjoglek@cisco.com> |
1829 | M: Venkata Siva Vijayendra Bhamidipati <vbhamidi@cisco.com> | 1829 | M: Venkata Siva Vijayendra Bhamidipati <vbhamidi@cisco.com> |
1830 | M: Brian Uchino <buchino@cisco.com> | 1830 | M: Brian Uchino <buchino@cisco.com> |
1831 | L: linux-scsi@vger.kernel.org | 1831 | L: linux-scsi@vger.kernel.org |
1832 | S: Supported | 1832 | S: Supported |
1833 | F: drivers/scsi/fnic/ | 1833 | F: drivers/scsi/fnic/ |
1834 | 1834 | ||
1835 | CMPC ACPI DRIVER | 1835 | CMPC ACPI DRIVER |
1836 | M: Thadeu Lima de Souza Cascardo <cascardo@holoscopio.com> | 1836 | M: Thadeu Lima de Souza Cascardo <cascardo@holoscopio.com> |
1837 | M: Daniel Oliveira Nascimento <don@syst.com.br> | 1837 | M: Daniel Oliveira Nascimento <don@syst.com.br> |
1838 | L: platform-driver-x86@vger.kernel.org | 1838 | L: platform-driver-x86@vger.kernel.org |
1839 | S: Supported | 1839 | S: Supported |
1840 | F: drivers/platform/x86/classmate-laptop.c | 1840 | F: drivers/platform/x86/classmate-laptop.c |
1841 | 1841 | ||
1842 | COCCINELLE/Semantic Patches (SmPL) | 1842 | COCCINELLE/Semantic Patches (SmPL) |
1843 | M: Julia Lawall <julia@diku.dk> | 1843 | M: Julia Lawall <julia@diku.dk> |
1844 | M: Gilles Muller <Gilles.Muller@lip6.fr> | 1844 | M: Gilles Muller <Gilles.Muller@lip6.fr> |
1845 | M: Nicolas Palix <npalix.work@gmail.com> | 1845 | M: Nicolas Palix <npalix.work@gmail.com> |
1846 | L: cocci@diku.dk (moderated for non-subscribers) | 1846 | L: cocci@diku.dk (moderated for non-subscribers) |
1847 | W: http://coccinelle.lip6.fr/ | 1847 | W: http://coccinelle.lip6.fr/ |
1848 | S: Supported | 1848 | S: Supported |
1849 | F: scripts/coccinelle/ | 1849 | F: scripts/coccinelle/ |
1850 | F: scripts/coccicheck | 1850 | F: scripts/coccicheck |
1851 | 1851 | ||
1852 | CODA FILE SYSTEM | 1852 | CODA FILE SYSTEM |
1853 | M: Jan Harkes <jaharkes@cs.cmu.edu> | 1853 | M: Jan Harkes <jaharkes@cs.cmu.edu> |
1854 | M: coda@cs.cmu.edu | 1854 | M: coda@cs.cmu.edu |
1855 | L: codalist@coda.cs.cmu.edu | 1855 | L: codalist@coda.cs.cmu.edu |
1856 | W: http://www.coda.cs.cmu.edu/ | 1856 | W: http://www.coda.cs.cmu.edu/ |
1857 | S: Maintained | 1857 | S: Maintained |
1858 | F: Documentation/filesystems/coda.txt | 1858 | F: Documentation/filesystems/coda.txt |
1859 | F: fs/coda/ | 1859 | F: fs/coda/ |
1860 | F: include/linux/coda*.h | 1860 | F: include/linux/coda*.h |
1861 | 1861 | ||
1862 | COMMON INTERNET FILE SYSTEM (CIFS) | 1862 | COMMON INTERNET FILE SYSTEM (CIFS) |
1863 | M: Steve French <sfrench@samba.org> | 1863 | M: Steve French <sfrench@samba.org> |
1864 | L: linux-cifs@vger.kernel.org | 1864 | L: linux-cifs@vger.kernel.org |
1865 | L: samba-technical@lists.samba.org (moderated for non-subscribers) | 1865 | L: samba-technical@lists.samba.org (moderated for non-subscribers) |
1866 | W: http://linux-cifs.samba.org/ | 1866 | W: http://linux-cifs.samba.org/ |
1867 | Q: http://patchwork.ozlabs.org/project/linux-cifs-client/list/ | 1867 | Q: http://patchwork.ozlabs.org/project/linux-cifs-client/list/ |
1868 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6.git | 1868 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6.git |
1869 | S: Supported | 1869 | S: Supported |
1870 | F: Documentation/filesystems/cifs.txt | 1870 | F: Documentation/filesystems/cifs.txt |
1871 | F: fs/cifs/ | 1871 | F: fs/cifs/ |
1872 | 1872 | ||
1873 | COMPACTPCI HOTPLUG CORE | 1873 | COMPACTPCI HOTPLUG CORE |
1874 | M: Scott Murray <scott@spiteful.org> | 1874 | M: Scott Murray <scott@spiteful.org> |
1875 | L: linux-pci@vger.kernel.org | 1875 | L: linux-pci@vger.kernel.org |
1876 | S: Maintained | 1876 | S: Maintained |
1877 | F: drivers/pci/hotplug/cpci_hotplug* | 1877 | F: drivers/pci/hotplug/cpci_hotplug* |
1878 | 1878 | ||
1879 | COMPACTPCI HOTPLUG ZIATECH ZT5550 DRIVER | 1879 | COMPACTPCI HOTPLUG ZIATECH ZT5550 DRIVER |
1880 | M: Scott Murray <scott@spiteful.org> | 1880 | M: Scott Murray <scott@spiteful.org> |
1881 | L: linux-pci@vger.kernel.org | 1881 | L: linux-pci@vger.kernel.org |
1882 | S: Maintained | 1882 | S: Maintained |
1883 | F: drivers/pci/hotplug/cpcihp_zt5550.* | 1883 | F: drivers/pci/hotplug/cpcihp_zt5550.* |
1884 | 1884 | ||
1885 | COMPACTPCI HOTPLUG GENERIC DRIVER | 1885 | COMPACTPCI HOTPLUG GENERIC DRIVER |
1886 | M: Scott Murray <scott@spiteful.org> | 1886 | M: Scott Murray <scott@spiteful.org> |
1887 | L: linux-pci@vger.kernel.org | 1887 | L: linux-pci@vger.kernel.org |
1888 | S: Maintained | 1888 | S: Maintained |
1889 | F: drivers/pci/hotplug/cpcihp_generic.c | 1889 | F: drivers/pci/hotplug/cpcihp_generic.c |
1890 | 1890 | ||
1891 | COMPAL LAPTOP SUPPORT | 1891 | COMPAL LAPTOP SUPPORT |
1892 | M: Cezary Jackiewicz <cezary.jackiewicz@gmail.com> | 1892 | M: Cezary Jackiewicz <cezary.jackiewicz@gmail.com> |
1893 | L: platform-driver-x86@vger.kernel.org | 1893 | L: platform-driver-x86@vger.kernel.org |
1894 | S: Maintained | 1894 | S: Maintained |
1895 | F: drivers/platform/x86/compal-laptop.c | 1895 | F: drivers/platform/x86/compal-laptop.c |
1896 | 1896 | ||
1897 | CONEXANT ACCESSRUNNER USB DRIVER | 1897 | CONEXANT ACCESSRUNNER USB DRIVER |
1898 | M: Simon Arlott <cxacru@fire.lp0.eu> | 1898 | M: Simon Arlott <cxacru@fire.lp0.eu> |
1899 | L: accessrunner-general@lists.sourceforge.net | 1899 | L: accessrunner-general@lists.sourceforge.net |
1900 | W: http://accessrunner.sourceforge.net/ | 1900 | W: http://accessrunner.sourceforge.net/ |
1901 | S: Maintained | 1901 | S: Maintained |
1902 | F: drivers/usb/atm/cxacru.c | 1902 | F: drivers/usb/atm/cxacru.c |
1903 | 1903 | ||
1904 | CONFIGFS | 1904 | CONFIGFS |
1905 | M: Joel Becker <jlbec@evilplan.org> | 1905 | M: Joel Becker <jlbec@evilplan.org> |
1906 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jlbec/configfs.git | 1906 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jlbec/configfs.git |
1907 | S: Supported | 1907 | S: Supported |
1908 | F: fs/configfs/ | 1908 | F: fs/configfs/ |
1909 | F: include/linux/configfs.h | 1909 | F: include/linux/configfs.h |
1910 | 1910 | ||
1911 | CONNECTOR | 1911 | CONNECTOR |
1912 | M: Evgeniy Polyakov <zbr@ioremap.net> | 1912 | M: Evgeniy Polyakov <zbr@ioremap.net> |
1913 | L: netdev@vger.kernel.org | 1913 | L: netdev@vger.kernel.org |
1914 | S: Maintained | 1914 | S: Maintained |
1915 | F: drivers/connector/ | 1915 | F: drivers/connector/ |
1916 | 1916 | ||
1917 | CONTROL GROUPS (CGROUPS) | 1917 | CONTROL GROUPS (CGROUPS) |
1918 | M: Tejun Heo <tj@kernel.org> | 1918 | M: Tejun Heo <tj@kernel.org> |
1919 | M: Li Zefan <lizf@cn.fujitsu.com> | 1919 | M: Li Zefan <lizf@cn.fujitsu.com> |
1920 | L: containers@lists.linux-foundation.org | 1920 | L: containers@lists.linux-foundation.org |
1921 | L: cgroups@vger.kernel.org | 1921 | L: cgroups@vger.kernel.org |
1922 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup.git | 1922 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup.git |
1923 | S: Maintained | 1923 | S: Maintained |
1924 | F: include/linux/cgroup* | 1924 | F: include/linux/cgroup* |
1925 | F: kernel/cgroup* | 1925 | F: kernel/cgroup* |
1926 | F: mm/*cgroup* | 1926 | F: mm/*cgroup* |
1927 | 1927 | ||
1928 | CORETEMP HARDWARE MONITORING DRIVER | 1928 | CORETEMP HARDWARE MONITORING DRIVER |
1929 | M: Fenghua Yu <fenghua.yu@intel.com> | 1929 | M: Fenghua Yu <fenghua.yu@intel.com> |
1930 | L: lm-sensors@lm-sensors.org | 1930 | L: lm-sensors@lm-sensors.org |
1931 | S: Maintained | 1931 | S: Maintained |
1932 | F: Documentation/hwmon/coretemp | 1932 | F: Documentation/hwmon/coretemp |
1933 | F: drivers/hwmon/coretemp.c | 1933 | F: drivers/hwmon/coretemp.c |
1934 | 1934 | ||
1935 | COSA/SRP SYNC SERIAL DRIVER | 1935 | COSA/SRP SYNC SERIAL DRIVER |
1936 | M: Jan "Yenya" Kasprzak <kas@fi.muni.cz> | 1936 | M: Jan "Yenya" Kasprzak <kas@fi.muni.cz> |
1937 | W: http://www.fi.muni.cz/~kas/cosa/ | 1937 | W: http://www.fi.muni.cz/~kas/cosa/ |
1938 | S: Maintained | 1938 | S: Maintained |
1939 | F: drivers/net/wan/cosa* | 1939 | F: drivers/net/wan/cosa* |
1940 | 1940 | ||
1941 | CPMAC ETHERNET DRIVER | 1941 | CPMAC ETHERNET DRIVER |
1942 | M: Florian Fainelli <florian@openwrt.org> | 1942 | M: Florian Fainelli <florian@openwrt.org> |
1943 | L: netdev@vger.kernel.org | 1943 | L: netdev@vger.kernel.org |
1944 | S: Maintained | 1944 | S: Maintained |
1945 | F: drivers/net/ethernet/ti/cpmac.c | 1945 | F: drivers/net/ethernet/ti/cpmac.c |
1946 | 1946 | ||
1947 | CPU FREQUENCY DRIVERS | 1947 | CPU FREQUENCY DRIVERS |
1948 | M: Dave Jones <davej@redhat.com> | 1948 | M: Dave Jones <davej@redhat.com> |
1949 | L: cpufreq@vger.kernel.org | 1949 | L: cpufreq@vger.kernel.org |
1950 | W: http://www.codemonkey.org.uk/projects/cpufreq/ | 1950 | W: http://www.codemonkey.org.uk/projects/cpufreq/ |
1951 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/davej/cpufreq.git | 1951 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/davej/cpufreq.git |
1952 | S: Maintained | 1952 | S: Maintained |
1953 | F: drivers/cpufreq/ | 1953 | F: drivers/cpufreq/ |
1954 | F: include/linux/cpufreq.h | 1954 | F: include/linux/cpufreq.h |
1955 | 1955 | ||
1956 | CPUID/MSR DRIVER | 1956 | CPUID/MSR DRIVER |
1957 | M: "H. Peter Anvin" <hpa@zytor.com> | 1957 | M: "H. Peter Anvin" <hpa@zytor.com> |
1958 | S: Maintained | 1958 | S: Maintained |
1959 | F: arch/x86/kernel/cpuid.c | 1959 | F: arch/x86/kernel/cpuid.c |
1960 | F: arch/x86/kernel/msr.c | 1960 | F: arch/x86/kernel/msr.c |
1961 | 1961 | ||
1962 | CPU POWER MONITORING SUBSYSTEM | 1962 | CPU POWER MONITORING SUBSYSTEM |
1963 | M: Dominik Brodowski <linux@dominikbrodowski.net> | 1963 | M: Dominik Brodowski <linux@dominikbrodowski.net> |
1964 | M: Thomas Renninger <trenn@suse.de> | 1964 | M: Thomas Renninger <trenn@suse.de> |
1965 | S: Maintained | 1965 | S: Maintained |
1966 | F: tools/power/cpupower | 1966 | F: tools/power/cpupower |
1967 | 1967 | ||
1968 | CPUSETS | 1968 | CPUSETS |
1969 | M: Paul Menage <paul@paulmenage.org> | 1969 | M: Paul Menage <paul@paulmenage.org> |
1970 | W: http://www.bullopensource.org/cpuset/ | 1970 | W: http://www.bullopensource.org/cpuset/ |
1971 | W: http://oss.sgi.com/projects/cpusets/ | 1971 | W: http://oss.sgi.com/projects/cpusets/ |
1972 | S: Supported | 1972 | S: Supported |
1973 | F: Documentation/cgroups/cpusets.txt | 1973 | F: Documentation/cgroups/cpusets.txt |
1974 | F: include/linux/cpuset.h | 1974 | F: include/linux/cpuset.h |
1975 | F: kernel/cpuset.c | 1975 | F: kernel/cpuset.c |
1976 | 1976 | ||
1977 | CRAMFS FILESYSTEM | 1977 | CRAMFS FILESYSTEM |
1978 | W: http://sourceforge.net/projects/cramfs/ | 1978 | W: http://sourceforge.net/projects/cramfs/ |
1979 | S: Orphan | 1979 | S: Orphan |
1980 | F: Documentation/filesystems/cramfs.txt | 1980 | F: Documentation/filesystems/cramfs.txt |
1981 | F: fs/cramfs/ | 1981 | F: fs/cramfs/ |
1982 | 1982 | ||
1983 | CRIS PORT | 1983 | CRIS PORT |
1984 | M: Mikael Starvik <starvik@axis.com> | 1984 | M: Mikael Starvik <starvik@axis.com> |
1985 | M: Jesper Nilsson <jesper.nilsson@axis.com> | 1985 | M: Jesper Nilsson <jesper.nilsson@axis.com> |
1986 | L: linux-cris-kernel@axis.com | 1986 | L: linux-cris-kernel@axis.com |
1987 | W: http://developer.axis.com | 1987 | W: http://developer.axis.com |
1988 | S: Maintained | 1988 | S: Maintained |
1989 | F: arch/cris/ | 1989 | F: arch/cris/ |
1990 | F: drivers/tty/serial/crisv10.* | 1990 | F: drivers/tty/serial/crisv10.* |
1991 | 1991 | ||
1992 | CRYPTO API | 1992 | CRYPTO API |
1993 | M: Herbert Xu <herbert@gondor.apana.org.au> | 1993 | M: Herbert Xu <herbert@gondor.apana.org.au> |
1994 | M: "David S. Miller" <davem@davemloft.net> | 1994 | M: "David S. Miller" <davem@davemloft.net> |
1995 | L: linux-crypto@vger.kernel.org | 1995 | L: linux-crypto@vger.kernel.org |
1996 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6.git | 1996 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6.git |
1997 | S: Maintained | 1997 | S: Maintained |
1998 | F: Documentation/crypto/ | 1998 | F: Documentation/crypto/ |
1999 | F: arch/*/crypto/ | 1999 | F: arch/*/crypto/ |
2000 | F: crypto/ | 2000 | F: crypto/ |
2001 | F: drivers/crypto/ | 2001 | F: drivers/crypto/ |
2002 | F: include/crypto/ | 2002 | F: include/crypto/ |
2003 | 2003 | ||
2004 | CRYPTOGRAPHIC RANDOM NUMBER GENERATOR | 2004 | CRYPTOGRAPHIC RANDOM NUMBER GENERATOR |
2005 | M: Neil Horman <nhorman@tuxdriver.com> | 2005 | M: Neil Horman <nhorman@tuxdriver.com> |
2006 | L: linux-crypto@vger.kernel.org | 2006 | L: linux-crypto@vger.kernel.org |
2007 | S: Maintained | 2007 | S: Maintained |
2008 | F: crypto/ansi_cprng.c | 2008 | F: crypto/ansi_cprng.c |
2009 | F: crypto/rng.c | 2009 | F: crypto/rng.c |
2010 | 2010 | ||
2011 | CS5535 Audio ALSA driver | 2011 | CS5535 Audio ALSA driver |
2012 | M: Jaya Kumar <jayakumar.alsa@gmail.com> | 2012 | M: Jaya Kumar <jayakumar.alsa@gmail.com> |
2013 | S: Maintained | 2013 | S: Maintained |
2014 | F: sound/pci/cs5535audio/ | 2014 | F: sound/pci/cs5535audio/ |
2015 | 2015 | ||
2016 | CX18 VIDEO4LINUX DRIVER | 2016 | CX18 VIDEO4LINUX DRIVER |
2017 | M: Andy Walls <awalls@md.metrocast.net> | 2017 | M: Andy Walls <awalls@md.metrocast.net> |
2018 | L: ivtv-devel@ivtvdriver.org (moderated for non-subscribers) | 2018 | L: ivtv-devel@ivtvdriver.org (moderated for non-subscribers) |
2019 | L: linux-media@vger.kernel.org | 2019 | L: linux-media@vger.kernel.org |
2020 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git | 2020 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git |
2021 | W: http://linuxtv.org | 2021 | W: http://linuxtv.org |
2022 | W: http://www.ivtvdriver.org/index.php/Cx18 | 2022 | W: http://www.ivtvdriver.org/index.php/Cx18 |
2023 | S: Maintained | 2023 | S: Maintained |
2024 | F: Documentation/video4linux/cx18.txt | 2024 | F: Documentation/video4linux/cx18.txt |
2025 | F: drivers/media/video/cx18/ | 2025 | F: drivers/media/video/cx18/ |
2026 | 2026 | ||
2027 | CXGB3 ETHERNET DRIVER (CXGB3) | 2027 | CXGB3 ETHERNET DRIVER (CXGB3) |
2028 | M: Divy Le Ray <divy@chelsio.com> | 2028 | M: Divy Le Ray <divy@chelsio.com> |
2029 | L: netdev@vger.kernel.org | 2029 | L: netdev@vger.kernel.org |
2030 | W: http://www.chelsio.com | 2030 | W: http://www.chelsio.com |
2031 | S: Supported | 2031 | S: Supported |
2032 | F: drivers/net/ethernet/chelsio/cxgb3/ | 2032 | F: drivers/net/ethernet/chelsio/cxgb3/ |
2033 | 2033 | ||
2034 | CXGB3 IWARP RNIC DRIVER (IW_CXGB3) | 2034 | CXGB3 IWARP RNIC DRIVER (IW_CXGB3) |
2035 | M: Steve Wise <swise@chelsio.com> | 2035 | M: Steve Wise <swise@chelsio.com> |
2036 | L: linux-rdma@vger.kernel.org | 2036 | L: linux-rdma@vger.kernel.org |
2037 | W: http://www.openfabrics.org | 2037 | W: http://www.openfabrics.org |
2038 | S: Supported | 2038 | S: Supported |
2039 | F: drivers/infiniband/hw/cxgb3/ | 2039 | F: drivers/infiniband/hw/cxgb3/ |
2040 | 2040 | ||
2041 | CXGB4 ETHERNET DRIVER (CXGB4) | 2041 | CXGB4 ETHERNET DRIVER (CXGB4) |
2042 | M: Dimitris Michailidis <dm@chelsio.com> | 2042 | M: Dimitris Michailidis <dm@chelsio.com> |
2043 | L: netdev@vger.kernel.org | 2043 | L: netdev@vger.kernel.org |
2044 | W: http://www.chelsio.com | 2044 | W: http://www.chelsio.com |
2045 | S: Supported | 2045 | S: Supported |
2046 | F: drivers/net/ethernet/chelsio/cxgb4/ | 2046 | F: drivers/net/ethernet/chelsio/cxgb4/ |
2047 | 2047 | ||
2048 | CXGB4 IWARP RNIC DRIVER (IW_CXGB4) | 2048 | CXGB4 IWARP RNIC DRIVER (IW_CXGB4) |
2049 | M: Steve Wise <swise@chelsio.com> | 2049 | M: Steve Wise <swise@chelsio.com> |
2050 | L: linux-rdma@vger.kernel.org | 2050 | L: linux-rdma@vger.kernel.org |
2051 | W: http://www.openfabrics.org | 2051 | W: http://www.openfabrics.org |
2052 | S: Supported | 2052 | S: Supported |
2053 | F: drivers/infiniband/hw/cxgb4/ | 2053 | F: drivers/infiniband/hw/cxgb4/ |
2054 | 2054 | ||
2055 | CXGB4VF ETHERNET DRIVER (CXGB4VF) | 2055 | CXGB4VF ETHERNET DRIVER (CXGB4VF) |
2056 | M: Casey Leedom <leedom@chelsio.com> | 2056 | M: Casey Leedom <leedom@chelsio.com> |
2057 | L: netdev@vger.kernel.org | 2057 | L: netdev@vger.kernel.org |
2058 | W: http://www.chelsio.com | 2058 | W: http://www.chelsio.com |
2059 | S: Supported | 2059 | S: Supported |
2060 | F: drivers/net/ethernet/chelsio/cxgb4vf/ | 2060 | F: drivers/net/ethernet/chelsio/cxgb4vf/ |
2061 | 2061 | ||
2062 | STMMAC ETHERNET DRIVER | 2062 | STMMAC ETHERNET DRIVER |
2063 | M: Giuseppe Cavallaro <peppe.cavallaro@st.com> | 2063 | M: Giuseppe Cavallaro <peppe.cavallaro@st.com> |
2064 | L: netdev@vger.kernel.org | 2064 | L: netdev@vger.kernel.org |
2065 | W: http://www.stlinux.com | 2065 | W: http://www.stlinux.com |
2066 | S: Supported | 2066 | S: Supported |
2067 | F: drivers/net/ethernet/stmicro/stmmac/ | 2067 | F: drivers/net/ethernet/stmicro/stmmac/ |
2068 | 2068 | ||
2069 | CYBERPRO FB DRIVER | 2069 | CYBERPRO FB DRIVER |
2070 | M: Russell King <linux@arm.linux.org.uk> | 2070 | M: Russell King <linux@arm.linux.org.uk> |
2071 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 2071 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
2072 | W: http://www.arm.linux.org.uk/ | 2072 | W: http://www.arm.linux.org.uk/ |
2073 | S: Maintained | 2073 | S: Maintained |
2074 | F: drivers/video/cyber2000fb.* | 2074 | F: drivers/video/cyber2000fb.* |
2075 | 2075 | ||
2076 | CYCLADES 2X SYNC CARD DRIVER | 2076 | CYCLADES 2X SYNC CARD DRIVER |
2077 | M: Arnaldo Carvalho de Melo <acme@ghostprotocols.net> | 2077 | M: Arnaldo Carvalho de Melo <acme@ghostprotocols.net> |
2078 | W: http://oops.ghostprotocols.net:81/blog | 2078 | W: http://oops.ghostprotocols.net:81/blog |
2079 | S: Maintained | 2079 | S: Maintained |
2080 | F: drivers/net/wan/cycx* | 2080 | F: drivers/net/wan/cycx* |
2081 | 2081 | ||
2082 | CYCLADES ASYNC MUX DRIVER | 2082 | CYCLADES ASYNC MUX DRIVER |
2083 | W: http://www.cyclades.com/ | 2083 | W: http://www.cyclades.com/ |
2084 | S: Orphan | 2084 | S: Orphan |
2085 | F: drivers/tty/cyclades.c | 2085 | F: drivers/tty/cyclades.c |
2086 | F: include/linux/cyclades.h | 2086 | F: include/linux/cyclades.h |
2087 | 2087 | ||
2088 | CYCLADES PC300 DRIVER | 2088 | CYCLADES PC300 DRIVER |
2089 | W: http://www.cyclades.com/ | 2089 | W: http://www.cyclades.com/ |
2090 | S: Orphan | 2090 | S: Orphan |
2091 | F: drivers/net/wan/pc300* | 2091 | F: drivers/net/wan/pc300* |
2092 | 2092 | ||
2093 | DAMA SLAVE for AX.25 | 2093 | DAMA SLAVE for AX.25 |
2094 | M: Joerg Reuter <jreuter@yaina.de> | 2094 | M: Joerg Reuter <jreuter@yaina.de> |
2095 | W: http://yaina.de/jreuter/ | 2095 | W: http://yaina.de/jreuter/ |
2096 | W: http://www.qsl.net/dl1bke/ | 2096 | W: http://www.qsl.net/dl1bke/ |
2097 | L: linux-hams@vger.kernel.org | 2097 | L: linux-hams@vger.kernel.org |
2098 | S: Maintained | 2098 | S: Maintained |
2099 | F: net/ax25/af_ax25.c | 2099 | F: net/ax25/af_ax25.c |
2100 | F: net/ax25/ax25_dev.c | 2100 | F: net/ax25/ax25_dev.c |
2101 | F: net/ax25/ax25_ds_* | 2101 | F: net/ax25/ax25_ds_* |
2102 | F: net/ax25/ax25_in.c | 2102 | F: net/ax25/ax25_in.c |
2103 | F: net/ax25/ax25_out.c | 2103 | F: net/ax25/ax25_out.c |
2104 | F: net/ax25/ax25_timer.c | 2104 | F: net/ax25/ax25_timer.c |
2105 | F: net/ax25/sysctl_net_ax25.c | 2105 | F: net/ax25/sysctl_net_ax25.c |
2106 | 2106 | ||
2107 | DAVICOM FAST ETHERNET (DMFE) NETWORK DRIVER | 2107 | DAVICOM FAST ETHERNET (DMFE) NETWORK DRIVER |
2108 | L: netdev@vger.kernel.org | 2108 | L: netdev@vger.kernel.org |
2109 | S: Orphan | 2109 | S: Orphan |
2110 | F: Documentation/networking/dmfe.txt | 2110 | F: Documentation/networking/dmfe.txt |
2111 | F: drivers/net/ethernet/dec/tulip/dmfe.c | 2111 | F: drivers/net/ethernet/dec/tulip/dmfe.c |
2112 | 2112 | ||
2113 | DC390/AM53C974 SCSI driver | 2113 | DC390/AM53C974 SCSI driver |
2114 | M: Kurt Garloff <garloff@suse.de> | 2114 | M: Kurt Garloff <garloff@suse.de> |
2115 | W: http://www.garloff.de/kurt/linux/dc390/ | 2115 | W: http://www.garloff.de/kurt/linux/dc390/ |
2116 | M: Guennadi Liakhovetski <g.liakhovetski@gmx.de> | 2116 | M: Guennadi Liakhovetski <g.liakhovetski@gmx.de> |
2117 | S: Maintained | 2117 | S: Maintained |
2118 | F: drivers/scsi/tmscsim.* | 2118 | F: drivers/scsi/tmscsim.* |
2119 | 2119 | ||
2120 | DC395x SCSI driver | 2120 | DC395x SCSI driver |
2121 | M: Oliver Neukum <oliver@neukum.name> | 2121 | M: Oliver Neukum <oliver@neukum.name> |
2122 | M: Ali Akcaagac <aliakc@web.de> | 2122 | M: Ali Akcaagac <aliakc@web.de> |
2123 | M: Jamie Lenehan <lenehan@twibble.org> | 2123 | M: Jamie Lenehan <lenehan@twibble.org> |
2124 | W: http://twibble.org/dist/dc395x/ | 2124 | W: http://twibble.org/dist/dc395x/ |
2125 | L: dc395x@twibble.org | 2125 | L: dc395x@twibble.org |
2126 | L: http://lists.twibble.org/mailman/listinfo/dc395x/ | 2126 | L: http://lists.twibble.org/mailman/listinfo/dc395x/ |
2127 | S: Maintained | 2127 | S: Maintained |
2128 | F: Documentation/scsi/dc395x.txt | 2128 | F: Documentation/scsi/dc395x.txt |
2129 | F: drivers/scsi/dc395x.* | 2129 | F: drivers/scsi/dc395x.* |
2130 | 2130 | ||
2131 | DCCP PROTOCOL | 2131 | DCCP PROTOCOL |
2132 | M: Gerrit Renker <gerrit@erg.abdn.ac.uk> | 2132 | M: Gerrit Renker <gerrit@erg.abdn.ac.uk> |
2133 | L: dccp@vger.kernel.org | 2133 | L: dccp@vger.kernel.org |
2134 | W: http://www.linuxfoundation.org/collaborate/workgroups/networking/dccp | 2134 | W: http://www.linuxfoundation.org/collaborate/workgroups/networking/dccp |
2135 | S: Maintained | 2135 | S: Maintained |
2136 | F: include/linux/dccp.h | 2136 | F: include/linux/dccp.h |
2137 | F: include/linux/tfrc.h | 2137 | F: include/linux/tfrc.h |
2138 | F: net/dccp/ | 2138 | F: net/dccp/ |
2139 | 2139 | ||
2140 | DECnet NETWORK LAYER | 2140 | DECnet NETWORK LAYER |
2141 | W: http://linux-decnet.sourceforge.net | 2141 | W: http://linux-decnet.sourceforge.net |
2142 | L: linux-decnet-user@lists.sourceforge.net | 2142 | L: linux-decnet-user@lists.sourceforge.net |
2143 | S: Orphan | 2143 | S: Orphan |
2144 | F: Documentation/networking/decnet.txt | 2144 | F: Documentation/networking/decnet.txt |
2145 | F: net/decnet/ | 2145 | F: net/decnet/ |
2146 | 2146 | ||
2147 | DEFXX FDDI NETWORK DRIVER | 2147 | DEFXX FDDI NETWORK DRIVER |
2148 | M: "Maciej W. Rozycki" <macro@linux-mips.org> | 2148 | M: "Maciej W. Rozycki" <macro@linux-mips.org> |
2149 | S: Maintained | 2149 | S: Maintained |
2150 | F: drivers/net/fddi/defxx.* | 2150 | F: drivers/net/fddi/defxx.* |
2151 | 2151 | ||
2152 | DELL LAPTOP DRIVER | 2152 | DELL LAPTOP DRIVER |
2153 | M: Matthew Garrett <mjg59@srcf.ucam.org> | 2153 | M: Matthew Garrett <mjg59@srcf.ucam.org> |
2154 | L: platform-driver-x86@vger.kernel.org | 2154 | L: platform-driver-x86@vger.kernel.org |
2155 | S: Maintained | 2155 | S: Maintained |
2156 | F: drivers/platform/x86/dell-laptop.c | 2156 | F: drivers/platform/x86/dell-laptop.c |
2157 | 2157 | ||
2158 | DELL LAPTOP SMM DRIVER | 2158 | DELL LAPTOP SMM DRIVER |
2159 | M: Massimo Dal Zotto <dz@debian.org> | 2159 | M: Massimo Dal Zotto <dz@debian.org> |
2160 | W: http://www.debian.org/~dz/i8k/ | 2160 | W: http://www.debian.org/~dz/i8k/ |
2161 | S: Maintained | 2161 | S: Maintained |
2162 | F: drivers/char/i8k.c | 2162 | F: drivers/char/i8k.c |
2163 | F: include/linux/i8k.h | 2163 | F: include/linux/i8k.h |
2164 | 2164 | ||
2165 | DELL SYSTEMS MANAGEMENT BASE DRIVER (dcdbas) | 2165 | DELL SYSTEMS MANAGEMENT BASE DRIVER (dcdbas) |
2166 | M: Doug Warzecha <Douglas_Warzecha@dell.com> | 2166 | M: Doug Warzecha <Douglas_Warzecha@dell.com> |
2167 | S: Maintained | 2167 | S: Maintained |
2168 | F: Documentation/dcdbas.txt | 2168 | F: Documentation/dcdbas.txt |
2169 | F: drivers/firmware/dcdbas.* | 2169 | F: drivers/firmware/dcdbas.* |
2170 | 2170 | ||
2171 | DELL WMI EXTRAS DRIVER | 2171 | DELL WMI EXTRAS DRIVER |
2172 | M: Matthew Garrett <mjg59@srcf.ucam.org> | 2172 | M: Matthew Garrett <mjg59@srcf.ucam.org> |
2173 | S: Maintained | 2173 | S: Maintained |
2174 | F: drivers/platform/x86/dell-wmi.c | 2174 | F: drivers/platform/x86/dell-wmi.c |
2175 | 2175 | ||
2176 | DESIGNWARE USB3 DRD IP DRIVER | 2176 | DESIGNWARE USB3 DRD IP DRIVER |
2177 | M: Felipe Balbi <balbi@ti.com> | 2177 | M: Felipe Balbi <balbi@ti.com> |
2178 | L: linux-usb@vger.kernel.org | 2178 | L: linux-usb@vger.kernel.org |
2179 | L: linux-omap@vger.kernel.org | 2179 | L: linux-omap@vger.kernel.org |
2180 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git | 2180 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git |
2181 | S: Maintained | 2181 | S: Maintained |
2182 | F: drivers/usb/dwc3/ | 2182 | F: drivers/usb/dwc3/ |
2183 | 2183 | ||
2184 | DEVICE FREQUENCY (DEVFREQ) | 2184 | DEVICE FREQUENCY (DEVFREQ) |
2185 | M: MyungJoo Ham <myungjoo.ham@samsung.com> | 2185 | M: MyungJoo Ham <myungjoo.ham@samsung.com> |
2186 | M: Kyungmin Park <kyungmin.park@samsung.com> | 2186 | M: Kyungmin Park <kyungmin.park@samsung.com> |
2187 | L: linux-kernel@vger.kernel.org | 2187 | L: linux-kernel@vger.kernel.org |
2188 | S: Maintained | 2188 | S: Maintained |
2189 | F: drivers/devfreq/ | 2189 | F: drivers/devfreq/ |
2190 | 2190 | ||
2191 | DEVICE NUMBER REGISTRY | 2191 | DEVICE NUMBER REGISTRY |
2192 | M: Torben Mathiasen <device@lanana.org> | 2192 | M: Torben Mathiasen <device@lanana.org> |
2193 | W: http://lanana.org/docs/device-list/index.html | 2193 | W: http://lanana.org/docs/device-list/index.html |
2194 | S: Maintained | 2194 | S: Maintained |
2195 | 2195 | ||
2196 | DEVICE-MAPPER (LVM) | 2196 | DEVICE-MAPPER (LVM) |
2197 | P: Alasdair Kergon | 2197 | P: Alasdair Kergon |
2198 | L: dm-devel@redhat.com | 2198 | L: dm-devel@redhat.com |
2199 | W: http://sources.redhat.com/dm | 2199 | W: http://sources.redhat.com/dm |
2200 | Q: http://patchwork.kernel.org/project/dm-devel/list/ | 2200 | Q: http://patchwork.kernel.org/project/dm-devel/list/ |
2201 | S: Maintained | 2201 | S: Maintained |
2202 | F: Documentation/device-mapper/ | 2202 | F: Documentation/device-mapper/ |
2203 | F: drivers/md/dm* | 2203 | F: drivers/md/dm* |
2204 | F: include/linux/device-mapper.h | 2204 | F: include/linux/device-mapper.h |
2205 | F: include/linux/dm-*.h | 2205 | F: include/linux/dm-*.h |
2206 | 2206 | ||
2207 | DIOLAN U2C-12 I2C DRIVER | 2207 | DIOLAN U2C-12 I2C DRIVER |
2208 | M: Guenter Roeck <guenter.roeck@ericsson.com> | 2208 | M: Guenter Roeck <guenter.roeck@ericsson.com> |
2209 | L: linux-i2c@vger.kernel.org | 2209 | L: linux-i2c@vger.kernel.org |
2210 | S: Maintained | 2210 | S: Maintained |
2211 | F: drivers/i2c/busses/i2c-diolan-u2c.c | 2211 | F: drivers/i2c/busses/i2c-diolan-u2c.c |
2212 | 2212 | ||
2213 | DIRECTORY NOTIFICATION (DNOTIFY) | 2213 | DIRECTORY NOTIFICATION (DNOTIFY) |
2214 | M: Eric Paris <eparis@parisplace.org> | 2214 | M: Eric Paris <eparis@parisplace.org> |
2215 | S: Maintained | 2215 | S: Maintained |
2216 | F: Documentation/filesystems/dnotify.txt | 2216 | F: Documentation/filesystems/dnotify.txt |
2217 | F: fs/notify/dnotify/ | 2217 | F: fs/notify/dnotify/ |
2218 | F: include/linux/dnotify.h | 2218 | F: include/linux/dnotify.h |
2219 | 2219 | ||
2220 | DISK GEOMETRY AND PARTITION HANDLING | 2220 | DISK GEOMETRY AND PARTITION HANDLING |
2221 | M: Andries Brouwer <aeb@cwi.nl> | 2221 | M: Andries Brouwer <aeb@cwi.nl> |
2222 | W: http://www.win.tue.nl/~aeb/linux/Large-Disk.html | 2222 | W: http://www.win.tue.nl/~aeb/linux/Large-Disk.html |
2223 | W: http://www.win.tue.nl/~aeb/linux/zip/zip-1.html | 2223 | W: http://www.win.tue.nl/~aeb/linux/zip/zip-1.html |
2224 | W: http://www.win.tue.nl/~aeb/partitions/partition_types-1.html | 2224 | W: http://www.win.tue.nl/~aeb/partitions/partition_types-1.html |
2225 | S: Maintained | 2225 | S: Maintained |
2226 | 2226 | ||
2227 | DISKQUOTA | 2227 | DISKQUOTA |
2228 | M: Jan Kara <jack@suse.cz> | 2228 | M: Jan Kara <jack@suse.cz> |
2229 | S: Maintained | 2229 | S: Maintained |
2230 | F: Documentation/filesystems/quota.txt | 2230 | F: Documentation/filesystems/quota.txt |
2231 | F: fs/quota/ | 2231 | F: fs/quota/ |
2232 | F: include/linux/quota*.h | 2232 | F: include/linux/quota*.h |
2233 | 2233 | ||
2234 | DISTRIBUTED LOCK MANAGER (DLM) | 2234 | DISTRIBUTED LOCK MANAGER (DLM) |
2235 | M: Christine Caulfield <ccaulfie@redhat.com> | 2235 | M: Christine Caulfield <ccaulfie@redhat.com> |
2236 | M: David Teigland <teigland@redhat.com> | 2236 | M: David Teigland <teigland@redhat.com> |
2237 | L: cluster-devel@redhat.com | 2237 | L: cluster-devel@redhat.com |
2238 | W: http://sources.redhat.com/cluster/ | 2238 | W: http://sources.redhat.com/cluster/ |
2239 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/teigland/dlm.git | 2239 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/teigland/dlm.git |
2240 | S: Supported | 2240 | S: Supported |
2241 | F: fs/dlm/ | 2241 | F: fs/dlm/ |
2242 | 2242 | ||
2243 | DMA BUFFER SHARING FRAMEWORK | 2243 | DMA BUFFER SHARING FRAMEWORK |
2244 | M: Sumit Semwal <sumit.semwal@linaro.org> | 2244 | M: Sumit Semwal <sumit.semwal@linaro.org> |
2245 | S: Maintained | 2245 | S: Maintained |
2246 | L: linux-media@vger.kernel.org | 2246 | L: linux-media@vger.kernel.org |
2247 | L: dri-devel@lists.freedesktop.org | 2247 | L: dri-devel@lists.freedesktop.org |
2248 | L: linaro-mm-sig@lists.linaro.org | 2248 | L: linaro-mm-sig@lists.linaro.org |
2249 | F: drivers/base/dma-buf* | 2249 | F: drivers/base/dma-buf* |
2250 | F: include/linux/dma-buf* | 2250 | F: include/linux/dma-buf* |
2251 | F: Documentation/dma-buf-sharing.txt | 2251 | F: Documentation/dma-buf-sharing.txt |
2252 | T: git git://git.linaro.org/people/sumitsemwal/linux-dma-buf.git | 2252 | T: git git://git.linaro.org/people/sumitsemwal/linux-dma-buf.git |
2253 | 2253 | ||
2254 | DMA GENERIC OFFLOAD ENGINE SUBSYSTEM | 2254 | DMA GENERIC OFFLOAD ENGINE SUBSYSTEM |
2255 | M: Vinod Koul <vinod.koul@intel.com> | 2255 | M: Vinod Koul <vinod.koul@intel.com> |
2256 | M: Dan Williams <dan.j.williams@intel.com> | 2256 | M: Dan Williams <dan.j.williams@intel.com> |
2257 | S: Supported | 2257 | S: Supported |
2258 | F: drivers/dma/ | 2258 | F: drivers/dma/ |
2259 | F: include/linux/dma* | 2259 | F: include/linux/dma* |
2260 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/djbw/async_tx.git | 2260 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/djbw/async_tx.git |
2261 | T: git git://git.infradead.org/users/vkoul/slave-dma.git (slave-dma) | 2261 | T: git git://git.infradead.org/users/vkoul/slave-dma.git (slave-dma) |
2262 | 2262 | ||
2263 | DME1737 HARDWARE MONITOR DRIVER | 2263 | DME1737 HARDWARE MONITOR DRIVER |
2264 | M: Juerg Haefliger <juergh@gmail.com> | 2264 | M: Juerg Haefliger <juergh@gmail.com> |
2265 | L: lm-sensors@lm-sensors.org | 2265 | L: lm-sensors@lm-sensors.org |
2266 | S: Maintained | 2266 | S: Maintained |
2267 | F: Documentation/hwmon/dme1737 | 2267 | F: Documentation/hwmon/dme1737 |
2268 | F: drivers/hwmon/dme1737.c | 2268 | F: drivers/hwmon/dme1737.c |
2269 | 2269 | ||
2270 | DOCBOOK FOR DOCUMENTATION | 2270 | DOCBOOK FOR DOCUMENTATION |
2271 | M: Randy Dunlap <rdunlap@xenotime.net> | 2271 | M: Randy Dunlap <rdunlap@xenotime.net> |
2272 | S: Maintained | 2272 | S: Maintained |
2273 | F: scripts/kernel-doc | 2273 | F: scripts/kernel-doc |
2274 | 2274 | ||
2275 | DOCKING STATION DRIVER | 2275 | DOCKING STATION DRIVER |
2276 | M: Shaohua Li <shaohua.li@intel.com> | 2276 | M: Shaohua Li <shaohua.li@intel.com> |
2277 | L: linux-acpi@vger.kernel.org | 2277 | L: linux-acpi@vger.kernel.org |
2278 | S: Supported | 2278 | S: Supported |
2279 | F: drivers/acpi/dock.c | 2279 | F: drivers/acpi/dock.c |
2280 | 2280 | ||
2281 | DOCUMENTATION | 2281 | DOCUMENTATION |
2282 | M: Randy Dunlap <rdunlap@xenotime.net> | 2282 | M: Randy Dunlap <rdunlap@xenotime.net> |
2283 | L: linux-doc@vger.kernel.org | 2283 | L: linux-doc@vger.kernel.org |
2284 | T: quilt http://xenotime.net/kernel-doc-patches/current/ | 2284 | T: quilt http://xenotime.net/kernel-doc-patches/current/ |
2285 | S: Maintained | 2285 | S: Maintained |
2286 | F: Documentation/ | 2286 | F: Documentation/ |
2287 | 2287 | ||
2288 | DOUBLETALK DRIVER | 2288 | DOUBLETALK DRIVER |
2289 | M: "James R. Van Zandt" <jrv@vanzandt.mv.com> | 2289 | M: "James R. Van Zandt" <jrv@vanzandt.mv.com> |
2290 | L: blinux-list@redhat.com | 2290 | L: blinux-list@redhat.com |
2291 | S: Maintained | 2291 | S: Maintained |
2292 | F: drivers/char/dtlk.c | 2292 | F: drivers/char/dtlk.c |
2293 | F: include/linux/dtlk.h | 2293 | F: include/linux/dtlk.h |
2294 | 2294 | ||
2295 | DPT_I2O SCSI RAID DRIVER | 2295 | DPT_I2O SCSI RAID DRIVER |
2296 | M: Adaptec OEM Raid Solutions <aacraid@adaptec.com> | 2296 | M: Adaptec OEM Raid Solutions <aacraid@adaptec.com> |
2297 | L: linux-scsi@vger.kernel.org | 2297 | L: linux-scsi@vger.kernel.org |
2298 | W: http://www.adaptec.com/ | 2298 | W: http://www.adaptec.com/ |
2299 | S: Maintained | 2299 | S: Maintained |
2300 | F: drivers/scsi/dpt* | 2300 | F: drivers/scsi/dpt* |
2301 | F: drivers/scsi/dpt/ | 2301 | F: drivers/scsi/dpt/ |
2302 | 2302 | ||
2303 | DRBD DRIVER | 2303 | DRBD DRIVER |
2304 | P: Philipp Reisner | 2304 | P: Philipp Reisner |
2305 | P: Lars Ellenberg | 2305 | P: Lars Ellenberg |
2306 | M: drbd-dev@lists.linbit.com | 2306 | M: drbd-dev@lists.linbit.com |
2307 | L: drbd-user@lists.linbit.com | 2307 | L: drbd-user@lists.linbit.com |
2308 | W: http://www.drbd.org | 2308 | W: http://www.drbd.org |
2309 | T: git git://git.drbd.org/linux-2.6-drbd.git drbd | 2309 | T: git git://git.drbd.org/linux-2.6-drbd.git drbd |
2310 | T: git git://git.drbd.org/drbd-8.3.git | 2310 | T: git git://git.drbd.org/drbd-8.3.git |
2311 | S: Supported | 2311 | S: Supported |
2312 | F: drivers/block/drbd/ | 2312 | F: drivers/block/drbd/ |
2313 | F: lib/lru_cache.c | 2313 | F: lib/lru_cache.c |
2314 | F: Documentation/blockdev/drbd/ | 2314 | F: Documentation/blockdev/drbd/ |
2315 | 2315 | ||
2316 | DRIVER CORE, KOBJECTS, DEBUGFS AND SYSFS | 2316 | DRIVER CORE, KOBJECTS, DEBUGFS AND SYSFS |
2317 | M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2317 | M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
2318 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core-2.6.git | 2318 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core-2.6.git |
2319 | S: Supported | 2319 | S: Supported |
2320 | F: Documentation/kobject.txt | 2320 | F: Documentation/kobject.txt |
2321 | F: drivers/base/ | 2321 | F: drivers/base/ |
2322 | F: fs/sysfs/ | 2322 | F: fs/sysfs/ |
2323 | F: fs/debugfs/ | 2323 | F: fs/debugfs/ |
2324 | F: include/linux/kobj* | 2324 | F: include/linux/kobj* |
2325 | F: include/linux/debugfs.h | 2325 | F: include/linux/debugfs.h |
2326 | F: lib/kobj* | 2326 | F: lib/kobj* |
2327 | 2327 | ||
2328 | DRM DRIVERS | 2328 | DRM DRIVERS |
2329 | M: David Airlie <airlied@linux.ie> | 2329 | M: David Airlie <airlied@linux.ie> |
2330 | L: dri-devel@lists.freedesktop.org | 2330 | L: dri-devel@lists.freedesktop.org |
2331 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6.git | 2331 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6.git |
2332 | S: Maintained | 2332 | S: Maintained |
2333 | F: drivers/gpu/drm/ | 2333 | F: drivers/gpu/drm/ |
2334 | F: include/drm/ | 2334 | F: include/drm/ |
2335 | 2335 | ||
2336 | INTEL DRM DRIVERS (excluding Poulsbo, Moorestown and derivative chipsets) | 2336 | INTEL DRM DRIVERS (excluding Poulsbo, Moorestown and derivative chipsets) |
2337 | M: Keith Packard <keithp@keithp.com> | 2337 | M: Keith Packard <keithp@keithp.com> |
2338 | L: intel-gfx@lists.freedesktop.org (subscribers-only) | 2338 | L: intel-gfx@lists.freedesktop.org (subscribers-only) |
2339 | L: dri-devel@lists.freedesktop.org | 2339 | L: dri-devel@lists.freedesktop.org |
2340 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/keithp/linux-2.6.git | 2340 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/keithp/linux-2.6.git |
2341 | S: Supported | 2341 | S: Supported |
2342 | F: drivers/gpu/drm/i915 | 2342 | F: drivers/gpu/drm/i915 |
2343 | F: include/drm/i915* | 2343 | F: include/drm/i915* |
2344 | 2344 | ||
2345 | DRM DRIVERS FOR EXYNOS | 2345 | DRM DRIVERS FOR EXYNOS |
2346 | M: Inki Dae <inki.dae@samsung.com> | 2346 | M: Inki Dae <inki.dae@samsung.com> |
2347 | M: Joonyoung Shim <jy0922.shim@samsung.com> | 2347 | M: Joonyoung Shim <jy0922.shim@samsung.com> |
2348 | M: Seung-Woo Kim <sw0312.kim@samsung.com> | 2348 | M: Seung-Woo Kim <sw0312.kim@samsung.com> |
2349 | M: Kyungmin Park <kyungmin.park@samsung.com> | 2349 | M: Kyungmin Park <kyungmin.park@samsung.com> |
2350 | L: dri-devel@lists.freedesktop.org | 2350 | L: dri-devel@lists.freedesktop.org |
2351 | S: Supported | 2351 | S: Supported |
2352 | F: drivers/gpu/drm/exynos | 2352 | F: drivers/gpu/drm/exynos |
2353 | F: include/drm/exynos* | 2353 | F: include/drm/exynos* |
2354 | 2354 | ||
2355 | DSCC4 DRIVER | 2355 | DSCC4 DRIVER |
2356 | M: Francois Romieu <romieu@fr.zoreil.com> | 2356 | M: Francois Romieu <romieu@fr.zoreil.com> |
2357 | L: netdev@vger.kernel.org | 2357 | L: netdev@vger.kernel.org |
2358 | S: Maintained | 2358 | S: Maintained |
2359 | F: drivers/net/wan/dscc4.c | 2359 | F: drivers/net/wan/dscc4.c |
2360 | 2360 | ||
2361 | DYNAMIC DEBUG | 2361 | DYNAMIC DEBUG |
2362 | M: Jason Baron <jbaron@redhat.com> | 2362 | M: Jason Baron <jbaron@redhat.com> |
2363 | S: Maintained | 2363 | S: Maintained |
2364 | F: lib/dynamic_debug.c | 2364 | F: lib/dynamic_debug.c |
2365 | F: include/linux/dynamic_debug.h | 2365 | F: include/linux/dynamic_debug.h |
2366 | 2366 | ||
2367 | DZ DECSTATION DZ11 SERIAL DRIVER | 2367 | DZ DECSTATION DZ11 SERIAL DRIVER |
2368 | M: "Maciej W. Rozycki" <macro@linux-mips.org> | 2368 | M: "Maciej W. Rozycki" <macro@linux-mips.org> |
2369 | S: Maintained | 2369 | S: Maintained |
2370 | F: drivers/tty/serial/dz.* | 2370 | F: drivers/tty/serial/dz.* |
2371 | 2371 | ||
2372 | EATA-DMA SCSI DRIVER | 2372 | EATA-DMA SCSI DRIVER |
2373 | M: Michael Neuffer <mike@i-Connect.Net> | 2373 | M: Michael Neuffer <mike@i-Connect.Net> |
2374 | L: linux-eata@i-connect.net | 2374 | L: linux-eata@i-connect.net |
2375 | L: linux-scsi@vger.kernel.org | 2375 | L: linux-scsi@vger.kernel.org |
2376 | S: Maintained | 2376 | S: Maintained |
2377 | F: drivers/scsi/eata* | 2377 | F: drivers/scsi/eata* |
2378 | 2378 | ||
2379 | EATA ISA/EISA/PCI SCSI DRIVER | 2379 | EATA ISA/EISA/PCI SCSI DRIVER |
2380 | M: Dario Ballabio <ballabio_dario@emc.com> | 2380 | M: Dario Ballabio <ballabio_dario@emc.com> |
2381 | L: linux-scsi@vger.kernel.org | 2381 | L: linux-scsi@vger.kernel.org |
2382 | S: Maintained | 2382 | S: Maintained |
2383 | F: drivers/scsi/eata.c | 2383 | F: drivers/scsi/eata.c |
2384 | 2384 | ||
2385 | EATA-PIO SCSI DRIVER | 2385 | EATA-PIO SCSI DRIVER |
2386 | M: Michael Neuffer <mike@i-Connect.Net> | 2386 | M: Michael Neuffer <mike@i-Connect.Net> |
2387 | L: linux-eata@i-connect.net | 2387 | L: linux-eata@i-connect.net |
2388 | L: linux-scsi@vger.kernel.org | 2388 | L: linux-scsi@vger.kernel.org |
2389 | S: Maintained | 2389 | S: Maintained |
2390 | F: drivers/scsi/eata_pio.* | 2390 | F: drivers/scsi/eata_pio.* |
2391 | 2391 | ||
2392 | EBTABLES | 2392 | EBTABLES |
2393 | M: Bart De Schuymer <bart.de.schuymer@pandora.be> | 2393 | M: Bart De Schuymer <bart.de.schuymer@pandora.be> |
2394 | L: netfilter-devel@vger.kernel.org | 2394 | L: netfilter-devel@vger.kernel.org |
2395 | W: http://ebtables.sourceforge.net/ | 2395 | W: http://ebtables.sourceforge.net/ |
2396 | S: Maintained | 2396 | S: Maintained |
2397 | F: include/linux/netfilter_bridge/ebt_*.h | 2397 | F: include/linux/netfilter_bridge/ebt_*.h |
2398 | F: net/bridge/netfilter/ebt*.c | 2398 | F: net/bridge/netfilter/ebt*.c |
2399 | 2399 | ||
2400 | ECRYPT FILE SYSTEM | 2400 | ECRYPT FILE SYSTEM |
2401 | M: Tyler Hicks <tyhicks@canonical.com> | 2401 | M: Tyler Hicks <tyhicks@canonical.com> |
2402 | M: Dustin Kirkland <dustin.kirkland@gazzang.com> | 2402 | M: Dustin Kirkland <dustin.kirkland@gazzang.com> |
2403 | L: ecryptfs@vger.kernel.org | 2403 | L: ecryptfs@vger.kernel.org |
2404 | W: https://launchpad.net/ecryptfs | 2404 | W: https://launchpad.net/ecryptfs |
2405 | S: Supported | 2405 | S: Supported |
2406 | F: Documentation/filesystems/ecryptfs.txt | 2406 | F: Documentation/filesystems/ecryptfs.txt |
2407 | F: fs/ecryptfs/ | 2407 | F: fs/ecryptfs/ |
2408 | 2408 | ||
2409 | EDAC-CORE | 2409 | EDAC-CORE |
2410 | M: Doug Thompson <dougthompson@xmission.com> | 2410 | M: Doug Thompson <dougthompson@xmission.com> |
2411 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) | 2411 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) |
2412 | W: bluesmoke.sourceforge.net | 2412 | W: bluesmoke.sourceforge.net |
2413 | S: Supported | 2413 | S: Supported |
2414 | F: Documentation/edac.txt | 2414 | F: Documentation/edac.txt |
2415 | F: drivers/edac/edac_* | 2415 | F: drivers/edac/edac_* |
2416 | F: include/linux/edac.h | 2416 | F: include/linux/edac.h |
2417 | 2417 | ||
2418 | EDAC-AMD64 | 2418 | EDAC-AMD64 |
2419 | M: Doug Thompson <dougthompson@xmission.com> | 2419 | M: Doug Thompson <dougthompson@xmission.com> |
2420 | M: Borislav Petkov <borislav.petkov@amd.com> | 2420 | M: Borislav Petkov <borislav.petkov@amd.com> |
2421 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) | 2421 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) |
2422 | W: bluesmoke.sourceforge.net | 2422 | W: bluesmoke.sourceforge.net |
2423 | S: Supported | 2423 | S: Supported |
2424 | F: drivers/edac/amd64_edac* | 2424 | F: drivers/edac/amd64_edac* |
2425 | 2425 | ||
2426 | EDAC-E752X | 2426 | EDAC-E752X |
2427 | M: Mark Gross <mark.gross@intel.com> | 2427 | M: Mark Gross <mark.gross@intel.com> |
2428 | M: Doug Thompson <dougthompson@xmission.com> | 2428 | M: Doug Thompson <dougthompson@xmission.com> |
2429 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) | 2429 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) |
2430 | W: bluesmoke.sourceforge.net | 2430 | W: bluesmoke.sourceforge.net |
2431 | S: Maintained | 2431 | S: Maintained |
2432 | F: drivers/edac/e752x_edac.c | 2432 | F: drivers/edac/e752x_edac.c |
2433 | 2433 | ||
2434 | EDAC-E7XXX | 2434 | EDAC-E7XXX |
2435 | M: Doug Thompson <dougthompson@xmission.com> | 2435 | M: Doug Thompson <dougthompson@xmission.com> |
2436 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) | 2436 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) |
2437 | W: bluesmoke.sourceforge.net | 2437 | W: bluesmoke.sourceforge.net |
2438 | S: Maintained | 2438 | S: Maintained |
2439 | F: drivers/edac/e7xxx_edac.c | 2439 | F: drivers/edac/e7xxx_edac.c |
2440 | 2440 | ||
2441 | EDAC-I82443BXGX | 2441 | EDAC-I82443BXGX |
2442 | M: Tim Small <tim@buttersideup.com> | 2442 | M: Tim Small <tim@buttersideup.com> |
2443 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) | 2443 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) |
2444 | W: bluesmoke.sourceforge.net | 2444 | W: bluesmoke.sourceforge.net |
2445 | S: Maintained | 2445 | S: Maintained |
2446 | F: drivers/edac/i82443bxgx_edac.c | 2446 | F: drivers/edac/i82443bxgx_edac.c |
2447 | 2447 | ||
2448 | EDAC-I3000 | 2448 | EDAC-I3000 |
2449 | M: Jason Uhlenkott <juhlenko@akamai.com> | 2449 | M: Jason Uhlenkott <juhlenko@akamai.com> |
2450 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) | 2450 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) |
2451 | W: bluesmoke.sourceforge.net | 2451 | W: bluesmoke.sourceforge.net |
2452 | S: Maintained | 2452 | S: Maintained |
2453 | F: drivers/edac/i3000_edac.c | 2453 | F: drivers/edac/i3000_edac.c |
2454 | 2454 | ||
2455 | EDAC-I5000 | 2455 | EDAC-I5000 |
2456 | M: Doug Thompson <dougthompson@xmission.com> | 2456 | M: Doug Thompson <dougthompson@xmission.com> |
2457 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) | 2457 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) |
2458 | W: bluesmoke.sourceforge.net | 2458 | W: bluesmoke.sourceforge.net |
2459 | S: Maintained | 2459 | S: Maintained |
2460 | F: drivers/edac/i5000_edac.c | 2460 | F: drivers/edac/i5000_edac.c |
2461 | 2461 | ||
2462 | EDAC-I5400 | 2462 | EDAC-I5400 |
2463 | M: Mauro Carvalho Chehab <mchehab@redhat.com> | 2463 | M: Mauro Carvalho Chehab <mchehab@redhat.com> |
2464 | L: linux-edac@vger.kernel.org | 2464 | L: linux-edac@vger.kernel.org |
2465 | W: bluesmoke.sourceforge.net | 2465 | W: bluesmoke.sourceforge.net |
2466 | S: Maintained | 2466 | S: Maintained |
2467 | F: drivers/edac/i5400_edac.c | 2467 | F: drivers/edac/i5400_edac.c |
2468 | 2468 | ||
2469 | EDAC-I7300 | 2469 | EDAC-I7300 |
2470 | M: Mauro Carvalho Chehab <mchehab@redhat.com> | 2470 | M: Mauro Carvalho Chehab <mchehab@redhat.com> |
2471 | L: linux-edac@vger.kernel.org | 2471 | L: linux-edac@vger.kernel.org |
2472 | W: bluesmoke.sourceforge.net | 2472 | W: bluesmoke.sourceforge.net |
2473 | S: Maintained | 2473 | S: Maintained |
2474 | F: drivers/edac/i7300_edac.c | 2474 | F: drivers/edac/i7300_edac.c |
2475 | 2475 | ||
2476 | EDAC-I7CORE | 2476 | EDAC-I7CORE |
2477 | M: Mauro Carvalho Chehab <mchehab@redhat.com> | 2477 | M: Mauro Carvalho Chehab <mchehab@redhat.com> |
2478 | L: linux-edac@vger.kernel.org | 2478 | L: linux-edac@vger.kernel.org |
2479 | W: bluesmoke.sourceforge.net | 2479 | W: bluesmoke.sourceforge.net |
2480 | S: Maintained | 2480 | S: Maintained |
2481 | F: drivers/edac/i7core_edac.c | 2481 | F: drivers/edac/i7core_edac.c |
2482 | 2482 | ||
2483 | EDAC-I82975X | 2483 | EDAC-I82975X |
2484 | M: Ranganathan Desikan <ravi@jetztechnologies.com> | 2484 | M: Ranganathan Desikan <ravi@jetztechnologies.com> |
2485 | M: "Arvind R." <arvino55@gmail.com> | 2485 | M: "Arvind R." <arvino55@gmail.com> |
2486 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) | 2486 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) |
2487 | W: bluesmoke.sourceforge.net | 2487 | W: bluesmoke.sourceforge.net |
2488 | S: Maintained | 2488 | S: Maintained |
2489 | F: drivers/edac/i82975x_edac.c | 2489 | F: drivers/edac/i82975x_edac.c |
2490 | 2490 | ||
2491 | EDAC-PASEMI | 2491 | EDAC-PASEMI |
2492 | M: Egor Martovetsky <egor@pasemi.com> | 2492 | M: Egor Martovetsky <egor@pasemi.com> |
2493 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) | 2493 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) |
2494 | W: bluesmoke.sourceforge.net | 2494 | W: bluesmoke.sourceforge.net |
2495 | S: Maintained | 2495 | S: Maintained |
2496 | F: drivers/edac/pasemi_edac.c | 2496 | F: drivers/edac/pasemi_edac.c |
2497 | 2497 | ||
2498 | EDAC-R82600 | 2498 | EDAC-R82600 |
2499 | M: Tim Small <tim@buttersideup.com> | 2499 | M: Tim Small <tim@buttersideup.com> |
2500 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) | 2500 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) |
2501 | W: bluesmoke.sourceforge.net | 2501 | W: bluesmoke.sourceforge.net |
2502 | S: Maintained | 2502 | S: Maintained |
2503 | F: drivers/edac/r82600_edac.c | 2503 | F: drivers/edac/r82600_edac.c |
2504 | 2504 | ||
2505 | EDAC-SBRIDGE | 2505 | EDAC-SBRIDGE |
2506 | M: Mauro Carvalho Chehab <mchehab@redhat.com> | 2506 | M: Mauro Carvalho Chehab <mchehab@redhat.com> |
2507 | L: linux-edac@vger.kernel.org | 2507 | L: linux-edac@vger.kernel.org |
2508 | W: bluesmoke.sourceforge.net | 2508 | W: bluesmoke.sourceforge.net |
2509 | S: Maintained | 2509 | S: Maintained |
2510 | F: drivers/edac/sb_edac.c | 2510 | F: drivers/edac/sb_edac.c |
2511 | 2511 | ||
2512 | EDIROL UA-101/UA-1000 DRIVER | 2512 | EDIROL UA-101/UA-1000 DRIVER |
2513 | M: Clemens Ladisch <clemens@ladisch.de> | 2513 | M: Clemens Ladisch <clemens@ladisch.de> |
2514 | L: alsa-devel@alsa-project.org (moderated for non-subscribers) | 2514 | L: alsa-devel@alsa-project.org (moderated for non-subscribers) |
2515 | T: git git://git.alsa-project.org/alsa-kernel.git | 2515 | T: git git://git.alsa-project.org/alsa-kernel.git |
2516 | S: Maintained | 2516 | S: Maintained |
2517 | F: sound/usb/misc/ua101.c | 2517 | F: sound/usb/misc/ua101.c |
2518 | 2518 | ||
2519 | EFIFB FRAMEBUFFER DRIVER | 2519 | EFIFB FRAMEBUFFER DRIVER |
2520 | L: linux-fbdev@vger.kernel.org | 2520 | L: linux-fbdev@vger.kernel.org |
2521 | M: Peter Jones <pjones@redhat.com> | 2521 | M: Peter Jones <pjones@redhat.com> |
2522 | S: Maintained | 2522 | S: Maintained |
2523 | F: drivers/video/efifb.c | 2523 | F: drivers/video/efifb.c |
2524 | 2524 | ||
2525 | EFS FILESYSTEM | 2525 | EFS FILESYSTEM |
2526 | W: http://aeschi.ch.eu.org/efs/ | 2526 | W: http://aeschi.ch.eu.org/efs/ |
2527 | S: Orphan | 2527 | S: Orphan |
2528 | F: fs/efs/ | 2528 | F: fs/efs/ |
2529 | 2529 | ||
2530 | EHCA (IBM GX bus InfiniBand adapter) DRIVER | 2530 | EHCA (IBM GX bus InfiniBand adapter) DRIVER |
2531 | M: Hoang-Nam Nguyen <hnguyen@de.ibm.com> | 2531 | M: Hoang-Nam Nguyen <hnguyen@de.ibm.com> |
2532 | M: Christoph Raisch <raisch@de.ibm.com> | 2532 | M: Christoph Raisch <raisch@de.ibm.com> |
2533 | L: linux-rdma@vger.kernel.org | 2533 | L: linux-rdma@vger.kernel.org |
2534 | S: Supported | 2534 | S: Supported |
2535 | F: drivers/infiniband/hw/ehca/ | 2535 | F: drivers/infiniband/hw/ehca/ |
2536 | 2536 | ||
2537 | EHEA (IBM pSeries eHEA 10Gb ethernet adapter) DRIVER | 2537 | EHEA (IBM pSeries eHEA 10Gb ethernet adapter) DRIVER |
2538 | M: Thadeu Lima de Souza Cascardo <cascardo@linux.vnet.ibm.com> | 2538 | M: Thadeu Lima de Souza Cascardo <cascardo@linux.vnet.ibm.com> |
2539 | L: netdev@vger.kernel.org | 2539 | L: netdev@vger.kernel.org |
2540 | S: Maintained | 2540 | S: Maintained |
2541 | F: drivers/net/ethernet/ibm/ehea/ | 2541 | F: drivers/net/ethernet/ibm/ehea/ |
2542 | 2542 | ||
2543 | EMBEDDED LINUX | 2543 | EMBEDDED LINUX |
2544 | M: Paul Gortmaker <paul.gortmaker@windriver.com> | 2544 | M: Paul Gortmaker <paul.gortmaker@windriver.com> |
2545 | M: Matt Mackall <mpm@selenic.com> | 2545 | M: Matt Mackall <mpm@selenic.com> |
2546 | M: David Woodhouse <dwmw2@infradead.org> | 2546 | M: David Woodhouse <dwmw2@infradead.org> |
2547 | L: linux-embedded@vger.kernel.org | 2547 | L: linux-embedded@vger.kernel.org |
2548 | S: Maintained | 2548 | S: Maintained |
2549 | 2549 | ||
2550 | EMULEX LPFC FC SCSI DRIVER | 2550 | EMULEX LPFC FC SCSI DRIVER |
2551 | M: James Smart <james.smart@emulex.com> | 2551 | M: James Smart <james.smart@emulex.com> |
2552 | L: linux-scsi@vger.kernel.org | 2552 | L: linux-scsi@vger.kernel.org |
2553 | W: http://sourceforge.net/projects/lpfcxxxx | 2553 | W: http://sourceforge.net/projects/lpfcxxxx |
2554 | S: Supported | 2554 | S: Supported |
2555 | F: drivers/scsi/lpfc/ | 2555 | F: drivers/scsi/lpfc/ |
2556 | 2556 | ||
2557 | ENE CB710 FLASH CARD READER DRIVER | 2557 | ENE CB710 FLASH CARD READER DRIVER |
2558 | M: Michaล Mirosลaw <mirq-linux@rere.qmqm.pl> | 2558 | M: Michaล Mirosลaw <mirq-linux@rere.qmqm.pl> |
2559 | S: Maintained | 2559 | S: Maintained |
2560 | F: drivers/misc/cb710/ | 2560 | F: drivers/misc/cb710/ |
2561 | F: drivers/mmc/host/cb710-mmc.* | 2561 | F: drivers/mmc/host/cb710-mmc.* |
2562 | F: include/linux/cb710.h | 2562 | F: include/linux/cb710.h |
2563 | 2563 | ||
2564 | ENE KB2426 (ENE0100/ENE020XX) INFRARED RECEIVER | 2564 | ENE KB2426 (ENE0100/ENE020XX) INFRARED RECEIVER |
2565 | M: Maxim Levitsky <maximlevitsky@gmail.com> | 2565 | M: Maxim Levitsky <maximlevitsky@gmail.com> |
2566 | S: Maintained | 2566 | S: Maintained |
2567 | F: drivers/media/rc/ene_ir.* | 2567 | F: drivers/media/rc/ene_ir.* |
2568 | 2568 | ||
2569 | EPSON 1355 FRAMEBUFFER DRIVER | 2569 | EPSON 1355 FRAMEBUFFER DRIVER |
2570 | M: Christopher Hoover <ch@murgatroid.com> | 2570 | M: Christopher Hoover <ch@murgatroid.com> |
2571 | M: Christopher Hoover <ch@hpl.hp.com> | 2571 | M: Christopher Hoover <ch@hpl.hp.com> |
2572 | S: Maintained | 2572 | S: Maintained |
2573 | F: drivers/video/epson1355fb.c | 2573 | F: drivers/video/epson1355fb.c |
2574 | 2574 | ||
2575 | EPSON S1D13XXX FRAMEBUFFER DRIVER | 2575 | EPSON S1D13XXX FRAMEBUFFER DRIVER |
2576 | M: Kristoffer Ericson <kristoffer.ericson@gmail.com> | 2576 | M: Kristoffer Ericson <kristoffer.ericson@gmail.com> |
2577 | S: Maintained | 2577 | S: Maintained |
2578 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/kristoffer/linux-hpc.git | 2578 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/kristoffer/linux-hpc.git |
2579 | F: drivers/video/s1d13xxxfb.c | 2579 | F: drivers/video/s1d13xxxfb.c |
2580 | F: include/video/s1d13xxxfb.h | 2580 | F: include/video/s1d13xxxfb.h |
2581 | 2581 | ||
2582 | ETHEREXPRESS-16 NETWORK DRIVER | 2582 | ETHEREXPRESS-16 NETWORK DRIVER |
2583 | M: Philip Blundell <philb@gnu.org> | 2583 | M: Philip Blundell <philb@gnu.org> |
2584 | L: netdev@vger.kernel.org | 2584 | L: netdev@vger.kernel.org |
2585 | S: Maintained | 2585 | S: Maintained |
2586 | F: drivers/net/ethernet/i825xx/eexpress.* | 2586 | F: drivers/net/ethernet/i825xx/eexpress.* |
2587 | 2587 | ||
2588 | ETHERNET BRIDGE | 2588 | ETHERNET BRIDGE |
2589 | M: Stephen Hemminger <shemminger@vyatta.com> | 2589 | M: Stephen Hemminger <shemminger@vyatta.com> |
2590 | L: bridge@lists.linux-foundation.org | 2590 | L: bridge@lists.linux-foundation.org |
2591 | L: netdev@vger.kernel.org | 2591 | L: netdev@vger.kernel.org |
2592 | W: http://www.linuxfoundation.org/en/Net:Bridge | 2592 | W: http://www.linuxfoundation.org/en/Net:Bridge |
2593 | S: Maintained | 2593 | S: Maintained |
2594 | F: include/linux/netfilter_bridge/ | 2594 | F: include/linux/netfilter_bridge/ |
2595 | F: net/bridge/ | 2595 | F: net/bridge/ |
2596 | 2596 | ||
2597 | ETHERTEAM 16I DRIVER | 2597 | ETHERTEAM 16I DRIVER |
2598 | M: Mika Kuoppala <miku@iki.fi> | 2598 | M: Mika Kuoppala <miku@iki.fi> |
2599 | S: Maintained | 2599 | S: Maintained |
2600 | F: drivers/net/ethernet/fujitsu/eth16i.c | 2600 | F: drivers/net/ethernet/fujitsu/eth16i.c |
2601 | 2601 | ||
2602 | EXT2 FILE SYSTEM | 2602 | EXT2 FILE SYSTEM |
2603 | M: Jan Kara <jack@suse.cz> | 2603 | M: Jan Kara <jack@suse.cz> |
2604 | L: linux-ext4@vger.kernel.org | 2604 | L: linux-ext4@vger.kernel.org |
2605 | S: Maintained | 2605 | S: Maintained |
2606 | F: Documentation/filesystems/ext2.txt | 2606 | F: Documentation/filesystems/ext2.txt |
2607 | F: fs/ext2/ | 2607 | F: fs/ext2/ |
2608 | F: include/linux/ext2* | 2608 | F: include/linux/ext2* |
2609 | 2609 | ||
2610 | EXT3 FILE SYSTEM | 2610 | EXT3 FILE SYSTEM |
2611 | M: Jan Kara <jack@suse.cz> | 2611 | M: Jan Kara <jack@suse.cz> |
2612 | M: Andrew Morton <akpm@linux-foundation.org> | 2612 | M: Andrew Morton <akpm@linux-foundation.org> |
2613 | M: Andreas Dilger <adilger.kernel@dilger.ca> | 2613 | M: Andreas Dilger <adilger.kernel@dilger.ca> |
2614 | L: linux-ext4@vger.kernel.org | 2614 | L: linux-ext4@vger.kernel.org |
2615 | S: Maintained | 2615 | S: Maintained |
2616 | F: Documentation/filesystems/ext3.txt | 2616 | F: Documentation/filesystems/ext3.txt |
2617 | F: fs/ext3/ | 2617 | F: fs/ext3/ |
2618 | F: include/linux/ext3* | 2618 | F: include/linux/ext3* |
2619 | 2619 | ||
2620 | EXT4 FILE SYSTEM | 2620 | EXT4 FILE SYSTEM |
2621 | M: "Theodore Ts'o" <tytso@mit.edu> | 2621 | M: "Theodore Ts'o" <tytso@mit.edu> |
2622 | M: Andreas Dilger <adilger.kernel@dilger.ca> | 2622 | M: Andreas Dilger <adilger.kernel@dilger.ca> |
2623 | L: linux-ext4@vger.kernel.org | 2623 | L: linux-ext4@vger.kernel.org |
2624 | W: http://ext4.wiki.kernel.org | 2624 | W: http://ext4.wiki.kernel.org |
2625 | Q: http://patchwork.ozlabs.org/project/linux-ext4/list/ | 2625 | Q: http://patchwork.ozlabs.org/project/linux-ext4/list/ |
2626 | S: Maintained | 2626 | S: Maintained |
2627 | F: Documentation/filesystems/ext4.txt | 2627 | F: Documentation/filesystems/ext4.txt |
2628 | F: fs/ext4/ | 2628 | F: fs/ext4/ |
2629 | 2629 | ||
2630 | Extended Verification Module (EVM) | 2630 | Extended Verification Module (EVM) |
2631 | M: Mimi Zohar <zohar@us.ibm.com> | 2631 | M: Mimi Zohar <zohar@us.ibm.com> |
2632 | S: Supported | 2632 | S: Supported |
2633 | F: security/integrity/evm/ | 2633 | F: security/integrity/evm/ |
2634 | 2634 | ||
2635 | F71805F HARDWARE MONITORING DRIVER | 2635 | F71805F HARDWARE MONITORING DRIVER |
2636 | M: Jean Delvare <khali@linux-fr.org> | 2636 | M: Jean Delvare <khali@linux-fr.org> |
2637 | L: lm-sensors@lm-sensors.org | 2637 | L: lm-sensors@lm-sensors.org |
2638 | S: Maintained | 2638 | S: Maintained |
2639 | F: Documentation/hwmon/f71805f | 2639 | F: Documentation/hwmon/f71805f |
2640 | F: drivers/hwmon/f71805f.c | 2640 | F: drivers/hwmon/f71805f.c |
2641 | 2641 | ||
2642 | FANOTIFY | 2642 | FANOTIFY |
2643 | M: Eric Paris <eparis@redhat.com> | 2643 | M: Eric Paris <eparis@redhat.com> |
2644 | S: Maintained | 2644 | S: Maintained |
2645 | F: fs/notify/fanotify/ | 2645 | F: fs/notify/fanotify/ |
2646 | F: include/linux/fanotify.h | 2646 | F: include/linux/fanotify.h |
2647 | 2647 | ||
2648 | FARSYNC SYNCHRONOUS DRIVER | 2648 | FARSYNC SYNCHRONOUS DRIVER |
2649 | M: Kevin Curtis <kevin.curtis@farsite.co.uk> | 2649 | M: Kevin Curtis <kevin.curtis@farsite.co.uk> |
2650 | W: http://www.farsite.co.uk/ | 2650 | W: http://www.farsite.co.uk/ |
2651 | S: Supported | 2651 | S: Supported |
2652 | F: drivers/net/wan/farsync.* | 2652 | F: drivers/net/wan/farsync.* |
2653 | 2653 | ||
2654 | FAULT INJECTION SUPPORT | 2654 | FAULT INJECTION SUPPORT |
2655 | M: Akinobu Mita <akinobu.mita@gmail.com> | 2655 | M: Akinobu Mita <akinobu.mita@gmail.com> |
2656 | S: Supported | 2656 | S: Supported |
2657 | F: Documentation/fault-injection/ | 2657 | F: Documentation/fault-injection/ |
2658 | F: lib/fault-inject.c | 2658 | F: lib/fault-inject.c |
2659 | 2659 | ||
2660 | FCOE SUBSYSTEM (libfc, libfcoe, fcoe) | 2660 | FCOE SUBSYSTEM (libfc, libfcoe, fcoe) |
2661 | M: Robert Love <robert.w.love@intel.com> | 2661 | M: Robert Love <robert.w.love@intel.com> |
2662 | L: devel@open-fcoe.org | 2662 | L: devel@open-fcoe.org |
2663 | W: www.Open-FCoE.org | 2663 | W: www.Open-FCoE.org |
2664 | S: Supported | 2664 | S: Supported |
2665 | F: drivers/scsi/libfc/ | 2665 | F: drivers/scsi/libfc/ |
2666 | F: drivers/scsi/fcoe/ | 2666 | F: drivers/scsi/fcoe/ |
2667 | F: include/scsi/fc/ | 2667 | F: include/scsi/fc/ |
2668 | F: include/scsi/libfc.h | 2668 | F: include/scsi/libfc.h |
2669 | F: include/scsi/libfcoe.h | 2669 | F: include/scsi/libfcoe.h |
2670 | 2670 | ||
2671 | FILE LOCKING (flock() and fcntl()/lockf()) | 2671 | FILE LOCKING (flock() and fcntl()/lockf()) |
2672 | M: Matthew Wilcox <matthew@wil.cx> | 2672 | M: Matthew Wilcox <matthew@wil.cx> |
2673 | L: linux-fsdevel@vger.kernel.org | 2673 | L: linux-fsdevel@vger.kernel.org |
2674 | S: Maintained | 2674 | S: Maintained |
2675 | F: include/linux/fcntl.h | 2675 | F: include/linux/fcntl.h |
2676 | F: include/linux/fs.h | 2676 | F: include/linux/fs.h |
2677 | F: fs/fcntl.c | 2677 | F: fs/fcntl.c |
2678 | F: fs/locks.c | 2678 | F: fs/locks.c |
2679 | 2679 | ||
2680 | FILESYSTEMS (VFS and infrastructure) | 2680 | FILESYSTEMS (VFS and infrastructure) |
2681 | M: Alexander Viro <viro@zeniv.linux.org.uk> | 2681 | M: Alexander Viro <viro@zeniv.linux.org.uk> |
2682 | L: linux-fsdevel@vger.kernel.org | 2682 | L: linux-fsdevel@vger.kernel.org |
2683 | S: Maintained | 2683 | S: Maintained |
2684 | F: fs/* | 2684 | F: fs/* |
2685 | 2685 | ||
2686 | FINTEK F75375S HARDWARE MONITOR AND FAN CONTROLLER DRIVER | 2686 | FINTEK F75375S HARDWARE MONITOR AND FAN CONTROLLER DRIVER |
2687 | M: Riku Voipio <riku.voipio@iki.fi> | 2687 | M: Riku Voipio <riku.voipio@iki.fi> |
2688 | L: lm-sensors@lm-sensors.org | 2688 | L: lm-sensors@lm-sensors.org |
2689 | S: Maintained | 2689 | S: Maintained |
2690 | F: drivers/hwmon/f75375s.c | 2690 | F: drivers/hwmon/f75375s.c |
2691 | F: include/linux/f75375s.h | 2691 | F: include/linux/f75375s.h |
2692 | 2692 | ||
2693 | FIREWIRE AUDIO DRIVERS | 2693 | FIREWIRE AUDIO DRIVERS |
2694 | M: Clemens Ladisch <clemens@ladisch.de> | 2694 | M: Clemens Ladisch <clemens@ladisch.de> |
2695 | L: alsa-devel@alsa-project.org (moderated for non-subscribers) | 2695 | L: alsa-devel@alsa-project.org (moderated for non-subscribers) |
2696 | T: git git://git.alsa-project.org/alsa-kernel.git | 2696 | T: git git://git.alsa-project.org/alsa-kernel.git |
2697 | S: Maintained | 2697 | S: Maintained |
2698 | F: sound/firewire/ | 2698 | F: sound/firewire/ |
2699 | 2699 | ||
2700 | FIREWIRE SUBSYSTEM | 2700 | FIREWIRE SUBSYSTEM |
2701 | M: Stefan Richter <stefanr@s5r6.in-berlin.de> | 2701 | M: Stefan Richter <stefanr@s5r6.in-berlin.de> |
2702 | L: linux1394-devel@lists.sourceforge.net | 2702 | L: linux1394-devel@lists.sourceforge.net |
2703 | W: http://ieee1394.wiki.kernel.org/ | 2703 | W: http://ieee1394.wiki.kernel.org/ |
2704 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394.git | 2704 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394.git |
2705 | S: Maintained | 2705 | S: Maintained |
2706 | F: drivers/firewire/ | 2706 | F: drivers/firewire/ |
2707 | F: include/linux/firewire*.h | 2707 | F: include/linux/firewire*.h |
2708 | F: tools/firewire/ | 2708 | F: tools/firewire/ |
2709 | 2709 | ||
2710 | FIRMWARE LOADER (request_firmware) | 2710 | FIRMWARE LOADER (request_firmware) |
2711 | S: Orphan | 2711 | S: Orphan |
2712 | F: Documentation/firmware_class/ | 2712 | F: Documentation/firmware_class/ |
2713 | F: drivers/base/firmware*.c | 2713 | F: drivers/base/firmware*.c |
2714 | F: include/linux/firmware.h | 2714 | F: include/linux/firmware.h |
2715 | 2715 | ||
2716 | FPU EMULATOR | 2716 | FPU EMULATOR |
2717 | M: Bill Metzenthen <billm@melbpc.org.au> | 2717 | M: Bill Metzenthen <billm@melbpc.org.au> |
2718 | W: http://floatingpoint.sourceforge.net/emulator/index.html | 2718 | W: http://floatingpoint.sourceforge.net/emulator/index.html |
2719 | S: Maintained | 2719 | S: Maintained |
2720 | F: arch/x86/math-emu/ | 2720 | F: arch/x86/math-emu/ |
2721 | 2721 | ||
2722 | FRAME RELAY DLCI/FRAD (Sangoma drivers too) | 2722 | FRAME RELAY DLCI/FRAD (Sangoma drivers too) |
2723 | L: netdev@vger.kernel.org | 2723 | L: netdev@vger.kernel.org |
2724 | S: Orphan | 2724 | S: Orphan |
2725 | F: drivers/net/wan/dlci.c | 2725 | F: drivers/net/wan/dlci.c |
2726 | F: drivers/net/wan/sdla.c | 2726 | F: drivers/net/wan/sdla.c |
2727 | 2727 | ||
2728 | FRAMEBUFFER LAYER | 2728 | FRAMEBUFFER LAYER |
2729 | M: Florian Tobias Schandinat <FlorianSchandinat@gmx.de> | 2729 | M: Florian Tobias Schandinat <FlorianSchandinat@gmx.de> |
2730 | L: linux-fbdev@vger.kernel.org | 2730 | L: linux-fbdev@vger.kernel.org |
2731 | W: http://linux-fbdev.sourceforge.net/ | 2731 | W: http://linux-fbdev.sourceforge.net/ |
2732 | Q: http://patchwork.kernel.org/project/linux-fbdev/list/ | 2732 | Q: http://patchwork.kernel.org/project/linux-fbdev/list/ |
2733 | T: git git://github.com/schandinat/linux-2.6.git fbdev-next | 2733 | T: git git://github.com/schandinat/linux-2.6.git fbdev-next |
2734 | S: Maintained | 2734 | S: Maintained |
2735 | F: Documentation/fb/ | 2735 | F: Documentation/fb/ |
2736 | F: Documentation/devicetree/bindings/fb/ | 2736 | F: Documentation/devicetree/bindings/fb/ |
2737 | F: drivers/video/ | 2737 | F: drivers/video/ |
2738 | F: include/video/ | 2738 | F: include/video/ |
2739 | F: include/linux/fb.h | 2739 | F: include/linux/fb.h |
2740 | 2740 | ||
2741 | FREESCALE DMA DRIVER | 2741 | FREESCALE DMA DRIVER |
2742 | M: Li Yang <leoli@freescale.com> | 2742 | M: Li Yang <leoli@freescale.com> |
2743 | M: Zhang Wei <zw@zh-kernel.org> | 2743 | M: Zhang Wei <zw@zh-kernel.org> |
2744 | L: linuxppc-dev@lists.ozlabs.org | 2744 | L: linuxppc-dev@lists.ozlabs.org |
2745 | S: Maintained | 2745 | S: Maintained |
2746 | F: drivers/dma/fsldma.* | 2746 | F: drivers/dma/fsldma.* |
2747 | 2747 | ||
2748 | FREESCALE I2C CPM DRIVER | 2748 | FREESCALE I2C CPM DRIVER |
2749 | M: Jochen Friedrich <jochen@scram.de> | 2749 | M: Jochen Friedrich <jochen@scram.de> |
2750 | L: linuxppc-dev@lists.ozlabs.org | 2750 | L: linuxppc-dev@lists.ozlabs.org |
2751 | L: linux-i2c@vger.kernel.org | 2751 | L: linux-i2c@vger.kernel.org |
2752 | S: Maintained | 2752 | S: Maintained |
2753 | F: drivers/i2c/busses/i2c-cpm.c | 2753 | F: drivers/i2c/busses/i2c-cpm.c |
2754 | 2754 | ||
2755 | FREESCALE IMX / MXC FRAMEBUFFER DRIVER | 2755 | FREESCALE IMX / MXC FRAMEBUFFER DRIVER |
2756 | M: Sascha Hauer <kernel@pengutronix.de> | 2756 | M: Sascha Hauer <kernel@pengutronix.de> |
2757 | L: linux-fbdev@vger.kernel.org | 2757 | L: linux-fbdev@vger.kernel.org |
2758 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 2758 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
2759 | S: Maintained | 2759 | S: Maintained |
2760 | F: arch/arm/plat-mxc/include/mach/imxfb.h | 2760 | F: arch/arm/plat-mxc/include/mach/imxfb.h |
2761 | F: drivers/video/imxfb.c | 2761 | F: drivers/video/imxfb.c |
2762 | 2762 | ||
2763 | FREESCALE SOC FS_ENET DRIVER | 2763 | FREESCALE SOC FS_ENET DRIVER |
2764 | M: Pantelis Antoniou <pantelis.antoniou@gmail.com> | 2764 | M: Pantelis Antoniou <pantelis.antoniou@gmail.com> |
2765 | M: Vitaly Bordug <vbordug@ru.mvista.com> | 2765 | M: Vitaly Bordug <vbordug@ru.mvista.com> |
2766 | L: linuxppc-dev@lists.ozlabs.org | 2766 | L: linuxppc-dev@lists.ozlabs.org |
2767 | L: netdev@vger.kernel.org | 2767 | L: netdev@vger.kernel.org |
2768 | S: Maintained | 2768 | S: Maintained |
2769 | F: drivers/net/ethernet/freescale/fs_enet/ | 2769 | F: drivers/net/ethernet/freescale/fs_enet/ |
2770 | F: include/linux/fs_enet_pd.h | 2770 | F: include/linux/fs_enet_pd.h |
2771 | 2771 | ||
2772 | FREESCALE QUICC ENGINE LIBRARY | 2772 | FREESCALE QUICC ENGINE LIBRARY |
2773 | M: Timur Tabi <timur@freescale.com> | 2773 | M: Timur Tabi <timur@freescale.com> |
2774 | L: linuxppc-dev@lists.ozlabs.org | 2774 | L: linuxppc-dev@lists.ozlabs.org |
2775 | S: Supported | 2775 | S: Supported |
2776 | F: arch/powerpc/sysdev/qe_lib/ | 2776 | F: arch/powerpc/sysdev/qe_lib/ |
2777 | F: arch/powerpc/include/asm/*qe.h | 2777 | F: arch/powerpc/include/asm/*qe.h |
2778 | 2778 | ||
2779 | FREESCALE USB PERIPHERAL DRIVERS | 2779 | FREESCALE USB PERIPHERAL DRIVERS |
2780 | M: Li Yang <leoli@freescale.com> | 2780 | M: Li Yang <leoli@freescale.com> |
2781 | L: linux-usb@vger.kernel.org | 2781 | L: linux-usb@vger.kernel.org |
2782 | L: linuxppc-dev@lists.ozlabs.org | 2782 | L: linuxppc-dev@lists.ozlabs.org |
2783 | S: Maintained | 2783 | S: Maintained |
2784 | F: drivers/usb/gadget/fsl* | 2784 | F: drivers/usb/gadget/fsl* |
2785 | 2785 | ||
2786 | FREESCALE QUICC ENGINE UCC ETHERNET DRIVER | 2786 | FREESCALE QUICC ENGINE UCC ETHERNET DRIVER |
2787 | M: Li Yang <leoli@freescale.com> | 2787 | M: Li Yang <leoli@freescale.com> |
2788 | L: netdev@vger.kernel.org | 2788 | L: netdev@vger.kernel.org |
2789 | L: linuxppc-dev@lists.ozlabs.org | 2789 | L: linuxppc-dev@lists.ozlabs.org |
2790 | S: Maintained | 2790 | S: Maintained |
2791 | F: drivers/net/ethernet/freescale/ucc_geth* | 2791 | F: drivers/net/ethernet/freescale/ucc_geth* |
2792 | 2792 | ||
2793 | FREESCALE QUICC ENGINE UCC UART DRIVER | 2793 | FREESCALE QUICC ENGINE UCC UART DRIVER |
2794 | M: Timur Tabi <timur@freescale.com> | 2794 | M: Timur Tabi <timur@freescale.com> |
2795 | L: linuxppc-dev@lists.ozlabs.org | 2795 | L: linuxppc-dev@lists.ozlabs.org |
2796 | S: Supported | 2796 | S: Supported |
2797 | F: drivers/tty/serial/ucc_uart.c | 2797 | F: drivers/tty/serial/ucc_uart.c |
2798 | 2798 | ||
2799 | FREESCALE SOC SOUND DRIVERS | 2799 | FREESCALE SOC SOUND DRIVERS |
2800 | M: Timur Tabi <timur@freescale.com> | 2800 | M: Timur Tabi <timur@freescale.com> |
2801 | L: alsa-devel@alsa-project.org (moderated for non-subscribers) | 2801 | L: alsa-devel@alsa-project.org (moderated for non-subscribers) |
2802 | L: linuxppc-dev@lists.ozlabs.org | 2802 | L: linuxppc-dev@lists.ozlabs.org |
2803 | S: Supported | 2803 | S: Supported |
2804 | F: sound/soc/fsl/fsl* | 2804 | F: sound/soc/fsl/fsl* |
2805 | F: sound/soc/fsl/mpc8610_hpcd.c | 2805 | F: sound/soc/fsl/mpc8610_hpcd.c |
2806 | 2806 | ||
2807 | FREEVXFS FILESYSTEM | 2807 | FREEVXFS FILESYSTEM |
2808 | M: Christoph Hellwig <hch@infradead.org> | 2808 | M: Christoph Hellwig <hch@infradead.org> |
2809 | W: ftp://ftp.openlinux.org/pub/people/hch/vxfs | 2809 | W: ftp://ftp.openlinux.org/pub/people/hch/vxfs |
2810 | S: Maintained | 2810 | S: Maintained |
2811 | F: fs/freevxfs/ | 2811 | F: fs/freevxfs/ |
2812 | 2812 | ||
2813 | FREEZER | 2813 | FREEZER |
2814 | M: Pavel Machek <pavel@ucw.cz> | 2814 | M: Pavel Machek <pavel@ucw.cz> |
2815 | M: "Rafael J. Wysocki" <rjw@sisk.pl> | 2815 | M: "Rafael J. Wysocki" <rjw@sisk.pl> |
2816 | L: linux-pm@vger.kernel.org | 2816 | L: linux-pm@vger.kernel.org |
2817 | S: Supported | 2817 | S: Supported |
2818 | F: Documentation/power/freezing-of-tasks.txt | 2818 | F: Documentation/power/freezing-of-tasks.txt |
2819 | F: include/linux/freezer.h | 2819 | F: include/linux/freezer.h |
2820 | F: kernel/freezer.c | 2820 | F: kernel/freezer.c |
2821 | 2821 | ||
2822 | FS-CACHE: LOCAL CACHING FOR NETWORK FILESYSTEMS | 2822 | FS-CACHE: LOCAL CACHING FOR NETWORK FILESYSTEMS |
2823 | M: David Howells <dhowells@redhat.com> | 2823 | M: David Howells <dhowells@redhat.com> |
2824 | L: linux-cachefs@redhat.com | 2824 | L: linux-cachefs@redhat.com |
2825 | S: Supported | 2825 | S: Supported |
2826 | F: Documentation/filesystems/caching/ | 2826 | F: Documentation/filesystems/caching/ |
2827 | F: fs/fscache/ | 2827 | F: fs/fscache/ |
2828 | F: include/linux/fscache*.h | 2828 | F: include/linux/fscache*.h |
2829 | 2829 | ||
2830 | FUJITSU FR-V (FRV) PORT | 2830 | FUJITSU FR-V (FRV) PORT |
2831 | M: David Howells <dhowells@redhat.com> | 2831 | M: David Howells <dhowells@redhat.com> |
2832 | S: Maintained | 2832 | S: Maintained |
2833 | F: arch/frv/ | 2833 | F: arch/frv/ |
2834 | 2834 | ||
2835 | FUJITSU LAPTOP EXTRAS | 2835 | FUJITSU LAPTOP EXTRAS |
2836 | M: Jonathan Woithe <jwoithe@physics.adelaide.edu.au> | 2836 | M: Jonathan Woithe <jwoithe@physics.adelaide.edu.au> |
2837 | L: platform-driver-x86@vger.kernel.org | 2837 | L: platform-driver-x86@vger.kernel.org |
2838 | S: Maintained | 2838 | S: Maintained |
2839 | F: drivers/platform/x86/fujitsu-laptop.c | 2839 | F: drivers/platform/x86/fujitsu-laptop.c |
2840 | 2840 | ||
2841 | FUJITSU M-5MO LS CAMERA ISP DRIVER | 2841 | FUJITSU M-5MO LS CAMERA ISP DRIVER |
2842 | M: Kyungmin Park <kyungmin.park@samsung.com> | 2842 | M: Kyungmin Park <kyungmin.park@samsung.com> |
2843 | M: Heungjun Kim <riverful.kim@samsung.com> | 2843 | M: Heungjun Kim <riverful.kim@samsung.com> |
2844 | L: linux-media@vger.kernel.org | 2844 | L: linux-media@vger.kernel.org |
2845 | S: Maintained | 2845 | S: Maintained |
2846 | F: drivers/media/video/m5mols/ | 2846 | F: drivers/media/video/m5mols/ |
2847 | F: include/media/m5mols.h | 2847 | F: include/media/m5mols.h |
2848 | 2848 | ||
2849 | FUSE: FILESYSTEM IN USERSPACE | 2849 | FUSE: FILESYSTEM IN USERSPACE |
2850 | M: Miklos Szeredi <miklos@szeredi.hu> | 2850 | M: Miklos Szeredi <miklos@szeredi.hu> |
2851 | L: fuse-devel@lists.sourceforge.net | 2851 | L: fuse-devel@lists.sourceforge.net |
2852 | W: http://fuse.sourceforge.net/ | 2852 | W: http://fuse.sourceforge.net/ |
2853 | S: Maintained | 2853 | S: Maintained |
2854 | F: fs/fuse/ | 2854 | F: fs/fuse/ |
2855 | F: include/linux/fuse.h | 2855 | F: include/linux/fuse.h |
2856 | 2856 | ||
2857 | FUTURE DOMAIN TMC-16x0 SCSI DRIVER (16-bit) | 2857 | FUTURE DOMAIN TMC-16x0 SCSI DRIVER (16-bit) |
2858 | M: Rik Faith <faith@cs.unc.edu> | 2858 | M: Rik Faith <faith@cs.unc.edu> |
2859 | L: linux-scsi@vger.kernel.org | 2859 | L: linux-scsi@vger.kernel.org |
2860 | S: Odd Fixes (e.g., new signatures) | 2860 | S: Odd Fixes (e.g., new signatures) |
2861 | F: drivers/scsi/fdomain.* | 2861 | F: drivers/scsi/fdomain.* |
2862 | 2862 | ||
2863 | GDT SCSI DISK ARRAY CONTROLLER DRIVER | 2863 | GDT SCSI DISK ARRAY CONTROLLER DRIVER |
2864 | M: Achim Leubner <achim_leubner@adaptec.com> | 2864 | M: Achim Leubner <achim_leubner@adaptec.com> |
2865 | L: linux-scsi@vger.kernel.org | 2865 | L: linux-scsi@vger.kernel.org |
2866 | W: http://www.icp-vortex.com/ | 2866 | W: http://www.icp-vortex.com/ |
2867 | S: Supported | 2867 | S: Supported |
2868 | F: drivers/scsi/gdt* | 2868 | F: drivers/scsi/gdt* |
2869 | 2869 | ||
2870 | GENERIC GPIO I2C DRIVER | 2870 | GENERIC GPIO I2C DRIVER |
2871 | M: Haavard Skinnemoen <hskinnemoen@gmail.com> | 2871 | M: Haavard Skinnemoen <hskinnemoen@gmail.com> |
2872 | S: Supported | 2872 | S: Supported |
2873 | F: drivers/i2c/busses/i2c-gpio.c | 2873 | F: drivers/i2c/busses/i2c-gpio.c |
2874 | F: include/linux/i2c-gpio.h | 2874 | F: include/linux/i2c-gpio.h |
2875 | 2875 | ||
2876 | GENERIC GPIO I2C MULTIPLEXER DRIVER | 2876 | GENERIC GPIO I2C MULTIPLEXER DRIVER |
2877 | M: Peter Korsgaard <peter.korsgaard@barco.com> | 2877 | M: Peter Korsgaard <peter.korsgaard@barco.com> |
2878 | L: linux-i2c@vger.kernel.org | 2878 | L: linux-i2c@vger.kernel.org |
2879 | S: Supported | 2879 | S: Supported |
2880 | F: drivers/i2c/muxes/gpio-i2cmux.c | 2880 | F: drivers/i2c/muxes/gpio-i2cmux.c |
2881 | F: include/linux/gpio-i2cmux.h | 2881 | F: include/linux/gpio-i2cmux.h |
2882 | F: Documentation/i2c/muxes/gpio-i2cmux | 2882 | F: Documentation/i2c/muxes/gpio-i2cmux |
2883 | 2883 | ||
2884 | GENERIC HDLC (WAN) DRIVERS | 2884 | GENERIC HDLC (WAN) DRIVERS |
2885 | M: Krzysztof Halasa <khc@pm.waw.pl> | 2885 | M: Krzysztof Halasa <khc@pm.waw.pl> |
2886 | W: http://www.kernel.org/pub/linux/utils/net/hdlc/ | 2886 | W: http://www.kernel.org/pub/linux/utils/net/hdlc/ |
2887 | S: Maintained | 2887 | S: Maintained |
2888 | F: drivers/net/wan/c101.c | 2888 | F: drivers/net/wan/c101.c |
2889 | F: drivers/net/wan/hd6457* | 2889 | F: drivers/net/wan/hd6457* |
2890 | F: drivers/net/wan/hdlc* | 2890 | F: drivers/net/wan/hdlc* |
2891 | F: drivers/net/wan/n2.c | 2891 | F: drivers/net/wan/n2.c |
2892 | F: drivers/net/wan/pc300too.c | 2892 | F: drivers/net/wan/pc300too.c |
2893 | F: drivers/net/wan/pci200syn.c | 2893 | F: drivers/net/wan/pci200syn.c |
2894 | F: drivers/net/wan/wanxl* | 2894 | F: drivers/net/wan/wanxl* |
2895 | 2895 | ||
2896 | GENERIC INCLUDE/ASM HEADER FILES | 2896 | GENERIC INCLUDE/ASM HEADER FILES |
2897 | M: Arnd Bergmann <arnd@arndb.de> | 2897 | M: Arnd Bergmann <arnd@arndb.de> |
2898 | L: linux-arch@vger.kernel.org | 2898 | L: linux-arch@vger.kernel.org |
2899 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/arnd/asm-generic.git | 2899 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/arnd/asm-generic.git |
2900 | S: Maintained | 2900 | S: Maintained |
2901 | F: include/asm-generic | 2901 | F: include/asm-generic |
2902 | 2902 | ||
2903 | GENERIC UIO DRIVER FOR PCI DEVICES | 2903 | GENERIC UIO DRIVER FOR PCI DEVICES |
2904 | M: "Michael S. Tsirkin" <mst@redhat.com> | 2904 | M: "Michael S. Tsirkin" <mst@redhat.com> |
2905 | L: kvm@vger.kernel.org | 2905 | L: kvm@vger.kernel.org |
2906 | S: Supported | 2906 | S: Supported |
2907 | F: drivers/uio/uio_pci_generic.c | 2907 | F: drivers/uio/uio_pci_generic.c |
2908 | 2908 | ||
2909 | GFS2 FILE SYSTEM | 2909 | GFS2 FILE SYSTEM |
2910 | M: Steven Whitehouse <swhiteho@redhat.com> | 2910 | M: Steven Whitehouse <swhiteho@redhat.com> |
2911 | L: cluster-devel@redhat.com | 2911 | L: cluster-devel@redhat.com |
2912 | W: http://sources.redhat.com/cluster/ | 2912 | W: http://sources.redhat.com/cluster/ |
2913 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/steve/gfs2-2.6-fixes.git | 2913 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/steve/gfs2-2.6-fixes.git |
2914 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/steve/gfs2-2.6-nmw.git | 2914 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/steve/gfs2-2.6-nmw.git |
2915 | S: Supported | 2915 | S: Supported |
2916 | F: Documentation/filesystems/gfs2*.txt | 2916 | F: Documentation/filesystems/gfs2*.txt |
2917 | F: fs/gfs2/ | 2917 | F: fs/gfs2/ |
2918 | F: include/linux/gfs2_ondisk.h | 2918 | F: include/linux/gfs2_ondisk.h |
2919 | 2919 | ||
2920 | GIGASET ISDN DRIVERS | 2920 | GIGASET ISDN DRIVERS |
2921 | M: Hansjoerg Lipp <hjlipp@web.de> | 2921 | M: Hansjoerg Lipp <hjlipp@web.de> |
2922 | M: Tilman Schmidt <tilman@imap.cc> | 2922 | M: Tilman Schmidt <tilman@imap.cc> |
2923 | L: gigaset307x-common@lists.sourceforge.net | 2923 | L: gigaset307x-common@lists.sourceforge.net |
2924 | W: http://gigaset307x.sourceforge.net/ | 2924 | W: http://gigaset307x.sourceforge.net/ |
2925 | S: Maintained | 2925 | S: Maintained |
2926 | F: Documentation/isdn/README.gigaset | 2926 | F: Documentation/isdn/README.gigaset |
2927 | F: drivers/isdn/gigaset/ | 2927 | F: drivers/isdn/gigaset/ |
2928 | F: include/linux/gigaset_dev.h | 2928 | F: include/linux/gigaset_dev.h |
2929 | 2929 | ||
2930 | GPIO SUBSYSTEM | 2930 | GPIO SUBSYSTEM |
2931 | M: Grant Likely <grant.likely@secretlab.ca> | 2931 | M: Grant Likely <grant.likely@secretlab.ca> |
2932 | M: Linus Walleij <linus.walleij@stericsson.com> | 2932 | M: Linus Walleij <linus.walleij@stericsson.com> |
2933 | S: Maintained | 2933 | S: Maintained |
2934 | T: git git://git.secretlab.ca/git/linux-2.6.git | 2934 | T: git git://git.secretlab.ca/git/linux-2.6.git |
2935 | F: Documentation/gpio.txt | 2935 | F: Documentation/gpio.txt |
2936 | F: drivers/gpio/ | 2936 | F: drivers/gpio/ |
2937 | F: include/linux/gpio* | 2937 | F: include/linux/gpio* |
2938 | 2938 | ||
2939 | GRE DEMULTIPLEXER DRIVER | 2939 | GRE DEMULTIPLEXER DRIVER |
2940 | M: Dmitry Kozlov <xeb@mail.ru> | 2940 | M: Dmitry Kozlov <xeb@mail.ru> |
2941 | L: netdev@vger.kernel.org | 2941 | L: netdev@vger.kernel.org |
2942 | S: Maintained | 2942 | S: Maintained |
2943 | F: net/ipv4/gre.c | 2943 | F: net/ipv4/gre.c |
2944 | F: include/net/gre.h | 2944 | F: include/net/gre.h |
2945 | 2945 | ||
2946 | GRETH 10/100/1G Ethernet MAC device driver | 2946 | GRETH 10/100/1G Ethernet MAC device driver |
2947 | M: Kristoffer Glembo <kristoffer@gaisler.com> | 2947 | M: Kristoffer Glembo <kristoffer@gaisler.com> |
2948 | L: netdev@vger.kernel.org | 2948 | L: netdev@vger.kernel.org |
2949 | S: Maintained | 2949 | S: Maintained |
2950 | F: drivers/net/ethernet/aeroflex/ | 2950 | F: drivers/net/ethernet/aeroflex/ |
2951 | 2951 | ||
2952 | GSPCA FINEPIX SUBDRIVER | 2952 | GSPCA FINEPIX SUBDRIVER |
2953 | M: Frank Zago <frank@zago.net> | 2953 | M: Frank Zago <frank@zago.net> |
2954 | L: linux-media@vger.kernel.org | 2954 | L: linux-media@vger.kernel.org |
2955 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git | 2955 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git |
2956 | S: Maintained | 2956 | S: Maintained |
2957 | F: drivers/media/video/gspca/finepix.c | 2957 | F: drivers/media/video/gspca/finepix.c |
2958 | 2958 | ||
2959 | GSPCA GL860 SUBDRIVER | 2959 | GSPCA GL860 SUBDRIVER |
2960 | M: Olivier Lorin <o.lorin@laposte.net> | 2960 | M: Olivier Lorin <o.lorin@laposte.net> |
2961 | L: linux-media@vger.kernel.org | 2961 | L: linux-media@vger.kernel.org |
2962 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git | 2962 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git |
2963 | S: Maintained | 2963 | S: Maintained |
2964 | F: drivers/media/video/gspca/gl860/ | 2964 | F: drivers/media/video/gspca/gl860/ |
2965 | 2965 | ||
2966 | GSPCA M5602 SUBDRIVER | 2966 | GSPCA M5602 SUBDRIVER |
2967 | M: Erik Andren <erik.andren@gmail.com> | 2967 | M: Erik Andren <erik.andren@gmail.com> |
2968 | L: linux-media@vger.kernel.org | 2968 | L: linux-media@vger.kernel.org |
2969 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git | 2969 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git |
2970 | S: Maintained | 2970 | S: Maintained |
2971 | F: drivers/media/video/gspca/m5602/ | 2971 | F: drivers/media/video/gspca/m5602/ |
2972 | 2972 | ||
2973 | GSPCA PAC207 SONIXB SUBDRIVER | 2973 | GSPCA PAC207 SONIXB SUBDRIVER |
2974 | M: Hans de Goede <hdegoede@redhat.com> | 2974 | M: Hans de Goede <hdegoede@redhat.com> |
2975 | L: linux-media@vger.kernel.org | 2975 | L: linux-media@vger.kernel.org |
2976 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git | 2976 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git |
2977 | S: Maintained | 2977 | S: Maintained |
2978 | F: drivers/media/video/gspca/pac207.c | 2978 | F: drivers/media/video/gspca/pac207.c |
2979 | 2979 | ||
2980 | GSPCA SN9C20X SUBDRIVER | 2980 | GSPCA SN9C20X SUBDRIVER |
2981 | M: Brian Johnson <brijohn@gmail.com> | 2981 | M: Brian Johnson <brijohn@gmail.com> |
2982 | L: linux-media@vger.kernel.org | 2982 | L: linux-media@vger.kernel.org |
2983 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git | 2983 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git |
2984 | S: Maintained | 2984 | S: Maintained |
2985 | F: drivers/media/video/gspca/sn9c20x.c | 2985 | F: drivers/media/video/gspca/sn9c20x.c |
2986 | 2986 | ||
2987 | GSPCA T613 SUBDRIVER | 2987 | GSPCA T613 SUBDRIVER |
2988 | M: Leandro Costantino <lcostantino@gmail.com> | 2988 | M: Leandro Costantino <lcostantino@gmail.com> |
2989 | L: linux-media@vger.kernel.org | 2989 | L: linux-media@vger.kernel.org |
2990 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git | 2990 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git |
2991 | S: Maintained | 2991 | S: Maintained |
2992 | F: drivers/media/video/gspca/t613.c | 2992 | F: drivers/media/video/gspca/t613.c |
2993 | 2993 | ||
2994 | GSPCA USB WEBCAM DRIVER | 2994 | GSPCA USB WEBCAM DRIVER |
2995 | M: Jean-Francois Moine <moinejf@free.fr> | 2995 | M: Jean-Francois Moine <moinejf@free.fr> |
2996 | W: http://moinejf.free.fr | 2996 | W: http://moinejf.free.fr |
2997 | L: linux-media@vger.kernel.org | 2997 | L: linux-media@vger.kernel.org |
2998 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git | 2998 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git |
2999 | S: Maintained | 2999 | S: Maintained |
3000 | F: drivers/media/video/gspca/ | 3000 | F: drivers/media/video/gspca/ |
3001 | 3001 | ||
3002 | HARD DRIVE ACTIVE PROTECTION SYSTEM (HDAPS) DRIVER | 3002 | HARD DRIVE ACTIVE PROTECTION SYSTEM (HDAPS) DRIVER |
3003 | M: Frank Seidel <frank@f-seidel.de> | 3003 | M: Frank Seidel <frank@f-seidel.de> |
3004 | L: platform-driver-x86@vger.kernel.org | 3004 | L: platform-driver-x86@vger.kernel.org |
3005 | W: http://www.kernel.org/pub/linux/kernel/people/fseidel/hdaps/ | 3005 | W: http://www.kernel.org/pub/linux/kernel/people/fseidel/hdaps/ |
3006 | S: Maintained | 3006 | S: Maintained |
3007 | F: drivers/platform/x86/hdaps.c | 3007 | F: drivers/platform/x86/hdaps.c |
3008 | 3008 | ||
3009 | HWPOISON MEMORY FAILURE HANDLING | 3009 | HWPOISON MEMORY FAILURE HANDLING |
3010 | M: Andi Kleen <andi@firstfloor.org> | 3010 | M: Andi Kleen <andi@firstfloor.org> |
3011 | L: linux-mm@kvack.org | 3011 | L: linux-mm@kvack.org |
3012 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/ak/linux-mce-2.6.git hwpoison | 3012 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/ak/linux-mce-2.6.git hwpoison |
3013 | S: Maintained | 3013 | S: Maintained |
3014 | F: mm/memory-failure.c | 3014 | F: mm/memory-failure.c |
3015 | F: mm/hwpoison-inject.c | 3015 | F: mm/hwpoison-inject.c |
3016 | 3016 | ||
3017 | HYPERVISOR VIRTUAL CONSOLE DRIVER | 3017 | HYPERVISOR VIRTUAL CONSOLE DRIVER |
3018 | L: linuxppc-dev@lists.ozlabs.org | 3018 | L: linuxppc-dev@lists.ozlabs.org |
3019 | S: Odd Fixes | 3019 | S: Odd Fixes |
3020 | F: drivers/tty/hvc/ | 3020 | F: drivers/tty/hvc/ |
3021 | 3021 | ||
3022 | HARDWARE MONITORING | 3022 | HARDWARE MONITORING |
3023 | M: Jean Delvare <khali@linux-fr.org> | 3023 | M: Jean Delvare <khali@linux-fr.org> |
3024 | M: Guenter Roeck <guenter.roeck@ericsson.com> | 3024 | M: Guenter Roeck <guenter.roeck@ericsson.com> |
3025 | L: lm-sensors@lm-sensors.org | 3025 | L: lm-sensors@lm-sensors.org |
3026 | W: http://www.lm-sensors.org/ | 3026 | W: http://www.lm-sensors.org/ |
3027 | T: quilt kernel.org/pub/linux/kernel/people/jdelvare/linux-2.6/jdelvare-hwmon/ | 3027 | T: quilt kernel.org/pub/linux/kernel/people/jdelvare/linux-2.6/jdelvare-hwmon/ |
3028 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git | 3028 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git |
3029 | S: Maintained | 3029 | S: Maintained |
3030 | F: Documentation/hwmon/ | 3030 | F: Documentation/hwmon/ |
3031 | F: drivers/hwmon/ | 3031 | F: drivers/hwmon/ |
3032 | F: include/linux/hwmon*.h | 3032 | F: include/linux/hwmon*.h |
3033 | 3033 | ||
3034 | HARDWARE RANDOM NUMBER GENERATOR CORE | 3034 | HARDWARE RANDOM NUMBER GENERATOR CORE |
3035 | M: Matt Mackall <mpm@selenic.com> | 3035 | M: Matt Mackall <mpm@selenic.com> |
3036 | M: Herbert Xu <herbert@gondor.apana.org.au> | 3036 | M: Herbert Xu <herbert@gondor.apana.org.au> |
3037 | S: Odd fixes | 3037 | S: Odd fixes |
3038 | F: Documentation/hw_random.txt | 3038 | F: Documentation/hw_random.txt |
3039 | F: drivers/char/hw_random/ | 3039 | F: drivers/char/hw_random/ |
3040 | F: include/linux/hw_random.h | 3040 | F: include/linux/hw_random.h |
3041 | 3041 | ||
3042 | HARDWARE SPINLOCK CORE | 3042 | HARDWARE SPINLOCK CORE |
3043 | M: Ohad Ben-Cohen <ohad@wizery.com> | 3043 | M: Ohad Ben-Cohen <ohad@wizery.com> |
3044 | S: Maintained | 3044 | S: Maintained |
3045 | F: Documentation/hwspinlock.txt | 3045 | F: Documentation/hwspinlock.txt |
3046 | F: drivers/hwspinlock/hwspinlock_* | 3046 | F: drivers/hwspinlock/hwspinlock_* |
3047 | F: include/linux/hwspinlock.h | 3047 | F: include/linux/hwspinlock.h |
3048 | 3048 | ||
3049 | HARMONY SOUND DRIVER | 3049 | HARMONY SOUND DRIVER |
3050 | M: Kyle McMartin <kyle@mcmartin.ca> | 3050 | M: Kyle McMartin <kyle@mcmartin.ca> |
3051 | L: linux-parisc@vger.kernel.org | 3051 | L: linux-parisc@vger.kernel.org |
3052 | S: Maintained | 3052 | S: Maintained |
3053 | F: sound/parisc/harmony.* | 3053 | F: sound/parisc/harmony.* |
3054 | 3054 | ||
3055 | HEWLETT-PACKARD SMART2 RAID DRIVER | 3055 | HEWLETT-PACKARD SMART2 RAID DRIVER |
3056 | M: Chirag Kantharia <chirag.kantharia@hp.com> | 3056 | M: Chirag Kantharia <chirag.kantharia@hp.com> |
3057 | L: iss_storagedev@hp.com | 3057 | L: iss_storagedev@hp.com |
3058 | S: Maintained | 3058 | S: Maintained |
3059 | F: Documentation/blockdev/cpqarray.txt | 3059 | F: Documentation/blockdev/cpqarray.txt |
3060 | F: drivers/block/cpqarray.* | 3060 | F: drivers/block/cpqarray.* |
3061 | 3061 | ||
3062 | HEWLETT-PACKARD SMART ARRAY RAID DRIVER (hpsa) | 3062 | HEWLETT-PACKARD SMART ARRAY RAID DRIVER (hpsa) |
3063 | M: "Stephen M. Cameron" <scameron@beardog.cce.hp.com> | 3063 | M: "Stephen M. Cameron" <scameron@beardog.cce.hp.com> |
3064 | L: iss_storagedev@hp.com | 3064 | L: iss_storagedev@hp.com |
3065 | S: Supported | 3065 | S: Supported |
3066 | F: Documentation/scsi/hpsa.txt | 3066 | F: Documentation/scsi/hpsa.txt |
3067 | F: drivers/scsi/hpsa*.[ch] | 3067 | F: drivers/scsi/hpsa*.[ch] |
3068 | F: include/linux/cciss*.h | 3068 | F: include/linux/cciss*.h |
3069 | 3069 | ||
3070 | HEWLETT-PACKARD SMART CISS RAID DRIVER (cciss) | 3070 | HEWLETT-PACKARD SMART CISS RAID DRIVER (cciss) |
3071 | M: Mike Miller <mike.miller@hp.com> | 3071 | M: Mike Miller <mike.miller@hp.com> |
3072 | L: iss_storagedev@hp.com | 3072 | L: iss_storagedev@hp.com |
3073 | S: Supported | 3073 | S: Supported |
3074 | F: Documentation/blockdev/cciss.txt | 3074 | F: Documentation/blockdev/cciss.txt |
3075 | F: drivers/block/cciss* | 3075 | F: drivers/block/cciss* |
3076 | F: include/linux/cciss_ioctl.h | 3076 | F: include/linux/cciss_ioctl.h |
3077 | 3077 | ||
3078 | HFS FILESYSTEM | 3078 | HFS FILESYSTEM |
3079 | L: linux-fsdevel@vger.kernel.org | 3079 | L: linux-fsdevel@vger.kernel.org |
3080 | S: Orphan | 3080 | S: Orphan |
3081 | F: Documentation/filesystems/hfs.txt | 3081 | F: Documentation/filesystems/hfs.txt |
3082 | F: fs/hfs/ | 3082 | F: fs/hfs/ |
3083 | 3083 | ||
3084 | HGA FRAMEBUFFER DRIVER | 3084 | HGA FRAMEBUFFER DRIVER |
3085 | M: Ferenc Bakonyi <fero@drama.obuda.kando.hu> | 3085 | M: Ferenc Bakonyi <fero@drama.obuda.kando.hu> |
3086 | L: linux-nvidia@lists.surfsouth.com | 3086 | L: linux-nvidia@lists.surfsouth.com |
3087 | W: http://drama.obuda.kando.hu/~fero/cgi-bin/hgafb.shtml | 3087 | W: http://drama.obuda.kando.hu/~fero/cgi-bin/hgafb.shtml |
3088 | S: Maintained | 3088 | S: Maintained |
3089 | F: drivers/video/hgafb.c | 3089 | F: drivers/video/hgafb.c |
3090 | 3090 | ||
3091 | HIBERNATION (aka Software Suspend, aka swsusp) | 3091 | HIBERNATION (aka Software Suspend, aka swsusp) |
3092 | M: Pavel Machek <pavel@ucw.cz> | 3092 | M: Pavel Machek <pavel@ucw.cz> |
3093 | M: "Rafael J. Wysocki" <rjw@sisk.pl> | 3093 | M: "Rafael J. Wysocki" <rjw@sisk.pl> |
3094 | L: linux-pm@vger.kernel.org | 3094 | L: linux-pm@vger.kernel.org |
3095 | S: Supported | 3095 | S: Supported |
3096 | F: arch/x86/power/ | 3096 | F: arch/x86/power/ |
3097 | F: drivers/base/power/ | 3097 | F: drivers/base/power/ |
3098 | F: kernel/power/ | 3098 | F: kernel/power/ |
3099 | F: include/linux/suspend.h | 3099 | F: include/linux/suspend.h |
3100 | F: include/linux/freezer.h | 3100 | F: include/linux/freezer.h |
3101 | F: include/linux/pm.h | 3101 | F: include/linux/pm.h |
3102 | F: arch/*/include/asm/suspend*.h | 3102 | F: arch/*/include/asm/suspend*.h |
3103 | 3103 | ||
3104 | HID CORE LAYER | 3104 | HID CORE LAYER |
3105 | M: Jiri Kosina <jkosina@suse.cz> | 3105 | M: Jiri Kosina <jkosina@suse.cz> |
3106 | L: linux-input@vger.kernel.org | 3106 | L: linux-input@vger.kernel.org |
3107 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid.git | 3107 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid.git |
3108 | S: Maintained | 3108 | S: Maintained |
3109 | F: drivers/hid/ | 3109 | F: drivers/hid/ |
3110 | F: include/linux/hid* | 3110 | F: include/linux/hid* |
3111 | 3111 | ||
3112 | HIGH-RESOLUTION TIMERS, CLOCKEVENTS, DYNTICKS | 3112 | HIGH-RESOLUTION TIMERS, CLOCKEVENTS, DYNTICKS |
3113 | M: Thomas Gleixner <tglx@linutronix.de> | 3113 | M: Thomas Gleixner <tglx@linutronix.de> |
3114 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core | 3114 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core |
3115 | S: Maintained | 3115 | S: Maintained |
3116 | F: Documentation/timers/ | 3116 | F: Documentation/timers/ |
3117 | F: kernel/hrtimer.c | 3117 | F: kernel/hrtimer.c |
3118 | F: kernel/time/clockevents.c | 3118 | F: kernel/time/clockevents.c |
3119 | F: kernel/time/tick*.* | 3119 | F: kernel/time/tick*.* |
3120 | F: kernel/time/timer_*.c | 3120 | F: kernel/time/timer_*.c |
3121 | F: include/linux/clockchips.h | 3121 | F: include/linux/clockchips.h |
3122 | F: include/linux/hrtimer.h | 3122 | F: include/linux/hrtimer.h |
3123 | 3123 | ||
3124 | HIGH-SPEED SCC DRIVER FOR AX.25 | 3124 | HIGH-SPEED SCC DRIVER FOR AX.25 |
3125 | M: Klaus Kudielka <klaus.kudielka@ieee.org> | 3125 | M: Klaus Kudielka <klaus.kudielka@ieee.org> |
3126 | L: linux-hams@vger.kernel.org | 3126 | L: linux-hams@vger.kernel.org |
3127 | W: http://www.nt.tuwien.ac.at/~kkudielk/Linux/ | 3127 | W: http://www.nt.tuwien.ac.at/~kkudielk/Linux/ |
3128 | S: Maintained | 3128 | S: Maintained |
3129 | F: drivers/net/hamradio/dmascc.c | 3129 | F: drivers/net/hamradio/dmascc.c |
3130 | F: drivers/net/hamradio/scc.c | 3130 | F: drivers/net/hamradio/scc.c |
3131 | 3131 | ||
3132 | HIGHPOINT ROCKETRAID 3xxx RAID DRIVER | 3132 | HIGHPOINT ROCKETRAID 3xxx RAID DRIVER |
3133 | M: HighPoint Linux Team <linux@highpoint-tech.com> | 3133 | M: HighPoint Linux Team <linux@highpoint-tech.com> |
3134 | W: http://www.highpoint-tech.com | 3134 | W: http://www.highpoint-tech.com |
3135 | S: Supported | 3135 | S: Supported |
3136 | F: Documentation/scsi/hptiop.txt | 3136 | F: Documentation/scsi/hptiop.txt |
3137 | F: drivers/scsi/hptiop.c | 3137 | F: drivers/scsi/hptiop.c |
3138 | 3138 | ||
3139 | HIPPI | 3139 | HIPPI |
3140 | M: Jes Sorensen <jes@trained-monkey.org> | 3140 | M: Jes Sorensen <jes@trained-monkey.org> |
3141 | L: linux-hippi@sunsite.dk | 3141 | L: linux-hippi@sunsite.dk |
3142 | S: Maintained | 3142 | S: Maintained |
3143 | F: include/linux/hippidevice.h | 3143 | F: include/linux/hippidevice.h |
3144 | F: include/linux/if_hippi.h | 3144 | F: include/linux/if_hippi.h |
3145 | F: net/802/hippi.c | 3145 | F: net/802/hippi.c |
3146 | F: drivers/net/hippi/ | 3146 | F: drivers/net/hippi/ |
3147 | 3147 | ||
3148 | HOST AP DRIVER | 3148 | HOST AP DRIVER |
3149 | M: Jouni Malinen <j@w1.fi> | 3149 | M: Jouni Malinen <j@w1.fi> |
3150 | L: hostap@shmoo.com (subscribers-only) | 3150 | L: hostap@shmoo.com (subscribers-only) |
3151 | L: linux-wireless@vger.kernel.org | 3151 | L: linux-wireless@vger.kernel.org |
3152 | W: http://hostap.epitest.fi/ | 3152 | W: http://hostap.epitest.fi/ |
3153 | S: Maintained | 3153 | S: Maintained |
3154 | F: drivers/net/wireless/hostap/ | 3154 | F: drivers/net/wireless/hostap/ |
3155 | 3155 | ||
3156 | HP COMPAQ TC1100 TABLET WMI EXTRAS DRIVER | 3156 | HP COMPAQ TC1100 TABLET WMI EXTRAS DRIVER |
3157 | L: platform-driver-x86@vger.kernel.org | 3157 | L: platform-driver-x86@vger.kernel.org |
3158 | S: Orphan | 3158 | S: Orphan |
3159 | F: drivers/platform/x86/tc1100-wmi.c | 3159 | F: drivers/platform/x86/tc1100-wmi.c |
3160 | 3160 | ||
3161 | HP100: Driver for HP 10/100 Mbit/s Voice Grade Network Adapter Series | 3161 | HP100: Driver for HP 10/100 Mbit/s Voice Grade Network Adapter Series |
3162 | M: Jaroslav Kysela <perex@perex.cz> | 3162 | M: Jaroslav Kysela <perex@perex.cz> |
3163 | S: Maintained | 3163 | S: Maintained |
3164 | F: drivers/net/ethernet/hp/hp100.* | 3164 | F: drivers/net/ethernet/hp/hp100.* |
3165 | 3165 | ||
3166 | HPET: High Precision Event Timers driver | 3166 | HPET: High Precision Event Timers driver |
3167 | M: Clemens Ladisch <clemens@ladisch.de> | 3167 | M: Clemens Ladisch <clemens@ladisch.de> |
3168 | S: Maintained | 3168 | S: Maintained |
3169 | F: Documentation/timers/hpet.txt | 3169 | F: Documentation/timers/hpet.txt |
3170 | F: drivers/char/hpet.c | 3170 | F: drivers/char/hpet.c |
3171 | F: include/linux/hpet.h | 3171 | F: include/linux/hpet.h |
3172 | 3172 | ||
3173 | HPET: x86 | 3173 | HPET: x86 |
3174 | M: "Venkatesh Pallipadi (Venki)" <venki@google.com> | 3174 | M: "Venkatesh Pallipadi (Venki)" <venki@google.com> |
3175 | S: Maintained | 3175 | S: Maintained |
3176 | F: arch/x86/kernel/hpet.c | 3176 | F: arch/x86/kernel/hpet.c |
3177 | F: arch/x86/include/asm/hpet.h | 3177 | F: arch/x86/include/asm/hpet.h |
3178 | 3178 | ||
3179 | HPFS FILESYSTEM | 3179 | HPFS FILESYSTEM |
3180 | M: Mikulas Patocka <mikulas@artax.karlin.mff.cuni.cz> | 3180 | M: Mikulas Patocka <mikulas@artax.karlin.mff.cuni.cz> |
3181 | W: http://artax.karlin.mff.cuni.cz/~mikulas/vyplody/hpfs/index-e.cgi | 3181 | W: http://artax.karlin.mff.cuni.cz/~mikulas/vyplody/hpfs/index-e.cgi |
3182 | S: Maintained | 3182 | S: Maintained |
3183 | F: fs/hpfs/ | 3183 | F: fs/hpfs/ |
3184 | 3184 | ||
3185 | HSO 3G MODEM DRIVER | 3185 | HSO 3G MODEM DRIVER |
3186 | M: Jan Dumon <j.dumon@option.com> | 3186 | M: Jan Dumon <j.dumon@option.com> |
3187 | W: http://www.pharscape.org | 3187 | W: http://www.pharscape.org |
3188 | S: Maintained | 3188 | S: Maintained |
3189 | F: drivers/net/usb/hso.c | 3189 | F: drivers/net/usb/hso.c |
3190 | 3190 | ||
3191 | HTCPEN TOUCHSCREEN DRIVER | 3191 | HTCPEN TOUCHSCREEN DRIVER |
3192 | M: Pau Oliva Fora <pof@eslack.org> | 3192 | M: Pau Oliva Fora <pof@eslack.org> |
3193 | L: linux-input@vger.kernel.org | 3193 | L: linux-input@vger.kernel.org |
3194 | S: Maintained | 3194 | S: Maintained |
3195 | F: drivers/input/touchscreen/htcpen.c | 3195 | F: drivers/input/touchscreen/htcpen.c |
3196 | 3196 | ||
3197 | HUGETLB FILESYSTEM | 3197 | HUGETLB FILESYSTEM |
3198 | M: William Irwin <wli@holomorphy.com> | 3198 | M: William Irwin <wli@holomorphy.com> |
3199 | S: Maintained | 3199 | S: Maintained |
3200 | F: fs/hugetlbfs/ | 3200 | F: fs/hugetlbfs/ |
3201 | 3201 | ||
3202 | Hyper-V CORE AND DRIVERS | 3202 | Hyper-V CORE AND DRIVERS |
3203 | M: K. Y. Srinivasan <kys@microsoft.com> | 3203 | M: K. Y. Srinivasan <kys@microsoft.com> |
3204 | M: Haiyang Zhang <haiyangz@microsoft.com> | 3204 | M: Haiyang Zhang <haiyangz@microsoft.com> |
3205 | L: devel@linuxdriverproject.org | 3205 | L: devel@linuxdriverproject.org |
3206 | S: Maintained | 3206 | S: Maintained |
3207 | F: drivers/hv/ | 3207 | F: drivers/hv/ |
3208 | F: drivers/hid/hid-hyperv.c | 3208 | F: drivers/hid/hid-hyperv.c |
3209 | F: drivers/net/hyperv/ | 3209 | F: drivers/net/hyperv/ |
3210 | F: drivers/staging/hv/ | 3210 | F: drivers/staging/hv/ |
3211 | 3211 | ||
3212 | I2C/SMBUS STUB DRIVER | 3212 | I2C/SMBUS STUB DRIVER |
3213 | M: "Mark M. Hoffman" <mhoffman@lightlink.com> | 3213 | M: "Mark M. Hoffman" <mhoffman@lightlink.com> |
3214 | L: linux-i2c@vger.kernel.org | 3214 | L: linux-i2c@vger.kernel.org |
3215 | S: Maintained | 3215 | S: Maintained |
3216 | F: drivers/i2c/busses/i2c-stub.c | 3216 | F: drivers/i2c/busses/i2c-stub.c |
3217 | 3217 | ||
3218 | I2C SUBSYSTEM | 3218 | I2C SUBSYSTEM |
3219 | M: "Jean Delvare (PC drivers, core)" <khali@linux-fr.org> | 3219 | M: "Jean Delvare (PC drivers, core)" <khali@linux-fr.org> |
3220 | M: "Ben Dooks (embedded platforms)" <ben-linux@fluff.org> | 3220 | M: "Ben Dooks (embedded platforms)" <ben-linux@fluff.org> |
3221 | M: "Wolfram Sang (embedded platforms)" <w.sang@pengutronix.de> | 3221 | M: "Wolfram Sang (embedded platforms)" <w.sang@pengutronix.de> |
3222 | L: linux-i2c@vger.kernel.org | 3222 | L: linux-i2c@vger.kernel.org |
3223 | W: http://i2c.wiki.kernel.org/ | 3223 | W: http://i2c.wiki.kernel.org/ |
3224 | T: quilt kernel.org/pub/linux/kernel/people/jdelvare/linux-2.6/jdelvare-i2c/ | 3224 | T: quilt kernel.org/pub/linux/kernel/people/jdelvare/linux-2.6/jdelvare-i2c/ |
3225 | T: git git://git.fluff.org/bjdooks/linux.git | 3225 | T: git git://git.fluff.org/bjdooks/linux.git |
3226 | S: Maintained | 3226 | S: Maintained |
3227 | F: Documentation/i2c/ | 3227 | F: Documentation/i2c/ |
3228 | F: drivers/i2c/ | 3228 | F: drivers/i2c/ |
3229 | F: include/linux/i2c.h | 3229 | F: include/linux/i2c.h |
3230 | F: include/linux/i2c-*.h | 3230 | F: include/linux/i2c-*.h |
3231 | 3231 | ||
3232 | I2C-TINY-USB DRIVER | 3232 | I2C-TINY-USB DRIVER |
3233 | M: Till Harbaum <till@harbaum.org> | 3233 | M: Till Harbaum <till@harbaum.org> |
3234 | L: linux-i2c@vger.kernel.org | 3234 | L: linux-i2c@vger.kernel.org |
3235 | W: http://www.harbaum.org/till/i2c_tiny_usb | 3235 | W: http://www.harbaum.org/till/i2c_tiny_usb |
3236 | S: Maintained | 3236 | S: Maintained |
3237 | F: drivers/i2c/busses/i2c-tiny-usb.c | 3237 | F: drivers/i2c/busses/i2c-tiny-usb.c |
3238 | 3238 | ||
3239 | i386 BOOT CODE | 3239 | i386 BOOT CODE |
3240 | M: "H. Peter Anvin" <hpa@zytor.com> | 3240 | M: "H. Peter Anvin" <hpa@zytor.com> |
3241 | S: Maintained | 3241 | S: Maintained |
3242 | F: arch/x86/boot/ | 3242 | F: arch/x86/boot/ |
3243 | 3243 | ||
3244 | i386 SETUP CODE / CPU ERRATA WORKAROUNDS | 3244 | i386 SETUP CODE / CPU ERRATA WORKAROUNDS |
3245 | M: "H. Peter Anvin" <hpa@zytor.com> | 3245 | M: "H. Peter Anvin" <hpa@zytor.com> |
3246 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/hpa/linux-2.6-x86setup.git | 3246 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/hpa/linux-2.6-x86setup.git |
3247 | S: Maintained | 3247 | S: Maintained |
3248 | 3248 | ||
3249 | IA64 (Itanium) PLATFORM | 3249 | IA64 (Itanium) PLATFORM |
3250 | M: Tony Luck <tony.luck@intel.com> | 3250 | M: Tony Luck <tony.luck@intel.com> |
3251 | M: Fenghua Yu <fenghua.yu@intel.com> | 3251 | M: Fenghua Yu <fenghua.yu@intel.com> |
3252 | L: linux-ia64@vger.kernel.org | 3252 | L: linux-ia64@vger.kernel.org |
3253 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux.git | 3253 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux.git |
3254 | S: Maintained | 3254 | S: Maintained |
3255 | F: arch/ia64/ | 3255 | F: arch/ia64/ |
3256 | 3256 | ||
3257 | IBM MCA SCSI SUBSYSTEM DRIVER | 3257 | IBM MCA SCSI SUBSYSTEM DRIVER |
3258 | M: Michael Lang <langa2@kph.uni-mainz.de> | 3258 | M: Michael Lang <langa2@kph.uni-mainz.de> |
3259 | W: http://www.uni-mainz.de/~langm000/linux.html | 3259 | W: http://www.uni-mainz.de/~langm000/linux.html |
3260 | S: Maintained | 3260 | S: Maintained |
3261 | F: drivers/scsi/ibmmca.c | 3261 | F: drivers/scsi/ibmmca.c |
3262 | 3262 | ||
3263 | IBM Power Linux RAID adapter | 3263 | IBM Power Linux RAID adapter |
3264 | M: Brian King <brking@us.ibm.com> | 3264 | M: Brian King <brking@us.ibm.com> |
3265 | S: Supported | 3265 | S: Supported |
3266 | F: drivers/scsi/ipr.* | 3266 | F: drivers/scsi/ipr.* |
3267 | 3267 | ||
3268 | IBM Power Virtual Ethernet Device Driver | 3268 | IBM Power Virtual Ethernet Device Driver |
3269 | M: Santiago Leon <santil@linux.vnet.ibm.com> | 3269 | M: Santiago Leon <santil@linux.vnet.ibm.com> |
3270 | L: netdev@vger.kernel.org | 3270 | L: netdev@vger.kernel.org |
3271 | S: Supported | 3271 | S: Supported |
3272 | F: drivers/net/ethernet/ibm/ibmveth.* | 3272 | F: drivers/net/ethernet/ibm/ibmveth.* |
3273 | 3273 | ||
3274 | IBM ServeRAID RAID DRIVER | 3274 | IBM ServeRAID RAID DRIVER |
3275 | P: Jack Hammer | 3275 | P: Jack Hammer |
3276 | M: Dave Jeffery <ipslinux@adaptec.com> | 3276 | M: Dave Jeffery <ipslinux@adaptec.com> |
3277 | W: http://www.developer.ibm.com/welcome/netfinity/serveraid.html | 3277 | W: http://www.developer.ibm.com/welcome/netfinity/serveraid.html |
3278 | S: Supported | 3278 | S: Supported |
3279 | F: drivers/scsi/ips.* | 3279 | F: drivers/scsi/ips.* |
3280 | 3280 | ||
3281 | IDE SUBSYSTEM | 3281 | IDE SUBSYSTEM |
3282 | M: "David S. Miller" <davem@davemloft.net> | 3282 | M: "David S. Miller" <davem@davemloft.net> |
3283 | L: linux-ide@vger.kernel.org | 3283 | L: linux-ide@vger.kernel.org |
3284 | Q: http://patchwork.ozlabs.org/project/linux-ide/list/ | 3284 | Q: http://patchwork.ozlabs.org/project/linux-ide/list/ |
3285 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/ide-2.6.git | 3285 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/ide-2.6.git |
3286 | S: Maintained | 3286 | S: Maintained |
3287 | F: Documentation/ide/ | 3287 | F: Documentation/ide/ |
3288 | F: drivers/ide/ | 3288 | F: drivers/ide/ |
3289 | F: include/linux/ide.h | 3289 | F: include/linux/ide.h |
3290 | 3290 | ||
3291 | IDEAPAD LAPTOP EXTRAS DRIVER | 3291 | IDEAPAD LAPTOP EXTRAS DRIVER |
3292 | M: Ike Panhc <ike.pan@canonical.com> | 3292 | M: Ike Panhc <ike.pan@canonical.com> |
3293 | L: platform-driver-x86@vger.kernel.org | 3293 | L: platform-driver-x86@vger.kernel.org |
3294 | W: http://launchpad.net/ideapad-laptop | 3294 | W: http://launchpad.net/ideapad-laptop |
3295 | S: Maintained | 3295 | S: Maintained |
3296 | F: drivers/platform/x86/ideapad-laptop.c | 3296 | F: drivers/platform/x86/ideapad-laptop.c |
3297 | 3297 | ||
3298 | IDE/ATAPI DRIVERS | 3298 | IDE/ATAPI DRIVERS |
3299 | M: Borislav Petkov <petkovbb@gmail.com> | 3299 | M: Borislav Petkov <petkovbb@gmail.com> |
3300 | L: linux-ide@vger.kernel.org | 3300 | L: linux-ide@vger.kernel.org |
3301 | S: Maintained | 3301 | S: Maintained |
3302 | F: Documentation/cdrom/ide-cd | 3302 | F: Documentation/cdrom/ide-cd |
3303 | F: drivers/ide/ide-cd* | 3303 | F: drivers/ide/ide-cd* |
3304 | 3304 | ||
3305 | IDLE-I7300 | 3305 | IDLE-I7300 |
3306 | M: Andy Henroid <andrew.d.henroid@intel.com> | 3306 | M: Andy Henroid <andrew.d.henroid@intel.com> |
3307 | L: linux-pm@vger.kernel.org | 3307 | L: linux-pm@vger.kernel.org |
3308 | S: Supported | 3308 | S: Supported |
3309 | F: drivers/idle/i7300_idle.c | 3309 | F: drivers/idle/i7300_idle.c |
3310 | 3310 | ||
3311 | IEEE 802.15.4 SUBSYSTEM | 3311 | IEEE 802.15.4 SUBSYSTEM |
3312 | M: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com> | 3312 | M: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com> |
3313 | M: Sergey Lapin <slapin@ossfans.org> | 3313 | M: Sergey Lapin <slapin@ossfans.org> |
3314 | L: linux-zigbee-devel@lists.sourceforge.net (moderated for non-subscribers) | 3314 | L: linux-zigbee-devel@lists.sourceforge.net (moderated for non-subscribers) |
3315 | W: http://apps.sourceforge.net/trac/linux-zigbee | 3315 | W: http://apps.sourceforge.net/trac/linux-zigbee |
3316 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/lowpan/lowpan.git | 3316 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/lowpan/lowpan.git |
3317 | S: Maintained | 3317 | S: Maintained |
3318 | F: net/ieee802154/ | 3318 | F: net/ieee802154/ |
3319 | F: drivers/ieee802154/ | 3319 | F: drivers/ieee802154/ |
3320 | 3320 | ||
3321 | IIO SUBSYSTEM AND DRIVERS | 3321 | IIO SUBSYSTEM AND DRIVERS |
3322 | M: Jonathan Cameron <jic23@cam.ac.uk> | 3322 | M: Jonathan Cameron <jic23@cam.ac.uk> |
3323 | L: linux-iio@vger.kernel.org | 3323 | L: linux-iio@vger.kernel.org |
3324 | S: Maintained | 3324 | S: Maintained |
3325 | F: drivers/staging/iio/ | 3325 | F: drivers/staging/iio/ |
3326 | 3326 | ||
3327 | IKANOS/ADI EAGLE ADSL USB DRIVER | 3327 | IKANOS/ADI EAGLE ADSL USB DRIVER |
3328 | M: Matthieu Castet <castet.matthieu@free.fr> | 3328 | M: Matthieu Castet <castet.matthieu@free.fr> |
3329 | M: Stanislaw Gruszka <stf_xl@wp.pl> | 3329 | M: Stanislaw Gruszka <stf_xl@wp.pl> |
3330 | S: Maintained | 3330 | S: Maintained |
3331 | F: drivers/usb/atm/ueagle-atm.c | 3331 | F: drivers/usb/atm/ueagle-atm.c |
3332 | 3332 | ||
3333 | INTEGRITY MEASUREMENT ARCHITECTURE (IMA) | 3333 | INTEGRITY MEASUREMENT ARCHITECTURE (IMA) |
3334 | M: Mimi Zohar <zohar@us.ibm.com> | 3334 | M: Mimi Zohar <zohar@us.ibm.com> |
3335 | S: Supported | 3335 | S: Supported |
3336 | F: security/integrity/ima/ | 3336 | F: security/integrity/ima/ |
3337 | 3337 | ||
3338 | IMS TWINTURBO FRAMEBUFFER DRIVER | 3338 | IMS TWINTURBO FRAMEBUFFER DRIVER |
3339 | L: linux-fbdev@vger.kernel.org | 3339 | L: linux-fbdev@vger.kernel.org |
3340 | S: Orphan | 3340 | S: Orphan |
3341 | F: drivers/video/imsttfb.c | 3341 | F: drivers/video/imsttfb.c |
3342 | 3342 | ||
3343 | INFINIBAND SUBSYSTEM | 3343 | INFINIBAND SUBSYSTEM |
3344 | M: Roland Dreier <roland@kernel.org> | 3344 | M: Roland Dreier <roland@kernel.org> |
3345 | M: Sean Hefty <sean.hefty@intel.com> | 3345 | M: Sean Hefty <sean.hefty@intel.com> |
3346 | M: Hal Rosenstock <hal.rosenstock@gmail.com> | 3346 | M: Hal Rosenstock <hal.rosenstock@gmail.com> |
3347 | L: linux-rdma@vger.kernel.org | 3347 | L: linux-rdma@vger.kernel.org |
3348 | W: http://www.openfabrics.org/ | 3348 | W: http://www.openfabrics.org/ |
3349 | Q: http://patchwork.kernel.org/project/linux-rdma/list/ | 3349 | Q: http://patchwork.kernel.org/project/linux-rdma/list/ |
3350 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git | 3350 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git |
3351 | S: Supported | 3351 | S: Supported |
3352 | F: Documentation/infiniband/ | 3352 | F: Documentation/infiniband/ |
3353 | F: drivers/infiniband/ | 3353 | F: drivers/infiniband/ |
3354 | F: include/linux/if_infiniband.h | 3354 | F: include/linux/if_infiniband.h |
3355 | 3355 | ||
3356 | INOTIFY | 3356 | INOTIFY |
3357 | M: John McCutchan <john@johnmccutchan.com> | 3357 | M: John McCutchan <john@johnmccutchan.com> |
3358 | M: Robert Love <rlove@rlove.org> | 3358 | M: Robert Love <rlove@rlove.org> |
3359 | M: Eric Paris <eparis@parisplace.org> | 3359 | M: Eric Paris <eparis@parisplace.org> |
3360 | S: Maintained | 3360 | S: Maintained |
3361 | F: Documentation/filesystems/inotify.txt | 3361 | F: Documentation/filesystems/inotify.txt |
3362 | F: fs/notify/inotify/ | 3362 | F: fs/notify/inotify/ |
3363 | F: include/linux/inotify.h | 3363 | F: include/linux/inotify.h |
3364 | 3364 | ||
3365 | INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN) DRIVERS | 3365 | INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN) DRIVERS |
3366 | M: Dmitry Torokhov <dmitry.torokhov@gmail.com> | 3366 | M: Dmitry Torokhov <dmitry.torokhov@gmail.com> |
3367 | M: Dmitry Torokhov <dtor@mail.ru> | 3367 | M: Dmitry Torokhov <dtor@mail.ru> |
3368 | L: linux-input@vger.kernel.org | 3368 | L: linux-input@vger.kernel.org |
3369 | Q: http://patchwork.kernel.org/project/linux-input/list/ | 3369 | Q: http://patchwork.kernel.org/project/linux-input/list/ |
3370 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git | 3370 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git |
3371 | S: Maintained | 3371 | S: Maintained |
3372 | F: drivers/input/ | 3372 | F: drivers/input/ |
3373 | 3373 | ||
3374 | INPUT MULTITOUCH (MT) PROTOCOL | 3374 | INPUT MULTITOUCH (MT) PROTOCOL |
3375 | M: Henrik Rydberg <rydberg@euromail.se> | 3375 | M: Henrik Rydberg <rydberg@euromail.se> |
3376 | L: linux-input@vger.kernel.org | 3376 | L: linux-input@vger.kernel.org |
3377 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/rydberg/input-mt.git | 3377 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/rydberg/input-mt.git |
3378 | S: Maintained | 3378 | S: Maintained |
3379 | F: Documentation/input/multi-touch-protocol.txt | 3379 | F: Documentation/input/multi-touch-protocol.txt |
3380 | F: drivers/input/input-mt.c | 3380 | F: drivers/input/input-mt.c |
3381 | K: \b(ABS|SYN)_MT_ | 3381 | K: \b(ABS|SYN)_MT_ |
3382 | 3382 | ||
3383 | INTEL C600 SERIES SAS CONTROLLER DRIVER | 3383 | INTEL C600 SERIES SAS CONTROLLER DRIVER |
3384 | M: Intel SCU Linux support <intel-linux-scu@intel.com> | 3384 | M: Intel SCU Linux support <intel-linux-scu@intel.com> |
3385 | M: Dan Williams <dan.j.williams@intel.com> | 3385 | M: Dan Williams <dan.j.williams@intel.com> |
3386 | M: Dave Jiang <dave.jiang@intel.com> | 3386 | M: Dave Jiang <dave.jiang@intel.com> |
3387 | M: Ed Nadolski <edmund.nadolski@intel.com> | 3387 | M: Ed Nadolski <edmund.nadolski@intel.com> |
3388 | L: linux-scsi@vger.kernel.org | 3388 | L: linux-scsi@vger.kernel.org |
3389 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/djbw/isci.git | 3389 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/djbw/isci.git |
3390 | S: Maintained | 3390 | S: Maintained |
3391 | F: drivers/scsi/isci/ | 3391 | F: drivers/scsi/isci/ |
3392 | F: firmware/isci/ | 3392 | F: firmware/isci/ |
3393 | 3393 | ||
3394 | INTEL IDLE DRIVER | 3394 | INTEL IDLE DRIVER |
3395 | M: Len Brown <lenb@kernel.org> | 3395 | M: Len Brown <lenb@kernel.org> |
3396 | L: linux-pm@vger.kernel.org | 3396 | L: linux-pm@vger.kernel.org |
3397 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-idle-2.6.git | 3397 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-idle-2.6.git |
3398 | S: Supported | 3398 | S: Supported |
3399 | F: drivers/idle/intel_idle.c | 3399 | F: drivers/idle/intel_idle.c |
3400 | 3400 | ||
3401 | INTEL FRAMEBUFFER DRIVER (excluding 810 and 815) | 3401 | INTEL FRAMEBUFFER DRIVER (excluding 810 and 815) |
3402 | M: Maik Broemme <mbroemme@plusserver.de> | 3402 | M: Maik Broemme <mbroemme@plusserver.de> |
3403 | L: linux-fbdev@vger.kernel.org | 3403 | L: linux-fbdev@vger.kernel.org |
3404 | S: Maintained | 3404 | S: Maintained |
3405 | F: Documentation/fb/intelfb.txt | 3405 | F: Documentation/fb/intelfb.txt |
3406 | F: drivers/video/intelfb/ | 3406 | F: drivers/video/intelfb/ |
3407 | 3407 | ||
3408 | INTEL 810/815 FRAMEBUFFER DRIVER | 3408 | INTEL 810/815 FRAMEBUFFER DRIVER |
3409 | M: Antonino Daplas <adaplas@gmail.com> | 3409 | M: Antonino Daplas <adaplas@gmail.com> |
3410 | L: linux-fbdev@vger.kernel.org | 3410 | L: linux-fbdev@vger.kernel.org |
3411 | S: Maintained | 3411 | S: Maintained |
3412 | F: drivers/video/i810/ | 3412 | F: drivers/video/i810/ |
3413 | 3413 | ||
3414 | INTEL MENLOW THERMAL DRIVER | 3414 | INTEL MENLOW THERMAL DRIVER |
3415 | M: Sujith Thomas <sujith.thomas@intel.com> | 3415 | M: Sujith Thomas <sujith.thomas@intel.com> |
3416 | L: platform-driver-x86@vger.kernel.org | 3416 | L: platform-driver-x86@vger.kernel.org |
3417 | W: http://www.lesswatts.org/projects/acpi/ | 3417 | W: http://www.lesswatts.org/projects/acpi/ |
3418 | S: Supported | 3418 | S: Supported |
3419 | F: drivers/platform/x86/intel_menlow.c | 3419 | F: drivers/platform/x86/intel_menlow.c |
3420 | 3420 | ||
3421 | INTEL IA32 MICROCODE UPDATE SUPPORT | 3421 | INTEL IA32 MICROCODE UPDATE SUPPORT |
3422 | M: Tigran Aivazian <tigran@aivazian.fsnet.co.uk> | 3422 | M: Tigran Aivazian <tigran@aivazian.fsnet.co.uk> |
3423 | S: Maintained | 3423 | S: Maintained |
3424 | F: arch/x86/kernel/microcode_core.c | 3424 | F: arch/x86/kernel/microcode_core.c |
3425 | F: arch/x86/kernel/microcode_intel.c | 3425 | F: arch/x86/kernel/microcode_intel.c |
3426 | 3426 | ||
3427 | INTEL I/OAT DMA DRIVER | 3427 | INTEL I/OAT DMA DRIVER |
3428 | M: Dan Williams <dan.j.williams@intel.com> | 3428 | M: Dan Williams <dan.j.williams@intel.com> |
3429 | S: Supported | 3429 | S: Supported |
3430 | F: drivers/dma/ioat* | 3430 | F: drivers/dma/ioat* |
3431 | 3431 | ||
3432 | INTEL IOMMU (VT-d) | 3432 | INTEL IOMMU (VT-d) |
3433 | M: David Woodhouse <dwmw2@infradead.org> | 3433 | M: David Woodhouse <dwmw2@infradead.org> |
3434 | L: iommu@lists.linux-foundation.org | 3434 | L: iommu@lists.linux-foundation.org |
3435 | T: git git://git.infradead.org/iommu-2.6.git | 3435 | T: git git://git.infradead.org/iommu-2.6.git |
3436 | S: Supported | 3436 | S: Supported |
3437 | F: drivers/iommu/intel-iommu.c | 3437 | F: drivers/iommu/intel-iommu.c |
3438 | F: include/linux/intel-iommu.h | 3438 | F: include/linux/intel-iommu.h |
3439 | 3439 | ||
3440 | INTEL IOP-ADMA DMA DRIVER | 3440 | INTEL IOP-ADMA DMA DRIVER |
3441 | M: Dan Williams <dan.j.williams@intel.com> | 3441 | M: Dan Williams <dan.j.williams@intel.com> |
3442 | S: Maintained | 3442 | S: Maintained |
3443 | F: drivers/dma/iop-adma.c | 3443 | F: drivers/dma/iop-adma.c |
3444 | 3444 | ||
3445 | INTEL IXP4XX QMGR, NPE, ETHERNET and HSS SUPPORT | 3445 | INTEL IXP4XX QMGR, NPE, ETHERNET and HSS SUPPORT |
3446 | M: Krzysztof Halasa <khc@pm.waw.pl> | 3446 | M: Krzysztof Halasa <khc@pm.waw.pl> |
3447 | S: Maintained | 3447 | S: Maintained |
3448 | F: arch/arm/mach-ixp4xx/include/mach/qmgr.h | 3448 | F: arch/arm/mach-ixp4xx/include/mach/qmgr.h |
3449 | F: arch/arm/mach-ixp4xx/include/mach/npe.h | 3449 | F: arch/arm/mach-ixp4xx/include/mach/npe.h |
3450 | F: arch/arm/mach-ixp4xx/ixp4xx_qmgr.c | 3450 | F: arch/arm/mach-ixp4xx/ixp4xx_qmgr.c |
3451 | F: arch/arm/mach-ixp4xx/ixp4xx_npe.c | 3451 | F: arch/arm/mach-ixp4xx/ixp4xx_npe.c |
3452 | F: drivers/net/ethernet/xscale/ixp4xx_eth.c | 3452 | F: drivers/net/ethernet/xscale/ixp4xx_eth.c |
3453 | F: drivers/net/wan/ixp4xx_hss.c | 3453 | F: drivers/net/wan/ixp4xx_hss.c |
3454 | 3454 | ||
3455 | INTEL IXP4XX RANDOM NUMBER GENERATOR SUPPORT | 3455 | INTEL IXP4XX RANDOM NUMBER GENERATOR SUPPORT |
3456 | M: Deepak Saxena <dsaxena@plexity.net> | 3456 | M: Deepak Saxena <dsaxena@plexity.net> |
3457 | S: Maintained | 3457 | S: Maintained |
3458 | F: drivers/char/hw_random/ixp4xx-rng.c | 3458 | F: drivers/char/hw_random/ixp4xx-rng.c |
3459 | 3459 | ||
3460 | INTEL IXP2000 ETHERNET DRIVER | 3460 | INTEL IXP2000 ETHERNET DRIVER |
3461 | M: Lennert Buytenhek <kernel@wantstofly.org> | 3461 | M: Lennert Buytenhek <kernel@wantstofly.org> |
3462 | L: netdev@vger.kernel.org | 3462 | L: netdev@vger.kernel.org |
3463 | S: Maintained | 3463 | S: Maintained |
3464 | F: drivers/net/ethernet/xscale/ixp2000/ | 3464 | F: drivers/net/ethernet/xscale/ixp2000/ |
3465 | 3465 | ||
3466 | INTEL ETHERNET DRIVERS (e100/e1000/e1000e/igb/igbvf/ixgb/ixgbe/ixgbevf) | 3466 | INTEL ETHERNET DRIVERS (e100/e1000/e1000e/igb/igbvf/ixgb/ixgbe/ixgbevf) |
3467 | M: Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 3467 | M: Jeff Kirsher <jeffrey.t.kirsher@intel.com> |
3468 | M: Jesse Brandeburg <jesse.brandeburg@intel.com> | 3468 | M: Jesse Brandeburg <jesse.brandeburg@intel.com> |
3469 | M: Bruce Allan <bruce.w.allan@intel.com> | 3469 | M: Bruce Allan <bruce.w.allan@intel.com> |
3470 | M: Carolyn Wyborny <carolyn.wyborny@intel.com> | 3470 | M: Carolyn Wyborny <carolyn.wyborny@intel.com> |
3471 | M: Don Skidmore <donald.c.skidmore@intel.com> | 3471 | M: Don Skidmore <donald.c.skidmore@intel.com> |
3472 | M: Greg Rose <gregory.v.rose@intel.com> | 3472 | M: Greg Rose <gregory.v.rose@intel.com> |
3473 | M: Peter P Waskiewicz Jr <peter.p.waskiewicz.jr@intel.com> | 3473 | M: Peter P Waskiewicz Jr <peter.p.waskiewicz.jr@intel.com> |
3474 | M: Alex Duyck <alexander.h.duyck@intel.com> | 3474 | M: Alex Duyck <alexander.h.duyck@intel.com> |
3475 | M: John Ronciak <john.ronciak@intel.com> | 3475 | M: John Ronciak <john.ronciak@intel.com> |
3476 | L: e1000-devel@lists.sourceforge.net | 3476 | L: e1000-devel@lists.sourceforge.net |
3477 | W: http://e1000.sourceforge.net/ | 3477 | W: http://e1000.sourceforge.net/ |
3478 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/net.git | 3478 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/net.git |
3479 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/net-next.git | 3479 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/net-next.git |
3480 | S: Supported | 3480 | S: Supported |
3481 | F: Documentation/networking/e100.txt | 3481 | F: Documentation/networking/e100.txt |
3482 | F: Documentation/networking/e1000.txt | 3482 | F: Documentation/networking/e1000.txt |
3483 | F: Documentation/networking/e1000e.txt | 3483 | F: Documentation/networking/e1000e.txt |
3484 | F: Documentation/networking/igb.txt | 3484 | F: Documentation/networking/igb.txt |
3485 | F: Documentation/networking/igbvf.txt | 3485 | F: Documentation/networking/igbvf.txt |
3486 | F: Documentation/networking/ixgb.txt | 3486 | F: Documentation/networking/ixgb.txt |
3487 | F: Documentation/networking/ixgbe.txt | 3487 | F: Documentation/networking/ixgbe.txt |
3488 | F: Documentation/networking/ixgbevf.txt | 3488 | F: Documentation/networking/ixgbevf.txt |
3489 | F: drivers/net/ethernet/intel/ | 3489 | F: drivers/net/ethernet/intel/ |
3490 | 3490 | ||
3491 | INTEL MRST PMU DRIVER | 3491 | INTEL MRST PMU DRIVER |
3492 | M: Len Brown <len.brown@intel.com> | 3492 | M: Len Brown <len.brown@intel.com> |
3493 | L: linux-pm@vger.kernel.org | 3493 | L: linux-pm@vger.kernel.org |
3494 | S: Supported | 3494 | S: Supported |
3495 | F: arch/x86/platform/mrst/pmu.* | 3495 | F: arch/x86/platform/mrst/pmu.* |
3496 | 3496 | ||
3497 | INTEL PRO/WIRELESS 2100 NETWORK CONNECTION SUPPORT | 3497 | INTEL PRO/WIRELESS 2100 NETWORK CONNECTION SUPPORT |
3498 | L: linux-wireless@vger.kernel.org | 3498 | L: linux-wireless@vger.kernel.org |
3499 | S: Orphan | 3499 | S: Orphan |
3500 | F: Documentation/networking/README.ipw2100 | 3500 | F: Documentation/networking/README.ipw2100 |
3501 | F: drivers/net/wireless/ipw2x00/ipw2100.* | 3501 | F: drivers/net/wireless/ipw2x00/ipw2100.* |
3502 | 3502 | ||
3503 | INTEL PRO/WIRELESS 2915ABG NETWORK CONNECTION SUPPORT | 3503 | INTEL PRO/WIRELESS 2915ABG NETWORK CONNECTION SUPPORT |
3504 | L: linux-wireless@vger.kernel.org | 3504 | L: linux-wireless@vger.kernel.org |
3505 | S: Orphan | 3505 | S: Orphan |
3506 | F: Documentation/networking/README.ipw2200 | 3506 | F: Documentation/networking/README.ipw2200 |
3507 | F: drivers/net/wireless/ipw2x00/ipw2200.* | 3507 | F: drivers/net/wireless/ipw2x00/ipw2200.* |
3508 | 3508 | ||
3509 | INTEL(R) TRUSTED EXECUTION TECHNOLOGY (TXT) | 3509 | INTEL(R) TRUSTED EXECUTION TECHNOLOGY (TXT) |
3510 | M: Joseph Cihula <joseph.cihula@intel.com> | 3510 | M: Joseph Cihula <joseph.cihula@intel.com> |
3511 | M: Shane Wang <shane.wang@intel.com> | 3511 | M: Shane Wang <shane.wang@intel.com> |
3512 | L: tboot-devel@lists.sourceforge.net | 3512 | L: tboot-devel@lists.sourceforge.net |
3513 | W: http://tboot.sourceforge.net | 3513 | W: http://tboot.sourceforge.net |
3514 | T: Mercurial http://www.bughost.org/repos.hg/tboot.hg | 3514 | T: Mercurial http://www.bughost.org/repos.hg/tboot.hg |
3515 | S: Supported | 3515 | S: Supported |
3516 | F: Documentation/intel_txt.txt | 3516 | F: Documentation/intel_txt.txt |
3517 | F: include/linux/tboot.h | 3517 | F: include/linux/tboot.h |
3518 | F: arch/x86/kernel/tboot.c | 3518 | F: arch/x86/kernel/tboot.c |
3519 | 3519 | ||
3520 | INTEL WIRELESS WIMAX CONNECTION 2400 | 3520 | INTEL WIRELESS WIMAX CONNECTION 2400 |
3521 | M: Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com> | 3521 | M: Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com> |
3522 | M: linux-wimax@intel.com | 3522 | M: linux-wimax@intel.com |
3523 | L: wimax@linuxwimax.org | 3523 | L: wimax@linuxwimax.org |
3524 | S: Supported | 3524 | S: Supported |
3525 | W: http://linuxwimax.org | 3525 | W: http://linuxwimax.org |
3526 | F: Documentation/wimax/README.i2400m | 3526 | F: Documentation/wimax/README.i2400m |
3527 | F: drivers/net/wimax/i2400m/ | 3527 | F: drivers/net/wimax/i2400m/ |
3528 | F: include/linux/wimax/i2400m.h | 3528 | F: include/linux/wimax/i2400m.h |
3529 | 3529 | ||
3530 | INTEL WIRELESS 3945ABG/BG, 4965AGN (iwlegacy) | 3530 | INTEL WIRELESS 3945ABG/BG, 4965AGN (iwlegacy) |
3531 | M: Stanislaw Gruszka <sgruszka@redhat.com> | 3531 | M: Stanislaw Gruszka <sgruszka@redhat.com> |
3532 | L: linux-wireless@vger.kernel.org | 3532 | L: linux-wireless@vger.kernel.org |
3533 | S: Supported | 3533 | S: Supported |
3534 | F: drivers/net/wireless/iwlegacy/ | 3534 | F: drivers/net/wireless/iwlegacy/ |
3535 | 3535 | ||
3536 | INTEL WIRELESS WIFI LINK (iwlwifi) | 3536 | INTEL WIRELESS WIFI LINK (iwlwifi) |
3537 | M: Wey-Yi Guy <wey-yi.w.guy@intel.com> | 3537 | M: Wey-Yi Guy <wey-yi.w.guy@intel.com> |
3538 | M: Intel Linux Wireless <ilw@linux.intel.com> | 3538 | M: Intel Linux Wireless <ilw@linux.intel.com> |
3539 | L: linux-wireless@vger.kernel.org | 3539 | L: linux-wireless@vger.kernel.org |
3540 | W: http://intellinuxwireless.org | 3540 | W: http://intellinuxwireless.org |
3541 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi.git | 3541 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi.git |
3542 | S: Supported | 3542 | S: Supported |
3543 | F: drivers/net/wireless/iwlwifi/ | 3543 | F: drivers/net/wireless/iwlwifi/ |
3544 | 3544 | ||
3545 | INTEL WIRELESS MULTICOMM 3200 WIFI (iwmc3200wifi) | 3545 | INTEL WIRELESS MULTICOMM 3200 WIFI (iwmc3200wifi) |
3546 | M: Samuel Ortiz <samuel.ortiz@intel.com> | 3546 | M: Samuel Ortiz <samuel.ortiz@intel.com> |
3547 | M: Intel Linux Wireless <ilw@linux.intel.com> | 3547 | M: Intel Linux Wireless <ilw@linux.intel.com> |
3548 | L: linux-wireless@vger.kernel.org | 3548 | L: linux-wireless@vger.kernel.org |
3549 | S: Supported | 3549 | S: Supported |
3550 | W: http://wireless.kernel.org/en/users/Drivers/iwmc3200wifi | 3550 | W: http://wireless.kernel.org/en/users/Drivers/iwmc3200wifi |
3551 | F: drivers/net/wireless/iwmc3200wifi/ | 3551 | F: drivers/net/wireless/iwmc3200wifi/ |
3552 | 3552 | ||
3553 | IOC3 ETHERNET DRIVER | 3553 | IOC3 ETHERNET DRIVER |
3554 | M: Ralf Baechle <ralf@linux-mips.org> | 3554 | M: Ralf Baechle <ralf@linux-mips.org> |
3555 | L: linux-mips@linux-mips.org | 3555 | L: linux-mips@linux-mips.org |
3556 | S: Maintained | 3556 | S: Maintained |
3557 | F: drivers/net/ethernet/sgi/ioc3-eth.c | 3557 | F: drivers/net/ethernet/sgi/ioc3-eth.c |
3558 | 3558 | ||
3559 | IOC3 SERIAL DRIVER | 3559 | IOC3 SERIAL DRIVER |
3560 | M: Pat Gefre <pfg@sgi.com> | 3560 | M: Pat Gefre <pfg@sgi.com> |
3561 | L: linux-serial@vger.kernel.org | 3561 | L: linux-serial@vger.kernel.org |
3562 | S: Maintained | 3562 | S: Maintained |
3563 | F: drivers/tty/serial/ioc3_serial.c | 3563 | F: drivers/tty/serial/ioc3_serial.c |
3564 | 3564 | ||
3565 | IP MASQUERADING | 3565 | IP MASQUERADING |
3566 | M: Juanjo Ciarlante <jjciarla@raiz.uncu.edu.ar> | 3566 | M: Juanjo Ciarlante <jjciarla@raiz.uncu.edu.ar> |
3567 | S: Maintained | 3567 | S: Maintained |
3568 | F: net/ipv4/netfilter/ipt_MASQUERADE.c | 3568 | F: net/ipv4/netfilter/ipt_MASQUERADE.c |
3569 | 3569 | ||
3570 | IP1000A 10/100/1000 GIGABIT ETHERNET DRIVER | 3570 | IP1000A 10/100/1000 GIGABIT ETHERNET DRIVER |
3571 | M: Francois Romieu <romieu@fr.zoreil.com> | 3571 | M: Francois Romieu <romieu@fr.zoreil.com> |
3572 | M: Sorbica Shieh <sorbica@icplus.com.tw> | 3572 | M: Sorbica Shieh <sorbica@icplus.com.tw> |
3573 | L: netdev@vger.kernel.org | 3573 | L: netdev@vger.kernel.org |
3574 | S: Maintained | 3574 | S: Maintained |
3575 | F: drivers/net/ethernet/icplus/ipg.* | 3575 | F: drivers/net/ethernet/icplus/ipg.* |
3576 | 3576 | ||
3577 | IPATH DRIVER | 3577 | IPATH DRIVER |
3578 | M: Mike Marciniszyn <infinipath@qlogic.com> | 3578 | M: Mike Marciniszyn <infinipath@qlogic.com> |
3579 | L: linux-rdma@vger.kernel.org | 3579 | L: linux-rdma@vger.kernel.org |
3580 | S: Maintained | 3580 | S: Maintained |
3581 | F: drivers/infiniband/hw/ipath/ | 3581 | F: drivers/infiniband/hw/ipath/ |
3582 | 3582 | ||
3583 | IPMI SUBSYSTEM | 3583 | IPMI SUBSYSTEM |
3584 | M: Corey Minyard <minyard@acm.org> | 3584 | M: Corey Minyard <minyard@acm.org> |
3585 | L: openipmi-developer@lists.sourceforge.net (moderated for non-subscribers) | 3585 | L: openipmi-developer@lists.sourceforge.net (moderated for non-subscribers) |
3586 | W: http://openipmi.sourceforge.net/ | 3586 | W: http://openipmi.sourceforge.net/ |
3587 | S: Supported | 3587 | S: Supported |
3588 | F: Documentation/IPMI.txt | 3588 | F: Documentation/IPMI.txt |
3589 | F: drivers/char/ipmi/ | 3589 | F: drivers/char/ipmi/ |
3590 | F: include/linux/ipmi* | 3590 | F: include/linux/ipmi* |
3591 | 3591 | ||
3592 | IPS SCSI RAID DRIVER | 3592 | IPS SCSI RAID DRIVER |
3593 | M: Adaptec OEM Raid Solutions <aacraid@adaptec.com> | 3593 | M: Adaptec OEM Raid Solutions <aacraid@adaptec.com> |
3594 | L: linux-scsi@vger.kernel.org | 3594 | L: linux-scsi@vger.kernel.org |
3595 | W: http://www.adaptec.com/ | 3595 | W: http://www.adaptec.com/ |
3596 | S: Maintained | 3596 | S: Maintained |
3597 | F: drivers/scsi/ips* | 3597 | F: drivers/scsi/ips* |
3598 | 3598 | ||
3599 | IPVS | 3599 | IPVS |
3600 | M: Wensong Zhang <wensong@linux-vs.org> | 3600 | M: Wensong Zhang <wensong@linux-vs.org> |
3601 | M: Simon Horman <horms@verge.net.au> | 3601 | M: Simon Horman <horms@verge.net.au> |
3602 | M: Julian Anastasov <ja@ssi.bg> | 3602 | M: Julian Anastasov <ja@ssi.bg> |
3603 | L: netdev@vger.kernel.org | 3603 | L: netdev@vger.kernel.org |
3604 | L: lvs-devel@vger.kernel.org | 3604 | L: lvs-devel@vger.kernel.org |
3605 | S: Maintained | 3605 | S: Maintained |
3606 | F: Documentation/networking/ipvs-sysctl.txt | 3606 | F: Documentation/networking/ipvs-sysctl.txt |
3607 | F: include/net/ip_vs.h | 3607 | F: include/net/ip_vs.h |
3608 | F: include/linux/ip_vs.h | 3608 | F: include/linux/ip_vs.h |
3609 | F: net/netfilter/ipvs/ | 3609 | F: net/netfilter/ipvs/ |
3610 | 3610 | ||
3611 | IPWIRELESS DRIVER | 3611 | IPWIRELESS DRIVER |
3612 | M: Jiri Kosina <jkosina@suse.cz> | 3612 | M: Jiri Kosina <jkosina@suse.cz> |
3613 | M: David Sterba <dsterba@suse.cz> | 3613 | M: David Sterba <dsterba@suse.cz> |
3614 | S: Odd Fixes | 3614 | S: Odd Fixes |
3615 | F: drivers/tty/ipwireless/ | 3615 | F: drivers/tty/ipwireless/ |
3616 | 3616 | ||
3617 | IPX NETWORK LAYER | 3617 | IPX NETWORK LAYER |
3618 | M: Arnaldo Carvalho de Melo <acme@ghostprotocols.net> | 3618 | M: Arnaldo Carvalho de Melo <acme@ghostprotocols.net> |
3619 | L: netdev@vger.kernel.org | 3619 | L: netdev@vger.kernel.org |
3620 | S: Maintained | 3620 | S: Maintained |
3621 | F: include/linux/ipx.h | 3621 | F: include/linux/ipx.h |
3622 | F: include/net/ipx.h | 3622 | F: include/net/ipx.h |
3623 | F: net/ipx/ | 3623 | F: net/ipx/ |
3624 | 3624 | ||
3625 | IRDA SUBSYSTEM | 3625 | IRDA SUBSYSTEM |
3626 | M: Samuel Ortiz <samuel@sortiz.org> | 3626 | M: Samuel Ortiz <samuel@sortiz.org> |
3627 | L: irda-users@lists.sourceforge.net (subscribers-only) | 3627 | L: irda-users@lists.sourceforge.net (subscribers-only) |
3628 | L: netdev@vger.kernel.org | 3628 | L: netdev@vger.kernel.org |
3629 | W: http://irda.sourceforge.net/ | 3629 | W: http://irda.sourceforge.net/ |
3630 | S: Maintained | 3630 | S: Maintained |
3631 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/sameo/irda-2.6.git | 3631 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/sameo/irda-2.6.git |
3632 | F: Documentation/networking/irda.txt | 3632 | F: Documentation/networking/irda.txt |
3633 | F: drivers/net/irda/ | 3633 | F: drivers/net/irda/ |
3634 | F: include/net/irda/ | 3634 | F: include/net/irda/ |
3635 | F: net/irda/ | 3635 | F: net/irda/ |
3636 | 3636 | ||
3637 | IRQ SUBSYSTEM | 3637 | IRQ SUBSYSTEM |
3638 | M: Thomas Gleixner <tglx@linutronix.de> | 3638 | M: Thomas Gleixner <tglx@linutronix.de> |
3639 | S: Maintained | 3639 | S: Maintained |
3640 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git irq/core | 3640 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git irq/core |
3641 | F: kernel/irq/ | 3641 | F: kernel/irq/ |
3642 | 3642 | ||
3643 | ISAPNP | 3643 | ISAPNP |
3644 | M: Jaroslav Kysela <perex@perex.cz> | 3644 | M: Jaroslav Kysela <perex@perex.cz> |
3645 | S: Maintained | 3645 | S: Maintained |
3646 | F: Documentation/isapnp.txt | 3646 | F: Documentation/isapnp.txt |
3647 | F: drivers/pnp/isapnp/ | 3647 | F: drivers/pnp/isapnp/ |
3648 | F: include/linux/isapnp.h | 3648 | F: include/linux/isapnp.h |
3649 | 3649 | ||
3650 | iSCSI BOOT FIRMWARE TABLE (iBFT) DRIVER | 3650 | iSCSI BOOT FIRMWARE TABLE (iBFT) DRIVER |
3651 | M: Peter Jones <pjones@redhat.com> | 3651 | M: Peter Jones <pjones@redhat.com> |
3652 | M: Konrad Rzeszutek Wilk <konrad@kernel.org> | 3652 | M: Konrad Rzeszutek Wilk <konrad@kernel.org> |
3653 | S: Maintained | 3653 | S: Maintained |
3654 | F: drivers/firmware/iscsi_ibft* | 3654 | F: drivers/firmware/iscsi_ibft* |
3655 | 3655 | ||
3656 | ISCSI | 3656 | ISCSI |
3657 | M: Mike Christie <michaelc@cs.wisc.edu> | 3657 | M: Mike Christie <michaelc@cs.wisc.edu> |
3658 | L: open-iscsi@googlegroups.com | 3658 | L: open-iscsi@googlegroups.com |
3659 | W: www.open-iscsi.org | 3659 | W: www.open-iscsi.org |
3660 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mnc/linux-2.6-iscsi.git | 3660 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mnc/linux-2.6-iscsi.git |
3661 | S: Maintained | 3661 | S: Maintained |
3662 | F: drivers/scsi/*iscsi* | 3662 | F: drivers/scsi/*iscsi* |
3663 | F: include/scsi/*iscsi* | 3663 | F: include/scsi/*iscsi* |
3664 | 3664 | ||
3665 | ISDN SUBSYSTEM | 3665 | ISDN SUBSYSTEM |
3666 | M: Karsten Keil <isdn@linux-pingi.de> | 3666 | M: Karsten Keil <isdn@linux-pingi.de> |
3667 | L: isdn4linux@listserv.isdn4linux.de (subscribers-only) | 3667 | L: isdn4linux@listserv.isdn4linux.de (subscribers-only) |
3668 | L: netdev@vger.kernel.org | 3668 | L: netdev@vger.kernel.org |
3669 | W: http://www.isdn4linux.de | 3669 | W: http://www.isdn4linux.de |
3670 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/kkeil/isdn-2.6.git | 3670 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/kkeil/isdn-2.6.git |
3671 | S: Maintained | 3671 | S: Maintained |
3672 | F: Documentation/isdn/ | 3672 | F: Documentation/isdn/ |
3673 | F: drivers/isdn/ | 3673 | F: drivers/isdn/ |
3674 | F: include/linux/isdn.h | 3674 | F: include/linux/isdn.h |
3675 | F: include/linux/isdn/ | 3675 | F: include/linux/isdn/ |
3676 | 3676 | ||
3677 | ISDN SUBSYSTEM (Eicon active card driver) | 3677 | ISDN SUBSYSTEM (Eicon active card driver) |
3678 | M: Armin Schindler <mac@melware.de> | 3678 | M: Armin Schindler <mac@melware.de> |
3679 | L: isdn4linux@listserv.isdn4linux.de (subscribers-only) | 3679 | L: isdn4linux@listserv.isdn4linux.de (subscribers-only) |
3680 | W: http://www.melware.de | 3680 | W: http://www.melware.de |
3681 | S: Maintained | 3681 | S: Maintained |
3682 | F: drivers/isdn/hardware/eicon/ | 3682 | F: drivers/isdn/hardware/eicon/ |
3683 | 3683 | ||
3684 | IT87 HARDWARE MONITORING DRIVER | 3684 | IT87 HARDWARE MONITORING DRIVER |
3685 | M: Jean Delvare <khali@linux-fr.org> | 3685 | M: Jean Delvare <khali@linux-fr.org> |
3686 | L: lm-sensors@lm-sensors.org | 3686 | L: lm-sensors@lm-sensors.org |
3687 | S: Maintained | 3687 | S: Maintained |
3688 | F: Documentation/hwmon/it87 | 3688 | F: Documentation/hwmon/it87 |
3689 | F: drivers/hwmon/it87.c | 3689 | F: drivers/hwmon/it87.c |
3690 | 3690 | ||
3691 | IVTV VIDEO4LINUX DRIVER | 3691 | IVTV VIDEO4LINUX DRIVER |
3692 | M: Andy Walls <awalls@md.metrocast.net> | 3692 | M: Andy Walls <awalls@md.metrocast.net> |
3693 | L: ivtv-devel@ivtvdriver.org (moderated for non-subscribers) | 3693 | L: ivtv-devel@ivtvdriver.org (moderated for non-subscribers) |
3694 | L: linux-media@vger.kernel.org | 3694 | L: linux-media@vger.kernel.org |
3695 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git | 3695 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git |
3696 | W: http://www.ivtvdriver.org | 3696 | W: http://www.ivtvdriver.org |
3697 | S: Maintained | 3697 | S: Maintained |
3698 | F: Documentation/video4linux/*.ivtv | 3698 | F: Documentation/video4linux/*.ivtv |
3699 | F: drivers/media/video/ivtv/ | 3699 | F: drivers/media/video/ivtv/ |
3700 | F: include/linux/ivtv* | 3700 | F: include/linux/ivtv* |
3701 | 3701 | ||
3702 | JC42.4 TEMPERATURE SENSOR DRIVER | 3702 | JC42.4 TEMPERATURE SENSOR DRIVER |
3703 | M: Guenter Roeck <linux@roeck-us.net> | 3703 | M: Guenter Roeck <linux@roeck-us.net> |
3704 | L: lm-sensors@lm-sensors.org | 3704 | L: lm-sensors@lm-sensors.org |
3705 | S: Maintained | 3705 | S: Maintained |
3706 | F: drivers/hwmon/jc42.c | 3706 | F: drivers/hwmon/jc42.c |
3707 | F: Documentation/hwmon/jc42 | 3707 | F: Documentation/hwmon/jc42 |
3708 | 3708 | ||
3709 | JFS FILESYSTEM | 3709 | JFS FILESYSTEM |
3710 | M: Dave Kleikamp <shaggy@kernel.org> | 3710 | M: Dave Kleikamp <shaggy@kernel.org> |
3711 | L: jfs-discussion@lists.sourceforge.net | 3711 | L: jfs-discussion@lists.sourceforge.net |
3712 | W: http://jfs.sourceforge.net/ | 3712 | W: http://jfs.sourceforge.net/ |
3713 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/shaggy/jfs-2.6.git | 3713 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/shaggy/jfs-2.6.git |
3714 | S: Maintained | 3714 | S: Maintained |
3715 | F: Documentation/filesystems/jfs.txt | 3715 | F: Documentation/filesystems/jfs.txt |
3716 | F: fs/jfs/ | 3716 | F: fs/jfs/ |
3717 | 3717 | ||
3718 | JME NETWORK DRIVER | 3718 | JME NETWORK DRIVER |
3719 | M: Guo-Fu Tseng <cooldavid@cooldavid.org> | 3719 | M: Guo-Fu Tseng <cooldavid@cooldavid.org> |
3720 | L: netdev@vger.kernel.org | 3720 | L: netdev@vger.kernel.org |
3721 | S: Maintained | 3721 | S: Maintained |
3722 | F: drivers/net/ethernet/jme.* | 3722 | F: drivers/net/ethernet/jme.* |
3723 | 3723 | ||
3724 | JOURNALLING FLASH FILE SYSTEM V2 (JFFS2) | 3724 | JOURNALLING FLASH FILE SYSTEM V2 (JFFS2) |
3725 | M: David Woodhouse <dwmw2@infradead.org> | 3725 | M: David Woodhouse <dwmw2@infradead.org> |
3726 | L: linux-mtd@lists.infradead.org | 3726 | L: linux-mtd@lists.infradead.org |
3727 | W: http://www.linux-mtd.infradead.org/doc/jffs2.html | 3727 | W: http://www.linux-mtd.infradead.org/doc/jffs2.html |
3728 | S: Maintained | 3728 | S: Maintained |
3729 | F: fs/jffs2/ | 3729 | F: fs/jffs2/ |
3730 | F: include/linux/jffs2.h | 3730 | F: include/linux/jffs2.h |
3731 | 3731 | ||
3732 | JOURNALLING LAYER FOR BLOCK DEVICES (JBD) | 3732 | JOURNALLING LAYER FOR BLOCK DEVICES (JBD) |
3733 | M: Andrew Morton <akpm@linux-foundation.org> | 3733 | M: Andrew Morton <akpm@linux-foundation.org> |
3734 | M: Jan Kara <jack@suse.cz> | 3734 | M: Jan Kara <jack@suse.cz> |
3735 | L: linux-ext4@vger.kernel.org | 3735 | L: linux-ext4@vger.kernel.org |
3736 | S: Maintained | 3736 | S: Maintained |
3737 | F: fs/jbd/ | 3737 | F: fs/jbd/ |
3738 | F: include/linux/ext3_jbd.h | 3738 | F: include/linux/ext3_jbd.h |
3739 | F: include/linux/jbd.h | 3739 | F: include/linux/jbd.h |
3740 | 3740 | ||
3741 | JOURNALLING LAYER FOR BLOCK DEVICES (JBD2) | 3741 | JOURNALLING LAYER FOR BLOCK DEVICES (JBD2) |
3742 | M: "Theodore Ts'o" <tytso@mit.edu> | 3742 | M: "Theodore Ts'o" <tytso@mit.edu> |
3743 | L: linux-ext4@vger.kernel.org | 3743 | L: linux-ext4@vger.kernel.org |
3744 | S: Maintained | 3744 | S: Maintained |
3745 | F: fs/jbd2/ | 3745 | F: fs/jbd2/ |
3746 | F: include/linux/jbd2.h | 3746 | F: include/linux/jbd2.h |
3747 | 3747 | ||
3748 | JSM Neo PCI based serial card | 3748 | JSM Neo PCI based serial card |
3749 | M: Lucas Tavares <lucaskt@linux.vnet.ibm.com> | 3749 | M: Lucas Tavares <lucaskt@linux.vnet.ibm.com> |
3750 | L: linux-serial@vger.kernel.org | 3750 | L: linux-serial@vger.kernel.org |
3751 | S: Maintained | 3751 | S: Maintained |
3752 | F: drivers/tty/serial/jsm/ | 3752 | F: drivers/tty/serial/jsm/ |
3753 | 3753 | ||
3754 | K10TEMP HARDWARE MONITORING DRIVER | 3754 | K10TEMP HARDWARE MONITORING DRIVER |
3755 | M: Clemens Ladisch <clemens@ladisch.de> | 3755 | M: Clemens Ladisch <clemens@ladisch.de> |
3756 | L: lm-sensors@lm-sensors.org | 3756 | L: lm-sensors@lm-sensors.org |
3757 | S: Maintained | 3757 | S: Maintained |
3758 | F: Documentation/hwmon/k10temp | 3758 | F: Documentation/hwmon/k10temp |
3759 | F: drivers/hwmon/k10temp.c | 3759 | F: drivers/hwmon/k10temp.c |
3760 | 3760 | ||
3761 | K8TEMP HARDWARE MONITORING DRIVER | 3761 | K8TEMP HARDWARE MONITORING DRIVER |
3762 | M: Rudolf Marek <r.marek@assembler.cz> | 3762 | M: Rudolf Marek <r.marek@assembler.cz> |
3763 | L: lm-sensors@lm-sensors.org | 3763 | L: lm-sensors@lm-sensors.org |
3764 | S: Maintained | 3764 | S: Maintained |
3765 | F: Documentation/hwmon/k8temp | 3765 | F: Documentation/hwmon/k8temp |
3766 | F: drivers/hwmon/k8temp.c | 3766 | F: drivers/hwmon/k8temp.c |
3767 | 3767 | ||
3768 | KCONFIG | 3768 | KCONFIG |
3769 | M: Michal Marek <mmarek@suse.cz> | 3769 | M: Michal Marek <mmarek@suse.cz> |
3770 | L: linux-kbuild@vger.kernel.org | 3770 | L: linux-kbuild@vger.kernel.org |
3771 | S: Odd Fixes | 3771 | S: Odd Fixes |
3772 | F: Documentation/kbuild/kconfig-language.txt | 3772 | F: Documentation/kbuild/kconfig-language.txt |
3773 | F: scripts/kconfig/ | 3773 | F: scripts/kconfig/ |
3774 | 3774 | ||
3775 | KDUMP | 3775 | KDUMP |
3776 | M: Vivek Goyal <vgoyal@redhat.com> | 3776 | M: Vivek Goyal <vgoyal@redhat.com> |
3777 | M: Haren Myneni <hbabu@us.ibm.com> | 3777 | M: Haren Myneni <hbabu@us.ibm.com> |
3778 | L: kexec@lists.infradead.org | 3778 | L: kexec@lists.infradead.org |
3779 | W: http://lse.sourceforge.net/kdump/ | 3779 | W: http://lse.sourceforge.net/kdump/ |
3780 | S: Maintained | 3780 | S: Maintained |
3781 | F: Documentation/kdump/ | 3781 | F: Documentation/kdump/ |
3782 | 3782 | ||
3783 | KERNEL AUTOMOUNTER v4 (AUTOFS4) | 3783 | KERNEL AUTOMOUNTER v4 (AUTOFS4) |
3784 | M: Ian Kent <raven@themaw.net> | 3784 | M: Ian Kent <raven@themaw.net> |
3785 | L: autofs@linux.kernel.org | 3785 | L: autofs@linux.kernel.org |
3786 | S: Maintained | 3786 | S: Maintained |
3787 | F: fs/autofs4/ | 3787 | F: fs/autofs4/ |
3788 | 3788 | ||
3789 | KERNEL BUILD + files below scripts/ (unless maintained elsewhere) | 3789 | KERNEL BUILD + files below scripts/ (unless maintained elsewhere) |
3790 | M: Michal Marek <mmarek@suse.cz> | 3790 | M: Michal Marek <mmarek@suse.cz> |
3791 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild-2.6.git for-next | 3791 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild-2.6.git for-next |
3792 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild-2.6.git rc-fixes | 3792 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild-2.6.git rc-fixes |
3793 | L: linux-kbuild@vger.kernel.org | 3793 | L: linux-kbuild@vger.kernel.org |
3794 | S: Maintained | 3794 | S: Maintained |
3795 | F: Documentation/kbuild/ | 3795 | F: Documentation/kbuild/ |
3796 | F: Makefile | 3796 | F: Makefile |
3797 | F: scripts/Makefile.* | 3797 | F: scripts/Makefile.* |
3798 | F: scripts/basic/ | 3798 | F: scripts/basic/ |
3799 | F: scripts/mk* | 3799 | F: scripts/mk* |
3800 | F: scripts/package/ | 3800 | F: scripts/package/ |
3801 | 3801 | ||
3802 | KERNEL JANITORS | 3802 | KERNEL JANITORS |
3803 | L: kernel-janitors@vger.kernel.org | 3803 | L: kernel-janitors@vger.kernel.org |
3804 | W: http://kernelnewbies.org/KernelJanitors | 3804 | W: http://kernelnewbies.org/KernelJanitors |
3805 | S: Odd Fixes | 3805 | S: Odd Fixes |
3806 | 3806 | ||
3807 | KERNEL NFSD, SUNRPC, AND LOCKD SERVERS | 3807 | KERNEL NFSD, SUNRPC, AND LOCKD SERVERS |
3808 | M: "J. Bruce Fields" <bfields@fieldses.org> | 3808 | M: "J. Bruce Fields" <bfields@fieldses.org> |
3809 | L: linux-nfs@vger.kernel.org | 3809 | L: linux-nfs@vger.kernel.org |
3810 | W: http://nfs.sourceforge.net/ | 3810 | W: http://nfs.sourceforge.net/ |
3811 | S: Supported | 3811 | S: Supported |
3812 | F: fs/nfsd/ | 3812 | F: fs/nfsd/ |
3813 | F: include/linux/nfsd/ | 3813 | F: include/linux/nfsd/ |
3814 | F: fs/lockd/ | 3814 | F: fs/lockd/ |
3815 | F: fs/nfs_common/ | 3815 | F: fs/nfs_common/ |
3816 | F: net/sunrpc/ | 3816 | F: net/sunrpc/ |
3817 | F: include/linux/lockd/ | 3817 | F: include/linux/lockd/ |
3818 | F: include/linux/sunrpc/ | 3818 | F: include/linux/sunrpc/ |
3819 | 3819 | ||
3820 | KERNEL VIRTUAL MACHINE (KVM) | 3820 | KERNEL VIRTUAL MACHINE (KVM) |
3821 | M: Avi Kivity <avi@redhat.com> | 3821 | M: Avi Kivity <avi@redhat.com> |
3822 | M: Marcelo Tosatti <mtosatti@redhat.com> | 3822 | M: Marcelo Tosatti <mtosatti@redhat.com> |
3823 | L: kvm@vger.kernel.org | 3823 | L: kvm@vger.kernel.org |
3824 | W: http://kvm.qumranet.com | 3824 | W: http://kvm.qumranet.com |
3825 | S: Supported | 3825 | S: Supported |
3826 | F: Documentation/*/kvm.txt | 3826 | F: Documentation/*/kvm.txt |
3827 | F: arch/*/kvm/ | 3827 | F: arch/*/kvm/ |
3828 | F: arch/*/include/asm/kvm* | 3828 | F: arch/*/include/asm/kvm* |
3829 | F: include/linux/kvm* | 3829 | F: include/linux/kvm* |
3830 | F: virt/kvm/ | 3830 | F: virt/kvm/ |
3831 | 3831 | ||
3832 | KERNEL VIRTUAL MACHINE (KVM) FOR AMD-V | 3832 | KERNEL VIRTUAL MACHINE (KVM) FOR AMD-V |
3833 | M: Joerg Roedel <joerg.roedel@amd.com> | 3833 | M: Joerg Roedel <joerg.roedel@amd.com> |
3834 | L: kvm@vger.kernel.org | 3834 | L: kvm@vger.kernel.org |
3835 | W: http://kvm.qumranet.com | 3835 | W: http://kvm.qumranet.com |
3836 | S: Supported | 3836 | S: Supported |
3837 | F: arch/x86/include/asm/svm.h | 3837 | F: arch/x86/include/asm/svm.h |
3838 | F: arch/x86/kvm/svm.c | 3838 | F: arch/x86/kvm/svm.c |
3839 | 3839 | ||
3840 | KERNEL VIRTUAL MACHINE (KVM) FOR POWERPC | 3840 | KERNEL VIRTUAL MACHINE (KVM) FOR POWERPC |
3841 | M: Alexander Graf <agraf@suse.de> | 3841 | M: Alexander Graf <agraf@suse.de> |
3842 | L: kvm-ppc@vger.kernel.org | 3842 | L: kvm-ppc@vger.kernel.org |
3843 | W: http://kvm.qumranet.com | 3843 | W: http://kvm.qumranet.com |
3844 | S: Supported | 3844 | S: Supported |
3845 | F: arch/powerpc/include/asm/kvm* | 3845 | F: arch/powerpc/include/asm/kvm* |
3846 | F: arch/powerpc/kvm/ | 3846 | F: arch/powerpc/kvm/ |
3847 | 3847 | ||
3848 | KERNEL VIRTUAL MACHINE For Itanium (KVM/IA64) | 3848 | KERNEL VIRTUAL MACHINE For Itanium (KVM/IA64) |
3849 | M: Xiantao Zhang <xiantao.zhang@intel.com> | 3849 | M: Xiantao Zhang <xiantao.zhang@intel.com> |
3850 | L: kvm-ia64@vger.kernel.org | 3850 | L: kvm-ia64@vger.kernel.org |
3851 | W: http://kvm.qumranet.com | 3851 | W: http://kvm.qumranet.com |
3852 | S: Supported | 3852 | S: Supported |
3853 | F: Documentation/ia64/kvm.txt | 3853 | F: Documentation/ia64/kvm.txt |
3854 | F: arch/ia64/include/asm/kvm* | 3854 | F: arch/ia64/include/asm/kvm* |
3855 | F: arch/ia64/kvm/ | 3855 | F: arch/ia64/kvm/ |
3856 | 3856 | ||
3857 | KERNEL VIRTUAL MACHINE for s390 (KVM/s390) | 3857 | KERNEL VIRTUAL MACHINE for s390 (KVM/s390) |
3858 | M: Carsten Otte <cotte@de.ibm.com> | 3858 | M: Carsten Otte <cotte@de.ibm.com> |
3859 | M: Christian Borntraeger <borntraeger@de.ibm.com> | 3859 | M: Christian Borntraeger <borntraeger@de.ibm.com> |
3860 | M: linux390@de.ibm.com | 3860 | M: linux390@de.ibm.com |
3861 | L: linux-s390@vger.kernel.org | 3861 | L: linux-s390@vger.kernel.org |
3862 | W: http://www.ibm.com/developerworks/linux/linux390/ | 3862 | W: http://www.ibm.com/developerworks/linux/linux390/ |
3863 | S: Supported | 3863 | S: Supported |
3864 | F: Documentation/s390/kvm.txt | 3864 | F: Documentation/s390/kvm.txt |
3865 | F: arch/s390/include/asm/kvm* | 3865 | F: arch/s390/include/asm/kvm* |
3866 | F: arch/s390/kvm/ | 3866 | F: arch/s390/kvm/ |
3867 | F: drivers/s390/kvm/ | 3867 | F: drivers/s390/kvm/ |
3868 | 3868 | ||
3869 | KEXEC | 3869 | KEXEC |
3870 | M: Eric Biederman <ebiederm@xmission.com> | 3870 | M: Eric Biederman <ebiederm@xmission.com> |
3871 | W: http://kernel.org/pub/linux/utils/kernel/kexec/ | 3871 | W: http://kernel.org/pub/linux/utils/kernel/kexec/ |
3872 | L: kexec@lists.infradead.org | 3872 | L: kexec@lists.infradead.org |
3873 | S: Maintained | 3873 | S: Maintained |
3874 | F: include/linux/kexec.h | 3874 | F: include/linux/kexec.h |
3875 | F: kernel/kexec.c | 3875 | F: kernel/kexec.c |
3876 | 3876 | ||
3877 | KEYS/KEYRINGS: | 3877 | KEYS/KEYRINGS: |
3878 | M: David Howells <dhowells@redhat.com> | 3878 | M: David Howells <dhowells@redhat.com> |
3879 | L: keyrings@linux-nfs.org | 3879 | L: keyrings@linux-nfs.org |
3880 | S: Maintained | 3880 | S: Maintained |
3881 | F: Documentation/security/keys.txt | 3881 | F: Documentation/security/keys.txt |
3882 | F: include/linux/key.h | 3882 | F: include/linux/key.h |
3883 | F: include/linux/key-type.h | 3883 | F: include/linux/key-type.h |
3884 | F: include/keys/ | 3884 | F: include/keys/ |
3885 | F: security/keys/ | 3885 | F: security/keys/ |
3886 | 3886 | ||
3887 | KEYS-TRUSTED | 3887 | KEYS-TRUSTED |
3888 | M: David Safford <safford@watson.ibm.com> | 3888 | M: David Safford <safford@watson.ibm.com> |
3889 | M: Mimi Zohar <zohar@us.ibm.com> | 3889 | M: Mimi Zohar <zohar@us.ibm.com> |
3890 | L: linux-security-module@vger.kernel.org | 3890 | L: linux-security-module@vger.kernel.org |
3891 | L: keyrings@linux-nfs.org | 3891 | L: keyrings@linux-nfs.org |
3892 | S: Supported | 3892 | S: Supported |
3893 | F: Documentation/security/keys-trusted-encrypted.txt | 3893 | F: Documentation/security/keys-trusted-encrypted.txt |
3894 | F: include/keys/trusted-type.h | 3894 | F: include/keys/trusted-type.h |
3895 | F: security/keys/trusted.c | 3895 | F: security/keys/trusted.c |
3896 | F: security/keys/trusted.h | 3896 | F: security/keys/trusted.h |
3897 | 3897 | ||
3898 | KEYS-ENCRYPTED | 3898 | KEYS-ENCRYPTED |
3899 | M: Mimi Zohar <zohar@us.ibm.com> | 3899 | M: Mimi Zohar <zohar@us.ibm.com> |
3900 | M: David Safford <safford@watson.ibm.com> | 3900 | M: David Safford <safford@watson.ibm.com> |
3901 | L: linux-security-module@vger.kernel.org | 3901 | L: linux-security-module@vger.kernel.org |
3902 | L: keyrings@linux-nfs.org | 3902 | L: keyrings@linux-nfs.org |
3903 | S: Supported | 3903 | S: Supported |
3904 | F: Documentation/security/keys-trusted-encrypted.txt | 3904 | F: Documentation/security/keys-trusted-encrypted.txt |
3905 | F: include/keys/encrypted-type.h | 3905 | F: include/keys/encrypted-type.h |
3906 | F: security/keys/encrypted-keys/ | 3906 | F: security/keys/encrypted-keys/ |
3907 | 3907 | ||
3908 | KGDB / KDB /debug_core | 3908 | KGDB / KDB /debug_core |
3909 | M: Jason Wessel <jason.wessel@windriver.com> | 3909 | M: Jason Wessel <jason.wessel@windriver.com> |
3910 | W: http://kgdb.wiki.kernel.org/ | 3910 | W: http://kgdb.wiki.kernel.org/ |
3911 | L: kgdb-bugreport@lists.sourceforge.net | 3911 | L: kgdb-bugreport@lists.sourceforge.net |
3912 | S: Maintained | 3912 | S: Maintained |
3913 | F: Documentation/DocBook/kgdb.tmpl | 3913 | F: Documentation/DocBook/kgdb.tmpl |
3914 | F: drivers/misc/kgdbts.c | 3914 | F: drivers/misc/kgdbts.c |
3915 | F: drivers/tty/serial/kgdboc.c | 3915 | F: drivers/tty/serial/kgdboc.c |
3916 | F: include/linux/kdb.h | 3916 | F: include/linux/kdb.h |
3917 | F: include/linux/kgdb.h | 3917 | F: include/linux/kgdb.h |
3918 | F: kernel/debug/ | 3918 | F: kernel/debug/ |
3919 | 3919 | ||
3920 | KMEMCHECK | 3920 | KMEMCHECK |
3921 | M: Vegard Nossum <vegardno@ifi.uio.no> | 3921 | M: Vegard Nossum <vegardno@ifi.uio.no> |
3922 | M: Pekka Enberg <penberg@kernel.org> | 3922 | M: Pekka Enberg <penberg@kernel.org> |
3923 | S: Maintained | 3923 | S: Maintained |
3924 | F: Documentation/kmemcheck.txt | 3924 | F: Documentation/kmemcheck.txt |
3925 | F: arch/x86/include/asm/kmemcheck.h | 3925 | F: arch/x86/include/asm/kmemcheck.h |
3926 | F: arch/x86/mm/kmemcheck/ | 3926 | F: arch/x86/mm/kmemcheck/ |
3927 | F: include/linux/kmemcheck.h | 3927 | F: include/linux/kmemcheck.h |
3928 | F: mm/kmemcheck.c | 3928 | F: mm/kmemcheck.c |
3929 | 3929 | ||
3930 | KMEMLEAK | 3930 | KMEMLEAK |
3931 | M: Catalin Marinas <catalin.marinas@arm.com> | 3931 | M: Catalin Marinas <catalin.marinas@arm.com> |
3932 | S: Maintained | 3932 | S: Maintained |
3933 | F: Documentation/kmemleak.txt | 3933 | F: Documentation/kmemleak.txt |
3934 | F: include/linux/kmemleak.h | 3934 | F: include/linux/kmemleak.h |
3935 | F: mm/kmemleak.c | 3935 | F: mm/kmemleak.c |
3936 | F: mm/kmemleak-test.c | 3936 | F: mm/kmemleak-test.c |
3937 | 3937 | ||
3938 | KPROBES | 3938 | KPROBES |
3939 | M: Ananth N Mavinakayanahalli <ananth@in.ibm.com> | 3939 | M: Ananth N Mavinakayanahalli <ananth@in.ibm.com> |
3940 | M: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com> | 3940 | M: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com> |
3941 | M: "David S. Miller" <davem@davemloft.net> | 3941 | M: "David S. Miller" <davem@davemloft.net> |
3942 | M: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> | 3942 | M: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> |
3943 | S: Maintained | 3943 | S: Maintained |
3944 | F: Documentation/kprobes.txt | 3944 | F: Documentation/kprobes.txt |
3945 | F: include/linux/kprobes.h | 3945 | F: include/linux/kprobes.h |
3946 | F: kernel/kprobes.c | 3946 | F: kernel/kprobes.c |
3947 | 3947 | ||
3948 | KS0108 LCD CONTROLLER DRIVER | 3948 | KS0108 LCD CONTROLLER DRIVER |
3949 | M: Miguel Ojeda Sandonis <miguel.ojeda.sandonis@gmail.com> | 3949 | M: Miguel Ojeda Sandonis <miguel.ojeda.sandonis@gmail.com> |
3950 | W: http://miguelojeda.es/auxdisplay.htm | 3950 | W: http://miguelojeda.es/auxdisplay.htm |
3951 | W: http://jair.lab.fi.uva.es/~migojed/auxdisplay.htm | 3951 | W: http://jair.lab.fi.uva.es/~migojed/auxdisplay.htm |
3952 | S: Maintained | 3952 | S: Maintained |
3953 | F: Documentation/auxdisplay/ks0108 | 3953 | F: Documentation/auxdisplay/ks0108 |
3954 | F: drivers/auxdisplay/ks0108.c | 3954 | F: drivers/auxdisplay/ks0108.c |
3955 | F: include/linux/ks0108.h | 3955 | F: include/linux/ks0108.h |
3956 | 3956 | ||
3957 | LAPB module | 3957 | LAPB module |
3958 | L: linux-x25@vger.kernel.org | 3958 | L: linux-x25@vger.kernel.org |
3959 | S: Orphan | 3959 | S: Orphan |
3960 | F: Documentation/networking/lapb-module.txt | 3960 | F: Documentation/networking/lapb-module.txt |
3961 | F: include/*/lapb.h | 3961 | F: include/*/lapb.h |
3962 | F: net/lapb/ | 3962 | F: net/lapb/ |
3963 | 3963 | ||
3964 | LASI 53c700 driver for PARISC | 3964 | LASI 53c700 driver for PARISC |
3965 | M: "James E.J. Bottomley" <James.Bottomley@HansenPartnership.com> | 3965 | M: "James E.J. Bottomley" <James.Bottomley@HansenPartnership.com> |
3966 | L: linux-scsi@vger.kernel.org | 3966 | L: linux-scsi@vger.kernel.org |
3967 | S: Maintained | 3967 | S: Maintained |
3968 | F: Documentation/scsi/53c700.txt | 3968 | F: Documentation/scsi/53c700.txt |
3969 | F: drivers/scsi/53c700* | 3969 | F: drivers/scsi/53c700* |
3970 | 3970 | ||
3971 | LED SUBSYSTEM | 3971 | LED SUBSYSTEM |
3972 | M: Richard Purdie <rpurdie@rpsys.net> | 3972 | M: Richard Purdie <rpurdie@rpsys.net> |
3973 | S: Maintained | 3973 | S: Maintained |
3974 | F: drivers/leds/ | 3974 | F: drivers/leds/ |
3975 | F: include/linux/leds.h | 3975 | F: include/linux/leds.h |
3976 | 3976 | ||
3977 | LEGACY EEPROM DRIVER | 3977 | LEGACY EEPROM DRIVER |
3978 | M: Jean Delvare <khali@linux-fr.org> | 3978 | M: Jean Delvare <khali@linux-fr.org> |
3979 | S: Maintained | 3979 | S: Maintained |
3980 | F: Documentation/misc-devices/eeprom | 3980 | F: Documentation/misc-devices/eeprom |
3981 | F: drivers/misc/eeprom/eeprom.c | 3981 | F: drivers/misc/eeprom/eeprom.c |
3982 | 3982 | ||
3983 | LEGO USB Tower driver | 3983 | LEGO USB Tower driver |
3984 | M: Juergen Stuber <starblue@users.sourceforge.net> | 3984 | M: Juergen Stuber <starblue@users.sourceforge.net> |
3985 | L: legousb-devel@lists.sourceforge.net | 3985 | L: legousb-devel@lists.sourceforge.net |
3986 | W: http://legousb.sourceforge.net/ | 3986 | W: http://legousb.sourceforge.net/ |
3987 | S: Maintained | 3987 | S: Maintained |
3988 | F: drivers/usb/misc/legousbtower.c | 3988 | F: drivers/usb/misc/legousbtower.c |
3989 | 3989 | ||
3990 | LGUEST | 3990 | LGUEST |
3991 | M: Rusty Russell <rusty@rustcorp.com.au> | 3991 | M: Rusty Russell <rusty@rustcorp.com.au> |
3992 | L: lguest@lists.ozlabs.org | 3992 | L: lguest@lists.ozlabs.org |
3993 | W: http://lguest.ozlabs.org/ | 3993 | W: http://lguest.ozlabs.org/ |
3994 | S: Odd Fixes | 3994 | S: Odd Fixes |
3995 | F: arch/x86/include/asm/lguest*.h | 3995 | F: arch/x86/include/asm/lguest*.h |
3996 | F: arch/x86/lguest/ | 3996 | F: arch/x86/lguest/ |
3997 | F: drivers/lguest/ | 3997 | F: drivers/lguest/ |
3998 | F: include/linux/lguest*.h | 3998 | F: include/linux/lguest*.h |
3999 | F: tools/lguest/ | 3999 | F: tools/lguest/ |
4000 | 4000 | ||
4001 | LINUX FOR IBM pSERIES (RS/6000) | 4001 | LINUX FOR IBM pSERIES (RS/6000) |
4002 | M: Paul Mackerras <paulus@au.ibm.com> | 4002 | M: Paul Mackerras <paulus@au.ibm.com> |
4003 | W: http://www.ibm.com/linux/ltc/projects/ppc | 4003 | W: http://www.ibm.com/linux/ltc/projects/ppc |
4004 | S: Supported | 4004 | S: Supported |
4005 | F: arch/powerpc/boot/rs6000.h | 4005 | F: arch/powerpc/boot/rs6000.h |
4006 | 4006 | ||
4007 | LINUX FOR POWERPC (32-BIT AND 64-BIT) | 4007 | LINUX FOR POWERPC (32-BIT AND 64-BIT) |
4008 | M: Benjamin Herrenschmidt <benh@kernel.crashing.org> | 4008 | M: Benjamin Herrenschmidt <benh@kernel.crashing.org> |
4009 | M: Paul Mackerras <paulus@samba.org> | 4009 | M: Paul Mackerras <paulus@samba.org> |
4010 | W: http://www.penguinppc.org/ | 4010 | W: http://www.penguinppc.org/ |
4011 | L: linuxppc-dev@lists.ozlabs.org | 4011 | L: linuxppc-dev@lists.ozlabs.org |
4012 | Q: http://patchwork.ozlabs.org/project/linuxppc-dev/list/ | 4012 | Q: http://patchwork.ozlabs.org/project/linuxppc-dev/list/ |
4013 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc.git | 4013 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc.git |
4014 | S: Supported | 4014 | S: Supported |
4015 | F: Documentation/powerpc/ | 4015 | F: Documentation/powerpc/ |
4016 | F: arch/powerpc/ | 4016 | F: arch/powerpc/ |
4017 | 4017 | ||
4018 | LINUX FOR POWER MACINTOSH | 4018 | LINUX FOR POWER MACINTOSH |
4019 | M: Benjamin Herrenschmidt <benh@kernel.crashing.org> | 4019 | M: Benjamin Herrenschmidt <benh@kernel.crashing.org> |
4020 | W: http://www.penguinppc.org/ | 4020 | W: http://www.penguinppc.org/ |
4021 | L: linuxppc-dev@lists.ozlabs.org | 4021 | L: linuxppc-dev@lists.ozlabs.org |
4022 | S: Maintained | 4022 | S: Maintained |
4023 | F: arch/powerpc/platforms/powermac/ | 4023 | F: arch/powerpc/platforms/powermac/ |
4024 | F: drivers/macintosh/ | 4024 | F: drivers/macintosh/ |
4025 | 4025 | ||
4026 | LINUX FOR POWERPC EMBEDDED MPC5XXX | 4026 | LINUX FOR POWERPC EMBEDDED MPC5XXX |
4027 | M: Anatolij Gustschin <agust@denx.de> | 4027 | M: Anatolij Gustschin <agust@denx.de> |
4028 | L: linuxppc-dev@lists.ozlabs.org | 4028 | L: linuxppc-dev@lists.ozlabs.org |
4029 | T: git git://git.denx.de/linux-2.6-agust.git | 4029 | T: git git://git.denx.de/linux-2.6-agust.git |
4030 | S: Maintained | 4030 | S: Maintained |
4031 | F: arch/powerpc/platforms/512x/ | 4031 | F: arch/powerpc/platforms/512x/ |
4032 | F: arch/powerpc/platforms/52xx/ | 4032 | F: arch/powerpc/platforms/52xx/ |
4033 | 4033 | ||
4034 | LINUX FOR POWERPC EMBEDDED PPC4XX | 4034 | LINUX FOR POWERPC EMBEDDED PPC4XX |
4035 | M: Josh Boyer <jwboyer@gmail.com> | 4035 | M: Josh Boyer <jwboyer@gmail.com> |
4036 | M: Matt Porter <mporter@kernel.crashing.org> | 4036 | M: Matt Porter <mporter@kernel.crashing.org> |
4037 | W: http://www.penguinppc.org/ | 4037 | W: http://www.penguinppc.org/ |
4038 | L: linuxppc-dev@lists.ozlabs.org | 4038 | L: linuxppc-dev@lists.ozlabs.org |
4039 | T: git git://git.infradead.org/users/jwboyer/powerpc-4xx.git | 4039 | T: git git://git.infradead.org/users/jwboyer/powerpc-4xx.git |
4040 | S: Maintained | 4040 | S: Maintained |
4041 | F: arch/powerpc/platforms/40x/ | 4041 | F: arch/powerpc/platforms/40x/ |
4042 | F: arch/powerpc/platforms/44x/ | 4042 | F: arch/powerpc/platforms/44x/ |
4043 | 4043 | ||
4044 | LINUX FOR POWERPC EMBEDDED XILINX VIRTEX | 4044 | LINUX FOR POWERPC EMBEDDED XILINX VIRTEX |
4045 | M: Grant Likely <grant.likely@secretlab.ca> | 4045 | M: Grant Likely <grant.likely@secretlab.ca> |
4046 | W: http://wiki.secretlab.ca/index.php/Linux_on_Xilinx_Virtex | 4046 | W: http://wiki.secretlab.ca/index.php/Linux_on_Xilinx_Virtex |
4047 | L: linuxppc-dev@lists.ozlabs.org | 4047 | L: linuxppc-dev@lists.ozlabs.org |
4048 | T: git git://git.secretlab.ca/git/linux-2.6.git | 4048 | T: git git://git.secretlab.ca/git/linux-2.6.git |
4049 | S: Maintained | 4049 | S: Maintained |
4050 | F: arch/powerpc/*/*virtex* | 4050 | F: arch/powerpc/*/*virtex* |
4051 | F: arch/powerpc/*/*/*virtex* | 4051 | F: arch/powerpc/*/*/*virtex* |
4052 | 4052 | ||
4053 | LINUX FOR POWERPC EMBEDDED PPC8XX | 4053 | LINUX FOR POWERPC EMBEDDED PPC8XX |
4054 | M: Vitaly Bordug <vitb@kernel.crashing.org> | 4054 | M: Vitaly Bordug <vitb@kernel.crashing.org> |
4055 | M: Marcelo Tosatti <marcelo@kvack.org> | 4055 | M: Marcelo Tosatti <marcelo@kvack.org> |
4056 | W: http://www.penguinppc.org/ | 4056 | W: http://www.penguinppc.org/ |
4057 | L: linuxppc-dev@lists.ozlabs.org | 4057 | L: linuxppc-dev@lists.ozlabs.org |
4058 | S: Maintained | 4058 | S: Maintained |
4059 | F: arch/powerpc/platforms/8xx/ | 4059 | F: arch/powerpc/platforms/8xx/ |
4060 | 4060 | ||
4061 | LINUX FOR POWERPC EMBEDDED PPC83XX AND PPC85XX | 4061 | LINUX FOR POWERPC EMBEDDED PPC83XX AND PPC85XX |
4062 | M: Kumar Gala <galak@kernel.crashing.org> | 4062 | M: Kumar Gala <galak@kernel.crashing.org> |
4063 | W: http://www.penguinppc.org/ | 4063 | W: http://www.penguinppc.org/ |
4064 | L: linuxppc-dev@lists.ozlabs.org | 4064 | L: linuxppc-dev@lists.ozlabs.org |
4065 | S: Maintained | 4065 | S: Maintained |
4066 | F: arch/powerpc/platforms/83xx/ | 4066 | F: arch/powerpc/platforms/83xx/ |
4067 | F: arch/powerpc/platforms/85xx/ | 4067 | F: arch/powerpc/platforms/85xx/ |
4068 | 4068 | ||
4069 | LINUX FOR POWERPC PA SEMI PWRFICIENT | 4069 | LINUX FOR POWERPC PA SEMI PWRFICIENT |
4070 | M: Olof Johansson <olof@lixom.net> | 4070 | M: Olof Johansson <olof@lixom.net> |
4071 | L: linuxppc-dev@lists.ozlabs.org | 4071 | L: linuxppc-dev@lists.ozlabs.org |
4072 | S: Maintained | 4072 | S: Maintained |
4073 | F: arch/powerpc/platforms/pasemi/ | 4073 | F: arch/powerpc/platforms/pasemi/ |
4074 | F: drivers/*/*pasemi* | 4074 | F: drivers/*/*pasemi* |
4075 | F: drivers/*/*/*pasemi* | 4075 | F: drivers/*/*/*pasemi* |
4076 | 4076 | ||
4077 | LINUX SECURITY MODULE (LSM) FRAMEWORK | 4077 | LINUX SECURITY MODULE (LSM) FRAMEWORK |
4078 | M: Chris Wright <chrisw@sous-sol.org> | 4078 | M: Chris Wright <chrisw@sous-sol.org> |
4079 | L: linux-security-module@vger.kernel.org | 4079 | L: linux-security-module@vger.kernel.org |
4080 | S: Supported | 4080 | S: Supported |
4081 | 4081 | ||
4082 | LIS3LV02D ACCELEROMETER DRIVER | 4082 | LIS3LV02D ACCELEROMETER DRIVER |
4083 | M: Eric Piel <eric.piel@tremplin-utc.net> | 4083 | M: Eric Piel <eric.piel@tremplin-utc.net> |
4084 | S: Maintained | 4084 | S: Maintained |
4085 | F: Documentation/misc-devices/lis3lv02d | 4085 | F: Documentation/misc-devices/lis3lv02d |
4086 | F: drivers/misc/lis3lv02d/ | 4086 | F: drivers/misc/lis3lv02d/ |
4087 | F: drivers/platform/x86/hp_accel.c | 4087 | F: drivers/platform/x86/hp_accel.c |
4088 | 4088 | ||
4089 | LLC (802.2) | 4089 | LLC (802.2) |
4090 | M: Arnaldo Carvalho de Melo <acme@ghostprotocols.net> | 4090 | M: Arnaldo Carvalho de Melo <acme@ghostprotocols.net> |
4091 | S: Maintained | 4091 | S: Maintained |
4092 | F: include/linux/llc.h | 4092 | F: include/linux/llc.h |
4093 | F: include/net/llc* | 4093 | F: include/net/llc* |
4094 | F: net/llc/ | 4094 | F: net/llc/ |
4095 | 4095 | ||
4096 | LM73 HARDWARE MONITOR DRIVER | 4096 | LM73 HARDWARE MONITOR DRIVER |
4097 | M: Guillaume Ligneul <guillaume.ligneul@gmail.com> | 4097 | M: Guillaume Ligneul <guillaume.ligneul@gmail.com> |
4098 | L: lm-sensors@lm-sensors.org | 4098 | L: lm-sensors@lm-sensors.org |
4099 | S: Maintained | 4099 | S: Maintained |
4100 | F: drivers/hwmon/lm73.c | 4100 | F: drivers/hwmon/lm73.c |
4101 | 4101 | ||
4102 | LM78 HARDWARE MONITOR DRIVER | 4102 | LM78 HARDWARE MONITOR DRIVER |
4103 | M: Jean Delvare <khali@linux-fr.org> | 4103 | M: Jean Delvare <khali@linux-fr.org> |
4104 | L: lm-sensors@lm-sensors.org | 4104 | L: lm-sensors@lm-sensors.org |
4105 | S: Maintained | 4105 | S: Maintained |
4106 | F: Documentation/hwmon/lm78 | 4106 | F: Documentation/hwmon/lm78 |
4107 | F: drivers/hwmon/lm78.c | 4107 | F: drivers/hwmon/lm78.c |
4108 | 4108 | ||
4109 | LM83 HARDWARE MONITOR DRIVER | 4109 | LM83 HARDWARE MONITOR DRIVER |
4110 | M: Jean Delvare <khali@linux-fr.org> | 4110 | M: Jean Delvare <khali@linux-fr.org> |
4111 | L: lm-sensors@lm-sensors.org | 4111 | L: lm-sensors@lm-sensors.org |
4112 | S: Maintained | 4112 | S: Maintained |
4113 | F: Documentation/hwmon/lm83 | 4113 | F: Documentation/hwmon/lm83 |
4114 | F: drivers/hwmon/lm83.c | 4114 | F: drivers/hwmon/lm83.c |
4115 | 4115 | ||
4116 | LM90 HARDWARE MONITOR DRIVER | 4116 | LM90 HARDWARE MONITOR DRIVER |
4117 | M: Jean Delvare <khali@linux-fr.org> | 4117 | M: Jean Delvare <khali@linux-fr.org> |
4118 | L: lm-sensors@lm-sensors.org | 4118 | L: lm-sensors@lm-sensors.org |
4119 | S: Maintained | 4119 | S: Maintained |
4120 | F: Documentation/hwmon/lm90 | 4120 | F: Documentation/hwmon/lm90 |
4121 | F: drivers/hwmon/lm90.c | 4121 | F: drivers/hwmon/lm90.c |
4122 | 4122 | ||
4123 | LOCKDEP AND LOCKSTAT | 4123 | LOCKDEP AND LOCKSTAT |
4124 | M: Peter Zijlstra <peterz@infradead.org> | 4124 | M: Peter Zijlstra <peterz@infradead.org> |
4125 | M: Ingo Molnar <mingo@redhat.com> | 4125 | M: Ingo Molnar <mingo@redhat.com> |
4126 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git core/locking | 4126 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git core/locking |
4127 | S: Maintained | 4127 | S: Maintained |
4128 | F: Documentation/lockdep*.txt | 4128 | F: Documentation/lockdep*.txt |
4129 | F: Documentation/lockstat.txt | 4129 | F: Documentation/lockstat.txt |
4130 | F: include/linux/lockdep.h | 4130 | F: include/linux/lockdep.h |
4131 | F: kernel/lockdep* | 4131 | F: kernel/lockdep* |
4132 | 4132 | ||
4133 | LOGICAL DISK MANAGER SUPPORT (LDM, Windows 2000/XP/Vista Dynamic Disks) | 4133 | LOGICAL DISK MANAGER SUPPORT (LDM, Windows 2000/XP/Vista Dynamic Disks) |
4134 | M: "Richard Russon (FlatCap)" <ldm@flatcap.org> | 4134 | M: "Richard Russon (FlatCap)" <ldm@flatcap.org> |
4135 | L: linux-ntfs-dev@lists.sourceforge.net | 4135 | L: linux-ntfs-dev@lists.sourceforge.net |
4136 | W: http://www.linux-ntfs.org/content/view/19/37/ | 4136 | W: http://www.linux-ntfs.org/content/view/19/37/ |
4137 | S: Maintained | 4137 | S: Maintained |
4138 | F: Documentation/ldm.txt | 4138 | F: Documentation/ldm.txt |
4139 | F: block/partitions/ldm.* | 4139 | F: block/partitions/ldm.* |
4140 | 4140 | ||
4141 | LogFS | 4141 | LogFS |
4142 | M: Joern Engel <joern@logfs.org> | 4142 | M: Joern Engel <joern@logfs.org> |
4143 | M: Prasad Joshi <prasadjoshi.linux@gmail.com> | 4143 | M: Prasad Joshi <prasadjoshi.linux@gmail.com> |
4144 | L: logfs@logfs.org | 4144 | L: logfs@logfs.org |
4145 | W: logfs.org | 4145 | W: logfs.org |
4146 | S: Maintained | 4146 | S: Maintained |
4147 | F: fs/logfs/ | 4147 | F: fs/logfs/ |
4148 | 4148 | ||
4149 | LSILOGIC MPT FUSION DRIVERS (FC/SAS/SPI) | 4149 | LSILOGIC MPT FUSION DRIVERS (FC/SAS/SPI) |
4150 | M: Eric Moore <Eric.Moore@lsi.com> | 4150 | M: Eric Moore <Eric.Moore@lsi.com> |
4151 | M: support@lsi.com | 4151 | M: support@lsi.com |
4152 | L: DL-MPTFusionLinux@lsi.com | 4152 | L: DL-MPTFusionLinux@lsi.com |
4153 | L: linux-scsi@vger.kernel.org | 4153 | L: linux-scsi@vger.kernel.org |
4154 | W: http://www.lsilogic.com/support | 4154 | W: http://www.lsilogic.com/support |
4155 | S: Supported | 4155 | S: Supported |
4156 | F: drivers/message/fusion/ | 4156 | F: drivers/message/fusion/ |
4157 | 4157 | ||
4158 | LSILOGIC/SYMBIOS/NCR 53C8XX and 53C1010 PCI-SCSI drivers | 4158 | LSILOGIC/SYMBIOS/NCR 53C8XX and 53C1010 PCI-SCSI drivers |
4159 | M: Matthew Wilcox <matthew@wil.cx> | 4159 | M: Matthew Wilcox <matthew@wil.cx> |
4160 | L: linux-scsi@vger.kernel.org | 4160 | L: linux-scsi@vger.kernel.org |
4161 | S: Maintained | 4161 | S: Maintained |
4162 | F: drivers/scsi/sym53c8xx_2/ | 4162 | F: drivers/scsi/sym53c8xx_2/ |
4163 | 4163 | ||
4164 | LTC4261 HARDWARE MONITOR DRIVER | 4164 | LTC4261 HARDWARE MONITOR DRIVER |
4165 | M: Guenter Roeck <linux@roeck-us.net> | 4165 | M: Guenter Roeck <linux@roeck-us.net> |
4166 | L: lm-sensors@lm-sensors.org | 4166 | L: lm-sensors@lm-sensors.org |
4167 | S: Maintained | 4167 | S: Maintained |
4168 | F: Documentation/hwmon/ltc4261 | 4168 | F: Documentation/hwmon/ltc4261 |
4169 | F: drivers/hwmon/ltc4261.c | 4169 | F: drivers/hwmon/ltc4261.c |
4170 | 4170 | ||
4171 | LTP (Linux Test Project) | 4171 | LTP (Linux Test Project) |
4172 | M: Rishikesh K Rajak <risrajak@linux.vnet.ibm.com> | 4172 | M: Rishikesh K Rajak <risrajak@linux.vnet.ibm.com> |
4173 | M: Garrett Cooper <yanegomi@gmail.com> | 4173 | M: Garrett Cooper <yanegomi@gmail.com> |
4174 | M: Mike Frysinger <vapier@gentoo.org> | 4174 | M: Mike Frysinger <vapier@gentoo.org> |
4175 | M: Subrata Modak <subrata@linux.vnet.ibm.com> | 4175 | M: Subrata Modak <subrata@linux.vnet.ibm.com> |
4176 | L: ltp-list@lists.sourceforge.net (subscribers-only) | 4176 | L: ltp-list@lists.sourceforge.net (subscribers-only) |
4177 | W: http://ltp.sourceforge.net/ | 4177 | W: http://ltp.sourceforge.net/ |
4178 | T: git git://ltp.git.sourceforge.net/gitroot/ltp/ltp-dev | 4178 | T: git git://ltp.git.sourceforge.net/gitroot/ltp/ltp-dev |
4179 | S: Maintained | 4179 | S: Maintained |
4180 | 4180 | ||
4181 | M32R ARCHITECTURE | 4181 | M32R ARCHITECTURE |
4182 | M: Hirokazu Takata <takata@linux-m32r.org> | 4182 | M: Hirokazu Takata <takata@linux-m32r.org> |
4183 | L: linux-m32r@ml.linux-m32r.org (moderated for non-subscribers) | 4183 | L: linux-m32r@ml.linux-m32r.org (moderated for non-subscribers) |
4184 | L: linux-m32r-ja@ml.linux-m32r.org (in Japanese) | 4184 | L: linux-m32r-ja@ml.linux-m32r.org (in Japanese) |
4185 | W: http://www.linux-m32r.org/ | 4185 | W: http://www.linux-m32r.org/ |
4186 | S: Maintained | 4186 | S: Maintained |
4187 | F: arch/m32r/ | 4187 | F: arch/m32r/ |
4188 | 4188 | ||
4189 | M68K ARCHITECTURE | 4189 | M68K ARCHITECTURE |
4190 | M: Geert Uytterhoeven <geert@linux-m68k.org> | 4190 | M: Geert Uytterhoeven <geert@linux-m68k.org> |
4191 | L: linux-m68k@lists.linux-m68k.org | 4191 | L: linux-m68k@lists.linux-m68k.org |
4192 | W: http://www.linux-m68k.org/ | 4192 | W: http://www.linux-m68k.org/ |
4193 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/geert/linux-m68k.git | 4193 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/geert/linux-m68k.git |
4194 | S: Maintained | 4194 | S: Maintained |
4195 | F: arch/m68k/ | 4195 | F: arch/m68k/ |
4196 | F: drivers/zorro/ | 4196 | F: drivers/zorro/ |
4197 | 4197 | ||
4198 | M68K ON APPLE MACINTOSH | 4198 | M68K ON APPLE MACINTOSH |
4199 | M: Joshua Thompson <funaho@jurai.org> | 4199 | M: Joshua Thompson <funaho@jurai.org> |
4200 | W: http://www.mac.linux-m68k.org/ | 4200 | W: http://www.mac.linux-m68k.org/ |
4201 | L: linux-m68k@lists.linux-m68k.org | 4201 | L: linux-m68k@lists.linux-m68k.org |
4202 | S: Maintained | 4202 | S: Maintained |
4203 | F: arch/m68k/mac/ | 4203 | F: arch/m68k/mac/ |
4204 | 4204 | ||
4205 | M68K ON HP9000/300 | 4205 | M68K ON HP9000/300 |
4206 | M: Philip Blundell <philb@gnu.org> | 4206 | M: Philip Blundell <philb@gnu.org> |
4207 | W: http://www.tazenda.demon.co.uk/phil/linux-hp | 4207 | W: http://www.tazenda.demon.co.uk/phil/linux-hp |
4208 | S: Maintained | 4208 | S: Maintained |
4209 | F: arch/m68k/hp300/ | 4209 | F: arch/m68k/hp300/ |
4210 | 4210 | ||
4211 | MAC80211 | 4211 | MAC80211 |
4212 | M: Johannes Berg <johannes@sipsolutions.net> | 4212 | M: Johannes Berg <johannes@sipsolutions.net> |
4213 | L: linux-wireless@vger.kernel.org | 4213 | L: linux-wireless@vger.kernel.org |
4214 | W: http://linuxwireless.org/ | 4214 | W: http://linuxwireless.org/ |
4215 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6.git | 4215 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6.git |
4216 | S: Maintained | 4216 | S: Maintained |
4217 | F: Documentation/networking/mac80211-injection.txt | 4217 | F: Documentation/networking/mac80211-injection.txt |
4218 | F: include/net/mac80211.h | 4218 | F: include/net/mac80211.h |
4219 | F: net/mac80211/ | 4219 | F: net/mac80211/ |
4220 | 4220 | ||
4221 | MAC80211 PID RATE CONTROL | 4221 | MAC80211 PID RATE CONTROL |
4222 | M: Stefano Brivio <stefano.brivio@polimi.it> | 4222 | M: Stefano Brivio <stefano.brivio@polimi.it> |
4223 | M: Mattias Nissler <mattias.nissler@gmx.de> | 4223 | M: Mattias Nissler <mattias.nissler@gmx.de> |
4224 | L: linux-wireless@vger.kernel.org | 4224 | L: linux-wireless@vger.kernel.org |
4225 | W: http://linuxwireless.org/en/developers/Documentation/mac80211/RateControl/PID | 4225 | W: http://linuxwireless.org/en/developers/Documentation/mac80211/RateControl/PID |
4226 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6.git | 4226 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6.git |
4227 | S: Maintained | 4227 | S: Maintained |
4228 | F: net/mac80211/rc80211_pid* | 4228 | F: net/mac80211/rc80211_pid* |
4229 | 4229 | ||
4230 | MACVLAN DRIVER | 4230 | MACVLAN DRIVER |
4231 | M: Patrick McHardy <kaber@trash.net> | 4231 | M: Patrick McHardy <kaber@trash.net> |
4232 | L: netdev@vger.kernel.org | 4232 | L: netdev@vger.kernel.org |
4233 | S: Maintained | 4233 | S: Maintained |
4234 | F: drivers/net/macvlan.c | 4234 | F: drivers/net/macvlan.c |
4235 | F: include/linux/if_macvlan.h | 4235 | F: include/linux/if_macvlan.h |
4236 | 4236 | ||
4237 | MAN-PAGES: MANUAL PAGES FOR LINUX -- Sections 2, 3, 4, 5, and 7 | 4237 | MAN-PAGES: MANUAL PAGES FOR LINUX -- Sections 2, 3, 4, 5, and 7 |
4238 | M: Michael Kerrisk <mtk.manpages@gmail.com> | 4238 | M: Michael Kerrisk <mtk.manpages@gmail.com> |
4239 | W: http://www.kernel.org/doc/man-pages | 4239 | W: http://www.kernel.org/doc/man-pages |
4240 | L: linux-man@vger.kernel.org | 4240 | L: linux-man@vger.kernel.org |
4241 | S: Maintained | 4241 | S: Maintained |
4242 | 4242 | ||
4243 | MARVELL LIBERTAS WIRELESS DRIVER | 4243 | MARVELL LIBERTAS WIRELESS DRIVER |
4244 | M: Dan Williams <dcbw@redhat.com> | 4244 | M: Dan Williams <dcbw@redhat.com> |
4245 | L: libertas-dev@lists.infradead.org | 4245 | L: libertas-dev@lists.infradead.org |
4246 | S: Maintained | 4246 | S: Maintained |
4247 | F: drivers/net/wireless/libertas/ | 4247 | F: drivers/net/wireless/libertas/ |
4248 | 4248 | ||
4249 | MARVELL MV643XX ETHERNET DRIVER | 4249 | MARVELL MV643XX ETHERNET DRIVER |
4250 | M: Lennert Buytenhek <buytenh@wantstofly.org> | 4250 | M: Lennert Buytenhek <buytenh@wantstofly.org> |
4251 | L: netdev@vger.kernel.org | 4251 | L: netdev@vger.kernel.org |
4252 | S: Maintained | 4252 | S: Maintained |
4253 | F: drivers/net/ethernet/marvell/mv643xx_eth.* | 4253 | F: drivers/net/ethernet/marvell/mv643xx_eth.* |
4254 | F: include/linux/mv643xx.h | 4254 | F: include/linux/mv643xx.h |
4255 | 4255 | ||
4256 | MARVELL MWIFIEX WIRELESS DRIVER | 4256 | MARVELL MWIFIEX WIRELESS DRIVER |
4257 | M: Bing Zhao <bzhao@marvell.com> | 4257 | M: Bing Zhao <bzhao@marvell.com> |
4258 | L: linux-wireless@vger.kernel.org | 4258 | L: linux-wireless@vger.kernel.org |
4259 | S: Maintained | 4259 | S: Maintained |
4260 | F: drivers/net/wireless/mwifiex/ | 4260 | F: drivers/net/wireless/mwifiex/ |
4261 | 4261 | ||
4262 | MARVELL MWL8K WIRELESS DRIVER | 4262 | MARVELL MWL8K WIRELESS DRIVER |
4263 | M: Lennert Buytenhek <buytenh@wantstofly.org> | 4263 | M: Lennert Buytenhek <buytenh@wantstofly.org> |
4264 | L: linux-wireless@vger.kernel.org | 4264 | L: linux-wireless@vger.kernel.org |
4265 | S: Odd Fixes | 4265 | S: Odd Fixes |
4266 | F: drivers/net/wireless/mwl8k.c | 4266 | F: drivers/net/wireless/mwl8k.c |
4267 | 4267 | ||
4268 | MARVELL SOC MMC/SD/SDIO CONTROLLER DRIVER | 4268 | MARVELL SOC MMC/SD/SDIO CONTROLLER DRIVER |
4269 | M: Nicolas Pitre <nico@fluxnic.net> | 4269 | M: Nicolas Pitre <nico@fluxnic.net> |
4270 | S: Odd Fixes | 4270 | S: Odd Fixes |
4271 | F: drivers/mmc/host/mvsdio.* | 4271 | F: drivers/mmc/host/mvsdio.* |
4272 | 4272 | ||
4273 | MARVELL YUKON / SYSKONNECT DRIVER | 4273 | MARVELL YUKON / SYSKONNECT DRIVER |
4274 | M: Mirko Lindner <mlindner@syskonnect.de> | 4274 | M: Mirko Lindner <mlindner@syskonnect.de> |
4275 | M: Ralph Roesler <rroesler@syskonnect.de> | 4275 | M: Ralph Roesler <rroesler@syskonnect.de> |
4276 | W: http://www.syskonnect.com | 4276 | W: http://www.syskonnect.com |
4277 | S: Supported | 4277 | S: Supported |
4278 | 4278 | ||
4279 | MATROX FRAMEBUFFER DRIVER | 4279 | MATROX FRAMEBUFFER DRIVER |
4280 | L: linux-fbdev@vger.kernel.org | 4280 | L: linux-fbdev@vger.kernel.org |
4281 | S: Orphan | 4281 | S: Orphan |
4282 | F: drivers/video/matrox/matroxfb_* | 4282 | F: drivers/video/matrox/matroxfb_* |
4283 | F: include/linux/matroxfb.h | 4283 | F: include/linux/matroxfb.h |
4284 | 4284 | ||
4285 | MAX6650 HARDWARE MONITOR AND FAN CONTROLLER DRIVER | 4285 | MAX6650 HARDWARE MONITOR AND FAN CONTROLLER DRIVER |
4286 | M: "Hans J. Koch" <hjk@hansjkoch.de> | 4286 | M: "Hans J. Koch" <hjk@hansjkoch.de> |
4287 | L: lm-sensors@lm-sensors.org | 4287 | L: lm-sensors@lm-sensors.org |
4288 | S: Maintained | 4288 | S: Maintained |
4289 | F: Documentation/hwmon/max6650 | 4289 | F: Documentation/hwmon/max6650 |
4290 | F: drivers/hwmon/max6650.c | 4290 | F: drivers/hwmon/max6650.c |
4291 | 4291 | ||
4292 | MEDIA INPUT INFRASTRUCTURE (V4L/DVB) | 4292 | MEDIA INPUT INFRASTRUCTURE (V4L/DVB) |
4293 | M: Mauro Carvalho Chehab <mchehab@infradead.org> | 4293 | M: Mauro Carvalho Chehab <mchehab@infradead.org> |
4294 | P: LinuxTV.org Project | 4294 | P: LinuxTV.org Project |
4295 | L: linux-media@vger.kernel.org | 4295 | L: linux-media@vger.kernel.org |
4296 | W: http://linuxtv.org | 4296 | W: http://linuxtv.org |
4297 | Q: http://patchwork.kernel.org/project/linux-media/list/ | 4297 | Q: http://patchwork.kernel.org/project/linux-media/list/ |
4298 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git | 4298 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git |
4299 | S: Maintained | 4299 | S: Maintained |
4300 | F: Documentation/dvb/ | 4300 | F: Documentation/dvb/ |
4301 | F: Documentation/video4linux/ | 4301 | F: Documentation/video4linux/ |
4302 | F: Documentation/DocBook/media/ | 4302 | F: Documentation/DocBook/media/ |
4303 | F: drivers/media/ | 4303 | F: drivers/media/ |
4304 | F: drivers/staging/media/ | 4304 | F: drivers/staging/media/ |
4305 | F: include/media/ | 4305 | F: include/media/ |
4306 | F: include/linux/dvb/ | 4306 | F: include/linux/dvb/ |
4307 | F: include/linux/videodev*.h | 4307 | F: include/linux/videodev*.h |
4308 | 4308 | ||
4309 | MEGARAID SCSI DRIVERS | 4309 | MEGARAID SCSI DRIVERS |
4310 | M: Neela Syam Kolli <megaraidlinux@lsi.com> | 4310 | M: Neela Syam Kolli <megaraidlinux@lsi.com> |
4311 | L: linux-scsi@vger.kernel.org | 4311 | L: linux-scsi@vger.kernel.org |
4312 | W: http://megaraid.lsilogic.com | 4312 | W: http://megaraid.lsilogic.com |
4313 | S: Maintained | 4313 | S: Maintained |
4314 | F: Documentation/scsi/megaraid.txt | 4314 | F: Documentation/scsi/megaraid.txt |
4315 | F: drivers/scsi/megaraid.* | 4315 | F: drivers/scsi/megaraid.* |
4316 | F: drivers/scsi/megaraid/ | 4316 | F: drivers/scsi/megaraid/ |
4317 | 4317 | ||
4318 | MEMORY MANAGEMENT | 4318 | MEMORY MANAGEMENT |
4319 | L: linux-mm@kvack.org | 4319 | L: linux-mm@kvack.org |
4320 | W: http://www.linux-mm.org | 4320 | W: http://www.linux-mm.org |
4321 | S: Maintained | 4321 | S: Maintained |
4322 | F: include/linux/mm.h | 4322 | F: include/linux/mm.h |
4323 | F: mm/ | 4323 | F: mm/ |
4324 | 4324 | ||
4325 | MEMORY RESOURCE CONTROLLER | 4325 | MEMORY RESOURCE CONTROLLER |
4326 | M: Johannes Weiner <hannes@cmpxchg.org> | 4326 | M: Johannes Weiner <hannes@cmpxchg.org> |
4327 | M: Michal Hocko <mhocko@suse.cz> | 4327 | M: Michal Hocko <mhocko@suse.cz> |
4328 | M: Balbir Singh <bsingharora@gmail.com> | 4328 | M: Balbir Singh <bsingharora@gmail.com> |
4329 | M: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> | 4329 | M: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> |
4330 | L: cgroups@vger.kernel.org | 4330 | L: cgroups@vger.kernel.org |
4331 | L: linux-mm@kvack.org | 4331 | L: linux-mm@kvack.org |
4332 | S: Maintained | 4332 | S: Maintained |
4333 | F: mm/memcontrol.c | 4333 | F: mm/memcontrol.c |
4334 | F: mm/page_cgroup.c | 4334 | F: mm/page_cgroup.c |
4335 | 4335 | ||
4336 | MEMORY TECHNOLOGY DEVICES (MTD) | 4336 | MEMORY TECHNOLOGY DEVICES (MTD) |
4337 | M: David Woodhouse <dwmw2@infradead.org> | 4337 | M: David Woodhouse <dwmw2@infradead.org> |
4338 | L: linux-mtd@lists.infradead.org | 4338 | L: linux-mtd@lists.infradead.org |
4339 | W: http://www.linux-mtd.infradead.org/ | 4339 | W: http://www.linux-mtd.infradead.org/ |
4340 | Q: http://patchwork.ozlabs.org/project/linux-mtd/list/ | 4340 | Q: http://patchwork.ozlabs.org/project/linux-mtd/list/ |
4341 | T: git git://git.infradead.org/mtd-2.6.git | 4341 | T: git git://git.infradead.org/mtd-2.6.git |
4342 | S: Maintained | 4342 | S: Maintained |
4343 | F: drivers/mtd/ | 4343 | F: drivers/mtd/ |
4344 | F: include/linux/mtd/ | 4344 | F: include/linux/mtd/ |
4345 | F: include/mtd/ | 4345 | F: include/mtd/ |
4346 | 4346 | ||
4347 | MICROBLAZE ARCHITECTURE | 4347 | MICROBLAZE ARCHITECTURE |
4348 | M: Michal Simek <monstr@monstr.eu> | 4348 | M: Michal Simek <monstr@monstr.eu> |
4349 | L: microblaze-uclinux@itee.uq.edu.au (moderated for non-subscribers) | 4349 | L: microblaze-uclinux@itee.uq.edu.au (moderated for non-subscribers) |
4350 | W: http://www.monstr.eu/fdt/ | 4350 | W: http://www.monstr.eu/fdt/ |
4351 | T: git git://git.monstr.eu/linux-2.6-microblaze.git | 4351 | T: git git://git.monstr.eu/linux-2.6-microblaze.git |
4352 | S: Supported | 4352 | S: Supported |
4353 | F: arch/microblaze/ | 4353 | F: arch/microblaze/ |
4354 | 4354 | ||
4355 | MICROTEK X6 SCANNER | 4355 | MICROTEK X6 SCANNER |
4356 | M: Oliver Neukum <oliver@neukum.name> | 4356 | M: Oliver Neukum <oliver@neukum.name> |
4357 | S: Maintained | 4357 | S: Maintained |
4358 | F: drivers/usb/image/microtek.* | 4358 | F: drivers/usb/image/microtek.* |
4359 | 4359 | ||
4360 | MIPS | 4360 | MIPS |
4361 | M: Ralf Baechle <ralf@linux-mips.org> | 4361 | M: Ralf Baechle <ralf@linux-mips.org> |
4362 | L: linux-mips@linux-mips.org | 4362 | L: linux-mips@linux-mips.org |
4363 | W: http://www.linux-mips.org/ | 4363 | W: http://www.linux-mips.org/ |
4364 | T: git git://git.linux-mips.org/pub/scm/ralf/linux.git | 4364 | T: git git://git.linux-mips.org/pub/scm/ralf/linux.git |
4365 | Q: http://patchwork.linux-mips.org/project/linux-mips/list/ | 4365 | Q: http://patchwork.linux-mips.org/project/linux-mips/list/ |
4366 | S: Supported | 4366 | S: Supported |
4367 | F: Documentation/mips/ | 4367 | F: Documentation/mips/ |
4368 | F: arch/mips/ | 4368 | F: arch/mips/ |
4369 | 4369 | ||
4370 | MISCELLANEOUS MCA-SUPPORT | 4370 | MISCELLANEOUS MCA-SUPPORT |
4371 | M: James Bottomley <James.Bottomley@HansenPartnership.com> | 4371 | M: James Bottomley <James.Bottomley@HansenPartnership.com> |
4372 | S: Maintained | 4372 | S: Maintained |
4373 | F: Documentation/ia64/mca.txt | 4373 | F: Documentation/ia64/mca.txt |
4374 | F: Documentation/mca.txt | 4374 | F: Documentation/mca.txt |
4375 | F: drivers/mca/ | 4375 | F: drivers/mca/ |
4376 | F: include/linux/mca* | 4376 | F: include/linux/mca* |
4377 | 4377 | ||
4378 | MODULE SUPPORT | 4378 | MODULE SUPPORT |
4379 | M: Rusty Russell <rusty@rustcorp.com.au> | 4379 | M: Rusty Russell <rusty@rustcorp.com.au> |
4380 | S: Maintained | 4380 | S: Maintained |
4381 | F: include/linux/module.h | 4381 | F: include/linux/module.h |
4382 | F: kernel/module.c | 4382 | F: kernel/module.c |
4383 | 4383 | ||
4384 | MOTION EYE VAIO PICTUREBOOK CAMERA DRIVER | 4384 | MOTION EYE VAIO PICTUREBOOK CAMERA DRIVER |
4385 | W: http://popies.net/meye/ | 4385 | W: http://popies.net/meye/ |
4386 | S: Orphan | 4386 | S: Orphan |
4387 | F: Documentation/video4linux/meye.txt | 4387 | F: Documentation/video4linux/meye.txt |
4388 | F: drivers/media/video/meye.* | 4388 | F: drivers/media/video/meye.* |
4389 | F: include/linux/meye.h | 4389 | F: include/linux/meye.h |
4390 | 4390 | ||
4391 | MOTOROLA IMX MMC/SD HOST CONTROLLER INTERFACE DRIVER | 4391 | MOTOROLA IMX MMC/SD HOST CONTROLLER INTERFACE DRIVER |
4392 | M: Pavel Pisa <ppisa@pikron.com> | 4392 | M: Pavel Pisa <ppisa@pikron.com> |
4393 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 4393 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
4394 | S: Maintained | 4394 | S: Maintained |
4395 | F: drivers/mmc/host/imxmmc.* | 4395 | F: drivers/mmc/host/imxmmc.* |
4396 | 4396 | ||
4397 | MOUSE AND MISC DEVICES [GENERAL] | 4397 | MOUSE AND MISC DEVICES [GENERAL] |
4398 | M: Alessandro Rubini <rubini@ipvvis.unipv.it> | 4398 | M: Alessandro Rubini <rubini@ipvvis.unipv.it> |
4399 | S: Maintained | 4399 | S: Maintained |
4400 | F: drivers/input/mouse/ | 4400 | F: drivers/input/mouse/ |
4401 | F: include/linux/gpio_mouse.h | 4401 | F: include/linux/gpio_mouse.h |
4402 | 4402 | ||
4403 | MOXA SMARTIO/INDUSTIO/INTELLIO SERIAL CARD | 4403 | MOXA SMARTIO/INDUSTIO/INTELLIO SERIAL CARD |
4404 | M: Jiri Slaby <jirislaby@gmail.com> | 4404 | M: Jiri Slaby <jirislaby@gmail.com> |
4405 | S: Maintained | 4405 | S: Maintained |
4406 | F: Documentation/serial/moxa-smartio | 4406 | F: Documentation/serial/moxa-smartio |
4407 | F: drivers/tty/mxser.* | 4407 | F: drivers/tty/mxser.* |
4408 | 4408 | ||
4409 | MSI LAPTOP SUPPORT | 4409 | MSI LAPTOP SUPPORT |
4410 | M: "Lee, Chun-Yi" <jlee@novell.com> | 4410 | M: "Lee, Chun-Yi" <jlee@novell.com> |
4411 | L: platform-driver-x86@vger.kernel.org | 4411 | L: platform-driver-x86@vger.kernel.org |
4412 | S: Maintained | 4412 | S: Maintained |
4413 | F: drivers/platform/x86/msi-laptop.c | 4413 | F: drivers/platform/x86/msi-laptop.c |
4414 | 4414 | ||
4415 | MSI WMI SUPPORT | 4415 | MSI WMI SUPPORT |
4416 | M: Anisse Astier <anisse@astier.eu> | 4416 | M: Anisse Astier <anisse@astier.eu> |
4417 | L: platform-driver-x86@vger.kernel.org | 4417 | L: platform-driver-x86@vger.kernel.org |
4418 | S: Supported | 4418 | S: Supported |
4419 | F: drivers/platform/x86/msi-wmi.c | 4419 | F: drivers/platform/x86/msi-wmi.c |
4420 | 4420 | ||
4421 | MULTIFUNCTION DEVICES (MFD) | 4421 | MULTIFUNCTION DEVICES (MFD) |
4422 | M: Samuel Ortiz <sameo@linux.intel.com> | 4422 | M: Samuel Ortiz <sameo@linux.intel.com> |
4423 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/sameo/mfd-2.6.git | 4423 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/sameo/mfd-2.6.git |
4424 | S: Supported | 4424 | S: Supported |
4425 | F: drivers/mfd/ | 4425 | F: drivers/mfd/ |
4426 | 4426 | ||
4427 | MULTIMEDIA CARD (MMC), SECURE DIGITAL (SD) AND SDIO SUBSYSTEM | 4427 | MULTIMEDIA CARD (MMC), SECURE DIGITAL (SD) AND SDIO SUBSYSTEM |
4428 | M: Chris Ball <cjb@laptop.org> | 4428 | M: Chris Ball <cjb@laptop.org> |
4429 | L: linux-mmc@vger.kernel.org | 4429 | L: linux-mmc@vger.kernel.org |
4430 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/cjb/mmc.git | 4430 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/cjb/mmc.git |
4431 | S: Maintained | 4431 | S: Maintained |
4432 | F: drivers/mmc/ | 4432 | F: drivers/mmc/ |
4433 | F: include/linux/mmc/ | 4433 | F: include/linux/mmc/ |
4434 | 4434 | ||
4435 | MULTIMEDIA CARD (MMC) ETC. OVER SPI | 4435 | MULTIMEDIA CARD (MMC) ETC. OVER SPI |
4436 | S: Orphan | 4436 | S: Orphan |
4437 | F: drivers/mmc/host/mmc_spi.c | 4437 | F: drivers/mmc/host/mmc_spi.c |
4438 | F: include/linux/spi/mmc_spi.h | 4438 | F: include/linux/spi/mmc_spi.h |
4439 | 4439 | ||
4440 | MULTISOUND SOUND DRIVER | 4440 | MULTISOUND SOUND DRIVER |
4441 | M: Andrew Veliath <andrewtv@usa.net> | 4441 | M: Andrew Veliath <andrewtv@usa.net> |
4442 | S: Maintained | 4442 | S: Maintained |
4443 | F: Documentation/sound/oss/MultiSound | 4443 | F: Documentation/sound/oss/MultiSound |
4444 | F: sound/oss/msnd* | 4444 | F: sound/oss/msnd* |
4445 | 4445 | ||
4446 | MULTITECH MULTIPORT CARD (ISICOM) | 4446 | MULTITECH MULTIPORT CARD (ISICOM) |
4447 | S: Orphan | 4447 | S: Orphan |
4448 | F: drivers/tty/isicom.c | 4448 | F: drivers/tty/isicom.c |
4449 | F: include/linux/isicom.h | 4449 | F: include/linux/isicom.h |
4450 | 4450 | ||
4451 | MUSB MULTIPOINT HIGH SPEED DUAL-ROLE CONTROLLER | 4451 | MUSB MULTIPOINT HIGH SPEED DUAL-ROLE CONTROLLER |
4452 | M: Felipe Balbi <balbi@ti.com> | 4452 | M: Felipe Balbi <balbi@ti.com> |
4453 | L: linux-usb@vger.kernel.org | 4453 | L: linux-usb@vger.kernel.org |
4454 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git | 4454 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git |
4455 | S: Maintained | 4455 | S: Maintained |
4456 | F: drivers/usb/musb/ | 4456 | F: drivers/usb/musb/ |
4457 | 4457 | ||
4458 | MYRICOM MYRI-10G 10GbE DRIVER (MYRI10GE) | 4458 | MYRICOM MYRI-10G 10GbE DRIVER (MYRI10GE) |
4459 | M: Jon Mason <mason@myri.com> | 4459 | M: Jon Mason <mason@myri.com> |
4460 | M: Andrew Gallatin <gallatin@myri.com> | 4460 | M: Andrew Gallatin <gallatin@myri.com> |
4461 | L: netdev@vger.kernel.org | 4461 | L: netdev@vger.kernel.org |
4462 | W: http://www.myri.com/scs/download-Myri10GE.html | 4462 | W: http://www.myri.com/scs/download-Myri10GE.html |
4463 | S: Supported | 4463 | S: Supported |
4464 | F: drivers/net/ethernet/myricom/myri10ge/ | 4464 | F: drivers/net/ethernet/myricom/myri10ge/ |
4465 | 4465 | ||
4466 | NATSEMI ETHERNET DRIVER (DP8381x) | 4466 | NATSEMI ETHERNET DRIVER (DP8381x) |
4467 | M: Tim Hockin <thockin@hockin.org> | 4467 | M: Tim Hockin <thockin@hockin.org> |
4468 | S: Maintained | 4468 | S: Maintained |
4469 | F: drivers/net/ethernet/natsemi/natsemi.c | 4469 | F: drivers/net/ethernet/natsemi/natsemi.c |
4470 | 4470 | ||
4471 | NATIVE INSTRUMENTS USB SOUND INTERFACE DRIVER | 4471 | NATIVE INSTRUMENTS USB SOUND INTERFACE DRIVER |
4472 | M: Daniel Mack <zonque@gmail.com> | 4472 | M: Daniel Mack <zonque@gmail.com> |
4473 | S: Maintained | 4473 | S: Maintained |
4474 | L: alsa-devel@alsa-project.org | 4474 | L: alsa-devel@alsa-project.org |
4475 | W: http://www.native-instruments.com | 4475 | W: http://www.native-instruments.com |
4476 | F: sound/usb/caiaq/ | 4476 | F: sound/usb/caiaq/ |
4477 | 4477 | ||
4478 | NCP FILESYSTEM | 4478 | NCP FILESYSTEM |
4479 | M: Petr Vandrovec <petr@vandrovec.name> | 4479 | M: Petr Vandrovec <petr@vandrovec.name> |
4480 | S: Odd Fixes | 4480 | S: Odd Fixes |
4481 | F: fs/ncpfs/ | 4481 | F: fs/ncpfs/ |
4482 | 4482 | ||
4483 | NCR DUAL 700 SCSI DRIVER (MICROCHANNEL) | 4483 | NCR DUAL 700 SCSI DRIVER (MICROCHANNEL) |
4484 | M: "James E.J. Bottomley" <James.Bottomley@HansenPartnership.com> | 4484 | M: "James E.J. Bottomley" <James.Bottomley@HansenPartnership.com> |
4485 | L: linux-scsi@vger.kernel.org | 4485 | L: linux-scsi@vger.kernel.org |
4486 | S: Maintained | 4486 | S: Maintained |
4487 | F: drivers/scsi/NCR_D700.* | 4487 | F: drivers/scsi/NCR_D700.* |
4488 | 4488 | ||
4489 | NETEFFECT IWARP RNIC DRIVER (IW_NES) | 4489 | NETEFFECT IWARP RNIC DRIVER (IW_NES) |
4490 | M: Faisal Latif <faisal.latif@intel.com> | 4490 | M: Faisal Latif <faisal.latif@intel.com> |
4491 | L: linux-rdma@vger.kernel.org | 4491 | L: linux-rdma@vger.kernel.org |
4492 | W: http://www.intel.com/Products/Server/Adapters/Server-Cluster/Server-Cluster-overview.htm | 4492 | W: http://www.intel.com/Products/Server/Adapters/Server-Cluster/Server-Cluster-overview.htm |
4493 | S: Supported | 4493 | S: Supported |
4494 | F: drivers/infiniband/hw/nes/ | 4494 | F: drivers/infiniband/hw/nes/ |
4495 | 4495 | ||
4496 | NETEM NETWORK EMULATOR | 4496 | NETEM NETWORK EMULATOR |
4497 | M: Stephen Hemminger <shemminger@vyatta.com> | 4497 | M: Stephen Hemminger <shemminger@vyatta.com> |
4498 | L: netem@lists.linux-foundation.org | 4498 | L: netem@lists.linux-foundation.org |
4499 | S: Maintained | 4499 | S: Maintained |
4500 | F: net/sched/sch_netem.c | 4500 | F: net/sched/sch_netem.c |
4501 | 4501 | ||
4502 | NETERION 10GbE DRIVERS (s2io/vxge) | 4502 | NETERION 10GbE DRIVERS (s2io/vxge) |
4503 | M: Jon Mason <jdmason@kudzu.us> | 4503 | M: Jon Mason <jdmason@kudzu.us> |
4504 | L: netdev@vger.kernel.org | 4504 | L: netdev@vger.kernel.org |
4505 | W: http://trac.neterion.com/cgi-bin/trac.cgi/wiki/Linux?Anonymous | 4505 | W: http://trac.neterion.com/cgi-bin/trac.cgi/wiki/Linux?Anonymous |
4506 | W: http://trac.neterion.com/cgi-bin/trac.cgi/wiki/X3100Linux?Anonymous | 4506 | W: http://trac.neterion.com/cgi-bin/trac.cgi/wiki/X3100Linux?Anonymous |
4507 | S: Supported | 4507 | S: Supported |
4508 | F: Documentation/networking/s2io.txt | 4508 | F: Documentation/networking/s2io.txt |
4509 | F: Documentation/networking/vxge.txt | 4509 | F: Documentation/networking/vxge.txt |
4510 | F: drivers/net/ethernet/neterion/ | 4510 | F: drivers/net/ethernet/neterion/ |
4511 | 4511 | ||
4512 | NETFILTER/IPTABLES/IPCHAINS | 4512 | NETFILTER/IPTABLES/IPCHAINS |
4513 | P: Harald Welte | 4513 | P: Harald Welte |
4514 | P: Jozsef Kadlecsik | 4514 | P: Jozsef Kadlecsik |
4515 | M: Pablo Neira Ayuso <pablo@netfilter.org> | 4515 | M: Pablo Neira Ayuso <pablo@netfilter.org> |
4516 | M: Patrick McHardy <kaber@trash.net> | 4516 | M: Patrick McHardy <kaber@trash.net> |
4517 | L: netfilter-devel@vger.kernel.org | 4517 | L: netfilter-devel@vger.kernel.org |
4518 | L: netfilter@vger.kernel.org | 4518 | L: netfilter@vger.kernel.org |
4519 | L: coreteam@netfilter.org | 4519 | L: coreteam@netfilter.org |
4520 | W: http://www.netfilter.org/ | 4520 | W: http://www.netfilter.org/ |
4521 | W: http://www.iptables.org/ | 4521 | W: http://www.iptables.org/ |
4522 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/netfilter/nf-2.6.git | 4522 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/netfilter/nf-2.6.git |
4523 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/netfilter/nf-next-2.6.git | 4523 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/netfilter/nf-next-2.6.git |
4524 | S: Supported | 4524 | S: Supported |
4525 | F: include/linux/netfilter* | 4525 | F: include/linux/netfilter* |
4526 | F: include/linux/netfilter/ | 4526 | F: include/linux/netfilter/ |
4527 | F: include/net/netfilter/ | 4527 | F: include/net/netfilter/ |
4528 | F: net/*/netfilter.c | 4528 | F: net/*/netfilter.c |
4529 | F: net/*/netfilter/ | 4529 | F: net/*/netfilter/ |
4530 | F: net/netfilter/ | 4530 | F: net/netfilter/ |
4531 | 4531 | ||
4532 | NETLABEL | 4532 | NETLABEL |
4533 | M: Paul Moore <paul@paul-moore.com> | 4533 | M: Paul Moore <paul@paul-moore.com> |
4534 | W: http://netlabel.sf.net | 4534 | W: http://netlabel.sf.net |
4535 | L: netdev@vger.kernel.org | 4535 | L: netdev@vger.kernel.org |
4536 | S: Maintained | 4536 | S: Maintained |
4537 | F: Documentation/netlabel/ | 4537 | F: Documentation/netlabel/ |
4538 | F: include/net/netlabel.h | 4538 | F: include/net/netlabel.h |
4539 | F: net/netlabel/ | 4539 | F: net/netlabel/ |
4540 | 4540 | ||
4541 | NETROM NETWORK LAYER | 4541 | NETROM NETWORK LAYER |
4542 | M: Ralf Baechle <ralf@linux-mips.org> | 4542 | M: Ralf Baechle <ralf@linux-mips.org> |
4543 | L: linux-hams@vger.kernel.org | 4543 | L: linux-hams@vger.kernel.org |
4544 | W: http://www.linux-ax25.org/ | 4544 | W: http://www.linux-ax25.org/ |
4545 | S: Maintained | 4545 | S: Maintained |
4546 | F: include/linux/netrom.h | 4546 | F: include/linux/netrom.h |
4547 | F: include/net/netrom.h | 4547 | F: include/net/netrom.h |
4548 | F: net/netrom/ | 4548 | F: net/netrom/ |
4549 | 4549 | ||
4550 | NETWORK BLOCK DEVICE (NBD) | 4550 | NETWORK BLOCK DEVICE (NBD) |
4551 | M: Paul Clements <Paul.Clements@steeleye.com> | 4551 | M: Paul Clements <Paul.Clements@steeleye.com> |
4552 | S: Maintained | 4552 | S: Maintained |
4553 | F: Documentation/blockdev/nbd.txt | 4553 | F: Documentation/blockdev/nbd.txt |
4554 | F: drivers/block/nbd.c | 4554 | F: drivers/block/nbd.c |
4555 | F: include/linux/nbd.h | 4555 | F: include/linux/nbd.h |
4556 | 4556 | ||
4557 | NETWORK DROP MONITOR | 4557 | NETWORK DROP MONITOR |
4558 | M: Neil Horman <nhorman@tuxdriver.com> | 4558 | M: Neil Horman <nhorman@tuxdriver.com> |
4559 | L: netdev@vger.kernel.org | 4559 | L: netdev@vger.kernel.org |
4560 | S: Maintained | 4560 | S: Maintained |
4561 | W: https://fedorahosted.org/dropwatch/ | 4561 | W: https://fedorahosted.org/dropwatch/ |
4562 | F: net/core/drop_monitor.c | 4562 | F: net/core/drop_monitor.c |
4563 | 4563 | ||
4564 | NETWORKING [GENERAL] | 4564 | NETWORKING [GENERAL] |
4565 | M: "David S. Miller" <davem@davemloft.net> | 4565 | M: "David S. Miller" <davem@davemloft.net> |
4566 | L: netdev@vger.kernel.org | 4566 | L: netdev@vger.kernel.org |
4567 | W: http://www.linuxfoundation.org/en/Net | 4567 | W: http://www.linuxfoundation.org/en/Net |
4568 | W: http://patchwork.ozlabs.org/project/netdev/list/ | 4568 | W: http://patchwork.ozlabs.org/project/netdev/list/ |
4569 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/net.git | 4569 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/net.git |
4570 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git | 4570 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git |
4571 | S: Maintained | 4571 | S: Maintained |
4572 | F: net/ | 4572 | F: net/ |
4573 | F: include/net/ | 4573 | F: include/net/ |
4574 | F: include/linux/in.h | 4574 | F: include/linux/in.h |
4575 | F: include/linux/net.h | 4575 | F: include/linux/net.h |
4576 | F: include/linux/netdevice.h | 4576 | F: include/linux/netdevice.h |
4577 | 4577 | ||
4578 | NETWORKING [IPv4/IPv6] | 4578 | NETWORKING [IPv4/IPv6] |
4579 | M: "David S. Miller" <davem@davemloft.net> | 4579 | M: "David S. Miller" <davem@davemloft.net> |
4580 | M: Alexey Kuznetsov <kuznet@ms2.inr.ac.ru> | 4580 | M: Alexey Kuznetsov <kuznet@ms2.inr.ac.ru> |
4581 | M: James Morris <jmorris@namei.org> | 4581 | M: James Morris <jmorris@namei.org> |
4582 | M: Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org> | 4582 | M: Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org> |
4583 | M: Patrick McHardy <kaber@trash.net> | 4583 | M: Patrick McHardy <kaber@trash.net> |
4584 | L: netdev@vger.kernel.org | 4584 | L: netdev@vger.kernel.org |
4585 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6.git | 4585 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6.git |
4586 | S: Maintained | 4586 | S: Maintained |
4587 | F: net/ipv4/ | 4587 | F: net/ipv4/ |
4588 | F: net/ipv6/ | 4588 | F: net/ipv6/ |
4589 | F: include/net/ip* | 4589 | F: include/net/ip* |
4590 | F: arch/x86/net/* | 4590 | F: arch/x86/net/* |
4591 | 4591 | ||
4592 | NETWORKING [LABELED] (NetLabel, CIPSO, Labeled IPsec, SECMARK) | 4592 | NETWORKING [LABELED] (NetLabel, CIPSO, Labeled IPsec, SECMARK) |
4593 | M: Paul Moore <paul@paul-moore.com> | 4593 | M: Paul Moore <paul@paul-moore.com> |
4594 | L: netdev@vger.kernel.org | 4594 | L: netdev@vger.kernel.org |
4595 | S: Maintained | 4595 | S: Maintained |
4596 | 4596 | ||
4597 | NETWORKING [WIRELESS] | 4597 | NETWORKING [WIRELESS] |
4598 | M: "John W. Linville" <linville@tuxdriver.com> | 4598 | M: "John W. Linville" <linville@tuxdriver.com> |
4599 | L: linux-wireless@vger.kernel.org | 4599 | L: linux-wireless@vger.kernel.org |
4600 | Q: http://patchwork.kernel.org/project/linux-wireless/list/ | 4600 | Q: http://patchwork.kernel.org/project/linux-wireless/list/ |
4601 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6.git | 4601 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6.git |
4602 | S: Maintained | 4602 | S: Maintained |
4603 | F: net/mac80211/ | 4603 | F: net/mac80211/ |
4604 | F: net/rfkill/ | 4604 | F: net/rfkill/ |
4605 | F: net/wireless/ | 4605 | F: net/wireless/ |
4606 | F: include/net/ieee80211* | 4606 | F: include/net/ieee80211* |
4607 | F: include/linux/wireless.h | 4607 | F: include/linux/wireless.h |
4608 | F: include/net/iw_handler.h | 4608 | F: include/net/iw_handler.h |
4609 | F: drivers/net/wireless/ | 4609 | F: drivers/net/wireless/ |
4610 | 4610 | ||
4611 | NETWORKING DRIVERS | 4611 | NETWORKING DRIVERS |
4612 | L: netdev@vger.kernel.org | 4612 | L: netdev@vger.kernel.org |
4613 | W: http://www.linuxfoundation.org/en/Net | 4613 | W: http://www.linuxfoundation.org/en/Net |
4614 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6.git | 4614 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6.git |
4615 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6.git | 4615 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6.git |
4616 | S: Odd Fixes | 4616 | S: Odd Fixes |
4617 | F: drivers/net/ | 4617 | F: drivers/net/ |
4618 | F: include/linux/if_* | 4618 | F: include/linux/if_* |
4619 | F: include/linux/*device.h | 4619 | F: include/linux/*device.h |
4620 | 4620 | ||
4621 | NETXEN (1/10) GbE SUPPORT | 4621 | NETXEN (1/10) GbE SUPPORT |
4622 | M: Sony Chacko <sony.chacko@qlogic.com> | 4622 | M: Sony Chacko <sony.chacko@qlogic.com> |
4623 | M: Rajesh Borundia <rajesh.borundia@qlogic.com> | 4623 | M: Rajesh Borundia <rajesh.borundia@qlogic.com> |
4624 | L: netdev@vger.kernel.org | 4624 | L: netdev@vger.kernel.org |
4625 | W: http://www.qlogic.com | 4625 | W: http://www.qlogic.com |
4626 | S: Supported | 4626 | S: Supported |
4627 | F: drivers/net/ethernet/qlogic/netxen/ | 4627 | F: drivers/net/ethernet/qlogic/netxen/ |
4628 | 4628 | ||
4629 | NFC SUBSYSTEM | 4629 | NFC SUBSYSTEM |
4630 | M: Lauro Ramos Venancio <lauro.venancio@openbossa.org> | 4630 | M: Lauro Ramos Venancio <lauro.venancio@openbossa.org> |
4631 | M: Aloisio Almeida Jr <aloisio.almeida@openbossa.org> | 4631 | M: Aloisio Almeida Jr <aloisio.almeida@openbossa.org> |
4632 | M: Samuel Ortiz <sameo@linux.intel.com> | 4632 | M: Samuel Ortiz <sameo@linux.intel.com> |
4633 | L: linux-wireless@vger.kernel.org | 4633 | L: linux-wireless@vger.kernel.org |
4634 | S: Maintained | 4634 | S: Maintained |
4635 | F: net/nfc/ | 4635 | F: net/nfc/ |
4636 | F: include/linux/nfc.h | 4636 | F: include/linux/nfc.h |
4637 | F: include/net/nfc/ | 4637 | F: include/net/nfc/ |
4638 | F: drivers/nfc/ | 4638 | F: drivers/nfc/ |
4639 | 4639 | ||
4640 | NFS, SUNRPC, AND LOCKD CLIENTS | 4640 | NFS, SUNRPC, AND LOCKD CLIENTS |
4641 | M: Trond Myklebust <Trond.Myklebust@netapp.com> | 4641 | M: Trond Myklebust <Trond.Myklebust@netapp.com> |
4642 | L: linux-nfs@vger.kernel.org | 4642 | L: linux-nfs@vger.kernel.org |
4643 | W: http://client.linux-nfs.org | 4643 | W: http://client.linux-nfs.org |
4644 | T: git git://git.linux-nfs.org/pub/linux/nfs-2.6.git | 4644 | T: git git://git.linux-nfs.org/pub/linux/nfs-2.6.git |
4645 | S: Maintained | 4645 | S: Maintained |
4646 | F: fs/lockd/ | 4646 | F: fs/lockd/ |
4647 | F: fs/nfs/ | 4647 | F: fs/nfs/ |
4648 | F: fs/nfs_common/ | 4648 | F: fs/nfs_common/ |
4649 | F: net/sunrpc/ | 4649 | F: net/sunrpc/ |
4650 | F: include/linux/lockd/ | 4650 | F: include/linux/lockd/ |
4651 | F: include/linux/nfs* | 4651 | F: include/linux/nfs* |
4652 | F: include/linux/sunrpc/ | 4652 | F: include/linux/sunrpc/ |
4653 | 4653 | ||
4654 | NI5010 NETWORK DRIVER | 4654 | NI5010 NETWORK DRIVER |
4655 | M: Jan-Pascal van Best <janpascal@vanbest.org> | 4655 | M: Jan-Pascal van Best <janpascal@vanbest.org> |
4656 | M: Andreas Mohr <andi@lisas.de> | 4656 | M: Andreas Mohr <andi@lisas.de> |
4657 | L: netdev@vger.kernel.org | 4657 | L: netdev@vger.kernel.org |
4658 | S: Maintained | 4658 | S: Maintained |
4659 | F: drivers/net/ethernet/racal/ni5010.* | 4659 | F: drivers/net/ethernet/racal/ni5010.* |
4660 | 4660 | ||
4661 | NILFS2 FILESYSTEM | 4661 | NILFS2 FILESYSTEM |
4662 | M: KONISHI Ryusuke <konishi.ryusuke@lab.ntt.co.jp> | 4662 | M: KONISHI Ryusuke <konishi.ryusuke@lab.ntt.co.jp> |
4663 | L: linux-nilfs@vger.kernel.org | 4663 | L: linux-nilfs@vger.kernel.org |
4664 | W: http://www.nilfs.org/en/ | 4664 | W: http://www.nilfs.org/en/ |
4665 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/ryusuke/nilfs2.git | 4665 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/ryusuke/nilfs2.git |
4666 | S: Supported | 4666 | S: Supported |
4667 | F: Documentation/filesystems/nilfs2.txt | 4667 | F: Documentation/filesystems/nilfs2.txt |
4668 | F: fs/nilfs2/ | 4668 | F: fs/nilfs2/ |
4669 | F: include/linux/nilfs2_fs.h | 4669 | F: include/linux/nilfs2_fs.h |
4670 | 4670 | ||
4671 | NINJA SCSI-3 / NINJA SCSI-32Bi (16bit/CardBus) PCMCIA SCSI HOST ADAPTER DRIVER | 4671 | NINJA SCSI-3 / NINJA SCSI-32Bi (16bit/CardBus) PCMCIA SCSI HOST ADAPTER DRIVER |
4672 | M: YOKOTA Hiroshi <yokota@netlab.is.tsukuba.ac.jp> | 4672 | M: YOKOTA Hiroshi <yokota@netlab.is.tsukuba.ac.jp> |
4673 | W: http://www.netlab.is.tsukuba.ac.jp/~yokota/izumi/ninja/ | 4673 | W: http://www.netlab.is.tsukuba.ac.jp/~yokota/izumi/ninja/ |
4674 | S: Maintained | 4674 | S: Maintained |
4675 | F: Documentation/scsi/NinjaSCSI.txt | 4675 | F: Documentation/scsi/NinjaSCSI.txt |
4676 | F: drivers/scsi/pcmcia/nsp_* | 4676 | F: drivers/scsi/pcmcia/nsp_* |
4677 | 4677 | ||
4678 | NINJA SCSI-32Bi/UDE PCI/CARDBUS SCSI HOST ADAPTER DRIVER | 4678 | NINJA SCSI-32Bi/UDE PCI/CARDBUS SCSI HOST ADAPTER DRIVER |
4679 | M: GOTO Masanori <gotom@debian.or.jp> | 4679 | M: GOTO Masanori <gotom@debian.or.jp> |
4680 | M: YOKOTA Hiroshi <yokota@netlab.is.tsukuba.ac.jp> | 4680 | M: YOKOTA Hiroshi <yokota@netlab.is.tsukuba.ac.jp> |
4681 | W: http://www.netlab.is.tsukuba.ac.jp/~yokota/izumi/ninja/ | 4681 | W: http://www.netlab.is.tsukuba.ac.jp/~yokota/izumi/ninja/ |
4682 | S: Maintained | 4682 | S: Maintained |
4683 | F: Documentation/scsi/NinjaSCSI.txt | 4683 | F: Documentation/scsi/NinjaSCSI.txt |
4684 | F: drivers/scsi/nsp32* | 4684 | F: drivers/scsi/nsp32* |
4685 | 4685 | ||
4686 | NTFS FILESYSTEM | 4686 | NTFS FILESYSTEM |
4687 | M: Anton Altaparmakov <anton@tuxera.com> | 4687 | M: Anton Altaparmakov <anton@tuxera.com> |
4688 | L: linux-ntfs-dev@lists.sourceforge.net | 4688 | L: linux-ntfs-dev@lists.sourceforge.net |
4689 | W: http://www.tuxera.com/ | 4689 | W: http://www.tuxera.com/ |
4690 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/aia21/ntfs-2.6.git | 4690 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/aia21/ntfs-2.6.git |
4691 | S: Supported | 4691 | S: Supported |
4692 | F: Documentation/filesystems/ntfs.txt | 4692 | F: Documentation/filesystems/ntfs.txt |
4693 | F: fs/ntfs/ | 4693 | F: fs/ntfs/ |
4694 | 4694 | ||
4695 | NVIDIA (rivafb and nvidiafb) FRAMEBUFFER DRIVER | 4695 | NVIDIA (rivafb and nvidiafb) FRAMEBUFFER DRIVER |
4696 | M: Antonino Daplas <adaplas@gmail.com> | 4696 | M: Antonino Daplas <adaplas@gmail.com> |
4697 | L: linux-fbdev@vger.kernel.org | 4697 | L: linux-fbdev@vger.kernel.org |
4698 | S: Maintained | 4698 | S: Maintained |
4699 | F: drivers/video/riva/ | 4699 | F: drivers/video/riva/ |
4700 | F: drivers/video/nvidia/ | 4700 | F: drivers/video/nvidia/ |
4701 | 4701 | ||
4702 | OMAP SUPPORT | 4702 | OMAP SUPPORT |
4703 | M: Tony Lindgren <tony@atomide.com> | 4703 | M: Tony Lindgren <tony@atomide.com> |
4704 | L: linux-omap@vger.kernel.org | 4704 | L: linux-omap@vger.kernel.org |
4705 | W: http://www.muru.com/linux/omap/ | 4705 | W: http://www.muru.com/linux/omap/ |
4706 | W: http://linux.omap.com/ | 4706 | W: http://linux.omap.com/ |
4707 | Q: http://patchwork.kernel.org/project/linux-omap/list/ | 4707 | Q: http://patchwork.kernel.org/project/linux-omap/list/ |
4708 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap.git | 4708 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap.git |
4709 | S: Maintained | 4709 | S: Maintained |
4710 | F: arch/arm/*omap*/ | 4710 | F: arch/arm/*omap*/ |
4711 | F: drivers/i2c/busses/i2c-omap.c | 4711 | F: drivers/i2c/busses/i2c-omap.c |
4712 | F: include/linux/i2c-omap.h | 4712 | F: include/linux/i2c-omap.h |
4713 | 4713 | ||
4714 | OMAP CLOCK FRAMEWORK SUPPORT | 4714 | OMAP CLOCK FRAMEWORK SUPPORT |
4715 | M: Paul Walmsley <paul@pwsan.com> | 4715 | M: Paul Walmsley <paul@pwsan.com> |
4716 | L: linux-omap@vger.kernel.org | 4716 | L: linux-omap@vger.kernel.org |
4717 | S: Maintained | 4717 | S: Maintained |
4718 | F: arch/arm/*omap*/*clock* | 4718 | F: arch/arm/*omap*/*clock* |
4719 | 4719 | ||
4720 | OMAP POWER MANAGEMENT SUPPORT | 4720 | OMAP POWER MANAGEMENT SUPPORT |
4721 | M: Kevin Hilman <khilman@ti.com> | 4721 | M: Kevin Hilman <khilman@ti.com> |
4722 | L: linux-omap@vger.kernel.org | 4722 | L: linux-omap@vger.kernel.org |
4723 | S: Maintained | 4723 | S: Maintained |
4724 | F: arch/arm/*omap*/*pm* | 4724 | F: arch/arm/*omap*/*pm* |
4725 | 4725 | ||
4726 | OMAP POWERDOMAIN/CLOCKDOMAIN SOC ADAPTATION LAYER SUPPORT | 4726 | OMAP POWERDOMAIN/CLOCKDOMAIN SOC ADAPTATION LAYER SUPPORT |
4727 | M: Rajendra Nayak <rnayak@ti.com> | 4727 | M: Rajendra Nayak <rnayak@ti.com> |
4728 | M: Paul Walmsley <paul@pwsan.com> | 4728 | M: Paul Walmsley <paul@pwsan.com> |
4729 | L: linux-omap@vger.kernel.org | 4729 | L: linux-omap@vger.kernel.org |
4730 | S: Maintained | 4730 | S: Maintained |
4731 | F: arch/arm/mach-omap2/powerdomain2xxx_3xxx.c | 4731 | F: arch/arm/mach-omap2/powerdomain2xxx_3xxx.c |
4732 | F: arch/arm/mach-omap2/powerdomain44xx.c | 4732 | F: arch/arm/mach-omap2/powerdomain44xx.c |
4733 | F: arch/arm/mach-omap2/clockdomain2xxx_3xxx.c | 4733 | F: arch/arm/mach-omap2/clockdomain2xxx_3xxx.c |
4734 | F: arch/arm/mach-omap2/clockdomain44xx.c | 4734 | F: arch/arm/mach-omap2/clockdomain44xx.c |
4735 | 4735 | ||
4736 | OMAP AUDIO SUPPORT | 4736 | OMAP AUDIO SUPPORT |
4737 | M: Jarkko Nikula <jarkko.nikula@bitmer.com> | 4737 | M: Jarkko Nikula <jarkko.nikula@bitmer.com> |
4738 | L: alsa-devel@alsa-project.org (subscribers-only) | 4738 | L: alsa-devel@alsa-project.org (subscribers-only) |
4739 | L: linux-omap@vger.kernel.org | 4739 | L: linux-omap@vger.kernel.org |
4740 | S: Maintained | 4740 | S: Maintained |
4741 | F: sound/soc/omap/ | 4741 | F: sound/soc/omap/ |
4742 | 4742 | ||
4743 | OMAP FRAMEBUFFER SUPPORT | 4743 | OMAP FRAMEBUFFER SUPPORT |
4744 | M: Tomi Valkeinen <tomi.valkeinen@ti.com> | 4744 | M: Tomi Valkeinen <tomi.valkeinen@ti.com> |
4745 | L: linux-fbdev@vger.kernel.org | 4745 | L: linux-fbdev@vger.kernel.org |
4746 | L: linux-omap@vger.kernel.org | 4746 | L: linux-omap@vger.kernel.org |
4747 | S: Maintained | 4747 | S: Maintained |
4748 | F: drivers/video/omap/ | 4748 | F: drivers/video/omap/ |
4749 | 4749 | ||
4750 | OMAP DISPLAY SUBSYSTEM and FRAMEBUFFER SUPPORT (DSS2) | 4750 | OMAP DISPLAY SUBSYSTEM and FRAMEBUFFER SUPPORT (DSS2) |
4751 | M: Tomi Valkeinen <tomi.valkeinen@ti.com> | 4751 | M: Tomi Valkeinen <tomi.valkeinen@ti.com> |
4752 | L: linux-omap@vger.kernel.org | 4752 | L: linux-omap@vger.kernel.org |
4753 | L: linux-fbdev@vger.kernel.org | 4753 | L: linux-fbdev@vger.kernel.org |
4754 | S: Maintained | 4754 | S: Maintained |
4755 | F: drivers/video/omap2/ | 4755 | F: drivers/video/omap2/ |
4756 | F: Documentation/arm/OMAP/DSS | 4756 | F: Documentation/arm/OMAP/DSS |
4757 | 4757 | ||
4758 | OMAP HARDWARE SPINLOCK SUPPORT | 4758 | OMAP HARDWARE SPINLOCK SUPPORT |
4759 | M: Ohad Ben-Cohen <ohad@wizery.com> | 4759 | M: Ohad Ben-Cohen <ohad@wizery.com> |
4760 | L: linux-omap@vger.kernel.org | 4760 | L: linux-omap@vger.kernel.org |
4761 | S: Maintained | 4761 | S: Maintained |
4762 | F: drivers/hwspinlock/omap_hwspinlock.c | 4762 | F: drivers/hwspinlock/omap_hwspinlock.c |
4763 | F: arch/arm/mach-omap2/hwspinlock.c | 4763 | F: arch/arm/mach-omap2/hwspinlock.c |
4764 | 4764 | ||
4765 | OMAP MMC SUPPORT | 4765 | OMAP MMC SUPPORT |
4766 | M: Jarkko Lavinen <jarkko.lavinen@nokia.com> | 4766 | M: Jarkko Lavinen <jarkko.lavinen@nokia.com> |
4767 | L: linux-omap@vger.kernel.org | 4767 | L: linux-omap@vger.kernel.org |
4768 | S: Maintained | 4768 | S: Maintained |
4769 | F: drivers/mmc/host/omap.c | 4769 | F: drivers/mmc/host/omap.c |
4770 | 4770 | ||
4771 | OMAP HS MMC SUPPORT | 4771 | OMAP HS MMC SUPPORT |
4772 | L: linux-omap@vger.kernel.org | 4772 | L: linux-omap@vger.kernel.org |
4773 | S: Orphan | 4773 | S: Orphan |
4774 | F: drivers/mmc/host/omap_hsmmc.c | 4774 | F: drivers/mmc/host/omap_hsmmc.c |
4775 | 4775 | ||
4776 | OMAP RANDOM NUMBER GENERATOR SUPPORT | 4776 | OMAP RANDOM NUMBER GENERATOR SUPPORT |
4777 | M: Deepak Saxena <dsaxena@plexity.net> | 4777 | M: Deepak Saxena <dsaxena@plexity.net> |
4778 | S: Maintained | 4778 | S: Maintained |
4779 | F: drivers/char/hw_random/omap-rng.c | 4779 | F: drivers/char/hw_random/omap-rng.c |
4780 | 4780 | ||
4781 | OMAP HWMOD SUPPORT | 4781 | OMAP HWMOD SUPPORT |
4782 | M: Benoรฎt Cousson <b-cousson@ti.com> | 4782 | M: Benoรฎt Cousson <b-cousson@ti.com> |
4783 | M: Paul Walmsley <paul@pwsan.com> | 4783 | M: Paul Walmsley <paul@pwsan.com> |
4784 | L: linux-omap@vger.kernel.org | 4784 | L: linux-omap@vger.kernel.org |
4785 | S: Maintained | 4785 | S: Maintained |
4786 | F: arch/arm/mach-omap2/omap_hwmod.c | 4786 | F: arch/arm/mach-omap2/omap_hwmod.c |
4787 | F: arch/arm/plat-omap/include/plat/omap_hwmod.h | 4787 | F: arch/arm/plat-omap/include/plat/omap_hwmod.h |
4788 | 4788 | ||
4789 | OMAP HWMOD DATA FOR OMAP4-BASED DEVICES | 4789 | OMAP HWMOD DATA FOR OMAP4-BASED DEVICES |
4790 | M: Benoรฎt Cousson <b-cousson@ti.com> | 4790 | M: Benoรฎt Cousson <b-cousson@ti.com> |
4791 | L: linux-omap@vger.kernel.org | 4791 | L: linux-omap@vger.kernel.org |
4792 | S: Maintained | 4792 | S: Maintained |
4793 | F: arch/arm/mach-omap2/omap_hwmod_44xx_data.c | 4793 | F: arch/arm/mach-omap2/omap_hwmod_44xx_data.c |
4794 | 4794 | ||
4795 | OMAP IMAGE SIGNAL PROCESSOR (ISP) | 4795 | OMAP IMAGE SIGNAL PROCESSOR (ISP) |
4796 | M: Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 4796 | M: Laurent Pinchart <laurent.pinchart@ideasonboard.com> |
4797 | L: linux-media@vger.kernel.org | 4797 | L: linux-media@vger.kernel.org |
4798 | S: Maintained | 4798 | S: Maintained |
4799 | F: drivers/media/video/omap3isp/* | 4799 | F: drivers/media/video/omap3isp/* |
4800 | 4800 | ||
4801 | OMAP USB SUPPORT | 4801 | OMAP USB SUPPORT |
4802 | M: Felipe Balbi <balbi@ti.com> | 4802 | M: Felipe Balbi <balbi@ti.com> |
4803 | L: linux-usb@vger.kernel.org | 4803 | L: linux-usb@vger.kernel.org |
4804 | L: linux-omap@vger.kernel.org | 4804 | L: linux-omap@vger.kernel.org |
4805 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git | 4805 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git |
4806 | S: Maintained | 4806 | S: Maintained |
4807 | F: drivers/usb/*/*omap* | 4807 | F: drivers/usb/*/*omap* |
4808 | F: arch/arm/*omap*/usb* | 4808 | F: arch/arm/*omap*/usb* |
4809 | 4809 | ||
4810 | OMFS FILESYSTEM | 4810 | OMFS FILESYSTEM |
4811 | M: Bob Copeland <me@bobcopeland.com> | 4811 | M: Bob Copeland <me@bobcopeland.com> |
4812 | L: linux-karma-devel@lists.sourceforge.net | 4812 | L: linux-karma-devel@lists.sourceforge.net |
4813 | S: Maintained | 4813 | S: Maintained |
4814 | F: Documentation/filesystems/omfs.txt | 4814 | F: Documentation/filesystems/omfs.txt |
4815 | F: fs/omfs/ | 4815 | F: fs/omfs/ |
4816 | 4816 | ||
4817 | OMNIKEY CARDMAN 4000 DRIVER | 4817 | OMNIKEY CARDMAN 4000 DRIVER |
4818 | M: Harald Welte <laforge@gnumonks.org> | 4818 | M: Harald Welte <laforge@gnumonks.org> |
4819 | S: Maintained | 4819 | S: Maintained |
4820 | F: drivers/char/pcmcia/cm4000_cs.c | 4820 | F: drivers/char/pcmcia/cm4000_cs.c |
4821 | F: include/linux/cm4000_cs.h | 4821 | F: include/linux/cm4000_cs.h |
4822 | 4822 | ||
4823 | OMNIKEY CARDMAN 4040 DRIVER | 4823 | OMNIKEY CARDMAN 4040 DRIVER |
4824 | M: Harald Welte <laforge@gnumonks.org> | 4824 | M: Harald Welte <laforge@gnumonks.org> |
4825 | S: Maintained | 4825 | S: Maintained |
4826 | F: drivers/char/pcmcia/cm4040_cs.* | 4826 | F: drivers/char/pcmcia/cm4040_cs.* |
4827 | 4827 | ||
4828 | OMNIVISION OV7670 SENSOR DRIVER | 4828 | OMNIVISION OV7670 SENSOR DRIVER |
4829 | M: Jonathan Corbet <corbet@lwn.net> | 4829 | M: Jonathan Corbet <corbet@lwn.net> |
4830 | L: linux-media@vger.kernel.org | 4830 | L: linux-media@vger.kernel.org |
4831 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git | 4831 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git |
4832 | S: Maintained | 4832 | S: Maintained |
4833 | F: drivers/media/video/ov7670.c | 4833 | F: drivers/media/video/ov7670.c |
4834 | 4834 | ||
4835 | ONENAND FLASH DRIVER | 4835 | ONENAND FLASH DRIVER |
4836 | M: Kyungmin Park <kyungmin.park@samsung.com> | 4836 | M: Kyungmin Park <kyungmin.park@samsung.com> |
4837 | L: linux-mtd@lists.infradead.org | 4837 | L: linux-mtd@lists.infradead.org |
4838 | S: Maintained | 4838 | S: Maintained |
4839 | F: drivers/mtd/onenand/ | 4839 | F: drivers/mtd/onenand/ |
4840 | F: include/linux/mtd/onenand*.h | 4840 | F: include/linux/mtd/onenand*.h |
4841 | 4841 | ||
4842 | ONSTREAM SCSI TAPE DRIVER | 4842 | ONSTREAM SCSI TAPE DRIVER |
4843 | M: Willem Riede <osst@riede.org> | 4843 | M: Willem Riede <osst@riede.org> |
4844 | L: osst-users@lists.sourceforge.net | 4844 | L: osst-users@lists.sourceforge.net |
4845 | L: linux-scsi@vger.kernel.org | 4845 | L: linux-scsi@vger.kernel.org |
4846 | S: Maintained | 4846 | S: Maintained |
4847 | F: drivers/scsi/osst* | 4847 | F: drivers/scsi/osst* |
4848 | F: drivers/scsi/st* | 4848 | F: drivers/scsi/st* |
4849 | 4849 | ||
4850 | OPENCORES I2C BUS DRIVER | 4850 | OPENCORES I2C BUS DRIVER |
4851 | M: Peter Korsgaard <jacmet@sunsite.dk> | 4851 | M: Peter Korsgaard <jacmet@sunsite.dk> |
4852 | L: linux-i2c@vger.kernel.org | 4852 | L: linux-i2c@vger.kernel.org |
4853 | S: Maintained | 4853 | S: Maintained |
4854 | F: Documentation/i2c/busses/i2c-ocores | 4854 | F: Documentation/i2c/busses/i2c-ocores |
4855 | F: drivers/i2c/busses/i2c-ocores.c | 4855 | F: drivers/i2c/busses/i2c-ocores.c |
4856 | 4856 | ||
4857 | OPEN FIRMWARE AND FLATTENED DEVICE TREE | 4857 | OPEN FIRMWARE AND FLATTENED DEVICE TREE |
4858 | M: Grant Likely <grant.likely@secretlab.ca> | 4858 | M: Grant Likely <grant.likely@secretlab.ca> |
4859 | M: Rob Herring <rob.herring@calxeda.com> | 4859 | M: Rob Herring <rob.herring@calxeda.com> |
4860 | L: devicetree-discuss@lists.ozlabs.org (moderated for non-subscribers) | 4860 | L: devicetree-discuss@lists.ozlabs.org (moderated for non-subscribers) |
4861 | W: http://fdt.secretlab.ca | 4861 | W: http://fdt.secretlab.ca |
4862 | T: git git://git.secretlab.ca/git/linux-2.6.git | 4862 | T: git git://git.secretlab.ca/git/linux-2.6.git |
4863 | S: Maintained | 4863 | S: Maintained |
4864 | F: Documentation/devicetree | 4864 | F: Documentation/devicetree |
4865 | F: drivers/of | 4865 | F: drivers/of |
4866 | F: include/linux/of*.h | 4866 | F: include/linux/of*.h |
4867 | K: of_get_property | 4867 | K: of_get_property |
4868 | K: of_match_table | 4868 | K: of_match_table |
4869 | 4869 | ||
4870 | OPENRISC ARCHITECTURE | 4870 | OPENRISC ARCHITECTURE |
4871 | M: Jonas Bonn <jonas@southpole.se> | 4871 | M: Jonas Bonn <jonas@southpole.se> |
4872 | W: http://openrisc.net | 4872 | W: http://openrisc.net |
4873 | L: linux@lists.openrisc.net (moderated for non-subscribers) | 4873 | L: linux@lists.openrisc.net (moderated for non-subscribers) |
4874 | S: Maintained | 4874 | S: Maintained |
4875 | T: git git://openrisc.net/~jonas/linux | 4875 | T: git git://openrisc.net/~jonas/linux |
4876 | F: arch/openrisc | 4876 | F: arch/openrisc |
4877 | 4877 | ||
4878 | OPENVSWITCH | 4878 | OPENVSWITCH |
4879 | M: Jesse Gross <jesse@nicira.com> | 4879 | M: Jesse Gross <jesse@nicira.com> |
4880 | L: dev@openvswitch.org | 4880 | L: dev@openvswitch.org |
4881 | W: http://openvswitch.org | 4881 | W: http://openvswitch.org |
4882 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jesse/openvswitch.git | 4882 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jesse/openvswitch.git |
4883 | S: Maintained | 4883 | S: Maintained |
4884 | F: net/openvswitch/ | 4884 | F: net/openvswitch/ |
4885 | 4885 | ||
4886 | OPL4 DRIVER | 4886 | OPL4 DRIVER |
4887 | M: Clemens Ladisch <clemens@ladisch.de> | 4887 | M: Clemens Ladisch <clemens@ladisch.de> |
4888 | L: alsa-devel@alsa-project.org (moderated for non-subscribers) | 4888 | L: alsa-devel@alsa-project.org (moderated for non-subscribers) |
4889 | T: git git://git.alsa-project.org/alsa-kernel.git | 4889 | T: git git://git.alsa-project.org/alsa-kernel.git |
4890 | S: Maintained | 4890 | S: Maintained |
4891 | F: sound/drivers/opl4/ | 4891 | F: sound/drivers/opl4/ |
4892 | 4892 | ||
4893 | OPROFILE | 4893 | OPROFILE |
4894 | M: Robert Richter <robert.richter@amd.com> | 4894 | M: Robert Richter <robert.richter@amd.com> |
4895 | L: oprofile-list@lists.sf.net | 4895 | L: oprofile-list@lists.sf.net |
4896 | S: Maintained | 4896 | S: Maintained |
4897 | F: arch/*/include/asm/oprofile*.h | 4897 | F: arch/*/include/asm/oprofile*.h |
4898 | F: arch/*/oprofile/ | 4898 | F: arch/*/oprofile/ |
4899 | F: drivers/oprofile/ | 4899 | F: drivers/oprofile/ |
4900 | F: include/linux/oprofile.h | 4900 | F: include/linux/oprofile.h |
4901 | 4901 | ||
4902 | ORACLE CLUSTER FILESYSTEM 2 (OCFS2) | 4902 | ORACLE CLUSTER FILESYSTEM 2 (OCFS2) |
4903 | M: Mark Fasheh <mfasheh@suse.com> | 4903 | M: Mark Fasheh <mfasheh@suse.com> |
4904 | M: Joel Becker <jlbec@evilplan.org> | 4904 | M: Joel Becker <jlbec@evilplan.org> |
4905 | L: ocfs2-devel@oss.oracle.com (moderated for non-subscribers) | 4905 | L: ocfs2-devel@oss.oracle.com (moderated for non-subscribers) |
4906 | W: http://oss.oracle.com/projects/ocfs2/ | 4906 | W: http://oss.oracle.com/projects/ocfs2/ |
4907 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jlbec/ocfs2.git | 4907 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jlbec/ocfs2.git |
4908 | S: Supported | 4908 | S: Supported |
4909 | F: Documentation/filesystems/ocfs2.txt | 4909 | F: Documentation/filesystems/ocfs2.txt |
4910 | F: Documentation/filesystems/dlmfs.txt | 4910 | F: Documentation/filesystems/dlmfs.txt |
4911 | F: fs/ocfs2/ | 4911 | F: fs/ocfs2/ |
4912 | 4912 | ||
4913 | ORINOCO DRIVER | 4913 | ORINOCO DRIVER |
4914 | L: linux-wireless@vger.kernel.org | 4914 | L: linux-wireless@vger.kernel.org |
4915 | L: orinoco-users@lists.sourceforge.net | 4915 | L: orinoco-users@lists.sourceforge.net |
4916 | L: orinoco-devel@lists.sourceforge.net | 4916 | L: orinoco-devel@lists.sourceforge.net |
4917 | W: http://linuxwireless.org/en/users/Drivers/orinoco | 4917 | W: http://linuxwireless.org/en/users/Drivers/orinoco |
4918 | W: http://www.nongnu.org/orinoco/ | 4918 | W: http://www.nongnu.org/orinoco/ |
4919 | S: Orphan | 4919 | S: Orphan |
4920 | F: drivers/net/wireless/orinoco/ | 4920 | F: drivers/net/wireless/orinoco/ |
4921 | 4921 | ||
4922 | OSD LIBRARY and FILESYSTEM | 4922 | OSD LIBRARY and FILESYSTEM |
4923 | M: Boaz Harrosh <bharrosh@panasas.com> | 4923 | M: Boaz Harrosh <bharrosh@panasas.com> |
4924 | M: Benny Halevy <bhalevy@tonian.com> | 4924 | M: Benny Halevy <bhalevy@tonian.com> |
4925 | L: osd-dev@open-osd.org | 4925 | L: osd-dev@open-osd.org |
4926 | W: http://open-osd.org | 4926 | W: http://open-osd.org |
4927 | T: git git://git.open-osd.org/open-osd.git | 4927 | T: git git://git.open-osd.org/open-osd.git |
4928 | S: Maintained | 4928 | S: Maintained |
4929 | F: drivers/scsi/osd/ | 4929 | F: drivers/scsi/osd/ |
4930 | F: include/scsi/osd_* | 4930 | F: include/scsi/osd_* |
4931 | F: fs/exofs/ | 4931 | F: fs/exofs/ |
4932 | 4932 | ||
4933 | P54 WIRELESS DRIVER | 4933 | P54 WIRELESS DRIVER |
4934 | M: Christian Lamparter <chunkeey@googlemail.com> | 4934 | M: Christian Lamparter <chunkeey@googlemail.com> |
4935 | L: linux-wireless@vger.kernel.org | 4935 | L: linux-wireless@vger.kernel.org |
4936 | W: http://wireless.kernel.org/en/users/Drivers/p54 | 4936 | W: http://wireless.kernel.org/en/users/Drivers/p54 |
4937 | S: Maintained | 4937 | S: Maintained |
4938 | F: drivers/net/wireless/p54/ | 4938 | F: drivers/net/wireless/p54/ |
4939 | 4939 | ||
4940 | PA SEMI ETHERNET DRIVER | 4940 | PA SEMI ETHERNET DRIVER |
4941 | M: Olof Johansson <olof@lixom.net> | 4941 | M: Olof Johansson <olof@lixom.net> |
4942 | L: netdev@vger.kernel.org | 4942 | L: netdev@vger.kernel.org |
4943 | S: Maintained | 4943 | S: Maintained |
4944 | F: drivers/net/ethernet/pasemi/* | 4944 | F: drivers/net/ethernet/pasemi/* |
4945 | 4945 | ||
4946 | PA SEMI SMBUS DRIVER | 4946 | PA SEMI SMBUS DRIVER |
4947 | M: Olof Johansson <olof@lixom.net> | 4947 | M: Olof Johansson <olof@lixom.net> |
4948 | L: linux-i2c@vger.kernel.org | 4948 | L: linux-i2c@vger.kernel.org |
4949 | S: Maintained | 4949 | S: Maintained |
4950 | F: drivers/i2c/busses/i2c-pasemi.c | 4950 | F: drivers/i2c/busses/i2c-pasemi.c |
4951 | 4951 | ||
4952 | PADATA PARALLEL EXECUTION MECHANISM | 4952 | PADATA PARALLEL EXECUTION MECHANISM |
4953 | M: Steffen Klassert <steffen.klassert@secunet.com> | 4953 | M: Steffen Klassert <steffen.klassert@secunet.com> |
4954 | L: linux-crypto@vger.kernel.org | 4954 | L: linux-crypto@vger.kernel.org |
4955 | S: Maintained | 4955 | S: Maintained |
4956 | F: kernel/padata.c | 4956 | F: kernel/padata.c |
4957 | F: include/linux/padata.h | 4957 | F: include/linux/padata.h |
4958 | F: Documentation/padata.txt | 4958 | F: Documentation/padata.txt |
4959 | 4959 | ||
4960 | PANASONIC LAPTOP ACPI EXTRAS DRIVER | 4960 | PANASONIC LAPTOP ACPI EXTRAS DRIVER |
4961 | M: Harald Welte <laforge@gnumonks.org> | 4961 | M: Harald Welte <laforge@gnumonks.org> |
4962 | L: platform-driver-x86@vger.kernel.org | 4962 | L: platform-driver-x86@vger.kernel.org |
4963 | S: Maintained | 4963 | S: Maintained |
4964 | F: drivers/platform/x86/panasonic-laptop.c | 4964 | F: drivers/platform/x86/panasonic-laptop.c |
4965 | 4965 | ||
4966 | PANASONIC MN10300/AM33/AM34 PORT | 4966 | PANASONIC MN10300/AM33/AM34 PORT |
4967 | M: David Howells <dhowells@redhat.com> | 4967 | M: David Howells <dhowells@redhat.com> |
4968 | M: Koichi Yasutake <yasutake.koichi@jp.panasonic.com> | 4968 | M: Koichi Yasutake <yasutake.koichi@jp.panasonic.com> |
4969 | L: linux-am33-list@redhat.com (moderated for non-subscribers) | 4969 | L: linux-am33-list@redhat.com (moderated for non-subscribers) |
4970 | W: ftp://ftp.redhat.com/pub/redhat/gnupro/AM33/ | 4970 | W: ftp://ftp.redhat.com/pub/redhat/gnupro/AM33/ |
4971 | S: Maintained | 4971 | S: Maintained |
4972 | F: Documentation/mn10300/ | 4972 | F: Documentation/mn10300/ |
4973 | F: arch/mn10300/ | 4973 | F: arch/mn10300/ |
4974 | 4974 | ||
4975 | PARALLEL PORT SUPPORT | 4975 | PARALLEL PORT SUPPORT |
4976 | L: linux-parport@lists.infradead.org (subscribers-only) | 4976 | L: linux-parport@lists.infradead.org (subscribers-only) |
4977 | S: Orphan | 4977 | S: Orphan |
4978 | F: drivers/parport/ | 4978 | F: drivers/parport/ |
4979 | F: include/linux/parport*.h | 4979 | F: include/linux/parport*.h |
4980 | F: drivers/char/ppdev.c | 4980 | F: drivers/char/ppdev.c |
4981 | F: include/linux/ppdev.h | 4981 | F: include/linux/ppdev.h |
4982 | 4982 | ||
4983 | PARAVIRT_OPS INTERFACE | 4983 | PARAVIRT_OPS INTERFACE |
4984 | M: Jeremy Fitzhardinge <jeremy@goop.org> | 4984 | M: Jeremy Fitzhardinge <jeremy@goop.org> |
4985 | M: Chris Wright <chrisw@sous-sol.org> | 4985 | M: Chris Wright <chrisw@sous-sol.org> |
4986 | M: Alok Kataria <akataria@vmware.com> | 4986 | M: Alok Kataria <akataria@vmware.com> |
4987 | M: Rusty Russell <rusty@rustcorp.com.au> | 4987 | M: Rusty Russell <rusty@rustcorp.com.au> |
4988 | L: virtualization@lists.linux-foundation.org | 4988 | L: virtualization@lists.linux-foundation.org |
4989 | S: Supported | 4989 | S: Supported |
4990 | F: Documentation/ia64/paravirt_ops.txt | 4990 | F: Documentation/ia64/paravirt_ops.txt |
4991 | F: arch/*/kernel/paravirt* | 4991 | F: arch/*/kernel/paravirt* |
4992 | F: arch/*/include/asm/paravirt.h | 4992 | F: arch/*/include/asm/paravirt.h |
4993 | 4993 | ||
4994 | PARIDE DRIVERS FOR PARALLEL PORT IDE DEVICES | 4994 | PARIDE DRIVERS FOR PARALLEL PORT IDE DEVICES |
4995 | M: Tim Waugh <tim@cyberelk.net> | 4995 | M: Tim Waugh <tim@cyberelk.net> |
4996 | L: linux-parport@lists.infradead.org (subscribers-only) | 4996 | L: linux-parport@lists.infradead.org (subscribers-only) |
4997 | W: http://www.torque.net/linux-pp.html | 4997 | W: http://www.torque.net/linux-pp.html |
4998 | S: Maintained | 4998 | S: Maintained |
4999 | F: Documentation/blockdev/paride.txt | 4999 | F: Documentation/blockdev/paride.txt |
5000 | F: drivers/block/paride/ | 5000 | F: drivers/block/paride/ |
5001 | 5001 | ||
5002 | PARISC ARCHITECTURE | 5002 | PARISC ARCHITECTURE |
5003 | M: Kyle McMartin <kyle@mcmartin.ca> | 5003 | M: Kyle McMartin <kyle@mcmartin.ca> |
5004 | M: Helge Deller <deller@gmx.de> | 5004 | M: Helge Deller <deller@gmx.de> |
5005 | M: "James E.J. Bottomley" <jejb@parisc-linux.org> | 5005 | M: "James E.J. Bottomley" <jejb@parisc-linux.org> |
5006 | L: linux-parisc@vger.kernel.org | 5006 | L: linux-parisc@vger.kernel.org |
5007 | W: http://www.parisc-linux.org/ | 5007 | W: http://www.parisc-linux.org/ |
5008 | Q: http://patchwork.kernel.org/project/linux-parisc/list/ | 5008 | Q: http://patchwork.kernel.org/project/linux-parisc/list/ |
5009 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/kyle/parisc-2.6.git | 5009 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/kyle/parisc-2.6.git |
5010 | S: Maintained | 5010 | S: Maintained |
5011 | F: arch/parisc/ | 5011 | F: arch/parisc/ |
5012 | F: drivers/parisc/ | 5012 | F: drivers/parisc/ |
5013 | 5013 | ||
5014 | PC87360 HARDWARE MONITORING DRIVER | 5014 | PC87360 HARDWARE MONITORING DRIVER |
5015 | M: Jim Cromie <jim.cromie@gmail.com> | 5015 | M: Jim Cromie <jim.cromie@gmail.com> |
5016 | L: lm-sensors@lm-sensors.org | 5016 | L: lm-sensors@lm-sensors.org |
5017 | S: Maintained | 5017 | S: Maintained |
5018 | F: Documentation/hwmon/pc87360 | 5018 | F: Documentation/hwmon/pc87360 |
5019 | F: drivers/hwmon/pc87360.c | 5019 | F: drivers/hwmon/pc87360.c |
5020 | 5020 | ||
5021 | PC8736x GPIO DRIVER | 5021 | PC8736x GPIO DRIVER |
5022 | M: Jim Cromie <jim.cromie@gmail.com> | 5022 | M: Jim Cromie <jim.cromie@gmail.com> |
5023 | S: Maintained | 5023 | S: Maintained |
5024 | F: drivers/char/pc8736x_gpio.c | 5024 | F: drivers/char/pc8736x_gpio.c |
5025 | 5025 | ||
5026 | PC87427 HARDWARE MONITORING DRIVER | 5026 | PC87427 HARDWARE MONITORING DRIVER |
5027 | M: Jean Delvare <khali@linux-fr.org> | 5027 | M: Jean Delvare <khali@linux-fr.org> |
5028 | L: lm-sensors@lm-sensors.org | 5028 | L: lm-sensors@lm-sensors.org |
5029 | S: Maintained | 5029 | S: Maintained |
5030 | F: Documentation/hwmon/pc87427 | 5030 | F: Documentation/hwmon/pc87427 |
5031 | F: drivers/hwmon/pc87427.c | 5031 | F: drivers/hwmon/pc87427.c |
5032 | 5032 | ||
5033 | PCA9532 LED DRIVER | 5033 | PCA9532 LED DRIVER |
5034 | M: Riku Voipio <riku.voipio@iki.fi> | 5034 | M: Riku Voipio <riku.voipio@iki.fi> |
5035 | S: Maintained | 5035 | S: Maintained |
5036 | F: drivers/leds/leds-pca9532.c | 5036 | F: drivers/leds/leds-pca9532.c |
5037 | F: include/linux/leds-pca9532.h | 5037 | F: include/linux/leds-pca9532.h |
5038 | 5038 | ||
5039 | PCA9541 I2C BUS MASTER SELECTOR DRIVER | 5039 | PCA9541 I2C BUS MASTER SELECTOR DRIVER |
5040 | M: Guenter Roeck <guenter.roeck@ericsson.com> | 5040 | M: Guenter Roeck <guenter.roeck@ericsson.com> |
5041 | L: linux-i2c@vger.kernel.org | 5041 | L: linux-i2c@vger.kernel.org |
5042 | S: Maintained | 5042 | S: Maintained |
5043 | F: drivers/i2c/muxes/pca9541.c | 5043 | F: drivers/i2c/muxes/pca9541.c |
5044 | 5044 | ||
5045 | PCA9564/PCA9665 I2C BUS DRIVER | 5045 | PCA9564/PCA9665 I2C BUS DRIVER |
5046 | M: Wolfram Sang <w.sang@pengutronix.de> | 5046 | M: Wolfram Sang <w.sang@pengutronix.de> |
5047 | L: linux-i2c@vger.kernel.org | 5047 | L: linux-i2c@vger.kernel.org |
5048 | S: Maintained | 5048 | S: Maintained |
5049 | F: drivers/i2c/algos/i2c-algo-pca.c | 5049 | F: drivers/i2c/algos/i2c-algo-pca.c |
5050 | F: drivers/i2c/busses/i2c-pca-* | 5050 | F: drivers/i2c/busses/i2c-pca-* |
5051 | F: include/linux/i2c-algo-pca.h | 5051 | F: include/linux/i2c-algo-pca.h |
5052 | F: include/linux/i2c-pca-platform.h | 5052 | F: include/linux/i2c-pca-platform.h |
5053 | 5053 | ||
5054 | PCI ERROR RECOVERY | 5054 | PCI ERROR RECOVERY |
5055 | M: Linas Vepstas <linasvepstas@gmail.com> | 5055 | M: Linas Vepstas <linasvepstas@gmail.com> |
5056 | L: linux-pci@vger.kernel.org | 5056 | L: linux-pci@vger.kernel.org |
5057 | S: Supported | 5057 | S: Supported |
5058 | F: Documentation/PCI/pci-error-recovery.txt | 5058 | F: Documentation/PCI/pci-error-recovery.txt |
5059 | F: Documentation/powerpc/eeh-pci-error-recovery.txt | 5059 | F: Documentation/powerpc/eeh-pci-error-recovery.txt |
5060 | 5060 | ||
5061 | PCI SUBSYSTEM | 5061 | PCI SUBSYSTEM |
5062 | M: Jesse Barnes <jbarnes@virtuousgeek.org> | 5062 | M: Jesse Barnes <jbarnes@virtuousgeek.org> |
5063 | L: linux-pci@vger.kernel.org | 5063 | L: linux-pci@vger.kernel.org |
5064 | Q: http://patchwork.kernel.org/project/linux-pci/list/ | 5064 | Q: http://patchwork.kernel.org/project/linux-pci/list/ |
5065 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes/pci-2.6.git | 5065 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes/pci-2.6.git |
5066 | S: Supported | 5066 | S: Supported |
5067 | F: Documentation/PCI/ | 5067 | F: Documentation/PCI/ |
5068 | F: drivers/pci/ | 5068 | F: drivers/pci/ |
5069 | F: include/linux/pci* | 5069 | F: include/linux/pci* |
5070 | 5070 | ||
5071 | PCI HOTPLUG | 5071 | PCI HOTPLUG |
5072 | M: Jesse Barnes <jbarnes@virtuousgeek.org> | 5072 | M: Jesse Barnes <jbarnes@virtuousgeek.org> |
5073 | L: linux-pci@vger.kernel.org | 5073 | L: linux-pci@vger.kernel.org |
5074 | S: Supported | 5074 | S: Supported |
5075 | F: drivers/pci/hotplug | 5075 | F: drivers/pci/hotplug |
5076 | 5076 | ||
5077 | PCMCIA SUBSYSTEM | 5077 | PCMCIA SUBSYSTEM |
5078 | P: Linux PCMCIA Team | 5078 | P: Linux PCMCIA Team |
5079 | L: linux-pcmcia@lists.infradead.org | 5079 | L: linux-pcmcia@lists.infradead.org |
5080 | W: http://lists.infradead.org/mailman/listinfo/linux-pcmcia | 5080 | W: http://lists.infradead.org/mailman/listinfo/linux-pcmcia |
5081 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/brodo/pcmcia-2.6.git | 5081 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/brodo/pcmcia-2.6.git |
5082 | S: Maintained | 5082 | S: Maintained |
5083 | F: Documentation/pcmcia/ | 5083 | F: Documentation/pcmcia/ |
5084 | F: drivers/pcmcia/ | 5084 | F: drivers/pcmcia/ |
5085 | F: include/pcmcia/ | 5085 | F: include/pcmcia/ |
5086 | 5086 | ||
5087 | PCNET32 NETWORK DRIVER | 5087 | PCNET32 NETWORK DRIVER |
5088 | M: Don Fry <pcnet32@frontier.com> | 5088 | M: Don Fry <pcnet32@frontier.com> |
5089 | L: netdev@vger.kernel.org | 5089 | L: netdev@vger.kernel.org |
5090 | S: Maintained | 5090 | S: Maintained |
5091 | F: drivers/net/ethernet/amd/pcnet32.c | 5091 | F: drivers/net/ethernet/amd/pcnet32.c |
5092 | 5092 | ||
5093 | PCRYPT PARALLEL CRYPTO ENGINE | 5093 | PCRYPT PARALLEL CRYPTO ENGINE |
5094 | M: Steffen Klassert <steffen.klassert@secunet.com> | 5094 | M: Steffen Klassert <steffen.klassert@secunet.com> |
5095 | L: linux-crypto@vger.kernel.org | 5095 | L: linux-crypto@vger.kernel.org |
5096 | S: Maintained | 5096 | S: Maintained |
5097 | F: crypto/pcrypt.c | 5097 | F: crypto/pcrypt.c |
5098 | F: include/crypto/pcrypt.h | 5098 | F: include/crypto/pcrypt.h |
5099 | 5099 | ||
5100 | PER-CPU MEMORY ALLOCATOR | 5100 | PER-CPU MEMORY ALLOCATOR |
5101 | M: Tejun Heo <tj@kernel.org> | 5101 | M: Tejun Heo <tj@kernel.org> |
5102 | M: Christoph Lameter <cl@linux-foundation.org> | 5102 | M: Christoph Lameter <cl@linux-foundation.org> |
5103 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/percpu.git | 5103 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/percpu.git |
5104 | S: Maintained | 5104 | S: Maintained |
5105 | F: include/linux/percpu*.h | 5105 | F: include/linux/percpu*.h |
5106 | F: mm/percpu*.c | 5106 | F: mm/percpu*.c |
5107 | F: arch/*/include/asm/percpu.h | 5107 | F: arch/*/include/asm/percpu.h |
5108 | 5108 | ||
5109 | PER-TASK DELAY ACCOUNTING | 5109 | PER-TASK DELAY ACCOUNTING |
5110 | M: Balbir Singh <bsingharora@gmail.com> | 5110 | M: Balbir Singh <bsingharora@gmail.com> |
5111 | S: Maintained | 5111 | S: Maintained |
5112 | F: include/linux/delayacct.h | 5112 | F: include/linux/delayacct.h |
5113 | F: kernel/delayacct.c | 5113 | F: kernel/delayacct.c |
5114 | 5114 | ||
5115 | PERFORMANCE EVENTS SUBSYSTEM | 5115 | PERFORMANCE EVENTS SUBSYSTEM |
5116 | M: Peter Zijlstra <a.p.zijlstra@chello.nl> | 5116 | M: Peter Zijlstra <a.p.zijlstra@chello.nl> |
5117 | M: Paul Mackerras <paulus@samba.org> | 5117 | M: Paul Mackerras <paulus@samba.org> |
5118 | M: Ingo Molnar <mingo@elte.hu> | 5118 | M: Ingo Molnar <mingo@elte.hu> |
5119 | M: Arnaldo Carvalho de Melo <acme@ghostprotocols.net> | 5119 | M: Arnaldo Carvalho de Melo <acme@ghostprotocols.net> |
5120 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git perf/core | 5120 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git perf/core |
5121 | S: Supported | 5121 | S: Supported |
5122 | F: kernel/events/* | 5122 | F: kernel/events/* |
5123 | F: include/linux/perf_event.h | 5123 | F: include/linux/perf_event.h |
5124 | F: arch/*/kernel/perf_event*.c | 5124 | F: arch/*/kernel/perf_event*.c |
5125 | F: arch/*/kernel/*/perf_event*.c | 5125 | F: arch/*/kernel/*/perf_event*.c |
5126 | F: arch/*/kernel/*/*/perf_event*.c | 5126 | F: arch/*/kernel/*/*/perf_event*.c |
5127 | F: arch/*/include/asm/perf_event.h | 5127 | F: arch/*/include/asm/perf_event.h |
5128 | F: arch/*/lib/perf_event*.c | 5128 | F: arch/*/lib/perf_event*.c |
5129 | F: arch/*/kernel/perf_callchain.c | 5129 | F: arch/*/kernel/perf_callchain.c |
5130 | F: tools/perf/ | 5130 | F: tools/perf/ |
5131 | 5131 | ||
5132 | PERSONALITY HANDLING | 5132 | PERSONALITY HANDLING |
5133 | M: Christoph Hellwig <hch@infradead.org> | 5133 | M: Christoph Hellwig <hch@infradead.org> |
5134 | L: linux-abi-devel@lists.sourceforge.net | 5134 | L: linux-abi-devel@lists.sourceforge.net |
5135 | S: Maintained | 5135 | S: Maintained |
5136 | F: include/linux/personality.h | 5136 | F: include/linux/personality.h |
5137 | 5137 | ||
5138 | PHONET PROTOCOL | 5138 | PHONET PROTOCOL |
5139 | M: Remi Denis-Courmont <remi.denis-courmont@nokia.com> | 5139 | M: Remi Denis-Courmont <remi.denis-courmont@nokia.com> |
5140 | S: Supported | 5140 | S: Supported |
5141 | F: Documentation/networking/phonet.txt | 5141 | F: Documentation/networking/phonet.txt |
5142 | F: include/linux/phonet.h | 5142 | F: include/linux/phonet.h |
5143 | F: include/net/phonet/ | 5143 | F: include/net/phonet/ |
5144 | F: net/phonet/ | 5144 | F: net/phonet/ |
5145 | 5145 | ||
5146 | PHRAM MTD DRIVER | 5146 | PHRAM MTD DRIVER |
5147 | M: Joern Engel <joern@lazybastard.org> | 5147 | M: Joern Engel <joern@lazybastard.org> |
5148 | L: linux-mtd@lists.infradead.org | 5148 | L: linux-mtd@lists.infradead.org |
5149 | S: Maintained | 5149 | S: Maintained |
5150 | F: drivers/mtd/devices/phram.c | 5150 | F: drivers/mtd/devices/phram.c |
5151 | 5151 | ||
5152 | PICOXCELL SUPPORT | 5152 | PICOXCELL SUPPORT |
5153 | M: Jamie Iles <jamie@jamieiles.com> | 5153 | M: Jamie Iles <jamie@jamieiles.com> |
5154 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 5154 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
5155 | T: git git://github.com/jamieiles/linux-2.6-ji.git | 5155 | T: git git://github.com/jamieiles/linux-2.6-ji.git |
5156 | S: Supported | 5156 | S: Supported |
5157 | F: arch/arm/mach-picoxcell | 5157 | F: arch/arm/mach-picoxcell |
5158 | F: drivers/*/picoxcell* | 5158 | F: drivers/*/picoxcell* |
5159 | F: drivers/*/*/picoxcell* | 5159 | F: drivers/*/*/picoxcell* |
5160 | 5160 | ||
5161 | PIN CONTROL SUBSYSTEM | 5161 | PIN CONTROL SUBSYSTEM |
5162 | M: Linus Walleij <linus.walleij@linaro.org> | 5162 | M: Linus Walleij <linus.walleij@linaro.org> |
5163 | S: Maintained | 5163 | S: Maintained |
5164 | F: drivers/pinctrl/ | 5164 | F: drivers/pinctrl/ |
5165 | 5165 | ||
5166 | PKTCDVD DRIVER | 5166 | PKTCDVD DRIVER |
5167 | M: Peter Osterlund <petero2@telia.com> | 5167 | M: Peter Osterlund <petero2@telia.com> |
5168 | S: Maintained | 5168 | S: Maintained |
5169 | F: drivers/block/pktcdvd.c | 5169 | F: drivers/block/pktcdvd.c |
5170 | F: include/linux/pktcdvd.h | 5170 | F: include/linux/pktcdvd.h |
5171 | 5171 | ||
5172 | PKUNITY SOC DRIVERS | 5172 | PKUNITY SOC DRIVERS |
5173 | M: Guan Xuetao <gxt@mprc.pku.edu.cn> | 5173 | M: Guan Xuetao <gxt@mprc.pku.edu.cn> |
5174 | W: http://mprc.pku.edu.cn/~guanxuetao/linux | 5174 | W: http://mprc.pku.edu.cn/~guanxuetao/linux |
5175 | S: Maintained | 5175 | S: Maintained |
5176 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/epip/linux-2.6-unicore32.git | 5176 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/epip/linux-2.6-unicore32.git |
5177 | F: drivers/input/serio/i8042-unicore32io.h | 5177 | F: drivers/input/serio/i8042-unicore32io.h |
5178 | F: drivers/i2c/busses/i2c-puv3.c | 5178 | F: drivers/i2c/busses/i2c-puv3.c |
5179 | F: drivers/video/fb-puv3.c | 5179 | F: drivers/video/fb-puv3.c |
5180 | F: drivers/rtc/rtc-puv3.c | 5180 | F: drivers/rtc/rtc-puv3.c |
5181 | 5181 | ||
5182 | PMBUS HARDWARE MONITORING DRIVERS | 5182 | PMBUS HARDWARE MONITORING DRIVERS |
5183 | M: Guenter Roeck <guenter.roeck@ericsson.com> | 5183 | M: Guenter Roeck <guenter.roeck@ericsson.com> |
5184 | L: lm-sensors@lm-sensors.org | 5184 | L: lm-sensors@lm-sensors.org |
5185 | W: http://www.lm-sensors.org/ | 5185 | W: http://www.lm-sensors.org/ |
5186 | W: http://www.roeck-us.net/linux/drivers/ | 5186 | W: http://www.roeck-us.net/linux/drivers/ |
5187 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git | 5187 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git |
5188 | S: Maintained | 5188 | S: Maintained |
5189 | F: Documentation/hwmon/pmbus | 5189 | F: Documentation/hwmon/pmbus |
5190 | F: drivers/hwmon/pmbus/ | 5190 | F: drivers/hwmon/pmbus/ |
5191 | F: include/linux/i2c/pmbus.h | 5191 | F: include/linux/i2c/pmbus.h |
5192 | 5192 | ||
5193 | PMC SIERRA MaxRAID DRIVER | 5193 | PMC SIERRA MaxRAID DRIVER |
5194 | M: Anil Ravindranath <anil_ravindranath@pmc-sierra.com> | 5194 | M: Anil Ravindranath <anil_ravindranath@pmc-sierra.com> |
5195 | L: linux-scsi@vger.kernel.org | 5195 | L: linux-scsi@vger.kernel.org |
5196 | W: http://www.pmc-sierra.com/ | 5196 | W: http://www.pmc-sierra.com/ |
5197 | S: Supported | 5197 | S: Supported |
5198 | F: drivers/scsi/pmcraid.* | 5198 | F: drivers/scsi/pmcraid.* |
5199 | 5199 | ||
5200 | PMC SIERRA PM8001 DRIVER | 5200 | PMC SIERRA PM8001 DRIVER |
5201 | M: jack_wang@usish.com | 5201 | M: jack_wang@usish.com |
5202 | M: lindar_liu@usish.com | 5202 | M: lindar_liu@usish.com |
5203 | L: linux-scsi@vger.kernel.org | 5203 | L: linux-scsi@vger.kernel.org |
5204 | S: Supported | 5204 | S: Supported |
5205 | F: drivers/scsi/pm8001/ | 5205 | F: drivers/scsi/pm8001/ |
5206 | 5206 | ||
5207 | POSIX CLOCKS and TIMERS | 5207 | POSIX CLOCKS and TIMERS |
5208 | M: Thomas Gleixner <tglx@linutronix.de> | 5208 | M: Thomas Gleixner <tglx@linutronix.de> |
5209 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core | 5209 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core |
5210 | S: Supported | 5210 | S: Supported |
5211 | F: fs/timerfd.c | 5211 | F: fs/timerfd.c |
5212 | F: include/linux/timer* | 5212 | F: include/linux/timer* |
5213 | F: kernel/*timer* | 5213 | F: kernel/*timer* |
5214 | 5214 | ||
5215 | POWER SUPPLY CLASS/SUBSYSTEM and DRIVERS | 5215 | POWER SUPPLY CLASS/SUBSYSTEM and DRIVERS |
5216 | M: Anton Vorontsov <cbou@mail.ru> | 5216 | M: Anton Vorontsov <cbou@mail.ru> |
5217 | M: David Woodhouse <dwmw2@infradead.org> | 5217 | M: David Woodhouse <dwmw2@infradead.org> |
5218 | T: git git://git.infradead.org/battery-2.6.git | 5218 | T: git git://git.infradead.org/battery-2.6.git |
5219 | S: Maintained | 5219 | S: Maintained |
5220 | F: include/linux/power_supply.h | 5220 | F: include/linux/power_supply.h |
5221 | F: drivers/power/power_supply* | 5221 | F: drivers/power/power_supply* |
5222 | 5222 | ||
5223 | PNP SUPPORT | 5223 | PNP SUPPORT |
5224 | M: Adam Belay <abelay@mit.edu> | 5224 | M: Adam Belay <abelay@mit.edu> |
5225 | M: Bjorn Helgaas <bhelgaas@google.com> | 5225 | M: Bjorn Helgaas <bhelgaas@google.com> |
5226 | S: Maintained | 5226 | S: Maintained |
5227 | F: drivers/pnp/ | 5227 | F: drivers/pnp/ |
5228 | 5228 | ||
5229 | PNXxxxx I2C DRIVER | 5229 | PNXxxxx I2C DRIVER |
5230 | M: Vitaly Wool <vitalywool@gmail.com> | 5230 | M: Vitaly Wool <vitalywool@gmail.com> |
5231 | L: linux-i2c@vger.kernel.org | 5231 | L: linux-i2c@vger.kernel.org |
5232 | S: Maintained | 5232 | S: Maintained |
5233 | F: drivers/i2c/busses/i2c-pnx.c | 5233 | F: drivers/i2c/busses/i2c-pnx.c |
5234 | 5234 | ||
5235 | PPP PROTOCOL DRIVERS AND COMPRESSORS | 5235 | PPP PROTOCOL DRIVERS AND COMPRESSORS |
5236 | M: Paul Mackerras <paulus@samba.org> | 5236 | M: Paul Mackerras <paulus@samba.org> |
5237 | L: linux-ppp@vger.kernel.org | 5237 | L: linux-ppp@vger.kernel.org |
5238 | S: Maintained | 5238 | S: Maintained |
5239 | F: drivers/net/ppp/ppp_* | 5239 | F: drivers/net/ppp/ppp_* |
5240 | 5240 | ||
5241 | PPP OVER ATM (RFC 2364) | 5241 | PPP OVER ATM (RFC 2364) |
5242 | M: Mitchell Blank Jr <mitch@sfgoth.com> | 5242 | M: Mitchell Blank Jr <mitch@sfgoth.com> |
5243 | S: Maintained | 5243 | S: Maintained |
5244 | F: net/atm/pppoatm.c | 5244 | F: net/atm/pppoatm.c |
5245 | F: include/linux/atmppp.h | 5245 | F: include/linux/atmppp.h |
5246 | 5246 | ||
5247 | PPP OVER ETHERNET | 5247 | PPP OVER ETHERNET |
5248 | M: Michal Ostrowski <mostrows@earthlink.net> | 5248 | M: Michal Ostrowski <mostrows@earthlink.net> |
5249 | S: Maintained | 5249 | S: Maintained |
5250 | F: drivers/net/ppp/pppoe.c | 5250 | F: drivers/net/ppp/pppoe.c |
5251 | F: drivers/net/ppp/pppox.c | 5251 | F: drivers/net/ppp/pppox.c |
5252 | 5252 | ||
5253 | PPP OVER L2TP | 5253 | PPP OVER L2TP |
5254 | M: James Chapman <jchapman@katalix.com> | 5254 | M: James Chapman <jchapman@katalix.com> |
5255 | S: Maintained | 5255 | S: Maintained |
5256 | F: net/l2tp/l2tp_ppp.c | 5256 | F: net/l2tp/l2tp_ppp.c |
5257 | F: include/linux/if_pppol2tp.h | 5257 | F: include/linux/if_pppol2tp.h |
5258 | 5258 | ||
5259 | PPS SUPPORT | 5259 | PPS SUPPORT |
5260 | M: Rodolfo Giometti <giometti@enneenne.com> | 5260 | M: Rodolfo Giometti <giometti@enneenne.com> |
5261 | W: http://wiki.enneenne.com/index.php/LinuxPPS_support | 5261 | W: http://wiki.enneenne.com/index.php/LinuxPPS_support |
5262 | L: linuxpps@ml.enneenne.com (subscribers-only) | 5262 | L: linuxpps@ml.enneenne.com (subscribers-only) |
5263 | S: Maintained | 5263 | S: Maintained |
5264 | F: Documentation/pps/ | 5264 | F: Documentation/pps/ |
5265 | F: drivers/pps/ | 5265 | F: drivers/pps/ |
5266 | F: include/linux/pps*.h | 5266 | F: include/linux/pps*.h |
5267 | 5267 | ||
5268 | PPTP DRIVER | 5268 | PPTP DRIVER |
5269 | M: Dmitry Kozlov <xeb@mail.ru> | 5269 | M: Dmitry Kozlov <xeb@mail.ru> |
5270 | L: netdev@vger.kernel.org | 5270 | L: netdev@vger.kernel.org |
5271 | S: Maintained | 5271 | S: Maintained |
5272 | F: drivers/net/ppp/pptp.c | 5272 | F: drivers/net/ppp/pptp.c |
5273 | W: http://sourceforge.net/projects/accel-pptp | 5273 | W: http://sourceforge.net/projects/accel-pptp |
5274 | 5274 | ||
5275 | PREEMPTIBLE KERNEL | 5275 | PREEMPTIBLE KERNEL |
5276 | M: Robert Love <rml@tech9.net> | 5276 | M: Robert Love <rml@tech9.net> |
5277 | L: kpreempt-tech@lists.sourceforge.net | 5277 | L: kpreempt-tech@lists.sourceforge.net |
5278 | W: ftp://ftp.kernel.org/pub/linux/kernel/people/rml/preempt-kernel | 5278 | W: ftp://ftp.kernel.org/pub/linux/kernel/people/rml/preempt-kernel |
5279 | S: Supported | 5279 | S: Supported |
5280 | F: Documentation/preempt-locking.txt | 5280 | F: Documentation/preempt-locking.txt |
5281 | F: include/linux/preempt.h | 5281 | F: include/linux/preempt.h |
5282 | 5282 | ||
5283 | PRISM54 WIRELESS DRIVER | 5283 | PRISM54 WIRELESS DRIVER |
5284 | M: "Luis R. Rodriguez" <mcgrof@gmail.com> | 5284 | M: "Luis R. Rodriguez" <mcgrof@gmail.com> |
5285 | L: linux-wireless@vger.kernel.org | 5285 | L: linux-wireless@vger.kernel.org |
5286 | W: http://wireless.kernel.org/en/users/Drivers/p54 | 5286 | W: http://wireless.kernel.org/en/users/Drivers/p54 |
5287 | S: Obsolete | 5287 | S: Obsolete |
5288 | F: drivers/net/wireless/prism54/ | 5288 | F: drivers/net/wireless/prism54/ |
5289 | 5289 | ||
5290 | PROMISE SATA TX2/TX4 CONTROLLER LIBATA DRIVER | 5290 | PROMISE SATA TX2/TX4 CONTROLLER LIBATA DRIVER |
5291 | M: Mikael Pettersson <mikpe@it.uu.se> | 5291 | M: Mikael Pettersson <mikpe@it.uu.se> |
5292 | L: linux-ide@vger.kernel.org | 5292 | L: linux-ide@vger.kernel.org |
5293 | S: Maintained | 5293 | S: Maintained |
5294 | F: drivers/ata/sata_promise.* | 5294 | F: drivers/ata/sata_promise.* |
5295 | 5295 | ||
5296 | PS3 NETWORK SUPPORT | 5296 | PS3 NETWORK SUPPORT |
5297 | M: Geoff Levand <geoff@infradead.org> | 5297 | M: Geoff Levand <geoff@infradead.org> |
5298 | L: netdev@vger.kernel.org | 5298 | L: netdev@vger.kernel.org |
5299 | L: cbe-oss-dev@lists.ozlabs.org | 5299 | L: cbe-oss-dev@lists.ozlabs.org |
5300 | S: Maintained | 5300 | S: Maintained |
5301 | F: drivers/net/ethernet/toshiba/ps3_gelic_net.* | 5301 | F: drivers/net/ethernet/toshiba/ps3_gelic_net.* |
5302 | 5302 | ||
5303 | PS3 PLATFORM SUPPORT | 5303 | PS3 PLATFORM SUPPORT |
5304 | M: Geoff Levand <geoff@infradead.org> | 5304 | M: Geoff Levand <geoff@infradead.org> |
5305 | L: linuxppc-dev@lists.ozlabs.org | 5305 | L: linuxppc-dev@lists.ozlabs.org |
5306 | L: cbe-oss-dev@lists.ozlabs.org | 5306 | L: cbe-oss-dev@lists.ozlabs.org |
5307 | S: Maintained | 5307 | S: Maintained |
5308 | F: arch/powerpc/boot/ps3* | 5308 | F: arch/powerpc/boot/ps3* |
5309 | F: arch/powerpc/include/asm/lv1call.h | 5309 | F: arch/powerpc/include/asm/lv1call.h |
5310 | F: arch/powerpc/include/asm/ps3*.h | 5310 | F: arch/powerpc/include/asm/ps3*.h |
5311 | F: arch/powerpc/platforms/ps3/ | 5311 | F: arch/powerpc/platforms/ps3/ |
5312 | F: drivers/*/ps3* | 5312 | F: drivers/*/ps3* |
5313 | F: drivers/ps3/ | 5313 | F: drivers/ps3/ |
5314 | F: drivers/rtc/rtc-ps3.c | 5314 | F: drivers/rtc/rtc-ps3.c |
5315 | F: drivers/usb/host/*ps3.c | 5315 | F: drivers/usb/host/*ps3.c |
5316 | F: sound/ppc/snd_ps3* | 5316 | F: sound/ppc/snd_ps3* |
5317 | 5317 | ||
5318 | PS3VRAM DRIVER | 5318 | PS3VRAM DRIVER |
5319 | M: Jim Paris <jim@jtan.com> | 5319 | M: Jim Paris <jim@jtan.com> |
5320 | L: cbe-oss-dev@lists.ozlabs.org | 5320 | L: cbe-oss-dev@lists.ozlabs.org |
5321 | S: Maintained | 5321 | S: Maintained |
5322 | F: drivers/block/ps3vram.c | 5322 | F: drivers/block/ps3vram.c |
5323 | 5323 | ||
5324 | PTRACE SUPPORT | 5324 | PTRACE SUPPORT |
5325 | M: Roland McGrath <roland@redhat.com> | 5325 | M: Roland McGrath <roland@redhat.com> |
5326 | M: Oleg Nesterov <oleg@redhat.com> | 5326 | M: Oleg Nesterov <oleg@redhat.com> |
5327 | S: Maintained | 5327 | S: Maintained |
5328 | F: include/asm-generic/syscall.h | 5328 | F: include/asm-generic/syscall.h |
5329 | F: include/linux/ptrace.h | 5329 | F: include/linux/ptrace.h |
5330 | F: include/linux/regset.h | 5330 | F: include/linux/regset.h |
5331 | F: include/linux/tracehook.h | 5331 | F: include/linux/tracehook.h |
5332 | F: kernel/ptrace.c | 5332 | F: kernel/ptrace.c |
5333 | 5333 | ||
5334 | PVRUSB2 VIDEO4LINUX DRIVER | 5334 | PVRUSB2 VIDEO4LINUX DRIVER |
5335 | M: Mike Isely <isely@pobox.com> | 5335 | M: Mike Isely <isely@pobox.com> |
5336 | L: pvrusb2@isely.net (subscribers-only) | 5336 | L: pvrusb2@isely.net (subscribers-only) |
5337 | L: linux-media@vger.kernel.org | 5337 | L: linux-media@vger.kernel.org |
5338 | W: http://www.isely.net/pvrusb2/ | 5338 | W: http://www.isely.net/pvrusb2/ |
5339 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git | 5339 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git |
5340 | S: Maintained | 5340 | S: Maintained |
5341 | F: Documentation/video4linux/README.pvrusb2 | 5341 | F: Documentation/video4linux/README.pvrusb2 |
5342 | F: drivers/media/video/pvrusb2/ | 5342 | F: drivers/media/video/pvrusb2/ |
5343 | 5343 | ||
5344 | PXA2xx/PXA3xx SUPPORT | 5344 | PXA2xx/PXA3xx SUPPORT |
5345 | M: Eric Miao <eric.y.miao@gmail.com> | 5345 | M: Eric Miao <eric.y.miao@gmail.com> |
5346 | M: Russell King <linux@arm.linux.org.uk> | 5346 | M: Russell King <linux@arm.linux.org.uk> |
5347 | M: Haojian Zhuang <haojian.zhuang@marvell.com> | 5347 | M: Haojian Zhuang <haojian.zhuang@marvell.com> |
5348 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 5348 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
5349 | T: git git://github.com/hzhuang1/linux.git | 5349 | T: git git://github.com/hzhuang1/linux.git |
5350 | T: git git://git.linaro.org/people/ycmiao/pxa-linux.git | 5350 | T: git git://git.linaro.org/people/ycmiao/pxa-linux.git |
5351 | S: Maintained | 5351 | S: Maintained |
5352 | F: arch/arm/mach-pxa/ | 5352 | F: arch/arm/mach-pxa/ |
5353 | F: drivers/pcmcia/pxa2xx* | 5353 | F: drivers/pcmcia/pxa2xx* |
5354 | F: drivers/spi/spi-pxa2xx* | 5354 | F: drivers/spi/spi-pxa2xx* |
5355 | F: drivers/usb/gadget/pxa2* | 5355 | F: drivers/usb/gadget/pxa2* |
5356 | F: include/sound/pxa2xx-lib.h | 5356 | F: include/sound/pxa2xx-lib.h |
5357 | F: sound/arm/pxa* | 5357 | F: sound/arm/pxa* |
5358 | F: sound/soc/pxa | 5358 | F: sound/soc/pxa |
5359 | 5359 | ||
5360 | MMP SUPPORT | 5360 | MMP SUPPORT |
5361 | M: Eric Miao <eric.y.miao@gmail.com> | 5361 | M: Eric Miao <eric.y.miao@gmail.com> |
5362 | M: Haojian Zhuang <haojian.zhuang@marvell.com> | 5362 | M: Haojian Zhuang <haojian.zhuang@marvell.com> |
5363 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 5363 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
5364 | T: git git://github.com/hzhuang1/linux.git | 5364 | T: git git://github.com/hzhuang1/linux.git |
5365 | T: git git://git.linaro.org/people/ycmiao/pxa-linux.git | 5365 | T: git git://git.linaro.org/people/ycmiao/pxa-linux.git |
5366 | S: Maintained | 5366 | S: Maintained |
5367 | F: arch/arm/mach-mmp/ | 5367 | F: arch/arm/mach-mmp/ |
5368 | 5368 | ||
5369 | PXA MMCI DRIVER | 5369 | PXA MMCI DRIVER |
5370 | S: Orphan | 5370 | S: Orphan |
5371 | 5371 | ||
5372 | PXA RTC DRIVER | 5372 | PXA RTC DRIVER |
5373 | M: Robert Jarzmik <robert.jarzmik@free.fr> | 5373 | M: Robert Jarzmik <robert.jarzmik@free.fr> |
5374 | L: rtc-linux@googlegroups.com | 5374 | L: rtc-linux@googlegroups.com |
5375 | S: Maintained | 5375 | S: Maintained |
5376 | 5376 | ||
5377 | QIB DRIVER | 5377 | QIB DRIVER |
5378 | M: Mike Marciniszyn <infinipath@qlogic.com> | 5378 | M: Mike Marciniszyn <infinipath@qlogic.com> |
5379 | L: linux-rdma@vger.kernel.org | 5379 | L: linux-rdma@vger.kernel.org |
5380 | S: Supported | 5380 | S: Supported |
5381 | F: drivers/infiniband/hw/qib/ | 5381 | F: drivers/infiniband/hw/qib/ |
5382 | 5382 | ||
5383 | QLOGIC QLA1280 SCSI DRIVER | 5383 | QLOGIC QLA1280 SCSI DRIVER |
5384 | M: Michael Reed <mdr@sgi.com> | 5384 | M: Michael Reed <mdr@sgi.com> |
5385 | L: linux-scsi@vger.kernel.org | 5385 | L: linux-scsi@vger.kernel.org |
5386 | S: Maintained | 5386 | S: Maintained |
5387 | F: drivers/scsi/qla1280.[ch] | 5387 | F: drivers/scsi/qla1280.[ch] |
5388 | 5388 | ||
5389 | QLOGIC QLA2XXX FC-SCSI DRIVER | 5389 | QLOGIC QLA2XXX FC-SCSI DRIVER |
5390 | M: Andrew Vasquez <andrew.vasquez@qlogic.com> | 5390 | M: Andrew Vasquez <andrew.vasquez@qlogic.com> |
5391 | M: linux-driver@qlogic.com | 5391 | M: linux-driver@qlogic.com |
5392 | L: linux-scsi@vger.kernel.org | 5392 | L: linux-scsi@vger.kernel.org |
5393 | S: Supported | 5393 | S: Supported |
5394 | F: Documentation/scsi/LICENSE.qla2xxx | 5394 | F: Documentation/scsi/LICENSE.qla2xxx |
5395 | F: drivers/scsi/qla2xxx/ | 5395 | F: drivers/scsi/qla2xxx/ |
5396 | 5396 | ||
5397 | QLOGIC QLA4XXX iSCSI DRIVER | 5397 | QLOGIC QLA4XXX iSCSI DRIVER |
5398 | M: Ravi Anand <ravi.anand@qlogic.com> | 5398 | M: Ravi Anand <ravi.anand@qlogic.com> |
5399 | M: Vikas Chaudhary <vikas.chaudhary@qlogic.com> | 5399 | M: Vikas Chaudhary <vikas.chaudhary@qlogic.com> |
5400 | M: iscsi-driver@qlogic.com | 5400 | M: iscsi-driver@qlogic.com |
5401 | L: linux-scsi@vger.kernel.org | 5401 | L: linux-scsi@vger.kernel.org |
5402 | S: Supported | 5402 | S: Supported |
5403 | F: drivers/scsi/qla4xxx/ | 5403 | F: drivers/scsi/qla4xxx/ |
5404 | 5404 | ||
5405 | QLOGIC QLA3XXX NETWORK DRIVER | 5405 | QLOGIC QLA3XXX NETWORK DRIVER |
5406 | M: Jitendra Kalsaria <jitendra.kalsaria@qlogic.com> | 5406 | M: Jitendra Kalsaria <jitendra.kalsaria@qlogic.com> |
5407 | M: Ron Mercer <ron.mercer@qlogic.com> | 5407 | M: Ron Mercer <ron.mercer@qlogic.com> |
5408 | M: linux-driver@qlogic.com | 5408 | M: linux-driver@qlogic.com |
5409 | L: netdev@vger.kernel.org | 5409 | L: netdev@vger.kernel.org |
5410 | S: Supported | 5410 | S: Supported |
5411 | F: Documentation/networking/LICENSE.qla3xxx | 5411 | F: Documentation/networking/LICENSE.qla3xxx |
5412 | F: drivers/net/ethernet/qlogic/qla3xxx.* | 5412 | F: drivers/net/ethernet/qlogic/qla3xxx.* |
5413 | 5413 | ||
5414 | QLOGIC QLCNIC (1/10)Gb ETHERNET DRIVER | 5414 | QLOGIC QLCNIC (1/10)Gb ETHERNET DRIVER |
5415 | M: Anirban Chakraborty <anirban.chakraborty@qlogic.com> | 5415 | M: Anirban Chakraborty <anirban.chakraborty@qlogic.com> |
5416 | M: Sony Chacko <sony.chacko@qlogic.com> | 5416 | M: Sony Chacko <sony.chacko@qlogic.com> |
5417 | M: linux-driver@qlogic.com | 5417 | M: linux-driver@qlogic.com |
5418 | L: netdev@vger.kernel.org | 5418 | L: netdev@vger.kernel.org |
5419 | S: Supported | 5419 | S: Supported |
5420 | F: drivers/net/ethernet/qlogic/qlcnic/ | 5420 | F: drivers/net/ethernet/qlogic/qlcnic/ |
5421 | 5421 | ||
5422 | QLOGIC QLGE 10Gb ETHERNET DRIVER | 5422 | QLOGIC QLGE 10Gb ETHERNET DRIVER |
5423 | M: Anirban Chakraborty <anirban.chakraborty@qlogic.com> | 5423 | M: Anirban Chakraborty <anirban.chakraborty@qlogic.com> |
5424 | M: Jitendra Kalsaria <jitendra.kalsaria@qlogic.com> | 5424 | M: Jitendra Kalsaria <jitendra.kalsaria@qlogic.com> |
5425 | M: Ron Mercer <ron.mercer@qlogic.com> | 5425 | M: Ron Mercer <ron.mercer@qlogic.com> |
5426 | M: linux-driver@qlogic.com | 5426 | M: linux-driver@qlogic.com |
5427 | L: netdev@vger.kernel.org | 5427 | L: netdev@vger.kernel.org |
5428 | S: Supported | 5428 | S: Supported |
5429 | F: drivers/net/ethernet/qlogic/qlge/ | 5429 | F: drivers/net/ethernet/qlogic/qlge/ |
5430 | 5430 | ||
5431 | QNX4 FILESYSTEM | 5431 | QNX4 FILESYSTEM |
5432 | M: Anders Larsen <al@alarsen.net> | 5432 | M: Anders Larsen <al@alarsen.net> |
5433 | W: http://www.alarsen.net/linux/qnx4fs/ | 5433 | W: http://www.alarsen.net/linux/qnx4fs/ |
5434 | S: Maintained | 5434 | S: Maintained |
5435 | F: fs/qnx4/ | 5435 | F: fs/qnx4/ |
5436 | F: include/linux/qnx4_fs.h | 5436 | F: include/linux/qnx4_fs.h |
5437 | F: include/linux/qnxtypes.h | 5437 | F: include/linux/qnxtypes.h |
5438 | 5438 | ||
5439 | QUALCOMM HEXAGON ARCHITECTURE | 5439 | QUALCOMM HEXAGON ARCHITECTURE |
5440 | M: Richard Kuo <rkuo@codeaurora.org> | 5440 | M: Richard Kuo <rkuo@codeaurora.org> |
5441 | L: linux-hexagon@vger.kernel.org | 5441 | L: linux-hexagon@vger.kernel.org |
5442 | S: Supported | 5442 | S: Supported |
5443 | F: arch/hexagon/ | 5443 | F: arch/hexagon/ |
5444 | 5444 | ||
5445 | RADOS BLOCK DEVICE (RBD) | 5445 | RADOS BLOCK DEVICE (RBD) |
5446 | F: include/linux/qnxtypes.h | 5446 | F: include/linux/qnxtypes.h |
5447 | M: Yehuda Sadeh <yehuda@hq.newdream.net> | 5447 | M: Yehuda Sadeh <yehuda@hq.newdream.net> |
5448 | M: Sage Weil <sage@newdream.net> | 5448 | M: Sage Weil <sage@newdream.net> |
5449 | M: ceph-devel@vger.kernel.org | 5449 | M: ceph-devel@vger.kernel.org |
5450 | S: Supported | 5450 | S: Supported |
5451 | F: drivers/block/rbd.c | 5451 | F: drivers/block/rbd.c |
5452 | F: drivers/block/rbd_types.h | 5452 | F: drivers/block/rbd_types.h |
5453 | 5453 | ||
5454 | RADEON FRAMEBUFFER DISPLAY DRIVER | 5454 | RADEON FRAMEBUFFER DISPLAY DRIVER |
5455 | M: Benjamin Herrenschmidt <benh@kernel.crashing.org> | 5455 | M: Benjamin Herrenschmidt <benh@kernel.crashing.org> |
5456 | L: linux-fbdev@vger.kernel.org | 5456 | L: linux-fbdev@vger.kernel.org |
5457 | S: Maintained | 5457 | S: Maintained |
5458 | F: drivers/video/aty/radeon* | 5458 | F: drivers/video/aty/radeon* |
5459 | F: include/linux/radeonfb.h | 5459 | F: include/linux/radeonfb.h |
5460 | 5460 | ||
5461 | RAGE128 FRAMEBUFFER DISPLAY DRIVER | 5461 | RAGE128 FRAMEBUFFER DISPLAY DRIVER |
5462 | M: Paul Mackerras <paulus@samba.org> | 5462 | M: Paul Mackerras <paulus@samba.org> |
5463 | L: linux-fbdev@vger.kernel.org | 5463 | L: linux-fbdev@vger.kernel.org |
5464 | S: Maintained | 5464 | S: Maintained |
5465 | F: drivers/video/aty/aty128fb.c | 5465 | F: drivers/video/aty/aty128fb.c |
5466 | 5466 | ||
5467 | RALINK RT2X00 WIRELESS LAN DRIVER | 5467 | RALINK RT2X00 WIRELESS LAN DRIVER |
5468 | P: rt2x00 project | 5468 | P: rt2x00 project |
5469 | M: Ivo van Doorn <IvDoorn@gmail.com> | 5469 | M: Ivo van Doorn <IvDoorn@gmail.com> |
5470 | M: Gertjan van Wingerde <gwingerde@gmail.com> | 5470 | M: Gertjan van Wingerde <gwingerde@gmail.com> |
5471 | M: Helmut Schaa <helmut.schaa@googlemail.com> | 5471 | M: Helmut Schaa <helmut.schaa@googlemail.com> |
5472 | L: linux-wireless@vger.kernel.org | 5472 | L: linux-wireless@vger.kernel.org |
5473 | L: users@rt2x00.serialmonkey.com (moderated for non-subscribers) | 5473 | L: users@rt2x00.serialmonkey.com (moderated for non-subscribers) |
5474 | W: http://rt2x00.serialmonkey.com/ | 5474 | W: http://rt2x00.serialmonkey.com/ |
5475 | S: Maintained | 5475 | S: Maintained |
5476 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/ivd/rt2x00.git | 5476 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/ivd/rt2x00.git |
5477 | F: drivers/net/wireless/rt2x00/ | 5477 | F: drivers/net/wireless/rt2x00/ |
5478 | 5478 | ||
5479 | RAMDISK RAM BLOCK DEVICE DRIVER | 5479 | RAMDISK RAM BLOCK DEVICE DRIVER |
5480 | M: Nick Piggin <npiggin@kernel.dk> | 5480 | M: Nick Piggin <npiggin@kernel.dk> |
5481 | S: Maintained | 5481 | S: Maintained |
5482 | F: Documentation/blockdev/ramdisk.txt | 5482 | F: Documentation/blockdev/ramdisk.txt |
5483 | F: drivers/block/brd.c | 5483 | F: drivers/block/brd.c |
5484 | 5484 | ||
5485 | RANDOM NUMBER DRIVER | 5485 | RANDOM NUMBER DRIVER |
5486 | M: Matt Mackall <mpm@selenic.com> | 5486 | M: Matt Mackall <mpm@selenic.com> |
5487 | S: Maintained | 5487 | S: Maintained |
5488 | F: drivers/char/random.c | 5488 | F: drivers/char/random.c |
5489 | 5489 | ||
5490 | RAPIDIO SUBSYSTEM | 5490 | RAPIDIO SUBSYSTEM |
5491 | M: Matt Porter <mporter@kernel.crashing.org> | 5491 | M: Matt Porter <mporter@kernel.crashing.org> |
5492 | M: Alexandre Bounine <alexandre.bounine@idt.com> | 5492 | M: Alexandre Bounine <alexandre.bounine@idt.com> |
5493 | S: Maintained | 5493 | S: Maintained |
5494 | F: drivers/rapidio/ | 5494 | F: drivers/rapidio/ |
5495 | 5495 | ||
5496 | RAYLINK/WEBGEAR 802.11 WIRELESS LAN DRIVER | 5496 | RAYLINK/WEBGEAR 802.11 WIRELESS LAN DRIVER |
5497 | L: linux-wireless@vger.kernel.org | 5497 | L: linux-wireless@vger.kernel.org |
5498 | S: Orphan | 5498 | S: Orphan |
5499 | F: drivers/net/wireless/ray* | 5499 | F: drivers/net/wireless/ray* |
5500 | 5500 | ||
5501 | RCUTORTURE MODULE | 5501 | RCUTORTURE MODULE |
5502 | M: Josh Triplett <josh@freedesktop.org> | 5502 | M: Josh Triplett <josh@freedesktop.org> |
5503 | M: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> | 5503 | M: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> |
5504 | S: Supported | 5504 | S: Supported |
5505 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-2.6-rcu.git | 5505 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-2.6-rcu.git |
5506 | F: Documentation/RCU/torture.txt | 5506 | F: Documentation/RCU/torture.txt |
5507 | F: kernel/rcutorture.c | 5507 | F: kernel/rcutorture.c |
5508 | 5508 | ||
5509 | RDC R-321X SoC | 5509 | RDC R-321X SoC |
5510 | M: Florian Fainelli <florian@openwrt.org> | 5510 | M: Florian Fainelli <florian@openwrt.org> |
5511 | S: Maintained | 5511 | S: Maintained |
5512 | 5512 | ||
5513 | RDC R6040 FAST ETHERNET DRIVER | 5513 | RDC R6040 FAST ETHERNET DRIVER |
5514 | M: Florian Fainelli <florian@openwrt.org> | 5514 | M: Florian Fainelli <florian@openwrt.org> |
5515 | L: netdev@vger.kernel.org | 5515 | L: netdev@vger.kernel.org |
5516 | S: Maintained | 5516 | S: Maintained |
5517 | F: drivers/net/ethernet/rdc/r6040.c | 5517 | F: drivers/net/ethernet/rdc/r6040.c |
5518 | 5518 | ||
5519 | RDS - RELIABLE DATAGRAM SOCKETS | 5519 | RDS - RELIABLE DATAGRAM SOCKETS |
5520 | M: Venkat Venkatsubra <venkat.x.venkatsubra@oracle.com> | 5520 | M: Venkat Venkatsubra <venkat.x.venkatsubra@oracle.com> |
5521 | L: rds-devel@oss.oracle.com (moderated for non-subscribers) | 5521 | L: rds-devel@oss.oracle.com (moderated for non-subscribers) |
5522 | S: Supported | 5522 | S: Supported |
5523 | F: net/rds/ | 5523 | F: net/rds/ |
5524 | 5524 | ||
5525 | READ-COPY UPDATE (RCU) | 5525 | READ-COPY UPDATE (RCU) |
5526 | M: Dipankar Sarma <dipankar@in.ibm.com> | 5526 | M: Dipankar Sarma <dipankar@in.ibm.com> |
5527 | M: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> | 5527 | M: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> |
5528 | W: http://www.rdrop.com/users/paulmck/rclock/ | 5528 | W: http://www.rdrop.com/users/paulmck/rclock/ |
5529 | S: Supported | 5529 | S: Supported |
5530 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-2.6-rcu.git | 5530 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-2.6-rcu.git |
5531 | F: Documentation/RCU/ | 5531 | F: Documentation/RCU/ |
5532 | F: include/linux/rcu* | 5532 | F: include/linux/rcu* |
5533 | F: include/linux/srcu* | 5533 | F: include/linux/srcu* |
5534 | F: kernel/rcu* | 5534 | F: kernel/rcu* |
5535 | F: kernel/srcu* | 5535 | F: kernel/srcu* |
5536 | X: kernel/rcutorture.c | 5536 | X: kernel/rcutorture.c |
5537 | 5537 | ||
5538 | REAL TIME CLOCK (RTC) SUBSYSTEM | 5538 | REAL TIME CLOCK (RTC) SUBSYSTEM |
5539 | M: Alessandro Zummo <a.zummo@towertech.it> | 5539 | M: Alessandro Zummo <a.zummo@towertech.it> |
5540 | L: rtc-linux@googlegroups.com | 5540 | L: rtc-linux@googlegroups.com |
5541 | Q: http://patchwork.ozlabs.org/project/rtc-linux/list/ | 5541 | Q: http://patchwork.ozlabs.org/project/rtc-linux/list/ |
5542 | S: Maintained | 5542 | S: Maintained |
5543 | F: Documentation/rtc.txt | 5543 | F: Documentation/rtc.txt |
5544 | F: drivers/rtc/ | 5544 | F: drivers/rtc/ |
5545 | F: include/linux/rtc.h | 5545 | F: include/linux/rtc.h |
5546 | 5546 | ||
5547 | REISERFS FILE SYSTEM | 5547 | REISERFS FILE SYSTEM |
5548 | L: reiserfs-devel@vger.kernel.org | 5548 | L: reiserfs-devel@vger.kernel.org |
5549 | S: Supported | 5549 | S: Supported |
5550 | F: fs/reiserfs/ | 5550 | F: fs/reiserfs/ |
5551 | 5551 | ||
5552 | REGISTER MAP ABSTRACTION | 5552 | REGISTER MAP ABSTRACTION |
5553 | M: Mark Brown <broonie@opensource.wolfsonmicro.com> | 5553 | M: Mark Brown <broonie@opensource.wolfsonmicro.com> |
5554 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap.git | 5554 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap.git |
5555 | S: Supported | 5555 | S: Supported |
5556 | F: drivers/base/regmap/ | 5556 | F: drivers/base/regmap/ |
5557 | F: include/linux/regmap.h | 5557 | F: include/linux/regmap.h |
5558 | 5558 | ||
5559 | RFKILL | 5559 | RFKILL |
5560 | M: Johannes Berg <johannes@sipsolutions.net> | 5560 | M: Johannes Berg <johannes@sipsolutions.net> |
5561 | L: linux-wireless@vger.kernel.org | 5561 | L: linux-wireless@vger.kernel.org |
5562 | S: Maintained | 5562 | S: Maintained |
5563 | F: Documentation/rfkill.txt | 5563 | F: Documentation/rfkill.txt |
5564 | F: net/rfkill/ | 5564 | F: net/rfkill/ |
5565 | 5565 | ||
5566 | RICOH SMARTMEDIA/XD DRIVER | 5566 | RICOH SMARTMEDIA/XD DRIVER |
5567 | M: Maxim Levitsky <maximlevitsky@gmail.com> | 5567 | M: Maxim Levitsky <maximlevitsky@gmail.com> |
5568 | S: Maintained | 5568 | S: Maintained |
5569 | F: drivers/mtd/nand/r852.c | 5569 | F: drivers/mtd/nand/r852.c |
5570 | F: drivers/mtd/nand/r852.h | 5570 | F: drivers/mtd/nand/r852.h |
5571 | 5571 | ||
5572 | RICOH R5C592 MEMORYSTICK DRIVER | 5572 | RICOH R5C592 MEMORYSTICK DRIVER |
5573 | M: Maxim Levitsky <maximlevitsky@gmail.com> | 5573 | M: Maxim Levitsky <maximlevitsky@gmail.com> |
5574 | S: Maintained | 5574 | S: Maintained |
5575 | F: drivers/memstick/host/r592.* | 5575 | F: drivers/memstick/host/r592.* |
5576 | 5576 | ||
5577 | ROCKETPORT DRIVER | 5577 | ROCKETPORT DRIVER |
5578 | P: Comtrol Corp. | 5578 | P: Comtrol Corp. |
5579 | W: http://www.comtrol.com | 5579 | W: http://www.comtrol.com |
5580 | S: Maintained | 5580 | S: Maintained |
5581 | F: Documentation/serial/rocket.txt | 5581 | F: Documentation/serial/rocket.txt |
5582 | F: drivers/tty/rocket* | 5582 | F: drivers/tty/rocket* |
5583 | 5583 | ||
5584 | ROSE NETWORK LAYER | 5584 | ROSE NETWORK LAYER |
5585 | M: Ralf Baechle <ralf@linux-mips.org> | 5585 | M: Ralf Baechle <ralf@linux-mips.org> |
5586 | L: linux-hams@vger.kernel.org | 5586 | L: linux-hams@vger.kernel.org |
5587 | W: http://www.linux-ax25.org/ | 5587 | W: http://www.linux-ax25.org/ |
5588 | S: Maintained | 5588 | S: Maintained |
5589 | F: include/linux/rose.h | 5589 | F: include/linux/rose.h |
5590 | F: include/net/rose.h | 5590 | F: include/net/rose.h |
5591 | F: net/rose/ | 5591 | F: net/rose/ |
5592 | 5592 | ||
5593 | RTL8180 WIRELESS DRIVER | 5593 | RTL8180 WIRELESS DRIVER |
5594 | M: "John W. Linville" <linville@tuxdriver.com> | 5594 | M: "John W. Linville" <linville@tuxdriver.com> |
5595 | L: linux-wireless@vger.kernel.org | 5595 | L: linux-wireless@vger.kernel.org |
5596 | W: http://linuxwireless.org/ | 5596 | W: http://linuxwireless.org/ |
5597 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git | 5597 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git |
5598 | S: Maintained | 5598 | S: Maintained |
5599 | F: drivers/net/wireless/rtl818x/rtl8180/ | 5599 | F: drivers/net/wireless/rtl818x/rtl8180/ |
5600 | 5600 | ||
5601 | RTL8187 WIRELESS DRIVER | 5601 | RTL8187 WIRELESS DRIVER |
5602 | M: Herton Ronaldo Krzesinski <herton@canonical.com> | 5602 | M: Herton Ronaldo Krzesinski <herton@canonical.com> |
5603 | M: Hin-Tak Leung <htl10@users.sourceforge.net> | 5603 | M: Hin-Tak Leung <htl10@users.sourceforge.net> |
5604 | M: Larry Finger <Larry.Finger@lwfinger.net> | 5604 | M: Larry Finger <Larry.Finger@lwfinger.net> |
5605 | L: linux-wireless@vger.kernel.org | 5605 | L: linux-wireless@vger.kernel.org |
5606 | W: http://linuxwireless.org/ | 5606 | W: http://linuxwireless.org/ |
5607 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git | 5607 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git |
5608 | S: Maintained | 5608 | S: Maintained |
5609 | F: drivers/net/wireless/rtl818x/rtl8187/ | 5609 | F: drivers/net/wireless/rtl818x/rtl8187/ |
5610 | 5610 | ||
5611 | RTL8192CE WIRELESS DRIVER | 5611 | RTL8192CE WIRELESS DRIVER |
5612 | M: Larry Finger <Larry.Finger@lwfinger.net> | 5612 | M: Larry Finger <Larry.Finger@lwfinger.net> |
5613 | M: Chaoming Li <chaoming_li@realsil.com.cn> | 5613 | M: Chaoming Li <chaoming_li@realsil.com.cn> |
5614 | L: linux-wireless@vger.kernel.org | 5614 | L: linux-wireless@vger.kernel.org |
5615 | W: http://linuxwireless.org/ | 5615 | W: http://linuxwireless.org/ |
5616 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git | 5616 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git |
5617 | S: Maintained | 5617 | S: Maintained |
5618 | F: drivers/net/wireless/rtlwifi/ | 5618 | F: drivers/net/wireless/rtlwifi/ |
5619 | F: drivers/net/wireless/rtlwifi/rtl8192ce/ | 5619 | F: drivers/net/wireless/rtlwifi/rtl8192ce/ |
5620 | 5620 | ||
5621 | S3 SAVAGE FRAMEBUFFER DRIVER | 5621 | S3 SAVAGE FRAMEBUFFER DRIVER |
5622 | M: Antonino Daplas <adaplas@gmail.com> | 5622 | M: Antonino Daplas <adaplas@gmail.com> |
5623 | L: linux-fbdev@vger.kernel.org | 5623 | L: linux-fbdev@vger.kernel.org |
5624 | S: Maintained | 5624 | S: Maintained |
5625 | F: drivers/video/savage/ | 5625 | F: drivers/video/savage/ |
5626 | 5626 | ||
5627 | S390 | 5627 | S390 |
5628 | M: Martin Schwidefsky <schwidefsky@de.ibm.com> | 5628 | M: Martin Schwidefsky <schwidefsky@de.ibm.com> |
5629 | M: Heiko Carstens <heiko.carstens@de.ibm.com> | 5629 | M: Heiko Carstens <heiko.carstens@de.ibm.com> |
5630 | M: linux390@de.ibm.com | 5630 | M: linux390@de.ibm.com |
5631 | L: linux-s390@vger.kernel.org | 5631 | L: linux-s390@vger.kernel.org |
5632 | W: http://www.ibm.com/developerworks/linux/linux390/ | 5632 | W: http://www.ibm.com/developerworks/linux/linux390/ |
5633 | S: Supported | 5633 | S: Supported |
5634 | F: arch/s390/ | 5634 | F: arch/s390/ |
5635 | F: drivers/s390/ | 5635 | F: drivers/s390/ |
5636 | F: block/partitions/ibm.c | 5636 | F: block/partitions/ibm.c |
5637 | F: Documentation/s390/ | 5637 | F: Documentation/s390/ |
5638 | F: Documentation/DocBook/s390* | 5638 | F: Documentation/DocBook/s390* |
5639 | 5639 | ||
5640 | S390 NETWORK DRIVERS | 5640 | S390 NETWORK DRIVERS |
5641 | M: Ursula Braun <ursula.braun@de.ibm.com> | 5641 | M: Ursula Braun <ursula.braun@de.ibm.com> |
5642 | M: Frank Blaschka <blaschka@linux.vnet.ibm.com> | 5642 | M: Frank Blaschka <blaschka@linux.vnet.ibm.com> |
5643 | M: linux390@de.ibm.com | 5643 | M: linux390@de.ibm.com |
5644 | L: linux-s390@vger.kernel.org | 5644 | L: linux-s390@vger.kernel.org |
5645 | W: http://www.ibm.com/developerworks/linux/linux390/ | 5645 | W: http://www.ibm.com/developerworks/linux/linux390/ |
5646 | S: Supported | 5646 | S: Supported |
5647 | F: drivers/s390/net/ | 5647 | F: drivers/s390/net/ |
5648 | 5648 | ||
5649 | S390 ZCRYPT DRIVER | 5649 | S390 ZCRYPT DRIVER |
5650 | M: Holger Dengler <hd@linux.vnet.ibm.com> | 5650 | M: Holger Dengler <hd@linux.vnet.ibm.com> |
5651 | M: linux390@de.ibm.com | 5651 | M: linux390@de.ibm.com |
5652 | L: linux-s390@vger.kernel.org | 5652 | L: linux-s390@vger.kernel.org |
5653 | W: http://www.ibm.com/developerworks/linux/linux390/ | 5653 | W: http://www.ibm.com/developerworks/linux/linux390/ |
5654 | S: Supported | 5654 | S: Supported |
5655 | F: drivers/s390/crypto/ | 5655 | F: drivers/s390/crypto/ |
5656 | 5656 | ||
5657 | S390 ZFCP DRIVER | 5657 | S390 ZFCP DRIVER |
5658 | M: Steffen Maier <maier@linux.vnet.ibm.com> | 5658 | M: Steffen Maier <maier@linux.vnet.ibm.com> |
5659 | M: linux390@de.ibm.com | 5659 | M: linux390@de.ibm.com |
5660 | L: linux-s390@vger.kernel.org | 5660 | L: linux-s390@vger.kernel.org |
5661 | W: http://www.ibm.com/developerworks/linux/linux390/ | 5661 | W: http://www.ibm.com/developerworks/linux/linux390/ |
5662 | S: Supported | 5662 | S: Supported |
5663 | F: drivers/s390/scsi/zfcp_* | 5663 | F: drivers/s390/scsi/zfcp_* |
5664 | 5664 | ||
5665 | S390 IUCV NETWORK LAYER | 5665 | S390 IUCV NETWORK LAYER |
5666 | M: Ursula Braun <ursula.braun@de.ibm.com> | 5666 | M: Ursula Braun <ursula.braun@de.ibm.com> |
5667 | M: linux390@de.ibm.com | 5667 | M: linux390@de.ibm.com |
5668 | L: linux-s390@vger.kernel.org | 5668 | L: linux-s390@vger.kernel.org |
5669 | W: http://www.ibm.com/developerworks/linux/linux390/ | 5669 | W: http://www.ibm.com/developerworks/linux/linux390/ |
5670 | S: Supported | 5670 | S: Supported |
5671 | F: drivers/s390/net/*iucv* | 5671 | F: drivers/s390/net/*iucv* |
5672 | F: include/net/iucv/ | 5672 | F: include/net/iucv/ |
5673 | F: net/iucv/ | 5673 | F: net/iucv/ |
5674 | 5674 | ||
5675 | S3C24XX SD/MMC Driver | 5675 | S3C24XX SD/MMC Driver |
5676 | M: Ben Dooks <ben-linux@fluff.org> | 5676 | M: Ben Dooks <ben-linux@fluff.org> |
5677 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 5677 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
5678 | S: Supported | 5678 | S: Supported |
5679 | F: drivers/mmc/host/s3cmci.* | 5679 | F: drivers/mmc/host/s3cmci.* |
5680 | 5680 | ||
5681 | SAA7146 VIDEO4LINUX-2 DRIVER | 5681 | SAA7146 VIDEO4LINUX-2 DRIVER |
5682 | M: Michael Hunold <michael@mihu.de> | 5682 | M: Michael Hunold <michael@mihu.de> |
5683 | L: linux-media@vger.kernel.org | 5683 | L: linux-media@vger.kernel.org |
5684 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git | 5684 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git |
5685 | W: http://www.mihu.de/linux/saa7146 | 5685 | W: http://www.mihu.de/linux/saa7146 |
5686 | S: Maintained | 5686 | S: Maintained |
5687 | F: drivers/media/common/saa7146* | 5687 | F: drivers/media/common/saa7146* |
5688 | F: drivers/media/video/*7146* | 5688 | F: drivers/media/video/*7146* |
5689 | F: include/media/*7146* | 5689 | F: include/media/*7146* |
5690 | 5690 | ||
5691 | SAMSUNG AUDIO (ASoC) DRIVERS | 5691 | SAMSUNG AUDIO (ASoC) DRIVERS |
5692 | M: Sangbeom Kim <sbkim73@samsung.com> | 5692 | M: Sangbeom Kim <sbkim73@samsung.com> |
5693 | L: alsa-devel@alsa-project.org (moderated for non-subscribers) | 5693 | L: alsa-devel@alsa-project.org (moderated for non-subscribers) |
5694 | S: Supported | 5694 | S: Supported |
5695 | F: sound/soc/samsung | 5695 | F: sound/soc/samsung |
5696 | 5696 | ||
5697 | SAMSUNG FRAMEBUFFER DRIVER | 5697 | SAMSUNG FRAMEBUFFER DRIVER |
5698 | M: Jingoo Han <jg1.han@samsung.com> | 5698 | M: Jingoo Han <jg1.han@samsung.com> |
5699 | L: linux-fbdev@vger.kernel.org | 5699 | L: linux-fbdev@vger.kernel.org |
5700 | S: Maintained | 5700 | S: Maintained |
5701 | F: drivers/video/s3c-fb.c | 5701 | F: drivers/video/s3c-fb.c |
5702 | 5702 | ||
5703 | SERIAL DRIVERS | 5703 | SERIAL DRIVERS |
5704 | M: Alan Cox <alan@linux.intel.com> | 5704 | M: Alan Cox <alan@linux.intel.com> |
5705 | L: linux-serial@vger.kernel.org | 5705 | L: linux-serial@vger.kernel.org |
5706 | S: Maintained | 5706 | S: Maintained |
5707 | F: drivers/tty/serial | 5707 | F: drivers/tty/serial |
5708 | 5708 | ||
5709 | SYNOPSYS DESIGNWARE DMAC DRIVER | 5709 | SYNOPSYS DESIGNWARE DMAC DRIVER |
5710 | M: Viresh Kumar <viresh.kumar@st.com> | 5710 | M: Viresh Kumar <viresh.kumar@st.com> |
5711 | S: Maintained | 5711 | S: Maintained |
5712 | F: include/linux/dw_dmac.h | 5712 | F: include/linux/dw_dmac.h |
5713 | F: drivers/dma/dw_dmac_regs.h | 5713 | F: drivers/dma/dw_dmac_regs.h |
5714 | F: drivers/dma/dw_dmac.c | 5714 | F: drivers/dma/dw_dmac.c |
5715 | 5715 | ||
5716 | TIMEKEEPING, NTP | 5716 | TIMEKEEPING, NTP |
5717 | M: John Stultz <johnstul@us.ibm.com> | 5717 | M: John Stultz <johnstul@us.ibm.com> |
5718 | M: Thomas Gleixner <tglx@linutronix.de> | 5718 | M: Thomas Gleixner <tglx@linutronix.de> |
5719 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core | 5719 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core |
5720 | S: Supported | 5720 | S: Supported |
5721 | F: include/linux/clocksource.h | 5721 | F: include/linux/clocksource.h |
5722 | F: include/linux/time.h | 5722 | F: include/linux/time.h |
5723 | F: include/linux/timex.h | 5723 | F: include/linux/timex.h |
5724 | F: kernel/time/clocksource.c | 5724 | F: kernel/time/clocksource.c |
5725 | F: kernel/time/time*.c | 5725 | F: kernel/time/time*.c |
5726 | F: kernel/time/ntp.c | 5726 | F: kernel/time/ntp.c |
5727 | F: drivers/clocksource | 5727 | F: drivers/clocksource |
5728 | 5728 | ||
5729 | TLG2300 VIDEO4LINUX-2 DRIVER | 5729 | TLG2300 VIDEO4LINUX-2 DRIVER |
5730 | M: Huang Shijie <shijie8@gmail.com> | 5730 | M: Huang Shijie <shijie8@gmail.com> |
5731 | M: Kang Yong <kangyong@telegent.com> | 5731 | M: Kang Yong <kangyong@telegent.com> |
5732 | M: Zhang Xiaobing <xbzhang@telegent.com> | 5732 | M: Zhang Xiaobing <xbzhang@telegent.com> |
5733 | S: Supported | 5733 | S: Supported |
5734 | F: drivers/media/video/tlg2300 | 5734 | F: drivers/media/video/tlg2300 |
5735 | 5735 | ||
5736 | SC1200 WDT DRIVER | 5736 | SC1200 WDT DRIVER |
5737 | M: Zwane Mwaikambo <zwane@arm.linux.org.uk> | 5737 | M: Zwane Mwaikambo <zwane@arm.linux.org.uk> |
5738 | S: Maintained | 5738 | S: Maintained |
5739 | F: drivers/watchdog/sc1200wdt.c | 5739 | F: drivers/watchdog/sc1200wdt.c |
5740 | 5740 | ||
5741 | SCHEDULER | 5741 | SCHEDULER |
5742 | M: Ingo Molnar <mingo@elte.hu> | 5742 | M: Ingo Molnar <mingo@elte.hu> |
5743 | M: Peter Zijlstra <peterz@infradead.org> | 5743 | M: Peter Zijlstra <peterz@infradead.org> |
5744 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git sched/core | 5744 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git sched/core |
5745 | S: Maintained | 5745 | S: Maintained |
5746 | F: kernel/sched* | 5746 | F: kernel/sched* |
5747 | F: include/linux/sched.h | 5747 | F: include/linux/sched.h |
5748 | 5748 | ||
5749 | SCORE ARCHITECTURE | 5749 | SCORE ARCHITECTURE |
5750 | M: Chen Liqin <liqin.chen@sunplusct.com> | 5750 | M: Chen Liqin <liqin.chen@sunplusct.com> |
5751 | M: Lennox Wu <lennox.wu@gmail.com> | 5751 | M: Lennox Wu <lennox.wu@gmail.com> |
5752 | W: http://www.sunplusct.com | 5752 | W: http://www.sunplusct.com |
5753 | S: Supported | 5753 | S: Supported |
5754 | F: arch/score/ | 5754 | F: arch/score/ |
5755 | 5755 | ||
5756 | SCSI CDROM DRIVER | 5756 | SCSI CDROM DRIVER |
5757 | M: Jens Axboe <axboe@kernel.dk> | 5757 | M: Jens Axboe <axboe@kernel.dk> |
5758 | L: linux-scsi@vger.kernel.org | 5758 | L: linux-scsi@vger.kernel.org |
5759 | W: http://www.kernel.dk | 5759 | W: http://www.kernel.dk |
5760 | S: Maintained | 5760 | S: Maintained |
5761 | F: drivers/scsi/sr* | 5761 | F: drivers/scsi/sr* |
5762 | 5762 | ||
5763 | SCSI RDMA PROTOCOL (SRP) INITIATOR | 5763 | SCSI RDMA PROTOCOL (SRP) INITIATOR |
5764 | M: David Dillow <dillowda@ornl.gov> | 5764 | M: David Dillow <dillowda@ornl.gov> |
5765 | L: linux-rdma@vger.kernel.org | 5765 | L: linux-rdma@vger.kernel.org |
5766 | S: Supported | 5766 | S: Supported |
5767 | W: http://www.openfabrics.org | 5767 | W: http://www.openfabrics.org |
5768 | Q: http://patchwork.kernel.org/project/linux-rdma/list/ | 5768 | Q: http://patchwork.kernel.org/project/linux-rdma/list/ |
5769 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/dad/srp-initiator.git | 5769 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/dad/srp-initiator.git |
5770 | F: drivers/infiniband/ulp/srp/ | 5770 | F: drivers/infiniband/ulp/srp/ |
5771 | F: include/scsi/srp.h | 5771 | F: include/scsi/srp.h |
5772 | 5772 | ||
5773 | SCSI SG DRIVER | 5773 | SCSI SG DRIVER |
5774 | M: Doug Gilbert <dgilbert@interlog.com> | 5774 | M: Doug Gilbert <dgilbert@interlog.com> |
5775 | L: linux-scsi@vger.kernel.org | 5775 | L: linux-scsi@vger.kernel.org |
5776 | W: http://www.torque.net/sg | 5776 | W: http://www.torque.net/sg |
5777 | S: Maintained | 5777 | S: Maintained |
5778 | F: drivers/scsi/sg.c | 5778 | F: drivers/scsi/sg.c |
5779 | F: include/scsi/sg.h | 5779 | F: include/scsi/sg.h |
5780 | 5780 | ||
5781 | SCSI SUBSYSTEM | 5781 | SCSI SUBSYSTEM |
5782 | M: "James E.J. Bottomley" <JBottomley@parallels.com> | 5782 | M: "James E.J. Bottomley" <JBottomley@parallels.com> |
5783 | L: linux-scsi@vger.kernel.org | 5783 | L: linux-scsi@vger.kernel.org |
5784 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git | 5784 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git |
5785 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6.git | 5785 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6.git |
5786 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-pending-2.6.git | 5786 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-pending-2.6.git |
5787 | S: Maintained | 5787 | S: Maintained |
5788 | F: drivers/scsi/ | 5788 | F: drivers/scsi/ |
5789 | F: include/scsi/ | 5789 | F: include/scsi/ |
5790 | 5790 | ||
5791 | SCSI TAPE DRIVER | 5791 | SCSI TAPE DRIVER |
5792 | M: Kai Mรคkisara <Kai.Makisara@kolumbus.fi> | 5792 | M: Kai Mรคkisara <Kai.Makisara@kolumbus.fi> |
5793 | L: linux-scsi@vger.kernel.org | 5793 | L: linux-scsi@vger.kernel.org |
5794 | S: Maintained | 5794 | S: Maintained |
5795 | F: Documentation/scsi/st.txt | 5795 | F: Documentation/scsi/st.txt |
5796 | F: drivers/scsi/st* | 5796 | F: drivers/scsi/st* |
5797 | 5797 | ||
5798 | SCTP PROTOCOL | 5798 | SCTP PROTOCOL |
5799 | M: Vlad Yasevich <vladislav.yasevich@hp.com> | 5799 | M: Vlad Yasevich <vladislav.yasevich@hp.com> |
5800 | M: Sridhar Samudrala <sri@us.ibm.com> | 5800 | M: Sridhar Samudrala <sri@us.ibm.com> |
5801 | L: linux-sctp@vger.kernel.org | 5801 | L: linux-sctp@vger.kernel.org |
5802 | W: http://lksctp.sourceforge.net | 5802 | W: http://lksctp.sourceforge.net |
5803 | S: Supported | 5803 | S: Supported |
5804 | F: Documentation/networking/sctp.txt | 5804 | F: Documentation/networking/sctp.txt |
5805 | F: include/linux/sctp.h | 5805 | F: include/linux/sctp.h |
5806 | F: include/net/sctp/ | 5806 | F: include/net/sctp/ |
5807 | F: net/sctp/ | 5807 | F: net/sctp/ |
5808 | 5808 | ||
5809 | SCx200 CPU SUPPORT | 5809 | SCx200 CPU SUPPORT |
5810 | M: Jim Cromie <jim.cromie@gmail.com> | 5810 | M: Jim Cromie <jim.cromie@gmail.com> |
5811 | S: Odd Fixes | 5811 | S: Odd Fixes |
5812 | F: Documentation/i2c/busses/scx200_acb | 5812 | F: Documentation/i2c/busses/scx200_acb |
5813 | F: arch/x86/platform/scx200/ | 5813 | F: arch/x86/platform/scx200/ |
5814 | F: drivers/watchdog/scx200_wdt.c | 5814 | F: drivers/watchdog/scx200_wdt.c |
5815 | F: drivers/i2c/busses/scx200* | 5815 | F: drivers/i2c/busses/scx200* |
5816 | F: drivers/mtd/maps/scx200_docflash.c | 5816 | F: drivers/mtd/maps/scx200_docflash.c |
5817 | F: include/linux/scx200.h | 5817 | F: include/linux/scx200.h |
5818 | 5818 | ||
5819 | SCx200 GPIO DRIVER | 5819 | SCx200 GPIO DRIVER |
5820 | M: Jim Cromie <jim.cromie@gmail.com> | 5820 | M: Jim Cromie <jim.cromie@gmail.com> |
5821 | S: Maintained | 5821 | S: Maintained |
5822 | F: drivers/char/scx200_gpio.c | 5822 | F: drivers/char/scx200_gpio.c |
5823 | F: include/linux/scx200_gpio.h | 5823 | F: include/linux/scx200_gpio.h |
5824 | 5824 | ||
5825 | SCx200 HRT CLOCKSOURCE DRIVER | 5825 | SCx200 HRT CLOCKSOURCE DRIVER |
5826 | M: Jim Cromie <jim.cromie@gmail.com> | 5826 | M: Jim Cromie <jim.cromie@gmail.com> |
5827 | S: Maintained | 5827 | S: Maintained |
5828 | F: drivers/clocksource/scx200_hrt.c | 5828 | F: drivers/clocksource/scx200_hrt.c |
5829 | 5829 | ||
5830 | SDRICOH_CS MMC/SD HOST CONTROLLER INTERFACE DRIVER | 5830 | SDRICOH_CS MMC/SD HOST CONTROLLER INTERFACE DRIVER |
5831 | M: Sascha Sommer <saschasommer@freenet.de> | 5831 | M: Sascha Sommer <saschasommer@freenet.de> |
5832 | L: sdricohcs-devel@lists.sourceforge.net (subscribers-only) | 5832 | L: sdricohcs-devel@lists.sourceforge.net (subscribers-only) |
5833 | S: Maintained | 5833 | S: Maintained |
5834 | F: drivers/mmc/host/sdricoh_cs.c | 5834 | F: drivers/mmc/host/sdricoh_cs.c |
5835 | 5835 | ||
5836 | SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) DRIVER | 5836 | SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) DRIVER |
5837 | M: Chris Ball <cjb@laptop.org> | 5837 | M: Chris Ball <cjb@laptop.org> |
5838 | L: linux-mmc@vger.kernel.org | 5838 | L: linux-mmc@vger.kernel.org |
5839 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/cjb/mmc.git | 5839 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/cjb/mmc.git |
5840 | S: Maintained | 5840 | S: Maintained |
5841 | F: drivers/mmc/host/sdhci.* | 5841 | F: drivers/mmc/host/sdhci.* |
5842 | F: drivers/mmc/host/sdhci-pltfm.[ch] | 5842 | F: drivers/mmc/host/sdhci-pltfm.[ch] |
5843 | 5843 | ||
5844 | SECURE DIGITAL HOST CONTROLLER INTERFACE, OPEN FIRMWARE BINDINGS (SDHCI-OF) | 5844 | SECURE DIGITAL HOST CONTROLLER INTERFACE, OPEN FIRMWARE BINDINGS (SDHCI-OF) |
5845 | M: Anton Vorontsov <avorontsov@ru.mvista.com> | 5845 | M: Anton Vorontsov <avorontsov@ru.mvista.com> |
5846 | L: linuxppc-dev@lists.ozlabs.org | 5846 | L: linuxppc-dev@lists.ozlabs.org |
5847 | L: linux-mmc@vger.kernel.org | 5847 | L: linux-mmc@vger.kernel.org |
5848 | S: Maintained | 5848 | S: Maintained |
5849 | F: drivers/mmc/host/sdhci-pltfm.[ch] | 5849 | F: drivers/mmc/host/sdhci-pltfm.[ch] |
5850 | 5850 | ||
5851 | SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) SAMSUNG DRIVER | 5851 | SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) SAMSUNG DRIVER |
5852 | M: Ben Dooks <ben-linux@fluff.org> | 5852 | M: Ben Dooks <ben-linux@fluff.org> |
5853 | L: linux-mmc@vger.kernel.org | 5853 | L: linux-mmc@vger.kernel.org |
5854 | S: Maintained | 5854 | S: Maintained |
5855 | F: drivers/mmc/host/sdhci-s3c.c | 5855 | F: drivers/mmc/host/sdhci-s3c.c |
5856 | 5856 | ||
5857 | SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) ST SPEAR DRIVER | 5857 | SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) ST SPEAR DRIVER |
5858 | M: Viresh Kumar <viresh.kumar@st.com> | 5858 | M: Viresh Kumar <viresh.kumar@st.com> |
5859 | L: linux-mmc@vger.kernel.org | 5859 | L: linux-mmc@vger.kernel.org |
5860 | S: Maintained | 5860 | S: Maintained |
5861 | F: drivers/mmc/host/sdhci-spear.c | 5861 | F: drivers/mmc/host/sdhci-spear.c |
5862 | 5862 | ||
5863 | SECURITY SUBSYSTEM | 5863 | SECURITY SUBSYSTEM |
5864 | M: James Morris <jmorris@namei.org> | 5864 | M: James Morris <jmorris@namei.org> |
5865 | L: linux-security-module@vger.kernel.org (suggested Cc:) | 5865 | L: linux-security-module@vger.kernel.org (suggested Cc:) |
5866 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux-security.git | 5866 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux-security.git |
5867 | W: http://security.wiki.kernel.org/ | 5867 | W: http://security.wiki.kernel.org/ |
5868 | S: Supported | 5868 | S: Supported |
5869 | F: security/ | 5869 | F: security/ |
5870 | 5870 | ||
5871 | SECURITY CONTACT | 5871 | SECURITY CONTACT |
5872 | M: Security Officers <security@kernel.org> | 5872 | M: Security Officers <security@kernel.org> |
5873 | S: Supported | 5873 | S: Supported |
5874 | 5874 | ||
5875 | SELINUX SECURITY MODULE | 5875 | SELINUX SECURITY MODULE |
5876 | M: Stephen Smalley <sds@tycho.nsa.gov> | 5876 | M: Stephen Smalley <sds@tycho.nsa.gov> |
5877 | M: James Morris <jmorris@namei.org> | 5877 | M: James Morris <jmorris@namei.org> |
5878 | M: Eric Paris <eparis@parisplace.org> | 5878 | M: Eric Paris <eparis@parisplace.org> |
5879 | L: selinux@tycho.nsa.gov (subscribers-only, general discussion) | 5879 | L: selinux@tycho.nsa.gov (subscribers-only, general discussion) |
5880 | W: http://selinuxproject.org | 5880 | W: http://selinuxproject.org |
5881 | T: git git://git.infradead.org/users/eparis/selinux.git | 5881 | T: git git://git.infradead.org/users/eparis/selinux.git |
5882 | S: Supported | 5882 | S: Supported |
5883 | F: include/linux/selinux* | 5883 | F: include/linux/selinux* |
5884 | F: security/selinux/ | 5884 | F: security/selinux/ |
5885 | F: scripts/selinux/ | 5885 | F: scripts/selinux/ |
5886 | 5886 | ||
5887 | APPARMOR SECURITY MODULE | 5887 | APPARMOR SECURITY MODULE |
5888 | M: John Johansen <john.johansen@canonical.com> | 5888 | M: John Johansen <john.johansen@canonical.com> |
5889 | L: apparmor@lists.ubuntu.com (subscribers-only, general discussion) | 5889 | L: apparmor@lists.ubuntu.com (subscribers-only, general discussion) |
5890 | W: apparmor.wiki.kernel.org | 5890 | W: apparmor.wiki.kernel.org |
5891 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jj/apparmor-dev.git | 5891 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jj/apparmor-dev.git |
5892 | S: Supported | 5892 | S: Supported |
5893 | F: security/apparmor/ | 5893 | F: security/apparmor/ |
5894 | 5894 | ||
5895 | SENSABLE PHANTOM | 5895 | SENSABLE PHANTOM |
5896 | M: Jiri Slaby <jirislaby@gmail.com> | 5896 | M: Jiri Slaby <jirislaby@gmail.com> |
5897 | S: Maintained | 5897 | S: Maintained |
5898 | F: drivers/misc/phantom.c | 5898 | F: drivers/misc/phantom.c |
5899 | F: include/linux/phantom.h | 5899 | F: include/linux/phantom.h |
5900 | 5900 | ||
5901 | SERIAL ATA (SATA) SUBSYSTEM | 5901 | SERIAL ATA (SATA) SUBSYSTEM |
5902 | M: Jeff Garzik <jgarzik@pobox.com> | 5902 | M: Jeff Garzik <jgarzik@pobox.com> |
5903 | L: linux-ide@vger.kernel.org | 5903 | L: linux-ide@vger.kernel.org |
5904 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev.git | 5904 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev.git |
5905 | S: Supported | 5905 | S: Supported |
5906 | F: drivers/ata/ | 5906 | F: drivers/ata/ |
5907 | F: include/linux/ata.h | 5907 | F: include/linux/ata.h |
5908 | F: include/linux/libata.h | 5908 | F: include/linux/libata.h |
5909 | 5909 | ||
5910 | SERVER ENGINES 10Gbps iSCSI - BladeEngine 2 DRIVER | 5910 | SERVER ENGINES 10Gbps iSCSI - BladeEngine 2 DRIVER |
5911 | M: Jayamohan Kallickal <jayamohan.kallickal@emulex.com> | 5911 | M: Jayamohan Kallickal <jayamohan.kallickal@emulex.com> |
5912 | L: linux-scsi@vger.kernel.org | 5912 | L: linux-scsi@vger.kernel.org |
5913 | W: http://www.emulex.com | 5913 | W: http://www.emulex.com |
5914 | S: Supported | 5914 | S: Supported |
5915 | F: drivers/scsi/be2iscsi/ | 5915 | F: drivers/scsi/be2iscsi/ |
5916 | 5916 | ||
5917 | SERVER ENGINES 10Gbps NIC - BladeEngine 2 DRIVER | 5917 | SERVER ENGINES 10Gbps NIC - BladeEngine 2 DRIVER |
5918 | M: Sathya Perla <sathya.perla@emulex.com> | 5918 | M: Sathya Perla <sathya.perla@emulex.com> |
5919 | M: Subbu Seetharaman <subbu.seetharaman@emulex.com> | 5919 | M: Subbu Seetharaman <subbu.seetharaman@emulex.com> |
5920 | M: Ajit Khaparde <ajit.khaparde@emulex.com> | 5920 | M: Ajit Khaparde <ajit.khaparde@emulex.com> |
5921 | L: netdev@vger.kernel.org | 5921 | L: netdev@vger.kernel.org |
5922 | W: http://www.emulex.com | 5922 | W: http://www.emulex.com |
5923 | S: Supported | 5923 | S: Supported |
5924 | F: drivers/net/ethernet/emulex/benet/ | 5924 | F: drivers/net/ethernet/emulex/benet/ |
5925 | 5925 | ||
5926 | SFC NETWORK DRIVER | 5926 | SFC NETWORK DRIVER |
5927 | M: Solarflare linux maintainers <linux-net-drivers@solarflare.com> | 5927 | M: Solarflare linux maintainers <linux-net-drivers@solarflare.com> |
5928 | M: Ben Hutchings <bhutchings@solarflare.com> | 5928 | M: Ben Hutchings <bhutchings@solarflare.com> |
5929 | L: netdev@vger.kernel.org | 5929 | L: netdev@vger.kernel.org |
5930 | S: Supported | 5930 | S: Supported |
5931 | F: drivers/net/ethernet/sfc/ | 5931 | F: drivers/net/ethernet/sfc/ |
5932 | 5932 | ||
5933 | SGI GRU DRIVER | 5933 | SGI GRU DRIVER |
5934 | M: Jack Steiner <steiner@sgi.com> | 5934 | M: Jack Steiner <steiner@sgi.com> |
5935 | S: Maintained | 5935 | S: Maintained |
5936 | F: drivers/misc/sgi-gru/ | 5936 | F: drivers/misc/sgi-gru/ |
5937 | 5937 | ||
5938 | SGI SN-IA64 (Altix) SERIAL CONSOLE DRIVER | 5938 | SGI SN-IA64 (Altix) SERIAL CONSOLE DRIVER |
5939 | M: Pat Gefre <pfg@sgi.com> | 5939 | M: Pat Gefre <pfg@sgi.com> |
5940 | L: linux-ia64@vger.kernel.org | 5940 | L: linux-ia64@vger.kernel.org |
5941 | S: Supported | 5941 | S: Supported |
5942 | F: Documentation/ia64/serial.txt | 5942 | F: Documentation/ia64/serial.txt |
5943 | F: drivers/tty/serial/ioc?_serial.c | 5943 | F: drivers/tty/serial/ioc?_serial.c |
5944 | F: include/linux/ioc?.h | 5944 | F: include/linux/ioc?.h |
5945 | 5945 | ||
5946 | SGI VISUAL WORKSTATION 320 AND 540 | 5946 | SGI VISUAL WORKSTATION 320 AND 540 |
5947 | M: Andrey Panin <pazke@donpac.ru> | 5947 | M: Andrey Panin <pazke@donpac.ru> |
5948 | L: linux-visws-devel@lists.sf.net | 5948 | L: linux-visws-devel@lists.sf.net |
5949 | W: http://linux-visws.sf.net | 5949 | W: http://linux-visws.sf.net |
5950 | S: Maintained for 2.6. | 5950 | S: Maintained for 2.6. |
5951 | F: Documentation/sgi-visws.txt | 5951 | F: Documentation/sgi-visws.txt |
5952 | 5952 | ||
5953 | SGI XP/XPC/XPNET DRIVER | 5953 | SGI XP/XPC/XPNET DRIVER |
5954 | M: Robin Holt <holt@sgi.com> | 5954 | M: Robin Holt <holt@sgi.com> |
5955 | S: Maintained | 5955 | S: Maintained |
5956 | F: drivers/misc/sgi-xp/ | 5956 | F: drivers/misc/sgi-xp/ |
5957 | 5957 | ||
5958 | SIMPLE FIRMWARE INTERFACE (SFI) | 5958 | SIMPLE FIRMWARE INTERFACE (SFI) |
5959 | M: Len Brown <lenb@kernel.org> | 5959 | M: Len Brown <lenb@kernel.org> |
5960 | L: sfi-devel@simplefirmware.org | 5960 | L: sfi-devel@simplefirmware.org |
5961 | W: http://simplefirmware.org/ | 5961 | W: http://simplefirmware.org/ |
5962 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-sfi-2.6.git | 5962 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-sfi-2.6.git |
5963 | S: Supported | 5963 | S: Supported |
5964 | F: arch/x86/platform/sfi/ | 5964 | F: arch/x86/platform/sfi/ |
5965 | F: drivers/sfi/ | 5965 | F: drivers/sfi/ |
5966 | F: include/linux/sfi*.h | 5966 | F: include/linux/sfi*.h |
5967 | 5967 | ||
5968 | SIMTEC EB110ATX (Chalice CATS) | 5968 | SIMTEC EB110ATX (Chalice CATS) |
5969 | P: Ben Dooks | 5969 | P: Ben Dooks |
5970 | P: Vincent Sanders <vince@simtec.co.uk> | 5970 | P: Vincent Sanders <vince@simtec.co.uk> |
5971 | M: Simtec Linux Team <linux@simtec.co.uk> | 5971 | M: Simtec Linux Team <linux@simtec.co.uk> |
5972 | W: http://www.simtec.co.uk/products/EB110ATX/ | 5972 | W: http://www.simtec.co.uk/products/EB110ATX/ |
5973 | S: Supported | 5973 | S: Supported |
5974 | 5974 | ||
5975 | SIMTEC EB2410ITX (BAST) | 5975 | SIMTEC EB2410ITX (BAST) |
5976 | P: Ben Dooks | 5976 | P: Ben Dooks |
5977 | P: Vincent Sanders <vince@simtec.co.uk> | 5977 | P: Vincent Sanders <vince@simtec.co.uk> |
5978 | M: Simtec Linux Team <linux@simtec.co.uk> | 5978 | M: Simtec Linux Team <linux@simtec.co.uk> |
5979 | W: http://www.simtec.co.uk/products/EB2410ITX/ | 5979 | W: http://www.simtec.co.uk/products/EB2410ITX/ |
5980 | S: Supported | 5980 | S: Supported |
5981 | F: arch/arm/mach-s3c2410/mach-bast.c | 5981 | F: arch/arm/mach-s3c2410/mach-bast.c |
5982 | F: arch/arm/mach-s3c2410/bast-ide.c | 5982 | F: arch/arm/mach-s3c2410/bast-ide.c |
5983 | F: arch/arm/mach-s3c2410/bast-irq.c | 5983 | F: arch/arm/mach-s3c2410/bast-irq.c |
5984 | 5984 | ||
5985 | TI DAVINCI MACHINE SUPPORT | 5985 | TI DAVINCI MACHINE SUPPORT |
5986 | M: Sekhar Nori <nsekhar@ti.com> | 5986 | M: Sekhar Nori <nsekhar@ti.com> |
5987 | M: Kevin Hilman <khilman@ti.com> | 5987 | M: Kevin Hilman <khilman@ti.com> |
5988 | L: davinci-linux-open-source@linux.davincidsp.com (subscribers-only) | 5988 | L: davinci-linux-open-source@linux.davincidsp.com (subscribers-only) |
5989 | Q: http://patchwork.kernel.org/project/linux-davinci/list/ | 5989 | Q: http://patchwork.kernel.org/project/linux-davinci/list/ |
5990 | S: Supported | 5990 | S: Supported |
5991 | F: arch/arm/mach-davinci | 5991 | F: arch/arm/mach-davinci |
5992 | F: drivers/i2c/busses/i2c-davinci.c | 5992 | F: drivers/i2c/busses/i2c-davinci.c |
5993 | 5993 | ||
5994 | SIS 190 ETHERNET DRIVER | 5994 | SIS 190 ETHERNET DRIVER |
5995 | M: Francois Romieu <romieu@fr.zoreil.com> | 5995 | M: Francois Romieu <romieu@fr.zoreil.com> |
5996 | L: netdev@vger.kernel.org | 5996 | L: netdev@vger.kernel.org |
5997 | S: Maintained | 5997 | S: Maintained |
5998 | F: drivers/net/ethernet/sis/sis190.c | 5998 | F: drivers/net/ethernet/sis/sis190.c |
5999 | 5999 | ||
6000 | SIS 900/7016 FAST ETHERNET DRIVER | 6000 | SIS 900/7016 FAST ETHERNET DRIVER |
6001 | M: Daniele Venzano <venza@brownhat.org> | 6001 | M: Daniele Venzano <venza@brownhat.org> |
6002 | W: http://www.brownhat.org/sis900.html | 6002 | W: http://www.brownhat.org/sis900.html |
6003 | L: netdev@vger.kernel.org | 6003 | L: netdev@vger.kernel.org |
6004 | S: Maintained | 6004 | S: Maintained |
6005 | F: drivers/net/ethernet/sis/sis900.* | 6005 | F: drivers/net/ethernet/sis/sis900.* |
6006 | 6006 | ||
6007 | SIS 96X I2C/SMBUS DRIVER | 6007 | SIS 96X I2C/SMBUS DRIVER |
6008 | M: "Mark M. Hoffman" <mhoffman@lightlink.com> | 6008 | M: "Mark M. Hoffman" <mhoffman@lightlink.com> |
6009 | L: linux-i2c@vger.kernel.org | 6009 | L: linux-i2c@vger.kernel.org |
6010 | S: Maintained | 6010 | S: Maintained |
6011 | F: Documentation/i2c/busses/i2c-sis96x | 6011 | F: Documentation/i2c/busses/i2c-sis96x |
6012 | F: drivers/i2c/busses/i2c-sis96x.c | 6012 | F: drivers/i2c/busses/i2c-sis96x.c |
6013 | 6013 | ||
6014 | SIS FRAMEBUFFER DRIVER | 6014 | SIS FRAMEBUFFER DRIVER |
6015 | M: Thomas Winischhofer <thomas@winischhofer.net> | 6015 | M: Thomas Winischhofer <thomas@winischhofer.net> |
6016 | W: http://www.winischhofer.net/linuxsisvga.shtml | 6016 | W: http://www.winischhofer.net/linuxsisvga.shtml |
6017 | S: Maintained | 6017 | S: Maintained |
6018 | F: Documentation/fb/sisfb.txt | 6018 | F: Documentation/fb/sisfb.txt |
6019 | F: drivers/video/sis/ | 6019 | F: drivers/video/sis/ |
6020 | F: include/video/sisfb.h | 6020 | F: include/video/sisfb.h |
6021 | 6021 | ||
6022 | SIS USB2VGA DRIVER | 6022 | SIS USB2VGA DRIVER |
6023 | M: Thomas Winischhofer <thomas@winischhofer.net> | 6023 | M: Thomas Winischhofer <thomas@winischhofer.net> |
6024 | W: http://www.winischhofer.at/linuxsisusbvga.shtml | 6024 | W: http://www.winischhofer.at/linuxsisusbvga.shtml |
6025 | S: Maintained | 6025 | S: Maintained |
6026 | F: drivers/usb/misc/sisusbvga/ | 6026 | F: drivers/usb/misc/sisusbvga/ |
6027 | 6027 | ||
6028 | SKGE, SKY2 10/100/1000 GIGABIT ETHERNET DRIVERS | 6028 | SKGE, SKY2 10/100/1000 GIGABIT ETHERNET DRIVERS |
6029 | M: Stephen Hemminger <shemminger@vyatta.com> | 6029 | M: Stephen Hemminger <shemminger@vyatta.com> |
6030 | L: netdev@vger.kernel.org | 6030 | L: netdev@vger.kernel.org |
6031 | S: Maintained | 6031 | S: Maintained |
6032 | F: drivers/net/ethernet/marvell/sk* | 6032 | F: drivers/net/ethernet/marvell/sk* |
6033 | 6033 | ||
6034 | SLAB ALLOCATOR | 6034 | SLAB ALLOCATOR |
6035 | M: Christoph Lameter <cl@linux-foundation.org> | 6035 | M: Christoph Lameter <cl@linux-foundation.org> |
6036 | M: Pekka Enberg <penberg@kernel.org> | 6036 | M: Pekka Enberg <penberg@kernel.org> |
6037 | M: Matt Mackall <mpm@selenic.com> | 6037 | M: Matt Mackall <mpm@selenic.com> |
6038 | L: linux-mm@kvack.org | 6038 | L: linux-mm@kvack.org |
6039 | S: Maintained | 6039 | S: Maintained |
6040 | F: include/linux/sl?b*.h | 6040 | F: include/linux/sl?b*.h |
6041 | F: mm/sl?b.c | 6041 | F: mm/sl?b.c |
6042 | 6042 | ||
6043 | SMC91x ETHERNET DRIVER | 6043 | SMC91x ETHERNET DRIVER |
6044 | M: Nicolas Pitre <nico@fluxnic.net> | 6044 | M: Nicolas Pitre <nico@fluxnic.net> |
6045 | S: Odd Fixes | 6045 | S: Odd Fixes |
6046 | F: drivers/net/ethernet/smsc/smc91x.* | 6046 | F: drivers/net/ethernet/smsc/smc91x.* |
6047 | 6047 | ||
6048 | SMM665 HARDWARE MONITOR DRIVER | 6048 | SMM665 HARDWARE MONITOR DRIVER |
6049 | M: Guenter Roeck <linux@roeck-us.net> | 6049 | M: Guenter Roeck <linux@roeck-us.net> |
6050 | L: lm-sensors@lm-sensors.org | 6050 | L: lm-sensors@lm-sensors.org |
6051 | S: Maintained | 6051 | S: Maintained |
6052 | F: Documentation/hwmon/smm665 | 6052 | F: Documentation/hwmon/smm665 |
6053 | F: drivers/hwmon/smm665.c | 6053 | F: drivers/hwmon/smm665.c |
6054 | 6054 | ||
6055 | SMSC EMC2103 HARDWARE MONITOR DRIVER | 6055 | SMSC EMC2103 HARDWARE MONITOR DRIVER |
6056 | M: Steve Glendinning <steve.glendinning@smsc.com> | 6056 | M: Steve Glendinning <steve.glendinning@smsc.com> |
6057 | L: lm-sensors@lm-sensors.org | 6057 | L: lm-sensors@lm-sensors.org |
6058 | S: Supported | 6058 | S: Supported |
6059 | F: Documentation/hwmon/emc2103 | 6059 | F: Documentation/hwmon/emc2103 |
6060 | F: drivers/hwmon/emc2103.c | 6060 | F: drivers/hwmon/emc2103.c |
6061 | 6061 | ||
6062 | SMSC SCH5627 HARDWARE MONITOR DRIVER | 6062 | SMSC SCH5627 HARDWARE MONITOR DRIVER |
6063 | M: Hans de Goede <hdegoede@redhat.com> | 6063 | M: Hans de Goede <hdegoede@redhat.com> |
6064 | L: lm-sensors@lm-sensors.org | 6064 | L: lm-sensors@lm-sensors.org |
6065 | S: Supported | 6065 | S: Supported |
6066 | F: Documentation/hwmon/sch5627 | 6066 | F: Documentation/hwmon/sch5627 |
6067 | F: drivers/hwmon/sch5627.c | 6067 | F: drivers/hwmon/sch5627.c |
6068 | 6068 | ||
6069 | SMSC47B397 HARDWARE MONITOR DRIVER | 6069 | SMSC47B397 HARDWARE MONITOR DRIVER |
6070 | M: "Mark M. Hoffman" <mhoffman@lightlink.com> | 6070 | M: "Mark M. Hoffman" <mhoffman@lightlink.com> |
6071 | L: lm-sensors@lm-sensors.org | 6071 | L: lm-sensors@lm-sensors.org |
6072 | S: Maintained | 6072 | S: Maintained |
6073 | F: Documentation/hwmon/smsc47b397 | 6073 | F: Documentation/hwmon/smsc47b397 |
6074 | F: drivers/hwmon/smsc47b397.c | 6074 | F: drivers/hwmon/smsc47b397.c |
6075 | 6075 | ||
6076 | SMSC911x ETHERNET DRIVER | 6076 | SMSC911x ETHERNET DRIVER |
6077 | M: Steve Glendinning <steve.glendinning@smsc.com> | 6077 | M: Steve Glendinning <steve.glendinning@smsc.com> |
6078 | L: netdev@vger.kernel.org | 6078 | L: netdev@vger.kernel.org |
6079 | S: Supported | 6079 | S: Supported |
6080 | F: include/linux/smsc911x.h | 6080 | F: include/linux/smsc911x.h |
6081 | F: drivers/net/ethernet/smsc/smsc911x.* | 6081 | F: drivers/net/ethernet/smsc/smsc911x.* |
6082 | 6082 | ||
6083 | SMSC9420 PCI ETHERNET DRIVER | 6083 | SMSC9420 PCI ETHERNET DRIVER |
6084 | M: Steve Glendinning <steve.glendinning@smsc.com> | 6084 | M: Steve Glendinning <steve.glendinning@smsc.com> |
6085 | L: netdev@vger.kernel.org | 6085 | L: netdev@vger.kernel.org |
6086 | S: Supported | 6086 | S: Supported |
6087 | F: drivers/net/ethernet/smsc/smsc9420.* | 6087 | F: drivers/net/ethernet/smsc/smsc9420.* |
6088 | 6088 | ||
6089 | SMSC UFX6000 and UFX7000 USB to VGA DRIVER | 6089 | SMSC UFX6000 and UFX7000 USB to VGA DRIVER |
6090 | M: Steve Glendinning <steve.glendinning@smsc.com> | 6090 | M: Steve Glendinning <steve.glendinning@smsc.com> |
6091 | L: linux-fbdev@vger.kernel.org | 6091 | L: linux-fbdev@vger.kernel.org |
6092 | S: Supported | 6092 | S: Supported |
6093 | F: drivers/video/smscufx.c | 6093 | F: drivers/video/smscufx.c |
6094 | 6094 | ||
6095 | SN-IA64 (Itanium) SUB-PLATFORM | 6095 | SN-IA64 (Itanium) SUB-PLATFORM |
6096 | M: Jes Sorensen <jes@sgi.com> | 6096 | M: Jes Sorensen <jes@sgi.com> |
6097 | L: linux-altix@sgi.com | 6097 | L: linux-altix@sgi.com |
6098 | L: linux-ia64@vger.kernel.org | 6098 | L: linux-ia64@vger.kernel.org |
6099 | W: http://www.sgi.com/altix | 6099 | W: http://www.sgi.com/altix |
6100 | S: Maintained | 6100 | S: Maintained |
6101 | F: arch/ia64/sn/ | 6101 | F: arch/ia64/sn/ |
6102 | 6102 | ||
6103 | SOC-CAMERA V4L2 SUBSYSTEM | 6103 | SOC-CAMERA V4L2 SUBSYSTEM |
6104 | M: Guennadi Liakhovetski <g.liakhovetski@gmx.de> | 6104 | M: Guennadi Liakhovetski <g.liakhovetski@gmx.de> |
6105 | L: linux-media@vger.kernel.org | 6105 | L: linux-media@vger.kernel.org |
6106 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git | 6106 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git |
6107 | S: Maintained | 6107 | S: Maintained |
6108 | F: include/media/v4l2* | 6108 | F: include/media/v4l2* |
6109 | F: drivers/media/video/v4l2* | 6109 | F: drivers/media/video/v4l2* |
6110 | 6110 | ||
6111 | SOEKRIS NET48XX LED SUPPORT | 6111 | SOEKRIS NET48XX LED SUPPORT |
6112 | M: Chris Boot <bootc@bootc.net> | 6112 | M: Chris Boot <bootc@bootc.net> |
6113 | S: Maintained | 6113 | S: Maintained |
6114 | F: drivers/leds/leds-net48xx.c | 6114 | F: drivers/leds/leds-net48xx.c |
6115 | 6115 | ||
6116 | SOFTWARE RAID (Multiple Disks) SUPPORT | 6116 | SOFTWARE RAID (Multiple Disks) SUPPORT |
6117 | M: Neil Brown <neilb@suse.de> | 6117 | M: Neil Brown <neilb@suse.de> |
6118 | L: linux-raid@vger.kernel.org | 6118 | L: linux-raid@vger.kernel.org |
6119 | S: Supported | 6119 | S: Supported |
6120 | F: drivers/md/ | 6120 | F: drivers/md/ |
6121 | F: include/linux/raid/ | 6121 | F: include/linux/raid/ |
6122 | 6122 | ||
6123 | SONIC NETWORK DRIVER | 6123 | SONIC NETWORK DRIVER |
6124 | M: Thomas Bogendoerfer <tsbogend@alpha.franken.de> | 6124 | M: Thomas Bogendoerfer <tsbogend@alpha.franken.de> |
6125 | L: netdev@vger.kernel.org | 6125 | L: netdev@vger.kernel.org |
6126 | S: Maintained | 6126 | S: Maintained |
6127 | F: drivers/net/ethernet/natsemi/sonic.* | 6127 | F: drivers/net/ethernet/natsemi/sonic.* |
6128 | 6128 | ||
6129 | SONICS SILICON BACKPLANE DRIVER (SSB) | 6129 | SONICS SILICON BACKPLANE DRIVER (SSB) |
6130 | M: Michael Buesch <m@bues.ch> | 6130 | M: Michael Buesch <m@bues.ch> |
6131 | L: netdev@vger.kernel.org | 6131 | L: netdev@vger.kernel.org |
6132 | S: Maintained | 6132 | S: Maintained |
6133 | F: drivers/ssb/ | 6133 | F: drivers/ssb/ |
6134 | F: include/linux/ssb/ | 6134 | F: include/linux/ssb/ |
6135 | 6135 | ||
6136 | SONY VAIO CONTROL DEVICE DRIVER | 6136 | SONY VAIO CONTROL DEVICE DRIVER |
6137 | M: Mattia Dongili <malattia@linux.it> | 6137 | M: Mattia Dongili <malattia@linux.it> |
6138 | L: platform-driver-x86@vger.kernel.org | 6138 | L: platform-driver-x86@vger.kernel.org |
6139 | W: http://www.linux.it/~malattia/wiki/index.php/Sony_drivers | 6139 | W: http://www.linux.it/~malattia/wiki/index.php/Sony_drivers |
6140 | S: Maintained | 6140 | S: Maintained |
6141 | F: Documentation/laptops/sony-laptop.txt | 6141 | F: Documentation/laptops/sony-laptop.txt |
6142 | F: drivers/char/sonypi.c | 6142 | F: drivers/char/sonypi.c |
6143 | F: drivers/platform/x86/sony-laptop.c | 6143 | F: drivers/platform/x86/sony-laptop.c |
6144 | F: include/linux/sony-laptop.h | 6144 | F: include/linux/sony-laptop.h |
6145 | 6145 | ||
6146 | SONY MEMORYSTICK CARD SUPPORT | 6146 | SONY MEMORYSTICK CARD SUPPORT |
6147 | M: Alex Dubov <oakad@yahoo.com> | 6147 | M: Alex Dubov <oakad@yahoo.com> |
6148 | W: http://tifmxx.berlios.de/ | 6148 | W: http://tifmxx.berlios.de/ |
6149 | S: Maintained | 6149 | S: Maintained |
6150 | F: drivers/memstick/host/tifm_ms.c | 6150 | F: drivers/memstick/host/tifm_ms.c |
6151 | 6151 | ||
6152 | SOUND | 6152 | SOUND |
6153 | M: Jaroslav Kysela <perex@perex.cz> | 6153 | M: Jaroslav Kysela <perex@perex.cz> |
6154 | M: Takashi Iwai <tiwai@suse.de> | 6154 | M: Takashi Iwai <tiwai@suse.de> |
6155 | L: alsa-devel@alsa-project.org (moderated for non-subscribers) | 6155 | L: alsa-devel@alsa-project.org (moderated for non-subscribers) |
6156 | W: http://www.alsa-project.org/ | 6156 | W: http://www.alsa-project.org/ |
6157 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git | 6157 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git |
6158 | T: git git://git.alsa-project.org/alsa-kernel.git | 6158 | T: git git://git.alsa-project.org/alsa-kernel.git |
6159 | S: Maintained | 6159 | S: Maintained |
6160 | F: Documentation/sound/ | 6160 | F: Documentation/sound/ |
6161 | F: include/sound/ | 6161 | F: include/sound/ |
6162 | F: sound/ | 6162 | F: sound/ |
6163 | 6163 | ||
6164 | SOUND - SOC LAYER / DYNAMIC AUDIO POWER MANAGEMENT (ASoC) | 6164 | SOUND - SOC LAYER / DYNAMIC AUDIO POWER MANAGEMENT (ASoC) |
6165 | M: Liam Girdwood <lrg@ti.com> | 6165 | M: Liam Girdwood <lrg@ti.com> |
6166 | M: Mark Brown <broonie@opensource.wolfsonmicro.com> | 6166 | M: Mark Brown <broonie@opensource.wolfsonmicro.com> |
6167 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git | 6167 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git |
6168 | L: alsa-devel@alsa-project.org (moderated for non-subscribers) | 6168 | L: alsa-devel@alsa-project.org (moderated for non-subscribers) |
6169 | W: http://alsa-project.org/main/index.php/ASoC | 6169 | W: http://alsa-project.org/main/index.php/ASoC |
6170 | S: Supported | 6170 | S: Supported |
6171 | F: sound/soc/ | 6171 | F: sound/soc/ |
6172 | F: include/sound/soc* | 6172 | F: include/sound/soc* |
6173 | 6173 | ||
6174 | SPARC + UltraSPARC (sparc/sparc64) | 6174 | SPARC + UltraSPARC (sparc/sparc64) |
6175 | M: "David S. Miller" <davem@davemloft.net> | 6175 | M: "David S. Miller" <davem@davemloft.net> |
6176 | L: sparclinux@vger.kernel.org | 6176 | L: sparclinux@vger.kernel.org |
6177 | Q: http://patchwork.ozlabs.org/project/sparclinux/list/ | 6177 | Q: http://patchwork.ozlabs.org/project/sparclinux/list/ |
6178 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6.git | 6178 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6.git |
6179 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-next-2.6.git | 6179 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-next-2.6.git |
6180 | S: Maintained | 6180 | S: Maintained |
6181 | F: arch/sparc/ | 6181 | F: arch/sparc/ |
6182 | F: drivers/sbus/ | 6182 | F: drivers/sbus/ |
6183 | 6183 | ||
6184 | SPARC SERIAL DRIVERS | 6184 | SPARC SERIAL DRIVERS |
6185 | M: "David S. Miller" <davem@davemloft.net> | 6185 | M: "David S. Miller" <davem@davemloft.net> |
6186 | L: sparclinux@vger.kernel.org | 6186 | L: sparclinux@vger.kernel.org |
6187 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6.git | 6187 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6.git |
6188 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-next-2.6.git | 6188 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-next-2.6.git |
6189 | S: Maintained | 6189 | S: Maintained |
6190 | F: include/linux/sunserialcore.h | ||
6190 | F: drivers/tty/serial/suncore.c | 6191 | F: drivers/tty/serial/suncore.c |
6191 | F: drivers/tty/serial/suncore.h | ||
6192 | F: drivers/tty/serial/sunhv.c | 6192 | F: drivers/tty/serial/sunhv.c |
6193 | F: drivers/tty/serial/sunsab.c | 6193 | F: drivers/tty/serial/sunsab.c |
6194 | F: drivers/tty/serial/sunsab.h | 6194 | F: drivers/tty/serial/sunsab.h |
6195 | F: drivers/tty/serial/sunsu.c | 6195 | F: drivers/tty/serial/sunsu.c |
6196 | F: drivers/tty/serial/sunzilog.c | 6196 | F: drivers/tty/serial/sunzilog.c |
6197 | F: drivers/tty/serial/sunzilog.h | 6197 | F: drivers/tty/serial/sunzilog.h |
6198 | 6198 | ||
6199 | SPEAR PLATFORM SUPPORT | 6199 | SPEAR PLATFORM SUPPORT |
6200 | M: Viresh Kumar <viresh.kumar@st.com> | 6200 | M: Viresh Kumar <viresh.kumar@st.com> |
6201 | W: http://www.st.com/spear | 6201 | W: http://www.st.com/spear |
6202 | S: Maintained | 6202 | S: Maintained |
6203 | F: arch/arm/plat-spear/ | 6203 | F: arch/arm/plat-spear/ |
6204 | 6204 | ||
6205 | SPEAR3XX MACHINE SUPPORT | 6205 | SPEAR3XX MACHINE SUPPORT |
6206 | M: Viresh Kumar <viresh.kumar@st.com> | 6206 | M: Viresh Kumar <viresh.kumar@st.com> |
6207 | W: http://www.st.com/spear | 6207 | W: http://www.st.com/spear |
6208 | S: Maintained | 6208 | S: Maintained |
6209 | F: arch/arm/mach-spear3xx/ | 6209 | F: arch/arm/mach-spear3xx/ |
6210 | 6210 | ||
6211 | SPEAR6XX MACHINE SUPPORT | 6211 | SPEAR6XX MACHINE SUPPORT |
6212 | M: Rajeev Kumar <rajeev-dlh.kumar@st.com> | 6212 | M: Rajeev Kumar <rajeev-dlh.kumar@st.com> |
6213 | W: http://www.st.com/spear | 6213 | W: http://www.st.com/spear |
6214 | S: Maintained | 6214 | S: Maintained |
6215 | F: arch/arm/mach-spear6xx/ | 6215 | F: arch/arm/mach-spear6xx/ |
6216 | 6216 | ||
6217 | SPEAR CLOCK FRAMEWORK SUPPORT | 6217 | SPEAR CLOCK FRAMEWORK SUPPORT |
6218 | M: Viresh Kumar <viresh.kumar@st.com> | 6218 | M: Viresh Kumar <viresh.kumar@st.com> |
6219 | W: http://www.st.com/spear | 6219 | W: http://www.st.com/spear |
6220 | S: Maintained | 6220 | S: Maintained |
6221 | F: arch/arm/mach-spear*/clock.c | 6221 | F: arch/arm/mach-spear*/clock.c |
6222 | F: arch/arm/plat-spear/clock.c | 6222 | F: arch/arm/plat-spear/clock.c |
6223 | F: arch/arm/plat-spear/include/plat/clock.h | 6223 | F: arch/arm/plat-spear/include/plat/clock.h |
6224 | 6224 | ||
6225 | SPEAR PAD MULTIPLEXING SUPPORT | 6225 | SPEAR PAD MULTIPLEXING SUPPORT |
6226 | M: Viresh Kumar <viresh.kumar@st.com> | 6226 | M: Viresh Kumar <viresh.kumar@st.com> |
6227 | W: http://www.st.com/spear | 6227 | W: http://www.st.com/spear |
6228 | S: Maintained | 6228 | S: Maintained |
6229 | F: arch/arm/plat-spear/include/plat/padmux.h | 6229 | F: arch/arm/plat-spear/include/plat/padmux.h |
6230 | F: arch/arm/plat-spear/padmux.c | 6230 | F: arch/arm/plat-spear/padmux.c |
6231 | F: arch/arm/mach-spear*/spear*xx.c | 6231 | F: arch/arm/mach-spear*/spear*xx.c |
6232 | F: arch/arm/mach-spear*/include/mach/generic.h | 6232 | F: arch/arm/mach-spear*/include/mach/generic.h |
6233 | F: arch/arm/mach-spear3xx/spear3*0.c | 6233 | F: arch/arm/mach-spear3xx/spear3*0.c |
6234 | F: arch/arm/mach-spear3xx/spear3*0_evb.c | 6234 | F: arch/arm/mach-spear3xx/spear3*0_evb.c |
6235 | F: arch/arm/mach-spear6xx/spear600.c | 6235 | F: arch/arm/mach-spear6xx/spear600.c |
6236 | F: arch/arm/mach-spear6xx/spear600_evb.c | 6236 | F: arch/arm/mach-spear6xx/spear600_evb.c |
6237 | 6237 | ||
6238 | SPI SUBSYSTEM | 6238 | SPI SUBSYSTEM |
6239 | M: Grant Likely <grant.likely@secretlab.ca> | 6239 | M: Grant Likely <grant.likely@secretlab.ca> |
6240 | L: spi-devel-general@lists.sourceforge.net | 6240 | L: spi-devel-general@lists.sourceforge.net |
6241 | Q: http://patchwork.kernel.org/project/spi-devel-general/list/ | 6241 | Q: http://patchwork.kernel.org/project/spi-devel-general/list/ |
6242 | T: git git://git.secretlab.ca/git/linux-2.6.git | 6242 | T: git git://git.secretlab.ca/git/linux-2.6.git |
6243 | S: Maintained | 6243 | S: Maintained |
6244 | F: Documentation/spi/ | 6244 | F: Documentation/spi/ |
6245 | F: drivers/spi/ | 6245 | F: drivers/spi/ |
6246 | F: include/linux/spi/ | 6246 | F: include/linux/spi/ |
6247 | 6247 | ||
6248 | SPIDERNET NETWORK DRIVER for CELL | 6248 | SPIDERNET NETWORK DRIVER for CELL |
6249 | M: Ishizaki Kou <kou.ishizaki@toshiba.co.jp> | 6249 | M: Ishizaki Kou <kou.ishizaki@toshiba.co.jp> |
6250 | M: Jens Osterkamp <jens@de.ibm.com> | 6250 | M: Jens Osterkamp <jens@de.ibm.com> |
6251 | L: netdev@vger.kernel.org | 6251 | L: netdev@vger.kernel.org |
6252 | S: Supported | 6252 | S: Supported |
6253 | F: Documentation/networking/spider_net.txt | 6253 | F: Documentation/networking/spider_net.txt |
6254 | F: drivers/net/ethernet/toshiba/spider_net* | 6254 | F: drivers/net/ethernet/toshiba/spider_net* |
6255 | 6255 | ||
6256 | SPU FILE SYSTEM | 6256 | SPU FILE SYSTEM |
6257 | M: Jeremy Kerr <jk@ozlabs.org> | 6257 | M: Jeremy Kerr <jk@ozlabs.org> |
6258 | L: linuxppc-dev@lists.ozlabs.org | 6258 | L: linuxppc-dev@lists.ozlabs.org |
6259 | L: cbe-oss-dev@lists.ozlabs.org | 6259 | L: cbe-oss-dev@lists.ozlabs.org |
6260 | W: http://www.ibm.com/developerworks/power/cell/ | 6260 | W: http://www.ibm.com/developerworks/power/cell/ |
6261 | S: Supported | 6261 | S: Supported |
6262 | F: Documentation/filesystems/spufs.txt | 6262 | F: Documentation/filesystems/spufs.txt |
6263 | F: arch/powerpc/platforms/cell/spufs/ | 6263 | F: arch/powerpc/platforms/cell/spufs/ |
6264 | 6264 | ||
6265 | SQUASHFS FILE SYSTEM | 6265 | SQUASHFS FILE SYSTEM |
6266 | M: Phillip Lougher <phillip@squashfs.org.uk> | 6266 | M: Phillip Lougher <phillip@squashfs.org.uk> |
6267 | L: squashfs-devel@lists.sourceforge.net (subscribers-only) | 6267 | L: squashfs-devel@lists.sourceforge.net (subscribers-only) |
6268 | W: http://squashfs.org.uk | 6268 | W: http://squashfs.org.uk |
6269 | S: Maintained | 6269 | S: Maintained |
6270 | F: Documentation/filesystems/squashfs.txt | 6270 | F: Documentation/filesystems/squashfs.txt |
6271 | F: fs/squashfs/ | 6271 | F: fs/squashfs/ |
6272 | 6272 | ||
6273 | SRM (Alpha) environment access | 6273 | SRM (Alpha) environment access |
6274 | M: Jan-Benedict Glaw <jbglaw@lug-owl.de> | 6274 | M: Jan-Benedict Glaw <jbglaw@lug-owl.de> |
6275 | S: Maintained | 6275 | S: Maintained |
6276 | F: arch/alpha/kernel/srm_env.c | 6276 | F: arch/alpha/kernel/srm_env.c |
6277 | 6277 | ||
6278 | STABLE BRANCH | 6278 | STABLE BRANCH |
6279 | M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 6279 | M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
6280 | L: stable@vger.kernel.org | 6280 | L: stable@vger.kernel.org |
6281 | S: Supported | 6281 | S: Supported |
6282 | 6282 | ||
6283 | STAGING SUBSYSTEM | 6283 | STAGING SUBSYSTEM |
6284 | M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 6284 | M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
6285 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git | 6285 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git |
6286 | L: devel@driverdev.osuosl.org | 6286 | L: devel@driverdev.osuosl.org |
6287 | S: Supported | 6287 | S: Supported |
6288 | F: drivers/staging/ | 6288 | F: drivers/staging/ |
6289 | 6289 | ||
6290 | STAGING - AGERE HERMES II and II.5 WIRELESS DRIVERS | 6290 | STAGING - AGERE HERMES II and II.5 WIRELESS DRIVERS |
6291 | M: Henk de Groot <pe1dnn@amsat.org> | 6291 | M: Henk de Groot <pe1dnn@amsat.org> |
6292 | S: Odd Fixes | 6292 | S: Odd Fixes |
6293 | F: drivers/staging/wlags49_h2/ | 6293 | F: drivers/staging/wlags49_h2/ |
6294 | F: drivers/staging/wlags49_h25/ | 6294 | F: drivers/staging/wlags49_h25/ |
6295 | 6295 | ||
6296 | STAGING - ASUS OLED | 6296 | STAGING - ASUS OLED |
6297 | M: Jakub Schmidtke <sjakub@gmail.com> | 6297 | M: Jakub Schmidtke <sjakub@gmail.com> |
6298 | S: Odd Fixes | 6298 | S: Odd Fixes |
6299 | F: drivers/staging/asus_oled/ | 6299 | F: drivers/staging/asus_oled/ |
6300 | 6300 | ||
6301 | STAGING - COMEDI | 6301 | STAGING - COMEDI |
6302 | M: Ian Abbott <abbotti@mev.co.uk> | 6302 | M: Ian Abbott <abbotti@mev.co.uk> |
6303 | M: Mori Hess <fmhess@users.sourceforge.net> | 6303 | M: Mori Hess <fmhess@users.sourceforge.net> |
6304 | S: Odd Fixes | 6304 | S: Odd Fixes |
6305 | F: drivers/staging/comedi/ | 6305 | F: drivers/staging/comedi/ |
6306 | 6306 | ||
6307 | STAGING - CRYSTAL HD VIDEO DECODER | 6307 | STAGING - CRYSTAL HD VIDEO DECODER |
6308 | M: Naren Sankar <nsankar@broadcom.com> | 6308 | M: Naren Sankar <nsankar@broadcom.com> |
6309 | M: Jarod Wilson <jarod@wilsonet.com> | 6309 | M: Jarod Wilson <jarod@wilsonet.com> |
6310 | M: Scott Davilla <davilla@4pi.com> | 6310 | M: Scott Davilla <davilla@4pi.com> |
6311 | M: Manu Abraham <abraham.manu@gmail.com> | 6311 | M: Manu Abraham <abraham.manu@gmail.com> |
6312 | S: Odd Fixes | 6312 | S: Odd Fixes |
6313 | F: drivers/staging/crystalhd/ | 6313 | F: drivers/staging/crystalhd/ |
6314 | 6314 | ||
6315 | STAGING - ECHO CANCELLER | 6315 | STAGING - ECHO CANCELLER |
6316 | M: Steve Underwood <steveu@coppice.org> | 6316 | M: Steve Underwood <steveu@coppice.org> |
6317 | M: David Rowe <david@rowetel.com> | 6317 | M: David Rowe <david@rowetel.com> |
6318 | S: Odd Fixes | 6318 | S: Odd Fixes |
6319 | F: drivers/staging/echo/ | 6319 | F: drivers/staging/echo/ |
6320 | 6320 | ||
6321 | STAGING - ET131X NETWORK DRIVER | 6321 | STAGING - ET131X NETWORK DRIVER |
6322 | M: Mark Einon <mark.einon@gmail.com> | 6322 | M: Mark Einon <mark.einon@gmail.com> |
6323 | S: Odd Fixes | 6323 | S: Odd Fixes |
6324 | F: drivers/staging/et131x/ | 6324 | F: drivers/staging/et131x/ |
6325 | 6325 | ||
6326 | STAGING - FLARION FT1000 DRIVERS | 6326 | STAGING - FLARION FT1000 DRIVERS |
6327 | M: Marek Belisko <marek.belisko@gmail.com> | 6327 | M: Marek Belisko <marek.belisko@gmail.com> |
6328 | S: Odd Fixes | 6328 | S: Odd Fixes |
6329 | F: drivers/staging/ft1000/ | 6329 | F: drivers/staging/ft1000/ |
6330 | 6330 | ||
6331 | STAGING - FRONTIER TRANZPORT AND ALPHATRACK | 6331 | STAGING - FRONTIER TRANZPORT AND ALPHATRACK |
6332 | M: David Tรคht <d@teklibre.com> | 6332 | M: David Tรคht <d@teklibre.com> |
6333 | S: Odd Fixes | 6333 | S: Odd Fixes |
6334 | F: drivers/staging/frontier/ | 6334 | F: drivers/staging/frontier/ |
6335 | 6335 | ||
6336 | STAGING - INDUSTRIAL IO | 6336 | STAGING - INDUSTRIAL IO |
6337 | M: Jonathan Cameron <jic23@cam.ac.uk> | 6337 | M: Jonathan Cameron <jic23@cam.ac.uk> |
6338 | L: linux-iio@vger.kernel.org | 6338 | L: linux-iio@vger.kernel.org |
6339 | S: Odd Fixes | 6339 | S: Odd Fixes |
6340 | F: drivers/staging/iio/ | 6340 | F: drivers/staging/iio/ |
6341 | 6341 | ||
6342 | STAGING - LIRC (LINUX INFRARED REMOTE CONTROL) DRIVERS | 6342 | STAGING - LIRC (LINUX INFRARED REMOTE CONTROL) DRIVERS |
6343 | M: Jarod Wilson <jarod@wilsonet.com> | 6343 | M: Jarod Wilson <jarod@wilsonet.com> |
6344 | W: http://www.lirc.org/ | 6344 | W: http://www.lirc.org/ |
6345 | S: Odd Fixes | 6345 | S: Odd Fixes |
6346 | F: drivers/staging/media/lirc/ | 6346 | F: drivers/staging/media/lirc/ |
6347 | 6347 | ||
6348 | STAGING - NVIDIA COMPLIANT EMBEDDED CONTROLLER INTERFACE (nvec) | 6348 | STAGING - NVIDIA COMPLIANT EMBEDDED CONTROLLER INTERFACE (nvec) |
6349 | M: Julian Andres Klode <jak@jak-linux.org> | 6349 | M: Julian Andres Klode <jak@jak-linux.org> |
6350 | M: Marc Dietrich <marvin24@gmx.de> | 6350 | M: Marc Dietrich <marvin24@gmx.de> |
6351 | L: ac100@lists.launchpad.net (moderated for non-subscribers) | 6351 | L: ac100@lists.launchpad.net (moderated for non-subscribers) |
6352 | S: Maintained | 6352 | S: Maintained |
6353 | F: drivers/staging/nvec/ | 6353 | F: drivers/staging/nvec/ |
6354 | 6354 | ||
6355 | STAGING - OLPC SECONDARY DISPLAY CONTROLLER (DCON) | 6355 | STAGING - OLPC SECONDARY DISPLAY CONTROLLER (DCON) |
6356 | M: Andres Salomon <dilinger@queued.net> | 6356 | M: Andres Salomon <dilinger@queued.net> |
6357 | M: Chris Ball <cjb@laptop.org> | 6357 | M: Chris Ball <cjb@laptop.org> |
6358 | M: Jon Nettleton <jon.nettleton@gmail.com> | 6358 | M: Jon Nettleton <jon.nettleton@gmail.com> |
6359 | W: http://wiki.laptop.org/go/DCON | 6359 | W: http://wiki.laptop.org/go/DCON |
6360 | S: Odd Fixes | 6360 | S: Odd Fixes |
6361 | F: drivers/staging/olpc_dcon/ | 6361 | F: drivers/staging/olpc_dcon/ |
6362 | 6362 | ||
6363 | STAGING - PARALLEL LCD/KEYPAD PANEL DRIVER | 6363 | STAGING - PARALLEL LCD/KEYPAD PANEL DRIVER |
6364 | M: Willy Tarreau <willy@meta-x.org> | 6364 | M: Willy Tarreau <willy@meta-x.org> |
6365 | S: Odd Fixes | 6365 | S: Odd Fixes |
6366 | F: drivers/staging/panel/ | 6366 | F: drivers/staging/panel/ |
6367 | 6367 | ||
6368 | STAGING - REALTEK RTL8712U DRIVERS | 6368 | STAGING - REALTEK RTL8712U DRIVERS |
6369 | M: Larry Finger <Larry.Finger@lwfinger.net> | 6369 | M: Larry Finger <Larry.Finger@lwfinger.net> |
6370 | M: Florian Schilhabel <florian.c.schilhabel@googlemail.com>. | 6370 | M: Florian Schilhabel <florian.c.schilhabel@googlemail.com>. |
6371 | S: Odd Fixes | 6371 | S: Odd Fixes |
6372 | F: drivers/staging/rtl8712/ | 6372 | F: drivers/staging/rtl8712/ |
6373 | 6373 | ||
6374 | STAGING - SILICON MOTION SM7XX FRAME BUFFER DRIVER | 6374 | STAGING - SILICON MOTION SM7XX FRAME BUFFER DRIVER |
6375 | M: Teddy Wang <teddy.wang@siliconmotion.com.cn> | 6375 | M: Teddy Wang <teddy.wang@siliconmotion.com.cn> |
6376 | S: Odd Fixes | 6376 | S: Odd Fixes |
6377 | F: drivers/staging/sm7xx/ | 6377 | F: drivers/staging/sm7xx/ |
6378 | 6378 | ||
6379 | STAGING - SOFTLOGIC 6x10 MPEG CODEC | 6379 | STAGING - SOFTLOGIC 6x10 MPEG CODEC |
6380 | M: Ben Collins <bcollins@bluecherry.net> | 6380 | M: Ben Collins <bcollins@bluecherry.net> |
6381 | S: Odd Fixes | 6381 | S: Odd Fixes |
6382 | F: drivers/staging/media/solo6x10/ | 6382 | F: drivers/staging/media/solo6x10/ |
6383 | 6383 | ||
6384 | STAGING - SPEAKUP CONSOLE SPEECH DRIVER | 6384 | STAGING - SPEAKUP CONSOLE SPEECH DRIVER |
6385 | M: William Hubbs <w.d.hubbs@gmail.com> | 6385 | M: William Hubbs <w.d.hubbs@gmail.com> |
6386 | M: Chris Brannon <chris@the-brannons.com> | 6386 | M: Chris Brannon <chris@the-brannons.com> |
6387 | M: Kirk Reiser <kirk@braille.uwo.ca> | 6387 | M: Kirk Reiser <kirk@braille.uwo.ca> |
6388 | M: Samuel Thibault <samuel.thibault@ens-lyon.org> | 6388 | M: Samuel Thibault <samuel.thibault@ens-lyon.org> |
6389 | L: speakup@braille.uwo.ca | 6389 | L: speakup@braille.uwo.ca |
6390 | W: http://www.linux-speakup.org/ | 6390 | W: http://www.linux-speakup.org/ |
6391 | S: Odd Fixes | 6391 | S: Odd Fixes |
6392 | F: drivers/staging/speakup/ | 6392 | F: drivers/staging/speakup/ |
6393 | 6393 | ||
6394 | STAGING - TI DSP BRIDGE DRIVERS | 6394 | STAGING - TI DSP BRIDGE DRIVERS |
6395 | M: Omar Ramirez Luna <omar.ramirez@ti.com> | 6395 | M: Omar Ramirez Luna <omar.ramirez@ti.com> |
6396 | S: Odd Fixes | 6396 | S: Odd Fixes |
6397 | F: drivers/staging/tidspbridge/ | 6397 | F: drivers/staging/tidspbridge/ |
6398 | 6398 | ||
6399 | STAGING - USB ENE SM/MS CARD READER DRIVER | 6399 | STAGING - USB ENE SM/MS CARD READER DRIVER |
6400 | M: Al Cho <acho@novell.com> | 6400 | M: Al Cho <acho@novell.com> |
6401 | S: Odd Fixes | 6401 | S: Odd Fixes |
6402 | F: drivers/staging/keucr/ | 6402 | F: drivers/staging/keucr/ |
6403 | 6403 | ||
6404 | STAGING - VIA VT665X DRIVERS | 6404 | STAGING - VIA VT665X DRIVERS |
6405 | M: Forest Bond <forest@alittletooquiet.net> | 6405 | M: Forest Bond <forest@alittletooquiet.net> |
6406 | S: Odd Fixes | 6406 | S: Odd Fixes |
6407 | F: drivers/staging/vt665?/ | 6407 | F: drivers/staging/vt665?/ |
6408 | 6408 | ||
6409 | STAGING - WINBOND IS89C35 WLAN USB DRIVER | 6409 | STAGING - WINBOND IS89C35 WLAN USB DRIVER |
6410 | M: Pavel Machek <pavel@ucw.cz> | 6410 | M: Pavel Machek <pavel@ucw.cz> |
6411 | S: Odd Fixes | 6411 | S: Odd Fixes |
6412 | F: drivers/staging/winbond/ | 6412 | F: drivers/staging/winbond/ |
6413 | 6413 | ||
6414 | STAGING - XGI Z7,Z9,Z11 PCI DISPLAY DRIVER | 6414 | STAGING - XGI Z7,Z9,Z11 PCI DISPLAY DRIVER |
6415 | M: Arnaud Patard <arnaud.patard@rtp-net.org> | 6415 | M: Arnaud Patard <arnaud.patard@rtp-net.org> |
6416 | S: Odd Fixes | 6416 | S: Odd Fixes |
6417 | F: drivers/staging/xgifb/ | 6417 | F: drivers/staging/xgifb/ |
6418 | 6418 | ||
6419 | STARFIRE/DURALAN NETWORK DRIVER | 6419 | STARFIRE/DURALAN NETWORK DRIVER |
6420 | M: Ion Badulescu <ionut@badula.org> | 6420 | M: Ion Badulescu <ionut@badula.org> |
6421 | S: Odd Fixes | 6421 | S: Odd Fixes |
6422 | F: drivers/net/ethernet/adaptec/starfire* | 6422 | F: drivers/net/ethernet/adaptec/starfire* |
6423 | 6423 | ||
6424 | SUN3/3X | 6424 | SUN3/3X |
6425 | M: Sam Creasey <sammy@sammy.net> | 6425 | M: Sam Creasey <sammy@sammy.net> |
6426 | W: http://sammy.net/sun3/ | 6426 | W: http://sammy.net/sun3/ |
6427 | S: Maintained | 6427 | S: Maintained |
6428 | F: arch/m68k/kernel/*sun3* | 6428 | F: arch/m68k/kernel/*sun3* |
6429 | F: arch/m68k/sun3*/ | 6429 | F: arch/m68k/sun3*/ |
6430 | F: arch/m68k/include/asm/sun3* | 6430 | F: arch/m68k/include/asm/sun3* |
6431 | F: drivers/net/ethernet/i825xx/sun3* | 6431 | F: drivers/net/ethernet/i825xx/sun3* |
6432 | 6432 | ||
6433 | SUPERH | 6433 | SUPERH |
6434 | M: Paul Mundt <lethal@linux-sh.org> | 6434 | M: Paul Mundt <lethal@linux-sh.org> |
6435 | L: linux-sh@vger.kernel.org | 6435 | L: linux-sh@vger.kernel.org |
6436 | W: http://www.linux-sh.org | 6436 | W: http://www.linux-sh.org |
6437 | Q: http://patchwork.kernel.org/project/linux-sh/list/ | 6437 | Q: http://patchwork.kernel.org/project/linux-sh/list/ |
6438 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6.git sh-latest | 6438 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6.git sh-latest |
6439 | S: Supported | 6439 | S: Supported |
6440 | F: Documentation/sh/ | 6440 | F: Documentation/sh/ |
6441 | F: arch/sh/ | 6441 | F: arch/sh/ |
6442 | F: drivers/sh/ | 6442 | F: drivers/sh/ |
6443 | 6443 | ||
6444 | SUSPEND TO RAM | 6444 | SUSPEND TO RAM |
6445 | M: Len Brown <len.brown@intel.com> | 6445 | M: Len Brown <len.brown@intel.com> |
6446 | M: Pavel Machek <pavel@ucw.cz> | 6446 | M: Pavel Machek <pavel@ucw.cz> |
6447 | M: "Rafael J. Wysocki" <rjw@sisk.pl> | 6447 | M: "Rafael J. Wysocki" <rjw@sisk.pl> |
6448 | L: linux-pm@vger.kernel.org | 6448 | L: linux-pm@vger.kernel.org |
6449 | S: Supported | 6449 | S: Supported |
6450 | F: Documentation/power/ | 6450 | F: Documentation/power/ |
6451 | F: arch/x86/kernel/acpi/ | 6451 | F: arch/x86/kernel/acpi/ |
6452 | F: drivers/base/power/ | 6452 | F: drivers/base/power/ |
6453 | F: kernel/power/ | 6453 | F: kernel/power/ |
6454 | F: include/linux/suspend.h | 6454 | F: include/linux/suspend.h |
6455 | F: include/linux/freezer.h | 6455 | F: include/linux/freezer.h |
6456 | F: include/linux/pm.h | 6456 | F: include/linux/pm.h |
6457 | 6457 | ||
6458 | SVGA HANDLING | 6458 | SVGA HANDLING |
6459 | M: Martin Mares <mj@ucw.cz> | 6459 | M: Martin Mares <mj@ucw.cz> |
6460 | L: linux-video@atrey.karlin.mff.cuni.cz | 6460 | L: linux-video@atrey.karlin.mff.cuni.cz |
6461 | S: Maintained | 6461 | S: Maintained |
6462 | F: Documentation/svga.txt | 6462 | F: Documentation/svga.txt |
6463 | F: arch/x86/boot/video* | 6463 | F: arch/x86/boot/video* |
6464 | 6464 | ||
6465 | SYSV FILESYSTEM | 6465 | SYSV FILESYSTEM |
6466 | M: Christoph Hellwig <hch@infradead.org> | 6466 | M: Christoph Hellwig <hch@infradead.org> |
6467 | S: Maintained | 6467 | S: Maintained |
6468 | F: Documentation/filesystems/sysv-fs.txt | 6468 | F: Documentation/filesystems/sysv-fs.txt |
6469 | F: fs/sysv/ | 6469 | F: fs/sysv/ |
6470 | F: include/linux/sysv_fs.h | 6470 | F: include/linux/sysv_fs.h |
6471 | 6471 | ||
6472 | TARGET SUBSYSTEM | 6472 | TARGET SUBSYSTEM |
6473 | M: Nicholas A. Bellinger <nab@linux-iscsi.org> | 6473 | M: Nicholas A. Bellinger <nab@linux-iscsi.org> |
6474 | L: linux-scsi@vger.kernel.org | 6474 | L: linux-scsi@vger.kernel.org |
6475 | L: target-devel@vger.kernel.org | 6475 | L: target-devel@vger.kernel.org |
6476 | L: http://groups.google.com/group/linux-iscsi-target-dev | 6476 | L: http://groups.google.com/group/linux-iscsi-target-dev |
6477 | W: http://www.linux-iscsi.org | 6477 | W: http://www.linux-iscsi.org |
6478 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/nab/lio-core-2.6.git master | 6478 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/nab/lio-core-2.6.git master |
6479 | S: Supported | 6479 | S: Supported |
6480 | F: drivers/target/ | 6480 | F: drivers/target/ |
6481 | F: include/target/ | 6481 | F: include/target/ |
6482 | F: Documentation/target/ | 6482 | F: Documentation/target/ |
6483 | 6483 | ||
6484 | TASKSTATS STATISTICS INTERFACE | 6484 | TASKSTATS STATISTICS INTERFACE |
6485 | M: Balbir Singh <bsingharora@gmail.com> | 6485 | M: Balbir Singh <bsingharora@gmail.com> |
6486 | S: Maintained | 6486 | S: Maintained |
6487 | F: Documentation/accounting/taskstats* | 6487 | F: Documentation/accounting/taskstats* |
6488 | F: include/linux/taskstats* | 6488 | F: include/linux/taskstats* |
6489 | F: kernel/taskstats.c | 6489 | F: kernel/taskstats.c |
6490 | 6490 | ||
6491 | TC CLASSIFIER | 6491 | TC CLASSIFIER |
6492 | M: Jamal Hadi Salim <hadi@cyberus.ca> | 6492 | M: Jamal Hadi Salim <hadi@cyberus.ca> |
6493 | L: netdev@vger.kernel.org | 6493 | L: netdev@vger.kernel.org |
6494 | S: Maintained | 6494 | S: Maintained |
6495 | F: include/linux/pkt_cls.h | 6495 | F: include/linux/pkt_cls.h |
6496 | F: include/net/pkt_cls.h | 6496 | F: include/net/pkt_cls.h |
6497 | F: net/sched/ | 6497 | F: net/sched/ |
6498 | 6498 | ||
6499 | TCP LOW PRIORITY MODULE | 6499 | TCP LOW PRIORITY MODULE |
6500 | M: "Wong Hoi Sing, Edison" <hswong3i@gmail.com> | 6500 | M: "Wong Hoi Sing, Edison" <hswong3i@gmail.com> |
6501 | M: "Hung Hing Lun, Mike" <hlhung3i@gmail.com> | 6501 | M: "Hung Hing Lun, Mike" <hlhung3i@gmail.com> |
6502 | W: http://tcp-lp-mod.sourceforge.net/ | 6502 | W: http://tcp-lp-mod.sourceforge.net/ |
6503 | S: Maintained | 6503 | S: Maintained |
6504 | F: net/ipv4/tcp_lp.c | 6504 | F: net/ipv4/tcp_lp.c |
6505 | 6505 | ||
6506 | TEAM DRIVER | 6506 | TEAM DRIVER |
6507 | M: Jiri Pirko <jpirko@redhat.com> | 6507 | M: Jiri Pirko <jpirko@redhat.com> |
6508 | L: netdev@vger.kernel.org | 6508 | L: netdev@vger.kernel.org |
6509 | S: Supported | 6509 | S: Supported |
6510 | F: drivers/net/team/ | 6510 | F: drivers/net/team/ |
6511 | F: include/linux/if_team.h | 6511 | F: include/linux/if_team.h |
6512 | 6512 | ||
6513 | TEGRA SUPPORT | 6513 | TEGRA SUPPORT |
6514 | M: Colin Cross <ccross@android.com> | 6514 | M: Colin Cross <ccross@android.com> |
6515 | M: Olof Johansson <olof@lixom.net> | 6515 | M: Olof Johansson <olof@lixom.net> |
6516 | M: Stephen Warren <swarren@nvidia.com> | 6516 | M: Stephen Warren <swarren@nvidia.com> |
6517 | L: linux-tegra@vger.kernel.org | 6517 | L: linux-tegra@vger.kernel.org |
6518 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/olof/tegra.git | 6518 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/olof/tegra.git |
6519 | S: Supported | 6519 | S: Supported |
6520 | F: arch/arm/mach-tegra | 6520 | F: arch/arm/mach-tegra |
6521 | 6521 | ||
6522 | TEHUTI ETHERNET DRIVER | 6522 | TEHUTI ETHERNET DRIVER |
6523 | M: Andy Gospodarek <andy@greyhouse.net> | 6523 | M: Andy Gospodarek <andy@greyhouse.net> |
6524 | L: netdev@vger.kernel.org | 6524 | L: netdev@vger.kernel.org |
6525 | S: Supported | 6525 | S: Supported |
6526 | F: drivers/net/ethernet/tehuti/* | 6526 | F: drivers/net/ethernet/tehuti/* |
6527 | 6527 | ||
6528 | Telecom Clock Driver for MCPL0010 | 6528 | Telecom Clock Driver for MCPL0010 |
6529 | M: Mark Gross <mark.gross@intel.com> | 6529 | M: Mark Gross <mark.gross@intel.com> |
6530 | S: Supported | 6530 | S: Supported |
6531 | F: drivers/char/tlclk.c | 6531 | F: drivers/char/tlclk.c |
6532 | 6532 | ||
6533 | TENSILICA XTENSA PORT (xtensa) | 6533 | TENSILICA XTENSA PORT (xtensa) |
6534 | M: Chris Zankel <chris@zankel.net> | 6534 | M: Chris Zankel <chris@zankel.net> |
6535 | S: Maintained | 6535 | S: Maintained |
6536 | F: arch/xtensa/ | 6536 | F: arch/xtensa/ |
6537 | 6537 | ||
6538 | THINKPAD ACPI EXTRAS DRIVER | 6538 | THINKPAD ACPI EXTRAS DRIVER |
6539 | M: Henrique de Moraes Holschuh <ibm-acpi@hmh.eng.br> | 6539 | M: Henrique de Moraes Holschuh <ibm-acpi@hmh.eng.br> |
6540 | L: ibm-acpi-devel@lists.sourceforge.net | 6540 | L: ibm-acpi-devel@lists.sourceforge.net |
6541 | L: platform-driver-x86@vger.kernel.org | 6541 | L: platform-driver-x86@vger.kernel.org |
6542 | W: http://ibm-acpi.sourceforge.net | 6542 | W: http://ibm-acpi.sourceforge.net |
6543 | W: http://thinkwiki.org/wiki/Ibm-acpi | 6543 | W: http://thinkwiki.org/wiki/Ibm-acpi |
6544 | T: git git://repo.or.cz/linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git | 6544 | T: git git://repo.or.cz/linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git |
6545 | S: Maintained | 6545 | S: Maintained |
6546 | F: drivers/platform/x86/thinkpad_acpi.c | 6546 | F: drivers/platform/x86/thinkpad_acpi.c |
6547 | 6547 | ||
6548 | TI FLASH MEDIA INTERFACE DRIVER | 6548 | TI FLASH MEDIA INTERFACE DRIVER |
6549 | M: Alex Dubov <oakad@yahoo.com> | 6549 | M: Alex Dubov <oakad@yahoo.com> |
6550 | S: Maintained | 6550 | S: Maintained |
6551 | F: drivers/misc/tifm* | 6551 | F: drivers/misc/tifm* |
6552 | F: drivers/mmc/host/tifm_sd.c | 6552 | F: drivers/mmc/host/tifm_sd.c |
6553 | F: include/linux/tifm.h | 6553 | F: include/linux/tifm.h |
6554 | 6554 | ||
6555 | TI TWL4030 SERIES SOC CODEC DRIVER | 6555 | TI TWL4030 SERIES SOC CODEC DRIVER |
6556 | M: Peter Ujfalusi <peter.ujfalusi@ti.com> | 6556 | M: Peter Ujfalusi <peter.ujfalusi@ti.com> |
6557 | L: alsa-devel@alsa-project.org (moderated for non-subscribers) | 6557 | L: alsa-devel@alsa-project.org (moderated for non-subscribers) |
6558 | S: Maintained | 6558 | S: Maintained |
6559 | F: sound/soc/codecs/twl4030* | 6559 | F: sound/soc/codecs/twl4030* |
6560 | 6560 | ||
6561 | TIPC NETWORK LAYER | 6561 | TIPC NETWORK LAYER |
6562 | M: Jon Maloy <jon.maloy@ericsson.com> | 6562 | M: Jon Maloy <jon.maloy@ericsson.com> |
6563 | M: Allan Stephens <allan.stephens@windriver.com> | 6563 | M: Allan Stephens <allan.stephens@windriver.com> |
6564 | L: netdev@vger.kernel.org (core kernel code) | 6564 | L: netdev@vger.kernel.org (core kernel code) |
6565 | L: tipc-discussion@lists.sourceforge.net (user apps, general discussion) | 6565 | L: tipc-discussion@lists.sourceforge.net (user apps, general discussion) |
6566 | W: http://tipc.sourceforge.net/ | 6566 | W: http://tipc.sourceforge.net/ |
6567 | S: Maintained | 6567 | S: Maintained |
6568 | F: include/linux/tipc*.h | 6568 | F: include/linux/tipc*.h |
6569 | F: net/tipc/ | 6569 | F: net/tipc/ |
6570 | 6570 | ||
6571 | TILE ARCHITECTURE | 6571 | TILE ARCHITECTURE |
6572 | M: Chris Metcalf <cmetcalf@tilera.com> | 6572 | M: Chris Metcalf <cmetcalf@tilera.com> |
6573 | W: http://www.tilera.com/scm/ | 6573 | W: http://www.tilera.com/scm/ |
6574 | S: Supported | 6574 | S: Supported |
6575 | F: arch/tile/ | 6575 | F: arch/tile/ |
6576 | F: drivers/tty/hvc/hvc_tile.c | 6576 | F: drivers/tty/hvc/hvc_tile.c |
6577 | F: drivers/net/ethernet/tile/ | 6577 | F: drivers/net/ethernet/tile/ |
6578 | F: drivers/edac/tile_edac.c | 6578 | F: drivers/edac/tile_edac.c |
6579 | 6579 | ||
6580 | TLAN NETWORK DRIVER | 6580 | TLAN NETWORK DRIVER |
6581 | M: Samuel Chessman <chessman@tux.org> | 6581 | M: Samuel Chessman <chessman@tux.org> |
6582 | L: tlan-devel@lists.sourceforge.net (subscribers-only) | 6582 | L: tlan-devel@lists.sourceforge.net (subscribers-only) |
6583 | W: http://sourceforge.net/projects/tlan/ | 6583 | W: http://sourceforge.net/projects/tlan/ |
6584 | S: Maintained | 6584 | S: Maintained |
6585 | F: Documentation/networking/tlan.txt | 6585 | F: Documentation/networking/tlan.txt |
6586 | F: drivers/net/ethernet/ti/tlan.* | 6586 | F: drivers/net/ethernet/ti/tlan.* |
6587 | 6587 | ||
6588 | TOMOYO SECURITY MODULE | 6588 | TOMOYO SECURITY MODULE |
6589 | M: Kentaro Takeda <takedakn@nttdata.co.jp> | 6589 | M: Kentaro Takeda <takedakn@nttdata.co.jp> |
6590 | M: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> | 6590 | M: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> |
6591 | L: tomoyo-dev-en@lists.sourceforge.jp (subscribers-only, for developers in English) | 6591 | L: tomoyo-dev-en@lists.sourceforge.jp (subscribers-only, for developers in English) |
6592 | L: tomoyo-users-en@lists.sourceforge.jp (subscribers-only, for users in English) | 6592 | L: tomoyo-users-en@lists.sourceforge.jp (subscribers-only, for users in English) |
6593 | L: tomoyo-dev@lists.sourceforge.jp (subscribers-only, for developers in Japanese) | 6593 | L: tomoyo-dev@lists.sourceforge.jp (subscribers-only, for developers in Japanese) |
6594 | L: tomoyo-users@lists.sourceforge.jp (subscribers-only, for users in Japanese) | 6594 | L: tomoyo-users@lists.sourceforge.jp (subscribers-only, for users in Japanese) |
6595 | W: http://tomoyo.sourceforge.jp/ | 6595 | W: http://tomoyo.sourceforge.jp/ |
6596 | T: quilt http://svn.sourceforge.jp/svnroot/tomoyo/trunk/2.5.x/tomoyo-lsm/patches/ | 6596 | T: quilt http://svn.sourceforge.jp/svnroot/tomoyo/trunk/2.5.x/tomoyo-lsm/patches/ |
6597 | S: Maintained | 6597 | S: Maintained |
6598 | F: security/tomoyo/ | 6598 | F: security/tomoyo/ |
6599 | 6599 | ||
6600 | TOPSTAR LAPTOP EXTRAS DRIVER | 6600 | TOPSTAR LAPTOP EXTRAS DRIVER |
6601 | M: Herton Ronaldo Krzesinski <herton@canonical.com> | 6601 | M: Herton Ronaldo Krzesinski <herton@canonical.com> |
6602 | L: platform-driver-x86@vger.kernel.org | 6602 | L: platform-driver-x86@vger.kernel.org |
6603 | S: Maintained | 6603 | S: Maintained |
6604 | F: drivers/platform/x86/topstar-laptop.c | 6604 | F: drivers/platform/x86/topstar-laptop.c |
6605 | 6605 | ||
6606 | TOSHIBA ACPI EXTRAS DRIVER | 6606 | TOSHIBA ACPI EXTRAS DRIVER |
6607 | L: platform-driver-x86@vger.kernel.org | 6607 | L: platform-driver-x86@vger.kernel.org |
6608 | S: Orphan | 6608 | S: Orphan |
6609 | F: drivers/platform/x86/toshiba_acpi.c | 6609 | F: drivers/platform/x86/toshiba_acpi.c |
6610 | 6610 | ||
6611 | TOSHIBA SMM DRIVER | 6611 | TOSHIBA SMM DRIVER |
6612 | M: Jonathan Buzzard <jonathan@buzzard.org.uk> | 6612 | M: Jonathan Buzzard <jonathan@buzzard.org.uk> |
6613 | L: tlinux-users@tce.toshiba-dme.co.jp | 6613 | L: tlinux-users@tce.toshiba-dme.co.jp |
6614 | W: http://www.buzzard.org.uk/toshiba/ | 6614 | W: http://www.buzzard.org.uk/toshiba/ |
6615 | S: Maintained | 6615 | S: Maintained |
6616 | F: drivers/char/toshiba.c | 6616 | F: drivers/char/toshiba.c |
6617 | F: include/linux/toshiba.h | 6617 | F: include/linux/toshiba.h |
6618 | 6618 | ||
6619 | TMIO MMC DRIVER | 6619 | TMIO MMC DRIVER |
6620 | M: Guennadi Liakhovetski <g.liakhovetski@gmx.de> | 6620 | M: Guennadi Liakhovetski <g.liakhovetski@gmx.de> |
6621 | M: Ian Molton <ian@mnementh.co.uk> | 6621 | M: Ian Molton <ian@mnementh.co.uk> |
6622 | L: linux-mmc@vger.kernel.org | 6622 | L: linux-mmc@vger.kernel.org |
6623 | S: Maintained | 6623 | S: Maintained |
6624 | F: drivers/mmc/host/tmio_mmc* | 6624 | F: drivers/mmc/host/tmio_mmc* |
6625 | F: drivers/mmc/host/sh_mobile_sdhi.c | 6625 | F: drivers/mmc/host/sh_mobile_sdhi.c |
6626 | F: include/linux/mmc/tmio.h | 6626 | F: include/linux/mmc/tmio.h |
6627 | F: include/linux/mmc/sh_mobile_sdhi.h | 6627 | F: include/linux/mmc/sh_mobile_sdhi.h |
6628 | 6628 | ||
6629 | TMPFS (SHMEM FILESYSTEM) | 6629 | TMPFS (SHMEM FILESYSTEM) |
6630 | M: Hugh Dickins <hughd@google.com> | 6630 | M: Hugh Dickins <hughd@google.com> |
6631 | L: linux-mm@kvack.org | 6631 | L: linux-mm@kvack.org |
6632 | S: Maintained | 6632 | S: Maintained |
6633 | F: include/linux/shmem_fs.h | 6633 | F: include/linux/shmem_fs.h |
6634 | F: mm/shmem.c | 6634 | F: mm/shmem.c |
6635 | 6635 | ||
6636 | TPM DEVICE DRIVER | 6636 | TPM DEVICE DRIVER |
6637 | M: Debora Velarde <debora@linux.vnet.ibm.com> | 6637 | M: Debora Velarde <debora@linux.vnet.ibm.com> |
6638 | M: Rajiv Andrade <srajiv@linux.vnet.ibm.com> | 6638 | M: Rajiv Andrade <srajiv@linux.vnet.ibm.com> |
6639 | W: http://tpmdd.sourceforge.net | 6639 | W: http://tpmdd.sourceforge.net |
6640 | M: Marcel Selhorst <m.selhorst@sirrix.com> | 6640 | M: Marcel Selhorst <m.selhorst@sirrix.com> |
6641 | W: http://www.sirrix.com | 6641 | W: http://www.sirrix.com |
6642 | L: tpmdd-devel@lists.sourceforge.net (moderated for non-subscribers) | 6642 | L: tpmdd-devel@lists.sourceforge.net (moderated for non-subscribers) |
6643 | S: Maintained | 6643 | S: Maintained |
6644 | F: drivers/char/tpm/ | 6644 | F: drivers/char/tpm/ |
6645 | 6645 | ||
6646 | TRACING | 6646 | TRACING |
6647 | M: Steven Rostedt <rostedt@goodmis.org> | 6647 | M: Steven Rostedt <rostedt@goodmis.org> |
6648 | M: Frederic Weisbecker <fweisbec@gmail.com> | 6648 | M: Frederic Weisbecker <fweisbec@gmail.com> |
6649 | M: Ingo Molnar <mingo@redhat.com> | 6649 | M: Ingo Molnar <mingo@redhat.com> |
6650 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git perf/core | 6650 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git perf/core |
6651 | S: Maintained | 6651 | S: Maintained |
6652 | F: Documentation/trace/ftrace.txt | 6652 | F: Documentation/trace/ftrace.txt |
6653 | F: arch/*/*/*/ftrace.h | 6653 | F: arch/*/*/*/ftrace.h |
6654 | F: arch/*/kernel/ftrace.c | 6654 | F: arch/*/kernel/ftrace.c |
6655 | F: include/*/ftrace.h | 6655 | F: include/*/ftrace.h |
6656 | F: include/linux/trace*.h | 6656 | F: include/linux/trace*.h |
6657 | F: include/trace/ | 6657 | F: include/trace/ |
6658 | F: kernel/trace/ | 6658 | F: kernel/trace/ |
6659 | 6659 | ||
6660 | TRIVIAL PATCHES | 6660 | TRIVIAL PATCHES |
6661 | M: Jiri Kosina <trivial@kernel.org> | 6661 | M: Jiri Kosina <trivial@kernel.org> |
6662 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial.git | 6662 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial.git |
6663 | S: Maintained | 6663 | S: Maintained |
6664 | K: ^Subject:.*(?i)trivial | 6664 | K: ^Subject:.*(?i)trivial |
6665 | 6665 | ||
6666 | TTY LAYER | 6666 | TTY LAYER |
6667 | M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 6667 | M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
6668 | S: Supported | 6668 | S: Supported |
6669 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty-2.6.git | 6669 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty-2.6.git |
6670 | F: drivers/tty/ | 6670 | F: drivers/tty/ |
6671 | F: drivers/tty/serial/serial_core.c | 6671 | F: drivers/tty/serial/serial_core.c |
6672 | F: include/linux/serial_core.h | 6672 | F: include/linux/serial_core.h |
6673 | F: include/linux/serial.h | 6673 | F: include/linux/serial.h |
6674 | F: include/linux/tty.h | 6674 | F: include/linux/tty.h |
6675 | 6675 | ||
6676 | TULIP NETWORK DRIVERS | 6676 | TULIP NETWORK DRIVERS |
6677 | M: Grant Grundler <grundler@parisc-linux.org> | 6677 | M: Grant Grundler <grundler@parisc-linux.org> |
6678 | L: netdev@vger.kernel.org | 6678 | L: netdev@vger.kernel.org |
6679 | S: Maintained | 6679 | S: Maintained |
6680 | F: drivers/net/ethernet/dec/tulip/ | 6680 | F: drivers/net/ethernet/dec/tulip/ |
6681 | 6681 | ||
6682 | TUN/TAP driver | 6682 | TUN/TAP driver |
6683 | M: Maxim Krasnyansky <maxk@qualcomm.com> | 6683 | M: Maxim Krasnyansky <maxk@qualcomm.com> |
6684 | L: vtun@office.satix.net | 6684 | L: vtun@office.satix.net |
6685 | W: http://vtun.sourceforge.net/tun | 6685 | W: http://vtun.sourceforge.net/tun |
6686 | S: Maintained | 6686 | S: Maintained |
6687 | F: Documentation/networking/tuntap.txt | 6687 | F: Documentation/networking/tuntap.txt |
6688 | F: arch/um/os-Linux/drivers/ | 6688 | F: arch/um/os-Linux/drivers/ |
6689 | 6689 | ||
6690 | TURBOCHANNEL SUBSYSTEM | 6690 | TURBOCHANNEL SUBSYSTEM |
6691 | M: "Maciej W. Rozycki" <macro@linux-mips.org> | 6691 | M: "Maciej W. Rozycki" <macro@linux-mips.org> |
6692 | S: Maintained | 6692 | S: Maintained |
6693 | F: drivers/tc/ | 6693 | F: drivers/tc/ |
6694 | F: include/linux/tc.h | 6694 | F: include/linux/tc.h |
6695 | 6695 | ||
6696 | U14-34F SCSI DRIVER | 6696 | U14-34F SCSI DRIVER |
6697 | M: Dario Ballabio <ballabio_dario@emc.com> | 6697 | M: Dario Ballabio <ballabio_dario@emc.com> |
6698 | L: linux-scsi@vger.kernel.org | 6698 | L: linux-scsi@vger.kernel.org |
6699 | S: Maintained | 6699 | S: Maintained |
6700 | F: drivers/scsi/u14-34f.c | 6700 | F: drivers/scsi/u14-34f.c |
6701 | 6701 | ||
6702 | UBI FILE SYSTEM (UBIFS) | 6702 | UBI FILE SYSTEM (UBIFS) |
6703 | M: Artem Bityutskiy <dedekind1@gmail.com> | 6703 | M: Artem Bityutskiy <dedekind1@gmail.com> |
6704 | M: Adrian Hunter <adrian.hunter@intel.com> | 6704 | M: Adrian Hunter <adrian.hunter@intel.com> |
6705 | L: linux-mtd@lists.infradead.org | 6705 | L: linux-mtd@lists.infradead.org |
6706 | T: git git://git.infradead.org/ubifs-2.6.git | 6706 | T: git git://git.infradead.org/ubifs-2.6.git |
6707 | W: http://www.linux-mtd.infradead.org/doc/ubifs.html | 6707 | W: http://www.linux-mtd.infradead.org/doc/ubifs.html |
6708 | S: Maintained | 6708 | S: Maintained |
6709 | F: Documentation/filesystems/ubifs.txt | 6709 | F: Documentation/filesystems/ubifs.txt |
6710 | F: fs/ubifs/ | 6710 | F: fs/ubifs/ |
6711 | 6711 | ||
6712 | UCLINUX (AND M68KNOMMU) | 6712 | UCLINUX (AND M68KNOMMU) |
6713 | M: Greg Ungerer <gerg@uclinux.org> | 6713 | M: Greg Ungerer <gerg@uclinux.org> |
6714 | W: http://www.uclinux.org/ | 6714 | W: http://www.uclinux.org/ |
6715 | L: uclinux-dev@uclinux.org (subscribers-only) | 6715 | L: uclinux-dev@uclinux.org (subscribers-only) |
6716 | S: Maintained | 6716 | S: Maintained |
6717 | F: arch/m68k/*/*_no.* | 6717 | F: arch/m68k/*/*_no.* |
6718 | F: arch/m68k/include/asm/*_no.* | 6718 | F: arch/m68k/include/asm/*_no.* |
6719 | 6719 | ||
6720 | UCLINUX FOR RENESAS H8/300 (H8300) | 6720 | UCLINUX FOR RENESAS H8/300 (H8300) |
6721 | M: Yoshinori Sato <ysato@users.sourceforge.jp> | 6721 | M: Yoshinori Sato <ysato@users.sourceforge.jp> |
6722 | W: http://uclinux-h8.sourceforge.jp/ | 6722 | W: http://uclinux-h8.sourceforge.jp/ |
6723 | S: Supported | 6723 | S: Supported |
6724 | F: arch/h8300/ | 6724 | F: arch/h8300/ |
6725 | F: drivers/ide/ide-h8300.c | 6725 | F: drivers/ide/ide-h8300.c |
6726 | F: drivers/net/ethernet/8390/ne-h8300.c | 6726 | F: drivers/net/ethernet/8390/ne-h8300.c |
6727 | 6727 | ||
6728 | UDF FILESYSTEM | 6728 | UDF FILESYSTEM |
6729 | M: Jan Kara <jack@suse.cz> | 6729 | M: Jan Kara <jack@suse.cz> |
6730 | S: Maintained | 6730 | S: Maintained |
6731 | F: Documentation/filesystems/udf.txt | 6731 | F: Documentation/filesystems/udf.txt |
6732 | F: fs/udf/ | 6732 | F: fs/udf/ |
6733 | 6733 | ||
6734 | UFS FILESYSTEM | 6734 | UFS FILESYSTEM |
6735 | M: Evgeniy Dushistov <dushistov@mail.ru> | 6735 | M: Evgeniy Dushistov <dushistov@mail.ru> |
6736 | S: Maintained | 6736 | S: Maintained |
6737 | F: Documentation/filesystems/ufs.txt | 6737 | F: Documentation/filesystems/ufs.txt |
6738 | F: fs/ufs/ | 6738 | F: fs/ufs/ |
6739 | 6739 | ||
6740 | ULTRA-WIDEBAND (UWB) SUBSYSTEM: | 6740 | ULTRA-WIDEBAND (UWB) SUBSYSTEM: |
6741 | L: linux-usb@vger.kernel.org | 6741 | L: linux-usb@vger.kernel.org |
6742 | S: Orphan | 6742 | S: Orphan |
6743 | F: drivers/uwb/ | 6743 | F: drivers/uwb/ |
6744 | F: include/linux/uwb.h | 6744 | F: include/linux/uwb.h |
6745 | F: include/linux/uwb/ | 6745 | F: include/linux/uwb/ |
6746 | 6746 | ||
6747 | UNICORE32 ARCHITECTURE: | 6747 | UNICORE32 ARCHITECTURE: |
6748 | M: Guan Xuetao <gxt@mprc.pku.edu.cn> | 6748 | M: Guan Xuetao <gxt@mprc.pku.edu.cn> |
6749 | W: http://mprc.pku.edu.cn/~guanxuetao/linux | 6749 | W: http://mprc.pku.edu.cn/~guanxuetao/linux |
6750 | S: Maintained | 6750 | S: Maintained |
6751 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/epip/linux-2.6-unicore32.git | 6751 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/epip/linux-2.6-unicore32.git |
6752 | F: arch/unicore32/ | 6752 | F: arch/unicore32/ |
6753 | 6753 | ||
6754 | UNIFDEF | 6754 | UNIFDEF |
6755 | M: Tony Finch <dot@dotat.at> | 6755 | M: Tony Finch <dot@dotat.at> |
6756 | W: http://dotat.at/prog/unifdef | 6756 | W: http://dotat.at/prog/unifdef |
6757 | S: Maintained | 6757 | S: Maintained |
6758 | F: scripts/unifdef.c | 6758 | F: scripts/unifdef.c |
6759 | 6759 | ||
6760 | UNIFORM CDROM DRIVER | 6760 | UNIFORM CDROM DRIVER |
6761 | M: Jens Axboe <axboe@kernel.dk> | 6761 | M: Jens Axboe <axboe@kernel.dk> |
6762 | W: http://www.kernel.dk | 6762 | W: http://www.kernel.dk |
6763 | S: Maintained | 6763 | S: Maintained |
6764 | F: Documentation/cdrom/ | 6764 | F: Documentation/cdrom/ |
6765 | F: drivers/cdrom/cdrom.c | 6765 | F: drivers/cdrom/cdrom.c |
6766 | F: include/linux/cdrom.h | 6766 | F: include/linux/cdrom.h |
6767 | 6767 | ||
6768 | UNSORTED BLOCK IMAGES (UBI) | 6768 | UNSORTED BLOCK IMAGES (UBI) |
6769 | M: Artem Bityutskiy <dedekind1@gmail.com> | 6769 | M: Artem Bityutskiy <dedekind1@gmail.com> |
6770 | W: http://www.linux-mtd.infradead.org/ | 6770 | W: http://www.linux-mtd.infradead.org/ |
6771 | L: linux-mtd@lists.infradead.org | 6771 | L: linux-mtd@lists.infradead.org |
6772 | T: git git://git.infradead.org/ubi-2.6.git | 6772 | T: git git://git.infradead.org/ubi-2.6.git |
6773 | S: Maintained | 6773 | S: Maintained |
6774 | F: drivers/mtd/ubi/ | 6774 | F: drivers/mtd/ubi/ |
6775 | F: include/linux/mtd/ubi.h | 6775 | F: include/linux/mtd/ubi.h |
6776 | F: include/mtd/ubi-user.h | 6776 | F: include/mtd/ubi-user.h |
6777 | 6777 | ||
6778 | USB ACM DRIVER | 6778 | USB ACM DRIVER |
6779 | M: Oliver Neukum <oliver@neukum.name> | 6779 | M: Oliver Neukum <oliver@neukum.name> |
6780 | L: linux-usb@vger.kernel.org | 6780 | L: linux-usb@vger.kernel.org |
6781 | S: Maintained | 6781 | S: Maintained |
6782 | F: Documentation/usb/acm.txt | 6782 | F: Documentation/usb/acm.txt |
6783 | F: drivers/usb/class/cdc-acm.* | 6783 | F: drivers/usb/class/cdc-acm.* |
6784 | 6784 | ||
6785 | USB ATTACHED SCSI | 6785 | USB ATTACHED SCSI |
6786 | M: Matthew Wilcox <willy@linux.intel.com> | 6786 | M: Matthew Wilcox <willy@linux.intel.com> |
6787 | M: Sarah Sharp <sarah.a.sharp@linux.intel.com> | 6787 | M: Sarah Sharp <sarah.a.sharp@linux.intel.com> |
6788 | L: linux-usb@vger.kernel.org | 6788 | L: linux-usb@vger.kernel.org |
6789 | L: linux-scsi@vger.kernel.org | 6789 | L: linux-scsi@vger.kernel.org |
6790 | S: Supported | 6790 | S: Supported |
6791 | F: drivers/usb/storage/uas.c | 6791 | F: drivers/usb/storage/uas.c |
6792 | 6792 | ||
6793 | USB BLOCK DRIVER (UB ub) | 6793 | USB BLOCK DRIVER (UB ub) |
6794 | M: Pete Zaitcev <zaitcev@redhat.com> | 6794 | M: Pete Zaitcev <zaitcev@redhat.com> |
6795 | L: linux-usb@vger.kernel.org | 6795 | L: linux-usb@vger.kernel.org |
6796 | S: Supported | 6796 | S: Supported |
6797 | F: drivers/block/ub.c | 6797 | F: drivers/block/ub.c |
6798 | 6798 | ||
6799 | USB CDC ETHERNET DRIVER | 6799 | USB CDC ETHERNET DRIVER |
6800 | M: Oliver Neukum <oliver@neukum.name> | 6800 | M: Oliver Neukum <oliver@neukum.name> |
6801 | L: linux-usb@vger.kernel.org | 6801 | L: linux-usb@vger.kernel.org |
6802 | S: Maintained | 6802 | S: Maintained |
6803 | F: drivers/net/usb/cdc_*.c | 6803 | F: drivers/net/usb/cdc_*.c |
6804 | F: include/linux/usb/cdc.h | 6804 | F: include/linux/usb/cdc.h |
6805 | 6805 | ||
6806 | USB CYPRESS C67X00 DRIVER | 6806 | USB CYPRESS C67X00 DRIVER |
6807 | M: Peter Korsgaard <jacmet@sunsite.dk> | 6807 | M: Peter Korsgaard <jacmet@sunsite.dk> |
6808 | L: linux-usb@vger.kernel.org | 6808 | L: linux-usb@vger.kernel.org |
6809 | S: Maintained | 6809 | S: Maintained |
6810 | F: drivers/usb/c67x00/ | 6810 | F: drivers/usb/c67x00/ |
6811 | 6811 | ||
6812 | USB DAVICOM DM9601 DRIVER | 6812 | USB DAVICOM DM9601 DRIVER |
6813 | M: Peter Korsgaard <jacmet@sunsite.dk> | 6813 | M: Peter Korsgaard <jacmet@sunsite.dk> |
6814 | L: netdev@vger.kernel.org | 6814 | L: netdev@vger.kernel.org |
6815 | W: http://www.linux-usb.org/usbnet | 6815 | W: http://www.linux-usb.org/usbnet |
6816 | S: Maintained | 6816 | S: Maintained |
6817 | F: drivers/net/usb/dm9601.c | 6817 | F: drivers/net/usb/dm9601.c |
6818 | 6818 | ||
6819 | USB DIAMOND RIO500 DRIVER | 6819 | USB DIAMOND RIO500 DRIVER |
6820 | M: Cesar Miquel <miquel@df.uba.ar> | 6820 | M: Cesar Miquel <miquel@df.uba.ar> |
6821 | L: rio500-users@lists.sourceforge.net | 6821 | L: rio500-users@lists.sourceforge.net |
6822 | W: http://rio500.sourceforge.net | 6822 | W: http://rio500.sourceforge.net |
6823 | S: Maintained | 6823 | S: Maintained |
6824 | F: drivers/usb/misc/rio500* | 6824 | F: drivers/usb/misc/rio500* |
6825 | 6825 | ||
6826 | USB EHCI DRIVER | 6826 | USB EHCI DRIVER |
6827 | M: Alan Stern <stern@rowland.harvard.edu> | 6827 | M: Alan Stern <stern@rowland.harvard.edu> |
6828 | L: linux-usb@vger.kernel.org | 6828 | L: linux-usb@vger.kernel.org |
6829 | S: Maintained | 6829 | S: Maintained |
6830 | F: Documentation/usb/ehci.txt | 6830 | F: Documentation/usb/ehci.txt |
6831 | F: drivers/usb/host/ehci* | 6831 | F: drivers/usb/host/ehci* |
6832 | 6832 | ||
6833 | USB ET61X[12]51 DRIVER | 6833 | USB ET61X[12]51 DRIVER |
6834 | M: Luca Risolia <luca.risolia@studio.unibo.it> | 6834 | M: Luca Risolia <luca.risolia@studio.unibo.it> |
6835 | L: linux-usb@vger.kernel.org | 6835 | L: linux-usb@vger.kernel.org |
6836 | L: linux-media@vger.kernel.org | 6836 | L: linux-media@vger.kernel.org |
6837 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git | 6837 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git |
6838 | W: http://www.linux-projects.org | 6838 | W: http://www.linux-projects.org |
6839 | S: Maintained | 6839 | S: Maintained |
6840 | F: drivers/media/video/et61x251/ | 6840 | F: drivers/media/video/et61x251/ |
6841 | 6841 | ||
6842 | USB GADGET/PERIPHERAL SUBSYSTEM | 6842 | USB GADGET/PERIPHERAL SUBSYSTEM |
6843 | M: Felipe Balbi <balbi@ti.com> | 6843 | M: Felipe Balbi <balbi@ti.com> |
6844 | L: linux-usb@vger.kernel.org | 6844 | L: linux-usb@vger.kernel.org |
6845 | W: http://www.linux-usb.org/gadget | 6845 | W: http://www.linux-usb.org/gadget |
6846 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git | 6846 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git |
6847 | S: Maintained | 6847 | S: Maintained |
6848 | F: drivers/usb/gadget/ | 6848 | F: drivers/usb/gadget/ |
6849 | F: include/linux/usb/gadget* | 6849 | F: include/linux/usb/gadget* |
6850 | 6850 | ||
6851 | USB HID/HIDBP DRIVERS (USB KEYBOARDS, MICE, REMOTE CONTROLS, ...) | 6851 | USB HID/HIDBP DRIVERS (USB KEYBOARDS, MICE, REMOTE CONTROLS, ...) |
6852 | M: Jiri Kosina <jkosina@suse.cz> | 6852 | M: Jiri Kosina <jkosina@suse.cz> |
6853 | L: linux-usb@vger.kernel.org | 6853 | L: linux-usb@vger.kernel.org |
6854 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid.git | 6854 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid.git |
6855 | S: Maintained | 6855 | S: Maintained |
6856 | F: Documentation/hid/hiddev.txt | 6856 | F: Documentation/hid/hiddev.txt |
6857 | F: drivers/hid/usbhid/ | 6857 | F: drivers/hid/usbhid/ |
6858 | 6858 | ||
6859 | USB/IP DRIVERS | 6859 | USB/IP DRIVERS |
6860 | M: Matt Mooney <mfm@muteddisk.com> | 6860 | M: Matt Mooney <mfm@muteddisk.com> |
6861 | L: linux-usb@vger.kernel.org | 6861 | L: linux-usb@vger.kernel.org |
6862 | S: Maintained | 6862 | S: Maintained |
6863 | F: drivers/staging/usbip/ | 6863 | F: drivers/staging/usbip/ |
6864 | 6864 | ||
6865 | USB ISP116X DRIVER | 6865 | USB ISP116X DRIVER |
6866 | M: Olav Kongas <ok@artecdesign.ee> | 6866 | M: Olav Kongas <ok@artecdesign.ee> |
6867 | L: linux-usb@vger.kernel.org | 6867 | L: linux-usb@vger.kernel.org |
6868 | S: Maintained | 6868 | S: Maintained |
6869 | F: drivers/usb/host/isp116x* | 6869 | F: drivers/usb/host/isp116x* |
6870 | F: include/linux/usb/isp116x.h | 6870 | F: include/linux/usb/isp116x.h |
6871 | 6871 | ||
6872 | USB KAWASAKI LSI DRIVER | 6872 | USB KAWASAKI LSI DRIVER |
6873 | M: Oliver Neukum <oliver@neukum.name> | 6873 | M: Oliver Neukum <oliver@neukum.name> |
6874 | L: linux-usb@vger.kernel.org | 6874 | L: linux-usb@vger.kernel.org |
6875 | S: Maintained | 6875 | S: Maintained |
6876 | F: drivers/usb/serial/kl5kusb105.* | 6876 | F: drivers/usb/serial/kl5kusb105.* |
6877 | 6877 | ||
6878 | USB MASS STORAGE DRIVER | 6878 | USB MASS STORAGE DRIVER |
6879 | M: Matthew Dharm <mdharm-usb@one-eyed-alien.net> | 6879 | M: Matthew Dharm <mdharm-usb@one-eyed-alien.net> |
6880 | L: linux-usb@vger.kernel.org | 6880 | L: linux-usb@vger.kernel.org |
6881 | L: usb-storage@lists.one-eyed-alien.net | 6881 | L: usb-storage@lists.one-eyed-alien.net |
6882 | S: Maintained | 6882 | S: Maintained |
6883 | W: http://www.one-eyed-alien.net/~mdharm/linux-usb/ | 6883 | W: http://www.one-eyed-alien.net/~mdharm/linux-usb/ |
6884 | F: drivers/usb/storage/ | 6884 | F: drivers/usb/storage/ |
6885 | 6885 | ||
6886 | USB MIDI DRIVER | 6886 | USB MIDI DRIVER |
6887 | M: Clemens Ladisch <clemens@ladisch.de> | 6887 | M: Clemens Ladisch <clemens@ladisch.de> |
6888 | L: alsa-devel@alsa-project.org (moderated for non-subscribers) | 6888 | L: alsa-devel@alsa-project.org (moderated for non-subscribers) |
6889 | T: git git://git.alsa-project.org/alsa-kernel.git | 6889 | T: git git://git.alsa-project.org/alsa-kernel.git |
6890 | S: Maintained | 6890 | S: Maintained |
6891 | F: sound/usb/midi.* | 6891 | F: sound/usb/midi.* |
6892 | 6892 | ||
6893 | USB OHCI DRIVER | 6893 | USB OHCI DRIVER |
6894 | M: Alan Stern <stern@rowland.harvard.edu> | 6894 | M: Alan Stern <stern@rowland.harvard.edu> |
6895 | L: linux-usb@vger.kernel.org | 6895 | L: linux-usb@vger.kernel.org |
6896 | S: Maintained | 6896 | S: Maintained |
6897 | F: Documentation/usb/ohci.txt | 6897 | F: Documentation/usb/ohci.txt |
6898 | F: drivers/usb/host/ohci* | 6898 | F: drivers/usb/host/ohci* |
6899 | 6899 | ||
6900 | USB OPTION-CARD DRIVER | 6900 | USB OPTION-CARD DRIVER |
6901 | M: Matthias Urlichs <smurf@smurf.noris.de> | 6901 | M: Matthias Urlichs <smurf@smurf.noris.de> |
6902 | L: linux-usb@vger.kernel.org | 6902 | L: linux-usb@vger.kernel.org |
6903 | S: Maintained | 6903 | S: Maintained |
6904 | F: drivers/usb/serial/option.c | 6904 | F: drivers/usb/serial/option.c |
6905 | 6905 | ||
6906 | USB PEGASUS DRIVER | 6906 | USB PEGASUS DRIVER |
6907 | M: Petko Manolov <petkan@users.sourceforge.net> | 6907 | M: Petko Manolov <petkan@users.sourceforge.net> |
6908 | L: linux-usb@vger.kernel.org | 6908 | L: linux-usb@vger.kernel.org |
6909 | L: netdev@vger.kernel.org | 6909 | L: netdev@vger.kernel.org |
6910 | W: http://pegasus2.sourceforge.net/ | 6910 | W: http://pegasus2.sourceforge.net/ |
6911 | S: Maintained | 6911 | S: Maintained |
6912 | F: drivers/net/usb/pegasus.* | 6912 | F: drivers/net/usb/pegasus.* |
6913 | 6913 | ||
6914 | USB PRINTER DRIVER (usblp) | 6914 | USB PRINTER DRIVER (usblp) |
6915 | M: Pete Zaitcev <zaitcev@redhat.com> | 6915 | M: Pete Zaitcev <zaitcev@redhat.com> |
6916 | L: linux-usb@vger.kernel.org | 6916 | L: linux-usb@vger.kernel.org |
6917 | S: Supported | 6917 | S: Supported |
6918 | F: drivers/usb/class/usblp.c | 6918 | F: drivers/usb/class/usblp.c |
6919 | 6919 | ||
6920 | USB RTL8150 DRIVER | 6920 | USB RTL8150 DRIVER |
6921 | M: Petko Manolov <petkan@users.sourceforge.net> | 6921 | M: Petko Manolov <petkan@users.sourceforge.net> |
6922 | L: linux-usb@vger.kernel.org | 6922 | L: linux-usb@vger.kernel.org |
6923 | L: netdev@vger.kernel.org | 6923 | L: netdev@vger.kernel.org |
6924 | W: http://pegasus2.sourceforge.net/ | 6924 | W: http://pegasus2.sourceforge.net/ |
6925 | S: Maintained | 6925 | S: Maintained |
6926 | F: drivers/net/usb/rtl8150.c | 6926 | F: drivers/net/usb/rtl8150.c |
6927 | 6927 | ||
6928 | USB SERIAL BELKIN F5U103 DRIVER | 6928 | USB SERIAL BELKIN F5U103 DRIVER |
6929 | M: William Greathouse <wgreathouse@smva.com> | 6929 | M: William Greathouse <wgreathouse@smva.com> |
6930 | L: linux-usb@vger.kernel.org | 6930 | L: linux-usb@vger.kernel.org |
6931 | S: Maintained | 6931 | S: Maintained |
6932 | F: drivers/usb/serial/belkin_sa.* | 6932 | F: drivers/usb/serial/belkin_sa.* |
6933 | 6933 | ||
6934 | USB SERIAL CYPRESS M8 DRIVER | 6934 | USB SERIAL CYPRESS M8 DRIVER |
6935 | M: Lonnie Mendez <dignome@gmail.com> | 6935 | M: Lonnie Mendez <dignome@gmail.com> |
6936 | L: linux-usb@vger.kernel.org | 6936 | L: linux-usb@vger.kernel.org |
6937 | S: Maintained | 6937 | S: Maintained |
6938 | W: http://geocities.com/i0xox0i | 6938 | W: http://geocities.com/i0xox0i |
6939 | W: http://firstlight.net/cvs | 6939 | W: http://firstlight.net/cvs |
6940 | F: drivers/usb/serial/cypress_m8.* | 6940 | F: drivers/usb/serial/cypress_m8.* |
6941 | 6941 | ||
6942 | USB SERIAL CYBERJACK DRIVER | 6942 | USB SERIAL CYBERJACK DRIVER |
6943 | M: Matthias Bruestle and Harald Welte <support@reiner-sct.com> | 6943 | M: Matthias Bruestle and Harald Welte <support@reiner-sct.com> |
6944 | W: http://www.reiner-sct.de/support/treiber_cyberjack.php | 6944 | W: http://www.reiner-sct.de/support/treiber_cyberjack.php |
6945 | S: Maintained | 6945 | S: Maintained |
6946 | F: drivers/usb/serial/cyberjack.c | 6946 | F: drivers/usb/serial/cyberjack.c |
6947 | 6947 | ||
6948 | USB SERIAL DIGI ACCELEPORT DRIVER | 6948 | USB SERIAL DIGI ACCELEPORT DRIVER |
6949 | M: Peter Berger <pberger@brimson.com> | 6949 | M: Peter Berger <pberger@brimson.com> |
6950 | M: Al Borchers <alborchers@steinerpoint.com> | 6950 | M: Al Borchers <alborchers@steinerpoint.com> |
6951 | L: linux-usb@vger.kernel.org | 6951 | L: linux-usb@vger.kernel.org |
6952 | S: Maintained | 6952 | S: Maintained |
6953 | F: drivers/usb/serial/digi_acceleport.c | 6953 | F: drivers/usb/serial/digi_acceleport.c |
6954 | 6954 | ||
6955 | USB SERIAL DRIVER | 6955 | USB SERIAL DRIVER |
6956 | M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 6956 | M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
6957 | L: linux-usb@vger.kernel.org | 6957 | L: linux-usb@vger.kernel.org |
6958 | S: Supported | 6958 | S: Supported |
6959 | F: Documentation/usb/usb-serial.txt | 6959 | F: Documentation/usb/usb-serial.txt |
6960 | F: drivers/usb/serial/generic.c | 6960 | F: drivers/usb/serial/generic.c |
6961 | F: drivers/usb/serial/usb-serial.c | 6961 | F: drivers/usb/serial/usb-serial.c |
6962 | F: include/linux/usb/serial.h | 6962 | F: include/linux/usb/serial.h |
6963 | 6963 | ||
6964 | USB SERIAL EMPEG EMPEG-CAR MARK I/II DRIVER | 6964 | USB SERIAL EMPEG EMPEG-CAR MARK I/II DRIVER |
6965 | M: Gary Brubaker <xavyer@ix.netcom.com> | 6965 | M: Gary Brubaker <xavyer@ix.netcom.com> |
6966 | L: linux-usb@vger.kernel.org | 6966 | L: linux-usb@vger.kernel.org |
6967 | S: Maintained | 6967 | S: Maintained |
6968 | F: drivers/usb/serial/empeg.c | 6968 | F: drivers/usb/serial/empeg.c |
6969 | 6969 | ||
6970 | USB SERIAL KEYSPAN DRIVER | 6970 | USB SERIAL KEYSPAN DRIVER |
6971 | M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 6971 | M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
6972 | L: linux-usb@vger.kernel.org | 6972 | L: linux-usb@vger.kernel.org |
6973 | S: Maintained | 6973 | S: Maintained |
6974 | F: drivers/usb/serial/*keyspan* | 6974 | F: drivers/usb/serial/*keyspan* |
6975 | 6975 | ||
6976 | USB SERIAL WHITEHEAT DRIVER | 6976 | USB SERIAL WHITEHEAT DRIVER |
6977 | M: Support Department <support@connecttech.com> | 6977 | M: Support Department <support@connecttech.com> |
6978 | L: linux-usb@vger.kernel.org | 6978 | L: linux-usb@vger.kernel.org |
6979 | W: http://www.connecttech.com | 6979 | W: http://www.connecttech.com |
6980 | S: Supported | 6980 | S: Supported |
6981 | F: drivers/usb/serial/whiteheat* | 6981 | F: drivers/usb/serial/whiteheat* |
6982 | 6982 | ||
6983 | USB SMSC95XX ETHERNET DRIVER | 6983 | USB SMSC95XX ETHERNET DRIVER |
6984 | M: Steve Glendinning <steve.glendinning@smsc.com> | 6984 | M: Steve Glendinning <steve.glendinning@smsc.com> |
6985 | L: netdev@vger.kernel.org | 6985 | L: netdev@vger.kernel.org |
6986 | S: Supported | 6986 | S: Supported |
6987 | F: drivers/net/usb/smsc95xx.* | 6987 | F: drivers/net/usb/smsc95xx.* |
6988 | 6988 | ||
6989 | USB SN9C1xx DRIVER | 6989 | USB SN9C1xx DRIVER |
6990 | M: Luca Risolia <luca.risolia@studio.unibo.it> | 6990 | M: Luca Risolia <luca.risolia@studio.unibo.it> |
6991 | L: linux-usb@vger.kernel.org | 6991 | L: linux-usb@vger.kernel.org |
6992 | L: linux-media@vger.kernel.org | 6992 | L: linux-media@vger.kernel.org |
6993 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git | 6993 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git |
6994 | W: http://www.linux-projects.org | 6994 | W: http://www.linux-projects.org |
6995 | S: Maintained | 6995 | S: Maintained |
6996 | F: Documentation/video4linux/sn9c102.txt | 6996 | F: Documentation/video4linux/sn9c102.txt |
6997 | F: drivers/media/video/sn9c102/ | 6997 | F: drivers/media/video/sn9c102/ |
6998 | 6998 | ||
6999 | USB SUBSYSTEM | 6999 | USB SUBSYSTEM |
7000 | M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 7000 | M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
7001 | L: linux-usb@vger.kernel.org | 7001 | L: linux-usb@vger.kernel.org |
7002 | W: http://www.linux-usb.org | 7002 | W: http://www.linux-usb.org |
7003 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6.git | 7003 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6.git |
7004 | S: Supported | 7004 | S: Supported |
7005 | F: Documentation/usb/ | 7005 | F: Documentation/usb/ |
7006 | F: drivers/net/usb/ | 7006 | F: drivers/net/usb/ |
7007 | F: drivers/usb/ | 7007 | F: drivers/usb/ |
7008 | F: include/linux/usb.h | 7008 | F: include/linux/usb.h |
7009 | F: include/linux/usb/ | 7009 | F: include/linux/usb/ |
7010 | 7010 | ||
7011 | USB UHCI DRIVER | 7011 | USB UHCI DRIVER |
7012 | M: Alan Stern <stern@rowland.harvard.edu> | 7012 | M: Alan Stern <stern@rowland.harvard.edu> |
7013 | L: linux-usb@vger.kernel.org | 7013 | L: linux-usb@vger.kernel.org |
7014 | S: Maintained | 7014 | S: Maintained |
7015 | F: drivers/usb/host/uhci* | 7015 | F: drivers/usb/host/uhci* |
7016 | 7016 | ||
7017 | USB "USBNET" DRIVER FRAMEWORK | 7017 | USB "USBNET" DRIVER FRAMEWORK |
7018 | M: Oliver Neukum <oneukum@suse.de> | 7018 | M: Oliver Neukum <oneukum@suse.de> |
7019 | L: netdev@vger.kernel.org | 7019 | L: netdev@vger.kernel.org |
7020 | W: http://www.linux-usb.org/usbnet | 7020 | W: http://www.linux-usb.org/usbnet |
7021 | S: Maintained | 7021 | S: Maintained |
7022 | F: drivers/net/usb/usbnet.c | 7022 | F: drivers/net/usb/usbnet.c |
7023 | F: include/linux/usb/usbnet.h | 7023 | F: include/linux/usb/usbnet.h |
7024 | 7024 | ||
7025 | USB VIDEO CLASS | 7025 | USB VIDEO CLASS |
7026 | M: Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 7026 | M: Laurent Pinchart <laurent.pinchart@ideasonboard.com> |
7027 | L: linux-uvc-devel@lists.berlios.de (subscribers-only) | 7027 | L: linux-uvc-devel@lists.berlios.de (subscribers-only) |
7028 | L: linux-media@vger.kernel.org | 7028 | L: linux-media@vger.kernel.org |
7029 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git | 7029 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git |
7030 | W: http://www.ideasonboard.org/uvc/ | 7030 | W: http://www.ideasonboard.org/uvc/ |
7031 | S: Maintained | 7031 | S: Maintained |
7032 | F: drivers/media/video/uvc/ | 7032 | F: drivers/media/video/uvc/ |
7033 | 7033 | ||
7034 | USB W996[87]CF DRIVER | 7034 | USB W996[87]CF DRIVER |
7035 | M: Luca Risolia <luca.risolia@studio.unibo.it> | 7035 | M: Luca Risolia <luca.risolia@studio.unibo.it> |
7036 | L: linux-usb@vger.kernel.org | 7036 | L: linux-usb@vger.kernel.org |
7037 | L: linux-media@vger.kernel.org | 7037 | L: linux-media@vger.kernel.org |
7038 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git | 7038 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git |
7039 | W: http://www.linux-projects.org | 7039 | W: http://www.linux-projects.org |
7040 | S: Maintained | 7040 | S: Maintained |
7041 | F: Documentation/video4linux/w9968cf.txt | 7041 | F: Documentation/video4linux/w9968cf.txt |
7042 | F: drivers/media/video/w996* | 7042 | F: drivers/media/video/w996* |
7043 | 7043 | ||
7044 | USB WIRELESS RNDIS DRIVER (rndis_wlan) | 7044 | USB WIRELESS RNDIS DRIVER (rndis_wlan) |
7045 | M: Jussi Kivilinna <jussi.kivilinna@mbnet.fi> | 7045 | M: Jussi Kivilinna <jussi.kivilinna@mbnet.fi> |
7046 | L: linux-wireless@vger.kernel.org | 7046 | L: linux-wireless@vger.kernel.org |
7047 | S: Maintained | 7047 | S: Maintained |
7048 | F: drivers/net/wireless/rndis_wlan.c | 7048 | F: drivers/net/wireless/rndis_wlan.c |
7049 | 7049 | ||
7050 | USB XHCI DRIVER | 7050 | USB XHCI DRIVER |
7051 | M: Sarah Sharp <sarah.a.sharp@linux.intel.com> | 7051 | M: Sarah Sharp <sarah.a.sharp@linux.intel.com> |
7052 | L: linux-usb@vger.kernel.org | 7052 | L: linux-usb@vger.kernel.org |
7053 | S: Supported | 7053 | S: Supported |
7054 | F: drivers/usb/host/xhci* | 7054 | F: drivers/usb/host/xhci* |
7055 | F: drivers/usb/host/pci-quirks* | 7055 | F: drivers/usb/host/pci-quirks* |
7056 | 7056 | ||
7057 | USB ZD1201 DRIVER | 7057 | USB ZD1201 DRIVER |
7058 | L: linux-wireless@vger.kernel.org | 7058 | L: linux-wireless@vger.kernel.org |
7059 | W: http://linux-lc100020.sourceforge.net | 7059 | W: http://linux-lc100020.sourceforge.net |
7060 | S: Orphan | 7060 | S: Orphan |
7061 | F: drivers/net/wireless/zd1201.* | 7061 | F: drivers/net/wireless/zd1201.* |
7062 | 7062 | ||
7063 | USB ZR364XX DRIVER | 7063 | USB ZR364XX DRIVER |
7064 | M: Antoine Jacquet <royale@zerezo.com> | 7064 | M: Antoine Jacquet <royale@zerezo.com> |
7065 | L: linux-usb@vger.kernel.org | 7065 | L: linux-usb@vger.kernel.org |
7066 | L: linux-media@vger.kernel.org | 7066 | L: linux-media@vger.kernel.org |
7067 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git | 7067 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git |
7068 | W: http://royale.zerezo.com/zr364xx/ | 7068 | W: http://royale.zerezo.com/zr364xx/ |
7069 | S: Maintained | 7069 | S: Maintained |
7070 | F: Documentation/video4linux/zr364xx.txt | 7070 | F: Documentation/video4linux/zr364xx.txt |
7071 | F: drivers/media/video/zr364xx.c | 7071 | F: drivers/media/video/zr364xx.c |
7072 | 7072 | ||
7073 | USER-MODE LINUX (UML) | 7073 | USER-MODE LINUX (UML) |
7074 | M: Jeff Dike <jdike@addtoit.com> | 7074 | M: Jeff Dike <jdike@addtoit.com> |
7075 | M: Richard Weinberger <richard@nod.at> | 7075 | M: Richard Weinberger <richard@nod.at> |
7076 | L: user-mode-linux-devel@lists.sourceforge.net | 7076 | L: user-mode-linux-devel@lists.sourceforge.net |
7077 | L: user-mode-linux-user@lists.sourceforge.net | 7077 | L: user-mode-linux-user@lists.sourceforge.net |
7078 | W: http://user-mode-linux.sourceforge.net | 7078 | W: http://user-mode-linux.sourceforge.net |
7079 | S: Maintained | 7079 | S: Maintained |
7080 | F: Documentation/virtual/uml/ | 7080 | F: Documentation/virtual/uml/ |
7081 | F: arch/um/ | 7081 | F: arch/um/ |
7082 | F: fs/hostfs/ | 7082 | F: fs/hostfs/ |
7083 | F: fs/hppfs/ | 7083 | F: fs/hppfs/ |
7084 | 7084 | ||
7085 | USERSPACE I/O (UIO) | 7085 | USERSPACE I/O (UIO) |
7086 | M: "Hans J. Koch" <hjk@hansjkoch.de> | 7086 | M: "Hans J. Koch" <hjk@hansjkoch.de> |
7087 | M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 7087 | M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
7088 | S: Maintained | 7088 | S: Maintained |
7089 | F: Documentation/DocBook/uio-howto.tmpl | 7089 | F: Documentation/DocBook/uio-howto.tmpl |
7090 | F: drivers/uio/ | 7090 | F: drivers/uio/ |
7091 | F: include/linux/uio*.h | 7091 | F: include/linux/uio*.h |
7092 | 7092 | ||
7093 | UTIL-LINUX-NG PACKAGE | 7093 | UTIL-LINUX-NG PACKAGE |
7094 | M: Karel Zak <kzak@redhat.com> | 7094 | M: Karel Zak <kzak@redhat.com> |
7095 | L: util-linux-ng@vger.kernel.org | 7095 | L: util-linux-ng@vger.kernel.org |
7096 | W: http://kernel.org/~kzak/util-linux-ng/ | 7096 | W: http://kernel.org/~kzak/util-linux-ng/ |
7097 | T: git git://git.kernel.org/pub/scm/utils/util-linux-ng/util-linux-ng.git | 7097 | T: git git://git.kernel.org/pub/scm/utils/util-linux-ng/util-linux-ng.git |
7098 | S: Maintained | 7098 | S: Maintained |
7099 | 7099 | ||
7100 | UVESAFB DRIVER | 7100 | UVESAFB DRIVER |
7101 | M: Michal Januszewski <spock@gentoo.org> | 7101 | M: Michal Januszewski <spock@gentoo.org> |
7102 | L: linux-fbdev@vger.kernel.org | 7102 | L: linux-fbdev@vger.kernel.org |
7103 | W: http://dev.gentoo.org/~spock/projects/uvesafb/ | 7103 | W: http://dev.gentoo.org/~spock/projects/uvesafb/ |
7104 | S: Maintained | 7104 | S: Maintained |
7105 | F: Documentation/fb/uvesafb.txt | 7105 | F: Documentation/fb/uvesafb.txt |
7106 | F: drivers/video/uvesafb.* | 7106 | F: drivers/video/uvesafb.* |
7107 | 7107 | ||
7108 | VFAT/FAT/MSDOS FILESYSTEM | 7108 | VFAT/FAT/MSDOS FILESYSTEM |
7109 | M: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp> | 7109 | M: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp> |
7110 | S: Maintained | 7110 | S: Maintained |
7111 | F: Documentation/filesystems/vfat.txt | 7111 | F: Documentation/filesystems/vfat.txt |
7112 | F: fs/fat/ | 7112 | F: fs/fat/ |
7113 | 7113 | ||
7114 | VIDEOBUF2 FRAMEWORK | 7114 | VIDEOBUF2 FRAMEWORK |
7115 | M: Pawel Osciak <pawel@osciak.com> | 7115 | M: Pawel Osciak <pawel@osciak.com> |
7116 | M: Marek Szyprowski <m.szyprowski@samsung.com> | 7116 | M: Marek Szyprowski <m.szyprowski@samsung.com> |
7117 | M: Kyungmin Park <kyungmin.park@samsung.com> | 7117 | M: Kyungmin Park <kyungmin.park@samsung.com> |
7118 | L: linux-media@vger.kernel.org | 7118 | L: linux-media@vger.kernel.org |
7119 | S: Maintained | 7119 | S: Maintained |
7120 | F: drivers/media/video/videobuf2-* | 7120 | F: drivers/media/video/videobuf2-* |
7121 | F: include/media/videobuf2-* | 7121 | F: include/media/videobuf2-* |
7122 | 7122 | ||
7123 | VIRTIO CONSOLE DRIVER | 7123 | VIRTIO CONSOLE DRIVER |
7124 | M: Amit Shah <amit.shah@redhat.com> | 7124 | M: Amit Shah <amit.shah@redhat.com> |
7125 | L: virtualization@lists.linux-foundation.org | 7125 | L: virtualization@lists.linux-foundation.org |
7126 | S: Maintained | 7126 | S: Maintained |
7127 | F: drivers/char/virtio_console.c | 7127 | F: drivers/char/virtio_console.c |
7128 | F: include/linux/virtio_console.h | 7128 | F: include/linux/virtio_console.h |
7129 | 7129 | ||
7130 | VIRTIO CORE, NET AND BLOCK DRIVERS | 7130 | VIRTIO CORE, NET AND BLOCK DRIVERS |
7131 | M: Rusty Russell <rusty@rustcorp.com.au> | 7131 | M: Rusty Russell <rusty@rustcorp.com.au> |
7132 | M: "Michael S. Tsirkin" <mst@redhat.com> | 7132 | M: "Michael S. Tsirkin" <mst@redhat.com> |
7133 | L: virtualization@lists.linux-foundation.org | 7133 | L: virtualization@lists.linux-foundation.org |
7134 | S: Maintained | 7134 | S: Maintained |
7135 | F: drivers/virtio/ | 7135 | F: drivers/virtio/ |
7136 | F: drivers/net/virtio_net.c | 7136 | F: drivers/net/virtio_net.c |
7137 | F: drivers/block/virtio_blk.c | 7137 | F: drivers/block/virtio_blk.c |
7138 | F: include/linux/virtio_*.h | 7138 | F: include/linux/virtio_*.h |
7139 | 7139 | ||
7140 | VIRTIO HOST (VHOST) | 7140 | VIRTIO HOST (VHOST) |
7141 | M: "Michael S. Tsirkin" <mst@redhat.com> | 7141 | M: "Michael S. Tsirkin" <mst@redhat.com> |
7142 | L: kvm@vger.kernel.org | 7142 | L: kvm@vger.kernel.org |
7143 | L: virtualization@lists.linux-foundation.org | 7143 | L: virtualization@lists.linux-foundation.org |
7144 | L: netdev@vger.kernel.org | 7144 | L: netdev@vger.kernel.org |
7145 | S: Maintained | 7145 | S: Maintained |
7146 | F: drivers/vhost/ | 7146 | F: drivers/vhost/ |
7147 | F: include/linux/vhost.h | 7147 | F: include/linux/vhost.h |
7148 | 7148 | ||
7149 | VIA RHINE NETWORK DRIVER | 7149 | VIA RHINE NETWORK DRIVER |
7150 | M: Roger Luethi <rl@hellgate.ch> | 7150 | M: Roger Luethi <rl@hellgate.ch> |
7151 | S: Maintained | 7151 | S: Maintained |
7152 | F: drivers/net/ethernet/via/via-rhine.c | 7152 | F: drivers/net/ethernet/via/via-rhine.c |
7153 | 7153 | ||
7154 | VIAPRO SMBUS DRIVER | 7154 | VIAPRO SMBUS DRIVER |
7155 | M: Jean Delvare <khali@linux-fr.org> | 7155 | M: Jean Delvare <khali@linux-fr.org> |
7156 | L: linux-i2c@vger.kernel.org | 7156 | L: linux-i2c@vger.kernel.org |
7157 | S: Maintained | 7157 | S: Maintained |
7158 | F: Documentation/i2c/busses/i2c-viapro | 7158 | F: Documentation/i2c/busses/i2c-viapro |
7159 | F: drivers/i2c/busses/i2c-viapro.c | 7159 | F: drivers/i2c/busses/i2c-viapro.c |
7160 | 7160 | ||
7161 | VIA SD/MMC CARD CONTROLLER DRIVER | 7161 | VIA SD/MMC CARD CONTROLLER DRIVER |
7162 | M: Bruce Chang <brucechang@via.com.tw> | 7162 | M: Bruce Chang <brucechang@via.com.tw> |
7163 | M: Harald Welte <HaraldWelte@viatech.com> | 7163 | M: Harald Welte <HaraldWelte@viatech.com> |
7164 | S: Maintained | 7164 | S: Maintained |
7165 | F: drivers/mmc/host/via-sdmmc.c | 7165 | F: drivers/mmc/host/via-sdmmc.c |
7166 | 7166 | ||
7167 | VIA UNICHROME(PRO)/CHROME9 FRAMEBUFFER DRIVER | 7167 | VIA UNICHROME(PRO)/CHROME9 FRAMEBUFFER DRIVER |
7168 | M: Florian Tobias Schandinat <FlorianSchandinat@gmx.de> | 7168 | M: Florian Tobias Schandinat <FlorianSchandinat@gmx.de> |
7169 | L: linux-fbdev@vger.kernel.org | 7169 | L: linux-fbdev@vger.kernel.org |
7170 | S: Maintained | 7170 | S: Maintained |
7171 | F: include/linux/via-core.h | 7171 | F: include/linux/via-core.h |
7172 | F: include/linux/via-gpio.h | 7172 | F: include/linux/via-gpio.h |
7173 | F: include/linux/via_i2c.h | 7173 | F: include/linux/via_i2c.h |
7174 | F: drivers/video/via/ | 7174 | F: drivers/video/via/ |
7175 | 7175 | ||
7176 | VIA VELOCITY NETWORK DRIVER | 7176 | VIA VELOCITY NETWORK DRIVER |
7177 | M: Francois Romieu <romieu@fr.zoreil.com> | 7177 | M: Francois Romieu <romieu@fr.zoreil.com> |
7178 | L: netdev@vger.kernel.org | 7178 | L: netdev@vger.kernel.org |
7179 | S: Maintained | 7179 | S: Maintained |
7180 | F: drivers/net/ethernet/via/via-velocity.* | 7180 | F: drivers/net/ethernet/via/via-velocity.* |
7181 | 7181 | ||
7182 | VLAN (802.1Q) | 7182 | VLAN (802.1Q) |
7183 | M: Patrick McHardy <kaber@trash.net> | 7183 | M: Patrick McHardy <kaber@trash.net> |
7184 | L: netdev@vger.kernel.org | 7184 | L: netdev@vger.kernel.org |
7185 | S: Maintained | 7185 | S: Maintained |
7186 | F: drivers/net/macvlan.c | 7186 | F: drivers/net/macvlan.c |
7187 | F: include/linux/if_*vlan.h | 7187 | F: include/linux/if_*vlan.h |
7188 | F: net/8021q/ | 7188 | F: net/8021q/ |
7189 | 7189 | ||
7190 | VLYNQ BUS | 7190 | VLYNQ BUS |
7191 | M: Florian Fainelli <florian@openwrt.org> | 7191 | M: Florian Fainelli <florian@openwrt.org> |
7192 | L: openwrt-devel@lists.openwrt.org (subscribers-only) | 7192 | L: openwrt-devel@lists.openwrt.org (subscribers-only) |
7193 | S: Maintained | 7193 | S: Maintained |
7194 | F: drivers/vlynq/vlynq.c | 7194 | F: drivers/vlynq/vlynq.c |
7195 | F: include/linux/vlynq.h | 7195 | F: include/linux/vlynq.h |
7196 | 7196 | ||
7197 | VMWARE VMXNET3 ETHERNET DRIVER | 7197 | VMWARE VMXNET3 ETHERNET DRIVER |
7198 | M: Shreyas Bhatewara <sbhatewara@vmware.com> | 7198 | M: Shreyas Bhatewara <sbhatewara@vmware.com> |
7199 | M: "VMware, Inc." <pv-drivers@vmware.com> | 7199 | M: "VMware, Inc." <pv-drivers@vmware.com> |
7200 | L: netdev@vger.kernel.org | 7200 | L: netdev@vger.kernel.org |
7201 | S: Maintained | 7201 | S: Maintained |
7202 | F: drivers/net/vmxnet3/ | 7202 | F: drivers/net/vmxnet3/ |
7203 | 7203 | ||
7204 | VMware PVSCSI driver | 7204 | VMware PVSCSI driver |
7205 | M: Arvind Kumar <arvindkumar@vmware.com> | 7205 | M: Arvind Kumar <arvindkumar@vmware.com> |
7206 | M: VMware PV-Drivers <pv-drivers@vmware.com> | 7206 | M: VMware PV-Drivers <pv-drivers@vmware.com> |
7207 | L: linux-scsi@vger.kernel.org | 7207 | L: linux-scsi@vger.kernel.org |
7208 | S: Maintained | 7208 | S: Maintained |
7209 | F: drivers/scsi/vmw_pvscsi.c | 7209 | F: drivers/scsi/vmw_pvscsi.c |
7210 | F: drivers/scsi/vmw_pvscsi.h | 7210 | F: drivers/scsi/vmw_pvscsi.h |
7211 | 7211 | ||
7212 | VOLTAGE AND CURRENT REGULATOR FRAMEWORK | 7212 | VOLTAGE AND CURRENT REGULATOR FRAMEWORK |
7213 | M: Liam Girdwood <lrg@ti.com> | 7213 | M: Liam Girdwood <lrg@ti.com> |
7214 | M: Mark Brown <broonie@opensource.wolfsonmicro.com> | 7214 | M: Mark Brown <broonie@opensource.wolfsonmicro.com> |
7215 | W: http://opensource.wolfsonmicro.com/node/15 | 7215 | W: http://opensource.wolfsonmicro.com/node/15 |
7216 | W: http://www.slimlogic.co.uk/?p=48 | 7216 | W: http://www.slimlogic.co.uk/?p=48 |
7217 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/lrg/voltage-2.6.git | 7217 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/lrg/voltage-2.6.git |
7218 | S: Supported | 7218 | S: Supported |
7219 | F: drivers/regulator/ | 7219 | F: drivers/regulator/ |
7220 | F: include/linux/regulator/ | 7220 | F: include/linux/regulator/ |
7221 | 7221 | ||
7222 | VT1211 HARDWARE MONITOR DRIVER | 7222 | VT1211 HARDWARE MONITOR DRIVER |
7223 | M: Juerg Haefliger <juergh@gmail.com> | 7223 | M: Juerg Haefliger <juergh@gmail.com> |
7224 | L: lm-sensors@lm-sensors.org | 7224 | L: lm-sensors@lm-sensors.org |
7225 | S: Maintained | 7225 | S: Maintained |
7226 | F: Documentation/hwmon/vt1211 | 7226 | F: Documentation/hwmon/vt1211 |
7227 | F: drivers/hwmon/vt1211.c | 7227 | F: drivers/hwmon/vt1211.c |
7228 | 7228 | ||
7229 | VT8231 HARDWARE MONITOR DRIVER | 7229 | VT8231 HARDWARE MONITOR DRIVER |
7230 | M: Roger Lucas <vt8231@hiddenengine.co.uk> | 7230 | M: Roger Lucas <vt8231@hiddenengine.co.uk> |
7231 | L: lm-sensors@lm-sensors.org | 7231 | L: lm-sensors@lm-sensors.org |
7232 | S: Maintained | 7232 | S: Maintained |
7233 | F: drivers/hwmon/vt8231.c | 7233 | F: drivers/hwmon/vt8231.c |
7234 | 7234 | ||
7235 | VUB300 USB to SDIO/SD/MMC bridge chip | 7235 | VUB300 USB to SDIO/SD/MMC bridge chip |
7236 | M: Tony Olech <tony.olech@elandigitalsystems.com> | 7236 | M: Tony Olech <tony.olech@elandigitalsystems.com> |
7237 | L: linux-mmc@vger.kernel.org | 7237 | L: linux-mmc@vger.kernel.org |
7238 | L: linux-usb@vger.kernel.org | 7238 | L: linux-usb@vger.kernel.org |
7239 | S: Supported | 7239 | S: Supported |
7240 | F: drivers/mmc/host/vub300.c | 7240 | F: drivers/mmc/host/vub300.c |
7241 | 7241 | ||
7242 | W1 DALLAS'S 1-WIRE BUS | 7242 | W1 DALLAS'S 1-WIRE BUS |
7243 | M: Evgeniy Polyakov <zbr@ioremap.net> | 7243 | M: Evgeniy Polyakov <zbr@ioremap.net> |
7244 | S: Maintained | 7244 | S: Maintained |
7245 | F: Documentation/w1/ | 7245 | F: Documentation/w1/ |
7246 | F: drivers/w1/ | 7246 | F: drivers/w1/ |
7247 | 7247 | ||
7248 | W83791D HARDWARE MONITORING DRIVER | 7248 | W83791D HARDWARE MONITORING DRIVER |
7249 | M: Marc Hulsman <m.hulsman@tudelft.nl> | 7249 | M: Marc Hulsman <m.hulsman@tudelft.nl> |
7250 | L: lm-sensors@lm-sensors.org | 7250 | L: lm-sensors@lm-sensors.org |
7251 | S: Maintained | 7251 | S: Maintained |
7252 | F: Documentation/hwmon/w83791d | 7252 | F: Documentation/hwmon/w83791d |
7253 | F: drivers/hwmon/w83791d.c | 7253 | F: drivers/hwmon/w83791d.c |
7254 | 7254 | ||
7255 | W83793 HARDWARE MONITORING DRIVER | 7255 | W83793 HARDWARE MONITORING DRIVER |
7256 | M: Rudolf Marek <r.marek@assembler.cz> | 7256 | M: Rudolf Marek <r.marek@assembler.cz> |
7257 | L: lm-sensors@lm-sensors.org | 7257 | L: lm-sensors@lm-sensors.org |
7258 | S: Maintained | 7258 | S: Maintained |
7259 | F: Documentation/hwmon/w83793 | 7259 | F: Documentation/hwmon/w83793 |
7260 | F: drivers/hwmon/w83793.c | 7260 | F: drivers/hwmon/w83793.c |
7261 | 7261 | ||
7262 | W83795 HARDWARE MONITORING DRIVER | 7262 | W83795 HARDWARE MONITORING DRIVER |
7263 | M: Jean Delvare <khali@linux-fr.org> | 7263 | M: Jean Delvare <khali@linux-fr.org> |
7264 | L: lm-sensors@lm-sensors.org | 7264 | L: lm-sensors@lm-sensors.org |
7265 | S: Maintained | 7265 | S: Maintained |
7266 | F: drivers/hwmon/w83795.c | 7266 | F: drivers/hwmon/w83795.c |
7267 | 7267 | ||
7268 | W83L51xD SD/MMC CARD INTERFACE DRIVER | 7268 | W83L51xD SD/MMC CARD INTERFACE DRIVER |
7269 | M: Pierre Ossman <pierre@ossman.eu> | 7269 | M: Pierre Ossman <pierre@ossman.eu> |
7270 | S: Maintained | 7270 | S: Maintained |
7271 | F: drivers/mmc/host/wbsd.* | 7271 | F: drivers/mmc/host/wbsd.* |
7272 | 7272 | ||
7273 | WATCHDOG DEVICE DRIVERS | 7273 | WATCHDOG DEVICE DRIVERS |
7274 | M: Wim Van Sebroeck <wim@iguana.be> | 7274 | M: Wim Van Sebroeck <wim@iguana.be> |
7275 | L: linux-watchdog@vger.kernel.org | 7275 | L: linux-watchdog@vger.kernel.org |
7276 | W: http://www.linux-watchdog.org/ | 7276 | W: http://www.linux-watchdog.org/ |
7277 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/wim/linux-2.6-watchdog.git | 7277 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/wim/linux-2.6-watchdog.git |
7278 | S: Maintained | 7278 | S: Maintained |
7279 | F: Documentation/watchdog/ | 7279 | F: Documentation/watchdog/ |
7280 | F: drivers/watchdog/ | 7280 | F: drivers/watchdog/ |
7281 | F: include/linux/watchdog.h | 7281 | F: include/linux/watchdog.h |
7282 | 7282 | ||
7283 | WD7000 SCSI DRIVER | 7283 | WD7000 SCSI DRIVER |
7284 | M: Miroslav Zagorac <zaga@fly.cc.fer.hr> | 7284 | M: Miroslav Zagorac <zaga@fly.cc.fer.hr> |
7285 | L: linux-scsi@vger.kernel.org | 7285 | L: linux-scsi@vger.kernel.org |
7286 | S: Maintained | 7286 | S: Maintained |
7287 | F: drivers/scsi/wd7000.c | 7287 | F: drivers/scsi/wd7000.c |
7288 | 7288 | ||
7289 | WIIMOTE HID DRIVER | 7289 | WIIMOTE HID DRIVER |
7290 | M: David Herrmann <dh.herrmann@googlemail.com> | 7290 | M: David Herrmann <dh.herrmann@googlemail.com> |
7291 | L: linux-input@vger.kernel.org | 7291 | L: linux-input@vger.kernel.org |
7292 | S: Maintained | 7292 | S: Maintained |
7293 | F: drivers/hid/hid-wiimote* | 7293 | F: drivers/hid/hid-wiimote* |
7294 | 7294 | ||
7295 | WINBOND CIR DRIVER | 7295 | WINBOND CIR DRIVER |
7296 | M: David Hรคrdeman <david@hardeman.nu> | 7296 | M: David Hรคrdeman <david@hardeman.nu> |
7297 | S: Maintained | 7297 | S: Maintained |
7298 | F: drivers/media/rc/winbond-cir.c | 7298 | F: drivers/media/rc/winbond-cir.c |
7299 | 7299 | ||
7300 | WIMAX STACK | 7300 | WIMAX STACK |
7301 | M: Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com> | 7301 | M: Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com> |
7302 | M: linux-wimax@intel.com | 7302 | M: linux-wimax@intel.com |
7303 | L: wimax@linuxwimax.org | 7303 | L: wimax@linuxwimax.org |
7304 | S: Supported | 7304 | S: Supported |
7305 | W: http://linuxwimax.org | 7305 | W: http://linuxwimax.org |
7306 | F: Documentation/wimax/README.wimax | 7306 | F: Documentation/wimax/README.wimax |
7307 | F: include/linux/wimax.h | 7307 | F: include/linux/wimax.h |
7308 | F: include/linux/wimax/debug.h | 7308 | F: include/linux/wimax/debug.h |
7309 | F: include/net/wimax.h | 7309 | F: include/net/wimax.h |
7310 | F: net/wimax/ | 7310 | F: net/wimax/ |
7311 | 7311 | ||
7312 | WISTRON LAPTOP BUTTON DRIVER | 7312 | WISTRON LAPTOP BUTTON DRIVER |
7313 | M: Miloslav Trmac <mitr@volny.cz> | 7313 | M: Miloslav Trmac <mitr@volny.cz> |
7314 | S: Maintained | 7314 | S: Maintained |
7315 | F: drivers/input/misc/wistron_btns.c | 7315 | F: drivers/input/misc/wistron_btns.c |
7316 | 7316 | ||
7317 | WL1251 WIRELESS DRIVER | 7317 | WL1251 WIRELESS DRIVER |
7318 | M: Luciano Coelho <coelho@ti.com> | 7318 | M: Luciano Coelho <coelho@ti.com> |
7319 | L: linux-wireless@vger.kernel.org | 7319 | L: linux-wireless@vger.kernel.org |
7320 | W: http://wireless.kernel.org/en/users/Drivers/wl1251 | 7320 | W: http://wireless.kernel.org/en/users/Drivers/wl1251 |
7321 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git | 7321 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git |
7322 | S: Maintained | 7322 | S: Maintained |
7323 | F: drivers/net/wireless/wl1251/* | 7323 | F: drivers/net/wireless/wl1251/* |
7324 | 7324 | ||
7325 | WL1271 WIRELESS DRIVER | 7325 | WL1271 WIRELESS DRIVER |
7326 | M: Luciano Coelho <coelho@ti.com> | 7326 | M: Luciano Coelho <coelho@ti.com> |
7327 | L: linux-wireless@vger.kernel.org | 7327 | L: linux-wireless@vger.kernel.org |
7328 | W: http://wireless.kernel.org/en/users/Drivers/wl12xx | 7328 | W: http://wireless.kernel.org/en/users/Drivers/wl12xx |
7329 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/luca/wl12xx.git | 7329 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/luca/wl12xx.git |
7330 | S: Maintained | 7330 | S: Maintained |
7331 | F: drivers/net/wireless/wl12xx/ | 7331 | F: drivers/net/wireless/wl12xx/ |
7332 | F: include/linux/wl12xx.h | 7332 | F: include/linux/wl12xx.h |
7333 | 7333 | ||
7334 | WL3501 WIRELESS PCMCIA CARD DRIVER | 7334 | WL3501 WIRELESS PCMCIA CARD DRIVER |
7335 | M: Arnaldo Carvalho de Melo <acme@ghostprotocols.net> | 7335 | M: Arnaldo Carvalho de Melo <acme@ghostprotocols.net> |
7336 | L: linux-wireless@vger.kernel.org | 7336 | L: linux-wireless@vger.kernel.org |
7337 | W: http://oops.ghostprotocols.net:81/blog | 7337 | W: http://oops.ghostprotocols.net:81/blog |
7338 | S: Maintained | 7338 | S: Maintained |
7339 | F: drivers/net/wireless/wl3501* | 7339 | F: drivers/net/wireless/wl3501* |
7340 | 7340 | ||
7341 | WM97XX TOUCHSCREEN DRIVERS | 7341 | WM97XX TOUCHSCREEN DRIVERS |
7342 | M: Mark Brown <broonie@opensource.wolfsonmicro.com> | 7342 | M: Mark Brown <broonie@opensource.wolfsonmicro.com> |
7343 | M: Liam Girdwood <lrg@slimlogic.co.uk> | 7343 | M: Liam Girdwood <lrg@slimlogic.co.uk> |
7344 | L: linux-input@vger.kernel.org | 7344 | L: linux-input@vger.kernel.org |
7345 | T: git git://opensource.wolfsonmicro.com/linux-2.6-touch | 7345 | T: git git://opensource.wolfsonmicro.com/linux-2.6-touch |
7346 | W: http://opensource.wolfsonmicro.com/node/7 | 7346 | W: http://opensource.wolfsonmicro.com/node/7 |
7347 | S: Supported | 7347 | S: Supported |
7348 | F: drivers/input/touchscreen/*wm97* | 7348 | F: drivers/input/touchscreen/*wm97* |
7349 | F: include/linux/wm97xx.h | 7349 | F: include/linux/wm97xx.h |
7350 | 7350 | ||
7351 | WOLFSON MICROELECTRONICS DRIVERS | 7351 | WOLFSON MICROELECTRONICS DRIVERS |
7352 | M: Mark Brown <broonie@opensource.wolfsonmicro.com> | 7352 | M: Mark Brown <broonie@opensource.wolfsonmicro.com> |
7353 | M: Ian Lartey <ian@opensource.wolfsonmicro.com> | 7353 | M: Ian Lartey <ian@opensource.wolfsonmicro.com> |
7354 | M: Dimitris Papastamos <dp@opensource.wolfsonmicro.com> | 7354 | M: Dimitris Papastamos <dp@opensource.wolfsonmicro.com> |
7355 | T: git git://opensource.wolfsonmicro.com/linux-2.6-asoc | 7355 | T: git git://opensource.wolfsonmicro.com/linux-2.6-asoc |
7356 | T: git git://opensource.wolfsonmicro.com/linux-2.6-audioplus | 7356 | T: git git://opensource.wolfsonmicro.com/linux-2.6-audioplus |
7357 | W: http://opensource.wolfsonmicro.com/content/linux-drivers-wolfson-devices | 7357 | W: http://opensource.wolfsonmicro.com/content/linux-drivers-wolfson-devices |
7358 | S: Supported | 7358 | S: Supported |
7359 | F: Documentation/hwmon/wm83?? | 7359 | F: Documentation/hwmon/wm83?? |
7360 | F: arch/arm/mach-s3c64xx/mach-crag6410* | 7360 | F: arch/arm/mach-s3c64xx/mach-crag6410* |
7361 | F: drivers/leds/leds-wm83*.c | 7361 | F: drivers/leds/leds-wm83*.c |
7362 | F: drivers/hwmon/wm83??-hwmon.c | 7362 | F: drivers/hwmon/wm83??-hwmon.c |
7363 | F: drivers/input/misc/wm831x-on.c | 7363 | F: drivers/input/misc/wm831x-on.c |
7364 | F: drivers/input/touchscreen/wm831x-ts.c | 7364 | F: drivers/input/touchscreen/wm831x-ts.c |
7365 | F: drivers/input/touchscreen/wm97*.c | 7365 | F: drivers/input/touchscreen/wm97*.c |
7366 | F: drivers/mfd/wm8*.c | 7366 | F: drivers/mfd/wm8*.c |
7367 | F: drivers/power/wm83*.c | 7367 | F: drivers/power/wm83*.c |
7368 | F: drivers/rtc/rtc-wm83*.c | 7368 | F: drivers/rtc/rtc-wm83*.c |
7369 | F: drivers/regulator/wm8*.c | 7369 | F: drivers/regulator/wm8*.c |
7370 | F: drivers/video/backlight/wm83*_bl.c | 7370 | F: drivers/video/backlight/wm83*_bl.c |
7371 | F: drivers/watchdog/wm83*_wdt.c | 7371 | F: drivers/watchdog/wm83*_wdt.c |
7372 | F: include/linux/mfd/wm831x/ | 7372 | F: include/linux/mfd/wm831x/ |
7373 | F: include/linux/mfd/wm8350/ | 7373 | F: include/linux/mfd/wm8350/ |
7374 | F: include/linux/mfd/wm8400* | 7374 | F: include/linux/mfd/wm8400* |
7375 | F: include/linux/wm97xx.h | 7375 | F: include/linux/wm97xx.h |
7376 | F: include/sound/wm????.h | 7376 | F: include/sound/wm????.h |
7377 | F: sound/soc/codecs/wm* | 7377 | F: sound/soc/codecs/wm* |
7378 | 7378 | ||
7379 | WORKQUEUE | 7379 | WORKQUEUE |
7380 | M: Tejun Heo <tj@kernel.org> | 7380 | M: Tejun Heo <tj@kernel.org> |
7381 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq.git | 7381 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq.git |
7382 | S: Maintained | 7382 | S: Maintained |
7383 | F: include/linux/workqueue.h | 7383 | F: include/linux/workqueue.h |
7384 | F: kernel/workqueue.c | 7384 | F: kernel/workqueue.c |
7385 | F: Documentation/workqueue.txt | 7385 | F: Documentation/workqueue.txt |
7386 | 7386 | ||
7387 | X.25 NETWORK LAYER | 7387 | X.25 NETWORK LAYER |
7388 | M: Andrew Hendry <andrew.hendry@gmail.com> | 7388 | M: Andrew Hendry <andrew.hendry@gmail.com> |
7389 | L: linux-x25@vger.kernel.org | 7389 | L: linux-x25@vger.kernel.org |
7390 | S: Odd Fixes | 7390 | S: Odd Fixes |
7391 | F: Documentation/networking/x25* | 7391 | F: Documentation/networking/x25* |
7392 | F: include/net/x25* | 7392 | F: include/net/x25* |
7393 | F: net/x25/ | 7393 | F: net/x25/ |
7394 | 7394 | ||
7395 | X86 ARCHITECTURE (32-BIT AND 64-BIT) | 7395 | X86 ARCHITECTURE (32-BIT AND 64-BIT) |
7396 | M: Thomas Gleixner <tglx@linutronix.de> | 7396 | M: Thomas Gleixner <tglx@linutronix.de> |
7397 | M: Ingo Molnar <mingo@redhat.com> | 7397 | M: Ingo Molnar <mingo@redhat.com> |
7398 | M: "H. Peter Anvin" <hpa@zytor.com> | 7398 | M: "H. Peter Anvin" <hpa@zytor.com> |
7399 | M: x86@kernel.org | 7399 | M: x86@kernel.org |
7400 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86/core | 7400 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86/core |
7401 | S: Maintained | 7401 | S: Maintained |
7402 | F: Documentation/x86/ | 7402 | F: Documentation/x86/ |
7403 | F: arch/x86/ | 7403 | F: arch/x86/ |
7404 | 7404 | ||
7405 | X86 PLATFORM DRIVERS | 7405 | X86 PLATFORM DRIVERS |
7406 | M: Matthew Garrett <mjg@redhat.com> | 7406 | M: Matthew Garrett <mjg@redhat.com> |
7407 | L: platform-driver-x86@vger.kernel.org | 7407 | L: platform-driver-x86@vger.kernel.org |
7408 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mjg59/platform-drivers-x86.git | 7408 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mjg59/platform-drivers-x86.git |
7409 | S: Maintained | 7409 | S: Maintained |
7410 | F: drivers/platform/x86 | 7410 | F: drivers/platform/x86 |
7411 | 7411 | ||
7412 | X86 MCE INFRASTRUCTURE | 7412 | X86 MCE INFRASTRUCTURE |
7413 | M: Tony Luck <tony.luck@intel.com> | 7413 | M: Tony Luck <tony.luck@intel.com> |
7414 | M: Borislav Petkov <bp@amd64.org> | 7414 | M: Borislav Petkov <bp@amd64.org> |
7415 | L: linux-edac@vger.kernel.org | 7415 | L: linux-edac@vger.kernel.org |
7416 | S: Maintained | 7416 | S: Maintained |
7417 | F: arch/x86/kernel/cpu/mcheck/* | 7417 | F: arch/x86/kernel/cpu/mcheck/* |
7418 | 7418 | ||
7419 | XEN HYPERVISOR INTERFACE | 7419 | XEN HYPERVISOR INTERFACE |
7420 | M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> | 7420 | M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> |
7421 | M: Jeremy Fitzhardinge <jeremy@goop.org> | 7421 | M: Jeremy Fitzhardinge <jeremy@goop.org> |
7422 | L: xen-devel@lists.xensource.com (moderated for non-subscribers) | 7422 | L: xen-devel@lists.xensource.com (moderated for non-subscribers) |
7423 | L: virtualization@lists.linux-foundation.org | 7423 | L: virtualization@lists.linux-foundation.org |
7424 | S: Supported | 7424 | S: Supported |
7425 | F: arch/x86/xen/ | 7425 | F: arch/x86/xen/ |
7426 | F: drivers/*/xen-*front.c | 7426 | F: drivers/*/xen-*front.c |
7427 | F: drivers/xen/ | 7427 | F: drivers/xen/ |
7428 | F: arch/x86/include/asm/xen/ | 7428 | F: arch/x86/include/asm/xen/ |
7429 | F: include/xen/ | 7429 | F: include/xen/ |
7430 | 7430 | ||
7431 | XEN NETWORK BACKEND DRIVER | 7431 | XEN NETWORK BACKEND DRIVER |
7432 | M: Ian Campbell <ian.campbell@citrix.com> | 7432 | M: Ian Campbell <ian.campbell@citrix.com> |
7433 | L: xen-devel@lists.xensource.com (moderated for non-subscribers) | 7433 | L: xen-devel@lists.xensource.com (moderated for non-subscribers) |
7434 | L: netdev@vger.kernel.org | 7434 | L: netdev@vger.kernel.org |
7435 | S: Supported | 7435 | S: Supported |
7436 | F: drivers/net/xen-netback/* | 7436 | F: drivers/net/xen-netback/* |
7437 | 7437 | ||
7438 | XEN PCI SUBSYSTEM | 7438 | XEN PCI SUBSYSTEM |
7439 | M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> | 7439 | M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> |
7440 | L: xen-devel@lists.xensource.com (moderated for non-subscribers) | 7440 | L: xen-devel@lists.xensource.com (moderated for non-subscribers) |
7441 | S: Supported | 7441 | S: Supported |
7442 | F: arch/x86/pci/*xen* | 7442 | F: arch/x86/pci/*xen* |
7443 | F: drivers/pci/*xen* | 7443 | F: drivers/pci/*xen* |
7444 | 7444 | ||
7445 | XEN SWIOTLB SUBSYSTEM | 7445 | XEN SWIOTLB SUBSYSTEM |
7446 | M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> | 7446 | M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> |
7447 | L: xen-devel@lists.xensource.com (moderated for non-subscribers) | 7447 | L: xen-devel@lists.xensource.com (moderated for non-subscribers) |
7448 | S: Supported | 7448 | S: Supported |
7449 | F: arch/x86/xen/*swiotlb* | 7449 | F: arch/x86/xen/*swiotlb* |
7450 | F: drivers/xen/*swiotlb* | 7450 | F: drivers/xen/*swiotlb* |
7451 | 7451 | ||
7452 | XFS FILESYSTEM | 7452 | XFS FILESYSTEM |
7453 | P: Silicon Graphics Inc | 7453 | P: Silicon Graphics Inc |
7454 | M: Ben Myers <bpm@sgi.com> | 7454 | M: Ben Myers <bpm@sgi.com> |
7455 | M: Alex Elder <elder@kernel.org> | 7455 | M: Alex Elder <elder@kernel.org> |
7456 | M: xfs-masters@oss.sgi.com | 7456 | M: xfs-masters@oss.sgi.com |
7457 | L: xfs@oss.sgi.com | 7457 | L: xfs@oss.sgi.com |
7458 | W: http://oss.sgi.com/projects/xfs | 7458 | W: http://oss.sgi.com/projects/xfs |
7459 | T: git git://oss.sgi.com/xfs/xfs.git | 7459 | T: git git://oss.sgi.com/xfs/xfs.git |
7460 | S: Supported | 7460 | S: Supported |
7461 | F: Documentation/filesystems/xfs.txt | 7461 | F: Documentation/filesystems/xfs.txt |
7462 | F: fs/xfs/ | 7462 | F: fs/xfs/ |
7463 | 7463 | ||
7464 | XILINX SYSTEMACE DRIVER | 7464 | XILINX SYSTEMACE DRIVER |
7465 | M: Grant Likely <grant.likely@secretlab.ca> | 7465 | M: Grant Likely <grant.likely@secretlab.ca> |
7466 | W: http://www.secretlab.ca/ | 7466 | W: http://www.secretlab.ca/ |
7467 | S: Maintained | 7467 | S: Maintained |
7468 | F: drivers/block/xsysace.c | 7468 | F: drivers/block/xsysace.c |
7469 | 7469 | ||
7470 | XILINX UARTLITE SERIAL DRIVER | 7470 | XILINX UARTLITE SERIAL DRIVER |
7471 | M: Peter Korsgaard <jacmet@sunsite.dk> | 7471 | M: Peter Korsgaard <jacmet@sunsite.dk> |
7472 | L: linux-serial@vger.kernel.org | 7472 | L: linux-serial@vger.kernel.org |
7473 | S: Maintained | 7473 | S: Maintained |
7474 | F: drivers/tty/serial/uartlite.c | 7474 | F: drivers/tty/serial/uartlite.c |
7475 | 7475 | ||
7476 | YAM DRIVER FOR AX.25 | 7476 | YAM DRIVER FOR AX.25 |
7477 | M: Jean-Paul Roubelat <jpr@f6fbb.org> | 7477 | M: Jean-Paul Roubelat <jpr@f6fbb.org> |
7478 | L: linux-hams@vger.kernel.org | 7478 | L: linux-hams@vger.kernel.org |
7479 | S: Maintained | 7479 | S: Maintained |
7480 | F: drivers/net/hamradio/yam* | 7480 | F: drivers/net/hamradio/yam* |
7481 | F: include/linux/yam.h | 7481 | F: include/linux/yam.h |
7482 | 7482 | ||
7483 | YEALINK PHONE DRIVER | 7483 | YEALINK PHONE DRIVER |
7484 | M: Henk Vergonet <Henk.Vergonet@gmail.com> | 7484 | M: Henk Vergonet <Henk.Vergonet@gmail.com> |
7485 | L: usbb2k-api-dev@nongnu.org | 7485 | L: usbb2k-api-dev@nongnu.org |
7486 | S: Maintained | 7486 | S: Maintained |
7487 | F: Documentation/input/yealink.txt | 7487 | F: Documentation/input/yealink.txt |
7488 | F: drivers/input/misc/yealink.* | 7488 | F: drivers/input/misc/yealink.* |
7489 | 7489 | ||
7490 | Z8530 DRIVER FOR AX.25 | 7490 | Z8530 DRIVER FOR AX.25 |
7491 | M: Joerg Reuter <jreuter@yaina.de> | 7491 | M: Joerg Reuter <jreuter@yaina.de> |
7492 | W: http://yaina.de/jreuter/ | 7492 | W: http://yaina.de/jreuter/ |
7493 | W: http://www.qsl.net/dl1bke/ | 7493 | W: http://www.qsl.net/dl1bke/ |
7494 | L: linux-hams@vger.kernel.org | 7494 | L: linux-hams@vger.kernel.org |
7495 | S: Maintained | 7495 | S: Maintained |
7496 | F: Documentation/networking/z8530drv.txt | 7496 | F: Documentation/networking/z8530drv.txt |
7497 | F: drivers/net/hamradio/*scc.c | 7497 | F: drivers/net/hamradio/*scc.c |
7498 | F: drivers/net/hamradio/z8530.h | 7498 | F: drivers/net/hamradio/z8530.h |
7499 | 7499 | ||
7500 | ZD1211RW WIRELESS DRIVER | 7500 | ZD1211RW WIRELESS DRIVER |
7501 | M: Daniel Drake <dsd@gentoo.org> | 7501 | M: Daniel Drake <dsd@gentoo.org> |
7502 | M: Ulrich Kunitz <kune@deine-taler.de> | 7502 | M: Ulrich Kunitz <kune@deine-taler.de> |
7503 | W: http://zd1211.ath.cx/wiki/DriverRewrite | 7503 | W: http://zd1211.ath.cx/wiki/DriverRewrite |
7504 | L: linux-wireless@vger.kernel.org | 7504 | L: linux-wireless@vger.kernel.org |
7505 | L: zd1211-devs@lists.sourceforge.net (subscribers-only) | 7505 | L: zd1211-devs@lists.sourceforge.net (subscribers-only) |
7506 | S: Maintained | 7506 | S: Maintained |
7507 | F: drivers/net/wireless/zd1211rw/ | 7507 | F: drivers/net/wireless/zd1211rw/ |
7508 | 7508 | ||
7509 | ZR36067 VIDEO FOR LINUX DRIVER | 7509 | ZR36067 VIDEO FOR LINUX DRIVER |
7510 | L: mjpeg-users@lists.sourceforge.net | 7510 | L: mjpeg-users@lists.sourceforge.net |
7511 | L: linux-media@vger.kernel.org | 7511 | L: linux-media@vger.kernel.org |
7512 | W: http://mjpeg.sourceforge.net/driver-zoran/ | 7512 | W: http://mjpeg.sourceforge.net/driver-zoran/ |
7513 | T: Mercurial http://linuxtv.org/hg/v4l-dvb | 7513 | T: Mercurial http://linuxtv.org/hg/v4l-dvb |
7514 | S: Odd Fixes | 7514 | S: Odd Fixes |
7515 | F: drivers/media/video/zoran/ | 7515 | F: drivers/media/video/zoran/ |
7516 | 7516 | ||
7517 | ZS DECSTATION Z85C30 SERIAL DRIVER | 7517 | ZS DECSTATION Z85C30 SERIAL DRIVER |
7518 | M: "Maciej W. Rozycki" <macro@linux-mips.org> | 7518 | M: "Maciej W. Rozycki" <macro@linux-mips.org> |
7519 | S: Maintained | 7519 | S: Maintained |
7520 | F: drivers/tty/serial/zs.* | 7520 | F: drivers/tty/serial/zs.* |
7521 | 7521 | ||
7522 | THE REST | 7522 | THE REST |
7523 | M: Linus Torvalds <torvalds@linux-foundation.org> | 7523 | M: Linus Torvalds <torvalds@linux-foundation.org> |
7524 | L: linux-kernel@vger.kernel.org | 7524 | L: linux-kernel@vger.kernel.org |
7525 | Q: http://patchwork.kernel.org/project/LKML/list/ | 7525 | Q: http://patchwork.kernel.org/project/LKML/list/ |
7526 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git | 7526 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git |
7527 | S: Buried alive in reporters | 7527 | S: Buried alive in reporters |
7528 | F: * | 7528 | F: * |
7529 | F: */ | 7529 | F: */ |
drivers/tty/serial/8250/8250.c
1 | /* | 1 | /* |
2 | * Driver for 8250/16550-type serial ports | 2 | * Driver for 8250/16550-type serial ports |
3 | * | 3 | * |
4 | * Based on drivers/char/serial.c, by Linus Torvalds, Theodore Ts'o. | 4 | * Based on drivers/char/serial.c, by Linus Torvalds, Theodore Ts'o. |
5 | * | 5 | * |
6 | * Copyright (C) 2001 Russell King. | 6 | * Copyright (C) 2001 Russell King. |
7 | * | 7 | * |
8 | * This program is free software; you can redistribute it and/or modify | 8 | * This program is free software; you can redistribute it and/or modify |
9 | * it under the terms of the GNU General Public License as published by | 9 | * it under the terms of the GNU General Public License as published by |
10 | * the Free Software Foundation; either version 2 of the License, or | 10 | * the Free Software Foundation; either version 2 of the License, or |
11 | * (at your option) any later version. | 11 | * (at your option) any later version. |
12 | * | 12 | * |
13 | * A note about mapbase / membase | 13 | * A note about mapbase / membase |
14 | * | 14 | * |
15 | * mapbase is the physical address of the IO port. | 15 | * mapbase is the physical address of the IO port. |
16 | * membase is an 'ioremapped' cookie. | 16 | * membase is an 'ioremapped' cookie. |
17 | */ | 17 | */ |
18 | 18 | ||
19 | #if defined(CONFIG_SERIAL_8250_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) | 19 | #if defined(CONFIG_SERIAL_8250_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) |
20 | #define SUPPORT_SYSRQ | 20 | #define SUPPORT_SYSRQ |
21 | #endif | 21 | #endif |
22 | 22 | ||
23 | #include <linux/module.h> | 23 | #include <linux/module.h> |
24 | #include <linux/moduleparam.h> | 24 | #include <linux/moduleparam.h> |
25 | #include <linux/ioport.h> | 25 | #include <linux/ioport.h> |
26 | #include <linux/init.h> | 26 | #include <linux/init.h> |
27 | #include <linux/console.h> | 27 | #include <linux/console.h> |
28 | #include <linux/sysrq.h> | 28 | #include <linux/sysrq.h> |
29 | #include <linux/delay.h> | 29 | #include <linux/delay.h> |
30 | #include <linux/platform_device.h> | 30 | #include <linux/platform_device.h> |
31 | #include <linux/tty.h> | 31 | #include <linux/tty.h> |
32 | #include <linux/ratelimit.h> | 32 | #include <linux/ratelimit.h> |
33 | #include <linux/tty_flip.h> | 33 | #include <linux/tty_flip.h> |
34 | #include <linux/serial_reg.h> | 34 | #include <linux/serial_reg.h> |
35 | #include <linux/serial_core.h> | 35 | #include <linux/serial_core.h> |
36 | #include <linux/serial.h> | 36 | #include <linux/serial.h> |
37 | #include <linux/serial_8250.h> | 37 | #include <linux/serial_8250.h> |
38 | #include <linux/nmi.h> | 38 | #include <linux/nmi.h> |
39 | #include <linux/mutex.h> | 39 | #include <linux/mutex.h> |
40 | #include <linux/slab.h> | 40 | #include <linux/slab.h> |
41 | #ifdef CONFIG_SPARC | ||
42 | #include <linux/sunserialcore.h> | ||
43 | #endif | ||
41 | 44 | ||
42 | #include <asm/io.h> | 45 | #include <asm/io.h> |
43 | #include <asm/irq.h> | 46 | #include <asm/irq.h> |
44 | 47 | ||
45 | #include "8250.h" | 48 | #include "8250.h" |
46 | |||
47 | #ifdef CONFIG_SPARC | ||
48 | #include "../suncore.h" | ||
49 | #endif | ||
50 | 49 | ||
51 | /* | 50 | /* |
52 | * Configuration: | 51 | * Configuration: |
53 | * share_irqs - whether we pass IRQF_SHARED to request_irq(). This option | 52 | * share_irqs - whether we pass IRQF_SHARED to request_irq(). This option |
54 | * is unsafe when used on edge-triggered interrupts. | 53 | * is unsafe when used on edge-triggered interrupts. |
55 | */ | 54 | */ |
56 | static unsigned int share_irqs = SERIAL8250_SHARE_IRQS; | 55 | static unsigned int share_irqs = SERIAL8250_SHARE_IRQS; |
57 | 56 | ||
58 | static unsigned int nr_uarts = CONFIG_SERIAL_8250_RUNTIME_UARTS; | 57 | static unsigned int nr_uarts = CONFIG_SERIAL_8250_RUNTIME_UARTS; |
59 | 58 | ||
60 | static struct uart_driver serial8250_reg; | 59 | static struct uart_driver serial8250_reg; |
61 | 60 | ||
62 | static int serial_index(struct uart_port *port) | 61 | static int serial_index(struct uart_port *port) |
63 | { | 62 | { |
64 | return (serial8250_reg.minor - 64) + port->line; | 63 | return (serial8250_reg.minor - 64) + port->line; |
65 | } | 64 | } |
66 | 65 | ||
67 | static unsigned int skip_txen_test; /* force skip of txen test at init time */ | 66 | static unsigned int skip_txen_test; /* force skip of txen test at init time */ |
68 | 67 | ||
69 | /* | 68 | /* |
70 | * Debugging. | 69 | * Debugging. |
71 | */ | 70 | */ |
72 | #if 0 | 71 | #if 0 |
73 | #define DEBUG_AUTOCONF(fmt...) printk(fmt) | 72 | #define DEBUG_AUTOCONF(fmt...) printk(fmt) |
74 | #else | 73 | #else |
75 | #define DEBUG_AUTOCONF(fmt...) do { } while (0) | 74 | #define DEBUG_AUTOCONF(fmt...) do { } while (0) |
76 | #endif | 75 | #endif |
77 | 76 | ||
78 | #if 0 | 77 | #if 0 |
79 | #define DEBUG_INTR(fmt...) printk(fmt) | 78 | #define DEBUG_INTR(fmt...) printk(fmt) |
80 | #else | 79 | #else |
81 | #define DEBUG_INTR(fmt...) do { } while (0) | 80 | #define DEBUG_INTR(fmt...) do { } while (0) |
82 | #endif | 81 | #endif |
83 | 82 | ||
84 | #define PASS_LIMIT 512 | 83 | #define PASS_LIMIT 512 |
85 | 84 | ||
86 | #define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE) | 85 | #define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE) |
87 | 86 | ||
88 | 87 | ||
89 | #ifdef CONFIG_SERIAL_8250_DETECT_IRQ | 88 | #ifdef CONFIG_SERIAL_8250_DETECT_IRQ |
90 | #define CONFIG_SERIAL_DETECT_IRQ 1 | 89 | #define CONFIG_SERIAL_DETECT_IRQ 1 |
91 | #endif | 90 | #endif |
92 | #ifdef CONFIG_SERIAL_8250_MANY_PORTS | 91 | #ifdef CONFIG_SERIAL_8250_MANY_PORTS |
93 | #define CONFIG_SERIAL_MANY_PORTS 1 | 92 | #define CONFIG_SERIAL_MANY_PORTS 1 |
94 | #endif | 93 | #endif |
95 | 94 | ||
96 | /* | 95 | /* |
97 | * HUB6 is always on. This will be removed once the header | 96 | * HUB6 is always on. This will be removed once the header |
98 | * files have been cleaned. | 97 | * files have been cleaned. |
99 | */ | 98 | */ |
100 | #define CONFIG_HUB6 1 | 99 | #define CONFIG_HUB6 1 |
101 | 100 | ||
102 | #include <asm/serial.h> | 101 | #include <asm/serial.h> |
103 | /* | 102 | /* |
104 | * SERIAL_PORT_DFNS tells us about built-in ports that have no | 103 | * SERIAL_PORT_DFNS tells us about built-in ports that have no |
105 | * standard enumeration mechanism. Platforms that can find all | 104 | * standard enumeration mechanism. Platforms that can find all |
106 | * serial ports via mechanisms like ACPI or PCI need not supply it. | 105 | * serial ports via mechanisms like ACPI or PCI need not supply it. |
107 | */ | 106 | */ |
108 | #ifndef SERIAL_PORT_DFNS | 107 | #ifndef SERIAL_PORT_DFNS |
109 | #define SERIAL_PORT_DFNS | 108 | #define SERIAL_PORT_DFNS |
110 | #endif | 109 | #endif |
111 | 110 | ||
112 | static const struct old_serial_port old_serial_port[] = { | 111 | static const struct old_serial_port old_serial_port[] = { |
113 | SERIAL_PORT_DFNS /* defined in asm/serial.h */ | 112 | SERIAL_PORT_DFNS /* defined in asm/serial.h */ |
114 | }; | 113 | }; |
115 | 114 | ||
116 | #define UART_NR CONFIG_SERIAL_8250_NR_UARTS | 115 | #define UART_NR CONFIG_SERIAL_8250_NR_UARTS |
117 | 116 | ||
118 | #ifdef CONFIG_SERIAL_8250_RSA | 117 | #ifdef CONFIG_SERIAL_8250_RSA |
119 | 118 | ||
120 | #define PORT_RSA_MAX 4 | 119 | #define PORT_RSA_MAX 4 |
121 | static unsigned long probe_rsa[PORT_RSA_MAX]; | 120 | static unsigned long probe_rsa[PORT_RSA_MAX]; |
122 | static unsigned int probe_rsa_count; | 121 | static unsigned int probe_rsa_count; |
123 | #endif /* CONFIG_SERIAL_8250_RSA */ | 122 | #endif /* CONFIG_SERIAL_8250_RSA */ |
124 | 123 | ||
125 | struct irq_info { | 124 | struct irq_info { |
126 | struct hlist_node node; | 125 | struct hlist_node node; |
127 | int irq; | 126 | int irq; |
128 | spinlock_t lock; /* Protects list not the hash */ | 127 | spinlock_t lock; /* Protects list not the hash */ |
129 | struct list_head *head; | 128 | struct list_head *head; |
130 | }; | 129 | }; |
131 | 130 | ||
132 | #define NR_IRQ_HASH 32 /* Can be adjusted later */ | 131 | #define NR_IRQ_HASH 32 /* Can be adjusted later */ |
133 | static struct hlist_head irq_lists[NR_IRQ_HASH]; | 132 | static struct hlist_head irq_lists[NR_IRQ_HASH]; |
134 | static DEFINE_MUTEX(hash_mutex); /* Used to walk the hash */ | 133 | static DEFINE_MUTEX(hash_mutex); /* Used to walk the hash */ |
135 | 134 | ||
136 | /* | 135 | /* |
137 | * Here we define the default xmit fifo size used for each type of UART. | 136 | * Here we define the default xmit fifo size used for each type of UART. |
138 | */ | 137 | */ |
139 | static const struct serial8250_config uart_config[] = { | 138 | static const struct serial8250_config uart_config[] = { |
140 | [PORT_UNKNOWN] = { | 139 | [PORT_UNKNOWN] = { |
141 | .name = "unknown", | 140 | .name = "unknown", |
142 | .fifo_size = 1, | 141 | .fifo_size = 1, |
143 | .tx_loadsz = 1, | 142 | .tx_loadsz = 1, |
144 | }, | 143 | }, |
145 | [PORT_8250] = { | 144 | [PORT_8250] = { |
146 | .name = "8250", | 145 | .name = "8250", |
147 | .fifo_size = 1, | 146 | .fifo_size = 1, |
148 | .tx_loadsz = 1, | 147 | .tx_loadsz = 1, |
149 | }, | 148 | }, |
150 | [PORT_16450] = { | 149 | [PORT_16450] = { |
151 | .name = "16450", | 150 | .name = "16450", |
152 | .fifo_size = 1, | 151 | .fifo_size = 1, |
153 | .tx_loadsz = 1, | 152 | .tx_loadsz = 1, |
154 | }, | 153 | }, |
155 | [PORT_16550] = { | 154 | [PORT_16550] = { |
156 | .name = "16550", | 155 | .name = "16550", |
157 | .fifo_size = 1, | 156 | .fifo_size = 1, |
158 | .tx_loadsz = 1, | 157 | .tx_loadsz = 1, |
159 | }, | 158 | }, |
160 | [PORT_16550A] = { | 159 | [PORT_16550A] = { |
161 | .name = "16550A", | 160 | .name = "16550A", |
162 | .fifo_size = 16, | 161 | .fifo_size = 16, |
163 | .tx_loadsz = 16, | 162 | .tx_loadsz = 16, |
164 | .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, | 163 | .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, |
165 | .flags = UART_CAP_FIFO, | 164 | .flags = UART_CAP_FIFO, |
166 | }, | 165 | }, |
167 | [PORT_CIRRUS] = { | 166 | [PORT_CIRRUS] = { |
168 | .name = "Cirrus", | 167 | .name = "Cirrus", |
169 | .fifo_size = 1, | 168 | .fifo_size = 1, |
170 | .tx_loadsz = 1, | 169 | .tx_loadsz = 1, |
171 | }, | 170 | }, |
172 | [PORT_16650] = { | 171 | [PORT_16650] = { |
173 | .name = "ST16650", | 172 | .name = "ST16650", |
174 | .fifo_size = 1, | 173 | .fifo_size = 1, |
175 | .tx_loadsz = 1, | 174 | .tx_loadsz = 1, |
176 | .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP, | 175 | .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP, |
177 | }, | 176 | }, |
178 | [PORT_16650V2] = { | 177 | [PORT_16650V2] = { |
179 | .name = "ST16650V2", | 178 | .name = "ST16650V2", |
180 | .fifo_size = 32, | 179 | .fifo_size = 32, |
181 | .tx_loadsz = 16, | 180 | .tx_loadsz = 16, |
182 | .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01 | | 181 | .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01 | |
183 | UART_FCR_T_TRIG_00, | 182 | UART_FCR_T_TRIG_00, |
184 | .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP, | 183 | .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP, |
185 | }, | 184 | }, |
186 | [PORT_16750] = { | 185 | [PORT_16750] = { |
187 | .name = "TI16750", | 186 | .name = "TI16750", |
188 | .fifo_size = 64, | 187 | .fifo_size = 64, |
189 | .tx_loadsz = 64, | 188 | .tx_loadsz = 64, |
190 | .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10 | | 189 | .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10 | |
191 | UART_FCR7_64BYTE, | 190 | UART_FCR7_64BYTE, |
192 | .flags = UART_CAP_FIFO | UART_CAP_SLEEP | UART_CAP_AFE, | 191 | .flags = UART_CAP_FIFO | UART_CAP_SLEEP | UART_CAP_AFE, |
193 | }, | 192 | }, |
194 | [PORT_STARTECH] = { | 193 | [PORT_STARTECH] = { |
195 | .name = "Startech", | 194 | .name = "Startech", |
196 | .fifo_size = 1, | 195 | .fifo_size = 1, |
197 | .tx_loadsz = 1, | 196 | .tx_loadsz = 1, |
198 | }, | 197 | }, |
199 | [PORT_16C950] = { | 198 | [PORT_16C950] = { |
200 | .name = "16C950/954", | 199 | .name = "16C950/954", |
201 | .fifo_size = 128, | 200 | .fifo_size = 128, |
202 | .tx_loadsz = 128, | 201 | .tx_loadsz = 128, |
203 | .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, | 202 | .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, |
204 | /* UART_CAP_EFR breaks billionon CF bluetooth card. */ | 203 | /* UART_CAP_EFR breaks billionon CF bluetooth card. */ |
205 | .flags = UART_CAP_FIFO | UART_CAP_SLEEP, | 204 | .flags = UART_CAP_FIFO | UART_CAP_SLEEP, |
206 | }, | 205 | }, |
207 | [PORT_16654] = { | 206 | [PORT_16654] = { |
208 | .name = "ST16654", | 207 | .name = "ST16654", |
209 | .fifo_size = 64, | 208 | .fifo_size = 64, |
210 | .tx_loadsz = 32, | 209 | .tx_loadsz = 32, |
211 | .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01 | | 210 | .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01 | |
212 | UART_FCR_T_TRIG_10, | 211 | UART_FCR_T_TRIG_10, |
213 | .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP, | 212 | .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP, |
214 | }, | 213 | }, |
215 | [PORT_16850] = { | 214 | [PORT_16850] = { |
216 | .name = "XR16850", | 215 | .name = "XR16850", |
217 | .fifo_size = 128, | 216 | .fifo_size = 128, |
218 | .tx_loadsz = 128, | 217 | .tx_loadsz = 128, |
219 | .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, | 218 | .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, |
220 | .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP, | 219 | .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP, |
221 | }, | 220 | }, |
222 | [PORT_RSA] = { | 221 | [PORT_RSA] = { |
223 | .name = "RSA", | 222 | .name = "RSA", |
224 | .fifo_size = 2048, | 223 | .fifo_size = 2048, |
225 | .tx_loadsz = 2048, | 224 | .tx_loadsz = 2048, |
226 | .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_11, | 225 | .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_11, |
227 | .flags = UART_CAP_FIFO, | 226 | .flags = UART_CAP_FIFO, |
228 | }, | 227 | }, |
229 | [PORT_NS16550A] = { | 228 | [PORT_NS16550A] = { |
230 | .name = "NS16550A", | 229 | .name = "NS16550A", |
231 | .fifo_size = 16, | 230 | .fifo_size = 16, |
232 | .tx_loadsz = 16, | 231 | .tx_loadsz = 16, |
233 | .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, | 232 | .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, |
234 | .flags = UART_CAP_FIFO | UART_NATSEMI, | 233 | .flags = UART_CAP_FIFO | UART_NATSEMI, |
235 | }, | 234 | }, |
236 | [PORT_XSCALE] = { | 235 | [PORT_XSCALE] = { |
237 | .name = "XScale", | 236 | .name = "XScale", |
238 | .fifo_size = 32, | 237 | .fifo_size = 32, |
239 | .tx_loadsz = 32, | 238 | .tx_loadsz = 32, |
240 | .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, | 239 | .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, |
241 | .flags = UART_CAP_FIFO | UART_CAP_UUE | UART_CAP_RTOIE, | 240 | .flags = UART_CAP_FIFO | UART_CAP_UUE | UART_CAP_RTOIE, |
242 | }, | 241 | }, |
243 | [PORT_RM9000] = { | 242 | [PORT_RM9000] = { |
244 | .name = "RM9000", | 243 | .name = "RM9000", |
245 | .fifo_size = 16, | 244 | .fifo_size = 16, |
246 | .tx_loadsz = 16, | 245 | .tx_loadsz = 16, |
247 | .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, | 246 | .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, |
248 | .flags = UART_CAP_FIFO, | 247 | .flags = UART_CAP_FIFO, |
249 | }, | 248 | }, |
250 | [PORT_OCTEON] = { | 249 | [PORT_OCTEON] = { |
251 | .name = "OCTEON", | 250 | .name = "OCTEON", |
252 | .fifo_size = 64, | 251 | .fifo_size = 64, |
253 | .tx_loadsz = 64, | 252 | .tx_loadsz = 64, |
254 | .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, | 253 | .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, |
255 | .flags = UART_CAP_FIFO, | 254 | .flags = UART_CAP_FIFO, |
256 | }, | 255 | }, |
257 | [PORT_AR7] = { | 256 | [PORT_AR7] = { |
258 | .name = "AR7", | 257 | .name = "AR7", |
259 | .fifo_size = 16, | 258 | .fifo_size = 16, |
260 | .tx_loadsz = 16, | 259 | .tx_loadsz = 16, |
261 | .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_00, | 260 | .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_00, |
262 | .flags = UART_CAP_FIFO | UART_CAP_AFE, | 261 | .flags = UART_CAP_FIFO | UART_CAP_AFE, |
263 | }, | 262 | }, |
264 | [PORT_U6_16550A] = { | 263 | [PORT_U6_16550A] = { |
265 | .name = "U6_16550A", | 264 | .name = "U6_16550A", |
266 | .fifo_size = 64, | 265 | .fifo_size = 64, |
267 | .tx_loadsz = 64, | 266 | .tx_loadsz = 64, |
268 | .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, | 267 | .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, |
269 | .flags = UART_CAP_FIFO | UART_CAP_AFE, | 268 | .flags = UART_CAP_FIFO | UART_CAP_AFE, |
270 | }, | 269 | }, |
271 | [PORT_TEGRA] = { | 270 | [PORT_TEGRA] = { |
272 | .name = "Tegra", | 271 | .name = "Tegra", |
273 | .fifo_size = 32, | 272 | .fifo_size = 32, |
274 | .tx_loadsz = 8, | 273 | .tx_loadsz = 8, |
275 | .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01 | | 274 | .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01 | |
276 | UART_FCR_T_TRIG_01, | 275 | UART_FCR_T_TRIG_01, |
277 | .flags = UART_CAP_FIFO | UART_CAP_RTOIE, | 276 | .flags = UART_CAP_FIFO | UART_CAP_RTOIE, |
278 | }, | 277 | }, |
279 | [PORT_XR17D15X] = { | 278 | [PORT_XR17D15X] = { |
280 | .name = "XR17D15X", | 279 | .name = "XR17D15X", |
281 | .fifo_size = 64, | 280 | .fifo_size = 64, |
282 | .tx_loadsz = 64, | 281 | .tx_loadsz = 64, |
283 | .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, | 282 | .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, |
284 | .flags = UART_CAP_FIFO | UART_CAP_AFE | UART_CAP_EFR, | 283 | .flags = UART_CAP_FIFO | UART_CAP_AFE | UART_CAP_EFR, |
285 | }, | 284 | }, |
286 | }; | 285 | }; |
287 | 286 | ||
288 | #if defined(CONFIG_MIPS_ALCHEMY) | 287 | #if defined(CONFIG_MIPS_ALCHEMY) |
289 | 288 | ||
290 | /* Au1x00 UART hardware has a weird register layout */ | 289 | /* Au1x00 UART hardware has a weird register layout */ |
291 | static const u8 au_io_in_map[] = { | 290 | static const u8 au_io_in_map[] = { |
292 | [UART_RX] = 0, | 291 | [UART_RX] = 0, |
293 | [UART_IER] = 2, | 292 | [UART_IER] = 2, |
294 | [UART_IIR] = 3, | 293 | [UART_IIR] = 3, |
295 | [UART_LCR] = 5, | 294 | [UART_LCR] = 5, |
296 | [UART_MCR] = 6, | 295 | [UART_MCR] = 6, |
297 | [UART_LSR] = 7, | 296 | [UART_LSR] = 7, |
298 | [UART_MSR] = 8, | 297 | [UART_MSR] = 8, |
299 | }; | 298 | }; |
300 | 299 | ||
301 | static const u8 au_io_out_map[] = { | 300 | static const u8 au_io_out_map[] = { |
302 | [UART_TX] = 1, | 301 | [UART_TX] = 1, |
303 | [UART_IER] = 2, | 302 | [UART_IER] = 2, |
304 | [UART_FCR] = 4, | 303 | [UART_FCR] = 4, |
305 | [UART_LCR] = 5, | 304 | [UART_LCR] = 5, |
306 | [UART_MCR] = 6, | 305 | [UART_MCR] = 6, |
307 | }; | 306 | }; |
308 | 307 | ||
309 | /* sane hardware needs no mapping */ | 308 | /* sane hardware needs no mapping */ |
310 | static inline int map_8250_in_reg(struct uart_port *p, int offset) | 309 | static inline int map_8250_in_reg(struct uart_port *p, int offset) |
311 | { | 310 | { |
312 | if (p->iotype != UPIO_AU) | 311 | if (p->iotype != UPIO_AU) |
313 | return offset; | 312 | return offset; |
314 | return au_io_in_map[offset]; | 313 | return au_io_in_map[offset]; |
315 | } | 314 | } |
316 | 315 | ||
317 | static inline int map_8250_out_reg(struct uart_port *p, int offset) | 316 | static inline int map_8250_out_reg(struct uart_port *p, int offset) |
318 | { | 317 | { |
319 | if (p->iotype != UPIO_AU) | 318 | if (p->iotype != UPIO_AU) |
320 | return offset; | 319 | return offset; |
321 | return au_io_out_map[offset]; | 320 | return au_io_out_map[offset]; |
322 | } | 321 | } |
323 | 322 | ||
324 | #elif defined(CONFIG_SERIAL_8250_RM9K) | 323 | #elif defined(CONFIG_SERIAL_8250_RM9K) |
325 | 324 | ||
326 | static const u8 | 325 | static const u8 |
327 | regmap_in[8] = { | 326 | regmap_in[8] = { |
328 | [UART_RX] = 0x00, | 327 | [UART_RX] = 0x00, |
329 | [UART_IER] = 0x0c, | 328 | [UART_IER] = 0x0c, |
330 | [UART_IIR] = 0x14, | 329 | [UART_IIR] = 0x14, |
331 | [UART_LCR] = 0x1c, | 330 | [UART_LCR] = 0x1c, |
332 | [UART_MCR] = 0x20, | 331 | [UART_MCR] = 0x20, |
333 | [UART_LSR] = 0x24, | 332 | [UART_LSR] = 0x24, |
334 | [UART_MSR] = 0x28, | 333 | [UART_MSR] = 0x28, |
335 | [UART_SCR] = 0x2c | 334 | [UART_SCR] = 0x2c |
336 | }, | 335 | }, |
337 | regmap_out[8] = { | 336 | regmap_out[8] = { |
338 | [UART_TX] = 0x04, | 337 | [UART_TX] = 0x04, |
339 | [UART_IER] = 0x0c, | 338 | [UART_IER] = 0x0c, |
340 | [UART_FCR] = 0x18, | 339 | [UART_FCR] = 0x18, |
341 | [UART_LCR] = 0x1c, | 340 | [UART_LCR] = 0x1c, |
342 | [UART_MCR] = 0x20, | 341 | [UART_MCR] = 0x20, |
343 | [UART_LSR] = 0x24, | 342 | [UART_LSR] = 0x24, |
344 | [UART_MSR] = 0x28, | 343 | [UART_MSR] = 0x28, |
345 | [UART_SCR] = 0x2c | 344 | [UART_SCR] = 0x2c |
346 | }; | 345 | }; |
347 | 346 | ||
348 | static inline int map_8250_in_reg(struct uart_port *p, int offset) | 347 | static inline int map_8250_in_reg(struct uart_port *p, int offset) |
349 | { | 348 | { |
350 | if (p->iotype != UPIO_RM9000) | 349 | if (p->iotype != UPIO_RM9000) |
351 | return offset; | 350 | return offset; |
352 | return regmap_in[offset]; | 351 | return regmap_in[offset]; |
353 | } | 352 | } |
354 | 353 | ||
355 | static inline int map_8250_out_reg(struct uart_port *p, int offset) | 354 | static inline int map_8250_out_reg(struct uart_port *p, int offset) |
356 | { | 355 | { |
357 | if (p->iotype != UPIO_RM9000) | 356 | if (p->iotype != UPIO_RM9000) |
358 | return offset; | 357 | return offset; |
359 | return regmap_out[offset]; | 358 | return regmap_out[offset]; |
360 | } | 359 | } |
361 | 360 | ||
362 | #else | 361 | #else |
363 | 362 | ||
364 | /* sane hardware needs no mapping */ | 363 | /* sane hardware needs no mapping */ |
365 | #define map_8250_in_reg(up, offset) (offset) | 364 | #define map_8250_in_reg(up, offset) (offset) |
366 | #define map_8250_out_reg(up, offset) (offset) | 365 | #define map_8250_out_reg(up, offset) (offset) |
367 | 366 | ||
368 | #endif | 367 | #endif |
369 | 368 | ||
370 | static unsigned int hub6_serial_in(struct uart_port *p, int offset) | 369 | static unsigned int hub6_serial_in(struct uart_port *p, int offset) |
371 | { | 370 | { |
372 | offset = map_8250_in_reg(p, offset) << p->regshift; | 371 | offset = map_8250_in_reg(p, offset) << p->regshift; |
373 | outb(p->hub6 - 1 + offset, p->iobase); | 372 | outb(p->hub6 - 1 + offset, p->iobase); |
374 | return inb(p->iobase + 1); | 373 | return inb(p->iobase + 1); |
375 | } | 374 | } |
376 | 375 | ||
377 | static void hub6_serial_out(struct uart_port *p, int offset, int value) | 376 | static void hub6_serial_out(struct uart_port *p, int offset, int value) |
378 | { | 377 | { |
379 | offset = map_8250_out_reg(p, offset) << p->regshift; | 378 | offset = map_8250_out_reg(p, offset) << p->regshift; |
380 | outb(p->hub6 - 1 + offset, p->iobase); | 379 | outb(p->hub6 - 1 + offset, p->iobase); |
381 | outb(value, p->iobase + 1); | 380 | outb(value, p->iobase + 1); |
382 | } | 381 | } |
383 | 382 | ||
384 | static unsigned int mem_serial_in(struct uart_port *p, int offset) | 383 | static unsigned int mem_serial_in(struct uart_port *p, int offset) |
385 | { | 384 | { |
386 | offset = map_8250_in_reg(p, offset) << p->regshift; | 385 | offset = map_8250_in_reg(p, offset) << p->regshift; |
387 | return readb(p->membase + offset); | 386 | return readb(p->membase + offset); |
388 | } | 387 | } |
389 | 388 | ||
390 | static void mem_serial_out(struct uart_port *p, int offset, int value) | 389 | static void mem_serial_out(struct uart_port *p, int offset, int value) |
391 | { | 390 | { |
392 | offset = map_8250_out_reg(p, offset) << p->regshift; | 391 | offset = map_8250_out_reg(p, offset) << p->regshift; |
393 | writeb(value, p->membase + offset); | 392 | writeb(value, p->membase + offset); |
394 | } | 393 | } |
395 | 394 | ||
396 | static void mem32_serial_out(struct uart_port *p, int offset, int value) | 395 | static void mem32_serial_out(struct uart_port *p, int offset, int value) |
397 | { | 396 | { |
398 | offset = map_8250_out_reg(p, offset) << p->regshift; | 397 | offset = map_8250_out_reg(p, offset) << p->regshift; |
399 | writel(value, p->membase + offset); | 398 | writel(value, p->membase + offset); |
400 | } | 399 | } |
401 | 400 | ||
402 | static unsigned int mem32_serial_in(struct uart_port *p, int offset) | 401 | static unsigned int mem32_serial_in(struct uart_port *p, int offset) |
403 | { | 402 | { |
404 | offset = map_8250_in_reg(p, offset) << p->regshift; | 403 | offset = map_8250_in_reg(p, offset) << p->regshift; |
405 | return readl(p->membase + offset); | 404 | return readl(p->membase + offset); |
406 | } | 405 | } |
407 | 406 | ||
408 | static unsigned int au_serial_in(struct uart_port *p, int offset) | 407 | static unsigned int au_serial_in(struct uart_port *p, int offset) |
409 | { | 408 | { |
410 | offset = map_8250_in_reg(p, offset) << p->regshift; | 409 | offset = map_8250_in_reg(p, offset) << p->regshift; |
411 | return __raw_readl(p->membase + offset); | 410 | return __raw_readl(p->membase + offset); |
412 | } | 411 | } |
413 | 412 | ||
414 | static void au_serial_out(struct uart_port *p, int offset, int value) | 413 | static void au_serial_out(struct uart_port *p, int offset, int value) |
415 | { | 414 | { |
416 | offset = map_8250_out_reg(p, offset) << p->regshift; | 415 | offset = map_8250_out_reg(p, offset) << p->regshift; |
417 | __raw_writel(value, p->membase + offset); | 416 | __raw_writel(value, p->membase + offset); |
418 | } | 417 | } |
419 | 418 | ||
420 | static unsigned int io_serial_in(struct uart_port *p, int offset) | 419 | static unsigned int io_serial_in(struct uart_port *p, int offset) |
421 | { | 420 | { |
422 | offset = map_8250_in_reg(p, offset) << p->regshift; | 421 | offset = map_8250_in_reg(p, offset) << p->regshift; |
423 | return inb(p->iobase + offset); | 422 | return inb(p->iobase + offset); |
424 | } | 423 | } |
425 | 424 | ||
426 | static void io_serial_out(struct uart_port *p, int offset, int value) | 425 | static void io_serial_out(struct uart_port *p, int offset, int value) |
427 | { | 426 | { |
428 | offset = map_8250_out_reg(p, offset) << p->regshift; | 427 | offset = map_8250_out_reg(p, offset) << p->regshift; |
429 | outb(value, p->iobase + offset); | 428 | outb(value, p->iobase + offset); |
430 | } | 429 | } |
431 | 430 | ||
432 | static int serial8250_default_handle_irq(struct uart_port *port); | 431 | static int serial8250_default_handle_irq(struct uart_port *port); |
433 | 432 | ||
434 | static void set_io_from_upio(struct uart_port *p) | 433 | static void set_io_from_upio(struct uart_port *p) |
435 | { | 434 | { |
436 | struct uart_8250_port *up = | 435 | struct uart_8250_port *up = |
437 | container_of(p, struct uart_8250_port, port); | 436 | container_of(p, struct uart_8250_port, port); |
438 | switch (p->iotype) { | 437 | switch (p->iotype) { |
439 | case UPIO_HUB6: | 438 | case UPIO_HUB6: |
440 | p->serial_in = hub6_serial_in; | 439 | p->serial_in = hub6_serial_in; |
441 | p->serial_out = hub6_serial_out; | 440 | p->serial_out = hub6_serial_out; |
442 | break; | 441 | break; |
443 | 442 | ||
444 | case UPIO_MEM: | 443 | case UPIO_MEM: |
445 | p->serial_in = mem_serial_in; | 444 | p->serial_in = mem_serial_in; |
446 | p->serial_out = mem_serial_out; | 445 | p->serial_out = mem_serial_out; |
447 | break; | 446 | break; |
448 | 447 | ||
449 | case UPIO_RM9000: | 448 | case UPIO_RM9000: |
450 | case UPIO_MEM32: | 449 | case UPIO_MEM32: |
451 | p->serial_in = mem32_serial_in; | 450 | p->serial_in = mem32_serial_in; |
452 | p->serial_out = mem32_serial_out; | 451 | p->serial_out = mem32_serial_out; |
453 | break; | 452 | break; |
454 | 453 | ||
455 | case UPIO_AU: | 454 | case UPIO_AU: |
456 | p->serial_in = au_serial_in; | 455 | p->serial_in = au_serial_in; |
457 | p->serial_out = au_serial_out; | 456 | p->serial_out = au_serial_out; |
458 | break; | 457 | break; |
459 | 458 | ||
460 | default: | 459 | default: |
461 | p->serial_in = io_serial_in; | 460 | p->serial_in = io_serial_in; |
462 | p->serial_out = io_serial_out; | 461 | p->serial_out = io_serial_out; |
463 | break; | 462 | break; |
464 | } | 463 | } |
465 | /* Remember loaded iotype */ | 464 | /* Remember loaded iotype */ |
466 | up->cur_iotype = p->iotype; | 465 | up->cur_iotype = p->iotype; |
467 | p->handle_irq = serial8250_default_handle_irq; | 466 | p->handle_irq = serial8250_default_handle_irq; |
468 | } | 467 | } |
469 | 468 | ||
470 | static void | 469 | static void |
471 | serial_out_sync(struct uart_8250_port *up, int offset, int value) | 470 | serial_out_sync(struct uart_8250_port *up, int offset, int value) |
472 | { | 471 | { |
473 | struct uart_port *p = &up->port; | 472 | struct uart_port *p = &up->port; |
474 | switch (p->iotype) { | 473 | switch (p->iotype) { |
475 | case UPIO_MEM: | 474 | case UPIO_MEM: |
476 | case UPIO_MEM32: | 475 | case UPIO_MEM32: |
477 | case UPIO_AU: | 476 | case UPIO_AU: |
478 | p->serial_out(p, offset, value); | 477 | p->serial_out(p, offset, value); |
479 | p->serial_in(p, UART_LCR); /* safe, no side-effects */ | 478 | p->serial_in(p, UART_LCR); /* safe, no side-effects */ |
480 | break; | 479 | break; |
481 | default: | 480 | default: |
482 | p->serial_out(p, offset, value); | 481 | p->serial_out(p, offset, value); |
483 | } | 482 | } |
484 | } | 483 | } |
485 | 484 | ||
486 | #define serial_in(up, offset) \ | 485 | #define serial_in(up, offset) \ |
487 | (up->port.serial_in(&(up)->port, (offset))) | 486 | (up->port.serial_in(&(up)->port, (offset))) |
488 | #define serial_out(up, offset, value) \ | 487 | #define serial_out(up, offset, value) \ |
489 | (up->port.serial_out(&(up)->port, (offset), (value))) | 488 | (up->port.serial_out(&(up)->port, (offset), (value))) |
490 | /* | 489 | /* |
491 | * We used to support using pause I/O for certain machines. We | 490 | * We used to support using pause I/O for certain machines. We |
492 | * haven't supported this for a while, but just in case it's badly | 491 | * haven't supported this for a while, but just in case it's badly |
493 | * needed for certain old 386 machines, I've left these #define's | 492 | * needed for certain old 386 machines, I've left these #define's |
494 | * in.... | 493 | * in.... |
495 | */ | 494 | */ |
496 | #define serial_inp(up, offset) serial_in(up, offset) | 495 | #define serial_inp(up, offset) serial_in(up, offset) |
497 | #define serial_outp(up, offset, value) serial_out(up, offset, value) | 496 | #define serial_outp(up, offset, value) serial_out(up, offset, value) |
498 | 497 | ||
499 | /* Uart divisor latch read */ | 498 | /* Uart divisor latch read */ |
500 | static inline int _serial_dl_read(struct uart_8250_port *up) | 499 | static inline int _serial_dl_read(struct uart_8250_port *up) |
501 | { | 500 | { |
502 | return serial_inp(up, UART_DLL) | serial_inp(up, UART_DLM) << 8; | 501 | return serial_inp(up, UART_DLL) | serial_inp(up, UART_DLM) << 8; |
503 | } | 502 | } |
504 | 503 | ||
505 | /* Uart divisor latch write */ | 504 | /* Uart divisor latch write */ |
506 | static inline void _serial_dl_write(struct uart_8250_port *up, int value) | 505 | static inline void _serial_dl_write(struct uart_8250_port *up, int value) |
507 | { | 506 | { |
508 | serial_outp(up, UART_DLL, value & 0xff); | 507 | serial_outp(up, UART_DLL, value & 0xff); |
509 | serial_outp(up, UART_DLM, value >> 8 & 0xff); | 508 | serial_outp(up, UART_DLM, value >> 8 & 0xff); |
510 | } | 509 | } |
511 | 510 | ||
512 | #if defined(CONFIG_MIPS_ALCHEMY) | 511 | #if defined(CONFIG_MIPS_ALCHEMY) |
513 | /* Au1x00 haven't got a standard divisor latch */ | 512 | /* Au1x00 haven't got a standard divisor latch */ |
514 | static int serial_dl_read(struct uart_8250_port *up) | 513 | static int serial_dl_read(struct uart_8250_port *up) |
515 | { | 514 | { |
516 | if (up->port.iotype == UPIO_AU) | 515 | if (up->port.iotype == UPIO_AU) |
517 | return __raw_readl(up->port.membase + 0x28); | 516 | return __raw_readl(up->port.membase + 0x28); |
518 | else | 517 | else |
519 | return _serial_dl_read(up); | 518 | return _serial_dl_read(up); |
520 | } | 519 | } |
521 | 520 | ||
522 | static void serial_dl_write(struct uart_8250_port *up, int value) | 521 | static void serial_dl_write(struct uart_8250_port *up, int value) |
523 | { | 522 | { |
524 | if (up->port.iotype == UPIO_AU) | 523 | if (up->port.iotype == UPIO_AU) |
525 | __raw_writel(value, up->port.membase + 0x28); | 524 | __raw_writel(value, up->port.membase + 0x28); |
526 | else | 525 | else |
527 | _serial_dl_write(up, value); | 526 | _serial_dl_write(up, value); |
528 | } | 527 | } |
529 | #elif defined(CONFIG_SERIAL_8250_RM9K) | 528 | #elif defined(CONFIG_SERIAL_8250_RM9K) |
530 | static int serial_dl_read(struct uart_8250_port *up) | 529 | static int serial_dl_read(struct uart_8250_port *up) |
531 | { | 530 | { |
532 | return (up->port.iotype == UPIO_RM9000) ? | 531 | return (up->port.iotype == UPIO_RM9000) ? |
533 | (((__raw_readl(up->port.membase + 0x10) << 8) | | 532 | (((__raw_readl(up->port.membase + 0x10) << 8) | |
534 | (__raw_readl(up->port.membase + 0x08) & 0xff)) & 0xffff) : | 533 | (__raw_readl(up->port.membase + 0x08) & 0xff)) & 0xffff) : |
535 | _serial_dl_read(up); | 534 | _serial_dl_read(up); |
536 | } | 535 | } |
537 | 536 | ||
538 | static void serial_dl_write(struct uart_8250_port *up, int value) | 537 | static void serial_dl_write(struct uart_8250_port *up, int value) |
539 | { | 538 | { |
540 | if (up->port.iotype == UPIO_RM9000) { | 539 | if (up->port.iotype == UPIO_RM9000) { |
541 | __raw_writel(value, up->port.membase + 0x08); | 540 | __raw_writel(value, up->port.membase + 0x08); |
542 | __raw_writel(value >> 8, up->port.membase + 0x10); | 541 | __raw_writel(value >> 8, up->port.membase + 0x10); |
543 | } else { | 542 | } else { |
544 | _serial_dl_write(up, value); | 543 | _serial_dl_write(up, value); |
545 | } | 544 | } |
546 | } | 545 | } |
547 | #else | 546 | #else |
548 | #define serial_dl_read(up) _serial_dl_read(up) | 547 | #define serial_dl_read(up) _serial_dl_read(up) |
549 | #define serial_dl_write(up, value) _serial_dl_write(up, value) | 548 | #define serial_dl_write(up, value) _serial_dl_write(up, value) |
550 | #endif | 549 | #endif |
551 | 550 | ||
552 | /* | 551 | /* |
553 | * For the 16C950 | 552 | * For the 16C950 |
554 | */ | 553 | */ |
555 | static void serial_icr_write(struct uart_8250_port *up, int offset, int value) | 554 | static void serial_icr_write(struct uart_8250_port *up, int offset, int value) |
556 | { | 555 | { |
557 | serial_out(up, UART_SCR, offset); | 556 | serial_out(up, UART_SCR, offset); |
558 | serial_out(up, UART_ICR, value); | 557 | serial_out(up, UART_ICR, value); |
559 | } | 558 | } |
560 | 559 | ||
561 | static unsigned int serial_icr_read(struct uart_8250_port *up, int offset) | 560 | static unsigned int serial_icr_read(struct uart_8250_port *up, int offset) |
562 | { | 561 | { |
563 | unsigned int value; | 562 | unsigned int value; |
564 | 563 | ||
565 | serial_icr_write(up, UART_ACR, up->acr | UART_ACR_ICRRD); | 564 | serial_icr_write(up, UART_ACR, up->acr | UART_ACR_ICRRD); |
566 | serial_out(up, UART_SCR, offset); | 565 | serial_out(up, UART_SCR, offset); |
567 | value = serial_in(up, UART_ICR); | 566 | value = serial_in(up, UART_ICR); |
568 | serial_icr_write(up, UART_ACR, up->acr); | 567 | serial_icr_write(up, UART_ACR, up->acr); |
569 | 568 | ||
570 | return value; | 569 | return value; |
571 | } | 570 | } |
572 | 571 | ||
573 | /* | 572 | /* |
574 | * FIFO support. | 573 | * FIFO support. |
575 | */ | 574 | */ |
576 | static void serial8250_clear_fifos(struct uart_8250_port *p) | 575 | static void serial8250_clear_fifos(struct uart_8250_port *p) |
577 | { | 576 | { |
578 | if (p->capabilities & UART_CAP_FIFO) { | 577 | if (p->capabilities & UART_CAP_FIFO) { |
579 | serial_outp(p, UART_FCR, UART_FCR_ENABLE_FIFO); | 578 | serial_outp(p, UART_FCR, UART_FCR_ENABLE_FIFO); |
580 | serial_outp(p, UART_FCR, UART_FCR_ENABLE_FIFO | | 579 | serial_outp(p, UART_FCR, UART_FCR_ENABLE_FIFO | |
581 | UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT); | 580 | UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT); |
582 | serial_outp(p, UART_FCR, 0); | 581 | serial_outp(p, UART_FCR, 0); |
583 | } | 582 | } |
584 | } | 583 | } |
585 | 584 | ||
586 | /* | 585 | /* |
587 | * IER sleep support. UARTs which have EFRs need the "extended | 586 | * IER sleep support. UARTs which have EFRs need the "extended |
588 | * capability" bit enabled. Note that on XR16C850s, we need to | 587 | * capability" bit enabled. Note that on XR16C850s, we need to |
589 | * reset LCR to write to IER. | 588 | * reset LCR to write to IER. |
590 | */ | 589 | */ |
591 | static void serial8250_set_sleep(struct uart_8250_port *p, int sleep) | 590 | static void serial8250_set_sleep(struct uart_8250_port *p, int sleep) |
592 | { | 591 | { |
593 | if (p->capabilities & UART_CAP_SLEEP) { | 592 | if (p->capabilities & UART_CAP_SLEEP) { |
594 | if (p->capabilities & UART_CAP_EFR) { | 593 | if (p->capabilities & UART_CAP_EFR) { |
595 | serial_outp(p, UART_LCR, UART_LCR_CONF_MODE_B); | 594 | serial_outp(p, UART_LCR, UART_LCR_CONF_MODE_B); |
596 | serial_outp(p, UART_EFR, UART_EFR_ECB); | 595 | serial_outp(p, UART_EFR, UART_EFR_ECB); |
597 | serial_outp(p, UART_LCR, 0); | 596 | serial_outp(p, UART_LCR, 0); |
598 | } | 597 | } |
599 | serial_outp(p, UART_IER, sleep ? UART_IERX_SLEEP : 0); | 598 | serial_outp(p, UART_IER, sleep ? UART_IERX_SLEEP : 0); |
600 | if (p->capabilities & UART_CAP_EFR) { | 599 | if (p->capabilities & UART_CAP_EFR) { |
601 | serial_outp(p, UART_LCR, UART_LCR_CONF_MODE_B); | 600 | serial_outp(p, UART_LCR, UART_LCR_CONF_MODE_B); |
602 | serial_outp(p, UART_EFR, 0); | 601 | serial_outp(p, UART_EFR, 0); |
603 | serial_outp(p, UART_LCR, 0); | 602 | serial_outp(p, UART_LCR, 0); |
604 | } | 603 | } |
605 | } | 604 | } |
606 | } | 605 | } |
607 | 606 | ||
608 | #ifdef CONFIG_SERIAL_8250_RSA | 607 | #ifdef CONFIG_SERIAL_8250_RSA |
609 | /* | 608 | /* |
610 | * Attempts to turn on the RSA FIFO. Returns zero on failure. | 609 | * Attempts to turn on the RSA FIFO. Returns zero on failure. |
611 | * We set the port uart clock rate if we succeed. | 610 | * We set the port uart clock rate if we succeed. |
612 | */ | 611 | */ |
613 | static int __enable_rsa(struct uart_8250_port *up) | 612 | static int __enable_rsa(struct uart_8250_port *up) |
614 | { | 613 | { |
615 | unsigned char mode; | 614 | unsigned char mode; |
616 | int result; | 615 | int result; |
617 | 616 | ||
618 | mode = serial_inp(up, UART_RSA_MSR); | 617 | mode = serial_inp(up, UART_RSA_MSR); |
619 | result = mode & UART_RSA_MSR_FIFO; | 618 | result = mode & UART_RSA_MSR_FIFO; |
620 | 619 | ||
621 | if (!result) { | 620 | if (!result) { |
622 | serial_outp(up, UART_RSA_MSR, mode | UART_RSA_MSR_FIFO); | 621 | serial_outp(up, UART_RSA_MSR, mode | UART_RSA_MSR_FIFO); |
623 | mode = serial_inp(up, UART_RSA_MSR); | 622 | mode = serial_inp(up, UART_RSA_MSR); |
624 | result = mode & UART_RSA_MSR_FIFO; | 623 | result = mode & UART_RSA_MSR_FIFO; |
625 | } | 624 | } |
626 | 625 | ||
627 | if (result) | 626 | if (result) |
628 | up->port.uartclk = SERIAL_RSA_BAUD_BASE * 16; | 627 | up->port.uartclk = SERIAL_RSA_BAUD_BASE * 16; |
629 | 628 | ||
630 | return result; | 629 | return result; |
631 | } | 630 | } |
632 | 631 | ||
633 | static void enable_rsa(struct uart_8250_port *up) | 632 | static void enable_rsa(struct uart_8250_port *up) |
634 | { | 633 | { |
635 | if (up->port.type == PORT_RSA) { | 634 | if (up->port.type == PORT_RSA) { |
636 | if (up->port.uartclk != SERIAL_RSA_BAUD_BASE * 16) { | 635 | if (up->port.uartclk != SERIAL_RSA_BAUD_BASE * 16) { |
637 | spin_lock_irq(&up->port.lock); | 636 | spin_lock_irq(&up->port.lock); |
638 | __enable_rsa(up); | 637 | __enable_rsa(up); |
639 | spin_unlock_irq(&up->port.lock); | 638 | spin_unlock_irq(&up->port.lock); |
640 | } | 639 | } |
641 | if (up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16) | 640 | if (up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16) |
642 | serial_outp(up, UART_RSA_FRR, 0); | 641 | serial_outp(up, UART_RSA_FRR, 0); |
643 | } | 642 | } |
644 | } | 643 | } |
645 | 644 | ||
646 | /* | 645 | /* |
647 | * Attempts to turn off the RSA FIFO. Returns zero on failure. | 646 | * Attempts to turn off the RSA FIFO. Returns zero on failure. |
648 | * It is unknown why interrupts were disabled in here. However, | 647 | * It is unknown why interrupts were disabled in here. However, |
649 | * the caller is expected to preserve this behaviour by grabbing | 648 | * the caller is expected to preserve this behaviour by grabbing |
650 | * the spinlock before calling this function. | 649 | * the spinlock before calling this function. |
651 | */ | 650 | */ |
652 | static void disable_rsa(struct uart_8250_port *up) | 651 | static void disable_rsa(struct uart_8250_port *up) |
653 | { | 652 | { |
654 | unsigned char mode; | 653 | unsigned char mode; |
655 | int result; | 654 | int result; |
656 | 655 | ||
657 | if (up->port.type == PORT_RSA && | 656 | if (up->port.type == PORT_RSA && |
658 | up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16) { | 657 | up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16) { |
659 | spin_lock_irq(&up->port.lock); | 658 | spin_lock_irq(&up->port.lock); |
660 | 659 | ||
661 | mode = serial_inp(up, UART_RSA_MSR); | 660 | mode = serial_inp(up, UART_RSA_MSR); |
662 | result = !(mode & UART_RSA_MSR_FIFO); | 661 | result = !(mode & UART_RSA_MSR_FIFO); |
663 | 662 | ||
664 | if (!result) { | 663 | if (!result) { |
665 | serial_outp(up, UART_RSA_MSR, mode & ~UART_RSA_MSR_FIFO); | 664 | serial_outp(up, UART_RSA_MSR, mode & ~UART_RSA_MSR_FIFO); |
666 | mode = serial_inp(up, UART_RSA_MSR); | 665 | mode = serial_inp(up, UART_RSA_MSR); |
667 | result = !(mode & UART_RSA_MSR_FIFO); | 666 | result = !(mode & UART_RSA_MSR_FIFO); |
668 | } | 667 | } |
669 | 668 | ||
670 | if (result) | 669 | if (result) |
671 | up->port.uartclk = SERIAL_RSA_BAUD_BASE_LO * 16; | 670 | up->port.uartclk = SERIAL_RSA_BAUD_BASE_LO * 16; |
672 | spin_unlock_irq(&up->port.lock); | 671 | spin_unlock_irq(&up->port.lock); |
673 | } | 672 | } |
674 | } | 673 | } |
675 | #endif /* CONFIG_SERIAL_8250_RSA */ | 674 | #endif /* CONFIG_SERIAL_8250_RSA */ |
676 | 675 | ||
677 | /* | 676 | /* |
678 | * This is a quickie test to see how big the FIFO is. | 677 | * This is a quickie test to see how big the FIFO is. |
679 | * It doesn't work at all the time, more's the pity. | 678 | * It doesn't work at all the time, more's the pity. |
680 | */ | 679 | */ |
681 | static int size_fifo(struct uart_8250_port *up) | 680 | static int size_fifo(struct uart_8250_port *up) |
682 | { | 681 | { |
683 | unsigned char old_fcr, old_mcr, old_lcr; | 682 | unsigned char old_fcr, old_mcr, old_lcr; |
684 | unsigned short old_dl; | 683 | unsigned short old_dl; |
685 | int count; | 684 | int count; |
686 | 685 | ||
687 | old_lcr = serial_inp(up, UART_LCR); | 686 | old_lcr = serial_inp(up, UART_LCR); |
688 | serial_outp(up, UART_LCR, 0); | 687 | serial_outp(up, UART_LCR, 0); |
689 | old_fcr = serial_inp(up, UART_FCR); | 688 | old_fcr = serial_inp(up, UART_FCR); |
690 | old_mcr = serial_inp(up, UART_MCR); | 689 | old_mcr = serial_inp(up, UART_MCR); |
691 | serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO | | 690 | serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO | |
692 | UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT); | 691 | UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT); |
693 | serial_outp(up, UART_MCR, UART_MCR_LOOP); | 692 | serial_outp(up, UART_MCR, UART_MCR_LOOP); |
694 | serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_A); | 693 | serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_A); |
695 | old_dl = serial_dl_read(up); | 694 | old_dl = serial_dl_read(up); |
696 | serial_dl_write(up, 0x0001); | 695 | serial_dl_write(up, 0x0001); |
697 | serial_outp(up, UART_LCR, 0x03); | 696 | serial_outp(up, UART_LCR, 0x03); |
698 | for (count = 0; count < 256; count++) | 697 | for (count = 0; count < 256; count++) |
699 | serial_outp(up, UART_TX, count); | 698 | serial_outp(up, UART_TX, count); |
700 | mdelay(20);/* FIXME - schedule_timeout */ | 699 | mdelay(20);/* FIXME - schedule_timeout */ |
701 | for (count = 0; (serial_inp(up, UART_LSR) & UART_LSR_DR) && | 700 | for (count = 0; (serial_inp(up, UART_LSR) & UART_LSR_DR) && |
702 | (count < 256); count++) | 701 | (count < 256); count++) |
703 | serial_inp(up, UART_RX); | 702 | serial_inp(up, UART_RX); |
704 | serial_outp(up, UART_FCR, old_fcr); | 703 | serial_outp(up, UART_FCR, old_fcr); |
705 | serial_outp(up, UART_MCR, old_mcr); | 704 | serial_outp(up, UART_MCR, old_mcr); |
706 | serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_A); | 705 | serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_A); |
707 | serial_dl_write(up, old_dl); | 706 | serial_dl_write(up, old_dl); |
708 | serial_outp(up, UART_LCR, old_lcr); | 707 | serial_outp(up, UART_LCR, old_lcr); |
709 | 708 | ||
710 | return count; | 709 | return count; |
711 | } | 710 | } |
712 | 711 | ||
713 | /* | 712 | /* |
714 | * Read UART ID using the divisor method - set DLL and DLM to zero | 713 | * Read UART ID using the divisor method - set DLL and DLM to zero |
715 | * and the revision will be in DLL and device type in DLM. We | 714 | * and the revision will be in DLL and device type in DLM. We |
716 | * preserve the device state across this. | 715 | * preserve the device state across this. |
717 | */ | 716 | */ |
718 | static unsigned int autoconfig_read_divisor_id(struct uart_8250_port *p) | 717 | static unsigned int autoconfig_read_divisor_id(struct uart_8250_port *p) |
719 | { | 718 | { |
720 | unsigned char old_dll, old_dlm, old_lcr; | 719 | unsigned char old_dll, old_dlm, old_lcr; |
721 | unsigned int id; | 720 | unsigned int id; |
722 | 721 | ||
723 | old_lcr = serial_inp(p, UART_LCR); | 722 | old_lcr = serial_inp(p, UART_LCR); |
724 | serial_outp(p, UART_LCR, UART_LCR_CONF_MODE_A); | 723 | serial_outp(p, UART_LCR, UART_LCR_CONF_MODE_A); |
725 | 724 | ||
726 | old_dll = serial_inp(p, UART_DLL); | 725 | old_dll = serial_inp(p, UART_DLL); |
727 | old_dlm = serial_inp(p, UART_DLM); | 726 | old_dlm = serial_inp(p, UART_DLM); |
728 | 727 | ||
729 | serial_outp(p, UART_DLL, 0); | 728 | serial_outp(p, UART_DLL, 0); |
730 | serial_outp(p, UART_DLM, 0); | 729 | serial_outp(p, UART_DLM, 0); |
731 | 730 | ||
732 | id = serial_inp(p, UART_DLL) | serial_inp(p, UART_DLM) << 8; | 731 | id = serial_inp(p, UART_DLL) | serial_inp(p, UART_DLM) << 8; |
733 | 732 | ||
734 | serial_outp(p, UART_DLL, old_dll); | 733 | serial_outp(p, UART_DLL, old_dll); |
735 | serial_outp(p, UART_DLM, old_dlm); | 734 | serial_outp(p, UART_DLM, old_dlm); |
736 | serial_outp(p, UART_LCR, old_lcr); | 735 | serial_outp(p, UART_LCR, old_lcr); |
737 | 736 | ||
738 | return id; | 737 | return id; |
739 | } | 738 | } |
740 | 739 | ||
741 | /* | 740 | /* |
742 | * This is a helper routine to autodetect StarTech/Exar/Oxsemi UART's. | 741 | * This is a helper routine to autodetect StarTech/Exar/Oxsemi UART's. |
743 | * When this function is called we know it is at least a StarTech | 742 | * When this function is called we know it is at least a StarTech |
744 | * 16650 V2, but it might be one of several StarTech UARTs, or one of | 743 | * 16650 V2, but it might be one of several StarTech UARTs, or one of |
745 | * its clones. (We treat the broken original StarTech 16650 V1 as a | 744 | * its clones. (We treat the broken original StarTech 16650 V1 as a |
746 | * 16550, and why not? Startech doesn't seem to even acknowledge its | 745 | * 16550, and why not? Startech doesn't seem to even acknowledge its |
747 | * existence.) | 746 | * existence.) |
748 | * | 747 | * |
749 | * What evil have men's minds wrought... | 748 | * What evil have men's minds wrought... |
750 | */ | 749 | */ |
751 | static void autoconfig_has_efr(struct uart_8250_port *up) | 750 | static void autoconfig_has_efr(struct uart_8250_port *up) |
752 | { | 751 | { |
753 | unsigned int id1, id2, id3, rev; | 752 | unsigned int id1, id2, id3, rev; |
754 | 753 | ||
755 | /* | 754 | /* |
756 | * Everything with an EFR has SLEEP | 755 | * Everything with an EFR has SLEEP |
757 | */ | 756 | */ |
758 | up->capabilities |= UART_CAP_EFR | UART_CAP_SLEEP; | 757 | up->capabilities |= UART_CAP_EFR | UART_CAP_SLEEP; |
759 | 758 | ||
760 | /* | 759 | /* |
761 | * First we check to see if it's an Oxford Semiconductor UART. | 760 | * First we check to see if it's an Oxford Semiconductor UART. |
762 | * | 761 | * |
763 | * If we have to do this here because some non-National | 762 | * If we have to do this here because some non-National |
764 | * Semiconductor clone chips lock up if you try writing to the | 763 | * Semiconductor clone chips lock up if you try writing to the |
765 | * LSR register (which serial_icr_read does) | 764 | * LSR register (which serial_icr_read does) |
766 | */ | 765 | */ |
767 | 766 | ||
768 | /* | 767 | /* |
769 | * Check for Oxford Semiconductor 16C950. | 768 | * Check for Oxford Semiconductor 16C950. |
770 | * | 769 | * |
771 | * EFR [4] must be set else this test fails. | 770 | * EFR [4] must be set else this test fails. |
772 | * | 771 | * |
773 | * This shouldn't be necessary, but Mike Hudson (Exoray@isys.ca) | 772 | * This shouldn't be necessary, but Mike Hudson (Exoray@isys.ca) |
774 | * claims that it's needed for 952 dual UART's (which are not | 773 | * claims that it's needed for 952 dual UART's (which are not |
775 | * recommended for new designs). | 774 | * recommended for new designs). |
776 | */ | 775 | */ |
777 | up->acr = 0; | 776 | up->acr = 0; |
778 | serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B); | 777 | serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B); |
779 | serial_out(up, UART_EFR, UART_EFR_ECB); | 778 | serial_out(up, UART_EFR, UART_EFR_ECB); |
780 | serial_out(up, UART_LCR, 0x00); | 779 | serial_out(up, UART_LCR, 0x00); |
781 | id1 = serial_icr_read(up, UART_ID1); | 780 | id1 = serial_icr_read(up, UART_ID1); |
782 | id2 = serial_icr_read(up, UART_ID2); | 781 | id2 = serial_icr_read(up, UART_ID2); |
783 | id3 = serial_icr_read(up, UART_ID3); | 782 | id3 = serial_icr_read(up, UART_ID3); |
784 | rev = serial_icr_read(up, UART_REV); | 783 | rev = serial_icr_read(up, UART_REV); |
785 | 784 | ||
786 | DEBUG_AUTOCONF("950id=%02x:%02x:%02x:%02x ", id1, id2, id3, rev); | 785 | DEBUG_AUTOCONF("950id=%02x:%02x:%02x:%02x ", id1, id2, id3, rev); |
787 | 786 | ||
788 | if (id1 == 0x16 && id2 == 0xC9 && | 787 | if (id1 == 0x16 && id2 == 0xC9 && |
789 | (id3 == 0x50 || id3 == 0x52 || id3 == 0x54)) { | 788 | (id3 == 0x50 || id3 == 0x52 || id3 == 0x54)) { |
790 | up->port.type = PORT_16C950; | 789 | up->port.type = PORT_16C950; |
791 | 790 | ||
792 | /* | 791 | /* |
793 | * Enable work around for the Oxford Semiconductor 952 rev B | 792 | * Enable work around for the Oxford Semiconductor 952 rev B |
794 | * chip which causes it to seriously miscalculate baud rates | 793 | * chip which causes it to seriously miscalculate baud rates |
795 | * when DLL is 0. | 794 | * when DLL is 0. |
796 | */ | 795 | */ |
797 | if (id3 == 0x52 && rev == 0x01) | 796 | if (id3 == 0x52 && rev == 0x01) |
798 | up->bugs |= UART_BUG_QUOT; | 797 | up->bugs |= UART_BUG_QUOT; |
799 | return; | 798 | return; |
800 | } | 799 | } |
801 | 800 | ||
802 | /* | 801 | /* |
803 | * We check for a XR16C850 by setting DLL and DLM to 0, and then | 802 | * We check for a XR16C850 by setting DLL and DLM to 0, and then |
804 | * reading back DLL and DLM. The chip type depends on the DLM | 803 | * reading back DLL and DLM. The chip type depends on the DLM |
805 | * value read back: | 804 | * value read back: |
806 | * 0x10 - XR16C850 and the DLL contains the chip revision. | 805 | * 0x10 - XR16C850 and the DLL contains the chip revision. |
807 | * 0x12 - XR16C2850. | 806 | * 0x12 - XR16C2850. |
808 | * 0x14 - XR16C854. | 807 | * 0x14 - XR16C854. |
809 | */ | 808 | */ |
810 | id1 = autoconfig_read_divisor_id(up); | 809 | id1 = autoconfig_read_divisor_id(up); |
811 | DEBUG_AUTOCONF("850id=%04x ", id1); | 810 | DEBUG_AUTOCONF("850id=%04x ", id1); |
812 | 811 | ||
813 | id2 = id1 >> 8; | 812 | id2 = id1 >> 8; |
814 | if (id2 == 0x10 || id2 == 0x12 || id2 == 0x14) { | 813 | if (id2 == 0x10 || id2 == 0x12 || id2 == 0x14) { |
815 | up->port.type = PORT_16850; | 814 | up->port.type = PORT_16850; |
816 | return; | 815 | return; |
817 | } | 816 | } |
818 | 817 | ||
819 | /* | 818 | /* |
820 | * It wasn't an XR16C850. | 819 | * It wasn't an XR16C850. |
821 | * | 820 | * |
822 | * We distinguish between the '654 and the '650 by counting | 821 | * We distinguish between the '654 and the '650 by counting |
823 | * how many bytes are in the FIFO. I'm using this for now, | 822 | * how many bytes are in the FIFO. I'm using this for now, |
824 | * since that's the technique that was sent to me in the | 823 | * since that's the technique that was sent to me in the |
825 | * serial driver update, but I'm not convinced this works. | 824 | * serial driver update, but I'm not convinced this works. |
826 | * I've had problems doing this in the past. -TYT | 825 | * I've had problems doing this in the past. -TYT |
827 | */ | 826 | */ |
828 | if (size_fifo(up) == 64) | 827 | if (size_fifo(up) == 64) |
829 | up->port.type = PORT_16654; | 828 | up->port.type = PORT_16654; |
830 | else | 829 | else |
831 | up->port.type = PORT_16650V2; | 830 | up->port.type = PORT_16650V2; |
832 | } | 831 | } |
833 | 832 | ||
834 | /* | 833 | /* |
835 | * We detected a chip without a FIFO. Only two fall into | 834 | * We detected a chip without a FIFO. Only two fall into |
836 | * this category - the original 8250 and the 16450. The | 835 | * this category - the original 8250 and the 16450. The |
837 | * 16450 has a scratch register (accessible with LCR=0) | 836 | * 16450 has a scratch register (accessible with LCR=0) |
838 | */ | 837 | */ |
839 | static void autoconfig_8250(struct uart_8250_port *up) | 838 | static void autoconfig_8250(struct uart_8250_port *up) |
840 | { | 839 | { |
841 | unsigned char scratch, status1, status2; | 840 | unsigned char scratch, status1, status2; |
842 | 841 | ||
843 | up->port.type = PORT_8250; | 842 | up->port.type = PORT_8250; |
844 | 843 | ||
845 | scratch = serial_in(up, UART_SCR); | 844 | scratch = serial_in(up, UART_SCR); |
846 | serial_outp(up, UART_SCR, 0xa5); | 845 | serial_outp(up, UART_SCR, 0xa5); |
847 | status1 = serial_in(up, UART_SCR); | 846 | status1 = serial_in(up, UART_SCR); |
848 | serial_outp(up, UART_SCR, 0x5a); | 847 | serial_outp(up, UART_SCR, 0x5a); |
849 | status2 = serial_in(up, UART_SCR); | 848 | status2 = serial_in(up, UART_SCR); |
850 | serial_outp(up, UART_SCR, scratch); | 849 | serial_outp(up, UART_SCR, scratch); |
851 | 850 | ||
852 | if (status1 == 0xa5 && status2 == 0x5a) | 851 | if (status1 == 0xa5 && status2 == 0x5a) |
853 | up->port.type = PORT_16450; | 852 | up->port.type = PORT_16450; |
854 | } | 853 | } |
855 | 854 | ||
856 | static int broken_efr(struct uart_8250_port *up) | 855 | static int broken_efr(struct uart_8250_port *up) |
857 | { | 856 | { |
858 | /* | 857 | /* |
859 | * Exar ST16C2550 "A2" devices incorrectly detect as | 858 | * Exar ST16C2550 "A2" devices incorrectly detect as |
860 | * having an EFR, and report an ID of 0x0201. See | 859 | * having an EFR, and report an ID of 0x0201. See |
861 | * http://linux.derkeiler.com/Mailing-Lists/Kernel/2004-11/4812.html | 860 | * http://linux.derkeiler.com/Mailing-Lists/Kernel/2004-11/4812.html |
862 | */ | 861 | */ |
863 | if (autoconfig_read_divisor_id(up) == 0x0201 && size_fifo(up) == 16) | 862 | if (autoconfig_read_divisor_id(up) == 0x0201 && size_fifo(up) == 16) |
864 | return 1; | 863 | return 1; |
865 | 864 | ||
866 | return 0; | 865 | return 0; |
867 | } | 866 | } |
868 | 867 | ||
869 | static inline int ns16550a_goto_highspeed(struct uart_8250_port *up) | 868 | static inline int ns16550a_goto_highspeed(struct uart_8250_port *up) |
870 | { | 869 | { |
871 | unsigned char status; | 870 | unsigned char status; |
872 | 871 | ||
873 | status = serial_in(up, 0x04); /* EXCR2 */ | 872 | status = serial_in(up, 0x04); /* EXCR2 */ |
874 | #define PRESL(x) ((x) & 0x30) | 873 | #define PRESL(x) ((x) & 0x30) |
875 | if (PRESL(status) == 0x10) { | 874 | if (PRESL(status) == 0x10) { |
876 | /* already in high speed mode */ | 875 | /* already in high speed mode */ |
877 | return 0; | 876 | return 0; |
878 | } else { | 877 | } else { |
879 | status &= ~0xB0; /* Disable LOCK, mask out PRESL[01] */ | 878 | status &= ~0xB0; /* Disable LOCK, mask out PRESL[01] */ |
880 | status |= 0x10; /* 1.625 divisor for baud_base --> 921600 */ | 879 | status |= 0x10; /* 1.625 divisor for baud_base --> 921600 */ |
881 | serial_outp(up, 0x04, status); | 880 | serial_outp(up, 0x04, status); |
882 | } | 881 | } |
883 | return 1; | 882 | return 1; |
884 | } | 883 | } |
885 | 884 | ||
886 | /* | 885 | /* |
887 | * We know that the chip has FIFOs. Does it have an EFR? The | 886 | * We know that the chip has FIFOs. Does it have an EFR? The |
888 | * EFR is located in the same register position as the IIR and | 887 | * EFR is located in the same register position as the IIR and |
889 | * we know the top two bits of the IIR are currently set. The | 888 | * we know the top two bits of the IIR are currently set. The |
890 | * EFR should contain zero. Try to read the EFR. | 889 | * EFR should contain zero. Try to read the EFR. |
891 | */ | 890 | */ |
892 | static void autoconfig_16550a(struct uart_8250_port *up) | 891 | static void autoconfig_16550a(struct uart_8250_port *up) |
893 | { | 892 | { |
894 | unsigned char status1, status2; | 893 | unsigned char status1, status2; |
895 | unsigned int iersave; | 894 | unsigned int iersave; |
896 | 895 | ||
897 | up->port.type = PORT_16550A; | 896 | up->port.type = PORT_16550A; |
898 | up->capabilities |= UART_CAP_FIFO; | 897 | up->capabilities |= UART_CAP_FIFO; |
899 | 898 | ||
900 | /* | 899 | /* |
901 | * Check for presence of the EFR when DLAB is set. | 900 | * Check for presence of the EFR when DLAB is set. |
902 | * Only ST16C650V1 UARTs pass this test. | 901 | * Only ST16C650V1 UARTs pass this test. |
903 | */ | 902 | */ |
904 | serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_A); | 903 | serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_A); |
905 | if (serial_in(up, UART_EFR) == 0) { | 904 | if (serial_in(up, UART_EFR) == 0) { |
906 | serial_outp(up, UART_EFR, 0xA8); | 905 | serial_outp(up, UART_EFR, 0xA8); |
907 | if (serial_in(up, UART_EFR) != 0) { | 906 | if (serial_in(up, UART_EFR) != 0) { |
908 | DEBUG_AUTOCONF("EFRv1 "); | 907 | DEBUG_AUTOCONF("EFRv1 "); |
909 | up->port.type = PORT_16650; | 908 | up->port.type = PORT_16650; |
910 | up->capabilities |= UART_CAP_EFR | UART_CAP_SLEEP; | 909 | up->capabilities |= UART_CAP_EFR | UART_CAP_SLEEP; |
911 | } else { | 910 | } else { |
912 | DEBUG_AUTOCONF("Motorola 8xxx DUART "); | 911 | DEBUG_AUTOCONF("Motorola 8xxx DUART "); |
913 | } | 912 | } |
914 | serial_outp(up, UART_EFR, 0); | 913 | serial_outp(up, UART_EFR, 0); |
915 | return; | 914 | return; |
916 | } | 915 | } |
917 | 916 | ||
918 | /* | 917 | /* |
919 | * Maybe it requires 0xbf to be written to the LCR. | 918 | * Maybe it requires 0xbf to be written to the LCR. |
920 | * (other ST16C650V2 UARTs, TI16C752A, etc) | 919 | * (other ST16C650V2 UARTs, TI16C752A, etc) |
921 | */ | 920 | */ |
922 | serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_B); | 921 | serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_B); |
923 | if (serial_in(up, UART_EFR) == 0 && !broken_efr(up)) { | 922 | if (serial_in(up, UART_EFR) == 0 && !broken_efr(up)) { |
924 | DEBUG_AUTOCONF("EFRv2 "); | 923 | DEBUG_AUTOCONF("EFRv2 "); |
925 | autoconfig_has_efr(up); | 924 | autoconfig_has_efr(up); |
926 | return; | 925 | return; |
927 | } | 926 | } |
928 | 927 | ||
929 | /* | 928 | /* |
930 | * Check for a National Semiconductor SuperIO chip. | 929 | * Check for a National Semiconductor SuperIO chip. |
931 | * Attempt to switch to bank 2, read the value of the LOOP bit | 930 | * Attempt to switch to bank 2, read the value of the LOOP bit |
932 | * from EXCR1. Switch back to bank 0, change it in MCR. Then | 931 | * from EXCR1. Switch back to bank 0, change it in MCR. Then |
933 | * switch back to bank 2, read it from EXCR1 again and check | 932 | * switch back to bank 2, read it from EXCR1 again and check |
934 | * it's changed. If so, set baud_base in EXCR2 to 921600. -- dwmw2 | 933 | * it's changed. If so, set baud_base in EXCR2 to 921600. -- dwmw2 |
935 | */ | 934 | */ |
936 | serial_outp(up, UART_LCR, 0); | 935 | serial_outp(up, UART_LCR, 0); |
937 | status1 = serial_in(up, UART_MCR); | 936 | status1 = serial_in(up, UART_MCR); |
938 | serial_outp(up, UART_LCR, 0xE0); | 937 | serial_outp(up, UART_LCR, 0xE0); |
939 | status2 = serial_in(up, 0x02); /* EXCR1 */ | 938 | status2 = serial_in(up, 0x02); /* EXCR1 */ |
940 | 939 | ||
941 | if (!((status2 ^ status1) & UART_MCR_LOOP)) { | 940 | if (!((status2 ^ status1) & UART_MCR_LOOP)) { |
942 | serial_outp(up, UART_LCR, 0); | 941 | serial_outp(up, UART_LCR, 0); |
943 | serial_outp(up, UART_MCR, status1 ^ UART_MCR_LOOP); | 942 | serial_outp(up, UART_MCR, status1 ^ UART_MCR_LOOP); |
944 | serial_outp(up, UART_LCR, 0xE0); | 943 | serial_outp(up, UART_LCR, 0xE0); |
945 | status2 = serial_in(up, 0x02); /* EXCR1 */ | 944 | status2 = serial_in(up, 0x02); /* EXCR1 */ |
946 | serial_outp(up, UART_LCR, 0); | 945 | serial_outp(up, UART_LCR, 0); |
947 | serial_outp(up, UART_MCR, status1); | 946 | serial_outp(up, UART_MCR, status1); |
948 | 947 | ||
949 | if ((status2 ^ status1) & UART_MCR_LOOP) { | 948 | if ((status2 ^ status1) & UART_MCR_LOOP) { |
950 | unsigned short quot; | 949 | unsigned short quot; |
951 | 950 | ||
952 | serial_outp(up, UART_LCR, 0xE0); | 951 | serial_outp(up, UART_LCR, 0xE0); |
953 | 952 | ||
954 | quot = serial_dl_read(up); | 953 | quot = serial_dl_read(up); |
955 | quot <<= 3; | 954 | quot <<= 3; |
956 | 955 | ||
957 | if (ns16550a_goto_highspeed(up)) | 956 | if (ns16550a_goto_highspeed(up)) |
958 | serial_dl_write(up, quot); | 957 | serial_dl_write(up, quot); |
959 | 958 | ||
960 | serial_outp(up, UART_LCR, 0); | 959 | serial_outp(up, UART_LCR, 0); |
961 | 960 | ||
962 | up->port.uartclk = 921600*16; | 961 | up->port.uartclk = 921600*16; |
963 | up->port.type = PORT_NS16550A; | 962 | up->port.type = PORT_NS16550A; |
964 | up->capabilities |= UART_NATSEMI; | 963 | up->capabilities |= UART_NATSEMI; |
965 | return; | 964 | return; |
966 | } | 965 | } |
967 | } | 966 | } |
968 | 967 | ||
969 | /* | 968 | /* |
970 | * No EFR. Try to detect a TI16750, which only sets bit 5 of | 969 | * No EFR. Try to detect a TI16750, which only sets bit 5 of |
971 | * the IIR when 64 byte FIFO mode is enabled when DLAB is set. | 970 | * the IIR when 64 byte FIFO mode is enabled when DLAB is set. |
972 | * Try setting it with and without DLAB set. Cheap clones | 971 | * Try setting it with and without DLAB set. Cheap clones |
973 | * set bit 5 without DLAB set. | 972 | * set bit 5 without DLAB set. |
974 | */ | 973 | */ |
975 | serial_outp(up, UART_LCR, 0); | 974 | serial_outp(up, UART_LCR, 0); |
976 | serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO | UART_FCR7_64BYTE); | 975 | serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO | UART_FCR7_64BYTE); |
977 | status1 = serial_in(up, UART_IIR) >> 5; | 976 | status1 = serial_in(up, UART_IIR) >> 5; |
978 | serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO); | 977 | serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO); |
979 | serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_A); | 978 | serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_A); |
980 | serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO | UART_FCR7_64BYTE); | 979 | serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO | UART_FCR7_64BYTE); |
981 | status2 = serial_in(up, UART_IIR) >> 5; | 980 | status2 = serial_in(up, UART_IIR) >> 5; |
982 | serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO); | 981 | serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO); |
983 | serial_outp(up, UART_LCR, 0); | 982 | serial_outp(up, UART_LCR, 0); |
984 | 983 | ||
985 | DEBUG_AUTOCONF("iir1=%d iir2=%d ", status1, status2); | 984 | DEBUG_AUTOCONF("iir1=%d iir2=%d ", status1, status2); |
986 | 985 | ||
987 | if (status1 == 6 && status2 == 7) { | 986 | if (status1 == 6 && status2 == 7) { |
988 | up->port.type = PORT_16750; | 987 | up->port.type = PORT_16750; |
989 | up->capabilities |= UART_CAP_AFE | UART_CAP_SLEEP; | 988 | up->capabilities |= UART_CAP_AFE | UART_CAP_SLEEP; |
990 | return; | 989 | return; |
991 | } | 990 | } |
992 | 991 | ||
993 | /* | 992 | /* |
994 | * Try writing and reading the UART_IER_UUE bit (b6). | 993 | * Try writing and reading the UART_IER_UUE bit (b6). |
995 | * If it works, this is probably one of the Xscale platform's | 994 | * If it works, this is probably one of the Xscale platform's |
996 | * internal UARTs. | 995 | * internal UARTs. |
997 | * We're going to explicitly set the UUE bit to 0 before | 996 | * We're going to explicitly set the UUE bit to 0 before |
998 | * trying to write and read a 1 just to make sure it's not | 997 | * trying to write and read a 1 just to make sure it's not |
999 | * already a 1 and maybe locked there before we even start start. | 998 | * already a 1 and maybe locked there before we even start start. |
1000 | */ | 999 | */ |
1001 | iersave = serial_in(up, UART_IER); | 1000 | iersave = serial_in(up, UART_IER); |
1002 | serial_outp(up, UART_IER, iersave & ~UART_IER_UUE); | 1001 | serial_outp(up, UART_IER, iersave & ~UART_IER_UUE); |
1003 | if (!(serial_in(up, UART_IER) & UART_IER_UUE)) { | 1002 | if (!(serial_in(up, UART_IER) & UART_IER_UUE)) { |
1004 | /* | 1003 | /* |
1005 | * OK it's in a known zero state, try writing and reading | 1004 | * OK it's in a known zero state, try writing and reading |
1006 | * without disturbing the current state of the other bits. | 1005 | * without disturbing the current state of the other bits. |
1007 | */ | 1006 | */ |
1008 | serial_outp(up, UART_IER, iersave | UART_IER_UUE); | 1007 | serial_outp(up, UART_IER, iersave | UART_IER_UUE); |
1009 | if (serial_in(up, UART_IER) & UART_IER_UUE) { | 1008 | if (serial_in(up, UART_IER) & UART_IER_UUE) { |
1010 | /* | 1009 | /* |
1011 | * It's an Xscale. | 1010 | * It's an Xscale. |
1012 | * We'll leave the UART_IER_UUE bit set to 1 (enabled). | 1011 | * We'll leave the UART_IER_UUE bit set to 1 (enabled). |
1013 | */ | 1012 | */ |
1014 | DEBUG_AUTOCONF("Xscale "); | 1013 | DEBUG_AUTOCONF("Xscale "); |
1015 | up->port.type = PORT_XSCALE; | 1014 | up->port.type = PORT_XSCALE; |
1016 | up->capabilities |= UART_CAP_UUE | UART_CAP_RTOIE; | 1015 | up->capabilities |= UART_CAP_UUE | UART_CAP_RTOIE; |
1017 | return; | 1016 | return; |
1018 | } | 1017 | } |
1019 | } else { | 1018 | } else { |
1020 | /* | 1019 | /* |
1021 | * If we got here we couldn't force the IER_UUE bit to 0. | 1020 | * If we got here we couldn't force the IER_UUE bit to 0. |
1022 | * Log it and continue. | 1021 | * Log it and continue. |
1023 | */ | 1022 | */ |
1024 | DEBUG_AUTOCONF("Couldn't force IER_UUE to 0 "); | 1023 | DEBUG_AUTOCONF("Couldn't force IER_UUE to 0 "); |
1025 | } | 1024 | } |
1026 | serial_outp(up, UART_IER, iersave); | 1025 | serial_outp(up, UART_IER, iersave); |
1027 | 1026 | ||
1028 | /* | 1027 | /* |
1029 | * Exar uarts have EFR in a weird location | 1028 | * Exar uarts have EFR in a weird location |
1030 | */ | 1029 | */ |
1031 | if (up->port.flags & UPF_EXAR_EFR) { | 1030 | if (up->port.flags & UPF_EXAR_EFR) { |
1032 | up->port.type = PORT_XR17D15X; | 1031 | up->port.type = PORT_XR17D15X; |
1033 | up->capabilities |= UART_CAP_AFE | UART_CAP_EFR; | 1032 | up->capabilities |= UART_CAP_AFE | UART_CAP_EFR; |
1034 | } | 1033 | } |
1035 | 1034 | ||
1036 | /* | 1035 | /* |
1037 | * We distinguish between 16550A and U6 16550A by counting | 1036 | * We distinguish between 16550A and U6 16550A by counting |
1038 | * how many bytes are in the FIFO. | 1037 | * how many bytes are in the FIFO. |
1039 | */ | 1038 | */ |
1040 | if (up->port.type == PORT_16550A && size_fifo(up) == 64) { | 1039 | if (up->port.type == PORT_16550A && size_fifo(up) == 64) { |
1041 | up->port.type = PORT_U6_16550A; | 1040 | up->port.type = PORT_U6_16550A; |
1042 | up->capabilities |= UART_CAP_AFE; | 1041 | up->capabilities |= UART_CAP_AFE; |
1043 | } | 1042 | } |
1044 | } | 1043 | } |
1045 | 1044 | ||
1046 | /* | 1045 | /* |
1047 | * This routine is called by rs_init() to initialize a specific serial | 1046 | * This routine is called by rs_init() to initialize a specific serial |
1048 | * port. It determines what type of UART chip this serial port is | 1047 | * port. It determines what type of UART chip this serial port is |
1049 | * using: 8250, 16450, 16550, 16550A. The important question is | 1048 | * using: 8250, 16450, 16550, 16550A. The important question is |
1050 | * whether or not this UART is a 16550A or not, since this will | 1049 | * whether or not this UART is a 16550A or not, since this will |
1051 | * determine whether or not we can use its FIFO features or not. | 1050 | * determine whether or not we can use its FIFO features or not. |
1052 | */ | 1051 | */ |
1053 | static void autoconfig(struct uart_8250_port *up, unsigned int probeflags) | 1052 | static void autoconfig(struct uart_8250_port *up, unsigned int probeflags) |
1054 | { | 1053 | { |
1055 | unsigned char status1, scratch, scratch2, scratch3; | 1054 | unsigned char status1, scratch, scratch2, scratch3; |
1056 | unsigned char save_lcr, save_mcr; | 1055 | unsigned char save_lcr, save_mcr; |
1057 | unsigned long flags; | 1056 | unsigned long flags; |
1058 | 1057 | ||
1059 | if (!up->port.iobase && !up->port.mapbase && !up->port.membase) | 1058 | if (!up->port.iobase && !up->port.mapbase && !up->port.membase) |
1060 | return; | 1059 | return; |
1061 | 1060 | ||
1062 | DEBUG_AUTOCONF("ttyS%d: autoconf (0x%04lx, 0x%p): ", | 1061 | DEBUG_AUTOCONF("ttyS%d: autoconf (0x%04lx, 0x%p): ", |
1063 | serial_index(&up->port), up->port.iobase, up->port.membase); | 1062 | serial_index(&up->port), up->port.iobase, up->port.membase); |
1064 | 1063 | ||
1065 | /* | 1064 | /* |
1066 | * We really do need global IRQs disabled here - we're going to | 1065 | * We really do need global IRQs disabled here - we're going to |
1067 | * be frobbing the chips IRQ enable register to see if it exists. | 1066 | * be frobbing the chips IRQ enable register to see if it exists. |
1068 | */ | 1067 | */ |
1069 | spin_lock_irqsave(&up->port.lock, flags); | 1068 | spin_lock_irqsave(&up->port.lock, flags); |
1070 | 1069 | ||
1071 | up->capabilities = 0; | 1070 | up->capabilities = 0; |
1072 | up->bugs = 0; | 1071 | up->bugs = 0; |
1073 | 1072 | ||
1074 | if (!(up->port.flags & UPF_BUGGY_UART)) { | 1073 | if (!(up->port.flags & UPF_BUGGY_UART)) { |
1075 | /* | 1074 | /* |
1076 | * Do a simple existence test first; if we fail this, | 1075 | * Do a simple existence test first; if we fail this, |
1077 | * there's no point trying anything else. | 1076 | * there's no point trying anything else. |
1078 | * | 1077 | * |
1079 | * 0x80 is used as a nonsense port to prevent against | 1078 | * 0x80 is used as a nonsense port to prevent against |
1080 | * false positives due to ISA bus float. The | 1079 | * false positives due to ISA bus float. The |
1081 | * assumption is that 0x80 is a non-existent port; | 1080 | * assumption is that 0x80 is a non-existent port; |
1082 | * which should be safe since include/asm/io.h also | 1081 | * which should be safe since include/asm/io.h also |
1083 | * makes this assumption. | 1082 | * makes this assumption. |
1084 | * | 1083 | * |
1085 | * Note: this is safe as long as MCR bit 4 is clear | 1084 | * Note: this is safe as long as MCR bit 4 is clear |
1086 | * and the device is in "PC" mode. | 1085 | * and the device is in "PC" mode. |
1087 | */ | 1086 | */ |
1088 | scratch = serial_inp(up, UART_IER); | 1087 | scratch = serial_inp(up, UART_IER); |
1089 | serial_outp(up, UART_IER, 0); | 1088 | serial_outp(up, UART_IER, 0); |
1090 | #ifdef __i386__ | 1089 | #ifdef __i386__ |
1091 | outb(0xff, 0x080); | 1090 | outb(0xff, 0x080); |
1092 | #endif | 1091 | #endif |
1093 | /* | 1092 | /* |
1094 | * Mask out IER[7:4] bits for test as some UARTs (e.g. TL | 1093 | * Mask out IER[7:4] bits for test as some UARTs (e.g. TL |
1095 | * 16C754B) allow only to modify them if an EFR bit is set. | 1094 | * 16C754B) allow only to modify them if an EFR bit is set. |
1096 | */ | 1095 | */ |
1097 | scratch2 = serial_inp(up, UART_IER) & 0x0f; | 1096 | scratch2 = serial_inp(up, UART_IER) & 0x0f; |
1098 | serial_outp(up, UART_IER, 0x0F); | 1097 | serial_outp(up, UART_IER, 0x0F); |
1099 | #ifdef __i386__ | 1098 | #ifdef __i386__ |
1100 | outb(0, 0x080); | 1099 | outb(0, 0x080); |
1101 | #endif | 1100 | #endif |
1102 | scratch3 = serial_inp(up, UART_IER) & 0x0f; | 1101 | scratch3 = serial_inp(up, UART_IER) & 0x0f; |
1103 | serial_outp(up, UART_IER, scratch); | 1102 | serial_outp(up, UART_IER, scratch); |
1104 | if (scratch2 != 0 || scratch3 != 0x0F) { | 1103 | if (scratch2 != 0 || scratch3 != 0x0F) { |
1105 | /* | 1104 | /* |
1106 | * We failed; there's nothing here | 1105 | * We failed; there's nothing here |
1107 | */ | 1106 | */ |
1108 | DEBUG_AUTOCONF("IER test failed (%02x, %02x) ", | 1107 | DEBUG_AUTOCONF("IER test failed (%02x, %02x) ", |
1109 | scratch2, scratch3); | 1108 | scratch2, scratch3); |
1110 | goto out; | 1109 | goto out; |
1111 | } | 1110 | } |
1112 | } | 1111 | } |
1113 | 1112 | ||
1114 | save_mcr = serial_in(up, UART_MCR); | 1113 | save_mcr = serial_in(up, UART_MCR); |
1115 | save_lcr = serial_in(up, UART_LCR); | 1114 | save_lcr = serial_in(up, UART_LCR); |
1116 | 1115 | ||
1117 | /* | 1116 | /* |
1118 | * Check to see if a UART is really there. Certain broken | 1117 | * Check to see if a UART is really there. Certain broken |
1119 | * internal modems based on the Rockwell chipset fail this | 1118 | * internal modems based on the Rockwell chipset fail this |
1120 | * test, because they apparently don't implement the loopback | 1119 | * test, because they apparently don't implement the loopback |
1121 | * test mode. So this test is skipped on the COM 1 through | 1120 | * test mode. So this test is skipped on the COM 1 through |
1122 | * COM 4 ports. This *should* be safe, since no board | 1121 | * COM 4 ports. This *should* be safe, since no board |
1123 | * manufacturer would be stupid enough to design a board | 1122 | * manufacturer would be stupid enough to design a board |
1124 | * that conflicts with COM 1-4 --- we hope! | 1123 | * that conflicts with COM 1-4 --- we hope! |
1125 | */ | 1124 | */ |
1126 | if (!(up->port.flags & UPF_SKIP_TEST)) { | 1125 | if (!(up->port.flags & UPF_SKIP_TEST)) { |
1127 | serial_outp(up, UART_MCR, UART_MCR_LOOP | 0x0A); | 1126 | serial_outp(up, UART_MCR, UART_MCR_LOOP | 0x0A); |
1128 | status1 = serial_inp(up, UART_MSR) & 0xF0; | 1127 | status1 = serial_inp(up, UART_MSR) & 0xF0; |
1129 | serial_outp(up, UART_MCR, save_mcr); | 1128 | serial_outp(up, UART_MCR, save_mcr); |
1130 | if (status1 != 0x90) { | 1129 | if (status1 != 0x90) { |
1131 | DEBUG_AUTOCONF("LOOP test failed (%02x) ", | 1130 | DEBUG_AUTOCONF("LOOP test failed (%02x) ", |
1132 | status1); | 1131 | status1); |
1133 | goto out; | 1132 | goto out; |
1134 | } | 1133 | } |
1135 | } | 1134 | } |
1136 | 1135 | ||
1137 | /* | 1136 | /* |
1138 | * We're pretty sure there's a port here. Lets find out what | 1137 | * We're pretty sure there's a port here. Lets find out what |
1139 | * type of port it is. The IIR top two bits allows us to find | 1138 | * type of port it is. The IIR top two bits allows us to find |
1140 | * out if it's 8250 or 16450, 16550, 16550A or later. This | 1139 | * out if it's 8250 or 16450, 16550, 16550A or later. This |
1141 | * determines what we test for next. | 1140 | * determines what we test for next. |
1142 | * | 1141 | * |
1143 | * We also initialise the EFR (if any) to zero for later. The | 1142 | * We also initialise the EFR (if any) to zero for later. The |
1144 | * EFR occupies the same register location as the FCR and IIR. | 1143 | * EFR occupies the same register location as the FCR and IIR. |
1145 | */ | 1144 | */ |
1146 | serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_B); | 1145 | serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_B); |
1147 | serial_outp(up, UART_EFR, 0); | 1146 | serial_outp(up, UART_EFR, 0); |
1148 | serial_outp(up, UART_LCR, 0); | 1147 | serial_outp(up, UART_LCR, 0); |
1149 | 1148 | ||
1150 | serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO); | 1149 | serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO); |
1151 | scratch = serial_in(up, UART_IIR) >> 6; | 1150 | scratch = serial_in(up, UART_IIR) >> 6; |
1152 | 1151 | ||
1153 | DEBUG_AUTOCONF("iir=%d ", scratch); | 1152 | DEBUG_AUTOCONF("iir=%d ", scratch); |
1154 | 1153 | ||
1155 | switch (scratch) { | 1154 | switch (scratch) { |
1156 | case 0: | 1155 | case 0: |
1157 | autoconfig_8250(up); | 1156 | autoconfig_8250(up); |
1158 | break; | 1157 | break; |
1159 | case 1: | 1158 | case 1: |
1160 | up->port.type = PORT_UNKNOWN; | 1159 | up->port.type = PORT_UNKNOWN; |
1161 | break; | 1160 | break; |
1162 | case 2: | 1161 | case 2: |
1163 | up->port.type = PORT_16550; | 1162 | up->port.type = PORT_16550; |
1164 | break; | 1163 | break; |
1165 | case 3: | 1164 | case 3: |
1166 | autoconfig_16550a(up); | 1165 | autoconfig_16550a(up); |
1167 | break; | 1166 | break; |
1168 | } | 1167 | } |
1169 | 1168 | ||
1170 | #ifdef CONFIG_SERIAL_8250_RSA | 1169 | #ifdef CONFIG_SERIAL_8250_RSA |
1171 | /* | 1170 | /* |
1172 | * Only probe for RSA ports if we got the region. | 1171 | * Only probe for RSA ports if we got the region. |
1173 | */ | 1172 | */ |
1174 | if (up->port.type == PORT_16550A && probeflags & PROBE_RSA) { | 1173 | if (up->port.type == PORT_16550A && probeflags & PROBE_RSA) { |
1175 | int i; | 1174 | int i; |
1176 | 1175 | ||
1177 | for (i = 0 ; i < probe_rsa_count; ++i) { | 1176 | for (i = 0 ; i < probe_rsa_count; ++i) { |
1178 | if (probe_rsa[i] == up->port.iobase && | 1177 | if (probe_rsa[i] == up->port.iobase && |
1179 | __enable_rsa(up)) { | 1178 | __enable_rsa(up)) { |
1180 | up->port.type = PORT_RSA; | 1179 | up->port.type = PORT_RSA; |
1181 | break; | 1180 | break; |
1182 | } | 1181 | } |
1183 | } | 1182 | } |
1184 | } | 1183 | } |
1185 | #endif | 1184 | #endif |
1186 | 1185 | ||
1187 | serial_outp(up, UART_LCR, save_lcr); | 1186 | serial_outp(up, UART_LCR, save_lcr); |
1188 | 1187 | ||
1189 | if (up->capabilities != uart_config[up->port.type].flags) { | 1188 | if (up->capabilities != uart_config[up->port.type].flags) { |
1190 | printk(KERN_WARNING | 1189 | printk(KERN_WARNING |
1191 | "ttyS%d: detected caps %08x should be %08x\n", | 1190 | "ttyS%d: detected caps %08x should be %08x\n", |
1192 | serial_index(&up->port), up->capabilities, | 1191 | serial_index(&up->port), up->capabilities, |
1193 | uart_config[up->port.type].flags); | 1192 | uart_config[up->port.type].flags); |
1194 | } | 1193 | } |
1195 | 1194 | ||
1196 | up->port.fifosize = uart_config[up->port.type].fifo_size; | 1195 | up->port.fifosize = uart_config[up->port.type].fifo_size; |
1197 | up->capabilities = uart_config[up->port.type].flags; | 1196 | up->capabilities = uart_config[up->port.type].flags; |
1198 | up->tx_loadsz = uart_config[up->port.type].tx_loadsz; | 1197 | up->tx_loadsz = uart_config[up->port.type].tx_loadsz; |
1199 | 1198 | ||
1200 | if (up->port.type == PORT_UNKNOWN) | 1199 | if (up->port.type == PORT_UNKNOWN) |
1201 | goto out; | 1200 | goto out; |
1202 | 1201 | ||
1203 | /* | 1202 | /* |
1204 | * Reset the UART. | 1203 | * Reset the UART. |
1205 | */ | 1204 | */ |
1206 | #ifdef CONFIG_SERIAL_8250_RSA | 1205 | #ifdef CONFIG_SERIAL_8250_RSA |
1207 | if (up->port.type == PORT_RSA) | 1206 | if (up->port.type == PORT_RSA) |
1208 | serial_outp(up, UART_RSA_FRR, 0); | 1207 | serial_outp(up, UART_RSA_FRR, 0); |
1209 | #endif | 1208 | #endif |
1210 | serial_outp(up, UART_MCR, save_mcr); | 1209 | serial_outp(up, UART_MCR, save_mcr); |
1211 | serial8250_clear_fifos(up); | 1210 | serial8250_clear_fifos(up); |
1212 | serial_in(up, UART_RX); | 1211 | serial_in(up, UART_RX); |
1213 | if (up->capabilities & UART_CAP_UUE) | 1212 | if (up->capabilities & UART_CAP_UUE) |
1214 | serial_outp(up, UART_IER, UART_IER_UUE); | 1213 | serial_outp(up, UART_IER, UART_IER_UUE); |
1215 | else | 1214 | else |
1216 | serial_outp(up, UART_IER, 0); | 1215 | serial_outp(up, UART_IER, 0); |
1217 | 1216 | ||
1218 | out: | 1217 | out: |
1219 | spin_unlock_irqrestore(&up->port.lock, flags); | 1218 | spin_unlock_irqrestore(&up->port.lock, flags); |
1220 | DEBUG_AUTOCONF("type=%s\n", uart_config[up->port.type].name); | 1219 | DEBUG_AUTOCONF("type=%s\n", uart_config[up->port.type].name); |
1221 | } | 1220 | } |
1222 | 1221 | ||
1223 | static void autoconfig_irq(struct uart_8250_port *up) | 1222 | static void autoconfig_irq(struct uart_8250_port *up) |
1224 | { | 1223 | { |
1225 | unsigned char save_mcr, save_ier; | 1224 | unsigned char save_mcr, save_ier; |
1226 | unsigned char save_ICP = 0; | 1225 | unsigned char save_ICP = 0; |
1227 | unsigned int ICP = 0; | 1226 | unsigned int ICP = 0; |
1228 | unsigned long irqs; | 1227 | unsigned long irqs; |
1229 | int irq; | 1228 | int irq; |
1230 | 1229 | ||
1231 | if (up->port.flags & UPF_FOURPORT) { | 1230 | if (up->port.flags & UPF_FOURPORT) { |
1232 | ICP = (up->port.iobase & 0xfe0) | 0x1f; | 1231 | ICP = (up->port.iobase & 0xfe0) | 0x1f; |
1233 | save_ICP = inb_p(ICP); | 1232 | save_ICP = inb_p(ICP); |
1234 | outb_p(0x80, ICP); | 1233 | outb_p(0x80, ICP); |
1235 | (void) inb_p(ICP); | 1234 | (void) inb_p(ICP); |
1236 | } | 1235 | } |
1237 | 1236 | ||
1238 | /* forget possible initially masked and pending IRQ */ | 1237 | /* forget possible initially masked and pending IRQ */ |
1239 | probe_irq_off(probe_irq_on()); | 1238 | probe_irq_off(probe_irq_on()); |
1240 | save_mcr = serial_inp(up, UART_MCR); | 1239 | save_mcr = serial_inp(up, UART_MCR); |
1241 | save_ier = serial_inp(up, UART_IER); | 1240 | save_ier = serial_inp(up, UART_IER); |
1242 | serial_outp(up, UART_MCR, UART_MCR_OUT1 | UART_MCR_OUT2); | 1241 | serial_outp(up, UART_MCR, UART_MCR_OUT1 | UART_MCR_OUT2); |
1243 | 1242 | ||
1244 | irqs = probe_irq_on(); | 1243 | irqs = probe_irq_on(); |
1245 | serial_outp(up, UART_MCR, 0); | 1244 | serial_outp(up, UART_MCR, 0); |
1246 | udelay(10); | 1245 | udelay(10); |
1247 | if (up->port.flags & UPF_FOURPORT) { | 1246 | if (up->port.flags & UPF_FOURPORT) { |
1248 | serial_outp(up, UART_MCR, | 1247 | serial_outp(up, UART_MCR, |
1249 | UART_MCR_DTR | UART_MCR_RTS); | 1248 | UART_MCR_DTR | UART_MCR_RTS); |
1250 | } else { | 1249 | } else { |
1251 | serial_outp(up, UART_MCR, | 1250 | serial_outp(up, UART_MCR, |
1252 | UART_MCR_DTR | UART_MCR_RTS | UART_MCR_OUT2); | 1251 | UART_MCR_DTR | UART_MCR_RTS | UART_MCR_OUT2); |
1253 | } | 1252 | } |
1254 | serial_outp(up, UART_IER, 0x0f); /* enable all intrs */ | 1253 | serial_outp(up, UART_IER, 0x0f); /* enable all intrs */ |
1255 | (void)serial_inp(up, UART_LSR); | 1254 | (void)serial_inp(up, UART_LSR); |
1256 | (void)serial_inp(up, UART_RX); | 1255 | (void)serial_inp(up, UART_RX); |
1257 | (void)serial_inp(up, UART_IIR); | 1256 | (void)serial_inp(up, UART_IIR); |
1258 | (void)serial_inp(up, UART_MSR); | 1257 | (void)serial_inp(up, UART_MSR); |
1259 | serial_outp(up, UART_TX, 0xFF); | 1258 | serial_outp(up, UART_TX, 0xFF); |
1260 | udelay(20); | 1259 | udelay(20); |
1261 | irq = probe_irq_off(irqs); | 1260 | irq = probe_irq_off(irqs); |
1262 | 1261 | ||
1263 | serial_outp(up, UART_MCR, save_mcr); | 1262 | serial_outp(up, UART_MCR, save_mcr); |
1264 | serial_outp(up, UART_IER, save_ier); | 1263 | serial_outp(up, UART_IER, save_ier); |
1265 | 1264 | ||
1266 | if (up->port.flags & UPF_FOURPORT) | 1265 | if (up->port.flags & UPF_FOURPORT) |
1267 | outb_p(save_ICP, ICP); | 1266 | outb_p(save_ICP, ICP); |
1268 | 1267 | ||
1269 | up->port.irq = (irq > 0) ? irq : 0; | 1268 | up->port.irq = (irq > 0) ? irq : 0; |
1270 | } | 1269 | } |
1271 | 1270 | ||
1272 | static inline void __stop_tx(struct uart_8250_port *p) | 1271 | static inline void __stop_tx(struct uart_8250_port *p) |
1273 | { | 1272 | { |
1274 | if (p->ier & UART_IER_THRI) { | 1273 | if (p->ier & UART_IER_THRI) { |
1275 | p->ier &= ~UART_IER_THRI; | 1274 | p->ier &= ~UART_IER_THRI; |
1276 | serial_out(p, UART_IER, p->ier); | 1275 | serial_out(p, UART_IER, p->ier); |
1277 | } | 1276 | } |
1278 | } | 1277 | } |
1279 | 1278 | ||
1280 | static void serial8250_stop_tx(struct uart_port *port) | 1279 | static void serial8250_stop_tx(struct uart_port *port) |
1281 | { | 1280 | { |
1282 | struct uart_8250_port *up = | 1281 | struct uart_8250_port *up = |
1283 | container_of(port, struct uart_8250_port, port); | 1282 | container_of(port, struct uart_8250_port, port); |
1284 | 1283 | ||
1285 | __stop_tx(up); | 1284 | __stop_tx(up); |
1286 | 1285 | ||
1287 | /* | 1286 | /* |
1288 | * We really want to stop the transmitter from sending. | 1287 | * We really want to stop the transmitter from sending. |
1289 | */ | 1288 | */ |
1290 | if (up->port.type == PORT_16C950) { | 1289 | if (up->port.type == PORT_16C950) { |
1291 | up->acr |= UART_ACR_TXDIS; | 1290 | up->acr |= UART_ACR_TXDIS; |
1292 | serial_icr_write(up, UART_ACR, up->acr); | 1291 | serial_icr_write(up, UART_ACR, up->acr); |
1293 | } | 1292 | } |
1294 | } | 1293 | } |
1295 | 1294 | ||
1296 | static void serial8250_start_tx(struct uart_port *port) | 1295 | static void serial8250_start_tx(struct uart_port *port) |
1297 | { | 1296 | { |
1298 | struct uart_8250_port *up = | 1297 | struct uart_8250_port *up = |
1299 | container_of(port, struct uart_8250_port, port); | 1298 | container_of(port, struct uart_8250_port, port); |
1300 | 1299 | ||
1301 | if (!(up->ier & UART_IER_THRI)) { | 1300 | if (!(up->ier & UART_IER_THRI)) { |
1302 | up->ier |= UART_IER_THRI; | 1301 | up->ier |= UART_IER_THRI; |
1303 | serial_out(up, UART_IER, up->ier); | 1302 | serial_out(up, UART_IER, up->ier); |
1304 | 1303 | ||
1305 | if (up->bugs & UART_BUG_TXEN) { | 1304 | if (up->bugs & UART_BUG_TXEN) { |
1306 | unsigned char lsr; | 1305 | unsigned char lsr; |
1307 | lsr = serial_in(up, UART_LSR); | 1306 | lsr = serial_in(up, UART_LSR); |
1308 | up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS; | 1307 | up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS; |
1309 | if ((up->port.type == PORT_RM9000) ? | 1308 | if ((up->port.type == PORT_RM9000) ? |
1310 | (lsr & UART_LSR_THRE) : | 1309 | (lsr & UART_LSR_THRE) : |
1311 | (lsr & UART_LSR_TEMT)) | 1310 | (lsr & UART_LSR_TEMT)) |
1312 | serial8250_tx_chars(up); | 1311 | serial8250_tx_chars(up); |
1313 | } | 1312 | } |
1314 | } | 1313 | } |
1315 | 1314 | ||
1316 | /* | 1315 | /* |
1317 | * Re-enable the transmitter if we disabled it. | 1316 | * Re-enable the transmitter if we disabled it. |
1318 | */ | 1317 | */ |
1319 | if (up->port.type == PORT_16C950 && up->acr & UART_ACR_TXDIS) { | 1318 | if (up->port.type == PORT_16C950 && up->acr & UART_ACR_TXDIS) { |
1320 | up->acr &= ~UART_ACR_TXDIS; | 1319 | up->acr &= ~UART_ACR_TXDIS; |
1321 | serial_icr_write(up, UART_ACR, up->acr); | 1320 | serial_icr_write(up, UART_ACR, up->acr); |
1322 | } | 1321 | } |
1323 | } | 1322 | } |
1324 | 1323 | ||
1325 | static void serial8250_stop_rx(struct uart_port *port) | 1324 | static void serial8250_stop_rx(struct uart_port *port) |
1326 | { | 1325 | { |
1327 | struct uart_8250_port *up = | 1326 | struct uart_8250_port *up = |
1328 | container_of(port, struct uart_8250_port, port); | 1327 | container_of(port, struct uart_8250_port, port); |
1329 | 1328 | ||
1330 | up->ier &= ~UART_IER_RLSI; | 1329 | up->ier &= ~UART_IER_RLSI; |
1331 | up->port.read_status_mask &= ~UART_LSR_DR; | 1330 | up->port.read_status_mask &= ~UART_LSR_DR; |
1332 | serial_out(up, UART_IER, up->ier); | 1331 | serial_out(up, UART_IER, up->ier); |
1333 | } | 1332 | } |
1334 | 1333 | ||
1335 | static void serial8250_enable_ms(struct uart_port *port) | 1334 | static void serial8250_enable_ms(struct uart_port *port) |
1336 | { | 1335 | { |
1337 | struct uart_8250_port *up = | 1336 | struct uart_8250_port *up = |
1338 | container_of(port, struct uart_8250_port, port); | 1337 | container_of(port, struct uart_8250_port, port); |
1339 | 1338 | ||
1340 | /* no MSR capabilities */ | 1339 | /* no MSR capabilities */ |
1341 | if (up->bugs & UART_BUG_NOMSR) | 1340 | if (up->bugs & UART_BUG_NOMSR) |
1342 | return; | 1341 | return; |
1343 | 1342 | ||
1344 | up->ier |= UART_IER_MSI; | 1343 | up->ier |= UART_IER_MSI; |
1345 | serial_out(up, UART_IER, up->ier); | 1344 | serial_out(up, UART_IER, up->ier); |
1346 | } | 1345 | } |
1347 | 1346 | ||
1348 | /* | 1347 | /* |
1349 | * Clear the Tegra rx fifo after a break | 1348 | * Clear the Tegra rx fifo after a break |
1350 | * | 1349 | * |
1351 | * FIXME: This needs to become a port specific callback once we have a | 1350 | * FIXME: This needs to become a port specific callback once we have a |
1352 | * framework for this | 1351 | * framework for this |
1353 | */ | 1352 | */ |
1354 | static void clear_rx_fifo(struct uart_8250_port *up) | 1353 | static void clear_rx_fifo(struct uart_8250_port *up) |
1355 | { | 1354 | { |
1356 | unsigned int status, tmout = 10000; | 1355 | unsigned int status, tmout = 10000; |
1357 | do { | 1356 | do { |
1358 | status = serial_in(up, UART_LSR); | 1357 | status = serial_in(up, UART_LSR); |
1359 | if (status & (UART_LSR_FIFOE | UART_LSR_BRK_ERROR_BITS)) | 1358 | if (status & (UART_LSR_FIFOE | UART_LSR_BRK_ERROR_BITS)) |
1360 | status = serial_in(up, UART_RX); | 1359 | status = serial_in(up, UART_RX); |
1361 | else | 1360 | else |
1362 | break; | 1361 | break; |
1363 | if (--tmout == 0) | 1362 | if (--tmout == 0) |
1364 | break; | 1363 | break; |
1365 | udelay(1); | 1364 | udelay(1); |
1366 | } while (1); | 1365 | } while (1); |
1367 | } | 1366 | } |
1368 | 1367 | ||
1369 | /* | 1368 | /* |
1370 | * serial8250_rx_chars: processes according to the passed in LSR | 1369 | * serial8250_rx_chars: processes according to the passed in LSR |
1371 | * value, and returns the remaining LSR bits not handled | 1370 | * value, and returns the remaining LSR bits not handled |
1372 | * by this Rx routine. | 1371 | * by this Rx routine. |
1373 | */ | 1372 | */ |
1374 | unsigned char | 1373 | unsigned char |
1375 | serial8250_rx_chars(struct uart_8250_port *up, unsigned char lsr) | 1374 | serial8250_rx_chars(struct uart_8250_port *up, unsigned char lsr) |
1376 | { | 1375 | { |
1377 | struct tty_struct *tty = up->port.state->port.tty; | 1376 | struct tty_struct *tty = up->port.state->port.tty; |
1378 | unsigned char ch; | 1377 | unsigned char ch; |
1379 | int max_count = 256; | 1378 | int max_count = 256; |
1380 | char flag; | 1379 | char flag; |
1381 | 1380 | ||
1382 | do { | 1381 | do { |
1383 | if (likely(lsr & UART_LSR_DR)) | 1382 | if (likely(lsr & UART_LSR_DR)) |
1384 | ch = serial_inp(up, UART_RX); | 1383 | ch = serial_inp(up, UART_RX); |
1385 | else | 1384 | else |
1386 | /* | 1385 | /* |
1387 | * Intel 82571 has a Serial Over Lan device that will | 1386 | * Intel 82571 has a Serial Over Lan device that will |
1388 | * set UART_LSR_BI without setting UART_LSR_DR when | 1387 | * set UART_LSR_BI without setting UART_LSR_DR when |
1389 | * it receives a break. To avoid reading from the | 1388 | * it receives a break. To avoid reading from the |
1390 | * receive buffer without UART_LSR_DR bit set, we | 1389 | * receive buffer without UART_LSR_DR bit set, we |
1391 | * just force the read character to be 0 | 1390 | * just force the read character to be 0 |
1392 | */ | 1391 | */ |
1393 | ch = 0; | 1392 | ch = 0; |
1394 | 1393 | ||
1395 | flag = TTY_NORMAL; | 1394 | flag = TTY_NORMAL; |
1396 | up->port.icount.rx++; | 1395 | up->port.icount.rx++; |
1397 | 1396 | ||
1398 | lsr |= up->lsr_saved_flags; | 1397 | lsr |= up->lsr_saved_flags; |
1399 | up->lsr_saved_flags = 0; | 1398 | up->lsr_saved_flags = 0; |
1400 | 1399 | ||
1401 | if (unlikely(lsr & UART_LSR_BRK_ERROR_BITS)) { | 1400 | if (unlikely(lsr & UART_LSR_BRK_ERROR_BITS)) { |
1402 | /* | 1401 | /* |
1403 | * For statistics only | 1402 | * For statistics only |
1404 | */ | 1403 | */ |
1405 | if (lsr & UART_LSR_BI) { | 1404 | if (lsr & UART_LSR_BI) { |
1406 | lsr &= ~(UART_LSR_FE | UART_LSR_PE); | 1405 | lsr &= ~(UART_LSR_FE | UART_LSR_PE); |
1407 | up->port.icount.brk++; | 1406 | up->port.icount.brk++; |
1408 | /* | 1407 | /* |
1409 | * If tegra port then clear the rx fifo to | 1408 | * If tegra port then clear the rx fifo to |
1410 | * accept another break/character. | 1409 | * accept another break/character. |
1411 | */ | 1410 | */ |
1412 | if (up->port.type == PORT_TEGRA) | 1411 | if (up->port.type == PORT_TEGRA) |
1413 | clear_rx_fifo(up); | 1412 | clear_rx_fifo(up); |
1414 | 1413 | ||
1415 | /* | 1414 | /* |
1416 | * We do the SysRQ and SAK checking | 1415 | * We do the SysRQ and SAK checking |
1417 | * here because otherwise the break | 1416 | * here because otherwise the break |
1418 | * may get masked by ignore_status_mask | 1417 | * may get masked by ignore_status_mask |
1419 | * or read_status_mask. | 1418 | * or read_status_mask. |
1420 | */ | 1419 | */ |
1421 | if (uart_handle_break(&up->port)) | 1420 | if (uart_handle_break(&up->port)) |
1422 | goto ignore_char; | 1421 | goto ignore_char; |
1423 | } else if (lsr & UART_LSR_PE) | 1422 | } else if (lsr & UART_LSR_PE) |
1424 | up->port.icount.parity++; | 1423 | up->port.icount.parity++; |
1425 | else if (lsr & UART_LSR_FE) | 1424 | else if (lsr & UART_LSR_FE) |
1426 | up->port.icount.frame++; | 1425 | up->port.icount.frame++; |
1427 | if (lsr & UART_LSR_OE) | 1426 | if (lsr & UART_LSR_OE) |
1428 | up->port.icount.overrun++; | 1427 | up->port.icount.overrun++; |
1429 | 1428 | ||
1430 | /* | 1429 | /* |
1431 | * Mask off conditions which should be ignored. | 1430 | * Mask off conditions which should be ignored. |
1432 | */ | 1431 | */ |
1433 | lsr &= up->port.read_status_mask; | 1432 | lsr &= up->port.read_status_mask; |
1434 | 1433 | ||
1435 | if (lsr & UART_LSR_BI) { | 1434 | if (lsr & UART_LSR_BI) { |
1436 | DEBUG_INTR("handling break...."); | 1435 | DEBUG_INTR("handling break...."); |
1437 | flag = TTY_BREAK; | 1436 | flag = TTY_BREAK; |
1438 | } else if (lsr & UART_LSR_PE) | 1437 | } else if (lsr & UART_LSR_PE) |
1439 | flag = TTY_PARITY; | 1438 | flag = TTY_PARITY; |
1440 | else if (lsr & UART_LSR_FE) | 1439 | else if (lsr & UART_LSR_FE) |
1441 | flag = TTY_FRAME; | 1440 | flag = TTY_FRAME; |
1442 | } | 1441 | } |
1443 | if (uart_handle_sysrq_char(&up->port, ch)) | 1442 | if (uart_handle_sysrq_char(&up->port, ch)) |
1444 | goto ignore_char; | 1443 | goto ignore_char; |
1445 | 1444 | ||
1446 | uart_insert_char(&up->port, lsr, UART_LSR_OE, ch, flag); | 1445 | uart_insert_char(&up->port, lsr, UART_LSR_OE, ch, flag); |
1447 | 1446 | ||
1448 | ignore_char: | 1447 | ignore_char: |
1449 | lsr = serial_inp(up, UART_LSR); | 1448 | lsr = serial_inp(up, UART_LSR); |
1450 | } while ((lsr & (UART_LSR_DR | UART_LSR_BI)) && (max_count-- > 0)); | 1449 | } while ((lsr & (UART_LSR_DR | UART_LSR_BI)) && (max_count-- > 0)); |
1451 | spin_unlock(&up->port.lock); | 1450 | spin_unlock(&up->port.lock); |
1452 | tty_flip_buffer_push(tty); | 1451 | tty_flip_buffer_push(tty); |
1453 | spin_lock(&up->port.lock); | 1452 | spin_lock(&up->port.lock); |
1454 | return lsr; | 1453 | return lsr; |
1455 | } | 1454 | } |
1456 | EXPORT_SYMBOL_GPL(serial8250_rx_chars); | 1455 | EXPORT_SYMBOL_GPL(serial8250_rx_chars); |
1457 | 1456 | ||
1458 | void serial8250_tx_chars(struct uart_8250_port *up) | 1457 | void serial8250_tx_chars(struct uart_8250_port *up) |
1459 | { | 1458 | { |
1460 | struct circ_buf *xmit = &up->port.state->xmit; | 1459 | struct circ_buf *xmit = &up->port.state->xmit; |
1461 | int count; | 1460 | int count; |
1462 | 1461 | ||
1463 | if (up->port.x_char) { | 1462 | if (up->port.x_char) { |
1464 | serial_outp(up, UART_TX, up->port.x_char); | 1463 | serial_outp(up, UART_TX, up->port.x_char); |
1465 | up->port.icount.tx++; | 1464 | up->port.icount.tx++; |
1466 | up->port.x_char = 0; | 1465 | up->port.x_char = 0; |
1467 | return; | 1466 | return; |
1468 | } | 1467 | } |
1469 | if (uart_tx_stopped(&up->port)) { | 1468 | if (uart_tx_stopped(&up->port)) { |
1470 | serial8250_stop_tx(&up->port); | 1469 | serial8250_stop_tx(&up->port); |
1471 | return; | 1470 | return; |
1472 | } | 1471 | } |
1473 | if (uart_circ_empty(xmit)) { | 1472 | if (uart_circ_empty(xmit)) { |
1474 | __stop_tx(up); | 1473 | __stop_tx(up); |
1475 | return; | 1474 | return; |
1476 | } | 1475 | } |
1477 | 1476 | ||
1478 | count = up->tx_loadsz; | 1477 | count = up->tx_loadsz; |
1479 | do { | 1478 | do { |
1480 | serial_out(up, UART_TX, xmit->buf[xmit->tail]); | 1479 | serial_out(up, UART_TX, xmit->buf[xmit->tail]); |
1481 | xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); | 1480 | xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); |
1482 | up->port.icount.tx++; | 1481 | up->port.icount.tx++; |
1483 | if (uart_circ_empty(xmit)) | 1482 | if (uart_circ_empty(xmit)) |
1484 | break; | 1483 | break; |
1485 | } while (--count > 0); | 1484 | } while (--count > 0); |
1486 | 1485 | ||
1487 | if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) | 1486 | if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) |
1488 | uart_write_wakeup(&up->port); | 1487 | uart_write_wakeup(&up->port); |
1489 | 1488 | ||
1490 | DEBUG_INTR("THRE..."); | 1489 | DEBUG_INTR("THRE..."); |
1491 | 1490 | ||
1492 | if (uart_circ_empty(xmit)) | 1491 | if (uart_circ_empty(xmit)) |
1493 | __stop_tx(up); | 1492 | __stop_tx(up); |
1494 | } | 1493 | } |
1495 | EXPORT_SYMBOL_GPL(serial8250_tx_chars); | 1494 | EXPORT_SYMBOL_GPL(serial8250_tx_chars); |
1496 | 1495 | ||
1497 | unsigned int serial8250_modem_status(struct uart_8250_port *up) | 1496 | unsigned int serial8250_modem_status(struct uart_8250_port *up) |
1498 | { | 1497 | { |
1499 | unsigned int status = serial_in(up, UART_MSR); | 1498 | unsigned int status = serial_in(up, UART_MSR); |
1500 | 1499 | ||
1501 | status |= up->msr_saved_flags; | 1500 | status |= up->msr_saved_flags; |
1502 | up->msr_saved_flags = 0; | 1501 | up->msr_saved_flags = 0; |
1503 | if (status & UART_MSR_ANY_DELTA && up->ier & UART_IER_MSI && | 1502 | if (status & UART_MSR_ANY_DELTA && up->ier & UART_IER_MSI && |
1504 | up->port.state != NULL) { | 1503 | up->port.state != NULL) { |
1505 | if (status & UART_MSR_TERI) | 1504 | if (status & UART_MSR_TERI) |
1506 | up->port.icount.rng++; | 1505 | up->port.icount.rng++; |
1507 | if (status & UART_MSR_DDSR) | 1506 | if (status & UART_MSR_DDSR) |
1508 | up->port.icount.dsr++; | 1507 | up->port.icount.dsr++; |
1509 | if (status & UART_MSR_DDCD) | 1508 | if (status & UART_MSR_DDCD) |
1510 | uart_handle_dcd_change(&up->port, status & UART_MSR_DCD); | 1509 | uart_handle_dcd_change(&up->port, status & UART_MSR_DCD); |
1511 | if (status & UART_MSR_DCTS) | 1510 | if (status & UART_MSR_DCTS) |
1512 | uart_handle_cts_change(&up->port, status & UART_MSR_CTS); | 1511 | uart_handle_cts_change(&up->port, status & UART_MSR_CTS); |
1513 | 1512 | ||
1514 | wake_up_interruptible(&up->port.state->port.delta_msr_wait); | 1513 | wake_up_interruptible(&up->port.state->port.delta_msr_wait); |
1515 | } | 1514 | } |
1516 | 1515 | ||
1517 | return status; | 1516 | return status; |
1518 | } | 1517 | } |
1519 | EXPORT_SYMBOL_GPL(serial8250_modem_status); | 1518 | EXPORT_SYMBOL_GPL(serial8250_modem_status); |
1520 | 1519 | ||
1521 | /* | 1520 | /* |
1522 | * This handles the interrupt from one port. | 1521 | * This handles the interrupt from one port. |
1523 | */ | 1522 | */ |
1524 | int serial8250_handle_irq(struct uart_port *port, unsigned int iir) | 1523 | int serial8250_handle_irq(struct uart_port *port, unsigned int iir) |
1525 | { | 1524 | { |
1526 | unsigned char status; | 1525 | unsigned char status; |
1527 | unsigned long flags; | 1526 | unsigned long flags; |
1528 | struct uart_8250_port *up = | 1527 | struct uart_8250_port *up = |
1529 | container_of(port, struct uart_8250_port, port); | 1528 | container_of(port, struct uart_8250_port, port); |
1530 | 1529 | ||
1531 | if (iir & UART_IIR_NO_INT) | 1530 | if (iir & UART_IIR_NO_INT) |
1532 | return 0; | 1531 | return 0; |
1533 | 1532 | ||
1534 | spin_lock_irqsave(&up->port.lock, flags); | 1533 | spin_lock_irqsave(&up->port.lock, flags); |
1535 | 1534 | ||
1536 | status = serial_inp(up, UART_LSR); | 1535 | status = serial_inp(up, UART_LSR); |
1537 | 1536 | ||
1538 | DEBUG_INTR("status = %x...", status); | 1537 | DEBUG_INTR("status = %x...", status); |
1539 | 1538 | ||
1540 | if (status & (UART_LSR_DR | UART_LSR_BI)) | 1539 | if (status & (UART_LSR_DR | UART_LSR_BI)) |
1541 | status = serial8250_rx_chars(up, status); | 1540 | status = serial8250_rx_chars(up, status); |
1542 | serial8250_modem_status(up); | 1541 | serial8250_modem_status(up); |
1543 | if (status & UART_LSR_THRE) | 1542 | if (status & UART_LSR_THRE) |
1544 | serial8250_tx_chars(up); | 1543 | serial8250_tx_chars(up); |
1545 | 1544 | ||
1546 | spin_unlock_irqrestore(&up->port.lock, flags); | 1545 | spin_unlock_irqrestore(&up->port.lock, flags); |
1547 | return 1; | 1546 | return 1; |
1548 | } | 1547 | } |
1549 | EXPORT_SYMBOL_GPL(serial8250_handle_irq); | 1548 | EXPORT_SYMBOL_GPL(serial8250_handle_irq); |
1550 | 1549 | ||
1551 | static int serial8250_default_handle_irq(struct uart_port *port) | 1550 | static int serial8250_default_handle_irq(struct uart_port *port) |
1552 | { | 1551 | { |
1553 | struct uart_8250_port *up = | 1552 | struct uart_8250_port *up = |
1554 | container_of(port, struct uart_8250_port, port); | 1553 | container_of(port, struct uart_8250_port, port); |
1555 | unsigned int iir = serial_in(up, UART_IIR); | 1554 | unsigned int iir = serial_in(up, UART_IIR); |
1556 | 1555 | ||
1557 | return serial8250_handle_irq(port, iir); | 1556 | return serial8250_handle_irq(port, iir); |
1558 | } | 1557 | } |
1559 | 1558 | ||
1560 | /* | 1559 | /* |
1561 | * This is the serial driver's interrupt routine. | 1560 | * This is the serial driver's interrupt routine. |
1562 | * | 1561 | * |
1563 | * Arjan thinks the old way was overly complex, so it got simplified. | 1562 | * Arjan thinks the old way was overly complex, so it got simplified. |
1564 | * Alan disagrees, saying that need the complexity to handle the weird | 1563 | * Alan disagrees, saying that need the complexity to handle the weird |
1565 | * nature of ISA shared interrupts. (This is a special exception.) | 1564 | * nature of ISA shared interrupts. (This is a special exception.) |
1566 | * | 1565 | * |
1567 | * In order to handle ISA shared interrupts properly, we need to check | 1566 | * In order to handle ISA shared interrupts properly, we need to check |
1568 | * that all ports have been serviced, and therefore the ISA interrupt | 1567 | * that all ports have been serviced, and therefore the ISA interrupt |
1569 | * line has been de-asserted. | 1568 | * line has been de-asserted. |
1570 | * | 1569 | * |
1571 | * This means we need to loop through all ports. checking that they | 1570 | * This means we need to loop through all ports. checking that they |
1572 | * don't have an interrupt pending. | 1571 | * don't have an interrupt pending. |
1573 | */ | 1572 | */ |
1574 | static irqreturn_t serial8250_interrupt(int irq, void *dev_id) | 1573 | static irqreturn_t serial8250_interrupt(int irq, void *dev_id) |
1575 | { | 1574 | { |
1576 | struct irq_info *i = dev_id; | 1575 | struct irq_info *i = dev_id; |
1577 | struct list_head *l, *end = NULL; | 1576 | struct list_head *l, *end = NULL; |
1578 | int pass_counter = 0, handled = 0; | 1577 | int pass_counter = 0, handled = 0; |
1579 | 1578 | ||
1580 | DEBUG_INTR("serial8250_interrupt(%d)...", irq); | 1579 | DEBUG_INTR("serial8250_interrupt(%d)...", irq); |
1581 | 1580 | ||
1582 | spin_lock(&i->lock); | 1581 | spin_lock(&i->lock); |
1583 | 1582 | ||
1584 | l = i->head; | 1583 | l = i->head; |
1585 | do { | 1584 | do { |
1586 | struct uart_8250_port *up; | 1585 | struct uart_8250_port *up; |
1587 | struct uart_port *port; | 1586 | struct uart_port *port; |
1588 | bool skip; | 1587 | bool skip; |
1589 | 1588 | ||
1590 | up = list_entry(l, struct uart_8250_port, list); | 1589 | up = list_entry(l, struct uart_8250_port, list); |
1591 | port = &up->port; | 1590 | port = &up->port; |
1592 | skip = pass_counter && up->port.flags & UPF_IIR_ONCE; | 1591 | skip = pass_counter && up->port.flags & UPF_IIR_ONCE; |
1593 | 1592 | ||
1594 | if (!skip && port->handle_irq(port)) { | 1593 | if (!skip && port->handle_irq(port)) { |
1595 | handled = 1; | 1594 | handled = 1; |
1596 | end = NULL; | 1595 | end = NULL; |
1597 | } else if (end == NULL) | 1596 | } else if (end == NULL) |
1598 | end = l; | 1597 | end = l; |
1599 | 1598 | ||
1600 | l = l->next; | 1599 | l = l->next; |
1601 | 1600 | ||
1602 | if (l == i->head && pass_counter++ > PASS_LIMIT) { | 1601 | if (l == i->head && pass_counter++ > PASS_LIMIT) { |
1603 | /* If we hit this, we're dead. */ | 1602 | /* If we hit this, we're dead. */ |
1604 | printk_ratelimited(KERN_ERR | 1603 | printk_ratelimited(KERN_ERR |
1605 | "serial8250: too much work for irq%d\n", irq); | 1604 | "serial8250: too much work for irq%d\n", irq); |
1606 | break; | 1605 | break; |
1607 | } | 1606 | } |
1608 | } while (l != end); | 1607 | } while (l != end); |
1609 | 1608 | ||
1610 | spin_unlock(&i->lock); | 1609 | spin_unlock(&i->lock); |
1611 | 1610 | ||
1612 | DEBUG_INTR("end.\n"); | 1611 | DEBUG_INTR("end.\n"); |
1613 | 1612 | ||
1614 | return IRQ_RETVAL(handled); | 1613 | return IRQ_RETVAL(handled); |
1615 | } | 1614 | } |
1616 | 1615 | ||
1617 | /* | 1616 | /* |
1618 | * To support ISA shared interrupts, we need to have one interrupt | 1617 | * To support ISA shared interrupts, we need to have one interrupt |
1619 | * handler that ensures that the IRQ line has been deasserted | 1618 | * handler that ensures that the IRQ line has been deasserted |
1620 | * before returning. Failing to do this will result in the IRQ | 1619 | * before returning. Failing to do this will result in the IRQ |
1621 | * line being stuck active, and, since ISA irqs are edge triggered, | 1620 | * line being stuck active, and, since ISA irqs are edge triggered, |
1622 | * no more IRQs will be seen. | 1621 | * no more IRQs will be seen. |
1623 | */ | 1622 | */ |
1624 | static void serial_do_unlink(struct irq_info *i, struct uart_8250_port *up) | 1623 | static void serial_do_unlink(struct irq_info *i, struct uart_8250_port *up) |
1625 | { | 1624 | { |
1626 | spin_lock_irq(&i->lock); | 1625 | spin_lock_irq(&i->lock); |
1627 | 1626 | ||
1628 | if (!list_empty(i->head)) { | 1627 | if (!list_empty(i->head)) { |
1629 | if (i->head == &up->list) | 1628 | if (i->head == &up->list) |
1630 | i->head = i->head->next; | 1629 | i->head = i->head->next; |
1631 | list_del(&up->list); | 1630 | list_del(&up->list); |
1632 | } else { | 1631 | } else { |
1633 | BUG_ON(i->head != &up->list); | 1632 | BUG_ON(i->head != &up->list); |
1634 | i->head = NULL; | 1633 | i->head = NULL; |
1635 | } | 1634 | } |
1636 | spin_unlock_irq(&i->lock); | 1635 | spin_unlock_irq(&i->lock); |
1637 | /* List empty so throw away the hash node */ | 1636 | /* List empty so throw away the hash node */ |
1638 | if (i->head == NULL) { | 1637 | if (i->head == NULL) { |
1639 | hlist_del(&i->node); | 1638 | hlist_del(&i->node); |
1640 | kfree(i); | 1639 | kfree(i); |
1641 | } | 1640 | } |
1642 | } | 1641 | } |
1643 | 1642 | ||
1644 | static int serial_link_irq_chain(struct uart_8250_port *up) | 1643 | static int serial_link_irq_chain(struct uart_8250_port *up) |
1645 | { | 1644 | { |
1646 | struct hlist_head *h; | 1645 | struct hlist_head *h; |
1647 | struct hlist_node *n; | 1646 | struct hlist_node *n; |
1648 | struct irq_info *i; | 1647 | struct irq_info *i; |
1649 | int ret, irq_flags = up->port.flags & UPF_SHARE_IRQ ? IRQF_SHARED : 0; | 1648 | int ret, irq_flags = up->port.flags & UPF_SHARE_IRQ ? IRQF_SHARED : 0; |
1650 | 1649 | ||
1651 | mutex_lock(&hash_mutex); | 1650 | mutex_lock(&hash_mutex); |
1652 | 1651 | ||
1653 | h = &irq_lists[up->port.irq % NR_IRQ_HASH]; | 1652 | h = &irq_lists[up->port.irq % NR_IRQ_HASH]; |
1654 | 1653 | ||
1655 | hlist_for_each(n, h) { | 1654 | hlist_for_each(n, h) { |
1656 | i = hlist_entry(n, struct irq_info, node); | 1655 | i = hlist_entry(n, struct irq_info, node); |
1657 | if (i->irq == up->port.irq) | 1656 | if (i->irq == up->port.irq) |
1658 | break; | 1657 | break; |
1659 | } | 1658 | } |
1660 | 1659 | ||
1661 | if (n == NULL) { | 1660 | if (n == NULL) { |
1662 | i = kzalloc(sizeof(struct irq_info), GFP_KERNEL); | 1661 | i = kzalloc(sizeof(struct irq_info), GFP_KERNEL); |
1663 | if (i == NULL) { | 1662 | if (i == NULL) { |
1664 | mutex_unlock(&hash_mutex); | 1663 | mutex_unlock(&hash_mutex); |
1665 | return -ENOMEM; | 1664 | return -ENOMEM; |
1666 | } | 1665 | } |
1667 | spin_lock_init(&i->lock); | 1666 | spin_lock_init(&i->lock); |
1668 | i->irq = up->port.irq; | 1667 | i->irq = up->port.irq; |
1669 | hlist_add_head(&i->node, h); | 1668 | hlist_add_head(&i->node, h); |
1670 | } | 1669 | } |
1671 | mutex_unlock(&hash_mutex); | 1670 | mutex_unlock(&hash_mutex); |
1672 | 1671 | ||
1673 | spin_lock_irq(&i->lock); | 1672 | spin_lock_irq(&i->lock); |
1674 | 1673 | ||
1675 | if (i->head) { | 1674 | if (i->head) { |
1676 | list_add(&up->list, i->head); | 1675 | list_add(&up->list, i->head); |
1677 | spin_unlock_irq(&i->lock); | 1676 | spin_unlock_irq(&i->lock); |
1678 | 1677 | ||
1679 | ret = 0; | 1678 | ret = 0; |
1680 | } else { | 1679 | } else { |
1681 | INIT_LIST_HEAD(&up->list); | 1680 | INIT_LIST_HEAD(&up->list); |
1682 | i->head = &up->list; | 1681 | i->head = &up->list; |
1683 | spin_unlock_irq(&i->lock); | 1682 | spin_unlock_irq(&i->lock); |
1684 | irq_flags |= up->port.irqflags; | 1683 | irq_flags |= up->port.irqflags; |
1685 | ret = request_irq(up->port.irq, serial8250_interrupt, | 1684 | ret = request_irq(up->port.irq, serial8250_interrupt, |
1686 | irq_flags, "serial", i); | 1685 | irq_flags, "serial", i); |
1687 | if (ret < 0) | 1686 | if (ret < 0) |
1688 | serial_do_unlink(i, up); | 1687 | serial_do_unlink(i, up); |
1689 | } | 1688 | } |
1690 | 1689 | ||
1691 | return ret; | 1690 | return ret; |
1692 | } | 1691 | } |
1693 | 1692 | ||
1694 | static void serial_unlink_irq_chain(struct uart_8250_port *up) | 1693 | static void serial_unlink_irq_chain(struct uart_8250_port *up) |
1695 | { | 1694 | { |
1696 | struct irq_info *i; | 1695 | struct irq_info *i; |
1697 | struct hlist_node *n; | 1696 | struct hlist_node *n; |
1698 | struct hlist_head *h; | 1697 | struct hlist_head *h; |
1699 | 1698 | ||
1700 | mutex_lock(&hash_mutex); | 1699 | mutex_lock(&hash_mutex); |
1701 | 1700 | ||
1702 | h = &irq_lists[up->port.irq % NR_IRQ_HASH]; | 1701 | h = &irq_lists[up->port.irq % NR_IRQ_HASH]; |
1703 | 1702 | ||
1704 | hlist_for_each(n, h) { | 1703 | hlist_for_each(n, h) { |
1705 | i = hlist_entry(n, struct irq_info, node); | 1704 | i = hlist_entry(n, struct irq_info, node); |
1706 | if (i->irq == up->port.irq) | 1705 | if (i->irq == up->port.irq) |
1707 | break; | 1706 | break; |
1708 | } | 1707 | } |
1709 | 1708 | ||
1710 | BUG_ON(n == NULL); | 1709 | BUG_ON(n == NULL); |
1711 | BUG_ON(i->head == NULL); | 1710 | BUG_ON(i->head == NULL); |
1712 | 1711 | ||
1713 | if (list_empty(i->head)) | 1712 | if (list_empty(i->head)) |
1714 | free_irq(up->port.irq, i); | 1713 | free_irq(up->port.irq, i); |
1715 | 1714 | ||
1716 | serial_do_unlink(i, up); | 1715 | serial_do_unlink(i, up); |
1717 | mutex_unlock(&hash_mutex); | 1716 | mutex_unlock(&hash_mutex); |
1718 | } | 1717 | } |
1719 | 1718 | ||
1720 | /* | 1719 | /* |
1721 | * This function is used to handle ports that do not have an | 1720 | * This function is used to handle ports that do not have an |
1722 | * interrupt. This doesn't work very well for 16450's, but gives | 1721 | * interrupt. This doesn't work very well for 16450's, but gives |
1723 | * barely passable results for a 16550A. (Although at the expense | 1722 | * barely passable results for a 16550A. (Although at the expense |
1724 | * of much CPU overhead). | 1723 | * of much CPU overhead). |
1725 | */ | 1724 | */ |
1726 | static void serial8250_timeout(unsigned long data) | 1725 | static void serial8250_timeout(unsigned long data) |
1727 | { | 1726 | { |
1728 | struct uart_8250_port *up = (struct uart_8250_port *)data; | 1727 | struct uart_8250_port *up = (struct uart_8250_port *)data; |
1729 | 1728 | ||
1730 | up->port.handle_irq(&up->port); | 1729 | up->port.handle_irq(&up->port); |
1731 | mod_timer(&up->timer, jiffies + uart_poll_timeout(&up->port)); | 1730 | mod_timer(&up->timer, jiffies + uart_poll_timeout(&up->port)); |
1732 | } | 1731 | } |
1733 | 1732 | ||
1734 | static void serial8250_backup_timeout(unsigned long data) | 1733 | static void serial8250_backup_timeout(unsigned long data) |
1735 | { | 1734 | { |
1736 | struct uart_8250_port *up = (struct uart_8250_port *)data; | 1735 | struct uart_8250_port *up = (struct uart_8250_port *)data; |
1737 | unsigned int iir, ier = 0, lsr; | 1736 | unsigned int iir, ier = 0, lsr; |
1738 | unsigned long flags; | 1737 | unsigned long flags; |
1739 | 1738 | ||
1740 | spin_lock_irqsave(&up->port.lock, flags); | 1739 | spin_lock_irqsave(&up->port.lock, flags); |
1741 | 1740 | ||
1742 | /* | 1741 | /* |
1743 | * Must disable interrupts or else we risk racing with the interrupt | 1742 | * Must disable interrupts or else we risk racing with the interrupt |
1744 | * based handler. | 1743 | * based handler. |
1745 | */ | 1744 | */ |
1746 | if (up->port.irq) { | 1745 | if (up->port.irq) { |
1747 | ier = serial_in(up, UART_IER); | 1746 | ier = serial_in(up, UART_IER); |
1748 | serial_out(up, UART_IER, 0); | 1747 | serial_out(up, UART_IER, 0); |
1749 | } | 1748 | } |
1750 | 1749 | ||
1751 | iir = serial_in(up, UART_IIR); | 1750 | iir = serial_in(up, UART_IIR); |
1752 | 1751 | ||
1753 | /* | 1752 | /* |
1754 | * This should be a safe test for anyone who doesn't trust the | 1753 | * This should be a safe test for anyone who doesn't trust the |
1755 | * IIR bits on their UART, but it's specifically designed for | 1754 | * IIR bits on their UART, but it's specifically designed for |
1756 | * the "Diva" UART used on the management processor on many HP | 1755 | * the "Diva" UART used on the management processor on many HP |
1757 | * ia64 and parisc boxes. | 1756 | * ia64 and parisc boxes. |
1758 | */ | 1757 | */ |
1759 | lsr = serial_in(up, UART_LSR); | 1758 | lsr = serial_in(up, UART_LSR); |
1760 | up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS; | 1759 | up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS; |
1761 | if ((iir & UART_IIR_NO_INT) && (up->ier & UART_IER_THRI) && | 1760 | if ((iir & UART_IIR_NO_INT) && (up->ier & UART_IER_THRI) && |
1762 | (!uart_circ_empty(&up->port.state->xmit) || up->port.x_char) && | 1761 | (!uart_circ_empty(&up->port.state->xmit) || up->port.x_char) && |
1763 | (lsr & UART_LSR_THRE)) { | 1762 | (lsr & UART_LSR_THRE)) { |
1764 | iir &= ~(UART_IIR_ID | UART_IIR_NO_INT); | 1763 | iir &= ~(UART_IIR_ID | UART_IIR_NO_INT); |
1765 | iir |= UART_IIR_THRI; | 1764 | iir |= UART_IIR_THRI; |
1766 | } | 1765 | } |
1767 | 1766 | ||
1768 | if (!(iir & UART_IIR_NO_INT)) | 1767 | if (!(iir & UART_IIR_NO_INT)) |
1769 | serial8250_tx_chars(up); | 1768 | serial8250_tx_chars(up); |
1770 | 1769 | ||
1771 | if (up->port.irq) | 1770 | if (up->port.irq) |
1772 | serial_out(up, UART_IER, ier); | 1771 | serial_out(up, UART_IER, ier); |
1773 | 1772 | ||
1774 | spin_unlock_irqrestore(&up->port.lock, flags); | 1773 | spin_unlock_irqrestore(&up->port.lock, flags); |
1775 | 1774 | ||
1776 | /* Standard timer interval plus 0.2s to keep the port running */ | 1775 | /* Standard timer interval plus 0.2s to keep the port running */ |
1777 | mod_timer(&up->timer, | 1776 | mod_timer(&up->timer, |
1778 | jiffies + uart_poll_timeout(&up->port) + HZ / 5); | 1777 | jiffies + uart_poll_timeout(&up->port) + HZ / 5); |
1779 | } | 1778 | } |
1780 | 1779 | ||
1781 | static unsigned int serial8250_tx_empty(struct uart_port *port) | 1780 | static unsigned int serial8250_tx_empty(struct uart_port *port) |
1782 | { | 1781 | { |
1783 | struct uart_8250_port *up = | 1782 | struct uart_8250_port *up = |
1784 | container_of(port, struct uart_8250_port, port); | 1783 | container_of(port, struct uart_8250_port, port); |
1785 | unsigned long flags; | 1784 | unsigned long flags; |
1786 | unsigned int lsr; | 1785 | unsigned int lsr; |
1787 | 1786 | ||
1788 | spin_lock_irqsave(&up->port.lock, flags); | 1787 | spin_lock_irqsave(&up->port.lock, flags); |
1789 | lsr = serial_in(up, UART_LSR); | 1788 | lsr = serial_in(up, UART_LSR); |
1790 | up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS; | 1789 | up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS; |
1791 | spin_unlock_irqrestore(&up->port.lock, flags); | 1790 | spin_unlock_irqrestore(&up->port.lock, flags); |
1792 | 1791 | ||
1793 | return (lsr & BOTH_EMPTY) == BOTH_EMPTY ? TIOCSER_TEMT : 0; | 1792 | return (lsr & BOTH_EMPTY) == BOTH_EMPTY ? TIOCSER_TEMT : 0; |
1794 | } | 1793 | } |
1795 | 1794 | ||
1796 | static unsigned int serial8250_get_mctrl(struct uart_port *port) | 1795 | static unsigned int serial8250_get_mctrl(struct uart_port *port) |
1797 | { | 1796 | { |
1798 | struct uart_8250_port *up = | 1797 | struct uart_8250_port *up = |
1799 | container_of(port, struct uart_8250_port, port); | 1798 | container_of(port, struct uart_8250_port, port); |
1800 | unsigned int status; | 1799 | unsigned int status; |
1801 | unsigned int ret; | 1800 | unsigned int ret; |
1802 | 1801 | ||
1803 | status = serial8250_modem_status(up); | 1802 | status = serial8250_modem_status(up); |
1804 | 1803 | ||
1805 | ret = 0; | 1804 | ret = 0; |
1806 | if (status & UART_MSR_DCD) | 1805 | if (status & UART_MSR_DCD) |
1807 | ret |= TIOCM_CAR; | 1806 | ret |= TIOCM_CAR; |
1808 | if (status & UART_MSR_RI) | 1807 | if (status & UART_MSR_RI) |
1809 | ret |= TIOCM_RNG; | 1808 | ret |= TIOCM_RNG; |
1810 | if (status & UART_MSR_DSR) | 1809 | if (status & UART_MSR_DSR) |
1811 | ret |= TIOCM_DSR; | 1810 | ret |= TIOCM_DSR; |
1812 | if (status & UART_MSR_CTS) | 1811 | if (status & UART_MSR_CTS) |
1813 | ret |= TIOCM_CTS; | 1812 | ret |= TIOCM_CTS; |
1814 | return ret; | 1813 | return ret; |
1815 | } | 1814 | } |
1816 | 1815 | ||
1817 | static void serial8250_set_mctrl(struct uart_port *port, unsigned int mctrl) | 1816 | static void serial8250_set_mctrl(struct uart_port *port, unsigned int mctrl) |
1818 | { | 1817 | { |
1819 | struct uart_8250_port *up = | 1818 | struct uart_8250_port *up = |
1820 | container_of(port, struct uart_8250_port, port); | 1819 | container_of(port, struct uart_8250_port, port); |
1821 | unsigned char mcr = 0; | 1820 | unsigned char mcr = 0; |
1822 | 1821 | ||
1823 | if (mctrl & TIOCM_RTS) | 1822 | if (mctrl & TIOCM_RTS) |
1824 | mcr |= UART_MCR_RTS; | 1823 | mcr |= UART_MCR_RTS; |
1825 | if (mctrl & TIOCM_DTR) | 1824 | if (mctrl & TIOCM_DTR) |
1826 | mcr |= UART_MCR_DTR; | 1825 | mcr |= UART_MCR_DTR; |
1827 | if (mctrl & TIOCM_OUT1) | 1826 | if (mctrl & TIOCM_OUT1) |
1828 | mcr |= UART_MCR_OUT1; | 1827 | mcr |= UART_MCR_OUT1; |
1829 | if (mctrl & TIOCM_OUT2) | 1828 | if (mctrl & TIOCM_OUT2) |
1830 | mcr |= UART_MCR_OUT2; | 1829 | mcr |= UART_MCR_OUT2; |
1831 | if (mctrl & TIOCM_LOOP) | 1830 | if (mctrl & TIOCM_LOOP) |
1832 | mcr |= UART_MCR_LOOP; | 1831 | mcr |= UART_MCR_LOOP; |
1833 | 1832 | ||
1834 | mcr = (mcr & up->mcr_mask) | up->mcr_force | up->mcr; | 1833 | mcr = (mcr & up->mcr_mask) | up->mcr_force | up->mcr; |
1835 | 1834 | ||
1836 | serial_out(up, UART_MCR, mcr); | 1835 | serial_out(up, UART_MCR, mcr); |
1837 | } | 1836 | } |
1838 | 1837 | ||
1839 | static void serial8250_break_ctl(struct uart_port *port, int break_state) | 1838 | static void serial8250_break_ctl(struct uart_port *port, int break_state) |
1840 | { | 1839 | { |
1841 | struct uart_8250_port *up = | 1840 | struct uart_8250_port *up = |
1842 | container_of(port, struct uart_8250_port, port); | 1841 | container_of(port, struct uart_8250_port, port); |
1843 | unsigned long flags; | 1842 | unsigned long flags; |
1844 | 1843 | ||
1845 | spin_lock_irqsave(&up->port.lock, flags); | 1844 | spin_lock_irqsave(&up->port.lock, flags); |
1846 | if (break_state == -1) | 1845 | if (break_state == -1) |
1847 | up->lcr |= UART_LCR_SBC; | 1846 | up->lcr |= UART_LCR_SBC; |
1848 | else | 1847 | else |
1849 | up->lcr &= ~UART_LCR_SBC; | 1848 | up->lcr &= ~UART_LCR_SBC; |
1850 | serial_out(up, UART_LCR, up->lcr); | 1849 | serial_out(up, UART_LCR, up->lcr); |
1851 | spin_unlock_irqrestore(&up->port.lock, flags); | 1850 | spin_unlock_irqrestore(&up->port.lock, flags); |
1852 | } | 1851 | } |
1853 | 1852 | ||
1854 | /* | 1853 | /* |
1855 | * Wait for transmitter & holding register to empty | 1854 | * Wait for transmitter & holding register to empty |
1856 | */ | 1855 | */ |
1857 | static void wait_for_xmitr(struct uart_8250_port *up, int bits) | 1856 | static void wait_for_xmitr(struct uart_8250_port *up, int bits) |
1858 | { | 1857 | { |
1859 | unsigned int status, tmout = 10000; | 1858 | unsigned int status, tmout = 10000; |
1860 | 1859 | ||
1861 | /* Wait up to 10ms for the character(s) to be sent. */ | 1860 | /* Wait up to 10ms for the character(s) to be sent. */ |
1862 | for (;;) { | 1861 | for (;;) { |
1863 | status = serial_in(up, UART_LSR); | 1862 | status = serial_in(up, UART_LSR); |
1864 | 1863 | ||
1865 | up->lsr_saved_flags |= status & LSR_SAVE_FLAGS; | 1864 | up->lsr_saved_flags |= status & LSR_SAVE_FLAGS; |
1866 | 1865 | ||
1867 | if ((status & bits) == bits) | 1866 | if ((status & bits) == bits) |
1868 | break; | 1867 | break; |
1869 | if (--tmout == 0) | 1868 | if (--tmout == 0) |
1870 | break; | 1869 | break; |
1871 | udelay(1); | 1870 | udelay(1); |
1872 | } | 1871 | } |
1873 | 1872 | ||
1874 | /* Wait up to 1s for flow control if necessary */ | 1873 | /* Wait up to 1s for flow control if necessary */ |
1875 | if (up->port.flags & UPF_CONS_FLOW) { | 1874 | if (up->port.flags & UPF_CONS_FLOW) { |
1876 | unsigned int tmout; | 1875 | unsigned int tmout; |
1877 | for (tmout = 1000000; tmout; tmout--) { | 1876 | for (tmout = 1000000; tmout; tmout--) { |
1878 | unsigned int msr = serial_in(up, UART_MSR); | 1877 | unsigned int msr = serial_in(up, UART_MSR); |
1879 | up->msr_saved_flags |= msr & MSR_SAVE_FLAGS; | 1878 | up->msr_saved_flags |= msr & MSR_SAVE_FLAGS; |
1880 | if (msr & UART_MSR_CTS) | 1879 | if (msr & UART_MSR_CTS) |
1881 | break; | 1880 | break; |
1882 | udelay(1); | 1881 | udelay(1); |
1883 | touch_nmi_watchdog(); | 1882 | touch_nmi_watchdog(); |
1884 | } | 1883 | } |
1885 | } | 1884 | } |
1886 | } | 1885 | } |
1887 | 1886 | ||
1888 | #ifdef CONFIG_CONSOLE_POLL | 1887 | #ifdef CONFIG_CONSOLE_POLL |
1889 | /* | 1888 | /* |
1890 | * Console polling routines for writing and reading from the uart while | 1889 | * Console polling routines for writing and reading from the uart while |
1891 | * in an interrupt or debug context. | 1890 | * in an interrupt or debug context. |
1892 | */ | 1891 | */ |
1893 | 1892 | ||
1894 | static int serial8250_get_poll_char(struct uart_port *port) | 1893 | static int serial8250_get_poll_char(struct uart_port *port) |
1895 | { | 1894 | { |
1896 | struct uart_8250_port *up = | 1895 | struct uart_8250_port *up = |
1897 | container_of(port, struct uart_8250_port, port); | 1896 | container_of(port, struct uart_8250_port, port); |
1898 | unsigned char lsr = serial_inp(up, UART_LSR); | 1897 | unsigned char lsr = serial_inp(up, UART_LSR); |
1899 | 1898 | ||
1900 | if (!(lsr & UART_LSR_DR)) | 1899 | if (!(lsr & UART_LSR_DR)) |
1901 | return NO_POLL_CHAR; | 1900 | return NO_POLL_CHAR; |
1902 | 1901 | ||
1903 | return serial_inp(up, UART_RX); | 1902 | return serial_inp(up, UART_RX); |
1904 | } | 1903 | } |
1905 | 1904 | ||
1906 | 1905 | ||
1907 | static void serial8250_put_poll_char(struct uart_port *port, | 1906 | static void serial8250_put_poll_char(struct uart_port *port, |
1908 | unsigned char c) | 1907 | unsigned char c) |
1909 | { | 1908 | { |
1910 | unsigned int ier; | 1909 | unsigned int ier; |
1911 | struct uart_8250_port *up = | 1910 | struct uart_8250_port *up = |
1912 | container_of(port, struct uart_8250_port, port); | 1911 | container_of(port, struct uart_8250_port, port); |
1913 | 1912 | ||
1914 | /* | 1913 | /* |
1915 | * First save the IER then disable the interrupts | 1914 | * First save the IER then disable the interrupts |
1916 | */ | 1915 | */ |
1917 | ier = serial_in(up, UART_IER); | 1916 | ier = serial_in(up, UART_IER); |
1918 | if (up->capabilities & UART_CAP_UUE) | 1917 | if (up->capabilities & UART_CAP_UUE) |
1919 | serial_out(up, UART_IER, UART_IER_UUE); | 1918 | serial_out(up, UART_IER, UART_IER_UUE); |
1920 | else | 1919 | else |
1921 | serial_out(up, UART_IER, 0); | 1920 | serial_out(up, UART_IER, 0); |
1922 | 1921 | ||
1923 | wait_for_xmitr(up, BOTH_EMPTY); | 1922 | wait_for_xmitr(up, BOTH_EMPTY); |
1924 | /* | 1923 | /* |
1925 | * Send the character out. | 1924 | * Send the character out. |
1926 | * If a LF, also do CR... | 1925 | * If a LF, also do CR... |
1927 | */ | 1926 | */ |
1928 | serial_out(up, UART_TX, c); | 1927 | serial_out(up, UART_TX, c); |
1929 | if (c == 10) { | 1928 | if (c == 10) { |
1930 | wait_for_xmitr(up, BOTH_EMPTY); | 1929 | wait_for_xmitr(up, BOTH_EMPTY); |
1931 | serial_out(up, UART_TX, 13); | 1930 | serial_out(up, UART_TX, 13); |
1932 | } | 1931 | } |
1933 | 1932 | ||
1934 | /* | 1933 | /* |
1935 | * Finally, wait for transmitter to become empty | 1934 | * Finally, wait for transmitter to become empty |
1936 | * and restore the IER | 1935 | * and restore the IER |
1937 | */ | 1936 | */ |
1938 | wait_for_xmitr(up, BOTH_EMPTY); | 1937 | wait_for_xmitr(up, BOTH_EMPTY); |
1939 | serial_out(up, UART_IER, ier); | 1938 | serial_out(up, UART_IER, ier); |
1940 | } | 1939 | } |
1941 | 1940 | ||
1942 | #endif /* CONFIG_CONSOLE_POLL */ | 1941 | #endif /* CONFIG_CONSOLE_POLL */ |
1943 | 1942 | ||
1944 | static int serial8250_startup(struct uart_port *port) | 1943 | static int serial8250_startup(struct uart_port *port) |
1945 | { | 1944 | { |
1946 | struct uart_8250_port *up = | 1945 | struct uart_8250_port *up = |
1947 | container_of(port, struct uart_8250_port, port); | 1946 | container_of(port, struct uart_8250_port, port); |
1948 | unsigned long flags; | 1947 | unsigned long flags; |
1949 | unsigned char lsr, iir; | 1948 | unsigned char lsr, iir; |
1950 | int retval; | 1949 | int retval; |
1951 | 1950 | ||
1952 | up->port.fifosize = uart_config[up->port.type].fifo_size; | 1951 | up->port.fifosize = uart_config[up->port.type].fifo_size; |
1953 | up->tx_loadsz = uart_config[up->port.type].tx_loadsz; | 1952 | up->tx_loadsz = uart_config[up->port.type].tx_loadsz; |
1954 | up->capabilities = uart_config[up->port.type].flags; | 1953 | up->capabilities = uart_config[up->port.type].flags; |
1955 | up->mcr = 0; | 1954 | up->mcr = 0; |
1956 | 1955 | ||
1957 | if (up->port.iotype != up->cur_iotype) | 1956 | if (up->port.iotype != up->cur_iotype) |
1958 | set_io_from_upio(port); | 1957 | set_io_from_upio(port); |
1959 | 1958 | ||
1960 | if (up->port.type == PORT_16C950) { | 1959 | if (up->port.type == PORT_16C950) { |
1961 | /* Wake up and initialize UART */ | 1960 | /* Wake up and initialize UART */ |
1962 | up->acr = 0; | 1961 | up->acr = 0; |
1963 | serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_B); | 1962 | serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_B); |
1964 | serial_outp(up, UART_EFR, UART_EFR_ECB); | 1963 | serial_outp(up, UART_EFR, UART_EFR_ECB); |
1965 | serial_outp(up, UART_IER, 0); | 1964 | serial_outp(up, UART_IER, 0); |
1966 | serial_outp(up, UART_LCR, 0); | 1965 | serial_outp(up, UART_LCR, 0); |
1967 | serial_icr_write(up, UART_CSR, 0); /* Reset the UART */ | 1966 | serial_icr_write(up, UART_CSR, 0); /* Reset the UART */ |
1968 | serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_B); | 1967 | serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_B); |
1969 | serial_outp(up, UART_EFR, UART_EFR_ECB); | 1968 | serial_outp(up, UART_EFR, UART_EFR_ECB); |
1970 | serial_outp(up, UART_LCR, 0); | 1969 | serial_outp(up, UART_LCR, 0); |
1971 | } | 1970 | } |
1972 | 1971 | ||
1973 | #ifdef CONFIG_SERIAL_8250_RSA | 1972 | #ifdef CONFIG_SERIAL_8250_RSA |
1974 | /* | 1973 | /* |
1975 | * If this is an RSA port, see if we can kick it up to the | 1974 | * If this is an RSA port, see if we can kick it up to the |
1976 | * higher speed clock. | 1975 | * higher speed clock. |
1977 | */ | 1976 | */ |
1978 | enable_rsa(up); | 1977 | enable_rsa(up); |
1979 | #endif | 1978 | #endif |
1980 | 1979 | ||
1981 | /* | 1980 | /* |
1982 | * Clear the FIFO buffers and disable them. | 1981 | * Clear the FIFO buffers and disable them. |
1983 | * (they will be reenabled in set_termios()) | 1982 | * (they will be reenabled in set_termios()) |
1984 | */ | 1983 | */ |
1985 | serial8250_clear_fifos(up); | 1984 | serial8250_clear_fifos(up); |
1986 | 1985 | ||
1987 | /* | 1986 | /* |
1988 | * Clear the interrupt registers. | 1987 | * Clear the interrupt registers. |
1989 | */ | 1988 | */ |
1990 | (void) serial_inp(up, UART_LSR); | 1989 | (void) serial_inp(up, UART_LSR); |
1991 | (void) serial_inp(up, UART_RX); | 1990 | (void) serial_inp(up, UART_RX); |
1992 | (void) serial_inp(up, UART_IIR); | 1991 | (void) serial_inp(up, UART_IIR); |
1993 | (void) serial_inp(up, UART_MSR); | 1992 | (void) serial_inp(up, UART_MSR); |
1994 | 1993 | ||
1995 | /* | 1994 | /* |
1996 | * At this point, there's no way the LSR could still be 0xff; | 1995 | * At this point, there's no way the LSR could still be 0xff; |
1997 | * if it is, then bail out, because there's likely no UART | 1996 | * if it is, then bail out, because there's likely no UART |
1998 | * here. | 1997 | * here. |
1999 | */ | 1998 | */ |
2000 | if (!(up->port.flags & UPF_BUGGY_UART) && | 1999 | if (!(up->port.flags & UPF_BUGGY_UART) && |
2001 | (serial_inp(up, UART_LSR) == 0xff)) { | 2000 | (serial_inp(up, UART_LSR) == 0xff)) { |
2002 | printk_ratelimited(KERN_INFO "ttyS%d: LSR safety check engaged!\n", | 2001 | printk_ratelimited(KERN_INFO "ttyS%d: LSR safety check engaged!\n", |
2003 | serial_index(&up->port)); | 2002 | serial_index(&up->port)); |
2004 | return -ENODEV; | 2003 | return -ENODEV; |
2005 | } | 2004 | } |
2006 | 2005 | ||
2007 | /* | 2006 | /* |
2008 | * For a XR16C850, we need to set the trigger levels | 2007 | * For a XR16C850, we need to set the trigger levels |
2009 | */ | 2008 | */ |
2010 | if (up->port.type == PORT_16850) { | 2009 | if (up->port.type == PORT_16850) { |
2011 | unsigned char fctr; | 2010 | unsigned char fctr; |
2012 | 2011 | ||
2013 | serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_B); | 2012 | serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_B); |
2014 | 2013 | ||
2015 | fctr = serial_inp(up, UART_FCTR) & ~(UART_FCTR_RX|UART_FCTR_TX); | 2014 | fctr = serial_inp(up, UART_FCTR) & ~(UART_FCTR_RX|UART_FCTR_TX); |
2016 | serial_outp(up, UART_FCTR, fctr | UART_FCTR_TRGD | UART_FCTR_RX); | 2015 | serial_outp(up, UART_FCTR, fctr | UART_FCTR_TRGD | UART_FCTR_RX); |
2017 | serial_outp(up, UART_TRG, UART_TRG_96); | 2016 | serial_outp(up, UART_TRG, UART_TRG_96); |
2018 | serial_outp(up, UART_FCTR, fctr | UART_FCTR_TRGD | UART_FCTR_TX); | 2017 | serial_outp(up, UART_FCTR, fctr | UART_FCTR_TRGD | UART_FCTR_TX); |
2019 | serial_outp(up, UART_TRG, UART_TRG_96); | 2018 | serial_outp(up, UART_TRG, UART_TRG_96); |
2020 | 2019 | ||
2021 | serial_outp(up, UART_LCR, 0); | 2020 | serial_outp(up, UART_LCR, 0); |
2022 | } | 2021 | } |
2023 | 2022 | ||
2024 | if (up->port.irq) { | 2023 | if (up->port.irq) { |
2025 | unsigned char iir1; | 2024 | unsigned char iir1; |
2026 | /* | 2025 | /* |
2027 | * Test for UARTs that do not reassert THRE when the | 2026 | * Test for UARTs that do not reassert THRE when the |
2028 | * transmitter is idle and the interrupt has already | 2027 | * transmitter is idle and the interrupt has already |
2029 | * been cleared. Real 16550s should always reassert | 2028 | * been cleared. Real 16550s should always reassert |
2030 | * this interrupt whenever the transmitter is idle and | 2029 | * this interrupt whenever the transmitter is idle and |
2031 | * the interrupt is enabled. Delays are necessary to | 2030 | * the interrupt is enabled. Delays are necessary to |
2032 | * allow register changes to become visible. | 2031 | * allow register changes to become visible. |
2033 | */ | 2032 | */ |
2034 | spin_lock_irqsave(&up->port.lock, flags); | 2033 | spin_lock_irqsave(&up->port.lock, flags); |
2035 | if (up->port.irqflags & IRQF_SHARED) | 2034 | if (up->port.irqflags & IRQF_SHARED) |
2036 | disable_irq_nosync(up->port.irq); | 2035 | disable_irq_nosync(up->port.irq); |
2037 | 2036 | ||
2038 | wait_for_xmitr(up, UART_LSR_THRE); | 2037 | wait_for_xmitr(up, UART_LSR_THRE); |
2039 | serial_out_sync(up, UART_IER, UART_IER_THRI); | 2038 | serial_out_sync(up, UART_IER, UART_IER_THRI); |
2040 | udelay(1); /* allow THRE to set */ | 2039 | udelay(1); /* allow THRE to set */ |
2041 | iir1 = serial_in(up, UART_IIR); | 2040 | iir1 = serial_in(up, UART_IIR); |
2042 | serial_out(up, UART_IER, 0); | 2041 | serial_out(up, UART_IER, 0); |
2043 | serial_out_sync(up, UART_IER, UART_IER_THRI); | 2042 | serial_out_sync(up, UART_IER, UART_IER_THRI); |
2044 | udelay(1); /* allow a working UART time to re-assert THRE */ | 2043 | udelay(1); /* allow a working UART time to re-assert THRE */ |
2045 | iir = serial_in(up, UART_IIR); | 2044 | iir = serial_in(up, UART_IIR); |
2046 | serial_out(up, UART_IER, 0); | 2045 | serial_out(up, UART_IER, 0); |
2047 | 2046 | ||
2048 | if (up->port.irqflags & IRQF_SHARED) | 2047 | if (up->port.irqflags & IRQF_SHARED) |
2049 | enable_irq(up->port.irq); | 2048 | enable_irq(up->port.irq); |
2050 | spin_unlock_irqrestore(&up->port.lock, flags); | 2049 | spin_unlock_irqrestore(&up->port.lock, flags); |
2051 | 2050 | ||
2052 | /* | 2051 | /* |
2053 | * If the interrupt is not reasserted, setup a timer to | 2052 | * If the interrupt is not reasserted, setup a timer to |
2054 | * kick the UART on a regular basis. | 2053 | * kick the UART on a regular basis. |
2055 | */ | 2054 | */ |
2056 | if (!(iir1 & UART_IIR_NO_INT) && (iir & UART_IIR_NO_INT)) { | 2055 | if (!(iir1 & UART_IIR_NO_INT) && (iir & UART_IIR_NO_INT)) { |
2057 | up->bugs |= UART_BUG_THRE; | 2056 | up->bugs |= UART_BUG_THRE; |
2058 | pr_debug("ttyS%d - using backup timer\n", | 2057 | pr_debug("ttyS%d - using backup timer\n", |
2059 | serial_index(port)); | 2058 | serial_index(port)); |
2060 | } | 2059 | } |
2061 | } | 2060 | } |
2062 | 2061 | ||
2063 | /* | 2062 | /* |
2064 | * The above check will only give an accurate result the first time | 2063 | * The above check will only give an accurate result the first time |
2065 | * the port is opened so this value needs to be preserved. | 2064 | * the port is opened so this value needs to be preserved. |
2066 | */ | 2065 | */ |
2067 | if (up->bugs & UART_BUG_THRE) { | 2066 | if (up->bugs & UART_BUG_THRE) { |
2068 | up->timer.function = serial8250_backup_timeout; | 2067 | up->timer.function = serial8250_backup_timeout; |
2069 | up->timer.data = (unsigned long)up; | 2068 | up->timer.data = (unsigned long)up; |
2070 | mod_timer(&up->timer, jiffies + | 2069 | mod_timer(&up->timer, jiffies + |
2071 | uart_poll_timeout(port) + HZ / 5); | 2070 | uart_poll_timeout(port) + HZ / 5); |
2072 | } | 2071 | } |
2073 | 2072 | ||
2074 | /* | 2073 | /* |
2075 | * If the "interrupt" for this port doesn't correspond with any | 2074 | * If the "interrupt" for this port doesn't correspond with any |
2076 | * hardware interrupt, we use a timer-based system. The original | 2075 | * hardware interrupt, we use a timer-based system. The original |
2077 | * driver used to do this with IRQ0. | 2076 | * driver used to do this with IRQ0. |
2078 | */ | 2077 | */ |
2079 | if (!up->port.irq) { | 2078 | if (!up->port.irq) { |
2080 | up->timer.data = (unsigned long)up; | 2079 | up->timer.data = (unsigned long)up; |
2081 | mod_timer(&up->timer, jiffies + uart_poll_timeout(port)); | 2080 | mod_timer(&up->timer, jiffies + uart_poll_timeout(port)); |
2082 | } else { | 2081 | } else { |
2083 | retval = serial_link_irq_chain(up); | 2082 | retval = serial_link_irq_chain(up); |
2084 | if (retval) | 2083 | if (retval) |
2085 | return retval; | 2084 | return retval; |
2086 | } | 2085 | } |
2087 | 2086 | ||
2088 | /* | 2087 | /* |
2089 | * Now, initialize the UART | 2088 | * Now, initialize the UART |
2090 | */ | 2089 | */ |
2091 | serial_outp(up, UART_LCR, UART_LCR_WLEN8); | 2090 | serial_outp(up, UART_LCR, UART_LCR_WLEN8); |
2092 | 2091 | ||
2093 | spin_lock_irqsave(&up->port.lock, flags); | 2092 | spin_lock_irqsave(&up->port.lock, flags); |
2094 | if (up->port.flags & UPF_FOURPORT) { | 2093 | if (up->port.flags & UPF_FOURPORT) { |
2095 | if (!up->port.irq) | 2094 | if (!up->port.irq) |
2096 | up->port.mctrl |= TIOCM_OUT1; | 2095 | up->port.mctrl |= TIOCM_OUT1; |
2097 | } else | 2096 | } else |
2098 | /* | 2097 | /* |
2099 | * Most PC uarts need OUT2 raised to enable interrupts. | 2098 | * Most PC uarts need OUT2 raised to enable interrupts. |
2100 | */ | 2099 | */ |
2101 | if (up->port.irq) | 2100 | if (up->port.irq) |
2102 | up->port.mctrl |= TIOCM_OUT2; | 2101 | up->port.mctrl |= TIOCM_OUT2; |
2103 | 2102 | ||
2104 | serial8250_set_mctrl(&up->port, up->port.mctrl); | 2103 | serial8250_set_mctrl(&up->port, up->port.mctrl); |
2105 | 2104 | ||
2106 | /* Serial over Lan (SoL) hack: | 2105 | /* Serial over Lan (SoL) hack: |
2107 | Intel 8257x Gigabit ethernet chips have a | 2106 | Intel 8257x Gigabit ethernet chips have a |
2108 | 16550 emulation, to be used for Serial Over Lan. | 2107 | 16550 emulation, to be used for Serial Over Lan. |
2109 | Those chips take a longer time than a normal | 2108 | Those chips take a longer time than a normal |
2110 | serial device to signalize that a transmission | 2109 | serial device to signalize that a transmission |
2111 | data was queued. Due to that, the above test generally | 2110 | data was queued. Due to that, the above test generally |
2112 | fails. One solution would be to delay the reading of | 2111 | fails. One solution would be to delay the reading of |
2113 | iir. However, this is not reliable, since the timeout | 2112 | iir. However, this is not reliable, since the timeout |
2114 | is variable. So, let's just don't test if we receive | 2113 | is variable. So, let's just don't test if we receive |
2115 | TX irq. This way, we'll never enable UART_BUG_TXEN. | 2114 | TX irq. This way, we'll never enable UART_BUG_TXEN. |
2116 | */ | 2115 | */ |
2117 | if (skip_txen_test || up->port.flags & UPF_NO_TXEN_TEST) | 2116 | if (skip_txen_test || up->port.flags & UPF_NO_TXEN_TEST) |
2118 | goto dont_test_tx_en; | 2117 | goto dont_test_tx_en; |
2119 | 2118 | ||
2120 | /* | 2119 | /* |
2121 | * Do a quick test to see if we receive an | 2120 | * Do a quick test to see if we receive an |
2122 | * interrupt when we enable the TX irq. | 2121 | * interrupt when we enable the TX irq. |
2123 | */ | 2122 | */ |
2124 | serial_outp(up, UART_IER, UART_IER_THRI); | 2123 | serial_outp(up, UART_IER, UART_IER_THRI); |
2125 | lsr = serial_in(up, UART_LSR); | 2124 | lsr = serial_in(up, UART_LSR); |
2126 | iir = serial_in(up, UART_IIR); | 2125 | iir = serial_in(up, UART_IIR); |
2127 | serial_outp(up, UART_IER, 0); | 2126 | serial_outp(up, UART_IER, 0); |
2128 | 2127 | ||
2129 | if (lsr & UART_LSR_TEMT && iir & UART_IIR_NO_INT) { | 2128 | if (lsr & UART_LSR_TEMT && iir & UART_IIR_NO_INT) { |
2130 | if (!(up->bugs & UART_BUG_TXEN)) { | 2129 | if (!(up->bugs & UART_BUG_TXEN)) { |
2131 | up->bugs |= UART_BUG_TXEN; | 2130 | up->bugs |= UART_BUG_TXEN; |
2132 | pr_debug("ttyS%d - enabling bad tx status workarounds\n", | 2131 | pr_debug("ttyS%d - enabling bad tx status workarounds\n", |
2133 | serial_index(port)); | 2132 | serial_index(port)); |
2134 | } | 2133 | } |
2135 | } else { | 2134 | } else { |
2136 | up->bugs &= ~UART_BUG_TXEN; | 2135 | up->bugs &= ~UART_BUG_TXEN; |
2137 | } | 2136 | } |
2138 | 2137 | ||
2139 | dont_test_tx_en: | 2138 | dont_test_tx_en: |
2140 | spin_unlock_irqrestore(&up->port.lock, flags); | 2139 | spin_unlock_irqrestore(&up->port.lock, flags); |
2141 | 2140 | ||
2142 | /* | 2141 | /* |
2143 | * Clear the interrupt registers again for luck, and clear the | 2142 | * Clear the interrupt registers again for luck, and clear the |
2144 | * saved flags to avoid getting false values from polling | 2143 | * saved flags to avoid getting false values from polling |
2145 | * routines or the previous session. | 2144 | * routines or the previous session. |
2146 | */ | 2145 | */ |
2147 | serial_inp(up, UART_LSR); | 2146 | serial_inp(up, UART_LSR); |
2148 | serial_inp(up, UART_RX); | 2147 | serial_inp(up, UART_RX); |
2149 | serial_inp(up, UART_IIR); | 2148 | serial_inp(up, UART_IIR); |
2150 | serial_inp(up, UART_MSR); | 2149 | serial_inp(up, UART_MSR); |
2151 | up->lsr_saved_flags = 0; | 2150 | up->lsr_saved_flags = 0; |
2152 | up->msr_saved_flags = 0; | 2151 | up->msr_saved_flags = 0; |
2153 | 2152 | ||
2154 | /* | 2153 | /* |
2155 | * Finally, enable interrupts. Note: Modem status interrupts | 2154 | * Finally, enable interrupts. Note: Modem status interrupts |
2156 | * are set via set_termios(), which will be occurring imminently | 2155 | * are set via set_termios(), which will be occurring imminently |
2157 | * anyway, so we don't enable them here. | 2156 | * anyway, so we don't enable them here. |
2158 | */ | 2157 | */ |
2159 | up->ier = UART_IER_RLSI | UART_IER_RDI; | 2158 | up->ier = UART_IER_RLSI | UART_IER_RDI; |
2160 | serial_outp(up, UART_IER, up->ier); | 2159 | serial_outp(up, UART_IER, up->ier); |
2161 | 2160 | ||
2162 | if (up->port.flags & UPF_FOURPORT) { | 2161 | if (up->port.flags & UPF_FOURPORT) { |
2163 | unsigned int icp; | 2162 | unsigned int icp; |
2164 | /* | 2163 | /* |
2165 | * Enable interrupts on the AST Fourport board | 2164 | * Enable interrupts on the AST Fourport board |
2166 | */ | 2165 | */ |
2167 | icp = (up->port.iobase & 0xfe0) | 0x01f; | 2166 | icp = (up->port.iobase & 0xfe0) | 0x01f; |
2168 | outb_p(0x80, icp); | 2167 | outb_p(0x80, icp); |
2169 | (void) inb_p(icp); | 2168 | (void) inb_p(icp); |
2170 | } | 2169 | } |
2171 | 2170 | ||
2172 | return 0; | 2171 | return 0; |
2173 | } | 2172 | } |
2174 | 2173 | ||
2175 | static void serial8250_shutdown(struct uart_port *port) | 2174 | static void serial8250_shutdown(struct uart_port *port) |
2176 | { | 2175 | { |
2177 | struct uart_8250_port *up = | 2176 | struct uart_8250_port *up = |
2178 | container_of(port, struct uart_8250_port, port); | 2177 | container_of(port, struct uart_8250_port, port); |
2179 | unsigned long flags; | 2178 | unsigned long flags; |
2180 | 2179 | ||
2181 | /* | 2180 | /* |
2182 | * Disable interrupts from this port | 2181 | * Disable interrupts from this port |
2183 | */ | 2182 | */ |
2184 | up->ier = 0; | 2183 | up->ier = 0; |
2185 | serial_outp(up, UART_IER, 0); | 2184 | serial_outp(up, UART_IER, 0); |
2186 | 2185 | ||
2187 | spin_lock_irqsave(&up->port.lock, flags); | 2186 | spin_lock_irqsave(&up->port.lock, flags); |
2188 | if (up->port.flags & UPF_FOURPORT) { | 2187 | if (up->port.flags & UPF_FOURPORT) { |
2189 | /* reset interrupts on the AST Fourport board */ | 2188 | /* reset interrupts on the AST Fourport board */ |
2190 | inb((up->port.iobase & 0xfe0) | 0x1f); | 2189 | inb((up->port.iobase & 0xfe0) | 0x1f); |
2191 | up->port.mctrl |= TIOCM_OUT1; | 2190 | up->port.mctrl |= TIOCM_OUT1; |
2192 | } else | 2191 | } else |
2193 | up->port.mctrl &= ~TIOCM_OUT2; | 2192 | up->port.mctrl &= ~TIOCM_OUT2; |
2194 | 2193 | ||
2195 | serial8250_set_mctrl(&up->port, up->port.mctrl); | 2194 | serial8250_set_mctrl(&up->port, up->port.mctrl); |
2196 | spin_unlock_irqrestore(&up->port.lock, flags); | 2195 | spin_unlock_irqrestore(&up->port.lock, flags); |
2197 | 2196 | ||
2198 | /* | 2197 | /* |
2199 | * Disable break condition and FIFOs | 2198 | * Disable break condition and FIFOs |
2200 | */ | 2199 | */ |
2201 | serial_out(up, UART_LCR, serial_inp(up, UART_LCR) & ~UART_LCR_SBC); | 2200 | serial_out(up, UART_LCR, serial_inp(up, UART_LCR) & ~UART_LCR_SBC); |
2202 | serial8250_clear_fifos(up); | 2201 | serial8250_clear_fifos(up); |
2203 | 2202 | ||
2204 | #ifdef CONFIG_SERIAL_8250_RSA | 2203 | #ifdef CONFIG_SERIAL_8250_RSA |
2205 | /* | 2204 | /* |
2206 | * Reset the RSA board back to 115kbps compat mode. | 2205 | * Reset the RSA board back to 115kbps compat mode. |
2207 | */ | 2206 | */ |
2208 | disable_rsa(up); | 2207 | disable_rsa(up); |
2209 | #endif | 2208 | #endif |
2210 | 2209 | ||
2211 | /* | 2210 | /* |
2212 | * Read data port to reset things, and then unlink from | 2211 | * Read data port to reset things, and then unlink from |
2213 | * the IRQ chain. | 2212 | * the IRQ chain. |
2214 | */ | 2213 | */ |
2215 | (void) serial_in(up, UART_RX); | 2214 | (void) serial_in(up, UART_RX); |
2216 | 2215 | ||
2217 | del_timer_sync(&up->timer); | 2216 | del_timer_sync(&up->timer); |
2218 | up->timer.function = serial8250_timeout; | 2217 | up->timer.function = serial8250_timeout; |
2219 | if (up->port.irq) | 2218 | if (up->port.irq) |
2220 | serial_unlink_irq_chain(up); | 2219 | serial_unlink_irq_chain(up); |
2221 | } | 2220 | } |
2222 | 2221 | ||
2223 | static unsigned int serial8250_get_divisor(struct uart_port *port, unsigned int baud) | 2222 | static unsigned int serial8250_get_divisor(struct uart_port *port, unsigned int baud) |
2224 | { | 2223 | { |
2225 | unsigned int quot; | 2224 | unsigned int quot; |
2226 | 2225 | ||
2227 | /* | 2226 | /* |
2228 | * Handle magic divisors for baud rates above baud_base on | 2227 | * Handle magic divisors for baud rates above baud_base on |
2229 | * SMSC SuperIO chips. | 2228 | * SMSC SuperIO chips. |
2230 | */ | 2229 | */ |
2231 | if ((port->flags & UPF_MAGIC_MULTIPLIER) && | 2230 | if ((port->flags & UPF_MAGIC_MULTIPLIER) && |
2232 | baud == (port->uartclk/4)) | 2231 | baud == (port->uartclk/4)) |
2233 | quot = 0x8001; | 2232 | quot = 0x8001; |
2234 | else if ((port->flags & UPF_MAGIC_MULTIPLIER) && | 2233 | else if ((port->flags & UPF_MAGIC_MULTIPLIER) && |
2235 | baud == (port->uartclk/8)) | 2234 | baud == (port->uartclk/8)) |
2236 | quot = 0x8002; | 2235 | quot = 0x8002; |
2237 | else | 2236 | else |
2238 | quot = uart_get_divisor(port, baud); | 2237 | quot = uart_get_divisor(port, baud); |
2239 | 2238 | ||
2240 | return quot; | 2239 | return quot; |
2241 | } | 2240 | } |
2242 | 2241 | ||
2243 | void | 2242 | void |
2244 | serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios, | 2243 | serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios, |
2245 | struct ktermios *old) | 2244 | struct ktermios *old) |
2246 | { | 2245 | { |
2247 | struct uart_8250_port *up = | 2246 | struct uart_8250_port *up = |
2248 | container_of(port, struct uart_8250_port, port); | 2247 | container_of(port, struct uart_8250_port, port); |
2249 | unsigned char cval, fcr = 0; | 2248 | unsigned char cval, fcr = 0; |
2250 | unsigned long flags; | 2249 | unsigned long flags; |
2251 | unsigned int baud, quot; | 2250 | unsigned int baud, quot; |
2252 | 2251 | ||
2253 | switch (termios->c_cflag & CSIZE) { | 2252 | switch (termios->c_cflag & CSIZE) { |
2254 | case CS5: | 2253 | case CS5: |
2255 | cval = UART_LCR_WLEN5; | 2254 | cval = UART_LCR_WLEN5; |
2256 | break; | 2255 | break; |
2257 | case CS6: | 2256 | case CS6: |
2258 | cval = UART_LCR_WLEN6; | 2257 | cval = UART_LCR_WLEN6; |
2259 | break; | 2258 | break; |
2260 | case CS7: | 2259 | case CS7: |
2261 | cval = UART_LCR_WLEN7; | 2260 | cval = UART_LCR_WLEN7; |
2262 | break; | 2261 | break; |
2263 | default: | 2262 | default: |
2264 | case CS8: | 2263 | case CS8: |
2265 | cval = UART_LCR_WLEN8; | 2264 | cval = UART_LCR_WLEN8; |
2266 | break; | 2265 | break; |
2267 | } | 2266 | } |
2268 | 2267 | ||
2269 | if (termios->c_cflag & CSTOPB) | 2268 | if (termios->c_cflag & CSTOPB) |
2270 | cval |= UART_LCR_STOP; | 2269 | cval |= UART_LCR_STOP; |
2271 | if (termios->c_cflag & PARENB) | 2270 | if (termios->c_cflag & PARENB) |
2272 | cval |= UART_LCR_PARITY; | 2271 | cval |= UART_LCR_PARITY; |
2273 | if (!(termios->c_cflag & PARODD)) | 2272 | if (!(termios->c_cflag & PARODD)) |
2274 | cval |= UART_LCR_EPAR; | 2273 | cval |= UART_LCR_EPAR; |
2275 | #ifdef CMSPAR | 2274 | #ifdef CMSPAR |
2276 | if (termios->c_cflag & CMSPAR) | 2275 | if (termios->c_cflag & CMSPAR) |
2277 | cval |= UART_LCR_SPAR; | 2276 | cval |= UART_LCR_SPAR; |
2278 | #endif | 2277 | #endif |
2279 | 2278 | ||
2280 | /* | 2279 | /* |
2281 | * Ask the core to calculate the divisor for us. | 2280 | * Ask the core to calculate the divisor for us. |
2282 | */ | 2281 | */ |
2283 | baud = uart_get_baud_rate(port, termios, old, | 2282 | baud = uart_get_baud_rate(port, termios, old, |
2284 | port->uartclk / 16 / 0xffff, | 2283 | port->uartclk / 16 / 0xffff, |
2285 | port->uartclk / 16); | 2284 | port->uartclk / 16); |
2286 | quot = serial8250_get_divisor(port, baud); | 2285 | quot = serial8250_get_divisor(port, baud); |
2287 | 2286 | ||
2288 | /* | 2287 | /* |
2289 | * Oxford Semi 952 rev B workaround | 2288 | * Oxford Semi 952 rev B workaround |
2290 | */ | 2289 | */ |
2291 | if (up->bugs & UART_BUG_QUOT && (quot & 0xff) == 0) | 2290 | if (up->bugs & UART_BUG_QUOT && (quot & 0xff) == 0) |
2292 | quot++; | 2291 | quot++; |
2293 | 2292 | ||
2294 | if (up->capabilities & UART_CAP_FIFO && up->port.fifosize > 1) { | 2293 | if (up->capabilities & UART_CAP_FIFO && up->port.fifosize > 1) { |
2295 | if (baud < 2400) | 2294 | if (baud < 2400) |
2296 | fcr = UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_1; | 2295 | fcr = UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_1; |
2297 | else | 2296 | else |
2298 | fcr = uart_config[up->port.type].fcr; | 2297 | fcr = uart_config[up->port.type].fcr; |
2299 | } | 2298 | } |
2300 | 2299 | ||
2301 | /* | 2300 | /* |
2302 | * MCR-based auto flow control. When AFE is enabled, RTS will be | 2301 | * MCR-based auto flow control. When AFE is enabled, RTS will be |
2303 | * deasserted when the receive FIFO contains more characters than | 2302 | * deasserted when the receive FIFO contains more characters than |
2304 | * the trigger, or the MCR RTS bit is cleared. In the case where | 2303 | * the trigger, or the MCR RTS bit is cleared. In the case where |
2305 | * the remote UART is not using CTS auto flow control, we must | 2304 | * the remote UART is not using CTS auto flow control, we must |
2306 | * have sufficient FIFO entries for the latency of the remote | 2305 | * have sufficient FIFO entries for the latency of the remote |
2307 | * UART to respond. IOW, at least 32 bytes of FIFO. | 2306 | * UART to respond. IOW, at least 32 bytes of FIFO. |
2308 | */ | 2307 | */ |
2309 | if (up->capabilities & UART_CAP_AFE && up->port.fifosize >= 32) { | 2308 | if (up->capabilities & UART_CAP_AFE && up->port.fifosize >= 32) { |
2310 | up->mcr &= ~UART_MCR_AFE; | 2309 | up->mcr &= ~UART_MCR_AFE; |
2311 | if (termios->c_cflag & CRTSCTS) | 2310 | if (termios->c_cflag & CRTSCTS) |
2312 | up->mcr |= UART_MCR_AFE; | 2311 | up->mcr |= UART_MCR_AFE; |
2313 | } | 2312 | } |
2314 | 2313 | ||
2315 | /* | 2314 | /* |
2316 | * Ok, we're now changing the port state. Do it with | 2315 | * Ok, we're now changing the port state. Do it with |
2317 | * interrupts disabled. | 2316 | * interrupts disabled. |
2318 | */ | 2317 | */ |
2319 | spin_lock_irqsave(&up->port.lock, flags); | 2318 | spin_lock_irqsave(&up->port.lock, flags); |
2320 | 2319 | ||
2321 | /* | 2320 | /* |
2322 | * Update the per-port timeout. | 2321 | * Update the per-port timeout. |
2323 | */ | 2322 | */ |
2324 | uart_update_timeout(port, termios->c_cflag, baud); | 2323 | uart_update_timeout(port, termios->c_cflag, baud); |
2325 | 2324 | ||
2326 | up->port.read_status_mask = UART_LSR_OE | UART_LSR_THRE | UART_LSR_DR; | 2325 | up->port.read_status_mask = UART_LSR_OE | UART_LSR_THRE | UART_LSR_DR; |
2327 | if (termios->c_iflag & INPCK) | 2326 | if (termios->c_iflag & INPCK) |
2328 | up->port.read_status_mask |= UART_LSR_FE | UART_LSR_PE; | 2327 | up->port.read_status_mask |= UART_LSR_FE | UART_LSR_PE; |
2329 | if (termios->c_iflag & (BRKINT | PARMRK)) | 2328 | if (termios->c_iflag & (BRKINT | PARMRK)) |
2330 | up->port.read_status_mask |= UART_LSR_BI; | 2329 | up->port.read_status_mask |= UART_LSR_BI; |
2331 | 2330 | ||
2332 | /* | 2331 | /* |
2333 | * Characteres to ignore | 2332 | * Characteres to ignore |
2334 | */ | 2333 | */ |
2335 | up->port.ignore_status_mask = 0; | 2334 | up->port.ignore_status_mask = 0; |
2336 | if (termios->c_iflag & IGNPAR) | 2335 | if (termios->c_iflag & IGNPAR) |
2337 | up->port.ignore_status_mask |= UART_LSR_PE | UART_LSR_FE; | 2336 | up->port.ignore_status_mask |= UART_LSR_PE | UART_LSR_FE; |
2338 | if (termios->c_iflag & IGNBRK) { | 2337 | if (termios->c_iflag & IGNBRK) { |
2339 | up->port.ignore_status_mask |= UART_LSR_BI; | 2338 | up->port.ignore_status_mask |= UART_LSR_BI; |
2340 | /* | 2339 | /* |
2341 | * If we're ignoring parity and break indicators, | 2340 | * If we're ignoring parity and break indicators, |
2342 | * ignore overruns too (for real raw support). | 2341 | * ignore overruns too (for real raw support). |
2343 | */ | 2342 | */ |
2344 | if (termios->c_iflag & IGNPAR) | 2343 | if (termios->c_iflag & IGNPAR) |
2345 | up->port.ignore_status_mask |= UART_LSR_OE; | 2344 | up->port.ignore_status_mask |= UART_LSR_OE; |
2346 | } | 2345 | } |
2347 | 2346 | ||
2348 | /* | 2347 | /* |
2349 | * ignore all characters if CREAD is not set | 2348 | * ignore all characters if CREAD is not set |
2350 | */ | 2349 | */ |
2351 | if ((termios->c_cflag & CREAD) == 0) | 2350 | if ((termios->c_cflag & CREAD) == 0) |
2352 | up->port.ignore_status_mask |= UART_LSR_DR; | 2351 | up->port.ignore_status_mask |= UART_LSR_DR; |
2353 | 2352 | ||
2354 | /* | 2353 | /* |
2355 | * CTS flow control flag and modem status interrupts | 2354 | * CTS flow control flag and modem status interrupts |
2356 | */ | 2355 | */ |
2357 | up->ier &= ~UART_IER_MSI; | 2356 | up->ier &= ~UART_IER_MSI; |
2358 | if (!(up->bugs & UART_BUG_NOMSR) && | 2357 | if (!(up->bugs & UART_BUG_NOMSR) && |
2359 | UART_ENABLE_MS(&up->port, termios->c_cflag)) | 2358 | UART_ENABLE_MS(&up->port, termios->c_cflag)) |
2360 | up->ier |= UART_IER_MSI; | 2359 | up->ier |= UART_IER_MSI; |
2361 | if (up->capabilities & UART_CAP_UUE) | 2360 | if (up->capabilities & UART_CAP_UUE) |
2362 | up->ier |= UART_IER_UUE; | 2361 | up->ier |= UART_IER_UUE; |
2363 | if (up->capabilities & UART_CAP_RTOIE) | 2362 | if (up->capabilities & UART_CAP_RTOIE) |
2364 | up->ier |= UART_IER_RTOIE; | 2363 | up->ier |= UART_IER_RTOIE; |
2365 | 2364 | ||
2366 | serial_out(up, UART_IER, up->ier); | 2365 | serial_out(up, UART_IER, up->ier); |
2367 | 2366 | ||
2368 | if (up->capabilities & UART_CAP_EFR) { | 2367 | if (up->capabilities & UART_CAP_EFR) { |
2369 | unsigned char efr = 0; | 2368 | unsigned char efr = 0; |
2370 | /* | 2369 | /* |
2371 | * TI16C752/Startech hardware flow control. FIXME: | 2370 | * TI16C752/Startech hardware flow control. FIXME: |
2372 | * - TI16C752 requires control thresholds to be set. | 2371 | * - TI16C752 requires control thresholds to be set. |
2373 | * - UART_MCR_RTS is ineffective if auto-RTS mode is enabled. | 2372 | * - UART_MCR_RTS is ineffective if auto-RTS mode is enabled. |
2374 | */ | 2373 | */ |
2375 | if (termios->c_cflag & CRTSCTS) | 2374 | if (termios->c_cflag & CRTSCTS) |
2376 | efr |= UART_EFR_CTS; | 2375 | efr |= UART_EFR_CTS; |
2377 | 2376 | ||
2378 | serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_B); | 2377 | serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_B); |
2379 | if (up->port.flags & UPF_EXAR_EFR) | 2378 | if (up->port.flags & UPF_EXAR_EFR) |
2380 | serial_outp(up, UART_XR_EFR, efr); | 2379 | serial_outp(up, UART_XR_EFR, efr); |
2381 | else | 2380 | else |
2382 | serial_outp(up, UART_EFR, efr); | 2381 | serial_outp(up, UART_EFR, efr); |
2383 | } | 2382 | } |
2384 | 2383 | ||
2385 | #ifdef CONFIG_ARCH_OMAP | 2384 | #ifdef CONFIG_ARCH_OMAP |
2386 | /* Workaround to enable 115200 baud on OMAP1510 internal ports */ | 2385 | /* Workaround to enable 115200 baud on OMAP1510 internal ports */ |
2387 | if (cpu_is_omap1510() && is_omap_port(up)) { | 2386 | if (cpu_is_omap1510() && is_omap_port(up)) { |
2388 | if (baud == 115200) { | 2387 | if (baud == 115200) { |
2389 | quot = 1; | 2388 | quot = 1; |
2390 | serial_out(up, UART_OMAP_OSC_12M_SEL, 1); | 2389 | serial_out(up, UART_OMAP_OSC_12M_SEL, 1); |
2391 | } else | 2390 | } else |
2392 | serial_out(up, UART_OMAP_OSC_12M_SEL, 0); | 2391 | serial_out(up, UART_OMAP_OSC_12M_SEL, 0); |
2393 | } | 2392 | } |
2394 | #endif | 2393 | #endif |
2395 | 2394 | ||
2396 | if (up->capabilities & UART_NATSEMI) { | 2395 | if (up->capabilities & UART_NATSEMI) { |
2397 | /* Switch to bank 2 not bank 1, to avoid resetting EXCR2 */ | 2396 | /* Switch to bank 2 not bank 1, to avoid resetting EXCR2 */ |
2398 | serial_outp(up, UART_LCR, 0xe0); | 2397 | serial_outp(up, UART_LCR, 0xe0); |
2399 | } else { | 2398 | } else { |
2400 | serial_outp(up, UART_LCR, cval | UART_LCR_DLAB);/* set DLAB */ | 2399 | serial_outp(up, UART_LCR, cval | UART_LCR_DLAB);/* set DLAB */ |
2401 | } | 2400 | } |
2402 | 2401 | ||
2403 | serial_dl_write(up, quot); | 2402 | serial_dl_write(up, quot); |
2404 | 2403 | ||
2405 | /* | 2404 | /* |
2406 | * LCR DLAB must be set to enable 64-byte FIFO mode. If the FCR | 2405 | * LCR DLAB must be set to enable 64-byte FIFO mode. If the FCR |
2407 | * is written without DLAB set, this mode will be disabled. | 2406 | * is written without DLAB set, this mode will be disabled. |
2408 | */ | 2407 | */ |
2409 | if (up->port.type == PORT_16750) | 2408 | if (up->port.type == PORT_16750) |
2410 | serial_outp(up, UART_FCR, fcr); | 2409 | serial_outp(up, UART_FCR, fcr); |
2411 | 2410 | ||
2412 | serial_outp(up, UART_LCR, cval); /* reset DLAB */ | 2411 | serial_outp(up, UART_LCR, cval); /* reset DLAB */ |
2413 | up->lcr = cval; /* Save LCR */ | 2412 | up->lcr = cval; /* Save LCR */ |
2414 | if (up->port.type != PORT_16750) { | 2413 | if (up->port.type != PORT_16750) { |
2415 | if (fcr & UART_FCR_ENABLE_FIFO) { | 2414 | if (fcr & UART_FCR_ENABLE_FIFO) { |
2416 | /* emulated UARTs (Lucent Venus 167x) need two steps */ | 2415 | /* emulated UARTs (Lucent Venus 167x) need two steps */ |
2417 | serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO); | 2416 | serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO); |
2418 | } | 2417 | } |
2419 | serial_outp(up, UART_FCR, fcr); /* set fcr */ | 2418 | serial_outp(up, UART_FCR, fcr); /* set fcr */ |
2420 | } | 2419 | } |
2421 | serial8250_set_mctrl(&up->port, up->port.mctrl); | 2420 | serial8250_set_mctrl(&up->port, up->port.mctrl); |
2422 | spin_unlock_irqrestore(&up->port.lock, flags); | 2421 | spin_unlock_irqrestore(&up->port.lock, flags); |
2423 | /* Don't rewrite B0 */ | 2422 | /* Don't rewrite B0 */ |
2424 | if (tty_termios_baud_rate(termios)) | 2423 | if (tty_termios_baud_rate(termios)) |
2425 | tty_termios_encode_baud_rate(termios, baud, baud); | 2424 | tty_termios_encode_baud_rate(termios, baud, baud); |
2426 | } | 2425 | } |
2427 | EXPORT_SYMBOL(serial8250_do_set_termios); | 2426 | EXPORT_SYMBOL(serial8250_do_set_termios); |
2428 | 2427 | ||
2429 | static void | 2428 | static void |
2430 | serial8250_set_termios(struct uart_port *port, struct ktermios *termios, | 2429 | serial8250_set_termios(struct uart_port *port, struct ktermios *termios, |
2431 | struct ktermios *old) | 2430 | struct ktermios *old) |
2432 | { | 2431 | { |
2433 | if (port->set_termios) | 2432 | if (port->set_termios) |
2434 | port->set_termios(port, termios, old); | 2433 | port->set_termios(port, termios, old); |
2435 | else | 2434 | else |
2436 | serial8250_do_set_termios(port, termios, old); | 2435 | serial8250_do_set_termios(port, termios, old); |
2437 | } | 2436 | } |
2438 | 2437 | ||
2439 | static void | 2438 | static void |
2440 | serial8250_set_ldisc(struct uart_port *port, int new) | 2439 | serial8250_set_ldisc(struct uart_port *port, int new) |
2441 | { | 2440 | { |
2442 | if (new == N_PPS) { | 2441 | if (new == N_PPS) { |
2443 | port->flags |= UPF_HARDPPS_CD; | 2442 | port->flags |= UPF_HARDPPS_CD; |
2444 | serial8250_enable_ms(port); | 2443 | serial8250_enable_ms(port); |
2445 | } else | 2444 | } else |
2446 | port->flags &= ~UPF_HARDPPS_CD; | 2445 | port->flags &= ~UPF_HARDPPS_CD; |
2447 | } | 2446 | } |
2448 | 2447 | ||
2449 | 2448 | ||
2450 | void serial8250_do_pm(struct uart_port *port, unsigned int state, | 2449 | void serial8250_do_pm(struct uart_port *port, unsigned int state, |
2451 | unsigned int oldstate) | 2450 | unsigned int oldstate) |
2452 | { | 2451 | { |
2453 | struct uart_8250_port *p = | 2452 | struct uart_8250_port *p = |
2454 | container_of(port, struct uart_8250_port, port); | 2453 | container_of(port, struct uart_8250_port, port); |
2455 | 2454 | ||
2456 | serial8250_set_sleep(p, state != 0); | 2455 | serial8250_set_sleep(p, state != 0); |
2457 | } | 2456 | } |
2458 | EXPORT_SYMBOL(serial8250_do_pm); | 2457 | EXPORT_SYMBOL(serial8250_do_pm); |
2459 | 2458 | ||
2460 | static void | 2459 | static void |
2461 | serial8250_pm(struct uart_port *port, unsigned int state, | 2460 | serial8250_pm(struct uart_port *port, unsigned int state, |
2462 | unsigned int oldstate) | 2461 | unsigned int oldstate) |
2463 | { | 2462 | { |
2464 | if (port->pm) | 2463 | if (port->pm) |
2465 | port->pm(port, state, oldstate); | 2464 | port->pm(port, state, oldstate); |
2466 | else | 2465 | else |
2467 | serial8250_do_pm(port, state, oldstate); | 2466 | serial8250_do_pm(port, state, oldstate); |
2468 | } | 2467 | } |
2469 | 2468 | ||
2470 | static unsigned int serial8250_port_size(struct uart_8250_port *pt) | 2469 | static unsigned int serial8250_port_size(struct uart_8250_port *pt) |
2471 | { | 2470 | { |
2472 | if (pt->port.iotype == UPIO_AU) | 2471 | if (pt->port.iotype == UPIO_AU) |
2473 | return 0x1000; | 2472 | return 0x1000; |
2474 | #ifdef CONFIG_ARCH_OMAP | 2473 | #ifdef CONFIG_ARCH_OMAP |
2475 | if (is_omap_port(pt)) | 2474 | if (is_omap_port(pt)) |
2476 | return 0x16 << pt->port.regshift; | 2475 | return 0x16 << pt->port.regshift; |
2477 | #endif | 2476 | #endif |
2478 | return 8 << pt->port.regshift; | 2477 | return 8 << pt->port.regshift; |
2479 | } | 2478 | } |
2480 | 2479 | ||
2481 | /* | 2480 | /* |
2482 | * Resource handling. | 2481 | * Resource handling. |
2483 | */ | 2482 | */ |
2484 | static int serial8250_request_std_resource(struct uart_8250_port *up) | 2483 | static int serial8250_request_std_resource(struct uart_8250_port *up) |
2485 | { | 2484 | { |
2486 | unsigned int size = serial8250_port_size(up); | 2485 | unsigned int size = serial8250_port_size(up); |
2487 | int ret = 0; | 2486 | int ret = 0; |
2488 | 2487 | ||
2489 | switch (up->port.iotype) { | 2488 | switch (up->port.iotype) { |
2490 | case UPIO_AU: | 2489 | case UPIO_AU: |
2491 | case UPIO_TSI: | 2490 | case UPIO_TSI: |
2492 | case UPIO_MEM32: | 2491 | case UPIO_MEM32: |
2493 | case UPIO_MEM: | 2492 | case UPIO_MEM: |
2494 | if (!up->port.mapbase) | 2493 | if (!up->port.mapbase) |
2495 | break; | 2494 | break; |
2496 | 2495 | ||
2497 | if (!request_mem_region(up->port.mapbase, size, "serial")) { | 2496 | if (!request_mem_region(up->port.mapbase, size, "serial")) { |
2498 | ret = -EBUSY; | 2497 | ret = -EBUSY; |
2499 | break; | 2498 | break; |
2500 | } | 2499 | } |
2501 | 2500 | ||
2502 | if (up->port.flags & UPF_IOREMAP) { | 2501 | if (up->port.flags & UPF_IOREMAP) { |
2503 | up->port.membase = ioremap_nocache(up->port.mapbase, | 2502 | up->port.membase = ioremap_nocache(up->port.mapbase, |
2504 | size); | 2503 | size); |
2505 | if (!up->port.membase) { | 2504 | if (!up->port.membase) { |
2506 | release_mem_region(up->port.mapbase, size); | 2505 | release_mem_region(up->port.mapbase, size); |
2507 | ret = -ENOMEM; | 2506 | ret = -ENOMEM; |
2508 | } | 2507 | } |
2509 | } | 2508 | } |
2510 | break; | 2509 | break; |
2511 | 2510 | ||
2512 | case UPIO_HUB6: | 2511 | case UPIO_HUB6: |
2513 | case UPIO_PORT: | 2512 | case UPIO_PORT: |
2514 | if (!request_region(up->port.iobase, size, "serial")) | 2513 | if (!request_region(up->port.iobase, size, "serial")) |
2515 | ret = -EBUSY; | 2514 | ret = -EBUSY; |
2516 | break; | 2515 | break; |
2517 | } | 2516 | } |
2518 | return ret; | 2517 | return ret; |
2519 | } | 2518 | } |
2520 | 2519 | ||
2521 | static void serial8250_release_std_resource(struct uart_8250_port *up) | 2520 | static void serial8250_release_std_resource(struct uart_8250_port *up) |
2522 | { | 2521 | { |
2523 | unsigned int size = serial8250_port_size(up); | 2522 | unsigned int size = serial8250_port_size(up); |
2524 | 2523 | ||
2525 | switch (up->port.iotype) { | 2524 | switch (up->port.iotype) { |
2526 | case UPIO_AU: | 2525 | case UPIO_AU: |
2527 | case UPIO_TSI: | 2526 | case UPIO_TSI: |
2528 | case UPIO_MEM32: | 2527 | case UPIO_MEM32: |
2529 | case UPIO_MEM: | 2528 | case UPIO_MEM: |
2530 | if (!up->port.mapbase) | 2529 | if (!up->port.mapbase) |
2531 | break; | 2530 | break; |
2532 | 2531 | ||
2533 | if (up->port.flags & UPF_IOREMAP) { | 2532 | if (up->port.flags & UPF_IOREMAP) { |
2534 | iounmap(up->port.membase); | 2533 | iounmap(up->port.membase); |
2535 | up->port.membase = NULL; | 2534 | up->port.membase = NULL; |
2536 | } | 2535 | } |
2537 | 2536 | ||
2538 | release_mem_region(up->port.mapbase, size); | 2537 | release_mem_region(up->port.mapbase, size); |
2539 | break; | 2538 | break; |
2540 | 2539 | ||
2541 | case UPIO_HUB6: | 2540 | case UPIO_HUB6: |
2542 | case UPIO_PORT: | 2541 | case UPIO_PORT: |
2543 | release_region(up->port.iobase, size); | 2542 | release_region(up->port.iobase, size); |
2544 | break; | 2543 | break; |
2545 | } | 2544 | } |
2546 | } | 2545 | } |
2547 | 2546 | ||
2548 | static int serial8250_request_rsa_resource(struct uart_8250_port *up) | 2547 | static int serial8250_request_rsa_resource(struct uart_8250_port *up) |
2549 | { | 2548 | { |
2550 | unsigned long start = UART_RSA_BASE << up->port.regshift; | 2549 | unsigned long start = UART_RSA_BASE << up->port.regshift; |
2551 | unsigned int size = 8 << up->port.regshift; | 2550 | unsigned int size = 8 << up->port.regshift; |
2552 | int ret = -EINVAL; | 2551 | int ret = -EINVAL; |
2553 | 2552 | ||
2554 | switch (up->port.iotype) { | 2553 | switch (up->port.iotype) { |
2555 | case UPIO_HUB6: | 2554 | case UPIO_HUB6: |
2556 | case UPIO_PORT: | 2555 | case UPIO_PORT: |
2557 | start += up->port.iobase; | 2556 | start += up->port.iobase; |
2558 | if (request_region(start, size, "serial-rsa")) | 2557 | if (request_region(start, size, "serial-rsa")) |
2559 | ret = 0; | 2558 | ret = 0; |
2560 | else | 2559 | else |
2561 | ret = -EBUSY; | 2560 | ret = -EBUSY; |
2562 | break; | 2561 | break; |
2563 | } | 2562 | } |
2564 | 2563 | ||
2565 | return ret; | 2564 | return ret; |
2566 | } | 2565 | } |
2567 | 2566 | ||
2568 | static void serial8250_release_rsa_resource(struct uart_8250_port *up) | 2567 | static void serial8250_release_rsa_resource(struct uart_8250_port *up) |
2569 | { | 2568 | { |
2570 | unsigned long offset = UART_RSA_BASE << up->port.regshift; | 2569 | unsigned long offset = UART_RSA_BASE << up->port.regshift; |
2571 | unsigned int size = 8 << up->port.regshift; | 2570 | unsigned int size = 8 << up->port.regshift; |
2572 | 2571 | ||
2573 | switch (up->port.iotype) { | 2572 | switch (up->port.iotype) { |
2574 | case UPIO_HUB6: | 2573 | case UPIO_HUB6: |
2575 | case UPIO_PORT: | 2574 | case UPIO_PORT: |
2576 | release_region(up->port.iobase + offset, size); | 2575 | release_region(up->port.iobase + offset, size); |
2577 | break; | 2576 | break; |
2578 | } | 2577 | } |
2579 | } | 2578 | } |
2580 | 2579 | ||
2581 | static void serial8250_release_port(struct uart_port *port) | 2580 | static void serial8250_release_port(struct uart_port *port) |
2582 | { | 2581 | { |
2583 | struct uart_8250_port *up = | 2582 | struct uart_8250_port *up = |
2584 | container_of(port, struct uart_8250_port, port); | 2583 | container_of(port, struct uart_8250_port, port); |
2585 | 2584 | ||
2586 | serial8250_release_std_resource(up); | 2585 | serial8250_release_std_resource(up); |
2587 | if (up->port.type == PORT_RSA) | 2586 | if (up->port.type == PORT_RSA) |
2588 | serial8250_release_rsa_resource(up); | 2587 | serial8250_release_rsa_resource(up); |
2589 | } | 2588 | } |
2590 | 2589 | ||
2591 | static int serial8250_request_port(struct uart_port *port) | 2590 | static int serial8250_request_port(struct uart_port *port) |
2592 | { | 2591 | { |
2593 | struct uart_8250_port *up = | 2592 | struct uart_8250_port *up = |
2594 | container_of(port, struct uart_8250_port, port); | 2593 | container_of(port, struct uart_8250_port, port); |
2595 | int ret = 0; | 2594 | int ret = 0; |
2596 | 2595 | ||
2597 | ret = serial8250_request_std_resource(up); | 2596 | ret = serial8250_request_std_resource(up); |
2598 | if (ret == 0 && up->port.type == PORT_RSA) { | 2597 | if (ret == 0 && up->port.type == PORT_RSA) { |
2599 | ret = serial8250_request_rsa_resource(up); | 2598 | ret = serial8250_request_rsa_resource(up); |
2600 | if (ret < 0) | 2599 | if (ret < 0) |
2601 | serial8250_release_std_resource(up); | 2600 | serial8250_release_std_resource(up); |
2602 | } | 2601 | } |
2603 | 2602 | ||
2604 | return ret; | 2603 | return ret; |
2605 | } | 2604 | } |
2606 | 2605 | ||
2607 | static void serial8250_config_port(struct uart_port *port, int flags) | 2606 | static void serial8250_config_port(struct uart_port *port, int flags) |
2608 | { | 2607 | { |
2609 | struct uart_8250_port *up = | 2608 | struct uart_8250_port *up = |
2610 | container_of(port, struct uart_8250_port, port); | 2609 | container_of(port, struct uart_8250_port, port); |
2611 | int probeflags = PROBE_ANY; | 2610 | int probeflags = PROBE_ANY; |
2612 | int ret; | 2611 | int ret; |
2613 | 2612 | ||
2614 | /* | 2613 | /* |
2615 | * Find the region that we can probe for. This in turn | 2614 | * Find the region that we can probe for. This in turn |
2616 | * tells us whether we can probe for the type of port. | 2615 | * tells us whether we can probe for the type of port. |
2617 | */ | 2616 | */ |
2618 | ret = serial8250_request_std_resource(up); | 2617 | ret = serial8250_request_std_resource(up); |
2619 | if (ret < 0) | 2618 | if (ret < 0) |
2620 | return; | 2619 | return; |
2621 | 2620 | ||
2622 | ret = serial8250_request_rsa_resource(up); | 2621 | ret = serial8250_request_rsa_resource(up); |
2623 | if (ret < 0) | 2622 | if (ret < 0) |
2624 | probeflags &= ~PROBE_RSA; | 2623 | probeflags &= ~PROBE_RSA; |
2625 | 2624 | ||
2626 | if (up->port.iotype != up->cur_iotype) | 2625 | if (up->port.iotype != up->cur_iotype) |
2627 | set_io_from_upio(port); | 2626 | set_io_from_upio(port); |
2628 | 2627 | ||
2629 | if (flags & UART_CONFIG_TYPE) | 2628 | if (flags & UART_CONFIG_TYPE) |
2630 | autoconfig(up, probeflags); | 2629 | autoconfig(up, probeflags); |
2631 | 2630 | ||
2632 | /* if access method is AU, it is a 16550 with a quirk */ | 2631 | /* if access method is AU, it is a 16550 with a quirk */ |
2633 | if (up->port.type == PORT_16550A && up->port.iotype == UPIO_AU) | 2632 | if (up->port.type == PORT_16550A && up->port.iotype == UPIO_AU) |
2634 | up->bugs |= UART_BUG_NOMSR; | 2633 | up->bugs |= UART_BUG_NOMSR; |
2635 | 2634 | ||
2636 | if (up->port.type != PORT_UNKNOWN && flags & UART_CONFIG_IRQ) | 2635 | if (up->port.type != PORT_UNKNOWN && flags & UART_CONFIG_IRQ) |
2637 | autoconfig_irq(up); | 2636 | autoconfig_irq(up); |
2638 | 2637 | ||
2639 | if (up->port.type != PORT_RSA && probeflags & PROBE_RSA) | 2638 | if (up->port.type != PORT_RSA && probeflags & PROBE_RSA) |
2640 | serial8250_release_rsa_resource(up); | 2639 | serial8250_release_rsa_resource(up); |
2641 | if (up->port.type == PORT_UNKNOWN) | 2640 | if (up->port.type == PORT_UNKNOWN) |
2642 | serial8250_release_std_resource(up); | 2641 | serial8250_release_std_resource(up); |
2643 | } | 2642 | } |
2644 | 2643 | ||
2645 | static int | 2644 | static int |
2646 | serial8250_verify_port(struct uart_port *port, struct serial_struct *ser) | 2645 | serial8250_verify_port(struct uart_port *port, struct serial_struct *ser) |
2647 | { | 2646 | { |
2648 | if (ser->irq >= nr_irqs || ser->irq < 0 || | 2647 | if (ser->irq >= nr_irqs || ser->irq < 0 || |
2649 | ser->baud_base < 9600 || ser->type < PORT_UNKNOWN || | 2648 | ser->baud_base < 9600 || ser->type < PORT_UNKNOWN || |
2650 | ser->type >= ARRAY_SIZE(uart_config) || ser->type == PORT_CIRRUS || | 2649 | ser->type >= ARRAY_SIZE(uart_config) || ser->type == PORT_CIRRUS || |
2651 | ser->type == PORT_STARTECH) | 2650 | ser->type == PORT_STARTECH) |
2652 | return -EINVAL; | 2651 | return -EINVAL; |
2653 | return 0; | 2652 | return 0; |
2654 | } | 2653 | } |
2655 | 2654 | ||
2656 | static const char * | 2655 | static const char * |
2657 | serial8250_type(struct uart_port *port) | 2656 | serial8250_type(struct uart_port *port) |
2658 | { | 2657 | { |
2659 | int type = port->type; | 2658 | int type = port->type; |
2660 | 2659 | ||
2661 | if (type >= ARRAY_SIZE(uart_config)) | 2660 | if (type >= ARRAY_SIZE(uart_config)) |
2662 | type = 0; | 2661 | type = 0; |
2663 | return uart_config[type].name; | 2662 | return uart_config[type].name; |
2664 | } | 2663 | } |
2665 | 2664 | ||
2666 | static struct uart_ops serial8250_pops = { | 2665 | static struct uart_ops serial8250_pops = { |
2667 | .tx_empty = serial8250_tx_empty, | 2666 | .tx_empty = serial8250_tx_empty, |
2668 | .set_mctrl = serial8250_set_mctrl, | 2667 | .set_mctrl = serial8250_set_mctrl, |
2669 | .get_mctrl = serial8250_get_mctrl, | 2668 | .get_mctrl = serial8250_get_mctrl, |
2670 | .stop_tx = serial8250_stop_tx, | 2669 | .stop_tx = serial8250_stop_tx, |
2671 | .start_tx = serial8250_start_tx, | 2670 | .start_tx = serial8250_start_tx, |
2672 | .stop_rx = serial8250_stop_rx, | 2671 | .stop_rx = serial8250_stop_rx, |
2673 | .enable_ms = serial8250_enable_ms, | 2672 | .enable_ms = serial8250_enable_ms, |
2674 | .break_ctl = serial8250_break_ctl, | 2673 | .break_ctl = serial8250_break_ctl, |
2675 | .startup = serial8250_startup, | 2674 | .startup = serial8250_startup, |
2676 | .shutdown = serial8250_shutdown, | 2675 | .shutdown = serial8250_shutdown, |
2677 | .set_termios = serial8250_set_termios, | 2676 | .set_termios = serial8250_set_termios, |
2678 | .set_ldisc = serial8250_set_ldisc, | 2677 | .set_ldisc = serial8250_set_ldisc, |
2679 | .pm = serial8250_pm, | 2678 | .pm = serial8250_pm, |
2680 | .type = serial8250_type, | 2679 | .type = serial8250_type, |
2681 | .release_port = serial8250_release_port, | 2680 | .release_port = serial8250_release_port, |
2682 | .request_port = serial8250_request_port, | 2681 | .request_port = serial8250_request_port, |
2683 | .config_port = serial8250_config_port, | 2682 | .config_port = serial8250_config_port, |
2684 | .verify_port = serial8250_verify_port, | 2683 | .verify_port = serial8250_verify_port, |
2685 | #ifdef CONFIG_CONSOLE_POLL | 2684 | #ifdef CONFIG_CONSOLE_POLL |
2686 | .poll_get_char = serial8250_get_poll_char, | 2685 | .poll_get_char = serial8250_get_poll_char, |
2687 | .poll_put_char = serial8250_put_poll_char, | 2686 | .poll_put_char = serial8250_put_poll_char, |
2688 | #endif | 2687 | #endif |
2689 | }; | 2688 | }; |
2690 | 2689 | ||
2691 | static struct uart_8250_port serial8250_ports[UART_NR]; | 2690 | static struct uart_8250_port serial8250_ports[UART_NR]; |
2692 | 2691 | ||
2693 | static void (*serial8250_isa_config)(int port, struct uart_port *up, | 2692 | static void (*serial8250_isa_config)(int port, struct uart_port *up, |
2694 | unsigned short *capabilities); | 2693 | unsigned short *capabilities); |
2695 | 2694 | ||
2696 | void serial8250_set_isa_configurator( | 2695 | void serial8250_set_isa_configurator( |
2697 | void (*v)(int port, struct uart_port *up, unsigned short *capabilities)) | 2696 | void (*v)(int port, struct uart_port *up, unsigned short *capabilities)) |
2698 | { | 2697 | { |
2699 | serial8250_isa_config = v; | 2698 | serial8250_isa_config = v; |
2700 | } | 2699 | } |
2701 | EXPORT_SYMBOL(serial8250_set_isa_configurator); | 2700 | EXPORT_SYMBOL(serial8250_set_isa_configurator); |
2702 | 2701 | ||
2703 | static void __init serial8250_isa_init_ports(void) | 2702 | static void __init serial8250_isa_init_ports(void) |
2704 | { | 2703 | { |
2705 | struct uart_8250_port *up; | 2704 | struct uart_8250_port *up; |
2706 | static int first = 1; | 2705 | static int first = 1; |
2707 | int i, irqflag = 0; | 2706 | int i, irqflag = 0; |
2708 | 2707 | ||
2709 | if (!first) | 2708 | if (!first) |
2710 | return; | 2709 | return; |
2711 | first = 0; | 2710 | first = 0; |
2712 | 2711 | ||
2713 | for (i = 0; i < nr_uarts; i++) { | 2712 | for (i = 0; i < nr_uarts; i++) { |
2714 | struct uart_8250_port *up = &serial8250_ports[i]; | 2713 | struct uart_8250_port *up = &serial8250_ports[i]; |
2715 | 2714 | ||
2716 | up->port.line = i; | 2715 | up->port.line = i; |
2717 | spin_lock_init(&up->port.lock); | 2716 | spin_lock_init(&up->port.lock); |
2718 | 2717 | ||
2719 | init_timer(&up->timer); | 2718 | init_timer(&up->timer); |
2720 | up->timer.function = serial8250_timeout; | 2719 | up->timer.function = serial8250_timeout; |
2721 | 2720 | ||
2722 | /* | 2721 | /* |
2723 | * ALPHA_KLUDGE_MCR needs to be killed. | 2722 | * ALPHA_KLUDGE_MCR needs to be killed. |
2724 | */ | 2723 | */ |
2725 | up->mcr_mask = ~ALPHA_KLUDGE_MCR; | 2724 | up->mcr_mask = ~ALPHA_KLUDGE_MCR; |
2726 | up->mcr_force = ALPHA_KLUDGE_MCR; | 2725 | up->mcr_force = ALPHA_KLUDGE_MCR; |
2727 | 2726 | ||
2728 | up->port.ops = &serial8250_pops; | 2727 | up->port.ops = &serial8250_pops; |
2729 | } | 2728 | } |
2730 | 2729 | ||
2731 | if (share_irqs) | 2730 | if (share_irqs) |
2732 | irqflag = IRQF_SHARED; | 2731 | irqflag = IRQF_SHARED; |
2733 | 2732 | ||
2734 | for (i = 0, up = serial8250_ports; | 2733 | for (i = 0, up = serial8250_ports; |
2735 | i < ARRAY_SIZE(old_serial_port) && i < nr_uarts; | 2734 | i < ARRAY_SIZE(old_serial_port) && i < nr_uarts; |
2736 | i++, up++) { | 2735 | i++, up++) { |
2737 | up->port.iobase = old_serial_port[i].port; | 2736 | up->port.iobase = old_serial_port[i].port; |
2738 | up->port.irq = irq_canonicalize(old_serial_port[i].irq); | 2737 | up->port.irq = irq_canonicalize(old_serial_port[i].irq); |
2739 | up->port.irqflags = old_serial_port[i].irqflags; | 2738 | up->port.irqflags = old_serial_port[i].irqflags; |
2740 | up->port.uartclk = old_serial_port[i].baud_base * 16; | 2739 | up->port.uartclk = old_serial_port[i].baud_base * 16; |
2741 | up->port.flags = old_serial_port[i].flags; | 2740 | up->port.flags = old_serial_port[i].flags; |
2742 | up->port.hub6 = old_serial_port[i].hub6; | 2741 | up->port.hub6 = old_serial_port[i].hub6; |
2743 | up->port.membase = old_serial_port[i].iomem_base; | 2742 | up->port.membase = old_serial_port[i].iomem_base; |
2744 | up->port.iotype = old_serial_port[i].io_type; | 2743 | up->port.iotype = old_serial_port[i].io_type; |
2745 | up->port.regshift = old_serial_port[i].iomem_reg_shift; | 2744 | up->port.regshift = old_serial_port[i].iomem_reg_shift; |
2746 | set_io_from_upio(&up->port); | 2745 | set_io_from_upio(&up->port); |
2747 | up->port.irqflags |= irqflag; | 2746 | up->port.irqflags |= irqflag; |
2748 | if (serial8250_isa_config != NULL) | 2747 | if (serial8250_isa_config != NULL) |
2749 | serial8250_isa_config(i, &up->port, &up->capabilities); | 2748 | serial8250_isa_config(i, &up->port, &up->capabilities); |
2750 | 2749 | ||
2751 | } | 2750 | } |
2752 | } | 2751 | } |
2753 | 2752 | ||
2754 | static void | 2753 | static void |
2755 | serial8250_init_fixed_type_port(struct uart_8250_port *up, unsigned int type) | 2754 | serial8250_init_fixed_type_port(struct uart_8250_port *up, unsigned int type) |
2756 | { | 2755 | { |
2757 | up->port.type = type; | 2756 | up->port.type = type; |
2758 | up->port.fifosize = uart_config[type].fifo_size; | 2757 | up->port.fifosize = uart_config[type].fifo_size; |
2759 | up->capabilities = uart_config[type].flags; | 2758 | up->capabilities = uart_config[type].flags; |
2760 | up->tx_loadsz = uart_config[type].tx_loadsz; | 2759 | up->tx_loadsz = uart_config[type].tx_loadsz; |
2761 | } | 2760 | } |
2762 | 2761 | ||
2763 | static void __init | 2762 | static void __init |
2764 | serial8250_register_ports(struct uart_driver *drv, struct device *dev) | 2763 | serial8250_register_ports(struct uart_driver *drv, struct device *dev) |
2765 | { | 2764 | { |
2766 | int i; | 2765 | int i; |
2767 | 2766 | ||
2768 | for (i = 0; i < nr_uarts; i++) { | 2767 | for (i = 0; i < nr_uarts; i++) { |
2769 | struct uart_8250_port *up = &serial8250_ports[i]; | 2768 | struct uart_8250_port *up = &serial8250_ports[i]; |
2770 | up->cur_iotype = 0xFF; | 2769 | up->cur_iotype = 0xFF; |
2771 | } | 2770 | } |
2772 | 2771 | ||
2773 | serial8250_isa_init_ports(); | 2772 | serial8250_isa_init_ports(); |
2774 | 2773 | ||
2775 | for (i = 0; i < nr_uarts; i++) { | 2774 | for (i = 0; i < nr_uarts; i++) { |
2776 | struct uart_8250_port *up = &serial8250_ports[i]; | 2775 | struct uart_8250_port *up = &serial8250_ports[i]; |
2777 | 2776 | ||
2778 | up->port.dev = dev; | 2777 | up->port.dev = dev; |
2779 | 2778 | ||
2780 | if (up->port.flags & UPF_FIXED_TYPE) | 2779 | if (up->port.flags & UPF_FIXED_TYPE) |
2781 | serial8250_init_fixed_type_port(up, up->port.type); | 2780 | serial8250_init_fixed_type_port(up, up->port.type); |
2782 | 2781 | ||
2783 | uart_add_one_port(drv, &up->port); | 2782 | uart_add_one_port(drv, &up->port); |
2784 | } | 2783 | } |
2785 | } | 2784 | } |
2786 | 2785 | ||
2787 | #ifdef CONFIG_SERIAL_8250_CONSOLE | 2786 | #ifdef CONFIG_SERIAL_8250_CONSOLE |
2788 | 2787 | ||
2789 | static void serial8250_console_putchar(struct uart_port *port, int ch) | 2788 | static void serial8250_console_putchar(struct uart_port *port, int ch) |
2790 | { | 2789 | { |
2791 | struct uart_8250_port *up = | 2790 | struct uart_8250_port *up = |
2792 | container_of(port, struct uart_8250_port, port); | 2791 | container_of(port, struct uart_8250_port, port); |
2793 | 2792 | ||
2794 | wait_for_xmitr(up, UART_LSR_THRE); | 2793 | wait_for_xmitr(up, UART_LSR_THRE); |
2795 | serial_out(up, UART_TX, ch); | 2794 | serial_out(up, UART_TX, ch); |
2796 | } | 2795 | } |
2797 | 2796 | ||
2798 | /* | 2797 | /* |
2799 | * Print a string to the serial port trying not to disturb | 2798 | * Print a string to the serial port trying not to disturb |
2800 | * any possible real use of the port... | 2799 | * any possible real use of the port... |
2801 | * | 2800 | * |
2802 | * The console_lock must be held when we get here. | 2801 | * The console_lock must be held when we get here. |
2803 | */ | 2802 | */ |
2804 | static void | 2803 | static void |
2805 | serial8250_console_write(struct console *co, const char *s, unsigned int count) | 2804 | serial8250_console_write(struct console *co, const char *s, unsigned int count) |
2806 | { | 2805 | { |
2807 | struct uart_8250_port *up = &serial8250_ports[co->index]; | 2806 | struct uart_8250_port *up = &serial8250_ports[co->index]; |
2808 | unsigned long flags; | 2807 | unsigned long flags; |
2809 | unsigned int ier; | 2808 | unsigned int ier; |
2810 | int locked = 1; | 2809 | int locked = 1; |
2811 | 2810 | ||
2812 | touch_nmi_watchdog(); | 2811 | touch_nmi_watchdog(); |
2813 | 2812 | ||
2814 | local_irq_save(flags); | 2813 | local_irq_save(flags); |
2815 | if (up->port.sysrq) { | 2814 | if (up->port.sysrq) { |
2816 | /* serial8250_handle_irq() already took the lock */ | 2815 | /* serial8250_handle_irq() already took the lock */ |
2817 | locked = 0; | 2816 | locked = 0; |
2818 | } else if (oops_in_progress) { | 2817 | } else if (oops_in_progress) { |
2819 | locked = spin_trylock(&up->port.lock); | 2818 | locked = spin_trylock(&up->port.lock); |
2820 | } else | 2819 | } else |
2821 | spin_lock(&up->port.lock); | 2820 | spin_lock(&up->port.lock); |
2822 | 2821 | ||
2823 | /* | 2822 | /* |
2824 | * First save the IER then disable the interrupts | 2823 | * First save the IER then disable the interrupts |
2825 | */ | 2824 | */ |
2826 | ier = serial_in(up, UART_IER); | 2825 | ier = serial_in(up, UART_IER); |
2827 | 2826 | ||
2828 | if (up->capabilities & UART_CAP_UUE) | 2827 | if (up->capabilities & UART_CAP_UUE) |
2829 | serial_out(up, UART_IER, UART_IER_UUE); | 2828 | serial_out(up, UART_IER, UART_IER_UUE); |
2830 | else | 2829 | else |
2831 | serial_out(up, UART_IER, 0); | 2830 | serial_out(up, UART_IER, 0); |
2832 | 2831 | ||
2833 | uart_console_write(&up->port, s, count, serial8250_console_putchar); | 2832 | uart_console_write(&up->port, s, count, serial8250_console_putchar); |
2834 | 2833 | ||
2835 | /* | 2834 | /* |
2836 | * Finally, wait for transmitter to become empty | 2835 | * Finally, wait for transmitter to become empty |
2837 | * and restore the IER | 2836 | * and restore the IER |
2838 | */ | 2837 | */ |
2839 | wait_for_xmitr(up, BOTH_EMPTY); | 2838 | wait_for_xmitr(up, BOTH_EMPTY); |
2840 | serial_out(up, UART_IER, ier); | 2839 | serial_out(up, UART_IER, ier); |
2841 | 2840 | ||
2842 | /* | 2841 | /* |
2843 | * The receive handling will happen properly because the | 2842 | * The receive handling will happen properly because the |
2844 | * receive ready bit will still be set; it is not cleared | 2843 | * receive ready bit will still be set; it is not cleared |
2845 | * on read. However, modem control will not, we must | 2844 | * on read. However, modem control will not, we must |
2846 | * call it if we have saved something in the saved flags | 2845 | * call it if we have saved something in the saved flags |
2847 | * while processing with interrupts off. | 2846 | * while processing with interrupts off. |
2848 | */ | 2847 | */ |
2849 | if (up->msr_saved_flags) | 2848 | if (up->msr_saved_flags) |
2850 | serial8250_modem_status(up); | 2849 | serial8250_modem_status(up); |
2851 | 2850 | ||
2852 | if (locked) | 2851 | if (locked) |
2853 | spin_unlock(&up->port.lock); | 2852 | spin_unlock(&up->port.lock); |
2854 | local_irq_restore(flags); | 2853 | local_irq_restore(flags); |
2855 | } | 2854 | } |
2856 | 2855 | ||
2857 | static int __init serial8250_console_setup(struct console *co, char *options) | 2856 | static int __init serial8250_console_setup(struct console *co, char *options) |
2858 | { | 2857 | { |
2859 | struct uart_port *port; | 2858 | struct uart_port *port; |
2860 | int baud = 9600; | 2859 | int baud = 9600; |
2861 | int bits = 8; | 2860 | int bits = 8; |
2862 | int parity = 'n'; | 2861 | int parity = 'n'; |
2863 | int flow = 'n'; | 2862 | int flow = 'n'; |
2864 | 2863 | ||
2865 | /* | 2864 | /* |
2866 | * Check whether an invalid uart number has been specified, and | 2865 | * Check whether an invalid uart number has been specified, and |
2867 | * if so, search for the first available port that does have | 2866 | * if so, search for the first available port that does have |
2868 | * console support. | 2867 | * console support. |
2869 | */ | 2868 | */ |
2870 | if (co->index >= nr_uarts) | 2869 | if (co->index >= nr_uarts) |
2871 | co->index = 0; | 2870 | co->index = 0; |
2872 | port = &serial8250_ports[co->index].port; | 2871 | port = &serial8250_ports[co->index].port; |
2873 | if (!port->iobase && !port->membase) | 2872 | if (!port->iobase && !port->membase) |
2874 | return -ENODEV; | 2873 | return -ENODEV; |
2875 | 2874 | ||
2876 | if (options) | 2875 | if (options) |
2877 | uart_parse_options(options, &baud, &parity, &bits, &flow); | 2876 | uart_parse_options(options, &baud, &parity, &bits, &flow); |
2878 | 2877 | ||
2879 | return uart_set_options(port, co, baud, parity, bits, flow); | 2878 | return uart_set_options(port, co, baud, parity, bits, flow); |
2880 | } | 2879 | } |
2881 | 2880 | ||
2882 | static int serial8250_console_early_setup(void) | 2881 | static int serial8250_console_early_setup(void) |
2883 | { | 2882 | { |
2884 | return serial8250_find_port_for_earlycon(); | 2883 | return serial8250_find_port_for_earlycon(); |
2885 | } | 2884 | } |
2886 | 2885 | ||
2887 | static struct console serial8250_console = { | 2886 | static struct console serial8250_console = { |
2888 | .name = "ttyS", | 2887 | .name = "ttyS", |
2889 | .write = serial8250_console_write, | 2888 | .write = serial8250_console_write, |
2890 | .device = uart_console_device, | 2889 | .device = uart_console_device, |
2891 | .setup = serial8250_console_setup, | 2890 | .setup = serial8250_console_setup, |
2892 | .early_setup = serial8250_console_early_setup, | 2891 | .early_setup = serial8250_console_early_setup, |
2893 | .flags = CON_PRINTBUFFER | CON_ANYTIME, | 2892 | .flags = CON_PRINTBUFFER | CON_ANYTIME, |
2894 | .index = -1, | 2893 | .index = -1, |
2895 | .data = &serial8250_reg, | 2894 | .data = &serial8250_reg, |
2896 | }; | 2895 | }; |
2897 | 2896 | ||
2898 | static int __init serial8250_console_init(void) | 2897 | static int __init serial8250_console_init(void) |
2899 | { | 2898 | { |
2900 | if (nr_uarts > UART_NR) | 2899 | if (nr_uarts > UART_NR) |
2901 | nr_uarts = UART_NR; | 2900 | nr_uarts = UART_NR; |
2902 | 2901 | ||
2903 | serial8250_isa_init_ports(); | 2902 | serial8250_isa_init_ports(); |
2904 | register_console(&serial8250_console); | 2903 | register_console(&serial8250_console); |
2905 | return 0; | 2904 | return 0; |
2906 | } | 2905 | } |
2907 | console_initcall(serial8250_console_init); | 2906 | console_initcall(serial8250_console_init); |
2908 | 2907 | ||
2909 | int serial8250_find_port(struct uart_port *p) | 2908 | int serial8250_find_port(struct uart_port *p) |
2910 | { | 2909 | { |
2911 | int line; | 2910 | int line; |
2912 | struct uart_port *port; | 2911 | struct uart_port *port; |
2913 | 2912 | ||
2914 | for (line = 0; line < nr_uarts; line++) { | 2913 | for (line = 0; line < nr_uarts; line++) { |
2915 | port = &serial8250_ports[line].port; | 2914 | port = &serial8250_ports[line].port; |
2916 | if (uart_match_port(p, port)) | 2915 | if (uart_match_port(p, port)) |
2917 | return line; | 2916 | return line; |
2918 | } | 2917 | } |
2919 | return -ENODEV; | 2918 | return -ENODEV; |
2920 | } | 2919 | } |
2921 | 2920 | ||
2922 | #define SERIAL8250_CONSOLE &serial8250_console | 2921 | #define SERIAL8250_CONSOLE &serial8250_console |
2923 | #else | 2922 | #else |
2924 | #define SERIAL8250_CONSOLE NULL | 2923 | #define SERIAL8250_CONSOLE NULL |
2925 | #endif | 2924 | #endif |
2926 | 2925 | ||
2927 | static struct uart_driver serial8250_reg = { | 2926 | static struct uart_driver serial8250_reg = { |
2928 | .owner = THIS_MODULE, | 2927 | .owner = THIS_MODULE, |
2929 | .driver_name = "serial", | 2928 | .driver_name = "serial", |
2930 | .dev_name = "ttyS", | 2929 | .dev_name = "ttyS", |
2931 | .major = TTY_MAJOR, | 2930 | .major = TTY_MAJOR, |
2932 | .minor = 64, | 2931 | .minor = 64, |
2933 | .cons = SERIAL8250_CONSOLE, | 2932 | .cons = SERIAL8250_CONSOLE, |
2934 | }; | 2933 | }; |
2935 | 2934 | ||
2936 | /* | 2935 | /* |
2937 | * early_serial_setup - early registration for 8250 ports | 2936 | * early_serial_setup - early registration for 8250 ports |
2938 | * | 2937 | * |
2939 | * Setup an 8250 port structure prior to console initialisation. Use | 2938 | * Setup an 8250 port structure prior to console initialisation. Use |
2940 | * after console initialisation will cause undefined behaviour. | 2939 | * after console initialisation will cause undefined behaviour. |
2941 | */ | 2940 | */ |
2942 | int __init early_serial_setup(struct uart_port *port) | 2941 | int __init early_serial_setup(struct uart_port *port) |
2943 | { | 2942 | { |
2944 | struct uart_port *p; | 2943 | struct uart_port *p; |
2945 | 2944 | ||
2946 | if (port->line >= ARRAY_SIZE(serial8250_ports)) | 2945 | if (port->line >= ARRAY_SIZE(serial8250_ports)) |
2947 | return -ENODEV; | 2946 | return -ENODEV; |
2948 | 2947 | ||
2949 | serial8250_isa_init_ports(); | 2948 | serial8250_isa_init_ports(); |
2950 | p = &serial8250_ports[port->line].port; | 2949 | p = &serial8250_ports[port->line].port; |
2951 | p->iobase = port->iobase; | 2950 | p->iobase = port->iobase; |
2952 | p->membase = port->membase; | 2951 | p->membase = port->membase; |
2953 | p->irq = port->irq; | 2952 | p->irq = port->irq; |
2954 | p->irqflags = port->irqflags; | 2953 | p->irqflags = port->irqflags; |
2955 | p->uartclk = port->uartclk; | 2954 | p->uartclk = port->uartclk; |
2956 | p->fifosize = port->fifosize; | 2955 | p->fifosize = port->fifosize; |
2957 | p->regshift = port->regshift; | 2956 | p->regshift = port->regshift; |
2958 | p->iotype = port->iotype; | 2957 | p->iotype = port->iotype; |
2959 | p->flags = port->flags; | 2958 | p->flags = port->flags; |
2960 | p->mapbase = port->mapbase; | 2959 | p->mapbase = port->mapbase; |
2961 | p->private_data = port->private_data; | 2960 | p->private_data = port->private_data; |
2962 | p->type = port->type; | 2961 | p->type = port->type; |
2963 | p->line = port->line; | 2962 | p->line = port->line; |
2964 | 2963 | ||
2965 | set_io_from_upio(p); | 2964 | set_io_from_upio(p); |
2966 | if (port->serial_in) | 2965 | if (port->serial_in) |
2967 | p->serial_in = port->serial_in; | 2966 | p->serial_in = port->serial_in; |
2968 | if (port->serial_out) | 2967 | if (port->serial_out) |
2969 | p->serial_out = port->serial_out; | 2968 | p->serial_out = port->serial_out; |
2970 | if (port->handle_irq) | 2969 | if (port->handle_irq) |
2971 | p->handle_irq = port->handle_irq; | 2970 | p->handle_irq = port->handle_irq; |
2972 | else | 2971 | else |
2973 | p->handle_irq = serial8250_default_handle_irq; | 2972 | p->handle_irq = serial8250_default_handle_irq; |
2974 | 2973 | ||
2975 | return 0; | 2974 | return 0; |
2976 | } | 2975 | } |
2977 | 2976 | ||
2978 | /** | 2977 | /** |
2979 | * serial8250_suspend_port - suspend one serial port | 2978 | * serial8250_suspend_port - suspend one serial port |
2980 | * @line: serial line number | 2979 | * @line: serial line number |
2981 | * | 2980 | * |
2982 | * Suspend one serial port. | 2981 | * Suspend one serial port. |
2983 | */ | 2982 | */ |
2984 | void serial8250_suspend_port(int line) | 2983 | void serial8250_suspend_port(int line) |
2985 | { | 2984 | { |
2986 | uart_suspend_port(&serial8250_reg, &serial8250_ports[line].port); | 2985 | uart_suspend_port(&serial8250_reg, &serial8250_ports[line].port); |
2987 | } | 2986 | } |
2988 | 2987 | ||
2989 | /** | 2988 | /** |
2990 | * serial8250_resume_port - resume one serial port | 2989 | * serial8250_resume_port - resume one serial port |
2991 | * @line: serial line number | 2990 | * @line: serial line number |
2992 | * | 2991 | * |
2993 | * Resume one serial port. | 2992 | * Resume one serial port. |
2994 | */ | 2993 | */ |
2995 | void serial8250_resume_port(int line) | 2994 | void serial8250_resume_port(int line) |
2996 | { | 2995 | { |
2997 | struct uart_8250_port *up = &serial8250_ports[line]; | 2996 | struct uart_8250_port *up = &serial8250_ports[line]; |
2998 | 2997 | ||
2999 | if (up->capabilities & UART_NATSEMI) { | 2998 | if (up->capabilities & UART_NATSEMI) { |
3000 | /* Ensure it's still in high speed mode */ | 2999 | /* Ensure it's still in high speed mode */ |
3001 | serial_outp(up, UART_LCR, 0xE0); | 3000 | serial_outp(up, UART_LCR, 0xE0); |
3002 | 3001 | ||
3003 | ns16550a_goto_highspeed(up); | 3002 | ns16550a_goto_highspeed(up); |
3004 | 3003 | ||
3005 | serial_outp(up, UART_LCR, 0); | 3004 | serial_outp(up, UART_LCR, 0); |
3006 | up->port.uartclk = 921600*16; | 3005 | up->port.uartclk = 921600*16; |
3007 | } | 3006 | } |
3008 | uart_resume_port(&serial8250_reg, &up->port); | 3007 | uart_resume_port(&serial8250_reg, &up->port); |
3009 | } | 3008 | } |
3010 | 3009 | ||
3011 | /* | 3010 | /* |
3012 | * Register a set of serial devices attached to a platform device. The | 3011 | * Register a set of serial devices attached to a platform device. The |
3013 | * list is terminated with a zero flags entry, which means we expect | 3012 | * list is terminated with a zero flags entry, which means we expect |
3014 | * all entries to have at least UPF_BOOT_AUTOCONF set. | 3013 | * all entries to have at least UPF_BOOT_AUTOCONF set. |
3015 | */ | 3014 | */ |
3016 | static int __devinit serial8250_probe(struct platform_device *dev) | 3015 | static int __devinit serial8250_probe(struct platform_device *dev) |
3017 | { | 3016 | { |
3018 | struct plat_serial8250_port *p = dev->dev.platform_data; | 3017 | struct plat_serial8250_port *p = dev->dev.platform_data; |
3019 | struct uart_port port; | 3018 | struct uart_port port; |
3020 | int ret, i, irqflag = 0; | 3019 | int ret, i, irqflag = 0; |
3021 | 3020 | ||
3022 | memset(&port, 0, sizeof(struct uart_port)); | 3021 | memset(&port, 0, sizeof(struct uart_port)); |
3023 | 3022 | ||
3024 | if (share_irqs) | 3023 | if (share_irqs) |
3025 | irqflag = IRQF_SHARED; | 3024 | irqflag = IRQF_SHARED; |
3026 | 3025 | ||
3027 | for (i = 0; p && p->flags != 0; p++, i++) { | 3026 | for (i = 0; p && p->flags != 0; p++, i++) { |
3028 | port.iobase = p->iobase; | 3027 | port.iobase = p->iobase; |
3029 | port.membase = p->membase; | 3028 | port.membase = p->membase; |
3030 | port.irq = p->irq; | 3029 | port.irq = p->irq; |
3031 | port.irqflags = p->irqflags; | 3030 | port.irqflags = p->irqflags; |
3032 | port.uartclk = p->uartclk; | 3031 | port.uartclk = p->uartclk; |
3033 | port.regshift = p->regshift; | 3032 | port.regshift = p->regshift; |
3034 | port.iotype = p->iotype; | 3033 | port.iotype = p->iotype; |
3035 | port.flags = p->flags; | 3034 | port.flags = p->flags; |
3036 | port.mapbase = p->mapbase; | 3035 | port.mapbase = p->mapbase; |
3037 | port.hub6 = p->hub6; | 3036 | port.hub6 = p->hub6; |
3038 | port.private_data = p->private_data; | 3037 | port.private_data = p->private_data; |
3039 | port.type = p->type; | 3038 | port.type = p->type; |
3040 | port.serial_in = p->serial_in; | 3039 | port.serial_in = p->serial_in; |
3041 | port.serial_out = p->serial_out; | 3040 | port.serial_out = p->serial_out; |
3042 | port.handle_irq = p->handle_irq; | 3041 | port.handle_irq = p->handle_irq; |
3043 | port.set_termios = p->set_termios; | 3042 | port.set_termios = p->set_termios; |
3044 | port.pm = p->pm; | 3043 | port.pm = p->pm; |
3045 | port.dev = &dev->dev; | 3044 | port.dev = &dev->dev; |
3046 | port.irqflags |= irqflag; | 3045 | port.irqflags |= irqflag; |
3047 | ret = serial8250_register_port(&port); | 3046 | ret = serial8250_register_port(&port); |
3048 | if (ret < 0) { | 3047 | if (ret < 0) { |
3049 | dev_err(&dev->dev, "unable to register port at index %d " | 3048 | dev_err(&dev->dev, "unable to register port at index %d " |
3050 | "(IO%lx MEM%llx IRQ%d): %d\n", i, | 3049 | "(IO%lx MEM%llx IRQ%d): %d\n", i, |
3051 | p->iobase, (unsigned long long)p->mapbase, | 3050 | p->iobase, (unsigned long long)p->mapbase, |
3052 | p->irq, ret); | 3051 | p->irq, ret); |
3053 | } | 3052 | } |
3054 | } | 3053 | } |
3055 | return 0; | 3054 | return 0; |
3056 | } | 3055 | } |
3057 | 3056 | ||
3058 | /* | 3057 | /* |
3059 | * Remove serial ports registered against a platform device. | 3058 | * Remove serial ports registered against a platform device. |
3060 | */ | 3059 | */ |
3061 | static int __devexit serial8250_remove(struct platform_device *dev) | 3060 | static int __devexit serial8250_remove(struct platform_device *dev) |
3062 | { | 3061 | { |
3063 | int i; | 3062 | int i; |
3064 | 3063 | ||
3065 | for (i = 0; i < nr_uarts; i++) { | 3064 | for (i = 0; i < nr_uarts; i++) { |
3066 | struct uart_8250_port *up = &serial8250_ports[i]; | 3065 | struct uart_8250_port *up = &serial8250_ports[i]; |
3067 | 3066 | ||
3068 | if (up->port.dev == &dev->dev) | 3067 | if (up->port.dev == &dev->dev) |
3069 | serial8250_unregister_port(i); | 3068 | serial8250_unregister_port(i); |
3070 | } | 3069 | } |
3071 | return 0; | 3070 | return 0; |
3072 | } | 3071 | } |
3073 | 3072 | ||
3074 | static int serial8250_suspend(struct platform_device *dev, pm_message_t state) | 3073 | static int serial8250_suspend(struct platform_device *dev, pm_message_t state) |
3075 | { | 3074 | { |
3076 | int i; | 3075 | int i; |
3077 | 3076 | ||
3078 | for (i = 0; i < UART_NR; i++) { | 3077 | for (i = 0; i < UART_NR; i++) { |
3079 | struct uart_8250_port *up = &serial8250_ports[i]; | 3078 | struct uart_8250_port *up = &serial8250_ports[i]; |
3080 | 3079 | ||
3081 | if (up->port.type != PORT_UNKNOWN && up->port.dev == &dev->dev) | 3080 | if (up->port.type != PORT_UNKNOWN && up->port.dev == &dev->dev) |
3082 | uart_suspend_port(&serial8250_reg, &up->port); | 3081 | uart_suspend_port(&serial8250_reg, &up->port); |
3083 | } | 3082 | } |
3084 | 3083 | ||
3085 | return 0; | 3084 | return 0; |
3086 | } | 3085 | } |
3087 | 3086 | ||
3088 | static int serial8250_resume(struct platform_device *dev) | 3087 | static int serial8250_resume(struct platform_device *dev) |
3089 | { | 3088 | { |
3090 | int i; | 3089 | int i; |
3091 | 3090 | ||
3092 | for (i = 0; i < UART_NR; i++) { | 3091 | for (i = 0; i < UART_NR; i++) { |
3093 | struct uart_8250_port *up = &serial8250_ports[i]; | 3092 | struct uart_8250_port *up = &serial8250_ports[i]; |
3094 | 3093 | ||
3095 | if (up->port.type != PORT_UNKNOWN && up->port.dev == &dev->dev) | 3094 | if (up->port.type != PORT_UNKNOWN && up->port.dev == &dev->dev) |
3096 | serial8250_resume_port(i); | 3095 | serial8250_resume_port(i); |
3097 | } | 3096 | } |
3098 | 3097 | ||
3099 | return 0; | 3098 | return 0; |
3100 | } | 3099 | } |
3101 | 3100 | ||
3102 | static struct platform_driver serial8250_isa_driver = { | 3101 | static struct platform_driver serial8250_isa_driver = { |
3103 | .probe = serial8250_probe, | 3102 | .probe = serial8250_probe, |
3104 | .remove = __devexit_p(serial8250_remove), | 3103 | .remove = __devexit_p(serial8250_remove), |
3105 | .suspend = serial8250_suspend, | 3104 | .suspend = serial8250_suspend, |
3106 | .resume = serial8250_resume, | 3105 | .resume = serial8250_resume, |
3107 | .driver = { | 3106 | .driver = { |
3108 | .name = "serial8250", | 3107 | .name = "serial8250", |
3109 | .owner = THIS_MODULE, | 3108 | .owner = THIS_MODULE, |
3110 | }, | 3109 | }, |
3111 | }; | 3110 | }; |
3112 | 3111 | ||
3113 | /* | 3112 | /* |
3114 | * This "device" covers _all_ ISA 8250-compatible serial devices listed | 3113 | * This "device" covers _all_ ISA 8250-compatible serial devices listed |
3115 | * in the table in include/asm/serial.h | 3114 | * in the table in include/asm/serial.h |
3116 | */ | 3115 | */ |
3117 | static struct platform_device *serial8250_isa_devs; | 3116 | static struct platform_device *serial8250_isa_devs; |
3118 | 3117 | ||
3119 | /* | 3118 | /* |
3120 | * serial8250_register_port and serial8250_unregister_port allows for | 3119 | * serial8250_register_port and serial8250_unregister_port allows for |
3121 | * 16x50 serial ports to be configured at run-time, to support PCMCIA | 3120 | * 16x50 serial ports to be configured at run-time, to support PCMCIA |
3122 | * modems and PCI multiport cards. | 3121 | * modems and PCI multiport cards. |
3123 | */ | 3122 | */ |
3124 | static DEFINE_MUTEX(serial_mutex); | 3123 | static DEFINE_MUTEX(serial_mutex); |
3125 | 3124 | ||
3126 | static struct uart_8250_port *serial8250_find_match_or_unused(struct uart_port *port) | 3125 | static struct uart_8250_port *serial8250_find_match_or_unused(struct uart_port *port) |
3127 | { | 3126 | { |
3128 | int i; | 3127 | int i; |
3129 | 3128 | ||
3130 | /* | 3129 | /* |
3131 | * First, find a port entry which matches. | 3130 | * First, find a port entry which matches. |
3132 | */ | 3131 | */ |
3133 | for (i = 0; i < nr_uarts; i++) | 3132 | for (i = 0; i < nr_uarts; i++) |
3134 | if (uart_match_port(&serial8250_ports[i].port, port)) | 3133 | if (uart_match_port(&serial8250_ports[i].port, port)) |
3135 | return &serial8250_ports[i]; | 3134 | return &serial8250_ports[i]; |
3136 | 3135 | ||
3137 | /* | 3136 | /* |
3138 | * We didn't find a matching entry, so look for the first | 3137 | * We didn't find a matching entry, so look for the first |
3139 | * free entry. We look for one which hasn't been previously | 3138 | * free entry. We look for one which hasn't been previously |
3140 | * used (indicated by zero iobase). | 3139 | * used (indicated by zero iobase). |
3141 | */ | 3140 | */ |
3142 | for (i = 0; i < nr_uarts; i++) | 3141 | for (i = 0; i < nr_uarts; i++) |
3143 | if (serial8250_ports[i].port.type == PORT_UNKNOWN && | 3142 | if (serial8250_ports[i].port.type == PORT_UNKNOWN && |
3144 | serial8250_ports[i].port.iobase == 0) | 3143 | serial8250_ports[i].port.iobase == 0) |
3145 | return &serial8250_ports[i]; | 3144 | return &serial8250_ports[i]; |
3146 | 3145 | ||
3147 | /* | 3146 | /* |
3148 | * That also failed. Last resort is to find any entry which | 3147 | * That also failed. Last resort is to find any entry which |
3149 | * doesn't have a real port associated with it. | 3148 | * doesn't have a real port associated with it. |
3150 | */ | 3149 | */ |
3151 | for (i = 0; i < nr_uarts; i++) | 3150 | for (i = 0; i < nr_uarts; i++) |
3152 | if (serial8250_ports[i].port.type == PORT_UNKNOWN) | 3151 | if (serial8250_ports[i].port.type == PORT_UNKNOWN) |
3153 | return &serial8250_ports[i]; | 3152 | return &serial8250_ports[i]; |
3154 | 3153 | ||
3155 | return NULL; | 3154 | return NULL; |
3156 | } | 3155 | } |
3157 | 3156 | ||
3158 | /** | 3157 | /** |
3159 | * serial8250_register_port - register a serial port | 3158 | * serial8250_register_port - register a serial port |
3160 | * @port: serial port template | 3159 | * @port: serial port template |
3161 | * | 3160 | * |
3162 | * Configure the serial port specified by the request. If the | 3161 | * Configure the serial port specified by the request. If the |
3163 | * port exists and is in use, it is hung up and unregistered | 3162 | * port exists and is in use, it is hung up and unregistered |
3164 | * first. | 3163 | * first. |
3165 | * | 3164 | * |
3166 | * The port is then probed and if necessary the IRQ is autodetected | 3165 | * The port is then probed and if necessary the IRQ is autodetected |
3167 | * If this fails an error is returned. | 3166 | * If this fails an error is returned. |
3168 | * | 3167 | * |
3169 | * On success the port is ready to use and the line number is returned. | 3168 | * On success the port is ready to use and the line number is returned. |
3170 | */ | 3169 | */ |
3171 | int serial8250_register_port(struct uart_port *port) | 3170 | int serial8250_register_port(struct uart_port *port) |
3172 | { | 3171 | { |
3173 | struct uart_8250_port *uart; | 3172 | struct uart_8250_port *uart; |
3174 | int ret = -ENOSPC; | 3173 | int ret = -ENOSPC; |
3175 | 3174 | ||
3176 | if (port->uartclk == 0) | 3175 | if (port->uartclk == 0) |
3177 | return -EINVAL; | 3176 | return -EINVAL; |
3178 | 3177 | ||
3179 | mutex_lock(&serial_mutex); | 3178 | mutex_lock(&serial_mutex); |
3180 | 3179 | ||
3181 | uart = serial8250_find_match_or_unused(port); | 3180 | uart = serial8250_find_match_or_unused(port); |
3182 | if (uart) { | 3181 | if (uart) { |
3183 | uart_remove_one_port(&serial8250_reg, &uart->port); | 3182 | uart_remove_one_port(&serial8250_reg, &uart->port); |
3184 | 3183 | ||
3185 | uart->port.iobase = port->iobase; | 3184 | uart->port.iobase = port->iobase; |
3186 | uart->port.membase = port->membase; | 3185 | uart->port.membase = port->membase; |
3187 | uart->port.irq = port->irq; | 3186 | uart->port.irq = port->irq; |
3188 | uart->port.irqflags = port->irqflags; | 3187 | uart->port.irqflags = port->irqflags; |
3189 | uart->port.uartclk = port->uartclk; | 3188 | uart->port.uartclk = port->uartclk; |
3190 | uart->port.fifosize = port->fifosize; | 3189 | uart->port.fifosize = port->fifosize; |
3191 | uart->port.regshift = port->regshift; | 3190 | uart->port.regshift = port->regshift; |
3192 | uart->port.iotype = port->iotype; | 3191 | uart->port.iotype = port->iotype; |
3193 | uart->port.flags = port->flags | UPF_BOOT_AUTOCONF; | 3192 | uart->port.flags = port->flags | UPF_BOOT_AUTOCONF; |
3194 | uart->port.mapbase = port->mapbase; | 3193 | uart->port.mapbase = port->mapbase; |
3195 | uart->port.private_data = port->private_data; | 3194 | uart->port.private_data = port->private_data; |
3196 | if (port->dev) | 3195 | if (port->dev) |
3197 | uart->port.dev = port->dev; | 3196 | uart->port.dev = port->dev; |
3198 | 3197 | ||
3199 | if (port->flags & UPF_FIXED_TYPE) | 3198 | if (port->flags & UPF_FIXED_TYPE) |
3200 | serial8250_init_fixed_type_port(uart, port->type); | 3199 | serial8250_init_fixed_type_port(uart, port->type); |
3201 | 3200 | ||
3202 | set_io_from_upio(&uart->port); | 3201 | set_io_from_upio(&uart->port); |
3203 | /* Possibly override default I/O functions. */ | 3202 | /* Possibly override default I/O functions. */ |
3204 | if (port->serial_in) | 3203 | if (port->serial_in) |
3205 | uart->port.serial_in = port->serial_in; | 3204 | uart->port.serial_in = port->serial_in; |
3206 | if (port->serial_out) | 3205 | if (port->serial_out) |
3207 | uart->port.serial_out = port->serial_out; | 3206 | uart->port.serial_out = port->serial_out; |
3208 | if (port->handle_irq) | 3207 | if (port->handle_irq) |
3209 | uart->port.handle_irq = port->handle_irq; | 3208 | uart->port.handle_irq = port->handle_irq; |
3210 | /* Possibly override set_termios call */ | 3209 | /* Possibly override set_termios call */ |
3211 | if (port->set_termios) | 3210 | if (port->set_termios) |
3212 | uart->port.set_termios = port->set_termios; | 3211 | uart->port.set_termios = port->set_termios; |
3213 | if (port->pm) | 3212 | if (port->pm) |
3214 | uart->port.pm = port->pm; | 3213 | uart->port.pm = port->pm; |
3215 | 3214 | ||
3216 | if (serial8250_isa_config != NULL) | 3215 | if (serial8250_isa_config != NULL) |
3217 | serial8250_isa_config(0, &uart->port, | 3216 | serial8250_isa_config(0, &uart->port, |
3218 | &uart->capabilities); | 3217 | &uart->capabilities); |
3219 | 3218 | ||
3220 | ret = uart_add_one_port(&serial8250_reg, &uart->port); | 3219 | ret = uart_add_one_port(&serial8250_reg, &uart->port); |
3221 | if (ret == 0) | 3220 | if (ret == 0) |
3222 | ret = uart->port.line; | 3221 | ret = uart->port.line; |
3223 | } | 3222 | } |
3224 | mutex_unlock(&serial_mutex); | 3223 | mutex_unlock(&serial_mutex); |
3225 | 3224 | ||
3226 | return ret; | 3225 | return ret; |
3227 | } | 3226 | } |
3228 | EXPORT_SYMBOL(serial8250_register_port); | 3227 | EXPORT_SYMBOL(serial8250_register_port); |
3229 | 3228 | ||
3230 | /** | 3229 | /** |
3231 | * serial8250_unregister_port - remove a 16x50 serial port at runtime | 3230 | * serial8250_unregister_port - remove a 16x50 serial port at runtime |
3232 | * @line: serial line number | 3231 | * @line: serial line number |
3233 | * | 3232 | * |
3234 | * Remove one serial port. This may not be called from interrupt | 3233 | * Remove one serial port. This may not be called from interrupt |
3235 | * context. We hand the port back to the our control. | 3234 | * context. We hand the port back to the our control. |
3236 | */ | 3235 | */ |
3237 | void serial8250_unregister_port(int line) | 3236 | void serial8250_unregister_port(int line) |
3238 | { | 3237 | { |
3239 | struct uart_8250_port *uart = &serial8250_ports[line]; | 3238 | struct uart_8250_port *uart = &serial8250_ports[line]; |
3240 | 3239 | ||
3241 | mutex_lock(&serial_mutex); | 3240 | mutex_lock(&serial_mutex); |
3242 | uart_remove_one_port(&serial8250_reg, &uart->port); | 3241 | uart_remove_one_port(&serial8250_reg, &uart->port); |
3243 | if (serial8250_isa_devs) { | 3242 | if (serial8250_isa_devs) { |
3244 | uart->port.flags &= ~UPF_BOOT_AUTOCONF; | 3243 | uart->port.flags &= ~UPF_BOOT_AUTOCONF; |
3245 | uart->port.type = PORT_UNKNOWN; | 3244 | uart->port.type = PORT_UNKNOWN; |
3246 | uart->port.dev = &serial8250_isa_devs->dev; | 3245 | uart->port.dev = &serial8250_isa_devs->dev; |
3247 | uart->capabilities = uart_config[uart->port.type].flags; | 3246 | uart->capabilities = uart_config[uart->port.type].flags; |
3248 | uart_add_one_port(&serial8250_reg, &uart->port); | 3247 | uart_add_one_port(&serial8250_reg, &uart->port); |
3249 | } else { | 3248 | } else { |
3250 | uart->port.dev = NULL; | 3249 | uart->port.dev = NULL; |
3251 | } | 3250 | } |
3252 | mutex_unlock(&serial_mutex); | 3251 | mutex_unlock(&serial_mutex); |
3253 | } | 3252 | } |
3254 | EXPORT_SYMBOL(serial8250_unregister_port); | 3253 | EXPORT_SYMBOL(serial8250_unregister_port); |
3255 | 3254 | ||
3256 | static int __init serial8250_init(void) | 3255 | static int __init serial8250_init(void) |
3257 | { | 3256 | { |
3258 | int ret; | 3257 | int ret; |
3259 | 3258 | ||
3260 | if (nr_uarts > UART_NR) | 3259 | if (nr_uarts > UART_NR) |
3261 | nr_uarts = UART_NR; | 3260 | nr_uarts = UART_NR; |
3262 | 3261 | ||
3263 | printk(KERN_INFO "Serial: 8250/16550 driver, " | 3262 | printk(KERN_INFO "Serial: 8250/16550 driver, " |
3264 | "%d ports, IRQ sharing %sabled\n", nr_uarts, | 3263 | "%d ports, IRQ sharing %sabled\n", nr_uarts, |
3265 | share_irqs ? "en" : "dis"); | 3264 | share_irqs ? "en" : "dis"); |
3266 | 3265 | ||
3267 | #ifdef CONFIG_SPARC | 3266 | #ifdef CONFIG_SPARC |
3268 | ret = sunserial_register_minors(&serial8250_reg, UART_NR); | 3267 | ret = sunserial_register_minors(&serial8250_reg, UART_NR); |
3269 | #else | 3268 | #else |
3270 | serial8250_reg.nr = UART_NR; | 3269 | serial8250_reg.nr = UART_NR; |
3271 | ret = uart_register_driver(&serial8250_reg); | 3270 | ret = uart_register_driver(&serial8250_reg); |
3272 | #endif | 3271 | #endif |
3273 | if (ret) | 3272 | if (ret) |
3274 | goto out; | 3273 | goto out; |
3275 | 3274 | ||
3276 | serial8250_isa_devs = platform_device_alloc("serial8250", | 3275 | serial8250_isa_devs = platform_device_alloc("serial8250", |
3277 | PLAT8250_DEV_LEGACY); | 3276 | PLAT8250_DEV_LEGACY); |
3278 | if (!serial8250_isa_devs) { | 3277 | if (!serial8250_isa_devs) { |
3279 | ret = -ENOMEM; | 3278 | ret = -ENOMEM; |
3280 | goto unreg_uart_drv; | 3279 | goto unreg_uart_drv; |
3281 | } | 3280 | } |
3282 | 3281 | ||
3283 | ret = platform_device_add(serial8250_isa_devs); | 3282 | ret = platform_device_add(serial8250_isa_devs); |
3284 | if (ret) | 3283 | if (ret) |
3285 | goto put_dev; | 3284 | goto put_dev; |
3286 | 3285 | ||
3287 | serial8250_register_ports(&serial8250_reg, &serial8250_isa_devs->dev); | 3286 | serial8250_register_ports(&serial8250_reg, &serial8250_isa_devs->dev); |
3288 | 3287 | ||
3289 | ret = platform_driver_register(&serial8250_isa_driver); | 3288 | ret = platform_driver_register(&serial8250_isa_driver); |
3290 | if (ret == 0) | 3289 | if (ret == 0) |
3291 | goto out; | 3290 | goto out; |
3292 | 3291 | ||
3293 | platform_device_del(serial8250_isa_devs); | 3292 | platform_device_del(serial8250_isa_devs); |
3294 | put_dev: | 3293 | put_dev: |
3295 | platform_device_put(serial8250_isa_devs); | 3294 | platform_device_put(serial8250_isa_devs); |
3296 | unreg_uart_drv: | 3295 | unreg_uart_drv: |
3297 | #ifdef CONFIG_SPARC | 3296 | #ifdef CONFIG_SPARC |
3298 | sunserial_unregister_minors(&serial8250_reg, UART_NR); | 3297 | sunserial_unregister_minors(&serial8250_reg, UART_NR); |
3299 | #else | 3298 | #else |
3300 | uart_unregister_driver(&serial8250_reg); | 3299 | uart_unregister_driver(&serial8250_reg); |
3301 | #endif | 3300 | #endif |
3302 | out: | 3301 | out: |
3303 | return ret; | 3302 | return ret; |
3304 | } | 3303 | } |
3305 | 3304 | ||
3306 | static void __exit serial8250_exit(void) | 3305 | static void __exit serial8250_exit(void) |
3307 | { | 3306 | { |
3308 | struct platform_device *isa_dev = serial8250_isa_devs; | 3307 | struct platform_device *isa_dev = serial8250_isa_devs; |
3309 | 3308 | ||
3310 | /* | 3309 | /* |
3311 | * This tells serial8250_unregister_port() not to re-register | 3310 | * This tells serial8250_unregister_port() not to re-register |
3312 | * the ports (thereby making serial8250_isa_driver permanently | 3311 | * the ports (thereby making serial8250_isa_driver permanently |
3313 | * in use.) | 3312 | * in use.) |
3314 | */ | 3313 | */ |
3315 | serial8250_isa_devs = NULL; | 3314 | serial8250_isa_devs = NULL; |
3316 | 3315 | ||
3317 | platform_driver_unregister(&serial8250_isa_driver); | 3316 | platform_driver_unregister(&serial8250_isa_driver); |
3318 | platform_device_unregister(isa_dev); | 3317 | platform_device_unregister(isa_dev); |
3319 | 3318 | ||
3320 | #ifdef CONFIG_SPARC | 3319 | #ifdef CONFIG_SPARC |
3321 | sunserial_unregister_minors(&serial8250_reg, UART_NR); | 3320 | sunserial_unregister_minors(&serial8250_reg, UART_NR); |
3322 | #else | 3321 | #else |
3323 | uart_unregister_driver(&serial8250_reg); | 3322 | uart_unregister_driver(&serial8250_reg); |
3324 | #endif | 3323 | #endif |
3325 | } | 3324 | } |
3326 | 3325 | ||
3327 | module_init(serial8250_init); | 3326 | module_init(serial8250_init); |
3328 | module_exit(serial8250_exit); | 3327 | module_exit(serial8250_exit); |
3329 | 3328 | ||
3330 | EXPORT_SYMBOL(serial8250_suspend_port); | 3329 | EXPORT_SYMBOL(serial8250_suspend_port); |
3331 | EXPORT_SYMBOL(serial8250_resume_port); | 3330 | EXPORT_SYMBOL(serial8250_resume_port); |
3332 | 3331 | ||
3333 | MODULE_LICENSE("GPL"); | 3332 | MODULE_LICENSE("GPL"); |
3334 | MODULE_DESCRIPTION("Generic 8250/16x50 serial driver"); | 3333 | MODULE_DESCRIPTION("Generic 8250/16x50 serial driver"); |
3335 | 3334 | ||
3336 | module_param(share_irqs, uint, 0644); | 3335 | module_param(share_irqs, uint, 0644); |
3337 | MODULE_PARM_DESC(share_irqs, "Share IRQs with other non-8250/16x50 devices" | 3336 | MODULE_PARM_DESC(share_irqs, "Share IRQs with other non-8250/16x50 devices" |
3338 | " (unsafe)"); | 3337 | " (unsafe)"); |
3339 | 3338 | ||
3340 | module_param(nr_uarts, uint, 0644); | 3339 | module_param(nr_uarts, uint, 0644); |
3341 | MODULE_PARM_DESC(nr_uarts, "Maximum number of UARTs supported. (1-" __MODULE_STRING(CONFIG_SERIAL_8250_NR_UARTS) ")"); | 3340 | MODULE_PARM_DESC(nr_uarts, "Maximum number of UARTs supported. (1-" __MODULE_STRING(CONFIG_SERIAL_8250_NR_UARTS) ")"); |
3342 | 3341 | ||
3343 | module_param(skip_txen_test, uint, 0644); | 3342 | module_param(skip_txen_test, uint, 0644); |
3344 | MODULE_PARM_DESC(skip_txen_test, "Skip checking for the TXEN bug at init time"); | 3343 | MODULE_PARM_DESC(skip_txen_test, "Skip checking for the TXEN bug at init time"); |
3345 | 3344 | ||
3346 | #ifdef CONFIG_SERIAL_8250_RSA | 3345 | #ifdef CONFIG_SERIAL_8250_RSA |
3347 | module_param_array(probe_rsa, ulong, &probe_rsa_count, 0444); | 3346 | module_param_array(probe_rsa, ulong, &probe_rsa_count, 0444); |
3348 | MODULE_PARM_DESC(probe_rsa, "Probe I/O ports for RSA"); | 3347 | MODULE_PARM_DESC(probe_rsa, "Probe I/O ports for RSA"); |
drivers/tty/serial/suncore.c
1 | /* suncore.c | 1 | /* suncore.c |
2 | * | 2 | * |
3 | * Common SUN serial routines. Based entirely | 3 | * Common SUN serial routines. Based entirely |
4 | * upon drivers/sbus/char/sunserial.c which is: | 4 | * upon drivers/sbus/char/sunserial.c which is: |
5 | * | 5 | * |
6 | * Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be) | 6 | * Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be) |
7 | * | 7 | * |
8 | * Adaptation to new UART layer is: | 8 | * Adaptation to new UART layer is: |
9 | * | 9 | * |
10 | * Copyright (C) 2002 David S. Miller (davem@redhat.com) | 10 | * Copyright (C) 2002 David S. Miller (davem@redhat.com) |
11 | */ | 11 | */ |
12 | 12 | ||
13 | #include <linux/module.h> | 13 | #include <linux/module.h> |
14 | #include <linux/kernel.h> | 14 | #include <linux/kernel.h> |
15 | #include <linux/console.h> | 15 | #include <linux/console.h> |
16 | #include <linux/tty.h> | 16 | #include <linux/tty.h> |
17 | #include <linux/errno.h> | 17 | #include <linux/errno.h> |
18 | #include <linux/string.h> | 18 | #include <linux/string.h> |
19 | #include <linux/serial_core.h> | 19 | #include <linux/serial_core.h> |
20 | #include <linux/sunserialcore.h> | ||
20 | #include <linux/init.h> | 21 | #include <linux/init.h> |
21 | 22 | ||
22 | #include <asm/prom.h> | 23 | #include <asm/prom.h> |
23 | 24 | ||
24 | #include "suncore.h" | ||
25 | 25 | ||
26 | static int sunserial_current_minor = 64; | 26 | static int sunserial_current_minor = 64; |
27 | 27 | ||
28 | int sunserial_register_minors(struct uart_driver *drv, int count) | 28 | int sunserial_register_minors(struct uart_driver *drv, int count) |
29 | { | 29 | { |
30 | int err = 0; | 30 | int err = 0; |
31 | 31 | ||
32 | drv->minor = sunserial_current_minor; | 32 | drv->minor = sunserial_current_minor; |
33 | drv->nr += count; | 33 | drv->nr += count; |
34 | /* Register the driver on the first call */ | 34 | /* Register the driver on the first call */ |
35 | if (drv->nr == count) | 35 | if (drv->nr == count) |
36 | err = uart_register_driver(drv); | 36 | err = uart_register_driver(drv); |
37 | if (err == 0) { | 37 | if (err == 0) { |
38 | sunserial_current_minor += count; | 38 | sunserial_current_minor += count; |
39 | drv->tty_driver->name_base = drv->minor - 64; | 39 | drv->tty_driver->name_base = drv->minor - 64; |
40 | } | 40 | } |
41 | return err; | 41 | return err; |
42 | } | 42 | } |
43 | EXPORT_SYMBOL(sunserial_register_minors); | 43 | EXPORT_SYMBOL(sunserial_register_minors); |
44 | 44 | ||
45 | void sunserial_unregister_minors(struct uart_driver *drv, int count) | 45 | void sunserial_unregister_minors(struct uart_driver *drv, int count) |
46 | { | 46 | { |
47 | drv->nr -= count; | 47 | drv->nr -= count; |
48 | sunserial_current_minor -= count; | 48 | sunserial_current_minor -= count; |
49 | 49 | ||
50 | if (drv->nr == 0) | 50 | if (drv->nr == 0) |
51 | uart_unregister_driver(drv); | 51 | uart_unregister_driver(drv); |
52 | } | 52 | } |
53 | EXPORT_SYMBOL(sunserial_unregister_minors); | 53 | EXPORT_SYMBOL(sunserial_unregister_minors); |
54 | 54 | ||
55 | int sunserial_console_match(struct console *con, struct device_node *dp, | 55 | int sunserial_console_match(struct console *con, struct device_node *dp, |
56 | struct uart_driver *drv, int line, bool ignore_line) | 56 | struct uart_driver *drv, int line, bool ignore_line) |
57 | { | 57 | { |
58 | if (!con) | 58 | if (!con) |
59 | return 0; | 59 | return 0; |
60 | 60 | ||
61 | drv->cons = con; | 61 | drv->cons = con; |
62 | 62 | ||
63 | if (of_console_device != dp) | 63 | if (of_console_device != dp) |
64 | return 0; | 64 | return 0; |
65 | 65 | ||
66 | if (!ignore_line) { | 66 | if (!ignore_line) { |
67 | int off = 0; | 67 | int off = 0; |
68 | 68 | ||
69 | if (of_console_options && | 69 | if (of_console_options && |
70 | *of_console_options == 'b') | 70 | *of_console_options == 'b') |
71 | off = 1; | 71 | off = 1; |
72 | 72 | ||
73 | if ((line & 1) != off) | 73 | if ((line & 1) != off) |
74 | return 0; | 74 | return 0; |
75 | } | 75 | } |
76 | 76 | ||
77 | if (!console_set_on_cmdline) { | 77 | if (!console_set_on_cmdline) { |
78 | con->index = line; | 78 | con->index = line; |
79 | add_preferred_console(con->name, line, NULL); | 79 | add_preferred_console(con->name, line, NULL); |
80 | } | 80 | } |
81 | return 1; | 81 | return 1; |
82 | } | 82 | } |
83 | EXPORT_SYMBOL(sunserial_console_match); | 83 | EXPORT_SYMBOL(sunserial_console_match); |
84 | 84 | ||
85 | void sunserial_console_termios(struct console *con, struct device_node *uart_dp) | 85 | void sunserial_console_termios(struct console *con, struct device_node *uart_dp) |
86 | { | 86 | { |
87 | const char *mode, *s; | 87 | const char *mode, *s; |
88 | char mode_prop[] = "ttyX-mode"; | 88 | char mode_prop[] = "ttyX-mode"; |
89 | int baud, bits, stop, cflag; | 89 | int baud, bits, stop, cflag; |
90 | char parity; | 90 | char parity; |
91 | 91 | ||
92 | if (!strcmp(uart_dp->name, "rsc") || | 92 | if (!strcmp(uart_dp->name, "rsc") || |
93 | !strcmp(uart_dp->name, "rsc-console") || | 93 | !strcmp(uart_dp->name, "rsc-console") || |
94 | !strcmp(uart_dp->name, "rsc-control")) { | 94 | !strcmp(uart_dp->name, "rsc-control")) { |
95 | mode = of_get_property(uart_dp, | 95 | mode = of_get_property(uart_dp, |
96 | "ssp-console-modes", NULL); | 96 | "ssp-console-modes", NULL); |
97 | if (!mode) | 97 | if (!mode) |
98 | mode = "115200,8,n,1,-"; | 98 | mode = "115200,8,n,1,-"; |
99 | } else if (!strcmp(uart_dp->name, "lom-console")) { | 99 | } else if (!strcmp(uart_dp->name, "lom-console")) { |
100 | mode = "9600,8,n,1,-"; | 100 | mode = "9600,8,n,1,-"; |
101 | } else { | 101 | } else { |
102 | struct device_node *dp; | 102 | struct device_node *dp; |
103 | char c; | 103 | char c; |
104 | 104 | ||
105 | c = 'a'; | 105 | c = 'a'; |
106 | if (of_console_options) | 106 | if (of_console_options) |
107 | c = *of_console_options; | 107 | c = *of_console_options; |
108 | 108 | ||
109 | mode_prop[3] = c; | 109 | mode_prop[3] = c; |
110 | 110 | ||
111 | dp = of_find_node_by_path("/options"); | 111 | dp = of_find_node_by_path("/options"); |
112 | mode = of_get_property(dp, mode_prop, NULL); | 112 | mode = of_get_property(dp, mode_prop, NULL); |
113 | if (!mode) | 113 | if (!mode) |
114 | mode = "9600,8,n,1,-"; | 114 | mode = "9600,8,n,1,-"; |
115 | } | 115 | } |
116 | 116 | ||
117 | cflag = CREAD | HUPCL | CLOCAL; | 117 | cflag = CREAD | HUPCL | CLOCAL; |
118 | 118 | ||
119 | s = mode; | 119 | s = mode; |
120 | baud = simple_strtoul(s, NULL, 0); | 120 | baud = simple_strtoul(s, NULL, 0); |
121 | s = strchr(s, ','); | 121 | s = strchr(s, ','); |
122 | bits = simple_strtoul(++s, NULL, 0); | 122 | bits = simple_strtoul(++s, NULL, 0); |
123 | s = strchr(s, ','); | 123 | s = strchr(s, ','); |
124 | parity = *(++s); | 124 | parity = *(++s); |
125 | s = strchr(s, ','); | 125 | s = strchr(s, ','); |
126 | stop = simple_strtoul(++s, NULL, 0); | 126 | stop = simple_strtoul(++s, NULL, 0); |
127 | s = strchr(s, ','); | 127 | s = strchr(s, ','); |
128 | /* XXX handshake is not handled here. */ | 128 | /* XXX handshake is not handled here. */ |
129 | 129 | ||
130 | switch (baud) { | 130 | switch (baud) { |
131 | case 150: cflag |= B150; break; | 131 | case 150: cflag |= B150; break; |
132 | case 300: cflag |= B300; break; | 132 | case 300: cflag |= B300; break; |
133 | case 600: cflag |= B600; break; | 133 | case 600: cflag |= B600; break; |
134 | case 1200: cflag |= B1200; break; | 134 | case 1200: cflag |= B1200; break; |
135 | case 2400: cflag |= B2400; break; | 135 | case 2400: cflag |= B2400; break; |
136 | case 4800: cflag |= B4800; break; | 136 | case 4800: cflag |= B4800; break; |
137 | case 9600: cflag |= B9600; break; | 137 | case 9600: cflag |= B9600; break; |
138 | case 19200: cflag |= B19200; break; | 138 | case 19200: cflag |= B19200; break; |
139 | case 38400: cflag |= B38400; break; | 139 | case 38400: cflag |= B38400; break; |
140 | case 57600: cflag |= B57600; break; | 140 | case 57600: cflag |= B57600; break; |
141 | case 115200: cflag |= B115200; break; | 141 | case 115200: cflag |= B115200; break; |
142 | case 230400: cflag |= B230400; break; | 142 | case 230400: cflag |= B230400; break; |
143 | case 460800: cflag |= B460800; break; | 143 | case 460800: cflag |= B460800; break; |
144 | default: baud = 9600; cflag |= B9600; break; | 144 | default: baud = 9600; cflag |= B9600; break; |
145 | } | 145 | } |
146 | 146 | ||
147 | switch (bits) { | 147 | switch (bits) { |
148 | case 5: cflag |= CS5; break; | 148 | case 5: cflag |= CS5; break; |
149 | case 6: cflag |= CS6; break; | 149 | case 6: cflag |= CS6; break; |
150 | case 7: cflag |= CS7; break; | 150 | case 7: cflag |= CS7; break; |
151 | case 8: cflag |= CS8; break; | 151 | case 8: cflag |= CS8; break; |
152 | default: cflag |= CS8; break; | 152 | default: cflag |= CS8; break; |
153 | } | 153 | } |
154 | 154 | ||
155 | switch (parity) { | 155 | switch (parity) { |
156 | case 'o': cflag |= (PARENB | PARODD); break; | 156 | case 'o': cflag |= (PARENB | PARODD); break; |
157 | case 'e': cflag |= PARENB; break; | 157 | case 'e': cflag |= PARENB; break; |
158 | case 'n': default: break; | 158 | case 'n': default: break; |
159 | } | 159 | } |
160 | 160 | ||
161 | switch (stop) { | 161 | switch (stop) { |
162 | case 2: cflag |= CSTOPB; break; | 162 | case 2: cflag |= CSTOPB; break; |
163 | case 1: default: break; | 163 | case 1: default: break; |
164 | } | 164 | } |
165 | 165 | ||
166 | con->cflag = cflag; | 166 | con->cflag = cflag; |
167 | } | 167 | } |
168 | 168 | ||
169 | /* Sun serial MOUSE auto baud rate detection. */ | 169 | /* Sun serial MOUSE auto baud rate detection. */ |
170 | static struct mouse_baud_cflag { | 170 | static struct mouse_baud_cflag { |
171 | int baud; | 171 | int baud; |
172 | unsigned int cflag; | 172 | unsigned int cflag; |
173 | } mouse_baud_table[] = { | 173 | } mouse_baud_table[] = { |
174 | { 1200, B1200 }, | 174 | { 1200, B1200 }, |
175 | { 2400, B2400 }, | 175 | { 2400, B2400 }, |
176 | { 4800, B4800 }, | 176 | { 4800, B4800 }, |
177 | { 9600, B9600 }, | 177 | { 9600, B9600 }, |
178 | { -1, ~0 }, | 178 | { -1, ~0 }, |
179 | { -1, ~0 }, | 179 | { -1, ~0 }, |
180 | }; | 180 | }; |
181 | 181 | ||
182 | unsigned int suncore_mouse_baud_cflag_next(unsigned int cflag, int *new_baud) | 182 | unsigned int suncore_mouse_baud_cflag_next(unsigned int cflag, int *new_baud) |
183 | { | 183 | { |
184 | int i; | 184 | int i; |
185 | 185 | ||
186 | for (i = 0; mouse_baud_table[i].baud != -1; i++) | 186 | for (i = 0; mouse_baud_table[i].baud != -1; i++) |
187 | if (mouse_baud_table[i].cflag == (cflag & CBAUD)) | 187 | if (mouse_baud_table[i].cflag == (cflag & CBAUD)) |
188 | break; | 188 | break; |
189 | 189 | ||
190 | i += 1; | 190 | i += 1; |
191 | if (mouse_baud_table[i].baud == -1) | 191 | if (mouse_baud_table[i].baud == -1) |
192 | i = 0; | 192 | i = 0; |
193 | 193 | ||
194 | *new_baud = mouse_baud_table[i].baud; | 194 | *new_baud = mouse_baud_table[i].baud; |
195 | return mouse_baud_table[i].cflag; | 195 | return mouse_baud_table[i].cflag; |
196 | } | 196 | } |
197 | 197 | ||
198 | EXPORT_SYMBOL(suncore_mouse_baud_cflag_next); | 198 | EXPORT_SYMBOL(suncore_mouse_baud_cflag_next); |
199 | 199 | ||
200 | /* Basically, when the baud rate is wrong the mouse spits out | 200 | /* Basically, when the baud rate is wrong the mouse spits out |
201 | * breaks to us. | 201 | * breaks to us. |
202 | */ | 202 | */ |
203 | int suncore_mouse_baud_detection(unsigned char ch, int is_break) | 203 | int suncore_mouse_baud_detection(unsigned char ch, int is_break) |
204 | { | 204 | { |
205 | static int mouse_got_break = 0; | 205 | static int mouse_got_break = 0; |
206 | static int ctr = 0; | 206 | static int ctr = 0; |
207 | 207 | ||
208 | if (is_break) { | 208 | if (is_break) { |
209 | /* Let a few normal bytes go by before we jump the gun | 209 | /* Let a few normal bytes go by before we jump the gun |
210 | * and say we need to try another baud rate. | 210 | * and say we need to try another baud rate. |
211 | */ | 211 | */ |
212 | if (mouse_got_break && ctr < 8) | 212 | if (mouse_got_break && ctr < 8) |
213 | return 1; | 213 | return 1; |
214 | 214 | ||
215 | /* Ok, we need to try another baud. */ | 215 | /* Ok, we need to try another baud. */ |
216 | ctr = 0; | 216 | ctr = 0; |
217 | mouse_got_break = 1; | 217 | mouse_got_break = 1; |
218 | return 2; | 218 | return 2; |
219 | } | 219 | } |
220 | if (mouse_got_break) { | 220 | if (mouse_got_break) { |
221 | ctr++; | 221 | ctr++; |
222 | if (ch == 0x87) { | 222 | if (ch == 0x87) { |
223 | /* Correct baud rate determined. */ | 223 | /* Correct baud rate determined. */ |
224 | mouse_got_break = 0; | 224 | mouse_got_break = 0; |
225 | } | 225 | } |
226 | return 1; | 226 | return 1; |
227 | } | 227 | } |
228 | return 0; | 228 | return 0; |
229 | } | 229 | } |
230 | 230 | ||
231 | EXPORT_SYMBOL(suncore_mouse_baud_detection); | 231 | EXPORT_SYMBOL(suncore_mouse_baud_detection); |
232 | 232 | ||
233 | static int __init suncore_init(void) | 233 | static int __init suncore_init(void) |
234 | { | 234 | { |
235 | return 0; | 235 | return 0; |
236 | } | 236 | } |
237 | 237 | ||
238 | static void __exit suncore_exit(void) | 238 | static void __exit suncore_exit(void) |
239 | { | 239 | { |
240 | } | 240 | } |
241 | 241 | ||
242 | module_init(suncore_init); | 242 | module_init(suncore_init); |
243 | module_exit(suncore_exit); | 243 | module_exit(suncore_exit); |
244 | 244 | ||
245 | MODULE_AUTHOR("Eddie C. Dost, David S. Miller"); | 245 | MODULE_AUTHOR("Eddie C. Dost, David S. Miller"); |
246 | MODULE_DESCRIPTION("Sun serial common layer"); | 246 | MODULE_DESCRIPTION("Sun serial common layer"); |
247 | MODULE_LICENSE("GPL"); | 247 | MODULE_LICENSE("GPL"); |
drivers/tty/serial/suncore.h
1 | /* suncore.h | File was deleted | |
2 | * | ||
3 | * Generic SUN serial/kbd/ms layer. Based entirely | ||
4 | * upon drivers/sbus/char/sunserial.h which is: | ||
5 | * | ||
6 | * Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be) | ||
7 | * | ||
8 | * Port to new UART layer is: | ||
9 | * | ||
10 | * Copyright (C) 2002 David S. Miller (davem@redhat.com) | ||
11 | */ | ||
12 | |||
13 | #ifndef _SERIAL_SUN_H | ||
14 | #define _SERIAL_SUN_H | ||
15 | |||
16 | /* Serial keyboard defines for L1-A processing... */ | ||
17 | #define SUNKBD_RESET 0xff | ||
18 | #define SUNKBD_L1 0x01 | ||
19 | #define SUNKBD_UP 0x80 | ||
20 | #define SUNKBD_A 0x4d | ||
21 | |||
22 | extern unsigned int suncore_mouse_baud_cflag_next(unsigned int, int *); | ||
23 | extern int suncore_mouse_baud_detection(unsigned char, int); | ||
24 | |||
25 | extern int sunserial_register_minors(struct uart_driver *, int); | ||
26 | extern void sunserial_unregister_minors(struct uart_driver *, int); | ||
27 | |||
28 | extern int sunserial_console_match(struct console *, struct device_node *, | ||
29 | struct uart_driver *, int, bool); | ||
30 | extern void sunserial_console_termios(struct console *, | ||
31 | struct device_node *); | ||
32 | |||
33 | #endif /* !(_SERIAL_SUN_H) */ | ||
34 | 1 | /* suncore.h |
drivers/tty/serial/sunhv.c
1 | /* sunhv.c: Serial driver for SUN4V hypervisor console. | 1 | /* sunhv.c: Serial driver for SUN4V hypervisor console. |
2 | * | 2 | * |
3 | * Copyright (C) 2006, 2007 David S. Miller (davem@davemloft.net) | 3 | * Copyright (C) 2006, 2007 David S. Miller (davem@davemloft.net) |
4 | */ | 4 | */ |
5 | 5 | ||
6 | #include <linux/module.h> | 6 | #include <linux/module.h> |
7 | #include <linux/kernel.h> | 7 | #include <linux/kernel.h> |
8 | #include <linux/errno.h> | 8 | #include <linux/errno.h> |
9 | #include <linux/tty.h> | 9 | #include <linux/tty.h> |
10 | #include <linux/tty_flip.h> | 10 | #include <linux/tty_flip.h> |
11 | #include <linux/major.h> | 11 | #include <linux/major.h> |
12 | #include <linux/circ_buf.h> | 12 | #include <linux/circ_buf.h> |
13 | #include <linux/serial.h> | 13 | #include <linux/serial.h> |
14 | #include <linux/sysrq.h> | 14 | #include <linux/sysrq.h> |
15 | #include <linux/console.h> | 15 | #include <linux/console.h> |
16 | #include <linux/spinlock.h> | 16 | #include <linux/spinlock.h> |
17 | #include <linux/slab.h> | 17 | #include <linux/slab.h> |
18 | #include <linux/delay.h> | 18 | #include <linux/delay.h> |
19 | #include <linux/init.h> | 19 | #include <linux/init.h> |
20 | #include <linux/of_device.h> | 20 | #include <linux/of_device.h> |
21 | 21 | ||
22 | #include <asm/hypervisor.h> | 22 | #include <asm/hypervisor.h> |
23 | #include <asm/spitfire.h> | 23 | #include <asm/spitfire.h> |
24 | #include <asm/prom.h> | 24 | #include <asm/prom.h> |
25 | #include <asm/irq.h> | 25 | #include <asm/irq.h> |
26 | 26 | ||
27 | #if defined(CONFIG_MAGIC_SYSRQ) | 27 | #if defined(CONFIG_MAGIC_SYSRQ) |
28 | #define SUPPORT_SYSRQ | 28 | #define SUPPORT_SYSRQ |
29 | #endif | 29 | #endif |
30 | 30 | ||
31 | #include <linux/serial_core.h> | 31 | #include <linux/serial_core.h> |
32 | 32 | #include <linux/sunserialcore.h> | |
33 | #include "suncore.h" | ||
34 | 33 | ||
35 | #define CON_BREAK ((long)-1) | 34 | #define CON_BREAK ((long)-1) |
36 | #define CON_HUP ((long)-2) | 35 | #define CON_HUP ((long)-2) |
37 | 36 | ||
38 | #define IGNORE_BREAK 0x1 | 37 | #define IGNORE_BREAK 0x1 |
39 | #define IGNORE_ALL 0x2 | 38 | #define IGNORE_ALL 0x2 |
40 | 39 | ||
41 | static char *con_write_page; | 40 | static char *con_write_page; |
42 | static char *con_read_page; | 41 | static char *con_read_page; |
43 | 42 | ||
44 | static int hung_up = 0; | 43 | static int hung_up = 0; |
45 | 44 | ||
46 | static void transmit_chars_putchar(struct uart_port *port, struct circ_buf *xmit) | 45 | static void transmit_chars_putchar(struct uart_port *port, struct circ_buf *xmit) |
47 | { | 46 | { |
48 | while (!uart_circ_empty(xmit)) { | 47 | while (!uart_circ_empty(xmit)) { |
49 | long status = sun4v_con_putchar(xmit->buf[xmit->tail]); | 48 | long status = sun4v_con_putchar(xmit->buf[xmit->tail]); |
50 | 49 | ||
51 | if (status != HV_EOK) | 50 | if (status != HV_EOK) |
52 | break; | 51 | break; |
53 | 52 | ||
54 | xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); | 53 | xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); |
55 | port->icount.tx++; | 54 | port->icount.tx++; |
56 | } | 55 | } |
57 | } | 56 | } |
58 | 57 | ||
59 | static void transmit_chars_write(struct uart_port *port, struct circ_buf *xmit) | 58 | static void transmit_chars_write(struct uart_port *port, struct circ_buf *xmit) |
60 | { | 59 | { |
61 | while (!uart_circ_empty(xmit)) { | 60 | while (!uart_circ_empty(xmit)) { |
62 | unsigned long ra = __pa(xmit->buf + xmit->tail); | 61 | unsigned long ra = __pa(xmit->buf + xmit->tail); |
63 | unsigned long len, status, sent; | 62 | unsigned long len, status, sent; |
64 | 63 | ||
65 | len = CIRC_CNT_TO_END(xmit->head, xmit->tail, | 64 | len = CIRC_CNT_TO_END(xmit->head, xmit->tail, |
66 | UART_XMIT_SIZE); | 65 | UART_XMIT_SIZE); |
67 | status = sun4v_con_write(ra, len, &sent); | 66 | status = sun4v_con_write(ra, len, &sent); |
68 | if (status != HV_EOK) | 67 | if (status != HV_EOK) |
69 | break; | 68 | break; |
70 | xmit->tail = (xmit->tail + sent) & (UART_XMIT_SIZE - 1); | 69 | xmit->tail = (xmit->tail + sent) & (UART_XMIT_SIZE - 1); |
71 | port->icount.tx += sent; | 70 | port->icount.tx += sent; |
72 | } | 71 | } |
73 | } | 72 | } |
74 | 73 | ||
75 | static int receive_chars_getchar(struct uart_port *port, struct tty_struct *tty) | 74 | static int receive_chars_getchar(struct uart_port *port, struct tty_struct *tty) |
76 | { | 75 | { |
77 | int saw_console_brk = 0; | 76 | int saw_console_brk = 0; |
78 | int limit = 10000; | 77 | int limit = 10000; |
79 | 78 | ||
80 | while (limit-- > 0) { | 79 | while (limit-- > 0) { |
81 | long status; | 80 | long status; |
82 | long c = sun4v_con_getchar(&status); | 81 | long c = sun4v_con_getchar(&status); |
83 | 82 | ||
84 | if (status == HV_EWOULDBLOCK) | 83 | if (status == HV_EWOULDBLOCK) |
85 | break; | 84 | break; |
86 | 85 | ||
87 | if (c == CON_BREAK) { | 86 | if (c == CON_BREAK) { |
88 | if (uart_handle_break(port)) | 87 | if (uart_handle_break(port)) |
89 | continue; | 88 | continue; |
90 | saw_console_brk = 1; | 89 | saw_console_brk = 1; |
91 | c = 0; | 90 | c = 0; |
92 | } | 91 | } |
93 | 92 | ||
94 | if (c == CON_HUP) { | 93 | if (c == CON_HUP) { |
95 | hung_up = 1; | 94 | hung_up = 1; |
96 | uart_handle_dcd_change(port, 0); | 95 | uart_handle_dcd_change(port, 0); |
97 | } else if (hung_up) { | 96 | } else if (hung_up) { |
98 | hung_up = 0; | 97 | hung_up = 0; |
99 | uart_handle_dcd_change(port, 1); | 98 | uart_handle_dcd_change(port, 1); |
100 | } | 99 | } |
101 | 100 | ||
102 | if (tty == NULL) { | 101 | if (tty == NULL) { |
103 | uart_handle_sysrq_char(port, c); | 102 | uart_handle_sysrq_char(port, c); |
104 | continue; | 103 | continue; |
105 | } | 104 | } |
106 | 105 | ||
107 | port->icount.rx++; | 106 | port->icount.rx++; |
108 | 107 | ||
109 | if (uart_handle_sysrq_char(port, c)) | 108 | if (uart_handle_sysrq_char(port, c)) |
110 | continue; | 109 | continue; |
111 | 110 | ||
112 | tty_insert_flip_char(tty, c, TTY_NORMAL); | 111 | tty_insert_flip_char(tty, c, TTY_NORMAL); |
113 | } | 112 | } |
114 | 113 | ||
115 | return saw_console_brk; | 114 | return saw_console_brk; |
116 | } | 115 | } |
117 | 116 | ||
118 | static int receive_chars_read(struct uart_port *port, struct tty_struct *tty) | 117 | static int receive_chars_read(struct uart_port *port, struct tty_struct *tty) |
119 | { | 118 | { |
120 | int saw_console_brk = 0; | 119 | int saw_console_brk = 0; |
121 | int limit = 10000; | 120 | int limit = 10000; |
122 | 121 | ||
123 | while (limit-- > 0) { | 122 | while (limit-- > 0) { |
124 | unsigned long ra = __pa(con_read_page); | 123 | unsigned long ra = __pa(con_read_page); |
125 | unsigned long bytes_read, i; | 124 | unsigned long bytes_read, i; |
126 | long stat = sun4v_con_read(ra, PAGE_SIZE, &bytes_read); | 125 | long stat = sun4v_con_read(ra, PAGE_SIZE, &bytes_read); |
127 | 126 | ||
128 | if (stat != HV_EOK) { | 127 | if (stat != HV_EOK) { |
129 | bytes_read = 0; | 128 | bytes_read = 0; |
130 | 129 | ||
131 | if (stat == CON_BREAK) { | 130 | if (stat == CON_BREAK) { |
132 | if (uart_handle_break(port)) | 131 | if (uart_handle_break(port)) |
133 | continue; | 132 | continue; |
134 | saw_console_brk = 1; | 133 | saw_console_brk = 1; |
135 | *con_read_page = 0; | 134 | *con_read_page = 0; |
136 | bytes_read = 1; | 135 | bytes_read = 1; |
137 | } else if (stat == CON_HUP) { | 136 | } else if (stat == CON_HUP) { |
138 | hung_up = 1; | 137 | hung_up = 1; |
139 | uart_handle_dcd_change(port, 0); | 138 | uart_handle_dcd_change(port, 0); |
140 | continue; | 139 | continue; |
141 | } else { | 140 | } else { |
142 | /* HV_EWOULDBLOCK, etc. */ | 141 | /* HV_EWOULDBLOCK, etc. */ |
143 | break; | 142 | break; |
144 | } | 143 | } |
145 | } | 144 | } |
146 | 145 | ||
147 | if (hung_up) { | 146 | if (hung_up) { |
148 | hung_up = 0; | 147 | hung_up = 0; |
149 | uart_handle_dcd_change(port, 1); | 148 | uart_handle_dcd_change(port, 1); |
150 | } | 149 | } |
151 | 150 | ||
152 | for (i = 0; i < bytes_read; i++) | 151 | for (i = 0; i < bytes_read; i++) |
153 | uart_handle_sysrq_char(port, con_read_page[i]); | 152 | uart_handle_sysrq_char(port, con_read_page[i]); |
154 | 153 | ||
155 | if (tty == NULL) | 154 | if (tty == NULL) |
156 | continue; | 155 | continue; |
157 | 156 | ||
158 | port->icount.rx += bytes_read; | 157 | port->icount.rx += bytes_read; |
159 | 158 | ||
160 | tty_insert_flip_string(tty, con_read_page, bytes_read); | 159 | tty_insert_flip_string(tty, con_read_page, bytes_read); |
161 | } | 160 | } |
162 | 161 | ||
163 | return saw_console_brk; | 162 | return saw_console_brk; |
164 | } | 163 | } |
165 | 164 | ||
166 | struct sunhv_ops { | 165 | struct sunhv_ops { |
167 | void (*transmit_chars)(struct uart_port *port, struct circ_buf *xmit); | 166 | void (*transmit_chars)(struct uart_port *port, struct circ_buf *xmit); |
168 | int (*receive_chars)(struct uart_port *port, struct tty_struct *tty); | 167 | int (*receive_chars)(struct uart_port *port, struct tty_struct *tty); |
169 | }; | 168 | }; |
170 | 169 | ||
171 | static struct sunhv_ops bychar_ops = { | 170 | static struct sunhv_ops bychar_ops = { |
172 | .transmit_chars = transmit_chars_putchar, | 171 | .transmit_chars = transmit_chars_putchar, |
173 | .receive_chars = receive_chars_getchar, | 172 | .receive_chars = receive_chars_getchar, |
174 | }; | 173 | }; |
175 | 174 | ||
176 | static struct sunhv_ops bywrite_ops = { | 175 | static struct sunhv_ops bywrite_ops = { |
177 | .transmit_chars = transmit_chars_write, | 176 | .transmit_chars = transmit_chars_write, |
178 | .receive_chars = receive_chars_read, | 177 | .receive_chars = receive_chars_read, |
179 | }; | 178 | }; |
180 | 179 | ||
181 | static struct sunhv_ops *sunhv_ops = &bychar_ops; | 180 | static struct sunhv_ops *sunhv_ops = &bychar_ops; |
182 | 181 | ||
183 | static struct tty_struct *receive_chars(struct uart_port *port) | 182 | static struct tty_struct *receive_chars(struct uart_port *port) |
184 | { | 183 | { |
185 | struct tty_struct *tty = NULL; | 184 | struct tty_struct *tty = NULL; |
186 | 185 | ||
187 | if (port->state != NULL) /* Unopened serial console */ | 186 | if (port->state != NULL) /* Unopened serial console */ |
188 | tty = port->state->port.tty; | 187 | tty = port->state->port.tty; |
189 | 188 | ||
190 | if (sunhv_ops->receive_chars(port, tty)) | 189 | if (sunhv_ops->receive_chars(port, tty)) |
191 | sun_do_break(); | 190 | sun_do_break(); |
192 | 191 | ||
193 | return tty; | 192 | return tty; |
194 | } | 193 | } |
195 | 194 | ||
196 | static void transmit_chars(struct uart_port *port) | 195 | static void transmit_chars(struct uart_port *port) |
197 | { | 196 | { |
198 | struct circ_buf *xmit; | 197 | struct circ_buf *xmit; |
199 | 198 | ||
200 | if (!port->state) | 199 | if (!port->state) |
201 | return; | 200 | return; |
202 | 201 | ||
203 | xmit = &port->state->xmit; | 202 | xmit = &port->state->xmit; |
204 | if (uart_circ_empty(xmit) || uart_tx_stopped(port)) | 203 | if (uart_circ_empty(xmit) || uart_tx_stopped(port)) |
205 | return; | 204 | return; |
206 | 205 | ||
207 | sunhv_ops->transmit_chars(port, xmit); | 206 | sunhv_ops->transmit_chars(port, xmit); |
208 | 207 | ||
209 | if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) | 208 | if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) |
210 | uart_write_wakeup(port); | 209 | uart_write_wakeup(port); |
211 | } | 210 | } |
212 | 211 | ||
213 | static irqreturn_t sunhv_interrupt(int irq, void *dev_id) | 212 | static irqreturn_t sunhv_interrupt(int irq, void *dev_id) |
214 | { | 213 | { |
215 | struct uart_port *port = dev_id; | 214 | struct uart_port *port = dev_id; |
216 | struct tty_struct *tty; | 215 | struct tty_struct *tty; |
217 | unsigned long flags; | 216 | unsigned long flags; |
218 | 217 | ||
219 | spin_lock_irqsave(&port->lock, flags); | 218 | spin_lock_irqsave(&port->lock, flags); |
220 | tty = receive_chars(port); | 219 | tty = receive_chars(port); |
221 | transmit_chars(port); | 220 | transmit_chars(port); |
222 | spin_unlock_irqrestore(&port->lock, flags); | 221 | spin_unlock_irqrestore(&port->lock, flags); |
223 | 222 | ||
224 | if (tty) | 223 | if (tty) |
225 | tty_flip_buffer_push(tty); | 224 | tty_flip_buffer_push(tty); |
226 | 225 | ||
227 | return IRQ_HANDLED; | 226 | return IRQ_HANDLED; |
228 | } | 227 | } |
229 | 228 | ||
230 | /* port->lock is not held. */ | 229 | /* port->lock is not held. */ |
231 | static unsigned int sunhv_tx_empty(struct uart_port *port) | 230 | static unsigned int sunhv_tx_empty(struct uart_port *port) |
232 | { | 231 | { |
233 | /* Transmitter is always empty for us. If the circ buffer | 232 | /* Transmitter is always empty for us. If the circ buffer |
234 | * is non-empty or there is an x_char pending, our caller | 233 | * is non-empty or there is an x_char pending, our caller |
235 | * will do the right thing and ignore what we return here. | 234 | * will do the right thing and ignore what we return here. |
236 | */ | 235 | */ |
237 | return TIOCSER_TEMT; | 236 | return TIOCSER_TEMT; |
238 | } | 237 | } |
239 | 238 | ||
240 | /* port->lock held by caller. */ | 239 | /* port->lock held by caller. */ |
241 | static void sunhv_set_mctrl(struct uart_port *port, unsigned int mctrl) | 240 | static void sunhv_set_mctrl(struct uart_port *port, unsigned int mctrl) |
242 | { | 241 | { |
243 | return; | 242 | return; |
244 | } | 243 | } |
245 | 244 | ||
246 | /* port->lock is held by caller and interrupts are disabled. */ | 245 | /* port->lock is held by caller and interrupts are disabled. */ |
247 | static unsigned int sunhv_get_mctrl(struct uart_port *port) | 246 | static unsigned int sunhv_get_mctrl(struct uart_port *port) |
248 | { | 247 | { |
249 | return TIOCM_DSR | TIOCM_CAR | TIOCM_CTS; | 248 | return TIOCM_DSR | TIOCM_CAR | TIOCM_CTS; |
250 | } | 249 | } |
251 | 250 | ||
252 | /* port->lock held by caller. */ | 251 | /* port->lock held by caller. */ |
253 | static void sunhv_stop_tx(struct uart_port *port) | 252 | static void sunhv_stop_tx(struct uart_port *port) |
254 | { | 253 | { |
255 | return; | 254 | return; |
256 | } | 255 | } |
257 | 256 | ||
258 | /* port->lock held by caller. */ | 257 | /* port->lock held by caller. */ |
259 | static void sunhv_start_tx(struct uart_port *port) | 258 | static void sunhv_start_tx(struct uart_port *port) |
260 | { | 259 | { |
261 | transmit_chars(port); | 260 | transmit_chars(port); |
262 | } | 261 | } |
263 | 262 | ||
264 | /* port->lock is not held. */ | 263 | /* port->lock is not held. */ |
265 | static void sunhv_send_xchar(struct uart_port *port, char ch) | 264 | static void sunhv_send_xchar(struct uart_port *port, char ch) |
266 | { | 265 | { |
267 | unsigned long flags; | 266 | unsigned long flags; |
268 | int limit = 10000; | 267 | int limit = 10000; |
269 | 268 | ||
270 | spin_lock_irqsave(&port->lock, flags); | 269 | spin_lock_irqsave(&port->lock, flags); |
271 | 270 | ||
272 | while (limit-- > 0) { | 271 | while (limit-- > 0) { |
273 | long status = sun4v_con_putchar(ch); | 272 | long status = sun4v_con_putchar(ch); |
274 | if (status == HV_EOK) | 273 | if (status == HV_EOK) |
275 | break; | 274 | break; |
276 | udelay(1); | 275 | udelay(1); |
277 | } | 276 | } |
278 | 277 | ||
279 | spin_unlock_irqrestore(&port->lock, flags); | 278 | spin_unlock_irqrestore(&port->lock, flags); |
280 | } | 279 | } |
281 | 280 | ||
282 | /* port->lock held by caller. */ | 281 | /* port->lock held by caller. */ |
283 | static void sunhv_stop_rx(struct uart_port *port) | 282 | static void sunhv_stop_rx(struct uart_port *port) |
284 | { | 283 | { |
285 | } | 284 | } |
286 | 285 | ||
287 | /* port->lock held by caller. */ | 286 | /* port->lock held by caller. */ |
288 | static void sunhv_enable_ms(struct uart_port *port) | 287 | static void sunhv_enable_ms(struct uart_port *port) |
289 | { | 288 | { |
290 | } | 289 | } |
291 | 290 | ||
292 | /* port->lock is not held. */ | 291 | /* port->lock is not held. */ |
293 | static void sunhv_break_ctl(struct uart_port *port, int break_state) | 292 | static void sunhv_break_ctl(struct uart_port *port, int break_state) |
294 | { | 293 | { |
295 | if (break_state) { | 294 | if (break_state) { |
296 | unsigned long flags; | 295 | unsigned long flags; |
297 | int limit = 10000; | 296 | int limit = 10000; |
298 | 297 | ||
299 | spin_lock_irqsave(&port->lock, flags); | 298 | spin_lock_irqsave(&port->lock, flags); |
300 | 299 | ||
301 | while (limit-- > 0) { | 300 | while (limit-- > 0) { |
302 | long status = sun4v_con_putchar(CON_BREAK); | 301 | long status = sun4v_con_putchar(CON_BREAK); |
303 | if (status == HV_EOK) | 302 | if (status == HV_EOK) |
304 | break; | 303 | break; |
305 | udelay(1); | 304 | udelay(1); |
306 | } | 305 | } |
307 | 306 | ||
308 | spin_unlock_irqrestore(&port->lock, flags); | 307 | spin_unlock_irqrestore(&port->lock, flags); |
309 | } | 308 | } |
310 | } | 309 | } |
311 | 310 | ||
312 | /* port->lock is not held. */ | 311 | /* port->lock is not held. */ |
313 | static int sunhv_startup(struct uart_port *port) | 312 | static int sunhv_startup(struct uart_port *port) |
314 | { | 313 | { |
315 | return 0; | 314 | return 0; |
316 | } | 315 | } |
317 | 316 | ||
318 | /* port->lock is not held. */ | 317 | /* port->lock is not held. */ |
319 | static void sunhv_shutdown(struct uart_port *port) | 318 | static void sunhv_shutdown(struct uart_port *port) |
320 | { | 319 | { |
321 | } | 320 | } |
322 | 321 | ||
323 | /* port->lock is not held. */ | 322 | /* port->lock is not held. */ |
324 | static void sunhv_set_termios(struct uart_port *port, struct ktermios *termios, | 323 | static void sunhv_set_termios(struct uart_port *port, struct ktermios *termios, |
325 | struct ktermios *old) | 324 | struct ktermios *old) |
326 | { | 325 | { |
327 | unsigned int baud = uart_get_baud_rate(port, termios, old, 0, 4000000); | 326 | unsigned int baud = uart_get_baud_rate(port, termios, old, 0, 4000000); |
328 | unsigned int quot = uart_get_divisor(port, baud); | 327 | unsigned int quot = uart_get_divisor(port, baud); |
329 | unsigned int iflag, cflag; | 328 | unsigned int iflag, cflag; |
330 | unsigned long flags; | 329 | unsigned long flags; |
331 | 330 | ||
332 | spin_lock_irqsave(&port->lock, flags); | 331 | spin_lock_irqsave(&port->lock, flags); |
333 | 332 | ||
334 | iflag = termios->c_iflag; | 333 | iflag = termios->c_iflag; |
335 | cflag = termios->c_cflag; | 334 | cflag = termios->c_cflag; |
336 | 335 | ||
337 | port->ignore_status_mask = 0; | 336 | port->ignore_status_mask = 0; |
338 | if (iflag & IGNBRK) | 337 | if (iflag & IGNBRK) |
339 | port->ignore_status_mask |= IGNORE_BREAK; | 338 | port->ignore_status_mask |= IGNORE_BREAK; |
340 | if ((cflag & CREAD) == 0) | 339 | if ((cflag & CREAD) == 0) |
341 | port->ignore_status_mask |= IGNORE_ALL; | 340 | port->ignore_status_mask |= IGNORE_ALL; |
342 | 341 | ||
343 | /* XXX */ | 342 | /* XXX */ |
344 | uart_update_timeout(port, cflag, | 343 | uart_update_timeout(port, cflag, |
345 | (port->uartclk / (16 * quot))); | 344 | (port->uartclk / (16 * quot))); |
346 | 345 | ||
347 | spin_unlock_irqrestore(&port->lock, flags); | 346 | spin_unlock_irqrestore(&port->lock, flags); |
348 | } | 347 | } |
349 | 348 | ||
350 | static const char *sunhv_type(struct uart_port *port) | 349 | static const char *sunhv_type(struct uart_port *port) |
351 | { | 350 | { |
352 | return "SUN4V HCONS"; | 351 | return "SUN4V HCONS"; |
353 | } | 352 | } |
354 | 353 | ||
355 | static void sunhv_release_port(struct uart_port *port) | 354 | static void sunhv_release_port(struct uart_port *port) |
356 | { | 355 | { |
357 | } | 356 | } |
358 | 357 | ||
359 | static int sunhv_request_port(struct uart_port *port) | 358 | static int sunhv_request_port(struct uart_port *port) |
360 | { | 359 | { |
361 | return 0; | 360 | return 0; |
362 | } | 361 | } |
363 | 362 | ||
364 | static void sunhv_config_port(struct uart_port *port, int flags) | 363 | static void sunhv_config_port(struct uart_port *port, int flags) |
365 | { | 364 | { |
366 | } | 365 | } |
367 | 366 | ||
368 | static int sunhv_verify_port(struct uart_port *port, struct serial_struct *ser) | 367 | static int sunhv_verify_port(struct uart_port *port, struct serial_struct *ser) |
369 | { | 368 | { |
370 | return -EINVAL; | 369 | return -EINVAL; |
371 | } | 370 | } |
372 | 371 | ||
373 | static struct uart_ops sunhv_pops = { | 372 | static struct uart_ops sunhv_pops = { |
374 | .tx_empty = sunhv_tx_empty, | 373 | .tx_empty = sunhv_tx_empty, |
375 | .set_mctrl = sunhv_set_mctrl, | 374 | .set_mctrl = sunhv_set_mctrl, |
376 | .get_mctrl = sunhv_get_mctrl, | 375 | .get_mctrl = sunhv_get_mctrl, |
377 | .stop_tx = sunhv_stop_tx, | 376 | .stop_tx = sunhv_stop_tx, |
378 | .start_tx = sunhv_start_tx, | 377 | .start_tx = sunhv_start_tx, |
379 | .send_xchar = sunhv_send_xchar, | 378 | .send_xchar = sunhv_send_xchar, |
380 | .stop_rx = sunhv_stop_rx, | 379 | .stop_rx = sunhv_stop_rx, |
381 | .enable_ms = sunhv_enable_ms, | 380 | .enable_ms = sunhv_enable_ms, |
382 | .break_ctl = sunhv_break_ctl, | 381 | .break_ctl = sunhv_break_ctl, |
383 | .startup = sunhv_startup, | 382 | .startup = sunhv_startup, |
384 | .shutdown = sunhv_shutdown, | 383 | .shutdown = sunhv_shutdown, |
385 | .set_termios = sunhv_set_termios, | 384 | .set_termios = sunhv_set_termios, |
386 | .type = sunhv_type, | 385 | .type = sunhv_type, |
387 | .release_port = sunhv_release_port, | 386 | .release_port = sunhv_release_port, |
388 | .request_port = sunhv_request_port, | 387 | .request_port = sunhv_request_port, |
389 | .config_port = sunhv_config_port, | 388 | .config_port = sunhv_config_port, |
390 | .verify_port = sunhv_verify_port, | 389 | .verify_port = sunhv_verify_port, |
391 | }; | 390 | }; |
392 | 391 | ||
393 | static struct uart_driver sunhv_reg = { | 392 | static struct uart_driver sunhv_reg = { |
394 | .owner = THIS_MODULE, | 393 | .owner = THIS_MODULE, |
395 | .driver_name = "sunhv", | 394 | .driver_name = "sunhv", |
396 | .dev_name = "ttyS", | 395 | .dev_name = "ttyS", |
397 | .major = TTY_MAJOR, | 396 | .major = TTY_MAJOR, |
398 | }; | 397 | }; |
399 | 398 | ||
400 | static struct uart_port *sunhv_port; | 399 | static struct uart_port *sunhv_port; |
401 | 400 | ||
402 | /* Copy 's' into the con_write_page, decoding "\n" into | 401 | /* Copy 's' into the con_write_page, decoding "\n" into |
403 | * "\r\n" along the way. We have to return two lengths | 402 | * "\r\n" along the way. We have to return two lengths |
404 | * because the caller needs to know how much to advance | 403 | * because the caller needs to know how much to advance |
405 | * 's' and also how many bytes to output via con_write_page. | 404 | * 's' and also how many bytes to output via con_write_page. |
406 | */ | 405 | */ |
407 | static int fill_con_write_page(const char *s, unsigned int n, | 406 | static int fill_con_write_page(const char *s, unsigned int n, |
408 | unsigned long *page_bytes) | 407 | unsigned long *page_bytes) |
409 | { | 408 | { |
410 | const char *orig_s = s; | 409 | const char *orig_s = s; |
411 | char *p = con_write_page; | 410 | char *p = con_write_page; |
412 | int left = PAGE_SIZE; | 411 | int left = PAGE_SIZE; |
413 | 412 | ||
414 | while (n--) { | 413 | while (n--) { |
415 | if (*s == '\n') { | 414 | if (*s == '\n') { |
416 | if (left < 2) | 415 | if (left < 2) |
417 | break; | 416 | break; |
418 | *p++ = '\r'; | 417 | *p++ = '\r'; |
419 | left--; | 418 | left--; |
420 | } else if (left < 1) | 419 | } else if (left < 1) |
421 | break; | 420 | break; |
422 | *p++ = *s++; | 421 | *p++ = *s++; |
423 | left--; | 422 | left--; |
424 | } | 423 | } |
425 | *page_bytes = p - con_write_page; | 424 | *page_bytes = p - con_write_page; |
426 | return s - orig_s; | 425 | return s - orig_s; |
427 | } | 426 | } |
428 | 427 | ||
429 | static void sunhv_console_write_paged(struct console *con, const char *s, unsigned n) | 428 | static void sunhv_console_write_paged(struct console *con, const char *s, unsigned n) |
430 | { | 429 | { |
431 | struct uart_port *port = sunhv_port; | 430 | struct uart_port *port = sunhv_port; |
432 | unsigned long flags; | 431 | unsigned long flags; |
433 | int locked = 1; | 432 | int locked = 1; |
434 | 433 | ||
435 | local_irq_save(flags); | 434 | local_irq_save(flags); |
436 | if (port->sysrq) { | 435 | if (port->sysrq) { |
437 | locked = 0; | 436 | locked = 0; |
438 | } else if (oops_in_progress) { | 437 | } else if (oops_in_progress) { |
439 | locked = spin_trylock(&port->lock); | 438 | locked = spin_trylock(&port->lock); |
440 | } else | 439 | } else |
441 | spin_lock(&port->lock); | 440 | spin_lock(&port->lock); |
442 | 441 | ||
443 | while (n > 0) { | 442 | while (n > 0) { |
444 | unsigned long ra = __pa(con_write_page); | 443 | unsigned long ra = __pa(con_write_page); |
445 | unsigned long page_bytes; | 444 | unsigned long page_bytes; |
446 | unsigned int cpy = fill_con_write_page(s, n, | 445 | unsigned int cpy = fill_con_write_page(s, n, |
447 | &page_bytes); | 446 | &page_bytes); |
448 | 447 | ||
449 | n -= cpy; | 448 | n -= cpy; |
450 | s += cpy; | 449 | s += cpy; |
451 | while (page_bytes > 0) { | 450 | while (page_bytes > 0) { |
452 | unsigned long written; | 451 | unsigned long written; |
453 | int limit = 1000000; | 452 | int limit = 1000000; |
454 | 453 | ||
455 | while (limit--) { | 454 | while (limit--) { |
456 | unsigned long stat; | 455 | unsigned long stat; |
457 | 456 | ||
458 | stat = sun4v_con_write(ra, page_bytes, | 457 | stat = sun4v_con_write(ra, page_bytes, |
459 | &written); | 458 | &written); |
460 | if (stat == HV_EOK) | 459 | if (stat == HV_EOK) |
461 | break; | 460 | break; |
462 | udelay(1); | 461 | udelay(1); |
463 | } | 462 | } |
464 | if (limit < 0) | 463 | if (limit < 0) |
465 | break; | 464 | break; |
466 | page_bytes -= written; | 465 | page_bytes -= written; |
467 | ra += written; | 466 | ra += written; |
468 | } | 467 | } |
469 | } | 468 | } |
470 | 469 | ||
471 | if (locked) | 470 | if (locked) |
472 | spin_unlock(&port->lock); | 471 | spin_unlock(&port->lock); |
473 | local_irq_restore(flags); | 472 | local_irq_restore(flags); |
474 | } | 473 | } |
475 | 474 | ||
476 | static inline void sunhv_console_putchar(struct uart_port *port, char c) | 475 | static inline void sunhv_console_putchar(struct uart_port *port, char c) |
477 | { | 476 | { |
478 | int limit = 1000000; | 477 | int limit = 1000000; |
479 | 478 | ||
480 | while (limit-- > 0) { | 479 | while (limit-- > 0) { |
481 | long status = sun4v_con_putchar(c); | 480 | long status = sun4v_con_putchar(c); |
482 | if (status == HV_EOK) | 481 | if (status == HV_EOK) |
483 | break; | 482 | break; |
484 | udelay(1); | 483 | udelay(1); |
485 | } | 484 | } |
486 | } | 485 | } |
487 | 486 | ||
488 | static void sunhv_console_write_bychar(struct console *con, const char *s, unsigned n) | 487 | static void sunhv_console_write_bychar(struct console *con, const char *s, unsigned n) |
489 | { | 488 | { |
490 | struct uart_port *port = sunhv_port; | 489 | struct uart_port *port = sunhv_port; |
491 | unsigned long flags; | 490 | unsigned long flags; |
492 | int i, locked = 1; | 491 | int i, locked = 1; |
493 | 492 | ||
494 | local_irq_save(flags); | 493 | local_irq_save(flags); |
495 | if (port->sysrq) { | 494 | if (port->sysrq) { |
496 | locked = 0; | 495 | locked = 0; |
497 | } else if (oops_in_progress) { | 496 | } else if (oops_in_progress) { |
498 | locked = spin_trylock(&port->lock); | 497 | locked = spin_trylock(&port->lock); |
499 | } else | 498 | } else |
500 | spin_lock(&port->lock); | 499 | spin_lock(&port->lock); |
501 | 500 | ||
502 | for (i = 0; i < n; i++) { | 501 | for (i = 0; i < n; i++) { |
503 | if (*s == '\n') | 502 | if (*s == '\n') |
504 | sunhv_console_putchar(port, '\r'); | 503 | sunhv_console_putchar(port, '\r'); |
505 | sunhv_console_putchar(port, *s++); | 504 | sunhv_console_putchar(port, *s++); |
506 | } | 505 | } |
507 | 506 | ||
508 | if (locked) | 507 | if (locked) |
509 | spin_unlock(&port->lock); | 508 | spin_unlock(&port->lock); |
510 | local_irq_restore(flags); | 509 | local_irq_restore(flags); |
511 | } | 510 | } |
512 | 511 | ||
513 | static struct console sunhv_console = { | 512 | static struct console sunhv_console = { |
514 | .name = "ttyHV", | 513 | .name = "ttyHV", |
515 | .write = sunhv_console_write_bychar, | 514 | .write = sunhv_console_write_bychar, |
516 | .device = uart_console_device, | 515 | .device = uart_console_device, |
517 | .flags = CON_PRINTBUFFER, | 516 | .flags = CON_PRINTBUFFER, |
518 | .index = -1, | 517 | .index = -1, |
519 | .data = &sunhv_reg, | 518 | .data = &sunhv_reg, |
520 | }; | 519 | }; |
521 | 520 | ||
522 | static int __devinit hv_probe(struct platform_device *op) | 521 | static int __devinit hv_probe(struct platform_device *op) |
523 | { | 522 | { |
524 | struct uart_port *port; | 523 | struct uart_port *port; |
525 | unsigned long minor; | 524 | unsigned long minor; |
526 | int err; | 525 | int err; |
527 | 526 | ||
528 | if (op->archdata.irqs[0] == 0xffffffff) | 527 | if (op->archdata.irqs[0] == 0xffffffff) |
529 | return -ENODEV; | 528 | return -ENODEV; |
530 | 529 | ||
531 | port = kzalloc(sizeof(struct uart_port), GFP_KERNEL); | 530 | port = kzalloc(sizeof(struct uart_port), GFP_KERNEL); |
532 | if (unlikely(!port)) | 531 | if (unlikely(!port)) |
533 | return -ENOMEM; | 532 | return -ENOMEM; |
534 | 533 | ||
535 | minor = 1; | 534 | minor = 1; |
536 | if (sun4v_hvapi_register(HV_GRP_CORE, 1, &minor) == 0 && | 535 | if (sun4v_hvapi_register(HV_GRP_CORE, 1, &minor) == 0 && |
537 | minor >= 1) { | 536 | minor >= 1) { |
538 | err = -ENOMEM; | 537 | err = -ENOMEM; |
539 | con_write_page = kzalloc(PAGE_SIZE, GFP_KERNEL); | 538 | con_write_page = kzalloc(PAGE_SIZE, GFP_KERNEL); |
540 | if (!con_write_page) | 539 | if (!con_write_page) |
541 | goto out_free_port; | 540 | goto out_free_port; |
542 | 541 | ||
543 | con_read_page = kzalloc(PAGE_SIZE, GFP_KERNEL); | 542 | con_read_page = kzalloc(PAGE_SIZE, GFP_KERNEL); |
544 | if (!con_read_page) | 543 | if (!con_read_page) |
545 | goto out_free_con_write_page; | 544 | goto out_free_con_write_page; |
546 | 545 | ||
547 | sunhv_console.write = sunhv_console_write_paged; | 546 | sunhv_console.write = sunhv_console_write_paged; |
548 | sunhv_ops = &bywrite_ops; | 547 | sunhv_ops = &bywrite_ops; |
549 | } | 548 | } |
550 | 549 | ||
551 | sunhv_port = port; | 550 | sunhv_port = port; |
552 | 551 | ||
553 | port->line = 0; | 552 | port->line = 0; |
554 | port->ops = &sunhv_pops; | 553 | port->ops = &sunhv_pops; |
555 | port->type = PORT_SUNHV; | 554 | port->type = PORT_SUNHV; |
556 | port->uartclk = ( 29491200 / 16 ); /* arbitrary */ | 555 | port->uartclk = ( 29491200 / 16 ); /* arbitrary */ |
557 | 556 | ||
558 | port->membase = (unsigned char __iomem *) __pa(port); | 557 | port->membase = (unsigned char __iomem *) __pa(port); |
559 | 558 | ||
560 | port->irq = op->archdata.irqs[0]; | 559 | port->irq = op->archdata.irqs[0]; |
561 | 560 | ||
562 | port->dev = &op->dev; | 561 | port->dev = &op->dev; |
563 | 562 | ||
564 | err = sunserial_register_minors(&sunhv_reg, 1); | 563 | err = sunserial_register_minors(&sunhv_reg, 1); |
565 | if (err) | 564 | if (err) |
566 | goto out_free_con_read_page; | 565 | goto out_free_con_read_page; |
567 | 566 | ||
568 | sunserial_console_match(&sunhv_console, op->dev.of_node, | 567 | sunserial_console_match(&sunhv_console, op->dev.of_node, |
569 | &sunhv_reg, port->line, false); | 568 | &sunhv_reg, port->line, false); |
570 | 569 | ||
571 | err = uart_add_one_port(&sunhv_reg, port); | 570 | err = uart_add_one_port(&sunhv_reg, port); |
572 | if (err) | 571 | if (err) |
573 | goto out_unregister_driver; | 572 | goto out_unregister_driver; |
574 | 573 | ||
575 | err = request_irq(port->irq, sunhv_interrupt, 0, "hvcons", port); | 574 | err = request_irq(port->irq, sunhv_interrupt, 0, "hvcons", port); |
576 | if (err) | 575 | if (err) |
577 | goto out_remove_port; | 576 | goto out_remove_port; |
578 | 577 | ||
579 | dev_set_drvdata(&op->dev, port); | 578 | dev_set_drvdata(&op->dev, port); |
580 | 579 | ||
581 | return 0; | 580 | return 0; |
582 | 581 | ||
583 | out_remove_port: | 582 | out_remove_port: |
584 | uart_remove_one_port(&sunhv_reg, port); | 583 | uart_remove_one_port(&sunhv_reg, port); |
585 | 584 | ||
586 | out_unregister_driver: | 585 | out_unregister_driver: |
587 | sunserial_unregister_minors(&sunhv_reg, 1); | 586 | sunserial_unregister_minors(&sunhv_reg, 1); |
588 | 587 | ||
589 | out_free_con_read_page: | 588 | out_free_con_read_page: |
590 | kfree(con_read_page); | 589 | kfree(con_read_page); |
591 | 590 | ||
592 | out_free_con_write_page: | 591 | out_free_con_write_page: |
593 | kfree(con_write_page); | 592 | kfree(con_write_page); |
594 | 593 | ||
595 | out_free_port: | 594 | out_free_port: |
596 | kfree(port); | 595 | kfree(port); |
597 | sunhv_port = NULL; | 596 | sunhv_port = NULL; |
598 | return err; | 597 | return err; |
599 | } | 598 | } |
600 | 599 | ||
601 | static int __devexit hv_remove(struct platform_device *dev) | 600 | static int __devexit hv_remove(struct platform_device *dev) |
602 | { | 601 | { |
603 | struct uart_port *port = dev_get_drvdata(&dev->dev); | 602 | struct uart_port *port = dev_get_drvdata(&dev->dev); |
604 | 603 | ||
605 | free_irq(port->irq, port); | 604 | free_irq(port->irq, port); |
606 | 605 | ||
607 | uart_remove_one_port(&sunhv_reg, port); | 606 | uart_remove_one_port(&sunhv_reg, port); |
608 | 607 | ||
609 | sunserial_unregister_minors(&sunhv_reg, 1); | 608 | sunserial_unregister_minors(&sunhv_reg, 1); |
610 | 609 | ||
611 | kfree(port); | 610 | kfree(port); |
612 | sunhv_port = NULL; | 611 | sunhv_port = NULL; |
613 | 612 | ||
614 | dev_set_drvdata(&dev->dev, NULL); | 613 | dev_set_drvdata(&dev->dev, NULL); |
615 | 614 | ||
616 | return 0; | 615 | return 0; |
617 | } | 616 | } |
618 | 617 | ||
619 | static const struct of_device_id hv_match[] = { | 618 | static const struct of_device_id hv_match[] = { |
620 | { | 619 | { |
621 | .name = "console", | 620 | .name = "console", |
622 | .compatible = "qcn", | 621 | .compatible = "qcn", |
623 | }, | 622 | }, |
624 | { | 623 | { |
625 | .name = "console", | 624 | .name = "console", |
626 | .compatible = "SUNW,sun4v-console", | 625 | .compatible = "SUNW,sun4v-console", |
627 | }, | 626 | }, |
628 | {}, | 627 | {}, |
629 | }; | 628 | }; |
630 | MODULE_DEVICE_TABLE(of, hv_match); | 629 | MODULE_DEVICE_TABLE(of, hv_match); |
631 | 630 | ||
632 | static struct platform_driver hv_driver = { | 631 | static struct platform_driver hv_driver = { |
633 | .driver = { | 632 | .driver = { |
634 | .name = "hv", | 633 | .name = "hv", |
635 | .owner = THIS_MODULE, | 634 | .owner = THIS_MODULE, |
636 | .of_match_table = hv_match, | 635 | .of_match_table = hv_match, |
637 | }, | 636 | }, |
638 | .probe = hv_probe, | 637 | .probe = hv_probe, |
639 | .remove = __devexit_p(hv_remove), | 638 | .remove = __devexit_p(hv_remove), |
640 | }; | 639 | }; |
641 | 640 | ||
642 | static int __init sunhv_init(void) | 641 | static int __init sunhv_init(void) |
643 | { | 642 | { |
644 | if (tlb_type != hypervisor) | 643 | if (tlb_type != hypervisor) |
645 | return -ENODEV; | 644 | return -ENODEV; |
646 | 645 | ||
647 | return platform_driver_register(&hv_driver); | 646 | return platform_driver_register(&hv_driver); |
648 | } | 647 | } |
649 | 648 | ||
650 | static void __exit sunhv_exit(void) | 649 | static void __exit sunhv_exit(void) |
651 | { | 650 | { |
652 | platform_driver_unregister(&hv_driver); | 651 | platform_driver_unregister(&hv_driver); |
653 | } | 652 | } |
654 | 653 | ||
655 | module_init(sunhv_init); | 654 | module_init(sunhv_init); |
656 | module_exit(sunhv_exit); | 655 | module_exit(sunhv_exit); |
657 | 656 | ||
658 | MODULE_AUTHOR("David S. Miller"); | 657 | MODULE_AUTHOR("David S. Miller"); |
659 | MODULE_DESCRIPTION("SUN4V Hypervisor console driver"); | 658 | MODULE_DESCRIPTION("SUN4V Hypervisor console driver"); |
660 | MODULE_VERSION("2.0"); | 659 | MODULE_VERSION("2.0"); |
661 | MODULE_LICENSE("GPL"); | 660 | MODULE_LICENSE("GPL"); |
662 | 661 |
drivers/tty/serial/sunsab.c
1 | /* sunsab.c: ASYNC Driver for the SIEMENS SAB82532 DUSCC. | 1 | /* sunsab.c: ASYNC Driver for the SIEMENS SAB82532 DUSCC. |
2 | * | 2 | * |
3 | * Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be) | 3 | * Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be) |
4 | * Copyright (C) 2002, 2006 David S. Miller (davem@davemloft.net) | 4 | * Copyright (C) 2002, 2006 David S. Miller (davem@davemloft.net) |
5 | * | 5 | * |
6 | * Rewrote buffer handling to use CIRC(Circular Buffer) macros. | 6 | * Rewrote buffer handling to use CIRC(Circular Buffer) macros. |
7 | * Maxim Krasnyanskiy <maxk@qualcomm.com> | 7 | * Maxim Krasnyanskiy <maxk@qualcomm.com> |
8 | * | 8 | * |
9 | * Fixed to use tty_get_baud_rate, and to allow for arbitrary baud | 9 | * Fixed to use tty_get_baud_rate, and to allow for arbitrary baud |
10 | * rates to be programmed into the UART. Also eliminated a lot of | 10 | * rates to be programmed into the UART. Also eliminated a lot of |
11 | * duplicated code in the console setup. | 11 | * duplicated code in the console setup. |
12 | * Theodore Ts'o <tytso@mit.edu>, 2001-Oct-12 | 12 | * Theodore Ts'o <tytso@mit.edu>, 2001-Oct-12 |
13 | * | 13 | * |
14 | * Ported to new 2.5.x UART layer. | 14 | * Ported to new 2.5.x UART layer. |
15 | * David S. Miller <davem@davemloft.net> | 15 | * David S. Miller <davem@davemloft.net> |
16 | */ | 16 | */ |
17 | 17 | ||
18 | #include <linux/module.h> | 18 | #include <linux/module.h> |
19 | #include <linux/kernel.h> | 19 | #include <linux/kernel.h> |
20 | #include <linux/errno.h> | 20 | #include <linux/errno.h> |
21 | #include <linux/tty.h> | 21 | #include <linux/tty.h> |
22 | #include <linux/tty_flip.h> | 22 | #include <linux/tty_flip.h> |
23 | #include <linux/major.h> | 23 | #include <linux/major.h> |
24 | #include <linux/string.h> | 24 | #include <linux/string.h> |
25 | #include <linux/ptrace.h> | 25 | #include <linux/ptrace.h> |
26 | #include <linux/ioport.h> | 26 | #include <linux/ioport.h> |
27 | #include <linux/circ_buf.h> | 27 | #include <linux/circ_buf.h> |
28 | #include <linux/serial.h> | 28 | #include <linux/serial.h> |
29 | #include <linux/sysrq.h> | 29 | #include <linux/sysrq.h> |
30 | #include <linux/console.h> | 30 | #include <linux/console.h> |
31 | #include <linux/spinlock.h> | 31 | #include <linux/spinlock.h> |
32 | #include <linux/slab.h> | 32 | #include <linux/slab.h> |
33 | #include <linux/delay.h> | 33 | #include <linux/delay.h> |
34 | #include <linux/init.h> | 34 | #include <linux/init.h> |
35 | #include <linux/of_device.h> | 35 | #include <linux/of_device.h> |
36 | 36 | ||
37 | #include <asm/io.h> | 37 | #include <asm/io.h> |
38 | #include <asm/irq.h> | 38 | #include <asm/irq.h> |
39 | #include <asm/prom.h> | 39 | #include <asm/prom.h> |
40 | 40 | ||
41 | #if defined(CONFIG_SERIAL_SUNSAB_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) | 41 | #if defined(CONFIG_SERIAL_SUNSAB_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) |
42 | #define SUPPORT_SYSRQ | 42 | #define SUPPORT_SYSRQ |
43 | #endif | 43 | #endif |
44 | 44 | ||
45 | #include <linux/serial_core.h> | 45 | #include <linux/serial_core.h> |
46 | #include <linux/sunserialcore.h> | ||
46 | 47 | ||
47 | #include "suncore.h" | ||
48 | #include "sunsab.h" | 48 | #include "sunsab.h" |
49 | 49 | ||
50 | struct uart_sunsab_port { | 50 | struct uart_sunsab_port { |
51 | struct uart_port port; /* Generic UART port */ | 51 | struct uart_port port; /* Generic UART port */ |
52 | union sab82532_async_regs __iomem *regs; /* Chip registers */ | 52 | union sab82532_async_regs __iomem *regs; /* Chip registers */ |
53 | unsigned long irqflags; /* IRQ state flags */ | 53 | unsigned long irqflags; /* IRQ state flags */ |
54 | int dsr; /* Current DSR state */ | 54 | int dsr; /* Current DSR state */ |
55 | unsigned int cec_timeout; /* Chip poll timeout... */ | 55 | unsigned int cec_timeout; /* Chip poll timeout... */ |
56 | unsigned int tec_timeout; /* likewise */ | 56 | unsigned int tec_timeout; /* likewise */ |
57 | unsigned char interrupt_mask0;/* ISR0 masking */ | 57 | unsigned char interrupt_mask0;/* ISR0 masking */ |
58 | unsigned char interrupt_mask1;/* ISR1 masking */ | 58 | unsigned char interrupt_mask1;/* ISR1 masking */ |
59 | unsigned char pvr_dtr_bit; /* Which PVR bit is DTR */ | 59 | unsigned char pvr_dtr_bit; /* Which PVR bit is DTR */ |
60 | unsigned char pvr_dsr_bit; /* Which PVR bit is DSR */ | 60 | unsigned char pvr_dsr_bit; /* Which PVR bit is DSR */ |
61 | unsigned int gis_shift; | 61 | unsigned int gis_shift; |
62 | int type; /* SAB82532 version */ | 62 | int type; /* SAB82532 version */ |
63 | 63 | ||
64 | /* Setting configuration bits while the transmitter is active | 64 | /* Setting configuration bits while the transmitter is active |
65 | * can cause garbage characters to get emitted by the chip. | 65 | * can cause garbage characters to get emitted by the chip. |
66 | * Therefore, we cache such writes here and do the real register | 66 | * Therefore, we cache such writes here and do the real register |
67 | * write the next time the transmitter becomes idle. | 67 | * write the next time the transmitter becomes idle. |
68 | */ | 68 | */ |
69 | unsigned int cached_ebrg; | 69 | unsigned int cached_ebrg; |
70 | unsigned char cached_mode; | 70 | unsigned char cached_mode; |
71 | unsigned char cached_pvr; | 71 | unsigned char cached_pvr; |
72 | unsigned char cached_dafo; | 72 | unsigned char cached_dafo; |
73 | }; | 73 | }; |
74 | 74 | ||
75 | /* | 75 | /* |
76 | * This assumes you have a 29.4912 MHz clock for your UART. | 76 | * This assumes you have a 29.4912 MHz clock for your UART. |
77 | */ | 77 | */ |
78 | #define SAB_BASE_BAUD ( 29491200 / 16 ) | 78 | #define SAB_BASE_BAUD ( 29491200 / 16 ) |
79 | 79 | ||
80 | static char *sab82532_version[16] = { | 80 | static char *sab82532_version[16] = { |
81 | "V1.0", "V2.0", "V3.2", "V(0x03)", | 81 | "V1.0", "V2.0", "V3.2", "V(0x03)", |
82 | "V(0x04)", "V(0x05)", "V(0x06)", "V(0x07)", | 82 | "V(0x04)", "V(0x05)", "V(0x06)", "V(0x07)", |
83 | "V(0x08)", "V(0x09)", "V(0x0a)", "V(0x0b)", | 83 | "V(0x08)", "V(0x09)", "V(0x0a)", "V(0x0b)", |
84 | "V(0x0c)", "V(0x0d)", "V(0x0e)", "V(0x0f)" | 84 | "V(0x0c)", "V(0x0d)", "V(0x0e)", "V(0x0f)" |
85 | }; | 85 | }; |
86 | 86 | ||
87 | #define SAB82532_MAX_TEC_TIMEOUT 200000 /* 1 character time (at 50 baud) */ | 87 | #define SAB82532_MAX_TEC_TIMEOUT 200000 /* 1 character time (at 50 baud) */ |
88 | #define SAB82532_MAX_CEC_TIMEOUT 50000 /* 2.5 TX CLKs (at 50 baud) */ | 88 | #define SAB82532_MAX_CEC_TIMEOUT 50000 /* 2.5 TX CLKs (at 50 baud) */ |
89 | 89 | ||
90 | #define SAB82532_RECV_FIFO_SIZE 32 /* Standard async fifo sizes */ | 90 | #define SAB82532_RECV_FIFO_SIZE 32 /* Standard async fifo sizes */ |
91 | #define SAB82532_XMIT_FIFO_SIZE 32 | 91 | #define SAB82532_XMIT_FIFO_SIZE 32 |
92 | 92 | ||
93 | static __inline__ void sunsab_tec_wait(struct uart_sunsab_port *up) | 93 | static __inline__ void sunsab_tec_wait(struct uart_sunsab_port *up) |
94 | { | 94 | { |
95 | int timeout = up->tec_timeout; | 95 | int timeout = up->tec_timeout; |
96 | 96 | ||
97 | while ((readb(&up->regs->r.star) & SAB82532_STAR_TEC) && --timeout) | 97 | while ((readb(&up->regs->r.star) & SAB82532_STAR_TEC) && --timeout) |
98 | udelay(1); | 98 | udelay(1); |
99 | } | 99 | } |
100 | 100 | ||
101 | static __inline__ void sunsab_cec_wait(struct uart_sunsab_port *up) | 101 | static __inline__ void sunsab_cec_wait(struct uart_sunsab_port *up) |
102 | { | 102 | { |
103 | int timeout = up->cec_timeout; | 103 | int timeout = up->cec_timeout; |
104 | 104 | ||
105 | while ((readb(&up->regs->r.star) & SAB82532_STAR_CEC) && --timeout) | 105 | while ((readb(&up->regs->r.star) & SAB82532_STAR_CEC) && --timeout) |
106 | udelay(1); | 106 | udelay(1); |
107 | } | 107 | } |
108 | 108 | ||
109 | static struct tty_struct * | 109 | static struct tty_struct * |
110 | receive_chars(struct uart_sunsab_port *up, | 110 | receive_chars(struct uart_sunsab_port *up, |
111 | union sab82532_irq_status *stat) | 111 | union sab82532_irq_status *stat) |
112 | { | 112 | { |
113 | struct tty_struct *tty = NULL; | 113 | struct tty_struct *tty = NULL; |
114 | unsigned char buf[32]; | 114 | unsigned char buf[32]; |
115 | int saw_console_brk = 0; | 115 | int saw_console_brk = 0; |
116 | int free_fifo = 0; | 116 | int free_fifo = 0; |
117 | int count = 0; | 117 | int count = 0; |
118 | int i; | 118 | int i; |
119 | 119 | ||
120 | if (up->port.state != NULL) /* Unopened serial console */ | 120 | if (up->port.state != NULL) /* Unopened serial console */ |
121 | tty = up->port.state->port.tty; | 121 | tty = up->port.state->port.tty; |
122 | 122 | ||
123 | /* Read number of BYTES (Character + Status) available. */ | 123 | /* Read number of BYTES (Character + Status) available. */ |
124 | if (stat->sreg.isr0 & SAB82532_ISR0_RPF) { | 124 | if (stat->sreg.isr0 & SAB82532_ISR0_RPF) { |
125 | count = SAB82532_RECV_FIFO_SIZE; | 125 | count = SAB82532_RECV_FIFO_SIZE; |
126 | free_fifo++; | 126 | free_fifo++; |
127 | } | 127 | } |
128 | 128 | ||
129 | if (stat->sreg.isr0 & SAB82532_ISR0_TCD) { | 129 | if (stat->sreg.isr0 & SAB82532_ISR0_TCD) { |
130 | count = readb(&up->regs->r.rbcl) & (SAB82532_RECV_FIFO_SIZE - 1); | 130 | count = readb(&up->regs->r.rbcl) & (SAB82532_RECV_FIFO_SIZE - 1); |
131 | free_fifo++; | 131 | free_fifo++; |
132 | } | 132 | } |
133 | 133 | ||
134 | /* Issue a FIFO read command in case we where idle. */ | 134 | /* Issue a FIFO read command in case we where idle. */ |
135 | if (stat->sreg.isr0 & SAB82532_ISR0_TIME) { | 135 | if (stat->sreg.isr0 & SAB82532_ISR0_TIME) { |
136 | sunsab_cec_wait(up); | 136 | sunsab_cec_wait(up); |
137 | writeb(SAB82532_CMDR_RFRD, &up->regs->w.cmdr); | 137 | writeb(SAB82532_CMDR_RFRD, &up->regs->w.cmdr); |
138 | return tty; | 138 | return tty; |
139 | } | 139 | } |
140 | 140 | ||
141 | if (stat->sreg.isr0 & SAB82532_ISR0_RFO) | 141 | if (stat->sreg.isr0 & SAB82532_ISR0_RFO) |
142 | free_fifo++; | 142 | free_fifo++; |
143 | 143 | ||
144 | /* Read the FIFO. */ | 144 | /* Read the FIFO. */ |
145 | for (i = 0; i < count; i++) | 145 | for (i = 0; i < count; i++) |
146 | buf[i] = readb(&up->regs->r.rfifo[i]); | 146 | buf[i] = readb(&up->regs->r.rfifo[i]); |
147 | 147 | ||
148 | /* Issue Receive Message Complete command. */ | 148 | /* Issue Receive Message Complete command. */ |
149 | if (free_fifo) { | 149 | if (free_fifo) { |
150 | sunsab_cec_wait(up); | 150 | sunsab_cec_wait(up); |
151 | writeb(SAB82532_CMDR_RMC, &up->regs->w.cmdr); | 151 | writeb(SAB82532_CMDR_RMC, &up->regs->w.cmdr); |
152 | } | 152 | } |
153 | 153 | ||
154 | /* Count may be zero for BRK, so we check for it here */ | 154 | /* Count may be zero for BRK, so we check for it here */ |
155 | if ((stat->sreg.isr1 & SAB82532_ISR1_BRK) && | 155 | if ((stat->sreg.isr1 & SAB82532_ISR1_BRK) && |
156 | (up->port.line == up->port.cons->index)) | 156 | (up->port.line == up->port.cons->index)) |
157 | saw_console_brk = 1; | 157 | saw_console_brk = 1; |
158 | 158 | ||
159 | for (i = 0; i < count; i++) { | 159 | for (i = 0; i < count; i++) { |
160 | unsigned char ch = buf[i], flag; | 160 | unsigned char ch = buf[i], flag; |
161 | 161 | ||
162 | if (tty == NULL) { | 162 | if (tty == NULL) { |
163 | uart_handle_sysrq_char(&up->port, ch); | 163 | uart_handle_sysrq_char(&up->port, ch); |
164 | continue; | 164 | continue; |
165 | } | 165 | } |
166 | 166 | ||
167 | flag = TTY_NORMAL; | 167 | flag = TTY_NORMAL; |
168 | up->port.icount.rx++; | 168 | up->port.icount.rx++; |
169 | 169 | ||
170 | if (unlikely(stat->sreg.isr0 & (SAB82532_ISR0_PERR | | 170 | if (unlikely(stat->sreg.isr0 & (SAB82532_ISR0_PERR | |
171 | SAB82532_ISR0_FERR | | 171 | SAB82532_ISR0_FERR | |
172 | SAB82532_ISR0_RFO)) || | 172 | SAB82532_ISR0_RFO)) || |
173 | unlikely(stat->sreg.isr1 & SAB82532_ISR1_BRK)) { | 173 | unlikely(stat->sreg.isr1 & SAB82532_ISR1_BRK)) { |
174 | /* | 174 | /* |
175 | * For statistics only | 175 | * For statistics only |
176 | */ | 176 | */ |
177 | if (stat->sreg.isr1 & SAB82532_ISR1_BRK) { | 177 | if (stat->sreg.isr1 & SAB82532_ISR1_BRK) { |
178 | stat->sreg.isr0 &= ~(SAB82532_ISR0_PERR | | 178 | stat->sreg.isr0 &= ~(SAB82532_ISR0_PERR | |
179 | SAB82532_ISR0_FERR); | 179 | SAB82532_ISR0_FERR); |
180 | up->port.icount.brk++; | 180 | up->port.icount.brk++; |
181 | /* | 181 | /* |
182 | * We do the SysRQ and SAK checking | 182 | * We do the SysRQ and SAK checking |
183 | * here because otherwise the break | 183 | * here because otherwise the break |
184 | * may get masked by ignore_status_mask | 184 | * may get masked by ignore_status_mask |
185 | * or read_status_mask. | 185 | * or read_status_mask. |
186 | */ | 186 | */ |
187 | if (uart_handle_break(&up->port)) | 187 | if (uart_handle_break(&up->port)) |
188 | continue; | 188 | continue; |
189 | } else if (stat->sreg.isr0 & SAB82532_ISR0_PERR) | 189 | } else if (stat->sreg.isr0 & SAB82532_ISR0_PERR) |
190 | up->port.icount.parity++; | 190 | up->port.icount.parity++; |
191 | else if (stat->sreg.isr0 & SAB82532_ISR0_FERR) | 191 | else if (stat->sreg.isr0 & SAB82532_ISR0_FERR) |
192 | up->port.icount.frame++; | 192 | up->port.icount.frame++; |
193 | if (stat->sreg.isr0 & SAB82532_ISR0_RFO) | 193 | if (stat->sreg.isr0 & SAB82532_ISR0_RFO) |
194 | up->port.icount.overrun++; | 194 | up->port.icount.overrun++; |
195 | 195 | ||
196 | /* | 196 | /* |
197 | * Mask off conditions which should be ingored. | 197 | * Mask off conditions which should be ingored. |
198 | */ | 198 | */ |
199 | stat->sreg.isr0 &= (up->port.read_status_mask & 0xff); | 199 | stat->sreg.isr0 &= (up->port.read_status_mask & 0xff); |
200 | stat->sreg.isr1 &= ((up->port.read_status_mask >> 8) & 0xff); | 200 | stat->sreg.isr1 &= ((up->port.read_status_mask >> 8) & 0xff); |
201 | 201 | ||
202 | if (stat->sreg.isr1 & SAB82532_ISR1_BRK) { | 202 | if (stat->sreg.isr1 & SAB82532_ISR1_BRK) { |
203 | flag = TTY_BREAK; | 203 | flag = TTY_BREAK; |
204 | } else if (stat->sreg.isr0 & SAB82532_ISR0_PERR) | 204 | } else if (stat->sreg.isr0 & SAB82532_ISR0_PERR) |
205 | flag = TTY_PARITY; | 205 | flag = TTY_PARITY; |
206 | else if (stat->sreg.isr0 & SAB82532_ISR0_FERR) | 206 | else if (stat->sreg.isr0 & SAB82532_ISR0_FERR) |
207 | flag = TTY_FRAME; | 207 | flag = TTY_FRAME; |
208 | } | 208 | } |
209 | 209 | ||
210 | if (uart_handle_sysrq_char(&up->port, ch)) | 210 | if (uart_handle_sysrq_char(&up->port, ch)) |
211 | continue; | 211 | continue; |
212 | 212 | ||
213 | if ((stat->sreg.isr0 & (up->port.ignore_status_mask & 0xff)) == 0 && | 213 | if ((stat->sreg.isr0 & (up->port.ignore_status_mask & 0xff)) == 0 && |
214 | (stat->sreg.isr1 & ((up->port.ignore_status_mask >> 8) & 0xff)) == 0) | 214 | (stat->sreg.isr1 & ((up->port.ignore_status_mask >> 8) & 0xff)) == 0) |
215 | tty_insert_flip_char(tty, ch, flag); | 215 | tty_insert_flip_char(tty, ch, flag); |
216 | if (stat->sreg.isr0 & SAB82532_ISR0_RFO) | 216 | if (stat->sreg.isr0 & SAB82532_ISR0_RFO) |
217 | tty_insert_flip_char(tty, 0, TTY_OVERRUN); | 217 | tty_insert_flip_char(tty, 0, TTY_OVERRUN); |
218 | } | 218 | } |
219 | 219 | ||
220 | if (saw_console_brk) | 220 | if (saw_console_brk) |
221 | sun_do_break(); | 221 | sun_do_break(); |
222 | 222 | ||
223 | return tty; | 223 | return tty; |
224 | } | 224 | } |
225 | 225 | ||
226 | static void sunsab_stop_tx(struct uart_port *); | 226 | static void sunsab_stop_tx(struct uart_port *); |
227 | static void sunsab_tx_idle(struct uart_sunsab_port *); | 227 | static void sunsab_tx_idle(struct uart_sunsab_port *); |
228 | 228 | ||
229 | static void transmit_chars(struct uart_sunsab_port *up, | 229 | static void transmit_chars(struct uart_sunsab_port *up, |
230 | union sab82532_irq_status *stat) | 230 | union sab82532_irq_status *stat) |
231 | { | 231 | { |
232 | struct circ_buf *xmit = &up->port.state->xmit; | 232 | struct circ_buf *xmit = &up->port.state->xmit; |
233 | int i; | 233 | int i; |
234 | 234 | ||
235 | if (stat->sreg.isr1 & SAB82532_ISR1_ALLS) { | 235 | if (stat->sreg.isr1 & SAB82532_ISR1_ALLS) { |
236 | up->interrupt_mask1 |= SAB82532_IMR1_ALLS; | 236 | up->interrupt_mask1 |= SAB82532_IMR1_ALLS; |
237 | writeb(up->interrupt_mask1, &up->regs->w.imr1); | 237 | writeb(up->interrupt_mask1, &up->regs->w.imr1); |
238 | set_bit(SAB82532_ALLS, &up->irqflags); | 238 | set_bit(SAB82532_ALLS, &up->irqflags); |
239 | } | 239 | } |
240 | 240 | ||
241 | #if 0 /* bde@nwlink.com says this check causes problems */ | 241 | #if 0 /* bde@nwlink.com says this check causes problems */ |
242 | if (!(stat->sreg.isr1 & SAB82532_ISR1_XPR)) | 242 | if (!(stat->sreg.isr1 & SAB82532_ISR1_XPR)) |
243 | return; | 243 | return; |
244 | #endif | 244 | #endif |
245 | 245 | ||
246 | if (!(readb(&up->regs->r.star) & SAB82532_STAR_XFW)) | 246 | if (!(readb(&up->regs->r.star) & SAB82532_STAR_XFW)) |
247 | return; | 247 | return; |
248 | 248 | ||
249 | set_bit(SAB82532_XPR, &up->irqflags); | 249 | set_bit(SAB82532_XPR, &up->irqflags); |
250 | sunsab_tx_idle(up); | 250 | sunsab_tx_idle(up); |
251 | 251 | ||
252 | if (uart_circ_empty(xmit) || uart_tx_stopped(&up->port)) { | 252 | if (uart_circ_empty(xmit) || uart_tx_stopped(&up->port)) { |
253 | up->interrupt_mask1 |= SAB82532_IMR1_XPR; | 253 | up->interrupt_mask1 |= SAB82532_IMR1_XPR; |
254 | writeb(up->interrupt_mask1, &up->regs->w.imr1); | 254 | writeb(up->interrupt_mask1, &up->regs->w.imr1); |
255 | return; | 255 | return; |
256 | } | 256 | } |
257 | 257 | ||
258 | up->interrupt_mask1 &= ~(SAB82532_IMR1_ALLS|SAB82532_IMR1_XPR); | 258 | up->interrupt_mask1 &= ~(SAB82532_IMR1_ALLS|SAB82532_IMR1_XPR); |
259 | writeb(up->interrupt_mask1, &up->regs->w.imr1); | 259 | writeb(up->interrupt_mask1, &up->regs->w.imr1); |
260 | clear_bit(SAB82532_ALLS, &up->irqflags); | 260 | clear_bit(SAB82532_ALLS, &up->irqflags); |
261 | 261 | ||
262 | /* Stuff 32 bytes into Transmit FIFO. */ | 262 | /* Stuff 32 bytes into Transmit FIFO. */ |
263 | clear_bit(SAB82532_XPR, &up->irqflags); | 263 | clear_bit(SAB82532_XPR, &up->irqflags); |
264 | for (i = 0; i < up->port.fifosize; i++) { | 264 | for (i = 0; i < up->port.fifosize; i++) { |
265 | writeb(xmit->buf[xmit->tail], | 265 | writeb(xmit->buf[xmit->tail], |
266 | &up->regs->w.xfifo[i]); | 266 | &up->regs->w.xfifo[i]); |
267 | xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); | 267 | xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); |
268 | up->port.icount.tx++; | 268 | up->port.icount.tx++; |
269 | if (uart_circ_empty(xmit)) | 269 | if (uart_circ_empty(xmit)) |
270 | break; | 270 | break; |
271 | } | 271 | } |
272 | 272 | ||
273 | /* Issue a Transmit Frame command. */ | 273 | /* Issue a Transmit Frame command. */ |
274 | sunsab_cec_wait(up); | 274 | sunsab_cec_wait(up); |
275 | writeb(SAB82532_CMDR_XF, &up->regs->w.cmdr); | 275 | writeb(SAB82532_CMDR_XF, &up->regs->w.cmdr); |
276 | 276 | ||
277 | if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) | 277 | if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) |
278 | uart_write_wakeup(&up->port); | 278 | uart_write_wakeup(&up->port); |
279 | 279 | ||
280 | if (uart_circ_empty(xmit)) | 280 | if (uart_circ_empty(xmit)) |
281 | sunsab_stop_tx(&up->port); | 281 | sunsab_stop_tx(&up->port); |
282 | } | 282 | } |
283 | 283 | ||
284 | static void check_status(struct uart_sunsab_port *up, | 284 | static void check_status(struct uart_sunsab_port *up, |
285 | union sab82532_irq_status *stat) | 285 | union sab82532_irq_status *stat) |
286 | { | 286 | { |
287 | if (stat->sreg.isr0 & SAB82532_ISR0_CDSC) | 287 | if (stat->sreg.isr0 & SAB82532_ISR0_CDSC) |
288 | uart_handle_dcd_change(&up->port, | 288 | uart_handle_dcd_change(&up->port, |
289 | !(readb(&up->regs->r.vstr) & SAB82532_VSTR_CD)); | 289 | !(readb(&up->regs->r.vstr) & SAB82532_VSTR_CD)); |
290 | 290 | ||
291 | if (stat->sreg.isr1 & SAB82532_ISR1_CSC) | 291 | if (stat->sreg.isr1 & SAB82532_ISR1_CSC) |
292 | uart_handle_cts_change(&up->port, | 292 | uart_handle_cts_change(&up->port, |
293 | (readb(&up->regs->r.star) & SAB82532_STAR_CTS)); | 293 | (readb(&up->regs->r.star) & SAB82532_STAR_CTS)); |
294 | 294 | ||
295 | if ((readb(&up->regs->r.pvr) & up->pvr_dsr_bit) ^ up->dsr) { | 295 | if ((readb(&up->regs->r.pvr) & up->pvr_dsr_bit) ^ up->dsr) { |
296 | up->dsr = (readb(&up->regs->r.pvr) & up->pvr_dsr_bit) ? 0 : 1; | 296 | up->dsr = (readb(&up->regs->r.pvr) & up->pvr_dsr_bit) ? 0 : 1; |
297 | up->port.icount.dsr++; | 297 | up->port.icount.dsr++; |
298 | } | 298 | } |
299 | 299 | ||
300 | wake_up_interruptible(&up->port.state->port.delta_msr_wait); | 300 | wake_up_interruptible(&up->port.state->port.delta_msr_wait); |
301 | } | 301 | } |
302 | 302 | ||
303 | static irqreturn_t sunsab_interrupt(int irq, void *dev_id) | 303 | static irqreturn_t sunsab_interrupt(int irq, void *dev_id) |
304 | { | 304 | { |
305 | struct uart_sunsab_port *up = dev_id; | 305 | struct uart_sunsab_port *up = dev_id; |
306 | struct tty_struct *tty; | 306 | struct tty_struct *tty; |
307 | union sab82532_irq_status status; | 307 | union sab82532_irq_status status; |
308 | unsigned long flags; | 308 | unsigned long flags; |
309 | unsigned char gis; | 309 | unsigned char gis; |
310 | 310 | ||
311 | spin_lock_irqsave(&up->port.lock, flags); | 311 | spin_lock_irqsave(&up->port.lock, flags); |
312 | 312 | ||
313 | status.stat = 0; | 313 | status.stat = 0; |
314 | gis = readb(&up->regs->r.gis) >> up->gis_shift; | 314 | gis = readb(&up->regs->r.gis) >> up->gis_shift; |
315 | if (gis & 1) | 315 | if (gis & 1) |
316 | status.sreg.isr0 = readb(&up->regs->r.isr0); | 316 | status.sreg.isr0 = readb(&up->regs->r.isr0); |
317 | if (gis & 2) | 317 | if (gis & 2) |
318 | status.sreg.isr1 = readb(&up->regs->r.isr1); | 318 | status.sreg.isr1 = readb(&up->regs->r.isr1); |
319 | 319 | ||
320 | tty = NULL; | 320 | tty = NULL; |
321 | if (status.stat) { | 321 | if (status.stat) { |
322 | if ((status.sreg.isr0 & (SAB82532_ISR0_TCD | SAB82532_ISR0_TIME | | 322 | if ((status.sreg.isr0 & (SAB82532_ISR0_TCD | SAB82532_ISR0_TIME | |
323 | SAB82532_ISR0_RFO | SAB82532_ISR0_RPF)) || | 323 | SAB82532_ISR0_RFO | SAB82532_ISR0_RPF)) || |
324 | (status.sreg.isr1 & SAB82532_ISR1_BRK)) | 324 | (status.sreg.isr1 & SAB82532_ISR1_BRK)) |
325 | tty = receive_chars(up, &status); | 325 | tty = receive_chars(up, &status); |
326 | if ((status.sreg.isr0 & SAB82532_ISR0_CDSC) || | 326 | if ((status.sreg.isr0 & SAB82532_ISR0_CDSC) || |
327 | (status.sreg.isr1 & SAB82532_ISR1_CSC)) | 327 | (status.sreg.isr1 & SAB82532_ISR1_CSC)) |
328 | check_status(up, &status); | 328 | check_status(up, &status); |
329 | if (status.sreg.isr1 & (SAB82532_ISR1_ALLS | SAB82532_ISR1_XPR)) | 329 | if (status.sreg.isr1 & (SAB82532_ISR1_ALLS | SAB82532_ISR1_XPR)) |
330 | transmit_chars(up, &status); | 330 | transmit_chars(up, &status); |
331 | } | 331 | } |
332 | 332 | ||
333 | spin_unlock_irqrestore(&up->port.lock, flags); | 333 | spin_unlock_irqrestore(&up->port.lock, flags); |
334 | 334 | ||
335 | if (tty) | 335 | if (tty) |
336 | tty_flip_buffer_push(tty); | 336 | tty_flip_buffer_push(tty); |
337 | 337 | ||
338 | return IRQ_HANDLED; | 338 | return IRQ_HANDLED; |
339 | } | 339 | } |
340 | 340 | ||
341 | /* port->lock is not held. */ | 341 | /* port->lock is not held. */ |
342 | static unsigned int sunsab_tx_empty(struct uart_port *port) | 342 | static unsigned int sunsab_tx_empty(struct uart_port *port) |
343 | { | 343 | { |
344 | struct uart_sunsab_port *up = (struct uart_sunsab_port *) port; | 344 | struct uart_sunsab_port *up = (struct uart_sunsab_port *) port; |
345 | int ret; | 345 | int ret; |
346 | 346 | ||
347 | /* Do not need a lock for a state test like this. */ | 347 | /* Do not need a lock for a state test like this. */ |
348 | if (test_bit(SAB82532_ALLS, &up->irqflags)) | 348 | if (test_bit(SAB82532_ALLS, &up->irqflags)) |
349 | ret = TIOCSER_TEMT; | 349 | ret = TIOCSER_TEMT; |
350 | else | 350 | else |
351 | ret = 0; | 351 | ret = 0; |
352 | 352 | ||
353 | return ret; | 353 | return ret; |
354 | } | 354 | } |
355 | 355 | ||
356 | /* port->lock held by caller. */ | 356 | /* port->lock held by caller. */ |
357 | static void sunsab_set_mctrl(struct uart_port *port, unsigned int mctrl) | 357 | static void sunsab_set_mctrl(struct uart_port *port, unsigned int mctrl) |
358 | { | 358 | { |
359 | struct uart_sunsab_port *up = (struct uart_sunsab_port *) port; | 359 | struct uart_sunsab_port *up = (struct uart_sunsab_port *) port; |
360 | 360 | ||
361 | if (mctrl & TIOCM_RTS) { | 361 | if (mctrl & TIOCM_RTS) { |
362 | up->cached_mode &= ~SAB82532_MODE_FRTS; | 362 | up->cached_mode &= ~SAB82532_MODE_FRTS; |
363 | up->cached_mode |= SAB82532_MODE_RTS; | 363 | up->cached_mode |= SAB82532_MODE_RTS; |
364 | } else { | 364 | } else { |
365 | up->cached_mode |= (SAB82532_MODE_FRTS | | 365 | up->cached_mode |= (SAB82532_MODE_FRTS | |
366 | SAB82532_MODE_RTS); | 366 | SAB82532_MODE_RTS); |
367 | } | 367 | } |
368 | if (mctrl & TIOCM_DTR) { | 368 | if (mctrl & TIOCM_DTR) { |
369 | up->cached_pvr &= ~(up->pvr_dtr_bit); | 369 | up->cached_pvr &= ~(up->pvr_dtr_bit); |
370 | } else { | 370 | } else { |
371 | up->cached_pvr |= up->pvr_dtr_bit; | 371 | up->cached_pvr |= up->pvr_dtr_bit; |
372 | } | 372 | } |
373 | 373 | ||
374 | set_bit(SAB82532_REGS_PENDING, &up->irqflags); | 374 | set_bit(SAB82532_REGS_PENDING, &up->irqflags); |
375 | if (test_bit(SAB82532_XPR, &up->irqflags)) | 375 | if (test_bit(SAB82532_XPR, &up->irqflags)) |
376 | sunsab_tx_idle(up); | 376 | sunsab_tx_idle(up); |
377 | } | 377 | } |
378 | 378 | ||
379 | /* port->lock is held by caller and interrupts are disabled. */ | 379 | /* port->lock is held by caller and interrupts are disabled. */ |
380 | static unsigned int sunsab_get_mctrl(struct uart_port *port) | 380 | static unsigned int sunsab_get_mctrl(struct uart_port *port) |
381 | { | 381 | { |
382 | struct uart_sunsab_port *up = (struct uart_sunsab_port *) port; | 382 | struct uart_sunsab_port *up = (struct uart_sunsab_port *) port; |
383 | unsigned char val; | 383 | unsigned char val; |
384 | unsigned int result; | 384 | unsigned int result; |
385 | 385 | ||
386 | result = 0; | 386 | result = 0; |
387 | 387 | ||
388 | val = readb(&up->regs->r.pvr); | 388 | val = readb(&up->regs->r.pvr); |
389 | result |= (val & up->pvr_dsr_bit) ? 0 : TIOCM_DSR; | 389 | result |= (val & up->pvr_dsr_bit) ? 0 : TIOCM_DSR; |
390 | 390 | ||
391 | val = readb(&up->regs->r.vstr); | 391 | val = readb(&up->regs->r.vstr); |
392 | result |= (val & SAB82532_VSTR_CD) ? 0 : TIOCM_CAR; | 392 | result |= (val & SAB82532_VSTR_CD) ? 0 : TIOCM_CAR; |
393 | 393 | ||
394 | val = readb(&up->regs->r.star); | 394 | val = readb(&up->regs->r.star); |
395 | result |= (val & SAB82532_STAR_CTS) ? TIOCM_CTS : 0; | 395 | result |= (val & SAB82532_STAR_CTS) ? TIOCM_CTS : 0; |
396 | 396 | ||
397 | return result; | 397 | return result; |
398 | } | 398 | } |
399 | 399 | ||
400 | /* port->lock held by caller. */ | 400 | /* port->lock held by caller. */ |
401 | static void sunsab_stop_tx(struct uart_port *port) | 401 | static void sunsab_stop_tx(struct uart_port *port) |
402 | { | 402 | { |
403 | struct uart_sunsab_port *up = (struct uart_sunsab_port *) port; | 403 | struct uart_sunsab_port *up = (struct uart_sunsab_port *) port; |
404 | 404 | ||
405 | up->interrupt_mask1 |= SAB82532_IMR1_XPR; | 405 | up->interrupt_mask1 |= SAB82532_IMR1_XPR; |
406 | writeb(up->interrupt_mask1, &up->regs->w.imr1); | 406 | writeb(up->interrupt_mask1, &up->regs->w.imr1); |
407 | } | 407 | } |
408 | 408 | ||
409 | /* port->lock held by caller. */ | 409 | /* port->lock held by caller. */ |
410 | static void sunsab_tx_idle(struct uart_sunsab_port *up) | 410 | static void sunsab_tx_idle(struct uart_sunsab_port *up) |
411 | { | 411 | { |
412 | if (test_bit(SAB82532_REGS_PENDING, &up->irqflags)) { | 412 | if (test_bit(SAB82532_REGS_PENDING, &up->irqflags)) { |
413 | u8 tmp; | 413 | u8 tmp; |
414 | 414 | ||
415 | clear_bit(SAB82532_REGS_PENDING, &up->irqflags); | 415 | clear_bit(SAB82532_REGS_PENDING, &up->irqflags); |
416 | writeb(up->cached_mode, &up->regs->rw.mode); | 416 | writeb(up->cached_mode, &up->regs->rw.mode); |
417 | writeb(up->cached_pvr, &up->regs->rw.pvr); | 417 | writeb(up->cached_pvr, &up->regs->rw.pvr); |
418 | writeb(up->cached_dafo, &up->regs->w.dafo); | 418 | writeb(up->cached_dafo, &up->regs->w.dafo); |
419 | 419 | ||
420 | writeb(up->cached_ebrg & 0xff, &up->regs->w.bgr); | 420 | writeb(up->cached_ebrg & 0xff, &up->regs->w.bgr); |
421 | tmp = readb(&up->regs->rw.ccr2); | 421 | tmp = readb(&up->regs->rw.ccr2); |
422 | tmp &= ~0xc0; | 422 | tmp &= ~0xc0; |
423 | tmp |= (up->cached_ebrg >> 2) & 0xc0; | 423 | tmp |= (up->cached_ebrg >> 2) & 0xc0; |
424 | writeb(tmp, &up->regs->rw.ccr2); | 424 | writeb(tmp, &up->regs->rw.ccr2); |
425 | } | 425 | } |
426 | } | 426 | } |
427 | 427 | ||
428 | /* port->lock held by caller. */ | 428 | /* port->lock held by caller. */ |
429 | static void sunsab_start_tx(struct uart_port *port) | 429 | static void sunsab_start_tx(struct uart_port *port) |
430 | { | 430 | { |
431 | struct uart_sunsab_port *up = (struct uart_sunsab_port *) port; | 431 | struct uart_sunsab_port *up = (struct uart_sunsab_port *) port; |
432 | struct circ_buf *xmit = &up->port.state->xmit; | 432 | struct circ_buf *xmit = &up->port.state->xmit; |
433 | int i; | 433 | int i; |
434 | 434 | ||
435 | up->interrupt_mask1 &= ~(SAB82532_IMR1_ALLS|SAB82532_IMR1_XPR); | 435 | up->interrupt_mask1 &= ~(SAB82532_IMR1_ALLS|SAB82532_IMR1_XPR); |
436 | writeb(up->interrupt_mask1, &up->regs->w.imr1); | 436 | writeb(up->interrupt_mask1, &up->regs->w.imr1); |
437 | 437 | ||
438 | if (!test_bit(SAB82532_XPR, &up->irqflags)) | 438 | if (!test_bit(SAB82532_XPR, &up->irqflags)) |
439 | return; | 439 | return; |
440 | 440 | ||
441 | clear_bit(SAB82532_ALLS, &up->irqflags); | 441 | clear_bit(SAB82532_ALLS, &up->irqflags); |
442 | clear_bit(SAB82532_XPR, &up->irqflags); | 442 | clear_bit(SAB82532_XPR, &up->irqflags); |
443 | 443 | ||
444 | for (i = 0; i < up->port.fifosize; i++) { | 444 | for (i = 0; i < up->port.fifosize; i++) { |
445 | writeb(xmit->buf[xmit->tail], | 445 | writeb(xmit->buf[xmit->tail], |
446 | &up->regs->w.xfifo[i]); | 446 | &up->regs->w.xfifo[i]); |
447 | xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); | 447 | xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); |
448 | up->port.icount.tx++; | 448 | up->port.icount.tx++; |
449 | if (uart_circ_empty(xmit)) | 449 | if (uart_circ_empty(xmit)) |
450 | break; | 450 | break; |
451 | } | 451 | } |
452 | 452 | ||
453 | /* Issue a Transmit Frame command. */ | 453 | /* Issue a Transmit Frame command. */ |
454 | sunsab_cec_wait(up); | 454 | sunsab_cec_wait(up); |
455 | writeb(SAB82532_CMDR_XF, &up->regs->w.cmdr); | 455 | writeb(SAB82532_CMDR_XF, &up->regs->w.cmdr); |
456 | } | 456 | } |
457 | 457 | ||
458 | /* port->lock is not held. */ | 458 | /* port->lock is not held. */ |
459 | static void sunsab_send_xchar(struct uart_port *port, char ch) | 459 | static void sunsab_send_xchar(struct uart_port *port, char ch) |
460 | { | 460 | { |
461 | struct uart_sunsab_port *up = (struct uart_sunsab_port *) port; | 461 | struct uart_sunsab_port *up = (struct uart_sunsab_port *) port; |
462 | unsigned long flags; | 462 | unsigned long flags; |
463 | 463 | ||
464 | spin_lock_irqsave(&up->port.lock, flags); | 464 | spin_lock_irqsave(&up->port.lock, flags); |
465 | 465 | ||
466 | sunsab_tec_wait(up); | 466 | sunsab_tec_wait(up); |
467 | writeb(ch, &up->regs->w.tic); | 467 | writeb(ch, &up->regs->w.tic); |
468 | 468 | ||
469 | spin_unlock_irqrestore(&up->port.lock, flags); | 469 | spin_unlock_irqrestore(&up->port.lock, flags); |
470 | } | 470 | } |
471 | 471 | ||
472 | /* port->lock held by caller. */ | 472 | /* port->lock held by caller. */ |
473 | static void sunsab_stop_rx(struct uart_port *port) | 473 | static void sunsab_stop_rx(struct uart_port *port) |
474 | { | 474 | { |
475 | struct uart_sunsab_port *up = (struct uart_sunsab_port *) port; | 475 | struct uart_sunsab_port *up = (struct uart_sunsab_port *) port; |
476 | 476 | ||
477 | up->interrupt_mask0 |= SAB82532_IMR0_TCD; | 477 | up->interrupt_mask0 |= SAB82532_IMR0_TCD; |
478 | writeb(up->interrupt_mask1, &up->regs->w.imr0); | 478 | writeb(up->interrupt_mask1, &up->regs->w.imr0); |
479 | } | 479 | } |
480 | 480 | ||
481 | /* port->lock held by caller. */ | 481 | /* port->lock held by caller. */ |
482 | static void sunsab_enable_ms(struct uart_port *port) | 482 | static void sunsab_enable_ms(struct uart_port *port) |
483 | { | 483 | { |
484 | /* For now we always receive these interrupts. */ | 484 | /* For now we always receive these interrupts. */ |
485 | } | 485 | } |
486 | 486 | ||
487 | /* port->lock is not held. */ | 487 | /* port->lock is not held. */ |
488 | static void sunsab_break_ctl(struct uart_port *port, int break_state) | 488 | static void sunsab_break_ctl(struct uart_port *port, int break_state) |
489 | { | 489 | { |
490 | struct uart_sunsab_port *up = (struct uart_sunsab_port *) port; | 490 | struct uart_sunsab_port *up = (struct uart_sunsab_port *) port; |
491 | unsigned long flags; | 491 | unsigned long flags; |
492 | unsigned char val; | 492 | unsigned char val; |
493 | 493 | ||
494 | spin_lock_irqsave(&up->port.lock, flags); | 494 | spin_lock_irqsave(&up->port.lock, flags); |
495 | 495 | ||
496 | val = up->cached_dafo; | 496 | val = up->cached_dafo; |
497 | if (break_state) | 497 | if (break_state) |
498 | val |= SAB82532_DAFO_XBRK; | 498 | val |= SAB82532_DAFO_XBRK; |
499 | else | 499 | else |
500 | val &= ~SAB82532_DAFO_XBRK; | 500 | val &= ~SAB82532_DAFO_XBRK; |
501 | up->cached_dafo = val; | 501 | up->cached_dafo = val; |
502 | 502 | ||
503 | set_bit(SAB82532_REGS_PENDING, &up->irqflags); | 503 | set_bit(SAB82532_REGS_PENDING, &up->irqflags); |
504 | if (test_bit(SAB82532_XPR, &up->irqflags)) | 504 | if (test_bit(SAB82532_XPR, &up->irqflags)) |
505 | sunsab_tx_idle(up); | 505 | sunsab_tx_idle(up); |
506 | 506 | ||
507 | spin_unlock_irqrestore(&up->port.lock, flags); | 507 | spin_unlock_irqrestore(&up->port.lock, flags); |
508 | } | 508 | } |
509 | 509 | ||
510 | /* port->lock is not held. */ | 510 | /* port->lock is not held. */ |
511 | static int sunsab_startup(struct uart_port *port) | 511 | static int sunsab_startup(struct uart_port *port) |
512 | { | 512 | { |
513 | struct uart_sunsab_port *up = (struct uart_sunsab_port *) port; | 513 | struct uart_sunsab_port *up = (struct uart_sunsab_port *) port; |
514 | unsigned long flags; | 514 | unsigned long flags; |
515 | unsigned char tmp; | 515 | unsigned char tmp; |
516 | int err = request_irq(up->port.irq, sunsab_interrupt, | 516 | int err = request_irq(up->port.irq, sunsab_interrupt, |
517 | IRQF_SHARED, "sab", up); | 517 | IRQF_SHARED, "sab", up); |
518 | if (err) | 518 | if (err) |
519 | return err; | 519 | return err; |
520 | 520 | ||
521 | spin_lock_irqsave(&up->port.lock, flags); | 521 | spin_lock_irqsave(&up->port.lock, flags); |
522 | 522 | ||
523 | /* | 523 | /* |
524 | * Wait for any commands or immediate characters | 524 | * Wait for any commands or immediate characters |
525 | */ | 525 | */ |
526 | sunsab_cec_wait(up); | 526 | sunsab_cec_wait(up); |
527 | sunsab_tec_wait(up); | 527 | sunsab_tec_wait(up); |
528 | 528 | ||
529 | /* | 529 | /* |
530 | * Clear the FIFO buffers. | 530 | * Clear the FIFO buffers. |
531 | */ | 531 | */ |
532 | writeb(SAB82532_CMDR_RRES, &up->regs->w.cmdr); | 532 | writeb(SAB82532_CMDR_RRES, &up->regs->w.cmdr); |
533 | sunsab_cec_wait(up); | 533 | sunsab_cec_wait(up); |
534 | writeb(SAB82532_CMDR_XRES, &up->regs->w.cmdr); | 534 | writeb(SAB82532_CMDR_XRES, &up->regs->w.cmdr); |
535 | 535 | ||
536 | /* | 536 | /* |
537 | * Clear the interrupt registers. | 537 | * Clear the interrupt registers. |
538 | */ | 538 | */ |
539 | (void) readb(&up->regs->r.isr0); | 539 | (void) readb(&up->regs->r.isr0); |
540 | (void) readb(&up->regs->r.isr1); | 540 | (void) readb(&up->regs->r.isr1); |
541 | 541 | ||
542 | /* | 542 | /* |
543 | * Now, initialize the UART | 543 | * Now, initialize the UART |
544 | */ | 544 | */ |
545 | writeb(0, &up->regs->w.ccr0); /* power-down */ | 545 | writeb(0, &up->regs->w.ccr0); /* power-down */ |
546 | writeb(SAB82532_CCR0_MCE | SAB82532_CCR0_SC_NRZ | | 546 | writeb(SAB82532_CCR0_MCE | SAB82532_CCR0_SC_NRZ | |
547 | SAB82532_CCR0_SM_ASYNC, &up->regs->w.ccr0); | 547 | SAB82532_CCR0_SM_ASYNC, &up->regs->w.ccr0); |
548 | writeb(SAB82532_CCR1_ODS | SAB82532_CCR1_BCR | 7, &up->regs->w.ccr1); | 548 | writeb(SAB82532_CCR1_ODS | SAB82532_CCR1_BCR | 7, &up->regs->w.ccr1); |
549 | writeb(SAB82532_CCR2_BDF | SAB82532_CCR2_SSEL | | 549 | writeb(SAB82532_CCR2_BDF | SAB82532_CCR2_SSEL | |
550 | SAB82532_CCR2_TOE, &up->regs->w.ccr2); | 550 | SAB82532_CCR2_TOE, &up->regs->w.ccr2); |
551 | writeb(0, &up->regs->w.ccr3); | 551 | writeb(0, &up->regs->w.ccr3); |
552 | writeb(SAB82532_CCR4_MCK4 | SAB82532_CCR4_EBRG, &up->regs->w.ccr4); | 552 | writeb(SAB82532_CCR4_MCK4 | SAB82532_CCR4_EBRG, &up->regs->w.ccr4); |
553 | up->cached_mode = (SAB82532_MODE_RTS | SAB82532_MODE_FCTS | | 553 | up->cached_mode = (SAB82532_MODE_RTS | SAB82532_MODE_FCTS | |
554 | SAB82532_MODE_RAC); | 554 | SAB82532_MODE_RAC); |
555 | writeb(up->cached_mode, &up->regs->w.mode); | 555 | writeb(up->cached_mode, &up->regs->w.mode); |
556 | writeb(SAB82532_RFC_DPS|SAB82532_RFC_RFTH_32, &up->regs->w.rfc); | 556 | writeb(SAB82532_RFC_DPS|SAB82532_RFC_RFTH_32, &up->regs->w.rfc); |
557 | 557 | ||
558 | tmp = readb(&up->regs->rw.ccr0); | 558 | tmp = readb(&up->regs->rw.ccr0); |
559 | tmp |= SAB82532_CCR0_PU; /* power-up */ | 559 | tmp |= SAB82532_CCR0_PU; /* power-up */ |
560 | writeb(tmp, &up->regs->rw.ccr0); | 560 | writeb(tmp, &up->regs->rw.ccr0); |
561 | 561 | ||
562 | /* | 562 | /* |
563 | * Finally, enable interrupts | 563 | * Finally, enable interrupts |
564 | */ | 564 | */ |
565 | up->interrupt_mask0 = (SAB82532_IMR0_PERR | SAB82532_IMR0_FERR | | 565 | up->interrupt_mask0 = (SAB82532_IMR0_PERR | SAB82532_IMR0_FERR | |
566 | SAB82532_IMR0_PLLA); | 566 | SAB82532_IMR0_PLLA); |
567 | writeb(up->interrupt_mask0, &up->regs->w.imr0); | 567 | writeb(up->interrupt_mask0, &up->regs->w.imr0); |
568 | up->interrupt_mask1 = (SAB82532_IMR1_BRKT | SAB82532_IMR1_ALLS | | 568 | up->interrupt_mask1 = (SAB82532_IMR1_BRKT | SAB82532_IMR1_ALLS | |
569 | SAB82532_IMR1_XOFF | SAB82532_IMR1_TIN | | 569 | SAB82532_IMR1_XOFF | SAB82532_IMR1_TIN | |
570 | SAB82532_IMR1_CSC | SAB82532_IMR1_XON | | 570 | SAB82532_IMR1_CSC | SAB82532_IMR1_XON | |
571 | SAB82532_IMR1_XPR); | 571 | SAB82532_IMR1_XPR); |
572 | writeb(up->interrupt_mask1, &up->regs->w.imr1); | 572 | writeb(up->interrupt_mask1, &up->regs->w.imr1); |
573 | set_bit(SAB82532_ALLS, &up->irqflags); | 573 | set_bit(SAB82532_ALLS, &up->irqflags); |
574 | set_bit(SAB82532_XPR, &up->irqflags); | 574 | set_bit(SAB82532_XPR, &up->irqflags); |
575 | 575 | ||
576 | spin_unlock_irqrestore(&up->port.lock, flags); | 576 | spin_unlock_irqrestore(&up->port.lock, flags); |
577 | 577 | ||
578 | return 0; | 578 | return 0; |
579 | } | 579 | } |
580 | 580 | ||
581 | /* port->lock is not held. */ | 581 | /* port->lock is not held. */ |
582 | static void sunsab_shutdown(struct uart_port *port) | 582 | static void sunsab_shutdown(struct uart_port *port) |
583 | { | 583 | { |
584 | struct uart_sunsab_port *up = (struct uart_sunsab_port *) port; | 584 | struct uart_sunsab_port *up = (struct uart_sunsab_port *) port; |
585 | unsigned long flags; | 585 | unsigned long flags; |
586 | 586 | ||
587 | spin_lock_irqsave(&up->port.lock, flags); | 587 | spin_lock_irqsave(&up->port.lock, flags); |
588 | 588 | ||
589 | /* Disable Interrupts */ | 589 | /* Disable Interrupts */ |
590 | up->interrupt_mask0 = 0xff; | 590 | up->interrupt_mask0 = 0xff; |
591 | writeb(up->interrupt_mask0, &up->regs->w.imr0); | 591 | writeb(up->interrupt_mask0, &up->regs->w.imr0); |
592 | up->interrupt_mask1 = 0xff; | 592 | up->interrupt_mask1 = 0xff; |
593 | writeb(up->interrupt_mask1, &up->regs->w.imr1); | 593 | writeb(up->interrupt_mask1, &up->regs->w.imr1); |
594 | 594 | ||
595 | /* Disable break condition */ | 595 | /* Disable break condition */ |
596 | up->cached_dafo = readb(&up->regs->rw.dafo); | 596 | up->cached_dafo = readb(&up->regs->rw.dafo); |
597 | up->cached_dafo &= ~SAB82532_DAFO_XBRK; | 597 | up->cached_dafo &= ~SAB82532_DAFO_XBRK; |
598 | writeb(up->cached_dafo, &up->regs->rw.dafo); | 598 | writeb(up->cached_dafo, &up->regs->rw.dafo); |
599 | 599 | ||
600 | /* Disable Receiver */ | 600 | /* Disable Receiver */ |
601 | up->cached_mode &= ~SAB82532_MODE_RAC; | 601 | up->cached_mode &= ~SAB82532_MODE_RAC; |
602 | writeb(up->cached_mode, &up->regs->rw.mode); | 602 | writeb(up->cached_mode, &up->regs->rw.mode); |
603 | 603 | ||
604 | /* | 604 | /* |
605 | * XXX FIXME | 605 | * XXX FIXME |
606 | * | 606 | * |
607 | * If the chip is powered down here the system hangs/crashes during | 607 | * If the chip is powered down here the system hangs/crashes during |
608 | * reboot or shutdown. This needs to be investigated further, | 608 | * reboot or shutdown. This needs to be investigated further, |
609 | * similar behaviour occurs in 2.4 when the driver is configured | 609 | * similar behaviour occurs in 2.4 when the driver is configured |
610 | * as a module only. One hint may be that data is sometimes | 610 | * as a module only. One hint may be that data is sometimes |
611 | * transmitted at 9600 baud during shutdown (regardless of the | 611 | * transmitted at 9600 baud during shutdown (regardless of the |
612 | * speed the chip was configured for when the port was open). | 612 | * speed the chip was configured for when the port was open). |
613 | */ | 613 | */ |
614 | #if 0 | 614 | #if 0 |
615 | /* Power Down */ | 615 | /* Power Down */ |
616 | tmp = readb(&up->regs->rw.ccr0); | 616 | tmp = readb(&up->regs->rw.ccr0); |
617 | tmp &= ~SAB82532_CCR0_PU; | 617 | tmp &= ~SAB82532_CCR0_PU; |
618 | writeb(tmp, &up->regs->rw.ccr0); | 618 | writeb(tmp, &up->regs->rw.ccr0); |
619 | #endif | 619 | #endif |
620 | 620 | ||
621 | spin_unlock_irqrestore(&up->port.lock, flags); | 621 | spin_unlock_irqrestore(&up->port.lock, flags); |
622 | free_irq(up->port.irq, up); | 622 | free_irq(up->port.irq, up); |
623 | } | 623 | } |
624 | 624 | ||
625 | /* | 625 | /* |
626 | * This is used to figure out the divisor speeds. | 626 | * This is used to figure out the divisor speeds. |
627 | * | 627 | * |
628 | * The formula is: Baud = SAB_BASE_BAUD / ((N + 1) * (1 << M)), | 628 | * The formula is: Baud = SAB_BASE_BAUD / ((N + 1) * (1 << M)), |
629 | * | 629 | * |
630 | * with 0 <= N < 64 and 0 <= M < 16 | 630 | * with 0 <= N < 64 and 0 <= M < 16 |
631 | */ | 631 | */ |
632 | 632 | ||
633 | static void calc_ebrg(int baud, int *n_ret, int *m_ret) | 633 | static void calc_ebrg(int baud, int *n_ret, int *m_ret) |
634 | { | 634 | { |
635 | int n, m; | 635 | int n, m; |
636 | 636 | ||
637 | if (baud == 0) { | 637 | if (baud == 0) { |
638 | *n_ret = 0; | 638 | *n_ret = 0; |
639 | *m_ret = 0; | 639 | *m_ret = 0; |
640 | return; | 640 | return; |
641 | } | 641 | } |
642 | 642 | ||
643 | /* | 643 | /* |
644 | * We scale numbers by 10 so that we get better accuracy | 644 | * We scale numbers by 10 so that we get better accuracy |
645 | * without having to use floating point. Here we increment m | 645 | * without having to use floating point. Here we increment m |
646 | * until n is within the valid range. | 646 | * until n is within the valid range. |
647 | */ | 647 | */ |
648 | n = (SAB_BASE_BAUD * 10) / baud; | 648 | n = (SAB_BASE_BAUD * 10) / baud; |
649 | m = 0; | 649 | m = 0; |
650 | while (n >= 640) { | 650 | while (n >= 640) { |
651 | n = n / 2; | 651 | n = n / 2; |
652 | m++; | 652 | m++; |
653 | } | 653 | } |
654 | n = (n+5) / 10; | 654 | n = (n+5) / 10; |
655 | /* | 655 | /* |
656 | * We try very hard to avoid speeds with M == 0 since they may | 656 | * We try very hard to avoid speeds with M == 0 since they may |
657 | * not work correctly for XTAL frequences above 10 MHz. | 657 | * not work correctly for XTAL frequences above 10 MHz. |
658 | */ | 658 | */ |
659 | if ((m == 0) && ((n & 1) == 0)) { | 659 | if ((m == 0) && ((n & 1) == 0)) { |
660 | n = n / 2; | 660 | n = n / 2; |
661 | m++; | 661 | m++; |
662 | } | 662 | } |
663 | *n_ret = n - 1; | 663 | *n_ret = n - 1; |
664 | *m_ret = m; | 664 | *m_ret = m; |
665 | } | 665 | } |
666 | 666 | ||
667 | /* Internal routine, port->lock is held and local interrupts are disabled. */ | 667 | /* Internal routine, port->lock is held and local interrupts are disabled. */ |
668 | static void sunsab_convert_to_sab(struct uart_sunsab_port *up, unsigned int cflag, | 668 | static void sunsab_convert_to_sab(struct uart_sunsab_port *up, unsigned int cflag, |
669 | unsigned int iflag, unsigned int baud, | 669 | unsigned int iflag, unsigned int baud, |
670 | unsigned int quot) | 670 | unsigned int quot) |
671 | { | 671 | { |
672 | unsigned char dafo; | 672 | unsigned char dafo; |
673 | int bits, n, m; | 673 | int bits, n, m; |
674 | 674 | ||
675 | /* Byte size and parity */ | 675 | /* Byte size and parity */ |
676 | switch (cflag & CSIZE) { | 676 | switch (cflag & CSIZE) { |
677 | case CS5: dafo = SAB82532_DAFO_CHL5; bits = 7; break; | 677 | case CS5: dafo = SAB82532_DAFO_CHL5; bits = 7; break; |
678 | case CS6: dafo = SAB82532_DAFO_CHL6; bits = 8; break; | 678 | case CS6: dafo = SAB82532_DAFO_CHL6; bits = 8; break; |
679 | case CS7: dafo = SAB82532_DAFO_CHL7; bits = 9; break; | 679 | case CS7: dafo = SAB82532_DAFO_CHL7; bits = 9; break; |
680 | case CS8: dafo = SAB82532_DAFO_CHL8; bits = 10; break; | 680 | case CS8: dafo = SAB82532_DAFO_CHL8; bits = 10; break; |
681 | /* Never happens, but GCC is too dumb to figure it out */ | 681 | /* Never happens, but GCC is too dumb to figure it out */ |
682 | default: dafo = SAB82532_DAFO_CHL5; bits = 7; break; | 682 | default: dafo = SAB82532_DAFO_CHL5; bits = 7; break; |
683 | } | 683 | } |
684 | 684 | ||
685 | if (cflag & CSTOPB) { | 685 | if (cflag & CSTOPB) { |
686 | dafo |= SAB82532_DAFO_STOP; | 686 | dafo |= SAB82532_DAFO_STOP; |
687 | bits++; | 687 | bits++; |
688 | } | 688 | } |
689 | 689 | ||
690 | if (cflag & PARENB) { | 690 | if (cflag & PARENB) { |
691 | dafo |= SAB82532_DAFO_PARE; | 691 | dafo |= SAB82532_DAFO_PARE; |
692 | bits++; | 692 | bits++; |
693 | } | 693 | } |
694 | 694 | ||
695 | if (cflag & PARODD) { | 695 | if (cflag & PARODD) { |
696 | dafo |= SAB82532_DAFO_PAR_ODD; | 696 | dafo |= SAB82532_DAFO_PAR_ODD; |
697 | } else { | 697 | } else { |
698 | dafo |= SAB82532_DAFO_PAR_EVEN; | 698 | dafo |= SAB82532_DAFO_PAR_EVEN; |
699 | } | 699 | } |
700 | up->cached_dafo = dafo; | 700 | up->cached_dafo = dafo; |
701 | 701 | ||
702 | calc_ebrg(baud, &n, &m); | 702 | calc_ebrg(baud, &n, &m); |
703 | 703 | ||
704 | up->cached_ebrg = n | (m << 6); | 704 | up->cached_ebrg = n | (m << 6); |
705 | 705 | ||
706 | up->tec_timeout = (10 * 1000000) / baud; | 706 | up->tec_timeout = (10 * 1000000) / baud; |
707 | up->cec_timeout = up->tec_timeout >> 2; | 707 | up->cec_timeout = up->tec_timeout >> 2; |
708 | 708 | ||
709 | /* CTS flow control flags */ | 709 | /* CTS flow control flags */ |
710 | /* We encode read_status_mask and ignore_status_mask like so: | 710 | /* We encode read_status_mask and ignore_status_mask like so: |
711 | * | 711 | * |
712 | * --------------------- | 712 | * --------------------- |
713 | * | ... | ISR1 | ISR0 | | 713 | * | ... | ISR1 | ISR0 | |
714 | * --------------------- | 714 | * --------------------- |
715 | * .. 15 8 7 0 | 715 | * .. 15 8 7 0 |
716 | */ | 716 | */ |
717 | 717 | ||
718 | up->port.read_status_mask = (SAB82532_ISR0_TCD | SAB82532_ISR0_TIME | | 718 | up->port.read_status_mask = (SAB82532_ISR0_TCD | SAB82532_ISR0_TIME | |
719 | SAB82532_ISR0_RFO | SAB82532_ISR0_RPF | | 719 | SAB82532_ISR0_RFO | SAB82532_ISR0_RPF | |
720 | SAB82532_ISR0_CDSC); | 720 | SAB82532_ISR0_CDSC); |
721 | up->port.read_status_mask |= (SAB82532_ISR1_CSC | | 721 | up->port.read_status_mask |= (SAB82532_ISR1_CSC | |
722 | SAB82532_ISR1_ALLS | | 722 | SAB82532_ISR1_ALLS | |
723 | SAB82532_ISR1_XPR) << 8; | 723 | SAB82532_ISR1_XPR) << 8; |
724 | if (iflag & INPCK) | 724 | if (iflag & INPCK) |
725 | up->port.read_status_mask |= (SAB82532_ISR0_PERR | | 725 | up->port.read_status_mask |= (SAB82532_ISR0_PERR | |
726 | SAB82532_ISR0_FERR); | 726 | SAB82532_ISR0_FERR); |
727 | if (iflag & (BRKINT | PARMRK)) | 727 | if (iflag & (BRKINT | PARMRK)) |
728 | up->port.read_status_mask |= (SAB82532_ISR1_BRK << 8); | 728 | up->port.read_status_mask |= (SAB82532_ISR1_BRK << 8); |
729 | 729 | ||
730 | /* | 730 | /* |
731 | * Characteres to ignore | 731 | * Characteres to ignore |
732 | */ | 732 | */ |
733 | up->port.ignore_status_mask = 0; | 733 | up->port.ignore_status_mask = 0; |
734 | if (iflag & IGNPAR) | 734 | if (iflag & IGNPAR) |
735 | up->port.ignore_status_mask |= (SAB82532_ISR0_PERR | | 735 | up->port.ignore_status_mask |= (SAB82532_ISR0_PERR | |
736 | SAB82532_ISR0_FERR); | 736 | SAB82532_ISR0_FERR); |
737 | if (iflag & IGNBRK) { | 737 | if (iflag & IGNBRK) { |
738 | up->port.ignore_status_mask |= (SAB82532_ISR1_BRK << 8); | 738 | up->port.ignore_status_mask |= (SAB82532_ISR1_BRK << 8); |
739 | /* | 739 | /* |
740 | * If we're ignoring parity and break indicators, | 740 | * If we're ignoring parity and break indicators, |
741 | * ignore overruns too (for real raw support). | 741 | * ignore overruns too (for real raw support). |
742 | */ | 742 | */ |
743 | if (iflag & IGNPAR) | 743 | if (iflag & IGNPAR) |
744 | up->port.ignore_status_mask |= SAB82532_ISR0_RFO; | 744 | up->port.ignore_status_mask |= SAB82532_ISR0_RFO; |
745 | } | 745 | } |
746 | 746 | ||
747 | /* | 747 | /* |
748 | * ignore all characters if CREAD is not set | 748 | * ignore all characters if CREAD is not set |
749 | */ | 749 | */ |
750 | if ((cflag & CREAD) == 0) | 750 | if ((cflag & CREAD) == 0) |
751 | up->port.ignore_status_mask |= (SAB82532_ISR0_RPF | | 751 | up->port.ignore_status_mask |= (SAB82532_ISR0_RPF | |
752 | SAB82532_ISR0_TCD); | 752 | SAB82532_ISR0_TCD); |
753 | 753 | ||
754 | uart_update_timeout(&up->port, cflag, | 754 | uart_update_timeout(&up->port, cflag, |
755 | (up->port.uartclk / (16 * quot))); | 755 | (up->port.uartclk / (16 * quot))); |
756 | 756 | ||
757 | /* Now schedule a register update when the chip's | 757 | /* Now schedule a register update when the chip's |
758 | * transmitter is idle. | 758 | * transmitter is idle. |
759 | */ | 759 | */ |
760 | up->cached_mode |= SAB82532_MODE_RAC; | 760 | up->cached_mode |= SAB82532_MODE_RAC; |
761 | set_bit(SAB82532_REGS_PENDING, &up->irqflags); | 761 | set_bit(SAB82532_REGS_PENDING, &up->irqflags); |
762 | if (test_bit(SAB82532_XPR, &up->irqflags)) | 762 | if (test_bit(SAB82532_XPR, &up->irqflags)) |
763 | sunsab_tx_idle(up); | 763 | sunsab_tx_idle(up); |
764 | } | 764 | } |
765 | 765 | ||
766 | /* port->lock is not held. */ | 766 | /* port->lock is not held. */ |
767 | static void sunsab_set_termios(struct uart_port *port, struct ktermios *termios, | 767 | static void sunsab_set_termios(struct uart_port *port, struct ktermios *termios, |
768 | struct ktermios *old) | 768 | struct ktermios *old) |
769 | { | 769 | { |
770 | struct uart_sunsab_port *up = (struct uart_sunsab_port *) port; | 770 | struct uart_sunsab_port *up = (struct uart_sunsab_port *) port; |
771 | unsigned long flags; | 771 | unsigned long flags; |
772 | unsigned int baud = uart_get_baud_rate(port, termios, old, 0, 4000000); | 772 | unsigned int baud = uart_get_baud_rate(port, termios, old, 0, 4000000); |
773 | unsigned int quot = uart_get_divisor(port, baud); | 773 | unsigned int quot = uart_get_divisor(port, baud); |
774 | 774 | ||
775 | spin_lock_irqsave(&up->port.lock, flags); | 775 | spin_lock_irqsave(&up->port.lock, flags); |
776 | sunsab_convert_to_sab(up, termios->c_cflag, termios->c_iflag, baud, quot); | 776 | sunsab_convert_to_sab(up, termios->c_cflag, termios->c_iflag, baud, quot); |
777 | spin_unlock_irqrestore(&up->port.lock, flags); | 777 | spin_unlock_irqrestore(&up->port.lock, flags); |
778 | } | 778 | } |
779 | 779 | ||
780 | static const char *sunsab_type(struct uart_port *port) | 780 | static const char *sunsab_type(struct uart_port *port) |
781 | { | 781 | { |
782 | struct uart_sunsab_port *up = (void *)port; | 782 | struct uart_sunsab_port *up = (void *)port; |
783 | static char buf[36]; | 783 | static char buf[36]; |
784 | 784 | ||
785 | sprintf(buf, "SAB82532 %s", sab82532_version[up->type]); | 785 | sprintf(buf, "SAB82532 %s", sab82532_version[up->type]); |
786 | return buf; | 786 | return buf; |
787 | } | 787 | } |
788 | 788 | ||
789 | static void sunsab_release_port(struct uart_port *port) | 789 | static void sunsab_release_port(struct uart_port *port) |
790 | { | 790 | { |
791 | } | 791 | } |
792 | 792 | ||
793 | static int sunsab_request_port(struct uart_port *port) | 793 | static int sunsab_request_port(struct uart_port *port) |
794 | { | 794 | { |
795 | return 0; | 795 | return 0; |
796 | } | 796 | } |
797 | 797 | ||
798 | static void sunsab_config_port(struct uart_port *port, int flags) | 798 | static void sunsab_config_port(struct uart_port *port, int flags) |
799 | { | 799 | { |
800 | } | 800 | } |
801 | 801 | ||
802 | static int sunsab_verify_port(struct uart_port *port, struct serial_struct *ser) | 802 | static int sunsab_verify_port(struct uart_port *port, struct serial_struct *ser) |
803 | { | 803 | { |
804 | return -EINVAL; | 804 | return -EINVAL; |
805 | } | 805 | } |
806 | 806 | ||
807 | static struct uart_ops sunsab_pops = { | 807 | static struct uart_ops sunsab_pops = { |
808 | .tx_empty = sunsab_tx_empty, | 808 | .tx_empty = sunsab_tx_empty, |
809 | .set_mctrl = sunsab_set_mctrl, | 809 | .set_mctrl = sunsab_set_mctrl, |
810 | .get_mctrl = sunsab_get_mctrl, | 810 | .get_mctrl = sunsab_get_mctrl, |
811 | .stop_tx = sunsab_stop_tx, | 811 | .stop_tx = sunsab_stop_tx, |
812 | .start_tx = sunsab_start_tx, | 812 | .start_tx = sunsab_start_tx, |
813 | .send_xchar = sunsab_send_xchar, | 813 | .send_xchar = sunsab_send_xchar, |
814 | .stop_rx = sunsab_stop_rx, | 814 | .stop_rx = sunsab_stop_rx, |
815 | .enable_ms = sunsab_enable_ms, | 815 | .enable_ms = sunsab_enable_ms, |
816 | .break_ctl = sunsab_break_ctl, | 816 | .break_ctl = sunsab_break_ctl, |
817 | .startup = sunsab_startup, | 817 | .startup = sunsab_startup, |
818 | .shutdown = sunsab_shutdown, | 818 | .shutdown = sunsab_shutdown, |
819 | .set_termios = sunsab_set_termios, | 819 | .set_termios = sunsab_set_termios, |
820 | .type = sunsab_type, | 820 | .type = sunsab_type, |
821 | .release_port = sunsab_release_port, | 821 | .release_port = sunsab_release_port, |
822 | .request_port = sunsab_request_port, | 822 | .request_port = sunsab_request_port, |
823 | .config_port = sunsab_config_port, | 823 | .config_port = sunsab_config_port, |
824 | .verify_port = sunsab_verify_port, | 824 | .verify_port = sunsab_verify_port, |
825 | }; | 825 | }; |
826 | 826 | ||
827 | static struct uart_driver sunsab_reg = { | 827 | static struct uart_driver sunsab_reg = { |
828 | .owner = THIS_MODULE, | 828 | .owner = THIS_MODULE, |
829 | .driver_name = "sunsab", | 829 | .driver_name = "sunsab", |
830 | .dev_name = "ttyS", | 830 | .dev_name = "ttyS", |
831 | .major = TTY_MAJOR, | 831 | .major = TTY_MAJOR, |
832 | }; | 832 | }; |
833 | 833 | ||
834 | static struct uart_sunsab_port *sunsab_ports; | 834 | static struct uart_sunsab_port *sunsab_ports; |
835 | 835 | ||
836 | #ifdef CONFIG_SERIAL_SUNSAB_CONSOLE | 836 | #ifdef CONFIG_SERIAL_SUNSAB_CONSOLE |
837 | 837 | ||
838 | static void sunsab_console_putchar(struct uart_port *port, int c) | 838 | static void sunsab_console_putchar(struct uart_port *port, int c) |
839 | { | 839 | { |
840 | struct uart_sunsab_port *up = (struct uart_sunsab_port *)port; | 840 | struct uart_sunsab_port *up = (struct uart_sunsab_port *)port; |
841 | 841 | ||
842 | sunsab_tec_wait(up); | 842 | sunsab_tec_wait(up); |
843 | writeb(c, &up->regs->w.tic); | 843 | writeb(c, &up->regs->w.tic); |
844 | } | 844 | } |
845 | 845 | ||
846 | static void sunsab_console_write(struct console *con, const char *s, unsigned n) | 846 | static void sunsab_console_write(struct console *con, const char *s, unsigned n) |
847 | { | 847 | { |
848 | struct uart_sunsab_port *up = &sunsab_ports[con->index]; | 848 | struct uart_sunsab_port *up = &sunsab_ports[con->index]; |
849 | unsigned long flags; | 849 | unsigned long flags; |
850 | int locked = 1; | 850 | int locked = 1; |
851 | 851 | ||
852 | local_irq_save(flags); | 852 | local_irq_save(flags); |
853 | if (up->port.sysrq) { | 853 | if (up->port.sysrq) { |
854 | locked = 0; | 854 | locked = 0; |
855 | } else if (oops_in_progress) { | 855 | } else if (oops_in_progress) { |
856 | locked = spin_trylock(&up->port.lock); | 856 | locked = spin_trylock(&up->port.lock); |
857 | } else | 857 | } else |
858 | spin_lock(&up->port.lock); | 858 | spin_lock(&up->port.lock); |
859 | 859 | ||
860 | uart_console_write(&up->port, s, n, sunsab_console_putchar); | 860 | uart_console_write(&up->port, s, n, sunsab_console_putchar); |
861 | sunsab_tec_wait(up); | 861 | sunsab_tec_wait(up); |
862 | 862 | ||
863 | if (locked) | 863 | if (locked) |
864 | spin_unlock(&up->port.lock); | 864 | spin_unlock(&up->port.lock); |
865 | local_irq_restore(flags); | 865 | local_irq_restore(flags); |
866 | } | 866 | } |
867 | 867 | ||
868 | static int sunsab_console_setup(struct console *con, char *options) | 868 | static int sunsab_console_setup(struct console *con, char *options) |
869 | { | 869 | { |
870 | struct uart_sunsab_port *up = &sunsab_ports[con->index]; | 870 | struct uart_sunsab_port *up = &sunsab_ports[con->index]; |
871 | unsigned long flags; | 871 | unsigned long flags; |
872 | unsigned int baud, quot; | 872 | unsigned int baud, quot; |
873 | 873 | ||
874 | /* | 874 | /* |
875 | * The console framework calls us for each and every port | 875 | * The console framework calls us for each and every port |
876 | * registered. Defer the console setup until the requested | 876 | * registered. Defer the console setup until the requested |
877 | * port has been properly discovered. A bit of a hack, | 877 | * port has been properly discovered. A bit of a hack, |
878 | * though... | 878 | * though... |
879 | */ | 879 | */ |
880 | if (up->port.type != PORT_SUNSAB) | 880 | if (up->port.type != PORT_SUNSAB) |
881 | return -1; | 881 | return -1; |
882 | 882 | ||
883 | printk("Console: ttyS%d (SAB82532)\n", | 883 | printk("Console: ttyS%d (SAB82532)\n", |
884 | (sunsab_reg.minor - 64) + con->index); | 884 | (sunsab_reg.minor - 64) + con->index); |
885 | 885 | ||
886 | sunserial_console_termios(con, up->port.dev->of_node); | 886 | sunserial_console_termios(con, up->port.dev->of_node); |
887 | 887 | ||
888 | switch (con->cflag & CBAUD) { | 888 | switch (con->cflag & CBAUD) { |
889 | case B150: baud = 150; break; | 889 | case B150: baud = 150; break; |
890 | case B300: baud = 300; break; | 890 | case B300: baud = 300; break; |
891 | case B600: baud = 600; break; | 891 | case B600: baud = 600; break; |
892 | case B1200: baud = 1200; break; | 892 | case B1200: baud = 1200; break; |
893 | case B2400: baud = 2400; break; | 893 | case B2400: baud = 2400; break; |
894 | case B4800: baud = 4800; break; | 894 | case B4800: baud = 4800; break; |
895 | default: case B9600: baud = 9600; break; | 895 | default: case B9600: baud = 9600; break; |
896 | case B19200: baud = 19200; break; | 896 | case B19200: baud = 19200; break; |
897 | case B38400: baud = 38400; break; | 897 | case B38400: baud = 38400; break; |
898 | case B57600: baud = 57600; break; | 898 | case B57600: baud = 57600; break; |
899 | case B115200: baud = 115200; break; | 899 | case B115200: baud = 115200; break; |
900 | case B230400: baud = 230400; break; | 900 | case B230400: baud = 230400; break; |
901 | case B460800: baud = 460800; break; | 901 | case B460800: baud = 460800; break; |
902 | }; | 902 | }; |
903 | 903 | ||
904 | /* | 904 | /* |
905 | * Temporary fix. | 905 | * Temporary fix. |
906 | */ | 906 | */ |
907 | spin_lock_init(&up->port.lock); | 907 | spin_lock_init(&up->port.lock); |
908 | 908 | ||
909 | /* | 909 | /* |
910 | * Initialize the hardware | 910 | * Initialize the hardware |
911 | */ | 911 | */ |
912 | sunsab_startup(&up->port); | 912 | sunsab_startup(&up->port); |
913 | 913 | ||
914 | spin_lock_irqsave(&up->port.lock, flags); | 914 | spin_lock_irqsave(&up->port.lock, flags); |
915 | 915 | ||
916 | /* | 916 | /* |
917 | * Finally, enable interrupts | 917 | * Finally, enable interrupts |
918 | */ | 918 | */ |
919 | up->interrupt_mask0 = SAB82532_IMR0_PERR | SAB82532_IMR0_FERR | | 919 | up->interrupt_mask0 = SAB82532_IMR0_PERR | SAB82532_IMR0_FERR | |
920 | SAB82532_IMR0_PLLA | SAB82532_IMR0_CDSC; | 920 | SAB82532_IMR0_PLLA | SAB82532_IMR0_CDSC; |
921 | writeb(up->interrupt_mask0, &up->regs->w.imr0); | 921 | writeb(up->interrupt_mask0, &up->regs->w.imr0); |
922 | up->interrupt_mask1 = SAB82532_IMR1_BRKT | SAB82532_IMR1_ALLS | | 922 | up->interrupt_mask1 = SAB82532_IMR1_BRKT | SAB82532_IMR1_ALLS | |
923 | SAB82532_IMR1_XOFF | SAB82532_IMR1_TIN | | 923 | SAB82532_IMR1_XOFF | SAB82532_IMR1_TIN | |
924 | SAB82532_IMR1_CSC | SAB82532_IMR1_XON | | 924 | SAB82532_IMR1_CSC | SAB82532_IMR1_XON | |
925 | SAB82532_IMR1_XPR; | 925 | SAB82532_IMR1_XPR; |
926 | writeb(up->interrupt_mask1, &up->regs->w.imr1); | 926 | writeb(up->interrupt_mask1, &up->regs->w.imr1); |
927 | 927 | ||
928 | quot = uart_get_divisor(&up->port, baud); | 928 | quot = uart_get_divisor(&up->port, baud); |
929 | sunsab_convert_to_sab(up, con->cflag, 0, baud, quot); | 929 | sunsab_convert_to_sab(up, con->cflag, 0, baud, quot); |
930 | sunsab_set_mctrl(&up->port, TIOCM_DTR | TIOCM_RTS); | 930 | sunsab_set_mctrl(&up->port, TIOCM_DTR | TIOCM_RTS); |
931 | 931 | ||
932 | spin_unlock_irqrestore(&up->port.lock, flags); | 932 | spin_unlock_irqrestore(&up->port.lock, flags); |
933 | 933 | ||
934 | return 0; | 934 | return 0; |
935 | } | 935 | } |
936 | 936 | ||
937 | static struct console sunsab_console = { | 937 | static struct console sunsab_console = { |
938 | .name = "ttyS", | 938 | .name = "ttyS", |
939 | .write = sunsab_console_write, | 939 | .write = sunsab_console_write, |
940 | .device = uart_console_device, | 940 | .device = uart_console_device, |
941 | .setup = sunsab_console_setup, | 941 | .setup = sunsab_console_setup, |
942 | .flags = CON_PRINTBUFFER, | 942 | .flags = CON_PRINTBUFFER, |
943 | .index = -1, | 943 | .index = -1, |
944 | .data = &sunsab_reg, | 944 | .data = &sunsab_reg, |
945 | }; | 945 | }; |
946 | 946 | ||
947 | static inline struct console *SUNSAB_CONSOLE(void) | 947 | static inline struct console *SUNSAB_CONSOLE(void) |
948 | { | 948 | { |
949 | return &sunsab_console; | 949 | return &sunsab_console; |
950 | } | 950 | } |
951 | #else | 951 | #else |
952 | #define SUNSAB_CONSOLE() (NULL) | 952 | #define SUNSAB_CONSOLE() (NULL) |
953 | #define sunsab_console_init() do { } while (0) | 953 | #define sunsab_console_init() do { } while (0) |
954 | #endif | 954 | #endif |
955 | 955 | ||
956 | static int __devinit sunsab_init_one(struct uart_sunsab_port *up, | 956 | static int __devinit sunsab_init_one(struct uart_sunsab_port *up, |
957 | struct platform_device *op, | 957 | struct platform_device *op, |
958 | unsigned long offset, | 958 | unsigned long offset, |
959 | int line) | 959 | int line) |
960 | { | 960 | { |
961 | up->port.line = line; | 961 | up->port.line = line; |
962 | up->port.dev = &op->dev; | 962 | up->port.dev = &op->dev; |
963 | 963 | ||
964 | up->port.mapbase = op->resource[0].start + offset; | 964 | up->port.mapbase = op->resource[0].start + offset; |
965 | up->port.membase = of_ioremap(&op->resource[0], offset, | 965 | up->port.membase = of_ioremap(&op->resource[0], offset, |
966 | sizeof(union sab82532_async_regs), | 966 | sizeof(union sab82532_async_regs), |
967 | "sab"); | 967 | "sab"); |
968 | if (!up->port.membase) | 968 | if (!up->port.membase) |
969 | return -ENOMEM; | 969 | return -ENOMEM; |
970 | up->regs = (union sab82532_async_regs __iomem *) up->port.membase; | 970 | up->regs = (union sab82532_async_regs __iomem *) up->port.membase; |
971 | 971 | ||
972 | up->port.irq = op->archdata.irqs[0]; | 972 | up->port.irq = op->archdata.irqs[0]; |
973 | 973 | ||
974 | up->port.fifosize = SAB82532_XMIT_FIFO_SIZE; | 974 | up->port.fifosize = SAB82532_XMIT_FIFO_SIZE; |
975 | up->port.iotype = UPIO_MEM; | 975 | up->port.iotype = UPIO_MEM; |
976 | 976 | ||
977 | writeb(SAB82532_IPC_IC_ACT_LOW, &up->regs->w.ipc); | 977 | writeb(SAB82532_IPC_IC_ACT_LOW, &up->regs->w.ipc); |
978 | 978 | ||
979 | up->port.ops = &sunsab_pops; | 979 | up->port.ops = &sunsab_pops; |
980 | up->port.type = PORT_SUNSAB; | 980 | up->port.type = PORT_SUNSAB; |
981 | up->port.uartclk = SAB_BASE_BAUD; | 981 | up->port.uartclk = SAB_BASE_BAUD; |
982 | 982 | ||
983 | up->type = readb(&up->regs->r.vstr) & 0x0f; | 983 | up->type = readb(&up->regs->r.vstr) & 0x0f; |
984 | writeb(~((1 << 1) | (1 << 2) | (1 << 4)), &up->regs->w.pcr); | 984 | writeb(~((1 << 1) | (1 << 2) | (1 << 4)), &up->regs->w.pcr); |
985 | writeb(0xff, &up->regs->w.pim); | 985 | writeb(0xff, &up->regs->w.pim); |
986 | if ((up->port.line & 0x1) == 0) { | 986 | if ((up->port.line & 0x1) == 0) { |
987 | up->pvr_dsr_bit = (1 << 0); | 987 | up->pvr_dsr_bit = (1 << 0); |
988 | up->pvr_dtr_bit = (1 << 1); | 988 | up->pvr_dtr_bit = (1 << 1); |
989 | up->gis_shift = 2; | 989 | up->gis_shift = 2; |
990 | } else { | 990 | } else { |
991 | up->pvr_dsr_bit = (1 << 3); | 991 | up->pvr_dsr_bit = (1 << 3); |
992 | up->pvr_dtr_bit = (1 << 2); | 992 | up->pvr_dtr_bit = (1 << 2); |
993 | up->gis_shift = 0; | 993 | up->gis_shift = 0; |
994 | } | 994 | } |
995 | up->cached_pvr = (1 << 1) | (1 << 2) | (1 << 4); | 995 | up->cached_pvr = (1 << 1) | (1 << 2) | (1 << 4); |
996 | writeb(up->cached_pvr, &up->regs->w.pvr); | 996 | writeb(up->cached_pvr, &up->regs->w.pvr); |
997 | up->cached_mode = readb(&up->regs->rw.mode); | 997 | up->cached_mode = readb(&up->regs->rw.mode); |
998 | up->cached_mode |= SAB82532_MODE_FRTS; | 998 | up->cached_mode |= SAB82532_MODE_FRTS; |
999 | writeb(up->cached_mode, &up->regs->rw.mode); | 999 | writeb(up->cached_mode, &up->regs->rw.mode); |
1000 | up->cached_mode |= SAB82532_MODE_RTS; | 1000 | up->cached_mode |= SAB82532_MODE_RTS; |
1001 | writeb(up->cached_mode, &up->regs->rw.mode); | 1001 | writeb(up->cached_mode, &up->regs->rw.mode); |
1002 | 1002 | ||
1003 | up->tec_timeout = SAB82532_MAX_TEC_TIMEOUT; | 1003 | up->tec_timeout = SAB82532_MAX_TEC_TIMEOUT; |
1004 | up->cec_timeout = SAB82532_MAX_CEC_TIMEOUT; | 1004 | up->cec_timeout = SAB82532_MAX_CEC_TIMEOUT; |
1005 | 1005 | ||
1006 | return 0; | 1006 | return 0; |
1007 | } | 1007 | } |
1008 | 1008 | ||
1009 | static int __devinit sab_probe(struct platform_device *op) | 1009 | static int __devinit sab_probe(struct platform_device *op) |
1010 | { | 1010 | { |
1011 | static int inst; | 1011 | static int inst; |
1012 | struct uart_sunsab_port *up; | 1012 | struct uart_sunsab_port *up; |
1013 | int err; | 1013 | int err; |
1014 | 1014 | ||
1015 | up = &sunsab_ports[inst * 2]; | 1015 | up = &sunsab_ports[inst * 2]; |
1016 | 1016 | ||
1017 | err = sunsab_init_one(&up[0], op, | 1017 | err = sunsab_init_one(&up[0], op, |
1018 | 0, | 1018 | 0, |
1019 | (inst * 2) + 0); | 1019 | (inst * 2) + 0); |
1020 | if (err) | 1020 | if (err) |
1021 | goto out; | 1021 | goto out; |
1022 | 1022 | ||
1023 | err = sunsab_init_one(&up[1], op, | 1023 | err = sunsab_init_one(&up[1], op, |
1024 | sizeof(union sab82532_async_regs), | 1024 | sizeof(union sab82532_async_regs), |
1025 | (inst * 2) + 1); | 1025 | (inst * 2) + 1); |
1026 | if (err) | 1026 | if (err) |
1027 | goto out1; | 1027 | goto out1; |
1028 | 1028 | ||
1029 | sunserial_console_match(SUNSAB_CONSOLE(), op->dev.of_node, | 1029 | sunserial_console_match(SUNSAB_CONSOLE(), op->dev.of_node, |
1030 | &sunsab_reg, up[0].port.line, | 1030 | &sunsab_reg, up[0].port.line, |
1031 | false); | 1031 | false); |
1032 | 1032 | ||
1033 | sunserial_console_match(SUNSAB_CONSOLE(), op->dev.of_node, | 1033 | sunserial_console_match(SUNSAB_CONSOLE(), op->dev.of_node, |
1034 | &sunsab_reg, up[1].port.line, | 1034 | &sunsab_reg, up[1].port.line, |
1035 | false); | 1035 | false); |
1036 | 1036 | ||
1037 | err = uart_add_one_port(&sunsab_reg, &up[0].port); | 1037 | err = uart_add_one_port(&sunsab_reg, &up[0].port); |
1038 | if (err) | 1038 | if (err) |
1039 | goto out2; | 1039 | goto out2; |
1040 | 1040 | ||
1041 | err = uart_add_one_port(&sunsab_reg, &up[1].port); | 1041 | err = uart_add_one_port(&sunsab_reg, &up[1].port); |
1042 | if (err) | 1042 | if (err) |
1043 | goto out3; | 1043 | goto out3; |
1044 | 1044 | ||
1045 | dev_set_drvdata(&op->dev, &up[0]); | 1045 | dev_set_drvdata(&op->dev, &up[0]); |
1046 | 1046 | ||
1047 | inst++; | 1047 | inst++; |
1048 | 1048 | ||
1049 | return 0; | 1049 | return 0; |
1050 | 1050 | ||
1051 | out3: | 1051 | out3: |
1052 | uart_remove_one_port(&sunsab_reg, &up[0].port); | 1052 | uart_remove_one_port(&sunsab_reg, &up[0].port); |
1053 | out2: | 1053 | out2: |
1054 | of_iounmap(&op->resource[0], | 1054 | of_iounmap(&op->resource[0], |
1055 | up[1].port.membase, | 1055 | up[1].port.membase, |
1056 | sizeof(union sab82532_async_regs)); | 1056 | sizeof(union sab82532_async_regs)); |
1057 | out1: | 1057 | out1: |
1058 | of_iounmap(&op->resource[0], | 1058 | of_iounmap(&op->resource[0], |
1059 | up[0].port.membase, | 1059 | up[0].port.membase, |
1060 | sizeof(union sab82532_async_regs)); | 1060 | sizeof(union sab82532_async_regs)); |
1061 | out: | 1061 | out: |
1062 | return err; | 1062 | return err; |
1063 | } | 1063 | } |
1064 | 1064 | ||
1065 | static int __devexit sab_remove(struct platform_device *op) | 1065 | static int __devexit sab_remove(struct platform_device *op) |
1066 | { | 1066 | { |
1067 | struct uart_sunsab_port *up = dev_get_drvdata(&op->dev); | 1067 | struct uart_sunsab_port *up = dev_get_drvdata(&op->dev); |
1068 | 1068 | ||
1069 | uart_remove_one_port(&sunsab_reg, &up[1].port); | 1069 | uart_remove_one_port(&sunsab_reg, &up[1].port); |
1070 | uart_remove_one_port(&sunsab_reg, &up[0].port); | 1070 | uart_remove_one_port(&sunsab_reg, &up[0].port); |
1071 | of_iounmap(&op->resource[0], | 1071 | of_iounmap(&op->resource[0], |
1072 | up[1].port.membase, | 1072 | up[1].port.membase, |
1073 | sizeof(union sab82532_async_regs)); | 1073 | sizeof(union sab82532_async_regs)); |
1074 | of_iounmap(&op->resource[0], | 1074 | of_iounmap(&op->resource[0], |
1075 | up[0].port.membase, | 1075 | up[0].port.membase, |
1076 | sizeof(union sab82532_async_regs)); | 1076 | sizeof(union sab82532_async_regs)); |
1077 | 1077 | ||
1078 | dev_set_drvdata(&op->dev, NULL); | 1078 | dev_set_drvdata(&op->dev, NULL); |
1079 | 1079 | ||
1080 | return 0; | 1080 | return 0; |
1081 | } | 1081 | } |
1082 | 1082 | ||
1083 | static const struct of_device_id sab_match[] = { | 1083 | static const struct of_device_id sab_match[] = { |
1084 | { | 1084 | { |
1085 | .name = "se", | 1085 | .name = "se", |
1086 | }, | 1086 | }, |
1087 | { | 1087 | { |
1088 | .name = "serial", | 1088 | .name = "serial", |
1089 | .compatible = "sab82532", | 1089 | .compatible = "sab82532", |
1090 | }, | 1090 | }, |
1091 | {}, | 1091 | {}, |
1092 | }; | 1092 | }; |
1093 | MODULE_DEVICE_TABLE(of, sab_match); | 1093 | MODULE_DEVICE_TABLE(of, sab_match); |
1094 | 1094 | ||
1095 | static struct platform_driver sab_driver = { | 1095 | static struct platform_driver sab_driver = { |
1096 | .driver = { | 1096 | .driver = { |
1097 | .name = "sab", | 1097 | .name = "sab", |
1098 | .owner = THIS_MODULE, | 1098 | .owner = THIS_MODULE, |
1099 | .of_match_table = sab_match, | 1099 | .of_match_table = sab_match, |
1100 | }, | 1100 | }, |
1101 | .probe = sab_probe, | 1101 | .probe = sab_probe, |
1102 | .remove = __devexit_p(sab_remove), | 1102 | .remove = __devexit_p(sab_remove), |
1103 | }; | 1103 | }; |
1104 | 1104 | ||
1105 | static int __init sunsab_init(void) | 1105 | static int __init sunsab_init(void) |
1106 | { | 1106 | { |
1107 | struct device_node *dp; | 1107 | struct device_node *dp; |
1108 | int err; | 1108 | int err; |
1109 | int num_channels = 0; | 1109 | int num_channels = 0; |
1110 | 1110 | ||
1111 | for_each_node_by_name(dp, "se") | 1111 | for_each_node_by_name(dp, "se") |
1112 | num_channels += 2; | 1112 | num_channels += 2; |
1113 | for_each_node_by_name(dp, "serial") { | 1113 | for_each_node_by_name(dp, "serial") { |
1114 | if (of_device_is_compatible(dp, "sab82532")) | 1114 | if (of_device_is_compatible(dp, "sab82532")) |
1115 | num_channels += 2; | 1115 | num_channels += 2; |
1116 | } | 1116 | } |
1117 | 1117 | ||
1118 | if (num_channels) { | 1118 | if (num_channels) { |
1119 | sunsab_ports = kzalloc(sizeof(struct uart_sunsab_port) * | 1119 | sunsab_ports = kzalloc(sizeof(struct uart_sunsab_port) * |
1120 | num_channels, GFP_KERNEL); | 1120 | num_channels, GFP_KERNEL); |
1121 | if (!sunsab_ports) | 1121 | if (!sunsab_ports) |
1122 | return -ENOMEM; | 1122 | return -ENOMEM; |
1123 | 1123 | ||
1124 | err = sunserial_register_minors(&sunsab_reg, num_channels); | 1124 | err = sunserial_register_minors(&sunsab_reg, num_channels); |
1125 | if (err) { | 1125 | if (err) { |
1126 | kfree(sunsab_ports); | 1126 | kfree(sunsab_ports); |
1127 | sunsab_ports = NULL; | 1127 | sunsab_ports = NULL; |
1128 | 1128 | ||
1129 | return err; | 1129 | return err; |
1130 | } | 1130 | } |
1131 | } | 1131 | } |
1132 | 1132 | ||
1133 | return platform_driver_register(&sab_driver); | 1133 | return platform_driver_register(&sab_driver); |
1134 | } | 1134 | } |
1135 | 1135 | ||
1136 | static void __exit sunsab_exit(void) | 1136 | static void __exit sunsab_exit(void) |
1137 | { | 1137 | { |
1138 | platform_driver_unregister(&sab_driver); | 1138 | platform_driver_unregister(&sab_driver); |
1139 | if (sunsab_reg.nr) { | 1139 | if (sunsab_reg.nr) { |
1140 | sunserial_unregister_minors(&sunsab_reg, sunsab_reg.nr); | 1140 | sunserial_unregister_minors(&sunsab_reg, sunsab_reg.nr); |
1141 | } | 1141 | } |
1142 | 1142 | ||
1143 | kfree(sunsab_ports); | 1143 | kfree(sunsab_ports); |
1144 | sunsab_ports = NULL; | 1144 | sunsab_ports = NULL; |
1145 | } | 1145 | } |
1146 | 1146 | ||
1147 | module_init(sunsab_init); | 1147 | module_init(sunsab_init); |
1148 | module_exit(sunsab_exit); | 1148 | module_exit(sunsab_exit); |
1149 | 1149 | ||
1150 | MODULE_AUTHOR("Eddie C. Dost and David S. Miller"); | 1150 | MODULE_AUTHOR("Eddie C. Dost and David S. Miller"); |
1151 | MODULE_DESCRIPTION("Sun SAB82532 serial port driver"); | 1151 | MODULE_DESCRIPTION("Sun SAB82532 serial port driver"); |
1152 | MODULE_LICENSE("GPL"); | 1152 | MODULE_LICENSE("GPL"); |
drivers/tty/serial/sunsu.c
1 | /* | 1 | /* |
2 | * su.c: Small serial driver for keyboard/mouse interface on sparc32/PCI | 2 | * su.c: Small serial driver for keyboard/mouse interface on sparc32/PCI |
3 | * | 3 | * |
4 | * Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be) | 4 | * Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be) |
5 | * Copyright (C) 1998-1999 Pete Zaitcev (zaitcev@yahoo.com) | 5 | * Copyright (C) 1998-1999 Pete Zaitcev (zaitcev@yahoo.com) |
6 | * | 6 | * |
7 | * This is mainly a variation of 8250.c, credits go to authors mentioned | 7 | * This is mainly a variation of 8250.c, credits go to authors mentioned |
8 | * therein. In fact this driver should be merged into the generic 8250.c | 8 | * therein. In fact this driver should be merged into the generic 8250.c |
9 | * infrastructure perhaps using a 8250_sparc.c module. | 9 | * infrastructure perhaps using a 8250_sparc.c module. |
10 | * | 10 | * |
11 | * Fixed to use tty_get_baud_rate(). | 11 | * Fixed to use tty_get_baud_rate(). |
12 | * Theodore Ts'o <tytso@mit.edu>, 2001-Oct-12 | 12 | * Theodore Ts'o <tytso@mit.edu>, 2001-Oct-12 |
13 | * | 13 | * |
14 | * Converted to new 2.5.x UART layer. | 14 | * Converted to new 2.5.x UART layer. |
15 | * David S. Miller (davem@davemloft.net), 2002-Jul-29 | 15 | * David S. Miller (davem@davemloft.net), 2002-Jul-29 |
16 | */ | 16 | */ |
17 | 17 | ||
18 | #include <linux/module.h> | 18 | #include <linux/module.h> |
19 | #include <linux/kernel.h> | 19 | #include <linux/kernel.h> |
20 | #include <linux/spinlock.h> | 20 | #include <linux/spinlock.h> |
21 | #include <linux/errno.h> | 21 | #include <linux/errno.h> |
22 | #include <linux/tty.h> | 22 | #include <linux/tty.h> |
23 | #include <linux/tty_flip.h> | 23 | #include <linux/tty_flip.h> |
24 | #include <linux/major.h> | 24 | #include <linux/major.h> |
25 | #include <linux/string.h> | 25 | #include <linux/string.h> |
26 | #include <linux/ptrace.h> | 26 | #include <linux/ptrace.h> |
27 | #include <linux/ioport.h> | 27 | #include <linux/ioport.h> |
28 | #include <linux/circ_buf.h> | 28 | #include <linux/circ_buf.h> |
29 | #include <linux/serial.h> | 29 | #include <linux/serial.h> |
30 | #include <linux/sysrq.h> | 30 | #include <linux/sysrq.h> |
31 | #include <linux/console.h> | 31 | #include <linux/console.h> |
32 | #include <linux/slab.h> | 32 | #include <linux/slab.h> |
33 | #ifdef CONFIG_SERIO | 33 | #ifdef CONFIG_SERIO |
34 | #include <linux/serio.h> | 34 | #include <linux/serio.h> |
35 | #endif | 35 | #endif |
36 | #include <linux/serial_reg.h> | 36 | #include <linux/serial_reg.h> |
37 | #include <linux/init.h> | 37 | #include <linux/init.h> |
38 | #include <linux/delay.h> | 38 | #include <linux/delay.h> |
39 | #include <linux/of_device.h> | 39 | #include <linux/of_device.h> |
40 | 40 | ||
41 | #include <asm/io.h> | 41 | #include <asm/io.h> |
42 | #include <asm/irq.h> | 42 | #include <asm/irq.h> |
43 | #include <asm/prom.h> | 43 | #include <asm/prom.h> |
44 | 44 | ||
45 | #if defined(CONFIG_SERIAL_SUNSU_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) | 45 | #if defined(CONFIG_SERIAL_SUNSU_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) |
46 | #define SUPPORT_SYSRQ | 46 | #define SUPPORT_SYSRQ |
47 | #endif | 47 | #endif |
48 | 48 | ||
49 | #include <linux/serial_core.h> | 49 | #include <linux/serial_core.h> |
50 | 50 | #include <linux/sunserialcore.h> | |
51 | #include "suncore.h" | ||
52 | 51 | ||
53 | /* We are on a NS PC87303 clocked with 24.0 MHz, which results | 52 | /* We are on a NS PC87303 clocked with 24.0 MHz, which results |
54 | * in a UART clock of 1.8462 MHz. | 53 | * in a UART clock of 1.8462 MHz. |
55 | */ | 54 | */ |
56 | #define SU_BASE_BAUD (1846200 / 16) | 55 | #define SU_BASE_BAUD (1846200 / 16) |
57 | 56 | ||
58 | enum su_type { SU_PORT_NONE, SU_PORT_MS, SU_PORT_KBD, SU_PORT_PORT }; | 57 | enum su_type { SU_PORT_NONE, SU_PORT_MS, SU_PORT_KBD, SU_PORT_PORT }; |
59 | static char *su_typev[] = { "su(???)", "su(mouse)", "su(kbd)", "su(serial)" }; | 58 | static char *su_typev[] = { "su(???)", "su(mouse)", "su(kbd)", "su(serial)" }; |
60 | 59 | ||
61 | /* | 60 | /* |
62 | * Here we define the default xmit fifo size used for each type of UART. | 61 | * Here we define the default xmit fifo size used for each type of UART. |
63 | */ | 62 | */ |
64 | static const struct serial_uart_config uart_config[PORT_MAX_8250+1] = { | 63 | static const struct serial_uart_config uart_config[PORT_MAX_8250+1] = { |
65 | { "unknown", 1, 0 }, | 64 | { "unknown", 1, 0 }, |
66 | { "8250", 1, 0 }, | 65 | { "8250", 1, 0 }, |
67 | { "16450", 1, 0 }, | 66 | { "16450", 1, 0 }, |
68 | { "16550", 1, 0 }, | 67 | { "16550", 1, 0 }, |
69 | { "16550A", 16, UART_CLEAR_FIFO | UART_USE_FIFO }, | 68 | { "16550A", 16, UART_CLEAR_FIFO | UART_USE_FIFO }, |
70 | { "Cirrus", 1, 0 }, | 69 | { "Cirrus", 1, 0 }, |
71 | { "ST16650", 1, UART_CLEAR_FIFO | UART_STARTECH }, | 70 | { "ST16650", 1, UART_CLEAR_FIFO | UART_STARTECH }, |
72 | { "ST16650V2", 32, UART_CLEAR_FIFO | UART_USE_FIFO | UART_STARTECH }, | 71 | { "ST16650V2", 32, UART_CLEAR_FIFO | UART_USE_FIFO | UART_STARTECH }, |
73 | { "TI16750", 64, UART_CLEAR_FIFO | UART_USE_FIFO }, | 72 | { "TI16750", 64, UART_CLEAR_FIFO | UART_USE_FIFO }, |
74 | { "Startech", 1, 0 }, | 73 | { "Startech", 1, 0 }, |
75 | { "16C950/954", 128, UART_CLEAR_FIFO | UART_USE_FIFO }, | 74 | { "16C950/954", 128, UART_CLEAR_FIFO | UART_USE_FIFO }, |
76 | { "ST16654", 64, UART_CLEAR_FIFO | UART_USE_FIFO | UART_STARTECH }, | 75 | { "ST16654", 64, UART_CLEAR_FIFO | UART_USE_FIFO | UART_STARTECH }, |
77 | { "XR16850", 128, UART_CLEAR_FIFO | UART_USE_FIFO | UART_STARTECH }, | 76 | { "XR16850", 128, UART_CLEAR_FIFO | UART_USE_FIFO | UART_STARTECH }, |
78 | { "RSA", 2048, UART_CLEAR_FIFO | UART_USE_FIFO } | 77 | { "RSA", 2048, UART_CLEAR_FIFO | UART_USE_FIFO } |
79 | }; | 78 | }; |
80 | 79 | ||
81 | struct uart_sunsu_port { | 80 | struct uart_sunsu_port { |
82 | struct uart_port port; | 81 | struct uart_port port; |
83 | unsigned char acr; | 82 | unsigned char acr; |
84 | unsigned char ier; | 83 | unsigned char ier; |
85 | unsigned short rev; | 84 | unsigned short rev; |
86 | unsigned char lcr; | 85 | unsigned char lcr; |
87 | unsigned int lsr_break_flag; | 86 | unsigned int lsr_break_flag; |
88 | unsigned int cflag; | 87 | unsigned int cflag; |
89 | 88 | ||
90 | /* Probing information. */ | 89 | /* Probing information. */ |
91 | enum su_type su_type; | 90 | enum su_type su_type; |
92 | unsigned int type_probed; /* XXX Stupid */ | 91 | unsigned int type_probed; /* XXX Stupid */ |
93 | unsigned long reg_size; | 92 | unsigned long reg_size; |
94 | 93 | ||
95 | #ifdef CONFIG_SERIO | 94 | #ifdef CONFIG_SERIO |
96 | struct serio serio; | 95 | struct serio serio; |
97 | int serio_open; | 96 | int serio_open; |
98 | #endif | 97 | #endif |
99 | }; | 98 | }; |
100 | 99 | ||
101 | static unsigned int serial_in(struct uart_sunsu_port *up, int offset) | 100 | static unsigned int serial_in(struct uart_sunsu_port *up, int offset) |
102 | { | 101 | { |
103 | offset <<= up->port.regshift; | 102 | offset <<= up->port.regshift; |
104 | 103 | ||
105 | switch (up->port.iotype) { | 104 | switch (up->port.iotype) { |
106 | case UPIO_HUB6: | 105 | case UPIO_HUB6: |
107 | outb(up->port.hub6 - 1 + offset, up->port.iobase); | 106 | outb(up->port.hub6 - 1 + offset, up->port.iobase); |
108 | return inb(up->port.iobase + 1); | 107 | return inb(up->port.iobase + 1); |
109 | 108 | ||
110 | case UPIO_MEM: | 109 | case UPIO_MEM: |
111 | return readb(up->port.membase + offset); | 110 | return readb(up->port.membase + offset); |
112 | 111 | ||
113 | default: | 112 | default: |
114 | return inb(up->port.iobase + offset); | 113 | return inb(up->port.iobase + offset); |
115 | } | 114 | } |
116 | } | 115 | } |
117 | 116 | ||
118 | static void serial_out(struct uart_sunsu_port *up, int offset, int value) | 117 | static void serial_out(struct uart_sunsu_port *up, int offset, int value) |
119 | { | 118 | { |
120 | #ifndef CONFIG_SPARC64 | 119 | #ifndef CONFIG_SPARC64 |
121 | /* | 120 | /* |
122 | * MrCoffee has weird schematics: IRQ4 & P10(?) pins of SuperIO are | 121 | * MrCoffee has weird schematics: IRQ4 & P10(?) pins of SuperIO are |
123 | * connected with a gate then go to SlavIO. When IRQ4 goes tristated | 122 | * connected with a gate then go to SlavIO. When IRQ4 goes tristated |
124 | * gate outputs a logical one. Since we use level triggered interrupts | 123 | * gate outputs a logical one. Since we use level triggered interrupts |
125 | * we have lockup and watchdog reset. We cannot mask IRQ because | 124 | * we have lockup and watchdog reset. We cannot mask IRQ because |
126 | * keyboard shares IRQ with us (Word has it as Bob Smelik's design). | 125 | * keyboard shares IRQ with us (Word has it as Bob Smelik's design). |
127 | * This problem is similar to what Alpha people suffer, see serial.c. | 126 | * This problem is similar to what Alpha people suffer, see serial.c. |
128 | */ | 127 | */ |
129 | if (offset == UART_MCR) | 128 | if (offset == UART_MCR) |
130 | value |= UART_MCR_OUT2; | 129 | value |= UART_MCR_OUT2; |
131 | #endif | 130 | #endif |
132 | offset <<= up->port.regshift; | 131 | offset <<= up->port.regshift; |
133 | 132 | ||
134 | switch (up->port.iotype) { | 133 | switch (up->port.iotype) { |
135 | case UPIO_HUB6: | 134 | case UPIO_HUB6: |
136 | outb(up->port.hub6 - 1 + offset, up->port.iobase); | 135 | outb(up->port.hub6 - 1 + offset, up->port.iobase); |
137 | outb(value, up->port.iobase + 1); | 136 | outb(value, up->port.iobase + 1); |
138 | break; | 137 | break; |
139 | 138 | ||
140 | case UPIO_MEM: | 139 | case UPIO_MEM: |
141 | writeb(value, up->port.membase + offset); | 140 | writeb(value, up->port.membase + offset); |
142 | break; | 141 | break; |
143 | 142 | ||
144 | default: | 143 | default: |
145 | outb(value, up->port.iobase + offset); | 144 | outb(value, up->port.iobase + offset); |
146 | } | 145 | } |
147 | } | 146 | } |
148 | 147 | ||
149 | /* | 148 | /* |
150 | * We used to support using pause I/O for certain machines. We | 149 | * We used to support using pause I/O for certain machines. We |
151 | * haven't supported this for a while, but just in case it's badly | 150 | * haven't supported this for a while, but just in case it's badly |
152 | * needed for certain old 386 machines, I've left these #define's | 151 | * needed for certain old 386 machines, I've left these #define's |
153 | * in.... | 152 | * in.... |
154 | */ | 153 | */ |
155 | #define serial_inp(up, offset) serial_in(up, offset) | 154 | #define serial_inp(up, offset) serial_in(up, offset) |
156 | #define serial_outp(up, offset, value) serial_out(up, offset, value) | 155 | #define serial_outp(up, offset, value) serial_out(up, offset, value) |
157 | 156 | ||
158 | 157 | ||
159 | /* | 158 | /* |
160 | * For the 16C950 | 159 | * For the 16C950 |
161 | */ | 160 | */ |
162 | static void serial_icr_write(struct uart_sunsu_port *up, int offset, int value) | 161 | static void serial_icr_write(struct uart_sunsu_port *up, int offset, int value) |
163 | { | 162 | { |
164 | serial_out(up, UART_SCR, offset); | 163 | serial_out(up, UART_SCR, offset); |
165 | serial_out(up, UART_ICR, value); | 164 | serial_out(up, UART_ICR, value); |
166 | } | 165 | } |
167 | 166 | ||
168 | #if 0 /* Unused currently */ | 167 | #if 0 /* Unused currently */ |
169 | static unsigned int serial_icr_read(struct uart_sunsu_port *up, int offset) | 168 | static unsigned int serial_icr_read(struct uart_sunsu_port *up, int offset) |
170 | { | 169 | { |
171 | unsigned int value; | 170 | unsigned int value; |
172 | 171 | ||
173 | serial_icr_write(up, UART_ACR, up->acr | UART_ACR_ICRRD); | 172 | serial_icr_write(up, UART_ACR, up->acr | UART_ACR_ICRRD); |
174 | serial_out(up, UART_SCR, offset); | 173 | serial_out(up, UART_SCR, offset); |
175 | value = serial_in(up, UART_ICR); | 174 | value = serial_in(up, UART_ICR); |
176 | serial_icr_write(up, UART_ACR, up->acr); | 175 | serial_icr_write(up, UART_ACR, up->acr); |
177 | 176 | ||
178 | return value; | 177 | return value; |
179 | } | 178 | } |
180 | #endif | 179 | #endif |
181 | 180 | ||
182 | #ifdef CONFIG_SERIAL_8250_RSA | 181 | #ifdef CONFIG_SERIAL_8250_RSA |
183 | /* | 182 | /* |
184 | * Attempts to turn on the RSA FIFO. Returns zero on failure. | 183 | * Attempts to turn on the RSA FIFO. Returns zero on failure. |
185 | * We set the port uart clock rate if we succeed. | 184 | * We set the port uart clock rate if we succeed. |
186 | */ | 185 | */ |
187 | static int __enable_rsa(struct uart_sunsu_port *up) | 186 | static int __enable_rsa(struct uart_sunsu_port *up) |
188 | { | 187 | { |
189 | unsigned char mode; | 188 | unsigned char mode; |
190 | int result; | 189 | int result; |
191 | 190 | ||
192 | mode = serial_inp(up, UART_RSA_MSR); | 191 | mode = serial_inp(up, UART_RSA_MSR); |
193 | result = mode & UART_RSA_MSR_FIFO; | 192 | result = mode & UART_RSA_MSR_FIFO; |
194 | 193 | ||
195 | if (!result) { | 194 | if (!result) { |
196 | serial_outp(up, UART_RSA_MSR, mode | UART_RSA_MSR_FIFO); | 195 | serial_outp(up, UART_RSA_MSR, mode | UART_RSA_MSR_FIFO); |
197 | mode = serial_inp(up, UART_RSA_MSR); | 196 | mode = serial_inp(up, UART_RSA_MSR); |
198 | result = mode & UART_RSA_MSR_FIFO; | 197 | result = mode & UART_RSA_MSR_FIFO; |
199 | } | 198 | } |
200 | 199 | ||
201 | if (result) | 200 | if (result) |
202 | up->port.uartclk = SERIAL_RSA_BAUD_BASE * 16; | 201 | up->port.uartclk = SERIAL_RSA_BAUD_BASE * 16; |
203 | 202 | ||
204 | return result; | 203 | return result; |
205 | } | 204 | } |
206 | 205 | ||
207 | static void enable_rsa(struct uart_sunsu_port *up) | 206 | static void enable_rsa(struct uart_sunsu_port *up) |
208 | { | 207 | { |
209 | if (up->port.type == PORT_RSA) { | 208 | if (up->port.type == PORT_RSA) { |
210 | if (up->port.uartclk != SERIAL_RSA_BAUD_BASE * 16) { | 209 | if (up->port.uartclk != SERIAL_RSA_BAUD_BASE * 16) { |
211 | spin_lock_irq(&up->port.lock); | 210 | spin_lock_irq(&up->port.lock); |
212 | __enable_rsa(up); | 211 | __enable_rsa(up); |
213 | spin_unlock_irq(&up->port.lock); | 212 | spin_unlock_irq(&up->port.lock); |
214 | } | 213 | } |
215 | if (up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16) | 214 | if (up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16) |
216 | serial_outp(up, UART_RSA_FRR, 0); | 215 | serial_outp(up, UART_RSA_FRR, 0); |
217 | } | 216 | } |
218 | } | 217 | } |
219 | 218 | ||
220 | /* | 219 | /* |
221 | * Attempts to turn off the RSA FIFO. Returns zero on failure. | 220 | * Attempts to turn off the RSA FIFO. Returns zero on failure. |
222 | * It is unknown why interrupts were disabled in here. However, | 221 | * It is unknown why interrupts were disabled in here. However, |
223 | * the caller is expected to preserve this behaviour by grabbing | 222 | * the caller is expected to preserve this behaviour by grabbing |
224 | * the spinlock before calling this function. | 223 | * the spinlock before calling this function. |
225 | */ | 224 | */ |
226 | static void disable_rsa(struct uart_sunsu_port *up) | 225 | static void disable_rsa(struct uart_sunsu_port *up) |
227 | { | 226 | { |
228 | unsigned char mode; | 227 | unsigned char mode; |
229 | int result; | 228 | int result; |
230 | 229 | ||
231 | if (up->port.type == PORT_RSA && | 230 | if (up->port.type == PORT_RSA && |
232 | up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16) { | 231 | up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16) { |
233 | spin_lock_irq(&up->port.lock); | 232 | spin_lock_irq(&up->port.lock); |
234 | 233 | ||
235 | mode = serial_inp(up, UART_RSA_MSR); | 234 | mode = serial_inp(up, UART_RSA_MSR); |
236 | result = !(mode & UART_RSA_MSR_FIFO); | 235 | result = !(mode & UART_RSA_MSR_FIFO); |
237 | 236 | ||
238 | if (!result) { | 237 | if (!result) { |
239 | serial_outp(up, UART_RSA_MSR, mode & ~UART_RSA_MSR_FIFO); | 238 | serial_outp(up, UART_RSA_MSR, mode & ~UART_RSA_MSR_FIFO); |
240 | mode = serial_inp(up, UART_RSA_MSR); | 239 | mode = serial_inp(up, UART_RSA_MSR); |
241 | result = !(mode & UART_RSA_MSR_FIFO); | 240 | result = !(mode & UART_RSA_MSR_FIFO); |
242 | } | 241 | } |
243 | 242 | ||
244 | if (result) | 243 | if (result) |
245 | up->port.uartclk = SERIAL_RSA_BAUD_BASE_LO * 16; | 244 | up->port.uartclk = SERIAL_RSA_BAUD_BASE_LO * 16; |
246 | spin_unlock_irq(&up->port.lock); | 245 | spin_unlock_irq(&up->port.lock); |
247 | } | 246 | } |
248 | } | 247 | } |
249 | #endif /* CONFIG_SERIAL_8250_RSA */ | 248 | #endif /* CONFIG_SERIAL_8250_RSA */ |
250 | 249 | ||
251 | static inline void __stop_tx(struct uart_sunsu_port *p) | 250 | static inline void __stop_tx(struct uart_sunsu_port *p) |
252 | { | 251 | { |
253 | if (p->ier & UART_IER_THRI) { | 252 | if (p->ier & UART_IER_THRI) { |
254 | p->ier &= ~UART_IER_THRI; | 253 | p->ier &= ~UART_IER_THRI; |
255 | serial_out(p, UART_IER, p->ier); | 254 | serial_out(p, UART_IER, p->ier); |
256 | } | 255 | } |
257 | } | 256 | } |
258 | 257 | ||
259 | static void sunsu_stop_tx(struct uart_port *port) | 258 | static void sunsu_stop_tx(struct uart_port *port) |
260 | { | 259 | { |
261 | struct uart_sunsu_port *up = (struct uart_sunsu_port *) port; | 260 | struct uart_sunsu_port *up = (struct uart_sunsu_port *) port; |
262 | 261 | ||
263 | __stop_tx(up); | 262 | __stop_tx(up); |
264 | 263 | ||
265 | /* | 264 | /* |
266 | * We really want to stop the transmitter from sending. | 265 | * We really want to stop the transmitter from sending. |
267 | */ | 266 | */ |
268 | if (up->port.type == PORT_16C950) { | 267 | if (up->port.type == PORT_16C950) { |
269 | up->acr |= UART_ACR_TXDIS; | 268 | up->acr |= UART_ACR_TXDIS; |
270 | serial_icr_write(up, UART_ACR, up->acr); | 269 | serial_icr_write(up, UART_ACR, up->acr); |
271 | } | 270 | } |
272 | } | 271 | } |
273 | 272 | ||
274 | static void sunsu_start_tx(struct uart_port *port) | 273 | static void sunsu_start_tx(struct uart_port *port) |
275 | { | 274 | { |
276 | struct uart_sunsu_port *up = (struct uart_sunsu_port *) port; | 275 | struct uart_sunsu_port *up = (struct uart_sunsu_port *) port; |
277 | 276 | ||
278 | if (!(up->ier & UART_IER_THRI)) { | 277 | if (!(up->ier & UART_IER_THRI)) { |
279 | up->ier |= UART_IER_THRI; | 278 | up->ier |= UART_IER_THRI; |
280 | serial_out(up, UART_IER, up->ier); | 279 | serial_out(up, UART_IER, up->ier); |
281 | } | 280 | } |
282 | 281 | ||
283 | /* | 282 | /* |
284 | * Re-enable the transmitter if we disabled it. | 283 | * Re-enable the transmitter if we disabled it. |
285 | */ | 284 | */ |
286 | if (up->port.type == PORT_16C950 && up->acr & UART_ACR_TXDIS) { | 285 | if (up->port.type == PORT_16C950 && up->acr & UART_ACR_TXDIS) { |
287 | up->acr &= ~UART_ACR_TXDIS; | 286 | up->acr &= ~UART_ACR_TXDIS; |
288 | serial_icr_write(up, UART_ACR, up->acr); | 287 | serial_icr_write(up, UART_ACR, up->acr); |
289 | } | 288 | } |
290 | } | 289 | } |
291 | 290 | ||
292 | static void sunsu_stop_rx(struct uart_port *port) | 291 | static void sunsu_stop_rx(struct uart_port *port) |
293 | { | 292 | { |
294 | struct uart_sunsu_port *up = (struct uart_sunsu_port *) port; | 293 | struct uart_sunsu_port *up = (struct uart_sunsu_port *) port; |
295 | 294 | ||
296 | up->ier &= ~UART_IER_RLSI; | 295 | up->ier &= ~UART_IER_RLSI; |
297 | up->port.read_status_mask &= ~UART_LSR_DR; | 296 | up->port.read_status_mask &= ~UART_LSR_DR; |
298 | serial_out(up, UART_IER, up->ier); | 297 | serial_out(up, UART_IER, up->ier); |
299 | } | 298 | } |
300 | 299 | ||
301 | static void sunsu_enable_ms(struct uart_port *port) | 300 | static void sunsu_enable_ms(struct uart_port *port) |
302 | { | 301 | { |
303 | struct uart_sunsu_port *up = (struct uart_sunsu_port *) port; | 302 | struct uart_sunsu_port *up = (struct uart_sunsu_port *) port; |
304 | unsigned long flags; | 303 | unsigned long flags; |
305 | 304 | ||
306 | spin_lock_irqsave(&up->port.lock, flags); | 305 | spin_lock_irqsave(&up->port.lock, flags); |
307 | up->ier |= UART_IER_MSI; | 306 | up->ier |= UART_IER_MSI; |
308 | serial_out(up, UART_IER, up->ier); | 307 | serial_out(up, UART_IER, up->ier); |
309 | spin_unlock_irqrestore(&up->port.lock, flags); | 308 | spin_unlock_irqrestore(&up->port.lock, flags); |
310 | } | 309 | } |
311 | 310 | ||
312 | static struct tty_struct * | 311 | static struct tty_struct * |
313 | receive_chars(struct uart_sunsu_port *up, unsigned char *status) | 312 | receive_chars(struct uart_sunsu_port *up, unsigned char *status) |
314 | { | 313 | { |
315 | struct tty_struct *tty = up->port.state->port.tty; | 314 | struct tty_struct *tty = up->port.state->port.tty; |
316 | unsigned char ch, flag; | 315 | unsigned char ch, flag; |
317 | int max_count = 256; | 316 | int max_count = 256; |
318 | int saw_console_brk = 0; | 317 | int saw_console_brk = 0; |
319 | 318 | ||
320 | do { | 319 | do { |
321 | ch = serial_inp(up, UART_RX); | 320 | ch = serial_inp(up, UART_RX); |
322 | flag = TTY_NORMAL; | 321 | flag = TTY_NORMAL; |
323 | up->port.icount.rx++; | 322 | up->port.icount.rx++; |
324 | 323 | ||
325 | if (unlikely(*status & (UART_LSR_BI | UART_LSR_PE | | 324 | if (unlikely(*status & (UART_LSR_BI | UART_LSR_PE | |
326 | UART_LSR_FE | UART_LSR_OE))) { | 325 | UART_LSR_FE | UART_LSR_OE))) { |
327 | /* | 326 | /* |
328 | * For statistics only | 327 | * For statistics only |
329 | */ | 328 | */ |
330 | if (*status & UART_LSR_BI) { | 329 | if (*status & UART_LSR_BI) { |
331 | *status &= ~(UART_LSR_FE | UART_LSR_PE); | 330 | *status &= ~(UART_LSR_FE | UART_LSR_PE); |
332 | up->port.icount.brk++; | 331 | up->port.icount.brk++; |
333 | if (up->port.cons != NULL && | 332 | if (up->port.cons != NULL && |
334 | up->port.line == up->port.cons->index) | 333 | up->port.line == up->port.cons->index) |
335 | saw_console_brk = 1; | 334 | saw_console_brk = 1; |
336 | /* | 335 | /* |
337 | * We do the SysRQ and SAK checking | 336 | * We do the SysRQ and SAK checking |
338 | * here because otherwise the break | 337 | * here because otherwise the break |
339 | * may get masked by ignore_status_mask | 338 | * may get masked by ignore_status_mask |
340 | * or read_status_mask. | 339 | * or read_status_mask. |
341 | */ | 340 | */ |
342 | if (uart_handle_break(&up->port)) | 341 | if (uart_handle_break(&up->port)) |
343 | goto ignore_char; | 342 | goto ignore_char; |
344 | } else if (*status & UART_LSR_PE) | 343 | } else if (*status & UART_LSR_PE) |
345 | up->port.icount.parity++; | 344 | up->port.icount.parity++; |
346 | else if (*status & UART_LSR_FE) | 345 | else if (*status & UART_LSR_FE) |
347 | up->port.icount.frame++; | 346 | up->port.icount.frame++; |
348 | if (*status & UART_LSR_OE) | 347 | if (*status & UART_LSR_OE) |
349 | up->port.icount.overrun++; | 348 | up->port.icount.overrun++; |
350 | 349 | ||
351 | /* | 350 | /* |
352 | * Mask off conditions which should be ingored. | 351 | * Mask off conditions which should be ingored. |
353 | */ | 352 | */ |
354 | *status &= up->port.read_status_mask; | 353 | *status &= up->port.read_status_mask; |
355 | 354 | ||
356 | if (up->port.cons != NULL && | 355 | if (up->port.cons != NULL && |
357 | up->port.line == up->port.cons->index) { | 356 | up->port.line == up->port.cons->index) { |
358 | /* Recover the break flag from console xmit */ | 357 | /* Recover the break flag from console xmit */ |
359 | *status |= up->lsr_break_flag; | 358 | *status |= up->lsr_break_flag; |
360 | up->lsr_break_flag = 0; | 359 | up->lsr_break_flag = 0; |
361 | } | 360 | } |
362 | 361 | ||
363 | if (*status & UART_LSR_BI) { | 362 | if (*status & UART_LSR_BI) { |
364 | flag = TTY_BREAK; | 363 | flag = TTY_BREAK; |
365 | } else if (*status & UART_LSR_PE) | 364 | } else if (*status & UART_LSR_PE) |
366 | flag = TTY_PARITY; | 365 | flag = TTY_PARITY; |
367 | else if (*status & UART_LSR_FE) | 366 | else if (*status & UART_LSR_FE) |
368 | flag = TTY_FRAME; | 367 | flag = TTY_FRAME; |
369 | } | 368 | } |
370 | if (uart_handle_sysrq_char(&up->port, ch)) | 369 | if (uart_handle_sysrq_char(&up->port, ch)) |
371 | goto ignore_char; | 370 | goto ignore_char; |
372 | if ((*status & up->port.ignore_status_mask) == 0) | 371 | if ((*status & up->port.ignore_status_mask) == 0) |
373 | tty_insert_flip_char(tty, ch, flag); | 372 | tty_insert_flip_char(tty, ch, flag); |
374 | if (*status & UART_LSR_OE) | 373 | if (*status & UART_LSR_OE) |
375 | /* | 374 | /* |
376 | * Overrun is special, since it's reported | 375 | * Overrun is special, since it's reported |
377 | * immediately, and doesn't affect the current | 376 | * immediately, and doesn't affect the current |
378 | * character. | 377 | * character. |
379 | */ | 378 | */ |
380 | tty_insert_flip_char(tty, 0, TTY_OVERRUN); | 379 | tty_insert_flip_char(tty, 0, TTY_OVERRUN); |
381 | ignore_char: | 380 | ignore_char: |
382 | *status = serial_inp(up, UART_LSR); | 381 | *status = serial_inp(up, UART_LSR); |
383 | } while ((*status & UART_LSR_DR) && (max_count-- > 0)); | 382 | } while ((*status & UART_LSR_DR) && (max_count-- > 0)); |
384 | 383 | ||
385 | if (saw_console_brk) | 384 | if (saw_console_brk) |
386 | sun_do_break(); | 385 | sun_do_break(); |
387 | 386 | ||
388 | return tty; | 387 | return tty; |
389 | } | 388 | } |
390 | 389 | ||
391 | static void transmit_chars(struct uart_sunsu_port *up) | 390 | static void transmit_chars(struct uart_sunsu_port *up) |
392 | { | 391 | { |
393 | struct circ_buf *xmit = &up->port.state->xmit; | 392 | struct circ_buf *xmit = &up->port.state->xmit; |
394 | int count; | 393 | int count; |
395 | 394 | ||
396 | if (up->port.x_char) { | 395 | if (up->port.x_char) { |
397 | serial_outp(up, UART_TX, up->port.x_char); | 396 | serial_outp(up, UART_TX, up->port.x_char); |
398 | up->port.icount.tx++; | 397 | up->port.icount.tx++; |
399 | up->port.x_char = 0; | 398 | up->port.x_char = 0; |
400 | return; | 399 | return; |
401 | } | 400 | } |
402 | if (uart_tx_stopped(&up->port)) { | 401 | if (uart_tx_stopped(&up->port)) { |
403 | sunsu_stop_tx(&up->port); | 402 | sunsu_stop_tx(&up->port); |
404 | return; | 403 | return; |
405 | } | 404 | } |
406 | if (uart_circ_empty(xmit)) { | 405 | if (uart_circ_empty(xmit)) { |
407 | __stop_tx(up); | 406 | __stop_tx(up); |
408 | return; | 407 | return; |
409 | } | 408 | } |
410 | 409 | ||
411 | count = up->port.fifosize; | 410 | count = up->port.fifosize; |
412 | do { | 411 | do { |
413 | serial_out(up, UART_TX, xmit->buf[xmit->tail]); | 412 | serial_out(up, UART_TX, xmit->buf[xmit->tail]); |
414 | xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); | 413 | xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); |
415 | up->port.icount.tx++; | 414 | up->port.icount.tx++; |
416 | if (uart_circ_empty(xmit)) | 415 | if (uart_circ_empty(xmit)) |
417 | break; | 416 | break; |
418 | } while (--count > 0); | 417 | } while (--count > 0); |
419 | 418 | ||
420 | if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) | 419 | if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) |
421 | uart_write_wakeup(&up->port); | 420 | uart_write_wakeup(&up->port); |
422 | 421 | ||
423 | if (uart_circ_empty(xmit)) | 422 | if (uart_circ_empty(xmit)) |
424 | __stop_tx(up); | 423 | __stop_tx(up); |
425 | } | 424 | } |
426 | 425 | ||
427 | static void check_modem_status(struct uart_sunsu_port *up) | 426 | static void check_modem_status(struct uart_sunsu_port *up) |
428 | { | 427 | { |
429 | int status; | 428 | int status; |
430 | 429 | ||
431 | status = serial_in(up, UART_MSR); | 430 | status = serial_in(up, UART_MSR); |
432 | 431 | ||
433 | if ((status & UART_MSR_ANY_DELTA) == 0) | 432 | if ((status & UART_MSR_ANY_DELTA) == 0) |
434 | return; | 433 | return; |
435 | 434 | ||
436 | if (status & UART_MSR_TERI) | 435 | if (status & UART_MSR_TERI) |
437 | up->port.icount.rng++; | 436 | up->port.icount.rng++; |
438 | if (status & UART_MSR_DDSR) | 437 | if (status & UART_MSR_DDSR) |
439 | up->port.icount.dsr++; | 438 | up->port.icount.dsr++; |
440 | if (status & UART_MSR_DDCD) | 439 | if (status & UART_MSR_DDCD) |
441 | uart_handle_dcd_change(&up->port, status & UART_MSR_DCD); | 440 | uart_handle_dcd_change(&up->port, status & UART_MSR_DCD); |
442 | if (status & UART_MSR_DCTS) | 441 | if (status & UART_MSR_DCTS) |
443 | uart_handle_cts_change(&up->port, status & UART_MSR_CTS); | 442 | uart_handle_cts_change(&up->port, status & UART_MSR_CTS); |
444 | 443 | ||
445 | wake_up_interruptible(&up->port.state->port.delta_msr_wait); | 444 | wake_up_interruptible(&up->port.state->port.delta_msr_wait); |
446 | } | 445 | } |
447 | 446 | ||
448 | static irqreturn_t sunsu_serial_interrupt(int irq, void *dev_id) | 447 | static irqreturn_t sunsu_serial_interrupt(int irq, void *dev_id) |
449 | { | 448 | { |
450 | struct uart_sunsu_port *up = dev_id; | 449 | struct uart_sunsu_port *up = dev_id; |
451 | unsigned long flags; | 450 | unsigned long flags; |
452 | unsigned char status; | 451 | unsigned char status; |
453 | 452 | ||
454 | spin_lock_irqsave(&up->port.lock, flags); | 453 | spin_lock_irqsave(&up->port.lock, flags); |
455 | 454 | ||
456 | do { | 455 | do { |
457 | struct tty_struct *tty; | 456 | struct tty_struct *tty; |
458 | 457 | ||
459 | status = serial_inp(up, UART_LSR); | 458 | status = serial_inp(up, UART_LSR); |
460 | tty = NULL; | 459 | tty = NULL; |
461 | if (status & UART_LSR_DR) | 460 | if (status & UART_LSR_DR) |
462 | tty = receive_chars(up, &status); | 461 | tty = receive_chars(up, &status); |
463 | check_modem_status(up); | 462 | check_modem_status(up); |
464 | if (status & UART_LSR_THRE) | 463 | if (status & UART_LSR_THRE) |
465 | transmit_chars(up); | 464 | transmit_chars(up); |
466 | 465 | ||
467 | spin_unlock_irqrestore(&up->port.lock, flags); | 466 | spin_unlock_irqrestore(&up->port.lock, flags); |
468 | 467 | ||
469 | if (tty) | 468 | if (tty) |
470 | tty_flip_buffer_push(tty); | 469 | tty_flip_buffer_push(tty); |
471 | 470 | ||
472 | spin_lock_irqsave(&up->port.lock, flags); | 471 | spin_lock_irqsave(&up->port.lock, flags); |
473 | 472 | ||
474 | } while (!(serial_in(up, UART_IIR) & UART_IIR_NO_INT)); | 473 | } while (!(serial_in(up, UART_IIR) & UART_IIR_NO_INT)); |
475 | 474 | ||
476 | spin_unlock_irqrestore(&up->port.lock, flags); | 475 | spin_unlock_irqrestore(&up->port.lock, flags); |
477 | 476 | ||
478 | return IRQ_HANDLED; | 477 | return IRQ_HANDLED; |
479 | } | 478 | } |
480 | 479 | ||
481 | /* Separate interrupt handling path for keyboard/mouse ports. */ | 480 | /* Separate interrupt handling path for keyboard/mouse ports. */ |
482 | 481 | ||
483 | static void | 482 | static void |
484 | sunsu_change_speed(struct uart_port *port, unsigned int cflag, | 483 | sunsu_change_speed(struct uart_port *port, unsigned int cflag, |
485 | unsigned int iflag, unsigned int quot); | 484 | unsigned int iflag, unsigned int quot); |
486 | 485 | ||
487 | static void sunsu_change_mouse_baud(struct uart_sunsu_port *up) | 486 | static void sunsu_change_mouse_baud(struct uart_sunsu_port *up) |
488 | { | 487 | { |
489 | unsigned int cur_cflag = up->cflag; | 488 | unsigned int cur_cflag = up->cflag; |
490 | int quot, new_baud; | 489 | int quot, new_baud; |
491 | 490 | ||
492 | up->cflag &= ~CBAUD; | 491 | up->cflag &= ~CBAUD; |
493 | up->cflag |= suncore_mouse_baud_cflag_next(cur_cflag, &new_baud); | 492 | up->cflag |= suncore_mouse_baud_cflag_next(cur_cflag, &new_baud); |
494 | 493 | ||
495 | quot = up->port.uartclk / (16 * new_baud); | 494 | quot = up->port.uartclk / (16 * new_baud); |
496 | 495 | ||
497 | sunsu_change_speed(&up->port, up->cflag, 0, quot); | 496 | sunsu_change_speed(&up->port, up->cflag, 0, quot); |
498 | } | 497 | } |
499 | 498 | ||
500 | static void receive_kbd_ms_chars(struct uart_sunsu_port *up, int is_break) | 499 | static void receive_kbd_ms_chars(struct uart_sunsu_port *up, int is_break) |
501 | { | 500 | { |
502 | do { | 501 | do { |
503 | unsigned char ch = serial_inp(up, UART_RX); | 502 | unsigned char ch = serial_inp(up, UART_RX); |
504 | 503 | ||
505 | /* Stop-A is handled by drivers/char/keyboard.c now. */ | 504 | /* Stop-A is handled by drivers/char/keyboard.c now. */ |
506 | if (up->su_type == SU_PORT_KBD) { | 505 | if (up->su_type == SU_PORT_KBD) { |
507 | #ifdef CONFIG_SERIO | 506 | #ifdef CONFIG_SERIO |
508 | serio_interrupt(&up->serio, ch, 0); | 507 | serio_interrupt(&up->serio, ch, 0); |
509 | #endif | 508 | #endif |
510 | } else if (up->su_type == SU_PORT_MS) { | 509 | } else if (up->su_type == SU_PORT_MS) { |
511 | int ret = suncore_mouse_baud_detection(ch, is_break); | 510 | int ret = suncore_mouse_baud_detection(ch, is_break); |
512 | 511 | ||
513 | switch (ret) { | 512 | switch (ret) { |
514 | case 2: | 513 | case 2: |
515 | sunsu_change_mouse_baud(up); | 514 | sunsu_change_mouse_baud(up); |
516 | /* fallthru */ | 515 | /* fallthru */ |
517 | case 1: | 516 | case 1: |
518 | break; | 517 | break; |
519 | 518 | ||
520 | case 0: | 519 | case 0: |
521 | #ifdef CONFIG_SERIO | 520 | #ifdef CONFIG_SERIO |
522 | serio_interrupt(&up->serio, ch, 0); | 521 | serio_interrupt(&up->serio, ch, 0); |
523 | #endif | 522 | #endif |
524 | break; | 523 | break; |
525 | }; | 524 | }; |
526 | } | 525 | } |
527 | } while (serial_in(up, UART_LSR) & UART_LSR_DR); | 526 | } while (serial_in(up, UART_LSR) & UART_LSR_DR); |
528 | } | 527 | } |
529 | 528 | ||
530 | static irqreturn_t sunsu_kbd_ms_interrupt(int irq, void *dev_id) | 529 | static irqreturn_t sunsu_kbd_ms_interrupt(int irq, void *dev_id) |
531 | { | 530 | { |
532 | struct uart_sunsu_port *up = dev_id; | 531 | struct uart_sunsu_port *up = dev_id; |
533 | 532 | ||
534 | if (!(serial_in(up, UART_IIR) & UART_IIR_NO_INT)) { | 533 | if (!(serial_in(up, UART_IIR) & UART_IIR_NO_INT)) { |
535 | unsigned char status = serial_inp(up, UART_LSR); | 534 | unsigned char status = serial_inp(up, UART_LSR); |
536 | 535 | ||
537 | if ((status & UART_LSR_DR) || (status & UART_LSR_BI)) | 536 | if ((status & UART_LSR_DR) || (status & UART_LSR_BI)) |
538 | receive_kbd_ms_chars(up, (status & UART_LSR_BI) != 0); | 537 | receive_kbd_ms_chars(up, (status & UART_LSR_BI) != 0); |
539 | } | 538 | } |
540 | 539 | ||
541 | return IRQ_HANDLED; | 540 | return IRQ_HANDLED; |
542 | } | 541 | } |
543 | 542 | ||
544 | static unsigned int sunsu_tx_empty(struct uart_port *port) | 543 | static unsigned int sunsu_tx_empty(struct uart_port *port) |
545 | { | 544 | { |
546 | struct uart_sunsu_port *up = (struct uart_sunsu_port *) port; | 545 | struct uart_sunsu_port *up = (struct uart_sunsu_port *) port; |
547 | unsigned long flags; | 546 | unsigned long flags; |
548 | unsigned int ret; | 547 | unsigned int ret; |
549 | 548 | ||
550 | spin_lock_irqsave(&up->port.lock, flags); | 549 | spin_lock_irqsave(&up->port.lock, flags); |
551 | ret = serial_in(up, UART_LSR) & UART_LSR_TEMT ? TIOCSER_TEMT : 0; | 550 | ret = serial_in(up, UART_LSR) & UART_LSR_TEMT ? TIOCSER_TEMT : 0; |
552 | spin_unlock_irqrestore(&up->port.lock, flags); | 551 | spin_unlock_irqrestore(&up->port.lock, flags); |
553 | 552 | ||
554 | return ret; | 553 | return ret; |
555 | } | 554 | } |
556 | 555 | ||
557 | static unsigned int sunsu_get_mctrl(struct uart_port *port) | 556 | static unsigned int sunsu_get_mctrl(struct uart_port *port) |
558 | { | 557 | { |
559 | struct uart_sunsu_port *up = (struct uart_sunsu_port *) port; | 558 | struct uart_sunsu_port *up = (struct uart_sunsu_port *) port; |
560 | unsigned char status; | 559 | unsigned char status; |
561 | unsigned int ret; | 560 | unsigned int ret; |
562 | 561 | ||
563 | status = serial_in(up, UART_MSR); | 562 | status = serial_in(up, UART_MSR); |
564 | 563 | ||
565 | ret = 0; | 564 | ret = 0; |
566 | if (status & UART_MSR_DCD) | 565 | if (status & UART_MSR_DCD) |
567 | ret |= TIOCM_CAR; | 566 | ret |= TIOCM_CAR; |
568 | if (status & UART_MSR_RI) | 567 | if (status & UART_MSR_RI) |
569 | ret |= TIOCM_RNG; | 568 | ret |= TIOCM_RNG; |
570 | if (status & UART_MSR_DSR) | 569 | if (status & UART_MSR_DSR) |
571 | ret |= TIOCM_DSR; | 570 | ret |= TIOCM_DSR; |
572 | if (status & UART_MSR_CTS) | 571 | if (status & UART_MSR_CTS) |
573 | ret |= TIOCM_CTS; | 572 | ret |= TIOCM_CTS; |
574 | return ret; | 573 | return ret; |
575 | } | 574 | } |
576 | 575 | ||
577 | static void sunsu_set_mctrl(struct uart_port *port, unsigned int mctrl) | 576 | static void sunsu_set_mctrl(struct uart_port *port, unsigned int mctrl) |
578 | { | 577 | { |
579 | struct uart_sunsu_port *up = (struct uart_sunsu_port *) port; | 578 | struct uart_sunsu_port *up = (struct uart_sunsu_port *) port; |
580 | unsigned char mcr = 0; | 579 | unsigned char mcr = 0; |
581 | 580 | ||
582 | if (mctrl & TIOCM_RTS) | 581 | if (mctrl & TIOCM_RTS) |
583 | mcr |= UART_MCR_RTS; | 582 | mcr |= UART_MCR_RTS; |
584 | if (mctrl & TIOCM_DTR) | 583 | if (mctrl & TIOCM_DTR) |
585 | mcr |= UART_MCR_DTR; | 584 | mcr |= UART_MCR_DTR; |
586 | if (mctrl & TIOCM_OUT1) | 585 | if (mctrl & TIOCM_OUT1) |
587 | mcr |= UART_MCR_OUT1; | 586 | mcr |= UART_MCR_OUT1; |
588 | if (mctrl & TIOCM_OUT2) | 587 | if (mctrl & TIOCM_OUT2) |
589 | mcr |= UART_MCR_OUT2; | 588 | mcr |= UART_MCR_OUT2; |
590 | if (mctrl & TIOCM_LOOP) | 589 | if (mctrl & TIOCM_LOOP) |
591 | mcr |= UART_MCR_LOOP; | 590 | mcr |= UART_MCR_LOOP; |
592 | 591 | ||
593 | serial_out(up, UART_MCR, mcr); | 592 | serial_out(up, UART_MCR, mcr); |
594 | } | 593 | } |
595 | 594 | ||
596 | static void sunsu_break_ctl(struct uart_port *port, int break_state) | 595 | static void sunsu_break_ctl(struct uart_port *port, int break_state) |
597 | { | 596 | { |
598 | struct uart_sunsu_port *up = (struct uart_sunsu_port *) port; | 597 | struct uart_sunsu_port *up = (struct uart_sunsu_port *) port; |
599 | unsigned long flags; | 598 | unsigned long flags; |
600 | 599 | ||
601 | spin_lock_irqsave(&up->port.lock, flags); | 600 | spin_lock_irqsave(&up->port.lock, flags); |
602 | if (break_state == -1) | 601 | if (break_state == -1) |
603 | up->lcr |= UART_LCR_SBC; | 602 | up->lcr |= UART_LCR_SBC; |
604 | else | 603 | else |
605 | up->lcr &= ~UART_LCR_SBC; | 604 | up->lcr &= ~UART_LCR_SBC; |
606 | serial_out(up, UART_LCR, up->lcr); | 605 | serial_out(up, UART_LCR, up->lcr); |
607 | spin_unlock_irqrestore(&up->port.lock, flags); | 606 | spin_unlock_irqrestore(&up->port.lock, flags); |
608 | } | 607 | } |
609 | 608 | ||
610 | static int sunsu_startup(struct uart_port *port) | 609 | static int sunsu_startup(struct uart_port *port) |
611 | { | 610 | { |
612 | struct uart_sunsu_port *up = (struct uart_sunsu_port *) port; | 611 | struct uart_sunsu_port *up = (struct uart_sunsu_port *) port; |
613 | unsigned long flags; | 612 | unsigned long flags; |
614 | int retval; | 613 | int retval; |
615 | 614 | ||
616 | if (up->port.type == PORT_16C950) { | 615 | if (up->port.type == PORT_16C950) { |
617 | /* Wake up and initialize UART */ | 616 | /* Wake up and initialize UART */ |
618 | up->acr = 0; | 617 | up->acr = 0; |
619 | serial_outp(up, UART_LCR, 0xBF); | 618 | serial_outp(up, UART_LCR, 0xBF); |
620 | serial_outp(up, UART_EFR, UART_EFR_ECB); | 619 | serial_outp(up, UART_EFR, UART_EFR_ECB); |
621 | serial_outp(up, UART_IER, 0); | 620 | serial_outp(up, UART_IER, 0); |
622 | serial_outp(up, UART_LCR, 0); | 621 | serial_outp(up, UART_LCR, 0); |
623 | serial_icr_write(up, UART_CSR, 0); /* Reset the UART */ | 622 | serial_icr_write(up, UART_CSR, 0); /* Reset the UART */ |
624 | serial_outp(up, UART_LCR, 0xBF); | 623 | serial_outp(up, UART_LCR, 0xBF); |
625 | serial_outp(up, UART_EFR, UART_EFR_ECB); | 624 | serial_outp(up, UART_EFR, UART_EFR_ECB); |
626 | serial_outp(up, UART_LCR, 0); | 625 | serial_outp(up, UART_LCR, 0); |
627 | } | 626 | } |
628 | 627 | ||
629 | #ifdef CONFIG_SERIAL_8250_RSA | 628 | #ifdef CONFIG_SERIAL_8250_RSA |
630 | /* | 629 | /* |
631 | * If this is an RSA port, see if we can kick it up to the | 630 | * If this is an RSA port, see if we can kick it up to the |
632 | * higher speed clock. | 631 | * higher speed clock. |
633 | */ | 632 | */ |
634 | enable_rsa(up); | 633 | enable_rsa(up); |
635 | #endif | 634 | #endif |
636 | 635 | ||
637 | /* | 636 | /* |
638 | * Clear the FIFO buffers and disable them. | 637 | * Clear the FIFO buffers and disable them. |
639 | * (they will be reenabled in set_termios()) | 638 | * (they will be reenabled in set_termios()) |
640 | */ | 639 | */ |
641 | if (uart_config[up->port.type].flags & UART_CLEAR_FIFO) { | 640 | if (uart_config[up->port.type].flags & UART_CLEAR_FIFO) { |
642 | serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO); | 641 | serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO); |
643 | serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO | | 642 | serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO | |
644 | UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT); | 643 | UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT); |
645 | serial_outp(up, UART_FCR, 0); | 644 | serial_outp(up, UART_FCR, 0); |
646 | } | 645 | } |
647 | 646 | ||
648 | /* | 647 | /* |
649 | * Clear the interrupt registers. | 648 | * Clear the interrupt registers. |
650 | */ | 649 | */ |
651 | (void) serial_inp(up, UART_LSR); | 650 | (void) serial_inp(up, UART_LSR); |
652 | (void) serial_inp(up, UART_RX); | 651 | (void) serial_inp(up, UART_RX); |
653 | (void) serial_inp(up, UART_IIR); | 652 | (void) serial_inp(up, UART_IIR); |
654 | (void) serial_inp(up, UART_MSR); | 653 | (void) serial_inp(up, UART_MSR); |
655 | 654 | ||
656 | /* | 655 | /* |
657 | * At this point, there's no way the LSR could still be 0xff; | 656 | * At this point, there's no way the LSR could still be 0xff; |
658 | * if it is, then bail out, because there's likely no UART | 657 | * if it is, then bail out, because there's likely no UART |
659 | * here. | 658 | * here. |
660 | */ | 659 | */ |
661 | if (!(up->port.flags & UPF_BUGGY_UART) && | 660 | if (!(up->port.flags & UPF_BUGGY_UART) && |
662 | (serial_inp(up, UART_LSR) == 0xff)) { | 661 | (serial_inp(up, UART_LSR) == 0xff)) { |
663 | printk("ttyS%d: LSR safety check engaged!\n", up->port.line); | 662 | printk("ttyS%d: LSR safety check engaged!\n", up->port.line); |
664 | return -ENODEV; | 663 | return -ENODEV; |
665 | } | 664 | } |
666 | 665 | ||
667 | if (up->su_type != SU_PORT_PORT) { | 666 | if (up->su_type != SU_PORT_PORT) { |
668 | retval = request_irq(up->port.irq, sunsu_kbd_ms_interrupt, | 667 | retval = request_irq(up->port.irq, sunsu_kbd_ms_interrupt, |
669 | IRQF_SHARED, su_typev[up->su_type], up); | 668 | IRQF_SHARED, su_typev[up->su_type], up); |
670 | } else { | 669 | } else { |
671 | retval = request_irq(up->port.irq, sunsu_serial_interrupt, | 670 | retval = request_irq(up->port.irq, sunsu_serial_interrupt, |
672 | IRQF_SHARED, su_typev[up->su_type], up); | 671 | IRQF_SHARED, su_typev[up->su_type], up); |
673 | } | 672 | } |
674 | if (retval) { | 673 | if (retval) { |
675 | printk("su: Cannot register IRQ %d\n", up->port.irq); | 674 | printk("su: Cannot register IRQ %d\n", up->port.irq); |
676 | return retval; | 675 | return retval; |
677 | } | 676 | } |
678 | 677 | ||
679 | /* | 678 | /* |
680 | * Now, initialize the UART | 679 | * Now, initialize the UART |
681 | */ | 680 | */ |
682 | serial_outp(up, UART_LCR, UART_LCR_WLEN8); | 681 | serial_outp(up, UART_LCR, UART_LCR_WLEN8); |
683 | 682 | ||
684 | spin_lock_irqsave(&up->port.lock, flags); | 683 | spin_lock_irqsave(&up->port.lock, flags); |
685 | 684 | ||
686 | up->port.mctrl |= TIOCM_OUT2; | 685 | up->port.mctrl |= TIOCM_OUT2; |
687 | 686 | ||
688 | sunsu_set_mctrl(&up->port, up->port.mctrl); | 687 | sunsu_set_mctrl(&up->port, up->port.mctrl); |
689 | spin_unlock_irqrestore(&up->port.lock, flags); | 688 | spin_unlock_irqrestore(&up->port.lock, flags); |
690 | 689 | ||
691 | /* | 690 | /* |
692 | * Finally, enable interrupts. Note: Modem status interrupts | 691 | * Finally, enable interrupts. Note: Modem status interrupts |
693 | * are set via set_termios(), which will be occurring imminently | 692 | * are set via set_termios(), which will be occurring imminently |
694 | * anyway, so we don't enable them here. | 693 | * anyway, so we don't enable them here. |
695 | */ | 694 | */ |
696 | up->ier = UART_IER_RLSI | UART_IER_RDI; | 695 | up->ier = UART_IER_RLSI | UART_IER_RDI; |
697 | serial_outp(up, UART_IER, up->ier); | 696 | serial_outp(up, UART_IER, up->ier); |
698 | 697 | ||
699 | if (up->port.flags & UPF_FOURPORT) { | 698 | if (up->port.flags & UPF_FOURPORT) { |
700 | unsigned int icp; | 699 | unsigned int icp; |
701 | /* | 700 | /* |
702 | * Enable interrupts on the AST Fourport board | 701 | * Enable interrupts on the AST Fourport board |
703 | */ | 702 | */ |
704 | icp = (up->port.iobase & 0xfe0) | 0x01f; | 703 | icp = (up->port.iobase & 0xfe0) | 0x01f; |
705 | outb_p(0x80, icp); | 704 | outb_p(0x80, icp); |
706 | (void) inb_p(icp); | 705 | (void) inb_p(icp); |
707 | } | 706 | } |
708 | 707 | ||
709 | /* | 708 | /* |
710 | * And clear the interrupt registers again for luck. | 709 | * And clear the interrupt registers again for luck. |
711 | */ | 710 | */ |
712 | (void) serial_inp(up, UART_LSR); | 711 | (void) serial_inp(up, UART_LSR); |
713 | (void) serial_inp(up, UART_RX); | 712 | (void) serial_inp(up, UART_RX); |
714 | (void) serial_inp(up, UART_IIR); | 713 | (void) serial_inp(up, UART_IIR); |
715 | (void) serial_inp(up, UART_MSR); | 714 | (void) serial_inp(up, UART_MSR); |
716 | 715 | ||
717 | return 0; | 716 | return 0; |
718 | } | 717 | } |
719 | 718 | ||
720 | static void sunsu_shutdown(struct uart_port *port) | 719 | static void sunsu_shutdown(struct uart_port *port) |
721 | { | 720 | { |
722 | struct uart_sunsu_port *up = (struct uart_sunsu_port *) port; | 721 | struct uart_sunsu_port *up = (struct uart_sunsu_port *) port; |
723 | unsigned long flags; | 722 | unsigned long flags; |
724 | 723 | ||
725 | /* | 724 | /* |
726 | * Disable interrupts from this port | 725 | * Disable interrupts from this port |
727 | */ | 726 | */ |
728 | up->ier = 0; | 727 | up->ier = 0; |
729 | serial_outp(up, UART_IER, 0); | 728 | serial_outp(up, UART_IER, 0); |
730 | 729 | ||
731 | spin_lock_irqsave(&up->port.lock, flags); | 730 | spin_lock_irqsave(&up->port.lock, flags); |
732 | if (up->port.flags & UPF_FOURPORT) { | 731 | if (up->port.flags & UPF_FOURPORT) { |
733 | /* reset interrupts on the AST Fourport board */ | 732 | /* reset interrupts on the AST Fourport board */ |
734 | inb((up->port.iobase & 0xfe0) | 0x1f); | 733 | inb((up->port.iobase & 0xfe0) | 0x1f); |
735 | up->port.mctrl |= TIOCM_OUT1; | 734 | up->port.mctrl |= TIOCM_OUT1; |
736 | } else | 735 | } else |
737 | up->port.mctrl &= ~TIOCM_OUT2; | 736 | up->port.mctrl &= ~TIOCM_OUT2; |
738 | 737 | ||
739 | sunsu_set_mctrl(&up->port, up->port.mctrl); | 738 | sunsu_set_mctrl(&up->port, up->port.mctrl); |
740 | spin_unlock_irqrestore(&up->port.lock, flags); | 739 | spin_unlock_irqrestore(&up->port.lock, flags); |
741 | 740 | ||
742 | /* | 741 | /* |
743 | * Disable break condition and FIFOs | 742 | * Disable break condition and FIFOs |
744 | */ | 743 | */ |
745 | serial_out(up, UART_LCR, serial_inp(up, UART_LCR) & ~UART_LCR_SBC); | 744 | serial_out(up, UART_LCR, serial_inp(up, UART_LCR) & ~UART_LCR_SBC); |
746 | serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO | | 745 | serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO | |
747 | UART_FCR_CLEAR_RCVR | | 746 | UART_FCR_CLEAR_RCVR | |
748 | UART_FCR_CLEAR_XMIT); | 747 | UART_FCR_CLEAR_XMIT); |
749 | serial_outp(up, UART_FCR, 0); | 748 | serial_outp(up, UART_FCR, 0); |
750 | 749 | ||
751 | #ifdef CONFIG_SERIAL_8250_RSA | 750 | #ifdef CONFIG_SERIAL_8250_RSA |
752 | /* | 751 | /* |
753 | * Reset the RSA board back to 115kbps compat mode. | 752 | * Reset the RSA board back to 115kbps compat mode. |
754 | */ | 753 | */ |
755 | disable_rsa(up); | 754 | disable_rsa(up); |
756 | #endif | 755 | #endif |
757 | 756 | ||
758 | /* | 757 | /* |
759 | * Read data port to reset things. | 758 | * Read data port to reset things. |
760 | */ | 759 | */ |
761 | (void) serial_in(up, UART_RX); | 760 | (void) serial_in(up, UART_RX); |
762 | 761 | ||
763 | free_irq(up->port.irq, up); | 762 | free_irq(up->port.irq, up); |
764 | } | 763 | } |
765 | 764 | ||
766 | static void | 765 | static void |
767 | sunsu_change_speed(struct uart_port *port, unsigned int cflag, | 766 | sunsu_change_speed(struct uart_port *port, unsigned int cflag, |
768 | unsigned int iflag, unsigned int quot) | 767 | unsigned int iflag, unsigned int quot) |
769 | { | 768 | { |
770 | struct uart_sunsu_port *up = (struct uart_sunsu_port *) port; | 769 | struct uart_sunsu_port *up = (struct uart_sunsu_port *) port; |
771 | unsigned char cval, fcr = 0; | 770 | unsigned char cval, fcr = 0; |
772 | unsigned long flags; | 771 | unsigned long flags; |
773 | 772 | ||
774 | switch (cflag & CSIZE) { | 773 | switch (cflag & CSIZE) { |
775 | case CS5: | 774 | case CS5: |
776 | cval = 0x00; | 775 | cval = 0x00; |
777 | break; | 776 | break; |
778 | case CS6: | 777 | case CS6: |
779 | cval = 0x01; | 778 | cval = 0x01; |
780 | break; | 779 | break; |
781 | case CS7: | 780 | case CS7: |
782 | cval = 0x02; | 781 | cval = 0x02; |
783 | break; | 782 | break; |
784 | default: | 783 | default: |
785 | case CS8: | 784 | case CS8: |
786 | cval = 0x03; | 785 | cval = 0x03; |
787 | break; | 786 | break; |
788 | } | 787 | } |
789 | 788 | ||
790 | if (cflag & CSTOPB) | 789 | if (cflag & CSTOPB) |
791 | cval |= 0x04; | 790 | cval |= 0x04; |
792 | if (cflag & PARENB) | 791 | if (cflag & PARENB) |
793 | cval |= UART_LCR_PARITY; | 792 | cval |= UART_LCR_PARITY; |
794 | if (!(cflag & PARODD)) | 793 | if (!(cflag & PARODD)) |
795 | cval |= UART_LCR_EPAR; | 794 | cval |= UART_LCR_EPAR; |
796 | #ifdef CMSPAR | 795 | #ifdef CMSPAR |
797 | if (cflag & CMSPAR) | 796 | if (cflag & CMSPAR) |
798 | cval |= UART_LCR_SPAR; | 797 | cval |= UART_LCR_SPAR; |
799 | #endif | 798 | #endif |
800 | 799 | ||
801 | /* | 800 | /* |
802 | * Work around a bug in the Oxford Semiconductor 952 rev B | 801 | * Work around a bug in the Oxford Semiconductor 952 rev B |
803 | * chip which causes it to seriously miscalculate baud rates | 802 | * chip which causes it to seriously miscalculate baud rates |
804 | * when DLL is 0. | 803 | * when DLL is 0. |
805 | */ | 804 | */ |
806 | if ((quot & 0xff) == 0 && up->port.type == PORT_16C950 && | 805 | if ((quot & 0xff) == 0 && up->port.type == PORT_16C950 && |
807 | up->rev == 0x5201) | 806 | up->rev == 0x5201) |
808 | quot ++; | 807 | quot ++; |
809 | 808 | ||
810 | if (uart_config[up->port.type].flags & UART_USE_FIFO) { | 809 | if (uart_config[up->port.type].flags & UART_USE_FIFO) { |
811 | if ((up->port.uartclk / quot) < (2400 * 16)) | 810 | if ((up->port.uartclk / quot) < (2400 * 16)) |
812 | fcr = UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_1; | 811 | fcr = UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_1; |
813 | #ifdef CONFIG_SERIAL_8250_RSA | 812 | #ifdef CONFIG_SERIAL_8250_RSA |
814 | else if (up->port.type == PORT_RSA) | 813 | else if (up->port.type == PORT_RSA) |
815 | fcr = UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_14; | 814 | fcr = UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_14; |
816 | #endif | 815 | #endif |
817 | else | 816 | else |
818 | fcr = UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_8; | 817 | fcr = UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_8; |
819 | } | 818 | } |
820 | if (up->port.type == PORT_16750) | 819 | if (up->port.type == PORT_16750) |
821 | fcr |= UART_FCR7_64BYTE; | 820 | fcr |= UART_FCR7_64BYTE; |
822 | 821 | ||
823 | /* | 822 | /* |
824 | * Ok, we're now changing the port state. Do it with | 823 | * Ok, we're now changing the port state. Do it with |
825 | * interrupts disabled. | 824 | * interrupts disabled. |
826 | */ | 825 | */ |
827 | spin_lock_irqsave(&up->port.lock, flags); | 826 | spin_lock_irqsave(&up->port.lock, flags); |
828 | 827 | ||
829 | /* | 828 | /* |
830 | * Update the per-port timeout. | 829 | * Update the per-port timeout. |
831 | */ | 830 | */ |
832 | uart_update_timeout(port, cflag, (port->uartclk / (16 * quot))); | 831 | uart_update_timeout(port, cflag, (port->uartclk / (16 * quot))); |
833 | 832 | ||
834 | up->port.read_status_mask = UART_LSR_OE | UART_LSR_THRE | UART_LSR_DR; | 833 | up->port.read_status_mask = UART_LSR_OE | UART_LSR_THRE | UART_LSR_DR; |
835 | if (iflag & INPCK) | 834 | if (iflag & INPCK) |
836 | up->port.read_status_mask |= UART_LSR_FE | UART_LSR_PE; | 835 | up->port.read_status_mask |= UART_LSR_FE | UART_LSR_PE; |
837 | if (iflag & (BRKINT | PARMRK)) | 836 | if (iflag & (BRKINT | PARMRK)) |
838 | up->port.read_status_mask |= UART_LSR_BI; | 837 | up->port.read_status_mask |= UART_LSR_BI; |
839 | 838 | ||
840 | /* | 839 | /* |
841 | * Characteres to ignore | 840 | * Characteres to ignore |
842 | */ | 841 | */ |
843 | up->port.ignore_status_mask = 0; | 842 | up->port.ignore_status_mask = 0; |
844 | if (iflag & IGNPAR) | 843 | if (iflag & IGNPAR) |
845 | up->port.ignore_status_mask |= UART_LSR_PE | UART_LSR_FE; | 844 | up->port.ignore_status_mask |= UART_LSR_PE | UART_LSR_FE; |
846 | if (iflag & IGNBRK) { | 845 | if (iflag & IGNBRK) { |
847 | up->port.ignore_status_mask |= UART_LSR_BI; | 846 | up->port.ignore_status_mask |= UART_LSR_BI; |
848 | /* | 847 | /* |
849 | * If we're ignoring parity and break indicators, | 848 | * If we're ignoring parity and break indicators, |
850 | * ignore overruns too (for real raw support). | 849 | * ignore overruns too (for real raw support). |
851 | */ | 850 | */ |
852 | if (iflag & IGNPAR) | 851 | if (iflag & IGNPAR) |
853 | up->port.ignore_status_mask |= UART_LSR_OE; | 852 | up->port.ignore_status_mask |= UART_LSR_OE; |
854 | } | 853 | } |
855 | 854 | ||
856 | /* | 855 | /* |
857 | * ignore all characters if CREAD is not set | 856 | * ignore all characters if CREAD is not set |
858 | */ | 857 | */ |
859 | if ((cflag & CREAD) == 0) | 858 | if ((cflag & CREAD) == 0) |
860 | up->port.ignore_status_mask |= UART_LSR_DR; | 859 | up->port.ignore_status_mask |= UART_LSR_DR; |
861 | 860 | ||
862 | /* | 861 | /* |
863 | * CTS flow control flag and modem status interrupts | 862 | * CTS flow control flag and modem status interrupts |
864 | */ | 863 | */ |
865 | up->ier &= ~UART_IER_MSI; | 864 | up->ier &= ~UART_IER_MSI; |
866 | if (UART_ENABLE_MS(&up->port, cflag)) | 865 | if (UART_ENABLE_MS(&up->port, cflag)) |
867 | up->ier |= UART_IER_MSI; | 866 | up->ier |= UART_IER_MSI; |
868 | 867 | ||
869 | serial_out(up, UART_IER, up->ier); | 868 | serial_out(up, UART_IER, up->ier); |
870 | 869 | ||
871 | if (uart_config[up->port.type].flags & UART_STARTECH) { | 870 | if (uart_config[up->port.type].flags & UART_STARTECH) { |
872 | serial_outp(up, UART_LCR, 0xBF); | 871 | serial_outp(up, UART_LCR, 0xBF); |
873 | serial_outp(up, UART_EFR, cflag & CRTSCTS ? UART_EFR_CTS :0); | 872 | serial_outp(up, UART_EFR, cflag & CRTSCTS ? UART_EFR_CTS :0); |
874 | } | 873 | } |
875 | serial_outp(up, UART_LCR, cval | UART_LCR_DLAB);/* set DLAB */ | 874 | serial_outp(up, UART_LCR, cval | UART_LCR_DLAB);/* set DLAB */ |
876 | serial_outp(up, UART_DLL, quot & 0xff); /* LS of divisor */ | 875 | serial_outp(up, UART_DLL, quot & 0xff); /* LS of divisor */ |
877 | serial_outp(up, UART_DLM, quot >> 8); /* MS of divisor */ | 876 | serial_outp(up, UART_DLM, quot >> 8); /* MS of divisor */ |
878 | if (up->port.type == PORT_16750) | 877 | if (up->port.type == PORT_16750) |
879 | serial_outp(up, UART_FCR, fcr); /* set fcr */ | 878 | serial_outp(up, UART_FCR, fcr); /* set fcr */ |
880 | serial_outp(up, UART_LCR, cval); /* reset DLAB */ | 879 | serial_outp(up, UART_LCR, cval); /* reset DLAB */ |
881 | up->lcr = cval; /* Save LCR */ | 880 | up->lcr = cval; /* Save LCR */ |
882 | if (up->port.type != PORT_16750) { | 881 | if (up->port.type != PORT_16750) { |
883 | if (fcr & UART_FCR_ENABLE_FIFO) { | 882 | if (fcr & UART_FCR_ENABLE_FIFO) { |
884 | /* emulated UARTs (Lucent Venus 167x) need two steps */ | 883 | /* emulated UARTs (Lucent Venus 167x) need two steps */ |
885 | serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO); | 884 | serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO); |
886 | } | 885 | } |
887 | serial_outp(up, UART_FCR, fcr); /* set fcr */ | 886 | serial_outp(up, UART_FCR, fcr); /* set fcr */ |
888 | } | 887 | } |
889 | 888 | ||
890 | up->cflag = cflag; | 889 | up->cflag = cflag; |
891 | 890 | ||
892 | spin_unlock_irqrestore(&up->port.lock, flags); | 891 | spin_unlock_irqrestore(&up->port.lock, flags); |
893 | } | 892 | } |
894 | 893 | ||
895 | static void | 894 | static void |
896 | sunsu_set_termios(struct uart_port *port, struct ktermios *termios, | 895 | sunsu_set_termios(struct uart_port *port, struct ktermios *termios, |
897 | struct ktermios *old) | 896 | struct ktermios *old) |
898 | { | 897 | { |
899 | unsigned int baud, quot; | 898 | unsigned int baud, quot; |
900 | 899 | ||
901 | /* | 900 | /* |
902 | * Ask the core to calculate the divisor for us. | 901 | * Ask the core to calculate the divisor for us. |
903 | */ | 902 | */ |
904 | baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/16); | 903 | baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/16); |
905 | quot = uart_get_divisor(port, baud); | 904 | quot = uart_get_divisor(port, baud); |
906 | 905 | ||
907 | sunsu_change_speed(port, termios->c_cflag, termios->c_iflag, quot); | 906 | sunsu_change_speed(port, termios->c_cflag, termios->c_iflag, quot); |
908 | } | 907 | } |
909 | 908 | ||
910 | static void sunsu_release_port(struct uart_port *port) | 909 | static void sunsu_release_port(struct uart_port *port) |
911 | { | 910 | { |
912 | } | 911 | } |
913 | 912 | ||
914 | static int sunsu_request_port(struct uart_port *port) | 913 | static int sunsu_request_port(struct uart_port *port) |
915 | { | 914 | { |
916 | return 0; | 915 | return 0; |
917 | } | 916 | } |
918 | 917 | ||
919 | static void sunsu_config_port(struct uart_port *port, int flags) | 918 | static void sunsu_config_port(struct uart_port *port, int flags) |
920 | { | 919 | { |
921 | struct uart_sunsu_port *up = (struct uart_sunsu_port *) port; | 920 | struct uart_sunsu_port *up = (struct uart_sunsu_port *) port; |
922 | 921 | ||
923 | if (flags & UART_CONFIG_TYPE) { | 922 | if (flags & UART_CONFIG_TYPE) { |
924 | /* | 923 | /* |
925 | * We are supposed to call autoconfig here, but this requires | 924 | * We are supposed to call autoconfig here, but this requires |
926 | * splitting all the OBP probing crap from the UART probing. | 925 | * splitting all the OBP probing crap from the UART probing. |
927 | * We'll do it when we kill sunsu.c altogether. | 926 | * We'll do it when we kill sunsu.c altogether. |
928 | */ | 927 | */ |
929 | port->type = up->type_probed; /* XXX */ | 928 | port->type = up->type_probed; /* XXX */ |
930 | } | 929 | } |
931 | } | 930 | } |
932 | 931 | ||
933 | static int | 932 | static int |
934 | sunsu_verify_port(struct uart_port *port, struct serial_struct *ser) | 933 | sunsu_verify_port(struct uart_port *port, struct serial_struct *ser) |
935 | { | 934 | { |
936 | return -EINVAL; | 935 | return -EINVAL; |
937 | } | 936 | } |
938 | 937 | ||
939 | static const char * | 938 | static const char * |
940 | sunsu_type(struct uart_port *port) | 939 | sunsu_type(struct uart_port *port) |
941 | { | 940 | { |
942 | int type = port->type; | 941 | int type = port->type; |
943 | 942 | ||
944 | if (type >= ARRAY_SIZE(uart_config)) | 943 | if (type >= ARRAY_SIZE(uart_config)) |
945 | type = 0; | 944 | type = 0; |
946 | return uart_config[type].name; | 945 | return uart_config[type].name; |
947 | } | 946 | } |
948 | 947 | ||
949 | static struct uart_ops sunsu_pops = { | 948 | static struct uart_ops sunsu_pops = { |
950 | .tx_empty = sunsu_tx_empty, | 949 | .tx_empty = sunsu_tx_empty, |
951 | .set_mctrl = sunsu_set_mctrl, | 950 | .set_mctrl = sunsu_set_mctrl, |
952 | .get_mctrl = sunsu_get_mctrl, | 951 | .get_mctrl = sunsu_get_mctrl, |
953 | .stop_tx = sunsu_stop_tx, | 952 | .stop_tx = sunsu_stop_tx, |
954 | .start_tx = sunsu_start_tx, | 953 | .start_tx = sunsu_start_tx, |
955 | .stop_rx = sunsu_stop_rx, | 954 | .stop_rx = sunsu_stop_rx, |
956 | .enable_ms = sunsu_enable_ms, | 955 | .enable_ms = sunsu_enable_ms, |
957 | .break_ctl = sunsu_break_ctl, | 956 | .break_ctl = sunsu_break_ctl, |
958 | .startup = sunsu_startup, | 957 | .startup = sunsu_startup, |
959 | .shutdown = sunsu_shutdown, | 958 | .shutdown = sunsu_shutdown, |
960 | .set_termios = sunsu_set_termios, | 959 | .set_termios = sunsu_set_termios, |
961 | .type = sunsu_type, | 960 | .type = sunsu_type, |
962 | .release_port = sunsu_release_port, | 961 | .release_port = sunsu_release_port, |
963 | .request_port = sunsu_request_port, | 962 | .request_port = sunsu_request_port, |
964 | .config_port = sunsu_config_port, | 963 | .config_port = sunsu_config_port, |
965 | .verify_port = sunsu_verify_port, | 964 | .verify_port = sunsu_verify_port, |
966 | }; | 965 | }; |
967 | 966 | ||
968 | #define UART_NR 4 | 967 | #define UART_NR 4 |
969 | 968 | ||
970 | static struct uart_sunsu_port sunsu_ports[UART_NR]; | 969 | static struct uart_sunsu_port sunsu_ports[UART_NR]; |
971 | 970 | ||
972 | #ifdef CONFIG_SERIO | 971 | #ifdef CONFIG_SERIO |
973 | 972 | ||
974 | static DEFINE_SPINLOCK(sunsu_serio_lock); | 973 | static DEFINE_SPINLOCK(sunsu_serio_lock); |
975 | 974 | ||
976 | static int sunsu_serio_write(struct serio *serio, unsigned char ch) | 975 | static int sunsu_serio_write(struct serio *serio, unsigned char ch) |
977 | { | 976 | { |
978 | struct uart_sunsu_port *up = serio->port_data; | 977 | struct uart_sunsu_port *up = serio->port_data; |
979 | unsigned long flags; | 978 | unsigned long flags; |
980 | int lsr; | 979 | int lsr; |
981 | 980 | ||
982 | spin_lock_irqsave(&sunsu_serio_lock, flags); | 981 | spin_lock_irqsave(&sunsu_serio_lock, flags); |
983 | 982 | ||
984 | do { | 983 | do { |
985 | lsr = serial_in(up, UART_LSR); | 984 | lsr = serial_in(up, UART_LSR); |
986 | } while (!(lsr & UART_LSR_THRE)); | 985 | } while (!(lsr & UART_LSR_THRE)); |
987 | 986 | ||
988 | /* Send the character out. */ | 987 | /* Send the character out. */ |
989 | serial_out(up, UART_TX, ch); | 988 | serial_out(up, UART_TX, ch); |
990 | 989 | ||
991 | spin_unlock_irqrestore(&sunsu_serio_lock, flags); | 990 | spin_unlock_irqrestore(&sunsu_serio_lock, flags); |
992 | 991 | ||
993 | return 0; | 992 | return 0; |
994 | } | 993 | } |
995 | 994 | ||
996 | static int sunsu_serio_open(struct serio *serio) | 995 | static int sunsu_serio_open(struct serio *serio) |
997 | { | 996 | { |
998 | struct uart_sunsu_port *up = serio->port_data; | 997 | struct uart_sunsu_port *up = serio->port_data; |
999 | unsigned long flags; | 998 | unsigned long flags; |
1000 | int ret; | 999 | int ret; |
1001 | 1000 | ||
1002 | spin_lock_irqsave(&sunsu_serio_lock, flags); | 1001 | spin_lock_irqsave(&sunsu_serio_lock, flags); |
1003 | if (!up->serio_open) { | 1002 | if (!up->serio_open) { |
1004 | up->serio_open = 1; | 1003 | up->serio_open = 1; |
1005 | ret = 0; | 1004 | ret = 0; |
1006 | } else | 1005 | } else |
1007 | ret = -EBUSY; | 1006 | ret = -EBUSY; |
1008 | spin_unlock_irqrestore(&sunsu_serio_lock, flags); | 1007 | spin_unlock_irqrestore(&sunsu_serio_lock, flags); |
1009 | 1008 | ||
1010 | return ret; | 1009 | return ret; |
1011 | } | 1010 | } |
1012 | 1011 | ||
1013 | static void sunsu_serio_close(struct serio *serio) | 1012 | static void sunsu_serio_close(struct serio *serio) |
1014 | { | 1013 | { |
1015 | struct uart_sunsu_port *up = serio->port_data; | 1014 | struct uart_sunsu_port *up = serio->port_data; |
1016 | unsigned long flags; | 1015 | unsigned long flags; |
1017 | 1016 | ||
1018 | spin_lock_irqsave(&sunsu_serio_lock, flags); | 1017 | spin_lock_irqsave(&sunsu_serio_lock, flags); |
1019 | up->serio_open = 0; | 1018 | up->serio_open = 0; |
1020 | spin_unlock_irqrestore(&sunsu_serio_lock, flags); | 1019 | spin_unlock_irqrestore(&sunsu_serio_lock, flags); |
1021 | } | 1020 | } |
1022 | 1021 | ||
1023 | #endif /* CONFIG_SERIO */ | 1022 | #endif /* CONFIG_SERIO */ |
1024 | 1023 | ||
1025 | static void sunsu_autoconfig(struct uart_sunsu_port *up) | 1024 | static void sunsu_autoconfig(struct uart_sunsu_port *up) |
1026 | { | 1025 | { |
1027 | unsigned char status1, status2, scratch, scratch2, scratch3; | 1026 | unsigned char status1, status2, scratch, scratch2, scratch3; |
1028 | unsigned char save_lcr, save_mcr; | 1027 | unsigned char save_lcr, save_mcr; |
1029 | unsigned long flags; | 1028 | unsigned long flags; |
1030 | 1029 | ||
1031 | if (up->su_type == SU_PORT_NONE) | 1030 | if (up->su_type == SU_PORT_NONE) |
1032 | return; | 1031 | return; |
1033 | 1032 | ||
1034 | up->type_probed = PORT_UNKNOWN; | 1033 | up->type_probed = PORT_UNKNOWN; |
1035 | up->port.iotype = UPIO_MEM; | 1034 | up->port.iotype = UPIO_MEM; |
1036 | 1035 | ||
1037 | spin_lock_irqsave(&up->port.lock, flags); | 1036 | spin_lock_irqsave(&up->port.lock, flags); |
1038 | 1037 | ||
1039 | if (!(up->port.flags & UPF_BUGGY_UART)) { | 1038 | if (!(up->port.flags & UPF_BUGGY_UART)) { |
1040 | /* | 1039 | /* |
1041 | * Do a simple existence test first; if we fail this, there's | 1040 | * Do a simple existence test first; if we fail this, there's |
1042 | * no point trying anything else. | 1041 | * no point trying anything else. |
1043 | * | 1042 | * |
1044 | * 0x80 is used as a nonsense port to prevent against false | 1043 | * 0x80 is used as a nonsense port to prevent against false |
1045 | * positives due to ISA bus float. The assumption is that | 1044 | * positives due to ISA bus float. The assumption is that |
1046 | * 0x80 is a non-existent port; which should be safe since | 1045 | * 0x80 is a non-existent port; which should be safe since |
1047 | * include/asm/io.h also makes this assumption. | 1046 | * include/asm/io.h also makes this assumption. |
1048 | */ | 1047 | */ |
1049 | scratch = serial_inp(up, UART_IER); | 1048 | scratch = serial_inp(up, UART_IER); |
1050 | serial_outp(up, UART_IER, 0); | 1049 | serial_outp(up, UART_IER, 0); |
1051 | #ifdef __i386__ | 1050 | #ifdef __i386__ |
1052 | outb(0xff, 0x080); | 1051 | outb(0xff, 0x080); |
1053 | #endif | 1052 | #endif |
1054 | scratch2 = serial_inp(up, UART_IER); | 1053 | scratch2 = serial_inp(up, UART_IER); |
1055 | serial_outp(up, UART_IER, 0x0f); | 1054 | serial_outp(up, UART_IER, 0x0f); |
1056 | #ifdef __i386__ | 1055 | #ifdef __i386__ |
1057 | outb(0, 0x080); | 1056 | outb(0, 0x080); |
1058 | #endif | 1057 | #endif |
1059 | scratch3 = serial_inp(up, UART_IER); | 1058 | scratch3 = serial_inp(up, UART_IER); |
1060 | serial_outp(up, UART_IER, scratch); | 1059 | serial_outp(up, UART_IER, scratch); |
1061 | if (scratch2 != 0 || scratch3 != 0x0F) | 1060 | if (scratch2 != 0 || scratch3 != 0x0F) |
1062 | goto out; /* We failed; there's nothing here */ | 1061 | goto out; /* We failed; there's nothing here */ |
1063 | } | 1062 | } |
1064 | 1063 | ||
1065 | save_mcr = serial_in(up, UART_MCR); | 1064 | save_mcr = serial_in(up, UART_MCR); |
1066 | save_lcr = serial_in(up, UART_LCR); | 1065 | save_lcr = serial_in(up, UART_LCR); |
1067 | 1066 | ||
1068 | /* | 1067 | /* |
1069 | * Check to see if a UART is really there. Certain broken | 1068 | * Check to see if a UART is really there. Certain broken |
1070 | * internal modems based on the Rockwell chipset fail this | 1069 | * internal modems based on the Rockwell chipset fail this |
1071 | * test, because they apparently don't implement the loopback | 1070 | * test, because they apparently don't implement the loopback |
1072 | * test mode. So this test is skipped on the COM 1 through | 1071 | * test mode. So this test is skipped on the COM 1 through |
1073 | * COM 4 ports. This *should* be safe, since no board | 1072 | * COM 4 ports. This *should* be safe, since no board |
1074 | * manufacturer would be stupid enough to design a board | 1073 | * manufacturer would be stupid enough to design a board |
1075 | * that conflicts with COM 1-4 --- we hope! | 1074 | * that conflicts with COM 1-4 --- we hope! |
1076 | */ | 1075 | */ |
1077 | if (!(up->port.flags & UPF_SKIP_TEST)) { | 1076 | if (!(up->port.flags & UPF_SKIP_TEST)) { |
1078 | serial_outp(up, UART_MCR, UART_MCR_LOOP | 0x0A); | 1077 | serial_outp(up, UART_MCR, UART_MCR_LOOP | 0x0A); |
1079 | status1 = serial_inp(up, UART_MSR) & 0xF0; | 1078 | status1 = serial_inp(up, UART_MSR) & 0xF0; |
1080 | serial_outp(up, UART_MCR, save_mcr); | 1079 | serial_outp(up, UART_MCR, save_mcr); |
1081 | if (status1 != 0x90) | 1080 | if (status1 != 0x90) |
1082 | goto out; /* We failed loopback test */ | 1081 | goto out; /* We failed loopback test */ |
1083 | } | 1082 | } |
1084 | serial_outp(up, UART_LCR, 0xBF); /* set up for StarTech test */ | 1083 | serial_outp(up, UART_LCR, 0xBF); /* set up for StarTech test */ |
1085 | serial_outp(up, UART_EFR, 0); /* EFR is the same as FCR */ | 1084 | serial_outp(up, UART_EFR, 0); /* EFR is the same as FCR */ |
1086 | serial_outp(up, UART_LCR, 0); | 1085 | serial_outp(up, UART_LCR, 0); |
1087 | serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO); | 1086 | serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO); |
1088 | scratch = serial_in(up, UART_IIR) >> 6; | 1087 | scratch = serial_in(up, UART_IIR) >> 6; |
1089 | switch (scratch) { | 1088 | switch (scratch) { |
1090 | case 0: | 1089 | case 0: |
1091 | up->port.type = PORT_16450; | 1090 | up->port.type = PORT_16450; |
1092 | break; | 1091 | break; |
1093 | case 1: | 1092 | case 1: |
1094 | up->port.type = PORT_UNKNOWN; | 1093 | up->port.type = PORT_UNKNOWN; |
1095 | break; | 1094 | break; |
1096 | case 2: | 1095 | case 2: |
1097 | up->port.type = PORT_16550; | 1096 | up->port.type = PORT_16550; |
1098 | break; | 1097 | break; |
1099 | case 3: | 1098 | case 3: |
1100 | up->port.type = PORT_16550A; | 1099 | up->port.type = PORT_16550A; |
1101 | break; | 1100 | break; |
1102 | } | 1101 | } |
1103 | if (up->port.type == PORT_16550A) { | 1102 | if (up->port.type == PORT_16550A) { |
1104 | /* Check for Startech UART's */ | 1103 | /* Check for Startech UART's */ |
1105 | serial_outp(up, UART_LCR, UART_LCR_DLAB); | 1104 | serial_outp(up, UART_LCR, UART_LCR_DLAB); |
1106 | if (serial_in(up, UART_EFR) == 0) { | 1105 | if (serial_in(up, UART_EFR) == 0) { |
1107 | up->port.type = PORT_16650; | 1106 | up->port.type = PORT_16650; |
1108 | } else { | 1107 | } else { |
1109 | serial_outp(up, UART_LCR, 0xBF); | 1108 | serial_outp(up, UART_LCR, 0xBF); |
1110 | if (serial_in(up, UART_EFR) == 0) | 1109 | if (serial_in(up, UART_EFR) == 0) |
1111 | up->port.type = PORT_16650V2; | 1110 | up->port.type = PORT_16650V2; |
1112 | } | 1111 | } |
1113 | } | 1112 | } |
1114 | if (up->port.type == PORT_16550A) { | 1113 | if (up->port.type == PORT_16550A) { |
1115 | /* Check for TI 16750 */ | 1114 | /* Check for TI 16750 */ |
1116 | serial_outp(up, UART_LCR, save_lcr | UART_LCR_DLAB); | 1115 | serial_outp(up, UART_LCR, save_lcr | UART_LCR_DLAB); |
1117 | serial_outp(up, UART_FCR, | 1116 | serial_outp(up, UART_FCR, |
1118 | UART_FCR_ENABLE_FIFO | UART_FCR7_64BYTE); | 1117 | UART_FCR_ENABLE_FIFO | UART_FCR7_64BYTE); |
1119 | scratch = serial_in(up, UART_IIR) >> 5; | 1118 | scratch = serial_in(up, UART_IIR) >> 5; |
1120 | if (scratch == 7) { | 1119 | if (scratch == 7) { |
1121 | /* | 1120 | /* |
1122 | * If this is a 16750, and not a cheap UART | 1121 | * If this is a 16750, and not a cheap UART |
1123 | * clone, then it should only go into 64 byte | 1122 | * clone, then it should only go into 64 byte |
1124 | * mode if the UART_FCR7_64BYTE bit was set | 1123 | * mode if the UART_FCR7_64BYTE bit was set |
1125 | * while UART_LCR_DLAB was latched. | 1124 | * while UART_LCR_DLAB was latched. |
1126 | */ | 1125 | */ |
1127 | serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO); | 1126 | serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO); |
1128 | serial_outp(up, UART_LCR, 0); | 1127 | serial_outp(up, UART_LCR, 0); |
1129 | serial_outp(up, UART_FCR, | 1128 | serial_outp(up, UART_FCR, |
1130 | UART_FCR_ENABLE_FIFO | UART_FCR7_64BYTE); | 1129 | UART_FCR_ENABLE_FIFO | UART_FCR7_64BYTE); |
1131 | scratch = serial_in(up, UART_IIR) >> 5; | 1130 | scratch = serial_in(up, UART_IIR) >> 5; |
1132 | if (scratch == 6) | 1131 | if (scratch == 6) |
1133 | up->port.type = PORT_16750; | 1132 | up->port.type = PORT_16750; |
1134 | } | 1133 | } |
1135 | serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO); | 1134 | serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO); |
1136 | } | 1135 | } |
1137 | serial_outp(up, UART_LCR, save_lcr); | 1136 | serial_outp(up, UART_LCR, save_lcr); |
1138 | if (up->port.type == PORT_16450) { | 1137 | if (up->port.type == PORT_16450) { |
1139 | scratch = serial_in(up, UART_SCR); | 1138 | scratch = serial_in(up, UART_SCR); |
1140 | serial_outp(up, UART_SCR, 0xa5); | 1139 | serial_outp(up, UART_SCR, 0xa5); |
1141 | status1 = serial_in(up, UART_SCR); | 1140 | status1 = serial_in(up, UART_SCR); |
1142 | serial_outp(up, UART_SCR, 0x5a); | 1141 | serial_outp(up, UART_SCR, 0x5a); |
1143 | status2 = serial_in(up, UART_SCR); | 1142 | status2 = serial_in(up, UART_SCR); |
1144 | serial_outp(up, UART_SCR, scratch); | 1143 | serial_outp(up, UART_SCR, scratch); |
1145 | 1144 | ||
1146 | if ((status1 != 0xa5) || (status2 != 0x5a)) | 1145 | if ((status1 != 0xa5) || (status2 != 0x5a)) |
1147 | up->port.type = PORT_8250; | 1146 | up->port.type = PORT_8250; |
1148 | } | 1147 | } |
1149 | 1148 | ||
1150 | up->port.fifosize = uart_config[up->port.type].dfl_xmit_fifo_size; | 1149 | up->port.fifosize = uart_config[up->port.type].dfl_xmit_fifo_size; |
1151 | 1150 | ||
1152 | if (up->port.type == PORT_UNKNOWN) | 1151 | if (up->port.type == PORT_UNKNOWN) |
1153 | goto out; | 1152 | goto out; |
1154 | up->type_probed = up->port.type; /* XXX */ | 1153 | up->type_probed = up->port.type; /* XXX */ |
1155 | 1154 | ||
1156 | /* | 1155 | /* |
1157 | * Reset the UART. | 1156 | * Reset the UART. |
1158 | */ | 1157 | */ |
1159 | #ifdef CONFIG_SERIAL_8250_RSA | 1158 | #ifdef CONFIG_SERIAL_8250_RSA |
1160 | if (up->port.type == PORT_RSA) | 1159 | if (up->port.type == PORT_RSA) |
1161 | serial_outp(up, UART_RSA_FRR, 0); | 1160 | serial_outp(up, UART_RSA_FRR, 0); |
1162 | #endif | 1161 | #endif |
1163 | serial_outp(up, UART_MCR, save_mcr); | 1162 | serial_outp(up, UART_MCR, save_mcr); |
1164 | serial_outp(up, UART_FCR, (UART_FCR_ENABLE_FIFO | | 1163 | serial_outp(up, UART_FCR, (UART_FCR_ENABLE_FIFO | |
1165 | UART_FCR_CLEAR_RCVR | | 1164 | UART_FCR_CLEAR_RCVR | |
1166 | UART_FCR_CLEAR_XMIT)); | 1165 | UART_FCR_CLEAR_XMIT)); |
1167 | serial_outp(up, UART_FCR, 0); | 1166 | serial_outp(up, UART_FCR, 0); |
1168 | (void)serial_in(up, UART_RX); | 1167 | (void)serial_in(up, UART_RX); |
1169 | serial_outp(up, UART_IER, 0); | 1168 | serial_outp(up, UART_IER, 0); |
1170 | 1169 | ||
1171 | out: | 1170 | out: |
1172 | spin_unlock_irqrestore(&up->port.lock, flags); | 1171 | spin_unlock_irqrestore(&up->port.lock, flags); |
1173 | } | 1172 | } |
1174 | 1173 | ||
1175 | static struct uart_driver sunsu_reg = { | 1174 | static struct uart_driver sunsu_reg = { |
1176 | .owner = THIS_MODULE, | 1175 | .owner = THIS_MODULE, |
1177 | .driver_name = "sunsu", | 1176 | .driver_name = "sunsu", |
1178 | .dev_name = "ttyS", | 1177 | .dev_name = "ttyS", |
1179 | .major = TTY_MAJOR, | 1178 | .major = TTY_MAJOR, |
1180 | }; | 1179 | }; |
1181 | 1180 | ||
1182 | static int __devinit sunsu_kbd_ms_init(struct uart_sunsu_port *up) | 1181 | static int __devinit sunsu_kbd_ms_init(struct uart_sunsu_port *up) |
1183 | { | 1182 | { |
1184 | int quot, baud; | 1183 | int quot, baud; |
1185 | #ifdef CONFIG_SERIO | 1184 | #ifdef CONFIG_SERIO |
1186 | struct serio *serio; | 1185 | struct serio *serio; |
1187 | #endif | 1186 | #endif |
1188 | 1187 | ||
1189 | if (up->su_type == SU_PORT_KBD) { | 1188 | if (up->su_type == SU_PORT_KBD) { |
1190 | up->cflag = B1200 | CS8 | CLOCAL | CREAD; | 1189 | up->cflag = B1200 | CS8 | CLOCAL | CREAD; |
1191 | baud = 1200; | 1190 | baud = 1200; |
1192 | } else { | 1191 | } else { |
1193 | up->cflag = B4800 | CS8 | CLOCAL | CREAD; | 1192 | up->cflag = B4800 | CS8 | CLOCAL | CREAD; |
1194 | baud = 4800; | 1193 | baud = 4800; |
1195 | } | 1194 | } |
1196 | quot = up->port.uartclk / (16 * baud); | 1195 | quot = up->port.uartclk / (16 * baud); |
1197 | 1196 | ||
1198 | sunsu_autoconfig(up); | 1197 | sunsu_autoconfig(up); |
1199 | if (up->port.type == PORT_UNKNOWN) | 1198 | if (up->port.type == PORT_UNKNOWN) |
1200 | return -ENODEV; | 1199 | return -ENODEV; |
1201 | 1200 | ||
1202 | printk("%s: %s port at %llx, irq %u\n", | 1201 | printk("%s: %s port at %llx, irq %u\n", |
1203 | up->port.dev->of_node->full_name, | 1202 | up->port.dev->of_node->full_name, |
1204 | (up->su_type == SU_PORT_KBD) ? "Keyboard" : "Mouse", | 1203 | (up->su_type == SU_PORT_KBD) ? "Keyboard" : "Mouse", |
1205 | (unsigned long long) up->port.mapbase, | 1204 | (unsigned long long) up->port.mapbase, |
1206 | up->port.irq); | 1205 | up->port.irq); |
1207 | 1206 | ||
1208 | #ifdef CONFIG_SERIO | 1207 | #ifdef CONFIG_SERIO |
1209 | serio = &up->serio; | 1208 | serio = &up->serio; |
1210 | serio->port_data = up; | 1209 | serio->port_data = up; |
1211 | 1210 | ||
1212 | serio->id.type = SERIO_RS232; | 1211 | serio->id.type = SERIO_RS232; |
1213 | if (up->su_type == SU_PORT_KBD) { | 1212 | if (up->su_type == SU_PORT_KBD) { |
1214 | serio->id.proto = SERIO_SUNKBD; | 1213 | serio->id.proto = SERIO_SUNKBD; |
1215 | strlcpy(serio->name, "sukbd", sizeof(serio->name)); | 1214 | strlcpy(serio->name, "sukbd", sizeof(serio->name)); |
1216 | } else { | 1215 | } else { |
1217 | serio->id.proto = SERIO_SUN; | 1216 | serio->id.proto = SERIO_SUN; |
1218 | serio->id.extra = 1; | 1217 | serio->id.extra = 1; |
1219 | strlcpy(serio->name, "sums", sizeof(serio->name)); | 1218 | strlcpy(serio->name, "sums", sizeof(serio->name)); |
1220 | } | 1219 | } |
1221 | strlcpy(serio->phys, | 1220 | strlcpy(serio->phys, |
1222 | (!(up->port.line & 1) ? "su/serio0" : "su/serio1"), | 1221 | (!(up->port.line & 1) ? "su/serio0" : "su/serio1"), |
1223 | sizeof(serio->phys)); | 1222 | sizeof(serio->phys)); |
1224 | 1223 | ||
1225 | serio->write = sunsu_serio_write; | 1224 | serio->write = sunsu_serio_write; |
1226 | serio->open = sunsu_serio_open; | 1225 | serio->open = sunsu_serio_open; |
1227 | serio->close = sunsu_serio_close; | 1226 | serio->close = sunsu_serio_close; |
1228 | serio->dev.parent = up->port.dev; | 1227 | serio->dev.parent = up->port.dev; |
1229 | 1228 | ||
1230 | serio_register_port(serio); | 1229 | serio_register_port(serio); |
1231 | #endif | 1230 | #endif |
1232 | 1231 | ||
1233 | sunsu_change_speed(&up->port, up->cflag, 0, quot); | 1232 | sunsu_change_speed(&up->port, up->cflag, 0, quot); |
1234 | 1233 | ||
1235 | sunsu_startup(&up->port); | 1234 | sunsu_startup(&up->port); |
1236 | return 0; | 1235 | return 0; |
1237 | } | 1236 | } |
1238 | 1237 | ||
1239 | /* | 1238 | /* |
1240 | * ------------------------------------------------------------ | 1239 | * ------------------------------------------------------------ |
1241 | * Serial console driver | 1240 | * Serial console driver |
1242 | * ------------------------------------------------------------ | 1241 | * ------------------------------------------------------------ |
1243 | */ | 1242 | */ |
1244 | 1243 | ||
1245 | #ifdef CONFIG_SERIAL_SUNSU_CONSOLE | 1244 | #ifdef CONFIG_SERIAL_SUNSU_CONSOLE |
1246 | 1245 | ||
1247 | #define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE) | 1246 | #define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE) |
1248 | 1247 | ||
1249 | /* | 1248 | /* |
1250 | * Wait for transmitter & holding register to empty | 1249 | * Wait for transmitter & holding register to empty |
1251 | */ | 1250 | */ |
1252 | static __inline__ void wait_for_xmitr(struct uart_sunsu_port *up) | 1251 | static __inline__ void wait_for_xmitr(struct uart_sunsu_port *up) |
1253 | { | 1252 | { |
1254 | unsigned int status, tmout = 10000; | 1253 | unsigned int status, tmout = 10000; |
1255 | 1254 | ||
1256 | /* Wait up to 10ms for the character(s) to be sent. */ | 1255 | /* Wait up to 10ms for the character(s) to be sent. */ |
1257 | do { | 1256 | do { |
1258 | status = serial_in(up, UART_LSR); | 1257 | status = serial_in(up, UART_LSR); |
1259 | 1258 | ||
1260 | if (status & UART_LSR_BI) | 1259 | if (status & UART_LSR_BI) |
1261 | up->lsr_break_flag = UART_LSR_BI; | 1260 | up->lsr_break_flag = UART_LSR_BI; |
1262 | 1261 | ||
1263 | if (--tmout == 0) | 1262 | if (--tmout == 0) |
1264 | break; | 1263 | break; |
1265 | udelay(1); | 1264 | udelay(1); |
1266 | } while ((status & BOTH_EMPTY) != BOTH_EMPTY); | 1265 | } while ((status & BOTH_EMPTY) != BOTH_EMPTY); |
1267 | 1266 | ||
1268 | /* Wait up to 1s for flow control if necessary */ | 1267 | /* Wait up to 1s for flow control if necessary */ |
1269 | if (up->port.flags & UPF_CONS_FLOW) { | 1268 | if (up->port.flags & UPF_CONS_FLOW) { |
1270 | tmout = 1000000; | 1269 | tmout = 1000000; |
1271 | while (--tmout && | 1270 | while (--tmout && |
1272 | ((serial_in(up, UART_MSR) & UART_MSR_CTS) == 0)) | 1271 | ((serial_in(up, UART_MSR) & UART_MSR_CTS) == 0)) |
1273 | udelay(1); | 1272 | udelay(1); |
1274 | } | 1273 | } |
1275 | } | 1274 | } |
1276 | 1275 | ||
1277 | static void sunsu_console_putchar(struct uart_port *port, int ch) | 1276 | static void sunsu_console_putchar(struct uart_port *port, int ch) |
1278 | { | 1277 | { |
1279 | struct uart_sunsu_port *up = (struct uart_sunsu_port *)port; | 1278 | struct uart_sunsu_port *up = (struct uart_sunsu_port *)port; |
1280 | 1279 | ||
1281 | wait_for_xmitr(up); | 1280 | wait_for_xmitr(up); |
1282 | serial_out(up, UART_TX, ch); | 1281 | serial_out(up, UART_TX, ch); |
1283 | } | 1282 | } |
1284 | 1283 | ||
1285 | /* | 1284 | /* |
1286 | * Print a string to the serial port trying not to disturb | 1285 | * Print a string to the serial port trying not to disturb |
1287 | * any possible real use of the port... | 1286 | * any possible real use of the port... |
1288 | */ | 1287 | */ |
1289 | static void sunsu_console_write(struct console *co, const char *s, | 1288 | static void sunsu_console_write(struct console *co, const char *s, |
1290 | unsigned int count) | 1289 | unsigned int count) |
1291 | { | 1290 | { |
1292 | struct uart_sunsu_port *up = &sunsu_ports[co->index]; | 1291 | struct uart_sunsu_port *up = &sunsu_ports[co->index]; |
1293 | unsigned long flags; | 1292 | unsigned long flags; |
1294 | unsigned int ier; | 1293 | unsigned int ier; |
1295 | int locked = 1; | 1294 | int locked = 1; |
1296 | 1295 | ||
1297 | local_irq_save(flags); | 1296 | local_irq_save(flags); |
1298 | if (up->port.sysrq) { | 1297 | if (up->port.sysrq) { |
1299 | locked = 0; | 1298 | locked = 0; |
1300 | } else if (oops_in_progress) { | 1299 | } else if (oops_in_progress) { |
1301 | locked = spin_trylock(&up->port.lock); | 1300 | locked = spin_trylock(&up->port.lock); |
1302 | } else | 1301 | } else |
1303 | spin_lock(&up->port.lock); | 1302 | spin_lock(&up->port.lock); |
1304 | 1303 | ||
1305 | /* | 1304 | /* |
1306 | * First save the UER then disable the interrupts | 1305 | * First save the UER then disable the interrupts |
1307 | */ | 1306 | */ |
1308 | ier = serial_in(up, UART_IER); | 1307 | ier = serial_in(up, UART_IER); |
1309 | serial_out(up, UART_IER, 0); | 1308 | serial_out(up, UART_IER, 0); |
1310 | 1309 | ||
1311 | uart_console_write(&up->port, s, count, sunsu_console_putchar); | 1310 | uart_console_write(&up->port, s, count, sunsu_console_putchar); |
1312 | 1311 | ||
1313 | /* | 1312 | /* |
1314 | * Finally, wait for transmitter to become empty | 1313 | * Finally, wait for transmitter to become empty |
1315 | * and restore the IER | 1314 | * and restore the IER |
1316 | */ | 1315 | */ |
1317 | wait_for_xmitr(up); | 1316 | wait_for_xmitr(up); |
1318 | serial_out(up, UART_IER, ier); | 1317 | serial_out(up, UART_IER, ier); |
1319 | 1318 | ||
1320 | if (locked) | 1319 | if (locked) |
1321 | spin_unlock(&up->port.lock); | 1320 | spin_unlock(&up->port.lock); |
1322 | local_irq_restore(flags); | 1321 | local_irq_restore(flags); |
1323 | } | 1322 | } |
1324 | 1323 | ||
1325 | /* | 1324 | /* |
1326 | * Setup initial baud/bits/parity. We do two things here: | 1325 | * Setup initial baud/bits/parity. We do two things here: |
1327 | * - construct a cflag setting for the first su_open() | 1326 | * - construct a cflag setting for the first su_open() |
1328 | * - initialize the serial port | 1327 | * - initialize the serial port |
1329 | * Return non-zero if we didn't find a serial port. | 1328 | * Return non-zero if we didn't find a serial port. |
1330 | */ | 1329 | */ |
1331 | static int __init sunsu_console_setup(struct console *co, char *options) | 1330 | static int __init sunsu_console_setup(struct console *co, char *options) |
1332 | { | 1331 | { |
1333 | static struct ktermios dummy; | 1332 | static struct ktermios dummy; |
1334 | struct ktermios termios; | 1333 | struct ktermios termios; |
1335 | struct uart_port *port; | 1334 | struct uart_port *port; |
1336 | 1335 | ||
1337 | printk("Console: ttyS%d (SU)\n", | 1336 | printk("Console: ttyS%d (SU)\n", |
1338 | (sunsu_reg.minor - 64) + co->index); | 1337 | (sunsu_reg.minor - 64) + co->index); |
1339 | 1338 | ||
1340 | /* | 1339 | /* |
1341 | * Check whether an invalid uart number has been specified, and | 1340 | * Check whether an invalid uart number has been specified, and |
1342 | * if so, search for the first available port that does have | 1341 | * if so, search for the first available port that does have |
1343 | * console support. | 1342 | * console support. |
1344 | */ | 1343 | */ |
1345 | if (co->index >= UART_NR) | 1344 | if (co->index >= UART_NR) |
1346 | co->index = 0; | 1345 | co->index = 0; |
1347 | port = &sunsu_ports[co->index].port; | 1346 | port = &sunsu_ports[co->index].port; |
1348 | 1347 | ||
1349 | /* | 1348 | /* |
1350 | * Temporary fix. | 1349 | * Temporary fix. |
1351 | */ | 1350 | */ |
1352 | spin_lock_init(&port->lock); | 1351 | spin_lock_init(&port->lock); |
1353 | 1352 | ||
1354 | /* Get firmware console settings. */ | 1353 | /* Get firmware console settings. */ |
1355 | sunserial_console_termios(co, port->dev->of_node); | 1354 | sunserial_console_termios(co, port->dev->of_node); |
1356 | 1355 | ||
1357 | memset(&termios, 0, sizeof(struct ktermios)); | 1356 | memset(&termios, 0, sizeof(struct ktermios)); |
1358 | termios.c_cflag = co->cflag; | 1357 | termios.c_cflag = co->cflag; |
1359 | port->mctrl |= TIOCM_DTR; | 1358 | port->mctrl |= TIOCM_DTR; |
1360 | port->ops->set_termios(port, &termios, &dummy); | 1359 | port->ops->set_termios(port, &termios, &dummy); |
1361 | 1360 | ||
1362 | return 0; | 1361 | return 0; |
1363 | } | 1362 | } |
1364 | 1363 | ||
1365 | static struct console sunsu_console = { | 1364 | static struct console sunsu_console = { |
1366 | .name = "ttyS", | 1365 | .name = "ttyS", |
1367 | .write = sunsu_console_write, | 1366 | .write = sunsu_console_write, |
1368 | .device = uart_console_device, | 1367 | .device = uart_console_device, |
1369 | .setup = sunsu_console_setup, | 1368 | .setup = sunsu_console_setup, |
1370 | .flags = CON_PRINTBUFFER, | 1369 | .flags = CON_PRINTBUFFER, |
1371 | .index = -1, | 1370 | .index = -1, |
1372 | .data = &sunsu_reg, | 1371 | .data = &sunsu_reg, |
1373 | }; | 1372 | }; |
1374 | 1373 | ||
1375 | /* | 1374 | /* |
1376 | * Register console. | 1375 | * Register console. |
1377 | */ | 1376 | */ |
1378 | 1377 | ||
1379 | static inline struct console *SUNSU_CONSOLE(void) | 1378 | static inline struct console *SUNSU_CONSOLE(void) |
1380 | { | 1379 | { |
1381 | return &sunsu_console; | 1380 | return &sunsu_console; |
1382 | } | 1381 | } |
1383 | #else | 1382 | #else |
1384 | #define SUNSU_CONSOLE() (NULL) | 1383 | #define SUNSU_CONSOLE() (NULL) |
1385 | #define sunsu_serial_console_init() do { } while (0) | 1384 | #define sunsu_serial_console_init() do { } while (0) |
1386 | #endif | 1385 | #endif |
1387 | 1386 | ||
1388 | static enum su_type __devinit su_get_type(struct device_node *dp) | 1387 | static enum su_type __devinit su_get_type(struct device_node *dp) |
1389 | { | 1388 | { |
1390 | struct device_node *ap = of_find_node_by_path("/aliases"); | 1389 | struct device_node *ap = of_find_node_by_path("/aliases"); |
1391 | 1390 | ||
1392 | if (ap) { | 1391 | if (ap) { |
1393 | const char *keyb = of_get_property(ap, "keyboard", NULL); | 1392 | const char *keyb = of_get_property(ap, "keyboard", NULL); |
1394 | const char *ms = of_get_property(ap, "mouse", NULL); | 1393 | const char *ms = of_get_property(ap, "mouse", NULL); |
1395 | 1394 | ||
1396 | if (keyb) { | 1395 | if (keyb) { |
1397 | if (dp == of_find_node_by_path(keyb)) | 1396 | if (dp == of_find_node_by_path(keyb)) |
1398 | return SU_PORT_KBD; | 1397 | return SU_PORT_KBD; |
1399 | } | 1398 | } |
1400 | if (ms) { | 1399 | if (ms) { |
1401 | if (dp == of_find_node_by_path(ms)) | 1400 | if (dp == of_find_node_by_path(ms)) |
1402 | return SU_PORT_MS; | 1401 | return SU_PORT_MS; |
1403 | } | 1402 | } |
1404 | } | 1403 | } |
1405 | 1404 | ||
1406 | return SU_PORT_PORT; | 1405 | return SU_PORT_PORT; |
1407 | } | 1406 | } |
1408 | 1407 | ||
1409 | static int __devinit su_probe(struct platform_device *op) | 1408 | static int __devinit su_probe(struct platform_device *op) |
1410 | { | 1409 | { |
1411 | static int inst; | 1410 | static int inst; |
1412 | struct device_node *dp = op->dev.of_node; | 1411 | struct device_node *dp = op->dev.of_node; |
1413 | struct uart_sunsu_port *up; | 1412 | struct uart_sunsu_port *up; |
1414 | struct resource *rp; | 1413 | struct resource *rp; |
1415 | enum su_type type; | 1414 | enum su_type type; |
1416 | bool ignore_line; | 1415 | bool ignore_line; |
1417 | int err; | 1416 | int err; |
1418 | 1417 | ||
1419 | type = su_get_type(dp); | 1418 | type = su_get_type(dp); |
1420 | if (type == SU_PORT_PORT) { | 1419 | if (type == SU_PORT_PORT) { |
1421 | if (inst >= UART_NR) | 1420 | if (inst >= UART_NR) |
1422 | return -EINVAL; | 1421 | return -EINVAL; |
1423 | up = &sunsu_ports[inst]; | 1422 | up = &sunsu_ports[inst]; |
1424 | } else { | 1423 | } else { |
1425 | up = kzalloc(sizeof(*up), GFP_KERNEL); | 1424 | up = kzalloc(sizeof(*up), GFP_KERNEL); |
1426 | if (!up) | 1425 | if (!up) |
1427 | return -ENOMEM; | 1426 | return -ENOMEM; |
1428 | } | 1427 | } |
1429 | 1428 | ||
1430 | up->port.line = inst; | 1429 | up->port.line = inst; |
1431 | 1430 | ||
1432 | spin_lock_init(&up->port.lock); | 1431 | spin_lock_init(&up->port.lock); |
1433 | 1432 | ||
1434 | up->su_type = type; | 1433 | up->su_type = type; |
1435 | 1434 | ||
1436 | rp = &op->resource[0]; | 1435 | rp = &op->resource[0]; |
1437 | up->port.mapbase = rp->start; | 1436 | up->port.mapbase = rp->start; |
1438 | up->reg_size = resource_size(rp); | 1437 | up->reg_size = resource_size(rp); |
1439 | up->port.membase = of_ioremap(rp, 0, up->reg_size, "su"); | 1438 | up->port.membase = of_ioremap(rp, 0, up->reg_size, "su"); |
1440 | if (!up->port.membase) { | 1439 | if (!up->port.membase) { |
1441 | if (type != SU_PORT_PORT) | 1440 | if (type != SU_PORT_PORT) |
1442 | kfree(up); | 1441 | kfree(up); |
1443 | return -ENOMEM; | 1442 | return -ENOMEM; |
1444 | } | 1443 | } |
1445 | 1444 | ||
1446 | up->port.irq = op->archdata.irqs[0]; | 1445 | up->port.irq = op->archdata.irqs[0]; |
1447 | 1446 | ||
1448 | up->port.dev = &op->dev; | 1447 | up->port.dev = &op->dev; |
1449 | 1448 | ||
1450 | up->port.type = PORT_UNKNOWN; | 1449 | up->port.type = PORT_UNKNOWN; |
1451 | up->port.uartclk = (SU_BASE_BAUD * 16); | 1450 | up->port.uartclk = (SU_BASE_BAUD * 16); |
1452 | 1451 | ||
1453 | err = 0; | 1452 | err = 0; |
1454 | if (up->su_type == SU_PORT_KBD || up->su_type == SU_PORT_MS) { | 1453 | if (up->su_type == SU_PORT_KBD || up->su_type == SU_PORT_MS) { |
1455 | err = sunsu_kbd_ms_init(up); | 1454 | err = sunsu_kbd_ms_init(up); |
1456 | if (err) { | 1455 | if (err) { |
1457 | of_iounmap(&op->resource[0], | 1456 | of_iounmap(&op->resource[0], |
1458 | up->port.membase, up->reg_size); | 1457 | up->port.membase, up->reg_size); |
1459 | kfree(up); | 1458 | kfree(up); |
1460 | return err; | 1459 | return err; |
1461 | } | 1460 | } |
1462 | dev_set_drvdata(&op->dev, up); | 1461 | dev_set_drvdata(&op->dev, up); |
1463 | 1462 | ||
1464 | return 0; | 1463 | return 0; |
1465 | } | 1464 | } |
1466 | 1465 | ||
1467 | up->port.flags |= UPF_BOOT_AUTOCONF; | 1466 | up->port.flags |= UPF_BOOT_AUTOCONF; |
1468 | 1467 | ||
1469 | sunsu_autoconfig(up); | 1468 | sunsu_autoconfig(up); |
1470 | 1469 | ||
1471 | err = -ENODEV; | 1470 | err = -ENODEV; |
1472 | if (up->port.type == PORT_UNKNOWN) | 1471 | if (up->port.type == PORT_UNKNOWN) |
1473 | goto out_unmap; | 1472 | goto out_unmap; |
1474 | 1473 | ||
1475 | up->port.ops = &sunsu_pops; | 1474 | up->port.ops = &sunsu_pops; |
1476 | 1475 | ||
1477 | ignore_line = false; | 1476 | ignore_line = false; |
1478 | if (!strcmp(dp->name, "rsc-console") || | 1477 | if (!strcmp(dp->name, "rsc-console") || |
1479 | !strcmp(dp->name, "lom-console")) | 1478 | !strcmp(dp->name, "lom-console")) |
1480 | ignore_line = true; | 1479 | ignore_line = true; |
1481 | 1480 | ||
1482 | sunserial_console_match(SUNSU_CONSOLE(), dp, | 1481 | sunserial_console_match(SUNSU_CONSOLE(), dp, |
1483 | &sunsu_reg, up->port.line, | 1482 | &sunsu_reg, up->port.line, |
1484 | ignore_line); | 1483 | ignore_line); |
1485 | err = uart_add_one_port(&sunsu_reg, &up->port); | 1484 | err = uart_add_one_port(&sunsu_reg, &up->port); |
1486 | if (err) | 1485 | if (err) |
1487 | goto out_unmap; | 1486 | goto out_unmap; |
1488 | 1487 | ||
1489 | dev_set_drvdata(&op->dev, up); | 1488 | dev_set_drvdata(&op->dev, up); |
1490 | 1489 | ||
1491 | inst++; | 1490 | inst++; |
1492 | 1491 | ||
1493 | return 0; | 1492 | return 0; |
1494 | 1493 | ||
1495 | out_unmap: | 1494 | out_unmap: |
1496 | of_iounmap(&op->resource[0], up->port.membase, up->reg_size); | 1495 | of_iounmap(&op->resource[0], up->port.membase, up->reg_size); |
1497 | return err; | 1496 | return err; |
1498 | } | 1497 | } |
1499 | 1498 | ||
1500 | static int __devexit su_remove(struct platform_device *op) | 1499 | static int __devexit su_remove(struct platform_device *op) |
1501 | { | 1500 | { |
1502 | struct uart_sunsu_port *up = dev_get_drvdata(&op->dev); | 1501 | struct uart_sunsu_port *up = dev_get_drvdata(&op->dev); |
1503 | bool kbdms = false; | 1502 | bool kbdms = false; |
1504 | 1503 | ||
1505 | if (up->su_type == SU_PORT_MS || | 1504 | if (up->su_type == SU_PORT_MS || |
1506 | up->su_type == SU_PORT_KBD) | 1505 | up->su_type == SU_PORT_KBD) |
1507 | kbdms = true; | 1506 | kbdms = true; |
1508 | 1507 | ||
1509 | if (kbdms) { | 1508 | if (kbdms) { |
1510 | #ifdef CONFIG_SERIO | 1509 | #ifdef CONFIG_SERIO |
1511 | serio_unregister_port(&up->serio); | 1510 | serio_unregister_port(&up->serio); |
1512 | #endif | 1511 | #endif |
1513 | } else if (up->port.type != PORT_UNKNOWN) | 1512 | } else if (up->port.type != PORT_UNKNOWN) |
1514 | uart_remove_one_port(&sunsu_reg, &up->port); | 1513 | uart_remove_one_port(&sunsu_reg, &up->port); |
1515 | 1514 | ||
1516 | if (up->port.membase) | 1515 | if (up->port.membase) |
1517 | of_iounmap(&op->resource[0], up->port.membase, up->reg_size); | 1516 | of_iounmap(&op->resource[0], up->port.membase, up->reg_size); |
1518 | 1517 | ||
1519 | if (kbdms) | 1518 | if (kbdms) |
1520 | kfree(up); | 1519 | kfree(up); |
1521 | 1520 | ||
1522 | dev_set_drvdata(&op->dev, NULL); | 1521 | dev_set_drvdata(&op->dev, NULL); |
1523 | 1522 | ||
1524 | return 0; | 1523 | return 0; |
1525 | } | 1524 | } |
1526 | 1525 | ||
1527 | static const struct of_device_id su_match[] = { | 1526 | static const struct of_device_id su_match[] = { |
1528 | { | 1527 | { |
1529 | .name = "su", | 1528 | .name = "su", |
1530 | }, | 1529 | }, |
1531 | { | 1530 | { |
1532 | .name = "su_pnp", | 1531 | .name = "su_pnp", |
1533 | }, | 1532 | }, |
1534 | { | 1533 | { |
1535 | .name = "serial", | 1534 | .name = "serial", |
1536 | .compatible = "su", | 1535 | .compatible = "su", |
1537 | }, | 1536 | }, |
1538 | { | 1537 | { |
1539 | .type = "serial", | 1538 | .type = "serial", |
1540 | .compatible = "su", | 1539 | .compatible = "su", |
1541 | }, | 1540 | }, |
1542 | {}, | 1541 | {}, |
1543 | }; | 1542 | }; |
1544 | MODULE_DEVICE_TABLE(of, su_match); | 1543 | MODULE_DEVICE_TABLE(of, su_match); |
1545 | 1544 | ||
1546 | static struct platform_driver su_driver = { | 1545 | static struct platform_driver su_driver = { |
1547 | .driver = { | 1546 | .driver = { |
1548 | .name = "su", | 1547 | .name = "su", |
1549 | .owner = THIS_MODULE, | 1548 | .owner = THIS_MODULE, |
1550 | .of_match_table = su_match, | 1549 | .of_match_table = su_match, |
1551 | }, | 1550 | }, |
1552 | .probe = su_probe, | 1551 | .probe = su_probe, |
1553 | .remove = __devexit_p(su_remove), | 1552 | .remove = __devexit_p(su_remove), |
1554 | }; | 1553 | }; |
1555 | 1554 | ||
1556 | static int __init sunsu_init(void) | 1555 | static int __init sunsu_init(void) |
1557 | { | 1556 | { |
1558 | struct device_node *dp; | 1557 | struct device_node *dp; |
1559 | int err; | 1558 | int err; |
1560 | int num_uart = 0; | 1559 | int num_uart = 0; |
1561 | 1560 | ||
1562 | for_each_node_by_name(dp, "su") { | 1561 | for_each_node_by_name(dp, "su") { |
1563 | if (su_get_type(dp) == SU_PORT_PORT) | 1562 | if (su_get_type(dp) == SU_PORT_PORT) |
1564 | num_uart++; | 1563 | num_uart++; |
1565 | } | 1564 | } |
1566 | for_each_node_by_name(dp, "su_pnp") { | 1565 | for_each_node_by_name(dp, "su_pnp") { |
1567 | if (su_get_type(dp) == SU_PORT_PORT) | 1566 | if (su_get_type(dp) == SU_PORT_PORT) |
1568 | num_uart++; | 1567 | num_uart++; |
1569 | } | 1568 | } |
1570 | for_each_node_by_name(dp, "serial") { | 1569 | for_each_node_by_name(dp, "serial") { |
1571 | if (of_device_is_compatible(dp, "su")) { | 1570 | if (of_device_is_compatible(dp, "su")) { |
1572 | if (su_get_type(dp) == SU_PORT_PORT) | 1571 | if (su_get_type(dp) == SU_PORT_PORT) |
1573 | num_uart++; | 1572 | num_uart++; |
1574 | } | 1573 | } |
1575 | } | 1574 | } |
1576 | for_each_node_by_type(dp, "serial") { | 1575 | for_each_node_by_type(dp, "serial") { |
1577 | if (of_device_is_compatible(dp, "su")) { | 1576 | if (of_device_is_compatible(dp, "su")) { |
1578 | if (su_get_type(dp) == SU_PORT_PORT) | 1577 | if (su_get_type(dp) == SU_PORT_PORT) |
1579 | num_uart++; | 1578 | num_uart++; |
1580 | } | 1579 | } |
1581 | } | 1580 | } |
1582 | 1581 | ||
1583 | if (num_uart) { | 1582 | if (num_uart) { |
1584 | err = sunserial_register_minors(&sunsu_reg, num_uart); | 1583 | err = sunserial_register_minors(&sunsu_reg, num_uart); |
1585 | if (err) | 1584 | if (err) |
1586 | return err; | 1585 | return err; |
1587 | } | 1586 | } |
1588 | 1587 | ||
1589 | err = platform_driver_register(&su_driver); | 1588 | err = platform_driver_register(&su_driver); |
1590 | if (err && num_uart) | 1589 | if (err && num_uart) |
1591 | sunserial_unregister_minors(&sunsu_reg, num_uart); | 1590 | sunserial_unregister_minors(&sunsu_reg, num_uart); |
1592 | 1591 | ||
1593 | return err; | 1592 | return err; |
1594 | } | 1593 | } |
1595 | 1594 | ||
1596 | static void __exit sunsu_exit(void) | 1595 | static void __exit sunsu_exit(void) |
1597 | { | 1596 | { |
1598 | if (sunsu_reg.nr) | 1597 | if (sunsu_reg.nr) |
1599 | sunserial_unregister_minors(&sunsu_reg, sunsu_reg.nr); | 1598 | sunserial_unregister_minors(&sunsu_reg, sunsu_reg.nr); |
1600 | } | 1599 | } |
1601 | 1600 | ||
1602 | module_init(sunsu_init); | 1601 | module_init(sunsu_init); |
1603 | module_exit(sunsu_exit); | 1602 | module_exit(sunsu_exit); |
1604 | 1603 | ||
1605 | MODULE_AUTHOR("Eddie C. Dost, Peter Zaitcev, and David S. Miller"); | 1604 | MODULE_AUTHOR("Eddie C. Dost, Peter Zaitcev, and David S. Miller"); |
1606 | MODULE_DESCRIPTION("Sun SU serial port driver"); | 1605 | MODULE_DESCRIPTION("Sun SU serial port driver"); |
1607 | MODULE_VERSION("2.0"); | 1606 | MODULE_VERSION("2.0"); |
1608 | MODULE_LICENSE("GPL"); | 1607 | MODULE_LICENSE("GPL"); |
1609 | 1608 |
drivers/tty/serial/sunzilog.c
1 | /* sunzilog.c: Zilog serial driver for Sparc systems. | 1 | /* sunzilog.c: Zilog serial driver for Sparc systems. |
2 | * | 2 | * |
3 | * Driver for Zilog serial chips found on Sun workstations and | 3 | * Driver for Zilog serial chips found on Sun workstations and |
4 | * servers. This driver could actually be made more generic. | 4 | * servers. This driver could actually be made more generic. |
5 | * | 5 | * |
6 | * This is based on the old drivers/sbus/char/zs.c code. A lot | 6 | * This is based on the old drivers/sbus/char/zs.c code. A lot |
7 | * of code has been simply moved over directly from there but | 7 | * of code has been simply moved over directly from there but |
8 | * much has been rewritten. Credits therefore go out to Eddie | 8 | * much has been rewritten. Credits therefore go out to Eddie |
9 | * C. Dost, Pete Zaitcev, Ted Ts'o and Alex Buell for their | 9 | * C. Dost, Pete Zaitcev, Ted Ts'o and Alex Buell for their |
10 | * work there. | 10 | * work there. |
11 | * | 11 | * |
12 | * Copyright (C) 2002, 2006, 2007 David S. Miller (davem@davemloft.net) | 12 | * Copyright (C) 2002, 2006, 2007 David S. Miller (davem@davemloft.net) |
13 | */ | 13 | */ |
14 | 14 | ||
15 | #include <linux/module.h> | 15 | #include <linux/module.h> |
16 | #include <linux/kernel.h> | 16 | #include <linux/kernel.h> |
17 | #include <linux/errno.h> | 17 | #include <linux/errno.h> |
18 | #include <linux/delay.h> | 18 | #include <linux/delay.h> |
19 | #include <linux/tty.h> | 19 | #include <linux/tty.h> |
20 | #include <linux/tty_flip.h> | 20 | #include <linux/tty_flip.h> |
21 | #include <linux/major.h> | 21 | #include <linux/major.h> |
22 | #include <linux/string.h> | 22 | #include <linux/string.h> |
23 | #include <linux/ptrace.h> | 23 | #include <linux/ptrace.h> |
24 | #include <linux/ioport.h> | 24 | #include <linux/ioport.h> |
25 | #include <linux/slab.h> | 25 | #include <linux/slab.h> |
26 | #include <linux/circ_buf.h> | 26 | #include <linux/circ_buf.h> |
27 | #include <linux/serial.h> | 27 | #include <linux/serial.h> |
28 | #include <linux/sysrq.h> | 28 | #include <linux/sysrq.h> |
29 | #include <linux/console.h> | 29 | #include <linux/console.h> |
30 | #include <linux/spinlock.h> | 30 | #include <linux/spinlock.h> |
31 | #ifdef CONFIG_SERIO | 31 | #ifdef CONFIG_SERIO |
32 | #include <linux/serio.h> | 32 | #include <linux/serio.h> |
33 | #endif | 33 | #endif |
34 | #include <linux/init.h> | 34 | #include <linux/init.h> |
35 | #include <linux/of_device.h> | 35 | #include <linux/of_device.h> |
36 | 36 | ||
37 | #include <asm/io.h> | 37 | #include <asm/io.h> |
38 | #include <asm/irq.h> | 38 | #include <asm/irq.h> |
39 | #include <asm/prom.h> | 39 | #include <asm/prom.h> |
40 | 40 | ||
41 | #if defined(CONFIG_SERIAL_SUNZILOG_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) | 41 | #if defined(CONFIG_SERIAL_SUNZILOG_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) |
42 | #define SUPPORT_SYSRQ | 42 | #define SUPPORT_SYSRQ |
43 | #endif | 43 | #endif |
44 | 44 | ||
45 | #include <linux/serial_core.h> | 45 | #include <linux/serial_core.h> |
46 | #include <linux/sunserialcore.h> | ||
46 | 47 | ||
47 | #include "suncore.h" | ||
48 | #include "sunzilog.h" | 48 | #include "sunzilog.h" |
49 | 49 | ||
50 | /* On 32-bit sparcs we need to delay after register accesses | 50 | /* On 32-bit sparcs we need to delay after register accesses |
51 | * to accommodate sun4 systems, but we do not need to flush writes. | 51 | * to accommodate sun4 systems, but we do not need to flush writes. |
52 | * On 64-bit sparc we only need to flush single writes to ensure | 52 | * On 64-bit sparc we only need to flush single writes to ensure |
53 | * completion. | 53 | * completion. |
54 | */ | 54 | */ |
55 | #ifndef CONFIG_SPARC64 | 55 | #ifndef CONFIG_SPARC64 |
56 | #define ZSDELAY() udelay(5) | 56 | #define ZSDELAY() udelay(5) |
57 | #define ZSDELAY_LONG() udelay(20) | 57 | #define ZSDELAY_LONG() udelay(20) |
58 | #define ZS_WSYNC(channel) do { } while (0) | 58 | #define ZS_WSYNC(channel) do { } while (0) |
59 | #else | 59 | #else |
60 | #define ZSDELAY() | 60 | #define ZSDELAY() |
61 | #define ZSDELAY_LONG() | 61 | #define ZSDELAY_LONG() |
62 | #define ZS_WSYNC(__channel) \ | 62 | #define ZS_WSYNC(__channel) \ |
63 | readb(&((__channel)->control)) | 63 | readb(&((__channel)->control)) |
64 | #endif | 64 | #endif |
65 | 65 | ||
66 | #define ZS_CLOCK 4915200 /* Zilog input clock rate. */ | 66 | #define ZS_CLOCK 4915200 /* Zilog input clock rate. */ |
67 | #define ZS_CLOCK_DIVISOR 16 /* Divisor this driver uses. */ | 67 | #define ZS_CLOCK_DIVISOR 16 /* Divisor this driver uses. */ |
68 | 68 | ||
69 | /* | 69 | /* |
70 | * We wrap our port structure around the generic uart_port. | 70 | * We wrap our port structure around the generic uart_port. |
71 | */ | 71 | */ |
72 | struct uart_sunzilog_port { | 72 | struct uart_sunzilog_port { |
73 | struct uart_port port; | 73 | struct uart_port port; |
74 | 74 | ||
75 | /* IRQ servicing chain. */ | 75 | /* IRQ servicing chain. */ |
76 | struct uart_sunzilog_port *next; | 76 | struct uart_sunzilog_port *next; |
77 | 77 | ||
78 | /* Current values of Zilog write registers. */ | 78 | /* Current values of Zilog write registers. */ |
79 | unsigned char curregs[NUM_ZSREGS]; | 79 | unsigned char curregs[NUM_ZSREGS]; |
80 | 80 | ||
81 | unsigned int flags; | 81 | unsigned int flags; |
82 | #define SUNZILOG_FLAG_CONS_KEYB 0x00000001 | 82 | #define SUNZILOG_FLAG_CONS_KEYB 0x00000001 |
83 | #define SUNZILOG_FLAG_CONS_MOUSE 0x00000002 | 83 | #define SUNZILOG_FLAG_CONS_MOUSE 0x00000002 |
84 | #define SUNZILOG_FLAG_IS_CONS 0x00000004 | 84 | #define SUNZILOG_FLAG_IS_CONS 0x00000004 |
85 | #define SUNZILOG_FLAG_IS_KGDB 0x00000008 | 85 | #define SUNZILOG_FLAG_IS_KGDB 0x00000008 |
86 | #define SUNZILOG_FLAG_MODEM_STATUS 0x00000010 | 86 | #define SUNZILOG_FLAG_MODEM_STATUS 0x00000010 |
87 | #define SUNZILOG_FLAG_IS_CHANNEL_A 0x00000020 | 87 | #define SUNZILOG_FLAG_IS_CHANNEL_A 0x00000020 |
88 | #define SUNZILOG_FLAG_REGS_HELD 0x00000040 | 88 | #define SUNZILOG_FLAG_REGS_HELD 0x00000040 |
89 | #define SUNZILOG_FLAG_TX_STOPPED 0x00000080 | 89 | #define SUNZILOG_FLAG_TX_STOPPED 0x00000080 |
90 | #define SUNZILOG_FLAG_TX_ACTIVE 0x00000100 | 90 | #define SUNZILOG_FLAG_TX_ACTIVE 0x00000100 |
91 | #define SUNZILOG_FLAG_ESCC 0x00000200 | 91 | #define SUNZILOG_FLAG_ESCC 0x00000200 |
92 | #define SUNZILOG_FLAG_ISR_HANDLER 0x00000400 | 92 | #define SUNZILOG_FLAG_ISR_HANDLER 0x00000400 |
93 | 93 | ||
94 | unsigned int cflag; | 94 | unsigned int cflag; |
95 | 95 | ||
96 | unsigned char parity_mask; | 96 | unsigned char parity_mask; |
97 | unsigned char prev_status; | 97 | unsigned char prev_status; |
98 | 98 | ||
99 | #ifdef CONFIG_SERIO | 99 | #ifdef CONFIG_SERIO |
100 | struct serio serio; | 100 | struct serio serio; |
101 | int serio_open; | 101 | int serio_open; |
102 | #endif | 102 | #endif |
103 | }; | 103 | }; |
104 | 104 | ||
105 | static void sunzilog_putchar(struct uart_port *port, int ch); | 105 | static void sunzilog_putchar(struct uart_port *port, int ch); |
106 | 106 | ||
107 | #define ZILOG_CHANNEL_FROM_PORT(PORT) ((struct zilog_channel __iomem *)((PORT)->membase)) | 107 | #define ZILOG_CHANNEL_FROM_PORT(PORT) ((struct zilog_channel __iomem *)((PORT)->membase)) |
108 | #define UART_ZILOG(PORT) ((struct uart_sunzilog_port *)(PORT)) | 108 | #define UART_ZILOG(PORT) ((struct uart_sunzilog_port *)(PORT)) |
109 | 109 | ||
110 | #define ZS_IS_KEYB(UP) ((UP)->flags & SUNZILOG_FLAG_CONS_KEYB) | 110 | #define ZS_IS_KEYB(UP) ((UP)->flags & SUNZILOG_FLAG_CONS_KEYB) |
111 | #define ZS_IS_MOUSE(UP) ((UP)->flags & SUNZILOG_FLAG_CONS_MOUSE) | 111 | #define ZS_IS_MOUSE(UP) ((UP)->flags & SUNZILOG_FLAG_CONS_MOUSE) |
112 | #define ZS_IS_CONS(UP) ((UP)->flags & SUNZILOG_FLAG_IS_CONS) | 112 | #define ZS_IS_CONS(UP) ((UP)->flags & SUNZILOG_FLAG_IS_CONS) |
113 | #define ZS_IS_KGDB(UP) ((UP)->flags & SUNZILOG_FLAG_IS_KGDB) | 113 | #define ZS_IS_KGDB(UP) ((UP)->flags & SUNZILOG_FLAG_IS_KGDB) |
114 | #define ZS_WANTS_MODEM_STATUS(UP) ((UP)->flags & SUNZILOG_FLAG_MODEM_STATUS) | 114 | #define ZS_WANTS_MODEM_STATUS(UP) ((UP)->flags & SUNZILOG_FLAG_MODEM_STATUS) |
115 | #define ZS_IS_CHANNEL_A(UP) ((UP)->flags & SUNZILOG_FLAG_IS_CHANNEL_A) | 115 | #define ZS_IS_CHANNEL_A(UP) ((UP)->flags & SUNZILOG_FLAG_IS_CHANNEL_A) |
116 | #define ZS_REGS_HELD(UP) ((UP)->flags & SUNZILOG_FLAG_REGS_HELD) | 116 | #define ZS_REGS_HELD(UP) ((UP)->flags & SUNZILOG_FLAG_REGS_HELD) |
117 | #define ZS_TX_STOPPED(UP) ((UP)->flags & SUNZILOG_FLAG_TX_STOPPED) | 117 | #define ZS_TX_STOPPED(UP) ((UP)->flags & SUNZILOG_FLAG_TX_STOPPED) |
118 | #define ZS_TX_ACTIVE(UP) ((UP)->flags & SUNZILOG_FLAG_TX_ACTIVE) | 118 | #define ZS_TX_ACTIVE(UP) ((UP)->flags & SUNZILOG_FLAG_TX_ACTIVE) |
119 | 119 | ||
120 | /* Reading and writing Zilog8530 registers. The delays are to make this | 120 | /* Reading and writing Zilog8530 registers. The delays are to make this |
121 | * driver work on the Sun4 which needs a settling delay after each chip | 121 | * driver work on the Sun4 which needs a settling delay after each chip |
122 | * register access, other machines handle this in hardware via auxiliary | 122 | * register access, other machines handle this in hardware via auxiliary |
123 | * flip-flops which implement the settle time we do in software. | 123 | * flip-flops which implement the settle time we do in software. |
124 | * | 124 | * |
125 | * The port lock must be held and local IRQs must be disabled | 125 | * The port lock must be held and local IRQs must be disabled |
126 | * when {read,write}_zsreg is invoked. | 126 | * when {read,write}_zsreg is invoked. |
127 | */ | 127 | */ |
128 | static unsigned char read_zsreg(struct zilog_channel __iomem *channel, | 128 | static unsigned char read_zsreg(struct zilog_channel __iomem *channel, |
129 | unsigned char reg) | 129 | unsigned char reg) |
130 | { | 130 | { |
131 | unsigned char retval; | 131 | unsigned char retval; |
132 | 132 | ||
133 | writeb(reg, &channel->control); | 133 | writeb(reg, &channel->control); |
134 | ZSDELAY(); | 134 | ZSDELAY(); |
135 | retval = readb(&channel->control); | 135 | retval = readb(&channel->control); |
136 | ZSDELAY(); | 136 | ZSDELAY(); |
137 | 137 | ||
138 | return retval; | 138 | return retval; |
139 | } | 139 | } |
140 | 140 | ||
141 | static void write_zsreg(struct zilog_channel __iomem *channel, | 141 | static void write_zsreg(struct zilog_channel __iomem *channel, |
142 | unsigned char reg, unsigned char value) | 142 | unsigned char reg, unsigned char value) |
143 | { | 143 | { |
144 | writeb(reg, &channel->control); | 144 | writeb(reg, &channel->control); |
145 | ZSDELAY(); | 145 | ZSDELAY(); |
146 | writeb(value, &channel->control); | 146 | writeb(value, &channel->control); |
147 | ZSDELAY(); | 147 | ZSDELAY(); |
148 | } | 148 | } |
149 | 149 | ||
150 | static void sunzilog_clear_fifo(struct zilog_channel __iomem *channel) | 150 | static void sunzilog_clear_fifo(struct zilog_channel __iomem *channel) |
151 | { | 151 | { |
152 | int i; | 152 | int i; |
153 | 153 | ||
154 | for (i = 0; i < 32; i++) { | 154 | for (i = 0; i < 32; i++) { |
155 | unsigned char regval; | 155 | unsigned char regval; |
156 | 156 | ||
157 | regval = readb(&channel->control); | 157 | regval = readb(&channel->control); |
158 | ZSDELAY(); | 158 | ZSDELAY(); |
159 | if (regval & Rx_CH_AV) | 159 | if (regval & Rx_CH_AV) |
160 | break; | 160 | break; |
161 | 161 | ||
162 | regval = read_zsreg(channel, R1); | 162 | regval = read_zsreg(channel, R1); |
163 | readb(&channel->data); | 163 | readb(&channel->data); |
164 | ZSDELAY(); | 164 | ZSDELAY(); |
165 | 165 | ||
166 | if (regval & (PAR_ERR | Rx_OVR | CRC_ERR)) { | 166 | if (regval & (PAR_ERR | Rx_OVR | CRC_ERR)) { |
167 | writeb(ERR_RES, &channel->control); | 167 | writeb(ERR_RES, &channel->control); |
168 | ZSDELAY(); | 168 | ZSDELAY(); |
169 | ZS_WSYNC(channel); | 169 | ZS_WSYNC(channel); |
170 | } | 170 | } |
171 | } | 171 | } |
172 | } | 172 | } |
173 | 173 | ||
174 | /* This function must only be called when the TX is not busy. The UART | 174 | /* This function must only be called when the TX is not busy. The UART |
175 | * port lock must be held and local interrupts disabled. | 175 | * port lock must be held and local interrupts disabled. |
176 | */ | 176 | */ |
177 | static int __load_zsregs(struct zilog_channel __iomem *channel, unsigned char *regs) | 177 | static int __load_zsregs(struct zilog_channel __iomem *channel, unsigned char *regs) |
178 | { | 178 | { |
179 | int i; | 179 | int i; |
180 | int escc; | 180 | int escc; |
181 | unsigned char r15; | 181 | unsigned char r15; |
182 | 182 | ||
183 | /* Let pending transmits finish. */ | 183 | /* Let pending transmits finish. */ |
184 | for (i = 0; i < 1000; i++) { | 184 | for (i = 0; i < 1000; i++) { |
185 | unsigned char stat = read_zsreg(channel, R1); | 185 | unsigned char stat = read_zsreg(channel, R1); |
186 | if (stat & ALL_SNT) | 186 | if (stat & ALL_SNT) |
187 | break; | 187 | break; |
188 | udelay(100); | 188 | udelay(100); |
189 | } | 189 | } |
190 | 190 | ||
191 | writeb(ERR_RES, &channel->control); | 191 | writeb(ERR_RES, &channel->control); |
192 | ZSDELAY(); | 192 | ZSDELAY(); |
193 | ZS_WSYNC(channel); | 193 | ZS_WSYNC(channel); |
194 | 194 | ||
195 | sunzilog_clear_fifo(channel); | 195 | sunzilog_clear_fifo(channel); |
196 | 196 | ||
197 | /* Disable all interrupts. */ | 197 | /* Disable all interrupts. */ |
198 | write_zsreg(channel, R1, | 198 | write_zsreg(channel, R1, |
199 | regs[R1] & ~(RxINT_MASK | TxINT_ENAB | EXT_INT_ENAB)); | 199 | regs[R1] & ~(RxINT_MASK | TxINT_ENAB | EXT_INT_ENAB)); |
200 | 200 | ||
201 | /* Set parity, sync config, stop bits, and clock divisor. */ | 201 | /* Set parity, sync config, stop bits, and clock divisor. */ |
202 | write_zsreg(channel, R4, regs[R4]); | 202 | write_zsreg(channel, R4, regs[R4]); |
203 | 203 | ||
204 | /* Set misc. TX/RX control bits. */ | 204 | /* Set misc. TX/RX control bits. */ |
205 | write_zsreg(channel, R10, regs[R10]); | 205 | write_zsreg(channel, R10, regs[R10]); |
206 | 206 | ||
207 | /* Set TX/RX controls sans the enable bits. */ | 207 | /* Set TX/RX controls sans the enable bits. */ |
208 | write_zsreg(channel, R3, regs[R3] & ~RxENAB); | 208 | write_zsreg(channel, R3, regs[R3] & ~RxENAB); |
209 | write_zsreg(channel, R5, regs[R5] & ~TxENAB); | 209 | write_zsreg(channel, R5, regs[R5] & ~TxENAB); |
210 | 210 | ||
211 | /* Synchronous mode config. */ | 211 | /* Synchronous mode config. */ |
212 | write_zsreg(channel, R6, regs[R6]); | 212 | write_zsreg(channel, R6, regs[R6]); |
213 | write_zsreg(channel, R7, regs[R7]); | 213 | write_zsreg(channel, R7, regs[R7]); |
214 | 214 | ||
215 | /* Don't mess with the interrupt vector (R2, unused by us) and | 215 | /* Don't mess with the interrupt vector (R2, unused by us) and |
216 | * master interrupt control (R9). We make sure this is setup | 216 | * master interrupt control (R9). We make sure this is setup |
217 | * properly at probe time then never touch it again. | 217 | * properly at probe time then never touch it again. |
218 | */ | 218 | */ |
219 | 219 | ||
220 | /* Disable baud generator. */ | 220 | /* Disable baud generator. */ |
221 | write_zsreg(channel, R14, regs[R14] & ~BRENAB); | 221 | write_zsreg(channel, R14, regs[R14] & ~BRENAB); |
222 | 222 | ||
223 | /* Clock mode control. */ | 223 | /* Clock mode control. */ |
224 | write_zsreg(channel, R11, regs[R11]); | 224 | write_zsreg(channel, R11, regs[R11]); |
225 | 225 | ||
226 | /* Lower and upper byte of baud rate generator divisor. */ | 226 | /* Lower and upper byte of baud rate generator divisor. */ |
227 | write_zsreg(channel, R12, regs[R12]); | 227 | write_zsreg(channel, R12, regs[R12]); |
228 | write_zsreg(channel, R13, regs[R13]); | 228 | write_zsreg(channel, R13, regs[R13]); |
229 | 229 | ||
230 | /* Now rewrite R14, with BRENAB (if set). */ | 230 | /* Now rewrite R14, with BRENAB (if set). */ |
231 | write_zsreg(channel, R14, regs[R14]); | 231 | write_zsreg(channel, R14, regs[R14]); |
232 | 232 | ||
233 | /* External status interrupt control. */ | 233 | /* External status interrupt control. */ |
234 | write_zsreg(channel, R15, (regs[R15] | WR7pEN) & ~FIFOEN); | 234 | write_zsreg(channel, R15, (regs[R15] | WR7pEN) & ~FIFOEN); |
235 | 235 | ||
236 | /* ESCC Extension Register */ | 236 | /* ESCC Extension Register */ |
237 | r15 = read_zsreg(channel, R15); | 237 | r15 = read_zsreg(channel, R15); |
238 | if (r15 & 0x01) { | 238 | if (r15 & 0x01) { |
239 | write_zsreg(channel, R7, regs[R7p]); | 239 | write_zsreg(channel, R7, regs[R7p]); |
240 | 240 | ||
241 | /* External status interrupt and FIFO control. */ | 241 | /* External status interrupt and FIFO control. */ |
242 | write_zsreg(channel, R15, regs[R15] & ~WR7pEN); | 242 | write_zsreg(channel, R15, regs[R15] & ~WR7pEN); |
243 | escc = 1; | 243 | escc = 1; |
244 | } else { | 244 | } else { |
245 | /* Clear FIFO bit case it is an issue */ | 245 | /* Clear FIFO bit case it is an issue */ |
246 | regs[R15] &= ~FIFOEN; | 246 | regs[R15] &= ~FIFOEN; |
247 | escc = 0; | 247 | escc = 0; |
248 | } | 248 | } |
249 | 249 | ||
250 | /* Reset external status interrupts. */ | 250 | /* Reset external status interrupts. */ |
251 | write_zsreg(channel, R0, RES_EXT_INT); /* First Latch */ | 251 | write_zsreg(channel, R0, RES_EXT_INT); /* First Latch */ |
252 | write_zsreg(channel, R0, RES_EXT_INT); /* Second Latch */ | 252 | write_zsreg(channel, R0, RES_EXT_INT); /* Second Latch */ |
253 | 253 | ||
254 | /* Rewrite R3/R5, this time without enables masked. */ | 254 | /* Rewrite R3/R5, this time without enables masked. */ |
255 | write_zsreg(channel, R3, regs[R3]); | 255 | write_zsreg(channel, R3, regs[R3]); |
256 | write_zsreg(channel, R5, regs[R5]); | 256 | write_zsreg(channel, R5, regs[R5]); |
257 | 257 | ||
258 | /* Rewrite R1, this time without IRQ enabled masked. */ | 258 | /* Rewrite R1, this time without IRQ enabled masked. */ |
259 | write_zsreg(channel, R1, regs[R1]); | 259 | write_zsreg(channel, R1, regs[R1]); |
260 | 260 | ||
261 | return escc; | 261 | return escc; |
262 | } | 262 | } |
263 | 263 | ||
264 | /* Reprogram the Zilog channel HW registers with the copies found in the | 264 | /* Reprogram the Zilog channel HW registers with the copies found in the |
265 | * software state struct. If the transmitter is busy, we defer this update | 265 | * software state struct. If the transmitter is busy, we defer this update |
266 | * until the next TX complete interrupt. Else, we do it right now. | 266 | * until the next TX complete interrupt. Else, we do it right now. |
267 | * | 267 | * |
268 | * The UART port lock must be held and local interrupts disabled. | 268 | * The UART port lock must be held and local interrupts disabled. |
269 | */ | 269 | */ |
270 | static void sunzilog_maybe_update_regs(struct uart_sunzilog_port *up, | 270 | static void sunzilog_maybe_update_regs(struct uart_sunzilog_port *up, |
271 | struct zilog_channel __iomem *channel) | 271 | struct zilog_channel __iomem *channel) |
272 | { | 272 | { |
273 | if (!ZS_REGS_HELD(up)) { | 273 | if (!ZS_REGS_HELD(up)) { |
274 | if (ZS_TX_ACTIVE(up)) { | 274 | if (ZS_TX_ACTIVE(up)) { |
275 | up->flags |= SUNZILOG_FLAG_REGS_HELD; | 275 | up->flags |= SUNZILOG_FLAG_REGS_HELD; |
276 | } else { | 276 | } else { |
277 | __load_zsregs(channel, up->curregs); | 277 | __load_zsregs(channel, up->curregs); |
278 | } | 278 | } |
279 | } | 279 | } |
280 | } | 280 | } |
281 | 281 | ||
282 | static void sunzilog_change_mouse_baud(struct uart_sunzilog_port *up) | 282 | static void sunzilog_change_mouse_baud(struct uart_sunzilog_port *up) |
283 | { | 283 | { |
284 | unsigned int cur_cflag = up->cflag; | 284 | unsigned int cur_cflag = up->cflag; |
285 | int brg, new_baud; | 285 | int brg, new_baud; |
286 | 286 | ||
287 | up->cflag &= ~CBAUD; | 287 | up->cflag &= ~CBAUD; |
288 | up->cflag |= suncore_mouse_baud_cflag_next(cur_cflag, &new_baud); | 288 | up->cflag |= suncore_mouse_baud_cflag_next(cur_cflag, &new_baud); |
289 | 289 | ||
290 | brg = BPS_TO_BRG(new_baud, ZS_CLOCK / ZS_CLOCK_DIVISOR); | 290 | brg = BPS_TO_BRG(new_baud, ZS_CLOCK / ZS_CLOCK_DIVISOR); |
291 | up->curregs[R12] = (brg & 0xff); | 291 | up->curregs[R12] = (brg & 0xff); |
292 | up->curregs[R13] = (brg >> 8) & 0xff; | 292 | up->curregs[R13] = (brg >> 8) & 0xff; |
293 | sunzilog_maybe_update_regs(up, ZILOG_CHANNEL_FROM_PORT(&up->port)); | 293 | sunzilog_maybe_update_regs(up, ZILOG_CHANNEL_FROM_PORT(&up->port)); |
294 | } | 294 | } |
295 | 295 | ||
296 | static void sunzilog_kbdms_receive_chars(struct uart_sunzilog_port *up, | 296 | static void sunzilog_kbdms_receive_chars(struct uart_sunzilog_port *up, |
297 | unsigned char ch, int is_break) | 297 | unsigned char ch, int is_break) |
298 | { | 298 | { |
299 | if (ZS_IS_KEYB(up)) { | 299 | if (ZS_IS_KEYB(up)) { |
300 | /* Stop-A is handled by drivers/char/keyboard.c now. */ | 300 | /* Stop-A is handled by drivers/char/keyboard.c now. */ |
301 | #ifdef CONFIG_SERIO | 301 | #ifdef CONFIG_SERIO |
302 | if (up->serio_open) | 302 | if (up->serio_open) |
303 | serio_interrupt(&up->serio, ch, 0); | 303 | serio_interrupt(&up->serio, ch, 0); |
304 | #endif | 304 | #endif |
305 | } else if (ZS_IS_MOUSE(up)) { | 305 | } else if (ZS_IS_MOUSE(up)) { |
306 | int ret = suncore_mouse_baud_detection(ch, is_break); | 306 | int ret = suncore_mouse_baud_detection(ch, is_break); |
307 | 307 | ||
308 | switch (ret) { | 308 | switch (ret) { |
309 | case 2: | 309 | case 2: |
310 | sunzilog_change_mouse_baud(up); | 310 | sunzilog_change_mouse_baud(up); |
311 | /* fallthru */ | 311 | /* fallthru */ |
312 | case 1: | 312 | case 1: |
313 | break; | 313 | break; |
314 | 314 | ||
315 | case 0: | 315 | case 0: |
316 | #ifdef CONFIG_SERIO | 316 | #ifdef CONFIG_SERIO |
317 | if (up->serio_open) | 317 | if (up->serio_open) |
318 | serio_interrupt(&up->serio, ch, 0); | 318 | serio_interrupt(&up->serio, ch, 0); |
319 | #endif | 319 | #endif |
320 | break; | 320 | break; |
321 | }; | 321 | }; |
322 | } | 322 | } |
323 | } | 323 | } |
324 | 324 | ||
325 | static struct tty_struct * | 325 | static struct tty_struct * |
326 | sunzilog_receive_chars(struct uart_sunzilog_port *up, | 326 | sunzilog_receive_chars(struct uart_sunzilog_port *up, |
327 | struct zilog_channel __iomem *channel) | 327 | struct zilog_channel __iomem *channel) |
328 | { | 328 | { |
329 | struct tty_struct *tty; | 329 | struct tty_struct *tty; |
330 | unsigned char ch, r1, flag; | 330 | unsigned char ch, r1, flag; |
331 | 331 | ||
332 | tty = NULL; | 332 | tty = NULL; |
333 | if (up->port.state != NULL && /* Unopened serial console */ | 333 | if (up->port.state != NULL && /* Unopened serial console */ |
334 | up->port.state->port.tty != NULL) /* Keyboard || mouse */ | 334 | up->port.state->port.tty != NULL) /* Keyboard || mouse */ |
335 | tty = up->port.state->port.tty; | 335 | tty = up->port.state->port.tty; |
336 | 336 | ||
337 | for (;;) { | 337 | for (;;) { |
338 | 338 | ||
339 | r1 = read_zsreg(channel, R1); | 339 | r1 = read_zsreg(channel, R1); |
340 | if (r1 & (PAR_ERR | Rx_OVR | CRC_ERR)) { | 340 | if (r1 & (PAR_ERR | Rx_OVR | CRC_ERR)) { |
341 | writeb(ERR_RES, &channel->control); | 341 | writeb(ERR_RES, &channel->control); |
342 | ZSDELAY(); | 342 | ZSDELAY(); |
343 | ZS_WSYNC(channel); | 343 | ZS_WSYNC(channel); |
344 | } | 344 | } |
345 | 345 | ||
346 | ch = readb(&channel->control); | 346 | ch = readb(&channel->control); |
347 | ZSDELAY(); | 347 | ZSDELAY(); |
348 | 348 | ||
349 | /* This funny hack depends upon BRK_ABRT not interfering | 349 | /* This funny hack depends upon BRK_ABRT not interfering |
350 | * with the other bits we care about in R1. | 350 | * with the other bits we care about in R1. |
351 | */ | 351 | */ |
352 | if (ch & BRK_ABRT) | 352 | if (ch & BRK_ABRT) |
353 | r1 |= BRK_ABRT; | 353 | r1 |= BRK_ABRT; |
354 | 354 | ||
355 | if (!(ch & Rx_CH_AV)) | 355 | if (!(ch & Rx_CH_AV)) |
356 | break; | 356 | break; |
357 | 357 | ||
358 | ch = readb(&channel->data); | 358 | ch = readb(&channel->data); |
359 | ZSDELAY(); | 359 | ZSDELAY(); |
360 | 360 | ||
361 | ch &= up->parity_mask; | 361 | ch &= up->parity_mask; |
362 | 362 | ||
363 | if (unlikely(ZS_IS_KEYB(up)) || unlikely(ZS_IS_MOUSE(up))) { | 363 | if (unlikely(ZS_IS_KEYB(up)) || unlikely(ZS_IS_MOUSE(up))) { |
364 | sunzilog_kbdms_receive_chars(up, ch, 0); | 364 | sunzilog_kbdms_receive_chars(up, ch, 0); |
365 | continue; | 365 | continue; |
366 | } | 366 | } |
367 | 367 | ||
368 | if (tty == NULL) { | 368 | if (tty == NULL) { |
369 | uart_handle_sysrq_char(&up->port, ch); | 369 | uart_handle_sysrq_char(&up->port, ch); |
370 | continue; | 370 | continue; |
371 | } | 371 | } |
372 | 372 | ||
373 | /* A real serial line, record the character and status. */ | 373 | /* A real serial line, record the character and status. */ |
374 | flag = TTY_NORMAL; | 374 | flag = TTY_NORMAL; |
375 | up->port.icount.rx++; | 375 | up->port.icount.rx++; |
376 | if (r1 & (BRK_ABRT | PAR_ERR | Rx_OVR | CRC_ERR)) { | 376 | if (r1 & (BRK_ABRT | PAR_ERR | Rx_OVR | CRC_ERR)) { |
377 | if (r1 & BRK_ABRT) { | 377 | if (r1 & BRK_ABRT) { |
378 | r1 &= ~(PAR_ERR | CRC_ERR); | 378 | r1 &= ~(PAR_ERR | CRC_ERR); |
379 | up->port.icount.brk++; | 379 | up->port.icount.brk++; |
380 | if (uart_handle_break(&up->port)) | 380 | if (uart_handle_break(&up->port)) |
381 | continue; | 381 | continue; |
382 | } | 382 | } |
383 | else if (r1 & PAR_ERR) | 383 | else if (r1 & PAR_ERR) |
384 | up->port.icount.parity++; | 384 | up->port.icount.parity++; |
385 | else if (r1 & CRC_ERR) | 385 | else if (r1 & CRC_ERR) |
386 | up->port.icount.frame++; | 386 | up->port.icount.frame++; |
387 | if (r1 & Rx_OVR) | 387 | if (r1 & Rx_OVR) |
388 | up->port.icount.overrun++; | 388 | up->port.icount.overrun++; |
389 | r1 &= up->port.read_status_mask; | 389 | r1 &= up->port.read_status_mask; |
390 | if (r1 & BRK_ABRT) | 390 | if (r1 & BRK_ABRT) |
391 | flag = TTY_BREAK; | 391 | flag = TTY_BREAK; |
392 | else if (r1 & PAR_ERR) | 392 | else if (r1 & PAR_ERR) |
393 | flag = TTY_PARITY; | 393 | flag = TTY_PARITY; |
394 | else if (r1 & CRC_ERR) | 394 | else if (r1 & CRC_ERR) |
395 | flag = TTY_FRAME; | 395 | flag = TTY_FRAME; |
396 | } | 396 | } |
397 | if (uart_handle_sysrq_char(&up->port, ch)) | 397 | if (uart_handle_sysrq_char(&up->port, ch)) |
398 | continue; | 398 | continue; |
399 | 399 | ||
400 | if (up->port.ignore_status_mask == 0xff || | 400 | if (up->port.ignore_status_mask == 0xff || |
401 | (r1 & up->port.ignore_status_mask) == 0) { | 401 | (r1 & up->port.ignore_status_mask) == 0) { |
402 | tty_insert_flip_char(tty, ch, flag); | 402 | tty_insert_flip_char(tty, ch, flag); |
403 | } | 403 | } |
404 | if (r1 & Rx_OVR) | 404 | if (r1 & Rx_OVR) |
405 | tty_insert_flip_char(tty, 0, TTY_OVERRUN); | 405 | tty_insert_flip_char(tty, 0, TTY_OVERRUN); |
406 | } | 406 | } |
407 | 407 | ||
408 | return tty; | 408 | return tty; |
409 | } | 409 | } |
410 | 410 | ||
411 | static void sunzilog_status_handle(struct uart_sunzilog_port *up, | 411 | static void sunzilog_status_handle(struct uart_sunzilog_port *up, |
412 | struct zilog_channel __iomem *channel) | 412 | struct zilog_channel __iomem *channel) |
413 | { | 413 | { |
414 | unsigned char status; | 414 | unsigned char status; |
415 | 415 | ||
416 | status = readb(&channel->control); | 416 | status = readb(&channel->control); |
417 | ZSDELAY(); | 417 | ZSDELAY(); |
418 | 418 | ||
419 | writeb(RES_EXT_INT, &channel->control); | 419 | writeb(RES_EXT_INT, &channel->control); |
420 | ZSDELAY(); | 420 | ZSDELAY(); |
421 | ZS_WSYNC(channel); | 421 | ZS_WSYNC(channel); |
422 | 422 | ||
423 | if (status & BRK_ABRT) { | 423 | if (status & BRK_ABRT) { |
424 | if (ZS_IS_MOUSE(up)) | 424 | if (ZS_IS_MOUSE(up)) |
425 | sunzilog_kbdms_receive_chars(up, 0, 1); | 425 | sunzilog_kbdms_receive_chars(up, 0, 1); |
426 | if (ZS_IS_CONS(up)) { | 426 | if (ZS_IS_CONS(up)) { |
427 | /* Wait for BREAK to deassert to avoid potentially | 427 | /* Wait for BREAK to deassert to avoid potentially |
428 | * confusing the PROM. | 428 | * confusing the PROM. |
429 | */ | 429 | */ |
430 | while (1) { | 430 | while (1) { |
431 | status = readb(&channel->control); | 431 | status = readb(&channel->control); |
432 | ZSDELAY(); | 432 | ZSDELAY(); |
433 | if (!(status & BRK_ABRT)) | 433 | if (!(status & BRK_ABRT)) |
434 | break; | 434 | break; |
435 | } | 435 | } |
436 | sun_do_break(); | 436 | sun_do_break(); |
437 | return; | 437 | return; |
438 | } | 438 | } |
439 | } | 439 | } |
440 | 440 | ||
441 | if (ZS_WANTS_MODEM_STATUS(up)) { | 441 | if (ZS_WANTS_MODEM_STATUS(up)) { |
442 | if (status & SYNC) | 442 | if (status & SYNC) |
443 | up->port.icount.dsr++; | 443 | up->port.icount.dsr++; |
444 | 444 | ||
445 | /* The Zilog just gives us an interrupt when DCD/CTS/etc. change. | 445 | /* The Zilog just gives us an interrupt when DCD/CTS/etc. change. |
446 | * But it does not tell us which bit has changed, we have to keep | 446 | * But it does not tell us which bit has changed, we have to keep |
447 | * track of this ourselves. | 447 | * track of this ourselves. |
448 | */ | 448 | */ |
449 | if ((status ^ up->prev_status) ^ DCD) | 449 | if ((status ^ up->prev_status) ^ DCD) |
450 | uart_handle_dcd_change(&up->port, | 450 | uart_handle_dcd_change(&up->port, |
451 | (status & DCD)); | 451 | (status & DCD)); |
452 | if ((status ^ up->prev_status) ^ CTS) | 452 | if ((status ^ up->prev_status) ^ CTS) |
453 | uart_handle_cts_change(&up->port, | 453 | uart_handle_cts_change(&up->port, |
454 | (status & CTS)); | 454 | (status & CTS)); |
455 | 455 | ||
456 | wake_up_interruptible(&up->port.state->port.delta_msr_wait); | 456 | wake_up_interruptible(&up->port.state->port.delta_msr_wait); |
457 | } | 457 | } |
458 | 458 | ||
459 | up->prev_status = status; | 459 | up->prev_status = status; |
460 | } | 460 | } |
461 | 461 | ||
462 | static void sunzilog_transmit_chars(struct uart_sunzilog_port *up, | 462 | static void sunzilog_transmit_chars(struct uart_sunzilog_port *up, |
463 | struct zilog_channel __iomem *channel) | 463 | struct zilog_channel __iomem *channel) |
464 | { | 464 | { |
465 | struct circ_buf *xmit; | 465 | struct circ_buf *xmit; |
466 | 466 | ||
467 | if (ZS_IS_CONS(up)) { | 467 | if (ZS_IS_CONS(up)) { |
468 | unsigned char status = readb(&channel->control); | 468 | unsigned char status = readb(&channel->control); |
469 | ZSDELAY(); | 469 | ZSDELAY(); |
470 | 470 | ||
471 | /* TX still busy? Just wait for the next TX done interrupt. | 471 | /* TX still busy? Just wait for the next TX done interrupt. |
472 | * | 472 | * |
473 | * It can occur because of how we do serial console writes. It would | 473 | * It can occur because of how we do serial console writes. It would |
474 | * be nice to transmit console writes just like we normally would for | 474 | * be nice to transmit console writes just like we normally would for |
475 | * a TTY line. (ie. buffered and TX interrupt driven). That is not | 475 | * a TTY line. (ie. buffered and TX interrupt driven). That is not |
476 | * easy because console writes cannot sleep. One solution might be | 476 | * easy because console writes cannot sleep. One solution might be |
477 | * to poll on enough port->xmit space becoming free. -DaveM | 477 | * to poll on enough port->xmit space becoming free. -DaveM |
478 | */ | 478 | */ |
479 | if (!(status & Tx_BUF_EMP)) | 479 | if (!(status & Tx_BUF_EMP)) |
480 | return; | 480 | return; |
481 | } | 481 | } |
482 | 482 | ||
483 | up->flags &= ~SUNZILOG_FLAG_TX_ACTIVE; | 483 | up->flags &= ~SUNZILOG_FLAG_TX_ACTIVE; |
484 | 484 | ||
485 | if (ZS_REGS_HELD(up)) { | 485 | if (ZS_REGS_HELD(up)) { |
486 | __load_zsregs(channel, up->curregs); | 486 | __load_zsregs(channel, up->curregs); |
487 | up->flags &= ~SUNZILOG_FLAG_REGS_HELD; | 487 | up->flags &= ~SUNZILOG_FLAG_REGS_HELD; |
488 | } | 488 | } |
489 | 489 | ||
490 | if (ZS_TX_STOPPED(up)) { | 490 | if (ZS_TX_STOPPED(up)) { |
491 | up->flags &= ~SUNZILOG_FLAG_TX_STOPPED; | 491 | up->flags &= ~SUNZILOG_FLAG_TX_STOPPED; |
492 | goto ack_tx_int; | 492 | goto ack_tx_int; |
493 | } | 493 | } |
494 | 494 | ||
495 | if (up->port.x_char) { | 495 | if (up->port.x_char) { |
496 | up->flags |= SUNZILOG_FLAG_TX_ACTIVE; | 496 | up->flags |= SUNZILOG_FLAG_TX_ACTIVE; |
497 | writeb(up->port.x_char, &channel->data); | 497 | writeb(up->port.x_char, &channel->data); |
498 | ZSDELAY(); | 498 | ZSDELAY(); |
499 | ZS_WSYNC(channel); | 499 | ZS_WSYNC(channel); |
500 | 500 | ||
501 | up->port.icount.tx++; | 501 | up->port.icount.tx++; |
502 | up->port.x_char = 0; | 502 | up->port.x_char = 0; |
503 | return; | 503 | return; |
504 | } | 504 | } |
505 | 505 | ||
506 | if (up->port.state == NULL) | 506 | if (up->port.state == NULL) |
507 | goto ack_tx_int; | 507 | goto ack_tx_int; |
508 | xmit = &up->port.state->xmit; | 508 | xmit = &up->port.state->xmit; |
509 | if (uart_circ_empty(xmit)) | 509 | if (uart_circ_empty(xmit)) |
510 | goto ack_tx_int; | 510 | goto ack_tx_int; |
511 | 511 | ||
512 | if (uart_tx_stopped(&up->port)) | 512 | if (uart_tx_stopped(&up->port)) |
513 | goto ack_tx_int; | 513 | goto ack_tx_int; |
514 | 514 | ||
515 | up->flags |= SUNZILOG_FLAG_TX_ACTIVE; | 515 | up->flags |= SUNZILOG_FLAG_TX_ACTIVE; |
516 | writeb(xmit->buf[xmit->tail], &channel->data); | 516 | writeb(xmit->buf[xmit->tail], &channel->data); |
517 | ZSDELAY(); | 517 | ZSDELAY(); |
518 | ZS_WSYNC(channel); | 518 | ZS_WSYNC(channel); |
519 | 519 | ||
520 | xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); | 520 | xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); |
521 | up->port.icount.tx++; | 521 | up->port.icount.tx++; |
522 | 522 | ||
523 | if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) | 523 | if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) |
524 | uart_write_wakeup(&up->port); | 524 | uart_write_wakeup(&up->port); |
525 | 525 | ||
526 | return; | 526 | return; |
527 | 527 | ||
528 | ack_tx_int: | 528 | ack_tx_int: |
529 | writeb(RES_Tx_P, &channel->control); | 529 | writeb(RES_Tx_P, &channel->control); |
530 | ZSDELAY(); | 530 | ZSDELAY(); |
531 | ZS_WSYNC(channel); | 531 | ZS_WSYNC(channel); |
532 | } | 532 | } |
533 | 533 | ||
534 | static irqreturn_t sunzilog_interrupt(int irq, void *dev_id) | 534 | static irqreturn_t sunzilog_interrupt(int irq, void *dev_id) |
535 | { | 535 | { |
536 | struct uart_sunzilog_port *up = dev_id; | 536 | struct uart_sunzilog_port *up = dev_id; |
537 | 537 | ||
538 | while (up) { | 538 | while (up) { |
539 | struct zilog_channel __iomem *channel | 539 | struct zilog_channel __iomem *channel |
540 | = ZILOG_CHANNEL_FROM_PORT(&up->port); | 540 | = ZILOG_CHANNEL_FROM_PORT(&up->port); |
541 | struct tty_struct *tty; | 541 | struct tty_struct *tty; |
542 | unsigned char r3; | 542 | unsigned char r3; |
543 | 543 | ||
544 | spin_lock(&up->port.lock); | 544 | spin_lock(&up->port.lock); |
545 | r3 = read_zsreg(channel, R3); | 545 | r3 = read_zsreg(channel, R3); |
546 | 546 | ||
547 | /* Channel A */ | 547 | /* Channel A */ |
548 | tty = NULL; | 548 | tty = NULL; |
549 | if (r3 & (CHAEXT | CHATxIP | CHARxIP)) { | 549 | if (r3 & (CHAEXT | CHATxIP | CHARxIP)) { |
550 | writeb(RES_H_IUS, &channel->control); | 550 | writeb(RES_H_IUS, &channel->control); |
551 | ZSDELAY(); | 551 | ZSDELAY(); |
552 | ZS_WSYNC(channel); | 552 | ZS_WSYNC(channel); |
553 | 553 | ||
554 | if (r3 & CHARxIP) | 554 | if (r3 & CHARxIP) |
555 | tty = sunzilog_receive_chars(up, channel); | 555 | tty = sunzilog_receive_chars(up, channel); |
556 | if (r3 & CHAEXT) | 556 | if (r3 & CHAEXT) |
557 | sunzilog_status_handle(up, channel); | 557 | sunzilog_status_handle(up, channel); |
558 | if (r3 & CHATxIP) | 558 | if (r3 & CHATxIP) |
559 | sunzilog_transmit_chars(up, channel); | 559 | sunzilog_transmit_chars(up, channel); |
560 | } | 560 | } |
561 | spin_unlock(&up->port.lock); | 561 | spin_unlock(&up->port.lock); |
562 | 562 | ||
563 | if (tty) | 563 | if (tty) |
564 | tty_flip_buffer_push(tty); | 564 | tty_flip_buffer_push(tty); |
565 | 565 | ||
566 | /* Channel B */ | 566 | /* Channel B */ |
567 | up = up->next; | 567 | up = up->next; |
568 | channel = ZILOG_CHANNEL_FROM_PORT(&up->port); | 568 | channel = ZILOG_CHANNEL_FROM_PORT(&up->port); |
569 | 569 | ||
570 | spin_lock(&up->port.lock); | 570 | spin_lock(&up->port.lock); |
571 | tty = NULL; | 571 | tty = NULL; |
572 | if (r3 & (CHBEXT | CHBTxIP | CHBRxIP)) { | 572 | if (r3 & (CHBEXT | CHBTxIP | CHBRxIP)) { |
573 | writeb(RES_H_IUS, &channel->control); | 573 | writeb(RES_H_IUS, &channel->control); |
574 | ZSDELAY(); | 574 | ZSDELAY(); |
575 | ZS_WSYNC(channel); | 575 | ZS_WSYNC(channel); |
576 | 576 | ||
577 | if (r3 & CHBRxIP) | 577 | if (r3 & CHBRxIP) |
578 | tty = sunzilog_receive_chars(up, channel); | 578 | tty = sunzilog_receive_chars(up, channel); |
579 | if (r3 & CHBEXT) | 579 | if (r3 & CHBEXT) |
580 | sunzilog_status_handle(up, channel); | 580 | sunzilog_status_handle(up, channel); |
581 | if (r3 & CHBTxIP) | 581 | if (r3 & CHBTxIP) |
582 | sunzilog_transmit_chars(up, channel); | 582 | sunzilog_transmit_chars(up, channel); |
583 | } | 583 | } |
584 | spin_unlock(&up->port.lock); | 584 | spin_unlock(&up->port.lock); |
585 | 585 | ||
586 | if (tty) | 586 | if (tty) |
587 | tty_flip_buffer_push(tty); | 587 | tty_flip_buffer_push(tty); |
588 | 588 | ||
589 | up = up->next; | 589 | up = up->next; |
590 | } | 590 | } |
591 | 591 | ||
592 | return IRQ_HANDLED; | 592 | return IRQ_HANDLED; |
593 | } | 593 | } |
594 | 594 | ||
595 | /* A convenient way to quickly get R0 status. The caller must _not_ hold the | 595 | /* A convenient way to quickly get R0 status. The caller must _not_ hold the |
596 | * port lock, it is acquired here. | 596 | * port lock, it is acquired here. |
597 | */ | 597 | */ |
598 | static __inline__ unsigned char sunzilog_read_channel_status(struct uart_port *port) | 598 | static __inline__ unsigned char sunzilog_read_channel_status(struct uart_port *port) |
599 | { | 599 | { |
600 | struct zilog_channel __iomem *channel; | 600 | struct zilog_channel __iomem *channel; |
601 | unsigned char status; | 601 | unsigned char status; |
602 | 602 | ||
603 | channel = ZILOG_CHANNEL_FROM_PORT(port); | 603 | channel = ZILOG_CHANNEL_FROM_PORT(port); |
604 | status = readb(&channel->control); | 604 | status = readb(&channel->control); |
605 | ZSDELAY(); | 605 | ZSDELAY(); |
606 | 606 | ||
607 | return status; | 607 | return status; |
608 | } | 608 | } |
609 | 609 | ||
610 | /* The port lock is not held. */ | 610 | /* The port lock is not held. */ |
611 | static unsigned int sunzilog_tx_empty(struct uart_port *port) | 611 | static unsigned int sunzilog_tx_empty(struct uart_port *port) |
612 | { | 612 | { |
613 | unsigned long flags; | 613 | unsigned long flags; |
614 | unsigned char status; | 614 | unsigned char status; |
615 | unsigned int ret; | 615 | unsigned int ret; |
616 | 616 | ||
617 | spin_lock_irqsave(&port->lock, flags); | 617 | spin_lock_irqsave(&port->lock, flags); |
618 | 618 | ||
619 | status = sunzilog_read_channel_status(port); | 619 | status = sunzilog_read_channel_status(port); |
620 | 620 | ||
621 | spin_unlock_irqrestore(&port->lock, flags); | 621 | spin_unlock_irqrestore(&port->lock, flags); |
622 | 622 | ||
623 | if (status & Tx_BUF_EMP) | 623 | if (status & Tx_BUF_EMP) |
624 | ret = TIOCSER_TEMT; | 624 | ret = TIOCSER_TEMT; |
625 | else | 625 | else |
626 | ret = 0; | 626 | ret = 0; |
627 | 627 | ||
628 | return ret; | 628 | return ret; |
629 | } | 629 | } |
630 | 630 | ||
631 | /* The port lock is held and interrupts are disabled. */ | 631 | /* The port lock is held and interrupts are disabled. */ |
632 | static unsigned int sunzilog_get_mctrl(struct uart_port *port) | 632 | static unsigned int sunzilog_get_mctrl(struct uart_port *port) |
633 | { | 633 | { |
634 | unsigned char status; | 634 | unsigned char status; |
635 | unsigned int ret; | 635 | unsigned int ret; |
636 | 636 | ||
637 | status = sunzilog_read_channel_status(port); | 637 | status = sunzilog_read_channel_status(port); |
638 | 638 | ||
639 | ret = 0; | 639 | ret = 0; |
640 | if (status & DCD) | 640 | if (status & DCD) |
641 | ret |= TIOCM_CAR; | 641 | ret |= TIOCM_CAR; |
642 | if (status & SYNC) | 642 | if (status & SYNC) |
643 | ret |= TIOCM_DSR; | 643 | ret |= TIOCM_DSR; |
644 | if (status & CTS) | 644 | if (status & CTS) |
645 | ret |= TIOCM_CTS; | 645 | ret |= TIOCM_CTS; |
646 | 646 | ||
647 | return ret; | 647 | return ret; |
648 | } | 648 | } |
649 | 649 | ||
650 | /* The port lock is held and interrupts are disabled. */ | 650 | /* The port lock is held and interrupts are disabled. */ |
651 | static void sunzilog_set_mctrl(struct uart_port *port, unsigned int mctrl) | 651 | static void sunzilog_set_mctrl(struct uart_port *port, unsigned int mctrl) |
652 | { | 652 | { |
653 | struct uart_sunzilog_port *up = (struct uart_sunzilog_port *) port; | 653 | struct uart_sunzilog_port *up = (struct uart_sunzilog_port *) port; |
654 | struct zilog_channel __iomem *channel = ZILOG_CHANNEL_FROM_PORT(port); | 654 | struct zilog_channel __iomem *channel = ZILOG_CHANNEL_FROM_PORT(port); |
655 | unsigned char set_bits, clear_bits; | 655 | unsigned char set_bits, clear_bits; |
656 | 656 | ||
657 | set_bits = clear_bits = 0; | 657 | set_bits = clear_bits = 0; |
658 | 658 | ||
659 | if (mctrl & TIOCM_RTS) | 659 | if (mctrl & TIOCM_RTS) |
660 | set_bits |= RTS; | 660 | set_bits |= RTS; |
661 | else | 661 | else |
662 | clear_bits |= RTS; | 662 | clear_bits |= RTS; |
663 | if (mctrl & TIOCM_DTR) | 663 | if (mctrl & TIOCM_DTR) |
664 | set_bits |= DTR; | 664 | set_bits |= DTR; |
665 | else | 665 | else |
666 | clear_bits |= DTR; | 666 | clear_bits |= DTR; |
667 | 667 | ||
668 | /* NOTE: Not subject to 'transmitter active' rule. */ | 668 | /* NOTE: Not subject to 'transmitter active' rule. */ |
669 | up->curregs[R5] |= set_bits; | 669 | up->curregs[R5] |= set_bits; |
670 | up->curregs[R5] &= ~clear_bits; | 670 | up->curregs[R5] &= ~clear_bits; |
671 | write_zsreg(channel, R5, up->curregs[R5]); | 671 | write_zsreg(channel, R5, up->curregs[R5]); |
672 | } | 672 | } |
673 | 673 | ||
674 | /* The port lock is held and interrupts are disabled. */ | 674 | /* The port lock is held and interrupts are disabled. */ |
675 | static void sunzilog_stop_tx(struct uart_port *port) | 675 | static void sunzilog_stop_tx(struct uart_port *port) |
676 | { | 676 | { |
677 | struct uart_sunzilog_port *up = (struct uart_sunzilog_port *) port; | 677 | struct uart_sunzilog_port *up = (struct uart_sunzilog_port *) port; |
678 | 678 | ||
679 | up->flags |= SUNZILOG_FLAG_TX_STOPPED; | 679 | up->flags |= SUNZILOG_FLAG_TX_STOPPED; |
680 | } | 680 | } |
681 | 681 | ||
682 | /* The port lock is held and interrupts are disabled. */ | 682 | /* The port lock is held and interrupts are disabled. */ |
683 | static void sunzilog_start_tx(struct uart_port *port) | 683 | static void sunzilog_start_tx(struct uart_port *port) |
684 | { | 684 | { |
685 | struct uart_sunzilog_port *up = (struct uart_sunzilog_port *) port; | 685 | struct uart_sunzilog_port *up = (struct uart_sunzilog_port *) port; |
686 | struct zilog_channel __iomem *channel = ZILOG_CHANNEL_FROM_PORT(port); | 686 | struct zilog_channel __iomem *channel = ZILOG_CHANNEL_FROM_PORT(port); |
687 | unsigned char status; | 687 | unsigned char status; |
688 | 688 | ||
689 | up->flags |= SUNZILOG_FLAG_TX_ACTIVE; | 689 | up->flags |= SUNZILOG_FLAG_TX_ACTIVE; |
690 | up->flags &= ~SUNZILOG_FLAG_TX_STOPPED; | 690 | up->flags &= ~SUNZILOG_FLAG_TX_STOPPED; |
691 | 691 | ||
692 | status = readb(&channel->control); | 692 | status = readb(&channel->control); |
693 | ZSDELAY(); | 693 | ZSDELAY(); |
694 | 694 | ||
695 | /* TX busy? Just wait for the TX done interrupt. */ | 695 | /* TX busy? Just wait for the TX done interrupt. */ |
696 | if (!(status & Tx_BUF_EMP)) | 696 | if (!(status & Tx_BUF_EMP)) |
697 | return; | 697 | return; |
698 | 698 | ||
699 | /* Send the first character to jump-start the TX done | 699 | /* Send the first character to jump-start the TX done |
700 | * IRQ sending engine. | 700 | * IRQ sending engine. |
701 | */ | 701 | */ |
702 | if (port->x_char) { | 702 | if (port->x_char) { |
703 | writeb(port->x_char, &channel->data); | 703 | writeb(port->x_char, &channel->data); |
704 | ZSDELAY(); | 704 | ZSDELAY(); |
705 | ZS_WSYNC(channel); | 705 | ZS_WSYNC(channel); |
706 | 706 | ||
707 | port->icount.tx++; | 707 | port->icount.tx++; |
708 | port->x_char = 0; | 708 | port->x_char = 0; |
709 | } else { | 709 | } else { |
710 | struct circ_buf *xmit = &port->state->xmit; | 710 | struct circ_buf *xmit = &port->state->xmit; |
711 | 711 | ||
712 | writeb(xmit->buf[xmit->tail], &channel->data); | 712 | writeb(xmit->buf[xmit->tail], &channel->data); |
713 | ZSDELAY(); | 713 | ZSDELAY(); |
714 | ZS_WSYNC(channel); | 714 | ZS_WSYNC(channel); |
715 | 715 | ||
716 | xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); | 716 | xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); |
717 | port->icount.tx++; | 717 | port->icount.tx++; |
718 | 718 | ||
719 | if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) | 719 | if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) |
720 | uart_write_wakeup(&up->port); | 720 | uart_write_wakeup(&up->port); |
721 | } | 721 | } |
722 | } | 722 | } |
723 | 723 | ||
724 | /* The port lock is held. */ | 724 | /* The port lock is held. */ |
725 | static void sunzilog_stop_rx(struct uart_port *port) | 725 | static void sunzilog_stop_rx(struct uart_port *port) |
726 | { | 726 | { |
727 | struct uart_sunzilog_port *up = UART_ZILOG(port); | 727 | struct uart_sunzilog_port *up = UART_ZILOG(port); |
728 | struct zilog_channel __iomem *channel; | 728 | struct zilog_channel __iomem *channel; |
729 | 729 | ||
730 | if (ZS_IS_CONS(up)) | 730 | if (ZS_IS_CONS(up)) |
731 | return; | 731 | return; |
732 | 732 | ||
733 | channel = ZILOG_CHANNEL_FROM_PORT(port); | 733 | channel = ZILOG_CHANNEL_FROM_PORT(port); |
734 | 734 | ||
735 | /* Disable all RX interrupts. */ | 735 | /* Disable all RX interrupts. */ |
736 | up->curregs[R1] &= ~RxINT_MASK; | 736 | up->curregs[R1] &= ~RxINT_MASK; |
737 | sunzilog_maybe_update_regs(up, channel); | 737 | sunzilog_maybe_update_regs(up, channel); |
738 | } | 738 | } |
739 | 739 | ||
740 | /* The port lock is held. */ | 740 | /* The port lock is held. */ |
741 | static void sunzilog_enable_ms(struct uart_port *port) | 741 | static void sunzilog_enable_ms(struct uart_port *port) |
742 | { | 742 | { |
743 | struct uart_sunzilog_port *up = (struct uart_sunzilog_port *) port; | 743 | struct uart_sunzilog_port *up = (struct uart_sunzilog_port *) port; |
744 | struct zilog_channel __iomem *channel = ZILOG_CHANNEL_FROM_PORT(port); | 744 | struct zilog_channel __iomem *channel = ZILOG_CHANNEL_FROM_PORT(port); |
745 | unsigned char new_reg; | 745 | unsigned char new_reg; |
746 | 746 | ||
747 | new_reg = up->curregs[R15] | (DCDIE | SYNCIE | CTSIE); | 747 | new_reg = up->curregs[R15] | (DCDIE | SYNCIE | CTSIE); |
748 | if (new_reg != up->curregs[R15]) { | 748 | if (new_reg != up->curregs[R15]) { |
749 | up->curregs[R15] = new_reg; | 749 | up->curregs[R15] = new_reg; |
750 | 750 | ||
751 | /* NOTE: Not subject to 'transmitter active' rule. */ | 751 | /* NOTE: Not subject to 'transmitter active' rule. */ |
752 | write_zsreg(channel, R15, up->curregs[R15] & ~WR7pEN); | 752 | write_zsreg(channel, R15, up->curregs[R15] & ~WR7pEN); |
753 | } | 753 | } |
754 | } | 754 | } |
755 | 755 | ||
756 | /* The port lock is not held. */ | 756 | /* The port lock is not held. */ |
757 | static void sunzilog_break_ctl(struct uart_port *port, int break_state) | 757 | static void sunzilog_break_ctl(struct uart_port *port, int break_state) |
758 | { | 758 | { |
759 | struct uart_sunzilog_port *up = (struct uart_sunzilog_port *) port; | 759 | struct uart_sunzilog_port *up = (struct uart_sunzilog_port *) port; |
760 | struct zilog_channel __iomem *channel = ZILOG_CHANNEL_FROM_PORT(port); | 760 | struct zilog_channel __iomem *channel = ZILOG_CHANNEL_FROM_PORT(port); |
761 | unsigned char set_bits, clear_bits, new_reg; | 761 | unsigned char set_bits, clear_bits, new_reg; |
762 | unsigned long flags; | 762 | unsigned long flags; |
763 | 763 | ||
764 | set_bits = clear_bits = 0; | 764 | set_bits = clear_bits = 0; |
765 | 765 | ||
766 | if (break_state) | 766 | if (break_state) |
767 | set_bits |= SND_BRK; | 767 | set_bits |= SND_BRK; |
768 | else | 768 | else |
769 | clear_bits |= SND_BRK; | 769 | clear_bits |= SND_BRK; |
770 | 770 | ||
771 | spin_lock_irqsave(&port->lock, flags); | 771 | spin_lock_irqsave(&port->lock, flags); |
772 | 772 | ||
773 | new_reg = (up->curregs[R5] | set_bits) & ~clear_bits; | 773 | new_reg = (up->curregs[R5] | set_bits) & ~clear_bits; |
774 | if (new_reg != up->curregs[R5]) { | 774 | if (new_reg != up->curregs[R5]) { |
775 | up->curregs[R5] = new_reg; | 775 | up->curregs[R5] = new_reg; |
776 | 776 | ||
777 | /* NOTE: Not subject to 'transmitter active' rule. */ | 777 | /* NOTE: Not subject to 'transmitter active' rule. */ |
778 | write_zsreg(channel, R5, up->curregs[R5]); | 778 | write_zsreg(channel, R5, up->curregs[R5]); |
779 | } | 779 | } |
780 | 780 | ||
781 | spin_unlock_irqrestore(&port->lock, flags); | 781 | spin_unlock_irqrestore(&port->lock, flags); |
782 | } | 782 | } |
783 | 783 | ||
784 | static void __sunzilog_startup(struct uart_sunzilog_port *up) | 784 | static void __sunzilog_startup(struct uart_sunzilog_port *up) |
785 | { | 785 | { |
786 | struct zilog_channel __iomem *channel; | 786 | struct zilog_channel __iomem *channel; |
787 | 787 | ||
788 | channel = ZILOG_CHANNEL_FROM_PORT(&up->port); | 788 | channel = ZILOG_CHANNEL_FROM_PORT(&up->port); |
789 | up->prev_status = readb(&channel->control); | 789 | up->prev_status = readb(&channel->control); |
790 | 790 | ||
791 | /* Enable receiver and transmitter. */ | 791 | /* Enable receiver and transmitter. */ |
792 | up->curregs[R3] |= RxENAB; | 792 | up->curregs[R3] |= RxENAB; |
793 | up->curregs[R5] |= TxENAB; | 793 | up->curregs[R5] |= TxENAB; |
794 | 794 | ||
795 | up->curregs[R1] |= EXT_INT_ENAB | INT_ALL_Rx | TxINT_ENAB; | 795 | up->curregs[R1] |= EXT_INT_ENAB | INT_ALL_Rx | TxINT_ENAB; |
796 | sunzilog_maybe_update_regs(up, channel); | 796 | sunzilog_maybe_update_regs(up, channel); |
797 | } | 797 | } |
798 | 798 | ||
799 | static int sunzilog_startup(struct uart_port *port) | 799 | static int sunzilog_startup(struct uart_port *port) |
800 | { | 800 | { |
801 | struct uart_sunzilog_port *up = UART_ZILOG(port); | 801 | struct uart_sunzilog_port *up = UART_ZILOG(port); |
802 | unsigned long flags; | 802 | unsigned long flags; |
803 | 803 | ||
804 | if (ZS_IS_CONS(up)) | 804 | if (ZS_IS_CONS(up)) |
805 | return 0; | 805 | return 0; |
806 | 806 | ||
807 | spin_lock_irqsave(&port->lock, flags); | 807 | spin_lock_irqsave(&port->lock, flags); |
808 | __sunzilog_startup(up); | 808 | __sunzilog_startup(up); |
809 | spin_unlock_irqrestore(&port->lock, flags); | 809 | spin_unlock_irqrestore(&port->lock, flags); |
810 | return 0; | 810 | return 0; |
811 | } | 811 | } |
812 | 812 | ||
813 | /* | 813 | /* |
814 | * The test for ZS_IS_CONS is explained by the following e-mail: | 814 | * The test for ZS_IS_CONS is explained by the following e-mail: |
815 | ***** | 815 | ***** |
816 | * From: Russell King <rmk@arm.linux.org.uk> | 816 | * From: Russell King <rmk@arm.linux.org.uk> |
817 | * Date: Sun, 8 Dec 2002 10:18:38 +0000 | 817 | * Date: Sun, 8 Dec 2002 10:18:38 +0000 |
818 | * | 818 | * |
819 | * On Sun, Dec 08, 2002 at 02:43:36AM -0500, Pete Zaitcev wrote: | 819 | * On Sun, Dec 08, 2002 at 02:43:36AM -0500, Pete Zaitcev wrote: |
820 | * > I boot my 2.5 boxes using "console=ttyS0,9600" argument, | 820 | * > I boot my 2.5 boxes using "console=ttyS0,9600" argument, |
821 | * > and I noticed that something is not right with reference | 821 | * > and I noticed that something is not right with reference |
822 | * > counting in this case. It seems that when the console | 822 | * > counting in this case. It seems that when the console |
823 | * > is open by kernel initially, this is not accounted | 823 | * > is open by kernel initially, this is not accounted |
824 | * > as an open, and uart_startup is not called. | 824 | * > as an open, and uart_startup is not called. |
825 | * | 825 | * |
826 | * That is correct. We are unable to call uart_startup when the serial | 826 | * That is correct. We are unable to call uart_startup when the serial |
827 | * console is initialised because it may need to allocate memory (as | 827 | * console is initialised because it may need to allocate memory (as |
828 | * request_irq does) and the memory allocators may not have been | 828 | * request_irq does) and the memory allocators may not have been |
829 | * initialised. | 829 | * initialised. |
830 | * | 830 | * |
831 | * 1. initialise the port into a state where it can send characters in the | 831 | * 1. initialise the port into a state where it can send characters in the |
832 | * console write method. | 832 | * console write method. |
833 | * | 833 | * |
834 | * 2. don't do the actual hardware shutdown in your shutdown() method (but | 834 | * 2. don't do the actual hardware shutdown in your shutdown() method (but |
835 | * do the normal software shutdown - ie, free irqs etc) | 835 | * do the normal software shutdown - ie, free irqs etc) |
836 | ***** | 836 | ***** |
837 | */ | 837 | */ |
838 | static void sunzilog_shutdown(struct uart_port *port) | 838 | static void sunzilog_shutdown(struct uart_port *port) |
839 | { | 839 | { |
840 | struct uart_sunzilog_port *up = UART_ZILOG(port); | 840 | struct uart_sunzilog_port *up = UART_ZILOG(port); |
841 | struct zilog_channel __iomem *channel; | 841 | struct zilog_channel __iomem *channel; |
842 | unsigned long flags; | 842 | unsigned long flags; |
843 | 843 | ||
844 | if (ZS_IS_CONS(up)) | 844 | if (ZS_IS_CONS(up)) |
845 | return; | 845 | return; |
846 | 846 | ||
847 | spin_lock_irqsave(&port->lock, flags); | 847 | spin_lock_irqsave(&port->lock, flags); |
848 | 848 | ||
849 | channel = ZILOG_CHANNEL_FROM_PORT(port); | 849 | channel = ZILOG_CHANNEL_FROM_PORT(port); |
850 | 850 | ||
851 | /* Disable receiver and transmitter. */ | 851 | /* Disable receiver and transmitter. */ |
852 | up->curregs[R3] &= ~RxENAB; | 852 | up->curregs[R3] &= ~RxENAB; |
853 | up->curregs[R5] &= ~TxENAB; | 853 | up->curregs[R5] &= ~TxENAB; |
854 | 854 | ||
855 | /* Disable all interrupts and BRK assertion. */ | 855 | /* Disable all interrupts and BRK assertion. */ |
856 | up->curregs[R1] &= ~(EXT_INT_ENAB | TxINT_ENAB | RxINT_MASK); | 856 | up->curregs[R1] &= ~(EXT_INT_ENAB | TxINT_ENAB | RxINT_MASK); |
857 | up->curregs[R5] &= ~SND_BRK; | 857 | up->curregs[R5] &= ~SND_BRK; |
858 | sunzilog_maybe_update_regs(up, channel); | 858 | sunzilog_maybe_update_regs(up, channel); |
859 | 859 | ||
860 | spin_unlock_irqrestore(&port->lock, flags); | 860 | spin_unlock_irqrestore(&port->lock, flags); |
861 | } | 861 | } |
862 | 862 | ||
863 | /* Shared by TTY driver and serial console setup. The port lock is held | 863 | /* Shared by TTY driver and serial console setup. The port lock is held |
864 | * and local interrupts are disabled. | 864 | * and local interrupts are disabled. |
865 | */ | 865 | */ |
866 | static void | 866 | static void |
867 | sunzilog_convert_to_zs(struct uart_sunzilog_port *up, unsigned int cflag, | 867 | sunzilog_convert_to_zs(struct uart_sunzilog_port *up, unsigned int cflag, |
868 | unsigned int iflag, int brg) | 868 | unsigned int iflag, int brg) |
869 | { | 869 | { |
870 | 870 | ||
871 | up->curregs[R10] = NRZ; | 871 | up->curregs[R10] = NRZ; |
872 | up->curregs[R11] = TCBR | RCBR; | 872 | up->curregs[R11] = TCBR | RCBR; |
873 | 873 | ||
874 | /* Program BAUD and clock source. */ | 874 | /* Program BAUD and clock source. */ |
875 | up->curregs[R4] &= ~XCLK_MASK; | 875 | up->curregs[R4] &= ~XCLK_MASK; |
876 | up->curregs[R4] |= X16CLK; | 876 | up->curregs[R4] |= X16CLK; |
877 | up->curregs[R12] = brg & 0xff; | 877 | up->curregs[R12] = brg & 0xff; |
878 | up->curregs[R13] = (brg >> 8) & 0xff; | 878 | up->curregs[R13] = (brg >> 8) & 0xff; |
879 | up->curregs[R14] = BRSRC | BRENAB; | 879 | up->curregs[R14] = BRSRC | BRENAB; |
880 | 880 | ||
881 | /* Character size, stop bits, and parity. */ | 881 | /* Character size, stop bits, and parity. */ |
882 | up->curregs[R3] &= ~RxN_MASK; | 882 | up->curregs[R3] &= ~RxN_MASK; |
883 | up->curregs[R5] &= ~TxN_MASK; | 883 | up->curregs[R5] &= ~TxN_MASK; |
884 | switch (cflag & CSIZE) { | 884 | switch (cflag & CSIZE) { |
885 | case CS5: | 885 | case CS5: |
886 | up->curregs[R3] |= Rx5; | 886 | up->curregs[R3] |= Rx5; |
887 | up->curregs[R5] |= Tx5; | 887 | up->curregs[R5] |= Tx5; |
888 | up->parity_mask = 0x1f; | 888 | up->parity_mask = 0x1f; |
889 | break; | 889 | break; |
890 | case CS6: | 890 | case CS6: |
891 | up->curregs[R3] |= Rx6; | 891 | up->curregs[R3] |= Rx6; |
892 | up->curregs[R5] |= Tx6; | 892 | up->curregs[R5] |= Tx6; |
893 | up->parity_mask = 0x3f; | 893 | up->parity_mask = 0x3f; |
894 | break; | 894 | break; |
895 | case CS7: | 895 | case CS7: |
896 | up->curregs[R3] |= Rx7; | 896 | up->curregs[R3] |= Rx7; |
897 | up->curregs[R5] |= Tx7; | 897 | up->curregs[R5] |= Tx7; |
898 | up->parity_mask = 0x7f; | 898 | up->parity_mask = 0x7f; |
899 | break; | 899 | break; |
900 | case CS8: | 900 | case CS8: |
901 | default: | 901 | default: |
902 | up->curregs[R3] |= Rx8; | 902 | up->curregs[R3] |= Rx8; |
903 | up->curregs[R5] |= Tx8; | 903 | up->curregs[R5] |= Tx8; |
904 | up->parity_mask = 0xff; | 904 | up->parity_mask = 0xff; |
905 | break; | 905 | break; |
906 | }; | 906 | }; |
907 | up->curregs[R4] &= ~0x0c; | 907 | up->curregs[R4] &= ~0x0c; |
908 | if (cflag & CSTOPB) | 908 | if (cflag & CSTOPB) |
909 | up->curregs[R4] |= SB2; | 909 | up->curregs[R4] |= SB2; |
910 | else | 910 | else |
911 | up->curregs[R4] |= SB1; | 911 | up->curregs[R4] |= SB1; |
912 | if (cflag & PARENB) | 912 | if (cflag & PARENB) |
913 | up->curregs[R4] |= PAR_ENAB; | 913 | up->curregs[R4] |= PAR_ENAB; |
914 | else | 914 | else |
915 | up->curregs[R4] &= ~PAR_ENAB; | 915 | up->curregs[R4] &= ~PAR_ENAB; |
916 | if (!(cflag & PARODD)) | 916 | if (!(cflag & PARODD)) |
917 | up->curregs[R4] |= PAR_EVEN; | 917 | up->curregs[R4] |= PAR_EVEN; |
918 | else | 918 | else |
919 | up->curregs[R4] &= ~PAR_EVEN; | 919 | up->curregs[R4] &= ~PAR_EVEN; |
920 | 920 | ||
921 | up->port.read_status_mask = Rx_OVR; | 921 | up->port.read_status_mask = Rx_OVR; |
922 | if (iflag & INPCK) | 922 | if (iflag & INPCK) |
923 | up->port.read_status_mask |= CRC_ERR | PAR_ERR; | 923 | up->port.read_status_mask |= CRC_ERR | PAR_ERR; |
924 | if (iflag & (BRKINT | PARMRK)) | 924 | if (iflag & (BRKINT | PARMRK)) |
925 | up->port.read_status_mask |= BRK_ABRT; | 925 | up->port.read_status_mask |= BRK_ABRT; |
926 | 926 | ||
927 | up->port.ignore_status_mask = 0; | 927 | up->port.ignore_status_mask = 0; |
928 | if (iflag & IGNPAR) | 928 | if (iflag & IGNPAR) |
929 | up->port.ignore_status_mask |= CRC_ERR | PAR_ERR; | 929 | up->port.ignore_status_mask |= CRC_ERR | PAR_ERR; |
930 | if (iflag & IGNBRK) { | 930 | if (iflag & IGNBRK) { |
931 | up->port.ignore_status_mask |= BRK_ABRT; | 931 | up->port.ignore_status_mask |= BRK_ABRT; |
932 | if (iflag & IGNPAR) | 932 | if (iflag & IGNPAR) |
933 | up->port.ignore_status_mask |= Rx_OVR; | 933 | up->port.ignore_status_mask |= Rx_OVR; |
934 | } | 934 | } |
935 | 935 | ||
936 | if ((cflag & CREAD) == 0) | 936 | if ((cflag & CREAD) == 0) |
937 | up->port.ignore_status_mask = 0xff; | 937 | up->port.ignore_status_mask = 0xff; |
938 | } | 938 | } |
939 | 939 | ||
940 | /* The port lock is not held. */ | 940 | /* The port lock is not held. */ |
941 | static void | 941 | static void |
942 | sunzilog_set_termios(struct uart_port *port, struct ktermios *termios, | 942 | sunzilog_set_termios(struct uart_port *port, struct ktermios *termios, |
943 | struct ktermios *old) | 943 | struct ktermios *old) |
944 | { | 944 | { |
945 | struct uart_sunzilog_port *up = (struct uart_sunzilog_port *) port; | 945 | struct uart_sunzilog_port *up = (struct uart_sunzilog_port *) port; |
946 | unsigned long flags; | 946 | unsigned long flags; |
947 | int baud, brg; | 947 | int baud, brg; |
948 | 948 | ||
949 | baud = uart_get_baud_rate(port, termios, old, 1200, 76800); | 949 | baud = uart_get_baud_rate(port, termios, old, 1200, 76800); |
950 | 950 | ||
951 | spin_lock_irqsave(&up->port.lock, flags); | 951 | spin_lock_irqsave(&up->port.lock, flags); |
952 | 952 | ||
953 | brg = BPS_TO_BRG(baud, ZS_CLOCK / ZS_CLOCK_DIVISOR); | 953 | brg = BPS_TO_BRG(baud, ZS_CLOCK / ZS_CLOCK_DIVISOR); |
954 | 954 | ||
955 | sunzilog_convert_to_zs(up, termios->c_cflag, termios->c_iflag, brg); | 955 | sunzilog_convert_to_zs(up, termios->c_cflag, termios->c_iflag, brg); |
956 | 956 | ||
957 | if (UART_ENABLE_MS(&up->port, termios->c_cflag)) | 957 | if (UART_ENABLE_MS(&up->port, termios->c_cflag)) |
958 | up->flags |= SUNZILOG_FLAG_MODEM_STATUS; | 958 | up->flags |= SUNZILOG_FLAG_MODEM_STATUS; |
959 | else | 959 | else |
960 | up->flags &= ~SUNZILOG_FLAG_MODEM_STATUS; | 960 | up->flags &= ~SUNZILOG_FLAG_MODEM_STATUS; |
961 | 961 | ||
962 | up->cflag = termios->c_cflag; | 962 | up->cflag = termios->c_cflag; |
963 | 963 | ||
964 | sunzilog_maybe_update_regs(up, ZILOG_CHANNEL_FROM_PORT(port)); | 964 | sunzilog_maybe_update_regs(up, ZILOG_CHANNEL_FROM_PORT(port)); |
965 | 965 | ||
966 | uart_update_timeout(port, termios->c_cflag, baud); | 966 | uart_update_timeout(port, termios->c_cflag, baud); |
967 | 967 | ||
968 | spin_unlock_irqrestore(&up->port.lock, flags); | 968 | spin_unlock_irqrestore(&up->port.lock, flags); |
969 | } | 969 | } |
970 | 970 | ||
971 | static const char *sunzilog_type(struct uart_port *port) | 971 | static const char *sunzilog_type(struct uart_port *port) |
972 | { | 972 | { |
973 | struct uart_sunzilog_port *up = UART_ZILOG(port); | 973 | struct uart_sunzilog_port *up = UART_ZILOG(port); |
974 | 974 | ||
975 | return (up->flags & SUNZILOG_FLAG_ESCC) ? "zs (ESCC)" : "zs"; | 975 | return (up->flags & SUNZILOG_FLAG_ESCC) ? "zs (ESCC)" : "zs"; |
976 | } | 976 | } |
977 | 977 | ||
978 | /* We do not request/release mappings of the registers here, this | 978 | /* We do not request/release mappings of the registers here, this |
979 | * happens at early serial probe time. | 979 | * happens at early serial probe time. |
980 | */ | 980 | */ |
981 | static void sunzilog_release_port(struct uart_port *port) | 981 | static void sunzilog_release_port(struct uart_port *port) |
982 | { | 982 | { |
983 | } | 983 | } |
984 | 984 | ||
985 | static int sunzilog_request_port(struct uart_port *port) | 985 | static int sunzilog_request_port(struct uart_port *port) |
986 | { | 986 | { |
987 | return 0; | 987 | return 0; |
988 | } | 988 | } |
989 | 989 | ||
990 | /* These do not need to do anything interesting either. */ | 990 | /* These do not need to do anything interesting either. */ |
991 | static void sunzilog_config_port(struct uart_port *port, int flags) | 991 | static void sunzilog_config_port(struct uart_port *port, int flags) |
992 | { | 992 | { |
993 | } | 993 | } |
994 | 994 | ||
995 | /* We do not support letting the user mess with the divisor, IRQ, etc. */ | 995 | /* We do not support letting the user mess with the divisor, IRQ, etc. */ |
996 | static int sunzilog_verify_port(struct uart_port *port, struct serial_struct *ser) | 996 | static int sunzilog_verify_port(struct uart_port *port, struct serial_struct *ser) |
997 | { | 997 | { |
998 | return -EINVAL; | 998 | return -EINVAL; |
999 | } | 999 | } |
1000 | 1000 | ||
1001 | #ifdef CONFIG_CONSOLE_POLL | 1001 | #ifdef CONFIG_CONSOLE_POLL |
1002 | static int sunzilog_get_poll_char(struct uart_port *port) | 1002 | static int sunzilog_get_poll_char(struct uart_port *port) |
1003 | { | 1003 | { |
1004 | unsigned char ch, r1; | 1004 | unsigned char ch, r1; |
1005 | struct uart_sunzilog_port *up = (struct uart_sunzilog_port *) port; | 1005 | struct uart_sunzilog_port *up = (struct uart_sunzilog_port *) port; |
1006 | struct zilog_channel __iomem *channel | 1006 | struct zilog_channel __iomem *channel |
1007 | = ZILOG_CHANNEL_FROM_PORT(&up->port); | 1007 | = ZILOG_CHANNEL_FROM_PORT(&up->port); |
1008 | 1008 | ||
1009 | 1009 | ||
1010 | r1 = read_zsreg(channel, R1); | 1010 | r1 = read_zsreg(channel, R1); |
1011 | if (r1 & (PAR_ERR | Rx_OVR | CRC_ERR)) { | 1011 | if (r1 & (PAR_ERR | Rx_OVR | CRC_ERR)) { |
1012 | writeb(ERR_RES, &channel->control); | 1012 | writeb(ERR_RES, &channel->control); |
1013 | ZSDELAY(); | 1013 | ZSDELAY(); |
1014 | ZS_WSYNC(channel); | 1014 | ZS_WSYNC(channel); |
1015 | } | 1015 | } |
1016 | 1016 | ||
1017 | ch = readb(&channel->control); | 1017 | ch = readb(&channel->control); |
1018 | ZSDELAY(); | 1018 | ZSDELAY(); |
1019 | 1019 | ||
1020 | /* This funny hack depends upon BRK_ABRT not interfering | 1020 | /* This funny hack depends upon BRK_ABRT not interfering |
1021 | * with the other bits we care about in R1. | 1021 | * with the other bits we care about in R1. |
1022 | */ | 1022 | */ |
1023 | if (ch & BRK_ABRT) | 1023 | if (ch & BRK_ABRT) |
1024 | r1 |= BRK_ABRT; | 1024 | r1 |= BRK_ABRT; |
1025 | 1025 | ||
1026 | if (!(ch & Rx_CH_AV)) | 1026 | if (!(ch & Rx_CH_AV)) |
1027 | return NO_POLL_CHAR; | 1027 | return NO_POLL_CHAR; |
1028 | 1028 | ||
1029 | ch = readb(&channel->data); | 1029 | ch = readb(&channel->data); |
1030 | ZSDELAY(); | 1030 | ZSDELAY(); |
1031 | 1031 | ||
1032 | ch &= up->parity_mask; | 1032 | ch &= up->parity_mask; |
1033 | return ch; | 1033 | return ch; |
1034 | } | 1034 | } |
1035 | 1035 | ||
1036 | static void sunzilog_put_poll_char(struct uart_port *port, | 1036 | static void sunzilog_put_poll_char(struct uart_port *port, |
1037 | unsigned char ch) | 1037 | unsigned char ch) |
1038 | { | 1038 | { |
1039 | struct uart_sunzilog_port *up = (struct uart_sunzilog_port *)port; | 1039 | struct uart_sunzilog_port *up = (struct uart_sunzilog_port *)port; |
1040 | 1040 | ||
1041 | sunzilog_putchar(&up->port, ch); | 1041 | sunzilog_putchar(&up->port, ch); |
1042 | } | 1042 | } |
1043 | #endif /* CONFIG_CONSOLE_POLL */ | 1043 | #endif /* CONFIG_CONSOLE_POLL */ |
1044 | 1044 | ||
1045 | static struct uart_ops sunzilog_pops = { | 1045 | static struct uart_ops sunzilog_pops = { |
1046 | .tx_empty = sunzilog_tx_empty, | 1046 | .tx_empty = sunzilog_tx_empty, |
1047 | .set_mctrl = sunzilog_set_mctrl, | 1047 | .set_mctrl = sunzilog_set_mctrl, |
1048 | .get_mctrl = sunzilog_get_mctrl, | 1048 | .get_mctrl = sunzilog_get_mctrl, |
1049 | .stop_tx = sunzilog_stop_tx, | 1049 | .stop_tx = sunzilog_stop_tx, |
1050 | .start_tx = sunzilog_start_tx, | 1050 | .start_tx = sunzilog_start_tx, |
1051 | .stop_rx = sunzilog_stop_rx, | 1051 | .stop_rx = sunzilog_stop_rx, |
1052 | .enable_ms = sunzilog_enable_ms, | 1052 | .enable_ms = sunzilog_enable_ms, |
1053 | .break_ctl = sunzilog_break_ctl, | 1053 | .break_ctl = sunzilog_break_ctl, |
1054 | .startup = sunzilog_startup, | 1054 | .startup = sunzilog_startup, |
1055 | .shutdown = sunzilog_shutdown, | 1055 | .shutdown = sunzilog_shutdown, |
1056 | .set_termios = sunzilog_set_termios, | 1056 | .set_termios = sunzilog_set_termios, |
1057 | .type = sunzilog_type, | 1057 | .type = sunzilog_type, |
1058 | .release_port = sunzilog_release_port, | 1058 | .release_port = sunzilog_release_port, |
1059 | .request_port = sunzilog_request_port, | 1059 | .request_port = sunzilog_request_port, |
1060 | .config_port = sunzilog_config_port, | 1060 | .config_port = sunzilog_config_port, |
1061 | .verify_port = sunzilog_verify_port, | 1061 | .verify_port = sunzilog_verify_port, |
1062 | #ifdef CONFIG_CONSOLE_POLL | 1062 | #ifdef CONFIG_CONSOLE_POLL |
1063 | .poll_get_char = sunzilog_get_poll_char, | 1063 | .poll_get_char = sunzilog_get_poll_char, |
1064 | .poll_put_char = sunzilog_put_poll_char, | 1064 | .poll_put_char = sunzilog_put_poll_char, |
1065 | #endif | 1065 | #endif |
1066 | }; | 1066 | }; |
1067 | 1067 | ||
1068 | static int uart_chip_count; | 1068 | static int uart_chip_count; |
1069 | static struct uart_sunzilog_port *sunzilog_port_table; | 1069 | static struct uart_sunzilog_port *sunzilog_port_table; |
1070 | static struct zilog_layout __iomem **sunzilog_chip_regs; | 1070 | static struct zilog_layout __iomem **sunzilog_chip_regs; |
1071 | 1071 | ||
1072 | static struct uart_sunzilog_port *sunzilog_irq_chain; | 1072 | static struct uart_sunzilog_port *sunzilog_irq_chain; |
1073 | 1073 | ||
1074 | static struct uart_driver sunzilog_reg = { | 1074 | static struct uart_driver sunzilog_reg = { |
1075 | .owner = THIS_MODULE, | 1075 | .owner = THIS_MODULE, |
1076 | .driver_name = "sunzilog", | 1076 | .driver_name = "sunzilog", |
1077 | .dev_name = "ttyS", | 1077 | .dev_name = "ttyS", |
1078 | .major = TTY_MAJOR, | 1078 | .major = TTY_MAJOR, |
1079 | }; | 1079 | }; |
1080 | 1080 | ||
1081 | static int __init sunzilog_alloc_tables(int num_sunzilog) | 1081 | static int __init sunzilog_alloc_tables(int num_sunzilog) |
1082 | { | 1082 | { |
1083 | struct uart_sunzilog_port *up; | 1083 | struct uart_sunzilog_port *up; |
1084 | unsigned long size; | 1084 | unsigned long size; |
1085 | int num_channels = num_sunzilog * 2; | 1085 | int num_channels = num_sunzilog * 2; |
1086 | int i; | 1086 | int i; |
1087 | 1087 | ||
1088 | size = num_channels * sizeof(struct uart_sunzilog_port); | 1088 | size = num_channels * sizeof(struct uart_sunzilog_port); |
1089 | sunzilog_port_table = kzalloc(size, GFP_KERNEL); | 1089 | sunzilog_port_table = kzalloc(size, GFP_KERNEL); |
1090 | if (!sunzilog_port_table) | 1090 | if (!sunzilog_port_table) |
1091 | return -ENOMEM; | 1091 | return -ENOMEM; |
1092 | 1092 | ||
1093 | for (i = 0; i < num_channels; i++) { | 1093 | for (i = 0; i < num_channels; i++) { |
1094 | up = &sunzilog_port_table[i]; | 1094 | up = &sunzilog_port_table[i]; |
1095 | 1095 | ||
1096 | spin_lock_init(&up->port.lock); | 1096 | spin_lock_init(&up->port.lock); |
1097 | 1097 | ||
1098 | if (i == 0) | 1098 | if (i == 0) |
1099 | sunzilog_irq_chain = up; | 1099 | sunzilog_irq_chain = up; |
1100 | 1100 | ||
1101 | if (i < num_channels - 1) | 1101 | if (i < num_channels - 1) |
1102 | up->next = up + 1; | 1102 | up->next = up + 1; |
1103 | else | 1103 | else |
1104 | up->next = NULL; | 1104 | up->next = NULL; |
1105 | } | 1105 | } |
1106 | 1106 | ||
1107 | size = num_sunzilog * sizeof(struct zilog_layout __iomem *); | 1107 | size = num_sunzilog * sizeof(struct zilog_layout __iomem *); |
1108 | sunzilog_chip_regs = kzalloc(size, GFP_KERNEL); | 1108 | sunzilog_chip_regs = kzalloc(size, GFP_KERNEL); |
1109 | if (!sunzilog_chip_regs) { | 1109 | if (!sunzilog_chip_regs) { |
1110 | kfree(sunzilog_port_table); | 1110 | kfree(sunzilog_port_table); |
1111 | sunzilog_irq_chain = NULL; | 1111 | sunzilog_irq_chain = NULL; |
1112 | return -ENOMEM; | 1112 | return -ENOMEM; |
1113 | } | 1113 | } |
1114 | 1114 | ||
1115 | return 0; | 1115 | return 0; |
1116 | } | 1116 | } |
1117 | 1117 | ||
1118 | static void sunzilog_free_tables(void) | 1118 | static void sunzilog_free_tables(void) |
1119 | { | 1119 | { |
1120 | kfree(sunzilog_port_table); | 1120 | kfree(sunzilog_port_table); |
1121 | sunzilog_irq_chain = NULL; | 1121 | sunzilog_irq_chain = NULL; |
1122 | kfree(sunzilog_chip_regs); | 1122 | kfree(sunzilog_chip_regs); |
1123 | } | 1123 | } |
1124 | 1124 | ||
1125 | #define ZS_PUT_CHAR_MAX_DELAY 2000 /* 10 ms */ | 1125 | #define ZS_PUT_CHAR_MAX_DELAY 2000 /* 10 ms */ |
1126 | 1126 | ||
1127 | static void sunzilog_putchar(struct uart_port *port, int ch) | 1127 | static void sunzilog_putchar(struct uart_port *port, int ch) |
1128 | { | 1128 | { |
1129 | struct zilog_channel __iomem *channel = ZILOG_CHANNEL_FROM_PORT(port); | 1129 | struct zilog_channel __iomem *channel = ZILOG_CHANNEL_FROM_PORT(port); |
1130 | int loops = ZS_PUT_CHAR_MAX_DELAY; | 1130 | int loops = ZS_PUT_CHAR_MAX_DELAY; |
1131 | 1131 | ||
1132 | /* This is a timed polling loop so do not switch the explicit | 1132 | /* This is a timed polling loop so do not switch the explicit |
1133 | * udelay with ZSDELAY as that is a NOP on some platforms. -DaveM | 1133 | * udelay with ZSDELAY as that is a NOP on some platforms. -DaveM |
1134 | */ | 1134 | */ |
1135 | do { | 1135 | do { |
1136 | unsigned char val = readb(&channel->control); | 1136 | unsigned char val = readb(&channel->control); |
1137 | if (val & Tx_BUF_EMP) { | 1137 | if (val & Tx_BUF_EMP) { |
1138 | ZSDELAY(); | 1138 | ZSDELAY(); |
1139 | break; | 1139 | break; |
1140 | } | 1140 | } |
1141 | udelay(5); | 1141 | udelay(5); |
1142 | } while (--loops); | 1142 | } while (--loops); |
1143 | 1143 | ||
1144 | writeb(ch, &channel->data); | 1144 | writeb(ch, &channel->data); |
1145 | ZSDELAY(); | 1145 | ZSDELAY(); |
1146 | ZS_WSYNC(channel); | 1146 | ZS_WSYNC(channel); |
1147 | } | 1147 | } |
1148 | 1148 | ||
1149 | #ifdef CONFIG_SERIO | 1149 | #ifdef CONFIG_SERIO |
1150 | 1150 | ||
1151 | static DEFINE_SPINLOCK(sunzilog_serio_lock); | 1151 | static DEFINE_SPINLOCK(sunzilog_serio_lock); |
1152 | 1152 | ||
1153 | static int sunzilog_serio_write(struct serio *serio, unsigned char ch) | 1153 | static int sunzilog_serio_write(struct serio *serio, unsigned char ch) |
1154 | { | 1154 | { |
1155 | struct uart_sunzilog_port *up = serio->port_data; | 1155 | struct uart_sunzilog_port *up = serio->port_data; |
1156 | unsigned long flags; | 1156 | unsigned long flags; |
1157 | 1157 | ||
1158 | spin_lock_irqsave(&sunzilog_serio_lock, flags); | 1158 | spin_lock_irqsave(&sunzilog_serio_lock, flags); |
1159 | 1159 | ||
1160 | sunzilog_putchar(&up->port, ch); | 1160 | sunzilog_putchar(&up->port, ch); |
1161 | 1161 | ||
1162 | spin_unlock_irqrestore(&sunzilog_serio_lock, flags); | 1162 | spin_unlock_irqrestore(&sunzilog_serio_lock, flags); |
1163 | 1163 | ||
1164 | return 0; | 1164 | return 0; |
1165 | } | 1165 | } |
1166 | 1166 | ||
1167 | static int sunzilog_serio_open(struct serio *serio) | 1167 | static int sunzilog_serio_open(struct serio *serio) |
1168 | { | 1168 | { |
1169 | struct uart_sunzilog_port *up = serio->port_data; | 1169 | struct uart_sunzilog_port *up = serio->port_data; |
1170 | unsigned long flags; | 1170 | unsigned long flags; |
1171 | int ret; | 1171 | int ret; |
1172 | 1172 | ||
1173 | spin_lock_irqsave(&sunzilog_serio_lock, flags); | 1173 | spin_lock_irqsave(&sunzilog_serio_lock, flags); |
1174 | if (!up->serio_open) { | 1174 | if (!up->serio_open) { |
1175 | up->serio_open = 1; | 1175 | up->serio_open = 1; |
1176 | ret = 0; | 1176 | ret = 0; |
1177 | } else | 1177 | } else |
1178 | ret = -EBUSY; | 1178 | ret = -EBUSY; |
1179 | spin_unlock_irqrestore(&sunzilog_serio_lock, flags); | 1179 | spin_unlock_irqrestore(&sunzilog_serio_lock, flags); |
1180 | 1180 | ||
1181 | return ret; | 1181 | return ret; |
1182 | } | 1182 | } |
1183 | 1183 | ||
1184 | static void sunzilog_serio_close(struct serio *serio) | 1184 | static void sunzilog_serio_close(struct serio *serio) |
1185 | { | 1185 | { |
1186 | struct uart_sunzilog_port *up = serio->port_data; | 1186 | struct uart_sunzilog_port *up = serio->port_data; |
1187 | unsigned long flags; | 1187 | unsigned long flags; |
1188 | 1188 | ||
1189 | spin_lock_irqsave(&sunzilog_serio_lock, flags); | 1189 | spin_lock_irqsave(&sunzilog_serio_lock, flags); |
1190 | up->serio_open = 0; | 1190 | up->serio_open = 0; |
1191 | spin_unlock_irqrestore(&sunzilog_serio_lock, flags); | 1191 | spin_unlock_irqrestore(&sunzilog_serio_lock, flags); |
1192 | } | 1192 | } |
1193 | 1193 | ||
1194 | #endif /* CONFIG_SERIO */ | 1194 | #endif /* CONFIG_SERIO */ |
1195 | 1195 | ||
1196 | #ifdef CONFIG_SERIAL_SUNZILOG_CONSOLE | 1196 | #ifdef CONFIG_SERIAL_SUNZILOG_CONSOLE |
1197 | static void | 1197 | static void |
1198 | sunzilog_console_write(struct console *con, const char *s, unsigned int count) | 1198 | sunzilog_console_write(struct console *con, const char *s, unsigned int count) |
1199 | { | 1199 | { |
1200 | struct uart_sunzilog_port *up = &sunzilog_port_table[con->index]; | 1200 | struct uart_sunzilog_port *up = &sunzilog_port_table[con->index]; |
1201 | unsigned long flags; | 1201 | unsigned long flags; |
1202 | int locked = 1; | 1202 | int locked = 1; |
1203 | 1203 | ||
1204 | local_irq_save(flags); | 1204 | local_irq_save(flags); |
1205 | if (up->port.sysrq) { | 1205 | if (up->port.sysrq) { |
1206 | locked = 0; | 1206 | locked = 0; |
1207 | } else if (oops_in_progress) { | 1207 | } else if (oops_in_progress) { |
1208 | locked = spin_trylock(&up->port.lock); | 1208 | locked = spin_trylock(&up->port.lock); |
1209 | } else | 1209 | } else |
1210 | spin_lock(&up->port.lock); | 1210 | spin_lock(&up->port.lock); |
1211 | 1211 | ||
1212 | uart_console_write(&up->port, s, count, sunzilog_putchar); | 1212 | uart_console_write(&up->port, s, count, sunzilog_putchar); |
1213 | udelay(2); | 1213 | udelay(2); |
1214 | 1214 | ||
1215 | if (locked) | 1215 | if (locked) |
1216 | spin_unlock(&up->port.lock); | 1216 | spin_unlock(&up->port.lock); |
1217 | local_irq_restore(flags); | 1217 | local_irq_restore(flags); |
1218 | } | 1218 | } |
1219 | 1219 | ||
1220 | static int __init sunzilog_console_setup(struct console *con, char *options) | 1220 | static int __init sunzilog_console_setup(struct console *con, char *options) |
1221 | { | 1221 | { |
1222 | struct uart_sunzilog_port *up = &sunzilog_port_table[con->index]; | 1222 | struct uart_sunzilog_port *up = &sunzilog_port_table[con->index]; |
1223 | unsigned long flags; | 1223 | unsigned long flags; |
1224 | int baud, brg; | 1224 | int baud, brg; |
1225 | 1225 | ||
1226 | if (up->port.type != PORT_SUNZILOG) | 1226 | if (up->port.type != PORT_SUNZILOG) |
1227 | return -1; | 1227 | return -1; |
1228 | 1228 | ||
1229 | printk(KERN_INFO "Console: ttyS%d (SunZilog zs%d)\n", | 1229 | printk(KERN_INFO "Console: ttyS%d (SunZilog zs%d)\n", |
1230 | (sunzilog_reg.minor - 64) + con->index, con->index); | 1230 | (sunzilog_reg.minor - 64) + con->index, con->index); |
1231 | 1231 | ||
1232 | /* Get firmware console settings. */ | 1232 | /* Get firmware console settings. */ |
1233 | sunserial_console_termios(con, up->port.dev->of_node); | 1233 | sunserial_console_termios(con, up->port.dev->of_node); |
1234 | 1234 | ||
1235 | /* Firmware console speed is limited to 150-->38400 baud so | 1235 | /* Firmware console speed is limited to 150-->38400 baud so |
1236 | * this hackish cflag thing is OK. | 1236 | * this hackish cflag thing is OK. |
1237 | */ | 1237 | */ |
1238 | switch (con->cflag & CBAUD) { | 1238 | switch (con->cflag & CBAUD) { |
1239 | case B150: baud = 150; break; | 1239 | case B150: baud = 150; break; |
1240 | case B300: baud = 300; break; | 1240 | case B300: baud = 300; break; |
1241 | case B600: baud = 600; break; | 1241 | case B600: baud = 600; break; |
1242 | case B1200: baud = 1200; break; | 1242 | case B1200: baud = 1200; break; |
1243 | case B2400: baud = 2400; break; | 1243 | case B2400: baud = 2400; break; |
1244 | case B4800: baud = 4800; break; | 1244 | case B4800: baud = 4800; break; |
1245 | default: case B9600: baud = 9600; break; | 1245 | default: case B9600: baud = 9600; break; |
1246 | case B19200: baud = 19200; break; | 1246 | case B19200: baud = 19200; break; |
1247 | case B38400: baud = 38400; break; | 1247 | case B38400: baud = 38400; break; |
1248 | }; | 1248 | }; |
1249 | 1249 | ||
1250 | brg = BPS_TO_BRG(baud, ZS_CLOCK / ZS_CLOCK_DIVISOR); | 1250 | brg = BPS_TO_BRG(baud, ZS_CLOCK / ZS_CLOCK_DIVISOR); |
1251 | 1251 | ||
1252 | spin_lock_irqsave(&up->port.lock, flags); | 1252 | spin_lock_irqsave(&up->port.lock, flags); |
1253 | 1253 | ||
1254 | up->curregs[R15] |= BRKIE; | 1254 | up->curregs[R15] |= BRKIE; |
1255 | sunzilog_convert_to_zs(up, con->cflag, 0, brg); | 1255 | sunzilog_convert_to_zs(up, con->cflag, 0, brg); |
1256 | 1256 | ||
1257 | sunzilog_set_mctrl(&up->port, TIOCM_DTR | TIOCM_RTS); | 1257 | sunzilog_set_mctrl(&up->port, TIOCM_DTR | TIOCM_RTS); |
1258 | __sunzilog_startup(up); | 1258 | __sunzilog_startup(up); |
1259 | 1259 | ||
1260 | spin_unlock_irqrestore(&up->port.lock, flags); | 1260 | spin_unlock_irqrestore(&up->port.lock, flags); |
1261 | 1261 | ||
1262 | return 0; | 1262 | return 0; |
1263 | } | 1263 | } |
1264 | 1264 | ||
1265 | static struct console sunzilog_console_ops = { | 1265 | static struct console sunzilog_console_ops = { |
1266 | .name = "ttyS", | 1266 | .name = "ttyS", |
1267 | .write = sunzilog_console_write, | 1267 | .write = sunzilog_console_write, |
1268 | .device = uart_console_device, | 1268 | .device = uart_console_device, |
1269 | .setup = sunzilog_console_setup, | 1269 | .setup = sunzilog_console_setup, |
1270 | .flags = CON_PRINTBUFFER, | 1270 | .flags = CON_PRINTBUFFER, |
1271 | .index = -1, | 1271 | .index = -1, |
1272 | .data = &sunzilog_reg, | 1272 | .data = &sunzilog_reg, |
1273 | }; | 1273 | }; |
1274 | 1274 | ||
1275 | static inline struct console *SUNZILOG_CONSOLE(void) | 1275 | static inline struct console *SUNZILOG_CONSOLE(void) |
1276 | { | 1276 | { |
1277 | return &sunzilog_console_ops; | 1277 | return &sunzilog_console_ops; |
1278 | } | 1278 | } |
1279 | 1279 | ||
1280 | #else | 1280 | #else |
1281 | #define SUNZILOG_CONSOLE() (NULL) | 1281 | #define SUNZILOG_CONSOLE() (NULL) |
1282 | #endif | 1282 | #endif |
1283 | 1283 | ||
1284 | static void __devinit sunzilog_init_kbdms(struct uart_sunzilog_port *up) | 1284 | static void __devinit sunzilog_init_kbdms(struct uart_sunzilog_port *up) |
1285 | { | 1285 | { |
1286 | int baud, brg; | 1286 | int baud, brg; |
1287 | 1287 | ||
1288 | if (up->flags & SUNZILOG_FLAG_CONS_KEYB) { | 1288 | if (up->flags & SUNZILOG_FLAG_CONS_KEYB) { |
1289 | up->cflag = B1200 | CS8 | CLOCAL | CREAD; | 1289 | up->cflag = B1200 | CS8 | CLOCAL | CREAD; |
1290 | baud = 1200; | 1290 | baud = 1200; |
1291 | } else { | 1291 | } else { |
1292 | up->cflag = B4800 | CS8 | CLOCAL | CREAD; | 1292 | up->cflag = B4800 | CS8 | CLOCAL | CREAD; |
1293 | baud = 4800; | 1293 | baud = 4800; |
1294 | } | 1294 | } |
1295 | 1295 | ||
1296 | up->curregs[R15] |= BRKIE; | 1296 | up->curregs[R15] |= BRKIE; |
1297 | brg = BPS_TO_BRG(baud, ZS_CLOCK / ZS_CLOCK_DIVISOR); | 1297 | brg = BPS_TO_BRG(baud, ZS_CLOCK / ZS_CLOCK_DIVISOR); |
1298 | sunzilog_convert_to_zs(up, up->cflag, 0, brg); | 1298 | sunzilog_convert_to_zs(up, up->cflag, 0, brg); |
1299 | sunzilog_set_mctrl(&up->port, TIOCM_DTR | TIOCM_RTS); | 1299 | sunzilog_set_mctrl(&up->port, TIOCM_DTR | TIOCM_RTS); |
1300 | __sunzilog_startup(up); | 1300 | __sunzilog_startup(up); |
1301 | } | 1301 | } |
1302 | 1302 | ||
1303 | #ifdef CONFIG_SERIO | 1303 | #ifdef CONFIG_SERIO |
1304 | static void __devinit sunzilog_register_serio(struct uart_sunzilog_port *up) | 1304 | static void __devinit sunzilog_register_serio(struct uart_sunzilog_port *up) |
1305 | { | 1305 | { |
1306 | struct serio *serio = &up->serio; | 1306 | struct serio *serio = &up->serio; |
1307 | 1307 | ||
1308 | serio->port_data = up; | 1308 | serio->port_data = up; |
1309 | 1309 | ||
1310 | serio->id.type = SERIO_RS232; | 1310 | serio->id.type = SERIO_RS232; |
1311 | if (up->flags & SUNZILOG_FLAG_CONS_KEYB) { | 1311 | if (up->flags & SUNZILOG_FLAG_CONS_KEYB) { |
1312 | serio->id.proto = SERIO_SUNKBD; | 1312 | serio->id.proto = SERIO_SUNKBD; |
1313 | strlcpy(serio->name, "zskbd", sizeof(serio->name)); | 1313 | strlcpy(serio->name, "zskbd", sizeof(serio->name)); |
1314 | } else { | 1314 | } else { |
1315 | serio->id.proto = SERIO_SUN; | 1315 | serio->id.proto = SERIO_SUN; |
1316 | serio->id.extra = 1; | 1316 | serio->id.extra = 1; |
1317 | strlcpy(serio->name, "zsms", sizeof(serio->name)); | 1317 | strlcpy(serio->name, "zsms", sizeof(serio->name)); |
1318 | } | 1318 | } |
1319 | strlcpy(serio->phys, | 1319 | strlcpy(serio->phys, |
1320 | ((up->flags & SUNZILOG_FLAG_CONS_KEYB) ? | 1320 | ((up->flags & SUNZILOG_FLAG_CONS_KEYB) ? |
1321 | "zs/serio0" : "zs/serio1"), | 1321 | "zs/serio0" : "zs/serio1"), |
1322 | sizeof(serio->phys)); | 1322 | sizeof(serio->phys)); |
1323 | 1323 | ||
1324 | serio->write = sunzilog_serio_write; | 1324 | serio->write = sunzilog_serio_write; |
1325 | serio->open = sunzilog_serio_open; | 1325 | serio->open = sunzilog_serio_open; |
1326 | serio->close = sunzilog_serio_close; | 1326 | serio->close = sunzilog_serio_close; |
1327 | serio->dev.parent = up->port.dev; | 1327 | serio->dev.parent = up->port.dev; |
1328 | 1328 | ||
1329 | serio_register_port(serio); | 1329 | serio_register_port(serio); |
1330 | } | 1330 | } |
1331 | #endif | 1331 | #endif |
1332 | 1332 | ||
1333 | static void __devinit sunzilog_init_hw(struct uart_sunzilog_port *up) | 1333 | static void __devinit sunzilog_init_hw(struct uart_sunzilog_port *up) |
1334 | { | 1334 | { |
1335 | struct zilog_channel __iomem *channel; | 1335 | struct zilog_channel __iomem *channel; |
1336 | unsigned long flags; | 1336 | unsigned long flags; |
1337 | int baud, brg; | 1337 | int baud, brg; |
1338 | 1338 | ||
1339 | channel = ZILOG_CHANNEL_FROM_PORT(&up->port); | 1339 | channel = ZILOG_CHANNEL_FROM_PORT(&up->port); |
1340 | 1340 | ||
1341 | spin_lock_irqsave(&up->port.lock, flags); | 1341 | spin_lock_irqsave(&up->port.lock, flags); |
1342 | if (ZS_IS_CHANNEL_A(up)) { | 1342 | if (ZS_IS_CHANNEL_A(up)) { |
1343 | write_zsreg(channel, R9, FHWRES); | 1343 | write_zsreg(channel, R9, FHWRES); |
1344 | ZSDELAY_LONG(); | 1344 | ZSDELAY_LONG(); |
1345 | (void) read_zsreg(channel, R0); | 1345 | (void) read_zsreg(channel, R0); |
1346 | } | 1346 | } |
1347 | 1347 | ||
1348 | if (up->flags & (SUNZILOG_FLAG_CONS_KEYB | | 1348 | if (up->flags & (SUNZILOG_FLAG_CONS_KEYB | |
1349 | SUNZILOG_FLAG_CONS_MOUSE)) { | 1349 | SUNZILOG_FLAG_CONS_MOUSE)) { |
1350 | up->curregs[R1] = EXT_INT_ENAB | INT_ALL_Rx | TxINT_ENAB; | 1350 | up->curregs[R1] = EXT_INT_ENAB | INT_ALL_Rx | TxINT_ENAB; |
1351 | up->curregs[R4] = PAR_EVEN | X16CLK | SB1; | 1351 | up->curregs[R4] = PAR_EVEN | X16CLK | SB1; |
1352 | up->curregs[R3] = RxENAB | Rx8; | 1352 | up->curregs[R3] = RxENAB | Rx8; |
1353 | up->curregs[R5] = TxENAB | Tx8; | 1353 | up->curregs[R5] = TxENAB | Tx8; |
1354 | up->curregs[R6] = 0x00; /* SDLC Address */ | 1354 | up->curregs[R6] = 0x00; /* SDLC Address */ |
1355 | up->curregs[R7] = 0x7E; /* SDLC Flag */ | 1355 | up->curregs[R7] = 0x7E; /* SDLC Flag */ |
1356 | up->curregs[R9] = NV; | 1356 | up->curregs[R9] = NV; |
1357 | up->curregs[R7p] = 0x00; | 1357 | up->curregs[R7p] = 0x00; |
1358 | sunzilog_init_kbdms(up); | 1358 | sunzilog_init_kbdms(up); |
1359 | /* Only enable interrupts if an ISR handler available */ | 1359 | /* Only enable interrupts if an ISR handler available */ |
1360 | if (up->flags & SUNZILOG_FLAG_ISR_HANDLER) | 1360 | if (up->flags & SUNZILOG_FLAG_ISR_HANDLER) |
1361 | up->curregs[R9] |= MIE; | 1361 | up->curregs[R9] |= MIE; |
1362 | write_zsreg(channel, R9, up->curregs[R9]); | 1362 | write_zsreg(channel, R9, up->curregs[R9]); |
1363 | } else { | 1363 | } else { |
1364 | /* Normal serial TTY. */ | 1364 | /* Normal serial TTY. */ |
1365 | up->parity_mask = 0xff; | 1365 | up->parity_mask = 0xff; |
1366 | up->curregs[R1] = EXT_INT_ENAB | INT_ALL_Rx | TxINT_ENAB; | 1366 | up->curregs[R1] = EXT_INT_ENAB | INT_ALL_Rx | TxINT_ENAB; |
1367 | up->curregs[R4] = PAR_EVEN | X16CLK | SB1; | 1367 | up->curregs[R4] = PAR_EVEN | X16CLK | SB1; |
1368 | up->curregs[R3] = RxENAB | Rx8; | 1368 | up->curregs[R3] = RxENAB | Rx8; |
1369 | up->curregs[R5] = TxENAB | Tx8; | 1369 | up->curregs[R5] = TxENAB | Tx8; |
1370 | up->curregs[R6] = 0x00; /* SDLC Address */ | 1370 | up->curregs[R6] = 0x00; /* SDLC Address */ |
1371 | up->curregs[R7] = 0x7E; /* SDLC Flag */ | 1371 | up->curregs[R7] = 0x7E; /* SDLC Flag */ |
1372 | up->curregs[R9] = NV; | 1372 | up->curregs[R9] = NV; |
1373 | up->curregs[R10] = NRZ; | 1373 | up->curregs[R10] = NRZ; |
1374 | up->curregs[R11] = TCBR | RCBR; | 1374 | up->curregs[R11] = TCBR | RCBR; |
1375 | baud = 9600; | 1375 | baud = 9600; |
1376 | brg = BPS_TO_BRG(baud, ZS_CLOCK / ZS_CLOCK_DIVISOR); | 1376 | brg = BPS_TO_BRG(baud, ZS_CLOCK / ZS_CLOCK_DIVISOR); |
1377 | up->curregs[R12] = (brg & 0xff); | 1377 | up->curregs[R12] = (brg & 0xff); |
1378 | up->curregs[R13] = (brg >> 8) & 0xff; | 1378 | up->curregs[R13] = (brg >> 8) & 0xff; |
1379 | up->curregs[R14] = BRSRC | BRENAB; | 1379 | up->curregs[R14] = BRSRC | BRENAB; |
1380 | up->curregs[R15] = FIFOEN; /* Use FIFO if on ESCC */ | 1380 | up->curregs[R15] = FIFOEN; /* Use FIFO if on ESCC */ |
1381 | up->curregs[R7p] = TxFIFO_LVL | RxFIFO_LVL; | 1381 | up->curregs[R7p] = TxFIFO_LVL | RxFIFO_LVL; |
1382 | if (__load_zsregs(channel, up->curregs)) { | 1382 | if (__load_zsregs(channel, up->curregs)) { |
1383 | up->flags |= SUNZILOG_FLAG_ESCC; | 1383 | up->flags |= SUNZILOG_FLAG_ESCC; |
1384 | } | 1384 | } |
1385 | /* Only enable interrupts if an ISR handler available */ | 1385 | /* Only enable interrupts if an ISR handler available */ |
1386 | if (up->flags & SUNZILOG_FLAG_ISR_HANDLER) | 1386 | if (up->flags & SUNZILOG_FLAG_ISR_HANDLER) |
1387 | up->curregs[R9] |= MIE; | 1387 | up->curregs[R9] |= MIE; |
1388 | write_zsreg(channel, R9, up->curregs[R9]); | 1388 | write_zsreg(channel, R9, up->curregs[R9]); |
1389 | } | 1389 | } |
1390 | 1390 | ||
1391 | spin_unlock_irqrestore(&up->port.lock, flags); | 1391 | spin_unlock_irqrestore(&up->port.lock, flags); |
1392 | 1392 | ||
1393 | #ifdef CONFIG_SERIO | 1393 | #ifdef CONFIG_SERIO |
1394 | if (up->flags & (SUNZILOG_FLAG_CONS_KEYB | | 1394 | if (up->flags & (SUNZILOG_FLAG_CONS_KEYB | |
1395 | SUNZILOG_FLAG_CONS_MOUSE)) | 1395 | SUNZILOG_FLAG_CONS_MOUSE)) |
1396 | sunzilog_register_serio(up); | 1396 | sunzilog_register_serio(up); |
1397 | #endif | 1397 | #endif |
1398 | } | 1398 | } |
1399 | 1399 | ||
1400 | static int zilog_irq; | 1400 | static int zilog_irq; |
1401 | 1401 | ||
1402 | static int __devinit zs_probe(struct platform_device *op) | 1402 | static int __devinit zs_probe(struct platform_device *op) |
1403 | { | 1403 | { |
1404 | static int kbm_inst, uart_inst; | 1404 | static int kbm_inst, uart_inst; |
1405 | int inst; | 1405 | int inst; |
1406 | struct uart_sunzilog_port *up; | 1406 | struct uart_sunzilog_port *up; |
1407 | struct zilog_layout __iomem *rp; | 1407 | struct zilog_layout __iomem *rp; |
1408 | int keyboard_mouse = 0; | 1408 | int keyboard_mouse = 0; |
1409 | int err; | 1409 | int err; |
1410 | 1410 | ||
1411 | if (of_find_property(op->dev.of_node, "keyboard", NULL)) | 1411 | if (of_find_property(op->dev.of_node, "keyboard", NULL)) |
1412 | keyboard_mouse = 1; | 1412 | keyboard_mouse = 1; |
1413 | 1413 | ||
1414 | /* uarts must come before keyboards/mice */ | 1414 | /* uarts must come before keyboards/mice */ |
1415 | if (keyboard_mouse) | 1415 | if (keyboard_mouse) |
1416 | inst = uart_chip_count + kbm_inst; | 1416 | inst = uart_chip_count + kbm_inst; |
1417 | else | 1417 | else |
1418 | inst = uart_inst; | 1418 | inst = uart_inst; |
1419 | 1419 | ||
1420 | sunzilog_chip_regs[inst] = of_ioremap(&op->resource[0], 0, | 1420 | sunzilog_chip_regs[inst] = of_ioremap(&op->resource[0], 0, |
1421 | sizeof(struct zilog_layout), | 1421 | sizeof(struct zilog_layout), |
1422 | "zs"); | 1422 | "zs"); |
1423 | if (!sunzilog_chip_regs[inst]) | 1423 | if (!sunzilog_chip_regs[inst]) |
1424 | return -ENOMEM; | 1424 | return -ENOMEM; |
1425 | 1425 | ||
1426 | rp = sunzilog_chip_regs[inst]; | 1426 | rp = sunzilog_chip_regs[inst]; |
1427 | 1427 | ||
1428 | if (!zilog_irq) | 1428 | if (!zilog_irq) |
1429 | zilog_irq = op->archdata.irqs[0]; | 1429 | zilog_irq = op->archdata.irqs[0]; |
1430 | 1430 | ||
1431 | up = &sunzilog_port_table[inst * 2]; | 1431 | up = &sunzilog_port_table[inst * 2]; |
1432 | 1432 | ||
1433 | /* Channel A */ | 1433 | /* Channel A */ |
1434 | up[0].port.mapbase = op->resource[0].start + 0x00; | 1434 | up[0].port.mapbase = op->resource[0].start + 0x00; |
1435 | up[0].port.membase = (void __iomem *) &rp->channelA; | 1435 | up[0].port.membase = (void __iomem *) &rp->channelA; |
1436 | up[0].port.iotype = UPIO_MEM; | 1436 | up[0].port.iotype = UPIO_MEM; |
1437 | up[0].port.irq = op->archdata.irqs[0]; | 1437 | up[0].port.irq = op->archdata.irqs[0]; |
1438 | up[0].port.uartclk = ZS_CLOCK; | 1438 | up[0].port.uartclk = ZS_CLOCK; |
1439 | up[0].port.fifosize = 1; | 1439 | up[0].port.fifosize = 1; |
1440 | up[0].port.ops = &sunzilog_pops; | 1440 | up[0].port.ops = &sunzilog_pops; |
1441 | up[0].port.type = PORT_SUNZILOG; | 1441 | up[0].port.type = PORT_SUNZILOG; |
1442 | up[0].port.flags = 0; | 1442 | up[0].port.flags = 0; |
1443 | up[0].port.line = (inst * 2) + 0; | 1443 | up[0].port.line = (inst * 2) + 0; |
1444 | up[0].port.dev = &op->dev; | 1444 | up[0].port.dev = &op->dev; |
1445 | up[0].flags |= SUNZILOG_FLAG_IS_CHANNEL_A; | 1445 | up[0].flags |= SUNZILOG_FLAG_IS_CHANNEL_A; |
1446 | if (keyboard_mouse) | 1446 | if (keyboard_mouse) |
1447 | up[0].flags |= SUNZILOG_FLAG_CONS_KEYB; | 1447 | up[0].flags |= SUNZILOG_FLAG_CONS_KEYB; |
1448 | sunzilog_init_hw(&up[0]); | 1448 | sunzilog_init_hw(&up[0]); |
1449 | 1449 | ||
1450 | /* Channel B */ | 1450 | /* Channel B */ |
1451 | up[1].port.mapbase = op->resource[0].start + 0x04; | 1451 | up[1].port.mapbase = op->resource[0].start + 0x04; |
1452 | up[1].port.membase = (void __iomem *) &rp->channelB; | 1452 | up[1].port.membase = (void __iomem *) &rp->channelB; |
1453 | up[1].port.iotype = UPIO_MEM; | 1453 | up[1].port.iotype = UPIO_MEM; |
1454 | up[1].port.irq = op->archdata.irqs[0]; | 1454 | up[1].port.irq = op->archdata.irqs[0]; |
1455 | up[1].port.uartclk = ZS_CLOCK; | 1455 | up[1].port.uartclk = ZS_CLOCK; |
1456 | up[1].port.fifosize = 1; | 1456 | up[1].port.fifosize = 1; |
1457 | up[1].port.ops = &sunzilog_pops; | 1457 | up[1].port.ops = &sunzilog_pops; |
1458 | up[1].port.type = PORT_SUNZILOG; | 1458 | up[1].port.type = PORT_SUNZILOG; |
1459 | up[1].port.flags = 0; | 1459 | up[1].port.flags = 0; |
1460 | up[1].port.line = (inst * 2) + 1; | 1460 | up[1].port.line = (inst * 2) + 1; |
1461 | up[1].port.dev = &op->dev; | 1461 | up[1].port.dev = &op->dev; |
1462 | up[1].flags |= 0; | 1462 | up[1].flags |= 0; |
1463 | if (keyboard_mouse) | 1463 | if (keyboard_mouse) |
1464 | up[1].flags |= SUNZILOG_FLAG_CONS_MOUSE; | 1464 | up[1].flags |= SUNZILOG_FLAG_CONS_MOUSE; |
1465 | sunzilog_init_hw(&up[1]); | 1465 | sunzilog_init_hw(&up[1]); |
1466 | 1466 | ||
1467 | if (!keyboard_mouse) { | 1467 | if (!keyboard_mouse) { |
1468 | if (sunserial_console_match(SUNZILOG_CONSOLE(), op->dev.of_node, | 1468 | if (sunserial_console_match(SUNZILOG_CONSOLE(), op->dev.of_node, |
1469 | &sunzilog_reg, up[0].port.line, | 1469 | &sunzilog_reg, up[0].port.line, |
1470 | false)) | 1470 | false)) |
1471 | up->flags |= SUNZILOG_FLAG_IS_CONS; | 1471 | up->flags |= SUNZILOG_FLAG_IS_CONS; |
1472 | err = uart_add_one_port(&sunzilog_reg, &up[0].port); | 1472 | err = uart_add_one_port(&sunzilog_reg, &up[0].port); |
1473 | if (err) { | 1473 | if (err) { |
1474 | of_iounmap(&op->resource[0], | 1474 | of_iounmap(&op->resource[0], |
1475 | rp, sizeof(struct zilog_layout)); | 1475 | rp, sizeof(struct zilog_layout)); |
1476 | return err; | 1476 | return err; |
1477 | } | 1477 | } |
1478 | if (sunserial_console_match(SUNZILOG_CONSOLE(), op->dev.of_node, | 1478 | if (sunserial_console_match(SUNZILOG_CONSOLE(), op->dev.of_node, |
1479 | &sunzilog_reg, up[1].port.line, | 1479 | &sunzilog_reg, up[1].port.line, |
1480 | false)) | 1480 | false)) |
1481 | up->flags |= SUNZILOG_FLAG_IS_CONS; | 1481 | up->flags |= SUNZILOG_FLAG_IS_CONS; |
1482 | err = uart_add_one_port(&sunzilog_reg, &up[1].port); | 1482 | err = uart_add_one_port(&sunzilog_reg, &up[1].port); |
1483 | if (err) { | 1483 | if (err) { |
1484 | uart_remove_one_port(&sunzilog_reg, &up[0].port); | 1484 | uart_remove_one_port(&sunzilog_reg, &up[0].port); |
1485 | of_iounmap(&op->resource[0], | 1485 | of_iounmap(&op->resource[0], |
1486 | rp, sizeof(struct zilog_layout)); | 1486 | rp, sizeof(struct zilog_layout)); |
1487 | return err; | 1487 | return err; |
1488 | } | 1488 | } |
1489 | uart_inst++; | 1489 | uart_inst++; |
1490 | } else { | 1490 | } else { |
1491 | printk(KERN_INFO "%s: Keyboard at MMIO 0x%llx (irq = %d) " | 1491 | printk(KERN_INFO "%s: Keyboard at MMIO 0x%llx (irq = %d) " |
1492 | "is a %s\n", | 1492 | "is a %s\n", |
1493 | dev_name(&op->dev), | 1493 | dev_name(&op->dev), |
1494 | (unsigned long long) up[0].port.mapbase, | 1494 | (unsigned long long) up[0].port.mapbase, |
1495 | op->archdata.irqs[0], sunzilog_type(&up[0].port)); | 1495 | op->archdata.irqs[0], sunzilog_type(&up[0].port)); |
1496 | printk(KERN_INFO "%s: Mouse at MMIO 0x%llx (irq = %d) " | 1496 | printk(KERN_INFO "%s: Mouse at MMIO 0x%llx (irq = %d) " |
1497 | "is a %s\n", | 1497 | "is a %s\n", |
1498 | dev_name(&op->dev), | 1498 | dev_name(&op->dev), |
1499 | (unsigned long long) up[1].port.mapbase, | 1499 | (unsigned long long) up[1].port.mapbase, |
1500 | op->archdata.irqs[0], sunzilog_type(&up[1].port)); | 1500 | op->archdata.irqs[0], sunzilog_type(&up[1].port)); |
1501 | kbm_inst++; | 1501 | kbm_inst++; |
1502 | } | 1502 | } |
1503 | 1503 | ||
1504 | dev_set_drvdata(&op->dev, &up[0]); | 1504 | dev_set_drvdata(&op->dev, &up[0]); |
1505 | 1505 | ||
1506 | return 0; | 1506 | return 0; |
1507 | } | 1507 | } |
1508 | 1508 | ||
1509 | static void __devexit zs_remove_one(struct uart_sunzilog_port *up) | 1509 | static void __devexit zs_remove_one(struct uart_sunzilog_port *up) |
1510 | { | 1510 | { |
1511 | if (ZS_IS_KEYB(up) || ZS_IS_MOUSE(up)) { | 1511 | if (ZS_IS_KEYB(up) || ZS_IS_MOUSE(up)) { |
1512 | #ifdef CONFIG_SERIO | 1512 | #ifdef CONFIG_SERIO |
1513 | serio_unregister_port(&up->serio); | 1513 | serio_unregister_port(&up->serio); |
1514 | #endif | 1514 | #endif |
1515 | } else | 1515 | } else |
1516 | uart_remove_one_port(&sunzilog_reg, &up->port); | 1516 | uart_remove_one_port(&sunzilog_reg, &up->port); |
1517 | } | 1517 | } |
1518 | 1518 | ||
1519 | static int __devexit zs_remove(struct platform_device *op) | 1519 | static int __devexit zs_remove(struct platform_device *op) |
1520 | { | 1520 | { |
1521 | struct uart_sunzilog_port *up = dev_get_drvdata(&op->dev); | 1521 | struct uart_sunzilog_port *up = dev_get_drvdata(&op->dev); |
1522 | struct zilog_layout __iomem *regs; | 1522 | struct zilog_layout __iomem *regs; |
1523 | 1523 | ||
1524 | zs_remove_one(&up[0]); | 1524 | zs_remove_one(&up[0]); |
1525 | zs_remove_one(&up[1]); | 1525 | zs_remove_one(&up[1]); |
1526 | 1526 | ||
1527 | regs = sunzilog_chip_regs[up[0].port.line / 2]; | 1527 | regs = sunzilog_chip_regs[up[0].port.line / 2]; |
1528 | of_iounmap(&op->resource[0], regs, sizeof(struct zilog_layout)); | 1528 | of_iounmap(&op->resource[0], regs, sizeof(struct zilog_layout)); |
1529 | 1529 | ||
1530 | dev_set_drvdata(&op->dev, NULL); | 1530 | dev_set_drvdata(&op->dev, NULL); |
1531 | 1531 | ||
1532 | return 0; | 1532 | return 0; |
1533 | } | 1533 | } |
1534 | 1534 | ||
1535 | static const struct of_device_id zs_match[] = { | 1535 | static const struct of_device_id zs_match[] = { |
1536 | { | 1536 | { |
1537 | .name = "zs", | 1537 | .name = "zs", |
1538 | }, | 1538 | }, |
1539 | {}, | 1539 | {}, |
1540 | }; | 1540 | }; |
1541 | MODULE_DEVICE_TABLE(of, zs_match); | 1541 | MODULE_DEVICE_TABLE(of, zs_match); |
1542 | 1542 | ||
1543 | static struct platform_driver zs_driver = { | 1543 | static struct platform_driver zs_driver = { |
1544 | .driver = { | 1544 | .driver = { |
1545 | .name = "zs", | 1545 | .name = "zs", |
1546 | .owner = THIS_MODULE, | 1546 | .owner = THIS_MODULE, |
1547 | .of_match_table = zs_match, | 1547 | .of_match_table = zs_match, |
1548 | }, | 1548 | }, |
1549 | .probe = zs_probe, | 1549 | .probe = zs_probe, |
1550 | .remove = __devexit_p(zs_remove), | 1550 | .remove = __devexit_p(zs_remove), |
1551 | }; | 1551 | }; |
1552 | 1552 | ||
1553 | static int __init sunzilog_init(void) | 1553 | static int __init sunzilog_init(void) |
1554 | { | 1554 | { |
1555 | struct device_node *dp; | 1555 | struct device_node *dp; |
1556 | int err; | 1556 | int err; |
1557 | int num_keybms = 0; | 1557 | int num_keybms = 0; |
1558 | int num_sunzilog = 0; | 1558 | int num_sunzilog = 0; |
1559 | 1559 | ||
1560 | for_each_node_by_name(dp, "zs") { | 1560 | for_each_node_by_name(dp, "zs") { |
1561 | num_sunzilog++; | 1561 | num_sunzilog++; |
1562 | if (of_find_property(dp, "keyboard", NULL)) | 1562 | if (of_find_property(dp, "keyboard", NULL)) |
1563 | num_keybms++; | 1563 | num_keybms++; |
1564 | } | 1564 | } |
1565 | 1565 | ||
1566 | if (num_sunzilog) { | 1566 | if (num_sunzilog) { |
1567 | err = sunzilog_alloc_tables(num_sunzilog); | 1567 | err = sunzilog_alloc_tables(num_sunzilog); |
1568 | if (err) | 1568 | if (err) |
1569 | goto out; | 1569 | goto out; |
1570 | 1570 | ||
1571 | uart_chip_count = num_sunzilog - num_keybms; | 1571 | uart_chip_count = num_sunzilog - num_keybms; |
1572 | 1572 | ||
1573 | err = sunserial_register_minors(&sunzilog_reg, | 1573 | err = sunserial_register_minors(&sunzilog_reg, |
1574 | uart_chip_count * 2); | 1574 | uart_chip_count * 2); |
1575 | if (err) | 1575 | if (err) |
1576 | goto out_free_tables; | 1576 | goto out_free_tables; |
1577 | } | 1577 | } |
1578 | 1578 | ||
1579 | err = platform_driver_register(&zs_driver); | 1579 | err = platform_driver_register(&zs_driver); |
1580 | if (err) | 1580 | if (err) |
1581 | goto out_unregister_uart; | 1581 | goto out_unregister_uart; |
1582 | 1582 | ||
1583 | if (!zilog_irq) { | 1583 | if (!zilog_irq) { |
1584 | struct uart_sunzilog_port *up = sunzilog_irq_chain; | 1584 | struct uart_sunzilog_port *up = sunzilog_irq_chain; |
1585 | err = request_irq(zilog_irq, sunzilog_interrupt, IRQF_SHARED, | 1585 | err = request_irq(zilog_irq, sunzilog_interrupt, IRQF_SHARED, |
1586 | "zs", sunzilog_irq_chain); | 1586 | "zs", sunzilog_irq_chain); |
1587 | if (err) | 1587 | if (err) |
1588 | goto out_unregister_driver; | 1588 | goto out_unregister_driver; |
1589 | 1589 | ||
1590 | /* Enable Interrupts */ | 1590 | /* Enable Interrupts */ |
1591 | while (up) { | 1591 | while (up) { |
1592 | struct zilog_channel __iomem *channel; | 1592 | struct zilog_channel __iomem *channel; |
1593 | 1593 | ||
1594 | /* printk (KERN_INFO "Enable IRQ for ZILOG Hardware %p\n", up); */ | 1594 | /* printk (KERN_INFO "Enable IRQ for ZILOG Hardware %p\n", up); */ |
1595 | channel = ZILOG_CHANNEL_FROM_PORT(&up->port); | 1595 | channel = ZILOG_CHANNEL_FROM_PORT(&up->port); |
1596 | up->flags |= SUNZILOG_FLAG_ISR_HANDLER; | 1596 | up->flags |= SUNZILOG_FLAG_ISR_HANDLER; |
1597 | up->curregs[R9] |= MIE; | 1597 | up->curregs[R9] |= MIE; |
1598 | write_zsreg(channel, R9, up->curregs[R9]); | 1598 | write_zsreg(channel, R9, up->curregs[R9]); |
1599 | up = up->next; | 1599 | up = up->next; |
1600 | } | 1600 | } |
1601 | } | 1601 | } |
1602 | 1602 | ||
1603 | out: | 1603 | out: |
1604 | return err; | 1604 | return err; |
1605 | 1605 | ||
1606 | out_unregister_driver: | 1606 | out_unregister_driver: |
1607 | platform_driver_unregister(&zs_driver); | 1607 | platform_driver_unregister(&zs_driver); |
1608 | 1608 | ||
1609 | out_unregister_uart: | 1609 | out_unregister_uart: |
1610 | if (num_sunzilog) { | 1610 | if (num_sunzilog) { |
1611 | sunserial_unregister_minors(&sunzilog_reg, num_sunzilog); | 1611 | sunserial_unregister_minors(&sunzilog_reg, num_sunzilog); |
1612 | sunzilog_reg.cons = NULL; | 1612 | sunzilog_reg.cons = NULL; |
1613 | } | 1613 | } |
1614 | 1614 | ||
1615 | out_free_tables: | 1615 | out_free_tables: |
1616 | sunzilog_free_tables(); | 1616 | sunzilog_free_tables(); |
1617 | goto out; | 1617 | goto out; |
1618 | } | 1618 | } |
1619 | 1619 | ||
1620 | static void __exit sunzilog_exit(void) | 1620 | static void __exit sunzilog_exit(void) |
1621 | { | 1621 | { |
1622 | platform_driver_unregister(&zs_driver); | 1622 | platform_driver_unregister(&zs_driver); |
1623 | 1623 | ||
1624 | if (!zilog_irq) { | 1624 | if (!zilog_irq) { |
1625 | struct uart_sunzilog_port *up = sunzilog_irq_chain; | 1625 | struct uart_sunzilog_port *up = sunzilog_irq_chain; |
1626 | 1626 | ||
1627 | /* Disable Interrupts */ | 1627 | /* Disable Interrupts */ |
1628 | while (up) { | 1628 | while (up) { |
1629 | struct zilog_channel __iomem *channel; | 1629 | struct zilog_channel __iomem *channel; |
1630 | 1630 | ||
1631 | /* printk (KERN_INFO "Disable IRQ for ZILOG Hardware %p\n", up); */ | 1631 | /* printk (KERN_INFO "Disable IRQ for ZILOG Hardware %p\n", up); */ |
1632 | channel = ZILOG_CHANNEL_FROM_PORT(&up->port); | 1632 | channel = ZILOG_CHANNEL_FROM_PORT(&up->port); |
1633 | up->flags &= ~SUNZILOG_FLAG_ISR_HANDLER; | 1633 | up->flags &= ~SUNZILOG_FLAG_ISR_HANDLER; |
1634 | up->curregs[R9] &= ~MIE; | 1634 | up->curregs[R9] &= ~MIE; |
1635 | write_zsreg(channel, R9, up->curregs[R9]); | 1635 | write_zsreg(channel, R9, up->curregs[R9]); |
1636 | up = up->next; | 1636 | up = up->next; |
1637 | } | 1637 | } |
1638 | 1638 | ||
1639 | free_irq(zilog_irq, sunzilog_irq_chain); | 1639 | free_irq(zilog_irq, sunzilog_irq_chain); |
1640 | zilog_irq = 0; | 1640 | zilog_irq = 0; |
1641 | } | 1641 | } |
1642 | 1642 | ||
1643 | if (sunzilog_reg.nr) { | 1643 | if (sunzilog_reg.nr) { |
1644 | sunserial_unregister_minors(&sunzilog_reg, sunzilog_reg.nr); | 1644 | sunserial_unregister_minors(&sunzilog_reg, sunzilog_reg.nr); |
1645 | sunzilog_free_tables(); | 1645 | sunzilog_free_tables(); |
1646 | } | 1646 | } |
1647 | } | 1647 | } |
1648 | 1648 | ||
1649 | module_init(sunzilog_init); | 1649 | module_init(sunzilog_init); |
1650 | module_exit(sunzilog_exit); | 1650 | module_exit(sunzilog_exit); |
1651 | 1651 | ||
1652 | MODULE_AUTHOR("David S. Miller"); | 1652 | MODULE_AUTHOR("David S. Miller"); |
1653 | MODULE_DESCRIPTION("Sun Zilog serial port driver"); | 1653 | MODULE_DESCRIPTION("Sun Zilog serial port driver"); |
1654 | MODULE_VERSION("2.0"); | 1654 | MODULE_VERSION("2.0"); |
1655 | MODULE_LICENSE("GPL"); | 1655 | MODULE_LICENSE("GPL"); |
include/linux/sunserialcore.h
File was created | 1 | /* sunserialcore.h | |
2 | * | ||
3 | * Generic SUN serial/kbd/ms layer. Based entirely | ||
4 | * upon drivers/sbus/char/sunserial.h which is: | ||
5 | * | ||
6 | * Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be) | ||
7 | * | ||
8 | * Port to new UART layer is: | ||
9 | * | ||
10 | * Copyright (C) 2002 David S. Miller (davem@redhat.com) | ||
11 | */ | ||
12 | |||
13 | #ifndef _SERIAL_SUN_H | ||
14 | #define _SERIAL_SUN_H | ||
15 | |||
16 | /* Serial keyboard defines for L1-A processing... */ | ||
17 | #define SUNKBD_RESET 0xff | ||
18 | #define SUNKBD_L1 0x01 | ||
19 | #define SUNKBD_UP 0x80 | ||
20 | #define SUNKBD_A 0x4d | ||
21 | |||
22 | extern unsigned int suncore_mouse_baud_cflag_next(unsigned int, int *); | ||
23 | extern int suncore_mouse_baud_detection(unsigned char, int); | ||
24 | |||
25 | extern int sunserial_register_minors(struct uart_driver *, int); | ||
26 | extern void sunserial_unregister_minors(struct uart_driver *, int); | ||
27 | |||
28 | extern int sunserial_console_match(struct console *, struct device_node *, | ||
29 | struct uart_driver *, int, bool); | ||
30 | extern void sunserial_console_termios(struct console *, | ||
31 | struct device_node *); | ||
32 | |||
33 | #endif /* !(_SERIAL_SUN_H) */ | ||
34 |