Module Name: src Committed By: nonaka Date: Sat Feb 5 15:45:21 UTC 2011
Modified Files: src/sys/dev/marvell: mvsdio.c src/sys/dev/sdmmc: sdmmc.c sdmmc_mem.c sdmmcvar.h Log Message: Don't switch SD high-speed timing, if host controller isn't supported. To generate a diff of this commit: cvs rdiff -u -r1.2 -r1.3 src/sys/dev/marvell/mvsdio.c cvs rdiff -u -r1.6 -r1.7 src/sys/dev/sdmmc/sdmmc.c cvs rdiff -u -r1.14 -r1.15 src/sys/dev/sdmmc/sdmmc_mem.c cvs rdiff -u -r1.8 -r1.9 src/sys/dev/sdmmc/sdmmcvar.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/marvell/mvsdio.c diff -u src/sys/dev/marvell/mvsdio.c:1.2 src/sys/dev/marvell/mvsdio.c:1.3 --- src/sys/dev/marvell/mvsdio.c:1.2 Fri Oct 8 11:20:22 2010 +++ src/sys/dev/marvell/mvsdio.c Sat Feb 5 15:45:21 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: mvsdio.c,v 1.2 2010/10/08 11:20:22 kiyohara Exp $ */ +/* $NetBSD: mvsdio.c,v 1.3 2011/02/05 15:45:21 nonaka Exp $ */ /* * Copyright (c) 2010 KIYOHARA Takashi * All rights reserved. @@ -25,7 +25,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: mvsdio.c,v 1.2 2010/10/08 11:20:22 kiyohara Exp $"); +__KERNEL_RCSID(0, "$NetBSD: mvsdio.c,v 1.3 2011/02/05 15:45:21 nonaka Exp $"); #include "opt_mvsdio.h" @@ -238,7 +238,8 @@ saa.saa_dmat = sc->sc_dmat; saa.saa_clkmin = 100; /* XXXX: 100 kHz from SheevaPlug LSP */ saa.saa_clkmax = MVSDIO_MAX_CLOCK; - saa.saa_caps = SMC_CAPS_AUTO_STOP | SMC_CAPS_4BIT_MODE | SMC_CAPS_DMA; + saa.saa_caps = SMC_CAPS_AUTO_STOP | SMC_CAPS_4BIT_MODE | SMC_CAPS_DMA | + SMC_CAPS_SD_HIGHSPEED; #ifndef MVSDIO_CARD_DETECT saa.saa_caps |= SMC_CAPS_POLL_CARD_DET; #endif Index: src/sys/dev/sdmmc/sdmmc.c diff -u src/sys/dev/sdmmc/sdmmc.c:1.6 src/sys/dev/sdmmc/sdmmc.c:1.7 --- src/sys/dev/sdmmc/sdmmc.c:1.6 Thu Oct 7 12:40:34 2010 +++ src/sys/dev/sdmmc/sdmmc.c Sat Feb 5 15:45:21 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: sdmmc.c,v 1.6 2010/10/07 12:40:34 kiyohara Exp $ */ +/* $NetBSD: sdmmc.c,v 1.7 2011/02/05 15:45:21 nonaka Exp $ */ /* $OpenBSD: sdmmc.c,v 1.18 2009/01/09 10:58:38 jsg Exp $ */ /* @@ -50,7 +50,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sdmmc.c,v 1.6 2010/10/07 12:40:34 kiyohara Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sdmmc.c,v 1.7 2011/02/05 15:45:21 nonaka Exp $"); #include <sys/param.h> #include <sys/device.h> @@ -530,6 +530,7 @@ (void)sdmmc_chip_bus_width(sc->sc_sct, sc->sc_sch, 1); (void)sdmmc_chip_bus_clock(sc->sc_sct, sc->sc_sch, SDMMC_SDCLK_OFF); (void)sdmmc_chip_bus_power(sc->sc_sct, sc->sc_sch, 0); + sc->sc_busclk = sc->sc_clkmax; } /* Index: src/sys/dev/sdmmc/sdmmc_mem.c diff -u src/sys/dev/sdmmc/sdmmc_mem.c:1.14 src/sys/dev/sdmmc/sdmmc_mem.c:1.15 --- src/sys/dev/sdmmc/sdmmc_mem.c:1.14 Sat Nov 13 13:52:11 2010 +++ src/sys/dev/sdmmc/sdmmc_mem.c Sat Feb 5 15:45:21 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: sdmmc_mem.c,v 1.14 2010/11/13 13:52:11 uebayasi Exp $ */ +/* $NetBSD: sdmmc_mem.c,v 1.15 2011/02/05 15:45:21 nonaka Exp $ */ /* $OpenBSD: sdmmc_mem.c,v 1.10 2009/01/09 10:55:22 jsg Exp $ */ /* @@ -46,7 +46,7 @@ /* Routines for SD/MMC memory cards. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sdmmc_mem.c,v 1.14 2010/11/13 13:52:11 uebayasi Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sdmmc_mem.c,v 1.15 2011/02/05 15:45:21 nonaka Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -425,11 +425,12 @@ printf("csdver = %d\n", csd->csdver); printf("mmcver = %d\n", csd->mmcver); - printf("capacity = %08x\n", csd->capacity); + printf("capacity = 0x%08x\n", csd->capacity); printf("read_bl_len = %d\n", csd->read_bl_len); printf("write_cl_len = %d\n", csd->write_bl_len); printf("r2w_factor = %d\n", csd->r2w_factor); printf("tran_speed = %d\n", csd->tran_speed); + printf("ccc = 0x%x\n", csd->ccc); } #endif @@ -574,10 +575,10 @@ static int sdmmc_mem_sd_init(struct sdmmc_softc *sc, struct sdmmc_function *sf) { - struct { + static const struct { int v; int freq; - } switch_group0_functions [] = { + } switch_group0_functions[] = { /* Default/SDR12 */ { MMC_OCR_1_7V_1_8V | MMC_OCR_1_8V_1_9V | MMC_OCR_3_2V_3_3V | MMC_OCR_3_3V_3_4V, 25000 }, @@ -609,6 +610,7 @@ if (ISSET(sc->sc_caps, SMC_CAPS_4BIT_MODE) && ISSET(sf->scr.bus_width, SCR_SD_BUS_WIDTHS_4BIT)) { + DPRINTF(("%s: change bus width\n", SDMMCDEVNAME(sc))); error = sdmmc_set_bus_width(sf, 4); if (error) { aprint_error_dev(sc->sc_dev, @@ -616,11 +618,13 @@ return error; } sf->width = 4; - } else + } else { sf->width = 1; + } if (sf->scr.sd_spec >= SCR_SD_SPEC_VER_1_10 && ISSET(sf->csd.ccc, SD_CSD_CCC_SWITCH)) { + DPRINTF(("%s: switch func mode 0\n", SDMMCDEVNAME(sc))); error = sdmmc_mem_sd_switch(sf, 0, 1, 0, status); if (error) { aprint_error_dev(sc->sc_dev, @@ -638,7 +642,10 @@ if (g & support_func) best_func = i; } - if (best_func != 0) { + if (ISSET(sc->sc_caps, SMC_CAPS_SD_HIGHSPEED) && + best_func != 0) { + DPRINTF(("%s: switch func mode 1(func=%d)\n", + SDMMCDEVNAME(sc), best_func)); error = sdmmc_mem_sd_switch(sf, 1, 1, best_func, status); if (error) { @@ -653,19 +660,16 @@ /* Wait 400KHz x 8 clock */ delay(1); - if (sc->sc_busclk > sf->csd.tran_speed) - sc->sc_busclk = sf->csd.tran_speed; + } + } - error = sdmmc_chip_bus_clock(sc->sc_sct, sc->sc_sch, - sc->sc_busclk); - if (error) { - aprint_error_dev(sc->sc_dev, - "can't change bus clock\n"); - return error; - } - } else - if (sc->sc_busclk > sf->csd.tran_speed) - sc->sc_busclk = sf->csd.tran_speed; + /* change bus clock */ + if (sc->sc_busclk > sf->csd.tran_speed) + sc->sc_busclk = sf->csd.tran_speed; + error = sdmmc_chip_bus_clock(sc->sc_sct, sc->sc_sch, sc->sc_busclk); + if (error) { + aprint_error_dev(sc->sc_dev, "can't change bus clock\n"); + return error; } return 0; Index: src/sys/dev/sdmmc/sdmmcvar.h diff -u src/sys/dev/sdmmc/sdmmcvar.h:1.8 src/sys/dev/sdmmc/sdmmcvar.h:1.9 --- src/sys/dev/sdmmc/sdmmcvar.h:1.8 Thu Oct 7 12:24:23 2010 +++ src/sys/dev/sdmmc/sdmmcvar.h Sat Feb 5 15:45:21 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: sdmmcvar.h,v 1.8 2010/10/07 12:24:23 kiyohara Exp $ */ +/* $NetBSD: sdmmcvar.h,v 1.9 2011/02/05 15:45:21 nonaka Exp $ */ /* $OpenBSD: sdmmcvar.h,v 1.13 2009/01/09 10:55:22 jsg Exp $ */ /* @@ -219,6 +219,7 @@ #define SMC_CAPS_SINGLE_ONLY 0x0020 /* only single read/write */ #define SMC_CAPS_8BIT_MODE 0x0040 /* 8-bits data bus width */ #define SMC_CAPS_MULTI_SEG_DMA 0x0080 /* multiple segment DMA transfer */ +#define SMC_CAPS_SD_HIGHSPEED 0x0100 /* SD high-speed timing */ /* function */ int sc_function_count; /* number of I/O functions (SDIO) */