0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include <linux/kernel.h>
0011 #include <linux/errno.h>
0012 #include <linux/slab.h>
0013 #include <linux/tty.h>
0014 #include <linux/tty_driver.h>
0015 #include <linux/tty_flip.h>
0016 #include <linux/serial.h>
0017 #include <linux/module.h>
0018 #include <linux/moduleparam.h>
0019 #include <linux/mutex.h>
0020 #include <linux/uaccess.h>
0021 #include <linux/usb.h>
0022 #include <linux/usb/serial.h>
0023 #include <linux/serial_reg.h>
0024
0025 #define F81232_ID \
0026 { USB_DEVICE(0x1934, 0x0706) }
0027
0028 #define F81534A_SERIES_ID \
0029 { USB_DEVICE(0x2c42, 0x1602) }, \
0030 { USB_DEVICE(0x2c42, 0x1604) }, \
0031 { USB_DEVICE(0x2c42, 0x1605) }, \
0032 { USB_DEVICE(0x2c42, 0x1606) }, \
0033 { USB_DEVICE(0x2c42, 0x1608) }, \
0034 { USB_DEVICE(0x2c42, 0x1632) }, \
0035 { USB_DEVICE(0x2c42, 0x1634) }, \
0036 { USB_DEVICE(0x2c42, 0x1635) }, \
0037 { USB_DEVICE(0x2c42, 0x1636) }
0038
0039 #define F81534A_CTRL_ID \
0040 { USB_DEVICE(0x2c42, 0x16f8) }
0041
0042 static const struct usb_device_id f81232_id_table[] = {
0043 F81232_ID,
0044 { }
0045 };
0046
0047 static const struct usb_device_id f81534a_id_table[] = {
0048 F81534A_SERIES_ID,
0049 { }
0050 };
0051
0052 static const struct usb_device_id f81534a_ctrl_id_table[] = {
0053 F81534A_CTRL_ID,
0054 { }
0055 };
0056
0057 static const struct usb_device_id combined_id_table[] = {
0058 F81232_ID,
0059 F81534A_SERIES_ID,
0060 F81534A_CTRL_ID,
0061 { }
0062 };
0063 MODULE_DEVICE_TABLE(usb, combined_id_table);
0064
0065
0066 #define F81232_MAX_BAUDRATE 1500000
0067 #define F81232_DEF_BAUDRATE 9600
0068
0069
0070 #define F81232_REGISTER_REQUEST 0xa0
0071 #define F81232_GET_REGISTER 0xc0
0072 #define F81232_SET_REGISTER 0x40
0073 #define F81534A_ACCESS_REG_RETRY 2
0074
0075 #define SERIAL_BASE_ADDRESS 0x0120
0076 #define RECEIVE_BUFFER_REGISTER (0x00 + SERIAL_BASE_ADDRESS)
0077 #define INTERRUPT_ENABLE_REGISTER (0x01 + SERIAL_BASE_ADDRESS)
0078 #define FIFO_CONTROL_REGISTER (0x02 + SERIAL_BASE_ADDRESS)
0079 #define LINE_CONTROL_REGISTER (0x03 + SERIAL_BASE_ADDRESS)
0080 #define MODEM_CONTROL_REGISTER (0x04 + SERIAL_BASE_ADDRESS)
0081 #define LINE_STATUS_REGISTER (0x05 + SERIAL_BASE_ADDRESS)
0082 #define MODEM_STATUS_REGISTER (0x06 + SERIAL_BASE_ADDRESS)
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093 #define F81232_CLK_REGISTER 0x106
0094 #define F81232_CLK_1_846_MHZ 0
0095 #define F81232_CLK_18_46_MHZ BIT(0)
0096 #define F81232_CLK_24_MHZ BIT(1)
0097 #define F81232_CLK_14_77_MHZ (BIT(1) | BIT(0))
0098 #define F81232_CLK_MASK GENMASK(1, 0)
0099
0100 #define F81534A_MODE_REG 0x107
0101 #define F81534A_TRIGGER_MASK GENMASK(3, 2)
0102 #define F81534A_TRIGGER_MULTIPLE_4X BIT(3)
0103 #define F81534A_FIFO_128BYTE (BIT(1) | BIT(0))
0104
0105
0106 #define F81534A_GPIO_REG 0x10e
0107 #define F81534A_GPIO_MODE2_DIR BIT(6)
0108 #define F81534A_GPIO_MODE1_DIR BIT(5)
0109 #define F81534A_GPIO_MODE0_DIR BIT(4)
0110 #define F81534A_GPIO_MODE2_OUTPUT BIT(2)
0111 #define F81534A_GPIO_MODE1_OUTPUT BIT(1)
0112 #define F81534A_GPIO_MODE0_OUTPUT BIT(0)
0113
0114 #define F81534A_CTRL_CMD_ENABLE_PORT 0x116
0115
0116 struct f81232_private {
0117 struct mutex lock;
0118 u8 modem_control;
0119 u8 modem_status;
0120 u8 shadow_lcr;
0121 speed_t baud_base;
0122 struct work_struct lsr_work;
0123 struct work_struct interrupt_work;
0124 struct usb_serial_port *port;
0125 };
0126
0127 static u32 const baudrate_table[] = { 115200, 921600, 1152000, 1500000 };
0128 static u8 const clock_table[] = { F81232_CLK_1_846_MHZ, F81232_CLK_14_77_MHZ,
0129 F81232_CLK_18_46_MHZ, F81232_CLK_24_MHZ };
0130
0131 static int calc_baud_divisor(speed_t baudrate, speed_t clockrate)
0132 {
0133 if (!baudrate)
0134 return 0;
0135
0136 return DIV_ROUND_CLOSEST(clockrate, baudrate);
0137 }
0138
0139 static int f81232_get_register(struct usb_serial_port *port, u16 reg, u8 *val)
0140 {
0141 int status;
0142 struct usb_device *dev = port->serial->dev;
0143
0144 status = usb_control_msg_recv(dev,
0145 0,
0146 F81232_REGISTER_REQUEST,
0147 F81232_GET_REGISTER,
0148 reg,
0149 0,
0150 val,
0151 sizeof(*val),
0152 USB_CTRL_GET_TIMEOUT,
0153 GFP_KERNEL);
0154 if (status) {
0155 dev_err(&port->dev, "%s failed status: %d\n", __func__, status);
0156 status = usb_translate_errors(status);
0157 }
0158
0159 return status;
0160 }
0161
0162 static int f81232_set_register(struct usb_serial_port *port, u16 reg, u8 val)
0163 {
0164 int status;
0165 struct usb_device *dev = port->serial->dev;
0166
0167 status = usb_control_msg_send(dev,
0168 0,
0169 F81232_REGISTER_REQUEST,
0170 F81232_SET_REGISTER,
0171 reg,
0172 0,
0173 &val,
0174 sizeof(val),
0175 USB_CTRL_SET_TIMEOUT,
0176 GFP_KERNEL);
0177 if (status) {
0178 dev_err(&port->dev, "%s failed status: %d\n", __func__, status);
0179 status = usb_translate_errors(status);
0180 }
0181
0182 return status;
0183 }
0184
0185 static int f81232_set_mask_register(struct usb_serial_port *port, u16 reg,
0186 u8 mask, u8 val)
0187 {
0188 int status;
0189 u8 tmp;
0190
0191 status = f81232_get_register(port, reg, &tmp);
0192 if (status)
0193 return status;
0194
0195 tmp = (tmp & ~mask) | (val & mask);
0196
0197 return f81232_set_register(port, reg, tmp);
0198 }
0199
0200 static void f81232_read_msr(struct usb_serial_port *port)
0201 {
0202 int status;
0203 u8 current_msr;
0204 struct tty_struct *tty;
0205 struct f81232_private *priv = usb_get_serial_port_data(port);
0206
0207 mutex_lock(&priv->lock);
0208 status = f81232_get_register(port, MODEM_STATUS_REGISTER,
0209 ¤t_msr);
0210 if (status) {
0211 dev_err(&port->dev, "%s fail, status: %d\n", __func__, status);
0212 mutex_unlock(&priv->lock);
0213 return;
0214 }
0215
0216 if (!(current_msr & UART_MSR_ANY_DELTA)) {
0217 mutex_unlock(&priv->lock);
0218 return;
0219 }
0220
0221 priv->modem_status = current_msr;
0222
0223 if (current_msr & UART_MSR_DCTS)
0224 port->icount.cts++;
0225 if (current_msr & UART_MSR_DDSR)
0226 port->icount.dsr++;
0227 if (current_msr & UART_MSR_TERI)
0228 port->icount.rng++;
0229 if (current_msr & UART_MSR_DDCD) {
0230 port->icount.dcd++;
0231 tty = tty_port_tty_get(&port->port);
0232 if (tty) {
0233 usb_serial_handle_dcd_change(port, tty,
0234 current_msr & UART_MSR_DCD);
0235
0236 tty_kref_put(tty);
0237 }
0238 }
0239
0240 wake_up_interruptible(&port->port.delta_msr_wait);
0241 mutex_unlock(&priv->lock);
0242 }
0243
0244 static int f81232_set_mctrl(struct usb_serial_port *port,
0245 unsigned int set, unsigned int clear)
0246 {
0247 u8 val;
0248 int status;
0249 struct f81232_private *priv = usb_get_serial_port_data(port);
0250
0251 if (((set | clear) & (TIOCM_DTR | TIOCM_RTS)) == 0)
0252 return 0;
0253
0254
0255 clear &= ~set;
0256
0257
0258 mutex_lock(&priv->lock);
0259 val = UART_MCR_OUT2 | priv->modem_control;
0260
0261 if (clear & TIOCM_DTR)
0262 val &= ~UART_MCR_DTR;
0263
0264 if (clear & TIOCM_RTS)
0265 val &= ~UART_MCR_RTS;
0266
0267 if (set & TIOCM_DTR)
0268 val |= UART_MCR_DTR;
0269
0270 if (set & TIOCM_RTS)
0271 val |= UART_MCR_RTS;
0272
0273 dev_dbg(&port->dev, "%s new:%02x old:%02x\n", __func__,
0274 val, priv->modem_control);
0275
0276 status = f81232_set_register(port, MODEM_CONTROL_REGISTER, val);
0277 if (status) {
0278 dev_err(&port->dev, "%s set MCR status < 0\n", __func__);
0279 mutex_unlock(&priv->lock);
0280 return status;
0281 }
0282
0283 priv->modem_control = val;
0284 mutex_unlock(&priv->lock);
0285
0286 return 0;
0287 }
0288
0289 static void f81232_update_line_status(struct usb_serial_port *port,
0290 unsigned char *data,
0291 size_t actual_length)
0292 {
0293 struct f81232_private *priv = usb_get_serial_port_data(port);
0294
0295 if (!actual_length)
0296 return;
0297
0298 switch (data[0] & 0x07) {
0299 case 0x00:
0300 dev_dbg(&port->dev, "IIR: MSR Change: %02x\n", data[0]);
0301 schedule_work(&priv->interrupt_work);
0302 break;
0303 case 0x02:
0304 break;
0305 case 0x04:
0306 break;
0307 case 0x06:
0308
0309 dev_dbg(&port->dev, "IIR: LSR Change: %02x\n", data[0]);
0310 break;
0311 }
0312 }
0313
0314 static void f81232_read_int_callback(struct urb *urb)
0315 {
0316 struct usb_serial_port *port = urb->context;
0317 unsigned char *data = urb->transfer_buffer;
0318 unsigned int actual_length = urb->actual_length;
0319 int status = urb->status;
0320 int retval;
0321
0322 switch (status) {
0323 case 0:
0324
0325 break;
0326 case -ECONNRESET:
0327 case -ENOENT:
0328 case -ESHUTDOWN:
0329
0330 dev_dbg(&port->dev, "%s - urb shutting down with status: %d\n",
0331 __func__, status);
0332 return;
0333 default:
0334 dev_dbg(&port->dev, "%s - nonzero urb status received: %d\n",
0335 __func__, status);
0336 goto exit;
0337 }
0338
0339 usb_serial_debug_data(&port->dev, __func__,
0340 urb->actual_length, urb->transfer_buffer);
0341
0342 f81232_update_line_status(port, data, actual_length);
0343
0344 exit:
0345 retval = usb_submit_urb(urb, GFP_ATOMIC);
0346 if (retval)
0347 dev_err(&urb->dev->dev,
0348 "%s - usb_submit_urb failed with result %d\n",
0349 __func__, retval);
0350 }
0351
0352 static char f81232_handle_lsr(struct usb_serial_port *port, u8 lsr)
0353 {
0354 struct f81232_private *priv = usb_get_serial_port_data(port);
0355 char tty_flag = TTY_NORMAL;
0356
0357 if (!(lsr & UART_LSR_BRK_ERROR_BITS))
0358 return tty_flag;
0359
0360 if (lsr & UART_LSR_BI) {
0361 tty_flag = TTY_BREAK;
0362 port->icount.brk++;
0363 usb_serial_handle_break(port);
0364 } else if (lsr & UART_LSR_PE) {
0365 tty_flag = TTY_PARITY;
0366 port->icount.parity++;
0367 } else if (lsr & UART_LSR_FE) {
0368 tty_flag = TTY_FRAME;
0369 port->icount.frame++;
0370 }
0371
0372 if (lsr & UART_LSR_OE) {
0373 port->icount.overrun++;
0374 schedule_work(&priv->lsr_work);
0375 tty_insert_flip_char(&port->port, 0, TTY_OVERRUN);
0376 }
0377
0378 return tty_flag;
0379 }
0380
0381 static void f81232_process_read_urb(struct urb *urb)
0382 {
0383 struct usb_serial_port *port = urb->context;
0384 unsigned char *data = urb->transfer_buffer;
0385 char tty_flag;
0386 unsigned int i;
0387 u8 lsr;
0388
0389
0390
0391
0392
0393 if ((urb->actual_length < 2) || (urb->actual_length % 2))
0394 return;
0395
0396
0397
0398 for (i = 0; i < urb->actual_length; i += 2) {
0399 lsr = data[i];
0400 tty_flag = f81232_handle_lsr(port, lsr);
0401
0402 if (port->sysrq) {
0403 if (usb_serial_handle_sysrq_char(port, data[i + 1]))
0404 continue;
0405 }
0406
0407 tty_insert_flip_char(&port->port, data[i + 1], tty_flag);
0408 }
0409
0410 tty_flip_buffer_push(&port->port);
0411 }
0412
0413 static void f81534a_process_read_urb(struct urb *urb)
0414 {
0415 struct usb_serial_port *port = urb->context;
0416 unsigned char *data = urb->transfer_buffer;
0417 char tty_flag;
0418 unsigned int i;
0419 u8 lsr;
0420 u8 len;
0421
0422 if (urb->actual_length < 3) {
0423 dev_err(&port->dev, "short message received: %d\n",
0424 urb->actual_length);
0425 return;
0426 }
0427
0428 len = data[0];
0429 if (len != urb->actual_length) {
0430 dev_err(&port->dev, "malformed message received: %d (%d)\n",
0431 urb->actual_length, len);
0432 return;
0433 }
0434
0435
0436 lsr = data[len - 1];
0437 tty_flag = f81232_handle_lsr(port, lsr);
0438
0439 if (port->sysrq) {
0440 for (i = 1; i < len - 1; ++i) {
0441 if (!usb_serial_handle_sysrq_char(port, data[i])) {
0442 tty_insert_flip_char(&port->port, data[i],
0443 tty_flag);
0444 }
0445 }
0446 } else {
0447 tty_insert_flip_string_fixed_flag(&port->port, &data[1],
0448 tty_flag, len - 2);
0449 }
0450
0451 tty_flip_buffer_push(&port->port);
0452 }
0453
0454 static void f81232_break_ctl(struct tty_struct *tty, int break_state)
0455 {
0456 struct usb_serial_port *port = tty->driver_data;
0457 struct f81232_private *priv = usb_get_serial_port_data(port);
0458 int status;
0459
0460 mutex_lock(&priv->lock);
0461
0462 if (break_state)
0463 priv->shadow_lcr |= UART_LCR_SBC;
0464 else
0465 priv->shadow_lcr &= ~UART_LCR_SBC;
0466
0467 status = f81232_set_register(port, LINE_CONTROL_REGISTER,
0468 priv->shadow_lcr);
0469 if (status)
0470 dev_err(&port->dev, "set break failed: %d\n", status);
0471
0472 mutex_unlock(&priv->lock);
0473 }
0474
0475 static int f81232_find_clk(speed_t baudrate)
0476 {
0477 int idx;
0478
0479 for (idx = 0; idx < ARRAY_SIZE(baudrate_table); ++idx) {
0480 if (baudrate <= baudrate_table[idx] &&
0481 baudrate_table[idx] % baudrate == 0)
0482 return idx;
0483 }
0484
0485 return -EINVAL;
0486 }
0487
0488 static void f81232_set_baudrate(struct tty_struct *tty,
0489 struct usb_serial_port *port, speed_t baudrate,
0490 speed_t old_baudrate)
0491 {
0492 struct f81232_private *priv = usb_get_serial_port_data(port);
0493 u8 lcr;
0494 int divisor;
0495 int status = 0;
0496 int i;
0497 int idx;
0498 speed_t baud_list[] = { baudrate, old_baudrate, F81232_DEF_BAUDRATE };
0499
0500 for (i = 0; i < ARRAY_SIZE(baud_list); ++i) {
0501 idx = f81232_find_clk(baud_list[i]);
0502 if (idx >= 0) {
0503 baudrate = baud_list[i];
0504 tty_encode_baud_rate(tty, baudrate, baudrate);
0505 break;
0506 }
0507 }
0508
0509 if (idx < 0)
0510 return;
0511
0512 priv->baud_base = baudrate_table[idx];
0513 divisor = calc_baud_divisor(baudrate, priv->baud_base);
0514
0515 status = f81232_set_mask_register(port, F81232_CLK_REGISTER,
0516 F81232_CLK_MASK, clock_table[idx]);
0517 if (status) {
0518 dev_err(&port->dev, "%s failed to set CLK_REG: %d\n",
0519 __func__, status);
0520 return;
0521 }
0522
0523 status = f81232_get_register(port, LINE_CONTROL_REGISTER,
0524 &lcr);
0525 if (status) {
0526 dev_err(&port->dev, "%s failed to get LCR: %d\n",
0527 __func__, status);
0528 return;
0529 }
0530
0531 status = f81232_set_register(port, LINE_CONTROL_REGISTER,
0532 lcr | UART_LCR_DLAB);
0533 if (status) {
0534 dev_err(&port->dev, "%s failed to set DLAB: %d\n",
0535 __func__, status);
0536 return;
0537 }
0538
0539 status = f81232_set_register(port, RECEIVE_BUFFER_REGISTER,
0540 divisor & 0x00ff);
0541 if (status) {
0542 dev_err(&port->dev, "%s failed to set baudrate MSB: %d\n",
0543 __func__, status);
0544 goto reapply_lcr;
0545 }
0546
0547 status = f81232_set_register(port, INTERRUPT_ENABLE_REGISTER,
0548 (divisor & 0xff00) >> 8);
0549 if (status) {
0550 dev_err(&port->dev, "%s failed to set baudrate LSB: %d\n",
0551 __func__, status);
0552 }
0553
0554 reapply_lcr:
0555 status = f81232_set_register(port, LINE_CONTROL_REGISTER,
0556 lcr & ~UART_LCR_DLAB);
0557 if (status) {
0558 dev_err(&port->dev, "%s failed to set DLAB: %d\n",
0559 __func__, status);
0560 }
0561 }
0562
0563 static int f81232_port_enable(struct usb_serial_port *port)
0564 {
0565 u8 val;
0566 int status;
0567
0568
0569 val = UART_FCR_TRIGGER_8 | UART_FCR_ENABLE_FIFO | UART_FCR_CLEAR_RCVR |
0570 UART_FCR_CLEAR_XMIT;
0571
0572 status = f81232_set_register(port, FIFO_CONTROL_REGISTER, val);
0573 if (status) {
0574 dev_err(&port->dev, "%s failed to set FCR: %d\n",
0575 __func__, status);
0576 return status;
0577 }
0578
0579
0580 status = f81232_set_register(port, INTERRUPT_ENABLE_REGISTER,
0581 UART_IER_MSI);
0582 if (status) {
0583 dev_err(&port->dev, "%s failed to set IER: %d\n",
0584 __func__, status);
0585 return status;
0586 }
0587
0588 return 0;
0589 }
0590
0591 static int f81232_port_disable(struct usb_serial_port *port)
0592 {
0593 int status;
0594
0595 status = f81232_set_register(port, INTERRUPT_ENABLE_REGISTER, 0);
0596 if (status) {
0597 dev_err(&port->dev, "%s failed to set IER: %d\n",
0598 __func__, status);
0599 return status;
0600 }
0601
0602 return 0;
0603 }
0604
0605 static void f81232_set_termios(struct tty_struct *tty,
0606 struct usb_serial_port *port, struct ktermios *old_termios)
0607 {
0608 struct f81232_private *priv = usb_get_serial_port_data(port);
0609 u8 new_lcr = 0;
0610 int status = 0;
0611 speed_t baudrate;
0612 speed_t old_baud;
0613
0614
0615 if (old_termios && !tty_termios_hw_change(&tty->termios, old_termios))
0616 return;
0617
0618 if (C_BAUD(tty) == B0)
0619 f81232_set_mctrl(port, 0, TIOCM_DTR | TIOCM_RTS);
0620 else if (old_termios && (old_termios->c_cflag & CBAUD) == B0)
0621 f81232_set_mctrl(port, TIOCM_DTR | TIOCM_RTS, 0);
0622
0623 baudrate = tty_get_baud_rate(tty);
0624 if (baudrate > 0) {
0625 if (old_termios)
0626 old_baud = tty_termios_baud_rate(old_termios);
0627 else
0628 old_baud = F81232_DEF_BAUDRATE;
0629
0630 f81232_set_baudrate(tty, port, baudrate, old_baud);
0631 }
0632
0633 if (C_PARENB(tty)) {
0634 new_lcr |= UART_LCR_PARITY;
0635
0636 if (!C_PARODD(tty))
0637 new_lcr |= UART_LCR_EPAR;
0638
0639 if (C_CMSPAR(tty))
0640 new_lcr |= UART_LCR_SPAR;
0641 }
0642
0643 if (C_CSTOPB(tty))
0644 new_lcr |= UART_LCR_STOP;
0645
0646 new_lcr |= UART_LCR_WLEN(tty_get_char_size(tty->termios.c_cflag));
0647
0648 mutex_lock(&priv->lock);
0649
0650 new_lcr |= (priv->shadow_lcr & UART_LCR_SBC);
0651 status = f81232_set_register(port, LINE_CONTROL_REGISTER, new_lcr);
0652 if (status) {
0653 dev_err(&port->dev, "%s failed to set LCR: %d\n",
0654 __func__, status);
0655 }
0656
0657 priv->shadow_lcr = new_lcr;
0658
0659 mutex_unlock(&priv->lock);
0660 }
0661
0662 static int f81232_tiocmget(struct tty_struct *tty)
0663 {
0664 int r;
0665 struct usb_serial_port *port = tty->driver_data;
0666 struct f81232_private *port_priv = usb_get_serial_port_data(port);
0667 u8 mcr, msr;
0668
0669
0670 f81232_read_msr(port);
0671
0672 mutex_lock(&port_priv->lock);
0673 mcr = port_priv->modem_control;
0674 msr = port_priv->modem_status;
0675 mutex_unlock(&port_priv->lock);
0676
0677 r = (mcr & UART_MCR_DTR ? TIOCM_DTR : 0) |
0678 (mcr & UART_MCR_RTS ? TIOCM_RTS : 0) |
0679 (msr & UART_MSR_CTS ? TIOCM_CTS : 0) |
0680 (msr & UART_MSR_DCD ? TIOCM_CAR : 0) |
0681 (msr & UART_MSR_RI ? TIOCM_RI : 0) |
0682 (msr & UART_MSR_DSR ? TIOCM_DSR : 0);
0683
0684 return r;
0685 }
0686
0687 static int f81232_tiocmset(struct tty_struct *tty,
0688 unsigned int set, unsigned int clear)
0689 {
0690 struct usb_serial_port *port = tty->driver_data;
0691
0692 return f81232_set_mctrl(port, set, clear);
0693 }
0694
0695 static int f81232_open(struct tty_struct *tty, struct usb_serial_port *port)
0696 {
0697 int result;
0698
0699 result = f81232_port_enable(port);
0700 if (result)
0701 return result;
0702
0703
0704 if (tty)
0705 f81232_set_termios(tty, port, NULL);
0706
0707 result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
0708 if (result) {
0709 dev_err(&port->dev, "%s - failed submitting interrupt urb,"
0710 " error %d\n", __func__, result);
0711 return result;
0712 }
0713
0714 result = usb_serial_generic_open(tty, port);
0715 if (result) {
0716 usb_kill_urb(port->interrupt_in_urb);
0717 return result;
0718 }
0719
0720 return 0;
0721 }
0722
0723 static int f81534a_open(struct tty_struct *tty, struct usb_serial_port *port)
0724 {
0725 int status;
0726 u8 mask;
0727 u8 val;
0728
0729 val = F81534A_TRIGGER_MULTIPLE_4X | F81534A_FIFO_128BYTE;
0730 mask = F81534A_TRIGGER_MASK | F81534A_FIFO_128BYTE;
0731
0732 status = f81232_set_mask_register(port, F81534A_MODE_REG, mask, val);
0733 if (status) {
0734 dev_err(&port->dev, "failed to set MODE_REG: %d\n", status);
0735 return status;
0736 }
0737
0738 return f81232_open(tty, port);
0739 }
0740
0741 static void f81232_close(struct usb_serial_port *port)
0742 {
0743 struct f81232_private *port_priv = usb_get_serial_port_data(port);
0744
0745 f81232_port_disable(port);
0746 usb_serial_generic_close(port);
0747 usb_kill_urb(port->interrupt_in_urb);
0748 flush_work(&port_priv->interrupt_work);
0749 flush_work(&port_priv->lsr_work);
0750 }
0751
0752 static void f81232_dtr_rts(struct usb_serial_port *port, int on)
0753 {
0754 if (on)
0755 f81232_set_mctrl(port, TIOCM_DTR | TIOCM_RTS, 0);
0756 else
0757 f81232_set_mctrl(port, 0, TIOCM_DTR | TIOCM_RTS);
0758 }
0759
0760 static bool f81232_tx_empty(struct usb_serial_port *port)
0761 {
0762 int status;
0763 u8 tmp;
0764
0765 status = f81232_get_register(port, LINE_STATUS_REGISTER, &tmp);
0766 if (!status) {
0767 if ((tmp & UART_LSR_TEMT) != UART_LSR_TEMT)
0768 return false;
0769 }
0770
0771 return true;
0772 }
0773
0774 static int f81232_carrier_raised(struct usb_serial_port *port)
0775 {
0776 u8 msr;
0777 struct f81232_private *priv = usb_get_serial_port_data(port);
0778
0779 mutex_lock(&priv->lock);
0780 msr = priv->modem_status;
0781 mutex_unlock(&priv->lock);
0782
0783 if (msr & UART_MSR_DCD)
0784 return 1;
0785 return 0;
0786 }
0787
0788 static void f81232_get_serial(struct tty_struct *tty, struct serial_struct *ss)
0789 {
0790 struct usb_serial_port *port = tty->driver_data;
0791 struct f81232_private *priv = usb_get_serial_port_data(port);
0792
0793 ss->baud_base = priv->baud_base;
0794 }
0795
0796 static void f81232_interrupt_work(struct work_struct *work)
0797 {
0798 struct f81232_private *priv =
0799 container_of(work, struct f81232_private, interrupt_work);
0800
0801 f81232_read_msr(priv->port);
0802 }
0803
0804 static void f81232_lsr_worker(struct work_struct *work)
0805 {
0806 struct f81232_private *priv;
0807 struct usb_serial_port *port;
0808 int status;
0809 u8 tmp;
0810
0811 priv = container_of(work, struct f81232_private, lsr_work);
0812 port = priv->port;
0813
0814 status = f81232_get_register(port, LINE_STATUS_REGISTER, &tmp);
0815 if (status)
0816 dev_warn(&port->dev, "read LSR failed: %d\n", status);
0817 }
0818
0819 static int f81534a_ctrl_set_register(struct usb_interface *intf, u16 reg,
0820 u16 size, void *val)
0821 {
0822 struct usb_device *dev = interface_to_usbdev(intf);
0823 int retry = F81534A_ACCESS_REG_RETRY;
0824 int status;
0825
0826 while (retry--) {
0827 status = usb_control_msg_send(dev,
0828 0,
0829 F81232_REGISTER_REQUEST,
0830 F81232_SET_REGISTER,
0831 reg,
0832 0,
0833 val,
0834 size,
0835 USB_CTRL_SET_TIMEOUT,
0836 GFP_KERNEL);
0837 if (status) {
0838 status = usb_translate_errors(status);
0839 if (status == -EIO)
0840 continue;
0841 }
0842
0843 break;
0844 }
0845
0846 if (status) {
0847 dev_err(&intf->dev, "failed to set register 0x%x: %d\n",
0848 reg, status);
0849 }
0850
0851 return status;
0852 }
0853
0854 static int f81534a_ctrl_enable_all_ports(struct usb_interface *intf, bool en)
0855 {
0856 unsigned char enable[2] = {0};
0857 int status;
0858
0859
0860
0861
0862
0863
0864
0865
0866 if (en) {
0867 enable[0] = 0xff;
0868 enable[1] = 0x8f;
0869 }
0870
0871 status = f81534a_ctrl_set_register(intf, F81534A_CTRL_CMD_ENABLE_PORT,
0872 sizeof(enable), enable);
0873 if (status)
0874 dev_err(&intf->dev, "failed to enable ports: %d\n", status);
0875
0876 return status;
0877 }
0878
0879 static int f81534a_ctrl_probe(struct usb_interface *intf,
0880 const struct usb_device_id *id)
0881 {
0882 return f81534a_ctrl_enable_all_ports(intf, true);
0883 }
0884
0885 static void f81534a_ctrl_disconnect(struct usb_interface *intf)
0886 {
0887 f81534a_ctrl_enable_all_ports(intf, false);
0888 }
0889
0890 static int f81534a_ctrl_resume(struct usb_interface *intf)
0891 {
0892 return f81534a_ctrl_enable_all_ports(intf, true);
0893 }
0894
0895 static int f81232_port_probe(struct usb_serial_port *port)
0896 {
0897 struct f81232_private *priv;
0898
0899 priv = devm_kzalloc(&port->dev, sizeof(*priv), GFP_KERNEL);
0900 if (!priv)
0901 return -ENOMEM;
0902
0903 mutex_init(&priv->lock);
0904 INIT_WORK(&priv->interrupt_work, f81232_interrupt_work);
0905 INIT_WORK(&priv->lsr_work, f81232_lsr_worker);
0906
0907 usb_set_serial_port_data(port, priv);
0908
0909 priv->port = port;
0910
0911 return 0;
0912 }
0913
0914 static int f81534a_port_probe(struct usb_serial_port *port)
0915 {
0916 int status;
0917
0918
0919 status = f81232_set_register(port, F81534A_GPIO_REG,
0920 F81534A_GPIO_MODE2_DIR);
0921 if (status)
0922 return status;
0923
0924 return f81232_port_probe(port);
0925 }
0926
0927 static int f81232_suspend(struct usb_serial *serial, pm_message_t message)
0928 {
0929 struct usb_serial_port *port = serial->port[0];
0930 struct f81232_private *port_priv = usb_get_serial_port_data(port);
0931 int i;
0932
0933 for (i = 0; i < ARRAY_SIZE(port->read_urbs); ++i)
0934 usb_kill_urb(port->read_urbs[i]);
0935
0936 usb_kill_urb(port->interrupt_in_urb);
0937
0938 if (port_priv) {
0939 flush_work(&port_priv->interrupt_work);
0940 flush_work(&port_priv->lsr_work);
0941 }
0942
0943 return 0;
0944 }
0945
0946 static int f81232_resume(struct usb_serial *serial)
0947 {
0948 struct usb_serial_port *port = serial->port[0];
0949 int result;
0950
0951 if (tty_port_initialized(&port->port)) {
0952 result = usb_submit_urb(port->interrupt_in_urb, GFP_NOIO);
0953 if (result) {
0954 dev_err(&port->dev, "submit interrupt urb failed: %d\n",
0955 result);
0956 return result;
0957 }
0958 }
0959
0960 return usb_serial_generic_resume(serial);
0961 }
0962
0963 static struct usb_serial_driver f81232_device = {
0964 .driver = {
0965 .owner = THIS_MODULE,
0966 .name = "f81232",
0967 },
0968 .id_table = f81232_id_table,
0969 .num_ports = 1,
0970 .bulk_in_size = 256,
0971 .bulk_out_size = 256,
0972 .open = f81232_open,
0973 .close = f81232_close,
0974 .dtr_rts = f81232_dtr_rts,
0975 .carrier_raised = f81232_carrier_raised,
0976 .get_serial = f81232_get_serial,
0977 .break_ctl = f81232_break_ctl,
0978 .set_termios = f81232_set_termios,
0979 .tiocmget = f81232_tiocmget,
0980 .tiocmset = f81232_tiocmset,
0981 .tiocmiwait = usb_serial_generic_tiocmiwait,
0982 .tx_empty = f81232_tx_empty,
0983 .process_read_urb = f81232_process_read_urb,
0984 .read_int_callback = f81232_read_int_callback,
0985 .port_probe = f81232_port_probe,
0986 .suspend = f81232_suspend,
0987 .resume = f81232_resume,
0988 };
0989
0990 static struct usb_serial_driver f81534a_device = {
0991 .driver = {
0992 .owner = THIS_MODULE,
0993 .name = "f81534a",
0994 },
0995 .id_table = f81534a_id_table,
0996 .num_ports = 1,
0997 .open = f81534a_open,
0998 .close = f81232_close,
0999 .dtr_rts = f81232_dtr_rts,
1000 .carrier_raised = f81232_carrier_raised,
1001 .get_serial = f81232_get_serial,
1002 .break_ctl = f81232_break_ctl,
1003 .set_termios = f81232_set_termios,
1004 .tiocmget = f81232_tiocmget,
1005 .tiocmset = f81232_tiocmset,
1006 .tiocmiwait = usb_serial_generic_tiocmiwait,
1007 .tx_empty = f81232_tx_empty,
1008 .process_read_urb = f81534a_process_read_urb,
1009 .read_int_callback = f81232_read_int_callback,
1010 .port_probe = f81534a_port_probe,
1011 .suspend = f81232_suspend,
1012 .resume = f81232_resume,
1013 };
1014
1015 static struct usb_serial_driver * const serial_drivers[] = {
1016 &f81232_device,
1017 &f81534a_device,
1018 NULL,
1019 };
1020
1021 static struct usb_driver f81534a_ctrl_driver = {
1022 .name = "f81534a_ctrl",
1023 .id_table = f81534a_ctrl_id_table,
1024 .probe = f81534a_ctrl_probe,
1025 .disconnect = f81534a_ctrl_disconnect,
1026 .resume = f81534a_ctrl_resume,
1027 };
1028
1029 static int __init f81232_init(void)
1030 {
1031 int status;
1032
1033 status = usb_register_driver(&f81534a_ctrl_driver, THIS_MODULE,
1034 KBUILD_MODNAME);
1035 if (status)
1036 return status;
1037
1038 status = usb_serial_register_drivers(serial_drivers, KBUILD_MODNAME,
1039 combined_id_table);
1040 if (status) {
1041 usb_deregister(&f81534a_ctrl_driver);
1042 return status;
1043 }
1044
1045 return 0;
1046 }
1047
1048 static void __exit f81232_exit(void)
1049 {
1050 usb_serial_deregister_drivers(serial_drivers);
1051 usb_deregister(&f81534a_ctrl_driver);
1052 }
1053
1054 module_init(f81232_init);
1055 module_exit(f81232_exit);
1056
1057 MODULE_DESCRIPTION("Fintek F81232/532A/534A/535/536 USB to serial driver");
1058 MODULE_AUTHOR("Greg Kroah-Hartman <gregkh@linuxfoundation.org>");
1059 MODULE_AUTHOR("Peter Hong <peter_hong@fintek.com.tw>");
1060 MODULE_LICENSE("GPL v2");