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 96d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_SYS_NS16550 101378df79SJean-Christophe PLAGNIOL-VILLARD 111378df79SJean-Christophe PLAGNIOL-VILLARD #include <ns16550.h> 121378df79SJean-Christophe PLAGNIOL-VILLARD 131378df79SJean-Christophe PLAGNIOL-VILLARD #define LCRVAL LCR_8N1 /* 8 data, 1 stop, no parity */ 141378df79SJean-Christophe PLAGNIOL-VILLARD #define MCRVAL (MCR_DTR | MCR_RTS) /* RTS/DTR */ 151378df79SJean-Christophe PLAGNIOL-VILLARD #define FCRVAL (FCR_FIFO_EN | FCR_RXSR | FCR_TXSR) /* Clear & enable FIFOs */ 161378df79SJean-Christophe PLAGNIOL-VILLARD 171378df79SJean-Christophe PLAGNIOL-VILLARD void NS16550_init (NS16550_t com_port, int baud_divisor) 181378df79SJean-Christophe PLAGNIOL-VILLARD { 191378df79SJean-Christophe PLAGNIOL-VILLARD com_port->ier = 0x00; 201378df79SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_OMAP 211378df79SJean-Christophe PLAGNIOL-VILLARD com_port->mdr1 = 0x7; /* mode select reset TL16C750*/ 221378df79SJean-Christophe PLAGNIOL-VILLARD #endif 231378df79SJean-Christophe PLAGNIOL-VILLARD com_port->lcr = LCR_BKSE | LCRVAL; 247ec8bb15SWolfgang Denk com_port->dll = 0; 257ec8bb15SWolfgang Denk com_port->dlm = 0; 261378df79SJean-Christophe PLAGNIOL-VILLARD com_port->lcr = LCRVAL; 271378df79SJean-Christophe PLAGNIOL-VILLARD com_port->mcr = MCRVAL; 281378df79SJean-Christophe PLAGNIOL-VILLARD com_port->fcr = FCRVAL; 297ec8bb15SWolfgang Denk com_port->lcr = LCR_BKSE | LCRVAL; 307ec8bb15SWolfgang Denk com_port->dll = baud_divisor & 0xff; 317ec8bb15SWolfgang Denk com_port->dlm = (baud_divisor >> 8) & 0xff; 327ec8bb15SWolfgang Denk com_port->lcr = LCRVAL; 331378df79SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_OMAP) 341378df79SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_APTIX) 351378df79SJean-Christophe PLAGNIOL-VILLARD com_port->mdr1 = 3; /* /13 mode so Aptix 6MHz can hit 115200 */ 361378df79SJean-Christophe PLAGNIOL-VILLARD #else 371378df79SJean-Christophe PLAGNIOL-VILLARD com_port->mdr1 = 0; /* /16 is proper to hit 115200 with 48MHz */ 381378df79SJean-Christophe PLAGNIOL-VILLARD #endif 391378df79SJean-Christophe PLAGNIOL-VILLARD #endif 401378df79SJean-Christophe PLAGNIOL-VILLARD } 411378df79SJean-Christophe PLAGNIOL-VILLARD 42*f5675aa5SRon Madrid #ifndef CONFIG_NS16550_MIN_FUNCTIONS 431378df79SJean-Christophe PLAGNIOL-VILLARD void NS16550_reinit (NS16550_t com_port, int baud_divisor) 441378df79SJean-Christophe PLAGNIOL-VILLARD { 451378df79SJean-Christophe PLAGNIOL-VILLARD com_port->ier = 0x00; 467ec8bb15SWolfgang Denk com_port->lcr = LCR_BKSE | LCRVAL; 477ec8bb15SWolfgang Denk com_port->dll = 0; 487ec8bb15SWolfgang Denk com_port->dlm = 0; 497ec8bb15SWolfgang Denk com_port->lcr = LCRVAL; 507ec8bb15SWolfgang Denk com_port->mcr = MCRVAL; 517ec8bb15SWolfgang Denk com_port->fcr = FCRVAL; 521378df79SJean-Christophe PLAGNIOL-VILLARD com_port->lcr = LCR_BKSE; 531378df79SJean-Christophe PLAGNIOL-VILLARD com_port->dll = baud_divisor & 0xff; 541378df79SJean-Christophe PLAGNIOL-VILLARD com_port->dlm = (baud_divisor >> 8) & 0xff; 551378df79SJean-Christophe PLAGNIOL-VILLARD com_port->lcr = LCRVAL; 561378df79SJean-Christophe PLAGNIOL-VILLARD } 57*f5675aa5SRon Madrid #endif /* CONFIG_NS16550_MIN_FUNCTIONS */ 581378df79SJean-Christophe PLAGNIOL-VILLARD 591378df79SJean-Christophe PLAGNIOL-VILLARD void NS16550_putc (NS16550_t com_port, char c) 601378df79SJean-Christophe PLAGNIOL-VILLARD { 611378df79SJean-Christophe PLAGNIOL-VILLARD while ((com_port->lsr & LSR_THRE) == 0); 621378df79SJean-Christophe PLAGNIOL-VILLARD com_port->thr = c; 631378df79SJean-Christophe PLAGNIOL-VILLARD } 641378df79SJean-Christophe PLAGNIOL-VILLARD 65*f5675aa5SRon Madrid #ifndef CONFIG_NS16550_MIN_FUNCTIONS 661378df79SJean-Christophe PLAGNIOL-VILLARD char NS16550_getc (NS16550_t com_port) 671378df79SJean-Christophe PLAGNIOL-VILLARD { 681378df79SJean-Christophe PLAGNIOL-VILLARD while ((com_port->lsr & LSR_DR) == 0) { 691378df79SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_USB_TTY 701378df79SJean-Christophe PLAGNIOL-VILLARD extern void usbtty_poll(void); 711378df79SJean-Christophe PLAGNIOL-VILLARD usbtty_poll(); 721378df79SJean-Christophe PLAGNIOL-VILLARD #endif 731378df79SJean-Christophe PLAGNIOL-VILLARD } 741378df79SJean-Christophe PLAGNIOL-VILLARD return (com_port->rbr); 751378df79SJean-Christophe PLAGNIOL-VILLARD } 761378df79SJean-Christophe PLAGNIOL-VILLARD 771378df79SJean-Christophe PLAGNIOL-VILLARD int NS16550_tstc (NS16550_t com_port) 781378df79SJean-Christophe PLAGNIOL-VILLARD { 791378df79SJean-Christophe PLAGNIOL-VILLARD return ((com_port->lsr & LSR_DR) != 0); 801378df79SJean-Christophe PLAGNIOL-VILLARD } 811378df79SJean-Christophe PLAGNIOL-VILLARD 82*f5675aa5SRon Madrid #endif /* CONFIG_NS16550_MIN_FUNCTIONS */ 831378df79SJean-Christophe PLAGNIOL-VILLARD #endif 84