0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016 #include <linux/module.h>
0017 #include <linux/kernel.h>
0018 #include <linux/errno.h>
0019 #include <linux/delay.h>
0020 #include <linux/tty.h>
0021 #include <linux/tty_flip.h>
0022 #include <linux/major.h>
0023 #include <linux/string.h>
0024 #include <linux/ptrace.h>
0025 #include <linux/ioport.h>
0026 #include <linux/slab.h>
0027 #include <linux/circ_buf.h>
0028 #include <linux/serial.h>
0029 #include <linux/sysrq.h>
0030 #include <linux/console.h>
0031 #include <linux/spinlock.h>
0032 #ifdef CONFIG_SERIO
0033 #include <linux/serio.h>
0034 #endif
0035 #include <linux/init.h>
0036 #include <linux/of_device.h>
0037
0038 #include <linux/io.h>
0039 #include <asm/irq.h>
0040 #include <asm/prom.h>
0041 #include <asm/setup.h>
0042
0043 #include <linux/serial_core.h>
0044 #include <linux/sunserialcore.h>
0045
0046 #include "sunzilog.h"
0047
0048
0049
0050
0051
0052
0053 #ifndef CONFIG_SPARC64
0054 #define ZSDELAY() udelay(5)
0055 #define ZSDELAY_LONG() udelay(20)
0056 #define ZS_WSYNC(channel) do { } while (0)
0057 #else
0058 #define ZSDELAY()
0059 #define ZSDELAY_LONG()
0060 #define ZS_WSYNC(__channel) \
0061 readb(&((__channel)->control))
0062 #endif
0063
0064 #define ZS_CLOCK 4915200
0065 #define ZS_CLOCK_DIVISOR 16
0066
0067
0068
0069
0070 struct uart_sunzilog_port {
0071 struct uart_port port;
0072
0073
0074 struct uart_sunzilog_port *next;
0075
0076
0077 unsigned char curregs[NUM_ZSREGS];
0078
0079 unsigned int flags;
0080 #define SUNZILOG_FLAG_CONS_KEYB 0x00000001
0081 #define SUNZILOG_FLAG_CONS_MOUSE 0x00000002
0082 #define SUNZILOG_FLAG_IS_CONS 0x00000004
0083 #define SUNZILOG_FLAG_IS_KGDB 0x00000008
0084 #define SUNZILOG_FLAG_MODEM_STATUS 0x00000010
0085 #define SUNZILOG_FLAG_IS_CHANNEL_A 0x00000020
0086 #define SUNZILOG_FLAG_REGS_HELD 0x00000040
0087 #define SUNZILOG_FLAG_TX_STOPPED 0x00000080
0088 #define SUNZILOG_FLAG_TX_ACTIVE 0x00000100
0089 #define SUNZILOG_FLAG_ESCC 0x00000200
0090 #define SUNZILOG_FLAG_ISR_HANDLER 0x00000400
0091
0092 unsigned int cflag;
0093
0094 unsigned char parity_mask;
0095 unsigned char prev_status;
0096
0097 #ifdef CONFIG_SERIO
0098 struct serio serio;
0099 int serio_open;
0100 #endif
0101 };
0102
0103 static void sunzilog_putchar(struct uart_port *port, unsigned char ch);
0104
0105 #define ZILOG_CHANNEL_FROM_PORT(PORT) ((struct zilog_channel __iomem *)((PORT)->membase))
0106 #define UART_ZILOG(PORT) ((struct uart_sunzilog_port *)(PORT))
0107
0108 #define ZS_IS_KEYB(UP) ((UP)->flags & SUNZILOG_FLAG_CONS_KEYB)
0109 #define ZS_IS_MOUSE(UP) ((UP)->flags & SUNZILOG_FLAG_CONS_MOUSE)
0110 #define ZS_IS_CONS(UP) ((UP)->flags & SUNZILOG_FLAG_IS_CONS)
0111 #define ZS_IS_KGDB(UP) ((UP)->flags & SUNZILOG_FLAG_IS_KGDB)
0112 #define ZS_WANTS_MODEM_STATUS(UP) ((UP)->flags & SUNZILOG_FLAG_MODEM_STATUS)
0113 #define ZS_IS_CHANNEL_A(UP) ((UP)->flags & SUNZILOG_FLAG_IS_CHANNEL_A)
0114 #define ZS_REGS_HELD(UP) ((UP)->flags & SUNZILOG_FLAG_REGS_HELD)
0115 #define ZS_TX_STOPPED(UP) ((UP)->flags & SUNZILOG_FLAG_TX_STOPPED)
0116 #define ZS_TX_ACTIVE(UP) ((UP)->flags & SUNZILOG_FLAG_TX_ACTIVE)
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126 static unsigned char read_zsreg(struct zilog_channel __iomem *channel,
0127 unsigned char reg)
0128 {
0129 unsigned char retval;
0130
0131 writeb(reg, &channel->control);
0132 ZSDELAY();
0133 retval = readb(&channel->control);
0134 ZSDELAY();
0135
0136 return retval;
0137 }
0138
0139 static void write_zsreg(struct zilog_channel __iomem *channel,
0140 unsigned char reg, unsigned char value)
0141 {
0142 writeb(reg, &channel->control);
0143 ZSDELAY();
0144 writeb(value, &channel->control);
0145 ZSDELAY();
0146 }
0147
0148 static void sunzilog_clear_fifo(struct zilog_channel __iomem *channel)
0149 {
0150 int i;
0151
0152 for (i = 0; i < 32; i++) {
0153 unsigned char regval;
0154
0155 regval = readb(&channel->control);
0156 ZSDELAY();
0157 if (regval & Rx_CH_AV)
0158 break;
0159
0160 regval = read_zsreg(channel, R1);
0161 readb(&channel->data);
0162 ZSDELAY();
0163
0164 if (regval & (PAR_ERR | Rx_OVR | CRC_ERR)) {
0165 writeb(ERR_RES, &channel->control);
0166 ZSDELAY();
0167 ZS_WSYNC(channel);
0168 }
0169 }
0170 }
0171
0172
0173
0174
0175 static int __load_zsregs(struct zilog_channel __iomem *channel, unsigned char *regs)
0176 {
0177 int i;
0178 int escc;
0179 unsigned char r15;
0180
0181
0182 for (i = 0; i < 1000; i++) {
0183 unsigned char stat = read_zsreg(channel, R1);
0184 if (stat & ALL_SNT)
0185 break;
0186 udelay(100);
0187 }
0188
0189 writeb(ERR_RES, &channel->control);
0190 ZSDELAY();
0191 ZS_WSYNC(channel);
0192
0193 sunzilog_clear_fifo(channel);
0194
0195
0196 write_zsreg(channel, R1,
0197 regs[R1] & ~(RxINT_MASK | TxINT_ENAB | EXT_INT_ENAB));
0198
0199
0200 write_zsreg(channel, R4, regs[R4]);
0201
0202
0203 write_zsreg(channel, R10, regs[R10]);
0204
0205
0206 write_zsreg(channel, R3, regs[R3] & ~RxENAB);
0207 write_zsreg(channel, R5, regs[R5] & ~TxENAB);
0208
0209
0210 write_zsreg(channel, R6, regs[R6]);
0211 write_zsreg(channel, R7, regs[R7]);
0212
0213
0214
0215
0216
0217
0218
0219 write_zsreg(channel, R14, regs[R14] & ~BRENAB);
0220
0221
0222 write_zsreg(channel, R11, regs[R11]);
0223
0224
0225 write_zsreg(channel, R12, regs[R12]);
0226 write_zsreg(channel, R13, regs[R13]);
0227
0228
0229 write_zsreg(channel, R14, regs[R14]);
0230
0231
0232 write_zsreg(channel, R15, (regs[R15] | WR7pEN) & ~FIFOEN);
0233
0234
0235 r15 = read_zsreg(channel, R15);
0236 if (r15 & 0x01) {
0237 write_zsreg(channel, R7, regs[R7p]);
0238
0239
0240 write_zsreg(channel, R15, regs[R15] & ~WR7pEN);
0241 escc = 1;
0242 } else {
0243
0244 regs[R15] &= ~FIFOEN;
0245 escc = 0;
0246 }
0247
0248
0249 write_zsreg(channel, R0, RES_EXT_INT);
0250 write_zsreg(channel, R0, RES_EXT_INT);
0251
0252
0253 write_zsreg(channel, R3, regs[R3]);
0254 write_zsreg(channel, R5, regs[R5]);
0255
0256
0257 write_zsreg(channel, R1, regs[R1]);
0258
0259 return escc;
0260 }
0261
0262
0263
0264
0265
0266
0267
0268 static void sunzilog_maybe_update_regs(struct uart_sunzilog_port *up,
0269 struct zilog_channel __iomem *channel)
0270 {
0271 if (!ZS_REGS_HELD(up)) {
0272 if (ZS_TX_ACTIVE(up)) {
0273 up->flags |= SUNZILOG_FLAG_REGS_HELD;
0274 } else {
0275 __load_zsregs(channel, up->curregs);
0276 }
0277 }
0278 }
0279
0280 static void sunzilog_change_mouse_baud(struct uart_sunzilog_port *up)
0281 {
0282 unsigned int cur_cflag = up->cflag;
0283 int brg, new_baud;
0284
0285 up->cflag &= ~CBAUD;
0286 up->cflag |= suncore_mouse_baud_cflag_next(cur_cflag, &new_baud);
0287
0288 brg = BPS_TO_BRG(new_baud, ZS_CLOCK / ZS_CLOCK_DIVISOR);
0289 up->curregs[R12] = (brg & 0xff);
0290 up->curregs[R13] = (brg >> 8) & 0xff;
0291 sunzilog_maybe_update_regs(up, ZILOG_CHANNEL_FROM_PORT(&up->port));
0292 }
0293
0294 static void sunzilog_kbdms_receive_chars(struct uart_sunzilog_port *up,
0295 unsigned char ch, int is_break)
0296 {
0297 if (ZS_IS_KEYB(up)) {
0298
0299 #ifdef CONFIG_SERIO
0300 if (up->serio_open)
0301 serio_interrupt(&up->serio, ch, 0);
0302 #endif
0303 } else if (ZS_IS_MOUSE(up)) {
0304 int ret = suncore_mouse_baud_detection(ch, is_break);
0305
0306 switch (ret) {
0307 case 2:
0308 sunzilog_change_mouse_baud(up);
0309 fallthrough;
0310 case 1:
0311 break;
0312
0313 case 0:
0314 #ifdef CONFIG_SERIO
0315 if (up->serio_open)
0316 serio_interrupt(&up->serio, ch, 0);
0317 #endif
0318 break;
0319 }
0320 }
0321 }
0322
0323 static struct tty_port *
0324 sunzilog_receive_chars(struct uart_sunzilog_port *up,
0325 struct zilog_channel __iomem *channel)
0326 {
0327 struct tty_port *port = NULL;
0328 unsigned char ch, r1, flag;
0329
0330 if (up->port.state != NULL)
0331 port = &up->port.state->port;
0332
0333 for (;;) {
0334
0335 r1 = read_zsreg(channel, R1);
0336 if (r1 & (PAR_ERR | Rx_OVR | CRC_ERR)) {
0337 writeb(ERR_RES, &channel->control);
0338 ZSDELAY();
0339 ZS_WSYNC(channel);
0340 }
0341
0342 ch = readb(&channel->control);
0343 ZSDELAY();
0344
0345
0346
0347
0348 if (ch & BRK_ABRT)
0349 r1 |= BRK_ABRT;
0350
0351 if (!(ch & Rx_CH_AV))
0352 break;
0353
0354 ch = readb(&channel->data);
0355 ZSDELAY();
0356
0357 ch &= up->parity_mask;
0358
0359 if (unlikely(ZS_IS_KEYB(up)) || unlikely(ZS_IS_MOUSE(up))) {
0360 sunzilog_kbdms_receive_chars(up, ch, 0);
0361 continue;
0362 }
0363
0364
0365 flag = TTY_NORMAL;
0366 up->port.icount.rx++;
0367 if (r1 & (BRK_ABRT | PAR_ERR | Rx_OVR | CRC_ERR)) {
0368 if (r1 & BRK_ABRT) {
0369 r1 &= ~(PAR_ERR | CRC_ERR);
0370 up->port.icount.brk++;
0371 if (uart_handle_break(&up->port))
0372 continue;
0373 }
0374 else if (r1 & PAR_ERR)
0375 up->port.icount.parity++;
0376 else if (r1 & CRC_ERR)
0377 up->port.icount.frame++;
0378 if (r1 & Rx_OVR)
0379 up->port.icount.overrun++;
0380 r1 &= up->port.read_status_mask;
0381 if (r1 & BRK_ABRT)
0382 flag = TTY_BREAK;
0383 else if (r1 & PAR_ERR)
0384 flag = TTY_PARITY;
0385 else if (r1 & CRC_ERR)
0386 flag = TTY_FRAME;
0387 }
0388 if (uart_handle_sysrq_char(&up->port, ch) || !port)
0389 continue;
0390
0391 if (up->port.ignore_status_mask == 0xff ||
0392 (r1 & up->port.ignore_status_mask) == 0) {
0393 tty_insert_flip_char(port, ch, flag);
0394 }
0395 if (r1 & Rx_OVR)
0396 tty_insert_flip_char(port, 0, TTY_OVERRUN);
0397 }
0398
0399 return port;
0400 }
0401
0402 static void sunzilog_status_handle(struct uart_sunzilog_port *up,
0403 struct zilog_channel __iomem *channel)
0404 {
0405 unsigned char status;
0406
0407 status = readb(&channel->control);
0408 ZSDELAY();
0409
0410 writeb(RES_EXT_INT, &channel->control);
0411 ZSDELAY();
0412 ZS_WSYNC(channel);
0413
0414 if (status & BRK_ABRT) {
0415 if (ZS_IS_MOUSE(up))
0416 sunzilog_kbdms_receive_chars(up, 0, 1);
0417 if (ZS_IS_CONS(up)) {
0418
0419
0420
0421 while (1) {
0422 status = readb(&channel->control);
0423 ZSDELAY();
0424 if (!(status & BRK_ABRT))
0425 break;
0426 }
0427 sun_do_break();
0428 return;
0429 }
0430 }
0431
0432 if (ZS_WANTS_MODEM_STATUS(up)) {
0433 if (status & SYNC)
0434 up->port.icount.dsr++;
0435
0436
0437
0438
0439
0440 if ((status ^ up->prev_status) ^ DCD)
0441 uart_handle_dcd_change(&up->port,
0442 (status & DCD));
0443 if ((status ^ up->prev_status) ^ CTS)
0444 uart_handle_cts_change(&up->port,
0445 (status & CTS));
0446
0447 wake_up_interruptible(&up->port.state->port.delta_msr_wait);
0448 }
0449
0450 up->prev_status = status;
0451 }
0452
0453 static void sunzilog_transmit_chars(struct uart_sunzilog_port *up,
0454 struct zilog_channel __iomem *channel)
0455 {
0456 struct circ_buf *xmit;
0457
0458 if (ZS_IS_CONS(up)) {
0459 unsigned char status = readb(&channel->control);
0460 ZSDELAY();
0461
0462
0463
0464
0465
0466
0467
0468
0469
0470 if (!(status & Tx_BUF_EMP))
0471 return;
0472 }
0473
0474 up->flags &= ~SUNZILOG_FLAG_TX_ACTIVE;
0475
0476 if (ZS_REGS_HELD(up)) {
0477 __load_zsregs(channel, up->curregs);
0478 up->flags &= ~SUNZILOG_FLAG_REGS_HELD;
0479 }
0480
0481 if (ZS_TX_STOPPED(up)) {
0482 up->flags &= ~SUNZILOG_FLAG_TX_STOPPED;
0483 goto ack_tx_int;
0484 }
0485
0486 if (up->port.x_char) {
0487 up->flags |= SUNZILOG_FLAG_TX_ACTIVE;
0488 writeb(up->port.x_char, &channel->data);
0489 ZSDELAY();
0490 ZS_WSYNC(channel);
0491
0492 up->port.icount.tx++;
0493 up->port.x_char = 0;
0494 return;
0495 }
0496
0497 if (up->port.state == NULL)
0498 goto ack_tx_int;
0499 xmit = &up->port.state->xmit;
0500 if (uart_circ_empty(xmit))
0501 goto ack_tx_int;
0502
0503 if (uart_tx_stopped(&up->port))
0504 goto ack_tx_int;
0505
0506 up->flags |= SUNZILOG_FLAG_TX_ACTIVE;
0507 writeb(xmit->buf[xmit->tail], &channel->data);
0508 ZSDELAY();
0509 ZS_WSYNC(channel);
0510
0511 xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
0512 up->port.icount.tx++;
0513
0514 if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
0515 uart_write_wakeup(&up->port);
0516
0517 return;
0518
0519 ack_tx_int:
0520 writeb(RES_Tx_P, &channel->control);
0521 ZSDELAY();
0522 ZS_WSYNC(channel);
0523 }
0524
0525 static irqreturn_t sunzilog_interrupt(int irq, void *dev_id)
0526 {
0527 struct uart_sunzilog_port *up = dev_id;
0528
0529 while (up) {
0530 struct zilog_channel __iomem *channel
0531 = ZILOG_CHANNEL_FROM_PORT(&up->port);
0532 struct tty_port *port;
0533 unsigned char r3;
0534
0535 spin_lock(&up->port.lock);
0536 r3 = read_zsreg(channel, R3);
0537
0538
0539 port = NULL;
0540 if (r3 & (CHAEXT | CHATxIP | CHARxIP)) {
0541 writeb(RES_H_IUS, &channel->control);
0542 ZSDELAY();
0543 ZS_WSYNC(channel);
0544
0545 if (r3 & CHARxIP)
0546 port = sunzilog_receive_chars(up, channel);
0547 if (r3 & CHAEXT)
0548 sunzilog_status_handle(up, channel);
0549 if (r3 & CHATxIP)
0550 sunzilog_transmit_chars(up, channel);
0551 }
0552 spin_unlock(&up->port.lock);
0553
0554 if (port)
0555 tty_flip_buffer_push(port);
0556
0557
0558 up = up->next;
0559 channel = ZILOG_CHANNEL_FROM_PORT(&up->port);
0560
0561 spin_lock(&up->port.lock);
0562 port = NULL;
0563 if (r3 & (CHBEXT | CHBTxIP | CHBRxIP)) {
0564 writeb(RES_H_IUS, &channel->control);
0565 ZSDELAY();
0566 ZS_WSYNC(channel);
0567
0568 if (r3 & CHBRxIP)
0569 port = sunzilog_receive_chars(up, channel);
0570 if (r3 & CHBEXT)
0571 sunzilog_status_handle(up, channel);
0572 if (r3 & CHBTxIP)
0573 sunzilog_transmit_chars(up, channel);
0574 }
0575 spin_unlock(&up->port.lock);
0576
0577 if (port)
0578 tty_flip_buffer_push(port);
0579
0580 up = up->next;
0581 }
0582
0583 return IRQ_HANDLED;
0584 }
0585
0586
0587
0588
0589 static __inline__ unsigned char sunzilog_read_channel_status(struct uart_port *port)
0590 {
0591 struct zilog_channel __iomem *channel;
0592 unsigned char status;
0593
0594 channel = ZILOG_CHANNEL_FROM_PORT(port);
0595 status = readb(&channel->control);
0596 ZSDELAY();
0597
0598 return status;
0599 }
0600
0601
0602 static unsigned int sunzilog_tx_empty(struct uart_port *port)
0603 {
0604 unsigned long flags;
0605 unsigned char status;
0606 unsigned int ret;
0607
0608 spin_lock_irqsave(&port->lock, flags);
0609
0610 status = sunzilog_read_channel_status(port);
0611
0612 spin_unlock_irqrestore(&port->lock, flags);
0613
0614 if (status & Tx_BUF_EMP)
0615 ret = TIOCSER_TEMT;
0616 else
0617 ret = 0;
0618
0619 return ret;
0620 }
0621
0622
0623 static unsigned int sunzilog_get_mctrl(struct uart_port *port)
0624 {
0625 unsigned char status;
0626 unsigned int ret;
0627
0628 status = sunzilog_read_channel_status(port);
0629
0630 ret = 0;
0631 if (status & DCD)
0632 ret |= TIOCM_CAR;
0633 if (status & SYNC)
0634 ret |= TIOCM_DSR;
0635 if (status & CTS)
0636 ret |= TIOCM_CTS;
0637
0638 return ret;
0639 }
0640
0641
0642 static void sunzilog_set_mctrl(struct uart_port *port, unsigned int mctrl)
0643 {
0644 struct uart_sunzilog_port *up =
0645 container_of(port, struct uart_sunzilog_port, port);
0646 struct zilog_channel __iomem *channel = ZILOG_CHANNEL_FROM_PORT(port);
0647 unsigned char set_bits, clear_bits;
0648
0649 set_bits = clear_bits = 0;
0650
0651 if (mctrl & TIOCM_RTS)
0652 set_bits |= RTS;
0653 else
0654 clear_bits |= RTS;
0655 if (mctrl & TIOCM_DTR)
0656 set_bits |= DTR;
0657 else
0658 clear_bits |= DTR;
0659
0660
0661 up->curregs[R5] |= set_bits;
0662 up->curregs[R5] &= ~clear_bits;
0663 write_zsreg(channel, R5, up->curregs[R5]);
0664 }
0665
0666
0667 static void sunzilog_stop_tx(struct uart_port *port)
0668 {
0669 struct uart_sunzilog_port *up =
0670 container_of(port, struct uart_sunzilog_port, port);
0671
0672 up->flags |= SUNZILOG_FLAG_TX_STOPPED;
0673 }
0674
0675
0676 static void sunzilog_start_tx(struct uart_port *port)
0677 {
0678 struct uart_sunzilog_port *up =
0679 container_of(port, struct uart_sunzilog_port, port);
0680 struct zilog_channel __iomem *channel = ZILOG_CHANNEL_FROM_PORT(port);
0681 unsigned char status;
0682
0683 up->flags |= SUNZILOG_FLAG_TX_ACTIVE;
0684 up->flags &= ~SUNZILOG_FLAG_TX_STOPPED;
0685
0686 status = readb(&channel->control);
0687 ZSDELAY();
0688
0689
0690 if (!(status & Tx_BUF_EMP))
0691 return;
0692
0693
0694
0695
0696 if (port->x_char) {
0697 writeb(port->x_char, &channel->data);
0698 ZSDELAY();
0699 ZS_WSYNC(channel);
0700
0701 port->icount.tx++;
0702 port->x_char = 0;
0703 } else {
0704 struct circ_buf *xmit = &port->state->xmit;
0705
0706 if (uart_circ_empty(xmit))
0707 return;
0708 writeb(xmit->buf[xmit->tail], &channel->data);
0709 ZSDELAY();
0710 ZS_WSYNC(channel);
0711
0712 xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
0713 port->icount.tx++;
0714
0715 if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
0716 uart_write_wakeup(&up->port);
0717 }
0718 }
0719
0720
0721 static void sunzilog_stop_rx(struct uart_port *port)
0722 {
0723 struct uart_sunzilog_port *up = UART_ZILOG(port);
0724 struct zilog_channel __iomem *channel;
0725
0726 if (ZS_IS_CONS(up))
0727 return;
0728
0729 channel = ZILOG_CHANNEL_FROM_PORT(port);
0730
0731
0732 up->curregs[R1] &= ~RxINT_MASK;
0733 sunzilog_maybe_update_regs(up, channel);
0734 }
0735
0736
0737 static void sunzilog_enable_ms(struct uart_port *port)
0738 {
0739 struct uart_sunzilog_port *up =
0740 container_of(port, struct uart_sunzilog_port, port);
0741 struct zilog_channel __iomem *channel = ZILOG_CHANNEL_FROM_PORT(port);
0742 unsigned char new_reg;
0743
0744 new_reg = up->curregs[R15] | (DCDIE | SYNCIE | CTSIE);
0745 if (new_reg != up->curregs[R15]) {
0746 up->curregs[R15] = new_reg;
0747
0748
0749 write_zsreg(channel, R15, up->curregs[R15] & ~WR7pEN);
0750 }
0751 }
0752
0753
0754 static void sunzilog_break_ctl(struct uart_port *port, int break_state)
0755 {
0756 struct uart_sunzilog_port *up =
0757 container_of(port, struct uart_sunzilog_port, port);
0758 struct zilog_channel __iomem *channel = ZILOG_CHANNEL_FROM_PORT(port);
0759 unsigned char set_bits, clear_bits, new_reg;
0760 unsigned long flags;
0761
0762 set_bits = clear_bits = 0;
0763
0764 if (break_state)
0765 set_bits |= SND_BRK;
0766 else
0767 clear_bits |= SND_BRK;
0768
0769 spin_lock_irqsave(&port->lock, flags);
0770
0771 new_reg = (up->curregs[R5] | set_bits) & ~clear_bits;
0772 if (new_reg != up->curregs[R5]) {
0773 up->curregs[R5] = new_reg;
0774
0775
0776 write_zsreg(channel, R5, up->curregs[R5]);
0777 }
0778
0779 spin_unlock_irqrestore(&port->lock, flags);
0780 }
0781
0782 static void __sunzilog_startup(struct uart_sunzilog_port *up)
0783 {
0784 struct zilog_channel __iomem *channel;
0785
0786 channel = ZILOG_CHANNEL_FROM_PORT(&up->port);
0787 up->prev_status = readb(&channel->control);
0788
0789
0790 up->curregs[R3] |= RxENAB;
0791 up->curregs[R5] |= TxENAB;
0792
0793 up->curregs[R1] |= EXT_INT_ENAB | INT_ALL_Rx | TxINT_ENAB;
0794 sunzilog_maybe_update_regs(up, channel);
0795 }
0796
0797 static int sunzilog_startup(struct uart_port *port)
0798 {
0799 struct uart_sunzilog_port *up = UART_ZILOG(port);
0800 unsigned long flags;
0801
0802 if (ZS_IS_CONS(up))
0803 return 0;
0804
0805 spin_lock_irqsave(&port->lock, flags);
0806 __sunzilog_startup(up);
0807 spin_unlock_irqrestore(&port->lock, flags);
0808 return 0;
0809 }
0810
0811
0812
0813
0814
0815
0816
0817
0818
0819
0820
0821
0822
0823
0824
0825
0826
0827
0828
0829
0830
0831
0832
0833
0834
0835
0836 static void sunzilog_shutdown(struct uart_port *port)
0837 {
0838 struct uart_sunzilog_port *up = UART_ZILOG(port);
0839 struct zilog_channel __iomem *channel;
0840 unsigned long flags;
0841
0842 if (ZS_IS_CONS(up))
0843 return;
0844
0845 spin_lock_irqsave(&port->lock, flags);
0846
0847 channel = ZILOG_CHANNEL_FROM_PORT(port);
0848
0849
0850 up->curregs[R3] &= ~RxENAB;
0851 up->curregs[R5] &= ~TxENAB;
0852
0853
0854 up->curregs[R1] &= ~(EXT_INT_ENAB | TxINT_ENAB | RxINT_MASK);
0855 up->curregs[R5] &= ~SND_BRK;
0856 sunzilog_maybe_update_regs(up, channel);
0857
0858 spin_unlock_irqrestore(&port->lock, flags);
0859 }
0860
0861
0862
0863
0864 static void
0865 sunzilog_convert_to_zs(struct uart_sunzilog_port *up, unsigned int cflag,
0866 unsigned int iflag, int brg)
0867 {
0868
0869 up->curregs[R10] = NRZ;
0870 up->curregs[R11] = TCBR | RCBR;
0871
0872
0873 up->curregs[R4] &= ~XCLK_MASK;
0874 up->curregs[R4] |= X16CLK;
0875 up->curregs[R12] = brg & 0xff;
0876 up->curregs[R13] = (brg >> 8) & 0xff;
0877 up->curregs[R14] = BRSRC | BRENAB;
0878
0879
0880 up->curregs[R3] &= ~RxN_MASK;
0881 up->curregs[R5] &= ~TxN_MASK;
0882 switch (cflag & CSIZE) {
0883 case CS5:
0884 up->curregs[R3] |= Rx5;
0885 up->curregs[R5] |= Tx5;
0886 up->parity_mask = 0x1f;
0887 break;
0888 case CS6:
0889 up->curregs[R3] |= Rx6;
0890 up->curregs[R5] |= Tx6;
0891 up->parity_mask = 0x3f;
0892 break;
0893 case CS7:
0894 up->curregs[R3] |= Rx7;
0895 up->curregs[R5] |= Tx7;
0896 up->parity_mask = 0x7f;
0897 break;
0898 case CS8:
0899 default:
0900 up->curregs[R3] |= Rx8;
0901 up->curregs[R5] |= Tx8;
0902 up->parity_mask = 0xff;
0903 break;
0904 }
0905 up->curregs[R4] &= ~0x0c;
0906 if (cflag & CSTOPB)
0907 up->curregs[R4] |= SB2;
0908 else
0909 up->curregs[R4] |= SB1;
0910 if (cflag & PARENB)
0911 up->curregs[R4] |= PAR_ENAB;
0912 else
0913 up->curregs[R4] &= ~PAR_ENAB;
0914 if (!(cflag & PARODD))
0915 up->curregs[R4] |= PAR_EVEN;
0916 else
0917 up->curregs[R4] &= ~PAR_EVEN;
0918
0919 up->port.read_status_mask = Rx_OVR;
0920 if (iflag & INPCK)
0921 up->port.read_status_mask |= CRC_ERR | PAR_ERR;
0922 if (iflag & (IGNBRK | BRKINT | PARMRK))
0923 up->port.read_status_mask |= BRK_ABRT;
0924
0925 up->port.ignore_status_mask = 0;
0926 if (iflag & IGNPAR)
0927 up->port.ignore_status_mask |= CRC_ERR | PAR_ERR;
0928 if (iflag & IGNBRK) {
0929 up->port.ignore_status_mask |= BRK_ABRT;
0930 if (iflag & IGNPAR)
0931 up->port.ignore_status_mask |= Rx_OVR;
0932 }
0933
0934 if ((cflag & CREAD) == 0)
0935 up->port.ignore_status_mask = 0xff;
0936 }
0937
0938
0939 static void
0940 sunzilog_set_termios(struct uart_port *port, struct ktermios *termios,
0941 struct ktermios *old)
0942 {
0943 struct uart_sunzilog_port *up =
0944 container_of(port, struct uart_sunzilog_port, port);
0945 unsigned long flags;
0946 int baud, brg;
0947
0948 baud = uart_get_baud_rate(port, termios, old, 1200, 76800);
0949
0950 spin_lock_irqsave(&up->port.lock, flags);
0951
0952 brg = BPS_TO_BRG(baud, ZS_CLOCK / ZS_CLOCK_DIVISOR);
0953
0954 sunzilog_convert_to_zs(up, termios->c_cflag, termios->c_iflag, brg);
0955
0956 if (UART_ENABLE_MS(&up->port, termios->c_cflag))
0957 up->flags |= SUNZILOG_FLAG_MODEM_STATUS;
0958 else
0959 up->flags &= ~SUNZILOG_FLAG_MODEM_STATUS;
0960
0961 up->cflag = termios->c_cflag;
0962
0963 sunzilog_maybe_update_regs(up, ZILOG_CHANNEL_FROM_PORT(port));
0964
0965 uart_update_timeout(port, termios->c_cflag, baud);
0966
0967 spin_unlock_irqrestore(&up->port.lock, flags);
0968 }
0969
0970 static const char *sunzilog_type(struct uart_port *port)
0971 {
0972 struct uart_sunzilog_port *up = UART_ZILOG(port);
0973
0974 return (up->flags & SUNZILOG_FLAG_ESCC) ? "zs (ESCC)" : "zs";
0975 }
0976
0977
0978
0979
0980 static void sunzilog_release_port(struct uart_port *port)
0981 {
0982 }
0983
0984 static int sunzilog_request_port(struct uart_port *port)
0985 {
0986 return 0;
0987 }
0988
0989
0990 static void sunzilog_config_port(struct uart_port *port, int flags)
0991 {
0992 }
0993
0994
0995 static int sunzilog_verify_port(struct uart_port *port, struct serial_struct *ser)
0996 {
0997 return -EINVAL;
0998 }
0999
1000 #ifdef CONFIG_CONSOLE_POLL
1001 static int sunzilog_get_poll_char(struct uart_port *port)
1002 {
1003 unsigned char ch, r1;
1004 struct uart_sunzilog_port *up =
1005 container_of(port, struct uart_sunzilog_port, port);
1006 struct zilog_channel __iomem *channel
1007 = ZILOG_CHANNEL_FROM_PORT(&up->port);
1008
1009
1010 r1 = read_zsreg(channel, R1);
1011 if (r1 & (PAR_ERR | Rx_OVR | CRC_ERR)) {
1012 writeb(ERR_RES, &channel->control);
1013 ZSDELAY();
1014 ZS_WSYNC(channel);
1015 }
1016
1017 ch = readb(&channel->control);
1018 ZSDELAY();
1019
1020
1021
1022
1023 if (ch & BRK_ABRT)
1024 r1 |= BRK_ABRT;
1025
1026 if (!(ch & Rx_CH_AV))
1027 return NO_POLL_CHAR;
1028
1029 ch = readb(&channel->data);
1030 ZSDELAY();
1031
1032 ch &= up->parity_mask;
1033 return ch;
1034 }
1035
1036 static void sunzilog_put_poll_char(struct uart_port *port,
1037 unsigned char ch)
1038 {
1039 struct uart_sunzilog_port *up =
1040 container_of(port, struct uart_sunzilog_port, port);
1041
1042 sunzilog_putchar(&up->port, ch);
1043 }
1044 #endif
1045
1046 static const struct uart_ops sunzilog_pops = {
1047 .tx_empty = sunzilog_tx_empty,
1048 .set_mctrl = sunzilog_set_mctrl,
1049 .get_mctrl = sunzilog_get_mctrl,
1050 .stop_tx = sunzilog_stop_tx,
1051 .start_tx = sunzilog_start_tx,
1052 .stop_rx = sunzilog_stop_rx,
1053 .enable_ms = sunzilog_enable_ms,
1054 .break_ctl = sunzilog_break_ctl,
1055 .startup = sunzilog_startup,
1056 .shutdown = sunzilog_shutdown,
1057 .set_termios = sunzilog_set_termios,
1058 .type = sunzilog_type,
1059 .release_port = sunzilog_release_port,
1060 .request_port = sunzilog_request_port,
1061 .config_port = sunzilog_config_port,
1062 .verify_port = sunzilog_verify_port,
1063 #ifdef CONFIG_CONSOLE_POLL
1064 .poll_get_char = sunzilog_get_poll_char,
1065 .poll_put_char = sunzilog_put_poll_char,
1066 #endif
1067 };
1068
1069 static int uart_chip_count;
1070 static struct uart_sunzilog_port *sunzilog_port_table;
1071 static struct zilog_layout __iomem **sunzilog_chip_regs;
1072
1073 static struct uart_sunzilog_port *sunzilog_irq_chain;
1074
1075 static struct uart_driver sunzilog_reg = {
1076 .owner = THIS_MODULE,
1077 .driver_name = "sunzilog",
1078 .dev_name = "ttyS",
1079 .major = TTY_MAJOR,
1080 };
1081
1082 static int __init sunzilog_alloc_tables(int num_sunzilog)
1083 {
1084 struct uart_sunzilog_port *up;
1085 unsigned long size;
1086 int num_channels = num_sunzilog * 2;
1087 int i;
1088
1089 size = num_channels * sizeof(struct uart_sunzilog_port);
1090 sunzilog_port_table = kzalloc(size, GFP_KERNEL);
1091 if (!sunzilog_port_table)
1092 return -ENOMEM;
1093
1094 for (i = 0; i < num_channels; i++) {
1095 up = &sunzilog_port_table[i];
1096
1097 spin_lock_init(&up->port.lock);
1098
1099 if (i == 0)
1100 sunzilog_irq_chain = up;
1101
1102 if (i < num_channels - 1)
1103 up->next = up + 1;
1104 else
1105 up->next = NULL;
1106 }
1107
1108 size = num_sunzilog * sizeof(struct zilog_layout __iomem *);
1109 sunzilog_chip_regs = kzalloc(size, GFP_KERNEL);
1110 if (!sunzilog_chip_regs) {
1111 kfree(sunzilog_port_table);
1112 sunzilog_irq_chain = NULL;
1113 return -ENOMEM;
1114 }
1115
1116 return 0;
1117 }
1118
1119 static void sunzilog_free_tables(void)
1120 {
1121 kfree(sunzilog_port_table);
1122 sunzilog_irq_chain = NULL;
1123 kfree(sunzilog_chip_regs);
1124 }
1125
1126 #define ZS_PUT_CHAR_MAX_DELAY 2000
1127
1128 static void __maybe_unused sunzilog_putchar(struct uart_port *port, unsigned char ch)
1129 {
1130 struct zilog_channel __iomem *channel = ZILOG_CHANNEL_FROM_PORT(port);
1131 int loops = ZS_PUT_CHAR_MAX_DELAY;
1132
1133
1134
1135
1136 do {
1137 unsigned char val = readb(&channel->control);
1138 if (val & Tx_BUF_EMP) {
1139 ZSDELAY();
1140 break;
1141 }
1142 udelay(5);
1143 } while (--loops);
1144
1145 writeb(ch, &channel->data);
1146 ZSDELAY();
1147 ZS_WSYNC(channel);
1148 }
1149
1150 #ifdef CONFIG_SERIO
1151
1152 static DEFINE_SPINLOCK(sunzilog_serio_lock);
1153
1154 static int sunzilog_serio_write(struct serio *serio, unsigned char ch)
1155 {
1156 struct uart_sunzilog_port *up = serio->port_data;
1157 unsigned long flags;
1158
1159 spin_lock_irqsave(&sunzilog_serio_lock, flags);
1160
1161 sunzilog_putchar(&up->port, ch);
1162
1163 spin_unlock_irqrestore(&sunzilog_serio_lock, flags);
1164
1165 return 0;
1166 }
1167
1168 static int sunzilog_serio_open(struct serio *serio)
1169 {
1170 struct uart_sunzilog_port *up = serio->port_data;
1171 unsigned long flags;
1172 int ret;
1173
1174 spin_lock_irqsave(&sunzilog_serio_lock, flags);
1175 if (!up->serio_open) {
1176 up->serio_open = 1;
1177 ret = 0;
1178 } else
1179 ret = -EBUSY;
1180 spin_unlock_irqrestore(&sunzilog_serio_lock, flags);
1181
1182 return ret;
1183 }
1184
1185 static void sunzilog_serio_close(struct serio *serio)
1186 {
1187 struct uart_sunzilog_port *up = serio->port_data;
1188 unsigned long flags;
1189
1190 spin_lock_irqsave(&sunzilog_serio_lock, flags);
1191 up->serio_open = 0;
1192 spin_unlock_irqrestore(&sunzilog_serio_lock, flags);
1193 }
1194
1195 #endif
1196
1197 #ifdef CONFIG_SERIAL_SUNZILOG_CONSOLE
1198 static void
1199 sunzilog_console_write(struct console *con, const char *s, unsigned int count)
1200 {
1201 struct uart_sunzilog_port *up = &sunzilog_port_table[con->index];
1202 unsigned long flags;
1203 int locked = 1;
1204
1205 if (up->port.sysrq || oops_in_progress)
1206 locked = spin_trylock_irqsave(&up->port.lock, flags);
1207 else
1208 spin_lock_irqsave(&up->port.lock, flags);
1209
1210 uart_console_write(&up->port, s, count, sunzilog_putchar);
1211 udelay(2);
1212
1213 if (locked)
1214 spin_unlock_irqrestore(&up->port.lock, flags);
1215 }
1216
1217 static int __init sunzilog_console_setup(struct console *con, char *options)
1218 {
1219 struct uart_sunzilog_port *up = &sunzilog_port_table[con->index];
1220 unsigned long flags;
1221 int baud, brg;
1222
1223 if (up->port.type != PORT_SUNZILOG)
1224 return -EINVAL;
1225
1226 printk(KERN_INFO "Console: ttyS%d (SunZilog zs%d)\n",
1227 (sunzilog_reg.minor - 64) + con->index, con->index);
1228
1229
1230 sunserial_console_termios(con, up->port.dev->of_node);
1231
1232
1233
1234
1235 switch (con->cflag & CBAUD) {
1236 case B150: baud = 150; break;
1237 case B300: baud = 300; break;
1238 case B600: baud = 600; break;
1239 case B1200: baud = 1200; break;
1240 case B2400: baud = 2400; break;
1241 case B4800: baud = 4800; break;
1242 default: case B9600: baud = 9600; break;
1243 case B19200: baud = 19200; break;
1244 case B38400: baud = 38400; break;
1245 }
1246
1247 brg = BPS_TO_BRG(baud, ZS_CLOCK / ZS_CLOCK_DIVISOR);
1248
1249 spin_lock_irqsave(&up->port.lock, flags);
1250
1251 up->curregs[R15] |= BRKIE;
1252 sunzilog_convert_to_zs(up, con->cflag, 0, brg);
1253
1254 sunzilog_set_mctrl(&up->port, TIOCM_DTR | TIOCM_RTS);
1255 __sunzilog_startup(up);
1256
1257 spin_unlock_irqrestore(&up->port.lock, flags);
1258
1259 return 0;
1260 }
1261
1262 static struct console sunzilog_console_ops = {
1263 .name = "ttyS",
1264 .write = sunzilog_console_write,
1265 .device = uart_console_device,
1266 .setup = sunzilog_console_setup,
1267 .flags = CON_PRINTBUFFER,
1268 .index = -1,
1269 .data = &sunzilog_reg,
1270 };
1271
1272 static inline struct console *SUNZILOG_CONSOLE(void)
1273 {
1274 return &sunzilog_console_ops;
1275 }
1276
1277 #else
1278 #define SUNZILOG_CONSOLE() (NULL)
1279 #endif
1280
1281 static void sunzilog_init_kbdms(struct uart_sunzilog_port *up)
1282 {
1283 int baud, brg;
1284
1285 if (up->flags & SUNZILOG_FLAG_CONS_KEYB) {
1286 up->cflag = B1200 | CS8 | CLOCAL | CREAD;
1287 baud = 1200;
1288 } else {
1289 up->cflag = B4800 | CS8 | CLOCAL | CREAD;
1290 baud = 4800;
1291 }
1292
1293 up->curregs[R15] |= BRKIE;
1294 brg = BPS_TO_BRG(baud, ZS_CLOCK / ZS_CLOCK_DIVISOR);
1295 sunzilog_convert_to_zs(up, up->cflag, 0, brg);
1296 sunzilog_set_mctrl(&up->port, TIOCM_DTR | TIOCM_RTS);
1297 __sunzilog_startup(up);
1298 }
1299
1300 #ifdef CONFIG_SERIO
1301 static void sunzilog_register_serio(struct uart_sunzilog_port *up)
1302 {
1303 struct serio *serio = &up->serio;
1304
1305 serio->port_data = up;
1306
1307 serio->id.type = SERIO_RS232;
1308 if (up->flags & SUNZILOG_FLAG_CONS_KEYB) {
1309 serio->id.proto = SERIO_SUNKBD;
1310 strlcpy(serio->name, "zskbd", sizeof(serio->name));
1311 } else {
1312 serio->id.proto = SERIO_SUN;
1313 serio->id.extra = 1;
1314 strlcpy(serio->name, "zsms", sizeof(serio->name));
1315 }
1316 strlcpy(serio->phys,
1317 ((up->flags & SUNZILOG_FLAG_CONS_KEYB) ?
1318 "zs/serio0" : "zs/serio1"),
1319 sizeof(serio->phys));
1320
1321 serio->write = sunzilog_serio_write;
1322 serio->open = sunzilog_serio_open;
1323 serio->close = sunzilog_serio_close;
1324 serio->dev.parent = up->port.dev;
1325
1326 serio_register_port(serio);
1327 }
1328 #endif
1329
1330 static void sunzilog_init_hw(struct uart_sunzilog_port *up)
1331 {
1332 struct zilog_channel __iomem *channel;
1333 unsigned long flags;
1334 int baud, brg;
1335
1336 channel = ZILOG_CHANNEL_FROM_PORT(&up->port);
1337
1338 spin_lock_irqsave(&up->port.lock, flags);
1339 if (ZS_IS_CHANNEL_A(up)) {
1340 write_zsreg(channel, R9, FHWRES);
1341 ZSDELAY_LONG();
1342 (void) read_zsreg(channel, R0);
1343 }
1344
1345 if (up->flags & (SUNZILOG_FLAG_CONS_KEYB |
1346 SUNZILOG_FLAG_CONS_MOUSE)) {
1347 up->curregs[R1] = EXT_INT_ENAB | INT_ALL_Rx | TxINT_ENAB;
1348 up->curregs[R4] = PAR_EVEN | X16CLK | SB1;
1349 up->curregs[R3] = RxENAB | Rx8;
1350 up->curregs[R5] = TxENAB | Tx8;
1351 up->curregs[R6] = 0x00;
1352 up->curregs[R7] = 0x7E;
1353 up->curregs[R9] = NV;
1354 up->curregs[R7p] = 0x00;
1355 sunzilog_init_kbdms(up);
1356
1357 if (up->flags & SUNZILOG_FLAG_ISR_HANDLER)
1358 up->curregs[R9] |= MIE;
1359 write_zsreg(channel, R9, up->curregs[R9]);
1360 } else {
1361
1362 up->parity_mask = 0xff;
1363 up->curregs[R1] = EXT_INT_ENAB | INT_ALL_Rx | TxINT_ENAB;
1364 up->curregs[R4] = PAR_EVEN | X16CLK | SB1;
1365 up->curregs[R3] = RxENAB | Rx8;
1366 up->curregs[R5] = TxENAB | Tx8;
1367 up->curregs[R6] = 0x00;
1368 up->curregs[R7] = 0x7E;
1369 up->curregs[R9] = NV;
1370 up->curregs[R10] = NRZ;
1371 up->curregs[R11] = TCBR | RCBR;
1372 baud = 9600;
1373 brg = BPS_TO_BRG(baud, ZS_CLOCK / ZS_CLOCK_DIVISOR);
1374 up->curregs[R12] = (brg & 0xff);
1375 up->curregs[R13] = (brg >> 8) & 0xff;
1376 up->curregs[R14] = BRSRC | BRENAB;
1377 up->curregs[R15] = FIFOEN;
1378 up->curregs[R7p] = TxFIFO_LVL | RxFIFO_LVL;
1379 if (__load_zsregs(channel, up->curregs)) {
1380 up->flags |= SUNZILOG_FLAG_ESCC;
1381 }
1382
1383 if (up->flags & SUNZILOG_FLAG_ISR_HANDLER)
1384 up->curregs[R9] |= MIE;
1385 write_zsreg(channel, R9, up->curregs[R9]);
1386 }
1387
1388 spin_unlock_irqrestore(&up->port.lock, flags);
1389
1390 #ifdef CONFIG_SERIO
1391 if (up->flags & (SUNZILOG_FLAG_CONS_KEYB |
1392 SUNZILOG_FLAG_CONS_MOUSE))
1393 sunzilog_register_serio(up);
1394 #endif
1395 }
1396
1397 static int zilog_irq;
1398
1399 static int zs_probe(struct platform_device *op)
1400 {
1401 static int kbm_inst, uart_inst;
1402 int inst;
1403 struct uart_sunzilog_port *up;
1404 struct zilog_layout __iomem *rp;
1405 int keyboard_mouse = 0;
1406 int err;
1407
1408 if (of_find_property(op->dev.of_node, "keyboard", NULL))
1409 keyboard_mouse = 1;
1410
1411
1412 if (keyboard_mouse)
1413 inst = uart_chip_count + kbm_inst;
1414 else
1415 inst = uart_inst;
1416
1417 sunzilog_chip_regs[inst] = of_ioremap(&op->resource[0], 0,
1418 sizeof(struct zilog_layout),
1419 "zs");
1420 if (!sunzilog_chip_regs[inst])
1421 return -ENOMEM;
1422
1423 rp = sunzilog_chip_regs[inst];
1424
1425 if (!zilog_irq)
1426 zilog_irq = op->archdata.irqs[0];
1427
1428 up = &sunzilog_port_table[inst * 2];
1429
1430
1431 up[0].port.mapbase = op->resource[0].start + 0x00;
1432 up[0].port.membase = (void __iomem *) &rp->channelA;
1433 up[0].port.iotype = UPIO_MEM;
1434 up[0].port.irq = op->archdata.irqs[0];
1435 up[0].port.uartclk = ZS_CLOCK;
1436 up[0].port.fifosize = 1;
1437 up[0].port.ops = &sunzilog_pops;
1438 up[0].port.type = PORT_SUNZILOG;
1439 up[0].port.flags = 0;
1440 up[0].port.line = (inst * 2) + 0;
1441 up[0].port.dev = &op->dev;
1442 up[0].flags |= SUNZILOG_FLAG_IS_CHANNEL_A;
1443 up[0].port.has_sysrq = IS_ENABLED(CONFIG_SERIAL_SUNZILOG_CONSOLE);
1444 if (keyboard_mouse)
1445 up[0].flags |= SUNZILOG_FLAG_CONS_KEYB;
1446 sunzilog_init_hw(&up[0]);
1447
1448
1449 up[1].port.mapbase = op->resource[0].start + 0x04;
1450 up[1].port.membase = (void __iomem *) &rp->channelB;
1451 up[1].port.iotype = UPIO_MEM;
1452 up[1].port.irq = op->archdata.irqs[0];
1453 up[1].port.uartclk = ZS_CLOCK;
1454 up[1].port.fifosize = 1;
1455 up[1].port.ops = &sunzilog_pops;
1456 up[1].port.type = PORT_SUNZILOG;
1457 up[1].port.flags = 0;
1458 up[1].port.line = (inst * 2) + 1;
1459 up[1].port.dev = &op->dev;
1460 up[1].flags |= 0;
1461 up[1].port.has_sysrq = IS_ENABLED(CONFIG_SERIAL_SUNZILOG_CONSOLE);
1462 if (keyboard_mouse)
1463 up[1].flags |= SUNZILOG_FLAG_CONS_MOUSE;
1464 sunzilog_init_hw(&up[1]);
1465
1466 if (!keyboard_mouse) {
1467 if (sunserial_console_match(SUNZILOG_CONSOLE(), op->dev.of_node,
1468 &sunzilog_reg, up[0].port.line,
1469 false))
1470 up->flags |= SUNZILOG_FLAG_IS_CONS;
1471 err = uart_add_one_port(&sunzilog_reg, &up[0].port);
1472 if (err) {
1473 of_iounmap(&op->resource[0],
1474 rp, sizeof(struct zilog_layout));
1475 return err;
1476 }
1477 if (sunserial_console_match(SUNZILOG_CONSOLE(), op->dev.of_node,
1478 &sunzilog_reg, up[1].port.line,
1479 false))
1480 up->flags |= SUNZILOG_FLAG_IS_CONS;
1481 err = uart_add_one_port(&sunzilog_reg, &up[1].port);
1482 if (err) {
1483 uart_remove_one_port(&sunzilog_reg, &up[0].port);
1484 of_iounmap(&op->resource[0],
1485 rp, sizeof(struct zilog_layout));
1486 return err;
1487 }
1488 uart_inst++;
1489 } else {
1490 printk(KERN_INFO "%s: Keyboard at MMIO 0x%llx (irq = %d) "
1491 "is a %s\n",
1492 dev_name(&op->dev),
1493 (unsigned long long) up[0].port.mapbase,
1494 op->archdata.irqs[0], sunzilog_type(&up[0].port));
1495 printk(KERN_INFO "%s: Mouse at MMIO 0x%llx (irq = %d) "
1496 "is a %s\n",
1497 dev_name(&op->dev),
1498 (unsigned long long) up[1].port.mapbase,
1499 op->archdata.irqs[0], sunzilog_type(&up[1].port));
1500 kbm_inst++;
1501 }
1502
1503 platform_set_drvdata(op, &up[0]);
1504
1505 return 0;
1506 }
1507
1508 static void zs_remove_one(struct uart_sunzilog_port *up)
1509 {
1510 if (ZS_IS_KEYB(up) || ZS_IS_MOUSE(up)) {
1511 #ifdef CONFIG_SERIO
1512 serio_unregister_port(&up->serio);
1513 #endif
1514 } else
1515 uart_remove_one_port(&sunzilog_reg, &up->port);
1516 }
1517
1518 static int zs_remove(struct platform_device *op)
1519 {
1520 struct uart_sunzilog_port *up = platform_get_drvdata(op);
1521 struct zilog_layout __iomem *regs;
1522
1523 zs_remove_one(&up[0]);
1524 zs_remove_one(&up[1]);
1525
1526 regs = sunzilog_chip_regs[up[0].port.line / 2];
1527 of_iounmap(&op->resource[0], regs, sizeof(struct zilog_layout));
1528
1529 return 0;
1530 }
1531
1532 static const struct of_device_id zs_match[] = {
1533 {
1534 .name = "zs",
1535 },
1536 {},
1537 };
1538 MODULE_DEVICE_TABLE(of, zs_match);
1539
1540 static struct platform_driver zs_driver = {
1541 .driver = {
1542 .name = "zs",
1543 .of_match_table = zs_match,
1544 },
1545 .probe = zs_probe,
1546 .remove = zs_remove,
1547 };
1548
1549 static int __init sunzilog_init(void)
1550 {
1551 struct device_node *dp;
1552 int err;
1553 int num_keybms = 0;
1554 int num_sunzilog = 0;
1555
1556 for_each_node_by_name(dp, "zs") {
1557 num_sunzilog++;
1558 if (of_find_property(dp, "keyboard", NULL))
1559 num_keybms++;
1560 }
1561
1562 if (num_sunzilog) {
1563 err = sunzilog_alloc_tables(num_sunzilog);
1564 if (err)
1565 goto out;
1566
1567 uart_chip_count = num_sunzilog - num_keybms;
1568
1569 err = sunserial_register_minors(&sunzilog_reg,
1570 uart_chip_count * 2);
1571 if (err)
1572 goto out_free_tables;
1573 }
1574
1575 err = platform_driver_register(&zs_driver);
1576 if (err)
1577 goto out_unregister_uart;
1578
1579 if (zilog_irq) {
1580 struct uart_sunzilog_port *up = sunzilog_irq_chain;
1581 err = request_irq(zilog_irq, sunzilog_interrupt, IRQF_SHARED,
1582 "zs", sunzilog_irq_chain);
1583 if (err)
1584 goto out_unregister_driver;
1585
1586
1587 while (up) {
1588 struct zilog_channel __iomem *channel;
1589
1590
1591 channel = ZILOG_CHANNEL_FROM_PORT(&up->port);
1592 up->flags |= SUNZILOG_FLAG_ISR_HANDLER;
1593 up->curregs[R9] |= MIE;
1594 write_zsreg(channel, R9, up->curregs[R9]);
1595 up = up->next;
1596 }
1597 }
1598
1599 out:
1600 return err;
1601
1602 out_unregister_driver:
1603 platform_driver_unregister(&zs_driver);
1604
1605 out_unregister_uart:
1606 if (num_sunzilog) {
1607 sunserial_unregister_minors(&sunzilog_reg, num_sunzilog);
1608 sunzilog_reg.cons = NULL;
1609 }
1610
1611 out_free_tables:
1612 sunzilog_free_tables();
1613 goto out;
1614 }
1615
1616 static void __exit sunzilog_exit(void)
1617 {
1618 platform_driver_unregister(&zs_driver);
1619
1620 if (zilog_irq) {
1621 struct uart_sunzilog_port *up = sunzilog_irq_chain;
1622
1623
1624 while (up) {
1625 struct zilog_channel __iomem *channel;
1626
1627
1628 channel = ZILOG_CHANNEL_FROM_PORT(&up->port);
1629 up->flags &= ~SUNZILOG_FLAG_ISR_HANDLER;
1630 up->curregs[R9] &= ~MIE;
1631 write_zsreg(channel, R9, up->curregs[R9]);
1632 up = up->next;
1633 }
1634
1635 free_irq(zilog_irq, sunzilog_irq_chain);
1636 zilog_irq = 0;
1637 }
1638
1639 if (sunzilog_reg.nr) {
1640 sunserial_unregister_minors(&sunzilog_reg, sunzilog_reg.nr);
1641 sunzilog_free_tables();
1642 }
1643 }
1644
1645 module_init(sunzilog_init);
1646 module_exit(sunzilog_exit);
1647
1648 MODULE_AUTHOR("David S. Miller");
1649 MODULE_DESCRIPTION("Sun Zilog serial port driver");
1650 MODULE_VERSION("2.0");
1651 MODULE_LICENSE("GPL");