ds.c (94a819f80297e1f635a7cde4ed5317612e512ba7) | ds.c (3f565232c561fbd9d5e03354aac29b90cb2bc78a) |
---|---|
1/* 2 * ds.c -- 16-bit PCMCIA core support 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 * The initial developer of the original code is David A. Hinds --- 110 unchanged lines hidden (view full) --- 119 dynid->id.match_flags = match_flags; 120 dynid->id.manf_id = manf_id; 121 dynid->id.card_id = card_id; 122 dynid->id.func_id = func_id; 123 dynid->id.function = function; 124 dynid->id.device_no = device_no; 125 memcpy(dynid->id.prod_id_hash, prod_id_hash, sizeof(__u32) * 4); 126 | 1/* 2 * ds.c -- 16-bit PCMCIA core support 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 * The initial developer of the original code is David A. Hinds --- 110 unchanged lines hidden (view full) --- 119 dynid->id.match_flags = match_flags; 120 dynid->id.manf_id = manf_id; 121 dynid->id.card_id = card_id; 122 dynid->id.func_id = func_id; 123 dynid->id.function = function; 124 dynid->id.device_no = device_no; 125 memcpy(dynid->id.prod_id_hash, prod_id_hash, sizeof(__u32) * 4); 126 |
127 spin_lock(&pdrv->dynids.lock); | 127 mutex_lock(&pdrv->dynids.lock); |
128 list_add_tail(&dynid->node, &pdrv->dynids.list); | 128 list_add_tail(&dynid->node, &pdrv->dynids.list); |
129 spin_unlock(&pdrv->dynids.lock); | 129 mutex_unlock(&pdrv->dynids.lock); |
130 131 if (get_driver(&pdrv->drv)) { 132 retval = driver_attach(&pdrv->drv); 133 put_driver(&pdrv->drv); 134 } 135 136 if (retval) 137 return retval; 138 return count; 139} 140static DRIVER_ATTR(new_id, S_IWUSR, NULL, pcmcia_store_new_id); 141 142static void 143pcmcia_free_dynids(struct pcmcia_driver *drv) 144{ 145 struct pcmcia_dynid *dynid, *n; 146 | 130 131 if (get_driver(&pdrv->drv)) { 132 retval = driver_attach(&pdrv->drv); 133 put_driver(&pdrv->drv); 134 } 135 136 if (retval) 137 return retval; 138 return count; 139} 140static DRIVER_ATTR(new_id, S_IWUSR, NULL, pcmcia_store_new_id); 141 142static void 143pcmcia_free_dynids(struct pcmcia_driver *drv) 144{ 145 struct pcmcia_dynid *dynid, *n; 146 |
147 spin_lock(&drv->dynids.lock); | 147 mutex_lock(&drv->dynids.lock); |
148 list_for_each_entry_safe(dynid, n, &drv->dynids.list, node) { 149 list_del(&dynid->node); 150 kfree(dynid); 151 } | 148 list_for_each_entry_safe(dynid, n, &drv->dynids.list, node) { 149 list_del(&dynid->node); 150 kfree(dynid); 151 } |
152 spin_unlock(&drv->dynids.lock); | 152 mutex_unlock(&drv->dynids.lock); |
153} 154 155static int 156pcmcia_create_newid_file(struct pcmcia_driver *drv) 157{ 158 int error = 0; 159 if (drv->probe != NULL) 160 error = driver_create_file(&drv->drv, &driver_attr_new_id); --- 14 unchanged lines hidden (view full) --- 175 if (!driver) 176 return -EINVAL; 177 178 pcmcia_check_driver(driver); 179 180 /* initialize common fields */ 181 driver->drv.bus = &pcmcia_bus_type; 182 driver->drv.owner = driver->owner; | 153} 154 155static int 156pcmcia_create_newid_file(struct pcmcia_driver *drv) 157{ 158 int error = 0; 159 if (drv->probe != NULL) 160 error = driver_create_file(&drv->drv, &driver_attr_new_id); --- 14 unchanged lines hidden (view full) --- 175 if (!driver) 176 return -EINVAL; 177 178 pcmcia_check_driver(driver); 179 180 /* initialize common fields */ 181 driver->drv.bus = &pcmcia_bus_type; 182 driver->drv.owner = driver->owner; |
183 spin_lock_init(&driver->dynids.lock); | 183 mutex_init(&driver->dynids.lock); |
184 INIT_LIST_HEAD(&driver->dynids.list); 185 186 pr_debug("registering driver %s\n", driver->drv.name); 187 188 error = driver_register(&driver->drv); 189 if (error < 0) 190 return error; 191 --- 697 unchanged lines hidden (view full) --- 889static int pcmcia_bus_match(struct device *dev, struct device_driver *drv) 890{ 891 struct pcmcia_device *p_dev = to_pcmcia_dev(dev); 892 struct pcmcia_driver *p_drv = to_pcmcia_drv(drv); 893 struct pcmcia_device_id *did = p_drv->id_table; 894 struct pcmcia_dynid *dynid; 895 896 /* match dynamic devices first */ | 184 INIT_LIST_HEAD(&driver->dynids.list); 185 186 pr_debug("registering driver %s\n", driver->drv.name); 187 188 error = driver_register(&driver->drv); 189 if (error < 0) 190 return error; 191 --- 697 unchanged lines hidden (view full) --- 889static int pcmcia_bus_match(struct device *dev, struct device_driver *drv) 890{ 891 struct pcmcia_device *p_dev = to_pcmcia_dev(dev); 892 struct pcmcia_driver *p_drv = to_pcmcia_drv(drv); 893 struct pcmcia_device_id *did = p_drv->id_table; 894 struct pcmcia_dynid *dynid; 895 896 /* match dynamic devices first */ |
897 spin_lock(&p_drv->dynids.lock); | 897 mutex_lock(&p_drv->dynids.lock); |
898 list_for_each_entry(dynid, &p_drv->dynids.list, node) { 899 dev_dbg(dev, "trying to match to %s\n", drv->name); 900 if (pcmcia_devmatch(p_dev, &dynid->id)) { 901 dev_dbg(dev, "matched to %s\n", drv->name); | 898 list_for_each_entry(dynid, &p_drv->dynids.list, node) { 899 dev_dbg(dev, "trying to match to %s\n", drv->name); 900 if (pcmcia_devmatch(p_dev, &dynid->id)) { 901 dev_dbg(dev, "matched to %s\n", drv->name); |
902 spin_unlock(&p_drv->dynids.lock); | 902 mutex_unlock(&p_drv->dynids.lock); |
903 return 1; 904 } 905 } | 903 return 1; 904 } 905 } |
906 spin_unlock(&p_drv->dynids.lock); | 906 mutex_unlock(&p_drv->dynids.lock); |
907 908#ifdef CONFIG_PCMCIA_IOCTL 909 /* matching by cardmgr */ 910 if (p_dev->cardmgr == p_drv) { 911 dev_dbg(dev, "cardmgr matched to %s\n", drv->name); 912 return 1; 913 } 914#endif --- 578 unchanged lines hidden --- | 907 908#ifdef CONFIG_PCMCIA_IOCTL 909 /* matching by cardmgr */ 910 if (p_dev->cardmgr == p_drv) { 911 dev_dbg(dev, "cardmgr matched to %s\n", drv->name); 912 return 1; 913 } 914#endif --- 578 unchanged lines hidden --- |