[PATCH] MMC: Proper MMC command classes support
authorPierre Ossman <drzeus-list@cx.rmk.(none)>
Sat, 21 May 2005 09:27:02 +0000 (10:27 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Sat, 21 May 2005 09:27:02 +0000 (10:27 +0100)
Defines for the different command classes as defined in the MMC and SD
specifications.

Removes the check for high command classes and instead checks that the
command classes needed are present.
Previous solution killed forward compatibility at no apparent gain.

Signed-of-by: Pierre Ossman
drivers/mmc/mmc_block.c
include/linux/mmc/protocol.h

index b5b4a7b1190349236fd42f073eb522da471177d1..d4eee99c2bf65ffe86798deb86cdd5ef0a2e81da 100644 (file)
@@ -383,7 +383,10 @@ static int mmc_blk_probe(struct mmc_card *card)
        struct mmc_blk_data *md;
        int err;
 
-       if (card->csd.cmdclass & ~0x1ff)
+       /*
+        * Check that the card supports the command class(es) we need.
+        */
+       if (!(card->csd.cmdclass & CCC_BLOCK_READ))
                return -ENODEV;
 
        if (card->csd.read_blkbits < 9) {
index 7b904c5102f6b96bd9d5cfa3fd956c8334bc5c59..896342817b97bab2a7b20bb247115317224583fe 100644 (file)
@@ -195,6 +195,33 @@ struct _mmc_csd {
 #define MMC_VDD_35_36  0x00800000      /* VDD voltage 3.5 ~ 3.6 */
 #define MMC_CARD_BUSY  0x80000000      /* Card Power up status bit */
 
+/*
+ * Card Command Classes (CCC)
+ */
+#define CCC_BASIC              (1<<0)  /* (0) Basic protocol functions */
+                                       /* (CMD0,1,2,3,4,7,9,10,12,13,15) */
+#define CCC_STREAM_READ                (1<<1)  /* (1) Stream read commands */
+                                       /* (CMD11) */
+#define CCC_BLOCK_READ         (1<<2)  /* (2) Block read commands */
+                                       /* (CMD16,17,18) */
+#define CCC_STREAM_WRITE       (1<<3)  /* (3) Stream write commands */
+                                       /* (CMD20) */
+#define CCC_BLOCK_WRITE                (1<<4)  /* (4) Block write commands */
+                                       /* (CMD16,24,25,26,27) */
+#define CCC_ERASE              (1<<5)  /* (5) Ability to erase blocks */
+                                       /* (CMD32,33,34,35,36,37,38,39) */
+#define CCC_WRITE_PROT         (1<<6)  /* (6) Able to write protect blocks */
+                                       /* (CMD28,29,30) */
+#define CCC_LOCK_CARD          (1<<7)  /* (7) Able to lock down card */
+                                       /* (CMD16,CMD42) */
+#define CCC_APP_SPEC           (1<<8)  /* (8) Application specific */
+                                       /* (CMD55,56,57,ACMD*) */
+#define CCC_IO_MODE            (1<<9)  /* (9) I/O mode */
+                                       /* (CMD5,39,40,52,53) */
+#define CCC_SWITCH             (1<<10) /* (10) High speed switch */
+                                       /* (CMD6,34,35,36,37,50) */
+                                       /* (11) Reserved */
+                                       /* (CMD?) */
 
 /*
  * CSD field definitions