include/linux/mmc/core.h
changeset 0 aa628870c1d3
child 2 d1f6d8b6f81c
equal deleted inserted replaced
-1:000000000000 0:aa628870c1d3
       
     1 /*
       
     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 extern unsigned int mmc_align_data_size(struct mmc_card *, unsigned int);
       
   139 
       
   140 extern int __mmc_claim_host(struct mmc_host *host, atomic_t *abort);
       
   141 extern void mmc_release_host(struct mmc_host *host);
       
   142 
       
   143 /**
       
   144  *	mmc_claim_host - exclusively claim a host
       
   145  *	@host: mmc host to claim
       
   146  *
       
   147  *	Claim a host for a set of operations.
       
   148  */
       
   149 static inline void mmc_claim_host(struct mmc_host *host)
       
   150 {
       
   151 	__mmc_claim_host(host, NULL);
       
   152 }
       
   153 
       
   154 #endif