Lines Matching +full:multi +full:- +full:socket

1 // SPDX-License-Identifier: GPL-2.0-only
3 * ds.c -- 16-bit PCMCIA core support
10 * (C) 2003 - 2010 Dominik Brodowski
23 #include <linux/dma-mapping.h>
45 const struct pcmcia_device_id *did = p_drv->id_table; in pcmcia_check_driver()
49 if (!p_drv->probe || !p_drv->remove) in pcmcia_check_driver()
51 "function\n", p_drv->name); in pcmcia_check_driver()
53 while (did && did->match_flags) { in pcmcia_check_driver()
55 if (!did->prod_id[i]) in pcmcia_check_driver()
58 hash = crc32(0, did->prod_id[i], strlen(did->prod_id[i])); in pcmcia_check_driver()
59 if (hash == did->prod_id_hash[i]) in pcmcia_check_driver()
64 "be 0x%x\n", p_drv->name, did->prod_id[i], in pcmcia_check_driver()
65 did->prod_id_hash[i], hash); in pcmcia_check_driver()
86 * new_id_store() - add a new PCMCIA device ID to this driver and re-probe devices
109 return -EINVAL; in new_id_store()
113 return -ENOMEM; in new_id_store()
115 dynid->id.match_flags = match_flags; in new_id_store()
116 dynid->id.manf_id = manf_id; in new_id_store()
117 dynid->id.card_id = card_id; in new_id_store()
118 dynid->id.func_id = func_id; in new_id_store()
119 dynid->id.function = function; in new_id_store()
120 dynid->id.device_no = device_no; in new_id_store()
121 memcpy(dynid->id.prod_id_hash, prod_id_hash, sizeof(__u32) * 4); in new_id_store()
123 mutex_lock(&pdrv->dynids.lock); in new_id_store()
124 list_add_tail(&dynid->node, &pdrv->dynids.list); in new_id_store()
125 mutex_unlock(&pdrv->dynids.lock); in new_id_store()
127 retval = driver_attach(&pdrv->drv); in new_id_store()
140 mutex_lock(&drv->dynids.lock); in pcmcia_free_dynids()
141 list_for_each_entry_safe(dynid, n, &drv->dynids.list, node) { in pcmcia_free_dynids()
142 list_del(&dynid->node); in pcmcia_free_dynids()
145 mutex_unlock(&drv->dynids.lock); in pcmcia_free_dynids()
152 if (drv->probe != NULL) in pcmcia_create_newid_file()
153 error = driver_create_file(&drv->drv, &driver_attr_new_id); in pcmcia_create_newid_file()
160 driver_remove_file(&drv->drv, &driver_attr_new_id); in pcmcia_remove_newid_file()
164 * pcmcia_register_driver - register a PCMCIA driver with the bus core
174 return -EINVAL; in pcmcia_register_driver()
179 driver->drv.bus = &pcmcia_bus_type; in pcmcia_register_driver()
180 driver->drv.owner = driver->owner; in pcmcia_register_driver()
181 driver->drv.name = driver->name; in pcmcia_register_driver()
182 mutex_init(&driver->dynids.lock); in pcmcia_register_driver()
183 INIT_LIST_HEAD(&driver->dynids.list); in pcmcia_register_driver()
185 pr_debug("registering driver %s\n", driver->name); in pcmcia_register_driver()
187 error = driver_register(&driver->drv); in pcmcia_register_driver()
193 driver_unregister(&driver->drv); in pcmcia_register_driver()
200 * pcmcia_unregister_driver - unregister a PCMCIA driver with the bus core
205 pr_debug("unregistering driver %s\n", driver->name); in pcmcia_unregister_driver()
207 driver_unregister(&driver->drv); in pcmcia_unregister_driver()
218 tmp_dev = get_device(&p_dev->dev); in pcmcia_get_dev()
227 put_device(&p_dev->dev); in pcmcia_put_dev()
242 pcmcia_put_socket(p_dev->socket); in pcmcia_release_dev()
244 kfree(p_dev->prod_id[i]); in pcmcia_release_dev()
245 kfree(p_dev->devname); in pcmcia_release_dev()
246 kref_put(&p_dev->function_config->ref, pcmcia_release_function); in pcmcia_release_dev()
261 return -ENODEV; in pcmcia_device_probe()
264 p_drv = to_pcmcia_drv(dev->driver); in pcmcia_device_probe()
265 s = p_dev->socket; in pcmcia_device_probe()
267 dev_dbg(dev, "trying to bind to %s\n", p_drv->name); in pcmcia_device_probe()
269 if ((!p_drv->probe) || (!p_dev->function_config) || in pcmcia_device_probe()
270 (!try_module_get(p_drv->owner))) { in pcmcia_device_probe()
271 ret = -EINVAL; in pcmcia_device_probe()
276 ret = pccard_read_tuple(p_dev->socket, p_dev->func, CISTPL_CONFIG, in pcmcia_device_probe()
279 p_dev->config_base = cis_config.base; in pcmcia_device_probe()
280 p_dev->config_regs = cis_config.rmask[0]; in pcmcia_device_probe()
281 dev_dbg(dev, "base %x, regs %x", p_dev->config_base, in pcmcia_device_probe()
282 p_dev->config_regs); in pcmcia_device_probe()
286 p_dev->config_base = 0; in pcmcia_device_probe()
287 p_dev->config_regs = 0; in pcmcia_device_probe()
290 ret = p_drv->probe(p_dev); in pcmcia_device_probe()
293 p_drv->name, ret); in pcmcia_device_probe()
296 dev_dbg(dev, "%s bound: Vpp %d.%d, idx %x, IRQ %d", p_drv->name, in pcmcia_device_probe()
297 p_dev->vpp/10, p_dev->vpp%10, p_dev->config_index, p_dev->irq); in pcmcia_device_probe()
299 p_dev->resource[0], p_dev->resource[1], p_dev->resource[2], in pcmcia_device_probe()
300 p_dev->resource[3], p_dev->resource[4]); in pcmcia_device_probe()
302 mutex_lock(&s->ops_mutex); in pcmcia_device_probe()
303 if ((s->pcmcia_pfc) && in pcmcia_device_probe()
304 (p_dev->socket->device_count == 1) && (p_dev->device_no == 0)) in pcmcia_device_probe()
306 mutex_unlock(&s->ops_mutex); in pcmcia_device_probe()
310 module_put(p_drv->owner); in pcmcia_device_probe()
319 * Removes a PCMCIA card from the device tree and socket list.
326 dev_dbg(leftover ? &leftover->dev : &s->dev, in pcmcia_card_remove()
327 "pcmcia_card_remove(%d) %s\n", s->sock, in pcmcia_card_remove()
328 leftover ? leftover->devname : ""); in pcmcia_card_remove()
330 mutex_lock(&s->ops_mutex); in pcmcia_card_remove()
332 s->device_count = 0; in pcmcia_card_remove()
334 s->device_count = 1; in pcmcia_card_remove()
335 mutex_unlock(&s->ops_mutex); in pcmcia_card_remove()
337 /* unregister all pcmcia_devices registered with this socket, except leftover */ in pcmcia_card_remove()
338 list_for_each_entry_safe(p_dev, tmp, &s->devices_list, socket_device_list) { in pcmcia_card_remove()
342 mutex_lock(&s->ops_mutex); in pcmcia_card_remove()
343 list_del(&p_dev->socket_device_list); in pcmcia_card_remove()
344 mutex_unlock(&s->ops_mutex); in pcmcia_card_remove()
346 dev_dbg(&p_dev->dev, "unregistering device\n"); in pcmcia_card_remove()
347 device_unregister(&p_dev->dev); in pcmcia_card_remove()
360 p_drv = to_pcmcia_drv(dev->driver); in pcmcia_device_remove()
365 * pseudo multi-function card, we need to unbind in pcmcia_device_remove()
368 if ((p_dev->socket->pcmcia_pfc) && in pcmcia_device_remove()
369 (p_dev->socket->device_count > 0) && in pcmcia_device_remove()
370 (p_dev->device_no == 0)) in pcmcia_device_remove()
371 pcmcia_card_remove(p_dev->socket, p_dev); in pcmcia_device_remove()
374 if (p_drv->remove) in pcmcia_device_remove()
375 p_drv->remove(p_dev); in pcmcia_device_remove()
378 if (p_dev->_irq || p_dev->_io || p_dev->_locked) in pcmcia_device_remove()
381 p_drv->name); in pcmcia_device_remove()
384 if (p_dev->_win & CLIENT_WIN_REQ(i)) in pcmcia_device_remove()
387 p_drv->name); in pcmcia_device_remove()
391 module_put(p_drv->owner); in pcmcia_device_remove()
396 * pcmcia_device_query -- determine information about a pcmcia device
407 return -ENOMEM; in pcmcia_device_query()
409 if (!pccard_read_tuple(p_dev->socket, BIND_FN_ALL, in pcmcia_device_query()
411 mutex_lock(&p_dev->socket->ops_mutex); in pcmcia_device_query()
412 p_dev->manf_id = manf_id.manf; in pcmcia_device_query()
413 p_dev->card_id = manf_id.card; in pcmcia_device_query()
414 p_dev->has_manf_id = 1; in pcmcia_device_query()
415 p_dev->has_card_id = 1; in pcmcia_device_query()
416 mutex_unlock(&p_dev->socket->ops_mutex); in pcmcia_device_query()
419 if (!pccard_read_tuple(p_dev->socket, p_dev->func, in pcmcia_device_query()
421 mutex_lock(&p_dev->socket->ops_mutex); in pcmcia_device_query()
422 p_dev->func_id = func_id.func; in pcmcia_device_query()
423 p_dev->has_func_id = 1; in pcmcia_device_query()
424 mutex_unlock(&p_dev->socket->ops_mutex); in pcmcia_device_query()
428 * probably memory cards (from pcmcia-cs) */ in pcmcia_device_query()
434 return -ENOMEM; in pcmcia_device_query()
436 if (!pccard_read_tuple(p_dev->socket, p_dev->func, in pcmcia_device_query()
438 dev_dbg(&p_dev->dev, in pcmcia_device_query()
441 mutex_lock(&p_dev->socket->ops_mutex); in pcmcia_device_query()
442 p_dev->func_id = CISTPL_FUNCID_MEMORY; in pcmcia_device_query()
443 p_dev->has_func_id = 1; in pcmcia_device_query()
444 mutex_unlock(&p_dev->socket->ops_mutex); in pcmcia_device_query()
449 if (!pccard_read_tuple(p_dev->socket, BIND_FN_ALL, CISTPL_VERS_1, in pcmcia_device_query()
451 mutex_lock(&p_dev->socket->ops_mutex); in pcmcia_device_query()
452 for (i = 0; i < min_t(unsigned int, 4, vers1->ns); i++) { in pcmcia_device_query()
457 tmp = vers1->str + vers1->ofs[i]; in pcmcia_device_query()
467 tmp = p_dev->prod_id[i]; in pcmcia_device_query()
468 p_dev->prod_id[i] = new; in pcmcia_device_query()
471 mutex_unlock(&p_dev->socket->ops_mutex); in pcmcia_device_query()
489 pr_debug("adding device to %d, function %d\n", s->sock, function); in pcmcia_device_add()
495 mutex_lock(&s->ops_mutex); in pcmcia_device_add()
496 p_dev->device_no = (s->device_count++); in pcmcia_device_add()
497 mutex_unlock(&s->ops_mutex); in pcmcia_device_add()
500 if ((p_dev->device_no >= 2) && (function == 0)) in pcmcia_device_add()
504 if (p_dev->device_no >= 4) in pcmcia_device_add()
507 p_dev->socket = s; in pcmcia_device_add()
508 p_dev->func = function; in pcmcia_device_add()
510 p_dev->dev.bus = &pcmcia_bus_type; in pcmcia_device_add()
511 p_dev->dev.parent = s->dev.parent; in pcmcia_device_add()
512 p_dev->dev.release = pcmcia_release_dev; in pcmcia_device_add()
514 p_dev->dma_mask = 0; in pcmcia_device_add()
515 p_dev->dev.dma_mask = &p_dev->dma_mask; in pcmcia_device_add()
516 p_dev->devname = kasprintf(GFP_KERNEL, "pcmcia%s", dev_name(&p_dev->dev)); in pcmcia_device_add()
517 if (!p_dev->devname) in pcmcia_device_add()
519 dev_dbg(&p_dev->dev, "devname is %s\n", p_dev->devname); in pcmcia_device_add()
521 mutex_lock(&s->ops_mutex); in pcmcia_device_add()
524 * p_dev->function_config must be the same for all card functions. in pcmcia_device_add()
528 list_for_each_entry(tmp_dev, &s->devices_list, socket_device_list) in pcmcia_device_add()
529 if (p_dev->func == tmp_dev->func) { in pcmcia_device_add()
530 p_dev->function_config = tmp_dev->function_config; in pcmcia_device_add()
531 p_dev->irq = tmp_dev->irq; in pcmcia_device_add()
532 kref_get(&p_dev->function_config->ref); in pcmcia_device_add()
536 list_add(&p_dev->socket_device_list, &s->devices_list); in pcmcia_device_add()
539 dev_warn(&p_dev->dev, in pcmcia_device_add()
540 "IRQ setup failed -- device might not work\n"); in pcmcia_device_add()
542 if (!p_dev->function_config) { in pcmcia_device_add()
544 dev_dbg(&p_dev->dev, "creating config_t\n"); in pcmcia_device_add()
547 mutex_unlock(&s->ops_mutex); in pcmcia_device_add()
550 p_dev->function_config = c; in pcmcia_device_add()
551 kref_init(&c->ref); in pcmcia_device_add()
553 c->io[i].name = p_dev->devname; in pcmcia_device_add()
554 c->io[i].flags = IORESOURCE_IO; in pcmcia_device_add()
557 c->mem[i].name = p_dev->devname; in pcmcia_device_add()
558 c->mem[i].flags = IORESOURCE_MEM; in pcmcia_device_add()
562 p_dev->resource[i] = &p_dev->function_config->io[i]; in pcmcia_device_add()
564 p_dev->resource[i] = &p_dev->function_config->mem[i-MAX_IO_WIN]; in pcmcia_device_add()
566 mutex_unlock(&s->ops_mutex); in pcmcia_device_add()
568 dev_notice(&p_dev->dev, "pcmcia: registering new device %s (IRQ: %d)\n", in pcmcia_device_add()
569 p_dev->devname, p_dev->irq); in pcmcia_device_add()
573 dev_set_name(&p_dev->dev, "%d.%d", p_dev->socket->sock, p_dev->device_no); in pcmcia_device_add()
574 if (device_register(&p_dev->dev)) { in pcmcia_device_add()
575 mutex_lock(&s->ops_mutex); in pcmcia_device_add()
576 list_del(&p_dev->socket_device_list); in pcmcia_device_add()
577 s->device_count--; in pcmcia_device_add()
578 mutex_unlock(&s->ops_mutex); in pcmcia_device_add()
579 put_device(&p_dev->dev); in pcmcia_device_add()
586 mutex_lock(&s->ops_mutex); in pcmcia_device_add()
587 list_del(&p_dev->socket_device_list); in pcmcia_device_add()
588 mutex_unlock(&s->ops_mutex); in pcmcia_device_add()
591 mutex_lock(&s->ops_mutex); in pcmcia_device_add()
592 s->device_count--; in pcmcia_device_add()
593 mutex_unlock(&s->ops_mutex); in pcmcia_device_add()
596 kfree(p_dev->prod_id[i]); in pcmcia_device_add()
597 kfree(p_dev->devname); in pcmcia_device_add()
610 int ret = -EAGAIN; in pcmcia_card_add()
612 mutex_lock(&s->ops_mutex); in pcmcia_card_add()
613 if (!(s->resource_setup_done)) { in pcmcia_card_add()
614 dev_dbg(&s->dev, in pcmcia_card_add()
616 mutex_unlock(&s->ops_mutex); in pcmcia_card_add()
617 return -EAGAIN; /* try again, but later... */ in pcmcia_card_add()
621 dev_dbg(&s->dev, "validating mem resources failed, " in pcmcia_card_add()
623 mutex_unlock(&s->ops_mutex); in pcmcia_card_add()
624 return -EAGAIN; /* try again, but later... */ in pcmcia_card_add()
626 mutex_unlock(&s->ops_mutex); in pcmcia_card_add()
637 if (ret == -EIO) { in pcmcia_card_add()
638 dev_info(&s->dev, "no CIS, assuming an anonymous memory card.\n"); in pcmcia_card_add()
645 dev_dbg(&s->dev, "invalid CIS or invalid resources\n"); in pcmcia_card_add()
646 return -ENODEV; in pcmcia_card_add()
654 s->functions = no_funcs; in pcmcia_card_add()
666 if (!p_dev->dev.driver) { in pcmcia_requery_callback()
679 if (!(s->state & SOCKET_PRESENT)) in pcmcia_requery()
682 if (s->functions == 0) { in pcmcia_requery()
694 if (s->fake_cis) { in pcmcia_requery()
699 old_funcs = s->functions; in pcmcia_requery()
707 /* we need to re-start */ in pcmcia_requery()
709 s->functions = 0; in pcmcia_requery()
715 * call pcmcia_device_add() -- which will fail if both in pcmcia_requery()
717 mutex_lock(&s->ops_mutex); in pcmcia_requery()
718 has_pfc = s->pcmcia_pfc; in pcmcia_requery()
719 mutex_unlock(&s->ops_mutex); in pcmcia_requery()
723 /* we re-scan all devices, not just the ones connected to this in pcmcia_requery()
724 * socket. This does not matter, though. */ in pcmcia_requery()
726 dev_warn(&s->dev, "rescanning the bus failed\n"); in pcmcia_requery()
733 * pcmcia_load_firmware - load CIS from userspace if device-provided is broken
737 * This uses the in-kernel firmware loading mechanism to use a "fake CIS" if
743 struct pcmcia_socket *s = dev->socket; in pcmcia_load_firmware()
745 int ret = -ENOMEM; in pcmcia_load_firmware()
750 return -EINVAL; in pcmcia_load_firmware()
752 dev_dbg(&dev->dev, "trying to load CIS file %s\n", filename); in pcmcia_load_firmware()
754 if (request_firmware(&fw, filename, &dev->dev) == 0) { in pcmcia_load_firmware()
755 if (fw->size >= CISTPL_MAX_CIS_SIZE) { in pcmcia_load_firmware()
756 ret = -EINVAL; in pcmcia_load_firmware()
757 dev_err(&dev->dev, "pcmcia: CIS override is too big\n"); in pcmcia_load_firmware()
761 if (!pcmcia_replace_cis(s, fw->data, fw->size)) in pcmcia_load_firmware()
764 dev_err(&dev->dev, "pcmcia: CIS override failed\n"); in pcmcia_load_firmware()
768 /* we need to re-start if the number of functions changed */ in pcmcia_load_firmware()
769 old_funcs = s->functions; in pcmcia_load_firmware()
775 ret = -EBUSY; in pcmcia_load_firmware()
794 return -ENODEV; in pcmcia_load_firmware()
803 if (did->match_flags & PCMCIA_DEV_ID_MATCH_MANF_ID) { in pcmcia_devmatch()
804 if ((!dev->has_manf_id) || (dev->manf_id != did->manf_id)) in pcmcia_devmatch()
808 if (did->match_flags & PCMCIA_DEV_ID_MATCH_CARD_ID) { in pcmcia_devmatch()
809 if ((!dev->has_card_id) || (dev->card_id != did->card_id)) in pcmcia_devmatch()
813 if (did->match_flags & PCMCIA_DEV_ID_MATCH_FUNCTION) { in pcmcia_devmatch()
814 if (dev->func != did->function) in pcmcia_devmatch()
818 if (did->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID1) { in pcmcia_devmatch()
819 if (!dev->prod_id[0]) in pcmcia_devmatch()
821 if (strcmp(did->prod_id[0], dev->prod_id[0])) in pcmcia_devmatch()
825 if (did->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID2) { in pcmcia_devmatch()
826 if (!dev->prod_id[1]) in pcmcia_devmatch()
828 if (strcmp(did->prod_id[1], dev->prod_id[1])) in pcmcia_devmatch()
832 if (did->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID3) { in pcmcia_devmatch()
833 if (!dev->prod_id[2]) in pcmcia_devmatch()
835 if (strcmp(did->prod_id[2], dev->prod_id[2])) in pcmcia_devmatch()
839 if (did->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID4) { in pcmcia_devmatch()
840 if (!dev->prod_id[3]) in pcmcia_devmatch()
842 if (strcmp(did->prod_id[3], dev->prod_id[3])) in pcmcia_devmatch()
846 if (did->match_flags & PCMCIA_DEV_ID_MATCH_DEVICE_NO) { in pcmcia_devmatch()
847 dev_dbg(&dev->dev, "this is a pseudo-multi-function device\n"); in pcmcia_devmatch()
848 mutex_lock(&dev->socket->ops_mutex); in pcmcia_devmatch()
849 dev->socket->pcmcia_pfc = 1; in pcmcia_devmatch()
850 mutex_unlock(&dev->socket->ops_mutex); in pcmcia_devmatch()
851 if (dev->device_no != did->device_no) in pcmcia_devmatch()
855 if (did->match_flags & PCMCIA_DEV_ID_MATCH_FUNC_ID) { in pcmcia_devmatch()
858 if ((!dev->has_func_id) || (dev->func_id != did->func_id)) in pcmcia_devmatch()
861 /* if this is a pseudo-multi-function device, in pcmcia_devmatch()
863 if (dev->socket->pcmcia_pfc) in pcmcia_devmatch()
865 if (dev->device_no) in pcmcia_devmatch()
869 * after it has re-checked that there is no possible module in pcmcia_devmatch()
872 mutex_lock(&dev->socket->ops_mutex); in pcmcia_devmatch()
873 ret = dev->allow_func_id_match; in pcmcia_devmatch()
874 mutex_unlock(&dev->socket->ops_mutex); in pcmcia_devmatch()
877 dev_dbg(&dev->dev, in pcmcia_devmatch()
883 if (did->match_flags & PCMCIA_DEV_ID_MATCH_FAKE_CIS) { in pcmcia_devmatch()
884 dev_dbg(&dev->dev, "device needs a fake CIS\n"); in pcmcia_devmatch()
885 if (!dev->socket->fake_cis) in pcmcia_devmatch()
886 if (pcmcia_load_firmware(dev, did->cisfile)) in pcmcia_devmatch()
890 if (did->match_flags & PCMCIA_DEV_ID_MATCH_ANONYMOUS) { in pcmcia_devmatch()
893 if (dev->prod_id[i]) in pcmcia_devmatch()
895 if (dev->has_manf_id || dev->has_card_id || dev->has_func_id) in pcmcia_devmatch()
907 const struct pcmcia_device_id *did = p_drv->id_table; in pcmcia_bus_match()
911 mutex_lock(&p_drv->dynids.lock); in pcmcia_bus_match()
912 list_for_each_entry(dynid, &p_drv->dynids.list, node) { in pcmcia_bus_match()
913 dev_dbg(dev, "trying to match to %s\n", drv->name); in pcmcia_bus_match()
914 if (pcmcia_devmatch(p_dev, &dynid->id)) { in pcmcia_bus_match()
915 dev_dbg(dev, "matched to %s\n", drv->name); in pcmcia_bus_match()
916 mutex_unlock(&p_drv->dynids.lock); in pcmcia_bus_match()
920 mutex_unlock(&p_drv->dynids.lock); in pcmcia_bus_match()
922 while (did && did->match_flags) { in pcmcia_bus_match()
923 dev_dbg(dev, "trying to match to %s\n", drv->name); in pcmcia_bus_match()
925 dev_dbg(dev, "matched to %s\n", drv->name); in pcmcia_bus_match()
941 return -ENODEV; in pcmcia_bus_uevent()
947 if (!p_dev->prod_id[i]) in pcmcia_bus_uevent()
949 hash[i] = crc32(0, p_dev->prod_id[i], strlen(p_dev->prod_id[i])); in pcmcia_bus_uevent()
952 if (add_uevent_var(env, "SOCKET_NO=%u", p_dev->socket->sock)) in pcmcia_bus_uevent()
953 return -ENOMEM; in pcmcia_bus_uevent()
955 if (add_uevent_var(env, "DEVICE_NO=%02X", p_dev->device_no)) in pcmcia_bus_uevent()
956 return -ENOMEM; in pcmcia_bus_uevent()
960 p_dev->has_manf_id ? p_dev->manf_id : 0, in pcmcia_bus_uevent()
961 p_dev->has_card_id ? p_dev->card_id : 0, in pcmcia_bus_uevent()
962 p_dev->has_func_id ? p_dev->func_id : 0, in pcmcia_bus_uevent()
963 p_dev->func, in pcmcia_bus_uevent()
964 p_dev->device_no, in pcmcia_bus_uevent()
969 return -ENOMEM; in pcmcia_bus_uevent()
999 /************************ per-device sysfs output ***************************/
1005 return p_dev->test ? sysfs_emit(buf, format, p_dev->field) : -ENODEV; \
1013 return p_dev->field ? sysfs_emit(buf, "%s\n", p_dev->field) : -ENODEV; \
1029 return p_dev->socket ? sysfs_emit(buf, "0x%02x\n", p_dev->func) : -ENODEV; in function_show()
1040 at += sysfs_emit_at(buf, at, "%pr\n", p_dev->resource[i]); in resources_show()
1050 if (p_dev->suspended) in pm_state_show()
1063 return -EINVAL; in pm_state_store()
1065 if ((!p_dev->suspended) && !strncmp(buf, "off", 3)) in pm_state_store()
1067 else if (p_dev->suspended && !strncmp(buf, "on", 2)) in pm_state_store()
1082 if (!p_dev->prod_id[i]) in modalias_show()
1084 hash[i] = crc32(0, p_dev->prod_id[i], in modalias_show()
1085 strlen(p_dev->prod_id[i])); in modalias_show()
1088 p_dev->has_manf_id ? p_dev->manf_id : 0, in modalias_show()
1089 p_dev->has_card_id ? p_dev->card_id : 0, in modalias_show()
1090 p_dev->has_func_id ? p_dev->func_id : 0, in modalias_show()
1091 p_dev->func, p_dev->device_no, in modalias_show()
1102 return -EINVAL; in allow_func_id_match_store()
1104 mutex_lock(&p_dev->socket->ops_mutex); in allow_func_id_match_store()
1105 p_dev->allow_func_id_match = 1; in allow_func_id_match_store()
1106 mutex_unlock(&p_dev->socket->ops_mutex); in allow_func_id_match_store()
1107 pcmcia_parse_uevents(p_dev->socket, PCMCIA_UEVENT_REQUERY); in allow_func_id_match_store()
1138 mutex_lock(&p_dev->socket->ops_mutex); in pcmcia_dev_suspend()
1139 if (p_dev->suspended) { in pcmcia_dev_suspend()
1140 mutex_unlock(&p_dev->socket->ops_mutex); in pcmcia_dev_suspend()
1143 p_dev->suspended = 1; in pcmcia_dev_suspend()
1144 mutex_unlock(&p_dev->socket->ops_mutex); in pcmcia_dev_suspend()
1148 if (dev->driver) in pcmcia_dev_suspend()
1149 p_drv = to_pcmcia_drv(dev->driver); in pcmcia_dev_suspend()
1154 if (p_drv->suspend) { in pcmcia_dev_suspend()
1155 ret = p_drv->suspend(p_dev); in pcmcia_dev_suspend()
1159 p_dev->devname, p_drv->name, ret); in pcmcia_dev_suspend()
1160 mutex_lock(&p_dev->socket->ops_mutex); in pcmcia_dev_suspend()
1161 p_dev->suspended = 0; in pcmcia_dev_suspend()
1162 mutex_unlock(&p_dev->socket->ops_mutex); in pcmcia_dev_suspend()
1167 if (p_dev->device_no == p_dev->func) { in pcmcia_dev_suspend()
1183 mutex_lock(&p_dev->socket->ops_mutex); in pcmcia_dev_resume()
1184 if (!p_dev->suspended) { in pcmcia_dev_resume()
1185 mutex_unlock(&p_dev->socket->ops_mutex); in pcmcia_dev_resume()
1188 p_dev->suspended = 0; in pcmcia_dev_resume()
1189 mutex_unlock(&p_dev->socket->ops_mutex); in pcmcia_dev_resume()
1193 if (dev->driver) in pcmcia_dev_resume()
1194 p_drv = to_pcmcia_drv(dev->driver); in pcmcia_dev_resume()
1199 if (p_dev->device_no == p_dev->func) { in pcmcia_dev_resume()
1206 if (p_drv->resume) in pcmcia_dev_resume()
1207 ret = p_drv->resume(p_dev); in pcmcia_dev_resume()
1219 if (p_dev->socket != skt || p_dev->suspended) in pcmcia_bus_suspend_callback()
1230 if (p_dev->socket != skt || !p_dev->suspended) in pcmcia_bus_resume_callback()
1240 dev_dbg(&skt->dev, "resuming socket %d\n", skt->sock); in pcmcia_bus_resume()
1247 dev_dbg(&skt->dev, "suspending socket %d\n", skt->sock); in pcmcia_bus_suspend()
1251 return -EIO; in pcmcia_bus_suspend()
1258 atomic_set(&skt->present, 0); in pcmcia_bus_remove()
1261 mutex_lock(&skt->ops_mutex); in pcmcia_bus_remove()
1264 mutex_unlock(&skt->ops_mutex); in pcmcia_bus_remove()
1271 atomic_set(&skt->present, 1); in pcmcia_bus_add()
1273 mutex_lock(&skt->ops_mutex); in pcmcia_bus_add()
1274 skt->pcmcia_pfc = 0; in pcmcia_bus_add()
1276 mutex_unlock(&skt->ops_mutex); in pcmcia_bus_add()
1288 dev_dbg(&skt->dev, "cis mismatch - different card\n"); in pcmcia_bus_early_resume()
1293 mutex_lock(&skt->ops_mutex); in pcmcia_bus_early_resume()
1295 kfree(skt->fake_cis); in pcmcia_bus_early_resume()
1296 skt->fake_cis = NULL; in pcmcia_bus_early_resume()
1297 skt->functions = 0; in pcmcia_bus_early_resume()
1298 mutex_unlock(&skt->ops_mutex); in pcmcia_bus_early_resume()
1309 * non-NULL. Furthermore, the device driver most likely is unbound
1322 if (atomic_read(&p_dev->socket->present) != 0) in pcmcia_dev_present()
1344 struct pcmcia_socket *socket = dev_get_drvdata(dev); in pcmcia_bus_add_socket() local
1347 socket = pcmcia_get_socket(socket); in pcmcia_bus_add_socket()
1348 if (!socket) { in pcmcia_bus_add_socket()
1349 dev_err(dev, "PCMCIA obtaining reference to socket failed\n"); in pcmcia_bus_add_socket()
1350 return -ENODEV; in pcmcia_bus_add_socket()
1353 ret = sysfs_create_bin_file(&dev->kobj, &pccard_cis_attr); in pcmcia_bus_add_socket()
1356 pcmcia_put_socket(socket); in pcmcia_bus_add_socket()
1360 INIT_LIST_HEAD(&socket->devices_list); in pcmcia_bus_add_socket()
1361 socket->pcmcia_pfc = 0; in pcmcia_bus_add_socket()
1362 socket->device_count = 0; in pcmcia_bus_add_socket()
1363 atomic_set(&socket->present, 0); in pcmcia_bus_add_socket()
1365 ret = pccard_register_pcmcia(socket, &pcmcia_bus_callback); in pcmcia_bus_add_socket()
1368 pcmcia_put_socket(socket); in pcmcia_bus_add_socket()
1377 struct pcmcia_socket *socket = dev_get_drvdata(dev); in pcmcia_bus_remove_socket() local
1379 if (!socket) in pcmcia_bus_remove_socket()
1382 pccard_register_pcmcia(socket, NULL); in pcmcia_bus_remove_socket()
1385 mutex_lock(&socket->skt_mutex); in pcmcia_bus_remove_socket()
1386 pcmcia_card_remove(socket, NULL); in pcmcia_bus_remove_socket()
1387 release_cis_mem(socket); in pcmcia_bus_remove_socket()
1388 mutex_unlock(&socket->skt_mutex); in pcmcia_bus_remove_socket()
1390 sysfs_remove_bin_file(&dev->kobj, &pccard_cis_attr); in pcmcia_bus_remove_socket()
1392 pcmcia_put_socket(socket); in pcmcia_bus_remove_socket()
1398 /* the pcmcia_bus_interface is used to handle pcmcia socket devices */