diff options
author | Paul Mundt <lethal@linux-sh.org> | 2006-02-01 06:06:06 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-02-01 11:53:20 -0500 |
commit | b7a76e4b4e212ec0829f3a7243064511d62cb6da (patch) | |
tree | 37a4be476a1a85a119131f88bc637e2628b1a75d /drivers/serial/sh-sci.c | |
parent | 37cc7943788c841b03a48c00751dfac0ad9f5b12 (diff) |
[PATCH] sh: sh-sci clock framework updates
A couple of updates for the sh-sci serial driver:
- Update for clock framework on sh.
- Fix a compile error introduced by some h8300 changes.
- Add SH7770/SH7780 subtype support.
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers/serial/sh-sci.c')
-rw-r--r-- | drivers/serial/sh-sci.c | 225 |
1 files changed, 157 insertions, 68 deletions
diff --git a/drivers/serial/sh-sci.c b/drivers/serial/sh-sci.c index 0111206327ca..80737c131ce7 100644 --- a/drivers/serial/sh-sci.c +++ b/drivers/serial/sh-sci.c | |||
@@ -42,6 +42,7 @@ | |||
42 | #include <linux/delay.h> | 42 | #include <linux/delay.h> |
43 | #include <linux/console.h> | 43 | #include <linux/console.h> |
44 | #include <linux/bitops.h> | 44 | #include <linux/bitops.h> |
45 | #include <linux/generic_serial.h> | ||
45 | 46 | ||
46 | #ifdef CONFIG_CPU_FREQ | 47 | #ifdef CONFIG_CPU_FREQ |
47 | #include <linux/notifier.h> | 48 | #include <linux/notifier.h> |
@@ -53,7 +54,9 @@ | |||
53 | #include <asm/irq.h> | 54 | #include <asm/irq.h> |
54 | #include <asm/uaccess.h> | 55 | #include <asm/uaccess.h> |
55 | 56 | ||
56 | #include <linux/generic_serial.h> | 57 | #if defined(CONFIG_SUPERH) && !defined(CONFIG_SUPERH64) |
58 | #include <asm/clock.h> | ||
59 | #endif | ||
57 | 60 | ||
58 | #ifdef CONFIG_SH_STANDARD_BIOS | 61 | #ifdef CONFIG_SH_STANDARD_BIOS |
59 | #include <asm/sh_bios.h> | 62 | #include <asm/sh_bios.h> |
@@ -86,9 +89,11 @@ static void sci_stop_rx(struct uart_port *port); | |||
86 | static int sci_request_irq(struct sci_port *port); | 89 | static int sci_request_irq(struct sci_port *port); |
87 | static void sci_free_irq(struct sci_port *port); | 90 | static void sci_free_irq(struct sci_port *port); |
88 | 91 | ||
89 | static struct sci_port sci_ports[SCI_NPORTS]; | 92 | static struct sci_port sci_ports[]; |
90 | static struct uart_driver sci_uart_driver; | 93 | static struct uart_driver sci_uart_driver; |
91 | 94 | ||
95 | #define SCI_NPORTS sci_uart_driver.nr | ||
96 | |||
92 | #if defined(CONFIG_SH_STANDARD_BIOS) || defined(CONFIG_SH_KGDB) | 97 | #if defined(CONFIG_SH_STANDARD_BIOS) || defined(CONFIG_SH_KGDB) |
93 | 98 | ||
94 | static void handle_error(struct uart_port *port) | 99 | static void handle_error(struct uart_port *port) |
@@ -168,7 +173,7 @@ static void put_string(struct sci_port *sci_port, const char *buffer, int count) | |||
168 | int usegdb=0; | 173 | int usegdb=0; |
169 | 174 | ||
170 | #ifdef CONFIG_SH_STANDARD_BIOS | 175 | #ifdef CONFIG_SH_STANDARD_BIOS |
171 | /* This call only does a trap the first time it is | 176 | /* This call only does a trap the first time it is |
172 | * called, and so is safe to do here unconditionally | 177 | * called, and so is safe to do here unconditionally |
173 | */ | 178 | */ |
174 | usegdb |= sh_bios_in_gdb_mode(); | 179 | usegdb |= sh_bios_in_gdb_mode(); |
@@ -324,47 +329,46 @@ static void sci_init_pins_sci(struct uart_port* port, unsigned int cflag) | |||
324 | /* tx mark output*/ | 329 | /* tx mark output*/ |
325 | H8300_SCI_DR(ch) |= h8300_sci_pins[ch].tx; | 330 | H8300_SCI_DR(ch) |= h8300_sci_pins[ch].tx; |
326 | } | 331 | } |
327 | #else | ||
328 | static void sci_init_pins_sci(struct uart_port *port, unsigned int cflag) | ||
329 | { | ||
330 | } | ||
331 | #endif | 332 | #endif |
332 | #endif | 333 | #endif |
333 | 334 | ||
334 | #if defined(SCIF_ONLY) || defined(SCI_AND_SCIF) | 335 | #if defined(SCIF_ONLY) || defined(SCI_AND_SCIF) |
335 | #if defined(CONFIG_CPU_SH3) | 336 | #if defined(CONFIG_CPU_SUBTYPE_SH7300) |
336 | /* For SH7705, SH7707, SH7709, SH7709A, SH7729, SH7300*/ | 337 | /* SH7300 doesn't use RTS/CTS */ |
338 | static void sci_init_pins_scif(struct uart_port *port, unsigned int cflag) | ||
339 | { | ||
340 | sci_out(port, SCFCR, 0); | ||
341 | } | ||
342 | #elif defined(CONFIG_CPU_SH3) | ||
343 | /* For SH7705, SH7707, SH7709, SH7709A, SH7729 */ | ||
337 | static void sci_init_pins_scif(struct uart_port *port, unsigned int cflag) | 344 | static void sci_init_pins_scif(struct uart_port *port, unsigned int cflag) |
338 | { | 345 | { |
339 | unsigned int fcr_val = 0; | 346 | unsigned int fcr_val = 0; |
340 | #if !defined(CONFIG_CPU_SUBTYPE_SH7300) /* SH7300 doesn't use RTS/CTS */ | 347 | unsigned short data; |
341 | { | 348 | |
342 | unsigned short data; | 349 | /* We need to set SCPCR to enable RTS/CTS */ |
350 | data = ctrl_inw(SCPCR); | ||
351 | /* Clear out SCP7MD1,0, SCP6MD1,0, SCP4MD1,0*/ | ||
352 | ctrl_outw(data & 0x0fcf, SCPCR); | ||
343 | 353 | ||
344 | /* We need to set SCPCR to enable RTS/CTS */ | ||
345 | data = ctrl_inw(SCPCR); | ||
346 | /* Clear out SCP7MD1,0, SCP6MD1,0, SCP4MD1,0*/ | ||
347 | ctrl_outw(data&0x0fcf, SCPCR); | ||
348 | } | ||
349 | if (cflag & CRTSCTS) | 354 | if (cflag & CRTSCTS) |
350 | fcr_val |= SCFCR_MCE; | 355 | fcr_val |= SCFCR_MCE; |
351 | else { | 356 | else { |
352 | unsigned short data; | ||
353 | |||
354 | /* We need to set SCPCR to enable RTS/CTS */ | 357 | /* We need to set SCPCR to enable RTS/CTS */ |
355 | data = ctrl_inw(SCPCR); | 358 | data = ctrl_inw(SCPCR); |
356 | /* Clear out SCP7MD1,0, SCP4MD1,0, | 359 | /* Clear out SCP7MD1,0, SCP4MD1,0, |
357 | Set SCP6MD1,0 = {01} (output) */ | 360 | Set SCP6MD1,0 = {01} (output) */ |
358 | ctrl_outw((data&0x0fcf)|0x1000, SCPCR); | 361 | ctrl_outw((data & 0x0fcf) | 0x1000, SCPCR); |
359 | 362 | ||
360 | data = ctrl_inb(SCPDR); | 363 | data = ctrl_inb(SCPDR); |
361 | /* Set /RTS2 (bit6) = 0 */ | 364 | /* Set /RTS2 (bit6) = 0 */ |
362 | ctrl_outb(data&0xbf, SCPDR); | 365 | ctrl_outb(data & 0xbf, SCPDR); |
363 | } | 366 | } |
364 | #endif | 367 | |
365 | sci_out(port, SCFCR, fcr_val); | 368 | sci_out(port, SCFCR, fcr_val); |
366 | } | 369 | } |
367 | 370 | ||
371 | #if defined(CONFIG_CPU_SUBTYPE_SH7707) || defined(CONFIG_CPU_SUBTYPE_SH7709) | ||
368 | static void sci_init_pins_irda(struct uart_port *port, unsigned int cflag) | 372 | static void sci_init_pins_irda(struct uart_port *port, unsigned int cflag) |
369 | { | 373 | { |
370 | unsigned int fcr_val = 0; | 374 | unsigned int fcr_val = 0; |
@@ -374,7 +378,7 @@ static void sci_init_pins_irda(struct uart_port *port, unsigned int cflag) | |||
374 | 378 | ||
375 | sci_out(port, SCFCR, fcr_val); | 379 | sci_out(port, SCFCR, fcr_val); |
376 | } | 380 | } |
377 | 381 | #endif | |
378 | #else | 382 | #else |
379 | 383 | ||
380 | /* For SH7750 */ | 384 | /* For SH7750 */ |
@@ -385,7 +389,11 @@ static void sci_init_pins_scif(struct uart_port *port, unsigned int cflag) | |||
385 | if (cflag & CRTSCTS) { | 389 | if (cflag & CRTSCTS) { |
386 | fcr_val |= SCFCR_MCE; | 390 | fcr_val |= SCFCR_MCE; |
387 | } else { | 391 | } else { |
392 | #ifdef CONFIG_CPU_SUBTYPE_SH7780 | ||
393 | ctrl_outw(0x0080, SCSPTR0); /* Set RTS = 1 */ | ||
394 | #else | ||
388 | ctrl_outw(0x0080, SCSPTR2); /* Set RTS = 1 */ | 395 | ctrl_outw(0x0080, SCSPTR2); /* Set RTS = 1 */ |
396 | #endif | ||
389 | } | 397 | } |
390 | sci_out(port, SCFCR, fcr_val); | 398 | sci_out(port, SCFCR, fcr_val); |
391 | } | 399 | } |
@@ -422,7 +430,11 @@ static void sci_transmit_chars(struct uart_port *port) | |||
422 | 430 | ||
423 | #if !defined(SCI_ONLY) | 431 | #if !defined(SCI_ONLY) |
424 | if (port->type == PORT_SCIF) { | 432 | if (port->type == PORT_SCIF) { |
433 | #if defined(CONFIG_CPU_SUBTYPE_SH7760) || defined(CONFIG_CPU_SUBTYPE_SH7780) | ||
434 | txroom = SCIF_TXROOM_MAX - (sci_in(port, SCTFDR) & 0x7f); | ||
435 | #else | ||
425 | txroom = SCIF_TXROOM_MAX - (sci_in(port, SCFDR)>>8); | 436 | txroom = SCIF_TXROOM_MAX - (sci_in(port, SCFDR)>>8); |
437 | #endif | ||
426 | } else { | 438 | } else { |
427 | txroom = (sci_in(port, SCxSR) & SCI_TDRE)?1:0; | 439 | txroom = (sci_in(port, SCxSR) & SCI_TDRE)?1:0; |
428 | } | 440 | } |
@@ -491,7 +503,11 @@ static inline void sci_receive_chars(struct uart_port *port, | |||
491 | while (1) { | 503 | while (1) { |
492 | #if !defined(SCI_ONLY) | 504 | #if !defined(SCI_ONLY) |
493 | if (port->type == PORT_SCIF) { | 505 | if (port->type == PORT_SCIF) { |
506 | #if defined(CONFIG_CPU_SUBTYPE_SH7760) || defined(CONFIG_CPU_SUBTYPE_SH7780) | ||
507 | count = sci_in(port, SCRFDR) & 0x7f; | ||
508 | #else | ||
494 | count = sci_in(port, SCFDR)&SCIF_RFDC_MASK ; | 509 | count = sci_in(port, SCFDR)&SCIF_RFDC_MASK ; |
510 | #endif | ||
495 | } else { | 511 | } else { |
496 | count = (sci_in(port, SCxSR)&SCxSR_RDxF(port))?1:0; | 512 | count = (sci_in(port, SCxSR)&SCxSR_RDxF(port))?1:0; |
497 | } | 513 | } |
@@ -652,7 +668,7 @@ static inline int sci_handle_breaks(struct uart_port *port) | |||
652 | struct tty_struct *tty = port->info->tty; | 668 | struct tty_struct *tty = port->info->tty; |
653 | struct sci_port *s = &sci_ports[port->line]; | 669 | struct sci_port *s = &sci_ports[port->line]; |
654 | 670 | ||
655 | if (!s->break_flag && status & SCxSR_BRK(port)) | 671 | if (!s->break_flag && status & SCxSR_BRK(port)) { |
656 | #if defined(CONFIG_CPU_SH3) | 672 | #if defined(CONFIG_CPU_SH3) |
657 | /* Debounce break */ | 673 | /* Debounce break */ |
658 | s->break_flag = 1; | 674 | s->break_flag = 1; |
@@ -783,6 +799,7 @@ static int sci_notifier(struct notifier_block *self, unsigned long phase, void * | |||
783 | (phase == CPUFREQ_RESUMECHANGE)){ | 799 | (phase == CPUFREQ_RESUMECHANGE)){ |
784 | for (i = 0; i < SCI_NPORTS; i++) { | 800 | for (i = 0; i < SCI_NPORTS; i++) { |
785 | struct uart_port *port = &sci_ports[i].port; | 801 | struct uart_port *port = &sci_ports[i].port; |
802 | struct clk *clk; | ||
786 | 803 | ||
787 | /* | 804 | /* |
788 | * Update the uartclk per-port if frequency has | 805 | * Update the uartclk per-port if frequency has |
@@ -795,7 +812,9 @@ static int sci_notifier(struct notifier_block *self, unsigned long phase, void * | |||
795 | * | 812 | * |
796 | * Clean this up later.. | 813 | * Clean this up later.. |
797 | */ | 814 | */ |
798 | port->uartclk = current_cpu_data.module_clock * 16; | 815 | clk = clk_get("module_clk"); |
816 | port->uartclk = clk_get_rate(clk) * 16; | ||
817 | clk_put(clk); | ||
799 | } | 818 | } |
800 | 819 | ||
801 | printk("%s: got a postchange notification for cpu %d (old %d, new %d)\n", | 820 | printk("%s: got a postchange notification for cpu %d (old %d, new %d)\n", |
@@ -1008,15 +1027,20 @@ static void sci_set_termios(struct uart_port *port, struct termios *termios, | |||
1008 | sci_out(port, SCSMR, smr_val); | 1027 | sci_out(port, SCSMR, smr_val); |
1009 | 1028 | ||
1010 | switch (baud) { | 1029 | switch (baud) { |
1011 | case 0: t = -1; break; | 1030 | case 0: |
1012 | case 2400: t = BPS_2400; break; | 1031 | t = -1; |
1013 | case 4800: t = BPS_4800; break; | 1032 | break; |
1014 | case 9600: t = BPS_9600; break; | 1033 | default: |
1015 | case 19200: t = BPS_19200; break; | 1034 | { |
1016 | case 38400: t = BPS_38400; break; | 1035 | #if defined(CONFIG_SUPERH) && !defined(CONFIG_SUPERH64) |
1017 | case 57600: t = BPS_57600; break; | 1036 | struct clk *clk = clk_get("module_clk"); |
1018 | case 115200: t = BPS_115200; break; | 1037 | t = SCBRR_VALUE(baud, clk_get_rate(clk)); |
1019 | default: t = SCBRR_VALUE(baud); break; | 1038 | clk_put(clk); |
1039 | #else | ||
1040 | t = SCBRR_VALUE(baud); | ||
1041 | #endif | ||
1042 | } | ||
1043 | break; | ||
1020 | } | 1044 | } |
1021 | 1045 | ||
1022 | if (t > 0) { | 1046 | if (t > 0) { |
@@ -1030,7 +1054,9 @@ static void sci_set_termios(struct uart_port *port, struct termios *termios, | |||
1030 | udelay((1000000+(baud-1)) / baud); /* Wait one bit interval */ | 1054 | udelay((1000000+(baud-1)) / baud); /* Wait one bit interval */ |
1031 | } | 1055 | } |
1032 | 1056 | ||
1033 | s->init_pins(port, termios->c_cflag); | 1057 | if (likely(s->init_pins)) |
1058 | s->init_pins(port, termios->c_cflag); | ||
1059 | |||
1034 | sci_out(port, SCSCR, SCSCR_INIT(port)); | 1060 | sci_out(port, SCSCR, SCSCR_INIT(port)); |
1035 | 1061 | ||
1036 | if ((termios->c_cflag & CREAD) != 0) | 1062 | if ((termios->c_cflag & CREAD) != 0) |
@@ -1107,7 +1133,7 @@ static struct uart_ops sci_uart_ops = { | |||
1107 | .verify_port = sci_verify_port, | 1133 | .verify_port = sci_verify_port, |
1108 | }; | 1134 | }; |
1109 | 1135 | ||
1110 | static struct sci_port sci_ports[SCI_NPORTS] = { | 1136 | static struct sci_port sci_ports[] = { |
1111 | #if defined(CONFIG_CPU_SUBTYPE_SH7708) | 1137 | #if defined(CONFIG_CPU_SUBTYPE_SH7708) |
1112 | { | 1138 | { |
1113 | .port = { | 1139 | .port = { |
@@ -1121,7 +1147,6 @@ static struct sci_port sci_ports[SCI_NPORTS] = { | |||
1121 | }, | 1147 | }, |
1122 | .type = PORT_SCI, | 1148 | .type = PORT_SCI, |
1123 | .irqs = SCI_IRQS, | 1149 | .irqs = SCI_IRQS, |
1124 | .init_pins = sci_init_pins_sci, | ||
1125 | }, | 1150 | }, |
1126 | #elif defined(CONFIG_CPU_SUBTYPE_SH7705) | 1151 | #elif defined(CONFIG_CPU_SUBTYPE_SH7705) |
1127 | { | 1152 | { |
@@ -1165,7 +1190,6 @@ static struct sci_port sci_ports[SCI_NPORTS] = { | |||
1165 | }, | 1190 | }, |
1166 | .type = PORT_SCI, | 1191 | .type = PORT_SCI, |
1167 | .irqs = SCI_IRQS, | 1192 | .irqs = SCI_IRQS, |
1168 | .init_pins = sci_init_pins_sci, | ||
1169 | }, | 1193 | }, |
1170 | { | 1194 | { |
1171 | .port = { | 1195 | .port = { |
@@ -1225,7 +1249,7 @@ static struct sci_port sci_ports[SCI_NPORTS] = { | |||
1225 | .irqs = SH73180_SCIF_IRQS, | 1249 | .irqs = SH73180_SCIF_IRQS, |
1226 | .init_pins = sci_init_pins_scif, | 1250 | .init_pins = sci_init_pins_scif, |
1227 | }, | 1251 | }, |
1228 | #elif defined(CONFIG_SH_RTS7751R2D) | 1252 | #elif defined(CONFIG_CPU_SUBTYPE_SH4_202) |
1229 | { | 1253 | { |
1230 | .port = { | 1254 | .port = { |
1231 | .membase = (void *)0xffe80000, | 1255 | .membase = (void *)0xffe80000, |
@@ -1253,7 +1277,6 @@ static struct sci_port sci_ports[SCI_NPORTS] = { | |||
1253 | }, | 1277 | }, |
1254 | .type = PORT_SCI, | 1278 | .type = PORT_SCI, |
1255 | .irqs = SCI_IRQS, | 1279 | .irqs = SCI_IRQS, |
1256 | .init_pins = sci_init_pins_sci, | ||
1257 | }, | 1280 | }, |
1258 | { | 1281 | { |
1259 | .port = { | 1282 | .port = { |
@@ -1312,21 +1335,6 @@ static struct sci_port sci_ports[SCI_NPORTS] = { | |||
1312 | .irqs = SH7760_SCIF2_IRQS, | 1335 | .irqs = SH7760_SCIF2_IRQS, |
1313 | .init_pins = sci_init_pins_scif, | 1336 | .init_pins = sci_init_pins_scif, |
1314 | }, | 1337 | }, |
1315 | #elif defined(CONFIG_CPU_SUBTYPE_SH4_202) | ||
1316 | { | ||
1317 | .port = { | ||
1318 | .membase = (void *)0xffe80000, | ||
1319 | .mapbase = 0xffe80000, | ||
1320 | .iotype = UPIO_MEM, | ||
1321 | .irq = 43, | ||
1322 | .ops = &sci_uart_ops, | ||
1323 | .flags = UPF_BOOT_AUTOCONF, | ||
1324 | .line = 0, | ||
1325 | }, | ||
1326 | .type = PORT_SCIF, | ||
1327 | .irqs = SH4_SCIF_IRQS, | ||
1328 | .init_pins = sci_init_pins_scif, | ||
1329 | }, | ||
1330 | #elif defined(CONFIG_CPU_SUBTYPE_ST40STB1) | 1338 | #elif defined(CONFIG_CPU_SUBTYPE_ST40STB1) |
1331 | { | 1339 | { |
1332 | .port = { | 1340 | .port = { |
@@ -1455,6 +1463,78 @@ static struct sci_port sci_ports[SCI_NPORTS] = { | |||
1455 | .irqs = H8S_SCI_IRQS2, | 1463 | .irqs = H8S_SCI_IRQS2, |
1456 | .init_pins = sci_init_pins_sci, | 1464 | .init_pins = sci_init_pins_sci, |
1457 | }, | 1465 | }, |
1466 | #elif defined(CONFIG_CPU_SUBTYPE_SH7770) | ||
1467 | { | ||
1468 | .port = { | ||
1469 | .membase = (void *)0xff923000, | ||
1470 | .mapbase = 0xff923000, | ||
1471 | .iotype = SERIAL_IO_MEM, | ||
1472 | .irq = 61, | ||
1473 | .ops = &sci_uart_ops, | ||
1474 | .flags = ASYNC_BOOT_AUTOCONF, | ||
1475 | .line = 0, | ||
1476 | }, | ||
1477 | .type = PORT_SCIF, | ||
1478 | .irqs = SH7770_SCIF0_IRQS, | ||
1479 | .init_pins = sci_init_pins_scif, | ||
1480 | }, | ||
1481 | { | ||
1482 | .port = { | ||
1483 | .membase = (void *)0xff924000, | ||
1484 | .mapbase = 0xff924000, | ||
1485 | .iotype = SERIAL_IO_MEM, | ||
1486 | .irq = 62, | ||
1487 | .ops = &sci_uart_ops, | ||
1488 | .flags = ASYNC_BOOT_AUTOCONF, | ||
1489 | .line = 1, | ||
1490 | }, | ||
1491 | .type = PORT_SCIF, | ||
1492 | .irqs = SH7770_SCIF1_IRQS, | ||
1493 | .init_pins = sci_init_pins_scif, | ||
1494 | }, | ||
1495 | { | ||
1496 | .port = { | ||
1497 | .membase = (void *)0xff925000, | ||
1498 | .mapbase = 0xff925000, | ||
1499 | .iotype = SERIAL_IO_MEM, | ||
1500 | .irq = 63, | ||
1501 | .ops = &sci_uart_ops, | ||
1502 | .flags = ASYNC_BOOT_AUTOCONF, | ||
1503 | .line = 2, | ||
1504 | }, | ||
1505 | .type = PORT_SCIF, | ||
1506 | .irqs = SH7770_SCIF2_IRQS, | ||
1507 | .init_pins = sci_init_pins_scif, | ||
1508 | }, | ||
1509 | #elif defined(CONFIG_CPU_SUBTYPE_SH7780) | ||
1510 | { | ||
1511 | .port = { | ||
1512 | .membase = (void *)0xffe00000, | ||
1513 | .mapbase = 0xffe00000, | ||
1514 | .iotype = SERIAL_IO_MEM, | ||
1515 | .irq = 43, | ||
1516 | .ops = &sci_uart_ops, | ||
1517 | .flags = ASYNC_BOOT_AUTOCONF, | ||
1518 | .line = 0, | ||
1519 | }, | ||
1520 | .type = PORT_SCIF, | ||
1521 | .irqs = SH7780_SCIF0_IRQS, | ||
1522 | .init_pins = sci_init_pins_scif, | ||
1523 | }, | ||
1524 | { | ||
1525 | .port = { | ||
1526 | .membase = (void *)0xffe10000, | ||
1527 | .mapbase = 0xffe10000, | ||
1528 | .iotype = SERIAL_IO_MEM, | ||
1529 | .irq = 79, | ||
1530 | .ops = &sci_uart_ops, | ||
1531 | .flags = ASYNC_BOOT_AUTOCONF, | ||
1532 | .line = 1, | ||
1533 | }, | ||
1534 | .type = PORT_SCIF, | ||
1535 | .irqs = SH7780_SCIF1_IRQS, | ||
1536 | .init_pins = sci_init_pins_scif, | ||
1537 | }, | ||
1458 | #else | 1538 | #else |
1459 | #error "CPU subtype not defined" | 1539 | #error "CPU subtype not defined" |
1460 | #endif | 1540 | #endif |
@@ -1480,9 +1560,6 @@ static int __init serial_console_setup(struct console *co, char *options) | |||
1480 | int flow = 'n'; | 1560 | int flow = 'n'; |
1481 | int ret; | 1561 | int ret; |
1482 | 1562 | ||
1483 | if (co->index >= SCI_NPORTS) | ||
1484 | co->index = 0; | ||
1485 | |||
1486 | serial_console_port = &sci_ports[co->index]; | 1563 | serial_console_port = &sci_ports[co->index]; |
1487 | port = &serial_console_port->port; | 1564 | port = &serial_console_port->port; |
1488 | port->type = serial_console_port->type; | 1565 | port->type = serial_console_port->type; |
@@ -1496,14 +1573,21 @@ static int __init serial_console_setup(struct console *co, char *options) | |||
1496 | * We need to set the initial uartclk here, since otherwise it will | 1573 | * We need to set the initial uartclk here, since otherwise it will |
1497 | * only ever be setup at sci_init() time. | 1574 | * only ever be setup at sci_init() time. |
1498 | */ | 1575 | */ |
1499 | #if !defined(__H8300H__) && !defined(__H8300S__) | 1576 | #if defined(__H8300H__) || defined(__H8300S__) |
1500 | port->uartclk = current_cpu_data.module_clock * 16; | ||
1501 | #else | ||
1502 | port->uartclk = CONFIG_CPU_CLOCK; | 1577 | port->uartclk = CONFIG_CPU_CLOCK; |
1503 | #endif | 1578 | |
1504 | #if defined(__H8300S__) | 1579 | #if defined(__H8300S__) |
1505 | h8300_sci_enable(port, sci_enable); | 1580 | h8300_sci_enable(port, sci_enable); |
1506 | #endif | 1581 | #endif |
1582 | #elif defined(CONFIG_SUPERH64) | ||
1583 | port->uartclk = current_cpu_info.module_clock * 16; | ||
1584 | #else | ||
1585 | { | ||
1586 | struct clk *clk = clk_get("module_clk"); | ||
1587 | port->uartclk = clk_get_rate(clk) * 16; | ||
1588 | clk_put(clk); | ||
1589 | } | ||
1590 | #endif | ||
1507 | if (options) | 1591 | if (options) |
1508 | uart_parse_options(options, &baud, &parity, &bits, &flow); | 1592 | uart_parse_options(options, &baud, &parity, &bits, &flow); |
1509 | 1593 | ||
@@ -1566,7 +1650,7 @@ int __init kgdb_console_setup(struct console *co, char *options) | |||
1566 | int parity = 'n'; | 1650 | int parity = 'n'; |
1567 | int flow = 'n'; | 1651 | int flow = 'n'; |
1568 | 1652 | ||
1569 | if (co->index >= SCI_NPORTS || co->index != kgdb_portnum) | 1653 | if (co->index != kgdb_portnum) |
1570 | co->index = kgdb_portnum; | 1654 | co->index = kgdb_portnum; |
1571 | 1655 | ||
1572 | if (options) | 1656 | if (options) |
@@ -1606,7 +1690,7 @@ console_initcall(kgdb_console_init); | |||
1606 | #elif defined(CONFIG_SERIAL_SH_SCI_CONSOLE) | 1690 | #elif defined(CONFIG_SERIAL_SH_SCI_CONSOLE) |
1607 | #define SCI_CONSOLE &serial_console | 1691 | #define SCI_CONSOLE &serial_console |
1608 | #else | 1692 | #else |
1609 | #define SCI_CONSOLE 0 | 1693 | #define SCI_CONSOLE 0 |
1610 | #endif | 1694 | #endif |
1611 | 1695 | ||
1612 | static char banner[] __initdata = | 1696 | static char banner[] __initdata = |
@@ -1621,7 +1705,6 @@ static struct uart_driver sci_uart_driver = { | |||
1621 | .dev_name = "ttySC", | 1705 | .dev_name = "ttySC", |
1622 | .major = SCI_MAJOR, | 1706 | .major = SCI_MAJOR, |
1623 | .minor = SCI_MINOR_START, | 1707 | .minor = SCI_MINOR_START, |
1624 | .nr = SCI_NPORTS, | ||
1625 | .cons = SCI_CONSOLE, | 1708 | .cons = SCI_CONSOLE, |
1626 | }; | 1709 | }; |
1627 | 1710 | ||
@@ -1631,15 +1714,21 @@ static int __init sci_init(void) | |||
1631 | 1714 | ||
1632 | printk("%s", banner); | 1715 | printk("%s", banner); |
1633 | 1716 | ||
1717 | sci_uart_driver.nr = ARRAY_SIZE(sci_ports); | ||
1718 | |||
1634 | ret = uart_register_driver(&sci_uart_driver); | 1719 | ret = uart_register_driver(&sci_uart_driver); |
1635 | if (ret == 0) { | 1720 | if (ret == 0) { |
1636 | for (chan = 0; chan < SCI_NPORTS; chan++) { | 1721 | for (chan = 0; chan < SCI_NPORTS; chan++) { |
1637 | struct sci_port *sciport = &sci_ports[chan]; | 1722 | struct sci_port *sciport = &sci_ports[chan]; |
1638 | 1723 | ||
1639 | #if !defined(__H8300H__) && !defined(__H8300S__) | 1724 | #if defined(__H8300H__) || defined(__H8300S__) |
1640 | sciport->port.uartclk = (current_cpu_data.module_clock * 16); | ||
1641 | #else | ||
1642 | sciport->port.uartclk = CONFIG_CPU_CLOCK; | 1725 | sciport->port.uartclk = CONFIG_CPU_CLOCK; |
1726 | #elif defined(CONFIG_SUPERH64) | ||
1727 | sciport->port.uartclk = current_cpu_info.module_clock * 16; | ||
1728 | #else | ||
1729 | struct clk *clk = clk_get("module_clk"); | ||
1730 | sciport->port.uartclk = clk_get_rate(clk) * 16; | ||
1731 | clk_put(clk); | ||
1643 | #endif | 1732 | #endif |
1644 | uart_add_one_port(&sci_uart_driver, &sciport->port); | 1733 | uart_add_one_port(&sci_uart_driver, &sciport->port); |
1645 | sciport->break_timer.data = (unsigned long)sciport; | 1734 | sciport->break_timer.data = (unsigned long)sciport; |