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