diff options
-rw-r--r-- | drivers/pcmcia/ds.c | 8 | ||||
-rw-r--r-- | include/linux/mod_devicetable.h | 2 | ||||
-rw-r--r-- | include/pcmcia/device_id.h | 74 |
3 files changed, 84 insertions, 0 deletions
diff --git a/drivers/pcmcia/ds.c b/drivers/pcmcia/ds.c index 3ac7a443f668..c0611d56eab2 100644 --- a/drivers/pcmcia/ds.c +++ b/drivers/pcmcia/ds.c | |||
@@ -733,6 +733,14 @@ static inline int pcmcia_devmatch(struct pcmcia_device *dev, | |||
733 | return 0; | 733 | return 0; |
734 | } | 734 | } |
735 | 735 | ||
736 | if (did->match_flags & PCMCIA_DEV_ID_MATCH_FAKE_CIS) { | ||
737 | if (!dev->socket->fake_cis) { | ||
738 | /* FIXME: evaluate using firmware helpers to | ||
739 | * automagically load it from userspace */ | ||
740 | return 0; | ||
741 | } | ||
742 | } | ||
743 | |||
736 | dev->dev.driver_data = (void *) did; | 744 | dev->dev.driver_data = (void *) did; |
737 | 745 | ||
738 | return 1; | 746 | return 1; |
diff --git a/include/linux/mod_devicetable.h b/include/linux/mod_devicetable.h index e9651cd8310c..c0106d68bb6d 100644 --- a/include/linux/mod_devicetable.h +++ b/include/linux/mod_devicetable.h | |||
@@ -196,6 +196,7 @@ struct pcmcia_device_id { | |||
196 | 196 | ||
197 | /* not matched against */ | 197 | /* not matched against */ |
198 | kernel_ulong_t driver_info; | 198 | kernel_ulong_t driver_info; |
199 | char * cisfile; | ||
199 | }; | 200 | }; |
200 | 201 | ||
201 | #define PCMCIA_DEV_ID_MATCH_MANF_ID 0x0001 | 202 | #define PCMCIA_DEV_ID_MATCH_MANF_ID 0x0001 |
@@ -207,5 +208,6 @@ struct pcmcia_device_id { | |||
207 | #define PCMCIA_DEV_ID_MATCH_PROD_ID3 0x0040 | 208 | #define PCMCIA_DEV_ID_MATCH_PROD_ID3 0x0040 |
208 | #define PCMCIA_DEV_ID_MATCH_PROD_ID4 0x0080 | 209 | #define PCMCIA_DEV_ID_MATCH_PROD_ID4 0x0080 |
209 | #define PCMCIA_DEV_ID_MATCH_DEVICE_NO 0x0100 | 210 | #define PCMCIA_DEV_ID_MATCH_DEVICE_NO 0x0100 |
211 | #define PCMCIA_DEV_ID_MATCH_FAKE_CIS 0x0200 | ||
210 | 212 | ||
211 | #endif /* LINUX_MOD_DEVICETABLE_H */ | 213 | #endif /* LINUX_MOD_DEVICETABLE_H */ |
diff --git a/include/pcmcia/device_id.h b/include/pcmcia/device_id.h index acf68656de3c..346d81ece287 100644 --- a/include/pcmcia/device_id.h +++ b/include/pcmcia/device_id.h | |||
@@ -171,5 +171,79 @@ | |||
171 | .prod_id_hash = { (vh1), (vh2), (vh3), 0 }, \ | 171 | .prod_id_hash = { (vh1), (vh2), (vh3), 0 }, \ |
172 | .device_no = (mfc), } | 172 | .device_no = (mfc), } |
173 | 173 | ||
174 | /* cards needing a CIS override */ | ||
175 | |||
176 | #define PCMCIA_DEVICE_CIS_MANF_CARD(manf, card, _cisfile) { \ | ||
177 | .match_flags = PCMCIA_DEV_ID_MATCH_FAKE_CIS | \ | ||
178 | PCMCIA_DEV_ID_MATCH_MANF_ID| \ | ||
179 | PCMCIA_DEV_ID_MATCH_CARD_ID, \ | ||
180 | .manf_id = (manf), \ | ||
181 | .card_id = (card), \ | ||
182 | .cisfile = (_cisfile)} | ||
183 | |||
184 | #define PCMCIA_DEVICE_CIS_PROD_ID12(v1, v2, vh1, vh2, _cisfile) { \ | ||
185 | .match_flags = PCMCIA_DEV_ID_MATCH_FAKE_CIS | \ | ||
186 | PCMCIA_DEV_ID_MATCH_PROD_ID1| \ | ||
187 | PCMCIA_DEV_ID_MATCH_PROD_ID2, \ | ||
188 | .prod_id = { (v1), (v2), NULL, NULL }, \ | ||
189 | .prod_id_hash = { (vh1), (vh2), 0, 0 }, \ | ||
190 | .cisfile = (_cisfile)} | ||
191 | |||
192 | #define PCMCIA_DEVICE_CIS_PROD_ID123(v1, v2, v3, vh1, vh2, vh3, _cisfile) { \ | ||
193 | .match_flags = PCMCIA_DEV_ID_MATCH_FAKE_CIS | \ | ||
194 | PCMCIA_DEV_ID_MATCH_PROD_ID1| \ | ||
195 | PCMCIA_DEV_ID_MATCH_PROD_ID2| \ | ||
196 | PCMCIA_DEV_ID_MATCH_PROD_ID3, \ | ||
197 | .prod_id = { (v1), (v2), (v3), NULL },\ | ||
198 | .prod_id_hash = { (vh1), (vh2), (vh3), 0 }, \ | ||
199 | .cisfile = (_cisfile)} | ||
200 | |||
201 | |||
202 | #define PCMCIA_DEVICE_CIS_PROD_ID2(v2, vh2, _cisfile) { \ | ||
203 | .match_flags = PCMCIA_DEV_ID_MATCH_FAKE_CIS | \ | ||
204 | PCMCIA_DEV_ID_MATCH_PROD_ID2, \ | ||
205 | .prod_id = { NULL, (v2), NULL, NULL }, \ | ||
206 | .prod_id_hash = { 0, (vh2), 0, 0 }, \ | ||
207 | .cisfile = (_cisfile)} | ||
208 | |||
209 | #define PCMCIA_PFC_DEVICE_CIS_PROD_ID12(mfc, v1, v2, vh1, vh2, _cisfile) { \ | ||
210 | .match_flags = PCMCIA_DEV_ID_MATCH_FAKE_CIS | \ | ||
211 | PCMCIA_DEV_ID_MATCH_PROD_ID1| \ | ||
212 | PCMCIA_DEV_ID_MATCH_PROD_ID2| \ | ||
213 | PCMCIA_DEV_ID_MATCH_DEVICE_NO, \ | ||
214 | .prod_id = { (v1), (v2), NULL, NULL }, \ | ||
215 | .prod_id_hash = { (vh1), (vh2), 0, 0 },\ | ||
216 | .device_no = (mfc), \ | ||
217 | .cisfile = (_cisfile)} | ||
218 | |||
219 | #define PCMCIA_MFC_DEVICE_CIS_MANF_CARD(mfc, manf, card, _cisfile) { \ | ||
220 | .match_flags = PCMCIA_DEV_ID_MATCH_FAKE_CIS | \ | ||
221 | PCMCIA_DEV_ID_MATCH_MANF_ID| \ | ||
222 | PCMCIA_DEV_ID_MATCH_CARD_ID| \ | ||
223 | PCMCIA_DEV_ID_MATCH_FUNCTION, \ | ||
224 | .manf_id = (manf), \ | ||
225 | .card_id = (card), \ | ||
226 | .function = (mfc), \ | ||
227 | .cisfile = (_cisfile)} | ||
228 | |||
229 | #define PCMCIA_MFC_DEVICE_CIS_PROD_ID12(mfc, v1, v2, vh1, vh2, _cisfile) { \ | ||
230 | .match_flags = PCMCIA_DEV_ID_MATCH_FAKE_CIS | \ | ||
231 | PCMCIA_DEV_ID_MATCH_PROD_ID1| \ | ||
232 | PCMCIA_DEV_ID_MATCH_PROD_ID2| \ | ||
233 | PCMCIA_DEV_ID_MATCH_FUNCTION, \ | ||
234 | .prod_id = { (v1), (v2), NULL, NULL }, \ | ||
235 | .prod_id_hash = { (vh1), (vh2), 0, 0 }, \ | ||
236 | .function = (mfc), \ | ||
237 | .cisfile = (_cisfile)} | ||
238 | |||
239 | #define PCMCIA_MFC_DEVICE_CIS_PROD_ID4(mfc, v4, vh4, _cisfile) { \ | ||
240 | .match_flags = PCMCIA_DEV_ID_MATCH_FAKE_CIS | \ | ||
241 | PCMCIA_DEV_ID_MATCH_PROD_ID4| \ | ||
242 | PCMCIA_DEV_ID_MATCH_FUNCTION, \ | ||
243 | .prod_id = { NULL, NULL, NULL, (v4) }, \ | ||
244 | .prod_id_hash = { 0, 0, 0, (vh4) }, \ | ||
245 | .function = (mfc), \ | ||
246 | .cisfile = (_cisfile)} | ||
247 | |||
174 | 248 | ||
175 | #define PCMCIA_DEVICE_NULL { .match_flags = 0, } | 249 | #define PCMCIA_DEVICE_NULL { .match_flags = 0, } |