1 |
62 |
marcus.erl |
/*
|
2 |
|
|
* linux/include/linux/mmc/core.h
|
3 |
|
|
*
|
4 |
|
|
* This program is free software; you can redistribute it and/or modify
|
5 |
|
|
* it under the terms of the GNU General Public License version 2 as
|
6 |
|
|
* published by the Free Software Foundation.
|
7 |
|
|
*/
|
8 |
|
|
#ifndef LINUX_MMC_CORE_H
|
9 |
|
|
#define LINUX_MMC_CORE_H
|
10 |
|
|
|
11 |
|
|
#include <linux/interrupt.h>
|
12 |
|
|
#include <linux/device.h>
|
13 |
|
|
|
14 |
|
|
struct request;
|
15 |
|
|
struct mmc_data;
|
16 |
|
|
struct mmc_request;
|
17 |
|
|
|
18 |
|
|
struct mmc_command {
|
19 |
|
|
u32 opcode;
|
20 |
|
|
u32 arg;
|
21 |
|
|
u32 resp[4];
|
22 |
|
|
unsigned int flags; /* expected response type */
|
23 |
|
|
#define MMC_RSP_PRESENT (1 << 0)
|
24 |
|
|
#define MMC_RSP_136 (1 << 1) /* 136 bit response */
|
25 |
|
|
#define MMC_RSP_CRC (1 << 2) /* expect valid crc */
|
26 |
|
|
#define MMC_RSP_BUSY (1 << 3) /* card may send busy */
|
27 |
|
|
#define MMC_RSP_OPCODE (1 << 4) /* response contains opcode */
|
28 |
|
|
|
29 |
|
|
#define MMC_CMD_MASK (3 << 5) /* non-SPI command type */
|
30 |
|
|
#define MMC_CMD_AC (0 << 5)
|
31 |
|
|
#define MMC_CMD_ADTC (1 << 5)
|
32 |
|
|
#define MMC_CMD_BC (2 << 5)
|
33 |
|
|
#define MMC_CMD_BCR (3 << 5)
|
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 |
|
|
|
40 |
|
|
/*
|
41 |
|
|
* These are the native response types, and correspond to valid bit
|
42 |
|
|
* patterns of the above flags. One additional valid pattern
|
43 |
|
|
* is all zeros, which means we don't expect a response.
|
44 |
|
|
*/
|
45 |
|
|
#define MMC_RSP_NONE (0)
|
46 |
|
|
#define MMC_RSP_R1 (MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE)
|
47 |
|
|
#define MMC_RSP_R1B (MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE|MMC_RSP_BUSY)
|
48 |
|
|
#define MMC_RSP_R2 (MMC_RSP_PRESENT|MMC_RSP_136|MMC_RSP_CRC)
|
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)
|
52 |
|
|
#define MMC_RSP_R6 (MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE)
|
53 |
|
|
#define MMC_RSP_R7 (MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE)
|
54 |
|
|
|
55 |
|
|
#define mmc_resp_type(cmd) ((cmd)->flags & (MMC_RSP_PRESENT|MMC_RSP_136|MMC_RSP_CRC|MMC_RSP_BUSY|MMC_RSP_OPCODE))
|
56 |
|
|
|
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 |
|
|
/*
|
74 |
|
|
* These are the command types.
|
75 |
|
|
*/
|
76 |
|
|
#define mmc_cmd_type(cmd) ((cmd)->flags & MMC_CMD_MASK)
|
77 |
|
|
|
78 |
|
|
unsigned int retries; /* max number of retries */
|
79 |
|
|
unsigned int error; /* command error */
|
80 |
|
|
|
81 |
|
|
/*
|
82 |
|
|
* Standard errno values are used for errors, but some have specific
|
83 |
|
|
* meaning in the MMC layer:
|
84 |
|
|
*
|
85 |
|
|
* ETIMEDOUT Card took too long to respond
|
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 |
|
|
*/
|
94 |
|
|
|
95 |
|
|
struct mmc_data *data; /* data segment associated with cmd */
|
96 |
|
|
struct mmc_request *mrq; /* associated request */
|
97 |
|
|
};
|
98 |
|
|
|
99 |
|
|
struct mmc_data {
|
100 |
|
|
unsigned int timeout_ns; /* data timeout (in ns, max 80ms) */
|
101 |
|
|
unsigned int timeout_clks; /* data timeout (in clocks) */
|
102 |
|
|
unsigned int blksz; /* data block size */
|
103 |
|
|
unsigned int blocks; /* number of blocks */
|
104 |
|
|
unsigned int error; /* data error */
|
105 |
|
|
unsigned int flags;
|
106 |
|
|
|
107 |
|
|
#define MMC_DATA_WRITE (1 << 8)
|
108 |
|
|
#define MMC_DATA_READ (1 << 9)
|
109 |
|
|
#define MMC_DATA_STREAM (1 << 10)
|
110 |
|
|
|
111 |
|
|
unsigned int bytes_xfered;
|
112 |
|
|
|
113 |
|
|
struct mmc_command *stop; /* stop command */
|
114 |
|
|
struct mmc_request *mrq; /* associated request */
|
115 |
|
|
|
116 |
|
|
unsigned int sg_len; /* size of scatter list */
|
117 |
|
|
struct scatterlist *sg; /* I/O scatter list */
|
118 |
|
|
};
|
119 |
|
|
|
120 |
|
|
struct mmc_request {
|
121 |
|
|
struct mmc_command *cmd;
|
122 |
|
|
struct mmc_data *data;
|
123 |
|
|
struct mmc_command *stop;
|
124 |
|
|
|
125 |
|
|
void *done_data; /* completion data */
|
126 |
|
|
void (*done)(struct mmc_request *);/* completion function */
|
127 |
|
|
};
|
128 |
|
|
|
129 |
|
|
struct mmc_host;
|
130 |
|
|
struct mmc_card;
|
131 |
|
|
|
132 |
|
|
extern void mmc_wait_for_req(struct mmc_host *, struct mmc_request *);
|
133 |
|
|
extern int mmc_wait_for_cmd(struct mmc_host *, struct mmc_command *, int);
|
134 |
|
|
extern int mmc_wait_for_app_cmd(struct mmc_host *, struct mmc_card *,
|
135 |
|
|
struct mmc_command *, int);
|
136 |
|
|
|
137 |
|
|
extern void mmc_set_data_timeout(struct mmc_data *, const struct mmc_card *);
|
138 |
|
|
|
139 |
|
|
extern int __mmc_claim_host(struct mmc_host *host, atomic_t *abort);
|
140 |
|
|
extern void mmc_release_host(struct mmc_host *host);
|
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 |
|
|
|
153 |
|
|
#endif
|