diff options
Diffstat (limited to 'drivers/serial/sh-sci.c')
-rw-r--r-- | drivers/serial/sh-sci.c | 130 |
1 files changed, 74 insertions, 56 deletions
diff --git a/drivers/serial/sh-sci.c b/drivers/serial/sh-sci.c index 165fc010978c..31532e97fb96 100644 --- a/drivers/serial/sh-sci.c +++ b/drivers/serial/sh-sci.c | |||
@@ -101,6 +101,12 @@ static void sci_stop_tx(struct uart_port *port); | |||
101 | static struct sci_port sci_ports[SCI_NPORTS]; | 101 | static struct sci_port sci_ports[SCI_NPORTS]; |
102 | static struct uart_driver sci_uart_driver; | 102 | static struct uart_driver sci_uart_driver; |
103 | 103 | ||
104 | static inline struct sci_port * | ||
105 | to_sci_port(struct uart_port *uart) | ||
106 | { | ||
107 | return container_of(uart, struct sci_port, port); | ||
108 | } | ||
109 | |||
104 | #if defined(CONFIG_SERIAL_SH_SCI_CONSOLE) && \ | 110 | #if defined(CONFIG_SERIAL_SH_SCI_CONSOLE) && \ |
105 | defined(CONFIG_SH_STANDARD_BIOS) || defined(CONFIG_SH_KGDB) | 111 | defined(CONFIG_SH_STANDARD_BIOS) || defined(CONFIG_SH_KGDB) |
106 | static inline void handle_error(struct uart_port *port) | 112 | static inline void handle_error(struct uart_port *port) |
@@ -124,7 +130,8 @@ static int get_char(struct uart_port *port) | |||
124 | } | 130 | } |
125 | } while (!(status & SCxSR_RDxF(port))); | 131 | } while (!(status & SCxSR_RDxF(port))); |
126 | c = sci_in(port, SCxRDR); | 132 | c = sci_in(port, SCxRDR); |
127 | sci_in(port, SCxSR); /* Dummy read */ | 133 | /* Dummy read */ |
134 | sci_in(port, SCxSR); | ||
128 | sci_out(port, SCxSR, SCxSR_RDxF_CLEAR(port)); | 135 | sci_out(port, SCxSR, SCxSR_RDxF_CLEAR(port)); |
129 | spin_unlock_irqrestore(&port->lock, flags); | 136 | spin_unlock_irqrestore(&port->lock, flags); |
130 | 137 | ||
@@ -161,7 +168,7 @@ static void put_string(struct sci_port *sci_port, const char *buffer, int count) | |||
161 | 168 | ||
162 | #if defined(CONFIG_SH_STANDARD_BIOS) || defined(CONFIG_SH_KGDB) | 169 | #if defined(CONFIG_SH_STANDARD_BIOS) || defined(CONFIG_SH_KGDB) |
163 | int checksum; | 170 | int checksum; |
164 | int usegdb=0; | 171 | int usegdb = 0; |
165 | 172 | ||
166 | #ifdef CONFIG_SH_STANDARD_BIOS | 173 | #ifdef CONFIG_SH_STANDARD_BIOS |
167 | /* This call only does a trap the first time it is | 174 | /* This call only does a trap the first time it is |
@@ -181,7 +188,8 @@ static void put_string(struct sci_port *sci_port, const char *buffer, int count) | |||
181 | put_char(port, 'O'); /* 'O'utput to console */ | 188 | put_char(port, 'O'); /* 'O'utput to console */ |
182 | checksum = 'O'; | 189 | checksum = 'O'; |
183 | 190 | ||
184 | for (i=0; i<count; i++) { /* Don't use run length encoding */ | 191 | /* Don't use run length encoding */ |
192 | for (i = 0; i < count; i++) { | ||
185 | int h, l; | 193 | int h, l; |
186 | 194 | ||
187 | c = *p++; | 195 | c = *p++; |
@@ -197,7 +205,7 @@ static void put_string(struct sci_port *sci_port, const char *buffer, int count) | |||
197 | } while (get_char(port) != '+'); | 205 | } while (get_char(port) != '+'); |
198 | } else | 206 | } else |
199 | #endif /* CONFIG_SH_STANDARD_BIOS || CONFIG_SH_KGDB */ | 207 | #endif /* CONFIG_SH_STANDARD_BIOS || CONFIG_SH_KGDB */ |
200 | for (i=0; i<count; i++) { | 208 | for (i = 0; i < count; i++) { |
201 | if (*p == 10) | 209 | if (*p == 10) |
202 | put_char(port, '\r'); | 210 | put_char(port, '\r'); |
203 | put_char(port, *p++); | 211 | put_char(port, *p++); |
@@ -208,35 +216,34 @@ static void put_string(struct sci_port *sci_port, const char *buffer, int count) | |||
208 | #ifdef CONFIG_SH_KGDB | 216 | #ifdef CONFIG_SH_KGDB |
209 | static int kgdb_sci_getchar(void) | 217 | static int kgdb_sci_getchar(void) |
210 | { | 218 | { |
211 | int c; | 219 | int c; |
212 | 220 | ||
213 | /* Keep trying to read a character, this could be neater */ | 221 | /* Keep trying to read a character, this could be neater */ |
214 | while ((c = get_char(&kgdb_sci_port->port)) < 0) | 222 | while ((c = get_char(&kgdb_sci_port->port)) < 0) |
215 | cpu_relax(); | 223 | cpu_relax(); |
216 | 224 | ||
217 | return c; | 225 | return c; |
218 | } | 226 | } |
219 | 227 | ||
220 | static inline void kgdb_sci_putchar(int c) | 228 | static inline void kgdb_sci_putchar(int c) |
221 | { | 229 | { |
222 | put_char(&kgdb_sci_port->port, c); | 230 | put_char(&kgdb_sci_port->port, c); |
223 | } | 231 | } |
224 | #endif /* CONFIG_SH_KGDB */ | 232 | #endif /* CONFIG_SH_KGDB */ |
225 | 233 | ||
226 | #if defined(__H8300S__) | 234 | #if defined(__H8300S__) |
227 | enum { sci_disable, sci_enable }; | 235 | enum { sci_disable, sci_enable }; |
228 | 236 | ||
229 | static void h8300_sci_config(struct uart_port* port, unsigned int ctrl) | 237 | static void h8300_sci_config(struct uart_port *port, unsigned int ctrl) |
230 | { | 238 | { |
231 | volatile unsigned char *mstpcrl=(volatile unsigned char *)MSTPCRL; | 239 | volatile unsigned char *mstpcrl = (volatile unsigned char *)MSTPCRL; |
232 | int ch = (port->mapbase - SMR0) >> 3; | 240 | int ch = (port->mapbase - SMR0) >> 3; |
233 | unsigned char mask = 1 << (ch+1); | 241 | unsigned char mask = 1 << (ch+1); |
234 | 242 | ||
235 | if (ctrl == sci_disable) { | 243 | if (ctrl == sci_disable) |
236 | *mstpcrl |= mask; | 244 | *mstpcrl |= mask; |
237 | } else { | 245 | else |
238 | *mstpcrl &= ~mask; | 246 | *mstpcrl &= ~mask; |
239 | } | ||
240 | } | 247 | } |
241 | 248 | ||
242 | static inline void h8300_sci_enable(struct uart_port *port) | 249 | static inline void h8300_sci_enable(struct uart_port *port) |
@@ -251,7 +258,7 @@ static inline void h8300_sci_disable(struct uart_port *port) | |||
251 | #endif | 258 | #endif |
252 | 259 | ||
253 | #if defined(__H8300H__) || defined(__H8300S__) | 260 | #if defined(__H8300H__) || defined(__H8300S__) |
254 | static void sci_init_pins_sci(struct uart_port* port, unsigned int cflag) | 261 | static void sci_init_pins_sci(struct uart_port *port, unsigned int cflag) |
255 | { | 262 | { |
256 | int ch = (port->mapbase - SMR0) >> 3; | 263 | int ch = (port->mapbase - SMR0) >> 3; |
257 | 264 | ||
@@ -285,14 +292,13 @@ static void sci_init_pins_irda(struct uart_port *port, unsigned int cflag) | |||
285 | #endif | 292 | #endif |
286 | 293 | ||
287 | #if defined(CONFIG_CPU_SUBTYPE_SH7710) || defined(CONFIG_CPU_SUBTYPE_SH7712) | 294 | #if defined(CONFIG_CPU_SUBTYPE_SH7710) || defined(CONFIG_CPU_SUBTYPE_SH7712) |
288 | static void sci_init_pins_scif(struct uart_port* port, unsigned int cflag) | 295 | static void sci_init_pins_scif(struct uart_port *port, unsigned int cflag) |
289 | { | 296 | { |
290 | unsigned int fcr_val = 0; | 297 | unsigned int fcr_val = 0; |
291 | 298 | ||
292 | set_sh771x_scif_pfc(port); | 299 | set_sh771x_scif_pfc(port); |
293 | if (cflag & CRTSCTS) { | 300 | if (cflag & CRTSCTS) |
294 | fcr_val |= SCFCR_MCE; | 301 | fcr_val |= SCFCR_MCE; |
295 | } | ||
296 | sci_out(port, SCFCR, fcr_val); | 302 | sci_out(port, SCFCR, fcr_val); |
297 | } | 303 | } |
298 | #elif defined(CONFIG_CPU_SUBTYPE_SH7720) || defined(CONFIG_CPU_SUBTYPE_SH7721) | 304 | #elif defined(CONFIG_CPU_SUBTYPE_SH7720) || defined(CONFIG_CPU_SUBTYPE_SH7721) |
@@ -419,18 +425,26 @@ static inline int scif_rxroom(struct uart_port *port) | |||
419 | #elif defined(CONFIG_CPU_SUBTYPE_SH7763) | 425 | #elif defined(CONFIG_CPU_SUBTYPE_SH7763) |
420 | static inline int scif_txroom(struct uart_port *port) | 426 | static inline int scif_txroom(struct uart_port *port) |
421 | { | 427 | { |
422 | if((port->mapbase == 0xffe00000) || (port->mapbase == 0xffe08000)) /* SCIF0/1*/ | 428 | if ((port->mapbase == 0xffe00000) || |
429 | (port->mapbase == 0xffe08000)) { | ||
430 | /* SCIF0/1*/ | ||
423 | return SCIF_TXROOM_MAX - (sci_in(port, SCTFDR) & 0xff); | 431 | return SCIF_TXROOM_MAX - (sci_in(port, SCTFDR) & 0xff); |
424 | else /* SCIF2 */ | 432 | } else { |
433 | /* SCIF2 */ | ||
425 | return SCIF2_TXROOM_MAX - (sci_in(port, SCFDR) >> 8); | 434 | return SCIF2_TXROOM_MAX - (sci_in(port, SCFDR) >> 8); |
435 | } | ||
426 | } | 436 | } |
427 | 437 | ||
428 | static inline int scif_rxroom(struct uart_port *port) | 438 | static inline int scif_rxroom(struct uart_port *port) |
429 | { | 439 | { |
430 | if((port->mapbase == 0xffe00000) || (port->mapbase == 0xffe08000)) /* SCIF0/1*/ | 440 | if ((port->mapbase == 0xffe00000) || |
441 | (port->mapbase == 0xffe08000)) { | ||
442 | /* SCIF0/1*/ | ||
431 | return sci_in(port, SCRFDR) & 0xff; | 443 | return sci_in(port, SCRFDR) & 0xff; |
432 | else /* SCIF2 */ | 444 | } else { |
445 | /* SCIF2 */ | ||
433 | return sci_in(port, SCFDR) & SCIF2_RFDC_MASK; | 446 | return sci_in(port, SCFDR) & SCIF2_RFDC_MASK; |
447 | } | ||
434 | } | 448 | } |
435 | #else | 449 | #else |
436 | static inline int scif_txroom(struct uart_port *port) | 450 | static inline int scif_txroom(struct uart_port *port) |
@@ -446,12 +460,12 @@ static inline int scif_rxroom(struct uart_port *port) | |||
446 | 460 | ||
447 | static inline int sci_txroom(struct uart_port *port) | 461 | static inline int sci_txroom(struct uart_port *port) |
448 | { | 462 | { |
449 | return ((sci_in(port, SCxSR) & SCI_TDRE) != 0); | 463 | return (sci_in(port, SCxSR) & SCI_TDRE) != 0; |
450 | } | 464 | } |
451 | 465 | ||
452 | static inline int sci_rxroom(struct uart_port *port) | 466 | static inline int sci_rxroom(struct uart_port *port) |
453 | { | 467 | { |
454 | return ((sci_in(port, SCxSR) & SCxSR_RDxF(port)) != 0); | 468 | return (sci_in(port, SCxSR) & SCxSR_RDxF(port)) != 0; |
455 | } | 469 | } |
456 | 470 | ||
457 | /* ********************************************************************** * | 471 | /* ********************************************************************** * |
@@ -469,11 +483,10 @@ static void sci_transmit_chars(struct uart_port *port) | |||
469 | status = sci_in(port, SCxSR); | 483 | status = sci_in(port, SCxSR); |
470 | if (!(status & SCxSR_TDxE(port))) { | 484 | if (!(status & SCxSR_TDxE(port))) { |
471 | ctrl = sci_in(port, SCSCR); | 485 | ctrl = sci_in(port, SCSCR); |
472 | if (uart_circ_empty(xmit)) { | 486 | if (uart_circ_empty(xmit)) |
473 | ctrl &= ~SCI_CTRL_FLAGS_TIE; | 487 | ctrl &= ~SCI_CTRL_FLAGS_TIE; |
474 | } else { | 488 | else |
475 | ctrl |= SCI_CTRL_FLAGS_TIE; | 489 | ctrl |= SCI_CTRL_FLAGS_TIE; |
476 | } | ||
477 | sci_out(port, SCSCR, ctrl); | 490 | sci_out(port, SCSCR, ctrl); |
478 | return; | 491 | return; |
479 | } | 492 | } |
@@ -521,11 +534,11 @@ static void sci_transmit_chars(struct uart_port *port) | |||
521 | } | 534 | } |
522 | 535 | ||
523 | /* On SH3, SCIF may read end-of-break as a space->mark char */ | 536 | /* On SH3, SCIF may read end-of-break as a space->mark char */ |
524 | #define STEPFN(c) ({int __c=(c); (((__c-1)|(__c)) == -1); }) | 537 | #define STEPFN(c) ({int __c = (c); (((__c-1)|(__c)) == -1); }) |
525 | 538 | ||
526 | static inline void sci_receive_chars(struct uart_port *port) | 539 | static inline void sci_receive_chars(struct uart_port *port) |
527 | { | 540 | { |
528 | struct sci_port *sci_port = (struct sci_port *)port; | 541 | struct sci_port *sci_port = to_sci_port(port); |
529 | struct tty_struct *tty = port->info->port.tty; | 542 | struct tty_struct *tty = port->info->port.tty; |
530 | int i, count, copied = 0; | 543 | int i, count, copied = 0; |
531 | unsigned short status; | 544 | unsigned short status; |
@@ -550,13 +563,13 @@ static inline void sci_receive_chars(struct uart_port *port) | |||
550 | 563 | ||
551 | if (port->type == PORT_SCI) { | 564 | if (port->type == PORT_SCI) { |
552 | char c = sci_in(port, SCxRDR); | 565 | char c = sci_in(port, SCxRDR); |
553 | if (uart_handle_sysrq_char(port, c) || sci_port->break_flag) | 566 | if (uart_handle_sysrq_char(port, c) || |
567 | sci_port->break_flag) | ||
554 | count = 0; | 568 | count = 0; |
555 | else { | 569 | else |
556 | tty_insert_flip_char(tty, c, TTY_NORMAL); | 570 | tty_insert_flip_char(tty, c, TTY_NORMAL); |
557 | } | ||
558 | } else { | 571 | } else { |
559 | for (i=0; i<count; i++) { | 572 | for (i = 0; i < count; i++) { |
560 | char c = sci_in(port, SCxRDR); | 573 | char c = sci_in(port, SCxRDR); |
561 | status = sci_in(port, SCxSR); | 574 | status = sci_in(port, SCxSR); |
562 | #if defined(CONFIG_CPU_SH3) | 575 | #if defined(CONFIG_CPU_SH3) |
@@ -657,7 +670,7 @@ static inline int sci_handle_errors(struct uart_port *port) | |||
657 | if (status & SCxSR_FER(port)) { | 670 | if (status & SCxSR_FER(port)) { |
658 | if (sci_rxd_in(port) == 0) { | 671 | if (sci_rxd_in(port) == 0) { |
659 | /* Notify of BREAK */ | 672 | /* Notify of BREAK */ |
660 | struct sci_port *sci_port = (struct sci_port *)port; | 673 | struct sci_port *sci_port = to_sci_port(port); |
661 | 674 | ||
662 | if (!sci_port->break_flag) { | 675 | if (!sci_port->break_flag) { |
663 | sci_port->break_flag = 1; | 676 | sci_port->break_flag = 1; |
@@ -666,10 +679,11 @@ static inline int sci_handle_errors(struct uart_port *port) | |||
666 | /* Do sysrq handling. */ | 679 | /* Do sysrq handling. */ |
667 | if (uart_handle_break(port)) | 680 | if (uart_handle_break(port)) |
668 | return 0; | 681 | return 0; |
669 | pr_debug("sci: BREAK detected\n"); | 682 | pr_debug("sci: BREAK detected\n"); |
670 | if (tty_insert_flip_char(tty, 0, TTY_BREAK)) | 683 | if (tty_insert_flip_char(tty, 0, TTY_BREAK)) |
671 | copied++; | 684 | copied++; |
672 | } | 685 | } |
686 | |||
673 | } else { | 687 | } else { |
674 | /* frame error */ | 688 | /* frame error */ |
675 | if (tty_insert_flip_char(tty, 0, TTY_FRAME)) | 689 | if (tty_insert_flip_char(tty, 0, TTY_FRAME)) |
@@ -764,7 +778,7 @@ static irqreturn_t sci_er_interrupt(int irq, void *ptr) | |||
764 | } | 778 | } |
765 | } else { | 779 | } else { |
766 | #if defined(SCIF_ORER) | 780 | #if defined(SCIF_ORER) |
767 | if((sci_in(port, SCLSR) & SCIF_ORER) != 0) { | 781 | if ((sci_in(port, SCLSR) & SCIF_ORER) != 0) { |
768 | struct tty_struct *tty = port->info->port.tty; | 782 | struct tty_struct *tty = port->info->port.tty; |
769 | 783 | ||
770 | sci_out(port, SCLSR, 0); | 784 | sci_out(port, SCLSR, 0); |
@@ -801,8 +815,8 @@ static irqreturn_t sci_mpxed_interrupt(int irq, void *ptr) | |||
801 | struct uart_port *port = ptr; | 815 | struct uart_port *port = ptr; |
802 | irqreturn_t ret = IRQ_NONE; | 816 | irqreturn_t ret = IRQ_NONE; |
803 | 817 | ||
804 | ssr_status = sci_in(port,SCxSR); | 818 | ssr_status = sci_in(port, SCxSR); |
805 | scr_status = sci_in(port,SCSCR); | 819 | scr_status = sci_in(port, SCSCR); |
806 | 820 | ||
807 | /* Tx Interrupt */ | 821 | /* Tx Interrupt */ |
808 | if ((ssr_status & 0x0020) && (scr_status & SCI_CTRL_FLAGS_TIE)) | 822 | if ((ssr_status & 0x0020) && (scr_status & SCI_CTRL_FLAGS_TIE)) |
@@ -832,7 +846,7 @@ static int sci_notifier(struct notifier_block *self, | |||
832 | int i; | 846 | int i; |
833 | 847 | ||
834 | if ((phase == CPUFREQ_POSTCHANGE) || | 848 | if ((phase == CPUFREQ_POSTCHANGE) || |
835 | (phase == CPUFREQ_RESUMECHANGE)){ | 849 | (phase == CPUFREQ_RESUMECHANGE)) { |
836 | for (i = 0; i < SCI_NPORTS; i++) { | 850 | for (i = 0; i < SCI_NPORTS; i++) { |
837 | struct uart_port *port = &sci_ports[i].port; | 851 | struct uart_port *port = &sci_ports[i].port; |
838 | struct clk *clk; | 852 | struct clk *clk; |
@@ -904,12 +918,12 @@ static void sci_free_irq(struct sci_port *port) | |||
904 | { | 918 | { |
905 | int i; | 919 | int i; |
906 | 920 | ||
907 | if (port->irqs[0] == port->irqs[1]) { | 921 | if (port->irqs[0] == port->irqs[1]) { |
908 | if (!port->irqs[0]) | 922 | if (!port->irqs[0]) |
909 | printk("sci: sci_free_irq error\n"); | 923 | printk(KERN_ERR "sci: sci_free_irq error\n"); |
910 | else | 924 | else |
911 | free_irq(port->irqs[0], port); | 925 | free_irq(port->irqs[0], port); |
912 | } else { | 926 | } else { |
913 | for (i = 0; i < ARRAY_SIZE(port->irqs); i++) { | 927 | for (i = 0; i < ARRAY_SIZE(port->irqs); i++) { |
914 | if (!port->irqs[i]) | 928 | if (!port->irqs[i]) |
915 | continue; | 929 | continue; |
@@ -1060,12 +1074,12 @@ static void sci_set_termios(struct uart_port *port, struct ktermios *termios, | |||
1060 | sci_out(port, SCSMR, smr_val); | 1074 | sci_out(port, SCSMR, smr_val); |
1061 | 1075 | ||
1062 | if (t > 0) { | 1076 | if (t > 0) { |
1063 | if(t >= 256) { | 1077 | if (t >= 256) { |
1064 | sci_out(port, SCSMR, (sci_in(port, SCSMR) & ~3) | 1); | 1078 | sci_out(port, SCSMR, (sci_in(port, SCSMR) & ~3) | 1); |
1065 | t >>= 2; | 1079 | t >>= 2; |
1066 | } else { | 1080 | } else |
1067 | sci_out(port, SCSMR, sci_in(port, SCSMR) & ~3); | 1081 | sci_out(port, SCSMR, sci_in(port, SCSMR) & ~3); |
1068 | } | 1082 | |
1069 | sci_out(port, SCBRR, t); | 1083 | sci_out(port, SCBRR, t); |
1070 | udelay((1000000+(baud-1)) / baud); /* Wait one bit interval */ | 1084 | udelay((1000000+(baud-1)) / baud); /* Wait one bit interval */ |
1071 | } | 1085 | } |
@@ -1076,16 +1090,20 @@ static void sci_set_termios(struct uart_port *port, struct ktermios *termios, | |||
1076 | sci_out(port, SCSCR, SCSCR_INIT(port)); | 1090 | sci_out(port, SCSCR, SCSCR_INIT(port)); |
1077 | 1091 | ||
1078 | if ((termios->c_cflag & CREAD) != 0) | 1092 | if ((termios->c_cflag & CREAD) != 0) |
1079 | sci_start_rx(port,0); | 1093 | sci_start_rx(port, 0); |
1080 | } | 1094 | } |
1081 | 1095 | ||
1082 | static const char *sci_type(struct uart_port *port) | 1096 | static const char *sci_type(struct uart_port *port) |
1083 | { | 1097 | { |
1084 | switch (port->type) { | 1098 | switch (port->type) { |
1085 | case PORT_SCI: return "sci"; | 1099 | case PORT_IRDA: |
1086 | case PORT_SCIF: return "scif"; | 1100 | return "irda"; |
1087 | case PORT_IRDA: return "irda"; | 1101 | case PORT_SCI: |
1088 | case PORT_SCIFA: return "scifa"; | 1102 | return "sci"; |
1103 | case PORT_SCIF: | ||
1104 | return "scif"; | ||
1105 | case PORT_SCIFA: | ||
1106 | return "scifa"; | ||
1089 | } | 1107 | } |
1090 | 1108 | ||
1091 | return NULL; | 1109 | return NULL; |
@@ -1387,9 +1405,9 @@ console_initcall(kgdb_console_init); | |||
1387 | #endif /* CONFIG_SH_KGDB_CONSOLE */ | 1405 | #endif /* CONFIG_SH_KGDB_CONSOLE */ |
1388 | 1406 | ||
1389 | #if defined(CONFIG_SH_KGDB_CONSOLE) | 1407 | #if defined(CONFIG_SH_KGDB_CONSOLE) |
1390 | #define SCI_CONSOLE &kgdb_console | 1408 | #define SCI_CONSOLE (&kgdb_console) |
1391 | #elif defined(CONFIG_SERIAL_SH_SCI_CONSOLE) | 1409 | #elif defined(CONFIG_SERIAL_SH_SCI_CONSOLE) |
1392 | #define SCI_CONSOLE &serial_console | 1410 | #define SCI_CONSOLE (&serial_console) |
1393 | #else | 1411 | #else |
1394 | #define SCI_CONSOLE 0 | 1412 | #define SCI_CONSOLE 0 |
1395 | #endif | 1413 | #endif |