xref: /openbmc/linux/drivers/tty/serial/sprd_serial.c (revision 15b7cc78)
1 /*
2  * Copyright (C) 2012-2015 Spreadtrum Communications Inc.
3  *
4  * This software is licensed under the terms of the GNU General Public
5  * License version 2, as published by the Free Software Foundation, and
6  * may be copied, distributed, and modified under those terms.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  * GNU General Public License for more details.
12  */
13 
14 #if defined(CONFIG_SERIAL_SPRD_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
15 #define SUPPORT_SYSRQ
16 #endif
17 
18 #include <linux/clk.h>
19 #include <linux/console.h>
20 #include <linux/delay.h>
21 #include <linux/io.h>
22 #include <linux/ioport.h>
23 #include <linux/kernel.h>
24 #include <linux/module.h>
25 #include <linux/of.h>
26 #include <linux/platform_device.h>
27 #include <linux/serial_core.h>
28 #include <linux/serial.h>
29 #include <linux/slab.h>
30 #include <linux/tty.h>
31 #include <linux/tty_flip.h>
32 
33 /* device name */
34 #define UART_NR_MAX		8
35 #define SPRD_TTY_NAME		"ttyS"
36 #define SPRD_FIFO_SIZE		128
37 #define SPRD_DEF_RATE		26000000
38 #define SPRD_BAUD_IO_LIMIT	3000000
39 #define SPRD_TIMEOUT		256
40 
41 /* the offset of serial registers and BITs for them */
42 /* data registers */
43 #define SPRD_TXD		0x0000
44 #define SPRD_RXD		0x0004
45 
46 /* line status register and its BITs  */
47 #define SPRD_LSR		0x0008
48 #define SPRD_LSR_OE		BIT(4)
49 #define SPRD_LSR_FE		BIT(3)
50 #define SPRD_LSR_PE		BIT(2)
51 #define SPRD_LSR_BI		BIT(7)
52 #define SPRD_LSR_TX_OVER	BIT(15)
53 
54 /* data number in TX and RX fifo */
55 #define SPRD_STS1		0x000C
56 
57 /* interrupt enable register and its BITs */
58 #define SPRD_IEN		0x0010
59 #define SPRD_IEN_RX_FULL	BIT(0)
60 #define SPRD_IEN_TX_EMPTY	BIT(1)
61 #define SPRD_IEN_BREAK_DETECT	BIT(7)
62 #define SPRD_IEN_TIMEOUT	BIT(13)
63 
64 /* interrupt clear register */
65 #define SPRD_ICLR		0x0014
66 
67 /* line control register */
68 #define SPRD_LCR		0x0018
69 #define SPRD_LCR_STOP_1BIT	0x10
70 #define SPRD_LCR_STOP_2BIT	0x30
71 #define SPRD_LCR_DATA_LEN	(BIT(2) | BIT(3))
72 #define SPRD_LCR_DATA_LEN5	0x0
73 #define SPRD_LCR_DATA_LEN6	0x4
74 #define SPRD_LCR_DATA_LEN7	0x8
75 #define SPRD_LCR_DATA_LEN8	0xc
76 #define SPRD_LCR_PARITY	(BIT(0) | BIT(1))
77 #define SPRD_LCR_PARITY_EN	0x2
78 #define SPRD_LCR_EVEN_PAR	0x0
79 #define SPRD_LCR_ODD_PAR	0x1
80 
81 /* control register 1 */
82 #define SPRD_CTL1			0x001C
83 #define RX_HW_FLOW_CTL_THLD	BIT(6)
84 #define RX_HW_FLOW_CTL_EN	BIT(7)
85 #define TX_HW_FLOW_CTL_EN	BIT(8)
86 #define RX_TOUT_THLD_DEF	0x3E00
87 #define RX_HFC_THLD_DEF	0x40
88 
89 /* fifo threshold register */
90 #define SPRD_CTL2		0x0020
91 #define THLD_TX_EMPTY	0x40
92 #define THLD_RX_FULL	0x40
93 
94 /* config baud rate register */
95 #define SPRD_CLKD0		0x0024
96 #define SPRD_CLKD1		0x0028
97 
98 /* interrupt mask status register */
99 #define SPRD_IMSR			0x002C
100 #define SPRD_IMSR_RX_FIFO_FULL		BIT(0)
101 #define SPRD_IMSR_TX_FIFO_EMPTY	BIT(1)
102 #define SPRD_IMSR_BREAK_DETECT		BIT(7)
103 #define SPRD_IMSR_TIMEOUT		BIT(13)
104 
105 struct reg_backup {
106 	u32 ien;
107 	u32 ctrl0;
108 	u32 ctrl1;
109 	u32 ctrl2;
110 	u32 clkd0;
111 	u32 clkd1;
112 	u32 dspwait;
113 };
114 
115 struct sprd_uart_port {
116 	struct uart_port port;
117 	struct reg_backup reg_bak;
118 	char name[16];
119 };
120 
121 static struct sprd_uart_port *sprd_port[UART_NR_MAX];
122 static int sprd_ports_num;
123 
124 static inline unsigned int serial_in(struct uart_port *port, int offset)
125 {
126 	return readl_relaxed(port->membase + offset);
127 }
128 
129 static inline void serial_out(struct uart_port *port, int offset, int value)
130 {
131 	writel_relaxed(value, port->membase + offset);
132 }
133 
134 static unsigned int sprd_tx_empty(struct uart_port *port)
135 {
136 	if (serial_in(port, SPRD_STS1) & 0xff00)
137 		return 0;
138 	else
139 		return TIOCSER_TEMT;
140 }
141 
142 static unsigned int sprd_get_mctrl(struct uart_port *port)
143 {
144 	return TIOCM_DSR | TIOCM_CTS;
145 }
146 
147 static void sprd_set_mctrl(struct uart_port *port, unsigned int mctrl)
148 {
149 	/* nothing to do */
150 }
151 
152 static void sprd_stop_tx(struct uart_port *port)
153 {
154 	unsigned int ien, iclr;
155 
156 	iclr = serial_in(port, SPRD_ICLR);
157 	ien = serial_in(port, SPRD_IEN);
158 
159 	iclr |= SPRD_IEN_TX_EMPTY;
160 	ien &= ~SPRD_IEN_TX_EMPTY;
161 
162 	serial_out(port, SPRD_ICLR, iclr);
163 	serial_out(port, SPRD_IEN, ien);
164 }
165 
166 static void sprd_start_tx(struct uart_port *port)
167 {
168 	unsigned int ien;
169 
170 	ien = serial_in(port, SPRD_IEN);
171 	if (!(ien & SPRD_IEN_TX_EMPTY)) {
172 		ien |= SPRD_IEN_TX_EMPTY;
173 		serial_out(port, SPRD_IEN, ien);
174 	}
175 }
176 
177 static void sprd_stop_rx(struct uart_port *port)
178 {
179 	unsigned int ien, iclr;
180 
181 	iclr = serial_in(port, SPRD_ICLR);
182 	ien = serial_in(port, SPRD_IEN);
183 
184 	ien &= ~(SPRD_IEN_RX_FULL | SPRD_IEN_BREAK_DETECT);
185 	iclr |= SPRD_IEN_RX_FULL | SPRD_IEN_BREAK_DETECT;
186 
187 	serial_out(port, SPRD_IEN, ien);
188 	serial_out(port, SPRD_ICLR, iclr);
189 }
190 
191 /* The Sprd serial does not support this function. */
192 static void sprd_break_ctl(struct uart_port *port, int break_state)
193 {
194 	/* nothing to do */
195 }
196 
197 static int handle_lsr_errors(struct uart_port *port,
198 			     unsigned int *flag,
199 			     unsigned int *lsr)
200 {
201 	int ret = 0;
202 
203 	/* statistics */
204 	if (*lsr & SPRD_LSR_BI) {
205 		*lsr &= ~(SPRD_LSR_FE | SPRD_LSR_PE);
206 		port->icount.brk++;
207 		ret = uart_handle_break(port);
208 		if (ret)
209 			return ret;
210 	} else if (*lsr & SPRD_LSR_PE)
211 		port->icount.parity++;
212 	else if (*lsr & SPRD_LSR_FE)
213 		port->icount.frame++;
214 	if (*lsr & SPRD_LSR_OE)
215 		port->icount.overrun++;
216 
217 	/* mask off conditions which should be ignored */
218 	*lsr &= port->read_status_mask;
219 	if (*lsr & SPRD_LSR_BI)
220 		*flag = TTY_BREAK;
221 	else if (*lsr & SPRD_LSR_PE)
222 		*flag = TTY_PARITY;
223 	else if (*lsr & SPRD_LSR_FE)
224 		*flag = TTY_FRAME;
225 
226 	return ret;
227 }
228 
229 static inline void sprd_rx(struct uart_port *port)
230 {
231 	struct tty_port *tty = &port->state->port;
232 	unsigned int ch, flag, lsr, max_count = SPRD_TIMEOUT;
233 
234 	while ((serial_in(port, SPRD_STS1) & 0x00ff) && max_count--) {
235 		lsr = serial_in(port, SPRD_LSR);
236 		ch = serial_in(port, SPRD_RXD);
237 		flag = TTY_NORMAL;
238 		port->icount.rx++;
239 
240 		if (lsr & (SPRD_LSR_BI | SPRD_LSR_PE |
241 			SPRD_LSR_FE | SPRD_LSR_OE))
242 			if (handle_lsr_errors(port, &lsr, &flag))
243 				continue;
244 		if (uart_handle_sysrq_char(port, ch))
245 			continue;
246 
247 		uart_insert_char(port, lsr, SPRD_LSR_OE, ch, flag);
248 	}
249 
250 	tty_flip_buffer_push(tty);
251 }
252 
253 static inline void sprd_tx(struct uart_port *port)
254 {
255 	struct circ_buf *xmit = &port->state->xmit;
256 	int count;
257 
258 	if (port->x_char) {
259 		serial_out(port, SPRD_TXD, port->x_char);
260 		port->icount.tx++;
261 		port->x_char = 0;
262 		return;
263 	}
264 
265 	if (uart_circ_empty(xmit) || uart_tx_stopped(port)) {
266 		sprd_stop_tx(port);
267 		return;
268 	}
269 
270 	count = THLD_TX_EMPTY;
271 	do {
272 		serial_out(port, SPRD_TXD, xmit->buf[xmit->tail]);
273 		xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
274 		port->icount.tx++;
275 		if (uart_circ_empty(xmit))
276 			break;
277 	} while (--count > 0);
278 
279 	if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
280 		uart_write_wakeup(port);
281 
282 	if (uart_circ_empty(xmit))
283 		sprd_stop_tx(port);
284 }
285 
286 /* this handles the interrupt from one port */
287 static irqreturn_t sprd_handle_irq(int irq, void *dev_id)
288 {
289 	struct uart_port *port = dev_id;
290 	unsigned int ims;
291 
292 	spin_lock(&port->lock);
293 
294 	ims = serial_in(port, SPRD_IMSR);
295 
296 	if (!ims) {
297 		spin_unlock(&port->lock);
298 		return IRQ_NONE;
299 	}
300 
301 	serial_out(port, SPRD_ICLR, ~0);
302 
303 	if (ims & (SPRD_IMSR_RX_FIFO_FULL |
304 		SPRD_IMSR_BREAK_DETECT | SPRD_IMSR_TIMEOUT))
305 		sprd_rx(port);
306 
307 	if (ims & SPRD_IMSR_TX_FIFO_EMPTY)
308 		sprd_tx(port);
309 
310 	spin_unlock(&port->lock);
311 
312 	return IRQ_HANDLED;
313 }
314 
315 static int sprd_startup(struct uart_port *port)
316 {
317 	int ret = 0;
318 	unsigned int ien, fc;
319 	unsigned int timeout;
320 	struct sprd_uart_port *sp;
321 	unsigned long flags;
322 
323 	serial_out(port, SPRD_CTL2, ((THLD_TX_EMPTY << 8) | THLD_RX_FULL));
324 
325 	/* clear rx fifo */
326 	timeout = SPRD_TIMEOUT;
327 	while (timeout-- && serial_in(port, SPRD_STS1) & 0x00ff)
328 		serial_in(port, SPRD_RXD);
329 
330 	/* clear tx fifo */
331 	timeout = SPRD_TIMEOUT;
332 	while (timeout-- && serial_in(port, SPRD_STS1) & 0xff00)
333 		cpu_relax();
334 
335 	/* clear interrupt */
336 	serial_out(port, SPRD_IEN, 0);
337 	serial_out(port, SPRD_ICLR, ~0);
338 
339 	/* allocate irq */
340 	sp = container_of(port, struct sprd_uart_port, port);
341 	snprintf(sp->name, sizeof(sp->name), "sprd_serial%d", port->line);
342 	ret = devm_request_irq(port->dev, port->irq, sprd_handle_irq,
343 				IRQF_SHARED, sp->name, port);
344 	if (ret) {
345 		dev_err(port->dev, "fail to request serial irq %d, ret=%d\n",
346 			port->irq, ret);
347 		return ret;
348 	}
349 	fc = serial_in(port, SPRD_CTL1);
350 	fc |= RX_TOUT_THLD_DEF | RX_HFC_THLD_DEF;
351 	serial_out(port, SPRD_CTL1, fc);
352 
353 	/* enable interrupt */
354 	spin_lock_irqsave(&port->lock, flags);
355 	ien = serial_in(port, SPRD_IEN);
356 	ien |= SPRD_IEN_RX_FULL | SPRD_IEN_BREAK_DETECT | SPRD_IEN_TIMEOUT;
357 	serial_out(port, SPRD_IEN, ien);
358 	spin_unlock_irqrestore(&port->lock, flags);
359 
360 	return 0;
361 }
362 
363 static void sprd_shutdown(struct uart_port *port)
364 {
365 	serial_out(port, SPRD_IEN, 0);
366 	serial_out(port, SPRD_ICLR, ~0);
367 	devm_free_irq(port->dev, port->irq, port);
368 }
369 
370 static void sprd_set_termios(struct uart_port *port,
371 				    struct ktermios *termios,
372 				    struct ktermios *old)
373 {
374 	unsigned int baud, quot;
375 	unsigned int lcr = 0, fc;
376 	unsigned long flags;
377 
378 	/* ask the core to calculate the divisor for us */
379 	baud = uart_get_baud_rate(port, termios, old, 0, SPRD_BAUD_IO_LIMIT);
380 
381 	quot = (unsigned int)((port->uartclk + baud / 2) / baud);
382 
383 	/* set data length */
384 	switch (termios->c_cflag & CSIZE) {
385 	case CS5:
386 		lcr |= SPRD_LCR_DATA_LEN5;
387 		break;
388 	case CS6:
389 		lcr |= SPRD_LCR_DATA_LEN6;
390 		break;
391 	case CS7:
392 		lcr |= SPRD_LCR_DATA_LEN7;
393 		break;
394 	case CS8:
395 	default:
396 		lcr |= SPRD_LCR_DATA_LEN8;
397 		break;
398 	}
399 
400 	/* calculate stop bits */
401 	lcr &= ~(SPRD_LCR_STOP_1BIT | SPRD_LCR_STOP_2BIT);
402 	if (termios->c_cflag & CSTOPB)
403 		lcr |= SPRD_LCR_STOP_2BIT;
404 	else
405 		lcr |= SPRD_LCR_STOP_1BIT;
406 
407 	/* calculate parity */
408 	lcr &= ~SPRD_LCR_PARITY;
409 	termios->c_cflag &= ~CMSPAR;	/* no support mark/space */
410 	if (termios->c_cflag & PARENB) {
411 		lcr |= SPRD_LCR_PARITY_EN;
412 		if (termios->c_cflag & PARODD)
413 			lcr |= SPRD_LCR_ODD_PAR;
414 		else
415 			lcr |= SPRD_LCR_EVEN_PAR;
416 	}
417 
418 	spin_lock_irqsave(&port->lock, flags);
419 
420 	/* update the per-port timeout */
421 	uart_update_timeout(port, termios->c_cflag, baud);
422 
423 	port->read_status_mask = SPRD_LSR_OE;
424 	if (termios->c_iflag & INPCK)
425 		port->read_status_mask |= SPRD_LSR_FE | SPRD_LSR_PE;
426 	if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK))
427 		port->read_status_mask |= SPRD_LSR_BI;
428 
429 	/* characters to ignore */
430 	port->ignore_status_mask = 0;
431 	if (termios->c_iflag & IGNPAR)
432 		port->ignore_status_mask |= SPRD_LSR_PE | SPRD_LSR_FE;
433 	if (termios->c_iflag & IGNBRK) {
434 		port->ignore_status_mask |= SPRD_LSR_BI;
435 		/*
436 		 * If we're ignoring parity and break indicators,
437 		 * ignore overruns too (for real raw support).
438 		 */
439 		if (termios->c_iflag & IGNPAR)
440 			port->ignore_status_mask |= SPRD_LSR_OE;
441 	}
442 
443 	/* flow control */
444 	fc = serial_in(port, SPRD_CTL1);
445 	fc &= ~(RX_HW_FLOW_CTL_THLD | RX_HW_FLOW_CTL_EN | TX_HW_FLOW_CTL_EN);
446 	if (termios->c_cflag & CRTSCTS) {
447 		fc |= RX_HW_FLOW_CTL_THLD;
448 		fc |= RX_HW_FLOW_CTL_EN;
449 		fc |= TX_HW_FLOW_CTL_EN;
450 	}
451 
452 	/* clock divider bit0~bit15 */
453 	serial_out(port, SPRD_CLKD0, quot & 0xffff);
454 
455 	/* clock divider bit16~bit20 */
456 	serial_out(port, SPRD_CLKD1, (quot & 0x1f0000) >> 16);
457 	serial_out(port, SPRD_LCR, lcr);
458 	fc |= RX_TOUT_THLD_DEF | RX_HFC_THLD_DEF;
459 	serial_out(port, SPRD_CTL1, fc);
460 
461 	spin_unlock_irqrestore(&port->lock, flags);
462 
463 	/* Don't rewrite B0 */
464 	if (tty_termios_baud_rate(termios))
465 		tty_termios_encode_baud_rate(termios, baud, baud);
466 }
467 
468 static const char *sprd_type(struct uart_port *port)
469 {
470 	return "SPX";
471 }
472 
473 static void sprd_release_port(struct uart_port *port)
474 {
475 	/* nothing to do */
476 }
477 
478 static int sprd_request_port(struct uart_port *port)
479 {
480 	return 0;
481 }
482 
483 static void sprd_config_port(struct uart_port *port, int flags)
484 {
485 	if (flags & UART_CONFIG_TYPE)
486 		port->type = PORT_SPRD;
487 }
488 
489 static int sprd_verify_port(struct uart_port *port,
490 				   struct serial_struct *ser)
491 {
492 	if (ser->type != PORT_SPRD)
493 		return -EINVAL;
494 	if (port->irq != ser->irq)
495 		return -EINVAL;
496 	if (port->iotype != ser->io_type)
497 		return -EINVAL;
498 	return 0;
499 }
500 
501 static struct uart_ops serial_sprd_ops = {
502 	.tx_empty = sprd_tx_empty,
503 	.get_mctrl = sprd_get_mctrl,
504 	.set_mctrl = sprd_set_mctrl,
505 	.stop_tx = sprd_stop_tx,
506 	.start_tx = sprd_start_tx,
507 	.stop_rx = sprd_stop_rx,
508 	.break_ctl = sprd_break_ctl,
509 	.startup = sprd_startup,
510 	.shutdown = sprd_shutdown,
511 	.set_termios = sprd_set_termios,
512 	.type = sprd_type,
513 	.release_port = sprd_release_port,
514 	.request_port = sprd_request_port,
515 	.config_port = sprd_config_port,
516 	.verify_port = sprd_verify_port,
517 };
518 
519 #ifdef CONFIG_SERIAL_SPRD_CONSOLE
520 static void wait_for_xmitr(struct uart_port *port)
521 {
522 	unsigned int status, tmout = 10000;
523 
524 	/* wait up to 10ms for the character(s) to be sent */
525 	do {
526 		status = serial_in(port, SPRD_STS1);
527 		if (--tmout == 0)
528 			break;
529 		udelay(1);
530 	} while (status & 0xff00);
531 }
532 
533 static void sprd_console_putchar(struct uart_port *port, int ch)
534 {
535 	wait_for_xmitr(port);
536 	serial_out(port, SPRD_TXD, ch);
537 }
538 
539 static void sprd_console_write(struct console *co, const char *s,
540 				      unsigned int count)
541 {
542 	struct uart_port *port = &sprd_port[co->index]->port;
543 	int locked = 1;
544 	unsigned long flags;
545 
546 	if (port->sysrq)
547 		locked = 0;
548 	else if (oops_in_progress)
549 		locked = spin_trylock_irqsave(&port->lock, flags);
550 	else
551 		spin_lock_irqsave(&port->lock, flags);
552 
553 	uart_console_write(port, s, count, sprd_console_putchar);
554 
555 	/* wait for transmitter to become empty */
556 	wait_for_xmitr(port);
557 
558 	if (locked)
559 		spin_unlock_irqrestore(&port->lock, flags);
560 }
561 
562 static int __init sprd_console_setup(struct console *co, char *options)
563 {
564 	struct uart_port *port;
565 	int baud = 115200;
566 	int bits = 8;
567 	int parity = 'n';
568 	int flow = 'n';
569 
570 	if (co->index >= UART_NR_MAX || co->index < 0)
571 		co->index = 0;
572 
573 	port = &sprd_port[co->index]->port;
574 	if (port == NULL) {
575 		pr_info("serial port %d not yet initialized\n", co->index);
576 		return -ENODEV;
577 	}
578 	if (options)
579 		uart_parse_options(options, &baud, &parity, &bits, &flow);
580 
581 	return uart_set_options(port, co, baud, parity, bits, flow);
582 }
583 
584 static struct uart_driver sprd_uart_driver;
585 static struct console sprd_console = {
586 	.name = SPRD_TTY_NAME,
587 	.write = sprd_console_write,
588 	.device = uart_console_device,
589 	.setup = sprd_console_setup,
590 	.flags = CON_PRINTBUFFER,
591 	.index = -1,
592 	.data = &sprd_uart_driver,
593 };
594 
595 #define SPRD_CONSOLE	(&sprd_console)
596 
597 /* Support for earlycon */
598 static void sprd_putc(struct uart_port *port, int c)
599 {
600 	unsigned int timeout = SPRD_TIMEOUT;
601 
602 	while (timeout-- &&
603 		   !(readl(port->membase + SPRD_LSR) & SPRD_LSR_TX_OVER))
604 		cpu_relax();
605 
606 	writeb(c, port->membase + SPRD_TXD);
607 }
608 
609 static void sprd_early_write(struct console *con, const char *s,
610 				    unsigned n)
611 {
612 	struct earlycon_device *dev = con->data;
613 
614 	uart_console_write(&dev->port, s, n, sprd_putc);
615 }
616 
617 static int __init sprd_early_console_setup(
618 				struct earlycon_device *device,
619 				const char *opt)
620 {
621 	if (!device->port.membase)
622 		return -ENODEV;
623 
624 	device->con->write = sprd_early_write;
625 	return 0;
626 }
627 OF_EARLYCON_DECLARE(sprd_serial, "sprd,sc9836-uart",
628 		    sprd_early_console_setup);
629 
630 #else /* !CONFIG_SERIAL_SPRD_CONSOLE */
631 #define SPRD_CONSOLE		NULL
632 #endif
633 
634 static struct uart_driver sprd_uart_driver = {
635 	.owner = THIS_MODULE,
636 	.driver_name = "sprd_serial",
637 	.dev_name = SPRD_TTY_NAME,
638 	.major = 0,
639 	.minor = 0,
640 	.nr = UART_NR_MAX,
641 	.cons = SPRD_CONSOLE,
642 };
643 
644 static int sprd_probe_dt_alias(int index, struct device *dev)
645 {
646 	struct device_node *np;
647 	int ret = index;
648 
649 	if (!IS_ENABLED(CONFIG_OF))
650 		return ret;
651 
652 	np = dev->of_node;
653 	if (!np)
654 		return ret;
655 
656 	ret = of_alias_get_id(np, "serial");
657 	if (ret < 0)
658 		ret = index;
659 	else if (ret >= ARRAY_SIZE(sprd_port) || sprd_port[ret] != NULL) {
660 		dev_warn(dev, "requested serial port %d not available.\n", ret);
661 		ret = index;
662 	}
663 
664 	return ret;
665 }
666 
667 static int sprd_remove(struct platform_device *dev)
668 {
669 	struct sprd_uart_port *sup = platform_get_drvdata(dev);
670 
671 	if (sup) {
672 		uart_remove_one_port(&sprd_uart_driver, &sup->port);
673 		sprd_port[sup->port.line] = NULL;
674 		sprd_ports_num--;
675 	}
676 
677 	if (!sprd_ports_num)
678 		uart_unregister_driver(&sprd_uart_driver);
679 
680 	return 0;
681 }
682 
683 static int sprd_probe(struct platform_device *pdev)
684 {
685 	struct resource *res;
686 	struct uart_port *up;
687 	struct clk *clk;
688 	int irq;
689 	int index;
690 	int ret;
691 
692 	for (index = 0; index < ARRAY_SIZE(sprd_port); index++)
693 		if (sprd_port[index] == NULL)
694 			break;
695 
696 	if (index == ARRAY_SIZE(sprd_port))
697 		return -EBUSY;
698 
699 	index = sprd_probe_dt_alias(index, &pdev->dev);
700 
701 	sprd_port[index] = devm_kzalloc(&pdev->dev,
702 		sizeof(*sprd_port[index]), GFP_KERNEL);
703 	if (!sprd_port[index])
704 		return -ENOMEM;
705 
706 	up = &sprd_port[index]->port;
707 	up->dev = &pdev->dev;
708 	up->line = index;
709 	up->type = PORT_SPRD;
710 	up->iotype = UPIO_MEM;
711 	up->uartclk = SPRD_DEF_RATE;
712 	up->fifosize = SPRD_FIFO_SIZE;
713 	up->ops = &serial_sprd_ops;
714 	up->flags = UPF_BOOT_AUTOCONF;
715 
716 	clk = devm_clk_get(&pdev->dev, NULL);
717 	if (!IS_ERR_OR_NULL(clk))
718 		up->uartclk = clk_get_rate(clk);
719 
720 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
721 	if (!res) {
722 		dev_err(&pdev->dev, "not provide mem resource\n");
723 		return -ENODEV;
724 	}
725 	up->mapbase = res->start;
726 	up->membase = devm_ioremap_resource(&pdev->dev, res);
727 	if (IS_ERR(up->membase))
728 		return PTR_ERR(up->membase);
729 
730 	irq = platform_get_irq(pdev, 0);
731 	if (irq < 0) {
732 		dev_err(&pdev->dev, "not provide irq resource\n");
733 		return -ENODEV;
734 	}
735 	up->irq = irq;
736 
737 	if (!sprd_ports_num) {
738 		ret = uart_register_driver(&sprd_uart_driver);
739 		if (ret < 0) {
740 			pr_err("Failed to register SPRD-UART driver\n");
741 			return ret;
742 		}
743 	}
744 	sprd_ports_num++;
745 
746 	ret = uart_add_one_port(&sprd_uart_driver, up);
747 	if (ret) {
748 		sprd_port[index] = NULL;
749 		sprd_remove(pdev);
750 	}
751 
752 	platform_set_drvdata(pdev, up);
753 
754 	return ret;
755 }
756 
757 #ifdef CONFIG_PM_SLEEP
758 static int sprd_suspend(struct device *dev)
759 {
760 	struct sprd_uart_port *sup = dev_get_drvdata(dev);
761 
762 	uart_suspend_port(&sprd_uart_driver, &sup->port);
763 
764 	return 0;
765 }
766 
767 static int sprd_resume(struct device *dev)
768 {
769 	struct sprd_uart_port *sup = dev_get_drvdata(dev);
770 
771 	uart_resume_port(&sprd_uart_driver, &sup->port);
772 
773 	return 0;
774 }
775 #endif
776 
777 static SIMPLE_DEV_PM_OPS(sprd_pm_ops, sprd_suspend, sprd_resume);
778 
779 static const struct of_device_id serial_ids[] = {
780 	{.compatible = "sprd,sc9836-uart",},
781 	{}
782 };
783 MODULE_DEVICE_TABLE(of, serial_ids);
784 
785 static struct platform_driver sprd_platform_driver = {
786 	.probe		= sprd_probe,
787 	.remove		= sprd_remove,
788 	.driver		= {
789 		.name	= "sprd_serial",
790 		.of_match_table = of_match_ptr(serial_ids),
791 		.pm	= &sprd_pm_ops,
792 	},
793 };
794 
795 module_platform_driver(sprd_platform_driver);
796 
797 MODULE_LICENSE("GPL v2");
798 MODULE_DESCRIPTION("Spreadtrum SoC serial driver series");
799