kernel: update kernel 4.4 to version 4.4.28
[oweals/openwrt.git] / target / linux / ixp4xx / patches-4.4 / 160-delayed_uart_io.patch
1 --- a/drivers/tty/serial/8250/8250_core.c
2 +++ b/drivers/tty/serial/8250/8250_core.c
3 @@ -825,6 +825,7 @@ static int serial8250_probe(struct platf
4                 uart.port.set_termios   = p->set_termios;
5                 uart.port.pm            = p->pm;
6                 uart.port.dev           = &dev->dev;
7 +               uart.port.rw_delay      = p->rw_delay;
8                 uart.port.irqflags      |= irqflag;
9                 ret = serial8250_register_8250_port(&uart);
10                 if (ret < 0) {
11 @@ -981,6 +982,7 @@ int serial8250_register_8250_port(struct
12                 uart->bugs              = up->bugs;
13                 uart->port.mapbase      = up->port.mapbase;
14                 uart->port.mapsize      = up->port.mapsize;
15 +               uart->port.rw_delay     = up->port.rw_delay;
16                 uart->port.private_data = up->port.private_data;
17                 uart->tx_loadsz         = up->tx_loadsz;
18                 uart->capabilities      = up->capabilities;
19 --- a/drivers/tty/serial/serial_core.c
20 +++ b/drivers/tty/serial/serial_core.c
21 @@ -2185,6 +2185,7 @@ uart_report_port(struct uart_driver *drv
22                 snprintf(address, sizeof(address),
23                          "I/O 0x%lx offset 0x%x", port->iobase, port->hub6);
24                 break;
25 +       case UPIO_MEM_DELAY:
26         case UPIO_MEM:
27         case UPIO_MEM32:
28         case UPIO_MEM32BE:
29 @@ -2830,6 +2831,7 @@ int uart_match_port(struct uart_port *po
30         case UPIO_HUB6:
31                 return (port1->iobase == port2->iobase) &&
32                        (port1->hub6   == port2->hub6);
33 +       case UPIO_MEM_DELAY:
34         case UPIO_MEM:
35         case UPIO_MEM32:
36         case UPIO_MEM32BE:
37 --- a/include/linux/serial_8250.h
38 +++ b/include/linux/serial_8250.h
39 @@ -28,6 +28,7 @@ struct plat_serial8250_port {
40         void            *private_data;
41         unsigned char   regshift;       /* register shift */
42         unsigned char   iotype;         /* UPIO_* */
43 +       unsigned int rw_delay;  /* udelay for slower busses IXP4XX Expansion Bus */
44         unsigned char   hub6;
45         upf_t           flags;          /* UPF_* flags */
46         unsigned int    type;           /* If UPF_FIXED_TYPE */
47 --- a/include/linux/serial_core.h
48 +++ b/include/linux/serial_core.h
49 @@ -150,6 +150,7 @@ struct uart_port {
50  #define UPIO_AU                        (SERIAL_IO_AU)          /* Au1x00 and RT288x type IO */
51  #define UPIO_TSI               (SERIAL_IO_TSI)         /* Tsi108/109 type IO */
52  #define UPIO_MEM32BE           (SERIAL_IO_MEM32BE)     /* 32b big endian */
53 +#define UPIO_MEM_DELAY         (SERIAL_IO_MEM_DELAY)
54  
55         unsigned int            read_status_mask;       /* driver specific */
56         unsigned int            ignore_status_mask;     /* driver specific */
57 @@ -231,6 +232,7 @@ struct uart_port {
58         int                     hw_stopped;             /* sw-assisted CTS flow state */
59         unsigned int            mctrl;                  /* current modem ctrl settings */
60         unsigned int            timeout;                /* character-based timeout */
61 +       unsigned int            rw_delay;               /* udelay for slow busses, IXP4XX Expansion Bus */
62         unsigned int            type;                   /* port type */
63         const struct uart_ops   *ops;
64         unsigned int            custom_divisor;
65 --- a/include/uapi/linux/serial.h
66 +++ b/include/uapi/linux/serial.h
67 @@ -69,6 +69,7 @@ struct serial_struct {
68  #define SERIAL_IO_AU     4
69  #define SERIAL_IO_TSI    5
70  #define SERIAL_IO_MEM32BE 6
71 +#define SERIAL_IO_MEM_DELAY 7
72  
73  #define UART_CLEAR_FIFO                0x01
74  #define UART_USE_FIFO          0x02
75 --- a/drivers/tty/serial/8250/8250_port.c
76 +++ b/drivers/tty/serial/8250/8250_port.c
77 @@ -368,6 +368,20 @@ static void mem_serial_out(struct uart_p
78         writeb(value, p->membase + offset);
79  }
80  
81 +static unsigned int memdelay_serial_in(struct uart_port *p, int offset)
82 +{
83 +       struct uart_8250_port *up = (struct uart_8250_port *)p;
84 +       udelay(up->port.rw_delay);
85 +       return mem_serial_in(p, offset);
86 +}
87 +
88 +static void memdelay_serial_out(struct uart_port *p, int offset, int value)
89 +{
90 +       struct uart_8250_port *up = (struct uart_8250_port *)p;
91 +       udelay(up->port.rw_delay);
92 +       mem_serial_out(p, offset, value);
93 +}
94 +
95  static void mem32_serial_out(struct uart_port *p, int offset, int value)
96  {
97         offset = offset << p->regshift;
98 @@ -435,6 +449,11 @@ static void set_io_from_upio(struct uart
99                 p->serial_out = mem32be_serial_out;
100                 break;
101  
102 +       case UPIO_MEM_DELAY:
103 +               p->serial_in = memdelay_serial_in;
104 +               p->serial_out = memdelay_serial_out;
105 +               break;
106 +
107  #ifdef CONFIG_SERIAL_8250_RT288X
108         case UPIO_AU:
109                 p->serial_in = au_serial_in;
110 @@ -461,6 +480,7 @@ serial_port_out_sync(struct uart_port *p
111         case UPIO_MEM:
112         case UPIO_MEM32:
113         case UPIO_MEM32BE:
114 +       case UPIO_MEM_DELAY:
115         case UPIO_AU:
116                 p->serial_out(p, offset, value);
117                 p->serial_in(p, UART_LCR);      /* safe, no side-effects */
118 @@ -2457,6 +2477,7 @@ static int serial8250_request_std_resour
119         case UPIO_MEM32:
120         case UPIO_MEM32BE:
121         case UPIO_MEM:
122 +       case UPIO_MEM_DELAY:
123                 if (!port->mapbase)
124                         break;
125  
126 @@ -2494,6 +2515,7 @@ static void serial8250_release_std_resou
127         case UPIO_MEM32:
128         case UPIO_MEM32BE:
129         case UPIO_MEM:
130 +       case UPIO_MEM_DELAY:
131                 if (!port->mapbase)
132                         break;
133