|
@@ -341,7 +341,8 @@ static void s3c24xx_serial_start_next_tx(struct s3c24xx_uart_port *ourport)
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
- if (!ourport->dma || !ourport->dma->tx_chan || count < port->fifosize)
|
|
|
|
|
|
+ if (!ourport->dma || !ourport->dma->tx_chan ||
|
|
|
|
+ count < ourport->min_dma_size)
|
|
s3c24xx_serial_start_tx_pio(ourport);
|
|
s3c24xx_serial_start_tx_pio(ourport);
|
|
else
|
|
else
|
|
s3c24xx_serial_start_tx_dma(ourport, count);
|
|
s3c24xx_serial_start_tx_dma(ourport, count);
|
|
@@ -741,7 +742,8 @@ static irqreturn_t s3c24xx_serial_tx_chars(int irq, void *id)
|
|
|
|
|
|
count = CIRC_CNT_TO_END(xmit->head, xmit->tail, UART_XMIT_SIZE);
|
|
count = CIRC_CNT_TO_END(xmit->head, xmit->tail, UART_XMIT_SIZE);
|
|
|
|
|
|
- if (ourport->dma && ourport->dma->tx_chan && count >= port->fifosize) {
|
|
|
|
|
|
+ if (ourport->dma && ourport->dma->tx_chan &&
|
|
|
|
+ count >= ourport->min_dma_size) {
|
|
s3c24xx_serial_start_tx_dma(ourport, count);
|
|
s3c24xx_serial_start_tx_dma(ourport, count);
|
|
goto out;
|
|
goto out;
|
|
}
|
|
}
|
|
@@ -1837,6 +1839,13 @@ static int s3c24xx_serial_probe(struct platform_device *pdev)
|
|
else if (ourport->info->fifosize)
|
|
else if (ourport->info->fifosize)
|
|
ourport->port.fifosize = ourport->info->fifosize;
|
|
ourport->port.fifosize = ourport->info->fifosize;
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * DMA transfers must be aligned at least to cache line size,
|
|
|
|
+ * so find minimal transfer size suitable for DMA mode
|
|
|
|
+ */
|
|
|
|
+ ourport->min_dma_size = max_t(int, ourport->port.fifosize,
|
|
|
|
+ dma_get_cache_alignment());
|
|
|
|
+
|
|
probe_index++;
|
|
probe_index++;
|
|
|
|
|
|
dbg("%s: initialising port %p...\n", __func__, ourport);
|
|
dbg("%s: initialising port %p...\n", __func__, ourport);
|