serial_sh.c 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * SuperH SCIF device driver.
  4. * Copyright (C) 2013 Renesas Electronics Corporation
  5. * Copyright (C) 2007,2008,2010, 2014 Nobuhiro Iwamatsu
  6. * Copyright (C) 2002 - 2008 Paul Mundt
  7. */
  8. #include <common.h>
  9. #include <errno.h>
  10. #include <clk.h>
  11. #include <dm.h>
  12. #include <asm/global_data.h>
  13. #include <asm/io.h>
  14. #include <asm/processor.h>
  15. #include <serial.h>
  16. #include <linux/compiler.h>
  17. #include <dm/platform_data/serial_sh.h>
  18. #include <linux/delay.h>
  19. #include "serial_sh.h"
  20. DECLARE_GLOBAL_DATA_PTR;
  21. #if defined(CONFIG_CPU_SH7780)
  22. static int scif_rxfill(struct uart_port *port)
  23. {
  24. return sci_in(port, SCRFDR) & 0xff;
  25. }
  26. #elif defined(CONFIG_CPU_SH7763)
  27. static int scif_rxfill(struct uart_port *port)
  28. {
  29. if ((port->mapbase == 0xffe00000) ||
  30. (port->mapbase == 0xffe08000)) {
  31. /* SCIF0/1*/
  32. return sci_in(port, SCRFDR) & 0xff;
  33. } else {
  34. /* SCIF2 */
  35. return sci_in(port, SCFDR) & SCIF2_RFDC_MASK;
  36. }
  37. }
  38. #else
  39. static int scif_rxfill(struct uart_port *port)
  40. {
  41. return sci_in(port, SCFDR) & SCIF_RFDC_MASK;
  42. }
  43. #endif
  44. static void sh_serial_init_generic(struct uart_port *port)
  45. {
  46. sci_out(port, SCSCR , SCSCR_INIT(port));
  47. sci_out(port, SCSCR , SCSCR_INIT(port));
  48. sci_out(port, SCSMR, 0);
  49. sci_out(port, SCSMR, 0);
  50. sci_out(port, SCFCR, SCFCR_RFRST|SCFCR_TFRST);
  51. sci_in(port, SCFCR);
  52. sci_out(port, SCFCR, 0);
  53. #if defined(CONFIG_RZA1)
  54. sci_out(port, SCSPTR, 0x0003);
  55. #endif
  56. if (port->type == PORT_HSCIF)
  57. sci_out(port, HSSRR, HSSRR_SRE | HSSRR_SRCYC8);
  58. }
  59. static void
  60. sh_serial_setbrg_generic(struct uart_port *port, int clk, int baudrate)
  61. {
  62. if (port->clk_mode == EXT_CLK) {
  63. unsigned short dl = DL_VALUE(baudrate, clk);
  64. sci_out(port, DL, dl);
  65. /* Need wait: Clock * 1/dl * 1/16 */
  66. udelay((1000000 * dl * 16 / clk) * 1000 + 1);
  67. } else {
  68. sci_out(port, SCBRR, SCBRR_VALUE(baudrate, clk));
  69. }
  70. }
  71. static void handle_error(struct uart_port *port)
  72. {
  73. sci_in(port, SCxSR);
  74. sci_out(port, SCxSR, SCxSR_ERROR_CLEAR(port));
  75. sci_in(port, SCLSR);
  76. sci_out(port, SCLSR, 0x00);
  77. }
  78. static int serial_raw_putc(struct uart_port *port, const char c)
  79. {
  80. /* Tx fifo is empty */
  81. if (!(sci_in(port, SCxSR) & SCxSR_TEND(port)))
  82. return -EAGAIN;
  83. sci_out(port, SCxTDR, c);
  84. sci_out(port, SCxSR, sci_in(port, SCxSR) & ~SCxSR_TEND(port));
  85. return 0;
  86. }
  87. static int serial_rx_fifo_level(struct uart_port *port)
  88. {
  89. return scif_rxfill(port);
  90. }
  91. static int sh_serial_tstc_generic(struct uart_port *port)
  92. {
  93. if (sci_in(port, SCxSR) & SCIF_ERRORS) {
  94. handle_error(port);
  95. return 0;
  96. }
  97. return serial_rx_fifo_level(port) ? 1 : 0;
  98. }
  99. static int serial_getc_check(struct uart_port *port)
  100. {
  101. unsigned short status;
  102. status = sci_in(port, SCxSR);
  103. if (status & SCIF_ERRORS)
  104. handle_error(port);
  105. if (sci_in(port, SCLSR) & SCxSR_ORER(port))
  106. handle_error(port);
  107. status &= (SCIF_DR | SCxSR_RDxF(port));
  108. if (status)
  109. return status;
  110. return scif_rxfill(port);
  111. }
  112. static int sh_serial_getc_generic(struct uart_port *port)
  113. {
  114. unsigned short status;
  115. char ch;
  116. if (!serial_getc_check(port))
  117. return -EAGAIN;
  118. ch = sci_in(port, SCxRDR);
  119. status = sci_in(port, SCxSR);
  120. sci_out(port, SCxSR, SCxSR_RDxF_CLEAR(port));
  121. if (status & SCIF_ERRORS)
  122. handle_error(port);
  123. if (sci_in(port, SCLSR) & SCxSR_ORER(port))
  124. handle_error(port);
  125. return ch;
  126. }
  127. #if CONFIG_IS_ENABLED(DM_SERIAL)
  128. static int sh_serial_pending(struct udevice *dev, bool input)
  129. {
  130. struct uart_port *priv = dev_get_priv(dev);
  131. return sh_serial_tstc_generic(priv);
  132. }
  133. static int sh_serial_putc(struct udevice *dev, const char ch)
  134. {
  135. struct uart_port *priv = dev_get_priv(dev);
  136. return serial_raw_putc(priv, ch);
  137. }
  138. static int sh_serial_getc(struct udevice *dev)
  139. {
  140. struct uart_port *priv = dev_get_priv(dev);
  141. return sh_serial_getc_generic(priv);
  142. }
  143. static int sh_serial_setbrg(struct udevice *dev, int baudrate)
  144. {
  145. struct sh_serial_plat *plat = dev_get_plat(dev);
  146. struct uart_port *priv = dev_get_priv(dev);
  147. sh_serial_setbrg_generic(priv, plat->clk, baudrate);
  148. return 0;
  149. }
  150. static int sh_serial_probe(struct udevice *dev)
  151. {
  152. struct sh_serial_plat *plat = dev_get_plat(dev);
  153. struct uart_port *priv = dev_get_priv(dev);
  154. priv->membase = (unsigned char *)plat->base;
  155. priv->mapbase = plat->base;
  156. priv->type = plat->type;
  157. priv->clk_mode = plat->clk_mode;
  158. sh_serial_init_generic(priv);
  159. return 0;
  160. }
  161. static const struct dm_serial_ops sh_serial_ops = {
  162. .putc = sh_serial_putc,
  163. .pending = sh_serial_pending,
  164. .getc = sh_serial_getc,
  165. .setbrg = sh_serial_setbrg,
  166. };
  167. #if CONFIG_IS_ENABLED(OF_CONTROL)
  168. static const struct udevice_id sh_serial_id[] ={
  169. {.compatible = "renesas,sci", .data = PORT_SCI},
  170. {.compatible = "renesas,scif", .data = PORT_SCIF},
  171. {.compatible = "renesas,scifa", .data = PORT_SCIFA},
  172. {.compatible = "renesas,hscif", .data = PORT_HSCIF},
  173. {}
  174. };
  175. static int sh_serial_of_to_plat(struct udevice *dev)
  176. {
  177. struct sh_serial_plat *plat = dev_get_plat(dev);
  178. struct clk sh_serial_clk;
  179. fdt_addr_t addr;
  180. int ret;
  181. addr = dev_read_addr(dev);
  182. if (!addr)
  183. return -EINVAL;
  184. plat->base = addr;
  185. ret = clk_get_by_name(dev, "fck", &sh_serial_clk);
  186. if (!ret) {
  187. ret = clk_enable(&sh_serial_clk);
  188. if (!ret)
  189. plat->clk = clk_get_rate(&sh_serial_clk);
  190. } else {
  191. plat->clk = fdtdec_get_int(gd->fdt_blob, dev_of_offset(dev),
  192. "clock", 1);
  193. }
  194. plat->type = dev_get_driver_data(dev);
  195. return 0;
  196. }
  197. #endif
  198. U_BOOT_DRIVER(serial_sh) = {
  199. .name = "serial_sh",
  200. .id = UCLASS_SERIAL,
  201. .of_match = of_match_ptr(sh_serial_id),
  202. .of_to_plat = of_match_ptr(sh_serial_of_to_plat),
  203. .plat_auto = sizeof(struct sh_serial_plat),
  204. .probe = sh_serial_probe,
  205. .ops = &sh_serial_ops,
  206. #if !CONFIG_IS_ENABLED(OF_CONTROL)
  207. .flags = DM_FLAG_PRE_RELOC,
  208. #endif
  209. .priv_auto = sizeof(struct uart_port),
  210. };
  211. #endif
  212. #if !CONFIG_IS_ENABLED(DM_SERIAL) || IS_ENABLED(CONFIG_DEBUG_UART_SCIF)
  213. #if defined(CFG_SCIF_A)
  214. #define SCIF_BASE_PORT PORT_SCIFA
  215. #elif defined(CFG_SCI)
  216. #define SCIF_BASE_PORT PORT_SCI
  217. #elif defined(CFG_HSCIF)
  218. #define SCIF_BASE_PORT PORT_HSCIF
  219. #else
  220. #define SCIF_BASE_PORT PORT_SCIF
  221. #endif
  222. static void sh_serial_init_nodm(struct uart_port *port)
  223. {
  224. sh_serial_init_generic(port);
  225. serial_setbrg();
  226. }
  227. static void sh_serial_putc_nondm(struct uart_port *port, const char c)
  228. {
  229. if (c == '\n') {
  230. while (1) {
  231. if (serial_raw_putc(port, '\r') != -EAGAIN)
  232. break;
  233. }
  234. }
  235. while (1) {
  236. if (serial_raw_putc(port, c) != -EAGAIN)
  237. break;
  238. }
  239. }
  240. #endif
  241. #if !CONFIG_IS_ENABLED(DM_SERIAL)
  242. #if defined(CONFIG_CONS_SCIF0)
  243. # define SCIF_BASE SCIF0_BASE
  244. #elif defined(CONFIG_CONS_SCIF1)
  245. # define SCIF_BASE SCIF1_BASE
  246. #elif defined(CONFIG_CONS_SCIF2)
  247. # define SCIF_BASE SCIF2_BASE
  248. #elif defined(CONFIG_CONS_SCIF3)
  249. # define SCIF_BASE SCIF3_BASE
  250. #elif defined(CONFIG_CONS_SCIF4)
  251. # define SCIF_BASE SCIF4_BASE
  252. #elif defined(CONFIG_CONS_SCIF5)
  253. # define SCIF_BASE SCIF5_BASE
  254. #elif defined(CONFIG_CONS_SCIF6)
  255. # define SCIF_BASE SCIF6_BASE
  256. #elif defined(CONFIG_CONS_SCIF7)
  257. # define SCIF_BASE SCIF7_BASE
  258. #elif defined(CONFIG_CONS_SCIFA0)
  259. # define SCIF_BASE SCIFA0_BASE
  260. #else
  261. # error "Default SCIF doesn't set....."
  262. #endif
  263. static struct uart_port sh_sci = {
  264. .membase = (unsigned char *)SCIF_BASE,
  265. .mapbase = SCIF_BASE,
  266. .type = SCIF_BASE_PORT,
  267. #ifdef CFG_SCIF_USE_EXT_CLK
  268. .clk_mode = EXT_CLK,
  269. #endif
  270. };
  271. static void sh_serial_setbrg(void)
  272. {
  273. DECLARE_GLOBAL_DATA_PTR;
  274. struct uart_port *port = &sh_sci;
  275. sh_serial_setbrg_generic(port, CONFIG_SH_SCIF_CLK_FREQ, gd->baudrate);
  276. }
  277. static int sh_serial_init(void)
  278. {
  279. sh_serial_init_nodm(&sh_sci);
  280. return 0;
  281. }
  282. static void sh_serial_putc(const char c)
  283. {
  284. sh_serial_putc_nondm(&sh_sci, c);
  285. }
  286. static int sh_serial_tstc(void)
  287. {
  288. struct uart_port *port = &sh_sci;
  289. return sh_serial_tstc_generic(port);
  290. }
  291. static int sh_serial_getc(void)
  292. {
  293. struct uart_port *port = &sh_sci;
  294. int ch;
  295. while (1) {
  296. ch = sh_serial_getc_generic(port);
  297. if (ch != -EAGAIN)
  298. break;
  299. }
  300. return ch;
  301. }
  302. static struct serial_device sh_serial_drv = {
  303. .name = "sh_serial",
  304. .start = sh_serial_init,
  305. .stop = NULL,
  306. .setbrg = sh_serial_setbrg,
  307. .putc = sh_serial_putc,
  308. .puts = default_serial_puts,
  309. .getc = sh_serial_getc,
  310. .tstc = sh_serial_tstc,
  311. };
  312. void sh_serial_initialize(void)
  313. {
  314. serial_register(&sh_serial_drv);
  315. }
  316. __weak struct serial_device *default_serial_console(void)
  317. {
  318. return &sh_serial_drv;
  319. }
  320. #endif /* CONFIG_DM_SERIAL */
  321. #ifdef CONFIG_DEBUG_UART_SCIF
  322. #include <debug_uart.h>
  323. static struct uart_port debug_uart_sci = {
  324. .membase = (unsigned char *)CONFIG_DEBUG_UART_BASE,
  325. .mapbase = CONFIG_DEBUG_UART_BASE,
  326. .type = SCIF_BASE_PORT,
  327. #ifdef CFG_SCIF_USE_EXT_CLK
  328. .clk_mode = EXT_CLK,
  329. #endif
  330. };
  331. static inline void _debug_uart_init(void)
  332. {
  333. sh_serial_init_nodm(&debug_uart_sci);
  334. }
  335. static inline void _debug_uart_putc(int c)
  336. {
  337. sh_serial_putc_nondm(&debug_uart_sci, c);
  338. }
  339. DEBUG_UART_FUNCS
  340. #endif