/* * drivers/serial/sh-sci.c * * SuperH on-chip serial module support. (SCI with no FIFO / with FIFO) * * Copyright (C) 2002 - 2008 Paul Mundt * Modified to support SH7720 SCIF. Markus Brunner, Mark Jonas (Jul 2007). * * based off of the old drivers/char/sh-sci.c by: * * Copyright (C) 1999, 2000 Niibe Yutaka * Copyright (C) 2000 Sugioka Toshinobu * Modified to support multiple serial ports. Stuart Menefy (May 2000). * Modified to support SecureEdge. David McCullough (2002) * Modified to support SH7300 SCIF. Takashi Kusuda (Jun 2003). * Removed SH7300 support (Jul 2007). * * This file is subject to the terms and conditions of the GNU General Public * License. See the file "COPYING" in the main directory of this archive * for more details. */#if defined(CONFIG_SERIAL_SH_SCI_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)#define SUPPORT_SYSRQ#endif#undef DEBUG#include <linux/module.h>#include <linux/errno.h>#include <linux/timer.h>#include <linux/interrupt.h>#include <linux/tty.h>#include <linux/tty_flip.h>#include <linux/serial.h>#include <linux/major.h>#include <linux/string.h>#include <linux/sysrq.h>#include <linux/ioport.h>#include <linux/mm.h>#include <linux/init.h>#include <linux/delay.h>#include <linux/console.h>#include <linux/platform_device.h>#include <linux/serial_sci.h>#include <linux/notifier.h>#include <linux/cpufreq.h>#include <linux/clk.h>#include <linux/ctype.h>#include <linux/err.h>#include <linux/list.h>#ifdef CONFIG_SUPERH#include <asm/clock.h>#include <asm/sh_bios.h>#endif#ifdef CONFIG_H8300#include <asm/gpio.h>#endif#include"sh-sci.h"struct sci_port {struct uart_port port;/* Port type */unsigned int type;/* Port IRQs: ERI, RXI, TXI, BRI (optional) */unsigned int irqs[SCIx_NR_IRQS];/* Port enable callback */void(*enable)(struct uart_port *port);/* Port disable callback */void(*disable)(struct uart_port *port);/* Break timer */struct timer_list break_timer;int break_flag;#ifdef CONFIG_HAVE_CLK/* Interface clock */struct clk *iclk;/* Data clock */struct clk *dclk;#endifstruct list_head node;};struct sh_sci_priv {
spinlock_t lock;struct list_head ports;#ifdef CONFIG_HAVE_CLKstruct notifier_block clk_nb;#endif};/* Function prototypes */static voidsci_stop_tx(struct uart_port *port);#define SCI_NPORTS CONFIG_SERIAL_SH_SCI_NR_UARTSstatic struct sci_port sci_ports[SCI_NPORTS];static struct uart_driver sci_uart_driver;staticinlinestruct sci_port *to_sci_port(struct uart_port *uart){returncontainer_of(uart,struct sci_port, port);}#if defined(CONFIG_CONSOLE_POLL) || defined(CONFIG_SERIAL_SH_SCI_CONSOLE)