linux/drivers/tty/serial/pch_uart.c
<<
>>
Prefs
   1/*
   2 *Copyright (C) 2010 OKI SEMICONDUCTOR CO., LTD.
   3 *
   4 *This program is free software; you can redistribute it and/or modify
   5 *it under the terms of the GNU General Public License as published by
   6 *the Free Software Foundation; version 2 of the License.
   7 *
   8 *This program is distributed in the hope that it will be useful,
   9 *but WITHOUT ANY WARRANTY; without even the implied warranty of
  10 *MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11 *GNU General Public License for more details.
  12 *
  13 *You should have received a copy of the GNU General Public License
  14 *along with this program; if not, write to the Free Software
  15 *Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307, USA.
  16 */
  17#include <linux/serial_reg.h>
  18#include <linux/pci.h>
  19#include <linux/module.h>
  20#include <linux/pci.h>
  21#include <linux/serial_core.h>
  22#include <linux/interrupt.h>
  23#include <linux/io.h>
  24
  25#include <linux/dmaengine.h>
  26#include <linux/pch_dma.h>
  27
  28enum {
  29        PCH_UART_HANDLED_RX_INT_SHIFT,
  30        PCH_UART_HANDLED_TX_INT_SHIFT,
  31        PCH_UART_HANDLED_RX_ERR_INT_SHIFT,
  32        PCH_UART_HANDLED_RX_TRG_INT_SHIFT,
  33        PCH_UART_HANDLED_MS_INT_SHIFT,
  34};
  35
  36enum {
  37        PCH_UART_8LINE,
  38        PCH_UART_2LINE,
  39};
  40
  41#define PCH_UART_DRIVER_DEVICE "ttyPCH"
  42
  43#define PCH_UART_NR_GE_256FIFO          1
  44#define PCH_UART_NR_GE_64FIFO           3
  45#define PCH_UART_NR_GE  (PCH_UART_NR_GE_256FIFO+PCH_UART_NR_GE_64FIFO)
  46#define PCH_UART_NR     PCH_UART_NR_GE
  47
  48#define PCH_UART_HANDLED_RX_INT (1<<((PCH_UART_HANDLED_RX_INT_SHIFT)<<1))
  49#define PCH_UART_HANDLED_TX_INT (1<<((PCH_UART_HANDLED_TX_INT_SHIFT)<<1))
  50#define PCH_UART_HANDLED_RX_ERR_INT     (1<<((\
  51                                        PCH_UART_HANDLED_RX_ERR_INT_SHIFT)<<1))
  52#define PCH_UART_HANDLED_RX_TRG_INT     (1<<((\
  53                                        PCH_UART_HANDLED_RX_TRG_INT_SHIFT)<<1))
  54#define PCH_UART_HANDLED_MS_INT (1<<((PCH_UART_HANDLED_MS_INT_SHIFT)<<1))
  55
  56#define PCH_UART_RBR            0x00
  57#define PCH_UART_THR            0x00
  58
  59#define PCH_UART_IER_MASK       (PCH_UART_IER_ERBFI|PCH_UART_IER_ETBEI|\
  60                                PCH_UART_IER_ELSI|PCH_UART_IER_EDSSI)
  61#define PCH_UART_IER_ERBFI      0x00000001
  62#define PCH_UART_IER_ETBEI      0x00000002
  63#define PCH_UART_IER_ELSI       0x00000004
  64#define PCH_UART_IER_EDSSI      0x00000008
  65
  66#define PCH_UART_IIR_IP                 0x00000001
  67#define PCH_UART_IIR_IID                0x00000006
  68#define PCH_UART_IIR_MSI                0x00000000
  69#define PCH_UART_IIR_TRI                0x00000002
  70#define PCH_UART_IIR_RRI                0x00000004
  71#define PCH_UART_IIR_REI                0x00000006
  72#define PCH_UART_IIR_TOI                0x00000008
  73#define PCH_UART_IIR_FIFO256            0x00000020
  74#define PCH_UART_IIR_FIFO64             PCH_UART_IIR_FIFO256
  75#define PCH_UART_IIR_FE                 0x000000C0
  76
  77#define PCH_UART_FCR_FIFOE              0x00000001
  78#define PCH_UART_FCR_RFR                0x00000002
  79#define PCH_UART_FCR_TFR                0x00000004
  80#define PCH_UART_FCR_DMS                0x00000008
  81#define PCH_UART_FCR_FIFO256            0x00000020
  82#define PCH_UART_FCR_RFTL               0x000000C0
  83
  84#define PCH_UART_FCR_RFTL1              0x00000000
  85#define PCH_UART_FCR_RFTL64             0x00000040
  86#define PCH_UART_FCR_RFTL128            0x00000080
  87#define PCH_UART_FCR_RFTL224            0x000000C0
  88#define PCH_UART_FCR_RFTL16             PCH_UART_FCR_RFTL64
  89#define PCH_UART_FCR_RFTL32             PCH_UART_FCR_RFTL128
  90#define PCH_UART_FCR_RFTL56             PCH_UART_FCR_RFTL224
  91#define PCH_UART_FCR_RFTL4              PCH_UART_FCR_RFTL64
  92#define PCH_UART_FCR_RFTL8              PCH_UART_FCR_RFTL128
  93#define PCH_UART_FCR_RFTL14             PCH_UART_FCR_RFTL224
  94#define PCH_UART_FCR_RFTL_SHIFT         6
  95
  96#define PCH_UART_LCR_WLS        0x00000003
  97#define PCH_UART_LCR_STB        0x00000004
  98#define PCH_UART_LCR_PEN        0x00000008
  99#define PCH_UART_LCR_EPS        0x00000010
 100#define PCH_UART_LCR_SP         0x00000020
 101#define PCH_UART_LCR_SB         0x00000040
 102#define PCH_UART_LCR_DLAB       0x00000080
 103#define PCH_UART_LCR_NP         0x00000000
 104#define PCH_UART_LCR_OP         PCH_UART_LCR_PEN
 105#define PCH_UART_LCR_EP         (PCH_UART_LCR_PEN | PCH_UART_LCR_EPS)
 106#define PCH_UART_LCR_1P         (PCH_UART_LCR_PEN | PCH_UART_LCR_SP)
 107#define PCH_UART_LCR_0P         (PCH_UART_LCR_PEN | PCH_UART_LCR_EPS |\
 108                                PCH_UART_LCR_SP)
 109
 110#define PCH_UART_LCR_5BIT       0x00000000
 111#define PCH_UART_LCR_6BIT       0x00000001
 112#define PCH_UART_LCR_7BIT       0x00000002
 113#define PCH_UART_LCR_8BIT       0x00000003
 114
 115#define PCH_UART_MCR_DTR        0x00000001
 116#define PCH_UART_MCR_RTS        0x00000002
 117#define PCH_UART_MCR_OUT        0x0000000C
 118#define PCH_UART_MCR_LOOP       0x00000010
 119#define PCH_UART_MCR_AFE        0x00000020
 120
 121#define PCH_UART_LSR_DR         0x00000001
 122#define PCH_UART_LSR_ERR        (1<<7)
 123
 124#define PCH_UART_MSR_DCTS       0x00000001
 125#define PCH_UART_MSR_DDSR       0x00000002
 126#define PCH_UART_MSR_TERI       0x00000004
 127#define PCH_UART_MSR_DDCD       0x00000008
 128#define PCH_UART_MSR_CTS        0x00000010
 129#define PCH_UART_MSR_DSR        0x00000020
 130#define PCH_UART_MSR_RI         0x00000040
 131#define PCH_UART_MSR_DCD        0x00000080
 132#define PCH_UART_MSR_DELTA      (PCH_UART_MSR_DCTS | PCH_UART_MSR_DDSR |\
 133                                PCH_UART_MSR_TERI | PCH_UART_MSR_DDCD)
 134
 135#define PCH_UART_DLL            0x00
 136#define PCH_UART_DLM            0x01
 137
 138#define DIV_ROUND(a, b) (((a) + ((b)/2)) / (b))
 139
 140#define PCH_UART_IID_RLS        (PCH_UART_IIR_REI)
 141#define PCH_UART_IID_RDR        (PCH_UART_IIR_RRI)
 142#define PCH_UART_IID_RDR_TO     (PCH_UART_IIR_RRI | PCH_UART_IIR_TOI)
 143#define PCH_UART_IID_THRE       (PCH_UART_IIR_TRI)
 144#define PCH_UART_IID_MS         (PCH_UART_IIR_MSI)
 145
 146#define PCH_UART_HAL_PARITY_NONE        (PCH_UART_LCR_NP)
 147#define PCH_UART_HAL_PARITY_ODD         (PCH_UART_LCR_OP)
 148#define PCH_UART_HAL_PARITY_EVEN        (PCH_UART_LCR_EP)
 149#define PCH_UART_HAL_PARITY_FIX1        (PCH_UART_LCR_1P)
 150#define PCH_UART_HAL_PARITY_FIX0        (PCH_UART_LCR_0P)
 151#define PCH_UART_HAL_5BIT               (PCH_UART_LCR_5BIT)
 152#define PCH_UART_HAL_6BIT               (PCH_UART_LCR_6BIT)
 153#define PCH_UART_HAL_7BIT               (PCH_UART_LCR_7BIT)
 154#define PCH_UART_HAL_8BIT               (PCH_UART_LCR_8BIT)
 155#define PCH_UART_HAL_STB1               0
 156#define PCH_UART_HAL_STB2               (PCH_UART_LCR_STB)
 157
 158#define PCH_UART_HAL_CLR_TX_FIFO        (PCH_UART_FCR_TFR)
 159#define PCH_UART_HAL_CLR_RX_FIFO        (PCH_UART_FCR_RFR)
 160#define PCH_UART_HAL_CLR_ALL_FIFO       (PCH_UART_HAL_CLR_TX_FIFO | \
 161                                        PCH_UART_HAL_CLR_RX_FIFO)
 162
 163#define PCH_UART_HAL_DMA_MODE0          0
 164#define PCH_UART_HAL_FIFO_DIS           0
 165#define PCH_UART_HAL_FIFO16             (PCH_UART_FCR_FIFOE)
 166#define PCH_UART_HAL_FIFO256            (PCH_UART_FCR_FIFOE | \
 167                                        PCH_UART_FCR_FIFO256)
 168#define PCH_UART_HAL_FIFO64             (PCH_UART_HAL_FIFO256)
 169#define PCH_UART_HAL_TRIGGER1           (PCH_UART_FCR_RFTL1)
 170#define PCH_UART_HAL_TRIGGER64          (PCH_UART_FCR_RFTL64)
 171#define PCH_UART_HAL_TRIGGER128         (PCH_UART_FCR_RFTL128)
 172#define PCH_UART_HAL_TRIGGER224         (PCH_UART_FCR_RFTL224)
 173#define PCH_UART_HAL_TRIGGER16          (PCH_UART_FCR_RFTL16)
 174#define PCH_UART_HAL_TRIGGER32          (PCH_UART_FCR_RFTL32)
 175#define PCH_UART_HAL_TRIGGER56          (PCH_UART_FCR_RFTL56)
 176#define PCH_UART_HAL_TRIGGER4           (PCH_UART_FCR_RFTL4)
 177#define PCH_UART_HAL_TRIGGER8           (PCH_UART_FCR_RFTL8)
 178#define PCH_UART_HAL_TRIGGER14          (PCH_UART_FCR_RFTL14)
 179#define PCH_UART_HAL_TRIGGER_L          (PCH_UART_FCR_RFTL64)
 180#define PCH_UART_HAL_TRIGGER_M          (PCH_UART_FCR_RFTL128)
 181#define PCH_UART_HAL_TRIGGER_H          (PCH_UART_FCR_RFTL224)
 182
 183#define PCH_UART_HAL_RX_INT             (PCH_UART_IER_ERBFI)
 184#define PCH_UART_HAL_TX_INT             (PCH_UART_IER_ETBEI)
 185#define PCH_UART_HAL_RX_ERR_INT         (PCH_UART_IER_ELSI)
 186#define PCH_UART_HAL_MS_INT             (PCH_UART_IER_EDSSI)
 187#define PCH_UART_HAL_ALL_INT            (PCH_UART_IER_MASK)
 188
 189#define PCH_UART_HAL_DTR                (PCH_UART_MCR_DTR)
 190#define PCH_UART_HAL_RTS                (PCH_UART_MCR_RTS)
 191#define PCH_UART_HAL_OUT                (PCH_UART_MCR_OUT)
 192#define PCH_UART_HAL_LOOP               (PCH_UART_MCR_LOOP)
 193#define PCH_UART_HAL_AFE                (PCH_UART_MCR_AFE)
 194
 195struct pch_uart_buffer {
 196        unsigned char *buf;
 197        int size;
 198};
 199
 200struct eg20t_port {
 201        struct uart_port port;
 202        int port_type;
 203        void __iomem *membase;
 204        resource_size_t mapbase;
 205        unsigned int iobase;
 206        struct pci_dev *pdev;
 207        int fifo_size;
 208        int base_baud;
 209        int start_tx;
 210        int start_rx;
 211        int tx_empty;
 212        int int_dis_flag;
 213        int trigger;
 214        int trigger_level;
 215        struct pch_uart_buffer rxbuf;
 216        unsigned int dmsr;
 217        unsigned int fcr;
 218        unsigned int use_dma;
 219        unsigned int use_dma_flag;
 220        struct dma_async_tx_descriptor  *desc_tx;
 221        struct dma_async_tx_descriptor  *desc_rx;
 222        struct pch_dma_slave            param_tx;
 223        struct pch_dma_slave            param_rx;
 224        struct dma_chan                 *chan_tx;
 225        struct dma_chan                 *chan_rx;
 226        struct scatterlist              sg_tx;
 227        struct scatterlist              sg_rx;
 228        int                             tx_dma_use;
 229        void                            *rx_buf_virt;
 230        dma_addr_t                      rx_buf_dma;
 231};
 232
 233static unsigned int default_baud = 9600;
 234static const int trigger_level_256[4] = { 1, 64, 128, 224 };
 235static const int trigger_level_64[4] = { 1, 16, 32, 56 };
 236static const int trigger_level_16[4] = { 1, 4, 8, 14 };
 237static const int trigger_level_1[4] = { 1, 1, 1, 1 };
 238
 239static void pch_uart_hal_request(struct pci_dev *pdev, int fifosize,
 240                                 int base_baud)
 241{
 242        struct eg20t_port *priv = pci_get_drvdata(pdev);
 243
 244        priv->trigger_level = 1;
 245        priv->fcr = 0;
 246}
 247
 248static unsigned int get_msr(struct eg20t_port *priv, void __iomem *base)
 249{
 250        unsigned int msr = ioread8(base + UART_MSR);
 251        priv->dmsr |= msr & PCH_UART_MSR_DELTA;
 252
 253        return msr;
 254}
 255
 256static void pch_uart_hal_enable_interrupt(struct eg20t_port *priv,
 257                                          unsigned int flag)
 258{
 259        u8 ier = ioread8(priv->membase + UART_IER);
 260        ier |= flag & PCH_UART_IER_MASK;
 261        iowrite8(ier, priv->membase + UART_IER);
 262}
 263
 264static void pch_uart_hal_disable_interrupt(struct eg20t_port *priv,
 265                                           unsigned int flag)
 266{
 267        u8 ier = ioread8(priv->membase + UART_IER);
 268        ier &= ~(flag & PCH_UART_IER_MASK);
 269        iowrite8(ier, priv->membase + UART_IER);
 270}
 271
 272static int pch_uart_hal_set_line(struct eg20t_port *priv, int baud,
 273                                 unsigned int parity, unsigned int bits,
 274                                 unsigned int stb)
 275{
 276        unsigned int dll, dlm, lcr;
 277        int div;
 278
 279        div = DIV_ROUND(priv->base_baud / 16, baud);
 280        if (div < 0 || USHRT_MAX <= div) {
 281                pr_err("Invalid Baud(div=0x%x)\n", div);
 282                return -EINVAL;
 283        }
 284
 285        dll = (unsigned int)div & 0x00FFU;
 286        dlm = ((unsigned int)div >> 8) & 0x00FFU;
 287
 288        if (parity & ~(PCH_UART_LCR_PEN | PCH_UART_LCR_EPS | PCH_UART_LCR_SP)) {
 289                pr_err("Invalid parity(0x%x)\n", parity);
 290                return -EINVAL;
 291        }
 292
 293        if (bits & ~PCH_UART_LCR_WLS) {
 294                pr_err("Invalid bits(0x%x)\n", bits);
 295                return -EINVAL;
 296        }
 297
 298        if (stb & ~PCH_UART_LCR_STB) {
 299                pr_err("Invalid STB(0x%x)\n", stb);
 300                return -EINVAL;
 301        }
 302
 303        lcr = parity;
 304        lcr |= bits;
 305        lcr |= stb;
 306
 307        pr_debug("%s:baud = %d, div = %04x, lcr = %02x (%lu)\n",
 308                 __func__, baud, div, lcr, jiffies);
 309        iowrite8(PCH_UART_LCR_DLAB, priv->membase + UART_LCR);
 310        iowrite8(dll, priv->membase + PCH_UART_DLL);
 311        iowrite8(dlm, priv->membase + PCH_UART_DLM);
 312        iowrite8(lcr, priv->membase + UART_LCR);
 313
 314        return 0;
 315}
 316
 317static int pch_uart_hal_fifo_reset(struct eg20t_port *priv,
 318                                    unsigned int flag)
 319{
 320        if (flag & ~(PCH_UART_FCR_TFR | PCH_UART_FCR_RFR)) {
 321                pr_err("%s:Invalid flag(0x%x)\n", __func__, flag);
 322                return -EINVAL;
 323        }
 324
 325        iowrite8(PCH_UART_FCR_FIFOE | priv->fcr, priv->membase + UART_FCR);
 326        iowrite8(PCH_UART_FCR_FIFOE | priv->fcr | flag,
 327                 priv->membase + UART_FCR);
 328        iowrite8(priv->fcr, priv->membase + UART_FCR);
 329
 330        return 0;
 331}
 332
 333static int pch_uart_hal_set_fifo(struct eg20t_port *priv,
 334                                 unsigned int dmamode,
 335                                 unsigned int fifo_size, unsigned int trigger)
 336{
 337        u8 fcr;
 338
 339        if (dmamode & ~PCH_UART_FCR_DMS) {
 340                pr_err("%s:Invalid DMA Mode(0x%x)\n", __func__, dmamode);
 341                return -EINVAL;
 342        }
 343
 344        if (fifo_size & ~(PCH_UART_FCR_FIFOE | PCH_UART_FCR_FIFO256)) {
 345                pr_err("%s:Invalid FIFO SIZE(0x%x)\n", __func__, fifo_size);
 346                return -EINVAL;
 347        }
 348
 349        if (trigger & ~PCH_UART_FCR_RFTL) {
 350                pr_err("%s:Invalid TRIGGER(0x%x)\n", __func__, trigger);
 351                return -EINVAL;
 352        }
 353
 354        switch (priv->fifo_size) {
 355        case 256:
 356                priv->trigger_level =
 357                    trigger_level_256[trigger >> PCH_UART_FCR_RFTL_SHIFT];
 358                break;
 359        case 64:
 360                priv->trigger_level =
 361                    trigger_level_64[trigger >> PCH_UART_FCR_RFTL_SHIFT];
 362                break;
 363        case 16:
 364                priv->trigger_level =
 365                    trigger_level_16[trigger >> PCH_UART_FCR_RFTL_SHIFT];
 366                break;
 367        default:
 368                priv->trigger_level =
 369                    trigger_level_1[trigger >> PCH_UART_FCR_RFTL_SHIFT];
 370                break;
 371        }
 372        fcr =
 373            dmamode | fifo_size | trigger | PCH_UART_FCR_RFR | PCH_UART_FCR_TFR;
 374        iowrite8(PCH_UART_FCR_FIFOE, priv->membase + UART_FCR);
 375        iowrite8(PCH_UART_FCR_FIFOE | PCH_UART_FCR_RFR | PCH_UART_FCR_TFR,
 376                 priv->membase + UART_FCR);
 377        iowrite8(fcr, priv->membase + UART_FCR);
 378        priv->fcr = fcr;
 379
 380        return 0;
 381}
 382
 383static u8 pch_uart_hal_get_modem(struct eg20t_port *priv)
 384{
 385        priv->dmsr = 0;
 386        return get_msr(priv, priv->membase);
 387}
 388
 389static int pch_uart_hal_write(struct eg20t_port *priv,
 390                              const unsigned char *buf, int tx_size)
 391{
 392        int i;
 393        unsigned int thr;
 394
 395        for (i = 0; i < tx_size;) {
 396                thr = buf[i++];
 397                iowrite8(thr, priv->membase + PCH_UART_THR);
 398        }
 399        return i;
 400}
 401
 402static int pch_uart_hal_read(struct eg20t_port *priv, unsigned char *buf,
 403                             int rx_size)
 404{
 405        int i;
 406        u8 rbr, lsr;
 407
 408        lsr = ioread8(priv->membase + UART_LSR);
 409        for (i = 0, lsr = ioread8(priv->membase + UART_LSR);
 410             i < rx_size && lsr & UART_LSR_DR;
 411             lsr = ioread8(priv->membase + UART_LSR)) {
 412                rbr = ioread8(priv->membase + PCH_UART_RBR);
 413                buf[i++] = rbr;
 414        }
 415        return i;
 416}
 417
 418static unsigned int pch_uart_hal_get_iid(struct eg20t_port *priv)
 419{
 420        unsigned int iir;
 421        int ret;
 422
 423        iir = ioread8(priv->membase + UART_IIR);
 424        ret = (iir & (PCH_UART_IIR_IID | PCH_UART_IIR_TOI | PCH_UART_IIR_IP));
 425        return ret;
 426}
 427
 428static u8 pch_uart_hal_get_line_status(struct eg20t_port *priv)
 429{
 430        return ioread8(priv->membase + UART_LSR);
 431}
 432
 433static void pch_uart_hal_set_break(struct eg20t_port *priv, int on)
 434{
 435        unsigned int lcr;
 436
 437        lcr = ioread8(priv->membase + UART_LCR);
 438        if (on)
 439                lcr |= PCH_UART_LCR_SB;
 440        else
 441                lcr &= ~PCH_UART_LCR_SB;
 442
 443        iowrite8(lcr, priv->membase + UART_LCR);
 444}
 445
 446static int push_rx(struct eg20t_port *priv, const unsigned char *buf,
 447                   int size)
 448{
 449        struct uart_port *port;
 450        struct tty_struct *tty;
 451
 452        port = &priv->port;
 453        tty = tty_port_tty_get(&port->state->port);
 454        if (!tty) {
 455                pr_debug("%s:tty is busy now", __func__);
 456                return -EBUSY;
 457        }
 458
 459        tty_insert_flip_string(tty, buf, size);
 460        tty_flip_buffer_push(tty);
 461        tty_kref_put(tty);
 462
 463        return 0;
 464}
 465
 466static int pop_tx_x(struct eg20t_port *priv, unsigned char *buf)
 467{
 468        int ret;
 469        struct uart_port *port = &priv->port;
 470
 471        if (port->x_char) {
 472                pr_debug("%s:X character send %02x (%lu)\n", __func__,
 473                        port->x_char, jiffies);
 474                buf[0] = port->x_char;
 475                port->x_char = 0;
 476                ret = 1;
 477        } else {
 478                ret = 0;
 479        }
 480
 481        return ret;
 482}
 483
 484static int dma_push_rx(struct eg20t_port *priv, int size)
 485{
 486        struct tty_struct *tty;
 487        int room;
 488        struct uart_port *port = &priv->port;
 489
 490        port = &priv->port;
 491        tty = tty_port_tty_get(&port->state->port);
 492        if (!tty) {
 493                pr_debug("%s:tty is busy now", __func__);
 494                return 0;
 495        }
 496
 497        room = tty_buffer_request_room(tty, size);
 498
 499        if (room < size)
 500                dev_warn(port->dev, "Rx overrun: dropping %u bytes\n",
 501                         size - room);
 502        if (!room)
 503                return room;
 504
 505        tty_insert_flip_string(tty, sg_virt(&priv->sg_rx), size);
 506
 507        port->icount.rx += room;
 508        tty_kref_put(tty);
 509
 510        return room;
 511}
 512
 513static void pch_free_dma(struct uart_port *port)
 514{
 515        struct eg20t_port *priv;
 516        priv = container_of(port, struct eg20t_port, port);
 517
 518        if (priv->chan_tx) {
 519                dma_release_channel(priv->chan_tx);
 520                priv->chan_tx = NULL;
 521        }
 522        if (priv->chan_rx) {
 523                dma_release_channel(priv->chan_rx);
 524                priv->chan_rx = NULL;
 525        }
 526        if (sg_dma_address(&priv->sg_rx))
 527                dma_free_coherent(port->dev, port->fifosize,
 528                                  sg_virt(&priv->sg_rx),
 529                                  sg_dma_address(&priv->sg_rx));
 530
 531        return;
 532}
 533
 534static bool filter(struct dma_chan *chan, void *slave)
 535{
 536        struct pch_dma_slave *param = slave;
 537
 538        if ((chan->chan_id == param->chan_id) && (param->dma_dev ==
 539                                                  chan->device->dev)) {
 540                chan->private = param;
 541                return true;
 542        } else {
 543                return false;
 544        }
 545}
 546
 547static void pch_request_dma(struct uart_port *port)
 548{
 549        dma_cap_mask_t mask;
 550        struct dma_chan *chan;
 551        struct pci_dev *dma_dev;
 552        struct pch_dma_slave *param;
 553        struct eg20t_port *priv =
 554                                container_of(port, struct eg20t_port, port);
 555        dma_cap_zero(mask);
 556        dma_cap_set(DMA_SLAVE, mask);
 557
 558        dma_dev = pci_get_bus_and_slot(2, PCI_DEVFN(0xa, 0)); /* Get DMA's dev
 559                                                                information */
 560        /* Set Tx DMA */
 561        param = &priv->param_tx;
 562        param->dma_dev = &dma_dev->dev;
 563        param->chan_id = priv->port.line;
 564        param->tx_reg = port->mapbase + UART_TX;
 565        chan = dma_request_channel(mask, filter, param);
 566        if (!chan) {
 567                pr_err("%s:dma_request_channel FAILS(Tx)\n", __func__);
 568                return;
 569        }
 570        priv->chan_tx = chan;
 571
 572        /* Set Rx DMA */
 573        param = &priv->param_rx;
 574        param->dma_dev = &dma_dev->dev;
 575        param->chan_id = priv->port.line + 1; /* Rx = Tx + 1 */
 576        param->rx_reg = port->mapbase + UART_RX;
 577        chan = dma_request_channel(mask, filter, param);
 578        if (!chan) {
 579                pr_err("%s:dma_request_channel FAILS(Rx)\n", __func__);
 580                dma_release_channel(priv->chan_tx);
 581                return;
 582        }
 583
 584        /* Get Consistent memory for DMA */
 585        priv->rx_buf_virt = dma_alloc_coherent(port->dev, port->fifosize,
 586                                    &priv->rx_buf_dma, GFP_KERNEL);
 587        priv->chan_rx = chan;
 588}
 589
 590static void pch_dma_rx_complete(void *arg)
 591{
 592        struct eg20t_port *priv = arg;
 593        struct uart_port *port = &priv->port;
 594        struct tty_struct *tty = tty_port_tty_get(&port->state->port);
 595
 596        if (!tty) {
 597                pr_debug("%s:tty is busy now", __func__);
 598                return;
 599        }
 600
 601        if (dma_push_rx(priv, priv->trigger_level))
 602                tty_flip_buffer_push(tty);
 603
 604        tty_kref_put(tty);
 605}
 606
 607static void pch_dma_tx_complete(void *arg)
 608{
 609        struct eg20t_port *priv = arg;
 610        struct uart_port *port = &priv->port;
 611        struct circ_buf *xmit = &port->state->xmit;
 612
 613        xmit->tail += sg_dma_len(&priv->sg_tx);
 614        xmit->tail &= UART_XMIT_SIZE - 1;
 615        port->icount.tx += sg_dma_len(&priv->sg_tx);
 616
 617        async_tx_ack(priv->desc_tx);
 618        priv->tx_dma_use = 0;
 619}
 620
 621static int pop_tx(struct eg20t_port *priv, unsigned char *buf, int size)
 622{
 623        int count = 0;
 624        struct uart_port *port = &priv->port;
 625        struct circ_buf *xmit = &port->state->xmit;
 626
 627        if (uart_tx_stopped(port) || uart_circ_empty(xmit) || count >= size)
 628                goto pop_tx_end;
 629
 630        do {
 631                int cnt_to_end =
 632                    CIRC_CNT_TO_END(xmit->head, xmit->tail, UART_XMIT_SIZE);
 633                int sz = min(size - count, cnt_to_end);
 634                memcpy(&buf[count], &xmit->buf[xmit->tail], sz);
 635                xmit->tail = (xmit->tail + sz) & (UART_XMIT_SIZE - 1);
 636                count += sz;
 637        } while (!uart_circ_empty(xmit) && count < size);
 638
 639pop_tx_end:
 640        pr_debug("%d characters. Remained %d characters. (%lu)\n",
 641                 count, size - count, jiffies);
 642
 643        return count;
 644}
 645
 646static int handle_rx_to(struct eg20t_port *priv)
 647{
 648        struct pch_uart_buffer *buf;
 649        int rx_size;
 650        int ret;
 651        if (!priv->start_rx) {
 652                pch_uart_hal_disable_interrupt(priv, PCH_UART_HAL_RX_INT);
 653                return 0;
 654        }
 655        buf = &priv->rxbuf;
 656        do {
 657                rx_size = pch_uart_hal_read(priv, buf->buf, buf->size);
 658                ret = push_rx(priv, buf->buf, rx_size);
 659                if (ret)
 660                        return 0;
 661        } while (rx_size == buf->size);
 662
 663        return PCH_UART_HANDLED_RX_INT;
 664}
 665
 666static int handle_rx(struct eg20t_port *priv)
 667{
 668        return handle_rx_to(priv);
 669}
 670
 671static int dma_handle_rx(struct eg20t_port *priv)
 672{
 673        struct uart_port *port = &priv->port;
 674        struct dma_async_tx_descriptor *desc;
 675        struct scatterlist *sg;
 676
 677        priv = container_of(port, struct eg20t_port, port);
 678        sg = &priv->sg_rx;
 679
 680        sg_init_table(&priv->sg_rx, 1); /* Initialize SG table */
 681
 682        sg_dma_len(sg) = priv->fifo_size;
 683
 684        sg_set_page(&priv->sg_rx, virt_to_page(priv->rx_buf_virt),
 685                     sg_dma_len(sg), (unsigned long)priv->rx_buf_virt &
 686                     ~PAGE_MASK);
 687
 688        sg_dma_address(sg) = priv->rx_buf_dma;
 689
 690        desc = priv->chan_rx->device->device_prep_slave_sg(priv->chan_rx,
 691                        sg, 1, DMA_FROM_DEVICE,
 692                        DMA_PREP_INTERRUPT);
 693        if (!desc)
 694                return 0;
 695
 696        priv->desc_rx = desc;
 697        desc->callback = pch_dma_rx_complete;
 698        desc->callback_param = priv;
 699        desc->tx_submit(desc);
 700        dma_async_issue_pending(priv->chan_rx);
 701
 702        return PCH_UART_HANDLED_RX_INT;
 703}
 704
 705static unsigned int handle_tx(struct eg20t_port *priv)
 706{
 707        struct uart_port *port = &priv->port;
 708        struct circ_buf *xmit = &port->state->xmit;
 709        int ret;
 710        int fifo_size;
 711        int tx_size;
 712        int size;
 713        int tx_empty;
 714
 715        if (!priv->start_tx) {
 716                pr_info("%s:Tx isn't started. (%lu)\n", __func__, jiffies);
 717                pch_uart_hal_disable_interrupt(priv, PCH_UART_HAL_TX_INT);
 718                priv->tx_empty = 1;
 719                return 0;
 720        }
 721
 722        fifo_size = max(priv->fifo_size, 1);
 723        tx_empty = 1;
 724        if (pop_tx_x(priv, xmit->buf)) {
 725                pch_uart_hal_write(priv, xmit->buf, 1);
 726                port->icount.tx++;
 727                tx_empty = 0;
 728                fifo_size--;
 729        }
 730        size = min(xmit->head - xmit->tail, fifo_size);
 731        tx_size = pop_tx(priv, xmit->buf, size);
 732        if (tx_size > 0) {
 733                ret = pch_uart_hal_write(priv, xmit->buf, tx_size);
 734                port->icount.tx += ret;
 735                tx_empty = 0;
 736        }
 737
 738        priv->tx_empty = tx_empty;
 739
 740        if (tx_empty)
 741                pch_uart_hal_disable_interrupt(priv, PCH_UART_HAL_TX_INT);
 742
 743        return PCH_UART_HANDLED_TX_INT;
 744}
 745
 746static unsigned int dma_handle_tx(struct eg20t_port *priv)
 747{
 748        struct uart_port *port = &priv->port;
 749        struct circ_buf *xmit = &port->state->xmit;
 750        struct scatterlist *sg = &priv->sg_tx;
 751        int nent;
 752        int fifo_size;
 753        int tx_empty;
 754        struct dma_async_tx_descriptor *desc;
 755
 756        if (!priv->start_tx) {
 757                pr_info("%s:Tx isn't started. (%lu)\n", __func__, jiffies);
 758                pch_uart_hal_disable_interrupt(priv, PCH_UART_HAL_TX_INT);
 759                priv->tx_empty = 1;
 760                return 0;
 761        }
 762
 763        fifo_size = max(priv->fifo_size, 1);
 764        tx_empty = 1;
 765        if (pop_tx_x(priv, xmit->buf)) {
 766                pch_uart_hal_write(priv, xmit->buf, 1);
 767                port->icount.tx++;
 768                tx_empty = 0;
 769                fifo_size--;
 770        }
 771
 772        pch_uart_hal_disable_interrupt(priv, PCH_UART_HAL_TX_INT);
 773
 774        priv->tx_dma_use = 1;
 775
 776        sg_init_table(&priv->sg_tx, 1); /* Initialize SG table */
 777
 778        sg_set_page(&priv->sg_tx, virt_to_page(xmit->buf),
 779                    UART_XMIT_SIZE, (int)xmit->buf & ~PAGE_MASK);
 780
 781        nent = dma_map_sg(port->dev, &priv->sg_tx, 1, DMA_TO_DEVICE);
 782        if (!nent) {
 783                pr_err("%s:dma_map_sg Failed\n", __func__);
 784                return 0;
 785        }
 786
 787        sg->offset = xmit->tail & (UART_XMIT_SIZE - 1);
 788        sg_dma_address(sg) = (sg_dma_address(sg) & ~(UART_XMIT_SIZE - 1)) +
 789                              sg->offset;
 790        sg_dma_len(sg) = min((int)CIRC_CNT(xmit->head, xmit->tail,
 791                             UART_XMIT_SIZE), CIRC_CNT_TO_END(xmit->head,
 792                             xmit->tail, UART_XMIT_SIZE));
 793
 794        desc = priv->chan_tx->device->device_prep_slave_sg(priv->chan_tx,
 795                sg, nent, DMA_TO_DEVICE, DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
 796        if (!desc) {
 797                pr_err("%s:device_prep_slave_sg Failed\n", __func__);
 798                return 0;
 799        }
 800
 801        dma_sync_sg_for_device(port->dev, sg, 1, DMA_TO_DEVICE);
 802
 803        priv->desc_tx = desc;
 804        desc->callback = pch_dma_tx_complete;
 805        desc->callback_param = priv;
 806
 807        desc->tx_submit(desc);
 808
 809        dma_async_issue_pending(priv->chan_tx);
 810
 811        return PCH_UART_HANDLED_TX_INT;
 812}
 813
 814static void pch_uart_err_ir(struct eg20t_port *priv, unsigned int lsr)
 815{
 816        u8 fcr = ioread8(priv->membase + UART_FCR);
 817
 818        /* Reset FIFO */
 819        fcr |= UART_FCR_CLEAR_RCVR;
 820        iowrite8(fcr, priv->membase + UART_FCR);
 821
 822        if (lsr & PCH_UART_LSR_ERR)
 823                dev_err(&priv->pdev->dev, "Error data in FIFO\n");
 824
 825        if (lsr & UART_LSR_FE)
 826                dev_err(&priv->pdev->dev, "Framing Error\n");
 827
 828        if (lsr & UART_LSR_PE)
 829                dev_err(&priv->pdev->dev, "Parity Error\n");
 830
 831        if (lsr & UART_LSR_OE)
 832                dev_err(&priv->pdev->dev, "Overrun Error\n");
 833}
 834
 835static irqreturn_t pch_uart_interrupt(int irq, void *dev_id)
 836{
 837        struct eg20t_port *priv = dev_id;
 838        unsigned int handled;
 839        u8 lsr;
 840        int ret = 0;
 841        unsigned int iid;
 842        unsigned long flags;
 843
 844        spin_lock_irqsave(&priv->port.lock, flags);
 845        handled = 0;
 846        while ((iid = pch_uart_hal_get_iid(priv)) > 1) {
 847                switch (iid) {
 848                case PCH_UART_IID_RLS:  /* Receiver Line Status */
 849                        lsr = pch_uart_hal_get_line_status(priv);
 850                        if (lsr & (PCH_UART_LSR_ERR | UART_LSR_FE |
 851                                                UART_LSR_PE | UART_LSR_OE)) {
 852                                pch_uart_err_ir(priv, lsr);
 853                                ret = PCH_UART_HANDLED_RX_ERR_INT;
 854                        }
 855                        break;
 856                case PCH_UART_IID_RDR:  /* Received Data Ready */
 857                        if (priv->use_dma)
 858                                ret = dma_handle_rx(priv);
 859                        else
 860                                ret = handle_rx(priv);
 861                        break;
 862                case PCH_UART_IID_RDR_TO:       /* Received Data Ready
 863                                                   (FIFO Timeout) */
 864                        ret = handle_rx_to(priv);
 865                        break;
 866                case PCH_UART_IID_THRE: /* Transmitter Holding Register
 867                                                   Empty */
 868                        if (priv->use_dma)
 869                                ret = dma_handle_tx(priv);
 870                        else
 871                                ret = handle_tx(priv);
 872                        break;
 873                case PCH_UART_IID_MS:   /* Modem Status */
 874                        ret = PCH_UART_HANDLED_MS_INT;
 875                        break;
 876                default:        /* Never junp to this label */
 877                        pr_err("%s:iid=%d (%lu)\n", __func__, iid, jiffies);
 878                        ret = -1;
 879                        break;
 880                }
 881                handled |= (unsigned int)ret;
 882        }
 883        if (handled == 0 && iid <= 1) {
 884                if (priv->int_dis_flag)
 885                        priv->int_dis_flag = 0;
 886        }
 887
 888        spin_unlock_irqrestore(&priv->port.lock, flags);
 889        return IRQ_RETVAL(handled);
 890}
 891
 892/* This function tests whether the transmitter fifo and shifter for the port
 893                                                described by 'port' is empty. */
 894static unsigned int pch_uart_tx_empty(struct uart_port *port)
 895{
 896        struct eg20t_port *priv;
 897        int ret;
 898        priv = container_of(port, struct eg20t_port, port);
 899        if (priv->tx_empty)
 900                ret = TIOCSER_TEMT;
 901        else
 902                ret = 0;
 903
 904        return ret;
 905}
 906
 907/* Returns the current state of modem control inputs. */
 908static unsigned int pch_uart_get_mctrl(struct uart_port *port)
 909{
 910        struct eg20t_port *priv;
 911        u8 modem;
 912        unsigned int ret = 0;
 913
 914        priv = container_of(port, struct eg20t_port, port);
 915        modem = pch_uart_hal_get_modem(priv);
 916
 917        if (modem & UART_MSR_DCD)
 918                ret |= TIOCM_CAR;
 919
 920        if (modem & UART_MSR_RI)
 921                ret |= TIOCM_RNG;
 922
 923        if (modem & UART_MSR_DSR)
 924                ret |= TIOCM_DSR;
 925
 926        if (modem & UART_MSR_CTS)
 927                ret |= TIOCM_CTS;
 928
 929        return ret;
 930}
 931
 932static void pch_uart_set_mctrl(struct uart_port *port, unsigned int mctrl)
 933{
 934        u32 mcr = 0;
 935        unsigned int dat;
 936        struct eg20t_port *priv = container_of(port, struct eg20t_port, port);
 937
 938        if (mctrl & TIOCM_DTR)
 939                mcr |= UART_MCR_DTR;
 940        if (mctrl & TIOCM_RTS)
 941                mcr |= UART_MCR_RTS;
 942        if (mctrl & TIOCM_LOOP)
 943                mcr |= UART_MCR_LOOP;
 944
 945        if (mctrl) {
 946                dat = pch_uart_get_mctrl(port);
 947                dat |= mcr;
 948                iowrite8(dat, priv->membase + UART_MCR);
 949        }
 950}
 951
 952static void pch_uart_stop_tx(struct uart_port *port)
 953{
 954        struct eg20t_port *priv;
 955        priv = container_of(port, struct eg20t_port, port);
 956        priv->start_tx = 0;
 957        priv->tx_dma_use = 0;
 958}
 959
 960static void pch_uart_start_tx(struct uart_port *port)
 961{
 962        struct eg20t_port *priv;
 963
 964        priv = container_of(port, struct eg20t_port, port);
 965
 966        if (priv->use_dma)
 967                if (priv->tx_dma_use)
 968                        return;
 969
 970        priv->start_tx = 1;
 971        pch_uart_hal_enable_interrupt(priv, PCH_UART_HAL_TX_INT);
 972}
 973
 974static void pch_uart_stop_rx(struct uart_port *port)
 975{
 976        struct eg20t_port *priv;
 977        priv = container_of(port, struct eg20t_port, port);
 978        priv->start_rx = 0;
 979        pch_uart_hal_disable_interrupt(priv, PCH_UART_HAL_RX_INT);
 980        priv->int_dis_flag = 1;
 981}
 982
 983/* Enable the modem status interrupts. */
 984static void pch_uart_enable_ms(struct uart_port *port)
 985{
 986        struct eg20t_port *priv;
 987        priv = container_of(port, struct eg20t_port, port);
 988        pch_uart_hal_enable_interrupt(priv, PCH_UART_HAL_MS_INT);
 989}
 990
 991/* Control the transmission of a break signal. */
 992static void pch_uart_break_ctl(struct uart_port *port, int ctl)
 993{
 994        struct eg20t_port *priv;
 995        unsigned long flags;
 996
 997        priv = container_of(port, struct eg20t_port, port);
 998        spin_lock_irqsave(&port->lock, flags);
 999        pch_uart_hal_set_break(priv, ctl);
1000        spin_unlock_irqrestore(&port->lock, flags);
1001}
1002
1003/* Grab any interrupt resources and initialise any low level driver state. */
1004static int pch_uart_startup(struct uart_port *port)
1005{
1006        struct eg20t_port *priv;
1007        int ret;
1008        int fifo_size;
1009        int trigger_level;
1010
1011        priv = container_of(port, struct eg20t_port, port);
1012        priv->tx_empty = 1;
1013        port->uartclk = priv->base_baud;
1014        pch_uart_hal_disable_interrupt(priv, PCH_UART_HAL_ALL_INT);
1015        ret = pch_uart_hal_set_line(priv, default_baud,
1016                              PCH_UART_HAL_PARITY_NONE, PCH_UART_HAL_8BIT,
1017                              PCH_UART_HAL_STB1);
1018        if (ret)
1019                return ret;
1020
1021        switch (priv->fifo_size) {
1022        case 256:
1023                fifo_size = PCH_UART_HAL_FIFO256;
1024                break;
1025        case 64:
1026                fifo_size = PCH_UART_HAL_FIFO64;
1027                break;
1028        case 16:
1029                fifo_size = PCH_UART_HAL_FIFO16;
1030        case 1:
1031        default:
1032                fifo_size = PCH_UART_HAL_FIFO_DIS;
1033                break;
1034        }
1035
1036        switch (priv->trigger) {
1037        case PCH_UART_HAL_TRIGGER1:
1038                trigger_level = 1;
1039                break;
1040        case PCH_UART_HAL_TRIGGER_L:
1041                trigger_level = priv->fifo_size / 4;
1042                break;
1043        case PCH_UART_HAL_TRIGGER_M:
1044                trigger_level = priv->fifo_size / 2;
1045                break;
1046        case PCH_UART_HAL_TRIGGER_H:
1047        default:
1048                trigger_level = priv->fifo_size - (priv->fifo_size / 8);
1049                break;
1050        }
1051
1052        priv->trigger_level = trigger_level;
1053        ret = pch_uart_hal_set_fifo(priv, PCH_UART_HAL_DMA_MODE0,
1054                                    fifo_size, priv->trigger);
1055        if (ret < 0)
1056                return ret;
1057
1058        ret = request_irq(priv->port.irq, pch_uart_interrupt, IRQF_SHARED,
1059                        KBUILD_MODNAME, priv);
1060        if (ret < 0)
1061                return ret;
1062
1063        if (priv->use_dma)
1064                pch_request_dma(port);
1065
1066        priv->start_rx = 1;
1067        pch_uart_hal_enable_interrupt(priv, PCH_UART_HAL_RX_INT);
1068        uart_update_timeout(port, CS8, default_baud);
1069
1070        return 0;
1071}
1072
1073static void pch_uart_shutdown(struct uart_port *port)
1074{
1075        struct eg20t_port *priv;
1076        int ret;
1077
1078        priv = container_of(port, struct eg20t_port, port);
1079        pch_uart_hal_disable_interrupt(priv, PCH_UART_HAL_ALL_INT);
1080        pch_uart_hal_fifo_reset(priv, PCH_UART_HAL_CLR_ALL_FIFO);
1081        ret = pch_uart_hal_set_fifo(priv, PCH_UART_HAL_DMA_MODE0,
1082                              PCH_UART_HAL_FIFO_DIS, PCH_UART_HAL_TRIGGER1);
1083        if (ret)
1084                pr_err("pch_uart_hal_set_fifo Failed(ret=%d)\n", ret);
1085
1086        if (priv->use_dma_flag)
1087                pch_free_dma(port);
1088
1089        free_irq(priv->port.irq, priv);
1090}
1091
1092/* Change the port parameters, including word length, parity, stop
1093 *bits.  Update read_status_mask and ignore_status_mask to indicate
1094 *the types of events we are interested in receiving.  */
1095static void pch_uart_set_termios(struct uart_port *port,
1096                                 struct ktermios *termios, struct ktermios *old)
1097{
1098        int baud;
1099        int rtn;
1100        unsigned int parity, bits, stb;
1101        struct eg20t_port *priv;
1102        unsigned long flags;
1103
1104        priv = container_of(port, struct eg20t_port, port);
1105        switch (termios->c_cflag & CSIZE) {
1106        case CS5:
1107                bits = PCH_UART_HAL_5BIT;
1108                break;
1109        case CS6:
1110                bits = PCH_UART_HAL_6BIT;
1111                break;
1112        case CS7:
1113                bits = PCH_UART_HAL_7BIT;
1114                break;
1115        default:                /* CS8 */
1116                bits = PCH_UART_HAL_8BIT;
1117                break;
1118        }
1119        if (termios->c_cflag & CSTOPB)
1120                stb = PCH_UART_HAL_STB2;
1121        else
1122                stb = PCH_UART_HAL_STB1;
1123
1124        if (termios->c_cflag & PARENB) {
1125                if (!(termios->c_cflag & PARODD))
1126                        parity = PCH_UART_HAL_PARITY_ODD;
1127                else
1128                        parity = PCH_UART_HAL_PARITY_EVEN;
1129
1130        } else {
1131                parity = PCH_UART_HAL_PARITY_NONE;
1132        }
1133        termios->c_cflag &= ~CMSPAR; /* Mark/Space parity is not supported */
1134
1135        baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk / 16);
1136
1137        spin_lock_irqsave(&port->lock, flags);
1138
1139        uart_update_timeout(port, termios->c_cflag, baud);
1140        rtn = pch_uart_hal_set_line(priv, baud, parity, bits, stb);
1141        if (rtn)
1142                goto out;
1143
1144        /* Don't rewrite B0 */
1145        if (tty_termios_baud_rate(termios))
1146                tty_termios_encode_baud_rate(termios, baud, baud);
1147
1148out:
1149        spin_unlock_irqrestore(&port->lock, flags);
1150}
1151
1152static const char *pch_uart_type(struct uart_port *port)
1153{
1154        return KBUILD_MODNAME;
1155}
1156
1157static void pch_uart_release_port(struct uart_port *port)
1158{
1159        struct eg20t_port *priv;
1160
1161        priv = container_of(port, struct eg20t_port, port);
1162        pci_iounmap(priv->pdev, priv->membase);
1163        pci_release_regions(priv->pdev);
1164}
1165
1166static int pch_uart_request_port(struct uart_port *port)
1167{
1168        struct eg20t_port *priv;
1169        int ret;
1170        void __iomem *membase;
1171
1172        priv = container_of(port, struct eg20t_port, port);
1173        ret = pci_request_regions(priv->pdev, KBUILD_MODNAME);
1174        if (ret < 0)
1175                return -EBUSY;
1176
1177        membase = pci_iomap(priv->pdev, 1, 0);
1178        if (!membase) {
1179                pci_release_regions(priv->pdev);
1180                return -EBUSY;
1181        }
1182        priv->membase = port->membase = membase;
1183
1184        return 0;
1185}
1186
1187static void pch_uart_config_port(struct uart_port *port, int type)
1188{
1189        struct eg20t_port *priv;
1190
1191        priv = container_of(port, struct eg20t_port, port);
1192        if (type & UART_CONFIG_TYPE) {
1193                port->type = priv->port_type;
1194                pch_uart_request_port(port);
1195        }
1196}
1197
1198static int pch_uart_verify_port(struct uart_port *port,
1199                                struct serial_struct *serinfo)
1200{
1201        struct eg20t_port *priv;
1202
1203        priv = container_of(port, struct eg20t_port, port);
1204        if (serinfo->flags & UPF_LOW_LATENCY) {
1205                pr_info("PCH UART : Use PIO Mode (without DMA)\n");
1206                priv->use_dma = 0;
1207                serinfo->flags &= ~UPF_LOW_LATENCY;
1208        } else {
1209#ifndef CONFIG_PCH_DMA
1210                pr_err("%s : PCH DMA is not Loaded.\n", __func__);
1211                return -EOPNOTSUPP;
1212#endif
1213                priv->use_dma = 1;
1214                priv->use_dma_flag = 1;
1215                pr_info("PCH UART : Use DMA Mode\n");
1216        }
1217
1218        return 0;
1219}
1220
1221static struct uart_ops pch_uart_ops = {
1222        .tx_empty = pch_uart_tx_empty,
1223        .set_mctrl = pch_uart_set_mctrl,
1224        .get_mctrl = pch_uart_get_mctrl,
1225        .stop_tx = pch_uart_stop_tx,
1226        .start_tx = pch_uart_start_tx,
1227        .stop_rx = pch_uart_stop_rx,
1228        .enable_ms = pch_uart_enable_ms,
1229        .break_ctl = pch_uart_break_ctl,
1230        .startup = pch_uart_startup,
1231        .shutdown = pch_uart_shutdown,
1232        .set_termios = pch_uart_set_termios,
1233/*      .pm             = pch_uart_pm,          Not supported yet */
1234/*      .set_wake       = pch_uart_set_wake,    Not supported yet */
1235        .type = pch_uart_type,
1236        .release_port = pch_uart_release_port,
1237        .request_port = pch_uart_request_port,
1238        .config_port = pch_uart_config_port,
1239        .verify_port = pch_uart_verify_port
1240};
1241
1242static struct uart_driver pch_uart_driver = {
1243        .owner = THIS_MODULE,
1244        .driver_name = KBUILD_MODNAME,
1245        .dev_name = PCH_UART_DRIVER_DEVICE,
1246        .major = 0,
1247        .minor = 0,
1248        .nr = PCH_UART_NR,
1249};
1250
1251static struct eg20t_port *pch_uart_init_port(struct pci_dev *pdev,
1252                                                int port_type)
1253{
1254        struct eg20t_port *priv;
1255        int ret;
1256        unsigned int iobase;
1257        unsigned int mapbase;
1258        unsigned char *rxbuf;
1259        int fifosize, base_baud;
1260        static int num;
1261
1262        priv = kzalloc(sizeof(struct eg20t_port), GFP_KERNEL);
1263        if (priv == NULL)
1264                goto init_port_alloc_err;
1265
1266        rxbuf = (unsigned char *)__get_free_page(GFP_KERNEL);
1267        if (!rxbuf)
1268                goto init_port_free_txbuf;
1269
1270        switch (port_type) {
1271        case PORT_UNKNOWN:
1272                fifosize = 256; /* UART0 */
1273                base_baud = 1843200; /* 1.8432MHz */
1274                break;
1275        case PORT_8250:
1276                fifosize = 64; /* UART1~3 */
1277                base_baud = 1843200; /* 1.8432MHz */
1278                break;
1279        default:
1280                dev_err(&pdev->dev, "Invalid Port Type(=%d)\n", port_type);
1281                goto init_port_hal_free;
1282        }
1283
1284        iobase = pci_resource_start(pdev, 0);
1285        mapbase = pci_resource_start(pdev, 1);
1286        priv->mapbase = mapbase;
1287        priv->iobase = iobase;
1288        priv->pdev = pdev;
1289        priv->tx_empty = 1;
1290        priv->rxbuf.buf = rxbuf;
1291        priv->rxbuf.size = PAGE_SIZE;
1292
1293        priv->fifo_size = fifosize;
1294        priv->base_baud = base_baud;
1295        priv->port_type = PORT_MAX_8250 + port_type + 1;
1296        priv->port.dev = &pdev->dev;
1297        priv->port.iobase = iobase;
1298        priv->port.membase = NULL;
1299        priv->port.mapbase = mapbase;
1300        priv->port.irq = pdev->irq;
1301        priv->port.iotype = UPIO_PORT;
1302        priv->port.ops = &pch_uart_ops;
1303        priv->port.flags = UPF_BOOT_AUTOCONF;
1304        priv->port.fifosize = fifosize;
1305        priv->port.line = num++;
1306        priv->trigger = PCH_UART_HAL_TRIGGER_M;
1307
1308        pci_set_drvdata(pdev, priv);
1309        pch_uart_hal_request(pdev, fifosize, base_baud);
1310        ret = uart_add_one_port(&pch_uart_driver, &priv->port);
1311        if (ret < 0)
1312                goto init_port_hal_free;
1313
1314        return priv;
1315
1316init_port_hal_free:
1317        free_page((unsigned long)rxbuf);
1318init_port_free_txbuf:
1319        kfree(priv);
1320init_port_alloc_err:
1321
1322        return NULL;
1323}
1324
1325static void pch_uart_exit_port(struct eg20t_port *priv)
1326{
1327        uart_remove_one_port(&pch_uart_driver, &priv->port);
1328        pci_set_drvdata(priv->pdev, NULL);
1329        free_page((unsigned long)priv->rxbuf.buf);
1330}
1331
1332static void pch_uart_pci_remove(struct pci_dev *pdev)
1333{
1334        struct eg20t_port *priv;
1335
1336        priv = (struct eg20t_port *)pci_get_drvdata(pdev);
1337        pch_uart_exit_port(priv);
1338        pci_disable_device(pdev);
1339        kfree(priv);
1340        return;
1341}
1342#ifdef CONFIG_PM
1343static int pch_uart_pci_suspend(struct pci_dev *pdev, pm_message_t state)
1344{
1345        struct eg20t_port *priv = pci_get_drvdata(pdev);
1346
1347        uart_suspend_port(&pch_uart_driver, &priv->port);
1348
1349        pci_save_state(pdev);
1350        pci_set_power_state(pdev, pci_choose_state(pdev, state));
1351        return 0;
1352}
1353
1354static int pch_uart_pci_resume(struct pci_dev *pdev)
1355{
1356        struct eg20t_port *priv = pci_get_drvdata(pdev);
1357        int ret;
1358
1359        pci_set_power_state(pdev, PCI_D0);
1360        pci_restore_state(pdev);
1361
1362        ret = pci_enable_device(pdev);
1363        if (ret) {
1364                dev_err(&pdev->dev,
1365                "%s-pci_enable_device failed(ret=%d) ", __func__, ret);
1366                return ret;
1367        }
1368
1369        uart_resume_port(&pch_uart_driver, &priv->port);
1370
1371        return 0;
1372}
1373#else
1374#define pch_uart_pci_suspend NULL
1375#define pch_uart_pci_resume NULL
1376#endif
1377
1378static DEFINE_PCI_DEVICE_TABLE(pch_uart_pci_id) = {
1379        {PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x8811),
1380         .driver_data = PCH_UART_8LINE},
1381        {PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x8812),
1382         .driver_data = PCH_UART_2LINE},
1383        {PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x8813),
1384         .driver_data = PCH_UART_2LINE},
1385        {PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x8814),
1386         .driver_data = PCH_UART_2LINE},
1387        {0,},
1388};
1389
1390static int __devinit pch_uart_pci_probe(struct pci_dev *pdev,
1391                                        const struct pci_device_id *id)
1392{
1393        int ret;
1394        struct eg20t_port *priv;
1395
1396        ret = pci_enable_device(pdev);
1397        if (ret < 0)
1398                goto probe_error;
1399
1400        priv = pch_uart_init_port(pdev, id->driver_data);
1401        if (!priv) {
1402                ret = -EBUSY;
1403                goto probe_disable_device;
1404        }
1405        pci_set_drvdata(pdev, priv);
1406
1407        return ret;
1408
1409probe_disable_device:
1410        pci_disable_device(pdev);
1411probe_error:
1412        return ret;
1413}
1414
1415static struct pci_driver pch_uart_pci_driver = {
1416        .name = "pch_uart",
1417        .id_table = pch_uart_pci_id,
1418        .probe = pch_uart_pci_probe,
1419        .remove = __devexit_p(pch_uart_pci_remove),
1420        .suspend = pch_uart_pci_suspend,
1421        .resume = pch_uart_pci_resume,
1422};
1423
1424static int __init pch_uart_module_init(void)
1425{
1426        int ret;
1427
1428        /* register as UART driver */
1429        ret = uart_register_driver(&pch_uart_driver);
1430        if (ret < 0)
1431                return ret;
1432
1433        /* register as PCI driver */
1434        ret = pci_register_driver(&pch_uart_pci_driver);
1435        if (ret < 0)
1436                uart_unregister_driver(&pch_uart_driver);
1437
1438        return ret;
1439}
1440module_init(pch_uart_module_init);
1441
1442static void __exit pch_uart_module_exit(void)
1443{
1444        pci_unregister_driver(&pch_uart_pci_driver);
1445        uart_unregister_driver(&pch_uart_driver);
1446}
1447module_exit(pch_uart_module_exit);
1448
1449MODULE_LICENSE("GPL v2");
1450MODULE_DESCRIPTION("Intel EG20T PCH UART PCI Driver");
1451module_param(default_baud, uint, S_IRUGO);
1452