Merge git://git.kernel.org/pub/scm/linux/kernel/git/brodo/pcmcia-fixes-2.6

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