1 // SPDX-License-Identifier: GPL-2.0+
3 * st-asc.c: ST Asynchronous serial controller (ASC) driver
5 * Copyright (C) 2003-2013 STMicroelectronics (R&D) Limited
8 #include <linux/module.h>
9 #include <linux/serial.h>
10 #include <linux/console.h>
11 #include <linux/sysrq.h>
12 #include <linux/pinctrl/consumer.h>
13 #include <linux/platform_device.h>
15 #include <linux/irq.h>
16 #include <linux/tty.h>
17 #include <linux/tty_flip.h>
18 #include <linux/delay.h>
19 #include <linux/spinlock.h>
21 #include <linux/of_platform.h>
22 #include <linux/serial_core.h>
23 #include <linux/clk.h>
24 #include <linux/gpio/consumer.h>
26 #define DRIVER_NAME "st-asc"
27 #define ASC_SERIAL_NAME "ttyAS"
28 #define ASC_FIFO_SIZE 16
29 #define ASC_MAX_PORTS 8
33 #define NO_HW_FLOWCTRL 1
36 struct uart_port port
;
37 struct gpio_desc
*rts
;
39 struct pinctrl
*pinctrl
;
40 struct pinctrl_state
*states
[2];
41 unsigned int hw_flow_control
:1;
42 unsigned int force_m1
:1;
45 static struct asc_port asc_ports
[ASC_MAX_PORTS
];
46 static struct uart_driver asc_uart_driver
;
48 /*---- UART Register definitions ------------------------------*/
50 /* Register offsets */
52 #define ASC_BAUDRATE 0x00
53 #define ASC_TXBUF 0x04
54 #define ASC_RXBUF 0x08
56 #define ASC_INTEN 0x10
58 #define ASC_GUARDTIME 0x18
59 #define ASC_TIMEOUT 0x1C
60 #define ASC_TXRESET 0x20
61 #define ASC_RXRESET 0x24
62 #define ASC_RETRIES 0x28
65 #define ASC_RXBUF_PE 0x100
66 #define ASC_RXBUF_FE 0x200
68 * Some of status comes from higher bits of the character and some come from
69 * the status register. Combining both of them in to single status using dummy
72 #define ASC_RXBUF_DUMMY_RX 0x10000
73 #define ASC_RXBUF_DUMMY_BE 0x20000
74 #define ASC_RXBUF_DUMMY_OE 0x40000
78 #define ASC_CTL_MODE_MSK 0x0007
79 #define ASC_CTL_MODE_8BIT 0x0001
80 #define ASC_CTL_MODE_7BIT_PAR 0x0003
81 #define ASC_CTL_MODE_9BIT 0x0004
82 #define ASC_CTL_MODE_8BIT_WKUP 0x0005
83 #define ASC_CTL_MODE_8BIT_PAR 0x0007
84 #define ASC_CTL_STOP_MSK 0x0018
85 #define ASC_CTL_STOP_HALFBIT 0x0000
86 #define ASC_CTL_STOP_1BIT 0x0008
87 #define ASC_CTL_STOP_1_HALFBIT 0x0010
88 #define ASC_CTL_STOP_2BIT 0x0018
89 #define ASC_CTL_PARITYODD 0x0020
90 #define ASC_CTL_LOOPBACK 0x0040
91 #define ASC_CTL_RUN 0x0080
92 #define ASC_CTL_RXENABLE 0x0100
93 #define ASC_CTL_SCENABLE 0x0200
94 #define ASC_CTL_FIFOENABLE 0x0400
95 #define ASC_CTL_CTSENABLE 0x0800
96 #define ASC_CTL_BAUDMODE 0x1000
100 #define ASC_GUARDTIME_MSK 0x00FF
104 #define ASC_INTEN_RBE 0x0001
105 #define ASC_INTEN_TE 0x0002
106 #define ASC_INTEN_THE 0x0004
107 #define ASC_INTEN_PE 0x0008
108 #define ASC_INTEN_FE 0x0010
109 #define ASC_INTEN_OE 0x0020
110 #define ASC_INTEN_TNE 0x0040
111 #define ASC_INTEN_TOI 0x0080
112 #define ASC_INTEN_RHF 0x0100
116 #define ASC_RETRIES_MSK 0x00FF
120 #define ASC_RXBUF_MSK 0x03FF
124 #define ASC_STA_RBF 0x0001
125 #define ASC_STA_TE 0x0002
126 #define ASC_STA_THE 0x0004
127 #define ASC_STA_PE 0x0008
128 #define ASC_STA_FE 0x0010
129 #define ASC_STA_OE 0x0020
130 #define ASC_STA_TNE 0x0040
131 #define ASC_STA_TOI 0x0080
132 #define ASC_STA_RHF 0x0100
133 #define ASC_STA_TF 0x0200
134 #define ASC_STA_NKD 0x0400
138 #define ASC_TIMEOUT_MSK 0x00FF
142 #define ASC_TXBUF_MSK 0x01FF
144 /*---- Inline function definitions ---------------------------*/
146 static inline struct asc_port
*to_asc_port(struct uart_port
*port
)
148 return container_of(port
, struct asc_port
, port
);
151 static inline u32
asc_in(struct uart_port
*port
, u32 offset
)
154 return readl_relaxed(port
->membase
+ offset
);
156 return readl(port
->membase
+ offset
);
160 static inline void asc_out(struct uart_port
*port
, u32 offset
, u32 value
)
162 #ifdef writel_relaxed
163 writel_relaxed(value
, port
->membase
+ offset
);
165 writel(value
, port
->membase
+ offset
);
170 * Some simple utility functions to enable and disable interrupts.
171 * Note that these need to be called with interrupts disabled.
173 static inline void asc_disable_tx_interrupts(struct uart_port
*port
)
175 u32 intenable
= asc_in(port
, ASC_INTEN
) & ~ASC_INTEN_THE
;
176 asc_out(port
, ASC_INTEN
, intenable
);
177 (void)asc_in(port
, ASC_INTEN
); /* Defeat bus write posting */
180 static inline void asc_enable_tx_interrupts(struct uart_port
*port
)
182 u32 intenable
= asc_in(port
, ASC_INTEN
) | ASC_INTEN_THE
;
183 asc_out(port
, ASC_INTEN
, intenable
);
186 static inline void asc_disable_rx_interrupts(struct uart_port
*port
)
188 u32 intenable
= asc_in(port
, ASC_INTEN
) & ~ASC_INTEN_RBE
;
189 asc_out(port
, ASC_INTEN
, intenable
);
190 (void)asc_in(port
, ASC_INTEN
); /* Defeat bus write posting */
193 static inline void asc_enable_rx_interrupts(struct uart_port
*port
)
195 u32 intenable
= asc_in(port
, ASC_INTEN
) | ASC_INTEN_RBE
;
196 asc_out(port
, ASC_INTEN
, intenable
);
199 static inline u32
asc_txfifo_is_empty(struct uart_port
*port
)
201 return asc_in(port
, ASC_STA
) & ASC_STA_TE
;
204 static inline u32
asc_txfifo_is_half_empty(struct uart_port
*port
)
206 return asc_in(port
, ASC_STA
) & ASC_STA_THE
;
209 static inline const char *asc_port_name(struct uart_port
*port
)
211 return to_platform_device(port
->dev
)->name
;
214 /*----------------------------------------------------------------------*/
217 * This section contains code to support the use of the ASC as a
218 * generic serial port.
221 static inline unsigned asc_hw_txroom(struct uart_port
*port
)
223 u32 status
= asc_in(port
, ASC_STA
);
225 if (status
& ASC_STA_THE
)
226 return port
->fifosize
/ 2;
227 else if (!(status
& ASC_STA_TF
))
234 * Start transmitting chars.
235 * This is called from both interrupt and task level.
236 * Either way interrupts are disabled.
238 static void asc_transmit_chars(struct uart_port
*port
)
242 uart_port_tx_limited(port
, ch
, asc_hw_txroom(port
),
244 asc_out(port
, ASC_TXBUF
, ch
),
248 static void asc_receive_chars(struct uart_port
*port
)
250 struct tty_port
*tport
= &port
->state
->port
;
251 unsigned long status
, mode
;
254 bool ignore_pe
= false;
257 * Datasheet states: If the MODE field selects an 8-bit frame then
258 * this [parity error] bit is undefined. Software should ignore this
259 * bit when reading 8-bit frames.
261 mode
= asc_in(port
, ASC_CTL
) & ASC_CTL_MODE_MSK
;
262 if (mode
== ASC_CTL_MODE_8BIT
|| mode
== ASC_CTL_MODE_8BIT_PAR
)
265 if (irqd_is_wakeup_set(irq_get_irq_data(port
->irq
)))
266 pm_wakeup_event(tport
->tty
->dev
, 0);
268 while ((status
= asc_in(port
, ASC_STA
)) & ASC_STA_RBF
) {
269 c
= asc_in(port
, ASC_RXBUF
) | ASC_RXBUF_DUMMY_RX
;
273 if (status
& ASC_STA_OE
|| c
& ASC_RXBUF_FE
||
274 (c
& ASC_RXBUF_PE
&& !ignore_pe
)) {
276 if (c
& ASC_RXBUF_FE
) {
277 if (c
== (ASC_RXBUF_FE
| ASC_RXBUF_DUMMY_RX
)) {
279 if (uart_handle_break(port
))
281 c
|= ASC_RXBUF_DUMMY_BE
;
283 port
->icount
.frame
++;
285 } else if (c
& ASC_RXBUF_PE
) {
286 port
->icount
.parity
++;
289 * Reading any data from the RX FIFO clears the
290 * overflow error condition.
292 if (status
& ASC_STA_OE
) {
293 port
->icount
.overrun
++;
294 c
|= ASC_RXBUF_DUMMY_OE
;
297 c
&= port
->read_status_mask
;
299 if (c
& ASC_RXBUF_DUMMY_BE
)
301 else if (c
& ASC_RXBUF_PE
)
303 else if (c
& ASC_RXBUF_FE
)
307 if (uart_handle_sysrq_char(port
, c
& 0xff))
310 uart_insert_char(port
, c
, ASC_RXBUF_DUMMY_OE
, c
& 0xff, flag
);
313 /* Tell the rest of the system the news. New characters! */
314 tty_flip_buffer_push(tport
);
317 static irqreturn_t
asc_interrupt(int irq
, void *ptr
)
319 struct uart_port
*port
= ptr
;
322 uart_port_lock(port
);
324 status
= asc_in(port
, ASC_STA
);
326 if (status
& ASC_STA_RBF
) {
327 /* Receive FIFO not empty */
328 asc_receive_chars(port
);
331 if ((status
& ASC_STA_THE
) &&
332 (asc_in(port
, ASC_INTEN
) & ASC_INTEN_THE
)) {
333 /* Transmitter FIFO at least half empty */
334 asc_transmit_chars(port
);
337 uart_port_unlock(port
);
342 /*----------------------------------------------------------------------*/
348 static unsigned int asc_tx_empty(struct uart_port
*port
)
350 return asc_txfifo_is_empty(port
) ? TIOCSER_TEMT
: 0;
353 static void asc_set_mctrl(struct uart_port
*port
, unsigned int mctrl
)
355 struct asc_port
*ascport
= to_asc_port(port
);
358 * This routine is used for seting signals of: DTR, DCD, CTS and RTS.
359 * We use ASC's hardware for CTS/RTS when hardware flow-control is
360 * enabled, however if the RTS line is required for another purpose,
361 * commonly controlled using HUP from userspace, then we need to toggle
362 * it manually, using GPIO.
364 * Some boards also have DTR and DCD implemented using PIO pins, code to
365 * do this should be hooked in here.
371 /* If HW flow-control is enabled, we can't fiddle with the RTS line */
372 if (asc_in(port
, ASC_CTL
) & ASC_CTL_CTSENABLE
)
375 gpiod_set_value(ascport
->rts
, mctrl
& TIOCM_RTS
);
378 static unsigned int asc_get_mctrl(struct uart_port
*port
)
381 * This routine is used for geting signals of: DTR, DCD, DSR, RI,
384 return TIOCM_CAR
| TIOCM_DSR
| TIOCM_CTS
;
387 /* There are probably characters waiting to be transmitted. */
388 static void asc_start_tx(struct uart_port
*port
)
390 struct tty_port
*tport
= &port
->state
->port
;
392 if (!kfifo_is_empty(&tport
->xmit_fifo
))
393 asc_enable_tx_interrupts(port
);
397 static void asc_stop_tx(struct uart_port
*port
)
399 asc_disable_tx_interrupts(port
);
403 static void asc_stop_rx(struct uart_port
*port
)
405 asc_disable_rx_interrupts(port
);
408 /* Handle breaks - ignored by us */
409 static void asc_break_ctl(struct uart_port
*port
, int break_state
)
411 /* Nothing here yet .. */
415 * Enable port for reception.
417 static int asc_startup(struct uart_port
*port
)
419 if (request_irq(port
->irq
, asc_interrupt
, 0,
420 asc_port_name(port
), port
)) {
421 dev_err(port
->dev
, "cannot allocate irq.\n");
425 asc_transmit_chars(port
);
426 asc_enable_rx_interrupts(port
);
431 static void asc_shutdown(struct uart_port
*port
)
433 asc_disable_tx_interrupts(port
);
434 asc_disable_rx_interrupts(port
);
435 free_irq(port
->irq
, port
);
438 static void asc_pm(struct uart_port
*port
, unsigned int state
,
439 unsigned int oldstate
)
441 struct asc_port
*ascport
= to_asc_port(port
);
446 case UART_PM_STATE_ON
:
447 clk_prepare_enable(ascport
->clk
);
449 case UART_PM_STATE_OFF
:
451 * Disable the ASC baud rate generator, which is as close as
452 * we can come to turning it off. Note this is not called with
453 * the port spinlock held.
455 uart_port_lock_irqsave(port
, &flags
);
456 ctl
= asc_in(port
, ASC_CTL
) & ~ASC_CTL_RUN
;
457 asc_out(port
, ASC_CTL
, ctl
);
458 uart_port_unlock_irqrestore(port
, flags
);
459 clk_disable_unprepare(ascport
->clk
);
464 static void asc_set_termios(struct uart_port
*port
, struct ktermios
*termios
,
465 const struct ktermios
*old
)
467 struct asc_port
*ascport
= to_asc_port(port
);
468 bool manual_rts
, toggle_rts
= false;
469 struct gpio_desc
*gpiod
;
475 /* Update termios to reflect hardware capabilities */
476 termios
->c_cflag
&= ~(CMSPAR
|
477 (ascport
->hw_flow_control
? 0 : CRTSCTS
));
479 port
->uartclk
= clk_get_rate(ascport
->clk
);
481 baud
= uart_get_baud_rate(port
, termios
, old
, 0, port
->uartclk
/16);
482 cflag
= termios
->c_cflag
;
484 uart_port_lock_irqsave(port
, &flags
);
486 /* read control register */
487 ctrl_val
= asc_in(port
, ASC_CTL
);
489 /* stop serial port and reset value */
490 asc_out(port
, ASC_CTL
, (ctrl_val
& ~ASC_CTL_RUN
));
491 ctrl_val
= ASC_CTL_RXENABLE
| ASC_CTL_FIFOENABLE
;
493 /* reset fifo rx & tx */
494 asc_out(port
, ASC_TXRESET
, 1);
495 asc_out(port
, ASC_RXRESET
, 1);
497 /* set character length */
498 if ((cflag
& CSIZE
) == CS7
) {
499 ctrl_val
|= ASC_CTL_MODE_7BIT_PAR
;
502 ctrl_val
|= (cflag
& PARENB
) ? ASC_CTL_MODE_8BIT_PAR
:
507 termios
->c_cflag
= cflag
;
510 ctrl_val
|= (cflag
& CSTOPB
) ? ASC_CTL_STOP_2BIT
: ASC_CTL_STOP_1BIT
;
514 ctrl_val
|= ASC_CTL_PARITYODD
;
516 /* hardware flow control */
517 if ((cflag
& CRTSCTS
)) {
518 ctrl_val
|= ASC_CTL_CTSENABLE
;
520 /* If flow-control selected, stop handling RTS manually */
526 /* If flow-control disabled, it's safe to handle RTS manually */
527 if (!ascport
->rts
&& ascport
->states
[NO_HW_FLOWCTRL
])
528 manual_rts
= toggle_rts
= true;
531 if ((baud
< 19200) && !ascport
->force_m1
) {
532 asc_out(port
, ASC_BAUDRATE
, (port
->uartclk
/ (16 * baud
)));
535 * MODE 1: recommended for high bit rates (above 19.2K)
537 * baudrate * 16 * 2^16
538 * ASCBaudRate = ------------------------
541 * To keep maths inside 64bits, we divide inputclock by 16.
543 u64 dividend
= (u64
)baud
* (1 << 16);
545 do_div(dividend
, port
->uartclk
/ 16);
546 asc_out(port
, ASC_BAUDRATE
, dividend
);
547 ctrl_val
|= ASC_CTL_BAUDMODE
;
550 uart_update_timeout(port
, cflag
, baud
);
552 ascport
->port
.read_status_mask
= ASC_RXBUF_DUMMY_OE
;
553 if (termios
->c_iflag
& INPCK
)
554 ascport
->port
.read_status_mask
|= ASC_RXBUF_FE
| ASC_RXBUF_PE
;
555 if (termios
->c_iflag
& (IGNBRK
| BRKINT
| PARMRK
))
556 ascport
->port
.read_status_mask
|= ASC_RXBUF_DUMMY_BE
;
559 * Characters to ignore
561 ascport
->port
.ignore_status_mask
= 0;
562 if (termios
->c_iflag
& IGNPAR
)
563 ascport
->port
.ignore_status_mask
|= ASC_RXBUF_FE
| ASC_RXBUF_PE
;
564 if (termios
->c_iflag
& IGNBRK
) {
565 ascport
->port
.ignore_status_mask
|= ASC_RXBUF_DUMMY_BE
;
567 * If we're ignoring parity and break indicators,
568 * ignore overruns too (for real raw support).
570 if (termios
->c_iflag
& IGNPAR
)
571 ascport
->port
.ignore_status_mask
|= ASC_RXBUF_DUMMY_OE
;
575 * Ignore all characters if CREAD is not set.
577 if (!(termios
->c_cflag
& CREAD
))
578 ascport
->port
.ignore_status_mask
|= ASC_RXBUF_DUMMY_RX
;
580 /* Set the timeout */
581 asc_out(port
, ASC_TIMEOUT
, 20);
583 /* write final value and enable port */
584 asc_out(port
, ASC_CTL
, (ctrl_val
| ASC_CTL_RUN
));
586 uart_port_unlock_irqrestore(port
, flags
);
590 pinctrl_select_state(ascport
->pinctrl
,
591 ascport
->states
[NO_HW_FLOWCTRL
]);
593 gpiod
= devm_gpiod_get(port
->dev
, "rts", GPIOD_OUT_LOW
);
594 if (!IS_ERR(gpiod
)) {
595 gpiod_set_consumer_name(gpiod
,
596 port
->dev
->of_node
->name
);
597 ascport
->rts
= gpiod
;
600 devm_gpiod_put(port
->dev
, ascport
->rts
);
602 pinctrl_select_state(ascport
->pinctrl
,
603 ascport
->states
[DEFAULT
]);
608 static const char *asc_type(struct uart_port
*port
)
610 return (port
->type
== PORT_ASC
) ? DRIVER_NAME
: NULL
;
613 static void asc_release_port(struct uart_port
*port
)
617 static int asc_request_port(struct uart_port
*port
)
623 * Called when the port is opened, and UPF_BOOT_AUTOCONF flag is set
624 * Set type field if successful
626 static void asc_config_port(struct uart_port
*port
, int flags
)
628 if ((flags
& UART_CONFIG_TYPE
))
629 port
->type
= PORT_ASC
;
633 asc_verify_port(struct uart_port
*port
, struct serial_struct
*ser
)
635 /* No user changeable parameters */
639 #ifdef CONFIG_CONSOLE_POLL
641 * Console polling routines for writing and reading from the uart while
642 * in an interrupt or debug context (i.e. kgdb).
645 static int asc_get_poll_char(struct uart_port
*port
)
647 if (!(asc_in(port
, ASC_STA
) & ASC_STA_RBF
))
650 return asc_in(port
, ASC_RXBUF
);
653 static void asc_put_poll_char(struct uart_port
*port
, unsigned char c
)
655 while (!asc_txfifo_is_half_empty(port
))
657 asc_out(port
, ASC_TXBUF
, c
);
660 #endif /* CONFIG_CONSOLE_POLL */
662 /*---------------------------------------------------------------------*/
664 static const struct uart_ops asc_uart_ops
= {
665 .tx_empty
= asc_tx_empty
,
666 .set_mctrl
= asc_set_mctrl
,
667 .get_mctrl
= asc_get_mctrl
,
668 .start_tx
= asc_start_tx
,
669 .stop_tx
= asc_stop_tx
,
670 .stop_rx
= asc_stop_rx
,
671 .break_ctl
= asc_break_ctl
,
672 .startup
= asc_startup
,
673 .shutdown
= asc_shutdown
,
674 .set_termios
= asc_set_termios
,
676 .release_port
= asc_release_port
,
677 .request_port
= asc_request_port
,
678 .config_port
= asc_config_port
,
679 .verify_port
= asc_verify_port
,
681 #ifdef CONFIG_CONSOLE_POLL
682 .poll_get_char
= asc_get_poll_char
,
683 .poll_put_char
= asc_put_poll_char
,
684 #endif /* CONFIG_CONSOLE_POLL */
687 static int asc_init_port(struct asc_port
*ascport
,
688 struct platform_device
*pdev
)
690 struct uart_port
*port
= &ascport
->port
;
691 struct resource
*res
;
694 port
->iotype
= UPIO_MEM
;
695 port
->flags
= UPF_BOOT_AUTOCONF
;
696 port
->ops
= &asc_uart_ops
;
697 port
->fifosize
= ASC_FIFO_SIZE
;
698 port
->dev
= &pdev
->dev
;
699 port
->irq
= platform_get_irq(pdev
, 0);
700 port
->has_sysrq
= IS_ENABLED(CONFIG_SERIAL_ST_ASC_CONSOLE
);
702 port
->membase
= devm_platform_get_and_ioremap_resource(pdev
, 0, &res
);
703 if (IS_ERR(port
->membase
))
704 return PTR_ERR(port
->membase
);
705 port
->mapbase
= res
->start
;
707 spin_lock_init(&port
->lock
);
709 ascport
->clk
= devm_clk_get(&pdev
->dev
, NULL
);
711 if (WARN_ON(IS_ERR(ascport
->clk
)))
713 /* ensure that clk rate is correct by enabling the clk */
714 ret
= clk_prepare_enable(ascport
->clk
);
717 ascport
->port
.uartclk
= clk_get_rate(ascport
->clk
);
718 WARN_ON(ascport
->port
.uartclk
== 0);
719 clk_disable_unprepare(ascport
->clk
);
721 ascport
->pinctrl
= devm_pinctrl_get(&pdev
->dev
);
722 if (IS_ERR(ascport
->pinctrl
)) {
723 ret
= PTR_ERR(ascport
->pinctrl
);
724 dev_err(&pdev
->dev
, "Failed to get Pinctrl: %d\n", ret
);
728 ascport
->states
[DEFAULT
] =
729 pinctrl_lookup_state(ascport
->pinctrl
, "default");
730 if (IS_ERR(ascport
->states
[DEFAULT
])) {
731 ret
= PTR_ERR(ascport
->states
[DEFAULT
]);
733 "Failed to look up Pinctrl state 'default': %d\n", ret
);
737 /* "no-hw-flowctrl" state is optional */
738 ascport
->states
[NO_HW_FLOWCTRL
] =
739 pinctrl_lookup_state(ascport
->pinctrl
, "no-hw-flowctrl");
740 if (IS_ERR(ascport
->states
[NO_HW_FLOWCTRL
]))
741 ascport
->states
[NO_HW_FLOWCTRL
] = NULL
;
746 static struct asc_port
*asc_of_get_asc_port(struct platform_device
*pdev
)
748 struct device_node
*np
= pdev
->dev
.of_node
;
754 id
= of_alias_get_id(np
, "serial");
756 id
= of_alias_get_id(np
, ASC_SERIAL_NAME
);
761 if (WARN_ON(id
>= ASC_MAX_PORTS
))
764 asc_ports
[id
].hw_flow_control
= of_property_read_bool(np
,
766 asc_ports
[id
].force_m1
= of_property_read_bool(np
, "st,force-m1");
767 asc_ports
[id
].port
.line
= id
;
768 asc_ports
[id
].rts
= NULL
;
770 return &asc_ports
[id
];
774 static const struct of_device_id asc_match
[] = {
775 { .compatible
= "st,asc", },
779 MODULE_DEVICE_TABLE(of
, asc_match
);
782 static int asc_serial_probe(struct platform_device
*pdev
)
785 struct asc_port
*ascport
;
787 ascport
= asc_of_get_asc_port(pdev
);
791 ret
= asc_init_port(ascport
, pdev
);
795 ret
= uart_add_one_port(&asc_uart_driver
, &ascport
->port
);
799 platform_set_drvdata(pdev
, &ascport
->port
);
804 static void asc_serial_remove(struct platform_device
*pdev
)
806 struct uart_port
*port
= platform_get_drvdata(pdev
);
808 uart_remove_one_port(&asc_uart_driver
, port
);
811 static int asc_serial_suspend(struct device
*dev
)
813 struct uart_port
*port
= dev_get_drvdata(dev
);
815 return uart_suspend_port(&asc_uart_driver
, port
);
818 static int asc_serial_resume(struct device
*dev
)
820 struct uart_port
*port
= dev_get_drvdata(dev
);
822 return uart_resume_port(&asc_uart_driver
, port
);
825 /*----------------------------------------------------------------------*/
827 #ifdef CONFIG_SERIAL_ST_ASC_CONSOLE
828 static void asc_console_putchar(struct uart_port
*port
, unsigned char ch
)
830 unsigned int timeout
= 1000000;
832 /* Wait for upto 1 second in case flow control is stopping us. */
833 while (--timeout
&& !asc_txfifo_is_half_empty(port
))
836 asc_out(port
, ASC_TXBUF
, ch
);
840 * Print a string to the serial port trying not to disturb
841 * any possible real use of the port...
844 static void asc_console_write(struct console
*co
, const char *s
, unsigned count
)
846 struct uart_port
*port
= &asc_ports
[co
->index
].port
;
848 unsigned long timeout
= 1000000;
853 locked
= 0; /* asc_interrupt has already claimed the lock */
854 else if (oops_in_progress
)
855 locked
= uart_port_trylock_irqsave(port
, &flags
);
857 uart_port_lock_irqsave(port
, &flags
);
860 * Disable interrupts so we don't get the IRQ line bouncing
861 * up and down while interrupts are disabled.
863 intenable
= asc_in(port
, ASC_INTEN
);
864 asc_out(port
, ASC_INTEN
, 0);
865 (void)asc_in(port
, ASC_INTEN
); /* Defeat bus write posting */
867 uart_console_write(port
, s
, count
, asc_console_putchar
);
869 while (--timeout
&& !asc_txfifo_is_empty(port
))
872 asc_out(port
, ASC_INTEN
, intenable
);
875 uart_port_unlock_irqrestore(port
, flags
);
878 static int asc_console_setup(struct console
*co
, char *options
)
880 struct asc_port
*ascport
;
886 if (co
->index
>= ASC_MAX_PORTS
)
889 ascport
= &asc_ports
[co
->index
];
892 * This driver does not support early console initialization
893 * (use ARM early printk support instead), so we only expect
894 * this to be called during the uart port registration when the
895 * driver gets probed and the port should be mapped at that point.
897 if (ascport
->port
.mapbase
== 0 || ascport
->port
.membase
== NULL
)
901 uart_parse_options(options
, &baud
, &parity
, &bits
, &flow
);
903 return uart_set_options(&ascport
->port
, co
, baud
, parity
, bits
, flow
);
906 static struct console asc_console
= {
907 .name
= ASC_SERIAL_NAME
,
908 .device
= uart_console_device
,
909 .write
= asc_console_write
,
910 .setup
= asc_console_setup
,
911 .flags
= CON_PRINTBUFFER
,
913 .data
= &asc_uart_driver
,
916 #define ASC_SERIAL_CONSOLE (&asc_console)
919 #define ASC_SERIAL_CONSOLE NULL
920 #endif /* CONFIG_SERIAL_ST_ASC_CONSOLE */
922 static struct uart_driver asc_uart_driver
= {
923 .owner
= THIS_MODULE
,
924 .driver_name
= DRIVER_NAME
,
925 .dev_name
= ASC_SERIAL_NAME
,
929 .cons
= ASC_SERIAL_CONSOLE
,
932 static DEFINE_SIMPLE_DEV_PM_OPS(asc_serial_pm_ops
, asc_serial_suspend
,
935 static struct platform_driver asc_serial_driver
= {
936 .probe
= asc_serial_probe
,
937 .remove
= asc_serial_remove
,
940 .pm
= pm_sleep_ptr(&asc_serial_pm_ops
),
941 .of_match_table
= of_match_ptr(asc_match
),
945 static int __init
asc_init(void)
948 static const char banner
[] __initconst
=
949 KERN_INFO
"STMicroelectronics ASC driver initialized\n";
953 ret
= uart_register_driver(&asc_uart_driver
);
957 ret
= platform_driver_register(&asc_serial_driver
);
959 uart_unregister_driver(&asc_uart_driver
);
964 static void __exit
asc_exit(void)
966 platform_driver_unregister(&asc_serial_driver
);
967 uart_unregister_driver(&asc_uart_driver
);
970 module_init(asc_init
);
971 module_exit(asc_exit
);
973 MODULE_ALIAS("platform:" DRIVER_NAME
);
974 MODULE_AUTHOR("STMicroelectronics (R&D) Limited");
975 MODULE_DESCRIPTION("STMicroelectronics ASC serial port driver");
976 MODULE_LICENSE("GPL");