mos7840.c (53867B)
1// SPDX-License-Identifier: GPL-2.0+ 2/* 3 * Clean ups from Moschip version and a few ioctl implementations by: 4 * Paul B Schroeder <pschroeder "at" uplogix "dot" com> 5 * 6 * Originally based on drivers/usb/serial/io_edgeport.c which is: 7 * Copyright (C) 2000 Inside Out Networks, All rights reserved. 8 * Copyright (C) 2001-2002 Greg Kroah-Hartman <greg@kroah.com> 9 * 10 */ 11 12#include <linux/kernel.h> 13#include <linux/errno.h> 14#include <linux/slab.h> 15#include <linux/tty.h> 16#include <linux/tty_driver.h> 17#include <linux/tty_flip.h> 18#include <linux/module.h> 19#include <linux/serial.h> 20#include <linux/usb.h> 21#include <linux/usb/serial.h> 22#include <linux/uaccess.h> 23 24#define DRIVER_DESC "Moschip 7840/7820 USB Serial Driver" 25 26/* 27 * 16C50 UART register defines 28 */ 29 30#define LCR_BITS_5 0x00 /* 5 bits/char */ 31#define LCR_BITS_6 0x01 /* 6 bits/char */ 32#define LCR_BITS_7 0x02 /* 7 bits/char */ 33#define LCR_BITS_8 0x03 /* 8 bits/char */ 34#define LCR_BITS_MASK 0x03 /* Mask for bits/char field */ 35 36#define LCR_STOP_1 0x00 /* 1 stop bit */ 37#define LCR_STOP_1_5 0x04 /* 1.5 stop bits (if 5 bits/char) */ 38#define LCR_STOP_2 0x04 /* 2 stop bits (if 6-8 bits/char) */ 39#define LCR_STOP_MASK 0x04 /* Mask for stop bits field */ 40 41#define LCR_PAR_NONE 0x00 /* No parity */ 42#define LCR_PAR_ODD 0x08 /* Odd parity */ 43#define LCR_PAR_EVEN 0x18 /* Even parity */ 44#define LCR_PAR_MARK 0x28 /* Force parity bit to 1 */ 45#define LCR_PAR_SPACE 0x38 /* Force parity bit to 0 */ 46#define LCR_PAR_MASK 0x38 /* Mask for parity field */ 47 48#define LCR_SET_BREAK 0x40 /* Set Break condition */ 49#define LCR_DL_ENABLE 0x80 /* Enable access to divisor latch */ 50 51#define MCR_DTR 0x01 /* Assert DTR */ 52#define MCR_RTS 0x02 /* Assert RTS */ 53#define MCR_OUT1 0x04 /* Loopback only: Sets state of RI */ 54#define MCR_MASTER_IE 0x08 /* Enable interrupt outputs */ 55#define MCR_LOOPBACK 0x10 /* Set internal (digital) loopback mode */ 56#define MCR_XON_ANY 0x20 /* Enable any char to exit XOFF mode */ 57 58#define MOS7840_MSR_CTS 0x10 /* Current state of CTS */ 59#define MOS7840_MSR_DSR 0x20 /* Current state of DSR */ 60#define MOS7840_MSR_RI 0x40 /* Current state of RI */ 61#define MOS7840_MSR_CD 0x80 /* Current state of CD */ 62 63/* 64 * Defines used for sending commands to port 65 */ 66 67#define MOS_WDR_TIMEOUT 5000 /* default urb timeout */ 68 69#define MOS_PORT1 0x0200 70#define MOS_PORT2 0x0300 71#define MOS_VENREG 0x0000 72#define MOS_MAX_PORT 0x02 73#define MOS_WRITE 0x0E 74#define MOS_READ 0x0D 75 76/* Requests */ 77#define MCS_RD_RTYPE 0xC0 78#define MCS_WR_RTYPE 0x40 79#define MCS_RDREQ 0x0D 80#define MCS_WRREQ 0x0E 81#define MCS_CTRL_TIMEOUT 500 82#define VENDOR_READ_LENGTH (0x01) 83 84#define MAX_NAME_LEN 64 85 86#define ZLP_REG1 0x3A /* Zero_Flag_Reg1 58 */ 87#define ZLP_REG5 0x3E /* Zero_Flag_Reg5 62 */ 88 89/* For higher baud Rates use TIOCEXBAUD */ 90#define TIOCEXBAUD 0x5462 91 92/* 93 * Vendor id and device id defines 94 * 95 * NOTE: Do not add new defines, add entries directly to the id_table instead. 96 */ 97#define USB_VENDOR_ID_BANDB 0x0856 98#define BANDB_DEVICE_ID_USO9ML2_2 0xAC22 99#define BANDB_DEVICE_ID_USO9ML2_2P 0xBC00 100#define BANDB_DEVICE_ID_USO9ML2_4 0xAC24 101#define BANDB_DEVICE_ID_USO9ML2_4P 0xBC01 102#define BANDB_DEVICE_ID_US9ML2_2 0xAC29 103#define BANDB_DEVICE_ID_US9ML2_4 0xAC30 104#define BANDB_DEVICE_ID_USPTL4_2 0xAC31 105#define BANDB_DEVICE_ID_USPTL4_4 0xAC32 106#define BANDB_DEVICE_ID_USOPTL4_2 0xAC42 107#define BANDB_DEVICE_ID_USOPTL4_2P 0xBC02 108#define BANDB_DEVICE_ID_USOPTL4_4 0xAC44 109#define BANDB_DEVICE_ID_USOPTL4_4P 0xBC03 110 111/* Interrupt Routine Defines */ 112 113#define SERIAL_IIR_RLS 0x06 114#define SERIAL_IIR_MS 0x00 115 116/* 117 * Emulation of the bit mask on the LINE STATUS REGISTER. 118 */ 119#define SERIAL_LSR_DR 0x0001 120#define SERIAL_LSR_OE 0x0002 121#define SERIAL_LSR_PE 0x0004 122#define SERIAL_LSR_FE 0x0008 123#define SERIAL_LSR_BI 0x0010 124 125#define MOS_MSR_DELTA_CTS 0x10 126#define MOS_MSR_DELTA_DSR 0x20 127#define MOS_MSR_DELTA_RI 0x40 128#define MOS_MSR_DELTA_CD 0x80 129 130/* Serial Port register Address */ 131#define INTERRUPT_ENABLE_REGISTER ((__u16)(0x01)) 132#define FIFO_CONTROL_REGISTER ((__u16)(0x02)) 133#define LINE_CONTROL_REGISTER ((__u16)(0x03)) 134#define MODEM_CONTROL_REGISTER ((__u16)(0x04)) 135#define LINE_STATUS_REGISTER ((__u16)(0x05)) 136#define MODEM_STATUS_REGISTER ((__u16)(0x06)) 137#define SCRATCH_PAD_REGISTER ((__u16)(0x07)) 138#define DIVISOR_LATCH_LSB ((__u16)(0x00)) 139#define DIVISOR_LATCH_MSB ((__u16)(0x01)) 140 141#define CLK_MULTI_REGISTER ((__u16)(0x02)) 142#define CLK_START_VALUE_REGISTER ((__u16)(0x03)) 143#define GPIO_REGISTER ((__u16)(0x07)) 144 145#define SERIAL_LCR_DLAB ((__u16)(0x0080)) 146 147/* 148 * URB POOL related defines 149 */ 150#define NUM_URBS 16 /* URB Count */ 151#define URB_TRANSFER_BUFFER_SIZE 32 /* URB Size */ 152 153/* LED on/off milliseconds*/ 154#define LED_ON_MS 500 155#define LED_OFF_MS 500 156 157enum mos7840_flag { 158 MOS7840_FLAG_LED_BUSY, 159}; 160 161#define MCS_PORT_MASK GENMASK(2, 0) 162#define MCS_PORTS(nr) ((nr) & MCS_PORT_MASK) 163#define MCS_LED BIT(3) 164 165#define MCS_DEVICE(vid, pid, flags) \ 166 USB_DEVICE((vid), (pid)), .driver_info = (flags) 167 168static const struct usb_device_id id_table[] = { 169 { MCS_DEVICE(0x0557, 0x2011, MCS_PORTS(4)) }, /* ATEN UC2324 */ 170 { MCS_DEVICE(0x0557, 0x7820, MCS_PORTS(2)) }, /* ATEN UC2322 */ 171 { MCS_DEVICE(0x110a, 0x2210, MCS_PORTS(2)) }, /* Moxa UPort 2210 */ 172 { MCS_DEVICE(0x9710, 0x7810, MCS_PORTS(1) | MCS_LED) }, /* ASIX MCS7810 */ 173 { MCS_DEVICE(0x9710, 0x7820, MCS_PORTS(2)) }, /* MosChip MCS7820 */ 174 { MCS_DEVICE(0x9710, 0x7840, MCS_PORTS(4)) }, /* MosChip MCS7840 */ 175 { MCS_DEVICE(0x9710, 0x7843, MCS_PORTS(3)) }, /* ASIX MCS7840 3 port */ 176 { USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USO9ML2_2) }, 177 { USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USO9ML2_2P) }, 178 { USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USO9ML2_4) }, 179 { USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USO9ML2_4P) }, 180 { USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_US9ML2_2) }, 181 { USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_US9ML2_4) }, 182 { USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USPTL4_2) }, 183 { USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USPTL4_4) }, 184 { USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_2) }, 185 { USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_2P) }, 186 { USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_4) }, 187 { USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_4P) }, 188 {} /* terminating entry */ 189}; 190MODULE_DEVICE_TABLE(usb, id_table); 191 192/* This structure holds all of the local port information */ 193 194struct moschip_port { 195 int port_num; /*Actual port number in the device(1,2,etc) */ 196 struct urb *read_urb; /* read URB for this port */ 197 __u8 shadowLCR; /* last LCR value received */ 198 __u8 shadowMCR; /* last MCR value received */ 199 struct usb_serial_port *port; /* loop back to the owner of this object */ 200 201 /* Offsets */ 202 __u8 SpRegOffset; 203 __u8 ControlRegOffset; 204 __u8 DcrRegOffset; 205 206 spinlock_t pool_lock; 207 struct urb *write_urb_pool[NUM_URBS]; 208 char busy[NUM_URBS]; 209 bool read_urb_busy; 210 211 /* For device(s) with LED indicator */ 212 bool has_led; 213 struct timer_list led_timer1; /* Timer for LED on */ 214 struct timer_list led_timer2; /* Timer for LED off */ 215 struct urb *led_urb; 216 struct usb_ctrlrequest *led_dr; 217 218 unsigned long flags; 219}; 220 221/* 222 * mos7840_set_reg_sync 223 * To set the Control register by calling usb_fill_control_urb function 224 * by passing usb_sndctrlpipe function as parameter. 225 */ 226 227static int mos7840_set_reg_sync(struct usb_serial_port *port, __u16 reg, 228 __u16 val) 229{ 230 struct usb_device *dev = port->serial->dev; 231 val = val & 0x00ff; 232 dev_dbg(&port->dev, "mos7840_set_reg_sync offset is %x, value %x\n", reg, val); 233 234 return usb_control_msg(dev, usb_sndctrlpipe(dev, 0), MCS_WRREQ, 235 MCS_WR_RTYPE, val, reg, NULL, 0, 236 MOS_WDR_TIMEOUT); 237} 238 239/* 240 * mos7840_get_reg_sync 241 * To set the Uart register by calling usb_fill_control_urb function by 242 * passing usb_rcvctrlpipe function as parameter. 243 */ 244 245static int mos7840_get_reg_sync(struct usb_serial_port *port, __u16 reg, 246 __u16 *val) 247{ 248 struct usb_device *dev = port->serial->dev; 249 int ret = 0; 250 u8 *buf; 251 252 buf = kmalloc(VENDOR_READ_LENGTH, GFP_KERNEL); 253 if (!buf) 254 return -ENOMEM; 255 256 ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), MCS_RDREQ, 257 MCS_RD_RTYPE, 0, reg, buf, VENDOR_READ_LENGTH, 258 MOS_WDR_TIMEOUT); 259 if (ret < VENDOR_READ_LENGTH) { 260 if (ret >= 0) 261 ret = -EIO; 262 goto out; 263 } 264 265 *val = buf[0]; 266 dev_dbg(&port->dev, "%s offset is %x, return val %x\n", __func__, reg, *val); 267out: 268 kfree(buf); 269 return ret; 270} 271 272/* 273 * mos7840_set_uart_reg 274 * To set the Uart register by calling usb_fill_control_urb function by 275 * passing usb_sndctrlpipe function as parameter. 276 */ 277 278static int mos7840_set_uart_reg(struct usb_serial_port *port, __u16 reg, 279 __u16 val) 280{ 281 282 struct usb_device *dev = port->serial->dev; 283 val = val & 0x00ff; 284 /* For the UART control registers, the application number need 285 to be Or'ed */ 286 if (port->serial->num_ports == 2 && port->port_number != 0) 287 val |= ((__u16)port->port_number + 2) << 8; 288 else 289 val |= ((__u16)port->port_number + 1) << 8; 290 dev_dbg(&port->dev, "%s application number is %x\n", __func__, val); 291 return usb_control_msg(dev, usb_sndctrlpipe(dev, 0), MCS_WRREQ, 292 MCS_WR_RTYPE, val, reg, NULL, 0, 293 MOS_WDR_TIMEOUT); 294 295} 296 297/* 298 * mos7840_get_uart_reg 299 * To set the Control register by calling usb_fill_control_urb function 300 * by passing usb_rcvctrlpipe function as parameter. 301 */ 302static int mos7840_get_uart_reg(struct usb_serial_port *port, __u16 reg, 303 __u16 *val) 304{ 305 struct usb_device *dev = port->serial->dev; 306 int ret = 0; 307 __u16 Wval; 308 u8 *buf; 309 310 buf = kmalloc(VENDOR_READ_LENGTH, GFP_KERNEL); 311 if (!buf) 312 return -ENOMEM; 313 314 /* Wval is same as application number */ 315 if (port->serial->num_ports == 2 && port->port_number != 0) 316 Wval = ((__u16)port->port_number + 2) << 8; 317 else 318 Wval = ((__u16)port->port_number + 1) << 8; 319 dev_dbg(&port->dev, "%s application number is %x\n", __func__, Wval); 320 ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), MCS_RDREQ, 321 MCS_RD_RTYPE, Wval, reg, buf, VENDOR_READ_LENGTH, 322 MOS_WDR_TIMEOUT); 323 if (ret < VENDOR_READ_LENGTH) { 324 if (ret >= 0) 325 ret = -EIO; 326 goto out; 327 } 328 *val = buf[0]; 329out: 330 kfree(buf); 331 return ret; 332} 333 334static void mos7840_dump_serial_port(struct usb_serial_port *port, 335 struct moschip_port *mos7840_port) 336{ 337 338 dev_dbg(&port->dev, "SpRegOffset is %2x\n", mos7840_port->SpRegOffset); 339 dev_dbg(&port->dev, "ControlRegOffset is %2x\n", mos7840_port->ControlRegOffset); 340 dev_dbg(&port->dev, "DCRRegOffset is %2x\n", mos7840_port->DcrRegOffset); 341 342} 343 344/************************************************************************/ 345/************************************************************************/ 346/* U S B C A L L B A C K F U N C T I O N S */ 347/* U S B C A L L B A C K F U N C T I O N S */ 348/************************************************************************/ 349/************************************************************************/ 350 351static void mos7840_set_led_callback(struct urb *urb) 352{ 353 switch (urb->status) { 354 case 0: 355 /* Success */ 356 break; 357 case -ECONNRESET: 358 case -ENOENT: 359 case -ESHUTDOWN: 360 /* This urb is terminated, clean up */ 361 dev_dbg(&urb->dev->dev, "%s - urb shutting down: %d\n", 362 __func__, urb->status); 363 break; 364 default: 365 dev_dbg(&urb->dev->dev, "%s - nonzero urb status: %d\n", 366 __func__, urb->status); 367 } 368} 369 370static void mos7840_set_led_async(struct moschip_port *mcs, __u16 wval, 371 __u16 reg) 372{ 373 struct usb_device *dev = mcs->port->serial->dev; 374 struct usb_ctrlrequest *dr = mcs->led_dr; 375 376 dr->bRequestType = MCS_WR_RTYPE; 377 dr->bRequest = MCS_WRREQ; 378 dr->wValue = cpu_to_le16(wval); 379 dr->wIndex = cpu_to_le16(reg); 380 dr->wLength = cpu_to_le16(0); 381 382 usb_fill_control_urb(mcs->led_urb, dev, usb_sndctrlpipe(dev, 0), 383 (unsigned char *)dr, NULL, 0, mos7840_set_led_callback, NULL); 384 385 usb_submit_urb(mcs->led_urb, GFP_ATOMIC); 386} 387 388static void mos7840_set_led_sync(struct usb_serial_port *port, __u16 reg, 389 __u16 val) 390{ 391 struct usb_device *dev = port->serial->dev; 392 393 usb_control_msg(dev, usb_sndctrlpipe(dev, 0), MCS_WRREQ, MCS_WR_RTYPE, 394 val, reg, NULL, 0, MOS_WDR_TIMEOUT); 395} 396 397static void mos7840_led_off(struct timer_list *t) 398{ 399 struct moschip_port *mcs = from_timer(mcs, t, led_timer1); 400 401 /* Turn off LED */ 402 mos7840_set_led_async(mcs, 0x0300, MODEM_CONTROL_REGISTER); 403 mod_timer(&mcs->led_timer2, 404 jiffies + msecs_to_jiffies(LED_OFF_MS)); 405} 406 407static void mos7840_led_flag_off(struct timer_list *t) 408{ 409 struct moschip_port *mcs = from_timer(mcs, t, led_timer2); 410 411 clear_bit_unlock(MOS7840_FLAG_LED_BUSY, &mcs->flags); 412} 413 414static void mos7840_led_activity(struct usb_serial_port *port) 415{ 416 struct moschip_port *mos7840_port = usb_get_serial_port_data(port); 417 418 if (test_and_set_bit_lock(MOS7840_FLAG_LED_BUSY, &mos7840_port->flags)) 419 return; 420 421 mos7840_set_led_async(mos7840_port, 0x0301, MODEM_CONTROL_REGISTER); 422 mod_timer(&mos7840_port->led_timer1, 423 jiffies + msecs_to_jiffies(LED_ON_MS)); 424} 425 426/***************************************************************************** 427 * mos7840_bulk_in_callback 428 * this is the callback function for when we have received data on the 429 * bulk in endpoint. 430 *****************************************************************************/ 431 432static void mos7840_bulk_in_callback(struct urb *urb) 433{ 434 struct moschip_port *mos7840_port = urb->context; 435 struct usb_serial_port *port = mos7840_port->port; 436 int retval; 437 unsigned char *data; 438 int status = urb->status; 439 440 if (status) { 441 dev_dbg(&urb->dev->dev, "nonzero read bulk status received: %d\n", status); 442 mos7840_port->read_urb_busy = false; 443 return; 444 } 445 446 data = urb->transfer_buffer; 447 usb_serial_debug_data(&port->dev, __func__, urb->actual_length, data); 448 449 if (urb->actual_length) { 450 struct tty_port *tport = &mos7840_port->port->port; 451 tty_insert_flip_string(tport, data, urb->actual_length); 452 tty_flip_buffer_push(tport); 453 port->icount.rx += urb->actual_length; 454 dev_dbg(&port->dev, "icount.rx is %d:\n", port->icount.rx); 455 } 456 457 if (mos7840_port->has_led) 458 mos7840_led_activity(port); 459 460 mos7840_port->read_urb_busy = true; 461 retval = usb_submit_urb(mos7840_port->read_urb, GFP_ATOMIC); 462 463 if (retval) { 464 dev_dbg(&port->dev, "usb_submit_urb(read bulk) failed, retval = %d\n", retval); 465 mos7840_port->read_urb_busy = false; 466 } 467} 468 469/***************************************************************************** 470 * mos7840_bulk_out_data_callback 471 * this is the callback function for when we have finished sending 472 * serial data on the bulk out endpoint. 473 *****************************************************************************/ 474 475static void mos7840_bulk_out_data_callback(struct urb *urb) 476{ 477 struct moschip_port *mos7840_port = urb->context; 478 struct usb_serial_port *port = mos7840_port->port; 479 int status = urb->status; 480 unsigned long flags; 481 int i; 482 483 spin_lock_irqsave(&mos7840_port->pool_lock, flags); 484 for (i = 0; i < NUM_URBS; i++) { 485 if (urb == mos7840_port->write_urb_pool[i]) { 486 mos7840_port->busy[i] = 0; 487 break; 488 } 489 } 490 spin_unlock_irqrestore(&mos7840_port->pool_lock, flags); 491 492 if (status) { 493 dev_dbg(&port->dev, "nonzero write bulk status received:%d\n", status); 494 return; 495 } 496 497 tty_port_tty_wakeup(&port->port); 498 499} 500 501/************************************************************************/ 502/* D R I V E R T T Y I N T E R F A C E F U N C T I O N S */ 503/************************************************************************/ 504 505/***************************************************************************** 506 * mos7840_open 507 * this function is called by the tty driver when a port is opened 508 * If successful, we return 0 509 * Otherwise we return a negative error number. 510 *****************************************************************************/ 511 512static int mos7840_open(struct tty_struct *tty, struct usb_serial_port *port) 513{ 514 struct moschip_port *mos7840_port = usb_get_serial_port_data(port); 515 struct usb_serial *serial = port->serial; 516 int response; 517 int j; 518 struct urb *urb; 519 __u16 Data; 520 int status; 521 522 usb_clear_halt(serial->dev, port->write_urb->pipe); 523 usb_clear_halt(serial->dev, port->read_urb->pipe); 524 525 /* Initialising the write urb pool */ 526 for (j = 0; j < NUM_URBS; ++j) { 527 urb = usb_alloc_urb(0, GFP_KERNEL); 528 mos7840_port->write_urb_pool[j] = urb; 529 if (!urb) 530 continue; 531 532 urb->transfer_buffer = kmalloc(URB_TRANSFER_BUFFER_SIZE, 533 GFP_KERNEL); 534 if (!urb->transfer_buffer) { 535 usb_free_urb(urb); 536 mos7840_port->write_urb_pool[j] = NULL; 537 continue; 538 } 539 } 540 541/***************************************************************************** 542 * Initialize MCS7840 -- Write Init values to corresponding Registers 543 * 544 * Register Index 545 * 1 : IER 546 * 2 : FCR 547 * 3 : LCR 548 * 4 : MCR 549 * 550 * 0x08 : SP1/2 Control Reg 551 *****************************************************************************/ 552 553 /* NEED to check the following Block */ 554 555 Data = 0x0; 556 status = mos7840_get_reg_sync(port, mos7840_port->SpRegOffset, &Data); 557 if (status < 0) { 558 dev_dbg(&port->dev, "Reading Spreg failed\n"); 559 goto err; 560 } 561 Data |= 0x80; 562 status = mos7840_set_reg_sync(port, mos7840_port->SpRegOffset, Data); 563 if (status < 0) { 564 dev_dbg(&port->dev, "writing Spreg failed\n"); 565 goto err; 566 } 567 568 Data &= ~0x80; 569 status = mos7840_set_reg_sync(port, mos7840_port->SpRegOffset, Data); 570 if (status < 0) { 571 dev_dbg(&port->dev, "writing Spreg failed\n"); 572 goto err; 573 } 574 /* End of block to be checked */ 575 576 Data = 0x0; 577 status = mos7840_get_reg_sync(port, mos7840_port->ControlRegOffset, 578 &Data); 579 if (status < 0) { 580 dev_dbg(&port->dev, "Reading Controlreg failed\n"); 581 goto err; 582 } 583 Data |= 0x08; /* Driver done bit */ 584 Data |= 0x20; /* rx_disable */ 585 status = mos7840_set_reg_sync(port, 586 mos7840_port->ControlRegOffset, Data); 587 if (status < 0) { 588 dev_dbg(&port->dev, "writing Controlreg failed\n"); 589 goto err; 590 } 591 /* do register settings here */ 592 /* Set all regs to the device default values. */ 593 /*********************************** 594 * First Disable all interrupts. 595 ***********************************/ 596 Data = 0x00; 597 status = mos7840_set_uart_reg(port, INTERRUPT_ENABLE_REGISTER, Data); 598 if (status < 0) { 599 dev_dbg(&port->dev, "disabling interrupts failed\n"); 600 goto err; 601 } 602 /* Set FIFO_CONTROL_REGISTER to the default value */ 603 Data = 0x00; 604 status = mos7840_set_uart_reg(port, FIFO_CONTROL_REGISTER, Data); 605 if (status < 0) { 606 dev_dbg(&port->dev, "Writing FIFO_CONTROL_REGISTER failed\n"); 607 goto err; 608 } 609 610 Data = 0xcf; 611 status = mos7840_set_uart_reg(port, FIFO_CONTROL_REGISTER, Data); 612 if (status < 0) { 613 dev_dbg(&port->dev, "Writing FIFO_CONTROL_REGISTER failed\n"); 614 goto err; 615 } 616 617 Data = 0x03; 618 status = mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, Data); 619 mos7840_port->shadowLCR = Data; 620 621 Data = 0x0b; 622 status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, Data); 623 mos7840_port->shadowMCR = Data; 624 625 Data = 0x00; 626 status = mos7840_get_uart_reg(port, LINE_CONTROL_REGISTER, &Data); 627 mos7840_port->shadowLCR = Data; 628 629 Data |= SERIAL_LCR_DLAB; /* data latch enable in LCR 0x80 */ 630 status = mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, Data); 631 632 Data = 0x0c; 633 status = mos7840_set_uart_reg(port, DIVISOR_LATCH_LSB, Data); 634 635 Data = 0x0; 636 status = mos7840_set_uart_reg(port, DIVISOR_LATCH_MSB, Data); 637 638 Data = 0x00; 639 status = mos7840_get_uart_reg(port, LINE_CONTROL_REGISTER, &Data); 640 641 Data = Data & ~SERIAL_LCR_DLAB; 642 status = mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, Data); 643 mos7840_port->shadowLCR = Data; 644 645 /* clearing Bulkin and Bulkout Fifo */ 646 Data = 0x0; 647 status = mos7840_get_reg_sync(port, mos7840_port->SpRegOffset, &Data); 648 649 Data = Data | 0x0c; 650 status = mos7840_set_reg_sync(port, mos7840_port->SpRegOffset, Data); 651 652 Data = Data & ~0x0c; 653 status = mos7840_set_reg_sync(port, mos7840_port->SpRegOffset, Data); 654 /* Finally enable all interrupts */ 655 Data = 0x0c; 656 status = mos7840_set_uart_reg(port, INTERRUPT_ENABLE_REGISTER, Data); 657 658 /* clearing rx_disable */ 659 Data = 0x0; 660 status = mos7840_get_reg_sync(port, mos7840_port->ControlRegOffset, 661 &Data); 662 Data = Data & ~0x20; 663 status = mos7840_set_reg_sync(port, mos7840_port->ControlRegOffset, 664 Data); 665 666 /* rx_negate */ 667 Data = 0x0; 668 status = mos7840_get_reg_sync(port, mos7840_port->ControlRegOffset, 669 &Data); 670 Data = Data | 0x10; 671 status = mos7840_set_reg_sync(port, mos7840_port->ControlRegOffset, 672 Data); 673 674 dev_dbg(&port->dev, "port number is %d\n", port->port_number); 675 dev_dbg(&port->dev, "minor number is %d\n", port->minor); 676 dev_dbg(&port->dev, "Bulkin endpoint is %d\n", port->bulk_in_endpointAddress); 677 dev_dbg(&port->dev, "BulkOut endpoint is %d\n", port->bulk_out_endpointAddress); 678 dev_dbg(&port->dev, "Interrupt endpoint is %d\n", port->interrupt_in_endpointAddress); 679 dev_dbg(&port->dev, "port's number in the device is %d\n", mos7840_port->port_num); 680 mos7840_port->read_urb = port->read_urb; 681 682 /* set up our bulk in urb */ 683 if ((serial->num_ports == 2) && (((__u16)port->port_number % 2) != 0)) { 684 usb_fill_bulk_urb(mos7840_port->read_urb, 685 serial->dev, 686 usb_rcvbulkpipe(serial->dev, 687 (port->bulk_in_endpointAddress) + 2), 688 port->bulk_in_buffer, 689 mos7840_port->read_urb->transfer_buffer_length, 690 mos7840_bulk_in_callback, mos7840_port); 691 } else { 692 usb_fill_bulk_urb(mos7840_port->read_urb, 693 serial->dev, 694 usb_rcvbulkpipe(serial->dev, 695 port->bulk_in_endpointAddress), 696 port->bulk_in_buffer, 697 mos7840_port->read_urb->transfer_buffer_length, 698 mos7840_bulk_in_callback, mos7840_port); 699 } 700 701 dev_dbg(&port->dev, "%s: bulkin endpoint is %d\n", __func__, port->bulk_in_endpointAddress); 702 mos7840_port->read_urb_busy = true; 703 response = usb_submit_urb(mos7840_port->read_urb, GFP_KERNEL); 704 if (response) { 705 dev_err(&port->dev, "%s - Error %d submitting control urb\n", 706 __func__, response); 707 mos7840_port->read_urb_busy = false; 708 } 709 710 /* initialize our port settings */ 711 /* Must set to enable ints! */ 712 mos7840_port->shadowMCR = MCR_MASTER_IE; 713 714 return 0; 715err: 716 for (j = 0; j < NUM_URBS; ++j) { 717 urb = mos7840_port->write_urb_pool[j]; 718 if (!urb) 719 continue; 720 kfree(urb->transfer_buffer); 721 usb_free_urb(urb); 722 } 723 return status; 724} 725 726/***************************************************************************** 727 * mos7840_chars_in_buffer 728 * this function is called by the tty driver when it wants to know how many 729 * bytes of data we currently have outstanding in the port (data that has 730 * been written, but hasn't made it out the port yet) 731 *****************************************************************************/ 732 733static unsigned int mos7840_chars_in_buffer(struct tty_struct *tty) 734{ 735 struct usb_serial_port *port = tty->driver_data; 736 struct moschip_port *mos7840_port = usb_get_serial_port_data(port); 737 int i; 738 unsigned int chars = 0; 739 unsigned long flags; 740 741 spin_lock_irqsave(&mos7840_port->pool_lock, flags); 742 for (i = 0; i < NUM_URBS; ++i) { 743 if (mos7840_port->busy[i]) { 744 struct urb *urb = mos7840_port->write_urb_pool[i]; 745 chars += urb->transfer_buffer_length; 746 } 747 } 748 spin_unlock_irqrestore(&mos7840_port->pool_lock, flags); 749 dev_dbg(&port->dev, "%s - returns %u\n", __func__, chars); 750 return chars; 751 752} 753 754/***************************************************************************** 755 * mos7840_close 756 * this function is called by the tty driver when a port is closed 757 *****************************************************************************/ 758 759static void mos7840_close(struct usb_serial_port *port) 760{ 761 struct moschip_port *mos7840_port = usb_get_serial_port_data(port); 762 int j; 763 __u16 Data; 764 765 for (j = 0; j < NUM_URBS; ++j) 766 usb_kill_urb(mos7840_port->write_urb_pool[j]); 767 768 /* Freeing Write URBs */ 769 for (j = 0; j < NUM_URBS; ++j) { 770 if (mos7840_port->write_urb_pool[j]) { 771 kfree(mos7840_port->write_urb_pool[j]->transfer_buffer); 772 usb_free_urb(mos7840_port->write_urb_pool[j]); 773 } 774 } 775 776 usb_kill_urb(mos7840_port->read_urb); 777 mos7840_port->read_urb_busy = false; 778 779 Data = 0x0; 780 mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, Data); 781 782 Data = 0x00; 783 mos7840_set_uart_reg(port, INTERRUPT_ENABLE_REGISTER, Data); 784} 785 786/***************************************************************************** 787 * mos7840_break 788 * this function sends a break to the port 789 *****************************************************************************/ 790static void mos7840_break(struct tty_struct *tty, int break_state) 791{ 792 struct usb_serial_port *port = tty->driver_data; 793 struct moschip_port *mos7840_port = usb_get_serial_port_data(port); 794 unsigned char data; 795 796 if (break_state == -1) 797 data = mos7840_port->shadowLCR | LCR_SET_BREAK; 798 else 799 data = mos7840_port->shadowLCR & ~LCR_SET_BREAK; 800 801 /* FIXME: no locking on shadowLCR anywhere in driver */ 802 mos7840_port->shadowLCR = data; 803 dev_dbg(&port->dev, "%s mos7840_port->shadowLCR is %x\n", __func__, mos7840_port->shadowLCR); 804 mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, 805 mos7840_port->shadowLCR); 806} 807 808/***************************************************************************** 809 * mos7840_write_room 810 * this function is called by the tty driver when it wants to know how many 811 * bytes of data we can accept for a specific port. 812 *****************************************************************************/ 813 814static unsigned int mos7840_write_room(struct tty_struct *tty) 815{ 816 struct usb_serial_port *port = tty->driver_data; 817 struct moschip_port *mos7840_port = usb_get_serial_port_data(port); 818 int i; 819 unsigned int room = 0; 820 unsigned long flags; 821 822 spin_lock_irqsave(&mos7840_port->pool_lock, flags); 823 for (i = 0; i < NUM_URBS; ++i) { 824 if (!mos7840_port->busy[i]) 825 room += URB_TRANSFER_BUFFER_SIZE; 826 } 827 spin_unlock_irqrestore(&mos7840_port->pool_lock, flags); 828 829 room = (room == 0) ? 0 : room - URB_TRANSFER_BUFFER_SIZE + 1; 830 dev_dbg(&mos7840_port->port->dev, "%s - returns %u\n", __func__, room); 831 return room; 832 833} 834 835/***************************************************************************** 836 * mos7840_write 837 * this function is called by the tty driver when data should be written to 838 * the port. 839 * If successful, we return the number of bytes written, otherwise we 840 * return a negative error number. 841 *****************************************************************************/ 842 843static int mos7840_write(struct tty_struct *tty, struct usb_serial_port *port, 844 const unsigned char *data, int count) 845{ 846 struct moschip_port *mos7840_port = usb_get_serial_port_data(port); 847 struct usb_serial *serial = port->serial; 848 int status; 849 int i; 850 int bytes_sent = 0; 851 int transfer_size; 852 unsigned long flags; 853 struct urb *urb; 854 /* __u16 Data; */ 855 const unsigned char *current_position = data; 856 857 /* try to find a free urb in the list */ 858 urb = NULL; 859 860 spin_lock_irqsave(&mos7840_port->pool_lock, flags); 861 for (i = 0; i < NUM_URBS; ++i) { 862 if (!mos7840_port->busy[i]) { 863 mos7840_port->busy[i] = 1; 864 urb = mos7840_port->write_urb_pool[i]; 865 dev_dbg(&port->dev, "URB:%d\n", i); 866 break; 867 } 868 } 869 spin_unlock_irqrestore(&mos7840_port->pool_lock, flags); 870 871 if (urb == NULL) { 872 dev_dbg(&port->dev, "%s - no more free urbs\n", __func__); 873 goto exit; 874 } 875 876 if (urb->transfer_buffer == NULL) { 877 urb->transfer_buffer = kmalloc(URB_TRANSFER_BUFFER_SIZE, 878 GFP_ATOMIC); 879 if (!urb->transfer_buffer) { 880 bytes_sent = -ENOMEM; 881 goto exit; 882 } 883 } 884 transfer_size = min(count, URB_TRANSFER_BUFFER_SIZE); 885 886 memcpy(urb->transfer_buffer, current_position, transfer_size); 887 888 /* fill urb with data and submit */ 889 if ((serial->num_ports == 2) && (((__u16)port->port_number % 2) != 0)) { 890 usb_fill_bulk_urb(urb, 891 serial->dev, 892 usb_sndbulkpipe(serial->dev, 893 (port->bulk_out_endpointAddress) + 2), 894 urb->transfer_buffer, 895 transfer_size, 896 mos7840_bulk_out_data_callback, mos7840_port); 897 } else { 898 usb_fill_bulk_urb(urb, 899 serial->dev, 900 usb_sndbulkpipe(serial->dev, 901 port->bulk_out_endpointAddress), 902 urb->transfer_buffer, 903 transfer_size, 904 mos7840_bulk_out_data_callback, mos7840_port); 905 } 906 907 dev_dbg(&port->dev, "bulkout endpoint is %d\n", port->bulk_out_endpointAddress); 908 909 if (mos7840_port->has_led) 910 mos7840_led_activity(port); 911 912 /* send it down the pipe */ 913 status = usb_submit_urb(urb, GFP_ATOMIC); 914 915 if (status) { 916 mos7840_port->busy[i] = 0; 917 dev_err_console(port, "%s - usb_submit_urb(write bulk) failed " 918 "with status = %d\n", __func__, status); 919 bytes_sent = status; 920 goto exit; 921 } 922 bytes_sent = transfer_size; 923 port->icount.tx += transfer_size; 924 dev_dbg(&port->dev, "icount.tx is %d:\n", port->icount.tx); 925exit: 926 return bytes_sent; 927 928} 929 930/***************************************************************************** 931 * mos7840_throttle 932 * this function is called by the tty driver when it wants to stop the data 933 * being read from the port. 934 *****************************************************************************/ 935 936static void mos7840_throttle(struct tty_struct *tty) 937{ 938 struct usb_serial_port *port = tty->driver_data; 939 struct moschip_port *mos7840_port = usb_get_serial_port_data(port); 940 int status; 941 942 /* if we are implementing XON/XOFF, send the stop character */ 943 if (I_IXOFF(tty)) { 944 unsigned char stop_char = STOP_CHAR(tty); 945 status = mos7840_write(tty, port, &stop_char, 1); 946 if (status <= 0) 947 return; 948 } 949 /* if we are implementing RTS/CTS, toggle that line */ 950 if (C_CRTSCTS(tty)) { 951 mos7840_port->shadowMCR &= ~MCR_RTS; 952 status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, 953 mos7840_port->shadowMCR); 954 if (status < 0) 955 return; 956 } 957} 958 959/***************************************************************************** 960 * mos7840_unthrottle 961 * this function is called by the tty driver when it wants to resume 962 * the data being read from the port (called after mos7840_throttle is 963 * called) 964 *****************************************************************************/ 965static void mos7840_unthrottle(struct tty_struct *tty) 966{ 967 struct usb_serial_port *port = tty->driver_data; 968 struct moschip_port *mos7840_port = usb_get_serial_port_data(port); 969 int status; 970 971 /* if we are implementing XON/XOFF, send the start character */ 972 if (I_IXOFF(tty)) { 973 unsigned char start_char = START_CHAR(tty); 974 status = mos7840_write(tty, port, &start_char, 1); 975 if (status <= 0) 976 return; 977 } 978 979 /* if we are implementing RTS/CTS, toggle that line */ 980 if (C_CRTSCTS(tty)) { 981 mos7840_port->shadowMCR |= MCR_RTS; 982 status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, 983 mos7840_port->shadowMCR); 984 if (status < 0) 985 return; 986 } 987} 988 989static int mos7840_tiocmget(struct tty_struct *tty) 990{ 991 struct usb_serial_port *port = tty->driver_data; 992 unsigned int result; 993 __u16 msr; 994 __u16 mcr; 995 int status; 996 997 status = mos7840_get_uart_reg(port, MODEM_STATUS_REGISTER, &msr); 998 if (status < 0) 999 return -EIO; 1000 status = mos7840_get_uart_reg(port, MODEM_CONTROL_REGISTER, &mcr); 1001 if (status < 0) 1002 return -EIO; 1003 result = ((mcr & MCR_DTR) ? TIOCM_DTR : 0) 1004 | ((mcr & MCR_RTS) ? TIOCM_RTS : 0) 1005 | ((mcr & MCR_LOOPBACK) ? TIOCM_LOOP : 0) 1006 | ((msr & MOS7840_MSR_CTS) ? TIOCM_CTS : 0) 1007 | ((msr & MOS7840_MSR_CD) ? TIOCM_CAR : 0) 1008 | ((msr & MOS7840_MSR_RI) ? TIOCM_RI : 0) 1009 | ((msr & MOS7840_MSR_DSR) ? TIOCM_DSR : 0); 1010 1011 dev_dbg(&port->dev, "%s - 0x%04X\n", __func__, result); 1012 1013 return result; 1014} 1015 1016static int mos7840_tiocmset(struct tty_struct *tty, 1017 unsigned int set, unsigned int clear) 1018{ 1019 struct usb_serial_port *port = tty->driver_data; 1020 struct moschip_port *mos7840_port = usb_get_serial_port_data(port); 1021 unsigned int mcr; 1022 int status; 1023 1024 /* FIXME: What locks the port registers ? */ 1025 mcr = mos7840_port->shadowMCR; 1026 if (clear & TIOCM_RTS) 1027 mcr &= ~MCR_RTS; 1028 if (clear & TIOCM_DTR) 1029 mcr &= ~MCR_DTR; 1030 if (clear & TIOCM_LOOP) 1031 mcr &= ~MCR_LOOPBACK; 1032 1033 if (set & TIOCM_RTS) 1034 mcr |= MCR_RTS; 1035 if (set & TIOCM_DTR) 1036 mcr |= MCR_DTR; 1037 if (set & TIOCM_LOOP) 1038 mcr |= MCR_LOOPBACK; 1039 1040 mos7840_port->shadowMCR = mcr; 1041 1042 status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, mcr); 1043 if (status < 0) { 1044 dev_dbg(&port->dev, "setting MODEM_CONTROL_REGISTER Failed\n"); 1045 return status; 1046 } 1047 1048 return 0; 1049} 1050 1051/***************************************************************************** 1052 * mos7840_calc_baud_rate_divisor 1053 * this function calculates the proper baud rate divisor for the specified 1054 * baud rate. 1055 *****************************************************************************/ 1056static int mos7840_calc_baud_rate_divisor(struct usb_serial_port *port, 1057 int baudRate, int *divisor, 1058 __u16 *clk_sel_val) 1059{ 1060 dev_dbg(&port->dev, "%s - %d\n", __func__, baudRate); 1061 1062 if (baudRate <= 115200) { 1063 *divisor = 115200 / baudRate; 1064 *clk_sel_val = 0x0; 1065 } 1066 if ((baudRate > 115200) && (baudRate <= 230400)) { 1067 *divisor = 230400 / baudRate; 1068 *clk_sel_val = 0x10; 1069 } else if ((baudRate > 230400) && (baudRate <= 403200)) { 1070 *divisor = 403200 / baudRate; 1071 *clk_sel_val = 0x20; 1072 } else if ((baudRate > 403200) && (baudRate <= 460800)) { 1073 *divisor = 460800 / baudRate; 1074 *clk_sel_val = 0x30; 1075 } else if ((baudRate > 460800) && (baudRate <= 806400)) { 1076 *divisor = 806400 / baudRate; 1077 *clk_sel_val = 0x40; 1078 } else if ((baudRate > 806400) && (baudRate <= 921600)) { 1079 *divisor = 921600 / baudRate; 1080 *clk_sel_val = 0x50; 1081 } else if ((baudRate > 921600) && (baudRate <= 1572864)) { 1082 *divisor = 1572864 / baudRate; 1083 *clk_sel_val = 0x60; 1084 } else if ((baudRate > 1572864) && (baudRate <= 3145728)) { 1085 *divisor = 3145728 / baudRate; 1086 *clk_sel_val = 0x70; 1087 } 1088 return 0; 1089} 1090 1091/***************************************************************************** 1092 * mos7840_send_cmd_write_baud_rate 1093 * this function sends the proper command to change the baud rate of the 1094 * specified port. 1095 *****************************************************************************/ 1096 1097static int mos7840_send_cmd_write_baud_rate(struct moschip_port *mos7840_port, 1098 int baudRate) 1099{ 1100 struct usb_serial_port *port = mos7840_port->port; 1101 int divisor = 0; 1102 int status; 1103 __u16 Data; 1104 __u16 clk_sel_val; 1105 1106 dev_dbg(&port->dev, "%s - baud = %d\n", __func__, baudRate); 1107 /* reset clk_uart_sel in spregOffset */ 1108 if (baudRate > 115200) { 1109#ifdef HW_flow_control 1110 /* NOTE: need to see the pther register to modify */ 1111 /* setting h/w flow control bit to 1 */ 1112 Data = 0x2b; 1113 mos7840_port->shadowMCR = Data; 1114 status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, 1115 Data); 1116 if (status < 0) { 1117 dev_dbg(&port->dev, "Writing spreg failed in set_serial_baud\n"); 1118 return -1; 1119 } 1120#endif 1121 1122 } else { 1123#ifdef HW_flow_control 1124 /* setting h/w flow control bit to 0 */ 1125 Data = 0xb; 1126 mos7840_port->shadowMCR = Data; 1127 status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, 1128 Data); 1129 if (status < 0) { 1130 dev_dbg(&port->dev, "Writing spreg failed in set_serial_baud\n"); 1131 return -1; 1132 } 1133#endif 1134 1135 } 1136 1137 if (1) { /* baudRate <= 115200) */ 1138 clk_sel_val = 0x0; 1139 Data = 0x0; 1140 status = mos7840_calc_baud_rate_divisor(port, baudRate, &divisor, 1141 &clk_sel_val); 1142 status = mos7840_get_reg_sync(port, mos7840_port->SpRegOffset, 1143 &Data); 1144 if (status < 0) { 1145 dev_dbg(&port->dev, "reading spreg failed in set_serial_baud\n"); 1146 return -1; 1147 } 1148 Data = (Data & 0x8f) | clk_sel_val; 1149 status = mos7840_set_reg_sync(port, mos7840_port->SpRegOffset, 1150 Data); 1151 if (status < 0) { 1152 dev_dbg(&port->dev, "Writing spreg failed in set_serial_baud\n"); 1153 return -1; 1154 } 1155 /* Calculate the Divisor */ 1156 1157 if (status) { 1158 dev_err(&port->dev, "%s - bad baud rate\n", __func__); 1159 return status; 1160 } 1161 /* Enable access to divisor latch */ 1162 Data = mos7840_port->shadowLCR | SERIAL_LCR_DLAB; 1163 mos7840_port->shadowLCR = Data; 1164 mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, Data); 1165 1166 /* Write the divisor */ 1167 Data = (unsigned char)(divisor & 0xff); 1168 dev_dbg(&port->dev, "set_serial_baud Value to write DLL is %x\n", Data); 1169 mos7840_set_uart_reg(port, DIVISOR_LATCH_LSB, Data); 1170 1171 Data = (unsigned char)((divisor & 0xff00) >> 8); 1172 dev_dbg(&port->dev, "set_serial_baud Value to write DLM is %x\n", Data); 1173 mos7840_set_uart_reg(port, DIVISOR_LATCH_MSB, Data); 1174 1175 /* Disable access to divisor latch */ 1176 Data = mos7840_port->shadowLCR & ~SERIAL_LCR_DLAB; 1177 mos7840_port->shadowLCR = Data; 1178 mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, Data); 1179 1180 } 1181 return status; 1182} 1183 1184/***************************************************************************** 1185 * mos7840_change_port_settings 1186 * This routine is called to set the UART on the device to match 1187 * the specified new settings. 1188 *****************************************************************************/ 1189 1190static void mos7840_change_port_settings(struct tty_struct *tty, 1191 struct moschip_port *mos7840_port, struct ktermios *old_termios) 1192{ 1193 struct usb_serial_port *port = mos7840_port->port; 1194 int baud; 1195 unsigned cflag; 1196 __u8 lData; 1197 __u8 lParity; 1198 __u8 lStop; 1199 int status; 1200 __u16 Data; 1201 1202 lData = LCR_BITS_8; 1203 lStop = LCR_STOP_1; 1204 lParity = LCR_PAR_NONE; 1205 1206 cflag = tty->termios.c_cflag; 1207 1208 /* Change the number of bits */ 1209 switch (cflag & CSIZE) { 1210 case CS5: 1211 lData = LCR_BITS_5; 1212 break; 1213 1214 case CS6: 1215 lData = LCR_BITS_6; 1216 break; 1217 1218 case CS7: 1219 lData = LCR_BITS_7; 1220 break; 1221 1222 default: 1223 case CS8: 1224 lData = LCR_BITS_8; 1225 break; 1226 } 1227 1228 /* Change the Parity bit */ 1229 if (cflag & PARENB) { 1230 if (cflag & PARODD) { 1231 lParity = LCR_PAR_ODD; 1232 dev_dbg(&port->dev, "%s - parity = odd\n", __func__); 1233 } else { 1234 lParity = LCR_PAR_EVEN; 1235 dev_dbg(&port->dev, "%s - parity = even\n", __func__); 1236 } 1237 1238 } else { 1239 dev_dbg(&port->dev, "%s - parity = none\n", __func__); 1240 } 1241 1242 if (cflag & CMSPAR) 1243 lParity = lParity | 0x20; 1244 1245 /* Change the Stop bit */ 1246 if (cflag & CSTOPB) { 1247 lStop = LCR_STOP_2; 1248 dev_dbg(&port->dev, "%s - stop bits = 2\n", __func__); 1249 } else { 1250 lStop = LCR_STOP_1; 1251 dev_dbg(&port->dev, "%s - stop bits = 1\n", __func__); 1252 } 1253 1254 /* Update the LCR with the correct value */ 1255 mos7840_port->shadowLCR &= 1256 ~(LCR_BITS_MASK | LCR_STOP_MASK | LCR_PAR_MASK); 1257 mos7840_port->shadowLCR |= (lData | lParity | lStop); 1258 1259 dev_dbg(&port->dev, "%s - mos7840_port->shadowLCR is %x\n", __func__, 1260 mos7840_port->shadowLCR); 1261 /* Disable Interrupts */ 1262 Data = 0x00; 1263 mos7840_set_uart_reg(port, INTERRUPT_ENABLE_REGISTER, Data); 1264 1265 Data = 0x00; 1266 mos7840_set_uart_reg(port, FIFO_CONTROL_REGISTER, Data); 1267 1268 Data = 0xcf; 1269 mos7840_set_uart_reg(port, FIFO_CONTROL_REGISTER, Data); 1270 1271 /* Send the updated LCR value to the mos7840 */ 1272 Data = mos7840_port->shadowLCR; 1273 1274 mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, Data); 1275 1276 Data = 0x00b; 1277 mos7840_port->shadowMCR = Data; 1278 mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, Data); 1279 Data = 0x00b; 1280 mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, Data); 1281 1282 /* set up the MCR register and send it to the mos7840 */ 1283 1284 mos7840_port->shadowMCR = MCR_MASTER_IE; 1285 if (cflag & CBAUD) 1286 mos7840_port->shadowMCR |= (MCR_DTR | MCR_RTS); 1287 1288 if (cflag & CRTSCTS) 1289 mos7840_port->shadowMCR |= (MCR_XON_ANY); 1290 else 1291 mos7840_port->shadowMCR &= ~(MCR_XON_ANY); 1292 1293 Data = mos7840_port->shadowMCR; 1294 mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, Data); 1295 1296 /* Determine divisor based on baud rate */ 1297 baud = tty_get_baud_rate(tty); 1298 1299 if (!baud) { 1300 /* pick a default, any default... */ 1301 dev_dbg(&port->dev, "%s", "Picked default baud...\n"); 1302 baud = 9600; 1303 } 1304 1305 dev_dbg(&port->dev, "%s - baud rate = %d\n", __func__, baud); 1306 status = mos7840_send_cmd_write_baud_rate(mos7840_port, baud); 1307 1308 /* Enable Interrupts */ 1309 Data = 0x0c; 1310 mos7840_set_uart_reg(port, INTERRUPT_ENABLE_REGISTER, Data); 1311 1312 if (!mos7840_port->read_urb_busy) { 1313 mos7840_port->read_urb_busy = true; 1314 status = usb_submit_urb(mos7840_port->read_urb, GFP_KERNEL); 1315 if (status) { 1316 dev_dbg(&port->dev, "usb_submit_urb(read bulk) failed, status = %d\n", 1317 status); 1318 mos7840_port->read_urb_busy = false; 1319 } 1320 } 1321 dev_dbg(&port->dev, "%s - mos7840_port->shadowLCR is End %x\n", __func__, 1322 mos7840_port->shadowLCR); 1323} 1324 1325/***************************************************************************** 1326 * mos7840_set_termios 1327 * this function is called by the tty driver when it wants to change 1328 * the termios structure 1329 *****************************************************************************/ 1330 1331static void mos7840_set_termios(struct tty_struct *tty, 1332 struct usb_serial_port *port, 1333 struct ktermios *old_termios) 1334{ 1335 struct moschip_port *mos7840_port = usb_get_serial_port_data(port); 1336 int status; 1337 1338 /* change the port settings to the new ones specified */ 1339 1340 mos7840_change_port_settings(tty, mos7840_port, old_termios); 1341 1342 if (!mos7840_port->read_urb_busy) { 1343 mos7840_port->read_urb_busy = true; 1344 status = usb_submit_urb(mos7840_port->read_urb, GFP_KERNEL); 1345 if (status) { 1346 dev_dbg(&port->dev, "usb_submit_urb(read bulk) failed, status = %d\n", 1347 status); 1348 mos7840_port->read_urb_busy = false; 1349 } 1350 } 1351} 1352 1353/***************************************************************************** 1354 * mos7840_get_lsr_info - get line status register info 1355 * 1356 * Purpose: Let user call ioctl() to get info when the UART physically 1357 * is emptied. On bus types like RS485, the transmitter must 1358 * release the bus after transmitting. This must be done when 1359 * the transmit shift register is empty, not be done when the 1360 * transmit holding register is empty. This functionality 1361 * allows an RS485 driver to be written in user space. 1362 *****************************************************************************/ 1363 1364static int mos7840_get_lsr_info(struct tty_struct *tty, 1365 unsigned int __user *value) 1366{ 1367 int count; 1368 unsigned int result = 0; 1369 1370 count = mos7840_chars_in_buffer(tty); 1371 if (count == 0) 1372 result = TIOCSER_TEMT; 1373 1374 if (copy_to_user(value, &result, sizeof(int))) 1375 return -EFAULT; 1376 return 0; 1377} 1378 1379/***************************************************************************** 1380 * SerialIoctl 1381 * this function handles any ioctl calls to the driver 1382 *****************************************************************************/ 1383 1384static int mos7840_ioctl(struct tty_struct *tty, 1385 unsigned int cmd, unsigned long arg) 1386{ 1387 struct usb_serial_port *port = tty->driver_data; 1388 void __user *argp = (void __user *)arg; 1389 1390 switch (cmd) { 1391 /* return number of bytes available */ 1392 1393 case TIOCSERGETLSR: 1394 dev_dbg(&port->dev, "%s TIOCSERGETLSR\n", __func__); 1395 return mos7840_get_lsr_info(tty, argp); 1396 1397 default: 1398 break; 1399 } 1400 return -ENOIOCTLCMD; 1401} 1402 1403/* 1404 * Check if GPO (pin 42) is connected to GPI (pin 33) as recommended by ASIX 1405 * for MCS7810 by bit-banging a 16-bit word. 1406 * 1407 * Note that GPO is really RTS of the third port so this will toggle RTS of 1408 * port two or three on two- and four-port devices. 1409 */ 1410static int mos7810_check(struct usb_serial *serial) 1411{ 1412 int i, pass_count = 0; 1413 u8 *buf; 1414 __u16 data = 0, mcr_data = 0; 1415 __u16 test_pattern = 0x55AA; 1416 int res; 1417 1418 buf = kmalloc(VENDOR_READ_LENGTH, GFP_KERNEL); 1419 if (!buf) 1420 return 0; /* failed to identify 7810 */ 1421 1422 /* Store MCR setting */ 1423 res = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), 1424 MCS_RDREQ, MCS_RD_RTYPE, 0x0300, MODEM_CONTROL_REGISTER, 1425 buf, VENDOR_READ_LENGTH, MOS_WDR_TIMEOUT); 1426 if (res == VENDOR_READ_LENGTH) 1427 mcr_data = *buf; 1428 1429 for (i = 0; i < 16; i++) { 1430 /* Send the 1-bit test pattern out to MCS7810 test pin */ 1431 usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), 1432 MCS_WRREQ, MCS_WR_RTYPE, 1433 (0x0300 | (((test_pattern >> i) & 0x0001) << 1)), 1434 MODEM_CONTROL_REGISTER, NULL, 0, MOS_WDR_TIMEOUT); 1435 1436 /* Read the test pattern back */ 1437 res = usb_control_msg(serial->dev, 1438 usb_rcvctrlpipe(serial->dev, 0), MCS_RDREQ, 1439 MCS_RD_RTYPE, 0, GPIO_REGISTER, buf, 1440 VENDOR_READ_LENGTH, MOS_WDR_TIMEOUT); 1441 if (res == VENDOR_READ_LENGTH) 1442 data = *buf; 1443 1444 /* If this is a MCS7810 device, both test patterns must match */ 1445 if (((test_pattern >> i) ^ (~data >> 1)) & 0x0001) 1446 break; 1447 1448 pass_count++; 1449 } 1450 1451 /* Restore MCR setting */ 1452 usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), MCS_WRREQ, 1453 MCS_WR_RTYPE, 0x0300 | mcr_data, MODEM_CONTROL_REGISTER, NULL, 1454 0, MOS_WDR_TIMEOUT); 1455 1456 kfree(buf); 1457 1458 if (pass_count == 16) 1459 return 1; 1460 1461 return 0; 1462} 1463 1464static int mos7840_probe(struct usb_serial *serial, 1465 const struct usb_device_id *id) 1466{ 1467 unsigned long device_flags = id->driver_info; 1468 u8 *buf; 1469 1470 /* Skip device-type detection if we already have device flags. */ 1471 if (device_flags) 1472 goto out; 1473 1474 buf = kzalloc(VENDOR_READ_LENGTH, GFP_KERNEL); 1475 if (!buf) 1476 return -ENOMEM; 1477 1478 usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), 1479 MCS_RDREQ, MCS_RD_RTYPE, 0, GPIO_REGISTER, buf, 1480 VENDOR_READ_LENGTH, MOS_WDR_TIMEOUT); 1481 1482 /* For a MCS7840 device GPIO0 must be set to 1 */ 1483 if (buf[0] & 0x01) 1484 device_flags = MCS_PORTS(4); 1485 else if (mos7810_check(serial)) 1486 device_flags = MCS_PORTS(1) | MCS_LED; 1487 else 1488 device_flags = MCS_PORTS(2); 1489 1490 kfree(buf); 1491out: 1492 usb_set_serial_data(serial, (void *)device_flags); 1493 1494 return 0; 1495} 1496 1497static int mos7840_calc_num_ports(struct usb_serial *serial, 1498 struct usb_serial_endpoints *epds) 1499{ 1500 unsigned long device_flags = (unsigned long)usb_get_serial_data(serial); 1501 int num_ports = MCS_PORTS(device_flags); 1502 1503 if (num_ports == 0 || num_ports > 4) 1504 return -ENODEV; 1505 1506 if (epds->num_bulk_in < num_ports || epds->num_bulk_out < num_ports) { 1507 dev_err(&serial->interface->dev, "missing endpoints\n"); 1508 return -ENODEV; 1509 } 1510 1511 return num_ports; 1512} 1513 1514static int mos7840_attach(struct usb_serial *serial) 1515{ 1516 struct device *dev = &serial->interface->dev; 1517 int status; 1518 u16 val; 1519 1520 /* Zero Length flag enable */ 1521 val = 0x0f; 1522 status = mos7840_set_reg_sync(serial->port[0], ZLP_REG5, val); 1523 if (status < 0) 1524 dev_dbg(dev, "Writing ZLP_REG5 failed status-0x%x\n", status); 1525 else 1526 dev_dbg(dev, "ZLP_REG5 Writing success status%d\n", status); 1527 1528 return status; 1529} 1530 1531static int mos7840_port_probe(struct usb_serial_port *port) 1532{ 1533 struct usb_serial *serial = port->serial; 1534 unsigned long device_flags = (unsigned long)usb_get_serial_data(serial); 1535 struct moschip_port *mos7840_port; 1536 int status; 1537 int pnum; 1538 __u16 Data; 1539 1540 /* we set up the pointers to the endpoints in the mos7840_open * 1541 * function, as the structures aren't created yet. */ 1542 1543 pnum = port->port_number; 1544 1545 dev_dbg(&port->dev, "mos7840_startup: configuring port %d\n", pnum); 1546 mos7840_port = kzalloc(sizeof(struct moschip_port), GFP_KERNEL); 1547 if (!mos7840_port) 1548 return -ENOMEM; 1549 1550 /* Initialize all port interrupt end point to port 0 int 1551 * endpoint. Our device has only one interrupt end point 1552 * common to all port */ 1553 1554 mos7840_port->port = port; 1555 spin_lock_init(&mos7840_port->pool_lock); 1556 1557 /* minor is not initialised until later by 1558 * usb-serial.c:get_free_serial() and cannot therefore be used 1559 * to index device instances */ 1560 mos7840_port->port_num = pnum + 1; 1561 dev_dbg(&port->dev, "port->minor = %d\n", port->minor); 1562 dev_dbg(&port->dev, "mos7840_port->port_num = %d\n", mos7840_port->port_num); 1563 1564 if (mos7840_port->port_num == 1) { 1565 mos7840_port->SpRegOffset = 0x0; 1566 mos7840_port->ControlRegOffset = 0x1; 1567 mos7840_port->DcrRegOffset = 0x4; 1568 } else { 1569 u8 phy_num = mos7840_port->port_num; 1570 1571 /* Port 2 in the 2-port case uses registers of port 3 */ 1572 if (serial->num_ports == 2) 1573 phy_num = 3; 1574 1575 mos7840_port->SpRegOffset = 0x8 + 2 * (phy_num - 2); 1576 mos7840_port->ControlRegOffset = 0x9 + 2 * (phy_num - 2); 1577 mos7840_port->DcrRegOffset = 0x16 + 3 * (phy_num - 2); 1578 } 1579 mos7840_dump_serial_port(port, mos7840_port); 1580 usb_set_serial_port_data(port, mos7840_port); 1581 1582 /* enable rx_disable bit in control register */ 1583 status = mos7840_get_reg_sync(port, 1584 mos7840_port->ControlRegOffset, &Data); 1585 if (status < 0) { 1586 dev_dbg(&port->dev, "Reading ControlReg failed status-0x%x\n", status); 1587 goto error; 1588 } else 1589 dev_dbg(&port->dev, "ControlReg Reading success val is %x, status%d\n", Data, status); 1590 Data |= 0x08; /* setting driver done bit */ 1591 Data |= 0x04; /* sp1_bit to have cts change reflect in 1592 modem status reg */ 1593 1594 /* Data |= 0x20; //rx_disable bit */ 1595 status = mos7840_set_reg_sync(port, 1596 mos7840_port->ControlRegOffset, Data); 1597 if (status < 0) { 1598 dev_dbg(&port->dev, "Writing ControlReg failed(rx_disable) status-0x%x\n", status); 1599 goto error; 1600 } else 1601 dev_dbg(&port->dev, "ControlReg Writing success(rx_disable) status%d\n", status); 1602 1603 /* Write default values in DCR (i.e 0x01 in DCR0, 0x05 in DCR2 1604 and 0x24 in DCR3 */ 1605 Data = 0x01; 1606 status = mos7840_set_reg_sync(port, 1607 (__u16) (mos7840_port->DcrRegOffset + 0), Data); 1608 if (status < 0) { 1609 dev_dbg(&port->dev, "Writing DCR0 failed status-0x%x\n", status); 1610 goto error; 1611 } else 1612 dev_dbg(&port->dev, "DCR0 Writing success status%d\n", status); 1613 1614 Data = 0x05; 1615 status = mos7840_set_reg_sync(port, 1616 (__u16) (mos7840_port->DcrRegOffset + 1), Data); 1617 if (status < 0) { 1618 dev_dbg(&port->dev, "Writing DCR1 failed status-0x%x\n", status); 1619 goto error; 1620 } else 1621 dev_dbg(&port->dev, "DCR1 Writing success status%d\n", status); 1622 1623 Data = 0x24; 1624 status = mos7840_set_reg_sync(port, 1625 (__u16) (mos7840_port->DcrRegOffset + 2), Data); 1626 if (status < 0) { 1627 dev_dbg(&port->dev, "Writing DCR2 failed status-0x%x\n", status); 1628 goto error; 1629 } else 1630 dev_dbg(&port->dev, "DCR2 Writing success status%d\n", status); 1631 1632 /* write values in clkstart0x0 and clkmulti 0x20 */ 1633 Data = 0x0; 1634 status = mos7840_set_reg_sync(port, CLK_START_VALUE_REGISTER, Data); 1635 if (status < 0) { 1636 dev_dbg(&port->dev, "Writing CLK_START_VALUE_REGISTER failed status-0x%x\n", status); 1637 goto error; 1638 } else 1639 dev_dbg(&port->dev, "CLK_START_VALUE_REGISTER Writing success status%d\n", status); 1640 1641 Data = 0x20; 1642 status = mos7840_set_reg_sync(port, CLK_MULTI_REGISTER, Data); 1643 if (status < 0) { 1644 dev_dbg(&port->dev, "Writing CLK_MULTI_REGISTER failed status-0x%x\n", status); 1645 goto error; 1646 } else 1647 dev_dbg(&port->dev, "CLK_MULTI_REGISTER Writing success status%d\n", status); 1648 1649 /* write value 0x0 to scratchpad register */ 1650 Data = 0x00; 1651 status = mos7840_set_uart_reg(port, SCRATCH_PAD_REGISTER, Data); 1652 if (status < 0) { 1653 dev_dbg(&port->dev, "Writing SCRATCH_PAD_REGISTER failed status-0x%x\n", status); 1654 goto error; 1655 } else 1656 dev_dbg(&port->dev, "SCRATCH_PAD_REGISTER Writing success status%d\n", status); 1657 1658 /* Zero Length flag register */ 1659 if ((mos7840_port->port_num != 1) && (serial->num_ports == 2)) { 1660 Data = 0xff; 1661 status = mos7840_set_reg_sync(port, 1662 (__u16) (ZLP_REG1 + 1663 ((__u16)mos7840_port->port_num)), Data); 1664 dev_dbg(&port->dev, "ZLIP offset %x\n", 1665 (__u16)(ZLP_REG1 + ((__u16) mos7840_port->port_num))); 1666 if (status < 0) { 1667 dev_dbg(&port->dev, "Writing ZLP_REG%d failed status-0x%x\n", pnum + 2, status); 1668 goto error; 1669 } else 1670 dev_dbg(&port->dev, "ZLP_REG%d Writing success status%d\n", pnum + 2, status); 1671 } else { 1672 Data = 0xff; 1673 status = mos7840_set_reg_sync(port, 1674 (__u16) (ZLP_REG1 + 1675 ((__u16)mos7840_port->port_num) - 0x1), Data); 1676 dev_dbg(&port->dev, "ZLIP offset %x\n", 1677 (__u16)(ZLP_REG1 + ((__u16) mos7840_port->port_num) - 0x1)); 1678 if (status < 0) { 1679 dev_dbg(&port->dev, "Writing ZLP_REG%d failed status-0x%x\n", pnum + 1, status); 1680 goto error; 1681 } else 1682 dev_dbg(&port->dev, "ZLP_REG%d Writing success status%d\n", pnum + 1, status); 1683 1684 } 1685 1686 mos7840_port->has_led = device_flags & MCS_LED; 1687 1688 /* Initialize LED timers */ 1689 if (mos7840_port->has_led) { 1690 mos7840_port->led_urb = usb_alloc_urb(0, GFP_KERNEL); 1691 mos7840_port->led_dr = kmalloc(sizeof(*mos7840_port->led_dr), 1692 GFP_KERNEL); 1693 if (!mos7840_port->led_urb || !mos7840_port->led_dr) { 1694 status = -ENOMEM; 1695 goto error; 1696 } 1697 1698 timer_setup(&mos7840_port->led_timer1, mos7840_led_off, 0); 1699 mos7840_port->led_timer1.expires = 1700 jiffies + msecs_to_jiffies(LED_ON_MS); 1701 timer_setup(&mos7840_port->led_timer2, mos7840_led_flag_off, 1702 0); 1703 mos7840_port->led_timer2.expires = 1704 jiffies + msecs_to_jiffies(LED_OFF_MS); 1705 1706 /* Turn off LED */ 1707 mos7840_set_led_sync(port, MODEM_CONTROL_REGISTER, 0x0300); 1708 } 1709 1710 return 0; 1711error: 1712 kfree(mos7840_port->led_dr); 1713 usb_free_urb(mos7840_port->led_urb); 1714 kfree(mos7840_port); 1715 1716 return status; 1717} 1718 1719static void mos7840_port_remove(struct usb_serial_port *port) 1720{ 1721 struct moschip_port *mos7840_port = usb_get_serial_port_data(port); 1722 1723 if (mos7840_port->has_led) { 1724 /* Turn off LED */ 1725 mos7840_set_led_sync(port, MODEM_CONTROL_REGISTER, 0x0300); 1726 1727 del_timer_sync(&mos7840_port->led_timer1); 1728 del_timer_sync(&mos7840_port->led_timer2); 1729 1730 usb_kill_urb(mos7840_port->led_urb); 1731 usb_free_urb(mos7840_port->led_urb); 1732 kfree(mos7840_port->led_dr); 1733 } 1734 1735 kfree(mos7840_port); 1736} 1737 1738static struct usb_serial_driver moschip7840_4port_device = { 1739 .driver = { 1740 .owner = THIS_MODULE, 1741 .name = "mos7840", 1742 }, 1743 .description = DRIVER_DESC, 1744 .id_table = id_table, 1745 .num_interrupt_in = 1, 1746 .open = mos7840_open, 1747 .close = mos7840_close, 1748 .write = mos7840_write, 1749 .write_room = mos7840_write_room, 1750 .chars_in_buffer = mos7840_chars_in_buffer, 1751 .throttle = mos7840_throttle, 1752 .unthrottle = mos7840_unthrottle, 1753 .calc_num_ports = mos7840_calc_num_ports, 1754 .probe = mos7840_probe, 1755 .attach = mos7840_attach, 1756 .ioctl = mos7840_ioctl, 1757 .set_termios = mos7840_set_termios, 1758 .break_ctl = mos7840_break, 1759 .tiocmget = mos7840_tiocmget, 1760 .tiocmset = mos7840_tiocmset, 1761 .get_icount = usb_serial_generic_get_icount, 1762 .port_probe = mos7840_port_probe, 1763 .port_remove = mos7840_port_remove, 1764 .read_bulk_callback = mos7840_bulk_in_callback, 1765}; 1766 1767static struct usb_serial_driver * const serial_drivers[] = { 1768 &moschip7840_4port_device, NULL 1769}; 1770 1771module_usb_serial_driver(serial_drivers, id_table); 1772 1773MODULE_DESCRIPTION(DRIVER_DESC); 1774MODULE_LICENSE("GPL");