This part of the tty tree (unfortunately with all the preceding patches as well) is a dependency for some of the OMAP cleanups, so we've pulled it in as a dependency based on agreement with Greg.
Unified · Split
| @@ -17,3 +17,12 @@ Description: · 16 unmodified lines | ||
| 17 | 17 | device, like 'tty1'. |
| 18 | 18 | The file supports poll() to detect virtual |
| 19 | 19 | console switches. |
| 20 | + | |
| 21 | +What: /sys/class/tty/ttyS0/uartclk | |
| 22 | +Date: Sep 2012 | |
| 23 | +Contact: Tomas Hlavacek <tmshlvck@gmail.com> | |
| 24 | +Description: | |
| 25 | + Shows the current uartclk value associated with the | |
| 26 | + UART port in serial_core, that is bound to TTY like ttyS0. | |
| 27 | + uartclk = 16 * baud_base | |
| 28 | + | |
| @@ -0,0 +1,14 @@ | ||
| 1 | +* NXP LPC32xx SoC High Speed UART | |
| 2 | + | |
| 3 | +Required properties: | |
| 4 | +- compatible: Should be "nxp,lpc3220-hsuart" | |
| 5 | +- reg: Should contain registers location and length | |
| 6 | +- interrupts: Should contain interrupt | |
| 7 | + | |
| 8 | +Example: | |
| 9 | + | |
| 10 | + uart1: serial@40014000 { | |
| 11 | + compatible = "nxp,lpc3220-hsuart"; | |
| 12 | + reg = <0x40014000 0x1000>; | |
| 13 | + interrupts = <26 0>; | |
| 14 | + }; | |
| @@ -25,6 +25,8 @@ Optional properties: · 24 unmodified lines | ||
| 25 | 25 | accesses to the UART (e.g. TI davinci). |
| 26 | 26 | - used-by-rtas : set to indicate that the port is in use by the OpenFirmware |
| 27 | 27 | RTAS and should not be registered. |
| 28 | +- no-loopback-test: set to indicate that the port does not implements loopback | |
| 29 | + test mode | |
| 28 | 30 | |
| 29 | 31 | Example: |
| 30 | 32 | |
| @@ -2,8 +2,6 @@ · 1 unmodified line | ||
| 2 | 2 | - this file. |
| 3 | 3 | README.cycladesZ |
| 4 | 4 | - info on Cyclades-Z firmware loading. |
| 5 | −computone.txt | |
| 6 | − - info on Computone Intelliport II/Plus Multiport Serial Driver. | |
| 7 | 5 | digiepca.txt |
| 8 | 6 | - info on Digi Intl. {PC,PCI,EISA}Xx and Xem series cards. |
| 9 | 7 | hayes-esp.txt |
| @@ -1,520 +0,0 @@ | ||
| 1 | −NOTE: This is an unmaintained driver. It is not guaranteed to work due to | |
| 2 | −changes made in the tty layer in 2.6. If you wish to take over maintenance of | |
| 3 | −this driver, contact Michael Warfield <mhw@wittsend.com>. | |
| 4 | − | |
| 5 | −Changelog: | |
| 6 | −---------- | |
| 7 | −11-01-2001: Original Document | |
| 8 | − | |
| 9 | −10-29-2004: Minor misspelling & format fix, update status of driver. | |
| 10 | − James Nelson <james4765@gmail.com> | |
| 11 | − | |
| 12 | −Computone Intelliport II/Plus Multiport Serial Driver | |
| 13 | −----------------------------------------------------- | |
| 14 | − | |
| 15 | −Release Notes For Linux Kernel 2.2 and higher. | |
| 16 | −These notes are for the drivers which have already been integrated into the | |
| 17 | −kernel and have been tested on Linux kernels 2.0, 2.2, 2.3, and 2.4. | |
| 18 | − | |
| 19 | −Version: 1.2.14 | |
| 20 | −Date: 11/01/2001 | |
| 21 | −Historical Author: Andrew Manison <amanison@america.net> | |
| 22 | −Primary Author: Doug McNash | |
| 23 | − | |
| 24 | −This file assumes that you are using the Computone drivers which are | |
| 25 | −integrated into the kernel sources. For updating the drivers or installing | |
| 26 | −drivers into kernels which do not already have Computone drivers, please | |
| 27 | −refer to the instructions in the README.computone file in the driver patch. | |
| 28 | − | |
| 29 | − | |
| 30 | −1. INTRODUCTION | |
| 31 | − | |
| 32 | −This driver supports the entire family of Intelliport II/Plus controllers | |
| 33 | −with the exception of the MicroChannel controllers. It does not support | |
| 34 | −products previous to the Intelliport II. | |
| 35 | − | |
| 36 | −This driver was developed on the v2.0.x Linux tree and has been tested up | |
| 37 | −to v2.4.14; it will probably not work with earlier v1.X kernels,. | |
| 38 | − | |
| 39 | − | |
| 40 | −2. QUICK INSTALLATION | |
| 41 | − | |
| 42 | −Hardware - If you have an ISA card, find a free interrupt and io port. | |
| 43 | − List those in use with `cat /proc/interrupts` and | |
| 44 | − `cat /proc/ioports`. Set the card dip switches to a free | |
| 45 | − address. You may need to configure your BIOS to reserve an | |
| 46 | − irq for an ISA card. PCI and EISA parameters are set | |
| 47 | − automagically. Insert card into computer with the power off | |
| 48 | − before or after drivers installation. | |
| 49 | − | |
| 50 | − Note the hardware address from the Computone ISA cards installed into | |
| 51 | − the system. These are required for editing ip2.c or editing | |
| 52 | − /etc/modprobe.d/*.conf, or for specification on the modprobe | |
| 53 | − command line. | |
| 54 | − | |
| 55 | − Note that the /etc/modules.conf should be used for older (pre-2.6) | |
| 56 | − kernels. | |
| 57 | − | |
| 58 | −Software - | |
| 59 | − | |
| 60 | −Module installation: | |
| 61 | − | |
| 62 | −a) Determine free irq/address to use if any (configure BIOS if need be) | |
| 63 | −b) Run "make config" or "make menuconfig" or "make xconfig" | |
| 64 | − Select (m) module for CONFIG_COMPUTONE under character | |
| 65 | − devices. CONFIG_PCI and CONFIG_MODULES also may need to be set. | |
| 66 | −c) Set address on ISA cards then: | |
| 67 | − edit /usr/src/linux/drivers/char/ip2.c if needed | |
| 68 | − or | |
| 69 | − edit config file in /etc/modprobe.d/ if needed (module). | |
| 70 | − or both to match this setting. | |
| 71 | −d) Run "make modules" | |
| 72 | −e) Run "make modules_install" | |
| 73 | −f) Run "/sbin/depmod -a" | |
| 74 | −g) install driver using `modprobe ip2 <options>` (options listed below) | |
| 75 | −h) run ip2mkdev (either the script below or the binary version) | |
| 76 | − | |
| 77 | − | |
| 78 | −Kernel installation: | |
| 79 | − | |
| 80 | −a) Determine free irq/address to use if any (configure BIOS if need be) | |
| 81 | −b) Run "make config" or "make menuconfig" or "make xconfig" | |
| 82 | − Select (y) kernel for CONFIG_COMPUTONE under character | |
| 83 | − devices. CONFIG_PCI may need to be set if you have PCI bus. | |
| 84 | −c) Set address on ISA cards then: | |
| 85 | − edit /usr/src/linux/drivers/char/ip2.c | |
| 86 | − (Optional - may be specified on kernel command line now) | |
| 87 | −d) Run "make zImage" or whatever target you prefer. | |
| 88 | −e) mv /usr/src/linux/arch/x86/boot/zImage to /boot. | |
| 89 | −f) Add new config for this kernel into /etc/lilo.conf, run "lilo" | |
| 90 | − or copy to a floppy disk and boot from that floppy disk. | |
| 91 | −g) Reboot using this kernel | |
| 92 | −h) run ip2mkdev (either the script below or the binary version) | |
| 93 | − | |
| 94 | −Kernel command line options: | |
| 95 | − | |
| 96 | −When compiling the driver into the kernel, io and irq may be | |
| 97 | −compiled into the driver by editing ip2.c and setting the values for | |
| 98 | −io and irq in the appropriate array. An alternative is to specify | |
| 99 | −a command line parameter to the kernel at boot up. | |
| 100 | − | |
| 101 | − ip2=io0,irq0,io1,irq1,io2,irq2,io3,irq3 | |
| 102 | − | |
| 103 | −Note that this order is very different from the specifications for the | |
| 104 | −modload parameters which have separate IRQ and IO specifiers. | |
| 105 | − | |
| 106 | −The io port also selects PCI (1) and EISA (2) boards. | |
| 107 | − | |
| 108 | − io=0 No board | |
| 109 | − io=1 PCI board | |
| 110 | − io=2 EISA board | |
| 111 | − else ISA board io address | |
| 112 | − | |
| 113 | −You only need to specify the boards which are present. | |
| 114 | − | |
| 115 | − Examples: | |
| 116 | − | |
| 117 | − 2 PCI boards: | |
| 118 | − | |
| 119 | − ip2=1,0,1,0 | |
| 120 | − | |
| 121 | − 1 ISA board at 0x310 irq 5: | |
| 122 | − | |
| 123 | − ip2=0x310,5 | |
| 124 | − | |
| 125 | −This can be added to and "append" option in lilo.conf similar to this: | |
| 126 | − | |
| 127 | − append="ip2=1,0,1,0" | |
| 128 | − | |
| 129 | − | |
| 130 | −3. INSTALLATION | |
| 131 | − | |
| 132 | −Previously, the driver sources were packaged with a set of patch files | |
| 133 | −to update the character drivers' makefile and configuration file, and other | |
| 134 | −kernel source files. A build script (ip2build) was included which applies | |
| 135 | −the patches if needed, and build any utilities needed. | |
| 136 | −What you receive may be a single patch file in conventional kernel | |
| 137 | −patch format build script. That form can also be applied by | |
| 138 | −running patch -p1 < ThePatchFile. Otherwise run ip2build. | |
| 139 | − | |
| 140 | −The driver can be installed as a module (recommended) or built into the | |
| 141 | −kernel. This is selected as for other drivers through the `make config` | |
| 142 | −command from the root of the Linux source tree. If the driver is built | |
| 143 | −into the kernel you will need to edit the file ip2.c to match the boards | |
| 144 | −you are installing. See that file for instructions. If the driver is | |
| 145 | −installed as a module the configuration can also be specified on the | |
| 146 | −modprobe command line as follows: | |
| 147 | − | |
| 148 | − modprobe ip2 irq=irq1,irq2,irq3,irq4 io=addr1,addr2,addr3,addr4 | |
| 149 | − | |
| 150 | −where irqnum is one of the valid Intelliport II interrupts (3,4,5,7,10,11, | |
| 151 | −12,15) and addr1-4 are the base addresses for up to four controllers. If | |
| 152 | −the irqs are not specified the driver uses the default in ip2.c (which | |
| 153 | −selects polled mode). If no base addresses are specified the defaults in | |
| 154 | −ip2.c are used. If you are autoloading the driver module with kerneld or | |
| 155 | −kmod the base addresses and interrupt number must also be set in ip2.c | |
| 156 | −and recompile or just insert and options line in /etc/modprobe.d/*.conf or both. | |
| 157 | −The options line is equivalent to the command line and takes precedence over | |
| 158 | −what is in ip2.c. | |
| 159 | − | |
| 160 | −config sample to put /etc/modprobe.d/*.conf: | |
| 161 | − options ip2 io=1,0x328 irq=1,10 | |
| 162 | − alias char-major-71 ip2 | |
| 163 | − alias char-major-72 ip2 | |
| 164 | − alias char-major-73 ip2 | |
| 165 | − | |
| 166 | −The equivalent in ip2.c: | |
| 167 | − | |
| 168 | −static int io[IP2_MAX_BOARDS]= { 1, 0x328, 0, 0 }; | |
| 169 | −static int irq[IP2_MAX_BOARDS] = { 1, 10, -1, -1 }; | |
| 170 | − | |
| 171 | −The equivalent for the kernel command line (in lilo.conf): | |
| 172 | − | |
| 173 | − append="ip2=1,1,0x328,10" | |
| 174 | − | |
| 175 | − | |
| 176 | −Note: Both io and irq should be updated to reflect YOUR system. An "io" | |
| 177 | − address of 1 or 2 indicates a PCI or EISA card in the board table. | |
| 178 | − The PCI or EISA irq will be assigned automatically. | |
| 179 | − | |
| 180 | −Specifying an invalid or in-use irq will default the driver into | |
| 181 | −running in polled mode for that card. If all irq entries are 0 then | |
| 182 | −all cards will operate in polled mode. | |
| 183 | − | |
| 184 | −If you select the driver as part of the kernel run : | |
| 185 | − | |
| 186 | − make zlilo (or whatever you do to create a bootable kernel) | |
| 187 | − | |
| 188 | −If you selected a module run : | |
| 189 | − | |
| 190 | − make modules && make modules_install | |
| 191 | − | |
| 192 | −The utility ip2mkdev (see 5 and 7 below) creates all the device nodes | |
| 193 | −required by the driver. For a device to be created it must be configured | |
| 194 | −in the driver and the board must be installed. Only devices corresponding | |
| 195 | −to real IntelliPort II ports are created. With multiple boards and expansion | |
| 196 | −boxes this will leave gaps in the sequence of device names. ip2mkdev uses | |
| 197 | −Linux tty naming conventions: ttyF0 - ttyF255 for normal devices, and | |
| 198 | −cuf0 - cuf255 for callout devices. | |
| 199 | − | |
| 200 | − | |
| 201 | −4. USING THE DRIVERS | |
| 202 | − | |
| 203 | −As noted above, the driver implements the ports in accordance with Linux | |
| 204 | −conventions, and the devices should be interchangeable with the standard | |
| 205 | −serial devices. (This is a key point for problem reporting: please make | |
| 206 | −sure that what you are trying do works on the ttySx/cuax ports first; then | |
| 207 | −tell us what went wrong with the ip2 ports!) | |
| 208 | − | |
| 209 | −Higher speeds can be obtained using the setserial utility which remaps | |
| 210 | −38,400 bps (extb) to 57,600 bps, 115,200 bps, or a custom speed. | |
| 211 | −Intelliport II installations using the PowerPort expansion module can | |
| 212 | −use the custom speed setting to select the highest speeds: 153,600 bps, | |
| 213 | −230,400 bps, 307,200 bps, 460,800bps and 921,600 bps. The base for | |
| 214 | −custom baud rate configuration is fixed at 921,600 for cards/expansion | |
| 215 | −modules with ST654's and 115200 for those with Cirrus CD1400's. This | |
| 216 | −corresponds to the maximum bit rates those chips are capable. | |
| 217 | −For example if the baud base is 921600 and the baud divisor is 18 then | |
| 218 | −the custom rate is 921600/18 = 51200 bps. See the setserial man page for | |
| 219 | −complete details. Of course if stty accepts the higher rates now you can | |
| 220 | −use that as well as the standard ioctls(). | |
| 221 | − | |
| 222 | − | |
| 223 | −5. ip2mkdev and assorted utilities... | |
| 224 | − | |
| 225 | −Several utilities, including the source for a binary ip2mkdev utility are | |
| 226 | −available under .../drivers/char/ip2. These can be build by changing to | |
| 227 | −that directory and typing "make" after the kernel has be built. If you do | |
| 228 | −not wish to compile the binary utilities, the shell script below can be | |
| 229 | −cut out and run as "ip2mkdev" to create the necessary device files. To | |
| 230 | −use the ip2mkdev script, you must have procfs enabled and the proc file | |
| 231 | −system mounted on /proc. | |
| 232 | − | |
| 233 | − | |
| 234 | −6. NOTES | |
| 235 | − | |
| 236 | −This is a release version of the driver, but it is impossible to test it | |
| 237 | −in all configurations of Linux. If there is any anomalous behaviour that | |
| 238 | −does not match the standard serial port's behaviour please let us know. | |
| 239 | − | |
| 240 | − | |
| 241 | −7. ip2mkdev shell script | |
| 242 | − | |
| 243 | −Previously, this script was simply attached here. It is now attached as a | |
| 244 | −shar archive to make it easier to extract the script from the documentation. | |
| 245 | −To create the ip2mkdev shell script change to a convenient directory (/tmp | |
| 246 | −works just fine) and run the following command: | |
| 247 | − | |
| 248 | − unshar Documentation/serial/computone.txt | |
| 249 | − (This file) | |
| 250 | − | |
| 251 | −You should now have a file ip2mkdev in your current working directory with | |
| 252 | −permissions set to execute. Running that script with then create the | |
| 253 | −necessary devices for the Computone boards, interfaces, and ports which | |
| 254 | −are present on you system at the time it is run. | |
| 255 | − | |
| 256 | − | |
| 257 | −#!/bin/sh | |
| 258 | −# This is a shell archive (produced by GNU sharutils 4.2.1). | |
| 259 | −# To extract the files from this archive, save it to some FILE, remove | |
| 260 | −# everything before the `!/bin/sh' line above, then type `sh FILE'. | |
| 261 | −# | |
| 262 | −# Made on 2001-10-29 10:32 EST by <mhw@alcove.wittsend.com>. | |
| 263 | −# Source directory was `/home2/src/tmp'. | |
| 264 | −# | |
| 265 | −# Existing files will *not* be overwritten unless `-c' is specified. | |
| 266 | −# | |
| 267 | −# This shar contains: | |
| 268 | −# length mode name | |
| 269 | −# ------ ---------- ------------------------------------------ | |
| 270 | −# 4251 -rwxr-xr-x ip2mkdev | |
| 271 | −# | |
| 272 | −save_IFS="${IFS}" | |
| 273 | −IFS="${IFS}:" | |
| 274 | −gettext_dir=FAILED | |
| 275 | −locale_dir=FAILED | |
| 276 | −first_param="$1" | |
| 277 | −for dir in $PATH | |
| 278 | −do | |
| 279 | − if test "$gettext_dir" = FAILED && test -f $dir/gettext \ | |
| 280 | − && ($dir/gettext --version >/dev/null 2>&1) | |
| 281 | − then | |
| 282 | − set `$dir/gettext --version 2>&1` | |
| 283 | − if test "$3" = GNU | |
| 284 | − then | |
| 285 | − gettext_dir=$dir | |
| 286 | − fi | |
| 287 | − fi | |
| 288 | − if test "$locale_dir" = FAILED && test -f $dir/shar \ | |
| 289 | − && ($dir/shar --print-text-domain-dir >/dev/null 2>&1) | |
| 290 | − then | |
| 291 | − locale_dir=`$dir/shar --print-text-domain-dir` | |
| 292 | − fi | |
| 293 | −done | |
| 294 | −IFS="$save_IFS" | |
| 295 | −if test "$locale_dir" = FAILED || test "$gettext_dir" = FAILED | |
| 296 | −then | |
| 297 | − echo=echo | |
| 298 | −else | |
| 299 | − TEXTDOMAINDIR=$locale_dir | |
| 300 | − export TEXTDOMAINDIR | |
| 301 | − TEXTDOMAIN=sharutils | |
| 302 | − export TEXTDOMAIN | |
| 303 | − echo="$gettext_dir/gettext -s" | |
| 304 | −fi | |
| 305 | −if touch -am -t 200112312359.59 $$.touch >/dev/null 2>&1 && test ! -f 200112312359.59 -a -f $$.touch; then | |
| 306 | − shar_touch='touch -am -t $1$2$3$4$5$6.$7 "$8"' | |
| 307 | −elif touch -am 123123592001.59 $$.touch >/dev/null 2>&1 && test ! -f 123123592001.59 -a ! -f 123123592001.5 -a -f $$.touch; then | |
| 308 | − shar_touch='touch -am $3$4$5$6$1$2.$7 "$8"' | |
| 309 | −elif touch -am 1231235901 $$.touch >/dev/null 2>&1 && test ! -f 1231235901 -a -f $$.touch; then | |
| 310 | − shar_touch='touch -am $3$4$5$6$2 "$8"' | |
| 311 | −else | |
| 312 | − shar_touch=: | |
| 313 | − echo | |
| 314 | − $echo 'WARNING: not restoring timestamps. Consider getting and' | |
| 315 | − $echo "installing GNU \`touch', distributed in GNU File Utilities..." | |
| 316 | − echo | |
| 317 | −fi | |
| 318 | −rm -f 200112312359.59 123123592001.59 123123592001.5 1231235901 $$.touch | |
| 319 | −# | |
| 320 | −if mkdir _sh17581; then | |
| 321 | − $echo 'x -' 'creating lock directory' | |
| 322 | −else | |
| 323 | − $echo 'failed to create lock directory' | |
| 324 | − exit 1 | |
| 325 | −fi | |
| 326 | −# ============= ip2mkdev ============== | |
| 327 | −if test -f 'ip2mkdev' && test "$first_param" != -c; then | |
| 328 | − $echo 'x -' SKIPPING 'ip2mkdev' '(file already exists)' | |
| 329 | −else | |
| 330 | − $echo 'x -' extracting 'ip2mkdev' '(text)' | |
| 331 | − sed 's/^X//' << 'SHAR_EOF' > 'ip2mkdev' && | |
| 332 | −#!/bin/sh - | |
| 333 | −# | |
| 334 | −# ip2mkdev | |
| 335 | −# | |
| 336 | −# Make or remove devices as needed for Computone Intelliport drivers | |
| 337 | −# | |
| 338 | −# First rule! If the dev file exists and you need it, don't mess | |
| 339 | −# with it. That prevents us from screwing up open ttys, ownership | |
| 340 | −# and permissions on a running system! | |
| 341 | −# | |
| 342 | −# This script will NOT remove devices that no longer exist if their | |
| 343 | −# board or interface box has been removed. If you want to get rid | |
| 344 | −# of them, you can manually do an "rm -f /dev/ttyF* /dev/cuaf*" | |
| 345 | −# before running this script. Running this script will then recreate | |
| 346 | −# all the valid devices. | |
| 347 | −# | |
| 348 | −# Michael H. Warfield | |
| 349 | −# /\/\|=mhw=|\/\/ | |
| 350 | −# mhw@wittsend.com | |
| 351 | −# | |
| 352 | −# Updated 10/29/2000 for version 1.2.13 naming convention | |
| 353 | −# under devfs. /\/\|=mhw=|\/\/ | |
| 354 | −# | |
| 355 | −# Updated 03/09/2000 for devfs support in ip2 drivers. /\/\|=mhw=|\/\/ | |
| 356 | −# | |
| 357 | −X | |
| 358 | −if test -d /dev/ip2 ; then | |
| 359 | −# This is devfs mode... We don't do anything except create symlinks | |
| 360 | −# from the real devices to the old names! | |
| 361 | −X cd /dev | |
| 362 | −X echo "Creating symbolic links to devfs devices" | |
| 363 | −X for i in `ls ip2` ; do | |
| 364 | −X if test ! -L ip2$i ; then | |
| 365 | −X # Remove it incase it wasn't a symlink (old device) | |
| 366 | −X rm -f ip2$i | |
| 367 | −X ln -s ip2/$i ip2$i | |
| 368 | −X fi | |
| 369 | −X done | |
| 370 | −X for i in `( cd tts ; ls F* )` ; do | |
| 371 | −X if test ! -L tty$i ; then | |
| 372 | −X # Remove it incase it wasn't a symlink (old device) | |
| 373 | −X rm -f tty$i | |
| 374 | −X ln -s tts/$i tty$i | |
| 375 | −X fi | |
| 376 | −X done | |
| 377 | −X for i in `( cd cua ; ls F* )` ; do | |
| 378 | −X DEVNUMBER=`expr $i : 'F\(.*\)'` | |
| 379 | −X if test ! -L cuf$DEVNUMBER ; then | |
| 380 | −X # Remove it incase it wasn't a symlink (old device) | |
| 381 | −X rm -f cuf$DEVNUMBER | |
| 382 | −X ln -s cua/$i cuf$DEVNUMBER | |
| 383 | −X fi | |
| 384 | −X done | |
| 385 | −X exit 0 | |
| 386 | −fi | |
| 387 | −X | |
| 388 | −if test ! -f /proc/tty/drivers | |
| 389 | −then | |
| 390 | −X echo "\ | |
| 391 | −Unable to check driver status. | |
| 392 | −Make sure proc file system is mounted." | |
| 393 | −X | |
| 394 | −X exit 255 | |
| 395 | −fi | |
| 396 | −X | |
| 397 | −if test ! -f /proc/tty/driver/ip2 | |
| 398 | −then | |
| 399 | −X echo "\ | |
| 400 | −Unable to locate ip2 proc file. | |
| 401 | −Attempting to load driver" | |
| 402 | −X | |
| 403 | −X if /sbin/insmod ip2 | |
| 404 | −X then | |
| 405 | −X if test ! -f /proc/tty/driver/ip2 | |
| 406 | −X then | |
| 407 | −X echo "\ | |
| 408 | −Unable to locate ip2 proc file after loading driver. | |
| 409 | −Driver initialization failure or driver version error. | |
| 410 | −" | |
| 411 | −X exit 255 | |
| 412 | −X fi | |
| 413 | −X else | |
| 414 | −X echo "Unable to load ip2 driver." | |
| 415 | −X exit 255 | |
| 416 | −X fi | |
| 417 | −fi | |
| 418 | −X | |
| 419 | −# Ok... So we got the driver loaded and we can locate the procfs files. | |
| 420 | −# Next we need our major numbers. | |
| 421 | −X | |
| 422 | −TTYMAJOR=`sed -e '/^ip2/!d' -e '/\/dev\/tt/!d' -e 's/.*tt[^ ]*[ ]*\([0-9]*\)[ ]*.*/\1/' < /proc/tty/drivers` | |
| 423 | −CUAMAJOR=`sed -e '/^ip2/!d' -e '/\/dev\/cu/!d' -e 's/.*cu[^ ]*[ ]*\([0-9]*\)[ ]*.*/\1/' < /proc/tty/drivers` | |
| 424 | −BRDMAJOR=`sed -e '/^Driver: /!d' -e 's/.*IMajor=\([0-9]*\)[ ]*.*/\1/' < /proc/tty/driver/ip2` | |
| 425 | −X | |
| 426 | −echo "\ | |
| 427 | −TTYMAJOR = $TTYMAJOR | |
| 428 | −CUAMAJOR = $CUAMAJOR | |
| 429 | −BRDMAJOR = $BRDMAJOR | |
| 430 | −" | |
| 431 | −X | |
| 432 | −# Ok... Now we should know our major numbers, if appropriate... | |
| 433 | −# Now we need our boards and start the device loops. | |
| 434 | −X | |
| 435 | −grep '^Board [0-9]:' /proc/tty/driver/ip2 | while read token number type alltherest | |
| 436 | −do | |
| 437 | −X # The test for blank "type" will catch the stats lead-in lines | |
| 438 | −X # if they exist in the file | |
| 439 | −X if test "$type" = "vacant" -o "$type" = "Vacant" -o "$type" = "" | |
| 440 | −X then | |
| 441 | −X continue | |
| 442 | −X fi | |
| 443 | −X | |
| 444 | −X BOARDNO=`expr "$number" : '\([0-9]\):'` | |
| 445 | −X PORTS=`expr "$alltherest" : '.*ports=\([0-9]*\)' | tr ',' ' '` | |
| 446 | −X MINORS=`expr "$alltherest" : '.*minors=\([0-9,]*\)' | tr ',' ' '` | |
| 447 | −X | |
| 448 | −X if test "$BOARDNO" = "" -o "$PORTS" = "" | |
| 449 | −X then | |
| 450 | −# This may be a bug. We should at least get this much information | |
| 451 | −X echo "Unable to process board line" | |
| 452 | −X continue | |
| 453 | −X fi | |
| 454 | −X | |
| 455 | −X if test "$MINORS" = "" | |
| 456 | −X then | |
| 457 | −# Silently skip this one. This board seems to have no boxes | |
| 458 | −X continue | |
| 459 | −X fi | |
| 460 | −X | |
| 461 | −X echo "board $BOARDNO: $type ports = $PORTS; port numbers = $MINORS" | |
| 462 | −X | |
| 463 | −X if test "$BRDMAJOR" != "" | |
| 464 | −X then | |
| 465 | −X BRDMINOR=`expr $BOARDNO \* 4` | |
| 466 | −X STSMINOR=`expr $BRDMINOR + 1` | |
| 467 | −X if test ! -c /dev/ip2ipl$BOARDNO ; then | |
| 468 | −X mknod /dev/ip2ipl$BOARDNO c $BRDMAJOR $BRDMINOR | |
| 469 | −X fi | |
| 470 | −X if test ! -c /dev/ip2stat$BOARDNO ; then | |
| 471 | −X mknod /dev/ip2stat$BOARDNO c $BRDMAJOR $STSMINOR | |
| 472 | −X fi | |
| 473 | −X fi | |
| 474 | −X | |
| 475 | −X if test "$TTYMAJOR" != "" | |
| 476 | −X then | |
| 477 | −X PORTNO=$BOARDBASE | |
| 478 | −X | |
| 479 | −X for PORTNO in $MINORS | |
| 480 | −X do | |
| 481 | −X if test ! -c /dev/ttyF$PORTNO ; then | |
| 482 | −X # We got the hardware but no device - make it | |
| 483 | −X mknod /dev/ttyF$PORTNO c $TTYMAJOR $PORTNO | |
| 484 | −X fi | |
| 485 | −X done | |
| 486 | −X fi | |
| 487 | −X | |
| 488 | −X if test "$CUAMAJOR" != "" | |
| 489 | −X then | |
| 490 | −X PORTNO=$BOARDBASE | |
| 491 | −X | |
| 492 | −X for PORTNO in $MINORS | |
| 493 | −X do | |
| 494 | −X if test ! -c /dev/cuf$PORTNO ; then | |
| 495 | −X # We got the hardware but no device - make it | |
| 496 | −X mknod /dev/cuf$PORTNO c $CUAMAJOR $PORTNO | |
| 497 | −X fi | |
| 498 | −X done | |
| 499 | −X fi | |
| 500 | −done | |
| 501 | −X | |
| 502 | −Xexit 0 | |
| 503 | −SHAR_EOF | |
| 504 | − (set 20 01 10 29 10 32 01 'ip2mkdev'; eval "$shar_touch") && | |
| 505 | − chmod 0755 'ip2mkdev' || | |
| 506 | − $echo 'restore of' 'ip2mkdev' 'failed' | |
| 507 | − if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \ | |
| 508 | − && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then | |
| 509 | − md5sum -c << SHAR_EOF >/dev/null 2>&1 \ | |
| 510 | − || $echo 'ip2mkdev:' 'MD5 check failed' | |
| 511 | −cb5717134509f38bad9fde6b1f79b4a4 ip2mkdev | |
| 512 | −SHAR_EOF | |
| 513 | − else | |
| 514 | − shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'ip2mkdev'`" | |
| 515 | − test 4251 -eq "$shar_count" || | |
| 516 | − $echo 'ip2mkdev:' 'original size' '4251,' 'current size' "$shar_count!" | |
| 517 | − fi | |
| 518 | −fi | |
| 519 | −rm -fr _sh17581 | |
| 520 | −exit 0 | |
| @@ -223,6 +223,7 @@ srmcons_init(void) · 222 unmodified lines | ||
| 223 | 223 | driver->subtype = SYSTEM_TYPE_SYSCONS; |
| 224 | 224 | driver->init_termios = tty_std_termios; |
| 225 | 225 | tty_set_operations(driver, &srmcons_ops); |
| 226 | + tty_port_link_device(&srmcons_singleton.port, driver, 0); | |
| 226 | 227 | err = tty_register_driver(driver); |
| 227 | 228 | if (err) { |
| 228 | 229 | put_tty_driver(driver); |
| @@ -80,8 +80,9 @@ static struct omap_uart_port_info omap_serial_default_info[] __initdata = { · 79 unmodified lines | ||
| 80 | 80 | }; |
| 81 | 81 | |
| 82 | 82 | #ifdef CONFIG_PM |
| 83 | −static void omap_uart_enable_wakeup(struct platform_device *pdev, bool enable) | |
| 83 | +static void omap_uart_enable_wakeup(struct device *dev, bool enable) | |
| 84 | 84 | { |
| 85 | + struct platform_device *pdev = to_platform_device(dev); | |
| 85 | 86 | struct omap_device *od = to_omap_device(pdev); |
| 86 | 87 | |
| 87 | 88 | if (!od) |
| @@ -98,15 +99,17 @@ static void omap_uart_enable_wakeup(struct platform_device *pdev, bool enable) · 10 unmodified lines | ||
| 98 | 99 | * in Smartidle Mode When Configured for DMA Operations. |
| 99 | 100 | * WA: configure uart in force idle mode. |
| 100 | 101 | */ |
| 101 | −static void omap_uart_set_noidle(struct platform_device *pdev) | |
| 102 | +static void omap_uart_set_noidle(struct device *dev) | |
| 102 | 103 | { |
| 104 | + struct platform_device *pdev = to_platform_device(dev); | |
| 103 | 105 | struct omap_device *od = to_omap_device(pdev); |
| 104 | 106 | |
| 105 | 107 | omap_hwmod_set_slave_idlemode(od->hwmods[0], HWMOD_IDLEMODE_NO); |
| 106 | 108 | } |
| 107 | 109 | |
| 108 | −static void omap_uart_set_smartidle(struct platform_device *pdev) | |
| 110 | +static void omap_uart_set_smartidle(struct device *dev) | |
| 109 | 111 | { |
| 112 | + struct platform_device *pdev = to_platform_device(dev); | |
| 110 | 113 | struct omap_device *od = to_omap_device(pdev); |
| 111 | 114 | u8 idlemode; |
| 112 | 115 | |
| @@ -119,10 +122,10 @@ static void omap_uart_set_smartidle(struct platform_device *pdev) · 6 unmodified lines | ||
| 119 | 122 | } |
| 120 | 123 | |
| 121 | 124 | #else |
| 122 | −static void omap_uart_enable_wakeup(struct platform_device *pdev, bool enable) | |
| 125 | +static void omap_uart_enable_wakeup(struct device *dev, bool enable) | |
| 123 | 126 | {} |
| 124 | −static void omap_uart_set_noidle(struct platform_device *pdev) {} | |
| 125 | −static void omap_uart_set_smartidle(struct platform_device *pdev) {} | |
| 127 | +static void omap_uart_set_noidle(struct device *dev) {} | |
| 128 | +static void omap_uart_set_smartidle(struct device *dev) {} | |
| 126 | 129 | #endif /* CONFIG_PM */ |
| 127 | 130 | |
| 128 | 131 | #ifdef CONFIG_OMAP_MUX |
| @@ -303,6 +306,9 @@ void __init omap_serial_init_port(struct omap_board_data *bdata, · 174 unmodified lines | ||
| 303 | 306 | omap_up.dma_rx_timeout = info->dma_rx_timeout; |
| 304 | 307 | omap_up.dma_rx_poll_rate = info->dma_rx_poll_rate; |
| 305 | 308 | omap_up.autosuspend_timeout = info->autosuspend_timeout; |
| 309 | + omap_up.DTR_gpio = info->DTR_gpio; | |
| 310 | + omap_up.DTR_inverted = info->DTR_inverted; | |
| 311 | + omap_up.DTR_present = info->DTR_present; | |
| 306 | 312 | |
| 307 | 313 | pdata = &omap_up; |
| 308 | 314 | pdata_size = sizeof(struct omap_uart_port_info); |
| @@ -524,33 +524,12 @@ static struct stedma40_chan_cfg uart2_dma_cfg_tx = { · 523 unmodified lines | ||
| 524 | 524 | }; |
| 525 | 525 | #endif |
| 526 | 526 | |
| 527 | −#define PRCC_K_SOFTRST_SET 0x18 | |
| 528 | −#define PRCC_K_SOFTRST_CLEAR 0x1C | |
| 529 | −static void ux500_uart0_reset(void) | |
| 530 | −{ | |
| 531 | − void __iomem *prcc_rst_set, *prcc_rst_clr; | |
| 532 | − | |
| 533 | − prcc_rst_set = (void __iomem *)IO_ADDRESS(U8500_CLKRST1_BASE + | |
| 534 | − PRCC_K_SOFTRST_SET); | |
| 535 | − prcc_rst_clr = (void __iomem *)IO_ADDRESS(U8500_CLKRST1_BASE + | |
| 536 | − PRCC_K_SOFTRST_CLEAR); | |
| 537 | − | |
| 538 | − /* Activate soft reset PRCC_K_SOFTRST_CLEAR */ | |
| 539 | − writel((readl(prcc_rst_clr) | 0x1), prcc_rst_clr); | |
| 540 | − udelay(1); | |
| 541 | − | |
| 542 | − /* Release soft reset PRCC_K_SOFTRST_SET */ | |
| 543 | − writel((readl(prcc_rst_set) | 0x1), prcc_rst_set); | |
| 544 | − udelay(1); | |
| 545 | −} | |
| 546 | − | |
| 547 | 527 | static struct amba_pl011_data uart0_plat = { |
| 548 | 528 | #ifdef CONFIG_STE_DMA40 |
| 549 | 529 | .dma_filter = stedma40_filter, |
| 550 | 530 | .dma_rx_param = &uart0_dma_cfg_rx, |
| 551 | 531 | .dma_tx_param = &uart0_dma_cfg_tx, |
| 552 | 532 | #endif |
| 553 | − .reset = ux500_uart0_reset, | |
| 554 | 533 | }; |
| 555 | 534 | |
| 556 | 535 | static struct amba_pl011_data uart1_plat = { |
| @@ -18,7 +18,7 @@ · 17 unmodified lines | ||
| 18 | 18 | #define __OMAP_SERIAL_H__ |
| 19 | 19 | |
| 20 | 20 | #include <linux/serial_core.h> |
| 21 | −#include <linux/platform_device.h> | |
| 21 | +#include <linux/device.h> | |
| 22 | 22 | #include <linux/pm_qos.h> |
| 23 | 23 | |
| 24 | 24 | #include <plat/mux.h> |
| @@ -42,10 +42,10 @@ · 17 unmodified lines | ||
| 42 | 42 | #define OMAP_UART_WER_MOD_WKUP 0X7F |
| 43 | 43 | |
| 44 | 44 | /* Enable XON/XOFF flow control on output */ |
| 45 | −#define OMAP_UART_SW_TX 0x04 | |
| 45 | +#define OMAP_UART_SW_TX 0x8 | |
| 46 | 46 | |
| 47 | 47 | /* Enable XON/XOFF flow control on input */ |
| 48 | −#define OMAP_UART_SW_RX 0x04 | |
| 48 | +#define OMAP_UART_SW_RX 0x2 | |
| 49 | 49 | |
| 50 | 50 | #define OMAP_UART_SYSC_RESET 0X07 |
| 51 | 51 | #define OMAP_UART_TCR_TRIG 0X0F |
| @@ -69,11 +69,14 @@ struct omap_uart_port_info { · 17 unmodified lines | ||
| 69 | 69 | unsigned int dma_rx_timeout; |
| 70 | 70 | unsigned int autosuspend_timeout; |
| 71 | 71 | unsigned int dma_rx_poll_rate; |
| 72 | + int DTR_gpio; | |
| 73 | + int DTR_inverted; | |
| 74 | + int DTR_present; | |
| 72 | 75 | |
| 73 | 76 | int (*get_context_loss_count)(struct device *); |
| 74 | − void (*set_forceidle)(struct platform_device *); | |
| 75 | − void (*set_noidle)(struct platform_device *); | |
| 76 | − void (*enable_wakeup)(struct platform_device *, bool); | |
| 77 | + void (*set_forceidle)(struct device *); | |
| 78 | + void (*set_noidle)(struct device *); | |
| 79 | + void (*enable_wakeup)(struct device *, bool); | |
| 77 | 80 | }; |
| 78 | 81 | |
| 79 | 82 | struct uart_omap_dma { |
| @@ -102,39 +105,4 @@ struct uart_omap_dma { · 22 unmodified lines | ||
| 102 | 105 | unsigned int rx_timeout; |
| 103 | 106 | }; |
| 104 | 107 | |
| 105 | −struct uart_omap_port { | |
| 106 | − struct uart_port port; | |
| 107 | − struct uart_omap_dma uart_dma; | |
| 108 | − struct platform_device *pdev; | |
| 109 | − | |
| 110 | − unsigned char ier; | |
| 111 | − unsigned char lcr; | |
| 112 | − unsigned char mcr; | |
| 113 | − unsigned char fcr; | |
| 114 | − unsigned char efr; | |
| 115 | − unsigned char dll; | |
| 116 | − unsigned char dlh; | |
| 117 | − unsigned char mdr1; | |
| 118 | − unsigned char scr; | |
| 119 | − | |
| 120 | − int use_dma; | |
| 121 | − /* | |
| 122 | − * Some bits in registers are cleared on a read, so they must | |
| 123 | − * be saved whenever the register is read but the bits will not | |
| 124 | − * be immediately processed. | |
| 125 | − */ | |
| 126 | − unsigned int lsr_break_flag; | |
| 127 | − unsigned char msr_saved_flags; | |
| 128 | − char name[20]; | |
| 129 | − unsigned long port_activity; | |
| 130 | − u32 context_loss_cnt; | |
| 131 | − u32 errata; | |
| 132 | − u8 wakeups_enabled; | |
| 133 | − | |
| 134 | − struct pm_qos_request pm_qos_request; | |
| 135 | − u32 latency; | |
| 136 | − u32 calc_latency; | |
| 137 | − struct work_struct qos_work; | |
| 138 | −}; | |
| 139 | − | |
| 140 | 108 | #endif /* __OMAP_SERIAL_H__ */ |
| @@ -338,7 +338,7 @@ static void rs_set_termios(struct tty_struct *tty, struct ktermios *old_termios) · 337 unmodified lines | ||
| 338 | 338 | { |
| 339 | 339 | /* Handle turning off CRTSCTS */ |
| 340 | 340 | if ((old_termios->c_cflag & CRTSCTS) && |
| 341 | − !(tty->termios->c_cflag & CRTSCTS)) { | |
| 341 | + !(tty->termios.c_cflag & CRTSCTS)) { | |
| 342 | 342 | tty->hw_stopped = 0; |
| 343 | 343 | } |
| 344 | 344 | } |
| @@ -545,6 +545,7 @@ static int __init simrs_init(void) · 200 unmodified lines | ||
| 545 | 545 | /* the port is imaginary */ |
| 546 | 546 | printk(KERN_INFO "ttyS0 at 0x03f8 (irq = %d) is a 16550\n", state->irq); |
| 547 | 547 | |
| 548 | + tty_port_link_device(&state->port, hp_simserial_driver, 0); | |
| 548 | 549 | retval = tty_register_driver(hp_simserial_driver); |
| 549 | 550 | if (retval) { |
| 550 | 551 | printk(KERN_ERR "Couldn't register simserial driver\n"); |
| @@ -19,6 +19,7 @@ · 18 unmodified lines | ||
| 19 | 19 | #include <asm/natfeat.h> |
| 20 | 20 | |
| 21 | 21 | static int stderr_id; |
| 22 | +static struct tty_port nfcon_tty_port; | |
| 22 | 23 | static struct tty_driver *nfcon_tty_driver; |
| 23 | 24 | |
| 24 | 25 | static void nfputs(const char *str, unsigned int count) |
| @@ -119,6 +120,8 @@ static int __init nfcon_init(void) · 94 unmodified lines | ||
| 119 | 120 | { |
| 120 | 121 | int res; |
| 121 | 122 | |
| 123 | + tty_port_init(&nfcon_tty_port); | |
| 124 | + | |
| 122 | 125 | stderr_id = nf_get_id("NF_STDERR"); |
| 123 | 126 | if (!stderr_id) |
| 124 | 127 | return -ENODEV; |
| @@ -135,6 +138,7 @@ static int __init nfcon_init(void) · 10 unmodified lines | ||
| 135 | 138 | nfcon_tty_driver->flags = TTY_DRIVER_REAL_RAW; |
| 136 | 139 | |
| 137 | 140 | tty_set_operations(nfcon_tty_driver, &nfcon_tty_ops); |
| 141 | + tty_port_link_device(&nfcon_tty_port, nfcon_tty_driver, 0); | |
| 138 | 142 | res = tty_register_driver(nfcon_tty_driver); |
| 139 | 143 | if (res) { |
| 140 | 144 | pr_err("failed to register nfcon tty driver\n"); |
| @@ -47,40 +47,40 @@ static int __devinit octeon_serial_probe(struct platform_device *pdev) · 46 unmodified lines | ||
| 47 | 47 | { |
| 48 | 48 | int irq, res; |
| 49 | 49 | struct resource *res_mem; |
| 50 | − struct uart_port port; | |
| 50 | + struct uart_8250_port up; | |
| 51 | 51 | |
| 52 | 52 | /* All adaptors have an irq. */ |
| 53 | 53 | irq = platform_get_irq(pdev, 0); |
| 54 | 54 | if (irq < 0) |
| 55 | 55 | return irq; |
| 56 | 56 | |
| 57 | − memset(&port, 0, sizeof(port)); | |
| 57 | + memset(&up, 0, sizeof(up)); | |
| 58 | 58 | |
| 59 | − port.flags = ASYNC_SKIP_TEST | UPF_SHARE_IRQ | UPF_FIXED_TYPE; | |
| 60 | − port.type = PORT_OCTEON; | |
| 61 | − port.iotype = UPIO_MEM; | |
| 62 | − port.regshift = 3; | |
| 63 | − port.dev = &pdev->dev; | |
| 59 | + up.port.flags = ASYNC_SKIP_TEST | UPF_SHARE_IRQ | UPF_FIXED_TYPE; | |
| 60 | + up.port.type = PORT_OCTEON; | |
| 61 | + up.port.iotype = UPIO_MEM; | |
| 62 | + up.port.regshift = 3; | |
| 63 | + up.port.dev = &pdev->dev; | |
| 64 | 64 | |
| 65 | 65 | if (octeon_is_simulation()) |
| 66 | 66 | /* Make simulator output fast*/ |
| 67 | − port.uartclk = 115200 * 16; | |
| 67 | + up.port.uartclk = 115200 * 16; | |
| 68 | 68 | else |
| 69 | − port.uartclk = octeon_get_io_clock_rate(); | |
| 69 | + up.port.uartclk = octeon_get_io_clock_rate(); | |
| 70 | 70 | |
| 71 | − port.serial_in = octeon_serial_in; | |
| 72 | − port.serial_out = octeon_serial_out; | |
| 73 | − port.irq = irq; | |
| 71 | + up.port.serial_in = octeon_serial_in; | |
| 72 | + up.port.serial_out = octeon_serial_out; | |
| 73 | + up.port.irq = irq; | |
| 74 | 74 | |
| 75 | 75 | res_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 76 | 76 | if (res_mem == NULL) { |
| 77 | 77 | dev_err(&pdev->dev, "found no memory resource\n"); |
| 78 | 78 | return -ENXIO; |
| 79 | 79 | } |
| 80 | − port.mapbase = res_mem->start; | |
| 81 | − port.membase = ioremap(res_mem->start, resource_size(res_mem)); | |
| 80 | + up.port.mapbase = res_mem->start; | |
| 81 | + up.port.membase = ioremap(res_mem->start, resource_size(res_mem)); | |
| 82 | 82 | |
| 83 | − res = serial8250_register_port(&port); | |
| 83 | + res = serial8250_register_8250_port(&up); | |
| 84 | 84 | |
| 85 | 85 | return res >= 0 ? 0 : res; |
| 86 | 86 | } |
| @@ -133,6 +133,38 @@ static struct platform_device sc26xx_pdev = { · 132 unmodified lines | ||
| 133 | 133 | } |
| 134 | 134 | }; |
| 135 | 135 | |
| 136 | +#warning "Please try migrate to use new driver SCCNXP and report the status" \ | |
| 137 | + "in the linux-serial mailing list." | |
| 138 | + | |
| 139 | +/* The code bellow is a replacement of SC26XX to SCCNXP */ | |
| 140 | +#if 0 | |
| 141 | +#include <linux/platform_data/sccnxp.h> | |
| 142 | + | |
| 143 | +static struct sccnxp_pdata sccnxp_data = { | |
| 144 | + .reg_shift = 2, | |
| 145 | + .frequency = 3686400, | |
| 146 | + .mctrl_cfg[0] = MCTRL_SIG(DTR_OP, LINE_OP7) | | |
| 147 | + MCTRL_SIG(RTS_OP, LINE_OP3) | | |
| 148 | + MCTRL_SIG(DSR_IP, LINE_IP5) | | |
| 149 | + MCTRL_SIG(DCD_IP, LINE_IP6), | |
| 150 | + .mctrl_cfg[1] = MCTRL_SIG(DTR_OP, LINE_OP2) | | |
| 151 | + MCTRL_SIG(RTS_OP, LINE_OP1) | | |
| 152 | + MCTRL_SIG(DSR_IP, LINE_IP0) | | |
| 153 | + MCTRL_SIG(CTS_IP, LINE_IP1) | | |
| 154 | + MCTRL_SIG(DCD_IP, LINE_IP2) | | |
| 155 | + MCTRL_SIG(RNG_IP, LINE_IP3), | |
| 156 | +}; | |
| 157 | + | |
| 158 | +static struct platform_device sc2681_pdev = { | |
| 159 | + .name = "sc2681", | |
| 160 | + .resource = sc2xxx_rsrc, | |
| 161 | + .num_resources = ARRAY_SIZE(sc2xxx_rsrc), | |
| 162 | + .dev = { | |
| 163 | + .platform_data = &sccnxp_data, | |
| 164 | + }, | |
| 165 | +}; | |
| 166 | +#endif | |
| 167 | + | |
| 136 | 168 | static u32 a20r_ack_hwint(void) |
| 137 | 169 | { |
| 138 | 170 | u32 status = read_c0_status(); |
| @@ -202,6 +202,7 @@ static int __init pdc_console_tty_driver_init(void) · 201 unmodified lines | ||
| 202 | 202 | pdc_console_tty_driver->flags = TTY_DRIVER_REAL_RAW | |
| 203 | 203 | TTY_DRIVER_RESET_TERMIOS; |
| 204 | 204 | tty_set_operations(pdc_console_tty_driver, &pdc_console_tty_ops); |
| 205 | + tty_port_link_device(&tty_port, pdc_console_tty_driver, 0); | |
| 205 | 206 | |
| 206 | 207 | err = tty_register_driver(pdc_console_tty_driver); |
| 207 | 208 | if (err) { |
| @@ -409,7 +409,8 @@ int setup_one_line(struct line *lines, int n, char *init, · 408 unmodified lines | ||
| 409 | 409 | line->valid = 1; |
| 410 | 410 | err = parse_chan_pair(new, line, n, opts, error_out); |
| 411 | 411 | if (!err) { |
| 412 | − struct device *d = tty_register_device(driver, n, NULL); | |
| 412 | + struct device *d = tty_port_register_device(&line->port, | |
| 413 | + driver, n, NULL); | |
| 413 | 414 | if (IS_ERR(d)) { |
| 414 | 415 | *error_out = "Failed to register device"; |
| 415 | 416 | err = PTR_ERR(d); |
| @@ -223,6 +223,7 @@ int __init rs_init(void) · 222 unmodified lines | ||
| 223 | 223 | serial_driver->flags = TTY_DRIVER_REAL_RAW; |
| 224 | 224 | |
| 225 | 225 | tty_set_operations(serial_driver, &serial_ops); |
| 226 | + tty_port_link_device(&serial_port, serial_driver, 0); | |
| 226 | 227 | |
| 227 | 228 | if (tty_register_driver(serial_driver)) |
| 228 | 229 | panic("Couldn't register serial driver\n"); |
| @@ -58,7 +58,7 @@ static int ath_wakeup_ar3k(struct tty_struct *tty) · 57 unmodified lines | ||
| 58 | 58 | return status; |
| 59 | 59 | |
| 60 | 60 | /* Disable Automatic RTSCTS */ |
| 61 | − memcpy(&ktermios, tty->termios, sizeof(ktermios)); | |
| 61 | + ktermios = tty->termios; | |
| 62 | 62 | ktermios.c_cflag &= ~CRTSCTS; |
| 63 | 63 | tty_set_termios(tty, &ktermios); |
| 64 | 64 | |
| @@ -430,7 +430,7 @@ static ssize_t mwave_write(struct file *file, const char __user *buf, · 429 unmodified lines | ||
| 430 | 430 | |
| 431 | 431 | static int register_serial_portandirq(unsigned int port, int irq) |
| 432 | 432 | { |
| 433 | − struct uart_port uart; | |
| 433 | + struct uart_8250_port uart; | |
| 434 | 434 | |
| 435 | 435 | switch ( port ) { |
| 436 | 436 | case 0x3f8: |
| @@ -462,14 +462,14 @@ static int register_serial_portandirq(unsigned int port, int irq) · 25 unmodified lines | ||
| 462 | 462 | } /* switch */ |
| 463 | 463 | /* irq is okay */ |
| 464 | 464 | |
| 465 | − memset(&uart, 0, sizeof(struct uart_port)); | |
| 465 | + memset(&uart, 0, sizeof(uart)); | |
| 466 | 466 | |
| 467 | − uart.uartclk = 1843200; | |
| 468 | − uart.iobase = port; | |
| 469 | − uart.irq = irq; | |
| 470 | − uart.iotype = UPIO_PORT; | |
| 471 | − uart.flags = UPF_SHARE_IRQ; | |
| 472 | − return serial8250_register_port(&uart); | |
| 467 | + uart.port.uartclk = 1843200; | |
| 468 | + uart.port.iobase = port; | |
| 469 | + uart.port.irq = irq; | |
| 470 | + uart.port.iotype = UPIO_PORT; | |
| 471 | + uart.port.flags = UPF_SHARE_IRQ; | |
| 472 | + return serial8250_register_8250_port(&uart); | |
| 473 | 473 | } |
| 474 | 474 | |
| 475 | 475 | |
| @@ -1050,7 +1050,7 @@ static void cts_change(MGSLPC_INFO *info, struct tty_struct *tty) · 1049 unmodified lines | ||
| 1050 | 1050 | wake_up_interruptible(&info->status_event_wait_q); |
| 1051 | 1051 | wake_up_interruptible(&info->event_wait_q); |
| 1052 | 1052 | |
| 1053 | − if (info->port.flags & ASYNC_CTS_FLOW) { | |
| 1053 | + if (tty_port_cts_enabled(&info->port)) { | |
| 1054 | 1054 | if (tty->hw_stopped) { |
| 1055 | 1055 | if (info->serial_signals & SerialSignal_CTS) { |
| 1056 | 1056 | if (debug_level >= DEBUG_LEVEL_ISR) |
| @@ -1344,7 +1344,7 @@ static void shutdown(MGSLPC_INFO * info, struct tty_struct *tty) · 287 unmodified lines | ||
| 1344 | 1344 | /* TODO:disable interrupts instead of reset to preserve signal states */ |
| 1345 | 1345 | reset_device(info); |
| 1346 | 1346 | |
| 1347 | − if (!tty || tty->termios->c_cflag & HUPCL) { | |
| 1347 | + if (!tty || tty->termios.c_cflag & HUPCL) { | |
| 1348 | 1348 | info->serial_signals &= ~(SerialSignal_DTR + SerialSignal_RTS); |
| 1349 | 1349 | set_signals(info); |
| 1350 | 1350 | } |
| @@ -1385,7 +1385,7 @@ static void mgslpc_program_hw(MGSLPC_INFO *info, struct tty_struct *tty) · 34 unmodified lines | ||
| 1385 | 1385 | port_irq_enable(info, (unsigned char) PVR_DSR | PVR_RI); |
| 1386 | 1386 | get_signals(info); |
| 1387 | 1387 | |
| 1388 | − if (info->netcount || (tty && (tty->termios->c_cflag & CREAD))) | |
| 1388 | + if (info->netcount || (tty && (tty->termios.c_cflag & CREAD))) | |
| 1389 | 1389 | rx_start(info); |
| 1390 | 1390 | |
| 1391 | 1391 | spin_unlock_irqrestore(&info->lock,flags); |
| @@ -1398,14 +1398,14 @@ static void mgslpc_change_params(MGSLPC_INFO *info, struct tty_struct *tty) · 6 unmodified lines | ||
| 1398 | 1398 | unsigned cflag; |
| 1399 | 1399 | int bits_per_char; |
| 1400 | 1400 | |
| 1401 | − if (!tty || !tty->termios) | |
| 1401 | + if (!tty) | |
| 1402 | 1402 | return; |
| 1403 | 1403 | |
| 1404 | 1404 | if (debug_level >= DEBUG_LEVEL_INFO) |
| 1405 | 1405 | printk("%s(%d):mgslpc_change_params(%s)\n", |
| 1406 | 1406 | __FILE__,__LINE__, info->device_name ); |
| 1407 | 1407 | |
| 1408 | − cflag = tty->termios->c_cflag; | |
| 1408 | + cflag = tty->termios.c_cflag; | |
| 1409 | 1409 | |
| 1410 | 1410 | /* if B0 rate (hangup) specified then negate DTR and RTS */ |
| 1411 | 1411 | /* otherwise assert DTR and RTS */ |
| @@ -1728,7 +1728,7 @@ static void mgslpc_throttle(struct tty_struct * tty) · 316 unmodified lines | ||
| 1728 | 1728 | if (I_IXOFF(tty)) |
| 1729 | 1729 | mgslpc_send_xchar(tty, STOP_CHAR(tty)); |
| 1730 | 1730 | |
| 1731 | − if (tty->termios->c_cflag & CRTSCTS) { | |
| 1731 | + if (tty->termios.c_cflag & CRTSCTS) { | |
| 1732 | 1732 | spin_lock_irqsave(&info->lock,flags); |
| 1733 | 1733 | info->serial_signals &= ~SerialSignal_RTS; |
| 1734 | 1734 | set_signals(info); |
| @@ -1757,7 +1757,7 @@ static void mgslpc_unthrottle(struct tty_struct * tty) · 22 unmodified lines | ||
| 1757 | 1757 | mgslpc_send_xchar(tty, START_CHAR(tty)); |
| 1758 | 1758 | } |
| 1759 | 1759 | |
| 1760 | − if (tty->termios->c_cflag & CRTSCTS) { | |
| 1760 | + if (tty->termios.c_cflag & CRTSCTS) { | |
| 1761 | 1761 | spin_lock_irqsave(&info->lock,flags); |
| 1762 | 1762 | info->serial_signals |= SerialSignal_RTS; |
| 1763 | 1763 | set_signals(info); |
| @@ -2293,8 +2293,8 @@ static void mgslpc_set_termios(struct tty_struct *tty, struct ktermios *old_term · 529 unmodified lines | ||
| 2293 | 2293 | tty->driver->name ); |
| 2294 | 2294 | |
| 2295 | 2295 | /* just return if nothing has changed */ |
| 2296 | − if ((tty->termios->c_cflag == old_termios->c_cflag) | |
| 2297 | − && (RELEVANT_IFLAG(tty->termios->c_iflag) | |
| 2296 | + if ((tty->termios.c_cflag == old_termios->c_cflag) | |
| 2297 | + && (RELEVANT_IFLAG(tty->termios.c_iflag) | |
| 2298 | 2298 | == RELEVANT_IFLAG(old_termios->c_iflag))) |
| 2299 | 2299 | return; |
| 2300 | 2300 | |
| @@ -2302,7 +2302,7 @@ static void mgslpc_set_termios(struct tty_struct *tty, struct ktermios *old_term · 1 unmodified line | ||
| 2302 | 2302 | |
| 2303 | 2303 | /* Handle transition to B0 status */ |
| 2304 | 2304 | if (old_termios->c_cflag & CBAUD && |
| 2305 | − !(tty->termios->c_cflag & CBAUD)) { | |
| 2305 | + !(tty->termios.c_cflag & CBAUD)) { | |
| 2306 | 2306 | info->serial_signals &= ~(SerialSignal_RTS + SerialSignal_DTR); |
| 2307 | 2307 | spin_lock_irqsave(&info->lock,flags); |
| 2308 | 2308 | set_signals(info); |
| @@ -2311,9 +2311,9 @@ static void mgslpc_set_termios(struct tty_struct *tty, struct ktermios *old_term · 2 unmodified lines | ||
| 2311 | 2311 | |
| 2312 | 2312 | /* Handle transition away from B0 status */ |
| 2313 | 2313 | if (!(old_termios->c_cflag & CBAUD) && |
| 2314 | − tty->termios->c_cflag & CBAUD) { | |
| 2314 | + tty->termios.c_cflag & CBAUD) { | |
| 2315 | 2315 | info->serial_signals |= SerialSignal_DTR; |
| 2316 | − if (!(tty->termios->c_cflag & CRTSCTS) || | |
| 2316 | + if (!(tty->termios.c_cflag & CRTSCTS) || | |
| 2317 | 2317 | !test_bit(TTY_THROTTLED, &tty->flags)) { |
| 2318 | 2318 | info->serial_signals |= SerialSignal_RTS; |
| 2319 | 2319 | } |
| @@ -2324,7 +2324,7 @@ static void mgslpc_set_termios(struct tty_struct *tty, struct ktermios *old_term · 4 unmodified lines | ||
| 2324 | 2324 | |
| 2325 | 2325 | /* Handle turning off CRTSCTS */ |
| 2326 | 2326 | if (old_termios->c_cflag & CRTSCTS && |
| 2327 | − !(tty->termios->c_cflag & CRTSCTS)) { | |
| 2327 | + !(tty->termios.c_cflag & CRTSCTS)) { | |
| 2328 | 2328 | tty->hw_stopped = 0; |
| 2329 | 2329 | tx_release(tty); |
| 2330 | 2330 | } |
| @@ -2731,6 +2731,8 @@ static void mgslpc_add_device(MGSLPC_INFO *info) · 400 unmodified lines | ||
| 2731 | 2731 | #if SYNCLINK_GENERIC_HDLC |
| 2732 | 2732 | hdlcdev_init(info); |
| 2733 | 2733 | #endif |
| 2734 | + tty_port_register_device(&info->port, serial_driver, info->line, | |
| 2735 | + &info->p_dev->dev); | |
| 2734 | 2736 | } |
| 2735 | 2737 | |
| 2736 | 2738 | static void mgslpc_remove_device(MGSLPC_INFO *remove_info) |
| @@ -2744,6 +2746,7 @@ static void mgslpc_remove_device(MGSLPC_INFO *remove_info) · 7 unmodified lines | ||
| 2744 | 2746 | last->next_device = info->next_device; |
| 2745 | 2747 | else |
| 2746 | 2748 | mgslpc_device_list = info->next_device; |
| 2749 | + tty_unregister_device(serial_driver, info->line); | |
| 2747 | 2750 | #if SYNCLINK_GENERIC_HDLC |
| 2748 | 2751 | hdlcdev_exit(info); |
| 2749 | 2752 | #endif |
| @@ -2798,77 +2801,63 @@ static const struct tty_operations mgslpc_ops = { · 48 unmodified lines | ||
| 2798 | 2801 | .proc_fops = &mgslpc_proc_fops, |
| 2799 | 2802 | }; |
| 2800 | 2803 | |
| 2801 | −static void synclink_cs_cleanup(void) | |
| 2804 | +static int __init synclink_cs_init(void) | |
| 2802 | 2805 | { |
| 2803 | 2806 | int rc; |
| 2804 | 2807 | |
| 2805 | − while(mgslpc_device_list) | |
| 2806 | − mgslpc_remove_device(mgslpc_device_list); | |
| 2807 | − | |
| 2808 | − if (serial_driver) { | |
| 2809 | − if ((rc = tty_unregister_driver(serial_driver))) | |
| 2810 | − printk("%s(%d) failed to unregister tty driver err=%d\n", | |
| 2811 | − __FILE__,__LINE__,rc); | |
| 2812 | − put_tty_driver(serial_driver); | |
| 2808 | + if (break_on_load) { | |
| 2809 | + mgslpc_get_text_ptr(); | |
| 2810 | + BREAKPOINT(); | |
| 2813 | 2811 | } |
| 2814 | 2812 | |
| 2815 | − pcmcia_unregister_driver(&mgslpc_driver); | |
| 2816 | −} | |
| 2817 | − | |
| 2818 | −static int __init synclink_cs_init(void) | |
| 2819 | −{ | |
| 2820 | − int rc; | |
| 2821 | − | |
| 2822 | − if (break_on_load) { | |
| 2823 | − mgslpc_get_text_ptr(); | |
| 2824 | − BREAKPOINT(); | |
| 2825 | − } | |
| 2826 | − | |
| 2827 | − if ((rc = pcmcia_register_driver(&mgslpc_driver)) < 0) | |
| 2828 | − return rc; | |
| 2829 | − | |
| 2830 | − serial_driver = alloc_tty_driver(MAX_DEVICE_COUNT); | |
| 2831 | − if (!serial_driver) { | |
| 2832 | − rc = -ENOMEM; | |
| 2833 | − goto error; | |
| 2834 | − } | |
| 2813 | + serial_driver = tty_alloc_driver(MAX_DEVICE_COUNT, | |
| 2814 | + TTY_DRIVER_REAL_RAW | | |
| 2815 | + TTY_DRIVER_DYNAMIC_DEV); | |
| 2816 | + if (IS_ERR(serial_driver)) { | |
| 2817 | + rc = PTR_ERR(serial_driver); | |
| 2818 | + goto err; | |
| 2819 | + } | |
| 2835 | 2820 | |
| 2836 | − /* Initialize the tty_driver structure */ | |
| 2837 | − | |
| 2838 | − serial_driver->driver_name = "synclink_cs"; | |
| 2839 | − serial_driver->name = "ttySLP"; | |
| 2840 | − serial_driver->major = ttymajor; | |
| 2841 | − serial_driver->minor_start = 64; | |
| 2842 | − serial_driver->type = TTY_DRIVER_TYPE_SERIAL; | |
| 2843 | − serial_driver->subtype = SERIAL_TYPE_NORMAL; | |
| 2844 | − serial_driver->init_termios = tty_std_termios; | |
| 2845 | − serial_driver->init_termios.c_cflag = | |
| 2846 | − B9600 | CS8 | CREAD | HUPCL | CLOCAL; | |
| 2847 | − serial_driver->flags = TTY_DRIVER_REAL_RAW; | |
| 2848 | − tty_set_operations(serial_driver, &mgslpc_ops); | |
| 2849 | − | |
| 2850 | − if ((rc = tty_register_driver(serial_driver)) < 0) { | |
| 2851 | − printk("%s(%d):Couldn't register serial driver\n", | |
| 2852 | − __FILE__,__LINE__); | |
| 2853 | − put_tty_driver(serial_driver); | |
| 2854 | − serial_driver = NULL; | |
| 2855 | − goto error; | |
| 2856 | − } | |
| 2821 | + /* Initialize the tty_driver structure */ | |
| 2822 | + serial_driver->driver_name = "synclink_cs"; | |
| 2823 | + serial_driver->name = "ttySLP"; | |
| 2824 | + serial_driver->major = ttymajor; | |
| 2825 | + serial_driver->minor_start = 64; | |
| 2826 | + serial_driver->type = TTY_DRIVER_TYPE_SERIAL; | |
| 2827 | + serial_driver->subtype = SERIAL_TYPE_NORMAL; | |
| 2828 | + serial_driver->init_termios = tty_std_termios; | |
| 2829 | + serial_driver->init_termios.c_cflag = | |
| 2830 | + B9600 | CS8 | CREAD | HUPCL | CLOCAL; | |
| 2831 | + tty_set_operations(serial_driver, &mgslpc_ops); | |
| 2832 | + | |
| 2833 | + rc = tty_register_driver(serial_driver); | |
| 2834 | + if (rc < 0) { | |
| 2835 | + printk(KERN_ERR "%s(%d):Couldn't register serial driver\n", | |
| 2836 | + __FILE__, __LINE__); | |
| 2837 | + goto err_put_tty; | |
| 2838 | + } | |
| 2857 | 2839 | |
| 2858 | − printk("%s %s, tty major#%d\n", | |
| 2859 | − driver_name, driver_version, | |
| 2860 | − serial_driver->major); | |
| 2840 | + rc = pcmcia_register_driver(&mgslpc_driver); | |
| 2841 | + if (rc < 0) | |
| 2842 | + goto err_unreg_tty; | |
| 2861 | 2843 | |
| 2862 | − return 0; | |
| 2844 | + printk(KERN_INFO "%s %s, tty major#%d\n", driver_name, driver_version, | |
| 2845 | + serial_driver->major); | |
| 2863 | 2846 | |
| 2864 | −error: | |
| 2865 | − synclink_cs_cleanup(); | |
| 2866 | − return rc; | |
| 2847 | + return 0; | |
| 2848 | +err_unreg_tty: | |
| 2849 | + tty_unregister_driver(serial_driver); | |
| 2850 | +err_put_tty: | |
| 2851 | + put_tty_driver(serial_driver); | |
| 2852 | +err: | |
| 2853 | + return rc; | |
| 2867 | 2854 | } |
| 2868 | 2855 | |
| 2869 | 2856 | static void __exit synclink_cs_exit(void) |
| 2870 | 2857 | { |
| 2871 | − synclink_cs_cleanup(); | |
| 2858 | + pcmcia_unregister_driver(&mgslpc_driver); | |
| 2859 | + tty_unregister_driver(serial_driver); | |
| 2860 | + put_tty_driver(serial_driver); | |
| 2872 | 2861 | } |
| 2873 | 2862 | |
| 2874 | 2863 | module_init(synclink_cs_init); |
| @@ -67,7 +67,7 @@ static int tpk_printk(const unsigned char *buf, int count) · 66 unmodified lines | ||
| 67 | 67 | tmp[tpk_curr + 1] = '\0'; |
| 68 | 68 | printk(KERN_INFO "%s%s", tpk_tag, tmp); |
| 69 | 69 | tpk_curr = 0; |
| 70 | − if (buf[i + 1] == '\n') | |
| 70 | + if ((i + 1) < count && buf[i + 1] == '\n') | |
| 71 | 71 | i++; |
| 72 | 72 | break; |
| 73 | 73 | case '\n': |
| @@ -178,11 +178,17 @@ static struct tty_driver *ttyprintk_driver; · 104 unmodified lines | ||
| 178 | 178 | static int __init ttyprintk_init(void) |
| 179 | 179 | { |
| 180 | 180 | int ret = -ENOMEM; |
| 181 | − void *rp; | |
| 182 | 181 | |
| 183 | − ttyprintk_driver = alloc_tty_driver(1); | |
| 184 | − if (!ttyprintk_driver) | |
| 185 | − return ret; | |
| 182 | + tty_port_init(&tpk_port.port); | |
| 183 | + tpk_port.port.ops = &null_ops; | |
| 184 | + mutex_init(&tpk_port.port_write_mutex); | |
| 185 | + | |
| 186 | + ttyprintk_driver = tty_alloc_driver(1, | |
| 187 | + TTY_DRIVER_RESET_TERMIOS | | |
| 188 | + TTY_DRIVER_REAL_RAW | | |
| 189 | + TTY_DRIVER_UNNUMBERED_NODE); | |
| 190 | + if (IS_ERR(ttyprintk_driver)) | |
| 191 | + return PTR_ERR(ttyprintk_driver); | |
| 186 | 192 | |
| 187 | 193 | ttyprintk_driver->driver_name = "ttyprintk"; |
| 188 | 194 | ttyprintk_driver->name = "ttyprintk"; |
| @@ -191,9 +197,8 @@ static int __init ttyprintk_init(void) · 2 unmodified lines | ||
| 191 | 197 | ttyprintk_driver->type = TTY_DRIVER_TYPE_CONSOLE; |
| 192 | 198 | ttyprintk_driver->init_termios = tty_std_termios; |
| 193 | 199 | ttyprintk_driver->init_termios.c_oflag = OPOST | OCRNL | ONOCR | ONLRET; |
| 194 | − ttyprintk_driver->flags = TTY_DRIVER_RESET_TERMIOS | | |
| 195 | − TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV; | |
| 196 | 200 | tty_set_operations(ttyprintk_driver, &ttyprintk_ops); |
| 201 | + tty_port_link_device(&tpk_port.port, ttyprintk_driver, 0); | |
| 197 | 202 | |
| 198 | 203 | ret = tty_register_driver(ttyprintk_driver); |
| 199 | 204 | if (ret < 0) { |
| @@ -201,22 +206,10 @@ static int __init ttyprintk_init(void) · 1 unmodified line | ||
| 201 | 206 | goto error; |
| 202 | 207 | } |
| 203 | 208 | |
| 204 | − /* create our unnumbered device */ | |
| 205 | − rp = device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 3), NULL, | |
| 206 | − ttyprintk_driver->name); | |
| 207 | − if (IS_ERR(rp)) { | |
| 208 | − printk(KERN_ERR "Couldn't create ttyprintk device\n"); | |
| 209 | − ret = PTR_ERR(rp); | |
| 210 | − goto error; | |
| 211 | − } | |
| 212 | − | |
| 213 | − tty_port_init(&tpk_port.port); | |
| 214 | − tpk_port.port.ops = &null_ops; | |
| 215 | − mutex_init(&tpk_port.port_write_mutex); | |
| 216 | − | |
| 217 | 209 | return 0; |
| 218 | 210 | |
| 219 | 211 | error: |
| 212 | + tty_unregister_driver(ttyprintk_driver); | |
| 220 | 213 | put_tty_driver(ttyprintk_driver); |
| 221 | 214 | ttyprintk_driver = NULL; |
| 222 | 215 | return ret; |
| @@ -234,7 +234,8 @@ static struct capiminor *capiminor_alloc(struct capi20_appl *ap, u32 ncci) · 233 unmodified lines | ||
| 234 | 234 | |
| 235 | 235 | mp->minor = minor; |
| 236 | 236 | |
| 237 | − dev = tty_register_device(capinc_tty_driver, minor, NULL); | |
| 237 | + dev = tty_port_register_device(&mp->port, capinc_tty_driver, minor, | |
| 238 | + NULL); | |
| 238 | 239 | if (IS_ERR(dev)) |
| 239 | 240 | goto err_out2; |
| 240 | 241 | |
| @@ -446,8 +446,8 @@ static void if_set_termios(struct tty_struct *tty, struct ktermios *old) · 445 unmodified lines | ||
| 446 | 446 | goto out; |
| 447 | 447 | } |
| 448 | 448 | |
| 449 | − iflag = tty->termios->c_iflag; | |
| 450 | − cflag = tty->termios->c_cflag; | |
| 449 | + iflag = tty->termios.c_iflag; | |
| 450 | + cflag = tty->termios.c_cflag; | |
| 451 | 451 | old_cflag = old ? old->c_cflag : cflag; |
| 452 | 452 | gig_dbg(DEBUG_IF, "%u: iflag %x cflag %x old %x", |
| 453 | 453 | cs->minor_index, iflag, cflag, old_cflag); |
| @@ -524,7 +524,8 @@ void gigaset_if_init(struct cardstate *cs) · 70 unmodified lines | ||
| 524 | 524 | tasklet_init(&cs->if_wake_tasklet, if_wake, (unsigned long) cs); |
| 525 | 525 | |
| 526 | 526 | mutex_lock(&cs->mutex); |
| 527 | − cs->tty_dev = tty_register_device(drv->tty, cs->minor_index, NULL); | |
| 527 | + cs->tty_dev = tty_port_register_device(&cs->port, drv->tty, | |
| 528 | + cs->minor_index, NULL); | |
| 528 | 529 | |
| 529 | 530 | if (!IS_ERR(cs->tty_dev)) |
| 530 | 531 | dev_set_drvdata(cs->tty_dev, cs); |
| @@ -1009,15 +1009,15 @@ isdn_tty_change_speed(modem_info *info) · 1008 unmodified lines | ||
| 1009 | 1009 | quot; |
| 1010 | 1010 | int i; |
| 1011 | 1011 | |
| 1012 | − if (!port->tty || !port->tty->termios) | |
| 1012 | + if (!port->tty) | |
| 1013 | 1013 | return; |
| 1014 | − cflag = port->tty->termios->c_cflag; | |
| 1014 | + cflag = port->tty->termios.c_cflag; | |
| 1015 | 1015 | |
| 1016 | 1016 | quot = i = cflag & CBAUD; |
| 1017 | 1017 | if (i & CBAUDEX) { |
| 1018 | 1018 | i &= ~CBAUDEX; |
| 1019 | 1019 | if (i < 1 || i > 2) |
| 1020 | − port->tty->termios->c_cflag &= ~CBAUDEX; | |
| 1020 | + port->tty->termios.c_cflag &= ~CBAUDEX; | |
| 1021 | 1021 | else |
| 1022 | 1022 | i += 15; |
| 1023 | 1023 | } |
| @@ -1097,7 +1097,7 @@ isdn_tty_shutdown(modem_info *info) · 73 unmodified lines | ||
| 1097 | 1097 | #endif |
| 1098 | 1098 | isdn_unlock_drivers(); |
| 1099 | 1099 | info->msr &= ~UART_MSR_RI; |
| 1100 | − if (!info->port.tty || (info->port.tty->termios->c_cflag & HUPCL)) { | |
| 1100 | + if (!info->port.tty || (info->port.tty->termios.c_cflag & HUPCL)) { | |
| 1101 | 1101 | info->mcr &= ~(UART_MCR_DTR | UART_MCR_RTS); |
| 1102 | 1102 | if (info->emu.mdmreg[REG_DTRHUP] & BIT_DTRHUP) { |
| 1103 | 1103 | isdn_tty_modem_reset_regs(info, 0); |
| @@ -1469,13 +1469,13 @@ isdn_tty_set_termios(struct tty_struct *tty, struct ktermios *old_termios) · 365 unmodified lines | ||
| 1469 | 1469 | if (!old_termios) |
| 1470 | 1470 | isdn_tty_change_speed(info); |
| 1471 | 1471 | else { |
| 1472 | − if (tty->termios->c_cflag == old_termios->c_cflag && | |
| 1473 | − tty->termios->c_ispeed == old_termios->c_ispeed && | |
| 1474 | − tty->termios->c_ospeed == old_termios->c_ospeed) | |
| 1472 | + if (tty->termios.c_cflag == old_termios->c_cflag && | |
| 1473 | + tty->termios.c_ispeed == old_termios->c_ispeed && | |
| 1474 | + tty->termios.c_ospeed == old_termios->c_ospeed) | |
| 1475 | 1475 | return; |
| 1476 | 1476 | isdn_tty_change_speed(info); |
| 1477 | 1477 | if ((old_termios->c_cflag & CRTSCTS) && |
| 1478 | − !(tty->termios->c_cflag & CRTSCTS)) | |
| 1478 | + !(tty->termios.c_cflag & CRTSCTS)) | |
| 1479 | 1479 | tty->hw_stopped = 0; |
| 1480 | 1480 | } |
| 1481 | 1481 | } |
| @@ -1486,6 +1486,18 @@ isdn_tty_set_termios(struct tty_struct *tty, struct ktermios *old_termios) · 4 unmodified lines | ||
| 1486 | 1486 | * ------------------------------------------------------------ |
| 1487 | 1487 | */ |
| 1488 | 1488 | |
| 1489 | +static int isdn_tty_install(struct tty_driver *driver, struct tty_struct *tty) | |
| 1490 | +{ | |
| 1491 | + modem_info *info = &dev->mdm.info[tty->index]; | |
| 1492 | + | |
| 1493 | + if (isdn_tty_paranoia_check(info, tty->name, __func__)) | |
| 1494 | + return -ENODEV; | |
| 1495 | + | |
| 1496 | + tty->driver_data = info; | |
| 1497 | + | |
| 1498 | + return tty_port_install(&info->port, driver, tty); | |
| 1499 | +} | |
| 1500 | + | |
| 1489 | 1501 | /* |
| 1490 | 1502 | * This routine is called whenever a serial port is opened. It |
| 1491 | 1503 | * enables interrupts for a serial port, linking in its async structure into |
| @@ -1495,22 +1507,16 @@ isdn_tty_set_termios(struct tty_struct *tty, struct ktermios *old_termios) · 3 unmodified lines | ||
| 1495 | 1507 | static int |
| 1496 | 1508 | isdn_tty_open(struct tty_struct *tty, struct file *filp) |
| 1497 | 1509 | { |
| 1498 | − struct tty_port *port; | |
| 1499 | − modem_info *info; | |
| 1510 | + modem_info *info = tty->driver_data; | |
| 1511 | + struct tty_port *port = &info->port; | |
| 1500 | 1512 | int retval; |
| 1501 | 1513 | |
| 1502 | − info = &dev->mdm.info[tty->index]; | |
| 1503 | − if (isdn_tty_paranoia_check(info, tty->name, "isdn_tty_open")) | |
| 1504 | − return -ENODEV; | |
| 1505 | − port = &info->port; | |
| 1506 | 1514 | #ifdef ISDN_DEBUG_MODEM_OPEN |
| 1507 | 1515 | printk(KERN_DEBUG "isdn_tty_open %s, count = %d\n", tty->name, |
| 1508 | 1516 | port->count); |
| 1509 | 1517 | #endif |
| 1510 | 1518 | port->count++; |
| 1511 | − tty->driver_data = info; | |
| 1512 | 1519 | port->tty = tty; |
| 1513 | − tty->port = port; | |
| 1514 | 1520 | /* |
| 1515 | 1521 | * Start up serial port |
| 1516 | 1522 | */ |
| @@ -1738,6 +1744,7 @@ modem_write_profile(atemu *m) · 221 unmodified lines | ||
| 1738 | 1744 | } |
| 1739 | 1745 | |
| 1740 | 1746 | static const struct tty_operations modem_ops = { |
| 1747 | + .install = isdn_tty_install, | |
| 1741 | 1748 | .open = isdn_tty_open, |
| 1742 | 1749 | .close = isdn_tty_close, |
| 1743 | 1750 | .write = isdn_tty_write, |
| @@ -1782,7 +1789,7 @@ isdn_tty_modem_init(void) · 38 unmodified lines | ||
| 1782 | 1789 | m->tty_modem->subtype = SERIAL_TYPE_NORMAL; |
| 1783 | 1790 | m->tty_modem->init_termios = tty_std_termios; |
| 1784 | 1791 | m->tty_modem->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL; |
| 1785 | − m->tty_modem->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV; | |
| 1792 | + m->tty_modem->flags = TTY_DRIVER_REAL_RAW; | |
| 1786 | 1793 | m->tty_modem->driver_name = "isdn_tty"; |
| 1787 | 1794 | tty_set_operations(m->tty_modem, &modem_ops); |
| 1788 | 1795 | retval = tty_register_driver(m->tty_modem); |
| @@ -33,7 +33,7 @@ · 32 unmodified lines | ||
| 33 | 33 | |
| 34 | 34 | void ibmasm_register_uart(struct service_processor *sp) |
| 35 | 35 | { |
| 36 | − struct uart_port uport; | |
| 36 | + struct uart_8250_port uart; | |
| 37 | 37 | void __iomem *iomem_base; |
| 38 | 38 | |
| 39 | 39 | iomem_base = sp->base_address + SCOUT_COM_B_BASE; |
| @@ -47,14 +47,14 @@ void ibmasm_register_uart(struct service_processor *sp) · 7 unmodified lines | ||
| 47 | 47 | return; |
| 48 | 48 | } |
| 49 | 49 | |
| 50 | − memset(&uport, 0, sizeof(struct uart_port)); | |
| 51 | − uport.irq = sp->irq; | |
| 52 | − uport.uartclk = 3686400; | |
| 53 | − uport.flags = UPF_SHARE_IRQ; | |
| 54 | − uport.iotype = UPIO_MEM; | |
| 55 | − uport.membase = iomem_base; | |
| 50 | + memset(&uart, 0, sizeof(uart)); | |
| 51 | + uart.port.irq = sp->irq; | |
| 52 | + uart.port.uartclk = 3686400; | |
| 53 | + uart.port.flags = UPF_SHARE_IRQ; | |
| 54 | + uart.port.iotype = UPIO_MEM; | |
| 55 | + uart.port.membase = iomem_base; | |
| 56 | 56 | |
| 57 | − sp->serial_line = serial8250_register_port(&uport); | |
| 57 | + sp->serial_line = serial8250_register_8250_port(&uart); | |
| 58 | 58 | if (sp->serial_line < 0) { |
| 59 | 59 | dev_err(sp->dev, "Failed to register serial port\n"); |
| 60 | 60 | return; |
| @@ -60,7 +60,7 @@ struct pti_tty { · 59 unmodified lines | ||
| 60 | 60 | }; |
| 61 | 61 | |
| 62 | 62 | struct pti_dev { |
| 63 | − struct tty_port port; | |
| 63 | + struct tty_port port[PTITTY_MINOR_NUM]; | |
| 64 | 64 | unsigned long pti_addr; |
| 65 | 65 | unsigned long aperture_base; |
| 66 | 66 | void __iomem *pti_ioaddr; |
| @@ -76,7 +76,7 @@ struct pti_dev { · 9 unmodified lines | ||
| 76 | 76 | */ |
| 77 | 77 | static DEFINE_MUTEX(alloclock); |
| 78 | 78 | |
| 79 | −static struct pci_device_id pci_ids[] __devinitconst = { | |
| 79 | +static const struct pci_device_id pci_ids[] __devinitconst = { | |
| 80 | 80 | {PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x82B)}, |
| 81 | 81 | {0} |
| 82 | 82 | }; |
| @@ -393,25 +393,6 @@ void pti_writedata(struct pti_masterchannel *mc, u8 *buf, int count) · 310 unmodified lines | ||
| 393 | 393 | } |
| 394 | 394 | EXPORT_SYMBOL_GPL(pti_writedata); |
| 395 | 395 | |
| 396 | −/** | |
| 397 | − * pti_pci_remove()- Driver exit method to remove PTI from | |
| 398 | − * PCI bus. | |
| 399 | − * @pdev: variable containing pci info of PTI. | |
| 400 | − */ | |
| 401 | −static void __devexit pti_pci_remove(struct pci_dev *pdev) | |
| 402 | −{ | |
| 403 | − struct pti_dev *drv_data; | |
| 404 | − | |
| 405 | − drv_data = pci_get_drvdata(pdev); | |
| 406 | − if (drv_data != NULL) { | |
| 407 | − pci_iounmap(pdev, drv_data->pti_ioaddr); | |
| 408 | − pci_set_drvdata(pdev, NULL); | |
| 409 | − kfree(drv_data); | |
| 410 | − pci_release_region(pdev, 1); | |
| 411 | − pci_disable_device(pdev); | |
| 412 | − } | |
| 413 | −} | |
| 414 | − | |
| 415 | 396 | /* |
| 416 | 397 | * for the tty_driver_*() basic function descriptions, see tty_driver.h. |
| 417 | 398 | * Specific header comments made for PTI-related specifics. |
| @@ -446,7 +427,7 @@ static int pti_tty_driver_open(struct tty_struct *tty, struct file *filp) · 28 unmodified lines | ||
| 446 | 427 | * also removes a locking requirement for the actual write |
| 447 | 428 | * procedure. |
| 448 | 429 | */ |
| 449 | − return tty_port_open(&drv_data->port, tty, filp); | |
| 430 | + return tty_port_open(tty->port, tty, filp); | |
| 450 | 431 | } |
| 451 | 432 | |
| 452 | 433 | /** |
| @@ -462,7 +443,7 @@ static int pti_tty_driver_open(struct tty_struct *tty, struct file *filp) · 9 unmodified lines | ||
| 462 | 443 | */ |
| 463 | 444 | static void pti_tty_driver_close(struct tty_struct *tty, struct file *filp) |
| 464 | 445 | { |
| 465 | − tty_port_close(&drv_data->port, tty, filp); | |
| 446 | + tty_port_close(tty->port, tty, filp); | |
| 466 | 447 | } |
| 467 | 448 | |
| 468 | 449 | /** |
| @@ -818,6 +799,7 @@ static const struct tty_port_operations tty_port_ops = { · 349 unmodified lines | ||
| 818 | 799 | static int __devinit pti_pci_probe(struct pci_dev *pdev, |
| 819 | 800 | const struct pci_device_id *ent) |
| 820 | 801 | { |
| 802 | + unsigned int a; | |
| 821 | 803 | int retval = -EINVAL; |
| 822 | 804 | int pci_bar = 1; |
| 823 | 805 | |
| @@ -830,7 +812,7 @@ static int __devinit pti_pci_probe(struct pci_dev *pdev, · 6 unmodified lines | ||
| 830 | 812 | __func__, __LINE__); |
| 831 | 813 | pr_err("%s(%d): Error value returned: %d\n", |
| 832 | 814 | __func__, __LINE__, retval); |
| 833 | − return retval; | |
| 815 | + goto err; | |
| 834 | 816 | } |
| 835 | 817 | |
| 836 | 818 | retval = pci_enable_device(pdev); |
| @@ -838,17 +820,16 @@ static int __devinit pti_pci_probe(struct pci_dev *pdev, · 1 unmodified line | ||
| 838 | 820 | dev_err(&pdev->dev, |
| 839 | 821 | "%s: pci_enable_device() returned error %d\n", |
| 840 | 822 | __func__, retval); |
| 841 | − return retval; | |
| 823 | + goto err_unreg_misc; | |
| 842 | 824 | } |
| 843 | 825 | |
| 844 | 826 | drv_data = kzalloc(sizeof(*drv_data), GFP_KERNEL); |
| 845 | − | |
| 846 | 827 | if (drv_data == NULL) { |
| 847 | 828 | retval = -ENOMEM; |
| 848 | 829 | dev_err(&pdev->dev, |
| 849 | 830 | "%s(%d): kmalloc() returned NULL memory.\n", |
| 850 | 831 | __func__, __LINE__); |
| 851 | − return retval; | |
| 832 | + goto err_disable_pci; | |
| 852 | 833 | } |
| 853 | 834 | drv_data->pti_addr = pci_resource_start(pdev, pci_bar); |
| 854 | 835 | |
| @@ -857,33 +838,65 @@ static int __devinit pti_pci_probe(struct pci_dev *pdev, · 2 unmodified lines | ||
| 857 | 838 | dev_err(&pdev->dev, |
| 858 | 839 | "%s(%d): pci_request_region() returned error %d\n", |
| 859 | 840 | __func__, __LINE__, retval); |
| 860 | − kfree(drv_data); | |
| 861 | − return retval; | |
| 841 | + goto err_free_dd; | |
| 862 | 842 | } |
| 863 | 843 | drv_data->aperture_base = drv_data->pti_addr+APERTURE_14; |
| 864 | 844 | drv_data->pti_ioaddr = |
| 865 | 845 | ioremap_nocache((u32)drv_data->aperture_base, |
| 866 | 846 | APERTURE_LEN); |
| 867 | 847 | if (!drv_data->pti_ioaddr) { |
| 868 | − pci_release_region(pdev, pci_bar); | |
| 869 | 848 | retval = -ENOMEM; |
| 870 | − kfree(drv_data); | |
| 871 | − return retval; | |
| 849 | + goto err_rel_reg; | |
| 872 | 850 | } |
| 873 | 851 | |
| 874 | 852 | pci_set_drvdata(pdev, drv_data); |
| 875 | 853 | |
| 876 | − tty_port_init(&drv_data->port); | |
| 877 | − drv_data->port.ops = &tty_port_ops; | |
| 854 | + for (a = 0; a < PTITTY_MINOR_NUM; a++) { | |
| 855 | + struct tty_port *port = &drv_data->port[a]; | |
| 856 | + tty_port_init(port); | |
| 857 | + port->ops = &tty_port_ops; | |
| 878 | 858 | |
| 879 | − tty_register_device(pti_tty_driver, 0, &pdev->dev); | |
| 880 | − tty_register_device(pti_tty_driver, 1, &pdev->dev); | |
| 859 | + tty_port_register_device(port, pti_tty_driver, a, &pdev->dev); | |
| 860 | + } | |
| 881 | 861 | |
| 882 | 862 | register_console(&pti_console); |
| 883 | 863 | |
| 864 | + return 0; | |
| 865 | +err_rel_reg: | |
| 866 | + pci_release_region(pdev, pci_bar); | |
| 867 | +err_free_dd: | |
| 868 | + kfree(drv_data); | |
| 869 | +err_disable_pci: | |
| 870 | + pci_disable_device(pdev); | |
| 871 | +err_unreg_misc: | |
| 872 | + misc_deregister(&pti_char_driver); | |
| 873 | +err: | |
| 884 | 874 | return retval; |
| 885 | 875 | } |
| 886 | 876 | |
| 877 | +/** | |
| 878 | + * pti_pci_remove()- Driver exit method to remove PTI from | |
| 879 | + * PCI bus. | |
| 880 | + * @pdev: variable containing pci info of PTI. | |
| 881 | + */ | |
| 882 | +static void __devexit pti_pci_remove(struct pci_dev *pdev) | |
| 883 | +{ | |
| 884 | + struct pti_dev *drv_data = pci_get_drvdata(pdev); | |
| 885 | + | |
| 886 | + unregister_console(&pti_console); | |
| 887 | + | |
| 888 | + tty_unregister_device(pti_tty_driver, 0); | |
| 889 | + tty_unregister_device(pti_tty_driver, 1); | |
| 890 | + | |
| 891 | + iounmap(drv_data->pti_ioaddr); | |
| 892 | + pci_set_drvdata(pdev, NULL); | |
| 893 | + kfree(drv_data); | |
| 894 | + pci_release_region(pdev, 1); | |
| 895 | + pci_disable_device(pdev); | |
| 896 | + | |
| 897 | + misc_deregister(&pti_char_driver); | |
| 898 | +} | |
| 899 | + | |
| 887 | 900 | static struct pci_driver pti_pci_driver = { |
| 888 | 901 | .name = PCINAME, |
| 889 | 902 | .id_table = pci_ids, |
| @@ -933,25 +946,24 @@ static int __init pti_init(void) · 43 unmodified lines | ||
| 933 | 946 | pr_err("%s(%d): Error value returned: %d\n", |
| 934 | 947 | __func__, __LINE__, retval); |
| 935 | 948 | |
| 936 | − pti_tty_driver = NULL; | |
| 937 | − return retval; | |
| 949 | + goto put_tty; | |
| 938 | 950 | } |
| 939 | 951 | |
| 940 | 952 | retval = pci_register_driver(&pti_pci_driver); |
| 941 | − | |
| 942 | 953 | if (retval) { |
| 943 | 954 | pr_err("%s(%d): PCI registration failed of pti driver\n", |
| 944 | 955 | __func__, __LINE__); |
| 945 | 956 | pr_err("%s(%d): Error value returned: %d\n", |
| 946 | 957 | __func__, __LINE__, retval); |
| 947 | − | |
| 948 | − tty_unregister_driver(pti_tty_driver); | |
| 949 | − pr_err("%s(%d): Unregistering TTY part of pti driver\n", | |
| 950 | − __func__, __LINE__); | |
| 951 | − pti_tty_driver = NULL; | |
| 952 | − return retval; | |
| 958 | + goto unreg_tty; | |
| 953 | 959 | } |
| 954 | 960 | |
| 961 | + return 0; | |
| 962 | +unreg_tty: | |
| 963 | + tty_unregister_driver(pti_tty_driver); | |
| 964 | +put_tty: | |
| 965 | + put_tty_driver(pti_tty_driver); | |
| 966 | + pti_tty_driver = NULL; | |
| 955 | 967 | return retval; |
| 956 | 968 | } |
| 957 | 969 | |
| @@ -960,31 +972,9 @@ static int __init pti_init(void) · 2 unmodified lines | ||
| 960 | 972 | */ |
| 961 | 973 | static void __exit pti_exit(void) |
| 962 | 974 | { |
| 963 | − int retval; | |
| 964 | − | |
| 965 | − tty_unregister_device(pti_tty_driver, 0); | |
| 966 | − tty_unregister_device(pti_tty_driver, 1); | |
| 967 | − | |
| 968 | − retval = tty_unregister_driver(pti_tty_driver); | |
| 969 | − if (retval) { | |
| 970 | − pr_err("%s(%d): TTY unregistration failed of pti driver\n", | |
| 971 | − __func__, __LINE__); | |
| 972 | − pr_err("%s(%d): Error value returned: %d\n", | |
| 973 | − __func__, __LINE__, retval); | |
| 974 | − } | |
| 975 | − | |
| 975 | + tty_unregister_driver(pti_tty_driver); | |
| 976 | 976 | pci_unregister_driver(&pti_pci_driver); |
| 977 | − | |
| 978 | − retval = misc_deregister(&pti_char_driver); | |
| 979 | − if (retval) { | |
| 980 | − pr_err("%s(%d): CHAR unregistration failed of pti driver\n", | |
| 981 | − __func__, __LINE__); | |
| 982 | − pr_err("%s(%d): Error value returned: %d\n", | |
| 983 | − __func__, __LINE__, retval); | |
| 984 | − } | |
| 985 | − | |
| 986 | − unregister_console(&pti_console); | |
| 987 | − return; | |
| 977 | + put_tty_driver(pti_tty_driver); | |
| 988 | 978 | } |
| 989 | 979 | |
| 990 | 980 | module_init(pti_init); |
| @@ -518,7 +518,7 @@ static void sdio_uart_check_modem_status(struct sdio_uart_port *port) · 517 unmodified lines | ||
| 518 | 518 | if (status & UART_MSR_DCTS) { |
| 519 | 519 | port->icount.cts++; |
| 520 | 520 | tty = tty_port_tty_get(&port->port); |
| 521 | − if (tty && (tty->termios->c_cflag & CRTSCTS)) { | |
| 521 | + if (tty && (tty->termios.c_cflag & CRTSCTS)) { | |
| 522 | 522 | int cts = (status & UART_MSR_CTS); |
| 523 | 523 | if (tty->hw_stopped) { |
| 524 | 524 | if (cts) { |
| @@ -671,12 +671,12 @@ static int sdio_uart_activate(struct tty_port *tport, struct tty_struct *tty) · 146 unmodified lines | ||
| 671 | 671 | port->ier = UART_IER_RLSI|UART_IER_RDI|UART_IER_RTOIE|UART_IER_UUE; |
| 672 | 672 | port->mctrl = TIOCM_OUT2; |
| 673 | 673 | |
| 674 | − sdio_uart_change_speed(port, tty->termios, NULL); | |
| 674 | + sdio_uart_change_speed(port, &tty->termios, NULL); | |
| 675 | 675 | |
| 676 | − if (tty->termios->c_cflag & CBAUD) | |
| 676 | + if (tty->termios.c_cflag & CBAUD) | |
| 677 | 677 | sdio_uart_set_mctrl(port, TIOCM_RTS | TIOCM_DTR); |
| 678 | 678 | |
| 679 | − if (tty->termios->c_cflag & CRTSCTS) | |
| 679 | + if (tty->termios.c_cflag & CRTSCTS) | |
| 680 | 680 | if (!(sdio_uart_get_mctrl(port) & TIOCM_CTS)) |
| 681 | 681 | tty->hw_stopped = 1; |
| 682 | 682 | |
| @@ -850,7 +850,7 @@ static void sdio_uart_throttle(struct tty_struct *tty) · 167 unmodified lines | ||
| 850 | 850 | { |
| 851 | 851 | struct sdio_uart_port *port = tty->driver_data; |
| 852 | 852 | |
| 853 | − if (!I_IXOFF(tty) && !(tty->termios->c_cflag & CRTSCTS)) | |
| 853 | + if (!I_IXOFF(tty) && !(tty->termios.c_cflag & CRTSCTS)) | |
| 854 | 854 | return; |
| 855 | 855 | |
| 856 | 856 | if (sdio_uart_claim_func(port) != 0) |
| @@ -861,7 +861,7 @@ static void sdio_uart_throttle(struct tty_struct *tty) · 4 unmodified lines | ||
| 861 | 861 | sdio_uart_start_tx(port); |
| 862 | 862 | } |
| 863 | 863 | |
| 864 | − if (tty->termios->c_cflag & CRTSCTS) | |
| 864 | + if (tty->termios.c_cflag & CRTSCTS) | |
| 865 | 865 | sdio_uart_clear_mctrl(port, TIOCM_RTS); |
| 866 | 866 | |
| 867 | 867 | sdio_uart_irq(port->func); |
| @@ -872,7 +872,7 @@ static void sdio_uart_unthrottle(struct tty_struct *tty) · 4 unmodified lines | ||
| 872 | 872 | { |
| 873 | 873 | struct sdio_uart_port *port = tty->driver_data; |
| 874 | 874 | |
| 875 | − if (!I_IXOFF(tty) && !(tty->termios->c_cflag & CRTSCTS)) | |
| 875 | + if (!I_IXOFF(tty) && !(tty->termios.c_cflag & CRTSCTS)) | |
| 876 | 876 | return; |
| 877 | 877 | |
| 878 | 878 | if (sdio_uart_claim_func(port) != 0) |
| @@ -887,7 +887,7 @@ static void sdio_uart_unthrottle(struct tty_struct *tty) · 8 unmodified lines | ||
| 887 | 887 | } |
| 888 | 888 | } |
| 889 | 889 | |
| 890 | − if (tty->termios->c_cflag & CRTSCTS) | |
| 890 | + if (tty->termios.c_cflag & CRTSCTS) | |
| 891 | 891 | sdio_uart_set_mctrl(port, TIOCM_RTS); |
| 892 | 892 | |
| 893 | 893 | sdio_uart_irq(port->func); |
| @@ -898,12 +898,12 @@ static void sdio_uart_set_termios(struct tty_struct *tty, · 4 unmodified lines | ||
| 898 | 898 | struct ktermios *old_termios) |
| 899 | 899 | { |
| 900 | 900 | struct sdio_uart_port *port = tty->driver_data; |
| 901 | − unsigned int cflag = tty->termios->c_cflag; | |
| 901 | + unsigned int cflag = tty->termios.c_cflag; | |
| 902 | 902 | |
| 903 | 903 | if (sdio_uart_claim_func(port) != 0) |
| 904 | 904 | return; |
| 905 | 905 | |
| 906 | − sdio_uart_change_speed(port, tty->termios, old_termios); | |
| 906 | + sdio_uart_change_speed(port, &tty->termios, old_termios); | |
| 907 | 907 | |
| 908 | 908 | /* Handle transition to B0 status */ |
| 909 | 909 | if ((old_termios->c_cflag & CBAUD) && !(cflag & CBAUD)) |
| @@ -1132,8 +1132,8 @@ static int sdio_uart_probe(struct sdio_func *func, · 222 unmodified lines | ||
| 1132 | 1132 | kfree(port); |
| 1133 | 1133 | } else { |
| 1134 | 1134 | struct device *dev; |
| 1135 | − dev = tty_register_device(sdio_uart_tty_driver, | |
| 1136 | − port->index, &func->dev); | |
| 1135 | + dev = tty_port_register_device(&port->port, | |
| 1136 | + sdio_uart_tty_driver, port->index, &func->dev); | |
| 1137 | 1137 | if (IS_ERR(dev)) { |
| 1138 | 1138 | sdio_uart_port_remove(port); |
| 1139 | 1139 | ret = PTR_ERR(dev); |
| @@ -1147,15 +1147,17 @@ static void __devinit ioc3_8250_register(struct ioc3_uartregs __iomem *uart) · 1146 unmodified lines | ||
| 1147 | 1147 | { |
| 1148 | 1148 | #define COSMISC_CONSTANT 6 |
| 1149 | 1149 | |
| 1150 | − struct uart_port port = { | |
| 1151 | − .irq = 0, | |
| 1152 | − .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF, | |
| 1153 | − .iotype = UPIO_MEM, | |
| 1154 | − .regshift = 0, | |
| 1155 | − .uartclk = (22000000 << 1) / COSMISC_CONSTANT, | |
| 1156 | − | |
| 1157 | − .membase = (unsigned char __iomem *) uart, | |
| 1158 | − .mapbase = (unsigned long) uart, | |
| 1150 | + struct uart_8250_port port = { | |
| 1151 | + .port = { | |
| 1152 | + .irq = 0, | |
| 1153 | + .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF, | |
| 1154 | + .iotype = UPIO_MEM, | |
| 1155 | + .regshift = 0, | |
| 1156 | + .uartclk = (22000000 << 1) / COSMISC_CONSTANT, | |
| 1157 | + | |
| 1158 | + .membase = (unsigned char __iomem *) uart, | |
| 1159 | + .mapbase = (unsigned long) uart, | |
| 1160 | + } | |
| 1159 | 1161 | }; |
| 1160 | 1162 | unsigned char lcr; |
| 1161 | 1163 | |
| @@ -1164,7 +1166,7 @@ static void __devinit ioc3_8250_register(struct ioc3_uartregs __iomem *uart) · 2 unmodified lines | ||
| 1164 | 1166 | uart->iu_scr = COSMISC_CONSTANT, |
| 1165 | 1167 | uart->iu_lcr = lcr; |
| 1166 | 1168 | uart->iu_lcr; |
| 1167 | − serial8250_register_port(&port); | |
| 1169 | + serial8250_register_8250_port(&port); | |
| 1168 | 1170 | } |
| 1169 | 1171 | |
| 1170 | 1172 | static void __devinit ioc3_serial_probe(struct pci_dev *pdev, struct ioc3 *ioc3) |
| @@ -124,8 +124,8 @@ static int irtty_change_speed(struct sir_dev *dev, unsigned speed) · 123 unmodified lines | ||
| 124 | 124 | tty = priv->tty; |
| 125 | 125 | |
| 126 | 126 | mutex_lock(&tty->termios_mutex); |
| 127 | − old_termios = *(tty->termios); | |
| 128 | − cflag = tty->termios->c_cflag; | |
| 127 | + old_termios = tty->termios; | |
| 128 | + cflag = tty->termios.c_cflag; | |
| 129 | 129 | tty_encode_baud_rate(tty, speed, speed); |
| 130 | 130 | if (tty->ops->set_termios) |
| 131 | 131 | tty->ops->set_termios(tty, &old_termios); |
| @@ -281,15 +281,15 @@ static inline void irtty_stop_receiver(struct tty_struct *tty, int stop) · 149 unmodified lines | ||
| 281 | 281 | int cflag; |
| 282 | 282 | |
| 283 | 283 | mutex_lock(&tty->termios_mutex); |
| 284 | − old_termios = *(tty->termios); | |
| 285 | − cflag = tty->termios->c_cflag; | |
| 284 | + old_termios = tty->termios; | |
| 285 | + cflag = tty->termios.c_cflag; | |
| 286 | 286 | |
| 287 | 287 | if (stop) |
| 288 | 288 | cflag &= ~CREAD; |
| 289 | 289 | else |
| 290 | 290 | cflag |= CREAD; |
| 291 | 291 | |
| 292 | − tty->termios->c_cflag = cflag; | |
| 292 | + tty->termios.c_cflag = cflag; | |
| 293 | 293 | if (tty->ops->set_termios) |
| 294 | 294 | tty->ops->set_termios(tty, &old_termios); |
| 295 | 295 | mutex_unlock(&tty->termios_mutex); |
| @@ -1107,7 +1107,6 @@ static void _hso_serial_set_termios(struct tty_struct *tty, · 1106 unmodified lines | ||
| 1107 | 1107 | struct ktermios *old) |
| 1108 | 1108 | { |
| 1109 | 1109 | struct hso_serial *serial = tty->driver_data; |
| 1110 | − struct ktermios *termios; | |
| 1111 | 1110 | |
| 1112 | 1111 | if (!serial) { |
| 1113 | 1112 | printk(KERN_ERR "%s: no tty structures", __func__); |
| @@ -1119,16 +1118,15 @@ static void _hso_serial_set_termios(struct tty_struct *tty, · 5 unmodified lines | ||
| 1119 | 1118 | /* |
| 1120 | 1119 | * Fix up unsupported bits |
| 1121 | 1120 | */ |
| 1122 | − termios = tty->termios; | |
| 1123 | − termios->c_iflag &= ~IXON; /* disable enable XON/XOFF flow control */ | |
| 1121 | + tty->termios.c_iflag &= ~IXON; /* disable enable XON/XOFF flow control */ | |
| 1124 | 1122 | |
| 1125 | − termios->c_cflag &= | |
| 1123 | + tty->termios.c_cflag &= | |
| 1126 | 1124 | ~(CSIZE /* no size */ |
| 1127 | 1125 | | PARENB /* disable parity bit */ |
| 1128 | 1126 | | CBAUD /* clear current baud rate */ |
| 1129 | 1127 | | CBAUDEX); /* clear current buad rate */ |
| 1130 | 1128 | |
| 1131 | − termios->c_cflag |= CS8; /* character size 8 bits */ | |
| 1129 | + tty->termios.c_cflag |= CS8; /* character size 8 bits */ | |
| 1132 | 1130 | |
| 1133 | 1131 | /* baud rate 115200 */ |
| 1134 | 1132 | tty_encode_baud_rate(tty, 115200, 115200); |
| @@ -1425,14 +1423,14 @@ static void hso_serial_set_termios(struct tty_struct *tty, struct ktermios *old) · 290 unmodified lines | ||
| 1425 | 1423 | |
| 1426 | 1424 | if (old) |
| 1427 | 1425 | D5("Termios called with: cflags new[%d] - old[%d]", |
| 1428 | − tty->termios->c_cflag, old->c_cflag); | |
| 1426 | + tty->termios.c_cflag, old->c_cflag); | |
| 1429 | 1427 | |
| 1430 | 1428 | /* the actual setup */ |
| 1431 | 1429 | spin_lock_irqsave(&serial->serial_lock, flags); |
| 1432 | 1430 | if (serial->port.count) |
| 1433 | 1431 | _hso_serial_set_termios(tty, old); |
| 1434 | 1432 | else |
| 1435 | − tty->termios = old; | |
| 1433 | + tty->termios = *old; | |
| 1436 | 1434 | spin_unlock_irqrestore(&serial->serial_lock, flags); |
| 1437 | 1435 | |
| 1438 | 1436 | /* done */ |
| @@ -2289,9 +2287,11 @@ static int hso_serial_common_create(struct hso_serial *serial, int num_urbs, · 850 unmodified lines | ||
| 2289 | 2287 | if (minor < 0) |
| 2290 | 2288 | goto exit; |
| 2291 | 2289 | |
| 2290 | + tty_port_init(&serial->port); | |
| 2291 | + | |
| 2292 | 2292 | /* register our minor number */ |
| 2293 | − serial->parent->dev = tty_register_device(tty_drv, minor, | |
| 2294 | − &serial->parent->interface->dev); | |
| 2293 | + serial->parent->dev = tty_port_register_device(&serial->port, tty_drv, | |
| 2294 | + minor, &serial->parent->interface->dev); | |
| 2295 | 2295 | dev = serial->parent->dev; |
| 2296 | 2296 | dev_set_drvdata(dev, serial->parent); |
| 2297 | 2297 | i = device_create_file(dev, &dev_attr_hsotype); |
| @@ -2300,7 +2300,6 @@ static int hso_serial_common_create(struct hso_serial *serial, int num_urbs, · 2 unmodified lines | ||
| 2300 | 2300 | serial->minor = minor; |
| 2301 | 2301 | serial->magic = HSO_SERIAL_MAGIC; |
| 2302 | 2302 | spin_lock_init(&serial->serial_lock); |
| 2303 | − tty_port_init(&serial->port); | |
| 2304 | 2303 | serial->num_rx_urbs = num_urbs; |
| 2305 | 2304 | |
| 2306 | 2305 | /* RX, allocate urb and initialize */ |
| @@ -271,6 +271,7 @@ struct parport *__devinit parport_gsc_probe_port (unsigned long base, · 270 unmodified lines | ||
| 271 | 271 | if (!parport_SPP_supported (p)) { |
| 272 | 272 | /* No port. */ |
| 273 | 273 | kfree (priv); |
| 274 | + kfree(ops); | |
| 274 | 275 | return NULL; |
| 275 | 276 | } |
| 276 | 277 | parport_PS2_supported (p); |
| @@ -62,6 +62,7 @@ enum parport_pc_pci_cards { · 61 unmodified lines | ||
| 62 | 62 | timedia_9079a, |
| 63 | 63 | timedia_9079b, |
| 64 | 64 | timedia_9079c, |
| 65 | + wch_ch353_2s1p, | |
| 65 | 66 | }; |
| 66 | 67 | |
| 67 | 68 | /* each element directly indexed from enum list, above */ |
| @@ -145,6 +146,7 @@ static struct parport_pc_pci cards[] __devinitdata = { · 77 unmodified lines | ||
| 145 | 146 | /* timedia_9079a */ { 1, { { 2, 3 }, } }, |
| 146 | 147 | /* timedia_9079b */ { 1, { { 2, 3 }, } }, |
| 147 | 148 | /* timedia_9079c */ { 1, { { 2, 3 }, } }, |
| 149 | + /* wch_ch353_2s1p*/ { 1, { { 2, -1}, } }, | |
| 148 | 150 | }; |
| 149 | 151 | |
| 150 | 152 | static struct pci_device_id parport_serial_pci_tbl[] = { |
| @@ -243,7 +245,8 @@ static struct pci_device_id parport_serial_pci_tbl[] = { · 92 unmodified lines | ||
| 243 | 245 | { 0x1409, 0x7168, 0x1409, 0xb079, 0, 0, timedia_9079a }, |
| 244 | 246 | { 0x1409, 0x7168, 0x1409, 0xc079, 0, 0, timedia_9079b }, |
| 245 | 247 | { 0x1409, 0x7168, 0x1409, 0xd079, 0, 0, timedia_9079c }, |
| 246 | − | |
| 248 | + /* WCH CARDS */ | |
| 249 | + { 0x4348, 0x7053, 0x4348, 0x3253, 0, 0, wch_ch353_2s1p}, | |
| 247 | 250 | { 0, } /* terminate list */ |
| 248 | 251 | }; |
| 249 | 252 | MODULE_DEVICE_TABLE(pci,parport_serial_pci_tbl); |
| @@ -460,6 +463,12 @@ static struct pciserial_board pci_parport_serial_boards[] __devinitdata = { · 210 unmodified lines | ||
| 460 | 463 | .base_baud = 921600, |
| 461 | 464 | .uart_offset = 8, |
| 462 | 465 | }, |
| 466 | + [wch_ch353_2s1p] = { | |
| 467 | + .flags = FL_BASE0|FL_BASE_BARS, | |
| 468 | + .num_ports = 2, | |
| 469 | + .base_baud = 115200, | |
| 470 | + .uart_offset = 8, | |
| 471 | + }, | |
| 463 | 472 | }; |
| 464 | 473 | |
| 465 | 474 | struct parport_serial_private { |
| @@ -716,10 +716,17 @@ static int raw3215_probe (struct ccw_device *cdev) · 715 unmodified lines | ||
| 716 | 716 | static void raw3215_remove (struct ccw_device *cdev) |
| 717 | 717 | { |
| 718 | 718 | struct raw3215_info *raw; |
| 719 | + unsigned int line; | |
| 719 | 720 | |
| 720 | 721 | ccw_device_set_offline(cdev); |
| 721 | 722 | raw = dev_get_drvdata(&cdev->dev); |
| 722 | 723 | if (raw) { |
| 724 | + spin_lock(&raw3215_device_lock); | |
| 725 | + for (line = 0; line < NR_3215; line++) | |
| 726 | + if (raw3215[line] == raw) | |
| 727 | + break; | |
| 728 | + raw3215[line] = NULL; | |
| 729 | + spin_unlock(&raw3215_device_lock); | |
| 723 | 730 | dev_set_drvdata(&cdev->dev, NULL); |
| 724 | 731 | raw3215_free_info(raw); |
| 725 | 732 | } |
| @@ -935,6 +942,19 @@ static int __init con3215_init(void) · 209 unmodified lines | ||
| 935 | 942 | console_initcall(con3215_init); |
| 936 | 943 | #endif |
| 937 | 944 | |
| 945 | +static int tty3215_install(struct tty_driver *driver, struct tty_struct *tty) | |
| 946 | +{ | |
| 947 | + struct raw3215_info *raw; | |
| 948 | + | |
| 949 | + raw = raw3215[tty->index]; | |
| 950 | + if (raw == NULL) | |
| 951 | + return -ENODEV; | |
| 952 | + | |
| 953 | + tty->driver_data = raw; | |
| 954 | + | |
| 955 | + return tty_port_install(&raw->port, driver, tty); | |
| 956 | +} | |
| 957 | + | |
| 938 | 958 | /* |
| 939 | 959 | * tty3215_open |
| 940 | 960 | * |
| @@ -942,14 +962,9 @@ console_initcall(con3215_init); · 1 unmodified line | ||
| 942 | 962 | */ |
| 943 | 963 | static int tty3215_open(struct tty_struct *tty, struct file * filp) |
| 944 | 964 | { |
| 945 | − struct raw3215_info *raw; | |
| 965 | + struct raw3215_info *raw = tty->driver_data; | |
| 946 | 966 | int retval; |
| 947 | 967 | |
| 948 | − raw = raw3215[tty->index]; | |
| 949 | − if (raw == NULL) | |
| 950 | − return -ENODEV; | |
| 951 | − | |
| 952 | − tty->driver_data = raw; | |
| 953 | 968 | tty_port_tty_set(&raw->port, tty); |
| 954 | 969 | |
| 955 | 970 | tty->low_latency = 0; /* don't use bottom half for pushing chars */ |
| @@ -1110,6 +1125,7 @@ static void tty3215_start(struct tty_struct *tty) · 154 unmodified lines | ||
| 1110 | 1125 | } |
| 1111 | 1126 | |
| 1112 | 1127 | static const struct tty_operations tty3215_ops = { |
| 1128 | + .install = tty3215_install, | |
| 1113 | 1129 | .open = tty3215_open, |
| 1114 | 1130 | .close = tty3215_close, |
| 1115 | 1131 | .write = tty3215_write, |
| @@ -567,6 +567,7 @@ sclp_tty_init(void) · 566 unmodified lines | ||
| 567 | 567 | driver->init_termios.c_lflag = ISIG | ECHO; |
| 568 | 568 | driver->flags = TTY_DRIVER_REAL_RAW; |
| 569 | 569 | tty_set_operations(driver, &sclp_ops); |
| 570 | + tty_port_link_device(&sclp_port, driver, 0); | |
| 570 | 571 | rc = tty_register_driver(driver); |
| 571 | 572 | if (rc) { |
| 572 | 573 | put_tty_driver(driver); |
| @@ -691,6 +691,7 @@ static int __init sclp_vt220_tty_init(void) · 690 unmodified lines | ||
| 691 | 691 | driver->init_termios = tty_std_termios; |
| 692 | 692 | driver->flags = TTY_DRIVER_REAL_RAW; |
| 693 | 693 | tty_set_operations(driver, &sclp_vt220_ops); |
| 694 | + tty_port_link_device(&sclp_vt220_port, driver, 0); | |
| 694 | 695 | |
| 695 | 696 | rc = tty_register_driver(driver); |
| 696 | 697 | if (rc) |
| @@ -842,17 +842,14 @@ static struct raw3270_fn tty3270_fn = { · 841 unmodified lines | ||
| 842 | 842 | }; |
| 843 | 843 | |
| 844 | 844 | /* |
| 845 | − * This routine is called whenever a 3270 tty is opened. | |
| 845 | + * This routine is called whenever a 3270 tty is opened first time. | |
| 846 | 846 | */ |
| 847 | −static int | |
| 848 | −tty3270_open(struct tty_struct *tty, struct file * filp) | |
| 847 | +static int tty3270_install(struct tty_driver *driver, struct tty_struct *tty) | |
| 849 | 848 | { |
| 850 | 849 | struct raw3270_view *view; |
| 851 | 850 | struct tty3270 *tp; |
| 852 | 851 | int i, rc; |
| 853 | 852 | |
| 854 | − if (tty->count > 1) | |
| 855 | − return 0; | |
| 856 | 853 | /* Check if the tty3270 is already there. */ |
| 857 | 854 | view = raw3270_find_view(&tty3270_fn, |
| 858 | 855 | tty->index + RAW3270_FIRSTMINOR); |
| @@ -865,7 +862,7 @@ tty3270_open(struct tty_struct *tty, struct file * filp) · 6 unmodified lines | ||
| 865 | 862 | /* why to reassign? */ |
| 866 | 863 | tty_port_tty_set(&tp->port, tty); |
| 867 | 864 | tp->inattr = TF_INPUT; |
| 868 | − return 0; | |
| 865 | + return tty_port_install(&tp->port, driver, tty); | |
| 869 | 866 | } |
| 870 | 867 | if (tty3270_max_index < tty->index + 1) |
| 871 | 868 | tty3270_max_index = tty->index + 1; |
| @@ -895,7 +892,6 @@ tty3270_open(struct tty_struct *tty, struct file * filp) · 23 unmodified lines | ||
| 895 | 892 | |
| 896 | 893 | tty_port_tty_set(&tp->port, tty); |
| 897 | 894 | tty->low_latency = 0; |
| 898 | − tty->driver_data = tp; | |
| 899 | 895 | tty->winsize.ws_row = tp->view.rows - 2; |
| 900 | 896 | tty->winsize.ws_col = tp->view.cols; |
| 901 | 897 | |
| @@ -915,6 +911,15 @@ tty3270_open(struct tty_struct *tty, struct file * filp) · 13 unmodified lines | ||
| 915 | 911 | kbd_ascebc(tp->kbd, tp->view.ascebc); |
| 916 | 912 | |
| 917 | 913 | raw3270_activate_view(&tp->view); |
| 914 | + | |
| 915 | + rc = tty_port_install(&tp->port, driver, tty); | |
| 916 | + if (rc) { | |
| 917 | + raw3270_put_view(&tp->view); | |
| 918 | + return rc; | |
| 919 | + } | |
| 920 | + | |
| 921 | + tty->driver_data = tp; | |
| 922 | + | |
| 918 | 923 | return 0; |
| 919 | 924 | } |
| 920 | 925 | |
| @@ -932,10 +937,17 @@ tty3270_close(struct tty_struct *tty, struct file * filp) · 11 unmodified lines | ||
| 932 | 937 | if (tp) { |
| 933 | 938 | tty->driver_data = NULL; |
| 934 | 939 | tty_port_tty_set(&tp->port, NULL); |
| 935 | − raw3270_put_view(&tp->view); | |
| 936 | 940 | } |
| 937 | 941 | } |
| 938 | 942 | |
| 943 | +static void tty3270_cleanup(struct tty_struct *tty) | |
| 944 | +{ | |
| 945 | + struct tty3270 *tp = tty->driver_data; | |
| 946 | + | |
| 947 | + if (tp) | |
| 948 | + raw3270_put_view(&tp->view); | |
| 949 | +} | |
| 950 | + | |
| 939 | 951 | /* |
| 940 | 952 | * We always have room. |
| 941 | 953 | */ |
| @@ -1737,7 +1749,8 @@ static long tty3270_compat_ioctl(struct tty_struct *tty, · 795 unmodified lines | ||
| 1737 | 1749 | #endif |
| 1738 | 1750 | |
| 1739 | 1751 | static const struct tty_operations tty3270_ops = { |
| 1740 | − .open = tty3270_open, | |
| 1752 | + .install = tty3270_install, | |
| 1753 | + .cleanup = tty3270_cleanup, | |
| 1741 | 1754 | .close = tty3270_close, |
| 1742 | 1755 | .write = tty3270_write, |
| 1743 | 1756 | .put_char = tty3270_put_char, |
| @@ -1781,7 +1794,7 @@ static int __init tty3270_init(void) · 37 unmodified lines | ||
| 1781 | 1794 | driver->type = TTY_DRIVER_TYPE_SYSTEM; |
| 1782 | 1795 | driver->subtype = SYSTEM_TYPE_TTY; |
| 1783 | 1796 | driver->init_termios = tty_std_termios; |
| 1784 | − driver->flags = TTY_DRIVER_RESET_TERMIOS | TTY_DRIVER_DYNAMIC_DEV; | |
| 1797 | + driver->flags = TTY_DRIVER_RESET_TERMIOS; | |
| 1785 | 1798 | tty_set_operations(driver, &tty3270_ops); |
| 1786 | 1799 | ret = tty_register_driver(driver); |
| 1787 | 1800 | if (ret) { |
| @@ -1800,6 +1813,7 @@ tty3270_exit(void) · 12 unmodified lines | ||
| 1800 | 1813 | driver = tty3270_driver; |
| 1801 | 1814 | tty3270_driver = NULL; |
| 1802 | 1815 | tty_unregister_driver(driver); |
| 1816 | + put_tty_driver(driver); | |
| 1803 | 1817 | tty3270_del_views(); |
| 1804 | 1818 | } |
| 1805 | 1819 | |
| @@ -502,7 +502,7 @@ static int ipoctal_inst_slot(struct ipoctal *ipoctal, unsigned int bus_nr, · 501 unmodified lines | ||
| 502 | 502 | ipoctal->pointer_read[i] = 0; |
| 503 | 503 | ipoctal->pointer_write[i] = 0; |
| 504 | 504 | ipoctal->nb_bytes[i] = 0; |
| 505 | − tty_register_device(tty, i, NULL); | |
| 505 | + tty_port_register_device(&ipoctal->tty_port[i], tty, i, NULL); | |
| 506 | 506 | |
| 507 | 507 | /* |
| 508 | 508 | * Enable again the RX. TX will be enabled when |
| @@ -617,7 +617,7 @@ static void ipoctal_set_termios(struct tty_struct *tty, · 108 unmodified lines | ||
| 617 | 617 | struct ipoctal *ipoctal = tty->driver_data; |
| 618 | 618 | speed_t baud; |
| 619 | 619 | |
| 620 | − cflag = tty->termios->c_cflag; | |
| 620 | + cflag = tty->termios.c_cflag; | |
| 621 | 621 | |
| 622 | 622 | /* Disable and reset everything before change the setup */ |
| 623 | 623 | ipoctal_write_io_reg(ipoctal, &ipoctal->chan_regs[channel].u.w.cr, |
| @@ -643,7 +643,7 @@ static void ipoctal_set_termios(struct tty_struct *tty, · 19 unmodified lines | ||
| 643 | 643 | default: |
| 644 | 644 | mr1 |= MR1_CHRL_8_BITS; |
| 645 | 645 | /* By default, select CS8 */ |
| 646 | − tty->termios->c_cflag = (cflag & ~CSIZE) | CS8; | |
| 646 | + tty->termios.c_cflag = (cflag & ~CSIZE) | CS8; | |
| 647 | 647 | break; |
| 648 | 648 | } |
| 649 | 649 | |
| @@ -657,7 +657,7 @@ static void ipoctal_set_termios(struct tty_struct *tty, · 7 unmodified lines | ||
| 657 | 657 | mr1 |= MR1_PARITY_OFF; |
| 658 | 658 | |
| 659 | 659 | /* Mark or space parity is not supported */ |
| 660 | − tty->termios->c_cflag &= ~CMSPAR; | |
| 660 | + tty->termios.c_cflag &= ~CMSPAR; | |
| 661 | 661 | |
| 662 | 662 | /* Set stop bits */ |
| 663 | 663 | if (cflag & CSTOPB) |
| @@ -690,10 +690,10 @@ static void ipoctal_set_termios(struct tty_struct *tty, · 26 unmodified lines | ||
| 690 | 690 | } |
| 691 | 691 | |
| 692 | 692 | baud = tty_get_baud_rate(tty); |
| 693 | − tty_termios_encode_baud_rate(tty->termios, baud, baud); | |
| 693 | + tty_termios_encode_baud_rate(&tty->termios, baud, baud); | |
| 694 | 694 | |
| 695 | 695 | /* Set baud rate */ |
| 696 | − switch (tty->termios->c_ospeed) { | |
| 696 | + switch (baud) { | |
| 697 | 697 | case 75: |
| 698 | 698 | csr |= TX_CLK_75 | RX_CLK_75; |
| 699 | 699 | break; |
| @@ -734,7 +734,7 @@ static void ipoctal_set_termios(struct tty_struct *tty, · 34 unmodified lines | ||
| 734 | 734 | default: |
| 735 | 735 | csr |= TX_CLK_38400 | RX_CLK_38400; |
| 736 | 736 | /* In case of default, we establish 38400 bps */ |
| 737 | − tty_termios_encode_baud_rate(tty->termios, 38400, 38400); | |
| 737 | + tty_termios_encode_baud_rate(&tty->termios, 38400, 38400); | |
| 738 | 738 | break; |
| 739 | 739 | } |
| 740 | 740 | |
| @@ -315,10 +315,8 @@ static void qt_read_bulk_callback(struct urb *urb) · 314 unmodified lines | ||
| 315 | 315 | } |
| 316 | 316 | |
| 317 | 317 | tty = tty_port_tty_get(&port->port); |
| 318 | − if (!tty) { | |
| 319 | − dbg("%s - bad tty pointer - exiting", __func__); | |
| 318 | + if (!tty) | |
| 320 | 319 | return; |
| 321 | − } | |
| 322 | 320 | |
| 323 | 321 | data = urb->transfer_buffer; |
| 324 | 322 | |
| @@ -364,7 +362,7 @@ static void qt_read_bulk_callback(struct urb *urb) · 39 unmodified lines | ||
| 364 | 362 | goto exit; |
| 365 | 363 | } |
| 366 | 364 | |
| 367 | − if (tty && RxCount) { | |
| 365 | + if (RxCount) { | |
| 368 | 366 | flag_data = 0; |
| 369 | 367 | for (i = 0; i < RxCount; ++i) { |
| 370 | 368 | /* Look ahead code here */ |
| @@ -428,7 +426,7 @@ static void qt_read_bulk_callback(struct urb *urb) · 57 unmodified lines | ||
| 428 | 426 | dbg("%s - failed resubmitting read urb, error %d", |
| 429 | 427 | __func__, result); |
| 430 | 428 | else { |
| 431 | − if (tty && RxCount) { | |
| 429 | + if (RxCount) { | |
| 432 | 430 | tty_flip_buffer_push(tty); |
| 433 | 431 | tty_schedule_flip(tty); |
| 434 | 432 | } |
| @@ -897,8 +895,6 @@ static int qt_open(struct tty_struct *tty, · 462 unmodified lines | ||
| 897 | 895 | * Put this here to make it responsive to stty and defaults set by |
| 898 | 896 | * the tty layer |
| 899 | 897 | */ |
| 900 | − /* FIXME: is this needed? */ | |
| 901 | − /* qt_set_termios(tty, port, NULL); */ | |
| 902 | 898 | |
| 903 | 899 | /* Check to see if we've set up our endpoint info yet */ |
| 904 | 900 | if (port0->open_ports == 1) { |
| @@ -1195,7 +1191,7 @@ static void qt_set_termios(struct tty_struct *tty, · 290 unmodified lines | ||
| 1195 | 1191 | struct usb_serial_port *port, |
| 1196 | 1192 | struct ktermios *old_termios) |
| 1197 | 1193 | { |
| 1198 | − struct ktermios *termios = tty->termios; | |
| 1194 | + struct ktermios *termios = &tty->termios; | |
| 1199 | 1195 | unsigned char new_LCR = 0; |
| 1200 | 1196 | unsigned int cflag = termios->c_cflag; |
| 1201 | 1197 | unsigned int index; |
| @@ -1204,7 +1200,7 @@ static void qt_set_termios(struct tty_struct *tty, · 2 unmodified lines | ||
| 1204 | 1200 | |
| 1205 | 1201 | index = tty->index - port->serial->minor; |
| 1206 | 1202 | |
| 1207 | − switch (cflag) { | |
| 1203 | + switch (cflag & CSIZE) { | |
| 1208 | 1204 | case CS5: |
| 1209 | 1205 | new_LCR |= SERIAL_5_DATA; |
| 1210 | 1206 | break; |
| @@ -1215,6 +1211,8 @@ static void qt_set_termios(struct tty_struct *tty, · 4 unmodified lines | ||
| 1215 | 1211 | new_LCR |= SERIAL_7_DATA; |
| 1216 | 1212 | break; |
| 1217 | 1213 | default: |
| 1214 | + termios->c_cflag &= ~CSIZE; | |
| 1215 | + termios->c_cflag |= CS8; | |
| 1218 | 1216 | case CS8: |
| 1219 | 1217 | new_LCR |= SERIAL_8_DATA; |
| 1220 | 1218 | break; |
| @@ -1301,7 +1299,7 @@ static void qt_set_termios(struct tty_struct *tty, · 80 unmodified lines | ||
| 1301 | 1299 | dbg(__FILE__ "BoxSetSW_FlowCtrl (diabling) failed\n"); |
| 1302 | 1300 | |
| 1303 | 1301 | } |
| 1304 | − tty->termios->c_cflag &= ~CMSPAR; | |
| 1302 | + termios->c_cflag &= ~CMSPAR; | |
| 1305 | 1303 | /* FIXME: Error cases should be returning the actual bits changed only */ |
| 1306 | 1304 | } |
| 1307 | 1305 | |
| @@ -1,8 +1,7 @@ | ||
| 1 | 1 | #ifndef _SPEAKUP_SERIAL_H |
| 2 | 2 | #define _SPEAKUP_SERIAL_H |
| 3 | 3 | |
| 4 | −#include <linux/serial.h> /* for rs_table, serial constants & | |
| 5 | − serial_uart_config */ | |
| 4 | +#include <linux/serial.h> /* for rs_table, serial constants */ | |
| 6 | 5 | #include <linux/serial_reg.h> /* for more serial constants */ |
| 7 | 6 | #ifndef __sparc__ |
| 8 | 7 | #include <asm/serial.h> |
| @@ -420,7 +420,7 @@ static void check_modem_status(struct serial_state *info) · 419 unmodified lines | ||
| 420 | 420 | tty_hangup(port->tty); |
| 421 | 421 | } |
| 422 | 422 | } |
| 423 | − if (port->flags & ASYNC_CTS_FLOW) { | |
| 423 | + if (tty_port_cts_enabled(port)) { | |
| 424 | 424 | if (port->tty->hw_stopped) { |
| 425 | 425 | if (!(status & SER_CTS)) { |
| 426 | 426 | #if (defined(SERIAL_DEBUG_INTR) || defined(SERIAL_DEBUG_FLOW)) |
| @@ -646,7 +646,7 @@ static void shutdown(struct tty_struct *tty, struct serial_state *info) · 219 unmodified lines | ||
| 646 | 646 | custom.adkcon = AC_UARTBRK; |
| 647 | 647 | mb(); |
| 648 | 648 | |
| 649 | − if (tty->termios->c_cflag & HUPCL) | |
| 649 | + if (tty->termios.c_cflag & HUPCL) | |
| 650 | 650 | info->MCR &= ~(SER_DTR|SER_RTS); |
| 651 | 651 | rtsdtr_ctrl(info->MCR); |
| 652 | 652 | |
| @@ -670,7 +670,7 @@ static void change_speed(struct tty_struct *tty, struct serial_state *info, · 17 unmodified lines | ||
| 670 | 670 | int bits; |
| 671 | 671 | unsigned long flags; |
| 672 | 672 | |
| 673 | − cflag = tty->termios->c_cflag; | |
| 673 | + cflag = tty->termios.c_cflag; | |
| 674 | 674 | |
| 675 | 675 | /* Byte size is always 8 bits plus parity bit if requested */ |
| 676 | 676 | |
| @@ -707,8 +707,8 @@ static void change_speed(struct tty_struct *tty, struct serial_state *info, · 30 unmodified lines | ||
| 707 | 707 | /* If the quotient is zero refuse the change */ |
| 708 | 708 | if (!quot && old_termios) { |
| 709 | 709 | /* FIXME: Will need updating for new tty in the end */ |
| 710 | − tty->termios->c_cflag &= ~CBAUD; | |
| 711 | − tty->termios->c_cflag |= (old_termios->c_cflag & CBAUD); | |
| 710 | + tty->termios.c_cflag &= ~CBAUD; | |
| 711 | + tty->termios.c_cflag |= (old_termios->c_cflag & CBAUD); | |
| 712 | 712 | baud = tty_get_baud_rate(tty); |
| 713 | 713 | if (!baud) |
| 714 | 714 | baud = 9600; |
| @@ -984,7 +984,7 @@ static void rs_throttle(struct tty_struct * tty) · 269 unmodified lines | ||
| 984 | 984 | if (I_IXOFF(tty)) |
| 985 | 985 | rs_send_xchar(tty, STOP_CHAR(tty)); |
| 986 | 986 | |
| 987 | − if (tty->termios->c_cflag & CRTSCTS) | |
| 987 | + if (tty->termios.c_cflag & CRTSCTS) | |
| 988 | 988 | info->MCR &= ~SER_RTS; |
| 989 | 989 | |
| 990 | 990 | local_irq_save(flags); |
| @@ -1012,7 +1012,7 @@ static void rs_unthrottle(struct tty_struct * tty) · 21 unmodified lines | ||
| 1012 | 1012 | else |
| 1013 | 1013 | rs_send_xchar(tty, START_CHAR(tty)); |
| 1014 | 1014 | } |
| 1015 | − if (tty->termios->c_cflag & CRTSCTS) | |
| 1015 | + if (tty->termios.c_cflag & CRTSCTS) | |
| 1016 | 1016 | info->MCR |= SER_RTS; |
| 1017 | 1017 | local_irq_save(flags); |
| 1018 | 1018 | rtsdtr_ctrl(info->MCR); |
| @@ -1033,7 +1033,7 @@ static int get_serial_info(struct tty_struct *tty, struct serial_state *state, · 14 unmodified lines | ||
| 1033 | 1033 | if (!retinfo) |
| 1034 | 1034 | return -EFAULT; |
| 1035 | 1035 | memset(&tmp, 0, sizeof(tmp)); |
| 1036 | − tty_lock(); | |
| 1036 | + tty_lock(tty); | |
| 1037 | 1037 | tmp.line = tty->index; |
| 1038 | 1038 | tmp.port = state->port; |
| 1039 | 1039 | tmp.flags = state->tport.flags; |
| @@ -1042,7 +1042,7 @@ static int get_serial_info(struct tty_struct *tty, struct serial_state *state, · 2 unmodified lines | ||
| 1042 | 1042 | tmp.close_delay = state->tport.close_delay; |
| 1043 | 1043 | tmp.closing_wait = state->tport.closing_wait; |
| 1044 | 1044 | tmp.custom_divisor = state->custom_divisor; |
| 1045 | − tty_unlock(); | |
| 1045 | + tty_unlock(tty); | |
| 1046 | 1046 | if (copy_to_user(retinfo,&tmp,sizeof(*retinfo))) |
| 1047 | 1047 | return -EFAULT; |
| 1048 | 1048 | return 0; |
| @@ -1059,12 +1059,12 @@ static int set_serial_info(struct tty_struct *tty, struct serial_state *state, · 10 unmodified lines | ||
| 1059 | 1059 | if (copy_from_user(&new_serial,new_info,sizeof(new_serial))) |
| 1060 | 1060 | return -EFAULT; |
| 1061 | 1061 | |
| 1062 | − tty_lock(); | |
| 1062 | + tty_lock(tty); | |
| 1063 | 1063 | change_spd = ((new_serial.flags ^ port->flags) & ASYNC_SPD_MASK) || |
| 1064 | 1064 | new_serial.custom_divisor != state->custom_divisor; |
| 1065 | 1065 | if (new_serial.irq || new_serial.port != state->port || |
| 1066 | 1066 | new_serial.xmit_fifo_size != state->xmit_fifo_size) { |
| 1067 | − tty_unlock(); | |
| 1067 | + tty_unlock(tty); | |
| 1068 | 1068 | return -EINVAL; |
| 1069 | 1069 | } |
| 1070 | 1070 | |
| @@ -1074,7 +1074,7 @@ static int set_serial_info(struct tty_struct *tty, struct serial_state *state, · 3 unmodified lines | ||
| 1074 | 1074 | (new_serial.xmit_fifo_size != state->xmit_fifo_size) || |
| 1075 | 1075 | ((new_serial.flags & ~ASYNC_USR_MASK) != |
| 1076 | 1076 | (port->flags & ~ASYNC_USR_MASK))) { |
| 1077 | − tty_unlock(); | |
| 1077 | + tty_unlock(tty); | |
| 1078 | 1078 | return -EPERM; |
| 1079 | 1079 | } |
| 1080 | 1080 | port->flags = ((port->flags & ~ASYNC_USR_MASK) | |
| @@ -1084,7 +1084,7 @@ static int set_serial_info(struct tty_struct *tty, struct serial_state *state, · 3 unmodified lines | ||
| 1084 | 1084 | } |
| 1085 | 1085 | |
| 1086 | 1086 | if (new_serial.baud_base < 9600) { |
| 1087 | − tty_unlock(); | |
| 1087 | + tty_unlock(tty); | |
| 1088 | 1088 | return -EINVAL; |
| 1089 | 1089 | } |
| 1090 | 1090 | |
| @@ -1116,7 +1116,7 @@ check_and_exit: · 25 unmodified lines | ||
| 1116 | 1116 | } |
| 1117 | 1117 | } else |
| 1118 | 1118 | retval = startup(tty, state); |
| 1119 | − tty_unlock(); | |
| 1119 | + tty_unlock(tty); | |
| 1120 | 1120 | return retval; |
| 1121 | 1121 | } |
| 1122 | 1122 | |
| @@ -1330,7 +1330,7 @@ static void rs_set_termios(struct tty_struct *tty, struct ktermios *old_termios) · 207 unmodified lines | ||
| 1330 | 1330 | { |
| 1331 | 1331 | struct serial_state *info = tty->driver_data; |
| 1332 | 1332 | unsigned long flags; |
| 1333 | − unsigned int cflag = tty->termios->c_cflag; | |
| 1333 | + unsigned int cflag = tty->termios.c_cflag; | |
| 1334 | 1334 | |
| 1335 | 1335 | change_speed(tty, info, old_termios); |
| 1336 | 1336 | |
| @@ -1347,7 +1347,7 @@ static void rs_set_termios(struct tty_struct *tty, struct ktermios *old_termios) · 10 unmodified lines | ||
| 1347 | 1347 | if (!(old_termios->c_cflag & CBAUD) && |
| 1348 | 1348 | (cflag & CBAUD)) { |
| 1349 | 1349 | info->MCR |= SER_DTR; |
| 1350 | − if (!(tty->termios->c_cflag & CRTSCTS) || | |
| 1350 | + if (!(tty->termios.c_cflag & CRTSCTS) || | |
| 1351 | 1351 | !test_bit(TTY_THROTTLED, &tty->flags)) { |
| 1352 | 1352 | info->MCR |= SER_RTS; |
| 1353 | 1353 | } |
| @@ -1358,7 +1358,7 @@ static void rs_set_termios(struct tty_struct *tty, struct ktermios *old_termios) · 4 unmodified lines | ||
| 1358 | 1358 | |
| 1359 | 1359 | /* Handle turning off CRTSCTS */ |
| 1360 | 1360 | if ((old_termios->c_cflag & CRTSCTS) && |
| 1361 | − !(tty->termios->c_cflag & CRTSCTS)) { | |
| 1361 | + !(tty->termios.c_cflag & CRTSCTS)) { | |
| 1362 | 1362 | tty->hw_stopped = 0; |
| 1363 | 1363 | rs_start(tty); |
| 1364 | 1364 | } |
| @@ -1371,7 +1371,7 @@ static void rs_set_termios(struct tty_struct *tty, struct ktermios *old_termios) · 6 unmodified lines | ||
| 1371 | 1371 | * or not. Hence, this may change..... |
| 1372 | 1372 | */ |
| 1373 | 1373 | if (!(old_termios->c_cflag & CLOCAL) && |
| 1374 | − (tty->termios->c_cflag & CLOCAL)) | |
| 1374 | + (tty->termios.c_cflag & CLOCAL)) | |
| 1375 | 1375 | wake_up_interruptible(&info->open_wait); |
| 1376 | 1376 | #endif |
| 1377 | 1377 | } |
| @@ -1710,10 +1710,6 @@ static int __init amiga_serial_probe(struct platform_device *pdev) · 332 unmodified lines | ||
| 1710 | 1710 | serial_driver->flags = TTY_DRIVER_REAL_RAW; |
| 1711 | 1711 | tty_set_operations(serial_driver, &serial_ops); |
| 1712 | 1712 | |
| 1713 | − error = tty_register_driver(serial_driver); | |
| 1714 | − if (error) | |
| 1715 | − goto fail_put_tty_driver; | |
| 1716 | − | |
| 1717 | 1713 | state = rs_table; |
| 1718 | 1714 | state->port = (int)&custom.serdatr; /* Just to give it a value */ |
| 1719 | 1715 | state->custom_divisor = 0; |
| @@ -1724,6 +1720,11 @@ static int __init amiga_serial_probe(struct platform_device *pdev) · 4 unmodified lines | ||
| 1724 | 1720 | state->icount.overrun = state->icount.brk = 0; |
| 1725 | 1721 | tty_port_init(&state->tport); |
| 1726 | 1722 | state->tport.ops = &amiga_port_ops; |
| 1723 | + tty_port_link_device(&state->tport, serial_driver, 0); | |
| 1724 | + | |
| 1725 | + error = tty_register_driver(serial_driver); | |
| 1726 | + if (error) | |
| 1727 | + goto fail_put_tty_driver; | |
| 1727 | 1728 | |
| 1728 | 1729 | printk(KERN_INFO "ttyS0 is the amiga builtin serial port\n"); |
| 1729 | 1730 | |
| @@ -263,6 +263,7 @@ static int __init bfin_jc_init(void) · 262 unmodified lines | ||
| 263 | 263 | bfin_jc_driver->subtype = SERIAL_TYPE_NORMAL; |
| 264 | 264 | bfin_jc_driver->init_termios = tty_std_termios; |
| 265 | 265 | tty_set_operations(bfin_jc_driver, &bfin_jc_ops); |
| 266 | + tty_port_link_device(&port, bfin_jc_driver, 0); | |
| 266 | 267 | |
| 267 | 268 | ret = tty_register_driver(bfin_jc_driver); |
| 268 | 269 | if (ret) |
| @@ -727,7 +727,7 @@ static void cyy_chip_modem(struct cyclades_card *cinfo, int chip, · 726 unmodified lines | ||
| 727 | 727 | else |
| 728 | 728 | tty_hangup(tty); |
| 729 | 729 | } |
| 730 | − if ((mdm_change & CyCTS) && (info->port.flags & ASYNC_CTS_FLOW)) { | |
| 730 | + if ((mdm_change & CyCTS) && tty_port_cts_enabled(&info->port)) { | |
| 731 | 731 | if (tty->hw_stopped) { |
| 732 | 732 | if (mdm_status & CyCTS) { |
| 733 | 733 | /* cy_start isn't used |
| @@ -1459,7 +1459,7 @@ static void cy_shutdown(struct cyclades_port *info, struct tty_struct *tty) · 725 unmodified lines | ||
| 1459 | 1459 | info->port.xmit_buf = NULL; |
| 1460 | 1460 | free_page((unsigned long)temp); |
| 1461 | 1461 | } |
| 1462 | − if (tty->termios->c_cflag & HUPCL) | |
| 1462 | + if (tty->termios.c_cflag & HUPCL) | |
| 1463 | 1463 | cyy_change_rts_dtr(info, 0, TIOCM_RTS | TIOCM_DTR); |
| 1464 | 1464 | |
| 1465 | 1465 | cyy_issue_cmd(info, CyCHAN_CTL | CyDIS_RCVR); |
| @@ -1488,7 +1488,7 @@ static void cy_shutdown(struct cyclades_port *info, struct tty_struct *tty) · 22 unmodified lines | ||
| 1488 | 1488 | free_page((unsigned long)temp); |
| 1489 | 1489 | } |
| 1490 | 1490 | |
| 1491 | − if (tty->termios->c_cflag & HUPCL) | |
| 1491 | + if (tty->termios.c_cflag & HUPCL) | |
| 1492 | 1492 | tty_port_lower_dtr_rts(&info->port); |
| 1493 | 1493 | |
| 1494 | 1494 | set_bit(TTY_IO_ERROR, &tty->flags); |
| @@ -1599,7 +1599,7 @@ static int cy_open(struct tty_struct *tty, struct file *filp) · 104 unmodified lines | ||
| 1599 | 1599 | * If the port is the middle of closing, bail out now |
| 1600 | 1600 | */ |
| 1601 | 1601 | if (tty_hung_up_p(filp) || (info->port.flags & ASYNC_CLOSING)) { |
| 1602 | − wait_event_interruptible_tty(info->port.close_wait, | |
| 1602 | + wait_event_interruptible_tty(tty, info->port.close_wait, | |
| 1603 | 1603 | !(info->port.flags & ASYNC_CLOSING)); |
| 1604 | 1604 | return (info->port.flags & ASYNC_HUP_NOTIFY) ? -EAGAIN: -ERESTARTSYS; |
| 1605 | 1605 | } |
| @@ -1999,14 +1999,11 @@ static void cy_set_line_char(struct cyclades_port *info, struct tty_struct *tty) · 393 unmodified lines | ||
| 1999 | 1999 | int baud, baud_rate = 0; |
| 2000 | 2000 | int i; |
| 2001 | 2001 | |
| 2002 | − if (!tty->termios) /* XXX can this happen at all? */ | |
| 2003 | − return; | |
| 2004 | − | |
| 2005 | 2002 | if (info->line == -1) |
| 2006 | 2003 | return; |
| 2007 | 2004 | |
| 2008 | − cflag = tty->termios->c_cflag; | |
| 2009 | − iflag = tty->termios->c_iflag; | |
| 2005 | + cflag = tty->termios.c_cflag; | |
| 2006 | + iflag = tty->termios.c_iflag; | |
| 2010 | 2007 | |
| 2011 | 2008 | /* |
| 2012 | 2009 | * Set up the tty->alt_speed kludge |
| @@ -2825,7 +2822,7 @@ static void cy_set_termios(struct tty_struct *tty, struct ktermios *old_termios) · 812 unmodified lines | ||
| 2825 | 2822 | cy_set_line_char(info, tty); |
| 2826 | 2823 | |
| 2827 | 2824 | if ((old_termios->c_cflag & CRTSCTS) && |
| 2828 | − !(tty->termios->c_cflag & CRTSCTS)) { | |
| 2825 | + !(tty->termios.c_cflag & CRTSCTS)) { | |
| 2829 | 2826 | tty->hw_stopped = 0; |
| 2830 | 2827 | cy_start(tty); |
| 2831 | 2828 | } |
| @@ -2837,7 +2834,7 @@ static void cy_set_termios(struct tty_struct *tty, struct ktermios *old_termios) · 5 unmodified lines | ||
| 2837 | 2834 | * or not. Hence, this may change..... |
| 2838 | 2835 | */ |
| 2839 | 2836 | if (!(old_termios->c_cflag & CLOCAL) && |
| 2840 | − (tty->termios->c_cflag & CLOCAL)) | |
| 2837 | + (tty->termios.c_cflag & CLOCAL)) | |
| 2841 | 2838 | wake_up_interruptible(&info->port.open_wait); |
| 2842 | 2839 | #endif |
| 2843 | 2840 | } /* cy_set_termios */ |
| @@ -2899,7 +2896,7 @@ static void cy_throttle(struct tty_struct *tty) · 55 unmodified lines | ||
| 2899 | 2896 | info->throttle = 1; |
| 2900 | 2897 | } |
| 2901 | 2898 | |
| 2902 | − if (tty->termios->c_cflag & CRTSCTS) { | |
| 2899 | + if (tty->termios.c_cflag & CRTSCTS) { | |
| 2903 | 2900 | if (!cy_is_Z(card)) { |
| 2904 | 2901 | spin_lock_irqsave(&card->card_lock, flags); |
| 2905 | 2902 | cyy_change_rts_dtr(info, 0, TIOCM_RTS); |
| @@ -2938,7 +2935,7 @@ static void cy_unthrottle(struct tty_struct *tty) · 32 unmodified lines | ||
| 2938 | 2935 | cy_send_xchar(tty, START_CHAR(tty)); |
| 2939 | 2936 | } |
| 2940 | 2937 | |
| 2941 | − if (tty->termios->c_cflag & CRTSCTS) { | |
| 2938 | + if (tty->termios.c_cflag & CRTSCTS) { | |
| 2942 | 2939 | card = info->card; |
| 2943 | 2940 | if (!cy_is_Z(card)) { |
| 2944 | 2941 | spin_lock_irqsave(&card->card_lock, flags); |
| @@ -3289,9 +3286,10 @@ static unsigned short __devinit cyy_init_card(void __iomem *true_base_addr, · 344 unmodified lines | ||
| 3289 | 3286 | static int __init cy_detect_isa(void) |
| 3290 | 3287 | { |
| 3291 | 3288 | #ifdef CONFIG_ISA |
| 3289 | + struct cyclades_card *card; | |
| 3292 | 3290 | unsigned short cy_isa_irq, nboard; |
| 3293 | 3291 | void __iomem *cy_isa_address; |
| 3294 | − unsigned short i, j, cy_isa_nchan; | |
| 3292 | + unsigned short i, j, k, cy_isa_nchan; | |
| 3295 | 3293 | int isparam = 0; |
| 3296 | 3294 | |
| 3297 | 3295 | nboard = 0; |
| @@ -3349,7 +3347,8 @@ static int __init cy_detect_isa(void) · 51 unmodified lines | ||
| 3349 | 3347 | } |
| 3350 | 3348 | /* fill the next cy_card structure available */ |
| 3351 | 3349 | for (j = 0; j < NR_CARDS; j++) { |
| 3352 | − if (cy_card[j].base_addr == NULL) | |
| 3350 | + card = &cy_card[j]; | |
| 3351 | + if (card->base_addr == NULL) | |
| 3353 | 3352 | break; |
| 3354 | 3353 | } |
| 3355 | 3354 | if (j == NR_CARDS) { /* no more cy_cards available */ |
| @@ -3363,7 +3362,7 @@ static int __init cy_detect_isa(void) · 7 unmodified lines | ||
| 3363 | 3362 | |
| 3364 | 3363 | /* allocate IRQ */ |
| 3365 | 3364 | if (request_irq(cy_isa_irq, cyy_interrupt, |
| 3366 | − 0, "Cyclom-Y", &cy_card[j])) { | |
| 3365 | + 0, "Cyclom-Y", card)) { | |
| 3367 | 3366 | printk(KERN_ERR "Cyclom-Y/ISA found at 0x%lx, but " |
| 3368 | 3367 | "could not allocate IRQ#%d.\n", |
| 3369 | 3368 | (unsigned long)cy_isa_address, cy_isa_irq); |
| @@ -3372,16 +3371,16 @@ static int __init cy_detect_isa(void) · 2 unmodified lines | ||
| 3372 | 3371 | } |
| 3373 | 3372 | |
| 3374 | 3373 | /* set cy_card */ |
| 3375 | − cy_card[j].base_addr = cy_isa_address; | |
| 3376 | − cy_card[j].ctl_addr.p9050 = NULL; | |
| 3377 | − cy_card[j].irq = (int)cy_isa_irq; | |
| 3378 | − cy_card[j].bus_index = 0; | |
| 3379 | − cy_card[j].first_line = cy_next_channel; | |
| 3380 | − cy_card[j].num_chips = cy_isa_nchan / CyPORTS_PER_CHIP; | |
| 3381 | − cy_card[j].nports = cy_isa_nchan; | |
| 3382 | − if (cy_init_card(&cy_card[j])) { | |
| 3383 | − cy_card[j].base_addr = NULL; | |
| 3384 | − free_irq(cy_isa_irq, &cy_card[j]); | |
| 3374 | + card->base_addr = cy_isa_address; | |
| 3375 | + card->ctl_addr.p9050 = NULL; | |
| 3376 | + card->irq = (int)cy_isa_irq; | |
| 3377 | + card->bus_index = 0; | |
| 3378 | + card->first_line = cy_next_channel; | |
| 3379 | + card->num_chips = cy_isa_nchan / CyPORTS_PER_CHIP; | |
| 3380 | + card->nports = cy_isa_nchan; | |
| 3381 | + if (cy_init_card(card)) { | |
| 3382 | + card->base_addr = NULL; | |
| 3383 | + free_irq(cy_isa_irq, card); | |
| 3385 | 3384 | iounmap(cy_isa_address); |
| 3386 | 3385 | continue; |
| 3387 | 3386 | } |
| @@ -3393,9 +3392,10 @@ static int __init cy_detect_isa(void) · 5 unmodified lines | ||
| 3393 | 3392 | (unsigned long)(cy_isa_address + (CyISA_Ywin - 1)), |
| 3394 | 3393 | cy_isa_irq, cy_isa_nchan, cy_next_channel); |
| 3395 | 3394 | |
| 3396 | − for (j = cy_next_channel; | |
| 3397 | − j < cy_next_channel + cy_isa_nchan; j++) | |
| 3398 | − tty_register_device(cy_serial_driver, j, NULL); | |
| 3395 | + for (k = 0, j = cy_next_channel; | |
| 3396 | + j < cy_next_channel + cy_isa_nchan; j++, k++) | |
| 3397 | + tty_port_register_device(&card->ports[k].port, | |
| 3398 | + cy_serial_driver, j, NULL); | |
| 3399 | 3399 | cy_next_channel += cy_isa_nchan; |
| 3400 | 3400 | } |
| 3401 | 3401 | return nboard; |
| @@ -3695,10 +3695,11 @@ err: · 293 unmodified lines | ||
| 3695 | 3695 | static int __devinit cy_pci_probe(struct pci_dev *pdev, |
| 3696 | 3696 | const struct pci_device_id *ent) |
| 3697 | 3697 | { |
| 3698 | + struct cyclades_card *card; | |
| 3698 | 3699 | void __iomem *addr0 = NULL, *addr2 = NULL; |
| 3699 | 3700 | char *card_name = NULL; |
| 3700 | 3701 | u32 uninitialized_var(mailbox); |
| 3701 | − unsigned int device_id, nchan = 0, card_no, i; | |
| 3702 | + unsigned int device_id, nchan = 0, card_no, i, j; | |
| 3702 | 3703 | unsigned char plx_ver; |
| 3703 | 3704 | int retval, irq; |
| 3704 | 3705 | |
| @@ -3829,7 +3830,8 @@ static int __devinit cy_pci_probe(struct pci_dev *pdev, · 124 unmodified lines | ||
| 3829 | 3830 | } |
| 3830 | 3831 | /* fill the next cy_card structure available */ |
| 3831 | 3832 | for (card_no = 0; card_no < NR_CARDS; card_no++) { |
| 3832 | − if (cy_card[card_no].base_addr == NULL) | |
| 3833 | + card = &cy_card[card_no]; | |
| 3834 | + if (card->base_addr == NULL) | |
| 3833 | 3835 | break; |
| 3834 | 3836 | } |
| 3835 | 3837 | if (card_no == NR_CARDS) { /* no more cy_cards available */ |
| @@ -3843,27 +3845,26 @@ static int __devinit cy_pci_probe(struct pci_dev *pdev, · 7 unmodified lines | ||
| 3843 | 3845 | device_id == PCI_DEVICE_ID_CYCLOM_Y_Hi) { |
| 3844 | 3846 | /* allocate IRQ */ |
| 3845 | 3847 | retval = request_irq(irq, cyy_interrupt, |
| 3846 | − IRQF_SHARED, "Cyclom-Y", &cy_card[card_no]); | |
| 3848 | + IRQF_SHARED, "Cyclom-Y", card); | |
| 3847 | 3849 | if (retval) { |
| 3848 | 3850 | dev_err(&pdev->dev, "could not allocate IRQ\n"); |
| 3849 | 3851 | goto err_unmap; |
| 3850 | 3852 | } |
| 3851 | − cy_card[card_no].num_chips = nchan / CyPORTS_PER_CHIP; | |
| 3853 | + card->num_chips = nchan / CyPORTS_PER_CHIP; | |
| 3852 | 3854 | } else { |
| 3853 | 3855 | struct FIRM_ID __iomem *firm_id = addr2 + ID_ADDRESS; |
| 3854 | 3856 | struct ZFW_CTRL __iomem *zfw_ctrl; |
| 3855 | 3857 | |
| 3856 | 3858 | zfw_ctrl = addr2 + (readl(&firm_id->zfwctrl_addr) & 0xfffff); |
| 3857 | 3859 | |
| 3858 | − cy_card[card_no].hw_ver = mailbox; | |
| 3859 | − cy_card[card_no].num_chips = (unsigned int)-1; | |
| 3860 | − cy_card[card_no].board_ctrl = &zfw_ctrl->board_ctrl; | |
| 3860 | + card->hw_ver = mailbox; | |
| 3861 | + card->num_chips = (unsigned int)-1; | |
| 3862 | + card->board_ctrl = &zfw_ctrl->board_ctrl; | |
| 3861 | 3863 | #ifdef CONFIG_CYZ_INTR |
| 3862 | 3864 | /* allocate IRQ only if board has an IRQ */ |
| 3863 | 3865 | if (irq != 0 && irq != 255) { |
| 3864 | 3866 | retval = request_irq(irq, cyz_interrupt, |
| 3865 | − IRQF_SHARED, "Cyclades-Z", | |
| 3866 | − &cy_card[card_no]); | |
| 3867 | + IRQF_SHARED, "Cyclades-Z", card); | |
| 3867 | 3868 | if (retval) { |
| 3868 | 3869 | dev_err(&pdev->dev, "could not allocate IRQ\n"); |
| 3869 | 3870 | goto err_unmap; |
| @@ -3873,17 +3874,17 @@ static int __devinit cy_pci_probe(struct pci_dev *pdev, · 3 unmodified lines | ||
| 3873 | 3874 | } |
| 3874 | 3875 | |
| 3875 | 3876 | /* set cy_card */ |
| 3876 | − cy_card[card_no].base_addr = addr2; | |
| 3877 | − cy_card[card_no].ctl_addr.p9050 = addr0; | |
| 3878 | − cy_card[card_no].irq = irq; | |
| 3879 | − cy_card[card_no].bus_index = 1; | |
| 3880 | − cy_card[card_no].first_line = cy_next_channel; | |
| 3881 | − cy_card[card_no].nports = nchan; | |
| 3882 | − retval = cy_init_card(&cy_card[card_no]); | |
| 3877 | + card->base_addr = addr2; | |
| 3878 | + card->ctl_addr.p9050 = addr0; | |
| 3879 | + card->irq = irq; | |
| 3880 | + card->bus_index = 1; | |
| 3881 | + card->first_line = cy_next_channel; | |
| 3882 | + card->nports = nchan; | |
| 3883 | + retval = cy_init_card(card); | |
| 3883 | 3884 | if (retval) |
| 3884 | 3885 | goto err_null; |
| 3885 | 3886 | |
| 3886 | − pci_set_drvdata(pdev, &cy_card[card_no]); | |
| 3887 | + pci_set_drvdata(pdev, card); | |
| 3887 | 3888 | |
| 3888 | 3889 | if (device_id == PCI_DEVICE_ID_CYCLOM_Y_Lo || |
| 3889 | 3890 | device_id == PCI_DEVICE_ID_CYCLOM_Y_Hi) { |
| @@ -3909,14 +3910,15 @@ static int __devinit cy_pci_probe(struct pci_dev *pdev, · 19 unmodified lines | ||
| 3909 | 3910 | |
| 3910 | 3911 | dev_info(&pdev->dev, "%s/PCI #%d found: %d channels starting from " |
| 3911 | 3912 | "port %d.\n", card_name, card_no + 1, nchan, cy_next_channel); |
| 3912 | − for (i = cy_next_channel; i < cy_next_channel + nchan; i++) | |
| 3913 | − tty_register_device(cy_serial_driver, i, &pdev->dev); | |
| 3913 | + for (j = 0, i = cy_next_channel; i < cy_next_channel + nchan; i++, j++) | |
| 3914 | + tty_port_register_device(&card->ports[j].port, | |
| 3915 | + cy_serial_driver, i, &pdev->dev); | |
| 3914 | 3916 | cy_next_channel += nchan; |
| 3915 | 3917 | |
| 3916 | 3918 | return 0; |
| 3917 | 3919 | err_null: |
| 3918 | − cy_card[card_no].base_addr = NULL; | |
| 3919 | − free_irq(irq, &cy_card[card_no]); | |
| 3920 | + card->base_addr = NULL; | |
| 3921 | + free_irq(irq, card); | |
| 3920 | 3922 | err_unmap: |
| 3921 | 3923 | iounmap(addr0); |
| 3922 | 3924 | if (addr2) |
| @@ -738,16 +738,17 @@ static int __devinit ehv_bc_tty_probe(struct platform_device *pdev) · 737 unmodified lines | ||
| 738 | 738 | goto error; |
| 739 | 739 | } |
| 740 | 740 | |
| 741 | − bc->dev = tty_register_device(ehv_bc_driver, i, &pdev->dev); | |
| 741 | + tty_port_init(&bc->port); | |
| 742 | + bc->port.ops = &ehv_bc_tty_port_ops; | |
| 743 | + | |
| 744 | + bc->dev = tty_port_register_device(&bc->port, ehv_bc_driver, i, | |
| 745 | + &pdev->dev); | |
| 742 | 746 | if (IS_ERR(bc->dev)) { |
| 743 | 747 | ret = PTR_ERR(bc->dev); |
| 744 | 748 | dev_err(&pdev->dev, "could not register tty (ret=%i)\n", ret); |
| 745 | 749 | goto error; |
| 746 | 750 | } |
| 747 | 751 | |
| 748 | − tty_port_init(&bc->port); | |
| 749 | − bc->port.ops = &ehv_bc_tty_port_ops; | |
| 750 | − | |
| 751 | 752 | dev_set_drvdata(&pdev->dev, bc); |
| 752 | 753 | |
| 753 | 754 | dev_info(&pdev->dev, "registered /dev/%s%u for byte channel %u\n", |
| @@ -299,20 +299,33 @@ static void hvc_unthrottle(struct tty_struct *tty) · 298 unmodified lines | ||
| 299 | 299 | hvc_kick(); |
| 300 | 300 | } |
| 301 | 301 | |
| 302 | +static int hvc_install(struct tty_driver *driver, struct tty_struct *tty) | |
| 303 | +{ | |
| 304 | + struct hvc_struct *hp; | |
| 305 | + int rc; | |
| 306 | + | |
| 307 | + /* Auto increments kref reference if found. */ | |
| 308 | + if (!(hp = hvc_get_by_index(tty->index))) | |
| 309 | + return -ENODEV; | |
| 310 | + | |
| 311 | + tty->driver_data = hp; | |
| 312 | + | |
| 313 | + rc = tty_port_install(&hp->port, driver, tty); | |
| 314 | + if (rc) | |
| 315 | + tty_port_put(&hp->port); | |
| 316 | + return rc; | |
| 317 | +} | |
| 318 | + | |
| 302 | 319 | /* |
| 303 | 320 | * The TTY interface won't be used until after the vio layer has exposed the vty |
| 304 | 321 | * adapter to the kernel. |
| 305 | 322 | */ |
| 306 | 323 | static int hvc_open(struct tty_struct *tty, struct file * filp) |
| 307 | 324 | { |
| 308 | − struct hvc_struct *hp; | |
| 325 | + struct hvc_struct *hp = tty->driver_data; | |
| 309 | 326 | unsigned long flags; |
| 310 | 327 | int rc = 0; |
| 311 | 328 | |
| 312 | − /* Auto increments kref reference if found. */ | |
| 313 | − if (!(hp = hvc_get_by_index(tty->index))) | |
| 314 | − return -ENODEV; | |
| 315 | − | |
| 316 | 329 | spin_lock_irqsave(&hp->port.lock, flags); |
| 317 | 330 | /* Check and then increment for fast path open. */ |
| 318 | 331 | if (hp->port.count++ > 0) { |
| @@ -322,7 +335,6 @@ static int hvc_open(struct tty_struct *tty, struct file * filp) · 3 unmodified lines | ||
| 322 | 335 | } /* else count == 0 */ |
| 323 | 336 | spin_unlock_irqrestore(&hp->port.lock, flags); |
| 324 | 337 | |
| 325 | − tty->driver_data = hp; | |
| 326 | 338 | tty_port_tty_set(&hp->port, tty); |
| 327 | 339 | |
| 328 | 340 | if (hp->ops->notifier_add) |
| @@ -389,6 +401,11 @@ static void hvc_close(struct tty_struct *tty, struct file * filp) · 60 unmodified lines | ||
| 389 | 401 | hp->vtermno, hp->port.count); |
| 390 | 402 | spin_unlock_irqrestore(&hp->port.lock, flags); |
| 391 | 403 | } |
| 404 | +} | |
| 405 | + | |
| 406 | +static void hvc_cleanup(struct tty_struct *tty) | |
| 407 | +{ | |
| 408 | + struct hvc_struct *hp = tty->driver_data; | |
| 392 | 409 | |
| 393 | 410 | tty_port_put(&hp->port); |
| 394 | 411 | } |
| @@ -792,8 +809,10 @@ static void hvc_poll_put_char(struct tty_driver *driver, int line, char ch) · 397 unmodified lines | ||
| 792 | 809 | #endif |
| 793 | 810 | |
| 794 | 811 | static const struct tty_operations hvc_ops = { |
| 812 | + .install = hvc_install, | |
| 795 | 813 | .open = hvc_open, |
| 796 | 814 | .close = hvc_close, |
| 815 | + .cleanup = hvc_cleanup, | |
| 797 | 816 | .write = hvc_write, |
| 798 | 817 | .hangup = hvc_hangup, |
| 799 | 818 | .unthrottle = hvc_unthrottle, |
| @@ -1102,27 +1102,20 @@ static struct hvcs_struct *hvcs_get_by_index(int index) · 1101 unmodified lines | ||
| 1102 | 1102 | return NULL; |
| 1103 | 1103 | } |
| 1104 | 1104 | |
| 1105 | −/* | |
| 1106 | − * This is invoked via the tty_open interface when a user app connects to the | |
| 1107 | − * /dev node. | |
| 1108 | − */ | |
| 1109 | −static int hvcs_open(struct tty_struct *tty, struct file *filp) | |
| 1105 | +static int hvcs_install(struct tty_driver *driver, struct tty_struct *tty) | |
| 1110 | 1106 | { |
| 1111 | 1107 | struct hvcs_struct *hvcsd; |
| 1112 | − int rc, retval = 0; | |
| 1113 | − unsigned long flags; | |
| 1114 | − unsigned int irq; | |
| 1115 | 1108 | struct vio_dev *vdev; |
| 1116 | − unsigned long unit_address; | |
| 1117 | − | |
| 1118 | − if (tty->driver_data) | |
| 1119 | − goto fast_open; | |
| 1109 | + unsigned long unit_address, flags; | |
| 1110 | + unsigned int irq; | |
| 1111 | + int retval; | |
| 1120 | 1112 | |
| 1121 | 1113 | /* |
| 1122 | 1114 | * Is there a vty-server that shares the same index? |
| 1123 | 1115 | * This function increments the kref index. |
| 1124 | 1116 | */ |
| 1125 | − if (!(hvcsd = hvcs_get_by_index(tty->index))) { | |
| 1117 | + hvcsd = hvcs_get_by_index(tty->index); | |
| 1118 | + if (!hvcsd) { | |
| 1126 | 1119 | printk(KERN_WARNING "HVCS: open failed, no device associated" |
| 1127 | 1120 | " with tty->index %d.\n", tty->index); |
| 1128 | 1121 | return -ENODEV; |
| @@ -1130,11 +1123,16 @@ static int hvcs_open(struct tty_struct *tty, struct file *filp) · 1 unmodified line | ||
| 1130 | 1123 | |
| 1131 | 1124 | spin_lock_irqsave(&hvcsd->lock, flags); |
| 1132 | 1125 | |
| 1133 | − if (hvcsd->connected == 0) | |
| 1134 | − if ((retval = hvcs_partner_connect(hvcsd))) | |
| 1135 | − goto error_release; | |
| 1126 | + if (hvcsd->connected == 0) { | |
| 1127 | + retval = hvcs_partner_connect(hvcsd); | |
| 1128 | + if (retval) { | |
| 1129 | + spin_unlock_irqrestore(&hvcsd->lock, flags); | |
| 1130 | + printk(KERN_WARNING "HVCS: partner connect failed.\n"); | |
| 1131 | + goto err_put; | |
| 1132 | + } | |
| 1133 | + } | |
| 1136 | 1134 | |
| 1137 | − hvcsd->port.count = 1; | |
| 1135 | + hvcsd->port.count = 0; | |
| 1138 | 1136 | hvcsd->port.tty = tty; |
| 1139 | 1137 | tty->driver_data = hvcsd; |
| 1140 | 1138 | |
| @@ -1155,37 +1153,48 @@ static int hvcs_open(struct tty_struct *tty, struct file *filp) · 14 unmodified lines | ||
| 1155 | 1153 | * This must be done outside of the spinlock because it requests irqs |
| 1156 | 1154 | * and will grab the spinlock and free the connection if it fails. |
| 1157 | 1155 | */ |
| 1158 | − if (((rc = hvcs_enable_device(hvcsd, unit_address, irq, vdev)))) { | |
| 1159 | − tty_port_put(&hvcsd->port); | |
| 1156 | + retval = hvcs_enable_device(hvcsd, unit_address, irq, vdev); | |
| 1157 | + if (retval) { | |
| 1160 | 1158 | printk(KERN_WARNING "HVCS: enable device failed.\n"); |
| 1161 | − return rc; | |
| 1159 | + goto err_put; | |
| 1162 | 1160 | } |
| 1163 | 1161 | |
| 1164 | − goto open_success; | |
| 1162 | + retval = tty_port_install(&hvcsd->port, driver, tty); | |
| 1163 | + if (retval) | |
| 1164 | + goto err_irq; | |
| 1165 | 1165 | |
| 1166 | −fast_open: | |
| 1167 | − hvcsd = tty->driver_data; | |
| 1166 | + return 0; | |
| 1167 | +err_irq: | |
| 1168 | + spin_lock_irqsave(&hvcsd->lock, flags); | |
| 1169 | + vio_disable_interrupts(hvcsd->vdev); | |
| 1170 | + spin_unlock_irqrestore(&hvcsd->lock, flags); | |
| 1171 | + free_irq(irq, hvcsd); | |
| 1172 | +err_put: | |
| 1173 | + tty_port_put(&hvcsd->port); | |
| 1174 | + | |
| 1175 | + return retval; | |
| 1176 | +} | |
| 1177 | + | |
| 1178 | +/* | |
| 1179 | + * This is invoked via the tty_open interface when a user app connects to the | |
| 1180 | + * /dev node. | |
| 1181 | + */ | |
| 1182 | +static int hvcs_open(struct tty_struct *tty, struct file *filp) | |
| 1183 | +{ | |
| 1184 | + struct hvcs_struct *hvcsd = tty->driver_data; | |
| 1185 | + unsigned long flags; | |
| 1168 | 1186 | |
| 1169 | 1187 | spin_lock_irqsave(&hvcsd->lock, flags); |
| 1170 | − tty_port_get(&hvcsd->port); | |
| 1171 | 1188 | hvcsd->port.count++; |
| 1172 | 1189 | hvcsd->todo_mask |= HVCS_SCHED_READ; |
| 1173 | 1190 | spin_unlock_irqrestore(&hvcsd->lock, flags); |
| 1174 | 1191 | |
| 1175 | −open_success: | |
| 1176 | 1192 | hvcs_kick(); |
| 1177 | 1193 | |
| 1178 | 1194 | printk(KERN_INFO "HVCS: vty-server@%X connection opened.\n", |
| 1179 | 1195 | hvcsd->vdev->unit_address ); |
| 1180 | 1196 | |
| 1181 | 1197 | return 0; |
| 1182 | − | |
| 1183 | −error_release: | |
| 1184 | − spin_unlock_irqrestore(&hvcsd->lock, flags); | |
| 1185 | − tty_port_put(&hvcsd->port); | |
| 1186 | − | |
| 1187 | − printk(KERN_WARNING "HVCS: partner connect failed.\n"); | |
| 1188 | − return retval; | |
| 1189 | 1198 | } |
| 1190 | 1199 | |
| 1191 | 1200 | static void hvcs_close(struct tty_struct *tty, struct file *filp) |
| @@ -1236,7 +1245,6 @@ static void hvcs_close(struct tty_struct *tty, struct file *filp) · 44 unmodified lines | ||
| 1236 | 1245 | tty->driver_data = NULL; |
| 1237 | 1246 | |
| 1238 | 1247 | free_irq(irq, hvcsd); |
| 1239 | − tty_port_put(&hvcsd->port); | |
| 1240 | 1248 | return; |
| 1241 | 1249 | } else if (hvcsd->port.count < 0) { |
| 1242 | 1250 | printk(KERN_ERR "HVCS: vty-server@%X open_count: %d" |
| @@ -1245,6 +1253,12 @@ static void hvcs_close(struct tty_struct *tty, struct file *filp) · 2 unmodified lines | ||
| 1245 | 1253 | } |
| 1246 | 1254 | |
| 1247 | 1255 | spin_unlock_irqrestore(&hvcsd->lock, flags); |
| 1256 | +} | |
| 1257 | + | |
| 1258 | +static void hvcs_cleanup(struct tty_struct * tty) | |
| 1259 | +{ | |
| 1260 | + struct hvcs_struct *hvcsd = tty->driver_data; | |
| 1261 | + | |
| 1248 | 1262 | tty_port_put(&hvcsd->port); |
| 1249 | 1263 | } |
| 1250 | 1264 | |
| @@ -1431,8 +1445,10 @@ static int hvcs_chars_in_buffer(struct tty_struct *tty) · 180 unmodified lines | ||
| 1431 | 1445 | } |
| 1432 | 1446 | |
| 1433 | 1447 | static const struct tty_operations hvcs_ops = { |
| 1448 | + .install = hvcs_install, | |
| 1434 | 1449 | .open = hvcs_open, |
| 1435 | 1450 | .close = hvcs_close, |
| 1451 | + .cleanup = hvcs_cleanup, | |
| 1436 | 1452 | .hangup = hvcs_hangup, |
| 1437 | 1453 | .write = hvcs_write, |
| 1438 | 1454 | .write_room = hvcs_write_room, |
| @@ -1080,6 +1080,8 @@ static int __init hvsi_init(void) · 1079 unmodified lines | ||
| 1080 | 1080 | struct hvsi_struct *hp = &hvsi_ports[i]; |
| 1081 | 1081 | int ret = 1; |
| 1082 | 1082 | |
| 1083 | + tty_port_link_device(&hp->port, hvsi_driver, i); | |
| 1084 | + | |
| 1083 | 1085 | ret = request_irq(hp->virq, hvsi_interrupt, 0, "hvsi", hp); |
| 1084 | 1086 | if (ret) |
| 1085 | 1087 | printk(KERN_ERR "HVSI: couldn't reserve irq 0x%x (error %i)\n", |
| @@ -400,7 +400,7 @@ void hvsilib_close(struct hvsi_priv *pv, struct hvc_struct *hp) · 399 unmodified lines | ||
| 400 | 400 | spin_unlock_irqrestore(&hp->lock, flags); |
| 401 | 401 | |
| 402 | 402 | /* Clear our own DTR */ |
| 403 | − if (!pv->tty || (pv->tty->termios->c_cflag & HUPCL)) | |
| 403 | + if (!pv->tty || (pv->tty->termios.c_cflag & HUPCL)) | |
| 404 | 404 | hvsilib_write_mctrl(pv, 0); |
| 405 | 405 | |
| 406 | 406 | /* Tear down the connection */ |
| @@ -476,7 +476,7 @@ static int add_tty(int j, · 475 unmodified lines | ||
| 476 | 476 | mutex_init(&ttys[j]->ipw_tty_mutex); |
| 477 | 477 | tty_port_init(&ttys[j]->port); |
| 478 | 478 | |
| 479 | − tty_register_device(ipw_tty_driver, j, NULL); | |
| 479 | + tty_port_register_device(&ttys[j]->port, ipw_tty_driver, j, NULL); | |
| 480 | 480 | ipwireless_associate_network_tty(network, channel_idx, ttys[j]); |
| 481 | 481 | |
| 482 | 482 | if (secondary_channel_idx != -1) |
| @@ -600,7 +600,7 @@ static irqreturn_t isicom_interrupt(int irq, void *dev_id) · 599 unmodified lines | ||
| 600 | 600 | port->status &= ~ISI_DCD; |
| 601 | 601 | } |
| 602 | 602 | |
| 603 | − if (port->port.flags & ASYNC_CTS_FLOW) { | |
| 603 | + if (tty_port_cts_enabled(&port->port)) { | |
| 604 | 604 | if (tty->hw_stopped) { |
| 605 | 605 | if (header & ISI_CTS) { |
| 606 | 606 | port->port.tty->hw_stopped = 0; |
| @@ -702,7 +702,7 @@ static void isicom_config_port(struct tty_struct *tty) · 95 unmodified lines | ||
| 702 | 702 | |
| 703 | 703 | /* 1,2,3,4 => 57.6, 115.2, 230, 460 kbps resp. */ |
| 704 | 704 | if (baud < 1 || baud > 4) |
| 705 | − tty->termios->c_cflag &= ~CBAUDEX; | |
| 705 | + tty->termios.c_cflag &= ~CBAUDEX; | |
| 706 | 706 | else |
| 707 | 707 | baud += 15; |
| 708 | 708 | } |
| @@ -1196,8 +1196,8 @@ static void isicom_set_termios(struct tty_struct *tty, · 487 unmodified lines | ||
| 1196 | 1196 | if (isicom_paranoia_check(port, tty->name, "isicom_set_termios")) |
| 1197 | 1197 | return; |
| 1198 | 1198 | |
| 1199 | − if (tty->termios->c_cflag == old_termios->c_cflag && | |
| 1200 | − tty->termios->c_iflag == old_termios->c_iflag) | |
| 1199 | + if (tty->termios.c_cflag == old_termios->c_cflag && | |
| 1200 | + tty->termios.c_iflag == old_termios->c_iflag) | |
| 1201 | 1201 | return; |
| 1202 | 1202 | |
| 1203 | 1203 | spin_lock_irqsave(&port->card->card_lock, flags); |
| @@ -1205,7 +1205,7 @@ static void isicom_set_termios(struct tty_struct *tty, · 1 unmodified line | ||
| 1205 | 1205 | spin_unlock_irqrestore(&port->card->card_lock, flags); |
| 1206 | 1206 | |
| 1207 | 1207 | if ((old_termios->c_cflag & CRTSCTS) && |
| 1208 | − !(tty->termios->c_cflag & CRTSCTS)) { | |
| 1208 | + !(tty->termios.c_cflag & CRTSCTS)) { | |
| 1209 | 1209 | tty->hw_stopped = 0; |
| 1210 | 1210 | isicom_start(tty); |
| 1211 | 1211 | } |
| @@ -1611,7 +1611,8 @@ static int __devinit isicom_probe(struct pci_dev *pdev, · 399 unmodified lines | ||
| 1611 | 1611 | goto errunri; |
| 1612 | 1612 | |
| 1613 | 1613 | for (index = 0; index < board->port_count; index++) |
| 1614 | − tty_register_device(isicom_normal, board->index * 16 + index, | |
| 1614 | + tty_port_register_device(&board->ports[index].port, | |
| 1615 | + isicom_normal, board->index * 16 + index, | |
| 1615 | 1616 | &pdev->dev); |
| 1616 | 1617 | |
| 1617 | 1618 | return 0; |
| @@ -169,6 +169,7 @@ static DEFINE_SPINLOCK(moxa_lock); · 168 unmodified lines | ||
| 169 | 169 | static unsigned long baseaddr[MAX_BOARDS]; |
| 170 | 170 | static unsigned int type[MAX_BOARDS]; |
| 171 | 171 | static unsigned int numports[MAX_BOARDS]; |
| 172 | +static struct tty_port moxa_service_port; | |
| 172 | 173 | |
| 173 | 174 | MODULE_AUTHOR("William Chen"); |
| 174 | 175 | MODULE_DESCRIPTION("MOXA Intellio Family Multiport Board Device Driver"); |
| @@ -367,10 +368,10 @@ static int moxa_ioctl(struct tty_struct *tty, · 192 unmodified lines | ||
| 367 | 368 | tmp.dcd = 1; |
| 368 | 369 | |
| 369 | 370 | ttyp = tty_port_tty_get(&p->port); |
| 370 | − if (!ttyp || !ttyp->termios) | |
| 371 | + if (!ttyp) | |
| 371 | 372 | tmp.cflag = p->cflag; |
| 372 | 373 | else |
| 373 | − tmp.cflag = ttyp->termios->c_cflag; | |
| 374 | + tmp.cflag = ttyp->termios.c_cflag; | |
| 374 | 375 | tty_kref_put(ttyp); |
| 375 | 376 | copy: |
| 376 | 377 | if (copy_to_user(argm, &tmp, sizeof(tmp))) |
| @@ -834,7 +835,7 @@ static int moxa_init_board(struct moxa_board_conf *brd, struct device *dev) · 457 unmodified lines | ||
| 834 | 835 | const struct firmware *fw; |
| 835 | 836 | const char *file; |
| 836 | 837 | struct moxa_port *p; |
| 837 | − unsigned int i; | |
| 838 | + unsigned int i, first_idx; | |
| 838 | 839 | int ret; |
| 839 | 840 | |
| 840 | 841 | brd->ports = kcalloc(MAX_PORTS_PER_BOARD, sizeof(*brd->ports), |
| @@ -887,6 +888,11 @@ static int moxa_init_board(struct moxa_board_conf *brd, struct device *dev) · 46 unmodified lines | ||
| 887 | 888 | mod_timer(&moxaTimer, jiffies + HZ / 50); |
| 888 | 889 | spin_unlock_bh(&moxa_lock); |
| 889 | 890 | |
| 891 | + first_idx = (brd - moxa_boards) * MAX_PORTS_PER_BOARD; | |
| 892 | + for (i = 0; i < brd->numPorts; i++) | |
| 893 | + tty_port_register_device(&brd->ports[i].port, moxaDriver, | |
| 894 | + first_idx + i, dev); | |
| 895 | + | |
| 890 | 896 | return 0; |
| 891 | 897 | err_free: |
| 892 | 898 | kfree(brd->ports); |
| @@ -896,7 +902,7 @@ err: · 3 unmodified lines | ||
| 896 | 902 | |
| 897 | 903 | static void moxa_board_deinit(struct moxa_board_conf *brd) |
| 898 | 904 | { |
| 899 | − unsigned int a, opened; | |
| 905 | + unsigned int a, opened, first_idx; | |
| 900 | 906 | |
| 901 | 907 | mutex_lock(&moxa_openlock); |
| 902 | 908 | spin_lock_bh(&moxa_lock); |
| @@ -925,6 +931,10 @@ static void moxa_board_deinit(struct moxa_board_conf *brd) · 22 unmodified lines | ||
| 925 | 931 | mutex_lock(&moxa_openlock); |
| 926 | 932 | } |
| 927 | 933 | |
| 934 | + first_idx = (brd - moxa_boards) * MAX_PORTS_PER_BOARD; | |
| 935 | + for (a = 0; a < brd->numPorts; a++) | |
| 936 | + tty_unregister_device(moxaDriver, first_idx + a); | |
| 937 | + | |
| 928 | 938 | iounmap(brd->basemem); |
| 929 | 939 | brd->basemem = NULL; |
| 930 | 940 | kfree(brd->ports); |
| @@ -967,6 +977,7 @@ static int __devinit moxa_pci_probe(struct pci_dev *pdev, · 36 unmodified lines | ||
| 967 | 977 | board->basemem = ioremap_nocache(pci_resource_start(pdev, 2), 0x4000); |
| 968 | 978 | if (board->basemem == NULL) { |
| 969 | 979 | dev_err(&pdev->dev, "can't remap io space 2\n"); |
| 980 | + retval = -ENOMEM; | |
| 970 | 981 | goto err_reg; |
| 971 | 982 | } |
| 972 | 983 | |
| @@ -1031,9 +1042,14 @@ static int __init moxa_init(void) · 58 unmodified lines | ||
| 1031 | 1042 | |
| 1032 | 1043 | printk(KERN_INFO "MOXA Intellio family driver version %s\n", |
| 1033 | 1044 | MOXA_VERSION); |
| 1034 | − moxaDriver = alloc_tty_driver(MAX_PORTS + 1); | |
| 1035 | − if (!moxaDriver) | |
| 1036 | − return -ENOMEM; | |
| 1045 | + | |
| 1046 | + tty_port_init(&moxa_service_port); | |
| 1047 | + | |
| 1048 | + moxaDriver = tty_alloc_driver(MAX_PORTS + 1, | |
| 1049 | + TTY_DRIVER_REAL_RAW | | |
| 1050 | + TTY_DRIVER_DYNAMIC_DEV); | |
| 1051 | + if (IS_ERR(moxaDriver)) | |
| 1052 | + return PTR_ERR(moxaDriver); | |
| 1037 | 1053 | |
| 1038 | 1054 | moxaDriver->name = "ttyMX"; |
| 1039 | 1055 | moxaDriver->major = ttymajor; |
| @@ -1044,8 +1060,9 @@ static int __init moxa_init(void) · 4 unmodified lines | ||
| 1044 | 1060 | moxaDriver->init_termios.c_cflag = B9600 | CS8 | CREAD | CLOCAL | HUPCL; |
| 1045 | 1061 | moxaDriver->init_termios.c_ispeed = 9600; |
| 1046 | 1062 | moxaDriver->init_termios.c_ospeed = 9600; |
| 1047 | − moxaDriver->flags = TTY_DRIVER_REAL_RAW; | |
| 1048 | 1063 | tty_set_operations(moxaDriver, &moxa_ops); |
| 1064 | + /* Having one more port only for ioctls is ugly */ | |
| 1065 | + tty_port_link_device(&moxa_service_port, moxaDriver, MAX_PORTS); | |
| 1049 | 1066 | |
| 1050 | 1067 | if (tty_register_driver(moxaDriver)) { |
| 1051 | 1068 | printk(KERN_ERR "can't register MOXA Smartio tty driver!\n"); |
| @@ -1178,7 +1195,7 @@ static int moxa_open(struct tty_struct *tty, struct file *filp) · 126 unmodified lines | ||
| 1178 | 1195 | mutex_lock(&ch->port.mutex); |
| 1179 | 1196 | if (!(ch->port.flags & ASYNC_INITIALIZED)) { |
| 1180 | 1197 | ch->statusflags = 0; |
| 1181 | − moxa_set_tty_param(tty, tty->termios); | |
| 1198 | + moxa_set_tty_param(tty, &tty->termios); | |
| 1182 | 1199 | MoxaPortLineCtrl(ch, 1, 1); |
| 1183 | 1200 | MoxaPortEnable(ch); |
| 1184 | 1201 | MoxaSetFifo(ch, ch->type == PORT_16550A); |
| @@ -1193,7 +1210,7 @@ static int moxa_open(struct tty_struct *tty, struct file *filp) · 8 unmodified lines | ||
| 1193 | 1210 | static void moxa_close(struct tty_struct *tty, struct file *filp) |
| 1194 | 1211 | { |
| 1195 | 1212 | struct moxa_port *ch = tty->driver_data; |
| 1196 | − ch->cflag = tty->termios->c_cflag; | |
| 1213 | + ch->cflag = tty->termios.c_cflag; | |
| 1197 | 1214 | tty_port_close(&ch->port, tty, filp); |
| 1198 | 1215 | } |
| 1199 | 1216 | |
| @@ -1464,7 +1481,7 @@ static void moxa_poll(unsigned long ignored) · 264 unmodified lines | ||
| 1464 | 1481 | |
| 1465 | 1482 | static void moxa_set_tty_param(struct tty_struct *tty, struct ktermios *old_termios) |
| 1466 | 1483 | { |
| 1467 | − register struct ktermios *ts = tty->termios; | |
| 1484 | + register struct ktermios *ts = &tty->termios; | |
| 1468 | 1485 | struct moxa_port *ch = tty->driver_data; |
| 1469 | 1486 | int rts, cts, txflow, rxflow, xany, baud; |
| 1470 | 1487 | |
| @@ -643,7 +643,7 @@ static int mxser_change_speed(struct tty_struct *tty, · 642 unmodified lines | ||
| 643 | 643 | int ret = 0; |
| 644 | 644 | unsigned char status; |
| 645 | 645 | |
| 646 | − cflag = tty->termios->c_cflag; | |
| 646 | + cflag = tty->termios.c_cflag; | |
| 647 | 647 | if (!info->ioaddr) |
| 648 | 648 | return ret; |
| 649 | 649 | |
| @@ -830,7 +830,7 @@ static void mxser_check_modem_status(struct tty_struct *tty, · 180 unmodified lines | ||
| 830 | 830 | wake_up_interruptible(&port->port.open_wait); |
| 831 | 831 | } |
| 832 | 832 | |
| 833 | − if (port->port.flags & ASYNC_CTS_FLOW) { | |
| 833 | + if (tty_port_cts_enabled(&port->port)) { | |
| 834 | 834 | if (tty->hw_stopped) { |
| 835 | 835 | if (status & UART_MSR_CTS) { |
| 836 | 836 | tty->hw_stopped = 0; |
| @@ -1520,10 +1520,10 @@ static int mxser_ioctl_special(unsigned int cmd, void __user *argp) · 683 unmodified lines | ||
| 1520 | 1520 | |
| 1521 | 1521 | tty = tty_port_tty_get(port); |
| 1522 | 1522 | |
| 1523 | − if (!tty || !tty->termios) | |
| 1523 | + if (!tty) | |
| 1524 | 1524 | ms.cflag = ip->normal_termios.c_cflag; |
| 1525 | 1525 | else |
| 1526 | − ms.cflag = tty->termios->c_cflag; | |
| 1526 | + ms.cflag = tty->termios.c_cflag; | |
| 1527 | 1527 | tty_kref_put(tty); |
| 1528 | 1528 | spin_lock_irq(&ip->slock); |
| 1529 | 1529 | status = inb(ip->ioaddr + UART_MSR); |
| @@ -1589,13 +1589,13 @@ static int mxser_ioctl_special(unsigned int cmd, void __user *argp) · 59 unmodified lines | ||
| 1589 | 1589 | |
| 1590 | 1590 | tty = tty_port_tty_get(&ip->port); |
| 1591 | 1591 | |
| 1592 | − if (!tty || !tty->termios) { | |
| 1592 | + if (!tty) { | |
| 1593 | 1593 | cflag = ip->normal_termios.c_cflag; |
| 1594 | 1594 | iflag = ip->normal_termios.c_iflag; |
| 1595 | 1595 | me->baudrate[p] = tty_termios_baud_rate(&ip->normal_termios); |
| 1596 | 1596 | } else { |
| 1597 | − cflag = tty->termios->c_cflag; | |
| 1598 | − iflag = tty->termios->c_iflag; | |
| 1597 | + cflag = tty->termios.c_cflag; | |
| 1598 | + iflag = tty->termios.c_iflag; | |
| 1599 | 1599 | me->baudrate[p] = tty_get_baud_rate(tty); |
| 1600 | 1600 | } |
| 1601 | 1601 | tty_kref_put(tty); |
| @@ -1853,7 +1853,7 @@ static void mxser_stoprx(struct tty_struct *tty) · 251 unmodified lines | ||
| 1853 | 1853 | } |
| 1854 | 1854 | } |
| 1855 | 1855 | |
| 1856 | − if (tty->termios->c_cflag & CRTSCTS) { | |
| 1856 | + if (tty->termios.c_cflag & CRTSCTS) { | |
| 1857 | 1857 | info->MCR &= ~UART_MCR_RTS; |
| 1858 | 1858 | outb(info->MCR, info->ioaddr + UART_MCR); |
| 1859 | 1859 | } |
| @@ -1890,7 +1890,7 @@ static void mxser_unthrottle(struct tty_struct *tty) · 30 unmodified lines | ||
| 1890 | 1890 | } |
| 1891 | 1891 | } |
| 1892 | 1892 | |
| 1893 | − if (tty->termios->c_cflag & CRTSCTS) { | |
| 1893 | + if (tty->termios.c_cflag & CRTSCTS) { | |
| 1894 | 1894 | info->MCR |= UART_MCR_RTS; |
| 1895 | 1895 | outb(info->MCR, info->ioaddr + UART_MCR); |
| 1896 | 1896 | } |
| @@ -1939,14 +1939,14 @@ static void mxser_set_termios(struct tty_struct *tty, struct ktermios *old_termi · 42 unmodified lines | ||
| 1939 | 1939 | spin_unlock_irqrestore(&info->slock, flags); |
| 1940 | 1940 | |
| 1941 | 1941 | if ((old_termios->c_cflag & CRTSCTS) && |
| 1942 | − !(tty->termios->c_cflag & CRTSCTS)) { | |
| 1942 | + !(tty->termios.c_cflag & CRTSCTS)) { | |
| 1943 | 1943 | tty->hw_stopped = 0; |
| 1944 | 1944 | mxser_start(tty); |
| 1945 | 1945 | } |
| 1946 | 1946 | |
| 1947 | 1947 | /* Handle sw stopped */ |
| 1948 | 1948 | if ((old_termios->c_iflag & IXON) && |
| 1949 | − !(tty->termios->c_iflag & IXON)) { | |
| 1949 | + !(tty->termios.c_iflag & IXON)) { | |
| 1950 | 1950 | tty->stopped = 0; |
| 1951 | 1951 | |
| 1952 | 1952 | if (info->board->chip_flag) { |
| @@ -2337,11 +2337,36 @@ static struct tty_port_operations mxser_port_ops = { · 384 unmodified lines | ||
| 2337 | 2337 | * The MOXA Smartio/Industio serial driver boot-time initialization code! |
| 2338 | 2338 | */ |
| 2339 | 2339 | |
| 2340 | +static bool allow_overlapping_vector; | |
| 2341 | +module_param(allow_overlapping_vector, bool, S_IRUGO); | |
| 2342 | +MODULE_PARM_DESC(allow_overlapping_vector, "whether we allow ISA cards to be configured such that vector overlabs IO ports (default=no)"); | |
| 2343 | + | |
| 2344 | +static bool mxser_overlapping_vector(struct mxser_board *brd) | |
| 2345 | +{ | |
| 2346 | + return allow_overlapping_vector && | |
| 2347 | + brd->vector >= brd->ports[0].ioaddr && | |
| 2348 | + brd->vector < brd->ports[0].ioaddr + 8 * brd->info->nports; | |
| 2349 | +} | |
| 2350 | + | |
| 2351 | +static int mxser_request_vector(struct mxser_board *brd) | |
| 2352 | +{ | |
| 2353 | + if (mxser_overlapping_vector(brd)) | |
| 2354 | + return 0; | |
| 2355 | + return request_region(brd->vector, 1, "mxser(vector)") ? 0 : -EIO; | |
| 2356 | +} | |
| 2357 | + | |
| 2358 | +static void mxser_release_vector(struct mxser_board *brd) | |
| 2359 | +{ | |
| 2360 | + if (mxser_overlapping_vector(brd)) | |
| 2361 | + return; | |
| 2362 | + release_region(brd->vector, 1); | |
| 2363 | +} | |
| 2364 | + | |
| 2340 | 2365 | static void mxser_release_ISA_res(struct mxser_board *brd) |
| 2341 | 2366 | { |
| 2342 | 2367 | free_irq(brd->irq, brd); |
| 2343 | 2368 | release_region(brd->ports[0].ioaddr, 8 * brd->info->nports); |
| 2344 | − release_region(brd->vector, 1); | |
| 2369 | + mxser_release_vector(brd); | |
| 2345 | 2370 | } |
| 2346 | 2371 | |
| 2347 | 2372 | static int __devinit mxser_initbrd(struct mxser_board *brd, |
| @@ -2396,7 +2421,7 @@ static int __devinit mxser_initbrd(struct mxser_board *brd, · 48 unmodified lines | ||
| 2396 | 2421 | |
| 2397 | 2422 | static int __init mxser_get_ISA_conf(int cap, struct mxser_board *brd) |
| 2398 | 2423 | { |
| 2399 | − int id, i, bits; | |
| 2424 | + int id, i, bits, ret; | |
| 2400 | 2425 | unsigned short regs[16], irq; |
| 2401 | 2426 | unsigned char scratch, scratch2; |
| 2402 | 2427 | |
| @@ -2492,13 +2517,15 @@ static int __init mxser_get_ISA_conf(int cap, struct mxser_board *brd) · 89 unmodified lines | ||
| 2492 | 2517 | 8 * brd->info->nports - 1); |
| 2493 | 2518 | return -EIO; |
| 2494 | 2519 | } |
| 2495 | − if (!request_region(brd->vector, 1, "mxser(vector)")) { | |
| 2520 | + | |
| 2521 | + ret = mxser_request_vector(brd); | |
| 2522 | + if (ret) { | |
| 2496 | 2523 | release_region(brd->ports[0].ioaddr, 8 * brd->info->nports); |
| 2497 | 2524 | printk(KERN_ERR "mxser: can't request interrupt vector region: " |
| 2498 | 2525 | "0x%.8lx-0x%.8lx\n", |
| 2499 | 2526 | brd->ports[0].ioaddr, brd->ports[0].ioaddr + |
| 2500 | 2527 | 8 * brd->info->nports - 1); |
| 2501 | − return -EIO; | |
| 2528 | + return ret; | |
| 2502 | 2529 | } |
| 2503 | 2530 | return brd->info->nports; |
| 2504 | 2531 | |
| @@ -2598,7 +2625,8 @@ static int __devinit mxser_probe(struct pci_dev *pdev, · 93 unmodified lines | ||
| 2598 | 2625 | goto err_rel3; |
| 2599 | 2626 | |
| 2600 | 2627 | for (i = 0; i < brd->info->nports; i++) |
| 2601 | − tty_register_device(mxvar_sdriver, brd->idx + i, &pdev->dev); | |
| 2628 | + tty_port_register_device(&brd->ports[i].port, mxvar_sdriver, | |
| 2629 | + brd->idx + i, &pdev->dev); | |
| 2602 | 2630 | |
| 2603 | 2631 | pci_set_drvdata(pdev, brd); |
| 2604 | 2632 | |
| @@ -2695,7 +2723,8 @@ static int __init mxser_module_init(void) · 90 unmodified lines | ||
| 2695 | 2723 | |
| 2696 | 2724 | brd->idx = m * MXSER_PORTS_PER_BOARD; |
| 2697 | 2725 | for (i = 0; i < brd->info->nports; i++) |
| 2698 | − tty_register_device(mxvar_sdriver, brd->idx + i, NULL); | |
| 2726 | + tty_port_register_device(&brd->ports[i].port, | |
| 2727 | + mxvar_sdriver, brd->idx + i, NULL); | |
| 2699 | 2728 | |
| 2700 | 2729 | m++; |
| 2701 | 2730 | } |
| @@ -108,7 +108,7 @@ struct gsm_mux_net { · 107 unmodified lines | ||
| 108 | 108 | */ |
| 109 | 109 | |
| 110 | 110 | struct gsm_msg { |
| 111 | − struct gsm_msg *next; | |
| 111 | + struct list_head list; | |
| 112 | 112 | u8 addr; /* DLCI address + flags */ |
| 113 | 113 | u8 ctrl; /* Control byte + flags */ |
| 114 | 114 | unsigned int len; /* Length of data block (can be zero) */ |
| @@ -245,8 +245,7 @@ struct gsm_mux { · 130 unmodified lines | ||
| 245 | 245 | unsigned int tx_bytes; /* TX data outstanding */ |
| 246 | 246 | #define TX_THRESH_HI 8192 |
| 247 | 247 | #define TX_THRESH_LO 2048 |
| 248 | − struct gsm_msg *tx_head; /* Pending data packets */ | |
| 249 | − struct gsm_msg *tx_tail; | |
| 248 | + struct list_head tx_list; /* Pending data packets */ | |
| 250 | 249 | |
| 251 | 250 | /* Control messages */ |
| 252 | 251 | struct timer_list t2_timer; /* Retransmit timer for commands */ |
| @@ -663,7 +662,7 @@ static struct gsm_msg *gsm_data_alloc(struct gsm_mux *gsm, u8 addr, int len, · 410 unmodified lines | ||
| 663 | 662 | m->len = len; |
| 664 | 663 | m->addr = addr; |
| 665 | 664 | m->ctrl = ctrl; |
| 666 | − m->next = NULL; | |
| 665 | + INIT_LIST_HEAD(&m->list); | |
| 667 | 666 | return m; |
| 668 | 667 | } |
| 669 | 668 | |
| @@ -673,22 +672,21 @@ static struct gsm_msg *gsm_data_alloc(struct gsm_mux *gsm, u8 addr, int len, · 3 unmodified lines | ||
| 673 | 672 | * |
| 674 | 673 | * The tty device has called us to indicate that room has appeared in |
| 675 | 674 | * the transmit queue. Ram more data into the pipe if we have any |
| 675 | + * If we have been flow-stopped by a CMD_FCOFF, then we can only | |
| 676 | + * send messages on DLCI0 until CMD_FCON | |
| 676 | 677 | * |
| 677 | 678 | * FIXME: lock against link layer control transmissions |
| 678 | 679 | */ |
| 679 | 680 | |
| 680 | 681 | static void gsm_data_kick(struct gsm_mux *gsm) |
| 681 | 682 | { |
| 682 | − struct gsm_msg *msg = gsm->tx_head; | |
| 683 | + struct gsm_msg *msg, *nmsg; | |
| 683 | 684 | int len; |
| 684 | 685 | int skip_sof = 0; |
| 685 | 686 | |
| 686 | − /* FIXME: We need to apply this solely to data messages */ | |
| 687 | − if (gsm->constipated) | |
| 688 | − return; | |
| 689 | − | |
| 690 | − while (gsm->tx_head != NULL) { | |
| 691 | − msg = gsm->tx_head; | |
| 687 | + list_for_each_entry_safe(msg, nmsg, &gsm->tx_list, list) { | |
| 688 | + if (gsm->constipated && msg->addr) | |
| 689 | + continue; | |
| 692 | 690 | if (gsm->encoding != 0) { |
| 693 | 691 | gsm->txframe[0] = GSM1_SOF; |
| 694 | 692 | len = gsm_stuff_frame(msg->data, |
| @@ -711,14 +709,13 @@ static void gsm_data_kick(struct gsm_mux *gsm) · 16 unmodified lines | ||
| 711 | 709 | len - skip_sof) < 0) |
| 712 | 710 | break; |
| 713 | 711 | /* FIXME: Can eliminate one SOF in many more cases */ |
| 714 | − gsm->tx_head = msg->next; | |
| 715 | − if (gsm->tx_head == NULL) | |
| 716 | − gsm->tx_tail = NULL; | |
| 717 | 712 | gsm->tx_bytes -= msg->len; |
| 718 | − kfree(msg); | |
| 719 | 713 | /* For a burst of frames skip the extra SOF within the |
| 720 | 714 | burst */ |
| 721 | 715 | skip_sof = 1; |
| 716 | + | |
| 717 | + list_del(&msg->list); | |
| 718 | + kfree(msg); | |
| 722 | 719 | } |
| 723 | 720 | } |
| 724 | 721 | |
| @@ -768,11 +765,7 @@ static void __gsm_data_queue(struct gsm_dlci *dlci, struct gsm_msg *msg) · 43 unmodified lines | ||
| 768 | 765 | msg->data = dp; |
| 769 | 766 | |
| 770 | 767 | /* Add to the actual output queue */ |
| 771 | − if (gsm->tx_tail) | |
| 772 | − gsm->tx_tail->next = msg; | |
| 773 | − else | |
| 774 | − gsm->tx_head = msg; | |
| 775 | − gsm->tx_tail = msg; | |
| 768 | + list_add_tail(&msg->list, &gsm->tx_list); | |
| 776 | 769 | gsm->tx_bytes += msg->len; |
| 777 | 770 | gsm_data_kick(gsm); |
| 778 | 771 | } |
| @@ -875,7 +868,7 @@ static int gsm_dlci_data_output_framed(struct gsm_mux *gsm, · 96 unmodified lines | ||
| 875 | 868 | |
| 876 | 869 | /* dlci->skb is locked by tx_lock */ |
| 877 | 870 | if (dlci->skb == NULL) { |
| 878 | − dlci->skb = skb_dequeue(&dlci->skb_list); | |
| 871 | + dlci->skb = skb_dequeue_tail(&dlci->skb_list); | |
| 879 | 872 | if (dlci->skb == NULL) |
| 880 | 873 | return 0; |
| 881 | 874 | first = 1; |
| @@ -886,7 +879,7 @@ static int gsm_dlci_data_output_framed(struct gsm_mux *gsm, · 4 unmodified lines | ||
| 886 | 879 | if (len > gsm->mtu) { |
| 887 | 880 | if (dlci->adaption == 3) { |
| 888 | 881 | /* Over long frame, bin it */ |
| 889 | − kfree_skb(dlci->skb); | |
| 882 | + dev_kfree_skb_any(dlci->skb); | |
| 890 | 883 | dlci->skb = NULL; |
| 891 | 884 | return 0; |
| 892 | 885 | } |
| @@ -899,8 +892,11 @@ static int gsm_dlci_data_output_framed(struct gsm_mux *gsm, · 6 unmodified lines | ||
| 899 | 892 | |
| 900 | 893 | /* FIXME: need a timer or something to kick this so it can't |
| 901 | 894 | get stuck with no work outstanding and no buffer free */ |
| 902 | − if (msg == NULL) | |
| 895 | + if (msg == NULL) { | |
| 896 | + skb_queue_tail(&dlci->skb_list, dlci->skb); | |
| 897 | + dlci->skb = NULL; | |
| 903 | 898 | return -ENOMEM; |
| 899 | + } | |
| 904 | 900 | dp = msg->data; |
| 905 | 901 | |
| 906 | 902 | if (dlci->adaption == 4) { /* Interruptible framed (Packetised Data) */ |
| @@ -912,7 +908,7 @@ static int gsm_dlci_data_output_framed(struct gsm_mux *gsm, · 5 unmodified lines | ||
| 912 | 908 | skb_pull(dlci->skb, len); |
| 913 | 909 | __gsm_data_queue(dlci, msg); |
| 914 | 910 | if (last) { |
| 915 | − kfree_skb(dlci->skb); | |
| 911 | + dev_kfree_skb_any(dlci->skb); | |
| 916 | 912 | dlci->skb = NULL; |
| 917 | 913 | } |
| 918 | 914 | return size; |
| @@ -971,16 +967,22 @@ static void gsm_dlci_data_sweep(struct gsm_mux *gsm) · 52 unmodified lines | ||
| 971 | 967 | static void gsm_dlci_data_kick(struct gsm_dlci *dlci) |
| 972 | 968 | { |
| 973 | 969 | unsigned long flags; |
| 970 | + int sweep; | |
| 971 | + | |
| 972 | + if (dlci->constipated) | |
| 973 | + return; | |
| 974 | 974 | |
| 975 | 975 | spin_lock_irqsave(&dlci->gsm->tx_lock, flags); |
| 976 | 976 | /* If we have nothing running then we need to fire up */ |
| 977 | + sweep = (dlci->gsm->tx_bytes < TX_THRESH_LO); | |
| 977 | 978 | if (dlci->gsm->tx_bytes == 0) { |
| 978 | 979 | if (dlci->net) |
| 979 | 980 | gsm_dlci_data_output_framed(dlci->gsm, dlci); |
| 980 | 981 | else |
| 981 | 982 | gsm_dlci_data_output(dlci->gsm, dlci); |
| 982 | − } else if (dlci->gsm->tx_bytes < TX_THRESH_LO) | |
| 983 | − gsm_dlci_data_sweep(dlci->gsm); | |
| 983 | + } | |
| 984 | + if (sweep) | |
| 985 | + gsm_dlci_data_sweep(dlci->gsm); | |
| 984 | 986 | spin_unlock_irqrestore(&dlci->gsm->tx_lock, flags); |
| 985 | 987 | } |
| 986 | 988 | |
| @@ -1027,6 +1029,7 @@ static void gsm_process_modem(struct tty_struct *tty, struct gsm_dlci *dlci, · 40 unmodified lines | ||
| 1027 | 1029 | { |
| 1028 | 1030 | int mlines = 0; |
| 1029 | 1031 | u8 brk = 0; |
| 1032 | + int fc; | |
| 1030 | 1033 | |
| 1031 | 1034 | /* The modem status command can either contain one octet (v.24 signals) |
| 1032 | 1035 | or two octets (v.24 signals + break signals). The length field will |
| @@ -1038,19 +1041,21 @@ static void gsm_process_modem(struct tty_struct *tty, struct gsm_dlci *dlci, · 5 unmodified lines | ||
| 1038 | 1041 | else { |
| 1039 | 1042 | brk = modem & 0x7f; |
| 1040 | 1043 | modem = (modem >> 7) & 0x7f; |
| 1041 | − }; | |
| 1044 | + } | |
| 1042 | 1045 | |
| 1043 | 1046 | /* Flow control/ready to communicate */ |
| 1044 | − if (modem & MDM_FC) { | |
| 1047 | + fc = (modem & MDM_FC) || !(modem & MDM_RTR); | |
| 1048 | + if (fc && !dlci->constipated) { | |
| 1045 | 1049 | /* Need to throttle our output on this device */ |
| 1046 | 1050 | dlci->constipated = 1; |
| 1047 | − } | |
| 1048 | − if (modem & MDM_RTC) { | |
| 1049 | − mlines |= TIOCM_DSR | TIOCM_DTR; | |
| 1051 | + } else if (!fc && dlci->constipated) { | |
| 1050 | 1052 | dlci->constipated = 0; |
| 1051 | 1053 | gsm_dlci_data_kick(dlci); |
| 1052 | 1054 | } |
| 1055 | + | |
| 1053 | 1056 | /* Map modem bits */ |
| 1057 | + if (modem & MDM_RTC) | |
| 1058 | + mlines |= TIOCM_DSR | TIOCM_DTR; | |
| 1054 | 1059 | if (modem & MDM_RTR) |
| 1055 | 1060 | mlines |= TIOCM_RTS | TIOCM_CTS; |
| 1056 | 1061 | if (modem & MDM_IC) |
| @@ -1061,7 +1066,7 @@ static void gsm_process_modem(struct tty_struct *tty, struct gsm_dlci *dlci, · 4 unmodified lines | ||
| 1061 | 1066 | /* Carrier drop -> hangup */ |
| 1062 | 1067 | if (tty) { |
| 1063 | 1068 | if ((mlines & TIOCM_CD) == 0 && (dlci->modem_rx & TIOCM_CD)) |
| 1064 | − if (!(tty->termios->c_cflag & CLOCAL)) | |
| 1069 | + if (!(tty->termios.c_cflag & CLOCAL)) | |
| 1065 | 1070 | tty_hangup(tty); |
| 1066 | 1071 | if (brk & 0x01) |
| 1067 | 1072 | tty_insert_flip_char(tty, 0, TTY_BREAK); |
| @@ -1190,6 +1195,8 @@ static void gsm_control_message(struct gsm_mux *gsm, unsigned int command, · 122 unmodified lines | ||
| 1190 | 1195 | u8 *data, int clen) |
| 1191 | 1196 | { |
| 1192 | 1197 | u8 buf[1]; |
| 1198 | + unsigned long flags; | |
| 1199 | + | |
| 1193 | 1200 | switch (command) { |
| 1194 | 1201 | case CMD_CLD: { |
| 1195 | 1202 | struct gsm_dlci *dlci = gsm->dlci[0]; |
| @@ -1206,16 +1213,18 @@ static void gsm_control_message(struct gsm_mux *gsm, unsigned int command, · 10 unmodified lines | ||
| 1206 | 1213 | gsm_control_reply(gsm, CMD_TEST, data, clen); |
| 1207 | 1214 | break; |
| 1208 | 1215 | case CMD_FCON: |
| 1209 | − /* Modem wants us to STFU */ | |
| 1210 | − gsm->constipated = 1; | |
| 1211 | − gsm_control_reply(gsm, CMD_FCON, NULL, 0); | |
| 1212 | − break; | |
| 1213 | − case CMD_FCOFF: | |
| 1214 | 1216 | /* Modem can accept data again */ |
| 1215 | 1217 | gsm->constipated = 0; |
| 1216 | − gsm_control_reply(gsm, CMD_FCOFF, NULL, 0); | |
| 1218 | + gsm_control_reply(gsm, CMD_FCON, NULL, 0); | |
| 1217 | 1219 | /* Kick the link in case it is idling */ |
| 1220 | + spin_lock_irqsave(&gsm->tx_lock, flags); | |
| 1218 | 1221 | gsm_data_kick(gsm); |
| 1222 | + spin_unlock_irqrestore(&gsm->tx_lock, flags); | |
| 1223 | + break; | |
| 1224 | + case CMD_FCOFF: | |
| 1225 | + /* Modem wants us to STFU */ | |
| 1226 | + gsm->constipated = 1; | |
| 1227 | + gsm_control_reply(gsm, CMD_FCOFF, NULL, 0); | |
| 1219 | 1228 | break; |
| 1220 | 1229 | case CMD_MSC: |
| 1221 | 1230 | /* Out of band modem line change indicator for a DLCI */ |
| @@ -1668,7 +1677,7 @@ static void gsm_dlci_free(struct kref *ref) · 446 unmodified lines | ||
| 1668 | 1677 | dlci->gsm->dlci[dlci->addr] = NULL; |
| 1669 | 1678 | kfifo_free(dlci->fifo); |
| 1670 | 1679 | while ((dlci->skb = skb_dequeue(&dlci->skb_list))) |
| 1671 | − kfree_skb(dlci->skb); | |
| 1680 | + dev_kfree_skb(dlci->skb); | |
| 1672 | 1681 | kfree(dlci); |
| 1673 | 1682 | } |
| 1674 | 1683 | |
| @@ -2007,7 +2016,7 @@ void gsm_cleanup_mux(struct gsm_mux *gsm) · 332 unmodified lines | ||
| 2007 | 2016 | { |
| 2008 | 2017 | int i; |
| 2009 | 2018 | struct gsm_dlci *dlci = gsm->dlci[0]; |
| 2010 | − struct gsm_msg *txq; | |
| 2019 | + struct gsm_msg *txq, *ntxq; | |
| 2011 | 2020 | struct gsm_control *gc; |
| 2012 | 2021 | |
| 2013 | 2022 | gsm->dead = 1; |
| @@ -2042,11 +2051,9 @@ void gsm_cleanup_mux(struct gsm_mux *gsm) · 28 unmodified lines | ||
| 2042 | 2051 | if (gsm->dlci[i]) |
| 2043 | 2052 | gsm_dlci_release(gsm->dlci[i]); |
| 2044 | 2053 | /* Now wipe the queues */ |
| 2045 | − for (txq = gsm->tx_head; txq != NULL; txq = gsm->tx_head) { | |
| 2046 | − gsm->tx_head = txq->next; | |
| 2054 | + list_for_each_entry_safe(txq, ntxq, &gsm->tx_list, list) | |
| 2047 | 2055 | kfree(txq); |
| 2048 | − } | |
| 2049 | − gsm->tx_tail = NULL; | |
| 2056 | + INIT_LIST_HEAD(&gsm->tx_list); | |
| 2050 | 2057 | } |
| 2051 | 2058 | EXPORT_SYMBOL_GPL(gsm_cleanup_mux); |
| 2052 | 2059 | |
| @@ -2157,6 +2164,7 @@ struct gsm_mux *gsm_alloc_mux(void) · 104 unmodified lines | ||
| 2157 | 2164 | } |
| 2158 | 2165 | spin_lock_init(&gsm->lock); |
| 2159 | 2166 | kref_init(&gsm->ref); |
| 2167 | + INIT_LIST_HEAD(&gsm->tx_list); | |
| 2160 | 2168 | |
| 2161 | 2169 | gsm->t1 = T1; |
| 2162 | 2170 | gsm->t2 = T2; |
| @@ -2273,7 +2281,7 @@ static void gsmld_receive_buf(struct tty_struct *tty, const unsigned char *cp, · 110 unmodified lines | ||
| 2273 | 2281 | gsm->error(gsm, *dp, flags); |
| 2274 | 2282 | break; |
| 2275 | 2283 | default: |
| 2276 | − WARN_ONCE("%s: unknown flag %d\n", | |
| 2284 | + WARN_ONCE(1, "%s: unknown flag %d\n", | |
| 2277 | 2285 | tty_name(tty, buf), flags); |
| 2278 | 2286 | break; |
| 2279 | 2287 | } |
| @@ -2377,12 +2385,12 @@ static void gsmld_write_wakeup(struct tty_struct *tty) · 97 unmodified lines | ||
| 2377 | 2385 | |
| 2378 | 2386 | /* Queue poll */ |
| 2379 | 2387 | clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags); |
| 2388 | + spin_lock_irqsave(&gsm->tx_lock, flags); | |
| 2380 | 2389 | gsm_data_kick(gsm); |
| 2381 | 2390 | if (gsm->tx_bytes < TX_THRESH_LO) { |
| 2382 | − spin_lock_irqsave(&gsm->tx_lock, flags); | |
| 2383 | 2391 | gsm_dlci_data_sweep(gsm); |
| 2384 | − spin_unlock_irqrestore(&gsm->tx_lock, flags); | |
| 2385 | 2392 | } |
| 2393 | + spin_unlock_irqrestore(&gsm->tx_lock, flags); | |
| 2386 | 2394 | } |
| 2387 | 2395 | |
| 2388 | 2396 | /** |
| @@ -2868,14 +2876,14 @@ static const struct tty_port_operations gsm_port_ops = { · 479 unmodified lines | ||
| 2868 | 2876 | .dtr_rts = gsm_dtr_rts, |
| 2869 | 2877 | }; |
| 2870 | 2878 | |
| 2871 | − | |
| 2872 | −static int gsmtty_open(struct tty_struct *tty, struct file *filp) | |
| 2879 | +static int gsmtty_install(struct tty_driver *driver, struct tty_struct *tty) | |
| 2873 | 2880 | { |
| 2874 | 2881 | struct gsm_mux *gsm; |
| 2875 | 2882 | struct gsm_dlci *dlci; |
| 2876 | − struct tty_port *port; | |
| 2877 | 2883 | unsigned int line = tty->index; |
| 2878 | 2884 | unsigned int mux = line >> 6; |
| 2885 | + bool alloc = false; | |
| 2886 | + int ret; | |
| 2879 | 2887 | |
| 2880 | 2888 | line = line & 0x3F; |
| 2881 | 2889 | |
| @@ -2889,14 +2897,35 @@ static int gsmtty_open(struct tty_struct *tty, struct file *filp) · 7 unmodified lines | ||
| 2889 | 2897 | gsm = gsm_mux[mux]; |
| 2890 | 2898 | if (gsm->dead) |
| 2891 | 2899 | return -EL2HLT; |
| 2900 | + /* If DLCI 0 is not yet fully open return an error. This is ok from a locking | |
| 2901 | + perspective as we don't have to worry about this if DLCI0 is lost */ | |
| 2902 | + if (gsm->dlci[0] && gsm->dlci[0]->state != DLCI_OPEN) | |
| 2903 | + return -EL2NSYNC; | |
| 2892 | 2904 | dlci = gsm->dlci[line]; |
| 2893 | − if (dlci == NULL) | |
| 2905 | + if (dlci == NULL) { | |
| 2906 | + alloc = true; | |
| 2894 | 2907 | dlci = gsm_dlci_alloc(gsm, line); |
| 2908 | + } | |
| 2895 | 2909 | if (dlci == NULL) |
| 2896 | 2910 | return -ENOMEM; |
| 2897 | − port = &dlci->port; | |
| 2898 | − port->count++; | |
| 2911 | + ret = tty_port_install(&dlci->port, driver, tty); | |
| 2912 | + if (ret) { | |
| 2913 | + if (alloc) | |
| 2914 | + dlci_put(dlci); | |
| 2915 | + return ret; | |
| 2916 | + } | |
| 2917 | + | |
| 2899 | 2918 | tty->driver_data = dlci; |
| 2919 | + | |
| 2920 | + return 0; | |
| 2921 | +} | |
| 2922 | + | |
| 2923 | +static int gsmtty_open(struct tty_struct *tty, struct file *filp) | |
| 2924 | +{ | |
| 2925 | + struct gsm_dlci *dlci = tty->driver_data; | |
| 2926 | + struct tty_port *port = &dlci->port; | |
| 2927 | + | |
| 2928 | + port->count++; | |
| 2900 | 2929 | dlci_get(dlci); |
| 2901 | 2930 | dlci_get(dlci->gsm->dlci[0]); |
| 2902 | 2931 | mux_get(dlci->gsm); |
| @@ -3043,13 +3072,13 @@ static void gsmtty_set_termios(struct tty_struct *tty, struct ktermios *old) · 140 unmodified lines | ||
| 3043 | 3072 | the RPN control message. This however rapidly gets nasty as we |
| 3044 | 3073 | then have to remap modem signals each way according to whether |
| 3045 | 3074 | our virtual cable is null modem etc .. */ |
| 3046 | − tty_termios_copy_hw(tty->termios, old); | |
| 3075 | + tty_termios_copy_hw(&tty->termios, old); | |
| 3047 | 3076 | } |
| 3048 | 3077 | |
| 3049 | 3078 | static void gsmtty_throttle(struct tty_struct *tty) |
| 3050 | 3079 | { |
| 3051 | 3080 | struct gsm_dlci *dlci = tty->driver_data; |
| 3052 | − if (tty->termios->c_cflag & CRTSCTS) | |
| 3081 | + if (tty->termios.c_cflag & CRTSCTS) | |
| 3053 | 3082 | dlci->modem_tx &= ~TIOCM_DTR; |
| 3054 | 3083 | dlci->throttled = 1; |
| 3055 | 3084 | /* Send an MSC with DTR cleared */ |
| @@ -3059,7 +3088,7 @@ static void gsmtty_throttle(struct tty_struct *tty) · 3 unmodified lines | ||
| 3059 | 3088 | static void gsmtty_unthrottle(struct tty_struct *tty) |
| 3060 | 3089 | { |
| 3061 | 3090 | struct gsm_dlci *dlci = tty->driver_data; |
| 3062 | − if (tty->termios->c_cflag & CRTSCTS) | |
| 3091 | + if (tty->termios.c_cflag & CRTSCTS) | |
| 3063 | 3092 | dlci->modem_tx |= TIOCM_DTR; |
| 3064 | 3093 | dlci->throttled = 0; |
| 3065 | 3094 | /* Send an MSC with DTR set */ |
| @@ -3085,6 +3114,7 @@ static int gsmtty_break_ctl(struct tty_struct *tty, int state) · 19 unmodified lines | ||
| 3085 | 3114 | |
| 3086 | 3115 | /* Virtual ttys for the demux */ |
| 3087 | 3116 | static const struct tty_operations gsmtty_ops = { |
| 3117 | + .install = gsmtty_install, | |
| 3088 | 3118 | .open = gsmtty_open, |
| 3089 | 3119 | .close = gsmtty_close, |
| 3090 | 3120 | .write = gsmtty_write, |
| @@ -1065,7 +1065,7 @@ static ssize_t r3964_read(struct tty_struct *tty, struct file *file, · 1064 unmodified lines | ||
| 1065 | 1065 | |
| 1066 | 1066 | TRACE_L("read()"); |
| 1067 | 1067 | |
| 1068 | − tty_lock(); | |
| 1068 | + tty_lock(tty); | |
| 1069 | 1069 | |
| 1070 | 1070 | pClient = findClient(pInfo, task_pid(current)); |
| 1071 | 1071 | if (pClient) { |
| @@ -1077,7 +1077,7 @@ static ssize_t r3964_read(struct tty_struct *tty, struct file *file, · 5 unmodified lines | ||
| 1077 | 1077 | goto unlock; |
| 1078 | 1078 | } |
| 1079 | 1079 | /* block until there is a message: */ |
| 1080 | − wait_event_interruptible_tty(pInfo->read_wait, | |
| 1080 | + wait_event_interruptible_tty(tty, pInfo->read_wait, | |
| 1081 | 1081 | (pMsg = remove_msg(pInfo, pClient))); |
| 1082 | 1082 | } |
| 1083 | 1083 | |
| @@ -1107,7 +1107,7 @@ static ssize_t r3964_read(struct tty_struct *tty, struct file *file, · 23 unmodified lines | ||
| 1107 | 1107 | } |
| 1108 | 1108 | ret = -EPERM; |
| 1109 | 1109 | unlock: |
| 1110 | − tty_unlock(); | |
| 1110 | + tty_unlock(tty); | |
| 1111 | 1111 | return ret; |
| 1112 | 1112 | } |
| 1113 | 1113 | |
| @@ -1156,7 +1156,7 @@ static ssize_t r3964_write(struct tty_struct *tty, struct file *file, · 42 unmodified lines | ||
| 1156 | 1156 | pHeader->locks = 0; |
| 1157 | 1157 | pHeader->owner = NULL; |
| 1158 | 1158 | |
| 1159 | − tty_lock(); | |
| 1159 | + tty_lock(tty); | |
| 1160 | 1160 | |
| 1161 | 1161 | pClient = findClient(pInfo, task_pid(current)); |
| 1162 | 1162 | if (pClient) { |
| @@ -1175,7 +1175,7 @@ static ssize_t r3964_write(struct tty_struct *tty, struct file *file, · 12 unmodified lines | ||
| 1175 | 1175 | add_tx_queue(pInfo, pHeader); |
| 1176 | 1176 | trigger_transmit(pInfo); |
| 1177 | 1177 | |
| 1178 | − tty_unlock(); | |
| 1178 | + tty_unlock(tty); | |
| 1179 | 1179 | |
| 1180 | 1180 | return 0; |
| 1181 | 1181 | } |
| @@ -92,10 +92,18 @@ static inline int tty_put_user(struct tty_struct *tty, unsigned char x, · 91 unmodified lines | ||
| 92 | 92 | |
| 93 | 93 | static void n_tty_set_room(struct tty_struct *tty) |
| 94 | 94 | { |
| 95 | − /* tty->read_cnt is not read locked ? */ | |
| 96 | − int left = N_TTY_BUF_SIZE - tty->read_cnt - 1; | |
| 95 | + int left; | |
| 97 | 96 | int old_left; |
| 98 | 97 | |
| 98 | + /* tty->read_cnt is not read locked ? */ | |
| 99 | + if (I_PARMRK(tty)) { | |
| 100 | + /* Multiply read_cnt by 3, since each byte might take up to | |
| 101 | + * three times as many spaces when PARMRK is set (depending on | |
| 102 | + * its flags, e.g. parity error). */ | |
| 103 | + left = N_TTY_BUF_SIZE - tty->read_cnt * 3 - 1; | |
| 104 | + } else | |
| 105 | + left = N_TTY_BUF_SIZE - tty->read_cnt - 1; | |
| 106 | + | |
| 99 | 107 | /* |
| 100 | 108 | * If we are doing input canonicalization, and there are no |
| 101 | 109 | * pending newlines, let characters through without limit, so |
| @@ -1432,6 +1440,12 @@ static void n_tty_receive_buf(struct tty_struct *tty, const unsigned char *cp, · 1330 unmodified lines | ||
| 1432 | 1440 | */ |
| 1433 | 1441 | if (tty->receive_room < TTY_THRESHOLD_THROTTLE) |
| 1434 | 1442 | tty_throttle(tty); |
| 1443 | + | |
| 1444 | + /* FIXME: there is a tiny race here if the receive room check runs | |
| 1445 | + before the other work executes and empties the buffer (upping | |
| 1446 | + the receiving room and unthrottling. We then throttle and get | |
| 1447 | + stuck. This has been observed and traced down by Vincent Pillet/ | |
| 1448 | + We need to address this when we sort out out the rx path locking */ | |
| 1435 | 1449 | } |
| 1436 | 1450 | |
| 1437 | 1451 | int is_ignored(int sig) |
| @@ -1460,7 +1474,7 @@ static void n_tty_set_termios(struct tty_struct *tty, struct ktermios *old) · 22 unmodified lines | ||
| 1460 | 1474 | BUG_ON(!tty); |
| 1461 | 1475 | |
| 1462 | 1476 | if (old) |
| 1463 | − canon_change = (old->c_lflag ^ tty->termios->c_lflag) & ICANON; | |
| 1477 | + canon_change = (old->c_lflag ^ tty->termios.c_lflag) & ICANON; | |
| 1464 | 1478 | if (canon_change) { |
| 1465 | 1479 | memset(&tty->read_flags, 0, sizeof tty->read_flags); |
| 1466 | 1480 | tty->canon_head = tty->read_tail; |
| @@ -1728,7 +1742,8 @@ static ssize_t n_tty_read(struct tty_struct *tty, struct file *file, · 261 unmodified lines | ||
| 1728 | 1742 | |
| 1729 | 1743 | do_it_again: |
| 1730 | 1744 | |
| 1731 | − BUG_ON(!tty->read_buf); | |
| 1745 | + if (WARN_ON(!tty->read_buf)) | |
| 1746 | + return -EAGAIN; | |
| 1732 | 1747 | |
| 1733 | 1748 | c = job_control(tty, file); |
| 1734 | 1749 | if (c < 0) |
| @@ -1832,13 +1847,13 @@ do_it_again: · 97 unmodified lines | ||
| 1832 | 1847 | |
| 1833 | 1848 | if (tty->icanon && !L_EXTPROC(tty)) { |
| 1834 | 1849 | /* N.B. avoid overrun if nr == 0 */ |
| 1850 | + spin_lock_irqsave(&tty->read_lock, flags); | |
| 1835 | 1851 | while (nr && tty->read_cnt) { |
| 1836 | 1852 | int eol; |
| 1837 | 1853 | |
| 1838 | 1854 | eol = test_and_clear_bit(tty->read_tail, |
| 1839 | 1855 | tty->read_flags); |
| 1840 | 1856 | c = tty->read_buf[tty->read_tail]; |
| 1841 | − spin_lock_irqsave(&tty->read_lock, flags); | |
| 1842 | 1857 | tty->read_tail = ((tty->read_tail+1) & |
| 1843 | 1858 | (N_TTY_BUF_SIZE-1)); |
| 1844 | 1859 | tty->read_cnt--; |
| @@ -1856,15 +1871,19 @@ do_it_again: · 11 unmodified lines | ||
| 1856 | 1871 | if (tty_put_user(tty, c, b++)) { |
| 1857 | 1872 | retval = -EFAULT; |
| 1858 | 1873 | b--; |
| 1874 | + spin_lock_irqsave(&tty->read_lock, flags); | |
| 1859 | 1875 | break; |
| 1860 | 1876 | } |
| 1861 | 1877 | nr--; |
| 1862 | 1878 | } |
| 1863 | 1879 | if (eol) { |
| 1864 | 1880 | tty_audit_push(tty); |
| 1881 | + spin_lock_irqsave(&tty->read_lock, flags); | |
| 1865 | 1882 | break; |
| 1866 | 1883 | } |
| 1884 | + spin_lock_irqsave(&tty->read_lock, flags); | |
| 1867 | 1885 | } |
| 1886 | + spin_unlock_irqrestore(&tty->read_lock, flags); | |
| 1868 | 1887 | if (retval) |
| 1869 | 1888 | break; |
| 1870 | 1889 | } else { |
| @@ -1473,8 +1473,8 @@ static int __devinit nozomi_card_init(struct pci_dev *pdev, · 1472 unmodified lines | ||
| 1473 | 1473 | port->dc = dc; |
| 1474 | 1474 | tty_port_init(&port->port); |
| 1475 | 1475 | port->port.ops = &noz_tty_port_ops; |
| 1476 | − tty_dev = tty_register_device(ntty_driver, dc->index_start + i, | |
| 1477 | − &pdev->dev); | |
| 1476 | + tty_dev = tty_port_register_device(&port->port, ntty_driver, | |
| 1477 | + dc->index_start + i, &pdev->dev); | |
| 1478 | 1478 | |
| 1479 | 1479 | if (IS_ERR(tty_dev)) { |
| 1480 | 1480 | ret = PTR_ERR(tty_dev); |
| @@ -47,6 +47,7 @@ static void pty_close(struct tty_struct *tty, struct file *filp) · 46 unmodified lines | ||
| 47 | 47 | wake_up_interruptible(&tty->read_wait); |
| 48 | 48 | wake_up_interruptible(&tty->write_wait); |
| 49 | 49 | tty->packet = 0; |
| 50 | + /* Review - krefs on tty_link ?? */ | |
| 50 | 51 | if (!tty->link) |
| 51 | 52 | return; |
| 52 | 53 | tty->link->packet = 0; |
| @@ -62,9 +63,9 @@ static void pty_close(struct tty_struct *tty, struct file *filp) · 9 unmodified lines | ||
| 62 | 63 | mutex_unlock(&devpts_mutex); |
| 63 | 64 | } |
| 64 | 65 | #endif |
| 65 | − tty_unlock(); | |
| 66 | + tty_unlock(tty); | |
| 66 | 67 | tty_vhangup(tty->link); |
| 67 | − tty_lock(); | |
| 68 | + tty_lock(tty); | |
| 68 | 69 | } |
| 69 | 70 | } |
| 70 | 71 | |
| @@ -231,8 +232,8 @@ out: · 160 unmodified lines | ||
| 231 | 232 | static void pty_set_termios(struct tty_struct *tty, |
| 232 | 233 | struct ktermios *old_termios) |
| 233 | 234 | { |
| 234 | − tty->termios->c_cflag &= ~(CSIZE | PARENB); | |
| 235 | − tty->termios->c_cflag |= (CS8 | CREAD); | |
| 235 | + tty->termios.c_cflag &= ~(CSIZE | PARENB); | |
| 236 | + tty->termios.c_cflag |= (CS8 | CREAD); | |
| 236 | 237 | } |
| 237 | 238 | |
| 238 | 239 | /** |
| @@ -282,60 +283,110 @@ done: · 43 unmodified lines | ||
| 282 | 283 | return 0; |
| 283 | 284 | } |
| 284 | 285 | |
| 285 | −/* Traditional BSD devices */ | |
| 286 | −#ifdef CONFIG_LEGACY_PTYS | |
| 287 | − | |
| 288 | −static int pty_install(struct tty_driver *driver, struct tty_struct *tty) | |
| 286 | +/** | |
| 287 | + * pty_common_install - set up the pty pair | |
| 288 | + * @driver: the pty driver | |
| 289 | + * @tty: the tty being instantiated | |
| 290 | + * @bool: legacy, true if this is BSD style | |
| 291 | + * | |
| 292 | + * Perform the initial set up for the tty/pty pair. Called from the | |
| 293 | + * tty layer when the port is first opened. | |
| 294 | + * | |
| 295 | + * Locking: the caller must hold the tty_mutex | |
| 296 | + */ | |
| 297 | +static int pty_common_install(struct tty_driver *driver, struct tty_struct *tty, | |
| 298 | + bool legacy) | |
| 289 | 299 | { |
| 290 | 300 | struct tty_struct *o_tty; |
| 301 | + struct tty_port *ports[2]; | |
| 291 | 302 | int idx = tty->index; |
| 292 | − int retval; | |
| 303 | + int retval = -ENOMEM; | |
| 293 | 304 | |
| 294 | 305 | o_tty = alloc_tty_struct(); |
| 295 | 306 | if (!o_tty) |
| 296 | − return -ENOMEM; | |
| 307 | + goto err; | |
| 308 | + ports[0] = kmalloc(sizeof **ports, GFP_KERNEL); | |
| 309 | + ports[1] = kmalloc(sizeof **ports, GFP_KERNEL); | |
| 310 | + if (!ports[0] || !ports[1]) | |
| 311 | + goto err_free_tty; | |
| 297 | 312 | if (!try_module_get(driver->other->owner)) { |
| 298 | 313 | /* This cannot in fact currently happen */ |
| 299 | − retval = -ENOMEM; | |
| 300 | 314 | goto err_free_tty; |
| 301 | 315 | } |
| 302 | 316 | initialize_tty_struct(o_tty, driver->other, idx); |
| 303 | 317 | |
| 304 | − /* We always use new tty termios data so we can do this | |
| 305 | − the easy way .. */ | |
| 306 | − retval = tty_init_termios(tty); | |
| 307 | − if (retval) | |
| 308 | − goto err_deinit_tty; | |
| 309 | − | |
| 310 | − retval = tty_init_termios(o_tty); | |
| 311 | − if (retval) | |
| 312 | − goto err_free_termios; | |
| 318 | + if (legacy) { | |
| 319 | + /* We always use new tty termios data so we can do this | |
| 320 | + the easy way .. */ | |
| 321 | + retval = tty_init_termios(tty); | |
| 322 | + if (retval) | |
| 323 | + goto err_deinit_tty; | |
| 324 | + | |
| 325 | + retval = tty_init_termios(o_tty); | |
| 326 | + if (retval) | |
| 327 | + goto err_free_termios; | |
| 328 | + | |
| 329 | + driver->other->ttys[idx] = o_tty; | |
| 330 | + driver->ttys[idx] = tty; | |
| 331 | + } else { | |
| 332 | + memset(&tty->termios_locked, 0, sizeof(tty->termios_locked)); | |
| 333 | + tty->termios = driver->init_termios; | |
| 334 | + memset(&o_tty->termios_locked, 0, sizeof(tty->termios_locked)); | |
| 335 | + o_tty->termios = driver->other->init_termios; | |
| 336 | + } | |
| 313 | 337 | |
| 314 | 338 | /* |
| 315 | 339 | * Everything allocated ... set up the o_tty structure. |
| 316 | 340 | */ |
| 317 | − driver->other->ttys[idx] = o_tty; | |
| 318 | 341 | tty_driver_kref_get(driver->other); |
| 319 | 342 | if (driver->subtype == PTY_TYPE_MASTER) |
| 320 | 343 | o_tty->count++; |
| 321 | 344 | /* Establish the links in both directions */ |
| 322 | 345 | tty->link = o_tty; |
| 323 | 346 | o_tty->link = tty; |
| 347 | + tty_port_init(ports[0]); | |
| 348 | + tty_port_init(ports[1]); | |
| 349 | + o_tty->port = ports[0]; | |
| 350 | + tty->port = ports[1]; | |
| 324 | 351 | |
| 325 | 352 | tty_driver_kref_get(driver); |
| 326 | 353 | tty->count++; |
| 327 | − driver->ttys[idx] = tty; | |
| 328 | 354 | return 0; |
| 329 | 355 | err_free_termios: |
| 330 | − tty_free_termios(tty); | |
| 356 | + if (legacy) | |
| 357 | + tty_free_termios(tty); | |
| 331 | 358 | err_deinit_tty: |
| 332 | 359 | deinitialize_tty_struct(o_tty); |
| 333 | 360 | module_put(o_tty->driver->owner); |
| 334 | 361 | err_free_tty: |
| 362 | + kfree(ports[0]); | |
| 363 | + kfree(ports[1]); | |
| 335 | 364 | free_tty_struct(o_tty); |
| 365 | +err: | |
| 336 | 366 | return retval; |
| 337 | 367 | } |
| 338 | 368 | |
| 369 | +static void pty_cleanup(struct tty_struct *tty) | |
| 370 | +{ | |
| 371 | + kfree(tty->port); | |
| 372 | +} | |
| 373 | + | |
| 374 | +/* Traditional BSD devices */ | |
| 375 | +#ifdef CONFIG_LEGACY_PTYS | |
| 376 | + | |
| 377 | +static int pty_install(struct tty_driver *driver, struct tty_struct *tty) | |
| 378 | +{ | |
| 379 | + return pty_common_install(driver, tty, true); | |
| 380 | +} | |
| 381 | + | |
| 382 | +static void pty_remove(struct tty_driver *driver, struct tty_struct *tty) | |
| 383 | +{ | |
| 384 | + struct tty_struct *pair = tty->link; | |
| 385 | + driver->ttys[tty->index] = NULL; | |
| 386 | + if (pair) | |
| 387 | + pair->driver->ttys[pair->index] = NULL; | |
| 388 | +} | |
| 389 | + | |
| 339 | 390 | static int pty_bsd_ioctl(struct tty_struct *tty, |
| 340 | 391 | unsigned int cmd, unsigned long arg) |
| 341 | 392 | { |
| @@ -366,7 +417,9 @@ static const struct tty_operations master_pty_ops_bsd = { · 24 unmodified lines | ||
| 366 | 417 | .unthrottle = pty_unthrottle, |
| 367 | 418 | .set_termios = pty_set_termios, |
| 368 | 419 | .ioctl = pty_bsd_ioctl, |
| 369 | − .resize = pty_resize | |
| 420 | + .cleanup = pty_cleanup, | |
| 421 | + .resize = pty_resize, | |
| 422 | + .remove = pty_remove | |
| 370 | 423 | }; |
| 371 | 424 | |
| 372 | 425 | static const struct tty_operations slave_pty_ops_bsd = { |
| @@ -379,7 +432,9 @@ static const struct tty_operations slave_pty_ops_bsd = { · 6 unmodified lines | ||
| 379 | 432 | .chars_in_buffer = pty_chars_in_buffer, |
| 380 | 433 | .unthrottle = pty_unthrottle, |
| 381 | 434 | .set_termios = pty_set_termios, |
| 382 | − .resize = pty_resize | |
| 435 | + .cleanup = pty_cleanup, | |
| 436 | + .resize = pty_resize, | |
| 437 | + .remove = pty_remove | |
| 383 | 438 | }; |
| 384 | 439 | |
| 385 | 440 | static void __init legacy_pty_init(void) |
| @@ -389,12 +444,18 @@ static void __init legacy_pty_init(void) · 3 unmodified lines | ||
| 389 | 444 | if (legacy_count <= 0) |
| 390 | 445 | return; |
| 391 | 446 | |
| 392 | − pty_driver = alloc_tty_driver(legacy_count); | |
| 393 | − if (!pty_driver) | |
| 447 | + pty_driver = tty_alloc_driver(legacy_count, | |
| 448 | + TTY_DRIVER_RESET_TERMIOS | | |
| 449 | + TTY_DRIVER_REAL_RAW | | |
| 450 | + TTY_DRIVER_DYNAMIC_ALLOC); | |
| 451 | + if (IS_ERR(pty_driver)) | |
| 394 | 452 | panic("Couldn't allocate pty driver"); |
| 395 | 453 | |
| 396 | − pty_slave_driver = alloc_tty_driver(legacy_count); | |
| 397 | − if (!pty_slave_driver) | |
| 454 | + pty_slave_driver = tty_alloc_driver(legacy_count, | |
| 455 | + TTY_DRIVER_RESET_TERMIOS | | |
| 456 | + TTY_DRIVER_REAL_RAW | | |
| 457 | + TTY_DRIVER_DYNAMIC_ALLOC); | |
| 458 | + if (IS_ERR(pty_slave_driver)) | |
| 398 | 459 | panic("Couldn't allocate pty slave driver"); |
| 399 | 460 | |
| 400 | 461 | pty_driver->driver_name = "pty_master"; |
| @@ -410,7 +471,6 @@ static void __init legacy_pty_init(void) · 9 unmodified lines | ||
| 410 | 471 | pty_driver->init_termios.c_lflag = 0; |
| 411 | 472 | pty_driver->init_termios.c_ispeed = 38400; |
| 412 | 473 | pty_driver->init_termios.c_ospeed = 38400; |
| 413 | − pty_driver->flags = TTY_DRIVER_RESET_TERMIOS | TTY_DRIVER_REAL_RAW; | |
| 414 | 474 | pty_driver->other = pty_slave_driver; |
| 415 | 475 | tty_set_operations(pty_driver, &master_pty_ops_bsd); |
| 416 | 476 | |
| @@ -424,8 +484,6 @@ static void __init legacy_pty_init(void) · 7 unmodified lines | ||
| 424 | 484 | pty_slave_driver->init_termios.c_cflag = B38400 | CS8 | CREAD; |
| 425 | 485 | pty_slave_driver->init_termios.c_ispeed = 38400; |
| 426 | 486 | pty_slave_driver->init_termios.c_ospeed = 38400; |
| 427 | − pty_slave_driver->flags = TTY_DRIVER_RESET_TERMIOS | | |
| 428 | − TTY_DRIVER_REAL_RAW; | |
| 429 | 487 | pty_slave_driver->other = pty_driver; |
| 430 | 488 | tty_set_operations(pty_slave_driver, &slave_pty_ops_bsd); |
| 431 | 489 | |
| @@ -497,78 +555,22 @@ static struct tty_struct *pts_unix98_lookup(struct tty_driver *driver, · 65 unmodified lines | ||
| 497 | 555 | return tty; |
| 498 | 556 | } |
| 499 | 557 | |
| 500 | −static void pty_unix98_shutdown(struct tty_struct *tty) | |
| 501 | −{ | |
| 502 | − tty_driver_remove_tty(tty->driver, tty); | |
| 503 | − /* We have our own method as we don't use the tty index */ | |
| 504 | − kfree(tty->termios); | |
| 505 | −} | |
| 506 | − | |
| 507 | 558 | /* We have no need to install and remove our tty objects as devpts does all |
| 508 | 559 | the work for us */ |
| 509 | 560 | |
| 510 | 561 | static int pty_unix98_install(struct tty_driver *driver, struct tty_struct *tty) |
| 511 | 562 | { |
| 512 | − struct tty_struct *o_tty; | |
| 513 | − int idx = tty->index; | |
| 514 | − | |
| 515 | − o_tty = alloc_tty_struct(); | |
| 516 | − if (!o_tty) | |
| 517 | − return -ENOMEM; | |
| 518 | − if (!try_module_get(driver->other->owner)) { | |
| 519 | − /* This cannot in fact currently happen */ | |
| 520 | − goto err_free_tty; | |
| 521 | − } | |
| 522 | − initialize_tty_struct(o_tty, driver->other, idx); | |
| 523 | − | |
| 524 | − tty->termios = kzalloc(sizeof(struct ktermios[2]), GFP_KERNEL); | |
| 525 | − if (tty->termios == NULL) | |
| 526 | − goto err_free_mem; | |
| 527 | − *tty->termios = driver->init_termios; | |
| 528 | − tty->termios_locked = tty->termios + 1; | |
| 529 | − | |
| 530 | − o_tty->termios = kzalloc(sizeof(struct ktermios[2]), GFP_KERNEL); | |
| 531 | − if (o_tty->termios == NULL) | |
| 532 | − goto err_free_mem; | |
| 533 | − *o_tty->termios = driver->other->init_termios; | |
| 534 | − o_tty->termios_locked = o_tty->termios + 1; | |
| 535 | − | |
| 536 | − tty_driver_kref_get(driver->other); | |
| 537 | − if (driver->subtype == PTY_TYPE_MASTER) | |
| 538 | − o_tty->count++; | |
| 539 | − /* Establish the links in both directions */ | |
| 540 | − tty->link = o_tty; | |
| 541 | − o_tty->link = tty; | |
| 542 | − /* | |
| 543 | − * All structures have been allocated, so now we install them. | |
| 544 | − * Failures after this point use release_tty to clean up, so | |
| 545 | − * there's no need to null out the local pointers. | |
| 546 | − */ | |
| 547 | − tty_driver_kref_get(driver); | |
| 548 | − tty->count++; | |
| 549 | − return 0; | |
| 550 | −err_free_mem: | |
| 551 | − deinitialize_tty_struct(o_tty); | |
| 552 | − kfree(o_tty->termios); | |
| 553 | − kfree(tty->termios); | |
| 554 | − module_put(o_tty->driver->owner); | |
| 555 | −err_free_tty: | |
| 556 | − free_tty_struct(o_tty); | |
| 557 | − return -ENOMEM; | |
| 558 | −} | |
| 559 | − | |
| 560 | −static void ptm_unix98_remove(struct tty_driver *driver, struct tty_struct *tty) | |
| 561 | −{ | |
| 563 | + return pty_common_install(driver, tty, false); | |
| 562 | 564 | } |
| 563 | 565 | |
| 564 | −static void pts_unix98_remove(struct tty_driver *driver, struct tty_struct *tty) | |
| 566 | +static void pty_unix98_remove(struct tty_driver *driver, struct tty_struct *tty) | |
| 565 | 567 | { |
| 566 | 568 | } |
| 567 | 569 | |
| 568 | 570 | static const struct tty_operations ptm_unix98_ops = { |
| 569 | 571 | .lookup = ptm_unix98_lookup, |
| 570 | 572 | .install = pty_unix98_install, |
| 571 | − .remove = ptm_unix98_remove, | |
| 573 | + .remove = pty_unix98_remove, | |
| 572 | 574 | .open = pty_open, |
| 573 | 575 | .close = pty_close, |
| 574 | 576 | .write = pty_write, |
| @@ -578,14 +580,14 @@ static const struct tty_operations ptm_unix98_ops = { · 3 unmodified lines | ||
| 578 | 580 | .unthrottle = pty_unthrottle, |
| 579 | 581 | .set_termios = pty_set_termios, |
| 580 | 582 | .ioctl = pty_unix98_ioctl, |
| 581 | − .shutdown = pty_unix98_shutdown, | |
| 582 | − .resize = pty_resize | |
| 583 | + .resize = pty_resize, | |
| 584 | + .cleanup = pty_cleanup | |
| 583 | 585 | }; |
| 584 | 586 | |
| 585 | 587 | static const struct tty_operations pty_unix98_ops = { |
| 586 | 588 | .lookup = pts_unix98_lookup, |
| 587 | 589 | .install = pty_unix98_install, |
| 588 | − .remove = pts_unix98_remove, | |
| 590 | + .remove = pty_unix98_remove, | |
| 589 | 591 | .open = pty_open, |
| 590 | 592 | .close = pty_close, |
| 591 | 593 | .write = pty_write, |
| @@ -594,7 +596,7 @@ static const struct tty_operations pty_unix98_ops = { · 2 unmodified lines | ||
| 594 | 596 | .chars_in_buffer = pty_chars_in_buffer, |
| 595 | 597 | .unthrottle = pty_unthrottle, |
| 596 | 598 | .set_termios = pty_set_termios, |
| 597 | − .shutdown = pty_unix98_shutdown | |
| 599 | + .cleanup = pty_cleanup, | |
| 598 | 600 | }; |
| 599 | 601 | |
| 600 | 602 | /** |
| @@ -622,26 +624,27 @@ static int ptmx_open(struct inode *inode, struct file *filp) · 21 unmodified lines | ||
| 622 | 624 | return retval; |
| 623 | 625 | |
| 624 | 626 | /* find a device that is not in use. */ |
| 625 | − tty_lock(); | |
| 627 | + mutex_lock(&devpts_mutex); | |
| 626 | 628 | index = devpts_new_index(inode); |
| 627 | − tty_unlock(); | |
| 628 | 629 | if (index < 0) { |
| 629 | 630 | retval = index; |
| 630 | 631 | goto err_file; |
| 631 | 632 | } |
| 632 | 633 | |
| 634 | + mutex_unlock(&devpts_mutex); | |
| 635 | + | |
| 633 | 636 | mutex_lock(&tty_mutex); |
| 634 | − mutex_lock(&devpts_mutex); | |
| 635 | 637 | tty = tty_init_dev(ptm_driver, index); |
| 636 | − mutex_unlock(&devpts_mutex); | |
| 637 | − tty_lock(); | |
| 638 | − mutex_unlock(&tty_mutex); | |
| 639 | 638 | |
| 640 | 639 | if (IS_ERR(tty)) { |
| 641 | 640 | retval = PTR_ERR(tty); |
| 642 | 641 | goto out; |
| 643 | 642 | } |
| 644 | 643 | |
| 644 | + /* The tty returned here is locked so we can safely | |
| 645 | + drop the mutex */ | |
| 646 | + mutex_unlock(&tty_mutex); | |
| 647 | + | |
| 645 | 648 | set_bit(TTY_PTY_LOCK, &tty->flags); /* LOCK THE SLAVE */ |
| 646 | 649 | |
| 647 | 650 | tty_add_file(tty, filp); |
| @@ -654,16 +657,17 @@ static int ptmx_open(struct inode *inode, struct file *filp) · 6 unmodified lines | ||
| 654 | 657 | if (retval) |
| 655 | 658 | goto err_release; |
| 656 | 659 | |
| 657 | − tty_unlock(); | |
| 660 | + tty_unlock(tty); | |
| 658 | 661 | return 0; |
| 659 | 662 | err_release: |
| 660 | − tty_unlock(); | |
| 663 | + tty_unlock(tty); | |
| 661 | 664 | tty_release(inode, filp); |
| 662 | 665 | return retval; |
| 663 | 666 | out: |
| 667 | + mutex_unlock(&tty_mutex); | |
| 664 | 668 | devpts_kill_index(inode, index); |
| 665 | − tty_unlock(); | |
| 666 | 669 | err_file: |
| 670 | + mutex_unlock(&devpts_mutex); | |
| 667 | 671 | tty_free_file(filp); |
| 668 | 672 | return retval; |
| 669 | 673 | } |
| @@ -672,11 +676,21 @@ static struct file_operations ptmx_fops; · 2 unmodified lines | ||
| 672 | 676 | |
| 673 | 677 | static void __init unix98_pty_init(void) |
| 674 | 678 | { |
| 675 | − ptm_driver = alloc_tty_driver(NR_UNIX98_PTY_MAX); | |
| 676 | − if (!ptm_driver) | |
| 679 | + ptm_driver = tty_alloc_driver(NR_UNIX98_PTY_MAX, | |
| 680 | + TTY_DRIVER_RESET_TERMIOS | | |
| 681 | + TTY_DRIVER_REAL_RAW | | |
| 682 | + TTY_DRIVER_DYNAMIC_DEV | | |
| 683 | + TTY_DRIVER_DEVPTS_MEM | | |
| 684 | + TTY_DRIVER_DYNAMIC_ALLOC); | |
| 685 | + if (IS_ERR(ptm_driver)) | |
| 677 | 686 | panic("Couldn't allocate Unix98 ptm driver"); |
| 678 | − pts_driver = alloc_tty_driver(NR_UNIX98_PTY_MAX); | |
| 679 | − if (!pts_driver) | |
| 687 | + pts_driver = tty_alloc_driver(NR_UNIX98_PTY_MAX, | |
| 688 | + TTY_DRIVER_RESET_TERMIOS | | |
| 689 | + TTY_DRIVER_REAL_RAW | | |
| 690 | + TTY_DRIVER_DYNAMIC_DEV | | |
| 691 | + TTY_DRIVER_DEVPTS_MEM | | |
| 692 | + TTY_DRIVER_DYNAMIC_ALLOC); | |
| 693 | + if (IS_ERR(pts_driver)) | |
| 680 | 694 | panic("Couldn't allocate Unix98 pts driver"); |
| 681 | 695 | |
| 682 | 696 | ptm_driver->driver_name = "pty_master"; |
| @@ -692,8 +706,6 @@ static void __init unix98_pty_init(void) · 9 unmodified lines | ||
| 692 | 706 | ptm_driver->init_termios.c_lflag = 0; |
| 693 | 707 | ptm_driver->init_termios.c_ispeed = 38400; |
| 694 | 708 | ptm_driver->init_termios.c_ospeed = 38400; |
| 695 | − ptm_driver->flags = TTY_DRIVER_RESET_TERMIOS | TTY_DRIVER_REAL_RAW | | |
| 696 | − TTY_DRIVER_DYNAMIC_DEV | TTY_DRIVER_DEVPTS_MEM; | |
| 697 | 709 | ptm_driver->other = pts_driver; |
| 698 | 710 | tty_set_operations(ptm_driver, &ptm_unix98_ops); |
| 699 | 711 | |
| @@ -707,8 +719,6 @@ static void __init unix98_pty_init(void) · 7 unmodified lines | ||
| 707 | 719 | pts_driver->init_termios.c_cflag = B38400 | CS8 | CREAD; |
| 708 | 720 | pts_driver->init_termios.c_ispeed = 38400; |
| 709 | 721 | pts_driver->init_termios.c_ospeed = 38400; |
| 710 | − pts_driver->flags = TTY_DRIVER_RESET_TERMIOS | TTY_DRIVER_REAL_RAW | | |
| 711 | − TTY_DRIVER_DYNAMIC_DEV | TTY_DRIVER_DEVPTS_MEM; | |
| 712 | 722 | pts_driver->other = ptm_driver; |
| 713 | 723 | tty_set_operations(pts_driver, &pty_unix98_ops); |
| 714 | 724 | |
| @@ -704,8 +704,8 @@ static void init_r_port(int board, int aiop, int chan, struct pci_dev *pci_dev) · 703 unmodified lines | ||
| 704 | 704 | spin_lock_init(&info->slock); |
| 705 | 705 | mutex_init(&info->write_mtx); |
| 706 | 706 | rp_table[line] = info; |
| 707 | − tty_register_device(rocket_driver, line, pci_dev ? &pci_dev->dev : | |
| 708 | − NULL); | |
| 707 | + tty_port_register_device(&info->port, rocket_driver, line, | |
| 708 | + pci_dev ? &pci_dev->dev : NULL); | |
| 709 | 709 | } |
| 710 | 710 | |
| 711 | 711 | /* |
| @@ -720,7 +720,7 @@ static void configure_r_port(struct tty_struct *tty, struct r_port *info, · 8 unmodified lines | ||
| 720 | 720 | unsigned rocketMode; |
| 721 | 721 | int bits, baud, divisor; |
| 722 | 722 | CHANNEL_t *cp; |
| 723 | − struct ktermios *t = tty->termios; | |
| 723 | + struct ktermios *t = &tty->termios; | |
| 724 | 724 | |
| 725 | 725 | cp = &info->channel; |
| 726 | 726 | cflag = t->c_cflag; |
| @@ -978,7 +978,7 @@ static int rp_open(struct tty_struct *tty, struct file *filp) · 251 unmodified lines | ||
| 978 | 978 | tty->alt_speed = 460800; |
| 979 | 979 | |
| 980 | 980 | configure_r_port(tty, info, NULL); |
| 981 | − if (tty->termios->c_cflag & CBAUD) { | |
| 981 | + if (tty->termios.c_cflag & CBAUD) { | |
| 982 | 982 | sSetDTR(cp); |
| 983 | 983 | sSetRTS(cp); |
| 984 | 984 | } |
| @@ -1089,35 +1089,35 @@ static void rp_set_termios(struct tty_struct *tty, · 104 unmodified lines | ||
| 1089 | 1089 | if (rocket_paranoia_check(info, "rp_set_termios")) |
| 1090 | 1090 | return; |
| 1091 | 1091 | |
| 1092 | − cflag = tty->termios->c_cflag; | |
| 1092 | + cflag = tty->termios.c_cflag; | |
| 1093 | 1093 | |
| 1094 | 1094 | /* |
| 1095 | 1095 | * This driver doesn't support CS5 or CS6 |
| 1096 | 1096 | */ |
| 1097 | 1097 | if (((cflag & CSIZE) == CS5) || ((cflag & CSIZE) == CS6)) |
| 1098 | − tty->termios->c_cflag = | |
| 1098 | + tty->termios.c_cflag = | |
| 1099 | 1099 | ((cflag & ~CSIZE) | (old_termios->c_cflag & CSIZE)); |
| 1100 | 1100 | /* Or CMSPAR */ |
| 1101 | − tty->termios->c_cflag &= ~CMSPAR; | |
| 1101 | + tty->termios.c_cflag &= ~CMSPAR; | |
| 1102 | 1102 | |
| 1103 | 1103 | configure_r_port(tty, info, old_termios); |
| 1104 | 1104 | |
| 1105 | 1105 | cp = &info->channel; |
| 1106 | 1106 | |
| 1107 | 1107 | /* Handle transition to B0 status */ |
| 1108 | − if ((old_termios->c_cflag & CBAUD) && !(tty->termios->c_cflag & CBAUD)) { | |
| 1108 | + if ((old_termios->c_cflag & CBAUD) && !(tty->termios.c_cflag & CBAUD)) { | |
| 1109 | 1109 | sClrDTR(cp); |
| 1110 | 1110 | sClrRTS(cp); |
| 1111 | 1111 | } |
| 1112 | 1112 | |
| 1113 | 1113 | /* Handle transition away from B0 status */ |
| 1114 | − if (!(old_termios->c_cflag & CBAUD) && (tty->termios->c_cflag & CBAUD)) { | |
| 1115 | − if (!tty->hw_stopped || !(tty->termios->c_cflag & CRTSCTS)) | |
| 1114 | + if (!(old_termios->c_cflag & CBAUD) && (tty->termios.c_cflag & CBAUD)) { | |
| 1115 | + if (!tty->hw_stopped || !(tty->termios.c_cflag & CRTSCTS)) | |
| 1116 | 1116 | sSetRTS(cp); |
| 1117 | 1117 | sSetDTR(cp); |
| 1118 | 1118 | } |
| 1119 | 1119 | |
| 1120 | − if ((old_termios->c_cflag & CRTSCTS) && !(tty->termios->c_cflag & CRTSCTS)) { | |
| 1120 | + if ((old_termios->c_cflag & CRTSCTS) && !(tty->termios.c_cflag & CRTSCTS)) { | |
| 1121 | 1121 | tty->hw_stopped = 0; |
| 1122 | 1122 | rp_start(tty); |
| 1123 | 1123 | } |
| @@ -515,7 +515,7 @@ static void change_speed(struct m68k_serial *info, struct tty_struct *tty) · 514 unmodified lines | ||
| 515 | 515 | unsigned cflag; |
| 516 | 516 | int i; |
| 517 | 517 | |
| 518 | − cflag = tty->termios->c_cflag; | |
| 518 | + cflag = tty->termios.c_cflag; | |
| 519 | 519 | if (!(port = info->port)) |
| 520 | 520 | return; |
| 521 | 521 | |
| @@ -617,7 +617,7 @@ static void rs_set_ldisc(struct tty_struct *tty) · 95 unmodified lines | ||
| 617 | 617 | if (serial_paranoia_check(info, tty->name, "rs_set_ldisc")) |
| 618 | 618 | return; |
| 619 | 619 | |
| 620 | − info->is_cons = (tty->termios->c_line == N_TTY); | |
| 620 | + info->is_cons = (tty->termios.c_line == N_TTY); | |
| 621 | 621 | |
| 622 | 622 | printk("ttyS%d console mode %s\n", info->line, info->is_cons ? "on" : "off"); |
| 623 | 623 | } |
| @@ -985,7 +985,7 @@ static void rs_set_termios(struct tty_struct *tty, struct ktermios *old_termios) · 361 unmodified lines | ||
| 985 | 985 | change_speed(info, tty); |
| 986 | 986 | |
| 987 | 987 | if ((old_termios->c_cflag & CRTSCTS) && |
| 988 | − !(tty->termios->c_cflag & CRTSCTS)) { | |
| 988 | + !(tty->termios.c_cflag & CRTSCTS)) { | |
| 989 | 989 | tty->hw_stopped = 0; |
| 990 | 990 | rs_start(tty); |
| 991 | 991 | } |
| @@ -1070,7 +1070,7 @@ static void rs_close(struct tty_struct *tty, struct file * filp) · 78 unmodified lines | ||
| 1070 | 1070 | if (tty->ldisc.close) |
| 1071 | 1071 | (tty->ldisc.close)(tty); |
| 1072 | 1072 | tty->ldisc = ldiscs[N_TTY]; |
| 1073 | − tty->termios->c_line = N_TTY; | |
| 1073 | + tty->termios.c_line = N_TTY; | |
| 1074 | 1074 | if (tty->ldisc.open) |
| 1075 | 1075 | (tty->ldisc.open)(tty); |
| 1076 | 1076 | } |
| @@ -1189,12 +1189,6 @@ rs68328_init(void) · 112 unmodified lines | ||
| 1189 | 1189 | serial_driver->flags = TTY_DRIVER_REAL_RAW; |
| 1190 | 1190 | tty_set_operations(serial_driver, &rs_ops); |
| 1191 | 1191 | |
| 1192 | − if (tty_register_driver(serial_driver)) { | |
| 1193 | − put_tty_driver(serial_driver); | |
| 1194 | − printk(KERN_ERR "Couldn't register serial driver\n"); | |
| 1195 | − return -ENOMEM; | |
| 1196 | − } | |
| 1197 | − | |
| 1198 | 1192 | local_irq_save(flags); |
| 1199 | 1193 | |
| 1200 | 1194 | for(i=0;i<NR_PORTS;i++) { |
| @@ -1224,8 +1218,17 @@ rs68328_init(void) · 23 unmodified lines | ||
| 1224 | 1218 | 0, |
| 1225 | 1219 | "M68328_UART", info)) |
| 1226 | 1220 | panic("Unable to attach 68328 serial interrupt\n"); |
| 1221 | + | |
| 1222 | + tty_port_link_device(&info->tport, serial_driver, i); | |
| 1227 | 1223 | } |
| 1228 | 1224 | local_irq_restore(flags); |
| 1225 | + | |
| 1226 | + if (tty_register_driver(serial_driver)) { | |
| 1227 | + put_tty_driver(serial_driver); | |
| 1228 | + printk(KERN_ERR "Couldn't register serial driver\n"); | |
| 1229 | + return -ENOMEM; | |
| 1230 | + } | |
| 1231 | + | |
| 1229 | 1232 | return 0; |
| 1230 | 1233 | } |
| 1231 | 1234 | |
| @@ -2202,6 +2202,7 @@ serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios, · 2201 unmodified lines | ||
| 2202 | 2202 | unsigned char cval, fcr = 0; |
| 2203 | 2203 | unsigned long flags; |
| 2204 | 2204 | unsigned int baud, quot; |
| 2205 | + int fifo_bug = 0; | |
| 2205 | 2206 | |
| 2206 | 2207 | switch (termios->c_cflag & CSIZE) { |
| 2207 | 2208 | case CS5: |
| @@ -2221,8 +2222,11 @@ serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios, · 13 unmodified lines | ||
| 2221 | 2222 | |
| 2222 | 2223 | if (termios->c_cflag & CSTOPB) |
| 2223 | 2224 | cval |= UART_LCR_STOP; |
| 2224 | − if (termios->c_cflag & PARENB) | |
| 2225 | + if (termios->c_cflag & PARENB) { | |
| 2225 | 2226 | cval |= UART_LCR_PARITY; |
| 2227 | + if (up->bugs & UART_BUG_PARITY) | |
| 2228 | + fifo_bug = 1; | |
| 2229 | + } | |
| 2226 | 2230 | if (!(termios->c_cflag & PARODD)) |
| 2227 | 2231 | cval |= UART_LCR_EPAR; |
| 2228 | 2232 | #ifdef CMSPAR |
| @@ -2246,7 +2250,7 @@ serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios, · 17 unmodified lines | ||
| 2246 | 2250 | |
| 2247 | 2251 | if (up->capabilities & UART_CAP_FIFO && port->fifosize > 1) { |
| 2248 | 2252 | fcr = uart_config[port->type].fcr; |
| 2249 | − if (baud < 2400) { | |
| 2253 | + if (baud < 2400 || fifo_bug) { | |
| 2250 | 2254 | fcr &= ~UART_FCR_TRIGGER_MASK; |
| 2251 | 2255 | fcr |= UART_FCR_TRIGGER_1; |
| 2252 | 2256 | } |
| @@ -2336,7 +2340,7 @@ serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios, · 83 unmodified lines | ||
| 2336 | 2340 | serial_port_out(port, UART_EFR, efr); |
| 2337 | 2341 | } |
| 2338 | 2342 | |
| 2339 | −#ifdef CONFIG_ARCH_OMAP | |
| 2343 | +#ifdef CONFIG_ARCH_OMAP1 | |
| 2340 | 2344 | /* Workaround to enable 115200 baud on OMAP1510 internal ports */ |
| 2341 | 2345 | if (cpu_is_omap1510() && is_omap_port(up)) { |
| 2342 | 2346 | if (baud == 115200) { |
| @@ -2426,7 +2430,7 @@ static unsigned int serial8250_port_size(struct uart_8250_port *pt) · 83 unmodified lines | ||
| 2426 | 2430 | { |
| 2427 | 2431 | if (pt->port.iotype == UPIO_AU) |
| 2428 | 2432 | return 0x1000; |
| 2429 | −#ifdef CONFIG_ARCH_OMAP | |
| 2433 | +#ifdef CONFIG_ARCH_OMAP1 | |
| 2430 | 2434 | if (is_omap_port(pt)) |
| 2431 | 2435 | return 0x16 << pt->port.regshift; |
| 2432 | 2436 | #endif |
| @@ -2979,36 +2983,36 @@ void serial8250_resume_port(int line) · 546 unmodified lines | ||
| 2979 | 2983 | static int __devinit serial8250_probe(struct platform_device *dev) |
| 2980 | 2984 | { |
| 2981 | 2985 | struct plat_serial8250_port *p = dev->dev.platform_data; |
| 2982 | − struct uart_port port; | |
| 2986 | + struct uart_8250_port uart; | |
| 2983 | 2987 | int ret, i, irqflag = 0; |
| 2984 | 2988 | |
| 2985 | − memset(&port, 0, sizeof(struct uart_port)); | |
| 2989 | + memset(&uart, 0, sizeof(uart)); | |
| 2986 | 2990 | |
| 2987 | 2991 | if (share_irqs) |
| 2988 | 2992 | irqflag = IRQF_SHARED; |
| 2989 | 2993 | |
| 2990 | 2994 | for (i = 0; p && p->flags != 0; p++, i++) { |
| 2991 | − port.iobase = p->iobase; | |
| 2992 | − port.membase = p->membase; | |
| 2993 | − port.irq = p->irq; | |
| 2994 | − port.irqflags = p->irqflags; | |
| 2995 | − port.uartclk = p->uartclk; | |
| 2996 | − port.regshift = p->regshift; | |
| 2997 | − port.iotype = p->iotype; | |
| 2998 | − port.flags = p->flags; | |
| 2999 | − port.mapbase = p->mapbase; | |
| 3000 | − port.hub6 = p->hub6; | |
| 3001 | − port.private_data = p->private_data; | |
| 3002 | − port.type = p->type; | |
| 3003 | − port.serial_in = p->serial_in; | |
| 3004 | − port.serial_out = p->serial_out; | |
| 3005 | − port.handle_irq = p->handle_irq; | |
| 3006 | − port.handle_break = p->handle_break; | |
| 3007 | − port.set_termios = p->set_termios; | |
| 3008 | − port.pm = p->pm; | |
| 3009 | − port.dev = &dev->dev; | |
| 3010 | − port.irqflags |= irqflag; | |
| 3011 | − ret = serial8250_register_port(&port); | |
| 2995 | + uart.port.iobase = p->iobase; | |
| 2996 | + uart.port.membase = p->membase; | |
| 2997 | + uart.port.irq = p->irq; | |
| 2998 | + uart.port.irqflags = p->irqflags; | |
| 2999 | + uart.port.uartclk = p->uartclk; | |
| 3000 | + uart.port.regshift = p->regshift; | |
| 3001 | + uart.port.iotype = p->iotype; | |
| 3002 | + uart.port.flags = p->flags; | |
| 3003 | + uart.port.mapbase = p->mapbase; | |
| 3004 | + uart.port.hub6 = p->hub6; | |
| 3005 | + uart.port.private_data = p->private_data; | |
| 3006 | + uart.port.type = p->type; | |
| 3007 | + uart.port.serial_in = p->serial_in; | |
| 3008 | + uart.port.serial_out = p->serial_out; | |
| 3009 | + uart.port.handle_irq = p->handle_irq; | |
| 3010 | + uart.port.handle_break = p->handle_break; | |
| 3011 | + uart.port.set_termios = p->set_termios; | |
| 3012 | + uart.port.pm = p->pm; | |
| 3013 | + uart.port.dev = &dev->dev; | |
| 3014 | + uart.port.irqflags |= irqflag; | |
| 3015 | + ret = serial8250_register_8250_port(&uart); | |
| 3012 | 3016 | if (ret < 0) { |
| 3013 | 3017 | dev_err(&dev->dev, "unable to register port at index %d " |
| 3014 | 3018 | "(IO%lx MEM%llx IRQ%d): %d\n", i, |
| @@ -3081,7 +3085,7 @@ static struct platform_driver serial8250_isa_driver = { · 66 unmodified lines | ||
| 3081 | 3085 | static struct platform_device *serial8250_isa_devs; |
| 3082 | 3086 | |
| 3083 | 3087 | /* |
| 3084 | − * serial8250_register_port and serial8250_unregister_port allows for | |
| 3088 | + * serial8250_register_8250_port and serial8250_unregister_port allows for | |
| 3085 | 3089 | * 16x50 serial ports to be configured at run-time, to support PCMCIA |
| 3086 | 3090 | * modems and PCI multiport cards. |
| 3087 | 3091 | */ |
| @@ -3155,6 +3159,7 @@ int serial8250_register_8250_port(struct uart_8250_port *up) · 67 unmodified lines | ||
| 3155 | 3159 | uart->port.regshift = up->port.regshift; |
| 3156 | 3160 | uart->port.iotype = up->port.iotype; |
| 3157 | 3161 | uart->port.flags = up->port.flags | UPF_BOOT_AUTOCONF; |
| 3162 | + uart->bugs = up->bugs; | |
| 3158 | 3163 | uart->port.mapbase = up->port.mapbase; |
| 3159 | 3164 | uart->port.private_data = up->port.private_data; |
| 3160 | 3165 | if (up->port.dev) |
| @@ -3197,29 +3202,6 @@ int serial8250_register_8250_port(struct uart_8250_port *up) · 36 unmodified lines | ||
| 3197 | 3202 | } |
| 3198 | 3203 | EXPORT_SYMBOL(serial8250_register_8250_port); |
| 3199 | 3204 | |
| 3200 | −/** | |
| 3201 | − * serial8250_register_port - register a serial port | |
| 3202 | − * @port: serial port template | |
| 3203 | − * | |
| 3204 | − * Configure the serial port specified by the request. If the | |
| 3205 | − * port exists and is in use, it is hung up and unregistered | |
| 3206 | − * first. | |
| 3207 | − * | |
| 3208 | − * The port is then probed and if necessary the IRQ is autodetected | |
| 3209 | − * If this fails an error is returned. | |
| 3210 | − * | |
| 3211 | − * On success the port is ready to use and the line number is returned. | |
| 3212 | − */ | |
| 3213 | −int serial8250_register_port(struct uart_port *port) | |
| 3214 | −{ | |
| 3215 | − struct uart_8250_port up; | |
| 3216 | − | |
| 3217 | − memset(&up, 0, sizeof(up)); | |
| 3218 | − memcpy(&up.port, port, sizeof(*port)); | |
| 3219 | − return serial8250_register_8250_port(&up); | |
| 3220 | −} | |
| 3221 | −EXPORT_SYMBOL(serial8250_register_port); | |
| 3222 | − | |
| 3223 | 3205 | /** |
| 3224 | 3206 | * serial8250_unregister_port - remove a 16x50 serial port at runtime |
| 3225 | 3207 | * @line: serial line number |
| @@ -13,36 +13,6 @@ · 12 unmodified lines | ||
| 13 | 13 | |
| 14 | 14 | #include <linux/serial_8250.h> |
| 15 | 15 | |
| 16 | −struct uart_8250_port { | |
| 17 | − struct uart_port port; | |
| 18 | − struct timer_list timer; /* "no irq" timer */ | |
| 19 | − struct list_head list; /* ports on this IRQ */ | |
| 20 | − unsigned short capabilities; /* port capabilities */ | |
| 21 | − unsigned short bugs; /* port bugs */ | |
| 22 | − unsigned int tx_loadsz; /* transmit fifo load size */ | |
| 23 | − unsigned char acr; | |
| 24 | − unsigned char ier; | |
| 25 | − unsigned char lcr; | |
| 26 | − unsigned char mcr; | |
| 27 | − unsigned char mcr_mask; /* mask of user bits */ | |
| 28 | − unsigned char mcr_force; /* mask of forced bits */ | |
| 29 | − unsigned char cur_iotype; /* Running I/O type */ | |
| 30 | − | |
| 31 | − /* | |
| 32 | − * Some bits in registers are cleared on a read, so they must | |
| 33 | − * be saved whenever the register is read but the bits will not | |
| 34 | − * be immediately processed. | |
| 35 | − */ | |
| 36 | −#define LSR_SAVE_FLAGS UART_LSR_BRK_ERROR_BITS | |
| 37 | − unsigned char lsr_saved_flags; | |
| 38 | −#define MSR_SAVE_FLAGS UART_MSR_ANY_DELTA | |
| 39 | − unsigned char msr_saved_flags; | |
| 40 | − | |
| 41 | − /* 8250 specific callbacks */ | |
| 42 | − int (*dl_read)(struct uart_8250_port *); | |
| 43 | − void (*dl_write)(struct uart_8250_port *, int); | |
| 44 | −}; | |
| 45 | − | |
| 46 | 16 | struct old_serial_port { |
| 47 | 17 | unsigned int uart; |
| 48 | 18 | unsigned int baud_base; |
| @@ -56,9 +26,6 @@ struct old_serial_port { · 7 unmodified lines | ||
| 56 | 26 | unsigned long irqflags; |
| 57 | 27 | }; |
| 58 | 28 | |
| 59 | −/* | |
| 60 | − * This replaces serial_uart_config in include/linux/serial.h | |
| 61 | − */ | |
| 62 | 29 | struct serial8250_config { |
| 63 | 30 | const char *name; |
| 64 | 31 | unsigned short fifo_size; |
| @@ -78,6 +45,7 @@ struct serial8250_config { · 13 unmodified lines | ||
| 78 | 45 | #define UART_BUG_TXEN (1 << 1) /* UART has buggy TX IIR status */ |
| 79 | 46 | #define UART_BUG_NOMSR (1 << 2) /* UART has buggy MSR status bits (Au1x00) */ |
| 80 | 47 | #define UART_BUG_THRE (1 << 3) /* UART has buggy THRE reassertion */ |
| 48 | +#define UART_BUG_PARITY (1 << 4) /* UART mishandles parity if FIFO enabled */ | |
| 81 | 49 | |
| 82 | 50 | #define PROBE_RSA (1 << 0) |
| 83 | 51 | #define PROBE_ANY (~0) |
| @@ -43,7 +43,7 @@ serial_card_probe(struct expansion_card *ec, const struct ecard_id *id) · 42 unmodified lines | ||
| 43 | 43 | { |
| 44 | 44 | struct serial_card_info *info; |
| 45 | 45 | struct serial_card_type *type = id->data; |
| 46 | − struct uart_port port; | |
| 46 | + struct uart_8250_port uart; | |
| 47 | 47 | unsigned long bus_addr; |
| 48 | 48 | unsigned int i; |
| 49 | 49 | |
| @@ -62,19 +62,19 @@ serial_card_probe(struct expansion_card *ec, const struct ecard_id *id) · 12 unmodified lines | ||
| 62 | 62 | |
| 63 | 63 | ecard_set_drvdata(ec, info); |
| 64 | 64 | |
| 65 | − memset(&port, 0, sizeof(struct uart_port)); | |
| 66 | − port.irq = ec->irq; | |
| 67 | − port.flags = UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ; | |
| 68 | − port.uartclk = type->uartclk; | |
| 69 | − port.iotype = UPIO_MEM; | |
| 70 | − port.regshift = 2; | |
| 71 | − port.dev = &ec->dev; | |
| 65 | + memset(&uart, 0, sizeof(struct uart_8250_port)); | |
| 66 | + uart.port.irq = ec->irq; | |
| 67 | + uart.port.flags = UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ; | |
| 68 | + uart.port.uartclk = type->uartclk; | |
| 69 | + uart.port.iotype = UPIO_MEM; | |
| 70 | + uart.port.regshift = 2; | |
| 71 | + uart.port.dev = &ec->dev; | |
| 72 | 72 | |
| 73 | 73 | for (i = 0; i < info->num_ports; i ++) { |
| 74 | − port.membase = info->vaddr + type->offset[i]; | |
| 75 | − port.mapbase = bus_addr + type->offset[i]; | |
| 74 | + uart.port.membase = info->vaddr + type->offset[i]; | |
| 75 | + uart.port.mapbase = bus_addr + type->offset[i]; | |
| 76 | 76 | |
| 77 | − info->ports[i] = serial8250_register_port(&port); | |
| 77 | + info->ports[i] = serial8250_register_8250_port(&uart); | |
| 78 | 78 | } |
| 79 | 79 | |
| 80 | 80 | return 0; |
| @@ -89,7 +89,7 @@ static int dw8250_handle_irq(struct uart_port *p) · 88 unmodified lines | ||
| 89 | 89 | |
| 90 | 90 | static int __devinit dw8250_probe(struct platform_device *pdev) |
| 91 | 91 | { |
| 92 | − struct uart_port port = {}; | |
| 92 | + struct uart_8250_port uart = {}; | |
| 93 | 93 | struct resource *regs = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 94 | 94 | struct resource *irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0); |
| 95 | 95 | struct device_node *np = pdev->dev.of_node; |
| @@ -104,28 +104,28 @@ static int __devinit dw8250_probe(struct platform_device *pdev) · 8 unmodified lines | ||
| 104 | 104 | data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); |
| 105 | 105 | if (!data) |
| 106 | 106 | return -ENOMEM; |
| 107 | − port.private_data = data; | |
| 108 | − | |
| 109 | − spin_lock_init(&port.lock); | |
| 110 | − port.mapbase = regs->start; | |
| 111 | − port.irq = irq->start; | |
| 112 | − port.handle_irq = dw8250_handle_irq; | |
| 113 | − port.type = PORT_8250; | |
| 114 | − port.flags = UPF_SHARE_IRQ | UPF_BOOT_AUTOCONF | UPF_IOREMAP | | |
| 107 | + uart.port.private_data = data; | |
| 108 | + | |
| 109 | + spin_lock_init(&uart.port.lock); | |
| 110 | + uart.port.mapbase = regs->start; | |
| 111 | + uart.port.irq = irq->start; | |
| 112 | + uart.port.handle_irq = dw8250_handle_irq; | |
| 113 | + uart.port.type = PORT_8250; | |
| 114 | + uart.port.flags = UPF_SHARE_IRQ | UPF_BOOT_AUTOCONF | UPF_IOREMAP | | |
| 115 | 115 | UPF_FIXED_PORT | UPF_FIXED_TYPE; |
| 116 | − port.dev = &pdev->dev; | |
| 116 | + uart.port.dev = &pdev->dev; | |
| 117 | 117 | |
| 118 | − port.iotype = UPIO_MEM; | |
| 119 | − port.serial_in = dw8250_serial_in; | |
| 120 | − port.serial_out = dw8250_serial_out; | |
| 118 | + uart.port.iotype = UPIO_MEM; | |
| 119 | + uart.port.serial_in = dw8250_serial_in; | |
| 120 | + uart.port.serial_out = dw8250_serial_out; | |
| 121 | 121 | if (!of_property_read_u32(np, "reg-io-width", &val)) { |
| 122 | 122 | switch (val) { |
| 123 | 123 | case 1: |
| 124 | 124 | break; |
| 125 | 125 | case 4: |
| 126 | − port.iotype = UPIO_MEM32; | |
| 127 | − port.serial_in = dw8250_serial_in32; | |
| 128 | − port.serial_out = dw8250_serial_out32; | |
| 126 | + uart.port.iotype = UPIO_MEM32; | |
| 127 | + uart.port.serial_in = dw8250_serial_in32; | |
| 128 | + uart.port.serial_out = dw8250_serial_out32; | |
| 129 | 129 | break; |
| 130 | 130 | default: |
| 131 | 131 | dev_err(&pdev->dev, "unsupported reg-io-width (%u)\n", |
| @@ -135,15 +135,15 @@ static int __devinit dw8250_probe(struct platform_device *pdev) · 3 unmodified lines | ||
| 135 | 135 | } |
| 136 | 136 | |
| 137 | 137 | if (!of_property_read_u32(np, "reg-shift", &val)) |
| 138 | − port.regshift = val; | |
| 138 | + uart.port.regshift = val; | |
| 139 | 139 | |
| 140 | 140 | if (of_property_read_u32(np, "clock-frequency", &val)) { |
| 141 | 141 | dev_err(&pdev->dev, "no clock-frequency property set\n"); |
| 142 | 142 | return -EINVAL; |
| 143 | 143 | } |
| 144 | − port.uartclk = val; | |
| 144 | + uart.port.uartclk = val; | |
| 145 | 145 | |
| 146 | − data->line = serial8250_register_port(&port); | |
| 146 | + data->line = serial8250_register_8250_port(&uart); | |
| 147 | 147 | if (data->line < 0) |
| 148 | 148 | return data->line; |
| 149 | 149 | |
| @@ -26,7 +26,7 @@ · 25 unmodified lines | ||
| 26 | 26 | |
| 27 | 27 | static int __init serial_init_chip(struct parisc_device *dev) |
| 28 | 28 | { |
| 29 | − struct uart_port port; | |
| 29 | + struct uart_8250_port uart; | |
| 30 | 30 | unsigned long address; |
| 31 | 31 | int err; |
| 32 | 32 | |
| @@ -48,21 +48,21 @@ static int __init serial_init_chip(struct parisc_device *dev) · 15 unmodified lines | ||
| 48 | 48 | if (dev->id.sversion != 0x8d) |
| 49 | 49 | address += 0x800; |
| 50 | 50 | |
| 51 | − memset(&port, 0, sizeof(port)); | |
| 52 | − port.iotype = UPIO_MEM; | |
| 51 | + memset(&uart, 0, sizeof(uart)); | |
| 52 | + uart.port.iotype = UPIO_MEM; | |
| 53 | 53 | /* 7.272727MHz on Lasi. Assumed the same for Dino, Wax and Timi. */ |
| 54 | − port.uartclk = 7272727; | |
| 55 | − port.mapbase = address; | |
| 56 | − port.membase = ioremap_nocache(address, 16); | |
| 57 | − port.irq = dev->irq; | |
| 58 | − port.flags = UPF_BOOT_AUTOCONF; | |
| 59 | − port.dev = &dev->dev; | |
| 60 | − | |
| 61 | − err = serial8250_register_port(&port); | |
| 54 | + uart.port.uartclk = 7272727; | |
| 55 | + uart.port.mapbase = address; | |
| 56 | + uart.port.membase = ioremap_nocache(address, 16); | |
| 57 | + uart.port.irq = dev->irq; | |
| 58 | + uart.port.flags = UPF_BOOT_AUTOCONF; | |
| 59 | + uart.port.dev = &dev->dev; | |
| 60 | + | |
| 61 | + err = serial8250_register_8250_port(&uart); | |
| 62 | 62 | if (err < 0) { |
| 63 | 63 | printk(KERN_WARNING |
| 64 | − "serial8250_register_port returned error %d\n", err); | |
| 65 | − iounmap(port.membase); | |
| 64 | + "serial8250_register_8250_port returned error %d\n", err); | |
| 65 | + iounmap(uart.port.membase); | |
| 66 | 66 | return err; |
| 67 | 67 | } |
| 68 | 68 | |
| @@ -171,7 +171,7 @@ static int __devinit hpdca_init_one(struct dio_dev *d, · 170 unmodified lines | ||
| 171 | 171 | return 0; |
| 172 | 172 | } |
| 173 | 173 | #endif |
| 174 | − memset(&port, 0, sizeof(struct uart_port)); | |
| 174 | + memset(&uart, 0, sizeof(uart)); | |
| 175 | 175 | |
| 176 | 176 | /* Memory mapped I/O */ |
| 177 | 177 | port.iotype = UPIO_MEM; |
| @@ -182,7 +182,7 @@ static int __devinit hpdca_init_one(struct dio_dev *d, · 4 unmodified lines | ||
| 182 | 182 | port.membase = (char *)(port.mapbase + DIO_VIRADDRBASE); |
| 183 | 183 | port.regshift = 1; |
| 184 | 184 | port.dev = &d->dev; |
| 185 | − line = serial8250_register_port(&port); | |
| 185 | + line = serial8250_register_8250_port(&uart); | |
| 186 | 186 | |
| 187 | 187 | if (line < 0) { |
| 188 | 188 | printk(KERN_NOTICE "8250_hp300: register_serial() DCA scode %d" |
| @@ -210,7 +210,7 @@ static int __init hp300_8250_init(void) · 21 unmodified lines | ||
| 210 | 210 | #ifdef CONFIG_HPAPCI |
| 211 | 211 | int line; |
| 212 | 212 | unsigned long base; |
| 213 | − struct uart_port uport; | |
| 213 | + struct uart_8250_port uart; | |
| 214 | 214 | struct hp300_port *port; |
| 215 | 215 | int i; |
| 216 | 216 | #endif |
| @@ -248,26 +248,26 @@ static int __init hp300_8250_init(void) · 31 unmodified lines | ||
| 248 | 248 | if (!port) |
| 249 | 249 | return -ENOMEM; |
| 250 | 250 | |
| 251 | − memset(&uport, 0, sizeof(struct uart_port)); | |
| 251 | + memset(&uart, 0, sizeof(uart)); | |
| 252 | 252 | |
| 253 | 253 | base = (FRODO_BASE + FRODO_APCI_OFFSET(i)); |
| 254 | 254 | |
| 255 | 255 | /* Memory mapped I/O */ |
| 256 | − uport.iotype = UPIO_MEM; | |
| 257 | − uport.flags = UPF_SKIP_TEST | UPF_SHARE_IRQ \ | |
| 256 | + uart.port.iotype = UPIO_MEM; | |
| 257 | + uart.port.flags = UPF_SKIP_TEST | UPF_SHARE_IRQ \ | |
| 258 | 258 | | UPF_BOOT_AUTOCONF; |
| 259 | 259 | /* XXX - no interrupt support yet */ |
| 260 | − uport.irq = 0; | |
| 261 | − uport.uartclk = HPAPCI_BAUD_BASE * 16; | |
| 262 | − uport.mapbase = base; | |
| 263 | − uport.membase = (char *)(base + DIO_VIRADDRBASE); | |
| 264 | − uport.regshift = 2; | |
| 260 | + uart.port.irq = 0; | |
| 261 | + uart.port.uartclk = HPAPCI_BAUD_BASE * 16; | |
| 262 | + uart.port.mapbase = base; | |
| 263 | + uart.port.membase = (char *)(base + DIO_VIRADDRBASE); | |
| 264 | + uart.port.regshift = 2; | |
| 265 | 265 | |
| 266 | − line = serial8250_register_port(&uport); | |
| 266 | + line = serial8250_register_8250_port(&uart); | |
| 267 | 267 | |
| 268 | 268 | if (line < 0) { |
| 269 | 269 | printk(KERN_NOTICE "8250_hp300: register_serial() APCI" |
| 270 | − " %d irq %d failed\n", i, uport.irq); | |
| 270 | + " %d irq %d failed\n", i, uart.port.irq); | |
| 271 | 271 | kfree(port); |
| 272 | 272 | continue; |
| 273 | 273 | } |
| @@ -44,7 +44,7 @@ struct pci_serial_quirk { · 43 unmodified lines | ||
| 44 | 44 | int (*init)(struct pci_dev *dev); |
| 45 | 45 | int (*setup)(struct serial_private *, |
| 46 | 46 | const struct pciserial_board *, |
| 47 | − struct uart_port *, int); | |
| 47 | + struct uart_8250_port *, int); | |
| 48 | 48 | void (*exit)(struct pci_dev *dev); |
| 49 | 49 | }; |
| 50 | 50 | |
| @@ -59,7 +59,7 @@ struct serial_private { · 8 unmodified lines | ||
| 59 | 59 | }; |
| 60 | 60 | |
| 61 | 61 | static int pci_default_setup(struct serial_private*, |
| 62 | − const struct pciserial_board*, struct uart_port*, int); | |
| 62 | + const struct pciserial_board*, struct uart_8250_port *, int); | |
| 63 | 63 | |
| 64 | 64 | static void moan_device(const char *str, struct pci_dev *dev) |
| 65 | 65 | { |
| @@ -74,7 +74,7 @@ static void moan_device(const char *str, struct pci_dev *dev) · 8 unmodified lines | ||
| 74 | 74 | } |
| 75 | 75 | |
| 76 | 76 | static int |
| 77 | −setup_port(struct serial_private *priv, struct uart_port *port, | |
| 77 | +setup_port(struct serial_private *priv, struct uart_8250_port *port, | |
| 78 | 78 | int bar, int offset, int regshift) |
| 79 | 79 | { |
| 80 | 80 | struct pci_dev *dev = priv->dev; |
| @@ -93,17 +93,17 @@ setup_port(struct serial_private *priv, struct uart_port *port, · 12 unmodified lines | ||
| 93 | 93 | if (!priv->remapped_bar[bar]) |
| 94 | 94 | return -ENOMEM; |
| 95 | 95 | |
| 96 | − port->iotype = UPIO_MEM; | |
| 97 | − port->iobase = 0; | |
| 98 | − port->mapbase = base + offset; | |
| 99 | − port->membase = priv->remapped_bar[bar] + offset; | |
| 100 | − port->regshift = regshift; | |
| 96 | + port->port.iotype = UPIO_MEM; | |
| 97 | + port->port.iobase = 0; | |
| 98 | + port->port.mapbase = base + offset; | |
| 99 | + port->port.membase = priv->remapped_bar[bar] + offset; | |
| 100 | + port->port.regshift = regshift; | |
| 101 | 101 | } else { |
| 102 | − port->iotype = UPIO_PORT; | |
| 103 | − port->iobase = base + offset; | |
| 104 | − port->mapbase = 0; | |
| 105 | − port->membase = NULL; | |
| 106 | − port->regshift = 0; | |
| 102 | + port->port.iotype = UPIO_PORT; | |
| 103 | + port->port.iobase = base + offset; | |
| 104 | + port->port.mapbase = 0; | |
| 105 | + port->port.membase = NULL; | |
| 106 | + port->port.regshift = 0; | |
| 107 | 107 | } |
| 108 | 108 | return 0; |
| 109 | 109 | } |
| @@ -113,7 +113,7 @@ setup_port(struct serial_private *priv, struct uart_port *port, · 3 unmodified lines | ||
| 113 | 113 | */ |
| 114 | 114 | static int addidata_apci7800_setup(struct serial_private *priv, |
| 115 | 115 | const struct pciserial_board *board, |
| 116 | − struct uart_port *port, int idx) | |
| 116 | + struct uart_8250_port *port, int idx) | |
| 117 | 117 | { |
| 118 | 118 | unsigned int bar = 0, offset = board->first_offset; |
| 119 | 119 | bar = FL_GET_BASE(board->flags); |
| @@ -140,7 +140,7 @@ static int addidata_apci7800_setup(struct serial_private *priv, · 20 unmodified lines | ||
| 140 | 140 | */ |
| 141 | 141 | static int |
| 142 | 142 | afavlab_setup(struct serial_private *priv, const struct pciserial_board *board, |
| 143 | − struct uart_port *port, int idx) | |
| 143 | + struct uart_8250_port *port, int idx) | |
| 144 | 144 | { |
| 145 | 145 | unsigned int bar, offset = board->first_offset; |
| 146 | 146 | |
| @@ -195,7 +195,7 @@ static int pci_hp_diva_init(struct pci_dev *dev) · 48 unmodified lines | ||
| 195 | 195 | static int |
| 196 | 196 | pci_hp_diva_setup(struct serial_private *priv, |
| 197 | 197 | const struct pciserial_board *board, |
| 198 | − struct uart_port *port, int idx) | |
| 198 | + struct uart_8250_port *port, int idx) | |
| 199 | 199 | { |
| 200 | 200 | unsigned int offset = board->first_offset; |
| 201 | 201 | unsigned int bar = FL_GET_BASE(board->flags); |
| @@ -370,7 +370,7 @@ static void __devexit pci_ni8430_exit(struct pci_dev *dev) · 168 unmodified lines | ||
| 370 | 370 | /* SBS Technologies Inc. PMC-OCTPRO and P-OCTAL cards */ |
| 371 | 371 | static int |
| 372 | 372 | sbs_setup(struct serial_private *priv, const struct pciserial_board *board, |
| 373 | − struct uart_port *port, int idx) | |
| 373 | + struct uart_8250_port *port, int idx) | |
| 374 | 374 | { |
| 375 | 375 | unsigned int bar, offset = board->first_offset; |
| 376 | 376 | |
| @@ -525,7 +525,7 @@ static int pci_siig_init(struct pci_dev *dev) · 148 unmodified lines | ||
| 525 | 525 | |
| 526 | 526 | static int pci_siig_setup(struct serial_private *priv, |
| 527 | 527 | const struct pciserial_board *board, |
| 528 | − struct uart_port *port, int idx) | |
| 528 | + struct uart_8250_port *port, int idx) | |
| 529 | 529 | { |
| 530 | 530 | unsigned int bar = FL_GET_BASE(board->flags) + idx, offset = 0; |
| 531 | 531 | |
| @@ -619,7 +619,7 @@ static int pci_timedia_init(struct pci_dev *dev) · 87 unmodified lines | ||
| 619 | 619 | static int |
| 620 | 620 | pci_timedia_setup(struct serial_private *priv, |
| 621 | 621 | const struct pciserial_board *board, |
| 622 | − struct uart_port *port, int idx) | |
| 622 | + struct uart_8250_port *port, int idx) | |
| 623 | 623 | { |
| 624 | 624 | unsigned int bar = 0, offset = board->first_offset; |
| 625 | 625 | |
| @@ -653,7 +653,7 @@ pci_timedia_setup(struct serial_private *priv, · 27 unmodified lines | ||
| 653 | 653 | static int |
| 654 | 654 | titan_400l_800l_setup(struct serial_private *priv, |
| 655 | 655 | const struct pciserial_board *board, |
| 656 | − struct uart_port *port, int idx) | |
| 656 | + struct uart_8250_port *port, int idx) | |
| 657 | 657 | { |
| 658 | 658 | unsigned int bar, offset = board->first_offset; |
| 659 | 659 | |
| @@ -754,7 +754,7 @@ static int pci_ni8430_init(struct pci_dev *dev) · 94 unmodified lines | ||
| 754 | 754 | static int |
| 755 | 755 | pci_ni8430_setup(struct serial_private *priv, |
| 756 | 756 | const struct pciserial_board *board, |
| 757 | − struct uart_port *port, int idx) | |
| 757 | + struct uart_8250_port *port, int idx) | |
| 758 | 758 | { |
| 759 | 759 | void __iomem *p; |
| 760 | 760 | unsigned long base, len; |
| @@ -781,7 +781,7 @@ pci_ni8430_setup(struct serial_private *priv, · 20 unmodified lines | ||
| 781 | 781 | |
| 782 | 782 | static int pci_netmos_9900_setup(struct serial_private *priv, |
| 783 | 783 | const struct pciserial_board *board, |
| 784 | − struct uart_port *port, int idx) | |
| 784 | + struct uart_8250_port *port, int idx) | |
| 785 | 785 | { |
| 786 | 786 | unsigned int bar; |
| 787 | 787 | |
| @@ -1032,10 +1032,17 @@ static int pci_oxsemi_tornado_init(struct pci_dev *dev) · 244 unmodified lines | ||
| 1032 | 1032 | return number_uarts; |
| 1033 | 1033 | } |
| 1034 | 1034 | |
| 1035 | −static int | |
| 1036 | −pci_default_setup(struct serial_private *priv, | |
| 1035 | +static int pci_asix_setup(struct serial_private *priv, | |
| 1037 | 1036 | const struct pciserial_board *board, |
| 1038 | − struct uart_port *port, int idx) | |
| 1037 | + struct uart_8250_port *port, int idx) | |
| 1038 | +{ | |
| 1039 | + port->bugs |= UART_BUG_PARITY; | |
| 1040 | + return pci_default_setup(priv, board, port, idx); | |
| 1041 | +} | |
| 1042 | + | |
| 1043 | +static int pci_default_setup(struct serial_private *priv, | |
| 1044 | + const struct pciserial_board *board, | |
| 1045 | + struct uart_8250_port *port, int idx) | |
| 1039 | 1046 | { |
| 1040 | 1047 | unsigned int bar, offset = board->first_offset, maxnr; |
| 1041 | 1048 | |
| @@ -1057,15 +1064,15 @@ pci_default_setup(struct serial_private *priv, · 15 unmodified lines | ||
| 1057 | 1064 | static int |
| 1058 | 1065 | ce4100_serial_setup(struct serial_private *priv, |
| 1059 | 1066 | const struct pciserial_board *board, |
| 1060 | − struct uart_port *port, int idx) | |
| 1067 | + struct uart_8250_port *port, int idx) | |
| 1061 | 1068 | { |
| 1062 | 1069 | int ret; |
| 1063 | 1070 | |
| 1064 | 1071 | ret = setup_port(priv, port, 0, 0, board->reg_shift); |
| 1065 | − port->iotype = UPIO_MEM32; | |
| 1066 | − port->type = PORT_XSCALE; | |
| 1067 | − port->flags = (port->flags | UPF_FIXED_PORT | UPF_FIXED_TYPE); | |
| 1068 | − port->regshift = 2; | |
| 1072 | + port->port.iotype = UPIO_MEM32; | |
| 1073 | + port->port.type = PORT_XSCALE; | |
| 1074 | + port->port.flags = (port->port.flags | UPF_FIXED_PORT | UPF_FIXED_TYPE); | |
| 1075 | + port->port.regshift = 2; | |
| 1069 | 1076 | |
| 1070 | 1077 | return ret; |
| 1071 | 1078 | } |
| @@ -1073,16 +1080,16 @@ ce4100_serial_setup(struct serial_private *priv, · 1 unmodified line | ||
| 1073 | 1080 | static int |
| 1074 | 1081 | pci_omegapci_setup(struct serial_private *priv, |
| 1075 | 1082 | const struct pciserial_board *board, |
| 1076 | − struct uart_port *port, int idx) | |
| 1083 | + struct uart_8250_port *port, int idx) | |
| 1077 | 1084 | { |
| 1078 | 1085 | return setup_port(priv, port, 2, idx * 8, 0); |
| 1079 | 1086 | } |
| 1080 | 1087 | |
| 1081 | 1088 | static int skip_tx_en_setup(struct serial_private *priv, |
| 1082 | 1089 | const struct pciserial_board *board, |
| 1083 | − struct uart_port *port, int idx) | |
| 1090 | + struct uart_8250_port *port, int idx) | |
| 1084 | 1091 | { |
| 1085 | − port->flags |= UPF_NO_TXEN_TEST; | |
| 1092 | + port->port.flags |= UPF_NO_TXEN_TEST; | |
| 1086 | 1093 | printk(KERN_DEBUG "serial8250: skipping TxEn test for device " |
| 1087 | 1094 | "[%04x:%04x] subsystem [%04x:%04x]\n", |
| 1088 | 1095 | priv->dev->vendor, |
| @@ -1131,11 +1138,11 @@ static unsigned int kt_serial_in(struct uart_port *p, int offset) · 42 unmodified lines | ||
| 1131 | 1138 | |
| 1132 | 1139 | static int kt_serial_setup(struct serial_private *priv, |
| 1133 | 1140 | const struct pciserial_board *board, |
| 1134 | − struct uart_port *port, int idx) | |
| 1141 | + struct uart_8250_port *port, int idx) | |
| 1135 | 1142 | { |
| 1136 | − port->flags |= UPF_BUG_THRE; | |
| 1137 | − port->serial_in = kt_serial_in; | |
| 1138 | − port->handle_break = kt_handle_break; | |
| 1143 | + port->port.flags |= UPF_BUG_THRE; | |
| 1144 | + port->port.serial_in = kt_serial_in; | |
| 1145 | + port->port.handle_break = kt_handle_break; | |
| 1139 | 1146 | return skip_tx_en_setup(priv, board, port, idx); |
| 1140 | 1147 | } |
| 1141 | 1148 | |
| @@ -1151,9 +1158,19 @@ static int pci_eg20t_init(struct pci_dev *dev) · 9 unmodified lines | ||
| 1151 | 1158 | static int |
| 1152 | 1159 | pci_xr17c154_setup(struct serial_private *priv, |
| 1153 | 1160 | const struct pciserial_board *board, |
| 1154 | − struct uart_port *port, int idx) | |
| 1161 | + struct uart_8250_port *port, int idx) | |
| 1162 | +{ | |
| 1163 | + port->port.flags |= UPF_EXAR_EFR; | |
| 1164 | + return pci_default_setup(priv, board, port, idx); | |
| 1165 | +} | |
| 1166 | + | |
| 1167 | +static int | |
| 1168 | +pci_wch_ch353_setup(struct serial_private *priv, | |
| 1169 | + const struct pciserial_board *board, | |
| 1170 | + struct uart_8250_port *port, int idx) | |
| 1155 | 1171 | { |
| 1156 | − port->flags |= UPF_EXAR_EFR; | |
| 1172 | + port->port.flags |= UPF_FIXED_TYPE; | |
| 1173 | + port->port.type = PORT_16550A; | |
| 1157 | 1174 | return pci_default_setup(priv, board, port, idx); |
| 1158 | 1175 | } |
| 1159 | 1176 | |
| @@ -1187,6 +1204,13 @@ pci_xr17c154_setup(struct serial_private *priv, · 27 unmodified lines | ||
| 1187 | 1204 | #define PCIE_DEVICE_ID_NEO_2_OX_IBM 0x00F6 |
| 1188 | 1205 | #define PCI_DEVICE_ID_PLX_CRONYX_OMEGA 0xc001 |
| 1189 | 1206 | #define PCI_DEVICE_ID_INTEL_PATSBURG_KT 0x1d3d |
| 1207 | +#define PCI_VENDOR_ID_WCH 0x4348 | |
| 1208 | +#define PCI_DEVICE_ID_WCH_CH353_4S 0x3453 | |
| 1209 | +#define PCI_DEVICE_ID_WCH_CH353_2S1PF 0x5046 | |
| 1210 | +#define PCI_DEVICE_ID_WCH_CH353_2S1P 0x7053 | |
| 1211 | +#define PCI_VENDOR_ID_AGESTAR 0x5372 | |
| 1212 | +#define PCI_DEVICE_ID_AGESTAR_9375 0x6872 | |
| 1213 | +#define PCI_VENDOR_ID_ASIX 0x9710 | |
| 1190 | 1214 | |
| 1191 | 1215 | /* Unknown vendors/cards - this should not be in linux/pci_ids.h */ |
| 1192 | 1216 | #define PCI_SUBDEVICE_ID_UNKNOWN_0x1584 0x1584 |
| @@ -1726,7 +1750,41 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = { · 533 unmodified lines | ||
| 1726 | 1750 | .subvendor = PCI_ANY_ID, |
| 1727 | 1751 | .subdevice = PCI_ANY_ID, |
| 1728 | 1752 | .setup = pci_omegapci_setup, |
| 1729 | − }, | |
| 1753 | + }, | |
| 1754 | + /* WCH CH353 2S1P card (16550 clone) */ | |
| 1755 | + { | |
| 1756 | + .vendor = PCI_VENDOR_ID_WCH, | |
| 1757 | + .device = PCI_DEVICE_ID_WCH_CH353_2S1P, | |
| 1758 | + .subvendor = PCI_ANY_ID, | |
| 1759 | + .subdevice = PCI_ANY_ID, | |
| 1760 | + .setup = pci_wch_ch353_setup, | |
| 1761 | + }, | |
| 1762 | + /* WCH CH353 4S card (16550 clone) */ | |
| 1763 | + { | |
| 1764 | + .vendor = PCI_VENDOR_ID_WCH, | |
| 1765 | + .device = PCI_DEVICE_ID_WCH_CH353_4S, | |
| 1766 | + .subvendor = PCI_ANY_ID, | |
| 1767 | + .subdevice = PCI_ANY_ID, | |
| 1768 | + .setup = pci_wch_ch353_setup, | |
| 1769 | + }, | |
| 1770 | + /* WCH CH353 2S1PF card (16550 clone) */ | |
| 1771 | + { | |
| 1772 | + .vendor = PCI_VENDOR_ID_WCH, | |
| 1773 | + .device = PCI_DEVICE_ID_WCH_CH353_2S1PF, | |
| 1774 | + .subvendor = PCI_ANY_ID, | |
| 1775 | + .subdevice = PCI_ANY_ID, | |
| 1776 | + .setup = pci_wch_ch353_setup, | |
| 1777 | + }, | |
| 1778 | + /* | |
| 1779 | + * ASIX devices with FIFO bug | |
| 1780 | + */ | |
| 1781 | + { | |
| 1782 | + .vendor = PCI_VENDOR_ID_ASIX, | |
| 1783 | + .device = PCI_ANY_ID, | |
| 1784 | + .subvendor = PCI_ANY_ID, | |
| 1785 | + .subdevice = PCI_ANY_ID, | |
| 1786 | + .setup = pci_asix_setup, | |
| 1787 | + }, | |
| 1730 | 1788 | /* |
| 1731 | 1789 | * Default "match everything" terminator entry |
| 1732 | 1790 | */ |
| @@ -1887,7 +1945,6 @@ enum pci_board_num_t { · 154 unmodified lines | ||
| 1887 | 1945 | pbn_panacom, |
| 1888 | 1946 | pbn_panacom2, |
| 1889 | 1947 | pbn_panacom4, |
| 1890 | − pbn_exsys_4055, | |
| 1891 | 1948 | pbn_plx_romulus, |
| 1892 | 1949 | pbn_oxsemi, |
| 1893 | 1950 | pbn_oxsemi_1_4000000, |
| @@ -2393,13 +2450,6 @@ static struct pciserial_board pci_boards[] __devinitdata = { · 499 unmodified lines | ||
| 2393 | 2450 | .reg_shift = 7, |
| 2394 | 2451 | }, |
| 2395 | 2452 | |
| 2396 | − [pbn_exsys_4055] = { | |
| 2397 | − .flags = FL_BASE2, | |
| 2398 | − .num_ports = 4, | |
| 2399 | − .base_baud = 115200, | |
| 2400 | − .uart_offset = 8, | |
| 2401 | − }, | |
| 2402 | − | |
| 2403 | 2453 | /* I think this entry is broken - the first_offset looks wrong --rmk */ |
| 2404 | 2454 | [pbn_plx_romulus] = { |
| 2405 | 2455 | .flags = FL_BASE2, |
| @@ -2624,10 +2674,14 @@ static struct pciserial_board pci_boards[] __devinitdata = { · 218 unmodified lines | ||
| 2624 | 2674 | }, |
| 2625 | 2675 | }; |
| 2626 | 2676 | |
| 2627 | −static const struct pci_device_id softmodem_blacklist[] = { | |
| 2677 | +static const struct pci_device_id blacklist[] = { | |
| 2678 | + /* softmodems */ | |
| 2628 | 2679 | { PCI_VDEVICE(AL, 0x5457), }, /* ALi Corporation M5457 AC'97 Modem */ |
| 2629 | 2680 | { PCI_VDEVICE(MOTOROLA, 0x3052), }, /* Motorola Si3052-based modem */ |
| 2630 | 2681 | { PCI_DEVICE(0x1543, 0x3052), }, /* Si3052-based modem, default IDs */ |
| 2682 | + | |
| 2683 | + /* multi-io cards handled by parport_serial */ | |
| 2684 | + { PCI_DEVICE(0x4348, 0x7053), }, /* WCH CH353 2S1P */ | |
| 2631 | 2685 | }; |
| 2632 | 2686 | |
| 2633 | 2687 | /* |
| @@ -2638,7 +2692,7 @@ static const struct pci_device_id softmodem_blacklist[] = { · 4 unmodified lines | ||
| 2638 | 2692 | static int __devinit |
| 2639 | 2693 | serial_pci_guess_board(struct pci_dev *dev, struct pciserial_board *board) |
| 2640 | 2694 | { |
| 2641 | − const struct pci_device_id *blacklist; | |
| 2695 | + const struct pci_device_id *bldev; | |
| 2642 | 2696 | int num_iomem, num_port, first_port = -1, i; |
| 2643 | 2697 | |
| 2644 | 2698 | /* |
| @@ -2655,13 +2709,13 @@ serial_pci_guess_board(struct pci_dev *dev, struct pciserial_board *board) · 10 unmodified lines | ||
| 2655 | 2709 | |
| 2656 | 2710 | /* |
| 2657 | 2711 | * Do not access blacklisted devices that are known not to |
| 2658 | − * feature serial ports. | |
| 2712 | + * feature serial ports or are handled by other modules. | |
| 2659 | 2713 | */ |
| 2660 | − for (blacklist = softmodem_blacklist; | |
| 2661 | − blacklist < softmodem_blacklist + ARRAY_SIZE(softmodem_blacklist); | |
| 2662 | − blacklist++) { | |
| 2663 | − if (dev->vendor == blacklist->vendor && | |
| 2664 | − dev->device == blacklist->device) | |
| 2714 | + for (bldev = blacklist; | |
| 2715 | + bldev < blacklist + ARRAY_SIZE(blacklist); | |
| 2716 | + bldev++) { | |
| 2717 | + if (dev->vendor == bldev->vendor && | |
| 2718 | + dev->device == bldev->device) | |
| 2665 | 2719 | return -ENODEV; |
| 2666 | 2720 | } |
| 2667 | 2721 | |
| @@ -2728,7 +2782,7 @@ serial_pci_matches(const struct pciserial_board *board, · 60 unmodified lines | ||
| 2728 | 2782 | struct serial_private * |
| 2729 | 2783 | pciserial_init_ports(struct pci_dev *dev, const struct pciserial_board *board) |
| 2730 | 2784 | { |
| 2731 | − struct uart_port serial_port; | |
| 2785 | + struct uart_8250_port uart; | |
| 2732 | 2786 | struct serial_private *priv; |
| 2733 | 2787 | struct pci_serial_quirk *quirk; |
| 2734 | 2788 | int rc, nr_ports, i; |
| @@ -2768,22 +2822,22 @@ pciserial_init_ports(struct pci_dev *dev, const struct pciserial_board *board) · 33 unmodified lines | ||
| 2768 | 2822 | priv->dev = dev; |
| 2769 | 2823 | priv->quirk = quirk; |
| 2770 | 2824 | |
| 2771 | − memset(&serial_port, 0, sizeof(struct uart_port)); | |
| 2772 | − serial_port.flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ; | |
| 2773 | − serial_port.uartclk = board->base_baud * 16; | |
| 2774 | − serial_port.irq = get_pci_irq(dev, board); | |
| 2775 | − serial_port.dev = &dev->dev; | |
| 2825 | + memset(&uart, 0, sizeof(uart)); | |
| 2826 | + uart.port.flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ; | |
| 2827 | + uart.port.uartclk = board->base_baud * 16; | |
| 2828 | + uart.port.irq = get_pci_irq(dev, board); | |
| 2829 | + uart.port.dev = &dev->dev; | |
| 2776 | 2830 | |
| 2777 | 2831 | for (i = 0; i < nr_ports; i++) { |
| 2778 | − if (quirk->setup(priv, board, &serial_port, i)) | |
| 2832 | + if (quirk->setup(priv, board, &uart, i)) | |
| 2779 | 2833 | break; |
| 2780 | 2834 | |
| 2781 | 2835 | #ifdef SERIAL_DEBUG_PCI |
| 2782 | 2836 | printk(KERN_DEBUG "Setup PCI port: port %lx, irq %d, type %d\n", |
| 2783 | − serial_port.iobase, serial_port.irq, serial_port.iotype); | |
| 2837 | + uart.port.iobase, uart.port.irq, uart.port.iotype); | |
| 2784 | 2838 | #endif |
| 2785 | 2839 | |
| 2786 | − priv->line[i] = serial8250_register_port(&serial_port); | |
| 2840 | + priv->line[i] = serial8250_register_8250_port(&uart); | |
| 2787 | 2841 | if (priv->line[i] < 0) { |
| 2788 | 2842 | printk(KERN_WARNING "Couldn't register serial port %s: %d\n", pci_name(dev), priv->line[i]); |
| 2789 | 2843 | break; |
| @@ -3193,7 +3247,7 @@ static struct pci_device_id serial_pci_tbl[] = { · 403 unmodified lines | ||
| 3193 | 3247 | { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050, |
| 3194 | 3248 | PCI_SUBVENDOR_ID_EXSYS, |
| 3195 | 3249 | PCI_SUBDEVICE_ID_EXSYS_4055, 0, 0, |
| 3196 | − pbn_exsys_4055 }, | |
| 3250 | + pbn_b2_4_115200 }, | |
| 3197 | 3251 | /* |
| 3198 | 3252 | * Megawolf Romulus PCI Serial Card, from Mike Hudson |
| 3199 | 3253 | * (Exoray@isys.ca) |
| @@ -4178,6 +4232,25 @@ static struct pci_device_id serial_pci_tbl[] = { · 978 unmodified lines | ||
| 4178 | 4232 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
| 4179 | 4233 | pbn_omegapci }, |
| 4180 | 4234 | |
| 4235 | + /* | |
| 4236 | + * AgeStar as-prs2-009 | |
| 4237 | + */ | |
| 4238 | + { PCI_VENDOR_ID_AGESTAR, PCI_DEVICE_ID_AGESTAR_9375, | |
| 4239 | + PCI_ANY_ID, PCI_ANY_ID, | |
| 4240 | + 0, 0, pbn_b0_bt_2_115200 }, | |
| 4241 | + | |
| 4242 | + /* | |
| 4243 | + * WCH CH353 series devices: The 2S1P is handled by parport_serial | |
| 4244 | + * so not listed here. | |
| 4245 | + */ | |
| 4246 | + { PCI_VENDOR_ID_WCH, PCI_DEVICE_ID_WCH_CH353_4S, | |
| 4247 | + PCI_ANY_ID, PCI_ANY_ID, | |
| 4248 | + 0, 0, pbn_b0_bt_4_115200 }, | |
| 4249 | + | |
| 4250 | + { PCI_VENDOR_ID_WCH, PCI_DEVICE_ID_WCH_CH353_2S1PF, | |
| 4251 | + PCI_ANY_ID, PCI_ANY_ID, | |
| 4252 | + 0, 0, pbn_b0_bt_2_115200 }, | |
| 4253 | + | |
| 4181 | 4254 | /* |
| 4182 | 4255 | * These entries match devices with class COMMUNICATION_SERIAL, |
| 4183 | 4256 | * COMMUNICATION_MODEM or COMMUNICATION_MULTISERIAL |
| @@ -424,7 +424,7 @@ static int __devinit serial_pnp_guess_board(struct pnp_dev *dev, int *flags) · 423 unmodified lines | ||
| 424 | 424 | static int __devinit |
| 425 | 425 | serial_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id) |
| 426 | 426 | { |
| 427 | − struct uart_port port; | |
| 427 | + struct uart_8250_port uart; | |
| 428 | 428 | int ret, line, flags = dev_id->driver_data; |
| 429 | 429 | |
| 430 | 430 | if (flags & UNKNOWN_DEV) { |
| @@ -433,32 +433,32 @@ serial_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id) · 2 unmodified lines | ||
| 433 | 433 | return ret; |
| 434 | 434 | } |
| 435 | 435 | |
| 436 | − memset(&port, 0, sizeof(struct uart_port)); | |
| 436 | + memset(&uart, 0, sizeof(uart)); | |
| 437 | 437 | if (pnp_irq_valid(dev, 0)) |
| 438 | − port.irq = pnp_irq(dev, 0); | |
| 438 | + uart.port.irq = pnp_irq(dev, 0); | |
| 439 | 439 | if (pnp_port_valid(dev, 0)) { |
| 440 | − port.iobase = pnp_port_start(dev, 0); | |
| 441 | − port.iotype = UPIO_PORT; | |
| 440 | + uart.port.iobase = pnp_port_start(dev, 0); | |
| 441 | + uart.port.iotype = UPIO_PORT; | |
| 442 | 442 | } else if (pnp_mem_valid(dev, 0)) { |
| 443 | − port.mapbase = pnp_mem_start(dev, 0); | |
| 444 | − port.iotype = UPIO_MEM; | |
| 445 | − port.flags = UPF_IOREMAP; | |
| 443 | + uart.port.mapbase = pnp_mem_start(dev, 0); | |
| 444 | + uart.port.iotype = UPIO_MEM; | |
| 445 | + uart.port.flags = UPF_IOREMAP; | |
| 446 | 446 | } else |
| 447 | 447 | return -ENODEV; |
| 448 | 448 | |
| 449 | 449 | #ifdef SERIAL_DEBUG_PNP |
| 450 | 450 | printk(KERN_DEBUG |
| 451 | 451 | "Setup PNP port: port %x, mem 0x%lx, irq %d, type %d\n", |
| 452 | − port.iobase, port.mapbase, port.irq, port.iotype); | |
| 452 | + uart.port.iobase, uart.port.mapbase, uart.port.irq, uart.port.iotype); | |
| 453 | 453 | #endif |
| 454 | 454 | |
| 455 | − port.flags |= UPF_SKIP_TEST | UPF_BOOT_AUTOCONF; | |
| 455 | + uart.port.flags |= UPF_SKIP_TEST | UPF_BOOT_AUTOCONF; | |
| 456 | 456 | if (pnp_irq_flags(dev, 0) & IORESOURCE_IRQ_SHAREABLE) |
| 457 | − port.flags |= UPF_SHARE_IRQ; | |
| 458 | − port.uartclk = 1843200; | |
| 459 | − port.dev = &dev->dev; | |
| 457 | + uart.port.flags |= UPF_SHARE_IRQ; | |
| 458 | + uart.port.uartclk = 1843200; | |
| 459 | + uart.port.dev = &dev->dev; | |
| 460 | 460 | |
| 461 | − line = serial8250_register_port(&port); | |
| 461 | + line = serial8250_register_8250_port(&uart); | |
| 462 | 462 | if (line < 0) |
| 463 | 463 | return -ENODEV; |
| 464 | 464 | |
| @@ -73,7 +73,7 @@ struct serial_quirk { · 72 unmodified lines | ||
| 73 | 73 | unsigned int prodid; |
| 74 | 74 | int multi; /* 1 = multifunction, > 1 = # ports */ |
| 75 | 75 | void (*config)(struct pcmcia_device *); |
| 76 | − void (*setup)(struct pcmcia_device *, struct uart_port *); | |
| 76 | + void (*setup)(struct pcmcia_device *, struct uart_8250_port *); | |
| 77 | 77 | void (*wakeup)(struct pcmcia_device *); |
| 78 | 78 | int (*post)(struct pcmcia_device *); |
| 79 | 79 | }; |
| @@ -105,9 +105,9 @@ struct serial_cfg_mem { · 25 unmodified lines | ||
| 105 | 105 | * Elan VPU16551 UART with 14.7456MHz oscillator |
| 106 | 106 | * manfid 0x015D, 0x4C45 |
| 107 | 107 | */ |
| 108 | −static void quirk_setup_brainboxes_0104(struct pcmcia_device *link, struct uart_port *port) | |
| 108 | +static void quirk_setup_brainboxes_0104(struct pcmcia_device *link, struct uart_8250_port *uart) | |
| 109 | 109 | { |
| 110 | − port->uartclk = 14745600; | |
| 110 | + uart->port.uartclk = 14745600; | |
| 111 | 111 | } |
| 112 | 112 | |
| 113 | 113 | static int quirk_post_ibm(struct pcmcia_device *link) |
| @@ -343,25 +343,25 @@ static void serial_detach(struct pcmcia_device *link) · 229 unmodified lines | ||
| 343 | 343 | static int setup_serial(struct pcmcia_device *handle, struct serial_info * info, |
| 344 | 344 | unsigned int iobase, int irq) |
| 345 | 345 | { |
| 346 | − struct uart_port port; | |
| 346 | + struct uart_8250_port uart; | |
| 347 | 347 | int line; |
| 348 | 348 | |
| 349 | − memset(&port, 0, sizeof (struct uart_port)); | |
| 350 | − port.iobase = iobase; | |
| 351 | − port.irq = irq; | |
| 352 | − port.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_SHARE_IRQ; | |
| 353 | − port.uartclk = 1843200; | |
| 354 | − port.dev = &handle->dev; | |
| 349 | + memset(&uart, 0, sizeof(uart)); | |
| 350 | + uart.port.iobase = iobase; | |
| 351 | + uart.port.irq = irq; | |
| 352 | + uart.port.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_SHARE_IRQ; | |
| 353 | + uart.port.uartclk = 1843200; | |
| 354 | + uart.port.dev = &handle->dev; | |
| 355 | 355 | if (buggy_uart) |
| 356 | − port.flags |= UPF_BUGGY_UART; | |
| 356 | + uart.port.flags |= UPF_BUGGY_UART; | |
| 357 | 357 | |
| 358 | 358 | if (info->quirk && info->quirk->setup) |
| 359 | − info->quirk->setup(handle, &port); | |
| 359 | + info->quirk->setup(handle, &uart); | |
| 360 | 360 | |
| 361 | − line = serial8250_register_port(&port); | |
| 361 | + line = serial8250_register_8250_port(&uart); | |
| 362 | 362 | if (line < 0) { |
| 363 | − printk(KERN_NOTICE "serial_cs: serial8250_register_port() at " | |
| 364 | − "0x%04lx, irq %d failed\n", (u_long)iobase, irq); | |
| 363 | + pr_err("serial_cs: serial8250_register_8250_port() at 0x%04lx, irq %d failed\n", | |
| 364 | + (unsigned long)iobase, irq); | |
| 365 | 365 | return -EINVAL; |
| 366 | 366 | } |
| 367 | 367 | |
| @@ -257,12 +257,19 @@ config SERIAL_MAX3100 · 256 unmodified lines | ||
| 257 | 257 | help |
| 258 | 258 | MAX3100 chip support |
| 259 | 259 | |
| 260 | −config SERIAL_MAX3107 | |
| 261 | − tristate "MAX3107 support" | |
| 260 | +config SERIAL_MAX310X | |
| 261 | + bool "MAX310X support" | |
| 262 | 262 | depends on SPI |
| 263 | 263 | select SERIAL_CORE |
| 264 | + select REGMAP_SPI if SPI | |
| 265 | + default n | |
| 264 | 266 | help |
| 265 | − MAX3107 chip support | |
| 267 | + This selects support for an advanced UART from Maxim (Dallas). | |
| 268 | + Supported ICs are MAX3107, MAX3108. | |
| 269 | + Each IC contains 128 words each of receive and transmit FIFO | |
| 270 | + that can be controlled through I2C or high-speed SPI. | |
| 271 | + | |
| 272 | + Say Y here if you want to support this ICs. | |
| 266 | 273 | |
| 267 | 274 | config SERIAL_DZ |
| 268 | 275 | bool "DECstation DZ serial driver" |
| @@ -704,6 +711,25 @@ config SERIAL_PNX8XXX_CONSOLE · 435 unmodified lines | ||
| 704 | 711 | If you have a MIPS-based Philips SoC such as PNX8550 or PNX8330 |
| 705 | 712 | and you want to use serial console, say Y. Otherwise, say N. |
| 706 | 713 | |
| 714 | +config SERIAL_HS_LPC32XX | |
| 715 | + tristate "LPC32XX high speed serial port support" | |
| 716 | + depends on ARCH_LPC32XX && OF | |
| 717 | + select SERIAL_CORE | |
| 718 | + help | |
| 719 | + Support for the LPC32XX high speed serial ports (up to 900kbps). | |
| 720 | + Those are UARTs completely different from the Standard UARTs on the | |
| 721 | + LPC32XX SoC. | |
| 722 | + Choose M or Y here to build this driver. | |
| 723 | + | |
| 724 | +config SERIAL_HS_LPC32XX_CONSOLE | |
| 725 | + bool "Enable LPC32XX high speed UART serial console" | |
| 726 | + depends on SERIAL_HS_LPC32XX | |
| 727 | + select SERIAL_CORE_CONSOLE | |
| 728 | + help | |
| 729 | + If you would like to be able to use one of the high speed serial | |
| 730 | + ports on the LPC32XX as the console, you can do so by answering | |
| 731 | + Y to this option. | |
| 732 | + | |
| 707 | 733 | config SERIAL_CORE |
| 708 | 734 | tristate |
| 709 | 735 | |
| @@ -1104,6 +1130,24 @@ config SERIAL_SC26XX_CONSOLE · 394 unmodified lines | ||
| 1104 | 1130 | help |
| 1105 | 1131 | Support for Console on SC2681/SC2692 serial ports. |
| 1106 | 1132 | |
| 1133 | +config SERIAL_SCCNXP | |
| 1134 | + bool "SCCNXP serial port support" | |
| 1135 | + depends on !SERIAL_SC26XX | |
| 1136 | + select SERIAL_CORE | |
| 1137 | + default n | |
| 1138 | + help | |
| 1139 | + This selects support for an advanced UART from NXP (Philips). | |
| 1140 | + Supported ICs are SCC2681, SCC2691, SCC2692, SC28L91, SC28L92, | |
| 1141 | + SC28L202, SCC68681 and SCC68692. | |
| 1142 | + Positioned as a replacement for the driver SC26XX. | |
| 1143 | + | |
| 1144 | +config SERIAL_SCCNXP_CONSOLE | |
| 1145 | + bool "Console on SCCNXP serial port" | |
| 1146 | + depends on SERIAL_SCCNXP | |
| 1147 | + select SERIAL_CORE_CONSOLE | |
| 1148 | + help | |
| 1149 | + Support for console on SCCNXP serial ports. | |
| 1150 | + | |
| 1107 | 1151 | config SERIAL_BFIN_SPORT |
| 1108 | 1152 | tristate "Blackfin SPORT emulate UART" |
| 1109 | 1153 | depends on BLACKFIN |
| @@ -28,12 +28,13 @@ obj-$(CONFIG_SERIAL_BFIN) += bfin_uart.o · 27 unmodified lines | ||
| 28 | 28 | obj-$(CONFIG_SERIAL_BFIN_SPORT) += bfin_sport_uart.o |
| 29 | 29 | obj-$(CONFIG_SERIAL_SAMSUNG) += samsung.o |
| 30 | 30 | obj-$(CONFIG_SERIAL_MAX3100) += max3100.o |
| 31 | −obj-$(CONFIG_SERIAL_MAX3107) += max3107.o | |
| 31 | +obj-$(CONFIG_SERIAL_MAX310X) += max310x.o | |
| 32 | 32 | obj-$(CONFIG_SERIAL_IP22_ZILOG) += ip22zilog.o |
| 33 | 33 | obj-$(CONFIG_SERIAL_MUX) += mux.o |
| 34 | 34 | obj-$(CONFIG_SERIAL_68328) += 68328serial.o |
| 35 | 35 | obj-$(CONFIG_SERIAL_MCF) += mcf.o |
| 36 | 36 | obj-$(CONFIG_SERIAL_PMACZILOG) += pmac_zilog.o |
| 37 | +obj-$(CONFIG_SERIAL_HS_LPC32XX) += lpc32xx_hs.o | |
| 37 | 38 | obj-$(CONFIG_SERIAL_DZ) += dz.o |
| 38 | 39 | obj-$(CONFIG_SERIAL_ZS) += zs.o |
| 39 | 40 | obj-$(CONFIG_SERIAL_SH_SCI) += sh-sci.o |
| @@ -47,6 +48,7 @@ obj-$(CONFIG_SERIAL_MPSC) += mpsc.o · 7 unmodified lines | ||
| 47 | 48 | obj-$(CONFIG_SERIAL_SB1250_DUART) += sb1250-duart.o |
| 48 | 49 | obj-$(CONFIG_ETRAX_SERIAL) += crisv10.o |
| 49 | 50 | obj-$(CONFIG_SERIAL_SC26XX) += sc26xx.o |
| 51 | +obj-$(CONFIG_SERIAL_SCCNXP) += sccnxp.o | |
| 50 | 52 | obj-$(CONFIG_SERIAL_JSM) += jsm/ |
| 51 | 53 | obj-$(CONFIG_SERIAL_TXX9) += serial_txx9.o |
| 52 | 54 | obj-$(CONFIG_SERIAL_VR41XX) += vr41xx_siu.o |
| @@ -591,7 +591,7 @@ static int __devinit altera_uart_probe(struct platform_device *pdev) · 590 unmodified lines | ||
| 591 | 591 | port->ops = &altera_uart_ops; |
| 592 | 592 | port->flags = UPF_BOOT_AUTOCONF; |
| 593 | 593 | |
| 594 | − dev_set_drvdata(&pdev->dev, port); | |
| 594 | + platform_set_drvdata(pdev, port); | |
| 595 | 595 | |
| 596 | 596 | uart_add_one_port(&altera_uart_driver, port); |
| 597 | 597 | |
| @@ -600,11 +600,11 @@ static int __devinit altera_uart_probe(struct platform_device *pdev) · 2 unmodified lines | ||
| 600 | 600 | |
| 601 | 601 | static int __devexit altera_uart_remove(struct platform_device *pdev) |
| 602 | 602 | { |
| 603 | − struct uart_port *port = dev_get_drvdata(&pdev->dev); | |
| 603 | + struct uart_port *port = platform_get_drvdata(pdev); | |
| 604 | 604 | |
| 605 | 605 | if (port) { |
| 606 | 606 | uart_remove_one_port(&altera_uart_driver, port); |
| 607 | − dev_set_drvdata(&pdev->dev, NULL); | |
| 607 | + platform_set_drvdata(pdev, NULL); | |
| 608 | 608 | port->mapbase = 0; |
| 609 | 609 | } |
| 610 | 610 | |
| @@ -312,16 +312,12 @@ static int pl010_startup(struct uart_port *port) · 311 unmodified lines | ||
| 312 | 312 | struct uart_amba_port *uap = (struct uart_amba_port *)port; |
| 313 | 313 | int retval; |
| 314 | 314 | |
| 315 | − retval = clk_prepare(uap->clk); | |
| 316 | − if (retval) | |
| 317 | − goto out; | |
| 318 | − | |
| 319 | 315 | /* |
| 320 | 316 | * Try to enable the clock producer. |
| 321 | 317 | */ |
| 322 | − retval = clk_enable(uap->clk); | |
| 318 | + retval = clk_prepare_enable(uap->clk); | |
| 323 | 319 | if (retval) |
| 324 | − goto clk_unprep; | |
| 320 | + goto out; | |
| 325 | 321 | |
| 326 | 322 | uap->port.uartclk = clk_get_rate(uap->clk); |
| 327 | 323 | |
| @@ -346,9 +342,7 @@ static int pl010_startup(struct uart_port *port) · 18 unmodified lines | ||
| 346 | 342 | return 0; |
| 347 | 343 | |
| 348 | 344 | clk_dis: |
| 349 | − clk_disable(uap->clk); | |
| 350 | − clk_unprep: | |
| 351 | − clk_unprepare(uap->clk); | |
| 345 | + clk_disable_unprepare(uap->clk); | |
| 352 | 346 | out: |
| 353 | 347 | return retval; |
| 354 | 348 | } |
| @@ -375,8 +369,7 @@ static void pl010_shutdown(struct uart_port *port) · 20 unmodified lines | ||
| 375 | 369 | /* |
| 376 | 370 | * Shut down the clock producer |
| 377 | 371 | */ |
| 378 | − clk_disable(uap->clk); | |
| 379 | − clk_unprepare(uap->clk); | |
| 372 | + clk_disable_unprepare(uap->clk); | |
| 380 | 373 | } |
| 381 | 374 | |
| 382 | 375 | static void |
| @@ -52,6 +52,8 @@ · 51 unmodified lines | ||
| 52 | 52 | #include <linux/scatterlist.h> |
| 53 | 53 | #include <linux/delay.h> |
| 54 | 54 | #include <linux/types.h> |
| 55 | +#include <linux/of.h> | |
| 56 | +#include <linux/of_device.h> | |
| 55 | 57 | #include <linux/pinctrl/consumer.h> |
| 56 | 58 | #include <linux/sizes.h> |
| 57 | 59 | |
| @@ -75,7 +77,6 @@ struct vendor_data { · 17 unmodified lines | ||
| 75 | 77 | unsigned int lcrh_tx; |
| 76 | 78 | unsigned int lcrh_rx; |
| 77 | 79 | bool oversampling; |
| 78 | − bool interrupt_may_hang; /* vendor-specific */ | |
| 79 | 80 | bool dma_threshold; |
| 80 | 81 | bool cts_event_workaround; |
| 81 | 82 | }; |
| @@ -96,7 +97,6 @@ static struct vendor_data vendor_st = { · 14 unmodified lines | ||
| 96 | 97 | .lcrh_tx = ST_UART011_LCRH_TX, |
| 97 | 98 | .lcrh_rx = ST_UART011_LCRH_RX, |
| 98 | 99 | .oversampling = true, |
| 99 | − .interrupt_may_hang = true, | |
| 100 | 100 | .dma_threshold = true, |
| 101 | 101 | .cts_event_workaround = true, |
| 102 | 102 | }; |
| @@ -147,7 +147,6 @@ struct uart_amba_port { · 44 unmodified lines | ||
| 147 | 147 | unsigned int old_cr; /* state during shutdown */ |
| 148 | 148 | bool autorts; |
| 149 | 149 | char type[12]; |
| 150 | − bool interrupt_may_hang; /* vendor-specific */ | |
| 151 | 150 | #ifdef CONFIG_DMA_ENGINE |
| 152 | 151 | /* DMA stuff */ |
| 153 | 152 | bool using_tx_dma; |
| @@ -1215,14 +1214,14 @@ static irqreturn_t pl011_int(int irq, void *dev_id) · 1061 unmodified lines | ||
| 1215 | 1214 | return IRQ_RETVAL(handled); |
| 1216 | 1215 | } |
| 1217 | 1216 | |
| 1218 | −static unsigned int pl01x_tx_empty(struct uart_port *port) | |
| 1217 | +static unsigned int pl011_tx_empty(struct uart_port *port) | |
| 1219 | 1218 | { |
| 1220 | 1219 | struct uart_amba_port *uap = (struct uart_amba_port *)port; |
| 1221 | 1220 | unsigned int status = readw(uap->port.membase + UART01x_FR); |
| 1222 | 1221 | return status & (UART01x_FR_BUSY|UART01x_FR_TXFF) ? 0 : TIOCSER_TEMT; |
| 1223 | 1222 | } |
| 1224 | 1223 | |
| 1225 | −static unsigned int pl01x_get_mctrl(struct uart_port *port) | |
| 1224 | +static unsigned int pl011_get_mctrl(struct uart_port *port) | |
| 1226 | 1225 | { |
| 1227 | 1226 | struct uart_amba_port *uap = (struct uart_amba_port *)port; |
| 1228 | 1227 | unsigned int result = 0; |
| @@ -1285,7 +1284,7 @@ static void pl011_break_ctl(struct uart_port *port, int break_state) · 56 unmodified lines | ||
| 1285 | 1284 | } |
| 1286 | 1285 | |
| 1287 | 1286 | #ifdef CONFIG_CONSOLE_POLL |
| 1288 | −static int pl010_get_poll_char(struct uart_port *port) | |
| 1287 | +static int pl011_get_poll_char(struct uart_port *port) | |
| 1289 | 1288 | { |
| 1290 | 1289 | struct uart_amba_port *uap = (struct uart_amba_port *)port; |
| 1291 | 1290 | unsigned int status; |
| @@ -1297,7 +1296,7 @@ static int pl010_get_poll_char(struct uart_port *port) · 5 unmodified lines | ||
| 1297 | 1296 | return readw(uap->port.membase + UART01x_DR); |
| 1298 | 1297 | } |
| 1299 | 1298 | |
| 1300 | −static void pl010_put_poll_char(struct uart_port *port, | |
| 1299 | +static void pl011_put_poll_char(struct uart_port *port, | |
| 1301 | 1300 | unsigned char ch) |
| 1302 | 1301 | { |
| 1303 | 1302 | struct uart_amba_port *uap = (struct uart_amba_port *)port; |
| @@ -1324,16 +1323,12 @@ static int pl011_startup(struct uart_port *port) · 20 unmodified lines | ||
| 1324 | 1323 | "could not set default pins\n"); |
| 1325 | 1324 | } |
| 1326 | 1325 | |
| 1327 | − retval = clk_prepare(uap->clk); | |
| 1328 | − if (retval) | |
| 1329 | − goto out; | |
| 1330 | − | |
| 1331 | 1326 | /* |
| 1332 | 1327 | * Try to enable the clock producer. |
| 1333 | 1328 | */ |
| 1334 | − retval = clk_enable(uap->clk); | |
| 1329 | + retval = clk_prepare_enable(uap->clk); | |
| 1335 | 1330 | if (retval) |
| 1336 | − goto clk_unprep; | |
| 1331 | + goto out; | |
| 1337 | 1332 | |
| 1338 | 1333 | uap->port.uartclk = clk_get_rate(uap->clk); |
| 1339 | 1334 | |
| @@ -1411,9 +1406,7 @@ static int pl011_startup(struct uart_port *port) · 71 unmodified lines | ||
| 1411 | 1406 | return 0; |
| 1412 | 1407 | |
| 1413 | 1408 | clk_dis: |
| 1414 | − clk_disable(uap->clk); | |
| 1415 | − clk_unprep: | |
| 1416 | − clk_unprepare(uap->clk); | |
| 1409 | + clk_disable_unprepare(uap->clk); | |
| 1417 | 1410 | out: |
| 1418 | 1411 | return retval; |
| 1419 | 1412 | } |
| @@ -1473,8 +1466,7 @@ static void pl011_shutdown(struct uart_port *port) · 53 unmodified lines | ||
| 1473 | 1466 | /* |
| 1474 | 1467 | * Shut down the clock producer |
| 1475 | 1468 | */ |
| 1476 | − clk_disable(uap->clk); | |
| 1477 | − clk_unprepare(uap->clk); | |
| 1469 | + clk_disable_unprepare(uap->clk); | |
| 1478 | 1470 | /* Optionally let pins go into sleep states */ |
| 1479 | 1471 | if (!IS_ERR(uap->pins_sleep)) { |
| 1480 | 1472 | retval = pinctrl_select_state(uap->pinctrl, uap->pins_sleep); |
| @@ -1637,7 +1629,7 @@ static const char *pl011_type(struct uart_port *port) · 156 unmodified lines | ||
| 1637 | 1629 | /* |
| 1638 | 1630 | * Release the memory region(s) being used by 'port' |
| 1639 | 1631 | */ |
| 1640 | −static void pl010_release_port(struct uart_port *port) | |
| 1632 | +static void pl011_release_port(struct uart_port *port) | |
| 1641 | 1633 | { |
| 1642 | 1634 | release_mem_region(port->mapbase, SZ_4K); |
| 1643 | 1635 | } |
| @@ -1645,7 +1637,7 @@ static void pl010_release_port(struct uart_port *port) · 1 unmodified line | ||
| 1645 | 1637 | /* |
| 1646 | 1638 | * Request the memory region(s) being used by 'port' |
| 1647 | 1639 | */ |
| 1648 | −static int pl010_request_port(struct uart_port *port) | |
| 1640 | +static int pl011_request_port(struct uart_port *port) | |
| 1649 | 1641 | { |
| 1650 | 1642 | return request_mem_region(port->mapbase, SZ_4K, "uart-pl011") |
| 1651 | 1643 | != NULL ? 0 : -EBUSY; |
| @@ -1654,18 +1646,18 @@ static int pl010_request_port(struct uart_port *port) · 2 unmodified lines | ||
| 1654 | 1646 | /* |
| 1655 | 1647 | * Configure/autoconfigure the port. |
| 1656 | 1648 | */ |
| 1657 | −static void pl010_config_port(struct uart_port *port, int flags) | |
| 1649 | +static void pl011_config_port(struct uart_port *port, int flags) | |
| 1658 | 1650 | { |
| 1659 | 1651 | if (flags & UART_CONFIG_TYPE) { |
| 1660 | 1652 | port->type = PORT_AMBA; |
| 1661 | − pl010_request_port(port); | |
| 1653 | + pl011_request_port(port); | |
| 1662 | 1654 | } |
| 1663 | 1655 | } |
| 1664 | 1656 | |
| 1665 | 1657 | /* |
| 1666 | 1658 | * verify the new serial_struct (for TIOCSSERIAL). |
| 1667 | 1659 | */ |
| 1668 | −static int pl010_verify_port(struct uart_port *port, struct serial_struct *ser) | |
| 1660 | +static int pl011_verify_port(struct uart_port *port, struct serial_struct *ser) | |
| 1669 | 1661 | { |
| 1670 | 1662 | int ret = 0; |
| 1671 | 1663 | if (ser->type != PORT_UNKNOWN && ser->type != PORT_AMBA) |
| @@ -1678,9 +1670,9 @@ static int pl010_verify_port(struct uart_port *port, struct serial_struct *ser) · 6 unmodified lines | ||
| 1678 | 1670 | } |
| 1679 | 1671 | |
| 1680 | 1672 | static struct uart_ops amba_pl011_pops = { |
| 1681 | − .tx_empty = pl01x_tx_empty, | |
| 1673 | + .tx_empty = pl011_tx_empty, | |
| 1682 | 1674 | .set_mctrl = pl011_set_mctrl, |
| 1683 | − .get_mctrl = pl01x_get_mctrl, | |
| 1675 | + .get_mctrl = pl011_get_mctrl, | |
| 1684 | 1676 | .stop_tx = pl011_stop_tx, |
| 1685 | 1677 | .start_tx = pl011_start_tx, |
| 1686 | 1678 | .stop_rx = pl011_stop_rx, |
| @@ -1691,13 +1683,13 @@ static struct uart_ops amba_pl011_pops = { · 4 unmodified lines | ||
| 1691 | 1683 | .flush_buffer = pl011_dma_flush_buffer, |
| 1692 | 1684 | .set_termios = pl011_set_termios, |
| 1693 | 1685 | .type = pl011_type, |
| 1694 | − .release_port = pl010_release_port, | |
| 1695 | − .request_port = pl010_request_port, | |
| 1696 | − .config_port = pl010_config_port, | |
| 1697 | − .verify_port = pl010_verify_port, | |
| 1686 | + .release_port = pl011_release_port, | |
| 1687 | + .request_port = pl011_request_port, | |
| 1688 | + .config_port = pl011_config_port, | |
| 1689 | + .verify_port = pl011_verify_port, | |
| 1698 | 1690 | #ifdef CONFIG_CONSOLE_POLL |
| 1699 | − .poll_get_char = pl010_get_poll_char, | |
| 1700 | − .poll_put_char = pl010_put_poll_char, | |
| 1691 | + .poll_get_char = pl011_get_poll_char, | |
| 1692 | + .poll_put_char = pl011_put_poll_char, | |
| 1701 | 1693 | #endif |
| 1702 | 1694 | }; |
| 1703 | 1695 | |
| @@ -1869,6 +1861,38 @@ static struct uart_driver amba_reg = { · 165 unmodified lines | ||
| 1869 | 1861 | .cons = AMBA_CONSOLE, |
| 1870 | 1862 | }; |
| 1871 | 1863 | |
| 1864 | +static int pl011_probe_dt_alias(int index, struct device *dev) | |
| 1865 | +{ | |
| 1866 | + struct device_node *np; | |
| 1867 | + static bool seen_dev_with_alias = false; | |
| 1868 | + static bool seen_dev_without_alias = false; | |
| 1869 | + int ret = index; | |
| 1870 | + | |
| 1871 | + if (!IS_ENABLED(CONFIG_OF)) | |
| 1872 | + return ret; | |
| 1873 | + | |
| 1874 | + np = dev->of_node; | |
| 1875 | + if (!np) | |
| 1876 | + return ret; | |
| 1877 | + | |
| 1878 | + ret = of_alias_get_id(np, "serial"); | |
| 1879 | + if (IS_ERR_VALUE(ret)) { | |
| 1880 | + seen_dev_without_alias = true; | |
| 1881 | + ret = index; | |
| 1882 | + } else { | |
| 1883 | + seen_dev_with_alias = true; | |
| 1884 | + if (ret >= ARRAY_SIZE(amba_ports) || amba_ports[ret] != NULL) { | |
| 1885 | + dev_warn(dev, "requested serial port %d not available.\n", ret); | |
| 1886 | + ret = index; | |
| 1887 | + } | |
| 1888 | + } | |
| 1889 | + | |
| 1890 | + if (seen_dev_with_alias && seen_dev_without_alias) | |
| 1891 | + dev_warn(dev, "aliased and non-aliased serial devices found in device tree. Serial port enumeration may be unpredictable.\n"); | |
| 1892 | + | |
| 1893 | + return ret; | |
| 1894 | +} | |
| 1895 | + | |
| 1872 | 1896 | static int pl011_probe(struct amba_device *dev, const struct amba_id *id) |
| 1873 | 1897 | { |
| 1874 | 1898 | struct uart_amba_port *uap; |
| @@ -1891,6 +1915,8 @@ static int pl011_probe(struct amba_device *dev, const struct amba_id *id) · 16 unmodified lines | ||
| 1891 | 1915 | goto out; |
| 1892 | 1916 | } |
| 1893 | 1917 | |
| 1918 | + i = pl011_probe_dt_alias(i, &dev->dev); | |
| 1919 | + | |
| 1894 | 1920 | base = ioremap(dev->res.start, resource_size(&dev->res)); |
| 1895 | 1921 | if (!base) { |
| 1896 | 1922 | ret = -ENOMEM; |
| @@ -1923,7 +1949,6 @@ static int pl011_probe(struct amba_device *dev, const struct amba_id *id) · 26 unmodified lines | ||
| 1923 | 1949 | uap->lcrh_tx = vendor->lcrh_tx; |
| 1924 | 1950 | uap->old_cr = 0; |
| 1925 | 1951 | uap->fifosize = vendor->fifosize; |
| 1926 | − uap->interrupt_may_hang = vendor->interrupt_may_hang; | |
| 1927 | 1952 | uap->port.dev = &dev->dev; |
| 1928 | 1953 | uap->port.mapbase = dev->res.start; |
| 1929 | 1954 | uap->port.membase = base; |
| @@ -182,7 +182,7 @@ static void bfin_serial_start_tx(struct uart_port *port) · 181 unmodified lines | ||
| 182 | 182 | * To avoid losting RX interrupt, we reset IR function |
| 183 | 183 | * before sending data. |
| 184 | 184 | */ |
| 185 | − if (tty->termios->c_line == N_IRDA) | |
| 185 | + if (tty->termios.c_line == N_IRDA) | |
| 186 | 186 | bfin_serial_reset_irda(port); |
| 187 | 187 | |
| 188 | 188 | #ifdef CONFIG_SERIAL_BFIN_DMA |
| @@ -955,7 +955,7 @@ static const struct control_pins e100_modem_pins[NR_PORTS] = · 954 unmodified lines | ||
| 955 | 955 | /* Calculate the chartime depending on baudrate, numbor of bits etc. */ |
| 956 | 956 | static void update_char_time(struct e100_serial * info) |
| 957 | 957 | { |
| 958 | − tcflag_t cflags = info->port.tty->termios->c_cflag; | |
| 958 | + tcflag_t cflags = info->port.tty->termios.c_cflag; | |
| 959 | 959 | int bits; |
| 960 | 960 | |
| 961 | 961 | /* calc. number of bits / data byte */ |
| @@ -1473,7 +1473,7 @@ rs_stop(struct tty_struct *tty) · 511 unmodified lines | ||
| 1473 | 1473 | xoff = IO_FIELD(R_SERIAL0_XOFF, xoff_char, |
| 1474 | 1474 | STOP_CHAR(info->port.tty)); |
| 1475 | 1475 | xoff |= IO_STATE(R_SERIAL0_XOFF, tx_stop, stop); |
| 1476 | − if (tty->termios->c_iflag & IXON ) { | |
| 1476 | + if (tty->termios.c_iflag & IXON ) { | |
| 1477 | 1477 | xoff |= IO_STATE(R_SERIAL0_XOFF, auto_xoff, enable); |
| 1478 | 1478 | } |
| 1479 | 1479 | |
| @@ -1496,7 +1496,7 @@ rs_start(struct tty_struct *tty) · 16 unmodified lines | ||
| 1496 | 1496 | info->xmit.tail,SERIAL_XMIT_SIZE))); |
| 1497 | 1497 | xoff = IO_FIELD(R_SERIAL0_XOFF, xoff_char, STOP_CHAR(tty)); |
| 1498 | 1498 | xoff |= IO_STATE(R_SERIAL0_XOFF, tx_stop, enable); |
| 1499 | − if (tty->termios->c_iflag & IXON ) { | |
| 1499 | + if (tty->termios.c_iflag & IXON ) { | |
| 1500 | 1500 | xoff |= IO_STATE(R_SERIAL0_XOFF, auto_xoff, enable); |
| 1501 | 1501 | } |
| 1502 | 1502 | |
| @@ -2929,7 +2929,7 @@ shutdown(struct e100_serial * info) · 1426 unmodified lines | ||
| 2929 | 2929 | descr[i].buf = 0; |
| 2930 | 2930 | } |
| 2931 | 2931 | |
| 2932 | − if (!info->port.tty || (info->port.tty->termios->c_cflag & HUPCL)) { | |
| 2932 | + if (!info->port.tty || (info->port.tty->termios.c_cflag & HUPCL)) { | |
| 2933 | 2933 | /* hang up DTR and RTS if HUPCL is enabled */ |
| 2934 | 2934 | e100_dtr(info, 0); |
| 2935 | 2935 | e100_rts(info, 0); /* could check CRTSCTS before doing this */ |
| @@ -2953,12 +2953,12 @@ change_speed(struct e100_serial *info) · 17 unmodified lines | ||
| 2953 | 2953 | unsigned long flags; |
| 2954 | 2954 | /* first some safety checks */ |
| 2955 | 2955 | |
| 2956 | − if (!info->port.tty || !info->port.tty->termios) | |
| 2956 | + if (!info->port.tty) | |
| 2957 | 2957 | return; |
| 2958 | 2958 | if (!info->ioport) |
| 2959 | 2959 | return; |
| 2960 | 2960 | |
| 2961 | − cflag = info->port.tty->termios->c_cflag; | |
| 2961 | + cflag = info->port.tty->termios.c_cflag; | |
| 2962 | 2962 | |
| 2963 | 2963 | /* possibly, the tx/rx should be disabled first to do this safely */ |
| 2964 | 2964 | |
| @@ -3088,7 +3088,7 @@ change_speed(struct e100_serial *info) · 123 unmodified lines | ||
| 3088 | 3088 | info->ioport[REG_REC_CTRL] = info->rx_ctrl; |
| 3089 | 3089 | xoff = IO_FIELD(R_SERIAL0_XOFF, xoff_char, STOP_CHAR(info->port.tty)); |
| 3090 | 3090 | xoff |= IO_STATE(R_SERIAL0_XOFF, tx_stop, enable); |
| 3091 | − if (info->port.tty->termios->c_iflag & IXON ) { | |
| 3091 | + if (info->port.tty->termios.c_iflag & IXON ) { | |
| 3092 | 3092 | DFLOW(DEBUG_LOG(info->line, "FLOW XOFF enabled 0x%02X\n", |
| 3093 | 3093 | STOP_CHAR(info->port.tty))); |
| 3094 | 3094 | xoff |= IO_STATE(R_SERIAL0_XOFF, auto_xoff, enable); |
| @@ -3355,7 +3355,7 @@ rs_throttle(struct tty_struct * tty) · 260 unmodified lines | ||
| 3355 | 3355 | DFLOW(DEBUG_LOG(info->line,"rs_throttle %lu\n", tty->ldisc.chars_in_buffer(tty))); |
| 3356 | 3356 | |
| 3357 | 3357 | /* Do RTS before XOFF since XOFF might take some time */ |
| 3358 | − if (tty->termios->c_cflag & CRTSCTS) { | |
| 3358 | + if (tty->termios.c_cflag & CRTSCTS) { | |
| 3359 | 3359 | /* Turn off RTS line */ |
| 3360 | 3360 | e100_rts(info, 0); |
| 3361 | 3361 | } |
| @@ -3377,7 +3377,7 @@ rs_unthrottle(struct tty_struct * tty) · 15 unmodified lines | ||
| 3377 | 3377 | DFLOW(DEBUG_LOG(info->line,"rs_unthrottle ldisc %d\n", tty->ldisc.chars_in_buffer(tty))); |
| 3378 | 3378 | DFLOW(DEBUG_LOG(info->line,"rs_unthrottle flip.count: %i\n", tty->flip.count)); |
| 3379 | 3379 | /* Do RTS before XOFF since XOFF might take some time */ |
| 3380 | − if (tty->termios->c_cflag & CRTSCTS) { | |
| 3380 | + if (tty->termios.c_cflag & CRTSCTS) { | |
| 3381 | 3381 | /* Assert RTS line */ |
| 3382 | 3382 | e100_rts(info, 1); |
| 3383 | 3383 | } |
| @@ -3748,7 +3748,7 @@ rs_set_termios(struct tty_struct *tty, struct ktermios *old_termios) · 364 unmodified lines | ||
| 3748 | 3748 | |
| 3749 | 3749 | /* Handle turning off CRTSCTS */ |
| 3750 | 3750 | if ((old_termios->c_cflag & CRTSCTS) && |
| 3751 | − !(tty->termios->c_cflag & CRTSCTS)) { | |
| 3751 | + !(tty->termios.c_cflag & CRTSCTS)) { | |
| 3752 | 3752 | tty->hw_stopped = 0; |
| 3753 | 3753 | rs_start(tty); |
| 3754 | 3754 | } |
| @@ -3815,7 +3815,7 @@ rs_close(struct tty_struct *tty, struct file * filp) · 60 unmodified lines | ||
| 3815 | 3815 | * separate termios for callout and dialin. |
| 3816 | 3816 | */ |
| 3817 | 3817 | if (info->flags & ASYNC_NORMAL_ACTIVE) |
| 3818 | − info->normal_termios = *tty->termios; | |
| 3818 | + info->normal_termios = tty->termios; | |
| 3819 | 3819 | /* |
| 3820 | 3820 | * Now we wait for the transmit buffer to clear; and we notify |
| 3821 | 3821 | * the line discipline to only process XON/XOFF characters. |
| @@ -3976,7 +3976,7 @@ block_til_ready(struct tty_struct *tty, struct file * filp, · 154 unmodified lines | ||
| 3976 | 3976 | */ |
| 3977 | 3977 | if (tty_hung_up_p(filp) || |
| 3978 | 3978 | (info->flags & ASYNC_CLOSING)) { |
| 3979 | − wait_event_interruptible_tty(info->close_wait, | |
| 3979 | + wait_event_interruptible_tty(tty, info->close_wait, | |
| 3980 | 3980 | !(info->flags & ASYNC_CLOSING)); |
| 3981 | 3981 | #ifdef SERIAL_DO_RESTART |
| 3982 | 3982 | if (info->flags & ASYNC_HUP_NOTIFY) |
| @@ -3998,7 +3998,7 @@ block_til_ready(struct tty_struct *tty, struct file * filp, · 15 unmodified lines | ||
| 3998 | 3998 | return 0; |
| 3999 | 3999 | } |
| 4000 | 4000 | |
| 4001 | − if (tty->termios->c_cflag & CLOCAL) { | |
| 4001 | + if (tty->termios.c_cflag & CLOCAL) { | |
| 4002 | 4002 | do_clocal = 1; |
| 4003 | 4003 | } |
| 4004 | 4004 | |
| @@ -4052,9 +4052,9 @@ block_til_ready(struct tty_struct *tty, struct file * filp, · 47 unmodified lines | ||
| 4052 | 4052 | printk("block_til_ready blocking: ttyS%d, count = %d\n", |
| 4053 | 4053 | info->line, info->count); |
| 4054 | 4054 | #endif |
| 4055 | − tty_unlock(); | |
| 4055 | + tty_unlock(tty); | |
| 4056 | 4056 | schedule(); |
| 4057 | − tty_lock(); | |
| 4057 | + tty_lock(tty); | |
| 4058 | 4058 | } |
| 4059 | 4059 | set_current_state(TASK_RUNNING); |
| 4060 | 4060 | remove_wait_queue(&info->open_wait, &wait); |
| @@ -4115,7 +4115,7 @@ rs_open(struct tty_struct *tty, struct file * filp) · 54 unmodified lines | ||
| 4115 | 4115 | */ |
| 4116 | 4116 | if (tty_hung_up_p(filp) || |
| 4117 | 4117 | (info->flags & ASYNC_CLOSING)) { |
| 4118 | − wait_event_interruptible_tty(info->close_wait, | |
| 4118 | + wait_event_interruptible_tty(tty, info->close_wait, | |
| 4119 | 4119 | !(info->flags & ASYNC_CLOSING)); |
| 4120 | 4120 | #ifdef SERIAL_DO_RESTART |
| 4121 | 4121 | return ((info->flags & ASYNC_HUP_NOTIFY) ? |
| @@ -4219,7 +4219,7 @@ rs_open(struct tty_struct *tty, struct file * filp) · 97 unmodified lines | ||
| 4219 | 4219 | } |
| 4220 | 4220 | |
| 4221 | 4221 | if ((info->count == 1) && (info->flags & ASYNC_SPLIT_TERMIOS)) { |
| 4222 | − *tty->termios = info->normal_termios; | |
| 4222 | + tty->termios = info->normal_termios; | |
| 4223 | 4223 | change_speed(info); |
| 4224 | 4224 | } |
| 4225 | 4225 | |
| @@ -4443,14 +4443,12 @@ static int __init rs_init(void) · 217 unmodified lines | ||
| 4443 | 4443 | B115200 | CS8 | CREAD | HUPCL | CLOCAL; /* is normally B9600 default... */ |
| 4444 | 4444 | driver->init_termios.c_ispeed = 115200; |
| 4445 | 4445 | driver->init_termios.c_ospeed = 115200; |
| 4446 | − driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV; | |
| 4446 | + driver->flags = TTY_DRIVER_REAL_RAW; | |
| 4447 | 4447 | |
| 4448 | 4448 | tty_set_operations(driver, &rs_ops); |
| 4449 | 4449 | serial_driver = driver; |
| 4450 | − if (tty_register_driver(driver)) | |
| 4451 | − panic("Couldn't register serial driver\n"); | |
| 4452 | − /* do some initializing for the separate ports */ | |
| 4453 | 4450 | |
| 4451 | + /* do some initializing for the separate ports */ | |
| 4454 | 4452 | for (i = 0, info = rs_table; i < NR_PORTS; i++,info++) { |
| 4455 | 4453 | if (info->enabled) { |
| 4456 | 4454 | if (cris_request_io_interface(info->io_if, |
| @@ -4502,7 +4500,12 @@ static int __init rs_init(void) · 45 unmodified lines | ||
| 4502 | 4500 | printk(KERN_INFO "%s%d at %p is a builtin UART with DMA\n", |
| 4503 | 4501 | serial_driver->name, info->line, info->ioport); |
| 4504 | 4502 | } |
| 4503 | + tty_port_link_device(&info->port, driver, i); | |
| 4505 | 4504 | } |
| 4505 | + | |
| 4506 | + if (tty_register_driver(driver)) | |
| 4507 | + panic("Couldn't register serial driver\n"); | |
| 4508 | + | |
| 4506 | 4509 | #ifdef CONFIG_ETRAX_FAST_TIMER |
| 4507 | 4510 | #ifdef CONFIG_ETRAX_SERIAL_FAST_TIMER |
| 4508 | 4511 | memset(fast_timers, 0, sizeof(fast_timers)); |
| @@ -800,8 +800,8 @@ static int ifx_spi_create_port(struct ifx_spi_device *ifx_dev) · 799 unmodified lines | ||
| 800 | 800 | tty_port_init(pport); |
| 801 | 801 | pport->ops = &ifx_tty_port_ops; |
| 802 | 802 | ifx_dev->minor = IFX_SPI_TTY_ID; |
| 803 | − ifx_dev->tty_dev = tty_register_device(tty_drv, ifx_dev->minor, | |
| 804 | − &ifx_dev->spi_dev->dev); | |
| 803 | + ifx_dev->tty_dev = tty_port_register_device(pport, tty_drv, | |
| 804 | + ifx_dev->minor, &ifx_dev->spi_dev->dev); | |
| 805 | 805 | if (IS_ERR(ifx_dev->tty_dev)) { |
| 806 | 806 | dev_dbg(&ifx_dev->spi_dev->dev, |
| 807 | 807 | "%s: registering tty device failed", __func__); |
| @@ -206,7 +206,7 @@ struct imx_port { · 205 unmodified lines | ||
| 206 | 206 | unsigned short trcv_delay; /* transceiver delay */ |
| 207 | 207 | struct clk *clk_ipg; |
| 208 | 208 | struct clk *clk_per; |
| 209 | − struct imx_uart_data *devdata; | |
| 209 | + const struct imx_uart_data *devdata; | |
| 210 | 210 | }; |
| 211 | 211 | |
| 212 | 212 | struct imx_port_ucrs { |
| @@ -1505,18 +1505,21 @@ static int serial_imx_probe(struct platform_device *pdev) · 1292 unmodified lines | ||
| 1505 | 1505 | pinctrl = devm_pinctrl_get_select_default(&pdev->dev); |
| 1506 | 1506 | if (IS_ERR(pinctrl)) { |
| 1507 | 1507 | ret = PTR_ERR(pinctrl); |
| 1508 | + dev_err(&pdev->dev, "failed to get default pinctrl: %d\n", ret); | |
| 1508 | 1509 | goto unmap; |
| 1509 | 1510 | } |
| 1510 | 1511 | |
| 1511 | 1512 | sport->clk_ipg = devm_clk_get(&pdev->dev, "ipg"); |
| 1512 | 1513 | if (IS_ERR(sport->clk_ipg)) { |
| 1513 | 1514 | ret = PTR_ERR(sport->clk_ipg); |
| 1515 | + dev_err(&pdev->dev, "failed to get ipg clk: %d\n", ret); | |
| 1514 | 1516 | goto unmap; |
| 1515 | 1517 | } |
| 1516 | 1518 | |
| 1517 | 1519 | sport->clk_per = devm_clk_get(&pdev->dev, "per"); |
| 1518 | 1520 | if (IS_ERR(sport->clk_per)) { |
| 1519 | 1521 | ret = PTR_ERR(sport->clk_per); |
| 1522 | + dev_err(&pdev->dev, "failed to get per clk: %d\n", ret); | |
| 1520 | 1523 | goto unmap; |
| 1521 | 1524 | } |
| 1522 | 1525 | |
| @@ -1120,13 +1120,14 @@ static inline int do_read(struct uart_port *the_port, char *buf, int len) · 1119 unmodified lines | ||
| 1120 | 1120 | struct ioc3_port *port = get_ioc3_port(the_port); |
| 1121 | 1121 | struct ring *inring; |
| 1122 | 1122 | struct ring_entry *entry; |
| 1123 | − struct port_hooks *hooks = port->ip_hooks; | |
| 1123 | + struct port_hooks *hooks; | |
| 1124 | 1124 | int byte_num; |
| 1125 | 1125 | char *sc; |
| 1126 | 1126 | int loop_counter; |
| 1127 | 1127 | |
| 1128 | 1128 | BUG_ON(!(len >= 0)); |
| 1129 | 1129 | BUG_ON(!port); |
| 1130 | + hooks = port->ip_hooks; | |
| 1130 | 1131 | |
| 1131 | 1132 | /* There is a nasty timing issue in the IOC3. When the rx_timer |
| 1132 | 1133 | * expires or the rx_high condition arises, we take an interrupt. |
| @@ -1803,7 +1803,7 @@ static inline int ic4_startup_local(struct uart_port *the_port) · 1802 unmodified lines | ||
| 1803 | 1803 | ioc4_set_proto(port, the_port->mapbase); |
| 1804 | 1804 | |
| 1805 | 1805 | /* set the speed of the serial port */ |
| 1806 | − ioc4_change_speed(the_port, state->port.tty->termios, | |
| 1806 | + ioc4_change_speed(the_port, &state->port.tty->termios, | |
| 1807 | 1807 | (struct ktermios *)0); |
| 1808 | 1808 | |
| 1809 | 1809 | return 0; |
| @@ -2069,13 +2069,14 @@ static inline int do_read(struct uart_port *the_port, unsigned char *buf, · 259 unmodified lines | ||
| 2069 | 2069 | struct ioc4_port *port = get_ioc4_port(the_port, 0); |
| 2070 | 2070 | struct ring *inring; |
| 2071 | 2071 | struct ring_entry *entry; |
| 2072 | − struct hooks *hooks = port->ip_hooks; | |
| 2072 | + struct hooks *hooks; | |
| 2073 | 2073 | int byte_num; |
| 2074 | 2074 | char *sc; |
| 2075 | 2075 | int loop_counter; |
| 2076 | 2076 | |
| 2077 | 2077 | BUG_ON(!(len >= 0)); |
| 2078 | 2078 | BUG_ON(!port); |
| 2079 | + hooks = port->ip_hooks; | |
| 2079 | 2080 | |
| 2080 | 2081 | /* There is a nasty timing issue in the IOC4. When the rx_timer |
| 2081 | 2082 | * expires or the rx_high condition arises, we take an interrupt. |
| @@ -161,7 +161,7 @@ static void jsm_tty_send_xchar(struct uart_port *port, char ch) · 160 unmodified lines | ||
| 161 | 161 | struct ktermios *termios; |
| 162 | 162 | |
| 163 | 163 | spin_lock_irqsave(&port->lock, lock_flags); |
| 164 | − termios = port->state->port.tty->termios; | |
| 164 | + termios = &port->state->port.tty->termios; | |
| 165 | 165 | if (ch == termios->c_cc[VSTART]) |
| 166 | 166 | channel->ch_bd->bd_ops->send_start_character(channel); |
| 167 | 167 | |
| @@ -250,7 +250,7 @@ static int jsm_tty_open(struct uart_port *port) · 82 unmodified lines | ||
| 250 | 250 | channel->ch_cached_lsr = 0; |
| 251 | 251 | channel->ch_stops_sent = 0; |
| 252 | 252 | |
| 253 | − termios = port->state->port.tty->termios; | |
| 253 | + termios = &port->state->port.tty->termios; | |
| 254 | 254 | channel->ch_c_cflag = termios->c_cflag; |
| 255 | 255 | channel->ch_c_iflag = termios->c_iflag; |
| 256 | 256 | channel->ch_c_oflag = termios->c_oflag; |
| @@ -283,7 +283,7 @@ static void jsm_tty_close(struct uart_port *port) · 26 unmodified lines | ||
| 283 | 283 | jsm_printk(CLOSE, INFO, &channel->ch_bd->pci_dev, "start\n"); |
| 284 | 284 | |
| 285 | 285 | bd = channel->ch_bd; |
| 286 | − ts = port->state->port.tty->termios; | |
| 286 | + ts = &port->state->port.tty->termios; | |
| 287 | 287 | |
| 288 | 288 | channel->ch_flags &= ~(CH_STOPI); |
| 289 | 289 | |
| @@ -567,7 +567,7 @@ void jsm_input(struct jsm_channel *ch) · 277 unmodified lines | ||
| 567 | 567 | *input data and return immediately. |
| 568 | 568 | */ |
| 569 | 569 | if (!tp || |
| 570 | − !(tp->termios->c_cflag & CREAD) ) { | |
| 570 | + !(tp->termios.c_cflag & CREAD) ) { | |
| 571 | 571 | |
| 572 | 572 | jsm_printk(READ, INFO, &ch->ch_bd->pci_dev, |
| 573 | 573 | "input. dropping %d bytes on port %d...\n", data_len, ch->ch_portnum); |
| @@ -0,0 +1,823 @@ | ||
| 1 | +/* | |
| 2 | + * High Speed Serial Ports on NXP LPC32xx SoC | |
| 3 | + * | |
| 4 | + * Authors: Kevin Wells <kevin.wells@nxp.com> | |
| 5 | + * Roland Stigge <stigge@antcom.de> | |
| 6 | + * | |
| 7 | + * Copyright (C) 2010 NXP Semiconductors | |
| 8 | + * Copyright (C) 2012 Roland Stigge | |
| 9 | + * | |
| 10 | + * This program is free software; you can redistribute it and/or modify | |
| 11 | + * it under the terms of the GNU General Public License as published by | |
| 12 | + * the Free Software Foundation; either version 2 of the License, or | |
| 13 | + * (at your option) any later version. | |
| 14 | + * | |
| 15 | + * This program is distributed in the hope that it will be useful, | |
| 16 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 17 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 18 | + * GNU General Public License for more details. | |
| 19 | + */ | |
| 20 | + | |
| 21 | +#include <linux/module.h> | |
| 22 | +#include <linux/ioport.h> | |
| 23 | +#include <linux/init.h> | |
| 24 | +#include <linux/console.h> | |
| 25 | +#include <linux/sysrq.h> | |
| 26 | +#include <linux/tty.h> | |
| 27 | +#include <linux/tty_flip.h> | |
| 28 | +#include <linux/serial_core.h> | |
| 29 | +#include <linux/serial.h> | |
| 30 | +#include <linux/platform_device.h> | |
| 31 | +#include <linux/delay.h> | |
| 32 | +#include <linux/nmi.h> | |
| 33 | +#include <linux/io.h> | |
| 34 | +#include <linux/irq.h> | |
| 35 | +#include <linux/gpio.h> | |
| 36 | +#include <linux/of.h> | |
| 37 | +#include <mach/platform.h> | |
| 38 | +#include <mach/hardware.h> | |
| 39 | + | |
| 40 | +/* | |
| 41 | + * High Speed UART register offsets | |
| 42 | + */ | |
| 43 | +#define LPC32XX_HSUART_FIFO(x) ((x) + 0x00) | |
| 44 | +#define LPC32XX_HSUART_LEVEL(x) ((x) + 0x04) | |
| 45 | +#define LPC32XX_HSUART_IIR(x) ((x) + 0x08) | |
| 46 | +#define LPC32XX_HSUART_CTRL(x) ((x) + 0x0C) | |
| 47 | +#define LPC32XX_HSUART_RATE(x) ((x) + 0x10) | |
| 48 | + | |
| 49 | +#define LPC32XX_HSU_BREAK_DATA (1 << 10) | |
| 50 | +#define LPC32XX_HSU_ERROR_DATA (1 << 9) | |
| 51 | +#define LPC32XX_HSU_RX_EMPTY (1 << 8) | |
| 52 | + | |
| 53 | +#define LPC32XX_HSU_TX_LEV(n) (((n) >> 8) & 0xFF) | |
| 54 | +#define LPC32XX_HSU_RX_LEV(n) ((n) & 0xFF) | |
| 55 | + | |
| 56 | +#define LPC32XX_HSU_TX_INT_SET (1 << 6) | |
| 57 | +#define LPC32XX_HSU_RX_OE_INT (1 << 5) | |
| 58 | +#define LPC32XX_HSU_BRK_INT (1 << 4) | |
| 59 | +#define LPC32XX_HSU_FE_INT (1 << 3) | |
| 60 | +#define LPC32XX_HSU_RX_TIMEOUT_INT (1 << 2) | |
| 61 | +#define LPC32XX_HSU_RX_TRIG_INT (1 << 1) | |
| 62 | +#define LPC32XX_HSU_TX_INT (1 << 0) | |
| 63 | + | |
| 64 | +#define LPC32XX_HSU_HRTS_INV (1 << 21) | |
| 65 | +#define LPC32XX_HSU_HRTS_TRIG_8B (0x0 << 19) | |
| 66 | +#define LPC32XX_HSU_HRTS_TRIG_16B (0x1 << 19) | |
| 67 | +#define LPC32XX_HSU_HRTS_TRIG_32B (0x2 << 19) | |
| 68 | +#define LPC32XX_HSU_HRTS_TRIG_48B (0x3 << 19) | |
| 69 | +#define LPC32XX_HSU_HRTS_EN (1 << 18) | |
| 70 | +#define LPC32XX_HSU_TMO_DISABLED (0x0 << 16) | |
| 71 | +#define LPC32XX_HSU_TMO_INACT_4B (0x1 << 16) | |
| 72 | +#define LPC32XX_HSU_TMO_INACT_8B (0x2 << 16) | |
| 73 | +#define LPC32XX_HSU_TMO_INACT_16B (0x3 << 16) | |
| 74 | +#define LPC32XX_HSU_HCTS_INV (1 << 15) | |
| 75 | +#define LPC32XX_HSU_HCTS_EN (1 << 14) | |
| 76 | +#define LPC32XX_HSU_OFFSET(n) ((n) << 9) | |
| 77 | +#define LPC32XX_HSU_BREAK (1 << 8) | |
| 78 | +#define LPC32XX_HSU_ERR_INT_EN (1 << 7) | |
| 79 | +#define LPC32XX_HSU_RX_INT_EN (1 << 6) | |
| 80 | +#define LPC32XX_HSU_TX_INT_EN (1 << 5) | |
| 81 | +#define LPC32XX_HSU_RX_TL1B (0x0 << 2) | |
| 82 | +#define LPC32XX_HSU_RX_TL4B (0x1 << 2) | |
| 83 | +#define LPC32XX_HSU_RX_TL8B (0x2 << 2) | |
| 84 | +#define LPC32XX_HSU_RX_TL16B (0x3 << 2) | |
| 85 | +#define LPC32XX_HSU_RX_TL32B (0x4 << 2) | |
| 86 | +#define LPC32XX_HSU_RX_TL48B (0x5 << 2) | |
| 87 | +#define LPC32XX_HSU_TX_TLEMPTY (0x0 << 0) | |
| 88 | +#define LPC32XX_HSU_TX_TL0B (0x0 << 0) | |
| 89 | +#define LPC32XX_HSU_TX_TL4B (0x1 << 0) | |
| 90 | +#define LPC32XX_HSU_TX_TL8B (0x2 << 0) | |
| 91 | +#define LPC32XX_HSU_TX_TL16B (0x3 << 0) | |
| 92 | + | |
| 93 | +#define MODNAME "lpc32xx_hsuart" | |
| 94 | + | |
| 95 | +struct lpc32xx_hsuart_port { | |
| 96 | + struct uart_port port; | |
| 97 | +}; | |
| 98 | + | |
| 99 | +#define FIFO_READ_LIMIT 128 | |
| 100 | +#define MAX_PORTS 3 | |
| 101 | +#define LPC32XX_TTY_NAME "ttyTX" | |
| 102 | +static struct lpc32xx_hsuart_port lpc32xx_hs_ports[MAX_PORTS]; | |
| 103 | + | |
| 104 | +#ifdef CONFIG_SERIAL_HS_LPC32XX_CONSOLE | |
| 105 | +static void wait_for_xmit_empty(struct uart_port *port) | |
| 106 | +{ | |
| 107 | + unsigned int timeout = 10000; | |
| 108 | + | |
| 109 | + do { | |
| 110 | + if (LPC32XX_HSU_TX_LEV(readl(LPC32XX_HSUART_LEVEL( | |
| 111 | + port->membase))) == 0) | |
| 112 | + break; | |
| 113 | + if (--timeout == 0) | |
| 114 | + break; | |
| 115 | + udelay(1); | |
| 116 | + } while (1); | |
| 117 | +} | |
| 118 | + | |
| 119 | +static void wait_for_xmit_ready(struct uart_port *port) | |
| 120 | +{ | |
| 121 | + unsigned int timeout = 10000; | |
| 122 | + | |
| 123 | + while (1) { | |
| 124 | + if (LPC32XX_HSU_TX_LEV(readl(LPC32XX_HSUART_LEVEL( | |
| 125 | + port->membase))) < 32) | |
| 126 | + break; | |
| 127 | + if (--timeout == 0) | |
| 128 | + break; | |
| 129 | + udelay(1); | |
| 130 | + } | |
| 131 | +} | |
| 132 | + | |
| 133 | +static void lpc32xx_hsuart_console_putchar(struct uart_port *port, int ch) | |
| 134 | +{ | |
| 135 | + wait_for_xmit_ready(port); | |
| 136 | + writel((u32)ch, LPC32XX_HSUART_FIFO(port->membase)); | |
| 137 | +} | |
| 138 | + | |
| 139 | +static void lpc32xx_hsuart_console_write(struct console *co, const char *s, | |
| 140 | + unsigned int count) | |
| 141 | +{ | |
| 142 | + struct lpc32xx_hsuart_port *up = &lpc32xx_hs_ports[co->index]; | |
| 143 | + unsigned long flags; | |
| 144 | + int locked = 1; | |
| 145 | + | |
| 146 | + touch_nmi_watchdog(); | |
| 147 | + local_irq_save(flags); | |
| 148 | + if (up->port.sysrq) | |
| 149 | + locked = 0; | |
| 150 | + else if (oops_in_progress) | |
| 151 | + locked = spin_trylock(&up->port.lock); | |
| 152 | + else | |
| 153 | + spin_lock(&up->port.lock); | |
| 154 | + | |
| 155 | + uart_console_write(&up->port, s, count, lpc32xx_hsuart_console_putchar); | |
| 156 | + wait_for_xmit_empty(&up->port); | |
| 157 | + | |
| 158 | + if (locked) | |
| 159 | + spin_unlock(&up->port.lock); | |
| 160 | + local_irq_restore(flags); | |
| 161 | +} | |
| 162 | + | |
| 163 | +static int __init lpc32xx_hsuart_console_setup(struct console *co, | |
| 164 | + char *options) | |
| 165 | +{ | |
| 166 | + struct uart_port *port; | |
| 167 | + int baud = 115200; | |
| 168 | + int bits = 8; | |
| 169 | + int parity = 'n'; | |
| 170 | + int flow = 'n'; | |
| 171 | + | |
| 172 | + if (co->index >= MAX_PORTS) | |
| 173 | + co->index = 0; | |
| 174 | + | |
| 175 | + port = &lpc32xx_hs_ports[co->index].port; | |
| 176 | + if (!port->membase) | |
| 177 | + return -ENODEV; | |
| 178 | + | |
| 179 | + if (options) | |
| 180 | + uart_parse_options(options, &baud, &parity, &bits, &flow); | |
| 181 | + | |
| 182 | + return uart_set_options(port, co, baud, parity, bits, flow); | |
| 183 | +} | |
| 184 | + | |
| 185 | +static struct uart_driver lpc32xx_hsuart_reg; | |
| 186 | +static struct console lpc32xx_hsuart_console = { | |
| 187 | + .name = LPC32XX_TTY_NAME, | |
| 188 | + .write = lpc32xx_hsuart_console_write, | |
| 189 | + .device = uart_console_device, | |
| 190 | + .setup = lpc32xx_hsuart_console_setup, | |
| 191 | + .flags = CON_PRINTBUFFER, | |
| 192 | + .index = -1, | |
| 193 | + .data = &lpc32xx_hsuart_reg, | |
| 194 | +}; | |
| 195 | + | |
| 196 | +static int __init lpc32xx_hsuart_console_init(void) | |
| 197 | +{ | |
| 198 | + register_console(&lpc32xx_hsuart_console); | |
| 199 | + return 0; | |
| 200 | +} | |
| 201 | +console_initcall(lpc32xx_hsuart_console_init); | |
| 202 | + | |
| 203 | +#define LPC32XX_HSUART_CONSOLE (&lpc32xx_hsuart_console) | |
| 204 | +#else | |
| 205 | +#define LPC32XX_HSUART_CONSOLE NULL | |
| 206 | +#endif | |
| 207 | + | |
| 208 | +static struct uart_driver lpc32xx_hs_reg = { | |
| 209 | + .owner = THIS_MODULE, | |
| 210 | + .driver_name = MODNAME, | |
| 211 | + .dev_name = LPC32XX_TTY_NAME, | |
| 212 | + .nr = MAX_PORTS, | |
| 213 | + .cons = LPC32XX_HSUART_CONSOLE, | |
| 214 | +}; | |
| 215 | +static int uarts_registered; | |
| 216 | + | |
| 217 | +static unsigned int __serial_get_clock_div(unsigned long uartclk, | |
| 218 | + unsigned long rate) | |
| 219 | +{ | |
| 220 | + u32 div, goodrate, hsu_rate, l_hsu_rate, comprate; | |
| 221 | + u32 rate_diff; | |
| 222 | + | |
| 223 | + /* Find the closest divider to get the desired clock rate */ | |
| 224 | + div = uartclk / rate; | |
| 225 | + goodrate = hsu_rate = (div / 14) - 1; | |
| 226 | + if (hsu_rate != 0) | |
| 227 | + hsu_rate--; | |
| 228 | + | |
| 229 | + /* Tweak divider */ | |
| 230 | + l_hsu_rate = hsu_rate + 3; | |
| 231 | + rate_diff = 0xFFFFFFFF; | |
| 232 | + | |
| 233 | + while (hsu_rate < l_hsu_rate) { | |
| 234 | + comprate = uartclk / ((hsu_rate + 1) * 14); | |
| 235 | + if (abs(comprate - rate) < rate_diff) { | |
| 236 | + goodrate = hsu_rate; | |
| 237 | + rate_diff = abs(comprate - rate); | |
| 238 | + } | |
| 239 | + | |
| 240 | + hsu_rate++; | |
| 241 | + } | |
| 242 | + if (hsu_rate > 0xFF) | |
| 243 | + hsu_rate = 0xFF; | |
| 244 | + | |
| 245 | + return goodrate; | |
| 246 | +} | |
| 247 | + | |
| 248 | +static void __serial_uart_flush(struct uart_port *port) | |
| 249 | +{ | |
| 250 | + u32 tmp; | |
| 251 | + int cnt = 0; | |
| 252 | + | |
| 253 | + while ((readl(LPC32XX_HSUART_LEVEL(port->membase)) > 0) && | |
| 254 | + (cnt++ < FIFO_READ_LIMIT)) | |
| 255 | + tmp = readl(LPC32XX_HSUART_FIFO(port->membase)); | |
| 256 | +} | |
| 257 | + | |
| 258 | +static void __serial_lpc32xx_rx(struct uart_port *port) | |
| 259 | +{ | |
| 260 | + unsigned int tmp, flag; | |
| 261 | + struct tty_struct *tty = tty_port_tty_get(&port->state->port); | |
| 262 | + | |
| 263 | + if (!tty) { | |
| 264 | + /* Discard data: no tty available */ | |
| 265 | + while (!(readl(LPC32XX_HSUART_FIFO(port->membase)) & | |
| 266 | + LPC32XX_HSU_RX_EMPTY)) | |
| 267 | + ; | |
| 268 | + | |
| 269 | + return; | |
| 270 | + } | |
| 271 | + | |
| 272 | + /* Read data from FIFO and push into terminal */ | |
| 273 | + tmp = readl(LPC32XX_HSUART_FIFO(port->membase)); | |
| 274 | + while (!(tmp & LPC32XX_HSU_RX_EMPTY)) { | |
| 275 | + flag = TTY_NORMAL; | |
| 276 | + port->icount.rx++; | |
| 277 | + | |
| 278 | + if (tmp & LPC32XX_HSU_ERROR_DATA) { | |
| 279 | + /* Framing error */ | |
| 280 | + writel(LPC32XX_HSU_FE_INT, | |
| 281 | + LPC32XX_HSUART_IIR(port->membase)); | |
| 282 | + port->icount.frame++; | |
| 283 | + flag = TTY_FRAME; | |
| 284 | + tty_insert_flip_char(tty, 0, TTY_FRAME); | |
| 285 | + } | |
| 286 | + | |
| 287 | + tty_insert_flip_char(tty, (tmp & 0xFF), flag); | |
| 288 | + | |
| 289 | + tmp = readl(LPC32XX_HSUART_FIFO(port->membase)); | |
| 290 | + } | |
| 291 | + tty_flip_buffer_push(tty); | |
| 292 | + tty_kref_put(tty); | |
| 293 | +} | |
| 294 | + | |
| 295 | +static void __serial_lpc32xx_tx(struct uart_port *port) | |
| 296 | +{ | |
| 297 | + struct circ_buf *xmit = &port->state->xmit; | |
| 298 | + unsigned int tmp; | |
| 299 | + | |
| 300 | + if (port->x_char) { | |
| 301 | + writel((u32)port->x_char, LPC32XX_HSUART_FIFO(port->membase)); | |
| 302 | + port->icount.tx++; | |
| 303 | + port->x_char = 0; | |
| 304 | + return; | |
| 305 | + } | |
| 306 | + | |
| 307 | + if (uart_circ_empty(xmit) || uart_tx_stopped(port)) | |
| 308 | + goto exit_tx; | |
| 309 | + | |
| 310 | + /* Transfer data */ | |
| 311 | + while (LPC32XX_HSU_TX_LEV(readl( | |
| 312 | + LPC32XX_HSUART_LEVEL(port->membase))) < 64) { | |
| 313 | + writel((u32) xmit->buf[xmit->tail], | |
| 314 | + LPC32XX_HSUART_FIFO(port->membase)); | |
| 315 | + xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); | |
| 316 | + port->icount.tx++; | |
| 317 | + if (uart_circ_empty(xmit)) | |
| 318 | + break; | |
| 319 | + } | |
| 320 | + | |
| 321 | + if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) | |
| 322 | + uart_write_wakeup(port); | |
| 323 | + | |
| 324 | +exit_tx: | |
| 325 | + if (uart_circ_empty(xmit)) { | |
| 326 | + tmp = readl(LPC32XX_HSUART_CTRL(port->membase)); | |
| 327 | + tmp &= ~LPC32XX_HSU_TX_INT_EN; | |
| 328 | + writel(tmp, LPC32XX_HSUART_CTRL(port->membase)); | |
| 329 | + } | |
| 330 | +} | |
| 331 | + | |
| 332 | +static irqreturn_t serial_lpc32xx_interrupt(int irq, void *dev_id) | |
| 333 | +{ | |
| 334 | + struct uart_port *port = dev_id; | |
| 335 | + struct tty_struct *tty = tty_port_tty_get(&port->state->port); | |
| 336 | + u32 status; | |
| 337 | + | |
| 338 | + spin_lock(&port->lock); | |
| 339 | + | |
| 340 | + /* Read UART status and clear latched interrupts */ | |
| 341 | + status = readl(LPC32XX_HSUART_IIR(port->membase)); | |
| 342 | + | |
| 343 | + if (status & LPC32XX_HSU_BRK_INT) { | |
| 344 | + /* Break received */ | |
| 345 | + writel(LPC32XX_HSU_BRK_INT, LPC32XX_HSUART_IIR(port->membase)); | |
| 346 | + port->icount.brk++; | |
| 347 | + uart_handle_break(port); | |
| 348 | + } | |
| 349 | + | |
| 350 | + /* Framing error */ | |
| 351 | + if (status & LPC32XX_HSU_FE_INT) | |
| 352 | + writel(LPC32XX_HSU_FE_INT, LPC32XX_HSUART_IIR(port->membase)); | |
| 353 | + | |
| 354 | + if (status & LPC32XX_HSU_RX_OE_INT) { | |
| 355 | + /* Receive FIFO overrun */ | |
| 356 | + writel(LPC32XX_HSU_RX_OE_INT, | |
| 357 | + LPC32XX_HSUART_IIR(port->membase)); | |
| 358 | + port->icount.overrun++; | |
| 359 | + if (tty) { | |
| 360 | + tty_insert_flip_char(tty, 0, TTY_OVERRUN); | |
| 361 | + tty_schedule_flip(tty); | |
| 362 | + } | |
| 363 | + } | |
| 364 | + | |
| 365 | + /* Data received? */ | |
| 366 | + if (status & (LPC32XX_HSU_RX_TIMEOUT_INT | LPC32XX_HSU_RX_TRIG_INT)) { | |
| 367 | + __serial_lpc32xx_rx(port); | |
| 368 | + if (tty) | |
| 369 | + tty_flip_buffer_push(tty); | |
| 370 | + } | |
| 371 | + | |
| 372 | + /* Transmit data request? */ | |
| 373 | + if ((status & LPC32XX_HSU_TX_INT) && (!uart_tx_stopped(port))) { | |
| 374 | + writel(LPC32XX_HSU_TX_INT, LPC32XX_HSUART_IIR(port->membase)); | |
| 375 | + __serial_lpc32xx_tx(port); | |
| 376 | + } | |
| 377 | + | |
| 378 | + spin_unlock(&port->lock); | |
| 379 | + tty_kref_put(tty); | |
| 380 | + | |
| 381 | + return IRQ_HANDLED; | |
| 382 | +} | |
| 383 | + | |
| 384 | +/* port->lock is not held. */ | |
| 385 | +static unsigned int serial_lpc32xx_tx_empty(struct uart_port *port) | |
| 386 | +{ | |
| 387 | + unsigned int ret = 0; | |
| 388 | + | |
| 389 | + if (LPC32XX_HSU_TX_LEV(readl(LPC32XX_HSUART_LEVEL(port->membase))) == 0) | |
| 390 | + ret = TIOCSER_TEMT; | |
| 391 | + | |
| 392 | + return ret; | |
| 393 | +} | |
| 394 | + | |
| 395 | +/* port->lock held by caller. */ | |
| 396 | +static void serial_lpc32xx_set_mctrl(struct uart_port *port, | |
| 397 | + unsigned int mctrl) | |
| 398 | +{ | |
| 399 | + /* No signals are supported on HS UARTs */ | |
| 400 | +} | |
| 401 | + | |
| 402 | +/* port->lock is held by caller and interrupts are disabled. */ | |
| 403 | +static unsigned int serial_lpc32xx_get_mctrl(struct uart_port *port) | |
| 404 | +{ | |
| 405 | + /* No signals are supported on HS UARTs */ | |
| 406 | + return TIOCM_CAR | TIOCM_DSR | TIOCM_CTS; | |
| 407 | +} | |
| 408 | + | |
| 409 | +/* port->lock held by caller. */ | |
| 410 | +static void serial_lpc32xx_stop_tx(struct uart_port *port) | |
| 411 | +{ | |
| 412 | + u32 tmp; | |
| 413 | + | |
| 414 | + tmp = readl(LPC32XX_HSUART_CTRL(port->membase)); | |
| 415 | + tmp &= ~LPC32XX_HSU_TX_INT_EN; | |
| 416 | + writel(tmp, LPC32XX_HSUART_CTRL(port->membase)); | |
| 417 | +} | |
| 418 | + | |
| 419 | +/* port->lock held by caller. */ | |
| 420 | +static void serial_lpc32xx_start_tx(struct uart_port *port) | |
| 421 | +{ | |
| 422 | + u32 tmp; | |
| 423 | + | |
| 424 | + __serial_lpc32xx_tx(port); | |
| 425 | + tmp = readl(LPC32XX_HSUART_CTRL(port->membase)); | |
| 426 | + tmp |= LPC32XX_HSU_TX_INT_EN; | |
| 427 | + writel(tmp, LPC32XX_HSUART_CTRL(port->membase)); | |
| 428 | +} | |
| 429 | + | |
| 430 | +/* port->lock held by caller. */ | |
| 431 | +static void serial_lpc32xx_stop_rx(struct uart_port *port) | |
| 432 | +{ | |
| 433 | + u32 tmp; | |
| 434 | + | |
| 435 | + tmp = readl(LPC32XX_HSUART_CTRL(port->membase)); | |
| 436 | + tmp &= ~(LPC32XX_HSU_RX_INT_EN | LPC32XX_HSU_ERR_INT_EN); | |
| 437 | + writel(tmp, LPC32XX_HSUART_CTRL(port->membase)); | |
| 438 | + | |
| 439 | + writel((LPC32XX_HSU_BRK_INT | LPC32XX_HSU_RX_OE_INT | | |
| 440 | + LPC32XX_HSU_FE_INT), LPC32XX_HSUART_IIR(port->membase)); | |
| 441 | +} | |
| 442 | + | |
| 443 | +/* port->lock held by caller. */ | |
| 444 | +static void serial_lpc32xx_enable_ms(struct uart_port *port) | |
| 445 | +{ | |
| 446 | + /* Modem status is not supported */ | |
| 447 | +} | |
| 448 | + | |
| 449 | +/* port->lock is not held. */ | |
| 450 | +static void serial_lpc32xx_break_ctl(struct uart_port *port, | |
| 451 | + int break_state) | |
| 452 | +{ | |
| 453 | + unsigned long flags; | |
| 454 | + u32 tmp; | |
| 455 | + | |
| 456 | + spin_lock_irqsave(&port->lock, flags); | |
| 457 | + tmp = readl(LPC32XX_HSUART_CTRL(port->membase)); | |
| 458 | + if (break_state != 0) | |
| 459 | + tmp |= LPC32XX_HSU_BREAK; | |
| 460 | + else | |
| 461 | + tmp &= ~LPC32XX_HSU_BREAK; | |
| 462 | + writel(tmp, LPC32XX_HSUART_CTRL(port->membase)); | |
| 463 | + spin_unlock_irqrestore(&port->lock, flags); | |
| 464 | +} | |
| 465 | + | |
| 466 | +/* LPC3250 Errata HSUART.1: Hang workaround via loopback mode on inactivity */ | |
| 467 | +static void lpc32xx_loopback_set(resource_size_t mapbase, int state) | |
| 468 | +{ | |
| 469 | + int bit; | |
| 470 | + u32 tmp; | |
| 471 | + | |
| 472 | + switch (mapbase) { | |
| 473 | + case LPC32XX_HS_UART1_BASE: | |
| 474 | + bit = 0; | |
| 475 | + break; | |
| 476 | + case LPC32XX_HS_UART2_BASE: | |
| 477 | + bit = 1; | |
| 478 | + break; | |
| 479 | + case LPC32XX_HS_UART7_BASE: | |
| 480 | + bit = 6; | |
| 481 | + break; | |
| 482 | + default: | |
| 483 | + WARN(1, "lpc32xx_hs: Warning: Unknown port at %08x\n", mapbase); | |
| 484 | + return; | |
| 485 | + } | |
| 486 | + | |
| 487 | + tmp = readl(LPC32XX_UARTCTL_CLOOP); | |
| 488 | + if (state) | |
| 489 | + tmp |= (1 << bit); | |
| 490 | + else | |
| 491 | + tmp &= ~(1 << bit); | |
| 492 | + writel(tmp, LPC32XX_UARTCTL_CLOOP); | |
| 493 | +} | |
| 494 | + | |
| 495 | +/* port->lock is not held. */ | |
| 496 | +static int serial_lpc32xx_startup(struct uart_port *port) | |
| 497 | +{ | |
| 498 | + int retval; | |
| 499 | + unsigned long flags; | |
| 500 | + u32 tmp; | |
| 501 | + | |
| 502 | + spin_lock_irqsave(&port->lock, flags); | |
| 503 | + | |
| 504 | + __serial_uart_flush(port); | |
| 505 | + | |
| 506 | + writel((LPC32XX_HSU_TX_INT | LPC32XX_HSU_FE_INT | | |
| 507 | + LPC32XX_HSU_BRK_INT | LPC32XX_HSU_RX_OE_INT), | |
| 508 | + LPC32XX_HSUART_IIR(port->membase)); | |
| 509 | + | |
| 510 | + writel(0xFF, LPC32XX_HSUART_RATE(port->membase)); | |
| 511 | + | |
| 512 | + /* | |
| 513 | + * Set receiver timeout, HSU offset of 20, no break, no interrupts, | |
| 514 | + * and default FIFO trigger levels | |
| 515 | + */ | |
| 516 | + tmp = LPC32XX_HSU_TX_TL8B | LPC32XX_HSU_RX_TL32B | | |
| 517 | + LPC32XX_HSU_OFFSET(20) | LPC32XX_HSU_TMO_INACT_4B; | |
| 518 | + writel(tmp, LPC32XX_HSUART_CTRL(port->membase)); | |
| 519 | + | |
| 520 | + lpc32xx_loopback_set(port->mapbase, 0); /* get out of loopback mode */ | |
| 521 | + | |
| 522 | + spin_unlock_irqrestore(&port->lock, flags); | |
| 523 | + | |
| 524 | + retval = request_irq(port->irq, serial_lpc32xx_interrupt, | |
| 525 | + 0, MODNAME, port); | |
| 526 | + if (!retval) | |
| 527 | + writel((tmp | LPC32XX_HSU_RX_INT_EN | LPC32XX_HSU_ERR_INT_EN), | |
| 528 | + LPC32XX_HSUART_CTRL(port->membase)); | |
| 529 | + | |
| 530 | + return retval; | |
| 531 | +} | |
| 532 | + | |
| 533 | +/* port->lock is not held. */ | |
| 534 | +static void serial_lpc32xx_shutdown(struct uart_port *port) | |
| 535 | +{ | |
| 536 | + u32 tmp; | |
| 537 | + unsigned long flags; | |
| 538 | + | |
| 539 | + spin_lock_irqsave(&port->lock, flags); | |
| 540 | + | |
| 541 | + tmp = LPC32XX_HSU_TX_TL8B | LPC32XX_HSU_RX_TL32B | | |
| 542 | + LPC32XX_HSU_OFFSET(20) | LPC32XX_HSU_TMO_INACT_4B; | |
| 543 | + writel(tmp, LPC32XX_HSUART_CTRL(port->membase)); | |
| 544 | + | |
| 545 | + lpc32xx_loopback_set(port->mapbase, 1); /* go to loopback mode */ | |
| 546 | + | |
| 547 | + spin_unlock_irqrestore(&port->lock, flags); | |
| 548 | + | |
| 549 | + free_irq(port->irq, port); | |
| 550 | +} | |
| 551 | + | |
| 552 | +/* port->lock is not held. */ | |
| 553 | +static void serial_lpc32xx_set_termios(struct uart_port *port, | |
| 554 | + struct ktermios *termios, | |
| 555 | + struct ktermios *old) | |
| 556 | +{ | |
| 557 | + unsigned long flags; | |
| 558 | + unsigned int baud, quot; | |
| 559 | + u32 tmp; | |
| 560 | + | |
| 561 | + /* Always 8-bit, no parity, 1 stop bit */ | |
| 562 | + termios->c_cflag &= ~(CSIZE | CSTOPB | PARENB | PARODD); | |
| 563 | + termios->c_cflag |= CS8; | |
| 564 | + | |
| 565 | + termios->c_cflag &= ~(HUPCL | CMSPAR | CLOCAL | CRTSCTS); | |
| 566 | + | |
| 567 | + baud = uart_get_baud_rate(port, termios, old, 0, | |
| 568 | + port->uartclk / 14); | |
| 569 | + | |
| 570 | + quot = __serial_get_clock_div(port->uartclk, baud); | |
| 571 | + | |
| 572 | + spin_lock_irqsave(&port->lock, flags); | |
| 573 | + | |
| 574 | + /* Ignore characters? */ | |
| 575 | + tmp = readl(LPC32XX_HSUART_CTRL(port->membase)); | |
| 576 | + if ((termios->c_cflag & CREAD) == 0) | |
| 577 | + tmp &= ~(LPC32XX_HSU_RX_INT_EN | LPC32XX_HSU_ERR_INT_EN); | |
| 578 | + else | |
| 579 | + tmp |= LPC32XX_HSU_RX_INT_EN | LPC32XX_HSU_ERR_INT_EN; | |
| 580 | + writel(tmp, LPC32XX_HSUART_CTRL(port->membase)); | |
| 581 | + | |
| 582 | + writel(quot, LPC32XX_HSUART_RATE(port->membase)); | |
| 583 | + | |
| 584 | + uart_update_timeout(port, termios->c_cflag, baud); | |
| 585 | + | |
| 586 | + spin_unlock_irqrestore(&port->lock, flags); | |
| 587 | + | |
| 588 | + /* Don't rewrite B0 */ | |
| 589 | + if (tty_termios_baud_rate(termios)) | |
| 590 | + tty_termios_encode_baud_rate(termios, baud, baud); | |
| 591 | +} | |
| 592 | + | |
| 593 | +static const char *serial_lpc32xx_type(struct uart_port *port) | |
| 594 | +{ | |
| 595 | + return MODNAME; | |
| 596 | +} | |
| 597 | + | |
| 598 | +static void serial_lpc32xx_release_port(struct uart_port *port) | |
| 599 | +{ | |
| 600 | + if ((port->iotype == UPIO_MEM32) && (port->mapbase)) { | |
| 601 | + if (port->flags & UPF_IOREMAP) { | |
| 602 | + iounmap(port->membase); | |
| 603 | + port->membase = NULL; | |
| 604 | + } | |
| 605 | + | |
| 606 | + release_mem_region(port->mapbase, SZ_4K); | |
| 607 | + } | |
| 608 | +} | |
| 609 | + | |
| 610 | +static int serial_lpc32xx_request_port(struct uart_port *port) | |
| 611 | +{ | |
| 612 | + int ret = -ENODEV; | |
| 613 | + | |
| 614 | + if ((port->iotype == UPIO_MEM32) && (port->mapbase)) { | |
| 615 | + ret = 0; | |
| 616 | + | |
| 617 | + if (!request_mem_region(port->mapbase, SZ_4K, MODNAME)) | |
| 618 | + ret = -EBUSY; | |
| 619 | + else if (port->flags & UPF_IOREMAP) { | |
| 620 | + port->membase = ioremap(port->mapbase, SZ_4K); | |
| 621 | + if (!port->membase) { | |
| 622 | + release_mem_region(port->mapbase, SZ_4K); | |
| 623 | + ret = -ENOMEM; | |
| 624 | + } | |
| 625 | + } | |
| 626 | + } | |
| 627 | + | |
| 628 | + return ret; | |
| 629 | +} | |
| 630 | + | |
| 631 | +static void serial_lpc32xx_config_port(struct uart_port *port, int uflags) | |
| 632 | +{ | |
| 633 | + int ret; | |
| 634 | + | |
| 635 | + ret = serial_lpc32xx_request_port(port); | |
| 636 | + if (ret < 0) | |
| 637 | + return; | |
| 638 | + port->type = PORT_UART00; | |
| 639 | + port->fifosize = 64; | |
| 640 | + | |
| 641 | + __serial_uart_flush(port); | |
| 642 | + | |
| 643 | + writel((LPC32XX_HSU_TX_INT | LPC32XX_HSU_FE_INT | | |
| 644 | + LPC32XX_HSU_BRK_INT | LPC32XX_HSU_RX_OE_INT), | |
| 645 | + LPC32XX_HSUART_IIR(port->membase)); | |
| 646 | + | |
| 647 | + writel(0xFF, LPC32XX_HSUART_RATE(port->membase)); | |
| 648 | + | |
| 649 | + /* Set receiver timeout, HSU offset of 20, no break, no interrupts, | |
| 650 | + and default FIFO trigger levels */ | |
| 651 | + writel(LPC32XX_HSU_TX_TL8B | LPC32XX_HSU_RX_TL32B | | |
| 652 | + LPC32XX_HSU_OFFSET(20) | LPC32XX_HSU_TMO_INACT_4B, | |
| 653 | + LPC32XX_HSUART_CTRL(port->membase)); | |
| 654 | +} | |
| 655 | + | |
| 656 | +static int serial_lpc32xx_verify_port(struct uart_port *port, | |
| 657 | + struct serial_struct *ser) | |
| 658 | +{ | |
| 659 | + int ret = 0; | |
| 660 | + | |
| 661 | + if (ser->type != PORT_UART00) | |
| 662 | + ret = -EINVAL; | |
| 663 | + | |
| 664 | + return ret; | |
| 665 | +} | |
| 666 | + | |
| 667 | +static struct uart_ops serial_lpc32xx_pops = { | |
| 668 | + .tx_empty = serial_lpc32xx_tx_empty, | |
| 669 | + .set_mctrl = serial_lpc32xx_set_mctrl, | |
| 670 | + .get_mctrl = serial_lpc32xx_get_mctrl, | |
| 671 | + .stop_tx = serial_lpc32xx_stop_tx, | |
| 672 | + .start_tx = serial_lpc32xx_start_tx, | |
| 673 | + .stop_rx = serial_lpc32xx_stop_rx, | |
| 674 | + .enable_ms = serial_lpc32xx_enable_ms, | |
| 675 | + .break_ctl = serial_lpc32xx_break_ctl, | |
| 676 | + .startup = serial_lpc32xx_startup, | |
| 677 | + .shutdown = serial_lpc32xx_shutdown, | |
| 678 | + .set_termios = serial_lpc32xx_set_termios, | |
| 679 | + .type = serial_lpc32xx_type, | |
| 680 | + .release_port = serial_lpc32xx_release_port, | |
| 681 | + .request_port = serial_lpc32xx_request_port, | |
| 682 | + .config_port = serial_lpc32xx_config_port, | |
| 683 | + .verify_port = serial_lpc32xx_verify_port, | |
| 684 | +}; | |
| 685 | + | |
| 686 | +/* | |
| 687 | + * Register a set of serial devices attached to a platform device | |
| 688 | + */ | |
| 689 | +static int __devinit serial_hs_lpc32xx_probe(struct platform_device *pdev) | |
| 690 | +{ | |
| 691 | + struct lpc32xx_hsuart_port *p = &lpc32xx_hs_ports[uarts_registered]; | |
| 692 | + int ret = 0; | |
| 693 | + struct resource *res; | |
| 694 | + | |
| 695 | + if (uarts_registered >= MAX_PORTS) { | |
| 696 | + dev_err(&pdev->dev, | |
| 697 | + "Error: Number of possible ports exceeded (%d)!\n", | |
| 698 | + uarts_registered + 1); | |
| 699 | + return -ENXIO; | |
| 700 | + } | |
| 701 | + | |
| 702 | + memset(p, 0, sizeof(*p)); | |
| 703 | + | |
| 704 | + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | |
| 705 | + if (!res) { | |
| 706 | + dev_err(&pdev->dev, | |
| 707 | + "Error getting mem resource for HS UART port %d\n", | |
| 708 | + uarts_registered); | |
| 709 | + return -ENXIO; | |
| 710 | + } | |
| 711 | + p->port.mapbase = res->start; | |
| 712 | + p->port.membase = NULL; | |
| 713 | + | |
| 714 | + p->port.irq = platform_get_irq(pdev, 0); | |
| 715 | + if (p->port.irq < 0) { | |
| 716 | + dev_err(&pdev->dev, "Error getting irq for HS UART port %d\n", | |
| 717 | + uarts_registered); | |
| 718 | + return p->port.irq; | |
| 719 | + } | |
| 720 | + | |
| 721 | + p->port.iotype = UPIO_MEM32; | |
| 722 | + p->port.uartclk = LPC32XX_MAIN_OSC_FREQ; | |
| 723 | + p->port.regshift = 2; | |
| 724 | + p->port.flags = UPF_BOOT_AUTOCONF | UPF_FIXED_PORT | UPF_IOREMAP; | |
| 725 | + p->port.dev = &pdev->dev; | |
| 726 | + p->port.ops = &serial_lpc32xx_pops; | |
| 727 | + p->port.line = uarts_registered++; | |
| 728 | + spin_lock_init(&p->port.lock); | |
| 729 | + | |
| 730 | + /* send port to loopback mode by default */ | |
| 731 | + lpc32xx_loopback_set(p->port.mapbase, 1); | |
| 732 | + | |
| 733 | + ret = uart_add_one_port(&lpc32xx_hs_reg, &p->port); | |
| 734 | + | |
| 735 | + platform_set_drvdata(pdev, p); | |
| 736 | + | |
| 737 | + return ret; | |
| 738 | +} | |
| 739 | + | |
| 740 | +/* | |
| 741 | + * Remove serial ports registered against a platform device. | |
| 742 | + */ | |
| 743 | +static int __devexit serial_hs_lpc32xx_remove(struct platform_device *pdev) | |
| 744 | +{ | |
| 745 | + struct lpc32xx_hsuart_port *p = platform_get_drvdata(pdev); | |
| 746 | + | |
| 747 | + uart_remove_one_port(&lpc32xx_hs_reg, &p->port); | |
| 748 | + | |
| 749 | + return 0; | |
| 750 | +} | |
| 751 | + | |
| 752 | + | |
| 753 | +#ifdef CONFIG_PM | |
| 754 | +static int serial_hs_lpc32xx_suspend(struct platform_device *pdev, | |
| 755 | + pm_message_t state) | |
| 756 | +{ | |
| 757 | + struct lpc32xx_hsuart_port *p = platform_get_drvdata(pdev); | |
| 758 | + | |
| 759 | + uart_suspend_port(&lpc32xx_hs_reg, &p->port); | |
| 760 | + | |
| 761 | + return 0; | |
| 762 | +} | |
| 763 | + | |
| 764 | +static int serial_hs_lpc32xx_resume(struct platform_device *pdev) | |
| 765 | +{ | |
| 766 | + struct lpc32xx_hsuart_port *p = platform_get_drvdata(pdev); | |
| 767 | + | |
| 768 | + uart_resume_port(&lpc32xx_hs_reg, &p->port); | |
| 769 | + | |
| 770 | + return 0; | |
| 771 | +} | |
| 772 | +#else | |
| 773 | +#define serial_hs_lpc32xx_suspend NULL | |
| 774 | +#define serial_hs_lpc32xx_resume NULL | |
| 775 | +#endif | |
| 776 | + | |
| 777 | +static const struct of_device_id serial_hs_lpc32xx_dt_ids[] = { | |
| 778 | + { .compatible = "nxp,lpc3220-hsuart" }, | |
| 779 | + { /* sentinel */ } | |
| 780 | +}; | |
| 781 | + | |
| 782 | +MODULE_DEVICE_TABLE(of, serial_hs_lpc32xx_dt_ids); | |
| 783 | + | |
| 784 | +static struct platform_driver serial_hs_lpc32xx_driver = { | |
| 785 | + .probe = serial_hs_lpc32xx_probe, | |
| 786 | + .remove = __devexit_p(serial_hs_lpc32xx_remove), | |
| 787 | + .suspend = serial_hs_lpc32xx_suspend, | |
| 788 | + .resume = serial_hs_lpc32xx_resume, | |
| 789 | + .driver = { | |
| 790 | + .name = MODNAME, | |
| 791 | + .owner = THIS_MODULE, | |
| 792 | + .of_match_table = serial_hs_lpc32xx_dt_ids, | |
| 793 | + }, | |
| 794 | +}; | |
| 795 | + | |
| 796 | +static int __init lpc32xx_hsuart_init(void) | |
| 797 | +{ | |
| 798 | + int ret; | |
| 799 | + | |
| 800 | + ret = uart_register_driver(&lpc32xx_hs_reg); | |
| 801 | + if (ret) | |
| 802 | + return ret; | |
| 803 | + | |
| 804 | + ret = platform_driver_register(&serial_hs_lpc32xx_driver); | |
| 805 | + if (ret) | |
| 806 | + uart_unregister_driver(&lpc32xx_hs_reg); | |
| 807 | + | |
| 808 | + return ret; | |
| 809 | +} | |
| 810 | + | |
| 811 | +static void __exit lpc32xx_hsuart_exit(void) | |
| 812 | +{ | |
| 813 | + platform_driver_unregister(&serial_hs_lpc32xx_driver); | |
| 814 | + uart_unregister_driver(&lpc32xx_hs_reg); | |
| 815 | +} | |
| 816 | + | |
| 817 | +module_init(lpc32xx_hsuart_init); | |
| 818 | +module_exit(lpc32xx_hsuart_exit); | |
| 819 | + | |
| 820 | +MODULE_AUTHOR("Kevin Wells <kevin.wells@nxp.com>"); | |
| 821 | +MODULE_AUTHOR("Roland Stigge <stigge@antcom.de>"); | |
| 822 | +MODULE_DESCRIPTION("NXP LPC32XX High Speed UART driver"); | |
| 823 | +MODULE_LICENSE("GPL"); | |
| @@ -44,8 +44,6 @@ · 43 unmodified lines | ||
| 44 | 44 | #include <asm/io.h> |
| 45 | 45 | #include <asm/irq.h> |
| 46 | 46 | |
| 47 | −#define PORT_M32R_BASE PORT_M32R_SIO | |
| 48 | −#define PORT_INDEX(x) (x - PORT_M32R_BASE + 1) | |
| 49 | 47 | #define BAUD_RATE 115200 |
| 50 | 48 | |
| 51 | 49 | #include <linux/serial_core.h> |
| @@ -132,22 +130,6 @@ struct irq_info { · 80 unmodified lines | ||
| 132 | 130 | |
| 133 | 131 | static struct irq_info irq_lists[NR_IRQS]; |
| 134 | 132 | |
| 135 | −/* | |
| 136 | − * Here we define the default xmit fifo size used for each type of UART. | |
| 137 | − */ | |
| 138 | −static const struct serial_uart_config uart_config[] = { | |
| 139 | − [PORT_UNKNOWN] = { | |
| 140 | − .name = "unknown", | |
| 141 | − .dfl_xmit_fifo_size = 1, | |
| 142 | − .flags = 0, | |
| 143 | − }, | |
| 144 | − [PORT_INDEX(PORT_M32R_SIO)] = { | |
| 145 | − .name = "M32RSIO", | |
| 146 | − .dfl_xmit_fifo_size = 1, | |
| 147 | − .flags = 0, | |
| 148 | − }, | |
| 149 | −}; | |
| 150 | − | |
| 151 | 133 | #ifdef CONFIG_SERIAL_M32R_PLDSIO |
| 152 | 134 | |
| 153 | 135 | #define __sio_in(x) inw((unsigned long)(x)) |
| @@ -907,8 +889,7 @@ static void m32r_sio_config_port(struct uart_port *port, int unused) · 753 unmodified lines | ||
| 907 | 889 | |
| 908 | 890 | spin_lock_irqsave(&up->port.lock, flags); |
| 909 | 891 | |
| 910 | − up->port.type = (PORT_M32R_SIO - PORT_M32R_BASE + 1); | |
| 911 | − up->port.fifosize = uart_config[up->port.type].dfl_xmit_fifo_size; | |
| 892 | + up->port.fifosize = 1; | |
| 912 | 893 | |
| 913 | 894 | spin_unlock_irqrestore(&up->port.lock, flags); |
| 914 | 895 | } |
| @@ -916,23 +897,11 @@ static void m32r_sio_config_port(struct uart_port *port, int unused) · 1 unmodified line | ||
| 916 | 897 | static int |
| 917 | 898 | m32r_sio_verify_port(struct uart_port *port, struct serial_struct *ser) |
| 918 | 899 | { |
| 919 | − if (ser->irq >= nr_irqs || ser->irq < 0 || | |
| 920 | − ser->baud_base < 9600 || ser->type < PORT_UNKNOWN || | |
| 921 | − ser->type >= ARRAY_SIZE(uart_config)) | |
| 900 | + if (ser->irq >= nr_irqs || ser->irq < 0 || ser->baud_base < 9600) | |
| 922 | 901 | return -EINVAL; |
| 923 | 902 | return 0; |
| 924 | 903 | } |
| 925 | 904 | |
| 926 | −static const char * | |
| 927 | −m32r_sio_type(struct uart_port *port) | |
| 928 | −{ | |
| 929 | − int type = port->type; | |
| 930 | − | |
| 931 | − if (type >= ARRAY_SIZE(uart_config)) | |
| 932 | − type = 0; | |
| 933 | − return uart_config[type].name; | |
| 934 | −} | |
| 935 | − | |
| 936 | 905 | static struct uart_ops m32r_sio_pops = { |
| 937 | 906 | .tx_empty = m32r_sio_tx_empty, |
| 938 | 907 | .set_mctrl = m32r_sio_set_mctrl, |
| @@ -946,7 +915,6 @@ static struct uart_ops m32r_sio_pops = { · 7 unmodified lines | ||
| 946 | 915 | .shutdown = m32r_sio_shutdown, |
| 947 | 916 | .set_termios = m32r_sio_set_termios, |
| 948 | 917 | .pm = m32r_sio_pm, |
| 949 | − .type = m32r_sio_type, | |
| 950 | 918 | .release_port = m32r_sio_release_port, |
| 951 | 919 | .request_port = m32r_sio_request_port, |
| 952 | 920 | .config_port = m32r_sio_config_port, |
| @@ -910,17 +910,7 @@ static struct spi_driver max3100_driver = { · 909 unmodified lines | ||
| 910 | 910 | .resume = max3100_resume, |
| 911 | 911 | }; |
| 912 | 912 | |
| 913 | −static int __init max3100_init(void) | |
| 914 | −{ | |
| 915 | − return spi_register_driver(&max3100_driver); | |
| 916 | −} | |
| 917 | −module_init(max3100_init); | |
| 918 | − | |
| 919 | −static void __exit max3100_exit(void) | |
| 920 | −{ | |
| 921 | − spi_unregister_driver(&max3100_driver); | |
| 922 | −} | |
| 923 | −module_exit(max3100_exit); | |
| 913 | +module_spi_driver(max3100_driver); | |
| 924 | 914 | |
| 925 | 915 | MODULE_DESCRIPTION("MAX3100 driver"); |
| 926 | 916 | MODULE_AUTHOR("Christian Pellegrin <chripell@evolware.org>"); |
| @@ -1,1215 +0,0 @@ | ||
| 1 | −/* | |
| 2 | − * max3107.c - spi uart protocol driver for Maxim 3107 | |
| 3 | − * Based on max3100.c | |
| 4 | − * by Christian Pellegrin <chripell@evolware.org> | |
| 5 | − * and max3110.c | |
| 6 | − * by Feng Tang <feng.tang@intel.com> | |
| 7 | − * | |
| 8 | − * Copyright (C) Aavamobile 2009 | |
| 9 | − * | |
| 10 | − * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
| 11 | − * | |
| 12 | − * This program is free software; you can redistribute it and/or modify | |
| 13 | − * it under the terms of the GNU General Public License as published by | |
| 14 | − * the Free Software Foundation; either version 2 of the License, or | |
| 15 | − * (at your option) any later version. | |
| 16 | − * | |
| 17 | − * This program is distributed in the hope that it will be useful, | |
| 18 | − * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 19 | − * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 20 | − * GNU General Public License for more details. | |
| 21 | − * | |
| 22 | − * You should have received a copy of the GNU General Public License | |
| 23 | − * along with this program; if not, write to the Free Software | |
| 24 | − * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| 25 | − * | |
| 26 | − * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
| 27 | − * | |
| 28 | − */ | |
| 29 | − | |
| 30 | −#include <linux/delay.h> | |
| 31 | −#include <linux/device.h> | |
| 32 | −#include <linux/serial_core.h> | |
| 33 | −#include <linux/serial.h> | |
| 34 | −#include <linux/tty.h> | |
| 35 | −#include <linux/tty_flip.h> | |
| 36 | −#include <linux/gpio.h> | |
| 37 | −#include <linux/spi/spi.h> | |
| 38 | −#include <linux/freezer.h> | |
| 39 | −#include <linux/module.h> | |
| 40 | −#include "max3107.h" | |
| 41 | − | |
| 42 | −static const struct baud_table brg26_ext[] = { | |
| 43 | − { 300, MAX3107_BRG26_B300 }, | |
| 44 | − { 600, MAX3107_BRG26_B600 }, | |
| 45 | − { 1200, MAX3107_BRG26_B1200 }, | |
| 46 | − { 2400, MAX3107_BRG26_B2400 }, | |
| 47 | − { 4800, MAX3107_BRG26_B4800 }, | |
| 48 | − { 9600, MAX3107_BRG26_B9600 }, | |
| 49 | − { 19200, MAX3107_BRG26_B19200 }, | |
| 50 | − { 57600, MAX3107_BRG26_B57600 }, | |
| 51 | − { 115200, MAX3107_BRG26_B115200 }, | |
| 52 | − { 230400, MAX3107_BRG26_B230400 }, | |
| 53 | − { 460800, MAX3107_BRG26_B460800 }, | |
| 54 | − { 921600, MAX3107_BRG26_B921600 }, | |
| 55 | − { 0, 0 } | |
| 56 | −}; | |
| 57 | − | |
| 58 | −static const struct baud_table brg13_int[] = { | |
| 59 | − { 300, MAX3107_BRG13_IB300 }, | |
| 60 | − { 600, MAX3107_BRG13_IB600 }, | |
| 61 | − { 1200, MAX3107_BRG13_IB1200 }, | |
| 62 | − { 2400, MAX3107_BRG13_IB2400 }, | |
| 63 | − { 4800, MAX3107_BRG13_IB4800 }, | |
| 64 | − { 9600, MAX3107_BRG13_IB9600 }, | |
| 65 | − { 19200, MAX3107_BRG13_IB19200 }, | |
| 66 | − { 57600, MAX3107_BRG13_IB57600 }, | |
| 67 | − { 115200, MAX3107_BRG13_IB115200 }, | |
| 68 | − { 230400, MAX3107_BRG13_IB230400 }, | |
| 69 | − { 460800, MAX3107_BRG13_IB460800 }, | |
| 70 | − { 921600, MAX3107_BRG13_IB921600 }, | |
| 71 | − { 0, 0 } | |
| 72 | −}; | |
| 73 | − | |
| 74 | −static u32 get_new_brg(int baud, struct max3107_port *s) | |
| 75 | −{ | |
| 76 | − int i; | |
| 77 | − const struct baud_table *baud_tbl = s->baud_tbl; | |
| 78 | − | |
| 79 | − for (i = 0; i < 13; i++) { | |
| 80 | − if (baud == baud_tbl[i].baud) | |
| 81 | − return baud_tbl[i].new_brg; | |
| 82 | − } | |
| 83 | − | |
| 84 | − return 0; | |
| 85 | −} | |
| 86 | − | |
| 87 | −/* Perform SPI transfer for write/read of device register(s) */ | |
| 88 | −int max3107_rw(struct max3107_port *s, u8 *tx, u8 *rx, int len) | |
| 89 | −{ | |
| 90 | − struct spi_message spi_msg; | |
| 91 | − struct spi_transfer spi_xfer; | |
| 92 | − | |
| 93 | − /* Initialize SPI ,message */ | |
| 94 | − spi_message_init(&spi_msg); | |
| 95 | − | |
| 96 | − /* Initialize SPI transfer */ | |
| 97 | − memset(&spi_xfer, 0, sizeof spi_xfer); | |
| 98 | − spi_xfer.len = len; | |
| 99 | − spi_xfer.tx_buf = tx; | |
| 100 | − spi_xfer.rx_buf = rx; | |
| 101 | − spi_xfer.speed_hz = MAX3107_SPI_SPEED; | |
| 102 | − | |
| 103 | − /* Add SPI transfer to SPI message */ | |
| 104 | − spi_message_add_tail(&spi_xfer, &spi_msg); | |
| 105 | − | |
| 106 | −#ifdef DBG_TRACE_SPI_DATA | |
| 107 | − { | |
| 108 | − int i; | |
| 109 | − pr_info("tx len %d:\n", spi_xfer.len); | |
| 110 | − for (i = 0 ; i < spi_xfer.len && i < 32 ; i++) | |
| 111 | − pr_info(" %x", ((u8 *)spi_xfer.tx_buf)[i]); | |
| 112 | − pr_info("\n"); | |
| 113 | − } | |
| 114 | −#endif | |
| 115 | − | |
| 116 | − /* Perform synchronous SPI transfer */ | |
| 117 | − if (spi_sync(s->spi, &spi_msg)) { | |
| 118 | − dev_err(&s->spi->dev, "spi_sync failure\n"); | |
| 119 | − return -EIO; | |
| 120 | − } | |
| 121 | − | |
| 122 | −#ifdef DBG_TRACE_SPI_DATA | |
| 123 | − if (spi_xfer.rx_buf) { | |
| 124 | − int i; | |
| 125 | − pr_info("rx len %d:\n", spi_xfer.len); | |
| 126 | − for (i = 0 ; i < spi_xfer.len && i < 32 ; i++) | |
| 127 | − pr_info(" %x", ((u8 *)spi_xfer.rx_buf)[i]); | |
| 128 | − pr_info("\n"); | |
| 129 | − } | |
| 130 | −#endif | |
| 131 | − return 0; | |
| 132 | −} | |
| 133 | −EXPORT_SYMBOL_GPL(max3107_rw); | |
| 134 | − | |
| 135 | −/* Puts received data to circular buffer */ | |
| 136 | −static void put_data_to_circ_buf(struct max3107_port *s, unsigned char *data, | |
| 137 | − int len) | |
| 138 | −{ | |
| 139 | − struct uart_port *port = &s->port; | |
| 140 | − struct tty_struct *tty; | |
| 141 | − | |
| 142 | − if (!port->state) | |
| 143 | − return; | |
| 144 | − | |
| 145 | − tty = port->state->port.tty; | |
| 146 | − if (!tty) | |
| 147 | − return; | |
| 148 | − | |
| 149 | − /* Insert received data */ | |
| 150 | − tty_insert_flip_string(tty, data, len); | |
| 151 | − /* Update RX counter */ | |
| 152 | − port->icount.rx += len; | |
| 153 | −} | |
| 154 | − | |
| 155 | −/* Handle data receiving */ | |
| 156 | −static void max3107_handlerx(struct max3107_port *s, u16 rxlvl) | |
| 157 | −{ | |
| 158 | − int i; | |
| 159 | − int j; | |
| 160 | − int len; /* SPI transfer buffer length */ | |
| 161 | − u16 *buf; | |
| 162 | − u8 *valid_str; | |
| 163 | − | |
| 164 | − if (!s->rx_enabled) | |
| 165 | − /* RX is disabled */ | |
| 166 | − return; | |
| 167 | − | |
| 168 | − if (rxlvl == 0) { | |
| 169 | − /* RX fifo is empty */ | |
| 170 | − return; | |
| 171 | − } else if (rxlvl >= MAX3107_RX_FIFO_SIZE) { | |
| 172 | − dev_warn(&s->spi->dev, "Possible RX FIFO overrun %d\n", rxlvl); | |
| 173 | − /* Ensure sanity of RX level */ | |
| 174 | − rxlvl = MAX3107_RX_FIFO_SIZE; | |
| 175 | − } | |
| 176 | − if ((s->rxbuf == 0) || (s->rxstr == 0)) { | |
| 177 | − dev_warn(&s->spi->dev, "Rx buffer/str isn't ready\n"); | |
| 178 | − return; | |
| 179 | − } | |
| 180 | − buf = s->rxbuf; | |
| 181 | − valid_str = s->rxstr; | |
| 182 | − while (rxlvl) { | |
| 183 | − pr_debug("rxlvl %d\n", rxlvl); | |
| 184 | − /* Clear buffer */ | |
| 185 | − memset(buf, 0, sizeof(u16) * (MAX3107_RX_FIFO_SIZE + 2)); | |
| 186 | − len = 0; | |
| 187 | − if (s->irqen_reg & MAX3107_IRQ_RXFIFO_BIT) { | |
| 188 | − /* First disable RX FIFO interrupt */ | |
| 189 | − pr_debug("Disabling RX INT\n"); | |
| 190 | − buf[0] = (MAX3107_WRITE_BIT | MAX3107_IRQEN_REG); | |
| 191 | − s->irqen_reg &= ~MAX3107_IRQ_RXFIFO_BIT; | |
| 192 | − buf[0] |= s->irqen_reg; | |
| 193 | − len++; | |
| 194 | − } | |
| 195 | − /* Just increase the length by amount of words in FIFO since | |
| 196 | − * buffer was zeroed and SPI transfer of 0x0000 means reading | |
| 197 | − * from RX FIFO | |
| 198 | − */ | |
| 199 | − len += rxlvl; | |
| 200 | − /* Append RX level query */ | |
| 201 | − buf[len] = MAX3107_RXFIFOLVL_REG; | |
| 202 | − len++; | |
| 203 | − | |
| 204 | − /* Perform the SPI transfer */ | |
| 205 | − if (max3107_rw(s, (u8 *)buf, (u8 *)buf, len * 2)) { | |
| 206 | − dev_err(&s->spi->dev, "SPI transfer for RX h failed\n"); | |
| 207 | − return; | |
| 208 | − } | |
| 209 | − | |
| 210 | − /* Skip RX FIFO interrupt disabling word if it was added */ | |
| 211 | − j = ((len - 1) - rxlvl); | |
| 212 | − /* Read received words */ | |
| 213 | − for (i = 0; i < rxlvl; i++, j++) | |
| 214 | − valid_str[i] = (u8)buf[j]; | |
| 215 | − put_data_to_circ_buf(s, valid_str, rxlvl); | |
| 216 | − /* Get new RX level */ | |
| 217 | − rxlvl = (buf[len - 1] & MAX3107_SPI_RX_DATA_MASK); | |
| 218 | − } | |
| 219 | − | |
| 220 | − if (s->rx_enabled) { | |
| 221 | − /* RX still enabled, re-enable RX FIFO interrupt */ | |
| 222 | − pr_debug("Enabling RX INT\n"); | |
| 223 | − buf[0] = (MAX3107_WRITE_BIT | MAX3107_IRQEN_REG); | |
| 224 | − s->irqen_reg |= MAX3107_IRQ_RXFIFO_BIT; | |
| 225 | − buf[0] |= s->irqen_reg; | |
| 226 | − if (max3107_rw(s, (u8 *)buf, NULL, 2)) | |
| 227 | − dev_err(&s->spi->dev, "RX FIFO INT enabling failed\n"); | |
| 228 | − } | |
| 229 | − | |
| 230 | − /* Push the received data to receivers */ | |
| 231 | − if (s->port.state->port.tty) | |
| 232 | − tty_flip_buffer_push(s->port.state->port.tty); | |
| 233 | −} | |
| 234 | − | |
| 235 | − | |
| 236 | −/* Handle data sending */ | |
| 237 | −static void max3107_handletx(struct max3107_port *s) | |
| 238 | −{ | |
| 239 | − struct circ_buf *xmit = &s->port.state->xmit; | |
| 240 | − int i; | |
| 241 | − unsigned long flags; | |
| 242 | − int len; /* SPI transfer buffer length */ | |
| 243 | − u16 *buf; | |
| 244 | − | |
| 245 | − if (!s->tx_fifo_empty) | |
| 246 | − /* Don't send more data before previous data is sent */ | |
| 247 | − return; | |
| 248 | − | |
| 249 | − if (uart_circ_empty(xmit) || uart_tx_stopped(&s->port)) | |
| 250 | − /* No data to send or TX is stopped */ | |
| 251 | − return; | |
| 252 | − | |
| 253 | − if (!s->txbuf) { | |
| 254 | − dev_warn(&s->spi->dev, "Txbuf isn't ready\n"); | |
| 255 | − return; | |
| 256 | − } | |
| 257 | − buf = s->txbuf; | |
| 258 | − /* Get length of data pending in circular buffer */ | |
| 259 | − len = uart_circ_chars_pending(xmit); | |
| 260 | − if (len) { | |
| 261 | − /* Limit to size of TX FIFO */ | |
| 262 | − if (len > MAX3107_TX_FIFO_SIZE) | |
| 263 | − len = MAX3107_TX_FIFO_SIZE; | |
| 264 | − | |
| 265 | − pr_debug("txlen %d\n", len); | |
| 266 | − | |
| 267 | − /* Update TX counter */ | |
| 268 | − s->port.icount.tx += len; | |
| 269 | − | |
| 270 | − /* TX FIFO will no longer be empty */ | |
| 271 | − s->tx_fifo_empty = 0; | |
| 272 | − | |
| 273 | − i = 0; | |
| 274 | − if (s->irqen_reg & MAX3107_IRQ_TXEMPTY_BIT) { | |
| 275 | − /* First disable TX empty interrupt */ | |
| 276 | − pr_debug("Disabling TE INT\n"); | |
| 277 | − buf[i] = (MAX3107_WRITE_BIT | MAX3107_IRQEN_REG); | |
| 278 | − s->irqen_reg &= ~MAX3107_IRQ_TXEMPTY_BIT; | |
| 279 | − buf[i] |= s->irqen_reg; | |
| 280 | − i++; | |
| 281 | − len++; | |
| 282 | − } | |
| 283 | − /* Add data to send */ | |
| 284 | − spin_lock_irqsave(&s->port.lock, flags); | |
| 285 | − for ( ; i < len ; i++) { | |
| 286 | − buf[i] = (MAX3107_WRITE_BIT | MAX3107_THR_REG); | |
| 287 | − buf[i] |= ((u16)xmit->buf[xmit->tail] & | |
| 288 | − MAX3107_SPI_TX_DATA_MASK); | |
| 289 | − xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); | |
| 290 | − } | |
| 291 | − spin_unlock_irqrestore(&s->port.lock, flags); | |
| 292 | − if (!(s->irqen_reg & MAX3107_IRQ_TXEMPTY_BIT)) { | |
| 293 | − /* Enable TX empty interrupt */ | |
| 294 | − pr_debug("Enabling TE INT\n"); | |
| 295 | − buf[i] = (MAX3107_WRITE_BIT | MAX3107_IRQEN_REG); | |
| 296 | − s->irqen_reg |= MAX3107_IRQ_TXEMPTY_BIT; | |
| 297 | − buf[i] |= s->irqen_reg; | |
| 298 | − i++; | |
| 299 | − len++; | |
| 300 | − } | |
| 301 | − if (!s->tx_enabled) { | |
| 302 | − /* Enable TX */ | |
| 303 | − pr_debug("Enable TX\n"); | |
| 304 | − buf[i] = (MAX3107_WRITE_BIT | MAX3107_MODE1_REG); | |
| 305 | − spin_lock_irqsave(&s->data_lock, flags); | |
| 306 | − s->mode1_reg &= ~MAX3107_MODE1_TXDIS_BIT; | |
| 307 | − buf[i] |= s->mode1_reg; | |
| 308 | − spin_unlock_irqrestore(&s->data_lock, flags); | |
| 309 | − s->tx_enabled = 1; | |
| 310 | − i++; | |
| 311 | − len++; | |
| 312 | − } | |
| 313 | − | |
| 314 | − /* Perform the SPI transfer */ | |
| 315 | − if (max3107_rw(s, (u8 *)buf, NULL, len*2)) { | |
| 316 | − dev_err(&s->spi->dev, | |
| 317 | − "SPI transfer TX handling failed\n"); | |
| 318 | − return; | |
| 319 | − } | |
| 320 | − } | |
| 321 | − | |
| 322 | − /* Indicate wake up if circular buffer is getting low on data */ | |
| 323 | − if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) | |
| 324 | − uart_write_wakeup(&s->port); | |
| 325 | − | |
| 326 | −} | |
| 327 | − | |
| 328 | −/* Handle interrupts | |
| 329 | − * Also reads and returns current RX FIFO level | |
| 330 | − */ | |
| 331 | −static u16 handle_interrupt(struct max3107_port *s) | |
| 332 | −{ | |
| 333 | − u16 buf[4]; /* Buffer for SPI transfers */ | |
| 334 | − u8 irq_status; | |
| 335 | − u16 rx_level; | |
| 336 | − unsigned long flags; | |
| 337 | − | |
| 338 | − /* Read IRQ status register */ | |
| 339 | − buf[0] = MAX3107_IRQSTS_REG; | |
| 340 | − /* Read status IRQ status register */ | |
| 341 | − buf[1] = MAX3107_STS_IRQSTS_REG; | |
| 342 | − /* Read LSR IRQ status register */ | |
| 343 | − buf[2] = MAX3107_LSR_IRQSTS_REG; | |
| 344 | − /* Query RX level */ | |
| 345 | − buf[3] = MAX3107_RXFIFOLVL_REG; | |
| 346 | − | |
| 347 | − if (max3107_rw(s, (u8 *)buf, (u8 *)buf, 8)) { | |
| 348 | − dev_err(&s->spi->dev, | |
| 349 | − "SPI transfer for INTR handling failed\n"); | |
| 350 | − return 0; | |
| 351 | − } | |
| 352 | − | |
| 353 | − irq_status = (u8)buf[0]; | |
| 354 | − pr_debug("IRQSTS %x\n", irq_status); | |
| 355 | − rx_level = (buf[3] & MAX3107_SPI_RX_DATA_MASK); | |
| 356 | − | |
| 357 | − if (irq_status & MAX3107_IRQ_LSR_BIT) { | |
| 358 | − /* LSR interrupt */ | |
| 359 | − if (buf[2] & MAX3107_LSR_RXTO_BIT) | |
| 360 | − /* RX timeout interrupt, | |
| 361 | − * handled by normal RX handling | |
| 362 | − */ | |
| 363 | − pr_debug("RX TO INT\n"); | |
| 364 | − } | |
| 365 | − | |
| 366 | − if (irq_status & MAX3107_IRQ_TXEMPTY_BIT) { | |
| 367 | − /* Tx empty interrupt, | |
| 368 | − * disable TX and set tx_fifo_empty flag | |
| 369 | − */ | |
| 370 | − pr_debug("TE INT, disabling TX\n"); | |
| 371 | − buf[0] = (MAX3107_WRITE_BIT | MAX3107_MODE1_REG); | |
| 372 | − spin_lock_irqsave(&s->data_lock, flags); | |
| 373 | − s->mode1_reg |= MAX3107_MODE1_TXDIS_BIT; | |
| 374 | − buf[0] |= s->mode1_reg; | |
| 375 | − spin_unlock_irqrestore(&s->data_lock, flags); | |
| 376 | − if (max3107_rw(s, (u8 *)buf, NULL, 2)) | |
| 377 | − dev_err(&s->spi->dev, "SPI transfer TX dis failed\n"); | |
| 378 | − s->tx_enabled = 0; | |
| 379 | − s->tx_fifo_empty = 1; | |
| 380 | − } | |
| 381 | − | |
| 382 | − if (irq_status & MAX3107_IRQ_RXFIFO_BIT) | |
| 383 | − /* RX FIFO interrupt, | |
| 384 | − * handled by normal RX handling | |
| 385 | − */ | |
| 386 | − pr_debug("RFIFO INT\n"); | |
| 387 | − | |
| 388 | − /* Return RX level */ | |
| 389 | − return rx_level; | |
| 390 | −} | |
| 391 | − | |
| 392 | −/* Trigger work thread*/ | |
| 393 | −static void max3107_dowork(struct max3107_port *s) | |
| 394 | −{ | |
| 395 | − if (!work_pending(&s->work) && !freezing(current) && !s->suspended) | |
| 396 | − queue_work(s->workqueue, &s->work); | |
| 397 | − else | |
| 398 | − dev_warn(&s->spi->dev, "interrup isn't serviced normally!\n"); | |
| 399 | −} | |
| 400 | − | |
| 401 | −/* Work thread */ | |
| 402 | −static void max3107_work(struct work_struct *w) | |
| 403 | −{ | |
| 404 | − struct max3107_port *s = container_of(w, struct max3107_port, work); | |
| 405 | − u16 rxlvl = 0; | |
| 406 | − int len; /* SPI transfer buffer length */ | |
| 407 | − u16 buf[5]; /* Buffer for SPI transfers */ | |
| 408 | − unsigned long flags; | |
| 409 | − | |
| 410 | − /* Start by reading current RX FIFO level */ | |
| 411 | − buf[0] = MAX3107_RXFIFOLVL_REG; | |
| 412 | − if (max3107_rw(s, (u8 *)buf, (u8 *)buf, 2)) { | |
| 413 | − dev_err(&s->spi->dev, "SPI transfer RX lev failed\n"); | |
| 414 | − rxlvl = 0; | |
| 415 | − } else { | |
| 416 | − rxlvl = (buf[0] & MAX3107_SPI_RX_DATA_MASK); | |
| 417 | − } | |
| 418 | − | |
| 419 | − do { | |
| 420 | − pr_debug("rxlvl %d\n", rxlvl); | |
| 421 | − | |
| 422 | − /* Handle RX */ | |
| 423 | − max3107_handlerx(s, rxlvl); | |
| 424 | − rxlvl = 0; | |
| 425 | − | |
| 426 | − if (s->handle_irq) { | |
| 427 | − /* Handle pending interrupts | |
| 428 | − * We also get new RX FIFO level since new data may | |
| 429 | − * have been received while pushing received data to | |
| 430 | − * receivers | |
| 431 | − */ | |
| 432 | − s->handle_irq = 0; | |
| 433 | − rxlvl = handle_interrupt(s); | |
| 434 | − } | |
| 435 | − | |
| 436 | − /* Handle TX */ | |
| 437 | − max3107_handletx(s); | |
| 438 | − | |
| 439 | − /* Handle configuration changes */ | |
| 440 | − len = 0; | |
| 441 | − spin_lock_irqsave(&s->data_lock, flags); | |
| 442 | − if (s->mode1_commit) { | |
| 443 | − pr_debug("mode1_commit\n"); | |
| 444 | − buf[len] = (MAX3107_WRITE_BIT | MAX3107_MODE1_REG); | |
| 445 | − buf[len++] |= s->mode1_reg; | |
| 446 | − s->mode1_commit = 0; | |
| 447 | − } | |
| 448 | − if (s->lcr_commit) { | |
| 449 | − pr_debug("lcr_commit\n"); | |
| 450 | − buf[len] = (MAX3107_WRITE_BIT | MAX3107_LCR_REG); | |
| 451 | − buf[len++] |= s->lcr_reg; | |
| 452 | − s->lcr_commit = 0; | |
| 453 | − } | |
| 454 | − if (s->brg_commit) { | |
| 455 | − pr_debug("brg_commit\n"); | |
| 456 | − buf[len] = (MAX3107_WRITE_BIT | MAX3107_BRGDIVMSB_REG); | |
| 457 | − buf[len++] |= ((s->brg_cfg >> 16) & | |
| 458 | − MAX3107_SPI_TX_DATA_MASK); | |
| 459 | − buf[len] = (MAX3107_WRITE_BIT | MAX3107_BRGDIVLSB_REG); | |
| 460 | − buf[len++] |= ((s->brg_cfg >> 8) & | |
| 461 | − MAX3107_SPI_TX_DATA_MASK); | |
| 462 | − buf[len] = (MAX3107_WRITE_BIT | MAX3107_BRGCFG_REG); | |
| 463 | − buf[len++] |= ((s->brg_cfg) & 0xff); | |
| 464 | − s->brg_commit = 0; | |
| 465 | − } | |
| 466 | − spin_unlock_irqrestore(&s->data_lock, flags); | |
| 467 | − | |
| 468 | − if (len > 0) { | |
| 469 | − if (max3107_rw(s, (u8 *)buf, NULL, len * 2)) | |
| 470 | − dev_err(&s->spi->dev, | |
| 471 | − "SPI transfer config failed\n"); | |
| 472 | − } | |
| 473 | − | |
| 474 | − /* Reloop if interrupt handling indicated data in RX FIFO */ | |
| 475 | − } while (rxlvl); | |
| 476 | − | |
| 477 | −} | |
| 478 | − | |
| 479 | −/* Set sleep mode */ | |
| 480 | −static void max3107_set_sleep(struct max3107_port *s, int mode) | |
| 481 | −{ | |
| 482 | − u16 buf[1]; /* Buffer for SPI transfer */ | |
| 483 | − unsigned long flags; | |
| 484 | − pr_debug("enter, mode %d\n", mode); | |
| 485 | − | |
| 486 | − buf[0] = (MAX3107_WRITE_BIT | MAX3107_MODE1_REG); | |
| 487 | − spin_lock_irqsave(&s->data_lock, flags); | |
| 488 | − switch (mode) { | |
| 489 | − case MAX3107_DISABLE_FORCED_SLEEP: | |
| 490 | − s->mode1_reg &= ~MAX3107_MODE1_FORCESLEEP_BIT; | |
| 491 | − break; | |
| 492 | − case MAX3107_ENABLE_FORCED_SLEEP: | |
| 493 | − s->mode1_reg |= MAX3107_MODE1_FORCESLEEP_BIT; | |
| 494 | − break; | |
| 495 | − case MAX3107_DISABLE_AUTOSLEEP: | |
| 496 | − s->mode1_reg &= ~MAX3107_MODE1_AUTOSLEEP_BIT; | |
| 497 | − break; | |
| 498 | − case MAX3107_ENABLE_AUTOSLEEP: | |
| 499 | − s->mode1_reg |= MAX3107_MODE1_AUTOSLEEP_BIT; | |
| 500 | − break; | |
| 501 | − default: | |
| 502 | − spin_unlock_irqrestore(&s->data_lock, flags); | |
| 503 | − dev_warn(&s->spi->dev, "invalid sleep mode\n"); | |
| 504 | − return; | |
| 505 | − } | |
| 506 | − buf[0] |= s->mode1_reg; | |
| 507 | − spin_unlock_irqrestore(&s->data_lock, flags); | |
| 508 | − | |
| 509 | − if (max3107_rw(s, (u8 *)buf, NULL, 2)) | |
| 510 | − dev_err(&s->spi->dev, "SPI transfer sleep mode failed\n"); | |
| 511 | − | |
| 512 | − if (mode == MAX3107_DISABLE_AUTOSLEEP || | |
| 513 | − mode == MAX3107_DISABLE_FORCED_SLEEP) | |
| 514 | − msleep(MAX3107_WAKEUP_DELAY); | |
| 515 | −} | |
| 516 | − | |
| 517 | −/* Perform full register initialization */ | |
| 518 | −static void max3107_register_init(struct max3107_port *s) | |
| 519 | −{ | |
| 520 | − u16 buf[11]; /* Buffer for SPI transfers */ | |
| 521 | − | |
| 522 | − /* 1. Configure baud rate, 9600 as default */ | |
| 523 | − s->baud = 9600; | |
| 524 | − /* the below is default*/ | |
| 525 | − if (s->ext_clk) { | |
| 526 | − s->brg_cfg = MAX3107_BRG26_B9600; | |
| 527 | − s->baud_tbl = (struct baud_table *)brg26_ext; | |
| 528 | − } else { | |
| 529 | − s->brg_cfg = MAX3107_BRG13_IB9600; | |
| 530 | − s->baud_tbl = (struct baud_table *)brg13_int; | |
| 531 | − } | |
| 532 | − | |
| 533 | − if (s->pdata->init) | |
| 534 | − s->pdata->init(s); | |
| 535 | − | |
| 536 | − buf[0] = (MAX3107_WRITE_BIT | MAX3107_BRGDIVMSB_REG) | |
| 537 | − | ((s->brg_cfg >> 16) & MAX3107_SPI_TX_DATA_MASK); | |
| 538 | − buf[1] = (MAX3107_WRITE_BIT | MAX3107_BRGDIVLSB_REG) | |
| 539 | − | ((s->brg_cfg >> 8) & MAX3107_SPI_TX_DATA_MASK); | |
| 540 | − buf[2] = (MAX3107_WRITE_BIT | MAX3107_BRGCFG_REG) | |
| 541 | − | ((s->brg_cfg) & 0xff); | |
| 542 | − | |
| 543 | − /* 2. Configure LCR register, 8N1 mode by default */ | |
| 544 | − s->lcr_reg = MAX3107_LCR_WORD_LEN_8; | |
| 545 | − buf[3] = (MAX3107_WRITE_BIT | MAX3107_LCR_REG) | |
| 546 | − | s->lcr_reg; | |
| 547 | − | |
| 548 | − /* 3. Configure MODE 1 register */ | |
| 549 | − s->mode1_reg = 0; | |
| 550 | − /* Enable IRQ pin */ | |
| 551 | − s->mode1_reg |= MAX3107_MODE1_IRQSEL_BIT; | |
| 552 | − /* Disable TX */ | |
| 553 | − s->mode1_reg |= MAX3107_MODE1_TXDIS_BIT; | |
| 554 | − s->tx_enabled = 0; | |
| 555 | − /* RX is enabled */ | |
| 556 | − s->rx_enabled = 1; | |
| 557 | − buf[4] = (MAX3107_WRITE_BIT | MAX3107_MODE1_REG) | |
| 558 | − | s->mode1_reg; | |
| 559 | − | |
| 560 | − /* 4. Configure MODE 2 register */ | |
| 561 | − buf[5] = (MAX3107_WRITE_BIT | MAX3107_MODE2_REG); | |
| 562 | − if (s->loopback) { | |
| 563 | − /* Enable loopback */ | |
| 564 | − buf[5] |= MAX3107_MODE2_LOOPBACK_BIT; | |
| 565 | − } | |
| 566 | − /* Reset FIFOs */ | |
| 567 | − buf[5] |= MAX3107_MODE2_FIFORST_BIT; | |
| 568 | − s->tx_fifo_empty = 1; | |
| 569 | − | |
| 570 | − /* 5. Configure FIFO trigger level register */ | |
| 571 | − buf[6] = (MAX3107_WRITE_BIT | MAX3107_FIFOTRIGLVL_REG); | |
| 572 | − /* RX FIFO trigger for 16 words, TX FIFO trigger not used */ | |
| 573 | − buf[6] |= (MAX3107_FIFOTRIGLVL_RX(16) | MAX3107_FIFOTRIGLVL_TX(0)); | |
| 574 | − | |
| 575 | − /* 6. Configure flow control levels */ | |
| 576 | − buf[7] = (MAX3107_WRITE_BIT | MAX3107_FLOWLVL_REG); | |
| 577 | − /* Flow control halt level 96, resume level 48 */ | |
| 578 | − buf[7] |= (MAX3107_FLOWLVL_RES(48) | MAX3107_FLOWLVL_HALT(96)); | |
| 579 | − | |
| 580 | − /* 7. Configure flow control */ | |
| 581 | − buf[8] = (MAX3107_WRITE_BIT | MAX3107_FLOWCTRL_REG); | |
| 582 | − /* Enable auto CTS and auto RTS flow control */ | |
| 583 | − buf[8] |= (MAX3107_FLOWCTRL_AUTOCTS_BIT | MAX3107_FLOWCTRL_AUTORTS_BIT); | |
| 584 | − | |
| 585 | − /* 8. Configure RX timeout register */ | |
| 586 | − buf[9] = (MAX3107_WRITE_BIT | MAX3107_RXTO_REG); | |
| 587 | − /* Timeout after 48 character intervals */ | |
| 588 | − buf[9] |= 0x0030; | |
| 589 | − | |
| 590 | − /* 9. Configure LSR interrupt enable register */ | |
| 591 | − buf[10] = (MAX3107_WRITE_BIT | MAX3107_LSR_IRQEN_REG); | |
| 592 | − /* Enable RX timeout interrupt */ | |
| 593 | − buf[10] |= MAX3107_LSR_RXTO_BIT; | |
| 594 | − | |
| 595 | − /* Perform SPI transfer */ | |
| 596 | − if (max3107_rw(s, (u8 *)buf, NULL, 22)) | |
| 597 | − dev_err(&s->spi->dev, "SPI transfer for init failed\n"); | |
| 598 | − | |
| 599 | − /* 10. Clear IRQ status register by reading it */ | |
| 600 | − buf[0] = MAX3107_IRQSTS_REG; | |
| 601 | − | |
| 602 | − /* 11. Configure interrupt enable register */ | |
| 603 | − /* Enable LSR interrupt */ | |
| 604 | − s->irqen_reg = MAX3107_IRQ_LSR_BIT; | |
| 605 | − /* Enable RX FIFO interrupt */ | |
| 606 | − s->irqen_reg |= MAX3107_IRQ_RXFIFO_BIT; | |
| 607 | − buf[1] = (MAX3107_WRITE_BIT | MAX3107_IRQEN_REG) | |
| 608 | − | s->irqen_reg; | |
| 609 | − | |
| 610 | − /* 12. Clear FIFO reset that was set in step 6 */ | |
| 611 | − buf[2] = (MAX3107_WRITE_BIT | MAX3107_MODE2_REG); | |
| 612 | − if (s->loopback) { | |
| 613 | − /* Keep loopback enabled */ | |
| 614 | − buf[2] |= MAX3107_MODE2_LOOPBACK_BIT; | |
| 615 | − } | |
| 616 | − | |
| 617 | − /* Perform SPI transfer */ | |
| 618 | − if (max3107_rw(s, (u8 *)buf, (u8 *)buf, 6)) | |
| 619 | − dev_err(&s->spi->dev, "SPI transfer for init failed\n"); | |
| 620 | − | |
| 621 | −} | |
| 622 | − | |
| 623 | −/* IRQ handler */ | |
| 624 | −static irqreturn_t max3107_irq(int irqno, void *dev_id) | |
| 625 | −{ | |
| 626 | − struct max3107_port *s = dev_id; | |
| 627 | − | |
| 628 | − if (irqno != s->spi->irq) { | |
| 629 | − /* Unexpected IRQ */ | |
| 630 | − return IRQ_NONE; | |
| 631 | − } | |
| 632 | − | |
| 633 | − /* Indicate irq */ | |
| 634 | − s->handle_irq = 1; | |
| 635 | − | |
| 636 | − /* Trigger work thread */ | |
| 637 | − max3107_dowork(s); | |
| 638 | − | |
| 639 | − return IRQ_HANDLED; | |
| 640 | −} | |
| 641 | − | |
| 642 | −/* HW suspension function | |
| 643 | − * | |
| 644 | − * Currently autosleep is used to decrease current consumption, alternative | |
| 645 | − * approach would be to set the chip to reset mode if UART is not being | |
| 646 | − * used but that would mess the GPIOs | |
| 647 | − * | |
| 648 | − */ | |
| 649 | −void max3107_hw_susp(struct max3107_port *s, int suspend) | |
| 650 | −{ | |
| 651 | − pr_debug("enter, suspend %d\n", suspend); | |
| 652 | − | |
| 653 | − if (suspend) { | |
| 654 | − /* Suspend requested, | |
| 655 | − * enable autosleep to decrease current consumption | |
| 656 | − */ | |
| 657 | − s->suspended = 1; | |
| 658 | − max3107_set_sleep(s, MAX3107_ENABLE_AUTOSLEEP); | |
| 659 | − } else { | |
| 660 | − /* Resume requested, | |
| 661 | − * disable autosleep | |
| 662 | − */ | |
| 663 | − s->suspended = 0; | |
| 664 | − max3107_set_sleep(s, MAX3107_DISABLE_AUTOSLEEP); | |
| 665 | − } | |
| 666 | −} | |
| 667 | −EXPORT_SYMBOL_GPL(max3107_hw_susp); | |
| 668 | − | |
| 669 | −/* Modem status IRQ enabling */ | |
| 670 | −static void max3107_enable_ms(struct uart_port *port) | |
| 671 | −{ | |
| 672 | − /* Modem status not supported */ | |
| 673 | −} | |
| 674 | − | |
| 675 | −/* Data send function */ | |
| 676 | −static void max3107_start_tx(struct uart_port *port) | |
| 677 | −{ | |
| 678 | − struct max3107_port *s = container_of(port, struct max3107_port, port); | |
| 679 | − | |
| 680 | − /* Trigger work thread for sending data */ | |
| 681 | − max3107_dowork(s); | |
| 682 | −} | |
| 683 | − | |
| 684 | −/* Function for checking that there is no pending transfers */ | |
| 685 | −static unsigned int max3107_tx_empty(struct uart_port *port) | |
| 686 | −{ | |
| 687 | − struct max3107_port *s = container_of(port, struct max3107_port, port); | |
| 688 | − | |
| 689 | − pr_debug("returning %d\n", | |
| 690 | − (s->tx_fifo_empty && uart_circ_empty(&s->port.state->xmit))); | |
| 691 | − return s->tx_fifo_empty && uart_circ_empty(&s->port.state->xmit); | |
| 692 | −} | |
| 693 | − | |
| 694 | −/* Function for stopping RX */ | |
| 695 | −static void max3107_stop_rx(struct uart_port *port) | |
| 696 | −{ | |
| 697 | − struct max3107_port *s = container_of(port, struct max3107_port, port); | |
| 698 | − unsigned long flags; | |
| 699 | − | |
| 700 | − /* Set RX disabled in MODE 1 register */ | |
| 701 | − spin_lock_irqsave(&s->data_lock, flags); | |
| 702 | − s->mode1_reg |= MAX3107_MODE1_RXDIS_BIT; | |
| 703 | − s->mode1_commit = 1; | |
| 704 | − spin_unlock_irqrestore(&s->data_lock, flags); | |
| 705 | − /* Set RX disabled */ | |
| 706 | − s->rx_enabled = 0; | |
| 707 | − /* Trigger work thread for doing the actual configuration change */ | |
| 708 | − max3107_dowork(s); | |
| 709 | −} | |
| 710 | − | |
| 711 | −/* Function for returning control pin states */ | |
| 712 | −static unsigned int max3107_get_mctrl(struct uart_port *port) | |
| 713 | −{ | |
| 714 | − /* DCD and DSR are not wired and CTS/RTS is handled automatically | |
| 715 | − * so just indicate DSR and CAR asserted | |
| 716 | − */ | |
| 717 | − return TIOCM_DSR | TIOCM_CAR; | |
| 718 | −} | |
| 719 | − | |
| 720 | −/* Function for setting control pin states */ | |
| 721 | −static void max3107_set_mctrl(struct uart_port *port, unsigned int mctrl) | |
| 722 | −{ | |
| 723 | − /* DCD and DSR are not wired and CTS/RTS is hadnled automatically | |
| 724 | − * so do nothing | |
| 725 | − */ | |
| 726 | −} | |
| 727 | − | |
| 728 | −/* Function for configuring UART parameters */ | |
| 729 | −static void max3107_set_termios(struct uart_port *port, | |
| 730 | − struct ktermios *termios, | |
| 731 | − struct ktermios *old) | |
| 732 | −{ | |
| 733 | − struct max3107_port *s = container_of(port, struct max3107_port, port); | |
| 734 | − struct tty_struct *tty; | |
| 735 | − int baud; | |
| 736 | − u16 new_lcr = 0; | |
| 737 | − u32 new_brg = 0; | |
| 738 | − unsigned long flags; | |
| 739 | − | |
| 740 | − if (!port->state) | |
| 741 | − return; | |
| 742 | − | |
| 743 | − tty = port->state->port.tty; | |
| 744 | − if (!tty) | |
| 745 | − return; | |
| 746 | − | |
| 747 | − /* Get new LCR register values */ | |
| 748 | − /* Word size */ | |
| 749 | − if ((termios->c_cflag & CSIZE) == CS7) | |
| 750 | − new_lcr |= MAX3107_LCR_WORD_LEN_7; | |
| 751 | − else | |
| 752 | − new_lcr |= MAX3107_LCR_WORD_LEN_8; | |
| 753 | − | |
| 754 | − /* Parity */ | |
| 755 | − if (termios->c_cflag & PARENB) { | |
| 756 | − new_lcr |= MAX3107_LCR_PARITY_BIT; | |
| 757 | − if (!(termios->c_cflag & PARODD)) | |
| 758 | − new_lcr |= MAX3107_LCR_EVENPARITY_BIT; | |
| 759 | − } | |
| 760 | − | |
| 761 | − /* Stop bits */ | |
| 762 | − if (termios->c_cflag & CSTOPB) { | |
| 763 | − /* 2 stop bits */ | |
| 764 | − new_lcr |= MAX3107_LCR_STOPLEN_BIT; | |
| 765 | − } | |
| 766 | − | |
| 767 | − /* Mask termios capabilities we don't support */ | |
| 768 | − termios->c_cflag &= ~CMSPAR; | |
| 769 | − | |
| 770 | − /* Set status ignore mask */ | |
| 771 | − s->port.ignore_status_mask = 0; | |
| 772 | − if (termios->c_iflag & IGNPAR) | |
| 773 | − s->port.ignore_status_mask |= MAX3107_ALL_ERRORS; | |
| 774 | − | |
| 775 | − /* Set low latency to immediately handle pushed data */ | |
| 776 | − s->port.state->port.tty->low_latency = 1; | |
| 777 | − | |
| 778 | − /* Get new baud rate generator configuration */ | |
| 779 | − baud = tty_get_baud_rate(tty); | |
| 780 | − | |
| 781 | − spin_lock_irqsave(&s->data_lock, flags); | |
| 782 | − new_brg = get_new_brg(baud, s); | |
| 783 | − /* if can't find the corrent config, use previous */ | |
| 784 | − if (!new_brg) { | |
| 785 | − baud = s->baud; | |
| 786 | − new_brg = s->brg_cfg; | |
| 787 | − } | |
| 788 | − spin_unlock_irqrestore(&s->data_lock, flags); | |
| 789 | − tty_termios_encode_baud_rate(termios, baud, baud); | |
| 790 | − s->baud = baud; | |
| 791 | − | |
| 792 | − /* Update timeout according to new baud rate */ | |
| 793 | − uart_update_timeout(port, termios->c_cflag, baud); | |
| 794 | − | |
| 795 | − spin_lock_irqsave(&s->data_lock, flags); | |
| 796 | − if (s->lcr_reg != new_lcr) { | |
| 797 | − s->lcr_reg = new_lcr; | |
| 798 | − s->lcr_commit = 1; | |
| 799 | − } | |
| 800 | − if (s->brg_cfg != new_brg) { | |
| 801 | − s->brg_cfg = new_brg; | |
| 802 | − s->brg_commit = 1; | |
| 803 | − } | |
| 804 | − spin_unlock_irqrestore(&s->data_lock, flags); | |
| 805 | − | |
| 806 | − /* Trigger work thread for doing the actual configuration change */ | |
| 807 | − max3107_dowork(s); | |
| 808 | −} | |
| 809 | − | |
| 810 | −/* Port shutdown function */ | |
| 811 | −static void max3107_shutdown(struct uart_port *port) | |
| 812 | −{ | |
| 813 | − struct max3107_port *s = container_of(port, struct max3107_port, port); | |
| 814 | − | |
| 815 | − if (s->suspended && s->pdata->hw_suspend) | |
| 816 | − s->pdata->hw_suspend(s, 0); | |
| 817 | − | |
| 818 | − /* Free the interrupt */ | |
| 819 | − free_irq(s->spi->irq, s); | |
| 820 | − | |
| 821 | − if (s->workqueue) { | |
| 822 | − /* Flush and destroy work queue */ | |
| 823 | − flush_workqueue(s->workqueue); | |
| 824 | − destroy_workqueue(s->workqueue); | |
| 825 | − s->workqueue = NULL; | |
| 826 | − } | |
| 827 | − | |
| 828 | − /* Suspend HW */ | |
| 829 | − if (s->pdata->hw_suspend) | |
| 830 | − s->pdata->hw_suspend(s, 1); | |
| 831 | −} | |
| 832 | − | |
| 833 | −/* Port startup function */ | |
| 834 | −static int max3107_startup(struct uart_port *port) | |
| 835 | −{ | |
| 836 | − struct max3107_port *s = container_of(port, struct max3107_port, port); | |
| 837 | − | |
| 838 | − /* Initialize work queue */ | |
| 839 | − s->workqueue = create_freezable_workqueue("max3107"); | |
| 840 | − if (!s->workqueue) { | |
| 841 | − dev_err(&s->spi->dev, "Workqueue creation failed\n"); | |
| 842 | − return -EBUSY; | |
| 843 | − } | |
| 844 | − INIT_WORK(&s->work, max3107_work); | |
| 845 | − | |
| 846 | − /* Setup IRQ */ | |
| 847 | − if (request_irq(s->spi->irq, max3107_irq, IRQF_TRIGGER_FALLING, | |
| 848 | − "max3107", s)) { | |
| 849 | − dev_err(&s->spi->dev, "IRQ reguest failed\n"); | |
| 850 | − destroy_workqueue(s->workqueue); | |
| 851 | − s->workqueue = NULL; | |
| 852 | − return -EBUSY; | |
| 853 | − } | |
| 854 | − | |
| 855 | − /* Resume HW */ | |
| 856 | − if (s->pdata->hw_suspend) | |
| 857 | − s->pdata->hw_suspend(s, 0); | |
| 858 | − | |
| 859 | − /* Init registers */ | |
| 860 | − max3107_register_init(s); | |
| 861 | − | |
| 862 | − return 0; | |
| 863 | −} | |
| 864 | − | |
| 865 | −/* Port type function */ | |
| 866 | −static const char *max3107_type(struct uart_port *port) | |
| 867 | −{ | |
| 868 | − struct max3107_port *s = container_of(port, struct max3107_port, port); | |
| 869 | − return s->spi->modalias; | |
| 870 | −} | |
| 871 | − | |
| 872 | −/* Port release function */ | |
| 873 | −static void max3107_release_port(struct uart_port *port) | |
| 874 | −{ | |
| 875 | − /* Do nothing */ | |
| 876 | −} | |
| 877 | − | |
| 878 | −/* Port request function */ | |
| 879 | −static int max3107_request_port(struct uart_port *port) | |
| 880 | −{ | |
| 881 | − /* Do nothing */ | |
| 882 | − return 0; | |
| 883 | −} | |
| 884 | − | |
| 885 | −/* Port config function */ | |
| 886 | −static void max3107_config_port(struct uart_port *port, int flags) | |
| 887 | −{ | |
| 888 | − struct max3107_port *s = container_of(port, struct max3107_port, port); | |
| 889 | − s->port.type = PORT_MAX3107; | |
| 890 | −} | |
| 891 | − | |
| 892 | −/* Port verify function */ | |
| 893 | −static int max3107_verify_port(struct uart_port *port, | |
| 894 | − struct serial_struct *ser) | |
| 895 | −{ | |
| 896 | − if (ser->type == PORT_UNKNOWN || ser->type == PORT_MAX3107) | |
| 897 | − return 0; | |
| 898 | − | |
| 899 | − return -EINVAL; | |
| 900 | −} | |
| 901 | − | |
| 902 | −/* Port stop TX function */ | |
| 903 | −static void max3107_stop_tx(struct uart_port *port) | |
| 904 | −{ | |
| 905 | − /* Do nothing */ | |
| 906 | −} | |
| 907 | − | |
| 908 | −/* Port break control function */ | |
| 909 | −static void max3107_break_ctl(struct uart_port *port, int break_state) | |
| 910 | −{ | |
| 911 | − /* We don't support break control, do nothing */ | |
| 912 | −} | |
| 913 | − | |
| 914 | − | |
| 915 | −/* Port functions */ | |
| 916 | −static struct uart_ops max3107_ops = { | |
| 917 | − .tx_empty = max3107_tx_empty, | |
| 918 | − .set_mctrl = max3107_set_mctrl, | |
| 919 | − .get_mctrl = max3107_get_mctrl, | |
| 920 | − .stop_tx = max3107_stop_tx, | |
| 921 | − .start_tx = max3107_start_tx, | |
| 922 | − .stop_rx = max3107_stop_rx, | |
| 923 | − .enable_ms = max3107_enable_ms, | |
| 924 | − .break_ctl = max3107_break_ctl, | |
| 925 | − .startup = max3107_startup, | |
| 926 | − .shutdown = max3107_shutdown, | |
| 927 | − .set_termios = max3107_set_termios, | |
| 928 | − .type = max3107_type, | |
| 929 | − .release_port = max3107_release_port, | |
| 930 | − .request_port = max3107_request_port, | |
| 931 | − .config_port = max3107_config_port, | |
| 932 | − .verify_port = max3107_verify_port, | |
| 933 | −}; | |
| 934 | − | |
| 935 | −/* UART driver data */ | |
| 936 | −static struct uart_driver max3107_uart_driver = { | |
| 937 | − .owner = THIS_MODULE, | |
| 938 | − .driver_name = "ttyMAX", | |
| 939 | − .dev_name = "ttyMAX", | |
| 940 | − .nr = 1, | |
| 941 | −}; | |
| 942 | − | |
| 943 | −static int driver_registered = 0; | |
| 944 | − | |
| 945 | − | |
| 946 | − | |
| 947 | −/* 'Generic' platform data */ | |
| 948 | −static struct max3107_plat generic_plat_data = { | |
| 949 | − .loopback = 0, | |
| 950 | − .ext_clk = 1, | |
| 951 | − .hw_suspend = max3107_hw_susp, | |
| 952 | − .polled_mode = 0, | |
| 953 | − .poll_time = 0, | |
| 954 | −}; | |
| 955 | − | |
| 956 | − | |
| 957 | −/*******************************************************************/ | |
| 958 | − | |
| 959 | −/** | |
| 960 | − * max3107_probe - SPI bus probe entry point | |
| 961 | − * @spi: the spi device | |
| 962 | − * | |
| 963 | − * SPI wants us to probe this device and if appropriate claim it. | |
| 964 | − * Perform any platform specific requirements and then initialise | |
| 965 | − * the device. | |
| 966 | − */ | |
| 967 | − | |
| 968 | −int max3107_probe(struct spi_device *spi, struct max3107_plat *pdata) | |
| 969 | −{ | |
| 970 | − struct max3107_port *s; | |
| 971 | − u16 buf[2]; /* Buffer for SPI transfers */ | |
| 972 | − int retval; | |
| 973 | − | |
| 974 | − pr_info("enter max3107 probe\n"); | |
| 975 | − | |
| 976 | − /* Allocate port structure */ | |
| 977 | − s = kzalloc(sizeof(*s), GFP_KERNEL); | |
| 978 | − if (!s) { | |
| 979 | − pr_err("Allocating port structure failed\n"); | |
| 980 | − return -ENOMEM; | |
| 981 | − } | |
| 982 | − | |
| 983 | − s->pdata = pdata; | |
| 984 | − | |
| 985 | − /* SPI Rx buffer | |
| 986 | − * +2 for RX FIFO interrupt | |
| 987 | − * disabling and RX level query | |
| 988 | − */ | |
| 989 | − s->rxbuf = kzalloc(sizeof(u16) * (MAX3107_RX_FIFO_SIZE+2), GFP_KERNEL); | |
| 990 | − if (!s->rxbuf) { | |
| 991 | − pr_err("Allocating RX buffer failed\n"); | |
| 992 | − retval = -ENOMEM; | |
| 993 | − goto err_free4; | |
| 994 | − } | |
| 995 | − s->rxstr = kzalloc(sizeof(u8) * MAX3107_RX_FIFO_SIZE, GFP_KERNEL); | |
| 996 | − if (!s->rxstr) { | |
| 997 | − pr_err("Allocating RX buffer failed\n"); | |
| 998 | − retval = -ENOMEM; | |
| 999 | − goto err_free3; | |
| 1000 | − } | |
| 1001 | − /* SPI Tx buffer | |
| 1002 | − * SPI transfer buffer | |
| 1003 | − * +3 for TX FIFO empty | |
| 1004 | − * interrupt disabling and | |
| 1005 | − * enabling and TX enabling | |
| 1006 | − */ | |
| 1007 | − s->txbuf = kzalloc(sizeof(u16) * MAX3107_TX_FIFO_SIZE + 3, GFP_KERNEL); | |
| 1008 | − if (!s->txbuf) { | |
| 1009 | − pr_err("Allocating TX buffer failed\n"); | |
| 1010 | − retval = -ENOMEM; | |
| 1011 | − goto err_free2; | |
| 1012 | − } | |
| 1013 | − /* Initialize shared data lock */ | |
| 1014 | − spin_lock_init(&s->data_lock); | |
| 1015 | − | |
| 1016 | − /* SPI intializations */ | |
| 1017 | − dev_set_drvdata(&spi->dev, s); | |
| 1018 | − spi->mode = SPI_MODE_0; | |
| 1019 | − spi->dev.platform_data = pdata; | |
| 1020 | − spi->bits_per_word = 16; | |
| 1021 | − s->ext_clk = pdata->ext_clk; | |
| 1022 | − s->loopback = pdata->loopback; | |
| 1023 | − spi_setup(spi); | |
| 1024 | − s->spi = spi; | |
| 1025 | − | |
| 1026 | − /* Check REV ID to ensure we are talking to what we expect */ | |
| 1027 | − buf[0] = MAX3107_REVID_REG; | |
| 1028 | − if (max3107_rw(s, (u8 *)buf, (u8 *)buf, 2)) { | |
| 1029 | − dev_err(&s->spi->dev, "SPI transfer for REVID read failed\n"); | |
| 1030 | − retval = -EIO; | |
| 1031 | − goto err_free1; | |
| 1032 | − } | |
| 1033 | − if ((buf[0] & MAX3107_SPI_RX_DATA_MASK) != MAX3107_REVID1 && | |
| 1034 | − (buf[0] & MAX3107_SPI_RX_DATA_MASK) != MAX3107_REVID2) { | |
| 1035 | − dev_err(&s->spi->dev, "REVID %x does not match\n", | |
| 1036 | − (buf[0] & MAX3107_SPI_RX_DATA_MASK)); | |
| 1037 | − retval = -ENODEV; | |
| 1038 | − goto err_free1; | |
| 1039 | − } | |
| 1040 | − | |
| 1041 | − /* Disable all interrupts */ | |
| 1042 | − buf[0] = (MAX3107_WRITE_BIT | MAX3107_IRQEN_REG | 0x0000); | |
| 1043 | − buf[0] |= 0x0000; | |
| 1044 | − | |
| 1045 | − /* Configure clock source */ | |
| 1046 | − buf[1] = (MAX3107_WRITE_BIT | MAX3107_CLKSRC_REG); | |
| 1047 | − if (s->ext_clk) { | |
| 1048 | − /* External clock */ | |
| 1049 | − buf[1] |= MAX3107_CLKSRC_EXTCLK_BIT; | |
| 1050 | − } | |
| 1051 | − | |
| 1052 | − /* PLL bypass ON */ | |
| 1053 | − buf[1] |= MAX3107_CLKSRC_PLLBYP_BIT; | |
| 1054 | − | |
| 1055 | − /* Perform SPI transfer */ | |
| 1056 | − if (max3107_rw(s, (u8 *)buf, NULL, 4)) { | |
| 1057 | − dev_err(&s->spi->dev, "SPI transfer for init failed\n"); | |
| 1058 | − retval = -EIO; | |
| 1059 | − goto err_free1; | |
| 1060 | − } | |
| 1061 | − | |
| 1062 | − /* Register UART driver */ | |
| 1063 | − if (!driver_registered) { | |
| 1064 | − retval = uart_register_driver(&max3107_uart_driver); | |
| 1065 | − if (retval) { | |
| 1066 | − dev_err(&s->spi->dev, "Registering UART driver failed\n"); | |
| 1067 | − goto err_free1; | |
| 1068 | − } | |
| 1069 | − driver_registered = 1; | |
| 1070 | − } | |
| 1071 | − | |
| 1072 | − /* Initialize UART port data */ | |
| 1073 | − s->port.fifosize = 128; | |
| 1074 | − s->port.ops = &max3107_ops; | |
| 1075 | − s->port.line = 0; | |
| 1076 | − s->port.dev = &spi->dev; | |
| 1077 | − s->port.uartclk = 9600; | |
| 1078 | − s->port.flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF; | |
| 1079 | − s->port.irq = s->spi->irq; | |
| 1080 | − s->port.type = PORT_MAX3107; | |
| 1081 | − | |
| 1082 | − /* Add UART port */ | |
| 1083 | − retval = uart_add_one_port(&max3107_uart_driver, &s->port); | |
| 1084 | − if (retval < 0) { | |
| 1085 | − dev_err(&s->spi->dev, "Adding UART port failed\n"); | |
| 1086 | − goto err_free1; | |
| 1087 | − } | |
| 1088 | − | |
| 1089 | − if (pdata->configure) { | |
| 1090 | − retval = pdata->configure(s); | |
| 1091 | − if (retval < 0) | |
| 1092 | − goto err_free1; | |
| 1093 | − } | |
| 1094 | − | |
| 1095 | − /* Go to suspend mode */ | |
| 1096 | − if (pdata->hw_suspend) | |
| 1097 | − pdata->hw_suspend(s, 1); | |
| 1098 | − | |
| 1099 | − return 0; | |
| 1100 | − | |
| 1101 | −err_free1: | |
| 1102 | − kfree(s->txbuf); | |
| 1103 | −err_free2: | |
| 1104 | − kfree(s->rxstr); | |
| 1105 | −err_free3: | |
| 1106 | − kfree(s->rxbuf); | |
| 1107 | −err_free4: | |
| 1108 | − kfree(s); | |
| 1109 | − return retval; | |
| 1110 | −} | |
| 1111 | −EXPORT_SYMBOL_GPL(max3107_probe); | |
| 1112 | − | |
| 1113 | −/* Driver remove function */ | |
| 1114 | −int max3107_remove(struct spi_device *spi) | |
| 1115 | −{ | |
| 1116 | − struct max3107_port *s = dev_get_drvdata(&spi->dev); | |
| 1117 | − | |
| 1118 | − pr_info("enter max3107 remove\n"); | |
| 1119 | − | |
| 1120 | − /* Remove port */ | |
| 1121 | − if (uart_remove_one_port(&max3107_uart_driver, &s->port)) | |
| 1122 | − dev_warn(&s->spi->dev, "Removing UART port failed\n"); | |
| 1123 | − | |
| 1124 | − | |
| 1125 | − /* Free TxRx buffer */ | |
| 1126 | − kfree(s->rxbuf); | |
| 1127 | − kfree(s->rxstr); | |
| 1128 | − kfree(s->txbuf); | |
| 1129 | − | |
| 1130 | − /* Free port structure */ | |
| 1131 | − kfree(s); | |
| 1132 | − | |
| 1133 | − return 0; | |
| 1134 | −} | |
| 1135 | −EXPORT_SYMBOL_GPL(max3107_remove); | |
| 1136 | − | |
| 1137 | −/* Driver suspend function */ | |
| 1138 | −int max3107_suspend(struct spi_device *spi, pm_message_t state) | |
| 1139 | −{ | |
| 1140 | −#ifdef CONFIG_PM | |
| 1141 | − struct max3107_port *s = dev_get_drvdata(&spi->dev); | |
| 1142 | − | |
| 1143 | − pr_debug("enter suspend\n"); | |
| 1144 | − | |
| 1145 | − /* Suspend UART port */ | |
| 1146 | − uart_suspend_port(&max3107_uart_driver, &s->port); | |
| 1147 | − | |
| 1148 | − /* Go to suspend mode */ | |
| 1149 | − if (s->pdata->hw_suspend) | |
| 1150 | − s->pdata->hw_suspend(s, 1); | |
| 1151 | −#endif /* CONFIG_PM */ | |
| 1152 | − return 0; | |
| 1153 | −} | |
| 1154 | −EXPORT_SYMBOL_GPL(max3107_suspend); | |
| 1155 | − | |
| 1156 | −/* Driver resume function */ | |
| 1157 | −int max3107_resume(struct spi_device *spi) | |
| 1158 | −{ | |
| 1159 | −#ifdef CONFIG_PM | |
| 1160 | − struct max3107_port *s = dev_get_drvdata(&spi->dev); | |
| 1161 | − | |
| 1162 | − pr_debug("enter resume\n"); | |
| 1163 | − | |
| 1164 | − /* Resume from suspend */ | |
| 1165 | − if (s->pdata->hw_suspend) | |
| 1166 | − s->pdata->hw_suspend(s, 0); | |
| 1167 | − | |
| 1168 | − /* Resume UART port */ | |
| 1169 | − uart_resume_port(&max3107_uart_driver, &s->port); | |
| 1170 | −#endif /* CONFIG_PM */ | |
| 1171 | − return 0; | |
| 1172 | −} | |
| 1173 | −EXPORT_SYMBOL_GPL(max3107_resume); | |
| 1174 | − | |
| 1175 | −static int max3107_probe_generic(struct spi_device *spi) | |
| 1176 | −{ | |
| 1177 | − return max3107_probe(spi, &generic_plat_data); | |
| 1178 | −} | |
| 1179 | − | |
| 1180 | −/* Spi driver data */ | |
| 1181 | −static struct spi_driver max3107_driver = { | |
| 1182 | − .driver = { | |
| 1183 | − .name = "max3107", | |
| 1184 | − .owner = THIS_MODULE, | |
| 1185 | − }, | |
| 1186 | − .probe = max3107_probe_generic, | |
| 1187 | − .remove = __devexit_p(max3107_remove), | |
| 1188 | − .suspend = max3107_suspend, | |
| 1189 | − .resume = max3107_resume, | |
| 1190 | −}; | |
| 1191 | − | |
| 1192 | −/* Driver init function */ | |
| 1193 | −static int __init max3107_init(void) | |
| 1194 | −{ | |
| 1195 | − pr_info("enter max3107 init\n"); | |
| 1196 | − return spi_register_driver(&max3107_driver); | |
| 1197 | −} | |
| 1198 | − | |
| 1199 | −/* Driver exit function */ | |
| 1200 | −static void __exit max3107_exit(void) | |
| 1201 | −{ | |
| 1202 | − pr_info("enter max3107 exit\n"); | |
| 1203 | − /* Unregister UART driver */ | |
| 1204 | − if (driver_registered) | |
| 1205 | − uart_unregister_driver(&max3107_uart_driver); | |
| 1206 | − spi_unregister_driver(&max3107_driver); | |
| 1207 | −} | |
| 1208 | − | |
| 1209 | −module_init(max3107_init); | |
| 1210 | −module_exit(max3107_exit); | |
| 1211 | − | |
| 1212 | −MODULE_DESCRIPTION("MAX3107 driver"); | |
| 1213 | −MODULE_AUTHOR("Aavamobile"); | |
| 1214 | −MODULE_ALIAS("spi:max3107"); | |
| 1215 | −MODULE_LICENSE("GPL v2"); | |
| @@ -1,441 +0,0 @@ | ||
| 1 | −/* | |
| 2 | − * max3107.h - spi uart protocol driver header for Maxim 3107 | |
| 3 | − * | |
| 4 | − * Copyright (C) Aavamobile 2009 | |
| 5 | − * Based on serial_max3100.h by Christian Pellegrin | |
| 6 | − * | |
| 7 | − * This program is free software; you can redistribute it and/or modify | |
| 8 | − * it under the terms of the GNU General Public License as published by | |
| 9 | − * the Free Software Foundation; either version 2 of the License, or | |
| 10 | − * (at your option) any later version. | |
| 11 | − */ | |
| 12 | − | |
| 13 | −#ifndef _MAX3107_H | |
| 14 | −#define _MAX3107_H | |
| 15 | − | |
| 16 | −/* Serial error status definitions */ | |
| 17 | −#define MAX3107_PARITY_ERROR 1 | |
| 18 | −#define MAX3107_FRAME_ERROR 2 | |
| 19 | −#define MAX3107_OVERRUN_ERROR 4 | |
| 20 | −#define MAX3107_ALL_ERRORS (MAX3107_PARITY_ERROR | \ | |
| 21 | − MAX3107_FRAME_ERROR | \ | |
| 22 | − MAX3107_OVERRUN_ERROR) | |
| 23 | − | |
| 24 | −/* GPIO definitions */ | |
| 25 | −#define MAX3107_GPIO_BASE 88 | |
| 26 | −#define MAX3107_GPIO_COUNT 4 | |
| 27 | − | |
| 28 | − | |
| 29 | −/* GPIO connected to chip's reset pin */ | |
| 30 | −#define MAX3107_RESET_GPIO 87 | |
| 31 | − | |
| 32 | − | |
| 33 | −/* Chip reset delay */ | |
| 34 | −#define MAX3107_RESET_DELAY 10 | |
| 35 | − | |
| 36 | −/* Chip wakeup delay */ | |
| 37 | −#define MAX3107_WAKEUP_DELAY 50 | |
| 38 | − | |
| 39 | − | |
| 40 | −/* Sleep mode definitions */ | |
| 41 | −#define MAX3107_DISABLE_FORCED_SLEEP 0 | |
| 42 | −#define MAX3107_ENABLE_FORCED_SLEEP 1 | |
| 43 | −#define MAX3107_DISABLE_AUTOSLEEP 2 | |
| 44 | −#define MAX3107_ENABLE_AUTOSLEEP 3 | |
| 45 | − | |
| 46 | − | |
| 47 | −/* Definitions for register access with SPI transfers | |
| 48 | − * | |
| 49 | − * SPI transfer format: | |
| 50 | − * | |
| 51 | − * Master to slave bits xzzzzzzzyyyyyyyy | |
| 52 | − * Slave to master bits aaaaaaaabbbbbbbb | |
| 53 | − * | |
| 54 | − * where: | |
| 55 | − * x = 0 for reads, 1 for writes | |
| 56 | − * z = register address | |
| 57 | − * y = new register value if write, 0 if read | |
| 58 | − * a = unspecified | |
| 59 | − * b = register value if read, unspecified if write | |
| 60 | − */ | |
| 61 | − | |
| 62 | −/* SPI speed */ | |
| 63 | −#define MAX3107_SPI_SPEED (3125000 * 2) | |
| 64 | − | |
| 65 | −/* Write bit */ | |
| 66 | −#define MAX3107_WRITE_BIT (1 << 15) | |
| 67 | − | |
| 68 | −/* SPI TX data mask */ | |
| 69 | −#define MAX3107_SPI_RX_DATA_MASK (0x00ff) | |
| 70 | − | |
| 71 | −/* SPI RX data mask */ | |
| 72 | −#define MAX3107_SPI_TX_DATA_MASK (0x00ff) | |
| 73 | − | |
| 74 | −/* Register access masks */ | |
| 75 | −#define MAX3107_RHR_REG (0x0000) /* RX FIFO */ | |
| 76 | −#define MAX3107_THR_REG (0x0000) /* TX FIFO */ | |
| 77 | −#define MAX3107_IRQEN_REG (0x0100) /* IRQ enable */ | |
| 78 | −#define MAX3107_IRQSTS_REG (0x0200) /* IRQ status */ | |
| 79 | −#define MAX3107_LSR_IRQEN_REG (0x0300) /* LSR IRQ enable */ | |
| 80 | −#define MAX3107_LSR_IRQSTS_REG (0x0400) /* LSR IRQ status */ | |
| 81 | −#define MAX3107_SPCHR_IRQEN_REG (0x0500) /* Special char IRQ enable */ | |
| 82 | −#define MAX3107_SPCHR_IRQSTS_REG (0x0600) /* Special char IRQ status */ | |
| 83 | −#define MAX3107_STS_IRQEN_REG (0x0700) /* Status IRQ enable */ | |
| 84 | −#define MAX3107_STS_IRQSTS_REG (0x0800) /* Status IRQ status */ | |
| 85 | −#define MAX3107_MODE1_REG (0x0900) /* MODE1 */ | |
| 86 | −#define MAX3107_MODE2_REG (0x0a00) /* MODE2 */ | |
| 87 | −#define MAX3107_LCR_REG (0x0b00) /* LCR */ | |
| 88 | −#define MAX3107_RXTO_REG (0x0c00) /* RX timeout */ | |
| 89 | −#define MAX3107_HDPIXDELAY_REG (0x0d00) /* Auto transceiver delays */ | |
| 90 | −#define MAX3107_IRDA_REG (0x0e00) /* IRDA settings */ | |
| 91 | −#define MAX3107_FLOWLVL_REG (0x0f00) /* Flow control levels */ | |
| 92 | −#define MAX3107_FIFOTRIGLVL_REG (0x1000) /* FIFO IRQ trigger levels */ | |
| 93 | −#define MAX3107_TXFIFOLVL_REG (0x1100) /* TX FIFO level */ | |
| 94 | −#define MAX3107_RXFIFOLVL_REG (0x1200) /* RX FIFO level */ | |
| 95 | −#define MAX3107_FLOWCTRL_REG (0x1300) /* Flow control */ | |
| 96 | −#define MAX3107_XON1_REG (0x1400) /* XON1 character */ | |
| 97 | −#define MAX3107_XON2_REG (0x1500) /* XON2 character */ | |
| 98 | −#define MAX3107_XOFF1_REG (0x1600) /* XOFF1 character */ | |
| 99 | −#define MAX3107_XOFF2_REG (0x1700) /* XOFF2 character */ | |
| 100 | −#define MAX3107_GPIOCFG_REG (0x1800) /* GPIO config */ | |
| 101 | −#define MAX3107_GPIODATA_REG (0x1900) /* GPIO data */ | |
| 102 | −#define MAX3107_PLLCFG_REG (0x1a00) /* PLL config */ | |
| 103 | −#define MAX3107_BRGCFG_REG (0x1b00) /* Baud rate generator conf */ | |
| 104 | −#define MAX3107_BRGDIVLSB_REG (0x1c00) /* Baud rate divisor LSB */ | |
| 105 | −#define MAX3107_BRGDIVMSB_REG (0x1d00) /* Baud rate divisor MSB */ | |
| 106 | −#define MAX3107_CLKSRC_REG (0x1e00) /* Clock source */ | |
| 107 | −#define MAX3107_REVID_REG (0x1f00) /* Revision identification */ | |
| 108 | − | |
| 109 | −/* IRQ register bits */ | |
| 110 | −#define MAX3107_IRQ_LSR_BIT (1 << 0) /* LSR interrupt */ | |
| 111 | −#define MAX3107_IRQ_SPCHR_BIT (1 << 1) /* Special char interrupt */ | |
| 112 | −#define MAX3107_IRQ_STS_BIT (1 << 2) /* Status interrupt */ | |
| 113 | −#define MAX3107_IRQ_RXFIFO_BIT (1 << 3) /* RX FIFO interrupt */ | |
| 114 | −#define MAX3107_IRQ_TXFIFO_BIT (1 << 4) /* TX FIFO interrupt */ | |
| 115 | −#define MAX3107_IRQ_TXEMPTY_BIT (1 << 5) /* TX FIFO empty interrupt */ | |
| 116 | −#define MAX3107_IRQ_RXEMPTY_BIT (1 << 6) /* RX FIFO empty interrupt */ | |
| 117 | −#define MAX3107_IRQ_CTS_BIT (1 << 7) /* CTS interrupt */ | |
| 118 | − | |
| 119 | −/* LSR register bits */ | |
| 120 | −#define MAX3107_LSR_RXTO_BIT (1 << 0) /* RX timeout */ | |
| 121 | −#define MAX3107_LSR_RXOVR_BIT (1 << 1) /* RX overrun */ | |
| 122 | −#define MAX3107_LSR_RXPAR_BIT (1 << 2) /* RX parity error */ | |
| 123 | −#define MAX3107_LSR_FRERR_BIT (1 << 3) /* Frame error */ | |
| 124 | −#define MAX3107_LSR_RXBRK_BIT (1 << 4) /* RX break */ | |
| 125 | −#define MAX3107_LSR_RXNOISE_BIT (1 << 5) /* RX noise */ | |
| 126 | −#define MAX3107_LSR_UNDEF6_BIT (1 << 6) /* Undefined/not used */ | |
| 127 | −#define MAX3107_LSR_CTS_BIT (1 << 7) /* CTS pin state */ | |
| 128 | − | |
| 129 | −/* Special character register bits */ | |
| 130 | −#define MAX3107_SPCHR_XON1_BIT (1 << 0) /* XON1 character */ | |
| 131 | −#define MAX3107_SPCHR_XON2_BIT (1 << 1) /* XON2 character */ | |
| 132 | −#define MAX3107_SPCHR_XOFF1_BIT (1 << 2) /* XOFF1 character */ | |
| 133 | −#define MAX3107_SPCHR_XOFF2_BIT (1 << 3) /* XOFF2 character */ | |
| 134 | −#define MAX3107_SPCHR_BREAK_BIT (1 << 4) /* RX break */ | |
| 135 | −#define MAX3107_SPCHR_MULTIDROP_BIT (1 << 5) /* 9-bit multidrop addr char */ | |
| 136 | −#define MAX3107_SPCHR_UNDEF6_BIT (1 << 6) /* Undefined/not used */ | |
| 137 | −#define MAX3107_SPCHR_UNDEF7_BIT (1 << 7) /* Undefined/not used */ | |
| 138 | − | |
| 139 | −/* Status register bits */ | |
| 140 | −#define MAX3107_STS_GPIO0_BIT (1 << 0) /* GPIO 0 interrupt */ | |
| 141 | −#define MAX3107_STS_GPIO1_BIT (1 << 1) /* GPIO 1 interrupt */ | |
| 142 | −#define MAX3107_STS_GPIO2_BIT (1 << 2) /* GPIO 2 interrupt */ | |
| 143 | −#define MAX3107_STS_GPIO3_BIT (1 << 3) /* GPIO 3 interrupt */ | |
| 144 | −#define MAX3107_STS_UNDEF4_BIT (1 << 4) /* Undefined/not used */ | |
| 145 | −#define MAX3107_STS_CLKREADY_BIT (1 << 5) /* Clock ready */ | |
| 146 | −#define MAX3107_STS_SLEEP_BIT (1 << 6) /* Sleep interrupt */ | |
| 147 | −#define MAX3107_STS_UNDEF7_BIT (1 << 7) /* Undefined/not used */ | |
| 148 | − | |
| 149 | −/* MODE1 register bits */ | |
| 150 | −#define MAX3107_MODE1_RXDIS_BIT (1 << 0) /* RX disable */ | |
| 151 | −#define MAX3107_MODE1_TXDIS_BIT (1 << 1) /* TX disable */ | |
| 152 | −#define MAX3107_MODE1_TXHIZ_BIT (1 << 2) /* TX pin three-state */ | |
| 153 | −#define MAX3107_MODE1_RTSHIZ_BIT (1 << 3) /* RTS pin three-state */ | |
| 154 | −#define MAX3107_MODE1_TRNSCVCTRL_BIT (1 << 4) /* Transceiver ctrl enable */ | |
| 155 | −#define MAX3107_MODE1_FORCESLEEP_BIT (1 << 5) /* Force sleep mode */ | |
| 156 | −#define MAX3107_MODE1_AUTOSLEEP_BIT (1 << 6) /* Auto sleep enable */ | |
| 157 | −#define MAX3107_MODE1_IRQSEL_BIT (1 << 7) /* IRQ pin enable */ | |
| 158 | − | |
| 159 | −/* MODE2 register bits */ | |
| 160 | −#define MAX3107_MODE2_RST_BIT (1 << 0) /* Chip reset */ | |
| 161 | −#define MAX3107_MODE2_FIFORST_BIT (1 << 1) /* FIFO reset */ | |
| 162 | −#define MAX3107_MODE2_RXTRIGINV_BIT (1 << 2) /* RX FIFO INT invert */ | |
| 163 | −#define MAX3107_MODE2_RXEMPTINV_BIT (1 << 3) /* RX FIFO empty INT invert */ | |
| 164 | −#define MAX3107_MODE2_SPCHR_BIT (1 << 4) /* Special chr detect enable */ | |
| 165 | −#define MAX3107_MODE2_LOOPBACK_BIT (1 << 5) /* Internal loopback enable */ | |
| 166 | −#define MAX3107_MODE2_MULTIDROP_BIT (1 << 6) /* 9-bit multidrop enable */ | |
| 167 | −#define MAX3107_MODE2_ECHOSUPR_BIT (1 << 7) /* ECHO suppression enable */ | |
| 168 | − | |
| 169 | −/* LCR register bits */ | |
| 170 | −#define MAX3107_LCR_LENGTH0_BIT (1 << 0) /* Word length bit 0 */ | |
| 171 | −#define MAX3107_LCR_LENGTH1_BIT (1 << 1) /* Word length bit 1 | |
| 172 | − * | |
| 173 | − * Word length bits table: | |
| 174 | − * 00 -> 5 bit words | |
| 175 | − * 01 -> 6 bit words | |
| 176 | − * 10 -> 7 bit words | |
| 177 | − * 11 -> 8 bit words | |
| 178 | − */ | |
| 179 | −#define MAX3107_LCR_STOPLEN_BIT (1 << 2) /* STOP length bit | |
| 180 | − * | |
| 181 | − * STOP length bit table: | |
| 182 | − * 0 -> 1 stop bit | |
| 183 | − * 1 -> 1-1.5 stop bits if | |
| 184 | − * word length is 5, | |
| 185 | − * 2 stop bits otherwise | |
| 186 | − */ | |
| 187 | −#define MAX3107_LCR_PARITY_BIT (1 << 3) /* Parity bit enable */ | |
| 188 | −#define MAX3107_LCR_EVENPARITY_BIT (1 << 4) /* Even parity bit enable */ | |
| 189 | −#define MAX3107_LCR_FORCEPARITY_BIT (1 << 5) /* 9-bit multidrop parity */ | |
| 190 | −#define MAX3107_LCR_TXBREAK_BIT (1 << 6) /* TX break enable */ | |
| 191 | −#define MAX3107_LCR_RTS_BIT (1 << 7) /* RTS pin control */ | |
| 192 | −#define MAX3107_LCR_WORD_LEN_5 (0x0000) | |
| 193 | −#define MAX3107_LCR_WORD_LEN_6 (0x0001) | |
| 194 | −#define MAX3107_LCR_WORD_LEN_7 (0x0002) | |
| 195 | −#define MAX3107_LCR_WORD_LEN_8 (0x0003) | |
| 196 | − | |
| 197 | − | |
| 198 | −/* IRDA register bits */ | |
| 199 | −#define MAX3107_IRDA_IRDAEN_BIT (1 << 0) /* IRDA mode enable */ | |
| 200 | −#define MAX3107_IRDA_SIR_BIT (1 << 1) /* SIR mode enable */ | |
| 201 | −#define MAX3107_IRDA_SHORTIR_BIT (1 << 2) /* Short SIR mode enable */ | |
| 202 | −#define MAX3107_IRDA_MIR_BIT (1 << 3) /* MIR mode enable */ | |
| 203 | −#define MAX3107_IRDA_RXINV_BIT (1 << 4) /* RX logic inversion enable */ | |
| 204 | −#define MAX3107_IRDA_TXINV_BIT (1 << 5) /* TX logic inversion enable */ | |
| 205 | −#define MAX3107_IRDA_UNDEF6_BIT (1 << 6) /* Undefined/not used */ | |
| 206 | −#define MAX3107_IRDA_UNDEF7_BIT (1 << 7) /* Undefined/not used */ | |
| 207 | − | |
| 208 | −/* Flow control trigger level register masks */ | |
| 209 | −#define MAX3107_FLOWLVL_HALT_MASK (0x000f) /* Flow control halt level */ | |
| 210 | −#define MAX3107_FLOWLVL_RES_MASK (0x00f0) /* Flow control resume level */ | |
| 211 | −#define MAX3107_FLOWLVL_HALT(words) ((words/8) & 0x000f) | |
| 212 | −#define MAX3107_FLOWLVL_RES(words) (((words/8) & 0x000f) << 4) | |
| 213 | − | |
| 214 | −/* FIFO interrupt trigger level register masks */ | |
| 215 | −#define MAX3107_FIFOTRIGLVL_TX_MASK (0x000f) /* TX FIFO trigger level */ | |
| 216 | −#define MAX3107_FIFOTRIGLVL_RX_MASK (0x00f0) /* RX FIFO trigger level */ | |
| 217 | −#define MAX3107_FIFOTRIGLVL_TX(words) ((words/8) & 0x000f) | |
| 218 | −#define MAX3107_FIFOTRIGLVL_RX(words) (((words/8) & 0x000f) << 4) | |
| 219 | − | |
| 220 | −/* Flow control register bits */ | |
| 221 | −#define MAX3107_FLOWCTRL_AUTORTS_BIT (1 << 0) /* Auto RTS flow ctrl enable */ | |
| 222 | −#define MAX3107_FLOWCTRL_AUTOCTS_BIT (1 << 1) /* Auto CTS flow ctrl enable */ | |
| 223 | −#define MAX3107_FLOWCTRL_GPIADDR_BIT (1 << 2) /* Enables that GPIO inputs | |
| 224 | − * are used in conjunction with | |
| 225 | − * XOFF2 for definition of | |
| 226 | − * special character */ | |
| 227 | −#define MAX3107_FLOWCTRL_SWFLOWEN_BIT (1 << 3) /* Auto SW flow ctrl enable */ | |
| 228 | −#define MAX3107_FLOWCTRL_SWFLOW0_BIT (1 << 4) /* SWFLOW bit 0 */ | |
| 229 | −#define MAX3107_FLOWCTRL_SWFLOW1_BIT (1 << 5) /* SWFLOW bit 1 | |
| 230 | − * | |
| 231 | − * SWFLOW bits 1 & 0 table: | |
| 232 | − * 00 -> no transmitter flow | |
| 233 | − * control | |
| 234 | − * 01 -> receiver compares | |
| 235 | − * XON2 and XOFF2 | |
| 236 | − * and controls | |
| 237 | − * transmitter | |
| 238 | − * 10 -> receiver compares | |
| 239 | − * XON1 and XOFF1 | |
| 240 | − * and controls | |
| 241 | − * transmitter | |
| 242 | − * 11 -> receiver compares | |
| 243 | − * XON1, XON2, XOFF1 and | |
| 244 | − * XOFF2 and controls | |
| 245 | − * transmitter | |
| 246 | − */ | |
| 247 | −#define MAX3107_FLOWCTRL_SWFLOW2_BIT (1 << 6) /* SWFLOW bit 2 */ | |
| 248 | −#define MAX3107_FLOWCTRL_SWFLOW3_BIT (1 << 7) /* SWFLOW bit 3 | |
| 249 | − * | |
| 250 | − * SWFLOW bits 3 & 2 table: | |
| 251 | − * 00 -> no received flow | |
| 252 | − * control | |
| 253 | − * 01 -> transmitter generates | |
| 254 | − * XON2 and XOFF2 | |
| 255 | − * 10 -> transmitter generates | |
| 256 | − * XON1 and XOFF1 | |
| 257 | − * 11 -> transmitter generates | |
| 258 | − * XON1, XON2, XOFF1 and | |
| 259 | − * XOFF2 | |
| 260 | − */ | |
| 261 | − | |
| 262 | −/* GPIO configuration register bits */ | |
| 263 | −#define MAX3107_GPIOCFG_GP0OUT_BIT (1 << 0) /* GPIO 0 output enable */ | |
| 264 | −#define MAX3107_GPIOCFG_GP1OUT_BIT (1 << 1) /* GPIO 1 output enable */ | |
| 265 | −#define MAX3107_GPIOCFG_GP2OUT_BIT (1 << 2) /* GPIO 2 output enable */ | |
| 266 | −#define MAX3107_GPIOCFG_GP3OUT_BIT (1 << 3) /* GPIO 3 output enable */ | |
| 267 | −#define MAX3107_GPIOCFG_GP0OD_BIT (1 << 4) /* GPIO 0 open-drain enable */ | |
| 268 | −#define MAX3107_GPIOCFG_GP1OD_BIT (1 << 5) /* GPIO 1 open-drain enable */ | |
| 269 | −#define MAX3107_GPIOCFG_GP2OD_BIT (1 << 6) /* GPIO 2 open-drain enable */ | |
| 270 | −#define MAX3107_GPIOCFG_GP3OD_BIT (1 << 7) /* GPIO 3 open-drain enable */ | |
| 271 | − | |
| 272 | −/* GPIO DATA register bits */ | |
| 273 | −#define MAX3107_GPIODATA_GP0OUT_BIT (1 << 0) /* GPIO 0 output value */ | |
| 274 | −#define MAX3107_GPIODATA_GP1OUT_BIT (1 << 1) /* GPIO 1 output value */ | |
| 275 | −#define MAX3107_GPIODATA_GP2OUT_BIT (1 << 2) /* GPIO 2 output value */ | |
| 276 | −#define MAX3107_GPIODATA_GP3OUT_BIT (1 << 3) /* GPIO 3 output value */ | |
| 277 | −#define MAX3107_GPIODATA_GP0IN_BIT (1 << 4) /* GPIO 0 input value */ | |
| 278 | −#define MAX3107_GPIODATA_GP1IN_BIT (1 << 5) /* GPIO 1 input value */ | |
| 279 | −#define MAX3107_GPIODATA_GP2IN_BIT (1 << 6) /* GPIO 2 input value */ | |
| 280 | −#define MAX3107_GPIODATA_GP3IN_BIT (1 << 7) /* GPIO 3 input value */ | |
| 281 | − | |
| 282 | −/* PLL configuration register masks */ | |
| 283 | −#define MAX3107_PLLCFG_PREDIV_MASK (0x003f) /* PLL predivision value */ | |
| 284 | −#define MAX3107_PLLCFG_PLLFACTOR_MASK (0x00c0) /* PLL multiplication factor */ | |
| 285 | − | |
| 286 | −/* Baud rate generator configuration register masks and bits */ | |
| 287 | −#define MAX3107_BRGCFG_FRACT_MASK (0x000f) /* Fractional portion of | |
| 288 | − * Baud rate generator divisor | |
| 289 | − */ | |
| 290 | −#define MAX3107_BRGCFG_2XMODE_BIT (1 << 4) /* Double baud rate */ | |
| 291 | −#define MAX3107_BRGCFG_4XMODE_BIT (1 << 5) /* Quadruple baud rate */ | |
| 292 | −#define MAX3107_BRGCFG_UNDEF6_BIT (1 << 6) /* Undefined/not used */ | |
| 293 | −#define MAX3107_BRGCFG_UNDEF7_BIT (1 << 7) /* Undefined/not used */ | |
| 294 | − | |
| 295 | −/* Clock source register bits */ | |
| 296 | −#define MAX3107_CLKSRC_INTOSC_BIT (1 << 0) /* Internal osc enable */ | |
| 297 | −#define MAX3107_CLKSRC_CRYST_BIT (1 << 1) /* Crystal osc enable */ | |
| 298 | −#define MAX3107_CLKSRC_PLL_BIT (1 << 2) /* PLL enable */ | |
| 299 | −#define MAX3107_CLKSRC_PLLBYP_BIT (1 << 3) /* PLL bypass */ | |
| 300 | −#define MAX3107_CLKSRC_EXTCLK_BIT (1 << 4) /* External clock enable */ | |
| 301 | −#define MAX3107_CLKSRC_UNDEF5_BIT (1 << 5) /* Undefined/not used */ | |
| 302 | −#define MAX3107_CLKSRC_UNDEF6_BIT (1 << 6) /* Undefined/not used */ | |
| 303 | −#define MAX3107_CLKSRC_CLK2RTS_BIT (1 << 7) /* Baud clk to RTS pin */ | |
| 304 | − | |
| 305 | − | |
| 306 | −/* HW definitions */ | |
| 307 | −#define MAX3107_RX_FIFO_SIZE 128 | |
| 308 | −#define MAX3107_TX_FIFO_SIZE 128 | |
| 309 | −#define MAX3107_REVID1 0x00a0 | |
| 310 | −#define MAX3107_REVID2 0x00a1 | |
| 311 | − | |
| 312 | − | |
| 313 | −/* Baud rate generator configuration values for external clock 13MHz */ | |
| 314 | −#define MAX3107_BRG13_B300 (0x0A9400 | 0x05) | |
| 315 | −#define MAX3107_BRG13_B600 (0x054A00 | 0x03) | |
| 316 | −#define MAX3107_BRG13_B1200 (0x02A500 | 0x01) | |
| 317 | −#define MAX3107_BRG13_B2400 (0x015200 | 0x09) | |
| 318 | −#define MAX3107_BRG13_B4800 (0x00A900 | 0x04) | |
| 319 | −#define MAX3107_BRG13_B9600 (0x005400 | 0x0A) | |
| 320 | −#define MAX3107_BRG13_B19200 (0x002A00 | 0x05) | |
| 321 | −#define MAX3107_BRG13_B38400 (0x001500 | 0x03) | |
| 322 | −#define MAX3107_BRG13_B57600 (0x000E00 | 0x02) | |
| 323 | −#define MAX3107_BRG13_B115200 (0x000700 | 0x01) | |
| 324 | −#define MAX3107_BRG13_B230400 (0x000300 | 0x08) | |
| 325 | −#define MAX3107_BRG13_B460800 (0x000100 | 0x0c) | |
| 326 | −#define MAX3107_BRG13_B921600 (0x000100 | 0x1c) | |
| 327 | − | |
| 328 | −/* Baud rate generator configuration values for external clock 26MHz */ | |
| 329 | −#define MAX3107_BRG26_B300 (0x152800 | 0x0A) | |
| 330 | −#define MAX3107_BRG26_B600 (0x0A9400 | 0x05) | |
| 331 | −#define MAX3107_BRG26_B1200 (0x054A00 | 0x03) | |
| 332 | −#define MAX3107_BRG26_B2400 (0x02A500 | 0x01) | |
| 333 | −#define MAX3107_BRG26_B4800 (0x015200 | 0x09) | |
| 334 | −#define MAX3107_BRG26_B9600 (0x00A900 | 0x04) | |
| 335 | −#define MAX3107_BRG26_B19200 (0x005400 | 0x0A) | |
| 336 | −#define MAX3107_BRG26_B38400 (0x002A00 | 0x05) | |
| 337 | −#define MAX3107_BRG26_B57600 (0x001C00 | 0x03) | |
| 338 | −#define MAX3107_BRG26_B115200 (0x000E00 | 0x02) | |
| 339 | −#define MAX3107_BRG26_B230400 (0x000700 | 0x01) | |
| 340 | −#define MAX3107_BRG26_B460800 (0x000300 | 0x08) | |
| 341 | −#define MAX3107_BRG26_B921600 (0x000100 | 0x0C) | |
| 342 | − | |
| 343 | −/* Baud rate generator configuration values for internal clock */ | |
| 344 | −#define MAX3107_BRG13_IB300 (0x008000 | 0x00) | |
| 345 | −#define MAX3107_BRG13_IB600 (0x004000 | 0x00) | |
| 346 | −#define MAX3107_BRG13_IB1200 (0x002000 | 0x00) | |
| 347 | −#define MAX3107_BRG13_IB2400 (0x001000 | 0x00) | |
| 348 | −#define MAX3107_BRG13_IB4800 (0x000800 | 0x00) | |
| 349 | −#define MAX3107_BRG13_IB9600 (0x000400 | 0x00) | |
| 350 | −#define MAX3107_BRG13_IB19200 (0x000200 | 0x00) | |
| 351 | −#define MAX3107_BRG13_IB38400 (0x000100 | 0x00) | |
| 352 | −#define MAX3107_BRG13_IB57600 (0x000000 | 0x0B) | |
| 353 | −#define MAX3107_BRG13_IB115200 (0x000000 | 0x05) | |
| 354 | −#define MAX3107_BRG13_IB230400 (0x000000 | 0x03) | |
| 355 | −#define MAX3107_BRG13_IB460800 (0x000000 | 0x00) | |
| 356 | −#define MAX3107_BRG13_IB921600 (0x000000 | 0x00) | |
| 357 | − | |
| 358 | − | |
| 359 | −struct baud_table { | |
| 360 | − int baud; | |
| 361 | − u32 new_brg; | |
| 362 | −}; | |
| 363 | − | |
| 364 | −struct max3107_port { | |
| 365 | − /* UART port structure */ | |
| 366 | − struct uart_port port; | |
| 367 | − | |
| 368 | − /* SPI device structure */ | |
| 369 | − struct spi_device *spi; | |
| 370 | − | |
| 371 | −#if defined(CONFIG_GPIOLIB) | |
| 372 | − /* GPIO chip structure */ | |
| 373 | − struct gpio_chip chip; | |
| 374 | −#endif | |
| 375 | − | |
| 376 | − /* Workqueue that does all the magic */ | |
| 377 | − struct workqueue_struct *workqueue; | |
| 378 | − struct work_struct work; | |
| 379 | − | |
| 380 | − /* Lock for shared data */ | |
| 381 | − spinlock_t data_lock; | |
| 382 | − | |
| 383 | − /* Device configuration */ | |
| 384 | − int ext_clk; /* 1 if external clock used */ | |
| 385 | − int loopback; /* Current loopback mode state */ | |
| 386 | − int baud; /* Current baud rate */ | |
| 387 | − | |
| 388 | − /* State flags */ | |
| 389 | − int suspended; /* Indicates suspend mode */ | |
| 390 | − int tx_fifo_empty; /* Flag for TX FIFO state */ | |
| 391 | − int rx_enabled; /* Flag for receiver state */ | |
| 392 | − int tx_enabled; /* Flag for transmitter state */ | |
| 393 | − | |
| 394 | − u16 irqen_reg; /* Current IRQ enable register value */ | |
| 395 | − /* Shared data */ | |
| 396 | − u16 mode1_reg; /* Current mode1 register value*/ | |
| 397 | − int mode1_commit; /* Flag for setting new mode1 register value */ | |
| 398 | − u16 lcr_reg; /* Current LCR register value */ | |
| 399 | − int lcr_commit; /* Flag for setting new LCR register value */ | |
| 400 | − u32 brg_cfg; /* Current Baud rate generator config */ | |
| 401 | − int brg_commit; /* Flag for setting new baud rate generator | |
| 402 | − * config | |
| 403 | − */ | |
| 404 | − struct baud_table *baud_tbl; | |
| 405 | − int handle_irq; /* Indicates that IRQ should be handled */ | |
| 406 | − | |
| 407 | − /* Rx buffer and str*/ | |
| 408 | − u16 *rxbuf; | |
| 409 | − u8 *rxstr; | |
| 410 | − /* Tx buffer*/ | |
| 411 | − u16 *txbuf; | |
| 412 | − | |
| 413 | − struct max3107_plat *pdata; /* Platform data */ | |
| 414 | −}; | |
| 415 | − | |
| 416 | −/* Platform data structure */ | |
| 417 | −struct max3107_plat { | |
| 418 | − /* Loopback mode enable */ | |
| 419 | − int loopback; | |
| 420 | − /* External clock enable */ | |
| 421 | − int ext_clk; | |
| 422 | − /* Called during the register initialisation */ | |
| 423 | − void (*init)(struct max3107_port *s); | |
| 424 | − /* Called when the port is found and configured */ | |
| 425 | − int (*configure)(struct max3107_port *s); | |
| 426 | − /* HW suspend function */ | |
| 427 | − void (*hw_suspend) (struct max3107_port *s, int suspend); | |
| 428 | − /* Polling mode enable */ | |
| 429 | − int polled_mode; | |
| 430 | − /* Polling period if polling mode enabled */ | |
| 431 | − int poll_time; | |
| 432 | −}; | |
| 433 | − | |
| 434 | −extern int max3107_rw(struct max3107_port *s, u8 *tx, u8 *rx, int len); | |
| 435 | −extern void max3107_hw_susp(struct max3107_port *s, int suspend); | |
| 436 | −extern int max3107_probe(struct spi_device *spi, struct max3107_plat *pdata); | |
| 437 | −extern int max3107_remove(struct spi_device *spi); | |
| 438 | −extern int max3107_suspend(struct spi_device *spi, pm_message_t state); | |
| 439 | −extern int max3107_resume(struct spi_device *spi); | |
| 440 | − | |
| 441 | −#endif /* _LINUX_SERIAL_MAX3107_H */ | |
| @@ -0,0 +1,1260 @@ | ||
| 1 | +/* | |
| 2 | + * Maxim (Dallas) MAX3107/8 serial driver | |
| 3 | + * | |
| 4 | + * Copyright (C) 2012 Alexander Shiyan <shc_work@mail.ru> | |
| 5 | + * | |
| 6 | + * Based on max3100.c, by Christian Pellegrin <chripell@evolware.org> | |
| 7 | + * Based on max3110.c, by Feng Tang <feng.tang@intel.com> | |
| 8 | + * Based on max3107.c, by Aavamobile | |
| 9 | + * | |
| 10 | + * This program is free software; you can redistribute it and/or modify | |
| 11 | + * it under the terms of the GNU General Public License as published by | |
| 12 | + * the Free Software Foundation; either version 2 of the License, or | |
| 13 | + * (at your option) any later version. | |
| 14 | + */ | |
| 15 | + | |
| 16 | +/* TODO: MAX3109 support (Dual) */ | |
| 17 | +/* TODO: MAX14830 support (Quad) */ | |
| 18 | + | |
| 19 | +#include <linux/module.h> | |
| 20 | +#include <linux/device.h> | |
| 21 | +#include <linux/serial_core.h> | |
| 22 | +#include <linux/serial.h> | |
| 23 | +#include <linux/tty.h> | |
| 24 | +#include <linux/tty_flip.h> | |
| 25 | +#include <linux/regmap.h> | |
| 26 | +#include <linux/gpio.h> | |
| 27 | +#include <linux/spi/spi.h> | |
| 28 | +#include <linux/platform_data/max310x.h> | |
| 29 | + | |
| 30 | +#define MAX310X_MAJOR 204 | |
| 31 | +#define MAX310X_MINOR 209 | |
| 32 | + | |
| 33 | +/* MAX310X register definitions */ | |
| 34 | +#define MAX310X_RHR_REG (0x00) /* RX FIFO */ | |
| 35 | +#define MAX310X_THR_REG (0x00) /* TX FIFO */ | |
| 36 | +#define MAX310X_IRQEN_REG (0x01) /* IRQ enable */ | |
| 37 | +#define MAX310X_IRQSTS_REG (0x02) /* IRQ status */ | |
| 38 | +#define MAX310X_LSR_IRQEN_REG (0x03) /* LSR IRQ enable */ | |
| 39 | +#define MAX310X_LSR_IRQSTS_REG (0x04) /* LSR IRQ status */ | |
| 40 | +#define MAX310X_SPCHR_IRQEN_REG (0x05) /* Special char IRQ enable */ | |
| 41 | +#define MAX310X_SPCHR_IRQSTS_REG (0x06) /* Special char IRQ status */ | |
| 42 | +#define MAX310X_STS_IRQEN_REG (0x07) /* Status IRQ enable */ | |
| 43 | +#define MAX310X_STS_IRQSTS_REG (0x08) /* Status IRQ status */ | |
| 44 | +#define MAX310X_MODE1_REG (0x09) /* MODE1 */ | |
| 45 | +#define MAX310X_MODE2_REG (0x0a) /* MODE2 */ | |
| 46 | +#define MAX310X_LCR_REG (0x0b) /* LCR */ | |
| 47 | +#define MAX310X_RXTO_REG (0x0c) /* RX timeout */ | |
| 48 | +#define MAX310X_HDPIXDELAY_REG (0x0d) /* Auto transceiver delays */ | |
| 49 | +#define MAX310X_IRDA_REG (0x0e) /* IRDA settings */ | |
| 50 | +#define MAX310X_FLOWLVL_REG (0x0f) /* Flow control levels */ | |
| 51 | +#define MAX310X_FIFOTRIGLVL_REG (0x10) /* FIFO IRQ trigger levels */ | |
| 52 | +#define MAX310X_TXFIFOLVL_REG (0x11) /* TX FIFO level */ | |
| 53 | +#define MAX310X_RXFIFOLVL_REG (0x12) /* RX FIFO level */ | |
| 54 | +#define MAX310X_FLOWCTRL_REG (0x13) /* Flow control */ | |
| 55 | +#define MAX310X_XON1_REG (0x14) /* XON1 character */ | |
| 56 | +#define MAX310X_XON2_REG (0x15) /* XON2 character */ | |
| 57 | +#define MAX310X_XOFF1_REG (0x16) /* XOFF1 character */ | |
| 58 | +#define MAX310X_XOFF2_REG (0x17) /* XOFF2 character */ | |
| 59 | +#define MAX310X_GPIOCFG_REG (0x18) /* GPIO config */ | |
| 60 | +#define MAX310X_GPIODATA_REG (0x19) /* GPIO data */ | |
| 61 | +#define MAX310X_PLLCFG_REG (0x1a) /* PLL config */ | |
| 62 | +#define MAX310X_BRGCFG_REG (0x1b) /* Baud rate generator conf */ | |
| 63 | +#define MAX310X_BRGDIVLSB_REG (0x1c) /* Baud rate divisor LSB */ | |
| 64 | +#define MAX310X_BRGDIVMSB_REG (0x1d) /* Baud rate divisor MSB */ | |
| 65 | +#define MAX310X_CLKSRC_REG (0x1e) /* Clock source */ | |
| 66 | +/* Only present in MAX3107 */ | |
| 67 | +#define MAX3107_REVID_REG (0x1f) /* Revision identification */ | |
| 68 | + | |
| 69 | +/* IRQ register bits */ | |
| 70 | +#define MAX310X_IRQ_LSR_BIT (1 << 0) /* LSR interrupt */ | |
| 71 | +#define MAX310X_IRQ_SPCHR_BIT (1 << 1) /* Special char interrupt */ | |
| 72 | +#define MAX310X_IRQ_STS_BIT (1 << 2) /* Status interrupt */ | |
| 73 | +#define MAX310X_IRQ_RXFIFO_BIT (1 << 3) /* RX FIFO interrupt */ | |
| 74 | +#define MAX310X_IRQ_TXFIFO_BIT (1 << 4) /* TX FIFO interrupt */ | |
| 75 | +#define MAX310X_IRQ_TXEMPTY_BIT (1 << 5) /* TX FIFO empty interrupt */ | |
| 76 | +#define MAX310X_IRQ_RXEMPTY_BIT (1 << 6) /* RX FIFO empty interrupt */ | |
| 77 | +#define MAX310X_IRQ_CTS_BIT (1 << 7) /* CTS interrupt */ | |
| 78 | + | |
| 79 | +/* LSR register bits */ | |
| 80 | +#define MAX310X_LSR_RXTO_BIT (1 << 0) /* RX timeout */ | |
| 81 | +#define MAX310X_LSR_RXOVR_BIT (1 << 1) /* RX overrun */ | |
| 82 | +#define MAX310X_LSR_RXPAR_BIT (1 << 2) /* RX parity error */ | |
| 83 | +#define MAX310X_LSR_FRERR_BIT (1 << 3) /* Frame error */ | |
| 84 | +#define MAX310X_LSR_RXBRK_BIT (1 << 4) /* RX break */ | |
| 85 | +#define MAX310X_LSR_RXNOISE_BIT (1 << 5) /* RX noise */ | |
| 86 | +#define MAX310X_LSR_CTS_BIT (1 << 7) /* CTS pin state */ | |
| 87 | + | |
| 88 | +/* Special character register bits */ | |
| 89 | +#define MAX310X_SPCHR_XON1_BIT (1 << 0) /* XON1 character */ | |
| 90 | +#define MAX310X_SPCHR_XON2_BIT (1 << 1) /* XON2 character */ | |
| 91 | +#define MAX310X_SPCHR_XOFF1_BIT (1 << 2) /* XOFF1 character */ | |
| 92 | +#define MAX310X_SPCHR_XOFF2_BIT (1 << 3) /* XOFF2 character */ | |
| 93 | +#define MAX310X_SPCHR_BREAK_BIT (1 << 4) /* RX break */ | |
| 94 | +#define MAX310X_SPCHR_MULTIDROP_BIT (1 << 5) /* 9-bit multidrop addr char */ | |
| 95 | + | |
| 96 | +/* Status register bits */ | |
| 97 | +#define MAX310X_STS_GPIO0_BIT (1 << 0) /* GPIO 0 interrupt */ | |
| 98 | +#define MAX310X_STS_GPIO1_BIT (1 << 1) /* GPIO 1 interrupt */ | |
| 99 | +#define MAX310X_STS_GPIO2_BIT (1 << 2) /* GPIO 2 interrupt */ | |
| 100 | +#define MAX310X_STS_GPIO3_BIT (1 << 3) /* GPIO 3 interrupt */ | |
| 101 | +#define MAX310X_STS_CLKREADY_BIT (1 << 5) /* Clock ready */ | |
| 102 | +#define MAX310X_STS_SLEEP_BIT (1 << 6) /* Sleep interrupt */ | |
| 103 | + | |
| 104 | +/* MODE1 register bits */ | |
| 105 | +#define MAX310X_MODE1_RXDIS_BIT (1 << 0) /* RX disable */ | |
| 106 | +#define MAX310X_MODE1_TXDIS_BIT (1 << 1) /* TX disable */ | |
| 107 | +#define MAX310X_MODE1_TXHIZ_BIT (1 << 2) /* TX pin three-state */ | |
| 108 | +#define MAX310X_MODE1_RTSHIZ_BIT (1 << 3) /* RTS pin three-state */ | |
| 109 | +#define MAX310X_MODE1_TRNSCVCTRL_BIT (1 << 4) /* Transceiver ctrl enable */ | |
| 110 | +#define MAX310X_MODE1_FORCESLEEP_BIT (1 << 5) /* Force sleep mode */ | |
| 111 | +#define MAX310X_MODE1_AUTOSLEEP_BIT (1 << 6) /* Auto sleep enable */ | |
| 112 | +#define MAX310X_MODE1_IRQSEL_BIT (1 << 7) /* IRQ pin enable */ | |
| 113 | + | |
| 114 | +/* MODE2 register bits */ | |
| 115 | +#define MAX310X_MODE2_RST_BIT (1 << 0) /* Chip reset */ | |
| 116 | +#define MAX310X_MODE2_FIFORST_BIT (1 << 1) /* FIFO reset */ | |
| 117 | +#define MAX310X_MODE2_RXTRIGINV_BIT (1 << 2) /* RX FIFO INT invert */ | |
| 118 | +#define MAX310X_MODE2_RXEMPTINV_BIT (1 << 3) /* RX FIFO empty INT invert */ | |
| 119 | +#define MAX310X_MODE2_SPCHR_BIT (1 << 4) /* Special chr detect enable */ | |
| 120 | +#define MAX310X_MODE2_LOOPBACK_BIT (1 << 5) /* Internal loopback enable */ | |
| 121 | +#define MAX310X_MODE2_MULTIDROP_BIT (1 << 6) /* 9-bit multidrop enable */ | |
| 122 | +#define MAX310X_MODE2_ECHOSUPR_BIT (1 << 7) /* ECHO suppression enable */ | |
| 123 | + | |
| 124 | +/* LCR register bits */ | |
| 125 | +#define MAX310X_LCR_LENGTH0_BIT (1 << 0) /* Word length bit 0 */ | |
| 126 | +#define MAX310X_LCR_LENGTH1_BIT (1 << 1) /* Word length bit 1 | |
| 127 | + * | |
| 128 | + * Word length bits table: | |
| 129 | + * 00 -> 5 bit words | |
| 130 | + * 01 -> 6 bit words | |
| 131 | + * 10 -> 7 bit words | |
| 132 | + * 11 -> 8 bit words | |
| 133 | + */ | |
| 134 | +#define MAX310X_LCR_STOPLEN_BIT (1 << 2) /* STOP length bit | |
| 135 | + * | |
| 136 | + * STOP length bit table: | |
| 137 | + * 0 -> 1 stop bit | |
| 138 | + * 1 -> 1-1.5 stop bits if | |
| 139 | + * word length is 5, | |
| 140 | + * 2 stop bits otherwise | |
| 141 | + */ | |
| 142 | +#define MAX310X_LCR_PARITY_BIT (1 << 3) /* Parity bit enable */ | |
| 143 | +#define MAX310X_LCR_EVENPARITY_BIT (1 << 4) /* Even parity bit enable */ | |
| 144 | +#define MAX310X_LCR_FORCEPARITY_BIT (1 << 5) /* 9-bit multidrop parity */ | |
| 145 | +#define MAX310X_LCR_TXBREAK_BIT (1 << 6) /* TX break enable */ | |
| 146 | +#define MAX310X_LCR_RTS_BIT (1 << 7) /* RTS pin control */ | |
| 147 | +#define MAX310X_LCR_WORD_LEN_5 (0x00) | |
| 148 | +#define MAX310X_LCR_WORD_LEN_6 (0x01) | |
| 149 | +#define MAX310X_LCR_WORD_LEN_7 (0x02) | |
| 150 | +#define MAX310X_LCR_WORD_LEN_8 (0x03) | |
| 151 | + | |
| 152 | +/* IRDA register bits */ | |
| 153 | +#define MAX310X_IRDA_IRDAEN_BIT (1 << 0) /* IRDA mode enable */ | |
| 154 | +#define MAX310X_IRDA_SIR_BIT (1 << 1) /* SIR mode enable */ | |
| 155 | +#define MAX310X_IRDA_SHORTIR_BIT (1 << 2) /* Short SIR mode enable */ | |
| 156 | +#define MAX310X_IRDA_MIR_BIT (1 << 3) /* MIR mode enable */ | |
| 157 | +#define MAX310X_IRDA_RXINV_BIT (1 << 4) /* RX logic inversion enable */ | |
| 158 | +#define MAX310X_IRDA_TXINV_BIT (1 << 5) /* TX logic inversion enable */ | |
| 159 | + | |
| 160 | +/* Flow control trigger level register masks */ | |
| 161 | +#define MAX310X_FLOWLVL_HALT_MASK (0x000f) /* Flow control halt level */ | |
| 162 | +#define MAX310X_FLOWLVL_RES_MASK (0x00f0) /* Flow control resume level */ | |
| 163 | +#define MAX310X_FLOWLVL_HALT(words) ((words / 8) & 0x0f) | |
| 164 | +#define MAX310X_FLOWLVL_RES(words) (((words / 8) & 0x0f) << 4) | |
| 165 | + | |
| 166 | +/* FIFO interrupt trigger level register masks */ | |
| 167 | +#define MAX310X_FIFOTRIGLVL_TX_MASK (0x0f) /* TX FIFO trigger level */ | |
| 168 | +#define MAX310X_FIFOTRIGLVL_RX_MASK (0xf0) /* RX FIFO trigger level */ | |
| 169 | +#define MAX310X_FIFOTRIGLVL_TX(words) ((words / 8) & 0x0f) | |
| 170 | +#define MAX310X_FIFOTRIGLVL_RX(words) (((words / 8) & 0x0f) << 4) | |
| 171 | + | |
| 172 | +/* Flow control register bits */ | |
| 173 | +#define MAX310X_FLOWCTRL_AUTORTS_BIT (1 << 0) /* Auto RTS flow ctrl enable */ | |
| 174 | +#define MAX310X_FLOWCTRL_AUTOCTS_BIT (1 << 1) /* Auto CTS flow ctrl enable */ | |
| 175 | +#define MAX310X_FLOWCTRL_GPIADDR_BIT (1 << 2) /* Enables that GPIO inputs | |
| 176 | + * are used in conjunction with | |
| 177 | + * XOFF2 for definition of | |
| 178 | + * special character */ | |
| 179 | +#define MAX310X_FLOWCTRL_SWFLOWEN_BIT (1 << 3) /* Auto SW flow ctrl enable */ | |
| 180 | +#define MAX310X_FLOWCTRL_SWFLOW0_BIT (1 << 4) /* SWFLOW bit 0 */ | |
| 181 | +#define MAX310X_FLOWCTRL_SWFLOW1_BIT (1 << 5) /* SWFLOW bit 1 | |
| 182 | + * | |
| 183 | + * SWFLOW bits 1 & 0 table: | |
| 184 | + * 00 -> no transmitter flow | |
| 185 | + * control | |
| 186 | + * 01 -> receiver compares | |
| 187 | + * XON2 and XOFF2 | |
| 188 | + * and controls | |
| 189 | + * transmitter | |
| 190 | + * 10 -> receiver compares | |
| 191 | + * XON1 and XOFF1 | |
| 192 | + * and controls | |
| 193 | + * transmitter | |
| 194 | + * 11 -> receiver compares | |
| 195 | + * XON1, XON2, XOFF1 and | |
| 196 | + * XOFF2 and controls | |
| 197 | + * transmitter | |
| 198 | + */ | |
| 199 | +#define MAX310X_FLOWCTRL_SWFLOW2_BIT (1 << 6) /* SWFLOW bit 2 */ | |
| 200 | +#define MAX310X_FLOWCTRL_SWFLOW3_BIT (1 << 7) /* SWFLOW bit 3 | |
| 201 | + * | |
| 202 | + * SWFLOW bits 3 & 2 table: | |
| 203 | + * 00 -> no received flow | |
| 204 | + * control | |
| 205 | + * 01 -> transmitter generates | |
| 206 | + * XON2 and XOFF2 | |
| 207 | + * 10 -> transmitter generates | |
| 208 | + * XON1 and XOFF1 | |
| 209 | + * 11 -> transmitter generates | |
| 210 | + * XON1, XON2, XOFF1 and | |
| 211 | + * XOFF2 | |
| 212 | + */ | |
| 213 | + | |
| 214 | +/* GPIO configuration register bits */ | |
| 215 | +#define MAX310X_GPIOCFG_GP0OUT_BIT (1 << 0) /* GPIO 0 output enable */ | |
| 216 | +#define MAX310X_GPIOCFG_GP1OUT_BIT (1 << 1) /* GPIO 1 output enable */ | |
| 217 | +#define MAX310X_GPIOCFG_GP2OUT_BIT (1 << 2) /* GPIO 2 output enable */ | |
| 218 | +#define MAX310X_GPIOCFG_GP3OUT_BIT (1 << 3) /* GPIO 3 output enable */ | |
| 219 | +#define MAX310X_GPIOCFG_GP0OD_BIT (1 << 4) /* GPIO 0 open-drain enable */ | |
| 220 | +#define MAX310X_GPIOCFG_GP1OD_BIT (1 << 5) /* GPIO 1 open-drain enable */ | |
| 221 | +#define MAX310X_GPIOCFG_GP2OD_BIT (1 << 6) /* GPIO 2 open-drain enable */ | |
| 222 | +#define MAX310X_GPIOCFG_GP3OD_BIT (1 << 7) /* GPIO 3 open-drain enable */ | |
| 223 | + | |
| 224 | +/* GPIO DATA register bits */ | |
| 225 | +#define MAX310X_GPIODATA_GP0OUT_BIT (1 << 0) /* GPIO 0 output value */ | |
| 226 | +#define MAX310X_GPIODATA_GP1OUT_BIT (1 << 1) /* GPIO 1 output value */ | |
| 227 | +#define MAX310X_GPIODATA_GP2OUT_BIT (1 << 2) /* GPIO 2 output value */ | |
| 228 | +#define MAX310X_GPIODATA_GP3OUT_BIT (1 << 3) /* GPIO 3 output value */ | |
| 229 | +#define MAX310X_GPIODATA_GP0IN_BIT (1 << 4) /* GPIO 0 input value */ | |
| 230 | +#define MAX310X_GPIODATA_GP1IN_BIT (1 << 5) /* GPIO 1 input value */ | |
| 231 | +#define MAX310X_GPIODATA_GP2IN_BIT (1 << 6) /* GPIO 2 input value */ | |
| 232 | +#define MAX310X_GPIODATA_GP3IN_BIT (1 << 7) /* GPIO 3 input value */ | |
| 233 | + | |
| 234 | +/* PLL configuration register masks */ | |
| 235 | +#define MAX310X_PLLCFG_PREDIV_MASK (0x3f) /* PLL predivision value */ | |
| 236 | +#define MAX310X_PLLCFG_PLLFACTOR_MASK (0xc0) /* PLL multiplication factor */ | |
| 237 | + | |
| 238 | +/* Baud rate generator configuration register bits */ | |
| 239 | +#define MAX310X_BRGCFG_2XMODE_BIT (1 << 4) /* Double baud rate */ | |
| 240 | +#define MAX310X_BRGCFG_4XMODE_BIT (1 << 5) /* Quadruple baud rate */ | |
| 241 | + | |
| 242 | +/* Clock source register bits */ | |
| 243 | +#define MAX310X_CLKSRC_CRYST_BIT (1 << 1) /* Crystal osc enable */ | |
| 244 | +#define MAX310X_CLKSRC_PLL_BIT (1 << 2) /* PLL enable */ | |
| 245 | +#define MAX310X_CLKSRC_PLLBYP_BIT (1 << 3) /* PLL bypass */ | |
| 246 | +#define MAX310X_CLKSRC_EXTCLK_BIT (1 << 4) /* External clock enable */ | |
| 247 | +#define MAX310X_CLKSRC_CLK2RTS_BIT (1 << 7) /* Baud clk to RTS pin */ | |
| 248 | + | |
| 249 | +/* Misc definitions */ | |
| 250 | +#define MAX310X_FIFO_SIZE (128) | |
| 251 | + | |
| 252 | +/* MAX3107 specific */ | |
| 253 | +#define MAX3107_REV_ID (0xa0) | |
| 254 | +#define MAX3107_REV_MASK (0xfe) | |
| 255 | + | |
| 256 | +/* IRQ status bits definitions */ | |
| 257 | +#define MAX310X_IRQ_TX (MAX310X_IRQ_TXFIFO_BIT | \ | |
| 258 | + MAX310X_IRQ_TXEMPTY_BIT) | |
| 259 | +#define MAX310X_IRQ_RX (MAX310X_IRQ_RXFIFO_BIT | \ | |
| 260 | + MAX310X_IRQ_RXEMPTY_BIT) | |
| 261 | + | |
| 262 | +/* Supported chip types */ | |
| 263 | +enum { | |
| 264 | + MAX310X_TYPE_MAX3107 = 3107, | |
| 265 | + MAX310X_TYPE_MAX3108 = 3108, | |
| 266 | +}; | |
| 267 | + | |
| 268 | +struct max310x_port { | |
| 269 | + struct uart_driver uart; | |
| 270 | + struct uart_port port; | |
| 271 | + | |
| 272 | + const char *name; | |
| 273 | + int uartclk; | |
| 274 | + | |
| 275 | + unsigned int nr_gpio; | |
| 276 | +#ifdef CONFIG_GPIOLIB | |
| 277 | + struct gpio_chip gpio; | |
| 278 | +#endif | |
| 279 | + | |
| 280 | + struct regmap *regmap; | |
| 281 | + struct regmap_config regcfg; | |
| 282 | + | |
| 283 | + struct workqueue_struct *wq; | |
| 284 | + struct work_struct tx_work; | |
| 285 | + | |
| 286 | + struct mutex max310x_mutex; | |
| 287 | + | |
| 288 | + struct max310x_pdata *pdata; | |
| 289 | +}; | |
| 290 | + | |
| 291 | +static bool max3107_8_reg_writeable(struct device *dev, unsigned int reg) | |
| 292 | +{ | |
| 293 | + switch (reg) { | |
| 294 | + case MAX310X_IRQSTS_REG: | |
| 295 | + case MAX310X_LSR_IRQSTS_REG: | |
| 296 | + case MAX310X_SPCHR_IRQSTS_REG: | |
| 297 | + case MAX310X_STS_IRQSTS_REG: | |
| 298 | + case MAX310X_TXFIFOLVL_REG: | |
| 299 | + case MAX310X_RXFIFOLVL_REG: | |
| 300 | + case MAX3107_REVID_REG: /* Only available on MAX3107 */ | |
| 301 | + return false; | |
| 302 | + default: | |
| 303 | + break; | |
| 304 | + } | |
| 305 | + | |
| 306 | + return true; | |
| 307 | +} | |
| 308 | + | |
| 309 | +static bool max310x_reg_volatile(struct device *dev, unsigned int reg) | |
| 310 | +{ | |
| 311 | + switch (reg) { | |
| 312 | + case MAX310X_RHR_REG: | |
| 313 | + case MAX310X_IRQSTS_REG: | |
| 314 | + case MAX310X_LSR_IRQSTS_REG: | |
| 315 | + case MAX310X_SPCHR_IRQSTS_REG: | |
| 316 | + case MAX310X_STS_IRQSTS_REG: | |
| 317 | + case MAX310X_TXFIFOLVL_REG: | |
| 318 | + case MAX310X_RXFIFOLVL_REG: | |
| 319 | + case MAX310X_GPIODATA_REG: | |
| 320 | + return true; | |
| 321 | + default: | |
| 322 | + break; | |
| 323 | + } | |
| 324 | + | |
| 325 | + return false; | |
| 326 | +} | |
| 327 | + | |
| 328 | +static bool max310x_reg_precious(struct device *dev, unsigned int reg) | |
| 329 | +{ | |
| 330 | + switch (reg) { | |
| 331 | + case MAX310X_RHR_REG: | |
| 332 | + case MAX310X_IRQSTS_REG: | |
| 333 | + case MAX310X_SPCHR_IRQSTS_REG: | |
| 334 | + case MAX310X_STS_IRQSTS_REG: | |
| 335 | + return true; | |
| 336 | + default: | |
| 337 | + break; | |
| 338 | + } | |
| 339 | + | |
| 340 | + return false; | |
| 341 | +} | |
| 342 | + | |
| 343 | +static void max310x_set_baud(struct max310x_port *s, int baud) | |
| 344 | +{ | |
| 345 | + unsigned int mode = 0, div = s->uartclk / baud; | |
| 346 | + | |
| 347 | + if (!(div / 16)) { | |
| 348 | + /* Mode x2 */ | |
| 349 | + mode = MAX310X_BRGCFG_2XMODE_BIT; | |
| 350 | + div = (s->uartclk * 2) / baud; | |
| 351 | + } | |
| 352 | + | |
| 353 | + if (!(div / 16)) { | |
| 354 | + /* Mode x4 */ | |
| 355 | + mode = MAX310X_BRGCFG_4XMODE_BIT; | |
| 356 | + div = (s->uartclk * 4) / baud; | |
| 357 | + } | |
| 358 | + | |
| 359 | + regmap_write(s->regmap, MAX310X_BRGDIVMSB_REG, | |
| 360 | + ((div / 16) >> 8) & 0xff); | |
| 361 | + regmap_write(s->regmap, MAX310X_BRGDIVLSB_REG, (div / 16) & 0xff); | |
| 362 | + regmap_write(s->regmap, MAX310X_BRGCFG_REG, (div % 16) | mode); | |
| 363 | +} | |
| 364 | + | |
| 365 | +static void max310x_wait_pll(struct max310x_port *s) | |
| 366 | +{ | |
| 367 | + int tryes = 1000; | |
| 368 | + | |
| 369 | + /* Wait for PLL only if crystal is used */ | |
| 370 | + if (!(s->pdata->driver_flags & MAX310X_EXT_CLK)) { | |
| 371 | + unsigned int sts = 0; | |
| 372 | + | |
| 373 | + while (tryes--) { | |
| 374 | + regmap_read(s->regmap, MAX310X_STS_IRQSTS_REG, &sts); | |
| 375 | + if (sts & MAX310X_STS_CLKREADY_BIT) | |
| 376 | + break; | |
| 377 | + } | |
| 378 | + } | |
| 379 | +} | |
| 380 | + | |
| 381 | +static int __devinit max310x_update_best_err(unsigned long f, long *besterr) | |
| 382 | +{ | |
| 383 | + /* Use baudrate 115200 for calculate error */ | |
| 384 | + long err = f % (115200 * 16); | |
| 385 | + | |
| 386 | + if ((*besterr < 0) || (*besterr > err)) { | |
| 387 | + *besterr = err; | |
| 388 | + return 0; | |
| 389 | + } | |
| 390 | + | |
| 391 | + return 1; | |
| 392 | +} | |
| 393 | + | |
| 394 | +static int __devinit max310x_set_ref_clk(struct max310x_port *s) | |
| 395 | +{ | |
| 396 | + unsigned int div, clksrc, pllcfg = 0; | |
| 397 | + long besterr = -1; | |
| 398 | + unsigned long fdiv, fmul, bestfreq = s->pdata->frequency; | |
| 399 | + | |
| 400 | + /* First, update error without PLL */ | |
| 401 | + max310x_update_best_err(s->pdata->frequency, &besterr); | |
| 402 | + | |
| 403 | + /* Try all possible PLL dividers */ | |
| 404 | + for (div = 1; (div <= 63) && besterr; div++) { | |
| 405 | + fdiv = DIV_ROUND_CLOSEST(s->pdata->frequency, div); | |
| 406 | + | |
| 407 | + /* Try multiplier 6 */ | |
| 408 | + fmul = fdiv * 6; | |
| 409 | + if ((fdiv >= 500000) && (fdiv <= 800000)) | |
| 410 | + if (!max310x_update_best_err(fmul, &besterr)) { | |
| 411 | + pllcfg = (0 << 6) | div; | |
| 412 | + bestfreq = fmul; | |
| 413 | + } | |
| 414 | + /* Try multiplier 48 */ | |
| 415 | + fmul = fdiv * 48; | |
| 416 | + if ((fdiv >= 850000) && (fdiv <= 1200000)) | |
| 417 | + if (!max310x_update_best_err(fmul, &besterr)) { | |
| 418 | + pllcfg = (1 << 6) | div; | |
| 419 | + bestfreq = fmul; | |
| 420 | + } | |
| 421 | + /* Try multiplier 96 */ | |
| 422 | + fmul = fdiv * 96; | |
| 423 | + if ((fdiv >= 425000) && (fdiv <= 1000000)) | |
| 424 | + if (!max310x_update_best_err(fmul, &besterr)) { | |
| 425 | + pllcfg = (2 << 6) | div; | |
| 426 | + bestfreq = fmul; | |
| 427 | + } | |
| 428 | + /* Try multiplier 144 */ | |
| 429 | + fmul = fdiv * 144; | |
| 430 | + if ((fdiv >= 390000) && (fdiv <= 667000)) | |
| 431 | + if (!max310x_update_best_err(fmul, &besterr)) { | |
| 432 | + pllcfg = (3 << 6) | div; | |
| 433 | + bestfreq = fmul; | |
| 434 | + } | |
| 435 | + } | |
| 436 | + | |
| 437 | + /* Configure clock source */ | |
| 438 | + if (s->pdata->driver_flags & MAX310X_EXT_CLK) | |
| 439 | + clksrc = MAX310X_CLKSRC_EXTCLK_BIT; | |
| 440 | + else | |
| 441 | + clksrc = MAX310X_CLKSRC_CRYST_BIT; | |
| 442 | + | |
| 443 | + /* Configure PLL */ | |
| 444 | + if (pllcfg) { | |
| 445 | + clksrc |= MAX310X_CLKSRC_PLL_BIT; | |
| 446 | + regmap_write(s->regmap, MAX310X_PLLCFG_REG, pllcfg); | |
| 447 | + } else | |
| 448 | + clksrc |= MAX310X_CLKSRC_PLLBYP_BIT; | |
| 449 | + | |
| 450 | + regmap_write(s->regmap, MAX310X_CLKSRC_REG, clksrc); | |
| 451 | + | |
| 452 | + if (pllcfg) | |
| 453 | + max310x_wait_pll(s); | |
| 454 | + | |
| 455 | + dev_dbg(s->port.dev, "Reference clock set to %lu Hz\n", bestfreq); | |
| 456 | + | |
| 457 | + return (int)bestfreq; | |
| 458 | +} | |
| 459 | + | |
| 460 | +static void max310x_handle_rx(struct max310x_port *s, unsigned int rxlen) | |
| 461 | +{ | |
| 462 | + unsigned int sts = 0, ch = 0, flag; | |
| 463 | + struct tty_struct *tty = tty_port_tty_get(&s->port.state->port); | |
| 464 | + | |
| 465 | + if (!tty) | |
| 466 | + return; | |
| 467 | + | |
| 468 | + if (unlikely(rxlen >= MAX310X_FIFO_SIZE)) { | |
| 469 | + dev_warn(s->port.dev, "Possible RX FIFO overrun %d\n", rxlen); | |
| 470 | + /* Ensure sanity of RX level */ | |
| 471 | + rxlen = MAX310X_FIFO_SIZE; | |
| 472 | + } | |
| 473 | + | |
| 474 | + dev_dbg(s->port.dev, "RX Len = %u\n", rxlen); | |
| 475 | + | |
| 476 | + while (rxlen--) { | |
| 477 | + regmap_read(s->regmap, MAX310X_RHR_REG, &ch); | |
| 478 | + regmap_read(s->regmap, MAX310X_LSR_IRQSTS_REG, &sts); | |
| 479 | + | |
| 480 | + sts &= MAX310X_LSR_RXPAR_BIT | MAX310X_LSR_FRERR_BIT | | |
| 481 | + MAX310X_LSR_RXOVR_BIT | MAX310X_LSR_RXBRK_BIT; | |
| 482 | + | |
| 483 | + s->port.icount.rx++; | |
| 484 | + flag = TTY_NORMAL; | |
| 485 | + | |
| 486 | + if (unlikely(sts)) { | |
| 487 | + if (sts & MAX310X_LSR_RXBRK_BIT) { | |
| 488 | + s->port.icount.brk++; | |
| 489 | + if (uart_handle_break(&s->port)) | |
| 490 | + continue; | |
| 491 | + } else if (sts & MAX310X_LSR_RXPAR_BIT) | |
| 492 | + s->port.icount.parity++; | |
| 493 | + else if (sts & MAX310X_LSR_FRERR_BIT) | |
| 494 | + s->port.icount.frame++; | |
| 495 | + else if (sts & MAX310X_LSR_RXOVR_BIT) | |
| 496 | + s->port.icount.overrun++; | |
| 497 | + | |
| 498 | + sts &= s->port.read_status_mask; | |
| 499 | + if (sts & MAX310X_LSR_RXBRK_BIT) | |
| 500 | + flag = TTY_BREAK; | |
| 501 | + else if (sts & MAX310X_LSR_RXPAR_BIT) | |
| 502 | + flag = TTY_PARITY; | |
| 503 | + else if (sts & MAX310X_LSR_FRERR_BIT) | |
| 504 | + flag = TTY_FRAME; | |
| 505 | + else if (sts & MAX310X_LSR_RXOVR_BIT) | |
| 506 | + flag = TTY_OVERRUN; | |
| 507 | + } | |
| 508 | + | |
| 509 | + if (uart_handle_sysrq_char(s->port, ch)) | |
| 510 | + continue; | |
| 511 | + | |
| 512 | + if (sts & s->port.ignore_status_mask) | |
| 513 | + continue; | |
| 514 | + | |
| 515 | + uart_insert_char(&s->port, sts, MAX310X_LSR_RXOVR_BIT, | |
| 516 | + ch, flag); | |
| 517 | + } | |
| 518 | + | |
| 519 | + tty_flip_buffer_push(tty); | |
| 520 | + | |
| 521 | + tty_kref_put(tty); | |
| 522 | +} | |
| 523 | + | |
| 524 | +static void max310x_handle_tx(struct max310x_port *s) | |
| 525 | +{ | |
| 526 | + struct circ_buf *xmit = &s->port.state->xmit; | |
| 527 | + unsigned int txlen = 0, to_send; | |
| 528 | + | |
| 529 | + if (unlikely(s->port.x_char)) { | |
| 530 | + regmap_write(s->regmap, MAX310X_THR_REG, s->port.x_char); | |
| 531 | + s->port.icount.tx++; | |
| 532 | + s->port.x_char = 0; | |
| 533 | + return; | |
| 534 | + } | |
| 535 | + | |
| 536 | + if (uart_circ_empty(xmit) || uart_tx_stopped(&s->port)) | |
| 537 | + return; | |
| 538 | + | |
| 539 | + /* Get length of data pending in circular buffer */ | |
| 540 | + to_send = uart_circ_chars_pending(xmit); | |
| 541 | + if (likely(to_send)) { | |
| 542 | + /* Limit to size of TX FIFO */ | |
| 543 | + regmap_read(s->regmap, MAX310X_TXFIFOLVL_REG, &txlen); | |
| 544 | + txlen = MAX310X_FIFO_SIZE - txlen; | |
| 545 | + to_send = (to_send > txlen) ? txlen : to_send; | |
| 546 | + | |
| 547 | + dev_dbg(s->port.dev, "TX Len = %u\n", to_send); | |
| 548 | + | |
| 549 | + /* Add data to send */ | |
| 550 | + s->port.icount.tx += to_send; | |
| 551 | + while (to_send--) { | |
| 552 | + regmap_write(s->regmap, MAX310X_THR_REG, | |
| 553 | + xmit->buf[xmit->tail]); | |
| 554 | + xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); | |
| 555 | + }; | |
| 556 | + } | |
| 557 | + | |
| 558 | + if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) | |
| 559 | + uart_write_wakeup(&s->port); | |
| 560 | +} | |
| 561 | + | |
| 562 | +static irqreturn_t max310x_ist(int irq, void *dev_id) | |
| 563 | +{ | |
| 564 | + struct max310x_port *s = (struct max310x_port *)dev_id; | |
| 565 | + unsigned int ists = 0, lsr = 0, rxlen = 0; | |
| 566 | + | |
| 567 | + mutex_lock(&s->max310x_mutex); | |
| 568 | + | |
| 569 | + for (;;) { | |
| 570 | + /* Read IRQ status & RX FIFO level */ | |
| 571 | + regmap_read(s->regmap, MAX310X_IRQSTS_REG, &ists); | |
| 572 | + regmap_read(s->regmap, MAX310X_LSR_IRQSTS_REG, &lsr); | |
| 573 | + regmap_read(s->regmap, MAX310X_RXFIFOLVL_REG, &rxlen); | |
| 574 | + if (!ists && !(lsr & MAX310X_LSR_RXTO_BIT) && !rxlen) | |
| 575 | + break; | |
| 576 | + | |
| 577 | + dev_dbg(s->port.dev, "IRQ status: 0x%02x\n", ists); | |
| 578 | + | |
| 579 | + if (rxlen) | |
| 580 | + max310x_handle_rx(s, rxlen); | |
| 581 | + if (ists & MAX310X_IRQ_TX) | |
| 582 | + max310x_handle_tx(s); | |
| 583 | + if (ists & MAX310X_IRQ_CTS_BIT) | |
| 584 | + uart_handle_cts_change(&s->port, | |
| 585 | + !!(lsr & MAX310X_LSR_CTS_BIT)); | |
| 586 | + } | |
| 587 | + | |
| 588 | + mutex_unlock(&s->max310x_mutex); | |
| 589 | + | |
| 590 | + return IRQ_HANDLED; | |
| 591 | +} | |
| 592 | + | |
| 593 | +static void max310x_wq_proc(struct work_struct *ws) | |
| 594 | +{ | |
| 595 | + struct max310x_port *s = container_of(ws, struct max310x_port, tx_work); | |
| 596 | + | |
| 597 | + mutex_lock(&s->max310x_mutex); | |
| 598 | + max310x_handle_tx(s); | |
| 599 | + mutex_unlock(&s->max310x_mutex); | |
| 600 | +} | |
| 601 | + | |
| 602 | +static void max310x_start_tx(struct uart_port *port) | |
| 603 | +{ | |
| 604 | + struct max310x_port *s = container_of(port, struct max310x_port, port); | |
| 605 | + | |
| 606 | + queue_work(s->wq, &s->tx_work); | |
| 607 | +} | |
| 608 | + | |
| 609 | +static void max310x_stop_tx(struct uart_port *port) | |
| 610 | +{ | |
| 611 | + /* Do nothing */ | |
| 612 | +} | |
| 613 | + | |
| 614 | +static void max310x_stop_rx(struct uart_port *port) | |
| 615 | +{ | |
| 616 | + /* Do nothing */ | |
| 617 | +} | |
| 618 | + | |
| 619 | +static unsigned int max310x_tx_empty(struct uart_port *port) | |
| 620 | +{ | |
| 621 | + unsigned int val = 0; | |
| 622 | + struct max310x_port *s = container_of(port, struct max310x_port, port); | |
| 623 | + | |
| 624 | + mutex_lock(&s->max310x_mutex); | |
| 625 | + regmap_read(s->regmap, MAX310X_TXFIFOLVL_REG, &val); | |
| 626 | + mutex_unlock(&s->max310x_mutex); | |
| 627 | + | |
| 628 | + return val ? 0 : TIOCSER_TEMT; | |
| 629 | +} | |
| 630 | + | |
| 631 | +static void max310x_enable_ms(struct uart_port *port) | |
| 632 | +{ | |
| 633 | + /* Modem status not supported */ | |
| 634 | +} | |
| 635 | + | |
| 636 | +static unsigned int max310x_get_mctrl(struct uart_port *port) | |
| 637 | +{ | |
| 638 | + /* DCD and DSR are not wired and CTS/RTS is handled automatically | |
| 639 | + * so just indicate DSR and CAR asserted | |
| 640 | + */ | |
| 641 | + return TIOCM_DSR | TIOCM_CAR; | |
| 642 | +} | |
| 643 | + | |
| 644 | +static void max310x_set_mctrl(struct uart_port *port, unsigned int mctrl) | |
| 645 | +{ | |
| 646 | + /* DCD and DSR are not wired and CTS/RTS is hadnled automatically | |
| 647 | + * so do nothing | |
| 648 | + */ | |
| 649 | +} | |
| 650 | + | |
| 651 | +static void max310x_break_ctl(struct uart_port *port, int break_state) | |
| 652 | +{ | |
| 653 | + struct max310x_port *s = container_of(port, struct max310x_port, port); | |
| 654 | + | |
| 655 | + mutex_lock(&s->max310x_mutex); | |
| 656 | + regmap_update_bits(s->regmap, MAX310X_LCR_REG, | |
| 657 | + MAX310X_LCR_TXBREAK_BIT, | |
| 658 | + break_state ? MAX310X_LCR_TXBREAK_BIT : 0); | |
| 659 | + mutex_unlock(&s->max310x_mutex); | |
| 660 | +} | |
| 661 | + | |
| 662 | +static void max310x_set_termios(struct uart_port *port, | |
| 663 | + struct ktermios *termios, | |
| 664 | + struct ktermios *old) | |
| 665 | +{ | |
| 666 | + struct max310x_port *s = container_of(port, struct max310x_port, port); | |
| 667 | + unsigned int lcr, flow = 0; | |
| 668 | + int baud; | |
| 669 | + | |
| 670 | + mutex_lock(&s->max310x_mutex); | |
| 671 | + | |
| 672 | + /* Mask termios capabilities we don't support */ | |
| 673 | + termios->c_cflag &= ~CMSPAR; | |
| 674 | + termios->c_iflag &= ~IXANY; | |
| 675 | + | |
| 676 | + /* Word size */ | |
| 677 | + switch (termios->c_cflag & CSIZE) { | |
| 678 | + case CS5: | |
| 679 | + lcr = MAX310X_LCR_WORD_LEN_5; | |
| 680 | + break; | |
| 681 | + case CS6: | |
| 682 | + lcr = MAX310X_LCR_WORD_LEN_6; | |
| 683 | + break; | |
| 684 | + case CS7: | |
| 685 | + lcr = MAX310X_LCR_WORD_LEN_7; | |
| 686 | + break; | |
| 687 | + case CS8: | |
| 688 | + default: | |
| 689 | + lcr = MAX310X_LCR_WORD_LEN_8; | |
| 690 | + break; | |
| 691 | + } | |
| 692 | + | |
| 693 | + /* Parity */ | |
| 694 | + if (termios->c_cflag & PARENB) { | |
| 695 | + lcr |= MAX310X_LCR_PARITY_BIT; | |
| 696 | + if (!(termios->c_cflag & PARODD)) | |
| 697 | + lcr |= MAX310X_LCR_EVENPARITY_BIT; | |
| 698 | + } | |
| 699 | + | |
| 700 | + /* Stop bits */ | |
| 701 | + if (termios->c_cflag & CSTOPB) | |
| 702 | + lcr |= MAX310X_LCR_STOPLEN_BIT; /* 2 stops */ | |
| 703 | + | |
| 704 | + /* Update LCR register */ | |
| 705 | + regmap_write(s->regmap, MAX310X_LCR_REG, lcr); | |
| 706 | + | |
| 707 | + /* Set read status mask */ | |
| 708 | + port->read_status_mask = MAX310X_LSR_RXOVR_BIT; | |
| 709 | + if (termios->c_iflag & INPCK) | |
| 710 | + port->read_status_mask |= MAX310X_LSR_RXPAR_BIT | | |
| 711 | + MAX310X_LSR_FRERR_BIT; | |
| 712 | + if (termios->c_iflag & (BRKINT | PARMRK)) | |
| 713 | + port->read_status_mask |= MAX310X_LSR_RXBRK_BIT; | |
| 714 | + | |
| 715 | + /* Set status ignore mask */ | |
| 716 | + port->ignore_status_mask = 0; | |
| 717 | + if (termios->c_iflag & IGNBRK) | |
| 718 | + port->ignore_status_mask |= MAX310X_LSR_RXBRK_BIT; | |
| 719 | + if (!(termios->c_cflag & CREAD)) | |
| 720 | + port->ignore_status_mask |= MAX310X_LSR_RXPAR_BIT | | |
| 721 | + MAX310X_LSR_RXOVR_BIT | | |
| 722 | + MAX310X_LSR_FRERR_BIT | | |
| 723 | + MAX310X_LSR_RXBRK_BIT; | |
| 724 | + | |
| 725 | + /* Configure flow control */ | |
| 726 | + regmap_write(s->regmap, MAX310X_XON1_REG, termios->c_cc[VSTART]); | |
| 727 | + regmap_write(s->regmap, MAX310X_XOFF1_REG, termios->c_cc[VSTOP]); | |
| 728 | + if (termios->c_cflag & CRTSCTS) | |
| 729 | + flow |= MAX310X_FLOWCTRL_AUTOCTS_BIT | | |
| 730 | + MAX310X_FLOWCTRL_AUTORTS_BIT; | |
| 731 | + if (termios->c_iflag & IXON) | |
| 732 | + flow |= MAX310X_FLOWCTRL_SWFLOW3_BIT | | |
| 733 | + MAX310X_FLOWCTRL_SWFLOWEN_BIT; | |
| 734 | + if (termios->c_iflag & IXOFF) | |
| 735 | + flow |= MAX310X_FLOWCTRL_SWFLOW1_BIT | | |
| 736 | + MAX310X_FLOWCTRL_SWFLOWEN_BIT; | |
| 737 | + regmap_write(s->regmap, MAX310X_FLOWCTRL_REG, flow); | |
| 738 | + | |
| 739 | + /* Get baud rate generator configuration */ | |
| 740 | + baud = uart_get_baud_rate(port, termios, old, | |
| 741 | + port->uartclk / 16 / 0xffff, | |
| 742 | + port->uartclk / 4); | |
| 743 | + | |
| 744 | + /* Setup baudrate generator */ | |
| 745 | + max310x_set_baud(s, baud); | |
| 746 | + | |
| 747 | + /* Update timeout according to new baud rate */ | |
| 748 | + uart_update_timeout(port, termios->c_cflag, baud); | |
| 749 | + | |
| 750 | + mutex_unlock(&s->max310x_mutex); | |
| 751 | +} | |
| 752 | + | |
| 753 | +static int max310x_startup(struct uart_port *port) | |
| 754 | +{ | |
| 755 | + unsigned int val, line = port->line; | |
| 756 | + struct max310x_port *s = container_of(port, struct max310x_port, port); | |
| 757 | + | |
| 758 | + if (s->pdata->suspend) | |
| 759 | + s->pdata->suspend(0); | |
| 760 | + | |
| 761 | + mutex_lock(&s->max310x_mutex); | |
| 762 | + | |
| 763 | + /* Configure baud rate, 9600 as default */ | |
| 764 | + max310x_set_baud(s, 9600); | |
| 765 | + | |
| 766 | + /* Configure LCR register, 8N1 mode by default */ | |
| 767 | + val = MAX310X_LCR_WORD_LEN_8; | |
| 768 | + regmap_write(s->regmap, MAX310X_LCR_REG, val); | |
| 769 | + | |
| 770 | + /* Configure MODE1 register */ | |
| 771 | + regmap_update_bits(s->regmap, MAX310X_MODE1_REG, | |
| 772 | + MAX310X_MODE1_TRNSCVCTRL_BIT, | |
| 773 | + (s->pdata->uart_flags[line] & MAX310X_AUTO_DIR_CTRL) | |
| 774 | + ? MAX310X_MODE1_TRNSCVCTRL_BIT : 0); | |
| 775 | + | |
| 776 | + /* Configure MODE2 register */ | |
| 777 | + val = MAX310X_MODE2_RXEMPTINV_BIT; | |
| 778 | + if (s->pdata->uart_flags[line] & MAX310X_LOOPBACK) | |
| 779 | + val |= MAX310X_MODE2_LOOPBACK_BIT; | |
| 780 | + if (s->pdata->uart_flags[line] & MAX310X_ECHO_SUPRESS) | |
| 781 | + val |= MAX310X_MODE2_ECHOSUPR_BIT; | |
| 782 | + | |
| 783 | + /* Reset FIFOs */ | |
| 784 | + val |= MAX310X_MODE2_FIFORST_BIT; | |
| 785 | + regmap_write(s->regmap, MAX310X_MODE2_REG, val); | |
| 786 | + | |
| 787 | + /* Configure FIFO trigger level register */ | |
| 788 | + /* RX FIFO trigger for 16 words, TX FIFO trigger for 64 words */ | |
| 789 | + val = MAX310X_FIFOTRIGLVL_RX(16) | MAX310X_FIFOTRIGLVL_TX(64); | |
| 790 | + regmap_write(s->regmap, MAX310X_FIFOTRIGLVL_REG, val); | |
| 791 | + | |
| 792 | + /* Configure flow control levels */ | |
| 793 | + /* Flow control halt level 96, resume level 48 */ | |
| 794 | + val = MAX310X_FLOWLVL_RES(48) | MAX310X_FLOWLVL_HALT(96); | |
| 795 | + regmap_write(s->regmap, MAX310X_FLOWLVL_REG, val); | |
| 796 | + | |
| 797 | + /* Clear timeout register */ | |
| 798 | + regmap_write(s->regmap, MAX310X_RXTO_REG, 0); | |
| 799 | + | |
| 800 | + /* Configure LSR interrupt enable register */ | |
| 801 | + /* Enable RX timeout interrupt */ | |
| 802 | + val = MAX310X_LSR_RXTO_BIT; | |
| 803 | + regmap_write(s->regmap, MAX310X_LSR_IRQEN_REG, val); | |
| 804 | + | |
| 805 | + /* Clear FIFO reset */ | |
| 806 | + regmap_update_bits(s->regmap, MAX310X_MODE2_REG, | |
| 807 | + MAX310X_MODE2_FIFORST_BIT, 0); | |
| 808 | + | |
| 809 | + /* Clear IRQ status register by reading it */ | |
| 810 | + regmap_read(s->regmap, MAX310X_IRQSTS_REG, &val); | |
| 811 | + | |
| 812 | + /* Configure interrupt enable register */ | |
| 813 | + /* Enable CTS change interrupt */ | |
| 814 | + val = MAX310X_IRQ_CTS_BIT; | |
| 815 | + /* Enable RX, TX interrupts */ | |
| 816 | + val |= MAX310X_IRQ_RX | MAX310X_IRQ_TX; | |
| 817 | + regmap_write(s->regmap, MAX310X_IRQEN_REG, val); | |
| 818 | + | |
| 819 | + mutex_unlock(&s->max310x_mutex); | |
| 820 | + | |
| 821 | + return 0; | |
| 822 | +} | |
| 823 | + | |
| 824 | +static void max310x_shutdown(struct uart_port *port) | |
| 825 | +{ | |
| 826 | + struct max310x_port *s = container_of(port, struct max310x_port, port); | |
| 827 | + | |
| 828 | + /* Disable all interrupts */ | |
| 829 | + mutex_lock(&s->max310x_mutex); | |
| 830 | + regmap_write(s->regmap, MAX310X_IRQEN_REG, 0); | |
| 831 | + mutex_unlock(&s->max310x_mutex); | |
| 832 | + | |
| 833 | + if (s->pdata->suspend) | |
| 834 | + s->pdata->suspend(1); | |
| 835 | +} | |
| 836 | + | |
| 837 | +static const char *max310x_type(struct uart_port *port) | |
| 838 | +{ | |
| 839 | + struct max310x_port *s = container_of(port, struct max310x_port, port); | |
| 840 | + | |
| 841 | + return (port->type == PORT_MAX310X) ? s->name : NULL; | |
| 842 | +} | |
| 843 | + | |
| 844 | +static int max310x_request_port(struct uart_port *port) | |
| 845 | +{ | |
| 846 | + /* Do nothing */ | |
| 847 | + return 0; | |
| 848 | +} | |
| 849 | + | |
| 850 | +static void max310x_release_port(struct uart_port *port) | |
| 851 | +{ | |
| 852 | + /* Do nothing */ | |
| 853 | +} | |
| 854 | + | |
| 855 | +static void max310x_config_port(struct uart_port *port, int flags) | |
| 856 | +{ | |
| 857 | + if (flags & UART_CONFIG_TYPE) | |
| 858 | + port->type = PORT_MAX310X; | |
| 859 | +} | |
| 860 | + | |
| 861 | +static int max310x_verify_port(struct uart_port *port, struct serial_struct *ser) | |
| 862 | +{ | |
| 863 | + if ((ser->type == PORT_UNKNOWN) || (ser->type == PORT_MAX310X)) | |
| 864 | + return 0; | |
| 865 | + if (ser->irq == port->irq) | |
| 866 | + return 0; | |
| 867 | + | |
| 868 | + return -EINVAL; | |
| 869 | +} | |
| 870 | + | |
| 871 | +static struct uart_ops max310x_ops = { | |
| 872 | + .tx_empty = max310x_tx_empty, | |
| 873 | + .set_mctrl = max310x_set_mctrl, | |
| 874 | + .get_mctrl = max310x_get_mctrl, | |
| 875 | + .stop_tx = max310x_stop_tx, | |
| 876 | + .start_tx = max310x_start_tx, | |
| 877 | + .stop_rx = max310x_stop_rx, | |
| 878 | + .enable_ms = max310x_enable_ms, | |
| 879 | + .break_ctl = max310x_break_ctl, | |
| 880 | + .startup = max310x_startup, | |
| 881 | + .shutdown = max310x_shutdown, | |
| 882 | + .set_termios = max310x_set_termios, | |
| 883 | + .type = max310x_type, | |
| 884 | + .request_port = max310x_request_port, | |
| 885 | + .release_port = max310x_release_port, | |
| 886 | + .config_port = max310x_config_port, | |
| 887 | + .verify_port = max310x_verify_port, | |
| 888 | +}; | |
| 889 | + | |
| 890 | +static int max310x_suspend(struct spi_device *spi, pm_message_t state) | |
| 891 | +{ | |
| 892 | + int ret; | |
| 893 | + struct max310x_port *s = dev_get_drvdata(&spi->dev); | |
| 894 | + | |
| 895 | + dev_dbg(&spi->dev, "Suspend\n"); | |
| 896 | + | |
| 897 | + ret = uart_suspend_port(&s->uart, &s->port); | |
| 898 | + | |
| 899 | + mutex_lock(&s->max310x_mutex); | |
| 900 | + | |
| 901 | + /* Enable sleep mode */ | |
| 902 | + regmap_update_bits(s->regmap, MAX310X_MODE1_REG, | |
| 903 | + MAX310X_MODE1_FORCESLEEP_BIT, | |
| 904 | + MAX310X_MODE1_FORCESLEEP_BIT); | |
| 905 | + | |
| 906 | + mutex_unlock(&s->max310x_mutex); | |
| 907 | + | |
| 908 | + if (s->pdata->suspend) | |
| 909 | + s->pdata->suspend(1); | |
| 910 | + | |
| 911 | + return ret; | |
| 912 | +} | |
| 913 | + | |
| 914 | +static int max310x_resume(struct spi_device *spi) | |
| 915 | +{ | |
| 916 | + struct max310x_port *s = dev_get_drvdata(&spi->dev); | |
| 917 | + | |
| 918 | + dev_dbg(&spi->dev, "Resume\n"); | |
| 919 | + | |
| 920 | + if (s->pdata->suspend) | |
| 921 | + s->pdata->suspend(0); | |
| 922 | + | |
| 923 | + mutex_lock(&s->max310x_mutex); | |
| 924 | + | |
| 925 | + /* Disable sleep mode */ | |
| 926 | + regmap_update_bits(s->regmap, MAX310X_MODE1_REG, | |
| 927 | + MAX310X_MODE1_FORCESLEEP_BIT, | |
| 928 | + 0); | |
| 929 | + | |
| 930 | + max310x_wait_pll(s); | |
| 931 | + | |
| 932 | + mutex_unlock(&s->max310x_mutex); | |
| 933 | + | |
| 934 | + return uart_resume_port(&s->uart, &s->port); | |
| 935 | +} | |
| 936 | + | |
| 937 | +#ifdef CONFIG_GPIOLIB | |
| 938 | +static int max310x_gpio_get(struct gpio_chip *chip, unsigned offset) | |
| 939 | +{ | |
| 940 | + unsigned int val = 0; | |
| 941 | + struct max310x_port *s = container_of(chip, struct max310x_port, gpio); | |
| 942 | + | |
| 943 | + mutex_lock(&s->max310x_mutex); | |
| 944 | + regmap_read(s->regmap, MAX310X_GPIODATA_REG, &val); | |
| 945 | + mutex_unlock(&s->max310x_mutex); | |
| 946 | + | |
| 947 | + return !!((val >> 4) & (1 << offset)); | |
| 948 | +} | |
| 949 | + | |
| 950 | +static void max310x_gpio_set(struct gpio_chip *chip, unsigned offset, int value) | |
| 951 | +{ | |
| 952 | + struct max310x_port *s = container_of(chip, struct max310x_port, gpio); | |
| 953 | + | |
| 954 | + mutex_lock(&s->max310x_mutex); | |
| 955 | + regmap_update_bits(s->regmap, MAX310X_GPIODATA_REG, 1 << offset, value ? | |
| 956 | + 1 << offset : 0); | |
| 957 | + mutex_unlock(&s->max310x_mutex); | |
| 958 | +} | |
| 959 | + | |
| 960 | +static int max310x_gpio_direction_input(struct gpio_chip *chip, unsigned offset) | |
| 961 | +{ | |
| 962 | + struct max310x_port *s = container_of(chip, struct max310x_port, gpio); | |
| 963 | + | |
| 964 | + mutex_lock(&s->max310x_mutex); | |
| 965 | + | |
| 966 | + regmap_update_bits(s->regmap, MAX310X_GPIOCFG_REG, 1 << offset, 0); | |
| 967 | + | |
| 968 | + mutex_unlock(&s->max310x_mutex); | |
| 969 | + | |
| 970 | + return 0; | |
| 971 | +} | |
| 972 | + | |
| 973 | +static int max310x_gpio_direction_output(struct gpio_chip *chip, | |
| 974 | + unsigned offset, int value) | |
| 975 | +{ | |
| 976 | + struct max310x_port *s = container_of(chip, struct max310x_port, gpio); | |
| 977 | + | |
| 978 | + mutex_lock(&s->max310x_mutex); | |
| 979 | + | |
| 980 | + regmap_update_bits(s->regmap, MAX310X_GPIOCFG_REG, 1 << offset, | |
| 981 | + 1 << offset); | |
| 982 | + regmap_update_bits(s->regmap, MAX310X_GPIODATA_REG, 1 << offset, value ? | |
| 983 | + 1 << offset : 0); | |
| 984 | + | |
| 985 | + mutex_unlock(&s->max310x_mutex); | |
| 986 | + | |
| 987 | + return 0; | |
| 988 | +} | |
| 989 | +#endif | |
| 990 | + | |
| 991 | +/* Generic platform data */ | |
| 992 | +static struct max310x_pdata generic_plat_data = { | |
| 993 | + .driver_flags = MAX310X_EXT_CLK, | |
| 994 | + .uart_flags[0] = MAX310X_ECHO_SUPRESS, | |
| 995 | + .frequency = 26000000, | |
| 996 | +}; | |
| 997 | + | |
| 998 | +static int __devinit max310x_probe(struct spi_device *spi) | |
| 999 | +{ | |
| 1000 | + struct max310x_port *s; | |
| 1001 | + struct device *dev = &spi->dev; | |
| 1002 | + int chiptype = spi_get_device_id(spi)->driver_data; | |
| 1003 | + struct max310x_pdata *pdata = dev->platform_data; | |
| 1004 | + unsigned int val = 0; | |
| 1005 | + int ret; | |
| 1006 | + | |
| 1007 | + /* Check for IRQ */ | |
| 1008 | + if (spi->irq <= 0) { | |
| 1009 | + dev_err(dev, "No IRQ specified\n"); | |
| 1010 | + return -ENOTSUPP; | |
| 1011 | + } | |
| 1012 | + | |
| 1013 | + /* Alloc port structure */ | |
| 1014 | + s = devm_kzalloc(dev, sizeof(struct max310x_port), GFP_KERNEL); | |
| 1015 | + if (!s) { | |
| 1016 | + dev_err(dev, "Error allocating port structure\n"); | |
| 1017 | + return -ENOMEM; | |
| 1018 | + } | |
| 1019 | + dev_set_drvdata(dev, s); | |
| 1020 | + | |
| 1021 | + if (!pdata) { | |
| 1022 | + dev_warn(dev, "No platform data supplied, using defaults\n"); | |
| 1023 | + pdata = &generic_plat_data; | |
| 1024 | + } | |
| 1025 | + s->pdata = pdata; | |
| 1026 | + | |
| 1027 | + /* Individual chip settings */ | |
| 1028 | + switch (chiptype) { | |
| 1029 | + case MAX310X_TYPE_MAX3107: | |
| 1030 | + s->name = "MAX3107"; | |
| 1031 | + s->nr_gpio = 4; | |
| 1032 | + s->uart.nr = 1; | |
| 1033 | + s->regcfg.max_register = 0x1f; | |
| 1034 | + break; | |
| 1035 | + case MAX310X_TYPE_MAX3108: | |
| 1036 | + s->name = "MAX3108"; | |
| 1037 | + s->nr_gpio = 4; | |
| 1038 | + s->uart.nr = 1; | |
| 1039 | + s->regcfg.max_register = 0x1e; | |
| 1040 | + break; | |
| 1041 | + default: | |
| 1042 | + dev_err(dev, "Unsupported chip type %i\n", chiptype); | |
| 1043 | + return -ENOTSUPP; | |
| 1044 | + } | |
| 1045 | + | |
| 1046 | + /* Check input frequency */ | |
| 1047 | + if ((pdata->driver_flags & MAX310X_EXT_CLK) && | |
| 1048 | + ((pdata->frequency < 500000) || (pdata->frequency > 35000000))) | |
| 1049 | + goto err_freq; | |
| 1050 | + /* Check frequency for quartz */ | |
| 1051 | + if (!(pdata->driver_flags & MAX310X_EXT_CLK) && | |
| 1052 | + ((pdata->frequency < 1000000) || (pdata->frequency > 4000000))) | |
| 1053 | + goto err_freq; | |
| 1054 | + | |
| 1055 | + mutex_init(&s->max310x_mutex); | |
| 1056 | + | |
| 1057 | + /* Setup SPI bus */ | |
| 1058 | + spi->mode = SPI_MODE_0; | |
| 1059 | + spi->bits_per_word = 8; | |
| 1060 | + spi->max_speed_hz = 26000000; | |
| 1061 | + spi_setup(spi); | |
| 1062 | + | |
| 1063 | + /* Setup regmap */ | |
| 1064 | + s->regcfg.reg_bits = 8; | |
| 1065 | + s->regcfg.val_bits = 8; | |
| 1066 | + s->regcfg.read_flag_mask = 0x00; | |
| 1067 | + s->regcfg.write_flag_mask = 0x80; | |
| 1068 | + s->regcfg.cache_type = REGCACHE_RBTREE; | |
| 1069 | + s->regcfg.writeable_reg = max3107_8_reg_writeable; | |
| 1070 | + s->regcfg.volatile_reg = max310x_reg_volatile; | |
| 1071 | + s->regcfg.precious_reg = max310x_reg_precious; | |
| 1072 | + s->regmap = devm_regmap_init_spi(spi, &s->regcfg); | |
| 1073 | + if (IS_ERR(s->regmap)) { | |
| 1074 | + ret = PTR_ERR(s->regmap); | |
| 1075 | + dev_err(dev, "Failed to initialize register map\n"); | |
| 1076 | + goto err_out; | |
| 1077 | + } | |
| 1078 | + | |
| 1079 | + /* Reset chip & check SPI function */ | |
| 1080 | + ret = regmap_write(s->regmap, MAX310X_MODE2_REG, MAX310X_MODE2_RST_BIT); | |
| 1081 | + if (ret) { | |
| 1082 | + dev_err(dev, "SPI transfer failed\n"); | |
| 1083 | + goto err_out; | |
| 1084 | + } | |
| 1085 | + /* Clear chip reset */ | |
| 1086 | + regmap_write(s->regmap, MAX310X_MODE2_REG, 0); | |
| 1087 | + | |
| 1088 | + switch (chiptype) { | |
| 1089 | + case MAX310X_TYPE_MAX3107: | |
| 1090 | + /* Check REV ID to ensure we are talking to what we expect */ | |
| 1091 | + regmap_read(s->regmap, MAX3107_REVID_REG, &val); | |
| 1092 | + if (((val & MAX3107_REV_MASK) != MAX3107_REV_ID)) { | |
| 1093 | + dev_err(dev, "%s ID 0x%02x does not match\n", | |
| 1094 | + s->name, val); | |
| 1095 | + ret = -ENODEV; | |
| 1096 | + goto err_out; | |
| 1097 | + } | |
| 1098 | + break; | |
| 1099 | + case MAX310X_TYPE_MAX3108: | |
| 1100 | + /* MAX3108 have not REV ID register, we just check default value | |
| 1101 | + * from clocksource register to make sure everything works. | |
| 1102 | + */ | |
| 1103 | + regmap_read(s->regmap, MAX310X_CLKSRC_REG, &val); | |
| 1104 | + if (val != (MAX310X_CLKSRC_EXTCLK_BIT | | |
| 1105 | + MAX310X_CLKSRC_PLLBYP_BIT)) { | |
| 1106 | + dev_err(dev, "%s not present\n", s->name); | |
| 1107 | + ret = -ENODEV; | |
| 1108 | + goto err_out; | |
| 1109 | + } | |
| 1110 | + break; | |
| 1111 | + } | |
| 1112 | + | |
| 1113 | + /* Board specific configure */ | |
| 1114 | + if (pdata->init) | |
| 1115 | + pdata->init(); | |
| 1116 | + if (pdata->suspend) | |
| 1117 | + pdata->suspend(0); | |
| 1118 | + | |
| 1119 | + /* Calculate referecne clock */ | |
| 1120 | + s->uartclk = max310x_set_ref_clk(s); | |
| 1121 | + | |
| 1122 | + /* Disable all interrupts */ | |
| 1123 | + regmap_write(s->regmap, MAX310X_IRQEN_REG, 0); | |
| 1124 | + | |
| 1125 | + /* Setup MODE1 register */ | |
| 1126 | + val = MAX310X_MODE1_IRQSEL_BIT; /* Enable IRQ pin */ | |
| 1127 | + if (pdata->driver_flags & MAX310X_AUTOSLEEP) | |
| 1128 | + val = MAX310X_MODE1_AUTOSLEEP_BIT; | |
| 1129 | + regmap_write(s->regmap, MAX310X_MODE1_REG, val); | |
| 1130 | + | |
| 1131 | + /* Setup interrupt */ | |
| 1132 | + ret = devm_request_threaded_irq(dev, spi->irq, NULL, max310x_ist, | |
| 1133 | + IRQF_TRIGGER_FALLING | IRQF_ONESHOT, | |
| 1134 | + dev_name(dev), s); | |
| 1135 | + if (ret) { | |
| 1136 | + dev_err(dev, "Unable to reguest IRQ %i\n", spi->irq); | |
| 1137 | + goto err_out; | |
| 1138 | + } | |
| 1139 | + | |
| 1140 | + /* Register UART driver */ | |
| 1141 | + s->uart.owner = THIS_MODULE; | |
| 1142 | + s->uart.driver_name = dev_name(dev); | |
| 1143 | + s->uart.dev_name = "ttyMAX"; | |
| 1144 | + s->uart.major = MAX310X_MAJOR; | |
| 1145 | + s->uart.minor = MAX310X_MINOR; | |
| 1146 | + ret = uart_register_driver(&s->uart); | |
| 1147 | + if (ret) { | |
| 1148 | + dev_err(dev, "Registering UART driver failed\n"); | |
| 1149 | + goto err_out; | |
| 1150 | + } | |
| 1151 | + | |
| 1152 | + /* Initialize workqueue for start TX */ | |
| 1153 | + s->wq = create_freezable_workqueue(dev_name(dev)); | |
| 1154 | + INIT_WORK(&s->tx_work, max310x_wq_proc); | |
| 1155 | + | |
| 1156 | + /* Initialize UART port data */ | |
| 1157 | + s->port.line = 0; | |
| 1158 | + s->port.dev = dev; | |
| 1159 | + s->port.irq = spi->irq; | |
| 1160 | + s->port.type = PORT_MAX310X; | |
| 1161 | + s->port.fifosize = MAX310X_FIFO_SIZE; | |
| 1162 | + s->port.flags = UPF_SKIP_TEST | UPF_FIXED_TYPE; | |
| 1163 | + s->port.iotype = UPIO_PORT; | |
| 1164 | + s->port.membase = (void __iomem *)0xffffffff; /* Bogus value */ | |
| 1165 | + s->port.uartclk = s->uartclk; | |
| 1166 | + s->port.ops = &max310x_ops; | |
| 1167 | + uart_add_one_port(&s->uart, &s->port); | |
| 1168 | + | |
| 1169 | +#ifdef CONFIG_GPIOLIB | |
| 1170 | + /* Setup GPIO cotroller */ | |
| 1171 | + if (pdata->gpio_base) { | |
| 1172 | + s->gpio.owner = THIS_MODULE; | |
| 1173 | + s->gpio.dev = dev; | |
| 1174 | + s->gpio.label = dev_name(dev); | |
| 1175 | + s->gpio.direction_input = max310x_gpio_direction_input; | |
| 1176 | + s->gpio.get = max310x_gpio_get; | |
| 1177 | + s->gpio.direction_output= max310x_gpio_direction_output; | |
| 1178 | + s->gpio.set = max310x_gpio_set; | |
| 1179 | + s->gpio.base = pdata->gpio_base; | |
| 1180 | + s->gpio.ngpio = s->nr_gpio; | |
| 1181 | + if (gpiochip_add(&s->gpio)) { | |
| 1182 | + /* Indicate that we should not call gpiochip_remove */ | |
| 1183 | + s->gpio.base = 0; | |
| 1184 | + } | |
| 1185 | + } else | |
| 1186 | + dev_info(dev, "GPIO support not enabled\n"); | |
| 1187 | +#endif | |
| 1188 | + | |
| 1189 | + /* Go to suspend mode */ | |
| 1190 | + if (pdata->suspend) | |
| 1191 | + pdata->suspend(1); | |
| 1192 | + | |
| 1193 | + return 0; | |
| 1194 | + | |
| 1195 | +err_freq: | |
| 1196 | + dev_err(dev, "Frequency parameter incorrect\n"); | |
| 1197 | + ret = -EINVAL; | |
| 1198 | + | |
| 1199 | +err_out: | |
| 1200 | + dev_set_drvdata(dev, NULL); | |
| 1201 | + | |
| 1202 | + return ret; | |
| 1203 | +} | |
| 1204 | + | |
| 1205 | +static int __devexit max310x_remove(struct spi_device *spi) | |
| 1206 | +{ | |
| 1207 | + struct device *dev = &spi->dev; | |
| 1208 | + struct max310x_port *s = dev_get_drvdata(dev); | |
| 1209 | + int ret = 0; | |
| 1210 | + | |
| 1211 | + dev_dbg(dev, "Removing port\n"); | |
| 1212 | + | |
| 1213 | + devm_free_irq(dev, s->port.irq, s); | |
| 1214 | + | |
| 1215 | + destroy_workqueue(s->wq); | |
| 1216 | + | |
| 1217 | + uart_remove_one_port(&s->uart, &s->port); | |
| 1218 | + | |
| 1219 | + uart_unregister_driver(&s->uart); | |
| 1220 | + | |
| 1221 | +#ifdef CONFIG_GPIOLIB | |
| 1222 | + if (s->pdata->gpio_base) { | |
| 1223 | + ret = gpiochip_remove(&s->gpio); | |
| 1224 | + if (ret) | |
| 1225 | + dev_err(dev, "Failed to remove gpio chip: %d\n", ret); | |
| 1226 | + } | |
| 1227 | +#endif | |
| 1228 | + | |
| 1229 | + dev_set_drvdata(dev, NULL); | |
| 1230 | + | |
| 1231 | + if (s->pdata->suspend) | |
| 1232 | + s->pdata->suspend(1); | |
| 1233 | + if (s->pdata->exit) | |
| 1234 | + s->pdata->exit(); | |
| 1235 | + | |
| 1236 | + return ret; | |
| 1237 | +} | |
| 1238 | + | |
| 1239 | +static const struct spi_device_id max310x_id_table[] = { | |
| 1240 | + { "max3107", MAX310X_TYPE_MAX3107 }, | |
| 1241 | + { "max3108", MAX310X_TYPE_MAX3108 }, | |
| 1242 | +}; | |
| 1243 | +MODULE_DEVICE_TABLE(spi, max310x_id_table); | |
| 1244 | + | |
| 1245 | +static struct spi_driver max310x_driver = { | |
| 1246 | + .driver = { | |
| 1247 | + .name = "max310x", | |
| 1248 | + .owner = THIS_MODULE, | |
| 1249 | + }, | |
| 1250 | + .probe = max310x_probe, | |
| 1251 | + .remove = __devexit_p(max310x_remove), | |
| 1252 | + .suspend = max310x_suspend, | |
| 1253 | + .resume = max310x_resume, | |
| 1254 | + .id_table = max310x_id_table, | |
| 1255 | +}; | |
| 1256 | +module_spi_driver(max310x_driver); | |
| 1257 | + | |
| 1258 | +MODULE_LICENSE("GPL v2"); | |
| 1259 | +MODULE_AUTHOR("Alexander Shiyan <shc_work@mail.ru>"); | |
| 1260 | +MODULE_DESCRIPTION("MAX310X serial driver"); | |
| @@ -775,11 +775,15 @@ mpc52xx_uart_set_termios(struct uart_port *port, struct ktermios *new, · 774 unmodified lines | ||
| 775 | 775 | } |
| 776 | 776 | |
| 777 | 777 | if (new->c_cflag & PARENB) { |
| 778 | + if (new->c_cflag & CMSPAR) | |
| 779 | + mr1 |= MPC52xx_PSC_MODE_PARFORCE; | |
| 780 | + | |
| 781 | + /* With CMSPAR, PARODD also means high parity (same as termios) */ | |
| 778 | 782 | mr1 |= (new->c_cflag & PARODD) ? |
| 779 | 783 | MPC52xx_PSC_MODE_PARODD : MPC52xx_PSC_MODE_PAREVEN; |
| 780 | − } else | |
| 784 | + } else { | |
| 781 | 785 | mr1 |= MPC52xx_PSC_MODE_PARNONE; |
| 782 | − | |
| 786 | + } | |
| 783 | 787 | |
| 784 | 788 | mr2 = 0; |
| 785 | 789 | |
| @@ -896,7 +896,7 @@ static int __init msm_serial_probe(struct platform_device *pdev) · 895 unmodified lines | ||
| 896 | 896 | return PTR_ERR(msm_port->clk); |
| 897 | 897 | |
| 898 | 898 | if (msm_port->is_uartdm) |
| 899 | − clk_set_rate(msm_port->clk, 7372800); | |
| 899 | + clk_set_rate(msm_port->clk, 1843200); | |
| 900 | 900 | |
| 901 | 901 | port->uartclk = clk_get_rate(msm_port->clk); |
| 902 | 902 | printk(KERN_INFO "uartclk = %d\n", port->uartclk); |
| @@ -223,9 +223,11 @@ static int __init smd_tty_init(void) · 222 unmodified lines | ||
| 223 | 223 | return ret; |
| 224 | 224 | |
| 225 | 225 | for (i = 0; i < smd_tty_channels_len; i++) { |
| 226 | − tty_port_init(&smd_tty[smd_tty_channels[i].id].port); | |
| 227 | − smd_tty[smd_tty_channels[i].id].port.ops = &smd_tty_port_ops; | |
| 228 | − tty_register_device(smd_tty_driver, smd_tty_channels[i].id, 0); | |
| 226 | + struct tty_port *port = &smd_tty[smd_tty_channels[i].id].port; | |
| 227 | + tty_port_init(port); | |
| 228 | + port->ops = &smd_tty_port_ops; | |
| 229 | + tty_port_register_device(port, smd_tty_driver, | |
| 230 | + smd_tty_channels[i].id, NULL); | |
| 229 | 231 | } |
| 230 | 232 | |
| 231 | 233 | return 0; |
| @@ -262,7 +262,7 @@ static void mxs_auart_set_mctrl(struct uart_port *u, unsigned mctrl) · 261 unmodified lines | ||
| 262 | 262 | |
| 263 | 263 | ctrl &= ~AUART_CTRL2_RTSEN; |
| 264 | 264 | if (mctrl & TIOCM_RTS) { |
| 265 | − if (u->state->port.flags & ASYNC_CTS_FLOW) | |
| 265 | + if (tty_port_cts_enabled(&u->state->port)) | |
| 266 | 266 | ctrl |= AUART_CTRL2_RTSEN; |
| 267 | 267 | } |
| 268 | 268 | |
| @@ -457,11 +457,11 @@ static void mxs_auart_shutdown(struct uart_port *u) · 188 unmodified lines | ||
| 457 | 457 | |
| 458 | 458 | writel(AUART_CTRL2_UARTEN, u->membase + AUART_CTRL2_CLR); |
| 459 | 459 | |
| 460 | − writel(AUART_CTRL0_CLKGATE, u->membase + AUART_CTRL0_SET); | |
| 461 | − | |
| 462 | 460 | writel(AUART_INTR_RXIEN | AUART_INTR_RTIEN | AUART_INTR_CTSMIEN, |
| 463 | 461 | u->membase + AUART_INTR_CLR); |
| 464 | 462 | |
| 463 | + writel(AUART_CTRL0_CLKGATE, u->membase + AUART_CTRL0_SET); | |
| 464 | + | |
| 465 | 465 | clk_disable_unprepare(s->clk); |
| 466 | 466 | } |
| 467 | 467 | |
| @@ -796,6 +796,7 @@ static int __devexit mxs_auart_remove(struct platform_device *pdev) · 328 unmodified lines | ||
| 796 | 796 | |
| 797 | 797 | auart_port[pdev->id] = NULL; |
| 798 | 798 | |
| 799 | + put_device(s->dev); | |
| 799 | 800 | clk_put(s->clk); |
| 800 | 801 | free_irq(s->irq, s); |
| 801 | 802 | kfree(s); |
| @@ -105,6 +105,10 @@ static int __devinit of_platform_serial_setup(struct platform_device *ofdev, · 104 unmodified lines | ||
| 105 | 105 | port->uartclk = clk; |
| 106 | 106 | port->flags = UPF_SHARE_IRQ | UPF_BOOT_AUTOCONF | UPF_IOREMAP |
| 107 | 107 | | UPF_FIXED_PORT | UPF_FIXED_TYPE; |
| 108 | + | |
| 109 | + if (of_find_property(np, "no-loopback-test", NULL)) | |
| 110 | + port->flags |= UPF_SKIP_TEST; | |
| 111 | + | |
| 108 | 112 | port->dev = &ofdev->dev; |
| 109 | 113 | |
| 110 | 114 | if (type == PORT_TEGRA) |
| @@ -144,8 +148,15 @@ static int __devinit of_platform_serial_probe(struct platform_device *ofdev) · 33 unmodified lines | ||
| 144 | 148 | switch (port_type) { |
| 145 | 149 | #ifdef CONFIG_SERIAL_8250 |
| 146 | 150 | case PORT_8250 ... PORT_MAX_8250: |
| 147 | − ret = serial8250_register_port(&port); | |
| 151 | + { | |
| 152 | + /* For now the of bindings don't support the extra | |
| 153 | + 8250 specific bits */ | |
| 154 | + struct uart_8250_port port8250; | |
| 155 | + memset(&port8250, 0, sizeof(port8250)); | |
| 156 | + port8250.port = port; | |
| 157 | + ret = serial8250_register_8250_port(&port8250); | |
| 148 | 158 | break; |
| 159 | + } | |
| 149 | 160 | #endif |
| 150 | 161 | #ifdef CONFIG_SERIAL_OF_PLATFORM_NWPSERIAL |
| 151 | 162 | case PORT_NWPSERIAL: |
| @@ -32,16 +32,16 @@ · 31 unmodified lines | ||
| 32 | 32 | #include <linux/slab.h> |
| 33 | 33 | #include <linux/tty.h> |
| 34 | 34 | #include <linux/tty_flip.h> |
| 35 | +#include <linux/platform_device.h> | |
| 35 | 36 | #include <linux/io.h> |
| 36 | −#include <linux/dma-mapping.h> | |
| 37 | 37 | #include <linux/clk.h> |
| 38 | 38 | #include <linux/serial_core.h> |
| 39 | 39 | #include <linux/irq.h> |
| 40 | 40 | #include <linux/pm_runtime.h> |
| 41 | 41 | #include <linux/of.h> |
| 42 | +#include <linux/gpio.h> | |
| 43 | +#include <linux/pinctrl/consumer.h> | |
| 42 | 44 | |
| 43 | −#include <plat/dma.h> | |
| 44 | −#include <plat/dmtimer.h> | |
| 45 | 45 | #include <plat/omap-serial.h> |
| 46 | 46 | |
| 47 | 47 | #define UART_BUILD_REVISION(x, y) (((x) << 8) | (y)) |
| @@ -57,8 +57,8 @@ · 9 unmodified lines | ||
| 57 | 57 | #define OMAP_UART_SCR_RX_TRIG_GRANU1_MASK (1 << 7) |
| 58 | 58 | |
| 59 | 59 | /* FCR register bitmasks */ |
| 60 | −#define OMAP_UART_FCR_RX_FIFO_TRIG_SHIFT 6 | |
| 61 | 60 | #define OMAP_UART_FCR_RX_FIFO_TRIG_MASK (0x3 << 6) |
| 61 | +#define OMAP_UART_FCR_TX_FIFO_TRIG_MASK (0x3 << 4) | |
| 62 | 62 | |
| 63 | 63 | /* MVR register bitmasks */ |
| 64 | 64 | #define OMAP_UART_MVR_SCHEME_SHIFT 30 |
| @@ -71,12 +71,52 @@ · 6 unmodified lines | ||
| 71 | 71 | #define OMAP_UART_MVR_MAJ_SHIFT 8 |
| 72 | 72 | #define OMAP_UART_MVR_MIN_MASK 0x3f |
| 73 | 73 | |
| 74 | +struct uart_omap_port { | |
| 75 | + struct uart_port port; | |
| 76 | + struct uart_omap_dma uart_dma; | |
| 77 | + struct device *dev; | |
| 78 | + | |
| 79 | + unsigned char ier; | |
| 80 | + unsigned char lcr; | |
| 81 | + unsigned char mcr; | |
| 82 | + unsigned char fcr; | |
| 83 | + unsigned char efr; | |
| 84 | + unsigned char dll; | |
| 85 | + unsigned char dlh; | |
| 86 | + unsigned char mdr1; | |
| 87 | + unsigned char scr; | |
| 88 | + | |
| 89 | + int use_dma; | |
| 90 | + /* | |
| 91 | + * Some bits in registers are cleared on a read, so they must | |
| 92 | + * be saved whenever the register is read but the bits will not | |
| 93 | + * be immediately processed. | |
| 94 | + */ | |
| 95 | + unsigned int lsr_break_flag; | |
| 96 | + unsigned char msr_saved_flags; | |
| 97 | + char name[20]; | |
| 98 | + unsigned long port_activity; | |
| 99 | + u32 context_loss_cnt; | |
| 100 | + u32 errata; | |
| 101 | + u8 wakeups_enabled; | |
| 102 | + unsigned int irq_pending:1; | |
| 103 | + | |
| 104 | + int DTR_gpio; | |
| 105 | + int DTR_inverted; | |
| 106 | + int DTR_active; | |
| 107 | + | |
| 108 | + struct pm_qos_request pm_qos_request; | |
| 109 | + u32 latency; | |
| 110 | + u32 calc_latency; | |
| 111 | + struct work_struct qos_work; | |
| 112 | + struct pinctrl *pins; | |
| 113 | +}; | |
| 114 | + | |
| 115 | +#define to_uart_omap_port(p) ((container_of((p), struct uart_omap_port, port))) | |
| 116 | + | |
| 74 | 117 | static struct uart_omap_port *ui[OMAP_MAX_HSUART_PORTS]; |
| 75 | 118 | |
| 76 | 119 | /* Forward declaration of functions */ |
| 77 | −static void uart_tx_dma_callback(int lch, u16 ch_status, void *data); | |
| 78 | −static void serial_omap_rxdma_poll(unsigned long uart_no); | |
| 79 | −static int serial_omap_start_rxdma(struct uart_omap_port *up); | |
| 80 | 120 | static void serial_omap_mdr1_errataset(struct uart_omap_port *up, u8 mdr1); |
| 81 | 121 | |
| 82 | 122 | static struct workqueue_struct *serial_omap_uart_wq; |
| @@ -101,6 +141,46 @@ static inline void serial_omap_clear_fifos(struct uart_omap_port *up) · 18 unmodified lines | ||
| 101 | 141 | serial_out(up, UART_FCR, 0); |
| 102 | 142 | } |
| 103 | 143 | |
| 144 | +static int serial_omap_get_context_loss_count(struct uart_omap_port *up) | |
| 145 | +{ | |
| 146 | + struct omap_uart_port_info *pdata = up->dev->platform_data; | |
| 147 | + | |
| 148 | + if (!pdata || !pdata->get_context_loss_count) | |
| 149 | + return 0; | |
| 150 | + | |
| 151 | + return pdata->get_context_loss_count(up->dev); | |
| 152 | +} | |
| 153 | + | |
| 154 | +static void serial_omap_set_forceidle(struct uart_omap_port *up) | |
| 155 | +{ | |
| 156 | + struct omap_uart_port_info *pdata = up->dev->platform_data; | |
| 157 | + | |
| 158 | + if (!pdata || !pdata->set_forceidle) | |
| 159 | + return; | |
| 160 | + | |
| 161 | + pdata->set_forceidle(up->dev); | |
| 162 | +} | |
| 163 | + | |
| 164 | +static void serial_omap_set_noidle(struct uart_omap_port *up) | |
| 165 | +{ | |
| 166 | + struct omap_uart_port_info *pdata = up->dev->platform_data; | |
| 167 | + | |
| 168 | + if (!pdata || !pdata->set_noidle) | |
| 169 | + return; | |
| 170 | + | |
| 171 | + pdata->set_noidle(up->dev); | |
| 172 | +} | |
| 173 | + | |
| 174 | +static void serial_omap_enable_wakeup(struct uart_omap_port *up, bool enable) | |
| 175 | +{ | |
| 176 | + struct omap_uart_port_info *pdata = up->dev->platform_data; | |
| 177 | + | |
| 178 | + if (!pdata || !pdata->enable_wakeup) | |
| 179 | + return; | |
| 180 | + | |
| 181 | + pdata->enable_wakeup(up->dev, enable); | |
| 182 | +} | |
| 183 | + | |
| 104 | 184 | /* |
| 105 | 185 | * serial_omap_get_divisor - calculate divisor value |
| 106 | 186 | * @port: uart port info |
| @@ -126,151 +206,55 @@ serial_omap_get_divisor(struct uart_port *port, unsigned int baud) · 19 unmodified lines | ||
| 126 | 206 | return port->uartclk/(baud * divisor); |
| 127 | 207 | } |
| 128 | 208 | |
| 129 | −static void serial_omap_stop_rxdma(struct uart_omap_port *up) | |
| 130 | −{ | |
| 131 | − if (up->uart_dma.rx_dma_used) { | |
| 132 | − del_timer(&up->uart_dma.rx_timer); | |
| 133 | − omap_stop_dma(up->uart_dma.rx_dma_channel); | |
| 134 | − omap_free_dma(up->uart_dma.rx_dma_channel); | |
| 135 | − up->uart_dma.rx_dma_channel = OMAP_UART_DMA_CH_FREE; | |
| 136 | − up->uart_dma.rx_dma_used = false; | |
| 137 | − pm_runtime_mark_last_busy(&up->pdev->dev); | |
| 138 | − pm_runtime_put_autosuspend(&up->pdev->dev); | |
| 139 | − } | |
| 140 | −} | |
| 141 | − | |
| 142 | 209 | static void serial_omap_enable_ms(struct uart_port *port) |
| 143 | 210 | { |
| 144 | − struct uart_omap_port *up = (struct uart_omap_port *)port; | |
| 211 | + struct uart_omap_port *up = to_uart_omap_port(port); | |
| 145 | 212 | |
| 146 | 213 | dev_dbg(up->port.dev, "serial_omap_enable_ms+%d\n", up->port.line); |
| 147 | 214 | |
| 148 | − pm_runtime_get_sync(&up->pdev->dev); | |
| 215 | + pm_runtime_get_sync(up->dev); | |
| 149 | 216 | up->ier |= UART_IER_MSI; |
| 150 | 217 | serial_out(up, UART_IER, up->ier); |
| 151 | − pm_runtime_put(&up->pdev->dev); | |
| 218 | + pm_runtime_mark_last_busy(up->dev); | |
| 219 | + pm_runtime_put_autosuspend(up->dev); | |
| 152 | 220 | } |
| 153 | 221 | |
| 154 | 222 | static void serial_omap_stop_tx(struct uart_port *port) |
| 155 | 223 | { |
| 156 | − struct uart_omap_port *up = (struct uart_omap_port *)port; | |
| 157 | − struct omap_uart_port_info *pdata = up->pdev->dev.platform_data; | |
| 224 | + struct uart_omap_port *up = to_uart_omap_port(port); | |
| 158 | 225 | |
| 159 | − if (up->use_dma && | |
| 160 | − up->uart_dma.tx_dma_channel != OMAP_UART_DMA_CH_FREE) { | |
| 161 | − /* | |
| 162 | − * Check if dma is still active. If yes do nothing, | |
| 163 | − * return. Else stop dma | |
| 164 | − */ | |
| 165 | − if (omap_get_dma_active_status(up->uart_dma.tx_dma_channel)) | |
| 166 | − return; | |
| 167 | − omap_stop_dma(up->uart_dma.tx_dma_channel); | |
| 168 | − omap_free_dma(up->uart_dma.tx_dma_channel); | |
| 169 | − up->uart_dma.tx_dma_channel = OMAP_UART_DMA_CH_FREE; | |
| 170 | − pm_runtime_mark_last_busy(&up->pdev->dev); | |
| 171 | − pm_runtime_put_autosuspend(&up->pdev->dev); | |
| 172 | − } | |
| 173 | − | |
| 174 | − pm_runtime_get_sync(&up->pdev->dev); | |
| 226 | + pm_runtime_get_sync(up->dev); | |
| 175 | 227 | if (up->ier & UART_IER_THRI) { |
| 176 | 228 | up->ier &= ~UART_IER_THRI; |
| 177 | 229 | serial_out(up, UART_IER, up->ier); |
| 178 | 230 | } |
| 179 | 231 | |
| 180 | − if (!up->use_dma && pdata && pdata->set_forceidle) | |
| 181 | − pdata->set_forceidle(up->pdev); | |
| 232 | + serial_omap_set_forceidle(up); | |
| 182 | 233 | |
| 183 | − pm_runtime_mark_last_busy(&up->pdev->dev); | |
| 184 | − pm_runtime_put_autosuspend(&up->pdev->dev); | |
| 234 | + pm_runtime_mark_last_busy(up->dev); | |
| 235 | + pm_runtime_put_autosuspend(up->dev); | |
| 185 | 236 | } |
| 186 | 237 | |
| 187 | 238 | static void serial_omap_stop_rx(struct uart_port *port) |
| 188 | 239 | { |
| 189 | − struct uart_omap_port *up = (struct uart_omap_port *)port; | |
| 240 | + struct uart_omap_port *up = to_uart_omap_port(port); | |
| 190 | 241 | |
| 191 | − pm_runtime_get_sync(&up->pdev->dev); | |
| 192 | − if (up->use_dma) | |
| 193 | − serial_omap_stop_rxdma(up); | |
| 242 | + pm_runtime_get_sync(up->dev); | |
| 194 | 243 | up->ier &= ~UART_IER_RLSI; |
| 195 | 244 | up->port.read_status_mask &= ~UART_LSR_DR; |
| 196 | 245 | serial_out(up, UART_IER, up->ier); |
| 197 | − pm_runtime_mark_last_busy(&up->pdev->dev); | |
| 198 | − pm_runtime_put_autosuspend(&up->pdev->dev); | |
| 199 | −} | |
| 200 | − | |
| 201 | −static inline void receive_chars(struct uart_omap_port *up, | |
| 202 | − unsigned int *status) | |
| 203 | −{ | |
| 204 | − struct tty_struct *tty = up->port.state->port.tty; | |
| 205 | − unsigned int flag, lsr = *status; | |
| 206 | − unsigned char ch = 0; | |
| 207 | − int max_count = 256; | |
| 208 | − | |
| 209 | − do { | |
| 210 | − if (likely(lsr & UART_LSR_DR)) | |
| 211 | − ch = serial_in(up, UART_RX); | |
| 212 | − flag = TTY_NORMAL; | |
| 213 | − up->port.icount.rx++; | |
| 214 | − | |
| 215 | − if (unlikely(lsr & UART_LSR_BRK_ERROR_BITS)) { | |
| 216 | − /* | |
| 217 | − * For statistics only | |
| 218 | − */ | |
| 219 | − if (lsr & UART_LSR_BI) { | |
| 220 | − lsr &= ~(UART_LSR_FE | UART_LSR_PE); | |
| 221 | − up->port.icount.brk++; | |
| 222 | − /* | |
| 223 | − * We do the SysRQ and SAK checking | |
| 224 | − * here because otherwise the break | |
| 225 | − * may get masked by ignore_status_mask | |
| 226 | − * or read_status_mask. | |
| 227 | − */ | |
| 228 | − if (uart_handle_break(&up->port)) | |
| 229 | − goto ignore_char; | |
| 230 | − } else if (lsr & UART_LSR_PE) { | |
| 231 | − up->port.icount.parity++; | |
| 232 | − } else if (lsr & UART_LSR_FE) { | |
| 233 | − up->port.icount.frame++; | |
| 234 | − } | |
| 235 | − | |
| 236 | − if (lsr & UART_LSR_OE) | |
| 237 | − up->port.icount.overrun++; | |
| 238 | − | |
| 239 | − /* | |
| 240 | − * Mask off conditions which should be ignored. | |
| 241 | − */ | |
| 242 | − lsr &= up->port.read_status_mask; | |
| 243 | − | |
| 244 | −#ifdef CONFIG_SERIAL_OMAP_CONSOLE | |
| 245 | − if (up->port.line == up->port.cons->index) { | |
| 246 | − /* Recover the break flag from console xmit */ | |
| 247 | − lsr |= up->lsr_break_flag; | |
| 248 | − } | |
| 249 | −#endif | |
| 250 | − if (lsr & UART_LSR_BI) | |
| 251 | − flag = TTY_BREAK; | |
| 252 | − else if (lsr & UART_LSR_PE) | |
| 253 | − flag = TTY_PARITY; | |
| 254 | − else if (lsr & UART_LSR_FE) | |
| 255 | − flag = TTY_FRAME; | |
| 256 | − } | |
| 257 | − | |
| 258 | − if (uart_handle_sysrq_char(&up->port, ch)) | |
| 259 | − goto ignore_char; | |
| 260 | − uart_insert_char(&up->port, lsr, UART_LSR_OE, ch, flag); | |
| 261 | −ignore_char: | |
| 262 | − lsr = serial_in(up, UART_LSR); | |
| 263 | − } while ((lsr & (UART_LSR_DR | UART_LSR_BI)) && (max_count-- > 0)); | |
| 264 | − spin_unlock(&up->port.lock); | |
| 265 | − tty_flip_buffer_push(tty); | |
| 266 | − spin_lock(&up->port.lock); | |
| 246 | + pm_runtime_mark_last_busy(up->dev); | |
| 247 | + pm_runtime_put_autosuspend(up->dev); | |
| 267 | 248 | } |
| 268 | 249 | |
| 269 | −static void transmit_chars(struct uart_omap_port *up) | |
| 250 | +static void transmit_chars(struct uart_omap_port *up, unsigned int lsr) | |
| 270 | 251 | { |
| 271 | 252 | struct circ_buf *xmit = &up->port.state->xmit; |
| 272 | 253 | int count; |
| 273 | 254 | |
| 255 | + if (!(lsr & UART_LSR_THRE)) | |
| 256 | + return; | |
| 257 | + | |
| 274 | 258 | if (up->port.x_char) { |
| 275 | 259 | serial_out(up, UART_TX, up->port.x_char); |
| 276 | 260 | up->port.icount.tx++; |
| @@ -290,8 +274,11 @@ static void transmit_chars(struct uart_omap_port *up) · 13 unmodified lines | ||
| 290 | 274 | break; |
| 291 | 275 | } while (--count > 0); |
| 292 | 276 | |
| 293 | − if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) | |
| 277 | + if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) { | |
| 278 | + spin_unlock(&up->port.lock); | |
| 294 | 279 | uart_write_wakeup(&up->port); |
| 280 | + spin_lock(&up->port.lock); | |
| 281 | + } | |
| 295 | 282 | |
| 296 | 283 | if (uart_circ_empty(xmit)) |
| 297 | 284 | serial_omap_stop_tx(&up->port); |
| @@ -307,70 +294,13 @@ static inline void serial_omap_enable_ier_thri(struct uart_omap_port *up) · 9 unmodified lines | ||
| 307 | 294 | |
| 308 | 295 | static void serial_omap_start_tx(struct uart_port *port) |
| 309 | 296 | { |
| 310 | − struct uart_omap_port *up = (struct uart_omap_port *)port; | |
| 311 | − struct omap_uart_port_info *pdata = up->pdev->dev.platform_data; | |
| 312 | − struct circ_buf *xmit; | |
| 313 | − unsigned int start; | |
| 314 | − int ret = 0; | |
| 315 | − | |
| 316 | − if (!up->use_dma) { | |
| 317 | − pm_runtime_get_sync(&up->pdev->dev); | |
| 318 | − serial_omap_enable_ier_thri(up); | |
| 319 | − if (pdata && pdata->set_noidle) | |
| 320 | − pdata->set_noidle(up->pdev); | |
| 321 | − pm_runtime_mark_last_busy(&up->pdev->dev); | |
| 322 | − pm_runtime_put_autosuspend(&up->pdev->dev); | |
| 323 | − return; | |
| 324 | − } | |
| 325 | − | |
| 326 | − if (up->uart_dma.tx_dma_used) | |
| 327 | − return; | |
| 328 | − | |
| 329 | − xmit = &up->port.state->xmit; | |
| 330 | − | |
| 331 | − if (up->uart_dma.tx_dma_channel == OMAP_UART_DMA_CH_FREE) { | |
| 332 | − pm_runtime_get_sync(&up->pdev->dev); | |
| 333 | − ret = omap_request_dma(up->uart_dma.uart_dma_tx, | |
| 334 | − "UART Tx DMA", | |
| 335 | − (void *)uart_tx_dma_callback, up, | |
| 336 | − &(up->uart_dma.tx_dma_channel)); | |
| 297 | + struct uart_omap_port *up = to_uart_omap_port(port); | |
| 337 | 298 | |
| 338 | − if (ret < 0) { | |
| 339 | − serial_omap_enable_ier_thri(up); | |
| 340 | − return; | |
| 341 | − } | |
| 342 | − } | |
| 343 | − spin_lock(&(up->uart_dma.tx_lock)); | |
| 344 | − up->uart_dma.tx_dma_used = true; | |
| 345 | − spin_unlock(&(up->uart_dma.tx_lock)); | |
| 346 | − | |
| 347 | − start = up->uart_dma.tx_buf_dma_phys + | |
| 348 | − (xmit->tail & (UART_XMIT_SIZE - 1)); | |
| 349 | − | |
| 350 | − up->uart_dma.tx_buf_size = uart_circ_chars_pending(xmit); | |
| 351 | − /* | |
| 352 | − * It is a circular buffer. See if the buffer has wounded back. | |
| 353 | − * If yes it will have to be transferred in two separate dma | |
| 354 | − * transfers | |
| 355 | − */ | |
| 356 | − if (start + up->uart_dma.tx_buf_size >= | |
| 357 | − up->uart_dma.tx_buf_dma_phys + UART_XMIT_SIZE) | |
| 358 | − up->uart_dma.tx_buf_size = | |
| 359 | − (up->uart_dma.tx_buf_dma_phys + | |
| 360 | − UART_XMIT_SIZE) - start; | |
| 361 | − | |
| 362 | − omap_set_dma_dest_params(up->uart_dma.tx_dma_channel, 0, | |
| 363 | − OMAP_DMA_AMODE_CONSTANT, | |
| 364 | − up->uart_dma.uart_base, 0, 0); | |
| 365 | − omap_set_dma_src_params(up->uart_dma.tx_dma_channel, 0, | |
| 366 | − OMAP_DMA_AMODE_POST_INC, start, 0, 0); | |
| 367 | − omap_set_dma_transfer_params(up->uart_dma.tx_dma_channel, | |
| 368 | − OMAP_DMA_DATA_TYPE_S8, | |
| 369 | − up->uart_dma.tx_buf_size, 1, | |
| 370 | − OMAP_DMA_SYNC_ELEMENT, | |
| 371 | − up->uart_dma.uart_dma_tx, 0); | |
| 372 | − /* FIXME: Cache maintenance needed here? */ | |
| 373 | − omap_start_dma(up->uart_dma.tx_dma_channel); | |
| 299 | + pm_runtime_get_sync(up->dev); | |
| 300 | + serial_omap_enable_ier_thri(up); | |
| 301 | + serial_omap_set_noidle(up); | |
| 302 | + pm_runtime_mark_last_busy(up->dev); | |
| 303 | + pm_runtime_put_autosuspend(up->dev); | |
| 374 | 304 | } |
| 375 | 305 | |
| 376 | 306 | static unsigned int check_modem_status(struct uart_omap_port *up) |
| @@ -401,76 +331,158 @@ static unsigned int check_modem_status(struct uart_omap_port *up) · 24 unmodified lines | ||
| 401 | 331 | return status; |
| 402 | 332 | } |
| 403 | 333 | |
| 334 | +static void serial_omap_rlsi(struct uart_omap_port *up, unsigned int lsr) | |
| 335 | +{ | |
| 336 | + unsigned int flag; | |
| 337 | + | |
| 338 | + up->port.icount.rx++; | |
| 339 | + flag = TTY_NORMAL; | |
| 340 | + | |
| 341 | + if (lsr & UART_LSR_BI) { | |
| 342 | + flag = TTY_BREAK; | |
| 343 | + lsr &= ~(UART_LSR_FE | UART_LSR_PE); | |
| 344 | + up->port.icount.brk++; | |
| 345 | + /* | |
| 346 | + * We do the SysRQ and SAK checking | |
| 347 | + * here because otherwise the break | |
| 348 | + * may get masked by ignore_status_mask | |
| 349 | + * or read_status_mask. | |
| 350 | + */ | |
| 351 | + if (uart_handle_break(&up->port)) | |
| 352 | + return; | |
| 353 | + | |
| 354 | + } | |
| 355 | + | |
| 356 | + if (lsr & UART_LSR_PE) { | |
| 357 | + flag = TTY_PARITY; | |
| 358 | + up->port.icount.parity++; | |
| 359 | + } | |
| 360 | + | |
| 361 | + if (lsr & UART_LSR_FE) { | |
| 362 | + flag = TTY_FRAME; | |
| 363 | + up->port.icount.frame++; | |
| 364 | + } | |
| 365 | + | |
| 366 | + if (lsr & UART_LSR_OE) | |
| 367 | + up->port.icount.overrun++; | |
| 368 | + | |
| 369 | +#ifdef CONFIG_SERIAL_OMAP_CONSOLE | |
| 370 | + if (up->port.line == up->port.cons->index) { | |
| 371 | + /* Recover the break flag from console xmit */ | |
| 372 | + lsr |= up->lsr_break_flag; | |
| 373 | + } | |
| 374 | +#endif | |
| 375 | + uart_insert_char(&up->port, lsr, UART_LSR_OE, 0, flag); | |
| 376 | +} | |
| 377 | + | |
| 378 | +static void serial_omap_rdi(struct uart_omap_port *up, unsigned int lsr) | |
| 379 | +{ | |
| 380 | + unsigned char ch = 0; | |
| 381 | + unsigned int flag; | |
| 382 | + | |
| 383 | + if (!(lsr & UART_LSR_DR)) | |
| 384 | + return; | |
| 385 | + | |
| 386 | + ch = serial_in(up, UART_RX); | |
| 387 | + flag = TTY_NORMAL; | |
| 388 | + up->port.icount.rx++; | |
| 389 | + | |
| 390 | + if (uart_handle_sysrq_char(&up->port, ch)) | |
| 391 | + return; | |
| 392 | + | |
| 393 | + uart_insert_char(&up->port, lsr, UART_LSR_OE, ch, flag); | |
| 394 | +} | |
| 395 | + | |
| 404 | 396 | /** |
| 405 | 397 | * serial_omap_irq() - This handles the interrupt from one port |
| 406 | 398 | * @irq: uart port irq number |
| 407 | 399 | * @dev_id: uart port info |
| 408 | 400 | */ |
| 409 | −static inline irqreturn_t serial_omap_irq(int irq, void *dev_id) | |
| 401 | +static irqreturn_t serial_omap_irq(int irq, void *dev_id) | |
| 410 | 402 | { |
| 411 | 403 | struct uart_omap_port *up = dev_id; |
| 404 | + struct tty_struct *tty = up->port.state->port.tty; | |
| 412 | 405 | unsigned int iir, lsr; |
| 413 | − unsigned long flags; | |
| 406 | + unsigned int type; | |
| 407 | + irqreturn_t ret = IRQ_NONE; | |
| 408 | + int max_count = 256; | |
| 414 | 409 | |
| 415 | − pm_runtime_get_sync(&up->pdev->dev); | |
| 416 | − iir = serial_in(up, UART_IIR); | |
| 417 | − if (iir & UART_IIR_NO_INT) { | |
| 418 | − pm_runtime_mark_last_busy(&up->pdev->dev); | |
| 419 | − pm_runtime_put_autosuspend(&up->pdev->dev); | |
| 420 | − return IRQ_NONE; | |
| 421 | − } | |
| 410 | + spin_lock(&up->port.lock); | |
| 411 | + pm_runtime_get_sync(up->dev); | |
| 422 | 412 | |
| 423 | − spin_lock_irqsave(&up->port.lock, flags); | |
| 424 | − lsr = serial_in(up, UART_LSR); | |
| 425 | − if (iir & UART_IIR_RLSI) { | |
| 426 | − if (!up->use_dma) { | |
| 427 | − if (lsr & UART_LSR_DR) | |
| 428 | − receive_chars(up, &lsr); | |
| 429 | − } else { | |
| 430 | − up->ier &= ~(UART_IER_RDI | UART_IER_RLSI); | |
| 431 | − serial_out(up, UART_IER, up->ier); | |
| 432 | − if ((serial_omap_start_rxdma(up) != 0) && | |
| 433 | − (lsr & UART_LSR_DR)) | |
| 434 | − receive_chars(up, &lsr); | |
| 413 | + do { | |
| 414 | + iir = serial_in(up, UART_IIR); | |
| 415 | + if (iir & UART_IIR_NO_INT) | |
| 416 | + break; | |
| 417 | + | |
| 418 | + ret = IRQ_HANDLED; | |
| 419 | + lsr = serial_in(up, UART_LSR); | |
| 420 | + | |
| 421 | + /* extract IRQ type from IIR register */ | |
| 422 | + type = iir & 0x3e; | |
| 423 | + | |
| 424 | + switch (type) { | |
| 425 | + case UART_IIR_MSI: | |
| 426 | + check_modem_status(up); | |
| 427 | + break; | |
| 428 | + case UART_IIR_THRI: | |
| 429 | + transmit_chars(up, lsr); | |
| 430 | + break; | |
| 431 | + case UART_IIR_RX_TIMEOUT: | |
| 432 | + /* FALLTHROUGH */ | |
| 433 | + case UART_IIR_RDI: | |
| 434 | + serial_omap_rdi(up, lsr); | |
| 435 | + break; | |
| 436 | + case UART_IIR_RLSI: | |
| 437 | + serial_omap_rlsi(up, lsr); | |
| 438 | + break; | |
| 439 | + case UART_IIR_CTS_RTS_DSR: | |
| 440 | + /* simply try again */ | |
| 441 | + break; | |
| 442 | + case UART_IIR_XOFF: | |
| 443 | + /* FALLTHROUGH */ | |
| 444 | + default: | |
| 445 | + break; | |
| 435 | 446 | } |
| 436 | − } | |
| 447 | + } while (!(iir & UART_IIR_NO_INT) && max_count--); | |
| 437 | 448 | |
| 438 | − check_modem_status(up); | |
| 439 | − if ((lsr & UART_LSR_THRE) && (iir & UART_IIR_THRI)) | |
| 440 | − transmit_chars(up); | |
| 449 | + spin_unlock(&up->port.lock); | |
| 441 | 450 | |
| 442 | − spin_unlock_irqrestore(&up->port.lock, flags); | |
| 443 | − pm_runtime_mark_last_busy(&up->pdev->dev); | |
| 444 | − pm_runtime_put_autosuspend(&up->pdev->dev); | |
| 451 | + tty_flip_buffer_push(tty); | |
| 445 | 452 | |
| 453 | + pm_runtime_mark_last_busy(up->dev); | |
| 454 | + pm_runtime_put_autosuspend(up->dev); | |
| 446 | 455 | up->port_activity = jiffies; |
| 447 | − return IRQ_HANDLED; | |
| 456 | + | |
| 457 | + return ret; | |
| 448 | 458 | } |
| 449 | 459 | |
| 450 | 460 | static unsigned int serial_omap_tx_empty(struct uart_port *port) |
| 451 | 461 | { |
| 452 | − struct uart_omap_port *up = (struct uart_omap_port *)port; | |
| 462 | + struct uart_omap_port *up = to_uart_omap_port(port); | |
| 453 | 463 | unsigned long flags = 0; |
| 454 | 464 | unsigned int ret = 0; |
| 455 | 465 | |
| 456 | − pm_runtime_get_sync(&up->pdev->dev); | |
| 466 | + pm_runtime_get_sync(up->dev); | |
| 457 | 467 | dev_dbg(up->port.dev, "serial_omap_tx_empty+%d\n", up->port.line); |
| 458 | 468 | spin_lock_irqsave(&up->port.lock, flags); |
| 459 | 469 | ret = serial_in(up, UART_LSR) & UART_LSR_TEMT ? TIOCSER_TEMT : 0; |
| 460 | 470 | spin_unlock_irqrestore(&up->port.lock, flags); |
| 461 | − pm_runtime_put(&up->pdev->dev); | |
| 471 | + pm_runtime_mark_last_busy(up->dev); | |
| 472 | + pm_runtime_put_autosuspend(up->dev); | |
| 462 | 473 | return ret; |
| 463 | 474 | } |
| 464 | 475 | |
| 465 | 476 | static unsigned int serial_omap_get_mctrl(struct uart_port *port) |
| 466 | 477 | { |
| 467 | − struct uart_omap_port *up = (struct uart_omap_port *)port; | |
| 478 | + struct uart_omap_port *up = to_uart_omap_port(port); | |
| 468 | 479 | unsigned int status; |
| 469 | 480 | unsigned int ret = 0; |
| 470 | 481 | |
| 471 | − pm_runtime_get_sync(&up->pdev->dev); | |
| 482 | + pm_runtime_get_sync(up->dev); | |
| 472 | 483 | status = check_modem_status(up); |
| 473 | − pm_runtime_put(&up->pdev->dev); | |
| 484 | + pm_runtime_mark_last_busy(up->dev); | |
| 485 | + pm_runtime_put_autosuspend(up->dev); | |
| 474 | 486 | |
| 475 | 487 | dev_dbg(up->port.dev, "serial_omap_get_mctrl+%d\n", up->port.line); |
| 476 | 488 | |
| @@ -487,7 +499,7 @@ static unsigned int serial_omap_get_mctrl(struct uart_port *port) · 10 unmodified lines | ||
| 487 | 499 | |
| 488 | 500 | static void serial_omap_set_mctrl(struct uart_port *port, unsigned int mctrl) |
| 489 | 501 | { |
| 490 | − struct uart_omap_port *up = (struct uart_omap_port *)port; | |
| 502 | + struct uart_omap_port *up = to_uart_omap_port(port); | |
| 491 | 503 | unsigned char mcr = 0; |
| 492 | 504 | |
| 493 | 505 | dev_dbg(up->port.dev, "serial_omap_set_mctrl+%d\n", up->port.line); |
| @@ -502,20 +514,31 @@ static void serial_omap_set_mctrl(struct uart_port *port, unsigned int mctrl) · 8 unmodified lines | ||
| 502 | 514 | if (mctrl & TIOCM_LOOP) |
| 503 | 515 | mcr |= UART_MCR_LOOP; |
| 504 | 516 | |
| 505 | − pm_runtime_get_sync(&up->pdev->dev); | |
| 517 | + pm_runtime_get_sync(up->dev); | |
| 506 | 518 | up->mcr = serial_in(up, UART_MCR); |
| 507 | 519 | up->mcr |= mcr; |
| 508 | 520 | serial_out(up, UART_MCR, up->mcr); |
| 509 | − pm_runtime_put(&up->pdev->dev); | |
| 521 | + pm_runtime_mark_last_busy(up->dev); | |
| 522 | + pm_runtime_put_autosuspend(up->dev); | |
| 523 | + | |
| 524 | + if (gpio_is_valid(up->DTR_gpio) && | |
| 525 | + !!(mctrl & TIOCM_DTR) != up->DTR_active) { | |
| 526 | + up->DTR_active = !up->DTR_active; | |
| 527 | + if (gpio_cansleep(up->DTR_gpio)) | |
| 528 | + schedule_work(&up->qos_work); | |
| 529 | + else | |
| 530 | + gpio_set_value(up->DTR_gpio, | |
| 531 | + up->DTR_active != up->DTR_inverted); | |
| 532 | + } | |
| 510 | 533 | } |
| 511 | 534 | |
| 512 | 535 | static void serial_omap_break_ctl(struct uart_port *port, int break_state) |
| 513 | 536 | { |
| 514 | − struct uart_omap_port *up = (struct uart_omap_port *)port; | |
| 537 | + struct uart_omap_port *up = to_uart_omap_port(port); | |
| 515 | 538 | unsigned long flags = 0; |
| 516 | 539 | |
| 517 | 540 | dev_dbg(up->port.dev, "serial_omap_break_ctl+%d\n", up->port.line); |
| 518 | − pm_runtime_get_sync(&up->pdev->dev); | |
| 541 | + pm_runtime_get_sync(up->dev); | |
| 519 | 542 | spin_lock_irqsave(&up->port.lock, flags); |
| 520 | 543 | if (break_state == -1) |
| 521 | 544 | up->lcr |= UART_LCR_SBC; |
| @@ -523,12 +546,13 @@ static void serial_omap_break_ctl(struct uart_port *port, int break_state) · 1 unmodified line | ||
| 523 | 546 | up->lcr &= ~UART_LCR_SBC; |
| 524 | 547 | serial_out(up, UART_LCR, up->lcr); |
| 525 | 548 | spin_unlock_irqrestore(&up->port.lock, flags); |
| 526 | − pm_runtime_put(&up->pdev->dev); | |
| 549 | + pm_runtime_mark_last_busy(up->dev); | |
| 550 | + pm_runtime_put_autosuspend(up->dev); | |
| 527 | 551 | } |
| 528 | 552 | |
| 529 | 553 | static int serial_omap_startup(struct uart_port *port) |
| 530 | 554 | { |
| 531 | − struct uart_omap_port *up = (struct uart_omap_port *)port; | |
| 555 | + struct uart_omap_port *up = to_uart_omap_port(port); | |
| 532 | 556 | unsigned long flags = 0; |
| 533 | 557 | int retval; |
| 534 | 558 | |
| @@ -542,7 +566,7 @@ static int serial_omap_startup(struct uart_port *port) · 7 unmodified lines | ||
| 542 | 566 | |
| 543 | 567 | dev_dbg(up->port.dev, "serial_omap_startup+%d\n", up->port.line); |
| 544 | 568 | |
| 545 | − pm_runtime_get_sync(&up->pdev->dev); | |
| 569 | + pm_runtime_get_sync(up->dev); | |
| 546 | 570 | /* |
| 547 | 571 | * Clear the FIFO buffers and disable them. |
| 548 | 572 | * (they will be reenabled in set_termios()) |
| @@ -573,20 +597,6 @@ static int serial_omap_startup(struct uart_port *port) · 24 unmodified lines | ||
| 573 | 597 | spin_unlock_irqrestore(&up->port.lock, flags); |
| 574 | 598 | |
| 575 | 599 | up->msr_saved_flags = 0; |
| 576 | − if (up->use_dma) { | |
| 577 | − free_page((unsigned long)up->port.state->xmit.buf); | |
| 578 | − up->port.state->xmit.buf = dma_alloc_coherent(NULL, | |
| 579 | − UART_XMIT_SIZE, | |
| 580 | − (dma_addr_t *)&(up->uart_dma.tx_buf_dma_phys), | |
| 581 | − 0); | |
| 582 | − init_timer(&(up->uart_dma.rx_timer)); | |
| 583 | − up->uart_dma.rx_timer.function = serial_omap_rxdma_poll; | |
| 584 | − up->uart_dma.rx_timer.data = up->port.line; | |
| 585 | − /* Currently the buffer size is 4KB. Can increase it */ | |
| 586 | − up->uart_dma.rx_buf = dma_alloc_coherent(NULL, | |
| 587 | − up->uart_dma.rx_buf_size, | |
| 588 | − (dma_addr_t *)&(up->uart_dma.rx_buf_dma_phys), 0); | |
| 589 | − } | |
| 590 | 600 | /* |
| 591 | 601 | * Finally, enable interrupts. Note: Modem status interrupts |
| 592 | 602 | * are set via set_termios(), which will be occurring imminently |
| @@ -598,20 +608,20 @@ static int serial_omap_startup(struct uart_port *port) · 5 unmodified lines | ||
| 598 | 608 | /* Enable module level wake up */ |
| 599 | 609 | serial_out(up, UART_OMAP_WER, OMAP_UART_WER_MOD_WKUP); |
| 600 | 610 | |
| 601 | − pm_runtime_mark_last_busy(&up->pdev->dev); | |
| 602 | − pm_runtime_put_autosuspend(&up->pdev->dev); | |
| 611 | + pm_runtime_mark_last_busy(up->dev); | |
| 612 | + pm_runtime_put_autosuspend(up->dev); | |
| 603 | 613 | up->port_activity = jiffies; |
| 604 | 614 | return 0; |
| 605 | 615 | } |
| 606 | 616 | |
| 607 | 617 | static void serial_omap_shutdown(struct uart_port *port) |
| 608 | 618 | { |
| 609 | − struct uart_omap_port *up = (struct uart_omap_port *)port; | |
| 619 | + struct uart_omap_port *up = to_uart_omap_port(port); | |
| 610 | 620 | unsigned long flags = 0; |
| 611 | 621 | |
| 612 | 622 | dev_dbg(up->port.dev, "serial_omap_shutdown+%d\n", up->port.line); |
| 613 | 623 | |
| 614 | − pm_runtime_get_sync(&up->pdev->dev); | |
| 624 | + pm_runtime_get_sync(up->dev); | |
| 615 | 625 | /* |
| 616 | 626 | * Disable interrupts from this port |
| 617 | 627 | */ |
| @@ -634,19 +644,9 @@ static void serial_omap_shutdown(struct uart_port *port) · 16 unmodified lines | ||
| 634 | 644 | */ |
| 635 | 645 | if (serial_in(up, UART_LSR) & UART_LSR_DR) |
| 636 | 646 | (void) serial_in(up, UART_RX); |
| 637 | − if (up->use_dma) { | |
| 638 | − dma_free_coherent(up->port.dev, | |
| 639 | − UART_XMIT_SIZE, up->port.state->xmit.buf, | |
| 640 | − up->uart_dma.tx_buf_dma_phys); | |
| 641 | − up->port.state->xmit.buf = NULL; | |
| 642 | − serial_omap_stop_rx(port); | |
| 643 | − dma_free_coherent(up->port.dev, | |
| 644 | − up->uart_dma.rx_buf_size, up->uart_dma.rx_buf, | |
| 645 | − up->uart_dma.rx_buf_dma_phys); | |
| 646 | − up->uart_dma.rx_buf = NULL; | |
| 647 | − } | |
| 648 | 647 | |
| 649 | − pm_runtime_put(&up->pdev->dev); | |
| 648 | + pm_runtime_mark_last_busy(up->dev); | |
| 649 | + pm_runtime_put_autosuspend(up->dev); | |
| 650 | 650 | free_irq(up->port.irq, up); |
| 651 | 651 | } |
| 652 | 652 | |
| @@ -667,19 +667,19 @@ serial_omap_configure_xonxoff · 14 unmodified lines | ||
| 667 | 667 | |
| 668 | 668 | /* |
| 669 | 669 | * IXON Flag: |
| 670 | − * Enable XON/XOFF flow control on output. | |
| 671 | − * Transmit XON1, XOFF1 | |
| 670 | + * Flow control for OMAP.TX | |
| 671 | + * OMAP.RX should listen for XON/XOFF | |
| 672 | 672 | */ |
| 673 | 673 | if (termios->c_iflag & IXON) |
| 674 | − up->efr |= OMAP_UART_SW_TX; | |
| 674 | + up->efr |= OMAP_UART_SW_RX; | |
| 675 | 675 | |
| 676 | 676 | /* |
| 677 | 677 | * IXOFF Flag: |
| 678 | − * Enable XON/XOFF flow control on input. | |
| 679 | − * Receiver compares XON1, XOFF1. | |
| 678 | + * Flow control for OMAP.RX | |
| 679 | + * OMAP.TX should send XON/XOFF | |
| 680 | 680 | */ |
| 681 | 681 | if (termios->c_iflag & IXOFF) |
| 682 | − up->efr |= OMAP_UART_SW_RX; | |
| 682 | + up->efr |= OMAP_UART_SW_TX; | |
| 683 | 683 | |
| 684 | 684 | serial_out(up, UART_EFR, up->efr | UART_EFR_ECB); |
| 685 | 685 | serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A); |
| @@ -715,13 +715,16 @@ static void serial_omap_uart_qos_work(struct work_struct *work) · 29 unmodified lines | ||
| 715 | 715 | qos_work); |
| 716 | 716 | |
| 717 | 717 | pm_qos_update_request(&up->pm_qos_request, up->latency); |
| 718 | + if (gpio_is_valid(up->DTR_gpio)) | |
| 719 | + gpio_set_value_cansleep(up->DTR_gpio, | |
| 720 | + up->DTR_active != up->DTR_inverted); | |
| 718 | 721 | } |
| 719 | 722 | |
| 720 | 723 | static void |
| 721 | 724 | serial_omap_set_termios(struct uart_port *port, struct ktermios *termios, |
| 722 | 725 | struct ktermios *old) |
| 723 | 726 | { |
| 724 | − struct uart_omap_port *up = (struct uart_omap_port *)port; | |
| 727 | + struct uart_omap_port *up = to_uart_omap_port(port); | |
| 725 | 728 | unsigned char cval = 0; |
| 726 | 729 | unsigned char efr = 0; |
| 727 | 730 | unsigned long flags = 0; |
| @@ -768,14 +771,12 @@ serial_omap_set_termios(struct uart_port *port, struct ktermios *termios, · 40 unmodified lines | ||
| 768 | 771 | |
| 769 | 772 | up->fcr = UART_FCR_R_TRIG_01 | UART_FCR_T_TRIG_01 | |
| 770 | 773 | UART_FCR_ENABLE_FIFO; |
| 771 | − if (up->use_dma) | |
| 772 | − up->fcr |= UART_FCR_DMA_SELECT; | |
| 773 | 774 | |
| 774 | 775 | /* |
| 775 | 776 | * Ok, we're now changing the port state. Do it with |
| 776 | 777 | * interrupts disabled. |
| 777 | 778 | */ |
| 778 | − pm_runtime_get_sync(&up->pdev->dev); | |
| 779 | + pm_runtime_get_sync(up->dev); | |
| 779 | 780 | spin_lock_irqsave(&up->port.lock, flags); |
| 780 | 781 | |
| 781 | 782 | /* |
| @@ -845,14 +846,13 @@ serial_omap_set_termios(struct uart_port *port, struct ktermios *termios, · 63 unmodified lines | ||
| 845 | 846 | |
| 846 | 847 | up->scr |= OMAP_UART_SCR_RX_TRIG_GRANU1_MASK; |
| 847 | 848 | |
| 848 | − if (up->use_dma) { | |
| 849 | − serial_out(up, UART_TI752_TLR, 0); | |
| 850 | − up->scr |= UART_FCR_TRIGGER_4; | |
| 851 | − } else { | |
| 852 | − /* Set receive FIFO threshold to 1 byte */ | |
| 853 | − up->fcr &= ~OMAP_UART_FCR_RX_FIFO_TRIG_MASK; | |
| 854 | − up->fcr |= (0x1 << OMAP_UART_FCR_RX_FIFO_TRIG_SHIFT); | |
| 855 | − } | |
| 849 | + /* Set receive FIFO threshold to 16 characters and | |
| 850 | + * transmit FIFO threshold to 16 spaces | |
| 851 | + */ | |
| 852 | + up->fcr &= ~OMAP_UART_FCR_RX_FIFO_TRIG_MASK; | |
| 853 | + up->fcr &= ~OMAP_UART_FCR_TX_FIFO_TRIG_MASK; | |
| 854 | + up->fcr |= UART_FCR6_R_TRIGGER_16 | UART_FCR6_T_TRIGGER_24 | | |
| 855 | + UART_FCR_ENABLE_FIFO; | |
| 856 | 856 | |
| 857 | 857 | serial_out(up, UART_FCR, up->fcr); |
| 858 | 858 | serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B); |
| @@ -924,20 +924,30 @@ serial_omap_set_termios(struct uart_port *port, struct ktermios *termios, · 65 unmodified lines | ||
| 924 | 924 | serial_omap_configure_xonxoff(up, termios); |
| 925 | 925 | |
| 926 | 926 | spin_unlock_irqrestore(&up->port.lock, flags); |
| 927 | − pm_runtime_put(&up->pdev->dev); | |
| 927 | + pm_runtime_mark_last_busy(up->dev); | |
| 928 | + pm_runtime_put_autosuspend(up->dev); | |
| 928 | 929 | dev_dbg(up->port.dev, "serial_omap_set_termios+%d\n", up->port.line); |
| 929 | 930 | } |
| 930 | 931 | |
| 932 | +static int serial_omap_set_wake(struct uart_port *port, unsigned int state) | |
| 933 | +{ | |
| 934 | + struct uart_omap_port *up = to_uart_omap_port(port); | |
| 935 | + | |
| 936 | + serial_omap_enable_wakeup(up, state); | |
| 937 | + | |
| 938 | + return 0; | |
| 939 | +} | |
| 940 | + | |
| 931 | 941 | static void |
| 932 | 942 | serial_omap_pm(struct uart_port *port, unsigned int state, |
| 933 | 943 | unsigned int oldstate) |
| 934 | 944 | { |
| 935 | − struct uart_omap_port *up = (struct uart_omap_port *)port; | |
| 945 | + struct uart_omap_port *up = to_uart_omap_port(port); | |
| 936 | 946 | unsigned char efr; |
| 937 | 947 | |
| 938 | 948 | dev_dbg(up->port.dev, "serial_omap_pm+%d\n", up->port.line); |
| 939 | 949 | |
| 940 | − pm_runtime_get_sync(&up->pdev->dev); | |
| 950 | + pm_runtime_get_sync(up->dev); | |
| 941 | 951 | serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B); |
| 942 | 952 | efr = serial_in(up, UART_EFR); |
| 943 | 953 | serial_out(up, UART_EFR, efr | UART_EFR_ECB); |
| @@ -948,14 +958,15 @@ serial_omap_pm(struct uart_port *port, unsigned int state, · 4 unmodified lines | ||
| 948 | 958 | serial_out(up, UART_EFR, efr); |
| 949 | 959 | serial_out(up, UART_LCR, 0); |
| 950 | 960 | |
| 951 | − if (!device_may_wakeup(&up->pdev->dev)) { | |
| 961 | + if (!device_may_wakeup(up->dev)) { | |
| 952 | 962 | if (!state) |
| 953 | − pm_runtime_forbid(&up->pdev->dev); | |
| 963 | + pm_runtime_forbid(up->dev); | |
| 954 | 964 | else |
| 955 | − pm_runtime_allow(&up->pdev->dev); | |
| 965 | + pm_runtime_allow(up->dev); | |
| 956 | 966 | } |
| 957 | 967 | |
| 958 | − pm_runtime_put(&up->pdev->dev); | |
| 968 | + pm_runtime_mark_last_busy(up->dev); | |
| 969 | + pm_runtime_put_autosuspend(up->dev); | |
| 959 | 970 | } |
| 960 | 971 | |
| 961 | 972 | static void serial_omap_release_port(struct uart_port *port) |
| @@ -971,7 +982,7 @@ static int serial_omap_request_port(struct uart_port *port) · 9 unmodified lines | ||
| 971 | 982 | |
| 972 | 983 | static void serial_omap_config_port(struct uart_port *port, int flags) |
| 973 | 984 | { |
| 974 | − struct uart_omap_port *up = (struct uart_omap_port *)port; | |
| 985 | + struct uart_omap_port *up = to_uart_omap_port(port); | |
| 975 | 986 | |
| 976 | 987 | dev_dbg(up->port.dev, "serial_omap_config_port+%d\n", |
| 977 | 988 | up->port.line); |
| @@ -989,7 +1000,7 @@ serial_omap_verify_port(struct uart_port *port, struct serial_struct *ser) · 11 unmodified lines | ||
| 989 | 1000 | static const char * |
| 990 | 1001 | serial_omap_type(struct uart_port *port) |
| 991 | 1002 | { |
| 992 | − struct uart_omap_port *up = (struct uart_omap_port *)port; | |
| 1003 | + struct uart_omap_port *up = to_uart_omap_port(port); | |
| 993 | 1004 | |
| 994 | 1005 | dev_dbg(up->port.dev, "serial_omap_type+%d\n", up->port.line); |
| 995 | 1006 | return up->name; |
| @@ -1032,26 +1043,33 @@ static inline void wait_for_xmitr(struct uart_omap_port *up) · 36 unmodified lines | ||
| 1032 | 1043 | |
| 1033 | 1044 | static void serial_omap_poll_put_char(struct uart_port *port, unsigned char ch) |
| 1034 | 1045 | { |
| 1035 | − struct uart_omap_port *up = (struct uart_omap_port *)port; | |
| 1046 | + struct uart_omap_port *up = to_uart_omap_port(port); | |
| 1036 | 1047 | |
| 1037 | − pm_runtime_get_sync(&up->pdev->dev); | |
| 1048 | + pm_runtime_get_sync(up->dev); | |
| 1038 | 1049 | wait_for_xmitr(up); |
| 1039 | 1050 | serial_out(up, UART_TX, ch); |
| 1040 | − pm_runtime_put(&up->pdev->dev); | |
| 1051 | + pm_runtime_mark_last_busy(up->dev); | |
| 1052 | + pm_runtime_put_autosuspend(up->dev); | |
| 1041 | 1053 | } |
| 1042 | 1054 | |
| 1043 | 1055 | static int serial_omap_poll_get_char(struct uart_port *port) |
| 1044 | 1056 | { |
| 1045 | − struct uart_omap_port *up = (struct uart_omap_port *)port; | |
| 1057 | + struct uart_omap_port *up = to_uart_omap_port(port); | |
| 1046 | 1058 | unsigned int status; |
| 1047 | 1059 | |
| 1048 | − pm_runtime_get_sync(&up->pdev->dev); | |
| 1060 | + pm_runtime_get_sync(up->dev); | |
| 1049 | 1061 | status = serial_in(up, UART_LSR); |
| 1050 | − if (!(status & UART_LSR_DR)) | |
| 1051 | − return NO_POLL_CHAR; | |
| 1062 | + if (!(status & UART_LSR_DR)) { | |
| 1063 | + status = NO_POLL_CHAR; | |
| 1064 | + goto out; | |
| 1065 | + } | |
| 1052 | 1066 | |
| 1053 | 1067 | status = serial_in(up, UART_RX); |
| 1054 | − pm_runtime_put(&up->pdev->dev); | |
| 1068 | + | |
| 1069 | +out: | |
| 1070 | + pm_runtime_mark_last_busy(up->dev); | |
| 1071 | + pm_runtime_put_autosuspend(up->dev); | |
| 1072 | + | |
| 1055 | 1073 | return status; |
| 1056 | 1074 | } |
| 1057 | 1075 | |
| @@ -1065,7 +1083,7 @@ static struct uart_driver serial_omap_reg; · 7 unmodified lines | ||
| 1065 | 1083 | |
| 1066 | 1084 | static void serial_omap_console_putchar(struct uart_port *port, int ch) |
| 1067 | 1085 | { |
| 1068 | − struct uart_omap_port *up = (struct uart_omap_port *)port; | |
| 1086 | + struct uart_omap_port *up = to_uart_omap_port(port); | |
| 1069 | 1087 | |
| 1070 | 1088 | wait_for_xmitr(up); |
| 1071 | 1089 | serial_out(up, UART_TX, ch); |
| @@ -1080,7 +1098,7 @@ serial_omap_console_write(struct console *co, const char *s, · 8 unmodified lines | ||
| 1080 | 1098 | unsigned int ier; |
| 1081 | 1099 | int locked = 1; |
| 1082 | 1100 | |
| 1083 | − pm_runtime_get_sync(&up->pdev->dev); | |
| 1101 | + pm_runtime_get_sync(up->dev); | |
| 1084 | 1102 | |
| 1085 | 1103 | local_irq_save(flags); |
| 1086 | 1104 | if (up->port.sysrq) |
| @@ -1114,8 +1132,8 @@ serial_omap_console_write(struct console *co, const char *s, · 27 unmodified lines | ||
| 1114 | 1132 | if (up->msr_saved_flags) |
| 1115 | 1133 | check_modem_status(up); |
| 1116 | 1134 | |
| 1117 | − pm_runtime_mark_last_busy(&up->pdev->dev); | |
| 1118 | − pm_runtime_put_autosuspend(&up->pdev->dev); | |
| 1135 | + pm_runtime_mark_last_busy(up->dev); | |
| 1136 | + pm_runtime_put_autosuspend(up->dev); | |
| 1119 | 1137 | if (locked) |
| 1120 | 1138 | spin_unlock(&up->port.lock); |
| 1121 | 1139 | local_irq_restore(flags); |
| @@ -1179,6 +1197,7 @@ static struct uart_ops serial_omap_pops = { · 57 unmodified lines | ||
| 1179 | 1197 | .shutdown = serial_omap_shutdown, |
| 1180 | 1198 | .set_termios = serial_omap_set_termios, |
| 1181 | 1199 | .pm = serial_omap_pm, |
| 1200 | + .set_wake = serial_omap_set_wake, | |
| 1182 | 1201 | .type = serial_omap_type, |
| 1183 | 1202 | .release_port = serial_omap_release_port, |
| 1184 | 1203 | .request_port = serial_omap_request_port, |
| @@ -1221,150 +1240,7 @@ static int serial_omap_resume(struct device *dev) · 36 unmodified lines | ||
| 1221 | 1240 | } |
| 1222 | 1241 | #endif |
| 1223 | 1242 | |
| 1224 | −static void serial_omap_rxdma_poll(unsigned long uart_no) | |
| 1225 | −{ | |
| 1226 | − struct uart_omap_port *up = ui[uart_no]; | |
| 1227 | − unsigned int curr_dma_pos, curr_transmitted_size; | |
| 1228 | − int ret = 0; | |
| 1229 | − | |
| 1230 | − curr_dma_pos = omap_get_dma_dst_pos(up->uart_dma.rx_dma_channel); | |
| 1231 | − if ((curr_dma_pos == up->uart_dma.prev_rx_dma_pos) || | |
| 1232 | − (curr_dma_pos == 0)) { | |
| 1233 | − if (jiffies_to_msecs(jiffies - up->port_activity) < | |
| 1234 | − up->uart_dma.rx_timeout) { | |
| 1235 | − mod_timer(&up->uart_dma.rx_timer, jiffies + | |
| 1236 | − usecs_to_jiffies(up->uart_dma.rx_poll_rate)); | |
| 1237 | − } else { | |
| 1238 | − serial_omap_stop_rxdma(up); | |
| 1239 | − up->ier |= (UART_IER_RDI | UART_IER_RLSI); | |
| 1240 | − serial_out(up, UART_IER, up->ier); | |
| 1241 | − } | |
| 1242 | − return; | |
| 1243 | − } | |
| 1244 | − | |
| 1245 | − curr_transmitted_size = curr_dma_pos - | |
| 1246 | − up->uart_dma.prev_rx_dma_pos; | |
| 1247 | − up->port.icount.rx += curr_transmitted_size; | |
| 1248 | − tty_insert_flip_string(up->port.state->port.tty, | |
| 1249 | − up->uart_dma.rx_buf + | |
| 1250 | − (up->uart_dma.prev_rx_dma_pos - | |
| 1251 | − up->uart_dma.rx_buf_dma_phys), | |
| 1252 | − curr_transmitted_size); | |
| 1253 | − tty_flip_buffer_push(up->port.state->port.tty); | |
| 1254 | − up->uart_dma.prev_rx_dma_pos = curr_dma_pos; | |
| 1255 | − if (up->uart_dma.rx_buf_size + | |
| 1256 | − up->uart_dma.rx_buf_dma_phys == curr_dma_pos) { | |
| 1257 | − ret = serial_omap_start_rxdma(up); | |
| 1258 | − if (ret < 0) { | |
| 1259 | − serial_omap_stop_rxdma(up); | |
| 1260 | − up->ier |= (UART_IER_RDI | UART_IER_RLSI); | |
| 1261 | − serial_out(up, UART_IER, up->ier); | |
| 1262 | − } | |
| 1263 | − } else { | |
| 1264 | − mod_timer(&up->uart_dma.rx_timer, jiffies + | |
| 1265 | − usecs_to_jiffies(up->uart_dma.rx_poll_rate)); | |
| 1266 | − } | |
| 1267 | − up->port_activity = jiffies; | |
| 1268 | −} | |
| 1269 | − | |
| 1270 | −static void uart_rx_dma_callback(int lch, u16 ch_status, void *data) | |
| 1271 | −{ | |
| 1272 | − return; | |
| 1273 | −} | |
| 1274 | − | |
| 1275 | −static int serial_omap_start_rxdma(struct uart_omap_port *up) | |
| 1276 | −{ | |
| 1277 | − int ret = 0; | |
| 1278 | − | |
| 1279 | − if (up->uart_dma.rx_dma_channel == -1) { | |
| 1280 | − pm_runtime_get_sync(&up->pdev->dev); | |
| 1281 | − ret = omap_request_dma(up->uart_dma.uart_dma_rx, | |
| 1282 | − "UART Rx DMA", | |
| 1283 | − (void *)uart_rx_dma_callback, up, | |
| 1284 | − &(up->uart_dma.rx_dma_channel)); | |
| 1285 | − if (ret < 0) | |
| 1286 | − return ret; | |
| 1287 | − | |
| 1288 | − omap_set_dma_src_params(up->uart_dma.rx_dma_channel, 0, | |
| 1289 | − OMAP_DMA_AMODE_CONSTANT, | |
| 1290 | − up->uart_dma.uart_base, 0, 0); | |
| 1291 | − omap_set_dma_dest_params(up->uart_dma.rx_dma_channel, 0, | |
| 1292 | − OMAP_DMA_AMODE_POST_INC, | |
| 1293 | − up->uart_dma.rx_buf_dma_phys, 0, 0); | |
| 1294 | − omap_set_dma_transfer_params(up->uart_dma.rx_dma_channel, | |
| 1295 | − OMAP_DMA_DATA_TYPE_S8, | |
| 1296 | − up->uart_dma.rx_buf_size, 1, | |
| 1297 | − OMAP_DMA_SYNC_ELEMENT, | |
| 1298 | − up->uart_dma.uart_dma_rx, 0); | |
| 1299 | − } | |
| 1300 | − up->uart_dma.prev_rx_dma_pos = up->uart_dma.rx_buf_dma_phys; | |
| 1301 | − /* FIXME: Cache maintenance needed here? */ | |
| 1302 | − omap_start_dma(up->uart_dma.rx_dma_channel); | |
| 1303 | − mod_timer(&up->uart_dma.rx_timer, jiffies + | |
| 1304 | − usecs_to_jiffies(up->uart_dma.rx_poll_rate)); | |
| 1305 | − up->uart_dma.rx_dma_used = true; | |
| 1306 | − return ret; | |
| 1307 | −} | |
| 1308 | − | |
| 1309 | −static void serial_omap_continue_tx(struct uart_omap_port *up) | |
| 1310 | −{ | |
| 1311 | − struct circ_buf *xmit = &up->port.state->xmit; | |
| 1312 | − unsigned int start = up->uart_dma.tx_buf_dma_phys | |
| 1313 | − + (xmit->tail & (UART_XMIT_SIZE - 1)); | |
| 1314 | − | |
| 1315 | − if (uart_circ_empty(xmit)) | |
| 1316 | − return; | |
| 1317 | − | |
| 1318 | − up->uart_dma.tx_buf_size = uart_circ_chars_pending(xmit); | |
| 1319 | − /* | |
| 1320 | − * It is a circular buffer. See if the buffer has wounded back. | |
| 1321 | − * If yes it will have to be transferred in two separate dma | |
| 1322 | − * transfers | |
| 1323 | − */ | |
| 1324 | − if (start + up->uart_dma.tx_buf_size >= | |
| 1325 | − up->uart_dma.tx_buf_dma_phys + UART_XMIT_SIZE) | |
| 1326 | − up->uart_dma.tx_buf_size = | |
| 1327 | − (up->uart_dma.tx_buf_dma_phys + UART_XMIT_SIZE) - start; | |
| 1328 | − omap_set_dma_dest_params(up->uart_dma.tx_dma_channel, 0, | |
| 1329 | − OMAP_DMA_AMODE_CONSTANT, | |
| 1330 | − up->uart_dma.uart_base, 0, 0); | |
| 1331 | − omap_set_dma_src_params(up->uart_dma.tx_dma_channel, 0, | |
| 1332 | − OMAP_DMA_AMODE_POST_INC, start, 0, 0); | |
| 1333 | − omap_set_dma_transfer_params(up->uart_dma.tx_dma_channel, | |
| 1334 | − OMAP_DMA_DATA_TYPE_S8, | |
| 1335 | − up->uart_dma.tx_buf_size, 1, | |
| 1336 | − OMAP_DMA_SYNC_ELEMENT, | |
| 1337 | − up->uart_dma.uart_dma_tx, 0); | |
| 1338 | − /* FIXME: Cache maintenance needed here? */ | |
| 1339 | − omap_start_dma(up->uart_dma.tx_dma_channel); | |
| 1340 | −} | |
| 1341 | − | |
| 1342 | −static void uart_tx_dma_callback(int lch, u16 ch_status, void *data) | |
| 1343 | −{ | |
| 1344 | − struct uart_omap_port *up = (struct uart_omap_port *)data; | |
| 1345 | − struct circ_buf *xmit = &up->port.state->xmit; | |
| 1346 | − | |
| 1347 | − xmit->tail = (xmit->tail + up->uart_dma.tx_buf_size) & \ | |
| 1348 | − (UART_XMIT_SIZE - 1); | |
| 1349 | − up->port.icount.tx += up->uart_dma.tx_buf_size; | |
| 1350 | − | |
| 1351 | − if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) | |
| 1352 | − uart_write_wakeup(&up->port); | |
| 1353 | − | |
| 1354 | − if (uart_circ_empty(xmit)) { | |
| 1355 | − spin_lock(&(up->uart_dma.tx_lock)); | |
| 1356 | − serial_omap_stop_tx(&up->port); | |
| 1357 | − up->uart_dma.tx_dma_used = false; | |
| 1358 | − spin_unlock(&(up->uart_dma.tx_lock)); | |
| 1359 | − } else { | |
| 1360 | − omap_stop_dma(up->uart_dma.tx_dma_channel); | |
| 1361 | − serial_omap_continue_tx(up); | |
| 1362 | − } | |
| 1363 | − up->port_activity = jiffies; | |
| 1364 | − return; | |
| 1365 | −} | |
| 1366 | − | |
| 1367 | −static void omap_serial_fill_features_erratas(struct uart_omap_port *up) | |
| 1243 | +static void __devinit omap_serial_fill_features_erratas(struct uart_omap_port *up) | |
| 1368 | 1244 | { |
| 1369 | 1245 | u32 mvr, scheme; |
| 1370 | 1246 | u16 revision, major, minor; |
| @@ -1389,7 +1265,7 @@ static void omap_serial_fill_features_erratas(struct uart_omap_port *up) · 18 unmodified lines | ||
| 1389 | 1265 | minor = (mvr & OMAP_UART_MVR_MIN_MASK); |
| 1390 | 1266 | break; |
| 1391 | 1267 | default: |
| 1392 | − dev_warn(&up->pdev->dev, | |
| 1268 | + dev_warn(up->dev, | |
| 1393 | 1269 | "Unknown %s revision, defaulting to highest\n", |
| 1394 | 1270 | up->name); |
| 1395 | 1271 | /* highest possible revision */ |
| @@ -1417,7 +1293,7 @@ static void omap_serial_fill_features_erratas(struct uart_omap_port *up) · 21 unmodified lines | ||
| 1417 | 1293 | } |
| 1418 | 1294 | } |
| 1419 | 1295 | |
| 1420 | −static struct omap_uart_port_info *of_get_uart_port_info(struct device *dev) | |
| 1296 | +static __devinit struct omap_uart_port_info *of_get_uart_port_info(struct device *dev) | |
| 1421 | 1297 | { |
| 1422 | 1298 | struct omap_uart_port_info *omap_up_info; |
| 1423 | 1299 | |
| @@ -1430,12 +1306,12 @@ static struct omap_uart_port_info *of_get_uart_port_info(struct device *dev) · 6 unmodified lines | ||
| 1430 | 1306 | return omap_up_info; |
| 1431 | 1307 | } |
| 1432 | 1308 | |
| 1433 | −static int serial_omap_probe(struct platform_device *pdev) | |
| 1309 | +static int __devinit serial_omap_probe(struct platform_device *pdev) | |
| 1434 | 1310 | { |
| 1435 | 1311 | struct uart_omap_port *up; |
| 1436 | − struct resource *mem, *irq, *dma_tx, *dma_rx; | |
| 1312 | + struct resource *mem, *irq; | |
| 1437 | 1313 | struct omap_uart_port_info *omap_up_info = pdev->dev.platform_data; |
| 1438 | − int ret = -ENOSPC; | |
| 1314 | + int ret; | |
| 1439 | 1315 | |
| 1440 | 1316 | if (pdev->dev.of_node) |
| 1441 | 1317 | omap_up_info = of_get_uart_port_info(&pdev->dev); |
| @@ -1458,19 +1334,30 @@ static int serial_omap_probe(struct platform_device *pdev) · 16 unmodified lines | ||
| 1458 | 1334 | return -EBUSY; |
| 1459 | 1335 | } |
| 1460 | 1336 | |
| 1461 | − dma_rx = platform_get_resource_byname(pdev, IORESOURCE_DMA, "rx"); | |
| 1462 | − if (!dma_rx) | |
| 1463 | − return -ENXIO; | |
| 1464 | − | |
| 1465 | − dma_tx = platform_get_resource_byname(pdev, IORESOURCE_DMA, "tx"); | |
| 1466 | − if (!dma_tx) | |
| 1467 | − return -ENXIO; | |
| 1337 | + if (gpio_is_valid(omap_up_info->DTR_gpio) && | |
| 1338 | + omap_up_info->DTR_present) { | |
| 1339 | + ret = gpio_request(omap_up_info->DTR_gpio, "omap-serial"); | |
| 1340 | + if (ret < 0) | |
| 1341 | + return ret; | |
| 1342 | + ret = gpio_direction_output(omap_up_info->DTR_gpio, | |
| 1343 | + omap_up_info->DTR_inverted); | |
| 1344 | + if (ret < 0) | |
| 1345 | + return ret; | |
| 1346 | + } | |
| 1468 | 1347 | |
| 1469 | 1348 | up = devm_kzalloc(&pdev->dev, sizeof(*up), GFP_KERNEL); |
| 1470 | 1349 | if (!up) |
| 1471 | 1350 | return -ENOMEM; |
| 1472 | 1351 | |
| 1473 | − up->pdev = pdev; | |
| 1352 | + if (gpio_is_valid(omap_up_info->DTR_gpio) && | |
| 1353 | + omap_up_info->DTR_present) { | |
| 1354 | + up->DTR_gpio = omap_up_info->DTR_gpio; | |
| 1355 | + up->DTR_inverted = omap_up_info->DTR_inverted; | |
| 1356 | + } else | |
| 1357 | + up->DTR_gpio = -EINVAL; | |
| 1358 | + up->DTR_active = 0; | |
| 1359 | + | |
| 1360 | + up->dev = &pdev->dev; | |
| 1474 | 1361 | up->port.dev = &pdev->dev; |
| 1475 | 1362 | up->port.type = PORT_OMAP; |
| 1476 | 1363 | up->port.iotype = UPIO_MEM; |
| @@ -1492,6 +1379,13 @@ static int serial_omap_probe(struct platform_device *pdev) · 15 unmodified lines | ||
| 1492 | 1379 | goto err_port_line; |
| 1493 | 1380 | } |
| 1494 | 1381 | |
| 1382 | + up->pins = devm_pinctrl_get_select_default(&pdev->dev); | |
| 1383 | + if (IS_ERR(up->pins)) { | |
| 1384 | + dev_warn(&pdev->dev, "did not get pins for uart%i error: %li\n", | |
| 1385 | + up->port.line, PTR_ERR(up->pins)); | |
| 1386 | + up->pins = NULL; | |
| 1387 | + } | |
| 1388 | + | |
| 1495 | 1389 | sprintf(up->name, "OMAP UART%d", up->port.line); |
| 1496 | 1390 | up->port.mapbase = mem->start; |
| 1497 | 1391 | up->port.membase = devm_ioremap(&pdev->dev, mem->start, |
| @@ -1509,20 +1403,6 @@ static int serial_omap_probe(struct platform_device *pdev) · 11 unmodified lines | ||
| 1509 | 1403 | dev_warn(&pdev->dev, "No clock speed specified: using default:" |
| 1510 | 1404 | "%d\n", DEFAULT_CLK_SPEED); |
| 1511 | 1405 | } |
| 1512 | − up->uart_dma.uart_base = mem->start; | |
| 1513 | − | |
| 1514 | − if (omap_up_info->dma_enabled) { | |
| 1515 | − up->uart_dma.uart_dma_tx = dma_tx->start; | |
| 1516 | − up->uart_dma.uart_dma_rx = dma_rx->start; | |
| 1517 | − up->use_dma = 1; | |
| 1518 | − up->uart_dma.rx_buf_size = omap_up_info->dma_rx_buf_size; | |
| 1519 | − up->uart_dma.rx_timeout = omap_up_info->dma_rx_timeout; | |
| 1520 | − up->uart_dma.rx_poll_rate = omap_up_info->dma_rx_poll_rate; | |
| 1521 | − spin_lock_init(&(up->uart_dma.tx_lock)); | |
| 1522 | − spin_lock_init(&(up->uart_dma.rx_lock)); | |
| 1523 | − up->uart_dma.tx_dma_channel = OMAP_UART_DMA_CH_FREE; | |
| 1524 | − up->uart_dma.rx_dma_channel = OMAP_UART_DMA_CH_FREE; | |
| 1525 | − } | |
| 1526 | 1406 | |
| 1527 | 1407 | up->latency = PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE; |
| 1528 | 1408 | up->calc_latency = PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE; |
| @@ -1531,12 +1411,13 @@ static int serial_omap_probe(struct platform_device *pdev) · 2 unmodified lines | ||
| 1531 | 1411 | serial_omap_uart_wq = create_singlethread_workqueue(up->name); |
| 1532 | 1412 | INIT_WORK(&up->qos_work, serial_omap_uart_qos_work); |
| 1533 | 1413 | |
| 1414 | + platform_set_drvdata(pdev, up); | |
| 1415 | + pm_runtime_enable(&pdev->dev); | |
| 1534 | 1416 | pm_runtime_use_autosuspend(&pdev->dev); |
| 1535 | 1417 | pm_runtime_set_autosuspend_delay(&pdev->dev, |
| 1536 | 1418 | omap_up_info->autosuspend_timeout); |
| 1537 | 1419 | |
| 1538 | 1420 | pm_runtime_irq_safe(&pdev->dev); |
| 1539 | − pm_runtime_enable(&pdev->dev); | |
| 1540 | 1421 | pm_runtime_get_sync(&pdev->dev); |
| 1541 | 1422 | |
| 1542 | 1423 | omap_serial_fill_features_erratas(up); |
| @@ -1548,8 +1429,8 @@ static int serial_omap_probe(struct platform_device *pdev) · 5 unmodified lines | ||
| 1548 | 1429 | if (ret != 0) |
| 1549 | 1430 | goto err_add_port; |
| 1550 | 1431 | |
| 1551 | − pm_runtime_put(&pdev->dev); | |
| 1552 | − platform_set_drvdata(pdev, up); | |
| 1432 | + pm_runtime_mark_last_busy(up->dev); | |
| 1433 | + pm_runtime_put_autosuspend(up->dev); | |
| 1553 | 1434 | return 0; |
| 1554 | 1435 | |
| 1555 | 1436 | err_add_port: |
| @@ -1562,17 +1443,15 @@ err_port_line: · 6 unmodified lines | ||
| 1562 | 1443 | return ret; |
| 1563 | 1444 | } |
| 1564 | 1445 | |
| 1565 | −static int serial_omap_remove(struct platform_device *dev) | |
| 1446 | +static int __devexit serial_omap_remove(struct platform_device *dev) | |
| 1566 | 1447 | { |
| 1567 | 1448 | struct uart_omap_port *up = platform_get_drvdata(dev); |
| 1568 | 1449 | |
| 1569 | − if (up) { | |
| 1570 | − pm_runtime_disable(&up->pdev->dev); | |
| 1571 | − uart_remove_one_port(&serial_omap_reg, &up->port); | |
| 1572 | − pm_qos_remove_request(&up->pm_qos_request); | |
| 1573 | − } | |
| 1450 | + pm_runtime_put_sync(up->dev); | |
| 1451 | + pm_runtime_disable(up->dev); | |
| 1452 | + uart_remove_one_port(&serial_omap_reg, &up->port); | |
| 1453 | + pm_qos_remove_request(&up->pm_qos_request); | |
| 1574 | 1454 | |
| 1575 | − platform_set_drvdata(dev, NULL); | |
| 1576 | 1455 | return 0; |
| 1577 | 1456 | } |
| 1578 | 1457 | |
| @@ -1602,7 +1481,7 @@ static void serial_omap_mdr1_errataset(struct uart_omap_port *up, u8 mdr1) · 23 unmodified lines | ||
| 1602 | 1481 | timeout--; |
| 1603 | 1482 | if (!timeout) { |
| 1604 | 1483 | /* Should *never* happen. we warn and carry on */ |
| 1605 | − dev_crit(&up->pdev->dev, "Errata i202: timedout %x\n", | |
| 1484 | + dev_crit(up->dev, "Errata i202: timedout %x\n", | |
| 1606 | 1485 | serial_in(up, UART_LSR)); |
| 1607 | 1486 | break; |
| 1608 | 1487 | } |
| @@ -1648,29 +1527,23 @@ static int serial_omap_runtime_suspend(struct device *dev) · 39 unmodified lines | ||
| 1648 | 1527 | if (!up) |
| 1649 | 1528 | return -EINVAL; |
| 1650 | 1529 | |
| 1651 | − if (!pdata || !pdata->enable_wakeup) | |
| 1530 | + if (!pdata) | |
| 1652 | 1531 | return 0; |
| 1653 | 1532 | |
| 1654 | − if (pdata->get_context_loss_count) | |
| 1655 | − up->context_loss_cnt = pdata->get_context_loss_count(dev); | |
| 1533 | + up->context_loss_cnt = serial_omap_get_context_loss_count(up); | |
| 1656 | 1534 | |
| 1657 | 1535 | if (device_may_wakeup(dev)) { |
| 1658 | 1536 | if (!up->wakeups_enabled) { |
| 1659 | − pdata->enable_wakeup(up->pdev, true); | |
| 1537 | + serial_omap_enable_wakeup(up, true); | |
| 1660 | 1538 | up->wakeups_enabled = true; |
| 1661 | 1539 | } |
| 1662 | 1540 | } else { |
| 1663 | 1541 | if (up->wakeups_enabled) { |
| 1664 | − pdata->enable_wakeup(up->pdev, false); | |
| 1542 | + serial_omap_enable_wakeup(up, false); | |
| 1665 | 1543 | up->wakeups_enabled = false; |
| 1666 | 1544 | } |
| 1667 | 1545 | } |
| 1668 | 1546 | |
| 1669 | − /* Errata i291 */ | |
| 1670 | − if (up->use_dma && pdata->set_forceidle && | |
| 1671 | − (up->errata & UART_ERRATA_i291_DMA_FORCEIDLE)) | |
| 1672 | − pdata->set_forceidle(up->pdev); | |
| 1673 | − | |
| 1674 | 1547 | up->latency = PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE; |
| 1675 | 1548 | schedule_work(&up->qos_work); |
| 1676 | 1549 | |
| @@ -1683,17 +1556,10 @@ static int serial_omap_runtime_resume(struct device *dev) · 6 unmodified lines | ||
| 1683 | 1556 | struct omap_uart_port_info *pdata = dev->platform_data; |
| 1684 | 1557 | |
| 1685 | 1558 | if (up && pdata) { |
| 1686 | − if (pdata->get_context_loss_count) { | |
| 1687 | − u32 loss_cnt = pdata->get_context_loss_count(dev); | |
| 1559 | + u32 loss_cnt = serial_omap_get_context_loss_count(up); | |
| 1688 | 1560 | |
| 1689 | 1561 | if (up->context_loss_cnt != loss_cnt) |
| 1690 | 1562 | serial_omap_restore_context(up); |
| 1691 | − } | |
| 1692 | − | |
| 1693 | − /* Errata i291 */ | |
| 1694 | − if (up->use_dma && pdata->set_noidle && | |
| 1695 | − (up->errata & UART_ERRATA_i291_DMA_FORCEIDLE)) | |
| 1696 | − pdata->set_noidle(up->pdev); | |
| 1697 | 1563 | |
| 1698 | 1564 | up->latency = up->calc_latency; |
| 1699 | 1565 | schedule_work(&up->qos_work); |
| @@ -1721,7 +1587,7 @@ MODULE_DEVICE_TABLE(of, omap_serial_of_match); · 21 unmodified lines | ||
| 1721 | 1587 | |
| 1722 | 1588 | static struct platform_driver serial_omap_driver = { |
| 1723 | 1589 | .probe = serial_omap_probe, |
| 1724 | − .remove = serial_omap_remove, | |
| 1590 | + .remove = __devexit_p(serial_omap_remove), | |
| 1725 | 1591 | .driver = { |
| 1726 | 1592 | .name = DRIVER_NAME, |
| 1727 | 1593 | .pm = &serial_omap_dev_pm_ops, |
| @@ -979,6 +979,10 @@ static unsigned int dma_handle_tx(struct eg20t_port *priv) · 978 unmodified lines | ||
| 979 | 979 | priv->tx_dma_use = 1; |
| 980 | 980 | |
| 981 | 981 | priv->sg_tx_p = kzalloc(sizeof(struct scatterlist)*num, GFP_ATOMIC); |
| 982 | + if (!priv->sg_tx_p) { | |
| 983 | + dev_err(priv->port.dev, "%s:kzalloc Failed\n", __func__); | |
| 984 | + return 0; | |
| 985 | + } | |
| 982 | 986 | |
| 983 | 987 | sg_init_table(priv->sg_tx_p, num); /* Initialize SG table */ |
| 984 | 988 | sg = priv->sg_tx_p; |
| @@ -670,9 +670,19 @@ serial_pxa_console_write(struct console *co, const char *s, unsigned int count) · 669 unmodified lines | ||
| 670 | 670 | { |
| 671 | 671 | struct uart_pxa_port *up = serial_pxa_ports[co->index]; |
| 672 | 672 | unsigned int ier; |
| 673 | + unsigned long flags; | |
| 674 | + int locked = 1; | |
| 673 | 675 | |
| 674 | 676 | clk_prepare_enable(up->clk); |
| 675 | 677 | |
| 678 | + local_irq_save(flags); | |
| 679 | + if (up->port.sysrq) | |
| 680 | + locked = 0; | |
| 681 | + else if (oops_in_progress) | |
| 682 | + locked = spin_trylock(&up->port.lock); | |
| 683 | + else | |
| 684 | + spin_lock(&up->port.lock); | |
| 685 | + | |
| 676 | 686 | /* |
| 677 | 687 | * First save the IER then disable the interrupts |
| 678 | 688 | */ |
| @@ -688,6 +698,10 @@ serial_pxa_console_write(struct console *co, const char *s, unsigned int count) · 9 unmodified lines | ||
| 688 | 698 | wait_for_xmitr(up); |
| 689 | 699 | serial_out(up, UART_IER, ier); |
| 690 | 700 | |
| 701 | + if (locked) | |
| 702 | + spin_unlock(&up->port.lock); | |
| 703 | + local_irq_restore(flags); | |
| 704 | + | |
| 691 | 705 | clk_disable_unprepare(up->clk); |
| 692 | 706 | } |
| 693 | 707 | |
| @@ -82,7 +82,7 @@ static inline const char *s3c24xx_serial_portname(struct uart_port *port) · 81 unmodified lines | ||
| 82 | 82 | |
| 83 | 83 | static int s3c24xx_serial_txempty_nofifo(struct uart_port *port) |
| 84 | 84 | { |
| 85 | − return (rd_regl(port, S3C2410_UTRSTAT) & S3C2410_UTRSTAT_TXE); | |
| 85 | + return rd_regl(port, S3C2410_UTRSTAT) & S3C2410_UTRSTAT_TXE; | |
| 86 | 86 | } |
| 87 | 87 | |
| 88 | 88 | /* |
| @@ -268,7 +268,7 @@ s3c24xx_serial_rx_chars(int irq, void *dev_id) · 179 unmodified lines | ||
| 268 | 268 | dbg("break!\n"); |
| 269 | 269 | port->icount.brk++; |
| 270 | 270 | if (uart_handle_break(port)) |
| 271 | − goto ignore_char; | |
| 271 | + goto ignore_char; | |
| 272 | 272 | } |
| 273 | 273 | |
| 274 | 274 | if (uerstat & S3C2410_UERSTAT_FRAME) |
| @@ -459,7 +459,7 @@ static int s3c24xx_serial_startup(struct uart_port *port) · 184 unmodified lines | ||
| 459 | 459 | s3c24xx_serial_portname(port), ourport); |
| 460 | 460 | |
| 461 | 461 | if (ret != 0) { |
| 462 | − printk(KERN_ERR "cannot get irq %d\n", ourport->rx_irq); | |
| 462 | + dev_err(port->dev, "cannot get irq %d\n", ourport->rx_irq); | |
| 463 | 463 | return ret; |
| 464 | 464 | } |
| 465 | 465 | |
| @@ -473,7 +473,7 @@ static int s3c24xx_serial_startup(struct uart_port *port) · 7 unmodified lines | ||
| 473 | 473 | s3c24xx_serial_portname(port), ourport); |
| 474 | 474 | |
| 475 | 475 | if (ret) { |
| 476 | − printk(KERN_ERR "cannot get irq %d\n", ourport->tx_irq); | |
| 476 | + dev_err(port->dev, "cannot get irq %d\n", ourport->tx_irq); | |
| 477 | 477 | goto err; |
| 478 | 478 | } |
| 479 | 479 | |
| @@ -502,7 +502,7 @@ static int s3c64xx_serial_startup(struct uart_port *port) · 22 unmodified lines | ||
| 502 | 502 | ret = request_irq(port->irq, s3c64xx_serial_handle_irq, IRQF_SHARED, |
| 503 | 503 | s3c24xx_serial_portname(port), ourport); |
| 504 | 504 | if (ret) { |
| 505 | − printk(KERN_ERR "cannot get irq %d\n", port->irq); | |
| 505 | + dev_err(port->dev, "cannot get irq %d\n", port->irq); | |
| 506 | 506 | return ret; |
| 507 | 507 | } |
| 508 | 508 | |
| @@ -529,7 +529,7 @@ static void s3c24xx_serial_pm(struct uart_port *port, unsigned int level, · 20 unmodified lines | ||
| 529 | 529 | |
| 530 | 530 | switch (level) { |
| 531 | 531 | case 3: |
| 532 | − if (!IS_ERR(ourport->baudclk) && ourport->baudclk != NULL) | |
| 532 | + if (!IS_ERR(ourport->baudclk)) | |
| 533 | 533 | clk_disable(ourport->baudclk); |
| 534 | 534 | |
| 535 | 535 | clk_disable(ourport->clk); |
| @@ -538,12 +538,12 @@ static void s3c24xx_serial_pm(struct uart_port *port, unsigned int level, · 2 unmodified lines | ||
| 538 | 538 | case 0: |
| 539 | 539 | clk_enable(ourport->clk); |
| 540 | 540 | |
| 541 | − if (!IS_ERR(ourport->baudclk) && ourport->baudclk != NULL) | |
| 541 | + if (!IS_ERR(ourport->baudclk)) | |
| 542 | 542 | clk_enable(ourport->baudclk); |
| 543 | 543 | |
| 544 | 544 | break; |
| 545 | 545 | default: |
| 546 | − printk(KERN_ERR "s3c24xx_serial: unknown pm %d\n", level); | |
| 546 | + dev_err(port->dev, "s3c24xx_serial: unknown pm %d\n", level); | |
| 547 | 547 | } |
| 548 | 548 | } |
| 549 | 549 | |
| @@ -604,7 +604,6 @@ static unsigned int s3c24xx_serial_getclk(struct s3c24xx_uart_port *ourport, · 54 unmodified lines | ||
| 604 | 604 | char clkname[MAX_CLK_NAME_LENGTH]; |
| 605 | 605 | int calc_deviation, deviation = (1 << 30) - 1; |
| 606 | 606 | |
| 607 | − *best_clk = NULL; | |
| 608 | 607 | clk_sel = (ourport->cfg->clk_sel) ? ourport->cfg->clk_sel : |
| 609 | 608 | ourport->info->def_clk_sel; |
| 610 | 609 | for (cnt = 0; cnt < info->num_clks; cnt++) { |
| @@ -613,7 +612,7 @@ static unsigned int s3c24xx_serial_getclk(struct s3c24xx_uart_port *ourport, · 2 unmodified lines | ||
| 613 | 612 | |
| 614 | 613 | sprintf(clkname, "clk_uart_baud%d", cnt); |
| 615 | 614 | clk = clk_get(ourport->port.dev, clkname); |
| 616 | − if (IS_ERR_OR_NULL(clk)) | |
| 615 | + if (IS_ERR(clk)) | |
| 617 | 616 | continue; |
| 618 | 617 | |
| 619 | 618 | rate = clk_get_rate(clk); |
| @@ -684,7 +683,7 @@ static void s3c24xx_serial_set_termios(struct uart_port *port, · 64 unmodified lines | ||
| 684 | 683 | { |
| 685 | 684 | struct s3c2410_uartcfg *cfg = s3c24xx_port_to_cfg(port); |
| 686 | 685 | struct s3c24xx_uart_port *ourport = to_ourport(port); |
| 687 | − struct clk *clk = NULL; | |
| 686 | + struct clk *clk = ERR_PTR(-EINVAL); | |
| 688 | 687 | unsigned long flags; |
| 689 | 688 | unsigned int baud, quot, clk_sel = 0; |
| 690 | 689 | unsigned int ulcon; |
| @@ -705,7 +704,7 @@ static void s3c24xx_serial_set_termios(struct uart_port *port, · 14 unmodified lines | ||
| 705 | 704 | quot = s3c24xx_serial_getclk(ourport, baud, &clk, &clk_sel); |
| 706 | 705 | if (baud == 38400 && (port->flags & UPF_SPD_MASK) == UPF_SPD_CUST) |
| 707 | 706 | quot = port->custom_divisor; |
| 708 | − if (!clk) | |
| 707 | + if (IS_ERR(clk)) | |
| 709 | 708 | return; |
| 710 | 709 | |
| 711 | 710 | /* check to see if we need to change clock source */ |
| @@ -713,9 +712,9 @@ static void s3c24xx_serial_set_termios(struct uart_port *port, · 1 unmodified line | ||
| 713 | 712 | if (ourport->baudclk != clk) { |
| 714 | 713 | s3c24xx_serial_setsource(port, clk_sel); |
| 715 | 714 | |
| 716 | − if (ourport->baudclk != NULL && !IS_ERR(ourport->baudclk)) { | |
| 715 | + if (!IS_ERR(ourport->baudclk)) { | |
| 717 | 716 | clk_disable(ourport->baudclk); |
| 718 | − ourport->baudclk = NULL; | |
| 717 | + ourport->baudclk = ERR_PTR(-EINVAL); | |
| 719 | 718 | } |
| 720 | 719 | |
| 721 | 720 | clk_enable(clk); |
| @@ -1036,10 +1035,10 @@ static int s3c24xx_serial_cpufreq_transition(struct notifier_block *nb, · 314 unmodified lines | ||
| 1036 | 1035 | if (tty == NULL) |
| 1037 | 1036 | goto exit; |
| 1038 | 1037 | |
| 1039 | − termios = tty->termios; | |
| 1038 | + termios = &tty->termios; | |
| 1040 | 1039 | |
| 1041 | 1040 | if (termios == NULL) { |
| 1042 | − printk(KERN_WARNING "%s: no termios?\n", __func__); | |
| 1041 | + dev_warn(uport->dev, "%s: no termios?\n", __func__); | |
| 1043 | 1042 | goto exit; |
| 1044 | 1043 | } |
| 1045 | 1044 | |
| @@ -1114,7 +1113,7 @@ static int s3c24xx_serial_init_port(struct s3c24xx_uart_port *ourport, · 68 unmodified lines | ||
| 1114 | 1113 | |
| 1115 | 1114 | res = platform_get_resource(platdev, IORESOURCE_MEM, 0); |
| 1116 | 1115 | if (res == NULL) { |
| 1117 | − printk(KERN_ERR "failed to find memory resource for uart\n"); | |
| 1116 | + dev_err(port->dev, "failed to find memory resource for uart\n"); | |
| 1118 | 1117 | return -EINVAL; |
| 1119 | 1118 | } |
| 1120 | 1119 | |
| @@ -1130,7 +1129,7 @@ static int s3c24xx_serial_init_port(struct s3c24xx_uart_port *ourport, · 9 unmodified lines | ||
| 1130 | 1129 | ourport->rx_irq = ret; |
| 1131 | 1130 | ourport->tx_irq = ret + 1; |
| 1132 | 1131 | } |
| 1133 | − | |
| 1132 | + | |
| 1134 | 1133 | ret = platform_get_irq(platdev, 1); |
| 1135 | 1134 | if (ret > 0) |
| 1136 | 1135 | ourport->tx_irq = ret; |
| @@ -1160,7 +1159,11 @@ static ssize_t s3c24xx_serial_show_clksrc(struct device *dev, · 23 unmodified lines | ||
| 1160 | 1159 | struct uart_port *port = s3c24xx_dev_to_port(dev); |
| 1161 | 1160 | struct s3c24xx_uart_port *ourport = to_ourport(port); |
| 1162 | 1161 | |
| 1163 | − return snprintf(buf, PAGE_SIZE, "* %s\n", ourport->baudclk->name); | |
| 1162 | + if (IS_ERR(ourport->baudclk)) | |
| 1163 | + return -EINVAL; | |
| 1164 | + | |
| 1165 | + return snprintf(buf, PAGE_SIZE, "* %s\n", | |
| 1166 | + ourport->baudclk->name ?: "(null)"); | |
| 1164 | 1167 | } |
| 1165 | 1168 | |
| 1166 | 1169 | static DEVICE_ATTR(clock_source, S_IRUGO, s3c24xx_serial_show_clksrc, NULL); |
| @@ -1200,6 +1203,7 @@ static int s3c24xx_serial_probe(struct platform_device *pdev) · 33 unmodified lines | ||
| 1200 | 1203 | return -ENODEV; |
| 1201 | 1204 | } |
| 1202 | 1205 | |
| 1206 | + ourport->baudclk = ERR_PTR(-EINVAL); | |
| 1203 | 1207 | ourport->info = ourport->drv_data->info; |
| 1204 | 1208 | ourport->cfg = (pdev->dev.platform_data) ? |
| 1205 | 1209 | (struct s3c2410_uartcfg *)pdev->dev.platform_data : |
| @@ -1387,7 +1391,7 @@ s3c24xx_serial_get_options(struct uart_port *port, int *baud, · 181 unmodified lines | ||
| 1387 | 1391 | sprintf(clk_name, "clk_uart_baud%d", clk_sel); |
| 1388 | 1392 | |
| 1389 | 1393 | clk = clk_get(port->dev, clk_name); |
| 1390 | − if (!IS_ERR(clk) && clk != NULL) | |
| 1394 | + if (!IS_ERR(clk)) | |
| 1391 | 1395 | rate = clk_get_rate(clk); |
| 1392 | 1396 | else |
| 1393 | 1397 | rate = 1; |
| @@ -1679,7 +1683,7 @@ static int __init s3c24xx_serial_modinit(void) · 285 unmodified lines | ||
| 1679 | 1683 | |
| 1680 | 1684 | ret = uart_register_driver(&s3c24xx_uart_drv); |
| 1681 | 1685 | if (ret < 0) { |
| 1682 | − printk(KERN_ERR "failed to register UART driver\n"); | |
| 1686 | + pr_err("Failed to register Samsung UART driver\n"); | |
| 1683 | 1687 | return -1; |
| 1684 | 1688 | } |
| 1685 | 1689 | |
| @@ -20,6 +20,10 @@ · 19 unmodified lines | ||
| 20 | 20 | #include <linux/init.h> |
| 21 | 21 | #include <linux/platform_device.h> |
| 22 | 22 | #include <linux/irq.h> |
| 23 | +#include <linux/io.h> | |
| 24 | + | |
| 25 | +#warning "Please try migrate to use new driver SCCNXP and report the status" \ | |
| 26 | + "in the linux-serial mailing list." | |
| 23 | 27 | |
| 24 | 28 | #if defined(CONFIG_MAGIC_SYSRQ) |
| 25 | 29 | #define SUPPORT_SYSRQ |
| @@ -0,0 +1,985 @@ | ||
| 1 | +/* | |
| 2 | + * NXP (Philips) SCC+++(SCN+++) serial driver | |
| 3 | + * | |
| 4 | + * Copyright (C) 2012 Alexander Shiyan <shc_work@mail.ru> | |
| 5 | + * | |
| 6 | + * Based on sc26xx.c, by Thomas Bogendörfer (tsbogend@alpha.franken.de) | |
| 7 | + * | |
| 8 | + * This program is free software; you can redistribute it and/or modify | |
| 9 | + * it under the terms of the GNU General Public License as published by | |
| 10 | + * the Free Software Foundation; either version 2 of the License, or | |
| 11 | + * (at your option) any later version. | |
| 12 | + */ | |
| 13 | + | |
| 14 | +#if defined(CONFIG_SERIAL_SCCNXP_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) | |
| 15 | +#define SUPPORT_SYSRQ | |
| 16 | +#endif | |
| 17 | + | |
| 18 | +#include <linux/module.h> | |
| 19 | +#include <linux/device.h> | |
| 20 | +#include <linux/console.h> | |
| 21 | +#include <linux/serial_core.h> | |
| 22 | +#include <linux/serial.h> | |
| 23 | +#include <linux/io.h> | |
| 24 | +#include <linux/tty.h> | |
| 25 | +#include <linux/tty_flip.h> | |
| 26 | +#include <linux/platform_device.h> | |
| 27 | +#include <linux/platform_data/sccnxp.h> | |
| 28 | + | |
| 29 | +#define SCCNXP_NAME "uart-sccnxp" | |
| 30 | +#define SCCNXP_MAJOR 204 | |
| 31 | +#define SCCNXP_MINOR 205 | |
| 32 | + | |
| 33 | +#define SCCNXP_MR_REG (0x00) | |
| 34 | +# define MR0_BAUD_NORMAL (0 << 0) | |
| 35 | +# define MR0_BAUD_EXT1 (1 << 0) | |
| 36 | +# define MR0_BAUD_EXT2 (5 << 0) | |
| 37 | +# define MR0_FIFO (1 << 3) | |
| 38 | +# define MR0_TXLVL (1 << 4) | |
| 39 | +# define MR1_BITS_5 (0 << 0) | |
| 40 | +# define MR1_BITS_6 (1 << 0) | |
| 41 | +# define MR1_BITS_7 (2 << 0) | |
| 42 | +# define MR1_BITS_8 (3 << 0) | |
| 43 | +# define MR1_PAR_EVN (0 << 2) | |
| 44 | +# define MR1_PAR_ODD (1 << 2) | |
| 45 | +# define MR1_PAR_NO (4 << 2) | |
| 46 | +# define MR2_STOP1 (7 << 0) | |
| 47 | +# define MR2_STOP2 (0xf << 0) | |
| 48 | +#define SCCNXP_SR_REG (0x01) | |
| 49 | +#define SCCNXP_CSR_REG SCCNXP_SR_REG | |
| 50 | +# define SR_RXRDY (1 << 0) | |
| 51 | +# define SR_FULL (1 << 1) | |
| 52 | +# define SR_TXRDY (1 << 2) | |
| 53 | +# define SR_TXEMT (1 << 3) | |
| 54 | +# define SR_OVR (1 << 4) | |
| 55 | +# define SR_PE (1 << 5) | |
| 56 | +# define SR_FE (1 << 6) | |
| 57 | +# define SR_BRK (1 << 7) | |
| 58 | +#define SCCNXP_CR_REG (0x02) | |
| 59 | +# define CR_RX_ENABLE (1 << 0) | |
| 60 | +# define CR_RX_DISABLE (1 << 1) | |
| 61 | +# define CR_TX_ENABLE (1 << 2) | |
| 62 | +# define CR_TX_DISABLE (1 << 3) | |
| 63 | +# define CR_CMD_MRPTR1 (0x01 << 4) | |
| 64 | +# define CR_CMD_RX_RESET (0x02 << 4) | |
| 65 | +# define CR_CMD_TX_RESET (0x03 << 4) | |
| 66 | +# define CR_CMD_STATUS_RESET (0x04 << 4) | |
| 67 | +# define CR_CMD_BREAK_RESET (0x05 << 4) | |
| 68 | +# define CR_CMD_START_BREAK (0x06 << 4) | |
| 69 | +# define CR_CMD_STOP_BREAK (0x07 << 4) | |
| 70 | +# define CR_CMD_MRPTR0 (0x0b << 4) | |
| 71 | +#define SCCNXP_RHR_REG (0x03) | |
| 72 | +#define SCCNXP_THR_REG SCCNXP_RHR_REG | |
| 73 | +#define SCCNXP_IPCR_REG (0x04) | |
| 74 | +#define SCCNXP_ACR_REG SCCNXP_IPCR_REG | |
| 75 | +# define ACR_BAUD0 (0 << 7) | |
| 76 | +# define ACR_BAUD1 (1 << 7) | |
| 77 | +# define ACR_TIMER_MODE (6 << 4) | |
| 78 | +#define SCCNXP_ISR_REG (0x05) | |
| 79 | +#define SCCNXP_IMR_REG SCCNXP_ISR_REG | |
| 80 | +# define IMR_TXRDY (1 << 0) | |
| 81 | +# define IMR_RXRDY (1 << 1) | |
| 82 | +# define ISR_TXRDY(x) (1 << ((x * 4) + 0)) | |
| 83 | +# define ISR_RXRDY(x) (1 << ((x * 4) + 1)) | |
| 84 | +#define SCCNXP_IPR_REG (0x0d) | |
| 85 | +#define SCCNXP_OPCR_REG SCCNXP_IPR_REG | |
| 86 | +#define SCCNXP_SOP_REG (0x0e) | |
| 87 | +#define SCCNXP_ROP_REG (0x0f) | |
| 88 | + | |
| 89 | +/* Route helpers */ | |
| 90 | +#define MCTRL_MASK(sig) (0xf << (sig)) | |
| 91 | +#define MCTRL_IBIT(cfg, sig) ((((cfg) >> (sig)) & 0xf) - LINE_IP0) | |
| 92 | +#define MCTRL_OBIT(cfg, sig) ((((cfg) >> (sig)) & 0xf) - LINE_OP0) | |
| 93 | + | |
| 94 | +/* Supported chip types */ | |
| 95 | +enum { | |
| 96 | + SCCNXP_TYPE_SC2681 = 2681, | |
| 97 | + SCCNXP_TYPE_SC2691 = 2691, | |
| 98 | + SCCNXP_TYPE_SC2692 = 2692, | |
| 99 | + SCCNXP_TYPE_SC2891 = 2891, | |
| 100 | + SCCNXP_TYPE_SC2892 = 2892, | |
| 101 | + SCCNXP_TYPE_SC28202 = 28202, | |
| 102 | + SCCNXP_TYPE_SC68681 = 68681, | |
| 103 | + SCCNXP_TYPE_SC68692 = 68692, | |
| 104 | +}; | |
| 105 | + | |
| 106 | +struct sccnxp_port { | |
| 107 | + struct uart_driver uart; | |
| 108 | + struct uart_port port[SCCNXP_MAX_UARTS]; | |
| 109 | + | |
| 110 | + const char *name; | |
| 111 | + int irq; | |
| 112 | + | |
| 113 | + u8 imr; | |
| 114 | + u8 addr_mask; | |
| 115 | + int freq_std; | |
| 116 | + | |
| 117 | + int flags; | |
| 118 | +#define SCCNXP_HAVE_IO 0x00000001 | |
| 119 | +#define SCCNXP_HAVE_MR0 0x00000002 | |
| 120 | + | |
| 121 | +#ifdef CONFIG_SERIAL_SCCNXP_CONSOLE | |
| 122 | + struct console console; | |
| 123 | +#endif | |
| 124 | + | |
| 125 | + struct mutex sccnxp_mutex; | |
| 126 | + | |
| 127 | + struct sccnxp_pdata pdata; | |
| 128 | +}; | |
| 129 | + | |
| 130 | +static inline u8 sccnxp_raw_read(void __iomem *base, u8 reg, u8 shift) | |
| 131 | +{ | |
| 132 | + return readb(base + (reg << shift)); | |
| 133 | +} | |
| 134 | + | |
| 135 | +static inline void sccnxp_raw_write(void __iomem *base, u8 reg, u8 shift, u8 v) | |
| 136 | +{ | |
| 137 | + writeb(v, base + (reg << shift)); | |
| 138 | +} | |
| 139 | + | |
| 140 | +static inline u8 sccnxp_read(struct uart_port *port, u8 reg) | |
| 141 | +{ | |
| 142 | + struct sccnxp_port *s = dev_get_drvdata(port->dev); | |
| 143 | + | |
| 144 | + return sccnxp_raw_read(port->membase, reg & s->addr_mask, | |
| 145 | + port->regshift); | |
| 146 | +} | |
| 147 | + | |
| 148 | +static inline void sccnxp_write(struct uart_port *port, u8 reg, u8 v) | |
| 149 | +{ | |
| 150 | + struct sccnxp_port *s = dev_get_drvdata(port->dev); | |
| 151 | + | |
| 152 | + sccnxp_raw_write(port->membase, reg & s->addr_mask, port->regshift, v); | |
| 153 | +} | |
| 154 | + | |
| 155 | +static inline u8 sccnxp_port_read(struct uart_port *port, u8 reg) | |
| 156 | +{ | |
| 157 | + return sccnxp_read(port, (port->line << 3) + reg); | |
| 158 | +} | |
| 159 | + | |
| 160 | +static inline void sccnxp_port_write(struct uart_port *port, u8 reg, u8 v) | |
| 161 | +{ | |
| 162 | + sccnxp_write(port, (port->line << 3) + reg, v); | |
| 163 | +} | |
| 164 | + | |
| 165 | +static int sccnxp_update_best_err(int a, int b, int *besterr) | |
| 166 | +{ | |
| 167 | + int err = abs(a - b); | |
| 168 | + | |
| 169 | + if ((*besterr < 0) || (*besterr > err)) { | |
| 170 | + *besterr = err; | |
| 171 | + return 0; | |
| 172 | + } | |
| 173 | + | |
| 174 | + return 1; | |
| 175 | +} | |
| 176 | + | |
| 177 | +struct baud_table { | |
| 178 | + u8 csr; | |
| 179 | + u8 acr; | |
| 180 | + u8 mr0; | |
| 181 | + int baud; | |
| 182 | +}; | |
| 183 | + | |
| 184 | +const struct baud_table baud_std[] = { | |
| 185 | + { 0, ACR_BAUD0, MR0_BAUD_NORMAL, 50, }, | |
| 186 | + { 0, ACR_BAUD1, MR0_BAUD_NORMAL, 75, }, | |
| 187 | + { 1, ACR_BAUD0, MR0_BAUD_NORMAL, 110, }, | |
| 188 | + { 2, ACR_BAUD0, MR0_BAUD_NORMAL, 134, }, | |
| 189 | + { 3, ACR_BAUD1, MR0_BAUD_NORMAL, 150, }, | |
| 190 | + { 3, ACR_BAUD0, MR0_BAUD_NORMAL, 200, }, | |
| 191 | + { 4, ACR_BAUD0, MR0_BAUD_NORMAL, 300, }, | |
| 192 | + { 0, ACR_BAUD1, MR0_BAUD_EXT1, 450, }, | |
| 193 | + { 1, ACR_BAUD0, MR0_BAUD_EXT2, 880, }, | |
| 194 | + { 3, ACR_BAUD1, MR0_BAUD_EXT1, 900, }, | |
| 195 | + { 5, ACR_BAUD0, MR0_BAUD_NORMAL, 600, }, | |
| 196 | + { 7, ACR_BAUD0, MR0_BAUD_NORMAL, 1050, }, | |
| 197 | + { 2, ACR_BAUD0, MR0_BAUD_EXT2, 1076, }, | |
| 198 | + { 6, ACR_BAUD0, MR0_BAUD_NORMAL, 1200, }, | |
| 199 | + { 10, ACR_BAUD1, MR0_BAUD_NORMAL, 1800, }, | |
| 200 | + { 7, ACR_BAUD1, MR0_BAUD_NORMAL, 2000, }, | |
| 201 | + { 8, ACR_BAUD0, MR0_BAUD_NORMAL, 2400, }, | |
| 202 | + { 5, ACR_BAUD1, MR0_BAUD_EXT1, 3600, }, | |
| 203 | + { 9, ACR_BAUD0, MR0_BAUD_NORMAL, 4800, }, | |
| 204 | + { 10, ACR_BAUD0, MR0_BAUD_NORMAL, 7200, }, | |
| 205 | + { 11, ACR_BAUD0, MR0_BAUD_NORMAL, 9600, }, | |
| 206 | + { 8, ACR_BAUD0, MR0_BAUD_EXT1, 14400, }, | |
| 207 | + { 12, ACR_BAUD1, MR0_BAUD_NORMAL, 19200, }, | |
| 208 | + { 9, ACR_BAUD0, MR0_BAUD_EXT1, 28800, }, | |
| 209 | + { 12, ACR_BAUD0, MR0_BAUD_NORMAL, 38400, }, | |
| 210 | + { 11, ACR_BAUD0, MR0_BAUD_EXT1, 57600, }, | |
| 211 | + { 12, ACR_BAUD1, MR0_BAUD_EXT1, 115200, }, | |
| 212 | + { 12, ACR_BAUD0, MR0_BAUD_EXT1, 230400, }, | |
| 213 | + { 0, 0, 0, 0 } | |
| 214 | +}; | |
| 215 | + | |
| 216 | +static void sccnxp_set_baud(struct uart_port *port, int baud) | |
| 217 | +{ | |
| 218 | + struct sccnxp_port *s = dev_get_drvdata(port->dev); | |
| 219 | + int div_std, tmp_baud, bestbaud = baud, besterr = -1; | |
| 220 | + u8 i, acr = 0, csr = 0, mr0 = 0; | |
| 221 | + | |
| 222 | + /* Find best baud from table */ | |
| 223 | + for (i = 0; baud_std[i].baud && besterr; i++) { | |
| 224 | + if (baud_std[i].mr0 && !(s->flags & SCCNXP_HAVE_MR0)) | |
| 225 | + continue; | |
| 226 | + div_std = DIV_ROUND_CLOSEST(s->freq_std, baud_std[i].baud); | |
| 227 | + tmp_baud = DIV_ROUND_CLOSEST(port->uartclk, div_std); | |
| 228 | + if (!sccnxp_update_best_err(baud, tmp_baud, &besterr)) { | |
| 229 | + acr = baud_std[i].acr; | |
| 230 | + csr = baud_std[i].csr; | |
| 231 | + mr0 = baud_std[i].mr0; | |
| 232 | + bestbaud = tmp_baud; | |
| 233 | + } | |
| 234 | + } | |
| 235 | + | |
| 236 | + if (s->flags & SCCNXP_HAVE_MR0) { | |
| 237 | + /* Enable FIFO, set half level for TX */ | |
| 238 | + mr0 |= MR0_FIFO | MR0_TXLVL; | |
| 239 | + /* Update MR0 */ | |
| 240 | + sccnxp_port_write(port, SCCNXP_CR_REG, CR_CMD_MRPTR0); | |
| 241 | + sccnxp_port_write(port, SCCNXP_MR_REG, mr0); | |
| 242 | + } | |
| 243 | + | |
| 244 | + sccnxp_port_write(port, SCCNXP_ACR_REG, acr | ACR_TIMER_MODE); | |
| 245 | + sccnxp_port_write(port, SCCNXP_CSR_REG, (csr << 4) | csr); | |
| 246 | + | |
| 247 | + dev_dbg(port->dev, "Baudrate desired: %i, calculated: %i\n", | |
| 248 | + baud, bestbaud); | |
| 249 | +} | |
| 250 | + | |
| 251 | +static void sccnxp_enable_irq(struct uart_port *port, int mask) | |
| 252 | +{ | |
| 253 | + struct sccnxp_port *s = dev_get_drvdata(port->dev); | |
| 254 | + | |
| 255 | + s->imr |= mask << (port->line * 4); | |
| 256 | + sccnxp_write(port, SCCNXP_IMR_REG, s->imr); | |
| 257 | +} | |
| 258 | + | |
| 259 | +static void sccnxp_disable_irq(struct uart_port *port, int mask) | |
| 260 | +{ | |
| 261 | + struct sccnxp_port *s = dev_get_drvdata(port->dev); | |
| 262 | + | |
| 263 | + s->imr &= ~(mask << (port->line * 4)); | |
| 264 | + sccnxp_write(port, SCCNXP_IMR_REG, s->imr); | |
| 265 | +} | |
| 266 | + | |
| 267 | +static void sccnxp_set_bit(struct uart_port *port, int sig, int state) | |
| 268 | +{ | |
| 269 | + u8 bitmask; | |
| 270 | + struct sccnxp_port *s = dev_get_drvdata(port->dev); | |
| 271 | + | |
| 272 | + if (s->pdata.mctrl_cfg[port->line] & MCTRL_MASK(sig)) { | |
| 273 | + bitmask = 1 << MCTRL_OBIT(s->pdata.mctrl_cfg[port->line], sig); | |
| 274 | + if (state) | |
| 275 | + sccnxp_write(port, SCCNXP_SOP_REG, bitmask); | |
| 276 | + else | |
| 277 | + sccnxp_write(port, SCCNXP_ROP_REG, bitmask); | |
| 278 | + } | |
| 279 | +} | |
| 280 | + | |
| 281 | +static void sccnxp_handle_rx(struct uart_port *port) | |
| 282 | +{ | |
| 283 | + u8 sr; | |
| 284 | + unsigned int ch, flag; | |
| 285 | + struct tty_struct *tty = tty_port_tty_get(&port->state->port); | |
| 286 | + | |
| 287 | + if (!tty) | |
| 288 | + return; | |
| 289 | + | |
| 290 | + for (;;) { | |
| 291 | + sr = sccnxp_port_read(port, SCCNXP_SR_REG); | |
| 292 | + if (!(sr & SR_RXRDY)) | |
| 293 | + break; | |
| 294 | + sr &= SR_PE | SR_FE | SR_OVR | SR_BRK; | |
| 295 | + | |
| 296 | + ch = sccnxp_port_read(port, SCCNXP_RHR_REG); | |
| 297 | + | |
| 298 | + port->icount.rx++; | |
| 299 | + flag = TTY_NORMAL; | |
| 300 | + | |
| 301 | + if (unlikely(sr)) { | |
| 302 | + if (sr & SR_BRK) { | |
| 303 | + port->icount.brk++; | |
| 304 | + if (uart_handle_break(port)) | |
| 305 | + continue; | |
| 306 | + } else if (sr & SR_PE) | |
| 307 | + port->icount.parity++; | |
| 308 | + else if (sr & SR_FE) | |
| 309 | + port->icount.frame++; | |
| 310 | + else if (sr & SR_OVR) | |
| 311 | + port->icount.overrun++; | |
| 312 | + | |
| 313 | + sr &= port->read_status_mask; | |
| 314 | + if (sr & SR_BRK) | |
| 315 | + flag = TTY_BREAK; | |
| 316 | + else if (sr & SR_PE) | |
| 317 | + flag = TTY_PARITY; | |
| 318 | + else if (sr & SR_FE) | |
| 319 | + flag = TTY_FRAME; | |
| 320 | + else if (sr & SR_OVR) | |
| 321 | + flag = TTY_OVERRUN; | |
| 322 | + } | |
| 323 | + | |
| 324 | + if (uart_handle_sysrq_char(port, ch)) | |
| 325 | + continue; | |
| 326 | + | |
| 327 | + if (sr & port->ignore_status_mask) | |
| 328 | + continue; | |
| 329 | + | |
| 330 | + uart_insert_char(port, sr, SR_OVR, ch, flag); | |
| 331 | + } | |
| 332 | + | |
| 333 | + tty_flip_buffer_push(tty); | |
| 334 | + | |
| 335 | + tty_kref_put(tty); | |
| 336 | +} | |
| 337 | + | |
| 338 | +static void sccnxp_handle_tx(struct uart_port *port) | |
| 339 | +{ | |
| 340 | + u8 sr; | |
| 341 | + struct circ_buf *xmit = &port->state->xmit; | |
| 342 | + struct sccnxp_port *s = dev_get_drvdata(port->dev); | |
| 343 | + | |
| 344 | + if (unlikely(port->x_char)) { | |
| 345 | + sccnxp_port_write(port, SCCNXP_THR_REG, port->x_char); | |
| 346 | + port->icount.tx++; | |
| 347 | + port->x_char = 0; | |
| 348 | + return; | |
| 349 | + } | |
| 350 | + | |
| 351 | + if (uart_circ_empty(xmit) || uart_tx_stopped(port)) { | |
| 352 | + /* Disable TX if FIFO is empty */ | |
| 353 | + if (sccnxp_port_read(port, SCCNXP_SR_REG) & SR_TXEMT) { | |
| 354 | + sccnxp_disable_irq(port, IMR_TXRDY); | |
| 355 | + | |
| 356 | + /* Set direction to input */ | |
| 357 | + if (s->flags & SCCNXP_HAVE_IO) | |
| 358 | + sccnxp_set_bit(port, DIR_OP, 0); | |
| 359 | + } | |
| 360 | + return; | |
| 361 | + } | |
| 362 | + | |
| 363 | + while (!uart_circ_empty(xmit)) { | |
| 364 | + sr = sccnxp_port_read(port, SCCNXP_SR_REG); | |
| 365 | + if (!(sr & SR_TXRDY)) | |
| 366 | + break; | |
| 367 | + | |
| 368 | + sccnxp_port_write(port, SCCNXP_THR_REG, xmit->buf[xmit->tail]); | |
| 369 | + xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); | |
| 370 | + port->icount.tx++; | |
| 371 | + } | |
| 372 | + | |
| 373 | + if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) | |
| 374 | + uart_write_wakeup(port); | |
| 375 | +} | |
| 376 | + | |
| 377 | +static irqreturn_t sccnxp_ist(int irq, void *dev_id) | |
| 378 | +{ | |
| 379 | + int i; | |
| 380 | + u8 isr; | |
| 381 | + struct sccnxp_port *s = (struct sccnxp_port *)dev_id; | |
| 382 | + | |
| 383 | + mutex_lock(&s->sccnxp_mutex); | |
| 384 | + | |
| 385 | + for (;;) { | |
| 386 | + isr = sccnxp_read(&s->port[0], SCCNXP_ISR_REG); | |
| 387 | + isr &= s->imr; | |
| 388 | + if (!isr) | |
| 389 | + break; | |
| 390 | + | |
| 391 | + dev_dbg(s->port[0].dev, "IRQ status: 0x%02x\n", isr); | |
| 392 | + | |
| 393 | + for (i = 0; i < s->uart.nr; i++) { | |
| 394 | + if (isr & ISR_RXRDY(i)) | |
| 395 | + sccnxp_handle_rx(&s->port[i]); | |
| 396 | + if (isr & ISR_TXRDY(i)) | |
| 397 | + sccnxp_handle_tx(&s->port[i]); | |
| 398 | + } | |
| 399 | + } | |
| 400 | + | |
| 401 | + mutex_unlock(&s->sccnxp_mutex); | |
| 402 | + | |
| 403 | + return IRQ_HANDLED; | |
| 404 | +} | |
| 405 | + | |
| 406 | +static void sccnxp_start_tx(struct uart_port *port) | |
| 407 | +{ | |
| 408 | + struct sccnxp_port *s = dev_get_drvdata(port->dev); | |
| 409 | + | |
| 410 | + mutex_lock(&s->sccnxp_mutex); | |
| 411 | + | |
| 412 | + /* Set direction to output */ | |
| 413 | + if (s->flags & SCCNXP_HAVE_IO) | |
| 414 | + sccnxp_set_bit(port, DIR_OP, 1); | |
| 415 | + | |
| 416 | + sccnxp_enable_irq(port, IMR_TXRDY); | |
| 417 | + | |
| 418 | + mutex_unlock(&s->sccnxp_mutex); | |
| 419 | +} | |
| 420 | + | |
| 421 | +static void sccnxp_stop_tx(struct uart_port *port) | |
| 422 | +{ | |
| 423 | + /* Do nothing */ | |
| 424 | +} | |
| 425 | + | |
| 426 | +static void sccnxp_stop_rx(struct uart_port *port) | |
| 427 | +{ | |
| 428 | + struct sccnxp_port *s = dev_get_drvdata(port->dev); | |
| 429 | + | |
| 430 | + mutex_lock(&s->sccnxp_mutex); | |
| 431 | + sccnxp_port_write(port, SCCNXP_CR_REG, CR_RX_DISABLE); | |
| 432 | + mutex_unlock(&s->sccnxp_mutex); | |
| 433 | +} | |
| 434 | + | |
| 435 | +static unsigned int sccnxp_tx_empty(struct uart_port *port) | |
| 436 | +{ | |
| 437 | + u8 val; | |
| 438 | + struct sccnxp_port *s = dev_get_drvdata(port->dev); | |
| 439 | + | |
| 440 | + mutex_lock(&s->sccnxp_mutex); | |
| 441 | + val = sccnxp_port_read(port, SCCNXP_SR_REG); | |
| 442 | + mutex_unlock(&s->sccnxp_mutex); | |
| 443 | + | |
| 444 | + return (val & SR_TXEMT) ? TIOCSER_TEMT : 0; | |
| 445 | +} | |
| 446 | + | |
| 447 | +static void sccnxp_enable_ms(struct uart_port *port) | |
| 448 | +{ | |
| 449 | + /* Do nothing */ | |
| 450 | +} | |
| 451 | + | |
| 452 | +static void sccnxp_set_mctrl(struct uart_port *port, unsigned int mctrl) | |
| 453 | +{ | |
| 454 | + struct sccnxp_port *s = dev_get_drvdata(port->dev); | |
| 455 | + | |
| 456 | + if (!(s->flags & SCCNXP_HAVE_IO)) | |
| 457 | + return; | |
| 458 | + | |
| 459 | + mutex_lock(&s->sccnxp_mutex); | |
| 460 | + | |
| 461 | + sccnxp_set_bit(port, DTR_OP, mctrl & TIOCM_DTR); | |
| 462 | + sccnxp_set_bit(port, RTS_OP, mctrl & TIOCM_RTS); | |
| 463 | + | |
| 464 | + mutex_unlock(&s->sccnxp_mutex); | |
| 465 | +} | |
| 466 | + | |
| 467 | +static unsigned int sccnxp_get_mctrl(struct uart_port *port) | |
| 468 | +{ | |
| 469 | + u8 bitmask, ipr; | |
| 470 | + struct sccnxp_port *s = dev_get_drvdata(port->dev); | |
| 471 | + unsigned int mctrl = TIOCM_DSR | TIOCM_CTS | TIOCM_CAR; | |
| 472 | + | |
| 473 | + if (!(s->flags & SCCNXP_HAVE_IO)) | |
| 474 | + return mctrl; | |
| 475 | + | |
| 476 | + mutex_lock(&s->sccnxp_mutex); | |
| 477 | + | |
| 478 | + ipr = ~sccnxp_read(port, SCCNXP_IPCR_REG); | |
| 479 | + | |
| 480 | + if (s->pdata.mctrl_cfg[port->line] & MCTRL_MASK(DSR_IP)) { | |
| 481 | + bitmask = 1 << MCTRL_IBIT(s->pdata.mctrl_cfg[port->line], | |
| 482 | + DSR_IP); | |
| 483 | + mctrl &= ~TIOCM_DSR; | |
| 484 | + mctrl |= (ipr & bitmask) ? TIOCM_DSR : 0; | |
| 485 | + } | |
| 486 | + if (s->pdata.mctrl_cfg[port->line] & MCTRL_MASK(CTS_IP)) { | |
| 487 | + bitmask = 1 << MCTRL_IBIT(s->pdata.mctrl_cfg[port->line], | |
| 488 | + CTS_IP); | |
| 489 | + mctrl &= ~TIOCM_CTS; | |
| 490 | + mctrl |= (ipr & bitmask) ? TIOCM_CTS : 0; | |
| 491 | + } | |
| 492 | + if (s->pdata.mctrl_cfg[port->line] & MCTRL_MASK(DCD_IP)) { | |
| 493 | + bitmask = 1 << MCTRL_IBIT(s->pdata.mctrl_cfg[port->line], | |
| 494 | + DCD_IP); | |
| 495 | + mctrl &= ~TIOCM_CAR; | |
| 496 | + mctrl |= (ipr & bitmask) ? TIOCM_CAR : 0; | |
| 497 | + } | |
| 498 | + if (s->pdata.mctrl_cfg[port->line] & MCTRL_MASK(RNG_IP)) { | |
| 499 | + bitmask = 1 << MCTRL_IBIT(s->pdata.mctrl_cfg[port->line], | |
| 500 | + RNG_IP); | |
| 501 | + mctrl &= ~TIOCM_RNG; | |
| 502 | + mctrl |= (ipr & bitmask) ? TIOCM_RNG : 0; | |
| 503 | + } | |
| 504 | + | |
| 505 | + mutex_unlock(&s->sccnxp_mutex); | |
| 506 | + | |
| 507 | + return mctrl; | |
| 508 | +} | |
| 509 | + | |
| 510 | +static void sccnxp_break_ctl(struct uart_port *port, int break_state) | |
| 511 | +{ | |
| 512 | + struct sccnxp_port *s = dev_get_drvdata(port->dev); | |
| 513 | + | |
| 514 | + mutex_lock(&s->sccnxp_mutex); | |
| 515 | + sccnxp_port_write(port, SCCNXP_CR_REG, break_state ? | |
| 516 | + CR_CMD_START_BREAK : CR_CMD_STOP_BREAK); | |
| 517 | + mutex_unlock(&s->sccnxp_mutex); | |
| 518 | +} | |
| 519 | + | |
| 520 | +static void sccnxp_set_termios(struct uart_port *port, | |
| 521 | + struct ktermios *termios, struct ktermios *old) | |
| 522 | +{ | |
| 523 | + struct sccnxp_port *s = dev_get_drvdata(port->dev); | |
| 524 | + u8 mr1, mr2; | |
| 525 | + int baud; | |
| 526 | + | |
| 527 | + mutex_lock(&s->sccnxp_mutex); | |
| 528 | + | |
| 529 | + /* Mask termios capabilities we don't support */ | |
| 530 | + termios->c_cflag &= ~CMSPAR; | |
| 531 | + termios->c_iflag &= ~(IXON | IXOFF | IXANY); | |
| 532 | + | |
| 533 | + /* Disable RX & TX, reset break condition, status and FIFOs */ | |
| 534 | + sccnxp_port_write(port, SCCNXP_CR_REG, CR_CMD_RX_RESET | | |
| 535 | + CR_RX_DISABLE | CR_TX_DISABLE); | |
| 536 | + sccnxp_port_write(port, SCCNXP_CR_REG, CR_CMD_TX_RESET); | |
| 537 | + sccnxp_port_write(port, SCCNXP_CR_REG, CR_CMD_STATUS_RESET); | |
| 538 | + sccnxp_port_write(port, SCCNXP_CR_REG, CR_CMD_BREAK_RESET); | |
| 539 | + | |
| 540 | + /* Word size */ | |
| 541 | + switch (termios->c_cflag & CSIZE) { | |
| 542 | + case CS5: | |
| 543 | + mr1 = MR1_BITS_5; | |
| 544 | + break; | |
| 545 | + case CS6: | |
| 546 | + mr1 = MR1_BITS_6; | |
| 547 | + break; | |
| 548 | + case CS7: | |
| 549 | + mr1 = MR1_BITS_7; | |
| 550 | + break; | |
| 551 | + default: | |
| 552 | + case CS8: | |
| 553 | + mr1 = MR1_BITS_8; | |
| 554 | + break; | |
| 555 | + } | |
| 556 | + | |
| 557 | + /* Parity */ | |
| 558 | + if (termios->c_cflag & PARENB) { | |
| 559 | + if (termios->c_cflag & PARODD) | |
| 560 | + mr1 |= MR1_PAR_ODD; | |
| 561 | + } else | |
| 562 | + mr1 |= MR1_PAR_NO; | |
| 563 | + | |
| 564 | + /* Stop bits */ | |
| 565 | + mr2 = (termios->c_cflag & CSTOPB) ? MR2_STOP2 : MR2_STOP1; | |
| 566 | + | |
| 567 | + /* Update desired format */ | |
| 568 | + sccnxp_port_write(port, SCCNXP_CR_REG, CR_CMD_MRPTR1); | |
| 569 | + sccnxp_port_write(port, SCCNXP_MR_REG, mr1); | |
| 570 | + sccnxp_port_write(port, SCCNXP_MR_REG, mr2); | |
| 571 | + | |
| 572 | + /* Set read status mask */ | |
| 573 | + port->read_status_mask = SR_OVR; | |
| 574 | + if (termios->c_iflag & INPCK) | |
| 575 | + port->read_status_mask |= SR_PE | SR_FE; | |
| 576 | + if (termios->c_iflag & (BRKINT | PARMRK)) | |
| 577 | + port->read_status_mask |= SR_BRK; | |
| 578 | + | |
| 579 | + /* Set status ignore mask */ | |
| 580 | + port->ignore_status_mask = 0; | |
| 581 | + if (termios->c_iflag & IGNBRK) | |
| 582 | + port->ignore_status_mask |= SR_BRK; | |
| 583 | + if (!(termios->c_cflag & CREAD)) | |
| 584 | + port->ignore_status_mask |= SR_PE | SR_OVR | SR_FE | SR_BRK; | |
| 585 | + | |
| 586 | + /* Setup baudrate */ | |
| 587 | + baud = uart_get_baud_rate(port, termios, old, 50, | |
| 588 | + (s->flags & SCCNXP_HAVE_MR0) ? | |
| 589 | + 230400 : 38400); | |
| 590 | + sccnxp_set_baud(port, baud); | |
| 591 | + | |
| 592 | + /* Update timeout according to new baud rate */ | |
| 593 | + uart_update_timeout(port, termios->c_cflag, baud); | |
| 594 | + | |
| 595 | + /* Enable RX & TX */ | |
| 596 | + sccnxp_port_write(port, SCCNXP_CR_REG, CR_RX_ENABLE | CR_TX_ENABLE); | |
| 597 | + | |
| 598 | + mutex_unlock(&s->sccnxp_mutex); | |
| 599 | +} | |
| 600 | + | |
| 601 | +static int sccnxp_startup(struct uart_port *port) | |
| 602 | +{ | |
| 603 | + struct sccnxp_port *s = dev_get_drvdata(port->dev); | |
| 604 | + | |
| 605 | + mutex_lock(&s->sccnxp_mutex); | |
| 606 | + | |
| 607 | + if (s->flags & SCCNXP_HAVE_IO) { | |
| 608 | + /* Outputs are controlled manually */ | |
| 609 | + sccnxp_write(port, SCCNXP_OPCR_REG, 0); | |
| 610 | + } | |
| 611 | + | |
| 612 | + /* Reset break condition, status and FIFOs */ | |
| 613 | + sccnxp_port_write(port, SCCNXP_CR_REG, CR_CMD_RX_RESET); | |
| 614 | + sccnxp_port_write(port, SCCNXP_CR_REG, CR_CMD_TX_RESET); | |
| 615 | + sccnxp_port_write(port, SCCNXP_CR_REG, CR_CMD_STATUS_RESET); | |
| 616 | + sccnxp_port_write(port, SCCNXP_CR_REG, CR_CMD_BREAK_RESET); | |
| 617 | + | |
| 618 | + /* Enable RX & TX */ | |
| 619 | + sccnxp_port_write(port, SCCNXP_CR_REG, CR_RX_ENABLE | CR_TX_ENABLE); | |
| 620 | + | |
| 621 | + /* Enable RX interrupt */ | |
| 622 | + sccnxp_enable_irq(port, IMR_RXRDY); | |
| 623 | + | |
| 624 | + mutex_unlock(&s->sccnxp_mutex); | |
| 625 | + | |
| 626 | + return 0; | |
| 627 | +} | |
| 628 | + | |
| 629 | +static void sccnxp_shutdown(struct uart_port *port) | |
| 630 | +{ | |
| 631 | + struct sccnxp_port *s = dev_get_drvdata(port->dev); | |
| 632 | + | |
| 633 | + mutex_lock(&s->sccnxp_mutex); | |
| 634 | + | |
| 635 | + /* Disable interrupts */ | |
| 636 | + sccnxp_disable_irq(port, IMR_TXRDY | IMR_RXRDY); | |
| 637 | + | |
| 638 | + /* Disable TX & RX */ | |
| 639 | + sccnxp_port_write(port, SCCNXP_CR_REG, CR_RX_DISABLE | CR_TX_DISABLE); | |
| 640 | + | |
| 641 | + /* Leave direction to input */ | |
| 642 | + if (s->flags & SCCNXP_HAVE_IO) | |
| 643 | + sccnxp_set_bit(port, DIR_OP, 0); | |
| 644 | + | |
| 645 | + mutex_unlock(&s->sccnxp_mutex); | |
| 646 | +} | |
| 647 | + | |
| 648 | +static const char *sccnxp_type(struct uart_port *port) | |
| 649 | +{ | |
| 650 | + struct sccnxp_port *s = dev_get_drvdata(port->dev); | |
| 651 | + | |
| 652 | + return (port->type == PORT_SC26XX) ? s->name : NULL; | |
| 653 | +} | |
| 654 | + | |
| 655 | +static void sccnxp_release_port(struct uart_port *port) | |
| 656 | +{ | |
| 657 | + /* Do nothing */ | |
| 658 | +} | |
| 659 | + | |
| 660 | +static int sccnxp_request_port(struct uart_port *port) | |
| 661 | +{ | |
| 662 | + /* Do nothing */ | |
| 663 | + return 0; | |
| 664 | +} | |
| 665 | + | |
| 666 | +static void sccnxp_config_port(struct uart_port *port, int flags) | |
| 667 | +{ | |
| 668 | + if (flags & UART_CONFIG_TYPE) | |
| 669 | + port->type = PORT_SC26XX; | |
| 670 | +} | |
| 671 | + | |
| 672 | +static int sccnxp_verify_port(struct uart_port *port, struct serial_struct *s) | |
| 673 | +{ | |
| 674 | + if ((s->type == PORT_UNKNOWN) || (s->type == PORT_SC26XX)) | |
| 675 | + return 0; | |
| 676 | + if (s->irq == port->irq) | |
| 677 | + return 0; | |
| 678 | + | |
| 679 | + return -EINVAL; | |
| 680 | +} | |
| 681 | + | |
| 682 | +static const struct uart_ops sccnxp_ops = { | |
| 683 | + .tx_empty = sccnxp_tx_empty, | |
| 684 | + .set_mctrl = sccnxp_set_mctrl, | |
| 685 | + .get_mctrl = sccnxp_get_mctrl, | |
| 686 | + .stop_tx = sccnxp_stop_tx, | |
| 687 | + .start_tx = sccnxp_start_tx, | |
| 688 | + .stop_rx = sccnxp_stop_rx, | |
| 689 | + .enable_ms = sccnxp_enable_ms, | |
| 690 | + .break_ctl = sccnxp_break_ctl, | |
| 691 | + .startup = sccnxp_startup, | |
| 692 | + .shutdown = sccnxp_shutdown, | |
| 693 | + .set_termios = sccnxp_set_termios, | |
| 694 | + .type = sccnxp_type, | |
| 695 | + .release_port = sccnxp_release_port, | |
| 696 | + .request_port = sccnxp_request_port, | |
| 697 | + .config_port = sccnxp_config_port, | |
| 698 | + .verify_port = sccnxp_verify_port, | |
| 699 | +}; | |
| 700 | + | |
| 701 | +#ifdef CONFIG_SERIAL_SCCNXP_CONSOLE | |
| 702 | +static void sccnxp_console_putchar(struct uart_port *port, int c) | |
| 703 | +{ | |
| 704 | + int tryes = 100000; | |
| 705 | + | |
| 706 | + while (tryes--) { | |
| 707 | + if (sccnxp_port_read(port, SCCNXP_SR_REG) & SR_TXRDY) { | |
| 708 | + sccnxp_port_write(port, SCCNXP_THR_REG, c); | |
| 709 | + break; | |
| 710 | + } | |
| 711 | + barrier(); | |
| 712 | + } | |
| 713 | +} | |
| 714 | + | |
| 715 | +static void sccnxp_console_write(struct console *co, const char *c, unsigned n) | |
| 716 | +{ | |
| 717 | + struct sccnxp_port *s = (struct sccnxp_port *)co->data; | |
| 718 | + struct uart_port *port = &s->port[co->index]; | |
| 719 | + | |
| 720 | + mutex_lock(&s->sccnxp_mutex); | |
| 721 | + uart_console_write(port, c, n, sccnxp_console_putchar); | |
| 722 | + mutex_unlock(&s->sccnxp_mutex); | |
| 723 | +} | |
| 724 | + | |
| 725 | +static int sccnxp_console_setup(struct console *co, char *options) | |
| 726 | +{ | |
| 727 | + struct sccnxp_port *s = (struct sccnxp_port *)co->data; | |
| 728 | + struct uart_port *port = &s->port[(co->index > 0) ? co->index : 0]; | |
| 729 | + int baud = 9600, bits = 8, parity = 'n', flow = 'n'; | |
| 730 | + | |
| 731 | + if (options) | |
| 732 | + uart_parse_options(options, &baud, &parity, &bits, &flow); | |
| 733 | + | |
| 734 | + return uart_set_options(port, co, baud, parity, bits, flow); | |
| 735 | +} | |
| 736 | +#endif | |
| 737 | + | |
| 738 | +static int __devinit sccnxp_probe(struct platform_device *pdev) | |
| 739 | +{ | |
| 740 | + struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | |
| 741 | + int chiptype = pdev->id_entry->driver_data; | |
| 742 | + struct sccnxp_pdata *pdata = dev_get_platdata(&pdev->dev); | |
| 743 | + int i, ret, fifosize, freq_min, freq_max; | |
| 744 | + struct sccnxp_port *s; | |
| 745 | + void __iomem *membase; | |
| 746 | + | |
| 747 | + if (!res) { | |
| 748 | + dev_err(&pdev->dev, "Missing memory resource data\n"); | |
| 749 | + return -EADDRNOTAVAIL; | |
| 750 | + } | |
| 751 | + | |
| 752 | + dev_set_name(&pdev->dev, SCCNXP_NAME); | |
| 753 | + | |
| 754 | + s = devm_kzalloc(&pdev->dev, sizeof(struct sccnxp_port), GFP_KERNEL); | |
| 755 | + if (!s) { | |
| 756 | + dev_err(&pdev->dev, "Error allocating port structure\n"); | |
| 757 | + return -ENOMEM; | |
| 758 | + } | |
| 759 | + platform_set_drvdata(pdev, s); | |
| 760 | + | |
| 761 | + mutex_init(&s->sccnxp_mutex); | |
| 762 | + | |
| 763 | + /* Individual chip settings */ | |
| 764 | + switch (chiptype) { | |
| 765 | + case SCCNXP_TYPE_SC2681: | |
| 766 | + s->name = "SC2681"; | |
| 767 | + s->uart.nr = 2; | |
| 768 | + s->freq_std = 3686400; | |
| 769 | + s->addr_mask = 0x0f; | |
| 770 | + s->flags = SCCNXP_HAVE_IO; | |
| 771 | + fifosize = 3; | |
| 772 | + freq_min = 1000000; | |
| 773 | + freq_max = 4000000; | |
| 774 | + break; | |
| 775 | + case SCCNXP_TYPE_SC2691: | |
| 776 | + s->name = "SC2691"; | |
| 777 | + s->uart.nr = 1; | |
| 778 | + s->freq_std = 3686400; | |
| 779 | + s->addr_mask = 0x07; | |
| 780 | + s->flags = 0; | |
| 781 | + fifosize = 3; | |
| 782 | + freq_min = 1000000; | |
| 783 | + freq_max = 4000000; | |
| 784 | + break; | |
| 785 | + case SCCNXP_TYPE_SC2692: | |
| 786 | + s->name = "SC2692"; | |
| 787 | + s->uart.nr = 2; | |
| 788 | + s->freq_std = 3686400; | |
| 789 | + s->addr_mask = 0x0f; | |
| 790 | + s->flags = SCCNXP_HAVE_IO; | |
| 791 | + fifosize = 3; | |
| 792 | + freq_min = 1000000; | |
| 793 | + freq_max = 4000000; | |
| 794 | + break; | |
| 795 | + case SCCNXP_TYPE_SC2891: | |
| 796 | + s->name = "SC2891"; | |
| 797 | + s->uart.nr = 1; | |
| 798 | + s->freq_std = 3686400; | |
| 799 | + s->addr_mask = 0x0f; | |
| 800 | + s->flags = SCCNXP_HAVE_IO | SCCNXP_HAVE_MR0; | |
| 801 | + fifosize = 16; | |
| 802 | + freq_min = 100000; | |
| 803 | + freq_max = 8000000; | |
| 804 | + break; | |
| 805 | + case SCCNXP_TYPE_SC2892: | |
| 806 | + s->name = "SC2892"; | |
| 807 | + s->uart.nr = 2; | |
| 808 | + s->freq_std = 3686400; | |
| 809 | + s->addr_mask = 0x0f; | |
| 810 | + s->flags = SCCNXP_HAVE_IO | SCCNXP_HAVE_MR0; | |
| 811 | + fifosize = 16; | |
| 812 | + freq_min = 100000; | |
| 813 | + freq_max = 8000000; | |
| 814 | + break; | |
| 815 | + case SCCNXP_TYPE_SC28202: | |
| 816 | + s->name = "SC28202"; | |
| 817 | + s->uart.nr = 2; | |
| 818 | + s->freq_std = 14745600; | |
| 819 | + s->addr_mask = 0x7f; | |
| 820 | + s->flags = SCCNXP_HAVE_IO | SCCNXP_HAVE_MR0; | |
| 821 | + fifosize = 256; | |
| 822 | + freq_min = 1000000; | |
| 823 | + freq_max = 50000000; | |
| 824 | + break; | |
| 825 | + case SCCNXP_TYPE_SC68681: | |
| 826 | + s->name = "SC68681"; | |
| 827 | + s->uart.nr = 2; | |
| 828 | + s->freq_std = 3686400; | |
| 829 | + s->addr_mask = 0x0f; | |
| 830 | + s->flags = SCCNXP_HAVE_IO; | |
| 831 | + fifosize = 3; | |
| 832 | + freq_min = 1000000; | |
| 833 | + freq_max = 4000000; | |
| 834 | + break; | |
| 835 | + case SCCNXP_TYPE_SC68692: | |
| 836 | + s->name = "SC68692"; | |
| 837 | + s->uart.nr = 2; | |
| 838 | + s->freq_std = 3686400; | |
| 839 | + s->addr_mask = 0x0f; | |
| 840 | + s->flags = SCCNXP_HAVE_IO; | |
| 841 | + fifosize = 3; | |
| 842 | + freq_min = 1000000; | |
| 843 | + freq_max = 4000000; | |
| 844 | + break; | |
| 845 | + default: | |
| 846 | + dev_err(&pdev->dev, "Unsupported chip type %i\n", chiptype); | |
| 847 | + ret = -ENOTSUPP; | |
| 848 | + goto err_out; | |
| 849 | + } | |
| 850 | + | |
| 851 | + if (!pdata) { | |
| 852 | + dev_warn(&pdev->dev, | |
| 853 | + "No platform data supplied, using defaults\n"); | |
| 854 | + s->pdata.frequency = s->freq_std; | |
| 855 | + } else | |
| 856 | + memcpy(&s->pdata, pdata, sizeof(struct sccnxp_pdata)); | |
| 857 | + | |
| 858 | + s->irq = platform_get_irq(pdev, 0); | |
| 859 | + if (s->irq <= 0) { | |
| 860 | + dev_err(&pdev->dev, "Missing irq resource data\n"); | |
| 861 | + ret = -ENXIO; | |
| 862 | + goto err_out; | |
| 863 | + } | |
| 864 | + | |
| 865 | + /* Check input frequency */ | |
| 866 | + if ((s->pdata.frequency < freq_min) || | |
| 867 | + (s->pdata.frequency > freq_max)) { | |
| 868 | + dev_err(&pdev->dev, "Frequency out of bounds\n"); | |
| 869 | + ret = -EINVAL; | |
| 870 | + goto err_out; | |
| 871 | + } | |
| 872 | + | |
| 873 | + membase = devm_request_and_ioremap(&pdev->dev, res); | |
| 874 | + if (!membase) { | |
| 875 | + dev_err(&pdev->dev, "Failed to ioremap\n"); | |
| 876 | + ret = -EIO; | |
| 877 | + goto err_out; | |
| 878 | + } | |
| 879 | + | |
| 880 | + s->uart.owner = THIS_MODULE; | |
| 881 | + s->uart.dev_name = "ttySC"; | |
| 882 | + s->uart.major = SCCNXP_MAJOR; | |
| 883 | + s->uart.minor = SCCNXP_MINOR; | |
| 884 | +#ifdef CONFIG_SERIAL_SCCNXP_CONSOLE | |
| 885 | + s->uart.cons = &s->console; | |
| 886 | + s->uart.cons->device = uart_console_device; | |
| 887 | + s->uart.cons->write = sccnxp_console_write; | |
| 888 | + s->uart.cons->setup = sccnxp_console_setup; | |
| 889 | + s->uart.cons->flags = CON_PRINTBUFFER; | |
| 890 | + s->uart.cons->index = -1; | |
| 891 | + s->uart.cons->data = s; | |
| 892 | + strcpy(s->uart.cons->name, "ttySC"); | |
| 893 | +#endif | |
| 894 | + ret = uart_register_driver(&s->uart); | |
| 895 | + if (ret) { | |
| 896 | + dev_err(&pdev->dev, "Registering UART driver failed\n"); | |
| 897 | + goto err_out; | |
| 898 | + } | |
| 899 | + | |
| 900 | + for (i = 0; i < s->uart.nr; i++) { | |
| 901 | + s->port[i].line = i; | |
| 902 | + s->port[i].dev = &pdev->dev; | |
| 903 | + s->port[i].irq = s->irq; | |
| 904 | + s->port[i].type = PORT_SC26XX; | |
| 905 | + s->port[i].fifosize = fifosize; | |
| 906 | + s->port[i].flags = UPF_SKIP_TEST | UPF_FIXED_TYPE; | |
| 907 | + s->port[i].iotype = UPIO_MEM; | |
| 908 | + s->port[i].mapbase = res->start; | |
| 909 | + s->port[i].membase = membase; | |
| 910 | + s->port[i].regshift = s->pdata.reg_shift; | |
| 911 | + s->port[i].uartclk = s->pdata.frequency; | |
| 912 | + s->port[i].ops = &sccnxp_ops; | |
| 913 | + uart_add_one_port(&s->uart, &s->port[i]); | |
| 914 | + /* Set direction to input */ | |
| 915 | + if (s->flags & SCCNXP_HAVE_IO) | |
| 916 | + sccnxp_set_bit(&s->port[i], DIR_OP, 0); | |
| 917 | + } | |
| 918 | + | |
| 919 | + /* Disable interrupts */ | |
| 920 | + s->imr = 0; | |
| 921 | + sccnxp_write(&s->port[0], SCCNXP_IMR_REG, 0); | |
| 922 | + | |
| 923 | + /* Board specific configure */ | |
| 924 | + if (s->pdata.init) | |
| 925 | + s->pdata.init(); | |
| 926 | + | |
| 927 | + ret = devm_request_threaded_irq(&pdev->dev, s->irq, NULL, sccnxp_ist, | |
| 928 | + IRQF_TRIGGER_FALLING | IRQF_ONESHOT, | |
| 929 | + dev_name(&pdev->dev), s); | |
| 930 | + if (!ret) | |
| 931 | + return 0; | |
| 932 | + | |
| 933 | + dev_err(&pdev->dev, "Unable to reguest IRQ %i\n", s->irq); | |
| 934 | + | |
| 935 | +err_out: | |
| 936 | + platform_set_drvdata(pdev, NULL); | |
| 937 | + | |
| 938 | + return ret; | |
| 939 | +} | |
| 940 | + | |
| 941 | +static int __devexit sccnxp_remove(struct platform_device *pdev) | |
| 942 | +{ | |
| 943 | + int i; | |
| 944 | + struct sccnxp_port *s = platform_get_drvdata(pdev); | |
| 945 | + | |
| 946 | + devm_free_irq(&pdev->dev, s->irq, s); | |
| 947 | + | |
| 948 | + for (i = 0; i < s->uart.nr; i++) | |
| 949 | + uart_remove_one_port(&s->uart, &s->port[i]); | |
| 950 | + | |
| 951 | + uart_unregister_driver(&s->uart); | |
| 952 | + platform_set_drvdata(pdev, NULL); | |
| 953 | + | |
| 954 | + if (s->pdata.exit) | |
| 955 | + s->pdata.exit(); | |
| 956 | + | |
| 957 | + return 0; | |
| 958 | +} | |
| 959 | + | |
| 960 | +static const struct platform_device_id sccnxp_id_table[] = { | |
| 961 | + { "sc2681", SCCNXP_TYPE_SC2681 }, | |
| 962 | + { "sc2691", SCCNXP_TYPE_SC2691 }, | |
| 963 | + { "sc2692", SCCNXP_TYPE_SC2692 }, | |
| 964 | + { "sc2891", SCCNXP_TYPE_SC2891 }, | |
| 965 | + { "sc2892", SCCNXP_TYPE_SC2892 }, | |
| 966 | + { "sc28202", SCCNXP_TYPE_SC28202 }, | |
| 967 | + { "sc68681", SCCNXP_TYPE_SC68681 }, | |
| 968 | + { "sc68692", SCCNXP_TYPE_SC68692 }, | |
| 969 | +}; | |
| 970 | +MODULE_DEVICE_TABLE(platform, sccnxp_id_table); | |
| 971 | + | |
| 972 | +static struct platform_driver sccnxp_uart_driver = { | |
| 973 | + .driver = { | |
| 974 | + .name = SCCNXP_NAME, | |
| 975 | + .owner = THIS_MODULE, | |
| 976 | + }, | |
| 977 | + .probe = sccnxp_probe, | |
| 978 | + .remove = __devexit_p(sccnxp_remove), | |
| 979 | + .id_table = sccnxp_id_table, | |
| 980 | +}; | |
| 981 | +module_platform_driver(sccnxp_uart_driver); | |
| 982 | + | |
| 983 | +MODULE_LICENSE("GPL v2"); | |
| 984 | +MODULE_AUTHOR("Alexander Shiyan <shc_work@mail.ru>"); | |
| 985 | +MODULE_DESCRIPTION("SCCNXP serial driver"); | |
| @@ -159,7 +159,7 @@ static int uart_port_startup(struct tty_struct *tty, struct uart_state *state, · 158 unmodified lines | ||
| 159 | 159 | retval = uport->ops->startup(uport); |
| 160 | 160 | if (retval == 0) { |
| 161 | 161 | if (uart_console(uport) && uport->cons->cflag) { |
| 162 | − tty->termios->c_cflag = uport->cons->cflag; | |
| 162 | + tty->termios.c_cflag = uport->cons->cflag; | |
| 163 | 163 | uport->cons->cflag = 0; |
| 164 | 164 | } |
| 165 | 165 | /* |
| @@ -172,11 +172,11 @@ static int uart_port_startup(struct tty_struct *tty, struct uart_state *state, · 6 unmodified lines | ||
| 172 | 172 | * Setup the RTS and DTR signals once the |
| 173 | 173 | * port is open and ready to respond. |
| 174 | 174 | */ |
| 175 | − if (tty->termios->c_cflag & CBAUD) | |
| 175 | + if (tty->termios.c_cflag & CBAUD) | |
| 176 | 176 | uart_set_mctrl(uport, TIOCM_RTS | TIOCM_DTR); |
| 177 | 177 | } |
| 178 | 178 | |
| 179 | − if (port->flags & ASYNC_CTS_FLOW) { | |
| 179 | + if (tty_port_cts_enabled(port)) { | |
| 180 | 180 | spin_lock_irq(&uport->lock); |
| 181 | 181 | if (!(uport->ops->get_mctrl(uport) & TIOCM_CTS)) |
| 182 | 182 | tty->hw_stopped = 1; |
| @@ -240,7 +240,7 @@ static void uart_shutdown(struct tty_struct *tty, struct uart_state *state) · 57 unmodified lines | ||
| 240 | 240 | /* |
| 241 | 241 | * Turn off DTR and RTS early. |
| 242 | 242 | */ |
| 243 | − if (!tty || (tty->termios->c_cflag & HUPCL)) | |
| 243 | + if (!tty || (tty->termios.c_cflag & HUPCL)) | |
| 244 | 244 | uart_clear_mctrl(uport, TIOCM_DTR | TIOCM_RTS); |
| 245 | 245 | |
| 246 | 246 | uart_port_shutdown(port); |
| @@ -440,10 +440,10 @@ static void uart_change_speed(struct tty_struct *tty, struct uart_state *state, · 193 unmodified lines | ||
| 440 | 440 | * If we have no tty, termios, or the port does not exist, |
| 441 | 441 | * then we can't set the parameters for this port. |
| 442 | 442 | */ |
| 443 | − if (!tty || !tty->termios || uport->type == PORT_UNKNOWN) | |
| 443 | + if (!tty || uport->type == PORT_UNKNOWN) | |
| 444 | 444 | return; |
| 445 | 445 | |
| 446 | − termios = tty->termios; | |
| 446 | + termios = &tty->termios; | |
| 447 | 447 | |
| 448 | 448 | /* |
| 449 | 449 | * Set flags based on termios cflag |
| @@ -614,7 +614,7 @@ static void uart_throttle(struct tty_struct *tty) · 164 unmodified lines | ||
| 614 | 614 | if (I_IXOFF(tty)) |
| 615 | 615 | uart_send_xchar(tty, STOP_CHAR(tty)); |
| 616 | 616 | |
| 617 | − if (tty->termios->c_cflag & CRTSCTS) | |
| 617 | + if (tty->termios.c_cflag & CRTSCTS) | |
| 618 | 618 | uart_clear_mctrl(state->uart_port, TIOCM_RTS); |
| 619 | 619 | } |
| 620 | 620 | |
| @@ -630,42 +630,48 @@ static void uart_unthrottle(struct tty_struct *tty) · 9 unmodified lines | ||
| 630 | 630 | uart_send_xchar(tty, START_CHAR(tty)); |
| 631 | 631 | } |
| 632 | 632 | |
| 633 | − if (tty->termios->c_cflag & CRTSCTS) | |
| 633 | + if (tty->termios.c_cflag & CRTSCTS) | |
| 634 | 634 | uart_set_mctrl(port, TIOCM_RTS); |
| 635 | 635 | } |
| 636 | 636 | |
| 637 | −static int uart_get_info(struct uart_state *state, | |
| 638 | − struct serial_struct __user *retinfo) | |
| 637 | +static void uart_get_info(struct tty_port *port, | |
| 638 | + struct uart_state *state, | |
| 639 | + struct serial_struct *retinfo) | |
| 639 | 640 | { |
| 640 | 641 | struct uart_port *uport = state->uart_port; |
| 641 | − struct tty_port *port = &state->port; | |
| 642 | − struct serial_struct tmp; | |
| 643 | − | |
| 644 | − memset(&tmp, 0, sizeof(tmp)); | |
| 645 | 642 | |
| 646 | − /* Ensure the state we copy is consistent and no hardware changes | |
| 647 | − occur as we go */ | |
| 648 | − mutex_lock(&port->mutex); | |
| 643 | + memset(retinfo, 0, sizeof(*retinfo)); | |
| 649 | 644 | |
| 650 | − tmp.type = uport->type; | |
| 651 | − tmp.line = uport->line; | |
| 652 | − tmp.port = uport->iobase; | |
| 645 | + retinfo->type = uport->type; | |
| 646 | + retinfo->line = uport->line; | |
| 647 | + retinfo->port = uport->iobase; | |
| 653 | 648 | if (HIGH_BITS_OFFSET) |
| 654 | − tmp.port_high = (long) uport->iobase >> HIGH_BITS_OFFSET; | |
| 655 | − tmp.irq = uport->irq; | |
| 656 | − tmp.flags = uport->flags; | |
| 657 | − tmp.xmit_fifo_size = uport->fifosize; | |
| 658 | − tmp.baud_base = uport->uartclk / 16; | |
| 659 | − tmp.close_delay = jiffies_to_msecs(port->close_delay) / 10; | |
| 660 | − tmp.closing_wait = port->closing_wait == ASYNC_CLOSING_WAIT_NONE ? | |
| 649 | + retinfo->port_high = (long) uport->iobase >> HIGH_BITS_OFFSET; | |
| 650 | + retinfo->irq = uport->irq; | |
| 651 | + retinfo->flags = uport->flags; | |
| 652 | + retinfo->xmit_fifo_size = uport->fifosize; | |
| 653 | + retinfo->baud_base = uport->uartclk / 16; | |
| 654 | + retinfo->close_delay = jiffies_to_msecs(port->close_delay) / 10; | |
| 655 | + retinfo->closing_wait = port->closing_wait == ASYNC_CLOSING_WAIT_NONE ? | |
| 661 | 656 | ASYNC_CLOSING_WAIT_NONE : |
| 662 | 657 | jiffies_to_msecs(port->closing_wait) / 10; |
| 663 | − tmp.custom_divisor = uport->custom_divisor; | |
| 664 | − tmp.hub6 = uport->hub6; | |
| 665 | − tmp.io_type = uport->iotype; | |
| 666 | − tmp.iomem_reg_shift = uport->regshift; | |
| 667 | − tmp.iomem_base = (void *)(unsigned long)uport->mapbase; | |
| 658 | + retinfo->custom_divisor = uport->custom_divisor; | |
| 659 | + retinfo->hub6 = uport->hub6; | |
| 660 | + retinfo->io_type = uport->iotype; | |
| 661 | + retinfo->iomem_reg_shift = uport->regshift; | |
| 662 | + retinfo->iomem_base = (void *)(unsigned long)uport->mapbase; | |
| 663 | +} | |
| 668 | 664 | |
| 665 | +static int uart_get_info_user(struct uart_state *state, | |
| 666 | + struct serial_struct __user *retinfo) | |
| 667 | +{ | |
| 668 | + struct tty_port *port = &state->port; | |
| 669 | + struct serial_struct tmp; | |
| 670 | + | |
| 671 | + /* Ensure the state we copy is consistent and no hardware changes | |
| 672 | + occur as we go */ | |
| 673 | + mutex_lock(&port->mutex); | |
| 674 | + uart_get_info(port, state, &tmp); | |
| 669 | 675 | mutex_unlock(&port->mutex); |
| 670 | 676 | |
| 671 | 677 | if (copy_to_user(retinfo, &tmp, sizeof(*retinfo))) |
| @@ -673,42 +679,30 @@ static int uart_get_info(struct uart_state *state, · 1 unmodified line | ||
| 673 | 679 | return 0; |
| 674 | 680 | } |
| 675 | 681 | |
| 676 | −static int uart_set_info(struct tty_struct *tty, struct uart_state *state, | |
| 677 | − struct serial_struct __user *newinfo) | |
| 682 | +static int uart_set_info(struct tty_struct *tty, struct tty_port *port, | |
| 683 | + struct uart_state *state, | |
| 684 | + struct serial_struct *new_info) | |
| 678 | 685 | { |
| 679 | − struct serial_struct new_serial; | |
| 680 | 686 | struct uart_port *uport = state->uart_port; |
| 681 | − struct tty_port *port = &state->port; | |
| 682 | 687 | unsigned long new_port; |
| 683 | 688 | unsigned int change_irq, change_port, closing_wait; |
| 684 | 689 | unsigned int old_custom_divisor, close_delay; |
| 685 | 690 | upf_t old_flags, new_flags; |
| 686 | 691 | int retval = 0; |
| 687 | 692 | |
| 688 | − if (copy_from_user(&new_serial, newinfo, sizeof(new_serial))) | |
| 689 | − return -EFAULT; | |
| 690 | − | |
| 691 | − new_port = new_serial.port; | |
| 693 | + new_port = new_info->port; | |
| 692 | 694 | if (HIGH_BITS_OFFSET) |
| 693 | − new_port += (unsigned long) new_serial.port_high << HIGH_BITS_OFFSET; | |
| 695 | + new_port += (unsigned long) new_info->port_high << HIGH_BITS_OFFSET; | |
| 694 | 696 | |
| 695 | − new_serial.irq = irq_canonicalize(new_serial.irq); | |
| 696 | − close_delay = msecs_to_jiffies(new_serial.close_delay * 10); | |
| 697 | − closing_wait = new_serial.closing_wait == ASYNC_CLOSING_WAIT_NONE ? | |
| 697 | + new_info->irq = irq_canonicalize(new_info->irq); | |
| 698 | + close_delay = msecs_to_jiffies(new_info->close_delay * 10); | |
| 699 | + closing_wait = new_info->closing_wait == ASYNC_CLOSING_WAIT_NONE ? | |
| 698 | 700 | ASYNC_CLOSING_WAIT_NONE : |
| 699 | − msecs_to_jiffies(new_serial.closing_wait * 10); | |
| 701 | + msecs_to_jiffies(new_info->closing_wait * 10); | |
| 700 | 702 | |
| 701 | − /* | |
| 702 | − * This semaphore protects port->count. It is also | |
| 703 | − * very useful to prevent opens. Also, take the | |
| 704 | − * port configuration semaphore to make sure that a | |
| 705 | − * module insertion/removal doesn't change anything | |
| 706 | − * under us. | |
| 707 | − */ | |
| 708 | − mutex_lock(&port->mutex); | |
| 709 | 703 | |
| 710 | 704 | change_irq = !(uport->flags & UPF_FIXED_PORT) |
| 711 | − && new_serial.irq != uport->irq; | |
| 705 | + && new_info->irq != uport->irq; | |
| 712 | 706 | |
| 713 | 707 | /* |
| 714 | 708 | * Since changing the 'type' of the port changes its resource |
| @@ -717,29 +711,29 @@ static int uart_set_info(struct tty_struct *tty, struct uart_state *state, · 2 unmodified lines | ||
| 717 | 711 | */ |
| 718 | 712 | change_port = !(uport->flags & UPF_FIXED_PORT) |
| 719 | 713 | && (new_port != uport->iobase || |
| 720 | − (unsigned long)new_serial.iomem_base != uport->mapbase || | |
| 721 | − new_serial.hub6 != uport->hub6 || | |
| 722 | − new_serial.io_type != uport->iotype || | |
| 723 | − new_serial.iomem_reg_shift != uport->regshift || | |
| 724 | − new_serial.type != uport->type); | |
| 714 | + (unsigned long)new_info->iomem_base != uport->mapbase || | |
| 715 | + new_info->hub6 != uport->hub6 || | |
| 716 | + new_info->io_type != uport->iotype || | |
| 717 | + new_info->iomem_reg_shift != uport->regshift || | |
| 718 | + new_info->type != uport->type); | |
| 725 | 719 | |
| 726 | 720 | old_flags = uport->flags; |
| 727 | − new_flags = new_serial.flags; | |
| 721 | + new_flags = new_info->flags; | |
| 728 | 722 | old_custom_divisor = uport->custom_divisor; |
| 729 | 723 | |
| 730 | 724 | if (!capable(CAP_SYS_ADMIN)) { |
| 731 | 725 | retval = -EPERM; |
| 732 | 726 | if (change_irq || change_port || |
| 733 | − (new_serial.baud_base != uport->uartclk / 16) || | |
| 727 | + (new_info->baud_base != uport->uartclk / 16) || | |
| 734 | 728 | (close_delay != port->close_delay) || |
| 735 | 729 | (closing_wait != port->closing_wait) || |
| 736 | − (new_serial.xmit_fifo_size && | |
| 737 | − new_serial.xmit_fifo_size != uport->fifosize) || | |
| 730 | + (new_info->xmit_fifo_size && | |
| 731 | + new_info->xmit_fifo_size != uport->fifosize) || | |
| 738 | 732 | (((new_flags ^ old_flags) & ~UPF_USR_MASK) != 0)) |
| 739 | 733 | goto exit; |
| 740 | 734 | uport->flags = ((uport->flags & ~UPF_USR_MASK) | |
| 741 | 735 | (new_flags & UPF_USR_MASK)); |
| 742 | − uport->custom_divisor = new_serial.custom_divisor; | |
| 736 | + uport->custom_divisor = new_info->custom_divisor; | |
| 743 | 737 | goto check_and_exit; |
| 744 | 738 | } |
| 745 | 739 | |
| @@ -747,10 +741,10 @@ static int uart_set_info(struct tty_struct *tty, struct uart_state *state, · 1 unmodified line | ||
| 747 | 741 | * Ask the low level driver to verify the settings. |
| 748 | 742 | */ |
| 749 | 743 | if (uport->ops->verify_port) |
| 750 | − retval = uport->ops->verify_port(uport, &new_serial); | |
| 744 | + retval = uport->ops->verify_port(uport, new_info); | |
| 751 | 745 | |
| 752 | − if ((new_serial.irq >= nr_irqs) || (new_serial.irq < 0) || | |
| 753 | − (new_serial.baud_base < 9600)) | |
| 746 | + if ((new_info->irq >= nr_irqs) || (new_info->irq < 0) || | |
| 747 | + (new_info->baud_base < 9600)) | |
| 754 | 748 | retval = -EINVAL; |
| 755 | 749 | |
| 756 | 750 | if (retval) |
| @@ -790,11 +784,11 @@ static int uart_set_info(struct tty_struct *tty, struct uart_state *state, · 33 unmodified lines | ||
| 790 | 784 | uport->ops->release_port(uport); |
| 791 | 785 | |
| 792 | 786 | uport->iobase = new_port; |
| 793 | − uport->type = new_serial.type; | |
| 794 | − uport->hub6 = new_serial.hub6; | |
| 795 | − uport->iotype = new_serial.io_type; | |
| 796 | − uport->regshift = new_serial.iomem_reg_shift; | |
| 797 | − uport->mapbase = (unsigned long)new_serial.iomem_base; | |
| 787 | + uport->type = new_info->type; | |
| 788 | + uport->hub6 = new_info->hub6; | |
| 789 | + uport->iotype = new_info->io_type; | |
| 790 | + uport->regshift = new_info->iomem_reg_shift; | |
| 791 | + uport->mapbase = (unsigned long)new_info->iomem_base; | |
| 798 | 792 | |
| 799 | 793 | /* |
| 800 | 794 | * Claim and map the new regions |
| @@ -835,16 +829,16 @@ static int uart_set_info(struct tty_struct *tty, struct uart_state *state, · 34 unmodified lines | ||
| 835 | 829 | } |
| 836 | 830 | |
| 837 | 831 | if (change_irq) |
| 838 | − uport->irq = new_serial.irq; | |
| 832 | + uport->irq = new_info->irq; | |
| 839 | 833 | if (!(uport->flags & UPF_FIXED_PORT)) |
| 840 | − uport->uartclk = new_serial.baud_base * 16; | |
| 834 | + uport->uartclk = new_info->baud_base * 16; | |
| 841 | 835 | uport->flags = (uport->flags & ~UPF_CHANGE_MASK) | |
| 842 | 836 | (new_flags & UPF_CHANGE_MASK); |
| 843 | − uport->custom_divisor = new_serial.custom_divisor; | |
| 837 | + uport->custom_divisor = new_info->custom_divisor; | |
| 844 | 838 | port->close_delay = close_delay; |
| 845 | 839 | port->closing_wait = closing_wait; |
| 846 | − if (new_serial.xmit_fifo_size) | |
| 847 | − uport->fifosize = new_serial.xmit_fifo_size; | |
| 840 | + if (new_info->xmit_fifo_size) | |
| 841 | + uport->fifosize = new_info->xmit_fifo_size; | |
| 848 | 842 | if (port->tty) |
| 849 | 843 | port->tty->low_latency = |
| 850 | 844 | (uport->flags & UPF_LOW_LATENCY) ? 1 : 0; |
| @@ -873,6 +867,28 @@ static int uart_set_info(struct tty_struct *tty, struct uart_state *state, · 22 unmodified lines | ||
| 873 | 867 | } else |
| 874 | 868 | retval = uart_startup(tty, state, 1); |
| 875 | 869 | exit: |
| 870 | + return retval; | |
| 871 | +} | |
| 872 | + | |
| 873 | +static int uart_set_info_user(struct tty_struct *tty, struct uart_state *state, | |
| 874 | + struct serial_struct __user *newinfo) | |
| 875 | +{ | |
| 876 | + struct serial_struct new_serial; | |
| 877 | + struct tty_port *port = &state->port; | |
| 878 | + int retval; | |
| 879 | + | |
| 880 | + if (copy_from_user(&new_serial, newinfo, sizeof(new_serial))) | |
| 881 | + return -EFAULT; | |
| 882 | + | |
| 883 | + /* | |
| 884 | + * This semaphore protects port->count. It is also | |
| 885 | + * very useful to prevent opens. Also, take the | |
| 886 | + * port configuration semaphore to make sure that a | |
| 887 | + * module insertion/removal doesn't change anything | |
| 888 | + * under us. | |
| 889 | + */ | |
| 890 | + mutex_lock(&port->mutex); | |
| 891 | + retval = uart_set_info(tty, port, state, &new_serial); | |
| 876 | 892 | mutex_unlock(&port->mutex); |
| 877 | 893 | return retval; |
| 878 | 894 | } |
| @@ -1115,11 +1131,11 @@ uart_ioctl(struct tty_struct *tty, unsigned int cmd, · 236 unmodified lines | ||
| 1115 | 1131 | */ |
| 1116 | 1132 | switch (cmd) { |
| 1117 | 1133 | case TIOCGSERIAL: |
| 1118 | − ret = uart_get_info(state, uarg); | |
| 1134 | + ret = uart_get_info_user(state, uarg); | |
| 1119 | 1135 | break; |
| 1120 | 1136 | |
| 1121 | 1137 | case TIOCSSERIAL: |
| 1122 | − ret = uart_set_info(tty, state, uarg); | |
| 1138 | + ret = uart_set_info_user(tty, state, uarg); | |
| 1123 | 1139 | break; |
| 1124 | 1140 | |
| 1125 | 1141 | case TIOCSERCONFIG: |
| @@ -1187,7 +1203,7 @@ static void uart_set_ldisc(struct tty_struct *tty) · 61 unmodified lines | ||
| 1187 | 1203 | struct uart_port *uport = state->uart_port; |
| 1188 | 1204 | |
| 1189 | 1205 | if (uport->ops->set_ldisc) |
| 1190 | − uport->ops->set_ldisc(uport, tty->termios->c_line); | |
| 1206 | + uport->ops->set_ldisc(uport, tty->termios.c_line); | |
| 1191 | 1207 | } |
| 1192 | 1208 | |
| 1193 | 1209 | static void uart_set_termios(struct tty_struct *tty, |
| @@ -1195,7 +1211,7 @@ static void uart_set_termios(struct tty_struct *tty, · 1 unmodified line | ||
| 1195 | 1211 | { |
| 1196 | 1212 | struct uart_state *state = tty->driver_data; |
| 1197 | 1213 | unsigned long flags; |
| 1198 | − unsigned int cflag = tty->termios->c_cflag; | |
| 1214 | + unsigned int cflag = tty->termios.c_cflag; | |
| 1199 | 1215 | |
| 1200 | 1216 | |
| 1201 | 1217 | /* |
| @@ -1206,9 +1222,9 @@ static void uart_set_termios(struct tty_struct *tty, · 4 unmodified lines | ||
| 1206 | 1222 | */ |
| 1207 | 1223 | #define RELEVANT_IFLAG(iflag) ((iflag) & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK)) |
| 1208 | 1224 | if ((cflag ^ old_termios->c_cflag) == 0 && |
| 1209 | − tty->termios->c_ospeed == old_termios->c_ospeed && | |
| 1210 | − tty->termios->c_ispeed == old_termios->c_ispeed && | |
| 1211 | − RELEVANT_IFLAG(tty->termios->c_iflag ^ old_termios->c_iflag) == 0) { | |
| 1225 | + tty->termios.c_ospeed == old_termios->c_ospeed && | |
| 1226 | + tty->termios.c_ispeed == old_termios->c_ispeed && | |
| 1227 | + RELEVANT_IFLAG(tty->termios.c_iflag ^ old_termios->c_iflag) == 0) { | |
| 1212 | 1228 | return; |
| 1213 | 1229 | } |
| 1214 | 1230 | |
| @@ -1960,8 +1976,8 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *uport) · 745 unmodified lines | ||
| 1960 | 1976 | /* |
| 1961 | 1977 | * If that's unset, use the tty termios setting. |
| 1962 | 1978 | */ |
| 1963 | − if (port->tty && port->tty->termios && termios.c_cflag == 0) | |
| 1964 | − termios = *(port->tty->termios); | |
| 1979 | + if (port->tty && termios.c_cflag == 0) | |
| 1980 | + termios = port->tty->termios; | |
| 1965 | 1981 | |
| 1966 | 1982 | if (console_suspend_enabled) |
| 1967 | 1983 | uart_change_pm(state, 0); |
| @@ -2293,6 +2309,36 @@ struct tty_driver *uart_console_device(struct console *co, int *index) · 325 unmodified lines | ||
| 2293 | 2309 | return p->tty_driver; |
| 2294 | 2310 | } |
| 2295 | 2311 | |
| 2312 | +static ssize_t uart_get_attr_uartclk(struct device *dev, | |
| 2313 | + struct device_attribute *attr, char *buf) | |
| 2314 | +{ | |
| 2315 | + int ret; | |
| 2316 | + struct tty_port *port = dev_get_drvdata(dev); | |
| 2317 | + struct uart_state *state = container_of(port, struct uart_state, port); | |
| 2318 | + | |
| 2319 | + mutex_lock(&state->port.mutex); | |
| 2320 | + ret = snprintf(buf, PAGE_SIZE, "%d\n", state->uart_port->uartclk); | |
| 2321 | + mutex_unlock(&state->port.mutex); | |
| 2322 | + | |
| 2323 | + return ret; | |
| 2324 | +} | |
| 2325 | + | |
| 2326 | +static DEVICE_ATTR(uartclk, S_IRUSR | S_IRGRP, uart_get_attr_uartclk, NULL); | |
| 2327 | + | |
| 2328 | +static struct attribute *tty_dev_attrs[] = { | |
| 2329 | + &dev_attr_uartclk.attr, | |
| 2330 | + NULL, | |
| 2331 | + }; | |
| 2332 | + | |
| 2333 | +static const struct attribute_group tty_dev_attr_group = { | |
| 2334 | + .attrs = tty_dev_attrs, | |
| 2335 | + }; | |
| 2336 | + | |
| 2337 | +static const struct attribute_group *tty_dev_attr_groups[] = { | |
| 2338 | + &tty_dev_attr_group, | |
| 2339 | + NULL | |
| 2340 | + }; | |
| 2341 | + | |
| 2296 | 2342 | /** |
| 2297 | 2343 | * uart_add_one_port - attach a driver-defined port structure |
| 2298 | 2344 | * @drv: pointer to the uart low level driver structure for this port |
| @@ -2346,7 +2392,8 @@ int uart_add_one_port(struct uart_driver *drv, struct uart_port *uport) · 47 unmodified lines | ||
| 2346 | 2392 | * Register the port whether it's detected or not. This allows |
| 2347 | 2393 | * setserial to be used to alter this ports parameters. |
| 2348 | 2394 | */ |
| 2349 | − tty_dev = tty_register_device(drv->tty_driver, uport->line, uport->dev); | |
| 2395 | + tty_dev = tty_port_register_device_attr(port, drv->tty_driver, | |
| 2396 | + uport->line, uport->dev, port, tty_dev_attr_groups); | |
| 2350 | 2397 | if (likely(!IS_ERR(tty_dev))) { |
| 2351 | 2398 | device_set_wakeup_capable(tty_dev, 1); |
| 2352 | 2399 | } else { |
| @@ -2492,7 +2539,7 @@ void uart_handle_cts_change(struct uart_port *uport, unsigned int status) · 139 unmodified lines | ||
| 2492 | 2539 | |
| 2493 | 2540 | uport->icount.cts++; |
| 2494 | 2541 | |
| 2495 | − if (port->flags & ASYNC_CTS_FLOW) { | |
| 2542 | + if (tty_port_cts_enabled(port)) { | |
| 2496 | 2543 | if (tty->hw_stopped) { |
| 2497 | 2544 | if (status) { |
| 2498 | 2545 | tty->hw_stopped = 0; |
| @@ -668,7 +668,7 @@ int sirfsoc_uart_probe(struct platform_device *pdev) · 667 unmodified lines | ||
| 668 | 668 | if (res == NULL) { |
| 669 | 669 | dev_err(&pdev->dev, "Insufficient resources.\n"); |
| 670 | 670 | ret = -EFAULT; |
| 671 | − goto irq_err; | |
| 671 | + goto err; | |
| 672 | 672 | } |
| 673 | 673 | port->irq = res->start; |
| 674 | 674 | |
| @@ -676,7 +676,7 @@ int sirfsoc_uart_probe(struct platform_device *pdev) · 1 unmodified line | ||
| 676 | 676 | sirfport->p = pinctrl_get_select_default(&pdev->dev); |
| 677 | 677 | ret = IS_ERR(sirfport->p); |
| 678 | 678 | if (ret) |
| 679 | − goto pin_err; | |
| 679 | + goto err; | |
| 680 | 680 | } |
| 681 | 681 | |
| 682 | 682 | port->ops = &sirfsoc_uart_ops; |
| @@ -695,9 +695,6 @@ port_err: · 12 unmodified lines | ||
| 695 | 695 | platform_set_drvdata(pdev, NULL); |
| 696 | 696 | if (sirfport->hw_flow_ctrl) |
| 697 | 697 | pinctrl_put(sirfport->p); |
| 698 | −pin_err: | |
| 699 | −irq_err: | |
| 700 | − devm_iounmap(&pdev->dev, port->membase); | |
| 701 | 698 | err: |
| 702 | 699 | return ret; |
| 703 | 700 | } |
| @@ -709,7 +706,6 @@ static int sirfsoc_uart_remove(struct platform_device *pdev) · 5 unmodified lines | ||
| 709 | 706 | platform_set_drvdata(pdev, NULL); |
| 710 | 707 | if (sirfport->hw_flow_ctrl) |
| 711 | 708 | pinctrl_put(sirfport->p); |
| 712 | − devm_iounmap(&pdev->dev, port->membase); | |
| 713 | 709 | uart_remove_one_port(&sirfsoc_uart_drv, port); |
| 714 | 710 | return 0; |
| 715 | 711 | } |
| @@ -58,10 +58,16 @@ · 57 unmodified lines | ||
| 58 | 58 | enum su_type { SU_PORT_NONE, SU_PORT_MS, SU_PORT_KBD, SU_PORT_PORT }; |
| 59 | 59 | static char *su_typev[] = { "su(???)", "su(mouse)", "su(kbd)", "su(serial)" }; |
| 60 | 60 | |
| 61 | +struct serial_uart_config { | |
| 62 | + char *name; | |
| 63 | + int dfl_xmit_fifo_size; | |
| 64 | + int flags; | |
| 65 | +}; | |
| 66 | + | |
| 61 | 67 | /* |
| 62 | 68 | * Here we define the default xmit fifo size used for each type of UART. |
| 63 | 69 | */ |
| 64 | −static const struct serial_uart_config uart_config[PORT_MAX_8250+1] = { | |
| 70 | +static const struct serial_uart_config uart_config[] = { | |
| 65 | 71 | { "unknown", 1, 0 }, |
| 66 | 72 | { "8250", 1, 0 }, |
| 67 | 73 | { "16450", 1, 0 }, |
| @@ -1359,7 +1359,7 @@ static void mgsl_isr_io_pin( struct mgsl_struct *info ) · 1358 unmodified lines | ||
| 1359 | 1359 | } |
| 1360 | 1360 | } |
| 1361 | 1361 | |
| 1362 | − if ( (info->port.flags & ASYNC_CTS_FLOW) && | |
| 1362 | + if (tty_port_cts_enabled(&info->port) && | |
| 1363 | 1363 | (status & MISCSTATUS_CTS_LATCHED) ) { |
| 1364 | 1364 | if (info->port.tty->hw_stopped) { |
| 1365 | 1365 | if (status & MISCSTATUS_CTS) { |
| @@ -1840,22 +1840,22 @@ static void shutdown(struct mgsl_struct * info) · 474 unmodified lines | ||
| 1840 | 1840 | usc_DisableInterrupts(info,RECEIVE_DATA + RECEIVE_STATUS + |
| 1841 | 1841 | TRANSMIT_DATA + TRANSMIT_STATUS + IO_PIN + MISC ); |
| 1842 | 1842 | usc_DisableDmaInterrupts(info,DICR_MASTER + DICR_TRANSMIT + DICR_RECEIVE); |
| 1843 | − | |
| 1843 | + | |
| 1844 | 1844 | /* Disable DMAEN (Port 7, Bit 14) */ |
| 1845 | 1845 | /* This disconnects the DMA request signal from the ISA bus */ |
| 1846 | 1846 | /* on the ISA adapter. This has no effect for the PCI adapter */ |
| 1847 | 1847 | usc_OutReg(info, PCR, (u16)((usc_InReg(info, PCR) | BIT15) | BIT14)); |
| 1848 | − | |
| 1848 | + | |
| 1849 | 1849 | /* Disable INTEN (Port 6, Bit12) */ |
| 1850 | 1850 | /* This disconnects the IRQ request signal to the ISA bus */ |
| 1851 | 1851 | /* on the ISA adapter. This has no effect for the PCI adapter */ |
| 1852 | 1852 | usc_OutReg(info, PCR, (u16)((usc_InReg(info, PCR) | BIT13) | BIT12)); |
| 1853 | − | |
| 1854 | − if (!info->port.tty || info->port.tty->termios->c_cflag & HUPCL) { | |
| 1853 | + | |
| 1854 | + if (!info->port.tty || info->port.tty->termios.c_cflag & HUPCL) { | |
| 1855 | 1855 | info->serial_signals &= ~(SerialSignal_DTR + SerialSignal_RTS); |
| 1856 | 1856 | usc_set_serial_signals(info); |
| 1857 | 1857 | } |
| 1858 | − | |
| 1858 | + | |
| 1859 | 1859 | spin_unlock_irqrestore(&info->irq_spinlock,flags); |
| 1860 | 1860 | |
| 1861 | 1861 | mgsl_release_resources(info); |
| @@ -1895,7 +1895,7 @@ static void mgsl_program_hw(struct mgsl_struct *info) · 33 unmodified lines | ||
| 1895 | 1895 | usc_EnableInterrupts(info, IO_PIN); |
| 1896 | 1896 | usc_get_serial_signals(info); |
| 1897 | 1897 | |
| 1898 | − if (info->netcount || info->port.tty->termios->c_cflag & CREAD) | |
| 1898 | + if (info->netcount || info->port.tty->termios.c_cflag & CREAD) | |
| 1899 | 1899 | usc_start_receiver(info); |
| 1900 | 1900 | |
| 1901 | 1901 | spin_unlock_irqrestore(&info->irq_spinlock,flags); |
| @@ -1908,14 +1908,14 @@ static void mgsl_change_params(struct mgsl_struct *info) · 6 unmodified lines | ||
| 1908 | 1908 | unsigned cflag; |
| 1909 | 1909 | int bits_per_char; |
| 1910 | 1910 | |
| 1911 | − if (!info->port.tty || !info->port.tty->termios) | |
| 1911 | + if (!info->port.tty) | |
| 1912 | 1912 | return; |
| 1913 | 1913 | |
| 1914 | 1914 | if (debug_level >= DEBUG_LEVEL_INFO) |
| 1915 | 1915 | printk("%s(%d):mgsl_change_params(%s)\n", |
| 1916 | 1916 | __FILE__,__LINE__, info->device_name ); |
| 1917 | 1917 | |
| 1918 | − cflag = info->port.tty->termios->c_cflag; | |
| 1918 | + cflag = info->port.tty->termios.c_cflag; | |
| 1919 | 1919 | |
| 1920 | 1920 | /* if B0 rate (hangup) specified then negate DTR and RTS */ |
| 1921 | 1921 | /* otherwise assert DTR and RTS */ |
| @@ -2367,8 +2367,8 @@ static void mgsl_throttle(struct tty_struct * tty) · 445 unmodified lines | ||
| 2367 | 2367 | |
| 2368 | 2368 | if (I_IXOFF(tty)) |
| 2369 | 2369 | mgsl_send_xchar(tty, STOP_CHAR(tty)); |
| 2370 | − | |
| 2371 | − if (tty->termios->c_cflag & CRTSCTS) { | |
| 2370 | + | |
| 2371 | + if (tty->termios.c_cflag & CRTSCTS) { | |
| 2372 | 2372 | spin_lock_irqsave(&info->irq_spinlock,flags); |
| 2373 | 2373 | info->serial_signals &= ~SerialSignal_RTS; |
| 2374 | 2374 | usc_set_serial_signals(info); |
| @@ -2401,8 +2401,8 @@ static void mgsl_unthrottle(struct tty_struct * tty) · 26 unmodified lines | ||
| 2401 | 2401 | else |
| 2402 | 2402 | mgsl_send_xchar(tty, START_CHAR(tty)); |
| 2403 | 2403 | } |
| 2404 | − | |
| 2405 | − if (tty->termios->c_cflag & CRTSCTS) { | |
| 2404 | + | |
| 2405 | + if (tty->termios.c_cflag & CRTSCTS) { | |
| 2406 | 2406 | spin_lock_irqsave(&info->irq_spinlock,flags); |
| 2407 | 2407 | info->serial_signals |= SerialSignal_RTS; |
| 2408 | 2408 | usc_set_serial_signals(info); |
| @@ -3045,7 +3045,7 @@ static void mgsl_set_termios(struct tty_struct *tty, struct ktermios *old_termio · 636 unmodified lines | ||
| 3045 | 3045 | |
| 3046 | 3046 | /* Handle transition to B0 status */ |
| 3047 | 3047 | if (old_termios->c_cflag & CBAUD && |
| 3048 | − !(tty->termios->c_cflag & CBAUD)) { | |
| 3048 | + !(tty->termios.c_cflag & CBAUD)) { | |
| 3049 | 3049 | info->serial_signals &= ~(SerialSignal_RTS + SerialSignal_DTR); |
| 3050 | 3050 | spin_lock_irqsave(&info->irq_spinlock,flags); |
| 3051 | 3051 | usc_set_serial_signals(info); |
| @@ -3054,9 +3054,9 @@ static void mgsl_set_termios(struct tty_struct *tty, struct ktermios *old_termio · 2 unmodified lines | ||
| 3054 | 3054 | |
| 3055 | 3055 | /* Handle transition away from B0 status */ |
| 3056 | 3056 | if (!(old_termios->c_cflag & CBAUD) && |
| 3057 | − tty->termios->c_cflag & CBAUD) { | |
| 3057 | + tty->termios.c_cflag & CBAUD) { | |
| 3058 | 3058 | info->serial_signals |= SerialSignal_DTR; |
| 3059 | − if (!(tty->termios->c_cflag & CRTSCTS) || | |
| 3059 | + if (!(tty->termios.c_cflag & CRTSCTS) || | |
| 3060 | 3060 | !test_bit(TTY_THROTTLED, &tty->flags)) { |
| 3061 | 3061 | info->serial_signals |= SerialSignal_RTS; |
| 3062 | 3062 | } |
| @@ -3067,7 +3067,7 @@ static void mgsl_set_termios(struct tty_struct *tty, struct ktermios *old_termio · 4 unmodified lines | ||
| 3067 | 3067 | |
| 3068 | 3068 | /* Handle turning off CRTSCTS */ |
| 3069 | 3069 | if (old_termios->c_cflag & CRTSCTS && |
| 3070 | − !(tty->termios->c_cflag & CRTSCTS)) { | |
| 3070 | + !(tty->termios.c_cflag & CRTSCTS)) { | |
| 3071 | 3071 | tty->hw_stopped = 0; |
| 3072 | 3072 | mgsl_start(tty); |
| 3073 | 3073 | } |
| @@ -3287,7 +3287,7 @@ static int block_til_ready(struct tty_struct *tty, struct file * filp, · 213 unmodified lines | ||
| 3287 | 3287 | return 0; |
| 3288 | 3288 | } |
| 3289 | 3289 | |
| 3290 | − if (tty->termios->c_cflag & CLOCAL) | |
| 3290 | + if (tty->termios.c_cflag & CLOCAL) | |
| 3291 | 3291 | do_clocal = true; |
| 3292 | 3292 | |
| 3293 | 3293 | /* Wait for carrier detect and the line to become |
| @@ -3313,7 +3313,7 @@ static int block_til_ready(struct tty_struct *tty, struct file * filp, · 19 unmodified lines | ||
| 3313 | 3313 | port->blocked_open++; |
| 3314 | 3314 | |
| 3315 | 3315 | while (1) { |
| 3316 | − if (tty->termios->c_cflag & CBAUD) | |
| 3316 | + if (tty->termios.c_cflag & CBAUD) | |
| 3317 | 3317 | tty_port_raise_dtr_rts(port); |
| 3318 | 3318 | |
| 3319 | 3319 | set_current_state(TASK_INTERRUPTIBLE); |
| @@ -3338,9 +3338,9 @@ static int block_til_ready(struct tty_struct *tty, struct file * filp, · 18 unmodified lines | ||
| 3338 | 3338 | printk("%s(%d):block_til_ready blocking on %s count=%d\n", |
| 3339 | 3339 | __FILE__,__LINE__, tty->driver->name, port->count ); |
| 3340 | 3340 | |
| 3341 | − tty_unlock(); | |
| 3341 | + tty_unlock(tty); | |
| 3342 | 3342 | schedule(); |
| 3343 | − tty_lock(); | |
| 3343 | + tty_lock(tty); | |
| 3344 | 3344 | } |
| 3345 | 3345 | |
| 3346 | 3346 | set_current_state(TASK_RUNNING); |
| @@ -3362,6 +3362,29 @@ static int block_til_ready(struct tty_struct *tty, struct file * filp, · 15 unmodified lines | ||
| 3362 | 3362 | |
| 3363 | 3363 | } /* end of block_til_ready() */ |
| 3364 | 3364 | |
| 3365 | +static int mgsl_install(struct tty_driver *driver, struct tty_struct *tty) | |
| 3366 | +{ | |
| 3367 | + struct mgsl_struct *info; | |
| 3368 | + int line = tty->index; | |
| 3369 | + | |
| 3370 | + /* verify range of specified line number */ | |
| 3371 | + if (line >= mgsl_device_count) { | |
| 3372 | + printk("%s(%d):mgsl_open with invalid line #%d.\n", | |
| 3373 | + __FILE__, __LINE__, line); | |
| 3374 | + return -ENODEV; | |
| 3375 | + } | |
| 3376 | + | |
| 3377 | + /* find the info structure for the specified line */ | |
| 3378 | + info = mgsl_device_list; | |
| 3379 | + while (info && info->line != line) | |
| 3380 | + info = info->next_device; | |
| 3381 | + if (mgsl_paranoia_check(info, tty->name, "mgsl_open")) | |
| 3382 | + return -ENODEV; | |
| 3383 | + tty->driver_data = info; | |
| 3384 | + | |
| 3385 | + return tty_port_install(&info->port, driver, tty); | |
| 3386 | +} | |
| 3387 | + | |
| 3365 | 3388 | /* mgsl_open() |
| 3366 | 3389 | * |
| 3367 | 3390 | * Called when a port is opened. Init and enable port. |
| @@ -3374,26 +3397,10 @@ static int block_til_ready(struct tty_struct *tty, struct file * filp, · 6 unmodified lines | ||
| 3374 | 3397 | */ |
| 3375 | 3398 | static int mgsl_open(struct tty_struct *tty, struct file * filp) |
| 3376 | 3399 | { |
| 3377 | − struct mgsl_struct *info; | |
| 3378 | − int retval, line; | |
| 3400 | + struct mgsl_struct *info = tty->driver_data; | |
| 3379 | 3401 | unsigned long flags; |
| 3402 | + int retval; | |
| 3380 | 3403 | |
| 3381 | − /* verify range of specified line number */ | |
| 3382 | − line = tty->index; | |
| 3383 | − if (line >= mgsl_device_count) { | |
| 3384 | − printk("%s(%d):mgsl_open with invalid line #%d.\n", | |
| 3385 | − __FILE__,__LINE__,line); | |
| 3386 | − return -ENODEV; | |
| 3387 | − } | |
| 3388 | − | |
| 3389 | − /* find the info structure for the specified line */ | |
| 3390 | − info = mgsl_device_list; | |
| 3391 | − while(info && info->line != line) | |
| 3392 | − info = info->next_device; | |
| 3393 | − if (mgsl_paranoia_check(info, tty->name, "mgsl_open")) | |
| 3394 | − return -ENODEV; | |
| 3395 | − | |
| 3396 | − tty->driver_data = info; | |
| 3397 | 3404 | info->port.tty = tty; |
| 3398 | 3405 | |
| 3399 | 3406 | if (debug_level >= DEBUG_LEVEL_INFO) |
| @@ -4297,6 +4304,7 @@ static struct mgsl_struct* mgsl_allocate_device(void) · 897 unmodified lines | ||
| 4297 | 4304 | } /* end of mgsl_allocate_device()*/ |
| 4298 | 4305 | |
| 4299 | 4306 | static const struct tty_operations mgsl_ops = { |
| 4307 | + .install = mgsl_install, | |
| 4300 | 4308 | .open = mgsl_open, |
| 4301 | 4309 | .close = mgsl_close, |
| 4302 | 4310 | .write = mgsl_write, |
| @@ -785,7 +785,7 @@ static void set_termios(struct tty_struct *tty, struct ktermios *old_termios) · 784 unmodified lines | ||
| 785 | 785 | |
| 786 | 786 | /* Handle transition to B0 status */ |
| 787 | 787 | if (old_termios->c_cflag & CBAUD && |
| 788 | − !(tty->termios->c_cflag & CBAUD)) { | |
| 788 | + !(tty->termios.c_cflag & CBAUD)) { | |
| 789 | 789 | info->signals &= ~(SerialSignal_RTS + SerialSignal_DTR); |
| 790 | 790 | spin_lock_irqsave(&info->lock,flags); |
| 791 | 791 | set_signals(info); |
| @@ -794,9 +794,9 @@ static void set_termios(struct tty_struct *tty, struct ktermios *old_termios) · 2 unmodified lines | ||
| 794 | 794 | |
| 795 | 795 | /* Handle transition away from B0 status */ |
| 796 | 796 | if (!(old_termios->c_cflag & CBAUD) && |
| 797 | − tty->termios->c_cflag & CBAUD) { | |
| 797 | + tty->termios.c_cflag & CBAUD) { | |
| 798 | 798 | info->signals |= SerialSignal_DTR; |
| 799 | − if (!(tty->termios->c_cflag & CRTSCTS) || | |
| 799 | + if (!(tty->termios.c_cflag & CRTSCTS) || | |
| 800 | 800 | !test_bit(TTY_THROTTLED, &tty->flags)) { |
| 801 | 801 | info->signals |= SerialSignal_RTS; |
| 802 | 802 | } |
| @@ -807,7 +807,7 @@ static void set_termios(struct tty_struct *tty, struct ktermios *old_termios) · 4 unmodified lines | ||
| 807 | 807 | |
| 808 | 808 | /* Handle turning off CRTSCTS */ |
| 809 | 809 | if (old_termios->c_cflag & CRTSCTS && |
| 810 | − !(tty->termios->c_cflag & CRTSCTS)) { | |
| 810 | + !(tty->termios.c_cflag & CRTSCTS)) { | |
| 811 | 811 | tty->hw_stopped = 0; |
| 812 | 812 | tx_release(tty); |
| 813 | 813 | } |
| @@ -1372,7 +1372,7 @@ static void throttle(struct tty_struct * tty) · 558 unmodified lines | ||
| 1372 | 1372 | DBGINFO(("%s throttle\n", info->device_name)); |
| 1373 | 1373 | if (I_IXOFF(tty)) |
| 1374 | 1374 | send_xchar(tty, STOP_CHAR(tty)); |
| 1375 | − if (tty->termios->c_cflag & CRTSCTS) { | |
| 1375 | + if (tty->termios.c_cflag & CRTSCTS) { | |
| 1376 | 1376 | spin_lock_irqsave(&info->lock,flags); |
| 1377 | 1377 | info->signals &= ~SerialSignal_RTS; |
| 1378 | 1378 | set_signals(info); |
| @@ -1397,7 +1397,7 @@ static void unthrottle(struct tty_struct * tty) · 18 unmodified lines | ||
| 1397 | 1397 | else |
| 1398 | 1398 | send_xchar(tty, START_CHAR(tty)); |
| 1399 | 1399 | } |
| 1400 | − if (tty->termios->c_cflag & CRTSCTS) { | |
| 1400 | + if (tty->termios.c_cflag & CRTSCTS) { | |
| 1401 | 1401 | spin_lock_irqsave(&info->lock,flags); |
| 1402 | 1402 | info->signals |= SerialSignal_RTS; |
| 1403 | 1403 | set_signals(info); |
| @@ -2053,7 +2053,7 @@ static void cts_change(struct slgt_info *info, unsigned short status) · 649 unmodified lines | ||
| 2053 | 2053 | wake_up_interruptible(&info->event_wait_q); |
| 2054 | 2054 | info->pending_bh |= BH_STATUS; |
| 2055 | 2055 | |
| 2056 | − if (info->port.flags & ASYNC_CTS_FLOW) { | |
| 2056 | + if (tty_port_cts_enabled(&info->port)) { | |
| 2057 | 2057 | if (info->port.tty) { |
| 2058 | 2058 | if (info->port.tty->hw_stopped) { |
| 2059 | 2059 | if (info->signals & SerialSignal_CTS) { |
| @@ -2493,7 +2493,7 @@ static void shutdown(struct slgt_info *info) · 433 unmodified lines | ||
| 2493 | 2493 | |
| 2494 | 2494 | slgt_irq_off(info, IRQ_ALL | IRQ_MASTER); |
| 2495 | 2495 | |
| 2496 | − if (!info->port.tty || info->port.tty->termios->c_cflag & HUPCL) { | |
| 2496 | + if (!info->port.tty || info->port.tty->termios.c_cflag & HUPCL) { | |
| 2497 | 2497 | info->signals &= ~(SerialSignal_DTR + SerialSignal_RTS); |
| 2498 | 2498 | set_signals(info); |
| 2499 | 2499 | } |
| @@ -2534,7 +2534,7 @@ static void program_hw(struct slgt_info *info) · 34 unmodified lines | ||
| 2534 | 2534 | get_signals(info); |
| 2535 | 2535 | |
| 2536 | 2536 | if (info->netcount || |
| 2537 | − (info->port.tty && info->port.tty->termios->c_cflag & CREAD)) | |
| 2537 | + (info->port.tty && info->port.tty->termios.c_cflag & CREAD)) | |
| 2538 | 2538 | rx_start(info); |
| 2539 | 2539 | |
| 2540 | 2540 | spin_unlock_irqrestore(&info->lock,flags); |
| @@ -2548,11 +2548,11 @@ static void change_params(struct slgt_info *info) · 7 unmodified lines | ||
| 2548 | 2548 | unsigned cflag; |
| 2549 | 2549 | int bits_per_char; |
| 2550 | 2550 | |
| 2551 | − if (!info->port.tty || !info->port.tty->termios) | |
| 2551 | + if (!info->port.tty) | |
| 2552 | 2552 | return; |
| 2553 | 2553 | DBGINFO(("%s change_params\n", info->device_name)); |
| 2554 | 2554 | |
| 2555 | − cflag = info->port.tty->termios->c_cflag; | |
| 2555 | + cflag = info->port.tty->termios.c_cflag; | |
| 2556 | 2556 | |
| 2557 | 2557 | /* if B0 rate (hangup) specified then negate DTR and RTS */ |
| 2558 | 2558 | /* otherwise assert DTR and RTS */ |
| @@ -3292,7 +3292,7 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp, · 733 unmodified lines | ||
| 3292 | 3292 | return 0; |
| 3293 | 3293 | } |
| 3294 | 3294 | |
| 3295 | − if (tty->termios->c_cflag & CLOCAL) | |
| 3295 | + if (tty->termios.c_cflag & CLOCAL) | |
| 3296 | 3296 | do_clocal = true; |
| 3297 | 3297 | |
| 3298 | 3298 | /* Wait for carrier detect and the line to become |
| @@ -3314,7 +3314,7 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp, · 15 unmodified lines | ||
| 3314 | 3314 | port->blocked_open++; |
| 3315 | 3315 | |
| 3316 | 3316 | while (1) { |
| 3317 | − if ((tty->termios->c_cflag & CBAUD)) | |
| 3317 | + if ((tty->termios.c_cflag & CBAUD)) | |
| 3318 | 3318 | tty_port_raise_dtr_rts(port); |
| 3319 | 3319 | |
| 3320 | 3320 | set_current_state(TASK_INTERRUPTIBLE); |
| @@ -3336,9 +3336,9 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp, · 15 unmodified lines | ||
| 3336 | 3336 | } |
| 3337 | 3337 | |
| 3338 | 3338 | DBGINFO(("%s block_til_ready wait\n", tty->driver->name)); |
| 3339 | − tty_unlock(); | |
| 3339 | + tty_unlock(tty); | |
| 3340 | 3340 | schedule(); |
| 3341 | − tty_lock(); | |
| 3341 | + tty_lock(tty); | |
| 3342 | 3342 | } |
| 3343 | 3343 | |
| 3344 | 3344 | set_current_state(TASK_RUNNING); |
| @@ -3689,8 +3689,11 @@ static void device_init(int adapter_num, struct pci_dev *pdev) · 344 unmodified lines | ||
| 3689 | 3689 | } |
| 3690 | 3690 | } |
| 3691 | 3691 | |
| 3692 | − for (i=0; i < port_count; ++i) | |
| 3693 | − tty_register_device(serial_driver, port_array[i]->line, &(port_array[i]->pdev->dev)); | |
| 3692 | + for (i = 0; i < port_count; ++i) { | |
| 3693 | + struct slgt_info *info = port_array[i]; | |
| 3694 | + tty_port_register_device(&info->port, serial_driver, info->line, | |
| 3695 | + &info->pdev->dev); | |
| 3696 | + } | |
| 3694 | 3697 | } |
| 3695 | 3698 | |
| 3696 | 3699 | static int __devinit init_one(struct pci_dev *dev, |
| @@ -711,15 +711,11 @@ static void ldisc_receive_buf(struct tty_struct *tty, · 710 unmodified lines | ||
| 711 | 711 | |
| 712 | 712 | /* tty callbacks */ |
| 713 | 713 | |
| 714 | −/* Called when a port is opened. Init and enable port. | |
| 715 | − */ | |
| 716 | −static int open(struct tty_struct *tty, struct file *filp) | |
| 714 | +static int install(struct tty_driver *driver, struct tty_struct *tty) | |
| 717 | 715 | { |
| 718 | 716 | SLMP_INFO *info; |
| 719 | − int retval, line; | |
| 720 | − unsigned long flags; | |
| 717 | + int line = tty->index; | |
| 721 | 718 | |
| 722 | − line = tty->index; | |
| 723 | 719 | if (line >= synclinkmp_device_count) { |
| 724 | 720 | printk("%s(%d): open with invalid line #%d.\n", |
| 725 | 721 | __FILE__,__LINE__,line); |
| @@ -727,17 +723,30 @@ static int open(struct tty_struct *tty, struct file *filp) · 1 unmodified line | ||
| 727 | 723 | } |
| 728 | 724 | |
| 729 | 725 | info = synclinkmp_device_list; |
| 730 | − while(info && info->line != line) | |
| 726 | + while (info && info->line != line) | |
| 731 | 727 | info = info->next_device; |
| 732 | 728 | if (sanity_check(info, tty->name, "open")) |
| 733 | 729 | return -ENODEV; |
| 734 | − if ( info->init_error ) { | |
| 730 | + if (info->init_error) { | |
| 735 | 731 | printk("%s(%d):%s device is not allocated, init error=%d\n", |
| 736 | − __FILE__,__LINE__,info->device_name,info->init_error); | |
| 732 | + __FILE__, __LINE__, info->device_name, | |
| 733 | + info->init_error); | |
| 737 | 734 | return -ENODEV; |
| 738 | 735 | } |
| 739 | 736 | |
| 740 | 737 | tty->driver_data = info; |
| 738 | + | |
| 739 | + return tty_port_install(&info->port, driver, tty); | |
| 740 | +} | |
| 741 | + | |
| 742 | +/* Called when a port is opened. Init and enable port. | |
| 743 | + */ | |
| 744 | +static int open(struct tty_struct *tty, struct file *filp) | |
| 745 | +{ | |
| 746 | + SLMP_INFO *info = tty->driver_data; | |
| 747 | + unsigned long flags; | |
| 748 | + int retval; | |
| 749 | + | |
| 741 | 750 | info->port.tty = tty; |
| 742 | 751 | |
| 743 | 752 | if (debug_level >= DEBUG_LEVEL_INFO) |
| @@ -873,7 +882,7 @@ static void set_termios(struct tty_struct *tty, struct ktermios *old_termios) · 129 unmodified lines | ||
| 873 | 882 | |
| 874 | 883 | /* Handle transition to B0 status */ |
| 875 | 884 | if (old_termios->c_cflag & CBAUD && |
| 876 | − !(tty->termios->c_cflag & CBAUD)) { | |
| 885 | + !(tty->termios.c_cflag & CBAUD)) { | |
| 877 | 886 | info->serial_signals &= ~(SerialSignal_RTS + SerialSignal_DTR); |
| 878 | 887 | spin_lock_irqsave(&info->lock,flags); |
| 879 | 888 | set_signals(info); |
| @@ -882,9 +891,9 @@ static void set_termios(struct tty_struct *tty, struct ktermios *old_termios) · 2 unmodified lines | ||
| 882 | 891 | |
| 883 | 892 | /* Handle transition away from B0 status */ |
| 884 | 893 | if (!(old_termios->c_cflag & CBAUD) && |
| 885 | − tty->termios->c_cflag & CBAUD) { | |
| 894 | + tty->termios.c_cflag & CBAUD) { | |
| 886 | 895 | info->serial_signals |= SerialSignal_DTR; |
| 887 | − if (!(tty->termios->c_cflag & CRTSCTS) || | |
| 896 | + if (!(tty->termios.c_cflag & CRTSCTS) || | |
| 888 | 897 | !test_bit(TTY_THROTTLED, &tty->flags)) { |
| 889 | 898 | info->serial_signals |= SerialSignal_RTS; |
| 890 | 899 | } |
| @@ -895,7 +904,7 @@ static void set_termios(struct tty_struct *tty, struct ktermios *old_termios) · 4 unmodified lines | ||
| 895 | 904 | |
| 896 | 905 | /* Handle turning off CRTSCTS */ |
| 897 | 906 | if (old_termios->c_cflag & CRTSCTS && |
| 898 | − !(tty->termios->c_cflag & CRTSCTS)) { | |
| 907 | + !(tty->termios.c_cflag & CRTSCTS)) { | |
| 899 | 908 | tty->hw_stopped = 0; |
| 900 | 909 | tx_release(tty); |
| 901 | 910 | } |
| @@ -1473,7 +1482,7 @@ static void throttle(struct tty_struct * tty) · 571 unmodified lines | ||
| 1473 | 1482 | if (I_IXOFF(tty)) |
| 1474 | 1483 | send_xchar(tty, STOP_CHAR(tty)); |
| 1475 | 1484 | |
| 1476 | − if (tty->termios->c_cflag & CRTSCTS) { | |
| 1485 | + if (tty->termios.c_cflag & CRTSCTS) { | |
| 1477 | 1486 | spin_lock_irqsave(&info->lock,flags); |
| 1478 | 1487 | info->serial_signals &= ~SerialSignal_RTS; |
| 1479 | 1488 | set_signals(info); |
| @@ -1502,7 +1511,7 @@ static void unthrottle(struct tty_struct * tty) · 22 unmodified lines | ||
| 1502 | 1511 | send_xchar(tty, START_CHAR(tty)); |
| 1503 | 1512 | } |
| 1504 | 1513 | |
| 1505 | − if (tty->termios->c_cflag & CRTSCTS) { | |
| 1514 | + if (tty->termios.c_cflag & CRTSCTS) { | |
| 1506 | 1515 | spin_lock_irqsave(&info->lock,flags); |
| 1507 | 1516 | info->serial_signals |= SerialSignal_RTS; |
| 1508 | 1517 | set_signals(info); |
| @@ -2491,7 +2500,7 @@ static void isr_io_pin( SLMP_INFO *info, u16 status ) · 982 unmodified lines | ||
| 2491 | 2500 | } |
| 2492 | 2501 | } |
| 2493 | 2502 | |
| 2494 | − if ( (info->port.flags & ASYNC_CTS_FLOW) && | |
| 2503 | + if (tty_port_cts_enabled(&info->port) && | |
| 2495 | 2504 | (status & MISCSTATUS_CTS_LATCHED) ) { |
| 2496 | 2505 | if ( info->port.tty ) { |
| 2497 | 2506 | if (info->port.tty->hw_stopped) { |
| @@ -2708,7 +2717,7 @@ static void shutdown(SLMP_INFO * info) · 210 unmodified lines | ||
| 2708 | 2717 | |
| 2709 | 2718 | reset_port(info); |
| 2710 | 2719 | |
| 2711 | − if (!info->port.tty || info->port.tty->termios->c_cflag & HUPCL) { | |
| 2720 | + if (!info->port.tty || info->port.tty->termios.c_cflag & HUPCL) { | |
| 2712 | 2721 | info->serial_signals &= ~(SerialSignal_DTR + SerialSignal_RTS); |
| 2713 | 2722 | set_signals(info); |
| 2714 | 2723 | } |
| @@ -2749,7 +2758,7 @@ static void program_hw(SLMP_INFO *info) · 34 unmodified lines | ||
| 2749 | 2758 | |
| 2750 | 2759 | get_signals(info); |
| 2751 | 2760 | |
| 2752 | − if (info->netcount || (info->port.tty && info->port.tty->termios->c_cflag & CREAD) ) | |
| 2761 | + if (info->netcount || (info->port.tty && info->port.tty->termios.c_cflag & CREAD) ) | |
| 2753 | 2762 | rx_start(info); |
| 2754 | 2763 | |
| 2755 | 2764 | spin_unlock_irqrestore(&info->lock,flags); |
| @@ -2762,14 +2771,14 @@ static void change_params(SLMP_INFO *info) · 6 unmodified lines | ||
| 2762 | 2771 | unsigned cflag; |
| 2763 | 2772 | int bits_per_char; |
| 2764 | 2773 | |
| 2765 | − if (!info->port.tty || !info->port.tty->termios) | |
| 2774 | + if (!info->port.tty) | |
| 2766 | 2775 | return; |
| 2767 | 2776 | |
| 2768 | 2777 | if (debug_level >= DEBUG_LEVEL_INFO) |
| 2769 | 2778 | printk("%s(%d):%s change_params()\n", |
| 2770 | 2779 | __FILE__,__LINE__, info->device_name ); |
| 2771 | 2780 | |
| 2772 | − cflag = info->port.tty->termios->c_cflag; | |
| 2781 | + cflag = info->port.tty->termios.c_cflag; | |
| 2773 | 2782 | |
| 2774 | 2783 | /* if B0 rate (hangup) specified then negate DTR and RTS */ |
| 2775 | 2784 | /* otherwise assert DTR and RTS */ |
| @@ -3306,7 +3315,7 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp, · 530 unmodified lines | ||
| 3306 | 3315 | return 0; |
| 3307 | 3316 | } |
| 3308 | 3317 | |
| 3309 | − if (tty->termios->c_cflag & CLOCAL) | |
| 3318 | + if (tty->termios.c_cflag & CLOCAL) | |
| 3310 | 3319 | do_clocal = true; |
| 3311 | 3320 | |
| 3312 | 3321 | /* Wait for carrier detect and the line to become |
| @@ -3332,7 +3341,7 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp, · 19 unmodified lines | ||
| 3332 | 3341 | port->blocked_open++; |
| 3333 | 3342 | |
| 3334 | 3343 | while (1) { |
| 3335 | − if (tty->termios->c_cflag & CBAUD) | |
| 3344 | + if (tty->termios.c_cflag & CBAUD) | |
| 3336 | 3345 | tty_port_raise_dtr_rts(port); |
| 3337 | 3346 | |
| 3338 | 3347 | set_current_state(TASK_INTERRUPTIBLE); |
| @@ -3357,9 +3366,9 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp, · 18 unmodified lines | ||
| 3357 | 3366 | printk("%s(%d):%s block_til_ready() count=%d\n", |
| 3358 | 3367 | __FILE__,__LINE__, tty->driver->name, port->count ); |
| 3359 | 3368 | |
| 3360 | − tty_unlock(); | |
| 3369 | + tty_unlock(tty); | |
| 3361 | 3370 | schedule(); |
| 3362 | − tty_lock(); | |
| 3371 | + tty_lock(tty); | |
| 3363 | 3372 | } |
| 3364 | 3373 | |
| 3365 | 3374 | set_current_state(TASK_RUNNING); |
| @@ -3881,6 +3890,7 @@ static void device_init(int adapter_num, struct pci_dev *pdev) · 515 unmodified lines | ||
| 3881 | 3890 | } |
| 3882 | 3891 | |
| 3883 | 3892 | static const struct tty_operations ops = { |
| 3893 | + .install = install, | |
| 3884 | 3894 | .open = open, |
| 3885 | 3895 | .close = close, |
| 3886 | 3896 | .write = write, |
| @@ -181,10 +181,13 @@ struct tty_struct *alloc_tty_struct(void) · 180 unmodified lines | ||
| 181 | 181 | |
| 182 | 182 | void free_tty_struct(struct tty_struct *tty) |
| 183 | 183 | { |
| 184 | + if (!tty) | |
| 185 | + return; | |
| 184 | 186 | if (tty->dev) |
| 185 | 187 | put_device(tty->dev); |
| 186 | 188 | kfree(tty->write_buf); |
| 187 | 189 | tty_buffer_free_all(tty); |
| 190 | + tty->magic = 0xDEADDEAD; | |
| 188 | 191 | kfree(tty); |
| 189 | 192 | } |
| 190 | 193 | |
| @@ -573,7 +576,7 @@ void __tty_hangup(struct tty_struct *tty) · 382 unmodified lines | ||
| 573 | 576 | } |
| 574 | 577 | spin_unlock(&redirect_lock); |
| 575 | 578 | |
| 576 | − tty_lock(); | |
| 579 | + tty_lock(tty); | |
| 577 | 580 | |
| 578 | 581 | /* some functions below drop BTM, so we need this bit */ |
| 579 | 582 | set_bit(TTY_HUPPING, &tty->flags); |
| @@ -666,7 +669,7 @@ void __tty_hangup(struct tty_struct *tty) · 86 unmodified lines | ||
| 666 | 669 | clear_bit(TTY_HUPPING, &tty->flags); |
| 667 | 670 | tty_ldisc_enable(tty); |
| 668 | 671 | |
| 669 | − tty_unlock(); | |
| 672 | + tty_unlock(tty); | |
| 670 | 673 | |
| 671 | 674 | if (f) |
| 672 | 675 | fput(f); |
| @@ -1103,12 +1106,12 @@ void tty_write_message(struct tty_struct *tty, char *msg) · 430 unmodified lines | ||
| 1103 | 1106 | { |
| 1104 | 1107 | if (tty) { |
| 1105 | 1108 | mutex_lock(&tty->atomic_write_lock); |
| 1106 | − tty_lock(); | |
| 1109 | + tty_lock(tty); | |
| 1107 | 1110 | if (tty->ops->write && !test_bit(TTY_CLOSING, &tty->flags)) { |
| 1108 | − tty_unlock(); | |
| 1111 | + tty_unlock(tty); | |
| 1109 | 1112 | tty->ops->write(tty, msg, strlen(msg)); |
| 1110 | 1113 | } else |
| 1111 | − tty_unlock(); | |
| 1114 | + tty_unlock(tty); | |
| 1112 | 1115 | tty_write_unlock(tty); |
| 1113 | 1116 | } |
| 1114 | 1117 | return; |
| @@ -1213,7 +1216,10 @@ static void pty_line_name(struct tty_driver *driver, int index, char *p) · 98 unmodified lines | ||
| 1213 | 1216 | */ |
| 1214 | 1217 | static void tty_line_name(struct tty_driver *driver, int index, char *p) |
| 1215 | 1218 | { |
| 1216 | − sprintf(p, "%s%d", driver->name, index + driver->name_base); | |
| 1219 | + if (driver->flags & TTY_DRIVER_UNNUMBERED_NODE) | |
| 1220 | + strcpy(p, driver->name); | |
| 1221 | + else | |
| 1222 | + sprintf(p, "%s%d", driver->name, index + driver->name_base); | |
| 1217 | 1223 | } |
| 1218 | 1224 | |
| 1219 | 1225 | /** |
| @@ -1249,21 +1255,19 @@ int tty_init_termios(struct tty_struct *tty) · 29 unmodified lines | ||
| 1249 | 1255 | struct ktermios *tp; |
| 1250 | 1256 | int idx = tty->index; |
| 1251 | 1257 | |
| 1252 | − tp = tty->driver->termios[idx]; | |
| 1253 | − if (tp == NULL) { | |
| 1254 | − tp = kzalloc(sizeof(struct ktermios[2]), GFP_KERNEL); | |
| 1255 | − if (tp == NULL) | |
| 1256 | − return -ENOMEM; | |
| 1257 | − memcpy(tp, &tty->driver->init_termios, | |
| 1258 | − sizeof(struct ktermios)); | |
| 1259 | − tty->driver->termios[idx] = tp; | |
| 1258 | + if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS) | |
| 1259 | + tty->termios = tty->driver->init_termios; | |
| 1260 | + else { | |
| 1261 | + /* Check for lazy saved data */ | |
| 1262 | + tp = tty->driver->termios[idx]; | |
| 1263 | + if (tp != NULL) | |
| 1264 | + tty->termios = *tp; | |
| 1265 | + else | |
| 1266 | + tty->termios = tty->driver->init_termios; | |
| 1260 | 1267 | } |
| 1261 | − tty->termios = tp; | |
| 1262 | − tty->termios_locked = tp + 1; | |
| 1263 | − | |
| 1264 | 1268 | /* Compatibility until drivers always set this */ |
| 1265 | − tty->termios->c_ispeed = tty_termios_input_baud_rate(tty->termios); | |
| 1266 | − tty->termios->c_ospeed = tty_termios_baud_rate(tty->termios); | |
| 1269 | + tty->termios.c_ispeed = tty_termios_input_baud_rate(&tty->termios); | |
| 1270 | + tty->termios.c_ospeed = tty_termios_baud_rate(&tty->termios); | |
| 1267 | 1271 | return 0; |
| 1268 | 1272 | } |
| 1269 | 1273 | EXPORT_SYMBOL_GPL(tty_init_termios); |
| @@ -1403,10 +1407,18 @@ struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx) · 133 unmodified lines | ||
| 1403 | 1407 | } |
| 1404 | 1408 | initialize_tty_struct(tty, driver, idx); |
| 1405 | 1409 | |
| 1410 | + tty_lock(tty); | |
| 1406 | 1411 | retval = tty_driver_install_tty(driver, tty); |
| 1407 | 1412 | if (retval < 0) |
| 1408 | 1413 | goto err_deinit_tty; |
| 1409 | 1414 | |
| 1415 | + if (!tty->port) | |
| 1416 | + tty->port = driver->ports[idx]; | |
| 1417 | + | |
| 1418 | + WARN_RATELIMIT(!tty->port, | |
| 1419 | + "%s: %s driver does not set tty->port. This will crash the kernel later. Fix the driver!\n", | |
| 1420 | + __func__, tty->driver->name); | |
| 1421 | + | |
| 1410 | 1422 | /* |
| 1411 | 1423 | * Structures all installed ... call the ldisc open routines. |
| 1412 | 1424 | * If we fail here just call release_tty to clean up. No need |
| @@ -1415,9 +1427,11 @@ struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx) · 2 unmodified lines | ||
| 1415 | 1427 | retval = tty_ldisc_setup(tty, tty->link); |
| 1416 | 1428 | if (retval) |
| 1417 | 1429 | goto err_release_tty; |
| 1430 | + /* Return the tty locked so that it cannot vanish under the caller */ | |
| 1418 | 1431 | return tty; |
| 1419 | 1432 | |
| 1420 | 1433 | err_deinit_tty: |
| 1434 | + tty_unlock(tty); | |
| 1421 | 1435 | deinitialize_tty_struct(tty); |
| 1422 | 1436 | free_tty_struct(tty); |
| 1423 | 1437 | err_module_put: |
| @@ -1426,6 +1440,7 @@ err_module_put: · 2 unmodified lines | ||
| 1426 | 1440 | |
| 1427 | 1441 | /* call the tty release_tty routine to clean out this slot */ |
| 1428 | 1442 | err_release_tty: |
| 1443 | + tty_unlock(tty); | |
| 1429 | 1444 | printk_ratelimited(KERN_INFO "tty_init_dev: ldisc open failed, " |
| 1430 | 1445 | "clearing slot %d\n", idx); |
| 1431 | 1446 | release_tty(tty, idx); |
| @@ -1436,22 +1451,25 @@ void tty_free_termios(struct tty_struct *tty) · 4 unmodified lines | ||
| 1436 | 1451 | { |
| 1437 | 1452 | struct ktermios *tp; |
| 1438 | 1453 | int idx = tty->index; |
| 1439 | − /* Kill this flag and push into drivers for locking etc */ | |
| 1440 | − if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS) { | |
| 1441 | − /* FIXME: Locking on ->termios array */ | |
| 1442 | − tp = tty->termios; | |
| 1443 | − tty->driver->termios[idx] = NULL; | |
| 1444 | − kfree(tp); | |
| 1454 | + | |
| 1455 | + /* If the port is going to reset then it has no termios to save */ | |
| 1456 | + if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS) | |
| 1457 | + return; | |
| 1458 | + | |
| 1459 | + /* Stash the termios data */ | |
| 1460 | + tp = tty->driver->termios[idx]; | |
| 1461 | + if (tp == NULL) { | |
| 1462 | + tp = kmalloc(sizeof(struct ktermios), GFP_KERNEL); | |
| 1463 | + if (tp == NULL) { | |
| 1464 | + pr_warn("tty: no memory to save termios state.\n"); | |
| 1465 | + return; | |
| 1466 | + } | |
| 1467 | + tty->driver->termios[idx] = tp; | |
| 1445 | 1468 | } |
| 1469 | + *tp = tty->termios; | |
| 1446 | 1470 | } |
| 1447 | 1471 | EXPORT_SYMBOL(tty_free_termios); |
| 1448 | 1472 | |
| 1449 | −void tty_shutdown(struct tty_struct *tty) | |
| 1450 | −{ | |
| 1451 | − tty_driver_remove_tty(tty->driver, tty); | |
| 1452 | − tty_free_termios(tty); | |
| 1453 | −} | |
| 1454 | −EXPORT_SYMBOL(tty_shutdown); | |
| 1455 | 1473 | |
| 1456 | 1474 | /** |
| 1457 | 1475 | * release_one_tty - release tty structure memory |
| @@ -1462,7 +1480,6 @@ EXPORT_SYMBOL(tty_shutdown); · 4 unmodified lines | ||
| 1462 | 1480 | * in use. It also gets called when setup of a device fails. |
| 1463 | 1481 | * |
| 1464 | 1482 | * Locking: |
| 1465 | − * tty_mutex - sometimes only | |
| 1466 | 1483 | * takes the file list lock internally when working on the list |
| 1467 | 1484 | * of ttys that the driver keeps. |
| 1468 | 1485 | * |
| @@ -1495,11 +1512,6 @@ static void queue_release_one_tty(struct kref *kref) · 26 unmodified lines | ||
| 1495 | 1512 | { |
| 1496 | 1513 | struct tty_struct *tty = container_of(kref, struct tty_struct, kref); |
| 1497 | 1514 | |
| 1498 | − if (tty->ops->shutdown) | |
| 1499 | − tty->ops->shutdown(tty); | |
| 1500 | − else | |
| 1501 | − tty_shutdown(tty); | |
| 1502 | − | |
| 1503 | 1515 | /* The hangup queue is now free so we can reuse it rather than |
| 1504 | 1516 | waste a chunk of memory for each port */ |
| 1505 | 1517 | INIT_WORK(&tty->hangup_work, release_one_tty); |
| @@ -1528,16 +1540,20 @@ EXPORT_SYMBOL(tty_kref_put); · 22 unmodified lines | ||
| 1528 | 1540 | * and decrement the refcount of the backing module. |
| 1529 | 1541 | * |
| 1530 | 1542 | * Locking: |
| 1531 | − * tty_mutex - sometimes only | |
| 1543 | + * tty_mutex | |
| 1532 | 1544 | * takes the file list lock internally when working on the list |
| 1533 | 1545 | * of ttys that the driver keeps. |
| 1534 | − * FIXME: should we require tty_mutex is held here ?? | |
| 1535 | 1546 | * |
| 1536 | 1547 | */ |
| 1537 | 1548 | static void release_tty(struct tty_struct *tty, int idx) |
| 1538 | 1549 | { |
| 1539 | 1550 | /* This should always be true but check for the moment */ |
| 1540 | 1551 | WARN_ON(tty->index != idx); |
| 1552 | + WARN_ON(!mutex_is_locked(&tty_mutex)); | |
| 1553 | + if (tty->ops->shutdown) | |
| 1554 | + tty->ops->shutdown(tty); | |
| 1555 | + tty_free_termios(tty); | |
| 1556 | + tty_driver_remove_tty(tty->driver, tty); | |
| 1541 | 1557 | |
| 1542 | 1558 | if (tty->link) |
| 1543 | 1559 | tty_kref_put(tty->link); |
| @@ -1572,22 +1588,12 @@ static int tty_release_checks(struct tty_struct *tty, struct tty_struct *o_tty, · 28 unmodified lines | ||
| 1572 | 1588 | __func__, idx, tty->name); |
| 1573 | 1589 | return -1; |
| 1574 | 1590 | } |
| 1575 | − if (tty->termios != tty->driver->termios[idx]) { | |
| 1576 | − printk(KERN_DEBUG "%s: driver.termios[%d] not termios for (%s)\n", | |
| 1577 | − __func__, idx, tty->name); | |
| 1578 | − return -1; | |
| 1579 | − } | |
| 1580 | 1591 | if (tty->driver->other) { |
| 1581 | 1592 | if (o_tty != tty->driver->other->ttys[idx]) { |
| 1582 | 1593 | printk(KERN_DEBUG "%s: other->table[%d] not o_tty for (%s)\n", |
| 1583 | 1594 | __func__, idx, tty->name); |
| 1584 | 1595 | return -1; |
| 1585 | 1596 | } |
| 1586 | − if (o_tty->termios != tty->driver->other->termios[idx]) { | |
| 1587 | − printk(KERN_DEBUG "%s: other->termios[%d] not o_termios for (%s)\n", | |
| 1588 | − __func__, idx, tty->name); | |
| 1589 | − return -1; | |
| 1590 | − } | |
| 1591 | 1597 | if (o_tty->link != tty) { |
| 1592 | 1598 | printk(KERN_DEBUG "%s: bad pty pointers\n", __func__); |
| 1593 | 1599 | return -1; |
| @@ -1628,7 +1634,7 @@ int tty_release(struct inode *inode, struct file *filp) · 34 unmodified lines | ||
| 1628 | 1634 | if (tty_paranoia_check(tty, inode, __func__)) |
| 1629 | 1635 | return 0; |
| 1630 | 1636 | |
| 1631 | − tty_lock(); | |
| 1637 | + tty_lock(tty); | |
| 1632 | 1638 | check_tty_count(tty, __func__); |
| 1633 | 1639 | |
| 1634 | 1640 | __tty_fasync(-1, filp, 0); |
| @@ -1637,10 +1643,11 @@ int tty_release(struct inode *inode, struct file *filp) · 2 unmodified lines | ||
| 1637 | 1643 | pty_master = (tty->driver->type == TTY_DRIVER_TYPE_PTY && |
| 1638 | 1644 | tty->driver->subtype == PTY_TYPE_MASTER); |
| 1639 | 1645 | devpts = (tty->driver->flags & TTY_DRIVER_DEVPTS_MEM) != 0; |
| 1646 | + /* Review: parallel close */ | |
| 1640 | 1647 | o_tty = tty->link; |
| 1641 | 1648 | |
| 1642 | 1649 | if (tty_release_checks(tty, o_tty, idx)) { |
| 1643 | − tty_unlock(); | |
| 1650 | + tty_unlock(tty); | |
| 1644 | 1651 | return 0; |
| 1645 | 1652 | } |
| 1646 | 1653 | |
| @@ -1652,7 +1659,7 @@ int tty_release(struct inode *inode, struct file *filp) · 5 unmodified lines | ||
| 1652 | 1659 | if (tty->ops->close) |
| 1653 | 1660 | tty->ops->close(tty, filp); |
| 1654 | 1661 | |
| 1655 | − tty_unlock(); | |
| 1662 | + tty_unlock(tty); | |
| 1656 | 1663 | /* |
| 1657 | 1664 | * Sanity check: if tty->count is going to zero, there shouldn't be |
| 1658 | 1665 | * any waiters on tty->read_wait or tty->write_wait. We test the |
| @@ -1675,7 +1682,7 @@ int tty_release(struct inode *inode, struct file *filp) · 16 unmodified lines | ||
| 1675 | 1682 | opens on /dev/tty */ |
| 1676 | 1683 | |
| 1677 | 1684 | mutex_lock(&tty_mutex); |
| 1678 | − tty_lock(); | |
| 1685 | + tty_lock_pair(tty, o_tty); | |
| 1679 | 1686 | tty_closing = tty->count <= 1; |
| 1680 | 1687 | o_tty_closing = o_tty && |
| 1681 | 1688 | (o_tty->count <= (pty_master ? 1 : 0)); |
| @@ -1706,7 +1713,7 @@ int tty_release(struct inode *inode, struct file *filp) · 24 unmodified lines | ||
| 1706 | 1713 | |
| 1707 | 1714 | printk(KERN_WARNING "%s: %s: read/write wait queue active!\n", |
| 1708 | 1715 | __func__, tty_name(tty, buf)); |
| 1709 | − tty_unlock(); | |
| 1716 | + tty_unlock_pair(tty, o_tty); | |
| 1710 | 1717 | mutex_unlock(&tty_mutex); |
| 1711 | 1718 | schedule(); |
| 1712 | 1719 | } |
| @@ -1715,6 +1722,9 @@ int tty_release(struct inode *inode, struct file *filp) · 2 unmodified lines | ||
| 1715 | 1722 | * The closing flags are now consistent with the open counts on |
| 1716 | 1723 | * both sides, and we've completed the last operation that could |
| 1717 | 1724 | * block, so it's safe to proceed with closing. |
| 1725 | + * | |
| 1726 | + * We must *not* drop the tty_mutex until we ensure that a further | |
| 1727 | + * entry into tty_open can not pick up this tty. | |
| 1718 | 1728 | */ |
| 1719 | 1729 | if (pty_master) { |
| 1720 | 1730 | if (--o_tty->count < 0) { |
| @@ -1766,12 +1776,13 @@ int tty_release(struct inode *inode, struct file *filp) · 45 unmodified lines | ||
| 1766 | 1776 | } |
| 1767 | 1777 | |
| 1768 | 1778 | mutex_unlock(&tty_mutex); |
| 1779 | + tty_unlock_pair(tty, o_tty); | |
| 1780 | + /* At this point the TTY_CLOSING flag should ensure a dead tty | |
| 1781 | + cannot be re-opened by a racing opener */ | |
| 1769 | 1782 | |
| 1770 | 1783 | /* check whether both sides are closing ... */ |
| 1771 | − if (!tty_closing || (o_tty && !o_tty_closing)) { | |
| 1772 | − tty_unlock(); | |
| 1784 | + if (!tty_closing || (o_tty && !o_tty_closing)) | |
| 1773 | 1785 | return 0; |
| 1774 | − } | |
| 1775 | 1786 | |
| 1776 | 1787 | #ifdef TTY_DEBUG_HANGUP |
| 1777 | 1788 | printk(KERN_DEBUG "%s: freeing tty structure...\n", __func__); |
| @@ -1782,14 +1793,17 @@ int tty_release(struct inode *inode, struct file *filp) · 4 unmodified lines | ||
| 1782 | 1793 | tty_ldisc_release(tty, o_tty); |
| 1783 | 1794 | /* |
| 1784 | 1795 | * The release_tty function takes care of the details of clearing |
| 1785 | − * the slots and preserving the termios structure. | |
| 1796 | + * the slots and preserving the termios structure. The tty_unlock_pair | |
| 1797 | + * should be safe as we keep a kref while the tty is locked (so the | |
| 1798 | + * unlock never unlocks a freed tty). | |
| 1786 | 1799 | */ |
| 1800 | + mutex_lock(&tty_mutex); | |
| 1787 | 1801 | release_tty(tty, idx); |
| 1802 | + mutex_unlock(&tty_mutex); | |
| 1788 | 1803 | |
| 1789 | 1804 | /* Make this pty number available for reallocation */ |
| 1790 | 1805 | if (devpts) |
| 1791 | 1806 | devpts_kill_index(inode, idx); |
| 1792 | − tty_unlock(); | |
| 1793 | 1807 | return 0; |
| 1794 | 1808 | } |
| 1795 | 1809 | |
| @@ -1893,6 +1907,9 @@ static struct tty_driver *tty_lookup_driver(dev_t device, struct file *filp, · 97 unmodified lines | ||
| 1893 | 1907 | * Locking: tty_mutex protects tty, tty_lookup_driver and tty_init_dev. |
| 1894 | 1908 | * tty->count should protect the rest. |
| 1895 | 1909 | * ->siglock protects ->signal/->sighand |
| 1910 | + * | |
| 1911 | + * Note: the tty_unlock/lock cases without a ref are only safe due to | |
| 1912 | + * tty_mutex | |
| 1896 | 1913 | */ |
| 1897 | 1914 | |
| 1898 | 1915 | static int tty_open(struct inode *inode, struct file *filp) |
| @@ -1916,8 +1933,7 @@ retry_open: · 17 unmodified lines | ||
| 1916 | 1933 | retval = 0; |
| 1917 | 1934 | |
| 1918 | 1935 | mutex_lock(&tty_mutex); |
| 1919 | − tty_lock(); | |
| 1920 | − | |
| 1936 | + /* This is protected by the tty_mutex */ | |
| 1921 | 1937 | tty = tty_open_current_tty(device, filp); |
| 1922 | 1938 | if (IS_ERR(tty)) { |
| 1923 | 1939 | retval = PTR_ERR(tty); |
| @@ -1938,17 +1954,19 @@ retry_open: · 14 unmodified lines | ||
| 1938 | 1954 | } |
| 1939 | 1955 | |
| 1940 | 1956 | if (tty) { |
| 1957 | + tty_lock(tty); | |
| 1941 | 1958 | retval = tty_reopen(tty); |
| 1942 | − if (retval) | |
| 1959 | + if (retval < 0) { | |
| 1960 | + tty_unlock(tty); | |
| 1943 | 1961 | tty = ERR_PTR(retval); |
| 1944 | − } else | |
| 1962 | + } | |
| 1963 | + } else /* Returns with the tty_lock held for now */ | |
| 1945 | 1964 | tty = tty_init_dev(driver, index); |
| 1946 | 1965 | |
| 1947 | 1966 | mutex_unlock(&tty_mutex); |
| 1948 | 1967 | if (driver) |
| 1949 | 1968 | tty_driver_kref_put(driver); |
| 1950 | 1969 | if (IS_ERR(tty)) { |
| 1951 | − tty_unlock(); | |
| 1952 | 1970 | retval = PTR_ERR(tty); |
| 1953 | 1971 | goto err_file; |
| 1954 | 1972 | } |
| @@ -1977,7 +1995,7 @@ retry_open: · 22 unmodified lines | ||
| 1977 | 1995 | printk(KERN_DEBUG "%s: error %d in opening %s...\n", __func__, |
| 1978 | 1996 | retval, tty->name); |
| 1979 | 1997 | #endif |
| 1980 | − tty_unlock(); /* need to call tty_release without BTM */ | |
| 1998 | + tty_unlock(tty); /* need to call tty_release without BTM */ | |
| 1981 | 1999 | tty_release(inode, filp); |
| 1982 | 2000 | if (retval != -ERESTARTSYS) |
| 1983 | 2001 | return retval; |
| @@ -1989,17 +2007,15 @@ retry_open: · 5 unmodified lines | ||
| 1989 | 2007 | /* |
| 1990 | 2008 | * Need to reset f_op in case a hangup happened. |
| 1991 | 2009 | */ |
| 1992 | − tty_lock(); | |
| 1993 | 2010 | if (filp->f_op == &hung_up_tty_fops) |
| 1994 | 2011 | filp->f_op = &tty_fops; |
| 1995 | − tty_unlock(); | |
| 1996 | 2012 | goto retry_open; |
| 1997 | 2013 | } |
| 1998 | − tty_unlock(); | |
| 2014 | + tty_unlock(tty); | |
| 1999 | 2015 | |
| 2000 | 2016 | |
| 2001 | 2017 | mutex_lock(&tty_mutex); |
| 2002 | − tty_lock(); | |
| 2018 | + tty_lock(tty); | |
| 2003 | 2019 | spin_lock_irq(¤t->sighand->siglock); |
| 2004 | 2020 | if (!noctty && |
| 2005 | 2021 | current->signal->leader && |
| @@ -2007,11 +2023,10 @@ retry_open: · 1 unmodified line | ||
| 2007 | 2023 | tty->session == NULL) |
| 2008 | 2024 | __proc_set_tty(current, tty); |
| 2009 | 2025 | spin_unlock_irq(¤t->sighand->siglock); |
| 2010 | − tty_unlock(); | |
| 2026 | + tty_unlock(tty); | |
| 2011 | 2027 | mutex_unlock(&tty_mutex); |
| 2012 | 2028 | return 0; |
| 2013 | 2029 | err_unlock: |
| 2014 | − tty_unlock(); | |
| 2015 | 2030 | mutex_unlock(&tty_mutex); |
| 2016 | 2031 | /* after locks to avoid deadlock */ |
| 2017 | 2032 | if (!IS_ERR_OR_NULL(driver)) |
| @@ -2094,10 +2109,13 @@ out: · 76 unmodified lines | ||
| 2094 | 2109 | |
| 2095 | 2110 | static int tty_fasync(int fd, struct file *filp, int on) |
| 2096 | 2111 | { |
| 2112 | + struct tty_struct *tty = file_tty(filp); | |
| 2097 | 2113 | int retval; |
| 2098 | − tty_lock(); | |
| 2114 | + | |
| 2115 | + tty_lock(tty); | |
| 2099 | 2116 | retval = __tty_fasync(fd, filp, on); |
| 2100 | − tty_unlock(); | |
| 2117 | + tty_unlock(tty); | |
| 2118 | + | |
| 2101 | 2119 | return retval; |
| 2102 | 2120 | } |
| 2103 | 2121 | |
| @@ -2756,7 +2774,7 @@ long tty_ioctl(struct file *file, unsigned int cmd, unsigned long arg) · 652 unmodified lines | ||
| 2756 | 2774 | if (ld->ops->ioctl) { |
| 2757 | 2775 | retval = ld->ops->ioctl(tty, file, cmd, arg); |
| 2758 | 2776 | if (retval == -ENOIOCTLCMD) |
| 2759 | − retval = -EINVAL; | |
| 2777 | + retval = -ENOTTY; | |
| 2760 | 2778 | } |
| 2761 | 2779 | tty_ldisc_deref(ld); |
| 2762 | 2780 | return retval; |
| @@ -2934,6 +2952,7 @@ void initialize_tty_struct(struct tty_struct *tty, · 171 unmodified lines | ||
| 2934 | 2952 | tty->pgrp = NULL; |
| 2935 | 2953 | tty->overrun_time = jiffies; |
| 2936 | 2954 | tty_buffer_init(tty); |
| 2955 | + mutex_init(&tty->legacy_mutex); | |
| 2937 | 2956 | mutex_init(&tty->termios_mutex); |
| 2938 | 2957 | mutex_init(&tty->ldisc_mutex); |
| 2939 | 2958 | init_waitqueue_head(&tty->write_wait); |
| @@ -2991,6 +3010,15 @@ EXPORT_SYMBOL_GPL(tty_put_char); · 51 unmodified lines | ||
| 2991 | 3010 | |
| 2992 | 3011 | struct class *tty_class; |
| 2993 | 3012 | |
| 3013 | +static int tty_cdev_add(struct tty_driver *driver, dev_t dev, | |
| 3014 | + unsigned int index, unsigned int count) | |
| 3015 | +{ | |
| 3016 | + /* init here, since reused cdevs cause crashes */ | |
| 3017 | + cdev_init(&driver->cdevs[index], &tty_fops); | |
| 3018 | + driver->cdevs[index].owner = driver->owner; | |
| 3019 | + return cdev_add(&driver->cdevs[index], dev, count); | |
| 3020 | +} | |
| 3021 | + | |
| 2994 | 3022 | /** |
| 2995 | 3023 | * tty_register_device - register a tty device |
| 2996 | 3024 | * @driver: the tty driver that describes the tty device |
| @@ -3012,9 +3040,47 @@ struct class *tty_class; · 15 unmodified lines | ||
| 3012 | 3040 | |
| 3013 | 3041 | struct device *tty_register_device(struct tty_driver *driver, unsigned index, |
| 3014 | 3042 | struct device *device) |
| 3043 | +{ | |
| 3044 | + return tty_register_device_attr(driver, index, device, NULL, NULL); | |
| 3045 | +} | |
| 3046 | +EXPORT_SYMBOL(tty_register_device); | |
| 3047 | + | |
| 3048 | +static void tty_device_create_release(struct device *dev) | |
| 3049 | +{ | |
| 3050 | + pr_debug("device: '%s': %s\n", dev_name(dev), __func__); | |
| 3051 | + kfree(dev); | |
| 3052 | +} | |
| 3053 | + | |
| 3054 | +/** | |
| 3055 | + * tty_register_device_attr - register a tty device | |
| 3056 | + * @driver: the tty driver that describes the tty device | |
| 3057 | + * @index: the index in the tty driver for this tty device | |
| 3058 | + * @device: a struct device that is associated with this tty device. | |
| 3059 | + * This field is optional, if there is no known struct device | |
| 3060 | + * for this tty device it can be set to NULL safely. | |
| 3061 | + * @drvdata: Driver data to be set to device. | |
| 3062 | + * @attr_grp: Attribute group to be set on device. | |
| 3063 | + * | |
| 3064 | + * Returns a pointer to the struct device for this tty device | |
| 3065 | + * (or ERR_PTR(-EFOO) on error). | |
| 3066 | + * | |
| 3067 | + * This call is required to be made to register an individual tty device | |
| 3068 | + * if the tty driver's flags have the TTY_DRIVER_DYNAMIC_DEV bit set. If | |
| 3069 | + * that bit is not set, this function should not be called by a tty | |
| 3070 | + * driver. | |
| 3071 | + * | |
| 3072 | + * Locking: ?? | |
| 3073 | + */ | |
| 3074 | +struct device *tty_register_device_attr(struct tty_driver *driver, | |
| 3075 | + unsigned index, struct device *device, | |
| 3076 | + void *drvdata, | |
| 3077 | + const struct attribute_group **attr_grp) | |
| 3015 | 3078 | { |
| 3016 | 3079 | char name[64]; |
| 3017 | − dev_t dev = MKDEV(driver->major, driver->minor_start) + index; | |
| 3080 | + dev_t devt = MKDEV(driver->major, driver->minor_start) + index; | |
| 3081 | + struct device *dev = NULL; | |
| 3082 | + int retval = -ENODEV; | |
| 3083 | + bool cdev = false; | |
| 3018 | 3084 | |
| 3019 | 3085 | if (index >= driver->num) { |
| 3020 | 3086 | printk(KERN_ERR "Attempt to register invalid tty line number " |
| @@ -3027,9 +3093,40 @@ struct device *tty_register_device(struct tty_driver *driver, unsigned index, · 6 unmodified lines | ||
| 3027 | 3093 | else |
| 3028 | 3094 | tty_line_name(driver, index, name); |
| 3029 | 3095 | |
| 3030 | − return device_create(tty_class, device, dev, NULL, name); | |
| 3096 | + if (!(driver->flags & TTY_DRIVER_DYNAMIC_ALLOC)) { | |
| 3097 | + retval = tty_cdev_add(driver, devt, index, 1); | |
| 3098 | + if (retval) | |
| 3099 | + goto error; | |
| 3100 | + cdev = true; | |
| 3101 | + } | |
| 3102 | + | |
| 3103 | + dev = kzalloc(sizeof(*dev), GFP_KERNEL); | |
| 3104 | + if (!dev) { | |
| 3105 | + retval = -ENOMEM; | |
| 3106 | + goto error; | |
| 3107 | + } | |
| 3108 | + | |
| 3109 | + dev->devt = devt; | |
| 3110 | + dev->class = tty_class; | |
| 3111 | + dev->parent = device; | |
| 3112 | + dev->release = tty_device_create_release; | |
| 3113 | + dev_set_name(dev, "%s", name); | |
| 3114 | + dev->groups = attr_grp; | |
| 3115 | + dev_set_drvdata(dev, drvdata); | |
| 3116 | + | |
| 3117 | + retval = device_register(dev); | |
| 3118 | + if (retval) | |
| 3119 | + goto error; | |
| 3120 | + | |
| 3121 | + return dev; | |
| 3122 | + | |
| 3123 | +error: | |
| 3124 | + put_device(dev); | |
| 3125 | + if (cdev) | |
| 3126 | + cdev_del(&driver->cdevs[index]); | |
| 3127 | + return ERR_PTR(retval); | |
| 3031 | 3128 | } |
| 3032 | −EXPORT_SYMBOL(tty_register_device); | |
| 3129 | +EXPORT_SYMBOL_GPL(tty_register_device_attr); | |
| 3033 | 3130 | |
| 3034 | 3131 | /** |
| 3035 | 3132 | * tty_unregister_device - unregister a tty device |
| @@ -3046,31 +3143,82 @@ void tty_unregister_device(struct tty_driver *driver, unsigned index) · 10 unmodified lines | ||
| 3046 | 3143 | { |
| 3047 | 3144 | device_destroy(tty_class, |
| 3048 | 3145 | MKDEV(driver->major, driver->minor_start) + index); |
| 3146 | + if (!(driver->flags & TTY_DRIVER_DYNAMIC_ALLOC)) | |
| 3147 | + cdev_del(&driver->cdevs[index]); | |
| 3049 | 3148 | } |
| 3050 | 3149 | EXPORT_SYMBOL(tty_unregister_device); |
| 3051 | 3150 | |
| 3052 | −struct tty_driver *__alloc_tty_driver(int lines, struct module *owner) | |
| 3151 | +/** | |
| 3152 | + * __tty_alloc_driver -- allocate tty driver | |
| 3153 | + * @lines: count of lines this driver can handle at most | |
| 3154 | + * @owner: module which is repsonsible for this driver | |
| 3155 | + * @flags: some of TTY_DRIVER_* flags, will be set in driver->flags | |
| 3156 | + * | |
| 3157 | + * This should not be called directly, some of the provided macros should be | |
| 3158 | + * used instead. Use IS_ERR and friends on @retval. | |
| 3159 | + */ | |
| 3160 | +struct tty_driver *__tty_alloc_driver(unsigned int lines, struct module *owner, | |
| 3161 | + unsigned long flags) | |
| 3053 | 3162 | { |
| 3054 | 3163 | struct tty_driver *driver; |
| 3164 | + unsigned int cdevs = 1; | |
| 3165 | + int err; | |
| 3166 | + | |
| 3167 | + if (!lines || (flags & TTY_DRIVER_UNNUMBERED_NODE && lines > 1)) | |
| 3168 | + return ERR_PTR(-EINVAL); | |
| 3055 | 3169 | |
| 3056 | 3170 | driver = kzalloc(sizeof(struct tty_driver), GFP_KERNEL); |
| 3057 | − if (driver) { | |
| 3058 | − kref_init(&driver->kref); | |
| 3059 | − driver->magic = TTY_DRIVER_MAGIC; | |
| 3060 | − driver->num = lines; | |
| 3061 | − driver->owner = owner; | |
| 3062 | − /* later we'll move allocation of tables here */ | |
| 3171 | + if (!driver) | |
| 3172 | + return ERR_PTR(-ENOMEM); | |
| 3173 | + | |
| 3174 | + kref_init(&driver->kref); | |
| 3175 | + driver->magic = TTY_DRIVER_MAGIC; | |
| 3176 | + driver->num = lines; | |
| 3177 | + driver->owner = owner; | |
| 3178 | + driver->flags = flags; | |
| 3179 | + | |
| 3180 | + if (!(flags & TTY_DRIVER_DEVPTS_MEM)) { | |
| 3181 | + driver->ttys = kcalloc(lines, sizeof(*driver->ttys), | |
| 3182 | + GFP_KERNEL); | |
| 3183 | + driver->termios = kcalloc(lines, sizeof(*driver->termios), | |
| 3184 | + GFP_KERNEL); | |
| 3185 | + if (!driver->ttys || !driver->termios) { | |
| 3186 | + err = -ENOMEM; | |
| 3187 | + goto err_free_all; | |
| 3188 | + } | |
| 3063 | 3189 | } |
| 3190 | + | |
| 3191 | + if (!(flags & TTY_DRIVER_DYNAMIC_ALLOC)) { | |
| 3192 | + driver->ports = kcalloc(lines, sizeof(*driver->ports), | |
| 3193 | + GFP_KERNEL); | |
| 3194 | + if (!driver->ports) { | |
| 3195 | + err = -ENOMEM; | |
| 3196 | + goto err_free_all; | |
| 3197 | + } | |
| 3198 | + cdevs = lines; | |
| 3199 | + } | |
| 3200 | + | |
| 3201 | + driver->cdevs = kcalloc(cdevs, sizeof(*driver->cdevs), GFP_KERNEL); | |
| 3202 | + if (!driver->cdevs) { | |
| 3203 | + err = -ENOMEM; | |
| 3204 | + goto err_free_all; | |
| 3205 | + } | |
| 3206 | + | |
| 3064 | 3207 | return driver; |
| 3208 | +err_free_all: | |
| 3209 | + kfree(driver->ports); | |
| 3210 | + kfree(driver->ttys); | |
| 3211 | + kfree(driver->termios); | |
| 3212 | + kfree(driver); | |
| 3213 | + return ERR_PTR(err); | |
| 3065 | 3214 | } |
| 3066 | −EXPORT_SYMBOL(__alloc_tty_driver); | |
| 3215 | +EXPORT_SYMBOL(__tty_alloc_driver); | |
| 3067 | 3216 | |
| 3068 | 3217 | static void destruct_tty_driver(struct kref *kref) |
| 3069 | 3218 | { |
| 3070 | 3219 | struct tty_driver *driver = container_of(kref, struct tty_driver, kref); |
| 3071 | 3220 | int i; |
| 3072 | 3221 | struct ktermios *tp; |
| 3073 | − void *p; | |
| 3074 | 3222 | |
| 3075 | 3223 | if (driver->flags & TTY_DRIVER_INSTALLED) { |
| 3076 | 3224 | /* |
| @@ -3087,13 +3235,14 @@ static void destruct_tty_driver(struct kref *kref) · 10 unmodified lines | ||
| 3087 | 3235 | if (!(driver->flags & TTY_DRIVER_DYNAMIC_DEV)) |
| 3088 | 3236 | tty_unregister_device(driver, i); |
| 3089 | 3237 | } |
| 3090 | − p = driver->ttys; | |
| 3091 | 3238 | proc_tty_unregister_driver(driver); |
| 3092 | − driver->ttys = NULL; | |
| 3093 | − driver->termios = NULL; | |
| 3094 | − kfree(p); | |
| 3095 | − cdev_del(&driver->cdev); | |
| 3239 | + if (driver->flags & TTY_DRIVER_DYNAMIC_ALLOC) | |
| 3240 | + cdev_del(&driver->cdevs[0]); | |
| 3096 | 3241 | } |
| 3242 | + kfree(driver->cdevs); | |
| 3243 | + kfree(driver->ports); | |
| 3244 | + kfree(driver->termios); | |
| 3245 | + kfree(driver->ttys); | |
| 3097 | 3246 | kfree(driver); |
| 3098 | 3247 | } |
| 3099 | 3248 | |
| @@ -3124,15 +3273,8 @@ int tty_register_driver(struct tty_driver *driver) · 24 unmodified lines | ||
| 3124 | 3273 | int error; |
| 3125 | 3274 | int i; |
| 3126 | 3275 | dev_t dev; |
| 3127 | − void **p = NULL; | |
| 3128 | 3276 | struct device *d; |
| 3129 | 3277 | |
| 3130 | − if (!(driver->flags & TTY_DRIVER_DEVPTS_MEM) && driver->num) { | |
| 3131 | − p = kzalloc(driver->num * 2 * sizeof(void *), GFP_KERNEL); | |
| 3132 | − if (!p) | |
| 3133 | − return -ENOMEM; | |
| 3134 | − } | |
| 3135 | − | |
| 3136 | 3278 | if (!driver->major) { |
| 3137 | 3279 | error = alloc_chrdev_region(&dev, driver->minor_start, |
| 3138 | 3280 | driver->num, driver->name); |
| @@ -3144,28 +3286,13 @@ int tty_register_driver(struct tty_driver *driver) · 5 unmodified lines | ||
| 3144 | 3286 | dev = MKDEV(driver->major, driver->minor_start); |
| 3145 | 3287 | error = register_chrdev_region(dev, driver->num, driver->name); |
| 3146 | 3288 | } |
| 3147 | − if (error < 0) { | |
| 3148 | − kfree(p); | |
| 3149 | − return error; | |
| 3150 | − } | |
| 3289 | + if (error < 0) | |
| 3290 | + goto err; | |
| 3151 | 3291 | |
| 3152 | − if (p) { | |
| 3153 | − driver->ttys = (struct tty_struct **)p; | |
| 3154 | − driver->termios = (struct ktermios **)(p + driver->num); | |
| 3155 | − } else { | |
| 3156 | − driver->ttys = NULL; | |
| 3157 | − driver->termios = NULL; | |
| 3158 | − } | |
| 3159 | − | |
| 3160 | − cdev_init(&driver->cdev, &tty_fops); | |
| 3161 | − driver->cdev.owner = driver->owner; | |
| 3162 | − error = cdev_add(&driver->cdev, dev, driver->num); | |
| 3163 | − if (error) { | |
| 3164 | − unregister_chrdev_region(dev, driver->num); | |
| 3165 | − driver->ttys = NULL; | |
| 3166 | − driver->termios = NULL; | |
| 3167 | − kfree(p); | |
| 3168 | − return error; | |
| 3292 | + if (driver->flags & TTY_DRIVER_DYNAMIC_ALLOC) { | |
| 3293 | + error = tty_cdev_add(driver, dev, 0, driver->num); | |
| 3294 | + if (error) | |
| 3295 | + goto err_unreg_char; | |
| 3169 | 3296 | } |
| 3170 | 3297 | |
| 3171 | 3298 | mutex_lock(&tty_mutex); |
| @@ -3177,7 +3304,7 @@ int tty_register_driver(struct tty_driver *driver) · 5 unmodified lines | ||
| 3177 | 3304 | d = tty_register_device(driver, i, NULL); |
| 3178 | 3305 | if (IS_ERR(d)) { |
| 3179 | 3306 | error = PTR_ERR(d); |
| 3180 | − goto err; | |
| 3307 | + goto err_unreg_devs; | |
| 3181 | 3308 | } |
| 3182 | 3309 | } |
| 3183 | 3310 | } |
| @@ -3185,7 +3312,7 @@ int tty_register_driver(struct tty_driver *driver) · 1 unmodified line | ||
| 3185 | 3312 | driver->flags |= TTY_DRIVER_INSTALLED; |
| 3186 | 3313 | return 0; |
| 3187 | 3314 | |
| 3188 | −err: | |
| 3315 | +err_unreg_devs: | |
| 3189 | 3316 | for (i--; i >= 0; i--) |
| 3190 | 3317 | tty_unregister_device(driver, i); |
| 3191 | 3318 | |
| @@ -3193,13 +3320,11 @@ err: · 1 unmodified line | ||
| 3193 | 3320 | list_del(&driver->tty_drivers); |
| 3194 | 3321 | mutex_unlock(&tty_mutex); |
| 3195 | 3322 | |
| 3323 | +err_unreg_char: | |
| 3196 | 3324 | unregister_chrdev_region(dev, driver->num); |
| 3197 | − driver->ttys = NULL; | |
| 3198 | − driver->termios = NULL; | |
| 3199 | − kfree(p); | |
| 3325 | +err: | |
| 3200 | 3326 | return error; |
| 3201 | 3327 | } |
| 3202 | − | |
| 3203 | 3328 | EXPORT_SYMBOL(tty_register_driver); |
| 3204 | 3329 | |
| 3205 | 3330 | /* |
| @@ -410,7 +410,7 @@ EXPORT_SYMBOL_GPL(tty_termios_encode_baud_rate); · 409 unmodified lines | ||
| 410 | 410 | |
| 411 | 411 | void tty_encode_baud_rate(struct tty_struct *tty, speed_t ibaud, speed_t obaud) |
| 412 | 412 | { |
| 413 | − tty_termios_encode_baud_rate(tty->termios, ibaud, obaud); | |
| 413 | + tty_termios_encode_baud_rate(&tty->termios, ibaud, obaud); | |
| 414 | 414 | } |
| 415 | 415 | EXPORT_SYMBOL_GPL(tty_encode_baud_rate); |
| 416 | 416 | |
| @@ -427,7 +427,7 @@ EXPORT_SYMBOL_GPL(tty_encode_baud_rate); · 10 unmodified lines | ||
| 427 | 427 | |
| 428 | 428 | speed_t tty_get_baud_rate(struct tty_struct *tty) |
| 429 | 429 | { |
| 430 | − speed_t baud = tty_termios_baud_rate(tty->termios); | |
| 430 | + speed_t baud = tty_termios_baud_rate(&tty->termios); | |
| 431 | 431 | |
| 432 | 432 | if (baud == 38400 && tty->alt_speed) { |
| 433 | 433 | if (!tty->warned) { |
| @@ -509,14 +509,14 @@ int tty_set_termios(struct tty_struct *tty, struct ktermios *new_termios) · 75 unmodified lines | ||
| 509 | 509 | /* FIXME: we need to decide on some locking/ordering semantics |
| 510 | 510 | for the set_termios notification eventually */ |
| 511 | 511 | mutex_lock(&tty->termios_mutex); |
| 512 | − old_termios = *tty->termios; | |
| 513 | − *tty->termios = *new_termios; | |
| 514 | − unset_locked_termios(tty->termios, &old_termios, tty->termios_locked); | |
| 512 | + old_termios = tty->termios; | |
| 513 | + tty->termios = *new_termios; | |
| 514 | + unset_locked_termios(&tty->termios, &old_termios, &tty->termios_locked); | |
| 515 | 515 | |
| 516 | 516 | /* See if packet mode change of state. */ |
| 517 | 517 | if (tty->link && tty->link->packet) { |
| 518 | 518 | int extproc = (old_termios.c_lflag & EXTPROC) | |
| 519 | − (tty->termios->c_lflag & EXTPROC); | |
| 519 | + (tty->termios.c_lflag & EXTPROC); | |
| 520 | 520 | int old_flow = ((old_termios.c_iflag & IXON) && |
| 521 | 521 | (old_termios.c_cc[VSTOP] == '\023') && |
| 522 | 522 | (old_termios.c_cc[VSTART] == '\021')); |
| @@ -542,7 +542,7 @@ int tty_set_termios(struct tty_struct *tty, struct ktermios *new_termios) · 19 unmodified lines | ||
| 542 | 542 | if (tty->ops->set_termios) |
| 543 | 543 | (*tty->ops->set_termios)(tty, &old_termios); |
| 544 | 544 | else |
| 545 | − tty_termios_copy_hw(tty->termios, &old_termios); | |
| 545 | + tty_termios_copy_hw(&tty->termios, &old_termios); | |
| 546 | 546 | |
| 547 | 547 | ld = tty_ldisc_ref(tty); |
| 548 | 548 | if (ld != NULL) { |
| @@ -578,7 +578,7 @@ static int set_termios(struct tty_struct *tty, void __user *arg, int opt) · 29 unmodified lines | ||
| 578 | 578 | return retval; |
| 579 | 579 | |
| 580 | 580 | mutex_lock(&tty->termios_mutex); |
| 581 | − memcpy(&tmp_termios, tty->termios, sizeof(struct ktermios)); | |
| 581 | + tmp_termios = tty->termios; | |
| 582 | 582 | mutex_unlock(&tty->termios_mutex); |
| 583 | 583 | |
| 584 | 584 | if (opt & TERMIOS_TERMIO) { |
| @@ -632,14 +632,14 @@ static int set_termios(struct tty_struct *tty, void __user *arg, int opt) · 47 unmodified lines | ||
| 632 | 632 | static void copy_termios(struct tty_struct *tty, struct ktermios *kterm) |
| 633 | 633 | { |
| 634 | 634 | mutex_lock(&tty->termios_mutex); |
| 635 | − memcpy(kterm, tty->termios, sizeof(struct ktermios)); | |
| 635 | + *kterm = tty->termios; | |
| 636 | 636 | mutex_unlock(&tty->termios_mutex); |
| 637 | 637 | } |
| 638 | 638 | |
| 639 | 639 | static void copy_termios_locked(struct tty_struct *tty, struct ktermios *kterm) |
| 640 | 640 | { |
| 641 | 641 | mutex_lock(&tty->termios_mutex); |
| 642 | − memcpy(kterm, tty->termios_locked, sizeof(struct ktermios)); | |
| 642 | + *kterm = tty->termios_locked; | |
| 643 | 643 | mutex_unlock(&tty->termios_mutex); |
| 644 | 644 | } |
| 645 | 645 | |
| @@ -707,16 +707,16 @@ static int get_sgflags(struct tty_struct *tty) · 61 unmodified lines | ||
| 707 | 707 | { |
| 708 | 708 | int flags = 0; |
| 709 | 709 | |
| 710 | − if (!(tty->termios->c_lflag & ICANON)) { | |
| 711 | − if (tty->termios->c_lflag & ISIG) | |
| 710 | + if (!(tty->termios.c_lflag & ICANON)) { | |
| 711 | + if (tty->termios.c_lflag & ISIG) | |
| 712 | 712 | flags |= 0x02; /* cbreak */ |
| 713 | 713 | else |
| 714 | 714 | flags |= 0x20; /* raw */ |
| 715 | 715 | } |
| 716 | − if (tty->termios->c_lflag & ECHO) | |
| 716 | + if (tty->termios.c_lflag & ECHO) | |
| 717 | 717 | flags |= 0x08; /* echo */ |
| 718 | − if (tty->termios->c_oflag & OPOST) | |
| 719 | − if (tty->termios->c_oflag & ONLCR) | |
| 718 | + if (tty->termios.c_oflag & OPOST) | |
| 719 | + if (tty->termios.c_oflag & ONLCR) | |
| 720 | 720 | flags |= 0x10; /* crmod */ |
| 721 | 721 | return flags; |
| 722 | 722 | } |
| @@ -726,10 +726,10 @@ static int get_sgttyb(struct tty_struct *tty, struct sgttyb __user *sgttyb) · 3 unmodified lines | ||
| 726 | 726 | struct sgttyb tmp; |
| 727 | 727 | |
| 728 | 728 | mutex_lock(&tty->termios_mutex); |
| 729 | − tmp.sg_ispeed = tty->termios->c_ispeed; | |
| 730 | − tmp.sg_ospeed = tty->termios->c_ospeed; | |
| 731 | − tmp.sg_erase = tty->termios->c_cc[VERASE]; | |
| 732 | − tmp.sg_kill = tty->termios->c_cc[VKILL]; | |
| 729 | + tmp.sg_ispeed = tty->termios.c_ispeed; | |
| 730 | + tmp.sg_ospeed = tty->termios.c_ospeed; | |
| 731 | + tmp.sg_erase = tty->termios.c_cc[VERASE]; | |
| 732 | + tmp.sg_kill = tty->termios.c_cc[VKILL]; | |
| 733 | 733 | tmp.sg_flags = get_sgflags(tty); |
| 734 | 734 | mutex_unlock(&tty->termios_mutex); |
| 735 | 735 | |
| @@ -787,7 +787,7 @@ static int set_sgttyb(struct tty_struct *tty, struct sgttyb __user *sgttyb) · 51 unmodified lines | ||
| 787 | 787 | return -EFAULT; |
| 788 | 788 | |
| 789 | 789 | mutex_lock(&tty->termios_mutex); |
| 790 | − termios = *tty->termios; | |
| 790 | + termios = tty->termios; | |
| 791 | 791 | termios.c_cc[VERASE] = tmp.sg_erase; |
| 792 | 792 | termios.c_cc[VKILL] = tmp.sg_kill; |
| 793 | 793 | set_sgflags(&termios, tmp.sg_flags); |
| @@ -808,12 +808,12 @@ static int get_tchars(struct tty_struct *tty, struct tchars __user *tchars) · 14 unmodified lines | ||
| 808 | 808 | struct tchars tmp; |
| 809 | 809 | |
| 810 | 810 | mutex_lock(&tty->termios_mutex); |
| 811 | − tmp.t_intrc = tty->termios->c_cc[VINTR]; | |
| 812 | − tmp.t_quitc = tty->termios->c_cc[VQUIT]; | |
| 813 | − tmp.t_startc = tty->termios->c_cc[VSTART]; | |
| 814 | − tmp.t_stopc = tty->termios->c_cc[VSTOP]; | |
| 815 | − tmp.t_eofc = tty->termios->c_cc[VEOF]; | |
| 816 | − tmp.t_brkc = tty->termios->c_cc[VEOL2]; /* what is brkc anyway? */ | |
| 811 | + tmp.t_intrc = tty->termios.c_cc[VINTR]; | |
| 812 | + tmp.t_quitc = tty->termios.c_cc[VQUIT]; | |
| 813 | + tmp.t_startc = tty->termios.c_cc[VSTART]; | |
| 814 | + tmp.t_stopc = tty->termios.c_cc[VSTOP]; | |
| 815 | + tmp.t_eofc = tty->termios.c_cc[VEOF]; | |
| 816 | + tmp.t_brkc = tty->termios.c_cc[VEOL2]; /* what is brkc anyway? */ | |
| 817 | 817 | mutex_unlock(&tty->termios_mutex); |
| 818 | 818 | return copy_to_user(tchars, &tmp, sizeof(tmp)) ? -EFAULT : 0; |
| 819 | 819 | } |
| @@ -825,12 +825,12 @@ static int set_tchars(struct tty_struct *tty, struct tchars __user *tchars) · 5 unmodified lines | ||
| 825 | 825 | if (copy_from_user(&tmp, tchars, sizeof(tmp))) |
| 826 | 826 | return -EFAULT; |
| 827 | 827 | mutex_lock(&tty->termios_mutex); |
| 828 | − tty->termios->c_cc[VINTR] = tmp.t_intrc; | |
| 829 | − tty->termios->c_cc[VQUIT] = tmp.t_quitc; | |
| 830 | − tty->termios->c_cc[VSTART] = tmp.t_startc; | |
| 831 | − tty->termios->c_cc[VSTOP] = tmp.t_stopc; | |
| 832 | − tty->termios->c_cc[VEOF] = tmp.t_eofc; | |
| 833 | − tty->termios->c_cc[VEOL2] = tmp.t_brkc; /* what is brkc anyway? */ | |
| 828 | + tty->termios.c_cc[VINTR] = tmp.t_intrc; | |
| 829 | + tty->termios.c_cc[VQUIT] = tmp.t_quitc; | |
| 830 | + tty->termios.c_cc[VSTART] = tmp.t_startc; | |
| 831 | + tty->termios.c_cc[VSTOP] = tmp.t_stopc; | |
| 832 | + tty->termios.c_cc[VEOF] = tmp.t_eofc; | |
| 833 | + tty->termios.c_cc[VEOL2] = tmp.t_brkc; /* what is brkc anyway? */ | |
| 834 | 834 | mutex_unlock(&tty->termios_mutex); |
| 835 | 835 | return 0; |
| 836 | 836 | } |
| @@ -842,14 +842,14 @@ static int get_ltchars(struct tty_struct *tty, struct ltchars __user *ltchars) · 5 unmodified lines | ||
| 842 | 842 | struct ltchars tmp; |
| 843 | 843 | |
| 844 | 844 | mutex_lock(&tty->termios_mutex); |
| 845 | − tmp.t_suspc = tty->termios->c_cc[VSUSP]; | |
| 845 | + tmp.t_suspc = tty->termios.c_cc[VSUSP]; | |
| 846 | 846 | /* what is dsuspc anyway? */ |
| 847 | − tmp.t_dsuspc = tty->termios->c_cc[VSUSP]; | |
| 848 | − tmp.t_rprntc = tty->termios->c_cc[VREPRINT]; | |
| 847 | + tmp.t_dsuspc = tty->termios.c_cc[VSUSP]; | |
| 848 | + tmp.t_rprntc = tty->termios.c_cc[VREPRINT]; | |
| 849 | 849 | /* what is flushc anyway? */ |
| 850 | − tmp.t_flushc = tty->termios->c_cc[VEOL2]; | |
| 851 | − tmp.t_werasc = tty->termios->c_cc[VWERASE]; | |
| 852 | − tmp.t_lnextc = tty->termios->c_cc[VLNEXT]; | |
| 850 | + tmp.t_flushc = tty->termios.c_cc[VEOL2]; | |
| 851 | + tmp.t_werasc = tty->termios.c_cc[VWERASE]; | |
| 852 | + tmp.t_lnextc = tty->termios.c_cc[VLNEXT]; | |
| 853 | 853 | mutex_unlock(&tty->termios_mutex); |
| 854 | 854 | return copy_to_user(ltchars, &tmp, sizeof(tmp)) ? -EFAULT : 0; |
| 855 | 855 | } |
| @@ -862,14 +862,14 @@ static int set_ltchars(struct tty_struct *tty, struct ltchars __user *ltchars) · 6 unmodified lines | ||
| 862 | 862 | return -EFAULT; |
| 863 | 863 | |
| 864 | 864 | mutex_lock(&tty->termios_mutex); |
| 865 | − tty->termios->c_cc[VSUSP] = tmp.t_suspc; | |
| 865 | + tty->termios.c_cc[VSUSP] = tmp.t_suspc; | |
| 866 | 866 | /* what is dsuspc anyway? */ |
| 867 | − tty->termios->c_cc[VEOL2] = tmp.t_dsuspc; | |
| 868 | − tty->termios->c_cc[VREPRINT] = tmp.t_rprntc; | |
| 867 | + tty->termios.c_cc[VEOL2] = tmp.t_dsuspc; | |
| 868 | + tty->termios.c_cc[VREPRINT] = tmp.t_rprntc; | |
| 869 | 869 | /* what is flushc anyway? */ |
| 870 | − tty->termios->c_cc[VEOL2] = tmp.t_flushc; | |
| 871 | − tty->termios->c_cc[VWERASE] = tmp.t_werasc; | |
| 872 | − tty->termios->c_cc[VLNEXT] = tmp.t_lnextc; | |
| 870 | + tty->termios.c_cc[VEOL2] = tmp.t_flushc; | |
| 871 | + tty->termios.c_cc[VWERASE] = tmp.t_werasc; | |
| 872 | + tty->termios.c_cc[VLNEXT] = tmp.t_lnextc; | |
| 873 | 873 | mutex_unlock(&tty->termios_mutex); |
| 874 | 874 | return 0; |
| 875 | 875 | } |
| @@ -920,12 +920,12 @@ static int tty_change_softcar(struct tty_struct *tty, int arg) · 44 unmodified lines | ||
| 920 | 920 | struct ktermios old; |
| 921 | 921 | |
| 922 | 922 | mutex_lock(&tty->termios_mutex); |
| 923 | − old = *tty->termios; | |
| 924 | − tty->termios->c_cflag &= ~CLOCAL; | |
| 925 | − tty->termios->c_cflag |= bit; | |
| 923 | + old = tty->termios; | |
| 924 | + tty->termios.c_cflag &= ~CLOCAL; | |
| 925 | + tty->termios.c_cflag |= bit; | |
| 926 | 926 | if (tty->ops->set_termios) |
| 927 | 927 | tty->ops->set_termios(tty, &old); |
| 928 | − if ((tty->termios->c_cflag & CLOCAL) != bit) | |
| 928 | + if ((tty->termios.c_cflag & CLOCAL) != bit) | |
| 929 | 929 | ret = -EINVAL; |
| 930 | 930 | mutex_unlock(&tty->termios_mutex); |
| 931 | 931 | return ret; |
| @@ -1031,7 +1031,7 @@ int tty_mode_ioctl(struct tty_struct *tty, struct file *file, · 99 unmodified lines | ||
| 1031 | 1031 | (struct termios __user *) arg)) |
| 1032 | 1032 | return -EFAULT; |
| 1033 | 1033 | mutex_lock(&real_tty->termios_mutex); |
| 1034 | − memcpy(real_tty->termios_locked, &kterm, sizeof(struct ktermios)); | |
| 1034 | + real_tty->termios_locked = kterm; | |
| 1035 | 1035 | mutex_unlock(&real_tty->termios_mutex); |
| 1036 | 1036 | return 0; |
| 1037 | 1037 | #else |
| @@ -1048,7 +1048,7 @@ int tty_mode_ioctl(struct tty_struct *tty, struct file *file, · 10 unmodified lines | ||
| 1048 | 1048 | (struct termios __user *) arg)) |
| 1049 | 1049 | return -EFAULT; |
| 1050 | 1050 | mutex_lock(&real_tty->termios_mutex); |
| 1051 | − memcpy(real_tty->termios_locked, &kterm, sizeof(struct ktermios)); | |
| 1051 | + real_tty->termios_locked = kterm; | |
| 1052 | 1052 | mutex_unlock(&real_tty->termios_mutex); |
| 1053 | 1053 | return ret; |
| 1054 | 1054 | #endif |
| @@ -413,7 +413,7 @@ EXPORT_SYMBOL_GPL(tty_ldisc_flush); · 412 unmodified lines | ||
| 413 | 413 | static void tty_set_termios_ldisc(struct tty_struct *tty, int num) |
| 414 | 414 | { |
| 415 | 415 | mutex_lock(&tty->termios_mutex); |
| 416 | − tty->termios->c_line = num; | |
| 416 | + tty->termios.c_line = num; | |
| 417 | 417 | mutex_unlock(&tty->termios_mutex); |
| 418 | 418 | } |
| 419 | 419 | |
| @@ -568,7 +568,7 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc) · 148 unmodified lines | ||
| 568 | 568 | if (IS_ERR(new_ldisc)) |
| 569 | 569 | return PTR_ERR(new_ldisc); |
| 570 | 570 | |
| 571 | − tty_lock(); | |
| 571 | + tty_lock(tty); | |
| 572 | 572 | /* |
| 573 | 573 | * We need to look at the tty locking here for pty/tty pairs |
| 574 | 574 | * when both sides try to change in parallel. |
| @@ -582,12 +582,12 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc) · 7 unmodified lines | ||
| 582 | 582 | */ |
| 583 | 583 | |
| 584 | 584 | if (tty->ldisc->ops->num == ldisc) { |
| 585 | − tty_unlock(); | |
| 585 | + tty_unlock(tty); | |
| 586 | 586 | tty_ldisc_put(new_ldisc); |
| 587 | 587 | return 0; |
| 588 | 588 | } |
| 589 | 589 | |
| 590 | − tty_unlock(); | |
| 590 | + tty_unlock(tty); | |
| 591 | 591 | /* |
| 592 | 592 | * Problem: What do we do if this blocks ? |
| 593 | 593 | * We could deadlock here |
| @@ -595,7 +595,7 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc) · 1 unmodified line | ||
| 595 | 595 | |
| 596 | 596 | tty_wait_until_sent(tty, 0); |
| 597 | 597 | |
| 598 | − tty_lock(); | |
| 598 | + tty_lock(tty); | |
| 599 | 599 | mutex_lock(&tty->ldisc_mutex); |
| 600 | 600 | |
| 601 | 601 | /* |
| @@ -605,10 +605,10 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc) · 3 unmodified lines | ||
| 605 | 605 | |
| 606 | 606 | while (test_bit(TTY_LDISC_CHANGING, &tty->flags)) { |
| 607 | 607 | mutex_unlock(&tty->ldisc_mutex); |
| 608 | − tty_unlock(); | |
| 608 | + tty_unlock(tty); | |
| 609 | 609 | wait_event(tty_ldisc_wait, |
| 610 | 610 | test_bit(TTY_LDISC_CHANGING, &tty->flags) == 0); |
| 611 | − tty_lock(); | |
| 611 | + tty_lock(tty); | |
| 612 | 612 | mutex_lock(&tty->ldisc_mutex); |
| 613 | 613 | } |
| 614 | 614 | |
| @@ -623,7 +623,7 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc) · 8 unmodified lines | ||
| 623 | 623 | |
| 624 | 624 | o_ldisc = tty->ldisc; |
| 625 | 625 | |
| 626 | − tty_unlock(); | |
| 626 | + tty_unlock(tty); | |
| 627 | 627 | /* |
| 628 | 628 | * Make sure we don't change while someone holds a |
| 629 | 629 | * reference to the line discipline. The TTY_LDISC bit |
| @@ -650,7 +650,7 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc) · 20 unmodified lines | ||
| 650 | 650 | |
| 651 | 651 | retval = tty_ldisc_wait_idle(tty, 5 * HZ); |
| 652 | 652 | |
| 653 | − tty_lock(); | |
| 653 | + tty_lock(tty); | |
| 654 | 654 | mutex_lock(&tty->ldisc_mutex); |
| 655 | 655 | |
| 656 | 656 | /* handle wait idle failure locked */ |
| @@ -665,7 +665,7 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc) · 8 unmodified lines | ||
| 665 | 665 | clear_bit(TTY_LDISC_CHANGING, &tty->flags); |
| 666 | 666 | mutex_unlock(&tty->ldisc_mutex); |
| 667 | 667 | tty_ldisc_put(new_ldisc); |
| 668 | − tty_unlock(); | |
| 668 | + tty_unlock(tty); | |
| 669 | 669 | return -EIO; |
| 670 | 670 | } |
| 671 | 671 | |
| @@ -708,7 +708,7 @@ enable: · 36 unmodified lines | ||
| 708 | 708 | if (o_work) |
| 709 | 709 | schedule_work(&o_tty->buf.work); |
| 710 | 710 | mutex_unlock(&tty->ldisc_mutex); |
| 711 | − tty_unlock(); | |
| 711 | + tty_unlock(tty); | |
| 712 | 712 | return retval; |
| 713 | 713 | } |
| 714 | 714 | |
| @@ -722,9 +722,9 @@ enable: · 7 unmodified lines | ||
| 722 | 722 | static void tty_reset_termios(struct tty_struct *tty) |
| 723 | 723 | { |
| 724 | 724 | mutex_lock(&tty->termios_mutex); |
| 725 | − *tty->termios = tty->driver->init_termios; | |
| 726 | − tty->termios->c_ispeed = tty_termios_input_baud_rate(tty->termios); | |
| 727 | − tty->termios->c_ospeed = tty_termios_baud_rate(tty->termios); | |
| 725 | + tty->termios = tty->driver->init_termios; | |
| 726 | + tty->termios.c_ispeed = tty_termios_input_baud_rate(&tty->termios); | |
| 727 | + tty->termios.c_ospeed = tty_termios_baud_rate(&tty->termios); | |
| 728 | 728 | mutex_unlock(&tty->termios_mutex); |
| 729 | 729 | } |
| 730 | 730 | |
| @@ -816,11 +816,11 @@ void tty_ldisc_hangup(struct tty_struct *tty) · 85 unmodified lines | ||
| 816 | 816 | * need to wait for another function taking the BTM |
| 817 | 817 | */ |
| 818 | 818 | clear_bit(TTY_LDISC, &tty->flags); |
| 819 | − tty_unlock(); | |
| 819 | + tty_unlock(tty); | |
| 820 | 820 | cancel_work_sync(&tty->buf.work); |
| 821 | 821 | mutex_unlock(&tty->ldisc_mutex); |
| 822 | 822 | retry: |
| 823 | − tty_lock(); | |
| 823 | + tty_lock(tty); | |
| 824 | 824 | mutex_lock(&tty->ldisc_mutex); |
| 825 | 825 | |
| 826 | 826 | /* At this point we have a closed ldisc and we want to |
| @@ -831,7 +831,7 @@ retry: · 4 unmodified lines | ||
| 831 | 831 | if (atomic_read(&tty->ldisc->users) != 1) { |
| 832 | 832 | char cur_n[TASK_COMM_LEN], tty_n[64]; |
| 833 | 833 | long timeout = 3 * HZ; |
| 834 | − tty_unlock(); | |
| 834 | + tty_unlock(tty); | |
| 835 | 835 | |
| 836 | 836 | while (tty_ldisc_wait_idle(tty, timeout) == -EBUSY) { |
| 837 | 837 | timeout = MAX_SCHEDULE_TIMEOUT; |
| @@ -846,7 +846,7 @@ retry: · 8 unmodified lines | ||
| 846 | 846 | |
| 847 | 847 | if (reset == 0) { |
| 848 | 848 | |
| 849 | − if (!tty_ldisc_reinit(tty, tty->termios->c_line)) | |
| 849 | + if (!tty_ldisc_reinit(tty, tty->termios.c_line)) | |
| 850 | 850 | err = tty_ldisc_open(tty, tty->ldisc); |
| 851 | 851 | else |
| 852 | 852 | err = 1; |
| @@ -894,6 +894,23 @@ int tty_ldisc_setup(struct tty_struct *tty, struct tty_struct *o_tty) · 41 unmodified lines | ||
| 894 | 894 | tty_ldisc_enable(tty); |
| 895 | 895 | return 0; |
| 896 | 896 | } |
| 897 | + | |
| 898 | +static void tty_ldisc_kill(struct tty_struct *tty) | |
| 899 | +{ | |
| 900 | + mutex_lock(&tty->ldisc_mutex); | |
| 901 | + /* | |
| 902 | + * Now kill off the ldisc | |
| 903 | + */ | |
| 904 | + tty_ldisc_close(tty, tty->ldisc); | |
| 905 | + tty_ldisc_put(tty->ldisc); | |
| 906 | + /* Force an oops if we mess this up */ | |
| 907 | + tty->ldisc = NULL; | |
| 908 | + | |
| 909 | + /* Ensure the next open requests the N_TTY ldisc */ | |
| 910 | + tty_set_termios_ldisc(tty, N_TTY); | |
| 911 | + mutex_unlock(&tty->ldisc_mutex); | |
| 912 | +} | |
| 913 | + | |
| 897 | 914 | /** |
| 898 | 915 | * tty_ldisc_release - release line discipline |
| 899 | 916 | * @tty: tty being shut down |
| @@ -912,28 +929,21 @@ void tty_ldisc_release(struct tty_struct *tty, struct tty_struct *o_tty) · 12 unmodified lines | ||
| 912 | 929 | * race with the set_ldisc code path. |
| 913 | 930 | */ |
| 914 | 931 | |
| 915 | − tty_unlock(); | |
| 932 | + tty_lock_pair(tty, o_tty); | |
| 916 | 933 | tty_ldisc_halt(tty); |
| 917 | 934 | tty_ldisc_flush_works(tty); |
| 918 | − tty_lock(); | |
| 919 | − | |
| 920 | − mutex_lock(&tty->ldisc_mutex); | |
| 921 | − /* | |
| 922 | − * Now kill off the ldisc | |
| 923 | − */ | |
| 924 | − tty_ldisc_close(tty, tty->ldisc); | |
| 925 | − tty_ldisc_put(tty->ldisc); | |
| 926 | − /* Force an oops if we mess this up */ | |
| 927 | − tty->ldisc = NULL; | |
| 928 | − | |
| 929 | − /* Ensure the next open requests the N_TTY ldisc */ | |
| 930 | − tty_set_termios_ldisc(tty, N_TTY); | |
| 931 | − mutex_unlock(&tty->ldisc_mutex); | |
| 935 | + if (o_tty) { | |
| 936 | + tty_ldisc_halt(o_tty); | |
| 937 | + tty_ldisc_flush_works(o_tty); | |
| 938 | + } | |
| 932 | 939 | |
| 933 | 940 | /* This will need doing differently if we need to lock */ |
| 941 | + tty_ldisc_kill(tty); | |
| 942 | + | |
| 934 | 943 | if (o_tty) |
| 935 | − tty_ldisc_release(o_tty, NULL); | |
| 944 | + tty_ldisc_kill(o_tty); | |
| 936 | 945 | |
| 946 | + tty_unlock_pair(tty, o_tty); | |
| 937 | 947 | /* And the memory resources remaining (buffers, termios) will be |
| 938 | 948 | disposed of when the kref hits zero */ |
| 939 | 949 | } |
| @@ -4,29 +4,70 @@ · 3 unmodified lines | ||
| 4 | 4 | #include <linux/semaphore.h> |
| 5 | 5 | #include <linux/sched.h> |
| 6 | 6 | |
| 7 | −/* | |
| 8 | − * The 'big tty mutex' | |
| 9 | − * | |
| 10 | − * This mutex is taken and released by tty_lock() and tty_unlock(), | |
| 11 | − * replacing the older big kernel lock. | |
| 12 | − * It can no longer be taken recursively, and does not get | |
| 13 | − * released implicitly while sleeping. | |
| 14 | − * | |
| 15 | − * Don't use in new code. | |
| 16 | − */ | |
| 17 | −static DEFINE_MUTEX(big_tty_mutex); | |
| 7 | +/* Legacy tty mutex glue */ | |
| 8 | + | |
| 9 | +enum { | |
| 10 | + TTY_MUTEX_NORMAL, | |
| 11 | + TTY_MUTEX_NESTED, | |
| 12 | +}; | |
| 18 | 13 | |
| 19 | 14 | /* |
| 20 | 15 | * Getting the big tty mutex. |
| 21 | 16 | */ |
| 22 | −void __lockfunc tty_lock(void) | |
| 17 | + | |
| 18 | +static void __lockfunc tty_lock_nested(struct tty_struct *tty, | |
| 19 | + unsigned int subclass) | |
| 23 | 20 | { |
| 24 | − mutex_lock(&big_tty_mutex); | |
| 21 | + if (tty->magic != TTY_MAGIC) { | |
| 22 | + printk(KERN_ERR "L Bad %p\n", tty); | |
| 23 | + WARN_ON(1); | |
| 24 | + return; | |
| 25 | + } | |
| 26 | + tty_kref_get(tty); | |
| 27 | + mutex_lock_nested(&tty->legacy_mutex, subclass); | |
| 28 | +} | |
| 29 | + | |
| 30 | +void __lockfunc tty_lock(struct tty_struct *tty) | |
| 31 | +{ | |
| 32 | + return tty_lock_nested(tty, TTY_MUTEX_NORMAL); | |
| 25 | 33 | } |
| 26 | 34 | EXPORT_SYMBOL(tty_lock); |
| 27 | 35 | |
| 28 | −void __lockfunc tty_unlock(void) | |
| 36 | +void __lockfunc tty_unlock(struct tty_struct *tty) | |
| 29 | 37 | { |
| 30 | − mutex_unlock(&big_tty_mutex); | |
| 38 | + if (tty->magic != TTY_MAGIC) { | |
| 39 | + printk(KERN_ERR "U Bad %p\n", tty); | |
| 40 | + WARN_ON(1); | |
| 41 | + return; | |
| 42 | + } | |
| 43 | + mutex_unlock(&tty->legacy_mutex); | |
| 44 | + tty_kref_put(tty); | |
| 31 | 45 | } |
| 32 | 46 | EXPORT_SYMBOL(tty_unlock); |
| 47 | + | |
| 48 | +/* | |
| 49 | + * Getting the big tty mutex for a pair of ttys with lock ordering | |
| 50 | + * On a non pty/tty pair tty2 can be NULL which is just fine. | |
| 51 | + */ | |
| 52 | +void __lockfunc tty_lock_pair(struct tty_struct *tty, | |
| 53 | + struct tty_struct *tty2) | |
| 54 | +{ | |
| 55 | + if (tty < tty2) { | |
| 56 | + tty_lock(tty); | |
| 57 | + tty_lock_nested(tty2, TTY_MUTEX_NESTED); | |
| 58 | + } else { | |
| 59 | + if (tty2 && tty2 != tty) | |
| 60 | + tty_lock(tty2); | |
| 61 | + tty_lock_nested(tty, TTY_MUTEX_NESTED); | |
| 62 | + } | |
| 63 | +} | |
| 64 | +EXPORT_SYMBOL(tty_lock_pair); | |
| 65 | + | |
| 66 | +void __lockfunc tty_unlock_pair(struct tty_struct *tty, | |
| 67 | + struct tty_struct *tty2) | |
| 68 | +{ | |
| 69 | + tty_unlock(tty); | |
| 70 | + if (tty2 && tty2 != tty) | |
| 71 | + tty_unlock(tty2); | |
| 72 | +} | |
| 73 | +EXPORT_SYMBOL(tty_unlock_pair); | |
| @@ -33,6 +33,70 @@ void tty_port_init(struct tty_port *port) · 32 unmodified lines | ||
| 33 | 33 | } |
| 34 | 34 | EXPORT_SYMBOL(tty_port_init); |
| 35 | 35 | |
| 36 | +/** | |
| 37 | + * tty_port_link_device - link tty and tty_port | |
| 38 | + * @port: tty_port of the device | |
| 39 | + * @driver: tty_driver for this device | |
| 40 | + * @index: index of the tty | |
| 41 | + * | |
| 42 | + * Provide the tty layer wit ha link from a tty (specified by @index) to a | |
| 43 | + * tty_port (@port). Use this only if neither tty_port_register_device nor | |
| 44 | + * tty_port_install is used in the driver. If used, this has to be called before | |
| 45 | + * tty_register_driver. | |
| 46 | + */ | |
| 47 | +void tty_port_link_device(struct tty_port *port, | |
| 48 | + struct tty_driver *driver, unsigned index) | |
| 49 | +{ | |
| 50 | + if (WARN_ON(index >= driver->num)) | |
| 51 | + return; | |
| 52 | + driver->ports[index] = port; | |
| 53 | +} | |
| 54 | +EXPORT_SYMBOL_GPL(tty_port_link_device); | |
| 55 | + | |
| 56 | +/** | |
| 57 | + * tty_port_register_device - register tty device | |
| 58 | + * @port: tty_port of the device | |
| 59 | + * @driver: tty_driver for this device | |
| 60 | + * @index: index of the tty | |
| 61 | + * @device: parent if exists, otherwise NULL | |
| 62 | + * | |
| 63 | + * It is the same as tty_register_device except the provided @port is linked to | |
| 64 | + * a concrete tty specified by @index. Use this or tty_port_install (or both). | |
| 65 | + * Call tty_port_link_device as a last resort. | |
| 66 | + */ | |
| 67 | +struct device *tty_port_register_device(struct tty_port *port, | |
| 68 | + struct tty_driver *driver, unsigned index, | |
| 69 | + struct device *device) | |
| 70 | +{ | |
| 71 | + tty_port_link_device(port, driver, index); | |
| 72 | + return tty_register_device(driver, index, device); | |
| 73 | +} | |
| 74 | +EXPORT_SYMBOL_GPL(tty_port_register_device); | |
| 75 | + | |
| 76 | +/** | |
| 77 | + * tty_port_register_device_attr - register tty device | |
| 78 | + * @port: tty_port of the device | |
| 79 | + * @driver: tty_driver for this device | |
| 80 | + * @index: index of the tty | |
| 81 | + * @device: parent if exists, otherwise NULL | |
| 82 | + * @drvdata: Driver data to be set to device. | |
| 83 | + * @attr_grp: Attribute group to be set on device. | |
| 84 | + * | |
| 85 | + * It is the same as tty_register_device_attr except the provided @port is | |
| 86 | + * linked to a concrete tty specified by @index. Use this or tty_port_install | |
| 87 | + * (or both). Call tty_port_link_device as a last resort. | |
| 88 | + */ | |
| 89 | +struct device *tty_port_register_device_attr(struct tty_port *port, | |
| 90 | + struct tty_driver *driver, unsigned index, | |
| 91 | + struct device *device, void *drvdata, | |
| 92 | + const struct attribute_group **attr_grp) | |
| 93 | +{ | |
| 94 | + tty_port_link_device(port, driver, index); | |
| 95 | + return tty_register_device_attr(driver, index, device, drvdata, | |
| 96 | + attr_grp); | |
| 97 | +} | |
| 98 | +EXPORT_SYMBOL_GPL(tty_port_register_device_attr); | |
| 99 | + | |
| 36 | 100 | int tty_port_alloc_xmit_buf(struct tty_port *port) |
| 37 | 101 | { |
| 38 | 102 | /* We may sleep in get_zeroed_page() */ |
| @@ -230,7 +294,7 @@ int tty_port_block_til_ready(struct tty_port *port, · 191 unmodified lines | ||
| 230 | 294 | |
| 231 | 295 | /* block if port is in the process of being closed */ |
| 232 | 296 | if (tty_hung_up_p(filp) || port->flags & ASYNC_CLOSING) { |
| 233 | − wait_event_interruptible_tty(port->close_wait, | |
| 297 | + wait_event_interruptible_tty(tty, port->close_wait, | |
| 234 | 298 | !(port->flags & ASYNC_CLOSING)); |
| 235 | 299 | if (port->flags & ASYNC_HUP_NOTIFY) |
| 236 | 300 | return -EAGAIN; |
| @@ -246,7 +310,7 @@ int tty_port_block_til_ready(struct tty_port *port, · 9 unmodified lines | ||
| 246 | 310 | } |
| 247 | 311 | if (filp->f_flags & O_NONBLOCK) { |
| 248 | 312 | /* Indicate we are open */ |
| 249 | − if (tty->termios->c_cflag & CBAUD) | |
| 313 | + if (tty->termios.c_cflag & CBAUD) | |
| 250 | 314 | tty_port_raise_dtr_rts(port); |
| 251 | 315 | port->flags |= ASYNC_NORMAL_ACTIVE; |
| 252 | 316 | return 0; |
| @@ -270,7 +334,7 @@ int tty_port_block_til_ready(struct tty_port *port, · 17 unmodified lines | ||
| 270 | 334 | |
| 271 | 335 | while (1) { |
| 272 | 336 | /* Indicate we are open */ |
| 273 | − if (tty->termios->c_cflag & CBAUD) | |
| 337 | + if (tty->termios.c_cflag & CBAUD) | |
| 274 | 338 | tty_port_raise_dtr_rts(port); |
| 275 | 339 | |
| 276 | 340 | prepare_to_wait(&port->open_wait, &wait, TASK_INTERRUPTIBLE); |
| @@ -296,9 +360,9 @@ int tty_port_block_til_ready(struct tty_port *port, · 19 unmodified lines | ||
| 296 | 360 | retval = -ERESTARTSYS; |
| 297 | 361 | break; |
| 298 | 362 | } |
| 299 | − tty_unlock(); | |
| 363 | + tty_unlock(tty); | |
| 300 | 364 | schedule(); |
| 301 | − tty_lock(); | |
| 365 | + tty_lock(tty); | |
| 302 | 366 | } |
| 303 | 367 | finish_wait(&port->open_wait, &wait); |
| 304 | 368 | |
| @@ -369,7 +433,7 @@ int tty_port_close_start(struct tty_port *port, · 64 unmodified lines | ||
| 369 | 433 | |
| 370 | 434 | /* Drop DTR/RTS if HUPCL is set. This causes any attached modem to |
| 371 | 435 | hang up the line */ |
| 372 | − if (tty->termios->c_cflag & HUPCL) | |
| 436 | + if (tty->termios.c_cflag & HUPCL) | |
| 373 | 437 | tty_port_lower_dtr_rts(port); |
| 374 | 438 | |
| 375 | 439 | /* Don't call port->drop for the last reference. Callers will want |
| @@ -413,6 +477,24 @@ void tty_port_close(struct tty_port *port, struct tty_struct *tty, · 37 unmodified lines | ||
| 413 | 477 | } |
| 414 | 478 | EXPORT_SYMBOL(tty_port_close); |
| 415 | 479 | |
| 480 | +/** | |
| 481 | + * tty_port_install - generic tty->ops->install handler | |
| 482 | + * @port: tty_port of the device | |
| 483 | + * @driver: tty_driver for this device | |
| 484 | + * @tty: tty to be installed | |
| 485 | + * | |
| 486 | + * It is the same as tty_standard_install except the provided @port is linked | |
| 487 | + * to a concrete tty specified by @tty. Use this or tty_port_register_device | |
| 488 | + * (or both). Call tty_port_link_device as a last resort. | |
| 489 | + */ | |
| 490 | +int tty_port_install(struct tty_port *port, struct tty_driver *driver, | |
| 491 | + struct tty_struct *tty) | |
| 492 | +{ | |
| 493 | + tty->port = port; | |
| 494 | + return tty_standard_install(driver, tty); | |
| 495 | +} | |
| 496 | +EXPORT_SYMBOL_GPL(tty_port_install); | |
| 497 | + | |
| 416 | 498 | int tty_port_open(struct tty_port *port, struct tty_struct *tty, |
| 417 | 499 | struct file *filp) |
| 418 | 500 | { |
| @@ -119,6 +119,7 @@ static const int NR_TYPES = ARRAY_SIZE(max_vals); · 118 unmodified lines | ||
| 119 | 119 | |
| 120 | 120 | static struct input_handler kbd_handler; |
| 121 | 121 | static DEFINE_SPINLOCK(kbd_event_lock); |
| 122 | +static DEFINE_SPINLOCK(led_lock); | |
| 122 | 123 | static unsigned long key_down[BITS_TO_LONGS(KEY_CNT)]; /* keyboard key bitmap */ |
| 123 | 124 | static unsigned char shift_down[NR_SHIFT]; /* shift state counters.. */ |
| 124 | 125 | static bool dead_key_next; |
| @@ -310,7 +311,7 @@ static void put_queue(struct vc_data *vc, int ch) · 185 unmodified lines | ||
| 310 | 311 | |
| 311 | 312 | if (tty) { |
| 312 | 313 | tty_insert_flip_char(tty, ch, 0); |
| 313 | − con_schedule_flip(tty); | |
| 314 | + tty_schedule_flip(tty); | |
| 314 | 315 | } |
| 315 | 316 | } |
| 316 | 317 | |
| @@ -325,7 +326,7 @@ static void puts_queue(struct vc_data *vc, char *cp) · 8 unmodified lines | ||
| 325 | 326 | tty_insert_flip_char(tty, *cp, 0); |
| 326 | 327 | cp++; |
| 327 | 328 | } |
| 328 | − con_schedule_flip(tty); | |
| 329 | + tty_schedule_flip(tty); | |
| 329 | 330 | } |
| 330 | 331 | |
| 331 | 332 | static void applkey(struct vc_data *vc, int key, char mode) |
| @@ -586,7 +587,7 @@ static void fn_send_intr(struct vc_data *vc) · 254 unmodified lines | ||
| 586 | 587 | if (!tty) |
| 587 | 588 | return; |
| 588 | 589 | tty_insert_flip_char(tty, 0, TTY_BREAK); |
| 589 | − con_schedule_flip(tty); | |
| 590 | + tty_schedule_flip(tty); | |
| 590 | 591 | } |
| 591 | 592 | |
| 592 | 593 | static void fn_scroll_forw(struct vc_data *vc) |
| @@ -984,7 +985,7 @@ static void k_brl(struct vc_data *vc, unsigned char value, char up_flag) · 391 unmodified lines | ||
| 984 | 985 | * or (ii) whatever pattern of lights people want to show using KDSETLED, |
| 985 | 986 | * or (iii) specified bits of specified words in kernel memory. |
| 986 | 987 | */ |
| 987 | −unsigned char getledstate(void) | |
| 988 | +static unsigned char getledstate(void) | |
| 988 | 989 | { |
| 989 | 990 | return ledstate; |
| 990 | 991 | } |
| @@ -992,7 +993,7 @@ unsigned char getledstate(void) · 1 unmodified line | ||
| 992 | 993 | void setledstate(struct kbd_struct *kbd, unsigned int led) |
| 993 | 994 | { |
| 994 | 995 | unsigned long flags; |
| 995 | − spin_lock_irqsave(&kbd_event_lock, flags); | |
| 996 | + spin_lock_irqsave(&led_lock, flags); | |
| 996 | 997 | if (!(led & ~7)) { |
| 997 | 998 | ledioctl = led; |
| 998 | 999 | kbd->ledmode = LED_SHOW_IOCTL; |
| @@ -1000,7 +1001,7 @@ void setledstate(struct kbd_struct *kbd, unsigned int led) · 1 unmodified line | ||
| 1000 | 1001 | kbd->ledmode = LED_SHOW_FLAGS; |
| 1001 | 1002 | |
| 1002 | 1003 | set_leds(); |
| 1003 | − spin_unlock_irqrestore(&kbd_event_lock, flags); | |
| 1004 | + spin_unlock_irqrestore(&led_lock, flags); | |
| 1004 | 1005 | } |
| 1005 | 1006 | |
| 1006 | 1007 | static inline unsigned char getleds(void) |
| @@ -1049,13 +1050,13 @@ static int kbd_update_leds_helper(struct input_handle *handle, void *data) · 42 unmodified lines | ||
| 1049 | 1050 | */ |
| 1050 | 1051 | int vt_get_leds(int console, int flag) |
| 1051 | 1052 | { |
| 1052 | − unsigned long flags; | |
| 1053 | 1053 | struct kbd_struct * kbd = kbd_table + console; |
| 1054 | 1054 | int ret; |
| 1055 | + unsigned long flags; | |
| 1055 | 1056 | |
| 1056 | − spin_lock_irqsave(&kbd_event_lock, flags); | |
| 1057 | + spin_lock_irqsave(&led_lock, flags); | |
| 1057 | 1058 | ret = vc_kbd_led(kbd, flag); |
| 1058 | − spin_unlock_irqrestore(&kbd_event_lock, flags); | |
| 1059 | + spin_unlock_irqrestore(&led_lock, flags); | |
| 1059 | 1060 | |
| 1060 | 1061 | return ret; |
| 1061 | 1062 | } |
| @@ -1091,11 +1092,11 @@ void vt_set_led_state(int console, int leds) · 29 unmodified lines | ||
| 1091 | 1092 | void vt_kbd_con_start(int console) |
| 1092 | 1093 | { |
| 1093 | 1094 | struct kbd_struct * kbd = kbd_table + console; |
| 1094 | −/* unsigned long flags; */ | |
| 1095 | −/* spin_lock_irqsave(&kbd_event_lock, flags); */ | |
| 1095 | + unsigned long flags; | |
| 1096 | + spin_lock_irqsave(&led_lock, flags); | |
| 1096 | 1097 | clr_vc_kbd_led(kbd, VC_SCROLLOCK); |
| 1097 | 1098 | set_leds(); |
| 1098 | −/* spin_unlock_irqrestore(&kbd_event_lock, flags); */ | |
| 1099 | + spin_unlock_irqrestore(&led_lock, flags); | |
| 1099 | 1100 | } |
| 1100 | 1101 | |
| 1101 | 1102 | /** |
| @@ -1104,21 +1105,15 @@ void vt_kbd_con_start(int console) · 2 unmodified lines | ||
| 1104 | 1105 | * |
| 1105 | 1106 | * Handle console stop. This is a wrapper for the VT layer |
| 1106 | 1107 | * so that we can keep kbd knowledge internal |
| 1107 | − * | |
| 1108 | − * FIXME: We eventually need to hold the kbd lock here to protect | |
| 1109 | − * the LED updating. We can't do it yet because fn_hold calls stop_tty | |
| 1110 | − * and start_tty under the kbd_event_lock, while normal tty paths | |
| 1111 | − * don't hold the lock. We probably need to split out an LED lock | |
| 1112 | − * but not during an -rc release! | |
| 1113 | 1108 | */ |
| 1114 | 1109 | void vt_kbd_con_stop(int console) |
| 1115 | 1110 | { |
| 1116 | 1111 | struct kbd_struct * kbd = kbd_table + console; |
| 1117 | −/* unsigned long flags; */ | |
| 1118 | −/* spin_lock_irqsave(&kbd_event_lock, flags); */ | |
| 1112 | + unsigned long flags; | |
| 1113 | + spin_lock_irqsave(&led_lock, flags); | |
| 1119 | 1114 | set_vc_kbd_led(kbd, VC_SCROLLOCK); |
| 1120 | 1115 | set_leds(); |
| 1121 | −/* spin_unlock_irqrestore(&kbd_event_lock, flags); */ | |
| 1116 | + spin_unlock_irqrestore(&led_lock, flags); | |
| 1122 | 1117 | } |
| 1123 | 1118 | |
| 1124 | 1119 | /* |
| @@ -1130,7 +1125,12 @@ void vt_kbd_con_stop(int console) · 5 unmodified lines | ||
| 1130 | 1125 | */ |
| 1131 | 1126 | static void kbd_bh(unsigned long dummy) |
| 1132 | 1127 | { |
| 1133 | − unsigned char leds = getleds(); | |
| 1128 | + unsigned char leds; | |
| 1129 | + unsigned long flags; | |
| 1130 | + | |
| 1131 | + spin_lock_irqsave(&led_lock, flags); | |
| 1132 | + leds = getleds(); | |
| 1133 | + spin_unlock_irqrestore(&led_lock, flags); | |
| 1134 | 1134 | |
| 1135 | 1135 | if (leds != ledstate) { |
| 1136 | 1136 | input_handler_for_each_handle(&kbd_handler, &leds, |
| @@ -2035,11 +2035,11 @@ int vt_do_kdskled(int console, int cmd, unsigned long arg, int perm) · 898 unmodified lines | ||
| 2035 | 2035 | return -EPERM; |
| 2036 | 2036 | if (arg & ~0x77) |
| 2037 | 2037 | return -EINVAL; |
| 2038 | − spin_lock_irqsave(&kbd_event_lock, flags); | |
| 2038 | + spin_lock_irqsave(&led_lock, flags); | |
| 2039 | 2039 | kbd->ledflagstate = (arg & 7); |
| 2040 | 2040 | kbd->default_ledflagstate = ((arg >> 4) & 7); |
| 2041 | 2041 | set_leds(); |
| 2042 | − spin_unlock_irqrestore(&kbd_event_lock, flags); | |
| 2042 | + spin_unlock_irqrestore(&led_lock, flags); | |
| 2043 | 2043 | return 0; |
| 2044 | 2044 | |
| 2045 | 2045 | /* the ioctls below only set the lights, not the functions */ |
| @@ -2134,8 +2134,10 @@ void vt_reset_keyboard(int console) · 88 unmodified lines | ||
| 2134 | 2134 | clr_vc_kbd_mode(kbd, VC_CRLF); |
| 2135 | 2135 | kbd->lockstate = 0; |
| 2136 | 2136 | kbd->slockstate = 0; |
| 2137 | + spin_lock(&led_lock); | |
| 2137 | 2138 | kbd->ledmode = LED_SHOW_FLAGS; |
| 2138 | 2139 | kbd->ledflagstate = kbd->default_ledflagstate; |
| 2140 | + spin_unlock(&led_lock); | |
| 2139 | 2141 | /* do not do set_leds here because this causes an endless tasklet loop |
| 2140 | 2142 | when the keyboard hasn't been initialized yet */ |
| 2141 | 2143 | spin_unlock_irqrestore(&kbd_event_lock, flags); |
| @@ -537,45 +537,27 @@ void complement_pos(struct vc_data *vc, int offset) · 536 unmodified lines | ||
| 537 | 537 | |
| 538 | 538 | static void insert_char(struct vc_data *vc, unsigned int nr) |
| 539 | 539 | { |
| 540 | − unsigned short *p, *q = (unsigned short *)vc->vc_pos; | |
| 540 | + unsigned short *p = (unsigned short *) vc->vc_pos; | |
| 541 | 541 | |
| 542 | − p = q + vc->vc_cols - nr - vc->vc_x; | |
| 543 | − while (--p >= q) | |
| 544 | − scr_writew(scr_readw(p), p + nr); | |
| 545 | − scr_memsetw(q, vc->vc_video_erase_char, nr * 2); | |
| 542 | + scr_memmovew(p + nr, p, vc->vc_cols - vc->vc_x); | |
| 543 | + scr_memsetw(p, vc->vc_video_erase_char, nr * 2); | |
| 546 | 544 | vc->vc_need_wrap = 0; |
| 547 | − if (DO_UPDATE(vc)) { | |
| 548 | − unsigned short oldattr = vc->vc_attr; | |
| 549 | − vc->vc_sw->con_bmove(vc, vc->vc_y, vc->vc_x, vc->vc_y, vc->vc_x + nr, 1, | |
| 550 | − vc->vc_cols - vc->vc_x - nr); | |
| 551 | − vc->vc_attr = vc->vc_video_erase_char >> 8; | |
| 552 | − while (nr--) | |
| 553 | − vc->vc_sw->con_putc(vc, vc->vc_video_erase_char, vc->vc_y, vc->vc_x + nr); | |
| 554 | − vc->vc_attr = oldattr; | |
| 555 | − } | |
| 545 | + if (DO_UPDATE(vc)) | |
| 546 | + do_update_region(vc, (unsigned long) p, | |
| 547 | + (vc->vc_cols - vc->vc_x) / 2 + 1); | |
| 556 | 548 | } |
| 557 | 549 | |
| 558 | 550 | static void delete_char(struct vc_data *vc, unsigned int nr) |
| 559 | 551 | { |
| 560 | − unsigned int i = vc->vc_x; | |
| 561 | − unsigned short *p = (unsigned short *)vc->vc_pos; | |
| 552 | + unsigned short *p = (unsigned short *) vc->vc_pos; | |
| 562 | 553 | |
| 563 | − while (++i <= vc->vc_cols - nr) { | |
| 564 | − scr_writew(scr_readw(p+nr), p); | |
| 565 | − p++; | |
| 566 | − } | |
| 567 | − scr_memsetw(p, vc->vc_video_erase_char, nr * 2); | |
| 554 | + scr_memcpyw(p, p + nr, vc->vc_cols - vc->vc_x - nr); | |
| 555 | + scr_memsetw(p + vc->vc_cols - vc->vc_x - nr, vc->vc_video_erase_char, | |
| 556 | + nr * 2); | |
| 568 | 557 | vc->vc_need_wrap = 0; |
| 569 | − if (DO_UPDATE(vc)) { | |
| 570 | − unsigned short oldattr = vc->vc_attr; | |
| 571 | − vc->vc_sw->con_bmove(vc, vc->vc_y, vc->vc_x + nr, vc->vc_y, vc->vc_x, 1, | |
| 572 | − vc->vc_cols - vc->vc_x - nr); | |
| 573 | − vc->vc_attr = vc->vc_video_erase_char >> 8; | |
| 574 | − while (nr--) | |
| 575 | − vc->vc_sw->con_putc(vc, vc->vc_video_erase_char, vc->vc_y, | |
| 576 | − vc->vc_cols - 1 - nr); | |
| 577 | − vc->vc_attr = oldattr; | |
| 578 | − } | |
| 558 | + if (DO_UPDATE(vc)) | |
| 559 | + do_update_region(vc, (unsigned long) p, | |
| 560 | + (vc->vc_cols - vc->vc_x) / 2); | |
| 579 | 561 | } |
| 580 | 562 | |
| 581 | 563 | static int softcursor_original; |
| @@ -1172,45 +1154,26 @@ static void csi_J(struct vc_data *vc, int vpar) · 590 unmodified lines | ||
| 1172 | 1154 | case 0: /* erase from cursor to end of display */ |
| 1173 | 1155 | count = (vc->vc_scr_end - vc->vc_pos) >> 1; |
| 1174 | 1156 | start = (unsigned short *)vc->vc_pos; |
| 1175 | − if (DO_UPDATE(vc)) { | |
| 1176 | − /* do in two stages */ | |
| 1177 | − vc->vc_sw->con_clear(vc, vc->vc_y, vc->vc_x, 1, | |
| 1178 | − vc->vc_cols - vc->vc_x); | |
| 1179 | − vc->vc_sw->con_clear(vc, vc->vc_y + 1, 0, | |
| 1180 | − vc->vc_rows - vc->vc_y - 1, | |
| 1181 | − vc->vc_cols); | |
| 1182 | − } | |
| 1183 | 1157 | break; |
| 1184 | 1158 | case 1: /* erase from start to cursor */ |
| 1185 | 1159 | count = ((vc->vc_pos - vc->vc_origin) >> 1) + 1; |
| 1186 | 1160 | start = (unsigned short *)vc->vc_origin; |
| 1187 | − if (DO_UPDATE(vc)) { | |
| 1188 | − /* do in two stages */ | |
| 1189 | − vc->vc_sw->con_clear(vc, 0, 0, vc->vc_y, | |
| 1190 | − vc->vc_cols); | |
| 1191 | − vc->vc_sw->con_clear(vc, vc->vc_y, 0, 1, | |
| 1192 | − vc->vc_x + 1); | |
| 1193 | − } | |
| 1194 | 1161 | break; |
| 1195 | 1162 | case 3: /* erase scroll-back buffer (and whole display) */ |
| 1196 | 1163 | scr_memsetw(vc->vc_screenbuf, vc->vc_video_erase_char, |
| 1197 | 1164 | vc->vc_screenbuf_size >> 1); |
| 1198 | 1165 | set_origin(vc); |
| 1199 | − if (CON_IS_VISIBLE(vc)) | |
| 1200 | − update_screen(vc); | |
| 1201 | 1166 | /* fall through */ |
| 1202 | 1167 | case 2: /* erase whole display */ |
| 1203 | 1168 | count = vc->vc_cols * vc->vc_rows; |
| 1204 | 1169 | start = (unsigned short *)vc->vc_origin; |
| 1205 | − if (DO_UPDATE(vc)) | |
| 1206 | − vc->vc_sw->con_clear(vc, 0, 0, | |
| 1207 | − vc->vc_rows, | |
| 1208 | − vc->vc_cols); | |
| 1209 | 1170 | break; |
| 1210 | 1171 | default: |
| 1211 | 1172 | return; |
| 1212 | 1173 | } |
| 1213 | 1174 | scr_memsetw(start, vc->vc_video_erase_char, 2 * count); |
| 1175 | + if (DO_UPDATE(vc)) | |
| 1176 | + do_update_region(vc, (unsigned long) start, count); | |
| 1214 | 1177 | vc->vc_need_wrap = 0; |
| 1215 | 1178 | } |
| 1216 | 1179 | |
| @@ -1223,29 +1186,22 @@ static void csi_K(struct vc_data *vc, int vpar) · 6 unmodified lines | ||
| 1223 | 1186 | case 0: /* erase from cursor to end of line */ |
| 1224 | 1187 | count = vc->vc_cols - vc->vc_x; |
| 1225 | 1188 | start = (unsigned short *)vc->vc_pos; |
| 1226 | − if (DO_UPDATE(vc)) | |
| 1227 | − vc->vc_sw->con_clear(vc, vc->vc_y, vc->vc_x, 1, | |
| 1228 | − vc->vc_cols - vc->vc_x); | |
| 1229 | 1189 | break; |
| 1230 | 1190 | case 1: /* erase from start of line to cursor */ |
| 1231 | 1191 | start = (unsigned short *)(vc->vc_pos - (vc->vc_x << 1)); |
| 1232 | 1192 | count = vc->vc_x + 1; |
| 1233 | − if (DO_UPDATE(vc)) | |
| 1234 | − vc->vc_sw->con_clear(vc, vc->vc_y, 0, 1, | |
| 1235 | − vc->vc_x + 1); | |
| 1236 | 1193 | break; |
| 1237 | 1194 | case 2: /* erase whole line */ |
| 1238 | 1195 | start = (unsigned short *)(vc->vc_pos - (vc->vc_x << 1)); |
| 1239 | 1196 | count = vc->vc_cols; |
| 1240 | − if (DO_UPDATE(vc)) | |
| 1241 | − vc->vc_sw->con_clear(vc, vc->vc_y, 0, 1, | |
| 1242 | − vc->vc_cols); | |
| 1243 | 1197 | break; |
| 1244 | 1198 | default: |
| 1245 | 1199 | return; |
| 1246 | 1200 | } |
| 1247 | 1201 | scr_memsetw(start, vc->vc_video_erase_char, 2 * count); |
| 1248 | 1202 | vc->vc_need_wrap = 0; |
| 1203 | + if (DO_UPDATE(vc)) | |
| 1204 | + do_update_region(vc, (unsigned long) start, count); | |
| 1249 | 1205 | } |
| 1250 | 1206 | |
| 1251 | 1207 | static void csi_X(struct vc_data *vc, int vpar) /* erase the following vpar positions */ |
| @@ -1380,7 +1336,7 @@ static void respond_string(const char *p, struct tty_struct *tty) · 128 unmodified lines | ||
| 1380 | 1336 | tty_insert_flip_char(tty, *p, 0); |
| 1381 | 1337 | p++; |
| 1382 | 1338 | } |
| 1383 | − con_schedule_flip(tty); | |
| 1339 | + tty_schedule_flip(tty); | |
| 1384 | 1340 | } |
| 1385 | 1341 | |
| 1386 | 1342 | static void cursor_report(struct vc_data *vc, struct tty_struct *tty) |
| @@ -2792,41 +2748,52 @@ static void con_flush_chars(struct tty_struct *tty) · 1405 unmodified lines | ||
| 2792 | 2748 | /* |
| 2793 | 2749 | * Allocate the console screen memory. |
| 2794 | 2750 | */ |
| 2795 | −static int con_open(struct tty_struct *tty, struct file *filp) | |
| 2751 | +static int con_install(struct tty_driver *driver, struct tty_struct *tty) | |
| 2796 | 2752 | { |
| 2797 | 2753 | unsigned int currcons = tty->index; |
| 2798 | − int ret = 0; | |
| 2754 | + struct vc_data *vc; | |
| 2755 | + int ret; | |
| 2799 | 2756 | |
| 2800 | 2757 | console_lock(); |
| 2801 | − if (tty->driver_data == NULL) { | |
| 2802 | − ret = vc_allocate(currcons); | |
| 2803 | − if (ret == 0) { | |
| 2804 | − struct vc_data *vc = vc_cons[currcons].d; | |
| 2758 | + ret = vc_allocate(currcons); | |
| 2759 | + if (ret) | |
| 2760 | + goto unlock; | |
| 2805 | 2761 | |
| 2806 | − /* Still being freed */ | |
| 2807 | − if (vc->port.tty) { | |
| 2808 | − console_unlock(); | |
| 2809 | − return -ERESTARTSYS; | |
| 2810 | − } | |
| 2811 | − tty->driver_data = vc; | |
| 2812 | − vc->port.tty = tty; | |
| 2762 | + vc = vc_cons[currcons].d; | |
| 2813 | 2763 | |
| 2814 | − if (!tty->winsize.ws_row && !tty->winsize.ws_col) { | |
| 2815 | − tty->winsize.ws_row = vc_cons[currcons].d->vc_rows; | |
| 2816 | − tty->winsize.ws_col = vc_cons[currcons].d->vc_cols; | |
| 2817 | − } | |
| 2818 | − if (vc->vc_utf) | |
| 2819 | − tty->termios->c_iflag |= IUTF8; | |
| 2820 | − else | |
| 2821 | − tty->termios->c_iflag &= ~IUTF8; | |
| 2822 | − console_unlock(); | |
| 2823 | − return ret; | |
| 2824 | − } | |
| 2764 | + /* Still being freed */ | |
| 2765 | + if (vc->port.tty) { | |
| 2766 | + ret = -ERESTARTSYS; | |
| 2767 | + goto unlock; | |
| 2825 | 2768 | } |
| 2769 | + | |
| 2770 | + ret = tty_port_install(&vc->port, driver, tty); | |
| 2771 | + if (ret) | |
| 2772 | + goto unlock; | |
| 2773 | + | |
| 2774 | + tty->driver_data = vc; | |
| 2775 | + vc->port.tty = tty; | |
| 2776 | + | |
| 2777 | + if (!tty->winsize.ws_row && !tty->winsize.ws_col) { | |
| 2778 | + tty->winsize.ws_row = vc_cons[currcons].d->vc_rows; | |
| 2779 | + tty->winsize.ws_col = vc_cons[currcons].d->vc_cols; | |
| 2780 | + } | |
| 2781 | + if (vc->vc_utf) | |
| 2782 | + tty->termios.c_iflag |= IUTF8; | |
| 2783 | + else | |
| 2784 | + tty->termios.c_iflag &= ~IUTF8; | |
| 2785 | +unlock: | |
| 2826 | 2786 | console_unlock(); |
| 2827 | 2787 | return ret; |
| 2828 | 2788 | } |
| 2829 | 2789 | |
| 2790 | +static int con_open(struct tty_struct *tty, struct file *filp) | |
| 2791 | +{ | |
| 2792 | + /* everything done in install */ | |
| 2793 | + return 0; | |
| 2794 | +} | |
| 2795 | + | |
| 2796 | + | |
| 2830 | 2797 | static void con_close(struct tty_struct *tty, struct file *filp) |
| 2831 | 2798 | { |
| 2832 | 2799 | /* Nothing to do - we defer to shutdown */ |
| @@ -2839,7 +2806,6 @@ static void con_shutdown(struct tty_struct *tty) · 6 unmodified lines | ||
| 2839 | 2806 | console_lock(); |
| 2840 | 2807 | vc->port.tty = NULL; |
| 2841 | 2808 | console_unlock(); |
| 2842 | − tty_shutdown(tty); | |
| 2843 | 2809 | } |
| 2844 | 2810 | |
| 2845 | 2811 | static int default_italic_color = 2; // green (ASCII) |
| @@ -2947,6 +2913,7 @@ static int __init con_init(void) · 101 unmodified lines | ||
| 2947 | 2913 | console_initcall(con_init); |
| 2948 | 2914 | |
| 2949 | 2915 | static const struct tty_operations con_ops = { |
| 2916 | + .install = con_install, | |
| 2950 | 2917 | .open = con_open, |
| 2951 | 2918 | .close = con_close, |
| 2952 | 2919 | .write = con_write, |
| @@ -826,7 +826,7 @@ static void acm_tty_set_termios(struct tty_struct *tty, · 825 unmodified lines | ||
| 826 | 826 | struct ktermios *termios_old) |
| 827 | 827 | { |
| 828 | 828 | struct acm *acm = tty->driver_data; |
| 829 | − struct ktermios *termios = tty->termios; | |
| 829 | + struct ktermios *termios = &tty->termios; | |
| 830 | 830 | struct usb_cdc_line_coding newline; |
| 831 | 831 | int newctrl = acm->ctrlout; |
| 832 | 832 | |
| @@ -1299,7 +1299,8 @@ skip_countries: · 466 unmodified lines | ||
| 1299 | 1299 | usb_set_intfdata(data_interface, acm); |
| 1300 | 1300 | |
| 1301 | 1301 | usb_get_intf(control_interface); |
| 1302 | − tty_register_device(acm_tty_driver, minor, &control_interface->dev); | |
| 1302 | + tty_port_register_device(&acm->port, acm_tty_driver, minor, | |
| 1303 | + &control_interface->dev); | |
| 1303 | 1304 | |
| 1304 | 1305 | return 0; |
| 1305 | 1306 | alloc_fail7: |
| @@ -1129,7 +1129,8 @@ int gserial_setup(struct usb_gadget *g, unsigned count) · 1128 unmodified lines | ||
| 1129 | 1129 | for (i = 0; i < count; i++) { |
| 1130 | 1130 | struct device *tty_dev; |
| 1131 | 1131 | |
| 1132 | − tty_dev = tty_register_device(gs_tty_driver, i, &g->dev); | |
| 1132 | + tty_dev = tty_port_register_device(&ports[i].port->port, | |
| 1133 | + gs_tty_driver, i, &g->dev); | |
| 1133 | 1134 | if (IS_ERR(tty_dev)) |
| 1134 | 1135 | pr_warning("%s: no classdev for port %d, err %ld\n", |
| 1135 | 1136 | __func__, i, PTR_ERR(tty_dev)); |
| @@ -215,7 +215,7 @@ static void ark3116_release(struct usb_serial *serial) · 214 unmodified lines | ||
| 215 | 215 | |
| 216 | 216 | static void ark3116_init_termios(struct tty_struct *tty) |
| 217 | 217 | { |
| 218 | − struct ktermios *termios = tty->termios; | |
| 218 | + struct ktermios *termios = &tty->termios; | |
| 219 | 219 | *termios = tty_std_termios; |
| 220 | 220 | termios->c_cflag = B9600 | CS8 |
| 221 | 221 | | CREAD | HUPCL | CLOCAL; |
| @@ -229,7 +229,7 @@ static void ark3116_set_termios(struct tty_struct *tty, · 7 unmodified lines | ||
| 229 | 229 | { |
| 230 | 230 | struct usb_serial *serial = port->serial; |
| 231 | 231 | struct ark3116_private *priv = usb_get_serial_port_data(port); |
| 232 | − struct ktermios *termios = tty->termios; | |
| 232 | + struct ktermios *termios = &tty->termios; | |
| 233 | 233 | unsigned int cflag = termios->c_cflag; |
| 234 | 234 | int bps = tty_get_baud_rate(tty); |
| 235 | 235 | int quot; |
| @@ -307,7 +307,7 @@ static void belkin_sa_set_termios(struct tty_struct *tty, · 306 unmodified lines | ||
| 307 | 307 | unsigned long control_state; |
| 308 | 308 | int bad_flow_control; |
| 309 | 309 | speed_t baud; |
| 310 | − struct ktermios *termios = tty->termios; | |
| 310 | + struct ktermios *termios = &tty->termios; | |
| 311 | 311 | |
| 312 | 312 | iflag = termios->c_iflag; |
| 313 | 313 | cflag = termios->c_cflag; |
| @@ -165,8 +165,8 @@ static int usb_console_setup(struct console *co, char *options) · 164 unmodified lines | ||
| 165 | 165 | } |
| 166 | 166 | |
| 167 | 167 | if (serial->type->set_termios) { |
| 168 | − tty->termios->c_cflag = cflag; | |
| 169 | − tty_termios_encode_baud_rate(tty->termios, baud, baud); | |
| 168 | + tty->termios.c_cflag = cflag; | |
| 169 | + tty_termios_encode_baud_rate(&tty->termios, baud, baud); | |
| 170 | 170 | memset(&dummy, 0, sizeof(struct ktermios)); |
| 171 | 171 | serial->type->set_termios(tty, port, &dummy); |
| 172 | 172 | |
| @@ -469,7 +469,7 @@ static void cp210x_get_termios(struct tty_struct *tty, · 468 unmodified lines | ||
| 469 | 469 | |
| 470 | 470 | if (tty) { |
| 471 | 471 | cp210x_get_termios_port(tty->driver_data, |
| 472 | − &tty->termios->c_cflag, &baud); | |
| 472 | + &tty->termios.c_cflag, &baud); | |
| 473 | 473 | tty_encode_baud_rate(tty, baud, baud); |
| 474 | 474 | } |
| 475 | 475 | |
| @@ -631,7 +631,7 @@ static void cp210x_change_speed(struct tty_struct *tty, · 155 unmodified lines | ||
| 631 | 631 | { |
| 632 | 632 | u32 baud; |
| 633 | 633 | |
| 634 | − baud = tty->termios->c_ospeed; | |
| 634 | + baud = tty->termios.c_ospeed; | |
| 635 | 635 | |
| 636 | 636 | /* This maps the requested rate to a rate valid on cp2102 or cp2103, |
| 637 | 637 | * or to an arbitrary rate in [1M,2M]. |
| @@ -665,10 +665,10 @@ static void cp210x_set_termios(struct tty_struct *tty, · 27 unmodified lines | ||
| 665 | 665 | if (!tty) |
| 666 | 666 | return; |
| 667 | 667 | |
| 668 | − cflag = tty->termios->c_cflag; | |
| 668 | + cflag = tty->termios.c_cflag; | |
| 669 | 669 | old_cflag = old_termios->c_cflag; |
| 670 | 670 | |
| 671 | − if (tty->termios->c_ospeed != old_termios->c_ospeed) | |
| 671 | + if (tty->termios.c_ospeed != old_termios->c_ospeed) | |
| 672 | 672 | cp210x_change_speed(tty, port, old_termios); |
| 673 | 673 | |
| 674 | 674 | /* If the number of data bits is to be updated */ |
| @@ -922,38 +922,38 @@ static void cypress_set_termios(struct tty_struct *tty, · 921 unmodified lines | ||
| 922 | 922 | early enough */ |
| 923 | 923 | if (!priv->termios_initialized) { |
| 924 | 924 | if (priv->chiptype == CT_EARTHMATE) { |
| 925 | − *(tty->termios) = tty_std_termios; | |
| 926 | − tty->termios->c_cflag = B4800 | CS8 | CREAD | HUPCL | | |
| 925 | + tty->termios = tty_std_termios; | |
| 926 | + tty->termios.c_cflag = B4800 | CS8 | CREAD | HUPCL | | |
| 927 | 927 | CLOCAL; |
| 928 | − tty->termios->c_ispeed = 4800; | |
| 929 | − tty->termios->c_ospeed = 4800; | |
| 928 | + tty->termios.c_ispeed = 4800; | |
| 929 | + tty->termios.c_ospeed = 4800; | |
| 930 | 930 | } else if (priv->chiptype == CT_CYPHIDCOM) { |
| 931 | − *(tty->termios) = tty_std_termios; | |
| 932 | − tty->termios->c_cflag = B9600 | CS8 | CREAD | HUPCL | | |
| 931 | + tty->termios = tty_std_termios; | |
| 932 | + tty->termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | | |
| 933 | 933 | CLOCAL; |
| 934 | − tty->termios->c_ispeed = 9600; | |
| 935 | − tty->termios->c_ospeed = 9600; | |
| 934 | + tty->termios.c_ispeed = 9600; | |
| 935 | + tty->termios.c_ospeed = 9600; | |
| 936 | 936 | } else if (priv->chiptype == CT_CA42V2) { |
| 937 | − *(tty->termios) = tty_std_termios; | |
| 938 | − tty->termios->c_cflag = B9600 | CS8 | CREAD | HUPCL | | |
| 937 | + tty->termios = tty_std_termios; | |
| 938 | + tty->termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | | |
| 939 | 939 | CLOCAL; |
| 940 | − tty->termios->c_ispeed = 9600; | |
| 941 | − tty->termios->c_ospeed = 9600; | |
| 940 | + tty->termios.c_ispeed = 9600; | |
| 941 | + tty->termios.c_ospeed = 9600; | |
| 942 | 942 | } |
| 943 | 943 | priv->termios_initialized = 1; |
| 944 | 944 | } |
| 945 | 945 | spin_unlock_irqrestore(&priv->lock, flags); |
| 946 | 946 | |
| 947 | 947 | /* Unsupported features need clearing */ |
| 948 | − tty->termios->c_cflag &= ~(CMSPAR|CRTSCTS); | |
| 948 | + tty->termios.c_cflag &= ~(CMSPAR|CRTSCTS); | |
| 949 | 949 | |
| 950 | − cflag = tty->termios->c_cflag; | |
| 951 | − iflag = tty->termios->c_iflag; | |
| 950 | + cflag = tty->termios.c_cflag; | |
| 951 | + iflag = tty->termios.c_iflag; | |
| 952 | 952 | |
| 953 | 953 | /* check if there are new settings */ |
| 954 | 954 | if (old_termios) { |
| 955 | 955 | spin_lock_irqsave(&priv->lock, flags); |
| 956 | − priv->tmp_termios = *(tty->termios); | |
| 956 | + priv->tmp_termios = tty->termios; | |
| 957 | 957 | spin_unlock_irqrestore(&priv->lock, flags); |
| 958 | 958 | } |
| 959 | 959 | |
| @@ -1021,7 +1021,7 @@ static void cypress_set_termios(struct tty_struct *tty, · 61 unmodified lines | ||
| 1021 | 1021 | "4800bps."); |
| 1022 | 1022 | /* define custom termios settings for NMEA protocol */ |
| 1023 | 1023 | |
| 1024 | − tty->termios->c_iflag /* input modes - */ | |
| 1024 | + tty->termios.c_iflag /* input modes - */ | |
| 1025 | 1025 | &= ~(IGNBRK /* disable ignore break */ |
| 1026 | 1026 | | BRKINT /* disable break causes interrupt */ |
| 1027 | 1027 | | PARMRK /* disable mark parity errors */ |
| @@ -1031,10 +1031,10 @@ static void cypress_set_termios(struct tty_struct *tty, · 3 unmodified lines | ||
| 1031 | 1031 | | ICRNL /* disable translate CR to NL */ |
| 1032 | 1032 | | IXON); /* disable enable XON/XOFF flow control */ |
| 1033 | 1033 | |
| 1034 | − tty->termios->c_oflag /* output modes */ | |
| 1034 | + tty->termios.c_oflag /* output modes */ | |
| 1035 | 1035 | &= ~OPOST; /* disable postprocess output char */ |
| 1036 | 1036 | |
| 1037 | − tty->termios->c_lflag /* line discipline modes */ | |
| 1037 | + tty->termios.c_lflag /* line discipline modes */ | |
| 1038 | 1038 | &= ~(ECHO /* disable echo input characters */ |
| 1039 | 1039 | | ECHONL /* disable echo new line */ |
| 1040 | 1040 | | ICANON /* disable erase, kill, werase, and rprnt |
| @@ -1200,7 +1200,7 @@ static void cypress_read_int_callback(struct urb *urb) · 159 unmodified lines | ||
| 1200 | 1200 | |
| 1201 | 1201 | /* hangup, as defined in acm.c... this might be a bad place for it |
| 1202 | 1202 | * though */ |
| 1203 | − if (tty && !(tty->termios->c_cflag & CLOCAL) && | |
| 1203 | + if (tty && !(tty->termios.c_cflag & CLOCAL) && | |
| 1204 | 1204 | !(priv->current_status & UART_CD)) { |
| 1205 | 1205 | dbg("%s - calling hangup", __func__); |
| 1206 | 1206 | tty_hangup(tty); |
| @@ -687,8 +687,8 @@ static void digi_set_termios(struct tty_struct *tty, · 686 unmodified lines | ||
| 687 | 687 | struct usb_serial_port *port, struct ktermios *old_termios) |
| 688 | 688 | { |
| 689 | 689 | struct digi_port *priv = usb_get_serial_port_data(port); |
| 690 | − unsigned int iflag = tty->termios->c_iflag; | |
| 691 | − unsigned int cflag = tty->termios->c_cflag; | |
| 690 | + unsigned int iflag = tty->termios.c_iflag; | |
| 691 | + unsigned int cflag = tty->termios.c_cflag; | |
| 692 | 692 | unsigned int old_iflag = old_termios->c_iflag; |
| 693 | 693 | unsigned int old_cflag = old_termios->c_cflag; |
| 694 | 694 | unsigned char buf[32]; |
| @@ -709,7 +709,7 @@ static void digi_set_termios(struct tty_struct *tty, · 14 unmodified lines | ||
| 709 | 709 | /* don't set RTS if using hardware flow control */ |
| 710 | 710 | /* and throttling input */ |
| 711 | 711 | modem_signals = TIOCM_DTR; |
| 712 | − if (!(tty->termios->c_cflag & CRTSCTS) || | |
| 712 | + if (!(tty->termios.c_cflag & CRTSCTS) || | |
| 713 | 713 | !test_bit(TTY_THROTTLED, &tty->flags)) |
| 714 | 714 | modem_signals |= TIOCM_RTS; |
| 715 | 715 | digi_set_modem_signals(port, modem_signals, 1); |
| @@ -748,7 +748,7 @@ static void digi_set_termios(struct tty_struct *tty, · 32 unmodified lines | ||
| 748 | 748 | } |
| 749 | 749 | } |
| 750 | 750 | /* set parity */ |
| 751 | − tty->termios->c_cflag &= ~CMSPAR; | |
| 751 | + tty->termios.c_cflag &= ~CMSPAR; | |
| 752 | 752 | |
| 753 | 753 | if ((cflag&(PARENB|PARODD)) != (old_cflag&(PARENB|PARODD))) { |
| 754 | 754 | if (cflag&PARENB) { |
| @@ -1124,8 +1124,8 @@ static int digi_open(struct tty_struct *tty, struct usb_serial_port *port) · 369 unmodified lines | ||
| 1124 | 1124 | |
| 1125 | 1125 | /* set termios settings */ |
| 1126 | 1126 | if (tty) { |
| 1127 | − not_termios.c_cflag = ~tty->termios->c_cflag; | |
| 1128 | − not_termios.c_iflag = ~tty->termios->c_iflag; | |
| 1127 | + not_termios.c_cflag = ~tty->termios.c_cflag; | |
| 1128 | + not_termios.c_iflag = ~tty->termios.c_iflag; | |
| 1129 | 1129 | digi_set_termios(tty, port, ¬_termios); |
| 1130 | 1130 | } |
| 1131 | 1131 | return 0; |
| @@ -1500,7 +1500,7 @@ static int digi_read_oob_callback(struct urb *urb) · 368 unmodified lines | ||
| 1500 | 1500 | |
| 1501 | 1501 | rts = 0; |
| 1502 | 1502 | if (tty) |
| 1503 | − rts = tty->termios->c_cflag & CRTSCTS; | |
| 1503 | + rts = tty->termios.c_cflag & CRTSCTS; | |
| 1504 | 1504 | |
| 1505 | 1505 | if (tty && opcode == DIGI_CMD_READ_INPUT_SIGNALS) { |
| 1506 | 1506 | spin_lock(&priv->dp_port_lock); |
| @@ -87,7 +87,7 @@ static int empeg_startup(struct usb_serial *serial) · 86 unmodified lines | ||
| 87 | 87 | |
| 88 | 88 | static void empeg_init_termios(struct tty_struct *tty) |
| 89 | 89 | { |
| 90 | − struct ktermios *termios = tty->termios; | |
| 90 | + struct ktermios *termios = &tty->termios; | |
| 91 | 91 | |
| 92 | 92 | /* |
| 93 | 93 | * The empeg-car player wants these particular tty settings. |
| @@ -173,10 +173,11 @@ static void f81232_set_termios(struct tty_struct *tty, · 172 unmodified lines | ||
| 173 | 173 | /* FIXME - Stubbed out for now */ |
| 174 | 174 | |
| 175 | 175 | /* Don't change anything if nothing has changed */ |
| 176 | − if (!tty_termios_hw_change(tty->termios, old_termios)) | |
| 176 | + if (!tty_termios_hw_change(&tty->termios, old_termios)) | |
| 177 | 177 | return; |
| 178 | 178 | |
| 179 | 179 | /* Do the real work here... */ |
| 180 | + tty_termios_copy_hw(&tty->termios, old_termios); | |
| 180 | 181 | } |
| 181 | 182 | |
| 182 | 183 | static int f81232_tiocmget(struct tty_struct *tty) |
| @@ -2082,7 +2082,7 @@ static void ftdi_set_termios(struct tty_struct *tty, · 2081 unmodified lines | ||
| 2082 | 2082 | { |
| 2083 | 2083 | struct usb_device *dev = port->serial->dev; |
| 2084 | 2084 | struct ftdi_private *priv = usb_get_serial_port_data(port); |
| 2085 | − struct ktermios *termios = tty->termios; | |
| 2085 | + struct ktermios *termios = &tty->termios; | |
| 2086 | 2086 | unsigned int cflag = termios->c_cflag; |
| 2087 | 2087 | __u16 urb_value; /* will hold the new flags */ |
| 2088 | 2088 | |
| @@ -1458,7 +1458,7 @@ static void edge_throttle(struct tty_struct *tty) · 1457 unmodified lines | ||
| 1458 | 1458 | } |
| 1459 | 1459 | |
| 1460 | 1460 | /* if we are implementing RTS/CTS, toggle that line */ |
| 1461 | − if (tty->termios->c_cflag & CRTSCTS) { | |
| 1461 | + if (tty->termios.c_cflag & CRTSCTS) { | |
| 1462 | 1462 | edge_port->shadowMCR &= ~MCR_RTS; |
| 1463 | 1463 | status = send_cmd_write_uart_register(edge_port, MCR, |
| 1464 | 1464 | edge_port->shadowMCR); |
| @@ -1497,7 +1497,7 @@ static void edge_unthrottle(struct tty_struct *tty) · 32 unmodified lines | ||
| 1497 | 1497 | return; |
| 1498 | 1498 | } |
| 1499 | 1499 | /* if we are implementing RTS/CTS, toggle that line */ |
| 1500 | − if (tty->termios->c_cflag & CRTSCTS) { | |
| 1500 | + if (tty->termios.c_cflag & CRTSCTS) { | |
| 1501 | 1501 | edge_port->shadowMCR |= MCR_RTS; |
| 1502 | 1502 | send_cmd_write_uart_register(edge_port, MCR, |
| 1503 | 1503 | edge_port->shadowMCR); |
| @@ -1516,9 +1516,9 @@ static void edge_set_termios(struct tty_struct *tty, · 12 unmodified lines | ||
| 1516 | 1516 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); |
| 1517 | 1517 | unsigned int cflag; |
| 1518 | 1518 | |
| 1519 | − cflag = tty->termios->c_cflag; | |
| 1519 | + cflag = tty->termios.c_cflag; | |
| 1520 | 1520 | dbg("%s - clfag %08x iflag %08x", __func__, |
| 1521 | − tty->termios->c_cflag, tty->termios->c_iflag); | |
| 1521 | + tty->termios.c_cflag, tty->termios.c_iflag); | |
| 1522 | 1522 | dbg("%s - old clfag %08x old iflag %08x", __func__, |
| 1523 | 1523 | old_termios->c_cflag, old_termios->c_iflag); |
| 1524 | 1524 | |
| @@ -1987,7 +1987,7 @@ static void process_rcvd_status(struct edgeport_serial *edge_serial, · 462 unmodified lines | ||
| 1987 | 1987 | tty = tty_port_tty_get(&edge_port->port->port); |
| 1988 | 1988 | if (tty) { |
| 1989 | 1989 | change_port_settings(tty, |
| 1990 | − edge_port, tty->termios); | |
| 1990 | + edge_port, &tty->termios); | |
| 1991 | 1991 | tty_kref_put(tty); |
| 1992 | 1992 | } |
| 1993 | 1993 | |
| @@ -2570,7 +2570,7 @@ static void change_port_settings(struct tty_struct *tty, · 576 unmodified lines | ||
| 2570 | 2570 | return; |
| 2571 | 2571 | } |
| 2572 | 2572 | |
| 2573 | − cflag = tty->termios->c_cflag; | |
| 2573 | + cflag = tty->termios.c_cflag; | |
| 2574 | 2574 | |
| 2575 | 2575 | switch (cflag & CSIZE) { |
| 2576 | 2576 | case CS5: |
| @@ -1870,7 +1870,7 @@ static int edge_open(struct tty_struct *tty, struct usb_serial_port *port) · 1869 unmodified lines | ||
| 1870 | 1870 | |
| 1871 | 1871 | /* set up the port settings */ |
| 1872 | 1872 | if (tty) |
| 1873 | − edge_set_termios(tty, port, tty->termios); | |
| 1873 | + edge_set_termios(tty, port, &tty->termios); | |
| 1874 | 1874 | |
| 1875 | 1875 | /* open up the port */ |
| 1876 | 1876 | |
| @@ -2272,13 +2272,13 @@ static void change_port_settings(struct tty_struct *tty, · 395 unmodified lines | ||
| 2272 | 2272 | |
| 2273 | 2273 | config = kmalloc (sizeof (*config), GFP_KERNEL); |
| 2274 | 2274 | if (!config) { |
| 2275 | − *tty->termios = *old_termios; | |
| 2275 | + tty->termios = *old_termios; | |
| 2276 | 2276 | dev_err(&edge_port->port->dev, "%s - out of memory\n", |
| 2277 | 2277 | __func__); |
| 2278 | 2278 | return; |
| 2279 | 2279 | } |
| 2280 | 2280 | |
| 2281 | − cflag = tty->termios->c_cflag; | |
| 2281 | + cflag = tty->termios.c_cflag; | |
| 2282 | 2282 | |
| 2283 | 2283 | config->wFlags = 0; |
| 2284 | 2284 | |
| @@ -2362,7 +2362,7 @@ static void change_port_settings(struct tty_struct *tty, · 77 unmodified lines | ||
| 2362 | 2362 | } else |
| 2363 | 2363 | dbg("%s - OUTBOUND XON/XOFF is disabled", __func__); |
| 2364 | 2364 | |
| 2365 | − tty->termios->c_cflag &= ~CMSPAR; | |
| 2365 | + tty->termios.c_cflag &= ~CMSPAR; | |
| 2366 | 2366 | |
| 2367 | 2367 | /* Round the baud rate */ |
| 2368 | 2368 | baud = tty_get_baud_rate(tty); |
| @@ -2408,10 +2408,10 @@ static void edge_set_termios(struct tty_struct *tty, · 39 unmodified lines | ||
| 2408 | 2408 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); |
| 2409 | 2409 | unsigned int cflag; |
| 2410 | 2410 | |
| 2411 | − cflag = tty->termios->c_cflag; | |
| 2411 | + cflag = tty->termios.c_cflag; | |
| 2412 | 2412 | |
| 2413 | 2413 | dbg("%s - clfag %08x iflag %08x", __func__, |
| 2414 | − tty->termios->c_cflag, tty->termios->c_iflag); | |
| 2414 | + tty->termios.c_cflag, tty->termios.c_iflag); | |
| 2415 | 2415 | dbg("%s - old clfag %08x old iflag %08x", __func__, |
| 2416 | 2416 | old_termios->c_cflag, old_termios->c_iflag); |
| 2417 | 2417 | dbg("%s - port %d", __func__, port->number); |
| @@ -381,7 +381,7 @@ static void ir_set_termios(struct tty_struct *tty, · 380 unmodified lines | ||
| 381 | 381 | ir_xbof = ir_xbof_change(xbof) ; |
| 382 | 382 | |
| 383 | 383 | /* Only speed changes are supported */ |
| 384 | − tty_termios_copy_hw(tty->termios, old_termios); | |
| 384 | + tty_termios_copy_hw(&tty->termios, old_termios); | |
| 385 | 385 | tty_encode_baud_rate(tty, baud, baud); |
| 386 | 386 | |
| 387 | 387 | /* |
| @@ -921,7 +921,7 @@ static void iuu_set_termios(struct tty_struct *tty, · 920 unmodified lines | ||
| 921 | 921 | { |
| 922 | 922 | const u32 supported_mask = CMSPAR|PARENB|PARODD; |
| 923 | 923 | struct iuu_private *priv = usb_get_serial_port_data(port); |
| 924 | − unsigned int cflag = tty->termios->c_cflag; | |
| 924 | + unsigned int cflag = tty->termios.c_cflag; | |
| 925 | 925 | int status; |
| 926 | 926 | u32 actual; |
| 927 | 927 | u32 parity; |
| @@ -930,7 +930,7 @@ static void iuu_set_termios(struct tty_struct *tty, · 2 unmodified lines | ||
| 930 | 930 | u32 newval = cflag & supported_mask; |
| 931 | 931 | |
| 932 | 932 | /* Just use the ospeed. ispeed should be the same. */ |
| 933 | − baud = tty->termios->c_ospeed; | |
| 933 | + baud = tty->termios.c_ospeed; | |
| 934 | 934 | |
| 935 | 935 | dbg("%s - enter c_ospeed or baud=%d", __func__, baud); |
| 936 | 936 | |
| @@ -961,13 +961,13 @@ static void iuu_set_termios(struct tty_struct *tty, · 24 unmodified lines | ||
| 961 | 961 | * settings back over and then adjust them |
| 962 | 962 | */ |
| 963 | 963 | if (old_termios) |
| 964 | − tty_termios_copy_hw(tty->termios, old_termios); | |
| 964 | + tty_termios_copy_hw(&tty->termios, old_termios); | |
| 965 | 965 | if (status != 0) /* Set failed - return old bits */ |
| 966 | 966 | return; |
| 967 | 967 | /* Re-encode speed, parity and csize */ |
| 968 | 968 | tty_encode_baud_rate(tty, baud, baud); |
| 969 | − tty->termios->c_cflag &= ~(supported_mask|CSIZE); | |
| 970 | − tty->termios->c_cflag |= newval | csize; | |
| 969 | + tty->termios.c_cflag &= ~(supported_mask|CSIZE); | |
| 970 | + tty->termios.c_cflag |= newval | csize; | |
| 971 | 971 | } |
| 972 | 972 | |
| 973 | 973 | static void iuu_close(struct usb_serial_port *port) |
| @@ -993,14 +993,14 @@ static void iuu_close(struct usb_serial_port *port) · 19 unmodified lines | ||
| 993 | 993 | |
| 994 | 994 | static void iuu_init_termios(struct tty_struct *tty) |
| 995 | 995 | { |
| 996 | − *(tty->termios) = tty_std_termios; | |
| 997 | − tty->termios->c_cflag = CLOCAL | CREAD | CS8 | B9600 | |
| 996 | + tty->termios = tty_std_termios; | |
| 997 | + tty->termios.c_cflag = CLOCAL | CREAD | CS8 | B9600 | |
| 998 | 998 | | TIOCM_CTS | CSTOPB | PARENB; |
| 999 | − tty->termios->c_ispeed = 9600; | |
| 1000 | − tty->termios->c_ospeed = 9600; | |
| 1001 | − tty->termios->c_lflag = 0; | |
| 1002 | − tty->termios->c_oflag = 0; | |
| 1003 | − tty->termios->c_iflag = 0; | |
| 999 | + tty->termios.c_ispeed = 9600; | |
| 1000 | + tty->termios.c_ospeed = 9600; | |
| 1001 | + tty->termios.c_lflag = 0; | |
| 1002 | + tty->termios.c_oflag = 0; | |
| 1003 | + tty->termios.c_iflag = 0; | |
| 1004 | 1004 | } |
| 1005 | 1005 | |
| 1006 | 1006 | static int iuu_open(struct tty_struct *tty, struct usb_serial_port *port) |
| @@ -1012,8 +1012,8 @@ static int iuu_open(struct tty_struct *tty, struct usb_serial_port *port) · 5 unmodified lines | ||
| 1012 | 1012 | u32 actual; |
| 1013 | 1013 | struct iuu_private *priv = usb_get_serial_port_data(port); |
| 1014 | 1014 | |
| 1015 | − baud = tty->termios->c_ospeed; | |
| 1016 | − tty->termios->c_ispeed = baud; | |
| 1015 | + baud = tty->termios.c_ospeed; | |
| 1016 | + tty->termios.c_ispeed = baud; | |
| 1017 | 1017 | /* Re-encode speed */ |
| 1018 | 1018 | tty_encode_baud_rate(tty, baud, baud); |
| 1019 | 1019 | |
| @@ -158,7 +158,7 @@ static void keyspan_set_termios(struct tty_struct *tty, · 157 unmodified lines | ||
| 158 | 158 | |
| 159 | 159 | p_priv = usb_get_serial_port_data(port); |
| 160 | 160 | d_details = p_priv->device_details; |
| 161 | − cflag = tty->termios->c_cflag; | |
| 161 | + cflag = tty->termios.c_cflag; | |
| 162 | 162 | device_port = port->number - port->serial->minor; |
| 163 | 163 | |
| 164 | 164 | /* Baud rate calculation takes baud rate as an integer |
| @@ -179,7 +179,7 @@ static void keyspan_set_termios(struct tty_struct *tty, · 14 unmodified lines | ||
| 179 | 179 | p_priv->flow_control = (cflag & CRTSCTS) ? flow_cts : flow_none; |
| 180 | 180 | |
| 181 | 181 | /* Mark/Space not supported */ |
| 182 | − tty->termios->c_cflag &= ~CMSPAR; | |
| 182 | + tty->termios.c_cflag &= ~CMSPAR; | |
| 183 | 183 | |
| 184 | 184 | keyspan_send_setup(port, 0); |
| 185 | 185 | } |
| @@ -1086,7 +1086,7 @@ static int keyspan_open(struct tty_struct *tty, struct usb_serial_port *port) · 900 unmodified lines | ||
| 1086 | 1086 | |
| 1087 | 1087 | device_port = port->number - port->serial->minor; |
| 1088 | 1088 | if (tty) { |
| 1089 | − cflag = tty->termios->c_cflag; | |
| 1089 | + cflag = tty->termios.c_cflag; | |
| 1090 | 1090 | /* Baud rate calculation takes baud rate as an integer |
| 1091 | 1091 | so other rates can be generated if desired. */ |
| 1092 | 1092 | baud_rate = tty_get_baud_rate(tty); |
| @@ -338,7 +338,7 @@ static void keyspan_pda_set_termios(struct tty_struct *tty, · 337 unmodified lines | ||
| 338 | 338 | 7[EOMS]1: 10 bit, b0/b7 is parity |
| 339 | 339 | 7[EOMS]2: 11 bit, b0/b7 is parity, extra bit always (mark?) |
| 340 | 340 | |
| 341 | − HW flow control is dictated by the tty->termios->c_cflags & CRTSCTS | |
| 341 | + HW flow control is dictated by the tty->termios.c_cflags & CRTSCTS | |
| 342 | 342 | bit. |
| 343 | 343 | |
| 344 | 344 | For now, just do baud. */ |
| @@ -353,7 +353,7 @@ static void keyspan_pda_set_termios(struct tty_struct *tty, · 8 unmodified lines | ||
| 353 | 353 | } |
| 354 | 354 | /* Only speed can change so copy the old h/w parameters |
| 355 | 355 | then encode the new speed */ |
| 356 | − tty_termios_copy_hw(tty->termios, old_termios); | |
| 356 | + tty_termios_copy_hw(&tty->termios, old_termios); | |
| 357 | 357 | tty_encode_baud_rate(tty, speed, speed); |
| 358 | 358 | } |
| 359 | 359 | |
| @@ -311,12 +311,12 @@ static int klsi_105_open(struct tty_struct *tty, struct usb_serial_port *port) · 310 unmodified lines | ||
| 311 | 311 | |
| 312 | 312 | /* set up termios structure */ |
| 313 | 313 | spin_lock_irqsave(&priv->lock, flags); |
| 314 | − priv->termios.c_iflag = tty->termios->c_iflag; | |
| 315 | − priv->termios.c_oflag = tty->termios->c_oflag; | |
| 316 | − priv->termios.c_cflag = tty->termios->c_cflag; | |
| 317 | − priv->termios.c_lflag = tty->termios->c_lflag; | |
| 314 | + priv->termios.c_iflag = tty->termios.c_iflag; | |
| 315 | + priv->termios.c_oflag = tty->termios.c_oflag; | |
| 316 | + priv->termios.c_cflag = tty->termios.c_cflag; | |
| 317 | + priv->termios.c_lflag = tty->termios.c_lflag; | |
| 318 | 318 | for (i = 0; i < NCCS; i++) |
| 319 | − priv->termios.c_cc[i] = tty->termios->c_cc[i]; | |
| 319 | + priv->termios.c_cc[i] = tty->termios.c_cc[i]; | |
| 320 | 320 | priv->cfg.pktlen = cfg->pktlen; |
| 321 | 321 | priv->cfg.baudrate = cfg->baudrate; |
| 322 | 322 | priv->cfg.databits = cfg->databits; |
| @@ -445,9 +445,9 @@ static void klsi_105_set_termios(struct tty_struct *tty, · 122 unmodified lines | ||
| 445 | 445 | struct ktermios *old_termios) |
| 446 | 446 | { |
| 447 | 447 | struct klsi_105_private *priv = usb_get_serial_port_data(port); |
| 448 | − unsigned int iflag = tty->termios->c_iflag; | |
| 448 | + unsigned int iflag = tty->termios.c_iflag; | |
| 449 | 449 | unsigned int old_iflag = old_termios->c_iflag; |
| 450 | − unsigned int cflag = tty->termios->c_cflag; | |
| 450 | + unsigned int cflag = tty->termios.c_cflag; | |
| 451 | 451 | unsigned int old_cflag = old_termios->c_cflag; |
| 452 | 452 | struct klsi_105_port_settings *cfg; |
| 453 | 453 | unsigned long flags; |
| @@ -560,7 +560,7 @@ static void klsi_105_set_termios(struct tty_struct *tty, · 106 unmodified lines | ||
| 560 | 560 | if ((cflag & (PARENB|PARODD)) != (old_cflag & (PARENB|PARODD)) |
| 561 | 561 | || (cflag & CSTOPB) != (old_cflag & CSTOPB)) { |
| 562 | 562 | /* Not currently supported */ |
| 563 | − tty->termios->c_cflag &= ~(PARENB|PARODD|CSTOPB); | |
| 563 | + tty->termios.c_cflag &= ~(PARENB|PARODD|CSTOPB); | |
| 564 | 564 | #if 0 |
| 565 | 565 | priv->last_lcr = 0; |
| 566 | 566 | |
| @@ -587,7 +587,7 @@ static void klsi_105_set_termios(struct tty_struct *tty, · 20 unmodified lines | ||
| 587 | 587 | || (iflag & IXON) != (old_iflag & IXON) |
| 588 | 588 | || (cflag & CRTSCTS) != (old_cflag & CRTSCTS)) { |
| 589 | 589 | /* Not currently supported */ |
| 590 | − tty->termios->c_cflag &= ~CRTSCTS; | |
| 590 | + tty->termios.c_cflag &= ~CRTSCTS; | |
| 591 | 591 | /* Drop DTR/RTS if no flow control otherwise assert */ |
| 592 | 592 | #if 0 |
| 593 | 593 | if ((iflag & IXOFF) || (iflag & IXON) || (cflag & CRTSCTS)) |
| @@ -191,11 +191,11 @@ static void kobil_release(struct usb_serial *serial) · 190 unmodified lines | ||
| 191 | 191 | static void kobil_init_termios(struct tty_struct *tty) |
| 192 | 192 | { |
| 193 | 193 | /* Default to echo off and other sane device settings */ |
| 194 | − tty->termios->c_lflag = 0; | |
| 195 | − tty->termios->c_lflag &= ~(ISIG | ICANON | ECHO | IEXTEN | XCASE); | |
| 196 | − tty->termios->c_iflag = IGNBRK | IGNPAR | IXOFF; | |
| 194 | + tty->termios.c_lflag = 0; | |
| 195 | + tty->termios.c_iflag &= ~(ISIG | ICANON | ECHO | IEXTEN | XCASE); | |
| 196 | + tty->termios.c_iflag |= IGNBRK | IGNPAR | IXOFF; | |
| 197 | 197 | /* do NOT translate CR to CR-NL (0x0A -> 0x0A 0x0D) */ |
| 198 | − tty->termios->c_oflag &= ~ONLCR; | |
| 198 | + tty->termios.c_oflag &= ~ONLCR; | |
| 199 | 199 | } |
| 200 | 200 | |
| 201 | 201 | static int kobil_open(struct tty_struct *tty, struct usb_serial_port *port) |
| @@ -581,14 +581,14 @@ static void kobil_set_termios(struct tty_struct *tty, · 379 unmodified lines | ||
| 581 | 581 | struct kobil_private *priv; |
| 582 | 582 | int result; |
| 583 | 583 | unsigned short urb_val = 0; |
| 584 | − int c_cflag = tty->termios->c_cflag; | |
| 584 | + int c_cflag = tty->termios.c_cflag; | |
| 585 | 585 | speed_t speed; |
| 586 | 586 | |
| 587 | 587 | priv = usb_get_serial_port_data(port); |
| 588 | 588 | if (priv->device_type == KOBIL_USBTWIN_PRODUCT_ID || |
| 589 | 589 | priv->device_type == KOBIL_KAAN_SIM_PRODUCT_ID) { |
| 590 | 590 | /* This device doesn't support ioctl calls */ |
| 591 | − *tty->termios = *old; | |
| 591 | + tty_termios_copy_hw(&tty->termios, old); | |
| 592 | 592 | return; |
| 593 | 593 | } |
| 594 | 594 | |
| @@ -612,7 +612,7 @@ static void kobil_set_termios(struct tty_struct *tty, · 17 unmodified lines | ||
| 612 | 612 | urb_val |= SUSBCR_SPASB_EvenParity; |
| 613 | 613 | } else |
| 614 | 614 | urb_val |= SUSBCR_SPASB_NoParity; |
| 615 | − tty->termios->c_cflag &= ~CMSPAR; | |
| 615 | + tty->termios.c_cflag &= ~CMSPAR; | |
| 616 | 616 | tty_encode_baud_rate(tty, speed, speed); |
| 617 | 617 | |
| 618 | 618 | result = usb_control_msg(port->serial->dev, |
| @@ -454,7 +454,7 @@ static int mct_u232_open(struct tty_struct *tty, struct usb_serial_port *port) · 453 unmodified lines | ||
| 454 | 454 | * either. |
| 455 | 455 | */ |
| 456 | 456 | spin_lock_irqsave(&priv->lock, flags); |
| 457 | − if (tty && (tty->termios->c_cflag & CBAUD)) | |
| 457 | + if (tty && (tty->termios.c_cflag & CBAUD)) | |
| 458 | 458 | priv->control_state = TIOCM_DTR | TIOCM_RTS; |
| 459 | 459 | else |
| 460 | 460 | priv->control_state = 0; |
| @@ -634,7 +634,7 @@ static void mct_u232_set_termios(struct tty_struct *tty, · 173 unmodified lines | ||
| 634 | 634 | { |
| 635 | 635 | struct usb_serial *serial = port->serial; |
| 636 | 636 | struct mct_u232_private *priv = usb_get_serial_port_data(port); |
| 637 | − struct ktermios *termios = tty->termios; | |
| 637 | + struct ktermios *termios = &tty->termios; | |
| 638 | 638 | unsigned int cflag = termios->c_cflag; |
| 639 | 639 | unsigned int old_cflag = old_termios->c_cflag; |
| 640 | 640 | unsigned long flags; |
| @@ -130,12 +130,6 @@ static void metrousb_read_int_callback(struct urb *urb) · 129 unmodified lines | ||
| 130 | 130 | |
| 131 | 131 | /* Set the data read from the usb port into the serial port buffer. */ |
| 132 | 132 | tty = tty_port_tty_get(&port->port); |
| 133 | − if (!tty) { | |
| 134 | − dev_err(&port->dev, "%s - bad tty pointer - exiting\n", | |
| 135 | − __func__); | |
| 136 | − return; | |
| 137 | − } | |
| 138 | − | |
| 139 | 133 | if (tty && urb->actual_length) { |
| 140 | 134 | /* Loop through the data copying each byte to the tty layer. */ |
| 141 | 135 | tty_insert_flip_string(tty, data, urb->actual_length); |
| @@ -1349,7 +1349,7 @@ static void mos7720_throttle(struct tty_struct *tty) · 1348 unmodified lines | ||
| 1349 | 1349 | } |
| 1350 | 1350 | |
| 1351 | 1351 | /* if we are implementing RTS/CTS, toggle that line */ |
| 1352 | − if (tty->termios->c_cflag & CRTSCTS) { | |
| 1352 | + if (tty->termios.c_cflag & CRTSCTS) { | |
| 1353 | 1353 | mos7720_port->shadowMCR &= ~UART_MCR_RTS; |
| 1354 | 1354 | write_mos_reg(port->serial, port->number - port->serial->minor, |
| 1355 | 1355 | MCR, mos7720_port->shadowMCR); |
| @@ -1383,7 +1383,7 @@ static void mos7720_unthrottle(struct tty_struct *tty) · 27 unmodified lines | ||
| 1383 | 1383 | } |
| 1384 | 1384 | |
| 1385 | 1385 | /* if we are implementing RTS/CTS, toggle that line */ |
| 1386 | − if (tty->termios->c_cflag & CRTSCTS) { | |
| 1386 | + if (tty->termios.c_cflag & CRTSCTS) { | |
| 1387 | 1387 | mos7720_port->shadowMCR |= UART_MCR_RTS; |
| 1388 | 1388 | write_mos_reg(port->serial, port->number - port->serial->minor, |
| 1389 | 1389 | MCR, mos7720_port->shadowMCR); |
| @@ -1604,8 +1604,8 @@ static void change_port_settings(struct tty_struct *tty, · 214 unmodified lines | ||
| 1604 | 1604 | lStop = 0x00; /* 1 stop bit */ |
| 1605 | 1605 | lParity = 0x00; /* No parity */ |
| 1606 | 1606 | |
| 1607 | − cflag = tty->termios->c_cflag; | |
| 1608 | − iflag = tty->termios->c_iflag; | |
| 1607 | + cflag = tty->termios.c_cflag; | |
| 1608 | + iflag = tty->termios.c_iflag; | |
| 1609 | 1609 | |
| 1610 | 1610 | /* Change the number of bits */ |
| 1611 | 1611 | switch (cflag & CSIZE) { |
| @@ -1753,11 +1753,11 @@ static void mos7720_set_termios(struct tty_struct *tty, · 141 unmodified lines | ||
| 1753 | 1753 | |
| 1754 | 1754 | dbg("%s\n", "setting termios - ASPIRE"); |
| 1755 | 1755 | |
| 1756 | − cflag = tty->termios->c_cflag; | |
| 1756 | + cflag = tty->termios.c_cflag; | |
| 1757 | 1757 | |
| 1758 | 1758 | dbg("%s - cflag %08x iflag %08x", __func__, |
| 1759 | − tty->termios->c_cflag, | |
| 1760 | − RELEVANT_IFLAG(tty->termios->c_iflag)); | |
| 1759 | + tty->termios.c_cflag, | |
| 1760 | + RELEVANT_IFLAG(tty->termios.c_iflag)); | |
| 1761 | 1761 | |
| 1762 | 1762 | dbg("%s - old cflag %08x old iflag %08x", __func__, |
| 1763 | 1763 | old_termios->c_cflag, |
| @@ -1651,7 +1651,7 @@ static void mos7840_throttle(struct tty_struct *tty) · 1650 unmodified lines | ||
| 1651 | 1651 | return; |
| 1652 | 1652 | } |
| 1653 | 1653 | /* if we are implementing RTS/CTS, toggle that line */ |
| 1654 | − if (tty->termios->c_cflag & CRTSCTS) { | |
| 1654 | + if (tty->termios.c_cflag & CRTSCTS) { | |
| 1655 | 1655 | mos7840_port->shadowMCR &= ~MCR_RTS; |
| 1656 | 1656 | status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, |
| 1657 | 1657 | mos7840_port->shadowMCR); |
| @@ -1694,7 +1694,7 @@ static void mos7840_unthrottle(struct tty_struct *tty) · 36 unmodified lines | ||
| 1694 | 1694 | } |
| 1695 | 1695 | |
| 1696 | 1696 | /* if we are implementing RTS/CTS, toggle that line */ |
| 1697 | − if (tty->termios->c_cflag & CRTSCTS) { | |
| 1697 | + if (tty->termios.c_cflag & CRTSCTS) { | |
| 1698 | 1698 | mos7840_port->shadowMCR |= MCR_RTS; |
| 1699 | 1699 | status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, |
| 1700 | 1700 | mos7840_port->shadowMCR); |
| @@ -2000,8 +2000,8 @@ static void mos7840_change_port_settings(struct tty_struct *tty, · 299 unmodified lines | ||
| 2000 | 2000 | lStop = LCR_STOP_1; |
| 2001 | 2001 | lParity = LCR_PAR_NONE; |
| 2002 | 2002 | |
| 2003 | − cflag = tty->termios->c_cflag; | |
| 2004 | − iflag = tty->termios->c_iflag; | |
| 2003 | + cflag = tty->termios.c_cflag; | |
| 2004 | + iflag = tty->termios.c_iflag; | |
| 2005 | 2005 | |
| 2006 | 2006 | /* Change the number of bits */ |
| 2007 | 2007 | if (cflag & CSIZE) { |
| @@ -2161,10 +2161,10 @@ static void mos7840_set_termios(struct tty_struct *tty, · 153 unmodified lines | ||
| 2161 | 2161 | |
| 2162 | 2162 | dbg("%s", "setting termios - "); |
| 2163 | 2163 | |
| 2164 | − cflag = tty->termios->c_cflag; | |
| 2164 | + cflag = tty->termios.c_cflag; | |
| 2165 | 2165 | |
| 2166 | 2166 | dbg("%s - clfag %08x iflag %08x", __func__, |
| 2167 | − tty->termios->c_cflag, RELEVANT_IFLAG(tty->termios->c_iflag)); | |
| 2167 | + tty->termios.c_cflag, RELEVANT_IFLAG(tty->termios.c_iflag)); | |
| 2168 | 2168 | dbg("%s - old clfag %08x old iflag %08x", __func__, |
| 2169 | 2169 | old_termios->c_cflag, RELEVANT_IFLAG(old_termios->c_iflag)); |
| 2170 | 2170 | dbg("%s - port %d", __func__, port->number); |
| @@ -404,10 +404,10 @@ static int oti6858_chars_in_buffer(struct tty_struct *tty) · 403 unmodified lines | ||
| 404 | 404 | |
| 405 | 405 | static void oti6858_init_termios(struct tty_struct *tty) |
| 406 | 406 | { |
| 407 | − *(tty->termios) = tty_std_termios; | |
| 408 | − tty->termios->c_cflag = B38400 | CS8 | CREAD | HUPCL | CLOCAL; | |
| 409 | − tty->termios->c_ispeed = 38400; | |
| 410 | − tty->termios->c_ospeed = 38400; | |
| 407 | + tty->termios = tty_std_termios; | |
| 408 | + tty->termios.c_cflag = B38400 | CS8 | CREAD | HUPCL | CLOCAL; | |
| 409 | + tty->termios.c_ispeed = 38400; | |
| 410 | + tty->termios.c_ospeed = 38400; | |
| 411 | 411 | } |
| 412 | 412 | |
| 413 | 413 | static void oti6858_set_termios(struct tty_struct *tty, |
| @@ -425,7 +425,7 @@ static void oti6858_set_termios(struct tty_struct *tty, · 11 unmodified lines | ||
| 425 | 425 | return; |
| 426 | 426 | } |
| 427 | 427 | |
| 428 | − cflag = tty->termios->c_cflag; | |
| 428 | + cflag = tty->termios.c_cflag; | |
| 429 | 429 | |
| 430 | 430 | spin_lock_irqsave(&priv->lock, flags); |
| 431 | 431 | divisor = priv->pending_setup.divisor; |
| @@ -260,16 +260,16 @@ static void pl2303_set_termios(struct tty_struct *tty, · 259 unmodified lines | ||
| 260 | 260 | serial settings even to the same values as before. Thus |
| 261 | 261 | we actually need to filter in this specific case */ |
| 262 | 262 | |
| 263 | − if (!tty_termios_hw_change(tty->termios, old_termios)) | |
| 263 | + if (!tty_termios_hw_change(&tty->termios, old_termios)) | |
| 264 | 264 | return; |
| 265 | 265 | |
| 266 | − cflag = tty->termios->c_cflag; | |
| 266 | + cflag = tty->termios.c_cflag; | |
| 267 | 267 | |
| 268 | 268 | buf = kzalloc(7, GFP_KERNEL); |
| 269 | 269 | if (!buf) { |
| 270 | 270 | dev_err(&port->dev, "%s - out of memory.\n", __func__); |
| 271 | 271 | /* Report back no change occurred */ |
| 272 | − *tty->termios = *old_termios; | |
| 272 | + tty->termios = *old_termios; | |
| 273 | 273 | return; |
| 274 | 274 | } |
| 275 | 275 | |
| @@ -275,7 +275,7 @@ static void qt2_set_termios(struct tty_struct *tty, · 274 unmodified lines | ||
| 275 | 275 | { |
| 276 | 276 | struct usb_device *dev = port->serial->dev; |
| 277 | 277 | struct qt2_port_private *port_priv; |
| 278 | − struct ktermios *termios = tty->termios; | |
| 278 | + struct ktermios *termios = &tty->termios; | |
| 279 | 279 | u16 baud; |
| 280 | 280 | unsigned int cflag = termios->c_cflag; |
| 281 | 281 | u16 new_lcr = 0; |
| @@ -406,7 +406,7 @@ static int qt2_open(struct tty_struct *tty, struct usb_serial_port *port) · 124 unmodified lines | ||
| 406 | 406 | port_priv->device_port = (u8) device_port; |
| 407 | 407 | |
| 408 | 408 | if (tty) |
| 409 | − qt2_set_termios(tty, port, tty->termios); | |
| 409 | + qt2_set_termios(tty, port, &tty->termios); | |
| 410 | 410 | |
| 411 | 411 | return 0; |
| 412 | 412 | |
| @@ -382,7 +382,7 @@ static int sierra_send_setup(struct usb_serial_port *port) · 381 unmodified lines | ||
| 382 | 382 | static void sierra_set_termios(struct tty_struct *tty, |
| 383 | 383 | struct usb_serial_port *port, struct ktermios *old_termios) |
| 384 | 384 | { |
| 385 | − tty_termios_copy_hw(tty->termios, old_termios); | |
| 385 | + tty_termios_copy_hw(&tty->termios, old_termios); | |
| 386 | 386 | sierra_send_setup(port); |
| 387 | 387 | } |
| 388 | 388 | |
| @@ -316,10 +316,10 @@ static void spcp8x5_dtr_rts(struct usb_serial_port *port, int on) · 315 unmodified lines | ||
| 316 | 316 | static void spcp8x5_init_termios(struct tty_struct *tty) |
| 317 | 317 | { |
| 318 | 318 | /* for the 1st time call this function */ |
| 319 | − *(tty->termios) = tty_std_termios; | |
| 320 | − tty->termios->c_cflag = B115200 | CS8 | CREAD | HUPCL | CLOCAL; | |
| 321 | − tty->termios->c_ispeed = 115200; | |
| 322 | − tty->termios->c_ospeed = 115200; | |
| 319 | + tty->termios = tty_std_termios; | |
| 320 | + tty->termios.c_cflag = B115200 | CS8 | CREAD | HUPCL | CLOCAL; | |
| 321 | + tty->termios.c_ispeed = 115200; | |
| 322 | + tty->termios.c_ospeed = 115200; | |
| 323 | 323 | } |
| 324 | 324 | |
| 325 | 325 | /* set the serial param for transfer. we should check if we really need to |
| @@ -330,7 +330,7 @@ static void spcp8x5_set_termios(struct tty_struct *tty, · 4 unmodified lines | ||
| 330 | 330 | struct usb_serial *serial = port->serial; |
| 331 | 331 | struct spcp8x5_private *priv = usb_get_serial_port_data(port); |
| 332 | 332 | unsigned long flags; |
| 333 | − unsigned int cflag = tty->termios->c_cflag; | |
| 333 | + unsigned int cflag = tty->termios.c_cflag; | |
| 334 | 334 | unsigned int old_cflag = old_termios->c_cflag; |
| 335 | 335 | unsigned short uartdata; |
| 336 | 336 | unsigned char buf[2] = {0, 0}; |
| @@ -340,7 +340,7 @@ static void spcp8x5_set_termios(struct tty_struct *tty, · 3 unmodified lines | ||
| 340 | 340 | |
| 341 | 341 | |
| 342 | 342 | /* check that they really want us to change something */ |
| 343 | − if (!tty_termios_hw_change(tty->termios, old_termios)) | |
| 343 | + if (!tty_termios_hw_change(&tty->termios, old_termios)) | |
| 344 | 344 | return; |
| 345 | 345 | |
| 346 | 346 | /* set DTR/RTS active */ |
| @@ -216,7 +216,7 @@ static void ssu100_set_termios(struct tty_struct *tty, · 215 unmodified lines | ||
| 216 | 216 | struct ktermios *old_termios) |
| 217 | 217 | { |
| 218 | 218 | struct usb_device *dev = port->serial->dev; |
| 219 | − struct ktermios *termios = tty->termios; | |
| 219 | + struct ktermios *termios = &tty->termios; | |
| 220 | 220 | u16 baud, divisor, remainder; |
| 221 | 221 | unsigned int cflag = termios->c_cflag; |
| 222 | 222 | u16 urb_value = 0; /* will hold the new flags */ |
| @@ -322,7 +322,7 @@ static int ssu100_open(struct tty_struct *tty, struct usb_serial_port *port) · 99 unmodified lines | ||
| 322 | 322 | dbg("%s - set uart failed", __func__); |
| 323 | 323 | |
| 324 | 324 | if (tty) |
| 325 | − ssu100_set_termios(tty, port, tty->termios); | |
| 325 | + ssu100_set_termios(tty, port, &tty->termios); | |
| 326 | 326 | |
| 327 | 327 | return usb_serial_generic_open(tty, port); |
| 328 | 328 | } |
| @@ -520,7 +520,7 @@ static int ti_open(struct tty_struct *tty, struct usb_serial_port *port) · 519 unmodified lines | ||
| 520 | 520 | } |
| 521 | 521 | |
| 522 | 522 | if (tty) |
| 523 | − ti_set_termios(tty, port, tty->termios); | |
| 523 | + ti_set_termios(tty, port, &tty->termios); | |
| 524 | 524 | |
| 525 | 525 | dbg("%s - sending TI_OPEN_PORT", __func__); |
| 526 | 526 | status = ti_command_out_sync(tdev, TI_OPEN_PORT, |
| @@ -562,7 +562,7 @@ static int ti_open(struct tty_struct *tty, struct usb_serial_port *port) · 35 unmodified lines | ||
| 562 | 562 | usb_clear_halt(dev, port->read_urb->pipe); |
| 563 | 563 | |
| 564 | 564 | if (tty) |
| 565 | − ti_set_termios(tty, port, tty->termios); | |
| 565 | + ti_set_termios(tty, port, &tty->termios); | |
| 566 | 566 | |
| 567 | 567 | dbg("%s - sending TI_OPEN_PORT (2)", __func__); |
| 568 | 568 | status = ti_command_out_sync(tdev, TI_OPEN_PORT, |
| @@ -831,8 +831,8 @@ static void ti_set_termios(struct tty_struct *tty, · 262 unmodified lines | ||
| 831 | 831 | int port_number = port->number - port->serial->minor; |
| 832 | 832 | unsigned int mcr; |
| 833 | 833 | |
| 834 | − cflag = tty->termios->c_cflag; | |
| 835 | − iflag = tty->termios->c_iflag; | |
| 834 | + cflag = tty->termios.c_cflag; | |
| 835 | + iflag = tty->termios.c_iflag; | |
| 836 | 836 | |
| 837 | 837 | dbg("%s - cflag %08x, iflag %08x", __func__, cflag, iflag); |
| 838 | 838 | dbg("%s - old clfag %08x, old iflag %08x", __func__, |
| @@ -871,7 +871,7 @@ static void ti_set_termios(struct tty_struct *tty, · 32 unmodified lines | ||
| 871 | 871 | } |
| 872 | 872 | |
| 873 | 873 | /* CMSPAR isn't supported by this driver */ |
| 874 | − tty->termios->c_cflag &= ~CMSPAR; | |
| 874 | + tty->termios.c_cflag &= ~CMSPAR; | |
| 875 | 875 | |
| 876 | 876 | if (cflag & PARENB) { |
| 877 | 877 | if (cflag & PARODD) { |
| @@ -207,7 +207,7 @@ static int serial_install(struct tty_driver *driver, struct tty_struct *tty) · 206 unmodified lines | ||
| 207 | 207 | if (retval) |
| 208 | 208 | goto error_get_interface; |
| 209 | 209 | |
| 210 | − retval = tty_standard_install(driver, tty); | |
| 210 | + retval = tty_port_install(&port->port, driver, tty); | |
| 211 | 211 | if (retval) |
| 212 | 212 | goto error_init_termios; |
| 213 | 213 | |
| @@ -305,8 +305,7 @@ static void serial_close(struct tty_struct *tty, struct file *filp) · 91 unmodified lines | ||
| 305 | 305 | * Do the resource freeing and refcount dropping for the port. |
| 306 | 306 | * Avoid freeing the console. |
| 307 | 307 | * |
| 308 | − * Called asynchronously after the last tty kref is dropped, | |
| 309 | − * and the tty layer has already done the tty_shutdown(tty); | |
| 308 | + * Called asynchronously after the last tty kref is dropped. | |
| 310 | 309 | */ |
| 311 | 310 | static void serial_cleanup(struct tty_struct *tty) |
| 312 | 311 | { |
| @@ -423,7 +422,7 @@ static void serial_set_termios(struct tty_struct *tty, struct ktermios *old) · 110 unmodified lines | ||
| 423 | 422 | if (port->serial->type->set_termios) |
| 424 | 423 | port->serial->type->set_termios(tty, port, old); |
| 425 | 424 | else |
| 426 | − tty_termios_copy_hw(tty->termios, old); | |
| 425 | + tty_termios_copy_hw(&tty->termios, old); | |
| 427 | 426 | } |
| 428 | 427 | |
| 429 | 428 | static int serial_break(struct tty_struct *tty, int break_state) |
| @@ -67,7 +67,7 @@ void usb_wwan_set_termios(struct tty_struct *tty, · 66 unmodified lines | ||
| 67 | 67 | struct usb_wwan_intf_private *intfdata = port->serial->private; |
| 68 | 68 | |
| 69 | 69 | /* Doesn't support option setting */ |
| 70 | − tty_termios_copy_hw(tty->termios, old_termios); | |
| 70 | + tty_termios_copy_hw(&tty->termios, old_termios); | |
| 71 | 71 | |
| 72 | 72 | if (intfdata->send_setup) |
| 73 | 73 | intfdata->send_setup(port); |
| @@ -724,7 +724,7 @@ static void firm_setup_port(struct tty_struct *tty) · 723 unmodified lines | ||
| 724 | 724 | { |
| 725 | 725 | struct usb_serial_port *port = tty->driver_data; |
| 726 | 726 | struct whiteheat_port_settings port_settings; |
| 727 | − unsigned int cflag = tty->termios->c_cflag; | |
| 727 | + unsigned int cflag = tty->termios.c_cflag; | |
| 728 | 728 | |
| 729 | 729 | port_settings.port = port->number + 1; |
| 730 | 730 | |
| @@ -40,7 +40,6 @@ fw-shipped-$(CONFIG_BNX2) += bnx2/bnx2-mips-09-6.2.1a.fw \ · 39 unmodified lines | ||
| 40 | 40 | bnx2/bnx2-mips-06-6.2.1.fw \ |
| 41 | 41 | bnx2/bnx2-rv2p-06-6.0.15.fw |
| 42 | 42 | fw-shipped-$(CONFIG_CASSINI) += sun/cassini.bin |
| 43 | −fw-shipped-$(CONFIG_COMPUTONE) += intelliport2.bin | |
| 44 | 43 | fw-shipped-$(CONFIG_CHELSIO_T3) += cxgb3/t3b_psram-1.1.0.bin \ |
| 45 | 44 | cxgb3/t3c_psram-1.1.0.bin \ |
| 46 | 45 | cxgb3/t3fw-7.10.0.bin \ |
| @@ -1,2147 +0,0 @@ | ||
| 1 | −:100000003C4237180201030000000000000000001D | |
| 2 | −:10001000576564204465632030312031323A3234F0 | |
| 3 | −:100020003A33302031393939000000000000000037 | |
| 4 | −:10003000E96C0F426547694E6E496E47206F462056 | |
| 5 | −:10004000634F6445CC135A15E8167618041A921BB0 | |
| 6 | −:10005000201DAE1E3C20CA215823E6247426022807 | |
| 7 | −:1000600090291E2BAC2C3A2EC82F5631E432723414 | |
| 8 | −:1000700000368E371C39AA3A383CC63D543FE24020 | |
| 9 | −:100080007042FE438C451A47A848364AC44B524D2D | |
| 10 | −:10009000E04E6E50FC518A531855A6563458C2593A | |
| 11 | −:1000A000505BDE5C6C5EFA5F88611663A464326646 | |
| 12 | −:1000B000C0674E69DC6A6A6CF86D866F1471A27253 | |
| 13 | −:1000C0003074BE754C776C778C77AC7733DB8ADC19 | |
| 14 | −:1000D0005333DB250700750A8A1E080183E30CEB06 | |
| 15 | −:1000E00020903C01750A8A1E080180E3C0EB129043 | |
| 16 | −:1000F0008A1E0D013C02750680E30CEB049080E340 | |
| 17 | −:10010000C053508B1EBA138EDBE86A65558BEC53D7 | |
| 18 | −:100110001E2BC08ED88B5E04C1E304035E06D1E3C0 | |
| 19 | −:100120002E8B9F44008D472A1E5A1F5B5DC3558B43 | |
| 20 | −:10013000EC531E2BC08ED88B5E04C1E304035E0615 | |
| 21 | −:10014000D1E32E8B9F44008D47341E5A1F5B5DC345 | |
| 22 | −:10015000FB558BEC53515256571E061E0733C08E6B | |
| 23 | −:10016000D88B5E04268A47592503008BF0D1E62EF2 | |
| 24 | −:100170008BB4C400C1E0042602471AD1E08BE82EFC | |
| 25 | −:100180008BAE4400892C268A471C88440F268A4758 | |
| 26 | −:100190001D884410268A471E884411268A471F88D6 | |
| 27 | −:1001A0004412268A4720884413268A472388441409 | |
| 28 | −:1001B000268A4724884415268A475A88440E33C025 | |
| 29 | −:1001C00089440689440888440B88440AB021B464F1 | |
| 30 | −:1001D000894404894402B05588440D88440CE86A77 | |
| 31 | −:1001E00000725BE8C900E8C110894408807C0F01F7 | |
| 32 | −:1001F0007429E82B02E87F02807C0F03741DE8A9B4 | |
| 33 | −:10020000108BF82B44083DA00F7210897C0833C076 | |
| 34 | −:1002100087440685C07504C6440AFF8A440A84C020 | |
| 35 | −:10022000750BB80800E86A4AE8A90173BFE84F01F6 | |
| 36 | −:100230008166487FFF83667ABFB002E8040E8A4475 | |
| 37 | −:100240000A98071F5F5E5A595B5DC3814E48800064 | |
| 38 | −:10025000B040E83D4AE88940732AE84D108BD8B099 | |
| 39 | −:1002600005E82E4AF6462702751AE83D102BC33DD5 | |
| 40 | −:10027000581B72EB8166487FFFB002E8C40DC6448C | |
| 41 | −:100280000A01F9C3834E7A40F8C3FBB001E8024A81 | |
| 42 | −:10029000FAE8991EE40A84C075F0B04EE60AFBB095 | |
| 43 | −:1002A00001E8EE49FAE8851EE40A84C075F0C3FA55 | |
| 44 | −:1002B000E87A1EE4EC884416E4E4884417E4F888FD | |
| 45 | −:1002C0004418E4F0884419E41088441AE41288447D | |
| 46 | −:1002D0001BE41488441CE43488441DE43688441E1E | |
| 47 | −:1002E000E4D824018AE0E4DA24020AC488441F8A9C | |
| 48 | −:1002F0004410E8CD1F8A4411E835218A4412E88968 | |
| 49 | −:10030000218A4413E84321C686A10000E414241086 | |
| 50 | −:10031000E614E412243DE6128A44153C01721E776D | |
| 51 | −:1003200016B011E634B013E636E4140C10E614E40B | |
| 52 | −:10033000120C40E612EB06E4120C02E6128A440F9D | |
| 53 | −:100340003C0174063C02740AEB0EE4120C08E6123F | |
| 54 | −:10035000EB06E4120C10E612E82FFF8A44143C026C | |
| 55 | −:100360007508B05588440C88440DB021B4648944A4 | |
| 56 | −:1003700004894402E40C0C10E60CE8ED39FBC3E8F8 | |
| 57 | −:100380005F3F7308FBB00AE80849EBF3FAE89D1DEC | |
| 58 | −:100390008A64168A441789869400E6E48AC4E6ECE7 | |
| 59 | −:1003A0008A64188A441989869600E6F08AC4E6F8B9 | |
| 60 | −:1003B0008A441AE6108A441BE6128A441CE6148A10 | |
| 61 | −:1003C000441DE6348A441EE6368A441FE6D8E6DA3F | |
| 62 | −:1003D000E9B7FE90FA8A440EE6FEE402A80175052C | |
| 63 | −:1003E00033C0FBF8C333C0E400FBF9C38A64148054 | |
| 64 | −:1003F000FC02742BFEC0FEC780FF4E721C74098085 | |
| 65 | −:10040000FF507308B00AEB17B00DEB1302DC32FF9C | |
| 66 | −:1004100080FB7F7C02B3218AC33C7F7C02B021C376 | |
| 67 | −:10042000FA807C0B047602FBC38B46243D080072E5 | |
| 68 | −:10043000F68E46028B7E228A440C8B5C02AAE8ABC5 | |
| 69 | −:10044000FFAAE8A7FFAAE8A3FFAAE89FFF88440C39 | |
| 70 | −:10045000895C0280440B04897E22836E24048346D7 | |
| 71 | −:100460001A04807E26027406806626FDFBC360B0F7 | |
| 72 | −:10047000FDE8023F61FBC3FA807C0F037509C644A7 | |
| 73 | −:100480000B00E8E538FBC3C47E148B4E3A85C97572 | |
| 74 | −:1004900035268B0D4747E3EA3B7E047622B80200FF | |
| 75 | −:1004A00039462E7707C7462E0000EB138B5E2C894A | |
| 76 | −:1004B0005E0426C70700004343895E2C29462E852B | |
| 77 | −:1004C000C978CE894E3A8A440D8B5C04268A25472A | |
| 78 | −:1004D0003AC47516FE4C0BFF4406E80FFFE2ED88A8 | |
| 79 | −:1004E000440D895C04894E3AEBA7C6440AFEE879BC | |
| 80 | −:1004F00038FBC390E8B30D8AE88A0ECB13B3078AA2 | |
| 81 | −:10050000C1EEEB00EC3AC1750902CDFECB75F0EB04 | |
| 82 | −:100510000C90880ECB138AE8BBFFFFF9C3880ECB83 | |
| 83 | −:1005200013F8C390BB3F3F8A8E9E00BAFE00EC8A50 | |
| 84 | −:10053000E832C122C37502F8C3F9C390E8E5FF733E | |
| 85 | −:1005400001C3BAD000BB03038A8E9F00EC8AE83255 | |
| 86 | −:10055000C122C37502F8C3F9C39033C08ED88EC0D0 | |
| 87 | −:10056000803EC813007507B00AE82647EBF2FB335C | |
| 88 | −:10057000DB8A1EC913434383FB7E760733DBB0025D | |
| 89 | −:10058000E80F472E8BAF4400837E080074E7881E77 | |
| 90 | −:10059000C913B002E8FB46FAF7463840007414E885 | |
| 91 | −:1005A000961BE87FFF721C33D28A969F0083C20E8F | |
| 92 | −:1005B000EB0C90E8771BE883FF7208BA4800E83339 | |
| 93 | −:1005C000FF73AB23CB898E9A0089969C00FE86B57B | |
| 94 | −:1005D00000C606C81300B00AE8670AFBEB891018CA | |
| 95 | −:1005E000082833C0A005018AC824407524C7067CAA | |
| 96 | −:1005F000128E45C70642120100C606541202B00808 | |
| 97 | −:10060000F6C1017402B004A34612A24C12A29412C5 | |
| 98 | −:10061000C3C7067C12B645A00F0184C0750E6A00E0 | |
| 99 | −:100620001FC60693121E9C0EE8B10C90C70644121A | |
| 100 | −:100630000100A342128BD8C1E304881E9412BEE2CB | |
| 101 | −:10064000052BF08BC833DB8BFB2EAC888548128AD8 | |
| 102 | −:10065000D80C05E6FE8AE0EB00E4FE32C4A83F7445 | |
| 103 | −:1006600003E99E00E400888550128AE02430BA1025 | |
| 104 | −:10067000FF3C30741280FC04740ABA0403F60608C6 | |
| 105 | −:1006800001FE7403BA080F88954C1202FA32C0F6C4 | |
| 106 | −:10069000C4087402B001888558128AC43C35745B62 | |
| 107 | −:1006A0003C3674573C3474533C04744F3C14744BC4 | |
| 108 | −:1006B0003C157447A8407425C685541204D1E7B48C | |
| 109 | −:1006C000038AC389855C128AC38AE380CC01898549 | |
| 110 | −:1006D0006412D1EF47E203EB1A90E96CFFC6855430 | |
| 111 | −:1006E0001202D1E78AE68AC30C0489855C12D1EF35 | |
| 112 | −:1006F00047E2E733C08AC7A34612C3C68554120631 | |
| 113 | −:10070000EBBBC68554120033C08885501288854CD7 | |
| 114 | −:100710001288855812EBA6C7462602128B461E8900 | |
| 115 | −:1007200046008946228B4620894624C7461A000087 | |
| 116 | −:10073000C3C7463C8000C7463801001E568B763042 | |
| 117 | −:100740008976048976148E5E0633C089044646890C | |
| 118 | −:10075000762C89463A8B4632484889462E5E1FC31E | |
| 119 | −:1007600033C089464889464AC74646AE0189464E47 | |
| 120 | −:100770008B46448946508B4642894640894608C389 | |
| 121 | −:1007800033C0894676894678C7467A1000561E8B54 | |
| 122 | −:10079000767089761089760C8E5E12C70400008B05 | |
| 123 | −:1007A00046728946741F5EC3895618895602895657 | |
| 124 | −:1007B0000689560A89560E8956128956168BD84BC9 | |
| 125 | −:1007C0004BC1E302BF0200897E1E03FB897E30031A | |
| 126 | −:1007D000FB897E4203FB897E7083EB08895E20895A | |
| 127 | −:1007E0005E32895E44895E7250E82BFFE871FFE853 | |
| 128 | −:1007F0003FFFE88BFF58C3B83075C1E8040E5B03B8 | |
| 129 | −:10080000C3A3BA13833E4212007407803E941200C1 | |
| 130 | −:10081000750E6A001FC60693121E9C0EE8BD0A9054 | |
| 131 | −:10082000B8307AC1E80440A3C0132B061201F7D8F0 | |
| 132 | −:1008300033D28BCA8A0E9412F7F13D8000770E6A8C | |
| 133 | −:10084000001FC6069312259C0EE8900A90483DFFB3 | |
| 134 | −:10085000077203B8FF07A3C21333C98A0E94123379 | |
| 135 | −:10086000F6B800092E8BAC440089464C404646E25F | |
| 136 | −:10087000F38A0E941233F68B16C013A1C2132E8B7B | |
| 137 | −:10088000AC4400E822FF03D04646E2F2C333C02E58 | |
| 138 | −:100890008BAD44008946084747E2F4C35133C00A90 | |
| 139 | −:1008A000C22E8BAD440089869E00814E38002047C1 | |
| 140 | −:1008B00047FEC480FC04720432E4FEC0E2E35983C4 | |
| 141 | −:1008C000E9107405F7D9E8C4FFC35133C00AC22E3A | |
| 142 | −:1008D0008BAD440089869E00834E3840474780C4D4 | |
| 143 | −:1008E00010790432E4FEC0E2E65983E9107405F79A | |
| 144 | −:1008F000D9E899FFC3E8D2FFC38D089C08CA08F560 | |
| 145 | −:10090000088B0E421233F6515633DB8BCB8A944858 | |
| 146 | −:10091000128A8C4C128A9C54128BFEC1E70585DB2F | |
| 147 | −:100920007502B1102EFF97F9085E5946E2D9C3014E | |
| 148 | −:10093000CC03D000E802D000E801D000E800D000ED | |
| 149 | −:10094000E804D0A8DA00DC00DE01D803CC03CC0335 | |
| 150 | −:10095000CC04D0A8DA20DC00DE03CC03CC03CC002E | |
| 151 | −:10096000D803CC03CC03CC03CC03CC03CC03CC0303 | |
| 152 | −:10097000CC03CC03CC03CC03CC03CC03CC03CC03FF | |
| 153 | −:10098000CC04D000DA20DC03DE01D803CC03CC0396 | |
| 154 | −:10099000CC03CC00D800CC00D0000056521E0E1F55 | |
| 155 | −:1009A000BE2F0933D2FCAD85C0740D8AD4EEAD855F | |
| 156 | −:1009B000C074058AD4EEEBEE1F5A5EC3E48084C097 | |
| 157 | −:1009C00074167814B027E6FCB011E634E4FC3C273A | |
| 158 | −:1009D0007506E4117502F8C3F9C383C206B0BFEE11 | |
| 159 | −:1009E00083EA02B010EE8886AF00B01183C204EE35 | |
| 160 | −:1009F00083C202EEB01383C202EE83C202EE2EA1C6 | |
| 161 | −:100A00004C2D8986940083EA0EEE83C2028AC4EEDE | |
| 162 | −:100A100083C204B003EE8886A80083EA0432C0EEE5 | |
| 163 | −:100A200083C202B089EE8886A6000C06EEB040B400 | |
| 164 | −:100A30003889461CC74636380083C20432C0EE8867 | |
| 165 | −:100A400086A700C383C206B0BFEE83EA02EC3A86F3 | |
| 166 | −:100A5000AF00752483C204EC3C11751C83C206EC04 | |
| 167 | −:100A60003C13751483EA088A86A800EE83EA02EC38 | |
| 168 | −:100A700024C03CC07502F8C3F9C333C98BD18BF1D4 | |
| 169 | −:100A80008A0E9412C1E9022E8BAC4400F74638005E | |
| 170 | −:100A900020740E8A869E00E6FE32C0E68042E8FAA6 | |
| 171 | −:100AA000FE83C608E2E185D27403E80508C333C9B2 | |
| 172 | −:100AB0008BF18A0E94122E8BAC4400F7463840001E | |
| 173 | −:100AC0007406E87316E812FF4646E2EAC333C98BA0 | |
| 174 | −:100AD000F18A0E9412C1E9022E8BAC4400F746381D | |
| 175 | −:100AE00000207416E84616E8D2FE730E6A001FC690 | |
| 176 | −:100AF0000693121C9C0EE8E3079083C608E2D9C354 | |
| 177 | −:100B000033C98BF18A0E94122E8BAC4400F7463811 | |
| 178 | −:100B100040007416E82116E82AFF730E6A001FC60B | |
| 179 | −:100B20000693121C9C0EE8B307904646E2DAC30C0B | |
| 180 | −:100B300000001000131200001400283C001B3E00AF | |
| 181 | −:100B4000002A00002C0000420014D80000DA000047 | |
| 182 | −:100B50003400113600133800113A001300005650CB | |
| 183 | −:100B600052BE2F0B2EAD85C07406922EACEEEBF468 | |
| 184 | −:100B70005A585EC3532EA16022E6E4E6F08AC4E62A | |
| 185 | −:100B8000ECE6F8E8D8FFB04BE610B050E612B0380B | |
| 186 | −:100B9000E614E8AE15B046E60AE8A715B01AE60A6C | |
| 187 | −:100BA000E8A015B022E60AE89915E8FD068BD8E41E | |
| 188 | −:100BB00016A8047518E8F2062BC33D320072F06ADD | |
| 189 | −:100BC000001FC6069312239C0EE8100790E8DA0671 | |
| 190 | −:100BD0002BC33D2400771BB031E6FC565155B910AC | |
| 191 | −:100BE000002E8BAC4400814E3880004646E2F25D18 | |
| 192 | −:100BF000595EE869FFE84B15B046E60AE844155B24 | |
| 193 | −:100C0000C333F68B0E42122E8BAC4400F7463800ED | |
| 194 | −:100C1000207406E81715E85BFF83C620E2E9C38B62 | |
| 195 | −:100C2000C20504008946282EA14C2D89868E008994 | |
| 196 | −:100C300086900089869200C686A3000AC686C300F5 | |
| 197 | −:100C4000035283C2048A86A6000C06EE5A83C202AF | |
| 198 | −:100C5000B005EE8886A500C3E803FFE8E514B042BE | |
| 199 | −:100C6000E60AF74638800074062EA19C22EB042E7B | |
| 200 | −:100C7000A16C22C7461C0C008986940089869600C8 | |
| 201 | −:100C800089868E008986900089869200E6F0E6E4E7 | |
| 202 | −:100C90008AC4E6F8E6ECC686C30003E8A514B01AD9 | |
| 203 | −:100CA000E60AB0108886A500E60CC333C98BF18A2A | |
| 204 | −:100CB0000E94122E8BAC4400F7463840007406E8C0 | |
| 205 | −:100CC0007614E85AFF4646E2EAC333C98BF18A0E2E | |
| 206 | −:100CD00094122E8BAC4400F7463800207406E84C82 | |
| 207 | −:100CE00014E874FF4646E2EAC390833E441200755E | |
| 208 | −:100CF00014B001BA0601EE2AC0EEB002EEB004EE66 | |
| 209 | −:100D0000B80002EB0FBA0601B040EEB801008A0E3F | |
| 210 | −:100D10000E01D3E0A38812C3A18812A384122D2050 | |
| 211 | −:100D200000A38A122D2000A38212C706861220007B | |
| 212 | −:100D3000C70680123200C3833E44120074768B0EC5 | |
| 213 | −:100D4000421233F68AA4541284E4745F8A844812EF | |
| 214 | −:100D50000C04E6FEF6C4047425B01BBA0000EEEBEA | |
| 215 | −:100D6000002AC0BA0200EEEB00B003EEEB0032C086 | |
| 216 | −:100D7000BA0200EEEB00BA0000B000EEEB2DB01F9F | |
| 217 | −:100D8000BA0000EEEB002AC0BA0200EEEB00B0039E | |
| 218 | −:100D9000EEEB00D1E68A845D12D1EEF6D0BA020005 | |
| 219 | −:100DA000EEEB00BA0000B00AEEEB00E404EB00E466 | |
| 220 | −:100DB0000446E290C390B81400BA3EFFEFB80600B4 | |
| 221 | −:100DC000BA32FFEFB80F00BA34FFEFBA36FFEF8345 | |
| 222 | −:100DD0003E4412007516B81100BA38FFEFB8120081 | |
| 223 | −:100DE000BA3AFFEFB81B00BA3CFFEFC3B81100BA24 | |
| 224 | −:100DF00038FFEFB81200BA3AFFEFB81B00BA3CFF59 | |
| 225 | −:100E0000EFC3B8FC00BA28FFEFFB833E4412007426 | |
| 226 | −:100E100007B8CC00BA28FFEFC300FFFF202428FF4B | |
| 227 | −:100E20002CFFFF303438FFFF3C903C0F770EBB198E | |
| 228 | −:100E30000E2ED73CFF74058AD8F8C3902ADBF9C37D | |
| 229 | −:100E4000833E4412007427A00601802606013080EC | |
| 230 | −:100E50003E0601307518B90200BFC413BA0601EC92 | |
| 231 | −:100E6000A82075F8BA0401EDABE2F1EB1690B904D5 | |
| 232 | −:100E700000BFC413BA0601ECA82075F8BA0401EC4F | |
| 233 | −:100E8000AAE2F1FA90BEC413AD80E43F80FC027484 | |
| 234 | −:100E90000E6A001FC60693120A9C0EE83E0490AD2F | |
| 235 | −:100EA0003C0F75ED8AC4E881FF72E6881E1A01C600 | |
| 236 | −:100EB000068E1200B0000A061A01BA0001EEC6063C | |
| 237 | −:100EC0008F1240833E4412007506B80C00EB04906C | |
| 238 | −:100ED000B84C00BA28FFEFC3833E4412007501C32B | |
| 239 | −:100EE000A150120B0652120AC4A80874F2A00F01F6 | |
| 240 | −:100EF0002AE450FF36BA131FE8505683C4026A0032 | |
| 241 | −:100F00001F33C0A3BC13A00F01A3BE138B1EBC13C1 | |
| 242 | −:100F10008A875012F687501208740D24078AE0BEA3 | |
| 243 | −:100F2000CC00A0BC13E8943DFF06BC13FF0EBE131B | |
| 244 | −:100F300075DAC3901E33C08ED8B001E8543D1FC38C | |
| 245 | −:100F400033C98BF18A0E94122E8BAC4400C74662D3 | |
| 246 | −:100F50003844C7467CFC3BC7467EE23BC7868000E0 | |
| 247 | −:100F6000EC3CE8AB16C686C00011837E080074070F | |
| 248 | −:100F70005156E833335E594646E2CDC333C98BF14F | |
| 249 | −:100F80008BF98A0E9412C1E902E3132E8BAC440054 | |
| 250 | −:100F90008A869E0088856C1283C60847E2EDC3FAF4 | |
| 251 | −:100FA000FCB0C0BA0001EE33C08ED88EC08ED0BF68 | |
| 252 | −:100FB0001601B9CC772BCFD1E9F3ABBC4012E8D9FD | |
| 253 | −:100FC00002E8703CBECC0FE8F23CF49033C08ED8FF | |
| 254 | −:100FD0008EC08ED0F6060A0180740BBE3555E8DB54 | |
| 255 | −:100FE0003CB001E8AC3CE8B300E8F6F5E808F8E806 | |
| 256 | −:100FF0000FF9E885FAE8B6FAE8EFFCE8C210E80372 | |
| 257 | −:101000003CE8B2FDE830FDE85402C6068F12C0E8A5 | |
| 258 | −:10101000BBFAE8EBFAE8E9FBE8AFFCE88DFCE81F77 | |
| 259 | −:10102000FFE858FFE8DBFDE816FE33C0BE5A05E8CE | |
| 260 | −:101030008A3CE8A3FEE8E0FCFBBEA444E87D3CE972 | |
| 261 | −:10104000CA2D56988BF08B425285C07527C74252E5 | |
| 262 | −:10105000010053368B9C2C01F6C301750C36896850 | |
| 263 | −:10106000523689AC2C015B5EC33689AC2C013689C3 | |
| 264 | −:10107000AC1C015B5EC356988BF033ED368B841C41 | |
| 265 | −:1010800001A80175158BE833C08742523689841C4C | |
| 266 | −:1010900001A80174053689842C015EC3565133F6CC | |
| 267 | −:1010A000B80100B9080089841C0189842C014646D6 | |
| 268 | −:1010B000E2F4595EC390BB01008BE8FF4E6E740AE8 | |
| 269 | −:1010C0008BDD8B4658A80174F0C38B4648A90800F5 | |
| 270 | −:1010D0007445F7463840007427E85C1080C2068AE1 | |
| 271 | −:1010E00086A80024BF8886A800EE60B0FEE886329D | |
| 272 | −:1010F00061B002E84CFF8B464824F7894648EB175D | |
| 273 | −:10110000E82A10814E2600408A86A5000C028886B7 | |
| 274 | −:10111000A500E60C8B4648A904007414B002E8212F | |
| 275 | −:10112000FF8B464824FB89464860B0DFE8473261C0 | |
| 276 | −:1011300033C0874658F6C301750B36894758A80156 | |
| 277 | −:10114000750DE974FFA32201A8017503E96AFF89FF | |
| 278 | −:101150001E3201C3BB01008BE8F74638400074150E | |
| 279 | −:10116000E8D50F80C20AECA840750A8BDD8B465685 | |
| 280 | −:10117000A80174E3C38B462680E4FE80CC02894636 | |
| 281 | −:1011800026B002E8BCFE33C0874656F6C301750A96 | |
| 282 | −:1011900036894756A801750BEBBDA32001A8017540 | |
| 283 | −:1011A00002EBB4891E3001C3601E062BC08ED8A08E | |
| 284 | −:1011B000901284C07549A12201A8017503E8F6FECA | |
| 285 | −:1011C000A12001A8017503E88AFFA1AC13487805A6 | |
| 286 | −:1011D0007445A3AC13A1AE134878057451A3AE13A4 | |
| 287 | −:1011E000A1B0134878057463A3B013A17E124078B0 | |
| 288 | −:1011F00003A37E12B80080BA22FFEF071F61CFA0C1 | |
| 289 | −:101200009112403C02720B33C0A29112FF167C1265 | |
| 290 | −:10121000EBA4A29112EB9FA08E1232068F12A28E27 | |
| 291 | −:10122000120A061A01BA0001EEB82C01EBA4833EA3 | |
| 292 | −:101230008412107211BA28FFED0C81EFE85337BA0F | |
| 293 | −:1012400028FFED247EEFB80400EB92C6068D120154 | |
| 294 | −:10125000E83F37C6068D1200A1B213EB8B908A1EB1 | |
| 295 | −:101260000B012AFF6BC319BA62FFEFB80A00BA601C | |
| 296 | −:10127000FFEFB801E0BA66FFEFB8FFFFBA52FFEF29 | |
| 297 | −:10128000B809C0BA56FFEFC706AC132C01C706AEAB | |
| 298 | −:10129000130400C606911200C3908A1E0B012AFF98 | |
| 299 | −:1012A0006BC305D1E8A31801C39052BA50FFED5AA1 | |
| 300 | −:1012B000C39053518B1E1801B9320590E2FE4B7555 | |
| 301 | −:1012C000F7595BC3B080BA00010A061A01EEC39059 | |
| 302 | −:1012D000B040EBF2B0C0EBEEB000EBEAFA60061EF5 | |
| 303 | −:1012E000162BDB8EDB2EA1BA4C2EA3924CA09312B0 | |
| 304 | −:1012F000988BE889262D7A803ECA13007403E96B27 | |
| 305 | −:1013000042E8C0FFE8ABFFE8A8FFB020C606901295 | |
| 306 | −:1013100000FF167C128BFD83FF0A7211E8B9FFE80B | |
| 307 | −:1013200090FFE8ABFFE88AFF83EF0AEBEA0BFF745C | |
| 308 | −:101330000FE8A4FFE87BFFE89AFFE875FF4F75F11F | |
| 309 | −:10134000E895FFE86CFFEBB98A86A50024FDEE88DE | |
| 310 | −:1013500086A500C38A86A6000C02EEC38B7638F7FA | |
| 311 | −:10136000C6010074EF8B4E368B462E3BC173028B49 | |
| 312 | −:10137000C82BC189462E014E34C47E0426010D8B34 | |
| 313 | −:101380007E2C83EA04F36C8EC1897E2C3B463C7232 | |
| 314 | −:1013900012F7C62000750B83CE20897638B000E89E | |
| 315 | −:1013A000A0FCC3F7C60400741B8BD883CE108976CB | |
| 316 | −:1013B000388A86A70024FE8886A70083C208EE83A9 | |
| 317 | −:1013C000EA088BC33D40007201C3814E380004839C | |
| 318 | −:1013D000C2028A86A50024FA8886A500EEC38A8602 | |
| 319 | −:1013E000A6000C02EEC3F74638010074F18B4E2EB6 | |
| 320 | −:1013F00032DB8ABEA30083C206C476048B7E2C83B4 | |
| 321 | −:10140000F908722CECA80174168AE083EA0AEC83CE | |
| 322 | −:10141000C20A84E77551AAFEC34983F90873E5320D | |
| 323 | −:10142000FF26011C015E34897604894E2E897E2CAC | |
| 324 | −:101430003B4E3C7211F64638207401C3834E38206F | |
| 325 | −:10144000B000E8FDFBC3F64638047415834E38102F | |
| 326 | −:101450008A86A70024FE8886A70083EA02EE83C25C | |
| 327 | −:10146000023D4000725DC332FF26031C85DB740918 | |
| 328 | −:1014700026891C8BF74747494980E41E80CCC0264B | |
| 329 | −:101480008904F6C41074278B7638F7C60010740BE5 | |
| 330 | −:1014900050FE86B200B00AE8A8FB58F7C6000174F7 | |
| 331 | −:1014A0000DE882268B76388B4E2E8B7E04AB8BF725 | |
| 332 | −:1014B00033C0AB32DB8ABEA300494983F9087217F7 | |
| 333 | −:1014C000E941FF814E38000483C2F88A86A50024D2 | |
| 334 | −:1014D000FA8886A500EEC3E945FF83C208EC88863A | |
| 335 | −:1014E000AA00C0E8048AE08AC88686A90032E08B98 | |
| 336 | −:1014F0005E3E84E3744F8AC18B4E26F6C504740C9D | |
| 337 | −:10150000A808740580E1BFEB0380C940F6C50874E4 | |
| 338 | −:101510000CA802740580E17FEB0380C980884E2609 | |
| 339 | −:101520008BF08A86A50084C97408A802741524FD6E | |
| 340 | −:10153000EB06A802750D0C028886A50083EA0AEE68 | |
| 341 | −:1015400083C20A8BC684E77501C3C686BA0001B0A0 | |
| 342 | −:101550000EE8EEFAF74638000274EE837E2E06722D | |
| 343 | −:10156000E88AA6AA00C45E048B7E2CB0FFAAB00253 | |
| 344 | −:10157000AB26830703836E2E03897E2CF646382024 | |
| 345 | −:101580007401C3834E3820B000E8B6FAC39083EAF2 | |
| 346 | −:1015900008E9B4FD83C2068B5E26F6C3C075EF8BE7 | |
| 347 | −:1015A0004E1CEC8886A40083EA0AA82075028ACD26 | |
| 348 | −:1015B00032ED8B461A3BC87318014E2A2BC189465F | |
| 349 | −:1015C0001AC57600F36E8ED98976003D2000723000 | |
| 350 | −:1015D000C385C074318BC801462AC57600F36E8E70 | |
| 351 | −:1015E000D980CB02895E26E832F1F6C701751683F1 | |
| 352 | −:1015F000C202E853FDF6C710750BB002E843FAC308 | |
| 353 | −:10160000F6C70174F0C380CB02895E26F6C7017469 | |
| 354 | −:10161000DE83C202E831FDF686A40040740B80E749 | |
| 355 | −:10162000FE80CF02895E26EBCCB004E814FAC3C07A | |
| 356 | −:10163000C2C8CAC4C6CCCED0D2D8DAD4D6DCDE90EA | |
| 357 | −:10164000E90E01E4C48AE0E4C48BD083F90872F0A7 | |
| 358 | −:1016500026833F0074048BDF49498BFB8ADE83E3DA | |
| 359 | −:101660000F2E8AA72F16ABF6C4107424F7C60010ED | |
| 360 | −:10167000740B50FE86B200B00AE8C6F958F7C600EF | |
| 361 | −:1016800001740DE8A0248B76388B4E2E8B7E04AB34 | |
| 362 | −:10169000897E0433C0AB4949894E2E897E2C8BC18B | |
| 363 | −:1016A000EB4E90EB9E90E4D684C07963E6D08AC876 | |
| 364 | −:1016B00025030003D8D1E32E8BAF4400888EAE0003 | |
| 365 | −:1016C0008B4E2EC45E048B7E2C8B7638E4862407EA | |
| 366 | −:1016D0003C0375CFE41C913BC173028BC82BC189BD | |
| 367 | −:1016E000462E014E3426010FBAC400F36C897E2CBD | |
| 368 | −:1016F0003B463C721CF7C62000750B83CE208976D2 | |
| 369 | −:1017000038B000E83CF98A86AE00243FE6D6C3F93B | |
| 370 | −:10171000C3F7C60A007435F7C61000752F83CE10C4 | |
| 371 | −:10172000897638F7C60200740E50E4D824FEE6D855 | |
| 372 | −:1017300058F7C6080074155051B9E803E40A84C08C | |
| 373 | −:10174000E0FA84C07504B024E60A59583D4000739D | |
| 374 | −:10175000B58A86A50024EF8886A500E60C81CE1008 | |
| 375 | −:1017600004897638EBA00008040C0109050D020A73 | |
| 376 | −:10177000060E030B070F004080C02060A0E0105051 | |
| 377 | −:1017800090D03070B0F0E4D2E6D08AC825030003D0 | |
| 378 | −:10179000D8D1E32E8BAF4400888EAE00E4D8C0E8E9 | |
| 379 | −:1017A000048BD82E8A8766178AE08AC88686A900A5 | |
| 380 | −:1017B00032E0E4988B5E3E84E374548AC18B4E26FB | |
| 381 | −:1017C000F6C504740CA808740580E1BFEB0380C95A | |
| 382 | −:1017D00040F6C508740CA802740580E17FEB038015 | |
| 383 | −:1017E000C980884E268BF08A86A500F6C1FD740854 | |
| 384 | −:1017F000A806741924F9EB0FA8067511F6C5017532 | |
| 385 | −:10180000040C04EB020C028886A500E60C8BC6844F | |
| 386 | −:10181000E775098A86AE00243FE6D2C3C686BA00C1 | |
| 387 | −:1018200001B00EE81CF8F74638000274E6837E2EFD | |
| 388 | −:101830000672E08A86A9008AE08686AA008AC832F3 | |
| 389 | −:10184000C480C90B22C1C0E4040AE0C45E048B7EDC | |
| 390 | −:101850002CB0FFAAB002AB26830703836E2E038948 | |
| 391 | −:101860007E2CF646382075AB834E3820B000E8D188 | |
| 392 | −:10187000F7EBA090E41224DFE61281E3FE9F895E7D | |
| 393 | −:1018800026836648F7EB7390F6C72075E7E4120CE1 | |
| 394 | −:1018900020E61232C0E6C6B083E6C680CF20895E5D | |
| 395 | −:1018A000268A86A5000C028886A500E60CEB7490BB | |
| 396 | −:1018B000F6C74075D3E4120C20E61232C0E6C6B07B | |
| 397 | −:1018C00081E6C680E7DF80CB01895E26B006E8713D | |
| 398 | −:1018D000F7908A86A50024F9E60C8886A500EB43DC | |
| 399 | −:1018E000E4D4E6D08BF825030003D8D1E32E8BAFE8 | |
| 400 | −:1018F00044008B5E26F6C76075B6F6C3C075D3BAD2 | |
| 401 | −:10190000C6008B4E1C8B461A3BC8731E014E2A2BF9 | |
| 402 | −:10191000C189461AC57600F36E8ED98976003D20BE | |
| 403 | −:1019200000723D8BC7243FE6D4C385C074398BC891 | |
| 404 | −:1019300001462AC57600F36E8ED983CB02895E26D6 | |
| 405 | −:10194000E8D9EDF6C70175398A86A50024F9E60CB9 | |
| 406 | −:101950008886A500F6C71075CAB002E8E4F6EBC3A6 | |
| 407 | −:10196000F6C70174EFEBBCF6C70174DC8A86A500EC | |
| 408 | −:10197000A802741181E3FFFE81CB0002895E26EB91 | |
| 409 | −:10198000C78A86A50024FB0C02E60C8886A500EB1E | |
| 410 | −:101990009290FDF7DF7FFEFBEFBF0004000405041B | |
| 411 | −:1019A00005040104000405040504060406040504F6 | |
| 412 | −:1019B00005040604060405040504020400040504E5 | |
| 413 | −:1019C00005040104000405040504060406040504D6 | |
| 414 | −:1019D00005040604060405040504070407040504B9 | |
| 415 | −:1019E00005040704070405040504060406040504A9 | |
| 416 | −:1019F0000504060406040504050407040704050499 | |
| 417 | −:101A00000504070407040504050406040604050488 | |
| 418 | −:101A10000504060406040504050403040004050483 | |
| 419 | −:101A20000504010400040504050406040604050475 | |
| 420 | −:101A30000504060406040504050402040004050464 | |
| 421 | −:101A40000504010400040504050406040604050455 | |
| 422 | −:101A50000504060406040504050407040704050438 | |
| 423 | −:101A60000504070407040504050406040604050428 | |
| 424 | −:101A70000504060406040504050407040704050418 | |
| 425 | −:101A80000504070407040504050406040604050408 | |
| 426 | −:101A90000504060406040504050433DB8AD88A8796 | |
| 427 | −:101AA0006C12E6FEC1E302E4CEA8047509A8027434 | |
| 428 | −:101AB00003E92CFEF9C35053E8CBFC5B58A8027431 | |
| 429 | −:101AC00003E91CFEF8C333DB8AD88A876C12E6FE72 | |
| 430 | −:101AD000C1E302E9D0FB9A1AC61A00000200040012 | |
| 431 | −:101AE00002000600020004000200080002000400D8 | |
| 432 | −:101AF000020006000200040002000A0002000400C6 | |
| 433 | −:101B000002000600020004000200080002000400B7 | |
| 434 | −:101B1000020006000200040002000C0002000400A3 | |
| 435 | −:101B20000200060002000400020008000200040097 | |
| 436 | −:101B3000020006000200040002000A000200040085 | |
| 437 | −:101B40000200060002000400020008000200040077 | |
| 438 | −:101B5000020006000200040002000E000200040061 | |
| 439 | −:101B60000200060002000400020008000200040057 | |
| 440 | −:101B7000020006000200040002000A000200040045 | |
| 441 | −:101B80000200060002000400020008000200040037 | |
| 442 | −:101B9000020006000200040002000C000200040023 | |
| 443 | −:101BA0000200060002000400020008000200040017 | |
| 444 | −:101BB000020006000200040002000A000200040005 | |
| 445 | −:101BC00002000600020004000200080002000400F7 | |
| 446 | −:101BD00002000600020004000200C390DA1494150B | |
| 447 | −:101BE0005C13E613DA1BDA1BE613DA1B8B94641220 | |
| 448 | −:101BF000C1E604A80174355033C08AC2E6FEE4A0F1 | |
| 449 | −:101C000085C074278BD82E8A9FDA1A52562E8BA83D | |
| 450 | −:101C100044008B5628ECA801750D8886AD00240E73 | |
| 451 | −:101C20008AD82EFF97DC1B5E5AEBCD58A80274367B | |
| 452 | −:101C300083C61033C08AC6E6FEE4A085C074278B35 | |
| 453 | −:101C4000D82E8A9FDA1A52562E8BA844008B56281B | |
| 454 | −:101C5000ECA801750D8886AD00240E8AD82EFF975A | |
| 455 | −:101C6000DC1B5E5AEBCDC39032E48BD88BD02E8A2E | |
| 456 | −:101C70009F9A192E2297921956528AC3240303C69B | |
| 457 | −:101C800080E304D0EB2EFF97D61A585EA955007555 | |
| 458 | −:101C9000D9C3601E062BC08ED8A15C12E6FEE400FC | |
| 459 | −:101CA00022C4740833F6E8BFFFEBEE90E40407E4C7 | |
| 460 | −:101CB000041FB80080BA22FFEF61CF90601E062B90 | |
| 461 | −:101CC000C08ED8A15E12E6FEE40022C47408BE04F1 | |
| 462 | −:101CD00000E894FFEBEDE40407E4041FB80080BAC9 | |
| 463 | −:101CE00022FFEF61CF90601E062BC08ED8A15C1240 | |
| 464 | −:101CF000E6FEE40022C4741833F6E86BFFA160121C | |
| 465 | −:101D0000E6FEE40022C474E5BE0800E85AFFEBDDFD | |
| 466 | −:101D1000A16012E6FEE40022C475EDE40407E404C9 | |
| 467 | −:101D2000A15C12E6FEE4041FE404B80080BA22FFBE | |
| 468 | −:101D3000EF61CF90601E062BC08ED8A15E12E6FE2A | |
| 469 | −:101D4000E40022C47419BE0400E81CFFA16212E67C | |
| 470 | −:101D5000FEE40022C474E4BE0C00E80BFFEBDCA13F | |
| 471 | −:101D60006212E6FEE40022C475EDE40407E404A177 | |
| 472 | −:101D70005E12E6FEE4041FE404B80080BA22FFEF1E | |
| 473 | −:101D800061CF601E062BC08ED8A15C12E6FEE480F7 | |
| 474 | −:101D900084C4740833F6E853FEEBEE90B80080BAC2 | |
| 475 | −:101DA00022FFEF071F61CF90601E062BC08ED8A1C7 | |
| 476 | −:101DB0005E12E6FEE48084C47408BE0200E82CFED5 | |
| 477 | −:101DC000EBEDB80080BA22FFEF071F61CF90601ED5 | |
| 478 | −:101DD000062BC08ED8A16012E6FEE48084C474088D | |
| 479 | −:101DE000BE0400E806FEEBEDB80080BA22FFEF0764 | |
| 480 | −:101DF0001F61CF90601E062BC08ED8A16212E6FE36 | |
| 481 | −:101E0000E48084C47408BE0600E8E0FDEBEDB80091 | |
| 482 | −:101E100080BA22FFEF071F61CF90601E062BC08E95 | |
| 483 | −:101E2000D8A15C12E6FEE40022C4741833F6E83749 | |
| 484 | −:101E3000FEA16012E6FEE48084C474E5BE0400E8FE | |
| 485 | −:101E4000AAFDEBDDA16012E6FEE48084C475EDA17D | |
| 486 | −:101E50005C12E6FEE40407E4041FB80080BA22FF27 | |
| 487 | −:101E6000EF61CF90601E062BC08ED8A15E12E6FEF9 | |
| 488 | −:101E7000E40022C47419BE0400E8ECFDA16212E67D | |
| 489 | −:101E8000FEE48084C474E4BE0600E85FFDEBDCA1E0 | |
| 490 | −:101E90006212E6FEE48084C475EDA15E12E6FEE403 | |
| 491 | −:101EA0000407E4041FB80080BA22FFEF61CF601E70 | |
| 492 | −:101EB000062BC08ED8A15C12E6FEE48084C47418A0 | |
| 493 | −:101EC00033F6E827FDA16012E6FEE40022C474E5C3 | |
| 494 | −:101ED000BE0800E892FDEBDDA16012E6FEE4002200 | |
| 495 | −:101EE000C475EDE40407E4041FB80080BA22FFEFD4 | |
| 496 | −:101EF00061CF601E062BC08ED8A15E12E6FEE48084 | |
| 497 | −:101F000084C47419BE0200E8E2FCA16212E6FEE499 | |
| 498 | −:101F10000022C474E4BE0C00E84DFDEBDCA16212AB | |
| 499 | −:101F2000E6FEE40022C475EDE40407E4041FB800F3 | |
| 500 | −:101F300080BA22FFEF61CF90601E062BC08ED8A121 | |
| 501 | −:101F40005C12E6FEE48084C4741833F6E89DFCA1BC | |
| 502 | −:101F50006012E6FEE48084C474E5BE0400E88CFCF4 | |
| 503 | −:101F6000EBDDA16012E6FEE48084C475ED071FB8C6 | |
| 504 | −:101F70000080BA22FFEF61CF601E062BC08ED8A171 | |
| 505 | −:101F80005E12E6FEE48084C47419BE0200E85CFCC4 | |
| 506 | −:101F9000A16212E6FEE48084C474E4BE0600E84B4D | |
| 507 | −:101FA000FCEBDCA16212E6FEE48084C475ED071F41 | |
| 508 | −:101FB000B80080BA22FFEF61CF90601E062BC08E62 | |
| 509 | −:101FC000D8902AC0E6FEE4CEA801741433DBE8D52D | |
| 510 | −:101FD000F6EBEF90B80080BA22FFEF071F61CF90B9 | |
| 511 | −:101FE000F60605010175EDB001E6FEE4CEA8017428 | |
| 512 | −:101FF000E3BB0400E8AFF6EBC990601E062BC08E71 | |
| 513 | −:10200000D890FB90FA2AC0E6FEE4CEA802741333FF | |
| 514 | −:10201000DBE8CCF8EBECB80080BA22FFEF071F61D9 | |
| 515 | −:10202000CF90A80474F033DBE85BF7EBD590601E2B | |
| 516 | −:10203000062BC08ED890FB90FAB001E6FEE4CEA845 | |
| 517 | −:10204000027415BB0400E897F8EBEB90B80080BA77 | |
| 518 | −:1020500022FFEF071F61CF90A80474F0BB0400E8D3 | |
| 519 | −:1020600024F7EBD26A001FC6069312099C0EE86B98 | |
| 520 | −:10207000F2906A001FC6069312299C0EE85DF2904A | |
| 521 | −:10208000722072207220CE1D921CE61C1A1E722035 | |
| 522 | −:10209000821DAE1E381F7220821D72207220381FD2 | |
| 523 | −:1020A000722072207220F41DBC1C341D641E72202C | |
| 524 | −:1020B000A81DF21E781F7220A81D72207220781FA2 | |
| 525 | −:1020C000FCB940008CCBB864202BFFAB93AB93E200 | |
| 526 | −:1020D000FAC7064C00A811833E4412007520C706BB | |
| 527 | −:1020E0003C00084BC7063000BA1FC7063400FA1F71 | |
| 528 | −:1020F000F6060501017506C70638002E20C3C7067F | |
| 529 | −:102100003C00564B33DB8A1E5412C1E302021E56BA | |
| 530 | −:10211000122E8B878020A330008A1E5512C1E30245 | |
| 531 | −:10212000021E57122E8B87A020A33400C38B869EDD | |
| 532 | −:1021300000E6FE86C4E6D0C38B869E00E6FE33D260 | |
| 533 | −:102140008AD4C351B91027E40A909084C07405E280 | |
| 534 | −:10215000F659F9C359F8C384C0781E518AE88AC871 | |
| 535 | −:10216000B80100D3E0098698003AAEA00059751076 | |
| 536 | −:10217000E8A9E5834E2602F9C39889869800EBF01A | |
| 537 | −:10218000F8C384C07812518AE08AC8B80100D3E04D | |
| 538 | −:1021900059F7D021869800C3C78698000000C383F2 | |
| 539 | −:1021A000C2048A86A6000C04EE83EA04C3E893FF07 | |
| 540 | −:1021B0007204B082E60AC38B4626A8FD74118A8693 | |
| 541 | −:1021C000A500A806740824F98886A500E60CC3F6C5 | |
| 542 | −:1021D000C401740A8A86A50024FB0C02EB0CA80239 | |
| 543 | −:1021E000750F8A86A50024FD0C043A86A50075D8D3 | |
| 544 | −:1021F000C38A86A500EBCFE4D833DB8AD8C0EB04D2 | |
| 545 | −:102200002E8A9F6617889EA9008B5E2680E33FF684 | |
| 546 | −:10221000C7047407A810750380CB40F6C70874077D | |
| 547 | −:10222000A880750380CB40885E268A86A500F6C309 | |
| 548 | −:10223000FD740DA806740824F98886A500E60CC371 | |
| 549 | −:10224000F6C70174040C02EBF0F6C30275E90C0446 | |
| 550 | −:10225000EBE7C404C4048504590448044104C303DF | |
| 551 | −:10226000820341038202570241028201410182003E | |
| 552 | −:1022700041004E02AD0157012D002B002700210027 | |
| 553 | −:102280001600F404F404A3046F045B045104F40383 | |
| 554 | −:10229000A3035103A3026D025102A3015101A30044 | |
| 555 | −:1022A00051006202D9016D01380036003100290069 | |
| 556 | −:1022B0001B005157BF0200EB0F905156BF0100EBBE | |
| 557 | −:1022C00007905156BF0300903C197602B017988BC7 | |
| 558 | −:1022D000F08A82C4002AE48BF083FE187346D1E6AC | |
| 559 | −:1022E0002E8B8C5222F74638800074052E8B8C8200 | |
| 560 | −:1022F00022F7C7020074123B8E9400740C898E94EE | |
| 561 | −:10230000008AC5E6EC8AC1E6E4F7C7010074123B17 | |
| 562 | −:102310008E9600740C898E96008AC5E6F88AC1E60E | |
| 563 | −:10232000F05E59C377068B8E8E00EBC58B8E9000C6 | |
| 564 | −:10233000EBBFD503F6003E0010000400CA043301D1 | |
| 565 | −:102340004D00140005000103050709000102030404 | |
| 566 | −:1023500080841E00A02526000000608BF033FF2E35 | |
| 567 | −:10236000A150232E8B165223BB3223F74638800010 | |
| 568 | −:10237000740C2EA154232E8B165623BB3C23B90577 | |
| 569 | −:10238000002E3B31730A4747E2F7B8FFFFEB1D9081 | |
| 570 | −:10239000D1EF2E8A8D46232AEDD1EAD1D8E2FAF781 | |
| 571 | −:1023A000F6050200C1E8022E8AA54B232EA358236E | |
| 572 | −:1023B000612EA15823C3080020008000000260099C | |
| 573 | −:1023C0000800200080000002000800000100020058 | |
| 574 | −:1023D0000300040052565785C074053D0109760379 | |
| 575 | −:1023E000B80109BF5B01F7463880007403BFB20132 | |
| 576 | −:1023F00033F62E3B84B62376044646EBF5F7E72EFC | |
| 577 | −:102400008BBCC02303C783D200D1E7F7F72E8AA481 | |
| 578 | −:10241000CA235F5E5AC3E43E80BEC30003750CF757 | |
| 579 | −:10242000467A200074050C80E63EC3247FE63EC356 | |
| 580 | −:1024300024038886C3008AE0E41024FC0AC4E61062 | |
| 581 | −:10244000808EA10042E8CEFFC390568BF083E60752 | |
| 582 | −:10245000D1E62EFFA458249068246C2470247424A0 | |
| 583 | −:102460007824872487248724B400EB0EB4C0EB0AB9 | |
| 584 | −:10247000B440EB06B420EB02B4A0E410241F0AC45D | |
| 585 | −:10248000E610808EA100425EC3903C0277128AE083 | |
| 586 | −:10249000E41024F3C0E4020AC4E610808EA10042D6 | |
| 587 | −:1024A000C3908B5E3884C0741F3C02742083CB08B9 | |
| 588 | −:1024B0008B462E3B463C770CE888FC7207B024E63E | |
| 589 | −:1024C0000A83CB10895E38C383E3F7EBF7F7C310B9 | |
| 590 | −:1024D0000074F5E86DFC72EC8A86C000E638B02323 | |
| 591 | −:1024E000E60AEBE08B5E388B462E3B463CE4D87721 | |
| 592 | −:1024F0000B24FE80CB12E6D8895E38C30C0180CB5A | |
| 593 | −:1025000002EBF35033DBC1E804250F0F8AD82E8A83 | |
| 594 | −:102510008766178ADC2E8AA7661709463E58C3507D | |
| 595 | −:1025200033DBC1E804250F0F8AD82E8A8766178A05 | |
| 596 | −:10253000DC2E8AA76617F7D021463E58C38B463E4D | |
| 597 | −:1025400033DB8AD80ADC2E8A877617E62C8AE0E409 | |
| 598 | −:102550002A240F0AC4E62A8A86A50084E4750DA8F9 | |
| 599 | −:10256000807411247F8886A500E60CC3A8807504BA | |
| 600 | −:102570000C80EBF1C31E6033C933D233F68ED98D94 | |
| 601 | −:10258000BEFD00578B0584C074168BD1428BFE4F65 | |
| 602 | −:10259000780938A3E40074084F79F788A2E400466C | |
| 603 | −:1025A0005F83C7094183F91072D989B6860089967D | |
| 604 | −:1025B0008400611FC353C7466600008B4664A94070 | |
| 605 | −:1025C00000740DB300A980007402B37F889EC1001F | |
| 606 | −:1025D00032DBA90200740380CB40A9004074038061 | |
| 607 | −:1025E000CB02A90080740380CB01A9301E74038044 | |
| 608 | −:1025F000CBBCA90020740380CB08A904017403801C | |
| 609 | −:10260000CB10A90800740380CB20889EC2005BC356 | |
| 610 | −:102610000651575016078DBEC400B91F0033C0AA1B | |
| 611 | −:1026200040E2FC8B86920089868E00898690005855 | |
| 612 | −:102630005F5907C3E4D8C0E80453250F008BD82E98 | |
| 613 | −:102640008A8766178886A9005AC30886AC00C686A2 | |
| 614 | −:10265000BA0001B00EE8EAE9C3AD36A3B413AD3653 | |
| 615 | −:10266000A3B613AD36A3B81383E90636F706B6133F | |
| 616 | −:102670000F00C38A4626F74648800074020C108873 | |
| 617 | −:1026800086BD0032C0837E1A00750E8B5E4043808B | |
| 618 | −:10269000E3FE3B5E0875020C01837E3A00750D1E59 | |
| 619 | −:1026A000C55E148B1F1F85DB75020C02F7463810C0 | |
| 620 | −:1026B0000074020C048B5E7AF7C3020074020C08EB | |
| 621 | −:1026C000F7C3040074020C10F7C3080074020C2056 | |
| 622 | −:1026D000F7C3400074020C408886BF00C3906A00B4 | |
| 623 | −:1026E0001FC60693120D9C0EE8F1EB90B002E6DADD | |
| 624 | −:1026F000F8C333C0E6DAF8C3B001E6D8F8C333C094 | |
| 625 | −:10270000E6D8F8C3B0FFE84EFAE8A1FAF8C3AC493E | |
| 626 | −:10271000E8AFFBF8C390AC49E815FDF8C390AC49AD | |
| 627 | −:10272000E867FDF8C390AC49E81FFDF8C390AC49D9 | |
| 628 | −:10273000E634F8C3AC49E636F8C3AC493C02771F2F | |
| 629 | −:1027400084C0751DE41424EFE614E412243FE6125D | |
| 630 | −:10275000E416A8047409E8EAF97204B018E60AF865 | |
| 631 | −:10276000C38AE0E4140C10E614E4120CC0F6C401B1 | |
| 632 | −:102770007402247FE612F8C3AC49E825FDF8C39043 | |
| 633 | −:10278000B80040E87DFDE8B4FDE8A8FEB001E8B976 | |
| 634 | −:10279000FEF8C390B80040E885FDE8A0FDF8C390BE | |
| 635 | −:1027A000B80010E85DFDE894FDE888FEB008E899FF | |
| 636 | −:1027B000FEF8C390B80010E865FDE880FDF8C3900E | |
| 637 | −:1027C000B80080E83DFDE874FDE868FEB002E879F5 | |
| 638 | −:1027D000FEF8C390B80080E845FDE860FDF8C390BE | |
| 639 | −:1027E000B80020E81DFDE854FDE848FEB004E859B3 | |
| 640 | −:1027F000FEF8C390B80020E825FDE840FDF8C3903E | |
| 641 | −:10280000AC49E84814E43C24E70AC4E63CF8C39029 | |
| 642 | −:10281000B8FC3B89467CE43C0C18E63CF8C3E41267 | |
| 643 | −:102820000C02E612F8C3E41224FDEBF6E8B5FCF85E | |
| 644 | −:10283000C390836638FDF8C3AC49A8017406834E83 | |
| 645 | −:102840007A20EB0483667ADFE8CBFBF8C3908A86B4 | |
| 646 | −:10285000A5000C0224FB8886A500E60C814E26010B | |
| 647 | −:1028600020AC4932E489466E834E48084946F9C394 | |
| 648 | −:102870008A86A5000C0224FB8886A500E60C814E02 | |
| 649 | −:10288000260120ACB40AF6E4EBD8E8FA13E43C24C1 | |
| 650 | −:10289000F80AC4E63CF8C390AD4949894664A901E9 | |
| 651 | −:1028A00000741B8BD883E3FA751AA90400740FE433 | |
| 652 | −:1028B0003E0C02E63EB83844894662F8C390E43ED6 | |
| 653 | −:1028C00024FCEBEFE43E24FCE63EE8E8FCB8AA403A | |
| 654 | −:1028D000EBE6E86EF87205B018E60AF8C390AC496A | |
| 655 | −:1028E000E8CFF9F8C390AC49E8CFF9F8C390E868AD | |
| 656 | −:1028F000FD750632C0E6DAF8C3B002E6DA36A0B4F7 | |
| 657 | −:102900001324103410E8160136A1B413A901007481 | |
| 658 | −:1029100005E8FCFEEB0EA90200740432C0EB02B025 | |
| 659 | −:1029200001E8DEFE36A1B413E8B513E43C24F80A4E | |
| 660 | −:10293000C4E63C36A1B413C1E805250100E8FAFE5F | |
| 661 | −:1029400036A0B5132410E859FB32C0368A26B513D9 | |
| 662 | −:10295000F6C4047409FEC0F6C4087402FEC0E8DBC5 | |
| 663 | −:10296000FD36A1B613250F00E857F936A1B613C1FD | |
| 664 | −:10297000E804250300E8B8FA36A1B613C1E8052536 | |
| 665 | −:102980000200E805FB36A1B613F6C401750432C097 | |
| 666 | −:10299000EB0980E402D0ECB0022AC4E8ACFA36F6C7 | |
| 667 | −:1029A00006B713407405E883FEEB03E884FE36F6B1 | |
| 668 | −:1029B00006B713207405E865FEEB03E868FEF8C36C | |
| 669 | −:1029C000E4120C01E612F8C3E41224FEEBF6E41460 | |
| 670 | −:1029D00024F00C05E614E42A24F00C06E62AF8C3D9 | |
| 671 | −:1029E000E42A24F0E62AE41424F00C07E614F8C3E1 | |
| 672 | −:1029F000AD4949E864F989868E00F8C3AD4949E8D4 | |
| 673 | −:102A000058F989869000F8C3834E2604E8A8F7F8A1 | |
| 674 | −:102A1000C390836626FBE89EF7F8C390AC4984C058 | |
| 675 | −:102A2000750DE41024EFE610808EA10042F8C3E497 | |
| 676 | −:102A3000100C10EBF190AC493C02760232C0C0E0C1 | |
| 677 | −:102A400004A82074020C0824188AE0E41224E70A7F | |
| 678 | −:102A5000C4E612808EA10044F8C3AC498886C00049 | |
| 679 | −:102A6000F8C3AC49E63AF8C3AC4984C07408E41230 | |
| 680 | −:102A70000C04E612F8C3E41224FBEBF6AC49E8D6EA | |
| 681 | −:102A8000F67303E827F7F8C3E412A802740424FDE0 | |
| 682 | −:102A9000E612B8F000E887FA816626FFF3E857F7F8 | |
| 683 | −:102AA000E89AFAF8C390B88000E857FA804E2708F1 | |
| 684 | −:102AB000E844F7E887FAF8C3B88000E861FA81666D | |
| 685 | −:102AC00026FFF7E831F7E874FAF8C390B81000E889 | |
| 686 | −:102AD00031FA804E2704E81EF7E861FAF8C3B8100F | |
| 687 | −:102AE00000E83BFA816626FFFBE80BF7E84EFAF8B0 | |
| 688 | −:102AF000C39033C0AC493C017304B001EB063C0CFD | |
| 689 | −:102B00007602B00C89461CF8C390814E2600208ABC | |
| 690 | −:102B100086A5000C0224FB8886A500E60C834E26C1 | |
| 691 | −:102B200001F8C390814E2600408A86A5000C0288D9 | |
| 692 | −:102B300086A500E60CF8C390AC4950E805F658723B | |
| 693 | −:102B400008E638B023E60AF8C3F9C390AC50ADE804 | |
| 694 | −:102B500082F85AF6C201741239869600740C89867E | |
| 695 | −:102B60009600E6F086E0E6F886E0F6C202741039D8 | |
| 696 | −:102B7000869400740A89869400E6E486E0E6EC8395 | |
| 697 | −:102B8000E903C390E4168886BC00E8E6FA33DBE488 | |
| 698 | −:102B90000CA806740380CB01A810740380CB02A894 | |
| 699 | −:102BA00080740380CB04E4128AE024180AD8E4DAA3 | |
| 700 | −:102BB000F6C4027407A840750380CB20A8027509EB | |
| 701 | −:102BC000E42AA80F740380CB40F74638020074094A | |
| 702 | −:102BD000E4D8A801750380CB80889EBE00FE86B431 | |
| 703 | −:102BE00000B00AE85CE4F8C3AC493C027441771FCA | |
| 704 | −:102BF00050E84FF558720C84C0740AB012E60A808F | |
| 705 | −:102C00004E3801F8C3B011E60A806638FEF8C38B6F | |
| 706 | −:102C1000463825FFF7894638A9000475E68A86A557 | |
| 707 | −:102C200000A81075DE0C108886A500E60CF8C3819C | |
| 708 | −:102C30004E3800088A86A500A81074C724EFEBE779 | |
| 709 | −:102C4000AD49493C0172113C0C770D508AE0E41407 | |
| 710 | −:102C500025F00F0AC4E614588AC484C07402E64200 | |
| 711 | −:102C6000F8C3E8CFF9FE86B900B00EE8D4E3F8C3A4 | |
| 712 | −:102C70003A86AF00741F8886AF008AE080C206B033 | |
| 713 | −:102C8000BFEE80EA028AC4EE8A86A80080C202EE05 | |
| 714 | −:102C900080EA068AC4C38B463E85C08A86A5007436 | |
| 715 | −:102CA00012A808750D0C088886A50080C202EE8067 | |
| 716 | −:102CB000EA02C3A80874FB24F7EBEC8B462684C019 | |
| 717 | −:102CC00074168A86A500A802740D24FD8886A500C6 | |
| 718 | −:102CD00083C202EE83EA02C38A86A500A80275F7C2 | |
| 719 | −:102CE0000C02EBE85283C20CECC0E8048886A90011 | |
| 720 | −:102CF0008B5E2680E33FF6C7047407A8087503803F | |
| 721 | −:102D0000CB40F6C7087407A802750380CB80885EA5 | |
| 722 | −:102D1000268A86A50084DB7410A802740A24FD8824 | |
| 723 | −:102D200086A50083EA0AEE5AC3A80275FA0C02EBE4 | |
| 724 | −:102D3000EE90FFFF00480030BA20C41A00180012BD | |
| 725 | −:102D4000000C0006000300028001C000600030009B | |
| 726 | −:102D50001800CD0100018000100010000E000C00D2 | |
| 727 | −:102D6000080000000000060004000300020001004B | |
| 728 | −:102D70005251563C1E7747988BF08A82C40032E449 | |
| 729 | −:102D800083FE18743D83FE19743E83FE1E772FD197 | |
| 730 | −:102D9000E62E8B8C322D3B8E94007422898E94000B | |
| 731 | −:102DA00083C2068A86A8008AE00C80EE83EA068A3F | |
| 732 | −:102DB000C1EE83C2028AC5EE83C2048AC4EE5E59A4 | |
| 733 | −:102DC0005AC38B8E8E00EBCE8B8E9000EBC8525187 | |
| 734 | −:102DD0003D05007703B805008BC8BA0200B800D0E3 | |
| 735 | −:102DE000F7F1050100D1E8595AC38B467AA820743F | |
| 736 | −:102DF0000B80BEC3000375040C01EB0224FE894660 | |
| 737 | −:102E00007AC324038886C3008AA6A8008ADC80E4EB | |
| 738 | −:102E1000FC0AC43AC3740B8886A80083C206EE83FA | |
| 739 | −:102E2000EA06E8C5FFC30008183828903C04772359 | |
| 740 | −:102E300032E48BD82E8A87262E8AA6A8008ADC80C8 | |
| 741 | −:102E4000E4C70AC43AC3740B8886A80083C206EE9E | |
| 742 | −:102E500083EA06C384C07402B0048AA6A8008ADC90 | |
| 743 | −:102E600080E4FB0AC43AC3740B8886A80083C206B8 | |
| 744 | −:102E7000EE83EA06C3908B5E3884C074343C0274DF | |
| 745 | −:102E80003B8A86AF000C04E8E6FD8B462E3B463CB1 | |
| 746 | −:102E9000771BF7C30004751581CB000483C2028A37 | |
| 747 | −:102EA00086A50024FA8886A500EE83EA02895E38AA | |
| 748 | −:102EB000C38A86AF0024FBE8B6FDEBF1F7C3100030 | |
| 749 | −:102EC00074EFEBED83C20CEC83EA0CC0E804888657 | |
| 750 | −:102ED000A900C3908A86A7000C018886A7008BDA18 | |
| 751 | −:102EE00080C208EE8BD3F8C38A86A70024FEEBEAE3 | |
| 752 | −:102EF0008A86A7000C02EBE28A86A70024FDEBDAA3 | |
| 753 | −:102F0000B0FFE852F2E897F2F8C3AC49E861FEF886 | |
| 754 | −:102F1000C390AC49E8EBFEF8C390AC49E835FFF844 | |
| 755 | −:102F2000C390AC49E805FFF8C3905283C206B0BF16 | |
| 756 | −:102F3000EE5283C202AC49EE5A8A86A800EE5AF8D5 | |
| 757 | −:102F4000C3905283C206B0BFEE5283C206EBE69036 | |
| 758 | −:102F5000AC493C02770D84C0750B8A86AF0024FD16 | |
| 759 | −:102F6000E80DFDF8C3508A86AF000C02E801FD5B56 | |
| 760 | −:102F700083C2088A86A700F6C301740C24DF888602 | |
| 761 | −:102F8000A700EE83EA08F8C30C20EBF2AC49E8E5B1 | |
| 762 | −:102F9000FEF8C390B80040E869F5E8F9FCE824FFC2 | |
| 763 | −:102FA000B001E8A5F6F8C390B80040E871F5E8E58F | |
| 764 | −:102FB000FCF8C390B80010E849F5E8D9FCE804FF34 | |
| 765 | −:102FC000B008E885F6F8C390B80010E851F5E8C5F8 | |
| 766 | −:102FD000FCF8C390B80080E829F5E8B9FCE8E4FE05 | |
| 767 | −:102FE000B002E865F6F8C390B80080E831F5E8A5CE | |
| 768 | −:102FF000FCF8C390B80020E809F5E899FCE8C4FEA5 | |
| 769 | −:10300000B004E845F6F8C390B80020E811F5E8856B | |
| 770 | −:10301000FCF8C390AC49E8340CF8C390B8FC3B8989 | |
| 771 | −:10302000467CF8C38A86AF000C80E843FCF8C39066 | |
| 772 | −:103030008A86AF00247FEBF28A86AF000C40E82F2F | |
| 773 | −:10304000FCF8C3908A86AF0024BFEBF2AC49A8011C | |
| 774 | −:103050007407834E7A20EB059083667ADFE88AFD59 | |
| 775 | −:10306000F8C383C2068A86A8000C408886A800EEB2 | |
| 776 | −:1030700083EA06AC4932E489466E834E2601834ECC | |
| 777 | −:103080004808B006E8BBDF4946F9C39083C2068A08 | |
| 778 | −:1030900086A8000C408886A800EE83EA06ACB40A35 | |
| 779 | −:1030A000F6E4EBD0E8E00BF8C390AD4949894664FB | |
| 780 | −:1030B000A9010074198BD883E3FA750AA904007476 | |
| 781 | −:1030C0000DB8E23FEB0BE8ECF4B8AA40EB03B838DC | |
| 782 | −:1030D00044894662F8C38A86AF00A802740A24FDB8 | |
| 783 | −:1030E000E88DFB0C02E888FBF8C3AC49E881FCF8EA | |
| 784 | −:1030F000C390AC49E879FCF8C390E85CF57505E845 | |
| 785 | −:10310000E6FDF8C3E8CDFD36A0B41324103410E872 | |
| 786 | −:10311000260136A1B413A901007405E8FEFEEB0EEA | |
| 787 | −:10312000A90200740432C0EB02B001E8E8FE36A147 | |
| 788 | −:10313000B413E8AB0B36A1B413C1E805250100E8D0 | |
| 789 | −:103140000CFF36A0B5132410E82BFD32C0368A26BA | |
| 790 | −:10315000B513F6C4047409FEC0F6C4087402FEC0B8 | |
| 791 | −:10316000E8EFFD36A1B613250F00E803FC36A1B643 | |
| 792 | −:1031700013C1E804250300E888FC36A1B613C1E8B2 | |
| 793 | −:1031800005250200E8CDFC36A1B613F6C40175048E | |
| 794 | −:1031900032C0EB0980E402D0ECB0022AC4E88CFC17 | |
| 795 | −:1031A00036F606B713407405E88DFEEB03E894FE8F | |
| 796 | −:1031B00036F606B713207405E869FEEB03E870FEE7 | |
| 797 | −:1031C000F8C3F8C38B4638A9040075230D040089A1 | |
| 798 | −:1031D000463883C2088B462E3B463C7314834E38D8 | |
| 799 | −:1031E000108A86A70024FE8886A700EE83EA08F8E6 | |
| 800 | −:1031F000C38A86A7000C01EBEE908B4638A9040029 | |
| 801 | −:10320000740625FBFF894638F8C3AD4949E8BEFB83 | |
| 802 | −:1032100089868E00F8C3AD4949E8B2FB89869000E3 | |
| 803 | −:10322000F8C3834E2604E892FAF8C390836626FB1F | |
| 804 | −:10323000E888FAF8C390AC4984C07507808EA30073 | |
| 805 | −:1032400004F8C380A6A300FBF8C3AC4983C2083CC2 | |
| 806 | −:1032500002760232C03C017412770B8A86A70024E2 | |
| 807 | −:10326000EF8886A700EE83EA08F8C38A86A7000CD9 | |
| 808 | −:1032700010EBEE905283C206B0BFEE5283C204AC94 | |
| 809 | −:1032800049EE5A8A86A800EE5AF8C3905283C206C5 | |
| 810 | −:10329000B0BFEE5283C208EBE690AC49F8C3AC492C | |
| 811 | −:1032A000E8B4EE7303E8F7EEF8C38A86AF00247F34 | |
| 812 | −:1032B000E8BDF9B8F000E866F2816626FFF3E8237E | |
| 813 | −:1032C000FAE8D2F9F8C3B88000E837F2804E270850 | |
| 814 | −:1032D000E811FAE8C0F9F8C3B88000E841F2816665 | |
| 815 | −:1032E00026FFF7E8FEF9E8ADF9F8C390B81000E85A | |
| 816 | −:1032F00011F2804E2704E8EBF9E89AF9F8C3B81008 | |
| 817 | −:1033000000E8FFF1816626FFFBE8D8F9F8C3AC4975 | |
| 818 | −:10331000F8C383C2068A86A8000C408886A800EEFF | |
| 819 | −:1033200083EA06F8C39083C2068A86A80024BFEB0E | |
| 820 | −:10333000EA90AC498AE080C20AEC80EA0AA82074CC | |
| 821 | −:10334000058AC4EEF8C30651578B4E24E3344989ED | |
| 822 | −:103350004E24FF461A8E46028B7E228AC4AA897E9C | |
| 823 | −:10336000228B462624FD89462675298A86A500A833 | |
| 824 | −:1033700002752180C2020C028886A500EE80EA0256 | |
| 825 | −:10338000EB12C47E003B7E1E760A4F268825897E7E | |
| 826 | −:1033900000FF461A5F5907F8C390ACAD83E9038577 | |
| 827 | −:1033A000C074053D00207205B8FFFFEB03C1E003C8 | |
| 828 | −:1033B0003B8694007426898694008BD85283C2067B | |
| 829 | −:1033C0008A86A8008AE00C80EE83EA068AC3EE8330 | |
| 830 | −:1033D000C2028AC7EE83C2048AC4EE5AF8C3B08818 | |
| 831 | −:1033E0008886BC00E88CF233DB8A86A500A80274CC | |
| 832 | −:1033F0000380CB01A805740380CB02A80874038066 | |
| 833 | −:10340000CB04F686A70010740380CB108A86A9002F | |
| 834 | −:10341000F6C304750A83C20CEC83EA0CC0E8048A84 | |
| 835 | −:10342000E08A86AF00A8807408F6C401750380CBDB | |
| 836 | −:1034300020F686A70002750AF74638040074038058 | |
| 837 | −:10344000CB40889EBE00FE86B400B00AE8F3DBF8ED | |
| 838 | −:10345000C3FE86B400B00AE8E8DBF8C3AC493C021E | |
| 839 | −:103460007437771084C07406804E3801F8C38066C4 | |
| 840 | −:1034700038FEF8C38B463825FFF7894638A9000483 | |
| 841 | −:1034800075EA8A86A500A80175E20C0583C2028848 | |
| 842 | −:1034900086A500EE83EA02F8C3814E3800088A86CA | |
| 843 | −:1034A000A500A80174C624FAEBE2AD4949F8C3901F | |
| 844 | −:1034B000E811FAFE86B900B00EE886DBF8C3B0FF6B | |
| 845 | −:1034C000E8BFECF8C39083667AFBB000E873DBF8E2 | |
| 846 | −:1034D000C390AC49E853D9721136881E1A0136A040 | |
| 847 | −:1034E0008E120AC352BA0001EE5AF8C3AC4932E454 | |
| 848 | −:1034F00036A38612050600368B1E88122BD8368915 | |
| 849 | −:103500001E8A12F8C390AD8BD8AD83E90403C32B98 | |
| 850 | −:103510004676894678F7467A0200740A83667AFD11 | |
| 851 | −:10352000B80000E81CDBF8C3061607AC49250F00FD | |
| 852 | −:103530006BC0098DBEFD0003F8AC49250F00AA85BC | |
| 853 | −:10354000C074082BC8518BC8F3A459E827F0E8448D | |
| 854 | −:103550000307F8C333C0AC4936A3B21336A3B01384 | |
| 855 | −:10356000F8C383667AEFE82C03F8C390834E7A1091 | |
| 856 | −:10357000EBF4E89BF0F8C390AD3C19770E3C19775B | |
| 857 | −:103580000A8BF881E7FF0088A6C400F8C390834E39 | |
| 858 | −:103590002620AC4932E4D1E08BD8C1E30203C389D1 | |
| 859 | −:1035A000466E834E4804B006E897DA4946F9C39060 | |
| 860 | −:1035B000FE86B300B00AE889DAF8C39033C0AC499C | |
| 861 | −:1035C0006BC00A89868A00F8C390AC4932E43D0A90 | |
| 862 | −:1035D000007705B80A00EB083D5A007203B85A009C | |
| 863 | −:1035E00051F7D80564008BC88B4644F7E1B96400F5 | |
| 864 | −:1035F000F7F189464659F8C3AC49E885EBF8C39022 | |
| 865 | −:10360000AC4984C07507816638FFFDF8C3814E3828 | |
| 866 | −:103610000002F74638400075088A86A9008886AA05 | |
| 867 | −:1036200000F8C3905156E87F0C5E59F8C390FE86AF | |
| 868 | −:10363000B600B00AE80BDAF8C390FE86B700B00A0D | |
| 869 | −:10364000E8FFD9F8C390FE86B800B00AE8F3D9F8CD | |
| 870 | −:10365000C39000905155AC2EA2523633C9AD8BF9B0 | |
| 871 | −:10366000C1E705A9010074232E8BAD4400837E08B9 | |
| 872 | −:103670000074182E803E523601740960B004E8BB15 | |
| 873 | −:103680000C61EB0760B0FBE8EC0C614747D1E875D3 | |
| 874 | −:10369000D24183F90472C65D5983E905F746384083 | |
| 875 | −:1036A000007405E887EAF8C3E88DEAF8C39036C6E7 | |
| 876 | −:1036B00006C81301F8C333C0AC4936A38012AC4925 | |
| 877 | −:1036C000362B068812F7D836A38212F8C390DE266E | |
| 878 | −:1036D000DE26EC26F226F826FE2604270E271627DD | |
| 879 | −:1036E0001E2726272E273427BE34C634D2343A2745 | |
| 880 | −:1036F000782780279427A027B427C027D427E0273E | |
| 881 | −:10370000F42700281028EC34DE261E2826282C2832 | |
| 882 | −:10371000322838284E288A28063528359828BE2889 | |
| 883 | −:10372000D228DE28E628543562356C35EE28C029CB | |
| 884 | −:10373000C829CE29E02972357835F029FC298E3543 | |
| 885 | −:10374000082A122A1C2AB035362ABC355A2A622A7F | |
| 886 | −:10375000682ACA357C2AF835882AA62AB82ACC2AAB | |
| 887 | −:10376000DE2AF22A00360A2B242B2436382B4C2B47 | |
| 888 | −:10377000842B2E363A3646365436E82BAE36402C5D | |
| 889 | −:10378000622CB6367028DE26DE26D42EE82EF02EE9 | |
| 890 | −:10379000F82E002F0A2F122F1A2F222F2A2F422FF6 | |
| 891 | −:1037A000BE34C634D234502F8C2F942FA82FB42F70 | |
| 892 | −:1037B000C82FD42FE82FF42F083014301C30EC34ED | |
| 893 | −:1037C000DE2624303030383044304C306230A43083 | |
| 894 | −:1037D00006352835AA30CE30D630EA30F2305435AE | |
| 895 | −:1037E00062356C35FA30C231C231C431FA317235CA | |
| 896 | −:1037F00078350A3216328E3522322C323632B035D6 | |
| 897 | −:103800004A32BC3574328C329A32CA359E32F8351F | |
| 898 | −:10381000AA32C632D832EC32FE320E3300361233C0 | |
| 899 | −:103820002633243632339A33DE332E363A36463652 | |
| 900 | −:1038300054365C34AE36AA34B034B6368C30E32815 | |
| 901 | −:10384000F7463840007532E8E3E833C0AC493D5BE9 | |
| 902 | −:103850000077198BD8D1E32EFF97CE36720B85C92E | |
| 903 | −:1038600075E88B4648E81A0CC34E41C36A001FC670 | |
| 904 | −:103870000693120C9C0EE863DAE8BCE833C0AC494E | |
| 905 | −:103880003D5B0077E78BD8D1E32EFF97863772D95F | |
| 906 | −:1038900085C975E8C3F7467A1000750F83BE8400AA | |
| 907 | −:1038A000007408B8483A89868000C381BE8000EC65 | |
| 908 | −:1038B0003C74F783BE8800007505B8EC3CEBE7F775 | |
| 909 | −:1038C000467A080075401E608B8E88003B4E7477E8 | |
| 910 | −:1038D000333B4E78772EC47E108BDF26033D47475F | |
| 911 | −:1038E00033C08ED88DB6F4008BC1F7467A010075CF | |
| 912 | −:1038F0001DF3A4260107294678014676294674B0AF | |
| 913 | −:103900000CE83ED7611FC78688000000EBACE3E3FC | |
| 914 | −:103910005090AC247FAAE2FA58EBD8908B8E8800A6 | |
| 915 | −:10392000E3468B9E8A0085DB743EBA50FFED2B8602 | |
| 916 | −:1039300082003BC372378DB6F400C47E108BDF2645 | |
| 917 | −:10394000033D47478BC1161FF7467A01007524F3E4 | |
| 918 | −:10395000A4260107294678014676294674C7868839 | |
| 919 | −:10396000000000B00CE8DAD683667AF7C3B000E84E | |
| 920 | −:10397000D0D6C3E3DC50AC247FAAE2FA58EBD29055 | |
| 921 | −:103980001E6033C08ED88DB6FD008B8688008B9666 | |
| 922 | −:1039900084003A0475108BDE468BC88DBEF400F3AC | |
| 923 | −:1039A000A674668BF39083C6094A75E68DB6FD0052 | |
| 924 | −:1039B0008B9684003A0473108BDE468BC88DBEF460 | |
| 925 | −:1039C00000F3A674768BF39083C6094A75E68DB62C | |
| 926 | −:1039D000F400ACF7467A01007402247F1EC55E1025 | |
| 927 | −:1039E0008B37884002468937FF4E78FF4676FF4E78 | |
| 928 | −:1039F000741F8B8E880049898E8800E3438DB6F44E | |
| 929 | −:103A0000008BFE46F3A4E97DFFC576108B1C85DB99 | |
| 930 | −:103A1000740803F383C60383E6FE8B8684002BC2FF | |
| 931 | −:103A2000B48089044646C7040000897610834E7A24 | |
| 932 | −:103A300004C78688000000611FF9C333C0611FC33B | |
| 933 | −:103A4000B08084C0611FC3908B4E782B8E88007627 | |
| 934 | −:103A50002789B68C008B5E743BCB72028BCB3BC844 | |
| 935 | −:103A600072028BC88BC1E34433D28EC28BD183BE2A | |
| 936 | −:103A70008800007406E98E0033C0C38B5E10031FFC | |
| 937 | −:103A8000434352F7467A0100752AAC8DBEE4008BA1 | |
| 938 | −:103A90008E8600F2AE74348807434A75ED588B5E0B | |
| 939 | −:103AA0001001072946780146762946748BC62B8675 | |
| 940 | −:103AB0008C00C390AC8DBEE4008B8E8600F2AE7499 | |
| 941 | −:103AC0000A247F8807434A75EBEBD28886F400C747 | |
| 942 | −:103AD0008688000100582BC2740E8B5E10010729E6 | |
| 943 | −:103AE000467801467629467440E894FE72BE4A75CF | |
| 944 | −:103AF0001583BE8A000074B4BA50FFED8986820037 | |
| 945 | −:103B0000834E7A08EBA68DBEF40003BE8800A4FFA6 | |
| 946 | −:103B1000868800E86AFE729479064A748FE95BFF32 | |
| 947 | −:103B20004A74CEEBE19050E811CC8B467439467262 | |
| 948 | −:103B300074271E565133C9C5760CAD74107809032D | |
| 949 | −:103B4000C805010024FE03F03B761076ED294E7681 | |
| 950 | −:103B5000014E78E837CC595E1F58C390C47E1026BA | |
| 951 | −:103B60008B1D83C30326891D4B03FBAB91AAB803AE | |
| 952 | −:103B700000294678014676294674C390C47E1026F3 | |
| 953 | −:103B80008B1D4326891D4303FBAAFF4E78FF467613 | |
| 954 | −:103B9000FF4E74C3E8E5FFC38081848582838687F6 | |
| 955 | −:103BA00050538ADC83E30ED1EB2E8A87983B08863C | |
| 956 | −:103BB000B000FE86B100B00AE887D45B58C3508AD3 | |
| 957 | −:103BC000C8B8FF00E895FF58C3908A86BB00E8ABF1 | |
| 958 | −:103BD000FFC3E8CBFFE8F2FFC390E8C3FFE8B4FF00 | |
| 959 | −:103BE000C39033C0E895FFC3B8FF0033C9E86CFF4A | |
| 960 | −:103BF000C390B8FF01B110E862FFC390C3FC3BE281 | |
| 961 | −:103C00003BF23BF23BFC3BE23BE83BE83BFC3BE26C | |
| 962 | −:103C10003BE83BE83BFC3BE23BE23BE23B00100085 | |
| 963 | −:103C20000000100000001000000010000000100054 | |
| 964 | −:103C3000000010000000100000001000000008004C | |
| 965 | −:103C40000000080000000800000008000051538B2D | |
| 966 | −:103C50004E3881E1FFEEA804740481C900018AE0B6 | |
| 967 | −:103C600080E4032418D0E40AC433DB8AD82E8B877F | |
| 968 | −:103C7000FD3B89467C2E0B8F1D3C894E38D1EB2EA7 | |
| 969 | −:103C80008AA73D3C5B59C3AC493C01721D74203C82 | |
| 970 | −:103C900003722374283C08722B74303C20723774F2 | |
| 971 | −:103CA0003ABBDA3B32E4895E7EC3BBA03BEBF5BB9B | |
| 972 | −:103CB000943BB401EBF0BBFC3BB402EBE9BBE23B51 | |
| 973 | −:103CC000B403EBE2BBBE3BB404EBDBBBCA3BAC4989 | |
| 974 | −:103CD0008886BB00EBCEBBD23BEBF3BBFC3BEBC41B | |
| 975 | −:103CE000A9040075D1A9080075DAEBD18B5E748B3D | |
| 976 | −:103CF0004E783BCB72028BCB3BC872028BC88BC118 | |
| 977 | −:103D0000E32CC47E108BDF26033D4747F7467A013C | |
| 978 | −:103D100000751CF7C70100740249A4D1E9F3A5732B | |
| 979 | −:103D200001A4260107294678014676294674C35026 | |
| 980 | −:103D300053BB7F7FF7C70100740549AC22C3AAD1EA | |
| 981 | −:103D4000E9E31D9CAD23C3AB497414AD23C3AB4958 | |
| 982 | −:103D5000740DAD23C3AB497406AD23C3ABE2E59D3F | |
| 983 | −:103D60007304AC22C3AB5B58EBB8E8CEC98B5E38AA | |
| 984 | −:103D7000F7C310047501C3F7C340007405E8B8E346 | |
| 985 | −:103D8000EB03E8A8E3816638EFFBF6C310743CF65A | |
| 986 | −:103D9000C3027406E4D80C01E6D8F6C30474118398 | |
| 987 | −:103DA000C2088A86A7000C01EE8886A70083EA086D | |
| 988 | −:103DB000F6C308740FE88BE3720A8A86C000E638FF | |
| 989 | −:103DC000B023E60AF7C300047501C3F7C300087502 | |
| 990 | −:103DD000F98A86A500F6C340750DA81075EC0C1085 | |
| 991 | −:103DE0008886A500E60CC3A80175DF83C2020C0516 | |
| 992 | −:103DF000EE8886A500C3B000E847D2EB0FB002E81A | |
| 993 | −:103E0000900EEB08836638DF834E7A0233C08ED87B | |
| 994 | −:103E1000FAA0921240A292123C05721EC60692129D | |
| 995 | −:103E200000FBB001E86B0EFAA1260123062A01A8C7 | |
| 996 | −:103E3000017507E8E207E8610990B000E837D2FBB6 | |
| 997 | −:103E400085ED74B9FAF7467A460075C08B46783D21 | |
| 998 | −:103E50000A0072B08B4E7483F950729A836638DF11 | |
| 999 | −:103E6000C576148B463A85C07558AD85C0750FE888 | |
| 1000 | −:103E7000F8FEF7467A08007493E8A0FAEB8E3B76DA | |
| 1001 | −:103E8000047621B90200394E2E7705C7462E000070 | |
| 1002 | −:103E9000568B762C897604C7040000464689762C1A | |
| 1003 | −:103EA000294E2E5E85C07917F6C4107405FF567C26 | |
| 1004 | −:103EB000EB03FF567E897614B00CE885D1EB86893A | |
| 1005 | −:103EC000463AFF96800029463A897614B00CE8718C | |
| 1006 | −:103ED000D1E971FF0000000000000000080410029A | |
| 1007 | −:103EE00001200000000000000000000000000000B1 | |
| 1008 | −:103EF00000000000808080808080808080808080C2 | |
| 1009 | −:103F000080808080808080808080808080808080B1 | |
| 1010 | −:103F100080808080808080808080808080808080A1 | |
| 1011 | −:103F20008080808080808080808080808080808091 | |
| 1012 | −:103F30008080808080C0C0C0C0C0C0C0C0C0C0C0C1 | |
| 1013 | −:103F4000C0C0C0C0C0C0C0C0C0C0C0C0C0C0C080B1 | |
| 1014 | −:103F500080808000808080808080808080808080E1 | |
| 1015 | −:103F60008080808080808080808080808080808051 | |
| 1016 | −:103F70008080808080808080808080808080808041 | |
| 1017 | −:103F80008080808080808080808080808080808031 | |
| 1018 | −:103F90008080808080808080808080808080808021 | |
| 1019 | −:103FA0008080808080808080808080808080808011 | |
| 1020 | −:103FB0008080808080808080808080808080808001 | |
| 1021 | −:103FC00080808080808080808080808080808080F1 | |
| 1022 | −:103FD000808080804E417841D041F44106421842B1 | |
| 1023 | −:103FE000C3908E46028B7E22897E6C806627FD8B75 | |
| 1024 | −:103FF000562483FA0472E983EA028BD93BCA76021B | |
| 1025 | −:104000008BCAB00A57518BFEF2AE8BC1595F751E39 | |
| 1026 | −:1040100050402BC874062BD12BD9F3A4594B4A4AD4 | |
| 1027 | −:10402000B00DAAA43BCA76028BCAE313EBD42BD9FA | |
| 1028 | −:10403000F7C601007402A449D1E9F3A57301A4896C | |
| 1029 | −:104040007E222B7E6C297E24017E1A8BCB807E26DD | |
| 1030 | −:10405000027405806626FDC360B0FDE8180361C3E5 | |
| 1031 | −:10406000C390E87C0272F990834E26208B466A89C1 | |
| 1032 | −:10407000466E8B46480D040025BFFF894648B006B2 | |
| 1033 | −:10408000E8BFCFC3897E222B7E6C017E1A297E2455 | |
| 1034 | −:10409000807E26027405836626FDC360B0FDE8D5E8 | |
| 1035 | −:1040A0000261C3908ABEC200EB24F7464840007507 | |
| 1036 | −:1040B000B18E46028B7E22897E6C8B562483EA0A5F | |
| 1037 | −:1040C000789E03D7806627FD33C08ABEC200E3B462 | |
| 1038 | −:1040D0003BFA77B0AC49932E8A87D43E9322DF75A2 | |
| 1039 | −:1040E00017AAE3A03BFA779CAC49932E8A87D43E6B | |
| 1040 | −:1040F0009322DF7503AAEBD6F6C37F7505FF4666EC | |
| 1041 | −:10410000EBDFF6C340750C8BD883EB08D1E32EFFB1 | |
| 1042 | −:10411000A7D43FFF46662C20EBC785C0742C894688 | |
| 1043 | −:104120006A834E4840897E222B7E6C017E1A297E4E | |
| 1044 | −:1041300024807E26027408836626FDE8A301C360FE | |
| 1045 | −:10414000B0FDE8310261E89801C3E957FF908B5E4A | |
| 1046 | −:10415000664B7803895E66AA8B5E64F7C3002075A0 | |
| 1047 | −:1041600003E940FFF7C3400074088A86C100AAE94A | |
| 1048 | −:1041700032FFB83200EBA3908B5E66895E6883C322 | |
| 1049 | −:104180000880E3F8895E668B5E6481E3001881FB3A | |
| 1050 | −:104190000018742DAA85DB7425F746644000751855 | |
| 1051 | −:1041A00081FB0010740C8B46662B4668C1E004E965 | |
| 1052 | −:1041B00068FFB86400E962FF8A86C100AAAAE9E341 | |
| 1053 | −:1041C000FE518B4E662B4E68B020F3AA59E9D4FEFF | |
| 1054 | −:1041D0008B5E66895E688B5E64F7C324007410C7CB | |
| 1055 | −:1041E00046660000F7C304007405B00DAAB00AAA21 | |
| 1056 | −:1041F000EB489090AAF7466400407406B8D007E9EF | |
| 1057 | −:1042000018FFE99FFE90AAF7466400807406B8D0B4 | |
| 1058 | −:1042100007E906FFE98DFE908B5E66895E6885DBA7 | |
| 1059 | −:10422000750C8B5E64F7C310007406E976FE8B5E36 | |
| 1060 | −:1042300064F7C308007427B00AAAF7C32000751FEB | |
| 1061 | −:10424000F7C300017503E95BFEF7C340007506B8CC | |
| 1062 | −:104250006400E9C5FE8A86C100AAAAE946FEAAC78B | |
| 1063 | −:1042600046660000F7C3000674F1F7C340007419F6 | |
| 1064 | −:104270008A86C10081E3000681FB00047206760293 | |
| 1065 | −:10428000AAAAAAAAAAAAE91BFE81E3000681FB004A | |
| 1066 | −:1042900004720E7606B89600E97FFEB86400E979EC | |
| 1067 | −:1042A000FE8B4668E973FE90368B0EDA1283F93284 | |
| 1068 | −:1042B000731D1E0633C08ED88EC08D764CBFDC12A7 | |
| 1069 | −:1042C00003F9A5A5A583C106890EDA12071FC3B09D | |
| 1070 | −:1042D00008E86ECDC390836648FEE893C4E8C8FF43 | |
| 1071 | −:1042E000C3F6462702750F9CFA837E1A0074098074 | |
| 1072 | −:1042F0004E27019DF9C3F8C35052F7463840007469 | |
| 1073 | −:104300001DE834DE83C20AECA840752783EA088AD8 | |
| 1074 | −:1043100086A5000C028886A500EE5A58EBD1E80C61 | |
| 1075 | −:10432000DE8A86A50024FB0C028886A500E60C5ACE | |
| 1076 | −:1043300058EBBC804E27025A589DF8C30846269C6D | |
| 1077 | −:10434000FA8A8EA500F7463840007514F6C1067447 | |
| 1078 | −:1043500023E8D9DD8AC124F98886A500E60C9DC32F | |
| 1079 | −:10436000F6C102740FE8D0DD83C2028AC124FD8841 | |
| 1080 | −:1043700086A500EE9DC38B5E2622C3884626740167 | |
| 1081 | −:10438000C3806627FD9CFA8A8EA500F74638400058 | |
| 1082 | −:104390007516F6C104750FE893DD8AC124FD0C047F | |
| 1083 | −:1043A0008886A500E60C9DC3F6C10275F9E888DD94 | |
| 1084 | −:1043B00083C20AECA820750E83EA088AC10C028821 | |
| 1085 | −:1043C00086A500EE9DC383EA0A33C98A4E1C8B463C | |
| 1086 | −:1043D0001A3BC8731B014E2A2BC189461A1EC5768B | |
| 1087 | −:1043E00000F36E1F89760083C2028A86A500EBCD9A | |
| 1088 | −:1043F00085C0741201462A8BC81EC57600F36E1F55 | |
| 1089 | −:10440000897600894E1AF6C701752380CB02895E32 | |
| 1090 | −:1044100026E808C383C2028A86A50024FDEE8886AA | |
| 1091 | −:10442000A500F6C7107505B002E816CC9DC383C27F | |
| 1092 | −:10443000028A86A500EB86908BD18B46243BC876FA | |
| 1093 | −:10444000028BC82BD12BC18BD9E322806627FD8E2E | |
| 1094 | −:1044500046028B7E22F7C601007402A449D1E9F31B | |
| 1095 | −:10446000A57301A4897E22894624015E1A8BCA8025 | |
| 1096 | −:104470007E26027405806626FDC360B0FDE8F6FE68 | |
| 1097 | −:1044800061C350E40A84C0750A8686A10084C074A2 | |
| 1098 | −:104490000AE60A580C20894648F9C35824DF8946A1 | |
| 1099 | −:1044A00048F8C390FBB002E8E807FAE82E01FBB039 | |
| 1100 | −:1044B00001E8DE07FAB002E8BCCBFB85ED74E5FA53 | |
| 1101 | −:1044C0008E5E0AFB90FA8B46488B7640A88C75DE90 | |
| 1102 | −:1044D000A820741A50E855DC58E8A6FF7310B00203 | |
| 1103 | −:1044E000E85FCBEBC99025FF008BC8EB3690A801A5 | |
| 1104 | −:1044F00075224683E6FE3B76087479AD8AFCB3F0FC | |
| 1105 | −:1045000022FB3AFB74E03ABEA000742EE8D2FD73A1 | |
| 1106 | −:1045100077EB9B908AE024FC8846488B4E4AF6C491 | |
| 1107 | −:1045200002741DE8BBFD7286E813F3897640E393BD | |
| 1108 | −:10453000834E4803894E4AE974FF25FF0F8BC890CC | |
| 1109 | −:104540008B86980085C0741A518A8EA000C0E90439 | |
| 1110 | −:10455000BA0100D3E25923C2740803F1897640E915 | |
| 1111 | −:1045600061FFFF5662E3F5834E4801894E4A897622 | |
| 1112 | −:1045700040E93AFF814E2600108B46503B46467775 | |
| 1113 | −:1045800003E852FDE927FF9088BEA000EBAC0A06C5 | |
| 1114 | −:1045900090128AE0BA0601B004EEEC84C07512B045 | |
| 1115 | −:1045A00004EE8AC4EE32E4A8807406C706841200C2 | |
| 1116 | −:1045B0000088269012C30A0690128AE0BA0601EC1F | |
| 1117 | −:1045C000A80175EDBA08018AC4EE32E4A88074E14E | |
| 1118 | −:1045D000C7068412000088269012C39036F706247E | |
| 1119 | −:1045E0000101007530368B0EDA1280F936732633EE | |
| 1120 | −:1045F000C08EC08ED8BFDC1203F9B008E877CA8538 | |
| 1121 | −:10460000ED740E8D764CA5A5A580C10680F9367295 | |
| 1122 | −:10461000E9890EDA12C3C390F7062601010075F688 | |
| 1123 | −:104620008B0E201385C975EE33C08EC08ED8BF2483 | |
| 1124 | −:1046300013B93600B00AE83DCA85ED7506E91201E6 | |
| 1125 | −:10464000E90A0133DB8A464C8AA6B300FECC780E19 | |
| 1126 | −:1046500088A6B3000ADCB40AAB83E90276E28AA634 | |
| 1127 | −:10466000B200FECC780E88A6B2000ADCB408AB8398 | |
| 1128 | −:10467000E90276CC8AA6B100FECC78188ABEB000DA | |
| 1129 | −:10468000750488A6B00088A6B1000ADC8AE7AB836F | |
| 1130 | −:10469000E90276AC8AA6B400FECC781F88A6B400E6 | |
| 1131 | −:1046A0000ADCB40BAB8A86BC008AA6BD00AB8B8645 | |
| 1132 | −:1046B000BE00AB83E90676888A464C8AA6B600FE21 | |
| 1133 | −:1046C000CC781988A6B6000ADCB40CABE8DBCBAB1F | |
| 1134 | −:1046D0008B462AAB83E90676748A464C8AA6B700D5 | |
| 1135 | −:1046E000FECC781988A6B7000ADCB40DABE8BACBCB | |
| 1136 | −:1046F000AB8B4634AB83E90676538A464C8AA6B820 | |
| 1137 | −:1047000000FECC781988A6B8000ADCB40EABA15024 | |
| 1138 | −:1047100012ABA15212AB83E90676328A464C8AA6C6 | |
| 1139 | −:10472000B500FECC781888A6B5000ADCB40FAB8BB8 | |
| 1140 | −:10473000869A00AB8B869C00AB83E906760F84DB00 | |
| 1141 | −:104740007503E9EFFEB00AE8F8C8E9E7FEB00AE849 | |
| 1142 | −:10475000F0C8F7D983C1368BC10D800086C4A3226F | |
| 1143 | −:10476000134141890E2013C3A184122BC17211A3DE | |
| 1144 | −:104770008412BE2213D1E9F36F90890E2013F8C37F | |
| 1145 | −:10478000F9C3C381EF6A1374F98BC70D800086C427 | |
| 1146 | −:10479000A368134747893E6613C3F7062A01010041 | |
| 1147 | −:1047A00075E08B0E6613E30780F92077D54949330E | |
| 1148 | −:1047B000C08EC08ED8BF6A138BF703F983C6343B13 | |
| 1149 | −:1047C000FE77C0B00EE8AEC885ED74B78A464C8A55 | |
| 1150 | −:1047D000B6B900FECE781588B6B9008AA6A90080C1 | |
| 1151 | −:1047E000CCC0AB84F67405B00EE856C88AB6BA00E1 | |
| 1152 | −:1047F000FECE78CB8A9EA9008ABEAB008A563F8A3D | |
| 1153 | −:10480000F332F70AB6AC00C686AC000022F2744B55 | |
| 1154 | −:10481000F6C608740FB402F6C3087502B403AB8081 | |
| 1155 | −:10482000E6F77437F6C601740FB400F6C3017502DB | |
| 1156 | −:10483000B401AB80E6FE7423F6C602740FB404F62E | |
| 1157 | −:10484000C3027502B405AB80E6FD740FF6C60474AE | |
| 1158 | −:104850000AB406F6C3047502B407ABC686BA0000F4 | |
| 1159 | −:10486000889EAB00E958FF90A184122BC17211A35E | |
| 1160 | −:104870008412BE6813D1E9F36F90890E6613F8C3F2 | |
| 1161 | −:10488000F9C3A1841241412BC17223A384128BC1AD | |
| 1162 | −:10489000484832E40C8086C4EF9090909090BEDC43 | |
| 1163 | −:1048A000124949D1E9F36F90890EDA12F8C3F9C3BE | |
| 1164 | −:1048B0008AC88A464CB40183EB06EF9090909090A2 | |
| 1165 | −:1048C000B80100EF90909090908AC1EF90909090F6 | |
| 1166 | −:1048D00090E99700E9AC0033C08ED8891E8412C3DA | |
| 1167 | −:1048E000368B1E8412FB90FAB00CE889C785ED74F4 | |
| 1168 | −:1048F000E6C5760C83FB1472DBFB90FAAD85C078BD | |
| 1169 | −:10490000AF74E28BFE03F8368B0E86123BC1770242 | |
| 1170 | −:104910008BC883EB043BD977028BCB33C08A464CE0 | |
| 1171 | −:10492000EF90909090908BC1EF90909090904180FC | |
| 1172 | −:10493000E1FE2BD951D1E9F36F90598BC74024FE8A | |
| 1173 | −:104940003BC674272BFE4E4E538B5E103BF3721307 | |
| 1174 | −:10495000031F83C30380E3FEC7070000836E740256 | |
| 1175 | −:10496000895E105B893C89760CEB8989760C3976F7 | |
| 1176 | −:104970001077817208833C007403E977FFE80DBE6D | |
| 1177 | −:10498000E962FF36891E8412B00CE8B5C633C08ECA | |
| 1178 | −:10499000D8C3A184123D10007277BA04013B068887 | |
| 1179 | −:1049A000127506C7067E1200008B0EDA12E30BE8C2 | |
| 1180 | −:1049B000D0FE7257C7067E12FF7F8B0E2013E30BCB | |
| 1181 | −:1049C000E8A5FD7246C7067E12FF7F8B0E6613E3D5 | |
| 1182 | −:1049D0000BE894FE7235C7067E12FF7FA12801A95D | |
| 1183 | −:1049E00001007503E8F9FE803E8D1200751DA1845B | |
| 1184 | −:1049F000123D200076153B0682127609A17E123BFD | |
| 1185 | −:104A0000068012720C800E901280C3B080FF167C5C | |
| 1186 | −:104A100012C3800E901240C36A001FC6069312177D | |
| 1187 | −:104A20009C0EE8B7C86A001FC6069312209C0EE8C9 | |
| 1188 | −:104A3000AAC86A001FC6069312169C0EE89DC8906D | |
| 1189 | −:104A4000BA0601ECA82075CAFB90FABA0401ED90F1 | |
| 1190 | −:104A5000909090903A06941277BE33DB8AD8D1E3D7 | |
| 1191 | −:104A60002E8BAF4400C47E0885FF74B9F6C4C075B0 | |
| 1192 | −:104A70005532C0C1E00280E4F08BF0ED9090909050 | |
| 1193 | −:104A80009085C074BB8BC84180E1FE0BC68B5E5025 | |
| 1194 | −:104A90004B4B2BD9789CAB8BC1404001464ED1E9A2 | |
| 1195 | −:104AA000F36D90895E50897E088B462680E4EF89FD | |
| 1196 | −:104AB0004626F6C401750CF746480C007505B00291 | |
| 1197 | −:104AC000E87FC5E97AFF86C48BC883E13F4180E176 | |
| 1198 | −:104AD000FEE30A3C807209243FB4F0EBB0E960FFCA | |
| 1199 | −:104AE000253F0033FF8EC7BF96128BF7D1E9F36DD8 | |
| 1200 | −:104AF000908BC8E848EDE947FF906A001FC606930F | |
| 1201 | −:104B0000121B9C0EE8D5C790601E0633C08ED88E4F | |
| 1202 | −:104B1000C0BA0601ECA80474E1B006EEECA28C1257 | |
| 1203 | −:104B2000A8407411A18812A38412C6068D1200E851 | |
| 1204 | −:104B300060FEA08C12A8807403E804FFB80080BA5D | |
| 1205 | −:104B400022FFEF071F61CF906A001FC60693121B5A | |
| 1206 | −:104B50009C0EE887C790601E0633C08ED88EC0BA00 | |
| 1207 | −:104B60000601ECA80474E1BA0801ECA28C12A8407A | |
| 1208 | −:104B70007411A18812A38412C6068D1200E812FED9 | |
| 1209 | −:104B8000A08C12A8807403E8B6FEB80080BA22FF99 | |
| 1210 | −:104B9000EF071F61CF90EE86E0EE86E0EC86E0EC5A | |
| 1211 | −:104BA00086E080E1FEF36C9080E1FEF36E900500FC | |
| 1212 | −:104BB0007547A84B05007548A84B0500A348A84BAE | |
| 1213 | −:104BC00005003549A84B06009848964B0600BA48A0 | |
| 1214 | −:104BD000964B0600C348964B0600CB48964B060002 | |
| 1215 | −:104BE0002049964B06002849964B06004E4A9C4B9E | |
| 1216 | −:104BF00006007B4A9C4B05009E4AA24B0500EC4AEE | |
| 1217 | −:104C0000A24B00001E06833E4412007409A0060158 | |
| 1218 | −:104C100024303C30741A8CC88ED88EC0BBAE4B8BFF | |
| 1219 | −:104C20000FE30D8B7F028B7704F3A483C306EBEFB6 | |
| 1220 | −:104C3000071FC39033C0A33E01B90C01BE40018BD6 | |
| 1221 | −:104C4000FE81C6B40F89048BC62BF13BC777F6A350 | |
| 1222 | −:104C50003C01C3901E0660368B2E3E018B5E003BEE | |
| 1223 | −:104C6000EB742B8B7602891C89770236A13C018973 | |
| 1224 | −:104C7000460036892E3C018BEBFF4E0674088B6E86 | |
| 1225 | −:104C800000FF4E0675F836892E3E018B66046107DB | |
| 1226 | −:104C90001FC31E0660368B2E3E0198894606896624 | |
| 1227 | −:104CA000043B6E0074108B6E00FF4E0675F836895B | |
| 1228 | −:104CB0002E3E018B660461071FC3C3901E06609CD5 | |
| 1229 | −:104CC000FA33ED8EDD8B2E3C0185ED743D8B4E006D | |
| 1230 | −:104CD000890E3C018BCC8DA60A01561E06608966A2 | |
| 1231 | −:104CE00004C746080F1AC7460601008B1E3E018501 | |
| 1232 | −:104CF000DB741D8BC58707894600895E028BD889C6 | |
| 1233 | −:104D00006F028BE19D61071FF8C39D61071FF9C307 | |
| 1234 | −:104D1000892E3E01896E00896E0287E19D8BE1EB51 | |
| 1235 | −:104D2000E4000D0A5465726D696E616C73207375D1 | |
| 1236 | −:104D300070706F727465643A0D0A312920414E53C8 | |
| 1237 | −:104D40004920636F6D70617469626C650D0A322968 | |
| 1238 | −:104D500020577973652033300D0A506C6561736597 | |
| 1239 | −:104D60002073656C6563743A20000D0A636F646597 | |
| 1240 | −:104D7000207365676D656E743D000D0A4D6F6E6939 | |
| 1241 | −:104D8000746F722076322E350A0D0A3E000D0A50DD | |
| 1242 | −:104D90006172646F6E3F000D0A4E6F206164647231 | |
| 1243 | −:104DA00065737320737065636966696564000D0AD5 | |
| 1244 | −:104DB0003A000D0A004C6F633D000D0A4641544114 | |
| 1245 | −:104DC0004C204552524F523D000D0A4D6F6E697492 | |
| 1246 | −:104DD0006F7220636F6D6D616E64733A2D0D0A20E2 | |
| 1247 | −:104DE0002020442C645B5B787878783A5D7878781A | |
| 1248 | −:104DF000785D202D2064756D70206D656D6F727902 | |
| 1249 | −:104E00000D0A2020204C2C6C5B5B787878783A5D1A | |
| 1250 | −:104E1000787878785D202D2064756D702073696EC8 | |
| 1251 | −:104E2000676C65206C696E650D0A202020452C6535 | |
| 1252 | −:104E30005B5B787878783A5D787878785D202D209B | |
| 1253 | −:104E400065646974206D656D6F72790D0A2020208C | |
| 1254 | −:104E5000462C665B5B78787878205D787878785D2A | |
| 1255 | −:104E6000202D2066696C6C206D656D6F72792070E5 | |
| 1256 | −:104E70006172616772617068730D0A202020495B5E | |
| 1257 | −:104E8000787878785D202020202020202020202D78 | |
| 1258 | −:104E900020776F726420696E7075742066726F6D12 | |
| 1259 | −:104EA00020706F72740D0A202020695B7878787802 | |
| 1260 | −:104EB0005D202020202020202020202D20627974B9 | |
| 1261 | −:104EC0006520696E7075742066726F6D20706F72E8 | |
| 1262 | −:104ED000740D0A2020204F78787878207878202068 | |
| 1263 | −:104EE000202020202020202D206F757470757420C4 | |
| 1264 | −:104EF000776F726420746F20706F72740D0A2020B7 | |
| 1265 | −:104F0000206F787878782078782020202020202042 | |
| 1266 | −:104F100020202D206F75747075742062797465205F | |
| 1267 | −:104F2000746F20706F72740D0A202020475B5B78CD | |
| 1268 | −:104F30007878783A5D787878785D2020202D206721 | |
| 1269 | −:104F40006F746F20616464726573730D0A20202092 | |
| 1270 | −:104F5000575B5B787878783A5D787878785D202050 | |
| 1271 | −:104F6000202D207761746368206120776F72640D53 | |
| 1272 | −:104F70000A20202043202020202020202020202024 | |
| 1273 | −:104F800020202020202D20696E7465727275707447 | |
| 1274 | −:104F900073206F66660D0A202020532020202020D9 | |
| 1275 | −:104FA00020202020202020202020202D20696E7409 | |
| 1276 | −:104FB00065727275707473206F6E0D0A20202073F5 | |
| 1277 | −:104FC00020202020202020202020202020202020E1 | |
| 1278 | −:104FD0002D2073696E676C6520737465700D0A20EF | |
| 1279 | −:104FE000202042787878782020202020202020203F | |
| 1280 | −:104FF0002020202D20627265616B706F696E7420B5 | |
| 1281 | −:105000007365740D0A20202062202020202020209B | |
| 1282 | −:105010002020202020202020202D20627265616B1E | |
| 1283 | −:10502000706F696E7420636C6561720D0A202020B8 | |
| 1284 | −:10503000522020202020202020202020202020203E | |
| 1285 | −:10504000202D207265737461727420627265616BC9 | |
| 1286 | −:10505000706F696E740D0A2020207220202020209D | |
| 1287 | −:1050600020202020202020202020202D2072656755 | |
| 1288 | −:105070006973746572732061742062726B70740D51 | |
| 1289 | −:105080000A202020582C78206E202020202020204C | |
| 1290 | −:1050900020202020202D206578616D696E652063B9 | |
| 1291 | −:1050A00068616E6E656C206E0D0A202020482C3FD2 | |
| 1292 | −:1050B00020202020202020202020202020202D20E3 | |
| 1293 | −:1050C00074686973206D657373616765001B5B327B | |
| 1294 | −:1050D0004A1B5B313B3148414E5349205465726D48 | |
| 1295 | −:1050E000696E616C0D0A0A001B5B4B001B5B4A007A | |
| 1296 | −:1050F0001B5B324A1B5B313B3148001B5B44201B6E | |
| 1297 | −:105100005B44001B5B313B373248001B5B003B00BC | |
| 1298 | −:1051100048001B5B73001B5B75001B7A2B0B7F1B0E | |
| 1299 | −:105120007A2E0C7F1B7A2D087F1B7A2C0A7F1B7A24 | |
| 1300 | −:1051300022087F1A57797365203330205465726DC9 | |
| 1301 | −:10514000696E616C0D0A001B54001B59001A001E89 | |
| 1302 | −:105150000008200800001B3D0000001B46000D0059 | |
| 1303 | −:105160003F4464456546664767486849694F6F43F1 | |
| 1304 | −:1051700063537342625272577758784C6C3C60D4D8 | |
| 1305 | −:1051800057D45750585058D659D659B459B4593C99 | |
| 1306 | −:10519000603C606C57485726570657905790579871 | |
| 1307 | −:1051A00057485F0C5F585F335F405FA057A057FEC2 | |
| 1308 | −:1051B00059FE59DC57DC5788619861C061CC61D8D1 | |
| 1309 | −:1051C00061F66102622262F8564A625862605920B2 | |
| 1310 | −:1051D00020666C6167733D00202061783D002020CF | |
| 1311 | −:1051E00062783D00202063783D00202064783D00F7 | |
| 1312 | −:1051F000202063733D00202064733D0020206573F0 | |
| 1313 | −:105200003D00202073733D00202064693D00202074 | |
| 1314 | −:1052100073693D00202062703D00202073703D00C6 | |
| 1315 | −:10522000202069703D00206368616E656C3D002040 | |
| 1316 | −:105230002020207365673D002074695F7374723DA0 | |
| 1317 | −:10524000002074695F746F733D002074695F6D6145 | |
| 1318 | −:10525000783D002074695F6261733D002074695F6E | |
| 1319 | −:1052600073697A3D002074695F7374663D00207431 | |
| 1320 | −:10527000695F726F6F3D002074695F666C673D0007 | |
| 1321 | −:105280002074695F746F743D002072695F70636E93 | |
| 1322 | −:105290003D002072695F7374723D002072695F7314 | |
| 1323 | −:1052A00074663D002072695F726F6F3D0020726905 | |
| 1324 | −:1052B0005F6261733D002072695F73697A3D00200F | |
| 1325 | −:1052C00072695F746F743D002072695F6D696E3D35 | |
| 1326 | −:1052D000002072695F666C673D002072695F746FC1 | |
| 1327 | −:1052E000733D002072695F7468723D002074685FCE | |
| 1328 | −:1052F0007374663D002074685F7374723D0020749F | |
| 1329 | −:10530000685F6261733D002074685F73697A3D0075 | |
| 1330 | −:105310002074685F7472673D002074685F666C6714 | |
| 1331 | −:105320003D002074685F636E743D002072685F7397 | |
| 1332 | −:1053300074723D002072685F7374663D002072686D | |
| 1333 | −:105340005F6261733D002072685F73697A3D00207F | |
| 1334 | −:1053500072685F7370613D002072685F61736F3DBA | |
| 1335 | −:10536000002072685F726F6F3D002072685F666C2C | |
| 1336 | −:10537000673D00206D5F636172653D002070745F62 | |
| 1337 | −:10538000666C6F3D002061735F666C6F3D0020723C | |
| 1338 | −:105390006D5F666C6F3D00202020715F696E3D007F | |
| 1339 | −:1053A0002020715F6F75743D0020715F6472616EC3 | |
| 1340 | −:1053B0003D002020715F74696D3D00202020715FE9 | |
| 1341 | −:1053C00066633D0020715F737461743D0020715FFE | |
| 1342 | −:1053D000646174613D0020715F6D6F646D3D0020FC | |
| 1343 | −:1053E00068616E645F6F3D002068616E645F623D5E | |
| 1344 | −:1053F000002068616E645F653D002068616E645FD7 | |
| 1345 | −:10540000693D0020206F706F73743D002020746927 | |
| 1346 | −:105410006D656F3D0020637573746D313D002063D1 | |
| 1347 | −:105420007573746D323D0020637573746D643D0057 | |
| 1348 | −:10543000207478726174653D0020727872617465C1 | |
| 1349 | −:105440003D002020635F6D61703D0020635F6164FB | |
| 1350 | −:1054500064723D0020635F616973723D0020635F89 | |
| 1351 | −:10546000787461673D0020635F646566723D00206B | |
| 1352 | −:10547000635F666C73683D002074786D6178733D7E | |
| 1353 | −:10548000002072695F656D733D002020635F6C735F | |
| 1354 | −:10549000723D002020635F6965723D002020635FDC | |
| 1355 | −:1054A0006663723D002020635F6D63723D002020C3 | |
| 1356 | −:1054B000635F6C63723D002020635F6473733D0023 | |
| 1357 | −:1054C00020635F647373693D0020635F647373726C | |
| 1358 | −:1054D0003D002020635F6973723D002020635F639D | |
| 1359 | −:1054E00061723D002020635F6566723D0020635F4E | |
| 1360 | −:1054F000657273743D0020635F65636E743D0020C8 | |
| 1361 | −:10550000635F62726B633D0020635F626F6B633D3C | |
| 1362 | −:105510000020635F7265706C3D0020635F6363739E | |
| 1363 | −:10552000723D0020635F737474313D0020635F73CC | |
| 1364 | −:105530007474323D002BC08ED88EC0E8C200E8E5FE | |
| 1365 | −:1055400000FABF8400C705DC568C4D02BF0C00C7B3 | |
| 1366 | −:10555000056E5E8C4D02BF0400C705BA5E8C4D021D | |
| 1367 | −:10556000E8F10090E84901E81600F490E8E500BE93 | |
| 1368 | −:10557000BA4DE8090CA09312E85D0CE8C209EBE40F | |
| 1369 | −:10558000E8D50CE8C40C0AC074F68B1EF8793C0D03 | |
| 1370 | −:10559000742E3C0874173C7F741383FB207FE188D2 | |
| 1371 | −:1055A00087D67943891EF879E8770CEBD30BDB7447 | |
| 1372 | −:1055B000CF4B891EF8798B36167AE8C10BEBC19078 | |
| 1373 | −:1055C000E80200EBBBC687D679000BDB741EA0D6C1 | |
| 1374 | −:1055D00079BF6051B91D008BD9060E07F2AE077571 | |
| 1375 | −:1055E00017412BD9D1E32EFF977D519033C0A3F8FB | |
| 1376 | −:1055F00079BE894DE8870BC3BE8D4DE8800BEBEC7F | |
| 1377 | −:10560000BA0002B093EEB055EEBA1002B093EEB00D | |
| 1378 | −:10561000AAEEBA0002EC3C557508BA1002EC3CAA9E | |
| 1379 | −:105620007403E82FF6C3BA0402B01AEEB020EEB04D | |
| 1380 | −:1056300030EEB040EEB080EEBA0002B013EEB0072C | |
| 1381 | −:10564000EEBA0802B080EEBA0202B0BBEEBA0402B3 | |
| 1382 | −:10565000B005EEC3C606CA1301C706F8790000C636 | |
| 1383 | −:1056600006F67901C706D0790000C706D279000096 | |
| 1384 | −:10567000C706D4790000C706FA790000C706FC798E | |
| 1385 | −:105680000000C706FE790000C706007A0000C706C2 | |
| 1386 | −:10569000027ACE598C0E047AC706067A0000C70635 | |
| 1387 | −:1056A000277A0000C606297A00C6062A7A00C39027 | |
| 1388 | −:1056B000BE224DE8C80AE83F002C313C0177F7E8EC | |
| 1389 | −:1056C00081098B360C7AE8B50ABE6A4DE8AF0A0E3E | |
| 1390 | −:1056D00058E8F80ABE7A4DE8A40AC39060D1E38383 | |
| 1391 | −:1056E000FB1873111EBA00008EDA2EFF97B7518B8C | |
| 1392 | −:1056F000EC8946101F61CF90E84F0B0AC07505E892 | |
| 1393 | −:10570000560BEBF4C390833EF879017416BED7793B | |
| 1394 | −:10571000E8310A8BD0AC3C2C74043C207505E8239E | |
| 1395 | −:105720000AEEC3E9D2FE833EF8790174F6BED7795A | |
| 1396 | −:10573000E8110A8BD0AC3C2C74083C207404E9B707 | |
| 1397 | −:10574000FE90E8FF09EFC3908B16067A833EF87946 | |
| 1398 | −:1057500001740BBED779E8EB098BD0A3067AB02091 | |
| 1399 | −:10576000E8570B8B16067AECE86F0BC38B16067A9C | |
| 1400 | −:10577000833EF87901740BBED779E8C7098BD0A3B3 | |
| 1401 | −:10578000067AB020E8330B8B16067AEDE8670BC378 | |
| 1402 | −:10579000FAC606F67900C390C606F67901FBC390F7 | |
| 1403 | −:1057A00006E85809B020E8110B268B05E8470BB036 | |
| 1404 | −:1057B00008E8060BE8030BE8000BE8FD0AB8010057 | |
| 1405 | −:1057C000E8CFF4BA0202EC24017502EBDCBA06025F | |
| 1406 | −:1057D000EC07C390C706087A1000EB06C706087AE4 | |
| 1407 | −:1057E0000100068E06FC798B3EFA79E80E09E80B7B | |
| 1408 | −:1057F00000893EFA798C06FC7907C390BEB24DE869 | |
| 1409 | −:105800007C098B16087A52E82A09E80F0AE80C0A84 | |
| 1410 | −:1058100033DBB9100090268A01E8BC09E8FD094392 | |
| 1411 | −:10582000E2F4E8F709E8F40933DBB9100090268ABE | |
| 1412 | −:10583000013C2072053C7E760390B02EE8E30943DC | |
| 1413 | −:10584000E2ECBEB24DE8360983C7105A4A75B7C3B9 | |
| 1414 | −:10585000068E06007A8B3EFE79E8A008893EFE7926 | |
| 1415 | −:105860008C06007A578B360E7AE81209C706087A3A | |
| 1416 | −:105870001000BA0002E8E800E881FF5FBA0000E823 | |
| 1417 | −:10588000DE00BEB54DE8F6088CC0E83F09B03AE846 | |
| 1418 | −:1058900090098BC7E83509E87E08E8C30090E8B7AF | |
| 1419 | −:1058A00009E8A6090AC074F63C0B750683EF10EBF5 | |
| 1420 | −:1058B00019903C0A750683C710EB0F903C0C7504D9 | |
| 1421 | −:1058C00047EB07903C0875244F908B36FE798BC7C9 | |
| 1422 | −:1058D0002BC63D000172A53D1001720483EE20909D | |
| 1423 | −:1058E00083C6108936FE79578BFEEB803C2E7508F7 | |
| 1424 | −:1058F000BA0113E86A0007C3C6060A7A0232C990E1 | |
| 1425 | −:105900003C30724C3C39760C245F3C4172423C4640 | |
| 1426 | −:10591000773E2C072C3050E8CC085802C8FE0E0AFF | |
| 1427 | −:105920007A740FC0E104E82F09E81E090AC074F672 | |
| 1428 | −:10593000EBCE26880DE8E0078AD0E823008AC13C38 | |
| 1429 | −:105940002072053C7E760390B02EE8D508E970FF02 | |
| 1430 | −:10595000E8C507E80A00268A05E87C08E91DFF90EB | |
| 1431 | −:10596000F606267A02750286F2528B361A7AE80D0E | |
| 1432 | −:10597000085A528AC60206247AF606267A01750665 | |
| 1433 | −:10598000E89F08EB0D9032E4E80D088B361C7AE8AE | |
| 1434 | −:10599000EC075A8AC20206257AF606267A017506AF | |
| 1435 | −:1059A000E87F08EB069032E4E8ED078B361E7AE8D4 | |
| 1436 | −:1059B000CC07C390068E06047A8B3E027AE83C0739 | |
| 1437 | −:1059C000893E027A8C06047A07FF1E027AC3BE97CC | |
| 1438 | −:1059D0004DE8AA07CB900657BED779E866078BD863 | |
| 1439 | −:1059E000E861078BC82BCB78118EC3BF0000B8FFCE | |
| 1440 | −:1059F000FF51B90800F3AB59E2F75F07C39006BE49 | |
| 1441 | −:105A0000D779E83F078BD8D1E32E8B9F4400BE2681 | |
| 1442 | −:105A100052E8F1088BC3E8DD08B80100E873F2E84A | |
| 1443 | −:105A2000E008BE2F52E8DD088B4718E8C808BE77AB | |
| 1444 | −:105A300052E8D1088B4726E8BC08BE5352E8C50897 | |
| 1445 | −:105A40008B471EE8B008BE5C52E8B9088B4720E8D7 | |
| 1446 | −:105A5000A408BE6E52E8AD088B4724E89808BE80C3 | |
| 1447 | −:105A600052E8A1088B472AE88C08E89508BE38520E | |
| 1448 | −:105A7000E892088B07E87E08BE4152E887088B470A | |
| 1449 | −:105A80001AE87208BE4A52E87B088B471CE8660891 | |
| 1450 | −:105A9000BE6552E86F088B4722E85A08E86308BEE3 | |
| 1451 | −:105AA000D152E860088B4738E84B08BEAD52E85445 | |
| 1452 | −:105AB000088B4730E83F08BEB652E848088B4732AB | |
| 1453 | −:105AC000E83308BEA452E83C088B472EE82708BEFE | |
| 1454 | −:105AD000BF52E830088B4734E81B08E82408BE8929 | |
| 1455 | −:105AE00052E821088B4704E80C08BE9252E81508DA | |
| 1456 | −:105AF0008B4714E80008BE9B52E809088B472CE846 | |
| 1457 | −:105B0000F407BEC852E8FD078B4736E8E807BEDA5F | |
| 1458 | −:105B100052E8F1078B473AE8DC07BEE352E8E507B5 | |
| 1459 | −:105B20008B473CE8D007E8D907BE1953E8D6078B66 | |
| 1460 | −:105B30004748E8C107BEFE52E8CA078B4742E8B5AE | |
| 1461 | −:105B400007BE0753E8BE078B4744E8A907BE7C534E | |
| 1462 | −:105B5000E8B2078B474CE89D07BE8553E8A6078B44 | |
| 1463 | −:105B6000474EE89107BE8E53E89A078B4750E88569 | |
| 1464 | −:105B700007E88E07BE2253E88B078B474AE8760773 | |
| 1465 | −:105B8000BEEC52E87F078B4708E86A07BEF552E88B | |
| 1466 | −:105B900073078B4740E85E07BE1053E867078B47E3 | |
| 1467 | −:105BA00046E85207E85B07BE6A53E858078B477A16 | |
| 1468 | −:105BB000E84307BE3D53E84C078B4770E83707BE04 | |
| 1469 | −:105BC0004653E840078B4772E82B07BE4F53E83433 | |
| 1470 | −:105BD000078B4774E81F07E82807BE2B53E8250703 | |
| 1471 | −:105BE0008B470CE81007BE3453E819078B4710E8C1 | |
| 1472 | −:105BF0000407BE5853E80D078B4776E8F806BE61E8 | |
| 1473 | −:105C000053E801078B4778E8EC06BE7353E8F506C6 | |
| 1474 | −:105C10008B473EE8E006E8E906BE9753E8E6068BC8 | |
| 1475 | −:105C20004752E8D106BEA053E8DA068B4754E8C5D0 | |
| 1476 | −:105C300006BEA953E8CE068B4756E8B906BEB25356 | |
| 1477 | −:105C4000E8C2068B4758E8AD06BEBB53E8B6068BE4 | |
| 1478 | −:105C5000475AE8A106BEC453E8AA068B475CE895FC | |
| 1479 | −:105C600006E89E06BECD53E89B068B475EE8860697 | |
| 1480 | −:105C7000BED653E88F068B4760E87A06BEDF53E84E | |
| 1481 | −:105C800083068B4762E86E06BEE853E877068B47CB | |
| 1482 | −:105C90007CE86206BEF153E86B068B477EE8560649 | |
| 1483 | −:105CA000BEFA53E85F068B878000E84906E8520693 | |
| 1484 | −:105CB000BE4254E84F068B879E00E83906BE035467 | |
| 1485 | −:105CC000E842068B4764E82D06BE0C54E836068B86 | |
| 1486 | −:105CD000476EE82106BE1554E82A068B878E00E839 | |
| 1487 | −:105CE0001406BE1E54E81D068B879000E80706BE0A | |
| 1488 | −:105CF0002754E810068B879200E8FA05E80306BEF1 | |
| 1489 | −:105D00003054E800068B879400E8EA05BE3954E871 | |
| 1490 | −:105D1000F3058B879600E8DD05BE6F54E8E6058B3A | |
| 1491 | −:105D2000879800E8D005BE5D54E8D9058A87A000B1 | |
| 1492 | −:105D3000E8A705BE5454E8CC058A4728E89B05BE71 | |
| 1493 | −:105D40006654E8C0058A87A100E88E05E8B305BE61 | |
| 1494 | −:105D50007854E8B0058A87A200E87E05BE8154E841 | |
| 1495 | −:105D6000A3058A87A300E87105BE8A54E896058AD0 | |
| 1496 | −:105D700087A400E86405BE9354E889058A87A500D6 | |
| 1497 | −:105D8000E85705BE9C54E87C058A87A600E84A05CA | |
| 1498 | −:105D9000BEA554E86F058A87A700E83D05BEAE544E | |
| 1499 | −:105DA000E862058A87A800E83005E85505BEB754C3 | |
| 1500 | −:105DB000E852058A87A900E82005BEC054E84505D9 | |
| 1501 | −:105DC0008A87AA00E81305BEC954E838058A87AB5C | |
| 1502 | −:105DD00000E80605BED254E82B058A87AD00E8F935 | |
| 1503 | −:105DE00004BEDB54E81E058A87AE00E8EC04BEE47E | |
| 1504 | −:105DF00054E811058A87AF00E8DF04BEED54E804DB | |
| 1505 | −:105E0000058A87B000E8D204E8F704BEF654E8F447 | |
| 1506 | −:105E1000048A87B100E8C204BEFF54E8E7048A8719 | |
| 1507 | −:105E2000B200E8B504BE0855E8DA048A87B300E892 | |
| 1508 | −:105E3000A804BE1155E8CD048A87BB00E89B04E89E | |
| 1509 | −:105E4000C004BE1A55E8BD048A87BC00E88B04BEB6 | |
| 1510 | −:105E50002355E8B0048A87BE00E87E04BE2C55E8CE | |
| 1511 | −:105E6000A3048A87BF00E87104E8960407C36006AC | |
| 1512 | −:105E70001E168BECFF4E16F7461A00027401FBB893 | |
| 1513 | −:105E800000008ED88EC0892E2D7AE8CB0081661A4C | |
| 1514 | −:105E9000FFFEC6062A7A00E8D800B8005FA32B7A76 | |
| 1515 | −:105EA000E85D00803E2A7A00740A814E1A0001C61D | |
| 1516 | −:105EB000062A7A00171F0761CF9060061E168BEC2A | |
| 1517 | −:105EC000F7461A00027401FBB800008ED88EC08914 | |
| 1518 | −:105ED0002E2D7A81661AFFFEC6062A7A00E8920005 | |
| 1519 | −:105EE000B8005FA32B7AE81700803E2A7A00740A74 | |
| 1520 | −:105EF000814E1A0001C6062A7A00171F0761CF904B | |
| 1521 | −:105F0000B8F000E88CEDFF262B7AC390065356803C | |
| 1522 | −:105F10003E297A007403E83F00BED779E825028B5A | |
| 1523 | −:105F2000D8A3277A2E8A07A2297AB0CC2E88075EBA | |
| 1524 | −:105F30005B07C3C6062A7A00B80A5FA32B7AC39010 | |
| 1525 | −:105F40008B2E2D7AE82B00C3C6062A7A01E80800BA | |
| 1526 | −:105F5000B80A5FA32B7AC39057803E297A00740F4A | |
| 1527 | −:105F60008B3E277AA0297A2E8805C606297A005FFB | |
| 1528 | −:105F7000C390BEB24DE80602BED851E80002FF76DB | |
| 1529 | −:105F80001458E84702BEDE51E8F301FF760E58E8E8 | |
| 1530 | −:105F90003A02BEE451E8E601FF761258E82D02BE4F | |
| 1531 | −:105FA000EA51E8D901FF761058E82002BE1452E801 | |
| 1532 | −:105FB000CC01FF760A58E81302BE1A52E8BF01FF6F | |
| 1533 | −:105FC000760C58E80602BECF51E8B201FF761A58A7 | |
| 1534 | −:105FD000E8F901BEB24DE8A501BEF051E89F01FF0E | |
| 1535 | −:105FE000761858E8E601BEF651E89201FF760258AD | |
| 1536 | −:105FF000E8D901BEFC51E88501FF760458E8CC01E0 | |
| 1537 | −:10600000BE0252E87801FF760058E8BF01BE085290 | |
| 1538 | −:10601000E86B01FF760658E8B201BE0E52E85E0159 | |
| 1539 | −:10602000FF760858E8A501BE2052E85101FF761618 | |
| 1540 | −:1060300058E89801BE894DE84401C390BEC94DE8B7 | |
| 1541 | −:106040003C01C33C0074053C017459C3C7060C7A7B | |
| 1542 | −:10605000CD50C7060E7AF050C706107AE850C70632 | |
| 1543 | −:10606000127AEC50C706147AF450C706167AFB5021 | |
| 1544 | −:10607000C706187A0351C7061A7A0B51C7061C7A4D | |
| 1545 | −:106080000E51C7061E7A1051C706207A1251C70654 | |
| 1546 | −:10609000227A1651C606247A01C606257A01C6065A | |
| 1547 | −:1060A000267A03C3C7060C7A1A51C7060E7A4D51D9 | |
| 1548 | −:1060B000C706107A4751C706127A4A51C706147AA2 | |
| 1549 | −:1060C0004F51C706167A5151C706187A5551C7065F | |
| 1550 | −:1060D0001A7A5651C7061C7A5951C7061E7A5A5168 | |
| 1551 | −:1060E000C706207A5B51C706227A5E51C606247A1B | |
| 1552 | −:1060F00020C606257A20C606267A02C3A1F879486A | |
| 1553 | −:106100007414BED779E83C008BF8AC3C3A75078E26 | |
| 1554 | −:10611000C7E830008BF8C3908BC72B06FE798AF056 | |
| 1555 | −:10612000240F8AD002D002D080C20BC0EE0480C6F9 | |
| 1556 | −:1061300003043DC38CC0E89300B03AE8E4008BC789 | |
| 1557 | −:10614000E88900C35133C990AC3C2074FB900AC06D | |
| 1558 | −:1061500074262C3072223C0976143C11721A2C07DA | |
| 1559 | −:106160003C0F760A3C2A72102C203C0F770A98C10B | |
| 1560 | −:10617000E10403C8ACEBD7904E8BC159C390068C99 | |
| 1561 | −:10618000C88EC0E8020007C3268A04460AC0740607 | |
| 1562 | −:10619000E88F00EBF390C3900BC0747A5133D2B9FF | |
| 1563 | −:1061A000E803F7F18BCAE803008BC159BA6400F623 | |
| 1564 | −:1061B000F2E80C008AC498B20AF6F2E802008AC437 | |
| 1565 | −:1061C000500AF074050430E8580058C386C4E80744 | |
| 1566 | −:1061D0000086C4E80200C390C1C804E80800C1C03A | |
| 1567 | −:1061E00004E80200C3905350240FBBCA622ED7E8C4 | |
| 1568 | −:1061F0003000585BC39086C4E8070086C4E80200FC | |
| 1569 | −:10620000C39050B908008AE032C0D1C00430E81110 | |
| 1570 | −:1062100000E2F558C390B030E80700C3B020E801B1 | |
| 1571 | −:1062200000C3568B36D0798884D0774681E6FF014B | |
| 1572 | −:10623000FF06D4798936D079813ED479FE0175087C | |
| 1573 | −:1062400056E814005EEBF1905EC3BA0202EC240142 | |
| 1574 | −:106250007404BA0602ECC390803EF67900740960BB | |
| 1575 | −:10626000B80100E82CEA6190BA0202ECA804742894 | |
| 1576 | −:106270008B36D279833ED47900741D8A84D07746D8 | |
| 1577 | −:1062800081E6FF018936D279FF0ED479BA0602EE93 | |
| 1578 | −:10629000BA0202ECA80475DCA1D479C352BA060292 | |
| 1579 | −:1062A000EE5AC3905250BA0202ECA8047408585A2D | |
| 1580 | −:1062B000E8E9FFF9C390585AF8C35250BA0202EC09 | |
| 1581 | −:1062C000A80474FB585AE8D3FFC330313233343555 | |
| 1582 | −:1062D0003637383941424344454653508AE080E4DA | |
| 1583 | −:1062E0000FBBCA62C0E8042ED7E8CEFF8AC42ED7FF | |
| 1584 | −:1062F000E8C7FF585BC386E0E8DFFF86E0E8DAFF27 | |
| 1585 | −:10630000C390BEB24D502EAC3C007405E8ABFFEB21 | |
| 1586 | −:10631000F558C390C808000056578B7604BF040098 | |
| 1587 | −:10632000C746FC0000C746FA0000C746F8000083D5 | |
| 1588 | −:106330007E0600750E56E8B60E590BC075058BC764 | |
| 1589 | −:10634000E95B018B46FC8946FE0BFF7505B8010031 | |
| 1590 | −:10635000EB0233C05056E8A40D5959B4008946FCED | |
| 1591 | −:106360008B5EFC83FB087603E92B01D1E32EFFA7AC | |
| 1592 | −:10637000B264B80300E92601837EFA007414C746AC | |
| 1593 | −:10638000FA00008A445898508A44599850E8C20F3D | |
| 1594 | −:106390005959837EF800740AC746F8000056E89BF6 | |
| 1595 | −:1063A0000859837E060075058BC7E9F10083FF0459 | |
| 1596 | −:1063B0007503E9E6008BC7E9E400837EFE00750300 | |
| 1597 | −:1063C000BF0200E9D500837EFE007503BF0100E92E | |
| 1598 | −:1063D000C9008B5EFE83FB077603E98600D1E32EBE | |
| 1599 | −:1063E000FFA7A26433FFE97F00BF0400807C580F41 | |
| 1600 | −:1063F0007422837EF800751CFE44586A0856E87EB5 | |
| 1601 | −:106400000C59598A445804805056E8720C5959C79F | |
| 1602 | −:1064100046FA0100837EF800740AC746F800005669 | |
| 1603 | −:10642000E8190859EB42BF0400807C5800742283AD | |
| 1604 | −:106430007EF800751CFE4C586A0856E8410C595904 | |
| 1605 | −:106440008A445804805056E8350C5959C746FA0119 | |
| 1606 | −:1064500000837EF800740AC746F8000056E8DC079F | |
| 1607 | −:1064600059EB05BF0400EB00EB31BF0400EB2CC778 | |
| 1608 | −:1064700046F801006A0856E8050C5959807C58090D | |
| 1609 | −:106480007D04B00FEB02B00004805056E8F00B59C9 | |
| 1610 | −:1064900059BF0400EB05BF0400EB00E9A5FE5F5EF9 | |
| 1611 | −:1064A000C9C3E4636364636463646364E963266427 | |
| 1612 | −:1064B00051647863BA63C6639664D2636A646A643B | |
| 1613 | −:1064C0006F647263C808000056578B76048B7E0891 | |
| 1614 | −:1064D0006A0156E8A90B59598A4606C0E0060480AD | |
| 1615 | −:1064E0005056E89A0B5959C746FE0000897EF8EBD2 | |
| 1616 | −:1064F00003FF46FE8B5EF8FF46F8803F0075F2838F | |
| 1617 | −:106500007EFE107D25B810002B46FED1F88946FC92 | |
| 1618 | −:10651000C746FA0000EB0B6A2056E8620B5959FF98 | |
| 1619 | −:1065200046FA8B46FA3B46FC7CEDEB0C8BDF478A48 | |
| 1620 | −:10653000075056E8490B5959803D0075EF6A0256DD | |
| 1621 | −:10654000E83C0B5959EB005F5EC9C3C80400005614 | |
| 1622 | −:10655000578B7E04C746FE0000BE1400E909018B7C | |
| 1623 | −:106560005EFE83C3042BDF8A87AC0B88445AC64483 | |
| 1624 | −:1065700058088A46FE884459C744060000C6441994 | |
| 1625 | −:1065800000C6441A00C6441B00C6441D0DC6441E66 | |
| 1626 | −:1065900003C6441F00C6442000C6442100C6445B15 | |
| 1627 | −:1065A00000C6445D00C6445E00C6445F00C6446049 | |
| 1628 | −:1065B00000C746FC0000EB0D8B5EFCD1E3C740300A | |
| 1629 | −:1065C0000000FF46FC837EFC107CEDC746FC00000B | |
| 1630 | −:1065D000EB0A8B5EFCC6405000FF46FC837EFC0449 | |
| 1631 | −:1065E0007CF0C744540000C7445600008A445A98BF | |
| 1632 | −:1065F000BAF80023D0B805000BC28946FC9CFA8A81 | |
| 1633 | −:1066000046FCBAFE00EEBA0000EC9D24088846FC69 | |
| 1634 | −:10661000837EFC007502EB4AFF76FEE87A0C59682F | |
| 1635 | −:10662000350256E8320A59590BC07534683802569B | |
| 1636 | −:10663000E8250A59590BC0752768420256E8180A1E | |
| 1637 | −:1066400059590BC0751A684C0256E80B0A59590B78 | |
| 1638 | −:10665000C0750D68560256E8FE0959590BC0740200 | |
| 1639 | −:10666000EB00FF46FE83C662397EFE7D03E9EFFE46 | |
| 1640 | −:10667000EB005F5EC9C3C808000056578B4604BADA | |
| 1641 | −:106680006200F7EA0514008BF0837E06007405B8FB | |
| 1642 | −:106690001000EB03B808008944048A460888445C6B | |
| 1643 | −:1066A00056E85904598BF88BC78944568944548A53 | |
| 1644 | −:1066B000445D88442F0BFF751D68C20F6A0156E8C0 | |
| 1645 | −:1066C00002FE83C406EB006A0156E847FC59590BE9 | |
| 1646 | −:1066D000C075F4BF0100897EFAB90500BBE96A2ED6 | |
| 1647 | −:1066E0008B073B46FA74074343E2F4E9A4032EFF09 | |
| 1648 | −:1066F000670AC744060200C74408F4088B5E04D149 | |
| 1649 | −:10670000E38B87FC0889440A33C08BF8894454E939 | |
| 1650 | −:10671000800356E8BB0559BF01008A445D88446088 | |
| 1651 | −:10672000E96F03837C04087530807C5C0175158AF1 | |
| 1652 | −:10673000445DB400D1E08BD8FFB7E40856E8F70811 | |
| 1653 | −:106740005959EB138A445DB400D1E08BD8FFB7C42C | |
| 1654 | −:106750000856E8E2085959EB2E807C5C0175158AD1 | |
| 1655 | −:10676000445DB400D1E08BD8FFB7D40856E8C70821 | |
| 1656 | −:106770005959EB138A445DB400D1E08BD8FFB7B40C | |
| 1657 | −:106780000856E8B20859596A0156E887FB59598BEF | |
| 1658 | −:10679000D883FB03772AD1E32EFFA7E16ABF01006C | |
| 1659 | −:1067A0008A445D88445EEB188A445D04FF240788B0 | |
| 1660 | −:1067B000445DEB0C8A445DFEC0240788445DEB0019 | |
| 1661 | −:1067C000E9CF028A445DB400D1E08BD8FFB7FD0267 | |
| 1662 | −:1067D00056E863085959681D0356E85A0859596A1A | |
| 1663 | −:1067E0000156E82FFB59598BD883FB037736D1E349 | |
| 1664 | −:1067F0002EFFA7D96ABF01008A445D88445FEB245D | |
| 1665 | −:106800008A445D04FF8A540480C2FF22C288445D2A | |
| 1666 | −:10681000EB128A445DFEC08A540480C2FF22C28803 | |
| 1667 | −:10682000445DEB00E96B028B5C0683C3FED1E38B16 | |
| 1668 | −:10683000400889048B1CFF77066A0056E885FC83B4 | |
| 1669 | −:10684000C4068B5C064BD1E38B40088944028B5C09 | |
| 1670 | −:1068500002FF77066A0156E86AFC83C4066A01569D | |
| 1671 | −:10686000E8B1FA59598BD883FB037603E91F02D1AB | |
| 1672 | −:10687000E32EFFA7D16A8B5C028B47048944028B0D | |
| 1673 | −:106880005C02803F44750D8B5C028A4701B4003B7B | |
| 1674 | −:1068900044047DE28B4604D1E08B1C03D88B440278 | |
| 1675 | −:1068A0008947088B5C064BD1E38B4402894008E999 | |
| 1676 | −:1068B000DE018B5C028B47028944028B5C02803FC5 | |
| 1677 | −:1068C00044750D8B5C028A4701B4003B44047DE2B1 | |
| 1678 | −:1068D0008B4604D1E08B1C03D88B44028947088B7C | |
| 1679 | −:1068E0005C064BD1E38B4402894008E9A201BF0159 | |
| 1680 | −:1068F00000E99C018B5C028A07B4008946F8B90C58 | |
| 1681 | −:1069000000BBA16A2E8B073B46F874074343E2F4B1 | |
| 1682 | −:10691000E977012EFF67188B4604D1E08B5C0203F8 | |
| 1683 | −:10692000D88B47088B5C06FF4406D1E38940088B6F | |
| 1684 | −:106930001C807F010074128B5C028A47018B1C8AC9 | |
| 1685 | −:106940005701B6008BDA884018E94001FF4C06E990 | |
| 1686 | −:106950003A018B5C028A47018B1C8A5701B6008B77 | |
| 1687 | −:10696000DA884018E925018B5C028A47018B1C8A72 | |
| 1688 | −:106970005701B6008BDA884018FF4C06E90D018BF1 | |
| 1689 | −:106980005C028A47018B1C8A5701B6008BDA3040C3 | |
| 1690 | −:1069900018E9F800B8F0108BF88944548A445F88ED | |
| 1691 | −:1069A000445DE9E7008A441C983D020074073D03FA | |
| 1692 | −:1069B000007402EB07C746FE0000EB2B8A441C98CC | |
| 1693 | −:1069C000D1E08BD8FFB7690256E86B0659596A01C6 | |
| 1694 | −:1069D00056E840F959598946FE837EFE00740683C5 | |
| 1695 | −:1069E0007EFE0375E9EB00837EFE0374628A441C1D | |
| 1696 | −:1069F00098D1E08BD8FFB76D0256E83A0659595640 | |
| 1697 | −:106A0000E84D97598946FC8B5EFC83EBFE83FB03C4 | |
| 1698 | −:106A10007733D1E32EFFA7996A68AC0256E81706D0 | |
| 1699 | −:106A20005959EB23688F0256E80C065959EB186840 | |
| 1700 | −:106A3000750256E801065959EB0D68C60256E8F68C | |
| 1701 | −:106A4000055959EB02EB006A0156E8C7F85959BFDE | |
| 1702 | −:106A50000100EB3868DD0256E8DC0559596A015639 | |
| 1703 | −:106A6000E8B1F85959BF0100EB22B8D0308BF88952 | |
| 1704 | −:106A700044548A446088445DEB12B8E0208BF88966 | |
| 1705 | −:106A800044548A445E88445DEB02EB00EB02EB0069 | |
| 1706 | −:106A9000EB00E941FC5F5EC9C3196A246A2F6A3AB8 | |
| 1707 | −:106AA0006A0000010002000400410042004300446B | |
| 1708 | −:106AB00000800081008200FF001769546A7A6AA58D | |
| 1709 | −:106AC00069526994696A6A676952697F6967694C42 | |
| 1710 | −:106AD00069F4687668B268EE68F56700681268F570 | |
| 1711 | −:106AE000679D67A867B4679D6700000100F010E02C | |
| 1712 | −:106AF00020D0302768F266C36723671267C8040096 | |
| 1713 | −:106B00000056578B76048A4459988946FC6A098B4B | |
| 1714 | −:106B100046FC05840150E8930859598BF88BC7252A | |
| 1715 | −:106B200000F03D001075558BC725F0003DF0007555 | |
| 1716 | −:106B30004B8BC725000FC1F8088946FE8B44043BE8 | |
| 1717 | −:106B400046FE7D0533C0E9EF008BC7250F00BA0F65 | |
| 1718 | −:106B5000002BD03B56FE740533C0E9DB00C744026E | |
| 1719 | −:106B600004098A46FE88445F88445D8B5EFCD1E35D | |
| 1720 | −:106B7000C787FC080409B8F010E9BC008BC72500E2 | |
| 1721 | −:106B8000F03D002075528BC725F0003DE0007548B0 | |
| 1722 | −:106B90008BC725000FC1F8088946FE837EFE087E5C | |
| 1723 | −:106BA0000533C0E992008BC7250F00BA0F002BD028 | |
| 1724 | −:106BB0003B56FE740533C0EB7F90C744020C098A34 | |
| 1725 | −:106BC00046FE88445E88445D8B5EFCD1E3C787FC4B | |
| 1726 | −:106BD000080C09B8E020EB608BC72500F03D0030C1 | |
| 1727 | −:106BE00075528BC725F0003DD00075488BC7250036 | |
| 1728 | −:106BF0000FC1F8088946FE8B44043B46FE7D0433F2 | |
| 1729 | −:106C0000C0EB358BC7250F00BA0F002BD03B56FECB | |
| 1730 | −:106C1000740433C0EB22C7440214098A46FE884438 | |
| 1731 | −:106C20006088445D8B5EFCD1E3C787FC081409B81B | |
| 1732 | −:106C3000D030EB0433C0EB005F5EC9C3C806000070 | |
| 1733 | −:106C4000568B76046A0856E8350459598A44580424 | |
| 1734 | −:106C5000805056E8290459598B44543B4456750AD0 | |
| 1735 | −:106C60008A445D3A442F7502EB648B445489445640 | |
| 1736 | −:106C70008B5C028A470188442F8A445DB400C1E0DE | |
| 1737 | −:106C8000088B54540BD08A445DB400BB0F002BD842 | |
| 1738 | −:106C90000BD38956FE6A108A445998050400990559 | |
| 1739 | −:106CA000400183D2005250E8540883C4068956FC40 | |
| 1740 | −:106CB0008946FA8B46FE0946FA834EFC006A19FFA4 | |
| 1741 | −:106CC00076FCFF76FAE8730783C406E8FE075EC920 | |
| 1742 | −:106CD000C3C81C000056578B5E048A4759988BF036 | |
| 1743 | −:106CE0008B5E048A475DB4008946E6837EE6007DBC | |
| 1744 | −:106CF0000A8B5E048B4704488946E68B5E048B470B | |
| 1745 | −:106D0000043B46E67F05C746E600008B5E048A46E4 | |
| 1746 | −:106D1000E688475D8BDED1E38B9F5902C647022090 | |
| 1747 | −:106D20008BDED1E38B9F5902C64703308BDED1E364 | |
| 1748 | −:106D30008B9F6102C64702208BDED1E38B9F6102ED | |
| 1749 | −:106D4000C64703308B46E68946FA837EFA007418FC | |
| 1750 | −:106D50008B46FABB0A0033D2F7F380C2308BDED108 | |
| 1751 | −:106D6000E38B9F5902885703BB0A008B46FA33D244 | |
| 1752 | −:106D7000F7F38946FA837EFA0074188B46FABB0A49 | |
| 1753 | −:106D80000033D2F7F380C2308BDED1E38B9F590200 | |
| 1754 | −:106D90008857028B46E68946FA837EFA0074188B80 | |
| 1755 | −:106DA00046FABB0A0033D2F7F380C2308BDED1E360 | |
| 1756 | −:106DB0008B9F6102885703BB0A008B46FA33D2F7D8 | |
| 1757 | −:106DC000F38946FA837EFA0074188B46FABB0A00F0 | |
| 1758 | −:106DD00033D2F7F380C2308BDED1E38B9F61028820 | |
| 1759 | −:106DE00057028B5EE6D1E3FFB712026A00FF76041A | |
| 1760 | −:106DF000E8D1F683C40668D30F6A01FF7604E8C3BE | |
| 1761 | −:106E0000F683C406FF76E656E8019359598956F28F | |
| 1762 | −:106E10008946F0FF76E656E8149359598956EE896B | |
| 1763 | −:106E200046EC9CFAC45EF0268B078946EAC45EEC09 | |
| 1764 | −:106E3000268B078946E8BA50FFED8946FE9DC74676 | |
| 1765 | −:106E4000E40100E8EEA0BA50FFED8946FC8B46FC59 | |
| 1766 | −:106E50002B46FE3DE8037303E980019CFABA50FF1C | |
| 1767 | −:106E6000ED8946FC8B46FC2B46FE8946F8C45EF055 | |
| 1768 | −:106E7000268B072B46EA8946F6C45EF0268B0789E7 | |
| 1769 | −:106E800046EAC45EEC268B072B46E88946F4C45ECE | |
| 1770 | −:106E9000EC268B078946E8BA50FFED8946FE9D81B6 | |
| 1771 | −:106EA0007EF8E803761CFF76F8FF76F6E87601595F | |
| 1772 | −:106EB000598946F6FF76F8FF76F4E8680159598952 | |
| 1773 | −:106EC00046F4BF0E00EB178BDED1E38B9F5902C651 | |
| 1774 | −:106ED00001208BDED1E38B9F6102C601204783FF37 | |
| 1775 | −:106EE0001176E48BDED1E38B9F5902C6470D308BC0 | |
| 1776 | −:106EF000DED1E38B9F6102C6470D30837EF60977B2 | |
| 1777 | −:106F000005B80D00EB26837EF6637705B80E00EB1F | |
| 1778 | −:106F10001B817EF6E7037705B80F00EB0F817EF645 | |
| 1779 | −:106F20000F277705B81000EB03B811008BF8EB259D | |
| 1780 | −:106F30008B46F6BB0A0033D2F7F380C2308BDED12A | |
| 1781 | −:106F4000E38B9F590288114FBB0A008B46F633D260 | |
| 1782 | −:106F5000F7F38946F6837EF60075D5837EF40977CC | |
| 1783 | −:106F600005B80D00EB26837EF4637705B80E00EBC1 | |
| 1784 | −:106F70001B817EF4E7037705B80F00EB0F817EF4E9 | |
| 1785 | −:106F80000F277705B81000EB03B811008BF8EB253D | |
| 1786 | −:106F90008B46F4BB0A0033D2F7F380C2308BDED1CC | |
| 1787 | −:106FA000E38B9F610288114FBB0A008B46F433D2FA | |
| 1788 | −:106FB000F7F38946F4837EF40075D58BDED1E3FFC9 | |
| 1789 | −:106FC000B75902FF7604E86E0059598BDED1E3FF12 | |
| 1790 | −:106FD000B76102FF7604E85E0059596A00FF760443 | |
| 1791 | −:106FE000E831F359598BD883FB04771FD1E32EFF87 | |
| 1792 | −:106FF000A71B70EB22C746E40000FF4EE6EB0CC770 | |
| 1793 | −:1070000046E40000FF46E6EB02EB00837EE40074FA | |
| 1794 | −:1070100003E92AFEE9D4FC5F5EC9C3F36FF56FFF95 | |
| 1795 | −:107020006FF36F0970558BEC8B4604B9E803F7E1F9 | |
| 1796 | −:107030008B4E06F7F15DC3558BEC568B7606EB0E47 | |
| 1797 | −:107040008BDE468A0750FF7604E833005959803CAE | |
| 1798 | −:107050000075EDEB005E5DC3558BEC568B7606EB51 | |
| 1799 | −:10706000148BDE468A0750FF7604E8450059590B19 | |
| 1800 | −:10707000C07402EB07803C0075E7EB005E5DC3C89F | |
| 1801 | −:10708000020000568B76048A445A988946FE9CFA80 | |
| 1802 | −:107090008A46FEBAFE00EEBA0200ECA80274069D13 | |
| 1803 | −:1070A000E8919EEBE9BA00008A4606EE9DEB005E91 | |
| 1804 | −:1070B000C9C3C8040000568B76048A445A9889468E | |
| 1805 | −:1070C000FEE8E6A18946FCE8E0A12B46FC3DB80BB2 | |
| 1806 | −:1070D0007605B80100EB239CFA8A46FEBAFE00EE64 | |
| 1807 | −:1070E000BA0200ECA80274069DE8489EEBD9BA00EB | |
| 1808 | −:1070F000008A4606EE9D33C0EB005EC9C3C804009B | |
| 1809 | −:107100000056578B7604837E0600740756E8030109 | |
| 1810 | −:1071100059EB0556E8A200598846FF807EFF0877A4 | |
| 1811 | −:10712000068A46FFE98400807EFF0F7603EB7990A4 | |
| 1812 | −:107130008A46FFB4002D0A008BD883FB047767D101 | |
| 1813 | −:10714000E32EFFA7AF71B000EB6156E86B0059B4B6 | |
| 1814 | −:1071500000250F008946FC56E85E0059B4008BF804 | |
| 1815 | −:1071600056E8550059B400C1E0088BD703D08BFA1C | |
| 1816 | −:107170008B5EFCD1E3897830EB2E56E83B005988D2 | |
| 1817 | −:10718000445BEB2456E831005988445056E8290006 | |
| 1818 | −:107190005988445156E821005988445256E819004C | |
| 1819 | −:1071A00059884453EB02EB00E95BFF5F5EC9C346BD | |
| 1820 | −:1071B00071A6714A717A718471C8040000568B7689 | |
| 1821 | −:1071C000048A445A988946FE9CFA8A46FEBAFE0012 | |
| 1822 | −:1071D000EEBA0200ECA80175069DE8579DEBE9BAEE | |
| 1823 | −:1071E0000000EC8846FD9D8A46FDEB005EC9C3C8E1 | |
| 1824 | −:1071F000020000568B76048A445A988946FE9CFA0F | |
| 1825 | −:107200008A46FEBAFE00EEBA0200EC32E424019D8A | |
| 1826 | −:107210005EC9C3C8060000568B76048A445A988912 | |
| 1827 | −:1072200046FEE885A08946FAE87FA02B46FA3DB8DD | |
| 1828 | −:107230000B7604B008EB249CFA8A46FEBAFE00EEF8 | |
| 1829 | −:10724000BA0200ECA80175069DE8E89CEBDABA00EA | |
| 1830 | −:1072500000EC8846FD9D8A46FDEB005EC9C3558B58 | |
| 1831 | −:10726000EC568B56048A4606EE33F6EB035058462E | |
| 1832 | −:1072700083FE147CF85E5DC3C8020000568B560482 | |
| 1833 | −:10728000EC8846FF33F6EB0350584683FE147CF837 | |
| 1834 | −:107290008A46FFEB005EC9C3C802000056578B76D2 | |
| 1835 | −:1072A00004833EB00B00751FBA8801B000EEBA86A9 | |
| 1836 | −:1072B00001B000EE6A096A00683001E87D0183C40C | |
| 1837 | −:1072C00006C706B00B01006A098BC605800150E8AD | |
| 1838 | −:1072D000DA0059598BF88BC7C1E80C250F00894695 | |
| 1839 | −:1072E000FE8BC7C1E808250F008B56FE83F20C3BCE | |
| 1840 | −:1072F000C275218BC7C1E804250F008B56FE83F2AF | |
| 1841 | −:10730000063BC2750F8BC7250F008B56FE83F20913 | |
| 1842 | −:107310003BC2740D6A0756E838005959C746FE0744 | |
| 1843 | −:10732000008A46FE0480A233028BC6BA6200F7EAE6 | |
| 1844 | −:107330008A56FE8BD888976C006832028BC6BA6278 | |
| 1845 | −:1073400000F7EA05140050E80EFD5959EB005F5EA6 | |
| 1846 | −:10735000C9C3C8020000568B760683E60F8BC6C1F0 | |
| 1847 | −:10736000E00C8BD683F20CC1E2080BC28BD683F201 | |
| 1848 | −:1073700006C1E2040BC28BD683F2090BC28946FE1A | |
| 1849 | −:107380006A196A108B46049905400183D200525055 | |
| 1850 | −:10739000E86B0183C4060B46FE83CA005250E89A8C | |
| 1851 | −:1073A0000083C406E82501EB005EC9C3558BEC568B | |
| 1852 | −:1073B0005733FF6A01688601E8A3FE5959B1102AC4 | |
| 1853 | −:1073C0004E06D3660433F6EB2E817E0400807204F1 | |
| 1854 | −:1073D000B001EB02B00050688801E881FE59596A9B | |
| 1855 | −:1073E00003688601E877FE59596A01688601E86DED | |
| 1856 | −:1073F000FE5959D16604463B76067CCD33F6EB2424 | |
| 1857 | −:10740000D1E76A03688601E854FE59596A01688623 | |
| 1858 | −:1074100001E84AFE5959688801E85CFE599825013F | |
| 1859 | −:10742000000BF84683FE107CD76A00688601E82DC1 | |
| 1860 | −:10743000FE59598BC7EB005F5E5DC3558BEC565709 | |
| 1861 | −:107440008B7E086A01688601E813FE5959B820004E | |
| 1862 | −:107450002BC750FF7606FF7604E8A20083C4068996 | |
| 1863 | −:10746000560689460433F6EB47817E060080720C8F | |
| 1864 | −:107470007506837E04007204B001EB02B000506810 | |
| 1865 | −:107480008801E8D9FD59596A03688601E8CFFD599A | |
| 1866 | −:10749000596A01688601E8C5FD59596A01FF7606F7 | |
| 1867 | −:1074A000FF7604E8580083C40689560689460446D8 | |
| 1868 | −:1074B0003BF77CB56A00688601E8A2FD59596A006D | |
| 1869 | −:1074C000688601E898FD59595F5E5DC3558BEC569F | |
| 1870 | −:1074D0006A01688601E886FD595933F6EB00688831 | |
| 1871 | −:1074E00001E894FD59A80175088BC6463D64007CEF | |
| 1872 | −:1074F000ED6A00688601E865FD59595E5DC3C80400 | |
| 1873 | −:1075000000008B46048B56068B4E08E306D1E0D173 | |
| 1874 | −:10751000D2E2FA8946FC8956FE8B56FE8B46FCEB7E | |
| 1875 | −:1075200000C9C300000000000000000000000000CF | |
| 1876 | −:1075300050726576696F7573204D656E7500426592 | |
| 1877 | −:1075400067696E00000000000000000000000000FD | |
| 1878 | −:10755000000000000000000000000000000000002B | |
| 1879 | −:10756000000000000000000000000000000000001B | |
| 1880 | −:10757000000000000000000000000000000000000B | |
| 1881 | −:1075800000000000000000000000000000000000FB | |
| 1882 | −:1075900000000000000000000000000000000000EB | |
| 1883 | −:1075A00000000000000000000000000000000000DB | |
| 1884 | −:1075B00000000000000000000000000000000000CB | |
| 1885 | −:1075C00000000000000000000000000000000000BB | |
| 1886 | −:1075D00000000000000000000000000000000000AB | |
| 1887 | −:1075E000000000000000000000000000000000009B | |
| 1888 | −:1075F000000000000000000000000000000000008B | |
| 1889 | −:10760000000000000000000000000000000000007A | |
| 1890 | −:10761000000000000000000000000000000000006A | |
| 1891 | −:10762000000000000000000000000000000000005A | |
| 1892 | −:10763000000000000000000000000000000000004A | |
| 1893 | −:10764000000000000000000000000000000000003A | |
| 1894 | −:10765000000000000000000000000000000000002A | |
| 1895 | −:10766000000000000000000000000000000000001A | |
| 1896 | −:10767000000000000000000000000000000000000A | |
| 1897 | −:1076800000000000000000000000000000000000FA | |
| 1898 | −:1076900000000000000000000000000000000000EA | |
| 1899 | −:1076A00000000000000000000000000000000000DA | |
| 1900 | −:1076B00000000000000000000000000000000000CA | |
| 1901 | −:1076C000000000000000000000000000506F727415 | |
| 1902 | −:1076D000203000506F7274203100506F727420326D | |
| 1903 | −:1076E00000506F7274203300506F72742034005059 | |
| 1904 | −:1076F0006F7274203500506F7274203600506F72B4 | |
| 1905 | −:1077000074203700506F7274203800506F727420EC | |
| 1906 | −:107710003900506F727420313000506F7274203114 | |
| 1907 | −:107720003100506F727420313200506F727420310A | |
| 1908 | −:107730003300506F727420313400506F72742031F6 | |
| 1909 | −:1077400035009C01A301AA01B101B801BF01C60126 | |
| 1910 | −:10775000CD01D401DB01E201EA01F201FA010202EA | |
| 1911 | −:107760000A02080000078100038080809F919591A4 | |
| 1912 | −:107770009F000381848E95848484840003828484A2 | |
| 1913 | −:107780008484958E8400048800B20BC60BDA0BEE5D | |
| 1914 | −:107790000B020C160C2A0C3E0C520C770C9C0CBEE7 | |
| 1915 | −:1077A0000CE00C020D01802054657374205061734D | |
| 1916 | −:1077B000736564201F20507265737320800200017E | |
| 1917 | −:1077C00080204D697373696E67205278204461741C | |
| 1918 | −:1077D000611F205072657373208002000180204277 | |
| 1919 | −:1077E00061642052782044617461201F20507265CA | |
| 1920 | −:1077F000737320800200018020586D7472204275DE | |
| 1921 | −:1078000073791F20507265737320800200018020FD | |
| 1922 | −:107810006E6F742063757272656E746C791F2020B0 | |
| 1923 | −:10782000696D706C656D656E7465640200240D2F62 | |
| 1924 | −:107830000D3A0D450D500D5B0D660D710D7C0D87DC | |
| 1925 | −:107840000D920D9D0DA80DB30DBE0DC90D53802CCD | |
| 1926 | −:107850003254442053862C334454522053822C33C8 | |
| 1927 | −:10786000525453201F53812C3252442053852C32C2 | |
| 1928 | −:1078700043442053832C334354532053842C3344A8 | |
| 1929 | −:1078800053522053872C3252492702000180202076 | |
| 1930 | −:10789000444344202D2070696E2032301F275385C9 | |
| 1931 | −:1078A0002E31818263908081828384858687888956 | |
| 1932 | −:1078B0008A8B8C8D8E8F27020001802020445352AA | |
| 1933 | −:1078C000202D2070696E2031311F2753842E318185 | |
| 1934 | −:1078D000826390808182838485868788898A8B8C65 | |
| 1935 | −:1078E0008D8E8F27020001802020435453202D20AD | |
| 1936 | −:1078F00070696E20341F2753832E318182639080FC | |
| 1937 | −:107900008182838485868788898A8B8C8D8E8F2758 | |
| 1938 | −:107910000200018020205249202D2070696E203203 | |
| 1939 | −:10792000321F2753872E3181826390808182838426 | |
| 1940 | −:1079300085868788898A8B8C8D8E8F2702000180AF | |
| 1941 | −:107940002020445452202D2070696E20362F381F7D | |
| 1942 | −:107950002753862E3181826390808182838485863D | |
| 1943 | −:107960008788898A8B8C8D8E8F270200018020204A | |
| 1944 | −:10797000525453202D2070696E20351F2753822EBC | |
| 1945 | −:107980003181826390808182838485868788898A19 | |
| 1946 | −:107990008B8C8D8E8F27020001802020527844200E | |
| 1947 | −:1079A0002D2070696E20321F2753812E30534D8158 | |
| 1948 | −:1079B000826390808182838485868788898A8B8C84 | |
| 1949 | −:1079C0008D8E8F27020001802020547844202D20A6 | |
| 1950 | −:1079D00070696E20331F2753802E30534D81826390 | |
| 1951 | −:1079E00090808182838485868788898A8B8C8D8E1E | |
| 1952 | −:1079F0008F27020001802020444344202D207069FD | |
| 1953 | −:107A00006E20351F2753852E3181826390808182BD | |
| 1954 | −:107A1000838485868788898A8B8C8D8E8F27020048 | |
| 1955 | −:107A200001802020445352202D2070696E20351F84 | |
| 1956 | −:107A30002753842E3181826390808182838485865E | |
| 1957 | −:107A40008788898A8B8C8D8E8F2702000180202069 | |
| 1958 | −:107A5000435453202D2070696E20311F2753832EED | |
| 1959 | −:107A60003181826390808182838485868788898A38 | |
| 1960 | −:107A70008B8C8D8E8F270200018020205249202D73 | |
| 1961 | −:107A800020286E2E632E291F2753872E3181826373 | |
| 1962 | −:107A900090808182838485868788898A8B8C8D8E6D | |
| 1963 | −:107AA0008F27020001802020445452202D2070692D | |
| 1964 | −:107AB0006E20321F2753862E31818263908081820F | |
| 1965 | −:107AC000838485868788898A8B8C8D8E8F27020098 | |
| 1966 | −:107AD00001802020525453202D2070696E20371FC2 | |
| 1967 | −:107AE0002753822E318182639080818283848586B0 | |
| 1968 | −:107AF0008788898A8B8C8D8E8F27020001802020B9 | |
| 1969 | −:107B0000527844202D2070696E20361F2753812E15 | |
| 1970 | −:107B100030534D81826390808182838485868788FB | |
| 1971 | −:107B2000898A8B8C8D8E8F270200018020205478CB | |
| 1972 | −:107B300044202D2070696E20331F2753802E305330 | |
| 1973 | −:107B40004D81826390808182838485868788898A3B | |
| 1974 | −:107B50008B8C8D8E8F27020001802020444344208F | |
| 1975 | −:107B60002D2070696E20351F202020202753852E60 | |
| 1976 | −:107B700031818263888081828384858687270200A1 | |
| 1977 | −:107B800001802020445352202D2070696E20351F23 | |
| 1978 | −:107B9000202020202753842E318182638880818297 | |
| 1979 | −:107BA0008384858687270200018020204354532048 | |
| 1980 | −:107BB0002D2070696E20311F202020202753832E16 | |
| 1981 | −:107BC0003181826388808182838485868727020051 | |
| 1982 | −:107BD000018020205249202D20286E2E632E291F3F | |
| 1983 | −:107BE000202020202753872E318182638880818244 | |
| 1984 | −:107BF00083848586872702000180202044545220F8 | |
| 1985 | −:107C00002D2070696E20321F202020202753862EC1 | |
| 1986 | −:107C10003181826388808182838485868727020000 | |
| 1987 | −:107C200001802020525453202D2070696E20371F70 | |
| 1988 | −:107C3000202020202753822E3181826388808182F8 | |
| 1989 | −:107C40008384858687270200018020205278442083 | |
| 1990 | −:107C50002D2070696E20361F202020202753812E72 | |
| 1991 | −:107C600030534D8182638880818283848586872713 | |
| 1992 | −:107C7000020001802020547844202D2070696E205D | |
| 1993 | −:107C8000331F202020202753802E30534D818263C4 | |
| 1994 | −:107C90008880818283848586872702000180202056 | |
| 1995 | −:107CA000444344202D2070696E2032301F20202054 | |
| 1996 | −:107CB000202753852E318182638880818283848549 | |
| 1997 | −:107CC000868727020001802020445352202D2070F7 | |
| 1998 | −:107CD000696E2031311F202020202753842E3181CE | |
| 1999 | −:107CE0008263888081828384858687270200018061 | |
| 2000 | −:107CF0002020435453202D2070696E20341F2020F3 | |
| 2001 | −:107D000020202753832E318182638880818283845F | |
| 2002 | −:107D1000858687270200018020205249202D20706F | |
| 2003 | −:107D2000696E2032321F202020202753872E318178 | |
| 2004 | −:107D30008263888081828384858687270200018010 | |
| 2005 | −:107D40002020445452202D2070696E20362F381F79 | |
| 2006 | −:107D5000202020202753862E3181826388808182D3 | |
| 2007 | −:107D60008384858687270200018020205254532077 | |
| 2008 | −:107D70002D2070696E20351F202020202753822E51 | |
| 2009 | −:107D8000318182638880818283848586872702008F | |
| 2010 | −:107D900001802020527844202D2070696E20321FEF | |
| 2011 | −:107DA000202020202753812E30534D8182638880EC | |
| 2012 | −:107DB0008182838485868727020001802020547871 | |
| 2013 | −:107DC00044202D2070696E20331F2020202027534F | |
| 2014 | −:107DD000802E30534D8182638880818283848586A2 | |
| 2015 | −:107DE0008727020068049604B6033C040E04890346 | |
| 2016 | −:107DF0005C03E20360088A08BE0738080E0895078E | |
| 2017 | −:107E00006C07E6071C057405FA05C404F004CC05EC | |
| 2018 | −:107E1000A00548057806C806420728065006180738 | |
| 2019 | −:107E2000F006A0060000F408F408D40D04090409C3 | |
| 2020 | −:107E30000409040942000C091C09E50D020014099B | |
| 2021 | −:107E40000409F40D43001C090C09050E0004040983 | |
| 2022 | −:107E50001409120E2C092C092C092C0900003C09CC | |
| 2023 | −:107E60006C091E0E740974097409740900014C0927 | |
| 2024 | −:107E70002C092D0E740974097409740900025C0937 | |
| 2025 | −:107E80003C093D0E740974097409740900036C09F6 | |
| 2026 | −:107E90004C094D0E7409740974097409FF002C090A | |
| 2027 | −:107EA0005C09000000058409EC095E0EF409F40980 | |
| 2028 | −:107EB000F409F409000694097409680EAC0AAC0AC6 | |
| 2029 | −:107EC000AC0AAC0A0007A4098409720EBC0ABC0AF9 | |
| 2030 | −:107ED000BC0ABC0A0008B40994097C0ED40AD40A6E | |
| 2031 | −:107EE000D40AD40A000BC409A409830EFC0AFC0AB4 | |
| 2032 | −:107EF000FC0AFC0A000CD409B409900E140B140BF4 | |
| 2033 | −:107F0000140B140B0002E409C409A00E2C0B2C0B5B | |
| 2034 | −:107F10002C0B2C0B0400EC09D4090E00FF00740993 | |
| 2035 | −:107F2000E40900008201FC09A40AAC0E8202040AE2 | |
| 2036 | −:107F3000F409AF0E82030C0AFC09B20E8204140A83 | |
| 2037 | −:107F4000040AB60E82051C0A0C0ABC0E8206240A1C | |
| 2038 | −:107F5000140AC00E82072C0A1C0AC40E8208340AB6 | |
| 2039 | −:107F6000240AC80E82093C0A2C0ACC0E820A440A52 | |
| 2040 | −:107F7000340AD10E82104C0A3C0AD60E820B540AE7 | |
| 2041 | −:107F8000440ADB0E82115C0A4C0AE00E820C640A81 | |
| 2042 | −:107F9000540AE50E82126C0A5C0AEA0E820D740A1B | |
| 2043 | −:107FA000640AEF0E820E7C0A6C0AF40E820F840AB9 | |
| 2044 | −:107FB000740AFB0E82138C0A7C0A020F8214940A44 | |
| 2045 | −:107FC000840A090F82159C0A8C0A100F8216A40AD3 | |
| 2046 | −:107FD000940A170F8217F4099C0A1E0F8202B40A32 | |
| 2047 | −:107FE000B40A260F8203AC0AAC0A2D0F8200C40A21 | |
| 2048 | −:107FF000CC0A340F8201CC0ABC0A3F0F8202BC0AB1 | |
| 2049 | −:10800000C40A4D0F8200DC0AF40A590F8201E40A07 | |
| 2050 | −:10801000D40A630F8202EC0ADC0A6E0F8203F40AB0 | |
| 2051 | −:10802000E40A7A0F8204D40AEC0A870F8200040B58 | |
| 2052 | −:108030000C0B930F82010C0BFC0A9B0F8202FC0AB3 | |
| 2053 | −:10804000040BA70F82001C0B240BB00F8201240B22 | |
| 2054 | −:10805000140BB50F8202140B1C0BBE0F4400340B23 | |
| 2055 | −:10806000A40B9C0144013C0B2C0BA3014402440BC8 | |
| 2056 | −:10807000340BAA0144034C0B3C0BB1014404540BD8 | |
| 2057 | −:10808000440BB80144055C0B4C0BBF014406640B68 | |
| 2058 | −:10809000540BC60144076C0B5C0BCD014408740BF8 | |
| 2059 | −:1080A000640BD40144097C0B6C0BDB01440A840B88 | |
| 2060 | −:1080B000740BE201440B8C0B7C0BEA01440C940B17 | |
| 2061 | −:1080C000840BF201440D9C0B8C0BFA01440EA40BA3 | |
| 2062 | −:1080D000940B0202440F2C0B9C0B0A02171F0F2F4C | |
| 2063 | −:1080E0000000018078783A20747820637073202A29 | |
| 2064 | −:1080F0002A2A2A2A0200018078783A20747820639C | |
| 2065 | −:108100007073202A2A2A2A2A0200018078783A20CD | |
| 2066 | −:10811000747820637073202A2A2A2A2A0200018098 | |
| 2067 | −:1081200078783A20747820637073202A2A2A2A2AC1 | |
| 2068 | −:10813000020001C078783A20726320637073202AAD | |
| 2069 | −:108140002A2A2A2A020001C078783A207263206322 | |
| 2070 | −:108150007073202A2A2A2A2A020001C078783A203D | |
| 2071 | −:10816000726320637073202A2A2A2A2A020001C01F | |
| 2072 | −:1081700078783A20726320637073202A2A2A2A2A88 | |
| 2073 | −:1081800002000180496E7374616C6C204C6F6F70DB | |
| 2074 | −:108190006261636B1F5072657373208020746F205F | |
| 2075 | −:1081A000737461727402000180204361626C652007 | |
| 2076 | −:1081B000746F2052656D6F74651F50726573732004 | |
| 2077 | −:1081C0008020746F20737461727402000180204CEF | |
| 2078 | −:1081D0006F63616C204C6F6F706261636B201F2056 | |
| 2079 | −:1081E0002052756E6E696E67202E2E2E0200018061 | |
| 2080 | −:1081F00052656D6F7465204C6F6F706261636B20A8 | |
| 2081 | −:108200001F202052756E6E696E67202E2E2E020082 | |
| 2082 | −:10821000018020496E74726E6C204C6F6F706261C9 | |
| 2083 | −:10822000636B1F202052756E6E696E67202E2E2E96 | |
| 2084 | −:10823000020001805472616E736D69742050617424 | |
| 2085 | −:108240007465726E1F202052756E6E696E67202EE7 | |
| 2086 | −:108250002E2E020001802020303A2027438000018A | |
| 2087 | −:10826000802020313A202743810001802020323AAB | |
| 2088 | −:10827000202743820001802020333A2027438300B7 | |
| 2089 | −:1082800001802020343A20274384000180202035BB | |
| 2090 | −:108290003A202743850001802020363A2027438654 | |
| 2091 | −:1082A0000001802020373A202743870001802020CA | |
| 2092 | −:1082B000383A202743880001802020393A2027437C | |
| 2093 | −:1082C000890001802031303A2027438A0001802034 | |
| 2094 | −:1082D00031313A2027438B0001802031323A202768 | |
| 2095 | −:1082E000438C0001802031333A2027438D000180E8 | |
| 2096 | −:1082F0002031343A2027438E0001802031353A2046 | |
| 2097 | −:1083000027438F002A2A204D61696E20204D656E1B | |
| 2098 | −:1083100075202A2A004D6F6E69746F72206120509B | |
| 2099 | −:108320006F7274004D6F6E69746F722061205369B3 | |
| 2100 | −:10833000676E616C00457374696D617465204350AC | |
| 2101 | −:108340005300446961676E6F7374696373004C6FA7 | |
| 2102 | −:1083500063616C204C6F6F706261636B0052656D7E | |
| 2103 | −:108360006F7465204C6F6F706261636B00496E744F | |
| 2104 | −:10837000726E6C204C6F6F706261636B005472613F | |
| 2105 | −:108380006E736D6974205061747465726E00426121 | |
| 2106 | −:10839000756420526174650044617461204269749F | |
| 2107 | −:1083A000730053746F702042697473005061726976 | |
| 2108 | −:1083B00074790044617461205061747465726E0058 | |
| 2109 | −:1083C000547820466C6F7720436F6E74726F6C0028 | |
| 2110 | −:1083D000506F7274204E756D6265720035300037D3 | |
| 2111 | −:1083E0003500313130003133342E35003135300035 | |
| 2112 | −:1083F00032303000333030003630300031323030FF | |
| 2113 | −:10840000003138303000323030300032343030001B | |
| 2114 | −:1084100033363030003438303000373230300039C5 | |
| 2115 | −:108420003630300031392C3230300033382C343093 | |
| 2116 | −:10843000300035362C3030300035372C36303000B7 | |
| 2117 | −:1084400036342C3030300037362C38303000313173 | |
| 2118 | −:10845000352C323030003720626974730038206266 | |
| 2119 | −:1084600069747300312073746F7020626974003115 | |
| 2120 | −:108470002E352073746F702062697473003220731C | |
| 2121 | −:10848000746F702062697473006E6F20706172691E | |
| 2122 | −:108490007479006F64642070617269747900657624 | |
| 2123 | −:1084A000656E207061726974790073706163652014 | |
| 2124 | −:1084B000706172697479006D61726B2070617269AC | |
| 2125 | −:1084C000747900436F6C756D6E7300426172626502 | |
| 2126 | −:1084D0007220506F6C650055555555552E2E2E0047 | |
| 2127 | −:1084E0004E6F6E6500586F6E2F586F66660043546E | |
| 2128 | −:1084F00053005072657373208020666F72206D6523 | |
| 2129 | −:108500006E750028636F756E74696E672E2E2E2946 | |
| 2130 | −:108510000000654E64204F6620436F4465000000F4 | |
| 2131 | −:10852000000000000000000000000000000000004B | |
| 2132 | −:10853000000000000000000000000000000000003B | |
| 2133 | −:10854000000000000000000000000000000000002B | |
| 2134 | −:10855000000000000000000000000000000000001B | |
| 2135 | −:10856000000000000000000000000000000000000B | |
| 2136 | −:1085700000000000000000000000000000000000FB | |
| 2137 | −:1085800000000000000000000000000000000000EB | |
| 2138 | −:1085900000000000000000000000000000000000DB | |
| 2139 | −:1085A00000000000000000000000000000000000CB | |
| 2140 | −:1085B00000000000000000000000000000000000BB | |
| 2141 | −:1085C00000000000000000000000000000000000AB | |
| 2142 | −:1085D000000000000000000000000000000000009B | |
| 2143 | −:1085E000000000000000000000000000000000008B | |
| 2144 | −:1085F000000000000000000000000000000000007B | |
| 2145 | −:00000001FF | |
| 2146 | −/* Intelliport II loadware */ | |
| 2147 | −/* -31232 bytes read from ff.lod */ | |
| @@ -84,7 +84,6 @@ header-y += capability.h · 83 unmodified lines | ||
| 84 | 84 | header-y += capi.h |
| 85 | 85 | header-y += cciss_defs.h |
| 86 | 86 | header-y += cciss_ioctl.h |
| 87 | −header-y += cdk.h | |
| 88 | 87 | header-y += cdrom.h |
| 89 | 88 | header-y += cgroupstats.h |
| 90 | 89 | header-y += chio.h |
| @@ -93,7 +92,6 @@ header-y += cn_proc.h · 2 unmodified lines | ||
| 93 | 92 | header-y += coda.h |
| 94 | 93 | header-y += coda_psdev.h |
| 95 | 94 | header-y += coff.h |
| 96 | −header-y += comstats.h | |
| 97 | 95 | header-y += connector.h |
| 98 | 96 | header-y += const.h |
| 99 | 97 | header-y += cramfs_fs.h |
| @@ -140,7 +138,6 @@ header-y += fuse.h · 40 unmodified lines | ||
| 140 | 138 | header-y += futex.h |
| 141 | 139 | header-y += gameport.h |
| 142 | 140 | header-y += gen_stats.h |
| 143 | −header-y += generic_serial.h | |
| 144 | 141 | header-y += genetlink.h |
| 145 | 142 | header-y += gfs2_ondisk.h |
| 146 | 143 | header-y += gigaset_dev.h |
| @@ -372,6 +369,7 @@ header-y += tipc.h · 225 unmodified lines | ||
| 372 | 369 | header-y += tipc_config.h |
| 373 | 370 | header-y += toshiba.h |
| 374 | 371 | header-y += tty.h |
| 372 | +header-y += tty_flags.h | |
| 375 | 373 | header-y += types.h |
| 376 | 374 | header-y += udf_fs_i.h |
| 377 | 375 | header-y += udp.h |
| @@ -205,7 +205,6 @@ struct amba_pl011_data { · 204 unmodified lines | ||
| 205 | 205 | void *dma_tx_param; |
| 206 | 206 | void (*init) (void); |
| 207 | 207 | void (*exit) (void); |
| 208 | − void (*reset) (void); | |
| 209 | 208 | }; |
| 210 | 209 | #endif |
| 211 | 210 | |
| @@ -1,292 +0,0 @@ | ||
| 1 | −/*****************************************************************************/ | |
| 2 | − | |
| 3 | −/* | |
| 4 | − * cd1400.h -- cd1400 UART hardware info. | |
| 5 | − * | |
| 6 | − * Copyright (C) 1996-1998 Stallion Technologies | |
| 7 | − * Copyright (C) 1994-1996 Greg Ungerer. | |
| 8 | − * | |
| 9 | − * This program is free software; you can redistribute it and/or modify | |
| 10 | − * it under the terms of the GNU General Public License as published by | |
| 11 | − * the Free Software Foundation; either version 2 of the License, or | |
| 12 | − * (at your option) any later version. | |
| 13 | − * | |
| 14 | − * This program is distributed in the hope that it will be useful, | |
| 15 | − * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 16 | − * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 17 | − * GNU General Public License for more details. | |
| 18 | − * | |
| 19 | − * You should have received a copy of the GNU General Public License | |
| 20 | − * along with this program; if not, write to the Free Software | |
| 21 | − * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |
| 22 | − */ | |
| 23 | − | |
| 24 | −/*****************************************************************************/ | |
| 25 | −#ifndef _CD1400_H | |
| 26 | −#define _CD1400_H | |
| 27 | −/*****************************************************************************/ | |
| 28 | − | |
| 29 | −/* | |
| 30 | − * Define the number of async ports per cd1400 uart chip. | |
| 31 | − */ | |
| 32 | −#define CD1400_PORTS 4 | |
| 33 | − | |
| 34 | −/* | |
| 35 | − * Define the cd1400 uarts internal FIFO sizes. | |
| 36 | − */ | |
| 37 | −#define CD1400_TXFIFOSIZE 12 | |
| 38 | −#define CD1400_RXFIFOSIZE 12 | |
| 39 | − | |
| 40 | −/* | |
| 41 | − * Local RX FIFO thresh hold level. Also define the RTS thresh hold | |
| 42 | − * based on the RX thresh hold. | |
| 43 | − */ | |
| 44 | −#define FIFO_RXTHRESHOLD 6 | |
| 45 | −#define FIFO_RTSTHRESHOLD 7 | |
| 46 | − | |
| 47 | −/*****************************************************************************/ | |
| 48 | − | |
| 49 | −/* | |
| 50 | − * Define the cd1400 register addresses. These are all the valid | |
| 51 | − * registers with the cd1400. Some are global, some virtual, some | |
| 52 | − * per port. | |
| 53 | − */ | |
| 54 | −#define GFRCR 0x40 | |
| 55 | −#define CAR 0x68 | |
| 56 | −#define GCR 0x4b | |
| 57 | −#define SVRR 0x67 | |
| 58 | −#define RICR 0x44 | |
| 59 | −#define TICR 0x45 | |
| 60 | −#define MICR 0x46 | |
| 61 | −#define RIR 0x6b | |
| 62 | −#define TIR 0x6a | |
| 63 | −#define MIR 0x69 | |
| 64 | −#define PPR 0x7e | |
| 65 | − | |
| 66 | −#define RIVR 0x43 | |
| 67 | −#define TIVR 0x42 | |
| 68 | −#define MIVR 0x41 | |
| 69 | −#define TDR 0x63 | |
| 70 | −#define RDSR 0x62 | |
| 71 | −#define MISR 0x4c | |
| 72 | −#define EOSRR 0x60 | |
| 73 | − | |
| 74 | −#define LIVR 0x18 | |
| 75 | −#define CCR 0x05 | |
| 76 | −#define SRER 0x06 | |
| 77 | −#define COR1 0x08 | |
| 78 | −#define COR2 0x09 | |
| 79 | −#define COR3 0x0a | |
| 80 | −#define COR4 0x1e | |
| 81 | −#define COR5 0x1f | |
| 82 | −#define CCSR 0x0b | |
| 83 | −#define RDCR 0x0e | |
| 84 | −#define SCHR1 0x1a | |
| 85 | −#define SCHR2 0x1b | |
| 86 | −#define SCHR3 0x1c | |
| 87 | −#define SCHR4 0x1d | |
| 88 | −#define SCRL 0x22 | |
| 89 | −#define SCRH 0x23 | |
| 90 | −#define LNC 0x24 | |
| 91 | −#define MCOR1 0x15 | |
| 92 | −#define MCOR2 0x16 | |
| 93 | −#define RTPR 0x21 | |
| 94 | −#define MSVR1 0x6c | |
| 95 | −#define MSVR2 0x6d | |
| 96 | −#define PSVR 0x6f | |
| 97 | −#define RBPR 0x78 | |
| 98 | −#define RCOR 0x7c | |
| 99 | −#define TBPR 0x72 | |
| 100 | −#define TCOR 0x76 | |
| 101 | − | |
| 102 | −/*****************************************************************************/ | |
| 103 | − | |
| 104 | −/* | |
| 105 | − * Define the set of baud rate clock divisors. | |
| 106 | − */ | |
| 107 | −#define CD1400_CLK0 8 | |
| 108 | −#define CD1400_CLK1 32 | |
| 109 | −#define CD1400_CLK2 128 | |
| 110 | −#define CD1400_CLK3 512 | |
| 111 | −#define CD1400_CLK4 2048 | |
| 112 | − | |
| 113 | −#define CD1400_NUMCLKS 5 | |
| 114 | − | |
| 115 | −/*****************************************************************************/ | |
| 116 | − | |
| 117 | −/* | |
| 118 | − * Define the clock pre-scalar value to be a 5 ms clock. This should be | |
| 119 | − * OK for now. It would probably be better to make it 10 ms, but we | |
| 120 | − * can't fit that divisor into 8 bits! | |
| 121 | − */ | |
| 122 | −#define PPR_SCALAR 244 | |
| 123 | − | |
| 124 | −/*****************************************************************************/ | |
| 125 | − | |
| 126 | −/* | |
| 127 | − * Define values used to set character size options. | |
| 128 | − */ | |
| 129 | −#define COR1_CHL5 0x00 | |
| 130 | −#define COR1_CHL6 0x01 | |
| 131 | −#define COR1_CHL7 0x02 | |
| 132 | −#define COR1_CHL8 0x03 | |
| 133 | − | |
| 134 | −/* | |
| 135 | − * Define values used to set the number of stop bits. | |
| 136 | − */ | |
| 137 | −#define COR1_STOP1 0x00 | |
| 138 | −#define COR1_STOP15 0x04 | |
| 139 | −#define COR1_STOP2 0x08 | |
| 140 | − | |
| 141 | −/* | |
| 142 | − * Define values used to set the parity scheme in use. | |
| 143 | − */ | |
| 144 | −#define COR1_PARNONE 0x00 | |
| 145 | −#define COR1_PARFORCE 0x20 | |
| 146 | −#define COR1_PARENB 0x40 | |
| 147 | −#define COR1_PARIGNORE 0x10 | |
| 148 | − | |
| 149 | −#define COR1_PARODD 0x80 | |
| 150 | −#define COR1_PAREVEN 0x00 | |
| 151 | − | |
| 152 | −#define COR2_IXM 0x80 | |
| 153 | −#define COR2_TXIBE 0x40 | |
| 154 | −#define COR2_ETC 0x20 | |
| 155 | −#define COR2_LLM 0x10 | |
| 156 | −#define COR2_RLM 0x08 | |
| 157 | −#define COR2_RTSAO 0x04 | |
| 158 | −#define COR2_CTSAE 0x02 | |
| 159 | − | |
| 160 | −#define COR3_SCDRNG 0x80 | |
| 161 | −#define COR3_SCD34 0x40 | |
| 162 | −#define COR3_FCT 0x20 | |
| 163 | −#define COR3_SCD12 0x10 | |
| 164 | − | |
| 165 | −/* | |
| 166 | − * Define values used by COR4. | |
| 167 | − */ | |
| 168 | −#define COR4_BRKINT 0x08 | |
| 169 | −#define COR4_IGNBRK 0x18 | |
| 170 | − | |
| 171 | −/*****************************************************************************/ | |
| 172 | − | |
| 173 | −/* | |
| 174 | − * Define the modem control register values. | |
| 175 | − * Note that the actual hardware is a little different to the conventional | |
| 176 | − * pin names on the cd1400. | |
| 177 | − */ | |
| 178 | −#define MSVR1_DTR 0x01 | |
| 179 | −#define MSVR1_DSR 0x10 | |
| 180 | −#define MSVR1_RI 0x20 | |
| 181 | −#define MSVR1_CTS 0x40 | |
| 182 | −#define MSVR1_DCD 0x80 | |
| 183 | − | |
| 184 | −#define MSVR2_RTS 0x02 | |
| 185 | −#define MSVR2_DSR 0x10 | |
| 186 | −#define MSVR2_RI 0x20 | |
| 187 | −#define MSVR2_CTS 0x40 | |
| 188 | −#define MSVR2_DCD 0x80 | |
| 189 | − | |
| 190 | −#define MCOR1_DCD 0x80 | |
| 191 | −#define MCOR1_CTS 0x40 | |
| 192 | −#define MCOR1_RI 0x20 | |
| 193 | −#define MCOR1_DSR 0x10 | |
| 194 | − | |
| 195 | −#define MCOR2_DCD 0x80 | |
| 196 | −#define MCOR2_CTS 0x40 | |
| 197 | −#define MCOR2_RI 0x20 | |
| 198 | −#define MCOR2_DSR 0x10 | |
| 199 | − | |
| 200 | −/*****************************************************************************/ | |
| 201 | − | |
| 202 | −/* | |
| 203 | − * Define the bits used with the service (interrupt) enable register. | |
| 204 | − */ | |
| 205 | −#define SRER_NNDT 0x01 | |
| 206 | −#define SRER_TXEMPTY 0x02 | |
| 207 | −#define SRER_TXDATA 0x04 | |
| 208 | −#define SRER_RXDATA 0x10 | |
| 209 | −#define SRER_MODEM 0x80 | |
| 210 | − | |
| 211 | −/*****************************************************************************/ | |
| 212 | − | |
| 213 | −/* | |
| 214 | − * Define operational commands for the command register. | |
| 215 | − */ | |
| 216 | −#define CCR_RESET 0x80 | |
| 217 | −#define CCR_CORCHANGE 0x4e | |
| 218 | −#define CCR_SENDCH 0x20 | |
| 219 | −#define CCR_CHANCTRL 0x10 | |
| 220 | − | |
| 221 | −#define CCR_TXENABLE (CCR_CHANCTRL | 0x08) | |
| 222 | −#define CCR_TXDISABLE (CCR_CHANCTRL | 0x04) | |
| 223 | −#define CCR_RXENABLE (CCR_CHANCTRL | 0x02) | |
| 224 | −#define CCR_RXDISABLE (CCR_CHANCTRL | 0x01) | |
| 225 | − | |
| 226 | −#define CCR_SENDSCHR1 (CCR_SENDCH | 0x01) | |
| 227 | −#define CCR_SENDSCHR2 (CCR_SENDCH | 0x02) | |
| 228 | −#define CCR_SENDSCHR3 (CCR_SENDCH | 0x03) | |
| 229 | −#define CCR_SENDSCHR4 (CCR_SENDCH | 0x04) | |
| 230 | − | |
| 231 | −#define CCR_RESETCHAN (CCR_RESET | 0x00) | |
| 232 | −#define CCR_RESETFULL (CCR_RESET | 0x01) | |
| 233 | −#define CCR_TXFLUSHFIFO (CCR_RESET | 0x02) | |
| 234 | − | |
| 235 | −#define CCR_MAXWAIT 10000 | |
| 236 | − | |
| 237 | −/*****************************************************************************/ | |
| 238 | − | |
| 239 | −/* | |
| 240 | − * Define the valid acknowledgement types (for hw ack cycle). | |
| 241 | − */ | |
| 242 | −#define ACK_TYPMASK 0x07 | |
| 243 | −#define ACK_TYPTX 0x02 | |
| 244 | −#define ACK_TYPMDM 0x01 | |
| 245 | −#define ACK_TYPRXGOOD 0x03 | |
| 246 | −#define ACK_TYPRXBAD 0x07 | |
| 247 | − | |
| 248 | −#define SVRR_RX 0x01 | |
| 249 | −#define SVRR_TX 0x02 | |
| 250 | −#define SVRR_MDM 0x04 | |
| 251 | − | |
| 252 | −#define ST_OVERRUN 0x01 | |
| 253 | −#define ST_FRAMING 0x02 | |
| 254 | −#define ST_PARITY 0x04 | |
| 255 | −#define ST_BREAK 0x08 | |
| 256 | −#define ST_SCHAR1 0x10 | |
| 257 | −#define ST_SCHAR2 0x20 | |
| 258 | −#define ST_SCHAR3 0x30 | |
| 259 | −#define ST_SCHAR4 0x40 | |
| 260 | −#define ST_RANGE 0x70 | |
| 261 | −#define ST_SCHARMASK 0x70 | |
| 262 | −#define ST_TIMEOUT 0x80 | |
| 263 | − | |
| 264 | −#define MISR_DCD 0x80 | |
| 265 | −#define MISR_CTS 0x40 | |
| 266 | −#define MISR_RI 0x20 | |
| 267 | −#define MISR_DSR 0x10 | |
| 268 | − | |
| 269 | −/*****************************************************************************/ | |
| 270 | − | |
| 271 | −/* | |
| 272 | − * Defines for the CCSR status register. | |
| 273 | − */ | |
| 274 | −#define CCSR_RXENABLED 0x80 | |
| 275 | −#define CCSR_RXFLOWON 0x40 | |
| 276 | −#define CCSR_RXFLOWOFF 0x20 | |
| 277 | −#define CCSR_TXENABLED 0x08 | |
| 278 | −#define CCSR_TXFLOWON 0x04 | |
| 279 | −#define CCSR_TXFLOWOFF 0x02 | |
| 280 | − | |
| 281 | −/*****************************************************************************/ | |
| 282 | − | |
| 283 | −/* | |
| 284 | − * Define the embedded commands. | |
| 285 | − */ | |
| 286 | −#define ETC_CMD 0x00 | |
| 287 | −#define ETC_STARTBREAK 0x81 | |
| 288 | −#define ETC_DELAY 0x82 | |
| 289 | −#define ETC_STOPBREAK 0x83 | |
| 290 | − | |
| 291 | −/*****************************************************************************/ | |
| 292 | −#endif | |
| @@ -1,486 +0,0 @@ | ||
| 1 | −/*****************************************************************************/ | |
| 2 | − | |
| 3 | −/* | |
| 4 | − * cdk.h -- CDK interface definitions. | |
| 5 | − * | |
| 6 | − * Copyright (C) 1996-1998 Stallion Technologies | |
| 7 | − * Copyright (C) 1994-1996 Greg Ungerer. | |
| 8 | − * | |
| 9 | − * This program is free software; you can redistribute it and/or modify | |
| 10 | − * it under the terms of the GNU General Public License as published by | |
| 11 | − * the Free Software Foundation; either version 2 of the License, or | |
| 12 | − * (at your option) any later version. | |
| 13 | − * | |
| 14 | − * This program is distributed in the hope that it will be useful, | |
| 15 | − * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 16 | − * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 17 | − * GNU General Public License for more details. | |
| 18 | − * | |
| 19 | − * You should have received a copy of the GNU General Public License | |
| 20 | − * along with this program; if not, write to the Free Software | |
| 21 | − * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |
| 22 | − */ | |
| 23 | − | |
| 24 | −/*****************************************************************************/ | |
| 25 | −#ifndef _CDK_H | |
| 26 | −#define _CDK_H | |
| 27 | −/*****************************************************************************/ | |
| 28 | − | |
| 29 | −#pragma pack(2) | |
| 30 | − | |
| 31 | −/* | |
| 32 | − * The following set of definitions is used to communicate with the | |
| 33 | − * shared memory interface of the Stallion intelligent multiport serial | |
| 34 | − * boards. The definitions in this file are taken directly from the | |
| 35 | − * document titled "Generic Stackable Interface, Downloader and | |
| 36 | − * Communications Development Kit". | |
| 37 | − */ | |
| 38 | − | |
| 39 | −/* | |
| 40 | − * Define the set of important shared memory addresses. These are | |
| 41 | − * required to initialize the board and get things started. All of these | |
| 42 | − * addresses are relative to the start of the shared memory. | |
| 43 | − */ | |
| 44 | −#define CDK_SIGADDR 0x200 | |
| 45 | −#define CDK_FEATADDR 0x280 | |
| 46 | −#define CDK_CDKADDR 0x300 | |
| 47 | −#define CDK_RDYADDR 0x262 | |
| 48 | − | |
| 49 | −#define CDK_ALIVEMARKER 13 | |
| 50 | − | |
| 51 | −/* | |
| 52 | − * On hardware power up the ROMs located on the EasyConnection 8/64 will | |
| 53 | − * fill out the following signature information into shared memory. This | |
| 54 | − * way the host system can quickly determine that the board is present | |
| 55 | − * and is operational. | |
| 56 | − */ | |
| 57 | −typedef struct cdkecpsig { | |
| 58 | − unsigned long magic; | |
| 59 | − unsigned short romver; | |
| 60 | − unsigned short cputype; | |
| 61 | − unsigned char panelid[8]; | |
| 62 | −} cdkecpsig_t; | |
| 63 | − | |
| 64 | −#define ECP_MAGIC 0x21504345 | |
| 65 | − | |
| 66 | −/* | |
| 67 | − * On hardware power up the ROMs located on the ONboard, Stallion and | |
| 68 | − * Brumbys will fill out the following signature information into shared | |
| 69 | − * memory. This way the host system can quickly determine that the board | |
| 70 | − * is present and is operational. | |
| 71 | − */ | |
| 72 | −typedef struct cdkonbsig { | |
| 73 | − unsigned short magic0; | |
| 74 | − unsigned short magic1; | |
| 75 | − unsigned short magic2; | |
| 76 | − unsigned short magic3; | |
| 77 | − unsigned short romver; | |
| 78 | − unsigned short memoff; | |
| 79 | − unsigned short memseg; | |
| 80 | − unsigned short amask0; | |
| 81 | − unsigned short pic; | |
| 82 | − unsigned short status; | |
| 83 | − unsigned short btype; | |
| 84 | − unsigned short clkticks; | |
| 85 | − unsigned short clkspeed; | |
| 86 | − unsigned short amask1; | |
| 87 | − unsigned short amask2; | |
| 88 | −} cdkonbsig_t; | |
| 89 | − | |
| 90 | −#define ONB_MAGIC0 0xf2a7 | |
| 91 | −#define ONB_MAGIC1 0xa149 | |
| 92 | −#define ONB_MAGIC2 0x6352 | |
| 93 | −#define ONB_MAGIC3 0xf121 | |
| 94 | − | |
| 95 | −/* | |
| 96 | − * Define the feature area structure. The feature area is the set of | |
| 97 | − * startup parameters used by the slave image when it starts executing. | |
| 98 | − * They allow for the specification of buffer sizes, debug trace, etc. | |
| 99 | − */ | |
| 100 | −typedef struct cdkfeature { | |
| 101 | − unsigned long debug; | |
| 102 | − unsigned long banner; | |
| 103 | − unsigned long etype; | |
| 104 | − unsigned long nrdevs; | |
| 105 | − unsigned long brdspec; | |
| 106 | − unsigned long txrqsize; | |
| 107 | − unsigned long rxrqsize; | |
| 108 | − unsigned long flags; | |
| 109 | −} cdkfeature_t; | |
| 110 | − | |
| 111 | −#define ETYP_DDK 0 | |
| 112 | −#define ETYP_CDK 1 | |
| 113 | − | |
| 114 | −/* | |
| 115 | − * Define the CDK header structure. This is the info that the slave | |
| 116 | − * environment sets up after it has been downloaded and started. It | |
| 117 | − * essentially provides a memory map for the shared memory interface. | |
| 118 | − */ | |
| 119 | −typedef struct cdkhdr { | |
| 120 | − unsigned short command; | |
| 121 | − unsigned short status; | |
| 122 | − unsigned short port; | |
| 123 | − unsigned short mode; | |
| 124 | − unsigned long cmd_buf[14]; | |
| 125 | − unsigned short alive_cnt; | |
| 126 | − unsigned short intrpt_mode; | |
| 127 | − unsigned char intrpt_id[8]; | |
| 128 | − unsigned char ver_release; | |
| 129 | − unsigned char ver_modification; | |
| 130 | − unsigned char ver_fix; | |
| 131 | − unsigned char deadman_restart; | |
| 132 | − unsigned short deadman; | |
| 133 | − unsigned short nrdevs; | |
| 134 | − unsigned long memp; | |
| 135 | − unsigned long hostp; | |
| 136 | − unsigned long slavep; | |
| 137 | − unsigned char hostreq; | |
| 138 | − unsigned char slavereq; | |
| 139 | − unsigned char cmd_reserved[30]; | |
| 140 | −} cdkhdr_t; | |
| 141 | − | |
| 142 | −#define MODE_DDK 0 | |
| 143 | −#define MODE_CDK 1 | |
| 144 | − | |
| 145 | −#define IMD_INTR 0x0 | |
| 146 | −#define IMD_PPINTR 0x1 | |
| 147 | −#define IMD_POLL 0xff | |
| 148 | − | |
| 149 | −/* | |
| 150 | − * Define the memory mapping structure. This structure is pointed to by | |
| 151 | − * the memp field in the stlcdkhdr struct. As many as these structures | |
| 152 | − * as required are laid out in shared memory to define how the rest of | |
| 153 | − * shared memory is divided up. There will be one for each port. | |
| 154 | − */ | |
| 155 | −typedef struct cdkmem { | |
| 156 | − unsigned short dtype; | |
| 157 | − unsigned long offset; | |
| 158 | −} cdkmem_t; | |
| 159 | − | |
| 160 | −#define TYP_UNDEFINED 0x0 | |
| 161 | −#define TYP_ASYNCTRL 0x1 | |
| 162 | −#define TYP_ASYNC 0x20 | |
| 163 | −#define TYP_PARALLEL 0x40 | |
| 164 | −#define TYP_SYNCX21 0x60 | |
| 165 | − | |
| 166 | −/*****************************************************************************/ | |
| 167 | − | |
| 168 | −/* | |
| 169 | − * Following is a set of defines and structures used to actually deal | |
| 170 | − * with the serial ports on the board. Firstly is the set of commands | |
| 171 | − * that can be applied to ports. | |
| 172 | − */ | |
| 173 | −#define ASYCMD (((unsigned long) 'a') << 8) | |
| 174 | − | |
| 175 | −#define A_NULL (ASYCMD | 0) | |
| 176 | −#define A_FLUSH (ASYCMD | 1) | |
| 177 | −#define A_BREAK (ASYCMD | 2) | |
| 178 | −#define A_GETPORT (ASYCMD | 3) | |
| 179 | −#define A_SETPORT (ASYCMD | 4) | |
| 180 | −#define A_SETPORTF (ASYCMD | 5) | |
| 181 | −#define A_SETPORTFTX (ASYCMD | 6) | |
| 182 | −#define A_SETPORTFRX (ASYCMD | 7) | |
| 183 | −#define A_GETSIGNALS (ASYCMD | 8) | |
| 184 | −#define A_SETSIGNALS (ASYCMD | 9) | |
| 185 | −#define A_SETSIGNALSF (ASYCMD | 10) | |
| 186 | −#define A_SETSIGNALSFTX (ASYCMD | 11) | |
| 187 | −#define A_SETSIGNALSFRX (ASYCMD | 12) | |
| 188 | −#define A_GETNOTIFY (ASYCMD | 13) | |
| 189 | −#define A_SETNOTIFY (ASYCMD | 14) | |
| 190 | −#define A_NOTIFY (ASYCMD | 15) | |
| 191 | −#define A_PORTCTRL (ASYCMD | 16) | |
| 192 | −#define A_GETSTATS (ASYCMD | 17) | |
| 193 | −#define A_RQSTATE (ASYCMD | 18) | |
| 194 | −#define A_FLOWSTATE (ASYCMD | 19) | |
| 195 | −#define A_CLEARSTATS (ASYCMD | 20) | |
| 196 | − | |
| 197 | −/* | |
| 198 | − * Define those arguments used for simple commands. | |
| 199 | − */ | |
| 200 | −#define FLUSHRX 0x1 | |
| 201 | −#define FLUSHTX 0x2 | |
| 202 | − | |
| 203 | −#define BREAKON -1 | |
| 204 | −#define BREAKOFF -2 | |
| 205 | − | |
| 206 | −/* | |
| 207 | − * Define the port setting structure, and all those defines that go along | |
| 208 | − * with it. Basically this structure defines the characteristics of this | |
| 209 | − * port: baud rate, chars, parity, input/output char cooking etc. | |
| 210 | − */ | |
| 211 | −typedef struct asyport { | |
| 212 | − unsigned long baudout; | |
| 213 | − unsigned long baudin; | |
| 214 | − unsigned long iflag; | |
| 215 | − unsigned long oflag; | |
| 216 | − unsigned long lflag; | |
| 217 | − unsigned long pflag; | |
| 218 | − unsigned long flow; | |
| 219 | − unsigned long spare1; | |
| 220 | − unsigned short vtime; | |
| 221 | − unsigned short vmin; | |
| 222 | − unsigned short txlo; | |
| 223 | − unsigned short txhi; | |
| 224 | − unsigned short rxlo; | |
| 225 | − unsigned short rxhi; | |
| 226 | − unsigned short rxhog; | |
| 227 | − unsigned short spare2; | |
| 228 | − unsigned char csize; | |
| 229 | − unsigned char stopbs; | |
| 230 | − unsigned char parity; | |
| 231 | − unsigned char stopin; | |
| 232 | − unsigned char startin; | |
| 233 | − unsigned char stopout; | |
| 234 | − unsigned char startout; | |
| 235 | − unsigned char parmark; | |
| 236 | − unsigned char brkmark; | |
| 237 | − unsigned char cc[11]; | |
| 238 | −} asyport_t; | |
| 239 | − | |
| 240 | −#define PT_STOP1 0x0 | |
| 241 | −#define PT_STOP15 0x1 | |
| 242 | −#define PT_STOP2 0x2 | |
| 243 | − | |
| 244 | −#define PT_NOPARITY 0x0 | |
| 245 | −#define PT_ODDPARITY 0x1 | |
| 246 | −#define PT_EVENPARITY 0x2 | |
| 247 | −#define PT_MARKPARITY 0x3 | |
| 248 | −#define PT_SPACEPARITY 0x4 | |
| 249 | − | |
| 250 | −#define F_NONE 0x0 | |
| 251 | −#define F_IXON 0x1 | |
| 252 | −#define F_IXOFF 0x2 | |
| 253 | −#define F_IXANY 0x4 | |
| 254 | −#define F_IOXANY 0x8 | |
| 255 | −#define F_RTSFLOW 0x10 | |
| 256 | −#define F_CTSFLOW 0x20 | |
| 257 | −#define F_DTRFLOW 0x40 | |
| 258 | −#define F_DCDFLOW 0x80 | |
| 259 | −#define F_DSROFLOW 0x100 | |
| 260 | −#define F_DSRIFLOW 0x200 | |
| 261 | − | |
| 262 | −#define FI_NORX 0x1 | |
| 263 | −#define FI_RAW 0x2 | |
| 264 | −#define FI_ISTRIP 0x4 | |
| 265 | −#define FI_UCLC 0x8 | |
| 266 | −#define FI_INLCR 0x10 | |
| 267 | −#define FI_ICRNL 0x20 | |
| 268 | −#define FI_IGNCR 0x40 | |
| 269 | −#define FI_IGNBREAK 0x80 | |
| 270 | −#define FI_DSCRDBREAK 0x100 | |
| 271 | −#define FI_1MARKBREAK 0x200 | |
| 272 | −#define FI_2MARKBREAK 0x400 | |
| 273 | −#define FI_XCHNGBREAK 0x800 | |
| 274 | −#define FI_IGNRXERRS 0x1000 | |
| 275 | −#define FI_DSCDRXERRS 0x2000 | |
| 276 | −#define FI_1MARKRXERRS 0x4000 | |
| 277 | −#define FI_2MARKRXERRS 0x8000 | |
| 278 | −#define FI_XCHNGRXERRS 0x10000 | |
| 279 | −#define FI_DSCRDNULL 0x20000 | |
| 280 | − | |
| 281 | −#define FO_OLCUC 0x1 | |
| 282 | −#define FO_ONLCR 0x2 | |
| 283 | −#define FO_OOCRNL 0x4 | |
| 284 | −#define FO_ONOCR 0x8 | |
| 285 | −#define FO_ONLRET 0x10 | |
| 286 | −#define FO_ONL 0x20 | |
| 287 | −#define FO_OBS 0x40 | |
| 288 | −#define FO_OVT 0x80 | |
| 289 | −#define FO_OFF 0x100 | |
| 290 | −#define FO_OTAB1 0x200 | |
| 291 | −#define FO_OTAB2 0x400 | |
| 292 | −#define FO_OTAB3 0x800 | |
| 293 | −#define FO_OCR1 0x1000 | |
| 294 | −#define FO_OCR2 0x2000 | |
| 295 | −#define FO_OCR3 0x4000 | |
| 296 | −#define FO_OFILL 0x8000 | |
| 297 | −#define FO_ODELL 0x10000 | |
| 298 | − | |
| 299 | −#define P_RTSLOCK 0x1 | |
| 300 | −#define P_CTSLOCK 0x2 | |
| 301 | −#define P_MAPRTS 0x4 | |
| 302 | −#define P_MAPCTS 0x8 | |
| 303 | −#define P_LOOPBACK 0x10 | |
| 304 | −#define P_DTRFOLLOW 0x20 | |
| 305 | −#define P_FAKEDCD 0x40 | |
| 306 | − | |
| 307 | −#define P_RXIMIN 0x10000 | |
| 308 | −#define P_RXITIME 0x20000 | |
| 309 | −#define P_RXTHOLD 0x40000 | |
| 310 | − | |
| 311 | −/* | |
| 312 | − * Define a structure to communicate serial port signal and data state | |
| 313 | − * information. | |
| 314 | − */ | |
| 315 | −typedef struct asysigs { | |
| 316 | − unsigned long data; | |
| 317 | − unsigned long signal; | |
| 318 | − unsigned long sigvalue; | |
| 319 | −} asysigs_t; | |
| 320 | − | |
| 321 | −#define DT_TXBUSY 0x1 | |
| 322 | −#define DT_TXEMPTY 0x2 | |
| 323 | −#define DT_TXLOW 0x4 | |
| 324 | −#define DT_TXHIGH 0x8 | |
| 325 | −#define DT_TXFULL 0x10 | |
| 326 | −#define DT_TXHOG 0x20 | |
| 327 | −#define DT_TXFLOWED 0x40 | |
| 328 | −#define DT_TXBREAK 0x80 | |
| 329 | − | |
| 330 | −#define DT_RXBUSY 0x100 | |
| 331 | −#define DT_RXEMPTY 0x200 | |
| 332 | −#define DT_RXLOW 0x400 | |
| 333 | −#define DT_RXHIGH 0x800 | |
| 334 | −#define DT_RXFULL 0x1000 | |
| 335 | −#define DT_RXHOG 0x2000 | |
| 336 | −#define DT_RXFLOWED 0x4000 | |
| 337 | −#define DT_RXBREAK 0x8000 | |
| 338 | − | |
| 339 | −#define SG_DTR 0x1 | |
| 340 | −#define SG_DCD 0x2 | |
| 341 | −#define SG_RTS 0x4 | |
| 342 | −#define SG_CTS 0x8 | |
| 343 | −#define SG_DSR 0x10 | |
| 344 | −#define SG_RI 0x20 | |
| 345 | − | |
| 346 | −/* | |
| 347 | − * Define the notification setting structure. This is used to tell the | |
| 348 | − * port what events we want to be informed about. Fields here use the | |
| 349 | − * same defines as for the asysigs structure above. | |
| 350 | − */ | |
| 351 | −typedef struct asynotify { | |
| 352 | − unsigned long ctrl; | |
| 353 | − unsigned long data; | |
| 354 | − unsigned long signal; | |
| 355 | − unsigned long sigvalue; | |
| 356 | −} asynotify_t; | |
| 357 | − | |
| 358 | −/* | |
| 359 | − * Define the port control structure. It is used to do fine grain | |
| 360 | − * control operations on the port. | |
| 361 | − */ | |
| 362 | −typedef struct { | |
| 363 | − unsigned long rxctrl; | |
| 364 | − unsigned long txctrl; | |
| 365 | − char rximdch; | |
| 366 | − char tximdch; | |
| 367 | − char spare1; | |
| 368 | − char spare2; | |
| 369 | −} asyctrl_t; | |
| 370 | − | |
| 371 | −#define CT_ENABLE 0x1 | |
| 372 | −#define CT_DISABLE 0x2 | |
| 373 | −#define CT_STOP 0x4 | |
| 374 | −#define CT_START 0x8 | |
| 375 | −#define CT_STARTFLOW 0x10 | |
| 376 | −#define CT_STOPFLOW 0x20 | |
| 377 | −#define CT_SENDCHR 0x40 | |
| 378 | − | |
| 379 | −/* | |
| 380 | − * Define the stats structure kept for each port. This is a useful set | |
| 381 | − * of data collected for each port on the slave. The A_GETSTATS command | |
| 382 | − * is used to retrieve this data from the slave. | |
| 383 | − */ | |
| 384 | −typedef struct asystats { | |
| 385 | − unsigned long opens; | |
| 386 | − unsigned long txchars; | |
| 387 | − unsigned long rxchars; | |
| 388 | − unsigned long txringq; | |
| 389 | − unsigned long rxringq; | |
| 390 | − unsigned long txmsgs; | |
| 391 | − unsigned long rxmsgs; | |
| 392 | − unsigned long txflushes; | |
| 393 | − unsigned long rxflushes; | |
| 394 | − unsigned long overruns; | |
| 395 | − unsigned long framing; | |
| 396 | − unsigned long parity; | |
| 397 | − unsigned long ringover; | |
| 398 | − unsigned long lost; | |
| 399 | − unsigned long rxstart; | |
| 400 | − unsigned long rxstop; | |
| 401 | − unsigned long txstart; | |
| 402 | − unsigned long txstop; | |
| 403 | − unsigned long dcdcnt; | |
| 404 | − unsigned long dtrcnt; | |
| 405 | − unsigned long ctscnt; | |
| 406 | − unsigned long rtscnt; | |
| 407 | − unsigned long dsrcnt; | |
| 408 | − unsigned long ricnt; | |
| 409 | − unsigned long txbreaks; | |
| 410 | − unsigned long rxbreaks; | |
| 411 | − unsigned long signals; | |
| 412 | − unsigned long state; | |
| 413 | − unsigned long hwid; | |
| 414 | −} asystats_t; | |
| 415 | − | |
| 416 | −/*****************************************************************************/ | |
| 417 | − | |
| 418 | −/* | |
| 419 | − * All command and control communication with a device on the slave is | |
| 420 | − * via a control block in shared memory. Each device has its own control | |
| 421 | − * block, defined by the following structure. The control block allows | |
| 422 | − * the host to open, close and control the device on the slave. | |
| 423 | − */ | |
| 424 | −typedef struct cdkctrl { | |
| 425 | − unsigned char open; | |
| 426 | − unsigned char close; | |
| 427 | − unsigned long openarg; | |
| 428 | − unsigned long closearg; | |
| 429 | − unsigned long cmd; | |
| 430 | − unsigned long status; | |
| 431 | − unsigned long args[32]; | |
| 432 | −} cdkctrl_t; | |
| 433 | − | |
| 434 | −/* | |
| 435 | − * Each device on the slave passes data to and from the host via a ring | |
| 436 | − * queue in shared memory. Define a ring queue structure to hold the | |
| 437 | − * vital information about each ring queue. Two ring queues will be | |
| 438 | − * allocated for each port, one for receive data and one for transmit | |
| 439 | − * data. | |
| 440 | − */ | |
| 441 | −typedef struct cdkasyrq { | |
| 442 | − unsigned long offset; | |
| 443 | − unsigned short size; | |
| 444 | − unsigned short head; | |
| 445 | − unsigned short tail; | |
| 446 | −} cdkasyrq_t; | |
| 447 | − | |
| 448 | −/* | |
| 449 | − * Each asynchronous port is defined in shared memory by the following | |
| 450 | − * structure. It contains a control block to command a device, and also | |
| 451 | − * the necessary data channel information as well. | |
| 452 | − */ | |
| 453 | −typedef struct cdkasy { | |
| 454 | − cdkctrl_t ctrl; | |
| 455 | − unsigned short notify; | |
| 456 | − asynotify_t changed; | |
| 457 | − unsigned short receive; | |
| 458 | − cdkasyrq_t rxq; | |
| 459 | − unsigned short transmit; | |
| 460 | − cdkasyrq_t txq; | |
| 461 | −} cdkasy_t; | |
| 462 | − | |
| 463 | −#pragma pack() | |
| 464 | − | |
| 465 | −/*****************************************************************************/ | |
| 466 | − | |
| 467 | −/* | |
| 468 | − * Define the set of ioctls used by the driver to do special things | |
| 469 | − * to the board. These include interrupting it, and initializing | |
| 470 | − * the driver after board startup and shutdown. | |
| 471 | − */ | |
| 472 | −#include <linux/ioctl.h> | |
| 473 | − | |
| 474 | −#define STL_BINTR _IO('s',20) | |
| 475 | −#define STL_BSTART _IO('s',21) | |
| 476 | −#define STL_BSTOP _IO('s',22) | |
| 477 | −#define STL_BRESET _IO('s',23) | |
| 478 | − | |
| 479 | −/* | |
| 480 | − * Define a set of ioctl extensions, used to get at special stuff. | |
| 481 | − */ | |
| 482 | −#define STL_GETPFLAG _IO('s',80) | |
| 483 | −#define STL_SETPFLAG _IO('s',81) | |
| 484 | − | |
| 485 | −/*****************************************************************************/ | |
| 486 | −#endif | |
| @@ -1,119 +0,0 @@ | ||
| 1 | −/*****************************************************************************/ | |
| 2 | − | |
| 3 | −/* | |
| 4 | − * comstats.h -- Serial Port Stats. | |
| 5 | − * | |
| 6 | − * Copyright (C) 1996-1998 Stallion Technologies | |
| 7 | − * Copyright (C) 1994-1996 Greg Ungerer. | |
| 8 | − * | |
| 9 | − * This program is free software; you can redistribute it and/or modify | |
| 10 | − * it under the terms of the GNU General Public License as published by | |
| 11 | − * the Free Software Foundation; either version 2 of the License, or | |
| 12 | − * (at your option) any later version. | |
| 13 | − * | |
| 14 | − * This program is distributed in the hope that it will be useful, | |
| 15 | − * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 16 | − * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 17 | − * GNU General Public License for more details. | |
| 18 | − * | |
| 19 | − * You should have received a copy of the GNU General Public License | |
| 20 | − * along with this program; if not, write to the Free Software | |
| 21 | − * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |
| 22 | − */ | |
| 23 | − | |
| 24 | −/*****************************************************************************/ | |
| 25 | −#ifndef _COMSTATS_H | |
| 26 | −#define _COMSTATS_H | |
| 27 | −/*****************************************************************************/ | |
| 28 | − | |
| 29 | −/* | |
| 30 | − * Serial port stats structure. The structure itself is UART | |
| 31 | − * independent, but some fields may be UART/driver specific (for | |
| 32 | − * example state). | |
| 33 | − */ | |
| 34 | − | |
| 35 | −typedef struct { | |
| 36 | − unsigned long brd; | |
| 37 | − unsigned long panel; | |
| 38 | − unsigned long port; | |
| 39 | − unsigned long hwid; | |
| 40 | − unsigned long type; | |
| 41 | − unsigned long txtotal; | |
| 42 | − unsigned long rxtotal; | |
| 43 | − unsigned long txbuffered; | |
| 44 | − unsigned long rxbuffered; | |
| 45 | − unsigned long rxoverrun; | |
| 46 | − unsigned long rxparity; | |
| 47 | − unsigned long rxframing; | |
| 48 | − unsigned long rxlost; | |
| 49 | − unsigned long txbreaks; | |
| 50 | − unsigned long rxbreaks; | |
| 51 | − unsigned long txxon; | |
| 52 | − unsigned long txxoff; | |
| 53 | − unsigned long rxxon; | |
| 54 | − unsigned long rxxoff; | |
| 55 | − unsigned long txctson; | |
| 56 | − unsigned long txctsoff; | |
| 57 | − unsigned long rxrtson; | |
| 58 | − unsigned long rxrtsoff; | |
| 59 | − unsigned long modem; | |
| 60 | − unsigned long state; | |
| 61 | − unsigned long flags; | |
| 62 | − unsigned long ttystate; | |
| 63 | − unsigned long cflags; | |
| 64 | − unsigned long iflags; | |
| 65 | − unsigned long oflags; | |
| 66 | − unsigned long lflags; | |
| 67 | − unsigned long signals; | |
| 68 | −} comstats_t; | |
| 69 | − | |
| 70 | − | |
| 71 | −/* | |
| 72 | − * Board stats structure. Returns useful info about the board. | |
| 73 | − */ | |
| 74 | − | |
| 75 | −#define COM_MAXPANELS 8 | |
| 76 | − | |
| 77 | −typedef struct { | |
| 78 | − unsigned long panel; | |
| 79 | − unsigned long type; | |
| 80 | − unsigned long hwid; | |
| 81 | − unsigned long nrports; | |
| 82 | −} companel_t; | |
| 83 | − | |
| 84 | −typedef struct { | |
| 85 | − unsigned long brd; | |
| 86 | − unsigned long type; | |
| 87 | − unsigned long hwid; | |
| 88 | − unsigned long state; | |
| 89 | − unsigned long ioaddr; | |
| 90 | − unsigned long ioaddr2; | |
| 91 | − unsigned long memaddr; | |
| 92 | − unsigned long irq; | |
| 93 | − unsigned long nrpanels; | |
| 94 | − unsigned long nrports; | |
| 95 | − companel_t panels[COM_MAXPANELS]; | |
| 96 | −} combrd_t; | |
| 97 | − | |
| 98 | − | |
| 99 | −/* | |
| 100 | − * Define the ioctl operations for stats stuff. | |
| 101 | − */ | |
| 102 | −#include <linux/ioctl.h> | |
| 103 | − | |
| 104 | −#define COM_GETPORTSTATS _IO('c',30) | |
| 105 | −#define COM_CLRPORTSTATS _IO('c',31) | |
| 106 | −#define COM_GETBRDSTATS _IO('c',32) | |
| 107 | − | |
| 108 | − | |
| 109 | −/* | |
| 110 | − * Define the set of ioctls that give user level access to the | |
| 111 | − * private port, panel and board structures. The argument required | |
| 112 | − * will be driver dependent! | |
| 113 | − */ | |
| 114 | −#define COM_READPORT _IO('c',40) | |
| 115 | −#define COM_READBOARD _IO('c',41) | |
| 116 | −#define COM_READPANEL _IO('c',42) | |
| 117 | − | |
| 118 | −/*****************************************************************************/ | |
| 119 | −#endif | |
| @@ -1,35 +0,0 @@ | ||
| 1 | −/* | |
| 2 | − * generic_serial.h | |
| 3 | − * | |
| 4 | − * Copyright (C) 1998 R.E.Wolff@BitWizard.nl | |
| 5 | − * | |
| 6 | − * written for the SX serial driver. | |
| 7 | − * | |
| 8 | − * Version 0.1 -- December, 1998. | |
| 9 | − */ | |
| 10 | − | |
| 11 | −#ifndef GENERIC_SERIAL_H | |
| 12 | −#define GENERIC_SERIAL_H | |
| 13 | − | |
| 14 | −#warning Use of this header is deprecated. | |
| 15 | −#warning Since nobody sets the constants defined here for you, you should not, in any case, use them. Including the header is thus pointless. | |
| 16 | − | |
| 17 | −/* Flags */ | |
| 18 | −/* Warning: serial.h defines some ASYNC_ flags, they say they are "only" | |
| 19 | − used in serial.c, but they are also used in all other serial drivers. | |
| 20 | − Make sure they don't clash with these here... */ | |
| 21 | −#define GS_TX_INTEN 0x00800000 | |
| 22 | −#define GS_RX_INTEN 0x00400000 | |
| 23 | −#define GS_ACTIVE 0x00200000 | |
| 24 | − | |
| 25 | −#define GS_TYPE_NORMAL 1 | |
| 26 | − | |
| 27 | −#define GS_DEBUG_FLUSH 0x00000001 | |
| 28 | −#define GS_DEBUG_BTR 0x00000002 | |
| 29 | −#define GS_DEBUG_TERMIOS 0x00000004 | |
| 30 | −#define GS_DEBUG_STUFF 0x00000008 | |
| 31 | −#define GS_DEBUG_CLOSE 0x00000010 | |
| 32 | −#define GS_DEBUG_FLOW 0x00000020 | |
| 33 | −#define GS_DEBUG_WRITE 0x00000040 | |
| 34 | − | |
| 35 | −#endif | |
| @@ -1,123 +0,0 @@ | ||
| 1 | −/*****************************************************************************/ | |
| 2 | − | |
| 3 | −/* | |
| 4 | − * istallion.h -- stallion intelligent multiport serial driver. | |
| 5 | − * | |
| 6 | − * Copyright (C) 1996-1998 Stallion Technologies | |
| 7 | − * Copyright (C) 1994-1996 Greg Ungerer. | |
| 8 | − * | |
| 9 | − * This program is free software; you can redistribute it and/or modify | |
| 10 | − * it under the terms of the GNU General Public License as published by | |
| 11 | − * the Free Software Foundation; either version 2 of the License, or | |
| 12 | − * (at your option) any later version. | |
| 13 | − * | |
| 14 | − * This program is distributed in the hope that it will be useful, | |
| 15 | − * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 16 | − * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 17 | − * GNU General Public License for more details. | |
| 18 | − * | |
| 19 | − * You should have received a copy of the GNU General Public License | |
| 20 | − * along with this program; if not, write to the Free Software | |
| 21 | − * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |
| 22 | − */ | |
| 23 | − | |
| 24 | −/*****************************************************************************/ | |
| 25 | −#ifndef _ISTALLION_H | |
| 26 | −#define _ISTALLION_H | |
| 27 | −/*****************************************************************************/ | |
| 28 | − | |
| 29 | −/* | |
| 30 | − * Define important driver constants here. | |
| 31 | − */ | |
| 32 | −#define STL_MAXBRDS 4 | |
| 33 | −#define STL_MAXPANELS 4 | |
| 34 | −#define STL_MAXPORTS 64 | |
| 35 | −#define STL_MAXCHANS (STL_MAXPORTS + 1) | |
| 36 | −#define STL_MAXDEVS (STL_MAXBRDS * STL_MAXPORTS) | |
| 37 | − | |
| 38 | − | |
| 39 | −/* | |
| 40 | − * Define a set of structures to hold all the board/panel/port info | |
| 41 | − * for our ports. These will be dynamically allocated as required at | |
| 42 | − * driver initialization time. | |
| 43 | − */ | |
| 44 | − | |
| 45 | −/* | |
| 46 | − * Port and board structures to hold status info about each object. | |
| 47 | − * The board structure contains pointers to structures for each port | |
| 48 | − * connected to it. Panels are not distinguished here, since | |
| 49 | − * communication with the slave board will always be on a per port | |
| 50 | − * basis. | |
| 51 | − */ | |
| 52 | −struct stliport { | |
| 53 | − unsigned long magic; | |
| 54 | − struct tty_port port; | |
| 55 | − unsigned int portnr; | |
| 56 | − unsigned int panelnr; | |
| 57 | − unsigned int brdnr; | |
| 58 | − unsigned long state; | |
| 59 | − unsigned int devnr; | |
| 60 | − int baud_base; | |
| 61 | − int custom_divisor; | |
| 62 | − int closing_wait; | |
| 63 | − int rc; | |
| 64 | − int argsize; | |
| 65 | − void *argp; | |
| 66 | − unsigned int rxmarkmsk; | |
| 67 | − wait_queue_head_t raw_wait; | |
| 68 | − struct asysigs asig; | |
| 69 | − unsigned long addr; | |
| 70 | − unsigned long rxoffset; | |
| 71 | − unsigned long txoffset; | |
| 72 | − unsigned long sigs; | |
| 73 | − unsigned long pflag; | |
| 74 | − unsigned int rxsize; | |
| 75 | − unsigned int txsize; | |
| 76 | − unsigned char reqbit; | |
| 77 | − unsigned char portidx; | |
| 78 | − unsigned char portbit; | |
| 79 | −}; | |
| 80 | − | |
| 81 | −/* | |
| 82 | − * Use a structure of function pointers to do board level operations. | |
| 83 | − * These include, enable/disable, paging shared memory, interrupting, etc. | |
| 84 | − */ | |
| 85 | −struct stlibrd { | |
| 86 | − unsigned long magic; | |
| 87 | − unsigned int brdnr; | |
| 88 | − unsigned int brdtype; | |
| 89 | − unsigned long state; | |
| 90 | − unsigned int nrpanels; | |
| 91 | − unsigned int nrports; | |
| 92 | − unsigned int nrdevs; | |
| 93 | − unsigned int iobase; | |
| 94 | − int iosize; | |
| 95 | − unsigned long memaddr; | |
| 96 | − void __iomem *membase; | |
| 97 | − unsigned long memsize; | |
| 98 | − int pagesize; | |
| 99 | − int hostoffset; | |
| 100 | − int slaveoffset; | |
| 101 | − int bitsize; | |
| 102 | − int enabval; | |
| 103 | − unsigned int panels[STL_MAXPANELS]; | |
| 104 | − int panelids[STL_MAXPANELS]; | |
| 105 | − void (*init)(struct stlibrd *brdp); | |
| 106 | − void (*enable)(struct stlibrd *brdp); | |
| 107 | − void (*reenable)(struct stlibrd *brdp); | |
| 108 | − void (*disable)(struct stlibrd *brdp); | |
| 109 | − void __iomem *(*getmemptr)(struct stlibrd *brdp, unsigned long offset, int line); | |
| 110 | − void (*intr)(struct stlibrd *brdp); | |
| 111 | − void (*reset)(struct stlibrd *brdp); | |
| 112 | − struct stliport *ports[STL_MAXPORTS]; | |
| 113 | −}; | |
| 114 | − | |
| 115 | − | |
| 116 | −/* | |
| 117 | − * Define MAGIC numbers used for above structures. | |
| 118 | − */ | |
| 119 | −#define STLI_PORTMAGIC 0xe671c7a1 | |
| 120 | −#define STLI_BOARDMAGIC 0x4bc6c825 | |
| 121 | − | |
| 122 | −/*****************************************************************************/ | |
| 123 | −#endif | |
| @@ -65,7 +65,6 @@ struct kbd_struct { · 64 unmodified lines | ||
| 65 | 65 | |
| 66 | 66 | extern int kbd_init(void); |
| 67 | 67 | |
| 68 | −extern unsigned char getledstate(void); | |
| 69 | 68 | extern void setledstate(struct kbd_struct *kbd, unsigned int led); |
| 70 | 69 | |
| 71 | 70 | extern int do_poke_blanked_console; |
| @@ -145,16 +144,4 @@ void compute_shiftstate(void); · 73 unmodified lines | ||
| 145 | 144 | |
| 146 | 145 | extern unsigned int keymap_count; |
| 147 | 146 | |
| 148 | −/* console.c */ | |
| 149 | − | |
| 150 | −static inline void con_schedule_flip(struct tty_struct *t) | |
| 151 | −{ | |
| 152 | − unsigned long flags; | |
| 153 | − spin_lock_irqsave(&t->buf.lock, flags); | |
| 154 | − if (t->buf.tail != NULL) | |
| 155 | − t->buf.tail->commit = t->buf.tail->used; | |
| 156 | − spin_unlock_irqrestore(&t->buf.lock, flags); | |
| 157 | − schedule_work(&t->buf.work); | |
| 158 | −} | |
| 159 | − | |
| 160 | 147 | #endif |
| @@ -0,0 +1,67 @@ | ||
| 1 | +/* | |
| 2 | + * Maxim (Dallas) MAX3107/8 serial driver | |
| 3 | + * | |
| 4 | + * Copyright (C) 2012 Alexander Shiyan <shc_work@mail.ru> | |
| 5 | + * | |
| 6 | + * Based on max3100.c, by Christian Pellegrin <chripell@evolware.org> | |
| 7 | + * Based on max3110.c, by Feng Tang <feng.tang@intel.com> | |
| 8 | + * Based on max3107.c, by Aavamobile | |
| 9 | + * | |
| 10 | + * This program is free software; you can redistribute it and/or modify | |
| 11 | + * it under the terms of the GNU General Public License as published by | |
| 12 | + * the Free Software Foundation; either version 2 of the License, or | |
| 13 | + * (at your option) any later version. | |
| 14 | + */ | |
| 15 | + | |
| 16 | +#ifndef _MAX310X_H_ | |
| 17 | +#define _MAX310X_H_ | |
| 18 | + | |
| 19 | +/* | |
| 20 | + * Example board initialization data: | |
| 21 | + * | |
| 22 | + * static struct max310x_pdata max3107_pdata = { | |
| 23 | + * .driver_flags = MAX310X_EXT_CLK, | |
| 24 | + * .uart_flags[0] = MAX310X_ECHO_SUPRESS | MAX310X_AUTO_DIR_CTRL, | |
| 25 | + * .frequency = 3686400, | |
| 26 | + * .gpio_base = -1, | |
| 27 | + * }; | |
| 28 | + * | |
| 29 | + * static struct spi_board_info spi_device_max3107[] = { | |
| 30 | + * { | |
| 31 | + * .modalias = "max3107", | |
| 32 | + * .irq = IRQ_EINT3, | |
| 33 | + * .bus_num = 1, | |
| 34 | + * .chip_select = 1, | |
| 35 | + * .platform_data = &max3107_pdata, | |
| 36 | + * }, | |
| 37 | + * }; | |
| 38 | + */ | |
| 39 | + | |
| 40 | +#define MAX310X_MAX_UARTS 1 | |
| 41 | + | |
| 42 | +/* MAX310X platform data structure */ | |
| 43 | +struct max310x_pdata { | |
| 44 | + /* Flags global to driver */ | |
| 45 | + const u8 driver_flags:2; | |
| 46 | +#define MAX310X_EXT_CLK (0x00000001) /* External clock enable */ | |
| 47 | +#define MAX310X_AUTOSLEEP (0x00000002) /* Enable AutoSleep mode */ | |
| 48 | + /* Flags global to UART port */ | |
| 49 | + const u8 uart_flags[MAX310X_MAX_UARTS]; | |
| 50 | +#define MAX310X_LOOPBACK (0x00000001) /* Loopback mode enable */ | |
| 51 | +#define MAX310X_ECHO_SUPRESS (0x00000002) /* Enable echo supress */ | |
| 52 | +#define MAX310X_AUTO_DIR_CTRL (0x00000004) /* Enable Auto direction | |
| 53 | + * control (RS-485) | |
| 54 | + */ | |
| 55 | + /* Frequency (extrenal clock or crystal) */ | |
| 56 | + const int frequency; | |
| 57 | + /* GPIO base number (can be negative) */ | |
| 58 | + const int gpio_base; | |
| 59 | + /* Called during startup */ | |
| 60 | + void (*init)(void); | |
| 61 | + /* Called before finish */ | |
| 62 | + void (*exit)(void); | |
| 63 | + /* Suspend callback */ | |
| 64 | + void (*suspend)(int do_suspend); | |
| 65 | +}; | |
| 66 | + | |
| 67 | +#endif | |
| @@ -0,0 +1,93 @@ | ||
| 1 | +/* | |
| 2 | + * NXP (Philips) SCC+++(SCN+++) serial driver | |
| 3 | + * | |
| 4 | + * Copyright (C) 2012 Alexander Shiyan <shc_work@mail.ru> | |
| 5 | + * | |
| 6 | + * Based on sc26xx.c, by Thomas Bogendörfer (tsbogend@alpha.franken.de) | |
| 7 | + * | |
| 8 | + * This program is free software; you can redistribute it and/or modify | |
| 9 | + * it under the terms of the GNU General Public License as published by | |
| 10 | + * the Free Software Foundation; either version 2 of the License, or | |
| 11 | + * (at your option) any later version. | |
| 12 | + */ | |
| 13 | + | |
| 14 | +#ifndef __SCCNXP_H | |
| 15 | +#define __SCCNXP_H | |
| 16 | + | |
| 17 | +#define SCCNXP_MAX_UARTS 2 | |
| 18 | + | |
| 19 | +/* Output lines */ | |
| 20 | +#define LINE_OP0 1 | |
| 21 | +#define LINE_OP1 2 | |
| 22 | +#define LINE_OP2 3 | |
| 23 | +#define LINE_OP3 4 | |
| 24 | +#define LINE_OP4 5 | |
| 25 | +#define LINE_OP5 6 | |
| 26 | +#define LINE_OP6 7 | |
| 27 | +#define LINE_OP7 8 | |
| 28 | + | |
| 29 | +/* Input lines */ | |
| 30 | +#define LINE_IP0 9 | |
| 31 | +#define LINE_IP1 10 | |
| 32 | +#define LINE_IP2 11 | |
| 33 | +#define LINE_IP3 12 | |
| 34 | +#define LINE_IP4 13 | |
| 35 | +#define LINE_IP5 14 | |
| 36 | +#define LINE_IP6 15 | |
| 37 | + | |
| 38 | +/* Signals */ | |
| 39 | +#define DTR_OP 0 /* DTR */ | |
| 40 | +#define RTS_OP 4 /* RTS */ | |
| 41 | +#define DSR_IP 8 /* DSR */ | |
| 42 | +#define CTS_IP 12 /* CTS */ | |
| 43 | +#define DCD_IP 16 /* DCD */ | |
| 44 | +#define RNG_IP 20 /* RNG */ | |
| 45 | + | |
| 46 | +#define DIR_OP 24 /* Special signal for control RS-485. | |
| 47 | + * Goes high when transmit, | |
| 48 | + * then goes low. | |
| 49 | + */ | |
| 50 | + | |
| 51 | +/* Routing control signal 'sig' to line 'line' */ | |
| 52 | +#define MCTRL_SIG(sig, line) ((line) << (sig)) | |
| 53 | + | |
| 54 | +/* | |
| 55 | + * Example board initialization data: | |
| 56 | + * | |
| 57 | + * static struct resource sc2892_resources[] = { | |
| 58 | + * DEFINE_RES_MEM(UART_PHYS_START, 0x10), | |
| 59 | + * DEFINE_RES_IRQ(IRQ_EXT2), | |
| 60 | + * }; | |
| 61 | + * | |
| 62 | + * static struct sccnxp_pdata sc2892_info = { | |
| 63 | + * .frequency = 3686400, | |
| 64 | + * .mctrl_cfg[0] = MCTRL_SIG(DIR_OP, LINE_OP0), | |
| 65 | + * .mctrl_cfg[1] = MCTRL_SIG(DIR_OP, LINE_OP1), | |
| 66 | + * }; | |
| 67 | + * | |
| 68 | + * static struct platform_device sc2892 = { | |
| 69 | + * .name = "sc2892", | |
| 70 | + * .id = -1, | |
| 71 | + * .resource = sc2892_resources, | |
| 72 | + * .num_resources = ARRAY_SIZE(sc2892_resources), | |
| 73 | + * .dev = { | |
| 74 | + * .platform_data = &sc2892_info, | |
| 75 | + * }, | |
| 76 | + * }; | |
| 77 | + */ | |
| 78 | + | |
| 79 | +/* SCCNXP platform data structure */ | |
| 80 | +struct sccnxp_pdata { | |
| 81 | + /* Frequency (extrenal clock or crystal) */ | |
| 82 | + int frequency; | |
| 83 | + /* Shift for A0 line */ | |
| 84 | + const u8 reg_shift; | |
| 85 | + /* Modem control lines configuration */ | |
| 86 | + const u32 mctrl_cfg[SCCNXP_MAX_UARTS]; | |
| 87 | + /* Called during startup */ | |
| 88 | + void (*init)(void); | |
| 89 | + /* Called before finish */ | |
| 90 | + void (*exit)(void); | |
| 91 | +}; | |
| 92 | + | |
| 93 | +#endif | |
| @@ -1,533 +0,0 @@ | ||
| 1 | −/*****************************************************************************/ | |
| 2 | − | |
| 3 | −/* | |
| 4 | − * sc26198.h -- SC26198 UART hardware info. | |
| 5 | − * | |
| 6 | − * Copyright (C) 1995-1998 Stallion Technologies | |
| 7 | − * | |
| 8 | − * This program is free software; you can redistribute it and/or modify | |
| 9 | − * it under the terms of the GNU General Public License as published by | |
| 10 | − * the Free Software Foundation; either version 2 of the License, or | |
| 11 | − * (at your option) any later version. | |
| 12 | − * | |
| 13 | − * This program is distributed in the hope that it will be useful, | |
| 14 | − * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 15 | − * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 16 | − * GNU General Public License for more details. | |
| 17 | − * | |
| 18 | − * You should have received a copy of the GNU General Public License | |
| 19 | − * along with this program; if not, write to the Free Software | |
| 20 | − * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |
| 21 | − */ | |
| 22 | − | |
| 23 | −/*****************************************************************************/ | |
| 24 | −#ifndef _SC26198_H | |
| 25 | −#define _SC26198_H | |
| 26 | −/*****************************************************************************/ | |
| 27 | − | |
| 28 | −/* | |
| 29 | − * Define the number of async ports per sc26198 uart device. | |
| 30 | − */ | |
| 31 | −#define SC26198_PORTS 8 | |
| 32 | − | |
| 33 | −/* | |
| 34 | − * Baud rate timing clocks. All derived from a master 14.7456 MHz clock. | |
| 35 | − */ | |
| 36 | −#define SC26198_MASTERCLOCK 14745600L | |
| 37 | −#define SC26198_DCLK (SC26198_MASTERCLOCK) | |
| 38 | −#define SC26198_CCLK (SC26198_MASTERCLOCK / 2) | |
| 39 | −#define SC26198_BCLK (SC26198_MASTERCLOCK / 4) | |
| 40 | − | |
| 41 | −/* | |
| 42 | − * Define internal FIFO sizes for the 26198 ports. | |
| 43 | − */ | |
| 44 | −#define SC26198_TXFIFOSIZE 16 | |
| 45 | −#define SC26198_RXFIFOSIZE 16 | |
| 46 | − | |
| 47 | −/*****************************************************************************/ | |
| 48 | − | |
| 49 | −/* | |
| 50 | − * Global register definitions. These registers are global to each 26198 | |
| 51 | − * device, not specific ports on it. | |
| 52 | − */ | |
| 53 | −#define TSTR 0x0d | |
| 54 | −#define GCCR 0x0f | |
| 55 | −#define ICR 0x1b | |
| 56 | −#define WDTRCR 0x1d | |
| 57 | −#define IVR 0x1f | |
| 58 | −#define BRGTRUA 0x84 | |
| 59 | −#define GPOSR 0x87 | |
| 60 | −#define GPOC 0x8b | |
| 61 | −#define UCIR 0x8c | |
| 62 | −#define CIR 0x8c | |
| 63 | −#define BRGTRUB 0x8d | |
| 64 | −#define GRXFIFO 0x8e | |
| 65 | −#define GTXFIFO 0x8e | |
| 66 | −#define GCCR2 0x8f | |
| 67 | −#define BRGTRLA 0x94 | |
| 68 | −#define GPOR 0x97 | |
| 69 | −#define GPOD 0x9b | |
| 70 | −#define BRGTCR 0x9c | |
| 71 | −#define GICR 0x9c | |
| 72 | −#define BRGTRLB 0x9d | |
| 73 | −#define GIBCR 0x9d | |
| 74 | −#define GITR 0x9f | |
| 75 | − | |
| 76 | −/* | |
| 77 | − * Per port channel registers. These are the register offsets within | |
| 78 | − * the port address space, so need to have the port address (0 to 7) | |
| 79 | − * inserted in bit positions 4:6. | |
| 80 | − */ | |
| 81 | −#define MR0 0x00 | |
| 82 | −#define MR1 0x01 | |
| 83 | −#define IOPCR 0x02 | |
| 84 | −#define BCRBRK 0x03 | |
| 85 | −#define BCRCOS 0x04 | |
| 86 | −#define BCRX 0x06 | |
| 87 | −#define BCRA 0x07 | |
| 88 | −#define XONCR 0x08 | |
| 89 | −#define XOFFCR 0x09 | |
| 90 | −#define ARCR 0x0a | |
| 91 | −#define RXCSR 0x0c | |
| 92 | −#define TXCSR 0x0e | |
| 93 | −#define MR2 0x80 | |
| 94 | −#define SR 0x81 | |
| 95 | −#define SCCR 0x81 | |
| 96 | −#define ISR 0x82 | |
| 97 | −#define IMR 0x82 | |
| 98 | −#define TXFIFO 0x83 | |
| 99 | −#define RXFIFO 0x83 | |
| 100 | −#define IPR 0x84 | |
| 101 | −#define IOPIOR 0x85 | |
| 102 | −#define XISR 0x86 | |
| 103 | − | |
| 104 | −/* | |
| 105 | − * For any given port calculate the address to use to access a specified | |
| 106 | − * register. This is only used for unusual access, mostly this is done | |
| 107 | − * through the assembler access routines. | |
| 108 | − */ | |
| 109 | −#define SC26198_PORTREG(port,reg) ((((port) & 0x07) << 4) | (reg)) | |
| 110 | − | |
| 111 | −/*****************************************************************************/ | |
| 112 | − | |
| 113 | −/* | |
| 114 | − * Global configuration control register bit definitions. | |
| 115 | − */ | |
| 116 | −#define GCCR_NOACK 0x00 | |
| 117 | −#define GCCR_IVRACK 0x02 | |
| 118 | −#define GCCR_IVRCHANACK 0x04 | |
| 119 | −#define GCCR_IVRTYPCHANACK 0x06 | |
| 120 | −#define GCCR_ASYNCCYCLE 0x00 | |
| 121 | −#define GCCR_SYNCCYCLE 0x40 | |
| 122 | − | |
| 123 | −/*****************************************************************************/ | |
| 124 | − | |
| 125 | −/* | |
| 126 | − * Mode register 0 bit definitions. | |
| 127 | − */ | |
| 128 | −#define MR0_ADDRNONE 0x00 | |
| 129 | −#define MR0_AUTOWAKE 0x01 | |
| 130 | −#define MR0_AUTODOZE 0x02 | |
| 131 | −#define MR0_AUTOWAKEDOZE 0x03 | |
| 132 | −#define MR0_SWFNONE 0x00 | |
| 133 | −#define MR0_SWFTX 0x04 | |
| 134 | −#define MR0_SWFRX 0x08 | |
| 135 | −#define MR0_SWFRXTX 0x0c | |
| 136 | −#define MR0_TXMASK 0x30 | |
| 137 | −#define MR0_TXEMPTY 0x00 | |
| 138 | −#define MR0_TXHIGH 0x10 | |
| 139 | −#define MR0_TXHALF 0x20 | |
| 140 | −#define MR0_TXRDY 0x00 | |
| 141 | −#define MR0_ADDRNT 0x00 | |
| 142 | −#define MR0_ADDRT 0x40 | |
| 143 | −#define MR0_SWFNT 0x00 | |
| 144 | −#define MR0_SWFT 0x80 | |
| 145 | − | |
| 146 | −/* | |
| 147 | − * Mode register 1 bit definitions. | |
| 148 | − */ | |
| 149 | −#define MR1_CS5 0x00 | |
| 150 | −#define MR1_CS6 0x01 | |
| 151 | −#define MR1_CS7 0x02 | |
| 152 | −#define MR1_CS8 0x03 | |
| 153 | −#define MR1_PAREVEN 0x00 | |
| 154 | −#define MR1_PARODD 0x04 | |
| 155 | −#define MR1_PARENB 0x00 | |
| 156 | −#define MR1_PARFORCE 0x08 | |
| 157 | −#define MR1_PARNONE 0x10 | |
| 158 | −#define MR1_PARSPECIAL 0x18 | |
| 159 | −#define MR1_ERRCHAR 0x00 | |
| 160 | −#define MR1_ERRBLOCK 0x20 | |
| 161 | −#define MR1_ISRUNMASKED 0x00 | |
| 162 | −#define MR1_ISRMASKED 0x40 | |
| 163 | −#define MR1_AUTORTS 0x80 | |
| 164 | − | |
| 165 | −/* | |
| 166 | − * Mode register 2 bit definitions. | |
| 167 | − */ | |
| 168 | −#define MR2_STOP1 0x00 | |
| 169 | −#define MR2_STOP15 0x01 | |
| 170 | −#define MR2_STOP2 0x02 | |
| 171 | −#define MR2_STOP916 0x03 | |
| 172 | −#define MR2_RXFIFORDY 0x00 | |
| 173 | −#define MR2_RXFIFOHALF 0x04 | |
| 174 | −#define MR2_RXFIFOHIGH 0x08 | |
| 175 | −#define MR2_RXFIFOFULL 0x0c | |
| 176 | −#define MR2_AUTOCTS 0x10 | |
| 177 | −#define MR2_TXRTS 0x20 | |
| 178 | −#define MR2_MODENORM 0x00 | |
| 179 | −#define MR2_MODEAUTOECHO 0x40 | |
| 180 | −#define MR2_MODELOOP 0x80 | |
| 181 | −#define MR2_MODEREMECHO 0xc0 | |
| 182 | − | |
| 183 | −/*****************************************************************************/ | |
| 184 | − | |
| 185 | −/* | |
| 186 | − * Baud Rate Generator (BRG) selector values. | |
| 187 | − */ | |
| 188 | −#define BRG_50 0x00 | |
| 189 | −#define BRG_75 0x01 | |
| 190 | −#define BRG_150 0x02 | |
| 191 | −#define BRG_200 0x03 | |
| 192 | −#define BRG_300 0x04 | |
| 193 | −#define BRG_450 0x05 | |
| 194 | −#define BRG_600 0x06 | |
| 195 | −#define BRG_900 0x07 | |
| 196 | −#define BRG_1200 0x08 | |
| 197 | −#define BRG_1800 0x09 | |
| 198 | −#define BRG_2400 0x0a | |
| 199 | −#define BRG_3600 0x0b | |
| 200 | −#define BRG_4800 0x0c | |
| 201 | −#define BRG_7200 0x0d | |
| 202 | −#define BRG_9600 0x0e | |
| 203 | −#define BRG_14400 0x0f | |
| 204 | −#define BRG_19200 0x10 | |
| 205 | −#define BRG_28200 0x11 | |
| 206 | −#define BRG_38400 0x12 | |
| 207 | −#define BRG_57600 0x13 | |
| 208 | −#define BRG_115200 0x14 | |
| 209 | −#define BRG_230400 0x15 | |
| 210 | −#define BRG_GIN0 0x16 | |
| 211 | −#define BRG_GIN1 0x17 | |
| 212 | −#define BRG_CT0 0x18 | |
| 213 | −#define BRG_CT1 0x19 | |
| 214 | −#define BRG_RX2TX316 0x1b | |
| 215 | −#define BRG_RX2TX31 0x1c | |
| 216 | − | |
| 217 | −#define SC26198_MAXBAUD 921600 | |
| 218 | − | |
| 219 | −/*****************************************************************************/ | |
| 220 | − | |
| 221 | −/* | |
| 222 | − * Command register command definitions. | |
| 223 | − */ | |
| 224 | −#define CR_NULL 0x04 | |
| 225 | −#define CR_ADDRNORMAL 0x0c | |
| 226 | −#define CR_RXRESET 0x14 | |
| 227 | −#define CR_TXRESET 0x1c | |
| 228 | −#define CR_CLEARRXERR 0x24 | |
| 229 | −#define CR_BREAKRESET 0x2c | |
| 230 | −#define CR_TXSTARTBREAK 0x34 | |
| 231 | −#define CR_TXSTOPBREAK 0x3c | |
| 232 | −#define CR_RTSON 0x44 | |
| 233 | −#define CR_RTSOFF 0x4c | |
| 234 | −#define CR_ADDRINIT 0x5c | |
| 235 | −#define CR_RXERRBLOCK 0x6c | |
| 236 | −#define CR_TXSENDXON 0x84 | |
| 237 | −#define CR_TXSENDXOFF 0x8c | |
| 238 | −#define CR_GANGXONSET 0x94 | |
| 239 | −#define CR_GANGXOFFSET 0x9c | |
| 240 | −#define CR_GANGXONINIT 0xa4 | |
| 241 | −#define CR_GANGXOFFINIT 0xac | |
| 242 | −#define CR_HOSTXON 0xb4 | |
| 243 | −#define CR_HOSTXOFF 0xbc | |
| 244 | −#define CR_CANCELXOFF 0xc4 | |
| 245 | −#define CR_ADDRRESET 0xdc | |
| 246 | −#define CR_RESETALLPORTS 0xf4 | |
| 247 | −#define CR_RESETALL 0xfc | |
| 248 | − | |
| 249 | −#define CR_RXENABLE 0x01 | |
| 250 | −#define CR_TXENABLE 0x02 | |
| 251 | − | |
| 252 | −/*****************************************************************************/ | |
| 253 | − | |
| 254 | −/* | |
| 255 | − * Channel status register. | |
| 256 | − */ | |
| 257 | −#define SR_RXRDY 0x01 | |
| 258 | −#define SR_RXFULL 0x02 | |
| 259 | −#define SR_TXRDY 0x04 | |
| 260 | −#define SR_TXEMPTY 0x08 | |
| 261 | −#define SR_RXOVERRUN 0x10 | |
| 262 | −#define SR_RXPARITY 0x20 | |
| 263 | −#define SR_RXFRAMING 0x40 | |
| 264 | −#define SR_RXBREAK 0x80 | |
| 265 | − | |
268 more lines aren’t shown here.
This diff is large: its 103 lines aren’t shown here.
This diff is large: its 158 lines aren’t shown here.
This diff is large: its 42 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 148 lines aren’t shown here.
This diff is large: its 188 lines aren’t shown here.
This diff is large: its 105 lines aren’t shown here.
This diff is large: its 79 lines aren’t shown here.
This diff is large: its 51 lines aren’t shown here.
This diff is large: its 32 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 707 lines aren’t shown here.
This diff is large: its 116 lines aren’t shown here.
This diff is large: its 109 lines aren’t shown here.