Merge 6.5-rc4 into tty-next
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 31 Jul 2023 07:39:56 +0000 (09:39 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 31 Jul 2023 07:39:56 +0000 (09:39 +0200)
We need the serial/tty fixes in here as well for testing and future
development.

Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
85 files changed:
Documentation/devicetree/bindings/serial/amlogic,meson-uart.yaml
Documentation/devicetree/bindings/serial/fsl-lpuart.yaml
arch/alpha/kernel/setup.c
arch/arm64/boot/dts/amlogic/meson-a1.dtsi
arch/loongarch/kernel/sysrq.c
arch/mips/kernel/sysrq.c
arch/powerpc/xmon/xmon.c
arch/sparc/kernel/process_64.c
drivers/gpu/drm/drm_fb_helper.c
drivers/net/can/sja1000/ems_pci.c
drivers/parport/parport_pc.c
drivers/tty/hvc/hvc_opal.c
drivers/tty/n_tty.c
drivers/tty/serial/21285.c
drivers/tty/serial/8250/8250_early.c
drivers/tty/serial/8250/8250_ingenic.c
drivers/tty/serial/8250/8250_men_mcb.c
drivers/tty/serial/8250/8250_omap.c
drivers/tty/serial/8250/8250_pci.c
drivers/tty/serial/8250/8250_port.c
drivers/tty/serial/8250/8250_pxa.c
drivers/tty/serial/altera_jtaguart.c
drivers/tty/serial/altera_uart.c
drivers/tty/serial/amba-pl010.c
drivers/tty/serial/amba-pl011.c
drivers/tty/serial/apbuart.c
drivers/tty/serial/ar933x_uart.c
drivers/tty/serial/arc_uart.c
drivers/tty/serial/atmel_serial.c
drivers/tty/serial/bcm63xx_uart.c
drivers/tty/serial/clps711x.c
drivers/tty/serial/digicolor-usart.c
drivers/tty/serial/dz.c
drivers/tty/serial/fsl_linflexuart.c
drivers/tty/serial/fsl_lpuart.c
drivers/tty/serial/imx.c
drivers/tty/serial/ip22zilog.c
drivers/tty/serial/lantiq.c
drivers/tty/serial/liteuart.c
drivers/tty/serial/ma35d1_serial.c
drivers/tty/serial/max3100.c
drivers/tty/serial/max310x.c
drivers/tty/serial/mcf.c
drivers/tty/serial/meson_uart.c
drivers/tty/serial/milbeaut_usio.c
drivers/tty/serial/mpc52xx_uart.c
drivers/tty/serial/mps2-uart.c
drivers/tty/serial/mvebu-uart.c
drivers/tty/serial/mxs-auart.c
drivers/tty/serial/omap-serial.c
drivers/tty/serial/pic32_uart.c
drivers/tty/serial/pxa.c
drivers/tty/serial/qcom_geni_serial.c
drivers/tty/serial/rp2.c
drivers/tty/serial/sa1100.c
drivers/tty/serial/samsung_tty.c
drivers/tty/serial/sb1250-duart.c
drivers/tty/serial/sc16is7xx.c
drivers/tty/serial/sccnxp.c
drivers/tty/serial/serial-tegra.c
drivers/tty/serial/serial_core.c
drivers/tty/serial/serial_txx9.c
drivers/tty/serial/sh-sci.c
drivers/tty/serial/sifive.c
drivers/tty/serial/sprd_serial.c
drivers/tty/serial/st-asc.c
drivers/tty/serial/stm32-usart.c
drivers/tty/serial/sunhv.c
drivers/tty/serial/sunplus-uart.c
drivers/tty/serial/sunsab.c
drivers/tty/serial/sunsu.c
drivers/tty/serial/sunzilog.c
drivers/tty/serial/tegra-tcu.c
drivers/tty/serial/uartlite.c
drivers/tty/serial/ucc_uart.c
drivers/tty/serial/vt8500_serial.c
drivers/tty/serial/zs.c
drivers/tty/sysrq.c
drivers/tty/tty_io.c
include/linux/pci_ids.h
include/linux/serial_core.h
include/linux/sysrq.h
kernel/debug/debug_core.c
kernel/power/poweroff.c
kernel/rcu/tree_stall.h

index 01ec45b..f1ae8c4 100644 (file)
@@ -33,6 +33,7 @@ properties:
               - amlogic,meson8b-uart
               - amlogic,meson-gx-uart
               - amlogic,meson-s4-uart
+              - amlogic,meson-a1-uart
           - const: amlogic,meson-ao-uart
       - description: Always-on power domain UART controller on G12A SoCs
         items:
@@ -46,6 +47,7 @@ properties:
           - amlogic,meson8b-uart
           - amlogic,meson-gx-uart
           - amlogic,meson-s4-uart
+          - amlogic,meson-a1-uart
       - description: Everything-Else power domain UART controller on G12A SoCs
         items:
           - const: amlogic,meson-g12a-uart
index 9306240..3a5b59f 100644 (file)
@@ -25,11 +25,15 @@ properties:
           - fsl,imxrt1050-lpuart
       - items:
           - enum:
-              - fsl,imx93-lpuart
               - fsl,imx8ulp-lpuart
           - const: fsl,imx7ulp-lpuart
       - items:
           - enum:
+              - fsl,imx93-lpuart
+          - const: fsl,imx8ulp-lpuart
+          - const: fsl,imx7ulp-lpuart
+      - items:
+          - enum:
               - fsl,imx8qm-lpuart
               - fsl,imx8dxl-lpuart
           - const: fsl,imx8qxp-lpuart
index b650ff1..91fb371 100644 (file)
@@ -422,7 +422,7 @@ register_cpus(void)
 arch_initcall(register_cpus);
 
 #ifdef CONFIG_MAGIC_SYSRQ
-static void sysrq_reboot_handler(int unused)
+static void sysrq_reboot_handler(u8 unused)
 {
        machine_halt();
 }
index c8f3445..96225c4 100644 (file)
                        };
 
                        uart_AO: serial@1c00 {
-                               compatible = "amlogic,meson-gx-uart",
+                               compatible = "amlogic,meson-a1-uart",
                                             "amlogic,meson-ao-uart";
                                reg = <0x0 0x1c00 0x0 0x18>;
                                interrupts = <GIC_SPI 25 IRQ_TYPE_EDGE_RISING>;
                        };
 
                        uart_AO_B: serial@2000 {
-                               compatible = "amlogic,meson-gx-uart",
+                               compatible = "amlogic,meson-a1-uart",
                                             "amlogic,meson-ao-uart";
                                reg = <0x0 0x2000 0x0 0x18>;
                                interrupts = <GIC_SPI 26 IRQ_TYPE_EDGE_RISING>;
index 366baef..e663c10 100644 (file)
@@ -43,7 +43,7 @@ static void sysrq_tlbdump_othercpus(struct work_struct *dummy)
 static DECLARE_WORK(sysrq_tlbdump, sysrq_tlbdump_othercpus);
 #endif
 
-static void sysrq_handle_tlbdump(int key)
+static void sysrq_handle_tlbdump(u8 key)
 {
        sysrq_tlbdump_single(NULL);
 #ifdef CONFIG_SMP
index 9c1a201..2e98049 100644 (file)
@@ -44,7 +44,7 @@ static void sysrq_tlbdump_othercpus(struct work_struct *dummy)
 static DECLARE_WORK(sysrq_tlbdump, sysrq_tlbdump_othercpus);
 #endif
 
-static void sysrq_handle_tlbdump(int key)
+static void sysrq_handle_tlbdump(u8 key)
 {
        sysrq_tlbdump_single(NULL);
 #ifdef CONFIG_SMP
index fae747c..196eeba 100644 (file)
@@ -3991,7 +3991,7 @@ static void xmon_init(int enable)
 }
 
 #ifdef CONFIG_MAGIC_SYSRQ
-static void sysrq_handle_xmon(int key)
+static void sysrq_handle_xmon(u8 key)
 {
        if (xmon_is_locked_down()) {
                clear_all_bpt();
index b51d8fb..4dee88a 100644 (file)
@@ -295,7 +295,7 @@ void arch_trigger_cpumask_backtrace(const cpumask_t *mask, bool exclude_self)
 
 #ifdef CONFIG_MAGIC_SYSRQ
 
-static void sysrq_handle_globreg(int key)
+static void sysrq_handle_globreg(u8 key)
 {
        trigger_all_cpu_backtrace();
 }
@@ -370,7 +370,7 @@ static void pmu_snapshot_all_cpus(void)
        spin_unlock_irqrestore(&global_cpu_snapshot_lock, flags);
 }
 
-static void sysrq_handle_globpmu(int key)
+static void sysrq_handle_globpmu(u8 key)
 {
        pmu_snapshot_all_cpus();
 }
index 61a5d45..d612133 100644 (file)
@@ -301,7 +301,7 @@ static void drm_fb_helper_restore_work_fn(struct work_struct *ignored)
 
 static DECLARE_WORK(drm_fb_helper_restore_work, drm_fb_helper_restore_work_fn);
 
-static void drm_fb_helper_sysrq(int dummy1)
+static void drm_fb_helper_sysrq(u8 dummy1)
 {
        schedule_work(&drm_fb_helper_restore_work);
 }
index c56e272..1aaedaf 100644 (file)
@@ -108,11 +108,6 @@ struct ems_pci_card {
 
 #define EMS_PCI_BASE_SIZE  4096 /* size of controller area */
 
-#ifndef PCI_VENDOR_ID_ASIX
-#define PCI_VENDOR_ID_ASIX 0x125b
-#define PCI_DEVICE_ID_ASIX_9110 0x9110
-#define PCI_SUBVENDOR_ID_ASIX 0xa000
-#endif
 #define PCI_SUBDEVICE_ID_EMS 0x4010
 
 static const struct pci_device_id ems_pci_tbl[] = {
@@ -123,7 +118,7 @@ static const struct pci_device_id ems_pci_tbl[] = {
        /* CPC-104P v2 */
        {PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9030, PCI_VENDOR_ID_PLX, 0x4002},
        /* CPC-PCIe v3 */
-       {PCI_VENDOR_ID_ASIX, PCI_DEVICE_ID_ASIX_9110, PCI_SUBVENDOR_ID_ASIX, PCI_SUBDEVICE_ID_EMS},
+       {PCI_VENDOR_ID_ASIX, PCI_DEVICE_ID_ASIX_AX99100_LB, 0xa000, PCI_SUBDEVICE_ID_EMS},
        {0,}
 };
 MODULE_DEVICE_TABLE(pci, ems_pci_tbl);
index 3bacbaf..1f236aa 100644 (file)
@@ -2655,6 +2655,7 @@ enum parport_pc_pci_cards {
        netmos_9815,
        netmos_9901,
        netmos_9865,
+       asix_ax99100,
        quatech_sppxp100,
        wch_ch382l,
 };
@@ -2733,6 +2734,7 @@ static struct parport_pc_pci {
        /* netmos_9815 */               { 2, { { 0, 1 }, { 2, 3 }, } },
        /* netmos_9901 */               { 1, { { 0, -1 }, } },
        /* netmos_9865 */               { 1, { { 0, -1 }, } },
+       /* asix_ax99100 */              { 1, { { 0, 1 }, } },
        /* quatech_sppxp100 */          { 1, { { 0, 1 }, } },
        /* wch_ch382l */                { 1, { { 2, -1 }, } },
 };
@@ -2823,6 +2825,9 @@ static const struct pci_device_id parport_pc_pci_tbl[] = {
          0xA000, 0x1000, 0, 0, netmos_9865 },
        { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9865,
          0xA000, 0x2000, 0, 0, netmos_9865 },
+       /* ASIX AX99100 PCIe to Multi I/O Controller */
+       { PCI_VENDOR_ID_ASIX, PCI_DEVICE_ID_ASIX_AX99100,
+         0xA000, 0x2000, 0, 0, asix_ax99100 },
        /* Quatech SPPXP-100 Parallel port PCI ExpressCard */
        { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_SPPXP_100,
          PCI_ANY_ID, PCI_ANY_ID, 0, 0, quatech_sppxp100 },
index 794c7b1..992e199 100644 (file)
@@ -14,7 +14,7 @@
 #include <linux/console.h>
 #include <linux/of.h>
 #include <linux/of_irq.h>
-#include <linux/of_platform.h>
+#include <linux/platform_device.h>
 #include <linux/export.h>
 #include <linux/interrupt.h>
 
index 552e8a7..0043cc8 100644 (file)
@@ -158,16 +158,14 @@ static inline unsigned char *echo_buf_addr(struct n_tty_data *ldata, size_t i)
 }
 
 /* If we are not echoing the data, perhaps this is a secret so erase it */
-static void zero_buffer(struct tty_struct *tty, u8 *buffer, int size)
+static void zero_buffer(const struct tty_struct *tty, u8 *buffer, size_t size)
 {
-       bool icanon = !!L_ICANON(tty);
-       bool no_echo = !L_ECHO(tty);
-
-       if (icanon && no_echo)
-               memset(buffer, 0x00, size);
+       if (L_ICANON(tty) && !L_ECHO(tty))
+               memset(buffer, 0, size);
 }
 
-static void tty_copy(struct tty_struct *tty, void *to, size_t tail, size_t n)
+static void tty_copy(const struct tty_struct *tty, void *to, size_t tail,
+                    size_t n)
 {
        struct n_tty_data *ldata = tty->disc_data;
        size_t size = N_TTY_BUF_SIZE - tail;
@@ -198,7 +196,7 @@ static void tty_copy(struct tty_struct *tty, void *to, size_t tail, size_t n)
  *  * n_tty_read()/consumer path:
  *     holds non-exclusive %termios_rwsem
  */
-static void n_tty_kick_worker(struct tty_struct *tty)
+static void n_tty_kick_worker(const struct tty_struct *tty)
 {
        struct n_tty_data *ldata = tty->disc_data;
 
@@ -218,9 +216,9 @@ static void n_tty_kick_worker(struct tty_struct *tty)
        }
 }
 
-static ssize_t chars_in_buffer(struct tty_struct *tty)
+static ssize_t chars_in_buffer(const struct tty_struct *tty)
 {
-       struct n_tty_data *ldata = tty->disc_data;
+       const struct n_tty_data *ldata = tty->disc_data;
        ssize_t n = 0;
 
        if (!ldata->icanon)
@@ -396,7 +394,7 @@ static inline int is_utf8_continuation(unsigned char c)
  * Returns: true if the utf8 character @c is a multibyte continuation character
  * and the terminal is in unicode mode.
  */
-static inline int is_continuation(unsigned char c, struct tty_struct *tty)
+static inline int is_continuation(unsigned char c, const struct tty_struct *tty)
 {
        return I_IUTF8(tty) && is_utf8_continuation(c);
 }
@@ -916,7 +914,7 @@ static void echo_char_raw(unsigned char c, struct n_tty_data *ldata)
  * This variant tags control characters to be echoed as "^X" (where X is the
  * letter representing the control char).
  */
-static void echo_char(unsigned char c, struct tty_struct *tty)
+static void echo_char(unsigned char c, const struct tty_struct *tty)
 {
        struct n_tty_data *ldata = tty->disc_data;
 
@@ -954,7 +952,7 @@ static inline void finish_erasing(struct n_tty_data *ldata)
  * Locking: n_tty_receive_buf()/producer path:
  *     caller holds non-exclusive %termios_rwsem
  */
-static void eraser(unsigned char c, struct tty_struct *tty)
+static void eraser(unsigned char c, const struct tty_struct *tty)
 {
        struct n_tty_data *ldata = tty->disc_data;
        enum { ERASE, WERASE, KILL } kill_type;
@@ -1170,7 +1168,7 @@ static void n_tty_receive_break(struct tty_struct *tty)
  * Called from the receive_buf path so single threaded. Does not need locking
  * as num_overrun and overrun_time are function private.
  */
-static void n_tty_receive_overrun(struct tty_struct *tty)
+static void n_tty_receive_overrun(const struct tty_struct *tty)
 {
        struct n_tty_data *ldata = tty->disc_data;
 
@@ -1194,7 +1192,8 @@ static void n_tty_receive_overrun(struct tty_struct *tty)
  * Locking: n_tty_receive_buf()/producer path:
  *     caller holds non-exclusive %termios_rwsem
  */
-static void n_tty_receive_parity_error(struct tty_struct *tty, unsigned char c)
+static void n_tty_receive_parity_error(const struct tty_struct *tty,
+                                      unsigned char c)
 {
        struct n_tty_data *ldata = tty->disc_data;
 
@@ -1501,8 +1500,8 @@ static void n_tty_lookahead_flow_ctrl(struct tty_struct *tty, const unsigned cha
 }
 
 static void
-n_tty_receive_buf_real_raw(struct tty_struct *tty, const unsigned char *cp,
-                          const char *fp, int count)
+n_tty_receive_buf_real_raw(const struct tty_struct *tty,
+                          const unsigned char *cp, int count)
 {
        struct n_tty_data *ldata = tty->disc_data;
        size_t n, head;
@@ -1597,7 +1596,7 @@ static void __receive_buf(struct tty_struct *tty, const unsigned char *cp,
        size_t la_count = min_t(size_t, ldata->lookahead_count, count);
 
        if (ldata->real_raw)
-               n_tty_receive_buf_real_raw(tty, cp, fp, count);
+               n_tty_receive_buf_real_raw(tty, cp, count);
        else if (ldata->raw || (L_EXTPROC(tty) && !preops))
                n_tty_receive_buf_raw(tty, cp, fp, count);
        else if (tty->closing && !L_EXTPROC(tty)) {
@@ -1903,9 +1902,9 @@ static int n_tty_open(struct tty_struct *tty)
        return 0;
 }
 
-static inline int input_available_p(struct tty_struct *tty, int poll)
+static inline int input_available_p(const struct tty_struct *tty, int poll)
 {
-       struct n_tty_data *ldata = tty->disc_data;
+       const struct n_tty_data *ldata = tty->disc_data;
        int amt = poll && !TIME_CHAR(tty) && MIN_CHAR(tty) ? MIN_CHAR(tty) : 1;
 
        if (ldata->icanon && !L_EXTPROC(tty))
@@ -1932,7 +1931,7 @@ static inline int input_available_p(struct tty_struct *tty, int poll)
  *             caller holds non-exclusive %termios_rwsem;
  *             read_tail published
  */
-static bool copy_from_read_buf(struct tty_struct *tty,
+static bool copy_from_read_buf(const struct tty_struct *tty,
                                      unsigned char **kbp,
                                      size_t *nr)
 
@@ -1987,7 +1986,7 @@ static bool copy_from_read_buf(struct tty_struct *tty,
  *     caller holds non-exclusive %termios_rwsem;
  *     read_tail published
  */
-static bool canon_copy_from_read_buf(struct tty_struct *tty,
+static bool canon_copy_from_read_buf(const struct tty_struct *tty,
                                     unsigned char **kbp,
                                     size_t *nr)
 {
@@ -2056,9 +2055,8 @@ static bool canon_copy_from_read_buf(struct tty_struct *tty,
  * EOF (special EOL character that's a __DISABLED_CHAR)
  * in the stream, silently eat the EOF.
  */
-static void canon_skip_eof(struct tty_struct *tty)
+static void canon_skip_eof(struct n_tty_data *ldata)
 {
-       struct n_tty_data *ldata = tty->disc_data;
        size_t tail, canon_head;
 
        canon_head = smp_load_acquire(&ldata->canon_head);
@@ -2156,7 +2154,7 @@ static ssize_t n_tty_read(struct tty_struct *tty, struct file *file,
                         * releasing the lock and returning done.
                         */
                        if (!nr)
-                               canon_skip_eof(tty);
+                               canon_skip_eof(ldata);
                        else if (canon_copy_from_read_buf(tty, &kb, &nr))
                                return kb - kbuf;
                } else {
index 185462f..d756fcc 100644 (file)
@@ -117,7 +117,8 @@ static void serial21285_stop_rx(struct uart_port *port)
 static irqreturn_t serial21285_rx_chars(int irq, void *dev_id)
 {
        struct uart_port *port = dev_id;
-       unsigned int status, ch, flag, rxs, max_count = 256;
+       unsigned int status, rxs, max_count = 256;
+       u8 ch, flag;
 
        status = *CSR_UARTFLG;
        while (!(status & 0x10) && max_count--) {
index 4299a8b..9837a27 100644 (file)
@@ -27,7 +27,6 @@
 #include <linux/init.h>
 #include <linux/console.h>
 #include <linux/of.h>
-#include <linux/of_device.h>
 #include <linux/serial_reg.h>
 #include <linux/serial.h>
 #include <linux/serial_8250.h>
index 617b8ce..4c4c4da 100644 (file)
@@ -13,7 +13,6 @@
 #include <linux/module.h>
 #include <linux/of.h>
 #include <linux/of_fdt.h>
-#include <linux/of_device.h>
 #include <linux/platform_device.h>
 #include <linux/serial_8250.h>
 #include <linux/serial_core.h>
index f46ca13..5f30119 100644 (file)
 #define MEN_UART_ID_Z057 0x39
 #define MEN_UART_ID_Z125 0x7d
 
-#define MEN_UART_MEM_SIZE 0x10
+/*
+ * IP Cores Z025 and Z057 can have up to 4 UART
+ * The UARTs available are stored in a global
+ * register saved in physical address + 0x40
+ * Is saved as follows:
+ *
+ * 7                                                              0
+ * +------+-------+-------+-------+-------+-------+-------+-------+
+ * |UART4 | UART3 | UART2 | UART1 | U4irq | U3irq | U2irq | U1irq |
+ * +------+-------+-------+-------+-------+-------+-------+-------+
+ */
+#define MEN_UART1_MASK 0x01
+#define MEN_UART2_MASK 0x02
+#define MEN_UART3_MASK 0x04
+#define MEN_UART4_MASK 0x08
+
+#define MEN_Z125_UARTS_AVAILABLE       0x01
+
+#define MEN_Z025_MAX_UARTS             4
+#define MEN_UART_MEM_SIZE              0x10
+#define MEM_UART_REGISTER_SIZE         0x01
+#define MEN_Z025_REGISTER_OFFSET       0x40
+
+#define MEN_UART1_OFFSET       0
+#define MEN_UART2_OFFSET       (MEN_UART1_OFFSET + MEN_UART_MEM_SIZE)
+#define MEN_UART3_OFFSET       (MEN_UART2_OFFSET + MEN_UART_MEM_SIZE)
+#define MEN_UART4_OFFSET       (MEN_UART3_OFFSET + MEN_UART_MEM_SIZE)
+
+#define MEN_READ_REGISTER(addr)        readb((void *)addr)
+
+#define MAX_PORTS      4
 
 struct serial_8250_men_mcb_data {
-       struct uart_8250_port uart;
-       int line;
+       int num_ports;
+       unsigned int line[MAX_PORTS];
+       unsigned int offset[MAX_PORTS];
 };
 
 /*
@@ -37,10 +68,10 @@ static u32 men_lookup_uartclk(struct mcb_device *mdev)
                clkval = 1041666;
        else if (strncmp(mdev->bus->name, "F216", 4) == 0)
                clkval = 1843200;
-       else if (strncmp(mdev->bus->name, "G215", 4) == 0)
-               clkval = 1843200;
        else if (strncmp(mdev->bus->name, "F210", 4) == 0)
                clkval = 115200;
+       else if (strstr(mdev->bus->name, "215"))
+               clkval = 1843200;
        else
                dev_info(&mdev->dev,
                         "board not detected, using default uartclk\n");
@@ -50,16 +81,98 @@ static u32 men_lookup_uartclk(struct mcb_device *mdev)
        return clkval;
 }
 
-static int get_num_ports(struct mcb_device *mdev,
-                                 void __iomem *membase)
+static int read_uarts_available_from_register(struct resource *mem_res,
+                                             u8 *uarts_available)
+{
+       void __iomem *mem;
+       int reg_value;
+
+       if (!request_mem_region(mem_res->start + MEN_Z025_REGISTER_OFFSET,
+                               MEM_UART_REGISTER_SIZE,  KBUILD_MODNAME)) {
+               return -EBUSY;
+       }
+
+       mem = ioremap(mem_res->start + MEN_Z025_REGISTER_OFFSET,
+                     MEM_UART_REGISTER_SIZE);
+       if (!mem) {
+               release_mem_region(mem_res->start + MEN_Z025_REGISTER_OFFSET,
+                                  MEM_UART_REGISTER_SIZE);
+               return -ENOMEM;
+       }
+
+       reg_value = MEN_READ_REGISTER(mem);
+
+       iounmap(mem);
+
+       release_mem_region(mem_res->start + MEN_Z025_REGISTER_OFFSET,
+                          MEM_UART_REGISTER_SIZE);
+
+       *uarts_available = reg_value >> 4;
+
+       return 0;
+}
+
+static int read_serial_data(struct mcb_device *mdev,
+                           struct resource *mem_res,
+                           struct serial_8250_men_mcb_data *serial_data)
+{
+       u8 uarts_available;
+       int count = 0;
+       int mask;
+       int res;
+       int i;
+
+       res = read_uarts_available_from_register(mem_res, &uarts_available);
+       if (res < 0)
+               return res;
+
+       for (i = 0; i < MAX_PORTS; i++) {
+               mask = 0x1 << i;
+               switch (uarts_available & mask) {
+               case MEN_UART1_MASK:
+                       serial_data->offset[count] = MEN_UART1_OFFSET;
+                       count++;
+                       break;
+               case MEN_UART2_MASK:
+                       serial_data->offset[count] = MEN_UART2_OFFSET;
+                       count++;
+                       break;
+               case MEN_UART3_MASK:
+                       serial_data->offset[count] = MEN_UART3_OFFSET;
+                       count++;
+                       break;
+               case MEN_UART4_MASK:
+                       serial_data->offset[count] = MEN_UART4_OFFSET;
+                       count++;
+                       break;
+               default:
+                       return -EINVAL;
+               }
+       }
+
+       if (count <= 0 || count > MAX_PORTS) {
+               dev_err(&mdev->dev, "unexpected number of ports: %u\n",
+                       count);
+               return -ENODEV;
+       }
+
+       serial_data->num_ports = count;
+
+       return 0;
+}
+
+static int init_serial_data(struct mcb_device *mdev,
+                           struct resource *mem_res,
+                           struct serial_8250_men_mcb_data *serial_data)
 {
        switch (mdev->id) {
        case MEN_UART_ID_Z125:
-               return 1U;
+               serial_data->num_ports = 1;
+               serial_data->offset[0] = 0;
+               return 0;
        case MEN_UART_ID_Z025:
-               return readb(membase) >> 4;
        case MEN_UART_ID_Z057:
-               return 4U;
+               return read_serial_data(mdev, mem_res, serial_data);
        default:
                dev_err(&mdev->dev, "no supported device!\n");
                return -ENODEV;
@@ -69,62 +182,52 @@ static int get_num_ports(struct mcb_device *mdev,
 static int serial_8250_men_mcb_probe(struct mcb_device *mdev,
                                     const struct mcb_device_id *id)
 {
+       struct uart_8250_port uart;
        struct serial_8250_men_mcb_data *data;
        struct resource *mem;
-       int num_ports;
        int i;
-       void __iomem *membase;
+       int res;
 
        mem = mcb_get_resource(mdev, IORESOURCE_MEM);
        if (mem == NULL)
                return -ENXIO;
-       membase = devm_ioremap_resource(&mdev->dev, mem);
-       if (IS_ERR(membase))
-               return PTR_ERR_OR_ZERO(membase);
-
-       num_ports = get_num_ports(mdev, membase);
 
-       dev_dbg(&mdev->dev, "found a 16z%03u with %u ports\n",
-               mdev->id, num_ports);
-
-       if (num_ports <= 0 || num_ports > 4) {
-               dev_err(&mdev->dev, "unexpected number of ports: %u\n",
-                       num_ports);
-               return -ENODEV;
-       }
-
-       data = devm_kcalloc(&mdev->dev, num_ports,
+       data = devm_kzalloc(&mdev->dev,
                            sizeof(struct serial_8250_men_mcb_data),
                            GFP_KERNEL);
        if (!data)
                return -ENOMEM;
 
+       res = init_serial_data(mdev, mem, data);
+       if (res < 0)
+               return res;
+
+       dev_dbg(&mdev->dev, "found a 16z%03u with %u ports\n",
+               mdev->id, data->num_ports);
+
        mcb_set_drvdata(mdev, data);
 
-       for (i = 0; i < num_ports; i++) {
-               data[i].uart.port.dev = mdev->dma_dev;
-               spin_lock_init(&data[i].uart.port.lock);
-
-               data[i].uart.port.type = PORT_16550;
-               data[i].uart.port.flags = UPF_SKIP_TEST | UPF_SHARE_IRQ
-                                         | UPF_FIXED_TYPE;
-               data[i].uart.port.iotype = UPIO_MEM;
-               data[i].uart.port.uartclk = men_lookup_uartclk(mdev);
-               data[i].uart.port.regshift = 0;
-               data[i].uart.port.irq = mcb_get_irq(mdev);
-               data[i].uart.port.membase = membase;
-               data[i].uart.port.fifosize = 60;
-               data[i].uart.port.mapbase = (unsigned long) mem->start
-                                           + i * MEN_UART_MEM_SIZE;
-               data[i].uart.port.iobase = data[i].uart.port.mapbase;
+       for (i = 0; i < data->num_ports; i++) {
+               memset(&uart, 0, sizeof(struct uart_8250_port));
+               spin_lock_init(&uart.port.lock);
+
+               uart.port.flags = UPF_SKIP_TEST |
+                                 UPF_SHARE_IRQ |
+                                 UPF_BOOT_AUTOCONF |
+                                 UPF_IOREMAP;
+               uart.port.iotype = UPIO_MEM;
+               uart.port.uartclk = men_lookup_uartclk(mdev);
+               uart.port.irq = mcb_get_irq(mdev);
+               uart.port.mapbase = (unsigned long) mem->start
+                                           + data->offset[i];
 
                /* ok, register the port */
-               data[i].line = serial8250_register_8250_port(&data[i].uart);
-               if (data[i].line < 0) {
+               data->line[i] = serial8250_register_8250_port(&uart);
+               if (data->line[i] < 0) {
                        dev_err(&mdev->dev, "unable to register UART port\n");
-                       return data[i].line;
+                       return data->line[i];
                }
-               dev_info(&mdev->dev, "found MCB UART: ttyS%d\n", data[i].line);
+               dev_info(&mdev->dev, "found MCB UART: ttyS%d\n", data->line[i]);
        }
 
        return 0;
@@ -132,20 +235,14 @@ static int serial_8250_men_mcb_probe(struct mcb_device *mdev,
 
 static void serial_8250_men_mcb_remove(struct mcb_device *mdev)
 {
-       int num_ports, i;
+       int i;
        struct serial_8250_men_mcb_data *data = mcb_get_drvdata(mdev);
 
        if (!data)
                return;
 
-       num_ports = get_num_ports(mdev, data[0].uart.port.membase);
-       if (num_ports <= 0 || num_ports > 4) {
-               dev_err(&mdev->dev, "error retrieving number of ports!\n");
-               return;
-       }
-
-       for (i = 0; i < num_ports; i++)
-               serial8250_unregister_port(data[i].line);
+       for (i = 0; i < data->num_ports; i++)
+               serial8250_unregister_port(data->line[i]);
 }
 
 static const struct mcb_device_id serial_8250_men_mcb_ids[] = {
index d48a82f..26dd089 100644 (file)
@@ -18,7 +18,6 @@
 #include <linux/platform_device.h>
 #include <linux/slab.h>
 #include <linux/of.h>
-#include <linux/of_device.h>
 #include <linux/of_gpio.h>
 #include <linux/of_irq.h>
 #include <linux/delay.h>
index d2d547b..62a9bd3 100644 (file)
@@ -67,6 +67,8 @@ static const struct pci_device_id pci_use_msi[] = {
                         0xA000, 0x1000) },
        { PCI_DEVICE_SUB(PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9922,
                         0xA000, 0x1000) },
+       { PCI_DEVICE_SUB(PCI_VENDOR_ID_ASIX, PCI_DEVICE_ID_ASIX_AX99100,
+                        0xA000, 0x1000) },
        { PCI_DEVICE_SUB(PCI_VENDOR_ID_HP_3PAR, PCI_DEVICE_ID_HPE_PCI_SERIAL,
                         PCI_ANY_ID, PCI_ANY_ID) },
        { }
@@ -5557,6 +5559,14 @@ static const struct pci_device_id serial_pci_tbl[] = {
        {       PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9865,
                0xA000, 0x3004,
                0, 0, pbn_b0_bt_4_115200 },
+
+       /*
+        * ASIX AX99100 PCIe to Multi I/O Controller
+        */
+       {       PCI_VENDOR_ID_ASIX, PCI_DEVICE_ID_ASIX_AX99100,
+               0xA000, 0x1000,
+               0, 0, pbn_b0_1_115200 },
+
        /* Intel CE4100 */
        {       PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_CE4100_UART,
                PCI_ANY_ID,  PCI_ANY_ID, 0, 0,
index 16aeb14..0533e75 100644 (file)
@@ -1706,8 +1706,7 @@ static void serial8250_enable_ms(struct uart_port *port)
 void serial8250_read_char(struct uart_8250_port *up, u16 lsr)
 {
        struct uart_port *port = &up->port;
-       unsigned char ch;
-       char flag = TTY_NORMAL;
+       u8 ch, flag = TTY_NORMAL;
 
        if (likely(lsr & UART_LSR_DR))
                ch = serial_in(up, UART_RX);
index 28b341f..a5b3ea2 100644 (file)
@@ -183,6 +183,7 @@ static int __init early_serial_pxa_setup(struct earlycon_device *device,
        return early_serial8250_setup(device, NULL);
 }
 OF_EARLYCON_DECLARE(early_pxa, "mrvl,pxa-uart", early_serial_pxa_setup);
+OF_EARLYCON_DECLARE(mmp, "mrvl,mmp-uart", early_serial_pxa_setup);
 #endif
 
 MODULE_AUTHOR("Sergei Ianovich");
index 9f843d1..6203ca1 100644 (file)
@@ -110,8 +110,8 @@ static void altera_jtaguart_set_termios(struct uart_port *port,
 
 static void altera_jtaguart_rx_chars(struct uart_port *port)
 {
-       unsigned char ch;
        unsigned long status;
+       u8 ch;
 
        while ((status = readl(port->membase + ALTERA_JTAGUART_DATA_REG)) &
               ALTERA_JTAGUART_DATA_RVALID_MSK) {
index 9ce3d24..a9c4194 100644 (file)
@@ -201,8 +201,8 @@ static void altera_uart_set_termios(struct uart_port *port,
 
 static void altera_uart_rx_chars(struct uart_port *port)
 {
-       unsigned char ch, flag;
        unsigned short status;
+       u8 ch, flag;
 
        while ((status = altera_uart_readl(port, ALTERA_UART_STATUS_REG)) &
               ALTERA_UART_STATUS_RRDY_MSK) {
index a98fae2..b5a7404 100644 (file)
@@ -112,7 +112,8 @@ static void pl010_enable_ms(struct uart_port *port)
 
 static void pl010_rx_chars(struct uart_port *port)
 {
-       unsigned int status, ch, flag, rsr, max_count = 256;
+       unsigned int status, rsr, max_count = 256;
+       u8 ch, flag;
 
        status = readb(port->membase + UART01x_FR);
        while (UART_RX_DATA(status) && max_count--) {
index c5c3f46..3dc9b0f 100644 (file)
@@ -20,6 +20,7 @@
 #include <linux/ioport.h>
 #include <linux/init.h>
 #include <linux/console.h>
+#include <linux/platform_device.h>
 #include <linux/sysrq.h>
 #include <linux/device.h>
 #include <linux/tty.h>
@@ -36,7 +37,6 @@
 #include <linux/delay.h>
 #include <linux/types.h>
 #include <linux/of.h>
-#include <linux/of_device.h>
 #include <linux/pinctrl/consumer.h>
 #include <linux/sizes.h>
 #include <linux/io.h>
@@ -307,9 +307,10 @@ static void pl011_write(unsigned int val, const struct uart_amba_port *uap,
  */
 static int pl011_fifo_to_tty(struct uart_amba_port *uap)
 {
-       unsigned int ch, flag, fifotaken;
+       unsigned int ch, fifotaken;
        int sysrq;
        u16 status;
+       u8 flag;
 
        for (fifotaken = 0; fifotaken != 256; fifotaken++) {
                status = pl011_read(uap, REG_FR);
index 915ee4b..d7658f3 100644 (file)
@@ -22,9 +22,6 @@
 #include <linux/kthread.h>
 #include <linux/device.h>
 #include <linux/of.h>
-#include <linux/of_device.h>
-#include <linux/of_platform.h>
-#include <linux/of_irq.h>
 #include <linux/platform_device.h>
 #include <linux/io.h>
 #include <linux/serial_core.h>
@@ -70,8 +67,9 @@ static void apbuart_stop_rx(struct uart_port *port)
 
 static void apbuart_rx_chars(struct uart_port *port)
 {
-       unsigned int status, ch, rsr, flag;
+       unsigned int status, rsr;
        unsigned int max_chars = port->fifosize;
+       u8 ch, flag;
 
        status = UART_GET_STATUS(port);
 
index 4c3d04c..924c1a8 100644 (file)
@@ -749,8 +749,7 @@ static int ar933x_uart_probe(struct platform_device *pdev)
 
        port = &up->port;
 
-       mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       port->membase = devm_ioremap_resource(&pdev->dev, mem_res);
+       port->membase = devm_platform_get_and_ioremap_resource(pdev, 0, &mem_res);
        if (IS_ERR(port->membase))
                return PTR_ERR(port->membase);
 
index 4b2512e..ad4ae19 100644 (file)
@@ -195,8 +195,6 @@ static void arc_serial_start_tx(struct uart_port *port)
 
 static void arc_serial_rx_chars(struct uart_port *port, unsigned int status)
 {
-       unsigned int ch, flg = 0;
-
        /*
         * UART has 4 deep RX-FIFO. Driver's recongnition of this fact
         * is very subtle. Here's how ...
@@ -207,24 +205,23 @@ static void arc_serial_rx_chars(struct uart_port *port, unsigned int status)
         * controller, which is indeed the Rx-FIFO.
         */
        do {
+               u8 ch, flg = TTY_NORMAL;
+
                /*
                 * This could be an Rx Intr for err (no data),
                 * so check err and clear that Intr first
                 */
-               if (unlikely(status & (RXOERR | RXFERR))) {
-                       if (status & RXOERR) {
-                               port->icount.overrun++;
-                               flg = TTY_OVERRUN;
-                               UART_CLR_STATUS(port, RXOERR);
-                       }
-
-                       if (status & RXFERR) {
-                               port->icount.frame++;
-                               flg = TTY_FRAME;
-                               UART_CLR_STATUS(port, RXFERR);
-                       }
-               } else
-                       flg = TTY_NORMAL;
+               if (status & RXOERR) {
+                       port->icount.overrun++;
+                       flg = TTY_OVERRUN;
+                       UART_CLR_STATUS(port, RXOERR);
+               }
+
+               if (status & RXFERR) {
+                       port->icount.frame++;
+                       flg = TTY_FRAME;
+                       UART_CLR_STATUS(port, RXFERR);
+               }
 
                if (status & RXEMPTY)
                        continue;
index 3467a87..88cdafa 100644 (file)
@@ -21,7 +21,6 @@
 #include <linux/tty_flip.h>
 #include <linux/platform_device.h>
 #include <linux/of.h>
-#include <linux/of_device.h>
 #include <linux/dma-mapping.h>
 #include <linux/dmaengine.h>
 #include <linux/atmel_pdc.h>
@@ -1516,8 +1515,8 @@ static void atmel_rx_from_ring(struct uart_port *port)
 {
        struct atmel_uart_port *atmel_port = to_atmel_uart_port(port);
        struct circ_buf *ring = &atmel_port->rx_ring;
-       unsigned int flg;
        unsigned int status;
+       u8 flg;
 
        while (ring->head != ring->tail) {
                struct atmel_uart_char c;
index 55e82d0..0dd8cce 100644 (file)
@@ -832,14 +832,10 @@ static int bcm_uart_probe(struct platform_device *pdev)
                return -EBUSY;
        memset(port, 0, sizeof(*port));
 
-       res_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!res_mem)
-               return -ENODEV;
-
-       port->mapbase = res_mem->start;
-       port->membase = devm_ioremap_resource(&pdev->dev, res_mem);
+       port->membase = devm_platform_get_and_ioremap_resource(pdev, 0, &res_mem);
        if (IS_ERR(port->membase))
                return PTR_ERR(port->membase);
+       port->mapbase = res_mem->start;
 
        ret = platform_get_irq(pdev, 0);
        if (ret < 0)
index e49bc40..55d1993 100644 (file)
@@ -92,8 +92,9 @@ static irqreturn_t uart_clps711x_int_rx(int irq, void *dev_id)
 {
        struct uart_port *port = dev_id;
        struct clps711x_port *s = dev_get_drvdata(port->dev);
-       unsigned int status, flg;
+       unsigned int status;
        u16 ch;
+       u8 flg;
 
        for (;;) {
                u32 sysflg = 0;
@@ -450,8 +451,7 @@ static int uart_clps711x_probe(struct platform_device *pdev)
        if (IS_ERR(uart_clk))
                return PTR_ERR(uart_clk);
 
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       s->port.membase = devm_ioremap_resource(&pdev->dev, res);
+       s->port.membase = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
        if (IS_ERR(s->port.membase))
                return PTR_ERR(s->port.membase);
 
index ed19770..128b547 100644 (file)
@@ -136,8 +136,7 @@ static void digicolor_uart_rx(struct uart_port *port)
        spin_lock_irqsave(&port->lock, flags);
 
        while (1) {
-               u8 status, ch;
-               unsigned int ch_flag;
+               u8 status, ch, ch_flag;
 
                if (digicolor_uart_rx_empty(port))
                        break;
index 6b7ed7f..667f52e 100644 (file)
@@ -181,8 +181,8 @@ static inline void dz_receive_chars(struct dz_mux *mux)
        struct dz_port *dport = &mux->dport[0];
        struct uart_icount *icount;
        int lines_rx[DZ_NB_PORT] = { [0 ... DZ_NB_PORT - 1] = 0 };
-       unsigned char ch, flag;
        u16 status;
+       u8 ch, flag;
        int i;
 
        while ((status = dz_in(dport, DZ_RBUF)) & DZ_DVAL) {
index 6fc21b6..249cb38 100644 (file)
@@ -11,7 +11,7 @@
 #include <linux/irq.h>
 #include <linux/module.h>
 #include <linux/of.h>
-#include <linux/of_device.h>
+#include <linux/platform_device.h>
 #include <linux/serial_core.h>
 #include <linux/slab.h>
 #include <linux/tty_flip.h>
@@ -827,14 +827,10 @@ static int linflex_probe(struct platform_device *pdev)
 
        sport->line = ret;
 
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!res)
-               return -ENODEV;
-
-       sport->mapbase = res->start;
-       sport->membase = devm_ioremap_resource(&pdev->dev, res);
+       sport->membase = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
        if (IS_ERR(sport->membase))
                return PTR_ERR(sport->membase);
+       sport->mapbase = res->start;
 
        sport->dev = &pdev->dev;
        sport->type = PORT_LINFLEXUART;
index 4d80fae..f6644c5 100644 (file)
@@ -18,9 +18,9 @@
 #include <linux/irq.h>
 #include <linux/module.h>
 #include <linux/of.h>
-#include <linux/of_device.h>
 #include <linux/of_dma.h>
 #include <linux/pinctrl/consumer.h>
+#include <linux/platform_device.h>
 #include <linux/pm_runtime.h>
 #include <linux/serial_core.h>
 #include <linux/slab.h>
@@ -288,6 +288,7 @@ struct lpuart_port {
        wait_queue_head_t       dma_wait;
        bool                    is_cs7; /* Set to true when character size is 7 */
                                        /* and the parity is enabled            */
+       bool                    dma_idle_int;
 };
 
 struct lpuart_soc_data {
@@ -1064,26 +1065,6 @@ static irqreturn_t lpuart_int(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-static irqreturn_t lpuart32_int(int irq, void *dev_id)
-{
-       struct lpuart_port *sport = dev_id;
-       unsigned long sts, rxcount;
-
-       sts = lpuart32_read(&sport->port, UARTSTAT);
-       rxcount = lpuart32_read(&sport->port, UARTWATER);
-       rxcount = rxcount >> UARTWATER_RXCNT_OFF;
-
-       if ((sts & UARTSTAT_RDRF || rxcount > 0) && !sport->lpuart_dma_rx_use)
-               lpuart32_rxint(sport);
-
-       if ((sts & UARTSTAT_TDRE) && !sport->lpuart_dma_tx_use)
-               lpuart32_txint(sport);
-
-       lpuart32_write(&sport->port, sts, UARTSTAT);
-       return IRQ_HANDLED;
-}
-
-
 static inline void lpuart_handle_sysrq_chars(struct uart_port *port,
                                             unsigned char *p, int count)
 {
@@ -1266,7 +1247,8 @@ exit:
        spin_unlock_irqrestore(&sport->port.lock, flags);
 
        tty_flip_buffer_push(port);
-       mod_timer(&sport->lpuart_timer, jiffies + sport->dma_rx_timeout);
+       if (!sport->dma_idle_int)
+               mod_timer(&sport->lpuart_timer, jiffies + sport->dma_rx_timeout);
 }
 
 static void lpuart_dma_rx_complete(void *arg)
@@ -1276,6 +1258,50 @@ static void lpuart_dma_rx_complete(void *arg)
        lpuart_copy_rx_to_tty(sport);
 }
 
+static void lpuart32_dma_idleint(struct lpuart_port *sport)
+{
+       enum dma_status dmastat;
+       struct dma_chan *chan = sport->dma_rx_chan;
+       struct circ_buf *ring = &sport->rx_ring;
+       struct dma_tx_state state;
+       int count = 0;
+
+       dmastat = dmaengine_tx_status(chan, sport->dma_rx_cookie, &state);
+       if (dmastat == DMA_ERROR) {
+               dev_err(sport->port.dev, "Rx DMA transfer failed!\n");
+               return;
+       }
+
+       ring->head = sport->rx_sgl.length - state.residue;
+       count = CIRC_CNT(ring->head, ring->tail, sport->rx_sgl.length);
+
+       /* Check if new data received before copying */
+       if (count)
+               lpuart_copy_rx_to_tty(sport);
+}
+
+static irqreturn_t lpuart32_int(int irq, void *dev_id)
+{
+       struct lpuart_port *sport = dev_id;
+       unsigned long sts, rxcount;
+
+       sts = lpuart32_read(&sport->port, UARTSTAT);
+       rxcount = lpuart32_read(&sport->port, UARTWATER);
+       rxcount = rxcount >> UARTWATER_RXCNT_OFF;
+
+       if ((sts & UARTSTAT_RDRF || rxcount > 0) && !sport->lpuart_dma_rx_use)
+               lpuart32_rxint(sport);
+
+       if ((sts & UARTSTAT_TDRE) && !sport->lpuart_dma_tx_use)
+               lpuart32_txint(sport);
+
+       if ((sts & UARTSTAT_IDLE) && sport->lpuart_dma_rx_use && sport->dma_idle_int)
+               lpuart32_dma_idleint(sport);
+
+       lpuart32_write(&sport->port, sts, UARTSTAT);
+       return IRQ_HANDLED;
+}
+
 /*
  * Timer function to simulate the hardware EOP (End Of Package) event.
  * The timer callback is to check for new RX data and copy to TTY buffer.
@@ -1392,6 +1418,12 @@ static inline int lpuart_start_rx_dma(struct lpuart_port *sport)
                unsigned long temp = lpuart32_read(&sport->port, UARTBAUD);
 
                lpuart32_write(&sport->port, temp | UARTBAUD_RDMAE, UARTBAUD);
+
+               if (sport->dma_idle_int) {
+                       unsigned long ctrl = lpuart32_read(&sport->port, UARTCTRL);
+
+                       lpuart32_write(&sport->port, ctrl | UARTCTRL_ILIE, UARTCTRL);
+               }
        } else {
                writeb(readb(sport->port.membase + UARTCR5) | UARTCR5_RDMAS,
                       sport->port.membase + UARTCR5);
@@ -1407,7 +1439,9 @@ static void lpuart_dma_rx_free(struct uart_port *port)
        struct dma_chan *chan = sport->dma_rx_chan;
 
        dmaengine_terminate_sync(chan);
-       del_timer_sync(&sport->lpuart_timer);
+       if (!sport->dma_idle_int)
+               del_timer_sync(&sport->lpuart_timer);
+
        dma_unmap_sg(chan->device->dev, &sport->rx_sgl, 1, DMA_FROM_DEVICE);
        kfree(sport->rx_ring.buf);
        sport->rx_ring.tail = 0;
@@ -1669,6 +1703,9 @@ static void lpuart32_setup_watermark_enable(struct lpuart_port *sport)
 
 static void rx_dma_timer_init(struct lpuart_port *sport)
 {
+       if (sport->dma_idle_int)
+               return;
+
        timer_setup(&sport->lpuart_timer, lpuart_timer_func, 0);
        sport->lpuart_timer.expires = jiffies + sport->dma_rx_timeout;
        add_timer(&sport->lpuart_timer);
@@ -2811,8 +2848,7 @@ static int lpuart_probe(struct platform_device *pdev)
        if (!sport)
                return -ENOMEM;
 
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       sport->port.membase = devm_ioremap_resource(&pdev->dev, res);
+       sport->port.membase = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
        if (IS_ERR(sport->port.membase))
                return PTR_ERR(sport->port.membase);
 
@@ -2822,6 +2858,8 @@ static int lpuart_probe(struct platform_device *pdev)
        sport->port.type = PORT_LPUART;
        sport->devtype = sdata->devtype;
        sport->rx_watermark = sdata->rx_watermark;
+       sport->dma_idle_int = is_imx7ulp_lpuart(sport) || is_imx8ulp_lpuart(sport) ||
+                             is_imx8qxp_lpuart(sport);
        ret = platform_get_irq(pdev, 0);
        if (ret < 0)
                return ret;
index 7341d06..13cb783 100644 (file)
@@ -25,7 +25,6 @@
 #include <linux/rational.h>
 #include <linux/slab.h>
 #include <linux/of.h>
-#include <linux/of_device.h>
 #include <linux/io.h>
 #include <linux/dma-mapping.h>
 
@@ -2276,8 +2275,7 @@ static int imx_uart_probe(struct platform_device *pdev)
                return -EINVAL;
        }
 
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       base = devm_ioremap_resource(&pdev->dev, res);
+       base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
        if (IS_ERR(base))
                return PTR_ERR(base);
 
index b1f27e1..845ff70 100644 (file)
@@ -248,8 +248,8 @@ static void ip22zilog_maybe_update_regs(struct uart_ip22zilog_port *up,
 static bool ip22zilog_receive_chars(struct uart_ip22zilog_port *up,
                                                  struct zilog_channel *channel)
 {
-       unsigned char ch, flag;
        unsigned int r1;
+       u8 ch, flag;
        bool push = up->port.state != NULL;
 
        for (;;) {
index bcaa479..3adb60c 100644 (file)
@@ -17,7 +17,8 @@
 #include <linux/ioport.h>
 #include <linux/lantiq.h>
 #include <linux/module.h>
-#include <linux/of_platform.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
 #include <linux/serial.h>
 #include <linux/serial_core.h>
 #include <linux/slab.h>
index 80de3a4..d881cdd 100644 (file)
@@ -11,8 +11,7 @@
 #include <linux/litex.h>
 #include <linux/module.h>
 #include <linux/of.h>
-#include <linux/of_address.h>
-#include <linux/of_platform.h>
+#include <linux/platform_device.h>
 #include <linux/serial.h>
 #include <linux/serial_core.h>
 #include <linux/slab.h>
index 2604b4d..7895934 100644 (file)
@@ -8,7 +8,7 @@
 #include <linux/clk.h>
 #include <linux/delay.h>
 #include <linux/of.h>
-#include <linux/of_platform.h>
+#include <linux/platform_device.h>
 #include <linux/iopoll.h>
 #include <linux/serial_core.h>
 #include <linux/slab.h>
index 86dcbff..5efb2b5 100644 (file)
@@ -215,8 +215,9 @@ static int max3100_sr(struct max3100_port *s, u16 tx, u16 *rx)
 
 static int max3100_handlerx(struct max3100_port *s, u16 rx)
 {
-       unsigned int ch, flg, status = 0;
+       unsigned int status = 0;
        int ret = 0, cts;
+       u8 ch, flg;
 
        if (rx & MAX3100_R && s->rx_enabled) {
                dev_dbg(&s->spi->dev, "%s\n", __func__);
index 997e394..416d553 100644 (file)
@@ -669,7 +669,8 @@ static void max310x_batch_read(struct uart_port *port, u8 *rxbuf, unsigned int l
 static void max310x_handle_rx(struct uart_port *port, unsigned int rxlen)
 {
        struct max310x_one *one = to_max310x_port(port);
-       unsigned int sts, ch, flag, i;
+       unsigned int sts, i;
+       u8 ch, flag;
 
        if (port->read_status_mask == MAX310X_LSR_RXOVR_BIT) {
                /* We are just reading, happily ignoring any error conditions.
index 3239bab..1666ce0 100644 (file)
@@ -281,7 +281,7 @@ static void mcf_set_termios(struct uart_port *port, struct ktermios *termios,
 static void mcf_rx_chars(struct mcf_uart *pp)
 {
        struct uart_port *port = &pp->port;
-       unsigned char status, ch, flag;
+       u8 status, ch, flag;
 
        while ((status = readb(port->membase + MCFUART_USR)) & MCFUART_USR_RXREADY) {
                ch = readb(port->membase + MCFUART_URB);
index 2501db5..790d910 100644 (file)
 
 #define AML_UART_PORT_NUM              12
 #define AML_UART_PORT_OFFSET           6
-#define AML_UART_DEV_NAME              "ttyAML"
 
 #define AML_UART_POLL_USEC             5
 #define AML_UART_TIMEOUT_USEC          10000
 
-static struct uart_driver meson_uart_driver;
+static struct uart_driver meson_uart_driver_ttyAML;
+static struct uart_driver meson_uart_driver_ttyS;
 
 static struct uart_port *meson_ports[AML_UART_PORT_NUM];
 
 struct meson_uart_data {
+       struct uart_driver *uart_driver;
        bool has_xtal_div2;
 };
 
@@ -611,21 +612,19 @@ static int meson_serial_console_setup(struct console *co, char *options)
        return uart_set_options(port, co, baud, parity, bits, flow);
 }
 
-static struct console meson_serial_console = {
-       .name           = AML_UART_DEV_NAME,
-       .write          = meson_serial_console_write,
-       .device         = uart_console_device,
-       .setup          = meson_serial_console_setup,
-       .flags          = CON_PRINTBUFFER,
-       .index          = -1,
-       .data           = &meson_uart_driver,
-};
+#define MESON_SERIAL_CONSOLE(_devname)                                 \
+       static struct console meson_serial_console_##_devname = {       \
+               .name           = __stringify(_devname),                \
+               .write          = meson_serial_console_write,           \
+               .device         = uart_console_device,                  \
+               .setup          = meson_serial_console_setup,           \
+               .flags          = CON_PRINTBUFFER,                      \
+               .index          = -1,                                   \
+               .data           = &meson_uart_driver_##_devname,        \
+       }
 
-static int __init meson_serial_console_init(void)
-{
-       register_console(&meson_serial_console);
-       return 0;
-}
+MESON_SERIAL_CONSOLE(ttyAML);
+MESON_SERIAL_CONSOLE(ttyS);
 
 static void meson_serial_early_console_write(struct console *co,
                                             const char *s,
@@ -650,21 +649,22 @@ meson_serial_early_console_setup(struct earlycon_device *device, const char *opt
 OF_EARLYCON_DECLARE(meson, "amlogic,meson-ao-uart",
                    meson_serial_early_console_setup);
 
-#define MESON_SERIAL_CONSOLE   (&meson_serial_console)
+#define MESON_SERIAL_CONSOLE_PTR(_devname) (&meson_serial_console_##_devname)
 #else
-static int __init meson_serial_console_init(void) {
-       return 0;
-}
-#define MESON_SERIAL_CONSOLE   NULL
+#define MESON_SERIAL_CONSOLE_PTR(_devname) (NULL)
 #endif
 
-static struct uart_driver meson_uart_driver = {
-       .owner          = THIS_MODULE,
-       .driver_name    = "meson_uart",
-       .dev_name       = AML_UART_DEV_NAME,
-       .nr             = AML_UART_PORT_NUM,
-       .cons           = MESON_SERIAL_CONSOLE,
-};
+#define MESON_UART_DRIVER(_devname)                                    \
+       static struct uart_driver meson_uart_driver_##_devname = {      \
+               .owner          = THIS_MODULE,                          \
+               .driver_name    = "meson_uart",                         \
+               .dev_name       = __stringify(_devname),                \
+               .nr             = AML_UART_PORT_NUM,                    \
+               .cons           = MESON_SERIAL_CONSOLE_PTR(_devname),   \
+       }
+
+MESON_UART_DRIVER(ttyAML);
+MESON_UART_DRIVER(ttyS);
 
 static int meson_uart_probe_clocks(struct platform_device *pdev,
                                   struct uart_port *port)
@@ -690,8 +690,16 @@ static int meson_uart_probe_clocks(struct platform_device *pdev,
        return 0;
 }
 
+static struct uart_driver *meson_uart_current(const struct meson_uart_data *pd)
+{
+       return (pd && pd->uart_driver) ?
+               pd->uart_driver : &meson_uart_driver_ttyAML;
+}
+
 static int meson_uart_probe(struct platform_device *pdev)
 {
+       const struct meson_uart_data *priv_data;
+       struct uart_driver *uart_driver;
        struct resource *res_mem;
        struct uart_port *port;
        u32 fifosize = 64; /* Default is 64, 128 for EE UART_0 */
@@ -726,8 +734,8 @@ static int meson_uart_probe(struct platform_device *pdev)
        of_property_read_u32(pdev->dev.of_node, "fifo-size", &fifosize);
 
        if (meson_ports[pdev->id]) {
-               dev_err(&pdev->dev, "port %d already allocated\n", pdev->id);
-               return -EBUSY;
+               return dev_err_probe(&pdev->dev, -EBUSY,
+                                    "port %d already allocated\n", pdev->id);
        }
 
        port = devm_kzalloc(&pdev->dev, sizeof(struct uart_port), GFP_KERNEL);
@@ -738,6 +746,17 @@ static int meson_uart_probe(struct platform_device *pdev)
        if (ret)
                return ret;
 
+       priv_data = device_get_match_data(&pdev->dev);
+
+       uart_driver = meson_uart_current(priv_data);
+
+       if (!uart_driver->state) {
+               ret = uart_register_driver(uart_driver);
+               if (ret)
+                       return dev_err_probe(&pdev->dev, ret,
+                                            "can't register uart driver\n");
+       }
+
        port->iotype = UPIO_MEM;
        port->mapbase = res_mem->start;
        port->mapsize = resource_size(res_mem);
@@ -750,7 +769,7 @@ static int meson_uart_probe(struct platform_device *pdev)
        port->x_char = 0;
        port->ops = &meson_uart_ops;
        port->fifosize = fifosize;
-       port->private_data = (void *)device_get_match_data(&pdev->dev);
+       port->private_data = (void *)priv_data;
 
        meson_ports[pdev->id] = port;
        platform_set_drvdata(pdev, port);
@@ -761,7 +780,7 @@ static int meson_uart_probe(struct platform_device *pdev)
                meson_uart_release_port(port);
        }
 
-       ret = uart_add_one_port(&meson_uart_driver, port);
+       ret = uart_add_one_port(uart_driver, port);
        if (ret)
                meson_ports[pdev->id] = NULL;
 
@@ -770,12 +789,21 @@ static int meson_uart_probe(struct platform_device *pdev)
 
 static int meson_uart_remove(struct platform_device *pdev)
 {
+       struct uart_driver *uart_driver;
        struct uart_port *port;
 
        port = platform_get_drvdata(pdev);
-       uart_remove_one_port(&meson_uart_driver, port);
+       uart_driver = meson_uart_current(port->private_data);
+       uart_remove_one_port(uart_driver, port);
        meson_ports[pdev->id] = NULL;
 
+       for (int id = 0; id < AML_UART_PORT_NUM; id++)
+               if (meson_ports[id])
+                       return 0;
+
+       /* No more available uart ports, unregister uart driver */
+       uart_unregister_driver(uart_driver);
+
        return 0;
 }
 
@@ -783,6 +811,16 @@ static struct meson_uart_data meson_g12a_uart_data = {
        .has_xtal_div2 = true,
 };
 
+static struct meson_uart_data meson_a1_uart_data = {
+       .uart_driver = &meson_uart_driver_ttyS,
+       .has_xtal_div2 = false,
+};
+
+static struct meson_uart_data meson_s4_uart_data = {
+       .uart_driver = &meson_uart_driver_ttyS,
+       .has_xtal_div2 = true,
+};
+
 static const struct of_device_id meson_uart_dt_match[] = {
        { .compatible = "amlogic,meson6-uart" },
        { .compatible = "amlogic,meson8-uart" },
@@ -794,7 +832,11 @@ static const struct of_device_id meson_uart_dt_match[] = {
        },
        {
                .compatible = "amlogic,meson-s4-uart",
-               .data = (void *)&meson_g12a_uart_data,
+               .data = (void *)&meson_s4_uart_data,
+       },
+       {
+               .compatible = "amlogic,meson-a1-uart",
+               .data = (void *)&meson_a1_uart_data,
        },
        { /* sentinel */ },
 };
@@ -809,33 +851,7 @@ static  struct platform_driver meson_uart_platform_driver = {
        },
 };
 
-static int __init meson_uart_init(void)
-{
-       int ret;
-
-       ret = meson_serial_console_init();
-       if (ret)
-               return ret;
-       
-       ret = uart_register_driver(&meson_uart_driver);
-       if (ret)
-               return ret;
-
-       ret = platform_driver_register(&meson_uart_platform_driver);
-       if (ret)
-               uart_unregister_driver(&meson_uart_driver);
-
-       return ret;
-}
-
-static void __exit meson_uart_exit(void)
-{
-       platform_driver_unregister(&meson_uart_platform_driver);
-       uart_unregister_driver(&meson_uart_driver);
-}
-
-module_init(meson_uart_init);
-module_exit(meson_uart_exit);
+module_platform_driver(meson_uart_platform_driver);
 
 MODULE_AUTHOR("Carlo Caione <carlo@caione.org>");
 MODULE_DESCRIPTION("Amlogic Meson serial port driver");
index 44988a2..70a9100 100644 (file)
@@ -148,8 +148,7 @@ static void mlb_usio_enable_ms(struct uart_port *port)
 static void mlb_usio_rx_chars(struct uart_port *port)
 {
        struct tty_port *ttyport = &port->state->port;
-       unsigned long flag = 0;
-       char ch = 0;
+       u8 flag = 0, ch = 0;
        u8 status;
        int max_count = 2;
 
index 384ca19..916507b 100644 (file)
@@ -40,7 +40,7 @@
 #include <linux/of.h>
 #include <linux/of_address.h>
 #include <linux/of_irq.h>
-#include <linux/of_platform.h>
+#include <linux/platform_device.h>
 #include <linux/clk.h>
 
 #include <asm/mpc52xx.h>
index 860d161..ea5a791 100644 (file)
@@ -16,7 +16,6 @@
 #include <linux/console.h>
 #include <linux/io.h>
 #include <linux/kernel.h>
-#include <linux/of_device.h>
 #include <linux/of.h>
 #include <linux/platform_device.h>
 #include <linux/serial_core.h>
@@ -539,8 +538,7 @@ static int mps2_init_port(struct platform_device *pdev,
        struct resource *res;
        int ret;
 
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       mps_port->port.membase = devm_ioremap_resource(&pdev->dev, res);
+       mps_port->port.membase = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
        if (IS_ERR(mps_port->port.membase))
                return PTR_ERR(mps_port->port.membase);
 
index 31f739c..ea924e9 100644 (file)
@@ -876,18 +876,13 @@ static int uart_num_counter;
 
 static int mvebu_uart_probe(struct platform_device *pdev)
 {
-       struct resource *reg = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        const struct of_device_id *match = of_match_device(mvebu_uart_of_match,
                                                           &pdev->dev);
        struct uart_port *port;
        struct mvebu_uart *mvuart;
+       struct resource *reg;
        int id, irq;
 
-       if (!reg) {
-               dev_err(&pdev->dev, "no registers defined\n");
-               return -EINVAL;
-       }
-
        /* Assume that all UART ports have a DT alias or none has */
        id = of_alias_get_id(pdev->dev.of_node, "serial");
        if (!pdev->dev.of_node || id < 0)
@@ -922,11 +917,11 @@ static int mvebu_uart_probe(struct platform_device *pdev)
         */
        port->irq        = 0;
        port->irqflags   = 0;
-       port->mapbase    = reg->start;
 
-       port->membase = devm_ioremap_resource(&pdev->dev, reg);
+       port->membase = devm_platform_get_and_ioremap_resource(pdev, 0, &reg);
        if (IS_ERR(port->membase))
                return PTR_ERR(port->membase);
+       port->mapbase    = reg->start;
 
        mvuart = devm_kzalloc(&pdev->dev, sizeof(struct mvebu_uart),
                              GFP_KERNEL);
index a368f42..8eeecf8 100644 (file)
@@ -30,7 +30,7 @@
 #include <linux/clk.h>
 #include <linux/delay.h>
 #include <linux/io.h>
-#include <linux/of_device.h>
+#include <linux/of.h>
 #include <linux/dma-mapping.h>
 #include <linux/dmaengine.h>
 
@@ -616,9 +616,8 @@ static void mxs_auart_tx_chars(struct mxs_auart_port *s)
 
 static void mxs_auart_rx_char(struct mxs_auart_port *s)
 {
-       int flag;
        u32 stat;
-       u8 c;
+       u8 c, flag;
 
        c = mxs_read(s, REG_DATA);
        stat = mxs_read(s, REG_STAT);
index 82d35db..3dc14dc 100644 (file)
@@ -442,7 +442,7 @@ static unsigned int check_modem_status(struct uart_omap_port *up)
 
 static void serial_omap_rlsi(struct uart_omap_port *up, unsigned int lsr)
 {
-       unsigned int flag;
+       u8 flag;
 
        /*
         * Read one data character out to avoid stalling the receiver according
@@ -498,8 +498,7 @@ static void serial_omap_rlsi(struct uart_omap_port *up, unsigned int lsr)
 
 static void serial_omap_rdi(struct uart_omap_port *up, unsigned int lsr)
 {
-       unsigned char ch = 0;
-       unsigned int flag;
+       u8 ch;
 
        if (!(lsr & UART_LSR_DR))
                return;
@@ -512,13 +511,12 @@ static void serial_omap_rdi(struct uart_omap_port *up, unsigned int lsr)
                return;
        }
 
-       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);
+       uart_insert_char(&up->port, lsr, UART_LSR_OE, ch, TTY_NORMAL);
 }
 
 /**
@@ -1573,8 +1571,7 @@ static int serial_omap_probe(struct platform_device *pdev)
        if (!up)
                return -ENOMEM;
 
-       mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       base = devm_ioremap_resource(&pdev->dev, mem);
+       base = devm_platform_get_and_ioremap_resource(pdev, 0, &mem);
        if (IS_ERR(base))
                return PTR_ERR(base);
 
index 196a4e6..e308d50 100644 (file)
@@ -11,7 +11,6 @@
 #include <linux/kernel.h>
 #include <linux/platform_device.h>
 #include <linux/of.h>
-#include <linux/of_device.h>
 #include <linux/of_irq.h>
 #include <linux/of_gpio.h>
 #include <linux/init.h>
index 444fa4b..73c60f5 100644 (file)
@@ -90,7 +90,7 @@ static void serial_pxa_stop_rx(struct uart_port *port)
 
 static inline void receive_chars(struct uart_pxa_port *up, int *status)
 {
-       unsigned int ch, flag;
+       u8 ch, flag;
        int max_count = 256;
 
        do {
index daaf2a6..3ca5db2 100644 (file)
@@ -11,7 +11,6 @@
 #include <linux/irq.h>
 #include <linux/module.h>
 #include <linux/of.h>
-#include <linux/of_device.h>
 #include <linux/pm_opp.h>
 #include <linux/platform_device.h>
 #include <linux/pm_runtime.h>
@@ -126,6 +125,7 @@ struct qcom_geni_serial_port {
        dma_addr_t rx_dma_addr;
        bool setup;
        unsigned int baud;
+       unsigned long clk_rate;
        void *rx_buf;
        u32 loopback;
        bool brk;
@@ -1245,10 +1245,11 @@ static void qcom_geni_serial_set_termios(struct uart_port *uport,
                goto out_restart_rx;
        }
 
-       dev_dbg(port->se.dev, "desired_rate-%u, clk_rate-%lu, clk_div-%u\n",
+       dev_dbg(port->se.dev, "desired_rate = %u, clk_rate = %lu, clk_div = %u\n",
                        baud * sampling_rate, clk_rate, clk_div);
 
        uport->uartclk = clk_rate;
+       port->clk_rate = clk_rate;
        dev_pm_opp_set_rate(uport->dev, clk_rate);
        ser_clk_cfg = SER_CLK_EN;
        ser_clk_cfg |= clk_div << CLK_DIV_SHFT;
@@ -1513,10 +1514,13 @@ static void qcom_geni_serial_pm(struct uart_port *uport,
 
        if (new_state == UART_PM_STATE_ON && old_state == UART_PM_STATE_OFF) {
                geni_icc_enable(&port->se);
+               if (port->clk_rate)
+                       dev_pm_opp_set_rate(uport->dev, port->clk_rate);
                geni_se_resources_on(&port->se);
        } else if (new_state == UART_PM_STATE_OFF &&
                        old_state == UART_PM_STATE_ON) {
                geni_se_resources_off(&port->se);
+               dev_pm_opp_set_rate(uport->dev, 0);
                geni_icc_disable(&port->se);
        }
 }
@@ -1750,7 +1754,7 @@ static int qcom_geni_serial_sys_hib_resume(struct device *dev)
        private_data = uport->private_data;
 
        if (uart_console(uport)) {
-               geni_icc_set_tag(&port->se, 0x7);
+               geni_icc_set_tag(&port->se, QCOM_ICC_TAG_ALWAYS);
                geni_icc_set_bw(&port->se);
                ret = uart_resume_port(private_data->drv, uport);
                /*
index 749b873..de220ac 100644 (file)
@@ -401,14 +401,14 @@ static void rp2_rx_chars(struct rp2_uart_port *up)
 
        for (; bytes != 0; bytes--) {
                u32 byte = readw(up->base + RP2_DATA_BYTE) | RP2_DUMMY_READ;
-               char ch = byte & 0xff;
+               u8 ch = byte & 0xff;
 
                if (likely(!(byte & RP2_DATA_BYTE_EXCEPTION_MASK))) {
                        if (!uart_handle_sysrq_char(&up->port, ch))
                                uart_insert_char(&up->port, byte, 0, ch,
                                                 TTY_NORMAL);
                } else {
-                       char flag = TTY_NORMAL;
+                       u8 flag = TTY_NORMAL;
 
                        if (byte & RP2_DATA_BYTE_BREAK_m)
                                flag = TTY_BREAK;
index 55107bb..ad011f1 100644 (file)
@@ -180,7 +180,8 @@ static void sa1100_enable_ms(struct uart_port *port)
 static void
 sa1100_rx_chars(struct sa1100_port *sport)
 {
-       unsigned int status, ch, flg;
+       unsigned int status;
+       u8 ch, flg;
 
        status = UTSR1_TO_SM(UART_GET_UTSR1(sport)) |
                 UTSR0_TO_SM(UART_GET_UTSR0(sport));
index b29e9df..aa4a184 100644 (file)
@@ -759,9 +759,10 @@ finish:
 static void s3c24xx_serial_rx_drain_fifo(struct s3c24xx_uart_port *ourport)
 {
        struct uart_port *port = &ourport->port;
-       unsigned int ufcon, ch, flag, ufstat, uerstat;
+       unsigned int ufcon, ufstat, uerstat;
        unsigned int fifocnt = 0;
        int max_count = port->fifosize;
+       u8 ch, flag;
 
        while (max_count-- > 0) {
                /*
index b6de0dc..f3cd693 100644 (file)
@@ -331,8 +331,9 @@ static void sbd_receive_chars(struct sbd_port *sport)
 {
        struct uart_port *uport = &sport->port;
        struct uart_icount *icount;
-       unsigned int status, ch, flag;
+       unsigned int status;
        int count;
+       u8 ch, flag;
 
        for (count = 16; count; count--) {
                status = read_sbdchn(sport, R_DUART_STATUS);
index 2e7e7c4..18a48ce 100644 (file)
@@ -488,6 +488,7 @@ static bool sc16is7xx_regmap_volatile(struct device *dev, unsigned int reg)
        case SC16IS7XX_TXLVL_REG:
        case SC16IS7XX_RXLVL_REG:
        case SC16IS7XX_IOSTATE_REG:
+       case SC16IS7XX_IOCONTROL_REG:
                return true;
        default:
                break;
@@ -578,8 +579,9 @@ static void sc16is7xx_handle_rx(struct uart_port *port, unsigned int rxlen,
                                unsigned int iir)
 {
        struct sc16is7xx_port *s = dev_get_drvdata(port->dev);
-       unsigned int lsr = 0, ch, flag, bytes_read, i;
+       unsigned int lsr = 0, bytes_read, i;
        bool read_lsr = (iir == SC16IS7XX_IIR_RLSE_SRC) ? true : false;
+       u8 ch, flag;
 
        if (unlikely(rxlen >= sizeof(s->buf))) {
                dev_warn_ratelimited(port->dev,
index 4f2fc5f..2be2c10 100644 (file)
@@ -383,8 +383,7 @@ static void sccnxp_set_bit(struct uart_port *port, int sig, int state)
 
 static void sccnxp_handle_rx(struct uart_port *port)
 {
-       u8 sr;
-       unsigned int ch, flag;
+       u8 sr, ch, flag;
 
        for (;;) {
                sr = sccnxp_port_read(port, SCCNXP_SR_REG);
@@ -880,14 +879,14 @@ MODULE_DEVICE_TABLE(platform, sccnxp_id_table);
 
 static int sccnxp_probe(struct platform_device *pdev)
 {
-       struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        struct sccnxp_pdata *pdata = dev_get_platdata(&pdev->dev);
+       struct resource *res;
        int i, ret, uartclk;
        struct sccnxp_port *s;
        void __iomem *membase;
        struct clk *clk;
 
-       membase = devm_ioremap_resource(&pdev->dev, res);
+       membase = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
        if (IS_ERR(membase))
                return PTR_ERR(membase);
 
index 1cf08b3..0b597b2 100644 (file)
@@ -20,7 +20,6 @@
 #include <linux/irq.h>
 #include <linux/module.h>
 #include <linux/of.h>
-#include <linux/of_device.h>
 #include <linux/pagemap.h>
 #include <linux/platform_device.h>
 #include <linux/reset.h>
@@ -434,10 +433,10 @@ static int tegra_set_baudrate(struct tegra_uart_port *tup, unsigned int baud)
        return 0;
 }
 
-static char tegra_uart_decode_rx_error(struct tegra_uart_port *tup,
+static u8 tegra_uart_decode_rx_error(struct tegra_uart_port *tup,
                        unsigned long lsr)
 {
-       char flag = TTY_NORMAL;
+       u8 flag = TTY_NORMAL;
 
        if (unlikely(lsr & TEGRA_UART_LSR_ANY)) {
                if (lsr & UART_LSR_OE) {
@@ -642,9 +641,8 @@ static void tegra_uart_handle_rx_pio(struct tegra_uart_port *tup,
                struct tty_port *port)
 {
        do {
-               char flag = TTY_NORMAL;
                unsigned long lsr = 0;
-               unsigned char ch;
+               u8 ch, flag = TTY_NORMAL;
 
                lsr = tegra_uart_read(tup, UART_LSR);
                if (!(lsr & UART_LSR_DR))
@@ -1579,22 +1577,15 @@ static int tegra_uart_probe(struct platform_device *pdev)
        tup->cdata = cdata;
 
        platform_set_drvdata(pdev, tup);
-       resource = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!resource) {
-               dev_err(&pdev->dev, "No IO memory resource\n");
-               return -ENODEV;
-       }
 
-       u->mapbase = resource->start;
-       u->membase = devm_ioremap_resource(&pdev->dev, resource);
+       u->membase = devm_platform_get_and_ioremap_resource(pdev, 0, &resource);
        if (IS_ERR(u->membase))
                return PTR_ERR(u->membase);
+       u->mapbase = resource->start;
 
        tup->uart_clk = devm_clk_get(&pdev->dev, NULL);
-       if (IS_ERR(tup->uart_clk)) {
-               dev_err(&pdev->dev, "Couldn't get the clock\n");
-               return PTR_ERR(tup->uart_clk);
-       }
+       if (IS_ERR(tup->uart_clk))
+               return dev_err_probe(&pdev->dev, PTR_ERR(tup->uart_clk), "Couldn't get the clock");
 
        tup->rst = devm_reset_control_get_exclusive(&pdev->dev, "serial");
        if (IS_ERR(tup->rst)) {
index 831d033..306ea1a 100644 (file)
@@ -133,9 +133,8 @@ static void uart_stop(struct tty_struct *tty)
        uart_port_unlock(port, flags);
 }
 
-static void __uart_start(struct tty_struct *tty)
+static void __uart_start(struct uart_state *state)
 {
-       struct uart_state *state = tty->driver_data;
        struct uart_port *port = state->uart_port;
        struct serial_port_device *port_dev;
        int err;
@@ -170,7 +169,7 @@ static void uart_start(struct tty_struct *tty)
        unsigned long flags;
 
        port = uart_port_lock(state, flags);
-       __uart_start(tty);
+       __uart_start(state);
        uart_port_unlock(port, flags);
 }
 
@@ -239,7 +238,7 @@ static void uart_change_line_settings(struct tty_struct *tty, struct uart_state
                if (!old_hw_stopped)
                        uport->ops->stop_tx(uport);
                else
-                       __uart_start(tty);
+                       __uart_start(state);
        }
        spin_unlock_irq(&uport->lock);
 }
@@ -619,7 +618,7 @@ static int uart_write(struct tty_struct *tty,
                ret += c;
        }
 
-       __uart_start(tty);
+       __uart_start(state);
        uart_port_unlock(port, flags);
        return ret;
 }
@@ -3486,7 +3485,7 @@ EXPORT_SYMBOL_GPL(uart_handle_cts_change);
  * @flag: flag for the character (see TTY_NORMAL and friends)
  */
 void uart_insert_char(struct uart_port *port, unsigned int status,
-                unsigned int overrun, unsigned int ch, unsigned int flag)
+                     unsigned int overrun, u8 ch, u8 flag)
 {
        struct tty_port *tport = &port->state->port;
 
@@ -3505,7 +3504,7 @@ void uart_insert_char(struct uart_port *port, unsigned int status,
 EXPORT_SYMBOL_GPL(uart_insert_char);
 
 #ifdef CONFIG_MAGIC_SYSRQ_SERIAL
-static const char sysrq_toggle_seq[] = CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE;
+static const u8 sysrq_toggle_seq[] = CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE;
 
 static void uart_sysrq_on(struct work_struct *w)
 {
@@ -3528,7 +3527,7 @@ static DECLARE_WORK(sysrq_enable_work, uart_sysrq_on);
  * Returns: %false if @ch is out of enabling sequence and should be
  * handled some other way, %true if @ch was consumed.
  */
-bool uart_try_toggle_sysrq(struct uart_port *port, unsigned int ch)
+bool uart_try_toggle_sysrq(struct uart_port *port, u8 ch)
 {
        int sysrq_toggle_seq_len = strlen(sysrq_toggle_seq);
 
index eab387b..be08fb6 100644 (file)
@@ -246,11 +246,10 @@ static void serial_txx9_initialize(struct uart_port *up)
 static inline void
 receive_chars(struct uart_port *up, unsigned int *status)
 {
-       unsigned char ch;
        unsigned int disr = *status;
        int max_count = 256;
-       char flag;
        unsigned int next_ignore_status_mask;
+       u8 ch, flag;
 
        do {
                ch = sio_in(up, TXX9_SIRFIFO);
index 8b7a42e..a560b72 100644 (file)
@@ -35,7 +35,6 @@
 #include <linux/module.h>
 #include <linux/mm.h>
 #include <linux/of.h>
-#include <linux/of_device.h>
 #include <linux/platform_device.h>
 #include <linux/pm_runtime.h>
 #include <linux/reset.h>
index a19db49..3ac9fbd 100644 (file)
@@ -402,9 +402,9 @@ static char __ssp_receive_char(struct sifive_serial_port *ssp, char *is_empty)
  */
 static void __ssp_receive_chars(struct sifive_serial_port *ssp)
 {
-       unsigned char ch;
        char is_empty;
        int c;
+       u8 ch;
 
        for (c = SIFIVE_RX_FIFO_DEPTH; c > 0; --c) {
                ch = __ssp_receive_char(ssp, &is_empty);
@@ -917,12 +917,9 @@ static int sifive_serial_probe(struct platform_device *pdev)
        if (irq < 0)
                return -EPROBE_DEFER;
 
-       mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       base = devm_ioremap_resource(&pdev->dev, mem);
-       if (IS_ERR(base)) {
-               dev_err(&pdev->dev, "could not acquire device memory\n");
+       base = devm_platform_get_and_ioremap_resource(pdev, 0, &mem);
+       if (IS_ERR(base))
                return PTR_ERR(base);
-       }
 
        clk = devm_clk_get_enabled(&pdev->dev, NULL);
        if (IS_ERR(clk)) {
index b58f512..f328fa5 100644 (file)
@@ -364,7 +364,7 @@ static void sprd_rx_free_buf(struct sprd_uart_port *sp)
        if (sp->rx_dma.virt)
                dma_free_coherent(sp->port.dev, SPRD_UART_RX_SIZE,
                                  sp->rx_dma.virt, sp->rx_dma.phys_addr);
-
+       sp->rx_dma.virt = NULL;
 }
 
 static int sprd_rx_dma_config(struct uart_port *port, u32 burst)
@@ -558,7 +558,7 @@ static void sprd_break_ctl(struct uart_port *port, int break_state)
 }
 
 static int handle_lsr_errors(struct uart_port *port,
-                            unsigned int *flag,
+                            u8 *flag,
                             unsigned int *lsr)
 {
        int ret = 0;
@@ -594,7 +594,8 @@ static inline void sprd_rx(struct uart_port *port)
        struct sprd_uart_port *sp = container_of(port, struct sprd_uart_port,
                                                 port);
        struct tty_port *tty = &port->state->port;
-       unsigned int ch, flag, lsr, max_count = SPRD_TIMEOUT;
+       unsigned int lsr, max_count = SPRD_TIMEOUT;
+       u8 ch, flag;
 
        if (sp->rx_dma.enable) {
                sprd_uart_dma_irq(port);
@@ -1106,7 +1107,7 @@ static bool sprd_uart_is_console(struct uart_port *uport)
 static int sprd_clk_init(struct uart_port *uport)
 {
        struct clk *clk_uart, *clk_parent;
-       struct sprd_uart_port *u = sprd_port[uport->line];
+       struct sprd_uart_port *u = container_of(uport, struct sprd_uart_port, port);
 
        clk_uart = devm_clk_get(uport->dev, "uart");
        if (IS_ERR(clk_uart)) {
@@ -1149,22 +1150,22 @@ static int sprd_probe(struct platform_device *pdev)
 {
        struct resource *res;
        struct uart_port *up;
+       struct sprd_uart_port *sport;
        int irq;
        int index;
        int ret;
 
        index = of_alias_get_id(pdev->dev.of_node, "serial");
-       if (index < 0 || index >= ARRAY_SIZE(sprd_port)) {
+       if (index < 0 || index >= UART_NR_MAX) {
                dev_err(&pdev->dev, "got a wrong serial alias id %d\n", index);
                return -EINVAL;
        }
 
-       sprd_port[index] = devm_kzalloc(&pdev->dev, sizeof(*sprd_port[index]),
-                                       GFP_KERNEL);
-       if (!sprd_port[index])
+       sport = devm_kzalloc(&pdev->dev, sizeof(*sport), GFP_KERNEL);
+       if (!sport)
                return -ENOMEM;
 
-       up = &sprd_port[index]->port;
+       up = &sport->port;
        up->dev = &pdev->dev;
        up->line = index;
        up->type = PORT_SPRD;
@@ -1179,8 +1180,7 @@ static int sprd_probe(struct platform_device *pdev)
        if (ret)
                return ret;
 
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       up->membase = devm_ioremap_resource(&pdev->dev, res);
+       up->membase = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
        if (IS_ERR(up->membase))
                return PTR_ERR(up->membase);
 
@@ -1195,7 +1195,7 @@ static int sprd_probe(struct platform_device *pdev)
         * Allocate one dma buffer to prepare for receive transfer, in case
         * memory allocation failure at runtime.
         */
-       ret = sprd_rx_alloc_buf(sprd_port[index]);
+       ret = sprd_rx_alloc_buf(sport);
        if (ret)
                return ret;
 
@@ -1203,17 +1203,27 @@ static int sprd_probe(struct platform_device *pdev)
                ret = uart_register_driver(&sprd_uart_driver);
                if (ret < 0) {
                        pr_err("Failed to register SPRD-UART driver\n");
-                       return ret;
+                       goto free_rx_buf;
                }
        }
+
        sprd_ports_num++;
+       sprd_port[index] = sport;
 
        ret = uart_add_one_port(&sprd_uart_driver, up);
        if (ret)
-               sprd_remove(pdev);
+               goto clean_port;
 
        platform_set_drvdata(pdev, up);
 
+       return 0;
+
+clean_port:
+       sprd_port[index] = NULL;
+       if (--sprd_ports_num == 0)
+               uart_unregister_driver(&sprd_uart_driver);
+free_rx_buf:
+       sprd_rx_free_buf(sport);
        return ret;
 }
 
index aa471c9..92b9f68 100644 (file)
@@ -250,7 +250,7 @@ static void asc_receive_chars(struct uart_port *port)
        struct tty_port *tport = &port->state->port;
        unsigned long status, mode;
        unsigned long c = 0;
-       char flag;
+       u8 flag;
        bool ignore_pe = false;
 
        /*
@@ -691,8 +691,7 @@ static int asc_init_port(struct asc_port *ascport,
        port->irq       = platform_get_irq(pdev, 0);
        port->has_sysrq = IS_ENABLED(CONFIG_SERIAL_ST_ASC_CONSOLE);
 
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       port->membase = devm_ioremap_resource(&pdev->dev, res);
+       port->membase = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
        if (IS_ERR(port->membase))
                return PTR_ERR(port->membase);
        port->mapbase = res->start;
@@ -704,7 +703,9 @@ static int asc_init_port(struct asc_port *ascport,
        if (WARN_ON(IS_ERR(ascport->clk)))
                return -EINVAL;
        /* ensure that clk rate is correct by enabling the clk */
-       clk_prepare_enable(ascport->clk);
+       ret = clk_prepare_enable(ascport->clk);
+       if (ret)
+               return ret;
        ascport->port.uartclk = clk_get_rate(ascport->clk);
        WARN_ON(ascport->port.uartclk == 0);
        clk_disable_unprepare(ascport->clk);
index e9e11a2..be47cd3 100644 (file)
@@ -321,7 +321,7 @@ static bool stm32_usart_pending_rx_pio(struct uart_port *port, u32 *sr)
        return false;
 }
 
-static unsigned long stm32_usart_get_char_pio(struct uart_port *port)
+static u8 stm32_usart_get_char_pio(struct uart_port *port)
 {
        struct stm32_port *stm32_port = to_stm32_port(port);
        const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
@@ -338,10 +338,9 @@ static unsigned int stm32_usart_receive_chars_pio(struct uart_port *port)
 {
        struct stm32_port *stm32_port = to_stm32_port(port);
        const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
-       unsigned long c;
        unsigned int size = 0;
        u32 sr;
-       char flag;
+       u8 c, flag;
 
        while (stm32_usart_pending_rx_pio(port, &sr)) {
                sr |= USART_SR_DUMMY_RX;
index 7d38c33..c671d67 100644 (file)
 #include <linux/slab.h>
 #include <linux/delay.h>
 #include <linux/init.h>
-#include <linux/of_device.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
 
 #include <asm/hypervisor.h>
 #include <asm/spitfire.h>
-#include <asm/prom.h>
 #include <asm/irq.h>
 #include <asm/setup.h>
 
index 727942c..3aacd5e 100644 (file)
@@ -231,7 +231,7 @@ static void transmit_chars(struct uart_port *port)
 static void receive_chars(struct uart_port *port)
 {
        unsigned int lsr = readl(port->membase + SUP_UART_LSR);
-       unsigned int ch, flag;
+       u8 ch, flag;
 
        do {
                ch = readl(port->membase + SUP_UART_DATA);
index 48b39fd..40eeaf8 100644 (file)
@@ -33,7 +33,8 @@
 #include <linux/slab.h>
 #include <linux/delay.h>
 #include <linux/init.h>
-#include <linux/of_device.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
 
 #include <linux/io.h>
 #include <asm/irq.h>
index fed052a..58a4342 100644 (file)
 #include <linux/serial_reg.h>
 #include <linux/init.h>
 #include <linux/delay.h>
-#include <linux/of_device.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
 
 #include <linux/io.h>
 #include <asm/irq.h>
-#include <asm/prom.h>
 #include <asm/setup.h>
 
 #include <linux/serial_core.h>
index 0fbeb3d..c8c71c5 100644 (file)
 #include <linux/serio.h>
 #endif
 #include <linux/init.h>
-#include <linux/of_device.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
 
 #include <linux/io.h>
 #include <asm/irq.h>
-#include <asm/prom.h>
 #include <asm/setup.h>
 
 #include <linux/serial_core.h>
index 23500b3..65069da 100644 (file)
@@ -7,7 +7,6 @@
 #include <linux/mailbox_client.h>
 #include <linux/module.h>
 #include <linux/of.h>
-#include <linux/of_device.h>
 #include <linux/platform_device.h>
 #include <linux/serial.h>
 #include <linux/serial_core.h>
index 6795748..b225a78 100644 (file)
@@ -20,9 +20,6 @@
 #include <linux/io.h>
 #include <linux/iopoll.h>
 #include <linux/of.h>
-#include <linux/of_address.h>
-#include <linux/of_device.h>
-#include <linux/of_platform.h>
 #include <linux/clk.h>
 #include <linux/pm_runtime.h>
 
index 0a370b9..49457be 100644 (file)
  */
 
 #include <linux/module.h>
+#include <linux/platform_device.h>
 #include <linux/serial.h>
 #include <linux/serial_core.h>
 #include <linux/slab.h>
 #include <linux/tty.h>
 #include <linux/tty_flip.h>
 #include <linux/io.h>
+#include <linux/of.h>
 #include <linux/of_address.h>
 #include <linux/of_irq.h>
-#include <linux/of_platform.h>
 #include <linux/dma-mapping.h>
 
 #include <linux/fs_uart_pd.h>
index cc9157d..c5d5c27 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/irq.h>
 #include <linux/init.h>
 #include <linux/console.h>
+#include <linux/platform_device.h>
 #include <linux/tty.h>
 #include <linux/tty_flip.h>
 #include <linux/serial_core.h>
@@ -21,7 +22,6 @@
 #include <linux/slab.h>
 #include <linux/clk.h>
 #include <linux/of.h>
-#include <linux/of_device.h>
 #include <linux/err.h>
 
 /*
@@ -611,10 +611,6 @@ static int vt8500_serial_probe(struct platform_device *pdev)
        if (!flags)
                return -EINVAL;
 
-       mmres = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!mmres)
-               return -ENODEV;
-
        irq = platform_get_irq(pdev, 0);
        if (irq < 0)
                return irq;
@@ -647,7 +643,7 @@ static int vt8500_serial_probe(struct platform_device *pdev)
        if (!vt8500_port)
                return -ENOMEM;
 
-       vt8500_port->uart.membase = devm_ioremap_resource(&pdev->dev, mmres);
+       vt8500_port->uart.membase = devm_platform_get_and_ioremap_resource(pdev, 0, &mmres);
        if (IS_ERR(vt8500_port->uart.membase))
                return PTR_ERR(vt8500_port->uart.membase);
 
index 730c648..65ca4da 100644 (file)
@@ -539,8 +539,9 @@ static void zs_receive_chars(struct zs_port *zport)
        struct uart_port *uport = &zport->port;
        struct zs_scc *scc = zport->scc;
        struct uart_icount *icount;
-       unsigned int avail, status, ch, flag;
+       unsigned int avail, status;
        int count;
+       u8 ch, flag;
 
        for (count = 16; count; count--) {
                spin_lock(&scc->zlock);
index b6e70c5..28127bc 100644 (file)
@@ -98,14 +98,13 @@ static int __init sysrq_always_enabled_setup(char *str)
 __setup("sysrq_always_enabled", sysrq_always_enabled_setup);
 
 
-static void sysrq_handle_loglevel(int key)
+static void sysrq_handle_loglevel(u8 key)
 {
-       int i;
+       u8 loglevel = key - '0';
 
-       i = key - '0';
        console_loglevel = CONSOLE_LOGLEVEL_DEFAULT;
-       pr_info("Loglevel set to %d\n", i);
-       console_loglevel = i;
+       pr_info("Loglevel set to %u\n", loglevel);
+       console_loglevel = loglevel;
 }
 static const struct sysrq_key_op sysrq_loglevel_op = {
        .handler        = sysrq_handle_loglevel,
@@ -115,7 +114,7 @@ static const struct sysrq_key_op sysrq_loglevel_op = {
 };
 
 #ifdef CONFIG_VT
-static void sysrq_handle_SAK(int key)
+static void sysrq_handle_SAK(u8 key)
 {
        struct work_struct *SAK_work = &vc_cons[fg_console].SAK_work;
 
@@ -132,7 +131,7 @@ static const struct sysrq_key_op sysrq_SAK_op = {
 #endif
 
 #ifdef CONFIG_VT
-static void sysrq_handle_unraw(int key)
+static void sysrq_handle_unraw(u8 key)
 {
        vt_reset_unicode(fg_console);
 }
@@ -147,7 +146,7 @@ static const struct sysrq_key_op sysrq_unraw_op = {
 #define sysrq_unraw_op (*(const struct sysrq_key_op *)NULL)
 #endif /* CONFIG_VT */
 
-static void sysrq_handle_crash(int key)
+static void sysrq_handle_crash(u8 key)
 {
        /* release the RCU read lock before crashing */
        rcu_read_unlock();
@@ -161,7 +160,7 @@ static const struct sysrq_key_op sysrq_crash_op = {
        .enable_mask    = SYSRQ_ENABLE_DUMP,
 };
 
-static void sysrq_handle_reboot(int key)
+static void sysrq_handle_reboot(u8 key)
 {
        lockdep_off();
        local_irq_enable();
@@ -176,7 +175,7 @@ static const struct sysrq_key_op sysrq_reboot_op = {
 
 const struct sysrq_key_op *__sysrq_reboot_op = &sysrq_reboot_op;
 
-static void sysrq_handle_sync(int key)
+static void sysrq_handle_sync(u8 key)
 {
        emergency_sync();
 }
@@ -187,7 +186,7 @@ static const struct sysrq_key_op sysrq_sync_op = {
        .enable_mask    = SYSRQ_ENABLE_SYNC,
 };
 
-static void sysrq_handle_show_timers(int key)
+static void sysrq_handle_show_timers(u8 key)
 {
        sysrq_timer_list_show();
 }
@@ -198,7 +197,7 @@ static const struct sysrq_key_op sysrq_show_timers_op = {
        .action_msg     = "Show clockevent devices & pending hrtimers (no others)",
 };
 
-static void sysrq_handle_mountro(int key)
+static void sysrq_handle_mountro(u8 key)
 {
        emergency_remount();
 }
@@ -210,7 +209,7 @@ static const struct sysrq_key_op sysrq_mountro_op = {
 };
 
 #ifdef CONFIG_LOCKDEP
-static void sysrq_handle_showlocks(int key)
+static void sysrq_handle_showlocks(u8 key)
 {
        debug_show_all_locks();
 }
@@ -250,7 +249,7 @@ static void sysrq_showregs_othercpus(struct work_struct *dummy)
 
 static DECLARE_WORK(sysrq_showallcpus, sysrq_showregs_othercpus);
 
-static void sysrq_handle_showallcpus(int key)
+static void sysrq_handle_showallcpus(u8 key)
 {
        /*
         * Fall back to the workqueue based printing if the
@@ -283,7 +282,7 @@ static const struct sysrq_key_op sysrq_showallcpus_op = {
 #define sysrq_showallcpus_op (*(const struct sysrq_key_op *)NULL)
 #endif
 
-static void sysrq_handle_showregs(int key)
+static void sysrq_handle_showregs(u8 key)
 {
        struct pt_regs *regs = NULL;
 
@@ -300,7 +299,7 @@ static const struct sysrq_key_op sysrq_showregs_op = {
        .enable_mask    = SYSRQ_ENABLE_DUMP,
 };
 
-static void sysrq_handle_showstate(int key)
+static void sysrq_handle_showstate(u8 key)
 {
        show_state();
        show_all_workqueues();
@@ -312,7 +311,7 @@ static const struct sysrq_key_op sysrq_showstate_op = {
        .enable_mask    = SYSRQ_ENABLE_DUMP,
 };
 
-static void sysrq_handle_showstate_blocked(int key)
+static void sysrq_handle_showstate_blocked(u8 key)
 {
        show_state_filter(TASK_UNINTERRUPTIBLE);
 }
@@ -326,7 +325,7 @@ static const struct sysrq_key_op sysrq_showstate_blocked_op = {
 #ifdef CONFIG_TRACING
 #include <linux/ftrace.h>
 
-static void sysrq_ftrace_dump(int key)
+static void sysrq_ftrace_dump(u8 key)
 {
        ftrace_dump(DUMP_ALL);
 }
@@ -340,7 +339,7 @@ static const struct sysrq_key_op sysrq_ftrace_dump_op = {
 #define sysrq_ftrace_dump_op (*(const struct sysrq_key_op *)NULL)
 #endif
 
-static void sysrq_handle_showmem(int key)
+static void sysrq_handle_showmem(u8 key)
 {
        show_mem(0, NULL);
 }
@@ -370,7 +369,7 @@ static void send_sig_all(int sig)
        read_unlock(&tasklist_lock);
 }
 
-static void sysrq_handle_term(int key)
+static void sysrq_handle_term(u8 key)
 {
        send_sig_all(SIGTERM);
        console_loglevel = CONSOLE_LOGLEVEL_DEBUG;
@@ -401,7 +400,7 @@ static void moom_callback(struct work_struct *ignored)
 
 static DECLARE_WORK(moom_work, moom_callback);
 
-static void sysrq_handle_moom(int key)
+static void sysrq_handle_moom(u8 key)
 {
        schedule_work(&moom_work);
 }
@@ -413,7 +412,7 @@ static const struct sysrq_key_op sysrq_moom_op = {
 };
 
 #ifdef CONFIG_BLOCK
-static void sysrq_handle_thaw(int key)
+static void sysrq_handle_thaw(u8 key)
 {
        emergency_thaw_all();
 }
@@ -427,7 +426,7 @@ static const struct sysrq_key_op sysrq_thaw_op = {
 #define sysrq_thaw_op (*(const struct sysrq_key_op *)NULL)
 #endif
 
-static void sysrq_handle_kill(int key)
+static void sysrq_handle_kill(u8 key)
 {
        send_sig_all(SIGKILL);
        console_loglevel = CONSOLE_LOGLEVEL_DEBUG;
@@ -439,7 +438,7 @@ static const struct sysrq_key_op sysrq_kill_op = {
        .enable_mask    = SYSRQ_ENABLE_SIGNAL,
 };
 
-static void sysrq_handle_unrt(int key)
+static void sysrq_handle_unrt(u8 key)
 {
        normalize_rt_tasks();
 }
@@ -531,25 +530,24 @@ static const struct sysrq_key_op *sysrq_key_table[62] = {
 };
 
 /* key2index calculation, -1 on invalid index */
-static int sysrq_key_table_key2index(int key)
+static int sysrq_key_table_key2index(u8 key)
 {
-       int retval;
-
-       if ((key >= '0') && (key <= '9'))
-               retval = key - '0';
-       else if ((key >= 'a') && (key <= 'z'))
-               retval = key + 10 - 'a';
-       else if ((key >= 'A') && (key <= 'Z'))
-               retval = key + 36 - 'A';
-       else
-               retval = -1;
-       return retval;
+       switch (key) {
+       case '0' ... '9':
+               return key - '0';
+       case 'a' ... 'z':
+               return key - 'a' + 10;
+       case 'A' ... 'Z':
+               return key - 'A' + 10 + 26;
+       default:
+               return -1;
+       }
 }
 
 /*
  * get and put functions for the table, exposed to modules.
  */
-static const struct sysrq_key_op *__sysrq_get_key_op(int key)
+static const struct sysrq_key_op *__sysrq_get_key_op(u8 key)
 {
        const struct sysrq_key_op *op_p = NULL;
        int i;
@@ -561,7 +559,7 @@ static const struct sysrq_key_op *__sysrq_get_key_op(int key)
        return op_p;
 }
 
-static void __sysrq_put_key_op(int key, const struct sysrq_key_op *op_p)
+static void __sysrq_put_key_op(u8 key, const struct sysrq_key_op *op_p)
 {
        int i = sysrq_key_table_key2index(key);
 
@@ -569,7 +567,7 @@ static void __sysrq_put_key_op(int key, const struct sysrq_key_op *op_p)
                sysrq_key_table[i] = op_p;
 }
 
-void __handle_sysrq(int key, bool check_mask)
+void __handle_sysrq(u8 key, bool check_mask)
 {
        const struct sysrq_key_op *op_p;
        int orig_log_level;
@@ -628,7 +626,7 @@ void __handle_sysrq(int key, bool check_mask)
        suppress_printk = orig_suppress_printk;
 }
 
-void handle_sysrq(int key)
+void handle_sysrq(u8 key)
 {
        if (sysrq_on())
                __handle_sysrq(key, true);
@@ -1112,7 +1110,7 @@ int sysrq_toggle_support(int enable_mask)
 }
 EXPORT_SYMBOL_GPL(sysrq_toggle_support);
 
-static int __sysrq_swap_key_ops(int key, const struct sysrq_key_op *insert_op_p,
+static int __sysrq_swap_key_ops(u8 key, const struct sysrq_key_op *insert_op_p,
                                const struct sysrq_key_op *remove_op_p)
 {
        int retval;
@@ -1136,13 +1134,13 @@ static int __sysrq_swap_key_ops(int key, const struct sysrq_key_op *insert_op_p,
        return retval;
 }
 
-int register_sysrq_key(int key, const struct sysrq_key_op *op_p)
+int register_sysrq_key(u8 key, const struct sysrq_key_op *op_p)
 {
        return __sysrq_swap_key_ops(key, op_p, NULL);
 }
 EXPORT_SYMBOL(register_sysrq_key);
 
-int unregister_sysrq_key(int key, const struct sysrq_key_op *op_p)
+int unregister_sysrq_key(u8 key, const struct sysrq_key_op *op_p)
 {
        return __sysrq_swap_key_ops(key, NULL, op_p);
 }
index 63db04b..eb4e2e0 100644 (file)
@@ -270,7 +270,7 @@ static int tty_paranoia_check(struct tty_struct *tty, struct inode *inode,
 }
 
 /* Caller must hold tty_lock */
-static int check_tty_count(struct tty_struct *tty, const char *routine)
+static void check_tty_count(struct tty_struct *tty, const char *routine)
 {
 #ifdef CHECK_TTY_COUNT
        struct list_head *p;
@@ -290,10 +290,8 @@ static int check_tty_count(struct tty_struct *tty, const char *routine)
        if (tty->count != (count + kopen_count)) {
                tty_warn(tty, "%s: tty->count(%d) != (#fd's(%d) + #kopen's(%d))\n",
                         routine, tty->count, count, kopen_count);
-               return (count + kopen_count);
        }
 #endif
-       return 0;
 }
 
 /**
index 2dc75df..16608ce 100644 (file)
 #define PCI_SUBDEVICE_ID_AT_2700FX     0x2701
 #define PCI_SUBDEVICE_ID_AT_2701FX     0x2703
 
+#define PCI_VENDOR_ID_ASIX             0x125b
+#define PCI_DEVICE_ID_ASIX_AX99100     0x9100
+#define PCI_DEVICE_ID_ASIX_AX99100_LB  0x9110
+
 #define PCI_VENDOR_ID_ESS              0x125d
 #define PCI_DEVICE_ID_ESS_ESS1968      0x1968
 #define PCI_DEVICE_ID_ESS_ESS1978      0x1978
index 6d58c57..105d2cd 100644 (file)
@@ -569,7 +569,7 @@ struct uart_port {
        struct serial_port_device *port_dev;            /* serial core port device */
 
        unsigned long           sysrq;                  /* sysrq timeout */
-       unsigned int            sysrq_ch;               /* char for sysrq */
+       u8                      sysrq_ch;               /* char for sysrq */
        unsigned char           has_sysrq;
        unsigned char           sysrq_seq;              /* index in sysrq_toggle_seq */
 
@@ -903,16 +903,16 @@ void uart_handle_dcd_change(struct uart_port *uport, bool active);
 void uart_handle_cts_change(struct uart_port *uport, bool active);
 
 void uart_insert_char(struct uart_port *port, unsigned int status,
-                     unsigned int overrun, unsigned int ch, unsigned int flag);
+                     unsigned int overrun, u8 ch, u8 flag);
 
 void uart_xchar_out(struct uart_port *uport, int offset);
 
 #ifdef CONFIG_MAGIC_SYSRQ_SERIAL
 #define SYSRQ_TIMEOUT  (HZ * 5)
 
-bool uart_try_toggle_sysrq(struct uart_port *port, unsigned int ch);
+bool uart_try_toggle_sysrq(struct uart_port *port, u8 ch);
 
-static inline int uart_handle_sysrq_char(struct uart_port *port, unsigned int ch)
+static inline int uart_handle_sysrq_char(struct uart_port *port, u8 ch)
 {
        if (!port->sysrq)
                return 0;
@@ -931,7 +931,7 @@ static inline int uart_handle_sysrq_char(struct uart_port *port, unsigned int ch
        return 0;
 }
 
-static inline int uart_prepare_sysrq_char(struct uart_port *port, unsigned int ch)
+static inline int uart_prepare_sysrq_char(struct uart_port *port, u8 ch)
 {
        if (!port->sysrq)
                return 0;
@@ -952,7 +952,7 @@ static inline int uart_prepare_sysrq_char(struct uart_port *port, unsigned int c
 
 static inline void uart_unlock_and_check_sysrq(struct uart_port *port)
 {
-       int sysrq_ch;
+       u8 sysrq_ch;
 
        if (!port->has_sysrq) {
                spin_unlock(&port->lock);
@@ -971,7 +971,7 @@ static inline void uart_unlock_and_check_sysrq(struct uart_port *port)
 static inline void uart_unlock_and_check_sysrq_irqrestore(struct uart_port *port,
                unsigned long flags)
 {
-       int sysrq_ch;
+       u8 sysrq_ch;
 
        if (!port->has_sysrq) {
                spin_unlock_irqrestore(&port->lock, flags);
@@ -987,11 +987,11 @@ static inline void uart_unlock_and_check_sysrq_irqrestore(struct uart_port *port
                handle_sysrq(sysrq_ch);
 }
 #else  /* CONFIG_MAGIC_SYSRQ_SERIAL */
-static inline int uart_handle_sysrq_char(struct uart_port *port, unsigned int ch)
+static inline int uart_handle_sysrq_char(struct uart_port *port, u8 ch)
 {
        return 0;
 }
-static inline int uart_prepare_sysrq_char(struct uart_port *port, unsigned int ch)
+static inline int uart_prepare_sysrq_char(struct uart_port *port, u8 ch)
 {
        return 0;
 }
index 3a582ec..bdca467 100644 (file)
@@ -30,7 +30,7 @@
 #define SYSRQ_ENABLE_RTNICE    0x0100
 
 struct sysrq_key_op {
-       void (* const handler)(int);
+       void (* const handler)(u8);
        const char * const help_msg;
        const char * const action_msg;
        const int enable_mask;
@@ -43,10 +43,10 @@ struct sysrq_key_op {
  * are available -- else NULL's).
  */
 
-void handle_sysrq(int key);
-void __handle_sysrq(int key, bool check_mask);
-int register_sysrq_key(int key, const struct sysrq_key_op *op);
-int unregister_sysrq_key(int key, const struct sysrq_key_op *op);
+void handle_sysrq(u8 key);
+void __handle_sysrq(u8 key, bool check_mask);
+int register_sysrq_key(u8 key, const struct sysrq_key_op *op);
+int unregister_sysrq_key(u8 key, const struct sysrq_key_op *op);
 extern const struct sysrq_key_op *__sysrq_reboot_op;
 
 int sysrq_toggle_support(int enable_mask);
@@ -54,20 +54,20 @@ int sysrq_mask(void);
 
 #else
 
-static inline void handle_sysrq(int key)
+static inline void handle_sysrq(u8 key)
 {
 }
 
-static inline void __handle_sysrq(int key, bool check_mask)
+static inline void __handle_sysrq(u8 key, bool check_mask)
 {
 }
 
-static inline int register_sysrq_key(int key, const struct sysrq_key_op *op)
+static inline int register_sysrq_key(u8 key, const struct sysrq_key_op *op)
 {
        return -EINVAL;
 }
 
-static inline int unregister_sysrq_key(int key, const struct sysrq_key_op *op)
+static inline int unregister_sysrq_key(u8 key, const struct sysrq_key_op *op)
 {
        return -EINVAL;
 }
index d5e9ccd..621037a 100644 (file)
@@ -968,7 +968,7 @@ static int __init opt_kgdb_con(char *str)
 early_param("kgdbcon", opt_kgdb_con);
 
 #ifdef CONFIG_MAGIC_SYSRQ
-static void sysrq_handle_dbg(int key)
+static void sysrq_handle_dbg(u8 key)
 {
        if (!dbg_io_ops) {
                pr_crit("ERROR: No KGDB I/O module available\n");
index 562aa0e..1f306f1 100644 (file)
@@ -23,7 +23,7 @@ static void do_poweroff(struct work_struct *dummy)
 
 static DECLARE_WORK(poweroff_work, do_poweroff);
 
-static void handle_poweroff(int key)
+static void handle_poweroff(u8 key)
 {
        /* run sysrq poweroff on boot cpu */
        schedule_work_on(cpumask_first(cpu_online_mask), &poweroff_work);
index b10b834..6f06dc1 100644 (file)
@@ -1035,7 +1035,7 @@ static bool sysrq_rcu;
 module_param(sysrq_rcu, bool, 0444);
 
 /* Dump grace-period-request information due to commandeered sysrq. */
-static void sysrq_show_rcu(int key)
+static void sysrq_show_rcu(u8 key)
 {
        show_rcu_gp_kthreads();
 }