forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-06 08f87f769b595151be1afeff53e144f543faa614
kernel/drivers/tty/serial/fsl_lpuart.c
....@@ -5,10 +5,6 @@
55 * Copyright 2012-2014 Freescale Semiconductor, Inc.
66 */
77
8
-#if defined(CONFIG_SERIAL_FSL_LPUART_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
9
-#define SUPPORT_SYSRQ
10
-#endif
11
-
128 #include <linux/clk.h>
139 #include <linux/console.h>
1410 #include <linux/dma-mapping.h>
....@@ -214,6 +210,7 @@
214210 #define UARTFIFO_TXSIZE_OFF 4
215211 #define UARTFIFO_RXFE 0x00000008
216212 #define UARTFIFO_RXSIZE_OFF 0
213
+#define UARTFIFO_DEPTH(x) (0x1 << ((x) ? ((x) + 1) : 0))
217214
218215 #define UARTWATER_COUNT_MASK 0xff
219216 #define UARTWATER_TXCNT_OFF 8
....@@ -232,9 +229,19 @@
232229 /* IMX lpuart has four extra unused regs located at the beginning */
233230 #define IMX_REG_OFF 0x10
234231
232
+enum lpuart_type {
233
+ VF610_LPUART,
234
+ LS1021A_LPUART,
235
+ LS1028A_LPUART,
236
+ IMX7ULP_LPUART,
237
+ IMX8QXP_LPUART,
238
+};
239
+
235240 struct lpuart_port {
236241 struct uart_port port;
237
- struct clk *clk;
242
+ enum lpuart_type devtype;
243
+ struct clk *ipg_clk;
244
+ struct clk *baud_clk;
238245 unsigned int txfifo_size;
239246 unsigned int rxfifo_size;
240247
....@@ -259,33 +266,61 @@
259266 };
260267
261268 struct lpuart_soc_data {
262
- char iotype;
263
- u8 reg_off;
269
+ enum lpuart_type devtype;
270
+ char iotype;
271
+ u8 reg_off;
264272 };
265273
266274 static const struct lpuart_soc_data vf_data = {
275
+ .devtype = VF610_LPUART,
267276 .iotype = UPIO_MEM,
268277 };
269278
270
-static const struct lpuart_soc_data ls_data = {
279
+static const struct lpuart_soc_data ls1021a_data = {
280
+ .devtype = LS1021A_LPUART,
271281 .iotype = UPIO_MEM32BE,
272282 };
273283
274
-static struct lpuart_soc_data imx_data = {
284
+static const struct lpuart_soc_data ls1028a_data = {
285
+ .devtype = LS1028A_LPUART,
286
+ .iotype = UPIO_MEM32,
287
+};
288
+
289
+static struct lpuart_soc_data imx7ulp_data = {
290
+ .devtype = IMX7ULP_LPUART,
291
+ .iotype = UPIO_MEM32,
292
+ .reg_off = IMX_REG_OFF,
293
+};
294
+
295
+static struct lpuart_soc_data imx8qxp_data = {
296
+ .devtype = IMX8QXP_LPUART,
275297 .iotype = UPIO_MEM32,
276298 .reg_off = IMX_REG_OFF,
277299 };
278300
279301 static const struct of_device_id lpuart_dt_ids[] = {
280302 { .compatible = "fsl,vf610-lpuart", .data = &vf_data, },
281
- { .compatible = "fsl,ls1021a-lpuart", .data = &ls_data, },
282
- { .compatible = "fsl,imx7ulp-lpuart", .data = &imx_data, },
303
+ { .compatible = "fsl,ls1021a-lpuart", .data = &ls1021a_data, },
304
+ { .compatible = "fsl,ls1028a-lpuart", .data = &ls1028a_data, },
305
+ { .compatible = "fsl,imx7ulp-lpuart", .data = &imx7ulp_data, },
306
+ { .compatible = "fsl,imx8qxp-lpuart", .data = &imx8qxp_data, },
283307 { /* sentinel */ }
284308 };
285309 MODULE_DEVICE_TABLE(of, lpuart_dt_ids);
286310
287311 /* Forward declare this for the dma callbacks*/
288312 static void lpuart_dma_tx_complete(void *arg);
313
+
314
+static inline bool is_layerscape_lpuart(struct lpuart_port *sport)
315
+{
316
+ return (sport->devtype == LS1021A_LPUART ||
317
+ sport->devtype == LS1028A_LPUART);
318
+}
319
+
320
+static inline bool is_imx8qxp_lpuart(struct lpuart_port *sport)
321
+{
322
+ return sport->devtype == IMX8QXP_LPUART;
323
+}
289324
290325 static inline u32 lpuart32_read(struct uart_port *port, u32 off)
291326 {
....@@ -311,6 +346,39 @@
311346 break;
312347 }
313348 }
349
+
350
+static int __lpuart_enable_clks(struct lpuart_port *sport, bool is_en)
351
+{
352
+ int ret = 0;
353
+
354
+ if (is_en) {
355
+ ret = clk_prepare_enable(sport->ipg_clk);
356
+ if (ret)
357
+ return ret;
358
+
359
+ ret = clk_prepare_enable(sport->baud_clk);
360
+ if (ret) {
361
+ clk_disable_unprepare(sport->ipg_clk);
362
+ return ret;
363
+ }
364
+ } else {
365
+ clk_disable_unprepare(sport->baud_clk);
366
+ clk_disable_unprepare(sport->ipg_clk);
367
+ }
368
+
369
+ return 0;
370
+}
371
+
372
+static unsigned int lpuart_get_baud_clk_rate(struct lpuart_port *sport)
373
+{
374
+ if (is_imx8qxp_lpuart(sport))
375
+ return clk_get_rate(sport->baud_clk);
376
+
377
+ return clk_get_rate(sport->ipg_clk);
378
+}
379
+
380
+#define lpuart_enable_clks(x) __lpuart_enable_clks(x, true)
381
+#define lpuart_disable_clks(x) __lpuart_enable_clks(x, false)
314382
315383 static void lpuart_stop_tx(struct uart_port *port)
316384 {
....@@ -351,6 +419,7 @@
351419 struct circ_buf *xmit = &sport->port.state->xmit;
352420 struct scatterlist *sgl = sport->tx_sgl;
353421 struct device *dev = sport->port.dev;
422
+ struct dma_chan *chan = sport->dma_tx_chan;
354423 int ret;
355424
356425 if (sport->dma_tx_in_progress)
....@@ -369,17 +438,19 @@
369438 sg_set_buf(sgl + 1, xmit->buf, xmit->head);
370439 }
371440
372
- ret = dma_map_sg(dev, sgl, sport->dma_tx_nents, DMA_TO_DEVICE);
441
+ ret = dma_map_sg(chan->device->dev, sgl, sport->dma_tx_nents,
442
+ DMA_TO_DEVICE);
373443 if (!ret) {
374444 dev_err(dev, "DMA mapping error for TX.\n");
375445 return;
376446 }
377447
378
- sport->dma_tx_desc = dmaengine_prep_slave_sg(sport->dma_tx_chan, sgl,
448
+ sport->dma_tx_desc = dmaengine_prep_slave_sg(chan, sgl,
379449 ret, DMA_MEM_TO_DEV,
380450 DMA_PREP_INTERRUPT);
381451 if (!sport->dma_tx_desc) {
382
- dma_unmap_sg(dev, sgl, sport->dma_tx_nents, DMA_TO_DEVICE);
452
+ dma_unmap_sg(chan->device->dev, sgl, sport->dma_tx_nents,
453
+ DMA_TO_DEVICE);
383454 dev_err(dev, "Cannot prepare TX slave DMA!\n");
384455 return;
385456 }
....@@ -388,7 +459,12 @@
388459 sport->dma_tx_desc->callback_param = sport;
389460 sport->dma_tx_in_progress = true;
390461 sport->dma_tx_cookie = dmaengine_submit(sport->dma_tx_desc);
391
- dma_async_issue_pending(sport->dma_tx_chan);
462
+ dma_async_issue_pending(chan);
463
+}
464
+
465
+static bool lpuart_stopped_or_empty(struct uart_port *port)
466
+{
467
+ return uart_circ_empty(&port->state->xmit) || uart_tx_stopped(port);
392468 }
393469
394470 static void lpuart_dma_tx_complete(void *arg)
....@@ -396,11 +472,13 @@
396472 struct lpuart_port *sport = arg;
397473 struct scatterlist *sgl = &sport->tx_sgl[0];
398474 struct circ_buf *xmit = &sport->port.state->xmit;
475
+ struct dma_chan *chan = sport->dma_tx_chan;
399476 unsigned long flags;
400477
401478 spin_lock_irqsave(&sport->port.lock, flags);
402479
403
- dma_unmap_sg(sport->port.dev, sgl, sport->dma_tx_nents, DMA_TO_DEVICE);
480
+ dma_unmap_sg(chan->device->dev, sgl, sport->dma_tx_nents,
481
+ DMA_TO_DEVICE);
404482
405483 xmit->tail = (xmit->tail + sport->dma_tx_bytes) & (UART_XMIT_SIZE - 1);
406484
....@@ -418,10 +496,21 @@
418496
419497 spin_lock_irqsave(&sport->port.lock, flags);
420498
421
- if (!uart_circ_empty(xmit) && !uart_tx_stopped(&sport->port))
499
+ if (!lpuart_stopped_or_empty(&sport->port))
422500 lpuart_dma_tx(sport);
423501
424502 spin_unlock_irqrestore(&sport->port.lock, flags);
503
+}
504
+
505
+static dma_addr_t lpuart_dma_datareg_addr(struct lpuart_port *sport)
506
+{
507
+ switch (sport->port.iotype) {
508
+ case UPIO_MEM32:
509
+ return sport->port.mapbase + UARTDATA;
510
+ case UPIO_MEM32BE:
511
+ return sport->port.mapbase + UARTDATA + sizeof(u32) - 1;
512
+ }
513
+ return sport->port.mapbase + UARTDR;
425514 }
426515
427516 static int lpuart_dma_tx_request(struct uart_port *port)
....@@ -431,7 +520,7 @@
431520 struct dma_slave_config dma_tx_sconfig = {};
432521 int ret;
433522
434
- dma_tx_sconfig.dst_addr = sport->port.mapbase + UARTDR;
523
+ dma_tx_sconfig.dst_addr = lpuart_dma_datareg_addr(sport);
435524 dma_tx_sconfig.dst_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE;
436525 dma_tx_sconfig.dst_maxburst = 1;
437526 dma_tx_sconfig.direction = DMA_MEM_TO_DEV;
....@@ -446,18 +535,50 @@
446535 return 0;
447536 }
448537
538
+static bool lpuart_is_32(struct lpuart_port *sport)
539
+{
540
+ return sport->port.iotype == UPIO_MEM32 ||
541
+ sport->port.iotype == UPIO_MEM32BE;
542
+}
543
+
449544 static void lpuart_flush_buffer(struct uart_port *port)
450545 {
451546 struct lpuart_port *sport = container_of(port, struct lpuart_port, port);
547
+ struct dma_chan *chan = sport->dma_tx_chan;
548
+ u32 val;
452549
453550 if (sport->lpuart_dma_tx_use) {
454551 if (sport->dma_tx_in_progress) {
455
- dma_unmap_sg(sport->port.dev, &sport->tx_sgl[0],
552
+ dma_unmap_sg(chan->device->dev, &sport->tx_sgl[0],
456553 sport->dma_tx_nents, DMA_TO_DEVICE);
457554 sport->dma_tx_in_progress = false;
458555 }
459
- dmaengine_terminate_all(sport->dma_tx_chan);
556
+ dmaengine_terminate_all(chan);
460557 }
558
+
559
+ if (lpuart_is_32(sport)) {
560
+ val = lpuart32_read(&sport->port, UARTFIFO);
561
+ val |= UARTFIFO_TXFLUSH | UARTFIFO_RXFLUSH;
562
+ lpuart32_write(&sport->port, val, UARTFIFO);
563
+ } else {
564
+ val = readb(sport->port.membase + UARTCFIFO);
565
+ val |= UARTCFIFO_TXFLUSH | UARTCFIFO_RXFLUSH;
566
+ writeb(val, sport->port.membase + UARTCFIFO);
567
+ }
568
+}
569
+
570
+static void lpuart_wait_bit_set(struct uart_port *port, unsigned int offset,
571
+ u8 bit)
572
+{
573
+ while (!(readb(port->membase + offset) & bit))
574
+ cpu_relax();
575
+}
576
+
577
+static void lpuart32_wait_bit_set(struct uart_port *port, unsigned int offset,
578
+ u32 bit)
579
+{
580
+ while (!(lpuart32_read(port, offset) & bit))
581
+ cpu_relax();
461582 }
462583
463584 #if defined(CONFIG_CONSOLE_POLL)
....@@ -503,9 +624,7 @@
503624 static void lpuart_poll_put_char(struct uart_port *port, unsigned char c)
504625 {
505626 /* drain */
506
- while (!(readb(port->membase + UARTSR1) & UARTSR1_TDRE))
507
- barrier();
508
-
627
+ lpuart_wait_bit_set(port, UARTSR1, UARTSR1_TDRE);
509628 writeb(c, port->membase + UARTDR);
510629 }
511630
....@@ -528,26 +647,24 @@
528647 spin_lock_irqsave(&sport->port.lock, flags);
529648
530649 /* Disable Rx & Tx */
531
- lpuart32_write(&sport->port, UARTCTRL, 0);
650
+ lpuart32_write(&sport->port, 0, UARTCTRL);
532651
533652 temp = lpuart32_read(&sport->port, UARTFIFO);
534653
535654 /* Enable Rx and Tx FIFO */
536
- lpuart32_write(&sport->port, UARTFIFO,
537
- temp | UARTFIFO_RXFE | UARTFIFO_TXFE);
655
+ lpuart32_write(&sport->port, temp | UARTFIFO_RXFE | UARTFIFO_TXFE, UARTFIFO);
538656
539657 /* flush Tx and Rx FIFO */
540
- lpuart32_write(&sport->port, UARTFIFO,
541
- UARTFIFO_TXFLUSH | UARTFIFO_RXFLUSH);
658
+ lpuart32_write(&sport->port, UARTFIFO_TXFLUSH | UARTFIFO_RXFLUSH, UARTFIFO);
542659
543660 /* explicitly clear RDRF */
544661 if (lpuart32_read(&sport->port, UARTSTAT) & UARTSTAT_RDRF) {
545662 lpuart32_read(&sport->port, UARTDATA);
546
- lpuart32_write(&sport->port, UARTFIFO, UARTFIFO_RXUF);
663
+ lpuart32_write(&sport->port, UARTFIFO_RXUF, UARTFIFO);
547664 }
548665
549666 /* Enable Rx and Tx */
550
- lpuart32_write(&sport->port, UARTCTRL, UARTCTRL_RE | UARTCTRL_TE);
667
+ lpuart32_write(&sport->port, UARTCTRL_RE | UARTCTRL_TE, UARTCTRL);
551668 spin_unlock_irqrestore(&sport->port.lock, flags);
552669
553670 return 0;
....@@ -555,10 +672,8 @@
555672
556673 static void lpuart32_poll_put_char(struct uart_port *port, unsigned char c)
557674 {
558
- while (!(lpuart32_read(port, UARTSTAT) & UARTSTAT_TDRE))
559
- barrier();
560
-
561
- lpuart32_write(port, UARTDATA, c);
675
+ lpuart32_wait_bit_set(port, UARTSTAT, UARTSTAT_TDRE);
676
+ lpuart32_write(port, c, UARTDATA);
562677 }
563678
564679 static int lpuart32_poll_get_char(struct uart_port *port)
....@@ -573,6 +688,18 @@
573688 static inline void lpuart_transmit_buffer(struct lpuart_port *sport)
574689 {
575690 struct circ_buf *xmit = &sport->port.state->xmit;
691
+
692
+ if (sport->port.x_char) {
693
+ writeb(sport->port.x_char, sport->port.membase + UARTDR);
694
+ sport->port.icount.tx++;
695
+ sport->port.x_char = 0;
696
+ return;
697
+ }
698
+
699
+ if (lpuart_stopped_or_empty(&sport->port)) {
700
+ lpuart_stop_tx(&sport->port);
701
+ return;
702
+ }
576703
577704 while (!uart_circ_empty(xmit) &&
578705 (readb(sport->port.membase + UARTTCFIFO) < sport->txfifo_size)) {
....@@ -592,6 +719,18 @@
592719 {
593720 struct circ_buf *xmit = &sport->port.state->xmit;
594721 unsigned long txcnt;
722
+
723
+ if (sport->port.x_char) {
724
+ lpuart32_write(&sport->port, sport->port.x_char, UARTDATA);
725
+ sport->port.icount.tx++;
726
+ sport->port.x_char = 0;
727
+ return;
728
+ }
729
+
730
+ if (lpuart_stopped_or_empty(&sport->port)) {
731
+ lpuart32_stop_tx(&sport->port);
732
+ return;
733
+ }
595734
596735 txcnt = lpuart32_read(&sport->port, UARTWATER);
597736 txcnt = txcnt >> UARTWATER_TXCNT_OFF;
....@@ -616,14 +755,13 @@
616755 {
617756 struct lpuart_port *sport = container_of(port,
618757 struct lpuart_port, port);
619
- struct circ_buf *xmit = &sport->port.state->xmit;
620758 unsigned char temp;
621759
622760 temp = readb(port->membase + UARTCR2);
623761 writeb(temp | UARTCR2_TIE, port->membase + UARTCR2);
624762
625763 if (sport->lpuart_dma_tx_use) {
626
- if (!uart_circ_empty(xmit) && !uart_tx_stopped(port))
764
+ if (!lpuart_stopped_or_empty(port))
627765 lpuart_dma_tx(sport);
628766 } else {
629767 if (readb(port->membase + UARTSR1) & UARTSR1_TDRE)
....@@ -636,11 +774,16 @@
636774 struct lpuart_port *sport = container_of(port, struct lpuart_port, port);
637775 unsigned long temp;
638776
639
- temp = lpuart32_read(port, UARTCTRL);
640
- lpuart32_write(port, temp | UARTCTRL_TIE, UARTCTRL);
777
+ if (sport->lpuart_dma_tx_use) {
778
+ if (!lpuart_stopped_or_empty(port))
779
+ lpuart_dma_tx(sport);
780
+ } else {
781
+ temp = lpuart32_read(port, UARTCTRL);
782
+ lpuart32_write(port, temp | UARTCTRL_TIE, UARTCTRL);
641783
642
- if (lpuart32_read(port, UARTSTAT) & UARTSTAT_TDRE)
643
- lpuart32_transmit_buffer(sport);
784
+ if (lpuart32_read(port, UARTSTAT) & UARTSTAT_TDRE)
785
+ lpuart32_transmit_buffer(sport);
786
+ }
644787 }
645788
646789 /* return TIOCSER_TEMT when transmitter is not busy */
....@@ -662,56 +805,32 @@
662805
663806 static unsigned int lpuart32_tx_empty(struct uart_port *port)
664807 {
665
- return (lpuart32_read(port, UARTSTAT) & UARTSTAT_TC) ?
666
- TIOCSER_TEMT : 0;
808
+ struct lpuart_port *sport = container_of(port,
809
+ struct lpuart_port, port);
810
+ unsigned long stat = lpuart32_read(port, UARTSTAT);
811
+ unsigned long sfifo = lpuart32_read(port, UARTFIFO);
812
+
813
+ if (sport->dma_tx_in_progress)
814
+ return 0;
815
+
816
+ if (stat & UARTSTAT_TC && sfifo & UARTFIFO_TXEMPT)
817
+ return TIOCSER_TEMT;
818
+
819
+ return 0;
667820 }
668821
669
-static bool lpuart_is_32(struct lpuart_port *sport)
822
+static void lpuart_txint(struct lpuart_port *sport)
670823 {
671
- return sport->port.iotype == UPIO_MEM32 ||
672
- sport->port.iotype == UPIO_MEM32BE;
673
-}
674
-
675
-static irqreturn_t lpuart_txint(int irq, void *dev_id)
676
-{
677
- struct lpuart_port *sport = dev_id;
678
- struct circ_buf *xmit = &sport->port.state->xmit;
679824 unsigned long flags;
680825
681826 spin_lock_irqsave(&sport->port.lock, flags);
682
- if (sport->port.x_char) {
683
- if (lpuart_is_32(sport))
684
- lpuart32_write(&sport->port, sport->port.x_char, UARTDATA);
685
- else
686
- writeb(sport->port.x_char, sport->port.membase + UARTDR);
687
- goto out;
688
- }
689
-
690
- if (uart_circ_empty(xmit) || uart_tx_stopped(&sport->port)) {
691
- if (lpuart_is_32(sport))
692
- lpuart32_stop_tx(&sport->port);
693
- else
694
- lpuart_stop_tx(&sport->port);
695
- goto out;
696
- }
697
-
698
- if (lpuart_is_32(sport))
699
- lpuart32_transmit_buffer(sport);
700
- else
701
- lpuart_transmit_buffer(sport);
702
-
703
- if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
704
- uart_write_wakeup(&sport->port);
705
-
706
-out:
827
+ lpuart_transmit_buffer(sport);
707828 spin_unlock_irqrestore(&sport->port.lock, flags);
708
- return IRQ_HANDLED;
709829 }
710830
711
-static irqreturn_t lpuart_rxint(int irq, void *dev_id)
831
+static void lpuart_rxint(struct lpuart_port *sport)
712832 {
713
- struct lpuart_port *sport = dev_id;
714
- unsigned int flg, ignored = 0;
833
+ unsigned int flg, ignored = 0, overrun = 0;
715834 struct tty_port *port = &sport->port.state->port;
716835 unsigned long flags;
717836 unsigned char rx, sr;
....@@ -738,7 +857,7 @@
738857 sport->port.icount.frame++;
739858
740859 if (sr & UARTSR1_OR)
741
- sport->port.icount.overrun++;
860
+ overrun++;
742861
743862 if (sr & sport->port.ignore_status_mask) {
744863 if (++ignored > 100)
....@@ -756,24 +875,40 @@
756875 if (sr & UARTSR1_OR)
757876 flg = TTY_OVERRUN;
758877
759
-#ifdef SUPPORT_SYSRQ
760878 sport->port.sysrq = 0;
761
-#endif
762879 }
763880
764881 tty_insert_flip_char(port, rx, flg);
765882 }
766883
767884 out:
885
+ if (overrun) {
886
+ sport->port.icount.overrun += overrun;
887
+
888
+ /*
889
+ * Overruns cause FIFO pointers to become missaligned.
890
+ * Flushing the receive FIFO reinitializes the pointers.
891
+ */
892
+ writeb(UARTCFIFO_RXFLUSH, sport->port.membase + UARTCFIFO);
893
+ writeb(UARTSFIFO_RXOF, sport->port.membase + UARTSFIFO);
894
+ }
895
+
768896 spin_unlock_irqrestore(&sport->port.lock, flags);
769897
770898 tty_flip_buffer_push(port);
771
- return IRQ_HANDLED;
772899 }
773900
774
-static irqreturn_t lpuart32_rxint(int irq, void *dev_id)
901
+static void lpuart32_txint(struct lpuart_port *sport)
775902 {
776
- struct lpuart_port *sport = dev_id;
903
+ unsigned long flags;
904
+
905
+ spin_lock_irqsave(&sport->port.lock, flags);
906
+ lpuart32_transmit_buffer(sport);
907
+ spin_unlock_irqrestore(&sport->port.lock, flags);
908
+}
909
+
910
+static void lpuart32_rxint(struct lpuart_port *sport)
911
+{
777912 unsigned int flg, ignored = 0;
778913 struct tty_port *port = &sport->port.state->port;
779914 unsigned long flags;
....@@ -820,9 +955,7 @@
820955 if (sr & UARTSTAT_OR)
821956 flg = TTY_OVERRUN;
822957
823
-#ifdef SUPPORT_SYSRQ
824958 sport->port.sysrq = 0;
825
-#endif
826959 }
827960
828961 tty_insert_flip_char(port, rx, flg);
....@@ -832,7 +965,6 @@
832965 spin_unlock_irqrestore(&sport->port.lock, flags);
833966
834967 tty_flip_buffer_push(port);
835
- return IRQ_HANDLED;
836968 }
837969
838970 static irqreturn_t lpuart_int(int irq, void *dev_id)
....@@ -842,11 +974,20 @@
842974
843975 sts = readb(sport->port.membase + UARTSR1);
844976
845
- if (sts & UARTSR1_RDRF)
846
- lpuart_rxint(irq, dev_id);
977
+ /* SysRq, using dma, check for linebreak by framing err. */
978
+ if (sts & UARTSR1_FE && sport->lpuart_dma_rx_use) {
979
+ readb(sport->port.membase + UARTDR);
980
+ uart_handle_break(&sport->port);
981
+ /* linebreak produces some garbage, removing it */
982
+ writeb(UARTCFIFO_RXFLUSH, sport->port.membase + UARTCFIFO);
983
+ return IRQ_HANDLED;
984
+ }
847985
848
- if (sts & UARTSR1_TDRE)
849
- lpuart_txint(irq, dev_id);
986
+ if (sts & UARTSR1_RDRF && !sport->lpuart_dma_rx_use)
987
+ lpuart_rxint(sport);
988
+
989
+ if (sts & UARTSR1_TDRE && !sport->lpuart_dma_tx_use)
990
+ lpuart_txint(sport);
850991
851992 return IRQ_HANDLED;
852993 }
....@@ -860,15 +1001,45 @@
8601001 rxcount = lpuart32_read(&sport->port, UARTWATER);
8611002 rxcount = rxcount >> UARTWATER_RXCNT_OFF;
8621003
863
- if (sts & UARTSTAT_RDRF || rxcount > 0)
864
- lpuart32_rxint(irq, dev_id);
1004
+ if ((sts & UARTSTAT_RDRF || rxcount > 0) && !sport->lpuart_dma_rx_use)
1005
+ lpuart32_rxint(sport);
8651006
866
- if ((sts & UARTSTAT_TDRE) &&
867
- !(lpuart32_read(&sport->port, UARTBAUD) & UARTBAUD_TDMAE))
868
- lpuart_txint(irq, dev_id);
1007
+ if ((sts & UARTSTAT_TDRE) && !sport->lpuart_dma_tx_use)
1008
+ lpuart32_txint(sport);
8691009
8701010 lpuart32_write(&sport->port, sts, UARTSTAT);
8711011 return IRQ_HANDLED;
1012
+}
1013
+
1014
+
1015
+static inline void lpuart_handle_sysrq_chars(struct uart_port *port,
1016
+ unsigned char *p, int count)
1017
+{
1018
+ while (count--) {
1019
+ if (*p && uart_handle_sysrq_char(port, *p))
1020
+ return;
1021
+ p++;
1022
+ }
1023
+}
1024
+
1025
+static void lpuart_handle_sysrq(struct lpuart_port *sport)
1026
+{
1027
+ struct circ_buf *ring = &sport->rx_ring;
1028
+ int count;
1029
+
1030
+ if (ring->head < ring->tail) {
1031
+ count = sport->rx_sgl.length - ring->tail;
1032
+ lpuart_handle_sysrq_chars(&sport->port,
1033
+ ring->buf + ring->tail, count);
1034
+ ring->tail = 0;
1035
+ }
1036
+
1037
+ if (ring->head > ring->tail) {
1038
+ count = ring->head - ring->tail;
1039
+ lpuart_handle_sysrq_chars(&sport->port,
1040
+ ring->buf + ring->tail, count);
1041
+ ring->tail = ring->head;
1042
+ }
8721043 }
8731044
8741045 static void lpuart_copy_rx_to_tty(struct lpuart_port *sport)
....@@ -876,31 +1047,68 @@
8761047 struct tty_port *port = &sport->port.state->port;
8771048 struct dma_tx_state state;
8781049 enum dma_status dmastat;
1050
+ struct dma_chan *chan = sport->dma_rx_chan;
8791051 struct circ_buf *ring = &sport->rx_ring;
8801052 unsigned long flags;
8811053 int count = 0;
882
- unsigned char sr;
8831054
884
- sr = readb(sport->port.membase + UARTSR1);
1055
+ if (lpuart_is_32(sport)) {
1056
+ unsigned long sr = lpuart32_read(&sport->port, UARTSTAT);
8851057
886
- if (sr & (UARTSR1_PE | UARTSR1_FE)) {
887
- /* Read DR to clear the error flags */
888
- readb(sport->port.membase + UARTDR);
1058
+ if (sr & (UARTSTAT_PE | UARTSTAT_FE)) {
1059
+ /* Read DR to clear the error flags */
1060
+ lpuart32_read(&sport->port, UARTDATA);
8891061
890
- if (sr & UARTSR1_PE)
891
- sport->port.icount.parity++;
892
- else if (sr & UARTSR1_FE)
893
- sport->port.icount.frame++;
1062
+ if (sr & UARTSTAT_PE)
1063
+ sport->port.icount.parity++;
1064
+ else if (sr & UARTSTAT_FE)
1065
+ sport->port.icount.frame++;
1066
+ }
1067
+ } else {
1068
+ unsigned char sr = readb(sport->port.membase + UARTSR1);
1069
+
1070
+ if (sr & (UARTSR1_PE | UARTSR1_FE)) {
1071
+ unsigned char cr2;
1072
+
1073
+ /* Disable receiver during this operation... */
1074
+ cr2 = readb(sport->port.membase + UARTCR2);
1075
+ cr2 &= ~UARTCR2_RE;
1076
+ writeb(cr2, sport->port.membase + UARTCR2);
1077
+
1078
+ /* Read DR to clear the error flags */
1079
+ readb(sport->port.membase + UARTDR);
1080
+
1081
+ if (sr & UARTSR1_PE)
1082
+ sport->port.icount.parity++;
1083
+ else if (sr & UARTSR1_FE)
1084
+ sport->port.icount.frame++;
1085
+ /*
1086
+ * At this point parity/framing error is
1087
+ * cleared However, since the DMA already read
1088
+ * the data register and we had to read it
1089
+ * again after reading the status register to
1090
+ * properly clear the flags, the FIFO actually
1091
+ * underflowed... This requires a clearing of
1092
+ * the FIFO...
1093
+ */
1094
+ if (readb(sport->port.membase + UARTSFIFO) &
1095
+ UARTSFIFO_RXUF) {
1096
+ writeb(UARTSFIFO_RXUF,
1097
+ sport->port.membase + UARTSFIFO);
1098
+ writeb(UARTCFIFO_RXFLUSH,
1099
+ sport->port.membase + UARTCFIFO);
1100
+ }
1101
+
1102
+ cr2 |= UARTCR2_RE;
1103
+ writeb(cr2, sport->port.membase + UARTCR2);
1104
+ }
8941105 }
8951106
8961107 async_tx_ack(sport->dma_rx_desc);
8971108
8981109 spin_lock_irqsave(&sport->port.lock, flags);
8991110
900
- dmastat = dmaengine_tx_status(sport->dma_rx_chan,
901
- sport->dma_rx_cookie,
902
- &state);
903
-
1111
+ dmastat = dmaengine_tx_status(chan, sport->dma_rx_cookie, &state);
9041112 if (dmastat == DMA_ERROR) {
9051113 dev_err(sport->port.dev, "Rx DMA transfer failed!\n");
9061114 spin_unlock_irqrestore(&sport->port.lock, flags);
....@@ -908,7 +1116,8 @@
9081116 }
9091117
9101118 /* CPU claims ownership of RX DMA buffer */
911
- dma_sync_sg_for_cpu(sport->port.dev, &sport->rx_sgl, 1, DMA_FROM_DEVICE);
1119
+ dma_sync_sg_for_cpu(chan->device->dev, &sport->rx_sgl, 1,
1120
+ DMA_FROM_DEVICE);
9121121
9131122 /*
9141123 * ring->head points to the end of data already written by the DMA.
....@@ -919,6 +1128,15 @@
9191128 */
9201129 ring->head = sport->rx_sgl.length - state.residue;
9211130 BUG_ON(ring->head > sport->rx_sgl.length);
1131
+
1132
+ /*
1133
+ * Silent handling of keys pressed in the sysrq timeframe
1134
+ */
1135
+ if (sport->port.sysrq) {
1136
+ lpuart_handle_sysrq(sport);
1137
+ goto exit;
1138
+ }
1139
+
9221140 /*
9231141 * At this point ring->head may point to the first byte right after the
9241142 * last byte of the dma buffer:
....@@ -950,7 +1168,8 @@
9501168 sport->port.icount.rx += count;
9511169 }
9521170
953
- dma_sync_sg_for_device(sport->port.dev, &sport->rx_sgl, 1,
1171
+exit:
1172
+ dma_sync_sg_for_device(chan->device->dev, &sport->rx_sgl, 1,
9541173 DMA_FROM_DEVICE);
9551174
9561175 spin_unlock_irqrestore(&sport->port.lock, flags);
....@@ -982,6 +1201,7 @@
9821201 struct tty_port *port = &sport->port.state->port;
9831202 struct tty_struct *tty = port->tty;
9841203 struct ktermios *termios = &tty->termios;
1204
+ struct dma_chan *chan = sport->dma_rx_chan;
9851205
9861206 baud = tty_get_baud_rate(tty);
9871207
....@@ -998,26 +1218,24 @@
9981218 if (sport->rx_dma_rng_buf_len < 16)
9991219 sport->rx_dma_rng_buf_len = 16;
10001220
1001
- ring->buf = kmalloc(sport->rx_dma_rng_buf_len, GFP_ATOMIC);
1002
- if (!ring->buf) {
1003
- dev_err(sport->port.dev, "Ring buf alloc failed\n");
1221
+ ring->buf = kzalloc(sport->rx_dma_rng_buf_len, GFP_ATOMIC);
1222
+ if (!ring->buf)
10041223 return -ENOMEM;
1005
- }
10061224
10071225 sg_init_one(&sport->rx_sgl, ring->buf, sport->rx_dma_rng_buf_len);
1008
- sg_set_buf(&sport->rx_sgl, ring->buf, sport->rx_dma_rng_buf_len);
1009
- nent = dma_map_sg(sport->port.dev, &sport->rx_sgl, 1, DMA_FROM_DEVICE);
1226
+ nent = dma_map_sg(chan->device->dev, &sport->rx_sgl, 1,
1227
+ DMA_FROM_DEVICE);
10101228
10111229 if (!nent) {
10121230 dev_err(sport->port.dev, "DMA Rx mapping error\n");
10131231 return -EINVAL;
10141232 }
10151233
1016
- dma_rx_sconfig.src_addr = sport->port.mapbase + UARTDR;
1234
+ dma_rx_sconfig.src_addr = lpuart_dma_datareg_addr(sport);
10171235 dma_rx_sconfig.src_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE;
10181236 dma_rx_sconfig.src_maxburst = 1;
10191237 dma_rx_sconfig.direction = DMA_DEV_TO_MEM;
1020
- ret = dmaengine_slave_config(sport->dma_rx_chan, &dma_rx_sconfig);
1238
+ ret = dmaengine_slave_config(chan, &dma_rx_sconfig);
10211239
10221240 if (ret < 0) {
10231241 dev_err(sport->port.dev,
....@@ -1025,7 +1243,7 @@
10251243 return ret;
10261244 }
10271245
1028
- sport->dma_rx_desc = dmaengine_prep_dma_cyclic(sport->dma_rx_chan,
1246
+ sport->dma_rx_desc = dmaengine_prep_dma_cyclic(chan,
10291247 sg_dma_address(&sport->rx_sgl),
10301248 sport->rx_sgl.length,
10311249 sport->rx_sgl.length / 2,
....@@ -1039,10 +1257,16 @@
10391257 sport->dma_rx_desc->callback = lpuart_dma_rx_complete;
10401258 sport->dma_rx_desc->callback_param = sport;
10411259 sport->dma_rx_cookie = dmaengine_submit(sport->dma_rx_desc);
1042
- dma_async_issue_pending(sport->dma_rx_chan);
1260
+ dma_async_issue_pending(chan);
10431261
1044
- writeb(readb(sport->port.membase + UARTCR5) | UARTCR5_RDMAS,
1045
- sport->port.membase + UARTCR5);
1262
+ if (lpuart_is_32(sport)) {
1263
+ unsigned long temp = lpuart32_read(&sport->port, UARTBAUD);
1264
+
1265
+ lpuart32_write(&sport->port, temp | UARTBAUD_RDMAE, UARTBAUD);
1266
+ } else {
1267
+ writeb(readb(sport->port.membase + UARTCR5) | UARTCR5_RDMAS,
1268
+ sport->port.membase + UARTCR5);
1269
+ }
10461270
10471271 return 0;
10481272 }
....@@ -1051,11 +1275,10 @@
10511275 {
10521276 struct lpuart_port *sport = container_of(port,
10531277 struct lpuart_port, port);
1278
+ struct dma_chan *chan = sport->dma_rx_chan;
10541279
1055
- if (sport->dma_rx_chan)
1056
- dmaengine_terminate_all(sport->dma_rx_chan);
1057
-
1058
- dma_unmap_sg(sport->port.dev, &sport->rx_sgl, 1, DMA_FROM_DEVICE);
1280
+ dmaengine_terminate_all(chan);
1281
+ dma_unmap_sg(chan->device->dev, &sport->rx_sgl, 1, DMA_FROM_DEVICE);
10591282 kfree(sport->rx_ring.buf);
10601283 sport->rx_ring.tail = 0;
10611284 sport->rx_ring.head = 0;
....@@ -1083,7 +1306,7 @@
10831306 modem |= UARTMODEM_TXRTSE;
10841307
10851308 /*
1086
- * RTS needs to be logic HIGH either during transer _or_ after
1309
+ * RTS needs to be logic HIGH either during transfer _or_ after
10871310 * transfer, other variants are not supported by the hardware.
10881311 */
10891312
....@@ -1114,6 +1337,57 @@
11141337 return 0;
11151338 }
11161339
1340
+static int lpuart32_config_rs485(struct uart_port *port,
1341
+ struct serial_rs485 *rs485)
1342
+{
1343
+ struct lpuart_port *sport = container_of(port,
1344
+ struct lpuart_port, port);
1345
+
1346
+ unsigned long modem = lpuart32_read(&sport->port, UARTMODIR)
1347
+ & ~(UARTMODEM_TXRTSPOL | UARTMODEM_TXRTSE);
1348
+ lpuart32_write(&sport->port, modem, UARTMODIR);
1349
+
1350
+ /* clear unsupported configurations */
1351
+ rs485->delay_rts_before_send = 0;
1352
+ rs485->delay_rts_after_send = 0;
1353
+ rs485->flags &= ~SER_RS485_RX_DURING_TX;
1354
+
1355
+ if (rs485->flags & SER_RS485_ENABLED) {
1356
+ /* Enable auto RS-485 RTS mode */
1357
+ modem |= UARTMODEM_TXRTSE;
1358
+
1359
+ /*
1360
+ * RTS needs to be logic HIGH either during transfer _or_ after
1361
+ * transfer, other variants are not supported by the hardware.
1362
+ */
1363
+
1364
+ if (!(rs485->flags & (SER_RS485_RTS_ON_SEND |
1365
+ SER_RS485_RTS_AFTER_SEND)))
1366
+ rs485->flags |= SER_RS485_RTS_ON_SEND;
1367
+
1368
+ if (rs485->flags & SER_RS485_RTS_ON_SEND &&
1369
+ rs485->flags & SER_RS485_RTS_AFTER_SEND)
1370
+ rs485->flags &= ~SER_RS485_RTS_AFTER_SEND;
1371
+
1372
+ /*
1373
+ * The hardware defaults to RTS logic HIGH while transfer.
1374
+ * Switch polarity in case RTS shall be logic HIGH
1375
+ * after transfer.
1376
+ * Note: UART is assumed to be active high.
1377
+ */
1378
+ if (rs485->flags & SER_RS485_RTS_ON_SEND)
1379
+ modem |= UARTMODEM_TXRTSPOL;
1380
+ else if (rs485->flags & SER_RS485_RTS_AFTER_SEND)
1381
+ modem &= ~UARTMODEM_TXRTSPOL;
1382
+ }
1383
+
1384
+ /* Store the new configuration */
1385
+ sport->port.rs485 = *rs485;
1386
+
1387
+ lpuart32_write(&sport->port, modem, UARTMODIR);
1388
+ return 0;
1389
+}
1390
+
11171391 static unsigned int lpuart_get_mctrl(struct uart_port *port)
11181392 {
11191393 unsigned int temp = 0;
....@@ -1131,17 +1405,7 @@
11311405
11321406 static unsigned int lpuart32_get_mctrl(struct uart_port *port)
11331407 {
1134
- unsigned int temp = 0;
1135
- unsigned long reg;
1136
-
1137
- reg = lpuart32_read(port, UARTMODIR);
1138
- if (reg & UARTMODIR_TXCTSE)
1139
- temp |= TIOCM_CTS;
1140
-
1141
- if (reg & UARTMODIR_RXRTSE)
1142
- temp |= TIOCM_RTS;
1143
-
1144
- return temp;
1408
+ return 0;
11451409 }
11461410
11471411 static void lpuart_set_mctrl(struct uart_port *port, unsigned int mctrl)
....@@ -1167,18 +1431,7 @@
11671431
11681432 static void lpuart32_set_mctrl(struct uart_port *port, unsigned int mctrl)
11691433 {
1170
- unsigned long temp;
11711434
1172
- temp = lpuart32_read(port, UARTMODIR) &
1173
- ~(UARTMODIR_RXRTSE | UARTMODIR_TXCTSE);
1174
-
1175
- if (mctrl & TIOCM_RTS)
1176
- temp |= UARTMODIR_RXRTSE;
1177
-
1178
- if (mctrl & TIOCM_CTS)
1179
- temp |= UARTMODIR_TXCTSE;
1180
-
1181
- lpuart32_write(port, temp, UARTMODIR);
11821435 }
11831436
11841437 static void lpuart_break_ctl(struct uart_port *port, int break_state)
....@@ -1237,6 +1490,17 @@
12371490 writeb(cr2_saved, sport->port.membase + UARTCR2);
12381491 }
12391492
1493
+static void lpuart_setup_watermark_enable(struct lpuart_port *sport)
1494
+{
1495
+ unsigned char cr2;
1496
+
1497
+ lpuart_setup_watermark(sport);
1498
+
1499
+ cr2 = readb(sport->port.membase + UARTCR2);
1500
+ cr2 |= UARTCR2_RIE | UARTCR2_RE | UARTCR2_TE;
1501
+ writeb(cr2, sport->port.membase + UARTCR2);
1502
+}
1503
+
12401504 static void lpuart32_setup_watermark(struct lpuart_port *sport)
12411505 {
12421506 unsigned long val, ctrl;
....@@ -1262,11 +1526,108 @@
12621526 lpuart32_write(&sport->port, ctrl_saved, UARTCTRL);
12631527 }
12641528
1529
+static void lpuart32_setup_watermark_enable(struct lpuart_port *sport)
1530
+{
1531
+ u32 temp;
1532
+
1533
+ lpuart32_setup_watermark(sport);
1534
+
1535
+ temp = lpuart32_read(&sport->port, UARTCTRL);
1536
+ temp |= UARTCTRL_RE | UARTCTRL_TE | UARTCTRL_ILIE;
1537
+ lpuart32_write(&sport->port, temp, UARTCTRL);
1538
+}
1539
+
12651540 static void rx_dma_timer_init(struct lpuart_port *sport)
12661541 {
1267
- timer_setup(&sport->lpuart_timer, lpuart_timer_func, 0);
1268
- sport->lpuart_timer.expires = jiffies + sport->dma_rx_timeout;
1269
- add_timer(&sport->lpuart_timer);
1542
+ timer_setup(&sport->lpuart_timer, lpuart_timer_func, 0);
1543
+ sport->lpuart_timer.expires = jiffies + sport->dma_rx_timeout;
1544
+ add_timer(&sport->lpuart_timer);
1545
+}
1546
+
1547
+static void lpuart_request_dma(struct lpuart_port *sport)
1548
+{
1549
+ sport->dma_tx_chan = dma_request_chan(sport->port.dev, "tx");
1550
+ if (IS_ERR(sport->dma_tx_chan)) {
1551
+ dev_dbg_once(sport->port.dev,
1552
+ "DMA tx channel request failed, operating without tx DMA (%ld)\n",
1553
+ PTR_ERR(sport->dma_tx_chan));
1554
+ sport->dma_tx_chan = NULL;
1555
+ }
1556
+
1557
+ sport->dma_rx_chan = dma_request_chan(sport->port.dev, "rx");
1558
+ if (IS_ERR(sport->dma_rx_chan)) {
1559
+ dev_dbg_once(sport->port.dev,
1560
+ "DMA rx channel request failed, operating without rx DMA (%ld)\n",
1561
+ PTR_ERR(sport->dma_rx_chan));
1562
+ sport->dma_rx_chan = NULL;
1563
+ }
1564
+}
1565
+
1566
+static void lpuart_tx_dma_startup(struct lpuart_port *sport)
1567
+{
1568
+ u32 uartbaud;
1569
+ int ret;
1570
+
1571
+ if (uart_console(&sport->port))
1572
+ goto err;
1573
+
1574
+ if (!sport->dma_tx_chan)
1575
+ goto err;
1576
+
1577
+ ret = lpuart_dma_tx_request(&sport->port);
1578
+ if (ret)
1579
+ goto err;
1580
+
1581
+ init_waitqueue_head(&sport->dma_wait);
1582
+ sport->lpuart_dma_tx_use = true;
1583
+ if (lpuart_is_32(sport)) {
1584
+ uartbaud = lpuart32_read(&sport->port, UARTBAUD);
1585
+ lpuart32_write(&sport->port,
1586
+ uartbaud | UARTBAUD_TDMAE, UARTBAUD);
1587
+ } else {
1588
+ writeb(readb(sport->port.membase + UARTCR5) |
1589
+ UARTCR5_TDMAS, sport->port.membase + UARTCR5);
1590
+ }
1591
+
1592
+ return;
1593
+
1594
+err:
1595
+ sport->lpuart_dma_tx_use = false;
1596
+}
1597
+
1598
+static void lpuart_rx_dma_startup(struct lpuart_port *sport)
1599
+{
1600
+ int ret;
1601
+ unsigned char cr3;
1602
+
1603
+ if (uart_console(&sport->port))
1604
+ goto err;
1605
+
1606
+ if (!sport->dma_rx_chan)
1607
+ goto err;
1608
+
1609
+ ret = lpuart_start_rx_dma(sport);
1610
+ if (ret)
1611
+ goto err;
1612
+
1613
+ /* set Rx DMA timeout */
1614
+ sport->dma_rx_timeout = msecs_to_jiffies(DMA_RX_TIMEOUT);
1615
+ if (!sport->dma_rx_timeout)
1616
+ sport->dma_rx_timeout = 1;
1617
+
1618
+ sport->lpuart_dma_rx_use = true;
1619
+ rx_dma_timer_init(sport);
1620
+
1621
+ if (sport->port.has_sysrq && !lpuart_is_32(sport)) {
1622
+ cr3 = readb(sport->port.membase + UARTCR3);
1623
+ cr3 |= UARTCR3_FEIE;
1624
+ writeb(cr3, sport->port.membase + UARTCR3);
1625
+ }
1626
+
1627
+ return;
1628
+
1629
+err:
1630
+ sport->lpuart_dma_rx_use = false;
12701631 }
12711632
12721633 static int lpuart_startup(struct uart_port *port)
....@@ -1278,46 +1639,43 @@
12781639 /* determine FIFO size and enable FIFO mode */
12791640 temp = readb(sport->port.membase + UARTPFIFO);
12801641
1281
- sport->txfifo_size = 0x1 << (((temp >> UARTPFIFO_TXSIZE_OFF) &
1282
- UARTPFIFO_FIFOSIZE_MASK) + 1);
1283
-
1642
+ sport->txfifo_size = UARTFIFO_DEPTH((temp >> UARTPFIFO_TXSIZE_OFF) &
1643
+ UARTPFIFO_FIFOSIZE_MASK);
12841644 sport->port.fifosize = sport->txfifo_size;
12851645
1286
- sport->rxfifo_size = 0x1 << (((temp >> UARTPFIFO_RXSIZE_OFF) &
1287
- UARTPFIFO_FIFOSIZE_MASK) + 1);
1646
+ sport->rxfifo_size = UARTFIFO_DEPTH((temp >> UARTPFIFO_RXSIZE_OFF) &
1647
+ UARTPFIFO_FIFOSIZE_MASK);
1648
+
1649
+ lpuart_request_dma(sport);
12881650
12891651 spin_lock_irqsave(&sport->port.lock, flags);
12901652
1291
- lpuart_setup_watermark(sport);
1653
+ lpuart_setup_watermark_enable(sport);
12921654
1293
- temp = readb(sport->port.membase + UARTCR2);
1294
- temp |= (UARTCR2_RIE | UARTCR2_TIE | UARTCR2_RE | UARTCR2_TE);
1295
- writeb(temp, sport->port.membase + UARTCR2);
1296
-
1297
- if (sport->dma_rx_chan && !lpuart_start_rx_dma(sport)) {
1298
- /* set Rx DMA timeout */
1299
- sport->dma_rx_timeout = msecs_to_jiffies(DMA_RX_TIMEOUT);
1300
- if (!sport->dma_rx_timeout)
1301
- sport->dma_rx_timeout = 1;
1302
-
1303
- sport->lpuart_dma_rx_use = true;
1304
- rx_dma_timer_init(sport);
1305
- } else {
1306
- sport->lpuart_dma_rx_use = false;
1307
- }
1308
-
1309
- if (sport->dma_tx_chan && !lpuart_dma_tx_request(port)) {
1310
- init_waitqueue_head(&sport->dma_wait);
1311
- sport->lpuart_dma_tx_use = true;
1312
- temp = readb(port->membase + UARTCR5);
1313
- writeb(temp | UARTCR5_TDMAS, port->membase + UARTCR5);
1314
- } else {
1315
- sport->lpuart_dma_tx_use = false;
1316
- }
1655
+ lpuart_rx_dma_startup(sport);
1656
+ lpuart_tx_dma_startup(sport);
13171657
13181658 spin_unlock_irqrestore(&sport->port.lock, flags);
13191659
13201660 return 0;
1661
+}
1662
+
1663
+static void lpuart32_configure(struct lpuart_port *sport)
1664
+{
1665
+ unsigned long temp;
1666
+
1667
+ if (sport->lpuart_dma_rx_use) {
1668
+ /* RXWATER must be 0 */
1669
+ temp = lpuart32_read(&sport->port, UARTWATER);
1670
+ temp &= ~(UARTWATER_WATER_MASK << UARTWATER_RXWATER_OFF);
1671
+ lpuart32_write(&sport->port, temp, UARTWATER);
1672
+ }
1673
+ temp = lpuart32_read(&sport->port, UARTCTRL);
1674
+ if (!sport->lpuart_dma_rx_use)
1675
+ temp |= UARTCTRL_RIE;
1676
+ if (!sport->lpuart_dma_tx_use)
1677
+ temp |= UARTCTRL_TIE;
1678
+ lpuart32_write(&sport->port, temp, UARTCTRL);
13211679 }
13221680
13231681 static int lpuart32_startup(struct uart_port *port)
....@@ -1329,23 +1687,60 @@
13291687 /* determine FIFO size */
13301688 temp = lpuart32_read(&sport->port, UARTFIFO);
13311689
1332
- sport->txfifo_size = 0x1 << (((temp >> UARTFIFO_TXSIZE_OFF) &
1333
- UARTFIFO_FIFOSIZE_MASK) - 1);
1690
+ sport->txfifo_size = UARTFIFO_DEPTH((temp >> UARTFIFO_TXSIZE_OFF) &
1691
+ UARTFIFO_FIFOSIZE_MASK);
1692
+ sport->port.fifosize = sport->txfifo_size;
13341693
1335
- sport->rxfifo_size = 0x1 << (((temp >> UARTFIFO_RXSIZE_OFF) &
1336
- UARTFIFO_FIFOSIZE_MASK) - 1);
1694
+ sport->rxfifo_size = UARTFIFO_DEPTH((temp >> UARTFIFO_RXSIZE_OFF) &
1695
+ UARTFIFO_FIFOSIZE_MASK);
1696
+
1697
+ /*
1698
+ * The LS1021A and LS1028A have a fixed FIFO depth of 16 words.
1699
+ * Although they support the RX/TXSIZE fields, their encoding is
1700
+ * different. Eg the reference manual states 0b101 is 16 words.
1701
+ */
1702
+ if (is_layerscape_lpuart(sport)) {
1703
+ sport->rxfifo_size = 16;
1704
+ sport->txfifo_size = 16;
1705
+ sport->port.fifosize = sport->txfifo_size;
1706
+ }
1707
+
1708
+ lpuart_request_dma(sport);
13371709
13381710 spin_lock_irqsave(&sport->port.lock, flags);
13391711
1340
- lpuart32_setup_watermark(sport);
1712
+ lpuart32_setup_watermark_enable(sport);
13411713
1342
- temp = lpuart32_read(&sport->port, UARTCTRL);
1343
- temp |= (UARTCTRL_RIE | UARTCTRL_TIE | UARTCTRL_RE | UARTCTRL_TE);
1344
- temp |= UARTCTRL_ILIE;
1345
- lpuart32_write(&sport->port, temp, UARTCTRL);
1714
+ lpuart_rx_dma_startup(sport);
1715
+ lpuart_tx_dma_startup(sport);
1716
+
1717
+ lpuart32_configure(sport);
13461718
13471719 spin_unlock_irqrestore(&sport->port.lock, flags);
13481720 return 0;
1721
+}
1722
+
1723
+static void lpuart_dma_shutdown(struct lpuart_port *sport)
1724
+{
1725
+ if (sport->lpuart_dma_rx_use) {
1726
+ del_timer_sync(&sport->lpuart_timer);
1727
+ lpuart_dma_rx_free(&sport->port);
1728
+ sport->lpuart_dma_rx_use = false;
1729
+ }
1730
+
1731
+ if (sport->lpuart_dma_tx_use) {
1732
+ if (wait_event_interruptible(sport->dma_wait,
1733
+ !sport->dma_tx_in_progress) != false) {
1734
+ sport->dma_tx_in_progress = false;
1735
+ dmaengine_terminate_all(sport->dma_tx_chan);
1736
+ }
1737
+ sport->lpuart_dma_tx_use = false;
1738
+ }
1739
+
1740
+ if (sport->dma_tx_chan)
1741
+ dma_release_channel(sport->dma_tx_chan);
1742
+ if (sport->dma_rx_chan)
1743
+ dma_release_channel(sport->dma_rx_chan);
13491744 }
13501745
13511746 static void lpuart_shutdown(struct uart_port *port)
....@@ -1364,24 +1759,13 @@
13641759
13651760 spin_unlock_irqrestore(&port->lock, flags);
13661761
1367
- if (sport->lpuart_dma_rx_use) {
1368
- del_timer_sync(&sport->lpuart_timer);
1369
- lpuart_dma_rx_free(&sport->port);
1370
- }
1371
-
1372
- if (sport->lpuart_dma_tx_use) {
1373
- if (wait_event_interruptible(sport->dma_wait,
1374
- !sport->dma_tx_in_progress) != false) {
1375
- sport->dma_tx_in_progress = false;
1376
- dmaengine_terminate_all(sport->dma_tx_chan);
1377
- }
1378
-
1379
- lpuart_stop_tx(port);
1380
- }
1762
+ lpuart_dma_shutdown(sport);
13811763 }
13821764
13831765 static void lpuart32_shutdown(struct uart_port *port)
13841766 {
1767
+ struct lpuart_port *sport =
1768
+ container_of(port, struct lpuart_port, port);
13851769 unsigned long temp;
13861770 unsigned long flags;
13871771
....@@ -1394,6 +1778,8 @@
13941778 lpuart32_write(port, temp, UARTCTRL);
13951779
13961780 spin_unlock_irqrestore(&port->lock, flags);
1781
+
1782
+ lpuart_dma_shutdown(sport);
13971783 }
13981784
13991785 static void
....@@ -1447,21 +1833,18 @@
14471833 if (sport->port.rs485.flags & SER_RS485_ENABLED)
14481834 termios->c_cflag &= ~CRTSCTS;
14491835
1450
- if (termios->c_cflag & CRTSCTS) {
1451
- modem |= (UARTMODEM_RXRTSE | UARTMODEM_TXCTSE);
1452
- } else {
1453
- termios->c_cflag &= ~CRTSCTS;
1836
+ if (termios->c_cflag & CRTSCTS)
1837
+ modem |= UARTMODEM_RXRTSE | UARTMODEM_TXCTSE;
1838
+ else
14541839 modem &= ~(UARTMODEM_RXRTSE | UARTMODEM_TXCTSE);
1455
- }
14561840
1457
- if (termios->c_cflag & CSTOPB)
1458
- termios->c_cflag &= ~CSTOPB;
1841
+ termios->c_cflag &= ~CSTOPB;
14591842
14601843 /* parity must be enabled when CS7 to match 8-bits format */
14611844 if ((termios->c_cflag & CSIZE) == CS7)
14621845 termios->c_cflag |= PARENB;
14631846
1464
- if ((termios->c_cflag & PARENB)) {
1847
+ if (termios->c_cflag & PARENB) {
14651848 if (termios->c_cflag & CMSPAR) {
14661849 cr1 &= ~UARTCR1_PE;
14671850 if (termios->c_cflag & PARODD)
....@@ -1500,7 +1883,7 @@
15001883
15011884 sport->port.read_status_mask = 0;
15021885 if (termios->c_iflag & INPCK)
1503
- sport->port.read_status_mask |= (UARTSR1_FE | UARTSR1_PE);
1886
+ sport->port.read_status_mask |= UARTSR1_FE | UARTSR1_PE;
15041887 if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK))
15051888 sport->port.read_status_mask |= UARTSR1_FE;
15061889
....@@ -1522,8 +1905,7 @@
15221905 uart_update_timeout(port, termios->c_cflag, baud);
15231906
15241907 /* wait transmit engin complete */
1525
- while (!(readb(sport->port.membase + UARTSR1) & UARTSR1_TC))
1526
- barrier();
1908
+ lpuart_wait_bit_set(&sport->port, UARTSR1, UARTSR1_TC);
15271909
15281910 /* disable transmit and receive */
15291911 writeb(old_cr2 & ~(UARTCR2_TE | UARTCR2_RE),
....@@ -1555,11 +1937,12 @@
15551937 spin_unlock_irqrestore(&sport->port.lock, flags);
15561938 }
15571939
1558
-static void
1559
-lpuart32_serial_setbrg(struct lpuart_port *sport, unsigned int baudrate)
1940
+static void __lpuart32_serial_setbrg(struct uart_port *port,
1941
+ unsigned int baudrate, bool use_rx_dma,
1942
+ bool use_tx_dma)
15601943 {
15611944 u32 sbr, osr, baud_diff, tmp_osr, tmp_sbr, tmp_diff, tmp;
1562
- u32 clk = sport->port.uartclk;
1945
+ u32 clk = port->uartclk;
15631946
15641947 /*
15651948 * The idea is to use the best OSR (over-sampling rate) possible.
....@@ -1593,6 +1976,9 @@
15931976 tmp_sbr++;
15941977 }
15951978
1979
+ if (tmp_sbr > UARTBAUD_SBR_MASK)
1980
+ continue;
1981
+
15961982 if (tmp_diff <= baud_diff) {
15971983 baud_diff = tmp_diff;
15981984 osr = tmp_osr;
....@@ -1605,24 +1991,36 @@
16051991
16061992 /* handle buadrate outside acceptable rate */
16071993 if (baud_diff > ((baudrate / 100) * 3))
1608
- dev_warn(sport->port.dev,
1994
+ dev_warn(port->dev,
16091995 "unacceptable baud rate difference of more than 3%%\n");
16101996
1611
- tmp = lpuart32_read(&sport->port, UARTBAUD);
1997
+ tmp = lpuart32_read(port, UARTBAUD);
16121998
16131999 if ((osr > 3) && (osr < 8))
16142000 tmp |= UARTBAUD_BOTHEDGE;
16152001
16162002 tmp &= ~(UARTBAUD_OSR_MASK << UARTBAUD_OSR_SHIFT);
1617
- tmp |= (((osr-1) & UARTBAUD_OSR_MASK) << UARTBAUD_OSR_SHIFT);
2003
+ tmp |= ((osr-1) & UARTBAUD_OSR_MASK) << UARTBAUD_OSR_SHIFT;
16182004
16192005 tmp &= ~UARTBAUD_SBR_MASK;
16202006 tmp |= sbr & UARTBAUD_SBR_MASK;
16212007
1622
- tmp &= ~(UARTBAUD_TDMAE | UARTBAUD_RDMAE);
2008
+ if (!use_rx_dma)
2009
+ tmp &= ~UARTBAUD_RDMAE;
2010
+ if (!use_tx_dma)
2011
+ tmp &= ~UARTBAUD_TDMAE;
16232012
1624
- lpuart32_write(&sport->port, tmp, UARTBAUD);
2013
+ lpuart32_write(port, tmp, UARTBAUD);
16252014 }
2015
+
2016
+static void lpuart32_serial_setbrg(struct lpuart_port *sport,
2017
+ unsigned int baudrate)
2018
+{
2019
+ __lpuart32_serial_setbrg(&sport->port, baudrate,
2020
+ sport->lpuart_dma_rx_use,
2021
+ sport->lpuart_dma_tx_use);
2022
+}
2023
+
16262024
16272025 static void
16282026 lpuart32_set_termios(struct uart_port *port, struct ktermios *termios,
....@@ -1663,11 +2061,18 @@
16632061 ctrl |= UARTCTRL_M;
16642062 }
16652063
2064
+ /*
2065
+ * When auto RS-485 RTS mode is enabled,
2066
+ * hardware flow control need to be disabled.
2067
+ */
2068
+ if (sport->port.rs485.flags & SER_RS485_ENABLED)
2069
+ termios->c_cflag &= ~CRTSCTS;
2070
+
16662071 if (termios->c_cflag & CRTSCTS) {
1667
- modem |= (UARTMODEM_RXRTSE | UARTMODEM_TXCTSE);
2072
+ modem |= (UARTMODIR_RXRTSE | UARTMODIR_TXCTSE);
16682073 } else {
16692074 termios->c_cflag &= ~CRTSCTS;
1670
- modem &= ~(UARTMODEM_RXRTSE | UARTMODEM_TXCTSE);
2075
+ modem &= ~(UARTMODIR_RXRTSE | UARTMODIR_TXCTSE);
16712076 }
16722077
16732078 if (termios->c_cflag & CSTOPB)
....@@ -1682,7 +2087,7 @@
16822087 ctrl &= ~UARTCTRL_PE;
16832088 ctrl |= UARTCTRL_M;
16842089 } else {
1685
- ctrl |= UARTCR1_PE;
2090
+ ctrl |= UARTCTRL_PE;
16862091 if ((termios->c_cflag & CSIZE) == CS8)
16872092 ctrl |= UARTCTRL_M;
16882093 if (termios->c_cflag & PARODD)
....@@ -1697,11 +2102,23 @@
16972102 /* ask the core to calculate the divisor */
16982103 baud = uart_get_baud_rate(port, termios, old, 50, port->uartclk / 4);
16992104
2105
+ /*
2106
+ * Need to update the Ring buffer length according to the selected
2107
+ * baud rate and restart Rx DMA path.
2108
+ *
2109
+ * Since timer function acqures sport->port.lock, need to stop before
2110
+ * acquring same lock because otherwise del_timer_sync() can deadlock.
2111
+ */
2112
+ if (old && sport->lpuart_dma_rx_use) {
2113
+ del_timer_sync(&sport->lpuart_timer);
2114
+ lpuart_dma_rx_free(&sport->port);
2115
+ }
2116
+
17002117 spin_lock_irqsave(&sport->port.lock, flags);
17012118
17022119 sport->port.read_status_mask = 0;
17032120 if (termios->c_iflag & INPCK)
1704
- sport->port.read_status_mask |= (UARTSTAT_FE | UARTSTAT_PE);
2121
+ sport->port.read_status_mask |= UARTSTAT_FE | UARTSTAT_PE;
17052122 if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK))
17062123 sport->port.read_status_mask |= UARTSTAT_FE;
17072124
....@@ -1723,8 +2140,8 @@
17232140 uart_update_timeout(port, termios->c_cflag, baud);
17242141
17252142 /* wait transmit engin complete */
1726
- while (!(lpuart32_read(&sport->port, UARTSTAT) & UARTSTAT_TC))
1727
- barrier();
2143
+ lpuart32_write(&sport->port, 0, UARTMODIR);
2144
+ lpuart32_wait_bit_set(&sport->port, UARTSTAT, UARTSTAT_TC);
17282145
17292146 /* disable transmit and receive */
17302147 lpuart32_write(&sport->port, old_ctrl & ~(UARTCTRL_TE | UARTCTRL_RE),
....@@ -1734,6 +2151,13 @@
17342151 lpuart32_write(&sport->port, modem, UARTMODIR);
17352152 lpuart32_write(&sport->port, ctrl, UARTCTRL);
17362153 /* restore control register */
2154
+
2155
+ if (old && sport->lpuart_dma_rx_use) {
2156
+ if (!lpuart_start_rx_dma(sport))
2157
+ rx_dma_timer_init(sport);
2158
+ else
2159
+ sport->lpuart_dma_rx_use = false;
2160
+ }
17372161
17382162 spin_unlock_irqrestore(&sport->port.lock, flags);
17392163 }
....@@ -1832,17 +2256,13 @@
18322256 #ifdef CONFIG_SERIAL_FSL_LPUART_CONSOLE
18332257 static void lpuart_console_putchar(struct uart_port *port, int ch)
18342258 {
1835
- while (!(readb(port->membase + UARTSR1) & UARTSR1_TDRE))
1836
- barrier();
1837
-
2259
+ lpuart_wait_bit_set(port, UARTSR1, UARTSR1_TDRE);
18382260 writeb(ch, port->membase + UARTDR);
18392261 }
18402262
18412263 static void lpuart32_console_putchar(struct uart_port *port, int ch)
18422264 {
1843
- while (!(lpuart32_read(port, UARTSTAT) & UARTSTAT_TDRE))
1844
- barrier();
1845
-
2265
+ lpuart32_wait_bit_set(port, UARTSTAT, UARTSTAT_TDRE);
18462266 lpuart32_write(port, ch, UARTDATA);
18472267 }
18482268
....@@ -1861,15 +2281,14 @@
18612281
18622282 /* first save CR2 and then disable interrupts */
18632283 cr2 = old_cr2 = readb(sport->port.membase + UARTCR2);
1864
- cr2 |= (UARTCR2_TE | UARTCR2_RE);
2284
+ cr2 |= UARTCR2_TE | UARTCR2_RE;
18652285 cr2 &= ~(UARTCR2_TIE | UARTCR2_TCIE | UARTCR2_RIE);
18662286 writeb(cr2, sport->port.membase + UARTCR2);
18672287
18682288 uart_console_write(&sport->port, s, count, lpuart_console_putchar);
18692289
18702290 /* wait for transmitter finish complete and restore CR2 */
1871
- while (!(readb(sport->port.membase + UARTSR1) & UARTSR1_TC))
1872
- barrier();
2291
+ lpuart_wait_bit_set(&sport->port, UARTSR1, UARTSR1_TC);
18732292
18742293 writeb(old_cr2, sport->port.membase + UARTCR2);
18752294
....@@ -1892,15 +2311,14 @@
18922311
18932312 /* first save CR2 and then disable interrupts */
18942313 cr = old_cr = lpuart32_read(&sport->port, UARTCTRL);
1895
- cr |= (UARTCTRL_TE | UARTCTRL_RE);
2314
+ cr |= UARTCTRL_TE | UARTCTRL_RE;
18962315 cr &= ~(UARTCTRL_TIE | UARTCTRL_TCIE | UARTCTRL_RIE);
18972316 lpuart32_write(&sport->port, cr, UARTCTRL);
18982317
18992318 uart_console_write(&sport->port, s, count, lpuart32_console_putchar);
19002319
19012320 /* wait for transmitter finish complete and restore CR2 */
1902
- while (!(lpuart32_read(&sport->port, UARTSTAT) & UARTSTAT_TC))
1903
- barrier();
2321
+ lpuart32_wait_bit_set(&sport->port, UARTSTAT, UARTSTAT_TC);
19042322
19052323 lpuart32_write(&sport->port, old_cr, UARTCTRL);
19062324
....@@ -1950,14 +2368,14 @@
19502368 brfa = readb(sport->port.membase + UARTCR4);
19512369 brfa &= UARTCR4_BRFA_MASK;
19522370
1953
- uartclk = clk_get_rate(sport->clk);
2371
+ uartclk = lpuart_get_baud_clk_rate(sport);
19542372 /*
19552373 * baud = mod_clk/(16*(sbr[13]+(brfa)/32)
19562374 */
19572375 baud_raw = uartclk / (16 * (sbr + brfa / 32));
19582376
19592377 if (*baud != baud_raw)
1960
- printk(KERN_INFO "Serial: Console lpuart rounded baud rate"
2378
+ dev_info(sport->port.dev, "Serial: Console lpuart rounded baud rate"
19612379 "from %d to %d\n", baud_raw, *baud);
19622380 }
19632381
....@@ -1996,14 +2414,14 @@
19962414 return;
19972415
19982416 sbr = bd;
1999
- uartclk = clk_get_rate(sport->clk);
2417
+ uartclk = lpuart_get_baud_clk_rate(sport);
20002418 /*
20012419 * baud = mod_clk/(16*(sbr[13]+(brfa)/32)
20022420 */
20032421 baud_raw = uartclk / (16 * sbr);
20042422
20052423 if (*baud != baud_raw)
2006
- printk(KERN_INFO "Serial: Console lpuart rounded baud rate"
2424
+ dev_info(sport->port.dev, "Serial: Console lpuart rounded baud rate"
20072425 "from %d to %d\n", baud_raw, *baud);
20082426 }
20092427
....@@ -2094,8 +2512,34 @@
20942512 if (!device->port.membase)
20952513 return -ENODEV;
20962514
2097
- device->port.iotype = UPIO_MEM32BE;
2515
+ if (device->port.iotype != UPIO_MEM32)
2516
+ device->port.iotype = UPIO_MEM32BE;
2517
+
20982518 device->con->write = lpuart32_early_write;
2519
+ return 0;
2520
+}
2521
+
2522
+static int __init ls1028a_early_console_setup(struct earlycon_device *device,
2523
+ const char *opt)
2524
+{
2525
+ u32 cr;
2526
+
2527
+ if (!device->port.membase)
2528
+ return -ENODEV;
2529
+
2530
+ device->port.iotype = UPIO_MEM32;
2531
+ device->con->write = lpuart32_early_write;
2532
+
2533
+ /* set the baudrate */
2534
+ if (device->port.uartclk && device->baud)
2535
+ __lpuart32_serial_setbrg(&device->port, device->baud,
2536
+ false, false);
2537
+
2538
+ /* enable transmitter */
2539
+ cr = lpuart32_read(&device->port, UARTCTRL);
2540
+ cr |= UARTCTRL_TE;
2541
+ lpuart32_write(&device->port, cr, UARTCTRL);
2542
+
20992543 return 0;
21002544 }
21012545
....@@ -2113,7 +2557,9 @@
21132557 }
21142558 OF_EARLYCON_DECLARE(lpuart, "fsl,vf610-lpuart", lpuart_early_console_setup);
21152559 OF_EARLYCON_DECLARE(lpuart32, "fsl,ls1021a-lpuart", lpuart32_early_console_setup);
2560
+OF_EARLYCON_DECLARE(lpuart32, "fsl,ls1028a-lpuart", ls1028a_early_console_setup);
21162561 OF_EARLYCON_DECLARE(lpuart32, "fsl,imx7ulp-lpuart", lpuart32_imx_early_console_setup);
2562
+OF_EARLYCON_DECLARE(lpuart32, "fsl,imx8qxp-lpuart", lpuart32_imx_early_console_setup);
21172563 EARLYCON_DECLARE(lpuart, lpuart_early_console_setup);
21182564 EARLYCON_DECLARE(lpuart32, lpuart32_early_console_setup);
21192565
....@@ -2146,7 +2592,49 @@
21462592 if (!sport)
21472593 return -ENOMEM;
21482594
2149
- pdev->dev.coherent_dma_mask = 0;
2595
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2596
+ sport->port.membase = devm_ioremap_resource(&pdev->dev, res);
2597
+ if (IS_ERR(sport->port.membase))
2598
+ return PTR_ERR(sport->port.membase);
2599
+
2600
+ sport->port.membase += sdata->reg_off;
2601
+ sport->port.mapbase = res->start + sdata->reg_off;
2602
+ sport->port.dev = &pdev->dev;
2603
+ sport->port.type = PORT_LPUART;
2604
+ sport->devtype = sdata->devtype;
2605
+ ret = platform_get_irq(pdev, 0);
2606
+ if (ret < 0)
2607
+ return ret;
2608
+ sport->port.irq = ret;
2609
+ sport->port.iotype = sdata->iotype;
2610
+ if (lpuart_is_32(sport))
2611
+ sport->port.ops = &lpuart32_pops;
2612
+ else
2613
+ sport->port.ops = &lpuart_pops;
2614
+ sport->port.has_sysrq = IS_ENABLED(CONFIG_SERIAL_FSL_LPUART_CONSOLE);
2615
+ sport->port.flags = UPF_BOOT_AUTOCONF;
2616
+
2617
+ if (lpuart_is_32(sport))
2618
+ sport->port.rs485_config = lpuart32_config_rs485;
2619
+ else
2620
+ sport->port.rs485_config = lpuart_config_rs485;
2621
+
2622
+ sport->ipg_clk = devm_clk_get(&pdev->dev, "ipg");
2623
+ if (IS_ERR(sport->ipg_clk)) {
2624
+ ret = PTR_ERR(sport->ipg_clk);
2625
+ dev_err(&pdev->dev, "failed to get uart ipg clk: %d\n", ret);
2626
+ return ret;
2627
+ }
2628
+
2629
+ sport->baud_clk = NULL;
2630
+ if (is_imx8qxp_lpuart(sport)) {
2631
+ sport->baud_clk = devm_clk_get(&pdev->dev, "baud");
2632
+ if (IS_ERR(sport->baud_clk)) {
2633
+ ret = PTR_ERR(sport->baud_clk);
2634
+ dev_err(&pdev->dev, "failed to get uart baud clk: %d\n", ret);
2635
+ return ret;
2636
+ }
2637
+ }
21502638
21512639 ret = of_alias_get_id(np, "serial");
21522640 if (ret < 0) {
....@@ -2158,44 +2646,11 @@
21582646 return -EINVAL;
21592647 }
21602648 sport->port.line = ret;
2161
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2162
- sport->port.membase = devm_ioremap_resource(&pdev->dev, res);
2163
- if (IS_ERR(sport->port.membase))
2164
- return PTR_ERR(sport->port.membase);
21652649
2166
- sport->port.membase += sdata->reg_off;
2167
- sport->port.mapbase = res->start + sdata->reg_off;
2168
- sport->port.dev = &pdev->dev;
2169
- sport->port.type = PORT_LPUART;
2170
- ret = platform_get_irq(pdev, 0);
2171
- if (ret < 0) {
2172
- dev_err(&pdev->dev, "cannot obtain irq\n");
2650
+ ret = lpuart_enable_clks(sport);
2651
+ if (ret)
21732652 return ret;
2174
- }
2175
- sport->port.irq = ret;
2176
- sport->port.iotype = sdata->iotype;
2177
- if (lpuart_is_32(sport))
2178
- sport->port.ops = &lpuart32_pops;
2179
- else
2180
- sport->port.ops = &lpuart_pops;
2181
- sport->port.flags = UPF_BOOT_AUTOCONF;
2182
-
2183
- sport->port.rs485_config = lpuart_config_rs485;
2184
-
2185
- sport->clk = devm_clk_get(&pdev->dev, "ipg");
2186
- if (IS_ERR(sport->clk)) {
2187
- ret = PTR_ERR(sport->clk);
2188
- dev_err(&pdev->dev, "failed to get uart clk: %d\n", ret);
2189
- return ret;
2190
- }
2191
-
2192
- ret = clk_prepare_enable(sport->clk);
2193
- if (ret) {
2194
- dev_err(&pdev->dev, "failed to enable uart clk: %d\n", ret);
2195
- return ret;
2196
- }
2197
-
2198
- sport->port.uartclk = clk_get_rate(sport->clk);
2653
+ sport->port.uartclk = lpuart_get_baud_clk_rate(sport);
21992654
22002655 lpuart_ports[sport->port.line] = sport;
22012656
....@@ -2214,11 +2669,9 @@
22142669 if (ret)
22152670 goto failed_irq_request;
22162671
2217
- ret = uart_add_one_port(&lpuart_reg, &sport->port);
2672
+ ret = uart_get_rs485_mode(&sport->port);
22182673 if (ret)
2219
- goto failed_attach_port;
2220
-
2221
- uart_get_rs485_mode(&pdev->dev, &sport->port.rs485);
2674
+ goto failed_get_rs485;
22222675
22232676 if (sport->port.rs485.flags & SER_RS485_RX_DURING_TX)
22242677 dev_err(&pdev->dev, "driver doesn't support RX during TX\n");
....@@ -2227,23 +2680,16 @@
22272680 sport->port.rs485.delay_rts_after_send)
22282681 dev_err(&pdev->dev, "driver doesn't support RTS delays\n");
22292682
2230
- lpuart_config_rs485(&sport->port, &sport->port.rs485);
2231
-
2232
- sport->dma_tx_chan = dma_request_slave_channel(sport->port.dev, "tx");
2233
- if (!sport->dma_tx_chan)
2234
- dev_info(sport->port.dev, "DMA tx channel request failed, "
2235
- "operating without tx DMA\n");
2236
-
2237
- sport->dma_rx_chan = dma_request_slave_channel(sport->port.dev, "rx");
2238
- if (!sport->dma_rx_chan)
2239
- dev_info(sport->port.dev, "DMA rx channel request failed, "
2240
- "operating without rx DMA\n");
2683
+ ret = uart_add_one_port(&lpuart_reg, &sport->port);
2684
+ if (ret)
2685
+ goto failed_attach_port;
22412686
22422687 return 0;
22432688
2689
+failed_get_rs485:
22442690 failed_attach_port:
22452691 failed_irq_request:
2246
- clk_disable_unprepare(sport->clk);
2692
+ lpuart_disable_clks(sport);
22472693 return ret;
22482694 }
22492695
....@@ -2253,7 +2699,7 @@
22532699
22542700 uart_remove_one_port(&lpuart_reg, &sport->port);
22552701
2256
- clk_disable_unprepare(sport->clk);
2702
+ lpuart_disable_clks(sport);
22572703
22582704 if (sport->dma_tx_chan)
22592705 dma_release_channel(sport->dma_tx_chan);
....@@ -2264,8 +2710,7 @@
22642710 return 0;
22652711 }
22662712
2267
-#ifdef CONFIG_PM_SLEEP
2268
-static int lpuart_suspend(struct device *dev)
2713
+static int __maybe_unused lpuart_suspend(struct device *dev)
22692714 {
22702715 struct lpuart_port *sport = dev_get_drvdata(dev);
22712716 unsigned long temp;
....@@ -2302,8 +2747,14 @@
23022747 }
23032748
23042749 /* Disable Rx DMA to use UART port as wakeup source */
2305
- writeb(readb(sport->port.membase + UARTCR5) & ~UARTCR5_RDMAS,
2306
- sport->port.membase + UARTCR5);
2750
+ if (lpuart_is_32(sport)) {
2751
+ temp = lpuart32_read(&sport->port, UARTBAUD);
2752
+ lpuart32_write(&sport->port, temp & ~UARTBAUD_RDMAE,
2753
+ UARTBAUD);
2754
+ } else {
2755
+ writeb(readb(sport->port.membase + UARTCR5) &
2756
+ ~UARTCR5_RDMAS, sport->port.membase + UARTCR5);
2757
+ }
23072758 }
23082759
23092760 if (sport->lpuart_dma_tx_use) {
....@@ -2312,32 +2763,23 @@
23122763 }
23132764
23142765 if (sport->port.suspended && !irq_wake)
2315
- clk_disable_unprepare(sport->clk);
2766
+ lpuart_disable_clks(sport);
23162767
23172768 return 0;
23182769 }
23192770
2320
-static int lpuart_resume(struct device *dev)
2771
+static int __maybe_unused lpuart_resume(struct device *dev)
23212772 {
23222773 struct lpuart_port *sport = dev_get_drvdata(dev);
23232774 bool irq_wake = irqd_is_wakeup_set(irq_get_irq_data(sport->port.irq));
2324
- unsigned long temp;
23252775
23262776 if (sport->port.suspended && !irq_wake)
2327
- clk_prepare_enable(sport->clk);
2777
+ lpuart_enable_clks(sport);
23282778
2329
- if (lpuart_is_32(sport)) {
2330
- lpuart32_setup_watermark(sport);
2331
- temp = lpuart32_read(&sport->port, UARTCTRL);
2332
- temp |= (UARTCTRL_RIE | UARTCTRL_TIE | UARTCTRL_RE |
2333
- UARTCTRL_TE | UARTCTRL_ILIE);
2334
- lpuart32_write(&sport->port, temp, UARTCTRL);
2335
- } else {
2336
- lpuart_setup_watermark(sport);
2337
- temp = readb(sport->port.membase + UARTCR2);
2338
- temp |= (UARTCR2_RIE | UARTCR2_TIE | UARTCR2_RE | UARTCR2_TE);
2339
- writeb(temp, sport->port.membase + UARTCR2);
2340
- }
2779
+ if (lpuart_is_32(sport))
2780
+ lpuart32_setup_watermark_enable(sport);
2781
+ else
2782
+ lpuart_setup_watermark_enable(sport);
23412783
23422784 if (sport->lpuart_dma_rx_use) {
23432785 if (irq_wake) {
....@@ -2348,20 +2790,15 @@
23482790 }
23492791 }
23502792
2351
- if (sport->dma_tx_chan && !lpuart_dma_tx_request(&sport->port)) {
2352
- init_waitqueue_head(&sport->dma_wait);
2353
- sport->lpuart_dma_tx_use = true;
2354
- writeb(readb(sport->port.membase + UARTCR5) |
2355
- UARTCR5_TDMAS, sport->port.membase + UARTCR5);
2356
- } else {
2357
- sport->lpuart_dma_tx_use = false;
2358
- }
2793
+ lpuart_tx_dma_startup(sport);
2794
+
2795
+ if (lpuart_is_32(sport))
2796
+ lpuart32_configure(sport);
23592797
23602798 uart_resume_port(&lpuart_reg, &sport->port);
23612799
23622800 return 0;
23632801 }
2364
-#endif
23652802
23662803 static SIMPLE_DEV_PM_OPS(lpuart_pm_ops, lpuart_suspend, lpuart_resume);
23672804