^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * ds.c -- 16-bit PCMCIA core support
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * The initial developer of the original code is David A. Hinds
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * <dahinds@users.sourceforge.net>. Portions created by David A. Hinds
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * (C) 1999 David A. Hinds
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * (C) 2003 - 2010 Dominik Brodowski
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/errno.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/list.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/delay.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/workqueue.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <linux/crc32.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <linux/firmware.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <linux/kref.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <linux/dma-mapping.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #include <pcmcia/cistpl.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #include <pcmcia/ds.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #include <pcmcia/ss.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #include "cs_internal.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) /*====================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) /* Module parameters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) MODULE_AUTHOR("David Hinds <dahinds@users.sourceforge.net>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) MODULE_DESCRIPTION("PCMCIA Driver Services");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) MODULE_LICENSE("GPL");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) /*====================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) static void pcmcia_check_driver(struct pcmcia_driver *p_drv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) const struct pcmcia_device_id *did = p_drv->id_table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) u32 hash;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) if (!p_drv->probe || !p_drv->remove)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) printk(KERN_DEBUG "pcmcia: %s lacks a requisite callback "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) "function\n", p_drv->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) while (did && did->match_flags) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) for (i = 0; i < 4; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) if (!did->prod_id[i])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) hash = crc32(0, did->prod_id[i], strlen(did->prod_id[i]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) if (hash == did->prod_id_hash[i])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) printk(KERN_DEBUG "pcmcia: %s: invalid hash for "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) "product string \"%s\": is 0x%x, should "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) "be 0x%x\n", p_drv->name, did->prod_id[i],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) did->prod_id_hash[i], hash);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) printk(KERN_DEBUG "pcmcia: see "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) "Documentation/pcmcia/devicetable.rst for "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) "details\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) did++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) /*======================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) struct pcmcia_dynid {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) struct list_head node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) struct pcmcia_device_id id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) * pcmcia_store_new_id - add a new PCMCIA device ID to this driver and re-probe devices
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) * @driver: target device driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) * @buf: buffer for scanning device ID data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) * @count: input size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) * Adds a new dynamic PCMCIA device ID to this driver,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) * and causes the driver to probe for all devices again.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) new_id_store(struct device_driver *driver, const char *buf, size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) struct pcmcia_dynid *dynid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) struct pcmcia_driver *pdrv = to_pcmcia_drv(driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) __u16 match_flags, manf_id, card_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) __u8 func_id, function, device_no;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) __u32 prod_id_hash[4] = {0, 0, 0, 0};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) int fields = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) int retval = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) fields = sscanf(buf, "%hx %hx %hx %hhx %hhx %hhx %x %x %x %x",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) &match_flags, &manf_id, &card_id, &func_id, &function, &device_no,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) &prod_id_hash[0], &prod_id_hash[1], &prod_id_hash[2], &prod_id_hash[3]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) if (fields < 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) dynid = kzalloc(sizeof(struct pcmcia_dynid), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) if (!dynid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) dynid->id.match_flags = match_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) dynid->id.manf_id = manf_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) dynid->id.card_id = card_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) dynid->id.func_id = func_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) dynid->id.function = function;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) dynid->id.device_no = device_no;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) memcpy(dynid->id.prod_id_hash, prod_id_hash, sizeof(__u32) * 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) mutex_lock(&pdrv->dynids.lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) list_add_tail(&dynid->node, &pdrv->dynids.list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) mutex_unlock(&pdrv->dynids.lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) retval = driver_attach(&pdrv->drv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) if (retval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) static DRIVER_ATTR_WO(new_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) pcmcia_free_dynids(struct pcmcia_driver *drv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) struct pcmcia_dynid *dynid, *n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) mutex_lock(&drv->dynids.lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) list_for_each_entry_safe(dynid, n, &drv->dynids.list, node) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) list_del(&dynid->node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) kfree(dynid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) mutex_unlock(&drv->dynids.lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) pcmcia_create_newid_file(struct pcmcia_driver *drv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) int error = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) if (drv->probe != NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) error = driver_create_file(&drv->drv, &driver_attr_new_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) pcmcia_remove_newid_file(struct pcmcia_driver *drv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) driver_remove_file(&drv->drv, &driver_attr_new_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) * pcmcia_register_driver - register a PCMCIA driver with the bus core
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) * @driver: the &driver being registered
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) * Registers a PCMCIA driver with the PCMCIA bus core.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) int pcmcia_register_driver(struct pcmcia_driver *driver)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) int error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) if (!driver)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) pcmcia_check_driver(driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) /* initialize common fields */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) driver->drv.bus = &pcmcia_bus_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) driver->drv.owner = driver->owner;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) driver->drv.name = driver->name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) mutex_init(&driver->dynids.lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) INIT_LIST_HEAD(&driver->dynids.list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) pr_debug("registering driver %s\n", driver->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) error = driver_register(&driver->drv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) if (error < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) error = pcmcia_create_newid_file(driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) if (error)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) driver_unregister(&driver->drv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) EXPORT_SYMBOL(pcmcia_register_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) * pcmcia_unregister_driver - unregister a PCMCIA driver with the bus core
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) * @driver: the &driver being unregistered
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) void pcmcia_unregister_driver(struct pcmcia_driver *driver)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) pr_debug("unregistering driver %s\n", driver->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) pcmcia_remove_newid_file(driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) driver_unregister(&driver->drv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) pcmcia_free_dynids(driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) EXPORT_SYMBOL(pcmcia_unregister_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) /* pcmcia_device handling */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) static struct pcmcia_device *pcmcia_get_dev(struct pcmcia_device *p_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) struct device *tmp_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) tmp_dev = get_device(&p_dev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) if (!tmp_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) return to_pcmcia_dev(tmp_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) static void pcmcia_put_dev(struct pcmcia_device *p_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) if (p_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) put_device(&p_dev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) static void pcmcia_release_function(struct kref *ref)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) struct config_t *c = container_of(ref, struct config_t, ref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) pr_debug("releasing config_t\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) kfree(c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) static void pcmcia_release_dev(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) dev_dbg(dev, "releasing device\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) pcmcia_put_socket(p_dev->socket);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) for (i = 0; i < 4; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) kfree(p_dev->prod_id[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) kfree(p_dev->devname);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) kref_put(&p_dev->function_config->ref, pcmcia_release_function);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) kfree(p_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) static int pcmcia_device_probe(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) struct pcmcia_device *p_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) struct pcmcia_driver *p_drv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) struct pcmcia_socket *s;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) cistpl_config_t cis_config;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) dev = get_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) if (!dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) p_dev = to_pcmcia_dev(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) p_drv = to_pcmcia_drv(dev->driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) s = p_dev->socket;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) dev_dbg(dev, "trying to bind to %s\n", p_drv->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) if ((!p_drv->probe) || (!p_dev->function_config) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) (!try_module_get(p_drv->owner))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) goto put_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) /* set up some more device information */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) ret = pccard_read_tuple(p_dev->socket, p_dev->func, CISTPL_CONFIG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) &cis_config);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) if (!ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) p_dev->config_base = cis_config.base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) p_dev->config_regs = cis_config.rmask[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) dev_dbg(dev, "base %x, regs %x", p_dev->config_base,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) p_dev->config_regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) dev_info(dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) "pcmcia: could not parse base and rmask0 of CIS\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) p_dev->config_base = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) p_dev->config_regs = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) ret = p_drv->probe(p_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) dev_dbg(dev, "binding to %s failed with %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) p_drv->name, ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) goto put_module;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) dev_dbg(dev, "%s bound: Vpp %d.%d, idx %x, IRQ %d", p_drv->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) p_dev->vpp/10, p_dev->vpp%10, p_dev->config_index, p_dev->irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) dev_dbg(dev, "resources: ioport %pR %pR iomem %pR %pR %pR",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) p_dev->resource[0], p_dev->resource[1], p_dev->resource[2],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) p_dev->resource[3], p_dev->resource[4]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) mutex_lock(&s->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) if ((s->pcmcia_pfc) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) (p_dev->socket->device_count == 1) && (p_dev->device_no == 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) pcmcia_parse_uevents(s, PCMCIA_UEVENT_REQUERY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) mutex_unlock(&s->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) put_module:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) module_put(p_drv->owner);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) put_dev:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) put_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) * Removes a PCMCIA card from the device tree and socket list.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) static void pcmcia_card_remove(struct pcmcia_socket *s, struct pcmcia_device *leftover)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) struct pcmcia_device *p_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) struct pcmcia_device *tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) dev_dbg(leftover ? &leftover->dev : &s->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) "pcmcia_card_remove(%d) %s\n", s->sock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) leftover ? leftover->devname : "");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) mutex_lock(&s->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) if (!leftover)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) s->device_count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) s->device_count = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) mutex_unlock(&s->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) /* unregister all pcmcia_devices registered with this socket, except leftover */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) list_for_each_entry_safe(p_dev, tmp, &s->devices_list, socket_device_list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) if (p_dev == leftover)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) mutex_lock(&s->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) list_del(&p_dev->socket_device_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) mutex_unlock(&s->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) dev_dbg(&p_dev->dev, "unregistering device\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) device_unregister(&p_dev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) static int pcmcia_device_remove(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) struct pcmcia_device *p_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) struct pcmcia_driver *p_drv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) p_dev = to_pcmcia_dev(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) p_drv = to_pcmcia_drv(dev->driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) dev_dbg(dev, "removing device\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) /* If we're removing the primary module driving a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) * pseudo multi-function card, we need to unbind
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) * all devices
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) if ((p_dev->socket->pcmcia_pfc) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) (p_dev->socket->device_count > 0) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) (p_dev->device_no == 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) pcmcia_card_remove(p_dev->socket, p_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) /* detach the "instance" */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) if (!p_drv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) if (p_drv->remove)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) p_drv->remove(p_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) /* check for proper unloading */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) if (p_dev->_irq || p_dev->_io || p_dev->_locked)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) dev_info(dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) "pcmcia: driver %s did not release config properly\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) p_drv->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) for (i = 0; i < MAX_WIN; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) if (p_dev->_win & CLIENT_WIN_REQ(i))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) dev_info(dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) "pcmcia: driver %s did not release window properly\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) p_drv->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) /* references from pcmcia_probe_device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) pcmcia_put_dev(p_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) module_put(p_drv->owner);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) * pcmcia_device_query -- determine information about a pcmcia device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) static int pcmcia_device_query(struct pcmcia_device *p_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) cistpl_manfid_t manf_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) cistpl_funcid_t func_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) cistpl_vers_1_t *vers1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) vers1 = kmalloc(sizeof(*vers1), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) if (!vers1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) if (!pccard_read_tuple(p_dev->socket, BIND_FN_ALL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) CISTPL_MANFID, &manf_id)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) mutex_lock(&p_dev->socket->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) p_dev->manf_id = manf_id.manf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) p_dev->card_id = manf_id.card;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) p_dev->has_manf_id = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) p_dev->has_card_id = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) mutex_unlock(&p_dev->socket->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) if (!pccard_read_tuple(p_dev->socket, p_dev->func,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) CISTPL_FUNCID, &func_id)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) mutex_lock(&p_dev->socket->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) p_dev->func_id = func_id.func;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) p_dev->has_func_id = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) mutex_unlock(&p_dev->socket->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) /* rule of thumb: cards with no FUNCID, but with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) * common memory device geometry information, are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) * probably memory cards (from pcmcia-cs) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) cistpl_device_geo_t *devgeo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) devgeo = kmalloc(sizeof(*devgeo), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) if (!devgeo) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) kfree(vers1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) if (!pccard_read_tuple(p_dev->socket, p_dev->func,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) CISTPL_DEVICE_GEO, devgeo)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) dev_dbg(&p_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) "mem device geometry probably means "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) "FUNCID_MEMORY\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) mutex_lock(&p_dev->socket->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) p_dev->func_id = CISTPL_FUNCID_MEMORY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) p_dev->has_func_id = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) mutex_unlock(&p_dev->socket->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) kfree(devgeo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) if (!pccard_read_tuple(p_dev->socket, BIND_FN_ALL, CISTPL_VERS_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) vers1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) mutex_lock(&p_dev->socket->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) for (i = 0; i < min_t(unsigned int, 4, vers1->ns); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) char *tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) unsigned int length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) char *new;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) tmp = vers1->str + vers1->ofs[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) length = strlen(tmp) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) if ((length < 2) || (length > 255))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) new = kstrdup(tmp, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) if (!new)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) tmp = p_dev->prod_id[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) p_dev->prod_id[i] = new;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) kfree(tmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) mutex_unlock(&p_dev->socket->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) kfree(vers1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) static struct pcmcia_device *pcmcia_device_add(struct pcmcia_socket *s,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) unsigned int function)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) struct pcmcia_device *p_dev, *tmp_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) s = pcmcia_get_socket(s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) if (!s)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) pr_debug("adding device to %d, function %d\n", s->sock, function);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) p_dev = kzalloc(sizeof(struct pcmcia_device), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) if (!p_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) goto err_put;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) mutex_lock(&s->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) p_dev->device_no = (s->device_count++);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) mutex_unlock(&s->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) /* max of 2 PFC devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) if ((p_dev->device_no >= 2) && (function == 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) goto err_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) /* max of 4 devices overall */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) if (p_dev->device_no >= 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) goto err_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) p_dev->socket = s;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) p_dev->func = function;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) p_dev->dev.bus = &pcmcia_bus_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) p_dev->dev.parent = s->dev.parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) p_dev->dev.release = pcmcia_release_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) /* by default don't allow DMA */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) p_dev->dma_mask = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) p_dev->dev.dma_mask = &p_dev->dma_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) dev_set_name(&p_dev->dev, "%d.%d", p_dev->socket->sock, p_dev->device_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) if (!dev_name(&p_dev->dev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) goto err_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) p_dev->devname = kasprintf(GFP_KERNEL, "pcmcia%s", dev_name(&p_dev->dev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) if (!p_dev->devname)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) goto err_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) dev_dbg(&p_dev->dev, "devname is %s\n", p_dev->devname);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) mutex_lock(&s->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) * p_dev->function_config must be the same for all card functions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) * Note that this is serialized by ops_mutex, so that only one
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) * such struct will be created.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) list_for_each_entry(tmp_dev, &s->devices_list, socket_device_list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) if (p_dev->func == tmp_dev->func) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) p_dev->function_config = tmp_dev->function_config;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) p_dev->irq = tmp_dev->irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) kref_get(&p_dev->function_config->ref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) /* Add to the list in pcmcia_bus_socket */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) list_add(&p_dev->socket_device_list, &s->devices_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) if (pcmcia_setup_irq(p_dev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) dev_warn(&p_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) "IRQ setup failed -- device might not work\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) if (!p_dev->function_config) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) config_t *c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) dev_dbg(&p_dev->dev, "creating config_t\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) c = kzalloc(sizeof(struct config_t), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) if (!c) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) mutex_unlock(&s->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) goto err_unreg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) p_dev->function_config = c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) kref_init(&c->ref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) for (i = 0; i < MAX_IO_WIN; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) c->io[i].name = p_dev->devname;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) c->io[i].flags = IORESOURCE_IO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) for (i = 0; i < MAX_WIN; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) c->mem[i].name = p_dev->devname;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) c->mem[i].flags = IORESOURCE_MEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) for (i = 0; i < MAX_IO_WIN; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) p_dev->resource[i] = &p_dev->function_config->io[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) for (; i < (MAX_IO_WIN + MAX_WIN); i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) p_dev->resource[i] = &p_dev->function_config->mem[i-MAX_IO_WIN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) mutex_unlock(&s->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) dev_notice(&p_dev->dev, "pcmcia: registering new device %s (IRQ: %d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) p_dev->devname, p_dev->irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) pcmcia_device_query(p_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) if (device_register(&p_dev->dev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) goto err_unreg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) return p_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) err_unreg:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) mutex_lock(&s->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) list_del(&p_dev->socket_device_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) mutex_unlock(&s->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) err_free:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) mutex_lock(&s->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) s->device_count--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) mutex_unlock(&s->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) for (i = 0; i < 4; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) kfree(p_dev->prod_id[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) kfree(p_dev->devname);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) kfree(p_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) err_put:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) pcmcia_put_socket(s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) static int pcmcia_card_add(struct pcmcia_socket *s)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) cistpl_longlink_mfc_t mfc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) unsigned int no_funcs, i, no_chains;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) int ret = -EAGAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) mutex_lock(&s->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) if (!(s->resource_setup_done)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) dev_dbg(&s->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) "no resources available, delaying card_add\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) mutex_unlock(&s->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) return -EAGAIN; /* try again, but later... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) if (pcmcia_validate_mem(s)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) dev_dbg(&s->dev, "validating mem resources failed, "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) "delaying card_add\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) mutex_unlock(&s->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) return -EAGAIN; /* try again, but later... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) mutex_unlock(&s->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) ret = pccard_validate_cis(s, &no_chains);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) if (ret || !no_chains) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) #if defined(CONFIG_MTD_PCMCIA_ANONYMOUS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) /* Set up as an anonymous card. If we don't have anonymous
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) memory support then just error the card as there is no
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) point trying to second guess.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) Note: some cards have just a device entry, it may be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) worth extending support to cover these in future */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) if (ret == -EIO) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) dev_info(&s->dev, "no CIS, assuming an anonymous memory card.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) pcmcia_replace_cis(s, "\xFF", 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) no_chains = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) dev_dbg(&s->dev, "invalid CIS or invalid resources\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) if (!pccard_read_tuple(s, BIND_FN_ALL, CISTPL_LONGLINK_MFC, &mfc))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) no_funcs = mfc.nfn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) no_funcs = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) s->functions = no_funcs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) for (i = 0; i < no_funcs; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) pcmcia_device_add(s, i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) static int pcmcia_requery_callback(struct device *dev, void *_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) if (!p_dev->dev.driver) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) dev_dbg(dev, "update device information\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) pcmcia_device_query(p_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) static void pcmcia_requery(struct pcmcia_socket *s)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) int has_pfc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) if (!(s->state & SOCKET_PRESENT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) if (s->functions == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) pcmcia_card_add(s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) /* some device information might have changed because of a CIS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) * update or because we can finally read it correctly... so
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) * determine it again, overwriting old values if necessary. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) bus_for_each_dev(&pcmcia_bus_type, NULL, NULL, pcmcia_requery_callback);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) /* if the CIS changed, we need to check whether the number of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) * functions changed. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) if (s->fake_cis) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) int old_funcs, new_funcs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) cistpl_longlink_mfc_t mfc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) /* does this cis override add or remove functions? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) old_funcs = s->functions;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) if (!pccard_read_tuple(s, BIND_FN_ALL, CISTPL_LONGLINK_MFC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) &mfc))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) new_funcs = mfc.nfn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) new_funcs = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) if (old_funcs != new_funcs) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) /* we need to re-start */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) pcmcia_card_remove(s, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) s->functions = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) pcmcia_card_add(s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) /* If the PCMCIA device consists of two pseudo devices,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) * call pcmcia_device_add() -- which will fail if both
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) * devices are already registered. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) mutex_lock(&s->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) has_pfc = s->pcmcia_pfc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) mutex_unlock(&s->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) if (has_pfc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) pcmcia_device_add(s, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) /* we re-scan all devices, not just the ones connected to this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) * socket. This does not matter, though. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) if (bus_rescan_devices(&pcmcia_bus_type))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) dev_warn(&s->dev, "rescanning the bus failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) #ifdef CONFIG_PCMCIA_LOAD_CIS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) * pcmcia_load_firmware - load CIS from userspace if device-provided is broken
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) * @dev: the pcmcia device which needs a CIS override
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) * @filename: requested filename in /lib/firmware/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) * This uses the in-kernel firmware loading mechanism to use a "fake CIS" if
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) * the one provided by the card is broken. The firmware files reside in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) * /lib/firmware/ in userspace.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) static int pcmcia_load_firmware(struct pcmcia_device *dev, char *filename)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) struct pcmcia_socket *s = dev->socket;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) const struct firmware *fw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) int ret = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) cistpl_longlink_mfc_t mfc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) int old_funcs, new_funcs = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) if (!filename)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) dev_dbg(&dev->dev, "trying to load CIS file %s\n", filename);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) if (request_firmware(&fw, filename, &dev->dev) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) if (fw->size >= CISTPL_MAX_CIS_SIZE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) dev_err(&dev->dev, "pcmcia: CIS override is too big\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) goto release;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) if (!pcmcia_replace_cis(s, fw->data, fw->size))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) dev_err(&dev->dev, "pcmcia: CIS override failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) goto release;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) /* we need to re-start if the number of functions changed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) old_funcs = s->functions;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) if (!pccard_read_tuple(s, BIND_FN_ALL, CISTPL_LONGLINK_MFC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) &mfc))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) new_funcs = mfc.nfn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) if (old_funcs != new_funcs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) ret = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) /* update information */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) pcmcia_device_query(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) /* requery (as number of functions might have changed) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) pcmcia_parse_uevents(s, PCMCIA_UEVENT_REQUERY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) release:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) release_firmware(fw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) #else /* !CONFIG_PCMCIA_LOAD_CIS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) static inline int pcmcia_load_firmware(struct pcmcia_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) char *filename)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) static inline int pcmcia_devmatch(struct pcmcia_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) const struct pcmcia_device_id *did)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) if (did->match_flags & PCMCIA_DEV_ID_MATCH_MANF_ID) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) if ((!dev->has_manf_id) || (dev->manf_id != did->manf_id))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) if (did->match_flags & PCMCIA_DEV_ID_MATCH_CARD_ID) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) if ((!dev->has_card_id) || (dev->card_id != did->card_id))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) if (did->match_flags & PCMCIA_DEV_ID_MATCH_FUNCTION) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) if (dev->func != did->function)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) if (did->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) if (!dev->prod_id[0])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) if (strcmp(did->prod_id[0], dev->prod_id[0]))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) if (did->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) if (!dev->prod_id[1])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) if (strcmp(did->prod_id[1], dev->prod_id[1]))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) if (did->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID3) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) if (!dev->prod_id[2])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) if (strcmp(did->prod_id[2], dev->prod_id[2]))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) if (did->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID4) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) if (!dev->prod_id[3])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) if (strcmp(did->prod_id[3], dev->prod_id[3]))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) if (did->match_flags & PCMCIA_DEV_ID_MATCH_DEVICE_NO) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) dev_dbg(&dev->dev, "this is a pseudo-multi-function device\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) mutex_lock(&dev->socket->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) dev->socket->pcmcia_pfc = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) mutex_unlock(&dev->socket->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) if (dev->device_no != did->device_no)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) if (did->match_flags & PCMCIA_DEV_ID_MATCH_FUNC_ID) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) if ((!dev->has_func_id) || (dev->func_id != did->func_id))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) /* if this is a pseudo-multi-function device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) * we need explicit matches */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) if (dev->socket->pcmcia_pfc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) if (dev->device_no)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) /* also, FUNC_ID matching needs to be activated by userspace
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) * after it has re-checked that there is no possible module
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) * with a prod_id/manf_id/card_id match.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) mutex_lock(&dev->socket->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) ret = dev->allow_func_id_match;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) mutex_unlock(&dev->socket->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) if (!ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) dev_dbg(&dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) "skipping FUNC_ID match until userspace ACK\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) if (did->match_flags & PCMCIA_DEV_ID_MATCH_FAKE_CIS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) dev_dbg(&dev->dev, "device needs a fake CIS\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) if (!dev->socket->fake_cis)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) if (pcmcia_load_firmware(dev, did->cisfile))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) if (did->match_flags & PCMCIA_DEV_ID_MATCH_ANONYMOUS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) for (i = 0; i < 4; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) if (dev->prod_id[i])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) if (dev->has_manf_id || dev->has_card_id || dev->has_func_id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) static int pcmcia_bus_match(struct device *dev, struct device_driver *drv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) struct pcmcia_driver *p_drv = to_pcmcia_drv(drv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) const struct pcmcia_device_id *did = p_drv->id_table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) struct pcmcia_dynid *dynid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) /* match dynamic devices first */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) mutex_lock(&p_drv->dynids.lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) list_for_each_entry(dynid, &p_drv->dynids.list, node) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) dev_dbg(dev, "trying to match to %s\n", drv->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) if (pcmcia_devmatch(p_dev, &dynid->id)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) dev_dbg(dev, "matched to %s\n", drv->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) mutex_unlock(&p_drv->dynids.lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) mutex_unlock(&p_drv->dynids.lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) while (did && did->match_flags) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) dev_dbg(dev, "trying to match to %s\n", drv->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) if (pcmcia_devmatch(p_dev, did)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) dev_dbg(dev, "matched to %s\n", drv->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) did++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) static int pcmcia_bus_uevent(struct device *dev, struct kobj_uevent_env *env)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) struct pcmcia_device *p_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) u32 hash[4] = { 0, 0, 0, 0};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) if (!dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) p_dev = to_pcmcia_dev(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) /* calculate hashes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) for (i = 0; i < 4; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) if (!p_dev->prod_id[i])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) hash[i] = crc32(0, p_dev->prod_id[i], strlen(p_dev->prod_id[i]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) if (add_uevent_var(env, "SOCKET_NO=%u", p_dev->socket->sock))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) if (add_uevent_var(env, "DEVICE_NO=%02X", p_dev->device_no))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) if (add_uevent_var(env, "MODALIAS=pcmcia:m%04Xc%04Xf%02Xfn%02Xpfn%02X"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) "pa%08Xpb%08Xpc%08Xpd%08X",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) p_dev->has_manf_id ? p_dev->manf_id : 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) p_dev->has_card_id ? p_dev->card_id : 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) p_dev->has_func_id ? p_dev->func_id : 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) p_dev->func,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) p_dev->device_no,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) hash[0],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) hash[1],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) hash[2],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) hash[3]))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) /************************ runtime PM support ***************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) static int pcmcia_dev_suspend(struct device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) static int pcmcia_dev_resume(struct device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) static int runtime_suspend(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) device_lock(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) rc = pcmcia_dev_suspend(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) device_unlock(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) static int runtime_resume(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) device_lock(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) rc = pcmcia_dev_resume(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) device_unlock(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) /************************ per-device sysfs output ***************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) #define pcmcia_device_attr(field, test, format) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) static ssize_t field##_show (struct device *dev, struct device_attribute *attr, char *buf) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) struct pcmcia_device *p_dev = to_pcmcia_dev(dev); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) return p_dev->test ? sprintf(buf, format, p_dev->field) : -ENODEV; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) static DEVICE_ATTR_RO(field);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) #define pcmcia_device_stringattr(name, field) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) static ssize_t name##_show (struct device *dev, struct device_attribute *attr, char *buf) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) struct pcmcia_device *p_dev = to_pcmcia_dev(dev); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) return p_dev->field ? sprintf(buf, "%s\n", p_dev->field) : -ENODEV; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) static DEVICE_ATTR_RO(name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) pcmcia_device_attr(func_id, has_func_id, "0x%02x\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) pcmcia_device_attr(manf_id, has_manf_id, "0x%04x\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) pcmcia_device_attr(card_id, has_card_id, "0x%04x\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) pcmcia_device_stringattr(prod_id1, prod_id[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) pcmcia_device_stringattr(prod_id2, prod_id[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) pcmcia_device_stringattr(prod_id3, prod_id[2]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) pcmcia_device_stringattr(prod_id4, prod_id[3]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) static ssize_t function_show(struct device *dev, struct device_attribute *attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) return p_dev->socket ? sprintf(buf, "0x%02x\n", p_dev->func) : -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) static DEVICE_ATTR_RO(function);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) static ssize_t resources_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) struct device_attribute *attr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) char *str = buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) for (i = 0; i < PCMCIA_NUM_RESOURCES; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) str += sprintf(str, "%pr\n", p_dev->resource[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) return str - buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) static DEVICE_ATTR_RO(resources);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) static ssize_t pm_state_show(struct device *dev, struct device_attribute *attr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) if (p_dev->suspended)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) return sprintf(buf, "off\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) return sprintf(buf, "on\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) static ssize_t pm_state_store(struct device *dev, struct device_attribute *attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) const char *buf, size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) if (!count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) if ((!p_dev->suspended) && !strncmp(buf, "off", 3))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) ret = runtime_suspend(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) else if (p_dev->suspended && !strncmp(buf, "on", 2))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) ret = runtime_resume(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) return ret ? ret : count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) static DEVICE_ATTR_RW(pm_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) u32 hash[4] = { 0, 0, 0, 0};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) /* calculate hashes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) for (i = 0; i < 4; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) if (!p_dev->prod_id[i])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) hash[i] = crc32(0, p_dev->prod_id[i],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) strlen(p_dev->prod_id[i]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) return sprintf(buf, "pcmcia:m%04Xc%04Xf%02Xfn%02Xpfn%02X"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) "pa%08Xpb%08Xpc%08Xpd%08X\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) p_dev->has_manf_id ? p_dev->manf_id : 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) p_dev->has_card_id ? p_dev->card_id : 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) p_dev->has_func_id ? p_dev->func_id : 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) p_dev->func, p_dev->device_no,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) hash[0], hash[1], hash[2], hash[3]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) static DEVICE_ATTR_RO(modalias);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) static ssize_t allow_func_id_match_store(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) struct device_attribute *attr, const char *buf, size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) if (!count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) mutex_lock(&p_dev->socket->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) p_dev->allow_func_id_match = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) mutex_unlock(&p_dev->socket->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) pcmcia_parse_uevents(p_dev->socket, PCMCIA_UEVENT_REQUERY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) static DEVICE_ATTR_WO(allow_func_id_match);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) static struct attribute *pcmcia_dev_attrs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) &dev_attr_resources.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) &dev_attr_pm_state.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) &dev_attr_function.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) &dev_attr_func_id.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) &dev_attr_manf_id.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) &dev_attr_card_id.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) &dev_attr_prod_id1.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) &dev_attr_prod_id2.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) &dev_attr_prod_id3.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) &dev_attr_prod_id4.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) &dev_attr_modalias.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) &dev_attr_allow_func_id_match.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) ATTRIBUTE_GROUPS(pcmcia_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) /* PM support, also needed for reset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) static int pcmcia_dev_suspend(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) struct pcmcia_driver *p_drv = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) mutex_lock(&p_dev->socket->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) if (p_dev->suspended) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) mutex_unlock(&p_dev->socket->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) p_dev->suspended = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) mutex_unlock(&p_dev->socket->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) dev_dbg(dev, "suspending\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) if (dev->driver)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) p_drv = to_pcmcia_drv(dev->driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) if (!p_drv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) if (p_drv->suspend) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) ret = p_drv->suspend(p_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) dev_err(dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) "pcmcia: device %s (driver %s) did not want to go to sleep (%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) p_dev->devname, p_drv->name, ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) mutex_lock(&p_dev->socket->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) p_dev->suspended = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) mutex_unlock(&p_dev->socket->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) if (p_dev->device_no == p_dev->func) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) dev_dbg(dev, "releasing configuration\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) pcmcia_release_configuration(p_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) static int pcmcia_dev_resume(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) struct pcmcia_driver *p_drv = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) mutex_lock(&p_dev->socket->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) if (!p_dev->suspended) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) mutex_unlock(&p_dev->socket->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) p_dev->suspended = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) mutex_unlock(&p_dev->socket->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) dev_dbg(dev, "resuming\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) if (dev->driver)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) p_drv = to_pcmcia_drv(dev->driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) if (!p_drv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) if (p_dev->device_no == p_dev->func) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) dev_dbg(dev, "requesting configuration\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) ret = pcmcia_enable_device(p_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) if (p_drv->resume)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) ret = p_drv->resume(p_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) static int pcmcia_bus_suspend_callback(struct device *dev, void *_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) struct pcmcia_socket *skt = _data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) if (p_dev->socket != skt || p_dev->suspended)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) return runtime_suspend(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) static int pcmcia_bus_resume_callback(struct device *dev, void *_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) struct pcmcia_socket *skt = _data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) if (p_dev->socket != skt || !p_dev->suspended)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) runtime_resume(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) static int pcmcia_bus_resume(struct pcmcia_socket *skt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) dev_dbg(&skt->dev, "resuming socket %d\n", skt->sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) bus_for_each_dev(&pcmcia_bus_type, NULL, skt, pcmcia_bus_resume_callback);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) static int pcmcia_bus_suspend(struct pcmcia_socket *skt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) dev_dbg(&skt->dev, "suspending socket %d\n", skt->sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) if (bus_for_each_dev(&pcmcia_bus_type, NULL, skt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) pcmcia_bus_suspend_callback)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) pcmcia_bus_resume(skt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) static int pcmcia_bus_remove(struct pcmcia_socket *skt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) atomic_set(&skt->present, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) pcmcia_card_remove(skt, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) mutex_lock(&skt->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) destroy_cis_cache(skt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) pcmcia_cleanup_irq(skt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) mutex_unlock(&skt->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) static int pcmcia_bus_add(struct pcmcia_socket *skt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) atomic_set(&skt->present, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) mutex_lock(&skt->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) skt->pcmcia_pfc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) destroy_cis_cache(skt); /* to be on the safe side... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) mutex_unlock(&skt->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) pcmcia_card_add(skt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) static int pcmcia_bus_early_resume(struct pcmcia_socket *skt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) if (!verify_cis_cache(skt))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) dev_dbg(&skt->dev, "cis mismatch - different card\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) /* first, remove the card */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) pcmcia_bus_remove(skt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) mutex_lock(&skt->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) destroy_cis_cache(skt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) kfree(skt->fake_cis);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) skt->fake_cis = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) skt->functions = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) mutex_unlock(&skt->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) /* now, add the new card */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) pcmcia_bus_add(skt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) * NOTE: This is racy. There's no guarantee the card will still be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) * physically present, even if the call to this function returns
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) * non-NULL. Furthermore, the device driver most likely is unbound
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) * almost immediately, so the timeframe where pcmcia_dev_present
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) * returns NULL is probably really really small.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) struct pcmcia_device *pcmcia_dev_present(struct pcmcia_device *_p_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) struct pcmcia_device *p_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) struct pcmcia_device *ret = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) p_dev = pcmcia_get_dev(_p_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) if (!p_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) if (atomic_read(&p_dev->socket->present) != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) ret = p_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) pcmcia_put_dev(p_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) EXPORT_SYMBOL(pcmcia_dev_present);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) static struct pcmcia_callback pcmcia_bus_callback = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) .add = pcmcia_bus_add,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) .remove = pcmcia_bus_remove,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) .requery = pcmcia_requery,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) .validate = pccard_validate_cis,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) .suspend = pcmcia_bus_suspend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) .early_resume = pcmcia_bus_early_resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) .resume = pcmcia_bus_resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) static int pcmcia_bus_add_socket(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) struct class_interface *class_intf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) struct pcmcia_socket *socket = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) socket = pcmcia_get_socket(socket);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) if (!socket) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) dev_err(dev, "PCMCIA obtaining reference to socket failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) ret = sysfs_create_bin_file(&dev->kobj, &pccard_cis_attr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) dev_err(dev, "PCMCIA registration failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) pcmcia_put_socket(socket);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) INIT_LIST_HEAD(&socket->devices_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) socket->pcmcia_pfc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) socket->device_count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) atomic_set(&socket->present, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) ret = pccard_register_pcmcia(socket, &pcmcia_bus_callback);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) dev_err(dev, "PCMCIA registration failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) pcmcia_put_socket(socket);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) static void pcmcia_bus_remove_socket(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) struct class_interface *class_intf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) struct pcmcia_socket *socket = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) if (!socket)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) pccard_register_pcmcia(socket, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) /* unregister any unbound devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) mutex_lock(&socket->skt_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) pcmcia_card_remove(socket, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) release_cis_mem(socket);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) mutex_unlock(&socket->skt_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) sysfs_remove_bin_file(&dev->kobj, &pccard_cis_attr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) pcmcia_put_socket(socket);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) /* the pcmcia_bus_interface is used to handle pcmcia socket devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) static struct class_interface pcmcia_bus_interface __refdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) .class = &pcmcia_socket_class,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) .add_dev = &pcmcia_bus_add_socket,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) .remove_dev = &pcmcia_bus_remove_socket,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) static const struct dev_pm_ops pcmcia_bus_pm_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) SET_SYSTEM_SLEEP_PM_OPS(pcmcia_dev_suspend, pcmcia_dev_resume)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) struct bus_type pcmcia_bus_type = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) .name = "pcmcia",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) .uevent = pcmcia_bus_uevent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) .match = pcmcia_bus_match,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) .dev_groups = pcmcia_dev_groups,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) .probe = pcmcia_device_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) .remove = pcmcia_device_remove,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) .pm = &pcmcia_bus_pm_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) static int __init init_pcmcia_bus(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) ret = bus_register(&pcmcia_bus_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) printk(KERN_WARNING "pcmcia: bus_register error: %d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) ret = class_interface_register(&pcmcia_bus_interface);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) printk(KERN_WARNING
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) "pcmcia: class_interface_register error: %d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) bus_unregister(&pcmcia_bus_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) fs_initcall(init_pcmcia_bus); /* one level after subsys_initcall so that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) * pcmcia_socket_class is already registered */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) static void __exit exit_pcmcia_bus(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) class_interface_unregister(&pcmcia_bus_interface);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) bus_unregister(&pcmcia_bus_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) module_exit(exit_pcmcia_bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) MODULE_ALIAS("ds");