|
@@ -346,6 +346,27 @@ static int scif_rxfill(struct uart_port *port)
|
|
|
return sci_in(port, SCFDR) & SCIF2_RFDC_MASK;
|
|
|
}
|
|
|
}
|
|
|
+#elif defined(CONFIG_ARCH_SH7372)
|
|
|
+static int scif_txfill(struct uart_port *port)
|
|
|
+{
|
|
|
+ if (port->type == PORT_SCIFA)
|
|
|
+ return sci_in(port, SCFDR) >> 8;
|
|
|
+ else
|
|
|
+ return sci_in(port, SCTFDR);
|
|
|
+}
|
|
|
+
|
|
|
+static int scif_txroom(struct uart_port *port)
|
|
|
+{
|
|
|
+ return port->fifosize - scif_txfill(port);
|
|
|
+}
|
|
|
+
|
|
|
+static int scif_rxfill(struct uart_port *port)
|
|
|
+{
|
|
|
+ if (port->type == PORT_SCIFA)
|
|
|
+ return sci_in(port, SCFDR) & SCIF_RFDC_MASK;
|
|
|
+ else
|
|
|
+ return sci_in(port, SCRFDR);
|
|
|
+}
|
|
|
#else
|
|
|
static int scif_txfill(struct uart_port *port)
|
|
|
{
|
|
@@ -683,7 +704,7 @@ static irqreturn_t sci_rx_interrupt(int irq, void *ptr)
|
|
|
u16 ssr = sci_in(port, SCxSR);
|
|
|
|
|
|
/* Disable future Rx interrupts */
|
|
|
- if (port->type == PORT_SCIFA) {
|
|
|
+ if (port->type == PORT_SCIFA || port->type == PORT_SCIFB) {
|
|
|
disable_irq_nosync(irq);
|
|
|
scr |= 0x4000;
|
|
|
} else {
|
|
@@ -928,7 +949,7 @@ static void sci_dma_tx_complete(void *arg)
|
|
|
|
|
|
if (!uart_circ_empty(xmit)) {
|
|
|
schedule_work(&s->work_tx);
|
|
|
- } else if (port->type == PORT_SCIFA) {
|
|
|
+ } else if (port->type == PORT_SCIFA || port->type == PORT_SCIFB) {
|
|
|
u16 ctrl = sci_in(port, SCSCR);
|
|
|
sci_out(port, SCSCR, ctrl & ~SCI_CTRL_FLAGS_TIE);
|
|
|
}
|
|
@@ -1183,7 +1204,7 @@ static void sci_start_tx(struct uart_port *port)
|
|
|
unsigned short ctrl;
|
|
|
|
|
|
#ifdef CONFIG_SERIAL_SH_SCI_DMA
|
|
|
- if (port->type == PORT_SCIFA) {
|
|
|
+ if (port->type == PORT_SCIFA || port->type == PORT_SCIFB) {
|
|
|
u16 new, scr = sci_in(port, SCSCR);
|
|
|
if (s->chan_tx)
|
|
|
new = scr | 0x8000;
|
|
@@ -1196,7 +1217,7 @@ static void sci_start_tx(struct uart_port *port)
|
|
|
s->cookie_tx < 0)
|
|
|
schedule_work(&s->work_tx);
|
|
|
#endif
|
|
|
- if (!s->chan_tx || port->type == PORT_SCIFA) {
|
|
|
+ if (!s->chan_tx || port->type == PORT_SCIFA || port->type == PORT_SCIFB) {
|
|
|
/* Set TIE (Transmit Interrupt Enable) bit in SCSCR */
|
|
|
ctrl = sci_in(port, SCSCR);
|
|
|
sci_out(port, SCSCR, ctrl | SCI_CTRL_FLAGS_TIE);
|
|
@@ -1209,7 +1230,7 @@ static void sci_stop_tx(struct uart_port *port)
|
|
|
|
|
|
/* Clear TIE (Transmit Interrupt Enable) bit in SCSCR */
|
|
|
ctrl = sci_in(port, SCSCR);
|
|
|
- if (port->type == PORT_SCIFA)
|
|
|
+ if (port->type == PORT_SCIFA || port->type == PORT_SCIFB)
|
|
|
ctrl &= ~0x8000;
|
|
|
ctrl &= ~SCI_CTRL_FLAGS_TIE;
|
|
|
sci_out(port, SCSCR, ctrl);
|
|
@@ -1221,7 +1242,7 @@ static void sci_start_rx(struct uart_port *port)
|
|
|
|
|
|
/* Set RIE (Receive Interrupt Enable) bit in SCSCR */
|
|
|
ctrl |= sci_in(port, SCSCR);
|
|
|
- if (port->type == PORT_SCIFA)
|
|
|
+ if (port->type == PORT_SCIFA || port->type == PORT_SCIFB)
|
|
|
ctrl &= ~0x4000;
|
|
|
sci_out(port, SCSCR, ctrl);
|
|
|
}
|
|
@@ -1232,7 +1253,7 @@ static void sci_stop_rx(struct uart_port *port)
|
|
|
|
|
|
/* Clear RIE (Receive Interrupt Enable) bit in SCSCR */
|
|
|
ctrl = sci_in(port, SCSCR);
|
|
|
- if (port->type == PORT_SCIFA)
|
|
|
+ if (port->type == PORT_SCIFA || port->type == PORT_SCIFB)
|
|
|
ctrl &= ~0x4000;
|
|
|
ctrl &= ~(SCI_CTRL_FLAGS_RIE | SCI_CTRL_FLAGS_REIE);
|
|
|
sci_out(port, SCSCR, ctrl);
|
|
@@ -1270,7 +1291,7 @@ static void rx_timer_fn(unsigned long arg)
|
|
|
struct uart_port *port = &s->port;
|
|
|
u16 scr = sci_in(port, SCSCR);
|
|
|
|
|
|
- if (port->type == PORT_SCIFA) {
|
|
|
+ if (port->type == PORT_SCIFA || port->type == PORT_SCIFB) {
|
|
|
scr &= ~0x4000;
|
|
|
enable_irq(s->irqs[1]);
|
|
|
}
|
|
@@ -1523,6 +1544,8 @@ static const char *sci_type(struct uart_port *port)
|
|
|
return "scif";
|
|
|
case PORT_SCIFA:
|
|
|
return "scifa";
|
|
|
+ case PORT_SCIFB:
|
|
|
+ return "scifb";
|
|
|
}
|
|
|
|
|
|
return NULL;
|
|
@@ -1611,6 +1634,9 @@ static int __devinit sci_init_single(struct platform_device *dev,
|
|
|
port->line = index;
|
|
|
|
|
|
switch (p->type) {
|
|
|
+ case PORT_SCIFB:
|
|
|
+ port->fifosize = 256;
|
|
|
+ break;
|
|
|
case PORT_SCIFA:
|
|
|
port->fifosize = 64;
|
|
|
break;
|