From owner-p4-projects@FreeBSD.ORG Fri Oct 20 22:42:02 2006 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 7473416A494; Fri, 20 Oct 2006 22:42:02 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 3526716A47C for ; Fri, 20 Oct 2006 22:42:02 +0000 (UTC) (envelope-from cognet@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 5CCB443D64 for ; Fri, 20 Oct 2006 22:42:00 +0000 (GMT) (envelope-from cognet@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id k9KMg0MR073880 for ; Fri, 20 Oct 2006 22:42:00 GMT (envelope-from cognet@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id k9KMg0FC073873 for perforce@freebsd.org; Fri, 20 Oct 2006 22:42:00 GMT (envelope-from cognet@freebsd.org) Date: Fri, 20 Oct 2006 22:42:00 GMT Message-Id: <200610202242.k9KMg0FC073873@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to cognet@freebsd.org using -f From: Olivier Houchard To: Perforce Change Reviews Cc: Subject: PERFORCE change 108195 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 20 Oct 2006 22:42:02 -0000 http://perforce.freebsd.org/chv.cgi?CH=108195 Change 108195 by cognet@cognet on 2006/10/20 22:41:46 Hack and slash to get the UART working, even in userland : - call device_add_child for the uart0. - Hack the allocation routines to special case for the UART. The way used to detect if it is the uart is WRONG, it is probably best to add a new "bus", just for the UART. Affected files ... .. //depot/projects/arm/src/sys/arm/xscale/ixp425/ixp425.c#10 edit .. //depot/projects/arm/src/sys/arm/xscale/ixp425/uart_bus_ixp425.c#3 edit .. //depot/projects/arm/src/sys/arm/xscale/ixp425/uart_cpu_ixp425.c#3 edit Differences ... ==== //depot/projects/arm/src/sys/arm/xscale/ixp425/ixp425.c#10 (text+ko) ==== @@ -229,6 +229,7 @@ device_add_child(dev, "pcib", 0); device_add_child(dev, "ixpclk", 0); device_add_child(dev, "ixpiic", 0); + device_add_child(dev, "uart", 0); if (bus_space_map(sc->sc_iot, IXP425_GPIO_HWBASE, IXP425_GPIO_SIZE, 0, &sc->sc_gpio_ioh)) @@ -257,6 +258,15 @@ case SYS_RES_MEMORY: rmanp = &sc->sc_mem_rman; + /* Naughty hack to get the UART memory-mapped register. */ + /* I'm not sure of how to do it cleanly. */ + if (start == 0 && end == ~0) { + if (device_get_unit(dev) == 0) + start = IXP425_UART0_HWBASE; + else + start = IXP425_UART1_HWBASE; + end = start + 0x1000; + } if (getvbase(start, end - start, &vbase)) return (rv); break; @@ -269,7 +279,11 @@ if (rv != NULL) { rman_set_rid(rv, *rid); if (type == SYS_RES_MEMORY) { - rman_set_bustag(rv, sc->sc_iot); + if (start == IXP425_UART0_HWBASE || start == + IXP425_UART1_HWBASE) + rman_set_bustag(rv, &ixp425_a4x_bs_tag); + else + rman_set_bustag(rv, sc->sc_iot); rman_set_bushandle(rv, vbase); } } @@ -283,6 +297,13 @@ void **cookiep) { + if (flags & INTR_TYPE_TTY) { + /* XXX: wrong. */ + if (device_get_unit(dev) == 0) + rman_set_start(ires, IXP425_INT_UART0); + else + rman_set_start(ires, IXP425_INT_UART1); + } BUS_SETUP_INTR(device_get_parent(dev), child, ires, flags, intr, arg, cookiep); intr_enabled |= 1 << rman_get_start(ires); ==== //depot/projects/arm/src/sys/arm/xscale/ixp425/uart_bus_ixp425.c#3 (text+ko) ==== @@ -36,12 +36,14 @@ #include #include +#include #include #include #include #include +#include #include "uart_if.h" @@ -71,6 +73,8 @@ sc->sc_sysdev = SLIST_FIRST(&uart_sysdevs); sc->sc_class = &uart_ns8250_class; bcopy(&sc->sc_sysdev->bas, &sc->sc_bas, sizeof(sc->sc_bas)); + bus_space_write_4(&ixp425_a4x_bs_tag, device_get_unit(dev) == 0 ? + IXP425_UART0_VBASE : IXP425_UART1_VBASE, REG_IER, 0x40); return(uart_bus_probe(dev, 0, IXP425_UART_FREQ, 0, 0)); } ==== //depot/projects/arm/src/sys/arm/xscale/ixp425/uart_cpu_ixp425.c#3 (text+ko) ====