]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
Merge remote-tracking branch 'tty/tty-next'
authorStephen Rothwell <sfr@canb.auug.org.au>
Thu, 13 Sep 2012 05:52:16 +0000 (15:52 +1000)
committerStephen Rothwell <sfr@canb.auug.org.au>
Thu, 13 Sep 2012 05:52:16 +0000 (15:52 +1000)
12 files changed:
1  2 
arch/arm/mach-ux500/board-mop500.c
arch/xtensa/platforms/iss/console.c
drivers/tty/hvc/hvc_console.c
drivers/tty/hvc/hvsi.c
drivers/tty/serial/8250/8250_pci.c
drivers/tty/serial/imx.c
drivers/tty/serial/omap-serial.c
drivers/tty/tty_ldisc.c
drivers/usb/gadget/u_serial.c
drivers/usb/serial/ftdi_sio.c
firmware/Makefile
include/linux/Kbuild

index a534d8880de12e2a92b0c7a35ec1ebdc3034c44e,f216c302beb6c7ada9abd552767a3599310ecda7..1d2e3c6f8b5911a0cc2d6c59602559bca823c75f
@@@ -524,33 -524,12 +524,12 @@@ static struct stedma40_chan_cfg uart2_d
  };
  #endif
  
- #define PRCC_K_SOFTRST_SET      0x18
- #define PRCC_K_SOFTRST_CLEAR    0x1C
- static void ux500_uart0_reset(void)
- {
-       void __iomem *prcc_rst_set, *prcc_rst_clr;
-       prcc_rst_set = (void __iomem *)IO_ADDRESS(U8500_CLKRST1_BASE +
-                       PRCC_K_SOFTRST_SET);
-       prcc_rst_clr = (void __iomem *)IO_ADDRESS(U8500_CLKRST1_BASE +
-                       PRCC_K_SOFTRST_CLEAR);
-       /* Activate soft reset PRCC_K_SOFTRST_CLEAR */
-       writel((readl(prcc_rst_clr) | 0x1), prcc_rst_clr);
-       udelay(1);
-       /* Release soft reset PRCC_K_SOFTRST_SET */
-       writel((readl(prcc_rst_set) | 0x1), prcc_rst_set);
-       udelay(1);
- }
  static struct amba_pl011_data uart0_plat = {
  #ifdef CONFIG_STE_DMA40
        .dma_filter = stedma40_filter,
        .dma_rx_param = &uart0_dma_cfg_rx,
        .dma_tx_param = &uart0_dma_cfg_tx,
  #endif
-       .reset = ux500_uart0_reset,
  };
  
  static struct amba_pl011_data uart1_plat = {
@@@ -797,7 -776,6 +776,7 @@@ static void __init u8500_init_machine(v
                                ARRAY_SIZE(mop500_platform_devs));
  
                mop500_sdi_init(parent);
 +              mop500_msp_init(parent);
                i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
                i2c_register_board_info(0, mop500_i2c0_devices, i2c0_devs);
                i2c_register_board_info(2, mop500_i2c2_devices,
  
                mop500_uib_init();
  
 +      } else if (of_machine_is_compatible("calaosystems,snowball-a9500")) {
 +              mop500_msp_init(parent);
        } else if (of_machine_is_compatible("st-ericsson,hrefv60+")) {
                /*
                 * The HREFv60 board removed a GPIO expander and routed
                                ARRAY_SIZE(mop500_platform_devs));
  
                hrefv60_sdi_init(parent);
 +              mop500_msp_init(parent);
  
                i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
                i2c0_devs -= NUM_PRE_V60_I2C0_DEVICES;
index 7dc0788adab28f7473e16875b6f3beef0aa19393,2cd3d3a3400b483290075843d8e538da17c51986..367c2c8ebc7b91ce779999422435388de67cc359
@@@ -33,7 -33,7 +33,7 @@@
  #endif
  
  #define SERIAL_MAX_NUM_LINES 1
 -#define SERIAL_TIMER_VALUE (20 * HZ)
 +#define SERIAL_TIMER_VALUE (HZ / 10)
  
  static struct tty_driver *serial_driver;
  static struct tty_port serial_port;
@@@ -43,22 -43,14 +43,22 @@@ static DEFINE_SPINLOCK(timer_lock)
  
  int errno;
  
 -static int __simc (int a, int b, int c, int d, int e, int f) __attribute__((__noinline__));
  static int __simc (int a, int b, int c, int d, int e, int f)
  {
        int ret;
 -      __asm__ __volatile__ ("simcall\n"
 +      register int a1 asm("a2") = a;
 +      register int b1 asm("a3") = b;
 +      register int c1 asm("a4") = c;
 +      register int d1 asm("a5") = d;
 +      register int e1 asm("a6") = e;
 +      register int f1 asm("a7") = f;
 +      __asm__ __volatile__ (
 +                      "simcall\n"
                        "mov %0, a2\n"
 -                      "mov %1, a3\n" : "=a" (ret), "=a" (errno)
 -                      : : "a2", "a3");
 +                      "mov %1, a3\n"
 +                      : "=a" (ret), "=a" (errno), "+r"(a1), "+r"(b1)
 +                      : "r"(c1), "r"(d1), "r"(e1), "r"(f1)
 +                      : );
        return ret;
  }
  
@@@ -231,6 -223,7 +231,7 @@@ int __init rs_init(void
        serial_driver->flags = TTY_DRIVER_REAL_RAW;
  
        tty_set_operations(serial_driver, &serial_ops);
+       tty_port_link_device(&serial_port, serial_driver, 0);
  
        if (tty_register_driver(serial_driver))
                panic("Couldn't register serial driver\n");
index f1d4d96a4a0784b95160de07c665635d159ba237,7f80f15681cd3fa6fe743c01def27bb63ec59bff..b57dcbd0f506cf53fbca188dda0a478ccd89b5dc
@@@ -245,20 -245,6 +245,20 @@@ static void hvc_port_destruct(struct tt
        kfree(hp);
  }
  
 +static void hvc_check_console(int index)
 +{
 +      /* Already enabled, bail out */
 +      if (hvc_console.flags & CON_ENABLED)
 +              return;
 +
 +      /* If this index is what the user requested, then register
 +       * now (setup won't fail at this point).  It's ok to just
 +       * call register again if previously .setup failed.
 +       */
 +      if (index == hvc_console.index)
 +              register_console(&hvc_console);
 +}
 +
  /*
   * hvc_instantiate() is an early console discovery method which locates
   * consoles * prior to the vio subsystem discovering them.  Hotplugged
@@@ -289,8 -275,12 +289,8 @@@ int hvc_instantiate(uint32_t vtermno, i
        if (last_hvc < index)
                last_hvc = index;
  
 -      /* if this index is what the user requested, then register
 -       * now (setup won't fail at this point).  It's ok to just
 -       * call register again if previously .setup failed.
 -       */
 -      if (index == hvc_console.index)
 -              register_console(&hvc_console);
 +      /* check if we need to re-register the kernel console */
 +      hvc_check_console(index);
  
        return 0;
  }
@@@ -309,20 -299,33 +309,33 @@@ static void hvc_unthrottle(struct tty_s
        hvc_kick();
  }
  
+ static int hvc_install(struct tty_driver *driver, struct tty_struct *tty)
+ {
+       struct hvc_struct *hp;
+       int rc;
+       /* Auto increments kref reference if found. */
+       if (!(hp = hvc_get_by_index(tty->index)))
+               return -ENODEV;
+       tty->driver_data = hp;
+       rc = tty_port_install(&hp->port, driver, tty);
+       if (rc)
+               tty_port_put(&hp->port);
+       return rc;
+ }
  /*
   * The TTY interface won't be used until after the vio layer has exposed the vty
   * adapter to the kernel.
   */
  static int hvc_open(struct tty_struct *tty, struct file * filp)
  {
-       struct hvc_struct *hp;
+       struct hvc_struct *hp = tty->driver_data;
        unsigned long flags;
        int rc = 0;
  
-       /* Auto increments kref reference if found. */
-       if (!(hp = hvc_get_by_index(tty->index)))
-               return -ENODEV;
        spin_lock_irqsave(&hp->port.lock, flags);
        /* Check and then increment for fast path open. */
        if (hp->port.count++ > 0) {
        } /* else count == 0 */
        spin_unlock_irqrestore(&hp->port.lock, flags);
  
-       tty->driver_data = hp;
        tty_port_tty_set(&hp->port, tty);
  
        if (hp->ops->notifier_add)
@@@ -399,6 -401,11 +411,11 @@@ static void hvc_close(struct tty_struc
                                hp->vtermno, hp->port.count);
                spin_unlock_irqrestore(&hp->port.lock, flags);
        }
+ }
+ static void hvc_cleanup(struct tty_struct *tty)
+ {
+       struct hvc_struct *hp = tty->driver_data;
  
        tty_port_put(&hp->port);
  }
@@@ -802,8 -809,10 +819,10 @@@ static void hvc_poll_put_char(struct tt
  #endif
  
  static const struct tty_operations hvc_ops = {
+       .install = hvc_install,
        .open = hvc_open,
        .close = hvc_close,
+       .cleanup = hvc_cleanup,
        .write = hvc_write,
        .hangup = hvc_hangup,
        .unthrottle = hvc_unthrottle,
@@@ -868,15 -877,10 +887,15 @@@ struct hvc_struct *hvc_alloc(uint32_t v
                i = ++last_hvc;
  
        hp->index = i;
 +      cons_ops[i] = ops;
 +      vtermnos[i] = vtermno;
  
        list_add_tail(&(hp->next), &hvc_structs);
        spin_unlock(&hvc_structs_lock);
  
 +      /* check if we need to re-register the kernel console */
 +      hvc_check_console(i);
 +
        return hp;
  }
  EXPORT_SYMBOL_GPL(hvc_alloc);
@@@ -889,12 -893,8 +908,12 @@@ int hvc_remove(struct hvc_struct *hp
        tty = tty_port_tty_get(&hp->port);
  
        spin_lock_irqsave(&hp->lock, flags);
 -      if (hp->index < MAX_NR_HVC_CONSOLES)
 +      if (hp->index < MAX_NR_HVC_CONSOLES) {
 +              console_lock();
                vtermnos[hp->index] = -1;
 +              cons_ops[hp->index] = NULL;
 +              console_unlock();
 +      }
  
        /* Don't whack hp->irq because tty_hangup() will need to free the irq. */
  
diff --combined drivers/tty/hvc/hvsi.c
index 1f8e8b37ed23524af49553da474121444e4329f7,0083bc1f63f43a37c8cc5f531da88f6a24729952..5b95b4f28cf347e56cbdc3b73a249b0feae56630
@@@ -765,7 -765,7 +765,7 @@@ static void hvsi_flush_output(struct hv
  
        /* 'writer' could still be pending if it didn't see n_outbuf = 0 yet */
        cancel_delayed_work_sync(&hp->writer);
 -      flush_work_sync(&hp->handshaker);
 +      flush_work(&hp->handshaker);
  
        /*
         * it's also possible that our timeout expired and hvsi_write_worker
@@@ -1080,6 -1080,8 +1080,8 @@@ static int __init hvsi_init(void
                struct hvsi_struct *hp = &hvsi_ports[i];
                int ret = 1;
  
+               tty_port_link_device(&hp->port, hvsi_driver, i);
                ret = request_irq(hp->virq, hvsi_interrupt, 0, "hvsi", hp);
                if (ret)
                        printk(KERN_ERR "HVSI: couldn't reserve irq 0x%x (error %i)\n",
index 452278efef2946e55dc2eb3aaf964a201922e33d,fdab80a4e063f3c9e356b145b9d861dc700e0d2b..0c4efb3d8fecbe8beb24baf67b808893698167e9
@@@ -44,7 -44,7 +44,7 @@@ struct pci_serial_quirk 
        int     (*init)(struct pci_dev *dev);
        int     (*setup)(struct serial_private *,
                         const struct pciserial_board *,
-                        struct uart_port *, int);
+                        struct uart_8250_port *, int);
        void    (*exit)(struct pci_dev *dev);
  };
  
@@@ -59,7 -59,7 +59,7 @@@ struct serial_private 
  };
  
  static int pci_default_setup(struct serial_private*,
-         const struct pciserial_board*, struct uart_port*, int);
+         const struct pciserial_board*, struct uart_8250_port *, int);
  
  static void moan_device(const char *str, struct pci_dev *dev)
  {
@@@ -74,7 -74,7 +74,7 @@@
  }
  
  static int
- setup_port(struct serial_private *priv, struct uart_port *port,
+ setup_port(struct serial_private *priv, struct uart_8250_port *port,
           int bar, int offset, int regshift)
  {
        struct pci_dev *dev = priv->dev;
                if (!priv->remapped_bar[bar])
                        return -ENOMEM;
  
-               port->iotype = UPIO_MEM;
-               port->iobase = 0;
-               port->mapbase = base + offset;
-               port->membase = priv->remapped_bar[bar] + offset;
-               port->regshift = regshift;
+               port->port.iotype = UPIO_MEM;
+               port->port.iobase = 0;
+               port->port.mapbase = base + offset;
+               port->port.membase = priv->remapped_bar[bar] + offset;
+               port->port.regshift = regshift;
        } else {
-               port->iotype = UPIO_PORT;
-               port->iobase = base + offset;
-               port->mapbase = 0;
-               port->membase = NULL;
-               port->regshift = 0;
+               port->port.iotype = UPIO_PORT;
+               port->port.iobase = base + offset;
+               port->port.mapbase = 0;
+               port->port.membase = NULL;
+               port->port.regshift = 0;
        }
        return 0;
  }
   */
  static int addidata_apci7800_setup(struct serial_private *priv,
                                const struct pciserial_board *board,
-                               struct uart_port *port, int idx)
+                               struct uart_8250_port *port, int idx)
  {
        unsigned int bar = 0, offset = board->first_offset;
        bar = FL_GET_BASE(board->flags);
   */
  static int
  afavlab_setup(struct serial_private *priv, const struct pciserial_board *board,
-             struct uart_port *port, int idx)
+             struct uart_8250_port *port, int idx)
  {
        unsigned int bar, offset = board->first_offset;
  
@@@ -195,7 -195,7 +195,7 @@@ static int pci_hp_diva_init(struct pci_
  static int
  pci_hp_diva_setup(struct serial_private *priv,
                const struct pciserial_board *board,
-               struct uart_port *port, int idx)
+               struct uart_8250_port *port, int idx)
  {
        unsigned int offset = board->first_offset;
        unsigned int bar = FL_GET_BASE(board->flags);
@@@ -370,7 -370,7 +370,7 @@@ static void __devexit pci_ni8430_exit(s
  /* SBS Technologies Inc. PMC-OCTPRO and P-OCTAL cards */
  static int
  sbs_setup(struct serial_private *priv, const struct pciserial_board *board,
-               struct uart_port *port, int idx)
+               struct uart_8250_port *port, int idx)
  {
        unsigned int bar, offset = board->first_offset;
  
@@@ -525,7 -525,7 +525,7 @@@ static int pci_siig_init(struct pci_de
  
  static int pci_siig_setup(struct serial_private *priv,
                          const struct pciserial_board *board,
-                         struct uart_port *port, int idx)
+                         struct uart_8250_port *port, int idx)
  {
        unsigned int bar = FL_GET_BASE(board->flags) + idx, offset = 0;
  
@@@ -619,7 -619,7 +619,7 @@@ static int pci_timedia_init(struct pci_
  static int
  pci_timedia_setup(struct serial_private *priv,
                  const struct pciserial_board *board,
-                 struct uart_port *port, int idx)
+                 struct uart_8250_port *port, int idx)
  {
        unsigned int bar = 0, offset = board->first_offset;
  
  static int
  titan_400l_800l_setup(struct serial_private *priv,
                      const struct pciserial_board *board,
-                     struct uart_port *port, int idx)
+                     struct uart_8250_port *port, int idx)
  {
        unsigned int bar, offset = board->first_offset;
  
@@@ -754,7 -754,7 +754,7 @@@ static int pci_ni8430_init(struct pci_d
  static int
  pci_ni8430_setup(struct serial_private *priv,
                 const struct pciserial_board *board,
-                struct uart_port *port, int idx)
+                struct uart_8250_port *port, int idx)
  {
        void __iomem *p;
        unsigned long base, len;
  
  static int pci_netmos_9900_setup(struct serial_private *priv,
                                const struct pciserial_board *board,
-                               struct uart_port *port, int idx)
+                               struct uart_8250_port *port, int idx)
  {
        unsigned int bar;
  
@@@ -1032,10 -1032,17 +1032,17 @@@ static int pci_oxsemi_tornado_init(stru
        return number_uarts;
  }
  
- static int
- pci_default_setup(struct serial_private *priv,
+ static int pci_asix_setup(struct serial_private *priv,
                  const struct pciserial_board *board,
-                 struct uart_port *port, int idx)
+                 struct uart_8250_port *port, int idx)
+ {
+       port->bugs |= UART_BUG_PARITY;
+       return pci_default_setup(priv, board, port, idx);
+ }
+ static int pci_default_setup(struct serial_private *priv,
+                 const struct pciserial_board *board,
+                 struct uart_8250_port *port, int idx)
  {
        unsigned int bar, offset = board->first_offset, maxnr;
  
  static int
  ce4100_serial_setup(struct serial_private *priv,
                  const struct pciserial_board *board,
-                 struct uart_port *port, int idx)
+                 struct uart_8250_port *port, int idx)
  {
        int ret;
  
        ret = setup_port(priv, port, 0, 0, board->reg_shift);
-       port->iotype = UPIO_MEM32;
-       port->type = PORT_XSCALE;
-       port->flags = (port->flags | UPF_FIXED_PORT | UPF_FIXED_TYPE);
-       port->regshift = 2;
+       port->port.iotype = UPIO_MEM32;
+       port->port.type = PORT_XSCALE;
+       port->port.flags = (port->port.flags | UPF_FIXED_PORT | UPF_FIXED_TYPE);
+       port->port.regshift = 2;
  
        return ret;
  }
  static int
  pci_omegapci_setup(struct serial_private *priv,
                      const struct pciserial_board *board,
-                     struct uart_port *port, int idx)
+                     struct uart_8250_port *port, int idx)
  {
        return setup_port(priv, port, 2, idx * 8, 0);
  }
  
  static int skip_tx_en_setup(struct serial_private *priv,
                        const struct pciserial_board *board,
-                       struct uart_port *port, int idx)
+                       struct uart_8250_port *port, int idx)
  {
-       port->flags |= UPF_NO_TXEN_TEST;
+       port->port.flags |= UPF_NO_TXEN_TEST;
        printk(KERN_DEBUG "serial8250: skipping TxEn test for device "
                          "[%04x:%04x] subsystem [%04x:%04x]\n",
                          priv->dev->vendor,
@@@ -1131,11 -1138,11 +1138,11 @@@ static unsigned int kt_serial_in(struc
  
  static int kt_serial_setup(struct serial_private *priv,
                           const struct pciserial_board *board,
-                          struct uart_port *port, int idx)
+                          struct uart_8250_port *port, int idx)
  {
-       port->flags |= UPF_BUG_THRE;
-       port->serial_in = kt_serial_in;
-       port->handle_break = kt_handle_break;
+       port->port.flags |= UPF_BUG_THRE;
+       port->port.serial_in = kt_serial_in;
+       port->port.handle_break = kt_handle_break;
        return skip_tx_en_setup(priv, board, port, idx);
  }
  
@@@ -1151,9 -1158,19 +1158,19 @@@ static int pci_eg20t_init(struct pci_de
  static int
  pci_xr17c154_setup(struct serial_private *priv,
                  const struct pciserial_board *board,
-                 struct uart_port *port, int idx)
+                 struct uart_8250_port *port, int idx)
+ {
+       port->port.flags |= UPF_EXAR_EFR;
+       return pci_default_setup(priv, board, port, idx);
+ }
+ static int
+ pci_wch_ch353_setup(struct serial_private *priv,
+                     const struct pciserial_board *board,
+                     struct uart_8250_port *port, int idx)
  {
-       port->flags |= UPF_EXAR_EFR;
+       port->port.flags |= UPF_FIXED_TYPE;
+       port->port.type = PORT_16550A;
        return pci_default_setup(priv, board, port, idx);
  }
  
  #define PCIE_DEVICE_ID_NEO_2_OX_IBM   0x00F6
  #define PCI_DEVICE_ID_PLX_CRONYX_OMEGA        0xc001
  #define PCI_DEVICE_ID_INTEL_PATSBURG_KT 0x1d3d
+ #define PCI_VENDOR_ID_WCH             0x4348
+ #define PCI_DEVICE_ID_WCH_CH353_4S    0x3453
+ #define PCI_DEVICE_ID_WCH_CH353_2S1PF 0x5046
+ #define PCI_DEVICE_ID_WCH_CH353_2S1P  0x7053
+ #define PCI_VENDOR_ID_AGESTAR         0x5372
+ #define PCI_DEVICE_ID_AGESTAR_9375    0x6872
+ #define PCI_VENDOR_ID_ASIX            0x9710
  
  /* Unknown vendors/cards - this should not be in linux/pci_ids.h */
  #define PCI_SUBDEVICE_ID_UNKNOWN_0x1584       0x1584
@@@ -1726,7 -1750,41 +1750,41 @@@ static struct pci_serial_quirk pci_seri
                .subvendor      = PCI_ANY_ID,
                .subdevice      = PCI_ANY_ID,
                .setup          = pci_omegapci_setup,
-        },
+       },
+       /* WCH CH353 2S1P card (16550 clone) */
+       {
+               .vendor         = PCI_VENDOR_ID_WCH,
+               .device         = PCI_DEVICE_ID_WCH_CH353_2S1P,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = PCI_ANY_ID,
+               .setup          = pci_wch_ch353_setup,
+       },
+       /* WCH CH353 4S card (16550 clone) */
+       {
+               .vendor         = PCI_VENDOR_ID_WCH,
+               .device         = PCI_DEVICE_ID_WCH_CH353_4S,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = PCI_ANY_ID,
+               .setup          = pci_wch_ch353_setup,
+       },
+       /* WCH CH353 2S1PF card (16550 clone) */
+       {
+               .vendor         = PCI_VENDOR_ID_WCH,
+               .device         = PCI_DEVICE_ID_WCH_CH353_2S1PF,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = PCI_ANY_ID,
+               .setup          = pci_wch_ch353_setup,
+       },
+       /*
+        * ASIX devices with FIFO bug
+        */
+       {
+               .vendor         = PCI_VENDOR_ID_ASIX,
+               .device         = PCI_ANY_ID,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = PCI_ANY_ID,
+               .setup          = pci_asix_setup,
+       },
        /*
         * Default "match everything" terminator entry
         */
@@@ -1887,7 -1945,6 +1945,6 @@@ enum pci_board_num_t 
        pbn_panacom,
        pbn_panacom2,
        pbn_panacom4,
-       pbn_exsys_4055,
        pbn_plx_romulus,
        pbn_oxsemi,
        pbn_oxsemi_1_4000000,
@@@ -2393,13 -2450,6 +2450,6 @@@ static struct pciserial_board pci_board
                .reg_shift      = 7,
        },
  
-       [pbn_exsys_4055] = {
-               .flags          = FL_BASE2,
-               .num_ports      = 4,
-               .base_baud      = 115200,
-               .uart_offset    = 8,
-       },
        /* I think this entry is broken - the first_offset looks wrong --rmk */
        [pbn_plx_romulus] = {
                .flags          = FL_BASE2,
        },
  };
  
- static const struct pci_device_id softmodem_blacklist[] = {
+ static const struct pci_device_id blacklist[] = {
+       /* softmodems */
        { PCI_VDEVICE(AL, 0x5457), }, /* ALi Corporation M5457 AC'97 Modem */
        { PCI_VDEVICE(MOTOROLA, 0x3052), }, /* Motorola Si3052-based modem */
        { PCI_DEVICE(0x1543, 0x3052), }, /* Si3052-based modem, default IDs */
+       /* multi-io cards handled by parport_serial */
+       { PCI_DEVICE(0x4348, 0x7053), }, /* WCH CH353 2S1P */
  };
  
  /*
  static int __devinit
  serial_pci_guess_board(struct pci_dev *dev, struct pciserial_board *board)
  {
-       const struct pci_device_id *blacklist;
+       const struct pci_device_id *bldev;
        int num_iomem, num_port, first_port = -1, i;
  
        /*
  
        /*
         * Do not access blacklisted devices that are known not to
-        * feature serial ports.
+        * feature serial ports or are handled by other modules.
         */
-       for (blacklist = softmodem_blacklist;
-            blacklist < softmodem_blacklist + ARRAY_SIZE(softmodem_blacklist);
-            blacklist++) {
-               if (dev->vendor == blacklist->vendor &&
-                   dev->device == blacklist->device)
+       for (bldev = blacklist;
+            bldev < blacklist + ARRAY_SIZE(blacklist);
+            bldev++) {
+               if (dev->vendor == bldev->vendor &&
+                   dev->device == bldev->device)
                        return -ENODEV;
        }
  
@@@ -2728,7 -2782,7 +2782,7 @@@ serial_pci_matches(const struct pciseri
  struct serial_private *
  pciserial_init_ports(struct pci_dev *dev, const struct pciserial_board *board)
  {
-       struct uart_port serial_port;
+       struct uart_8250_port uart;
        struct serial_private *priv;
        struct pci_serial_quirk *quirk;
        int rc, nr_ports, i;
        priv->dev = dev;
        priv->quirk = quirk;
  
-       memset(&serial_port, 0, sizeof(struct uart_port));
-       serial_port.flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ;
-       serial_port.uartclk = board->base_baud * 16;
-       serial_port.irq = get_pci_irq(dev, board);
-       serial_port.dev = &dev->dev;
+       memset(&uart, 0, sizeof(uart));
+       uart.port.flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ;
+       uart.port.uartclk = board->base_baud * 16;
+       uart.port.irq = get_pci_irq(dev, board);
+       uart.port.dev = &dev->dev;
  
        for (i = 0; i < nr_ports; i++) {
-               if (quirk->setup(priv, board, &serial_port, i))
+               if (quirk->setup(priv, board, &uart, i))
                        break;
  
  #ifdef SERIAL_DEBUG_PCI
                printk(KERN_DEBUG "Setup PCI port: port %lx, irq %d, type %d\n",
-                      serial_port.iobase, serial_port.irq, serial_port.iotype);
+                      uart.port.iobase, uart.port.irq, uart.port.iotype);
  #endif
  
-               priv->line[i] = serial8250_register_port(&serial_port);
+               priv->line[i] = serial8250_register_8250_port(&uart);
                if (priv->line[i] < 0) {
                        printk(KERN_WARNING "Couldn't register serial port %s: %d\n", pci_name(dev), priv->line[i]);
                        break;
@@@ -3193,7 -3247,7 +3247,7 @@@ static struct pci_device_id serial_pci_
        {       PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050,
                PCI_SUBVENDOR_ID_EXSYS,
                PCI_SUBDEVICE_ID_EXSYS_4055, 0, 0,
-               pbn_exsys_4055 },
+               pbn_b2_4_115200 },
        /*
         * Megawolf Romulus PCI Serial Card, from Mike Hudson
         * (Exoray@isys.ca)
                PCI_ANY_ID, PCI_ANY_ID, 0, 0,
                pbn_omegapci },
  
+       /*
+        * AgeStar as-prs2-009
+        */
+       {       PCI_VENDOR_ID_AGESTAR, PCI_DEVICE_ID_AGESTAR_9375,
+               PCI_ANY_ID, PCI_ANY_ID,
+               0, 0, pbn_b0_bt_2_115200 },
+       /*
+        * WCH CH353 series devices: The 2S1P is handled by parport_serial
+        * so not listed here.
+        */
+       {       PCI_VENDOR_ID_WCH, PCI_DEVICE_ID_WCH_CH353_4S,
+               PCI_ANY_ID, PCI_ANY_ID,
+               0, 0, pbn_b0_bt_4_115200 },
+       {       PCI_VENDOR_ID_WCH, PCI_DEVICE_ID_WCH_CH353_2S1PF,
+               PCI_ANY_ID, PCI_ANY_ID,
+               0, 0, pbn_b0_bt_2_115200 },
        /*
         * These entries match devices with class COMMUNICATION_SERIAL,
         * COMMUNICATION_MODEM or COMMUNICATION_MULTISERIAL
@@@ -4236,7 -4309,7 +4309,7 @@@ static void serial8250_io_resume(struc
                pciserial_resume_ports(priv);
  }
  
 -static struct pci_error_handlers serial8250_err_handler = {
 +static const struct pci_error_handlers serial8250_err_handler = {
        .error_detected = serial8250_io_error_detected,
        .slot_reset = serial8250_io_slot_reset,
        .resume = serial8250_io_resume,
diff --combined drivers/tty/serial/imx.c
index e309e8b0aaba0c10f0e45d72c57480000ed43d6b,72ec56e6d42f571d8b5e117033cfa87c9d66d397..5952b25c288e01355ab6f4d622796e8a9cbdb98b
  #define  UCR4_OREN     (1<<1)  /* Receiver overrun interrupt enable */
  #define  UCR4_DREN     (1<<0)  /* Recv data ready interrupt enable */
  #define  UFCR_RXTL_SHF   0       /* Receiver trigger level shift */
 +#define  UFCR_DCEDTE   (1<<6)  /* DCE/DTE mode select */
  #define  UFCR_RFDIV      (7<<7)  /* Reference freq divider mask */
  #define  UFCR_RFDIV_REG(x)    (((x) < 7 ? 6 - (x) : 6) << 7)
  #define  UFCR_TXTL_SHF   10      /* Transmitter trigger level shift */
@@@ -207,7 -206,7 +207,7 @@@ struct imx_port 
        unsigned short          trcv_delay; /* transceiver delay */
        struct clk              *clk_ipg;
        struct clk              *clk_per;
-       struct imx_uart_data    *devdata;
+       const struct imx_uart_data *devdata;
  };
  
  struct imx_port_ucrs {
@@@ -668,11 -667,22 +668,11 @@@ static void imx_break_ctl(struct uart_p
  static int imx_setup_ufcr(struct imx_port *sport, unsigned int mode)
  {
        unsigned int val;
 -      unsigned int ufcr_rfdiv;
 -
 -      /* set receiver / transmitter trigger level.
 -       * RFDIV is set such way to satisfy requested uartclk value
 -       */
 -      val = TXTL << 10 | RXTL;
 -      ufcr_rfdiv = (clk_get_rate(sport->clk_per) + sport->port.uartclk / 2)
 -                      / sport->port.uartclk;
 -
 -      if(!ufcr_rfdiv)
 -              ufcr_rfdiv = 1;
 -
 -      val |= UFCR_RFDIV_REG(ufcr_rfdiv);
  
 +      /* set receiver / transmitter trigger level */
 +      val = readl(sport->port.membase + UFCR) & (UFCR_RFDIV | UFCR_DCEDTE);
 +      val |= TXTL << UFCR_TXTL_SHF | RXTL;
        writel(val, sport->port.membase + UFCR);
 -
        return 0;
  }
  
@@@ -744,7 -754,6 +744,7 @@@ static int imx_startup(struct uart_por
                }
        }
  
 +      spin_lock_irqsave(&sport->port.lock, flags);
        /*
         * Finally, clear and enable interrupts
         */
        /*
         * Enable modem status interrupts
         */
 -      spin_lock_irqsave(&sport->port.lock,flags);
        imx_enable_ms(&sport->port);
        spin_unlock_irqrestore(&sport->port.lock,flags);
  
@@@ -827,13 -837,10 +827,13 @@@ static void imx_shutdown(struct uart_po
  {
        struct imx_port *sport = (struct imx_port *)port;
        unsigned long temp;
 +      unsigned long flags;
  
 +      spin_lock_irqsave(&sport->port.lock, flags);
        temp = readl(sport->port.membase + UCR2);
        temp &= ~(UCR2_TXEN);
        writel(temp, sport->port.membase + UCR2);
 +      spin_unlock_irqrestore(&sport->port.lock, flags);
  
        if (USE_IRDA(sport)) {
                struct imxuart_platform_data *pdata;
         * Disable all interrupts, port and break condition.
         */
  
 +      spin_lock_irqsave(&sport->port.lock, flags);
        temp = readl(sport->port.membase + UCR1);
        temp &= ~(UCR1_TXMPTYEN | UCR1_RRDYEN | UCR1_RTSDEN | UCR1_UARTEN);
        if (USE_IRDA(sport))
                temp &= ~(UCR1_IREN);
  
        writel(temp, sport->port.membase + UCR1);
 +      spin_unlock_irqrestore(&sport->port.lock, flags);
  }
  
  static void
@@@ -1212,9 -1217,6 +1212,9 @@@ imx_console_write(struct console *co, c
        struct imx_port *sport = imx_ports[co->index];
        struct imx_port_ucrs old_ucr;
        unsigned int ucr1;
 +      unsigned long flags;
 +
 +      spin_lock_irqsave(&sport->port.lock, flags);
  
        /*
         *      First, save UCR1/2/3 and then disable interrupts
        while (!(readl(sport->port.membase + USR2) & USR2_TXDC));
  
        imx_port_ucrs_restore(&sport->port, &old_ucr);
 +
 +      spin_unlock_irqrestore(&sport->port.lock, flags);
  }
  
  /*
@@@ -1505,18 -1505,21 +1505,21 @@@ static int serial_imx_probe(struct plat
        pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
        if (IS_ERR(pinctrl)) {
                ret = PTR_ERR(pinctrl);
+               dev_err(&pdev->dev, "failed to get default pinctrl: %d\n", ret);
                goto unmap;
        }
  
        sport->clk_ipg = devm_clk_get(&pdev->dev, "ipg");
        if (IS_ERR(sport->clk_ipg)) {
                ret = PTR_ERR(sport->clk_ipg);
+               dev_err(&pdev->dev, "failed to get ipg clk: %d\n", ret);
                goto unmap;
        }
  
        sport->clk_per = devm_clk_get(&pdev->dev, "per");
        if (IS_ERR(sport->clk_per)) {
                ret = PTR_ERR(sport->clk_per);
+               dev_err(&pdev->dev, "failed to get per clk: %d\n", ret);
                goto unmap;
        }
  
index 0952d71bdf28e03b692667632ab9ddd9b5892c09,f175385bb30469fad148769bad0c07edea4790d9..a0d4460637041ac9543bb4d66dc63d2dbf33b15b
  #include <linux/slab.h>
  #include <linux/tty.h>
  #include <linux/tty_flip.h>
+ #include <linux/platform_device.h>
  #include <linux/io.h>
- #include <linux/dma-mapping.h>
  #include <linux/clk.h>
  #include <linux/serial_core.h>
  #include <linux/irq.h>
  #include <linux/pm_runtime.h>
  #include <linux/of.h>
+ #include <linux/gpio.h>
+ #include <linux/pinctrl/consumer.h>
  
- #include <plat/dma.h>
- #include <plat/dmtimer.h>
  #include <plat/omap-serial.h>
  
  #define UART_BUILD_REVISION(x, y)     (((x) << 8) | (y))
@@@ -57,8 -57,8 +57,8 @@@
  #define OMAP_UART_SCR_RX_TRIG_GRANU1_MASK             (1 << 7)
  
  /* FCR register bitmasks */
- #define OMAP_UART_FCR_RX_FIFO_TRIG_SHIFT              6
  #define OMAP_UART_FCR_RX_FIFO_TRIG_MASK                       (0x3 << 6)
+ #define OMAP_UART_FCR_TX_FIFO_TRIG_MASK                       (0x3 << 4)
  
  /* MVR register bitmasks */
  #define OMAP_UART_MVR_SCHEME_SHIFT    30
  #define OMAP_UART_MVR_MAJ_SHIFT               8
  #define OMAP_UART_MVR_MIN_MASK                0x3f
  
+ struct uart_omap_port {
+       struct uart_port        port;
+       struct uart_omap_dma    uart_dma;
+       struct device           *dev;
+       unsigned char           ier;
+       unsigned char           lcr;
+       unsigned char           mcr;
+       unsigned char           fcr;
+       unsigned char           efr;
+       unsigned char           dll;
+       unsigned char           dlh;
+       unsigned char           mdr1;
+       unsigned char           scr;
+       int                     use_dma;
+       /*
+        * Some bits in registers are cleared on a read, so they must
+        * be saved whenever the register is read but the bits will not
+        * be immediately processed.
+        */
+       unsigned int            lsr_break_flag;
+       unsigned char           msr_saved_flags;
+       char                    name[20];
+       unsigned long           port_activity;
+       u32                     context_loss_cnt;
+       u32                     errata;
+       u8                      wakeups_enabled;
+       unsigned int            irq_pending:1;
+       int                     DTR_gpio;
+       int                     DTR_inverted;
+       int                     DTR_active;
+       struct pm_qos_request   pm_qos_request;
+       u32                     latency;
+       u32                     calc_latency;
+       struct work_struct      qos_work;
+       struct pinctrl          *pins;
+ };
+ #define to_uart_omap_port(p)  ((container_of((p), struct uart_omap_port, port)))
  static struct uart_omap_port *ui[OMAP_MAX_HSUART_PORTS];
  
  /* Forward declaration of functions */
- static void uart_tx_dma_callback(int lch, u16 ch_status, void *data);
- static void serial_omap_rxdma_poll(unsigned long uart_no);
- static int serial_omap_start_rxdma(struct uart_omap_port *up);
  static void serial_omap_mdr1_errataset(struct uart_omap_port *up, u8 mdr1);
  
  static struct workqueue_struct *serial_omap_uart_wq;
@@@ -101,6 -141,46 +141,46 @@@ static inline void serial_omap_clear_fi
        serial_out(up, UART_FCR, 0);
  }
  
+ static int serial_omap_get_context_loss_count(struct uart_omap_port *up)
+ {
+       struct omap_uart_port_info *pdata = up->dev->platform_data;
+       if (!pdata || !pdata->get_context_loss_count)
+               return 0;
+       return pdata->get_context_loss_count(up->dev);
+ }
+ static void serial_omap_set_forceidle(struct uart_omap_port *up)
+ {
+       struct omap_uart_port_info *pdata = up->dev->platform_data;
+       if (!pdata || !pdata->set_forceidle)
+               return;
+       pdata->set_forceidle(up->dev);
+ }
+ static void serial_omap_set_noidle(struct uart_omap_port *up)
+ {
+       struct omap_uart_port_info *pdata = up->dev->platform_data;
+       if (!pdata || !pdata->set_noidle)
+               return;
+       pdata->set_noidle(up->dev);
+ }
+ static void serial_omap_enable_wakeup(struct uart_omap_port *up, bool enable)
+ {
+       struct omap_uart_port_info *pdata = up->dev->platform_data;
+       if (!pdata || !pdata->enable_wakeup)
+               return;
+       pdata->enable_wakeup(up->dev, enable);
+ }
  /*
   * serial_omap_get_divisor - calculate divisor value
   * @port: uart port info
@@@ -126,151 -206,55 +206,55 @@@ serial_omap_get_divisor(struct uart_por
        return port->uartclk/(baud * divisor);
  }
  
- static void serial_omap_stop_rxdma(struct uart_omap_port *up)
- {
-       if (up->uart_dma.rx_dma_used) {
-               del_timer(&up->uart_dma.rx_timer);
-               omap_stop_dma(up->uart_dma.rx_dma_channel);
-               omap_free_dma(up->uart_dma.rx_dma_channel);
-               up->uart_dma.rx_dma_channel = OMAP_UART_DMA_CH_FREE;
-               up->uart_dma.rx_dma_used = false;
-               pm_runtime_mark_last_busy(&up->pdev->dev);
-               pm_runtime_put_autosuspend(&up->pdev->dev);
-       }
- }
  static void serial_omap_enable_ms(struct uart_port *port)
  {
-       struct uart_omap_port *up = (struct uart_omap_port *)port;
+       struct uart_omap_port *up = to_uart_omap_port(port);
  
        dev_dbg(up->port.dev, "serial_omap_enable_ms+%d\n", up->port.line);
  
-       pm_runtime_get_sync(&up->pdev->dev);
+       pm_runtime_get_sync(up->dev);
        up->ier |= UART_IER_MSI;
        serial_out(up, UART_IER, up->ier);
-       pm_runtime_put(&up->pdev->dev);
+       pm_runtime_mark_last_busy(up->dev);
+       pm_runtime_put_autosuspend(up->dev);
  }
  
  static void serial_omap_stop_tx(struct uart_port *port)
  {
-       struct uart_omap_port *up = (struct uart_omap_port *)port;
-       struct omap_uart_port_info *pdata = up->pdev->dev.platform_data;
+       struct uart_omap_port *up = to_uart_omap_port(port);
  
-       if (up->use_dma &&
-               up->uart_dma.tx_dma_channel != OMAP_UART_DMA_CH_FREE) {
-               /*
-                * Check if dma is still active. If yes do nothing,
-                * return. Else stop dma
-                */
-               if (omap_get_dma_active_status(up->uart_dma.tx_dma_channel))
-                       return;
-               omap_stop_dma(up->uart_dma.tx_dma_channel);
-               omap_free_dma(up->uart_dma.tx_dma_channel);
-               up->uart_dma.tx_dma_channel = OMAP_UART_DMA_CH_FREE;
-               pm_runtime_mark_last_busy(&up->pdev->dev);
-               pm_runtime_put_autosuspend(&up->pdev->dev);
-       }
-       pm_runtime_get_sync(&up->pdev->dev);
+       pm_runtime_get_sync(up->dev);
        if (up->ier & UART_IER_THRI) {
                up->ier &= ~UART_IER_THRI;
                serial_out(up, UART_IER, up->ier);
        }
  
-       if (!up->use_dma && pdata && pdata->set_forceidle)
-               pdata->set_forceidle(up->pdev);
+       serial_omap_set_forceidle(up);
  
-       pm_runtime_mark_last_busy(&up->pdev->dev);
-       pm_runtime_put_autosuspend(&up->pdev->dev);
+       pm_runtime_mark_last_busy(up->dev);
+       pm_runtime_put_autosuspend(up->dev);
  }
  
  static void serial_omap_stop_rx(struct uart_port *port)
  {
-       struct uart_omap_port *up = (struct uart_omap_port *)port;
+       struct uart_omap_port *up = to_uart_omap_port(port);
  
-       pm_runtime_get_sync(&up->pdev->dev);
-       if (up->use_dma)
-               serial_omap_stop_rxdma(up);
+       pm_runtime_get_sync(up->dev);
        up->ier &= ~UART_IER_RLSI;
        up->port.read_status_mask &= ~UART_LSR_DR;
        serial_out(up, UART_IER, up->ier);
-       pm_runtime_mark_last_busy(&up->pdev->dev);
-       pm_runtime_put_autosuspend(&up->pdev->dev);
- }
- static inline void receive_chars(struct uart_omap_port *up,
-               unsigned int *status)
- {
-       struct tty_struct *tty = up->port.state->port.tty;
-       unsigned int flag, lsr = *status;
-       unsigned char ch = 0;
-       int max_count = 256;
-       do {
-               if (likely(lsr & UART_LSR_DR))
-                       ch = serial_in(up, UART_RX);
-               flag = TTY_NORMAL;
-               up->port.icount.rx++;
-               if (unlikely(lsr & UART_LSR_BRK_ERROR_BITS)) {
-                       /*
-                        * For statistics only
-                        */
-                       if (lsr & UART_LSR_BI) {
-                               lsr &= ~(UART_LSR_FE | UART_LSR_PE);
-                               up->port.icount.brk++;
-                               /*
-                                * We do the SysRQ and SAK checking
-                                * here because otherwise the break
-                                * may get masked by ignore_status_mask
-                                * or read_status_mask.
-                                */
-                               if (uart_handle_break(&up->port))
-                                       goto ignore_char;
-                       } else if (lsr & UART_LSR_PE) {
-                               up->port.icount.parity++;
-                       } else if (lsr & UART_LSR_FE) {
-                               up->port.icount.frame++;
-                       }
-                       if (lsr & UART_LSR_OE)
-                               up->port.icount.overrun++;
-                       /*
-                        * Mask off conditions which should be ignored.
-                        */
-                       lsr &= up->port.read_status_mask;
- #ifdef CONFIG_SERIAL_OMAP_CONSOLE
-                       if (up->port.line == up->port.cons->index) {
-                               /* Recover the break flag from console xmit */
-                               lsr |= up->lsr_break_flag;
-                       }
- #endif
-                       if (lsr & UART_LSR_BI)
-                               flag = TTY_BREAK;
-                       else if (lsr & UART_LSR_PE)
-                               flag = TTY_PARITY;
-                       else if (lsr & UART_LSR_FE)
-                               flag = TTY_FRAME;
-               }
-               if (uart_handle_sysrq_char(&up->port, ch))
-                       goto ignore_char;
-               uart_insert_char(&up->port, lsr, UART_LSR_OE, ch, flag);
- ignore_char:
-               lsr = serial_in(up, UART_LSR);
-       } while ((lsr & (UART_LSR_DR | UART_LSR_BI)) && (max_count-- > 0));
-       spin_unlock(&up->port.lock);
-       tty_flip_buffer_push(tty);
-       spin_lock(&up->port.lock);
+       pm_runtime_mark_last_busy(up->dev);
+       pm_runtime_put_autosuspend(up->dev);
  }
  
- static void transmit_chars(struct uart_omap_port *up)
+ static void transmit_chars(struct uart_omap_port *up, unsigned int lsr)
  {
        struct circ_buf *xmit = &up->port.state->xmit;
        int count;
  
+       if (!(lsr & UART_LSR_THRE))
+               return;
        if (up->port.x_char) {
                serial_out(up, UART_TX, up->port.x_char);
                up->port.icount.tx++;
                        break;
        } while (--count > 0);
  
-       if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
+       if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) {
+               spin_unlock(&up->port.lock);
                uart_write_wakeup(&up->port);
+               spin_lock(&up->port.lock);
+       }
  
        if (uart_circ_empty(xmit))
                serial_omap_stop_tx(&up->port);
@@@ -307,70 -294,13 +294,13 @@@ static inline void serial_omap_enable_i
  
  static void serial_omap_start_tx(struct uart_port *port)
  {
-       struct uart_omap_port *up = (struct uart_omap_port *)port;
-       struct omap_uart_port_info *pdata = up->pdev->dev.platform_data;
-       struct circ_buf *xmit;
-       unsigned int start;
-       int ret = 0;
-       if (!up->use_dma) {
-               pm_runtime_get_sync(&up->pdev->dev);
-               serial_omap_enable_ier_thri(up);
-               if (pdata && pdata->set_noidle)
-                       pdata->set_noidle(up->pdev);
-               pm_runtime_mark_last_busy(&up->pdev->dev);
-               pm_runtime_put_autosuspend(&up->pdev->dev);
-               return;
-       }
-       if (up->uart_dma.tx_dma_used)
-               return;
-       xmit = &up->port.state->xmit;
-       if (up->uart_dma.tx_dma_channel == OMAP_UART_DMA_CH_FREE) {
-               pm_runtime_get_sync(&up->pdev->dev);
-               ret = omap_request_dma(up->uart_dma.uart_dma_tx,
-                               "UART Tx DMA",
-                               (void *)uart_tx_dma_callback, up,
-                               &(up->uart_dma.tx_dma_channel));
+       struct uart_omap_port *up = to_uart_omap_port(port);
  
-               if (ret < 0) {
-                       serial_omap_enable_ier_thri(up);
-                       return;
-               }
-       }
-       spin_lock(&(up->uart_dma.tx_lock));
-       up->uart_dma.tx_dma_used = true;
-       spin_unlock(&(up->uart_dma.tx_lock));
-       start = up->uart_dma.tx_buf_dma_phys +
-                               (xmit->tail & (UART_XMIT_SIZE - 1));
-       up->uart_dma.tx_buf_size = uart_circ_chars_pending(xmit);
-       /*
-        * It is a circular buffer. See if the buffer has wounded back.
-        * If yes it will have to be transferred in two separate dma
-        * transfers
-        */
-       if (start + up->uart_dma.tx_buf_size >=
-                       up->uart_dma.tx_buf_dma_phys + UART_XMIT_SIZE)
-               up->uart_dma.tx_buf_size =
-                       (up->uart_dma.tx_buf_dma_phys +
-                       UART_XMIT_SIZE) - start;
-       omap_set_dma_dest_params(up->uart_dma.tx_dma_channel, 0,
-                               OMAP_DMA_AMODE_CONSTANT,
-                               up->uart_dma.uart_base, 0, 0);
-       omap_set_dma_src_params(up->uart_dma.tx_dma_channel, 0,
-                               OMAP_DMA_AMODE_POST_INC, start, 0, 0);
-       omap_set_dma_transfer_params(up->uart_dma.tx_dma_channel,
-                               OMAP_DMA_DATA_TYPE_S8,
-                               up->uart_dma.tx_buf_size, 1,
-                               OMAP_DMA_SYNC_ELEMENT,
-                               up->uart_dma.uart_dma_tx, 0);
-       /* FIXME: Cache maintenance needed here? */
-       omap_start_dma(up->uart_dma.tx_dma_channel);
+       pm_runtime_get_sync(up->dev);
+       serial_omap_enable_ier_thri(up);
+       serial_omap_set_noidle(up);
+       pm_runtime_mark_last_busy(up->dev);
+       pm_runtime_put_autosuspend(up->dev);
  }
  
  static unsigned int check_modem_status(struct uart_omap_port *up)
        return status;
  }
  
+ static void serial_omap_rlsi(struct uart_omap_port *up, unsigned int lsr)
+ {
+       unsigned int flag;
+       up->port.icount.rx++;
+       flag = TTY_NORMAL;
+       if (lsr & UART_LSR_BI) {
+               flag = TTY_BREAK;
+               lsr &= ~(UART_LSR_FE | UART_LSR_PE);
+               up->port.icount.brk++;
+               /*
+                * We do the SysRQ and SAK checking
+                * here because otherwise the break
+                * may get masked by ignore_status_mask
+                * or read_status_mask.
+                */
+               if (uart_handle_break(&up->port))
+                       return;
+       }
+       if (lsr & UART_LSR_PE) {
+               flag = TTY_PARITY;
+               up->port.icount.parity++;
+       }
+       if (lsr & UART_LSR_FE) {
+               flag = TTY_FRAME;
+               up->port.icount.frame++;
+       }
+       if (lsr & UART_LSR_OE)
+               up->port.icount.overrun++;
+ #ifdef CONFIG_SERIAL_OMAP_CONSOLE
+       if (up->port.line == up->port.cons->index) {
+               /* Recover the break flag from console xmit */
+               lsr |= up->lsr_break_flag;
+       }
+ #endif
+       uart_insert_char(&up->port, lsr, UART_LSR_OE, 0, flag);
+ }
+ static void serial_omap_rdi(struct uart_omap_port *up, unsigned int lsr)
+ {
+       unsigned char ch = 0;
+       unsigned int flag;
+       if (!(lsr & UART_LSR_DR))
+               return;
+       ch = serial_in(up, UART_RX);
+       flag = TTY_NORMAL;
+       up->port.icount.rx++;
+       if (uart_handle_sysrq_char(&up->port, ch))
+               return;
+       uart_insert_char(&up->port, lsr, UART_LSR_OE, ch, flag);
+ }
  /**
   * serial_omap_irq() - This handles the interrupt from one port
   * @irq: uart port irq number
   * @dev_id: uart port info
   */
- static inline irqreturn_t serial_omap_irq(int irq, void *dev_id)
+ static irqreturn_t serial_omap_irq(int irq, void *dev_id)
  {
        struct uart_omap_port *up = dev_id;
+       struct tty_struct *tty = up->port.state->port.tty;
        unsigned int iir, lsr;
-       unsigned long flags;
+       unsigned int type;
+       irqreturn_t ret = IRQ_NONE;
+       int max_count = 256;
  
-       pm_runtime_get_sync(&up->pdev->dev);
-       iir = serial_in(up, UART_IIR);
-       if (iir & UART_IIR_NO_INT) {
-               pm_runtime_mark_last_busy(&up->pdev->dev);
-               pm_runtime_put_autosuspend(&up->pdev->dev);
-               return IRQ_NONE;
-       }
+       spin_lock(&up->port.lock);
+       pm_runtime_get_sync(up->dev);
  
-       spin_lock_irqsave(&up->port.lock, flags);
-       lsr = serial_in(up, UART_LSR);
-       if (iir & UART_IIR_RLSI) {
-               if (!up->use_dma) {
-                       if (lsr & UART_LSR_DR)
-                               receive_chars(up, &lsr);
-               } else {
-                       up->ier &= ~(UART_IER_RDI | UART_IER_RLSI);
-                       serial_out(up, UART_IER, up->ier);
-                       if ((serial_omap_start_rxdma(up) != 0) &&
-                                       (lsr & UART_LSR_DR))
-                               receive_chars(up, &lsr);
+       do {
+               iir = serial_in(up, UART_IIR);
+               if (iir & UART_IIR_NO_INT)
+                       break;
+               ret = IRQ_HANDLED;
+               lsr = serial_in(up, UART_LSR);
+               /* extract IRQ type from IIR register */
+               type = iir & 0x3e;
+               switch (type) {
+               case UART_IIR_MSI:
+                       check_modem_status(up);
+                       break;
+               case UART_IIR_THRI:
+                       transmit_chars(up, lsr);
+                       break;
+               case UART_IIR_RX_TIMEOUT:
+                       /* FALLTHROUGH */
+               case UART_IIR_RDI:
+                       serial_omap_rdi(up, lsr);
+                       break;
+               case UART_IIR_RLSI:
+                       serial_omap_rlsi(up, lsr);
+                       break;
+               case UART_IIR_CTS_RTS_DSR:
+                       /* simply try again */
+                       break;
+               case UART_IIR_XOFF:
+                       /* FALLTHROUGH */
+               default:
+                       break;
                }
-       }
+       } while (!(iir & UART_IIR_NO_INT) && max_count--);
  
-       check_modem_status(up);
-       if ((lsr & UART_LSR_THRE) && (iir & UART_IIR_THRI))
-               transmit_chars(up);
+       spin_unlock(&up->port.lock);
  
-       spin_unlock_irqrestore(&up->port.lock, flags);
-       pm_runtime_mark_last_busy(&up->pdev->dev);
-       pm_runtime_put_autosuspend(&up->pdev->dev);
+       tty_flip_buffer_push(tty);
  
+       pm_runtime_mark_last_busy(up->dev);
+       pm_runtime_put_autosuspend(up->dev);
        up->port_activity = jiffies;
-       return IRQ_HANDLED;
+       return ret;
  }
  
  static unsigned int serial_omap_tx_empty(struct uart_port *port)
  {
-       struct uart_omap_port *up = (struct uart_omap_port *)port;
+       struct uart_omap_port *up = to_uart_omap_port(port);
        unsigned long flags = 0;
        unsigned int ret = 0;
  
-       pm_runtime_get_sync(&up->pdev->dev);
+       pm_runtime_get_sync(up->dev);
        dev_dbg(up->port.dev, "serial_omap_tx_empty+%d\n", up->port.line);
        spin_lock_irqsave(&up->port.lock, flags);
        ret = serial_in(up, UART_LSR) & UART_LSR_TEMT ? TIOCSER_TEMT : 0;
        spin_unlock_irqrestore(&up->port.lock, flags);
-       pm_runtime_put(&up->pdev->dev);
+       pm_runtime_mark_last_busy(up->dev);
+       pm_runtime_put_autosuspend(up->dev);
        return ret;
  }
  
  static unsigned int serial_omap_get_mctrl(struct uart_port *port)
  {
-       struct uart_omap_port *up = (struct uart_omap_port *)port;
+       struct uart_omap_port *up = to_uart_omap_port(port);
        unsigned int status;
        unsigned int ret = 0;
  
-       pm_runtime_get_sync(&up->pdev->dev);
+       pm_runtime_get_sync(up->dev);
        status = check_modem_status(up);
-       pm_runtime_put(&up->pdev->dev);
+       pm_runtime_mark_last_busy(up->dev);
+       pm_runtime_put_autosuspend(up->dev);
  
        dev_dbg(up->port.dev, "serial_omap_get_mctrl+%d\n", up->port.line);
  
  
  static void serial_omap_set_mctrl(struct uart_port *port, unsigned int mctrl)
  {
-       struct uart_omap_port *up = (struct uart_omap_port *)port;
+       struct uart_omap_port *up = to_uart_omap_port(port);
        unsigned char mcr = 0;
  
        dev_dbg(up->port.dev, "serial_omap_set_mctrl+%d\n", up->port.line);
        if (mctrl & TIOCM_LOOP)
                mcr |= UART_MCR_LOOP;
  
-       pm_runtime_get_sync(&up->pdev->dev);
+       pm_runtime_get_sync(up->dev);
        up->mcr = serial_in(up, UART_MCR);
        up->mcr |= mcr;
        serial_out(up, UART_MCR, up->mcr);
-       pm_runtime_put(&up->pdev->dev);
+       pm_runtime_mark_last_busy(up->dev);
+       pm_runtime_put_autosuspend(up->dev);
+       if (gpio_is_valid(up->DTR_gpio) &&
+           !!(mctrl & TIOCM_DTR) != up->DTR_active) {
+               up->DTR_active = !up->DTR_active;
+               if (gpio_cansleep(up->DTR_gpio))
+                       schedule_work(&up->qos_work);
+               else
+                       gpio_set_value(up->DTR_gpio,
+                                      up->DTR_active != up->DTR_inverted);
+       }
  }
  
  static void serial_omap_break_ctl(struct uart_port *port, int break_state)
  {
-       struct uart_omap_port *up = (struct uart_omap_port *)port;
+       struct uart_omap_port *up = to_uart_omap_port(port);
        unsigned long flags = 0;
  
        dev_dbg(up->port.dev, "serial_omap_break_ctl+%d\n", up->port.line);
-       pm_runtime_get_sync(&up->pdev->dev);
+       pm_runtime_get_sync(up->dev);
        spin_lock_irqsave(&up->port.lock, flags);
        if (break_state == -1)
                up->lcr |= UART_LCR_SBC;
                up->lcr &= ~UART_LCR_SBC;
        serial_out(up, UART_LCR, up->lcr);
        spin_unlock_irqrestore(&up->port.lock, flags);
-       pm_runtime_put(&up->pdev->dev);
+       pm_runtime_mark_last_busy(up->dev);
+       pm_runtime_put_autosuspend(up->dev);
  }
  
  static int serial_omap_startup(struct uart_port *port)
  {
-       struct uart_omap_port *up = (struct uart_omap_port *)port;
+       struct uart_omap_port *up = to_uart_omap_port(port);
        unsigned long flags = 0;
        int retval;
  
  
        dev_dbg(up->port.dev, "serial_omap_startup+%d\n", up->port.line);
  
-       pm_runtime_get_sync(&up->pdev->dev);
+       pm_runtime_get_sync(up->dev);
        /*
         * Clear the FIFO buffers and disable them.
         * (they will be reenabled in set_termios())
        spin_unlock_irqrestore(&up->port.lock, flags);
  
        up->msr_saved_flags = 0;
-       if (up->use_dma) {
-               free_page((unsigned long)up->port.state->xmit.buf);
-               up->port.state->xmit.buf = dma_alloc_coherent(NULL,
-                       UART_XMIT_SIZE,
-                       (dma_addr_t *)&(up->uart_dma.tx_buf_dma_phys),
-                       0);
-               init_timer(&(up->uart_dma.rx_timer));
-               up->uart_dma.rx_timer.function = serial_omap_rxdma_poll;
-               up->uart_dma.rx_timer.data = up->port.line;
-               /* Currently the buffer size is 4KB. Can increase it */
-               up->uart_dma.rx_buf = dma_alloc_coherent(NULL,
-                       up->uart_dma.rx_buf_size,
-                       (dma_addr_t *)&(up->uart_dma.rx_buf_dma_phys), 0);
-       }
        /*
         * Finally, enable interrupts. Note: Modem status interrupts
         * are set via set_termios(), which will be occurring imminently
        /* Enable module level wake up */
        serial_out(up, UART_OMAP_WER, OMAP_UART_WER_MOD_WKUP);
  
-       pm_runtime_mark_last_busy(&up->pdev->dev);
-       pm_runtime_put_autosuspend(&up->pdev->dev);
+       pm_runtime_mark_last_busy(up->dev);
+       pm_runtime_put_autosuspend(up->dev);
        up->port_activity = jiffies;
        return 0;
  }
  
  static void serial_omap_shutdown(struct uart_port *port)
  {
-       struct uart_omap_port *up = (struct uart_omap_port *)port;
+       struct uart_omap_port *up = to_uart_omap_port(port);
        unsigned long flags = 0;
  
        dev_dbg(up->port.dev, "serial_omap_shutdown+%d\n", up->port.line);
  
-       pm_runtime_get_sync(&up->pdev->dev);
+       pm_runtime_get_sync(up->dev);
        /*
         * Disable interrupts from this port
         */
         */
        if (serial_in(up, UART_LSR) & UART_LSR_DR)
                (void) serial_in(up, UART_RX);
-       if (up->use_dma) {
-               dma_free_coherent(up->port.dev,
-                       UART_XMIT_SIZE, up->port.state->xmit.buf,
-                       up->uart_dma.tx_buf_dma_phys);
-               up->port.state->xmit.buf = NULL;
-               serial_omap_stop_rx(port);
-               dma_free_coherent(up->port.dev,
-                       up->uart_dma.rx_buf_size, up->uart_dma.rx_buf,
-                       up->uart_dma.rx_buf_dma_phys);
-               up->uart_dma.rx_buf = NULL;
-       }
  
-       pm_runtime_put(&up->pdev->dev);
+       pm_runtime_mark_last_busy(up->dev);
+       pm_runtime_put_autosuspend(up->dev);
        free_irq(up->port.irq, up);
  }
  
@@@ -667,19 -667,19 +667,19 @@@ serial_omap_configure_xonxof
  
        /*
         * IXON Flag:
-        * Enable XON/XOFF flow control on output.
-        * Transmit XON1, XOFF1
+        * Flow control for OMAP.TX
+        * OMAP.RX should listen for XON/XOFF
         */
        if (termios->c_iflag & IXON)
-               up->efr |= OMAP_UART_SW_TX;
+               up->efr |= OMAP_UART_SW_RX;
  
        /*
         * IXOFF Flag:
-        * Enable XON/XOFF flow control on input.
-        * Receiver compares XON1, XOFF1.
+        * Flow control for OMAP.RX
+        * OMAP.TX should send XON/XOFF
         */
        if (termios->c_iflag & IXOFF)
-               up->efr |= OMAP_UART_SW_RX;
+               up->efr |= OMAP_UART_SW_TX;
  
        serial_out(up, UART_EFR, up->efr | UART_EFR_ECB);
        serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A);
@@@ -715,13 -715,16 +715,16 @@@ static void serial_omap_uart_qos_work(s
                                                qos_work);
  
        pm_qos_update_request(&up->pm_qos_request, up->latency);
+       if (gpio_is_valid(up->DTR_gpio))
+               gpio_set_value_cansleep(up->DTR_gpio,
+                                       up->DTR_active != up->DTR_inverted);
  }
  
  static void
  serial_omap_set_termios(struct uart_port *port, struct ktermios *termios,
                        struct ktermios *old)
  {
-       struct uart_omap_port *up = (struct uart_omap_port *)port;
+       struct uart_omap_port *up = to_uart_omap_port(port);
        unsigned char cval = 0;
        unsigned char efr = 0;
        unsigned long flags = 0;
  
        up->fcr = UART_FCR_R_TRIG_01 | UART_FCR_T_TRIG_01 |
                        UART_FCR_ENABLE_FIFO;
-       if (up->use_dma)
-               up->fcr |= UART_FCR_DMA_SELECT;
  
        /*
         * Ok, we're now changing the port state. Do it with
         * interrupts disabled.
         */
-       pm_runtime_get_sync(&up->pdev->dev);
+       pm_runtime_get_sync(up->dev);
        spin_lock_irqsave(&up->port.lock, flags);
  
        /*
  
        up->scr |= OMAP_UART_SCR_RX_TRIG_GRANU1_MASK;
  
-       if (up->use_dma) {
-               serial_out(up, UART_TI752_TLR, 0);
-               up->scr |= UART_FCR_TRIGGER_4;
-       } else {
-               /* Set receive FIFO threshold to 1 byte */
-               up->fcr &= ~OMAP_UART_FCR_RX_FIFO_TRIG_MASK;
-               up->fcr |= (0x1 << OMAP_UART_FCR_RX_FIFO_TRIG_SHIFT);
-       }
+       /* Set receive FIFO threshold to 16 characters and
+        * transmit FIFO threshold to 16 spaces
+        */
+       up->fcr &= ~OMAP_UART_FCR_RX_FIFO_TRIG_MASK;
+       up->fcr &= ~OMAP_UART_FCR_TX_FIFO_TRIG_MASK;
+       up->fcr |= UART_FCR6_R_TRIGGER_16 | UART_FCR6_T_TRIGGER_24 |
+               UART_FCR_ENABLE_FIFO;
  
        serial_out(up, UART_FCR, up->fcr);
        serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
        serial_omap_configure_xonxoff(up, termios);
  
        spin_unlock_irqrestore(&up->port.lock, flags);
-       pm_runtime_put(&up->pdev->dev);
+       pm_runtime_mark_last_busy(up->dev);
+       pm_runtime_put_autosuspend(up->dev);
        dev_dbg(up->port.dev, "serial_omap_set_termios+%d\n", up->port.line);
  }
  
+ static int serial_omap_set_wake(struct uart_port *port, unsigned int state)
+ {
+       struct uart_omap_port *up = to_uart_omap_port(port);
+       serial_omap_enable_wakeup(up, state);
+       return 0;
+ }
  static void
  serial_omap_pm(struct uart_port *port, unsigned int state,
               unsigned int oldstate)
  {
-       struct uart_omap_port *up = (struct uart_omap_port *)port;
+       struct uart_omap_port *up = to_uart_omap_port(port);
        unsigned char efr;
  
        dev_dbg(up->port.dev, "serial_omap_pm+%d\n", up->port.line);
  
-       pm_runtime_get_sync(&up->pdev->dev);
+       pm_runtime_get_sync(up->dev);
        serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
        efr = serial_in(up, UART_EFR);
        serial_out(up, UART_EFR, efr | UART_EFR_ECB);
        serial_out(up, UART_EFR, efr);
        serial_out(up, UART_LCR, 0);
  
-       if (!device_may_wakeup(&up->pdev->dev)) {
+       if (!device_may_wakeup(up->dev)) {
                if (!state)
-                       pm_runtime_forbid(&up->pdev->dev);
+                       pm_runtime_forbid(up->dev);
                else
-                       pm_runtime_allow(&up->pdev->dev);
+                       pm_runtime_allow(up->dev);
        }
  
-       pm_runtime_put(&up->pdev->dev);
+       pm_runtime_mark_last_busy(up->dev);
+       pm_runtime_put_autosuspend(up->dev);
  }
  
  static void serial_omap_release_port(struct uart_port *port)
@@@ -971,7 -982,7 +982,7 @@@ static int serial_omap_request_port(str
  
  static void serial_omap_config_port(struct uart_port *port, int flags)
  {
-       struct uart_omap_port *up = (struct uart_omap_port *)port;
+       struct uart_omap_port *up = to_uart_omap_port(port);
  
        dev_dbg(up->port.dev, "serial_omap_config_port+%d\n",
                                                        up->port.line);
@@@ -989,7 -1000,7 +1000,7 @@@ serial_omap_verify_port(struct uart_por
  static const char *
  serial_omap_type(struct uart_port *port)
  {
-       struct uart_omap_port *up = (struct uart_omap_port *)port;
+       struct uart_omap_port *up = to_uart_omap_port(port);
  
        dev_dbg(up->port.dev, "serial_omap_type+%d\n", up->port.line);
        return up->name;
@@@ -1032,26 -1043,33 +1043,33 @@@ static inline void wait_for_xmitr(struc
  
  static void serial_omap_poll_put_char(struct uart_port *port, unsigned char ch)
  {
-       struct uart_omap_port *up = (struct uart_omap_port *)port;
+       struct uart_omap_port *up = to_uart_omap_port(port);
  
-       pm_runtime_get_sync(&up->pdev->dev);
+       pm_runtime_get_sync(up->dev);
        wait_for_xmitr(up);
        serial_out(up, UART_TX, ch);
-       pm_runtime_put(&up->pdev->dev);
+       pm_runtime_mark_last_busy(up->dev);
+       pm_runtime_put_autosuspend(up->dev);
  }
  
  static int serial_omap_poll_get_char(struct uart_port *port)
  {
-       struct uart_omap_port *up = (struct uart_omap_port *)port;
+       struct uart_omap_port *up = to_uart_omap_port(port);
        unsigned int status;
  
-       pm_runtime_get_sync(&up->pdev->dev);
+       pm_runtime_get_sync(up->dev);
        status = serial_in(up, UART_LSR);
-       if (!(status & UART_LSR_DR))
-               return NO_POLL_CHAR;
+       if (!(status & UART_LSR_DR)) {
+               status = NO_POLL_CHAR;
+               goto out;
+       }
  
        status = serial_in(up, UART_RX);
-       pm_runtime_put(&up->pdev->dev);
+ out:
+       pm_runtime_mark_last_busy(up->dev);
+       pm_runtime_put_autosuspend(up->dev);
        return status;
  }
  
@@@ -1065,7 -1083,7 +1083,7 @@@ static struct uart_driver serial_omap_r
  
  static void serial_omap_console_putchar(struct uart_port *port, int ch)
  {
-       struct uart_omap_port *up = (struct uart_omap_port *)port;
+       struct uart_omap_port *up = to_uart_omap_port(port);
  
        wait_for_xmitr(up);
        serial_out(up, UART_TX, ch);
@@@ -1080,7 -1098,7 +1098,7 @@@ serial_omap_console_write(struct consol
        unsigned int ier;
        int locked = 1;
  
-       pm_runtime_get_sync(&up->pdev->dev);
+       pm_runtime_get_sync(up->dev);
  
        local_irq_save(flags);
        if (up->port.sysrq)
        if (up->msr_saved_flags)
                check_modem_status(up);
  
-       pm_runtime_mark_last_busy(&up->pdev->dev);
-       pm_runtime_put_autosuspend(&up->pdev->dev);
+       pm_runtime_mark_last_busy(up->dev);
+       pm_runtime_put_autosuspend(up->dev);
        if (locked)
                spin_unlock(&up->port.lock);
        local_irq_restore(flags);
@@@ -1179,6 -1197,7 +1197,7 @@@ static struct uart_ops serial_omap_pop
        .shutdown       = serial_omap_shutdown,
        .set_termios    = serial_omap_set_termios,
        .pm             = serial_omap_pm,
+       .set_wake       = serial_omap_set_wake,
        .type           = serial_omap_type,
        .release_port   = serial_omap_release_port,
        .request_port   = serial_omap_request_port,
@@@ -1205,7 -1224,7 +1224,7 @@@ static int serial_omap_suspend(struct d
  
        if (up) {
                uart_suspend_port(&serial_omap_reg, &up->port);
 -              flush_work_sync(&up->qos_work);
 +              flush_work(&up->qos_work);
        }
  
        return 0;
@@@ -1221,150 -1240,7 +1240,7 @@@ static int serial_omap_resume(struct de
  }
  #endif
  
- static void serial_omap_rxdma_poll(unsigned long uart_no)
- {
-       struct uart_omap_port *up = ui[uart_no];
-       unsigned int curr_dma_pos, curr_transmitted_size;
-       int ret = 0;
-       curr_dma_pos = omap_get_dma_dst_pos(up->uart_dma.rx_dma_channel);
-       if ((curr_dma_pos == up->uart_dma.prev_rx_dma_pos) ||
-                            (curr_dma_pos == 0)) {
-               if (jiffies_to_msecs(jiffies - up->port_activity) <
-                                               up->uart_dma.rx_timeout) {
-                       mod_timer(&up->uart_dma.rx_timer, jiffies +
-                               usecs_to_jiffies(up->uart_dma.rx_poll_rate));
-               } else {
-                       serial_omap_stop_rxdma(up);
-                       up->ier |= (UART_IER_RDI | UART_IER_RLSI);
-                       serial_out(up, UART_IER, up->ier);
-               }
-               return;
-       }
-       curr_transmitted_size = curr_dma_pos -
-                                       up->uart_dma.prev_rx_dma_pos;
-       up->port.icount.rx += curr_transmitted_size;
-       tty_insert_flip_string(up->port.state->port.tty,
-                       up->uart_dma.rx_buf +
-                       (up->uart_dma.prev_rx_dma_pos -
-                       up->uart_dma.rx_buf_dma_phys),
-                       curr_transmitted_size);
-       tty_flip_buffer_push(up->port.state->port.tty);
-       up->uart_dma.prev_rx_dma_pos = curr_dma_pos;
-       if (up->uart_dma.rx_buf_size +
-                       up->uart_dma.rx_buf_dma_phys == curr_dma_pos) {
-               ret = serial_omap_start_rxdma(up);
-               if (ret < 0) {
-                       serial_omap_stop_rxdma(up);
-                       up->ier |= (UART_IER_RDI | UART_IER_RLSI);
-                       serial_out(up, UART_IER, up->ier);
-               }
-       } else  {
-               mod_timer(&up->uart_dma.rx_timer, jiffies +
-                       usecs_to_jiffies(up->uart_dma.rx_poll_rate));
-       }
-       up->port_activity = jiffies;
- }
- static void uart_rx_dma_callback(int lch, u16 ch_status, void *data)
- {
-       return;
- }
- static int serial_omap_start_rxdma(struct uart_omap_port *up)
- {
-       int ret = 0;
-       if (up->uart_dma.rx_dma_channel == -1) {
-               pm_runtime_get_sync(&up->pdev->dev);
-               ret = omap_request_dma(up->uart_dma.uart_dma_rx,
-                               "UART Rx DMA",
-                               (void *)uart_rx_dma_callback, up,
-                               &(up->uart_dma.rx_dma_channel));
-               if (ret < 0)
-                       return ret;
-               omap_set_dma_src_params(up->uart_dma.rx_dma_channel, 0,
-                               OMAP_DMA_AMODE_CONSTANT,
-                               up->uart_dma.uart_base, 0, 0);
-               omap_set_dma_dest_params(up->uart_dma.rx_dma_channel, 0,
-                               OMAP_DMA_AMODE_POST_INC,
-                               up->uart_dma.rx_buf_dma_phys, 0, 0);
-               omap_set_dma_transfer_params(up->uart_dma.rx_dma_channel,
-                               OMAP_DMA_DATA_TYPE_S8,
-                               up->uart_dma.rx_buf_size, 1,
-                               OMAP_DMA_SYNC_ELEMENT,
-                               up->uart_dma.uart_dma_rx, 0);
-       }
-       up->uart_dma.prev_rx_dma_pos = up->uart_dma.rx_buf_dma_phys;
-       /* FIXME: Cache maintenance needed here? */
-       omap_start_dma(up->uart_dma.rx_dma_channel);
-       mod_timer(&up->uart_dma.rx_timer, jiffies +
-                               usecs_to_jiffies(up->uart_dma.rx_poll_rate));
-       up->uart_dma.rx_dma_used = true;
-       return ret;
- }
- static void serial_omap_continue_tx(struct uart_omap_port *up)
- {
-       struct circ_buf *xmit = &up->port.state->xmit;
-       unsigned int start = up->uart_dma.tx_buf_dma_phys
-                       + (xmit->tail & (UART_XMIT_SIZE - 1));
-       if (uart_circ_empty(xmit))
-               return;
-       up->uart_dma.tx_buf_size = uart_circ_chars_pending(xmit);
-       /*
-        * It is a circular buffer. See if the buffer has wounded back.
-        * If yes it will have to be transferred in two separate dma
-        * transfers
-        */
-       if (start + up->uart_dma.tx_buf_size >=
-                       up->uart_dma.tx_buf_dma_phys + UART_XMIT_SIZE)
-               up->uart_dma.tx_buf_size =
-                       (up->uart_dma.tx_buf_dma_phys + UART_XMIT_SIZE) - start;
-       omap_set_dma_dest_params(up->uart_dma.tx_dma_channel, 0,
-                               OMAP_DMA_AMODE_CONSTANT,
-                               up->uart_dma.uart_base, 0, 0);
-       omap_set_dma_src_params(up->uart_dma.tx_dma_channel, 0,
-                               OMAP_DMA_AMODE_POST_INC, start, 0, 0);
-       omap_set_dma_transfer_params(up->uart_dma.tx_dma_channel,
-                               OMAP_DMA_DATA_TYPE_S8,
-                               up->uart_dma.tx_buf_size, 1,
-                               OMAP_DMA_SYNC_ELEMENT,
-                               up->uart_dma.uart_dma_tx, 0);
-       /* FIXME: Cache maintenance needed here? */
-       omap_start_dma(up->uart_dma.tx_dma_channel);
- }
- static void uart_tx_dma_callback(int lch, u16 ch_status, void *data)
- {
-       struct uart_omap_port *up = (struct uart_omap_port *)data;
-       struct circ_buf *xmit = &up->port.state->xmit;
-       xmit->tail = (xmit->tail + up->uart_dma.tx_buf_size) & \
-                       (UART_XMIT_SIZE - 1);
-       up->port.icount.tx += up->uart_dma.tx_buf_size;
-       if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
-               uart_write_wakeup(&up->port);
-       if (uart_circ_empty(xmit)) {
-               spin_lock(&(up->uart_dma.tx_lock));
-               serial_omap_stop_tx(&up->port);
-               up->uart_dma.tx_dma_used = false;
-               spin_unlock(&(up->uart_dma.tx_lock));
-       } else {
-               omap_stop_dma(up->uart_dma.tx_dma_channel);
-               serial_omap_continue_tx(up);
-       }
-       up->port_activity = jiffies;
-       return;
- }
- static void omap_serial_fill_features_erratas(struct uart_omap_port *up)
+ static void __devinit omap_serial_fill_features_erratas(struct uart_omap_port *up)
  {
        u32 mvr, scheme;
        u16 revision, major, minor;
                minor = (mvr & OMAP_UART_MVR_MIN_MASK);
                break;
        default:
-               dev_warn(&up->pdev->dev,
+               dev_warn(up->dev,
                        "Unknown %s revision, defaulting to highest\n",
                        up->name);
                /* highest possible revision */
        }
  }
  
- static struct omap_uart_port_info *of_get_uart_port_info(struct device *dev)
+ static __devinit struct omap_uart_port_info *of_get_uart_port_info(struct device *dev)
  {
        struct omap_uart_port_info *omap_up_info;
  
        return omap_up_info;
  }
  
- static int serial_omap_probe(struct platform_device *pdev)
+ static int __devinit serial_omap_probe(struct platform_device *pdev)
  {
        struct uart_omap_port   *up;
-       struct resource         *mem, *irq, *dma_tx, *dma_rx;
+       struct resource         *mem, *irq;
        struct omap_uart_port_info *omap_up_info = pdev->dev.platform_data;
-       int ret = -ENOSPC;
+       int ret;
  
        if (pdev->dev.of_node)
                omap_up_info = of_get_uart_port_info(&pdev->dev);
                return -EBUSY;
        }
  
-       dma_rx = platform_get_resource_byname(pdev, IORESOURCE_DMA, "rx");
-       if (!dma_rx)
-               return -ENXIO;
-       dma_tx = platform_get_resource_byname(pdev, IORESOURCE_DMA, "tx");
-       if (!dma_tx)
-               return -ENXIO;
+       if (gpio_is_valid(omap_up_info->DTR_gpio) &&
+           omap_up_info->DTR_present) {
+               ret = gpio_request(omap_up_info->DTR_gpio, "omap-serial");
+               if (ret < 0)
+                       return ret;
+               ret = gpio_direction_output(omap_up_info->DTR_gpio,
+                                           omap_up_info->DTR_inverted);
+               if (ret < 0)
+                       return ret;
+       }
  
        up = devm_kzalloc(&pdev->dev, sizeof(*up), GFP_KERNEL);
        if (!up)
                return -ENOMEM;
  
-       up->pdev = pdev;
+       if (gpio_is_valid(omap_up_info->DTR_gpio) &&
+           omap_up_info->DTR_present) {
+               up->DTR_gpio = omap_up_info->DTR_gpio;
+               up->DTR_inverted = omap_up_info->DTR_inverted;
+       } else
+               up->DTR_gpio = -EINVAL;
+       up->DTR_active = 0;
+       up->dev = &pdev->dev;
        up->port.dev = &pdev->dev;
        up->port.type = PORT_OMAP;
        up->port.iotype = UPIO_MEM;
                goto err_port_line;
        }
  
+       up->pins = devm_pinctrl_get_select_default(&pdev->dev);
+       if (IS_ERR(up->pins)) {
+               dev_warn(&pdev->dev, "did not get pins for uart%i error: %li\n",
+                        up->port.line, PTR_ERR(up->pins));
+               up->pins = NULL;
+       }
        sprintf(up->name, "OMAP UART%d", up->port.line);
        up->port.mapbase = mem->start;
        up->port.membase = devm_ioremap(&pdev->dev, mem->start,
                dev_warn(&pdev->dev, "No clock speed specified: using default:"
                                                "%d\n", DEFAULT_CLK_SPEED);
        }
-       up->uart_dma.uart_base = mem->start;
-       if (omap_up_info->dma_enabled) {
-               up->uart_dma.uart_dma_tx = dma_tx->start;
-               up->uart_dma.uart_dma_rx = dma_rx->start;
-               up->use_dma = 1;
-               up->uart_dma.rx_buf_size = omap_up_info->dma_rx_buf_size;
-               up->uart_dma.rx_timeout = omap_up_info->dma_rx_timeout;
-               up->uart_dma.rx_poll_rate = omap_up_info->dma_rx_poll_rate;
-               spin_lock_init(&(up->uart_dma.tx_lock));
-               spin_lock_init(&(up->uart_dma.rx_lock));
-               up->uart_dma.tx_dma_channel = OMAP_UART_DMA_CH_FREE;
-               up->uart_dma.rx_dma_channel = OMAP_UART_DMA_CH_FREE;
-       }
  
        up->latency = PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE;
        up->calc_latency = PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE;
        serial_omap_uart_wq = create_singlethread_workqueue(up->name);
        INIT_WORK(&up->qos_work, serial_omap_uart_qos_work);
  
+       platform_set_drvdata(pdev, up);
+       pm_runtime_enable(&pdev->dev);
        pm_runtime_use_autosuspend(&pdev->dev);
        pm_runtime_set_autosuspend_delay(&pdev->dev,
                        omap_up_info->autosuspend_timeout);
  
        pm_runtime_irq_safe(&pdev->dev);
-       pm_runtime_enable(&pdev->dev);
        pm_runtime_get_sync(&pdev->dev);
  
        omap_serial_fill_features_erratas(up);
        if (ret != 0)
                goto err_add_port;
  
-       pm_runtime_put(&pdev->dev);
-       platform_set_drvdata(pdev, up);
+       pm_runtime_mark_last_busy(up->dev);
+       pm_runtime_put_autosuspend(up->dev);
        return 0;
  
  err_add_port:
@@@ -1562,17 -1443,15 +1443,15 @@@ err_port_line
        return ret;
  }
  
- static int serial_omap_remove(struct platform_device *dev)
+ static int __devexit serial_omap_remove(struct platform_device *dev)
  {
        struct uart_omap_port *up = platform_get_drvdata(dev);
  
-       if (up) {
-               pm_runtime_disable(&up->pdev->dev);
-               uart_remove_one_port(&serial_omap_reg, &up->port);
-               pm_qos_remove_request(&up->pm_qos_request);
-       }
+       pm_runtime_put_sync(up->dev);
+       pm_runtime_disable(up->dev);
+       uart_remove_one_port(&serial_omap_reg, &up->port);
+       pm_qos_remove_request(&up->pm_qos_request);
  
-       platform_set_drvdata(dev, NULL);
        return 0;
  }
  
@@@ -1602,7 -1481,7 +1481,7 @@@ static void serial_omap_mdr1_errataset(
                timeout--;
                if (!timeout) {
                        /* Should *never* happen. we warn and carry on */
-                       dev_crit(&up->pdev->dev, "Errata i202: timedout %x\n",
+                       dev_crit(up->dev, "Errata i202: timedout %x\n",
                                                serial_in(up, UART_LSR));
                        break;
                }
@@@ -1648,29 -1527,23 +1527,23 @@@ static int serial_omap_runtime_suspend(
        if (!up)
                return -EINVAL;
  
-       if (!pdata || !pdata->enable_wakeup)
+       if (!pdata)
                return 0;
  
-       if (pdata->get_context_loss_count)
-               up->context_loss_cnt = pdata->get_context_loss_count(dev);
+       up->context_loss_cnt = serial_omap_get_context_loss_count(up);
  
        if (device_may_wakeup(dev)) {
                if (!up->wakeups_enabled) {
-                       pdata->enable_wakeup(up->pdev, true);
+                       serial_omap_enable_wakeup(up, true);
                        up->wakeups_enabled = true;
                }
        } else {
                if (up->wakeups_enabled) {
-                       pdata->enable_wakeup(up->pdev, false);
+                       serial_omap_enable_wakeup(up, false);
                        up->wakeups_enabled = false;
                }
        }
  
-       /* Errata i291 */
-       if (up->use_dma && pdata->set_forceidle &&
-                       (up->errata & UART_ERRATA_i291_DMA_FORCEIDLE))
-               pdata->set_forceidle(up->pdev);
        up->latency = PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE;
        schedule_work(&up->qos_work);
  
@@@ -1683,17 -1556,10 +1556,10 @@@ static int serial_omap_runtime_resume(s
        struct omap_uart_port_info *pdata = dev->platform_data;
  
        if (up && pdata) {
-               if (pdata->get_context_loss_count) {
-                       u32 loss_cnt = pdata->get_context_loss_count(dev);
+                       u32 loss_cnt = serial_omap_get_context_loss_count(up);
  
                        if (up->context_loss_cnt != loss_cnt)
                                serial_omap_restore_context(up);
-               }
-               /* Errata i291 */
-               if (up->use_dma && pdata->set_noidle &&
-                               (up->errata & UART_ERRATA_i291_DMA_FORCEIDLE))
-                       pdata->set_noidle(up->pdev);
  
                up->latency = up->calc_latency;
                schedule_work(&up->qos_work);
@@@ -1721,7 -1587,7 +1587,7 @@@ MODULE_DEVICE_TABLE(of, omap_serial_of_
  
  static struct platform_driver serial_omap_driver = {
        .probe          = serial_omap_probe,
-       .remove         = serial_omap_remove,
+       .remove         = __devexit_p(serial_omap_remove),
        .driver         = {
                .name   = DRIVER_NAME,
                .pm     = &serial_omap_dev_pm_ops,
diff --combined drivers/tty/tty_ldisc.c
index ac5be812dbe3a3338ace3869dde1d7ff9aaafef7,4d7b56268c79408a35b2a3990990778b9359f071..0f2a2c5e704c3560755069f1c102f6714e0ae4b6
@@@ -413,7 -413,7 +413,7 @@@ EXPORT_SYMBOL_GPL(tty_ldisc_flush)
  static void tty_set_termios_ldisc(struct tty_struct *tty, int num)
  {
        mutex_lock(&tty->termios_mutex);
-       tty->termios->c_line = num;
+       tty->termios.c_line = num;
        mutex_unlock(&tty->termios_mutex);
  }
  
@@@ -523,9 -523,9 +523,9 @@@ static int tty_ldisc_halt(struct tty_st
   */
  static void tty_ldisc_flush_works(struct tty_struct *tty)
  {
 -      flush_work_sync(&tty->hangup_work);
 -      flush_work_sync(&tty->SAK_work);
 -      flush_work_sync(&tty->buf.work);
 +      flush_work(&tty->hangup_work);
 +      flush_work(&tty->SAK_work);
 +      flush_work(&tty->buf.work);
  }
  
  /**
@@@ -568,7 -568,7 +568,7 @@@ int tty_set_ldisc(struct tty_struct *tt
        if (IS_ERR(new_ldisc))
                return PTR_ERR(new_ldisc);
  
-       tty_lock();
+       tty_lock(tty);
        /*
         *      We need to look at the tty locking here for pty/tty pairs
         *      when both sides try to change in parallel.
         */
  
        if (tty->ldisc->ops->num == ldisc) {
-               tty_unlock();
+               tty_unlock(tty);
                tty_ldisc_put(new_ldisc);
                return 0;
        }
  
-       tty_unlock();
+       tty_unlock(tty);
        /*
         *      Problem: What do we do if this blocks ?
         *      We could deadlock here
  
        tty_wait_until_sent(tty, 0);
  
-       tty_lock();
+       tty_lock(tty);
        mutex_lock(&tty->ldisc_mutex);
  
        /*
  
        while (test_bit(TTY_LDISC_CHANGING, &tty->flags)) {
                mutex_unlock(&tty->ldisc_mutex);
-               tty_unlock();
+               tty_unlock(tty);
                wait_event(tty_ldisc_wait,
                        test_bit(TTY_LDISC_CHANGING, &tty->flags) == 0);
-               tty_lock();
+               tty_lock(tty);
                mutex_lock(&tty->ldisc_mutex);
        }
  
  
        o_ldisc = tty->ldisc;
  
-       tty_unlock();
+       tty_unlock(tty);
        /*
         *      Make sure we don't change while someone holds a
         *      reference to the line discipline. The TTY_LDISC bit
  
        retval = tty_ldisc_wait_idle(tty, 5 * HZ);
  
-       tty_lock();
+       tty_lock(tty);
        mutex_lock(&tty->ldisc_mutex);
  
        /* handle wait idle failure locked */
                clear_bit(TTY_LDISC_CHANGING, &tty->flags);
                mutex_unlock(&tty->ldisc_mutex);
                tty_ldisc_put(new_ldisc);
-               tty_unlock();
+               tty_unlock(tty);
                return -EIO;
        }
  
@@@ -708,7 -708,7 +708,7 @@@ enable
        if (o_work)
                schedule_work(&o_tty->buf.work);
        mutex_unlock(&tty->ldisc_mutex);
-       tty_unlock();
+       tty_unlock(tty);
        return retval;
  }
  
  static void tty_reset_termios(struct tty_struct *tty)
  {
        mutex_lock(&tty->termios_mutex);
-       *tty->termios = tty->driver->init_termios;
-       tty->termios->c_ispeed = tty_termios_input_baud_rate(tty->termios);
-       tty->termios->c_ospeed = tty_termios_baud_rate(tty->termios);
+       tty->termios = tty->driver->init_termios;
+       tty->termios.c_ispeed = tty_termios_input_baud_rate(&tty->termios);
+       tty->termios.c_ospeed = tty_termios_baud_rate(&tty->termios);
        mutex_unlock(&tty->termios_mutex);
  }
  
@@@ -816,11 -816,11 +816,11 @@@ void tty_ldisc_hangup(struct tty_struc
         * need to wait for another function taking the BTM
         */
        clear_bit(TTY_LDISC, &tty->flags);
-       tty_unlock();
+       tty_unlock(tty);
        cancel_work_sync(&tty->buf.work);
        mutex_unlock(&tty->ldisc_mutex);
  retry:
-       tty_lock();
+       tty_lock(tty);
        mutex_lock(&tty->ldisc_mutex);
  
        /* At this point we have a closed ldisc and we want to
                if (atomic_read(&tty->ldisc->users) != 1) {
                        char cur_n[TASK_COMM_LEN], tty_n[64];
                        long timeout = 3 * HZ;
-                       tty_unlock();
+                       tty_unlock(tty);
  
                        while (tty_ldisc_wait_idle(tty, timeout) == -EBUSY) {
                                timeout = MAX_SCHEDULE_TIMEOUT;
  
                if (reset == 0) {
  
-                       if (!tty_ldisc_reinit(tty, tty->termios->c_line))
+                       if (!tty_ldisc_reinit(tty, tty->termios.c_line))
                                err = tty_ldisc_open(tty, tty->ldisc);
                        else
                                err = 1;
@@@ -894,6 -894,23 +894,23 @@@ int tty_ldisc_setup(struct tty_struct *
        tty_ldisc_enable(tty);
        return 0;
  }
+ static void tty_ldisc_kill(struct tty_struct *tty)
+ {
+       mutex_lock(&tty->ldisc_mutex);
+       /*
+        * Now kill off the ldisc
+        */
+       tty_ldisc_close(tty, tty->ldisc);
+       tty_ldisc_put(tty->ldisc);
+       /* Force an oops if we mess this up */
+       tty->ldisc = NULL;
+       /* Ensure the next open requests the N_TTY ldisc */
+       tty_set_termios_ldisc(tty, N_TTY);
+       mutex_unlock(&tty->ldisc_mutex);
+ }
  /**
   *    tty_ldisc_release               -       release line discipline
   *    @tty: tty being shut down
@@@ -912,28 -929,21 +929,21 @@@ void tty_ldisc_release(struct tty_struc
         * race with the set_ldisc code path.
         */
  
-       tty_unlock();
+       tty_lock_pair(tty, o_tty);
        tty_ldisc_halt(tty);
        tty_ldisc_flush_works(tty);
-       tty_lock();
-       mutex_lock(&tty->ldisc_mutex);
-       /*
-        * Now kill off the ldisc
-        */
-       tty_ldisc_close(tty, tty->ldisc);
-       tty_ldisc_put(tty->ldisc);
-       /* Force an oops if we mess this up */
-       tty->ldisc = NULL;
-       /* Ensure the next open requests the N_TTY ldisc */
-       tty_set_termios_ldisc(tty, N_TTY);
-       mutex_unlock(&tty->ldisc_mutex);
+       if (o_tty) {
+               tty_ldisc_halt(o_tty);
+               tty_ldisc_flush_works(o_tty);
+       }
  
        /* This will need doing differently if we need to lock */
+       tty_ldisc_kill(tty);
        if (o_tty)
-               tty_ldisc_release(o_tty, NULL);
+               tty_ldisc_kill(o_tty);
  
+       tty_unlock_pair(tty, o_tty);
        /* And the memory resources remaining (buffers, termios) will be
           disposed of when the kref hits zero */
  }
index da6d479ff9a61e5f57950be3b78e052a029eaa32,2b5534c2ab8446bbb69b92ffe36c0c80b32ee77c..f1739526820fdfceb3cd0749fa2047cff220605b
@@@ -132,15 -132,11 +132,15 @@@ static unsigned n_ports
  
  
  #ifdef VERBOSE_DEBUG
 +#ifndef pr_vdebug
  #define pr_vdebug(fmt, arg...) \
        pr_debug(fmt, ##arg)
 +#endif /* pr_vdebug */
  #else
 +#ifndef pr_vdebig
  #define pr_vdebug(fmt, arg...) \
        ({ if (0) pr_debug(fmt, ##arg); })
 +#endif /* pr_vdebug */
  #endif
  
  /*-------------------------------------------------------------------------*/
@@@ -1133,7 -1129,8 +1133,8 @@@ int gserial_setup(struct usb_gadget *g
        for (i = 0; i < count; i++) {
                struct device   *tty_dev;
  
-               tty_dev = tty_register_device(gs_tty_driver, i, &g->dev);
+               tty_dev = tty_port_register_device(&ports[i].port->port,
+                               gs_tty_driver, i, &g->dev);
                if (IS_ERR(tty_dev))
                        pr_warning("%s: no classdev for port %d, err %ld\n",
                                __func__, i, PTR_ERR(tty_dev));
index f906b3aec2179ceb708c9cce772cd85a4e1a1724,24e3e19849a2af68153006b860338eeaf34ca95a..0c8d1c2262733e22b85474c91fb01a0d9e1d5b4d
@@@ -704,7 -704,6 +704,7 @@@ static struct usb_device_id id_table_co
        { USB_DEVICE(FTDI_VID, FTDI_PCDJ_DAC2_PID) },
        { USB_DEVICE(FTDI_VID, FTDI_RRCIRKITS_LOCOBUFFER_PID) },
        { USB_DEVICE(FTDI_VID, FTDI_ASK_RDR400_PID) },
 +      { USB_DEVICE(FTDI_VID, FTDI_NZR_SEM_USB_PID) },
        { USB_DEVICE(ICOM_VID, ICOM_ID_1_PID) },
        { USB_DEVICE(ICOM_VID, ICOM_OPC_U_UC_PID) },
        { USB_DEVICE(ICOM_VID, ICOM_ID_RP2C1_PID) },
                .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
        { USB_DEVICE(ADI_VID, ADI_GNICEPLUS_PID),
                .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
 -      { USB_DEVICE(MICROCHIP_VID, MICROCHIP_USB_BOARD_PID) },
 +      { USB_DEVICE_AND_INTERFACE_INFO(MICROCHIP_VID, MICROCHIP_USB_BOARD_PID,
 +                                      USB_CLASS_VENDOR_SPEC,
 +                                      USB_SUBCLASS_VENDOR_SPEC, 0x00) },
        { USB_DEVICE(JETI_VID, JETI_SPC1201_PID) },
        { USB_DEVICE(MARVELL_VID, MARVELL_SHEEVAPLUG_PID),
                .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
        { USB_DEVICE(LARSENBRUSGAARD_VID, LB_ALTITRACK_PID) },
        { USB_DEVICE(GN_OTOMETRICS_VID, AURICAL_USB_PID) },
 +      { USB_DEVICE(FTDI_VID, PI_C865_PID) },
 +      { USB_DEVICE(FTDI_VID, PI_C857_PID) },
 +      { USB_DEVICE(PI_VID, PI_C866_PID) },
 +      { USB_DEVICE(PI_VID, PI_C663_PID) },
 +      { USB_DEVICE(PI_VID, PI_C725_PID) },
 +      { USB_DEVICE(PI_VID, PI_E517_PID) },
 +      { USB_DEVICE(PI_VID, PI_C863_PID) },
        { USB_DEVICE(PI_VID, PI_E861_PID) },
 +      { USB_DEVICE(PI_VID, PI_C867_PID) },
 +      { USB_DEVICE(PI_VID, PI_E609_PID) },
 +      { USB_DEVICE(PI_VID, PI_E709_PID) },
 +      { USB_DEVICE(PI_VID, PI_100F_PID) },
 +      { USB_DEVICE(PI_VID, PI_1011_PID) },
 +      { USB_DEVICE(PI_VID, PI_1012_PID) },
 +      { USB_DEVICE(PI_VID, PI_1013_PID) },
 +      { USB_DEVICE(PI_VID, PI_1014_PID) },
 +      { USB_DEVICE(PI_VID, PI_1015_PID) },
 +      { USB_DEVICE(PI_VID, PI_1016_PID) },
        { USB_DEVICE(KONDO_VID, KONDO_USB_SERIAL_PID) },
        { USB_DEVICE(BAYER_VID, BAYER_CONTOUR_CABLE_PID) },
        { USB_DEVICE(FTDI_VID, MARVELL_OPENRD_PID),
@@@ -2102,7 -2082,7 +2102,7 @@@ static void ftdi_set_termios(struct tty
  {
        struct usb_device *dev = port->serial->dev;
        struct ftdi_private *priv = usb_get_serial_port_data(port);
-       struct ktermios *termios = tty->termios;
+       struct ktermios *termios = &tty->termios;
        unsigned int cflag = termios->c_cflag;
        __u16 urb_value; /* will hold the new flags */
  
diff --combined firmware/Makefile
index 76628e32fed6c64d10febbaa5c01686c5df30985,fdc9ff045ef8c3073519115b0e383bd65e97c333..eeb14030d8a24e67f113d65f1da1578d04b3de89
@@@ -40,9 -40,9 +40,8 @@@ fw-shipped-$(CONFIG_BNX2) += bnx2/bnx2-
                             bnx2/bnx2-mips-06-6.2.1.fw \
                             bnx2/bnx2-rv2p-06-6.0.15.fw
  fw-shipped-$(CONFIG_CASSINI) += sun/cassini.bin
- fw-shipped-$(CONFIG_COMPUTONE) += intelliport2.bin
  fw-shipped-$(CONFIG_CHELSIO_T3) += cxgb3/t3b_psram-1.1.0.bin \
                                   cxgb3/t3c_psram-1.1.0.bin \
 -                                 cxgb3/t3fw-7.10.0.bin \
                                   cxgb3/ael2005_opt_edc.bin \
                                   cxgb3/ael2005_twx_edc.bin \
                                   cxgb3/ael2020_twx_edc.bin
diff --combined include/linux/Kbuild
index 90da0af283521e67111715815fb7b4c75c921168,c57e064666e4c5b6ead64191063b0ab36dc922a9..7f1c0f00db9bc337cd32b5083c4ff8ef1343c3ca
@@@ -84,7 -84,6 +84,6 @@@ header-y += capability.
  header-y += capi.h
  header-y += cciss_defs.h
  header-y += cciss_ioctl.h
- header-y += cdk.h
  header-y += cdrom.h
  header-y += cgroupstats.h
  header-y += chio.h
@@@ -93,7 -92,6 +92,6 @@@ header-y += cn_proc.
  header-y += coda.h
  header-y += coda_psdev.h
  header-y += coff.h
- header-y += comstats.h
  header-y += connector.h
  header-y += const.h
  header-y += cramfs_fs.h
@@@ -140,7 -138,6 +138,6 @@@ header-y += fuse.
  header-y += futex.h
  header-y += gameport.h
  header-y += gen_stats.h
- header-y += generic_serial.h
  header-y += genetlink.h
  header-y += gfs2_ondisk.h
  header-y += gigaset_dev.h
@@@ -195,7 -192,6 +192,7 @@@ header-y += in_route.
  header-y += sock_diag.h
  header-y += inet_diag.h
  header-y += unix_diag.h
 +header-y += packet_diag.h
  header-y += inotify.h
  header-y += input.h
  header-y += ioctl.h
@@@ -363,7 -359,6 +360,7 @@@ header-y += sysctl.
  header-y += sysinfo.h
  header-y += taskstats.h
  header-y += tcp.h
 +header-y += tcp_metrics.h
  header-y += telephony.h
  header-y += termios.h
  header-y += time.h
@@@ -374,6 -369,7 +371,7 @@@ header-y += tipc.
  header-y += tipc_config.h
  header-y += toshiba.h
  header-y += tty.h
+ header-y += tty_flags.h
  header-y += types.h
  header-y += udf_fs_i.h
  header-y += udp.h