ds.c 34.1 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12
/*
 * ds.c -- 16-bit PCMCIA core support
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 * The initial developer of the original code is David A. Hinds
 * <dahinds@users.sourceforge.net>.  Portions created by David A. Hinds
 * are Copyright (C) 1999 David A. Hinds.  All Rights Reserved.
 *
 * (C) 1999		David A. Hinds
13
 * (C) 2003 - 2010	Dominik Brodowski
L
Linus Torvalds 已提交
14 15
 */

16
#include <linux/kernel.h>
L
Linus Torvalds 已提交
17 18 19 20 21 22
#include <linux/module.h>
#include <linux/init.h>
#include <linux/errno.h>
#include <linux/list.h>
#include <linux/delay.h>
#include <linux/workqueue.h>
23
#include <linux/crc32.h>
24
#include <linux/firmware.h>
25
#include <linux/kref.h>
26
#include <linux/dma-mapping.h>
27
#include <linux/slab.h>
L
Linus Torvalds 已提交
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46

#include <pcmcia/cs.h>
#include <pcmcia/cistpl.h>
#include <pcmcia/ds.h>
#include <pcmcia/ss.h>

#include "cs_internal.h"

/*====================================================================*/

/* Module parameters */

MODULE_AUTHOR("David Hinds <dahinds@users.sourceforge.net>");
MODULE_DESCRIPTION("PCMCIA Driver Services");
MODULE_LICENSE("GPL");


/*====================================================================*/

47 48 49 50 51 52
static void pcmcia_check_driver(struct pcmcia_driver *p_drv)
{
	struct pcmcia_device_id *did = p_drv->id_table;
	unsigned int i;
	u32 hash;

53
	if (!p_drv->probe || !p_drv->remove)
P
Pavel Roskin 已提交
54 55
		printk(KERN_DEBUG "pcmcia: %s lacks a requisite callback "
		       "function\n", p_drv->drv.name);
56

57
	while (did && did->match_flags) {
D
Dominik Brodowski 已提交
58
		for (i = 0; i < 4; i++) {
59 60 61 62 63 64 65 66 67 68 69
			if (!did->prod_id[i])
				continue;

			hash = crc32(0, did->prod_id[i], strlen(did->prod_id[i]));
			if (hash == did->prod_id_hash[i])
				continue;

			printk(KERN_DEBUG "pcmcia: %s: invalid hash for "
			       "product string \"%s\": is 0x%x, should "
			       "be 0x%x\n", p_drv->drv.name, did->prod_id[i],
			       did->prod_id_hash[i], hash);
70 71 72
			printk(KERN_DEBUG "pcmcia: see "
				"Documentation/pcmcia/devicetable.txt for "
				"details\n");
73 74 75 76 77 78 79
		}
		did++;
	}

	return;
}

80

L
Linus Torvalds 已提交
81 82 83
/*======================================================================*/


B
Bernhard Walle 已提交
84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
struct pcmcia_dynid {
	struct list_head 		node;
	struct pcmcia_device_id 	id;
};

/**
 * pcmcia_store_new_id - add a new PCMCIA device ID to this driver and re-probe devices
 * @driver: target device driver
 * @buf: buffer for scanning device ID data
 * @count: input size
 *
 * Adds a new dynamic PCMCIA device ID to this driver,
 * and causes the driver to probe for all devices again.
 */
static ssize_t
pcmcia_store_new_id(struct device_driver *driver, const char *buf, size_t count)
{
	struct pcmcia_dynid *dynid;
	struct pcmcia_driver *pdrv = to_pcmcia_drv(driver);
	__u16 match_flags, manf_id, card_id;
	__u8 func_id, function, device_no;
	__u32 prod_id_hash[4] = {0, 0, 0, 0};
D
Dominik Brodowski 已提交
106
	int fields = 0;
B
Bernhard Walle 已提交
107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
	int retval = 0;

	fields = sscanf(buf, "%hx %hx %hx %hhx %hhx %hhx %x %x %x %x",
			&match_flags, &manf_id, &card_id, &func_id, &function, &device_no,
			&prod_id_hash[0], &prod_id_hash[1], &prod_id_hash[2], &prod_id_hash[3]);
	if (fields < 6)
		return -EINVAL;

	dynid = kzalloc(sizeof(struct pcmcia_dynid), GFP_KERNEL);
	if (!dynid)
		return -ENOMEM;

	dynid->id.match_flags = match_flags;
	dynid->id.manf_id = manf_id;
	dynid->id.card_id = card_id;
	dynid->id.func_id = func_id;
	dynid->id.function = function;
	dynid->id.device_no = device_no;
	memcpy(dynid->id.prod_id_hash, prod_id_hash, sizeof(__u32) * 4);

127
	mutex_lock(&pdrv->dynids.lock);
128
	list_add_tail(&dynid->node, &pdrv->dynids.list);
129
	mutex_unlock(&pdrv->dynids.lock);
B
Bernhard Walle 已提交
130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146

	if (get_driver(&pdrv->drv)) {
		retval = driver_attach(&pdrv->drv);
		put_driver(&pdrv->drv);
	}

	if (retval)
		return retval;
	return count;
}
static DRIVER_ATTR(new_id, S_IWUSR, NULL, pcmcia_store_new_id);

static void
pcmcia_free_dynids(struct pcmcia_driver *drv)
{
	struct pcmcia_dynid *dynid, *n;

147
	mutex_lock(&drv->dynids.lock);
B
Bernhard Walle 已提交
148 149 150 151
	list_for_each_entry_safe(dynid, n, &drv->dynids.list, node) {
		list_del(&dynid->node);
		kfree(dynid);
	}
152
	mutex_unlock(&drv->dynids.lock);
B
Bernhard Walle 已提交
153 154 155 156 157 158 159
}

static int
pcmcia_create_newid_file(struct pcmcia_driver *drv)
{
	int error = 0;
	if (drv->probe != NULL)
160
		error = driver_create_file(&drv->drv, &driver_attr_new_id);
B
Bernhard Walle 已提交
161 162 163 164
	return error;
}


L
Linus Torvalds 已提交
165 166
/**
 * pcmcia_register_driver - register a PCMCIA driver with the bus core
R
Randy Dunlap 已提交
167
 * @driver: the &driver being registered
L
Linus Torvalds 已提交
168 169 170 171 172
 *
 * Registers a PCMCIA driver with the PCMCIA bus core.
 */
int pcmcia_register_driver(struct pcmcia_driver *driver)
{
B
Bernhard Walle 已提交
173 174
	int error;

L
Linus Torvalds 已提交
175 176 177
	if (!driver)
		return -EINVAL;

178 179
	pcmcia_check_driver(driver);

L
Linus Torvalds 已提交
180 181 182
	/* initialize common fields */
	driver->drv.bus = &pcmcia_bus_type;
	driver->drv.owner = driver->owner;
183
	mutex_init(&driver->dynids.lock);
B
Bernhard Walle 已提交
184
	INIT_LIST_HEAD(&driver->dynids.list);
L
Linus Torvalds 已提交
185

186
	pr_debug("registering driver %s\n", driver->drv.name);
187

B
Bernhard Walle 已提交
188 189 190 191 192 193 194 195 196
	error = driver_register(&driver->drv);
	if (error < 0)
		return error;

	error = pcmcia_create_newid_file(driver);
	if (error)
		driver_unregister(&driver->drv);

	return error;
L
Linus Torvalds 已提交
197 198 199 200 201
}
EXPORT_SYMBOL(pcmcia_register_driver);

/**
 * pcmcia_unregister_driver - unregister a PCMCIA driver with the bus core
R
Randy Dunlap 已提交
202
 * @driver: the &driver being unregistered
L
Linus Torvalds 已提交
203 204 205
 */
void pcmcia_unregister_driver(struct pcmcia_driver *driver)
{
206
	pr_debug("unregistering driver %s\n", driver->drv.name);
L
Linus Torvalds 已提交
207
	driver_unregister(&driver->drv);
B
Bernhard Walle 已提交
208
	pcmcia_free_dynids(driver);
L
Linus Torvalds 已提交
209 210 211 212 213 214
}
EXPORT_SYMBOL(pcmcia_unregister_driver);


/* pcmcia_device handling */

215
static struct pcmcia_device *pcmcia_get_dev(struct pcmcia_device *p_dev)
L
Linus Torvalds 已提交
216 217 218 219 220 221 222 223
{
	struct device *tmp_dev;
	tmp_dev = get_device(&p_dev->dev);
	if (!tmp_dev)
		return NULL;
	return to_pcmcia_dev(tmp_dev);
}

224
static void pcmcia_put_dev(struct pcmcia_device *p_dev)
L
Linus Torvalds 已提交
225 226 227 228 229
{
	if (p_dev)
		put_device(&p_dev->dev);
}

230 231 232
static void pcmcia_release_function(struct kref *ref)
{
	struct config_t *c = container_of(ref, struct config_t, ref);
233
	pr_debug("releasing config_t\n");
234 235 236
	kfree(c);
}

L
Linus Torvalds 已提交
237 238 239
static void pcmcia_release_dev(struct device *dev)
{
	struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
240
	int i;
241
	dev_dbg(dev, "releasing device\n");
242
	pcmcia_put_socket(p_dev->socket);
243 244
	for (i = 0; i < 4; i++)
		kfree(p_dev->prod_id[i]);
245
	kfree(p_dev->devname);
246
	kref_put(&p_dev->function_config->ref, pcmcia_release_function);
L
Linus Torvalds 已提交
247 248 249 250
	kfree(p_dev);
}


D
Dominik Brodowski 已提交
251
static int pcmcia_device_probe(struct device *dev)
L
Linus Torvalds 已提交
252 253 254
{
	struct pcmcia_device *p_dev;
	struct pcmcia_driver *p_drv;
255
	struct pcmcia_socket *s;
256
	cistpl_config_t cis_config;
L
Linus Torvalds 已提交
257 258 259 260 261 262 263 264
	int ret = 0;

	dev = get_device(dev);
	if (!dev)
		return -ENODEV;

	p_dev = to_pcmcia_dev(dev);
	p_drv = to_pcmcia_drv(dev->driver);
265
	s = p_dev->socket;
L
Linus Torvalds 已提交
266

267
	dev_dbg(dev, "trying to bind to %s\n", p_drv->drv.name);
268

269 270
	if ((!p_drv->probe) || (!p_dev->function_config) ||
	    (!try_module_get(p_drv->owner))) {
L
Linus Torvalds 已提交
271 272 273 274
		ret = -EINVAL;
		goto put_dev;
	}

275 276 277 278
	/* set up some more device information */
	ret = pccard_read_tuple(p_dev->socket, p_dev->func, CISTPL_CONFIG,
				&cis_config);
	if (!ret) {
279 280
		p_dev->config_base = cis_config.base;
		p_dev->config_regs = cis_config.rmask[0];
281
	} else {
282 283
		dev_printk(KERN_INFO, dev,
			   "pcmcia: could not parse base and rmask0 of CIS\n");
284 285
		p_dev->config_base = 0;
		p_dev->config_regs = 0;
286 287
	}

288
	ret = p_drv->probe(p_dev);
289
	if (ret) {
290
		dev_dbg(dev, "binding to %s failed with %d\n",
291
			   p_drv->drv.name, ret);
292
		goto put_module;
293
	}
294

D
Dominik Brodowski 已提交
295
	mutex_lock(&s->ops_mutex);
296
	if ((s->pcmcia_pfc) &&
297
	    (p_dev->socket->device_count == 1) && (p_dev->device_no == 0))
298
		pcmcia_parse_uevents(s, PCMCIA_UEVENT_REQUERY);
D
Dominik Brodowski 已提交
299
	mutex_unlock(&s->ops_mutex);
300

301
put_module:
L
Linus Torvalds 已提交
302 303
	if (ret)
		module_put(p_drv->owner);
304
put_dev:
305
	if (ret)
L
Linus Torvalds 已提交
306
		put_device(dev);
D
Dominik Brodowski 已提交
307
	return ret;
L
Linus Torvalds 已提交
308 309 310
}


311 312 313 314 315 316 317 318
/*
 * Removes a PCMCIA card from the device tree and socket list.
 */
static void pcmcia_card_remove(struct pcmcia_socket *s, struct pcmcia_device *leftover)
{
	struct pcmcia_device	*p_dev;
	struct pcmcia_device	*tmp;

319
	dev_dbg(leftover ? &leftover->dev : &s->dev,
320 321
		   "pcmcia_card_remove(%d) %s\n", s->sock,
		   leftover ? leftover->devname : "");
322

D
Dominik Brodowski 已提交
323
	mutex_lock(&s->ops_mutex);
324 325 326 327
	if (!leftover)
		s->device_count = 0;
	else
		s->device_count = 1;
D
Dominik Brodowski 已提交
328
	mutex_unlock(&s->ops_mutex);
329 330 331 332 333 334

	/* unregister all pcmcia_devices registered with this socket, except leftover */
	list_for_each_entry_safe(p_dev, tmp, &s->devices_list, socket_device_list) {
		if (p_dev == leftover)
			continue;

D
Dominik Brodowski 已提交
335
		mutex_lock(&s->ops_mutex);
336
		list_del(&p_dev->socket_device_list);
D
Dominik Brodowski 已提交
337
		mutex_unlock(&s->ops_mutex);
338

339
		dev_dbg(&p_dev->dev, "unregistering device\n");
340 341 342 343 344 345
		device_unregister(&p_dev->dev);
	}

	return;
}

D
Dominik Brodowski 已提交
346
static int pcmcia_device_remove(struct device *dev)
L
Linus Torvalds 已提交
347 348 349
{
	struct pcmcia_device *p_dev;
	struct pcmcia_driver *p_drv;
350
	int i;
L
Linus Torvalds 已提交
351 352 353

	p_dev = to_pcmcia_dev(dev);
	p_drv = to_pcmcia_drv(dev->driver);
354

355
	dev_dbg(dev, "removing device\n");
356

357 358 359 360
	/* If we're removing the primary module driving a
	 * pseudo multi-function card, we need to unbind
	 * all devices
	 */
361
	if ((p_dev->socket->pcmcia_pfc) &&
362
	    (p_dev->socket->device_count > 0) &&
363 364 365 366
	    (p_dev->device_no == 0))
		pcmcia_card_remove(p_dev->socket, p_dev);

	/* detach the "instance" */
367 368
	if (!p_drv)
		return 0;
L
Linus Torvalds 已提交
369

370
	if (p_drv->remove)
D
Dominik Brodowski 已提交
371
		p_drv->remove(p_dev);
372

373
	/* check for proper unloading */
374
	if (p_dev->_irq || p_dev->_io || p_dev->_locked)
375 376 377
		dev_printk(KERN_INFO, dev,
			"pcmcia: driver %s did not release config properly\n",
			p_drv->drv.name);
378

379
	for (i = 0; i < MAX_WIN; i++)
380
		if (p_dev->_win & CLIENT_WIN_REQ(i))
381 382 383
			dev_printk(KERN_INFO, dev,
			  "pcmcia: driver %s did not release window properly\n",
			   p_drv->drv.name);
384

385 386 387
	/* references from pcmcia_probe_device */
	pcmcia_put_dev(p_dev);
	module_put(p_drv->owner);
L
Linus Torvalds 已提交
388 389 390 391 392 393 394 395 396 397 398 399

	return 0;
}


/*
 * pcmcia_device_query -- determine information about a pcmcia device
 */
static int pcmcia_device_query(struct pcmcia_device *p_dev)
{
	cistpl_manfid_t manf_id;
	cistpl_funcid_t func_id;
400
	cistpl_vers_1_t	*vers1;
L
Linus Torvalds 已提交
401 402
	unsigned int i;

403 404 405 406
	vers1 = kmalloc(sizeof(*vers1), GFP_KERNEL);
	if (!vers1)
		return -ENOMEM;

407
	if (!pccard_read_tuple(p_dev->socket, BIND_FN_ALL,
L
Linus Torvalds 已提交
408
			       CISTPL_MANFID, &manf_id)) {
409
		mutex_lock(&p_dev->socket->ops_mutex);
L
Linus Torvalds 已提交
410 411 412 413
		p_dev->manf_id = manf_id.manf;
		p_dev->card_id = manf_id.card;
		p_dev->has_manf_id = 1;
		p_dev->has_card_id = 1;
414
		mutex_unlock(&p_dev->socket->ops_mutex);
L
Linus Torvalds 已提交
415 416 417 418
	}

	if (!pccard_read_tuple(p_dev->socket, p_dev->func,
			       CISTPL_FUNCID, &func_id)) {
419
		mutex_lock(&p_dev->socket->ops_mutex);
L
Linus Torvalds 已提交
420 421
		p_dev->func_id = func_id.func;
		p_dev->has_func_id = 1;
422
		mutex_unlock(&p_dev->socket->ops_mutex);
L
Linus Torvalds 已提交
423 424 425 426
	} else {
		/* rule of thumb: cards with no FUNCID, but with
		 * common memory device geometry information, are
		 * probably memory cards (from pcmcia-cs) */
427 428 429 430 431 432 433
		cistpl_device_geo_t *devgeo;

		devgeo = kmalloc(sizeof(*devgeo), GFP_KERNEL);
		if (!devgeo) {
			kfree(vers1);
			return -ENOMEM;
		}
L
Linus Torvalds 已提交
434
		if (!pccard_read_tuple(p_dev->socket, p_dev->func,
435
				      CISTPL_DEVICE_GEO, devgeo)) {
436
			dev_dbg(&p_dev->dev,
437 438
				   "mem device geometry probably means "
				   "FUNCID_MEMORY\n");
439
			mutex_lock(&p_dev->socket->ops_mutex);
L
Linus Torvalds 已提交
440 441
			p_dev->func_id = CISTPL_FUNCID_MEMORY;
			p_dev->has_func_id = 1;
442
			mutex_unlock(&p_dev->socket->ops_mutex);
L
Linus Torvalds 已提交
443
		}
444
		kfree(devgeo);
L
Linus Torvalds 已提交
445 446
	}

447
	if (!pccard_read_tuple(p_dev->socket, BIND_FN_ALL, CISTPL_VERS_1,
448
			       vers1)) {
449
		mutex_lock(&p_dev->socket->ops_mutex);
450
		for (i = 0; i < min_t(unsigned int, 4, vers1->ns); i++) {
L
Linus Torvalds 已提交
451 452
			char *tmp;
			unsigned int length;
453
			char *new;
L
Linus Torvalds 已提交
454

455
			tmp = vers1->str + vers1->ofs[i];
L
Linus Torvalds 已提交
456 457

			length = strlen(tmp) + 1;
458
			if ((length < 2) || (length > 255))
L
Linus Torvalds 已提交
459 460
				continue;

461 462
			new = kmalloc(sizeof(char) * length, GFP_KERNEL);
			if (!new)
L
Linus Torvalds 已提交
463 464
				continue;

465 466 467 468 469
			new = strncpy(new, tmp, length);

			tmp = p_dev->prod_id[i];
			p_dev->prod_id[i] = new;
			kfree(tmp);
L
Linus Torvalds 已提交
470
		}
471
		mutex_unlock(&p_dev->socket->ops_mutex);
L
Linus Torvalds 已提交
472 473
	}

474
	kfree(vers1);
L
Linus Torvalds 已提交
475 476 477 478
	return 0;
}


479 480
static struct pcmcia_device *pcmcia_device_add(struct pcmcia_socket *s,
					       unsigned int function)
L
Linus Torvalds 已提交
481
{
482
	struct pcmcia_device *p_dev, *tmp_dev;
483
	int i;
L
Linus Torvalds 已提交
484

485
	s = pcmcia_get_socket(s);
L
Linus Torvalds 已提交
486 487 488
	if (!s)
		return NULL;

489
	pr_debug("adding device to %d, function %d\n", s->sock, function);
490

491
	p_dev = kzalloc(sizeof(struct pcmcia_device), GFP_KERNEL);
L
Linus Torvalds 已提交
492 493 494
	if (!p_dev)
		goto err_put;

D
Dominik Brodowski 已提交
495
	mutex_lock(&s->ops_mutex);
L
Linus Torvalds 已提交
496
	p_dev->device_no = (s->device_count++);
D
Dominik Brodowski 已提交
497
	mutex_unlock(&s->ops_mutex);
498

499 500 501 502 503 504
	/* max of 2 PFC devices */
	if ((p_dev->device_no >= 2) && (function == 0))
		goto err_free;

	/* max of 4 devices overall */
	if (p_dev->device_no >= 4)
505 506 507
		goto err_free;

	p_dev->socket = s;
L
Linus Torvalds 已提交
508 509 510
	p_dev->func   = function;

	p_dev->dev.bus = &pcmcia_bus_type;
511
	p_dev->dev.parent = s->dev.parent;
L
Linus Torvalds 已提交
512
	p_dev->dev.release = pcmcia_release_dev;
513 514 515
	/* by default don't allow DMA */
	p_dev->dma_mask = DMA_MASK_NONE;
	p_dev->dev.dma_mask = &p_dev->dma_mask;
516 517 518 519
	dev_set_name(&p_dev->dev, "%d.%d", p_dev->socket->sock, p_dev->device_no);
	if (!dev_name(&p_dev->dev))
		goto err_free;
	p_dev->devname = kasprintf(GFP_KERNEL, "pcmcia%s", dev_name(&p_dev->dev));
520 521
	if (!p_dev->devname)
		goto err_free;
522
	dev_dbg(&p_dev->dev, "devname is %s\n", p_dev->devname);
L
Linus Torvalds 已提交
523

D
Dominik Brodowski 已提交
524
	mutex_lock(&s->ops_mutex);
525 526 527

	/*
	 * p_dev->function_config must be the same for all card functions.
528 529
	 * Note that this is serialized by ops_mutex, so that only one
	 * such struct will be created.
530
	 */
D
Dominik Brodowski 已提交
531 532
	list_for_each_entry(tmp_dev, &s->devices_list, socket_device_list)
		if (p_dev->func == tmp_dev->func) {
533
			p_dev->function_config = tmp_dev->function_config;
534
			p_dev->irq = tmp_dev->irq;
535 536 537 538
			kref_get(&p_dev->function_config->ref);
		}

	/* Add to the list in pcmcia_bus_socket */
539
	list_add(&p_dev->socket_device_list, &s->devices_list);
540

541 542 543
	if (pcmcia_setup_irq(p_dev))
		dev_warn(&p_dev->dev,
			"IRQ setup failed -- device might not work\n");
L
Linus Torvalds 已提交
544

545
	if (!p_dev->function_config) {
546
		config_t *c;
547
		dev_dbg(&p_dev->dev, "creating config_t\n");
548 549
		c = kzalloc(sizeof(struct config_t), GFP_KERNEL);
		if (!c) {
550
			mutex_unlock(&s->ops_mutex);
551
			goto err_unreg;
552
		}
553 554 555
		p_dev->function_config = c;
		kref_init(&c->ref);
		for (i = 0; i < MAX_IO_WIN; i++) {
556
			c->io[i].name = p_dev->devname;
557 558
			c->io[i].flags = IORESOURCE_IO;
		}
559
		for (i = 0; i< MAX_WIN; i++) {
560
			c->mem[i].name = p_dev->devname;
561 562
			c->mem[i].flags = IORESOURCE_MEM;
		}
563
	}
564 565
	for (i = 0; i < MAX_IO_WIN; i++)
		p_dev->resource[i] = &p_dev->function_config->io[i];
566 567
	for (; i < (MAX_IO_WIN + MAX_WIN); i++)
		p_dev->resource[i] = &p_dev->function_config->mem[i-MAX_IO_WIN];
568

569
	mutex_unlock(&s->ops_mutex);
570

571
	dev_printk(KERN_NOTICE, &p_dev->dev,
572
		   "pcmcia: registering new device %s (IRQ: %d)\n",
573
		   p_dev->devname, p_dev->irq);
574

575 576
	pcmcia_device_query(p_dev);

577 578
	if (device_register(&p_dev->dev))
		goto err_unreg;
L
Linus Torvalds 已提交
579 580 581

	return p_dev;

582
 err_unreg:
D
Dominik Brodowski 已提交
583
	mutex_lock(&s->ops_mutex);
584
	list_del(&p_dev->socket_device_list);
D
Dominik Brodowski 已提交
585
	mutex_unlock(&s->ops_mutex);
586

L
Linus Torvalds 已提交
587
 err_free:
D
Dominik Brodowski 已提交
588
	mutex_lock(&s->ops_mutex);
589
	s->device_count--;
D
Dominik Brodowski 已提交
590
	mutex_unlock(&s->ops_mutex);
591

592 593
	for (i = 0; i < 4; i++)
		kfree(p_dev->prod_id[i]);
594
	kfree(p_dev->devname);
L
Linus Torvalds 已提交
595 596
	kfree(p_dev);
 err_put:
597
	pcmcia_put_socket(s);
L
Linus Torvalds 已提交
598 599 600 601 602 603 604 605

	return NULL;
}


static int pcmcia_card_add(struct pcmcia_socket *s)
{
	cistpl_longlink_mfc_t mfc;
606
	unsigned int no_funcs, i, no_chains;
607
	int ret = -EAGAIN;
L
Linus Torvalds 已提交
608

609
	mutex_lock(&s->ops_mutex);
610
	if (!(s->resource_setup_done)) {
611
		dev_dbg(&s->dev,
612
			   "no resources available, delaying card_add\n");
613
		mutex_unlock(&s->ops_mutex);
L
Linus Torvalds 已提交
614
		return -EAGAIN; /* try again, but later... */
615
	}
L
Linus Torvalds 已提交
616

617
	if (pcmcia_validate_mem(s)) {
618
		dev_dbg(&s->dev, "validating mem resources failed, "
619
		       "delaying card_add\n");
620
		mutex_unlock(&s->ops_mutex);
621
		return -EAGAIN; /* try again, but later... */
622
	}
623
	mutex_unlock(&s->ops_mutex);
624

625
	ret = pccard_validate_cis(s, &no_chains);
626
	if (ret || !no_chains) {
627
		dev_dbg(&s->dev, "invalid CIS or invalid resources\n");
L
Linus Torvalds 已提交
628 629 630 631 632 633 634
		return -ENODEV;
	}

	if (!pccard_read_tuple(s, BIND_FN_ALL, CISTPL_LONGLINK_MFC, &mfc))
		no_funcs = mfc.nfn;
	else
		no_funcs = 1;
635
	s->functions = no_funcs;
L
Linus Torvalds 已提交
636

D
Dominik Brodowski 已提交
637
	for (i = 0; i < no_funcs; i++)
638
		pcmcia_device_add(s, i);
L
Linus Torvalds 已提交
639

D
Dominik Brodowski 已提交
640
	return ret;
L
Linus Torvalds 已提交
641 642 643
}


644
static int pcmcia_requery_callback(struct device *dev, void * _data)
645
{
646
	struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
647
	if (!p_dev->dev.driver) {
648
		dev_dbg(dev, "update device information\n");
649
		pcmcia_device_query(p_dev);
650
	}
651 652 653 654

	return 0;
}

655

656
static void pcmcia_requery(struct pcmcia_socket *s)
657
{
658
	int has_pfc;
659

660 661 662
	if (s->functions == 0) {
		pcmcia_card_add(s);
		return;
663 664 665 666 667
	}

	/* some device information might have changed because of a CIS
	 * update or because we can finally read it correctly... so
	 * determine it again, overwriting old values if necessary. */
668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683
	bus_for_each_dev(&pcmcia_bus_type, NULL, NULL, pcmcia_requery_callback);

	/* if the CIS changed, we need to check whether the number of
	 * functions changed. */
	if (s->fake_cis) {
		int old_funcs, new_funcs;
		cistpl_longlink_mfc_t mfc;

		/* does this cis override add or remove functions? */
		old_funcs = s->functions;

		if (!pccard_read_tuple(s, BIND_FN_ALL, CISTPL_LONGLINK_MFC,
					&mfc))
			new_funcs = mfc.nfn;
		else
			new_funcs = 1;
684 685
		if (old_funcs != new_funcs) {
			/* we need to re-start */
686
			pcmcia_card_remove(s, NULL);
687
			s->functions = 0;
688 689 690
			pcmcia_card_add(s);
		}
	}
691

692 693 694 695
	/* If the PCMCIA device consists of two pseudo devices,
	 * call pcmcia_device_add() -- which will fail if both
	 * devices are already registered. */
	mutex_lock(&s->ops_mutex);
696
	has_pfc = s->pcmcia_pfc;
697 698 699 700
	mutex_unlock(&s->ops_mutex);
	if (has_pfc)
		pcmcia_device_add(s, 0);

701 702
	/* we re-scan all devices, not just the ones connected to this
	 * socket. This does not matter, though. */
703 704
	if (bus_rescan_devices(&pcmcia_bus_type))
		dev_warn(&s->dev, "rescanning the bus failed\n");
705
}
706

707

708 709 710 711
#ifdef CONFIG_PCMCIA_LOAD_CIS

/**
 * pcmcia_load_firmware - load CIS from userspace if device-provided is broken
R
Randy Dunlap 已提交
712 713
 * @dev: the pcmcia device which needs a CIS override
 * @filename: requested filename in /lib/firmware/
714 715 716 717 718 719 720 721 722 723
 *
 * This uses the in-kernel firmware loading mechanism to use a "fake CIS" if
 * the one provided by the card is broken. The firmware files reside in
 * /lib/firmware/ in userspace.
 */
static int pcmcia_load_firmware(struct pcmcia_device *dev, char * filename)
{
	struct pcmcia_socket *s = dev->socket;
	const struct firmware *fw;
	int ret = -ENOMEM;
724 725
	cistpl_longlink_mfc_t mfc;
	int old_funcs, new_funcs = 1;
726 727 728 729

	if (!filename)
		return -EINVAL;

730
	dev_dbg(&dev->dev, "trying to load CIS file %s\n", filename);
731

732
	if (request_firmware(&fw, filename, &dev->dev) == 0) {
733 734
		if (fw->size >= CISTPL_MAX_CIS_SIZE) {
			ret = -EINVAL;
735 736
			dev_printk(KERN_ERR, &dev->dev,
				   "pcmcia: CIS override is too big\n");
737
			goto release;
738
		}
739

740
		if (!pcmcia_replace_cis(s, fw->data, fw->size))
741
			ret = 0;
742
		else {
743 744
			dev_printk(KERN_ERR, &dev->dev,
				   "pcmcia: CIS override failed\n");
745 746 747
			goto release;
		}

748 749 750 751 752 753 754 755
		/* we need to re-start if the number of functions changed */
		old_funcs = s->functions;
		if (!pccard_read_tuple(s, BIND_FN_ALL, CISTPL_LONGLINK_MFC,
					&mfc))
			new_funcs = mfc.nfn;

		if (old_funcs != new_funcs)
			ret = -EBUSY;
756 757 758 759

		/* update information */
		pcmcia_device_query(dev);

760 761
		/* requery (as number of functions might have changed) */
		pcmcia_parse_uevents(s, PCMCIA_UEVENT_REQUERY);
762 763 764 765
	}
 release:
	release_firmware(fw);

D
Dominik Brodowski 已提交
766
	return ret;
767 768 769 770 771 772 773 774 775 776 777 778
}

#else /* !CONFIG_PCMCIA_LOAD_CIS */

static inline int pcmcia_load_firmware(struct pcmcia_device *dev, char * filename)
{
	return -ENODEV;
}

#endif


779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825
static inline int pcmcia_devmatch(struct pcmcia_device *dev,
				  struct pcmcia_device_id *did)
{
	if (did->match_flags & PCMCIA_DEV_ID_MATCH_MANF_ID) {
		if ((!dev->has_manf_id) || (dev->manf_id != did->manf_id))
			return 0;
	}

	if (did->match_flags & PCMCIA_DEV_ID_MATCH_CARD_ID) {
		if ((!dev->has_card_id) || (dev->card_id != did->card_id))
			return 0;
	}

	if (did->match_flags & PCMCIA_DEV_ID_MATCH_FUNCTION) {
		if (dev->func != did->function)
			return 0;
	}

	if (did->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID1) {
		if (!dev->prod_id[0])
			return 0;
		if (strcmp(did->prod_id[0], dev->prod_id[0]))
			return 0;
	}

	if (did->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID2) {
		if (!dev->prod_id[1])
			return 0;
		if (strcmp(did->prod_id[1], dev->prod_id[1]))
			return 0;
	}

	if (did->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID3) {
		if (!dev->prod_id[2])
			return 0;
		if (strcmp(did->prod_id[2], dev->prod_id[2]))
			return 0;
	}

	if (did->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID4) {
		if (!dev->prod_id[3])
			return 0;
		if (strcmp(did->prod_id[3], dev->prod_id[3]))
			return 0;
	}

	if (did->match_flags & PCMCIA_DEV_ID_MATCH_DEVICE_NO) {
826
		dev_dbg(&dev->dev, "this is a pseudo-multi-function device\n");
827
		mutex_lock(&dev->socket->ops_mutex);
828
		dev->socket->pcmcia_pfc = 1;
829
		mutex_unlock(&dev->socket->ops_mutex);
830 831
		if (dev->device_no != did->device_no)
			return 0;
832 833 834
	}

	if (did->match_flags & PCMCIA_DEV_ID_MATCH_FUNC_ID) {
835 836
		int ret;

837 838 839 840 841
		if ((!dev->has_func_id) || (dev->func_id != did->func_id))
			return 0;

		/* if this is a pseudo-multi-function device,
		 * we need explicit matches */
842
		if (dev->socket->pcmcia_pfc)
843 844 845 846 847 848 849 850
			return 0;
		if (dev->device_no)
			return 0;

		/* also, FUNC_ID matching needs to be activated by userspace
		 * after it has re-checked that there is no possible module
		 * with a prod_id/manf_id/card_id match.
		 */
851 852 853 854 855 856 857
		mutex_lock(&dev->socket->ops_mutex);
		ret = dev->allow_func_id_match;
		mutex_unlock(&dev->socket->ops_mutex);

		if (!ret) {
			dev_dbg(&dev->dev,
				"skipping FUNC_ID match until userspace ACK\n");
858
			return 0;
859
		}
860 861
	}

862
	if (did->match_flags & PCMCIA_DEV_ID_MATCH_FAKE_CIS) {
863
		dev_dbg(&dev->dev, "device needs a fake CIS\n");
864
		if (!dev->socket->fake_cis)
865 866
			if (pcmcia_load_firmware(dev, did->cisfile))
				return 0;
867 868
	}

869 870
	if (did->match_flags & PCMCIA_DEV_ID_MATCH_ANONYMOUS) {
		int i;
D
Dominik Brodowski 已提交
871
		for (i = 0; i < 4; i++)
872 873 874 875 876 877
			if (dev->prod_id[i])
				return 0;
		if (dev->has_manf_id || dev->has_card_id || dev->has_func_id)
			return 0;
	}

878 879 880 881
	return 1;
}


D
Dominik Brodowski 已提交
882 883 884 885
static int pcmcia_bus_match(struct device *dev, struct device_driver *drv)
{
	struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
	struct pcmcia_driver *p_drv = to_pcmcia_drv(drv);
886
	struct pcmcia_device_id *did = p_drv->id_table;
B
Bernhard Walle 已提交
887 888 889
	struct pcmcia_dynid *dynid;

	/* match dynamic devices first */
890
	mutex_lock(&p_drv->dynids.lock);
B
Bernhard Walle 已提交
891
	list_for_each_entry(dynid, &p_drv->dynids.list, node) {
892
		dev_dbg(dev, "trying to match to %s\n", drv->name);
B
Bernhard Walle 已提交
893
		if (pcmcia_devmatch(p_dev, &dynid->id)) {
894
			dev_dbg(dev, "matched to %s\n", drv->name);
895
			mutex_unlock(&p_drv->dynids.lock);
B
Bernhard Walle 已提交
896 897 898
			return 1;
		}
	}
899
	mutex_unlock(&p_drv->dynids.lock);
L
Linus Torvalds 已提交
900

901
	while (did && did->match_flags) {
902
		dev_dbg(dev, "trying to match to %s\n", drv->name);
903
		if (pcmcia_devmatch(p_dev, did)) {
904
			dev_dbg(dev, "matched to %s\n", drv->name);
905
			return 1;
906
		}
907 908 909
		did++;
	}

L
Linus Torvalds 已提交
910 911 912
	return 0;
}

913 914
#ifdef CONFIG_HOTPLUG

915
static int pcmcia_bus_uevent(struct device *dev, struct kobj_uevent_env *env)
916 917
{
	struct pcmcia_device *p_dev;
918
	int i;
919 920 921 922 923 924 925 926
	u32 hash[4] = { 0, 0, 0, 0};

	if (!dev)
		return -ENODEV;

	p_dev = to_pcmcia_dev(dev);

	/* calculate hashes */
D
Dominik Brodowski 已提交
927
	for (i = 0; i < 4; i++) {
928 929 930 931 932
		if (!p_dev->prod_id[i])
			continue;
		hash[i] = crc32(0, p_dev->prod_id[i], strlen(p_dev->prod_id[i]));
	}

933
	if (add_uevent_var(env, "SOCKET_NO=%u", p_dev->socket->sock))
934 935
		return -ENOMEM;

936
	if (add_uevent_var(env, "DEVICE_NO=%02X", p_dev->device_no))
937 938
		return -ENOMEM;

939
	if (add_uevent_var(env, "MODALIAS=pcmcia:m%04Xc%04Xf%02Xfn%02Xpfn%02X"
940 941 942 943 944 945 946 947 948 949
			   "pa%08Xpb%08Xpc%08Xpd%08X",
			   p_dev->has_manf_id ? p_dev->manf_id : 0,
			   p_dev->has_card_id ? p_dev->card_id : 0,
			   p_dev->has_func_id ? p_dev->func_id : 0,
			   p_dev->func,
			   p_dev->device_no,
			   hash[0],
			   hash[1],
			   hash[2],
			   hash[3]))
950 951 952 953 954 955 956
		return -ENOMEM;

	return 0;
}

#else

957
static int pcmcia_bus_uevent(struct device *dev, struct kobj_uevent_env *env)
958 959 960 961 962 963
{
	return -ENODEV;
}

#endif

964 965 966 967 968 969 970 971 972
/************************ runtime PM support ***************************/

static int pcmcia_dev_suspend(struct device *dev, pm_message_t state);
static int pcmcia_dev_resume(struct device *dev);

static int runtime_suspend(struct device *dev)
{
	int rc;

973
	device_lock(dev);
974
	rc = pcmcia_dev_suspend(dev, PMSG_SUSPEND);
975
	device_unlock(dev);
976 977 978
	return rc;
}

979
static int runtime_resume(struct device *dev)
980 981 982
{
	int rc;

983
	device_lock(dev);
984
	rc = pcmcia_dev_resume(dev);
985
	device_unlock(dev);
986
	return rc;
987 988
}

L
Linus Torvalds 已提交
989 990 991
/************************ per-device sysfs output ***************************/

#define pcmcia_device_attr(field, test, format)				\
992
static ssize_t field##_show (struct device *dev, struct device_attribute *attr, char *buf)		\
L
Linus Torvalds 已提交
993 994
{									\
	struct pcmcia_device *p_dev = to_pcmcia_dev(dev);		\
D
Dominik Brodowski 已提交
995
	return p_dev->test ? sprintf(buf, format, p_dev->field) : -ENODEV; \
L
Linus Torvalds 已提交
996 997 998
}

#define pcmcia_device_stringattr(name, field)					\
999
static ssize_t name##_show (struct device *dev, struct device_attribute *attr, char *buf)		\
L
Linus Torvalds 已提交
1000 1001
{									\
	struct pcmcia_device *p_dev = to_pcmcia_dev(dev);		\
D
Dominik Brodowski 已提交
1002
	return p_dev->field ? sprintf(buf, "%s\n", p_dev->field) : -ENODEV; \
L
Linus Torvalds 已提交
1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013
}

pcmcia_device_attr(func, socket, "0x%02x\n");
pcmcia_device_attr(func_id, has_func_id, "0x%02x\n");
pcmcia_device_attr(manf_id, has_manf_id, "0x%04x\n");
pcmcia_device_attr(card_id, has_card_id, "0x%04x\n");
pcmcia_device_stringattr(prod_id1, prod_id[0]);
pcmcia_device_stringattr(prod_id2, prod_id[1]);
pcmcia_device_stringattr(prod_id3, prod_id[2]);
pcmcia_device_stringattr(prod_id4, prod_id[3]);

1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025
static ssize_t pcmcia_show_resources(struct device *dev,
				     struct device_attribute *attr, char *buf)
{
	struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
	char *str = buf;
	int i;

	for (i = 0; i < PCMCIA_NUM_RESOURCES; i++)
		str += sprintf(str, "%pr\n", p_dev->resource[i]);

	return str - buf;
}
1026 1027 1028 1029 1030

static ssize_t pcmcia_show_pm_state(struct device *dev, struct device_attribute *attr, char *buf)
{
	struct pcmcia_device *p_dev = to_pcmcia_dev(dev);

1031
	if (p_dev->suspended)
1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042
		return sprintf(buf, "off\n");
	else
		return sprintf(buf, "on\n");
}

static ssize_t pcmcia_store_pm_state(struct device *dev, struct device_attribute *attr,
				     const char *buf, size_t count)
{
	struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
	int ret = 0;

D
Dominik Brodowski 已提交
1043 1044
	if (!count)
		return -EINVAL;
1045

1046
	if ((!p_dev->suspended) && !strncmp(buf, "off", 3))
1047
		ret = runtime_suspend(dev);
1048
	else if (p_dev->suspended && !strncmp(buf, "on", 2))
1049
		ret = runtime_resume(dev);
1050 1051 1052 1053 1054

	return ret ? ret : count;
}


1055
static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, char *buf)
1056 1057 1058 1059 1060 1061
{
	struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
	int i;
	u32 hash[4] = { 0, 0, 0, 0};

	/* calculate hashes */
D
Dominik Brodowski 已提交
1062
	for (i = 0; i < 4; i++) {
1063 1064
		if (!p_dev->prod_id[i])
			continue;
D
Dominik Brodowski 已提交
1065 1066
		hash[i] = crc32(0, p_dev->prod_id[i],
				strlen(p_dev->prod_id[i]));
1067 1068 1069 1070 1071 1072 1073 1074 1075
	}
	return sprintf(buf, "pcmcia:m%04Xc%04Xf%02Xfn%02Xpfn%02X"
				"pa%08Xpb%08Xpc%08Xpd%08X\n",
				p_dev->has_manf_id ? p_dev->manf_id : 0,
				p_dev->has_card_id ? p_dev->card_id : 0,
				p_dev->has_func_id ? p_dev->func_id : 0,
				p_dev->func, p_dev->device_no,
				hash[0], hash[1], hash[2], hash[3]);
}
1076

1077 1078
static ssize_t pcmcia_store_allow_func_id_match(struct device *dev,
		struct device_attribute *attr, const char *buf, size_t count)
1079 1080
{
	struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
1081 1082 1083

	if (!count)
		return -EINVAL;
1084

1085
	mutex_lock(&p_dev->socket->ops_mutex);
1086
	p_dev->allow_func_id_match = 1;
1087
	mutex_unlock(&p_dev->socket->ops_mutex);
1088
	pcmcia_parse_uevents(p_dev->socket, PCMCIA_UEVENT_REQUERY);
1089 1090 1091 1092

	return count;
}

L
Linus Torvalds 已提交
1093 1094
static struct device_attribute pcmcia_dev_attrs[] = {
	__ATTR(function, 0444, func_show, NULL),
1095
	__ATTR(pm_state, 0644, pcmcia_show_pm_state, pcmcia_store_pm_state),
1096
	__ATTR(resources, 0444, pcmcia_show_resources, NULL),
L
Linus Torvalds 已提交
1097 1098 1099 1100 1101 1102 1103
	__ATTR_RO(func_id),
	__ATTR_RO(manf_id),
	__ATTR_RO(card_id),
	__ATTR_RO(prod_id1),
	__ATTR_RO(prod_id2),
	__ATTR_RO(prod_id3),
	__ATTR_RO(prod_id4),
1104
	__ATTR_RO(modalias),
1105
	__ATTR(allow_func_id_match, 0200, NULL, pcmcia_store_allow_func_id_match),
L
Linus Torvalds 已提交
1106 1107 1108
	__ATTR_NULL,
};

1109 1110
/* PM support, also needed for reset */

D
Dominik Brodowski 已提交
1111
static int pcmcia_dev_suspend(struct device *dev, pm_message_t state)
1112 1113 1114
{
	struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
	struct pcmcia_driver *p_drv = NULL;
1115
	int ret = 0;
1116

1117 1118 1119
	mutex_lock(&p_dev->socket->ops_mutex);
	if (p_dev->suspended) {
		mutex_unlock(&p_dev->socket->ops_mutex);
1120
		return 0;
1121 1122 1123
	}
	p_dev->suspended = 1;
	mutex_unlock(&p_dev->socket->ops_mutex);
1124

1125
	dev_dbg(dev, "suspending\n");
1126

1127 1128 1129
	if (dev->driver)
		p_drv = to_pcmcia_drv(dev->driver);

1130 1131 1132 1133
	if (!p_drv)
		goto out;

	if (p_drv->suspend) {
1134
		ret = p_drv->suspend(p_dev);
1135
		if (ret) {
1136 1137 1138 1139
			dev_printk(KERN_ERR, dev,
				   "pcmcia: device %s (driver %s) did "
				   "not want to go to sleep (%d)\n",
				   p_dev->devname, p_drv->drv.name, ret);
1140 1141 1142
			mutex_lock(&p_dev->socket->ops_mutex);
			p_dev->suspended = 0;
			mutex_unlock(&p_dev->socket->ops_mutex);
1143
			goto out;
1144
		}
1145
	}
1146

1147
	if (p_dev->device_no == p_dev->func) {
1148
		dev_dbg(dev, "releasing configuration\n");
1149
		pcmcia_release_configuration(p_dev);
1150
	}
1151

1152 1153
 out:
	return ret;
1154 1155 1156
}


D
Dominik Brodowski 已提交
1157
static int pcmcia_dev_resume(struct device *dev)
1158 1159
{
	struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
D
Dominik Brodowski 已提交
1160
	struct pcmcia_driver *p_drv = NULL;
1161
	int ret = 0;
1162

1163 1164 1165
	mutex_lock(&p_dev->socket->ops_mutex);
	if (!p_dev->suspended) {
		mutex_unlock(&p_dev->socket->ops_mutex);
1166
		return 0;
1167 1168 1169
	}
	p_dev->suspended = 0;
	mutex_unlock(&p_dev->socket->ops_mutex);
1170

1171
	dev_dbg(dev, "resuming\n");
1172

1173 1174 1175
	if (dev->driver)
		p_drv = to_pcmcia_drv(dev->driver);

1176 1177 1178 1179
	if (!p_drv)
		goto out;

	if (p_dev->device_no == p_dev->func) {
1180
		dev_dbg(dev, "requesting configuration\n");
1181 1182 1183
		ret = pcmcia_request_configuration(p_dev, &p_dev->conf);
		if (ret)
			goto out;
1184
	}
1185

1186 1187 1188
	if (p_drv->resume)
		ret = p_drv->resume(p_dev);

1189 1190
 out:
	return ret;
1191 1192 1193 1194 1195 1196 1197 1198
}


static int pcmcia_bus_suspend_callback(struct device *dev, void * _data)
{
	struct pcmcia_socket *skt = _data;
	struct pcmcia_device *p_dev = to_pcmcia_dev(dev);

1199
	if (p_dev->socket != skt || p_dev->suspended)
1200 1201
		return 0;

1202
	return runtime_suspend(dev);
1203 1204 1205 1206 1207 1208 1209
}

static int pcmcia_bus_resume_callback(struct device *dev, void * _data)
{
	struct pcmcia_socket *skt = _data;
	struct pcmcia_device *p_dev = to_pcmcia_dev(dev);

1210
	if (p_dev->socket != skt || !p_dev->suspended)
1211 1212
		return 0;

1213
	runtime_resume(dev);
1214 1215 1216 1217 1218 1219

	return 0;
}

static int pcmcia_bus_resume(struct pcmcia_socket *skt)
{
1220
	dev_dbg(&skt->dev, "resuming socket %d\n", skt->sock);
1221 1222 1223 1224 1225 1226
	bus_for_each_dev(&pcmcia_bus_type, NULL, skt, pcmcia_bus_resume_callback);
	return 0;
}

static int pcmcia_bus_suspend(struct pcmcia_socket *skt)
{
1227
	dev_dbg(&skt->dev, "suspending socket %d\n", skt->sock);
1228 1229 1230 1231 1232 1233 1234 1235
	if (bus_for_each_dev(&pcmcia_bus_type, NULL, skt,
			     pcmcia_bus_suspend_callback)) {
		pcmcia_bus_resume(skt);
		return -EIO;
	}
	return 0;
}

1236 1237 1238 1239
static int pcmcia_bus_remove(struct pcmcia_socket *skt)
{
	atomic_set(&skt->present, 0);
	pcmcia_card_remove(skt, NULL);
L
Linus Torvalds 已提交
1240

1241 1242 1243 1244
	mutex_lock(&skt->ops_mutex);
	destroy_cis_cache(skt);
	pcmcia_cleanup_irq(skt);
	mutex_unlock(&skt->ops_mutex);
L
Linus Torvalds 已提交
1245

1246 1247
	return 0;
}
D
Dominik Brodowski 已提交
1248

1249 1250 1251
static int pcmcia_bus_add(struct pcmcia_socket *skt)
{
	atomic_set(&skt->present, 1);
L
Linus Torvalds 已提交
1252

1253
	mutex_lock(&skt->ops_mutex);
1254
	skt->pcmcia_pfc = 0;
1255 1256
	destroy_cis_cache(skt); /* to be on the safe side... */
	mutex_unlock(&skt->ops_mutex);
L
Linus Torvalds 已提交
1257

1258
	pcmcia_card_add(skt);
L
Linus Torvalds 已提交
1259

1260 1261
	return 0;
}
1262

1263 1264 1265 1266 1267 1268
static int pcmcia_bus_early_resume(struct pcmcia_socket *skt)
{
	if (!verify_cis_cache(skt)) {
		pcmcia_put_socket(skt);
		return 0;
	}
L
Linus Torvalds 已提交
1269

1270
	dev_dbg(&skt->dev, "cis mismatch - different card\n");
1271

1272 1273
	/* first, remove the card */
	pcmcia_bus_remove(skt);
1274

1275 1276 1277 1278 1279 1280
	mutex_lock(&skt->ops_mutex);
	destroy_cis_cache(skt);
	kfree(skt->fake_cis);
	skt->fake_cis = NULL;
	skt->functions = 0;
	mutex_unlock(&skt->ops_mutex);
L
Linus Torvalds 已提交
1281

1282 1283 1284 1285
	/* now, add the new card */
	pcmcia_bus_add(skt);
	return 0;
}
1286

L
Linus Torvalds 已提交
1287

1288 1289 1290 1291 1292 1293 1294
/*
 * NOTE: This is racy. There's no guarantee the card will still be
 * physically present, even if the call to this function returns
 * non-NULL. Furthermore, the device driver most likely is unbound
 * almost immediately, so the timeframe where pcmcia_dev_present
 * returns NULL is probably really really small.
 */
D
Dominik Brodowski 已提交
1295
struct pcmcia_device *pcmcia_dev_present(struct pcmcia_device *_p_dev)
1296 1297 1298 1299 1300 1301 1302 1303
{
	struct pcmcia_device *p_dev;
	struct pcmcia_device *ret = NULL;

	p_dev = pcmcia_get_dev(_p_dev);
	if (!p_dev)
		return NULL;

1304 1305
	if (atomic_read(&p_dev->socket->present) != 0)
		ret = p_dev;
1306 1307 1308 1309 1310 1311 1312

	pcmcia_put_dev(p_dev);
	return ret;
}
EXPORT_SYMBOL(pcmcia_dev_present);


1313 1314
static struct pcmcia_callback pcmcia_bus_callback = {
	.owner = THIS_MODULE,
1315 1316
	.add = pcmcia_bus_add,
	.remove = pcmcia_bus_remove,
1317
	.requery = pcmcia_requery,
1318
	.validate = pccard_validate_cis,
1319
	.suspend = pcmcia_bus_suspend,
1320
	.early_resume = pcmcia_bus_early_resume,
1321
	.resume = pcmcia_bus_resume,
1322 1323
};

1324
static int __devinit pcmcia_bus_add_socket(struct device *dev,
1325
					   struct class_interface *class_intf)
L
Linus Torvalds 已提交
1326
{
1327
	struct pcmcia_socket *socket = dev_get_drvdata(dev);
L
Linus Torvalds 已提交
1328 1329
	int ret;

1330 1331
	socket = pcmcia_get_socket(socket);
	if (!socket) {
1332 1333
		dev_printk(KERN_ERR, dev,
			   "PCMCIA obtaining reference to socket failed\n");
L
Linus Torvalds 已提交
1334 1335 1336
		return -ENODEV;
	}

1337 1338 1339 1340 1341 1342 1343
	ret = sysfs_create_bin_file(&dev->kobj, &pccard_cis_attr);
	if (ret) {
		dev_printk(KERN_ERR, dev, "PCMCIA registration failed\n");
		pcmcia_put_socket(socket);
		return ret;
	}

1344
	INIT_LIST_HEAD(&socket->devices_list);
1345
	socket->pcmcia_pfc = 0;
1346
	socket->device_count = 0;
1347
	atomic_set(&socket->present, 0);
L
Linus Torvalds 已提交
1348

1349
	ret = pccard_register_pcmcia(socket, &pcmcia_bus_callback);
L
Linus Torvalds 已提交
1350
	if (ret) {
1351
		dev_printk(KERN_ERR, dev, "PCMCIA registration failed\n");
1352
		pcmcia_put_socket(socket);
D
Dominik Brodowski 已提交
1353
		return ret;
L
Linus Torvalds 已提交
1354 1355 1356 1357 1358
	}

	return 0;
}

1359
static void pcmcia_bus_remove_socket(struct device *dev,
1360
				     struct class_interface *class_intf)
L
Linus Torvalds 已提交
1361
{
1362
	struct pcmcia_socket *socket = dev_get_drvdata(dev);
L
Linus Torvalds 已提交
1363

1364
	if (!socket)
L
Linus Torvalds 已提交
1365 1366 1367 1368
		return;

	pccard_register_pcmcia(socket, NULL);

1369
	/* unregister any unbound devices */
1370
	mutex_lock(&socket->skt_mutex);
1371
	pcmcia_card_remove(socket, NULL);
1372
	release_cis_mem(socket);
1373
	mutex_unlock(&socket->skt_mutex);
1374

1375 1376
	sysfs_remove_bin_file(&dev->kobj, &pccard_cis_attr);

1377
	pcmcia_put_socket(socket);
L
Linus Torvalds 已提交
1378 1379 1380 1381 1382 1383

	return;
}


/* the pcmcia_bus_interface is used to handle pcmcia socket devices */
1384
static struct class_interface pcmcia_bus_interface __refdata = {
L
Linus Torvalds 已提交
1385
	.class = &pcmcia_socket_class,
1386 1387
	.add_dev = &pcmcia_bus_add_socket,
	.remove_dev = &pcmcia_bus_remove_socket,
L
Linus Torvalds 已提交
1388 1389 1390
};


1391
struct bus_type pcmcia_bus_type = {
L
Linus Torvalds 已提交
1392
	.name = "pcmcia",
1393
	.uevent = pcmcia_bus_uevent,
L
Linus Torvalds 已提交
1394 1395
	.match = pcmcia_bus_match,
	.dev_attrs = pcmcia_dev_attrs,
1396 1397
	.probe = pcmcia_device_probe,
	.remove = pcmcia_device_remove,
1398 1399
	.suspend = pcmcia_dev_suspend,
	.resume = pcmcia_dev_resume,
L
Linus Torvalds 已提交
1400 1401 1402 1403 1404
};


static int __init init_pcmcia_bus(void)
{
1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418
	int ret;

	ret = bus_register(&pcmcia_bus_type);
	if (ret < 0) {
		printk(KERN_WARNING "pcmcia: bus_register error: %d\n", ret);
		return ret;
	}
	ret = class_interface_register(&pcmcia_bus_interface);
	if (ret < 0) {
		printk(KERN_WARNING
			"pcmcia: class_interface_register error: %d\n", ret);
		bus_unregister(&pcmcia_bus_type);
		return ret;
	}
L
Linus Torvalds 已提交
1419 1420 1421

	return 0;
}
D
Dominik Brodowski 已提交
1422
fs_initcall(init_pcmcia_bus); /* one level after subsys_initcall so that
L
Linus Torvalds 已提交
1423 1424 1425 1426 1427
			       * pcmcia_socket_class is already registered */


static void __exit exit_pcmcia_bus(void)
{
1428
	class_interface_unregister(&pcmcia_bus_interface);
L
Linus Torvalds 已提交
1429 1430 1431 1432 1433 1434 1435

	bus_unregister(&pcmcia_bus_type);
}
module_exit(exit_pcmcia_bus);


MODULE_ALIAS("ds");