xref: /openbmc/linux/drivers/tty/serial/st-asc.c (revision af958a38)
1 /*
2  * st-asc.c: ST Asynchronous serial controller (ASC) driver
3  *
4  * Copyright (C) 2003-2013 STMicroelectronics (R&D) Limited
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  */
12 
13 #if defined(CONFIG_SERIAL_ST_ASC_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
14 #define SUPPORT_SYSRQ
15 #endif
16 
17 #include <linux/module.h>
18 #include <linux/serial.h>
19 #include <linux/console.h>
20 #include <linux/sysrq.h>
21 #include <linux/platform_device.h>
22 #include <linux/io.h>
23 #include <linux/irq.h>
24 #include <linux/tty.h>
25 #include <linux/tty_flip.h>
26 #include <linux/delay.h>
27 #include <linux/spinlock.h>
28 #include <linux/pm_runtime.h>
29 #include <linux/of.h>
30 #include <linux/of_platform.h>
31 #include <linux/serial_core.h>
32 #include <linux/clk.h>
33 
34 #define DRIVER_NAME "st-asc"
35 #define ASC_SERIAL_NAME "ttyAS"
36 #define ASC_FIFO_SIZE 16
37 #define ASC_MAX_PORTS 8
38 
39 struct asc_port {
40 	struct uart_port port;
41 	struct clk *clk;
42 	unsigned int hw_flow_control:1;
43 	unsigned int force_m1:1;
44 };
45 
46 static struct asc_port asc_ports[ASC_MAX_PORTS];
47 static struct uart_driver asc_uart_driver;
48 
49 /*---- UART Register definitions ------------------------------*/
50 
51 /* Register offsets */
52 
53 #define ASC_BAUDRATE			0x00
54 #define ASC_TXBUF			0x04
55 #define ASC_RXBUF			0x08
56 #define ASC_CTL				0x0C
57 #define ASC_INTEN			0x10
58 #define ASC_STA				0x14
59 #define ASC_GUARDTIME			0x18
60 #define ASC_TIMEOUT			0x1C
61 #define ASC_TXRESET			0x20
62 #define ASC_RXRESET			0x24
63 #define ASC_RETRIES			0x28
64 
65 /* ASC_RXBUF */
66 #define ASC_RXBUF_PE			0x100
67 #define ASC_RXBUF_FE			0x200
68 /**
69  * Some of status comes from higher bits of the character and some come from
70  * the status register. Combining both of them in to single status using dummy
71  * bits.
72  */
73 #define ASC_RXBUF_DUMMY_RX		0x10000
74 #define ASC_RXBUF_DUMMY_BE		0x20000
75 #define ASC_RXBUF_DUMMY_OE		0x40000
76 
77 /* ASC_CTL */
78 
79 #define ASC_CTL_MODE_MSK		0x0007
80 #define  ASC_CTL_MODE_8BIT		0x0001
81 #define  ASC_CTL_MODE_7BIT_PAR		0x0003
82 #define  ASC_CTL_MODE_9BIT		0x0004
83 #define  ASC_CTL_MODE_8BIT_WKUP		0x0005
84 #define  ASC_CTL_MODE_8BIT_PAR		0x0007
85 #define ASC_CTL_STOP_MSK		0x0018
86 #define  ASC_CTL_STOP_HALFBIT		0x0000
87 #define  ASC_CTL_STOP_1BIT		0x0008
88 #define  ASC_CTL_STOP_1_HALFBIT		0x0010
89 #define  ASC_CTL_STOP_2BIT		0x0018
90 #define ASC_CTL_PARITYODD		0x0020
91 #define ASC_CTL_LOOPBACK		0x0040
92 #define ASC_CTL_RUN			0x0080
93 #define ASC_CTL_RXENABLE		0x0100
94 #define ASC_CTL_SCENABLE		0x0200
95 #define ASC_CTL_FIFOENABLE		0x0400
96 #define ASC_CTL_CTSENABLE		0x0800
97 #define ASC_CTL_BAUDMODE		0x1000
98 
99 /* ASC_GUARDTIME */
100 
101 #define ASC_GUARDTIME_MSK		0x00FF
102 
103 /* ASC_INTEN */
104 
105 #define ASC_INTEN_RBE			0x0001
106 #define ASC_INTEN_TE			0x0002
107 #define ASC_INTEN_THE			0x0004
108 #define ASC_INTEN_PE			0x0008
109 #define ASC_INTEN_FE			0x0010
110 #define ASC_INTEN_OE			0x0020
111 #define ASC_INTEN_TNE			0x0040
112 #define ASC_INTEN_TOI			0x0080
113 #define ASC_INTEN_RHF			0x0100
114 
115 /* ASC_RETRIES */
116 
117 #define ASC_RETRIES_MSK			0x00FF
118 
119 /* ASC_RXBUF */
120 
121 #define ASC_RXBUF_MSK			0x03FF
122 
123 /* ASC_STA */
124 
125 #define ASC_STA_RBF			0x0001
126 #define ASC_STA_TE			0x0002
127 #define ASC_STA_THE			0x0004
128 #define ASC_STA_PE			0x0008
129 #define ASC_STA_FE			0x0010
130 #define ASC_STA_OE			0x0020
131 #define ASC_STA_TNE			0x0040
132 #define ASC_STA_TOI			0x0080
133 #define ASC_STA_RHF			0x0100
134 #define ASC_STA_TF			0x0200
135 #define ASC_STA_NKD			0x0400
136 
137 /* ASC_TIMEOUT */
138 
139 #define ASC_TIMEOUT_MSK			0x00FF
140 
141 /* ASC_TXBUF */
142 
143 #define ASC_TXBUF_MSK			0x01FF
144 
145 /*---- Inline function definitions ---------------------------*/
146 
147 static inline struct asc_port *to_asc_port(struct uart_port *port)
148 {
149 	return container_of(port, struct asc_port, port);
150 }
151 
152 static inline u32 asc_in(struct uart_port *port, u32 offset)
153 {
154 	return readl(port->membase + offset);
155 }
156 
157 static inline void asc_out(struct uart_port *port, u32 offset, u32 value)
158 {
159 	writel(value, port->membase + offset);
160 }
161 
162 /*
163  * Some simple utility functions to enable and disable interrupts.
164  * Note that these need to be called with interrupts disabled.
165  */
166 static inline void asc_disable_tx_interrupts(struct uart_port *port)
167 {
168 	u32 intenable = asc_in(port, ASC_INTEN) & ~ASC_INTEN_THE;
169 	asc_out(port, ASC_INTEN, intenable);
170 	(void)asc_in(port, ASC_INTEN);	/* Defeat bus write posting */
171 }
172 
173 static inline void asc_enable_tx_interrupts(struct uart_port *port)
174 {
175 	u32 intenable = asc_in(port, ASC_INTEN) | ASC_INTEN_THE;
176 	asc_out(port, ASC_INTEN, intenable);
177 }
178 
179 static inline void asc_disable_rx_interrupts(struct uart_port *port)
180 {
181 	u32 intenable = asc_in(port, ASC_INTEN) & ~ASC_INTEN_RBE;
182 	asc_out(port, ASC_INTEN, intenable);
183 	(void)asc_in(port, ASC_INTEN);	/* Defeat bus write posting */
184 }
185 
186 static inline void asc_enable_rx_interrupts(struct uart_port *port)
187 {
188 	u32 intenable = asc_in(port, ASC_INTEN) | ASC_INTEN_RBE;
189 	asc_out(port, ASC_INTEN, intenable);
190 }
191 
192 static inline u32 asc_txfifo_is_empty(struct uart_port *port)
193 {
194 	return asc_in(port, ASC_STA) & ASC_STA_TE;
195 }
196 
197 static inline u32 asc_txfifo_is_half_empty(struct uart_port *port)
198 {
199 	return asc_in(port, ASC_STA) & ASC_STA_THE;
200 }
201 
202 static inline const char *asc_port_name(struct uart_port *port)
203 {
204 	return to_platform_device(port->dev)->name;
205 }
206 
207 /*----------------------------------------------------------------------*/
208 
209 /*
210  * This section contains code to support the use of the ASC as a
211  * generic serial port.
212  */
213 
214 static inline unsigned asc_hw_txroom(struct uart_port *port)
215 {
216 	u32 status = asc_in(port, ASC_STA);
217 
218 	if (status & ASC_STA_THE)
219 		return port->fifosize / 2;
220 	else if (!(status & ASC_STA_TF))
221 		return 1;
222 
223 	return 0;
224 }
225 
226 /*
227  * Start transmitting chars.
228  * This is called from both interrupt and task level.
229  * Either way interrupts are disabled.
230  */
231 static void asc_transmit_chars(struct uart_port *port)
232 {
233 	struct circ_buf *xmit = &port->state->xmit;
234 	int txroom;
235 	unsigned char c;
236 
237 	txroom = asc_hw_txroom(port);
238 
239 	if ((txroom != 0) && port->x_char) {
240 		c = port->x_char;
241 		port->x_char = 0;
242 		asc_out(port, ASC_TXBUF, c);
243 		port->icount.tx++;
244 		txroom = asc_hw_txroom(port);
245 	}
246 
247 	if (uart_tx_stopped(port)) {
248 		/*
249 		 * We should try and stop the hardware here, but I
250 		 * don't think the ASC has any way to do that.
251 		 */
252 		asc_disable_tx_interrupts(port);
253 		return;
254 	}
255 
256 	if (uart_circ_empty(xmit)) {
257 		asc_disable_tx_interrupts(port);
258 		return;
259 	}
260 
261 	if (txroom == 0)
262 		return;
263 
264 	do {
265 		c = xmit->buf[xmit->tail];
266 		xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
267 		asc_out(port, ASC_TXBUF, c);
268 		port->icount.tx++;
269 		txroom--;
270 	} while ((txroom > 0) && (!uart_circ_empty(xmit)));
271 
272 	if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
273 		uart_write_wakeup(port);
274 
275 	if (uart_circ_empty(xmit))
276 		asc_disable_tx_interrupts(port);
277 }
278 
279 static void asc_receive_chars(struct uart_port *port)
280 {
281 	struct tty_port *tport = &port->state->port;
282 	unsigned long status;
283 	unsigned long c = 0;
284 	char flag;
285 
286 	if (port->irq_wake)
287 		pm_wakeup_event(tport->tty->dev, 0);
288 
289 	while ((status = asc_in(port, ASC_STA)) & ASC_STA_RBF) {
290 		c = asc_in(port, ASC_RXBUF) | ASC_RXBUF_DUMMY_RX;
291 		flag = TTY_NORMAL;
292 		port->icount.rx++;
293 
294 		if ((c & (ASC_RXBUF_FE | ASC_RXBUF_PE)) ||
295 			status & ASC_STA_OE) {
296 
297 			if (c & ASC_RXBUF_FE) {
298 				if (c == (ASC_RXBUF_FE | ASC_RXBUF_DUMMY_RX)) {
299 					port->icount.brk++;
300 					if (uart_handle_break(port))
301 						continue;
302 					c |= ASC_RXBUF_DUMMY_BE;
303 				} else {
304 					port->icount.frame++;
305 				}
306 			} else if (c & ASC_RXBUF_PE) {
307 				port->icount.parity++;
308 			}
309 			/*
310 			 * Reading any data from the RX FIFO clears the
311 			 * overflow error condition.
312 			 */
313 			if (status & ASC_STA_OE) {
314 				port->icount.overrun++;
315 				c |= ASC_RXBUF_DUMMY_OE;
316 			}
317 
318 			c &= port->read_status_mask;
319 
320 			if (c & ASC_RXBUF_DUMMY_BE)
321 				flag = TTY_BREAK;
322 			else if (c & ASC_RXBUF_PE)
323 				flag = TTY_PARITY;
324 			else if (c & ASC_RXBUF_FE)
325 				flag = TTY_FRAME;
326 		}
327 
328 		if (uart_handle_sysrq_char(port, c & 0xff))
329 			continue;
330 
331 		uart_insert_char(port, c, ASC_RXBUF_DUMMY_OE, c & 0xff, flag);
332 	}
333 
334 	/* Tell the rest of the system the news. New characters! */
335 	tty_flip_buffer_push(tport);
336 }
337 
338 static irqreturn_t asc_interrupt(int irq, void *ptr)
339 {
340 	struct uart_port *port = ptr;
341 	u32 status;
342 
343 	spin_lock(&port->lock);
344 
345 	status = asc_in(port, ASC_STA);
346 
347 	if (status & ASC_STA_RBF) {
348 		/* Receive FIFO not empty */
349 		asc_receive_chars(port);
350 	}
351 
352 	if ((status & ASC_STA_THE) &&
353 	    (asc_in(port, ASC_INTEN) & ASC_INTEN_THE)) {
354 		/* Transmitter FIFO at least half empty */
355 		asc_transmit_chars(port);
356 	}
357 
358 	spin_unlock(&port->lock);
359 
360 	return IRQ_HANDLED;
361 }
362 
363 /*----------------------------------------------------------------------*/
364 
365 /*
366  * UART Functions
367  */
368 
369 static unsigned int asc_tx_empty(struct uart_port *port)
370 {
371 	return asc_txfifo_is_empty(port) ? TIOCSER_TEMT : 0;
372 }
373 
374 static void asc_set_mctrl(struct uart_port *port, unsigned int mctrl)
375 {
376 	/*
377 	 * This routine is used for seting signals of: DTR, DCD, CTS/RTS
378 	 * We use ASC's hardware for CTS/RTS, so don't need any for that.
379 	 * Some boards have DTR and DCD implemented using PIO pins,
380 	 * code to do this should be hooked in here.
381 	 */
382 }
383 
384 static unsigned int asc_get_mctrl(struct uart_port *port)
385 {
386 	/*
387 	 * This routine is used for geting signals of: DTR, DCD, DSR, RI,
388 	 * and CTS/RTS
389 	 */
390 	return TIOCM_CAR | TIOCM_DSR | TIOCM_CTS;
391 }
392 
393 /* There are probably characters waiting to be transmitted. */
394 static void asc_start_tx(struct uart_port *port)
395 {
396 	struct circ_buf *xmit = &port->state->xmit;
397 
398 	if (!uart_circ_empty(xmit))
399 		asc_enable_tx_interrupts(port);
400 }
401 
402 /* Transmit stop */
403 static void asc_stop_tx(struct uart_port *port)
404 {
405 	asc_disable_tx_interrupts(port);
406 }
407 
408 /* Receive stop */
409 static void asc_stop_rx(struct uart_port *port)
410 {
411 	asc_disable_rx_interrupts(port);
412 }
413 
414 /* Handle breaks - ignored by us */
415 static void asc_break_ctl(struct uart_port *port, int break_state)
416 {
417 	/* Nothing here yet .. */
418 }
419 
420 /*
421  * Enable port for reception.
422  */
423 static int asc_startup(struct uart_port *port)
424 {
425 	if (request_irq(port->irq, asc_interrupt, IRQF_NO_SUSPEND,
426 			asc_port_name(port), port)) {
427 		dev_err(port->dev, "cannot allocate irq.\n");
428 		return -ENODEV;
429 	}
430 
431 	asc_transmit_chars(port);
432 	asc_enable_rx_interrupts(port);
433 
434 	return 0;
435 }
436 
437 static void asc_shutdown(struct uart_port *port)
438 {
439 	asc_disable_tx_interrupts(port);
440 	asc_disable_rx_interrupts(port);
441 	free_irq(port->irq, port);
442 }
443 
444 static void asc_pm(struct uart_port *port, unsigned int state,
445 		unsigned int oldstate)
446 {
447 	struct asc_port *ascport = to_asc_port(port);
448 	unsigned long flags = 0;
449 	u32 ctl;
450 
451 	switch (state) {
452 	case UART_PM_STATE_ON:
453 		clk_prepare_enable(ascport->clk);
454 		break;
455 	case UART_PM_STATE_OFF:
456 		/*
457 		 * Disable the ASC baud rate generator, which is as close as
458 		 * we can come to turning it off. Note this is not called with
459 		 * the port spinlock held.
460 		 */
461 		spin_lock_irqsave(&port->lock, flags);
462 		ctl = asc_in(port, ASC_CTL) & ~ASC_CTL_RUN;
463 		asc_out(port, ASC_CTL, ctl);
464 		spin_unlock_irqrestore(&port->lock, flags);
465 		clk_disable_unprepare(ascport->clk);
466 		break;
467 	}
468 }
469 
470 static void asc_set_termios(struct uart_port *port, struct ktermios *termios,
471 			    struct ktermios *old)
472 {
473 	struct asc_port *ascport = to_asc_port(port);
474 	unsigned int baud;
475 	u32 ctrl_val;
476 	tcflag_t cflag;
477 	unsigned long flags;
478 
479 	/* Update termios to reflect hardware capabilities */
480 	termios->c_cflag &= ~(CMSPAR |
481 			 (ascport->hw_flow_control ? 0 : CRTSCTS));
482 
483 	port->uartclk = clk_get_rate(ascport->clk);
484 
485 	baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/16);
486 	cflag = termios->c_cflag;
487 
488 	spin_lock_irqsave(&port->lock, flags);
489 
490 	/* read control register */
491 	ctrl_val = asc_in(port, ASC_CTL);
492 
493 	/* stop serial port and reset value */
494 	asc_out(port, ASC_CTL, (ctrl_val & ~ASC_CTL_RUN));
495 	ctrl_val = ASC_CTL_RXENABLE | ASC_CTL_FIFOENABLE;
496 
497 	/* reset fifo rx & tx */
498 	asc_out(port, ASC_TXRESET, 1);
499 	asc_out(port, ASC_RXRESET, 1);
500 
501 	/* set character length */
502 	if ((cflag & CSIZE) == CS7) {
503 		ctrl_val |= ASC_CTL_MODE_7BIT_PAR;
504 	} else {
505 		ctrl_val |= (cflag & PARENB) ?  ASC_CTL_MODE_8BIT_PAR :
506 						ASC_CTL_MODE_8BIT;
507 	}
508 
509 	/* set stop bit */
510 	ctrl_val |= (cflag & CSTOPB) ? ASC_CTL_STOP_2BIT : ASC_CTL_STOP_1BIT;
511 
512 	/* odd parity */
513 	if (cflag & PARODD)
514 		ctrl_val |= ASC_CTL_PARITYODD;
515 
516 	/* hardware flow control */
517 	if ((cflag & CRTSCTS))
518 		ctrl_val |= ASC_CTL_CTSENABLE;
519 
520 	if ((baud < 19200) && !ascport->force_m1) {
521 		asc_out(port, ASC_BAUDRATE, (port->uartclk / (16 * baud)));
522 	} else {
523 		/*
524 		 * MODE 1: recommended for high bit rates (above 19.2K)
525 		 *
526 		 *                   baudrate * 16 * 2^16
527 		 * ASCBaudRate =   ------------------------
528 		 *                          inputclock
529 		 *
530 		 * To keep maths inside 64bits, we divide inputclock by 16.
531 		 */
532 		u64 dividend = (u64)baud * (1 << 16);
533 
534 		do_div(dividend, port->uartclk / 16);
535 		asc_out(port, ASC_BAUDRATE, dividend);
536 		ctrl_val |= ASC_CTL_BAUDMODE;
537 	}
538 
539 	uart_update_timeout(port, cflag, baud);
540 
541 	ascport->port.read_status_mask = ASC_RXBUF_DUMMY_OE;
542 	if (termios->c_iflag & INPCK)
543 		ascport->port.read_status_mask |= ASC_RXBUF_FE | ASC_RXBUF_PE;
544 	if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK))
545 		ascport->port.read_status_mask |= ASC_RXBUF_DUMMY_BE;
546 
547 	/*
548 	 * Characters to ignore
549 	 */
550 	ascport->port.ignore_status_mask = 0;
551 	if (termios->c_iflag & IGNPAR)
552 		ascport->port.ignore_status_mask |= ASC_RXBUF_FE | ASC_RXBUF_PE;
553 	if (termios->c_iflag & IGNBRK) {
554 		ascport->port.ignore_status_mask |= ASC_RXBUF_DUMMY_BE;
555 		/*
556 		 * If we're ignoring parity and break indicators,
557 		 * ignore overruns too (for real raw support).
558 		 */
559 		if (termios->c_iflag & IGNPAR)
560 			ascport->port.ignore_status_mask |= ASC_RXBUF_DUMMY_OE;
561 	}
562 
563 	/*
564 	 * Ignore all characters if CREAD is not set.
565 	 */
566 	if (!(termios->c_cflag & CREAD))
567 		ascport->port.ignore_status_mask |= ASC_RXBUF_DUMMY_RX;
568 
569 	/* Set the timeout */
570 	asc_out(port, ASC_TIMEOUT, 20);
571 
572 	/* write final value and enable port */
573 	asc_out(port, ASC_CTL, (ctrl_val | ASC_CTL_RUN));
574 
575 	spin_unlock_irqrestore(&port->lock, flags);
576 }
577 
578 static const char *asc_type(struct uart_port *port)
579 {
580 	return (port->type == PORT_ASC) ? DRIVER_NAME : NULL;
581 }
582 
583 static void asc_release_port(struct uart_port *port)
584 {
585 }
586 
587 static int asc_request_port(struct uart_port *port)
588 {
589 	return 0;
590 }
591 
592 /*
593  * Called when the port is opened, and UPF_BOOT_AUTOCONF flag is set
594  * Set type field if successful
595  */
596 static void asc_config_port(struct uart_port *port, int flags)
597 {
598 	if ((flags & UART_CONFIG_TYPE))
599 		port->type = PORT_ASC;
600 }
601 
602 static int
603 asc_verify_port(struct uart_port *port, struct serial_struct *ser)
604 {
605 	/* No user changeable parameters */
606 	return -EINVAL;
607 }
608 
609 #ifdef CONFIG_CONSOLE_POLL
610 /*
611  * Console polling routines for writing and reading from the uart while
612  * in an interrupt or debug context (i.e. kgdb).
613  */
614 
615 static int asc_get_poll_char(struct uart_port *port)
616 {
617 	if (!(asc_in(port, ASC_STA) & ASC_STA_RBF))
618 		return NO_POLL_CHAR;
619 
620 	return asc_in(port, ASC_RXBUF);
621 }
622 
623 static void asc_put_poll_char(struct uart_port *port, unsigned char c)
624 {
625 	while (!asc_txfifo_is_half_empty(port))
626 		cpu_relax();
627 	asc_out(port, ASC_TXBUF, c);
628 }
629 
630 #endif /* CONFIG_CONSOLE_POLL */
631 
632 /*---------------------------------------------------------------------*/
633 
634 static struct uart_ops asc_uart_ops = {
635 	.tx_empty	= asc_tx_empty,
636 	.set_mctrl	= asc_set_mctrl,
637 	.get_mctrl	= asc_get_mctrl,
638 	.start_tx	= asc_start_tx,
639 	.stop_tx	= asc_stop_tx,
640 	.stop_rx	= asc_stop_rx,
641 	.break_ctl	= asc_break_ctl,
642 	.startup	= asc_startup,
643 	.shutdown	= asc_shutdown,
644 	.set_termios	= asc_set_termios,
645 	.type		= asc_type,
646 	.release_port	= asc_release_port,
647 	.request_port	= asc_request_port,
648 	.config_port	= asc_config_port,
649 	.verify_port	= asc_verify_port,
650 	.pm		= asc_pm,
651 #ifdef CONFIG_CONSOLE_POLL
652 	.poll_get_char = asc_get_poll_char,
653 	.poll_put_char = asc_put_poll_char,
654 #endif /* CONFIG_CONSOLE_POLL */
655 };
656 
657 static int asc_init_port(struct asc_port *ascport,
658 			  struct platform_device *pdev)
659 {
660 	struct uart_port *port = &ascport->port;
661 	struct resource *res;
662 
663 	port->iotype	= UPIO_MEM;
664 	port->flags	= UPF_BOOT_AUTOCONF;
665 	port->ops	= &asc_uart_ops;
666 	port->fifosize	= ASC_FIFO_SIZE;
667 	port->dev	= &pdev->dev;
668 	port->irq	= platform_get_irq(pdev, 0);
669 
670 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
671 	port->membase = devm_ioremap_resource(&pdev->dev, res);
672 	if (IS_ERR(port->membase))
673 		return PTR_ERR(port->membase);
674 	port->mapbase = res->start;
675 
676 	spin_lock_init(&port->lock);
677 
678 	ascport->clk = devm_clk_get(&pdev->dev, NULL);
679 
680 	if (WARN_ON(IS_ERR(ascport->clk)))
681 		return -EINVAL;
682 	/* ensure that clk rate is correct by enabling the clk */
683 	clk_prepare_enable(ascport->clk);
684 	ascport->port.uartclk = clk_get_rate(ascport->clk);
685 	WARN_ON(ascport->port.uartclk == 0);
686 	clk_disable_unprepare(ascport->clk);
687 
688 	return 0;
689 }
690 
691 static struct asc_port *asc_of_get_asc_port(struct platform_device *pdev)
692 {
693 	struct device_node *np = pdev->dev.of_node;
694 	int id;
695 
696 	if (!np)
697 		return NULL;
698 
699 	id = of_alias_get_id(np, ASC_SERIAL_NAME);
700 
701 	if (id < 0)
702 		id = 0;
703 
704 	if (WARN_ON(id >= ASC_MAX_PORTS))
705 		return NULL;
706 
707 	asc_ports[id].hw_flow_control = of_property_read_bool(np,
708 							"st,hw-flow-control");
709 	asc_ports[id].force_m1 =  of_property_read_bool(np, "st,force_m1");
710 	asc_ports[id].port.line = id;
711 	return &asc_ports[id];
712 }
713 
714 #ifdef CONFIG_OF
715 static struct of_device_id asc_match[] = {
716 	{ .compatible = "st,asc", },
717 	{},
718 };
719 
720 MODULE_DEVICE_TABLE(of, asc_match);
721 #endif
722 
723 static int asc_serial_probe(struct platform_device *pdev)
724 {
725 	int ret;
726 	struct asc_port *ascport;
727 
728 	ascport = asc_of_get_asc_port(pdev);
729 	if (!ascport)
730 		return -ENODEV;
731 
732 	ret = asc_init_port(ascport, pdev);
733 	if (ret)
734 		return ret;
735 
736 	ret = uart_add_one_port(&asc_uart_driver, &ascport->port);
737 	if (ret)
738 		return ret;
739 
740 	platform_set_drvdata(pdev, &ascport->port);
741 
742 	return 0;
743 }
744 
745 static int asc_serial_remove(struct platform_device *pdev)
746 {
747 	struct uart_port *port = platform_get_drvdata(pdev);
748 
749 	return uart_remove_one_port(&asc_uart_driver, port);
750 }
751 
752 #ifdef CONFIG_PM_SLEEP
753 static int asc_serial_suspend(struct device *dev)
754 {
755 	struct platform_device *pdev = to_platform_device(dev);
756 	struct uart_port *port = platform_get_drvdata(pdev);
757 
758 	return uart_suspend_port(&asc_uart_driver, port);
759 }
760 
761 static int asc_serial_resume(struct device *dev)
762 {
763 	struct platform_device *pdev = to_platform_device(dev);
764 	struct uart_port *port = platform_get_drvdata(pdev);
765 
766 	return uart_resume_port(&asc_uart_driver, port);
767 }
768 
769 #endif /* CONFIG_PM_SLEEP */
770 
771 /*----------------------------------------------------------------------*/
772 
773 #ifdef CONFIG_SERIAL_ST_ASC_CONSOLE
774 static void asc_console_putchar(struct uart_port *port, int ch)
775 {
776 	unsigned int timeout = 1000000;
777 
778 	/* Wait for upto 1 second in case flow control is stopping us. */
779 	while (--timeout && !asc_txfifo_is_half_empty(port))
780 		udelay(1);
781 
782 	asc_out(port, ASC_TXBUF, ch);
783 }
784 
785 /*
786  *  Print a string to the serial port trying not to disturb
787  *  any possible real use of the port...
788  */
789 
790 static void asc_console_write(struct console *co, const char *s, unsigned count)
791 {
792 	struct uart_port *port = &asc_ports[co->index].port;
793 	unsigned long flags;
794 	unsigned long timeout = 1000000;
795 	int locked = 1;
796 	u32 intenable;
797 
798 	local_irq_save(flags);
799 	if (port->sysrq)
800 		locked = 0; /* asc_interrupt has already claimed the lock */
801 	else if (oops_in_progress)
802 		locked = spin_trylock(&port->lock);
803 	else
804 		spin_lock(&port->lock);
805 
806 	/*
807 	 * Disable interrupts so we don't get the IRQ line bouncing
808 	 * up and down while interrupts are disabled.
809 	 */
810 	intenable = asc_in(port, ASC_INTEN);
811 	asc_out(port, ASC_INTEN, 0);
812 	(void)asc_in(port, ASC_INTEN);	/* Defeat bus write posting */
813 
814 	uart_console_write(port, s, count, asc_console_putchar);
815 
816 	while (--timeout && !asc_txfifo_is_empty(port))
817 		udelay(1);
818 
819 	asc_out(port, ASC_INTEN, intenable);
820 
821 	if (locked)
822 		spin_unlock(&port->lock);
823 	local_irq_restore(flags);
824 }
825 
826 static int asc_console_setup(struct console *co, char *options)
827 {
828 	struct asc_port *ascport;
829 	int baud = 9600;
830 	int bits = 8;
831 	int parity = 'n';
832 	int flow = 'n';
833 
834 	if (co->index >= ASC_MAX_PORTS)
835 		return -ENODEV;
836 
837 	ascport = &asc_ports[co->index];
838 
839 	/*
840 	 * This driver does not support early console initialization
841 	 * (use ARM early printk support instead), so we only expect
842 	 * this to be called during the uart port registration when the
843 	 * driver gets probed and the port should be mapped at that point.
844 	 */
845 	if (ascport->port.mapbase == 0 || ascport->port.membase == NULL)
846 		return -ENXIO;
847 
848 	if (options)
849 		uart_parse_options(options, &baud, &parity, &bits, &flow);
850 
851 	return uart_set_options(&ascport->port, co, baud, parity, bits, flow);
852 }
853 
854 static struct console asc_console = {
855 	.name		= ASC_SERIAL_NAME,
856 	.device		= uart_console_device,
857 	.write		= asc_console_write,
858 	.setup		= asc_console_setup,
859 	.flags		= CON_PRINTBUFFER,
860 	.index		= -1,
861 	.data		= &asc_uart_driver,
862 };
863 
864 #define ASC_SERIAL_CONSOLE (&asc_console)
865 
866 #else
867 #define ASC_SERIAL_CONSOLE NULL
868 #endif /* CONFIG_SERIAL_ST_ASC_CONSOLE */
869 
870 static struct uart_driver asc_uart_driver = {
871 	.owner		= THIS_MODULE,
872 	.driver_name	= DRIVER_NAME,
873 	.dev_name	= ASC_SERIAL_NAME,
874 	.major		= 0,
875 	.minor		= 0,
876 	.nr		= ASC_MAX_PORTS,
877 	.cons		= ASC_SERIAL_CONSOLE,
878 };
879 
880 static const struct dev_pm_ops asc_serial_pm_ops = {
881 	SET_SYSTEM_SLEEP_PM_OPS(asc_serial_suspend, asc_serial_resume)
882 };
883 
884 static struct platform_driver asc_serial_driver = {
885 	.probe		= asc_serial_probe,
886 	.remove		= asc_serial_remove,
887 	.driver	= {
888 		.name	= DRIVER_NAME,
889 		.pm	= &asc_serial_pm_ops,
890 		.owner	= THIS_MODULE,
891 		.of_match_table = of_match_ptr(asc_match),
892 	},
893 };
894 
895 static int __init asc_init(void)
896 {
897 	int ret;
898 	static char banner[] __initdata =
899 		KERN_INFO "STMicroelectronics ASC driver initialized\n";
900 
901 	printk(banner);
902 
903 	ret = uart_register_driver(&asc_uart_driver);
904 	if (ret)
905 		return ret;
906 
907 	ret = platform_driver_register(&asc_serial_driver);
908 	if (ret)
909 		uart_unregister_driver(&asc_uart_driver);
910 
911 	return ret;
912 }
913 
914 static void __exit asc_exit(void)
915 {
916 	platform_driver_unregister(&asc_serial_driver);
917 	uart_unregister_driver(&asc_uart_driver);
918 }
919 
920 module_init(asc_init);
921 module_exit(asc_exit);
922 
923 MODULE_ALIAS("platform:" DRIVER_NAME);
924 MODULE_AUTHOR("STMicroelectronics (R&D) Limited");
925 MODULE_DESCRIPTION("STMicroelectronics ASC serial port driver");
926 MODULE_LICENSE("GPL");
927