| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* | 
|  | 2 | *  linux/include/linux/mmc/mmc.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 MMC_H | 
|  | 9 | #define MMC_H | 
|  | 10 |  | 
|  | 11 | #include <linux/list.h> | 
|  | 12 | #include <linux/interrupt.h> | 
|  | 13 | #include <linux/device.h> | 
|  | 14 |  | 
|  | 15 | struct request; | 
|  | 16 | struct mmc_data; | 
|  | 17 | struct mmc_request; | 
|  | 18 |  | 
|  | 19 | struct mmc_command { | 
|  | 20 | u32			opcode; | 
|  | 21 | u32			arg; | 
|  | 22 | u32			resp[4]; | 
|  | 23 | unsigned int		flags;		/* expected response type */ | 
| Russell King | e922517 | 2006-02-02 12:23:12 +0000 | [diff] [blame] | 24 | #define MMC_RSP_PRESENT	(1 << 0) | 
|  | 25 | #define MMC_RSP_136	(1 << 1)		/* 136 bit response */ | 
|  | 26 | #define MMC_RSP_CRC	(1 << 2)		/* expect valid crc */ | 
|  | 27 | #define MMC_RSP_BUSY	(1 << 3)		/* card may send busy */ | 
|  | 28 | #define MMC_RSP_OPCODE	(1 << 4)		/* response contains opcode */ | 
|  | 29 | #define MMC_CMD_MASK	(3 << 5)		/* 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) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 34 |  | 
|  | 35 | /* | 
|  | 36 | * These are the response types, and correspond to valid bit | 
|  | 37 | * patterns of the above flags.  One additional valid pattern | 
|  | 38 | * is all zeros, which means we don't expect a response. | 
|  | 39 | */ | 
| Russell King | e922517 | 2006-02-02 12:23:12 +0000 | [diff] [blame] | 40 | #define MMC_RSP_NONE	(0) | 
|  | 41 | #define MMC_RSP_R1	(MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE) | 
|  | 42 | #define MMC_RSP_R1B	(MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE|MMC_RSP_BUSY) | 
|  | 43 | #define MMC_RSP_R2	(MMC_RSP_PRESENT|MMC_RSP_136|MMC_RSP_CRC) | 
|  | 44 | #define MMC_RSP_R3	(MMC_RSP_PRESENT) | 
| Philip Langdale | 6f94990 | 2007-01-04 07:04:47 -0800 | [diff] [blame] | 45 | #define MMC_RSP_R6	(MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE) | 
| Philip Langdale | fba68bd | 2007-01-04 06:57:32 -0800 | [diff] [blame] | 46 | #define MMC_RSP_R7	(MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE) | 
| Russell King | e922517 | 2006-02-02 12:23:12 +0000 | [diff] [blame] | 47 |  | 
|  | 48 | #define mmc_resp_type(cmd)	((cmd)->flags & (MMC_RSP_PRESENT|MMC_RSP_136|MMC_RSP_CRC|MMC_RSP_BUSY|MMC_RSP_OPCODE)) | 
|  | 49 |  | 
|  | 50 | /* | 
|  | 51 | * These are the command types. | 
|  | 52 | */ | 
| Russell King | 5bd546a | 2006-02-17 20:23:29 +0000 | [diff] [blame] | 53 | #define mmc_cmd_type(cmd)	((cmd)->flags & MMC_CMD_MASK) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 54 |  | 
|  | 55 | unsigned int		retries;	/* max number of retries */ | 
|  | 56 | unsigned int		error;		/* command error */ | 
|  | 57 |  | 
|  | 58 | #define MMC_ERR_NONE	0 | 
|  | 59 | #define MMC_ERR_TIMEOUT	1 | 
|  | 60 | #define MMC_ERR_BADCRC	2 | 
|  | 61 | #define MMC_ERR_FIFO	3 | 
|  | 62 | #define MMC_ERR_FAILED	4 | 
|  | 63 | #define MMC_ERR_INVALID	5 | 
|  | 64 |  | 
|  | 65 | struct mmc_data		*data;		/* data segment associated with cmd */ | 
| Erik Hovland | 8573b80 | 2005-10-28 16:28:04 +0100 | [diff] [blame] | 66 | struct mmc_request	*mrq;		/* associated request */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 67 | }; | 
|  | 68 |  | 
|  | 69 | struct mmc_data { | 
|  | 70 | unsigned int		timeout_ns;	/* data timeout (in ns, max 80ms) */ | 
|  | 71 | unsigned int		timeout_clks;	/* data timeout (in clocks) */ | 
| Pavel Pisa | 2c171bf | 2006-05-19 21:48:03 +0100 | [diff] [blame] | 72 | unsigned int		blksz;		/* data block size */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 73 | unsigned int		blocks;		/* number of blocks */ | 
|  | 74 | unsigned int		error;		/* data error */ | 
|  | 75 | unsigned int		flags; | 
|  | 76 |  | 
|  | 77 | #define MMC_DATA_WRITE	(1 << 8) | 
|  | 78 | #define MMC_DATA_READ	(1 << 9) | 
|  | 79 | #define MMC_DATA_STREAM	(1 << 10) | 
| Russell King | 788ee7b | 2006-01-09 21:12:17 +0000 | [diff] [blame] | 80 | #define MMC_DATA_MULTI	(1 << 11) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 81 |  | 
|  | 82 | unsigned int		bytes_xfered; | 
|  | 83 |  | 
|  | 84 | struct mmc_command	*stop;		/* stop command */ | 
| Erik Hovland | 8573b80 | 2005-10-28 16:28:04 +0100 | [diff] [blame] | 85 | struct mmc_request	*mrq;		/* associated request */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 86 |  | 
|  | 87 | unsigned int		sg_len;		/* size of scatter list */ | 
|  | 88 | struct scatterlist	*sg;		/* I/O scatter list */ | 
|  | 89 | }; | 
|  | 90 |  | 
|  | 91 | struct mmc_request { | 
|  | 92 | struct mmc_command	*cmd; | 
|  | 93 | struct mmc_data		*data; | 
|  | 94 | struct mmc_command	*stop; | 
|  | 95 |  | 
|  | 96 | void			*done_data;	/* completion data */ | 
|  | 97 | void			(*done)(struct mmc_request *);/* completion function */ | 
|  | 98 | }; | 
|  | 99 |  | 
|  | 100 | struct mmc_host; | 
|  | 101 | struct mmc_card; | 
|  | 102 |  | 
|  | 103 | extern int mmc_wait_for_req(struct mmc_host *, struct mmc_request *); | 
|  | 104 | extern int mmc_wait_for_cmd(struct mmc_host *, struct mmc_command *, int); | 
| Pierre Ossman | 335eadf | 2005-09-06 15:18:50 -0700 | [diff] [blame] | 105 | extern int mmc_wait_for_app_cmd(struct mmc_host *, unsigned int, | 
|  | 106 | struct mmc_command *, int); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 107 |  | 
| Russell King | d773d72 | 2006-09-07 15:57:12 +0100 | [diff] [blame] | 108 | extern void mmc_set_data_timeout(struct mmc_data *, const struct mmc_card *, int); | 
|  | 109 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 110 | extern int __mmc_claim_host(struct mmc_host *host, struct mmc_card *card); | 
|  | 111 |  | 
|  | 112 | static inline void mmc_claim_host(struct mmc_host *host) | 
|  | 113 | { | 
|  | 114 | __mmc_claim_host(host, (struct mmc_card *)-1); | 
|  | 115 | } | 
|  | 116 |  | 
|  | 117 | extern void mmc_release_host(struct mmc_host *host); | 
|  | 118 |  | 
|  | 119 | #endif |