Commit ab2375f2 authored by Sonic Zhang's avatar Sonic Zhang Committed by Linus Torvalds

Blackfin Serial Driver: Fix bug - request UART2/3 peripheral mapped interrupts in PIO mode

Signed-off-by: default avatarSonic Zhang <sonic.zhang@analog.com>
Signed-off-by: default avatarBryan Wu <cooloney@kernel.org>
Signed-off-by: default avatarAlan Cox <alan@redhat.com>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent b3ef5aba
...@@ -117,15 +117,14 @@ int request_dma(unsigned int channel, char *device_id) ...@@ -117,15 +117,14 @@ int request_dma(unsigned int channel, char *device_id)
#ifdef CONFIG_BF54x #ifdef CONFIG_BF54x
if (channel >= CH_UART2_RX && channel <= CH_UART3_TX) { if (channel >= CH_UART2_RX && channel <= CH_UART3_TX) {
if (strncmp(device_id, "BFIN_UART", 9) == 0) { unsigned int per_map;
dma_ch[channel].regs->peripheral_map &= 0x0FFF; per_map = dma_ch[channel].regs->peripheral_map & 0xFFF;
dma_ch[channel].regs->peripheral_map |= if (strncmp(device_id, "BFIN_UART", 9) == 0)
dma_ch[channel].regs->peripheral_map = per_map |
((channel - CH_UART2_RX + 0xC)<<12); ((channel - CH_UART2_RX + 0xC)<<12);
} else { else
dma_ch[channel].regs->peripheral_map &= 0x0FFF; dma_ch[channel].regs->peripheral_map = per_map |
dma_ch[channel].regs->peripheral_map |=
((channel - CH_UART2_RX + 0x6)<<12); ((channel - CH_UART2_RX + 0x6)<<12);
}
} }
#endif #endif
......
...@@ -649,6 +649,42 @@ static int bfin_serial_startup(struct uart_port *port) ...@@ -649,6 +649,42 @@ static int bfin_serial_startup(struct uart_port *port)
free_irq(uart->port.irq, uart); free_irq(uart->port.irq, uart);
return -EBUSY; return -EBUSY;
} }
# ifdef CONFIG_BF54x
{
unsigned uart_dma_ch_rx, uart_dma_ch_tx;
switch (uart->port.irq) {
case IRQ_UART3_RX:
uart_dma_ch_rx = CH_UART3_RX;
uart_dma_ch_tx = CH_UART3_TX;
break;
case IRQ_UART2_RX:
uart_dma_ch_rx = CH_UART2_RX;
uart_dma_ch_tx = CH_UART2_TX;
break;
default:
uart_dma_ch_rx = uart_dma_ch_tx = 0;
break;
};
if (uart_dma_ch_rx &&
request_dma(uart_dma_ch_rx, "BFIN_UART_RX") < 0) {
printk(KERN_NOTICE"Fail to attach UART interrupt\n");
free_irq(uart->port.irq, uart);
free_irq(uart->port.irq + 1, uart);
return -EBUSY;
}
if (uart_dma_ch_tx &&
request_dma(uart_dma_ch_tx, "BFIN_UART_TX") < 0) {
printk(KERN_NOTICE "Fail to attach UART interrupt\n");
free_dma(uart_dma_ch_rx);
free_irq(uart->port.irq, uart);
free_irq(uart->port.irq + 1, uart);
return -EBUSY;
}
}
# endif
#endif #endif
UART_SET_IER(uart, ERBFI); UART_SET_IER(uart, ERBFI);
return 0; return 0;
...@@ -666,6 +702,20 @@ static void bfin_serial_shutdown(struct uart_port *port) ...@@ -666,6 +702,20 @@ static void bfin_serial_shutdown(struct uart_port *port)
del_timer(&(uart->rx_dma_timer)); del_timer(&(uart->rx_dma_timer));
dma_free_coherent(NULL, PAGE_SIZE, uart->rx_dma_buf.buf, 0); dma_free_coherent(NULL, PAGE_SIZE, uart->rx_dma_buf.buf, 0);
#else #else
#ifdef CONFIG_BF54x
switch (uart->port.irq) {
case IRQ_UART3_RX:
free_dma(CH_UART3_RX);
free_dma(CH_UART3_TX);
break;
case IRQ_UART2_RX:
free_dma(CH_UART2_RX);
free_dma(CH_UART2_TX);
break;
default:
break;
};
#endif
#ifdef CONFIG_KGDB_UART #ifdef CONFIG_KGDB_UART
if (uart->port.line != CONFIG_KGDB_UART_PORT) if (uart->port.line != CONFIG_KGDB_UART_PORT)
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment