From owner-svn-src-all@FreeBSD.ORG Fri Jan 23 00:51:26 2009 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 2A1DE1065672; Fri, 23 Jan 2009 00:51:26 +0000 (UTC) (envelope-from imp@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 091478FC23; Fri, 23 Jan 2009 00:51:26 +0000 (UTC) (envelope-from imp@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n0N0pPXO026782; Fri, 23 Jan 2009 00:51:25 GMT (envelope-from imp@svn.freebsd.org) Received: (from imp@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n0N0pPTp026781; Fri, 23 Jan 2009 00:51:25 GMT (envelope-from imp@svn.freebsd.org) Message-Id: <200901230051.n0N0pPTp026781@svn.freebsd.org> From: Warner Losh Date: Fri, 23 Jan 2009 00:51:25 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r187606 - head/sys/arm/at91 X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 23 Jan 2009 00:51:26 -0000 Author: imp Date: Fri Jan 23 00:51:25 2009 New Revision: 187606 URL: http://svn.freebsd.org/changeset/base/187606 Log: Move to having a caps flag. Newer versions of the AT91 family don't need the bouncing, so save a few copies in that case. Also convert 4-bit code selection to using it. Modified: head/sys/arm/at91/at91_mci.c Modified: head/sys/arm/at91/at91_mci.c ============================================================================== --- head/sys/arm/at91/at91_mci.c Thu Jan 22 23:34:55 2009 (r187605) +++ head/sys/arm/at91/at91_mci.c Fri Jan 23 00:51:25 2009 (r187606) @@ -67,6 +67,9 @@ __FBSDID("$FreeBSD$"); struct at91_mci_softc { void *intrhand; /* Interrupt handle */ device_t dev; + int sc_cap; +#define CAP_HAS_4WIRE 1 /* Has 4 wire bus */ +#define CAP_NEEDS_BOUNCE 2 /* broken hardware needing bounce */ int flags; #define CMD_STARTED 1 #define STOP_STARTED 2 @@ -77,7 +80,6 @@ struct at91_mci_softc { bus_dmamap_t map; int mapped; struct mmc_host host; - int wire4; int bus_busy; struct mmc_request *req; struct mmc_command *curcmd; @@ -167,6 +169,7 @@ at91_mci_attach(device_t dev) device_t child; sc->dev = dev; + sc->sc_cap = CAP_NEEDS_BOUNCE; err = at91_mci_activate(dev); if (err) goto out; @@ -201,7 +204,7 @@ at91_mci_attach(device_t dev) sc->host.f_min = 375000; sc->host.f_max = at91_master_clock / 2; /* Typically 30MHz */ sc->host.host_ocr = MMC_OCR_320_330 | MMC_OCR_330_340; - if (sc->wire4) + if (sc->sc_cap & CAP_HAS_4WIRE) sc->host.caps = MMC_CAP_4_BIT_DATA; else sc->host.caps = 0; @@ -301,6 +304,7 @@ at91_mci_update_ios(device_t brdev, devi else WR4(sc, MCI_SDCR, RD4(sc, MCI_SDCR) & ~MCI_SDCR_SDCBUS); WR4(sc, MCI_MR, (RD4(sc, MCI_MR) & ~MCI_MR_CLKDIV) | clkdiv); + /* Do we need a settle time here? */ /* XXX We need to turn the device on/off here with a GPIO pin */ return (0); } @@ -360,13 +364,15 @@ at91_mci_start_cmd(struct at91_mci_softc if (cmdr & MCI_CMDR_TRDIR) vaddr = cmd->data->data; else { - if (data->len != BBSZ) - panic("Write multiblock write support"); - vaddr = sc->bounce_buffer; - src = (uint32_t *)cmd->data->data; - dst = (uint32_t *)vaddr; - for (i = 0; i < data->len / 4; i++) - dst[i] = bswap32(src[i]); + if (sc->sc_cap & CAP_NEEDS_BOUNCE) { + vaddr = sc->bounce_buffer; + src = (uint32_t *)cmd->data->data; + dst = (uint32_t *)vaddr; + for (i = 0; i < data->len / 4; i++) + dst[i] = bswap32(src[i]); + } + else + vaddr = cmd->data->data; } data->xfer_len = 0; if (bus_dmamap_load(sc->dmatag, sc->map, vaddr, data->len, @@ -497,10 +503,12 @@ at91_mci_read_done(struct at91_mci_softc bus_dmamap_sync(sc->dmatag, sc->map, BUS_DMASYNC_POSTREAD); bus_dmamap_unload(sc->dmatag, sc->map); sc->mapped--; - walker = (uint32_t *)cmd->data->data; - len = cmd->data->len / 4; - for (i = 0; i < len; i++) - walker[i] = bswap32(walker[i]); + if (sc->sc_cap & CAP_NEEDS_BOUNCE) { + walker = (uint32_t *)cmd->data->data; + len = cmd->data->len / 4; + for (i = 0; i < len; i++) + walker[i] = bswap32(walker[i]); + } // Finish up the sequence... WR4(sc, MCI_IDR, MCI_SR_ENDRX); WR4(sc, MCI_IER, MCI_SR_RXBUFF);