11378df79SJean-Christophe PLAGNIOL-VILLARD /* 21378df79SJean-Christophe PLAGNIOL-VILLARD * COM1 NS16550 support 31378df79SJean-Christophe PLAGNIOL-VILLARD * originally from linux source (arch/ppc/boot/ns16550.c) 46d0f6bcfSJean-Christophe PLAGNIOL-VILLARD * modified to use CONFIG_SYS_ISA_MEM and new defines 51378df79SJean-Christophe PLAGNIOL-VILLARD */ 61378df79SJean-Christophe PLAGNIOL-VILLARD 71378df79SJean-Christophe PLAGNIOL-VILLARD #include <config.h> 81378df79SJean-Christophe PLAGNIOL-VILLARD #include <ns16550.h> 91378df79SJean-Christophe PLAGNIOL-VILLARD 101378df79SJean-Christophe PLAGNIOL-VILLARD #define LCRVAL LCR_8N1 /* 8 data, 1 stop, no parity */ 111378df79SJean-Christophe PLAGNIOL-VILLARD #define MCRVAL (MCR_DTR | MCR_RTS) /* RTS/DTR */ 121378df79SJean-Christophe PLAGNIOL-VILLARD #define FCRVAL (FCR_FIFO_EN | FCR_RXSR | FCR_TXSR) /* Clear & enable FIFOs */ 131378df79SJean-Christophe PLAGNIOL-VILLARD 141378df79SJean-Christophe PLAGNIOL-VILLARD void NS16550_init (NS16550_t com_port, int baud_divisor) 151378df79SJean-Christophe PLAGNIOL-VILLARD { 161378df79SJean-Christophe PLAGNIOL-VILLARD com_port->ier = 0x00; 171378df79SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_OMAP 181378df79SJean-Christophe PLAGNIOL-VILLARD com_port->mdr1 = 0x7; /* mode select reset TL16C750*/ 191378df79SJean-Christophe PLAGNIOL-VILLARD #endif 201378df79SJean-Christophe PLAGNIOL-VILLARD com_port->lcr = LCR_BKSE | LCRVAL; 217ec8bb15SWolfgang Denk com_port->dll = 0; 227ec8bb15SWolfgang Denk com_port->dlm = 0; 231378df79SJean-Christophe PLAGNIOL-VILLARD com_port->lcr = LCRVAL; 241378df79SJean-Christophe PLAGNIOL-VILLARD com_port->mcr = MCRVAL; 251378df79SJean-Christophe PLAGNIOL-VILLARD com_port->fcr = FCRVAL; 267ec8bb15SWolfgang Denk com_port->lcr = LCR_BKSE | LCRVAL; 277ec8bb15SWolfgang Denk com_port->dll = baud_divisor & 0xff; 287ec8bb15SWolfgang Denk com_port->dlm = (baud_divisor >> 8) & 0xff; 297ec8bb15SWolfgang Denk com_port->lcr = LCRVAL; 301378df79SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_OMAP) 311378df79SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_APTIX) 321378df79SJean-Christophe PLAGNIOL-VILLARD com_port->mdr1 = 3; /* /13 mode so Aptix 6MHz can hit 115200 */ 331378df79SJean-Christophe PLAGNIOL-VILLARD #else 341378df79SJean-Christophe PLAGNIOL-VILLARD com_port->mdr1 = 0; /* /16 is proper to hit 115200 with 48MHz */ 351378df79SJean-Christophe PLAGNIOL-VILLARD #endif 36*b4746d8bSMike Frysinger #endif /* CONFIG_OMAP */ 371378df79SJean-Christophe PLAGNIOL-VILLARD } 381378df79SJean-Christophe PLAGNIOL-VILLARD 39f5675aa5SRon Madrid #ifndef CONFIG_NS16550_MIN_FUNCTIONS 401378df79SJean-Christophe PLAGNIOL-VILLARD void NS16550_reinit (NS16550_t com_port, int baud_divisor) 411378df79SJean-Christophe PLAGNIOL-VILLARD { 421378df79SJean-Christophe PLAGNIOL-VILLARD com_port->ier = 0x00; 437ec8bb15SWolfgang Denk com_port->lcr = LCR_BKSE | LCRVAL; 447ec8bb15SWolfgang Denk com_port->dll = 0; 457ec8bb15SWolfgang Denk com_port->dlm = 0; 467ec8bb15SWolfgang Denk com_port->lcr = LCRVAL; 477ec8bb15SWolfgang Denk com_port->mcr = MCRVAL; 487ec8bb15SWolfgang Denk com_port->fcr = FCRVAL; 491378df79SJean-Christophe PLAGNIOL-VILLARD com_port->lcr = LCR_BKSE; 501378df79SJean-Christophe PLAGNIOL-VILLARD com_port->dll = baud_divisor & 0xff; 511378df79SJean-Christophe PLAGNIOL-VILLARD com_port->dlm = (baud_divisor >> 8) & 0xff; 521378df79SJean-Christophe PLAGNIOL-VILLARD com_port->lcr = LCRVAL; 531378df79SJean-Christophe PLAGNIOL-VILLARD } 54f5675aa5SRon Madrid #endif /* CONFIG_NS16550_MIN_FUNCTIONS */ 551378df79SJean-Christophe PLAGNIOL-VILLARD 561378df79SJean-Christophe PLAGNIOL-VILLARD void NS16550_putc (NS16550_t com_port, char c) 571378df79SJean-Christophe PLAGNIOL-VILLARD { 581378df79SJean-Christophe PLAGNIOL-VILLARD while ((com_port->lsr & LSR_THRE) == 0); 591378df79SJean-Christophe PLAGNIOL-VILLARD com_port->thr = c; 601378df79SJean-Christophe PLAGNIOL-VILLARD } 611378df79SJean-Christophe PLAGNIOL-VILLARD 62f5675aa5SRon Madrid #ifndef CONFIG_NS16550_MIN_FUNCTIONS 631378df79SJean-Christophe PLAGNIOL-VILLARD char NS16550_getc (NS16550_t com_port) 641378df79SJean-Christophe PLAGNIOL-VILLARD { 651378df79SJean-Christophe PLAGNIOL-VILLARD while ((com_port->lsr & LSR_DR) == 0) { 661378df79SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_USB_TTY 671378df79SJean-Christophe PLAGNIOL-VILLARD extern void usbtty_poll(void); 681378df79SJean-Christophe PLAGNIOL-VILLARD usbtty_poll(); 691378df79SJean-Christophe PLAGNIOL-VILLARD #endif 701378df79SJean-Christophe PLAGNIOL-VILLARD } 711378df79SJean-Christophe PLAGNIOL-VILLARD return (com_port->rbr); 721378df79SJean-Christophe PLAGNIOL-VILLARD } 731378df79SJean-Christophe PLAGNIOL-VILLARD 741378df79SJean-Christophe PLAGNIOL-VILLARD int NS16550_tstc (NS16550_t com_port) 751378df79SJean-Christophe PLAGNIOL-VILLARD { 761378df79SJean-Christophe PLAGNIOL-VILLARD return ((com_port->lsr & LSR_DR) != 0); 771378df79SJean-Christophe PLAGNIOL-VILLARD } 781378df79SJean-Christophe PLAGNIOL-VILLARD 79f5675aa5SRon Madrid #endif /* CONFIG_NS16550_MIN_FUNCTIONS */ 80