linux/drivers/usb/serial/f81232.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Fintek F81232 USB to serial adaptor driver
   4 * Fintek F81532A/534A/535/536 USB to 2/4/8/12 serial adaptor driver
   5 *
   6 * Copyright (C) 2012 Greg Kroah-Hartman (gregkh@linuxfoundation.org)
   7 * Copyright (C) 2012 Linux Foundation
   8 */
   9
  10#include <linux/kernel.h>
  11#include <linux/errno.h>
  12#include <linux/slab.h>
  13#include <linux/tty.h>
  14#include <linux/tty_driver.h>
  15#include <linux/tty_flip.h>
  16#include <linux/serial.h>
  17#include <linux/module.h>
  18#include <linux/moduleparam.h>
  19#include <linux/mutex.h>
  20#include <linux/uaccess.h>
  21#include <linux/usb.h>
  22#include <linux/usb/serial.h>
  23#include <linux/serial_reg.h>
  24
  25#define F81232_ID               \
  26        { USB_DEVICE(0x1934, 0x0706) }  /* 1 port UART device */
  27
  28#define F81534A_SERIES_ID       \
  29        { USB_DEVICE(0x2c42, 0x1602) }, /* In-Box 2 port UART device */ \
  30        { USB_DEVICE(0x2c42, 0x1604) }, /* In-Box 4 port UART device */ \
  31        { USB_DEVICE(0x2c42, 0x1605) }, /* In-Box 8 port UART device */ \
  32        { USB_DEVICE(0x2c42, 0x1606) }, /* In-Box 12 port UART device */ \
  33        { USB_DEVICE(0x2c42, 0x1608) }, /* Non-Flash type */ \
  34        { USB_DEVICE(0x2c42, 0x1632) }, /* 2 port UART device */ \
  35        { USB_DEVICE(0x2c42, 0x1634) }, /* 4 port UART device */ \
  36        { USB_DEVICE(0x2c42, 0x1635) }, /* 8 port UART device */ \
  37        { USB_DEVICE(0x2c42, 0x1636) }  /* 12 port UART device */
  38
  39#define F81534A_CTRL_ID         \
  40        { USB_DEVICE(0x2c42, 0x16f8) }  /* Global control device */
  41
  42static const struct usb_device_id f81232_id_table[] = {
  43        F81232_ID,
  44        { }                                     /* Terminating entry */
  45};
  46
  47static const struct usb_device_id f81534a_id_table[] = {
  48        F81534A_SERIES_ID,
  49        { }                                     /* Terminating entry */
  50};
  51
  52static const struct usb_device_id f81534a_ctrl_id_table[] = {
  53        F81534A_CTRL_ID,
  54        { }                                     /* Terminating entry */
  55};
  56
  57static const struct usb_device_id combined_id_table[] = {
  58        F81232_ID,
  59        F81534A_SERIES_ID,
  60        F81534A_CTRL_ID,
  61        { }                                     /* Terminating entry */
  62};
  63MODULE_DEVICE_TABLE(usb, combined_id_table);
  64
  65/* Maximum baudrate for F81232 */
  66#define F81232_MAX_BAUDRATE             1500000
  67#define F81232_DEF_BAUDRATE             9600
  68
  69/* USB Control EP parameter */
  70#define F81232_REGISTER_REQUEST         0xa0
  71#define F81232_GET_REGISTER             0xc0
  72#define F81232_SET_REGISTER             0x40
  73#define F81534A_ACCESS_REG_RETRY        2
  74
  75#define SERIAL_BASE_ADDRESS             0x0120
  76#define RECEIVE_BUFFER_REGISTER         (0x00 + SERIAL_BASE_ADDRESS)
  77#define INTERRUPT_ENABLE_REGISTER       (0x01 + SERIAL_BASE_ADDRESS)
  78#define FIFO_CONTROL_REGISTER           (0x02 + SERIAL_BASE_ADDRESS)
  79#define LINE_CONTROL_REGISTER           (0x03 + SERIAL_BASE_ADDRESS)
  80#define MODEM_CONTROL_REGISTER          (0x04 + SERIAL_BASE_ADDRESS)
  81#define LINE_STATUS_REGISTER            (0x05 + SERIAL_BASE_ADDRESS)
  82#define MODEM_STATUS_REGISTER           (0x06 + SERIAL_BASE_ADDRESS)
  83
  84/*
  85 * F81232 Clock registers (106h)
  86 *
  87 * Bit1-0:      Clock source selector
  88 *                      00: 1.846MHz.
  89 *                      01: 18.46MHz.
  90 *                      10: 24MHz.
  91 *                      11: 14.77MHz.
  92 */
  93#define F81232_CLK_REGISTER             0x106
  94#define F81232_CLK_1_846_MHZ            0
  95#define F81232_CLK_18_46_MHZ            BIT(0)
  96#define F81232_CLK_24_MHZ               BIT(1)
  97#define F81232_CLK_14_77_MHZ            (BIT(1) | BIT(0))
  98#define F81232_CLK_MASK                 GENMASK(1, 0)
  99
 100#define F81534A_MODE_REG                0x107
 101#define F81534A_TRIGGER_MASK            GENMASK(3, 2)
 102#define F81534A_TRIGGER_MULTIPLE_4X     BIT(3)
 103#define F81534A_FIFO_128BYTE            (BIT(1) | BIT(0))
 104
 105/* Serial port self GPIO control, 2bytes [control&output data][input data] */
 106#define F81534A_GPIO_REG                0x10e
 107#define F81534A_GPIO_MODE2_DIR          BIT(6) /* 1: input, 0: output */
 108#define F81534A_GPIO_MODE1_DIR          BIT(5)
 109#define F81534A_GPIO_MODE0_DIR          BIT(4)
 110#define F81534A_GPIO_MODE2_OUTPUT       BIT(2)
 111#define F81534A_GPIO_MODE1_OUTPUT       BIT(1)
 112#define F81534A_GPIO_MODE0_OUTPUT       BIT(0)
 113
 114#define F81534A_CTRL_CMD_ENABLE_PORT    0x116
 115
 116struct f81232_private {
 117        struct mutex lock;
 118        u8 modem_control;
 119        u8 modem_status;
 120        u8 shadow_lcr;
 121        speed_t baud_base;
 122        struct work_struct lsr_work;
 123        struct work_struct interrupt_work;
 124        struct usb_serial_port *port;
 125};
 126
 127static u32 const baudrate_table[] = { 115200, 921600, 1152000, 1500000 };
 128static u8 const clock_table[] = { F81232_CLK_1_846_MHZ, F81232_CLK_14_77_MHZ,
 129                                F81232_CLK_18_46_MHZ, F81232_CLK_24_MHZ };
 130
 131static int calc_baud_divisor(speed_t baudrate, speed_t clockrate)
 132{
 133        if (!baudrate)
 134                return 0;
 135
 136        return DIV_ROUND_CLOSEST(clockrate, baudrate);
 137}
 138
 139static int f81232_get_register(struct usb_serial_port *port, u16 reg, u8 *val)
 140{
 141        int status;
 142        u8 *tmp;
 143        struct usb_device *dev = port->serial->dev;
 144
 145        tmp = kmalloc(sizeof(*val), GFP_KERNEL);
 146        if (!tmp)
 147                return -ENOMEM;
 148
 149        status = usb_control_msg(dev,
 150                                usb_rcvctrlpipe(dev, 0),
 151                                F81232_REGISTER_REQUEST,
 152                                F81232_GET_REGISTER,
 153                                reg,
 154                                0,
 155                                tmp,
 156                                sizeof(*val),
 157                                USB_CTRL_GET_TIMEOUT);
 158        if (status != sizeof(*val)) {
 159                dev_err(&port->dev, "%s failed status: %d\n", __func__, status);
 160
 161                if (status < 0)
 162                        status = usb_translate_errors(status);
 163                else
 164                        status = -EIO;
 165        } else {
 166                status = 0;
 167                *val = *tmp;
 168        }
 169
 170        kfree(tmp);
 171        return status;
 172}
 173
 174static int f81232_set_register(struct usb_serial_port *port, u16 reg, u8 val)
 175{
 176        int status;
 177        u8 *tmp;
 178        struct usb_device *dev = port->serial->dev;
 179
 180        tmp = kmalloc(sizeof(val), GFP_KERNEL);
 181        if (!tmp)
 182                return -ENOMEM;
 183
 184        *tmp = val;
 185
 186        status = usb_control_msg(dev,
 187                                usb_sndctrlpipe(dev, 0),
 188                                F81232_REGISTER_REQUEST,
 189                                F81232_SET_REGISTER,
 190                                reg,
 191                                0,
 192                                tmp,
 193                                sizeof(val),
 194                                USB_CTRL_SET_TIMEOUT);
 195        if (status < 0) {
 196                dev_err(&port->dev, "%s failed status: %d\n", __func__, status);
 197                status = usb_translate_errors(status);
 198        } else {
 199                status = 0;
 200        }
 201
 202        kfree(tmp);
 203        return status;
 204}
 205
 206static int f81232_set_mask_register(struct usb_serial_port *port, u16 reg,
 207                                        u8 mask, u8 val)
 208{
 209        int status;
 210        u8 tmp;
 211
 212        status = f81232_get_register(port, reg, &tmp);
 213        if (status)
 214                return status;
 215
 216        tmp = (tmp & ~mask) | (val & mask);
 217
 218        return f81232_set_register(port, reg, tmp);
 219}
 220
 221static void f81232_read_msr(struct usb_serial_port *port)
 222{
 223        int status;
 224        u8 current_msr;
 225        struct tty_struct *tty;
 226        struct f81232_private *priv = usb_get_serial_port_data(port);
 227
 228        mutex_lock(&priv->lock);
 229        status = f81232_get_register(port, MODEM_STATUS_REGISTER,
 230                        &current_msr);
 231        if (status) {
 232                dev_err(&port->dev, "%s fail, status: %d\n", __func__, status);
 233                mutex_unlock(&priv->lock);
 234                return;
 235        }
 236
 237        if (!(current_msr & UART_MSR_ANY_DELTA)) {
 238                mutex_unlock(&priv->lock);
 239                return;
 240        }
 241
 242        priv->modem_status = current_msr;
 243
 244        if (current_msr & UART_MSR_DCTS)
 245                port->icount.cts++;
 246        if (current_msr & UART_MSR_DDSR)
 247                port->icount.dsr++;
 248        if (current_msr & UART_MSR_TERI)
 249                port->icount.rng++;
 250        if (current_msr & UART_MSR_DDCD) {
 251                port->icount.dcd++;
 252                tty = tty_port_tty_get(&port->port);
 253                if (tty) {
 254                        usb_serial_handle_dcd_change(port, tty,
 255                                        current_msr & UART_MSR_DCD);
 256
 257                        tty_kref_put(tty);
 258                }
 259        }
 260
 261        wake_up_interruptible(&port->port.delta_msr_wait);
 262        mutex_unlock(&priv->lock);
 263}
 264
 265static int f81232_set_mctrl(struct usb_serial_port *port,
 266                                           unsigned int set, unsigned int clear)
 267{
 268        u8 val;
 269        int status;
 270        struct f81232_private *priv = usb_get_serial_port_data(port);
 271
 272        if (((set | clear) & (TIOCM_DTR | TIOCM_RTS)) == 0)
 273                return 0;       /* no change */
 274
 275        /* 'set' takes precedence over 'clear' */
 276        clear &= ~set;
 277
 278        /* force enable interrupt with OUT2 */
 279        mutex_lock(&priv->lock);
 280        val = UART_MCR_OUT2 | priv->modem_control;
 281
 282        if (clear & TIOCM_DTR)
 283                val &= ~UART_MCR_DTR;
 284
 285        if (clear & TIOCM_RTS)
 286                val &= ~UART_MCR_RTS;
 287
 288        if (set & TIOCM_DTR)
 289                val |= UART_MCR_DTR;
 290
 291        if (set & TIOCM_RTS)
 292                val |= UART_MCR_RTS;
 293
 294        dev_dbg(&port->dev, "%s new:%02x old:%02x\n", __func__,
 295                        val, priv->modem_control);
 296
 297        status = f81232_set_register(port, MODEM_CONTROL_REGISTER, val);
 298        if (status) {
 299                dev_err(&port->dev, "%s set MCR status < 0\n", __func__);
 300                mutex_unlock(&priv->lock);
 301                return status;
 302        }
 303
 304        priv->modem_control = val;
 305        mutex_unlock(&priv->lock);
 306
 307        return 0;
 308}
 309
 310static void f81232_update_line_status(struct usb_serial_port *port,
 311                                      unsigned char *data,
 312                                      size_t actual_length)
 313{
 314        struct f81232_private *priv = usb_get_serial_port_data(port);
 315
 316        if (!actual_length)
 317                return;
 318
 319        switch (data[0] & 0x07) {
 320        case 0x00: /* msr change */
 321                dev_dbg(&port->dev, "IIR: MSR Change: %02x\n", data[0]);
 322                schedule_work(&priv->interrupt_work);
 323                break;
 324        case 0x02: /* tx-empty */
 325                break;
 326        case 0x04: /* rx data available */
 327                break;
 328        case 0x06: /* lsr change */
 329                /* we can forget it. the LSR will read from bulk-in */
 330                dev_dbg(&port->dev, "IIR: LSR Change: %02x\n", data[0]);
 331                break;
 332        }
 333}
 334
 335static void f81232_read_int_callback(struct urb *urb)
 336{
 337        struct usb_serial_port *port =  urb->context;
 338        unsigned char *data = urb->transfer_buffer;
 339        unsigned int actual_length = urb->actual_length;
 340        int status = urb->status;
 341        int retval;
 342
 343        switch (status) {
 344        case 0:
 345                /* success */
 346                break;
 347        case -ECONNRESET:
 348        case -ENOENT:
 349        case -ESHUTDOWN:
 350                /* this urb is terminated, clean up */
 351                dev_dbg(&port->dev, "%s - urb shutting down with status: %d\n",
 352                        __func__, status);
 353                return;
 354        default:
 355                dev_dbg(&port->dev, "%s - nonzero urb status received: %d\n",
 356                        __func__, status);
 357                goto exit;
 358        }
 359
 360        usb_serial_debug_data(&port->dev, __func__,
 361                              urb->actual_length, urb->transfer_buffer);
 362
 363        f81232_update_line_status(port, data, actual_length);
 364
 365exit:
 366        retval = usb_submit_urb(urb, GFP_ATOMIC);
 367        if (retval)
 368                dev_err(&urb->dev->dev,
 369                        "%s - usb_submit_urb failed with result %d\n",
 370                        __func__, retval);
 371}
 372
 373static char f81232_handle_lsr(struct usb_serial_port *port, u8 lsr)
 374{
 375        struct f81232_private *priv = usb_get_serial_port_data(port);
 376        char tty_flag = TTY_NORMAL;
 377
 378        if (!(lsr & UART_LSR_BRK_ERROR_BITS))
 379                return tty_flag;
 380
 381        if (lsr & UART_LSR_BI) {
 382                tty_flag = TTY_BREAK;
 383                port->icount.brk++;
 384                usb_serial_handle_break(port);
 385        } else if (lsr & UART_LSR_PE) {
 386                tty_flag = TTY_PARITY;
 387                port->icount.parity++;
 388        } else if (lsr & UART_LSR_FE) {
 389                tty_flag = TTY_FRAME;
 390                port->icount.frame++;
 391        }
 392
 393        if (lsr & UART_LSR_OE) {
 394                port->icount.overrun++;
 395                schedule_work(&priv->lsr_work);
 396                tty_insert_flip_char(&port->port, 0, TTY_OVERRUN);
 397        }
 398
 399        return tty_flag;
 400}
 401
 402static void f81232_process_read_urb(struct urb *urb)
 403{
 404        struct usb_serial_port *port = urb->context;
 405        unsigned char *data = urb->transfer_buffer;
 406        char tty_flag;
 407        unsigned int i;
 408        u8 lsr;
 409
 410        /*
 411         * When opening the port we get a 1-byte packet with the current LSR,
 412         * which we discard.
 413         */
 414        if ((urb->actual_length < 2) || (urb->actual_length % 2))
 415                return;
 416
 417        /* bulk-in data: [LSR(1Byte)+DATA(1Byte)][LSR(1Byte)+DATA(1Byte)]... */
 418
 419        for (i = 0; i < urb->actual_length; i += 2) {
 420                lsr = data[i];
 421                tty_flag = f81232_handle_lsr(port, lsr);
 422
 423                if (port->sysrq) {
 424                        if (usb_serial_handle_sysrq_char(port, data[i + 1]))
 425                                continue;
 426                }
 427
 428                tty_insert_flip_char(&port->port, data[i + 1], tty_flag);
 429        }
 430
 431        tty_flip_buffer_push(&port->port);
 432}
 433
 434static void f81534a_process_read_urb(struct urb *urb)
 435{
 436        struct usb_serial_port *port = urb->context;
 437        unsigned char *data = urb->transfer_buffer;
 438        char tty_flag;
 439        unsigned int i;
 440        u8 lsr;
 441        u8 len;
 442
 443        if (urb->actual_length < 3) {
 444                dev_err(&port->dev, "short message received: %d\n",
 445                                urb->actual_length);
 446                return;
 447        }
 448
 449        len = data[0];
 450        if (len != urb->actual_length) {
 451                dev_err(&port->dev, "malformed message received: %d (%d)\n",
 452                                urb->actual_length, len);
 453                return;
 454        }
 455
 456        /* bulk-in data: [LEN][Data.....][LSR] */
 457        lsr = data[len - 1];
 458        tty_flag = f81232_handle_lsr(port, lsr);
 459
 460        if (port->sysrq) {
 461                for (i = 1; i < len - 1; ++i) {
 462                        if (!usb_serial_handle_sysrq_char(port, data[i])) {
 463                                tty_insert_flip_char(&port->port, data[i],
 464                                                tty_flag);
 465                        }
 466                }
 467        } else {
 468                tty_insert_flip_string_fixed_flag(&port->port, &data[1],
 469                                                        tty_flag, len - 2);
 470        }
 471
 472        tty_flip_buffer_push(&port->port);
 473}
 474
 475static void f81232_break_ctl(struct tty_struct *tty, int break_state)
 476{
 477        struct usb_serial_port *port = tty->driver_data;
 478        struct f81232_private *priv = usb_get_serial_port_data(port);
 479        int status;
 480
 481        mutex_lock(&priv->lock);
 482
 483        if (break_state)
 484                priv->shadow_lcr |= UART_LCR_SBC;
 485        else
 486                priv->shadow_lcr &= ~UART_LCR_SBC;
 487
 488        status = f81232_set_register(port, LINE_CONTROL_REGISTER,
 489                                        priv->shadow_lcr);
 490        if (status)
 491                dev_err(&port->dev, "set break failed: %d\n", status);
 492
 493        mutex_unlock(&priv->lock);
 494}
 495
 496static int f81232_find_clk(speed_t baudrate)
 497{
 498        int idx;
 499
 500        for (idx = 0; idx < ARRAY_SIZE(baudrate_table); ++idx) {
 501                if (baudrate <= baudrate_table[idx] &&
 502                                baudrate_table[idx] % baudrate == 0)
 503                        return idx;
 504        }
 505
 506        return -EINVAL;
 507}
 508
 509static void f81232_set_baudrate(struct tty_struct *tty,
 510                                struct usb_serial_port *port, speed_t baudrate,
 511                                speed_t old_baudrate)
 512{
 513        struct f81232_private *priv = usb_get_serial_port_data(port);
 514        u8 lcr;
 515        int divisor;
 516        int status = 0;
 517        int i;
 518        int idx;
 519        speed_t baud_list[] = { baudrate, old_baudrate, F81232_DEF_BAUDRATE };
 520
 521        for (i = 0; i < ARRAY_SIZE(baud_list); ++i) {
 522                idx = f81232_find_clk(baud_list[i]);
 523                if (idx >= 0) {
 524                        baudrate = baud_list[i];
 525                        tty_encode_baud_rate(tty, baudrate, baudrate);
 526                        break;
 527                }
 528        }
 529
 530        if (idx < 0)
 531                return;
 532
 533        priv->baud_base = baudrate_table[idx];
 534        divisor = calc_baud_divisor(baudrate, priv->baud_base);
 535
 536        status = f81232_set_mask_register(port, F81232_CLK_REGISTER,
 537                        F81232_CLK_MASK, clock_table[idx]);
 538        if (status) {
 539                dev_err(&port->dev, "%s failed to set CLK_REG: %d\n",
 540                        __func__, status);
 541                return;
 542        }
 543
 544        status = f81232_get_register(port, LINE_CONTROL_REGISTER,
 545                         &lcr); /* get LCR */
 546        if (status) {
 547                dev_err(&port->dev, "%s failed to get LCR: %d\n",
 548                        __func__, status);
 549                return;
 550        }
 551
 552        status = f81232_set_register(port, LINE_CONTROL_REGISTER,
 553                         lcr | UART_LCR_DLAB); /* Enable DLAB */
 554        if (status) {
 555                dev_err(&port->dev, "%s failed to set DLAB: %d\n",
 556                        __func__, status);
 557                return;
 558        }
 559
 560        status = f81232_set_register(port, RECEIVE_BUFFER_REGISTER,
 561                         divisor & 0x00ff); /* low */
 562        if (status) {
 563                dev_err(&port->dev, "%s failed to set baudrate MSB: %d\n",
 564                        __func__, status);
 565                goto reapply_lcr;
 566        }
 567
 568        status = f81232_set_register(port, INTERRUPT_ENABLE_REGISTER,
 569                         (divisor & 0xff00) >> 8); /* high */
 570        if (status) {
 571                dev_err(&port->dev, "%s failed to set baudrate LSB: %d\n",
 572                        __func__, status);
 573        }
 574
 575reapply_lcr:
 576        status = f81232_set_register(port, LINE_CONTROL_REGISTER,
 577                        lcr & ~UART_LCR_DLAB);
 578        if (status) {
 579                dev_err(&port->dev, "%s failed to set DLAB: %d\n",
 580                        __func__, status);
 581        }
 582}
 583
 584static int f81232_port_enable(struct usb_serial_port *port)
 585{
 586        u8 val;
 587        int status;
 588
 589        /* fifo on, trigger8, clear TX/RX*/
 590        val = UART_FCR_TRIGGER_8 | UART_FCR_ENABLE_FIFO | UART_FCR_CLEAR_RCVR |
 591                        UART_FCR_CLEAR_XMIT;
 592
 593        status = f81232_set_register(port, FIFO_CONTROL_REGISTER, val);
 594        if (status) {
 595                dev_err(&port->dev, "%s failed to set FCR: %d\n",
 596                        __func__, status);
 597                return status;
 598        }
 599
 600        /* MSR Interrupt only, LSR will read from Bulk-in odd byte */
 601        status = f81232_set_register(port, INTERRUPT_ENABLE_REGISTER,
 602                        UART_IER_MSI);
 603        if (status) {
 604                dev_err(&port->dev, "%s failed to set IER: %d\n",
 605                        __func__, status);
 606                return status;
 607        }
 608
 609        return 0;
 610}
 611
 612static int f81232_port_disable(struct usb_serial_port *port)
 613{
 614        int status;
 615
 616        status = f81232_set_register(port, INTERRUPT_ENABLE_REGISTER, 0);
 617        if (status) {
 618                dev_err(&port->dev, "%s failed to set IER: %d\n",
 619                        __func__, status);
 620                return status;
 621        }
 622
 623        return 0;
 624}
 625
 626static void f81232_set_termios(struct tty_struct *tty,
 627                struct usb_serial_port *port, struct ktermios *old_termios)
 628{
 629        struct f81232_private *priv = usb_get_serial_port_data(port);
 630        u8 new_lcr = 0;
 631        int status = 0;
 632        speed_t baudrate;
 633        speed_t old_baud;
 634
 635        /* Don't change anything if nothing has changed */
 636        if (old_termios && !tty_termios_hw_change(&tty->termios, old_termios))
 637                return;
 638
 639        if (C_BAUD(tty) == B0)
 640                f81232_set_mctrl(port, 0, TIOCM_DTR | TIOCM_RTS);
 641        else if (old_termios && (old_termios->c_cflag & CBAUD) == B0)
 642                f81232_set_mctrl(port, TIOCM_DTR | TIOCM_RTS, 0);
 643
 644        baudrate = tty_get_baud_rate(tty);
 645        if (baudrate > 0) {
 646                if (old_termios)
 647                        old_baud = tty_termios_baud_rate(old_termios);
 648                else
 649                        old_baud = F81232_DEF_BAUDRATE;
 650
 651                f81232_set_baudrate(tty, port, baudrate, old_baud);
 652        }
 653
 654        if (C_PARENB(tty)) {
 655                new_lcr |= UART_LCR_PARITY;
 656
 657                if (!C_PARODD(tty))
 658                        new_lcr |= UART_LCR_EPAR;
 659
 660                if (C_CMSPAR(tty))
 661                        new_lcr |= UART_LCR_SPAR;
 662        }
 663
 664        if (C_CSTOPB(tty))
 665                new_lcr |= UART_LCR_STOP;
 666
 667        switch (C_CSIZE(tty)) {
 668        case CS5:
 669                new_lcr |= UART_LCR_WLEN5;
 670                break;
 671        case CS6:
 672                new_lcr |= UART_LCR_WLEN6;
 673                break;
 674        case CS7:
 675                new_lcr |= UART_LCR_WLEN7;
 676                break;
 677        default:
 678        case CS8:
 679                new_lcr |= UART_LCR_WLEN8;
 680                break;
 681        }
 682
 683        mutex_lock(&priv->lock);
 684
 685        new_lcr |= (priv->shadow_lcr & UART_LCR_SBC);
 686        status = f81232_set_register(port, LINE_CONTROL_REGISTER, new_lcr);
 687        if (status) {
 688                dev_err(&port->dev, "%s failed to set LCR: %d\n",
 689                        __func__, status);
 690        }
 691
 692        priv->shadow_lcr = new_lcr;
 693
 694        mutex_unlock(&priv->lock);
 695}
 696
 697static int f81232_tiocmget(struct tty_struct *tty)
 698{
 699        int r;
 700        struct usb_serial_port *port = tty->driver_data;
 701        struct f81232_private *port_priv = usb_get_serial_port_data(port);
 702        u8 mcr, msr;
 703
 704        /* force get current MSR changed state */
 705        f81232_read_msr(port);
 706
 707        mutex_lock(&port_priv->lock);
 708        mcr = port_priv->modem_control;
 709        msr = port_priv->modem_status;
 710        mutex_unlock(&port_priv->lock);
 711
 712        r = (mcr & UART_MCR_DTR ? TIOCM_DTR : 0) |
 713                (mcr & UART_MCR_RTS ? TIOCM_RTS : 0) |
 714                (msr & UART_MSR_CTS ? TIOCM_CTS : 0) |
 715                (msr & UART_MSR_DCD ? TIOCM_CAR : 0) |
 716                (msr & UART_MSR_RI ? TIOCM_RI : 0) |
 717                (msr & UART_MSR_DSR ? TIOCM_DSR : 0);
 718
 719        return r;
 720}
 721
 722static int f81232_tiocmset(struct tty_struct *tty,
 723                        unsigned int set, unsigned int clear)
 724{
 725        struct usb_serial_port *port = tty->driver_data;
 726
 727        return f81232_set_mctrl(port, set, clear);
 728}
 729
 730static int f81232_open(struct tty_struct *tty, struct usb_serial_port *port)
 731{
 732        int result;
 733
 734        result = f81232_port_enable(port);
 735        if (result)
 736                return result;
 737
 738        /* Setup termios */
 739        if (tty)
 740                f81232_set_termios(tty, port, NULL);
 741
 742        result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
 743        if (result) {
 744                dev_err(&port->dev, "%s - failed submitting interrupt urb,"
 745                        " error %d\n", __func__, result);
 746                return result;
 747        }
 748
 749        result = usb_serial_generic_open(tty, port);
 750        if (result) {
 751                usb_kill_urb(port->interrupt_in_urb);
 752                return result;
 753        }
 754
 755        return 0;
 756}
 757
 758static int f81534a_open(struct tty_struct *tty, struct usb_serial_port *port)
 759{
 760        int status;
 761        u8 mask;
 762        u8 val;
 763
 764        val = F81534A_TRIGGER_MULTIPLE_4X | F81534A_FIFO_128BYTE;
 765        mask = F81534A_TRIGGER_MASK | F81534A_FIFO_128BYTE;
 766
 767        status = f81232_set_mask_register(port, F81534A_MODE_REG, mask, val);
 768        if (status) {
 769                dev_err(&port->dev, "failed to set MODE_REG: %d\n", status);
 770                return status;
 771        }
 772
 773        return f81232_open(tty, port);
 774}
 775
 776static void f81232_close(struct usb_serial_port *port)
 777{
 778        struct f81232_private *port_priv = usb_get_serial_port_data(port);
 779
 780        f81232_port_disable(port);
 781        usb_serial_generic_close(port);
 782        usb_kill_urb(port->interrupt_in_urb);
 783        flush_work(&port_priv->interrupt_work);
 784        flush_work(&port_priv->lsr_work);
 785}
 786
 787static void f81232_dtr_rts(struct usb_serial_port *port, int on)
 788{
 789        if (on)
 790                f81232_set_mctrl(port, TIOCM_DTR | TIOCM_RTS, 0);
 791        else
 792                f81232_set_mctrl(port, 0, TIOCM_DTR | TIOCM_RTS);
 793}
 794
 795static bool f81232_tx_empty(struct usb_serial_port *port)
 796{
 797        int status;
 798        u8 tmp;
 799
 800        status = f81232_get_register(port, LINE_STATUS_REGISTER, &tmp);
 801        if (!status) {
 802                if ((tmp & UART_LSR_TEMT) != UART_LSR_TEMT)
 803                        return false;
 804        }
 805
 806        return true;
 807}
 808
 809static int f81232_carrier_raised(struct usb_serial_port *port)
 810{
 811        u8 msr;
 812        struct f81232_private *priv = usb_get_serial_port_data(port);
 813
 814        mutex_lock(&priv->lock);
 815        msr = priv->modem_status;
 816        mutex_unlock(&priv->lock);
 817
 818        if (msr & UART_MSR_DCD)
 819                return 1;
 820        return 0;
 821}
 822
 823static void f81232_get_serial(struct tty_struct *tty, struct serial_struct *ss)
 824{
 825        struct usb_serial_port *port = tty->driver_data;
 826        struct f81232_private *priv = usb_get_serial_port_data(port);
 827
 828        ss->baud_base = priv->baud_base;
 829}
 830
 831static void  f81232_interrupt_work(struct work_struct *work)
 832{
 833        struct f81232_private *priv =
 834                container_of(work, struct f81232_private, interrupt_work);
 835
 836        f81232_read_msr(priv->port);
 837}
 838
 839static void f81232_lsr_worker(struct work_struct *work)
 840{
 841        struct f81232_private *priv;
 842        struct usb_serial_port *port;
 843        int status;
 844        u8 tmp;
 845
 846        priv = container_of(work, struct f81232_private, lsr_work);
 847        port = priv->port;
 848
 849        status = f81232_get_register(port, LINE_STATUS_REGISTER, &tmp);
 850        if (status)
 851                dev_warn(&port->dev, "read LSR failed: %d\n", status);
 852}
 853
 854static int f81534a_ctrl_set_register(struct usb_interface *intf, u16 reg,
 855                                        u16 size, void *val)
 856{
 857        struct usb_device *dev = interface_to_usbdev(intf);
 858        int retry = F81534A_ACCESS_REG_RETRY;
 859        int status;
 860        u8 *tmp;
 861
 862        tmp = kmemdup(val, size, GFP_KERNEL);
 863        if (!tmp)
 864                return -ENOMEM;
 865
 866        while (retry--) {
 867                status = usb_control_msg(dev,
 868                                        usb_sndctrlpipe(dev, 0),
 869                                        F81232_REGISTER_REQUEST,
 870                                        F81232_SET_REGISTER,
 871                                        reg,
 872                                        0,
 873                                        tmp,
 874                                        size,
 875                                        USB_CTRL_SET_TIMEOUT);
 876                if (status < 0) {
 877                        status = usb_translate_errors(status);
 878                        if (status == -EIO)
 879                                continue;
 880                } else {
 881                        status = 0;
 882                }
 883
 884                break;
 885        }
 886
 887        if (status) {
 888                dev_err(&intf->dev, "failed to set register 0x%x: %d\n",
 889                                reg, status);
 890        }
 891
 892        kfree(tmp);
 893        return status;
 894}
 895
 896static int f81534a_ctrl_enable_all_ports(struct usb_interface *intf, bool en)
 897{
 898        unsigned char enable[2] = {0};
 899        int status;
 900
 901        /*
 902         * Enable all available serial ports, define as following:
 903         * bit 15       : Reset behavior (when HUB got soft reset)
 904         *                      0: maintain all serial port enabled state.
 905         *                      1: disable all serial port.
 906         * bit 0~11     : Serial port enable bit.
 907         */
 908        if (en) {
 909                enable[0] = 0xff;
 910                enable[1] = 0x8f;
 911        }
 912
 913        status = f81534a_ctrl_set_register(intf, F81534A_CTRL_CMD_ENABLE_PORT,
 914                        sizeof(enable), enable);
 915        if (status)
 916                dev_err(&intf->dev, "failed to enable ports: %d\n", status);
 917
 918        return status;
 919}
 920
 921static int f81534a_ctrl_probe(struct usb_interface *intf,
 922                                const struct usb_device_id *id)
 923{
 924        return f81534a_ctrl_enable_all_ports(intf, true);
 925}
 926
 927static void f81534a_ctrl_disconnect(struct usb_interface *intf)
 928{
 929        f81534a_ctrl_enable_all_ports(intf, false);
 930}
 931
 932static int f81534a_ctrl_resume(struct usb_interface *intf)
 933{
 934        return f81534a_ctrl_enable_all_ports(intf, true);
 935}
 936
 937static int f81232_port_probe(struct usb_serial_port *port)
 938{
 939        struct f81232_private *priv;
 940
 941        priv = devm_kzalloc(&port->dev, sizeof(*priv), GFP_KERNEL);
 942        if (!priv)
 943                return -ENOMEM;
 944
 945        mutex_init(&priv->lock);
 946        INIT_WORK(&priv->interrupt_work,  f81232_interrupt_work);
 947        INIT_WORK(&priv->lsr_work, f81232_lsr_worker);
 948
 949        usb_set_serial_port_data(port, priv);
 950
 951        priv->port = port;
 952
 953        return 0;
 954}
 955
 956static int f81534a_port_probe(struct usb_serial_port *port)
 957{
 958        int status;
 959
 960        /* tri-state with pull-high, default RS232 Mode */
 961        status = f81232_set_register(port, F81534A_GPIO_REG,
 962                                        F81534A_GPIO_MODE2_DIR);
 963        if (status)
 964                return status;
 965
 966        return f81232_port_probe(port);
 967}
 968
 969static int f81232_suspend(struct usb_serial *serial, pm_message_t message)
 970{
 971        struct usb_serial_port *port = serial->port[0];
 972        struct f81232_private *port_priv = usb_get_serial_port_data(port);
 973        int i;
 974
 975        for (i = 0; i < ARRAY_SIZE(port->read_urbs); ++i)
 976                usb_kill_urb(port->read_urbs[i]);
 977
 978        usb_kill_urb(port->interrupt_in_urb);
 979
 980        if (port_priv) {
 981                flush_work(&port_priv->interrupt_work);
 982                flush_work(&port_priv->lsr_work);
 983        }
 984
 985        return 0;
 986}
 987
 988static int f81232_resume(struct usb_serial *serial)
 989{
 990        struct usb_serial_port *port = serial->port[0];
 991        int result;
 992
 993        if (tty_port_initialized(&port->port)) {
 994                result = usb_submit_urb(port->interrupt_in_urb, GFP_NOIO);
 995                if (result) {
 996                        dev_err(&port->dev, "submit interrupt urb failed: %d\n",
 997                                        result);
 998                        return result;
 999                }
1000        }
1001
1002        return usb_serial_generic_resume(serial);
1003}
1004
1005static struct usb_serial_driver f81232_device = {
1006        .driver = {
1007                .owner =        THIS_MODULE,
1008                .name =         "f81232",
1009        },
1010        .id_table =             f81232_id_table,
1011        .num_ports =            1,
1012        .bulk_in_size =         256,
1013        .bulk_out_size =        256,
1014        .open =                 f81232_open,
1015        .close =                f81232_close,
1016        .dtr_rts =              f81232_dtr_rts,
1017        .carrier_raised =       f81232_carrier_raised,
1018        .get_serial =           f81232_get_serial,
1019        .break_ctl =            f81232_break_ctl,
1020        .set_termios =          f81232_set_termios,
1021        .tiocmget =             f81232_tiocmget,
1022        .tiocmset =             f81232_tiocmset,
1023        .tiocmiwait =           usb_serial_generic_tiocmiwait,
1024        .tx_empty =             f81232_tx_empty,
1025        .process_read_urb =     f81232_process_read_urb,
1026        .read_int_callback =    f81232_read_int_callback,
1027        .port_probe =           f81232_port_probe,
1028        .suspend =              f81232_suspend,
1029        .resume =               f81232_resume,
1030};
1031
1032static struct usb_serial_driver f81534a_device = {
1033        .driver = {
1034                .owner =        THIS_MODULE,
1035                .name =         "f81534a",
1036        },
1037        .id_table =             f81534a_id_table,
1038        .num_ports =            1,
1039        .open =                 f81534a_open,
1040        .close =                f81232_close,
1041        .dtr_rts =              f81232_dtr_rts,
1042        .carrier_raised =       f81232_carrier_raised,
1043        .get_serial =           f81232_get_serial,
1044        .break_ctl =            f81232_break_ctl,
1045        .set_termios =          f81232_set_termios,
1046        .tiocmget =             f81232_tiocmget,
1047        .tiocmset =             f81232_tiocmset,
1048        .tiocmiwait =           usb_serial_generic_tiocmiwait,
1049        .tx_empty =             f81232_tx_empty,
1050        .process_read_urb =     f81534a_process_read_urb,
1051        .read_int_callback =    f81232_read_int_callback,
1052        .port_probe =           f81534a_port_probe,
1053        .suspend =              f81232_suspend,
1054        .resume =               f81232_resume,
1055};
1056
1057static struct usb_serial_driver * const serial_drivers[] = {
1058        &f81232_device,
1059        &f81534a_device,
1060        NULL,
1061};
1062
1063static struct usb_driver f81534a_ctrl_driver = {
1064        .name =         "f81534a_ctrl",
1065        .id_table =     f81534a_ctrl_id_table,
1066        .probe =        f81534a_ctrl_probe,
1067        .disconnect =   f81534a_ctrl_disconnect,
1068        .resume =       f81534a_ctrl_resume,
1069};
1070
1071static int __init f81232_init(void)
1072{
1073        int status;
1074
1075        status = usb_register_driver(&f81534a_ctrl_driver, THIS_MODULE,
1076                        KBUILD_MODNAME);
1077        if (status)
1078                return status;
1079
1080        status = usb_serial_register_drivers(serial_drivers, KBUILD_MODNAME,
1081                        combined_id_table);
1082        if (status) {
1083                usb_deregister(&f81534a_ctrl_driver);
1084                return status;
1085        }
1086
1087        return 0;
1088}
1089
1090static void __exit f81232_exit(void)
1091{
1092        usb_serial_deregister_drivers(serial_drivers);
1093        usb_deregister(&f81534a_ctrl_driver);
1094}
1095
1096module_init(f81232_init);
1097module_exit(f81232_exit);
1098
1099MODULE_DESCRIPTION("Fintek F81232/532A/534A/535/536 USB to serial driver");
1100MODULE_AUTHOR("Greg Kroah-Hartman <gregkh@linuxfoundation.org>");
1101MODULE_AUTHOR("Peter Hong <peter_hong@fintek.com.tw>");
1102MODULE_LICENSE("GPL v2");
1103