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, } |
