1
2
3
4
5
6
7
8
9
10#ifndef LINUX_MMC_CARD_H
11#define LINUX_MMC_CARD_H
12
13#include <linux/mmc/core.h>
14
15struct mmc_cid {
16 unsigned int manfid;
17 char prod_name[8];
18 unsigned int serial;
19 unsigned short oemid;
20 unsigned short year;
21 unsigned char hwrev;
22 unsigned char fwrev;
23 unsigned char month;
24};
25
26struct mmc_csd {
27 unsigned char mmca_vsn;
28 unsigned short cmdclass;
29 unsigned short tacc_clks;
30 unsigned int tacc_ns;
31 unsigned int r2w_factor;
32 unsigned int max_dtr;
33 unsigned int read_blkbits;
34 unsigned int write_blkbits;
35 unsigned int capacity;
36 unsigned int read_partial:1,
37 read_misalign:1,
38 write_partial:1,
39 write_misalign:1;
40};
41
42struct mmc_ext_csd {
43 u8 rev;
44 unsigned int sa_timeout;
45 unsigned int hs_max_dtr;
46 unsigned int sectors;
47};
48
49struct sd_scr {
50 unsigned char sda_vsn;
51 unsigned char bus_widths;
52#define SD_SCR_BUS_WIDTH_1 (1<<0)
53#define SD_SCR_BUS_WIDTH_4 (1<<2)
54};
55
56struct sd_switch_caps {
57 unsigned int hs_max_dtr;
58};
59
60struct sdio_cccr {
61 unsigned int sdio_vsn;
62 unsigned int sd_vsn;
63 unsigned int multi_block:1,
64 low_speed:1,
65 wide_bus:1,
66 high_power:1,
67 high_speed:1,
68 disable_cd:1;
69};
70
71struct sdio_cis {
72 unsigned short vendor;
73 unsigned short device;
74 unsigned short blksize;
75 unsigned int max_dtr;
76};
77
78struct mmc_host;
79struct sdio_func;
80struct sdio_func_tuple;
81
82#define SDIO_MAX_FUNCS 7
83
84
85
86
87struct mmc_card {
88 struct mmc_host *host;
89 struct device dev;
90 unsigned int rca;
91 unsigned int type;
92#define MMC_TYPE_MMC 0
93#define MMC_TYPE_SD 1
94#define MMC_TYPE_SDIO 2
95 unsigned int state;
96#define MMC_STATE_PRESENT (1<<0)
97#define MMC_STATE_READONLY (1<<1)
98#define MMC_STATE_HIGHSPEED (1<<2)
99#define MMC_STATE_BLOCKADDR (1<<3)
100 unsigned int quirks;
101#define MMC_QUIRK_LENIENT_FN0 (1<<0)
102
103 u32 raw_cid[4];
104 u32 raw_csd[4];
105 u32 raw_scr[2];
106 struct mmc_cid cid;
107 struct mmc_csd csd;
108 struct mmc_ext_csd ext_csd;
109 struct sd_scr scr;
110 struct sd_switch_caps sw_caps;
111
112 unsigned int sdio_funcs;
113 struct sdio_cccr cccr;
114 struct sdio_cis cis;
115 struct sdio_func *sdio_func[SDIO_MAX_FUNCS];
116 unsigned num_info;
117 const char **info;
118 struct sdio_func_tuple *tuples;
119
120 struct dentry *debugfs_root;
121};
122
123#define mmc_card_mmc(c) ((c)->type == MMC_TYPE_MMC)
124#define mmc_card_sd(c) ((c)->type == MMC_TYPE_SD)
125#define mmc_card_sdio(c) ((c)->type == MMC_TYPE_SDIO)
126
127#define mmc_card_present(c) ((c)->state & MMC_STATE_PRESENT)
128#define mmc_card_readonly(c) ((c)->state & MMC_STATE_READONLY)
129#define mmc_card_highspeed(c) ((c)->state & MMC_STATE_HIGHSPEED)
130#define mmc_card_blockaddr(c) ((c)->state & MMC_STATE_BLOCKADDR)
131
132#define mmc_card_set_present(c) ((c)->state |= MMC_STATE_PRESENT)
133#define mmc_card_set_readonly(c) ((c)->state |= MMC_STATE_READONLY)
134#define mmc_card_set_highspeed(c) ((c)->state |= MMC_STATE_HIGHSPEED)
135#define mmc_card_set_blockaddr(c) ((c)->state |= MMC_STATE_BLOCKADDR)
136
137static inline int mmc_card_lenient_fn0(const struct mmc_card *c)
138{
139 return c->quirks & MMC_QUIRK_LENIENT_FN0;
140}
141
142#define mmc_card_name(c) ((c)->cid.prod_name)
143#define mmc_card_id(c) (dev_name(&(c)->dev))
144
145#define mmc_list_to_card(l) container_of(l, struct mmc_card, node)
146#define mmc_get_drvdata(c) dev_get_drvdata(&(c)->dev)
147#define mmc_set_drvdata(c,d) dev_set_drvdata(&(c)->dev, d)
148
149
150
151
152struct mmc_driver {
153 struct device_driver drv;
154 int (*probe)(struct mmc_card *);
155 void (*remove)(struct mmc_card *);
156 int (*suspend)(struct mmc_card *, pm_message_t);
157 int (*resume)(struct mmc_card *);
158};
159
160extern int mmc_register_driver(struct mmc_driver *);
161extern void mmc_unregister_driver(struct mmc_driver *);
162
163#endif
164