diff options
Diffstat (limited to 'include/linux/mmc')
-rw-r--r-- | include/linux/mmc/card.h | 32 | ||||
-rw-r--r-- | include/linux/mmc/core.h | 65 | ||||
-rw-r--r-- | include/linux/mmc/host.h | 39 | ||||
-rw-r--r-- | include/linux/mmc/mmc.h | 39 | ||||
-rw-r--r-- | include/linux/mmc/sdio.h | 159 | ||||
-rw-r--r-- | include/linux/mmc/sdio_func.h | 153 | ||||
-rw-r--r-- | include/linux/mmc/sdio_ids.h | 23 |
7 files changed, 484 insertions, 26 deletions
diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index badf702fcff4..0d508ac17d64 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h | |||
@@ -55,7 +55,28 @@ struct sd_switch_caps { | |||
55 | unsigned int hs_max_dtr; | 55 | unsigned int hs_max_dtr; |
56 | }; | 56 | }; |
57 | 57 | ||
58 | struct sdio_cccr { | ||
59 | unsigned int sdio_vsn; | ||
60 | unsigned int sd_vsn; | ||
61 | unsigned int multi_block:1, | ||
62 | low_speed:1, | ||
63 | wide_bus:1, | ||
64 | high_power:1, | ||
65 | high_speed:1; | ||
66 | }; | ||
67 | |||
68 | struct sdio_cis { | ||
69 | unsigned short vendor; | ||
70 | unsigned short device; | ||
71 | unsigned short blksize; | ||
72 | unsigned int max_dtr; | ||
73 | }; | ||
74 | |||
58 | struct mmc_host; | 75 | struct mmc_host; |
76 | struct sdio_func; | ||
77 | struct sdio_func_tuple; | ||
78 | |||
79 | #define SDIO_MAX_FUNCS 7 | ||
59 | 80 | ||
60 | /* | 81 | /* |
61 | * MMC device | 82 | * MMC device |
@@ -67,11 +88,13 @@ struct mmc_card { | |||
67 | unsigned int type; /* card type */ | 88 | unsigned int type; /* card type */ |
68 | #define MMC_TYPE_MMC 0 /* MMC card */ | 89 | #define MMC_TYPE_MMC 0 /* MMC card */ |
69 | #define MMC_TYPE_SD 1 /* SD card */ | 90 | #define MMC_TYPE_SD 1 /* SD card */ |
91 | #define MMC_TYPE_SDIO 2 /* SDIO card */ | ||
70 | unsigned int state; /* (our) card state */ | 92 | unsigned int state; /* (our) card state */ |
71 | #define MMC_STATE_PRESENT (1<<0) /* present in sysfs */ | 93 | #define MMC_STATE_PRESENT (1<<0) /* present in sysfs */ |
72 | #define MMC_STATE_READONLY (1<<1) /* card is read-only */ | 94 | #define MMC_STATE_READONLY (1<<1) /* card is read-only */ |
73 | #define MMC_STATE_HIGHSPEED (1<<2) /* card is in high speed mode */ | 95 | #define MMC_STATE_HIGHSPEED (1<<2) /* card is in high speed mode */ |
74 | #define MMC_STATE_BLOCKADDR (1<<3) /* card uses block-addressing */ | 96 | #define MMC_STATE_BLOCKADDR (1<<3) /* card uses block-addressing */ |
97 | |||
75 | u32 raw_cid[4]; /* raw card CID */ | 98 | u32 raw_cid[4]; /* raw card CID */ |
76 | u32 raw_csd[4]; /* raw card CSD */ | 99 | u32 raw_csd[4]; /* raw card CSD */ |
77 | u32 raw_scr[2]; /* raw card SCR */ | 100 | u32 raw_scr[2]; /* raw card SCR */ |
@@ -80,10 +103,19 @@ struct mmc_card { | |||
80 | struct mmc_ext_csd ext_csd; /* mmc v4 extended card specific */ | 103 | struct mmc_ext_csd ext_csd; /* mmc v4 extended card specific */ |
81 | struct sd_scr scr; /* extra SD information */ | 104 | struct sd_scr scr; /* extra SD information */ |
82 | struct sd_switch_caps sw_caps; /* switch (CMD6) caps */ | 105 | struct sd_switch_caps sw_caps; /* switch (CMD6) caps */ |
106 | |||
107 | unsigned int sdio_funcs; /* number of SDIO functions */ | ||
108 | struct sdio_cccr cccr; /* common card info */ | ||
109 | struct sdio_cis cis; /* common tuple info */ | ||
110 | struct sdio_func *sdio_func[SDIO_MAX_FUNCS]; /* SDIO functions (devices) */ | ||
111 | unsigned num_info; /* number of info strings */ | ||
112 | const char **info; /* info strings */ | ||
113 | struct sdio_func_tuple *tuples; /* unknown common tuples */ | ||
83 | }; | 114 | }; |
84 | 115 | ||
85 | #define mmc_card_mmc(c) ((c)->type == MMC_TYPE_MMC) | 116 | #define mmc_card_mmc(c) ((c)->type == MMC_TYPE_MMC) |
86 | #define mmc_card_sd(c) ((c)->type == MMC_TYPE_SD) | 117 | #define mmc_card_sd(c) ((c)->type == MMC_TYPE_SD) |
118 | #define mmc_card_sdio(c) ((c)->type == MMC_TYPE_SDIO) | ||
87 | 119 | ||
88 | #define mmc_card_present(c) ((c)->state & MMC_STATE_PRESENT) | 120 | #define mmc_card_present(c) ((c)->state & MMC_STATE_PRESENT) |
89 | #define mmc_card_readonly(c) ((c)->state & MMC_STATE_READONLY) | 121 | #define mmc_card_readonly(c) ((c)->state & MMC_STATE_READONLY) |
diff --git a/include/linux/mmc/core.h b/include/linux/mmc/core.h index 04bbe12fae8d..d0c3abed74c2 100644 --- a/include/linux/mmc/core.h +++ b/include/linux/mmc/core.h | |||
@@ -25,14 +25,20 @@ struct mmc_command { | |||
25 | #define MMC_RSP_CRC (1 << 2) /* expect valid crc */ | 25 | #define MMC_RSP_CRC (1 << 2) /* expect valid crc */ |
26 | #define MMC_RSP_BUSY (1 << 3) /* card may send busy */ | 26 | #define MMC_RSP_BUSY (1 << 3) /* card may send busy */ |
27 | #define MMC_RSP_OPCODE (1 << 4) /* response contains opcode */ | 27 | #define MMC_RSP_OPCODE (1 << 4) /* response contains opcode */ |
28 | #define MMC_CMD_MASK (3 << 5) /* command type */ | 28 | |
29 | #define MMC_CMD_MASK (3 << 5) /* non-SPI command type */ | ||
29 | #define MMC_CMD_AC (0 << 5) | 30 | #define MMC_CMD_AC (0 << 5) |
30 | #define MMC_CMD_ADTC (1 << 5) | 31 | #define MMC_CMD_ADTC (1 << 5) |
31 | #define MMC_CMD_BC (2 << 5) | 32 | #define MMC_CMD_BC (2 << 5) |
32 | #define MMC_CMD_BCR (3 << 5) | 33 | #define MMC_CMD_BCR (3 << 5) |
33 | 34 | ||
35 | #define MMC_RSP_SPI_S1 (1 << 7) /* one status byte */ | ||
36 | #define MMC_RSP_SPI_S2 (1 << 8) /* second byte */ | ||
37 | #define MMC_RSP_SPI_B4 (1 << 9) /* four data bytes */ | ||
38 | #define MMC_RSP_SPI_BUSY (1 << 10) /* card may send busy */ | ||
39 | |||
34 | /* | 40 | /* |
35 | * These are the response types, and correspond to valid bit | 41 | * These are the native response types, and correspond to valid bit |
36 | * patterns of the above flags. One additional valid pattern | 42 | * patterns of the above flags. One additional valid pattern |
37 | * is all zeros, which means we don't expect a response. | 43 | * is all zeros, which means we don't expect a response. |
38 | */ | 44 | */ |
@@ -41,12 +47,30 @@ struct mmc_command { | |||
41 | #define MMC_RSP_R1B (MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE|MMC_RSP_BUSY) | 47 | #define MMC_RSP_R1B (MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE|MMC_RSP_BUSY) |
42 | #define MMC_RSP_R2 (MMC_RSP_PRESENT|MMC_RSP_136|MMC_RSP_CRC) | 48 | #define MMC_RSP_R2 (MMC_RSP_PRESENT|MMC_RSP_136|MMC_RSP_CRC) |
43 | #define MMC_RSP_R3 (MMC_RSP_PRESENT) | 49 | #define MMC_RSP_R3 (MMC_RSP_PRESENT) |
50 | #define MMC_RSP_R4 (MMC_RSP_PRESENT) | ||
51 | #define MMC_RSP_R5 (MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE) | ||
44 | #define MMC_RSP_R6 (MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE) | 52 | #define MMC_RSP_R6 (MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE) |
45 | #define MMC_RSP_R7 (MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE) | 53 | #define MMC_RSP_R7 (MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE) |
46 | 54 | ||
47 | #define mmc_resp_type(cmd) ((cmd)->flags & (MMC_RSP_PRESENT|MMC_RSP_136|MMC_RSP_CRC|MMC_RSP_BUSY|MMC_RSP_OPCODE)) | 55 | #define mmc_resp_type(cmd) ((cmd)->flags & (MMC_RSP_PRESENT|MMC_RSP_136|MMC_RSP_CRC|MMC_RSP_BUSY|MMC_RSP_OPCODE)) |
48 | 56 | ||
49 | /* | 57 | /* |
58 | * These are the SPI response types for MMC, SD, and SDIO cards. | ||
59 | * Commands return R1, with maybe more info. Zero is an error type; | ||
60 | * callers must always provide the appropriate MMC_RSP_SPI_Rx flags. | ||
61 | */ | ||
62 | #define MMC_RSP_SPI_R1 (MMC_RSP_SPI_S1) | ||
63 | #define MMC_RSP_SPI_R1B (MMC_RSP_SPI_S1|MMC_RSP_SPI_BUSY) | ||
64 | #define MMC_RSP_SPI_R2 (MMC_RSP_SPI_S1|MMC_RSP_SPI_S2) | ||
65 | #define MMC_RSP_SPI_R3 (MMC_RSP_SPI_S1|MMC_RSP_SPI_B4) | ||
66 | #define MMC_RSP_SPI_R4 (MMC_RSP_SPI_S1|MMC_RSP_SPI_B4) | ||
67 | #define MMC_RSP_SPI_R5 (MMC_RSP_SPI_S1|MMC_RSP_SPI_S2) | ||
68 | #define MMC_RSP_SPI_R7 (MMC_RSP_SPI_S1|MMC_RSP_SPI_B4) | ||
69 | |||
70 | #define mmc_spi_resp_type(cmd) ((cmd)->flags & \ | ||
71 | (MMC_RSP_SPI_S1|MMC_RSP_SPI_BUSY|MMC_RSP_SPI_S2|MMC_RSP_SPI_B4)) | ||
72 | |||
73 | /* | ||
50 | * These are the command types. | 74 | * These are the command types. |
51 | */ | 75 | */ |
52 | #define mmc_cmd_type(cmd) ((cmd)->flags & MMC_CMD_MASK) | 76 | #define mmc_cmd_type(cmd) ((cmd)->flags & MMC_CMD_MASK) |
@@ -54,12 +78,19 @@ struct mmc_command { | |||
54 | unsigned int retries; /* max number of retries */ | 78 | unsigned int retries; /* max number of retries */ |
55 | unsigned int error; /* command error */ | 79 | unsigned int error; /* command error */ |
56 | 80 | ||
57 | #define MMC_ERR_NONE 0 | 81 | /* |
58 | #define MMC_ERR_TIMEOUT 1 | 82 | * Standard errno values are used for errors, but some have specific |
59 | #define MMC_ERR_BADCRC 2 | 83 | * meaning in the MMC layer: |
60 | #define MMC_ERR_FIFO 3 | 84 | * |
61 | #define MMC_ERR_FAILED 4 | 85 | * ETIMEDOUT Card took too long to respond |
62 | #define MMC_ERR_INVALID 5 | 86 | * EILSEQ Basic format problem with the received or sent data |
87 | * (e.g. CRC check failed, incorrect opcode in response | ||
88 | * or bad end bit) | ||
89 | * EINVAL Request cannot be performed because of restrictions | ||
90 | * in hardware and/or the driver | ||
91 | * ENOMEDIUM Host can determine that the slot is empty and is | ||
92 | * actively failing requests | ||
93 | */ | ||
63 | 94 | ||
64 | struct mmc_data *data; /* data segment associated with cmd */ | 95 | struct mmc_data *data; /* data segment associated with cmd */ |
65 | struct mmc_request *mrq; /* associated request */ | 96 | struct mmc_request *mrq; /* associated request */ |
@@ -76,7 +107,6 @@ struct mmc_data { | |||
76 | #define MMC_DATA_WRITE (1 << 8) | 107 | #define MMC_DATA_WRITE (1 << 8) |
77 | #define MMC_DATA_READ (1 << 9) | 108 | #define MMC_DATA_READ (1 << 9) |
78 | #define MMC_DATA_STREAM (1 << 10) | 109 | #define MMC_DATA_STREAM (1 << 10) |
79 | #define MMC_DATA_MULTI (1 << 11) | ||
80 | 110 | ||
81 | unsigned int bytes_xfered; | 111 | unsigned int bytes_xfered; |
82 | 112 | ||
@@ -99,14 +129,25 @@ struct mmc_request { | |||
99 | struct mmc_host; | 129 | struct mmc_host; |
100 | struct mmc_card; | 130 | struct mmc_card; |
101 | 131 | ||
102 | extern int mmc_wait_for_req(struct mmc_host *, struct mmc_request *); | 132 | extern void mmc_wait_for_req(struct mmc_host *, struct mmc_request *); |
103 | extern int mmc_wait_for_cmd(struct mmc_host *, struct mmc_command *, int); | 133 | extern int mmc_wait_for_cmd(struct mmc_host *, struct mmc_command *, int); |
104 | extern int mmc_wait_for_app_cmd(struct mmc_host *, struct mmc_card *, | 134 | extern int mmc_wait_for_app_cmd(struct mmc_host *, struct mmc_card *, |
105 | struct mmc_command *, int); | 135 | struct mmc_command *, int); |
106 | 136 | ||
107 | extern void mmc_set_data_timeout(struct mmc_data *, const struct mmc_card *, int); | 137 | extern void mmc_set_data_timeout(struct mmc_data *, const struct mmc_card *); |
108 | 138 | ||
109 | extern void mmc_claim_host(struct mmc_host *host); | 139 | extern int __mmc_claim_host(struct mmc_host *host, atomic_t *abort); |
110 | extern void mmc_release_host(struct mmc_host *host); | 140 | extern void mmc_release_host(struct mmc_host *host); |
111 | 141 | ||
142 | /** | ||
143 | * mmc_claim_host - exclusively claim a host | ||
144 | * @host: mmc host to claim | ||
145 | * | ||
146 | * Claim a host for a set of operations. | ||
147 | */ | ||
148 | static inline void mmc_claim_host(struct mmc_host *host) | ||
149 | { | ||
150 | __mmc_claim_host(host, NULL); | ||
151 | } | ||
152 | |||
112 | #endif | 153 | #endif |
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index b1350dfd3e91..125eee1407ff 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h | |||
@@ -10,6 +10,8 @@ | |||
10 | #ifndef LINUX_MMC_HOST_H | 10 | #ifndef LINUX_MMC_HOST_H |
11 | #define LINUX_MMC_HOST_H | 11 | #define LINUX_MMC_HOST_H |
12 | 12 | ||
13 | #include <linux/leds.h> | ||
14 | |||
13 | #include <linux/mmc/core.h> | 15 | #include <linux/mmc/core.h> |
14 | 16 | ||
15 | struct mmc_ios { | 17 | struct mmc_ios { |
@@ -51,6 +53,7 @@ struct mmc_host_ops { | |||
51 | void (*request)(struct mmc_host *host, struct mmc_request *req); | 53 | void (*request)(struct mmc_host *host, struct mmc_request *req); |
52 | void (*set_ios)(struct mmc_host *host, struct mmc_ios *ios); | 54 | void (*set_ios)(struct mmc_host *host, struct mmc_ios *ios); |
53 | int (*get_ro)(struct mmc_host *host); | 55 | int (*get_ro)(struct mmc_host *host); |
56 | void (*enable_sdio_irq)(struct mmc_host *host, int enable); | ||
54 | }; | 57 | }; |
55 | 58 | ||
56 | struct mmc_card; | 59 | struct mmc_card; |
@@ -87,9 +90,10 @@ struct mmc_host { | |||
87 | 90 | ||
88 | #define MMC_CAP_4_BIT_DATA (1 << 0) /* Can the host do 4 bit transfers */ | 91 | #define MMC_CAP_4_BIT_DATA (1 << 0) /* Can the host do 4 bit transfers */ |
89 | #define MMC_CAP_MULTIWRITE (1 << 1) /* Can accurately report bytes sent to card on error */ | 92 | #define MMC_CAP_MULTIWRITE (1 << 1) /* Can accurately report bytes sent to card on error */ |
90 | #define MMC_CAP_BYTEBLOCK (1 << 2) /* Can do non-log2 block sizes */ | 93 | #define MMC_CAP_MMC_HIGHSPEED (1 << 2) /* Can do MMC high-speed timing */ |
91 | #define MMC_CAP_MMC_HIGHSPEED (1 << 3) /* Can do MMC high-speed timing */ | 94 | #define MMC_CAP_SD_HIGHSPEED (1 << 3) /* Can do SD high-speed timing */ |
92 | #define MMC_CAP_SD_HIGHSPEED (1 << 4) /* Can do SD high-speed timing */ | 95 | #define MMC_CAP_SDIO_IRQ (1 << 4) /* Can signal pending SDIO IRQs */ |
96 | #define MMC_CAP_SPI (1 << 5) /* Talks only SPI protocols */ | ||
93 | 97 | ||
94 | /* host specific block data */ | 98 | /* host specific block data */ |
95 | unsigned int max_seg_size; /* see blk_queue_max_segment_size */ | 99 | unsigned int max_seg_size; /* see blk_queue_max_segment_size */ |
@@ -106,6 +110,14 @@ struct mmc_host { | |||
106 | struct mmc_ios ios; /* current io bus settings */ | 110 | struct mmc_ios ios; /* current io bus settings */ |
107 | u32 ocr; /* the current OCR setting */ | 111 | u32 ocr; /* the current OCR setting */ |
108 | 112 | ||
113 | /* group bitfields together to minimize padding */ | ||
114 | unsigned int use_spi_crc:1; | ||
115 | unsigned int claimed:1; /* host exclusively claimed */ | ||
116 | unsigned int bus_dead:1; /* bus has been released */ | ||
117 | #ifdef CONFIG_MMC_DEBUG | ||
118 | unsigned int removed:1; /* host is being removed */ | ||
119 | #endif | ||
120 | |||
109 | unsigned int mode; /* current card mode of host */ | 121 | unsigned int mode; /* current card mode of host */ |
110 | #define MMC_MODE_MMC 0 | 122 | #define MMC_MODE_MMC 0 |
111 | #define MMC_MODE_SD 1 | 123 | #define MMC_MODE_SD 1 |
@@ -113,16 +125,19 @@ struct mmc_host { | |||
113 | struct mmc_card *card; /* device attached to this host */ | 125 | struct mmc_card *card; /* device attached to this host */ |
114 | 126 | ||
115 | wait_queue_head_t wq; | 127 | wait_queue_head_t wq; |
116 | unsigned int claimed:1; /* host exclusively claimed */ | ||
117 | 128 | ||
118 | struct delayed_work detect; | 129 | struct delayed_work detect; |
119 | #ifdef CONFIG_MMC_DEBUG | ||
120 | unsigned int removed:1; /* host is being removed */ | ||
121 | #endif | ||
122 | 130 | ||
123 | const struct mmc_bus_ops *bus_ops; /* current bus driver */ | 131 | const struct mmc_bus_ops *bus_ops; /* current bus driver */ |
124 | unsigned int bus_refs; /* reference counter */ | 132 | unsigned int bus_refs; /* reference counter */ |
125 | unsigned int bus_dead:1; /* bus has been released */ | 133 | |
134 | unsigned int sdio_irqs; | ||
135 | struct task_struct *sdio_irq_thread; | ||
136 | atomic_t sdio_irq_thread_abort; | ||
137 | |||
138 | #ifdef CONFIG_LEDS_TRIGGERS | ||
139 | struct led_trigger *led; /* activity led */ | ||
140 | #endif | ||
126 | 141 | ||
127 | unsigned long private[0] ____cacheline_aligned; | 142 | unsigned long private[0] ____cacheline_aligned; |
128 | }; | 143 | }; |
@@ -137,6 +152,8 @@ static inline void *mmc_priv(struct mmc_host *host) | |||
137 | return (void *)host->private; | 152 | return (void *)host->private; |
138 | } | 153 | } |
139 | 154 | ||
155 | #define mmc_host_is_spi(host) ((host)->caps & MMC_CAP_SPI) | ||
156 | |||
140 | #define mmc_dev(x) ((x)->parent) | 157 | #define mmc_dev(x) ((x)->parent) |
141 | #define mmc_classdev(x) (&(x)->class_dev) | 158 | #define mmc_classdev(x) (&(x)->class_dev) |
142 | #define mmc_hostname(x) ((x)->class_dev.bus_id) | 159 | #define mmc_hostname(x) ((x)->class_dev.bus_id) |
@@ -147,5 +164,11 @@ extern int mmc_resume_host(struct mmc_host *); | |||
147 | extern void mmc_detect_change(struct mmc_host *, unsigned long delay); | 164 | extern void mmc_detect_change(struct mmc_host *, unsigned long delay); |
148 | extern void mmc_request_done(struct mmc_host *, struct mmc_request *); | 165 | extern void mmc_request_done(struct mmc_host *, struct mmc_request *); |
149 | 166 | ||
167 | static inline void mmc_signal_sdio_irq(struct mmc_host *host) | ||
168 | { | ||
169 | host->ops->enable_sdio_irq(host, 0); | ||
170 | wake_up_process(host->sdio_irq_thread); | ||
171 | } | ||
172 | |||
150 | #endif | 173 | #endif |
151 | 174 | ||
diff --git a/include/linux/mmc/mmc.h b/include/linux/mmc/mmc.h index e3ed9b95040e..4236fbf0b6fb 100644 --- a/include/linux/mmc/mmc.h +++ b/include/linux/mmc/mmc.h | |||
@@ -27,7 +27,7 @@ | |||
27 | 27 | ||
28 | /* Standard MMC commands (4.1) type argument response */ | 28 | /* Standard MMC commands (4.1) type argument response */ |
29 | /* class 1 */ | 29 | /* class 1 */ |
30 | #define MMC_GO_IDLE_STATE 0 /* bc */ | 30 | #define MMC_GO_IDLE_STATE 0 /* bc */ |
31 | #define MMC_SEND_OP_COND 1 /* bcr [31:0] OCR R3 */ | 31 | #define MMC_SEND_OP_COND 1 /* bcr [31:0] OCR R3 */ |
32 | #define MMC_ALL_SEND_CID 2 /* bcr R2 */ | 32 | #define MMC_ALL_SEND_CID 2 /* bcr R2 */ |
33 | #define MMC_SET_RELATIVE_ADDR 3 /* ac [31:16] RCA R1 */ | 33 | #define MMC_SET_RELATIVE_ADDR 3 /* ac [31:16] RCA R1 */ |
@@ -39,8 +39,10 @@ | |||
39 | #define MMC_SEND_CID 10 /* ac [31:16] RCA R2 */ | 39 | #define MMC_SEND_CID 10 /* ac [31:16] RCA R2 */ |
40 | #define MMC_READ_DAT_UNTIL_STOP 11 /* adtc [31:0] dadr R1 */ | 40 | #define MMC_READ_DAT_UNTIL_STOP 11 /* adtc [31:0] dadr R1 */ |
41 | #define MMC_STOP_TRANSMISSION 12 /* ac R1b */ | 41 | #define MMC_STOP_TRANSMISSION 12 /* ac R1b */ |
42 | #define MMC_SEND_STATUS 13 /* ac [31:16] RCA R1 */ | 42 | #define MMC_SEND_STATUS 13 /* ac [31:16] RCA R1 */ |
43 | #define MMC_GO_INACTIVE_STATE 15 /* ac [31:16] RCA */ | 43 | #define MMC_GO_INACTIVE_STATE 15 /* ac [31:16] RCA */ |
44 | #define MMC_SPI_READ_OCR 58 /* spi spi_R3 */ | ||
45 | #define MMC_SPI_CRC_ON_OFF 59 /* spi [0:0] flag spi_R1 */ | ||
44 | 46 | ||
45 | /* class 2 */ | 47 | /* class 2 */ |
46 | #define MMC_SET_BLOCKLEN 16 /* ac [31:0] block len R1 */ | 48 | #define MMC_SET_BLOCKLEN 16 /* ac [31:0] block len R1 */ |
@@ -90,15 +92,15 @@ | |||
90 | */ | 92 | */ |
91 | 93 | ||
92 | /* | 94 | /* |
93 | MMC status in R1 | 95 | MMC status in R1, for native mode (SPI bits are different) |
94 | Type | 96 | Type |
95 | e : error bit | 97 | e : error bit |
96 | s : status bit | 98 | s : status bit |
97 | r : detected and set for the actual command response | 99 | r : detected and set for the actual command response |
98 | x : detected and set during command execution. the host must poll | 100 | x : detected and set during command execution. the host must poll |
99 | the card by sending status command in order to read these bits. | 101 | the card by sending status command in order to read these bits. |
100 | Clear condition | 102 | Clear condition |
101 | a : according to the card state | 103 | a : according to the card state |
102 | b : always related to the previous command. Reception of | 104 | b : always related to the previous command. Reception of |
103 | a valid command will clear it (with a delay of one command) | 105 | a valid command will clear it (with a delay of one command) |
104 | c : clear by read | 106 | c : clear by read |
@@ -124,10 +126,33 @@ | |||
124 | #define R1_CARD_ECC_DISABLED (1 << 14) /* sx, a */ | 126 | #define R1_CARD_ECC_DISABLED (1 << 14) /* sx, a */ |
125 | #define R1_ERASE_RESET (1 << 13) /* sr, c */ | 127 | #define R1_ERASE_RESET (1 << 13) /* sr, c */ |
126 | #define R1_STATUS(x) (x & 0xFFFFE000) | 128 | #define R1_STATUS(x) (x & 0xFFFFE000) |
127 | #define R1_CURRENT_STATE(x) ((x & 0x00001E00) >> 9) /* sx, b (4 bits) */ | 129 | #define R1_CURRENT_STATE(x) ((x & 0x00001E00) >> 9) /* sx, b (4 bits) */ |
128 | #define R1_READY_FOR_DATA (1 << 8) /* sx, a */ | 130 | #define R1_READY_FOR_DATA (1 << 8) /* sx, a */ |
129 | #define R1_APP_CMD (1 << 5) /* sr, c */ | 131 | #define R1_APP_CMD (1 << 5) /* sr, c */ |
130 | 132 | ||
133 | /* | ||
134 | * MMC/SD in SPI mode reports R1 status always, and R2 for SEND_STATUS | ||
135 | * R1 is the low order byte; R2 is the next highest byte, when present. | ||
136 | */ | ||
137 | #define R1_SPI_IDLE (1 << 0) | ||
138 | #define R1_SPI_ERASE_RESET (1 << 1) | ||
139 | #define R1_SPI_ILLEGAL_COMMAND (1 << 2) | ||
140 | #define R1_SPI_COM_CRC (1 << 3) | ||
141 | #define R1_SPI_ERASE_SEQ (1 << 4) | ||
142 | #define R1_SPI_ADDRESS (1 << 5) | ||
143 | #define R1_SPI_PARAMETER (1 << 6) | ||
144 | /* R1 bit 7 is always zero */ | ||
145 | #define R2_SPI_CARD_LOCKED (1 << 8) | ||
146 | #define R2_SPI_WP_ERASE_SKIP (1 << 9) /* or lock/unlock fail */ | ||
147 | #define R2_SPI_LOCK_UNLOCK_FAIL R2_SPI_WP_ERASE_SKIP | ||
148 | #define R2_SPI_ERROR (1 << 10) | ||
149 | #define R2_SPI_CC_ERROR (1 << 11) | ||
150 | #define R2_SPI_CARD_ECC_ERROR (1 << 12) | ||
151 | #define R2_SPI_WP_VIOLATION (1 << 13) | ||
152 | #define R2_SPI_ERASE_PARAM (1 << 14) | ||
153 | #define R2_SPI_OUT_OF_RANGE (1 << 15) /* or CSD overwrite */ | ||
154 | #define R2_SPI_CSD_OVERWRITE R2_SPI_OUT_OF_RANGE | ||
155 | |||
131 | /* These are unpacked versions of the actual responses */ | 156 | /* These are unpacked versions of the actual responses */ |
132 | 157 | ||
133 | struct _mmc_csd { | 158 | struct _mmc_csd { |
@@ -182,6 +207,7 @@ struct _mmc_csd { | |||
182 | */ | 207 | */ |
183 | #define CCC_BASIC (1<<0) /* (0) Basic protocol functions */ | 208 | #define CCC_BASIC (1<<0) /* (0) Basic protocol functions */ |
184 | /* (CMD0,1,2,3,4,7,9,10,12,13,15) */ | 209 | /* (CMD0,1,2,3,4,7,9,10,12,13,15) */ |
210 | /* (and for SPI, CMD58,59) */ | ||
185 | #define CCC_STREAM_READ (1<<1) /* (1) Stream read commands */ | 211 | #define CCC_STREAM_READ (1<<1) /* (1) Stream read commands */ |
186 | /* (CMD11) */ | 212 | /* (CMD11) */ |
187 | #define CCC_BLOCK_READ (1<<2) /* (2) Block read commands */ | 213 | #define CCC_BLOCK_READ (1<<2) /* (2) Block read commands */ |
@@ -227,6 +253,7 @@ struct _mmc_csd { | |||
227 | #define EXT_CSD_BUS_WIDTH 183 /* R/W */ | 253 | #define EXT_CSD_BUS_WIDTH 183 /* R/W */ |
228 | #define EXT_CSD_HS_TIMING 185 /* R/W */ | 254 | #define EXT_CSD_HS_TIMING 185 /* R/W */ |
229 | #define EXT_CSD_CARD_TYPE 196 /* RO */ | 255 | #define EXT_CSD_CARD_TYPE 196 /* RO */ |
256 | #define EXT_CSD_REV 192 /* RO */ | ||
230 | #define EXT_CSD_SEC_CNT 212 /* RO, 4 bytes */ | 257 | #define EXT_CSD_SEC_CNT 212 /* RO, 4 bytes */ |
231 | 258 | ||
232 | /* | 259 | /* |
diff --git a/include/linux/mmc/sdio.h b/include/linux/mmc/sdio.h new file mode 100644 index 000000000000..47ba464f5170 --- /dev/null +++ b/include/linux/mmc/sdio.h | |||
@@ -0,0 +1,159 @@ | |||
1 | /* | ||
2 | * include/linux/mmc/sdio.h | ||
3 | * | ||
4 | * Copyright 2006-2007 Pierre Ossman | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or (at | ||
9 | * your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef MMC_SDIO_H | ||
13 | #define MMC_SDIO_H | ||
14 | |||
15 | /* SDIO commands type argument response */ | ||
16 | #define SD_IO_SEND_OP_COND 5 /* bcr [23:0] OCR R4 */ | ||
17 | #define SD_IO_RW_DIRECT 52 /* ac [31:0] See below R5 */ | ||
18 | #define SD_IO_RW_EXTENDED 53 /* adtc [31:0] See below R5 */ | ||
19 | |||
20 | /* | ||
21 | * SD_IO_RW_DIRECT argument format: | ||
22 | * | ||
23 | * [31] R/W flag | ||
24 | * [30:28] Function number | ||
25 | * [27] RAW flag | ||
26 | * [25:9] Register address | ||
27 | * [7:0] Data | ||
28 | */ | ||
29 | |||
30 | /* | ||
31 | * SD_IO_RW_EXTENDED argument format: | ||
32 | * | ||
33 | * [31] R/W flag | ||
34 | * [30:28] Function number | ||
35 | * [27] Block mode | ||
36 | * [26] Increment address | ||
37 | * [25:9] Register address | ||
38 | * [8:0] Byte/block count | ||
39 | */ | ||
40 | |||
41 | /* | ||
42 | SDIO status in R5 | ||
43 | Type | ||
44 | e : error bit | ||
45 | s : status bit | ||
46 | r : detected and set for the actual command response | ||
47 | x : detected and set during command execution. the host must poll | ||
48 | the card by sending status command in order to read these bits. | ||
49 | Clear condition | ||
50 | a : according to the card state | ||
51 | b : always related to the previous command. Reception of | ||
52 | a valid command will clear it (with a delay of one command) | ||
53 | c : clear by read | ||
54 | */ | ||
55 | |||
56 | #define R5_COM_CRC_ERROR (1 << 15) /* er, b */ | ||
57 | #define R5_ILLEGAL_COMMAND (1 << 14) /* er, b */ | ||
58 | #define R5_ERROR (1 << 11) /* erx, c */ | ||
59 | #define R5_FUNCTION_NUMBER (1 << 9) /* er, c */ | ||
60 | #define R5_OUT_OF_RANGE (1 << 8) /* er, c */ | ||
61 | #define R5_STATUS(x) (x & 0xCB00) | ||
62 | #define R5_IO_CURRENT_STATE(x) ((x & 0x3000) >> 12) /* s, b */ | ||
63 | |||
64 | /* | ||
65 | * Card Common Control Registers (CCCR) | ||
66 | */ | ||
67 | |||
68 | #define SDIO_CCCR_CCCR 0x00 | ||
69 | |||
70 | #define SDIO_CCCR_REV_1_00 0 /* CCCR/FBR Version 1.00 */ | ||
71 | #define SDIO_CCCR_REV_1_10 1 /* CCCR/FBR Version 1.10 */ | ||
72 | #define SDIO_CCCR_REV_1_20 2 /* CCCR/FBR Version 1.20 */ | ||
73 | |||
74 | #define SDIO_SDIO_REV_1_00 0 /* SDIO Spec Version 1.00 */ | ||
75 | #define SDIO_SDIO_REV_1_10 1 /* SDIO Spec Version 1.10 */ | ||
76 | #define SDIO_SDIO_REV_1_20 2 /* SDIO Spec Version 1.20 */ | ||
77 | #define SDIO_SDIO_REV_2_00 3 /* SDIO Spec Version 2.00 */ | ||
78 | |||
79 | #define SDIO_CCCR_SD 0x01 | ||
80 | |||
81 | #define SDIO_SD_REV_1_01 0 /* SD Physical Spec Version 1.01 */ | ||
82 | #define SDIO_SD_REV_1_10 1 /* SD Physical Spec Version 1.10 */ | ||
83 | #define SDIO_SD_REV_2_00 2 /* SD Physical Spec Version 2.00 */ | ||
84 | |||
85 | #define SDIO_CCCR_IOEx 0x02 | ||
86 | #define SDIO_CCCR_IORx 0x03 | ||
87 | |||
88 | #define SDIO_CCCR_IENx 0x04 /* Function/Master Interrupt Enable */ | ||
89 | #define SDIO_CCCR_INTx 0x05 /* Function Interrupt Pending */ | ||
90 | |||
91 | #define SDIO_CCCR_ABORT 0x06 /* function abort/card reset */ | ||
92 | |||
93 | #define SDIO_CCCR_IF 0x07 /* bus interface controls */ | ||
94 | |||
95 | #define SDIO_BUS_WIDTH_1BIT 0x00 | ||
96 | #define SDIO_BUS_WIDTH_4BIT 0x02 | ||
97 | |||
98 | #define SDIO_BUS_CD_DISABLE 0x80 /* disable pull-up on DAT3 (pin 1) */ | ||
99 | |||
100 | #define SDIO_CCCR_CAPS 0x08 | ||
101 | |||
102 | #define SDIO_CCCR_CAP_SDC 0x01 /* can do CMD52 while data transfer */ | ||
103 | #define SDIO_CCCR_CAP_SMB 0x02 /* can do multi-block xfers (CMD53) */ | ||
104 | #define SDIO_CCCR_CAP_SRW 0x04 /* supports read-wait protocol */ | ||
105 | #define SDIO_CCCR_CAP_SBS 0x08 /* supports suspend/resume */ | ||
106 | #define SDIO_CCCR_CAP_S4MI 0x10 /* interrupt during 4-bit CMD53 */ | ||
107 | #define SDIO_CCCR_CAP_E4MI 0x20 /* enable ints during 4-bit CMD53 */ | ||
108 | #define SDIO_CCCR_CAP_LSC 0x40 /* low speed card */ | ||
109 | #define SDIO_CCCR_CAP_4BLS 0x80 /* 4 bit low speed card */ | ||
110 | |||
111 | #define SDIO_CCCR_CIS 0x09 /* common CIS pointer (3 bytes) */ | ||
112 | |||
113 | /* Following 4 regs are valid only if SBS is set */ | ||
114 | #define SDIO_CCCR_SUSPEND 0x0c | ||
115 | #define SDIO_CCCR_SELx 0x0d | ||
116 | #define SDIO_CCCR_EXECx 0x0e | ||
117 | #define SDIO_CCCR_READYx 0x0f | ||
118 | |||
119 | #define SDIO_CCCR_BLKSIZE 0x10 | ||
120 | |||
121 | #define SDIO_CCCR_POWER 0x12 | ||
122 | |||
123 | #define SDIO_POWER_SMPC 0x01 /* Supports Master Power Control */ | ||
124 | #define SDIO_POWER_EMPC 0x02 /* Enable Master Power Control */ | ||
125 | |||
126 | #define SDIO_CCCR_SPEED 0x13 | ||
127 | |||
128 | #define SDIO_SPEED_SHS 0x01 /* Supports High-Speed mode */ | ||
129 | #define SDIO_SPEED_EHS 0x02 /* Enable High-Speed mode */ | ||
130 | |||
131 | /* | ||
132 | * Function Basic Registers (FBR) | ||
133 | */ | ||
134 | |||
135 | #define SDIO_FBR_BASE(f) ((f) * 0x100) /* base of function f's FBRs */ | ||
136 | |||
137 | #define SDIO_FBR_STD_IF 0x00 | ||
138 | |||
139 | #define SDIO_FBR_SUPPORTS_CSA 0x40 /* supports Code Storage Area */ | ||
140 | #define SDIO_FBR_ENABLE_CSA 0x80 /* enable Code Storage Area */ | ||
141 | |||
142 | #define SDIO_FBR_STD_IF_EXT 0x01 | ||
143 | |||
144 | #define SDIO_FBR_POWER 0x02 | ||
145 | |||
146 | #define SDIO_FBR_POWER_SPS 0x01 /* Supports Power Selection */ | ||
147 | #define SDIO_FBR_POWER_EPS 0x02 /* Enable (low) Power Selection */ | ||
148 | |||
149 | #define SDIO_FBR_CIS 0x09 /* CIS pointer (3 bytes) */ | ||
150 | |||
151 | |||
152 | #define SDIO_FBR_CSA 0x0C /* CSA pointer (3 bytes) */ | ||
153 | |||
154 | #define SDIO_FBR_CSA_DATA 0x0F | ||
155 | |||
156 | #define SDIO_FBR_BLKSIZE 0x10 /* block size (2 bytes) */ | ||
157 | |||
158 | #endif | ||
159 | |||
diff --git a/include/linux/mmc/sdio_func.h b/include/linux/mmc/sdio_func.h new file mode 100644 index 000000000000..b050f4d7b41f --- /dev/null +++ b/include/linux/mmc/sdio_func.h | |||
@@ -0,0 +1,153 @@ | |||
1 | /* | ||
2 | * include/linux/mmc/sdio_func.h | ||
3 | * | ||
4 | * Copyright 2007 Pierre Ossman | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or (at | ||
9 | * your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef MMC_SDIO_FUNC_H | ||
13 | #define MMC_SDIO_FUNC_H | ||
14 | |||
15 | #include <linux/device.h> | ||
16 | #include <linux/mod_devicetable.h> | ||
17 | |||
18 | struct mmc_card; | ||
19 | struct sdio_func; | ||
20 | |||
21 | typedef void (sdio_irq_handler_t)(struct sdio_func *); | ||
22 | |||
23 | /* | ||
24 | * SDIO function CIS tuple (unknown to the core) | ||
25 | */ | ||
26 | struct sdio_func_tuple { | ||
27 | struct sdio_func_tuple *next; | ||
28 | unsigned char code; | ||
29 | unsigned char size; | ||
30 | unsigned char data[0]; | ||
31 | }; | ||
32 | |||
33 | /* | ||
34 | * SDIO function devices | ||
35 | */ | ||
36 | struct sdio_func { | ||
37 | struct mmc_card *card; /* the card this device belongs to */ | ||
38 | struct device dev; /* the device */ | ||
39 | sdio_irq_handler_t *irq_handler; /* IRQ callback */ | ||
40 | unsigned int num; /* function number */ | ||
41 | |||
42 | unsigned char class; /* standard interface class */ | ||
43 | unsigned short vendor; /* vendor id */ | ||
44 | unsigned short device; /* device id */ | ||
45 | |||
46 | unsigned max_blksize; /* maximum block size */ | ||
47 | unsigned cur_blksize; /* current block size */ | ||
48 | |||
49 | unsigned int state; /* function state */ | ||
50 | #define SDIO_STATE_PRESENT (1<<0) /* present in sysfs */ | ||
51 | |||
52 | u8 tmpbuf[4]; /* DMA:able scratch buffer */ | ||
53 | |||
54 | unsigned num_info; /* number of info strings */ | ||
55 | const char **info; /* info strings */ | ||
56 | |||
57 | struct sdio_func_tuple *tuples; | ||
58 | }; | ||
59 | |||
60 | #define sdio_func_present(f) ((f)->state & SDIO_STATE_PRESENT) | ||
61 | |||
62 | #define sdio_func_set_present(f) ((f)->state |= SDIO_STATE_PRESENT) | ||
63 | |||
64 | #define sdio_func_id(f) ((f)->dev.bus_id) | ||
65 | |||
66 | #define sdio_get_drvdata(f) dev_get_drvdata(&(f)->dev) | ||
67 | #define sdio_set_drvdata(f,d) dev_set_drvdata(&(f)->dev, d) | ||
68 | |||
69 | /* | ||
70 | * SDIO function device driver | ||
71 | */ | ||
72 | struct sdio_driver { | ||
73 | char *name; | ||
74 | const struct sdio_device_id *id_table; | ||
75 | |||
76 | int (*probe)(struct sdio_func *, const struct sdio_device_id *); | ||
77 | void (*remove)(struct sdio_func *); | ||
78 | |||
79 | struct device_driver drv; | ||
80 | }; | ||
81 | |||
82 | /** | ||
83 | * SDIO_DEVICE - macro used to describe a specific SDIO device | ||
84 | * @vend: the 16 bit manufacturer code | ||
85 | * @dev: the 16 bit function id | ||
86 | * | ||
87 | * This macro is used to create a struct sdio_device_id that matches a | ||
88 | * specific device. The class field will be set to SDIO_ANY_ID. | ||
89 | */ | ||
90 | #define SDIO_DEVICE(vend,dev) \ | ||
91 | .class = SDIO_ANY_ID, \ | ||
92 | .vendor = (vend), .device = (dev) | ||
93 | |||
94 | /** | ||
95 | * SDIO_DEVICE_CLASS - macro used to describe a specific SDIO device class | ||
96 | * @dev_class: the 8 bit standard interface code | ||
97 | * | ||
98 | * This macro is used to create a struct sdio_device_id that matches a | ||
99 | * specific standard SDIO function type. The vendor and device fields will | ||
100 | * be set to SDIO_ANY_ID. | ||
101 | */ | ||
102 | #define SDIO_DEVICE_CLASS(dev_class) \ | ||
103 | .class = (dev_class), \ | ||
104 | .vendor = SDIO_ANY_ID, .device = SDIO_ANY_ID | ||
105 | |||
106 | extern int sdio_register_driver(struct sdio_driver *); | ||
107 | extern void sdio_unregister_driver(struct sdio_driver *); | ||
108 | |||
109 | /* | ||
110 | * SDIO I/O operations | ||
111 | */ | ||
112 | extern void sdio_claim_host(struct sdio_func *func); | ||
113 | extern void sdio_release_host(struct sdio_func *func); | ||
114 | |||
115 | extern int sdio_enable_func(struct sdio_func *func); | ||
116 | extern int sdio_disable_func(struct sdio_func *func); | ||
117 | |||
118 | extern int sdio_set_block_size(struct sdio_func *func, unsigned blksz); | ||
119 | |||
120 | extern int sdio_claim_irq(struct sdio_func *func, sdio_irq_handler_t *handler); | ||
121 | extern int sdio_release_irq(struct sdio_func *func); | ||
122 | |||
123 | extern unsigned char sdio_readb(struct sdio_func *func, | ||
124 | unsigned int addr, int *err_ret); | ||
125 | extern unsigned short sdio_readw(struct sdio_func *func, | ||
126 | unsigned int addr, int *err_ret); | ||
127 | extern unsigned long sdio_readl(struct sdio_func *func, | ||
128 | unsigned int addr, int *err_ret); | ||
129 | |||
130 | extern int sdio_memcpy_fromio(struct sdio_func *func, void *dst, | ||
131 | unsigned int addr, int count); | ||
132 | extern int sdio_readsb(struct sdio_func *func, void *dst, | ||
133 | unsigned int addr, int count); | ||
134 | |||
135 | extern void sdio_writeb(struct sdio_func *func, unsigned char b, | ||
136 | unsigned int addr, int *err_ret); | ||
137 | extern void sdio_writew(struct sdio_func *func, unsigned short b, | ||
138 | unsigned int addr, int *err_ret); | ||
139 | extern void sdio_writel(struct sdio_func *func, unsigned long b, | ||
140 | unsigned int addr, int *err_ret); | ||
141 | |||
142 | extern int sdio_memcpy_toio(struct sdio_func *func, unsigned int addr, | ||
143 | void *src, int count); | ||
144 | extern int sdio_writesb(struct sdio_func *func, unsigned int addr, | ||
145 | void *src, int count); | ||
146 | |||
147 | extern unsigned char sdio_f0_readb(struct sdio_func *func, | ||
148 | unsigned int addr, int *err_ret); | ||
149 | extern void sdio_f0_writeb(struct sdio_func *func, unsigned char b, | ||
150 | unsigned int addr, int *err_ret); | ||
151 | |||
152 | #endif | ||
153 | |||
diff --git a/include/linux/mmc/sdio_ids.h b/include/linux/mmc/sdio_ids.h new file mode 100644 index 000000000000..09306d47ff5e --- /dev/null +++ b/include/linux/mmc/sdio_ids.h | |||
@@ -0,0 +1,23 @@ | |||
1 | /* | ||
2 | * SDIO Classes, Interface Types, Manufacturer IDs, etc. | ||
3 | */ | ||
4 | |||
5 | #ifndef MMC_SDIO_IDS_H | ||
6 | #define MMC_SDIO_IDS_H | ||
7 | |||
8 | /* | ||
9 | * Standard SDIO Function Interfaces | ||
10 | */ | ||
11 | |||
12 | #define SDIO_CLASS_NONE 0x00 /* Not a SDIO standard interface */ | ||
13 | #define SDIO_CLASS_UART 0x01 /* standard UART interface */ | ||
14 | #define SDIO_CLASS_BT_A 0x02 /* Type-A BlueTooth std interface */ | ||
15 | #define SDIO_CLASS_BT_B 0x03 /* Type-B BlueTooth std interface */ | ||
16 | #define SDIO_CLASS_GPS 0x04 /* GPS standard interface */ | ||
17 | #define SDIO_CLASS_CAMERA 0x05 /* Camera standard interface */ | ||
18 | #define SDIO_CLASS_PHS 0x06 /* PHS standard interface */ | ||
19 | #define SDIO_CLASS_WLAN 0x07 /* WLAN interface */ | ||
20 | #define SDIO_CLASS_ATA 0x08 /* Embedded SDIO-ATA std interface */ | ||
21 | |||
22 | |||
23 | #endif | ||