static enum uart yam_check_uart(unsigned int iobase) { unsigned char b1, b2, b3; enum uart u; enum uart uart_tab[] = {c_uart_16450, c_uart_unknown, c_uart_16550, c_uart_16550A}; b1 = inb(MCR(iobase)); outb(b1 | 0x10, MCR(iobase)); /* loopback mode */ b2 = inb(MSR(iobase)); outb(0x1a, MCR(iobase)); b3 = inb(MSR(iobase)) & 0xf0; outb(b1, MCR(iobase)); /* restore old values */ outb(b2, MSR(iobase)); if (b3 != 0x90) return c_uart_unknown; inb(RBR(iobase)); inb(RBR(iobase)); outb(0x01, FCR(iobase)); /* enable FIFOs */ u = uart_tab[(inb(IIR(iobase)) >> 6) & 3]; if (u == c_uart_16450) { outb(0x5a, SCR(iobase)); b1 = inb(SCR(iobase)); outb(0xa5, SCR(iobase)); b2 = inb(SCR(iobase)); if ((b1 != 0x5a) || (b2 != 0xa5)) u = c_uart_8250; } return u; }
void serial_setbrg (void) { unsigned int quot = 0; int uart = CONFIG_SYS_IXP425_CONSOLE; if ((gd->baudrate <= SERIAL_CLOCK) && (SERIAL_CLOCK % gd->baudrate == 0)) quot = SERIAL_CLOCK / gd->baudrate; else hang (); IER(uart) = 0; /* Disable for now */ FCR(uart) = 0; /* No fifos enabled */ /* set baud rate */ LCR(uart) = LCR_WLS0 | LCR_WLS1 | LCR_DLAB; DLL(uart) = quot & 0xff; DLH(uart) = quot >> 8; LCR(uart) = LCR_WLS0 | LCR_WLS1; #ifdef CONFIG_SERIAL_RTS_ACTIVE MCR(uart) = MCR_RTS; /* set RTS active */ #else MCR(uart) = 0; /* set RTS inactive */ #endif IER(uart) = IER_UUE; }
static int do_requests(int baseport, int irq, int index, int minor) { int err; atomic_set(&uart[index].read_ready, 0); atomic_set(&uart[index].write_ready, 0); uart[index].read = 0; uart[index].write = 0; uart[index].base_port = baseport; cdev_init(&uart[index].cdev, &serial_fops); init_waitqueue_head(&uart[index].wq_reads); init_waitqueue_head(&uart[index].wq_writes); if ((err = cdev_add(&uart[index].cdev, MKDEV(major, minor), 1))) { //printk(LOG_LEVEL "cdev_init %d failed", minor); return err; } if (request_region(baseport, COM_PORTS, MODULE_NAME) == NULL) { //printk(LOG_LEVEL "request_region failed for COM1"); return -EINVAL; } err = request_irq(irq, serial_interrupt_handle, IRQF_SHARED, MODULE_NAME, &uart[index]); if (err) { //printk(LOG_LEVEL "ERROR: %s: error %d\n", "request_irq", err); return err; } // Enable FIFO cu 14 octeti outb(0xc7, FCR(baseport)); // Enable interrupts outb(0x08, MCR(baseport)); outb(0x01, IER(baseport)); //printk(LOG_LEVEL "index %d, baseport %d, irq %d, minor %d", index, baseport, irq, minor); return 0; }
static void yam_set_uart(struct net_device *dev) { struct yam_port *yp = netdev_priv(dev); int divisor = 115200 / yp->baudrate; outb(0, IER(dev->base_addr)); outb(LCR_DLAB | LCR_BIT8, LCR(dev->base_addr)); outb(divisor, DLL(dev->base_addr)); outb(0, DLM(dev->base_addr)); outb(LCR_BIT8, LCR(dev->base_addr)); outb(PTT_OFF, MCR(dev->base_addr)); outb(0x00, FCR(dev->base_addr)); /* Flush pending irq */ inb(RBR(dev->base_addr)); inb(MSR(dev->base_addr)); /* Enable rx irq */ outb(ENABLE_RTXINT, IER(dev->base_addr)); }