]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
Merge 4.11-rc4 into tty-next
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 29 Mar 2017 06:58:53 +0000 (08:58 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 29 Mar 2017 06:58:53 +0000 (08:58 +0200)
We want the tty/serial fixes in here to handle bugfixes and merge
issues.

Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
19 files changed:
MAINTAINERS
drivers/tty/hvc/hvcs.c
drivers/tty/n_gsm.c
drivers/tty/pty.c
drivers/tty/serial/8250/8250_core.c
drivers/tty/serial/8250/8250_dw.c
drivers/tty/serial/8250/8250_exar.c
drivers/tty/serial/8250/8250_fintek.c
drivers/tty/serial/Kconfig
drivers/tty/serial/altera_jtaguart.c
drivers/tty/serial/atmel_serial.c
drivers/tty/serial/atmel_serial.h [moved from include/linux/atmel_serial.h with 100% similarity]
drivers/tty/serial/sb1250-duart.c
drivers/tty/serial/serial_core.c
drivers/tty/serial/sh-sci.c
drivers/tty/serial/uartlite.c
drivers/tty/serial/xilinx_uartps.c
drivers/tty/tty_io.c
include/linux/serdev.h

index c45c02bc6082f322bdfefe8cccb52897e49eae4b..e2f73512fee383f87b54ec20fc43c26ecedf3502 100644 (file)
@@ -8277,7 +8277,7 @@ MICROCHIP / ATMEL AT91 / AT32 SERIAL DRIVER
 M:     Richard Genoud <richard.genoud@gmail.com>
 S:     Maintained
 F:     drivers/tty/serial/atmel_serial.c
-F:     include/linux/atmel_serial.h
+F:     drivers/tty/serial/atmel_serial.h
 
 MICROCHIP / ATMEL DMA DRIVER
 M:     Ludovic Desroches <ludovic.desroches@microchip.com>
index 7823d6d998cfd8ca70ab32eb2f51f43c34ef9f3c..99bb875178d7170f50d6500a3d6ec5fb8be757b0 100644 (file)
@@ -1575,7 +1575,7 @@ static int __init hvcs_module_init(void)
         */
        rc = driver_create_file(&(hvcs_vio_driver.driver), &driver_attr_rescan);
        if (rc)
-               pr_warning("HVCS: Failed to create rescan file (err %d)\n", rc);
+               pr_warn("HVCS: Failed to create rescan file (err %d)\n", rc);
 
        return 0;
 }
index 55577cf9b6a4e0eba43462bba0bd5b5039172f17..2667a205a5abcf47ed4ab059ff350b5f35ea3fe1 100644 (file)
@@ -89,18 +89,14 @@ module_param(debug, int, 0600);
 /**
  *     struct gsm_mux_net      -       network interface
  *     @struct gsm_dlci* dlci
- *     @struct net_device_stats stats;
  *
  *     Created when net interface is initialized.
  **/
 struct gsm_mux_net {
        struct kref ref;
        struct gsm_dlci *dlci;
-       struct net_device_stats stats;
 };
 
-#define STATS(net) (((struct gsm_mux_net *)netdev_priv(net))->stats)
-
 /*
  *     Each block of data we have queued to go out is in the form of
  *     a gsm_msg which holds everything we need in a link layer independent
@@ -2613,10 +2609,6 @@ static int gsm_mux_net_close(struct net_device *net)
        return 0;
 }
 
-static struct net_device_stats *gsm_mux_net_get_stats(struct net_device *net)
-{
-       return &((struct gsm_mux_net *)netdev_priv(net))->stats;
-}
 static void dlci_net_free(struct gsm_dlci *dlci)
 {
        if (!dlci->net) {
@@ -2660,8 +2652,8 @@ static int gsm_mux_net_start_xmit(struct sk_buff *skb,
        muxnet_get(mux_net);
 
        skb_queue_head(&dlci->skb_list, skb);
-       STATS(net).tx_packets++;
-       STATS(net).tx_bytes += skb->len;
+       net->stats.tx_packets++;
+       net->stats.tx_bytes += skb->len;
        gsm_dlci_data_kick(dlci);
        /* And tell the kernel when the last transmit started. */
        netif_trans_update(net);
@@ -2676,7 +2668,7 @@ static void gsm_mux_net_tx_timeout(struct net_device *net)
        dev_dbg(&net->dev, "Tx timed out.\n");
 
        /* Update statistics */
-       STATS(net).tx_errors++;
+       net->stats.tx_errors++;
 }
 
 static void gsm_mux_rx_netchar(struct gsm_dlci *dlci,
@@ -2691,7 +2683,7 @@ static void gsm_mux_rx_netchar(struct gsm_dlci *dlci,
        skb = dev_alloc_skb(size + NET_IP_ALIGN);
        if (!skb) {
                /* We got no receive buffer. */
-               STATS(net).rx_dropped++;
+               net->stats.rx_dropped++;
                muxnet_put(mux_net);
                return;
        }
@@ -2705,8 +2697,8 @@ static void gsm_mux_rx_netchar(struct gsm_dlci *dlci,
        netif_rx(skb);
 
        /* update out statistics */
-       STATS(net).rx_packets++;
-       STATS(net).rx_bytes += size;
+       net->stats.rx_packets++;
+       net->stats.rx_bytes += size;
        muxnet_put(mux_net);
        return;
 }
@@ -2718,7 +2710,6 @@ static void gsm_mux_net_init(struct net_device *net)
                .ndo_stop               = gsm_mux_net_close,
                .ndo_start_xmit         = gsm_mux_net_start_xmit,
                .ndo_tx_timeout         = gsm_mux_net_tx_timeout,
-               .ndo_get_stats          = gsm_mux_net_get_stats,
        };
 
        net->netdev_ops = &gsm_netdev_ops;
index 66b59a15780db0c33021d32251ecb9886c758703..65799575c66681184057cc0565e5a45bcdd25681 100644 (file)
@@ -216,16 +216,11 @@ static int pty_signal(struct tty_struct *tty, int sig)
 static void pty_flush_buffer(struct tty_struct *tty)
 {
        struct tty_struct *to = tty->link;
-       struct tty_ldisc *ld;
 
        if (!to)
                return;
 
-       ld = tty_ldisc_ref(to);
-       tty_buffer_flush(to, ld);
-       if (ld)
-               tty_ldisc_deref(ld);
-
+       tty_buffer_flush(to, NULL);
        if (to->packet) {
                spin_lock_irq(&tty->ctrl_lock);
                tty->ctrl_status |= TIOCPKT_FLUSHWRITE;
index 76e03a7de9cc3d790a230948f599ef2db4b93249..f83b69f30987a774f451013f792b2ca93644706b 100644 (file)
@@ -218,7 +218,7 @@ static int serial_link_irq_chain(struct uart_8250_port *up)
                spin_unlock_irq(&i->lock);
                irq_flags |= up->port.irqflags;
                ret = request_irq(up->port.irq, serial8250_interrupt,
-                                 irq_flags, "serial", i);
+                                 irq_flags, dev_name(up->port.dev), i);
                if (ret < 0)
                        serial_do_unlink(i, up);
        }
index e65808c482f1847d09d819a24defb0e5cf6508b5..787b1160d3a535aceafc40f742652deb9d5f2182 100644 (file)
@@ -530,12 +530,11 @@ static int dw8250_probe(struct platform_device *pdev)
        }
 
        data->rst = devm_reset_control_get_optional(dev, NULL);
-       if (IS_ERR(data->rst) && PTR_ERR(data->rst) == -EPROBE_DEFER) {
-               err = -EPROBE_DEFER;
+       if (IS_ERR(data->rst)) {
+               err = PTR_ERR(data->rst);
                goto err_pclk;
        }
-       if (!IS_ERR(data->rst))
-               reset_control_deassert(data->rst);
+       reset_control_deassert(data->rst);
 
        dw8250_quirks(p, data);
 
@@ -567,8 +566,7 @@ static int dw8250_probe(struct platform_device *pdev)
        return 0;
 
 err_reset:
-       if (!IS_ERR(data->rst))
-               reset_control_assert(data->rst);
+       reset_control_assert(data->rst);
 
 err_pclk:
        if (!IS_ERR(data->pclk))
@@ -589,8 +587,7 @@ static int dw8250_remove(struct platform_device *pdev)
 
        serial8250_unregister_port(data->line);
 
-       if (!IS_ERR(data->rst))
-               reset_control_assert(data->rst);
+       reset_control_assert(data->rst);
 
        if (!IS_ERR(data->pclk))
                clk_disable_unprepare(data->pclk);
index b89c4ffc048655dc65c241afef5bfb21c13841bd..1270ff163f637bf5c61f7cbf3ad3ff51c69366b9 100644 (file)
@@ -483,5 +483,5 @@ static struct pci_driver exar_pci_driver = {
 module_pci_driver(exar_pci_driver);
 
 MODULE_LICENSE("GPL");
-MODULE_DESCRIPTION("Exar Serial Dricer");
+MODULE_DESCRIPTION("Exar Serial Driver");
 MODULE_AUTHOR("Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>");
index b67e7a5449353ca8ac2f3a67e0af132517c4f643..e500f7dd2470a28254b1d8d57374a4fbd0fc02fa 100644 (file)
  * The IRQ setting mode of F81866 is not the same with F81216 series.
  *     Level/Low: IRQ_MODE0:0, IRQ_MODE1:0
  *     Edge/High: IRQ_MODE0:1, IRQ_MODE1:0
+ *
+ * Clock speeds for UART (register F2h)
+ * 00: 1.8432MHz.
+ * 01: 18.432MHz.
+ * 10: 24MHz.
+ * 11: 14.769MHz.
  */
 #define F81866_IRQ_MODE                0xf0
 #define F81866_IRQ_SHARE       BIT(0)
 #define F81866_LDN_LOW         0x10
 #define F81866_LDN_HIGH                0x16
 
+#define F81866_UART_CLK 0xF2
+#define F81866_UART_CLK_MASK (BIT(1) | BIT(0))
+#define F81866_UART_CLK_1_8432MHZ 0
+#define F81866_UART_CLK_14_769MHZ (BIT(1) | BIT(0))
+#define F81866_UART_CLK_18_432MHZ BIT(0)
+#define F81866_UART_CLK_24MHZ BIT(1)
+
 struct fintek_8250 {
        u16 pid;
        u16 base_port;
@@ -256,8 +269,26 @@ static void fintek_8250_set_max_fifo(struct fintek_8250 *pdata)
        }
 }
 
-static int probe_setup_port(struct fintek_8250 *pdata, u16 io_address,
-                         unsigned int irq)
+static void fintek_8250_goto_highspeed(struct uart_8250_port *uart,
+                             struct fintek_8250 *pdata)
+{
+       sio_write_reg(pdata, LDN, pdata->index);
+
+       switch (pdata->pid) {
+       case CHIP_ID_F81866: /* set uart clock for high speed serial mode */
+               sio_write_mask_reg(pdata, F81866_UART_CLK,
+                       F81866_UART_CLK_MASK,
+                       F81866_UART_CLK_14_769MHZ);
+
+                       uart->port.uartclk = 921600 * 16;
+               break;
+       default: /* leave clock speed untouched */
+               break;
+       }
+}
+
+static int probe_setup_port(struct fintek_8250 *pdata,
+                                       struct uart_8250_port *uart)
 {
        static const u16 addr[] = {0x4e, 0x2e};
        static const u8 keys[] = {0x77, 0xa0, 0x87, 0x67};
@@ -284,18 +315,20 @@ static int probe_setup_port(struct fintek_8250 *pdata, u16 io_address,
                                sio_write_reg(pdata, LDN, k);
                                aux = sio_read_reg(pdata, IO_ADDR1);
                                aux |= sio_read_reg(pdata, IO_ADDR2) << 8;
-                               if (aux != io_address)
+                               if (aux != uart->port.iobase)
                                        continue;
 
                                pdata->index = k;
 
-                               irq_data = irq_get_irq_data(irq);
+                               irq_data = irq_get_irq_data(uart->port.irq);
                                if (irq_data)
                                        level_mode =
                                                irqd_is_level_type(irq_data);
 
                                fintek_8250_set_irq_mode(pdata, level_mode);
                                fintek_8250_set_max_fifo(pdata);
+                               fintek_8250_goto_highspeed(uart, pdata);
+
                                fintek_8250_exit_key(addr[i]);
 
                                return 0;
@@ -330,7 +363,7 @@ int fintek_8250_probe(struct uart_8250_port *uart)
        struct fintek_8250 *pdata;
        struct fintek_8250 probe_data;
 
-       if (probe_setup_port(&probe_data, uart->port.iobase, uart->port.irq))
+       if (probe_setup_port(&probe_data, uart))
                return -ENODEV;
 
        pdata = devm_kzalloc(uart->port.dev, sizeof(*pdata), GFP_KERNEL);
index 6117ac8da48f739fc4bf904b5a52db31b5861b50..896f5eb78da0e133c9d04714588343957450b400 100644 (file)
@@ -630,6 +630,15 @@ config SERIAL_UARTLITE_CONSOLE
          console (the system console is the device which receives all kernel
          messages and warnings and which allows logins in single user mode).
 
+config SERIAL_UARTLITE_NR_UARTS
+       int "Maximum number of uartlite serial ports"
+       depends on SERIAL_UARTLITE
+       range 1 256
+       default 1
+       help
+         Set this to the number of uartlites in your system, or the number
+         you think you might implement.
+
 config SERIAL_SUNCORE
        bool
        depends on SPARC
@@ -1343,6 +1352,7 @@ config SERIAL_ALTERA_JTAGUART_CONSOLE
        bool "Altera JTAG UART console support"
        depends on SERIAL_ALTERA_JTAGUART=y
        select SERIAL_CORE_CONSOLE
+       select SERIAL_EARLYCON
        help
          Enable a Altera JTAG UART port to be the system console.
 
index e409d7dac7abfd5800a5b9a56d013cb569ca26f1..18e3f8342b8554ae4e7d414dd39653fb3a33b26f 100644 (file)
@@ -383,6 +383,26 @@ console_initcall(altera_jtaguart_console_init);
 
 #define        ALTERA_JTAGUART_CONSOLE (&altera_jtaguart_console)
 
+static void altera_jtaguart_earlycon_write(struct console *co, const char *s,
+                                          unsigned int count)
+{
+       struct earlycon_device *dev = co->data;
+
+       uart_console_write(&dev->port, s, count, altera_jtaguart_console_putc);
+}
+
+static int __init altera_jtaguart_earlycon_setup(struct earlycon_device *dev,
+                                                const char *options)
+{
+       if (!dev->port.membase)
+               return -ENODEV;
+
+       dev->con->write = altera_jtaguart_earlycon_write;
+       return 0;
+}
+
+OF_EARLYCON_DECLARE(juart, "altr,juart-1.0", altera_jtaguart_earlycon_setup);
+
 #else
 
 #define        ALTERA_JTAGUART_CONSOLE NULL
index dcebb28ffbc412d5282ef32b7f3c133ff984ab46..d9c05e05d8965b95a3f51ae3150198e441e539a1 100644 (file)
@@ -38,7 +38,6 @@
 #include <linux/dma-mapping.h>
 #include <linux/dmaengine.h>
 #include <linux/atmel_pdc.h>
-#include <linux/atmel_serial.h>
 #include <linux/uaccess.h>
 #include <linux/platform_data/atmel.h>
 #include <linux/timer.h>
@@ -71,6 +70,7 @@
 #include <linux/serial_core.h>
 
 #include "serial_mctrl_gpio.h"
+#include "atmel_serial.h"
 
 static void atmel_start_rx(struct uart_port *port);
 static void atmel_stop_rx(struct uart_port *port);
@@ -119,8 +119,9 @@ struct atmel_uart_char {
 /*
  * at91: 6 USARTs and one DBGU port (SAM9260)
  * avr32: 4
+ * samx7: 3 USARTs and 5 UARTs
  */
-#define ATMEL_MAX_UART         7
+#define ATMEL_MAX_UART         8
 
 /*
  * We wrap our port structure around the generic uart_port.
@@ -175,6 +176,7 @@ struct atmel_uart_port {
        unsigned int            pending_status;
        spinlock_t              lock_suspended;
 
+#ifdef CONFIG_PM
        struct {
                u32             cr;
                u32             mr;
@@ -185,6 +187,7 @@ struct atmel_uart_port {
                u32             fmr;
                u32             fimr;
        } cache;
+#endif
 
        int (*prepare_rx)(struct uart_port *port);
        int (*prepare_tx)(struct uart_port *port);
index 771f361c47ea17850cf4b946d135795e100c0865..041625cc24bbe736cdc021fa0385fbe332f2d792 100644 (file)
@@ -41,7 +41,7 @@
 #include <linux/tty_flip.h>
 #include <linux/types.h>
 
-#include <linux/atomic.h>
+#include <linux/refcount.h>
 #include <asm/io.h>
 #include <asm/war.h>
 
@@ -103,7 +103,7 @@ struct sbd_port {
 struct sbd_duart {
        struct sbd_port         sport[2];
        unsigned long           mapctrl;
-       atomic_t                map_guard;
+       refcount_t              map_guard;
 };
 
 #define to_sport(uport) container_of(uport, struct sbd_port, port)
@@ -654,15 +654,13 @@ static void sbd_release_port(struct uart_port *uport)
 {
        struct sbd_port *sport = to_sport(uport);
        struct sbd_duart *duart = sport->duart;
-       int map_guard;
 
        iounmap(sport->memctrl);
        sport->memctrl = NULL;
        iounmap(uport->membase);
        uport->membase = NULL;
 
-       map_guard = atomic_add_return(-1, &duart->map_guard);
-       if (!map_guard)
+       if(refcount_dec_and_test(&duart->map_guard))
                release_mem_region(duart->mapctrl, DUART_CHANREG_SPACING);
        release_mem_region(uport->mapbase, DUART_CHANREG_SPACING);
 }
@@ -698,7 +696,6 @@ static int sbd_request_port(struct uart_port *uport)
 {
        const char *err = KERN_ERR "sbd: Unable to reserve MMIO resource\n";
        struct sbd_duart *duart = to_sport(uport)->duart;
-       int map_guard;
        int ret = 0;
 
        if (!request_mem_region(uport->mapbase, DUART_CHANREG_SPACING,
@@ -706,11 +703,11 @@ static int sbd_request_port(struct uart_port *uport)
                printk(err);
                return -EBUSY;
        }
-       map_guard = atomic_add_return(1, &duart->map_guard);
-       if (map_guard == 1) {
+       refcount_inc(&duart->map_guard);
+       if (refcount_read(&duart->map_guard) == 1) {
                if (!request_mem_region(duart->mapctrl, DUART_CHANREG_SPACING,
                                        "sb1250-duart")) {
-                       atomic_add(-1, &duart->map_guard);
+                       refcount_dec(&duart->map_guard);
                        printk(err);
                        ret = -EBUSY;
                }
@@ -718,8 +715,7 @@ static int sbd_request_port(struct uart_port *uport)
        if (!ret) {
                ret = sbd_map_port(uport);
                if (ret) {
-                       map_guard = atomic_add_return(-1, &duart->map_guard);
-                       if (!map_guard)
+                       if (refcount_dec_and_test(&duart->map_guard))
                                release_mem_region(duart->mapctrl,
                                                   DUART_CHANREG_SPACING);
                }
index 3fe56894974a7c4c3ae04a4d54946043be1d243c..0fb3f7cce62ac720089b3c53a756a47315ba6c6c 100644 (file)
@@ -2331,9 +2331,6 @@ static int uart_poll_init(struct tty_driver *driver, int line, char *options)
        int flow = 'n';
        int ret = 0;
 
-       if (!state)
-               return -1;
-
        tport = &state->port;
        mutex_lock(&tport->mutex);
 
@@ -2368,13 +2365,12 @@ static int uart_poll_get_char(struct tty_driver *driver, int line)
        struct uart_port *port;
        int ret = -1;
 
-       if (state) {
-               port = uart_port_ref(state);
-               if (port) {
-                       ret = port->ops->poll_get_char(port);
-                       uart_port_deref(port);
-               }
+       port = uart_port_ref(state);
+       if (port) {
+               ret = port->ops->poll_get_char(port);
+               uart_port_deref(port);
        }
+
        return ret;
 }
 
@@ -2384,9 +2380,6 @@ static void uart_poll_put_char(struct tty_driver *driver, int line, char ch)
        struct uart_state *state = drv->state + line;
        struct uart_port *port;
 
-       if (!state)
-               return;
-
        port = uart_port_ref(state);
        if (!port)
                return;
index 9a47cc4f16a2798f7c0a084d44621d371a2f59a9..1df57461ece4337b12176473c8fd7391790497e1 100644 (file)
@@ -1985,11 +1985,13 @@ static int sci_startup(struct uart_port *port)
 
        dev_dbg(port->dev, "%s(%d)\n", __func__, port->line);
 
+       sci_request_dma(port);
+
        ret = sci_request_irq(s);
-       if (unlikely(ret < 0))
+       if (unlikely(ret < 0)) {
+               sci_free_dma(port);
                return ret;
-
-       sci_request_dma(port);
+       }
 
        return 0;
 }
@@ -2021,8 +2023,8 @@ static void sci_shutdown(struct uart_port *port)
        }
 #endif
 
-       sci_free_dma(port);
        sci_free_irq(s);
+       sci_free_dma(port);
 }
 
 static int sci_sck_calc(struct sci_port *s, unsigned int bps,
index 817bb0d3f326ed982631c135ddd5f7a4b170b7a5..c9b8d702dadc35abcb6f3b74a07f62e836b2f9e2 100644 (file)
@@ -28,7 +28,7 @@
 #define ULITE_NAME             "ttyUL"
 #define ULITE_MAJOR            204
 #define ULITE_MINOR            187
-#define ULITE_NR_UARTS         16
+#define ULITE_NR_UARTS         CONFIG_SERIAL_UARTLITE_NR_UARTS
 
 /* ---------------------------------------------------------------------
  * Register definitions
index ad77d0ed0c467dbc2b20f41a9959ed10cf3e8390..a83033774382990b8a2948f1ce78e0e87055c769 100644 (file)
@@ -30,6 +30,7 @@
 #include <linux/io.h>
 #include <linux/of.h>
 #include <linux/module.h>
+#include <linux/pm_runtime.h>
 
 #define CDNS_UART_TTY_NAME     "ttyPS"
 #define CDNS_UART_NAME         "xuartps"
@@ -176,6 +177,7 @@ MODULE_PARM_DESC(rx_timeout, "Rx timeout, 1-255");
 #define CDNS_UART_BDIV_MIN     4
 #define CDNS_UART_BDIV_MAX     255
 #define CDNS_UART_CD_MAX       65535
+#define UART_AUTOSUSPEND_TIMEOUT       3000
 
 /**
  * struct cdns_uart - device data
@@ -1065,16 +1067,13 @@ static void cdns_uart_poll_put_char(struct uart_port *port, unsigned char c)
 static void cdns_uart_pm(struct uart_port *port, unsigned int state,
                   unsigned int oldstate)
 {
-       struct cdns_uart *cdns_uart = port->private_data;
-
        switch (state) {
        case UART_PM_STATE_OFF:
-               clk_disable(cdns_uart->uartclk);
-               clk_disable(cdns_uart->pclk);
+               pm_runtime_mark_last_busy(port->dev);
+               pm_runtime_put_autosuspend(port->dev);
                break;
        default:
-               clk_enable(cdns_uart->pclk);
-               clk_enable(cdns_uart->uartclk);
+               pm_runtime_get_sync(port->dev);
                break;
        }
 }
@@ -1353,12 +1352,7 @@ static int cdns_uart_suspend(struct device *device)
         * the suspend.
         */
        uart_suspend_port(&cdns_uart_uart_driver, port);
-       if (console_suspend_enabled && !may_wake) {
-               struct cdns_uart *cdns_uart = port->private_data;
-
-               clk_disable(cdns_uart->uartclk);
-               clk_disable(cdns_uart->pclk);
-       } else {
+       if (!(console_suspend_enabled && !may_wake)) {
                unsigned long flags = 0;
 
                spin_lock_irqsave(&port->lock, flags);
@@ -1423,6 +1417,8 @@ static int cdns_uart_resume(struct device *device)
                ctrl_reg |= CDNS_UART_CR_TX_EN | CDNS_UART_CR_RX_EN;
                writel(ctrl_reg, port->membase + CDNS_UART_CR);
 
+               clk_disable(cdns_uart->uartclk);
+               clk_disable(cdns_uart->pclk);
                spin_unlock_irqrestore(&port->lock, flags);
        } else {
                spin_lock_irqsave(&port->lock, flags);
@@ -1436,9 +1432,33 @@ static int cdns_uart_resume(struct device *device)
        return uart_resume_port(&cdns_uart_uart_driver, port);
 }
 #endif /* ! CONFIG_PM_SLEEP */
+static int __maybe_unused cdns_runtime_suspend(struct device *dev)
+{
+       struct platform_device *pdev = to_platform_device(dev);
+       struct uart_port *port = platform_get_drvdata(pdev);
+       struct cdns_uart *cdns_uart = port->private_data;
+
+       clk_disable(cdns_uart->uartclk);
+       clk_disable(cdns_uart->pclk);
+       return 0;
+};
+
+static int __maybe_unused cdns_runtime_resume(struct device *dev)
+{
+       struct platform_device *pdev = to_platform_device(dev);
+       struct uart_port *port = platform_get_drvdata(pdev);
+       struct cdns_uart *cdns_uart = port->private_data;
 
-static SIMPLE_DEV_PM_OPS(cdns_uart_dev_pm_ops, cdns_uart_suspend,
-               cdns_uart_resume);
+       clk_enable(cdns_uart->pclk);
+       clk_enable(cdns_uart->uartclk);
+       return 0;
+};
+
+static const struct dev_pm_ops cdns_uart_dev_pm_ops = {
+       SET_SYSTEM_SLEEP_PM_OPS(cdns_uart_suspend, cdns_uart_resume)
+       SET_RUNTIME_PM_OPS(cdns_runtime_suspend,
+                          cdns_runtime_resume, NULL)
+};
 
 static const struct cdns_platform_data zynqmp_uart_def = {
                                .quirks = CDNS_UART_RXBS_SUPPORT, };
@@ -1558,6 +1578,11 @@ static int cdns_uart_probe(struct platform_device *pdev)
        cdns_uart_data->port = port;
        platform_set_drvdata(pdev, port);
 
+       pm_runtime_use_autosuspend(&pdev->dev);
+       pm_runtime_set_autosuspend_delay(&pdev->dev, UART_AUTOSUSPEND_TIMEOUT);
+       pm_runtime_enable(&pdev->dev);
+       pm_runtime_set_active(&pdev->dev);
+
        rc = uart_add_one_port(&cdns_uart_uart_driver, port);
        if (rc) {
                dev_err(&pdev->dev,
@@ -1573,6 +1598,9 @@ err_out_notif_unreg:
                        &cdns_uart_data->clk_rate_change_nb);
 #endif
 err_out_clk_disable:
+       pm_runtime_disable(&pdev->dev);
+       pm_runtime_set_suspended(&pdev->dev);
+       pm_runtime_dont_use_autosuspend(&pdev->dev);
        clk_unprepare(cdns_uart_data->uartclk);
 err_out_clk_dis_pclk:
        clk_unprepare(cdns_uart_data->pclk);
@@ -1601,6 +1629,9 @@ static int cdns_uart_remove(struct platform_device *pdev)
        port->mapbase = 0;
        clk_unprepare(cdns_uart_data->uartclk);
        clk_unprepare(cdns_uart_data->pclk);
+       pm_runtime_disable(&pdev->dev);
+       pm_runtime_set_suspended(&pdev->dev);
+       pm_runtime_dont_use_autosuspend(&pdev->dev);
        return rc;
 }
 
index e6d1a6510886c5a807cda3b65d651046afe3a48d..de4543ee290bf375369a3188d1fbf9b40549986c 100644 (file)
@@ -2843,8 +2843,8 @@ static void tty_warn_deprecated_flags(struct serial_struct __user *ss)
        flags &= ASYNC_DEPRECATED;
 
        if (flags && __ratelimit(&depr_flags))
-               pr_warning("%s: '%s' is using deprecated serial flags (with no effect): %.8x\n",
-                               __func__, get_task_comm(comm, current), flags);
+               pr_warn("%s: '%s' is using deprecated serial flags (with no effect): %.8x\n",
+                       __func__, get_task_comm(comm, current), flags);
 }
 
 /*
index 9519da6253a83bac113219c41ecafda95be3a029..5176cdc2057f281af53cf7545d57fd7bed4b412e 100644 (file)
@@ -165,7 +165,7 @@ static inline void serdev_controller_write_wakeup(struct serdev_controller *ctrl
        if (!serdev || !serdev->ops->write_wakeup)
                return;
 
-       serdev->ops->write_wakeup(ctrl->serdev);
+       serdev->ops->write_wakeup(serdev);
 }
 
 static inline int serdev_controller_receive_buf(struct serdev_controller *ctrl,
@@ -177,7 +177,7 @@ static inline int serdev_controller_receive_buf(struct serdev_controller *ctrl,
        if (!serdev || !serdev->ops->receive_buf)
                return -EINVAL;
 
-       return serdev->ops->receive_buf(ctrl->serdev, data, count);
+       return serdev->ops->receive_buf(serdev, data, count);
 }
 
 #if IS_ENABLED(CONFIG_SERIAL_DEV_BUS)