Commit | Line | Data |
---|---|---|
2874c5fd | 1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
e29a7d73 PO |
2 | /* |
3 | * include/linux/mmc/sdio_func.h | |
4 | * | |
ad3868b2 | 5 | * Copyright 2007-2008 Pierre Ossman |
e29a7d73 PO |
6 | */ |
7 | ||
100e9186 RD |
8 | #ifndef LINUX_MMC_SDIO_FUNC_H |
9 | #define LINUX_MMC_SDIO_FUNC_H | |
e29a7d73 | 10 | |
3b38bea0 PO |
11 | #include <linux/device.h> |
12 | #include <linux/mod_devicetable.h> | |
13 | ||
da68c4eb NP |
14 | #include <linux/mmc/pm.h> |
15 | ||
e29a7d73 | 16 | struct mmc_card; |
d1496c39 NP |
17 | struct sdio_func; |
18 | ||
19 | typedef void (sdio_irq_handler_t)(struct sdio_func *); | |
e29a7d73 | 20 | |
b1538bcf NP |
21 | /* |
22 | * SDIO function CIS tuple (unknown to the core) | |
23 | */ | |
24 | struct sdio_func_tuple { | |
25 | struct sdio_func_tuple *next; | |
26 | unsigned char code; | |
27 | unsigned char size; | |
1a91a36a | 28 | unsigned char data[]; |
b1538bcf NP |
29 | }; |
30 | ||
e29a7d73 PO |
31 | /* |
32 | * SDIO function devices | |
33 | */ | |
34 | struct sdio_func { | |
35 | struct mmc_card *card; /* the card this device belongs to */ | |
36 | struct device dev; /* the device */ | |
d1496c39 | 37 | sdio_irq_handler_t *irq_handler; /* IRQ callback */ |
e29a7d73 | 38 | unsigned int num; /* function number */ |
0597007f PO |
39 | |
40 | unsigned char class; /* standard interface class */ | |
41 | unsigned short vendor; /* vendor id */ | |
42 | unsigned short device; /* device id */ | |
43 | ||
9a08f82b DV |
44 | unsigned max_blksize; /* maximum block size */ |
45 | unsigned cur_blksize; /* current block size */ | |
1a632f8c | 46 | |
62a7573e BZ |
47 | unsigned enable_timeout; /* max enable timeout in msec */ |
48 | ||
e29a7d73 PO |
49 | unsigned int state; /* function state */ |
50 | #define SDIO_STATE_PRESENT (1<<0) /* present in sysfs */ | |
b1538bcf | 51 | |
5ef1ecf0 | 52 | u8 *tmpbuf; /* DMA:able scratch buffer */ |
112c9db9 | 53 | |
78366e9c PR |
54 | u8 major_rev; /* major revision number */ |
55 | u8 minor_rev; /* minor revision number */ | |
759bdc7a PO |
56 | unsigned num_info; /* number of info strings */ |
57 | const char **info; /* info strings */ | |
58 | ||
b1538bcf | 59 | struct sdio_func_tuple *tuples; |
e29a7d73 PO |
60 | }; |
61 | ||
62 | #define sdio_func_present(f) ((f)->state & SDIO_STATE_PRESENT) | |
63 | ||
64 | #define sdio_func_set_present(f) ((f)->state |= SDIO_STATE_PRESENT) | |
65 | ||
d1b26863 | 66 | #define sdio_func_id(f) (dev_name(&(f)->dev)) |
e29a7d73 | 67 | |
f76c8515 PO |
68 | #define sdio_get_drvdata(f) dev_get_drvdata(&(f)->dev) |
69 | #define sdio_set_drvdata(f,d) dev_set_drvdata(&(f)->dev, d) | |
996ad568 | 70 | #define dev_to_sdio_func(d) container_of(d, struct sdio_func, dev) |
f76c8515 PO |
71 | |
72 | /* | |
73 | * SDIO function device driver | |
74 | */ | |
75 | struct sdio_driver { | |
76 | char *name; | |
3b38bea0 | 77 | const struct sdio_device_id *id_table; |
f76c8515 | 78 | |
3b38bea0 | 79 | int (*probe)(struct sdio_func *, const struct sdio_device_id *); |
f76c8515 PO |
80 | void (*remove)(struct sdio_func *); |
81 | ||
82 | struct device_driver drv; | |
83 | }; | |
84 | ||
3b38bea0 PO |
85 | /** |
86 | * SDIO_DEVICE - macro used to describe a specific SDIO device | |
87 | * @vend: the 16 bit manufacturer code | |
88 | * @dev: the 16 bit function id | |
89 | * | |
90 | * This macro is used to create a struct sdio_device_id that matches a | |
91 | * specific device. The class field will be set to SDIO_ANY_ID. | |
92 | */ | |
93 | #define SDIO_DEVICE(vend,dev) \ | |
94 | .class = SDIO_ANY_ID, \ | |
95 | .vendor = (vend), .device = (dev) | |
96 | ||
97 | /** | |
98 | * SDIO_DEVICE_CLASS - macro used to describe a specific SDIO device class | |
99 | * @dev_class: the 8 bit standard interface code | |
100 | * | |
101 | * This macro is used to create a struct sdio_device_id that matches a | |
102 | * specific standard SDIO function type. The vendor and device fields will | |
103 | * be set to SDIO_ANY_ID. | |
104 | */ | |
105 | #define SDIO_DEVICE_CLASS(dev_class) \ | |
106 | .class = (dev_class), \ | |
107 | .vendor = SDIO_ANY_ID, .device = SDIO_ANY_ID | |
108 | ||
f76c8515 PO |
109 | extern int sdio_register_driver(struct sdio_driver *); |
110 | extern void sdio_unregister_driver(struct sdio_driver *); | |
111 | ||
db0a3908 SW |
112 | /** |
113 | * module_sdio_driver() - Helper macro for registering a SDIO driver | |
114 | * @__sdio_driver: sdio_driver struct | |
115 | * | |
116 | * Helper macro for SDIO drivers which do not do anything special in module | |
117 | * init/exit. This eliminates a lot of boilerplate. Each module may only | |
118 | * use this macro once, and calling it replaces module_init() and module_exit() | |
119 | */ | |
120 | #define module_sdio_driver(__sdio_driver) \ | |
121 | module_driver(__sdio_driver, sdio_register_driver, \ | |
122 | sdio_unregister_driver) | |
123 | ||
46f555f2 PO |
124 | /* |
125 | * SDIO I/O operations | |
126 | */ | |
127 | extern void sdio_claim_host(struct sdio_func *func); | |
128 | extern void sdio_release_host(struct sdio_func *func); | |
129 | ||
fa64efa1 PO |
130 | extern int sdio_enable_func(struct sdio_func *func); |
131 | extern int sdio_disable_func(struct sdio_func *func); | |
132 | ||
9a08f82b DV |
133 | extern int sdio_set_block_size(struct sdio_func *func, unsigned blksz); |
134 | ||
d1496c39 NP |
135 | extern int sdio_claim_irq(struct sdio_func *func, sdio_irq_handler_t *handler); |
136 | extern int sdio_release_irq(struct sdio_func *func); | |
137 | ||
ad3868b2 PO |
138 | extern unsigned int sdio_align_size(struct sdio_func *func, unsigned int sz); |
139 | ||
6d373331 TW |
140 | extern u8 sdio_readb(struct sdio_func *func, unsigned int addr, int *err_ret); |
141 | extern u16 sdio_readw(struct sdio_func *func, unsigned int addr, int *err_ret); | |
142 | extern u32 sdio_readl(struct sdio_func *func, unsigned int addr, int *err_ret); | |
112c9db9 PO |
143 | |
144 | extern int sdio_memcpy_fromio(struct sdio_func *func, void *dst, | |
145 | unsigned int addr, int count); | |
146 | extern int sdio_readsb(struct sdio_func *func, void *dst, | |
147 | unsigned int addr, int count); | |
46f555f2 | 148 | |
6d373331 | 149 | extern void sdio_writeb(struct sdio_func *func, u8 b, |
46f555f2 | 150 | unsigned int addr, int *err_ret); |
6d373331 | 151 | extern void sdio_writew(struct sdio_func *func, u16 b, |
112c9db9 | 152 | unsigned int addr, int *err_ret); |
6d373331 | 153 | extern void sdio_writel(struct sdio_func *func, u32 b, |
112c9db9 PO |
154 | unsigned int addr, int *err_ret); |
155 | ||
6c1f716e GI |
156 | extern u8 sdio_writeb_readb(struct sdio_func *func, u8 write_byte, |
157 | unsigned int addr, int *err_ret); | |
158 | ||
112c9db9 PO |
159 | extern int sdio_memcpy_toio(struct sdio_func *func, unsigned int addr, |
160 | void *src, int count); | |
161 | extern int sdio_writesb(struct sdio_func *func, unsigned int addr, | |
162 | void *src, int count); | |
46f555f2 | 163 | |
7806cdb4 DV |
164 | extern unsigned char sdio_f0_readb(struct sdio_func *func, |
165 | unsigned int addr, int *err_ret); | |
166 | extern void sdio_f0_writeb(struct sdio_func *func, unsigned char b, | |
167 | unsigned int addr, int *err_ret); | |
168 | ||
da68c4eb NP |
169 | extern mmc_pm_flag_t sdio_get_host_pm_caps(struct sdio_func *func); |
170 | extern int sdio_set_host_pm_flags(struct sdio_func *func, mmc_pm_flag_t flags); | |
171 | ||
0a55f4ab DA |
172 | extern void sdio_retune_crc_disable(struct sdio_func *func); |
173 | extern void sdio_retune_crc_enable(struct sdio_func *func); | |
174 | ||
b4c9f938 DA |
175 | extern void sdio_retune_hold_now(struct sdio_func *func); |
176 | extern void sdio_retune_release(struct sdio_func *func); | |
177 | ||
100e9186 | 178 | #endif /* LINUX_MMC_SDIO_FUNC_H */ |