serial_sa1100.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:20k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/drivers/char/serial_sa1100.c
  3.  *
  4.  *  Driver for SA11x0 serial ports
  5.  *
  6.  *  Based on drivers/char/serial.c, by Linus Torvalds, Theodore Ts'o.
  7.  *
  8.  *  Copyright (C) 2000 Deep Blue Solutions Ltd.
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2 of the License, or
  13.  * (at your option) any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; if not, write to the Free Software
  22.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  23.  *
  24.  *  $Id: serial_sa1100.c,v 1.14.2.3 2001/11/27 17:35:39 rmk Exp $
  25.  *
  26.  */
  27. #include <linux/config.h>
  28. #include <linux/module.h>
  29. #include <linux/errno.h>
  30. #include <linux/signal.h>
  31. #include <linux/sched.h>
  32. #include <linux/interrupt.h>
  33. #include <linux/tty.h>
  34. #include <linux/tty_flip.h>
  35. #include <linux/major.h>
  36. #include <linux/string.h>
  37. #include <linux/fcntl.h>
  38. #include <linux/ptrace.h>
  39. #include <linux/ioport.h>
  40. #include <linux/mm.h>
  41. #include <linux/slab.h>
  42. #include <linux/init.h>
  43. #include <linux/circ_buf.h>
  44. #include <linux/serial.h>
  45. #include <linux/console.h>
  46. #include <linux/sysrq.h>
  47. #include <asm/system.h>
  48. #include <asm/io.h>
  49. #include <asm/irq.h>
  50. #include <asm/uaccess.h>
  51. #include <asm/bitops.h>
  52. #include <asm/hardware.h>
  53. #include <asm/mach/serial_sa1100.h>
  54. #if defined(CONFIG_SERIAL_SA1100_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
  55. #define SUPPORT_SYSRQ
  56. #endif
  57. #include <linux/serial_core.h>
  58. /* We've been assigned a range on the "Low-density serial ports" major */
  59. #define SERIAL_SA1100_MAJOR 204
  60. #define CALLOUT_SA1100_MAJOR 205
  61. #define MINOR_START 5
  62. #define NR_PORTS 3
  63. #define SA1100_ISR_PASS_LIMIT 256
  64. /*
  65.  * Convert from ignore_status_mask or read_status_mask to UTSR[01]
  66.  */
  67. #define SM_TO_UTSR0(x) ((x) & 0xff)
  68. #define SM_TO_UTSR1(x) ((x) >> 8)
  69. #define UTSR0_TO_SM(x) ((x))
  70. #define UTSR1_TO_SM(x) ((x) << 8)
  71. #define UART_GET_UTCR0(port) __raw_readl((port)->membase + UTCR0)
  72. #define UART_GET_UTCR1(port) __raw_readl((port)->membase + UTCR1)
  73. #define UART_GET_UTCR2(port) __raw_readl((port)->membase + UTCR2)
  74. #define UART_GET_UTCR3(port) __raw_readl((port)->membase + UTCR3)
  75. #define UART_GET_UTSR0(port) __raw_readl((port)->membase + UTSR0)
  76. #define UART_GET_UTSR1(port) __raw_readl((port)->membase + UTSR1)
  77. #define UART_GET_CHAR(port) __raw_readl((port)->membase + UTDR)
  78. #define UART_PUT_UTCR0(port,v) __raw_writel((v),(port)->membase + UTCR0)
  79. #define UART_PUT_UTCR1(port,v) __raw_writel((v),(port)->membase + UTCR1)
  80. #define UART_PUT_UTCR2(port,v) __raw_writel((v),(port)->membase + UTCR2)
  81. #define UART_PUT_UTCR3(port,v) __raw_writel((v),(port)->membase + UTCR3)
  82. #define UART_PUT_UTSR0(port,v) __raw_writel((v),(port)->membase + UTSR0)
  83. #define UART_PUT_UTSR1(port,v) __raw_writel((v),(port)->membase + UTSR1)
  84. #define UART_PUT_CHAR(port,v) __raw_writel((v),(port)->membase + UTDR)
  85. /*
  86.  * This is the size of our serial port register set.
  87.  */
  88. #define UART_PORT_SIZE 0x24
  89. static struct tty_driver normal, callout;
  90. static struct tty_struct *sa1100_table[NR_PORTS];
  91. static struct termios *sa1100_termios[NR_PORTS], *sa1100_termios_locked[NR_PORTS];
  92. static int (*sa1100_open)(struct uart_port *, struct uart_info *);
  93. static void (*sa1100_close)(struct uart_port *, struct uart_info *);
  94. #ifdef SUPPORT_SYSRQ
  95. static struct console sa1100_console;
  96. #endif
  97. /*
  98.  * interrupts disabled on entry
  99.  */
  100. static void sa1100_stop_tx(struct uart_port *port, u_int from_tty)
  101. {
  102. u32 utcr3 = UART_GET_UTCR3(port);
  103. UART_PUT_UTCR3(port, utcr3 & ~UTCR3_TIE);
  104. port->read_status_mask &= ~UTSR0_TO_SM(UTSR0_TFS);
  105. }
  106. /*
  107.  * interrupts may not be disabled on entry
  108.  */
  109. static void sa1100_start_tx(struct uart_port *port, u_int nonempty, u_int from_tty)
  110. {
  111. if (nonempty) {
  112. unsigned long flags;
  113. u32 utcr3;
  114. local_irq_save(flags);
  115. utcr3 = UART_GET_UTCR3(port);
  116. port->read_status_mask |= UTSR0_TO_SM(UTSR0_TFS);
  117. UART_PUT_UTCR3(port, utcr3 | UTCR3_TIE);
  118. local_irq_restore(flags);
  119. }
  120. }
  121. /*
  122.  * Interrupts enabled
  123.  */
  124. static void sa1100_stop_rx(struct uart_port *port)
  125. {
  126. u32 utcr3 = UART_GET_UTCR3(port);
  127. UART_PUT_UTCR3(port, utcr3 & ~UTCR3_RIE);
  128. }
  129. /*
  130.  * No modem control lines
  131.  */
  132. static void sa1100_enable_ms(struct uart_port *port)
  133. {
  134. }
  135. static void
  136. sa1100_rx_chars(struct uart_info *info, struct pt_regs *regs)
  137. {
  138. struct tty_struct *tty = info->tty;
  139. unsigned int status, ch, flg, ignored = 0;
  140. struct uart_port *port = info->port;
  141. status = UTSR1_TO_SM(UART_GET_UTSR1(port)) | UTSR0_TO_SM(UART_GET_UTSR0(port));
  142. while (status & UTSR1_TO_SM(UTSR1_RNE)) {
  143. ch = UART_GET_CHAR(port);
  144. if (tty->flip.count >= TTY_FLIPBUF_SIZE)
  145. goto ignore_char;
  146. port->icount.rx++;
  147. flg = TTY_NORMAL;
  148. /*
  149.  * note that the error handling code is
  150.  * out of the main execution path
  151.  */
  152. if (status & UTSR1_TO_SM(UTSR1_PRE | UTSR1_FRE | UTSR1_ROR))
  153. goto handle_error;
  154. if (uart_handle_sysrq_char(info, ch, regs))
  155. goto ignore_char;
  156. error_return:
  157. *tty->flip.flag_buf_ptr++ = flg;
  158. *tty->flip.char_buf_ptr++ = ch;
  159. tty->flip.count++;
  160. ignore_char:
  161. status = UTSR1_TO_SM(UART_GET_UTSR1(port)) | UTSR0_TO_SM(UART_GET_UTSR0(port));
  162. }
  163. out:
  164. tty_flip_buffer_push(tty);
  165. return;
  166. handle_error:
  167. if (status & UTSR1_TO_SM(UTSR1_PRE))
  168. port->icount.parity++;
  169. else if (status & UTSR1_TO_SM(UTSR1_FRE))
  170. port->icount.frame++;
  171. if (status & UTSR1_TO_SM(UTSR1_ROR))
  172. port->icount.overrun++;
  173. if (status & port->ignore_status_mask) {
  174. if (++ignored > 100)
  175. goto out;
  176. goto ignore_char;
  177. }
  178. status &= port->read_status_mask;
  179. if (status & UTSR1_TO_SM(UTSR1_PRE))
  180. flg = TTY_PARITY;
  181. else if (status & UTSR1_TO_SM(UTSR1_FRE))
  182. flg = TTY_FRAME;
  183. if (status & UTSR1_TO_SM(UTSR1_ROR)) {
  184. /*
  185.  * overrun does *not* affect the character
  186.  * we read from the FIFO
  187.  */
  188. *tty->flip.flag_buf_ptr++ = flg;
  189. *tty->flip.char_buf_ptr++ = ch;
  190. tty->flip.count++;
  191. if (tty->flip.count >= TTY_FLIPBUF_SIZE)
  192. goto ignore_char;
  193. ch = 0;
  194. flg = TTY_OVERRUN;
  195. }
  196. #ifdef SUPPORT_SYSRQ
  197. info->sysrq = 0;
  198. #endif
  199. goto error_return;
  200. }
  201. static void sa1100_tx_chars(struct uart_info *info)
  202. {
  203. struct uart_port *port = info->port;
  204. if (port->x_char) {
  205. UART_PUT_CHAR(port, port->x_char);
  206. port->icount.tx++;
  207. port->x_char = 0;
  208. return;
  209. }
  210. if (info->xmit.head == info->xmit.tail
  211.     || info->tty->stopped
  212.     || info->tty->hw_stopped) {
  213. sa1100_stop_tx(info->port, 0);
  214. return;
  215. }
  216. /*
  217.  * Tried using FIFO (not checking TNF) for fifo fill:
  218.  * still had the '4 bytes repeated' problem.
  219.  */
  220. while (UART_GET_UTSR1(port) & UTSR1_TNF) {
  221. UART_PUT_CHAR(port, info->xmit.buf[info->xmit.tail]);
  222. info->xmit.tail = (info->xmit.tail + 1) & (UART_XMIT_SIZE - 1);
  223. port->icount.tx++;
  224. if (info->xmit.head == info->xmit.tail)
  225. break;
  226. }
  227. if (CIRC_CNT(info->xmit.head, info->xmit.tail, UART_XMIT_SIZE) <
  228. WAKEUP_CHARS)
  229. uart_event(info, EVT_WRITE_WAKEUP);
  230. if (info->xmit.head == info->xmit.tail)
  231. sa1100_stop_tx(info->port, 0);
  232. }
  233. static void sa1100_int(int irq, void *dev_id, struct pt_regs *regs)
  234. {
  235. struct uart_info *info = dev_id;
  236. struct uart_port *port = info->port;
  237. unsigned int status, pass_counter = 0;
  238. status = UART_GET_UTSR0(port);
  239. status &= (SM_TO_UTSR0(port->read_status_mask) | ~UTSR0_TFS);
  240. do {
  241. if (status & (UTSR0_RFS | UTSR0_RID)) {
  242. /* Clear the receiver idle bit, if set */
  243. if (status & UTSR0_RID)
  244. UART_PUT_UTSR0(port, UTSR0_RID);
  245. sa1100_rx_chars(info, regs);
  246. }
  247. /* Clear the relevent break bits */
  248. if (status & (UTSR0_RBB | UTSR0_REB))
  249. UART_PUT_UTSR0(port, status & (UTSR0_RBB | UTSR0_REB));
  250. if (status & UTSR0_RBB)
  251. port->icount.brk++;
  252. if (status & UTSR0_REB) {
  253. #ifdef SUPPORT_SYSRQ
  254. if (port->line == sa1100_console.index &&
  255.     !info->sysrq) {
  256. info->sysrq = jiffies + HZ*5;
  257. }
  258. #endif
  259. }
  260. if (status & UTSR0_TFS)
  261. sa1100_tx_chars(info);
  262. if (pass_counter++ > SA1100_ISR_PASS_LIMIT)
  263. break;
  264. status = UART_GET_UTSR0(port);
  265. status &= (SM_TO_UTSR0(port->read_status_mask) | ~UTSR0_TFS);
  266. } while (status & (UTSR0_TFS | UTSR0_RFS | UTSR0_RID));
  267. }
  268. /*
  269.  * Return TIOCSER_TEMT when transmitter is not busy.
  270.  */
  271. static u_int sa1100_tx_empty(struct uart_port *port)
  272. {
  273. return UART_GET_UTSR1(port) & UTSR1_TBY ? 0 : TIOCSER_TEMT;
  274. }
  275. static u_int sa1100_get_mctrl(struct uart_port *port)
  276. {
  277. return TIOCM_CTS | TIOCM_DSR | TIOCM_CAR;
  278. }
  279. static void sa1100_set_mctrl(struct uart_port *port, u_int mctrl)
  280. {
  281. }
  282. /*
  283.  * Interrupts always disabled.
  284.  */
  285. static void sa1100_break_ctl(struct uart_port *port, int break_state)
  286. {
  287. u_int utcr3;
  288. utcr3 = UART_GET_UTCR3(port);
  289. if (break_state == -1)
  290. utcr3 |= UTCR3_BRK;
  291. else
  292. utcr3 &= ~UTCR3_BRK;
  293. UART_PUT_UTCR3(port, utcr3);
  294. }
  295. static int sa1100_startup(struct uart_port *port, struct uart_info *info)
  296. {
  297. int retval;
  298. /*
  299.  * Allocate the IRQ
  300.  */
  301. retval = request_irq(port->irq, sa1100_int, 0, "serial_sa1100", info);
  302. if (retval)
  303. return retval;
  304. /*
  305.  * If there is a specific "open" function (to register
  306.  * control line interrupts)
  307.  */
  308. if (sa1100_open) {
  309. retval = sa1100_open(port, info);
  310. if (retval) {
  311. free_irq(port->irq, info);
  312. return retval;
  313. }
  314. }
  315. /*
  316.  * Finally, clear and enable interrupts
  317.  */
  318. UART_PUT_UTSR0(port, -1);
  319. UART_PUT_UTCR3(port, UTCR3_RXE | UTCR3_TXE | UTCR3_RIE);
  320. return 0;
  321. }
  322. static void sa1100_shutdown(struct uart_port *port, struct uart_info *info)
  323. {
  324. /*
  325.  * Free the interrupt
  326.  */
  327. free_irq(port->irq, info);
  328. /*
  329.  * If there is a specific "close" function (to unregister
  330.  * control line interrupts)
  331.  */
  332. if (sa1100_close)
  333. sa1100_close(port, info);
  334. /*
  335.  * Disable all interrupts, port and break condition.
  336.  */
  337. UART_PUT_UTCR3(port, 0);
  338. }
  339. static void sa1100_change_speed(struct uart_port *port, u_int cflag, u_int iflag, u_int quot)
  340. {
  341. unsigned long flags;
  342. u_int utcr0, old_utcr3;
  343. /* byte size and parity */
  344. switch (cflag & CSIZE) {
  345. case CS7: utcr0 = 0; break;
  346. default: utcr0 = UTCR0_DSS; break;
  347. }
  348. if (cflag & CSTOPB)
  349. utcr0 |= UTCR0_SBS;
  350. if (cflag & PARENB) {
  351. utcr0 |= UTCR0_PE;
  352. if (!(cflag & PARODD))
  353. utcr0 |= UTCR0_OES;
  354. }
  355. port->read_status_mask &= UTSR0_TO_SM(UTSR0_TFS);
  356. port->read_status_mask |= UTSR1_TO_SM(UTSR1_ROR);
  357. if (iflag & INPCK)
  358. port->read_status_mask |= UTSR1_TO_SM(UTSR1_FRE | UTSR1_PRE);
  359. if (iflag & (BRKINT | PARMRK))
  360. port->read_status_mask |= UTSR0_TO_SM(UTSR0_RBB | UTSR0_REB);
  361. /*
  362.  * Characters to ignore
  363.  */
  364. port->ignore_status_mask = 0;
  365. if (iflag & IGNPAR)
  366. port->ignore_status_mask |= UTSR1_TO_SM(UTSR1_FRE | UTSR1_PRE);
  367. if (iflag & IGNBRK) {
  368. port->ignore_status_mask |= UTSR0_TO_SM(UTSR0_RBB | UTSR0_REB);
  369. /*
  370.  * If we're ignoring parity and break indicators,
  371.  * ignore overruns too (for real raw support).
  372.  */
  373. if (iflag & IGNPAR)
  374. port->ignore_status_mask |= UTSR1_TO_SM(UTSR1_ROR);
  375. }
  376. /* first, disable interrupts and drain transmitter */
  377. local_irq_save(flags);
  378. old_utcr3 = UART_GET_UTCR3(port);
  379. UART_PUT_UTCR3(port, old_utcr3 & ~(UTCR3_RIE | UTCR3_TIE));
  380. local_irq_restore(flags);
  381. while (UART_GET_UTSR1(port) & UTSR1_TBY);
  382. /* then, disable everything */
  383. UART_PUT_UTCR3(port, 0);
  384. /* set the parity, stop bits and data size */
  385. UART_PUT_UTCR0(port, utcr0);
  386. /* set the baud rate */
  387. quot -= 1;
  388. UART_PUT_UTCR1(port, ((quot & 0xf00) >> 8));
  389. UART_PUT_UTCR2(port, (quot & 0xff));
  390. UART_PUT_UTSR0(port, -1);
  391. UART_PUT_UTCR3(port, old_utcr3);
  392. }
  393. static const char *sa1100_type(struct uart_port *port)
  394. {
  395. return port->type == PORT_SA1100 ? "SA1100" : NULL;
  396. }
  397. /*
  398.  * Release the memory region(s) being used by 'port'.
  399.  */
  400. static void sa1100_release_port(struct uart_port *port)
  401. {
  402. release_mem_region(port->mapbase, UART_PORT_SIZE);
  403. }
  404. /*
  405.  * Request the memory region(s) being used by 'port'.
  406.  */
  407. static int sa1100_request_port(struct uart_port *port)
  408. {
  409. return request_mem_region(port->mapbase, UART_PORT_SIZE,
  410. "serial_sa1100") != NULL ? 0 : -EBUSY;
  411. }
  412. /*
  413.  * Configure/autoconfigure the port.
  414.  */
  415. static void sa1100_config_port(struct uart_port *port, int flags)
  416. {
  417. if (flags & UART_CONFIG_TYPE && sa1100_request_port(port) == 0)
  418. port->type = PORT_SA1100;
  419. }
  420. /*
  421.  * Verify the new serial_struct (for TIOCSSERIAL).
  422.  * The only change we allow are to the flags and type, and
  423.  * even then only between PORT_SA1100 and PORT_UNKNOWN
  424.  */
  425. static int sa1100_verify_port(struct uart_port *port, struct serial_struct *ser)
  426. {
  427. int ret = 0;
  428. if (ser->type != PORT_UNKNOWN && ser->type != PORT_SA1100)
  429. ret = -EINVAL;
  430. if (port->irq != ser->irq)
  431. ret = -EINVAL;
  432. if (ser->io_type != SERIAL_IO_MEM)
  433. ret = -EINVAL;
  434. if (port->uartclk / 16 != ser->baud_base)
  435. ret = -EINVAL;
  436. if ((void *)port->mapbase != ser->iomem_base)
  437. ret = -EINVAL;
  438. if (port->iobase != ser->port)
  439. ret = -EINVAL;
  440. if (ser->hub6 != 0)
  441. ret = -EINVAL;
  442. return ret;
  443. }
  444. static struct uart_ops sa1100_pops = {
  445. tx_empty: sa1100_tx_empty,
  446. set_mctrl: sa1100_set_mctrl,
  447. get_mctrl: sa1100_get_mctrl,
  448. stop_tx: sa1100_stop_tx,
  449. start_tx: sa1100_start_tx,
  450. stop_rx: sa1100_stop_rx,
  451. enable_ms: sa1100_enable_ms,
  452. break_ctl: sa1100_break_ctl,
  453. startup: sa1100_startup,
  454. shutdown: sa1100_shutdown,
  455. change_speed: sa1100_change_speed,
  456. type: sa1100_type,
  457. release_port: sa1100_release_port,
  458. request_port: sa1100_request_port,
  459. config_port: sa1100_config_port,
  460. verify_port: sa1100_verify_port,
  461. };
  462. static struct uart_port sa1100_ports[NR_PORTS];
  463. /*
  464.  * Setup the SA1100 serial ports.  Note that we don't include the IrDA
  465.  * port here since we have our own SIR/FIR driver (see drivers/net/irda)
  466.  *
  467.  * Note also that we support "console=ttySAx" where "x" is either 0 or 1.
  468.  * Which serial port this ends up being depends on the machine you're
  469.  * running this kernel on.  I'm not convinced that this is a good idea,
  470.  * but that's the way it traditionally works.
  471.  *
  472.  * Note that NanoEngine UART3 becomes UART2, and UART2 is no longer
  473.  * used here.
  474.  */
  475. static void sa1100_init_ports(void)
  476. {
  477. static int first = 1;
  478. int i;
  479. if (!first)
  480. return;
  481. first = 0;
  482. for (i = 0; i < NR_PORTS; i++) {
  483. sa1100_ports[i].uartclk  = 3686400;
  484. sa1100_ports[i].ops      = &sa1100_pops;
  485. sa1100_ports[i].fifosize = 8;
  486. }
  487. /*
  488.  * make transmit lines outputs, so that when the port
  489.  * is closed, the output is in the MARK state.
  490.  */
  491. PPDR |= PPC_TXD1 | PPC_TXD3;
  492. PPSR |= PPC_TXD1 | PPC_TXD3;
  493. }
  494. void __init sa1100_register_uart_fns(struct sa1100_port_fns *fns)
  495. {
  496. if (fns->enable_ms)
  497. sa1100_pops.enable_ms = fns->enable_ms;
  498. if (fns->get_mctrl)
  499. sa1100_pops.get_mctrl = fns->get_mctrl;
  500. if (fns->set_mctrl)
  501. sa1100_pops.set_mctrl = fns->set_mctrl;
  502. sa1100_open          = fns->open;
  503. sa1100_close         = fns->close;
  504. sa1100_pops.pm       = fns->pm;
  505. sa1100_pops.set_wake = fns->set_wake;
  506. }
  507. void __init sa1100_register_uart(int idx, int port)
  508. {
  509. if (idx >= NR_PORTS) {
  510. printk(KERN_ERR __FUNCTION__ ": bad index number %dn", idx);
  511. return;
  512. }
  513. switch (port) {
  514. case 1:
  515. sa1100_ports[idx].membase = (void *)&Ser1UTCR0;
  516. sa1100_ports[idx].mapbase = _Ser1UTCR0;
  517. sa1100_ports[idx].irq     = IRQ_Ser1UART;
  518. sa1100_ports[idx].iotype  = SERIAL_IO_MEM;
  519. sa1100_ports[idx].flags   = ASYNC_BOOT_AUTOCONF;
  520. break;
  521. case 2:
  522. sa1100_ports[idx].membase = (void *)&Ser2UTCR0;
  523. sa1100_ports[idx].mapbase = _Ser2UTCR0;
  524. sa1100_ports[idx].irq     = IRQ_Ser2ICP;
  525. sa1100_ports[idx].iotype  = SERIAL_IO_MEM;
  526. sa1100_ports[idx].flags   = ASYNC_BOOT_AUTOCONF;
  527. break;
  528. case 3:
  529. sa1100_ports[idx].membase = (void *)&Ser3UTCR0;
  530. sa1100_ports[idx].mapbase = _Ser3UTCR0;
  531. sa1100_ports[idx].irq     = IRQ_Ser3UART;
  532. sa1100_ports[idx].iotype  = SERIAL_IO_MEM;
  533. sa1100_ports[idx].flags   = ASYNC_BOOT_AUTOCONF;
  534. break;
  535. default:
  536. printk(KERN_ERR __FUNCTION__ ": bad port number %dn", port);
  537. }
  538. }
  539. #ifdef CONFIG_SERIAL_SA1100_CONSOLE
  540. /*
  541.  * Interrupts are disabled on entering
  542.  */
  543. static void sa1100_console_write(struct console *co, const char *s, u_int count)
  544. {
  545. struct uart_port *port = sa1100_ports + co->index;
  546. u_int old_utcr3, status, i;
  547. /*
  548.  * First, save UTCR3 and then disable interrupts
  549.  */
  550. old_utcr3 = UART_GET_UTCR3(port);
  551. UART_PUT_UTCR3(port, (old_utcr3 & ~(UTCR3_RIE | UTCR3_TIE)) | UTCR3_TXE);
  552. /*
  553.  * Now, do each character
  554.  */
  555. for (i = 0; i < count; i++) {
  556. do {
  557. status = UART_GET_UTSR1(port);
  558. } while (!(status & UTSR1_TNF));
  559. UART_PUT_CHAR(port, s[i]);
  560. if (s[i] == 'n') {
  561. do {
  562. status = UART_GET_UTSR1(port);
  563. } while (!(status & UTSR1_TNF));
  564. UART_PUT_CHAR(port, 'r');
  565. }
  566. }
  567. /*
  568.  * Finally, wait for transmitter to become empty
  569.  * and restore UTCR3
  570.  */
  571. do {
  572. status = UART_GET_UTSR1(port);
  573. } while (status & UTSR1_TBY);
  574. UART_PUT_UTCR3(port, old_utcr3);
  575. }
  576. static kdev_t sa1100_console_device(struct console *co)
  577. {
  578. return MKDEV(SERIAL_SA1100_MAJOR, MINOR_START + co->index);
  579. }
  580. static int sa1100_console_wait_key(struct console *co)
  581. {
  582. struct uart_port *port = sa1100_ports + co->index;
  583. unsigned long flags;
  584. u_int old_utcr3, status, ch;
  585. /*
  586.  * Save UTCR3 and disable interrupts
  587.  */
  588. save_flags(flags);
  589. cli();
  590. old_utcr3 = UART_GET_UTCR3(port);
  591. UART_PUT_UTCR3(port, old_utcr3 & ~(UTCR3_RIE | UTCR3_TIE));
  592. restore_flags(flags);
  593. /*
  594.  * Wait for a character
  595.  */
  596. do {
  597. status = UART_GET_UTSR1(port);
  598. } while (!(status & UTSR1_RNE));
  599. ch = UART_GET_CHAR(port);
  600. /*
  601.  * Restore UTCR3
  602.  */
  603. UART_PUT_UTCR3(port, old_utcr3);
  604. return ch;
  605. }
  606. /*
  607.  * If the port was already initialised (eg, by a boot loader), try to determine
  608.  * the current setup.
  609.  */
  610. static void __init
  611. sa1100_console_get_options(struct uart_port *port, int *baud, int *parity, int *bits)
  612. {
  613. u_int utcr3;
  614. utcr3 = UART_GET_UTCR3(port) & (UTCR3_RXE | UTCR3_TXE);
  615. if (utcr3 == (UTCR3_RXE | UTCR3_TXE)) {
  616. /* ok, the port was enabled */
  617. u_int utcr0, quot;
  618. utcr0 = UART_GET_UTCR0(port);
  619. *parity = 'n';
  620. if (utcr0 & UTCR0_PE) {
  621. if (utcr0 & UTCR0_OES)
  622. *parity = 'e';
  623. else
  624. *parity = 'o';
  625. }
  626. if (utcr0 & UTCR0_DSS)
  627. *bits = 8;
  628. else
  629. *bits = 7;
  630. quot = UART_GET_UTCR2(port) | UART_GET_UTCR1(port) << 8;
  631. quot &= 0xfff;
  632. *baud = port->uartclk / (16 * (quot + 1));
  633. }
  634. }
  635. static int __init
  636. sa1100_console_setup(struct console *co, char *options)
  637. {
  638. struct uart_port *port;
  639. int baud = CONFIG_SA1100_DEFAULT_BAUDRATE;
  640. int bits = 8;
  641. int parity = 'n';
  642. int flow = 'n';
  643. /*
  644.  * Check whether an invalid uart number has been specified, and
  645.  * if so, search for the first available port that does have
  646.  * console support.
  647.  */
  648. port = uart_get_console(sa1100_ports, NR_PORTS, co);
  649. if (options)
  650. uart_parse_options(options, &baud, &parity, &bits, &flow);
  651. else
  652. sa1100_console_get_options(port, &baud, &parity, &bits);
  653. return uart_set_options(port, co, baud, parity, bits, flow);
  654. }
  655. static struct console sa1100_console = {
  656. name: "ttySA",
  657. write: sa1100_console_write,
  658. device: sa1100_console_device,
  659. wait_key: sa1100_console_wait_key,
  660. setup: sa1100_console_setup,
  661. flags: CON_PRINTBUFFER,
  662. index: -1,
  663. };
  664. void __init sa1100_rs_console_init(void)
  665. {
  666. sa1100_init_ports();
  667. register_console(&sa1100_console);
  668. }
  669. #define SA1100_CONSOLE &sa1100_console
  670. #else
  671. #define SA1100_CONSOLE NULL
  672. #endif
  673. static struct uart_driver sa1100_reg = {
  674. owner: THIS_MODULE,
  675. normal_major: SERIAL_SA1100_MAJOR,
  676. #ifdef CONFIG_DEVFS_FS
  677. normal_name: "ttySA%d",
  678. callout_name: "cusa%d",
  679. #else
  680. normal_name: "ttySA",
  681. callout_name: "cusa",
  682. #endif
  683. normal_driver: &normal,
  684. callout_major: CALLOUT_SA1100_MAJOR,
  685. callout_driver: &callout,
  686. table: sa1100_table,
  687. termios: sa1100_termios,
  688. termios_locked: sa1100_termios_locked,
  689. minor: MINOR_START,
  690. nr: NR_PORTS,
  691. port: sa1100_ports,
  692. cons: SA1100_CONSOLE,
  693. };
  694. static int __init sa1100_serial_init(void)
  695. {
  696. sa1100_init_ports();
  697. return uart_register_driver(&sa1100_reg);
  698. }
  699. static void __exit sa1100_serial_exit(void)
  700. {
  701. uart_unregister_driver(&sa1100_reg);
  702. }
  703. module_init(sa1100_serial_init);
  704. module_exit(sa1100_serial_exit);
  705. EXPORT_NO_SYMBOLS;
  706. MODULE_AUTHOR("Deep Blue Solutions Ltd");
  707. MODULE_DESCRIPTION("SA1100 generic serial port driver");
  708. MODULE_LICENSE("GPL");