forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-09 958e46acc8e900e8569dd467c1af9b8d2d019394
kernel/drivers/tty/serial/8250/8250_mtk.c
....@@ -10,31 +10,335 @@
1010 #include <linux/module.h>
1111 #include <linux/of_irq.h>
1212 #include <linux/of_platform.h>
13
+#include <linux/pinctrl/consumer.h>
1314 #include <linux/platform_device.h>
1415 #include <linux/pm_runtime.h>
1516 #include <linux/serial_8250.h>
1617 #include <linux/serial_reg.h>
18
+#include <linux/console.h>
19
+#include <linux/dma-mapping.h>
20
+#include <linux/tty.h>
21
+#include <linux/tty_flip.h>
1722
1823 #include "8250.h"
1924
20
-#define UART_MTK_HIGHS 0x09 /* Highspeed register */
21
-#define UART_MTK_SAMPLE_COUNT 0x0a /* Sample count register */
22
-#define UART_MTK_SAMPLE_POINT 0x0b /* Sample point register */
25
+#define MTK_UART_HIGHS 0x09 /* Highspeed register */
26
+#define MTK_UART_SAMPLE_COUNT 0x0a /* Sample count register */
27
+#define MTK_UART_SAMPLE_POINT 0x0b /* Sample point register */
2328 #define MTK_UART_RATE_FIX 0x0d /* UART Rate Fix Register */
29
+#define MTK_UART_ESCAPE_DAT 0x10 /* Escape Character register */
30
+#define MTK_UART_ESCAPE_EN 0x11 /* Escape Enable register */
31
+#define MTK_UART_DMA_EN 0x13 /* DMA Enable register */
32
+#define MTK_UART_RXTRI_AD 0x14 /* RX Trigger address */
33
+#define MTK_UART_FRACDIV_L 0x15 /* Fractional divider LSB address */
34
+#define MTK_UART_FRACDIV_M 0x16 /* Fractional divider MSB address */
35
+#define MTK_UART_DEBUG0 0x18
36
+#define MTK_UART_IER_XOFFI 0x20 /* Enable XOFF character interrupt */
37
+#define MTK_UART_IER_RTSI 0x40 /* Enable RTS Modem status interrupt */
38
+#define MTK_UART_IER_CTSI 0x80 /* Enable CTS Modem status interrupt */
39
+
40
+#define MTK_UART_EFR 38 /* I/O: Extended Features Register */
41
+#define MTK_UART_EFR_EN 0x10 /* Enable enhancement feature */
42
+#define MTK_UART_EFR_RTS 0x40 /* Enable hardware rx flow control */
43
+#define MTK_UART_EFR_CTS 0x80 /* Enable hardware tx flow control */
44
+#define MTK_UART_EFR_NO_SW_FC 0x0 /* no sw flow control */
45
+#define MTK_UART_EFR_XON1_XOFF1 0xa /* XON1/XOFF1 as sw flow control */
46
+#define MTK_UART_EFR_XON2_XOFF2 0x5 /* XON2/XOFF2 as sw flow control */
47
+#define MTK_UART_EFR_SW_FC_MASK 0xf /* Enable CTS Modem status interrupt */
48
+#define MTK_UART_EFR_HW_FC (MTK_UART_EFR_RTS | MTK_UART_EFR_CTS)
49
+#define MTK_UART_DMA_EN_TX 0x2
50
+#define MTK_UART_DMA_EN_RX 0x5
51
+
52
+#define MTK_UART_ESCAPE_CHAR 0x77 /* Escape char added under sw fc */
53
+#define MTK_UART_RX_SIZE 0x8000
54
+#define MTK_UART_TX_TRIGGER 1
55
+#define MTK_UART_RX_TRIGGER MTK_UART_RX_SIZE
56
+
57
+#define MTK_UART_XON1 40 /* I/O: Xon character 1 */
58
+#define MTK_UART_XOFF1 42 /* I/O: Xoff character 1 */
59
+
60
+#ifdef CONFIG_SERIAL_8250_DMA
61
+enum dma_rx_status {
62
+ DMA_RX_START = 0,
63
+ DMA_RX_RUNNING = 1,
64
+ DMA_RX_SHUTDOWN = 2,
65
+};
66
+#endif
2467
2568 struct mtk8250_data {
2669 int line;
70
+ unsigned int rx_pos;
71
+ unsigned int clk_count;
2772 struct clk *uart_clk;
2873 struct clk *bus_clk;
74
+ struct uart_8250_dma *dma;
75
+#ifdef CONFIG_SERIAL_8250_DMA
76
+ enum dma_rx_status rx_status;
77
+#endif
78
+ int rx_wakeup_irq;
2979 };
80
+
81
+/* flow control mode */
82
+enum {
83
+ MTK_UART_FC_NONE,
84
+ MTK_UART_FC_SW,
85
+ MTK_UART_FC_HW,
86
+};
87
+
88
+#ifdef CONFIG_SERIAL_8250_DMA
89
+static void mtk8250_rx_dma(struct uart_8250_port *up);
90
+
91
+static void mtk8250_dma_rx_complete(void *param)
92
+{
93
+ struct uart_8250_port *up = param;
94
+ struct uart_8250_dma *dma = up->dma;
95
+ struct mtk8250_data *data = up->port.private_data;
96
+ struct tty_port *tty_port = &up->port.state->port;
97
+ struct dma_tx_state state;
98
+ int copied, total, cnt;
99
+ unsigned char *ptr;
100
+ unsigned long flags;
101
+
102
+ if (data->rx_status == DMA_RX_SHUTDOWN)
103
+ return;
104
+
105
+ spin_lock_irqsave(&up->port.lock, flags);
106
+
107
+ dmaengine_tx_status(dma->rxchan, dma->rx_cookie, &state);
108
+ total = dma->rx_size - state.residue;
109
+ cnt = total;
110
+
111
+ if ((data->rx_pos + cnt) > dma->rx_size)
112
+ cnt = dma->rx_size - data->rx_pos;
113
+
114
+ ptr = (unsigned char *)(data->rx_pos + dma->rx_buf);
115
+ copied = tty_insert_flip_string(tty_port, ptr, cnt);
116
+ data->rx_pos += cnt;
117
+
118
+ if (total > cnt) {
119
+ ptr = (unsigned char *)(dma->rx_buf);
120
+ cnt = total - cnt;
121
+ copied += tty_insert_flip_string(tty_port, ptr, cnt);
122
+ data->rx_pos = cnt;
123
+ }
124
+
125
+ up->port.icount.rx += copied;
126
+
127
+ tty_flip_buffer_push(tty_port);
128
+
129
+ mtk8250_rx_dma(up);
130
+
131
+ spin_unlock_irqrestore(&up->port.lock, flags);
132
+}
133
+
134
+static void mtk8250_rx_dma(struct uart_8250_port *up)
135
+{
136
+ struct uart_8250_dma *dma = up->dma;
137
+ struct dma_async_tx_descriptor *desc;
138
+
139
+ desc = dmaengine_prep_slave_single(dma->rxchan, dma->rx_addr,
140
+ dma->rx_size, DMA_DEV_TO_MEM,
141
+ DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
142
+ if (!desc) {
143
+ pr_err("failed to prepare rx slave single\n");
144
+ return;
145
+ }
146
+
147
+ desc->callback = mtk8250_dma_rx_complete;
148
+ desc->callback_param = up;
149
+
150
+ dma->rx_cookie = dmaengine_submit(desc);
151
+
152
+ dma_async_issue_pending(dma->rxchan);
153
+}
154
+
155
+static void mtk8250_dma_enable(struct uart_8250_port *up)
156
+{
157
+ struct uart_8250_dma *dma = up->dma;
158
+ struct mtk8250_data *data = up->port.private_data;
159
+ int lcr = serial_in(up, UART_LCR);
160
+
161
+ if (data->rx_status != DMA_RX_START)
162
+ return;
163
+
164
+ dma->rxconf.src_port_window_size = dma->rx_size;
165
+ dma->rxconf.src_addr = dma->rx_addr;
166
+
167
+ dma->txconf.dst_port_window_size = UART_XMIT_SIZE;
168
+ dma->txconf.dst_addr = dma->tx_addr;
169
+
170
+ serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO | UART_FCR_CLEAR_RCVR |
171
+ UART_FCR_CLEAR_XMIT);
172
+ serial_out(up, MTK_UART_DMA_EN,
173
+ MTK_UART_DMA_EN_RX | MTK_UART_DMA_EN_TX);
174
+
175
+ serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
176
+ serial_out(up, MTK_UART_EFR, UART_EFR_ECB);
177
+ serial_out(up, UART_LCR, lcr);
178
+
179
+ if (dmaengine_slave_config(dma->rxchan, &dma->rxconf) != 0)
180
+ pr_err("failed to configure rx dma channel\n");
181
+ if (dmaengine_slave_config(dma->txchan, &dma->txconf) != 0)
182
+ pr_err("failed to configure tx dma channel\n");
183
+
184
+ data->rx_status = DMA_RX_RUNNING;
185
+ data->rx_pos = 0;
186
+ mtk8250_rx_dma(up);
187
+}
188
+#endif
189
+
190
+static int mtk8250_startup(struct uart_port *port)
191
+{
192
+#ifdef CONFIG_SERIAL_8250_DMA
193
+ struct uart_8250_port *up = up_to_u8250p(port);
194
+ struct mtk8250_data *data = port->private_data;
195
+
196
+ /* disable DMA for console */
197
+ if (uart_console(port))
198
+ up->dma = NULL;
199
+
200
+ if (up->dma) {
201
+ data->rx_status = DMA_RX_START;
202
+ uart_circ_clear(&port->state->xmit);
203
+ }
204
+#endif
205
+ memset(&port->icount, 0, sizeof(port->icount));
206
+
207
+ return serial8250_do_startup(port);
208
+}
209
+
210
+static void mtk8250_shutdown(struct uart_port *port)
211
+{
212
+#ifdef CONFIG_SERIAL_8250_DMA
213
+ struct uart_8250_port *up = up_to_u8250p(port);
214
+ struct mtk8250_data *data = port->private_data;
215
+
216
+ if (up->dma)
217
+ data->rx_status = DMA_RX_SHUTDOWN;
218
+#endif
219
+
220
+ return serial8250_do_shutdown(port);
221
+}
222
+
223
+static void mtk8250_disable_intrs(struct uart_8250_port *up, int mask)
224
+{
225
+ struct uart_port *port = &up->port;
226
+ unsigned int flags;
227
+ unsigned int ier;
228
+ bool is_console;
229
+
230
+ is_console = uart_console(port);
231
+
232
+ if (is_console)
233
+ console_atomic_lock(&flags);
234
+
235
+ ier = serial_in(up, UART_IER);
236
+ serial_out(up, UART_IER, ier & (~mask));
237
+
238
+ if (is_console)
239
+ console_atomic_unlock(flags);
240
+}
241
+
242
+static void mtk8250_enable_intrs(struct uart_8250_port *up, int mask)
243
+{
244
+ struct uart_port *port = &up->port;
245
+ unsigned int flags;
246
+ unsigned int ier;
247
+
248
+ if (uart_console(port))
249
+ console_atomic_lock(&flags);
250
+
251
+ ier = serial_in(up, UART_IER);
252
+ serial_out(up, UART_IER, ier | mask);
253
+
254
+ if (uart_console(port))
255
+ console_atomic_unlock(flags);
256
+}
257
+
258
+static void mtk8250_set_flow_ctrl(struct uart_8250_port *up, int mode)
259
+{
260
+ struct uart_port *port = &up->port;
261
+ int lcr = serial_in(up, UART_LCR);
262
+
263
+ serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
264
+ serial_out(up, MTK_UART_EFR, UART_EFR_ECB);
265
+ serial_out(up, UART_LCR, lcr);
266
+ lcr = serial_in(up, UART_LCR);
267
+
268
+ switch (mode) {
269
+ case MTK_UART_FC_NONE:
270
+ serial_out(up, MTK_UART_ESCAPE_DAT, MTK_UART_ESCAPE_CHAR);
271
+ serial_out(up, MTK_UART_ESCAPE_EN, 0x00);
272
+ serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
273
+ serial_out(up, MTK_UART_EFR, serial_in(up, MTK_UART_EFR) &
274
+ (~(MTK_UART_EFR_HW_FC | MTK_UART_EFR_SW_FC_MASK)));
275
+ serial_out(up, UART_LCR, lcr);
276
+ mtk8250_disable_intrs(up, MTK_UART_IER_XOFFI |
277
+ MTK_UART_IER_RTSI | MTK_UART_IER_CTSI);
278
+ break;
279
+
280
+ case MTK_UART_FC_HW:
281
+ serial_out(up, MTK_UART_ESCAPE_DAT, MTK_UART_ESCAPE_CHAR);
282
+ serial_out(up, MTK_UART_ESCAPE_EN, 0x00);
283
+ serial_out(up, UART_MCR, UART_MCR_RTS);
284
+ serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
285
+
286
+ /*enable hw flow control*/
287
+ serial_out(up, MTK_UART_EFR, MTK_UART_EFR_HW_FC |
288
+ (serial_in(up, MTK_UART_EFR) &
289
+ (~(MTK_UART_EFR_HW_FC | MTK_UART_EFR_SW_FC_MASK))));
290
+
291
+ serial_out(up, UART_LCR, lcr);
292
+ mtk8250_disable_intrs(up, MTK_UART_IER_XOFFI);
293
+ mtk8250_enable_intrs(up, MTK_UART_IER_CTSI | MTK_UART_IER_RTSI);
294
+ break;
295
+
296
+ case MTK_UART_FC_SW: /*MTK software flow control */
297
+ serial_out(up, MTK_UART_ESCAPE_DAT, MTK_UART_ESCAPE_CHAR);
298
+ serial_out(up, MTK_UART_ESCAPE_EN, 0x01);
299
+ serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
300
+
301
+ /*enable sw flow control */
302
+ serial_out(up, MTK_UART_EFR, MTK_UART_EFR_XON1_XOFF1 |
303
+ (serial_in(up, MTK_UART_EFR) &
304
+ (~(MTK_UART_EFR_HW_FC | MTK_UART_EFR_SW_FC_MASK))));
305
+
306
+ serial_out(up, MTK_UART_XON1, START_CHAR(port->state->port.tty));
307
+ serial_out(up, MTK_UART_XOFF1, STOP_CHAR(port->state->port.tty));
308
+ serial_out(up, UART_LCR, lcr);
309
+ mtk8250_disable_intrs(up, MTK_UART_IER_CTSI|MTK_UART_IER_RTSI);
310
+ mtk8250_enable_intrs(up, MTK_UART_IER_XOFFI);
311
+ break;
312
+ default:
313
+ break;
314
+ }
315
+}
30316
31317 static void
32318 mtk8250_set_termios(struct uart_port *port, struct ktermios *termios,
33319 struct ktermios *old)
34320 {
321
+ unsigned short fraction_L_mapping[] = {
322
+ 0, 1, 0x5, 0x15, 0x55, 0x57, 0x57, 0x77, 0x7F, 0xFF, 0xFF
323
+ };
324
+ unsigned short fraction_M_mapping[] = {
325
+ 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 3
326
+ };
35327 struct uart_8250_port *up = up_to_u8250p(port);
328
+ unsigned int baud, quot, fraction;
36329 unsigned long flags;
37
- unsigned int baud, quot;
330
+ int mode;
331
+
332
+#ifdef CONFIG_SERIAL_8250_DMA
333
+ if (up->dma) {
334
+ if (uart_console(port)) {
335
+ devm_kfree(up->port.dev, up->dma);
336
+ up->dma = NULL;
337
+ } else {
338
+ mtk8250_dma_enable(up);
339
+ }
340
+ }
341
+#endif
38342
39343 /*
40344 * Store the requested baud rate before calling the generic 8250
....@@ -52,7 +356,7 @@
52356 tty_termios_encode_baud_rate(termios, baud, baud);
53357
54358 /*
55
- * Mediatek UARTs use an extra highspeed register (UART_MTK_HIGHS)
359
+ * Mediatek UARTs use an extra highspeed register (MTK_UART_HIGHS)
56360 *
57361 * We need to recalcualte the quot register, as the claculation depends
58362 * on the vaule in the highspeed register.
....@@ -68,18 +372,11 @@
68372 port->uartclk / 16 / UART_DIV_MAX,
69373 port->uartclk);
70374
71
- if (baud <= 115200) {
72
- serial_port_out(port, UART_MTK_HIGHS, 0x0);
375
+ if (baud < 115200) {
376
+ serial_port_out(port, MTK_UART_HIGHS, 0x0);
73377 quot = uart_get_divisor(port, baud);
74
- } else if (baud <= 576000) {
75
- serial_port_out(port, UART_MTK_HIGHS, 0x2);
76
-
77
- /* Set to next lower baudrate supported */
78
- if ((baud == 500000) || (baud == 576000))
79
- baud = 460800;
80
- quot = DIV_ROUND_UP(port->uartclk, 4 * baud);
81378 } else {
82
- serial_port_out(port, UART_MTK_HIGHS, 0x3);
379
+ serial_port_out(port, MTK_UART_HIGHS, 0x3);
83380 quot = DIV_ROUND_UP(port->uartclk, 256 * baud);
84381 }
85382
....@@ -101,17 +398,39 @@
101398 /* reset DLAB */
102399 serial_port_out(port, UART_LCR, up->lcr);
103400
104
- if (baud > 460800) {
401
+ if (baud >= 115200) {
105402 unsigned int tmp;
106403
107
- tmp = DIV_ROUND_CLOSEST(port->uartclk, quot * baud);
108
- serial_port_out(port, UART_MTK_SAMPLE_COUNT, tmp - 1);
109
- serial_port_out(port, UART_MTK_SAMPLE_POINT,
110
- (tmp - 2) >> 1);
404
+ tmp = (port->uartclk / (baud * quot)) - 1;
405
+ serial_port_out(port, MTK_UART_SAMPLE_COUNT, tmp);
406
+ serial_port_out(port, MTK_UART_SAMPLE_POINT,
407
+ (tmp >> 1) - 1);
408
+
409
+ /*count fraction to set fractoin register */
410
+ fraction = ((port->uartclk * 100) / baud / quot) % 100;
411
+ fraction = DIV_ROUND_CLOSEST(fraction, 10);
412
+ serial_port_out(port, MTK_UART_FRACDIV_L,
413
+ fraction_L_mapping[fraction]);
414
+ serial_port_out(port, MTK_UART_FRACDIV_M,
415
+ fraction_M_mapping[fraction]);
111416 } else {
112
- serial_port_out(port, UART_MTK_SAMPLE_COUNT, 0x00);
113
- serial_port_out(port, UART_MTK_SAMPLE_POINT, 0xff);
417
+ serial_port_out(port, MTK_UART_SAMPLE_COUNT, 0x00);
418
+ serial_port_out(port, MTK_UART_SAMPLE_POINT, 0xff);
419
+ serial_port_out(port, MTK_UART_FRACDIV_L, 0x00);
420
+ serial_port_out(port, MTK_UART_FRACDIV_M, 0x00);
114421 }
422
+
423
+ if ((termios->c_cflag & CRTSCTS) && (!(termios->c_iflag & CRTSCTS)))
424
+ mode = MTK_UART_FC_HW;
425
+ else if (termios->c_iflag & CRTSCTS)
426
+ mode = MTK_UART_FC_SW;
427
+ else
428
+ mode = MTK_UART_FC_NONE;
429
+
430
+ mtk8250_set_flow_ctrl(up, mode);
431
+
432
+ if (uart_console(port))
433
+ up->port.cons->cflag = termios->c_cflag;
115434
116435 spin_unlock_irqrestore(&port->lock, flags);
117436 /* Don't rewrite B0 */
....@@ -122,9 +441,18 @@
122441 static int __maybe_unused mtk8250_runtime_suspend(struct device *dev)
123442 {
124443 struct mtk8250_data *data = dev_get_drvdata(dev);
444
+ struct uart_8250_port *up = serial8250_get_port(data->line);
125445
126
- clk_disable_unprepare(data->uart_clk);
127
- clk_disable_unprepare(data->bus_clk);
446
+ /* wait until UART in idle status */
447
+ while
448
+ (serial_in(up, MTK_UART_DEBUG0));
449
+
450
+ if (data->clk_count == 0U) {
451
+ dev_dbg(dev, "%s clock count is 0\n", __func__);
452
+ } else {
453
+ clk_disable_unprepare(data->bus_clk);
454
+ data->clk_count--;
455
+ }
128456
129457 return 0;
130458 }
....@@ -134,16 +462,16 @@
134462 struct mtk8250_data *data = dev_get_drvdata(dev);
135463 int err;
136464
137
- err = clk_prepare_enable(data->uart_clk);
138
- if (err) {
139
- dev_warn(dev, "Can't enable clock\n");
140
- return err;
141
- }
142
-
143
- err = clk_prepare_enable(data->bus_clk);
144
- if (err) {
145
- dev_warn(dev, "Can't enable bus clock\n");
146
- return err;
465
+ if (data->clk_count > 0U) {
466
+ dev_dbg(dev, "%s clock count is %d\n", __func__,
467
+ data->clk_count);
468
+ } else {
469
+ err = clk_prepare_enable(data->bus_clk);
470
+ if (err) {
471
+ dev_warn(dev, "Can't enable bus clock\n");
472
+ return err;
473
+ }
474
+ data->clk_count++;
147475 }
148476
149477 return 0;
....@@ -153,17 +481,30 @@
153481 mtk8250_do_pm(struct uart_port *port, unsigned int state, unsigned int old)
154482 {
155483 if (!state)
156
- pm_runtime_get_sync(port->dev);
484
+ if (!mtk8250_runtime_resume(port->dev))
485
+ pm_runtime_get_sync(port->dev);
157486
158487 serial8250_do_pm(port, state, old);
159488
160489 if (state)
161
- pm_runtime_put_sync_suspend(port->dev);
490
+ if (!pm_runtime_put_sync_suspend(port->dev))
491
+ mtk8250_runtime_suspend(port->dev);
162492 }
493
+
494
+#ifdef CONFIG_SERIAL_8250_DMA
495
+static bool mtk8250_dma_filter(struct dma_chan *chan, void *param)
496
+{
497
+ return false;
498
+}
499
+#endif
163500
164501 static int mtk8250_probe_of(struct platform_device *pdev, struct uart_port *p,
165502 struct mtk8250_data *data)
166503 {
504
+#ifdef CONFIG_SERIAL_8250_DMA
505
+ int dmacnt;
506
+#endif
507
+
167508 data->uart_clk = devm_clk_get(&pdev->dev, "baud");
168509 if (IS_ERR(data->uart_clk)) {
169510 /*
....@@ -180,19 +521,42 @@
180521 }
181522
182523 data->bus_clk = devm_clk_get(&pdev->dev, "bus");
183
- return PTR_ERR_OR_ZERO(data->bus_clk);
524
+ if (IS_ERR(data->bus_clk))
525
+ return PTR_ERR(data->bus_clk);
526
+
527
+ data->dma = NULL;
528
+#ifdef CONFIG_SERIAL_8250_DMA
529
+ dmacnt = of_property_count_strings(pdev->dev.of_node, "dma-names");
530
+ if (dmacnt == 2) {
531
+ data->dma = devm_kzalloc(&pdev->dev, sizeof(*data->dma),
532
+ GFP_KERNEL);
533
+ if (!data->dma)
534
+ return -ENOMEM;
535
+
536
+ data->dma->fn = mtk8250_dma_filter;
537
+ data->dma->rx_size = MTK_UART_RX_SIZE;
538
+ data->dma->rxconf.src_maxburst = MTK_UART_RX_TRIGGER;
539
+ data->dma->txconf.dst_maxburst = MTK_UART_TX_TRIGGER;
540
+ }
541
+#endif
542
+
543
+ return 0;
184544 }
185545
186546 static int mtk8250_probe(struct platform_device *pdev)
187547 {
188548 struct uart_8250_port uart = {};
189
- struct resource *regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
190
- struct resource *irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
191549 struct mtk8250_data *data;
192
- int err;
550
+ struct resource *regs;
551
+ int irq, err;
193552
194
- if (!regs || !irq) {
195
- dev_err(&pdev->dev, "no registers/irq defined\n");
553
+ irq = platform_get_irq(pdev, 0);
554
+ if (irq < 0)
555
+ return irq;
556
+
557
+ regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
558
+ if (!regs) {
559
+ dev_err(&pdev->dev, "no registers defined\n");
196560 return -EINVAL;
197561 }
198562
....@@ -205,6 +569,8 @@
205569 if (!data)
206570 return -ENOMEM;
207571
572
+ data->clk_count = 0;
573
+
208574 if (pdev->dev.of_node) {
209575 err = mtk8250_probe_of(pdev, &uart.port, data);
210576 if (err)
....@@ -214,7 +580,7 @@
214580
215581 spin_lock_init(&uart.port.lock);
216582 uart.port.mapbase = regs->start;
217
- uart.port.irq = irq->start;
583
+ uart.port.irq = irq;
218584 uart.port.pm = mtk8250_do_pm;
219585 uart.port.type = PORT_16550;
220586 uart.port.flags = UPF_BOOT_AUTOCONF | UPF_FIXED_PORT;
....@@ -222,8 +588,14 @@
222588 uart.port.iotype = UPIO_MEM32;
223589 uart.port.regshift = 2;
224590 uart.port.private_data = data;
591
+ uart.port.shutdown = mtk8250_shutdown;
592
+ uart.port.startup = mtk8250_startup;
225593 uart.port.set_termios = mtk8250_set_termios;
226594 uart.port.uartclk = clk_get_rate(data->uart_clk);
595
+#ifdef CONFIG_SERIAL_8250_DMA
596
+ if (data->dma)
597
+ uart.dma = data->dma;
598
+#endif
227599
228600 /* Disable Rate Fix function */
229601 writel(0x0, uart.port.membase +
....@@ -231,18 +603,25 @@
231603
232604 platform_set_drvdata(pdev, data);
233605
606
+ pm_runtime_enable(&pdev->dev);
234607 err = mtk8250_runtime_resume(&pdev->dev);
235608 if (err)
236
- return err;
609
+ goto err_pm_disable;
237610
238611 data->line = serial8250_register_8250_port(&uart);
239
- if (data->line < 0)
240
- return data->line;
612
+ if (data->line < 0) {
613
+ err = data->line;
614
+ goto err_pm_disable;
615
+ }
241616
242
- pm_runtime_set_active(&pdev->dev);
243
- pm_runtime_enable(&pdev->dev);
617
+ data->rx_wakeup_irq = platform_get_irq_optional(pdev, 1);
244618
245619 return 0;
620
+
621
+err_pm_disable:
622
+ pm_runtime_disable(&pdev->dev);
623
+
624
+ return err;
246625 }
247626
248627 static int mtk8250_remove(struct platform_device *pdev)
....@@ -252,10 +631,12 @@
252631 pm_runtime_get_sync(&pdev->dev);
253632
254633 serial8250_unregister_port(data->line);
255
- mtk8250_runtime_suspend(&pdev->dev);
256634
257635 pm_runtime_disable(&pdev->dev);
258636 pm_runtime_put_noidle(&pdev->dev);
637
+
638
+ if (!pm_runtime_status_suspended(&pdev->dev))
639
+ mtk8250_runtime_suspend(&pdev->dev);
259640
260641 return 0;
261642 }
....@@ -263,8 +644,23 @@
263644 static int __maybe_unused mtk8250_suspend(struct device *dev)
264645 {
265646 struct mtk8250_data *data = dev_get_drvdata(dev);
647
+ int irq = data->rx_wakeup_irq;
648
+ int err;
266649
267650 serial8250_suspend_port(data->line);
651
+
652
+ pinctrl_pm_select_sleep_state(dev);
653
+ if (irq >= 0) {
654
+ err = enable_irq_wake(irq);
655
+ if (err) {
656
+ dev_err(dev,
657
+ "failed to enable irq wake on IRQ %d: %d\n",
658
+ irq, err);
659
+ pinctrl_pm_select_default_state(dev);
660
+ serial8250_resume_port(data->line);
661
+ return err;
662
+ }
663
+ }
268664
269665 return 0;
270666 }
....@@ -272,6 +668,11 @@
272668 static int __maybe_unused mtk8250_resume(struct device *dev)
273669 {
274670 struct mtk8250_data *data = dev_get_drvdata(dev);
671
+ int irq = data->rx_wakeup_irq;
672
+
673
+ if (irq >= 0)
674
+ disable_irq_wake(irq);
675
+ pinctrl_pm_select_default_state(dev);
275676
276677 serial8250_resume_port(data->line);
277678
....@@ -309,6 +710,7 @@
309710 return -ENODEV;
310711
311712 device->port.iotype = UPIO_MEM32;
713
+ device->port.regshift = 2;
312714
313715 return early_serial8250_setup(device, NULL);
314716 }