diff options
| -rw-r--r-- | drivers/char/pcmcia/cm4000_cs.c | 24 | ||||
| -rw-r--r-- | drivers/char/pcmcia/cm4040_cs.c | 23 | ||||
| -rw-r--r-- | drivers/ide/legacy/ide-cs.c | 1 | ||||
| -rw-r--r-- | drivers/net/pcmcia/axnet_cs.c | 1 | ||||
| -rw-r--r-- | drivers/net/wireless/hostap/hostap_cs.c | 5 | ||||
| -rw-r--r-- | drivers/pcmcia/ds.c | 40 | ||||
| -rw-r--r-- | include/pcmcia/device_id.h | 9 |
7 files changed, 78 insertions, 25 deletions
diff --git a/drivers/char/pcmcia/cm4000_cs.c b/drivers/char/pcmcia/cm4000_cs.c index 649677b5dc36..5fdf18515433 100644 --- a/drivers/char/pcmcia/cm4000_cs.c +++ b/drivers/char/pcmcia/cm4000_cs.c | |||
| @@ -13,11 +13,12 @@ | |||
| 13 | * | 13 | * |
| 14 | * (C) 2000,2001,2002,2003,2004 Omnikey AG | 14 | * (C) 2000,2001,2002,2003,2004 Omnikey AG |
| 15 | * | 15 | * |
| 16 | * (C) 2005 Harald Welte <laforge@gnumonks.org> | 16 | * (C) 2005-2006 Harald Welte <laforge@gnumonks.org> |
| 17 | * - Adhere to Kernel CodingStyle | 17 | * - Adhere to Kernel CodingStyle |
| 18 | * - Port to 2.6.13 "new" style PCMCIA | 18 | * - Port to 2.6.13 "new" style PCMCIA |
| 19 | * - Check for copy_{from,to}_user return values | 19 | * - Check for copy_{from,to}_user return values |
| 20 | * - Use nonseekable_open() | 20 | * - Use nonseekable_open() |
| 21 | * - add class interface for udev device creation | ||
| 21 | * | 22 | * |
| 22 | * All rights reserved. Licensed under dual BSD/GPL license. | 23 | * All rights reserved. Licensed under dual BSD/GPL license. |
| 23 | */ | 24 | */ |
| @@ -56,7 +57,7 @@ module_param(pc_debug, int, 0600); | |||
| 56 | #else | 57 | #else |
| 57 | #define DEBUGP(n, rdr, x, args...) | 58 | #define DEBUGP(n, rdr, x, args...) |
| 58 | #endif | 59 | #endif |
| 59 | static char *version = "cm4000_cs.c v2.4.0gm5 - All bugs added by Harald Welte"; | 60 | static char *version = "cm4000_cs.c v2.4.0gm6 - All bugs added by Harald Welte"; |
| 60 | 61 | ||
| 61 | #define T_1SEC (HZ) | 62 | #define T_1SEC (HZ) |
| 62 | #define T_10MSEC msecs_to_jiffies(10) | 63 | #define T_10MSEC msecs_to_jiffies(10) |
| @@ -156,6 +157,7 @@ struct cm4000_dev { | |||
| 156 | /*queue*/ 4*sizeof(wait_queue_head_t)) | 157 | /*queue*/ 4*sizeof(wait_queue_head_t)) |
| 157 | 158 | ||
| 158 | static dev_link_t *dev_table[CM4000_MAX_DEV]; | 159 | static dev_link_t *dev_table[CM4000_MAX_DEV]; |
| 160 | static struct class *cmm_class; | ||
| 159 | 161 | ||
| 160 | /* This table doesn't use spaces after the comma between fields and thus | 162 | /* This table doesn't use spaces after the comma between fields and thus |
| 161 | * violates CodingStyle. However, I don't really think wrapping it around will | 163 | * violates CodingStyle. However, I don't really think wrapping it around will |
| @@ -1937,6 +1939,9 @@ static int cm4000_attach(struct pcmcia_device *p_dev) | |||
| 1937 | link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; | 1939 | link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; |
| 1938 | cm4000_config(link, i); | 1940 | cm4000_config(link, i); |
| 1939 | 1941 | ||
| 1942 | class_device_create(cmm_class, NULL, MKDEV(major, i), NULL, | ||
| 1943 | "cmm%d", i); | ||
| 1944 | |||
| 1940 | return 0; | 1945 | return 0; |
| 1941 | } | 1946 | } |
| 1942 | 1947 | ||
| @@ -1962,6 +1967,8 @@ static void cm4000_detach(struct pcmcia_device *p_dev) | |||
| 1962 | dev_table[devno] = NULL; | 1967 | dev_table[devno] = NULL; |
| 1963 | kfree(dev); | 1968 | kfree(dev); |
| 1964 | 1969 | ||
| 1970 | class_device_destroy(cmm_class, MKDEV(major, devno)); | ||
| 1971 | |||
| 1965 | return; | 1972 | return; |
| 1966 | } | 1973 | } |
| 1967 | 1974 | ||
| @@ -1995,8 +2002,18 @@ static struct pcmcia_driver cm4000_driver = { | |||
| 1995 | 2002 | ||
| 1996 | static int __init cmm_init(void) | 2003 | static int __init cmm_init(void) |
| 1997 | { | 2004 | { |
| 2005 | int rc; | ||
| 2006 | |||
| 1998 | printk(KERN_INFO "%s\n", version); | 2007 | printk(KERN_INFO "%s\n", version); |
| 1999 | pcmcia_register_driver(&cm4000_driver); | 2008 | |
| 2009 | cmm_class = class_create(THIS_MODULE, "cardman_4000"); | ||
| 2010 | if (!cmm_class) | ||
| 2011 | return -1; | ||
| 2012 | |||
| 2013 | rc = pcmcia_register_driver(&cm4000_driver); | ||
| 2014 | if (rc < 0) | ||
| 2015 | return rc; | ||
| 2016 | |||
| 2000 | major = register_chrdev(0, DEVICE_NAME, &cm4000_fops); | 2017 | major = register_chrdev(0, DEVICE_NAME, &cm4000_fops); |
| 2001 | if (major < 0) { | 2018 | if (major < 0) { |
| 2002 | printk(KERN_WARNING MODULE_NAME | 2019 | printk(KERN_WARNING MODULE_NAME |
| @@ -2012,6 +2029,7 @@ static void __exit cmm_exit(void) | |||
| 2012 | printk(KERN_INFO MODULE_NAME ": unloading\n"); | 2029 | printk(KERN_INFO MODULE_NAME ": unloading\n"); |
| 2013 | pcmcia_unregister_driver(&cm4000_driver); | 2030 | pcmcia_unregister_driver(&cm4000_driver); |
| 2014 | unregister_chrdev(major, DEVICE_NAME); | 2031 | unregister_chrdev(major, DEVICE_NAME); |
| 2032 | class_destroy(cmm_class); | ||
| 2015 | }; | 2033 | }; |
| 2016 | 2034 | ||
| 2017 | module_init(cmm_init); | 2035 | module_init(cmm_init); |
diff --git a/drivers/char/pcmcia/cm4040_cs.c b/drivers/char/pcmcia/cm4040_cs.c index 46eb371bf17e..466e33bab029 100644 --- a/drivers/char/pcmcia/cm4040_cs.c +++ b/drivers/char/pcmcia/cm4040_cs.c | |||
| @@ -3,12 +3,13 @@ | |||
| 3 | * | 3 | * |
| 4 | * (c) 2000-2004 Omnikey AG (http://www.omnikey.com/) | 4 | * (c) 2000-2004 Omnikey AG (http://www.omnikey.com/) |
| 5 | * | 5 | * |
| 6 | * (C) 2005 Harald Welte <laforge@gnumonks.org> | 6 | * (C) 2005-2006 Harald Welte <laforge@gnumonks.org> |
| 7 | * - add support for poll() | 7 | * - add support for poll() |
| 8 | * - driver cleanup | 8 | * - driver cleanup |
| 9 | * - add waitqueues | 9 | * - add waitqueues |
| 10 | * - adhere to linux kernel coding style and policies | 10 | * - adhere to linux kernel coding style and policies |
| 11 | * - support 2.6.13 "new style" pcmcia interface | 11 | * - support 2.6.13 "new style" pcmcia interface |
| 12 | * - add class interface for udev device creation | ||
| 12 | * | 13 | * |
| 13 | * The device basically is a USB CCID compliant device that has been | 14 | * The device basically is a USB CCID compliant device that has been |
| 14 | * attached to an I/O-Mapped FIFO. | 15 | * attached to an I/O-Mapped FIFO. |
| @@ -53,7 +54,7 @@ module_param(pc_debug, int, 0600); | |||
| 53 | #endif | 54 | #endif |
| 54 | 55 | ||
| 55 | static char *version = | 56 | static char *version = |
| 56 | "OMNIKEY CardMan 4040 v1.1.0gm4 - All bugs added by Harald Welte"; | 57 | "OMNIKEY CardMan 4040 v1.1.0gm5 - All bugs added by Harald Welte"; |
| 57 | 58 | ||
| 58 | #define CCID_DRIVER_BULK_DEFAULT_TIMEOUT (150*HZ) | 59 | #define CCID_DRIVER_BULK_DEFAULT_TIMEOUT (150*HZ) |
| 59 | #define CCID_DRIVER_ASYNC_POWERUP_TIMEOUT (35*HZ) | 60 | #define CCID_DRIVER_ASYNC_POWERUP_TIMEOUT (35*HZ) |
| @@ -67,6 +68,7 @@ static char *version = | |||
| 67 | static void reader_release(dev_link_t *link); | 68 | static void reader_release(dev_link_t *link); |
| 68 | 69 | ||
| 69 | static int major; | 70 | static int major; |
| 71 | static struct class *cmx_class; | ||
| 70 | 72 | ||
| 71 | #define BS_READABLE 0x01 | 73 | #define BS_READABLE 0x01 |
| 72 | #define BS_WRITABLE 0x02 | 74 | #define BS_WRITABLE 0x02 |
| @@ -696,6 +698,9 @@ static int reader_attach(struct pcmcia_device *p_dev) | |||
| 696 | link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; | 698 | link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; |
| 697 | reader_config(link, i); | 699 | reader_config(link, i); |
| 698 | 700 | ||
| 701 | class_device_create(cmx_class, NULL, MKDEV(major, i), NULL, | ||
| 702 | "cmx%d", i); | ||
| 703 | |||
| 699 | return 0; | 704 | return 0; |
| 700 | } | 705 | } |
| 701 | 706 | ||
| @@ -721,6 +726,8 @@ static void reader_detach(struct pcmcia_device *p_dev) | |||
| 721 | dev_table[devno] = NULL; | 726 | dev_table[devno] = NULL; |
| 722 | kfree(dev); | 727 | kfree(dev); |
| 723 | 728 | ||
| 729 | class_device_destroy(cmx_class, MKDEV(major, devno)); | ||
| 730 | |||
| 724 | return; | 731 | return; |
| 725 | } | 732 | } |
| 726 | 733 | ||
| @@ -755,8 +762,17 @@ static struct pcmcia_driver reader_driver = { | |||
| 755 | 762 | ||
| 756 | static int __init cm4040_init(void) | 763 | static int __init cm4040_init(void) |
| 757 | { | 764 | { |
| 765 | int rc; | ||
| 766 | |||
| 758 | printk(KERN_INFO "%s\n", version); | 767 | printk(KERN_INFO "%s\n", version); |
| 759 | pcmcia_register_driver(&reader_driver); | 768 | cmx_class = class_create(THIS_MODULE, "cardman_4040"); |
| 769 | if (!cmx_class) | ||
| 770 | return -1; | ||
| 771 | |||
| 772 | rc = pcmcia_register_driver(&reader_driver); | ||
| 773 | if (rc < 0) | ||
| 774 | return rc; | ||
| 775 | |||
| 760 | major = register_chrdev(0, DEVICE_NAME, &reader_fops); | 776 | major = register_chrdev(0, DEVICE_NAME, &reader_fops); |
| 761 | if (major < 0) { | 777 | if (major < 0) { |
| 762 | printk(KERN_WARNING MODULE_NAME | 778 | printk(KERN_WARNING MODULE_NAME |
| @@ -771,6 +787,7 @@ static void __exit cm4040_exit(void) | |||
| 771 | printk(KERN_INFO MODULE_NAME ": unloading\n"); | 787 | printk(KERN_INFO MODULE_NAME ": unloading\n"); |
| 772 | pcmcia_unregister_driver(&reader_driver); | 788 | pcmcia_unregister_driver(&reader_driver); |
| 773 | unregister_chrdev(major, DEVICE_NAME); | 789 | unregister_chrdev(major, DEVICE_NAME); |
| 790 | class_destroy(cmx_class); | ||
| 774 | } | 791 | } |
| 775 | 792 | ||
| 776 | module_init(cm4040_init); | 793 | module_init(cm4040_init); |
diff --git a/drivers/ide/legacy/ide-cs.c b/drivers/ide/legacy/ide-cs.c index 4c2af9020905..6213bd3caee5 100644 --- a/drivers/ide/legacy/ide-cs.c +++ b/drivers/ide/legacy/ide-cs.c | |||
| @@ -445,6 +445,7 @@ static struct pcmcia_device_id ide_ids[] = { | |||
| 445 | PCMCIA_DEVICE_PROD_ID12("PCMCIA", "PnPIDE", 0x281f1c5d, 0x0c694728), | 445 | PCMCIA_DEVICE_PROD_ID12("PCMCIA", "PnPIDE", 0x281f1c5d, 0x0c694728), |
| 446 | PCMCIA_DEVICE_PROD_ID12("SHUTTLE TECHNOLOGY LTD.", "PCCARD-IDE/ATAPI Adapter", 0x4a3f0ba0, 0x322560e1), | 446 | PCMCIA_DEVICE_PROD_ID12("SHUTTLE TECHNOLOGY LTD.", "PCCARD-IDE/ATAPI Adapter", 0x4a3f0ba0, 0x322560e1), |
| 447 | PCMCIA_DEVICE_PROD_ID12("TOSHIBA", "MK2001MPL", 0xb4585a1a, 0x3489e003), | 447 | PCMCIA_DEVICE_PROD_ID12("TOSHIBA", "MK2001MPL", 0xb4585a1a, 0x3489e003), |
| 448 | PCMCIA_DEVICE_PROD_ID1("TRANSCEND 512M ", 0xd0909443), | ||
| 448 | PCMCIA_DEVICE_PROD_ID12("WIT", "IDE16", 0x244e5994, 0x3e232852), | 449 | PCMCIA_DEVICE_PROD_ID12("WIT", "IDE16", 0x244e5994, 0x3e232852), |
| 449 | PCMCIA_DEVICE_PROD_ID1("STI Flash", 0xe4a13209), | 450 | PCMCIA_DEVICE_PROD_ID1("STI Flash", 0xe4a13209), |
| 450 | PCMCIA_DEVICE_PROD_ID12("STI", "Flash 5.0", 0xbf2df18d, 0x8cb57a0e), | 451 | PCMCIA_DEVICE_PROD_ID12("STI", "Flash 5.0", 0xbf2df18d, 0x8cb57a0e), |
diff --git a/drivers/net/pcmcia/axnet_cs.c b/drivers/net/pcmcia/axnet_cs.c index 01ddfc8cce3f..aa5581369399 100644 --- a/drivers/net/pcmcia/axnet_cs.c +++ b/drivers/net/pcmcia/axnet_cs.c | |||
| @@ -806,6 +806,7 @@ static struct pcmcia_device_id axnet_ids[] = { | |||
| 806 | PCMCIA_DEVICE_MANF_CARD(0x026f, 0x0309), | 806 | PCMCIA_DEVICE_MANF_CARD(0x026f, 0x0309), |
| 807 | PCMCIA_DEVICE_MANF_CARD(0x0274, 0x1106), | 807 | PCMCIA_DEVICE_MANF_CARD(0x0274, 0x1106), |
| 808 | PCMCIA_DEVICE_MANF_CARD(0x8a01, 0xc1ab), | 808 | PCMCIA_DEVICE_MANF_CARD(0x8a01, 0xc1ab), |
| 809 | PCMCIA_DEVICE_PROD_ID12("AmbiCom,Inc.", "Fast Ethernet PC Card(AMB8110)", 0x49b020a7, 0x119cc9fc), | ||
| 809 | PCMCIA_DEVICE_PROD_ID124("Fast Ethernet", "16-bit PC Card", "AX88190", 0xb4be14e3, 0x9a12eb6a, 0xab9be5ef), | 810 | PCMCIA_DEVICE_PROD_ID124("Fast Ethernet", "16-bit PC Card", "AX88190", 0xb4be14e3, 0x9a12eb6a, 0xab9be5ef), |
| 810 | PCMCIA_DEVICE_PROD_ID12("ASIX", "AX88190", 0x0959823b, 0xab9be5ef), | 811 | PCMCIA_DEVICE_PROD_ID12("ASIX", "AX88190", 0x0959823b, 0xab9be5ef), |
| 811 | PCMCIA_DEVICE_PROD_ID12("Billionton", "LNA-100B", 0x552ab682, 0xbc3b87e1), | 812 | PCMCIA_DEVICE_PROD_ID12("Billionton", "LNA-100B", 0x552ab682, 0xbc3b87e1), |
diff --git a/drivers/net/wireless/hostap/hostap_cs.c b/drivers/net/wireless/hostap/hostap_cs.c index 8bc0b528548f..f8f4503475f9 100644 --- a/drivers/net/wireless/hostap/hostap_cs.c +++ b/drivers/net/wireless/hostap/hostap_cs.c | |||
| @@ -877,7 +877,6 @@ static struct pcmcia_device_id hostap_cs_ids[] = { | |||
| 877 | PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0777), | 877 | PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0777), |
| 878 | PCMCIA_DEVICE_MANF_CARD(0x0126, 0x8000), | 878 | PCMCIA_DEVICE_MANF_CARD(0x0126, 0x8000), |
| 879 | PCMCIA_DEVICE_MANF_CARD(0x0138, 0x0002), | 879 | PCMCIA_DEVICE_MANF_CARD(0x0138, 0x0002), |
| 880 | PCMCIA_DEVICE_MANF_CARD(0x0156, 0x0002), | ||
| 881 | PCMCIA_DEVICE_MANF_CARD(0x0250, 0x0002), | 880 | PCMCIA_DEVICE_MANF_CARD(0x0250, 0x0002), |
| 882 | PCMCIA_DEVICE_MANF_CARD(0x026f, 0x030b), | 881 | PCMCIA_DEVICE_MANF_CARD(0x026f, 0x030b), |
| 883 | PCMCIA_DEVICE_MANF_CARD(0x0274, 0x1612), | 882 | PCMCIA_DEVICE_MANF_CARD(0x0274, 0x1612), |
| @@ -891,6 +890,10 @@ static struct pcmcia_device_id hostap_cs_ids[] = { | |||
| 891 | PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0002), | 890 | PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0002), |
| 892 | PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0005), | 891 | PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0005), |
| 893 | PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0010), | 892 | PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0010), |
| 893 | PCMCIA_DEVICE_MANF_CARD_PROD_ID1(0x0156, 0x0002, "INTERSIL", | ||
| 894 | 0x74c5e40d), | ||
| 895 | PCMCIA_DEVICE_MANF_CARD_PROD_ID1(0x0156, 0x0002, "Intersil", | ||
| 896 | 0x4b801a17), | ||
| 894 | PCMCIA_MFC_DEVICE_PROD_ID12(0, "SanDisk", "ConnectPlus", | 897 | PCMCIA_MFC_DEVICE_PROD_ID12(0, "SanDisk", "ConnectPlus", |
| 895 | 0x7a954bd9, 0x74be00c6), | 898 | 0x7a954bd9, 0x74be00c6), |
| 896 | PCMCIA_DEVICE_PROD_ID1234( | 899 | PCMCIA_DEVICE_PROD_ID1234( |
diff --git a/drivers/pcmcia/ds.c b/drivers/pcmcia/ds.c index 0a424a4e8187..54ad93daca3c 100644 --- a/drivers/pcmcia/ds.c +++ b/drivers/pcmcia/ds.c | |||
| @@ -352,11 +352,20 @@ static void pcmcia_release_dev(struct device *dev) | |||
| 352 | kfree(p_dev); | 352 | kfree(p_dev); |
| 353 | } | 353 | } |
| 354 | 354 | ||
| 355 | static void pcmcia_add_pseudo_device(struct pcmcia_socket *s) | ||
| 356 | { | ||
| 357 | if (!s->pcmcia_state.device_add_pending) { | ||
| 358 | s->pcmcia_state.device_add_pending = 1; | ||
| 359 | schedule_work(&s->device_add); | ||
| 360 | } | ||
| 361 | return; | ||
| 362 | } | ||
| 355 | 363 | ||
| 356 | static int pcmcia_device_probe(struct device * dev) | 364 | static int pcmcia_device_probe(struct device * dev) |
| 357 | { | 365 | { |
| 358 | struct pcmcia_device *p_dev; | 366 | struct pcmcia_device *p_dev; |
| 359 | struct pcmcia_driver *p_drv; | 367 | struct pcmcia_driver *p_drv; |
| 368 | struct pcmcia_device_id *did; | ||
| 360 | struct pcmcia_socket *s; | 369 | struct pcmcia_socket *s; |
| 361 | int ret = 0; | 370 | int ret = 0; |
| 362 | 371 | ||
| @@ -392,6 +401,19 @@ static int pcmcia_device_probe(struct device * dev) | |||
| 392 | } | 401 | } |
| 393 | 402 | ||
| 394 | ret = p_drv->probe(p_dev); | 403 | ret = p_drv->probe(p_dev); |
| 404 | if (ret) | ||
| 405 | goto put_module; | ||
| 406 | |||
| 407 | /* handle pseudo multifunction devices: | ||
| 408 | * there are at most two pseudo multifunction devices. | ||
| 409 | * if we're matching against the first, schedule a | ||
| 410 | * call which will then check whether there are two | ||
| 411 | * pseudo devices, and if not, add the second one. | ||
| 412 | */ | ||
| 413 | did = (struct pcmcia_device_id *) p_dev->dev.driver_data; | ||
| 414 | if ((did->match_flags & PCMCIA_DEV_ID_MATCH_DEVICE_NO) && | ||
| 415 | (p_dev->socket->device_count == 1) && (p_dev->device_no == 0)) | ||
| 416 | pcmcia_add_pseudo_device(p_dev->socket); | ||
| 395 | 417 | ||
| 396 | put_module: | 418 | put_module: |
| 397 | if (ret) | 419 | if (ret) |
| @@ -660,15 +682,6 @@ static void pcmcia_delayed_add_pseudo_device(void *data) | |||
| 660 | s->pcmcia_state.device_add_pending = 0; | 682 | s->pcmcia_state.device_add_pending = 0; |
| 661 | } | 683 | } |
| 662 | 684 | ||
| 663 | static inline void pcmcia_add_pseudo_device(struct pcmcia_socket *s) | ||
| 664 | { | ||
| 665 | if (!s->pcmcia_state.device_add_pending) { | ||
| 666 | s->pcmcia_state.device_add_pending = 1; | ||
| 667 | schedule_work(&s->device_add); | ||
| 668 | } | ||
| 669 | return; | ||
| 670 | } | ||
| 671 | |||
| 672 | static int pcmcia_requery(struct device *dev, void * _data) | 685 | static int pcmcia_requery(struct device *dev, void * _data) |
| 673 | { | 686 | { |
| 674 | struct pcmcia_device *p_dev = to_pcmcia_dev(dev); | 687 | struct pcmcia_device *p_dev = to_pcmcia_dev(dev); |
| @@ -755,15 +768,6 @@ static inline int pcmcia_devmatch(struct pcmcia_device *dev, | |||
| 755 | } | 768 | } |
| 756 | 769 | ||
| 757 | if (did->match_flags & PCMCIA_DEV_ID_MATCH_DEVICE_NO) { | 770 | if (did->match_flags & PCMCIA_DEV_ID_MATCH_DEVICE_NO) { |
| 758 | /* handle pseudo multifunction devices: | ||
| 759 | * there are at most two pseudo multifunction devices. | ||
| 760 | * if we're matching against the first, schedule a | ||
| 761 | * call which will then check whether there are two | ||
| 762 | * pseudo devices, and if not, add the second one. | ||
| 763 | */ | ||
| 764 | if (dev->device_no == 0) | ||
| 765 | pcmcia_add_pseudo_device(dev->socket); | ||
| 766 | |||
| 767 | if (dev->device_no != did->device_no) | 771 | if (dev->device_no != did->device_no) |
| 768 | return 0; | 772 | return 0; |
| 769 | } | 773 | } |
diff --git a/include/pcmcia/device_id.h b/include/pcmcia/device_id.h index 346d81ece287..e04e0b0d9a25 100644 --- a/include/pcmcia/device_id.h +++ b/include/pcmcia/device_id.h | |||
| @@ -72,6 +72,15 @@ | |||
| 72 | .prod_id = { (v1), (v2), (v3), (v4) }, \ | 72 | .prod_id = { (v1), (v2), (v3), (v4) }, \ |
| 73 | .prod_id_hash = { (vh1), (vh2), (vh3), (vh4) }, } | 73 | .prod_id_hash = { (vh1), (vh2), (vh3), (vh4) }, } |
| 74 | 74 | ||
| 75 | #define PCMCIA_DEVICE_MANF_CARD_PROD_ID1(manf, card, v1, vh1) { \ | ||
| 76 | .match_flags = PCMCIA_DEV_ID_MATCH_MANF_ID| \ | ||
| 77 | PCMCIA_DEV_ID_MATCH_CARD_ID| \ | ||
| 78 | PCMCIA_DEV_ID_MATCH_PROD_ID1, \ | ||
| 79 | .manf_id = (manf), \ | ||
| 80 | .card_id = (card), \ | ||
| 81 | .prod_id = { (v1), NULL, NULL, NULL }, \ | ||
| 82 | .prod_id_hash = { (vh1), 0, 0, 0 }, } | ||
| 83 | |||
| 75 | 84 | ||
| 76 | /* multi-function devices */ | 85 | /* multi-function devices */ |
| 77 | 86 | ||
