1 /*
2  * device_id.h -- PCMCIA driver matching helpers
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  * (C) 2003 - 2004	David Woodhouse
9  * (C) 2003 - 2004	Dominik Brodowski
10  */
11 
12 #ifndef _LINUX_PCMCIA_DEVICE_ID_H
13 #define _LINUX_PCMCIA_DEVICE_ID_H
14 
15 #ifdef __KERNEL__
16 
17 #define PCMCIA_DEVICE_MANF_CARD(manf, card) { \
18 	.match_flags = PCMCIA_DEV_ID_MATCH_MANF_ID| \
19 			PCMCIA_DEV_ID_MATCH_CARD_ID, \
20 	.manf_id = (manf), \
21 	.card_id = (card), }
22 
23 #define PCMCIA_DEVICE_FUNC_ID(func) { \
24 	.match_flags = PCMCIA_DEV_ID_MATCH_FUNC_ID, \
25 	.func_id = (func), }
26 
27 #define PCMCIA_DEVICE_PROD_ID1(v1, vh1) { \
28 	.match_flags = PCMCIA_DEV_ID_MATCH_PROD_ID1, \
29 	.prod_id = { (v1), NULL, NULL, NULL }, \
30 	.prod_id_hash = { (vh1), 0, 0, 0 }, }
31 
32 #define PCMCIA_DEVICE_PROD_ID2(v2, vh2) { \
33 	.match_flags = PCMCIA_DEV_ID_MATCH_PROD_ID2, \
34 	.prod_id = { NULL, (v2), NULL, NULL },  \
35 	.prod_id_hash = { 0, (vh2), 0, 0 }, }
36 
37 #define PCMCIA_DEVICE_PROD_ID3(v3, vh3) { \
38 	.match_flags = PCMCIA_DEV_ID_MATCH_PROD_ID3, \
39 	.prod_id = { NULL, NULL, (v3), NULL },  \
40 	.prod_id_hash = { 0, 0, (vh3), 0 }, }
41 
42 #define PCMCIA_DEVICE_PROD_ID12(v1, v2, vh1, vh2) { \
43 	.match_flags = PCMCIA_DEV_ID_MATCH_PROD_ID1| \
44 			PCMCIA_DEV_ID_MATCH_PROD_ID2, \
45 	.prod_id = { (v1), (v2), NULL, NULL }, \
46 	.prod_id_hash = { (vh1), (vh2), 0, 0 }, }
47 
48 #define PCMCIA_DEVICE_PROD_ID13(v1, v3, vh1, vh3) { \
49 	.match_flags = PCMCIA_DEV_ID_MATCH_PROD_ID1| \
50 			PCMCIA_DEV_ID_MATCH_PROD_ID3, \
51 	.prod_id = { (v1), NULL, (v3), NULL }, \
52 	.prod_id_hash = { (vh1), 0, (vh3), 0 }, }
53 
54 #define PCMCIA_DEVICE_PROD_ID14(v1, v4, vh1, vh4) { \
55 	.match_flags = PCMCIA_DEV_ID_MATCH_PROD_ID1| \
56 			PCMCIA_DEV_ID_MATCH_PROD_ID4, \
57 	.prod_id = { (v1), NULL, NULL, (v4) }, \
58 	.prod_id_hash = { (vh1), 0, 0, (vh4) }, }
59 
60 #define PCMCIA_DEVICE_PROD_ID123(v1, v2, v3, vh1, vh2, vh3) { \
61 	.match_flags = PCMCIA_DEV_ID_MATCH_PROD_ID1| \
62 			PCMCIA_DEV_ID_MATCH_PROD_ID2| \
63 			PCMCIA_DEV_ID_MATCH_PROD_ID3, \
64 	.prod_id = { (v1), (v2), (v3), NULL },\
65 	.prod_id_hash = { (vh1), (vh2), (vh3), 0 }, }
66 
67 #define PCMCIA_DEVICE_PROD_ID124(v1, v2, v4, vh1, vh2, vh4) { \
68 	.match_flags = PCMCIA_DEV_ID_MATCH_PROD_ID1| \
69 			PCMCIA_DEV_ID_MATCH_PROD_ID2| \
70 			PCMCIA_DEV_ID_MATCH_PROD_ID4, \
71 	.prod_id = { (v1), (v2), NULL, (v4) }, \
72 	.prod_id_hash = { (vh1), (vh2), 0, (vh4) }, }
73 
74 #define PCMCIA_DEVICE_PROD_ID134(v1, v3, v4, vh1, vh3, vh4) { \
75 	.match_flags = PCMCIA_DEV_ID_MATCH_PROD_ID1| \
76 			PCMCIA_DEV_ID_MATCH_PROD_ID3| \
77 			PCMCIA_DEV_ID_MATCH_PROD_ID4, \
78 	.prod_id = { (v1), NULL, (v3), (v4) }, \
79 	.prod_id_hash = { (vh1), 0, (vh3), (vh4) }, }
80 
81 #define PCMCIA_DEVICE_PROD_ID1234(v1, v2, v3, v4, vh1, vh2, vh3, vh4) { \
82 	.match_flags = PCMCIA_DEV_ID_MATCH_PROD_ID1| \
83 			PCMCIA_DEV_ID_MATCH_PROD_ID2| \
84 			PCMCIA_DEV_ID_MATCH_PROD_ID3| \
85 			PCMCIA_DEV_ID_MATCH_PROD_ID4, \
86 	.prod_id = { (v1), (v2), (v3), (v4) }, \
87 	.prod_id_hash = { (vh1), (vh2), (vh3), (vh4) }, }
88 
89 #define PCMCIA_DEVICE_MANF_CARD_PROD_ID1(manf, card, v1, vh1) { \
90 	.match_flags = PCMCIA_DEV_ID_MATCH_MANF_ID| \
91 			PCMCIA_DEV_ID_MATCH_CARD_ID| \
92 			PCMCIA_DEV_ID_MATCH_PROD_ID1, \
93 	.manf_id = (manf), \
94 	.card_id = (card), \
95 	.prod_id = { (v1), NULL, NULL, NULL }, \
96 	.prod_id_hash = { (vh1), 0, 0, 0 }, }
97 
98 #define PCMCIA_DEVICE_MANF_CARD_PROD_ID3(manf, card, v3, vh3) { \
99 	.match_flags = PCMCIA_DEV_ID_MATCH_MANF_ID| \
100 			PCMCIA_DEV_ID_MATCH_CARD_ID| \
101 			PCMCIA_DEV_ID_MATCH_PROD_ID3, \
102 	.manf_id = (manf), \
103 	.card_id = (card), \
104 	.prod_id = { NULL, NULL, (v3), NULL }, \
105 	.prod_id_hash = { 0, 0, (vh3), 0 }, }
106 
107 
108 /* multi-function devices */
109 
110 #define PCMCIA_MFC_DEVICE_MANF_CARD(mfc, manf, card) { \
111 	.match_flags = PCMCIA_DEV_ID_MATCH_MANF_ID| \
112 			PCMCIA_DEV_ID_MATCH_CARD_ID| \
113 			PCMCIA_DEV_ID_MATCH_FUNCTION, \
114 	.manf_id = (manf), \
115 	.card_id = (card), \
116 	.function = (mfc), }
117 
118 #define PCMCIA_MFC_DEVICE_PROD_ID1(mfc, v1, vh1) { \
119 	.match_flags = PCMCIA_DEV_ID_MATCH_PROD_ID1| \
120 			PCMCIA_DEV_ID_MATCH_FUNCTION, \
121 	.prod_id = { (v1), NULL, NULL, NULL }, \
122 	.prod_id_hash = { (vh1), 0, 0, 0 }, \
123 	.function = (mfc), }
124 
125 #define PCMCIA_MFC_DEVICE_PROD_ID2(mfc, v2, vh2) { \
126 	.match_flags = PCMCIA_DEV_ID_MATCH_PROD_ID2| \
127 			PCMCIA_DEV_ID_MATCH_FUNCTION, \
128 	.prod_id = { NULL, (v2), NULL, NULL },  \
129 	.prod_id_hash = { 0, (vh2), 0, 0 }, \
130 	.function = (mfc), }
131 
132 #define PCMCIA_MFC_DEVICE_PROD_ID12(mfc, v1, v2, vh1, vh2) { \
133 	.match_flags = PCMCIA_DEV_ID_MATCH_PROD_ID1| \
134 			PCMCIA_DEV_ID_MATCH_PROD_ID2| \
135 			PCMCIA_DEV_ID_MATCH_FUNCTION, \
136 	.prod_id = { (v1), (v2), NULL, NULL }, \
137 	.prod_id_hash = { (vh1), (vh2), 0, 0 }, \
138 	.function = (mfc), }
139 
140 #define PCMCIA_MFC_DEVICE_PROD_ID13(mfc, v1, v3, vh1, vh3) { \
141 	.match_flags = PCMCIA_DEV_ID_MATCH_PROD_ID1| \
142 			PCMCIA_DEV_ID_MATCH_PROD_ID3| \
143 			PCMCIA_DEV_ID_MATCH_FUNCTION, \
144 	.prod_id = { (v1), NULL, (v3), NULL }, \
145 	.prod_id_hash = { (vh1), 0, (vh3), 0 }, \
146 	.function = (mfc), }
147 
148 #define PCMCIA_MFC_DEVICE_PROD_ID123(mfc, v1, v2, v3, vh1, vh2, vh3) { \
149 	.match_flags = PCMCIA_DEV_ID_MATCH_PROD_ID1| \
150 			PCMCIA_DEV_ID_MATCH_PROD_ID2| \
151 			PCMCIA_DEV_ID_MATCH_PROD_ID3| \
152 			PCMCIA_DEV_ID_MATCH_FUNCTION, \
153 	.prod_id = { (v1), (v2), (v3), NULL },\
154 	.prod_id_hash = { (vh1), (vh2), (vh3), 0 }, \
155 	.function = (mfc), }
156 
157 /* pseudo multi-function devices */
158 
159 #define PCMCIA_PFC_DEVICE_MANF_CARD(mfc, manf, card) { \
160 	.match_flags = PCMCIA_DEV_ID_MATCH_MANF_ID| \
161 			PCMCIA_DEV_ID_MATCH_CARD_ID| \
162 			PCMCIA_DEV_ID_MATCH_DEVICE_NO, \
163 	.manf_id = (manf), \
164 	.card_id = (card), \
165 	.device_no = (mfc), }
166 
167 #define PCMCIA_PFC_DEVICE_PROD_ID1(mfc, v1, vh1) { \
168 	.match_flags = PCMCIA_DEV_ID_MATCH_PROD_ID1| \
169 			PCMCIA_DEV_ID_MATCH_DEVICE_NO, \
170 	.prod_id = { (v1), NULL, NULL, NULL }, \
171 	.prod_id_hash = { (vh1), 0, 0, 0 }, \
172 	.device_no = (mfc), }
173 
174 #define PCMCIA_PFC_DEVICE_PROD_ID2(mfc, v2, vh2) { \
175 	.match_flags = PCMCIA_DEV_ID_MATCH_PROD_ID2| \
176 			PCMCIA_DEV_ID_MATCH_DEVICE_NO, \
177 	.prod_id = { NULL, (v2), NULL, NULL },  \
178 	.prod_id_hash = { 0, (vh2), 0, 0 }, \
179 	.device_no = (mfc), }
180 
181 #define PCMCIA_PFC_DEVICE_PROD_ID12(mfc, v1, v2, vh1, vh2) { \
182 	.match_flags = PCMCIA_DEV_ID_MATCH_PROD_ID1| \
183 			PCMCIA_DEV_ID_MATCH_PROD_ID2| \
184 			PCMCIA_DEV_ID_MATCH_DEVICE_NO, \
185 	.prod_id = { (v1), (v2), NULL, NULL }, \
186 	.prod_id_hash = { (vh1), (vh2), 0, 0 }, \
187 	.device_no = (mfc), }
188 
189 #define PCMCIA_PFC_DEVICE_PROD_ID13(mfc, v1, v3, vh1, vh3) { \
190 	.match_flags = PCMCIA_DEV_ID_MATCH_PROD_ID1| \
191 			PCMCIA_DEV_ID_MATCH_PROD_ID3| \
192 			PCMCIA_DEV_ID_MATCH_DEVICE_NO, \
193 	.prod_id = { (v1), NULL, (v3), NULL }, \
194 	.prod_id_hash = { (vh1), 0, (vh3), 0 }, \
195 	.device_no = (mfc), }
196 
197 #define PCMCIA_PFC_DEVICE_PROD_ID123(mfc, v1, v2, v3, vh1, vh2, vh3) { \
198 	.match_flags = PCMCIA_DEV_ID_MATCH_PROD_ID1| \
199 			PCMCIA_DEV_ID_MATCH_PROD_ID2| \
200 			PCMCIA_DEV_ID_MATCH_PROD_ID3| \
201 			PCMCIA_DEV_ID_MATCH_DEVICE_NO, \
202 	.prod_id = { (v1), (v2), (v3), NULL },\
203 	.prod_id_hash = { (vh1), (vh2), (vh3), 0 }, \
204 	.device_no = (mfc), }
205 
206 /* cards needing a CIS override */
207 
208 #define PCMCIA_DEVICE_CIS_MANF_CARD(manf, card, _cisfile) { \
209 	.match_flags = PCMCIA_DEV_ID_MATCH_FAKE_CIS | \
210 			PCMCIA_DEV_ID_MATCH_MANF_ID| \
211 			PCMCIA_DEV_ID_MATCH_CARD_ID, \
212 	.manf_id = (manf), \
213 	.card_id = (card), \
214 	.cisfile = (_cisfile)}
215 
216 #define PCMCIA_DEVICE_CIS_PROD_ID12(v1, v2, vh1, vh2, _cisfile) { \
217 	.match_flags = PCMCIA_DEV_ID_MATCH_FAKE_CIS | \
218 			PCMCIA_DEV_ID_MATCH_PROD_ID1| \
219 			PCMCIA_DEV_ID_MATCH_PROD_ID2, \
220 	.prod_id = { (v1), (v2), NULL, NULL }, \
221 	.prod_id_hash = { (vh1), (vh2), 0, 0 }, \
222 	.cisfile = (_cisfile)}
223 
224 #define PCMCIA_DEVICE_CIS_PROD_ID123(v1, v2, v3, vh1, vh2, vh3, _cisfile) { \
225 	.match_flags = PCMCIA_DEV_ID_MATCH_FAKE_CIS | \
226 			PCMCIA_DEV_ID_MATCH_PROD_ID1| \
227 			PCMCIA_DEV_ID_MATCH_PROD_ID2| \
228 			PCMCIA_DEV_ID_MATCH_PROD_ID3, \
229 	.prod_id = { (v1), (v2), (v3), NULL },\
230 	.prod_id_hash = { (vh1), (vh2), (vh3), 0 }, \
231 	.cisfile = (_cisfile)}
232 
233 
234 #define PCMCIA_DEVICE_CIS_PROD_ID2(v2, vh2, _cisfile) { \
235 	.match_flags =  PCMCIA_DEV_ID_MATCH_FAKE_CIS | \
236 			PCMCIA_DEV_ID_MATCH_PROD_ID2, \
237 	.prod_id = { NULL, (v2), NULL, NULL },  \
238 	.prod_id_hash = { 0, (vh2), 0, 0 }, \
239 	.cisfile = (_cisfile)}
240 
241 #define PCMCIA_PFC_DEVICE_CIS_PROD_ID12(mfc, v1, v2, vh1, vh2, _cisfile) { \
242 	.match_flags =  PCMCIA_DEV_ID_MATCH_FAKE_CIS | \
243 			PCMCIA_DEV_ID_MATCH_PROD_ID1| \
244 			PCMCIA_DEV_ID_MATCH_PROD_ID2| \
245 			PCMCIA_DEV_ID_MATCH_DEVICE_NO, \
246 	.prod_id = { (v1), (v2), NULL, NULL }, \
247 	.prod_id_hash = { (vh1), (vh2), 0, 0 },\
248 	.device_no = (mfc), \
249 	.cisfile = (_cisfile)}
250 
251 #define PCMCIA_MFC_DEVICE_CIS_MANF_CARD(mfc, manf, card, _cisfile) { \
252 	.match_flags =  PCMCIA_DEV_ID_MATCH_FAKE_CIS | \
253 			PCMCIA_DEV_ID_MATCH_MANF_ID| \
254 			PCMCIA_DEV_ID_MATCH_CARD_ID| \
255 			PCMCIA_DEV_ID_MATCH_FUNCTION, \
256 	.manf_id = (manf), \
257 	.card_id = (card), \
258 	.function = (mfc), \
259 	.cisfile = (_cisfile)}
260 
261 #define PCMCIA_MFC_DEVICE_CIS_PROD_ID12(mfc, v1, v2, vh1, vh2, _cisfile) { \
262 	.match_flags =  PCMCIA_DEV_ID_MATCH_FAKE_CIS | \
263 			PCMCIA_DEV_ID_MATCH_PROD_ID1| \
264 			PCMCIA_DEV_ID_MATCH_PROD_ID2| \
265 			PCMCIA_DEV_ID_MATCH_FUNCTION, \
266 	.prod_id = { (v1), (v2), NULL, NULL }, \
267 	.prod_id_hash = { (vh1), (vh2), 0, 0 }, \
268 	.function = (mfc), \
269 	.cisfile = (_cisfile)}
270 
271 #define PCMCIA_MFC_DEVICE_CIS_PROD_ID4(mfc, v4, vh4, _cisfile) { \
272 	.match_flags =  PCMCIA_DEV_ID_MATCH_FAKE_CIS | \
273 			PCMCIA_DEV_ID_MATCH_PROD_ID4| \
274 			PCMCIA_DEV_ID_MATCH_FUNCTION, \
275 	.prod_id = { NULL, NULL, NULL, (v4) }, \
276 	.prod_id_hash = { 0, 0, 0, (vh4) }, \
277 	.function = (mfc), \
278 	.cisfile = (_cisfile)}
279 
280 
281 #define PCMCIA_DEVICE_NULL { .match_flags = 0, }
282 
283 #endif /* __KERNEL__ */
284 #endif /* _LINUX_PCMCIA_DEVICE_ID_H */
285