Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev - Don't switch MMC high-speed timing, if host contro...



details:   https://anonhg.NetBSD.org/src/rev/6e3525526cee
branches:  trunk
changeset: 762017:6e3525526cee
user:      nonaka <nonaka%NetBSD.org@localhost>
date:      Sun Feb 13 06:43:51 2011 +0000

description:
- Don't switch MMC high-speed timing, if host controller isn't supported.
- Only check EXT_CSD STRUCTURE version when CSD version is 3.
- initialize width at sdmmc_function_alloc().

diffstat:

 sys/dev/marvell/mvsdio.c  |   6 +++---
 sys/dev/sdmmc/sdmmc.c     |   5 +++--
 sys/dev/sdmmc/sdmmc_io.c  |   5 ++---
 sys/dev/sdmmc/sdmmc_mem.c |  42 +++++++++++++++++++++++++-----------------
 sys/dev/sdmmc/sdmmcreg.h  |   9 +++++----
 sys/dev/sdmmc/sdmmcvar.h  |   3 ++-
 6 files changed, 40 insertions(+), 30 deletions(-)

diffs (237 lines):

diff -r 992aa4b80f2a -r 6e3525526cee sys/dev/marvell/mvsdio.c
--- a/sys/dev/marvell/mvsdio.c  Sun Feb 13 06:17:35 2011 +0000
+++ b/sys/dev/marvell/mvsdio.c  Sun Feb 13 06:43:51 2011 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: mvsdio.c,v 1.3 2011/02/05 15:45:21 nonaka Exp $        */
+/*     $NetBSD: mvsdio.c,v 1.4 2011/02/13 06:43:51 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.3 2011/02/05 15:45:21 nonaka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mvsdio.c,v 1.4 2011/02/13 06:43:51 nonaka Exp $");
 
 #include "opt_mvsdio.h"
 
@@ -239,7 +239,7 @@
        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 |
-           SMC_CAPS_SD_HIGHSPEED;
+           SMC_CAPS_SD_HIGHSPEED | SMC_CAPS_MMC_HIGHSPEED;
 #ifndef MVSDIO_CARD_DETECT
        saa.saa_caps |= SMC_CAPS_POLL_CARD_DET;
 #endif
diff -r 992aa4b80f2a -r 6e3525526cee sys/dev/sdmmc/sdmmc.c
--- a/sys/dev/sdmmc/sdmmc.c     Sun Feb 13 06:17:35 2011 +0000
+++ b/sys/dev/sdmmc/sdmmc.c     Sun Feb 13 06:43:51 2011 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: sdmmc.c,v 1.7 2011/02/05 15:45:21 nonaka Exp $ */
+/*     $NetBSD: sdmmc.c,v 1.8 2011/02/13 06:43:51 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.7 2011/02/05 15:45:21 nonaka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sdmmc.c,v 1.8 2011/02/13 06:43:51 nonaka Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
@@ -576,6 +576,7 @@
        sf->cis.manufacturer = SDMMC_VENDOR_INVALID;
        sf->cis.product = SDMMC_PRODUCT_INVALID;
        sf->cis.function = SDMMC_FUNCTION_INVALID;
+       sf->width = 1;
 
        if (ISSET(sc->sc_flags, SMF_MEM_MODE) &&
            ISSET(sc->sc_caps, SMC_CAPS_DMA) &&
diff -r 992aa4b80f2a -r 6e3525526cee sys/dev/sdmmc/sdmmc_io.c
--- a/sys/dev/sdmmc/sdmmc_io.c  Sun Feb 13 06:17:35 2011 +0000
+++ b/sys/dev/sdmmc/sdmmc_io.c  Sun Feb 13 06:43:51 2011 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: sdmmc_io.c,v 1.5 2010/10/07 12:40:34 kiyohara Exp $    */
+/*     $NetBSD: sdmmc_io.c,v 1.6 2011/02/13 06:43:52 nonaka Exp $      */
 /*     $OpenBSD: sdmmc_io.c,v 1.10 2007/09/17 01:33:33 krw Exp $       */
 
 /*
@@ -20,7 +20,7 @@
 /* Routines for SD I/O cards. */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sdmmc_io.c,v 1.5 2010/10/07 12:40:34 kiyohara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sdmmc_io.c,v 1.6 2011/02/13 06:43:52 nonaka Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -194,7 +194,6 @@
        SDMMC_LOCK(sc);
 
        if (sf->number == 0) {
-               sf->width = 1;
                reg = sdmmc_io_read_1(sf, SD_IO_CCCR_CAPABILITY);
                if (!(reg & CCCR_CAPS_LSC) || (reg & CCCR_CAPS_4BLS)) {
                        sdmmc_io_write_1(sf, SD_IO_CCCR_BUS_WIDTH,
diff -r 992aa4b80f2a -r 6e3525526cee sys/dev/sdmmc/sdmmc_mem.c
--- a/sys/dev/sdmmc/sdmmc_mem.c Sun Feb 13 06:17:35 2011 +0000
+++ b/sys/dev/sdmmc/sdmmc_mem.c Sun Feb 13 06:43:51 2011 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: sdmmc_mem.c,v 1.15 2011/02/05 15:45:21 nonaka Exp $    */
+/*     $NetBSD: sdmmc_mem.c,v 1.16 2011/02/13 06:43:52 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.15 2011/02/05 15:45:21 nonaka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sdmmc_mem.c,v 1.16 2011/02/13 06:43:52 nonaka Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -342,8 +342,7 @@
                csd->tran_speed = speed_exponent[e] * speed_mantissa[m] / 10;
        } else {
                csd->csdver = MMC_CSD_CSDVER(resp);
-               if (csd->csdver != MMC_CSD_CSDVER_1_0 &&
-                   csd->csdver != MMC_CSD_CSDVER_2_0) {
+               if (csd->csdver == MMC_CSD_CSDVER_1_0) {
                        aprint_error_dev(sc->sc_dev,
                            "unknown MMC CSD structure version 0x%x\n",
                            csd->csdver);
@@ -618,8 +617,6 @@
                        return error;
                }
                sf->width = 4;
-       } else {
-               sf->width = 1;
        }
 
        if (sf->scr.sd_spec >= SCR_SD_SPEC_VER_1_10 &&
@@ -688,9 +685,11 @@
                        aprint_error_dev(sc->sc_dev, "can't read EXT_CSD\n");
                        return error;
                }
-               if (ext_csd[EXT_CSD_STRUCTURE] > EXT_CSD_STRUCTURE_VER_1_2) {
+               if ((sf->csd.csdver == 3) &&
+                   (ext_csd[EXT_CSD_STRUCTURE] > EXT_CSD_STRUCTURE_VER_1_2)) {
                        aprint_error_dev(sc->sc_dev,
-                           "unrecognised future version\n");
+                           "unrecognised future version (%d)\n",
+                               ext_csd[EXT_CSD_STRUCTURE]);
                        return error;
                }
                hs_timing = 0;
@@ -702,14 +701,6 @@
                case EXT_CSD_CARD_TYPE_52M | EXT_CSD_CARD_TYPE_26M:
                        sf->csd.tran_speed = 52000;     /* 52MHz */
                        hs_timing = 1;
-
-                       error = sdmmc_mem_mmc_switch(sf, EXT_CSD_CMD_SET_NORMAL,
-                           EXT_CSD_HS_TIMING, hs_timing);
-                       if (error) {
-                               aprint_error_dev(sc->sc_dev,
-                                   "can't change high speed\n");
-                               return error;
-                       }
                        break;
 
                default:
@@ -718,6 +709,20 @@
                            ext_csd[EXT_CSD_CARD_TYPE]);
                        return error;
                }
+
+               if (!ISSET(sc->sc_caps, SMC_CAPS_MMC_HIGHSPEED)) {
+                       hs_timing = 0;
+               }
+               if (hs_timing) {
+                       error = sdmmc_mem_mmc_switch(sf, EXT_CSD_CMD_SET_NORMAL,
+                           EXT_CSD_HS_TIMING, hs_timing);
+                       if (error) {
+                               aprint_error_dev(sc->sc_dev,
+                                   "can't change high speed\n");
+                               return error;
+                       }
+               }
+
                if (sc->sc_busclk > sf->csd.tran_speed)
                        sc->sc_busclk = sf->csd.tran_speed;
                error =
@@ -727,6 +732,7 @@
                            "can't change bus clock\n");
                        return error;
                }
+
                if (hs_timing) {
                        error = sdmmc_mem_send_cxd_data(sc,
                            MMC_SEND_EXT_CSD, ext_csd, sizeof(ext_csd));
@@ -778,7 +784,6 @@
                            "can't change bus clock\n");
                        return error;
                }
-               sf->width = 1;
        }
 
        return 0;
@@ -993,6 +998,9 @@
                            BUS_DMASYNC_POSTREAD);
                }
                memcpy(data, ptr, datalen);
+#ifdef SDMMC_DEBUG
+               sdmmc_dump_data("CXD", data, datalen);
+#endif
        }
 
 out:
diff -r 992aa4b80f2a -r 6e3525526cee sys/dev/sdmmc/sdmmcreg.h
--- a/sys/dev/sdmmc/sdmmcreg.h  Sun Feb 13 06:17:35 2011 +0000
+++ b/sys/dev/sdmmc/sdmmcreg.h  Sun Feb 13 06:43:51 2011 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: sdmmcreg.h,v 1.5 2010/10/07 12:24:23 kiyohara Exp $    */
+/*     $NetBSD: sdmmcreg.h,v 1.6 2011/02/13 06:43:52 nonaka Exp $      */
 /*     $OpenBSD: sdmmcreg.h,v 1.4 2009/01/09 10:55:22 jsg Exp $        */
 
 /*
@@ -162,14 +162,15 @@
 
 /* MMC R2 response (CSD) */
 #define MMC_CSD_CSDVER(resp)           MMC_RSP_BITS((resp), 126, 2)
-#define  MMC_CSD_CSDVER_1_0            1
-#define  MMC_CSD_CSDVER_2_0            2
+#define  MMC_CSD_CSDVER_1_0            0
+#define  MMC_CSD_CSDVER_1_1            1
+#define  MMC_CSD_CSDVER_1_2            2 /* MMC 4.1 - 4.2 - 4.3 */
 #define MMC_CSD_MMCVER(resp)           MMC_RSP_BITS((resp), 122, 4)
 #define  MMC_CSD_MMCVER_1_0            0 /* MMC 1.0 - 1.2 */
 #define  MMC_CSD_MMCVER_1_4            1 /* MMC 1.4 */
 #define  MMC_CSD_MMCVER_2_0            2 /* MMC 2.0 - 2.2 */
 #define  MMC_CSD_MMCVER_3_1            3 /* MMC 3.1 - 3.3 */
-#define  MMC_CSD_MMCVER_4_0            4 /* MMC 4 */
+#define  MMC_CSD_MMCVER_4_0            4 /* MMC 4.1 - 4.2 - 4.3 */
 #define MMC_CSD_TAAC(resp)             MMC_RSP_BITS((resp), 112, 8)
 #define MMC_CSD_TAAC_MANT(resp)                MMC_RSP_BITS((resp), 115, 4)
 #define MMC_CSD_TAAC_EXP(resp)         MMC_RSP_BITS((resp), 112, 3)
diff -r 992aa4b80f2a -r 6e3525526cee sys/dev/sdmmc/sdmmcvar.h
--- a/sys/dev/sdmmc/sdmmcvar.h  Sun Feb 13 06:17:35 2011 +0000
+++ b/sys/dev/sdmmc/sdmmcvar.h  Sun Feb 13 06:43:51 2011 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: sdmmcvar.h,v 1.9 2011/02/05 15:45:21 nonaka Exp $      */
+/*     $NetBSD: sdmmcvar.h,v 1.10 2011/02/13 06:43:52 nonaka Exp $     */
 /*     $OpenBSD: sdmmcvar.h,v 1.13 2009/01/09 10:55:22 jsg Exp $       */
 
 /*
@@ -220,6 +220,7 @@
 #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 */
+#define SMC_CAPS_MMC_HIGHSPEED 0x0200  /* MMC high-speed timing */
 
        /* function */
        int sc_function_count;          /* number of I/O functions (SDIO) */



Home | Main Index | Thread Index | Old Index