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

嵌入式Linux

开发平台:

Unix_Linux

  1. /* $Id: sh-sci.c,v 1.40 2000/04/15 06:57:29 gniibe Exp $
  2.  *
  3.  *  linux/drivers/char/sh-sci.c
  4.  *
  5.  *  SuperH on-chip serial module support.  (SCI with no FIFO / with FIFO)
  6.  *  Copyright (C) 1999, 2000  Niibe Yutaka
  7.  *  Copyright (C) 2000  Sugioka Toshinobu
  8.  *  Modified to support multiple serial ports. Stuart Menefy (May 2000).
  9.  *
  10.  * TTY code is based on sx.c (Specialix SX driver) by:
  11.  *
  12.  *   (C) 1998 R.E.Wolff@BitWizard.nl
  13.  *
  14.  */
  15. #include <linux/config.h>
  16. #include <linux/module.h>
  17. #include <linux/errno.h>
  18. #include <linux/signal.h>
  19. #include <linux/sched.h>
  20. #include <linux/timer.h>
  21. #include <linux/interrupt.h>
  22. #include <linux/tty.h>
  23. #include <linux/tty_flip.h>
  24. #include <linux/serial.h>
  25. #include <linux/major.h>
  26. #include <linux/string.h>
  27. #include <linux/fcntl.h>
  28. #include <linux/ptrace.h>
  29. #include <linux/ioport.h>
  30. #include <linux/mm.h>
  31. #include <linux/slab.h>
  32. #include <linux/init.h>
  33. #include <linux/delay.h>
  34. #ifdef CONFIG_SERIAL_CONSOLE
  35. #include <linux/console.h>
  36. #endif
  37. #include <asm/system.h>
  38. #include <asm/io.h>
  39. #include <asm/irq.h>
  40. #include <asm/uaccess.h>
  41. #include <asm/bitops.h>
  42. #include <linux/generic_serial.h>
  43. #ifdef CONFIG_SH_STANDARD_BIOS
  44. #include <asm/sh_bios.h>
  45. #endif
  46. #include "sh-sci.h"
  47. #ifdef CONFIG_SERIAL_CONSOLE
  48. static struct console sercons;
  49. static struct sci_port* sercons_port=0;
  50. static int sercons_baud;
  51. #endif
  52. /* Function prototypes */
  53. static void sci_init_pins_sci(struct sci_port* port, unsigned int cflag);
  54. #ifndef SCI_ONLY
  55. static void sci_init_pins_scif(struct sci_port* port, unsigned int cflag);
  56. #if defined(__sh3__)
  57. static void sci_init_pins_irda(struct sci_port* port, unsigned int cflag);
  58. #endif
  59. #endif
  60. static void sci_disable_tx_interrupts(void *ptr);
  61. static void sci_enable_tx_interrupts(void *ptr);
  62. static void sci_disable_rx_interrupts(void *ptr);
  63. static void sci_enable_rx_interrupts(void *ptr);
  64. static int  sci_get_CD(void *ptr);
  65. static void sci_shutdown_port(void *ptr);
  66. static int sci_set_real_termios(void *ptr);
  67. static void sci_hungup(void *ptr);
  68. static void sci_close(void *ptr);
  69. static int sci_chars_in_buffer(void *ptr);
  70. static int sci_request_irq(struct sci_port *port);
  71. static void sci_free_irq(struct sci_port *port);
  72. static int sci_init_drivers(void);
  73. static struct tty_driver sci_driver, sci_callout_driver;
  74. static struct sci_port sci_ports[SCI_NPORTS] = SCI_INIT;
  75. static struct tty_struct *sci_table[SCI_NPORTS] = { NULL, };
  76. static struct termios *sci_termios[SCI_NPORTS];
  77. static struct termios *sci_termios_locked[SCI_NPORTS];
  78. static int sci_refcount;
  79. static int sci_debug = 0;
  80. #ifdef MODULE
  81. MODULE_PARM(sci_debug, "i");
  82. #endif
  83. #define dprintk(x...) do { if (sci_debug) printk(x); } while(0)
  84. #ifdef CONFIG_SERIAL_CONSOLE
  85. static void put_char(struct sci_port *port, char c)
  86. {
  87. unsigned long flags;
  88. unsigned short status;
  89. save_and_cli(flags);
  90. do
  91. status = sci_in(port, SCxSR);
  92. while (!(status & SCxSR_TDxE(port)));
  93. sci_out(port, SCxTDR, c);
  94. sci_in(port, SCxSR);            /* Dummy read */
  95. sci_out(port, SCxSR, SCxSR_TDxE_CLEAR(port));
  96. restore_flags(flags);
  97. }
  98. #endif
  99. #ifdef CONFIG_SH_STANDARD_BIOS
  100. static void handle_error(struct sci_port *port)
  101. { /* Clear error flags */
  102. sci_out(port, SCxSR, SCxSR_ERROR_CLEAR(port));
  103. }
  104. static int get_char(struct sci_port *port)
  105. {
  106. unsigned long flags;
  107. unsigned short status;
  108. int c;
  109. save_and_cli(flags);
  110.         do {
  111. status = sci_in(port, SCxSR);
  112. if (status & SCxSR_ERRORS(port)) {
  113. handle_error(port);
  114. continue;
  115. }
  116. } while (!(status & SCxSR_RDxF(port)));
  117. c = sci_in(port, SCxRDR);
  118. sci_in(port, SCxSR);            /* Dummy read */
  119. sci_out(port, SCxSR, SCxSR_RDxF_CLEAR(port));
  120. restore_flags(flags);
  121. return c;
  122. }
  123. /* Taken from sh-stub.c of GDB 4.18 */
  124. static const char hexchars[] = "0123456789abcdef";
  125. static __inline__ char highhex(int  x)
  126. {
  127. return hexchars[(x >> 4) & 0xf];
  128. }
  129. static __inline__ char lowhex(int  x)
  130. {
  131. return hexchars[x & 0xf];
  132. }
  133. #endif
  134. /*
  135.  * Send the packet in buffer.  The host gets one chance to read it.
  136.  * This routine does not wait for a positive acknowledge.
  137.  */
  138. #ifdef CONFIG_SERIAL_CONSOLE
  139. static void put_string(struct sci_port *port, const char *buffer, int count)
  140. {
  141. int i;
  142. const unsigned char *p = buffer;
  143. #ifdef CONFIG_SH_STANDARD_BIOS
  144. int checksum;
  145.      /* This call only does a trap the first time it is
  146.  * called, and so is safe to do here unconditionally
  147.  */
  148. if (sh_bios_in_gdb_mode()) {
  149.     /*  $<packet info>#<checksum>. */
  150.     do {
  151. unsigned char c;
  152. put_char(port, '$');
  153. put_char(port, 'O'); /* 'O'utput to console */
  154. checksum = 'O';
  155. for (i=0; i<count; i++) { /* Don't use run length encoding */
  156. int h, l;
  157. c = *p++;
  158. h = highhex(c);
  159. l = lowhex(c);
  160. put_char(port, h);
  161. put_char(port, l);
  162. checksum += h + l;
  163. }
  164. put_char(port, '#');
  165. put_char(port, highhex(checksum));
  166. put_char(port, lowhex(checksum));
  167.     } while  (get_char(port) != '+');
  168. } else
  169. #endif
  170. for (i=0; i<count; i++) {
  171. if (*p == 10)
  172. put_char(port, 'r');
  173. put_char(port, *p++);
  174. }
  175. }
  176. #endif
  177. static struct real_driver sci_real_driver = {
  178. sci_disable_tx_interrupts,
  179. sci_enable_tx_interrupts,
  180. sci_disable_rx_interrupts,
  181. sci_enable_rx_interrupts,
  182. sci_get_CD,
  183. sci_shutdown_port,
  184. sci_set_real_termios,
  185. sci_chars_in_buffer,
  186. sci_close,
  187. sci_hungup,
  188. NULL
  189. };
  190. #if defined(SCI_ONLY) || defined(SCI_AND_SCIF)
  191. static void sci_init_pins_sci(struct sci_port* port, unsigned int cflag)
  192. {
  193. }
  194. #endif
  195. #if defined(SCIF_ONLY) || defined(SCI_AND_SCIF)
  196. #if defined(__sh3__)
  197. /* For SH7707, SH7709, SH7709A, SH7729 */
  198. static void sci_init_pins_scif(struct sci_port* port, unsigned int cflag)
  199. {
  200. unsigned int fcr_val = 0;
  201. {
  202. unsigned short data;
  203. /* We need to set SCPCR to enable RTS/CTS */
  204. data = ctrl_inw(SCPCR);
  205. /* Clear out SCP7MD1,0, SCP6MD1,0, SCP4MD1,0*/
  206. ctrl_outw(data&0x0fcf, SCPCR);
  207. }
  208. if (cflag & CRTSCTS)
  209. fcr_val |= SCFCR_MCE;
  210. else {
  211. unsigned short data;
  212. /* We need to set SCPCR to enable RTS/CTS */
  213. data = ctrl_inw(SCPCR);
  214. /* Clear out SCP7MD1,0, SCP4MD1,0,
  215.    Set SCP6MD1,0 = {01} (output)  */
  216. ctrl_outw((data&0x0fcf)|0x1000, SCPCR);
  217. data = ctrl_inb(SCPDR);
  218. /* Set /RTS2 (bit6) = 0 */
  219. ctrl_outb(data&0xbf, SCPDR);
  220. }
  221. sci_out(port, SCFCR, fcr_val);
  222. }
  223. static void sci_init_pins_irda(struct sci_port* port, unsigned int cflag)
  224. {
  225. unsigned int fcr_val = 0;
  226. if (cflag & CRTSCTS)
  227. fcr_val |= SCFCR_MCE;
  228. sci_out(port, SCFCR, fcr_val);
  229. }
  230. #else
  231. /* For SH7750 */
  232. static void sci_init_pins_scif(struct sci_port* port, unsigned int cflag)
  233. {
  234. unsigned int fcr_val = 0;
  235. if (cflag & CRTSCTS) {
  236. fcr_val |= SCFCR_MCE;
  237. } else {
  238. ctrl_outw(0x0080, SCSPTR2); /* Set RTS = 1 */
  239. }
  240. sci_out(port, SCFCR, fcr_val);
  241. }
  242. #endif
  243. #endif /* SCIF_ONLY || SCI_AND_SCIF */
  244. static void sci_setsignals(struct sci_port *port, int dtr, int rts)
  245. {
  246. /* This routine is used for seting signals of: DTR, DCD, CTS/RTS */
  247. /* We use SCIF's hardware for CTS/RTS, so don't need any for that. */
  248. /* If you have signals for DTR and DCD, please implement here. */
  249. ;
  250. }
  251. static int sci_getsignals(struct sci_port *port)
  252. {
  253. /* This routine is used for geting signals of: DTR, DCD, DSR, RI,
  254.    and CTS/RTS */
  255. return TIOCM_DTR|TIOCM_RTS|TIOCM_DSR;
  256. /*
  257. (((o_stat & OP_DTR)?TIOCM_DTR:0) |
  258.  ((o_stat & OP_RTS)?TIOCM_RTS:0) |
  259.  ((i_stat & IP_CTS)?TIOCM_CTS:0) |
  260.  ((i_stat & IP_DCD)?TIOCM_CAR:0) |
  261.  ((i_stat & IP_DSR)?TIOCM_DSR:0) |
  262.  ((i_stat & IP_RI) ?TIOCM_RNG:0)
  263. */
  264. }
  265. static void sci_set_baud(struct sci_port *port, int baud)
  266. {
  267. int t;
  268. switch (baud) {
  269. case 0:
  270. t = -1;
  271. break;
  272. case 2400:
  273. t = BPS_2400;
  274. break;
  275. case 4800:
  276. t = BPS_4800;
  277. break;
  278. case 9600:
  279. t = BPS_9600;
  280. break;
  281. case 19200:
  282. t = BPS_19200;
  283. break;
  284. case 38400:
  285. t = BPS_38400;
  286. break;
  287. case 57600:
  288. t = BPS_57600;
  289. break;
  290. default:
  291. printk(KERN_INFO "sci: unsupported baud rate: %d, using 115200 instead.n", baud);
  292. case 115200:
  293. t = BPS_115200;
  294. break;
  295. }
  296. if (t > 0) {
  297. sci_setsignals (port, 1, -1);
  298. if(t >= 256) {
  299. sci_out(port, SCSMR, (sci_in(port, SCSMR) & ~3) | 1);
  300. t >>= 2;
  301. } else {
  302. sci_out(port, SCSMR, sci_in(port, SCSMR) & ~3);
  303. }
  304. sci_out(port, SCBRR, t);
  305. udelay((1000000+(baud-1)) / baud); /* Wait one bit interval */
  306. } else {
  307. sci_setsignals (port, 0, -1);
  308. }
  309. }
  310. static void sci_set_termios_cflag(struct sci_port *port, int cflag, int baud)
  311. {
  312. unsigned int status;
  313. unsigned int smr_val;
  314. do
  315. status = sci_in(port, SCxSR);
  316. while (!(status & SCxSR_TEND(port)));
  317. sci_out(port, SCSCR, 0x00); /* TE=0, RE=0, CKE1=0 */
  318. if (port->type == PORT_SCIF) {
  319. sci_out(port, SCFCR, SCFCR_RFRST | SCFCR_TFRST);
  320. }
  321. smr_val = sci_in(port, SCSMR) & 3;
  322. if ((cflag & CSIZE) == CS7)
  323. smr_val |= 0x40;
  324. if (cflag & PARENB)
  325. smr_val |= 0x20;
  326. if (cflag & PARODD)
  327. smr_val |= 0x10;
  328. if (cflag & CSTOPB)
  329. smr_val |= 0x08;
  330. sci_out(port, SCSMR, smr_val);
  331. sci_set_baud(port, baud);
  332. port->init_pins(port, cflag);
  333. sci_out(port, SCSCR, SCSCR_INIT(port));
  334. }
  335. static int sci_set_real_termios(void *ptr)
  336. {
  337. struct sci_port *port = ptr;
  338. if (port->old_cflag != port->gs.tty->termios->c_cflag) {
  339. port->old_cflag = port->gs.tty->termios->c_cflag;
  340. sci_set_termios_cflag(port, port->old_cflag, port->gs.baud);
  341. sci_enable_rx_interrupts(port);
  342. }
  343. /* Tell line discipline whether we will do input cooking */
  344. if (I_OTHER(port->gs.tty))
  345. clear_bit(TTY_HW_COOK_IN, &port->gs.tty->flags);
  346. else
  347. set_bit(TTY_HW_COOK_IN, &port->gs.tty->flags);
  348. /* Tell line discipline whether we will do output cooking.
  349.  * If OPOST is set and no other output flags are set then we can do output
  350.  * processing.  Even if only *one* other flag in the O_OTHER group is set
  351.  * we do cooking in software.
  352.  */
  353. if (O_OPOST(port->gs.tty) && !O_OTHER(port->gs.tty))
  354. set_bit(TTY_HW_COOK_OUT, &port->gs.tty->flags);
  355. else
  356. clear_bit(TTY_HW_COOK_OUT, &port->gs.tty->flags);
  357. return 0;
  358. }
  359. /* ********************************************************************** *
  360.  *                   the interrupt related routines                       *
  361.  * ********************************************************************** */
  362. /*
  363.  * This routine is used by the interrupt handler to schedule
  364.  * processing in the software interrupt portion of the driver.
  365.  */
  366. static inline void sci_sched_event(struct sci_port *port, int event)
  367. {
  368. port->event |= 1 << event;
  369. queue_task(&port->tqueue, &tq_immediate);
  370. mark_bh(IMMEDIATE_BH);
  371. }
  372. static void sci_transmit_chars(struct sci_port *port)
  373. {
  374. int count, i;
  375. int txroom;
  376. unsigned long flags;
  377. unsigned short status;
  378. unsigned short ctrl;
  379. unsigned char c;
  380. status = sci_in(port, SCxSR);
  381. if (!(status & SCxSR_TDxE(port))) {
  382. save_and_cli(flags);
  383. ctrl = sci_in(port, SCSCR);
  384. if (port->gs.xmit_cnt == 0) {
  385. ctrl &= ~SCI_CTRL_FLAGS_TIE;
  386. port->gs.flags &= ~GS_TX_INTEN;
  387. } else
  388. ctrl |= SCI_CTRL_FLAGS_TIE;
  389. sci_out(port, SCSCR, ctrl);
  390. restore_flags(flags);
  391. return;
  392. }
  393. while (1) {
  394. count = port->gs.xmit_cnt;
  395. if (port->type == PORT_SCIF) {
  396. txroom = 16 - (sci_in(port, SCFDR)>>8);
  397. } else {
  398. txroom = (sci_in(port, SCxSR) & SCI_TDRE)?1:0;
  399. }
  400. if (count > txroom)
  401. count = txroom;
  402. /* Don't copy pas the end of the source buffer */
  403. if (count > SERIAL_XMIT_SIZE - port->gs.xmit_tail)
  404.                  count = SERIAL_XMIT_SIZE - port->gs.xmit_tail;
  405. /* If for one reason or another, we can't copy more data, we're done! */
  406. if (count == 0)
  407. break;
  408. for (i=0; i<count; i++) {
  409. c = port->gs.xmit_buf[port->gs.xmit_tail + i];
  410. sci_out(port, SCxTDR, c);
  411. }
  412. sci_out(port, SCxSR, SCxSR_TDxE_CLEAR(port));
  413. port->icount.tx += count;
  414. /* Update the kernel buffer end */
  415. port->gs.xmit_tail = (port->gs.xmit_tail + count) & (SERIAL_XMIT_SIZE-1);
  416. /* This one last. (this is essential)
  417.    It would allow others to start putting more data into the buffer! */
  418. port->gs.xmit_cnt -= count;
  419. }
  420. if (port->gs.xmit_cnt <= port->gs.wakeup_chars)
  421. sci_sched_event(port, SCI_EVENT_WRITE_WAKEUP);
  422. save_and_cli(flags);
  423. ctrl = sci_in(port, SCSCR);
  424. if (port->gs.xmit_cnt == 0) {
  425. ctrl &= ~SCI_CTRL_FLAGS_TIE;
  426. port->gs.flags &= ~GS_TX_INTEN;
  427. } else {
  428. if (port->type == PORT_SCIF) {
  429. sci_in(port, SCxSR); /* Dummy read */
  430. sci_out(port, SCxSR, SCxSR_TDxE_CLEAR(port));
  431. }
  432. ctrl |= SCI_CTRL_FLAGS_TIE;
  433. }
  434. sci_out(port, SCSCR, ctrl);
  435. restore_flags(flags);
  436. }
  437. static inline void sci_receive_chars(struct sci_port *port)
  438. {
  439. int i, count;
  440. struct tty_struct *tty;
  441. int copied=0;
  442. unsigned short status;
  443. status = sci_in(port, SCxSR);
  444. if (!(status & SCxSR_RDxF(port)))
  445. return;
  446. tty = port->gs.tty;
  447. while (1) {
  448. if (port->type == PORT_SCIF) {
  449. count = sci_in(port, SCFDR)&0x001f;
  450. } else {
  451. count = (sci_in(port, SCxSR)&SCxSR_RDxF(port))?1:0;
  452. }
  453. /* Don't copy more bytes than there is room for in the buffer */
  454. if (tty->flip.count + count > TTY_FLIPBUF_SIZE)
  455. count = TTY_FLIPBUF_SIZE - tty->flip.count;
  456. /* If for one reason or another, we can't copy more data, we're done! */
  457. if (count == 0)
  458. break;
  459. if (port->type == PORT_SCI) {
  460. tty->flip.char_buf_ptr[0] = sci_in(port, SCxRDR);
  461. tty->flip.flag_buf_ptr[0] = TTY_NORMAL;
  462. } else {
  463. for (i=0; i<count; i++) {
  464. tty->flip.char_buf_ptr[i] = sci_in(port, SCxRDR);
  465. status = sci_in(port, SCxSR);
  466. if (status&SCxSR_FER(port)) {
  467. tty->flip.flag_buf_ptr[i] = TTY_FRAME;
  468. dprintk("sci: frame errorn");
  469. } else if (status&SCxSR_PER(port)) {
  470. tty->flip.flag_buf_ptr[i] = TTY_PARITY;
  471. dprintk("sci: parity errorn");
  472. } else {
  473. tty->flip.flag_buf_ptr[i] = TTY_NORMAL;
  474. }
  475. }
  476. }
  477. sci_in(port, SCxSR); /* dummy read */
  478. sci_out(port, SCxSR, SCxSR_RDxF_CLEAR(port));
  479. /* Update the kernel buffer end */
  480. tty->flip.count += count;
  481. tty->flip.char_buf_ptr += count;
  482. tty->flip.flag_buf_ptr += count;
  483. copied += count;
  484. port->icount.rx += count;
  485. }
  486. if (copied)
  487. /* Tell the rest of the system the news. New characters! */
  488. tty_flip_buffer_push(tty);
  489. }
  490. static inline int sci_handle_errors(struct sci_port *port)
  491. {
  492. int copied = 0;
  493. unsigned short status = sci_in(port, SCxSR);
  494. struct tty_struct *tty = port->gs.tty;
  495. if (status&SCxSR_ORER(port) && tty->flip.count<TTY_FLIPBUF_SIZE) {
  496. /* overrun error */
  497. copied++;
  498. *tty->flip.flag_buf_ptr++ = TTY_OVERRUN;
  499. dprintk("sci: overrun errorn");
  500. }
  501. if (status&SCxSR_FER(port) && tty->flip.count<TTY_FLIPBUF_SIZE) {
  502. if (sci_rxd_in(port) == 0) {
  503. /* Notify of BREAK */
  504. copied++;
  505. *tty->flip.flag_buf_ptr++ = TTY_BREAK;
  506. dprintk("sci: BREAK detectedn");
  507. }
  508. else {
  509. /* frame error */
  510. copied++;
  511. *tty->flip.flag_buf_ptr++ = TTY_FRAME;
  512. dprintk("sci: frame errorn");
  513. }
  514. }
  515. if (status&SCxSR_PER(port) && tty->flip.count<TTY_FLIPBUF_SIZE) {
  516. /* parity error */
  517. copied++;
  518. *tty->flip.flag_buf_ptr++ = TTY_PARITY;
  519. dprintk("sci: parity errorn");
  520. }
  521. if (copied) {
  522. tty->flip.count += copied;
  523. tty_flip_buffer_push(tty);
  524. }
  525. return copied;
  526. }
  527. static inline int sci_handle_breaks(struct sci_port *port)
  528. {
  529. int copied = 0;
  530. unsigned short status = sci_in(port, SCxSR);
  531. struct tty_struct *tty = port->gs.tty;
  532. if (status&SCxSR_BRK(port) && tty->flip.count<TTY_FLIPBUF_SIZE) {
  533. /* Notify of BREAK */
  534. copied++;
  535. *tty->flip.flag_buf_ptr++ = TTY_BREAK;
  536. dprintk("sci: BREAK detectedn");
  537. }
  538. #if defined(CONFIG_CPU_SUBTYPE_SH7750) || defined(CONFIG_CPU_SUBTYPE_ST40STB1)
  539. /* XXX: Handle SCIF overrun error */
  540. if (port->type == PORT_SCIF && (sci_in(port, SCLSR) & SCIF_ORER) != 0) {
  541. sci_out(port, SCLSR, 0);
  542. if(tty->flip.count<TTY_FLIPBUF_SIZE) {
  543. copied++;
  544. *tty->flip.flag_buf_ptr++ = TTY_OVERRUN;
  545. dprintk("sci: overrun errorn");
  546. }
  547. }
  548. #endif
  549. if (copied) {
  550. tty->flip.count += copied;
  551. tty_flip_buffer_push(tty);
  552. }
  553. return copied;
  554. }
  555. static void sci_rx_interrupt(int irq, void *ptr, struct pt_regs *regs)
  556. {
  557. struct sci_port *port = ptr;
  558. if (port->gs.flags & GS_ACTIVE)
  559. if (!(port->gs.flags & SCI_RX_THROTTLE)) {
  560. sci_receive_chars(port);
  561. return;
  562. }
  563. sci_disable_rx_interrupts(port);
  564. }
  565. static void sci_tx_interrupt(int irq, void *ptr, struct pt_regs *regs)
  566. {
  567. struct sci_port *port = ptr;
  568. if (port->gs.flags & GS_ACTIVE)
  569. sci_transmit_chars(port);
  570. else {
  571. sci_disable_tx_interrupts(port);
  572. }
  573. }
  574. static void sci_er_interrupt(int irq, void *ptr, struct pt_regs *regs)
  575. {
  576. struct sci_port *port = ptr;
  577. /* Handle errors */
  578. if (port->type == PORT_SCI) {
  579. if(sci_handle_errors(port)) {
  580. /* discard character in rx buffer */
  581. sci_in(port, SCxSR);
  582. sci_out(port, SCxSR, SCxSR_RDxF_CLEAR(port));
  583. }
  584. }
  585. else
  586. sci_rx_interrupt(irq, ptr, regs);
  587. sci_out(port, SCxSR, SCxSR_ERROR_CLEAR(port));
  588. /* Kick the transmission */
  589. sci_tx_interrupt(irq, ptr, regs);
  590. }
  591. static void sci_br_interrupt(int irq, void *ptr, struct pt_regs *regs)
  592. {
  593. struct sci_port *port = ptr;
  594. /* Handle BREAKs */
  595. sci_handle_breaks(port);
  596. sci_out(port, SCxSR, SCxSR_BREAK_CLEAR(port));
  597. }
  598. static void do_softint(void *private_)
  599. {
  600. struct sci_port *port = (struct sci_port *) private_;
  601. struct tty_struct *tty;
  602. tty = port->gs.tty;
  603. if (!tty)
  604. return;
  605. if (test_and_clear_bit(SCI_EVENT_WRITE_WAKEUP, &port->event)) {
  606. if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
  607.     tty->ldisc.write_wakeup)
  608. (tty->ldisc.write_wakeup)(tty);
  609. wake_up_interruptible(&tty->write_wait);
  610. }
  611. }
  612. /* ********************************************************************** *
  613.  *                Here are the routines that actually                     *
  614.  *              interface with the generic_serial driver                  *
  615.  * ********************************************************************** */
  616. static void sci_disable_tx_interrupts(void *ptr)
  617. {
  618. struct sci_port *port = ptr;
  619. unsigned long flags;
  620. unsigned short ctrl;
  621. /* Clear TIE (Transmit Interrupt Enable) bit in SCSCR */
  622. save_and_cli(flags);
  623. ctrl = sci_in(port, SCSCR);
  624. ctrl &= ~SCI_CTRL_FLAGS_TIE;
  625. sci_out(port, SCSCR, ctrl);
  626. restore_flags(flags);
  627. }
  628. static void sci_enable_tx_interrupts(void *ptr)
  629. {
  630. struct sci_port *port = ptr; 
  631. disable_irq(port->irqs[SCIx_TXI_IRQ]);
  632. sci_transmit_chars(port);
  633. enable_irq(port->irqs[SCIx_TXI_IRQ]);
  634. }
  635. static void sci_disable_rx_interrupts(void * ptr)
  636. {
  637. struct sci_port *port = ptr;
  638. unsigned long flags;
  639. unsigned short ctrl;
  640. /* Clear RIE (Receive Interrupt Enable) bit in SCSCR */
  641. save_and_cli(flags);
  642. ctrl = sci_in(port, SCSCR);
  643. ctrl &= ~SCI_CTRL_FLAGS_RIE;
  644. sci_out(port, SCSCR, ctrl);
  645. restore_flags(flags);
  646. }
  647. static void sci_enable_rx_interrupts(void * ptr)
  648. {
  649. struct sci_port *port = ptr;
  650. unsigned long flags;
  651. unsigned short ctrl;
  652. /* Set RIE (Receive Interrupt Enable) bit in SCSCR */
  653. save_and_cli(flags);
  654. ctrl = sci_in(port, SCSCR);
  655. ctrl |= SCI_CTRL_FLAGS_RIE;
  656. sci_out(port, SCSCR, ctrl);
  657. restore_flags(flags);
  658. }
  659. static int sci_get_CD(void * ptr)
  660. {
  661. /* If you have signal for CD (Carrier Detect), please change here. */
  662. return 1;
  663. }
  664. static int sci_chars_in_buffer(void * ptr)
  665. {
  666. struct sci_port *port = ptr;
  667. if (port->type == PORT_SCIF) {
  668. return (sci_in(port, SCFDR) >> 8) + ((sci_in(port, SCxSR) & SCxSR_TEND(port))? 0: 1);
  669. } else {
  670. return (sci_in(port, SCxSR) & SCxSR_TEND(port))? 0: 1;
  671. }
  672. }
  673. static void sci_shutdown_port(void * ptr)
  674. {
  675. struct sci_port *port = ptr; 
  676. port->gs.flags &= ~ GS_ACTIVE;
  677. if (port->gs.tty && port->gs.tty->termios->c_cflag & HUPCL)
  678. sci_setsignals(port, 0, 0);
  679. sci_free_irq(port);
  680. }
  681. /* ********************************************************************** *
  682.  *                Here are the routines that actually                     *
  683.  *               interface with the rest of the system                    *
  684.  * ********************************************************************** */
  685. static int sci_open(struct tty_struct * tty, struct file * filp)
  686. {
  687. struct sci_port *port;
  688. int retval, line;
  689. line = MINOR(tty->device) - SCI_MINOR_START;
  690. if ((line < 0) || (line >= SCI_NPORTS))
  691. return -ENODEV;
  692. port = &sci_ports[line];
  693. tty->driver_data = port;
  694. port->gs.tty = tty;
  695. port->gs.count++;
  696. port->event = 0;
  697. port->tqueue.routine = do_softint;
  698. port->tqueue.data = port;
  699. /*
  700.  * Start up serial port
  701.  */
  702. retval = gs_init_port(&port->gs);
  703. if (retval) {
  704. goto failed_1;
  705. }
  706. port->gs.flags |= GS_ACTIVE;
  707. sci_setsignals(port, 1,1);
  708. if (port->gs.count == 1) {
  709. MOD_INC_USE_COUNT;
  710. retval = sci_request_irq(port);
  711. if (retval) {
  712. goto failed_2;
  713. }
  714. }
  715. retval = gs_block_til_ready(port, filp);
  716. if (retval) {
  717. goto failed_3;
  718. }
  719. if ((port->gs.count == 1) && (port->gs.flags & ASYNC_SPLIT_TERMIOS)) {
  720. if (tty->driver.subtype == SERIAL_TYPE_NORMAL)
  721. *tty->termios = port->gs.normal_termios;
  722. else 
  723. *tty->termios = port->gs.callout_termios;
  724. sci_set_real_termios(port);
  725. }
  726. #ifdef CONFIG_SERIAL_CONSOLE
  727. if (sercons.cflag && sercons.index == line) {
  728. tty->termios->c_cflag = sercons.cflag;
  729. port->gs.baud = sercons_baud;
  730. sercons.cflag = 0;
  731. sci_set_real_termios(port);
  732. }
  733. #endif
  734. sci_enable_rx_interrupts(port);
  735. port->gs.session = current->session;
  736. port->gs.pgrp = current->pgrp;
  737. return 0;
  738. failed_3:
  739. sci_free_irq(port);
  740. failed_2:
  741. MOD_DEC_USE_COUNT;
  742. failed_1:
  743. port->gs.count--;
  744. return retval;
  745. }
  746. static void sci_hungup(void *ptr)
  747. {
  748. MOD_DEC_USE_COUNT;
  749. }
  750. static void sci_close(void *ptr)
  751. {
  752. MOD_DEC_USE_COUNT;
  753. }
  754. static int sci_ioctl(struct tty_struct * tty, struct file * filp, 
  755.                      unsigned int cmd, unsigned long arg)
  756. {
  757. int rc;
  758. struct sci_port *port = tty->driver_data;
  759. int ival;
  760. rc = 0;
  761. switch (cmd) {
  762. case TIOCGSOFTCAR:
  763. rc = put_user(((tty->termios->c_cflag & CLOCAL) ? 1 : 0),
  764.               (unsigned int *) arg);
  765. break;
  766. case TIOCSSOFTCAR:
  767. if ((rc = get_user(ival, (unsigned int *) arg)) == 0)
  768. tty->termios->c_cflag =
  769. (tty->termios->c_cflag & ~CLOCAL) |
  770. (ival ? CLOCAL : 0);
  771. break;
  772. case TIOCGSERIAL:
  773. if ((rc = verify_area(VERIFY_WRITE, (void *) arg,
  774.                       sizeof(struct serial_struct))) == 0)
  775. rc = gs_getserial(&port->gs, (struct serial_struct *) arg);
  776. break;
  777. case TIOCSSERIAL:
  778. if ((rc = verify_area(VERIFY_READ, (void *) arg,
  779.                       sizeof(struct serial_struct))) == 0)
  780. rc = gs_setserial(&port->gs,
  781.   (struct serial_struct *) arg);
  782. break;
  783. case TIOCMGET:
  784. ival = sci_getsignals(port);
  785. rc = put_user(ival, (unsigned int *) arg);
  786. break;
  787. case TIOCMBIS:
  788. if ((rc = get_user(ival, (unsigned int *) arg)) == 0)
  789. sci_setsignals(port, ((ival & TIOCM_DTR) ? 1 : -1),
  790.                      ((ival & TIOCM_RTS) ? 1 : -1));
  791. break;
  792. case TIOCMBIC:
  793. if ((rc = get_user(ival, (unsigned int *) arg)) == 0)
  794. sci_setsignals(port, ((ival & TIOCM_DTR) ? 0 : -1),
  795.                      ((ival & TIOCM_RTS) ? 0 : -1));
  796. break;
  797. case TIOCMSET:
  798. if ((rc = get_user(ival, (unsigned int *)arg)) == 0)
  799. sci_setsignals(port, ((ival & TIOCM_DTR) ? 1 : 0),
  800.                      ((ival & TIOCM_RTS) ? 1 : 0));
  801. break;
  802. default:
  803. rc = -ENOIOCTLCMD;
  804. break;
  805. }
  806. return rc;
  807. }
  808. static void sci_throttle(struct tty_struct * tty)
  809. {
  810. struct sci_port *port = (struct sci_port *)tty->driver_data;
  811. /* If the port is using any type of input flow
  812.  * control then throttle the port.
  813.  */
  814. if ((tty->termios->c_cflag & CRTSCTS) || (I_IXOFF(tty)) )
  815. port->gs.flags |= SCI_RX_THROTTLE;
  816. }
  817. static void sci_unthrottle(struct tty_struct * tty)
  818. {
  819. struct sci_port *port = (struct sci_port *)tty->driver_data;
  820. /* Always unthrottle even if flow control is not enabled on
  821.  * this port in case we disabled flow control while the port
  822.  * was throttled
  823.  */
  824. port->gs.flags &= ~SCI_RX_THROTTLE;
  825. return;
  826. }
  827. #ifdef CONFIG_PROC_FS
  828. static int sci_read_proc(char *page, char **start, off_t off, int count,
  829.  int *eof, void *data)
  830. {
  831. int i;
  832. struct sci_port *port;
  833. int len = 0;
  834.         len += sprintf(page, "sciinfo:0.1n");
  835. for (i = 0; i < SCI_NPORTS && len < 4000; i++) {
  836. port = &sci_ports[i];
  837. len += sprintf(page+len, "%d: uart:%s address: %08x", i,
  838.        (port->type == PORT_SCI) ? "SCI" : "SCIF",
  839.        port->base);
  840. len += sprintf(page+len, " baud:%d", port->gs.baud);
  841. len += sprintf(page+len, " tx:%d rx:%d",
  842.        port->icount.tx, port->icount.rx);
  843. if (port->icount.frame)
  844. len += sprintf(page+len, " fe:%d", port->icount.frame);
  845. if (port->icount.parity)
  846. len += sprintf(page+len, " pe:%d", port->icount.parity);
  847. if (port->icount.brk)
  848. len += sprintf(page+len, " brk:%d", port->icount.brk);
  849. if (port->icount.overrun)
  850. len += sprintf(page+len, " oe:%d", port->icount.overrun);
  851. len += sprintf(page+len, "n");
  852. }
  853. return len;
  854. }
  855. #endif
  856. /* ********************************************************************** *
  857.  *                    Here are the initialization routines.               *
  858.  * ********************************************************************** */
  859. static int sci_init_drivers(void)
  860. {
  861. int error;
  862. struct sci_port *port;
  863. memset(&sci_driver, 0, sizeof(sci_driver));
  864. sci_driver.magic = TTY_DRIVER_MAGIC;
  865. sci_driver.driver_name = "sci";
  866. #ifdef CONFIG_DEVFS_FS
  867. sci_driver.name = "ttsc/%d";
  868. #else
  869. sci_driver.name = "ttySC";
  870. #endif
  871. sci_driver.major = SCI_MAJOR;
  872. sci_driver.minor_start = SCI_MINOR_START;
  873. sci_driver.num = SCI_NPORTS;
  874. sci_driver.type = TTY_DRIVER_TYPE_SERIAL;
  875. sci_driver.subtype = SERIAL_TYPE_NORMAL;
  876. sci_driver.init_termios = tty_std_termios;
  877. sci_driver.init_termios.c_cflag =
  878. B9600 | CS8 | CREAD | HUPCL | CLOCAL | CRTSCTS;
  879. sci_driver.flags = TTY_DRIVER_REAL_RAW;
  880. sci_driver.refcount = &sci_refcount;
  881. sci_driver.table = sci_table;
  882. sci_driver.termios = sci_termios;
  883. sci_driver.termios_locked = sci_termios_locked;
  884. sci_driver.open = sci_open;
  885. sci_driver.close = gs_close;
  886. sci_driver.write = gs_write;
  887. sci_driver.put_char = gs_put_char;
  888. sci_driver.flush_chars = gs_flush_chars;
  889. sci_driver.write_room = gs_write_room;
  890. sci_driver.chars_in_buffer = gs_chars_in_buffer;
  891. sci_driver.flush_buffer = gs_flush_buffer;
  892. sci_driver.ioctl = sci_ioctl;
  893. sci_driver.throttle = sci_throttle;
  894. sci_driver.unthrottle = sci_unthrottle;
  895. sci_driver.set_termios = gs_set_termios;
  896. sci_driver.stop = gs_stop;
  897. sci_driver.start = gs_start;
  898. sci_driver.hangup = gs_hangup;
  899. #ifdef CONFIG_PROC_FS
  900. sci_driver.read_proc = sci_read_proc;
  901. #endif
  902. sci_callout_driver = sci_driver;
  903. #ifdef CONFIG_DEVFS_FS
  904. sci_callout_driver.name = "cusc/%d";
  905. #else
  906. sci_callout_driver.name = "cusc";
  907. #endif
  908. sci_callout_driver.major = SCI_MAJOR+1;
  909. sci_callout_driver.subtype = SERIAL_TYPE_CALLOUT;
  910. sci_callout_driver.read_proc = NULL;
  911. if ((error = tty_register_driver(&sci_driver))) {
  912. printk(KERN_ERR "sci: Couldn't register SCI driver, error = %dn",
  913.        error);
  914. return 1;
  915. }
  916. if ((error = tty_register_driver(&sci_callout_driver))) {
  917. tty_unregister_driver(&sci_driver);
  918. printk(KERN_ERR "sci: Couldn't register SCI callout driver, error = %dn",
  919.        error);
  920. return 1;
  921. }
  922. for (port = &sci_ports[0]; port < &sci_ports[SCI_NPORTS]; port++) {
  923. port->gs.callout_termios = sci_callout_driver.init_termios;
  924. port->gs.normal_termios = sci_driver.init_termios;
  925. port->gs.magic = SCI_MAGIC;
  926. port->gs.close_delay = HZ/2;
  927. port->gs.closing_wait = 30 * HZ;
  928. port->gs.rd = &sci_real_driver;
  929. init_waitqueue_head(&port->gs.open_wait);
  930. init_waitqueue_head(&port->gs.close_wait);
  931. port->old_cflag = 0;
  932. port->icount.cts = port->icount.dsr = 
  933. port->icount.rng = port->icount.dcd = 0;
  934. port->icount.rx = port->icount.tx = 0;
  935. port->icount.frame = port->icount.parity = 0;
  936. port->icount.overrun = port->icount.brk = 0;
  937. }
  938. return 0;
  939. }
  940. static int sci_request_irq(struct sci_port *port)
  941. {
  942. int i;
  943. void (*handlers[4])(int irq, void *ptr, struct pt_regs *regs) = {
  944. sci_er_interrupt, sci_rx_interrupt, sci_tx_interrupt,
  945. sci_br_interrupt,
  946. };
  947. for (i=0; i<4; i++) {
  948. if (!port->irqs[i]) continue;
  949. if (request_irq(port->irqs[i], handlers[i], SA_INTERRUPT,
  950. "sci", port)) {
  951. printk(KERN_ERR "sci: Cannot allocate irq.n");
  952. return -ENODEV;
  953. }
  954. }
  955. return 0;
  956. }
  957. static void sci_free_irq(struct sci_port *port)
  958. {
  959. int i;
  960. for (i=0; i<4; i++) {
  961. if (!port->irqs[i]) continue;
  962. free_irq(port->irqs[i], port);
  963. }
  964. }
  965. static char banner[] __initdata =
  966. KERN_INFO "SuperH SCI(F) driver initializedn";
  967. int __init sci_init(void)
  968. {
  969. struct sci_port *port;
  970. int j;
  971. printk("%s", banner);
  972. for (j=0; j<SCI_NPORTS; j++) {
  973. port = &sci_ports[j];
  974. printk(KERN_INFO "ttySC%d at 0x%08x is a %sn", j, port->base,
  975.        (port->type == PORT_SCI) ? "SCI" : "SCIF");
  976. }
  977. sci_init_drivers();
  978. #ifdef CONFIG_SH_STANDARD_BIOS
  979. sh_bios_gdb_detach();
  980. #endif
  981. return 0; /* Return -EIO when not detected */
  982. }
  983. module_init(sci_init);
  984. #ifdef MODULE
  985. #undef func_enter
  986. #undef func_exit
  987. void cleanup_module(void)
  988. {
  989. tty_unregister_driver(&sci_driver);
  990. tty_unregister_driver(&sci_callout_driver);
  991. }
  992. #include "generic_serial.c"
  993. #endif
  994. #ifdef CONFIG_SERIAL_CONSOLE
  995. /*
  996.  * Print a string to the serial port trying not to disturb
  997.  * any possible real use of the port...
  998.  */
  999. static void serial_console_write(struct console *co, const char *s,
  1000.  unsigned count)
  1001. {
  1002. put_string(sercons_port, s, count);
  1003. }
  1004. /*
  1005.  * Receive character from the serial port
  1006.  */
  1007. static int serial_console_wait_key(struct console *co)
  1008. {
  1009. /* Not implemented yet */
  1010. return 0;
  1011. }
  1012. static kdev_t serial_console_device(struct console *c)
  1013. {
  1014. return MKDEV(SCI_MAJOR, SCI_MINOR_START + c->index);
  1015. }
  1016. /*
  1017.  * Setup initial baud/bits/parity. We do two things here:
  1018.  * - construct a cflag setting for the first rs_open()
  1019.  * - initialize the serial port
  1020.  * Return non-zero if we didn't find a serial port.
  1021.  */
  1022. static int __init serial_console_setup(struct console *co, char *options)
  1023. {
  1024. int baud = 9600;
  1025. int bits = 8;
  1026. int parity = 'n';
  1027. int cflag = CREAD | HUPCL | CLOCAL;
  1028. char *s;
  1029. sercons_port = &sci_ports[co->index];
  1030. if (options) {
  1031. baud = simple_strtoul(options, NULL, 10);
  1032. s = options;
  1033. while(*s >= '0' && *s <= '9')
  1034. s++;
  1035. if (*s) parity = *s++;
  1036. if (*s) bits   = *s - '0';
  1037. }
  1038. /*
  1039.  * Now construct a cflag setting.
  1040.  */
  1041. switch (baud) {
  1042. case 19200:
  1043. cflag |= B19200;
  1044. break;
  1045. case 38400:
  1046. cflag |= B38400;
  1047. break;
  1048. case 57600:
  1049. cflag |= B57600;
  1050. break;
  1051. case 115200:
  1052. cflag |= B115200;
  1053. break;
  1054. case 9600:
  1055. default:
  1056. cflag |= B9600;
  1057. baud = 9600;
  1058. break;
  1059. }
  1060. switch (bits) {
  1061. case 7:
  1062. cflag |= CS7;
  1063. break;
  1064. default:
  1065. case 8:
  1066. cflag |= CS8;
  1067. break;
  1068. }
  1069. switch (parity) {
  1070. case 'o': case 'O':
  1071. cflag |= PARODD;
  1072. break;
  1073. case 'e': case 'E':
  1074. cflag |= PARENB;
  1075. break;
  1076. }
  1077. co->cflag = cflag;
  1078. sercons_baud = baud;
  1079. sci_set_termios_cflag(sercons_port, cflag, baud);
  1080. sercons_port->old_cflag = cflag;
  1081. return 0;
  1082. }
  1083. static struct console sercons = {
  1084. name: "ttySC",
  1085. write: serial_console_write,
  1086. device: serial_console_device,
  1087. wait_key: serial_console_wait_key,
  1088. setup: serial_console_setup,
  1089. flags: CON_PRINTBUFFER,
  1090. index: -1,
  1091. };
  1092. /*
  1093.  * Register console.
  1094.  */
  1095. #ifdef CONFIG_SH_EARLY_PRINTK
  1096. extern void sh_console_unregister (void);
  1097. #endif
  1098. void __init sci_console_init(void)
  1099. {
  1100. register_console(&sercons);
  1101. #ifdef CONFIG_SH_EARLY_PRINTK
  1102. /* Now that the real console is available, unregister the one we
  1103.  * used while first booting.
  1104.  */
  1105. sh_console_unregister();
  1106. #endif
  1107. }
  1108. #endif /* CONFIG_SERIAL_CONSOLE */